/x11-fonts/XFree86-4-fontDefaultBitmaps/

ex : gsoc2013-evolution
Google Summer of Code 2013 - GNOME - Archive Integration workspace
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobody <nobody@localhost>2005-02-04 12:50:50 +0800
committernobody <nobody@localhost>2005-02-04 12:50:50 +0800
commit149acf37ca7ad28ee42e9d00afb6df4e23c98113 (patch)
tree38981335bcf538742a3be591b0ab85cf16bd6bd0
parentab13d05f6e1b47523f2fed817c1963f289cee2d0 (diff)
downloadgsoc2013-evolution-149acf37ca7ad28ee42e9d00afb6df4e23c98113.tar.gz
gsoc2013-evolution-149acf37ca7ad28ee42e9d00afb6df4e23c98113.tar.zst
gsoc2013-evolution-149acf37ca7ad28ee42e9d00afb6df4e23c98113.zip
This commit was manufactured by cvs2svn to create tag 'GAL_2_3_4'.GAL_2_3_4
svn path=/tags/GAL_2_3_4/; revision=28703
Diffstat
-rw-r--r--.cvsignore30
-rw-r--r--AUTHORS85
-rw-r--r--COPYING340
-rw-r--r--COPYING-DOCS355
-rw-r--r--ChangeLog1159
-rw-r--r--ChangeLog.pre-1-48530
-rw-r--r--HACKING277
-rw-r--r--INSTALL229
-rw-r--r--MAINTAINERS23
-rw-r--r--Makefile.am71
-rw-r--r--NEWS1469
-rw-r--r--NEWS-1.02939
-rw-r--r--README170
-rw-r--r--README.translators9
-rw-r--r--a11y/.cvsignore2
-rw-r--r--a11y/ChangeLog328
-rw-r--r--a11y/Makefile.am16
-rw-r--r--a11y/addressbook/.cvsignore2
-rw-r--r--a11y/addressbook/Makefile.am34
-rw-r--r--a11y/addressbook/ea-addressbook-view.c122
-rw-r--r--a11y/addressbook/ea-addressbook-view.h61
-rw-r--r--a11y/addressbook/ea-addressbook.c87
-rw-r--r--a11y/addressbook/ea-addressbook.h36
-rw-r--r--a11y/addressbook/ea-minicard-view.c406
-rw-r--r--a11y/addressbook/ea-minicard-view.h62
-rw-r--r--a11y/addressbook/ea-minicard.c269
-rw-r--r--a11y/addressbook/ea-minicard.h62
-rw-r--r--a11y/calendar/.cvsignore6
-rw-r--r--a11y/calendar/Makefile.am55
-rw-r--r--a11y/calendar/ea-cal-view-event.c528
-rw-r--r--a11y/calendar/ea-cal-view-event.h64
-rw-r--r--a11y/calendar/ea-cal-view.c441
-rw-r--r--a11y/calendar/ea-cal-view.h64
-rw-r--r--a11y/calendar/ea-calendar-helpers.c159
-rw-r--r--a11y/calendar/ea-calendar-helpers.h43
-rw-r--r--a11y/calendar/ea-calendar.c195
-rw-r--r--a11y/calendar/ea-calendar.h39
-rw-r--r--a11y/calendar/ea-day-view-cell.c396
-rw-r--r--a11y/calendar/ea-day-view-cell.h91
-rw-r--r--a11y/calendar/ea-day-view-main-item.c1292
-rw-r--r--a11y/calendar/ea-day-view-main-item.h64
-rw-r--r--a11y/calendar/ea-day-view.c267
-rw-r--r--a11y/calendar/ea-day-view.h64
-rw-r--r--a11y/calendar/ea-gnome-calendar.c353
-rw-r--r--a11y/calendar/ea-gnome-calendar.h67
-rw-r--r--a11y/calendar/ea-jump-button.c226
-rw-r--r--a11y/calendar/ea-jump-button.h64
-rw-r--r--a11y/calendar/ea-week-view-cell.c478
-rw-r--r--a11y/calendar/ea-week-view-cell.h92
-rw-r--r--a11y/calendar/ea-week-view-main-item.c1275
-rw-r--r--a11y/calendar/ea-week-view-main-item.h65
-rw-r--r--a11y/calendar/ea-week-view.c322
-rw-r--r--a11y/calendar/ea-week-view.h65
-rw-r--r--a11y/ea-cell-table.c207
-rw-r--r--a11y/ea-cell-table.h63
-rw-r--r--a11y/ea-factory.h113
-rw-r--r--a11y/widgets/.cvsignore2
-rw-r--r--a11y/widgets/Makefile.am33
-rw-r--r--a11y/widgets/ea-calendar-cell.c325
-rw-r--r--a11y/widgets/ea-calendar-cell.h92
-rw-r--r--a11y/widgets/ea-calendar-item.c1300
-rw-r--r--a11y/widgets/ea-calendar-item.h75
-rw-r--r--a11y/widgets/ea-combo-button.c170
-rw-r--r--a11y/widgets/ea-combo-button.h35
-rw-r--r--a11y/widgets/ea-widgets.c42
-rw-r--r--a11y/widgets/ea-widgets.h35
-rw-r--r--acinclude.m4182
-rw-r--r--addressbook/.cvsignore6
-rw-r--r--addressbook/ChangeLog7373
-rw-r--r--addressbook/ChangeLog.pre-1-416758
-rw-r--r--addressbook/Makefile.am23
-rw-r--r--addressbook/addressbook-errors.xml93
-rw-r--r--addressbook/addressbook-errors.xml.h62
-rw-r--r--addressbook/conduit/.cvsignore9
-rw-r--r--addressbook/conduit/Makefile.am41
-rw-r--r--addressbook/conduit/address-conduit.c1766
-rw-r--r--addressbook/conduit/e-address.conduit.in9
-rw-r--r--addressbook/gui/.cvsignore6
-rw-r--r--addressbook/gui/Makefile.am1
-rw-r--r--addressbook/gui/component/.cvsignore15
-rw-r--r--addressbook/gui/component/GNOME_Evolution_Addressbook.server.in.in135
-rw-r--r--addressbook/gui/component/Makefile.am111
-rw-r--r--addressbook/gui/component/addressbook-component.c393
-rw-r--r--addressbook/gui/component/addressbook-component.h63
-rw-r--r--addressbook/gui/component/addressbook-config.c1129
-rw-r--r--addressbook/gui/component/addressbook-config.h52
-rw-r--r--addressbook/gui/component/addressbook-migrate.c1201
-rw-r--r--addressbook/gui/component/addressbook-migrate.h31
-rw-r--r--addressbook/gui/component/addressbook-view.c1399
-rw-r--r--addressbook/gui/component/addressbook-view.h60
-rw-r--r--addressbook/gui/component/addressbook.c318
-rw-r--r--addressbook/gui/component/addressbook.h14
-rw-r--r--addressbook/gui/component/apps_evolution_addressbook.schemas.in.in70
-rw-r--r--addressbook/gui/component/autocompletion-config.c154
-rw-r--r--addressbook/gui/component/autocompletion-config.h30
-rw-r--r--addressbook/gui/component/component-factory.c77
-rw-r--r--addressbook/gui/component/ldap-config.glade2676
-rw-r--r--addressbook/gui/component/select-names/.cvsignore15
-rw-r--r--addressbook/gui/contact-editor/.cvsignore11
-rw-r--r--addressbook/gui/contact-editor/Makefile.am50
-rw-r--r--addressbook/gui/contact-editor/contact-editor.glade3769
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-address.c627
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-address.h71
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-fullname.c303
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-fullname.h71
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-im.c481
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-im.h76
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-marshal.list2
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor.c3553
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor.h116
-rw-r--r--addressbook/gui/contact-editor/e-contact-quick-add.c457
-rw-r--r--addressbook/gui/contact-editor/e-contact-quick-add.h40
-rw-r--r--addressbook/gui/contact-editor/eab-editor.c390
-rw-r--r--addressbook/gui/contact-editor/eab-editor.h110
-rw-r--r--addressbook/gui/contact-editor/fulladdr.glade446
-rw-r--r--addressbook/gui/contact-editor/fullname.glade681
-rw-r--r--addressbook/gui/contact-editor/im.glade206
-rw-r--r--addressbook/gui/contact-editor/test-editor.c142
-rw-r--r--addressbook/gui/contact-list-editor/.cvsignore7
-rw-r--r--addressbook/gui/contact-list-editor/Makefile.am39
-rw-r--r--addressbook/gui/contact-list-editor/contact-list-editor.glade436
-rw-r--r--addressbook/gui/contact-list-editor/e-contact-list-editor-marshal.list4
-rw-r--r--addressbook/gui/contact-list-editor/e-contact-list-editor.c1133
-rw-r--r--addressbook/gui/contact-list-editor/e-contact-list-editor.etspec7
-rw-r--r--addressbook/gui/contact-list-editor/e-contact-list-editor.h113
-rw-r--r--addressbook/gui/contact-list-editor/e-contact-list-model.c284
-rw-r--r--addressbook/gui/contact-list-editor/e-contact-list-model.h49
-rw-r--r--addressbook/gui/merging/.cvsignore8
-rw-r--r--addressbook/gui/merging/Makefile.am24
-rw-r--r--addressbook/gui/merging/eab-contact-commit-duplicate-detected.glade212
-rw-r--r--addressbook/gui/merging/eab-contact-compare.c798
-rw-r--r--addressbook/gui/merging/eab-contact-compare.h74
-rw-r--r--addressbook/gui/merging/eab-contact-duplicate-detected.glade222
-rw-r--r--addressbook/gui/merging/eab-contact-merging.c246
-rw-r--r--addressbook/gui/merging/eab-contact-merging.h30
-rw-r--r--addressbook/gui/search/.cvsignore7
-rw-r--r--addressbook/gui/search/Makefile.am23
-rw-r--r--addressbook/gui/search/addresstypes.xml83
-rw-r--r--addressbook/gui/search/e-addressbook-search-dialog.c190
-rw-r--r--addressbook/gui/search/e-addressbook-search-dialog.h62
-rw-r--r--addressbook/gui/widgets/.cvsignore19
-rw-r--r--addressbook/gui/widgets/Makefile.am98
-rw-r--r--addressbook/gui/widgets/e-addressbook-model.c721
-rw-r--r--addressbook/gui/widgets/e-addressbook-model.h82
-rw-r--r--addressbook/gui/widgets/e-addressbook-reflow-adapter.c523
-rw-r--r--addressbook/gui/widgets/e-addressbook-reflow-adapter.h44
-rw-r--r--addressbook/gui/widgets/e-addressbook-table-adapter.c354
-rw-r--r--addressbook/gui/widgets/e-addressbook-table-adapter.h36
-rw-r--r--addressbook/gui/widgets/e-addressbook-treeview-adapter.c621
-rw-r--r--addressbook/gui/widgets/e-addressbook-treeview-adapter.h44
-rw-r--r--addressbook/gui/widgets/e-addressbook-view.c2206
-rw-r--r--addressbook/gui/widgets/e-addressbook-view.etspec65
-rw-r--r--addressbook/gui/widgets/e-addressbook-view.h164
-rw-r--r--addressbook/gui/widgets/e-minicard-label.c508
-rw-r--r--addressbook/gui/widgets/e-minicard-label.h86
-rw-r--r--addressbook/gui/widgets/e-minicard-view-widget.c440
-rw-r--r--addressbook/gui/widgets/e-minicard-view-widget.h73
-rw-r--r--addressbook/gui/widgets/e-minicard-view.c630
-rw-r--r--addressbook/gui/widgets/e-minicard-view.h93
-rw-r--r--addressbook/gui/widgets/e-minicard.c1015
-rw-r--r--addressbook/gui/widgets/e-minicard.h132
-rw-r--r--addressbook/gui/widgets/eab-config.c189
-rw-r--r--addressbook/gui/widgets/eab-config.h83
-rw-r--r--addressbook/gui/widgets/eab-contact-display.c693
-rw-r--r--addressbook/gui/widgets/eab-contact-display.h60
-rw-r--r--addressbook/gui/widgets/eab-gui-util.c1097
-rw-r--r--addressbook/gui/widgets/eab-gui-util.h82
-rw-r--r--addressbook/gui/widgets/eab-marshal.list11
-rw-r--r--addressbook/gui/widgets/eab-menu.c258
-rw-r--r--addressbook/gui/widgets/eab-menu.h109
-rw-r--r--addressbook/gui/widgets/eab-popup-control.c1174
-rw-r--r--addressbook/gui/widgets/eab-popup-control.h86
-rw-r--r--addressbook/gui/widgets/eab-popup.c321
-rw-r--r--addressbook/gui/widgets/eab-popup.h184
-rw-r--r--addressbook/gui/widgets/eab-vcard-control.c311
-rw-r--r--addressbook/gui/widgets/eab-vcard-control.h8
-rw-r--r--addressbook/gui/widgets/gal-view-factory-minicard.c85
-rw-r--r--addressbook/gui/widgets/gal-view-factory-minicard.h35
-rw-r--r--addressbook/gui/widgets/gal-view-factory-treeview.c84
-rw-r--r--addressbook/gui/widgets/gal-view-factory-treeview.h35
-rw-r--r--addressbook/gui/widgets/gal-view-minicard.c227
-rw-r--r--addressbook/gui/widgets/gal-view-minicard.h45
-rw-r--r--addressbook/gui/widgets/gal-view-treeview.c234
-rw-r--r--addressbook/gui/widgets/gal-view-treeview.h43
-rw-r--r--addressbook/gui/widgets/test-reflow.c179
-rw-r--r--addressbook/importers/.cvsignore8
-rw-r--r--addressbook/importers/GNOME_Evolution_Addressbook_LDIF_Importer.server.in.in29
-rw-r--r--addressbook/importers/GNOME_Evolution_Addressbook_VCard_Importer.server.in.in29
-rw-r--r--addressbook/importers/Makefile.am53
-rw-r--r--addressbook/importers/evolution-ldif-importer.c655
-rw-r--r--addressbook/importers/evolution-vcard-importer.c443
-rw-r--r--addressbook/printing/.cvsignore9
-rw-r--r--addressbook/printing/Makefile.am57
-rw-r--r--addressbook/printing/e-contact-print-envelope.c243
-rw-r--r--addressbook/printing/e-contact-print-envelope.h32
-rw-r--r--addressbook/printing/e-contact-print-style-editor.c155
-rw-r--r--addressbook/printing/e-contact-print-style-editor.h73
-rw-r--r--addressbook/printing/e-contact-print-types.h73
-rw-r--r--addressbook/printing/e-contact-print.c1103
-rw-r--r--addressbook/printing/e-contact-print.glade2018
-rw-r--r--addressbook/printing/e-contact-print.h36
-rw-r--r--addressbook/printing/medbook.ecps30
-rw-r--r--addressbook/printing/phonelist.ecps29
-rw-r--r--addressbook/printing/smallbook.ecps30
-rw-r--r--addressbook/printing/test-contact-print-style-editor.c93
-rw-r--r--addressbook/printing/test-print.c88
-rw-r--r--addressbook/tools/.cvsignore5
-rw-r--r--addressbook/tools/Makefile.am39
-rwxr-xr-xaddressbook/tools/csv2vcard236
-rw-r--r--addressbook/tools/evolution-addressbook-abuse.c91
-rw-r--r--addressbook/tools/evolution-addressbook-clean.in24
-rw-r--r--addressbook/tools/evolution-addressbook-export-list-cards.c796
-rw-r--r--addressbook/tools/evolution-addressbook-export-list-folders.c99
-rw-r--r--addressbook/tools/evolution-addressbook-export.c160
-rw-r--r--addressbook/tools/evolution-addressbook-export.h81
-rw-r--r--addressbook/tools/evolution-addressbook-import.c90
-rw-r--r--addressbook/util/.cvsignore4
-rw-r--r--addressbook/util/Makefile.am34
-rw-r--r--addressbook/util/eab-book-util.c432
-rw-r--r--addressbook/util/eab-book-util.h72
-rw-r--r--addressbook/util/eab-marshal.list5
-rw-r--r--art/.cvsignore2
-rw-r--r--art/16x16/.cvsignore2
-rw-r--r--art/16x16/Makefile.am3
-rw-r--r--art/48x48/.cvsignore2
-rw-r--r--art/48x48/Makefile.am3
-rw-r--r--art/ChangeLog151
-rw-r--r--art/ChangeLog.pre-1-4712
-rw-r--r--art/Makefile.am26
-rw-r--r--art/README46
-rw-r--r--art/about-box.pngbin54200 -> 0 bytes
-rw-r--r--art/bcg.pngbin526 -> 0 bytes
-rw-r--r--art/broken-image-16.xpm61
-rw-r--r--art/broken-image-24.xpm169
-rw-r--r--art/empty.xpm21
-rw-r--r--art/evolution-contacts-mini.pngbin452 -> 0 bytes
-rw-r--r--art/evolution.pngbin5182 -> 0 bytes
-rw-r--r--art/jump.xpm30
-rw-r--r--art/monkey-16.pngbin977 -> 0 bytes
-rw-r--r--art/offline.pngbin640 -> 0 bytes
-rw-r--r--art/online.pngbin547 -> 0 bytes
-rw-r--r--art/world_map-960.pngbin111584 -> 0 bytes
-rwxr-xr-xautogen.sh25
-rw-r--r--calendar/.cvsignore6
-rw-r--r--calendar/AUTHORS7
-rw-r--r--calendar/ChangeLog9349
-rw-r--r--calendar/ChangeLog.pre-1-421872
-rw-r--r--calendar/Makefile.am25
-rw-r--r--calendar/calendar-errors.xml200
-rw-r--r--calendar/calendar-errors.xml.h138
-rw-r--r--calendar/common/.cvsignore2
-rw-r--r--calendar/common/Makefile.am28
-rw-r--r--calendar/common/authentication.c143
-rw-r--r--calendar/common/authentication.h34
-rw-r--r--calendar/conduits/.cvsignore2
-rw-r--r--calendar/conduits/Makefile.am1
-rw-r--r--calendar/conduits/calendar/.cvsignore9
-rw-r--r--calendar/conduits/calendar/Makefile.am37
-rw-r--r--calendar/conduits/calendar/calendar-conduit.c1950
-rw-r--r--calendar/conduits/calendar/e-calendar.conduit.in9
-rw-r--r--calendar/conduits/todo/.cvsignore9
-rw-r--r--calendar/conduits/todo/Makefile.am37
-rw-r--r--calendar/conduits/todo/e-todo.conduit.in9
-rw-r--r--calendar/conduits/todo/todo-conduit.c1438
-rw-r--r--calendar/gui/.cvsignore28
-rw-r--r--calendar/gui/GNOME_Evolution_Calendar.server.in.in114
-rw-r--r--calendar/gui/Makefile.am263
-rw-r--r--calendar/gui/alarm-notify/.cvsignore12
-rw-r--r--calendar/gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.server.in.in27
-rw-r--r--calendar/gui/alarm-notify/Makefile.am68
-rw-r--r--calendar/gui/alarm-notify/alarm-notify-dialog.c218
-rw-r--r--calendar/gui/alarm-notify/alarm-notify-dialog.h44
-rw-r--r--calendar/gui/alarm-notify/alarm-notify.c370
-rw-r--r--calendar/gui/alarm-notify/alarm-notify.glade543
-rw-r--r--calendar/gui/alarm-notify/alarm-notify.h64
-rw-r--r--calendar/gui/alarm-notify/alarm-queue.c1390
-rw-r--r--calendar/gui/alarm-notify/alarm-queue.h34
-rw-r--r--calendar/gui/alarm-notify/alarm.c301
-rw-r--r--calendar/gui/alarm-notify/alarm.h42
-rw-r--r--calendar/gui/alarm-notify/config-data.c251
-rw-r--r--calendar/gui/alarm-notify/config-data.h38
-rw-r--r--calendar/gui/alarm-notify/notify-main.c171
-rw-r--r--calendar/gui/alarm-notify/util.c49
-rw-r--r--calendar/gui/alarm-notify/util.h29
-rw-r--r--calendar/gui/apps_evolution_calendar.schemas.in.in381
-rw-r--r--calendar/gui/cal-search-bar.c524
-rw-r--r--calendar/gui/cal-search-bar.h83
-rw-r--r--calendar/gui/calendar-commands.c712
-rw-r--r--calendar/gui/calendar-commands.h40
-rw-r--r--calendar/gui/calendar-component.c1546
-rw-r--r--calendar/gui/calendar-component.h67
-rw-r--r--calendar/gui/calendar-config-keys.h79
-rw-r--r--calendar/gui/calendar-config.c1143
-rw-r--r--calendar/gui/calendar-config.h217
-rw-r--r--calendar/gui/calendar-offline-handler.c348
-rw-r--r--calendar/gui/calendar-offline-handler.h69
-rw-r--r--calendar/gui/calendar-view-factory.c213
-rw-r--r--calendar/gui/calendar-view-factory.h64
-rw-r--r--calendar/gui/calendar-view.c279
-rw-r--r--calendar/gui/calendar-view.h66
-rw-r--r--calendar/gui/comp-editor-factory.c647
-rw-r--r--calendar/gui/comp-editor-factory.h58
-rw-r--r--calendar/gui/comp-util.c379
-rw-r--r--calendar/gui/comp-util.h46
-rw-r--r--calendar/gui/control-factory.c79
-rw-r--r--calendar/gui/control-factory.h30
-rw-r--r--calendar/gui/dialogs/.cvsignore8
-rw-r--r--calendar/gui/dialogs/Makefile.am106
-rw-r--r--calendar/gui/dialogs/alarm-dialog.c962
-rw-r--r--calendar/gui/dialogs/alarm-dialog.glade1178
-rw-r--r--calendar/gui/dialogs/alarm-dialog.h37
-rw-r--r--calendar/gui/dialogs/alarm-list-dialog.c261
-rw-r--r--calendar/gui/dialogs/alarm-list-dialog.glade218
-rw-r--r--calendar/gui/dialogs/alarm-list-dialog.h38
-rw-r--r--calendar/gui/dialogs/cal-attachment-bar.c919
-rw-r--r--calendar/gui/dialogs/cal-attachment-bar.h84
-rw-r--r--calendar/gui/dialogs/cal-attachment-select-file.c224
-rw-r--r--calendar/gui/dialogs/cal-attachment-select-file.h36
-rw-r--r--calendar/gui/dialogs/cal-attachment.c486
-rw-r--r--calendar/gui/dialogs/cal-attachment.glade237
-rw-r--r--calendar/gui/dialogs/cal-attachment.h80
-rw-r--r--calendar/gui/dialogs/cal-prefs-dialog.c1041
-rw-r--r--calendar/gui/dialogs/cal-prefs-dialog.glade2026
-rw-r--r--calendar/gui/dialogs/cal-prefs-dialog.h102
-rw-r--r--calendar/gui/dialogs/calendar-setup.c519
-rw-r--r--calendar/gui/dialogs/calendar-setup.glade922
-rw-r--r--calendar/gui/dialogs/calendar-setup.h43
-rw-r--r--calendar/gui/dialogs/cancel-comp.c85
-rw-r--r--calendar/gui/dialogs/cancel-comp.h30
-rw-r--r--calendar/gui/dialogs/changed-comp.c124
-rw-r--r--calendar/gui/dialogs/changed-comp.h30
-rw-r--r--calendar/gui/dialogs/comp-editor-page.c471
-rw-r--r--calendar/gui/dialogs/comp-editor-page.h118
-rw-r--r--calendar/gui/dialogs/comp-editor-util.c349
-rw-r--r--calendar/gui/dialogs/comp-editor-util.h40
-rw-r--r--calendar/gui/dialogs/comp-editor.c1679
-rw-r--r--calendar/gui/dialogs/comp-editor.h104
-rw-r--r--calendar/gui/dialogs/copy-source-dialog.c136
-rw-r--r--calendar/gui/dialogs/copy-source-dialog.h31
-rw-r--r--calendar/gui/dialogs/delete-comp.c160
-rw-r--r--calendar/gui/dialogs/delete-comp.h32
-rw-r--r--calendar/gui/dialogs/delete-error.c122
-rw-r--r--calendar/gui/dialogs/delete-error.h30
-rw-r--r--calendar/gui/dialogs/e-delegate-dialog.c316
-rw-r--r--calendar/gui/dialogs/e-delegate-dialog.glade113
-rw-r--r--calendar/gui/dialogs/e-delegate-dialog.h72
-rw-r--r--calendar/gui/dialogs/e-send-options-utils.c219
-rw-r--r--calendar/gui/dialogs/e-send-options-utils.h31
-rw-r--r--calendar/gui/dialogs/event-editor.c456
-rw-r--r--calendar/gui/dialogs/event-editor.h61
-rw-r--r--calendar/gui/dialogs/event-page.c2055
-rw-r--r--calendar/gui/dialogs/event-page.glade896
-rw-r--r--calendar/gui/dialogs/event-page.h62
-rw-r--r--calendar/gui/dialogs/meeting-page.c983
-rw-r--r--calendar/gui/dialogs/meeting-page.etspec21
-rw-r--r--calendar/gui/dialogs/meeting-page.glade378
-rw-r--r--calendar/gui/dialogs/meeting-page.h67
-rw-r--r--calendar/gui/dialogs/new-calendar.glade239
-rw-r--r--calendar/gui/dialogs/new-task-list.glade193
-rw-r--r--calendar/gui/dialogs/recur-comp.c136
-rw-r--r--calendar/gui/dialogs/recur-comp.h34
-rw-r--r--calendar/gui/dialogs/recurrence-page.c2403
-rw-r--r--calendar/gui/dialogs/recurrence-page.glade637
-rw-r--r--calendar/gui/dialogs/recurrence-page.h62
-rw-r--r--calendar/gui/dialogs/save-comp.c54
-rw-r--r--calendar/gui/dialogs/save-comp.h30
-rw-r--r--calendar/gui/dialogs/schedule-page.c529
-rw-r--r--calendar/gui/dialogs/schedule-page.glade24
-rw-r--r--calendar/gui/dialogs/schedule-page.h59
-rw-r--r--calendar/gui/dialogs/select-source-dialog.c91
-rw-r--r--calendar/gui/dialogs/select-source-dialog.h30
-rw-r--r--calendar/gui/dialogs/send-comp.c106
-rw-r--r--calendar/gui/dialogs/send-comp.h32
-rw-r--r--calendar/gui/dialogs/task-details-page.c830
-rw-r--r--calendar/gui/dialogs/task-details-page.glade463
-rw-r--r--calendar/gui/dialogs/task-details-page.h61
-rw-r--r--calendar/gui/dialogs/task-editor.c433
-rw-r--r--calendar/gui/dialogs/task-editor.h61
-rw-r--r--calendar/gui/dialogs/task-page.c1078
-rw-r--r--calendar/gui/dialogs/task-page.glade652
-rw-r--r--calendar/gui/dialogs/task-page.h62
-rw-r--r--calendar/gui/dialogs/url-editor-dialog.c385
-rw-r--r--calendar/gui/dialogs/url-editor-dialog.glade551
-rw-r--r--calendar/gui/dialogs/url-editor-dialog.h69
-rw-r--r--calendar/gui/e-alarm-list.c670
-rw-r--r--calendar/gui/e-alarm-list.h79
-rw-r--r--calendar/gui/e-cal-component-preview.c441
-rw-r--r--calendar/gui/e-cal-component-preview.h65
-rw-r--r--calendar/gui/e-cal-config.c190
-rw-r--r--calendar/gui/e-cal-config.h83
-rw-r--r--calendar/gui/e-cal-event.c159
-rw-r--r--calendar/gui/e-cal-event.h87
-rw-r--r--calendar/gui/e-cal-list-view-config.c235
-rw-r--r--calendar/gui/e-cal-list-view-config.h55
-rw-r--r--calendar/gui/e-cal-list-view.c550
-rw-r--r--calendar/gui/e-cal-list-view.etspec14
-rw-r--r--calendar/gui/e-cal-list-view.h89
-rw-r--r--calendar/gui/e-cal-menu.c288
-rw-r--r--calendar/gui/e-cal-menu.h124
-rw-r--r--calendar/gui/e-cal-model-calendar.c545
-rw-r--r--calendar/gui/e-cal-model-calendar.h60
-rw-r--r--calendar/gui/e-cal-model-tasks.c1113
-rw-r--r--calendar/gui/e-cal-model-tasks.h68
-rw-r--r--calendar/gui/e-cal-model.c2055
-rw-r--r--calendar/gui/e-cal-model.h158
-rw-r--r--calendar/gui/e-cal-popup.c337
-rw-r--r--calendar/gui/e-cal-popup.h176
-rw-r--r--calendar/gui/e-calendar-marshal.list18
-rw-r--r--calendar/gui/e-calendar-table-config.c251
-rw-r--r--calendar/gui/e-calendar-table-config.h55
-rw-r--r--calendar/gui/e-calendar-table.c1371
-rw-r--r--calendar/gui/e-calendar-table.etspec20
-rw-r--r--calendar/gui/e-calendar-table.h109
-rw-r--r--calendar/gui/e-calendar-view.c1674
-rw-r--r--calendar/gui/e-calendar-view.h158
-rw-r--r--calendar/gui/e-cell-date-edit-config.c328
-rw-r--r--calendar/gui/e-cell-date-edit-config.h56
-rw-r--r--calendar/gui/e-cell-date-edit-text.c224
-rw-r--r--calendar/gui/e-cell-date-edit-text.h74
-rw-r--r--calendar/gui/e-comp-editor-registry.c214
-rw-r--r--calendar/gui/e-comp-editor-registry.h74
-rw-r--r--calendar/gui/e-date-edit-config.c264
-rw-r--r--calendar/gui/e-date-edit-config.h55
-rw-r--r--calendar/gui/e-date-time-list.c563
-rw-r--r--calendar/gui/e-date-time-list.h83
-rw-r--r--calendar/gui/e-day-view-config.c466
-rw-r--r--calendar/gui/e-day-view-config.h55
-rw-r--r--calendar/gui/e-day-view-layout.c352
-rw-r--r--calendar/gui/e-day-view-layout.h56
-rw-r--r--calendar/gui/e-day-view-main-item.c823
-rw-r--r--calendar/gui/e-day-view-main-item.h65
-rw-r--r--calendar/gui/e-day-view-time-item.c666
-rw-r--r--calendar/gui/e-day-view-time-item.h74
-rw-r--r--calendar/gui/e-day-view-top-item.c728
-rw-r--r--calendar/gui/e-day-view-top-item.h66
-rw-r--r--calendar/gui/e-day-view.c7501
-rw-r--r--calendar/gui/e-day-view.h578
-rw-r--r--calendar/gui/e-itip-control.c2517
-rw-r--r--calendar/gui/e-itip-control.glade493
-rw-r--r--calendar/gui/e-itip-control.h77
-rw-r--r--calendar/gui/e-meeting-attendee.c992
-rw-r--r--calendar/gui/e-meeting-attendee.h172
-rw-r--r--calendar/gui/e-meeting-list-view.c409
-rw-r--r--calendar/gui/e-meeting-list-view.h64
-rw-r--r--calendar/gui/e-meeting-store.c1537
-rw-r--r--calendar/gui/e-meeting-store.h112
-rw-r--r--calendar/gui/e-meeting-time-sel-item.c991
-rw-r--r--calendar/gui/e-meeting-time-sel-item.h78
-rw-r--r--calendar/gui/e-meeting-time-sel.c2933
-rw-r--r--calendar/gui/e-meeting-time-sel.etspec19
-rw-r--r--calendar/gui/e-meeting-time-sel.h392
-rw-r--r--calendar/gui/e-meeting-types.h78
-rw-r--r--calendar/gui/e-meeting-utils.c52
-rw-r--r--calendar/gui/e-meeting-utils.h49
-rw-r--r--calendar/gui/e-mini-calendar-config.c242
-rw-r--r--calendar/gui/e-mini-calendar-config.h55
-rw-r--r--calendar/gui/e-pub-utils.c337
-rw-r--r--calendar/gui/e-pub-utils.h62
-rw-r--r--calendar/gui/e-select-names-editable.c242
-rw-r--r--calendar/gui/e-select-names-editable.h64
-rw-r--r--calendar/gui/e-select-names-renderer.c189
-rw-r--r--calendar/gui/e-select-names-renderer.h63
-rw-r--r--calendar/gui/e-tasks.c1297
-rw-r--r--calendar/gui/e-tasks.h87
-rw-r--r--calendar/gui/e-timezone-entry.c344
-rw-r--r--calendar/gui/e-timezone-entry.h80
-rw-r--r--calendar/gui/e-week-view-config.c320
-rw-r--r--calendar/gui/e-week-view-config.h55
-rw-r--r--calendar/gui/e-week-view-event-item.c982
-rw-r--r--calendar/gui/e-week-view-event-item.h70
-rw-r--r--calendar/gui/e-week-view-layout.c425
-rw-r--r--calendar/gui/e-week-view-layout.h69
-rw-r--r--calendar/gui/e-week-view-main-item.c396
-rw-r--r--calendar/gui/e-week-view-main-item.h66
-rw-r--r--calendar/gui/e-week-view-titles-item.c289
-rw-r--r--calendar/gui/e-week-view-titles-item.h66
-rw-r--r--calendar/gui/e-week-view.c4078
-rw-r--r--calendar/gui/e-week-view.h444
-rw-r--r--calendar/gui/gnome-cal.c3305
-rw-r--r--calendar/gui/gnome-cal.h192
-rw-r--r--calendar/gui/gnome-calendar-conduit.pngbin3000 -> 0 bytes
-rw-r--r--calendar/gui/goto-dialog.glade225
-rw-r--r--calendar/gui/goto.c264
-rw-r--r--calendar/gui/goto.h31
-rw-r--r--calendar/gui/itip-bonobo-control.c265
-rw-r--r--calendar/gui/itip-bonobo-control.h31
-rw-r--r--calendar/gui/itip-utils.c1257
-rw-r--r--calendar/gui/itip-utils.h40
-rw-r--r--calendar/gui/main.c185
-rw-r--r--calendar/gui/migration.c989
-rw-r--r--calendar/gui/migration.h35
-rw-r--r--calendar/gui/misc.c80
-rw-r--r--calendar/gui/misc.h30
-rw-r--r--calendar/gui/print.c2788
-rw-r--r--calendar/gui/print.h43
-rw-r--r--calendar/gui/tag-calendar.c226
-rw-r--r--calendar/gui/tag-calendar.h33
-rw-r--r--calendar/gui/tasks-component.c1222
-rw-r--r--calendar/gui/tasks-component.h63
-rw-r--r--calendar/gui/tasks-control.c435
-rw-r--r--calendar/gui/tasks-control.h34
-rw-r--r--calendar/gui/weekday-picker.c651
-rw-r--r--calendar/gui/weekday-picker.h71
-rw-r--r--calendar/idl/.cvsignore2
-rw-r--r--calendar/idl/Makefile.am5
-rw-r--r--calendar/idl/evolution-calendar.idl52
-rw-r--r--calendar/importers/.cvsignore6
-rw-r--r--calendar/importers/GNOME_Evolution_Calendar_Importer.server.in.in54
-rw-r--r--calendar/importers/Makefile.am40
-rw-r--r--calendar/importers/evolution-calendar-importer.h37
-rw-r--r--calendar/importers/icalendar-importer.c738
-rw-r--r--calendar/importers/main.c56
-rw-r--r--calendar/zones.h387
-rw-r--r--composer/.cvsignore17
-rw-r--r--composer/ChangeLog1035
-rw-r--r--composer/ChangeLog.pre-1-44037
-rw-r--r--composer/Composer.idl3
-rw-r--r--composer/Evolution-Composer.idl141
-rw-r--r--composer/Makefile.am93
-rw-r--r--composer/bad-icon.xpm53
-rw-r--r--composer/e-msg-composer-attachment-bar.c847
-rw-r--r--composer/e-msg-composer-attachment-bar.h77
-rw-r--r--composer/e-msg-composer-attachment.c463
-rw-r--r--composer/e-msg-composer-attachment.glade237
-rw-r--r--composer/e-msg-composer-attachment.h77
-rw-r--r--composer/e-msg-composer-hdrs.c1626
-rw-r--r--composer/e-msg-composer-hdrs.h155
-rw-r--r--composer/e-msg-composer-select-file.c221
-rw-r--r--composer/e-msg-composer-select-file.h36
-rw-r--r--composer/e-msg-composer.c5637
-rw-r--r--composer/e-msg-composer.h244
-rw-r--r--composer/evolution-composer.c399
-rw-r--r--composer/evolution-composer.h75
-rw-r--r--composer/listener.c282
-rw-r--r--composer/listener.h51
-rw-r--r--composer/mail-composer-errors.xml72
-rw-r--r--composer/mail-composer-errors.xml.h56
-rw-r--r--configure.in1626
-rw-r--r--data/.cvsignore4
-rw-r--r--data/Makefile.am79
-rw-r--r--data/cde_app_root/.cvsignore2
-rw-r--r--data/cde_app_root/Makefile.am1
-rw-r--r--data/cde_app_root/dt/.cvsignore2
-rw-r--r--data/cde_app_root/dt/Makefile.am1
-rw-r--r--data/cde_app_root/dt/appconfig/.cvsignore2
-rw-r--r--data/cde_app_root/dt/appconfig/Makefile.am1
-rw-r--r--data/cde_app_root/dt/appconfig/appmanager/.cvsignore2
-rw-r--r--data/cde_app_root/dt/appconfig/appmanager/C/.cvsignore2
-rw-r--r--data/cde_app_root/dt/appconfig/appmanager/C/Makefile.am1
-rw-r--r--data/cde_app_root/dt/appconfig/appmanager/C/Ximian/.cvsignore2
-rwxr-xr-xdata/cde_app_root/dt/appconfig/appmanager/C/Ximian/Evolution17
-rw-r--r--data/cde_app_root/dt/appconfig/appmanager/C/Ximian/Makefile.am6
-rw-r--r--data/cde_app_root/dt/appconfig/appmanager/Makefile.am1
-rw-r--r--data/cde_app_root/dt/appconfig/icons/.cvsignore2
-rw-r--r--data/cde_app_root/dt/appconfig/icons/C/.cvsignore2
-rw-r--r--data/cde_app_root/dt/appconfig/icons/C/Evolution.l.pm307
-rw-r--r--data/cde_app_root/dt/appconfig/icons/C/Evolution.m.pm291
-rw-r--r--data/cde_app_root/dt/appconfig/icons/C/Evolution.t.pm103
-rw-r--r--data/cde_app_root/dt/appconfig/icons/C/Makefile.am15
-rw-r--r--data/cde_app_root/dt/appconfig/icons/C/Ximian.l.pm147
-rw-r--r--data/cde_app_root/dt/appconfig/icons/C/Ximian.m.pm272
-rw-r--r--data/cde_app_root/dt/appconfig/icons/C/Ximian.t.pm289
-rw-r--r--data/cde_app_root/dt/appconfig/icons/Makefile.am1
-rw-r--r--data/cde_app_root/dt/appconfig/types/.cvsignore2
-rw-r--r--data/cde_app_root/dt/appconfig/types/C/.cvsignore3
-rw-r--r--data/cde_app_root/dt/appconfig/types/C/Makefile.am6
-rw-r--r--data/cde_app_root/dt/appconfig/types/C/Ximian.dt.in30
-rw-r--r--data/cde_app_root/dt/appconfig/types/Makefile.am1
-rw-r--r--data/evolution.141
-rw-r--r--data/evolution.desktop.in.in14
-rw-r--r--data/evolution.keys.in.in24
-rw-r--r--data/evolution.mime5
-rw-r--r--designs/ChangeLog36
-rw-r--r--designs/OOA/Comments3
-rw-r--r--designs/OOA/ooa.glade488
-rw-r--r--designs/OOA/oooa_question.pngbin16230 -> 0 bytes
-rw-r--r--designs/OOA/oooa_screenshot.pngbin14630 -> 0 bytes
-rw-r--r--designs/OOA/outlook_question.pngbin9421 -> 0 bytes
-rw-r--r--designs/OOA/outlook_screenshot.pngbin54458 -> 0 bytes
-rw-r--r--designs/OOA/spec.txt29
-rw-r--r--designs/read_receipts/.cvsignore1
-rw-r--r--designs/read_receipts/Comments3
-rw-r--r--designs/read_receipts/notification-of-rr-request.jpgbin26853 -> 0 bytes
-rw-r--r--designs/read_receipts/proposal.pngbin26147 -> 0 bytes
-rw-r--r--designs/read_receipts/read.glade339
-rw-r--r--designs/read_receipts/read.gladep7
-rw-r--r--designs/read_receipts/read_receipt_options.jpgbin40847 -> 0 bytes
-rw-r--r--designs/read_receipts/receipt.jpgbin103530 -> 0 bytes
-rw-r--r--designs/read_receipts/secure_options.jpgbin18181 -> 0 bytes
-rw-r--r--designs/read_receipts/spec.txt67
-rw-r--r--devel-docs/.cvsignore3
-rw-r--r--devel-docs/Makefile.am3
-rw-r--r--devel-docs/camel/.cvsignore12
-rw-r--r--devel-docs/camel/Makefile.am101
-rw-r--r--devel-docs/camel/README_AND_TODO.txt43
-rw-r--r--devel-docs/camel/camel-docs.sgml28
-rw-r--r--devel-docs/camel/camel-sections.txt154
-rw-r--r--devel-docs/camel/camel.types9
-rw-r--r--devel-docs/camel/tmpl/.cvsignore2
-rw-r--r--devel-docs/camel/tmpl/camel-data-wrapper.sgml26
-rw-r--r--devel-docs/camel/tmpl/camel-folder.sgml96
-rw-r--r--devel-docs/camel/tmpl/camel-mime-message.sgml171
-rw-r--r--devel-docs/camel/tmpl/camel-mime-part.sgml151
-rw-r--r--devel-docs/camel/tmpl/camel-recipient.sgml88
-rw-r--r--devel-docs/camel/tmpl/camel-service.sgml72
-rw-r--r--devel-docs/camel/tmpl/camel-store.sgml45
-rw-r--r--devel-docs/camel/tmpl/camel-stream.sgml101
-rw-r--r--devel-docs/misc/errors.txt168
-rw-r--r--devel-docs/misc/ref_and_id_proposition.txt237
-rw-r--r--devel-docs/query/virtual-folder-in-depth.sgml407
-rw-r--r--devel-docs/query/virtual-folder-in-depth.txt309
-rw-r--r--doc/.cvsignore2
-rw-r--r--doc/COPYING-DOCS355
-rw-r--r--doc/Camel-Classes65
-rw-r--r--doc/ChangeLog0
-rw-r--r--doc/ChangeLog.pre-1-41146
-rw-r--r--doc/Design201
-rw-r--r--doc/Keybindings13
-rw-r--r--doc/Makefile.am1
-rw-r--r--doc/NAMESPACE65
-rw-r--r--doc/devel/.cvsignore5
-rw-r--r--doc/devel/ChangeLog57
-rw-r--r--doc/devel/ChangeLog.pre-1-4286
-rw-r--r--doc/devel/Makefile.am179
-rwxr-xr-xdoc/devel/build-eplugin-manual.pl263
-rw-r--r--doc/devel/evolution-devel-guide.sgml98
-rw-r--r--doc/devel/evolution-plugin-manual.xml2803
-rw-r--r--doc/devel/executive-summary/evolution-services.hierarchy7
-rw-r--r--doc/devel/fdl.sgml671
-rw-r--r--doc/devel/images/Makefile21
-rw-r--r--doc/devel/images/e-config-build-1.pngbin16402 -> 0 bytes
-rw-r--r--doc/devel/images/e-config-build-2.pngbin19889 -> 0 bytes
-rw-r--r--doc/devel/images/e-config-build-3.pngbin7281 -> 0 bytes
-rw-r--r--doc/devel/images/e-config-flow.pic36
-rw-r--r--doc/devel/images/e-popup-merge-1.pic61
-rw-r--r--doc/devel/images/e-popup-merge-2.pic67
-rw-r--r--doc/devel/importer/.cvsignore10
-rw-r--r--doc/devel/importer/Makefile.am195
-rw-r--r--doc/devel/importer/evolution-shell-importer-sections.txt79
-rw-r--r--doc/devel/importer/evolution-shell-importer.args0
-rw-r--r--doc/devel/importer/evolution-shell-importer.hierarchy7
-rw-r--r--doc/devel/importer/evolution-shell-importer.types9
-rw-r--r--doc/devel/importer/private-reference.sgml21
-rw-r--r--doc/devel/importer/public-reference.sgml20
-rw-r--r--doc/devel/importer/tmpl/evolution-importer-client.sgml84
-rw-r--r--doc/devel/importer/tmpl/evolution-importer.sgml96
-rw-r--r--doc/devel/importer/tmpl/evolution-shell-importer-unused.sgml10
-rw-r--r--doc/devel/preface.sgml113
-rw-r--r--doc/devel/reference.sgml49
-rw-r--r--doc/white-papers/calendar/calendar.sgml209
-rw-r--r--doc/white-papers/mail/camel.sgml356
-rw-r--r--doc/white-papers/mail/ibex.sgml158
-rw-r--r--doc/white-papers/widgets/e-table.sgml279
-rw-r--r--e-util/.cvsignore10
-rw-r--r--e-util/ChangeLog1155
-rw-r--r--e-util/ChangeLog.pre-1-42649
-rw-r--r--e-util/Makefile.am139
-rw-r--r--e-util/e-account-list.c466
-rw-r--r--e-util/e-account-list.h75
-rw-r--r--e-util/e-account.c914
-rw-r--r--e-util/e-account.h153
-rw-r--r--e-util/e-bconf-map.c544
-rw-r--r--e-util/e-bconf-map.h102
-rw-r--r--e-util/e-categories-config.c101
-rw-r--r--e-util/e-categories-config.h27
-rw-r--r--e-util/e-categories-master-list-wombat.c183
-rw-r--r--e-util/e-categories-master-list-wombat.h31
-rw-r--r--e-util/e-component-listener.c171
-rw-r--r--e-util/e-component-listener.h47
-rw-r--r--e-util/e-config-listener.c607
-rw-r--r--e-util/e-config-listener.h80
-rw-r--r--e-util/e-config.c1480
-rw-r--r--e-util/e-config.h392
-rw-r--r--e-util/e-corba-utils.c42
-rw-r--r--e-util/e-corba-utils.h30
-rw-r--r--e-util/e-dialog-utils.c329
-rw-r--r--e-util/e-dialog-utils.h45
-rw-r--r--e-util/e-dialog-widgets.c811
-rw-r--r--e-util/e-dialog-widgets.h60
-rw-r--r--e-util/e-error-tool.c134
-rw-r--r--e-util/e-event.c559
-rw-r--r--e-util/e-event.h238
-rw-r--r--e-util/e-folder-map.c186
-rw-r--r--e-util/e-folder-map.h35
-rw-r--r--e-util/e-fsutils.c158
-rw-r--r--e-util/e-fsutils.h34
-rw-r--r--e-util/e-gtk-utils.c216
-rw-r--r--e-util/e-gtk-utils.h49
-rw-r--r--e-util/e-gui-utils.c131
-rw-r--r--e-util/e-gui-utils.h14
-rw-r--r--e-util/e-html-utils.c524
-rw-r--r--e-util/e-html-utils.h39
-rw-r--r--e-util/e-icon-factory.c391
-rw-r--r--e-util/e-icon-factory.h58
-rw-r--r--e-util/e-iterator.c183
-rw-r--r--e-util/e-iterator.h71
-rw-r--r--e-util/e-list-iterator.c249
-rw-r--r--e-util/e-list-iterator.h46
-rw-r--r--e-util/e-list.c191
-rw-r--r--e-util/e-list.h71
-rw-r--r--e-util/e-menu.c902
-rw-r--r--e-util/e-menu.h323
-rw-r--r--e-util/e-mktemp.c241
-rw-r--r--e-util/e-mktemp.h32
-rw-r--r--e-util/e-passwords.c947
-rw-r--r--e-util/e-passwords.h71
-rw-r--r--e-util/e-pilot-map.c448
-rw-r--r--e-util/e-pilot-map.h58
-rw-r--r--e-util/e-pilot-util.c107
-rw-r--r--e-util/e-pilot-util.h36
-rw-r--r--e-util/e-plugin-mono.c198
-rw-r--r--e-util/e-plugin-mono.h27
-rw-r--r--e-util/e-plugin.c1165
-rw-r--r--e-util/e-plugin.h250
-rw-r--r--e-util/e-popup.c844
-rw-r--r--e-util/e-popup.h302
-rw-r--r--e-util/e-print.c97
-rw-r--r--e-util/e-print.h39
-rw-r--r--e-util/e-request.c105
-rw-r--r--e-util/e-request.h33
-rw-r--r--e-util/e-signature-list.c471
-rw-r--r--e-util/e-signature-list.h76
-rw-r--r--e-util/e-signature.c366
-rw-r--r--e-util/e-signature.h76
-rw-r--r--e-util/e-time-utils.c492
-rw-r--r--e-util/e-time-utils.h58
-rw-r--r--e-util/e-uid.c61
-rw-r--r--e-util/e-uid.h28
-rw-r--r--e-util/e-util-marshal.list2
-rw-r--r--e-util/eggtrayicon.c480
-rw-r--r--e-util/eggtrayicon.h77
-rw-r--r--e-util/md5-utils.c363
-rw-r--r--e-util/md5-utils.h52
-rw-r--r--evolution-plugin.pc.in19
-rw-r--r--evolution-shell.pc.in23
-rw-r--r--filter/.cvsignore10
-rw-r--r--filter/ChangeLog441
-rw-r--r--filter/ChangeLog.pre-1-42967
-rw-r--r--filter/Makefile.am63
-rw-r--r--filter/filter-code.c127
-rw-r--r--filter/filter-code.h56
-rw-r--r--filter/filter-colour.c229
-rw-r--r--filter/filter-colour.h58
-rw-r--r--filter/filter-datespec.c481
-rw-r--r--filter/filter-datespec.h74
-rw-r--r--filter/filter-element.c341
-rw-r--r--filter/filter-element.h94
-rw-r--r--filter/filter-errors.xml34
-rw-r--r--filter/filter-errors.xml.h24
-rw-r--r--filter/filter-file.c313
-rw-r--r--filter/filter-file.h73
-rw-r--r--filter/filter-input.c366
-rw-r--r--filter/filter-input.h62
-rw-r--r--filter/filter-int.c269
-rw-r--r--filter/filter-int.h63
-rw-r--r--filter/filter-label.c182
-rw-r--r--filter/filter-label.h70
-rw-r--r--filter/filter-marshal.list2
-rw-r--r--filter/filter-option.c371
-rw-r--r--filter/filter-option.h69
-rw-r--r--filter/filter-part.c545
-rw-r--r--filter/filter-part.h87
-rw-r--r--filter/filter-rule.c977
-rw-r--r--filter/filter-rule.h132
-rw-r--r--filter/filter.glade674
-rw-r--r--filter/rule-context.c947
-rw-r--r--filter/rule-context.h148
-rw-r--r--filter/rule-editor.c746
-rw-r--r--filter/rule-editor.h104
-rw-r--r--help/.cvsignore2
-rw-r--r--help/C/.cvsignore4
-rw-r--r--help/C/Makefile.am80
-rw-r--r--help/C/evolution-C.omf25
-rw-r--r--help/C/evolution.xml3901
-rw-r--r--help/C/figures/calendar.pngbin102053 -> 0 bytes
-rw-r--r--help/C/figures/config-cal.pngbin61474 -> 0 bytes
-rw-r--r--help/C/figures/config-mail.pngbin61733 -> 0 bytes
-rw-r--r--help/C/figures/contact-editor.pngbin52598 -> 0 bytes
-rw-r--r--help/C/figures/contact.pngbin98575 -> 0 bytes
-rwxr-xr-xhelp/C/figures/contacts_mainwindow_a.pngbin63362 -> 0 bytes
-rwxr-xr-xhelp/C/figures/evo_account_info_a.pngbin52493 -> 0 bytes
-rwxr-xr-xhelp/C/figures/evo_cal_callout_a.gifbin38620 -> 0 bytes
-rwxr-xr-xhelp/C/figures/evo_contacteditor_a.pngbin62084 -> 0 bytes
-rwxr-xr-xhelp/C/figures/evo_email_a.pngbin87620 -> 0 bytes
-rw-r--r--help/C/figures/evo_gwreceive_a.pngbin38711 -> 0 bytes
-rwxr-xr-xhelp/C/figures/evo_identity_a.pngbin46427 -> 0 bytes
-rw-r--r--help/C/figures/evo_imapreceive_a.pngbin45938 -> 0 bytes
-rw-r--r--help/C/figures/evo_mail_callout_a.epsbin1194654 -> 0 bytes
-rwxr-xr-xhelp/C/figures/evo_mail_callout_a.gifbin51432 -> 0 bytes
-rwxr-xr-xhelp/C/figures/evo_mail_callout_a.pngbin90552 -> 0 bytes
-rw-r--r--help/C/figures/evo_maildirreceive_a.pngbin23901 -> 0 bytes
-rw-r--r--help/C/figures/evo_mboxreceive_a.pngbin25966 -> 0 bytes
-rw-r--r--help/C/figures/evo_mereceive_a.pngbin44207 -> 0 bytes
-rw-r--r--help/C/figures/evo_mhreceive_a.pngbin23357 -> 0 bytes
-rwxr-xr-xhelp/C/figures/evo_newmess_a.pngbin49119 -> 0 bytes
-rw-r--r--help/C/figures/evo_popreceive_a.pngbin25729 -> 0 bytes
-rwxr-xr-xhelp/C/figures/evo_receive_setup2_a.pngbin61857 -> 0 bytes
-rwxr-xr-xhelp/C/figures/evo_receive_setup_a.pngbin60130 -> 0 bytes
-rwxr-xr-xhelp/C/figures/evo_rule_a.pngbin40873 -> 0 bytes
-rwxr-xr-xhelp/C/figures/evo_send_setup_a.pngbin62908 -> 0 bytes
-rwxr-xr-xhelp/C/figures/evo_timezone_a.pngbin137139 -> 0 bytes
-rw-r--r--help/C/figures/evo_usereceive_a.pngbin27396 -> 0 bytes
-rw-r--r--help/C/figures/exchange-delegation.pngbin62447 -> 0 bytes
-rw-r--r--help/C/figures/exchange-identity.pngbin29201 -> 0 bytes
-rw-r--r--help/C/figures/exchange-receive-options.pngbin31765 -> 0 bytes
-rw-r--r--help/C/figures/exchange-receive.pngbin31500 -> 0 bytes
-rw-r--r--help/C/figures/filter-new-fig.pngbin27412 -> 0 bytes
-rw-r--r--help/C/figures/full-1.pngbin1218 -> 0 bytes
-rw-r--r--help/C/figures/full-2.pngbin1260 -> 0 bytes
-rw-r--r--help/C/figures/full-3.pngbin1290 -> 0 bytes
-rw-r--r--help/C/figures/full-4.pngbin1251 -> 0 bytes
-rw-r--r--help/C/figures/full-5.pngbin1293 -> 0 bytes
-rw-r--r--help/C/figures/full-6.pngbin1284 -> 0 bytes
-rw-r--r--help/C/figures/full-7.pngbin818 -> 0 bytes
-rw-r--r--help/C/figures/mail-druid-pic.pngbin32267 -> 0 bytes
-rw-r--r--help/C/figures/mail-inbox.pngbin95031 -> 0 bytes
-rw-r--r--help/C/figures/mail-threaded.pngbin7093 -> 0 bytes
-rwxr-xr-xhelp/C/figures/mail_mainwindow_a.pngbin154567 -> 0 bytes
-rw-r--r--help/C/figures/mainwindow-pic.pngbin101231 -> 0 bytes
-rw-r--r--help/C/figures/newmsg.pngbin59054 -> 0 bytes
-rw-r--r--help/C/figures/replymsg.pngbin63824 -> 0 bytes
-rw-r--r--help/C/figures/schedule.pngbin44752 -> 0 bytes
-rw-r--r--help/C/figures/vfolder-createrule-fig.pngbin35099 -> 0 bytes
-rw-r--r--help/COPYING-DOCS355
-rw-r--r--help/ChangeLog79
-rw-r--r--help/ChangeLog.pre-1-42072
-rw-r--r--help/Makefile.am8
-rw-r--r--help/README_Translations46
-rw-r--r--help/devel/executive-summary/evolution-services.hierarchy7
-rw-r--r--help/devel/importer/evolution-shell-importer.hierarchy7
-rw-r--r--help/es/ChangeLog10
-rw-r--r--help/es/Makefile.am27
-rw-r--r--help/es/README3
-rw-r--r--help/es/apx-authors.xml77
-rw-r--r--help/es/apx-bugs.xml28
-rw-r--r--help/es/apx-fdl.xml667
-rw-r--r--help/es/apx-gloss.xml184
-rw-r--r--help/es/apx-gpl.xml419
-rw-r--r--help/es/config-prefs.xml997
-rw-r--r--help/es/config-sync.xml121
-rw-r--r--help/es/evolution-1.4-es.omf25
-rw-r--r--help/es/evolution-1.4.xml143
-rw-r--r--help/es/evolution-doc-1.4.po13183
-rw-r--r--help/es/legal.xml41
-rw-r--r--help/es/menuref.xml497
-rw-r--r--help/es/preface.xml181
-rw-r--r--help/es/topic.dat11
-rw-r--r--help/es/usage-calendar.xml715
-rw-r--r--help/es/usage-contact.xml542
-rw-r--r--help/es/usage-exchange.xml849
-rw-r--r--help/es/usage-exec-summary.xml246
-rw-r--r--help/es/usage-mail-org.xml1152
-rw-r--r--help/es/usage-mail.xml1901
-rw-r--r--help/es/usage-mainwindow.xml1524
-rw-r--r--help/es/usage-print.xml105
-rw-r--r--help/es/usage-sync.xml31
-rw-r--r--help/no/.cvsignore9
-rw-r--r--help/no/ChangeLog0
-rw-r--r--help/no/ChangeLog.pre-1-413
-rw-r--r--help/no/Makefile.am51
-rw-r--r--help/no/apx-authors.sgml98
-rw-r--r--help/no/apx-bugs.sgml38
-rw-r--r--help/no/apx-gloss.sgml419
-rw-r--r--help/no/config-encryption.sgml147
-rw-r--r--help/no/config-prefs.sgml744
-rw-r--r--help/no/config-sync.sgml126
-rw-r--r--help/no/evolution-faq.sgml973
-rw-r--r--help/no/evolution-no.omf16
-rw-r--r--help/no/evolution.sgml128
-rw-r--r--help/no/figures/calendar.pngbin42615 -> 0 bytes
-rw-r--r--help/no/figures/config-cal.pngbin7338 -> 0 bytes
-rw-r--r--help/no/figures/config-mail.pngbin9210 -> 0 bytes
-rw-r--r--help/no/figures/contact-editor.pngbin37707 -> 0 bytes
-rw-r--r--help/no/figures/contact.pngbin39742 -> 0 bytes
-rw-r--r--help/no/figures/filter-assist-fig.pngbin5575 -> 0 bytes
-rw-r--r--help/no/figures/filter-new-fig.pngbin8802 -> 0 bytes
-rw-r--r--help/no/figures/full-1.pngbin1218 -> 0 bytes
-rw-r--r--help/no/figures/full-2.pngbin1260 -> 0 bytes
-rw-r--r--help/no/figures/full-3.pngbin1290 -> 0 bytes
-rw-r--r--help/no/figures/full-4.pngbin1251 -> 0 bytes
-rw-r--r--help/no/figures/full-5.pngbin1293 -> 0 bytes
-rw-r--r--help/no/figures/full-6.pngbin1284 -> 0 bytes
-rw-r--r--help/no/figures/full-7.pngbin818 -> 0 bytes
-rw-r--r--help/no/figures/mail-composer.pngbin14971 -> 0 bytes
-rw-r--r--help/no/figures/mail-druid-pic.pngbin8457 -> 0 bytes
-rw-r--r--help/no/figures/mail-inbox.pngbin127593 -> 0 bytes
-rw-r--r--help/no/figures/mainwindow-pic.pngbin130739 -> 0 bytes
-rw-r--r--help/no/figures/newmsg.pngbin14798 -> 0 bytes
-rw-r--r--help/no/figures/print-dest.pngbin7358 -> 0 bytes
-rw-r--r--help/no/figures/print-preview.pngbin51801 -> 0 bytes
-rw-r--r--help/no/figures/replymsg.pngbin19338 -> 0 bytes
-rw-r--r--help/no/figures/vfolder-createrule-fig.pngbin8321 -> 0 bytes
-rw-r--r--help/no/menuref.sgml421
-rw-r--r--help/no/preface.sgml83
-rw-r--r--help/no/topic.dat10
-rw-r--r--help/no/usage-calendar.sgml561
-rw-r--r--help/no/usage-contact.sgml609
-rw-r--r--help/no/usage-encryption.sgml147
-rw-r--r--help/no/usage-exec-summary.sgml315
-rw-r--r--help/no/usage-mail-org.sgml1021
-rw-r--r--help/no/usage-mail.sgml2005
-rw-r--r--help/no/usage-mainwindow.sgml1174
-rw-r--r--help/no/usage-notes.sgml49
-rw-r--r--help/no/usage-print.sgml115
-rw-r--r--help/no/usage-sync.sgml39
-rw-r--r--help/omf.make53
-rw-r--r--help/quickref/.cvsignore2
-rw-r--r--help/quickref/C/.cvsignore2
-rw-r--r--help/quickref/C/Makefile.am8
-rw-r--r--help/quickref/C/quickref.pdfbin70672 -> 0 bytes
-rw-r--r--help/quickref/C/quickref.tex111
-rw-r--r--help/quickref/Makefile.am3
-rw-r--r--help/quickref/evolution-logo.eps18472
-rwxr-xr-xhelp/update_po.pl212
-rwxr-xr-xhelp/update_translation.pl240
-rw-r--r--help/xmldocs.make96
-rw-r--r--mail/.cvsignore24
-rw-r--r--mail/ChangeLog8987
-rw-r--r--mail/ChangeLog.pre-1-424750
-rw-r--r--mail/GNOME_Evolution_Mail.server.in.in166
-rw-r--r--mail/Makefile.am293
-rw-r--r--mail/README.async366
-rw-r--r--mail/Spell.idl71
-rw-r--r--mail/default/.cvsignore2
-rw-r--r--mail/default/C/.cvsignore2
-rw-r--r--mail/default/C/Inbox339
-rw-r--r--mail/default/C/Makefile.am7
-rw-r--r--mail/default/Makefile.am4
-rw-r--r--mail/default/ja/.cvsignore2
-rw-r--r--mail/default/ja/Inbox353
-rw-r--r--mail/default/ja/Makefile.am7
-rw-r--r--mail/default/nl/.cvsignore2
-rw-r--r--mail/default/nl/Inbox344
-rw-r--r--mail/default/nl/Makefile.am7
-rw-r--r--mail/default/pt/.cvsignore2
-rw-r--r--mail/default/pt/Inbox341
-rw-r--r--mail/default/pt/Makefile.am7
-rw-r--r--mail/default/zh_CN/Inbox316
-rw-r--r--mail/default/zh_CN/Makefile.am7
-rw-r--r--mail/e-searching-tokenizer.c1252
-rw-r--r--mail/e-searching-tokenizer.h73
-rw-r--r--mail/em-account-editor.c2513
-rw-r--r--mail/em-account-editor.h86
-rw-r--r--mail/em-account-prefs.c547
-rw-r--r--mail/em-account-prefs.h94
-rw-r--r--mail/em-camel-stream.c326
-rw-r--r--mail/em-camel-stream.h71
-rw-r--r--mail/em-composer-prefs.c990
-rw-r--r--mail/em-composer-prefs.h125
-rw-r--r--mail/em-composer-utils.c1927
-rw-r--r--mail/em-composer-utils.h80
-rw-r--r--mail/em-config.c321
-rw-r--r--mail/em-config.h114
-rw-r--r--mail/em-event.c219
-rw-r--r--mail/em-event.h112
-rw-r--r--mail/em-filter-context.c297
-rw-r--r--mail/em-filter-context.h57
-rw-r--r--mail/em-filter-editor.c164
-rw-r--r--mail/em-filter-editor.h56
-rw-r--r--mail/em-filter-folder-element.c268
-rw-r--r--mail/em-filter-folder-element.h53
-rw-r--r--mail/em-filter-i18n.h66
-rw-r--r--mail/em-filter-rule.c545
-rw-r--r--mail/em-filter-rule.h57
-rw-r--r--mail/em-filter-source-element.c376
-rw-r--r--mail/em-filter-source-element.h52
-rw-r--r--mail/em-folder-browser.c1082
-rw-r--r--mail/em-folder-browser.h60
-rw-r--r--mail/em-folder-properties.c347
-rw-r--r--mail/em-folder-properties.h39
-rw-r--r--mail/em-folder-selection-button.c329
-rw-r--r--mail/em-folder-selection-button.h75
-rw-r--r--mail/em-folder-selection.c80
-rw-r--r--mail/em-folder-selection.h42
-rw-r--r--mail/em-folder-selector.c437
-rw-r--r--mail/em-folder-selector.h93
-rw-r--r--mail/em-folder-tree-model.c1184
-rw-r--r--mail/em-folder-tree-model.h151
-rw-r--r--mail/em-folder-tree.c3018
-rw-r--r--mail/em-folder-tree.h94
-rw-r--r--mail/em-folder-view.c2509
-rw-r--r--mail/em-folder-view.h142
-rw-r--r--mail/em-format-hook.c272
-rw-r--r--mail/em-format-hook.h97
-rw-r--r--mail/em-format-html-display.c1540
-rw-r--r--mail/em-format-html-display.h65
-rw-r--r--mail/em-format-html-print.c250
-rw-r--r--mail/em-format-html-print.h39
-rw-r--r--mail/em-format-html.c1769
-rw-r--r--mail/em-format-html.h218
-rw-r--r--mail/em-format-quote.c520
-rw-r--r--mail/em-format-quote.h56
-rw-r--r--mail/em-format.c1513
-rw-r--r--mail/em-format.h328
-rw-r--r--mail/em-html-stream.c176
-rw-r--r--mail/em-html-stream.h66
-rw-r--r--mail/em-icon-stream.c262
-rw-r--r--mail/em-icon-stream.h65
-rw-r--r--mail/em-inline-filter.c380
-rw-r--r--mail/em-inline-filter.h64
-rw-r--r--mail/em-junk-filter.c771
-rw-r--r--mail/em-junk-filter.h30
-rw-r--r--mail/em-junk-plugin.c24
-rw-r--r--mail/em-junk-plugin.h46
-rw-r--r--mail/em-mailer-prefs.c1141
-rw-r--r--mail/em-mailer-prefs.h148
-rw-r--r--mail/em-marshal.list6
-rw-r--r--mail/em-menu.c369
-rw-r--r--mail/em-menu.h124
-rw-r--r--mail/em-message-browser.c294
-rw-r--r--mail/em-message-browser.h30
-rw-r--r--mail/em-migrate.c2728
-rw-r--r--mail/em-migrate.h40
-rw-r--r--mail/em-popup.c837
-rw-r--r--mail/em-popup.h290
-rw-r--r--mail/em-search-context.c112
-rw-r--r--mail/em-search-context.h51
-rw-r--r--mail/em-stripsig-filter.c169
-rw-r--r--mail/em-stripsig-filter.h64
-rw-r--r--mail/em-subscribe-editor.c932
-rw-r--r--mail/em-subscribe-editor.h9
-rw-r--r--mail/em-sync-stream.c337
-rw-r--r--mail/em-sync-stream.h69
-rw-r--r--mail/em-utils.c1953
-rw-r--r--mail/em-utils.h110
-rw-r--r--mail/em-vfolder-context.c113
-rw-r--r--mail/em-vfolder-context.h50
-rw-r--r--mail/em-vfolder-editor.c123
-rw-r--r--mail/em-vfolder-editor.h51
-rw-r--r--mail/em-vfolder-rule.c645
-rw-r--r--mail/em-vfolder-rule.h67
-rw-r--r--mail/em-vfs-stream.c323
-rw-r--r--mail/em-vfs-stream.h60
-rw-r--r--mail/evolution-mail.schemas.in.in831
-rw-r--r--mail/filtertypes.xml753
-rw-r--r--mail/importers/.cvsignore15
-rw-r--r--mail/importers/GNOME_Evolution_Mail_Importers.server.in.in66
-rw-r--r--mail/importers/Makefile.am43
-rw-r--r--mail/importers/elm-importer.c453
-rw-r--r--mail/importers/evolution-mbox-importer.c257
-rw-r--r--mail/importers/evolution-outlook-importer.c455
-rw-r--r--mail/importers/mail-importer.c455
-rw-r--r--mail/importers/mail-importer.h89
-rw-r--r--mail/importers/mozilla-status-headers.h29
-rw-r--r--mail/importers/netscape-importer.c1950
-rw-r--r--mail/importers/pine-importer.c515
-rw-r--r--mail/mail-autofilter.c406
-rw-r--r--mail/mail-autofilter.h50
-rw-r--r--mail/mail-component-factory.c118
-rw-r--r--mail/mail-component.c1160
-rw-r--r--mail/mail-component.h99
-rw-r--r--mail/mail-config-factory.c60
-rw-r--r--mail/mail-config-factory.h45
-rw-r--r--mail/mail-config.c1083
-rw-r--r--mail/mail-config.glade8138
-rw-r--r--mail/mail-config.h172
-rw-r--r--mail/mail-crypto.c53
-rw-r--r--mail/mail-crypto.h40
-rw-r--r--mail/mail-dialogs.glade1671
-rw-r--r--mail/mail-errors.xml344
-rw-r--r--mail/mail-errors.xml.h256
-rw-r--r--mail/mail-folder-cache.c1017
-rw-r--r--mail/mail-folder-cache.h51
-rw-r--r--mail/mail-mt.c1040
-rw-r--r--mail/mail-mt.h132
-rw-r--r--mail/mail-offline-handler.c270
-rw-r--r--mail/mail-offline-handler.h65
-rw-r--r--mail/mail-ops.c2361
-rw-r--r--mail/mail-ops.h164
-rw-r--r--mail/mail-send-recv.c995
-rw-r--r--mail/mail-send-recv.h45
-rw-r--r--mail/mail-session.c705
-rw-r--r--mail/mail-session.h58
-rw-r--r--mail/mail-signature-editor.c437
-rw-r--r--mail/mail-signature-editor.h41
-rw-r--r--mail/mail-tools.c432
-rw-r--r--mail/mail-tools.h72
-rw-r--r--mail/mail-types.h40
-rw-r--r--mail/mail-vfolder.c1152
-rw-r--r--mail/mail-vfolder.h34
-rw-r--r--mail/message-list.c3737
-rw-r--r--mail/message-list.etspec35
-rw-r--r--mail/message-list.h228
-rw-r--r--mail/message-tag-editor.c128
-rw-r--r--mail/message-tag-editor.h73
-rw-r--r--mail/message-tag-followup.c379
-rw-r--r--mail/message-tag-followup.h78
-rw-r--r--mail/message-tags.glade344
-rw-r--r--mail/searchtypes.xml514
-rw-r--r--mail/vfoldertypes.xml431
-rw-r--r--marshal.mk7
-rw-r--r--plugin.mk2
-rw-r--r--plugins/.cvsignore4
-rw-r--r--plugins/Makefile.am2
-rw-r--r--plugins/addressbook-file/ChangeLog3
-rw-r--r--plugins/addressbook-file/Makefile.am16
-rw-r--r--plugins/addressbook-file/addressbook-file.c56
-rw-r--r--plugins/addressbook-file/org-gnome-addressbook-file.eplug.in19
-rw-r--r--plugins/addressbook-groupwise/ChangeLog3
-rw-r--r--plugins/addressbook-groupwise/Makefile.am16
-rw-r--r--plugins/addressbook-groupwise/addressbook-groupwise.c75
-rw-r--r--plugins/addressbook-groupwise/org-gnome-addressbook-groupwise.eplug.in21
-rw-r--r--plugins/audio-inline/.cvsignore5
-rw-r--r--plugins/audio-inline/ChangeLog34
-rw-r--r--plugins/audio-inline/Makefile.am15
-rw-r--r--plugins/audio-inline/audio-inline.c306
-rw-r--r--plugins/audio-inline/org-gnome-audio-inline.eplug.in30
-rw-r--r--plugins/backup-restore/.cvsignore6
-rw-r--r--plugins/backup-restore/ChangeLog4
-rw-r--r--plugins/backup-restore/Makefile.am26
-rw-r--r--plugins/backup-restore/backup-restore.c122
-rw-r--r--plugins/backup-restore/backup.c153
-rw-r--r--plugins/backup-restore/org-gnome-backup-restore.eplug.in33
-rw-r--r--plugins/backup-restore/org-gnome-backup-restore.xml21
-rw-r--r--plugins/bbdb/.cvsignore4
-rw-r--r--plugins/bbdb/ChangeLog77
-rw-r--r--plugins/bbdb/Makefile.am14
-rw-r--r--plugins/bbdb/bbdb.c467
-rw-r--r--plugins/bbdb/bbdb.h22
-rw-r--r--plugins/bbdb/gaimbuddies.c439
-rw-r--r--plugins/bbdb/org-gnome-evolution-bbdb.eplug.in27
-rw-r--r--plugins/bbdb/test-evobuddy.c15
-rw-r--r--plugins/calendar-file/.cvsignore5
-rw-r--r--plugins/calendar-file/ChangeLog3
-rw-r--r--plugins/calendar-file/Makefile.am16
-rw-r--r--plugins/calendar-file/calendar-file.c57
-rw-r--r--plugins/calendar-file/org-gnome-calendar-file.eplug.in19
-rw-r--r--plugins/calendar-http/.cvsignore5
-rw-r--r--plugins/calendar-http/ChangeLog29
-rw-r--r--plugins/calendar-http/Makefile.am16
-rw-r--r--plugins/calendar-http/calendar-http.c314
-rw-r--r--plugins/calendar-http/org-gnome-calendar-http.eplug.in24
-rw-r--r--plugins/calendar-weather/.cvsignore5
-rw-r--r--plugins/calendar-weather/ChangeLog46
-rw-r--r--plugins/calendar-weather/Makefile.am33
-rw-r--r--plugins/calendar-weather/calendar-weather.c698
-rw-r--r--plugins/calendar-weather/category_weather_cloudy_16.pngbin597 -> 0 bytes
-rw-r--r--plugins/calendar-weather/category_weather_fog_16.pngbin217 -> 0 bytes
-rw-r--r--plugins/calendar-weather/category_weather_partly_cloudy_16.pngbin760 -> 0 bytes
-rw-r--r--plugins/calendar-weather/category_weather_rain_16.pngbin647 -> 0 bytes
-rw-r--r--plugins/calendar-weather/category_weather_snow_16.pngbin624 -> 0 bytes
-rw-r--r--plugins/calendar-weather/category_weather_sun_16.pngbin420 -> 0 bytes
-rw-r--r--plugins/calendar-weather/category_weather_tstorm_16.pngbin728 -> 0 bytes
-rw-r--r--plugins/calendar-weather/org-gnome-calendar-weather.eplug.in33
-rw-r--r--plugins/copy-tool/.cvsignore5
-rw-r--r--plugins/copy-tool/ChangeLog21
-rw-r--r--plugins/copy-tool/Makefile.am13
-rw-r--r--plugins/copy-tool/copy-tool.c100
-rw-r--r--plugins/copy-tool/org-gnome-copy-tool.eplug.in24
-rw-r--r--plugins/default-source/ChangeLog3
-rw-r--r--plugins/default-source/Makefile.am17
-rw-r--r--plugins/default-source/default-source.c123
-rw-r--r--plugins/default-source/org-gnome-default-source.eplug.in34
-rw-r--r--plugins/exchange-account-setup/ChangeLog150
-rw-r--r--plugins/exchange-account-setup/Makefile.am22
-rw-r--r--plugins/exchange-account-setup/exchange-account-setup.c356
-rw-r--r--plugins/exchange-account-setup/exchange-ask-password.c357
-rw-r--r--plugins/exchange-account-setup/org-gnome-exchange-account-setup.eplug.in36
-rw-r--r--plugins/folder-unsubscribe/.cvsignore3
-rw-r--r--plugins/folder-unsubscribe/ChangeLog8
-rw-r--r--plugins/folder-unsubscribe/Makefile.am13
-rw-r--r--plugins/folder-unsubscribe/folder-unsubscribe.c112
-rw-r--r--plugins/folder-unsubscribe/org-gnome-mail-folder-unsubscribe.eplug.in16
-rw-r--r--plugins/groupwise-account-setup/ChangeLog44
-rw-r--r--plugins/groupwise-account-setup/Makefile.am23
-rw-r--r--plugins/groupwise-account-setup/camel-gw-listener.c898
-rw-r--r--plugins/groupwise-account-setup/camel-gw-listener.h63
-rw-r--r--plugins/groupwise-account-setup/groupwise-account-setup.c67
-rw-r--r--plugins/groupwise-account-setup/org-gnome-gw-account-setup.eplug.in26
-rwxr-xr-xplugins/groupwise-send-options/ChangeLog13
-rw-r--r--plugins/groupwise-send-options/Makefile.am15
-rw-r--r--plugins/groupwise-send-options/org-gnome-compose-send-options.eplug.in25
-rw-r--r--plugins/groupwise-send-options/org-gnome-compose-send-options.xml17
-rw-r--r--plugins/groupwise-send-options/send-options.c144
-rw-r--r--plugins/groupwise-send-options/send-options.h40
-rw-r--r--plugins/groupwise-status-tracking/Changelog3
-rw-r--r--plugins/groupwise-status-tracking/Makefile.am15
-rw-r--r--plugins/groupwise-status-tracking/org-gnome-status-track.eplug.in25
-rw-r--r--plugins/groupwise-status-tracking/status-track.c237
-rw-r--r--plugins/itip-formatter/.cvsignore6
-rw-r--r--plugins/itip-formatter/ChangeLog339
-rw-r--r--plugins/itip-formatter/Makefile.am23
-rw-r--r--plugins/itip-formatter/itip-formatter.c1732
-rw-r--r--plugins/itip-formatter/itip-view.c1784
-rw-r--r--plugins/itip-formatter/itip-view.h164
-rw-r--r--plugins/itip-formatter/org-gnome-itip-formatter-errors.xml8
-rw-r--r--plugins/itip-formatter/org-gnome-itip-formatter.eplug.in20
-rw-r--r--plugins/mail-to-meeting/.cvsignore5
-rw-r--r--plugins/mail-to-meeting/ChangeLog21
-rw-r--r--plugins/mail-to-meeting/Makefile.am13
-rw-r--r--plugins/mail-to-meeting/mail-to-meeting.c179
-rw-r--r--plugins/mail-to-meeting/org-gnome-mail-to-meeting.eplug.in25
-rw-r--r--plugins/mail-to-task/.cvsignore5
-rw-r--r--plugins/mail-to-task/ChangeLog45
-rw-r--r--plugins/mail-to-task/Makefile.am13
-rw-r--r--plugins/mail-to-task/mail-to-task.c190
-rw-r--r--plugins/mail-to-task/org-gnome-mail-to-task.eplug.in25
-rw-r--r--plugins/mailing-list-actions/.cvsignore5
-rw-r--r--plugins/mailing-list-actions/ChangeLog34
-rw-r--r--plugins/mailing-list-actions/Makefile.am24
-rw-r--r--plugins/mailing-list-actions/mailing-list-actions.c217
-rw-r--r--plugins/mailing-list-actions/org-gnome-mailing-list-actions-errors.xml38
-rw-r--r--plugins/mailing-list-actions/org-gnome-mailing-list-actions-errors.xml.h28
-rw-r--r--plugins/mailing-list-actions/org-gnome-mailing-list-actions.eplug.in43
-rw-r--r--plugins/mailing-list-actions/org-gnome-mailing-list-actions.xml23
-rw-r--r--plugins/mark-calendar-offline/.cvsignore3
-rw-r--r--plugins/mark-calendar-offline/ChangeLog10
-rw-r--r--plugins/mark-calendar-offline/Makefile.am13
-rw-r--r--plugins/mark-calendar-offline/mark-calendar-offline.c54
-rw-r--r--plugins/mark-calendar-offline/org-gnome-mark-calendar-offline.eplug.in16
-rw-r--r--plugins/new-mail-notify/ChangeLog42
-rw-r--r--plugins/new-mail-notify/Makefile.am18
-rw-r--r--plugins/new-mail-notify/new-mail-notify.c143
-rw-r--r--plugins/new-mail-notify/org-gnome-new-mail-notify.eplug.in33
-rw-r--r--plugins/plugin-manager/.cvsignore5
-rw-r--r--plugins/plugin-manager/ChangeLog12
-rw-r--r--plugins/plugin-manager/Makefile.am15
-rw-r--r--plugins/plugin-manager/org-gnome-plugin-manager.eplug.in22
-rw-r--r--plugins/plugin-manager/org-gnome-plugin-manager.xml13
-rw-r--r--plugins/plugin-manager/plugin-manager.c289
-rw-r--r--plugins/prefer-plain/.cvsignore5
-rw-r--r--plugins/prefer-plain/ChangeLog13
-rw-r--r--plugins/prefer-plain/Makefile.am13
-rw-r--r--plugins/prefer-plain/org-gnome-prefer-plain.eplug.in33
-rw-r--r--plugins/prefer-plain/prefer-plain.c191
-rw-r--r--plugins/save-attachments/.cvsignore5
-rw-r--r--plugins/save-attachments/ChangeLog20
-rw-r--r--plugins/save-attachments/Makefile.am15
-rw-r--r--plugins/save-attachments/org-gnome-save-attachments.eplug.in23
-rw-r--r--plugins/save-attachments/org-gnome-save-attachments.xml19
-rw-r--r--plugins/save-attachments/save-attachments.c403
-rw-r--r--plugins/save-calendar/.cvsignore5
-rw-r--r--plugins/save-calendar/ChangeLog51
-rw-r--r--plugins/save-calendar/Makefile.am19
-rw-r--r--plugins/save-calendar/csv-format.c576
-rw-r--r--plugins/save-calendar/format-handler.h49
-rw-r--r--plugins/save-calendar/ical-format.c127
-rw-r--r--plugins/save-calendar/org-gnome-save-calendar.eplug.in14
-rw-r--r--plugins/save-calendar/rdf-format.c396
-rw-r--r--plugins/save-calendar/save-calendar.c260
-rw-r--r--plugins/select-one-source/.cvsignore5
-rw-r--r--plugins/select-one-source/ChangeLog10
-rw-r--r--plugins/select-one-source/Makefile.am13
-rw-r--r--plugins/select-one-source/mark-calendar-offline.c54
-rw-r--r--plugins/select-one-source/org-gnome-select-one-source.eplug.in14
-rw-r--r--plugins/select-one-source/select-one-source.c52
-rw-r--r--plugins/send-options/ChangeLog43
-rw-r--r--plugins/send-options/Makefile.am19
-rw-r--r--plugins/send-options/org-gnome-send-options.eplug.in14
-rw-r--r--plugins/send-options/send-options.c546
-rw-r--r--plugins/shared-folder/ChangeLog93
-rw-r--r--plugins/shared-folder/Makefile.am32
-rw-r--r--plugins/shared-folder/install-shared.c221
-rw-r--r--plugins/shared-folder/org-gnome-shared-folder-errors.xml19
-rw-r--r--plugins/shared-folder/org-gnome-shared-folder-errors.xml.h11
-rw-r--r--plugins/shared-folder/org-gnome-shared-folder.eplug.in41
-rw-r--r--plugins/shared-folder/properties.glade860
-rw-r--r--plugins/shared-folder/share-folder-common.c468
-rw-r--r--plugins/shared-folder/share-folder.c742
-rw-r--r--plugins/shared-folder/share-folder.h120
-rw-r--r--plugins/subject-thread/.cvsignore5
-rw-r--r--plugins/subject-thread/ChangeLog18
-rw-r--r--plugins/subject-thread/Makefile.am13
-rw-r--r--plugins/subject-thread/org-gnome-subject-thread.eplug.in11
-rw-r--r--plugins/subject-thread/subject-thread.c67
-rw-r--r--po/.cvsignore20
-rw-r--r--po/ChangeLog3059
-rw-r--r--po/ChangeLog.pre-1-44726
-rw-r--r--po/POTFILES.in360
-rw-r--r--po/POTFILES.skip10
-rw-r--r--po/am.po20389
-rw-r--r--po/ar.po21253
-rw-r--r--po/az.po19981
-rw-r--r--po/be.po19348
-rw-r--r--po/bg.po17613
-rw-r--r--po/bs.po19090
-rw-r--r--po/ca.po23532
-rw-r--r--po/cs.po20851
-rw-r--r--po/cy.po18998
-rw-r--r--po/da.po30792
-rw-r--r--po/de.po20594
-rw-r--r--po/el.po18067
-rw-r--r--po/en_AU.po19985
-rw-r--r--po/en_CA.po17489
-rw-r--r--po/en_GB.po19238
-rw-r--r--po/es.po32054
-rw-r--r--po/et.po20233
-rw-r--r--po/eu.po31138
-rw-r--r--po/fa.po19277
-rw-r--r--po/fi.po20150
-rw-r--r--po/fr.po19833
-rwxr-xr-xpo/ga.po21232
-rw-r--r--po/gl.po31151
-rw-r--r--po/gu.po19372
-rw-r--r--po/he.po18985
-rw-r--r--po/hi.po19165
-rw-r--r--po/hr.po21165
-rw-r--r--po/hu.po19601
-rw-r--r--po/is.po19130
-rw-r--r--po/it.po18157
-rw-r--r--po/ja.po17707
-rw-r--r--po/ko.po19593
-rw-r--r--po/lt.po17832
-rw-r--r--po/lv.po33188
-rwxr-xr-xpo/mk.po28228
-rw-r--r--po/ml.po27397
-rwxr-xr-xpo/mn.po19991
-rw-r--r--po/ms.po19903
-rw-r--r--po/nb.po21204
-rw-r--r--po/nl.po19807
-rw-r--r--po/nn.po19513
-rw-r--r--po/no.po21204
-rw-r--r--po/pa.po19448
-rw-r--r--po/pl.po20702
-rw-r--r--po/pt.po20601
-rw-r--r--po/pt_BR.po19689
-rw-r--r--po/ro.po20267
-rw-r--r--po/ru.po17799
-rw-r--r--po/sk.po18409
-rw-r--r--po/sl.po28713
-rw-r--r--po/sq.po19561
-rw-r--r--po/sr.po22633
-rw-r--r--po/sr@Latn.po22633
-rw-r--r--po/sv.po36192
-rw-r--r--po/ta.po19341
-rw-r--r--po/tr.po19438
-rw-r--r--po/uk.po19546
-rw-r--r--po/vi.po31785
-rw-r--r--po/wa.po20078
-rw-r--r--po/zh_CN.po17482
-rw-r--r--po/zh_TW.po37767
-rw-r--r--server.mk11
-rw-r--r--shell/.cvsignore25
-rw-r--r--shell/ChangeLog2212
-rw-r--r--shell/ChangeLog.pre-1-415363
-rw-r--r--shell/Evolution-Component.idl100
-rw-r--r--shell/Evolution-ConfigControl.idl21
-rw-r--r--shell/Evolution-Offline.idl53
-rw-r--r--shell/Evolution-Shell.idl53
-rw-r--r--shell/Evolution-Wizard.idl42
-rw-r--r--shell/Evolution-common.idl23
-rw-r--r--shell/Evolution.idl19
-rw-r--r--shell/GNOME_Evolution_Shell.server.in.in24
-rw-r--r--shell/GNOME_Evolution_Test.server.in.in39
-rw-r--r--shell/Makefile.am276
-rw-r--r--shell/apps_evolution_shell.schemas.in.in172
-rw-r--r--shell/e-active-connection-dialog.glade193
-rw-r--r--shell/e-component-registry.c348
-rw-r--r--shell/e-component-registry.h105
-rw-r--r--shell/e-config-upgrade.c159
-rw-r--r--shell/e-config-upgrade.h28
-rw-r--r--shell/e-corba-config-page.c158
-rw-r--r--shell/e-corba-config-page.h68
-rw-r--r--shell/e-history.c256
-rw-r--r--shell/e-history.h83
-rw-r--r--shell/e-shell-constants.h50
-rw-r--r--shell/e-shell-corba-icon-utils.c208
-rw-r--r--shell/e-shell-corba-icon-utils.h40
-rw-r--r--shell/e-shell-folder-title-bar.c741
-rw-r--r--shell/e-shell-folder-title-bar.h84
-rw-r--r--shell/e-shell-importer.c1309
-rw-r--r--shell/e-shell-importer.h28
-rw-r--r--shell/e-shell-marshal.list30
-rw-r--r--shell/e-shell-offline-handler.c862
-rw-r--r--shell/e-shell-offline-handler.h82
-rw-r--r--shell/e-shell-settings-dialog.c362
-rw-r--r--shell/e-shell-settings-dialog.h65
-rw-r--r--shell/e-shell-startup-wizard.c893
-rw-r--r--shell/e-shell-startup-wizard.h30
-rw-r--r--shell/e-shell-utils.c149
-rw-r--r--shell/e-shell-utils.h34
-rw-r--r--shell/e-shell-window-commands.c859
-rw-r--r--shell/e-shell-window-commands.h30
-rw-r--r--shell/e-shell-window.c1024
-rw-r--r--shell/e-shell-window.h73
-rw-r--r--shell/e-shell.c1359
-rw-r--r--shell/e-shell.h141
-rw-r--r--shell/e-sidebar.c674
-rw-r--r--shell/e-sidebar.h80
-rw-r--r--shell/e-user-creatable-items-handler.c867
-rw-r--r--shell/e-user-creatable-items-handler.h70
-rw-r--r--shell/es-event.c193
-rw-r--r--shell/es-event.h95
-rw-r--r--shell/es-menu.c188
-rw-r--r--shell/es-menu.h96
-rw-r--r--shell/evolution-config-control.c179
-rw-r--r--shell/evolution-config-control.h64
-rw-r--r--shell/evolution-nognome.in13
-rw-r--r--shell/evolution-shell-component-utils.c113
-rw-r--r--shell/evolution-shell-component-utils.h51
-rw-r--r--shell/evolution-startup-wizard.glade92
-rw-r--r--shell/evolution-test-component.c214
-rw-r--r--shell/evolution-test-component.h56
-rw-r--r--shell/evolution-wizard.c409
-rw-r--r--shell/evolution-wizard.h83
-rw-r--r--shell/importer/.cvsignore10
-rw-r--r--shell/importer/GNOME_Evolution_Importer.idl97
-rw-r--r--shell/importer/Makefile.am66
-rw-r--r--shell/importer/evolution-importer-client.c266
-rw-r--r--shell/importer/evolution-importer-client.h74
-rw-r--r--shell/importer/evolution-importer-listener.c224
-rw-r--r--shell/importer/evolution-importer-listener.h71
-rw-r--r--shell/importer/evolution-importer.c249
-rw-r--r--shell/importer/evolution-importer.h100
-rw-r--r--shell/importer/evolution-intelligent-importer.c197
-rw-r--r--shell/importer/evolution-intelligent-importer.h74
-rw-r--r--shell/importer/import.glade124
-rw-r--r--shell/importer/intelligent.c489
-rw-r--r--shell/importer/intelligent.h28
-rw-r--r--shell/main.c621
-rw-r--r--shell/shell-errors.xml70
-rw-r--r--shell/shell-errors.xml.h55
-rw-r--r--smime/.cvsignore2
-rw-r--r--smime/ChangeLog594
-rw-r--r--smime/Makefile.am1
-rw-r--r--smime/gui/.cvsignore3
-rw-r--r--smime/gui/Makefile.am44
-rw-r--r--smime/gui/ca-trust-dialog.c128
-rw-r--r--smime/gui/ca-trust-dialog.h34
-rw-r--r--smime/gui/cert-trust-dialog.c153
-rw-r--r--smime/gui/cert-trust-dialog.h32
-rw-r--r--smime/gui/certificate-manager.c1010
-rw-r--r--smime/gui/certificate-manager.h30
-rw-r--r--smime/gui/certificate-viewer.c348
-rw-r--r--smime/gui/certificate-viewer.h31
-rw-r--r--smime/gui/component.c118
-rw-r--r--smime/gui/component.h28
-rw-r--r--smime/gui/e-cert-selector.c252
-rw-r--r--smime/gui/e-cert-selector.h67
-rw-r--r--smime/gui/smime-ui.glade2303
-rw-r--r--smime/lib/.cvsignore4
-rw-r--r--smime/lib/Makefile.am37
-rw-r--r--smime/lib/e-asn1-object.c398
-rw-r--r--smime/lib/e-asn1-object.h105
-rw-r--r--smime/lib/e-cert-db.c1230
-rw-r--r--smime/lib/e-cert-db.h139
-rw-r--r--smime/lib/e-cert-trust.c423
-rw-r--r--smime/lib/e-cert-trust.h86
-rw-r--r--smime/lib/e-cert.c1284
-rw-r--r--smime/lib/e-cert.h105
-rw-r--r--smime/lib/e-pkcs12.c426
-rw-r--r--smime/lib/e-pkcs12.h71
-rw-r--r--smime/lib/smime-marshal.list3
-rw-r--r--smime/tests/.cvsignore3
-rw-r--r--smime/tests/Makefile.am17
-rw-r--r--smime/tests/import-cert.c38
-rw-r--r--sounds/.cvsignore2
-rw-r--r--sounds/Makefile.am5
-rw-r--r--sounds/default_alarm.wavbin8624 -> 0 bytes
-rw-r--r--stamp.h.in1
-rw-r--r--tools/.cvsignore11
-rw-r--r--tools/Makefile.am38
-rw-r--r--tools/evolution-launch-composer.c357
-rw-r--r--tools/killev.c221
-rwxr-xr-xtools/verify-evolution-install.sh640
-rw-r--r--ui/.cvsignore8
-rw-r--r--ui/ChangeLog405
-rw-r--r--ui/ChangeLog.pre-1-41894
-rw-r--r--ui/Makefile.am20
-rw-r--r--ui/evolution-addressbook.xml147
-rw-r--r--ui/evolution-calendar.xml104
-rw-r--r--ui/evolution-composer-entries.xml33
-rw-r--r--ui/evolution-executive-summary.xml12
-rw-r--r--ui/evolution-mail-global.xml110
-rw-r--r--ui/evolution-mail-list.xml117
-rw-r--r--ui/evolution-mail-message.xml440
-rw-r--r--ui/evolution-mail-messagedisplay.xml53
-rw-r--r--ui/evolution-message-composer.xml164
-rw-r--r--ui/evolution-signature-editor.xml73
-rw-r--r--ui/evolution-subscribe.xml57
-rw-r--r--ui/evolution-tasks.xml69
-rw-r--r--ui/evolution.xml160
-rw-r--r--views/.cvsignore2
-rw-r--r--views/ChangeLog43
-rw-r--r--views/ChangeLog.pre-1-4109
-rw-r--r--views/Makefile.am3
-rw-r--r--views/addressbook/.cvsignore2
-rw-r--r--views/addressbook/Address_Cards.galview2
-rw-r--r--views/addressbook/By_Company.galview12
-rw-r--r--views/addressbook/Makefile.am3
-rw-r--r--views/addressbook/Phone_List.galview13
-rw-r--r--views/addressbook/galview.xml6
-rw-r--r--views/calendar/.cvsignore2
-rw-r--r--views/calendar/List_View.galview7
-rw-r--r--views/calendar/Makefile.am5
-rw-r--r--views/calendar/galview.xml13
-rw-r--r--views/mail/.cvsignore2
-rw-r--r--views/mail/As_Sent_Folder.galview10
-rw-r--r--views/mail/By_Follow_Up_Flag.galview14
-rw-r--r--views/mail/By_Sender.galview12
-rw-r--r--views/mail/By_Status.galview12
-rw-r--r--views/mail/By_Subject.galview12
-rw-r--r--views/mail/Makefile.am3
-rw-r--r--views/mail/Messages.galview10
-rw-r--r--views/mail/galview.xml9
-rw-r--r--views/tasks/.cvsignore2
-rw-r--r--views/tasks/Makefile.am3
-rw-r--r--views/tasks/Tasks.galview7
-rw-r--r--views/tasks/With_DueDate.galview8
-rw-r--r--views/tasks/With_Status.galview8
-rw-r--r--views/tasks/galview.xml6
-rw-r--r--widgets/.cvsignore9
-rw-r--r--widgets/ChangeLog88
-rw-r--r--widgets/ChangeLog.pre-1-4506
-rw-r--r--widgets/LICENSE1
-rw-r--r--widgets/Makefile.am8
-rw-r--r--widgets/e-timezone-dialog/.cvsignore7
-rw-r--r--widgets/e-timezone-dialog/Makefile.am16
-rw-r--r--widgets/e-timezone-dialog/e-timezone-dialog.c672
-rw-r--r--widgets/e-timezone-dialog/e-timezone-dialog.glade365
-rw-r--r--widgets/e-timezone-dialog/e-timezone-dialog.h68
-rw-r--r--widgets/menus/.cvsignore8
-rw-r--r--widgets/menus/Makefile.am11
-rw-r--r--widgets/menus/gal-view-menus.c527
-rw-r--r--widgets/menus/gal-view-menus.h44
-rw-r--r--widgets/misc/.cvsignore20
-rw-r--r--widgets/misc/ChangeLog1018
-rw-r--r--widgets/misc/ChangeLog.pre-1-41903
-rw-r--r--widgets/misc/Makefile.am180
-rw-r--r--widgets/misc/e-activity-handler.c410
-rw-r--r--widgets/misc/e-activity-handler.h88
-rw-r--r--widgets/misc/e-calendar-item.c3288
-rw-r--r--widgets/misc/e-calendar-item.h379
-rw-r--r--widgets/misc/e-calendar.c662
-rw-r--r--widgets/misc/e-calendar.h102
-rw-r--r--widgets/misc/e-cell-date-edit.c973
-rw-r--r--widgets/misc/e-cell-date-edit.h106
-rw-r--r--widgets/misc/e-cell-percent.c152
-rw-r--r--widgets/misc/e-cell-percent.h51
-rw-r--r--widgets/misc/e-cell-renderer-combo.c178
-rw-r--r--widgets/misc/e-cell-renderer-combo.h58
-rw-r--r--widgets/misc/e-charset-picker.c594
-rw-r--r--widgets/misc/e-charset-picker.h48
-rw-r--r--widgets/misc/e-clipped-label.c417
-rw-r--r--widgets/misc/e-clipped-label.h102
-rw-r--r--widgets/misc/e-combo-button.c554
-rw-r--r--widgets/misc/e-combo-button.h84
-rw-r--r--widgets/misc/e-combo-cell-editable.c440
-rw-r--r--widgets/misc/e-combo-cell-editable.h67
-rw-r--r--widgets/misc/e-config-page.c53
-rw-r--r--widgets/misc/e-config-page.h67
-rw-r--r--widgets/misc/e-dateedit.c2013
-rw-r--r--widgets/misc/e-dateedit.h180
-rw-r--r--widgets/misc/e-dropdown-button.c240
-rw-r--r--widgets/misc/e-dropdown-button.h71
-rw-r--r--widgets/misc/e-error.c628
-rw-r--r--widgets/misc/e-error.h57
-rw-r--r--widgets/misc/e-expander.c1349
-rw-r--r--widgets/misc/e-expander.h82
-rw-r--r--widgets/misc/e-filter-bar.c897
-rw-r--r--widgets/misc/e-filter-bar.h119
-rw-r--r--widgets/misc/e-image-chooser.c532
-rw-r--r--widgets/misc/e-image-chooser.h64
-rw-r--r--widgets/misc/e-info-label.c170
-rw-r--r--widgets/misc/e-info-label.h57
-rw-r--r--widgets/misc/e-map.c1794
-rw-r--r--widgets/misc/e-map.h138
-rw-r--r--widgets/misc/e-multi-config-dialog.c447
-rw-r--r--widgets/misc/e-multi-config-dialog.h77
-rw-r--r--widgets/misc/e-pilot-settings.c198
-rw-r--r--widgets/misc/e-pilot-settings.h72
-rw-r--r--widgets/misc/e-search-bar.c1256
-rw-r--r--widgets/misc/e-search-bar.h151
-rw-r--r--widgets/misc/e-send-options.c776
-rw-r--r--widgets/misc/e-send-options.glade1189
-rw-r--r--widgets/misc/e-send-options.h115
-rw-r--r--widgets/misc/e-system-errors.xml22
-rw-r--r--widgets/misc/e-system-errors.xml.h15
-rw-r--r--widgets/misc/e-task-bar.c223
-rw-r--r--widgets/misc/e-task-bar.h77
-rw-r--r--widgets/misc/e-task-widget.c246
-rw-r--r--widgets/misc/e-task-widget.h78
-rw-r--r--widgets/misc/e-url-entry.c194
-rw-r--r--widgets/misc/e-url-entry.h69
-rw-r--r--widgets/misc/e-util-marshal.list4
-rw-r--r--widgets/misc/test-calendar.c146
-rw-r--r--widgets/misc/test-charset-picker.c18
-rw-r--r--widgets/misc/test-dateedit.c285
-rw-r--r--widgets/misc/test-dropdown-button.c103
-rw-r--r--widgets/misc/test-error.c64
-rw-r--r--widgets/misc/test-info-label.c81
-rw-r--r--widgets/misc/test-multi-config-dialog.c94
-rw-r--r--widgets/table/e-table-example-1.c308
1583 files changed, 0 insertions, 1908208 deletions
diff --git a/.cvsignore b/.cvsignore
deleted file mode 100644
index ba126eeb2d..0000000000
--- a/.cvsignore
+++ /dev/null
@@ -1,30 +0,0 @@
-ABOUT-NLS
-Makefile
-Makefile.in
-autom4te*.cache
-aclocal.m4
-config.cache
-config.guess
-config.h
-config.h.in
-config.log
-config.rpath
-config.status
-config.sub
-configure
-depcomp
-install-sh
-intl
-libtool
-ltconfig
-ltmain.sh
-m4
-missing
-mkinstalldirs
-stamp-h*
-stamp.h
-xml-i18n-*
-xlibtool
-xltmain.sh
-intltool-*
-*.pc
diff --git a/AUTHORS b/AUTHORS
deleted file mode 100644
index 75e6a26764..0000000000
--- a/AUTHORS
+++ /dev/null
@@ -1,85 +0,0 @@
-Evolution was written by:
-
-Addressbook
- Arturo Esponosa <arturo@nuclecu.unam.mx> (Original Gnomecard author)
- Nat Friedman <nat@ximian.com>
- Chris Lahey <clahey@ximian.com>
- Chris Toshok <toshok@ximian.com>
- Jon Trowbridge <trow@ximian.com>
-
-Artwork
- Tuomas Kuosmanen <tigert@ximian.com>
- Jakub Steiner <jimmac@ximian.com>
-
-Calendar
- Seth Alves <seth@ximian.com>
- Eric Busboom <eric@softwarestudio.org> (libical author)
- Arturo Esponosa <arturo@nuclecu.unam.mx> (Gnomecal contributor)
- Damon Chaplin <damon@ximian.com>
- Federico Mena-Quintero <federico@ximian.com>
- Rodrigo Moya <rodrigo@ximian.com>
- Jesse Pavel <jesse@ximian.com>
- JP Rosevear <jpr@ximian.com>
- Russell Steinthal <rms39@columbia.edu> (Gnomecal maintainer)
-
-Documentation
- Kevin Breit <mrproper@ximian.com>
- Aaron Weber <aaron@ximian.com>
-
-Mailer
- Radek Doulik <rodo@ximian.com>
- Larry Ewing <lewing@ximian.com>
- Bertrand Guiheneuf <bertrand@ximian.com>
- Jason Leach <jleach@ximian.com>
- Matt Loper <matt@ximian.com>
- Ettore Perazzoli <ettore@ximian.com>
- Jeffrey Stedfast <fejj@ximian.com>
- Jon Trowbridge <trow@ximian.com>
- Peter Williams <peterw@ximian.com>
- Dan Winship <danw@ximian.com>
- Michael Zucchi <notzed@ximian.com>
-
-Notes
- Anders Carlsson <andersca@gnu.org>
-
-Pilot
- JP Rosevear <jpr@ximian.com>
-
-Shell
- Miguel de Icaza <miguel@ximian.com>
- Jason Leach <jleach@ximian.com>
- Ettore Perazzoli <ettore@ximian.com>
-
-Translations
- Akira TAGOH <tagoh@gnome.gr.jp>
- Andraz Tori <andraz.tori1@guest.arnes.si>
- Andreas Hyden <a.hyden@cyberpoint.se>
- Arjan Scherpenisse <acscherp@wins.uva.nl>
- Clara Tattoni <clara.tattoni@libero.it>
- Fatih Demir <kabalak@gmx.net>
- Gediminas Paulauskas <menesis@delfi.lt>
- GNOME PL Team <translators@gnome.pl>
- Gustavo Maciel Dias Vieira <gdvieira@zaz.com.br>
- Héctor García Alvarez <hector@scouts-es.org>
- Jesús Bravo Álvarez <jba@pobox.com>
- Keld Simonsen <keld@dkuug.dk>
- Kjartan Maraas <kmaraas@gnome.org>
- Matthias Warkus <mawa@iname.com>
- Spiros Papadimitriou <spapadim+@cs.cmu.edu>
- Sung-Hyun Nam <namsh@kldp.org>
- Szabolcs BAN <shooby@gnome.hu>
- Tiago Antão <tiagoantao@bigfoot.com>
- Duarte Loreto <happyguy_pt@hotmail.com>
- Valek Filippov <frob@df.ru>
- Vincent Renardias <vincent@redhat.com>
- Yuri Syrota <rasta@renome.rovno.ua>
-
-UI
- Anna Dirks <anna@ximian.com>
-
-Widgets
- Damon Chaplin <damon@ximian.com>
- Miguel de Icaza <miguel@ximian.com>
- Chris Lahey <clahey@ximian.com>
- Federico Mena-Quintero <federico@ximian.com>
- Chris Toshok <toshok@ximian.com>
diff --git a/COPYING b/COPYING
deleted file mode 100644
index d60c31a97a..0000000000
--- a/COPYING
+++ /dev/null
@@ -1,340 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) 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
-this service 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 make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. 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.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-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
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the 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 a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE 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.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/COPYING-DOCS b/COPYING-DOCS
deleted file mode 100644
index b42936beb3..0000000000
--- a/COPYING-DOCS
+++ /dev/null
@@ -1,355 +0,0 @@
- GNU Free Documentation License
- Version 1.1, March 2000
-
- Copyright (C) 2000 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-0. PREAMBLE
-
-The purpose of this License is to make a manual, textbook, or other
-written document "free" in the sense of freedom: to assure everyone
-the effective freedom to copy and redistribute it, with or without
-modifying it, either commercially or noncommercially. Secondarily,
-this License preserves for the author and publisher a way to get
-credit for their work, while not being considered responsible for
-modifications made by others.
-
-This License is a kind of "copyleft", which means that derivative
-works of the document must themselves be free in the same sense. It
-complements the GNU General Public License, which is a copyleft
-license designed for free software.
-
-We have designed this License in order to use it for manuals for free
-software, because free software needs free documentation: a free
-program should come with manuals providing the same freedoms that the
-software does. But this License is not limited to software manuals;
-it can be used for any textual work, regardless of subject matter or
-whether it is published as a printed book. We recommend this License
-principally for works whose purpose is instruction or reference.
-
-
-1. APPLICABILITY AND DEFINITIONS
-
-This License applies to any manual or other work that contains a
-notice placed by the copyright holder saying it can be distributed
-under the terms of this License. The "Document", below, refers to any
-such manual or work. Any member of the public is a licensee, and is
-addressed as "you".
-
-A "Modified Version" of the Document means any work containing the
-Document or a portion of it, either copied verbatim, or with
-modifications and/or translated into another language.
-
-A "Secondary Section" is a named appendix or a front-matter section of
-the Document that deals exclusively with the relationship of the
-publishers or authors of the Document to the Document's overall subject
-(or to related matters) and contains nothing that could fall directly
-within that overall subject. (For example, if the Document is in part a
-textbook of mathematics, a Secondary Section may not explain any
-mathematics.) The relationship could be a matter of historical
-connection with the subject or with related matters, or of legal,
-commercial, philosophical, ethical or political position regarding
-them.
-
-The "Invariant Sections" are certain Secondary Sections whose titles
-are designated, as being those of Invariant Sections, in the notice
-that says that the Document is released under this License.
-
-The "Cover Texts" are certain short passages of text that are listed,
-as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-the Document is released under this License.
-
-A "Transparent" copy of the Document means a machine-readable copy,
-represented in a format whose specification is available to the
-general public, whose contents can be viewed and edited directly and
-straightforwardly with generic text editors or (for images composed of
-pixels) generic paint programs or (for drawings) some widely available
-drawing editor, and that is suitable for input to text formatters or
-for automatic translation to a variety of formats suitable for input
-to text formatters. A copy made in an otherwise Transparent file
-format whose markup has been designed to thwart or discourage
-subsequent modification by readers is not Transparent. A copy that is
-not "Transparent" is called "Opaque".
-
-Examples of suitable formats for Transparent copies include plain
-ASCII without markup, Texinfo input format, LaTeX input format, SGML
-or XML using a publicly available DTD, and standard-conforming simple
-HTML designed for human modification. Opaque formats include
-PostScript, PDF, proprietary formats that can be read and edited only
-by proprietary word processors, SGML or XML for which the DTD and/or
-processing tools are not generally available, and the
-machine-generated HTML produced by some word processors for output
-purposes only.
-
-The "Title Page" means, for a printed book, the title page itself,
-plus such following pages as are needed to hold, legibly, the material
-this License requires to appear in the title page. For works in
-formats which do not have any title page as such, "Title Page" means
-the text near the most prominent appearance of the work's title,
-preceding the beginning of the body of the text.
-
-
-2. VERBATIM COPYING
-
-You may copy and distribute the Document in any medium, either
-commercially or noncommercially, provided that this License, the
-copyright notices, and the license notice saying this License applies
-to the Document are reproduced in all copies, and that you add no other
-conditions whatsoever to those of this License. You may not use
-technical measures to obstruct or control the reading or further
-copying of the copies you make or distribute. However, you may accept
-compensation in exchange for copies. If you distribute a large enough
-number of copies you must also follow the conditions in section 3.
-
-You may also lend copies, under the same conditions stated above, and
-you may publicly display copies.
-
-
-3. COPYING IN QUANTITY
-
-If you publish printed copies of the Document numbering more than 100,
-and the Document's license notice requires Cover Texts, you must enclose
-the copies in covers that carry, clearly and legibly, all these Cover
-Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
-the back cover. Both covers must also clearly and legibly identify
-you as the publisher of these copies. The front cover must present
-the full title with all words of the title equally prominent and
-visible. You may add other material on the covers in addition.
-Copying with changes limited to the covers, as long as they preserve
-the title of the Document and satisfy these conditions, can be treated
-as verbatim copying in other respects.
-
-If the required texts for either cover are too voluminous to fit
-legibly, you should put the first ones listed (as many as fit
-reasonably) on the actual cover, and continue the rest onto adjacent
-pages.
-
-If you publish or distribute Opaque copies of the Document numbering
-more than 100, you must either include a machine-readable Transparent
-copy along with each Opaque copy, or state in or with each Opaque copy
-a publicly-accessible computer-network location containing a complete
-Transparent copy of the Document, free of added material, which the
-general network-using public has access to download anonymously at no
-charge using public-standard network protocols. If you use the latter
-option, you must take reasonably prudent steps, when you begin
-distribution of Opaque copies in quantity, to ensure that this
-Transparent copy will remain thus accessible at the stated location
-until at least one year after the last time you distribute an Opaque
-copy (directly or through your agents or retailers) of that edition to
-the public.
-
-It is requested, but not required, that you contact the authors of the
-Document well before redistributing any large number of copies, to give
-them a chance to provide you with an updated version of the Document.
-
-
-4. MODIFICATIONS
-
-You may copy and distribute a Modified Version of the Document under
-the conditions of sections 2 and 3 above, provided that you release
-the Modified Version under precisely this License, with the Modified
-Version filling the role of the Document, thus licensing distribution
-and modification of the Modified Version to whoever possesses a copy
-of it. In addition, you must do these things in the Modified Version:
-
-A. Use in the Title Page (and on the covers, if any) a title distinct
- from that of the Document, and from those of previous versions
- (which should, if there were any, be listed in the History section
- of the Document). You may use the same title as a previous version
- if the original publisher of that version gives permission.
-B. List on the Title Page, as authors, one or more persons or entities
- responsible for authorship of the modifications in the Modified
- Version, together with at least five of the principal authors of the
- Document (all of its principal authors, if it has less than five).
-C. State on the Title page the name of the publisher of the
- Modified Version, as the publisher.
-D. Preserve all the copyright notices of the Document.
-E. Add an appropriate copyright notice for your modifications
- adjacent to the other copyright notices.
-F. Include, immediately after the copyright notices, a license notice
- giving the public permission to use the Modified Version under the
- terms of this License, in the form shown in the Addendum below.
-G. Preserve in that license notice the full lists of Invariant Sections
- and required Cover Texts given in the Document's license notice.
-H. Include an unaltered copy of this License.
-I. Preserve the section entitled "History", and its title, and add to
- it an item stating at least the title, year, new authors, and
- publisher of the Modified Version as given on the Title Page. If
- there is no section entitled "History" in the Document, create one
- stating the title, year, authors, and publisher of the Document as
- given on its Title Page, then add an item describing the Modified
- Version as stated in the previous sentence.
-J. Preserve the network location, if any, given in the Document for
- public access to a Transparent copy of the Document, and likewise
- the network locations given in the Document for previous versions
- it was based on. These may be placed in the "History" section.
- You may omit a network location for a work that was published at
- least four years before the Document itself, or if the original
- publisher of the version it refers to gives permission.
-K. In any section entitled "Acknowledgements" or "Dedications",
- preserve the section's title, and preserve in the section all the
- substance and tone of each of the contributor acknowledgements
- and/or dedications given therein.
-L. Preserve all the Invariant Sections of the Document,
- unaltered in their text and in their titles. Section numbers
- or the equivalent are not considered part of the section titles.
-M. Delete any section entitled "Endorsements". Such a section
- may not be included in the Modified Version.
-N. Do not retitle any existing section as "Endorsements"
- or to conflict in title with any Invariant Section.
-
-If the Modified Version includes new front-matter sections or
-appendices that qualify as Secondary Sections and contain no material
-copied from the Document, you may at your option designate some or all
-of these sections as invariant. To do this, add their titles to the
-list of Invariant Sections in the Modified Version's license notice.
-These titles must be distinct from any other section titles.
-
-You may add a section entitled "Endorsements", provided it contains
-nothing but endorsements of your Modified Version by various
-parties--for example, statements of peer review or that the text has
-been approved by an organization as the authoritative definition of a
-standard.
-
-You may add a passage of up to five words as a Front-Cover Text, and a
-passage of up to 25 words as a Back-Cover Text, to the end of the list
-of Cover Texts in the Modified Version. Only one passage of
-Front-Cover Text and one of Back-Cover Text may be added by (or
-through arrangements made by) any one entity. If the Document already
-includes a cover text for the same cover, previously added by you or
-by arrangement made by the same entity you are acting on behalf of,
-you may not add another; but you may replace the old one, on explicit
-permission from the previous publisher that added the old one.
-
-The author(s) and publisher(s) of the Document do not by this License
-give permission to use their names for publicity for or to assert or
-imply endorsement of any Modified Version.
-
-
-5. COMBINING DOCUMENTS
-
-You may combine the Document with other documents released under this
-License, under the terms defined in section 4 above for modified
-versions, provided that you include in the combination all of the
-Invariant Sections of all of the original documents, unmodified, and
-list them all as Invariant Sections of your combined work in its
-license notice.
-
-The combined work need only contain one copy of this License, and
-multiple identical Invariant Sections may be replaced with a single
-copy. If there are multiple Invariant Sections with the same name but
-different contents, make the title of each such section unique by
-adding at the end of it, in parentheses, the name of the original
-author or publisher of that section if known, or else a unique number.
-Make the same adjustment to the section titles in the list of
-Invariant Sections in the license notice of the combined work.
-
-In the combination, you must combine any sections entitled "History"
-in the various original documents, forming one section entitled
-"History"; likewise combine any sections entitled "Acknowledgements",
-and any sections entitled "Dedications". You must delete all sections
-entitled "Endorsements."
-
-
-6. COLLECTIONS OF DOCUMENTS
-
-You may make a collection consisting of the Document and other documents
-released under this License, and replace the individual copies of this
-License in the various documents with a single copy that is included in
-the collection, provided that you follow the rules of this License for
-verbatim copying of each of the documents in all other respects.
-
-You may extract a single document from such a collection, and distribute
-it individually under this License, provided you insert a copy of this
-License into the extracted document, and follow this License in all
-other respects regarding verbatim copying of that document.
-
-
-7. AGGREGATION WITH INDEPENDENT WORKS
-
-A compilation of the Document or its derivatives with other separate
-and independent documents or works, in or on a volume of a storage or
-distribution medium, does not as a whole count as a Modified Version
-of the Document, provided no compilation copyright is claimed for the
-compilation. Such a compilation is called an "aggregate", and this
-License does not apply to the other self-contained works thus compiled
-with the Document, on account of their being thus compiled, if they
-are not themselves derivative works of the Document.
-
-If the Cover Text requirement of section 3 is applicable to these
-copies of the Document, then if the Document is less than one quarter
-of the entire aggregate, the Document's Cover Texts may be placed on
-covers that surround only the Document within the aggregate.
-Otherwise they must appear on covers around the whole aggregate.
-
-
-8. TRANSLATION
-
-Translation is considered a kind of modification, so you may
-distribute translations of the Document under the terms of section 4.
-Replacing Invariant Sections with translations requires special
-permission from their copyright holders, but you may include
-translations of some or all Invariant Sections in addition to the
-original versions of these Invariant Sections. You may include a
-translation of this License provided that you also include the
-original English version of this License. In case of a disagreement
-between the translation and the original English version of this
-License, the original English version will prevail.
-
-
-9. TERMINATION
-
-You may not copy, modify, sublicense, or distribute the Document except
-as expressly provided for under this License. Any other attempt to
-copy, modify, sublicense or distribute the Document is void, and will
-automatically terminate your rights under this License. However,
-parties who have received copies, or rights, from you under this
-License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-
-10. FUTURE REVISIONS OF THIS LICENSE
-
-The Free Software Foundation may publish new, revised versions
-of the GNU Free Documentation 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. See
-http://www.gnu.org/copyleft/.
-
-Each version of the License is given a distinguishing version number.
-If the Document specifies that a particular numbered version of this
-License "or any later version" applies to it, you have the option of
-following the terms and conditions either of that specified version or
-of any later version that has been published (not as a draft) by the
-Free Software Foundation. If the Document does not specify a version
-number of this License, you may choose any version ever published (not
-as a draft) by the Free Software Foundation.
-
-
-ADDENDUM: How to use this License for your documents
-
-To use this License in a document you have written, include a copy of
-the License in the document and put the following copyright and
-license notices just after the title page:
-
- Copyright (c) YEAR YOUR NAME.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.1
- or any later version published by the Free Software Foundation;
- with the Invariant Sections being LIST THEIR TITLES, with the
- Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
- A copy of the license is included in the section entitled "GNU
- Free Documentation License".
-
-If you have no Invariant Sections, write "with no Invariant Sections"
-instead of saying which ones are invariant. If you have no
-Front-Cover Texts, write "no Front-Cover Texts" instead of
-"Front-Cover Texts being LIST"; likewise for Back-Cover Texts.
-
-If your document contains nontrivial examples of program code, we
-recommend releasing these examples in parallel under your choice of
-free software license, such as the GNU General Public License,
-to permit their use in free software.
diff --git a/ChangeLog b/ChangeLog
deleted file mode 100644
index 356455230e..0000000000
--- a/ChangeLog
+++ /dev/null
@@ -1,1159 +0,0 @@
-2005-02-01 Priit Laes <amd@store20.com>
-
- * configure.in : Remove duplicate entries for addressbook-groupwise,
- groupwise-status-tracking and default-source in plugins list. Fixes
- make distclean.
-
-2005-02-01 JP Rosevear <jpr@novell.com>
-
- * MAINTAINERS: Update
-
-2005-02-01 Priit Laes <amd@store20.com>
-
- * configure.in : Remove duplicate entry for calendar-file in
- plugins list.
-
-2005-01-30 Harish Krishnaswamy <kharish@novell.com>
-
- * configure.in : Correct the typo in plugins_base made in
- the commit below - let the HEAD to get built again.
-
-2005-01-29 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * configure.in : add addressbook-groupwise plguin to the
- plguin list
-
-2005-01-26 Rodney Dawes <dobey@novell.com>
-
- * configure.in: Add mail/default/pt/Makefile to AC_OUTPUT
-
-2005-01-24 JP Rosevear <jpr@novell.com>
-
- * configure.in: bump version and requires
-
-2005-01-21 JP Rosevear <jpr@novell.com>
-
- * configure.in: e-util needs libgnomeprintui now
-
-2005-01-21 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * configure.in : added addressbook-file plugin
-
-2005-01-21 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * configure.in : added default-source plugin
-
-2005-01-20 Parthasarathi Susarla <sparthasarathi@novell.com>
-
- * configure.in : added a plugin for displaying the
- groupwise status tracking options
-
-2005-01-13 JP Rosevear <jpr@novell.com>
-
- * configure.in: bump version to 2.1.3.2
-
-2005-01-13 Rodney Dawes <dobey@novell.com>
-
- * configure.in: Add new-mail-notify to the plugins_all listing
- so that it gets disted properly
-
-2005-01-12 JP Rosevear <jpr@novell.com>
-
- * configure.in: fix plugin listing, bump upgrade revision so
- weather calendar group appears
-
-2005-01-10 JP Rosevear <jpr@novell.com>
-
- * configure.in: make itip-formatter a base plugin
-
-2005-01-11 JP Rosevear <jpr@novell.com>
-
- * configure.in: bump version
-
-2005-01-11 Not Zed <NotZed@Ximian.com>
-
- * configure.in: added new mail plugin & checks.
-
-2005-01-10 Sushma Rai <rsushma@novell.com>
-
- * configure.in: Added Exchange account settings plugin
-
-2005-1-10 Parthasarathi Susarla <sparthasarathi@novell.com>
- * configure.in : added send options plugin to base plugin list
-
-2005-01-10 Vivek Jain <jvivek@novell.com>
-
- * configure.in : Add shared-folder to plugin
- and base plugin list. Add corresponding Makfile to AC_OUTPUT section.
-
-2005-01-10 Chenthill Palanisamy <pchenthill@novell.com>
-
- * configure.in: add send-options plugin
-
-2005-01-09 JP Rosevear <jpr@novell.com>
-
- * configure.in: add calendar-file plugin
-
-2005-01-08 Priit Laes <amd@store20.com>
-
- * configure.in : Remove duplicate entry for itip-formatter in
- plugins list.
-
-2005-01-08 Harish Krishnaswamy <kharish@novell.com>
-
- * configure.in : Add gnome-vfs-module-2.0 to Evo compile flags for
- the calendar.
-
-2005-01-08 Hans Petter Jansson <hpj@novell.com>
-
- * configure.in: Add libedataserverui to the e-util libs and cflags.
-
-2005-01-07 Rodrigo Moya <rodrigo@novell.com>
-
- * configure.in: removed weatherdatadir definition here.
-
-2005-01-07 David Trowbridge <David.Trowbridge@Colorado.edu>
-
- * configure.in: added calendar-weather plugin to build.
-
-2005-01-06 JP Rosevear <jpr@novell.com>
-
- * data/Makefile.am: add some uninstall rules for local data
-
-2005-01-03 JP Rosevear <jpr@novell.com>
-
- * configure.in: add itip-formatter to the "all" list, its not
- ready to be in the base yet though
-
-2004-12-23 Hans Petter Jansson <hpj@novell.com>
-
- * configure.in: Remove select-names from Makefile output list.
-
-2004-12-17 Not Zed <NotZed@Ximian.com>
-
- * devel-docs/misc/errors.txt (BUILT_SOURCES): add translation stuff.
-
-2004-12-16 Not Zed <NotZed@Ximian.com>
-
- * Makefile.am, configure.in: added evolution-plugin.pc, pkg-config
- file required for plugin development.
-
-2004-12-20 JP Rosevear <jpr@novell.com>
-
- * configure.in: bump version, requires
-
-2004-12-14 JP Rosevear <jpr@novell.com>
-
- Fixes #6066
-
- * README.translators: New information for translators
-
- * README: Update slightly for 2.1/2.2
-
-2004-12-14 Rodney Dawes <dobey@novell.com>
-
- * configure.in (AC_OUTPUT): Add mail/default/zh_CN/Makefile
-
-2004-12-08 Hans Petter Jansson <hpj@novell.com>
-
- * plugins/shared-folder/share-folder-common.c: Include
- <libebook/e-destination.h> from evolution-data-server.
-
-2004-12-03 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * configure.in : Add groupwise-account-setup to plguin
- and base plugin list. Add corresponding Makfile to AC_OUTPUT section.
-
-2004-12-01 Dafydd Harries <daf@muse.19inch.net>
-
- * configure.in: Add "cy" (Welsh) to ALL_LINGUAS.
-
-2004-11-29 JP Rosevear <jpr@novell.com>
-
- * configure.in: bump version, requires
-
-2004-12-02 Not Zed <NotZed@Ximian.com>
-
- * configure.in: Make evolution mail link to camel-provider not
- camel only. Removed some camel stuff.
-
-2004-11-16 Not Zed <NotZed@Ximian.com>
-
- * Makefile.am (SUBDIRS): removed camel.
-
- * configure.in: Removed camel building, fixed module includes to
- use camel via packageconfig.
-
-2004-11-15 Not Zed <NotZed@Ximian.com>
-
- * configure.in: Added libeds to camel and mail and filter cflags.
-
-2004-11-09 Rodney Dawes <dobey@novell.com>
-
- * configure.in: Add AC_SUBST for plugins_base also
-
- * plugins/Makefile.am: Add plugins_base to DIST_SUBDIRS so that we
- dist the plug-ins we actually build by default
-
-2004-11-04 Not Zed <NotZed@Ximian.com>
-
- * configure.in: added mailing-list-actions plugin.
-
-2004-11-04 Not Zed <NotZed@Ximian.com>
-
- * configure.in: modified base vs optional logic slightly and added
- a warning if you build with --enable-plugins=no.
-
-2004-11-04 David Trowbridge <David.Trowbridge@Colorado.edu>
-
- * configure.in: Added calendar-http module, and setup a mechanism
- for base vs optional plugins.
-
-2004-11-03 JP Rosevear <jpr@novell.com>
-
- * configure.in: fix the logic
-
-2004-11-03 JP Rosevear <jpr@novell.com>
-
- * configure.in: handle plain --enable-plugins and
- --enable-plugins=yes by making it the equivalent of "all"
-
-2004-11-03 Not Zed <NotZed@Ximian.com>
-
- * configure.in: added plugin-manager plugin.
-
-2004-11-01 JP Rosevear <jpr@novell.com>
-
- * Makefile.am: dist plugin.mk
-
-2004-10-29 Rodrigo Moya <rodrigo@novell.com>
-
- * configure.in: added mail-to-meeting plugin.
-
-2004-10-28 Nat Friedman <nat@novell.com>
-
- * configure.in: Re-enable bbwhatever becuase I think it works now.
-
-2004-10-27 JP Rosevear <jpr@novell.com>
-
- * configure.in: revive E_WIDGETS_CFLAGS/LIBS because of needing to
- add libedataserverui
-
-2004-10-27 Not Zed <NotZed@Ximian.com>
-
- * configure.in: removed bbwhatever it is until the makefiles are
- fixed.
-
-2004-10-25 Radek Doulik <rodo@ximian.com>
-
- * configure.in: added audio-inline plugin, added gstreamer check
- for it
-
- if gstreamer is not available, remove audio-inline plugin from the
- plugins list
-
-2004-10-22 Harish K <kharish@novell.com>
-
- * configure.in: Added mark-calendar-offline plugin
-
-2004-10-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Added folder-unsubscribe plugin
-
-2004-10-22 Nat Friedman <nat@novell.com>
-
- * configure.in: Added the bbdb plugin.
-
-2004-10-21 Rodrigo Moya <rodrigo@novell.com>
-
- * configure.in: added save-calendar plugin.
-
-2004-10-21 Not Zed <NotZed@Ximian.com>
-
- * configure.in: added copy-tool plugin.
-
-2004-10-20 JP Rosevear <jpr@novell.com>
-
- * configure.in: add select-one-source to the plugin list
-
-2004-10-20 Not Zed <NotZed@Ximian.com>
-
- * configure.in: added prefer plain plugin.
-
-2004-10-20 Not Zed <NotZed@Ximian.com>
-
- * configure.in: added save attachments plugin.
-
-2004-10-20 JP Rosevear <jpr@novell.com>
-
- * Makefile.am: list plugins as a subdir
-
- * plugins/Makefile.am: build enabled plugins
-
- * plugin.mk: simple rule for creating .eplug files
-
- * configure.in: add plugin foo; --enable-plugins=all turns them
- all on, or you can --enable-plugins="<plugin dir> <plugin dir>" to
- list specific ones
-
-2004-10-15 Sarfraaz Ahmed <asarfraaz@novell.com>
-
- * camel.pc.in : Change gal-2.2 to gal-2.4
- * evolution-shell.pc.in : Similar
-
-2004-10-13 JP Rosevear <jpr@novell.com>
-
- * configure.in: remove plugins from ac output
-
-2004-10-13 JP Rosevear <jpr@novell.com>
-
- * configure.in: pull in libedataserverui as appropriate
-
-2004-10-01 Jeffrey Stedfast <fejj@novell.com>
-
- * configure.in (localedir): Enable imap4 plugin by default. We
- need to get people building this and testing it.
-
-2004-10-01 JP Rosevear <jpr@novell.com>
-
- * configure.in: set the GETTEXT_PACKAGE to evolution-2.2
-
-2004-10-01 JP Rosevear <jpr@novell.com>
-
- * configure.in: set a GTKHTML_API_VERSION variable
-
-2004-09-13 Not Zed <NotZed@Ximian.com>
-
- * configure.in: change the way ipv6 stuff is done. separate ipv6
- setting from getaddrinfo call check, and default to on if the
- interfaces are available.
-
-2004-09-17 William Jon McCann <mccann@jhu.edu>
-
- * configure.in: Fix typos in gal dependency.
-
-2004-09-16 JP Rosevear <jpr@novell.com>
-
- * configure.in: use AC_DEFINE properly
-
-2004-09-16 JP Rosevear <jpr@novell.com>
-
- * configure.in: bump EDS and gal requirements
-
-2004-09-16 JP Rosevear <jpr@novell.com>
-
- * configure.in: bump version to 2.1.0 and set base version to 2.2;
- define DEVELOPMENT here so we don't have to alter code to change
- in future
-
-2004-09-13 Tomasz KÅ‚oczko <kloczek@pld.org.pl>
-
- * data/evolution.desktop.in: added missing Encoding=UTF-8 field
- (validate desktop file).
-
-2004-09-11 Akagic Amila <bono@linux.org.ba>
-
- * configure.in: Added 'bs' to ALL_LINGUAS.
-
-2004-08-27 JP Rosevear <jpr@novell.com>
-
- * configure.in: bump version, requirements
-
-2004-08-23 Jeffrey Stedfast <fejj@novell.com>
-
- * configure.in: Added some comments about --enable-openssl
- (e.g. why it is disabled)
-
-2004-08-18 Kjartan Maraas <kmaraas@gnome.org>
-
- * configure.in: Added «nb» to ALL_LINGUAS.
-
-2004-08-13 JP Rosevear <jpr@novell.com>
-
- * configure.in: bump version. requires
-
-2004-08-13 Rodney Dawes <dobey@novell.com>
-
- * acinclude.m4: Revert previous EVO_LDAP_CHECK changes, aren't working
- as well as expceted and determined in testing
-
-2004-08-13 Frederic Crozat <fcrozat@mandrakesoft.com>
-
- * configure.in:
- Add option to specify location of kerberos 4/5 libraries and
- headers directories.
- Needed for 64bits support.
-
-2004-08-13 Rodney Dawes <dobey@novell.com>
-
- * configure.in: Add value and description fields to AC_DEFINE calls
- for the HAVE_ET_COM_ERR_H and HAVE_COM_ERR_H checks
-
-2004-08-13 Rodney Dawes <dobey@novell.com>
-
- * acinclude.m4: Remove EVO_CHECK_LIB
- Update EVO_LDAP_CHECK to support --with-openldap-{libs,includes}
- Sync with e-d-s acinclude.m4 (Adds GTK_DOC_CHECK)
-
-2004-08-13 Rodney Dawes <dobey@novell.com>
-
- * configure.in: Check for et/comm-err.h and comm_err.h so that
- we can include the correct one
-
-2004-08-12 Rodney Dawes <dobey@novell.com>
-
- * data/evolution.desktop.in.in: Update Name and description to
- not include "Ximian" or "(Unstable)"
- Remove the MimeType field since we can't open these types on the
- command line
-
-2004-08-12 Jeffrey Stedfast <fejj@novell.com>
-
- * configure.in: Check for gtk+-2.4 in order to enable the use of
- GtkFileChooser.
-
-2004-08-09 Ankit Patel <ankit@redhat.com>
-
- * configure.in: Gujarati & Panjabi Languages added
-
-2004-08-02 JP Rosevear <jpr@novell.com>
-
- * configure.in: bump version, requirements
-
-2004-08-01 JP Rosevear <jpr@novell.com>
-
- * configure.in: add libedataserver to E_UTIL flags
-
-2004-07-25 Gil Osher <dolfin@rpg.org.il>
-
- * configure.in: Added 'he' (Hebrew) to ALL_LINGUAS.
-
-2004-07-21 Ray Strode <rstrode@redhat.com>
-
- * evolution/data/evolution.desktop.in.in: Add MimeType line to
- desktop file new mime sytem.
-
-2004-07-19 JP Rosevear <jpr@novell.com>
-
- * configure.in: bump version, requirements
-
-2004-07-07 Chris Toshok <toshok@ximian.com>
-
- * configure.in: add CAMEL_GROUPWISE cflags/libs.
-
-2004-07-02 JP Rosevear <jpr@novell.com>
-
- * configure.in: bump version, requirements
-
-2004-08-24 JP Rosevear <jpr@novell.com>
-
- * configure.in (plugindir): set a plugin dir so we can easily
- install to the same place everywhere
-
-2004-08-24 JP Rosevear <jpr@novell.com>
-
- * configure.in: Check for mono support properly
-
-2004-07-05 Not Zed <NotZed@Ximian.com>
-
- * configure.in: add some mono checks.
-
-2004-06-24 Pablo Saratxaga <pablo@mandrakesoft.com>
-
- * configure.in: Added Walloon (wa) to ALL_LINGUAS.
-
-2004-06-20 Arafat Medini <lumina@silverpen.de>
-
- * configure.in: Added arabic locale ar to ALL_LINGUAS.
-
-2004-06-17 Fernando Herrera <fherrera@onirica.com>
-
- * data/evolution.desktop.in.in: Use "Evolution" for
- X-GNOME-Bugzilla-Product to match b.x.c product name.
-
-2004-06-09 Dan Winship <danw@novell.com>
-
- * configure.in (AC_OUTPUT): Remove shell/glade/Makefile, which has
- been merged into shell/Makefile
-
-2004-06-03 JP Rosevear <jpr@novell.com>
-
- * configure.in: bump version, requirements
-
-2004-06-02 Chris Toshok <toshok@ximian.com>
-
- * configure.in (EDS_REQUIRED): bump to 0.0.93.1.
- (BASE_VERSION): change to 12 for the ESource absolute_uri stuff.
-
-2004-06-01 Not Zed <NotZed@Ximian.com>
-
- * configure.in: check for statvfs.
-
-2004-05-24 Chris Toshok <toshok@ximian.com>
-
- * configure.in: add addressbook/tools/Makefile.am back to the
- build.
-
-2004-05-19 Jeffrey Stedfast <fejj@novell.com>
-
- * configure.in: Setup the icon install paths (not that we actually
- use them yet).
-
-2004-05-19 JP Rosevear <jpr@novell.com>
-
- * configure.in: bump version
-
-2004-05-12 Not Zed <NotZed@Ximian.com>
-
- * configure.in: add some stuff for statfs.
-
- * devel-docs/misc/errors.txt: updated for xml format and i18n
- changes.
-
-2004-04-30 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: Require intltool 0.30 for the error xml files
-
-2004-04-30 Mike Castle <dalgoda@ix.netcom.com>
-
- * data/Makefile.am (install-data-local): get the mime file from
- src dir for srcdir != builddir
-
-2004-04-30 Not Zed <NotZed@Ximian.com>
-
- * tools/killev.c (main): use gnome_i18n_get_language_list so we
- get the right one (LC_MESSAGES).
-
-2004-04-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in (UPGRADE_REVISION): Changed to 11.
-
-2004-04-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in (UPGRADE_REVISION): Changed to 10.
-
-2004-04-26 Radek Doulik <rodo@ximian.com>
-
- * configure.in: require newer gtkhtml with new gtk_html_begin's
- flags
-
-2004-04-21 Rodney Dawes <dobey@ximian.com>
-
- * autogen.sh: Require automake 1.6 or neweer, we already do for libsoup
- and evolution-data-server, there is no reason not to here
-
-2004-04-21 Chris Toshok <toshok@ximian.com>
-
- * configure.in (EDS_REQUIRED): bump to 0.0.92.1 for new EContact
- company phone foo.
- (UPGRADE_REVISION): bump to 9.
-
-2004-04-21 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * configure.in : added libegroupwise dependency to CAMEL
- compile flags
-
-2004-04-19 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: Require gnome-icon-theme >= 1.2.0
-
-2004-04-19 Michael Terry <mike@mterry.name>
-
- * data/evolution.desktop.in.in: Use the icon theme
-
-2004-04-19 JP Rosevear <jpr@ximian.com>
-
- * configure.in: bump version, requirements
-
-2004-04-09 Chris Toshok <toshok@ximian.com>
-
- * configure.in (UPGRADE_REVISION): bump to 8 for new contact list
- migration, since there was a bug in the shell that caused all
- migration to fail, but the key was still updated.
-
-2004-04-09 Chris Toshok <toshok@ximian.com>
-
- * configure.in (UPGRADE_REVISION): bump to 7 for new contact list
- migration.
-
-2004-04-08 Chris Toshok <toshok@ximian.com>
-
- * configure.in (UPGRADE_REVISION): add a new variable that should
- be bumped whenever a migration change happens in any component.
-
-2004-04-07 Samúel Jón Gunnarsson <sammi@techattack.nu>
-
- * configure.in: Added "is" to ALL_LINGUAS
-
-2004-04-02 JP Rosevear <jpr@ximian.com>
-
- * configure.in: bump version, requirements
-
-2004-03-22 Radek Doulik <rodo@ximian.com>
-
- * configure.in: require gtkhtml 3.1.10, it's needed for composer
- changes
-
-2004-03-15 Hao Sheng <hao.sheng@sun.com>
-
- * a11y/addressbook/Makefile.am: make distcheck work
- * a11y/calendar/Makefile.am: make distcheck work
-
-2004-03-15 Hao sheng <hao.sheng@sun.com>
-
- * configure.in: add a11y/addressbook/Makefile
-
-2004-03-05 JP Rosevear <jpr@ximian.com>
-
- * configure.in: bump version, requirements
-
-2004-03-02 Dan Winship <danw@ximian.com>
-
- * configure.in (DATASERVER_API_VERSION): Define this (the number
- used in the e-d-s component repo_ids).
-
- * tools/killev.c (main): Update the repo_ids
-
-2004-02-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Fixed the ENABLE_SMIME conditional to work. Fixes
- the addressbook relocation error.
-
-2004-02-25 Chris Toshok <toshok@ximian.com>
-
- * configure.in: add "$xhave_nss = xyes" to the AM_CONDITIONAL for
- ENABLE_SMIME.
-
-2004-02-24 JP Rosevear <jpr@ximian.com>
-
- * marshal.mk: make sure to use the srcdir to build the list
-
-2004-02-23 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: Fix a typo in the smime check, so it actually works
-
-2004-02-23 Adam Weinberger <adamw@FreeBSD.org>
-
- * configure.in: Added "en_CA" (Canadian English) to ALL_LINGUAS.
-
-2004-02-19 Chris Toshok <toshok@ximian.com>
-
- * configure.in: add AC_ARG_ENABLE(smime...) -- "finally", i can
- hear the people rejoice. Only check the --enable-smime status if
- --enable-ssl is also "yes". AC_DEFINE (ENABLE_SMIME) if smime is
- enabled.
-
-2004-02-18 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: Require ORBit 2.9.8 or newer
-
-2004-02-12 Dan Winship <danw@ximian.com>
-
- * Makefile.am (%-$(BASE_VERSION).pc): cp the unversioned file
- rather than mv'ing it so it doesn't get regenerated at install
- time.
-
-2004-02-11 Not Zed <NotZed@Ximian.com>
-
- * configure.in (IMPORTERS_*): Added libebook-1.0. Added back
- mail/importers/Makefile.am.
-
-2004-02-10 JP Rosevear <jpr@ximian.com>
-
- * configure.in: Add addressbook/importers to AC_OUTPUT
-
-2004-02-09 JP Rosevear <jpr@ximian.com>
-
- * configure.in: bump version, requirements
-
-2004-02-09 Rodney Dawes <dobey@ximian.com>
-
- * tools/killev.c: Use the AlarmNotify_Factory for --force-shutdown
-
- Fixes #54084
-
-2004-02-09 Rodney Dawes <dobey@ximian.com>
-
- * data/evolution.desktop.in.in: Updated BugzillaOtherBinaries tag
-
-2004-01-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Revert previous change.
-
-2004-01-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Update to require glib-2.0 >= 2.3.2 (needed for
- some GValue usage).
-
-2004-01-28 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: Disable the possibility of using OpenSSL until someone
- decides it is worthy and ends up maintaining the code, though porting
- to GNUTLS would probably be a better option, if that happens
-
-2004-01-26 David Trowbridge <trowbrds@cs.colorado.edu>
-
- * configure.in: add facilities for installing a help dir
-
-2004-01-26 JP Rosevear <jpr@ximian.com>
-
- * configure.in: bump requirements, version
-
-2004-01-24 Sanlig Badral <badral@openmn.org>
-
- * configure.in: added "mn" to ALL_LINGUAS.
-
-2004-01-22 Rodney Dawes <dobey@ximian.com>
-
- * data/Makefile.am: Add rule to substitute BASE_VERSION in keys
- * data/evolution.keys.in: Removed this file from CVS
- * data/evolution.keys.in.in: Update to use BASE_VERSION and the
- new addressbook vcard control that replaces the MiniCard control
-
-2004-01-22 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: Don't require $LIBBONOBOUI_REQUIRED version of
- libbonobo
-
-2004-01-16 Not Zed <NotZed@Ximian.com>
-
- * configure.in: added mail/default/Makefile and
- mail/default/C/Makefile.
-
-2004-01-13 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: Check for libsoup separately
-
-2004-01-12 JP Rosevear <jpr@ximian.com>
-
- * configure.in: bump version and requirements
-
-2004-01-12 JP Rosevear <jpr@ximian.com>
-
- * configure.in: add soup as a calendar dep
-
-2004-01-12 Meilof Veeningen <meilof@wanadoo.nl>
-
- * configure.in: enable NNTP support by default
-
-2004-01-12 JP Rosevear <jpr@ximian.com>
-
- * configure.in: compile flags for the test component and a
- conditional compile
-
-2004-01-11 JP Rosevear <jpr@ximian.com>
-
- * configure.in: dont kill the quote
-
-2004-01-11 JP Rosevear <jpr@ximian.com>
-
- * configure.in: add enable option to build test component
-
-2004-01-08 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: Add BONOBOUI_REQUIRED variable and depend on
- libbonoboui >= 2.4.3, add an AC_SUBST() for EDS_REQUIRED also
- * evolution-shell.pc.in: Require the same version of bonoboui that we
- do in configure.in
-
-2004-01-08 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * configure.in : add camel/providers/groupwise/Makefile to
- AC_OUTPUT section
-
-2004-01-08 Robert Sedak <robert.sedak@sk.htnet.hr>
-
- * configure.in: Added "hr" (Croatian) to ALL_LINGUAS.
-
-2004-01-05 JP Rosevear <jpr@ximian.com>
-
- * tools/Makefile.am: Add e-util libs
-
- * configure.in: try compiling with sys/types for freebsd
-
- (Joe Marcus Clarke <marcus@freebsd.org>)
-
-2004-01-05 Laurent Dhima <laurenti@alblinux.net>
-
- * configure.in: Added "sq" to ALL_LINGUAS.
-
-2004-01-01 Roozbeh Pournader <roozbeh@sharif.edu>
-
- * configure.in: Added "fa" (Persian) to ALL_LINGUAS.
-
-2003-12-30 Nicel KM <mnicel@novell.com>
-
- * configure.in: removed default_user directory references from AC_OUTPUT
-
-2003-12-29 JP Rosevear <jpr@ximian.com>
-
- * configure.in: default_user is gone
-
- * Makefile.am: ditto
-
-2003-12-29 JP Rosevear <jpr@ximian.com>
-
- * configure.in: bump version and gal, e-d-s and gtkhtml
- requirements
-
-2003-12-22 Rodrigo Moya <rodrigo@ximian.com>
-
- * configure.in: added camel/providers/groupwise to the build.
-
-2003-12-15 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am (ACLOCAL_AMFLAGS): remove.
-
-2003-12-07 JP Rosevear <jpr@ximian.com>
-
- * configure.in: update version reliance
-
-2003-12-06 JP Rosevear <jpr@ximian.com>
-
- * tools/Makefile.am: Remove hard coded disable deprecated flags
-
-2003-12-05 Radek Doulik <rodo@ximian.com>
-
- * configure.in: require gtkhtml 3.1.3 (new gtk_html_flush method
- to be used in mailer)
-
-2003-12-04 Christian Hammond <chipx86@gnupdate.org>
-
- * art/im*.png, art/Makefile.am: Added IM png files from Gaim.
-
-2003-12-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in (EVOLUTION_DIR): Remove the Junk folder
-
-2003-12-01 Rodney Dawes <dobey@ximian.com>
-
- * data/Makefile.am: Install evolution.desktop as
- evolution-$(BASE_VERSION).desktop
- * data/evolution.desktop.in: Remove generated file
- * data/evolution.desktop.in.in: Add (Unstable) to name
- Fix comment to be more correct and have correct capitalization
-
-2003-12-01 Rodney Dawes <dobey@ximian.com>
-
- * tools/killev.c: Use BASE_VERSION for repo_ids and OAFIIDs,
- Update gnome-spell repo_id to correct version,
- Update gtkhtml editor OAFIID to GtkHTML 3.1
-
-2003-12-01 JP Rosevear <jpr@ximian.com>
-
- * configure.in: define privconduitdir
-
-2003-11-28 Anders Carlsson <andersca@gnome.org>
-
- * configure.in: Look for mozilla-nss.pc, not mozilla.pc.
-
-2003-11-26 JP Rosevear <jpr@ximian.com>
-
- * configure.in: make sure the mozilla .pc file exists before
- checking for it
-
-2003-11-24 Rodrigo Moya <rodrigo@ximian.com>
-
- * tools/killev.c (main): kill Evo 2.0's alarm daemon, not 1.4's.
-
-2003-11-19 JP Rosevear <jpr@ximian.com>
-
- * MAINTAINERS: Update
-
-2003-11-18 JP Rosevear <jpr@ximian.com>
-
- * configure.in: remove db3 check
-
-2003-11-18 Rodrigo Moya <rodrigo@ximian.com>
-
- * tools/killev.c (main): kill the alarm notification service, not
- the factory, which no longer exists.
-
-2003-11-17 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: make sure server.mk is disted
-
-2003-11-17 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am (EXTRA_DIST): do the right thing for disting
-
-2003-11-17 JP Rosevear <jpr@ximian.com>
-
- * configure.in: use the server.mk file to get rules for building
- versioned .server files
-
- * */Makefile.am: use simplified rule subst
-
-2003-11-17 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: Install versioned package config files
-
-2003-11-14 JP Rosevear <jpr@ximian.com>
-
- * configure.in: make source selector flags/libs
-
-2003-11-14 JP Rosevear <jpr@ximian.com>
-
- * MAINTAINERS: Update
-
-2003-11-11 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am (SUBDIRS): remove libversit from the build.
-
- * configure.in (CERT_UI): change the libraries we link.
- (AC_OUTPUT): remove libversit/Makefile
-
-2003-11-11 JP Rosevear <jpr@ximian.com>
-
- * configure.in: determine the e-d-s version, version the gettext
- files properly
-
-2003-11-07 Dan Winship <danw@ximian.com>
-
- * configure.in (AC_OUTPUT): Remove e-util/ename/Makefile
-
-2003-11-07 JP Rosevear <jpr@ximian.com>
-
- * configure.in: we don't have to configure the libical subdir now
-
-2003-11-07 JP Rosevear <jpr@ximian.com>
-
- * configure.in: pull in evolution-data-server stuff and remove
- backends from output
-
-2003-10-31 JP Rosevear <jpr@ximian.com>
-
- * configure.in: set up vars and rules for versioning the .server
- files
-
- * Makefile.am's: use rules for versioning .server file, ensure
- built files are removed before disting
-
-2003-10-30 Chris Toshok <toshok@ximian.com>
-
- * configure.in: (AC_OUTPUT): remove smime/tests for now.
-
-2003-10-30 Chris Toshok <toshok@ximian.com>
-
- * configure.in: set enable_smime=yes wherever nss would be
- enabled.. fixes manually specifying the nss libs and enabling the
- smime ui. Also, add a section for generating the correct SMIME UI
- flags. gross, but necessary. it should probably be wrapped in
- with all the other nss library crap.
- (AC_OUTPUT): add smime/tests
-
-2003-10-29 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am (SUBDIRS): use $SMIME_DIR. instead of explicitly
- including smime.
-
- * configure.in: add some smime foo - a status message, an
- AM_CONDITIONAL (ENABLE_SMIME)
-
-2003-10-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: added a configure check for AI_ADDRCONFIG
-
-2003-10-24 Dan Winship <danw@ximian.com>
-
- * libversit/Makefile.am: Change YFLAGS to AM_YFLAGS to stop an
- automake 1.7 warning
-
-2003-10-23 Rodney Dawes <dobey@ximian.com>
-
- * confiugre.in: Remove mail/importers/Makefile from AC_OUTPUT
- yet again
-
-2003-10-23 Chris Toshok <toshok@ximian.com>
-
- * configure.in: add smime/* dirs. to AC_OUTPUT.
-
- * Makefile.am (SUBDIRS): add smime/.
-
-2003-10-23 Frederic Crozat <fcrozat@mandrakesoft.com>
-
- * configure.in: Check for gnome-thumbnail.h existence
- (really committed this time).
-
-2003-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Set $ACLOCAL to have the $ACLOCAL_FLAGS in it, so
- it doesn't fail to regenerate the files if you run make without a
- manual autogen after making changes to configure.in and friends.
- [Many thanks to Marco Pesenti Gritti for pointing out the fix to
- me.]
-
-2003-10-22 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: Require ORBit 2.8.0 or newer for threading
-
-2003-10-22 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: Revert broken previous commit and actually remove
- mail/importers/Makefile from AC_OUTPUT
-
-2003-10-22 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: Removed mail/importers/Makefile from AC_OUTPUT
-
-2003-10-22 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: Removed addressbook/tools/Makefile from AC_OUTPUT
-
-2003-10-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Removed pedantic pgp/mime configure flag.
-
-2003-10-22 Dan Winship <danw@ximian.com>
-
- * executive-summary/*: Removed; this code has not been used since
- pre-1.0.
-
- * importers/*: Removed; the actual importers were moved to
- {mail,calendar}/importers long ago.
-
- * my-evolution/*: Removed; gone in evolution 2.0.
-
- * notes/*: Removed; never finished and no one is working on it.
-
- * omf-install/*: Removed; part of old doc system
-
- * tests/*: Removed; these are ancient. Camel regression tests are
- in camel/tests now.
-
- * configure.in (E_UTIL_{CFLAGS,LIBS}): Remove soup-2.0 since
- e-proxy is gone.
- (EVOLUTION_MAIL_{CFLAGS,LIBS}): Remove soup-2.0 since the mailer
- uses CamelHTTPStream now.
- (EVOLUTION_EXECUTIVE_SUMMARY_{CFLAGS,LIBS}): Gone
- (AC_OUTPUT): Remove my-evolution/Makefile
-
- * README: evolution no longer depends on soup
-
-2003-10-21 Dan Winship <danw@ximian.com>
-
- * configure.in (GNOME_COMPILE_WARNINGS): Turn off the annoying
- "comparison between signed and unsigned" warning in gcc 3.3
-
- * evolution-calendar.pc.in (Cflags): add
- -I${privincludedir}/libical
-
-2003-10-08 Frederic Crozat <fcrozat@mandrakesoft.com>
-
- * configure.in: Check for gnome-thumbnail.h existence.
-
-2003-09-04 Dan Winship <danw@ximian.com>
-
- * camel.pc.in (Requires):
- * evolution-addressbook.pc.in (Requires):
- * evolution-calendar.pc.in (Requires):
- * evolution-shell.pc.in (Requires): Require gal-2.2
-
-2003-08-27 Bolian Yin <bolian.yin@sun.com>
-
- * configure.in: add a11y/widgets/Makefile
- * Makefile.am: move a11y directory before widgets directory.
-
-2003-08-21 Not Zed <NotZed@Ximian.com>
-
- * HACKING: Wrote one.
-
-2003-08-20 Bolian Yin <bolian.yin@sun.com>
-
- * configure.in: Add a11y checking, and a11y Makefiles
- * Makefile.am: add a11y subdirectory
-
-2003-08-13 Mike Kestner <mkestner@ximian.com>
-
- * configure.in: don't make 1.5 the default version (ie LN_S)
- update to use gal-2.2
-
-2003-08-01 Not Zed <NotZed@Ximian.com>
-
- * configure.in: Add option for '--enable-imapp', for 'new' imap
- code.
-
-2003-07-26 Larry Ewing <lewing@ximian.com>
-
- * configure.in: use libgtkhtml-3.1 for linking.
-
-2003-07-26 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: Bump version to "1.5", so that we end up being
- parallel installable with 1.4 again, but we can still release
- a "1.5.0" tarball when we get to that point in 6 months
-
-2003-07-23 Dan Winship <danw@ximian.com>
-
- * configure.in: Define EVO_MARSHAL_RULE, which creates glib
- marshaller .c and .h files that don't cause gcc warnings
-
- * marshal.mk: The Makefile fragment used by EVO_MARSHAL_RULE.
- (Can't include newlines in an AC_SUBST, so we have to use
- AC_SUBST_FILE)
-
- * Makefile.am (EXTRA_DIST): add marshal.mk
-
-2003-07-20 Hasbullah Bin Pit <sebol@ikhlas.com>
-
- *configure.in: Added 'ms' (Malay) to ALL_LINGUAS.
-
-2003-07-10 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: Change version to 1.4.99 since HEAD is not the
- stable 1.4 branch, as evolution-1-4-branch was created post-1.4.1
-
-2003-07-01 Dan Winship <danw@ximian.com>
-
- * configure.in: Check for gnome-icon-lookup.h (which could mean
- either plain GNOME 2.2 or Sun GNOME 2.0)
-
-2003-06-30 Rodrigo Moya <rodrigo@ximian.com>
-
- * configure.in:
- * Makefile.am: removed libwombat from the build.
-
- * evolution-calendar.pc.in: removed -lwombat.
-
- * libwombat/*: removed unused directory.
-
-== Version 1.4.1 ==
-
-2003-06-25 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Depend on GtkHTML 3.0.6, gal 1.99.8.
-
- * README: Update
-
-2003-06-23 Ettore Perazzoli <ettore@ximian.com>
-
- * data/Makefile.am: Added implicity rule to subst @BASE_VERSION@
- in evolution.desktop.in.in to generate evolution.desktop.in.
- (desktop_in_file): Removed.
- (desktop_in_in_file): New.
- (kdedesktop_file): Update substitution to use
- $(desktop_in_in_file) instead of $(desktop_in_file).
- (noinst_DATA): Add $(desktop_file).
- (install-data-local): Depend on $(mime_file) and $(keys_file).
- (EXTRA_DIST): Remove $(desktop_file), replace $(desktop_in_file)
- with $(desktop_in_in_file).
-
-2003-06-19 Dan Winship <danw@ximian.com>
-
- * tools/killev.c (kill_component): clean this up a little and make
- it deal with "evolution" vs "evolution-1.4"
-
-2003-06-19 Danilo Å egan <dsegan@gmx.net>
-
- * configure.in: Added "sr" and "sr@Latn" to ALL_LINGUAS.
-
-2003-06-17 Not Zed <NotZed@Ximian.com>
-
- * NEWS: Updated for current mail stuff.
-
-2003-06-13 Ettore Perazzoli <ettore@ximian.com>
-
- * tools/Makefile.am: Remove evolution-launch-composer since it's
- no longer needed.
-
-
diff --git a/ChangeLog.pre-1-4 b/ChangeLog.pre-1-4
deleted file mode 100644
index 944140f011..0000000000
--- a/ChangeLog.pre-1-4
+++ /dev/null
@@ -1,8530 +0,0 @@
-== Version 1.4.0 ==
-
-2003-06-02 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Bump version number to 1.4.0.
- (VERSION_COMMENT): Set to an empty string.
- (GAL_REQUIRED): Require 1.99.7.
-
-2003-05-28 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: AC_SUBST() for GAL_REQUIRED and GTKHTML_REQUIRED
-
-2003-05-27 Not Zed <NotZed@Ximian.com>
-
- * camel.pc.in: make libs/cflags point to privlibdir/includedir,
- otherwise this just doesn't work.
-
-== Version 1.3.92 ==
-
-2003-05-22 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Bump version to 1.3.92.
-
-2003-05-22 Rodney Dawes <dobey@ximian.com>
-
- * camel.pc.in:
- * evolution-addressbook.pc.in:
- * evolution-calendar.pc.in:
- * evolution-shell.pc.in: s/GAL_VERSION/GAL_REQUIRED/
-
-2003-05-22 Dmitry G. Mastrukov <dmitry@taurussoft.org>
-
- * configure.in: Added Belarusian to ALL_LINGUAS.
-
-2003-05-21 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Bump version to 1.3.91.99.
-
-== Version 1.3.91 ==
-
-2003-05-21 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Renamed GAL_VERSION to GAL_REQUIRED; also, made it
- not AC_SUBST() it anymore since it's only used in configure.
- Added GTKHTML_REQUIRED and made all the libgtkhtml-3.0 checks use
- it.
-
-2003-05-19 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Remove GNOME_PREFIX stuff. Add
- --disable-default-binary command line option, with corresponding
- DEFAULT_BINARY Automake conditional.
-
-2003-05-19 Not Zed <notzed@lostzed.mmc.com.au>
-
- * NEWS: Updated for mail/ camel/ filter/ and e-util/
-
-2003-04-30 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Bump version number to 1.3.3.99.
-
-== Version 1.3.3 ==
-
-2003-04-29 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: 1.3.3.
-
-2003-04-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * NEWS: Updated for mailer fixes
-
-2003-04-28 Rodney Dawes <dobey@ximian.com>
-
- * data/cde_app_root/: Use $(privdatadir) instead of
- $(prefix)/share/evolution-$(BASE_VERSION) for the cde stuff
-
-2003-04-21 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: Fix KDE_APPLNK_DIR to not install to a diff prefix,
- and disable installing the file to the KDE applnk path by default
-
-2003-04-11 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: 1.3.2.99.
-
-== Version 1.3.2 ==
-
-2003-04-08 Dan Winship <danw@ximian.com>
-
- * tools/Makefile.am (EXTRA_DIST): Fix
-
-2003-04-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Oops, don't use a == when comparing strings in
- shell.
-
-2003-04-07 Chris Toshok <toshok@ximian.com>
-
- * tools/Makefile.am (privlibexec_PROGRAMS): remove
- evolution-addressbook-export.
-
- * tools/evolution-addressbook-export.c: nuke.
-
-2003-04-07 Chris Toshok <toshok@ximian.com>
-
- * configure.in: add addressbook/tools/Makefile to AC_OUTPUT.
-
-2003-04-07 Dan Winship <danw@ximian.com>
-
- * tools/Makefile.am (privlibexec_SCRIPTS, privlibexec_PROGRAMS):
- Install these in privlibexecdir, not privdatadir. Move killev from
- SCRIPTS to PROGRAMS.
- (killev_SOURCES, killev_LDADD): Add
-
- * tools/killev.c: New C port of killev, since
- "bonobo-activation-query" does not return as much information as
- "oaf-client" did. Also has prettier output. (Still shells out to
- killall/pkill to do the actual killing.)
-
- * tools/killev: Gone
-
- * tools/evolution-move-tasks: Removed since the evolution-calendar
- code that called it is also gone now.
-
-2003-04-07 Not Zed <NotZed@Ximian.com>
-
- * NEWS: Updated for mail/camel/composer/filter for 1.3.2
-
-2003-04-06 Christophe Merlet <redfox@redfoxcenter.org>
-
- * data/Makefile.am: Create $(DESTDIR)$(kdedeskdopdir).
-
-2003-04-04 Chris Toshok <toshok@ximian.com>
-
- * acinclude.m4 (EVO_LDAP_CHECK): bleah, add "" in for the "no"
- case in with_static_ldap.
-
-2003-04-03 Chris Toshok <toshok@ximian.com>
-
- * acinclude.m4 (EVO_LDAP_CHECK): the existence of libldap.la
- should have no bearing on whether or not we try to statically link
- ldap.
-
-2003-03-29 Duarte Loreto <happyguy_pt@hotmail.com>
-
- * AUTHORS: Added myself as new Portuguese translator.
-
-2003-03-28 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Ported check for "killall" vs. "killp" back from
- 1.2.
-
-2003-03-28 Ettore Perazzoli <ettore@ximian.com>
-
- * data/Makefile.am: Fix installation of the .desktop file.
-
-2003-03-27 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Add gal-2.0 to the list of packages to determine
- WOMBAT_CFLAGS and WOMBAT_LIBS.
-
-2003-03-26 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Autogen help/Makefile.
-
- * Makefile.am (SUBDIRS): Add help. [#38234]
-
-2003-03-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Fixed Heimdal include path.
-
-2003-03-25 Rodney Dawes <dobey@ximian.com>
-
- * data/evolution.desktop.in: Fix 39901 and 40233
-
-2003-03-21 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: Fix the mit krb5+krb4 check to work with --without-kr5
-
-2003-03-19 Ettore Perazzoli <ettore@ximian.com>
-
- * README: Updated considerably.
-
-2003-03-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Fixed a type-o in the krb5 checks.
-
-2003-03-19 Not Zed <NotZed@Ximian.com>
-
- * configure.in (CAMEL_*, E_UTIL_*, ): Add gthread-2.0, to get any
- thread-specific flags (like -D_REENTRANT). Duh. For #39886.
- (LIBIBEX*): Removed old libibex stuff.
-
-2003-03-14 Chris Toshok <toshok@ximian.com>
-
- * tools/evolution-addressbook-export.c (save_cards): use
- bonobo_main_quit, and clean this up a bit.
-
-2003-03-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Added AC_C_INLINE - this should fix bug #39171.
-
-2003-03-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Fix kerberos include paths.
-
-2003-03-05 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Update version number to 1.3.1.99.
-
-== Version 1.3.1 ==
-
-2003-02-28 Dan Winship <danw@ximian.com>
-
- * tools/Makefile.am (evolution_launch_composer_LDADD): Fix
- dependencies
-
-2003-02-28 Hans Petter Jansson <hpj@ximian.com>
-
- * configure.in: Add calendar/importers/Makefile to output.
-
-2003-02-27 Chris Toshok <toshok@ximian.com>
-
- * tools/.cvsignore: ignore some stuff, yo.
-
- * tools/Makefile.am: add in the evolution-launch-composer stuff.
-
- * tools/evolution-launch-composer.c: port this from the 1.2 branch.
-
-2003-02-27 JP Rosevear <jpr@ximian.com>
-
- * configure.in: export gnome-pilot cflags
-
-2003-02-21 Dan Winship <danw@ximian.com>
-
- * libversit/Makefile.am: Make this a shared library to prevent
- linking portability problems
-
- * tools/Makefile.am (evolution_addressbook_import_LDADD): cleanup
-
-2003-02-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in (ENABLE_IPv6): AC_DEFINE() ENABLE_IPv6 if it should
- be enabled.
-
-2003-02-07 Rodney Dawes <dobey@ximian.com>
-
- * data/Makefile.am: Fix installation of desktop/mime files
-
-2003-02-06 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Add fr to ALL_LINGUAS again.
-
-2003-02-06 Rodney Dawes <dobey@ximian.com>
-
- * configure.in: Fix KRB4_CFLAGS to work correctly
- * data/Makefile.am: Fix desktop file installation path
- * data/evolution.desktop.in: Use correct binary and categories, add
- StartupNotify=1 also, for startup-notification-enabled systems
-
-2003-02-06 Dan Winship <danw@ximian.com>
-
- * configure.in: export priv*dir for libical's configure to use.
-
- * evolution-addressbook.pc.in (Libs): Remove -L${libdir}.
- (CFlags): s/includedir/privincludedir/
-
- * evolution-calendar.pc.in: Likewise
-
- * evolution-shell.pc.in: Likewise. Also change iconsdir to
- imagesdir
-
- * sounds/Makefile.am: remove soundsdir def
-
- * tools/Makefile.am: subst in $(toolsdir) instead of $(bindir)
-
- * tools/evolution-addressbook-clean.in:
- s/EVOLUTION_BINDIR/EVOLUTION_TOOLSDIR/
-
- * tools/evolution-addressbook-abuse.c (main):
- s/PACKAGE/GETTEXT_PACKAGE/ in gettext init
- * tools/evolution-addressbook-export.c (main): Likewise
- * tools/evolution-addressbook-import.c (main): Likewise
-
-2003-02-05 Dan Winship <danw@ximian.com>
-
- * configure.in: Define and AC_SUBST privlibexecdir, privdatadir,
- privincludedir, serverdir, evolutionuidir, imagesdir, buttonsdir,
- soundsdir, gladedir, etspecdir, and viewsdir.
-
- * data/Makefile.am (dtappintegrate, dtappunintegrate): use
- privdatadir
-
-2003-02-04 Dan Winship <danw@ximian.com>
-
- * configure.in: Update AC_DEFINEs to use the new syntax to make
- acconfig.h unnecessary. (Remove unneeded HAVE_KDE_APPLNK define).
- Call GNOME_COMPILE_WARNINGS and add $WARN_CFLAGS to CFLAGS to get
- back to the evo 1.2 behavior of defaulting to -Wall everywhere.
- Fix up privlibdir definition to avoid undefined variables in
- evolution-shell.pc.
-
- * acinclude.m4: Update AC_DEFINE
-
- * acconfig.h: Gone
-
-2003-02-03 Chris Toshok <toshok@ximian.com>
-
- * configure.in (EVOLUTION_MAIL): add gnome-vfs-module-2.0 to the
- deps so we pick up the right include path.
-
-2003-02-03 Chris Toshok <toshok@ximian.com>
-
- * configure.in: remove the --enable-shlib-components stuff.
-
-2003-01-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in (HAVE_KRB5): Updated to add gssapi libs, since this
- is what we use krb5 for :-)
-
-2003-01-28 Rodney Dawes <dobey@ximian.com>
-
- * tools/Makefile.am (EXTRA_DIST): s/bin_SCRIPTS/tools_SCRIPTS/
-
-2003-01-27 Ettore Perazzoli <ettore@ximian.com>
-
- * tools/evolution-addressbook-export.c: #include bonobo-activation
- instead of oaf.
- (main): Initialize using gnome_program_init().
- (save_cards): Use g_main_loop_quit() instead of gtk_exit().
-
- * tools/evolution-addressbook-import.c: Update include list for
- GNOME 2.
- (main): Initialize using gnome_program_init().
- (unref_executable): Use g_main_loop_quit() instead of gtk_exit().
- (add_cb): Likewise.
-
- * tools/evolution-addressbook-abuse.c: Update include list for
- GNOME 2.
- (main): Initialize using gnome_program_init().
- (use_addressbook): Use g_object_unref() instead of
- gtk_object_unref().
- (main): Use g_timeout_add() instead of gtk_timeout_add().
- (add_cb): Use g_main_loop_quit() instead of gtk_exit().
-
- * configure.in (AC_SUBST): Add tools/Makefile.
-
- * Makefile.am (SUBDIRS): Add tools/ back into the list.
-
- * tools/Makefile.am: Install everything in
- $(datadir)/evolution-$(BASE_VERSION)/tools.
- (INCLUDES): Add the defines that gnome_program_init() likes and
- also add the _DISABLE_DEPRECATED stuff.
-
-2003-01-26 Chris Toshok <toshok@ximian.com>
-
- * configure.in (AC_OUTPUT): add in the conduit Makefile's.
-
-2003-01-26 Chris Toshok <toshok@ximian.com>
-
- * configure.in: only do the CONDUIT_CFLAGS/LIBS stuff if pilot
- conduits have been enabled.
-
-2003-01-26 Chris Toshok <toshok@ximian.com>
-
- * configure.in: in the --enable-pilot-conduits stanza, use
- PKG_CHECK_MODULES to get the gnome-pilot-2.0 (and therefore
- pilot-link) cflags/libs before doing our utf-8 check. also,
- enable the addressbook/calendar CONDUIT_{CFLAGS/LIBS} variables.
-
-2003-01-24 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in (evolutionuidir): Define iconsdir.
-
-2003-01-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in (FULL_GNOME_DEPS): Doh. Use the
- MANUAL_[NSPR,NSS]_[CFLAGS,LIBS] variables where appropriate.
-
-2003-01-23 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in (idldir): Define componentdir instead of
- COMPONENT_DIR. Set it to $privlibdir/components instead of
- $libdir/evolution-$(BASE_VERSION)/components.
-
-2003-01-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in (MOZILLA_NSS): Simplify the whole process into
- about 8 lines by using pkg-config.
-
-2003-01-22 Ettore Perazzoli <ettore@ximian.com>
-
- * data/Makefile.am: For now, do not install the evolution.1
- manpage. Install all the other files with a -$(BASE_VERSION)
- suffix.
- (dtappintegrate): Update for the new location of cde_app_root.
- (dtappunintegrate): Likewise.
-
- * data/cde_app_root/dt/appconfig/appmanager/C/Ximian/Makefile.am
- (cdeappmanagerdir): Version using $(BASE_VERSION).
- * data/cde_app_root/dt/appconfig/types/C/Makefile.am
- (cdetypesdir): Likewise.
- * data/cde_app_root/dt/appconfig/icons/C/Makefile.am
- (cdeiconsdir): Likewise.
-
- * sounds/Makefile.am (soundsdir): Version using $(BASE_VERSION).
-
- * configure.in: Define BASE_VERSION. Set idldir to
- $datadir/idl/evolution-$BASE_VERSION instead of just
- $datadir/idl/evolution.
-
-2003-01-14 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in (ALL_LINGUAS): Remove fr for now, since it doesn't
- seem to work.
- (AC_OUTPUT): Remove calendar/importers/Makefile for now.
-
-2003-01-14 Rodney Dawes <dobey@ximian.com>
-
- * Makefile.am (EXTRA_DIST): intltool, not xml-i18n-tools
-
-2003-01-07 Dan Winship <danw@ximian.com>
-
- * Makefile.am (SUBDIRS): add po
-
- * configure.in: Move ALL_LINGUAS definition to before
- AM_GLIB_GNU_GETTEXT, or else no linguas for you!
-
-2003-01-06 Dan Winship <danw@ximian.com>
-
- * configure.in (AC_INIT): Use "Evolution", not "evolution", since
- that becomes the value of the PACKAGE variable
- (privlibdir): parse $VERSION by hand since.
- EVOLUTION_MAJOR_VERSION, etc aren't defined any more (and trying
- to pass a variable to AC_INIT won't work). This and the above
- change fix the problem that privlibdir was being defined as
- "${libdir}/Evolution/." instead of "${libdir}/evolution/1.3"
- (GAL_VERSION): AC_SUBST this since it's needed in the .pc files
- (idldir): define this here rather than in each Makefile.am that
- needs it.
- (AC_OUTPUT): Add .pc files
-
- * Makefile.am (pkgconfig_DATA): Add pc files.
- (confexec_DATA): Remove this (fooConf.sh files)
- (SUBDIRS): Move filter earlier in the build. (I think it was
- calendar that depends on it now?)
- (%Conf.sh): Remove this. The .pc files are output by configure.in
- now.
-
- * camel.pc.in, evolution-addressbook.pc.in,
- evolution-calendar.pc.in, evolution-shell.pc.in: Replace the
- *Conf.sh files with these. In addition to the basic variables,
- include camel_providerdir (in camel.pc) and idldir, IDL_INCLUDES
- and privlibdir (in the others).
-
-2002-12-04 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Define COMPONENT_DIR.
-
-2002-11-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Add NSPR CFLAGS and LDFLAGS to the E_UTIL build
- flags.
-
-2002-11-20 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: AC_OUTPUT(my-evolution/Makefile).
-
-2002-11-20 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (changelogs): Add my-evolution.
-
-2002-11-20 Not Zed <NotZed@Ximian.com>
-
- * libibex/*: cvs removed it all. Not much use having it around
- anymore.
-
-2002-11-19 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Check for gconftool-2, and added
- AM_GCONF_SOURCE_2.
-
-2002-11-18 Not Zed <NotZed@Ximian.com>
-
- * configure.in: Added back IMPORTERS_CFLAGS and
- mail/importers/Makefile
-
-2002-11-16 Chris Toshok <toshok@ximian.com>
-
- * configure.in: we require >= 0.0.9.99 of gal.
-
-2002-11-15 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Set up the my-evolution flags properly, do not
- AC_SUBST GNOME_Evolution_Mail.server.in.
-
-2002-11-13 Not Zed <NotZed@Ximian.com>
-
- * Makefile.am (SUBDIRS): re-added filter, mail, composer
-
- * configure.in: Added EVOLUTION_MAIL settings, and mail/makefile.
-
-2002-11-11 Joe Shaw <joe@ximian.com>
-
- * Makefile.am (SUBDIRS): remove tools for now, it's not in
- configure.in.
-
-2002-11-11 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am (SUBDIRS): add addressbook.
-
-2002-11-08 Chris Toshok <toshok@ximian.com>
-
- * configure.in: add some more addressbook paths.
-
-2002-11-08 Not Zed <NotZed@Ximian.com>
-
- * configure.in: Added composer/Makefile & gtkhtml-3.0 deps.
-
-2002-11-07 Chris Toshok <toshok@ximian.com>
-
- * configure.in (AC_OUTPUT): GNOME_Evolution_Summary.oaf.in = >
- GNOME_Evolution_Summary.server.in
-
-2002-11-07 JP Rosevear <jpr@ximian.com>
-
- * configure.in: update e-util and calendar compile flags
-
-2002-11-07 Rodrigo Moya <rodrigo@ximian.com>
-
- * configure.in: added libgnome-2.0 to camel requirements.
-
-2002-11-06 Chris Toshok <toshok@ximian.com>
-
- * configure.in: add some more addressbook dirs to AC_OUTPUT.
-
-2002-11-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Re-enable the filter cflags/libs stuff.
-
-2002-11-05 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am (SUBDIRS): add wombat.
-
-2002-11-05 Chris Toshok <toshok@ximian.com>
-
- * configure.in: add wombat and addressbook compile flags, and add
- wombat and some addressbook dirs to AC_OUTPUT.
-
-2002-11-05 Dan Winship <danw@ximian.com>
-
- * configure.in: change the commented-out soup check to refer to
- the new soup 2.0 in the libsoup module
-
-2002-11-05 Rodrigo Moya <rodrigo@ximian.com>
-
- * configure.in: use correct libgtkhtml-3.0 for calendar and added
- generation of calendar GUI's directories.
-
-2002-11-05 Rodrigo Moya <rodrigo@ximian.com>
-
- * configure.in: enabled libwombat.
-
-2002-11-04 Rodrigo Moya <rodrigo@ximian.com>
-
- * configure.in:
- * Makefile.am: added libversit directory to build.
-
-2002-11-04 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (SUBDIRS): Add shell.
-
-2002-11-04 Rodrigo Moya <rodrigo@ximian.com>
-
- * configure.in: added calendar/idl/Makefile to AC_OUTPUT
-
-2002-11-04 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Add an AM_GLIB_GNU_GETTEXT.
-
-2002-11-03 Rodrigo Moya <rodrigo@ximian.com>
-
- * configure.in:
- * Makefile.am: re-added calendar component (only non-UI stuff).
-
- * data/Makefile.am: use intltools instead of xml-i18n-tools.
-
-2002-11-03 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: AC_PROG_INTLTOOL instead of
- AM_PROG_XML_I18N_TOOLS.
-
-2002-11-01 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Update to use Autoconf 2.53. Remove checks for
- scrollkeeper. Remove intl/Makefile and macros/Makefile from
- AC_OUTPUT list. Set up GETTEXT_PACKAGE. Removed
- AM_ACLOCAL_INCLUDE(macros). Added AM_PATH_ORBIT2.
- (EVO_SET_COMPILE_FLAGS): Use PKG_CHECK_MODULES.
- (IDL_INCLUDES): New, -I params to pass to $(ORBIT_IDL) when
- compiling IDL files into stubs.
-
- * autogen.sh: Changed to use gnome-autogen.sh.
-
-2002-10-30 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: 1.1.90.99.
-
-== Version 1.1.90 (Release Candidate 1) ==
-
-2002-10-28 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: gal 0.21, GtkHTML 1.1.5.
-
-2002-10-23 Chris Toshok <toshok@ximian.com>
-
- * configure.in: Update dep for GAL to 0.21.0.
-
-2002-10-07 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Update version number to 1.1.2.99.
-
-== Version 1.1.2 ==
-
-2002-10-07 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: 1.1.2. Update deps for GAL and GtkHTML.
-
-2002-09-27 gettextize <bug-gnu-gettext@gnu.org>
-
- * Makefile.am (SUBDIRS): Add m4.
- (ACLOCAL_AMFLAGS): New variable.
- (EXTRA_DIST): Add config.rpath.
- * configure.in (AC_OUTPUT): Add po/Makefile.in, m4/Makefile.
-
-2002-09-23 Radek Doulik <rodo@ximian.com>
-
- * configure.in: use pkg-config for gtkhtml
-
-2002-09-23 JP Rosevear <jpr@ximian.com>
-
- * configure.in: fix kde applnk test to not test for things if
- disabled
-
- * configure.in: Fix up mozilla tests and allow static linking of
- nss/nspr (Frank Belew <frb@ximian.com>)
-
-2002-09-23 Aaron Weber <aaron@ximian.com>
-
- * README: Update URLs for mailing lists, Evolution application
- page, help information. Remove note that Evolution is beta. In
- general, changes to the "soft" data. Also, jeff's commit to this
- file from 2001-11-21 seems to have been lost, so I re-removed the
- stuff he took out. And changed libnspr to mozilla-nspr, and
- libnss3 to mozilla-nss.
-
- * data/evolution.1: Update with information about where the real
- help is. Clarify example formatting.
-
-2002-09-16 Ettore Perazzoli <ettore@ximian.com>
-
- * data/cde_app_root/Makefile.am: New.
- * data/cde_app_root/dt/Makefile.am: New.
- * data/cde_app_root/dt/appconfig/Makefile.am: New.
- * data/cde_app_root/dt/appconfig/appmanager/Makefile.am: New.
- * data/cde_app_root/dt/appconfig/appmanager/C/Makefile.am: New.
- * data/cde_app_root/dt/appconfig/appmanager/C/Ximian/Makefile.am: New.
- * data/cde_app_root/dt/appconfig/icons/Makefile.am: New.
- * data/cde_app_root/dt/appconfig/icons/C/Makefile.am: New.
- * data/cde_app_root/dt/appconfig/types/Makefile.am: New.
- * data/cde_app_root/dt/appconfig/types/C/Makefile.am: New.
-
- * configure.in: Add a `--with-cde-path' option. Check for
- dtappintegrate in that path. Define HAVE_DTAPPINTEGRATE and
- GNOME_PREFIX. Also, generate
- data/cde_app_root/dt/appconfig/types/C/Ximian.dt.in and
- shell/evolution-nognome.
-
-2002-09-12 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: 1.1.1.99.
-
-2002-09-11 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (SUBDIRS): Put po on the top.
-
-== Version 1.1.1 ==
-
-2002-09-09 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: 1.1.1. Also bump some requirements.
-
- * README: Update according to the new requirements.
-
-2002-09-06 Larry Ewing <lewing@ximian.com>
-
- * NEWS: update with some gtkhtml features.
-
-2002-09-05 Ettore Perazzoli <ettore@ximian.com>
-
- * NEWS: Updated with the new 1.2 features (unfinished).
-
- * NEWS-1.0: New, contains the changes up to version 1.0.8.
-
-2002-09-04 Dan Winship <danw@ximian.com>
-
- * acinclude.m4 (EVO_CHECK_TIMEZONE): Remove this from here.
-
- * configure.in: Put it here. (Connector no longer needs to share
- it). Also, check "tm_gmtoff" before "timezone", and if we have
- "timezone", check for "altzone" too.
-
- * acconfig.h: Add HAVE_ALTZONE
-
-2002-08-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: e-util now requires soup and gconf flags.
-
-2002-08-12 Dan Winship <danw@ximian.com>
-
- * tools/evolution-addressbook-import.c (main): Use default book,
- not local one.
-
- * tools/evolution-addressbook-export.c (main): Likewise.
-
- * tools/evolution-addressbook-abuse.c (abuse_timeout): Likewise.
-
-2002-08-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * README: Update required gal and gtkhtml dependency information.
-
-2002-08-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in (THREADS_CFLAGS): Need to check for gal 0.19.99.18
- for e_xml_save_file().
-
-2002-08-01 Ettore Perazzoli <ettore@ximian.com>
-
- * README: Update Soup information and remove hard spaces.
-
- * configure.in: Check for Soup 0.7 or later. [Hm, we should make
- sure that it's actually a 0.7.x version.]
-
-2002-07-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Add checks for IPv6 support.
-
-2002-07-30 Not Zed <NotZed@Ximian.com>
-
- * configure.in (EVOLUTION_MAIL): added soup to compile flags.
-
-2002-07-24 Ettore Perazzoli <ettore@ximian.com>
-
- [Patch by Frank Belew <frb@ximian.com>.]
-
- * configure.in: If no --with-kde-applnk-path is given, try to
- detect the directory using `kde-config'.
-
-2002-07-22 Dan Winship <danw@ximian.com>
-
- * acinclude.m4: Move EVO_CHECK_LIB into here, and also create
- EVO_PURIFY_SUPPORT, EVO_TIMEZONE_CHECK, and EVO_LDAP_CHECK from
- stuff in configure.in. (This stuff is also used by Connector.)
-
- * configure.in: Remove the stuff that was moved to acinclude.m4.
-
- * evolution_addressbookConf.sh.in: Remove db3 and ldap references
- since pas-backend-file and pas-backend-ldap are no longer in
- libpas, and those flags weren't doing anything useful here before
- anyway. (Our attempts to force static linking to those libraries
- end up getting mangled when passed through gnome-config.)
-
- * evolution_calendarConf.sh.in: Likewise, remove db3 references.
-
-2002-07-22 Dan Winship <danw@ximian.com>
-
- * configure.in: Check if we're trying to build with the old
- libversit module borrowed from gnome-pim instead of our own new
- one, and refuse to build if so.
-
- * libversit/Makefile.am: Remove libversit.la stuff since we don't
- want it and it messes up the build slightly.
-
-2002-07-18 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Prepend "$(WERROR)" to all the *_CFLAGS variables
- so you can do `make WERROR=-Werror' to turn all compiler warnings
- into errors.
-
-2002-07-09 Peter Williams <peterw@ximian.com>
-
- * libversit/Makefile.am (privlib_LIBRARIES): Install libversit.a so
- that people compiling against the addressbook can do so successfully.
-
- * Makefile.am: create our *Conf.sh files and dist them and install
- them.
-
- * configure.in: Define and subst some variables that the Conf.sh
- file need.
-
-2002-07-10 Peter Williams <peterw@ximian.com>
-
- * configure.in (privlibdir): Define a versioned library directory
- that we can use for things that are ABI-sensitive: camel
- providers, importers... Define camel_providerder in terms of this,
- resulting in a new location for the providers. Camel will have to
- be rebuilt for it to get the new -D flag.
-
-2002-07-12 Peter Williams <peterw@ximian.com>
-
- * configure.in (E_UTIL_LIBS): e-util relies on bonobo-conf
- in e-passwords.c and e-categories-master-list-wombat.c, so
- reflect that here. And the e-port code needs THREADS_LIBS.
-
-2002-07-09 Peter Williams <peterw@ximian.com>
-
- * tools/Makefile.am (INCLUDES): Add include lines to get
- ebook headers relative to <ebook/foo.h>, not "foo.h".
-
-2002-07-09 <jpr@ximian.com>
-
- * configure.in: re-order nss and nspr flags
-
-2002-07-03 Peter Williams <peterw@ximian.com>
-
- * README: Fix the URL for the DB 3.1.17 package; it's moved.
-
-2002-06-28 Ettore Perazzoli <ettore@ximian.com>
-
- [As suggested by #24466.]
-
- * data/evolution.desktop.in (Categories): Added.
-
-2002-06-27 Dan Winship <danw@ximian.com>
-
- * libversit/Makefile.am: Hack around a libtool/make problem that
- was causing libversit.a to be rebuilt at "make install" time,
- causing further relinking down the line.
-
-2002-06-18 JP Rosevear <jpr@ximian.com>
-
- * configure.in: check for libsoftokn3 if we couldn't link the
- first time
-
-2002-06-14 Chris Toshok <toshok@ximian.com>
-
- * libversit/vobject.c (unUseStr): fix a braindead typo that caused
- us to leak strings in certain circumstances (when the string being
- freed was second in the list, the head of the list would get
- lost.)
-
-2002-06-05 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Changed the required version of gal to 0.19.99.17.
-
-2002-06-04 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Changed the required version of gal to 0.19.99.16.
-
-2002-06-02 Larry Ewing <lewing@ximian.com>
-
- * configure.in: require gtkhtml-1.1.1.1 aka multicite branch.
-
-2002-05-14 Dan Winship <danw@ximian.com>
-
- * data/evolution.1: Document "evolution default:mail"
-
-2002-05-08 Ettore Perazzoli <ettore@ximian.com>
-
- * README: Add an explanation/warning about why we want Berkeley DB
- 3.1.17 and nothing else.
-
-2002-04-28 Larry Ewing <lewing@ximian.com>
-
- * configure.in: require gtkhtml-1.1.1.
-
-2002-04-29 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in (EVO_CHECK_LIB): Bumped the required version number
- of gal to 0.19.99.15.
-
-2002-04-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Don't generate libibex/Makefile anymore.
-
- * Makefile.am: Removed libibex from SUBDIRS.
-
- * tools/Makefile.am: Don't link with libibex.
-
- * tests/Makefile.am: Same here.
-
-2002-04-22 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Require gal 0.19.99.14.
-
-2002-04-17 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Require GAL 0.19.99.13.
-
-2002-04-17 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Bumped required gal version number to 0.19.99.12.
-
-2002-04-17 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Bumped required gal version number to 0.19.99.11.
-
-2002-04-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Add checks for gethostbyaddr_r
-
-2002-04-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Check for socklen_t and if it doesn't exist,
- define it as unsigned int.
-
-2002-04-04 JP Rosevear <jpr@ximian.com>
-
- * configure.in: Fix static linking on solaris which doesn't have a
- static libresolv.
-
-2002-04-01 Chris Toshok <toshok@ximian.com>
-
- * libversit/vobject.c (newStrItem): only include if USE_STRTBL is
- defined.
- (deleteStrItem): same.
- (hashStr): same.
- (lookupStr): if USE_STRTBL is defined, use existing behavior. if
- not defined, just dup the string.
- (unUseStr): if USE_STRTBL is defined, use existing behavior. if
- not defined, just free the string.
-
-2002-04-01 Dan Winship <danw@ximian.com>
-
- Darwin/OS X portability from Max Horn <max@quendi.de>
-
- * libversit/vcc.y: Remove #include <malloc.h>.
-
- * libversit/vobject.c: Likewise, and #include <stdlib.h>
-
-2002-03-30 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Add argument `--enable-shlib-components'. New
- substitutions OAF_SHLIB_LOCATION, OAF_SHLIB_PREFIX,
- OAF_SHLIB_SUFFIX.
-
-2002-03-29 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Check for GConf. Add gthreads to LIBIBEX_CFLAGS
- and LIBIBEX_LIBS.
-
-2002-03-28 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Bumped the required version of gal to 0.19.99.10.
-
-2002-03-24 Peter Williams <peterw@ximian.com>
-
- * tools/killev: Change the OAFIID for the GtkHTML editor to
- have :1.1 at the end.
-
-2002-03-19 Dan Winship <danw@ximian.com>
-
- * tools/Makefile.am (evolution_addressbook_import_LDADD):
- s/libversit.la/libversit.a/
-
-2002-03-13 Chris Toshok <toshok@ximian.com>
-
- * configure.in (EVOLUTION_ADDRESSBOOK_DEPS): add gal.
-
-2002-03-12 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Bumped the required version of gal.
-
-2002-03-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Allow the user to enable OpenSSL over Mozilla NSS
- using --enable-openssl or --disable-nss.
-
-2002-02-24 jacob berkman <jacob@ximian.com>
-
- * sounds/Makefile.am (EXTRA_DIST): add $(sounds_DATA)
-
-2002-02-22 Larry Ewing <lewing@ximian.com>
-
- * configure.in: add libglade the to the E_UTIL flags.
-
-2002-02-13 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Bumped the required version of gal.
-
-2002-02-12 Tõivo Leedjärv <leedjarv@interest.ee>
-
- * configure.in: Added et to ALL_LINGUAS.
-
-2002-02-09 JP Rosevear <jpr@ximian.com>
-
- * configure.in: make sure PISOCK cflags are added where
- appropriate
-
-2002-02-08 Damon Chaplin <damon@ximian.com>
-
- * Makefile.am (SUBDIRS): added sounds.
-
- * configure.in (AC_OUTPUT): added sounds/Makefile.
-
- * sounds/Makefile.am: new file.
- * sounds/default_alarm.wav: default alarm sound, currently only used
- when vCalendar files are imported with audio alarms. We need a better
- sound.
-
-2002-02-07 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Bumped the required version of gal.
-
-2002-01-28 Radek Doulik <rodo@ximian.com>
-
- * configure.in: added bonobo to filter flags to avoid compile
- error
-
-2002-01-27 Ettore Perazzoli <ettore@ximian.com>
-
- * tools/Makefile.am: Use GNOME_FULL_LIBS and GNOME_FULL_CFLAGS.
-
- * configure.in: Define the CAMEL_{CFLAGS,LIBS} using
- EVO_SET_COMPILE_FLAGS. Likewise define E_UTIL_{CFLAGS,LIBS},
- E_NAME_{CFLAGS,LIBS}, SHELL_{CFLAGS,LIBS},
- IMPORTERS_{CFLAGS,LIBS}, WOMBAT_{CFLAGS,LIBS} and
- E_WIDGETS_{CFLAGS,LIBS}, LIBFILTER_{CFLAGS,LIBS}. Remove
- GAL_{LIBS,CFLAGS}. Add GNOME_FULL_{CFLAGS,LIBS}. Also, move all
- this stuff after OpenSSL check so they benefit from all the
- cflags/ldflags discoveries for the support libraries.
-
-2002-01-25 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Require gal 0.19.99.1.
-
-2002-01-24 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Define a new macro EVO_SET_COMPILE_FLAGS. Define
- EVOLUTION_ADDRESSBOOK_CFLAGS, EVOLUTION_ADDRESSBOOK_LIBS,
- EVOLUTION_ADDRESSBOOK_CONDUIT_CFLAGS,
- EVOLUTION_ADDRESSBOOK_CONDUIT_LIBS, EVOLUTION_SUMMARY_LIBS,
- EVOLUTION_SUMMARY_CFLAGS, EVOLUTION_CALENDAR_LIBS,
- EVOLUTION_CALENDAR_CFLAGS, EVOLUTION_CALENDAR_CONDUIT_LIBS,
- EVOLUTION_CALENDAR_CONDUIT_CFLAGS through it. Remove SOUP_CFLAGS
- and SOUP_LIBS.
-
-2002-01-15 Iain Holmes <iain@ximian.com>
-
- * configure.in: Add a check for libsoup. Define SOUP_CFLAGS and
- SOUP_LIBS
-
- * README: Update to include the SOUP dependancy.
-
-2002-01-04 Pablo Saratxaga <pablo@mandrakesoft.com>
-
- * configure.in: Added "eu" to ALL_LINGUAS
-
-2001-12-17 Dan Winship <danw@ximian.com>
-
- * configure.in (camel_providerdir): Define this here, using only
- EVOLUTION_MAJOR_VERSION and EVOLUTION_MINOR_VERSION (and not MICRO
- and NANO).
-
-2001-12-13 Chris Toshok <toshok@ximian.com>
-
- * configure.in: check for alloca.h.
-
-2001-12-12 Ettore Perazzoli <ettore@ximian.com>
-
- [Fix #16358, No man page for Evolution.]
-
- * data/Makefile.am (man_MANS): Install the man page.
-
- * data/evolution.1: New man page for Evolution.
-
-2001-12-10 JP Rosevear <jpr@ximian.com>
-
- * configure.in: use UTF-8 as the char set when testing pilot link
-
-2001-12-11 Ettore Perazzoli <ettore@ximian.com>
-
- * data/evolution.desktop.in (_Name): "Ximian Evolution", not
- "Evolution".
-
-2001-12-11 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Up VERSION to 1.1.0.99.
-
-2001-12-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: s/PREVIEW_VERSION/VERSION_COMMENT
-
-2001-12-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Add a AC_DEFINE for PREVIEW_RELEASE which is a
- string that will be appended to the X-Mailer header.
-
-2001-11-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * README: Updated. Don't say that the user needs to copy their
- mozilla database files into ~/evolution, since Evolution now
- builds it's own default database files if they don't exist and
- also remove instructions for building with OpenSSL.
-
- * acconfig.h: Remove HAVE_OPENSSL define
-
- * configure.in: Remove checks for OpenSSL libraries.
-
-2001-11-20 Wang Jian <lark@linux.net.cn>
-
- * configure.in(ALL_LINGUAS): Re-Added zh_CN. It is checked
- against gettext 0.10.40 and 0.10.35 without any problem.
- Please contact me if anyone wants to disable it (AGAIN).
-
-2001-11-19 Abel Cheung <maddog@linuxhall.org>
-
- * configure.in: I will keep adding zh_TW to ALL_LINGUAS before
- somebody is willing to tell me why it is deleted without
- reason. It was checked against newest gettext (0.10.40) and
- older gettext (0.10.35) without any problem. A few
- translations are not removed from ALL_LINGUAS even though
- they failed in msgfmt checking.
-
-2001-11-14 Ettore Perazzoli <ettore@ximian.com>
-
- * README: Updated.
-
- * configure.in: 0.99.2. Require gtkhtml 0.16.1 and GAL 0.18.1.
-
-2001-11-14 Ettore Perazzoli <ettore@ximian.com>
-
- * NEWS: Redone with the bug #s from Bugzilla.
-
-2001-11-14 Federico Mena Quintero <federico@ximian.com>
-
- * NEWS: Calendar/tasks NEWS.
-
-2001-11-13 JP Rosevear <jpr@ximian.com>
-
- * configure.in: restore cflags and ldflags properly
-
-2001-11-12 JP Rosevear <jpr@ximian.com>
-
- * configure.in: save the ldflags properly
-
-2001-11-09 JP Rosevear <jpr@ximian.com>
-
- * configure.in: Check to make sure pilot-link has the charset
- conversion stuff enabled
-
-2001-11-09 Ettore Perazzoli <ettore@ximian.com>
-
- * tools/killev: Chop the output from `uname -s'. Thanks to
- Michael Gerdts for suggesting the fix.
-
-2001-11-09 Abel Cheung <maddog@linux.org.hk>
-
- * configure.in: Re-added zh_TW to ALL_LINGUAS. Translator keep
- complaining to me, and waste a month before discovering it was
- disabled while I know nothing about it. Please at least complain
- to me if it's gettext problem.
-
-2001-11-06 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Up to 0.99.1 for snapshot purposes.
-
-2001-11-05 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Upgrade version number to 0.99.0. Require GtkHTML
- 0.16 and GAL 0.18.
-
-2001-11-05 JP Rosevear <jpr@ximian.com>
-
- * NEWS: Small update
-
-2001-11-05 Ettore Perazzoli <ettore@ximian.com>
-
- * NEWS: Updated.
-
-2001-10-31 Ettore Perazzoli <ettore@ximian.com>
-
- * data/evolution.desktop.in (Icon): evolution.png instead of
- evolution-icon.png.
-
-2001-10-31 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Update version to 0.17.100.
-
-2001-10-31 JP Rosevear <jpr@ximian.com>
-
- * NEWS (Conduits): update
-
-2001-10-30 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Add oaf to MAILER_CFLAGS and MAILER_LIBS too.
-
-2001-10-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * NEWS (Mailer): Updated mailer NEWS.
-
-2001-10-30 <NotZed@Ximian.com>
-
- * NEWS (Mailer): My mailer news.
-
-2001-10-30 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Add oaf to the BONOBO_VFS_GNOME_CFLAGS too.
-
-2001-10-30 Federico Mena Quintero <federico@ximian.com>
-
- * NEWS (Calendar): Calendar NEWS.
-
-2001-10-30 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Add oaf to the BONOBO_GNOME_LIBS,
- BONOBO_GNOME_CFLAGS, BONOBO_HTML_GNOME_LIBS,
- BONOBO_HTML_GNOME_CFLAGS.
-
-2001-10-30 Federico Mena Quintero <federico@ximian.com>
-
- * configure.in: Require GAL version 0.15.99.10. I know you all
- love this.
-
-2001-10-30 Radek Doulik <rodo@ximian.com>
-
- * configure.in: require gtkhtml version 0.15.99.2
-
-2001-10-29 Damon Chaplin <damon@ximian.com>
-
- * configure.in (ALL_LINGUAS): added en_AU (copied en_GB).
-
-2001-10-30 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Require gal 0.15.99.9.
-
-2001-10-30 <notzed@ximian.com>
-
- * configure.in: Move the configure version number check down
- a bit for gtkhtml/gal, c'ause i'm sick of fixing a manual
- patch i have every bloody time the version changes.
-
-2001-10-29 Joe Shaw <joe@ximian.com>
-
- * configure.in: Require gal 0.15.99.8
-
- * addressbook/backend/ebook/e-card-simple.c,
- addressbook/gui/component/addressbook-storage.c,
- addressbook/gui/widgets/e-addressbook-view.c,
- calendar/gui/e-calendar-table.c,
- calendar/gui/e-itip-control.c,
- calendar/gui/e-meeting-model.c,
- calendar/gui/itip-utils.c,
- calendar/gui/print.c,
- calendar/gui/alarm-notify/alarm-notify-dialog.c,
- filter/rule-editor.c,
- mail/mail-config.c,
- mail/mail-folder-cache.c,
- mail/mail-format.c,
- mail/mail-local.c,
- mail/mail-ops.c,
- mail/mail-vfolder.c,
- shell/e-local-storage.c,
- shell/e-summary-storage.c: Change includes of
- e-util/e-unicode-i18n.h to gal/util/e-unicode-i18n.h
-
- * e-util/Makefile.am: Don't build e-unicode-i18n.[ch] anymore.
-
-2001-10-29 Christopher James Lahey <clahey@ximian.com>
-
- * NEWS (Addressbook): Added my addressbook changes.
-
-2001-10-29 Ettore Perazzoli <ettore@ximian.com>
-
- * AUTHORS: Add Larry and Radek.
-
-2001-10-30 Radek Doulik <rodo@ximian.com>
-
- * configure.in: require gtkhtml version 0.15.99.1
-
-2001-10-29 Rodrigo Moya <rodrigo@ximian.com>
-
- * configure.in: added calendar/importers/Makefile
-
-2001-10-29 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Bumped required version of gal to 0.15.99.7.
-
-2001-10-28 JP Rosevear <jpr@ximian.com>
-
- * data/Makefile.am: no need to use destdir
-
-2001-10-27 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Bumped required version of gal to 0.15.99.6.
-
-2001-10-27 Dan Winship <danw@ximian.com>
-
- * configure.in: Change the help string on "--enable-nntp" to
- mention the fact that NNTP support is incomplete and unsupported.
- If the user doesn't pass --enable-nntp, don't mention NNTP at all
- in the summary at the end. Also, mention which SSL library is
- being used when SSL support is enabled, and don't mention anything
- about S/MIME since it doesn't work.
-
-2001-10-26 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: GAL 0.15.99.5.
-
-2001-10-26 Kevin Breit <mrproper@ximian.com>
-
- * AUTHORS: Updated my email address.
-
-2001-10-26 <NotZed@Ximian.com>
-
- * configure.in: Bump gal requirement.
-
-2001-10-23 Chris Toshok <toshok@ximian.com>
-
- * tools/killev: and add a way to get some more spew about the
- commands we're executing.
-
-2001-10-23 Chris Toshok <toshok@ximian.com>
-
- * tools/killev: use eq instead of ==.
-
-2001-10-23 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Bumped required GAL to 0.15.99.3 so EEntry's
- "draw_button" argument can be used in
- addressbook/gui/component/select-names/e-select-names.c.
-
-2001-10-22 Damon Chaplin <damon@ximian.com>
-
- * configure.in: bumped required GAL to 0.15.99.2.
-
-2001-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * acconfig.h: HAVE_KDE_APPLNK.
-
- * configure.in (EVO_CHECK_LIB): AC_DEFINE `HAVE_KDE_APPLNK' in the
- case in which the kde applnk dir is found. Also fix the logic
- with the checking so it doesn't get fooled.
-
-2001-10-22 JP Rosevear <jpr@ximian.com>
-
- * data/Makefile.am: include destdir in the path of the kde desktop
- installation dir
-
-2001-10-20 Ettore Perazzoli <ettore@ximian.com>
-
- * data/Makefile.am [HAVE_KDE_APPLNK]: Install `evolution.desktop'
- in the `KDE_APPLNK_DIR'.
-
- * configure.in: New option `--with-kde-applnk-path'. Define the
- `HAVE_KDE_APPLNK' Automake conditional, and the `KDE_APPLNK_DIR'
- value.
-
-2001-10-19 Dan Winship <danw@ximian.com>
-
- * tools/Makefile.am (EXTRA_DIST): Merge the two EXTRA_DIST
- declarations together so they both happen.
-
-2001-10-18 Chris Toshok <toshok@ximian.com>
-
- * tools/killev: use a new fangled perl script that queries oaf for
- interfaces we want to kill.
-
-2001-10-18 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Bumped the required version of gal to 0.15.99.1
- for use in evolution-addressbook-export.
-
- * tools/.cvsignore: Added evolution-addressbook-clean,
- evolution-addressbook-export, evolution-addressbook-import, and
- .libs.
-
- * tools/Makefile.am: Added evolution-addressbook-clean,
- evolution-addressbook-export, and evolution-addressbook-import.
-
- * tools/evolution-addressbook-clean.in: Main script to clean up
- the local contact database.
-
- * tools/evolution-addressbook-export.c: Exports the local
- addressbook to the specified file
- (--output-file). If no --output-file is given, writes out to a
- unique file in the /tmp directory. In either case, prints the
- filename to stdout.
-
- * tools/evolution-addressbook-import.c: Imports the specified file
- (--input-file) to the local addressbook.
-
-2001-10-18 Wang Jian <lark@linux.net.cn>
-
- * configure.in(ALL_LINGUAS): Added zh_CN for Simplified Chinese.
-
-2001-10-17 Christopher James Lahey <clahey@ximian.com>
-
- * NEWS (Addressbook): Wrote Addressbook news.
-
-2001-10-12 Chris Toshok <toshok@ximian.com>
-
- * tools/killev: kill evolution-ldif-importer.
-
-2001-10-11 Federico Mena Quintero <federico@ximian.com>
-
- * configure.in (AC_OUTPUT): Fix the order of the help/ subdirs.
- These must be sorted as a preorder walk for a tree!
-
-2001-10-10 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: 0.16.99.
-
-2001-10-10 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: 0.16. Require GtkHTML 0.15 or later and GAL 0.14
- or later. Also, make $with_nspr_includes default to
- `/usr/include/nspr' instead of `/usr/include/mozilla' and
- $with_nss_includes to `/usr/include/moznss' instead of
- `/usr/include/mozilla'.
-
-2001-10-10 Ettore Perazzoli <ettore@ximian.com>
-
- * NEWS: Added info about the shell, plus some minor fixes for
- consistency.
-
-2001-10-10 Christopher James Lahey <clahey@ximian.com>
-
- * NEWS (Addressbook): Updated.
-
-2001-10-09 Federico Mena Quintero <federico@ximian.com>
-
- * NEWS (Calendar): Calendar NEWS.
-
-2001-10-09 <NotZed@Ximian.com>
-
- * NEWS (Mailer): Updated for beta 6.
-
-2001-10-09 Rodrigo Moya <rodrigo@ximian.com>
-
- * configure.in: add libart to list of libraries to use in
- EXTRA_GNOME_CFLAGS/LIBS, which is needed for latest libart versions
-
-2001-10-09 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: AC_OUTPUT(default_user/local/Makefile) before
- AC_OUTPUT()ing the other subdirs of `default_user/local'. Fix
- pointed out by Dmitry G. Mastrukov <dmitry@fitmark.net>.
-
-2001-10-07 Dan Winship <danw@ximian.com>
-
- * configure.in: Remove movemail check, since it's not relevant any
- more.
-
-2001-10-05 Larry Ewing <lewing@ximian.com>
-
- * configure.in: Bumped required version of gtkhtml to 0.14.99.1
-
-2001-10-05 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Bumped required version of gal to 0.13.99.1.
-
-2001-10-01 Aaron Weber <aaron@ximian.com>
-
- * help/C/Makefile.am: removed an extraneous tab.
-
-2001-10-01 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: 0.15.99.
-
-2001-10-01 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: 0.15. Require gal 0.13 and gtkhtml 0.14.
-
-2001-10-01 Christopher James Lahey <clahey@ximian.com>
-
- * NEWS (Addressbook): Added more news.
-
-2001-09-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in (nspr_libs): Order the linkline to be the same as
- the order in Mozilla (it is suggested that they be in this order).
- (nss_libs): Same.
-
-2001-09-27 Dan Winship <danw@ximian.com>
-
- * configure.in: Remove references to the "compose" program, since
- that functionality went into the shell.
- (AC_OUTPUT): Sort and remove duplicates.
-
- * cmdline/*: gone
-
-2001-09-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Added a flag to enable pedantic PGP/MIME - this is
- not recommended for end-users. It is mostly meant for testing
- purposes.
-
-2001-09-26 Chris Toshok <toshok@ximian.com>
-
- * configure.in: make sure the solaris network libs get added to
- the LDAP link line before we test for openldap. Thanks to Frank
- Belew for finding this.
-
-2001-09-22 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Bumped the required version of gal to 0.12.99.0.
-
-2001-09-21 Nat Friedman <nat@ximian.com>
-
- * configure.in (EVOLUTION_MICRO_VERSION): Changed to 99.
- (VERSION): Added ".$EVOLUTION_MICRO_VERSION" suffix.
-
-2001-09-21 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Bump version to 0.14. Depend on gal >= 0.12,
- gtkhtml >= 0.13.
-
-2001-09-21 Michael Zucchi <NotZed@Ximian.com>
-
- * NEWS (Mail): Updated.
-
-2001-09-21 Christopher James Lahey <clahey@ximian.com>
-
- * NEWS (Addressbook): Added more NEWS items here.
-
-2001-09-19 JP Rosevear <jpr@ximian.com>
-
- * configure.in: Remove dead directory from AC_OUTPUT
-
-2001-09-16 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Updated required version of gal to 0.11.99.4.
-
-2001-09-14 JP Rosevear <jpr@ximian.com>
-
- * configure.in: remove unneeded conditionals
-
-2001-09-13 Yanko Kaneti <yaneti@declera.com>
-
- * configure.in (ALL_LINGUAS): Added bg to ALL_LINGUAS.
-
-2001-09-13 Larry Ewing <lewing@ximian.com>
-
- * data/evolution.mime: override the gnome-vfs.mime to match .vcf
- as text/x-vcard.
-
-2001-09-11 JP Rosevear <jpr@ximian.com>
-
- * configure.in: temporarily disable zh_TW
-
-2001-09-10 Abel Cheung <maddog@linux.org.hk>
-
- * configure.in: Added "zh_TW" to ALL_LINGUAS.
-
-2001-09-07 Dan Winship <danw@ximian.com>
-
- * configure.in: one-line OpenSSL fix from Yanko Kaneti
- <yaneti@declera.com>
-
-2001-09-05 Ettore Perazzoli <ettore@ximian.com>
-
- * README: Updated slightly.
-
-2001-09-04 Ettore Perazzoli <ettore@ximian.com>
-
- [Fixes by Neil Conway <neilconway@home.com, as per #8090.]
-
- * configure.in: Fix the error message if scrollkeeper is not found.
-
- * README: A bunch of minor fixes, tweaks and cleanups.
-
-2001-09-04 Ettore Perazzoli <ettore@ximian.com>
-
- [Fix #8089, Undocumented Scrollkeeper dependency.]
-
- * README: Add scrollkeeper 0.1.4 to the list of dependencies.
-
-2001-09-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Only check for OpenSSL if we were not able to find
- Mozilla's NSS libraries.
-
-2001-09-04 Peter Williams <peterw@ximian.com>
-
- * omf-install/Makefile.am (install-data-local): Don't put
- $(srcdir) in the file path twice.
-
-2001-09-01 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Bumped the required version of gal to 0.11.99.2.
-
-2001-08-31 Zbigniew Chyla <cyba@gnome.pl>
-
- * configure.in: Bumped required version of GAL to 0.11.3
- (for g_utf8_collate)
-
-2001-08-24 Ettore Perazzoli <ettore@ximian.com>
-
- [Patch from Nike Gerdts <michael.gerdts@usa.alcatel.com> for
- #6882, DB3_CFLAGS and DB3_LDFLAGS order messes up CPPFLAGS and
- LDFLAGS.]
-
- * configure.in: Put DB3_CFLAGS before the already-defined CPPFLAGS
- instead of after them; likewise, put DB3_LDADD before the already
- defined LDADD.
-
-2001-08-24 Dan Winship <danw@ximian.com>
-
- * configure.in: We don't need to check for both bonobo-conf 0.11
- AND bonobo-conf 0.2.
-
-2001-08-22 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: 0.13.99.
-
-2001-08-22 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Bump requirements to GAL 0.11, bonobo-conf 0.11,
- GtkHTML 0.12. Don't autogen
- `doc/devel/executive-summary/Makefile'. Bump version number to
- 0.13.
-
-2001-08-21 Ettore Perazzoli <ettore@ximian.com>
-
- * NEWS (Global): Added.
-
-2001-08-21 Christopher James Lahey <clahey@ximian.com>
-
- * NEWS (Addressbook): Updated NEWS for addressbook.
-
-2001-08-21 Peter Williams <peterw@ximian.com>
-
- * NEWS (Mail): Updated some more.
-
-2001-08-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * NEWS: Updated.
-
-2001-08-20 Jon Trowbridge <trow@ximian.com>
-
- * configure.in: Require gal 0.10.99.5.
-
-2001-08-19 Aaron Weber <aaron@ximian.com>
-
- *Makefile.am: added "help" to subdirs.
-
-2001-08-19 Chris Toshok <toshok@ximian.com>
-
- * omf-install/Makefile.am (scrollkeeper_localstate_dir) use
- $(SCROLLKEEPER_LOCALSTATE_DIR), and not something based on
- evolution's local state dir. this should fix the core dumps
- during install on freebsd and solaris.
-
- * configure.in (GLIB_CONFIG): use $GLIB_CONFIG if it's set,
- otherwise default to glib-config. a cheap solution to get this
- working on freebsd (where they have glib12-config, but not
- glib-config.) also, switch all `glib-config`s to `$GLIB_CONFIG`.
- (SCROLLKEEPER_LOCALSTATE_DIR): use scrollkeeper-config to figure
- this out, and AC_SUBST so omf-install/Makefile.am can use it.
-
-2001-08-17 Iain Holmes <iain@ximian.com>
-
- * Makefile.am: Move the libical compile order.
-
-2001-08-16 "Big Iain" Holmes <iain@ximian.com>
-
- * configure.in: Add widgets/e-timezone-dialog/Makefile
-
-2001-08-16 Jason Leach <jleach@ximian.com>
-
- * AUTHORS: I know what you did last summer!
-
-2001-08-16 Jon Trowbridge <trow@ximian.com>
-
- * configure.in: Require gal 0.10.99.3.
-
-2001-08-16 Kjartan Maraas <kmaraas@gnome.org>
-
- * README: Some info on adding --localstatedir to the configure
- options.
- * Makefile.am: Added omf-install to the build.
- * configure.in: Adjust for the move of the user docs.
-
-2001-08-15 Kjartan Maraas <kmaraas@gnome.org>
-
- * configure.in: Addded missing dirs to the build. Add checks for
- scrollkeeper and jw to get the docs building on later Red Hat's.
- * omf-install/*: Added this for integration with scrollkeeper.
-
-2001-08-14 Dan Winship <danw@ximian.com>
-
- * configure.in (LDAP_LIBS): Remove an obvious typo reported by
- Miles
-
-2001-08-11 Kjartan Maraas <kmaraas@gnome.org>
-
- * README: Be truthful about the versions of libs we need.
-
-2001-08-10 Chris Toshok <toshok@ximian.com>
-
- * configure.in: if libldap.la is there, default to static linking
- of openldap. if it's not, default to dynamic. also, provide
- --with-static-ldap for users that want to override these defaults.
-
-2001-08-09 Chris Toshok <toshok@ximian.com>
-
- * configure.in: link statically with OpenLDAP.
-
-2001-08-09 Jon Trowbridge <trow@ximian.com>
-
- * configure.in: Require GAL 0.10.99.2.
-
-2001-08-09 Christopher James Lahey <clahey@ximian.com>
-
- * tools/killev: Added #!/bin/sh
-
-2001-08-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Don't link to libnssckbi3 when linking to nss.
-
-2001-08-08 JP Rosevear <jpr@ximian.com>
-
- * README: Update pilot information
-
-2001-08-07 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Require gal 0.10.99.1 or greater.
-
-2001-08-05 Ettore Perazzoli <ettore@ximian.com>
-
- [Fixes #5594, "killev doesn't kill all evolution processes".]
-
- * tools/killev: Added bonobo-moniker-xmldb, gnome-gtkhtml-editor
- and gnome-spell-component.
-
-2001-07-31 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Bump version number to 0.12.99.
-
-2001-07-31 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Ooops. We want GAL >= 0.10.0 and GtkHTML >=
- 0.11.0.
-
-2001-07-31 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Remove `$EVOLUTION_MICRO_VERSION' from `VERSION'.
- (EVO_CHECK_LIB):
-
-2001-07-31 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Bump version number to 0.12.0.
-
-2001-07-31 Ettore Perazzoli <ettore@ximian.com>
-
- * NEWS: Added info about the shell changes and slightly changed
- the formatting for the addressbook ones.
-
- * configure.in: Require GtkHTML 0.10.0 and GAL 0.9.0.
-
-2001-07-31 Christopher James Lahey <clahey@ximian.com>
-
- * NEWS (Addressbook): Updated NEWS for addressbook.
-
-2001-07-31 Larry Ewing <lewing@ximian.com>
-
- * configure.in: bump required version of gtkhtml to 0.10.99.
-
-2001-07-20 JP Rosevear <jpr@ximian.com>
-
- * configure.in: Bump to 0.11.99
-
-2001-07-17 Dan Winship <danw@ximian.com>
-
- * configure.in: Fix up the "exactly version N" case of EVO_CHECK_LIB
-
-2001-07-16 Not Zed <NotZed@Ximian.com>
-
- * configure.in: Changed to use test -h instead of -L for checking
- /var/mail vs /var/spool/mail
-
-2001-07-13 JP Rosevear <jpr@ximian.com>
-
- * NEWS: more updates
-
-2001-07-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * NEWS (Mail): Merged mine and Peter's entries.
-
-2001-07-12 JP Rosevear <jpr@ximian.com>
-
- * NEWS: Start new entry
-
-2001-07-11 Peter Williams <peterw@ximian.com>
-
- * acconfig.h: Add HAVE_BROKEN_SPOOL here.
-
-2001-07-10 Peter Williams <peterw@ximian.com>
-
- * configure.in (have_nss_includes): Fix nss include check to work.
-
-2001-07-11 Not Zed <NotZed@Ximian.com>
-
- * configure.in: Added option --with-broken-spool for solaris mbox
- spool format.
-
-2001-07-10 Marius Andreiana <mandreiana@yahoo.com>
-
- * configure.in: Added ro (Romanian) to ALL_LINGUAS
-
-2001-07-05 Peter Williams <peterw@ximian.com>
-
- * configure.in (SYSTEM_MAIL_DIR): Make sure /var/mail
- isn't a symbolic link such as on Red Hat 7.
-
-2001-07-05 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Upped the required version of gal.
-
-2001-07-03 Dietmar Maurer <dietmar@ximian.com>
-
- * *: use bonobo-conf everywhere
-
-2001-07-03 Damon Chaplin <damon@ximian.com>
-
- * configure.in (MAILER_LIBS):
- (MAILER_CFLAGS): added bonobo_conf.
-
-2001-07-02 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Made evolution depend on bonobo-conf 0.2.
-
-2001-07-02 Larry Ewing <lewing@ximian.com>
-
- * configure.in: Check for gtkhtml 0.9.99.1.
-
-2001-07-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Check for libGal 0.8.99.7.
-
-2001-07-02 Peter Williams <peterw@ximian.com>
-
- * configure.in (evolution_db_version): s,AC_DEFINE,AC_DEFINE_UNQUOTED
- to make these not totally useless.
-
-2001-07-01 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (SUBDIRS): Build the composer after the addressbook,
- as it needs some CORBA stuff from the latter.
-
-2001-06-30 Federico Mena Quintero <federico@ximian.com>
-
- * tools/killev: Added evolution-alarm-notify.
-
-2001-06-29 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Require GAL 0.8.99.6.
-
-2001-06-29 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Add `camel/tests/mime-filter/Makefile' to the
- `AC_OUTPUT()' list.
-
-2001-06-27 Peter Williams <peterw@ximian.com>
-
- * configure.in (gal): Bump required gal version for new accessors
- in ETree.
-
-2001-06-24 Chris Toshok <toshok@ximian.com>
-
- * configure.in: add addressbook/gui/contact-list-editor, and
- correct path of contact-editor.
-
-2001-06-21 Rodrigo Moya <rodrigo@gnome-db.org>
-
- * libwombat/: added new directory for the libwombat library, which
- will contain the implementation of all CORBA interfaces defined
- in the wombat.idl file
-
-2001-06-21 Dan Winship <danw@ximian.com>
-
- * configure.in: Fix the OpenLDAP check to default to "no" if you
- don't specify anything.
-
-2001-06-20 Kevin Breit <battery841@mediaone.net>
-
- * docs/C/usage-sync: Reworded a little bit for more descrip.
-
-2001-06-20 Kevin Breit <battery841@mediaone.net>
-
- * doc/C/usage-calendar.sgml: Documented categorizing an event.
-
-2001-06-20 Kevin Breit <battery841@mediaone.net>
-
- * doc/C/usage-mail.sgml: Updated Bcc: example
-
-2001-06-20 Dan Winship <danw@ximian.com>
-
- * configure.in: Change --enable-ldap to --with-openldap, allow a
- path prefix as an argument. Add some libtooly goodness to the
- libldap check in case it depends on ssl libraries.
-
-2001-06-19 Dan Winship <danw@ximian.com>
-
- * configure.in: Tweak the db3 header check to like our RH7 build
- machine again.
-
-2001-06-19 Christopher James Lahey <clahey@ximian.com>
-
- * libversit/vcc.y (LexBuf): Changed buf to an int here.
- (lexGetQuotedPrintable): Changed cur to an int here.
-
-2001-06-18 Dan Winship <danw@ximian.com>
-
- * configure.in: Add "--with-db3" to fill in both
- --with-db3-includes and --with-db3-libs. Make them get cached
- properly so you don't need to specify it every time. Simplify some
- code.
-
- * acconfig.h: Add #defines for the current supported db3 version
- so that when we change it we don't have to hunt all of them down
-
-2001-06-18 Dan Winship <danw@ximian.com>
-
- * configure.in: Check the modes on $system_mail_dir and set up
- variables for camel/Makefile to make camel-lock-helper
- setuid/setgid.
-
-2001-06-11 JP Rosevear <jpr@ximian.com>
-
- * configure.in: One slight db3 check correction
-
-2001-06-11 Chris Toshok <toshok@ximian.com>
-
- * configure.in: fix typo in -ldb3 check.
-
-2001-06-11 JP Rosevear <jpr@ximian.com>
-
- * configure.in: Update db3 configure checks for RedHat. /me beats
- a sleeping cat to death
-
-2001-06-09 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Bumped required version of gal to 0.8.99.2.
-
-2001-06-09 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Added addressbook/gui/merging/Makefile.
-
-2001-06-08 Jason Leach <jleach@ximian.com>
-
- * my-evolution/Makefile.am (INCLUDES): builddir != srcdir fix.
-
-2001-06-08 Iain Holmes <iain@ximian.com>
-
- * Makefile.am: Byebye executive-summary, hello my-evolution
-
- * configure.in: Remove all the executive-summary Makefiles. Add the
- my-evolution.
-
-2001-06-08 Jon Trowbridge <trow@ximian.com>
-
- * AUTHORS: Vanity, thy name is trow.
-
-2001-06-05 JP Rosevear <jpr@ximian.com>
-
- * config.log: Bump version to 0.10.99
-
-2001-05-31 Christopher James Lahey <clahey@ximian.com>
-
- * README: Included information about db3.
-
- * acconfig.h: Added HAVE_DB_H and HAVE_DB3_DB_H.
-
- * configure.in: Added various checks for db3 libraries and
- includes. Of note are the new configure options
- --with-db3-includes=PREFIX and --with-db3-libs=PREFIX to specify
- the location for your db3 library.
-
-2001-05-31 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in (GTKHTML_DATADIR): Use --moddatadir to derive this.
-
-2001-05-30 Dan Winship <danw@ximian.com>
-
- * configure.in: Bump gal dependency to 0.8.99.1
-
-2001-05-29 JP Rosevear <jpr@ximian.com>
-
- * README: update version requirements
-
-2001-05-23 Dan Winship <danw@ximian.com>
-
- * README: Remove reference to verify-evolution-install.sh since it
- doesn't work any more.
-
- * configure.in (EVO_CHECK_LIB): allow this to take a max version
- too, mostly so we can bound the allowable gal versions for
- releases, but also to require libxml < 2.0.
- (OpenSSL): Fixicate to work on NetBSD (OpenSSL in /usr, no libdl).
-
-2001-05-23 Kjartan Maraas <kmaraas@gnome.org>
-
- * tools/killev: s/evolution-vcard-import/evolution-vcard-importer
-
-2001-05-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Create MAILER_CFLAGS and MAILER_LIBS so that we
- don't have the same libs multiple times in the libtool
- command-line.
-
-2001-05-20 Duncan Mak <duncan@ximian.com>
-
- * tools/killev (sysname): Add in evolution-vcard-importer as part
- of the list of processes to kill in killev.
-
-2001-05-18 Jon Trowbridge <trow@ximian.com>
-
- * Makefile.am (SUBDIRS): Changed build order. Now addressbook
- gets built before mail.
-
-2001-05-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Create CAMEL_CFLAGS and CAMEL_LIBS so that we
- don't have to link in all sorts of unnecessary garbage from GNOME
- that we don't need.
-
-2001-05-15 Chris Toshok <toshok@ximian.com>
-
- * tools/killev: add the importers.
-
-2001-05-14 Kevin Breit <battery841@mediaone.net>
-
- * doc/C/evolution-C.omf: added file for Scrollkeeper
-
-2001-05-09 Chris Toshok <toshok@ximian.com>
-
- * configure.in: add the nspr includes to the list of includes used
- to test for NSS headers, and don't assume -lpthread in the
- nss/nspr libs - use PTHREAD_LIB.
-
-2001-05-09 Iain Holmes <iain@ximian.com>
-
- * tools/killev: Added rdf-summary killing stuff from R Burton
- (r.burton@180sw.com)
-
-2001-05-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: OpenSSL LDFLAGS also needs to include -lcrypt
-
-2001-05-08 Iain Holmes <iain@ximian.com>
-
- * Makefile.am: Add the importers subdir.
-
- * configure.in: Make the importers/Makefile
-
-2001-05-08 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Bumped check for gal to 0.7.99.3.
-
-2001-05-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * acconfig.h: undef HAVE_SSL and HAVE_OPENSSL
-
- * configure.in: Check for OpenSSL.
-
-2001-05-05 Gediminas Paulauskas <menesis@delfi.lt>
-
- * configure.in: upped required gtkhtml version to 0.9.3, even that is
- not enough for idl changes.
- * README: you need LIB_XML_1_BRANCH. updated all version requirements
- from configure.in
-
-2001-04-26 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Don't autogen
- `executive-summary/widgets/Makefile', as that subdir doesn't get
- distributed anymore.
-
-2001-04-26 Dan Winship <danw@ximian.com>
-
- * README: We no longer depend on libunicode.
-
- * configure.in: Remove check for libunicode. Remove unicode cflags
- and libs from all CFLAGS and LIBS variables. Add GAL_LIBS for
- things that need to depend on just gal (for gunicode).
-
- * configure.in: Check for gethostbyname_r so e_gethostbyname_r
- will DTRT.
-
-2001-04-24 Dan Winship <danw@ximian.com>
-
- * configure.in: Bump up the gal requirement
-
-2001-04-23 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Don't autogen the the Makefile for the importer
- docs.
-
- * Makefile.am (SUBDIRS): Build the docs last.
-
-2001-04-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in (have_nspr_libs): We need to link in more than just
- libnspr4, we also need libpthread.
- (have_nss_libs): Don't forget to add nsprlibs to the LDFLAGS.
-
-2001-04-21 Duncan Mak <duncan@ximian.com>
-
- * art/Makefile.am (images_DATA): Added in composer-message.png.
-
-2001-04-16 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: `mail/importers/Makefile' must come after
- `mail/Makefile'.
-
-2001-04-16 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (SUBDIRS): Add `doc'.
-
- * configure.in: Check for Editor.idl using `$GNOME_PATH' as well.
-
-2001-04-12 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Updated the required version of gal to 0.6.99.0.
-
-2001-04-11 JP Rosevear <jpr@ximian.com>
-
- * configure.in: Check if gethostbyname_r take five params
-
- * acconfig.h: add GETHOSTBYNAME_R_FIVE_ARGS
-
-2001-04-10 Gediminas Paulauskas <menesis@delfi.lt>
-
- * AUTHORS: /me is a translator.
- * configure.in (EVO_CHECK_LIB): fail with AC_MSG_ERROR, not echo &&
- exit 1.
-
-2001-04-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in (EVOLUTION_DIR): create the makefile in
- camel/tests/smime
-
-2001-04-08 Chris Toshok <toshok@ximian.com>
-
- * tools/killev (sysname): add some more 16 character versions for
- freebsd.
-
-2001-04-04 Kjartan Maraas <kmaraas@gnome.org>
-
- * AUTHORS: Brag.
-
-2001-04-04 Gediminas Paulauskas <menesis@delfi.lt>
-
- * art/evolution-today-mini.png: converted from exec-16-summary.xpm,
- removed the latter.
- * art/evolution-trash.png, art/evolution-trash-mini.png: images for
- trash folder, one converted from deleted_message.xpm, another from mc.
- * art/Makefile.am: install.
-
-2001-04-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * README (SSL): Remind users that they will currently have to copy
- their cert database from their mozilla directory into ~/evolution.
-
-2001-04-01 Gediminas Paulauskas <menesis@delfi.lt>
-
- * art/Makefile.am: added missing (new) files.
-
-2001-03-30 Dan Winship <danw@ximian.com>
-
- * configure.in (EVOLUTION_MICRO_VERSION): Bump this to 10. (We
- forgot to do this before branching *again*...)
-
-2001-03-28 Dan Winship <danw@ximian.com>
-
- * README: add a bit mentioning that if configure claims you don't
- have something installed when you think you do, that it's probably
- because you installed it in the wrong prefix, or because you need
- a -devel package.
-
- * configure.in: Add a new macro EVO_CHECK_LIB that checks for a
- gnome-config-based library of a given version or later, correctly,
- and if doesn't find it, suggests that you consult the README. Fix
- the various library checks to use this. Meanwhile, remove a bunch
- of old cruft and reorganize a little.
-
- * acconfig.h: Remove cruft
-
-2001-03-28 Jon Trowbridge <trow@ximian.com>
-
- * AUTHORS: In a burst of egomania, added myself.
-
-2001-03-26 Radek Doulik <rodo@ximian.com>
-
- * configure.in: create camel/misc/Makefile
-
-2001-03-22 Dan Winship <danw@ximian.com>
-
- * README: Update xml-i18n-tools version
-
-2001-03-22 Jakub Steiner <jimmac@ximian.com>
-
- * art/new-message.xpm: file->new->mail message
- * art/folder.xpm: file->new->folder
- * art/new_appointment.xpm: file->new->appontment
- * art/print-preview.xpm: file->print preview
- * art/configure_16_calendar.xpm: for the tools menu
-
-2001-03-22 Jakub Steiner <jimmac@ximian.com>
-
- * art/splash.png: move it a bit up so the icons fit better
-
-2001-03-22 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Bumped gal requirement to 0.5.99.11.
-
-2001-03-22 Jakub Steiner <jimmac@ximian.com>
-
- * art/configure_16_folder.xpm, configure_16_mail.xpm,
- copy_16_message.xpm, edit.xpm, encrypt.xpm,
- evo-16-address-conduit.png, evo-16-calendar-conduit.png,
- evo-16-todo-conduit.png, exec-16-summary.xpm, import.xpm,
- print.xpm, reply_to_all.xpm, reply.xpm, save.xpm,
- send-receive.xpm, work_offline.xpm, find_contact.xpm,
- send-24-receive.png, evo-48-calendar-conduit.png,
- evo-48-todo-conduit.png, import.png, send-48-receive.png,
- move_message.xpm, all_contacts.xpm, forward.xpm,
- configure_16_addressbook.xpm, Makefile.am,
- evo-48-address-conduit.png: renamed icons to make Miguel's
- speedups possible
- * art/evolution-inbox.png: color coded one
- * art/envelope.png: reverted back to the non-color coded one
- * art/evolution-contacts-plain.png: non-color coded one for
- the "new contact" dialogue
-
-2001-03-21 Dan Winship <danw@ximian.com>
-
- * configure.in: Require bison, not yacc (for vcc.y)
-
-2001-03-20 Miguel de Icaza <miguel@ximian.com>
-
- * art/Makefile.am (images_DATA): Added all the new icons to the
- distribution.
-
-2001-03-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: More fixes for NSPR and NSS checks - use fixed it
- to use AC_CHECK_HEADERS instead of AC_CHECK_FILES. Also made it
- not default the nspr lib path to /usr/lib/mozilla which may not be
- in the user's library path when checking for nspr libs.
-
-2001-03-20 Jakub Steiner <jimmac@ximian.com>
-
- * art/48_send-receive.png: send-receive for the s/r dialog
- * art/24_send-receive.png: send-receive to replace the
- fetch-mail-doggie
- * art/16_send-receive.xpm: send-receive for (future) menu
- item
- * art/16_import.xpm: for the file menu
- * art/16_work_offline.xpm: for the file menu
- * AUTHORS: so I can show off
- * art/splash.png: making radek famous ;)
- * art/envelope.png, evolution-calendar.png, evolution-contacts.png,
- evolution-tasks.png, evolution-today.png:
- new concept of color coded apps:
- - mailer: #efb43e
- - calendar: #bab5ab
- - contacts: #9794ab
- - tasks: #6e9e6e
- - exec. summary: #c4757e
-
-2001-03-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Fix ettore's fix ;-)
-
-2001-03-19 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Bumped gal requirement to 0.5.99.8.
-
-2001-03-19 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Make sure we never define `NSPR_CFLAGS' or
- `NSS_CFLAGS' as just "-I".
-
-2001-03-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * NEWS: pulled from the 0.9 release.
-
-2001-03-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Updated the checks for NSS and NSPR
-
-2001-03-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * README: Added directions on how to build with SSL support.
-
- * configure.in: Updated the checks for NSS and NSPR
-
-2001-03-16 Jakub Steiner <jimmac@ximian.com>
-
- * art/48_import.png: for the import druid
-
-2001-03-15 Dan Winship <danw@ximian.com>
-
- * configure.in: Bump gal requirement to 0.5.99.7
-
-2001-03-15 Gediminas Paulauskas <menesis@delfi.lt>
-
- * configure.in: create doc/devel/executive-summary/Makefile
- * evolution.png: moved to art/.
- * evolution.desktop: moved to data/.
- * Makefile.am: reflect those moves.
- * art/*.xpm: moved 8 files from calendar/gui here.
- * art/Makefile.am: added moved files.
- distribute *.xpm, install *.png and *view.xpm.
-
-2001-03-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Updated to AC_SUBST the NSPR/NSS flags.
-
-2001-03-14 Dan Winship <danw@ximian.com>
-
- * README: Pull up some of the clarifications from the 0.9 branch
-
-2001-03-13 Chris Toshok <toshok@ximian.com>
-
- * configure.in: add -lresolv to LDAP_LIBS if it's there.
-
-2001-03-13 Iain Holmes <iain@ximian.com>
-
- * configure.in: Added the mail/importers dir.
-
-2001-03-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * README: Rearranged some of the dependencies to try to get them
- into a more correct order (needed for people building all of these
- packages by hand).
-
-2001-03-12 JP Rosevear <jpr@ximian.com>
-
- * README: Update
-
-2001-03-09 Dan Winship <danw@ximian.com>
-
- * configure.in (EVOLUTION_MICRO_VERSION): Hm... probably would be
- clever to be calling this 0.9 rather than 0.8, since it's almost
- 0.10.
-
-2001-03-09 Christopher James Lahey <clahey@ximian.com>
-
- * libversit/vcc.y: Changed int to char when returning a character
- from a stream (since it needs to be able to hold EOF.)
-
-2001-03-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Removed --enable-assbarn-security and replaced it
- with the real options:
- --with-nspr-includes=PREFIX
- --with-nspr-libs=PREFIX
- --with-nss=PREFIX
-
- * acconfig.h: #undef HAVE_NSS
-
-2001-03-07 Ettore Perazzoli <ettore@ximian.com>
-
- * configure.in: Require GAL 0.5.99.6 or later.
-
-2001-03-07 Kjartan Maraas <kmaraas@gnome.org>
-
- * shell/main: /* xgettext:no-c-format */ before the welcome
- message.
- * configure.in: Don't try to generate a Makefile in
- camel/providers/vee as it's empty.
-
-2001-03-05 JP Rosevear <jpr@ximian.com>
-
- * README: Update pilot instructions
-
-2001-03-05 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Check for gal 0.5.99.4.
-
-2001-03-04 Dan Winship <danw@ximian.com>
-
- * configure.in: Reorganize a bit to get rid of warnings about
- AC_TRY_COMPILE being used before AC_ISC_POSIX
-
-2001-03-04 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Added views/addressbook/Makefile.
-
-2001-03-02 JP Rosevear <jpr@ximian.com>
-
- * art/Makefile.am: install conduit icons
-
-2001-03-02 Chris Toshok <toshok@ximian.com>
-
- * configure.in: add logic to make sure we're building against OpenLDAP >= 2
-
-2001-03-01 Christopher James Lahey <clahey@ximian.com>
-
- * Makefile.am (SUBDIRS), configure.in: Added views stuff.
-
-2001-03-01 Dan Winship <danw@ximian.com>
-
- * configure.in: Redo the Kerberos stuff again to deal with the
- stuff currently on my machine. I think it should deal with both
- the MIT and KTH versions of both krb4 and krb5 now.
-
-2001-03-01 Jakub Steiner <jimmac@ximian.com>
-
- * art/48_evo-address-conduit.png: 48^2 version of the
- addressbook pilot conduit. (for the new control center)
- * art/16_evo-address-conduit.png: 16x16 version for current
- gnomecc
- * art/48_evo-todo-conduit.png: for new gnomecc
- * art/16_evo-todo-conduit.png: for old gnomecc
- * art/48_evo-calendar-conduit.png: for new gnomecc
- * art/16_evo-calendar-conduit.png: for old gnomecc
-
-2001-03-01 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Check for gal 0.5.99.2.
-
-2001-02-19 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Check for gal 0.5.99.1.
-
-2001-02-15 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Check for gal 0.5.99.0.
-
-2001-02-14 Dan Winship <danw@ximian.com>
-
- * various .cvsignore files: Ignore generated .oaf files
-
-2001-02-13 JP Rosevear <jpr@ximian.com>
-
- * art/Makefile.am: install new files
-
- * art/*view.xpm: add files from calendar/gui
-
-2001-02-11 Chris Toshok <toshok@ximian.com>
-
- * configure.in: rework ldap check logic so it'll work to
- --disable-ldap if you've previously configured with --enable-ldap.
-
-2001-02-11 Gediminas Paulauskas <menesis@delfi.lt>
-
- * data/evolution.keys, evolution.desktop: removed, they are generated.
- * data/evolution.keys.in, evolution.desktop.in: new untranslated files.
- * data/evolution.desktop: removed, it duplicates above.
- * Makefile.am, data/Makefile.am: reflect above changes, merge
- translations.
-
-2001-02-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * configure.in: Added hacks to check for Mozilla libs like nspr
- and nss that we will need for SSL and S/MIME.
-
-2001-02-09 Michael Meeks <michael@ximian.com>
-
- * configure.in: depend on bonobo >= 0.36
-
-2001-02-08 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Upped the version number of gal required to 0.5.
-
-2001-02-07 JP Rosevear <jpr@ximian.com>
-
- * README: Update to latest requirements
-
-2001-02-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * .cvsignore: Added xml-* files.
-
-2001-02-05 Gustavo Maciel Dias Vieira <gdvieira@zaz.com.br>
-
- * configure.in (ALL_LINGUAS): Added pt_BR to ALL_LINGUAS.
-
-2001-02-04 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Require version 0.4.99.8 of gal.
-
-2001-02-03 Federico Mena Quintero <federico@ximian.com>
-
- * configure.in: Make sure we have gnome-libs 1.2.9 or higher.
-
-2001-02-01 Chris Toshok <toshok@ximian.com>
-
- * configure.in: allow --enable/disable-ldap.
-
-2001-02-01 Jason Leach <jasonleach@usa.net>
-
- * tools/killev: Fix this script to make it work with Solaris.
- Patch from Louise Miller.
-
-2001-01-29 Eskil Heyn Olsen <eskil@eazel.com>
-
- reviewed by: JP Rosevear <jpr@ximian.com>
-
- * acconfig.h:
- Added the ENABLE_NNTP define
-
- * configure.in:
- Fixed the NNTP m4 section.
-
-2001-01-29 Stanislav Visnovsky <visnovsky@nenya.ms.mff.cuni.cz>
-
- * configure.in: added sk to ALL_LINGUAS.
- * evolution.desktop: added Slovak messages.
-
-2001-01-27 Jason Leach <jasonleach@usa.net>
-
- * configure.in (AC_OUTPUT): remove
- widgets/shortcut-bar/Makefile from here.
-
-2001-01-25 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Upped the required version of gal in evolution.
-
-2001-01-25 Ettore Perazzoli <ettore@ximian.com>
-
- * art/Makefile.am (images_DATA): Add the missing .xpm files.
-
-2001-01-25 Ettore Perazzoli <ettore@ximian.com>
-
- * art/Makefile.am (images_DATA): Add `24_find_contacts.xpm',
- `16_print_xpm', `16_configure_addressbook'.
-
-2001-01-25 Ettore Perazzoli <ettore@ximian.com>
-
- * art/Makefile.am (images_DATA): Add `24_all_contacts.xpm'.
-
-2001-01-24 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Upped the required version of gal in evolution.
-
-2001-01-22 Tuomas Kuosmanen <tigert@ximian.com>
-
- * art/splash.png: From the "Ideas from the shower" department:
- new splash screen.
-
-2001-01-17 JP Rosevear <jpr@ximian.com>
-
- * README: Update package requirements
-
-2001-01-19 Jason Leach <jasonleach@usa.net>
-
- * configure.in: Changed a leftover $with_x_mailer to
- $with_sub_version. Made it so that if $with_sub_version isn't
- specified, we don't try to output it, and also corrected the way
- SUB_VERSION is defined.
-
-2001-01-18 Federico Mena Quintero <federico@ximian.com>
-
- * Makefile.am: Um, why was the doc directory removed from SUBDIRS?
-
-2001-01-17 Larry Ewing <lewing@helixcode.com>
-
- * configure.in (EVOLUTION_DIR): add the
- doc/devel/importer/Makefile as a target.
-
-2001-01-17 Ettore Perazzoli <ettore@ximian.com>
-
- * acconfig.h: Add `SUB_VERSION', remove `XMAILER_VERSION'.
-
- * configure.in: Removed `--with-x-mailer' option; replaced with a
- more generic `--with-sub-version' option. So, don't define
- `X_MAILER'; instead, define `SUB_VERSION'.
-
-2001-01-16 Chris Toshok <toshok@helixcode.com>
-
- * configure.in: add --enable-nntp switch. default is no.
-
-2001-01-16 Dan Winship <danw@ximian.com>
-
- * configure.in, acconfig.h: Add --with-x-mailer to set the version
- string that appears in the X-Mailer header.
-
-2001-01-15 Christopher James Lahey <clahey@ximian.com>
-
- * configure.in: Changed the required version of gal.
-
-2001-01-15 Tuomas Kuosmanen <tigert@ximian.com>
-
- * art/16_copy_message.xpm, art/16_move_message.xpm: icons for the
- Message->Move/Copy to folder -menu entries.
-
-2001-01-15 Tuomas Kuosmanen <tigert@ximian.com>
-
- * art/evolution-calendar-mini.png: New version of calendar icon that
- looks more like a calendar and not a dictionary or something :)
-
- Btw, the icons get scaled for some reason, even though that is
- not necessary as all of those should be 16x16 pixels. Can anyone look
- into this?
-
-2001-01-15 Dietmar Maurer <dietmar@ximian.com>
-
- * *.c: changed the signature of the property_bag get/set
- functions.
-
-2001-01-14 JP Rosevear <jpr@ximian.com>
-
- * configure.in: remove old config message
-
-2001-01-14 Damon Chaplin <damon@helixcode.com>
-
- * tools/evolution-move-tasks: new script to move tasks from the
- Calendar folder to the new Tasks folder, so people won't lose tasks.
- This can be deleted after a few releases.
-
- * tools/Makefile.am (bin_SCRIPTS): added above.
-
- * configure.in: added default_user/local/Tasks/Makefile to AC_OUTPUT.
-
-2001-01-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * config.h.in: Removed GPG stuff.
-
- * acconfig.h: Take out all refs to PGP and GPG stuff.
-
- * configure.in: Take out the PGP/GPG detection stuff.
-
-2001-01-12 Federico Mena Quintero <federico@ximian.com>
-
- * configure.in: Suggest what to do if gtk-doc is not found.
-
-2001-01-12 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Make evolution depend on the new version of gal.
-
-2001-01-12 Dan Winship <danw@ximian.com>
-
- * MAINTAINERS, AUTHORS, README: Ximianize. Also update the README
- a bit and mention the OAF stable branch.
-
-2001-01-11 Dan Winship <danw@helixcode.com>
-
- * art/priority-high.xpm: Add a white outline around the "!" so it
- still shows up clearly in selected rows when your theme selection
- color is reddish. (Problem pointed out by Federico.)
-
-2001-01-11 Federico Mena Quintero <federico@helixcode.com>
-
- * configure.in: At the end of the configure process, report
- whether the documentation files will be built or not.
-
-2001-01-10 Tuomas Kuosmanen <tigert@helixcode.com>
-
- * art/move-message.png, art/move-message.png: New versions.
-
-2001-01-09 Federico Mena Quintero <federico@helixcode.com>
-
- * configure.in (AC_OUTPUT): Added calendar/gui/alarm-notify/Makefile.
-
-2001-01-05 Tuomas Kuosmanen <tigert@helixcode.com>
-
- * art/evolution-contacts-mini.png: This looks more pretty.
-
-2001-01-03 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Removed camel/providers/mbox/Makefile and
- camel/providers/mh/Makefile.
-
-2001-01-01 Michael Meeks <michael@helixcode.com>
-
- * configure.in: Require bonobo 0.31
-
-2000-12-24 Not Zed <NotZed@HelixCode.com>
-
- * configure.in: If we find threads ok, then always turn on
- ENABLE_THREADS.
-
-2000-12-14 Christopher James Lahey <clahey@helixcode.com>
-
- * NEWS (Addressbook): Added a bit of addressbook NEWS.
-
- * configure.in: Updated the gal check to require gal 0.4.
-
-2000-12-14 Christopher James Lahey <clahey@helixcode.com>
-
- * art/mail-new.xpm, art/mail-read.xpm, art/mail-replied.xpm: Moved
- these images each up one pixel.
-
-2000-12-14 Jeffrey Stedfast <fejj@helixcode.com>
-
- * NEWS: Update.
-
-2000-12-14 JP Rosevear <jpr@helixcode.com>
-
- * NEWS: Update
-
-2000-12-14 Christopher James Lahey <clahey@helixcode.com>
-
- * art/splash.png: New splash from Jimmac.
-
-2000-12-12 Christopher James Lahey <clahey@helixcode.com>
-
- * README: Removed mention of ETable and EText in widgets
- directory.
-
-2000-12-12 Dan Winship <danw@helixcode.com>
-
- * README: Mention the gconf stable branch.
-
-2000-12-07 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Updated the required version of gal.
-
-2000-12-07 Radek Doulik <rodo@helixcode.com>
-
- * configure.in (GTKHTML_LIBS): renamed HTMLEditor.idl to
- Editor.idl
-
-2000-12-06 Kjartan Maraas <kmaraas@gnome.org>
-
- * data/evolution.keys: Added some Norwegian translations.
-
-2000-12-06 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Increased the required version of gal.
-
-2000-12-05 JP Rosevear <jpr@helixcode.com>
-
- * README: minor tweak
-
-2000-12-05 Not Zed <NotZed@HelixCode.com>
-
- * configure.in: Added camel/tests/stream/Makefile.am.
-
-2000-12-01 Dan Winship <danw@helixcode.com>
-
- * README: gnome-vfs depends on gconf, so add that.
-
-2000-11-30 Jeffrey Stedfast <fejj@helixcode.com>
-
- * configure.in: Bumped required gal version to 0.2.99.4 for
- e_str_make_safe.
-
- * README: Added some necessary :'s in the pilot-link cvs stuff.
-
-2000-11-30 Gediminas Paulauskas <menesis@delfi.lt>
-
- * calendar/gui/main.c, executive-summary/component/main.c, mail/main.c,
- shell/main.c, notes/main.c,
- addressbook/gui/component/addressbook-factory.c:
- removed #ifdef ENABLE_NLS/#endif on Miguel's request.
-
-2000-11-29 JP Rosevear <jpr@helixcode.com>
-
- * README: Update pilot info
-
-2000-11-29 Dan Winship <danw@helixcode.com>
-
- * configure.in: Bump required gal version to 0.2.99.3 for iconv
- changes
-
-2000-11-29 Federico Mena Quintero <federico@helixcode.com>
-
- * COPYING-DOCS: Added a copy of the GNU Free Documentation
- License.
-
- * Makefile.am (EXTRA_DIST): Added COPYING-DOCS.
-
-2000-11-28 JP Rosevear <jpr@helixcode.com>
-
- * acconfig.h: Add USE_FLOCK, USE_FCNTL, USE_FLOCK
-
- * configure.in: Auto* magic for various camel locking types
-
-2000-11-28 Not Zed <NotZed@HelixCode.com>
-
- * configure.in (AC_OUTPUT): Added camel/tests/folder/Makefile
-
-2000-11-27 JP Rosevear <jpr@helixcode.com>
-
- * AUTHORS: Update - hopefully I assigned blame correctly :-)
-
- * MAINTAINERS: ditto
-
-2000-11-27 JP Rosevear <jpr@helixcode.com>
-
- * configure.in: Correct the bonobo version error message
-
- * README: Update
-
-2000-11-24 Not Zed <NotZed@HelixCode.com>
-
- * configure.in: Added camel/tests stuff to output macro.
-
-2000-11-14 Not Zed <NotZed@HelixCode.com>
-
- * configure.in: Added local provider dir to output macro.
-
-2000-11-21 Dan Winship <danw@helixcode.com>
-
- * configure.in: Check for libgpgme. (Support not added to mail
- yet.)
-
-2000-11-21 Federico Mena Quintero <federico@helixcode.com>
-
- * configure.in (EVOLUTION_DIR): Removed the
- default_user/local/Tasks/Makefile until the relevant files are on
- CVS.
-
-2000-11-18 Miguel de Icaza <miguel@helixcode.com>
-
- * Added widgets/menus that contains the gal-view-menus.c code from
- Gal that depended on Bonobo.
-
- * configure.in: Update list of Makefiles;
-
- * widgets/Makefile.am: Update.
-
-2000-11-13 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Update the gal reqiurement version.
-
-2000-11-10 Michael Meeks <michael@helixcode.com>
-
- * configure.in: Require Bonobo >= 0.29, due to the XSync
- fix.
-
-2000-11-09 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Require gal 0.2.99.1.
-
-2000-11-06 Jeffrey Stedfast <fejj@helixcode.com>
-
- * configure.in: Require gal 0.2.1.3
-
-2000-11-06 Dan Winship <danw@helixcode.com>
-
- * configure.in (GTKHTML_LIBS): ${prefix} doesn't get defaulted
- until the end of configure, so check if it's "NONE" and use
- ${ac_default_prefix} if so.
-
-2000-11-06 Radek Doulik <rodo@helixcode.com>
-
- * configure.in (GTKHTML_LIBS): also look for HTMLEditor.idl in
- ${prefix}/share/gtkhtml
-
-2000-11-03 Radek Doulik <rodo@helixcode.com>
-
- * configure.in (BONOBO_HTML_GNOME_CFLAGS): raise required version
- number to 0.8
- added check for HTMLEditor.idl file
-
-2000-11-02 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Require gal 0.2.1.2.
-
-2000-11-02 Michael Meeks <michael@helixcode.com>
-
- * configure.in: Require Bonobo-0.27+
-
-2000-11-01 Gediminas Paulauskas <menesis@delfi.lt>
-
- * addressbook/ename/.cvsignore, addressbook/gui/minicard/.cvsignore,
- calendar/doc/.cvsignore, widgets/e-paned/.cvsignore,
- widgets/e-table/.cvsignore, widgets/e-text/.cvsignore: added these
- files.
- * calendar/gui/.cvsignore, composer/.cvsignore,
- executive-summary/.cvsignore, executive-summary/component/.cvsignore,
- po/.cvsignore: added some files to ignore.
-
- * addressbook/gui/component/addressbook-factory.c, mail/main.c,
- shell/main.c, calendar/gui/main.c, notes/main.c,
- executive-summary/component/main.c: call *textdomain() only if
- ENABLE_NLS is defined.
-
-2000-11-01 Gediminas Paulauskas <menesis@delfi.lt>
-
- * configure.in: added lt to ALL_LINGUAS.
-
-2000-10-30 Dan Winship <danw@helixcode.com>
-
- * configure.in: fix up printing of kerberos configuration status
-
-2000-10-27 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Require gal cvs version.
-
-2000-10-27 <jpr@helixcode.com>
-
- * tools/killev: Kill executive summary components
-
-2000-10-25 Iain Holmes <iain@helixcode.com>
-
- * configure.in: Added executive-summary stuff
-
- * Makefile.am: Added the executive-summary subdirs.
-
-2000-10-23 Dan Winship <danw@helixcode.com>
-
- * notes/Makefile.am (INCLUDES): Update EVOLUTION_LOCALEDIR
-
- * configure.in: set localedir here to use in Makefiles.
- (AM_GNOME_GETTEXT doesn't actually always set it to
- $(datadir)/locale).
-
-2000-10-23 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Updated the gal check to check for gal 0.2.1.
-
-2000-10-22 Robert Brady <rwb197@zepler.org>
-
- * configure.in: Added "en_GB" to ALL_LINGUAS.
-
-2000-10-20 Michael Meeks <michael@helixcode.com>
-
- * notes/component-factory.c (control_activate_cb):
-
-2000-10-19 Christopher James Lahey <clahey@helixcode.com>
-
- * NEWS (General, Addressbook): Updated NEWS for addressbook and
- ETable.
-
-2000-10-19 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Updated the gal check to check for gal 0.2.
-
-2000-10-19 Ettore Perazzoli <ettore@helixcode.com>
-
- * configure.in (EVOLUTION_MICRO_VERSION): 6.
-
- * Makefile.am (EXTRA_DIST): Remove `evolution.spec.in'.
- (dist-hook:): Removed.
-
-2000-10-18 Michael Meeks <michael@helixcode.com>
-
- * notes/component-factory.c (control_activate, control_deactivate),
- (create_view): cripple, not worth updating to new UI code.
-
-2000-10-17 Tuomas Kuosmanen <tigert@helixcode.com>
-
- * art/splash.png: This looks happier than the dark piece of rusty
- metal. And the Big Dig in Boston is ugly looking too. Finnish
- road poles are much more cool!
-
-2000-10-15 Peter Williams <peterw@helixcode.com>
-
- * tools/verify-evolution-install.sh (libcamelvee): Check
- for linkage against version 0.5 libcamelvee, not version 0.3.
- This should track with the version of Evolution itself.
- (rm -f $ldddfile): Remove a temporary file.
-
-2000-10-15 Kjartan Maraas <kmaraas@gnome.org>
-
- * configure.in: Added "nn" to ALL_LINGUAS.
-
-2000-10-14 Ettore Perazzoli <ettore@helixcode.com>
-
- * art/Makefile.am (images_DATA): Add `splash.png'.
-
-2000-10-14 Tuomas Kuosmanen <tigert@helixcode.com>
-
- * art/splash.png: umm.. it's a splash screen image.
-
-2000-10-11 JP Rosevear <jpr@helixcode.com>
-
- * configure.in: Fix bonobo error message
-
-2000-10-11 Jesse Pavel <jpavel@helixcode.com>
-
- * data/evolution.keys: Added support for the text/calendar and
- text/x-calendar MIME types.
-
-2000-10-10 Gediminas Paulauskas <menesis@delfi.lt>
-
- * configure.in: Added lt to ALL_LINGUAS.
-
-2000-10-10 Tuomas Kuosmanen <tigert@helixcode.com>
-
- * calendar/gui/recur.xpm: Updated round-we-go-thingy icon..
-
-2000-10-06 Chris Toshok <toshok@helixcode.com>
-
- * art/empty.xpm: make it transparent instead of white.
-
-2000-10-06 Christophe Merlet <christophe@merlet.net>
-
- * *.desktop: Added french strings.
-
-2000-10-05 Dan Winship <danw@helixcode.com>
-
- * tools/Makefile.am (EXTRA_DIST): Add verify-evolution-install.sh
- to EXTRA_DIST
-
-2000-10-05 Jeffrey Stedfast <fejj@helixcode.com>
-
- * configure.in: Check for isblank
-
- * config.h.in:
- * acconfig.h: #undef HAVE_ISBLANK
-
-2000-10-05 Michael Meeks <michael@helixcode.com>
-
- * configure.in: Bump Bonobo requirement to >= 0.20
-
-2000-10-05 Iain Holmes <iain@helixcode.com>
-
- * executive-summary/*: Added the executive summary stuff.
-
- * ui/evolution-executive-summary.xml: New.
-
- * art/add-service.png: New icon.
-
-2000-10-03 Matt Bissiri <bissiri@eecs.umich.edu>
-
- * ui/evolution-addressbook-ldap.xml,
- * ui/evolution-addressbook.xml,
- * ui/evolution-calendar.xml,
- * ui/evolution-contact-editor.xml:
- Fixed typo `_decr' -> `_descr', so some missing tooltips will appear.
- Also fixed some typos in descr values.
-
-2000-09-29 Peter Williams <peterw@helixcode.com>
-
- * ui/Makefile.am (XML_FILES): Install the new evolution-subscribe.xml
- file.
-
-2000-09-29 Chris Toshok <toshok@helixcode.com>
-
- * ui/evolution-mail.xml: add a Settings/Manage Subscriptions...
- menu item.
-
- * ui/evolution-subscribe.xml: add a File/Close menu item.
-
-2000-09-28 Chris Toshok <toshok@helixcode.com>
-
- * ui/evolution-subscribe.xml: add a FolderSearch control, and
- change "Refresh" to "RefreshList".
-
-2000-09-27 Chris Toshok <toshok@helixcode.com>
-
- * ui/evolution-subscribe.xml: add an Refresh List button..
-
-2000-09-27 Chris Toshok <toshok@helixcode.com>
-
- * ui/Makefile.am (XML_FILES): add evolution-subscribe.xml.
-
- * ui/evolution-subscribe.xml: new file.
-
-2000-09-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * ui/evolution-mail.xml: Moved the (un)select all menu items over
- to the Edit menu - this looks nicer.
-
-2000-09-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * ui/evolution-mail.xml: Added some new menu items to the Message
- menu like (un)select all and moved "mark as read" to the Message
- menu.
-
-2000-09-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * configure.in: Moved addressbook/ename to e-util/ename so
- generate e-util/ename/Makefile and don't generate
- addressbook/ename/Makefile
-
-2000-09-23 Tuomas Kuosmanen <tigert@localhost>
-
- * art/attachment.xpm
- * art/add-attachment.png: OOPS. The attachment.xpm was not the one
- I thought, so I accidentally replaced the paperclip icon in the mail
- list column, which wasnt my intention. I hope this works now. The old
- one is back, instead the toolbar icon to add attachment is now called
- "add-attachment.png" as you can see also from above. Bummer. Sorry :)
-
-2000-09-22 Christopher James Lahey <clahey@helixcode.com>
-
- * libversit/vcc.y: Fixed some warnings. Fixed a bug where quoted
- printable fields were reading in semi-colons that should have been
- field separators.
-
-2000-09-22 Christopher James Lahey <clahey@helixcode.com>
-
- * ui/Makefile.am: Added evolution-addressbook-ldap.xml.
-
- * ui/evolution-addressbook-ldap.xml: New file. (A Variation on
- evolution-addressbook.xml)
-
- * ui/evolution-addressbook.xml: Added View All and Stop buttons.
-
-2000-09-21 Federico Mena Quintero <federico@helixcode.com>
-
- * ui/evolution-calendar.xml: Removed the AboutCalendar stuff.
-
- * ui/evolution.xml: Fix mis-spelling of "calendar".
-
-2000-09-21 Michael Meeks <michael@helixcode.com>
-
- * notes/component-factory.c (control_activate): upd.
-
-2000-09-20 Christopher James Lahey <clahey@helixcode.com>
-
- * ui/.cvsignore: Added a cvsignore file here.
-
-2000-09-20 Christopher James Lahey <clahey@helixcode.com>
-
- * ui/Makefile.am (XML_FILES): Added evolution-contact-editor.xml.
-
- * ui/evolution-contact-editor.xml: New file for the UI for the
- evolution contact editor.
-
-2000-09-20 Tuomas Kuosmanen <tigert@gimp.org>
-
- * art/attachment.xpm
- * art/send.png: new icons for "compose mail" dialog...
-
-2000-09-19 Dan Winship <danw@helixcode.com>
-
- * configure.in: alter the krb4 check a bit to deal with configure
- cache suckage. (If you do AC_CHECK_LIB with the same library and
- function name but different LDFLAGS, it will still use the result
- of the previous check. So use a different function the second
- time.)
-
-2000-09-18 Dan Winship <danw@helixcode.com>
-
- * README: add gal as a dependency
-
-2000-09-18 Jeffrey Stedfast <fejj@helixcode.com>
-
- * art/score-*.xpm: stupid looking icons for use with displaying
- scores in the message-list view. These need a makeover BADLY ;-)
-
-2000-09-18 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Added check for gnome-app-lib. Removed
- directories that have been moved to gal.
-
-2000-09-15 Dan Winship <danw@helixcode.com>
-
- * configure.in, evolution.spec.in: remove spec file. We haven't
- been keeping it up to date, and it's only good for RH anyway, and
- if people really want a spec file they can get it from our SRPMs.
-
-2000-09-07 Michael Meeks <michael@helixcode.com>
-
- * configure.in: Require Bonobo 0.19
-
-2000-09-13 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Added widgets/e-reflow/Makefile. Replaced
- addressbook/gui/minicard/Makefile with
- addressbook/gui/widgets/Makefile.
-
-2000-09-13 Tuomas Kuosmanen <tigert@localhost>
-
- * art/pin.png: added icon for the folder tree "pin down" button
-
-2000-09-12 JP Rosevear <jpr@helixcode.com>
-
- * NEWS (Calendar): Pilot stuff
-
-2000-09-12 Ettore Perazzoli <ettore@helixcode.com>
-
- * configure.in: The notes subdir isn't actually used, so remove
- it.
-
-2000-09-12 Ettore Perazzoli <ettore@helixcode.com>
-
- * configure.in: 0.5.
-
-2000-09-12 Jeffrey Stedfast <fejj@helixcode.com>
-
- * NEWS (Mailer): Added Sent/Outbox feature descriptions
-
-2000-09-12 Dan Winship <danw@helixcode.com>
-
- * NEWS (Mailer): add most (but not all) 0.5 Mailer features
-
- * configure.in: s/Sentbox/Sent/
-
-2000-09-12 Ettore Perazzoli <ettore@helixcode.com>
-
- * art/Makefile.am (buttonsdir): Install the new button icons into
- `$(datadir)/images/evolution/buttons'.
-
-2000-09-11 Tuomas Kuosmanen <tigert@helixcode.com>
-
- * art/fetch-mail.png
- * art/compose-message.png
- * art/reply.png
- * art/reply-to-all.png
- * art/forward.png
- * art/move-message.png
- * art/copy-message.png: New icons for the main window toolbar
-
-2000-09-11 Christopher James Lahey <clahey@helixcode.com>
-
- * NEWS: Added 0.5 changes for ETable and Addressbook.
-
-2000-09-07 Dan Winship <danw@helixcode.com>
-
- * README: Add a mention of the verify-evolution-install.sh script
- in tools/.
-
-2000-09-03 Jeffrey Stedfast <fejj@helixcode.com>
-
- Reversed my last change as it broke configure, how do I get it so
- that we can do folders with spaces in the name!?
-
-2000-09-03 Jeffrey Stedfast <fejj@helixcode.com>
-
- * configure.in: Renamed default_user/local/Sentbox to
- default_user/local/Sent\ Mail as Ettore and Danw are picky about
- folder names
-
-2000-09-02 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Added calendar/conduits/Makefile,
- calendar/conduits/calendar/Makefile and
- calendar/conduits/todo/Makefile to the list of makefiles to
- output.
-
-2000-09-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * configure.in: Add default_user/local/Sentbox/Makefile to the
- list of makefiles to output
-
-2000-08-31 Peter Williams <peterw@helixcode.com>
-
- * configure.in (kerberos): Check and see if krb_sendauth needs
- prototyping. (#define NEED_KRB_SENDAUTH_PROTO). Also check
- for a libkrb that doesn't need -ldes.
-
- * acconfig.h: #undef it
-
-2000-08-30 Lauris Kaplinski <lauris@helixcode.com>
-
- * configure.in: AC_DEFINE(USING_GNOME_PRINT_0_20)
-
- * acconfig.h: #undef that
-
-2000-08-30 Peter Williams <peterw@helixcode.com>
-
- * configure.in: Robustify the kerberos checks.
-
-2000-08-29 Dan Winship <danw@helixcode.com>
-
- * configure.in, acconfig.h: decruft
-
-2000-08-28 Jesus Bravo Alvarez <jba@pobox.com>
-
- * configure.in: Added Portuguese (pt) to ALL_LINGUAS
-
-2000-08-26 JP Rosevear <jpr@helixcode.com>
-
- * configure.in: Require oafized bonobo
-
-2000-08-24 Federico Mena Quintero <federico@helixcode.com>
-
- * configure.in: Ahem. If you add dependencies on libraries, make
- sure things still build. Fixed the libunicode foo.
-
-2000-08-22 Lauris Kaplinski <lauris@helixcode.com>
-
- * widgets/e-text/e-text.c (_get_position_from_xy): Don't crash on illegal string
-
-2000-08-22 Lauris Kaplinski <lauris@helixcode.com>
-
- * widgets/e-text/e-text.c (e_text_event): Use e_utf8_from_gtk_event_key
- to translate GDK_KEY_PRESS to insertable UTF-8 string
-
-2000-08-22 Christopher James Lahey <clahey@helixcode.com>
-
- * announcement-0.4.1.txt: Updated dependency list.
-
-2000-08-22 Lauris Kaplinski <lauris@helixcode.com>
-
- * widgets/e-text/e-text.c: Use byte based UTF-8 syntax
-
-2000-08-22 Christopher James Lahey <clahey@helixcode.com>
-
- * announcement-0.4.1.txt: Announcement message
-
-2000-08-19 Mathieu Lacage <mathieu@gnu.org>
-
- Fixes compile for non-standard prefixes. Mainly in idl
- compilation where -I`gnome-config --datadir`/idl is replaced
- by `gnome-config --cflags idl` (ugly but it works at least)
- and add some random _CFLAGS here and there and _LIBS for linking.
- * addressbook/gui/component/select-names/Makefile.am
- * composer/Makefile.am
- * e-util/Makefile.am
- * filter/Makefile.am
- * mail/Makefile.am
- * shell/Makefile.am
- * widgets/e-text/Makefile.am
-
-
-2000-08-21 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-paned/e-hpaned.c, widgets/e-paned/e-paned.c,
- widgets/e-paned/e-paned.h, widgets/e-paned/e-vpaned.c: Added code
- to make handle position persist across resizes.
-
-2000-08-20 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c: Fixed a warning.
-
-2000-08-20 arik devens <arik@helixcode.com>
-
- * widgets/e-text/Makefile.am (INCLUDES): added UNICODE_CFLAGS
- support so that compiling in an alternate prefix works.
-
-2000-08-19 Lauris Kaplinski <lauris@helixcode.com>
-
- * widgets/e-text/e-text.h: Commented out Suckfont, added EFont
- * widgets/e-text/e-text.c: Ported to UTF-8
-
-2000-08-18 Peter Williams <peterw@helixcode.com>
-
- * configure.in (gnome-vfs): Check for new enough gnome-vfs
- (needs gnome_vfs_mime_get_default_action_without_fallback)
-
-2000-08-14 Federico Mena Quintero <federico@helixcode.com>
-
- * configure.in (AC_OUTPUT): Generate
- doc/devel/calendar/cal-util/Makefile.
-
-2000-08-14 Peter Williams <peterw@helixcode.com>
-
- * configure.in: Check for db1/db.h too, which is what
- RH 7.0 uses for the old db headers. Patch from Kenny Graunke
- <kwg@teleport.com>
-
-2000-08-13 Chris Toshok <toshok@helixcode.com>
-
- * configure.in: offer --enable-pilot-conduits to add pilot
- conduits if the user wants them.
-
-2000-08-13 Dan Winship <danw@helixcode.com>
-
- * configure.in: Fix the name of the binary to look for for PGP5
-
-2000-08-12 Michael Meeks <michael@helixcode.com>
-
- * configure.in: Check for Bonobo 0.17
-
-2000-08-12 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Added addressbook/gui/search/Makefile.
-
-2000-08-12 Dan Winship <danw@helixcode.com>
-
- * configure.in, README: Depend on gnome-vfs 0.3
-
-2000-08-10 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/.cvsignore, widgets/e-text/Makefile.am,
- widgets/e-text/e-entry-test.c: Added a test for the EEntry widget.
-
-2000-08-09 Dan Winship <danw@helixcode.com>
-
- * data/evolution.keys: New file containing MIME keys for
- Evolution. Currently just the addressbook minicard display.
-
- * data/Makefile.am (mime_DATA): add evolution.keys
-
-2000-08-09 Peter Williams <peterw@helixcode.com>
-
- * configure.in (EVOLUTION_DIR): Remove the warning about camel-async.
-
-2000-08-08 Peter Williams <peterw@helixcode.com>
-
- * Makefile.am (SUBDIRS): Reenable the calendar. Oops.
-
-2000-08-05 Dan Winship <danw@helixcode.com>
-
- * tools/verify-evolution-install.sh: Look for oafinfo files in
- oaf's prefix, not gnome-libs's. Allow binaries to be installed
- anywhere in $PATH.
-
- * configure.in, README: Update the README and the text of the
- Bonobo configure check to match reality. Remove the 0.15 vs
- 0.15-and-a-half check since we require post-0.16 now.
-
-2000-08-03 JP Rosevear <jpr@helixcode.com>
-
- * configure.in: Remove gconf check
-
-2000-08-03 Alastair McKinstry <mckinstry@computer.org>
-
- * configure.in (ALL_LINGUAS): Add Irish translation
-
-2000-08-02 Michael Meeks <michael@helixcode.com>
-
- * configure.in: update for BonoboX
-
-2000-08-02 Dan Winship <danw@helixcode.com>
-
- * configure.in (AC_OUTPUT): Add camel/providers/nntp
-
-2000-08-02 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c: Made clicking choose the right
- character even if show_borders is on.
-
-2000-08-01 Dan Winship <danw@helixcode.com>
-
- * configure.in, acconfig.h: Add checks for GPG, PGP 5 and PGP 2.
- Only record the first one found.
-
-2000-08-01 Damon Chaplin <damon@helixcode.com>
-
- * configure.in (AC_OUTPUT): removed calendar/doc/*
-
-2000-08-01 Not Zed <NotZed@HelixCode.com>
-
- * configure.in: Added mh provider.
-
-2000-07-27 Dan Winship <danw@helixcode.com>
-
- * configure.in: Check for gconf_client_get_default (gconf 0.5 vs
- newer)
-
-2000-07-26 Ettore Perazzoli <ettore@helixcode.com>
-
- * configure.in: Bump version number to 0.3.
-
-2000-07-26 Peter Williams <peterw@helixcode.com>
-
- * widgets/e-table/e-table-scrolled.c (right_click_proxy): Default
- the return value to 0.
-
-2000-07-25 Dan Winship <danw@helixcode.com>
-
- * configure.in: some unrelated changes: check for mkdtemp,
- gnome_vfs_mime_get_default_action_without_fallback, and a
- setuid/setgid movemail binary.
-
- * acconfig.h: add MOVEMAIL_PATH
-
-2000-07-25 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Added addressbook/conduit/Makefile.
-
-2000-07-21 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c: Made focus in not change your selection
- position.
-
-2000-07-21 Szabolcs BAN <shooby@gnome.hu>
-
- * calendar/gui/event-editor.c: Typo fix
-
-2000-07-20 Peter Williams <peterw@helixcode.com>
-
- * configure.in (THREADS_CFLAGS): Make threads mandatory
- again.
-
-2000-07-19 Fatih Demir <kabalak@gmx.net>
-
- * evolution.desktop & data/evolution.desktop: Added
- the Turkish desktop entries.
-
-2000-07-17 Federico Mena Quintero <federico@helixcode.com>
-
- * configure.in (EVOLUTION_DIR): Typo fix.
-
- * configure.in (AC_OUTPUT): Added the doc/devel Makefiles.
- (EVOLUTION_DIR): Substitute EVOLUTION_DIR for the top_srcdir.
- Added checks for gtk-doc.
-
-2000-07-13 Peter Williams <peterw@curious-george.helixcode.com>
-
- * configure.in (end): Bigass warnings for camel-async branch
- (remove them later).
-
-2000-07-12 Federico Mena Quintero <federico@helixcode.com>
-
- * configure.in: Make gnome-print-0.20 mandatory. We will bail out
- with CVS HEAD versions to avoid breakage.
-
-2000-07-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * Version 0.2.
-
- * configure.in: Reverse the GtkHTML check.
-
-2000-07-10 Jeffrey Stedfast <fejj@helixcode.com>
-
- * configure.in: Updated to check for required GtkHTML and
- gnome-print
-
-2000-07-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * configure.in: Remove the conduits stuff for now. They depend on
- CVS gnome-pilot, and this is not good for the release.
-
-2000-07-10 Dan Winship <danw@helixcode.com>
-
- * README: updates
-
-2000-07-10 Seth Alves <alves@hungry.com>
-
- * configure.in: added makefiles for calendar conduits
-
-2000-07-10 Dan Winship <danw@helixcode.com>
-
- * configure.in: Add a check for Bonobo 0.15 vs Bonobo post-0.15
-
-2000-07-09 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c: Don't draw quite as large a "flat_box".
- If draw_borders is TRUE, cause the cursor to change even if not
- editing.
-
-2000-07-09 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-entry.c: Removed some border padding and set
- the "draw_borders" argument of the contained GtkText.
-
- * widgets/e-text/e-text.c, widget/e-text/e-text.h: Added a
- "draw_borders" argument which, if set, makes the EText look more
- like a GtkEntry.
-
-2000-07-09 Tuomas Kuosmanen <tigert@gimp.org>
-
- * art/evolution-contacts.png: updated so it has better contrast
- against the background.
-
- * art/evolution-contacts-small.png: Fits the style of the new contacts
- icon, this is a sigle card.
-
-2000-07-09 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text-model.c (e_text_model_real_get_text):
- Return "" instead of NULL.
-
-2000-07-07 Christopher James Lahey <clahey@helixcode.com>
-
- * art/Makefile.am: Fixed EXTRA_DIST for make distcheck.
-
-2000-07-07 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-entry.c: Set "anchor" and "fill_clip_rectangle"
- arguments.
-
- * widgets/e-text/e-text.c, widgets/e-text/e-text.h: Added
- "fill_clip_rectangle" argument which describes whether to accept
- clicks throughout the clipping rectangle.
-
-2000-07-07 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-entry.c: Fixed some typos.
-
-2000-07-07 Tuomas Kuosmanen <tigert@gimp.org>
-
- * art/evolution-contacts.png: Changed icon (hi ettore)
- The old handshake one was a little too firm handshake..
- this is a rolodex icon..
-
-2000-07-07 Dan Winship <danw@helixcode.com>
-
- * configure.in: make pthreads not required again, since they
- aren't, and remove widgets/e-toolbar/Makefile from AC_OUTPUT since
- that dir doesn't exist any more.
-
-2000-07-06 Chris Toshok <toshok@helixcode.com>
-
- * configure.in (AC_OUTPUT): remove the default_user Directories
- dir.
-
-2000-07-06 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am, libical/configure.in: Fixed some make distcheck
- errors.
-
-2000-07-05 Ettore Perazzoli <ettore@helixcode.com>
-
- * configure.in (GNOME_VFS_CFLAGS): Define.
- (GNOME_VFS_LIBS): Define.
-
-2000-07-03 Ettore Perazzoli <ettore@helixcode.com>
-
- * configure.in: Add
- `addressbook/gui/component/select-names/Makefile' to the
- `AC_OUTPUT()' list.
-
-2000-07-03 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/Makefile.am: Added e-entry.c and e-entry.h.
-
- * widgets/e-text/e-entry.c, widgets/e-text/e-entry.h: New files to
- be a widget containing a text item.
-
- * widgets/e-text/e-text.c: Fixed some spacing.
-
-2000-06-29 Ettore Perazzoli <ettore@helixcode.com>
-
- * notes/component-factory.c (owner_set_cb): Get an
- EvolutionShellClient instead of an Evolution_Shell to match the
- changes in libeshell.
-
-2000-06-29 Peter Williams <peterw@helixcode.com>
-
- * configure.in: Re-enable GNOME_PILOT_CHECK.
- Change AC_MSG_CHECKING([For...]) to [for...]. It's the little
- things that matter.
-
-2000-06-28 Ettore Perazzoli <ettore@helixcode.com>
-
- * configure.in: `AM_PATH_GCONF'.
-
-2000-06-27 Peter Williams <peterw@curious-george.helixcode.com>
-
- * configure.in (ctime_r): Check for whether ctime_r takes
- two (Linux) or three (Solaris) arguments.
- (AC_OUTPUT): Don't create notes/Makefile twice.
-
- * acconfig.h: Add CTIME_R_THREE_ARGS to the list.
-
-2000-06-26 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c: Calculate height including if
- clip_height is set to -1.
-
-2000-06-26 Peter Williams <peterw@curious-george.helixcode.com>
-
- * configure.in (THREADS_CFLAGS): Add option --enable-broken-threads
- to turn on the threading stuff in evolution-mail. Defaults to no.
-
- * acconfig.h: Add USE_BROKEN_THREADS to the list.
-
-2000-06-25 Ettore Perazzoli <ettore@helixcode.com>
-
- * configure.in: Use `glib-config' instead of `$GLIB_CONFIG' as the
- latter is not actually defined anywhere.
-
-2000-06-25 Peter Williams <peterw@helixcode.com>
-
- * configure.in (pthread stuff): Make threads required due
- to threaded evolution-mail. Subst in the THREADS_LIBS et
- al.
-
- * tests/Makefile.am: Remove USE_THREADS conditional as we
- always use threads now.
-
-2000-06-21 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c: Fixed some vertical scroll bugs.
-
-2000-06-21 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c: Fix a bug with intial vertical scroll.
-
-2000-06-21 Christopher James Lahey <clahey@helixcode.com>
-
- * notes/e-note.c, widgets/meeting-time-sel/e-meeting-time-sel.c,
- widgets/shortcut-bar/e-icon-bar.c: Removed the usage of "x" and
- "y" arguments to EText.
-
- * widgets/e-text/e-text.c, widgets/e-text/e-text.h: Removed the
- "x" and "y" arguments to EText. Added vertical scrolling.
-
-2000-06-20 Damon Chaplin <damon@helixcode.com>
-
- * widgets/meeting-time-sel/e-meeting-time-sel-item.c:
- * widgets/meeting-time-sel/e-meeting-time-sel.c: fixed a few warnings.
-
-2000-06-17 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c: Made EText use the font from the
- canvas's style if one isn't set.
-
-2000-06-17 Damon Chaplin <damon@helixcode.com>
-
- * widgets/meeting-time-sel/*: updated to use EText items rather than
- GtkEntry widgets and added support for adding new rows.
-
-2000-06-15 Dan Winship <danw@helixcode.com>
-
- * README: bye bye goad
-
-2000-06-14 Damon Chaplin <damon@helixcode.com>
-
- * README (http): added command to co ORBit.
-
-2000-06-13 Jeffrey Stedfast <fejj@helixcode.com>
-
- * configure.in: Added IMAP into the build
-
-2000-06-13 Ettore Perazzoli <ettore@helixcode.com>
-
- * notes/Makefile.am (SHELL_OBJS): Removed.
- (evolution_notes_LDADD): Link with
- `$(top_builddir)/shell/libeshell.a'.
-
-2000-06-12 Ettore Perazzoli <ettore@helixcode.com>
-
- * widgets/Makefile.am (SUBDIRS): build `misc' before everything
- else.
-
- * Makefile.am: Install `evolution.png' and `evolution.desktop'
- where appropriate.
-
- * evolution.png: New. For now, it's just a copy of
- `art/evolution-inbox.png'.
-
- * evolution.desktop: New.
-
-2000-06-10 Zbigniew Chyla <chyla@buy.pl>
-
- * configure.in: Added pl (Polish) to ALL_LINGUAS
-
-2000-06-09 Ettore Perazzoli <ettore@helixcode.com>
-
- * configure.in: Added new directory `shell/glade'.
-
-2000-06-07 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-paned/e-hpaned.c, widgets/e-paned/e-paned.c,
- widgets/e-paned/e-paned.h, widgets/e-paned/e-vpaned.c: Added a
- "quantum" argument for making the panes move in jumps.
-
-2000-06-07 Anders Carlsson <andersca@gnu.org>
-
- * configure.in: Create notes/Makefile
-
- * notes/*: Add preliminary yellow sticky notes.
-
-2000-06-05 Mathieu Lacage <mathieu@gnome.org>
-
- * addressbook/contact-editor/Makefile.am: make it
- compile: add proper bonobo linking params.
- * addressbook/gui/minicard/Makefile.am: idem.
- * wombat/Makefile.am: add BONOBO_VFS_GNOME_CFLAGS.
- cleanup some useless includes and libs.
-
-2000-06-02 Ettore Perazzoli <ettore@helixcode.com>
-
- * configure.in (ALL_LINGUAS): Add `it' and `de'.
-
-2000-06-02 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Released Evolution 0.1.
-
-2000-06-02 Christopher James Lahey <clahey@helixcode.com>
-
- * tests/test-movemail.c: Reverted removal of e_setup_base_dir.
-
-2000-06-02 Jesus Bravo Alvarez <jba@pobox.com>
-
- * configure.in: Added pt (Portuguese) to ALL_LINGUAS
-
-2000-06-02 Dan Winship <danw@helixcode.com>
-
- * README: Update dependencies. Rewrite the GOAD vs OAF thing some
- more to reflect OAF's new ascendency. Make the fact that you don't
- need pilot stuff clearer. Add some new directories to the
- directory layout section.
-
-2000-06-02 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/misc/e-clipped-label.c: Free the finish data.
-
-2000-06-01 Christopher James Lahey <clahey@helixcode.com>
-
- * tests/test-movemail.c (main): Don't call e_setup_base_dir.
-
-2000-06-01 Dan Winship <danw@helixcode.com>
-
- * configure.in (AC_OUTPUT): add doc, doc/C
-
- * Makefile.am (SUBDIRS): add doc
-
-2000-05-31 Federico Mena Quintero <federico@helixcode.com>
-
- * widgets/misc/e-scroll-frame.[ch]: Imported GtkScrollFrame from
- EOG and renamed it to EScrollFrame.
-
- * widgets/misc/Makefile.am (libemiscwidgets_a_SOURCES): Added
- e-scroll-frame.[ch].
-
-2000-05-30 Ettore Perazzoli <ettore@helixcode.com>
-
- * widgets/e-paned/e-vpaned.c (e_vpaned_handle_shown): Show the
- handle even if the requisition for the child is zero.
- * widgets/e-paned/e-hpaned.c (e_hpaned_handle_shown): Likewise.
-
-2000-05-26 Héctor García Alvarez <hector@scouts-es.org>
-
- * configure.in: Added Spanish language
-
-2000-05-25 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-paned/e-hpaned.c, widgets/e-paned/e-vpaned.c: Fixed a
- bug where we were resizing a non-existent window.
-
-2000-05-25 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-paned/e-hpaned.c, widgets/e-paned/e-paned.c,
- widgets/e-paned/e-paned.h, widgets/e-paned/e-vpaned.c: Made
- the handlebar disappear if either side is empty, hidden, or
- requests 0 size.
-
-2000-05-24 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Added widgets/e-paned/Makefile.
-
- * tests/ui-tests/message-browser.c: Switched from GtkPaned to
- EPaned.
-
- * widgets/Makefile.am: Added e-paned directory.
-
- * widgets/e-paned/, widgets/e-paned/.cvsignore,
- widgets/e-paned/Makefile.am, widgets/e-paned/e-hpaned.c,
- widgets/e-paned/e-hpaned.h, widgets/e-paned/e-paned.c,
- widgets/e-paned/e-paned.h, widgets/e-paned/e-vpaned.c,
- widgets/e-paned/e-vpaned.h: New widget based completely on
- GtkPaned from 1.4. This will be more advanced soon.
-
-2000-05-22 Jeff Stedfast <fejj@helixcode.com>
-
- * configure.in: Readded camel/providers/smtp
-
-2000-05-22 Szabolcs BAN <shooby@gnome.hu>
-
- * configure.in: Added Hungarian language
-
-2000-05-18 Dan Winship <danw@helixcode.com>
-
- * configure.in (AC_OUTPUT): add camel/providers/vee
-
-2000-05-16 Ettore Perazzoli <ettore@helixcode.com>
-
- * art/Makefile.am: Install the mini icons.
-
-2000-05-16 Chris Toshok <toshok@helixcode.com>
-
- * configure.in: add --with-purify-options support, and default it
- to what we at helix need
-
-Tue May 16 06:11:40 2000 Tuomas Kuosmanen <tigert@gimp.org>
-
- * art/evolution-calendar-mini.png art/evolution-inbox-mini.png
- art/evolution-tasks-mini.png art/evolution-contacts-mini.png
- art/evolution-notes-mini.png: new mini-icons for the tree view
- of folders and stuff.
-
-2000-05-14 Federico Mena Quintero <federico@helixcode.com>
-
- * configure.in (AC_OUTPUT): Added calendar/gui/dialogs/Makefile.am.
-
-2000-05-10 Matt Loper <matt@helixcode.com>
-
- * README: Added version and availability of required libunicode
- library.
-
-2000-05-10 Dan Winship <danw@helixcode.com>
-
- * configure.in: Update versions needed for gnome-print, bonobo,
- and gtkhtml.
-
-2000-05-10 Christopher James Lahey <clahey@helixcode.com>
-
- * HACKING: We need a HACKING file.
-
-2000-05-10 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Removed dist-hook section.
-
- * configure.in: Set the version number. Added a check for gnome
- window icons. Removed a bunch of unused Makefiles.
-
- * tools/Makefile.am: Created a proper EXTRA_DIST section.
-
- * widgets/e-text/Makefile.am: Added
- e-text-event-processor-types.h.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * art/Makefile.am: Added briefcase.png to get installed.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c: Remove the tooltip callback when
- destroyed.
-
-2000-05-09 Matt Loper <matt@helixcode.com>
-
- * calendar/pcs/cal-backend.c (cal_backend_add_cal): Return nothing
- for a 'void' function.
-
-2000-05-08 Christopher James Lahey <clahey@helixcode.com>
-
- * widget/e-text/e-text.c, widgets/e-text/e-text.h: Added an
- activate signal.
-
-2000-05-06 Chris Toshok <toshok@helixcode.com>
-
- * configure.in: Added new Directories section for the default_user.
-
-2000-05-06 Ettore Perazzoli <ettore@helixcode.com>
-
- * configure.in: Updated for the new `default_user' directory
- setup.
-
-2000-05-06 Chris Toshok <toshok@helixcode.com>
-
- * configure.in: check for purify.
-
-2000-05-06 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c, widgets/e-text/e-text.h: Added a
- "changed" signal that gets sent whenever the text changes.
-
-2000-05-05 Ettore Perazzoli <ettore@helixcode.com>
-
- * Added `--enable-purify' flag.
-
-2000-05-05 Chris Toshok <toshok@helixcode.com>
-
- * shell/Makefile.am: add support for building purified evolution.
-
- * shell/.cvsignore: ignore evolution.pure
-
-2000-05-05 Chris Toshok <toshok@helixcode.com>
-
- * addressbook/backend/ebook/.cvsignore,
- addressbook/contact-editor/.cvsignore,
- addressbook/gui/component/.cvsignore,
- addressbook/gui/minicard/.cvsignore,
- addressbook/printing/.cvsignore,
- calendar/cal-client/.cvsignore,
- calendar/gui/.cvsignore,
- calendar/pcs/.cvsignore,
- filter/.cvsignore,
- mail/.cvsignore,
- shell/.cvsignore,
- tests/.cvsignore,
- widgets/e-table/.cvsignore,
- widgets/e-text/.cvsignore,
- widgets/meeting-time-sel/.cvsignore,
- widgets/shortcut-bar/.cvsignore,
- wombat/.cvsignore: ignore the .pure directory
-
-2000-05-04 Dan Winship <danw@helixcode.com>
-
- * configure.in: Oops. The Kerberos check was succeeding when it
- shouldn't have (and thus breaking the pop3 build for "normal"
- people). Fix.
-
-2000-05-03 Michael Meeks <michael@helixcode.com>
-
- * configure.in (xmlversion): Fix to remove older 'libxml' prefix.
-
-2000-05-02 Ettore Perazzoli <ettore@helixcode.com>
-
- * configure.in: Do not output `doc/Makefile' because there is
- nothing to generate it from.
-
-2000-05-02 Dan Winship <danw@helixcode.com>
-
- * configure.in, acconfig.h: add some minimal Kerberos checking.
- This isn't intended to be generically useful at this point, it's
- just there to give me a second POP auth mechanism to play with.
-
- Also remove a bit of cruft, and reorganize configure.in a bit.
-
-2000-05-02 NotZed <NotZed@HelixCode.com>
-
- * tests/test13.c: And here too.
-
- * tests/test2.c (main): REmoved gmime-utils.h
-
- * tests/Makefile.am (LDADD): Add libeutil to default link line.
- (test_movemail_LDADD): Fixed order for libutil linking.
-
-2000-05-02 Matt Loper <matt@helixcode.com>
-
- * tests/Makefile.am: set G_LOG_DOMAIN.
- * tests/ui-tests/Makefile.am: same.
- * widgets/e-text/Makefile.am: same.
- * widgets/meeting-time-sel/Makefile.am: same.
-
-2000-05-01 NotZed <NotZed@HelixCode.com>
-
- * tests/test11.c (main): *sigh* moved back to sync api.
-
-2000-05-01 NotZed <NotZed@HelixCode.com>
-
- * tests/test11.c (search_cb): Try deleting messages ...
- (main): Fix for provider api changes.
-
-2000-05-01 Anders Carlsson <andersca@gnu.org>
-
- * configure.in: Check if bonobo uses oaf, so you don't
- need to specify --enable-oaf.
-
-2000-04-27 Ettore Perazzoli <ettore@helixcode.com>
-
- * acconfig.h: New configured #define `USING_OAF'.
-
- * configure.in: Added `--enable-oaf' option and corresponding
- `OAF_LIBS' and `OAF_FLAGS' variables. Code friendly provided by
- Maciej Stachowiak <mjs@eazel.com>.
-
-2000-04-27 NotZed <NotZed@HelixCode.com>
-
- * tests/test10.c: Fix for removal of camelmimebodypart, and changes
- to recipient stuff.
-
- * tests/test1.c: Fix for removal of camelmimebodypart, and changes
- to recipient stuff.
-
-2000-04-27 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Added addressbook/ename/Makefile.
-
-2000-04-27 Matt Loper <matt@helixcode.com>
-
- * configure.in: added tools/Makefile.
-
- * Makefile.am: Added tools.
-
- * tools/: New directory for tools relating to evolution.
-
- * tools/killev: New script for killing all evolution-related
- stuff.
-
- * tools/Makefile.am: New file.
-
- * tools/.cvsignore: New file.
-
-2000-04-26 NotZed <NotZed@HelixCode.com>
-
- * tests/test13.c (main): And here too.
-
- * tests/test2.c (main): Same here.
-
- * tests/test1.c (main): Change for removed simpledatawrapper.
-
-2000-04-26 Matt Loper <matt@helixcode.com>
-
- * tests/.cvsignore: Added test13.
-
- * default_user/.cvsignore: New file.
-
- * widgets/e-text/e-text.c (e_text_destroy): Kill text->timer and
- text->timeout on destroy.
-
-2000-04-26 Dan Winship <danw@helixcode.com>
-
- * tests: Update for the camel changes.
-
- * Makefile.am (SUBDIRS): Remove tests. They aren't terribly
- useful/interesting any more for the most part, and they frequently
- don't compile.
-
-2000-04-24 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c: Made the tooltip show up in the correct
- place and configuration when using the "max_lines", "anchor"
- (untested), or "justification" arguments.
-
-From a patch by Iain Holmes <ih@csd.abdn.ac.uk>
-
- * widgets/e-text/e-text-event-processor-emacs-like.c,
- widget/e-text/e-text-event-processor-types.h,
- widgets/e-text/e-text.c, widgets/e-text/e-text.h: Changed C-w and
- C-y to control the X clipboard. Added double and triple click
- events.
-
-2000-04-24 Fatih Demir <kabalak@gmx.net>
-
- * configure.in : Added tr to ALL_LINGUAS .
-
-2000-04-24 NotZed <NotZed@HelixCode.com>
-
- * tests/test13.c (main): Fixed for method movements.
-
- * tests/test3.c (main): Removed from build, data-wrapper-repository removed.
-
-2000-04-23 NotZed <NotZed@HelixCode.com>
-
- * tests/test2.c (main): Changed to use construct_from_stream.
-
- * tests/test1.c (main): Chagned to use construct_from_stream.
-
-2000-04-24 Matt Loper <matt@helixcode.com>
-
- * default_user/Makefile.am: new file.
-
- * default_user/Main_Shortcuts.xml: New file; is used to fill the
- shortcut bar's "main shortcuts" pane.
-
- * default_user/Other_Shortcuts.xml: New file, used to fill the
- shortcut bar's "other shortcuts" pane.
-
- * default_user/Inbox.mbox: New file. This is the first message a
- new user will see when they fire up Evolution. Needs work.
-
- * Makefile.am: added default_user directory.
- * configure.in: same.
-
-2000-04-23 NotZed <NotZed@HelixCode.com>
-
- * tests/test10.c: Removed some unecessary includes. From
- Ali Abdin <aliabdin@aucegypt.edu>
- (create_sample_mime_message): Changed for date api change.
-
- * tests/Makefile.am (noinst_PROGRAMS): Put test10 back.
-
-2000-04-22 NotZed <NotZed@HelixCode.com>
-
- * tests/test1.c (main): Changed for date api change.
-
-2000-04-20 NotZed <NotZed@HelixCode.com>
-
- * tests/test11.c: Fixed some headers.
-
- * tests/Makefile.am (noinst_PROGRAMS): Removed test9.
- (noinst_PROGRAMS): Removed test12, temporarirly (nntp not being
- built).
- Removed test10.
-
-2000-04-20 Yukihiro Nakai <nakai@gnome.gr.jp>
-
- * configure.in: Add Japanese to ALL_LINGUAS
-
-2000-04-19 Dan Winship <danw@helixcode.com>
-
- * README: More detail on exactly what versions of what libraries
- are needed.
-
-2000-04-18 Dan Winship <danw@helixcode.com>
-
- * tests/*: remove camel-log references
-
-2000-04-17 Dan Winship <danw@helixcode.com>
-
- * configure.in (xmlpatch): Require gnome-xml 1.8.7 (or later,
- but not 2.0). xmlParseMemory's behavior in 1.8.7 is incompatible
- with its behavior in 1.8.6 and earlier.
-
- * tests/test-url.c: New program to test CamelURL
-
-2000-04-16 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/ebook/e-card.c,
- addressbook/backend/ebook/e-card.h,
- addressbook/backend/ebook/test-card.c,
- addressbook/backend/pas/pas-backend-file.c,
- addressbook/contact-editor/e-contact-editor.c: Added
- orginizational unit, nickname, and internet free-busy fields.
-
- * addressbook/contact-editor/contact-editor.glade: Renamed some
- incorrectly named fields.
-
-2000-04-16 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/ebook/e-card.c,
- addressbook/backend/ebook/e-card.h,
- addressbook/backend/ebook/test-card.c,
- addressbook/backend/pas/pas-backend-file.c,
- addressbook/gui/minicard/e-minicard.c: Added orginization and role
- fields.
-
- * addressbook/contact-editor/contact-editor.glade,
- addressbook/contact-editor/e-contact-editor-strings.h: Renamed
- some incorrectly named fields.
-
- * addressbook/contact-editor/e-contact-editor.c: Added
- orginization and role fields as well as hooking up the birth date
- field.
-
- * addressbook/gui/minicard/e-minicard-view.c: Added a missing include.
-
-2000-04-15 Matt Loper <matt@helixcode.com>
-
- * addressbook/gui/component/addressbook.c
- (search_entry_activated): New function. Gets called when the quick
- search entry is called on to perform a search.
- (make_quick_search_widget): New function; returns a "quick search"
- widget.
- (control_activate): During the construction of the toolbar, a
- "quick search" widget is included.
-
-2000-04-14 Chris Toshok <toshok@helixcode.com>
-
- * tests/.cvsignore: add test12
-
- * tests/test12.c (main): add test for nntp stuff.
-
- * tests/Makefile.am (noinst_PROGRAMS): same.
-
-
-2000-04-14 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/ebook/e-card.c,
- addressbook/backend/ebook/e-card.h,
- addressbook/backend/pas/pas-backend-file.c,
- addressbook/backend/pas/pas-backend-ldap.c,
- addressbook/contact-editor/e-contact-editor.c: Added a note field.
-
-2000-04-15 Ettore Perazzoli <ettore@helixcode.com>
-
- * addressbook/backend/ebook/e-card-cursor.h: #include
- "addressbook/backend/ebook" to make sure we pick up the right
- addressbook.h. Butt ugly, but at least it makes it possible for
- me to build Evolution.
-
- * addressbook/gui/minicard/Makefile.am (INCLUDES): Use
- `$(builddir)' so that we pick up the IDL-generated includes
- correctly.
- * addressbook/backend/pas/Makefile.am: Likewise. Also use
- `$(srcdir)'.
-
- * addressbook/backend/ebook/Makefile.am: Use `$(srcdir)' so that
- it works with builddir != srcdir.
- * addressbook/backend/pas/Makefile.am: Likewise.
-
-2000-04-14 Chris Toshok <toshok@helixcode.com>
-
- * addressbook/backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_ensure_connected): don't ldap_simple_bind_s if
- the ldap_open failed, and fix warnings.
- (pas_backend_ldap_build_all_cards_list): don't do search if the
- ensure_connected failed, and fix warnings.
- (pas_backend_ldap_search): same.
- (poll_ldap): fix warnings.
- (pas_backend_ldap_process_get_book_view): same.
- (pas_backend_ldap_get_vcard): same.
- (pas_backend_ldap_load_uri): same.
-
- * configure.in: quiet configure in the case where it can't find
- ldap libs.
-
-2000-04-13 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/contact-editor/e-contact-editor.c (extract_info):
- Check for 0 length fields when building the outgoing ECard.
-
-2000-04-13 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/pas/pas-book-view.c: Give correct warnings.
-
- * addressbook/backend/ebook/e-card.c (e_card_set_arg): g_strdup
- url and title.
-
-2000-04-13 Chris Toshok <toshok@helixcode.com>
-
- * addressbook/contact-editor/e-contact-editor.c
- (fill_in_info): reflect the title attribute in the contact editor.
- (extract_info): same.
-
- * addressbook/backend/pas/pas-backend-ldap.c: add the title attribute.
-
- * addressbook/gui/minicard/test-reflow.c: add a title.
-
- * addressbook/gui/minicard/e-minicard.c (remodel): add support for
- the title attribute.
-
- * addressbook/backend/ebook/e-card.c (e_card_get_vcard): save out
- the title to the vcard.
-
- * addressbook/backend/ebook/test-card.c: add title field foo to
- the test.
-
- * addressbook/backend/ebook/e-card.c: reflect the title field.
-
- * addressbook/backend/ebook/e-card.h: un-#if 0 the title field.
-
- * addressbook/backend/pas/pas-backend-ldap.c (poll_ldap): new
- function that polls ldap for more search responses.
- (pas_backend_ldap_search): use the async search interface and
- register an idle call to poll for the responses.
- (view_destroy): make sure to g_source_remove the idle id.
-
-2000-04-12 Chris Toshok <toshok@helixcode.com>
-
- * addressbook/backend/pas/pas-backend-file.c (entry_compare):
- rework this function to use a table mapping search field names to
- vcard properties and extra information (such as whether or not the
- property is a list.)
-
- * addressbook/backend/pas/pas-backend-ldap.c
- (construct_email_list): new function, to build the ECardList for
- email addresses.
- (construct_phone_list): new function, to build the ECardList for
- phone numbers.
- (pas_backend_ldap_search): use a table mapping ldap attributes to
- ecard properties, and use the special list construction functions
- if the property calls for it. general cleanup. added a comment
- about not calling ber_free if there was a decoding error.
-
-
-2000-04-12 Matt Loper <matt@helixcode.com>
-
- * art/Makefile.am: Add tigert's contact-dlg-related images.
-
- * addressbook/contact-editor/e-contact-editor.c (_add_images): Add
- tigert's images.
-
- * addressbook/contact-editor/Makefile.am: add EVOLUTION_IMAGES.
-
-2000-04-12 Tuomas Kuosmanen <tigert@gimp.org>
-
- * art/house.png, art/malehead.png, art/cellphone.png,
- art/briefcase.png, art/envelope.png, art/globe.png:
- New icons for the contact manager.. more to follow once I get
- around to do more artist work..
-
-2000-04-12 Chris Toshok <toshok@helixcode.com>
-
- * addressbook/backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_build_all_cards_list): delay the setting of the
- ldap variable until we've ensured we were connected. Also, set
- the search limit to LDAP_MAX_SEARCH_RESPONSES (we'll eventually
- want a user setting here i assume.)
- (pas_backend_ldap_search): same here, and also send back lists of
- CARDS_PER_VIEW_NOTIFICATION length in each
- pas_book_view_notify_add call. also, don't call ber_free if there
- was a decoding error, since the ldap library frees it for us.
-
-2000-04-11 Miguel de Icaza <miguel@gnu.org>
-
- * configure.in (have_pthread): Properly use AC_ARG_WITH
-
-2000-04-11 Chris Toshok <toshok@helixcode.com>
-
- * wombat/Makefile.am (wombat_LDADD): add LDAP_LIBS here.
-
- * configure.in: check for -lldap and -llber and if both are
- present include ldap support in the pas/wombat.
-
- * addressbook/backend/pas/Makefile.am (libpas_la_SOURCES): include
- pas-backend.ldap.c if ENABLE_LDAP.
-
- * addressbook/backend/pas/pas-backend-ldap.c: get searching
- working (converting between the sexp and ldap stuff.)
-
- * wombat/wombat.c (setup_pas): register the ldap pas backend if
- HAVE_LDAP is defined.
-
-2000-04-11 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Changed AC_DEFUN to AC_DEFINE.
-
- * acconfig.h: Added HAVE_TIMEZONE and HAVE_TM_GMTOFF.
-
-2000-04-11 Chris Toshok <toshok@helixcode.com>
-
- * configure.in: check for timezone as a variable (as it is in
- linux, but not in freebsd or netbsd.)
-
-2000-04-11 Larry Ewing <lewing@helixcode.com>
-
- * widgets/e-table/e-cell-toggle.c (etog_draw): update for new
- gdk-pixbuf. Added a disabled chuck of code to do alpha blending
- on pixmaps.
-
-2000-04-11 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c: Moved some logic a bit. Minor changes.
-
-00-04-11 Iain Holmes <ih@csd.abdn.ac.uk>
-
- * widgets/e-text/e-text.c
- (e_text_set_args): Recalculate bounds when width or clip_width changes.
- (tooltip_event): Forward clicks on the tooltip onto the text item.
- (_do_tooltip): Correct the origin co-ordinates to the items co-ords.
- (e_text_point): Return 0 when the mouse is on the item.
- (_do_tooltip): Make the tooltip obey the parent items
- line_wrap and max_lines.
-
-00-04-11 Chris Toshok <toshok@helixcode.com>
-
- * addressbook/backend/pas/pas-backend-file.c
- (get_e_card_prop): new function, taking code from func_contains to
- get string properties.
- (entry_compare): new function generic, taking strstr-like function
- as a parameter.
- (func_contains): rewrite function to use entry_compare.
- (is_helper): new helper function to map strcmp to a strstr-like
- function.
- (func_is): new function, implementing "is" for searches.
- (endswith_helper): new function.
- (func_endswith) new function, implementing "endswith" for
- searches.
- (beginswith_helper): new function.
- (func_beginswith): new function, implementing "beginswith" for
- searches.
- (compare_email): new function for searching all email addresses of
- a contact.
- (compare_phone): new function for searching all phone numbers of a
- contact.
- (compare_address): new function for searching all addresses of a
- contact (unimplemented as yet).
- (entry_compare): add support for searching the list items "email",
- "phone" and "address".
- (vcard_matches_search): free the esexp_result.
- (entry_compare): we want comparison functions to take 2 args.
-
-2000-04-11 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/gui/minicard/e-minicard-view.c: This was setting
- E_REFLOW(view)->items to NULL too soon. Fixed now.
-
-2000-04-11 Chris Toshok <toshok@helixcode.com>
-
- * addressbook/backend/pas/pas-backend-file.c
- (pas_backend_file_search): remove spew.
- (pas_backend_file_process_create_card): move the sync to the
- earliest possible point after the db operation.
- (pas_backend_file_process_remove_card): same.
- (pas_backend_file_process_modify_card): same, and call
- pas_book_respond_modify, not pas_book_respond_remove, here.
-
- * addressbook/gui/component/addressbook.c (card_deleted_cb): new
- function.
- (delete_contact_cb): wire up button to call
- e_minicard_view_remove_selection.
-
- * addressbook/gui/minicard/e-minicard-view.c
- (e_minicard_view_remove_selection): fix warning, and stick "view"
- in the name.
-
-2000-04-10 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/ebook/e-book-view.c,
- addressbook/backend/ebook/e-book.c: Changed some incorrect
- gtk_object_refs and gtk_object_unrefs into bonobo_object_refs and
- bonobo_object_unrefs.
-
- * addressbook/backend/pas/pas-card-cursor.c: Changed a
- gtk_object_destroy to a gtk_object_unref.
-
- * addressbook/gui/minicard/e-minicard-view.c,
- addressbook/gui/minicard/e-minicard-view.h: Set a list pointer to
- NULL after freeing its contents. Added
- e_minicard_view_remove_selection function.
-
- * addressbook/gui/minicard/e-reflow.c: Set a list pointer to NULL
- after freeing its contents.
-
-2000-04-11 Chris Toshok <toshok@helixcode.com>
-
- * addressbook/gui/component/addressbook.c (find_contact_cb):
- implement braindead dialog to input the query string for the view.
-
- also, change all callbacks to get the EMinicardView instead of the
- EBook.
-
- * addressbook/gui/minicard/e-minicard-view.c
- (e_minicard_view_get_arg): add missing break.
-
-2000-04-10 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/gui/minicard/e-minicard-view.c,
- addressbook/gui/minicard/e-minicard-view.h: Added a "query"
- argument to the e-minicard-view. Documented all the arguments to
- the e-minicard-view.
-
-2000-04-10 Chris Toshok <toshok@helixcode.com>
-
- * addressbook/gui/minicard/e-minicard-view.c (get_view): change
- the empty search string ("") to the valid (contains "full_name" "").
-
- * wombat/Makefile.am (wombat_LDADD): reorder so libeutil.la comes
- after libpas (since it uses the sexp stuff now.)
-
- * addressbook/backend/pas/Makefile.am (INCLUDES): add
- -I$(top_srcdir)/addressbook/backend/ebook
-
- * addressbook/backend/pas/pas-backend-file.c
- (view_destroy): free the search context and unref the sexp.
- (string_to_dbt): save the zero byte of strings, so we don't have
- to g_strndup everywhere.
- (func_contains): new function, implementing the (contains) search
- function.
- (vcard_matches_search): generic predicate to tell whether or not a
- vcard entry matches the current book view.
- (pas_backend_file_search): rip some of this code out of
- get_book_view (the portion building the list of cards) and make it
- use the e-sexp stuff.
- (pas_backend_file_process_create_card): use vcard_matches_search
- to only notify if the card will appear in the view.
- (pas_backend_file_process_remove_card): use vcard_matches_search
- to only notify if the card will be removed from the view.
- (pas_backend_file_process_modify_card): use vcard_matches_search
- to notify if the modified card was added, removed, or changed in
- the view.
-
-2000-04-10 Miguel de Icaza <miguel@gnu.org>
-
- * configure.in (GNOME_PRINT_CFLAGS): Update to support
- --disable-threads correctly.
-
-2000-04-10 Chris Toshok <toshok@helixcode.com>
-
- * addressbook/backend/pas/pas-backend-file.c
- (pas_backend_file_process_get_book_view): use view != NULL instead
- of checking db_error when we call pas_book_respond_get_book_view)
-
-2000-04-10 Dan Winship <danw@helixcode.com>
-
- * configure.in: check for mkstemp
-
-2000-04-10 Damon Chaplin <damon@helixcode.com>
-
- * configure.in (AC_OUTPUT): removed libical stuff since it has its
- own configure.in.
-
-2000-04-10 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/ebook/e-book-view.c: Fixed a bug where I was
- sending the wrong information to some callbacks.
-
- * addressbook/backend/ebook/e-card.c,
- addressbook/backend/ebook/e-card.h: Added an e_card_duplicate
- function. Made ids get stored in vcards. Made sure to delete the
- url if it exists.
-
- * addressbook/backend/pas/Makefile.am: Made pas include
- addressbook/backend/ebook/ in the search path.
-
- * addressbook/backend/pas/pas-backend-file.c: Fixed some bugs and
- made the create card function store the generated id in the card
- being saved.
-
- * addressbook/backend/pas/pas-book-view.c: Fixed a double free
- bug.
-
- * addressbook/contact-editor/e-contact-editor.c: Fixed some bugs.
- Made the contact editor actually return a valid card when
- gtk_object_get(editor, "card", ...) is called.
-
- * addressbook/contact-editor/e-contact-editor.h: Fixed a copy and
- paste error.
-
- * addressbook/gui/component/addressbook.c: Made this get the card
- properly.
-
- * addressbook/gui/minicard/Makefile.am: Made this include
- contact-editor directory in the search path and link against
- libecontacteditor so that double clicking can open a dialog.
-
- * addressbook/gui/minicard/e-minicard.c: Fixed some small bugs.
- Made double clicking open a contact editor dialog if this minicard
- is contained in a minicard view. (It needs the minicard view to
- get the EBook to save to.
-
- * wombat/Makefile.am: Link wombat against libebook, since
- pas-backend-file now uses ECard.
-
-2000-04-09 Matt Loper <matt@helixcode.com>
-
- * addressbook/gui/component/addressbook.c (control_activate): Make
- "New Contact" menuitem add a card with new_contact_cb().
-
- * addressbook/Makefile.am: Compile contact-editor, _then_ gui,
- since the gui now depends on the contact editor (shouldn't the
- contact-editor directory be moved into 'gui'?).
-
- * addressbook/gui/component/addressbook.c (card_added_cb): New
- function. Gets called when a card is successfully added via the
- contact-editor.
- (new_contact_cb): New function. Gets called when a user clicks the
- "new contact" button on the toolbar, and creates a contact-editor
- to edit a new contact entry.
- (control_activate): Call gnome_app_fill_toolbar_with_data()
- instead of gnome_app_fill_toolbar(), so that our toolbar can find
- the right book to add a new card to.
- (addressbook_factory): On an "activate" signal, send the book up
- to control_activate_cb.
-
- * addressbook/gui/component/addressbook-factory.c (init_bonobo):
- Call glade_gnome_init(), so that our contact-editor (which
- requires glade) doesn't barf.
-
- * addressbook/gui/component/Makefile.am: added the contact-editor
- to our libraries and include files.
-
- * addressbook/contact-editor/e-contact-editor.c
- (e_contact_editor_new): Set "card" gtk property to the passed-in
- card property.
-
- * addressbook/gui/component/addressbook.c (addressbook_factory):
- Added gtk_widget_push/pop_colormap/visual, which I assume is
- necessary for canvas use.
-
-2000-04-08 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/contact-editor/Makefile.am,
- addressbook/contact-editor/e-contact-editor.c,
- addressbook/contact-editor/e-contact-editor.h,
- addressbook/contact-editor/test-editor.c: Made the contact editor
- load from an ECard.
-
- * addressbook/backend/ebook/e-card.c,
- addressbook/backend/ebook/e-card.h,
- addressbook/gui/minicard/e-minicard.c: Added support for the URL
- field.
-
-2000-04-08 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/ebook/e-card.c (e_card_get_vcard): Fixed a
- small typo.
-
-2000-04-08 Dan Winship <danw@helixcode.com>
-
- * art/Makefile.am: pixmap_DATA should have been images_DATA (after
- pixmapdir was renamed to imagesdir)
-
-2000-04-08 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/gui/minicard/.cvsignore,
- addressbook/gui/minicard/Makefile.am,
- addressbook/gui/minicard/e-minicard-view.c,
- addressbook/gui/minicard/e-minicard-view.h,
- addressbook/gui/minicard/e-minicard.c,
- addressbook/gui/minicard/e-minicard.h,
- addressbook/gui/minicard/e-reflow-sorted.c,
- addressbook/gui/minicard/e-reflow-sorted.h,
- addressbook/gui/minicard/e-reflow.c,
- addressbook/gui/minicard/e-reflow.h,
- addressbook/gui/minicard/test-minicard-view.c,
- addressbook/gui/minicard/test-reflow.c,
- widgets/e-minicard/.cvsignore, widgets/e-minicard/Makefile.am,
- widgets/e-minicard/e-minicard-label.c,
- widgets/e-minicard/e-minicard-label.h,
- widgets/e-minicard/e-minicard-view.c,
- widgets/e-minicard/e-minicard-view.h,
- widgets/e-minicard/e-minicard.c, widgets/e-minicard/e-minicard.h,
- widgets/e-minicard/e-reflow-sorted.c,
- widgets/e-minicard/e-reflow-sorted.h,
- widgets/e-minicard/e-reflow.c, widgets/e-minicard/e-reflow.h,
- widgets/e-minicard/test-minicard-label.c,
- widgets/e-minicard/test-minicard-view.c,
- widgets/e-minicard/test-minicard.c,
- widgets/e-minicard/test-reflow.c: CVS move mistake. Fixed the
- correct changes in the correct places.
-
-2000-04-08 Christopher James Lahey <clahey@helixcode.com>
-
- * art/Makefile.am: pixmap_DATA isn't defined so don't use it as a variable.
-
- * addressbook/gui/component/,
- addressbook/gui/component/.cvsignore, addressbook/gui/Makefile.am,
- addressbook/gui/component/addressbook-factory.c,
- addressbook/gui/component/addressbook.c,
- addressbook/gui/component/addressbook.gnorba,
- addressbook/gui/component/addressbook.h: New directory to proivde
- the component for contact management. Simply uses an e-minicard-view.
-
- * addressbook/gui/minicard/e-minicard-view.c,
- addressbook/gui/minicard/e-minicard-view.h: New subclass of
- e-reflow-sorted that takes an EBook and uses it to compute the
- card data to display.
-
- * addressbook/gui/minicard/e-minicard.c,
- addressbook/gui/minicard/e-minicard.h: This now backends to a
- ECard instead of a ETableModel.
-
- * addressbook/gui/minicard/e-reflow.c,
- addressbook/gui/minicard/e-reflow.h: This now has a virtualized
- add method.
-
- * addressbook/gui/minicard/e-reflow-sorted.c,
- addressbook/gui/minicard/e-reflow-sorted.h: New subclass of
- e-reflow that allows the data to be sorted on the fly.
-
- * addressbook/gui/minicard/test-minicard-view.c: New test to test
- the new minicard view.
-
- * addressbook/gui/minicard/test-reflow.c: Uses the new ECard
- backend of the e-minicard.
-
- * addressbook/gui/minicard/.cvsignore,
- addressbook/gui/minicard/Makefile.am: Added new test. Fixed
- dependencies. Added new files.
-
- * addressbook/gui/, addressbook/gui/Makefile.am,
- addressbook/gui/.cvsignore: New directory for addressbook gui
- bits. Added subdirectories. Created an initial .cvsignore.
-
- * addressbook/Makefile.am (SUBDIRS): Removed demo and added gui.
-
- * addressbook/backend/pas/pas-backend-file.c: Added code to do
- notification on bookviews when changes in the backend are made.
-
- * addressbook/backend/pas/pas-book-view.c,
- addressbook/backend/pas/pas-book-view.h: Added helper functions to
- notify the view about the addition or modification of a single
- card. Fixed a mistaken extra free.
-
- * addressbook/backend/ebook/e-card-list-iterator.h: Fixed
- incorrect parent class.
-
- * addressbook/backend/ebook/test-client.c: Made this accept an
- optional parameter that specifies the vcard to add.
-
- * configure.in: Replaced widgets/e-minicard/Makefile and
- addressbook/demo/Makefile with addressbook/gui/minicard/Makefile
- and addressbook/gui/component/Makefile respectively.
-
- * widgets/Makefile.am: Removed e-minicard since it's being moved
- to addressbook/gui/minicard.
-
- * widgets/e-text/e-text.c: Fixed the border width around tooltips
- and made the main tooltip area yellow.
-
-2000-04-08 Dan Winship <danw@helixcode.com>
-
- * configure.in, acconfig.h: add SYSTEM_MAIL_DIR
-
-2000-04-08 Jesus Bravo Alvarez <jba@pobox.com>
-
- * configure.in (ALL_LINGUAS): Added Galician (gl).
-
-2000-04-07 Jeffrey Stedfast <fejj@stampede.org>
- * configure.in: Modified to create camel/providers/smtp/Makefile
-
-2000-04-07 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c: Made text tooltips appear in place.
- Iain figured out that to get them to not appear, we hide the
- tooltip when the mouse leaves the tooltip window, not the canvas
- item (this works because the tooltip window always covers the
- canvas item completely.)
-
-2000-04-07 Matt Loper <matt@helixcode.com>
-
- * addressbook/demo/addressbook.c (control_activate_cb): New
- function. Called when the control is (de)activated.
- (control_activate): New function; called when the control is
- activated, and sets up toolbar/menu times.
- (control_deactivate): New function; removes those toolbar/menu
- items.
- (do_nothing_cb): Does nothing :-)
- (addressbook_factory): Hook up to control_activate_cb().
-
-2000-04-07 Chris Toshok <toshok@laptoph.xtoph.org>
-
- * addressbook/backend/pas/pas-backend-file.c
- (pas_backend_file_process_get_book_view): correctly (well,
- untested) implement.
- (view_destroy): new function.
-
-2000-04-06 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/demo/demo.c, addressbook/demo/addressbook-widget.c:
- Changed calls to e_cell_text_new to match new function signature.
-
-2000-04-06 Miguel de Icaza <miguel@gnu.org>
-
- * art/Makefile.am (images_DATA): Renamed from pixmaps to images.
-
-2000-04-05 Matt Loper <matt@helixcode.com>
-
- * README: Added wombat.
-
-2000-04-04 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text-test.c: Got rid of some runtime errors.
- Changed to "fixed" font so that it will work on everyone's
- machine. Added a white background rectangle. Made resizing the
- window resize the contained text item. Changed to using affines
- (e_canvas_item_move_absolute) instead of "x" and "y" attributes.
- Set the text in the entries so that they match the original values
- of the displayed text object.
-
-2000-04-04 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-minicard/e-minicard.c: Fixed some referencing and
- lifetime issues.
-
-2000-04-04 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c: Removed an unnecessary get_bounds call.
-
- (From a patch by Iain Holmes <ih@csd.abdn.ac.uk>)
-
- * widgets/e-text/e-text.c: Made tooltips look more like the
- underlying text. Made tooltips show up more consistently.
-
-2000-04-04 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/demo/Makefile.am, addressbook/demo/e-test-model.c,
- addressbook/demo/e-test-model.h: Changed this to backend to an
- ebook.
-
- * addressbook/backend/ebook/e-card-iterator.c,
- addressbook/backend/ebook/e-card-iterator.h,
- addressbook/backend/ebook/e-card-list-iterator.c,
- addressbook/backend/ebook/e-card-list.c,
- addressbook/backend/ebook/e-card-list.h,
- addressbook/backend/ebook/e-card.c,
- addressbook/backend/ebook/e-card.h: Fixed const correctness and
- changed a couple of functions to be external.
-
- * addressbook/Makefile.am: Fixed subdir ordering.
-
-2000-04-04 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/ebook/e-book-view.c: Fixed an incorrect
- function.
-
- * addressbook/backend/ebook/e-book-view.h,
- addressbook/backend/ebook/e-book.h: Fixed some incorrect function
- pointer declarations.
-
- * addressbook/backend/ebook/e-card-iterator.c,
- addressbook/backend/ebook/e-card-iterator.h,
- addressbook/backend/ebook/e-card-list-iterator.c,
- addressbook/backend/ebook/e-card-list-iterator.h,
- addressbook/backend/ebook/e-card-list.c,
- addressbook/backend/ebook/e-card-list.h,
- addressbook/backend/ebook/e-card.c,
- addressbook/backend/ebook/e-card.h,
- addressbook/backend/ebook/test-card.c: Built new iterator system
- for getting fields with multiple entries.
-
- * addressbook/backend/ebook/Makefile.am: Added new files
- addressbook/backend/ebook/e-card-iterator.c,
- addressbook/backend/ebook/e-card-iterator.h,
- addressbook/backend/ebook/e-card-list-iterator.c,
- addressbook/backend/ebook/e-card-list-iterator.h,
- addressbook/backend/ebook/e-card-list.c, and
- addressbook/backend/ebook/e-card-list.h.
-
-2000-04-04 Yuri Syrota <rasta@renome.rovno.ua>
-
- * configure.in: Added uk to ALL_LINGUAS.
-
-2000-04-04 Andreas Hyden <a.hyden@cyberpoint.se>
-
- * configure.in: Added no and sv to ALL_LINGUAS.
-
-2000-04-03 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/ebook/e-card-cursor.h,
- addressbook/backend/ebook/e-card.c: A bit of clean up.
-
- * addressbook/backend/ebook/e-book-types.h,
- addressbook/backend/ebook/e-book-view-listener.c,
- addressbook/backend/ebook/e-book-view-listener.h,
- addressbook/backend/ebook/e-book-view.c,
- addressbook/backend/ebook/e-book-view.h,
- addressbook/backend/pas/pas-book-view.c,
- addressbook/backend/pas/pas-book-view.h: New files for live views.
-
- * addressbook/backend/ebook/Makefile.am,
- addressbook/backend/ebook/e-book-listener.c,
- addressbook/backend/ebook/e-book-listener.h,
- addressbook/backend/ebook/e-book.c,
- addressbook/backend/ebook/e-book.h,
- addressbook/backend/ebook/test-client-list.c,
- addressbook/backend/ebook/test-client.c,
- addressbook/backend/pas/pas-backend-file.c,
- addressbook/backend/pas/pas-book.c,
- addressbook/backend/pas/pas-book.h,
- addressbook/backend/idl/addressbook.idl: Added live views and
- searching to the interface (neither is working yet.)
-
-2000-04-01 Matt Loper <matt@helixcode.com>
-
- * tests/.cvsignore: Added test-movemail.
-
- * art/.cvsignore: New file.
-
-2000-03-31 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/demo/demo.c, addressbook/demo/addressbook-widget.c:
- Added some missing gtk_object_refs.
-
-2000-03-30 Matt Loper <matt@helixcode.com>
-
- * addressbook/backend/pas/pas-backend-file.c
- (pas_backend_file_build_all_cards_list): Get first card (with
- R_FIRST) on first seq().
-
-2000-03-30 Chris Toshok <toshok@laptoph.xtoph.org>
-
- * addressbook/backend/pas/pas-backend-ldap.h: new-file
- * addressbook/backend/pas/pas-backend-ldap.c: new file
-
-2000-03-30 Dan Winship <danw@helixcode.com>
-
- * configure.in:
- * Makefile.am:
- * art/Makefile.am: install new shortcut bar pixmaps.
-
-2000-03-30 Tuomas Kuosmanen <tigert@gimp.org>
-
- * art/evolution-calendar.png art/evolution-inbox.png
- art/evolution-tasks.png art/evolution-contacts.png
- art/evolution-notes.png evolution-today.png:
- added some artwork for the main shortcutbar.. someone
- could stick them in it.
-
-2000-03-29 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/ebook/e-card-cursor.c: Fixed management of
- the corba-cursor object by calling CORBA_Object_duplicate on it on
- e-card-cursor creation and calling CORBA_Object_release on
- e-card-cursor destruction. Also, properly free string returned
- from Evolution_CardCursor_get_nth function.
-
-2000-03-29 Matt Loper <matt@helixcode.com>
-
- * addressbook/backend/ebook/test-client.c (get_cursor_cb): Added
- some debugging.
-
- * addressbook/backend/ebook/e-book-listener.c: Added inline
- documentation for exposed functions.
- * addressbook/backend/ebook/e-card-cursor.c: same.
- * addressbook/backend/ebook/e-card.c: same.
-
- * Makefile.am: add calendar compilation back in.
-
- * addressbook/backend/pas/pas-book-factory.c
- (PAS_BOOK_FACTORY_GOAD_ID): changed to
- "evolution:addressbook-server".
-
- * addressbook/backend/pas/Makefile.am: no need to install a
- .gnorba file from here, as the wombat.gnorba file in
- evolution/wombat will do its job.
-
- * addressbook/backend/ebook/test-client.c (ebook_create): if
- ebook_new fails, print a warning and return.
-
- * addressbook/backend/ebook/e-book.c (CARDSERVER_GOAD_ID): changed
- to "evolution:addressbook-server".
-
- * wombat/wombat.c: Changed headerfile path.
-
- * wombat/Makefile.am: Use relative paths to libraries in the build
- tree, rather than requiring libraries (such as libpcs) to already
- be installed.
-
-2000-03-28 Matt Loper <matt@helixcode.com>
-
- * wombat/Makefile.am: new file.
-
- * wombat/wombat.gnorba: Cleaned up.
-
- * wombat/wombat.c (setup_pcs): filled in the rest.
-
- * Makefile.am: added wombat.
-
- * wombat/wombat.gnorba: new file.
-
- * wombat/.cvsignore: new file.
-
- * wombat/wombat.c (setup_pcs): fill out this function some.
-
- * configure.in: added wombat.
-
-2000-03-28 Chris Toshok <toshok@laptoph.xtoph.org>
-
- * addressbook/backend/pas/pas-card-cursor.c (create_cursor): use
- g_new0 to allocate the BonoboObjectServant.
-
- * addressbook/backend/pas/pas-backend-file.c
- (pas_backend_file_build_all_cards_list): remove unnecessary
- strdup/free.
-
-2000-03-28 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/pas/pas-backend-file.c: Removed an infinite
- loop.
-
- * addressbook/backend/ebook/test-client-list.c: New test that
- doesn't add an extra database item.
-
- * addressbook/backend/ebook/Makefile.am,
- addressbook/backend/ebook/.cvsignore: Added test-client-list.
-
-2000-03-28 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/pas/pas-card-cursor.c: Fixed memory
- allocation.
-
- * addressbook/backend/pas/pas-backend-file.c: Fixed memory
- allocation. Made database stuff not do an extra entry.
-
- * addressbook/backend/ebook/test-client.c: Add test for
- get_all_cards functionality. Changed database name to test.db.
-
- * addressbook/backend/ebook/e-card-cursor.c: Changed bonobo_object
- to gtk_object in a couple of places.
-
-2000-03-28 Chris Toshok <toshok@laptoph.xtoph.org>
-
- * addressbook/backend/pas/pas-backend-file.c
- (pas_backend_file_create_unique_id): create id's for entries using
- the following format: ("pas-id-%08lX%08X", time(NULL), c++).
-
-2000-03-27 Dan Winship <danw@helixcode.com>
-
- * tests/test-movemail.c: new test program. Can be used to copy POP
- mail into your evolution inbox.
-
-2000-03-27 Chris Toshok <toshok@laptoph.xtoph.org>
-
- * addressbook/backend/pas/pas-backend-file.c
- (pas_backend_file_get_vcard): remove unneeded g_strdup;
- (get_length): implement function.
- (get_nth): implement function.
- (cursor_destroy): free up the internal glist of vcards, and fix
- warning.
- (pas_backend_file_build_all_cards_list): new function, to build up
- the list of cards in the db.
- (pas_backend_file_process_get_all_cards): call
- pas_backend_file_build_+all_cards_list, and fix warning.
-
-2000-03-27 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/ebook/test-card.c: Fixed some warnings.
-
- * addressbook/backend/ebook/test-client.c: Added a section to test
- cursors and returning an id when adding.
-
- * addressbook/backend/ebook/e-card-pairs.h: Removed the address
- pairs since they were added to e-card.c.
-
- * addressbook/backend/ebook/e-card.c,
- addressbook/backend/ebook/e-card.h: Made the set_id function take
- a const char *.
-
- * addressbook/backend/ebook/e-book-listener.c,
- addressbook/backend/ebook/e-book-listener.h,
- addressbook/backend/ebook/e-book.c,
- addressbook/backend/ebook/e-book.h,
- addressbook/backend/idl/addressbook.idl,
- addressbook/backend/pas/pas-backend-file.c,
- addressbook/backend/pas/pas-book.c,
- addressbook/backend/pas/pas-book.h: Added a get_all_cards function
- and made the response to the create_card function include the card
- id.
-
- * addressbook/backend/ebook/Makefile.am: Added e-card-cursor.c and
- e-card-cursor.h.
-
- * addressbook/backend/ebook/e-card-cursor.c,
- addressbook/backend/ebook/e-card-cursor.h: New class for proxying
- to an Evolution_CardCursor.
-
- * addressbook/backend/pas/Makefile.am: Added pas-card-cursor.c and
- pas-card-cursor.h.
-
- * addressbook/backend/pas/pas-card-cursor.c,
- addressbook/backend/pas/pas-card-cursor.h: New bonobo class for
- making an Evolution_CardCursor server.
-
-2000-03-27 NotZed <NotZed@HelixCode.com>
-
- * tests/test9.c (main): This test is basically now invalid.
- * tests/test11.c (main): Fix for async search api. Probably works.
- Removed camel-mbox-*.h headers, should be private.
-
-2000-03-27 Tuomas Kuosmanen <tigert@gimp.org>
- * art/attachment.xpm art/mail-new.xpm art/mail-read.xpm
- art/mail-replied.xpm art/mark.xpm art/meeting.xpm
- art/priority-high.xpm art/priority-low.xpm
-
- Added some new icons for the message-list view..
-
-2000-03-26 Chris Toshok <toshok@laptoph.xtoph.org>
-
- * configure.in: check for db_185.h (present in newer db
- distributions.)
-
- * addressbook/backend/pas/pas-backend-file.c
- (pas_backend_file_create_unique_id): new function.
- (pas_backend_file_process_create_card): call
- pas_backend_file_create_unique_id and pas_book_notify_add (if the
- db->put was successful). also, sync out db.
- (pas_backend_file_process_remove_card): call
- pas_book_notify_remove if the db->del was successful, and sync out
- db.
- (pas_backend_file_process_modify_card): call
- pas_book_notify_change if db->put was successful, and sync out db.
- (string_to_dbt): new function.
- (pas_backend_file_process_create_card): use string_to_dbt
- (pas_backend_file_process_remove_card): likewise
- (pas_backend_file_process_modify_card): likewise
- (pas_backend_file_get_vcard): likewise
- (pas_backend_file_upgrade_db): new function, to upgrade a db file
- if we change the data format.
- (pas_backend_file_maybe_upgrade_db): check db version vs. current
- code version, and upgrade it necessary.
- (pas_backend_file_load_uri): call pas_backend_file_maybe_upgrade.
-
-2000-03-26 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/ebook/test-client.c: Load an ECard instead
- of a VCard and then get the VCard from that ECard. Just tests
- ECard and the client stuff at the same time. Also, replaces
- carriage returns with newlines.
-
- * addressbook/backend/ebook/e-book.c: Fixed a small parity error.
-
-2000-03-25 Chris Toshok <toshok@laptoph.xtoph.org>
-
- * addressbook/backend/ebook/test-client.c: create a card and then
- look it up.
-
-2000-03-26 Chris Toshok <toshok@laptoph.xtoph.org>
-
- * addressbook/backend/pas/pas-backend-file.c
- (pas_backend_file_process_create_card): add db calls to flesh out
- the interface. hardcoded id that needs to change, once we decide
- how we're going to create it.
- (pas_backend_file_process_remove_card): add db calls to flesh out
- the interface.
- (pas_backend_file_process_modify_card): likewise
- (pas_backend_file_process_check_connection): likewise
- (pas_backend_file_get_vcard): likewise
- (pas_backend_file_load_uri): likewise
-
-2000-03-26 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/ebook/e-book.c: Set the card id properly
- when retrieving a card.
-
-2000-03-22 NotZed <NotZed@HelixCode.com>
-
- * e-util/e-sexp.h: Formatting cleanup.
-
-2000-03-07 NotZed <NotZed@HelixCode.com>
-
- * e-util/Makefile.am (libeutil_la_SOURCES): s-sexp.h -> e-sexp.h.
-
- * addressbook/backend/ebook/e-card.c,
- addressbook/backend/ebook/e-card.h: Added the ability to set the
- card's id (and made getting it work correctly also.)
-
-2000-03-25 Chris Toshok <toshok@laptoph.xtoph.org>
-
- * addressbook/backend/ebook/e-book.c (e_book_pop_op): pass GList*
- as second parameter to g_list_remove_link, not the data pointer.
-
-2000-03-26 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/ebook/e-card-types.h: Removed the
- address->description field.
-
- * addressbook/backend/ebook/e-card.c: Added VCard output and
- the use of GtkArguments.
-
- * addressbook/backend/ebook/test-card.c: Updated this to use the
- GtkArguments.
-
- * addressbook/backend/ebook/e-book.c: Fixed a memory leak.
-
-2000-03-25 Matt Loper <matt@helixcode.com>
-
- * ebook/e-book.c,
- ebook/e-book.h,
- ebook/e-book.h,
- ebook/e-card-fields.h,
- ebook/e-card.h,
- ebook/e-commerce.h: old, removed. Up-to-date EBook stuff is kept
- in addressbook/backend/ebook.
-
-2000-03-23 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/ebook/e-card.c,
- addressbook/backend/ebook/e-card.h,
- addressbook/backend/ebook/e-card-types.h,
- addressbook/backend/ebook/e-card-pairs.h,
- addressbook/backend/ebook/test-card.c: Added parsing and testing
- for name, full name, birthday, telephone, email, and street
- address properties.
-
-2000-03-22 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/backend/ebook/.cvsignore,
- addressbook/backend/pas/.cvsignore,
- addressbook/backend/idl/.cvsignore,
- addressbook/backend/.cvsignore: Updated .cvsignore files.
-
-2000-03-22 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/Makefile.am, configure.in: Added the
- addressbook/backend directory.
-
- * addressbook/backend/Makefile.am: Removed the libversit directory
- as it's now included in the base evolution directory.
-
- * addressbook/backend/ebook/e-card-pairs.h,
- addressbook/backend/ebook/Makefile.am: Changed the place where
- libversit is looked for.
-
- * addressbook/backend/ebook/e-book-listener.c: Fixed some
- indentation.
-
- * addressbook/backend/ebook/e-card-pairs.h,
- addressbook/backend/ebook/e-card-types.h: Commented out some code
- to get this to compile.
-
- * addressbook/backend/ebook/e-card.c,
- addressbook/backend/ebook/e-card.h: Turned this into a GTK+
- object.
-
- * addressbook/backend/pas/pas.c,
- addressbook/backend/ebook/test-client.c: Include gnome.h and
- gnorba.h.
-
- * addressbook/backend/idl/addressbook.idl: Include Bonobo.idl
- instead of bonobo-unknown.idl.
-
- * addressbook/backend/pas/pas-backend-file.c,
- addressbook/backend/pas/pas-book.c,
- addressbook/contact-editor/test-editor.c,
- addressbook/contact-editor/e-contact-editor.c,
- addressbook/printing/e-contact-print.c,
- addressbook/printing/test-contact-print-style-editor.c,
- addressbook/printing/test-print.c: Killed some warnings.
-
-2000-03-21 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c: Changed gnome_canvas_item_grab_focus to
- e_canvas_item_grab_focus.
-
-2000-03-21 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/demo/addressbook-widget.c: Make background pixmap
- get properly set to NULL.
-
-2000-03-20 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c, widgets/e-text/e-text.h: Added the
- ability to access the text event processor.
-
-2000-03-13 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/demo/addressbook-widget.c: Made the addressbook
- component look in the users home directory for the addressbook.xml
- file.
-
-2000-03-20 Matt Loper <matt@helixcode.com>
-
- * tests/ui-tests/.cvsignore: added filter.
-
- * addressbook/demo/.cvsignore: added test-addressbook.
-
-2000-03-17 Elliot Lee <sopwith@redhat.com>
- * calendar/cal-client/Makefile.am,
- calendar/cal-util/Makefile.am, calendar/gui/Makefile.am,
- calendar/pcs/Makefile.am, mail/Makefile.am,
- widgets/e-text/Makefile.am: Fix for srcdir != builddir.
-
-2000-03-14 Dan Winship <danw@helixcode.com>
-
- * Makefile.am (SUBDIRS): build shell before mail, since mail
- relies on the shell idl files being compiled.
-
-2000-03-13 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/demo/Makefile.am: Added files for addressbook bonobo
- component. Changed non bonobo version to compile as
- test-addressbook.
-
- * addressbook/demo/addressbook.c,
- addressbook/demo/addressbook.gnorba,
- addressbook/demo/addressbook.h,
- addressbook/demo/addressbook-factory.c,
- addressbook/demo/addressbook-widget.c,
- addressbook/demo/addressbook-widget.h: New factory to create an
- addressbook bonobo component.
-
-2000-03-12 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/.cvsignore: Added e-text-test.
-
- * addressbook/demo/e-test-model.c,
- addressbook/demo/e-test-model.h: A model storing data in an array
- of Address objects.
-
- * addressbook/demo/demo.c: Changed to use
- addressbook/demo/e-test-model.c and
- addressbook/demo/e-test-model.h.
-
- * addressbook/demo/Makefile.am: Added e-test-model.c and
- e-test-model.h.
-
-2000-03-12 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/Makefile.am: Rearranged SUBDIRS for dependencies.
-
- * widgets/e-text/e-text-model.c, widgets/e-text-model.h: New
- object which stores a piece of text data. All methods are
- virtual.
-
- * widgets/e-text/e-text.c, widgets/e-text/e-text.h: Modified this
- to use an ETextModel for its data.
-
- * widgets/e-text/Makefile.am: Added e-text-model.c and e-text-model.h.
-
- * widgets/e-minicard/test-minicard-label.c: Made this work again.
-
- * widgets/e-minicard/e-minicard.c,
- widgets/e-minicard/e-minicard.h: Made this use an ETableModel to
- get its data.
-
- * widgets/e-minicard/e-minicard-label.c,
- widgets/e-minicard/e-minicard-label.h: Added the ability to set
- the text model used for the contained text widget.
-
- * widgets/e-minicard/Makefile.am: Added e-table since e-minicard
- is now dependent on an e-table-model for its data.
-
- * addressbook/demo, addressbook/demo/.cvsignore,
- addressbook/demo/Makefile.am, addressbook/demo/demo.c,
- addressbook/demo/spec: A new program to test ETable and EMinicard
- integration.
-
- * configure.in: Added addressbook/demo/Makefile.
-
- * addressbook/Makefile.am: Added the demo/ subdirectory.
-
-2000-03-10 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-minicard/e-minicard.c,
- widgets/e-minicard/e-minicard-label.c,
- widgets/e-minicard/e-minicard-label.h,
- widgets/e-minicard/e-reflow.c, widgets/e-minicard/test-reflow.c,
- widgets/e-text/e-text.c, widgets/e-text/e-text.h: Adapted to use
- the new e-canvas reflow system.
-
-2000-03-07 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c, widgets/e-text/e-text.h: Added a
- "break_characters" argument. It lets you define a set of
- characters which should cause optional linebreaks to occur. Made
- setting the "clip_height" argument to -1 mean no height clipping.
- Moved calling the "resize" signal into an idle handler to avoid
- reentering the canvas update loop. Made EText recalc bounds if
- the affine has changed. Fixed up tooltip_count (this counts the
- number of ENTER and LEAVE events.)
-
- * widgets/e-text/e-text-test.c: Got rid of a few warnings.
-
- * widgets/e-minicard/e-minicard-label.h: Reindent a few lines.
-
- * widgets/e-minicard/e-minicard.c,
- widgets/e-minicard/e-minicard-label.c: Switch from using "x" and
- "y" to set the children's position to using
- e_canvas_item_move_absolute.
-
-2000-03-05 Matt Loper <matt.loper@splashtech.com>
-
- * tests/ui-tests/message-browser.c: Commenting added.
- (on_url_data_requested): renamed from "on_url_requested", to
- reflect that a stream of data is what's actually being asked for.
- (hydrate_persist_stream_from_gstring): New function.
- (camel_stream_to_gstring): New function.
- (on_object_requested): Cleaned up.
-
-2000-03-04 bertrand <bertrand@helixcode.com>
-
- * tests/ui-tests/Makefile.am: add bonobo to the build
- process.
-
- * tests/ui-tests/message-browser.c (main):
- initialize Bonobo. Use bonobo_main.
- (get_gtk_html_contents_window): set signal handlers
- for url requests and objects requests.
- (on_object_requested): answer to object requests.
-
-2000-03-03 bertrand <bertrand@helixcode.com>
-
- * tests/ui-tests/message-browser.c (main): initialize
- gdkrgb. Push visual/colormap.
- (on_url_requested): in the case where a camel url is requested,
- write the camel stream to gtkhtml.
-
- * tests/ui-tests/Makefile.am (filter_LDADD): add
- gnomeprint in the lib list.
-
-2000-03-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * configure.in: Build `filter/Makefile'. Added check for GtkHTML.
- Set `GTKHTML_CFLAGS' and `GTKHTML_LIBS' to the appropriate values
- for linking with GtkHTML.
-
-2000-03-01 Federico Mena Quintero <federico@helixcode.com>
-
- * configure.in (AC_OUTPUT): Added calendar/idl/Makefile,
- calendar/cal-client/Makefile, and calendar/pcs/Makefile to the
- list of files to generate.
-
-2000-02-29 Iain Holmes <ih@csd.abdn.ac.uk>
-
- * widgets/e-text/e-text.c: Don't show the tooltip if the text is being
- editted or isn't clipped. Remove the tooltip when editting starts.
-
- * widgets/e-text/Makefile.am: Build the test program
-
-2000-02-29 NotZed <NotZed@HelixCode.com>
-
- * tests/ui-tests/Makefile.am (filter_LDADD): Added test program.
-
- * tests/ui-tests/filterdescription.xml, saveoptions.xml: Data
- files for test program.
-
- * tests/ui-tests/filter.c (main): Test program for filter ui.
-
-2000-02-28 NotZed <NotZed@HelixCode.com>
-
- * widgets/e-minicard/Makefile.am (INCLUDES): Fixed references to
- eutil.
-
- * Makefile.am (SUBDIRS): Build e-util before other stuff.
- (SUBDIRS): Build filter after camel.
-
-2000-02-28 Chris Lahey <clahey@umich.edu>
-
- * widgets/e-text/e-text.c: Compilation error.
-
-2000-02-28 Chris Lahey <clahey@umich.edu>
-
- * widgets/e-text/e-text.c, widgets/e-text/e-text.h: Updated these
- to use the canvas ::update system properly.
-
-2000-02-24 Dan Winship <danw@helixcode.com>
-
- * acconfig.h:
- * configure.in: define SENDMAIL_PATH with the path to sendmail.
-
-2000-02-24 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text.c, widgets/e-text.h, e-text-event-processor.c,
- e-text-event-processor.h, e-text-event-processor-emacs-like.c,
- e-text-event-processor-emacs-like.h,
- e-text-event-processor-types.h: This were moved to widgets/e-text/
- a while ago but never removed. They have now been removed.
-
- * widgets/e-text/e-text.c, widgets/e-text/e-text.h: Removed some
- warnings from this file. Made tooltips disappear when you're
- finished with them.
-
- * widgets/e-minicard/test-reflow.c,
- widgets/e-minicard/test-minicard.c,
- widgets/e-minicard/test-minicard-label.c: Commented out unused
- about_callback functions.
-
- * widgets/e-minicard/e-reflow.c: Made e-reflow pass an EFocus to
- its e-minicard children.
-
- * widgets/e-minicard/e-minicard.c: Made e-minicard take and return
- an EFocus for its "has_focus" argument. This makes shift-tab work properly.
-
- * widgets/e-minicard/e-minicard-label.c: Made e-minicard-label take and return
- an EFocus for its "has_focus" argument. Made the font that
- e-minicard-label uses only be allocated once.
-
-2000-02-21 Matt Loper <matt@helixcode.com>
-
- * tests/ui-tests/message-browser.c (on_link_clicked): stop
- sscanf() abuse.
-
- * tests/Makefile.am: changed references to libibex.a to
- libibex.la.
-
- * libical/src/libical/.cvsignore: Added *.lo, *.la, and .libs.
- * libical/src/libicalss/.cvsignore: same.
-
- * tests/.cvsignore: Added test11.
-
- * libical/Makefile.in: autogenerated file removed from cvs, and
- added to .cvsignore.
- * libical/src/Makefile.in: same.
- * libical/src/libical/Makefile.in: same.
- * libical/src/libicalss/Makefile.in: same.
-
-2000-02-22 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * tests/ui-tests/message-browser.c (on_link_clicked):
- uggly hack to test part saving and
- b64 streams.
-
-2000-02-21 Dan Winship <danw@helixcode.com>
-
- * tests/test10.c:
- * tests/test11.c: update for camel changes
-
-2000-02-20 Matt Loper <matt@helixcode.com>
-
- * tests/Makefile.am: Changed dependencies on libibex.la to
- libibex.a. In test9_LDADD, placed libcamelmbox.la before
- libibex.la, as the former requires the latter.
-
-2000-02-20 Iain Holmes <ih@csd.abdn.ac.uk>
-
- * widgets/e-text/e-text.[ch] (_do_tooltip): Show the text of the item,
- in a tooltip style.
- (e_text_event): Add a timeout on the Enter and remove it on the Leave
- events.
-
- * e-text-test.c: New file to test e-text items.
-
-2000-02-20 Matt Loper <matt@helixcode.com>
-
- * .cvsignore: added ABOUT-NLS.
- * ABOUT-NLS: removed.
-
-2000-02-19 Matt Loper <matt@helixcode.com>
-
- * tests/ui-tests/message-browser.c (on_link_clicked): When a link
- is clicked, indicate the link with a dialog.
-
- * libical/src/test/.cvsignore: Added Makefile.
-
- * libical/.cvsignore: Added Makefile, configure, config.status.
-
- * libical/src/.cvsignore: New file.
-
- * libical/Makefile: autogenerated file removed from cvs.
- * libical/configure: same.
- * libical/config.status: same.
- * libical/src/Makefile: same.
- * libical/src/test/Makefile: same.
-
- * widgets/e-minicard/.cvsignore: Added minicard-label-test,
- minicard-test, and reflow-test.
-
- * shell/.cvsignore: added files autogenerated from Evolution.idl.
-
- * libversit/.cvsignore: Added .libs, vcc.c, vcc.lo, vobject.lo,
- vcaltmp.lo, libversit.la
-
- * libical/src/test/.cvsignore: New file.
-
- * libical/src/libical/.cvsignore: New file.
-
- * libical/src/libicalss/.cvsignore: New file.
-
- * libical/.cvsignore: New file, with config.log in it.
-
- * tests/ui-tests/message-browser.c: minor cleanup.
-
- * tests/ui-tests/.cvsignore: added message-browser.
-
-2000-02-18 NotZed <NotZed@HelixCode.com>
-
- * tests/test11.c (main): Use a relative path to the mbox provider
- module.
-
-2000-02-18 Matt Loper <matt@helixcode.com>
-
- * tests/ui-tests/message-browser.c (filename_to_camel_msg): Call
- camel_data_wrapper_set_input_stream, rather than
- camel_data_wrapper_construct_from_stream. For the whole message,
- allow someone to see the header ("to", "from", etc.). Clicking on
- tree items to see their elements, now works also.
-
-2000-02-18 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * configure.in: Make gnomeui the last library on the command line,
- as its path is the one most likely to hold other old libraries
- (libxml) and we need newer versions.
-
- (BONOBO_VFS_GNOME_CFLAGS): Add libical to the
- AC_CONFIG_SUBDIRS
-
- (BONOBO_HTML_GNOME_CFLAGS): VFS checking needs to
- go before we rquery them.
-
- Use the new method for gnome-print
- checking instead of the old crufty gtk+ based one that nobody can
- debug. ever.
-
-2000-02-16 Matt Loper <matt@helixcode.com>
-
- * tests/ui-tests/message-browser.c (tree_selection_changed): New
- callback function, which will later change the main html window to
- reflect the newly-selected tree item.
- (get_gtk_html_contents_window): New function. Gets the content
- part of a message.
- (get_gtk_html_header_window): New function. Will get the header
- part of a message, when applicable.
-
- * camel/camel-formatter.c (str_tolower): Now returns a new string,
- rather than changing it in place.
- (initialize_camel_formatter): New function; gives a root
- CamelDataWrapper and a stream to a CamelFormatter.
- (camel_formatter_wrapper_to_html): New function. Translates any
- CamelDataWrapper into html.
- (lookup_unique_id): Allows the root object to be a
- CamelDataWrapper, which is more general than the previously
- required CamelMimeMessage.
-
-
-2000-02-14 NotZed <notzed@zedzone.helixcode.com>
-
- * configure.in (EXTRA_GNOME_CFLAGS): Add libunicode to CFLAGS/LIBS.
-
-2000-02-13 NotZed <notzed@zedzone.helixcode.com>
-
- * configure.in: Added check for libunicode.
-
- * Makefile.am (SUBDIRS): Added libibex.
-
- * tests/test11.c (main): New test, tests search api.
-
-2000-02-13 Matt Loper <matt@helixcode.com>
-
- * tests/ui-tests/test-multipart-mixed.msg: New rfc822 file, which
- crashes message-browser.
-
- * tests/ui-tests/message-browser.c (get_gtk_html_window): Takes a
- CamelMimeMessage as a param, rather than a filename.
- (main): Puts our windows in an hpane rather than a vbox. Also
- opens a file dlg box if a filename wasn't given as a first param.
-
- * camel/camel-stream-fs.c (_init_with_name): Set stream_fs->fd to
- -1 if we fail to load the file.
- (camel_stream_fs_new_with_name): If stream_fs->fd is -1, return
- NULL. These changes make it so that a CamelStreamFs won't be
- created if you give it a bogus filename; they may be replaced once
- exception handling is in place.
-
- * tests/ui-tests/message-browser.c (handle_tree_item): Expand tree
- items.
- (mime_message_to_html): New function; translates a
- CamelMimeMessage into two strings (one for the header, and one for
- the body).
- (get_gtk_html_window): New function; fills out a window with
- html. The html is taken from a processed rfc822 file, via a
- CamelFormatter.
-
- * camel/camel-formatter.c: Added assertions.
- (handle_text_html): Don't call text_to_html on something that's
- already html.
- (multipart_foreach): function deleted.
-
- * tests/ui-tests/message-browser.c: Added preliminary support for
- the viewing of messages via gtkhtml. Lots of commenting.
-
-2000-02-11 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/contact-editor/e-contact-editor.c: Fixed the
- location the first time you see the drop down menus for changing
- which phone, email, or snail mail address you see.
-
-2000-02-11 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.c (e_text_event): Made a click on a text
- widget set the cursor properly.
-
-2000-02-11 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text/e-text.h: Removed some arguments from the .h that
- will never be implemented.
-
-
-2000-02-10 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/data-wrapper-repository.c (data_wrapper_repository_init):
- default the text/* mime types to CamelSimpleDataWrapper so
- that Michael can use get_stream.
-
-2000-02-10 NotZed <notzed@zedzone.helixcode.com>
-
- * camel/camel-simple-data-wrapper-stream.h: The superclass is
- actually a seekable stream, not just a stream.
-
-2000-02-10 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * tests/Makefile.am (THREAD_RELATED_TESTS): don't
- build thread related tests if evolution has been
- compiled with no thread support.
-
- * configure.in (have_pthread): allow user to enable/disable
- thread support at configure time
- (EXTRA_GNOME_CFLAGS):
- (EXTRA_GNOME_LIBS): thread support is directly
- included in this variable if enabled. No more
- EXTRA_GNOME_CFLAGS_THREADS
- Other special support should be added in
- EXTRA_GNOME_LIBS and EXTRA_GNOME_CFLAGS
- instead of redefining a new variable
- each time we want to add a new lib.
- (bonobo, ....)
-
- * camel/camel.c (camel_init): only try to initialize threads if
- we enabled threads support.
-
- * tests/ui-tests/Makefile.am (message_browser_LDADD): use
- EXTRA_GNOME_LIBS
-
- * configure.in (have_pthread): remove HAVE_PTHREADS
- variable. Define ENABLE_THREADS instead.
-
- * camel/Makefile.am: use ENABLE_THREADS not HAVE_PTHREADS
- to test if we build thread relateed code.
-
- * tests/Makefile.am: use EXTRA_GNOME_LIBS,
- not EXTRA_GNOME_LIBS_THREADS
-
-2000-02-10 NotZed <notzed@zedzone.helixcode.com>
-
- * camel/hash-table-utils.c (g_strcase_hash): Removed a bizarre
- comparison construct for converting case.
-
-2000-02-09 NotZed <notzed@zedzone.helixcode.com>
-
- * camel/data-wrapper-repository.c (data_wrapper_repository_init):
- Uses case-insensitive compares.
-
- * camel/gmime-content-field.c (gmime_content_field_new): Uses
- case-insensitive compares.
-
- * camel/data-wrapper-repository.c (data_wrapper_repository_init):
- Use case-insensitive mime types.
-
- * camel/camel-simple-data-wrapper-stream.c (read): Increment the
- copy source address to match the data read offset.
- (seek): Actually implement the seek.
-
- * camel/camel-mime-part-utils.c
- (camel_mime_part_store_stream_in_buffer): If we get a -1 read,
- DONT update the total bytes, and try and truncate the array in
- reverse. Eek.
-
- * camel/camel-mime-part.c (camel_mime_part_encoding_from_string):
- This was DEFINETLEY not the right way to do it. strncmp!=strcmp
- (camel_mime_part_encoding_to_string): Handle the default case.
- : include string.h for strcmp() etc.
-
-2000-02-09 Matt Loper <matt@helixcode.com>
-
- * tests/ui-tests/test-multipart-alt.msg: New test file; run
- message-browser on it, and it will crash.
-
-2000-02-09 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * tests/ui-tests/message-browser.c (handle_tree_item):
- show the item.
- (handle_tree_item): show the containers and the containees
- (get_message_tree_ctrl): call handle_tree_item
- on the message itself
-
- * camel/camel-mime-message.c (camel_mime_message_init):
- set the mime type to "mime/message".
- --- THIS IS NOT THE CONTENT TYPE ---
-
- * camel/camel-mime-body-part.c (camel_mime_body_part_init):
- set the mime type to "body-part".
- --- THIS IS NOT THE CONTENT TYPE ---
-
- * camel/camel-data-wrapper.c (camel_data_wrapper_set_mime_type):
- mime_type is const.
- (_set_input_stream): really set the input stream
- (_set_output_stream): really set the output stream
- various other typo fixes.
-
- * tests/ui-tests/message-browser.c: various typo
- fixes in the ctree construction.
-
- * camel/string-utils.c (string_trim): fix braindead
- trailing trim bug.
-
- * camel/gmime-content-field.c (gmime_content_field_construct_from_string):
- strip the leading and trailing quotes when constructing the
- content field. This should be done in a more generic
- RFC822 approach, but this fixes a bug that prevent
- matt from analysing some multipart messages.
-
- * camel/camel-data-wrapper.h: reorganize the
- deprecated and new methods.
-
- * camel/providers/mbox/camel-mbox-folder.c
- (_check_get_or_maybe_generate_summary_file):
- Use "From " as the message separating string.
-
- * camel/providers/mbox/camel-mbox-folder.c (_append_message):
- set the mode when creating the mbox file.
-
- * camel/providers/mbox/camel-mbox-utils.c (camel_mbox_write_xev):
- ditto
- * camel/providers/mbox/camel-mbox-summary.c (camel_mbox_save_summary):
- ditto
-
-2000-02-09 Matt Loper <matt@helixcode.com>
-
- * tests/ui-tests/message-browser.c (print_usage_and_quit): Minor
- cleanup.
-
-2000-02-09 NotZed <notzed@zedzone.helixcode.com>
-
- * camel/camel-simple-data-wrapper-stream.c (class_init): Actually
- initialise the class. It simple couldn't have worked before.
- (camel_simple_data_wrapper_stream_construct): Commented out code
- which crashes just to get something working, memory corruption??
-
-2000-02-09 Christopher James Lahey <clahey@helixcode.com>
-
- * configure.in: Add new Makefiles to Makefile list.
-
- * widgets/e-text/Makefile.am: Build libetext.
-
- * widgets/e-minicard/Makefile.am: Build libeminicard and test
- programs.
-
- * widgets/Makefile.am: Remove all e-text and e-minicard code and
- add them to the SUBDIRS list.
-
-2000-02-08 Matt Loper <matt@helixcode.com>
-
- * tests/ui-tests/message-browser.c: New file; shows a message in
- tree format, where multipart's have multiple leaves.
-
- * camel/camel-formatter.c: Changed references from
- 'multipart/alternate' to 'multipart/alternative'.
-
- * tests/test-formatter.c (convert_to_html_and_print): Use the
- buffer length of the stream to create strings which are then
- printed, rather than printing the stream (which might not have a
- trailing \0) directly.
-
- * camel/camel-formatter.c (str_tolower): New function; makes a
- string lowercase.
-
- * tests/test-formatter.c (convert_to_html_and_print): Fixed call
- to 'camel_formatter_mime_message_to_html' to contain correct
- params.
-
- * camel/camel-formatter.c: New member to 'CamelFormatterPrivate',
- 'attachments', will be used to let the caller know which items
- should be treated as attachments (as opposed to objects which are
- inline to the body).
- (text_to_html): name changed from 'encode_entities'. Also now
- converts newlines to <br> tags.
- (camel_formatter_mime_message_to_html): Now takes two output
- streams -- one for the header, and one for the body.
- (get_bonobo_tag_for_object): New function; tries to make a tag out
- of (1) the leaf of a mime message and (2) a bonobo object that can
- handle its mime type, but can return NULL if it fails to find the
- mime type.
- (handle_vcard): New function; will write out a vcard as html.
-
-2000-02-07 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text.h, widgets/e-text.c: Added line wrap and a max
- number of lines (max number of lines is only obeyed if text is not
- being edited).
-
-2000-02-07 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/printing/e-contact-print.c: Removed an unneccessary
- include of libhnj. All uses of libhnj are commented out.
-
-2000-02-07 Matt Loper <matt@helixcode.com>
-
- * camel/camel-formatter.c (mime_part_to_html): function deleted.
-
- * tests/test-formatter.c (print_usage_and_quit): New function,
- which gives usage information.
-
- * camel/camel-formatter.c: made the 'stream' a member of the
- CamelFormatter class, so that streams don't have to be explicitly
- sent as a param where a CamelFormatter is also sent..
- (handle_text_plain): Use 'encode_entities' to change '<' to
- '&gt;', etc.
-
-2000-02-03 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-formatter.c (find_preferred_displayable_body_part_in_multipart_alternative):
- (mime_part_to_html): typo fix :
- use find_preferred_displayable_body_part_in_multipart_alternative
- instead of the other names. Allows camel to have no undefined symbols.
-
-2000-02-02 Matt Loper <matt@helixcode.com>
-
- * tests/test-formatter.c: New file; intended to test the
- CamelFormatter class.
-
- * camel/camel-formatter.c: Lots of cleanup, commenting, some new
- functions, and a really basic skeleton for getting bonobo objects
- into the html.
- (encode_entities): New function, stolen from Daniel Velliard.
-
-2000-01-28 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/printing/e-contact-print-style-editor.h,
- addressbook/printing/e-contact-print-style-editor.c,
- addressbook/printing/test-contact-print-style-editor.c: Files to
- load the contact print style editor from the glade file. Doesn't
- really do anything yet.
-
- * addressbook/printing/Makefile.am: Added style editor stuff.
-
- * addressbook/printing/e-contact-print.glade: Changed a bit.
- Fixed an out of place widget.
-
- * addressbook/printing/.cvsignore: Added
- contact-print-style-editor-test.
-
- * addressbook/printing/smallbook.ecps: Fixed up the values to
- match the new types.
-
- * addressbook/printing/medbook.ecps,
- addressbook/printing/phonelist.ecps: Added two new printing
- styles.
-
- * addressbook/printing/e-contact-print.h: Fixed an incorrect
- comment.
-
- * addressbook/printing/e-contact-print.c: Added columns and letter
- tabs. Tweaked spacing all over the place. Fixed card height
- function so that column wrapping is always done correctly. Added
- pulling of style information from a file. Added line wrapping
- within each text field.
-
- * addressbook/printing/e-contact-print-types.h: Added a type field
- for different types of print styles.
-
-
-2000-01-28 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text.c (e_text_command): Handle the grab and ungrab
- command instead of doing focus by hand. This fixes a problem
- related to the scroll wheel.
- (e_text_command): Reset the blink timer in many more command
- situations so that the cursor blinks less when you're interacting
- with it.
-
- * widgets/e-text-event-processor-emacs-like.c: Send the grab focus
- command when starting a selection and the ungrab focus command
- when ending it.
-
- * widgets/e-text-event-processor-types.h: Added grab command type
- so that the event processor can tell the widget to grab the focus.
-
- * widgets/e-reflow.c: Redefined all sizes using #defines so that
- they can be tweaked later. Added scroll wheel handling and set up
- adjustment increments so that the scroll bars will work correctly.
-
- * widgets/e-minicard.h: Added minicard focus type enum. This
- doesn't mean anything yet, but it will later be used to say which
- direction the focus is coming from (below for shift-tab, above for
- tab.)
-
-2000-01-28 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-minicard-label.c, widgets/e-minicard.c: Use
- e_canvas_item_grab_focus so that it will work with old versions of
- gnome-canvas.
-
- * widgets/e-canvas.c, widgets/e-canvas.h: Finished working around
- focus bugs.
-
-2000-01-28 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/test-reflow.c: Set the minimum_width.
-
- * widgets/e-reflow.h, widgets/e-reflow.c: Added one more column
- line so that the right edge of the reflow will have a line. Also
- added a minimum_width so that even if the reflow is thinner than
- the window, when you resize it larger all the lines are drawn.
-
-2000-01-27 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-reflow.h, widgets/e-reflow.c: Added an arrow cursor
- for the draggable columns. Made the clickable column area
- larger.
-
- * widgets/e-text.h, widgets/e-text.c: Added an I beam cursor for
- the text item when it is editable.
-
- * widgets/e-minicard-label.c: Forward enter and leave
- notifications to the contained editable text item.
-
-2000-01-26 Matt Loper <matt@helixcode.com>
-
- * camel/camel-formatter.c: By looking up a mimetype in a
- hashtable, we can now get a handler function for an arbitrary
- mimetype.
-
-2000-01-25 Mathieu Lacage <mathieu@advogato.org>
-
- * .cvsignore s: cvs shutup.
-
-2000-01-25 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-reflow.c, widgets/e-minicard.c: Handle shift-tab
- properly now.
-
- * widgets/e-minicard-label.c: Reindented some areas.
-
- * widgets/test-reflow.c: Use e-canvas. Set the back pixmap to
- NULL for the canvas so that scrolling won't flash grey.
-
- * widgets/e-canvas.c, widgets/e-canvas.h: These subclass
- GnomeCanvas to work around a few bugs so that evolution will work
- well with old versions of gnome-libs.
-
- * widgets/Makefile.am: Added e-canvas.c and e-canvas.h.
-
- * addressbook/contact-editor/contact-editor.glade: Not much
- change. Mostly internal reorganization by glade itself.
-
-2000-01-25 Christopher James Lahey <clahey@helixcode.com>
-
- * addressbook/printing/smallbook.ecps: Example contact printing
- style. Not used yet.
-
- * addressbook/printing/e-contact-print.glade: A glade file for
- editing contact printing styles. Not used yet.
-
- * addressbook/printing/test-print.c: Test file for printing.
-
- * addressbook/printing/e-contact-print.c,
- addressbook/printing/e-contact-print.h,
- addressbook/printing/e-contact-print-types.h,
- addressbook/printing/Makefile.am, addressbook/printing/.cvsignore:
- New files for contact printing support.
-
- * addressbook/Makefile.am (SUBDIRS): Add printing.
-
- * configure.in: Check for gnome-print. Build the
- addressbook/printing Makefile.
-
-2000-01-24 bertrand <bertrand@helixcode.com>
-
- * camel/camel-data-wrapper.h:
- * camel/camel-data-wrapper.c
- (_set_input_stream):
- (_get_input_stream):
- (_set_output_stream):
- (_get_output_stream):
- The CamelDataWrapper can now be provided with input and
- output streams, so that nothing has to be kept in memory.
-
- * camel/camel-stream.c (camel_stream_class_init):
- added the "data_available" signal.
-
-
-2000-01-24 Federico Mena Quintero <federico@helixcode.com>
-
- * configure.in: Added the gnome-pilot and capplet checks; they
- will likely be reworked for the Evolution framework, but for now
- the calendar/ directory needs them.
-
- * configure.in: Added checks for gnome-vfs.
-
-2000-01-24 bertrand <bertrand@helixcode.com>
-
- * camel/camel-seekable-stream.c:
- * camel/camel-seekable-stream.h:
- new files.
-
- * camel/camel-simple-data-wrapper-stream.h: parent class is now
- CamelSeekableStream
- * camel/camel-stream-buffered-fs.h: idem
- * camel/camel-stream-buffered-fs.c: idem
- * camel/camel-stream-mem.h: idem
- * camel/camel-stream-mem.c: idem
- (_seek): change declaration
- * camel/camel-stream-fs.c: parent class is now
- CamelSeekableStream
- (_seek): change declaration
-
- * camel/camel-stream-fs.h: parent class is now
- CamelSeekableStream
-
- * camel/camel-stream-fs.[ch]: converted all
- gint64 variables into guint32.
-
-
- * camel/camel-stream-fs.c (_read): fix stupid bug.
- (_write): ditto.
-
- * camel/camel-exception.c (camel_exception_new): don't
- forget to clean the exception when creating it.
-
- * camel/camel-recipient.c (camel_recipient_table_add_list):
- add recipient_list to the recipients, not recipients_list.
- I don't know what that variable was doing here.
-
-
-2000-01-24 Matt Loper <matt@helixcode.com>
-
- * camel/camel-formatter.c (write_header_info_to_stream): new
- function, broken out from 'camel_formatter_make_html'.
- (write_mimepart_to_stream): same.
- (find_text_body_part_in_multipart_related): new function.
- (camel_formatter_make_html): Now tries to deal with
- multipart/related, multipart/alternate, and text/(plain|html).
-
-
-2000-01-23 bertrand <bertrand@helixcode.com>
-
- * camel/camel-store.c (camel_store_get_session):
- added a public get_session method.
-
- * camel/providers/mbox/camel-mbox-summary.c (camel_mbox_save_summary):
- (camel_mbox_load_summary): load/save message sizes in the summary file
-
- * camel/providers/mbox/camel-mbox-summary.h:
- added a size field to the message information
- structure.
-
- * camel/providers/mbox/camel-mbox-utils.c (parsed_information_to_mbox_summary):
- copy message size to the mbox summary information too.
-
- * camel/camel-stream-fs.c (_seek): updated to
- work with bounded fs streams.
- (_write): ditto.
- (_read): ditto.
-
- * camel/camel-stream-fs.h (struct ):
- added the cur_pos, inf_bound and sup_bound
- members to allow for bounded fs stream.
-
- * camel/camel-stream-fs.c (_set_bounds): new func.
- (_init_with_fd_and_bounds): idem.
- (_init_with_name_and_bounds): idem.
- New functions to allow the usage of bounded fs streams.
-
- The bounded fs stream allow, for example, to make a stream
- from a message stored in an mbox file.
-
-
-2000-01-22 bertrand <bertrand@helixcode.com>
-
- * camel/providers/mbox/camel-mbox-folder.c (_check_get_or_maybe_generate_summary_file):
- use the real summary file path instead of a
- stupid hardcoded one. Fixes yet another bug.
-
- * camel/providers/mbox/camel-mbox-utils.c (parsed_information_to_mbox_summary):
- don't forget to copy the date too. Fix a very annoying bug.
-
- * camel/providers/mbox/camel-mbox-folder.c (_append_message):
- implemented. A lot of fixes too. Works now.
- (_get_uid_list): implemented.
-
-2000-01-21 bertrand <bertrand@helixcode.com>
-
- * tests/test10.c:
- test the mbox provider.
-
- * camel/camel-folder.c (_set_name):
- if camel_folder_get_mode returns an
- exception, return it instead of
- overriding it with a new one.
- (camel_folder_is_open): make the is_open
- method public.
- (_set_name): use the is_open instead of
- get_mode.
- (_set_name): set the fullname even in the case
- where the folder has no parent.
- (_set_name): use %c, not %d to add the
- separator char into the full path.
-
- * camel/camel-store.c: add exception handling everywhere in
- the store related functions arguments.
- * camel/providers/mbox/camel-mbox-folder.c: idem
- * camel/providers/mbox/camel-mbox-folder.h: idem
- * camel/providers/mbox/camel-mbox-store.h: idem
-
- * camel/providers/mbox/Makefile.am (libcamelmbox_la_SOURCES):
- added camel-mbox-provider.c to the mbox provider
- sources.
-
- * camel/providers/mbox/camel-mbox-provider.c:
- provider registration code.
-
- * camel/providers/mbox/camel-mbox-folder.c (_get_message_count): implemented
- (_append_message): implemented
-
- * camel/providers/mbox/camel-mbox-parser.c (initialize_buffer):
- use \0 to mark the end of the buffer.
- (read_next_buffer_chunk): ditto.
- (read_header): test the presence of a \0 instead of
- reading the eof field
- (read_message_begining): idem.
- (camel_mbox_parse_file): idem.
- Remove the eof field from the parser
- structure.
- (read_next_buffer_chunk): removed some nasty bugs
- again.
-
-
-2000-01-21 Federico Mena Quintero <federico@helixcode.com>
-
- * libversit/vcc.y: Removed the VFS crap; my mistake, it should not
- go here.
-
- * configure.in: Added yacc requirements for libversit.
-
-2000-01-21 Matt Loper <matt@helixcode.com>
-
- * camel/camel-formatter.c (camel_formatter_make_html): added a
- CamelMimeMessage as a param to this function, and removed it as a
- member of the object.
-
-2000-01-21 Federico Mena Quintero <federico@helixcode.com>
-
- * configure.in (AC_OUTPUT): Added libversit/Makefile and
- calendar/Makefile.
-
- * Makefile.am (SUBDIRS): Added libversit and calendar.
-
-2000-01-20 bertrand <bertrand@helixcode.com>
-
- * camel/providers/mbox/camel-mbox-parser.c (camel_mbox_parse_file):
- compute and return the file size.
-
-
-2000-01-20 Matt Loper <matt@helixcode.com>
-
- * camel/camel-formatter.c, camel/camel-formatter.h: New
- files. You'll be able to use a CamelFormatter to get
- html-formatted versions of a CamelMimeMessage.
-
-2000-01-20 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text-event-processor-types.h: Changed some line
- spacing.
-
- * widgets/test-reflow.c: Connected to the resize signal of the
- reflow.
-
- * widgets/e-minicard.c: Made width argument set function only
- update if width is different.
-
- * widgets/e-reflow.h, widgets/e-reflow.c: Added draggable column dividers.
-
- * addressbook/contact-editor/test-editor.c: Open two dialogs for
- more interesting testing.
-
- * addressbook/contact-editor/e-contact-editor.h,
- addressbook/contact-editor/e-contact-editor.c: Modified to use
- glade. Added menus to change which phone/address/email entries to
- view. Added images to the dialog.
-
- * addressbook/contact-editor/e-contact-editor-strings.h,
- addressbook/contact-editor/contact-editor.glade: Glade files for
- the contact editor dialog.
-
- * addressbook/contact-editor/Makefile.am: Added images and added
- glade stuff.
-
- * addressbook/contact-editor/arrow.png,
- addressbook/contact-editor/briefcase.png,
- addressbook/contact-editor/netfreebusy.png,
- addressbook/contact-editor/netmeeting.png: Image files for the
- contact editor dialog.
-
-2000-01-19 bertrand <bertrand@helixcode.com>
-
- * camel/providers/mbox/camel-mbox-folder.c (_get_message_count):
- implemented.
-
- * camel/providers/mbox/camel-mbox-summary.c (camel_mbox_save_summary):
- (camel_mbox_load_summary): save/load the next uid.
-
- * camel/providers/mbox/camel-mbox-parser.c (camel_mbox_parse_file):
- Compute the next available uid.
- * camel/providers/mbox/camel-mbox-folder.c (_create):
- (_check_get_or_maybe_generate_summary_file):
- Set and use the next_uid field properly.
- * camel/providers/mbox/camel-mbox-summary.h: added
- an extra field to store the next available uid.
-
- * camel/providers/mbox/camel-mbox-folder.c
- (_check_get_or_maybe_generate_summary_file):
- routine called when the folder is opened.
- Reads or creates the summary file.
- (_create): initialize the internal summary
- structure.
- (_close): save the summary file on closing.
- (_init_with_store): initialize mbox specific
- folder members.
-
-2000-01-18 bertrand <bertrand@helixcode.com>
-
- * tests/test9.c:
- tests for summary and parsing process of mbox files.
-
- * camel/providers/mbox/camel-mbox-parser.c (camel_mbox_parse_file): do
- not use case insensitive comp to detect message separators. Kill
- some nasty bugs in netscape file parsing,
-
- * camel/providers/mbox/camel-mbox-utils.c (parsed_information_to_mbox_summary):
- don't use g_array_append but write directly inside the
- array data instead. Better performance and bug fix.
-
- * camel/providers/mbox/camel-mbox-summary.c (camel_mbox_load_summary):
- fix the name and bugs.
-
- * camel/camel-folder-summary.h: update the class
- method definition to match the public defs.
-
- * camel/providers/mbox/camel-mbox-summary.c (camel_mbox_save_summary):
- (mbox_load_summary): summary file read/write routines.
-
- * camel/providers/mbox/camel-mbox-utils.c (parsed_information_to_mbox_summary):
- routine to construct the summary after the mbox
- file has been parsed and the x-evolution fields
- inserted.
-
-2000-01-17 bertrand <bertrand@helixcode.com>
-
- * camel/providers/mbox/camel-mbox-utils.c (camel_mbox_write_xev):
- dont use the x_evolution field but rather the uid to
- determine the presence of "X-Evolution" in the mail.
-
- * camel/providers/mbox/camel-mbox-parser.c (camel_mbox_parse_file):
- parse the status and uid values if the x-evolution
- has been found.
-
- * camel/providers/mbox/camel-mbox-utils.c (camel_mbox_xev_parse_header_content):
- return the parsed status field correctly.
-
- * camel/providers/mbox/camel-mbox-utils.h:
- fixed bad prototype.
-
- * camel/providers/mbox/camel-mbox-parser.c (camel_mbox_parse_file):
- parse and store the "To:" header.
-
- * camel/providers/mbox/camel-mbox-parser.h:
- added a "to" field
-
- * camel/camel-folder-summary.c:
- create the arrays here.
-
- * camel/camel-folder-summary.h: the list of
- summary information is no longer a GList but
- rather a GArray.
-
-2000-01-17 Chrsitopher James Lahey <clahey@helixcode.com>
-
- * head.png, phone.png, email.png, web.png, snailmail.png: Images
- for e-contact-editor.c.
-
- * addressbook/contact-editor/text-editor.c: Test program
- for contact editor widget.
-
- * addressbook/contact-editor/e-contact-editor.c,
- addressbook/contact-editor/e-contact-editor.h: Contact editor
- widget files.
-
- * addressbook/contact-editor/.cvsignore,
- addressbook/contact-editor/Makefile.am: New directory for contact
- editor files.
-
- * addressbook/.cvsignore, addressbook/Makefile.am: New directory
- for addressbook files.
-
- * widgets/.cvsignore: Added reflow-test.
-
- * Makefile.am (SUBDIRS): Added addressbook subdirectory.
-
- * configure.in, widgets/Makefile.am: Removed widgets/toolbar from
- SUBDIRS since the lack of content was preventing it from
- compiling.
-
- * widgets/e-text.c, widgets/e-text.h: Fixed a crashing bug.
-
-2000-01-17 bertrand <bertrand@helixcode.com>
-
- * tests/test9.c (main): test for the mbox utils.
-
-2000-01-17 Federico Mena Quintero <federico@helixcode.com>
-
- * configure.in: Add the gnomecanvaspixbuf argument to gnome-config
- invocations.
-
-2000-01-17 bertrand <bertrand@helixcode.com>
-
- * camel/providers/mbox/camel-mbox-utils.c (camel_mbox_write_xev):
- (copy_file_chunk):
- (camel_mbox_xev_write_header_content):
- (string_to_flag):
- (flag_to_string):
- (string_to_uid):
- (uid_to_string):
- A bunch of new funcs to handle x-evolution
- private header field.
- (copy_file_chunk): fixed a nasty bug.
- (camel_mbox_write_xev): create the copy file descriptor
- with the proper arguments. Exceptions implememnted.
- (camel_mbox_write_xev): changed the way bytes are counted.
- No more uses the message size cause it did not take into
- account the message separators characters.
- (camel_mbox_write_xev): hopefully fixed the last bugs.
- works ok now.
-
-
-2000-01-15 bertrand <bertrand@helixcode.com>
-
- * camel/providers/mbox/camel-mbox-parser.c
- (camel_mbox_parse_file):
- store the end of headers position.
-
- * camel/providers/mbox/camel-mbox-parser.h:
- added the end_of_header_position to locate the
- begining of the mail body.
-
-
- * camel/providers/mbox/camel-mbox-utils.c (uid_to_string):
- (string_to_uid):
- (flag_to_string):
- (string_to_flag):
- new functions to handle uids and
- flags in the X-Evolution header.
- (camel_mbox_xev_parse_header_content):
- new function to parse an X-Evolution
- header.
- (camel_mbox_xev_write_header_content):
- new function to write the X-Evolution
- header.
-
-2000-01-13 bertrand <bertrand@helixcode.com>
-
- * camel/providers/mbox/camel-mbox-parser.c (read_next_buffer_chunk):
- eof is true when no more chars are available, not
- when we've read the entire file.
- (initialize_buffer): ditto.
- (read_message_begining): documented.
- (read_header): ditto.
- (new_message_detected): ditto.
- (advance_n_chars): ditto.
- (goto_next_char): ditto.
- (read_next_buffer_chunk): ditto.
- (initialize_buffer): ditto.
- (parser_free): ditto.
- (new_parser): ditto.
-
-2000-01-12 <clahey@galapagos.helixcode.com>
-
- * widgets/e-text-event-processor-types.h,
- widgets/e-text-event-processor-emacs-like.c, widgets/e-text.c,
- widgets/e-text.h: Added selection and clipboard support. Added up
- and down arrow keys. Fixed choice of font colors for the
- selection to be based on the current style.
-
- * widgets/e-minicard.c: Caused a click to grab the focus. Changed
- the fake information added.
-
- * widgets/e-minicard-label.c: Forward mouse events to the field
- EText item.
-
-2000-01-13 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-canvas-utils.c, widgets/e-canvas-utils.h:
- e_canvas_item_move_absolute is just a helper function not supplied
- by the gnome_canvas.[ch] I put it here so that multiple items can
- use it.
-
- * widgets/e-reflow.c, widgets/e-reflow.h: This item contains a
- number of other items and places them into multiple columns. The
- items contained must support a number of arguments and signals to
- allow the reflow to interact with them.
-
- * widgets/test-reflow.c: This is a test program for e-reflow.
-
- * widgets/e-text.c, widgets/e-text.h: Added properly drawn
- selected text. Added some preliminary code for X selection
- handling and cut & paste.
-
- * widgets/e-minicard.c, widgets/e-minicard.h: Added ARG_HAS_FOCUS
- handling. Made label display random for more interesting tests of
- multiple cards. Tweaked sizing information for better display.
-
- * widgets/e-minicard-label.c, widgets/e-minicard-label.h: Added
- ARG_HAS_FOCUS handling.
-
- * widgets/Makefile.am: Added the reflow test and reflow files.
-
-2000-01-12 bertrand <bertrand@helixcode.com>
-
- * camel/providers/mbox/camel-mbox-parser.h (camel_mbox_parse_file):
- Added the prototype of camel_mbox_parse_file.
-
- * camel/providers/mbox/camel-mbox-parser.c (camel_mbox_parse_file):
- updated in-line documentation.
-
- * tests/Makefile.am (noinst_PROGRAMS):
- remove non updated tests from the build
- process.
-
- * corrected a bunch of bugs
-
- * camel/providers/mbox/camel-mbox-parser.c
- (camel_mbox_parse_file):
- parser the subject and date.
-
-
- * camel/providers/mbox/camel-mbox-parser.c
- (camel_mbox_parse_file): added the ability to
- follow the parsing progression.
-
- * camel/providers/mbox/camel-mbox-parser.h:
- parse the x-evolution field.
-
- * camel/Makefile.am (libcamel_la_SOURCES):
- disabled gmime-rfc2047 as it depends on libunicode
- and is not used for the moment.
-
-2000-01-12 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-minicard.c, widgets/e-minicard.h: Added a resize
- signal for when the card changes height. Made it so that when you
- press tab inside of a field, it goes to the next field.
-
- * widgets/e-minicard-label.c, widgets/e-minicard-label.h: Added a
- resize signal for when the label changes height.
-
- * widgets/e-text.c, widgets/e-text.h: Added a resize signal for
- multiple lines. Added scrolling based on cursor position.
-
- * widgets/Makefile.am: Removed an extraneous build target.
-
-2000-01-11 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/e-text-event-processor-emacs-like.c: Blocked the tab key
- from getting inserted into the buffer since the renderer doesn't
- know what a tab is.
-
- * widgets/e-text.c, widgets/e-text.h: Fixed a memory leak. Added
- a blinking cursor and scrolling for the text item.
-
-2000-01-11 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/test-minicard.c: Removed some code which got in the way
- of testing properly.
-
- * widgets/e-minicard-label.c (e_minicard_label_realize): Made the
- field text item editable.
-
- * widgets/Makefile.am: Added e-text-event-process*.[ch].
-
- * widgets/e-text.c, widgets/e-text.h: Changed these to support
- editing.
-
- * widgets/e-text-event-processor.c,
- widgets/e-text-event-processor.h,
- widgets/e-text-event-processor-types.h,
- widgets/e-text-event-processor-emacs-like.c,
- widgets/e-text-event-processor-emacs-like.h: These are a new pair
- of classes which handle all events from the text item and convert
- them into commands.
-
-
-2000-01-10 Christopher James Lahey <clahey@helixcode.com>
-
- * widgets/Makefile.am: Added minicard and text stuff.
-
- * widgets/e-minicard.c, widgets/e-minicard.h,
- widgets/e-minicard-label.c, widgets/e-minicard-label.h: Added
- canvas items for the minicard view in the contact manager.
-
- * widgets/test-minicard.c, widgets/test-minicard-label.c: Tests
- for the minicard items.
-
- * widgets/e-text.h, widgets/e-text.c: New canvas item. Based on
- GnomeCanvasText. Adds ellipsis capabilities. Used in
- e-minicard*.[ch].
-
- * widgets/.cvsignore: Added minicard-test and minicard-label-test.
-
-2000-01-06 Miguel de Icaza <miguel@gnu.org>
-
- * configure.in: Add Bonobo detection, Bonobo flags for compilation
- for the components and the shell.
-
-2000-01-06 Elliot Lee <sopwith@redhat.com>
- * composer/Makefile.am, widgets/e-table/Makefile.am: Work with
- builddir != srcdir
-
-2000-01-05 Miguel de Icaza <miguel@gnu.org>
-
- * configure.in (EXTRA_GNOME_CFLAGS_THREADS,
- EXTRA_GNOME_LIBS_THREADS): New variables that hold the thread
- version of the compile/link lines.
-
-1999-11-20 Miguel de Icaza <miguel@gnu.org>
-
- * configure.in (PACKAGE): Raise warning level.
-
-2000-01-04 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/providers/mbox/camel-mbox-folder.c (_list_subfolders):
- in the io_error label does not return before the
- list has been freed.
-
-2000-01-03 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/providers/mbox/camel-mbox-folder.c (_list_subfolders):
- detects netscape ".sdb" folders as well as simple
- non-suffixed folders (as the ones used in pine).
-
-
- * camel/string-utils.c (string_prefix):
- finished implementation.
- (string_prefix): added a boolean flag to indicate if the
- suffix has been found. When the suffix does not match,
- return NULL.
-
-1999-12-26 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-exception.c (camel_exception_setv):
- new function. Allow printf-like description
- string constructions.
-
- * camel/camel-exception.h: cosmetic changes.
-
- * camel/providers/mbox/camel-mbox-store.h:
- * camel/providers/mbox/camel-mbox-store.c:
- * camel/providers/mbox/camel-mbox-folder.h:
- * camel/providers/mbox/camel-mbox-folder.c:
- More work on the mbox provider.
-
-
-1999-12-22 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/providers/mbox/camel-mbox-store.h:
- * camel/providers/mbox/camel-mbox-store.c:
- * camel/providers/mbox/camel-mbox-folder.h:
- * camel/providers/mbox/camel-mbox-folder.c:
- part of the mbox provider.
-
-1999-12-20 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder.c (_set_name):
- check that the folder is closed or raise an exception.
- (_set_name): unset the name fields as soon as possible,
- even if an exception is raised.
-
- * configure.in:
- build mbox provider Makefile
-
- * camel/Makefile.am (SUBDIRS):
- re-enable providers compilation
-
-1999-12-19 Damon Chaplin <damon@karuna.freeserve.co.uk>
-
- * configure.in (AC_OUTPUT): added widgets/meeting-time-sel/Makefile
-
-1999-12-19 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder-utils.c: include camel-log.h
- to avoid unresolved symbols.
-
-1999-12-18 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder.c (camel_folder_get_summary):
- documented.
-
- * camel/camel-folder-pt-proxy.c (_append_message):
- updated to take the change on append into account.
-
- * camel/camel-folder.h:
- updated class def concerning append.
- * camel/camel-folder.c
- (camel_folder_append_message): documented.
- (camel_folder_append_message): don't return the
- message number. Use specific methods instead.
- (_append_message): idem.
-
- (_delete): use exception mechanism.
- (camel_folder_delete): idem.
- (_delete_messages): idem.
- (camel_folder_delete_messages): idem.
- (_get_parent_folder): idem.
- (camel_folder_get_parent_folder): idem.
- (_get_parent_store): idem.
- (_get_mode): idem.
- (camel_folder_get_parent_store): idem.
- (camel_folder_get_mode): idem.
- (_list_subfolders): idem.
- (camel_folder_list_subfolders): idem.
- (_expunge): idem.
- (camel_folder_expunge): idem.
- (_has_message_number_capability): idem.
- (camel_folder_has_message_number_capability): idem.
- (_get_message_by_number): idem.
- (camel_folder_get_message_by_number): idem.
- (camel_folder_get_message_count): idem.
- (_list_permanent_flags): idem.
- (camel_folder_list_permanent_flags): idem.
- (_copy_message_to): idem.
- (camel_folder_copy_message_to): idem.
- (camel_folder_has_summary_capability): idem.
- (camel_folder_get_summary): idem.
- (camel_folder_has_uid_capability): idem.
- (camel_folder_get_message_uid): idem.
- (_get_message_uid_by_number): idem.
- (camel_folder_get_message_uid_by_number): idem.
- (camel_folder_get_message_by_uid): idem.
- (camel_folder_get_uid_list): idem.
-
-1999-12-17 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder.c (_set_name):
- use exception mechanism.
- (camel_folder_set_name): idem.
- (camel_folder_set_full_name): idem.
- (_get_name): idem.
- (camel_folder_get_name): idem.
- (_get_full_name): idem.
- (camel_folder_get_full_name): idem.
- (_can_hold_folders): idem.
- (_can_hold_messages): idem.
- (_exists): idem.
- (camel_folder_exists): idem.
- (_is_open): idem.
- (_get_subfolder): idem.
- (camel_folder_get_subfolder): idem.
-
- * camel/camel-exception.c (camel_exception_clear):
- New function. Clear an exception.
- (camel_exception_get_id):
- New function.
- (camel_exception_get_description):
- New function.
-
- * camel/camel-folder.c (_set_name):
- Use the exception system. When the folder
- has no parent, don't set its full name
- field.
-
-
-1999-12-16 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder.c (camel_folder_expunge):
- (_expunge):
- * camel/camel-folder-pt-proxy.c (_expunge):
- changed the return value. Now returns the list
- of expunged messages
-
- * camel/camel-folder.c (_init_with_store):
- cleaned up. Use the exception system now.
- (_open): ditto.
- (camel_folder_open): ditto.
- (camel_folder_open_async): ditto.
- (_close): ditto.
- (camel_folder_close): ditto.
- (camel_folder_close_async): ditto.
-
- * camel/camel-exception.c (camel_exception_set):
- When no exception is given, do nothing, just
- return.
- (camel_exception_set): documented.
- (camel_exception_new): idem.
- (camel_exception_free): idem.
- (camel_exception_xfer): idem.
-
-
- * camel/camel-folder.c:
- * camel/camel-folder.h: more clean-ups.
- Removed message list related code.
- This was braindead design.
-
-
- * camel/camel-folder-utils.c (camel_aml_expunge_messages):
- implemented. The routines in this file will be
- called by providers to handle the list of
- message already standing in memory.
-
-1999-12-15 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder-utils.c:
- * camel/camel-folder-utils.h:
- New files, misc utilities for the
- folder providers. Includes active message
- list utilities.
-
-
- * camel/camel-folder.c (_has_message_number_capability):
- (camel_folder_has_message_number_capability):
- Added this to know if a folder provides
- number-based message access.
-
- * camel/camel-folder.c (_get_message_count):
- added warning when called directly.
- (_append_message): ditto
- (_open_async): ditto
- (_close_async): ditto
- (_delete_messages): ditto
- (_expunge): ditto
- (_get_message_by_number): ditto
- (_get_message_uid): ditto
- (_get_message_uid_by_number): ditto
- (_get_message_by_uid): ditto
- (_get_uid_list): ditto
-
-
- * camel/camel-folder-pt-proxy.c (_open_async):
- (_open):
- (_close_async):
- (_close):
- (camel_folder_pt_proxy_class_init):
- update
- (_get_message_by_number):
- Update to reflect changes in CamelFolder
-
- * camel/camel-folder.h:
- * camel/camel-folder.c (_get_subfolder):
- (camel_folder_get_subfolder):
- The CamelFolder::get_folder is renamed to
- get_subfolder as it is more intuitive.
-
- * camel/camel-folder.c (_get_message_by_number):
- (camel_folder_get_message_by_number):
- * camel/camel-folder.h
- (camel_folder_get_message_by_number):
- The get_message method is now named
- get_message_by_number for consistency
- with the _by_uid methods.
-
- * camel/camel-folder.[ch]:
- clean-ups.
-
-1999-12-13 Nat Friedman <nat@helixcode.com>
-
- * ebook/e-book.h: New file.
- * ebook/e-book.c: New file.
- * ebook/e-card.h: New file.
- * ebook/e-card-fields.h: New file.
- * ebook/e-commerce.h: New file. :-)
-
-1999-12-08 Ettore Perazzoli <ettore@gnu.org>
-
- * tests/test1.c (main): Removed the strdup()s, which are not
- deeded anymore.
-
- * camel/camel-mime-message.c (_set_subject): `subject' made const.
- (camel_mime_message_set_subject): Likewise.
- (_set_from): `from' made const.
- (camel_mime_message_set_from): Likewise.
- (_set_reply_to): Made `reply_to' const.
- (camel_mime_message_set_reply_to): Likewise.
- (_set_set_received_date): Made `received_date' const.
- (camel_mime_message_set_reply_to): Likewise.
- (_set_field): `value' made const. Also, strdup the string before
- assigning.
-
- * camel/camel-mime-message.h: Virtual methods changed to use const
- strings when setting header values.
-
-1999-11-17 Ettore Perazzoli <ettore@gnu.org>
-
- * composer/Makefile.am (EXTRA_DIST): Added `$(glade_DATA)'.
-
- * camel/Makefile.am (EXTRA_DIST): Added
- `$(libcamel_extra_sources)'.
- (libcamelinclude_HEADERS): Added `gmime-base64.h'.
-
-1999-11-17 Ettore Perazzoli <ettore@gnu.org>
-
- * camel/camel-mime-message.c (_write_to_stream): Removed extra ':'
- in the `Mime-Version' header.
-
- * tests/ui-tests/msg-composer-test.c: Removed.
-
- * Makefile.am (SUBDIRS): Added `composer'.
-
- * configure.in: Create `composer/Makefile'.
-
- * camel/camel-simple-data-wrapper-stream.c
- (camel_simple_data_wrapper_stream_construct): Updated accordingly.
- (camel_simple_data_wrapper_stream_new): Updated accordingly.
- * camel/camel-stream-data-wrapper.c
- (camel_stream_data_wrapper_construct): Updated accordingly.
-
- * camel/camel-data-wrapper.h: Replaced `IS_CAMEL...()' type check
- macro name with `CAMEL_IS...()'.
- * camel/camel-folder-pt-proxy.h: Likewise.
- * camel/camel-folder-summary.h: Likewise.
- * camel/camel-folder.h: Likewise.
- * camel/camel-medium.h: Likewise.
- * camel/camel-mime-body-part.h: Likewise.
- * camel/camel-mime-message.h: Likewise.
- * camel/camel-mime-part.h: Likewise.
- * camel/camel-multipart.h: Likewise.
- * camel/camel-service.h: Likewise.
- * camel/camel-session.h: Likewise.
- * camel/camel-simple-data-wrapper-stream.h: Likewise.
- * camel/camel-simple-data-wrapper.h: Likewise.
- * camel/camel-store.h: Likewise.
- * camel/camel-stream-buffered-fs.h: Likewise.
- * camel/camel-stream-data-wrapper.h: Likewise.
- * camel/camel-stream-fs.h: Likewise.
- * camel/camel-stream-mem.h: Likewise.
- * camel/camel-stream.h: Likewise.
-
- * tests/test1.c (main): Updated to match the `RECIPIENT_TYPE'
- changes.
-
- * camel/camel-mime-message.h: Changed `RECIPIENT_TYPE_TO',
- `RECIPIENT_TYPE_CC' and `RECIPIENT_TYPE_BCC' into
- `CAMEL_RECIPIENT_TYPE_TO', `CAMEL_RECIPIENT_TYPE_CC' and
- `CAMEL_RECIPIENT_TYPE_BCC', respectively.
-
-1999-11-17 Ettore Perazzoli <ettore@gnu.org>
-
- * camel/camel-mime-message.c (_write_to_stream): Write
- "Mime-Version: 1.0" to the stream.
-
- * tests/test1.c: If executed with a file name parameter, attach a
- file with with that name to the email without loading it into
- core, thus demonstrating usage of my latest changes.
-
- * camel/camel-mime-part.c (_set_encoding): Updated to use
- `CamelMimePartEncodingType'.
- (camel_mime_part_set_encoding): Likewise.
- (_get_encoding): Likewise.
- (camel_mime_part_get_encoding): Likewise.
- (_write_content_to_stream): Honour the `encoding' member.
- (_construct_from_stream): Made static.
- (camel_mime_part_encoding_to_string): New function.
- (_write_to_stream): Write the encoding string using it.
- (camel_mime_part_init): Set encoding to
- `CAMEL_MIME_PART_ENCODING_DEFAULT'.
- (_finalize): Don't free `encoding' anymore.
- (camel_mime_part_encoding_from_string): New function.
- (_parse_header_pair): Use it.
-
- * camel/camel-mime-part.h: New enum `CamelMimePartEncodingType'.
- Member `encoding' of `struct _CamelMimePart' changed from `gchar
- *' to `CamelMimePartEncodingType'. All the encoding-related
- methods changed to use this type instead of `gchar *'.
-
- * camel/gmime-base64.c (gmime_encode_base64): Got it to work.
-
- * camel/Makefile.am (libcamel_la_SOURCES): Compile
- `gmime-base64.c'.
-
- * camel/gmime-base64.h: New, previously missing, header.
-
- * camel/camel-stream-data-wrapper.c: New file implementing the
- `CamelStreamDataWrapper' class.
- * camel/camel-stream-data-wrapper.h: Corresponding header.
-
- * camel/camel-simple-data-wrapper.c: Implemented the `get_stream'
- virtual method.
- (_get_stream): New function implementing the method.
- (camel_simple_data_wrapper_class_init): Install it in the class
- struct.
- (camel_simple_data_wrapper_init): New function initializing the
- `stream' member to NULL,
- (camel_simple_data_wrapper_class_init): Set it as the
- GtkObjectInitFunc.
-
- * camel/camel-simple-data-wrapper.h: New member `stream' in
- `struct _CamelSimpleDataWrapper'.
-
- * camel/camel-simple-data-wrapper-stream.c: New file implementing
- the `CamelSimpleDataWrapperStream' class.
- * camel/camel-simple-data-wrapper-stream.h: Corresponding header.
-
- * camel/camel-data-wrapper.c (camel_data_wrapper_get_stream): New
- function.
- (_get_stream): New private function, just returning NULL.
- (camel_data_wrapper_class_init): Install it as the default
- `get_stream' virtual method.
-
- * camel/camel-data-wrapper.h: New virtual method `get_stream' in
- `CamelDataWrapperClass'.
- (camel_data_wrapper_get_stream): New function prototype.
-
-1999-11-05 Ettore Perazzoli <ettore@gnu.org>
-
- * tests/ui-tests/msg-composer-test.c: New file for testing the
- `EMsgComposer' widget.
- * tests/ui-tests/Makefile.am (noinst_PROGRAMS): Compile it. Do
- not compile `store_listing' for now because it's currently broken.
- (INCLUDES): Added the `widgets' source directory to the include
- path list.
- (LDADD): Removed the MH dependency; link with
- `libevolutionwidgets.la' from the `widgets' directory.
-
- * configure.in: Create `widgets/Makefile'.
-
- * camel/gmime-rfc2047.c (rfc2047_clean): Removed C++-like comment.
- * camel/camel-folder.c (camel_folder_get_message_uid_by_number):
- Likewise.
- * camel/gmime-content-field.c (gmime_content_field_get_parameter):
- Likewise.
- * camel/camel.c (camel_init): Likewise.
- * camel/camel-provider.c (camel_provider_register): Likewise.
- * camel/camel-multipart.c (_construct_from_stream): Likewise.
- * camel/camel-mime-part.c (_write_content_to_stream): Likewise.
- * camel/camel-medium.c (camel_medium_class_init): Likewise.
-
- * camel/camel-data-wrapper.h (camel_data_wrapper_get_type): Make
- prototype non-static.
-
- * camel/Makefile.am (libcamelinclude_HEADERS): Move
- `camel-exception-list.def' from `EXTRA_DIST' to
- `libcamelinclude_HEADERS'.
-
- * camel/camel.h: Do not #include <config.h>.
- * camel/data-wrapper-repository.h: Likewise.
-
-1999-11-05 Ettore Perazzoli <ettore@gnu.org>
-
- * tests/Makefile.am (INCLUDES): Add `-I$(top_srcdir)'.
-
-1999-10-13 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder.c (camel_folder_close): the
- folder->close method is now asynchronous.
-
- * camel/camel-folder-pt-proxy.c (_folder_open_cb):
- (_open):
- (_folder_open_cb):
- (_open):
- open/close method implemented in the thread proxy
- folder. More to come.
-
- * camel/camel-exception.c (camel_exception_xfer):
- new utility func.
-
- * camel/camel-marshal-utils.c: some new marshallers
-
- * camel/camel-folder-pt-proxy.c: Some explanations
- on the thread proxy system.
-
-1999-10-11 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-marshal-utils.c:
- camel/camel-marshal-utils.h:
- Handles operation marshalling.
-
- * camel/camel-thread-proxy.c:
- camel/camel-thread-proxy.h:
- new files. Generic proxy system.
-
- * camel/camel-folder-pt-proxy.c
- moved all proxy related code in dedicated files.
-
- (camel_folder_pt_proxy_init):
- removed proxy initialisation code
- (_finalize):
- removed proxy finalization code
-
-
- * camel/camel-exception.c
- (camel_exception_new):
- (camel_exception_set):
- (camel_exception_free):
- New funcs.
-
-1999-09-21 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder-pt-proxy.c (_async_close):
- implemented.
-
- * configure.in:
- Check pthreads.
-
- * camel/Makefile.am:
- camel-folder-pt-proxy.c is only compiled
- when pthreads are available.
-
- * camel/camel-folder-pt-proxy.c:
- Signal proxying implemenatation.
- (_signal_marshaller_server_side):
- (_signal_marshaller_client_side):
- (_init_signals_proxy):
- Code not is tested and has to be best
- explained as it uses threads conditions and
- gtk signal system.
- (_thread_notification_catch): notify pending signals
- as well as thread availability.
-
-1999-09-20 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder-pt-proxy.c (_op_exec_or_plan_for_exec):
- completed
-
- Binch of new funcs:
- (_maybe_run_next_op):
- Called by the watch notification when
- a threaded op is completed
- (_thread_notification_catch):
- notification watch call back
- (_init_notify_system):
- set up the notification channel
- (notify_availability):
- called by threads before completion.
-
-1999-09-18 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder-pt-proxy.c (_op_exec_or_plan_for_exec):
- new func. Try to exec an operation in a thread
- or queue it if a thread is already busy.
-
- * camel/camel-op-queue.c (camel_op_queue_set_service_availability):
- (camel_op_queue_get_service_availability):
- new funcs.
-
- * camel/camel-op-queue.c (camel_op_new):
- (camel_op_free):
- new funcs. Uses glib mem chunks.
-
-
-1999-09-17 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder-pt-proxy.c (_init_with_store):
- added notify io_channel.
-
- * camel/camel-op-queue.h:
- * camel/camel-op-queue.c:
- New object. Operation queue. Meant to be used in
- non-blocking proxy objects.
- (camel_op_queue_run_next_op): new func.
- run the next operation.
-
-1999-09-14 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/Makefile.am (libcamel_la_SOURCES):
- added camel-folder-pt-proxy.[ch] to the build
- process.
-
- * camel/camel-folder-pt-proxy.c (_init_with_store):
- started implementation of the pthread-based
- folder proxy.
-
-
-1999-09-08 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/providers/MH/mh-summary.c
- (mh_load_summary):
- (mh_save_summary):
- (mh_create_summary):
- implemented summary (files) for MH folders.
-
- * camel/providers/MH/camel-mh-folder.c
- (_get_message_by_uid): implemented.
- (camel_mh_folder_class_init):
- (_get_message_uid): implemented
-
- * camel/camel-folder.c (camel_folder_has_uid_capability):
- (camel_folder_get_message_uid):
- (camel_folder_get_message_uid_by_number):
- (camel_folder_get_message_by_uid):
- (camel_folder_get_uid_list):
- Documented UID methods.
- (camel_folder_get_message_uid_by_number):
- const'ified uid.
- (camel_folder_get_message_by_uid): idem
- removed stupid camel_folder_get_message_uid_by_number
- method.
-
- * tests/ui-tests/store_listing.c (close_all):
- close all open folders and stores. (necessary
- for UID list saving ).
-
- * camel/providers/MH/mh-uid.c (mh_generate_uid_list):
- fix: store UID list in CamelMHFolder object.
-
- * camel/providers/MH/camel-mh-folder.c (_open):
- read or create UID list.
- (_close): save UID list.
-
-1999-09-07 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/md5-utils.c (md5_get_digest_from_file):
- correct parameter decl (const)
-
- * camel/md5-utils.h: typo.
-
- * camel/providers/MH/mh-uid.c
- More work on UID stuff for MH.
- (mh_save_uid_list):
- (mh_load_uid_list):
- (mh_generate_uid_list):
- new funcs. Manage on-disk uid list.
-
- * camel/providers/MH/mh-utils.c (mh_is_a_message_file):
- Util routines live here now.
-
- * camel/md5-utils.c
- Documented all funcs.
-
- (md5_get_digest_from_stream):
- correct typo.
- (md5_get_digest_from_file):
- same typo corrected.
-
-
- * camel/md5-utils.h :
- raw routines are declared public now.
- Md5 use has to be versatile.
-
- * camel/providers/MH/mh-uid.c (mh_uid_get_for_file):
- new func. Returns an UID for an MH message.
-
-1999-09-06 bertrand <Bertrand.Guiheneuf@aful.org>
-
-
- * camel/md5-utils.h:
- * camel/md5-utils.c:
- changed names to follow camel style.
- (md5_get_digest_from_stream):
- new methods.
- (md5_get_digest_from_file):
- new function : get file md5 signature.
- To be used in providers code.
-
- * camel/md5-utils.c: imported md5 coding
- routine from rpm. Compiles.
-
-
-1999-09-05 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder.c (camel_folder_has_uid_capability):
- (camel_folder_get_message_uid):
- (camel_folder_get_message_uid_by_number):
- (camel_folder_get_message_by_uid):
- (camel_folder_get_uid_list):
- Basic UID framework.
-
- * devel-docs/misc/ref_and_id_proposition.txt:
- New revision. Some fixes.
-
- * camel/camel-folder.h (struct _CamelFolder): added
- uid_capability field.
-
-
- * camel/camel-folder.c (camel_folder_close): publicized
- the close method.
-
- * tests/ui-tests/store_listing.c (show_folder_messages):
- use folder summary instead of opening all messages.
- (show_folder_messages): re-enabled old CPU/Mem consumming
- method. Useful for pop3 for instance.
-
- * camel/providers/MH/camel-mh-folder.c (_create_summary):
- basic and highly non-efficient summary implementation.
- Should be seen as a proof of concept only.
- subfolder summary still has to be implemented.
-
- * camel/providers/maildir/camel-maildir-folder.c (_init_with_store):
- hasn't summary for the moment.
- * camel/providers/maildir/camel-maildir-folder.c
- cosmetic changes.
-
-
-1999-09-04 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/providers/MH/camel-mh-folder.c (_create_summary):
- started summary implementation.
- (_open): correct use of open.
-
- * camel/camel-folder.c (camel_folder_get_summary):
- get folder associated summary object.
-
- * camel/Makefile.am:
- added summary files build
-
- * camel/camel-folder-summary.[ch]:
- basic summary framework
-
-1999-09-03 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * devel-docs/camel/Makefile.am:
- sgml doc has camel-recipient now.
-
- * camel/camel-recipient.c (camel_recipient_foreach_recipient_type):
- added in-line documentation.
-
-1999-09-02 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/providers/maildir: Added (experimental) maildir
- provider written by Jukka Zitting <hukka@greywolves.org>
-
- * camel/providers/Makefile.am (SUBDIRS): build maildir
- provider.
-
- * camel/camel-provider.c (camel_provider_get_for_protocol):
- bug fix. patch from Jukka Zitting <hukka@greywolves.org>
-
- * camel/camel-mime-message.c (_write_one_recipient_to_stream):
- changed decl to fit CRLFunc.
- (_write_recipients_to_stream):
- calls camel_recipient_foreach_recipient_type now.
-
- * camel/camel-recipient.c (camel_recipient_foreach_recipient_type):
- new convinience function. Iterate over all recipient types.
-
- * camel/gmime-utils.c (gmime_write_header_table_to_stream):
- s/write_header_table_to_stream/gmime_write_header_table_to_stream/
- (gmime_write_header_with_glist_to_stream):
- s/write_header_with_glist_to_stream/gmime_write_header_with_glist_to_stream/
-
-1999-09-01 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-message.c (_finalize):
- (_add_recipient):
- (_remove_recipient):
- (_get_recipients): now use CamelRecipientTable
-
- * camel/gmime-content-field.c:
- (gmime_content_field_unref): test if object
- to free is non void.
-
- * camel/camel-folder.c (_finalize):
- (_set_name):
- * camel/camel-mime-part.c (_finalize):
- (_set_description):
- (_set_disposition):
- * camel/camel-service.c (_finalize):
- * camel/camel-stream-fs.c (_finalize):
- * camel/gmime-content-field.c:
- (gmime_content_field_construct_from_string):
-
- * camel/url-util.c (g_url_free):
-
- When using g_free (obj) don't test if obj != NULL
- g_free () already do that. Thanks to elerium for
- the feedback.
-
-1999-08-30 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-recipient.c (camel_recipient_get):
- (camel_recipient_remove):
- (camel_recipient_add):
- new func. More work on new independant recipient code.
-
-1999-08-29 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * MAINTAINERS: updated my e-mail address.
-
-1999-08-28 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-part.c (camel_mime_part_set_text):
- text parameter declared const
-
- * camel/camel-mime-part-utils.c (camel_mime_part_store_stream_in_buffer):
- actually test correctly nb_bytes_read_chunk is >0
-
- * camel/gstring-util.c:
- * camel/gmime-content-field.c:
- * camel/providers/MH/camel-mh-folder.c:
- * camel/camel-stream-fs.c:
- include string.h
-
- * camel/camel-stream-mem.c (_write): return
- the numver of written bytes.
-
- * camel/camel-stream-buffered-fs.c (_eos):
- return sthg
-
- * camel/camel-stream.c (default_camel_seek):
- return something.
-
-1999-08-26 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-part.c (_get_content_object):
- contruct the content from the buffer before calling
- CamelMedium implementation.
- (_construct_from_stream): Do not construct the content
- by default, just store the content bytes in
- a temporary buffer. Content will be constructed only
- at caller request (when calling CamelMedium::get_content_object)
- Providers with better access to the messages (mbox/MH ...)
- will have to provider lighter implementation, that is
- shall not read content at all unless the caller asks
- for it (again with get_content).
-
- * camel/camel-mime-part-utils.c: new file, groups
- mime-part related utils. Meant to be used by providers
- subclassing MimeMessage.
- (camel_mime_part_construct_headers_from_stream):
- (camel_mime_part_construct_content_from_stream):
- no more useless temporary hash table.
-
- * camel/camel-mime-part.c (_construct_from_stream): calls
- mime-part-utils functions now.
-
- * camel/gmime-utils.c (_store_header_pair_from_string):
- do not use hash table to store header, use an array instead.
-
-1999-08-25 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-part.c: now descend from CamelMedium.
-
- * tests/test1.c (main): all headers must be strdup'ed
- (main): unref created objects
-
- * camel/camel-medium.c (_set_content_object):
- (_get_content_object): these methods are
- in CamelMedium now.
-
-1999-08-24 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-medium.c (camel_medium_class_init):
- new class. Will handle all sort of information media
- (Mime mail messages, Lotus Notes mail messages,
- postit notes, faxes, who knows .... :)
- CamelMimePart will inherit from it.
-
- * camel/camel-mime-part.c (_set_disposition):
- (_set_description):
- description and disposition parameters are now const.
-
-
- * camel/gmime-content-field.c (gmime_content_field_free): added
- assertion code.
-
- * camel/providers/MH/camel-mh-folder.c (_get_message):
- uses buffered stream.
-
- * camel/camel-stream-buffered-fs.c:
- new stream to accelerate file ops.
-
-1999-08-20 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-stream-fs.c (camel_stream_fs_new_with_name):
- name parameter is const. This fixes a bug in destroy ()
-
-1999-08-18 Robert Brady <rwb197@ecs.soton.ac.uk>
-
- * camel/gmime-rfc2047.c: more work on encoder.
-
-1999-08-17 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-stream.c (camel_stream_read):
- return the number of bytes read.
- How can this have ever worked ?
- (camel_stream_flush): don't return anything.
-
- * camel/gmime-utils.c (get_header_table_from_stream):
- mem leak fixed.
-
-1999-08-16 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * tests/ui-tests/store_listing.c:
- Now has a popup menu on mailbox tree to allow
- easier tests. Implemented the copy stuff.
- Works well for the MH provider :)))
-
- * camel/providers/MH/camel-mh-folder.c (_copy_message_to):
- Test MH provider fast copy implemented.
-
-
-1999-08-15 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder.c (camel_folder_expunge):
- moved the active list readjustment code here.
- Much saner, providers won't have to worry about
- that.
- (_copy_message_to): new method.
-
- * camel/providers/MH/camel-mh-folder.c (_expunge):
- no more active list readjustment stuff.
-
- * camel/camel-folder.h: the expunge virtual no more
- returns a list of expunged messages. Now providers
- only have to set the expunge flag on the expunged
- messages.
-
- * camel/camel-folder.c (camel_folder_get_message):
- moved the caching code here. Finally, I don't want
- providers to crash the libs with a bad message cache
- implementation.
- (_close): do not call the CamelFolder virtual expunge
- method directly, use camel_folder_expunge() instead.
- (camel_folder_expunge): added the want_list param.
- The client can decide if it wants the expunged message
- list or not. If yes, it'll have to unref the messages
- itself.
-
-1999-08-14 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * tests/ui-tests/store_listing.c (delete_selected_messages):
- (expunge_selected_folders):
- Implemented deletion/expunge mechanism.
-
- * camel/camel-folder.c (_get_message):
- Added some debug info.
-
- * camel/providers/MH/camel-mh-folder.c (_expunge):
- implemented and tested.
-
- * camel/camel-mime-message.c (_set_flag):
- changed the old braindead implementation.
- boolean are inserted in the flag hash
- table casted as gpointers.
-
-
- * camel/camel-mime-message.c: indentation fix
-
-
-1999-08-13 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder.c (_get_message): default implementation
- to be called first by providers methods. It looks in the
- folder message list (in memory) to see if the message has
- not already been retrieved, and in this case, returns
- the same CamelMimeMessage object
-
- * camel/providers/MH/camel-mh-folder.c (_get_message): set
- message->message_number correctly.
-
- * camel/camel-folder.h (struct _CamelFolder):
- New field (message_list) which will hold a
- reference on each message obtained by the folder,
- which is necessary in order for the caching procedure
- to work (Getting the same message from a folder twice
- will return the same CamelMimeMessage object).
-
- * camel/camel-folder.c (camel_folder_get_message):
- When the store retreives a message put it in its
- message list.
- (_finalize): free message list.
-
- * ChangeLog: fix typo (parmanent)
-
- * camel/camel-folder.c (_get_permanent_flag_list):
- (camel_folder_get_permanent_flag_list):
- new method, returns the list of permanent
- flags supported by the folder.
-
- * camel/camel-mime-message.c (_get_flag_list):
- (camel_mime_message_get_flag_list): new method,
- return the list of flag name used by this message.
-
- * camel/hash-table-utils.c (g_strcase_equal):
- (g_strcase_hash): those two func go here now.
-
- * camel/hash_table_utils.c (hash_table_generic_free):
- free a (gpointer, gpointer) hash table pair.
-
- * camel/camel-mime-message.c (camel_mime_message_init): use
- case insensitive hash table functions.
- (_set_flag):
- (camel_mime_message_set_flag):
- (_get_flag):
- (camel_mime_message_get_flag):
- Use const for flag name, they are now
- duplicated.
-
-1999-08-12 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * tests/ui-tests/store_listing.c (show_folder_messages):
- remove stupid debug code.
- (add_mail_store): use camel_session_get_store instead
- of creating MH store directly.
- (main): load MH provider.
-
- * camel/camel-provider.c (camel_provider_register_as_module):
- register new provider.
- (camel_provider_get_for_protocol):
- Now, implementation is correct.
-
- * camel/camel-store.c (_finalize):
- * camel/camel-store.h (struct _CamelStore):
- further disabled url_name field use.
- URL will be generated dynamically.
-
- * camel/camel-session.c (camel_session_get_store_for_protocol):
- compilation and runtime fixes.
-
- * camel/providers/MH/camel-mh-store.c (_init):
- synced with CamelStore.
-
- * camel/camel-store.c (_init):
- in CamelStore::init, url_name is now const.
- disabled url_name copy.
-
- * camel/camel-session.c (camel_session_get_store):
- new function: returns a store for an URL.
- (camel_session_get_store_for_protocol):
- new functionc: returns a store for a given
- store protocol (as IMAP/POP/MH ...)
- * camel/string-utils.c (g_strcase_equal):
- (g_strcase_hash): case insensitive hash table
- funcs.
-
- * camel/camel-session.c (camel_session_init): hash table
- keys are case insensitive.
-
- * camel/camel-provider.c (camel_provider_get_for_protocol):
- new function, returns the last registered
- provider for a protocol.
-
- * camel/providers/MH/camel-mh-provider.c:
- new file. MH provider registration stuff.
-
- * camel/camel-provider.c (camel_provider_register_as_module):
- load a provider from a shared object (plugin).
- (camel_provider_register): register a provider
- "by hand". Used for statically defined providers.
-
- * tests/test7.c: new test.
- tests providers loading framework.
-
-1999-08-11
-
- * camel/camel-service.c (_finalize):
- * camel/camel-stream-fs.c (_finalize):
- (_destroy): close file descriptor.
- * camel/camel-stream-mem.c (_finalize):
- * camel/camel-store.c (_finalize):
- * camel/camel-folder.c (_finalize):
- * camel/camel-multipart.c (_finalize):
- * camel/camel-simple-data-wrapper.c (_finalize):
- * camel/camel-mime-part.c (_finalize):
- implemented destructors.
-
-
- * camel/gmime-content-field.c (gmime_content_field_ref):
- (gmime_content_field_unref):
- New reference mechanism for GMimeContentField objects.
-
- * camel/camel-data-wrapper.c (_finalize):
- Started implementing destructors.
-
- * camel/camel-mime-part.c (_construct_from_stream):
- * camel/gmime-content-field.c (gmime_content_field_write_to_stream):
- * camel/camel-multipart.c (_construct_from_stream):
- removed forgotten anarchic traces.
-
-1999-08-10 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * tests/ui-tests/store_listing.c:
- * tests/ui-tests/store_listing.glade:
- Quick and (very) dirty hack to test Camel more
- easily.
-
- * camel/camel-folder.c (camel_folder_append_message):
- new method.
-
-1999-08-09 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * devel-docs/misc/ref_and_id_proposition.txt:
- new file. Document message UID and vfolder
- implementation.
-
-1999-08-08 Robert Brady <rwb197@ecs.soton.ac.uk>
-
- * camel/gmime-rfc2047.c: more advanced RFC2047 encoder started.
-
-1999-08-08 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/providers/MH/camel-mh-folder.c (_get_message):
- fix. In MH, message number is not related to
- message position in folder.
-
- * camel/providers/MH/camel-mh-folder.c (_is_a_message_file):
- util func.
- (_get_message_count): implemented.
-
-1999-08-06 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * devel-docs/camel/:
- updated some autogen doc stuff.
- Still don't understand warnings :(
-
- * camel/camel-data-wrapper.c:
- * camel/providers/MH/camel-mh-store.c:
- * camel/url-util.c:
- * camel/gmime-content-field.c:
- * camel/camel-store.c:
- various inline doc corrections.
-
- * camel/camel-folder.c (get_message_count):
- new method. Returns the number of message
- in the folder.
-
-
-
-1999-08-06 Robert Brady <rwb197@ecs.soton.ac.uk>
-
- * tests/test6.c: encoder test.
-
- * camel/gmime-rfc2047.c: Fixed decoder bug : sequence
- ?= is not always the terminator for an encoded-string.
-
-
-1999-08-06 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/providers/MH/camel-mh-folder.c (_list_subfolders):
- stat was not testing the good file. Fixed.
-
- * tests/test4.c (main): added real test for MH folder
- provider. All tested things seem to work OK :)
-
-1998-08-06 Robert Brady <rwb197@ecs.soton.ac.uk>
-
- * tests/test5.c: test for RFC2047 decoder.
-
- * camel/gmime-rfc2047.c: Improved RFC2047 decoder.
-
-1999-08-06 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/providers/MH/camel-mh-folder.c (_exists): add debug information
- (_list_subfolders): test if first char in folder name is not '.'
- before adding it to the folder list.
-
- * camel/camel-store.c (_init):
- disable session check temporarily
- (_get_separator):
- (_get_folder): new static func.
- Fixed several oddities in class definition.
-
- * camel/providers/MH/camel-mh-store.c (camel_mh_store_get_type):
- parent type is CAMEL_STORE_TYPE not CAMEL_FOLDER_TYPE
-
- * camel/camel-store.c:
- prent class is CamelServiceClass not GtkObjectClass
-
- * camel/url-util.c :
- cosmetic changes + use of const when possible.
- (find_host):
- fix a bug: when there is no host and no port don't skip the '/'
- all static find_* func are now named _func_*
- (g_url_free): destructor func.
- cache field has been disabled. Constructing the url string
- won't be too slow and will occur rarely enough that we
- do not need to add complexity to this code.
-
- * camel/providers/MH/camel-mh-store.c:
- parent class is CamelStorClass not GtkObjectClass
-
-1999-08-05 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * tests/test4.c:
- test mh provider.
-
- * camel/providers/MH/camel-mh-folder.c (_get_message):
- implemented
-
- * camel/camel-folder.c (_get_message):
- new method.
- (camel_folder_get_message):
- corresponding public call
-
- * camel/README.HACKING:
- Some notes.
-
- * camel/CODING.STYLE:
- short note about coding style.
-
- * camel/README.COPYRIGHT:
- Note about copyright policy.
-
- * camel/providers/MH/camel-mh-folder.c (_list_subfolders):
- minor typo fixes.
-
-
-1999-08-04 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/gmime-rfc2047.c:
- * camel/gmime-rfc2047.h:
- indentation and cosmetic changes.
-
- * camel/providers/MH/camel-mh-folder.c (_list_subfolders):
- implemented.
- * camel/providers/MH/camel-mh-folder.c (_delete):
- finshed implementation
- (_delete_messages): implemented.
-
-
-1999-08-04 Robert Brady <rwb197@ecs.soton.ac.uk>
-
- * camel/gmime-rfc2047.[ch]: added an implemention of RFC2047
- (support for character sets other than US-ASCII in MIME
- headers). Not actually called from anywhere yet.
-
-
-1999-08-03 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/providers/MH/camel-mh-folder.c (_create):
- implemented.
- (_delete): started implementation.
-
- * camel/camel-folder.c (_get_folder): default implementation
- calls camel_store_get_folder ().
-
- * camel/providers/MH/camel-mh-folder.c (_init_with_store):
- implemented.
-
- * camel/camel-folder.h (struct _CamelFolder):
- remove useless exist_on_store field.
-
- * camel/camel-folder.c (_exists):
- do not use exist_on_store field.
-
- * camel/camel-folder.c (camel_folder_set_name):
- (camel_folder_get_name):
- new public functions
- (_set_name): set full_path.
-
- (_set_full_name):
- (camel_folder_set_full_name):
- commented out this functions def.
- It would make things very difficult to handle, and would not
- be very useful.
-
- * camel/providers/MH/camel-mh-store.h:
- * camel/providers/MH/camel-mh-store.c (camel_mh_store_set_toplevel_dir):
- (camel_mh_store_get_toplevel_dir):
- * camel/providers/MH/camel-mh-folder.c (_set_name):
- * camel/providers/MH/camel-mh-folder.h:
- use (gchar *) instead of (GString *) everywhere.
- use const when necessary.
-
- * camel/camel-folder.h (struct _CamelFolder):
- removed unused message_list field.
-
- * camel/camel-mime-part.c (_set_content_object):
- There is a probleme here. We can not allow mime part
- content-type field and content_object mime-type to be
- different. I thus chosed to set mime part object
- content field to be freed (if necessary) and set
- to be a pointer to content_object mime type
- field.
- (_construct_from_stream): set content_object mime type
- to be the same as mime_part's one. This is necessary
- because we use _set_content_type.
-
- This two things are a bit hackish ansd may need
- to be redesigned.
-
- * camel/gmime-utils.c (gmime_write_header_pair_to_stream):
- use g_strdup_printf and remove a bug.
-
- * camel/camel-simple-data-wrapper.c (_construct_from_stream):
- more debugging output + nb_bytes_read is now a signed int
- to avoid bug when eos is encountered.
-
- * camel/camel-mime-part.c (_construct_from_stream):
- sync to data_wrapper_repository function name changes.
- Use default "text/plain" type when conten-type field
- is not found. (following RFC 2046 spec).
-
- * camel/data-wrapper-repository.c (data_wrapper_repository_set_data_wrapper_type):
- (data_wrapper_repository_get_data_wrapper_type):
- change function name prefix (s/data_wrapper/data_wrapper_repository/)
-
- * camel/camel-multipart.c (_read_part):
- add `\n` at eol but not before boundary.
-
- * camel/gmime-utils.c (get_header_table_from_stream):
- correct implementation of end of stream detection.
-
-1999-08-01 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-multipart.c (_read_part):
- use a stream to store the part instead of GString.
-
- * camel/camel-mime-part.c (camel_mime_part_set_text):
- set data wrapper content type to "text/plain".
-
- * camel/camel-stream-mem.c:
- * camel/camel-stream-mem.h:
- new memory buffer based stream.
-
- * camel/camel-stream-fs.c (_seek):
- implementation for file system based stream.
-
- * camel/camel-stream.c (camel_stream_seek):
- new method.
-
- * camel/camel-stream-fs.c (camel_stream_fs_class_init):
- pass CamelStreamFsClass instead of CamelStreamClass.
-
-1999-08-01 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/gmime-utils.c (gmime_write_header_pair_to_stream):
- corrected a bug with memory not allocated for '\0' in strtmp
-
- * camel/gmime-utils.c (gmime_read_line_from_stream):
- do not return NULL when line is empty.
-
- * camel/camel-multipart.c (_read_part): return true when end
- of multipart is found, not the opposite
-
-1999-07-31 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/gmime-utils.c (gmime_read_line_from_stream):
- Don't return crlf at end of line.
-
-1999-07-30 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/gmime-utils.c (gmime_read_line_from_stream):
- new function: reads a line from a stream.
- should be in streams utils maybe.
-
-1999-07-29 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-part.c (_construct_from_stream):
- Uses data wrapper repository to find what data wrapper
- to use to construct the content from a stream. When
- no object is registered for the mime type found in
- content type field a CamelSimpleDataWrapper is
- used.
-
- * camel/camel-mime-part.c (_get_content_type):
- (camel_mime_part_get_content_type): returns
- a pointer on the content_type field instead
- of the gchar * mime "type/subtype".
-
-1999-07-28 bertrand <Bertrand.Guiheneuf@aful.org>
-
-
- * camel/data-wrapper-repository.c
- * camel/data-wrapper-repository.h
- New files. Handles mime type <-> camel object
- (for example "multipart" <-> CamelMultipart
- * tests/tesst3.c: test data repository thing.
-
-1999-07-26 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-multipart.c (_write_to_stream):
- implemented output of multipart.
-
- * tests/test1.c (main): testing content objects operations.
-
-1999-07-25 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-part.c (camel_mime_part_set_text):
- new util function to set a mime part content to be
- a text string.
-
- * camel/camel-simple-data-wrapper.c (camel_simple_data_wrapper_set_buffer_from_text):
- new util func.
- (camel_simple_data_wrapper_new): new func.
-
- * camel/camel-multipart.c (_write_to_stream):
- implemented output of multiparts.
-
-1999-07-24 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/gmime-content-field.c (gmime_content_field_get_parameter):
- New function. Returns the value associated to a
- mime parameter.
-
-
-1999-07-22 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-multipart.h:
- * camel/camel-multipart.c:
- New class. Models multipart mime objects.
-
- * camel/camel-mime-body-part.h:
- * camel/camel-mime-body-part.c:
- New class. Body part is a mime part contained in
- a multipart object.
-
-
-1999-07-21 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-log.h:
- implemented hard log level stuff.
- * came/*.c use "CAMEL_LOG_*" instead of "CAMEL_LOG (*"
- in order to allow hard level switch.
-
- * tests/test1.c:
- * tests/test2.c:
- updated to use gchar instead of GString. Tests passed.
-
-
-1999-07-19 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-stream.c:
- * camel/camel-stream.h:
- "const"-antified
-
-
- * camel/camel-simple-data-wrapper.c: (_construct_from_stream)
- do not use any limit when constructing the object from a stream
-
- * camel/camel-stream-fs.c:
- * camel/camel-stream-fs.h:
- * camel/camel-mime-message.c:
- * camel/camel-mime-message.h:
- * camel/camel-session.c:
- * camel/camel-session.h:
- * camel/camel-service.c:
- * camel/camel-service.h:
- * camel/camel-store.c:
- * camel/camel-store.h:
- * camel/camel-folder.c:
- * camel/camel-folder.h:
- * camel/gmime-utils.c:
- * camel/gmime-utils.h:
- GString -> gchar
- constantified what had to be.
-
- * camel/string-utils.c:
- * camel/string-utils.h:
- New files. Meant to replace gstring-util for gchar *
-
-1999-07-16 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/gmime-content-field.c (gmime_content_field_construct_from_string):
- GString -> gchar
- use const to indicate copied parameter.
-
-1999-07-15 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-simple-data-wrapper.c:
- * camel/camel-simple-data-wrapper.h:
- Gstring -> gchar
-
-1999-07-15 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/url-util.c:
- * camel/url-util.h:
- Do not use GStrings any more.
- Added assertion code.
- Cosmetic reformating
-
- * AUTHORS:
- * ChangeLog:
- Changed my email address.
-
-
-1999-07-13 Miguel de Icaza <miguel@gnu.org>
-
- * camel/gmime-base64.c (gmime_encode_base64): Implemented base64
- encoder based on CamelStreams. Should the encoder/decoder be a
- Stream itself?
-
- * camel/gmime-utils.c: include config.h here.
- * camel/url-util.c: ditto.
- * camel/gstring-util.c: ditto.
- * camel/gmime-content-field.c: ditto.
- * camel/camel-stream.c: ditto.
- * camel/camel-stream-fs.c: ditto.
- * camel/camel-store.c: ditto.
- * camel/camel-simple-data-wrapper.c: ditto.
- * camel/camel-session.c: ditto.
- * camel/camel-service.c: ditto.
- * camel/camel-mime-part.c: ditto.
- * camel/camel-mime-message.c: ditto.
- * camel/camel-log.c: ditto.
- * camel/camel-data-wrapper.c: ditto
- * camel/camel-folder.c: ditto.
-
- * camel/camel-stream.c (camel_stream_write): Moved api
- documentation to the places that they document.
- (camel_stream_class_init): Virtual classes do not need to have a
- default implementation. So null them all.
- (camel_stream_write): Return value from write.
- (camel_stream_available): implement.
- (camel_stream_write_strings): documented.
-
- * devel-docs/query/virtual-folder-in-depth.sgml: Small
- reformatting
-
-1999-06-28 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * tests/test2.c (main): now use
- CamelDataWrapper::contruct_form_stream to test
- message parsing
-
- * camel/camel-data-wrapper.c:
- * camel/camel-data-wrapper.h:
- construct_from_stream no longer has maximimum size arg.
-
- * camel/camel-mime-part.c (_construct_from_stream): new.
- Construct the mime_part from a stream.
-
- * camel/camel-mime-part.c:
- new field (content_type) and associated methods.
- (camel_mime_part_init): initialize content_type field.
- (_parse_header_pair): now set content_type MimePart field
- instead of using DataWrapper Mime typing facility.
-
-1999-06-28 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-data-wrapper.h:
- s/content_type/mime_type/
-
-1999-06-24 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-simple-data-wrapper.[ch]:
- new class. Simple implementation of a data wrapper:
- simply keeps the stream result in a byte array.
-
- * camel/camel-mime-part.c (_parse_header_pair): added a warning.
- Have to think about the correct way to store content type stuff.
-
-1999-06-24 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-message.c (_write_one_recipient_to_stream):
- includes gmime-utils header.
- patch from Ulrich Drepper <drepper at cygnus.com>
- set separator string in write_header_with_glist_to_stream()
-
- * camel/camel-log.c (camel_log):
- patch from Ulrich Drepper <drepper at cygnus.com>
- Do not use stderr in initialization of logfile descriptor.
-
- * camel/camel-stream-fs.c (camel_stream_fs_new_with_name):
- patch from Ulrich Drepper <drepper at cygnus.com>
- initialize mode field in open().
-
-1999-06-22 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-data-wrapper.c (_get_content_type):
- moved all the content-type stuff here.
- (camel_data_wrapper_init): initialize the instance
- content-type field.
-
- * camel/camel-mime-part.c (_parse_header_pair):
- parse Content-Type stuff in header.
- (_write_to_stream): write the content type stuff to
- the stream.
-
- * camel/gmime-content-field.c (gmime_content_field_get_mime_type):
- new function, returns "type/subtype" mime type string.
- (gmime_content_field_construct_from_string):
- new function, construbt a content_field object
- form a string. be used to set the mime_type from a
- string.
-
- * camel/camel-mime-part.c (_set_content_type):
- (camel_mime_part_set_content_type):
- (_get_content_type):
- (_get_content_type):
- new methods.
-
-1999-06-21 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/gmime-utils.c (get_header_table_from_stream):
- replace CR/LF+'\t' with ' '
-
- * camel/camel-mime-message.c (_set_recipient_list_from_string):
- trim \t when splitting
-
- * camel/gmime-utils.c (get_header_table_from_file):
- corrected bug in scanning tabulations ('t' -> '\t')
-
- * tests/test2.c (main): read mail.test instead
- of mail1.test
-
- * camel/camel-mime-part.c (_add_header):
- added comments
-
-1999-06-03 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * devel-docs/query/virtual-folder-in-depth.sgml:
- sgmlized Giao's doc about virtual folders.
-
-1999-05-31 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * tests/test2.c (main):
- use new stream code instead of raw file * stuff.
-
- * camel/gmime-utils.c (get_header_table_from_stream):
- new func. Will replace get_header_table_from_file and will
- be used to parse headers from files as well as from
- memory buffers.
-
- * camel/camel-stream-fs.c:
- CamelStream Subclass. File system based
- stream.
-
-
-1999-05-30 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-stream.h: new class. Represents an
- abstract stream object.
-
- * camel/camel-mime-message.c (_set_recipient_list_from_string):
- remove leading and trailing spaces in recipient addresses.
-
- * camel/gmime-utils.c (_store_header_pair_from_gstring):
- remove leading and trailing spaces from header values.
-
- * camel/gstring-util.c (g_string_trim): new
- func: remove leading or trailng chars from
- a specified char set.
- (g_string_split): allow trimming of substrings.
-
- * tests/test1.c (main): remove gtk_main call
-
-1999-05-28 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-part.c
- (_parse_header_pair):
- (_init_header_name_table):
- More header parsing code.
-
-
-1999-05-27 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * tests/test2.c (main): rewrite message obtained via
- parsing into a file. Actually, it works pretty well :))
-
- * camel/camel-mime-message.c (_set_recipient_list_from_string):
- create recipient list form a comma separated string.
- (_parse_header_pair): added recipient lists parsing.
-
- * camel/camel-mime-part.c (_parse_header_pair):
- new (protected) method. Parse a head pair and
- decides what to do with it.
-
- (_add_header): Call in _parse_header_pair
-
- * camel/camel-mime-message.c (_parse_header_pair):
- overload header parsing MimePart mthod.
-
- * camel/gstring-util.c (g_string_split):
- new func: split a gstring into a GList of
- substring.
-
-1999-05-26 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/gmime-utils.c (get_header_lines_from_file):
- new func. Parses message header zone and returns
- a Glist of all header lines.
-
- * tests/test2.c: tests message parsing
-
- * camel/gmime-utils.c (write_header_table_to_file):
- new func to write a table of headers.
-
-1999-05-20 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-message.c (_write_to_file):
- recipient list printing
-
- * tests/test1.c (main): more tests.
-
-1999-05-19 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-part.c (_write_to_file): test if content
- exists before calling its write_to method.
-
- * camel/camel-mime-message.c (_write_to_file): bugs fix.
-
- * camel/camel-mime-message.c (camel_mime_message_new_with_session):
- new func. Creates a message with the session field set
- up correctly.
-
-1999-05-18 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * tests/test1.c (main): tests
-
- * camel/camel-mime-message.c (_write_to_file):
- started write_to framework for mime_messages
-
- * camel/camel-mime-message.c (*_message_number):
- message number funcs.
-
-1999-05-15 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-message.c (*_flag):
- flags handling methods
-
-1999-05-14 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-message.c (camel_mime_message_class_init):
- added recipient handling class funcs.
-
-1999-05-13 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-message.c (camel_mime_message_init):
- create recipients hash table
- (_remove_recipient):
- (_add_recipient):
- (_get_recipients): new funcs.
- Internal Recipients data structure is
- a bit complicated though.
-
- * camel/camel-mime-part.c (camel_mime_part_init):
- create headers hash table
-
- * camel/camel-mime-message.h:
- a bunch of get/set header field
- method done. Does nothing yet though.
-
- * camel/camel-mime-message.[ch] :
- new file.
-
-1999-05-12 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-part.h (struct ):
- disposition is now a full GMimeContentField
- object.
-
- * camel/gmime-content-field.c: new file
- handle "type/subtype ;parameter=value ; parameter=value ..."
- BNF grammar elements
- (gmime_content_field_write_to_file): new func
-
- * camel/gmime-utils.c (gmime_write_header_pair_to_file):
- namespace change
-
-1999-05-11 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-part.c (_write_to_file):
- overload wrapper class method.
- (_write_to_file): start to write some text in
- file.
-
- * camel/camel-store.c: typo fix.
-
- * camel/camel-store.c:
- * camel/camel-service.c:
- * camel/camel-folder.c:
- * camel/camel-data-wrapper.c:
- * camel/camel-mime-part.c:
- static functions naming follows gnome
- coding style guide.
-
- * camel/camel-mime-part.h: implemented public interfaces
-
-
-1999-05-10 Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-part.c (__camel_mime_part_get_header_lines):
- (__camel_mime_part_set_header_lines):
- (__camel_mime_part_get_content_languages):
- (__camel_mime_part_set_content_languages):
- (__camel_mime_part_get_encoding):
- (__camel_mime_part_set_encoding):
- (__camel_mime_part_get_content_MD5):
- (__camel_mime_part_set_content_MD5):
- (__camel_mime_part_get_content_id):
- (__camel_mime_part_set_content_id):
- A bunch of new set/get func.
-
- * camel/gstring-util.c (g_string_list_free):
- convenience function for string list
- complete deallocation.
-
-1999-05-09 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-part.c (__camel_mime_part_add_header):
- new method
-
- * camel/camel-mime-part.h (struct CamelMimePart):
- added core fields.
-
-1999-05-08 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-mime-part.[ch]:
- new class. models a mime mail part.
-
- * camel/camel-data-wrapper.c
- (camel_data_wrapper_write_to_buffer): method to
- stream data content in a buffer.
- (camel_data_wrapper_write_to_file):
- (camel_data_wrapper_construct_from_buffer):
- (camel_data_wrapper_construct_from_file):
- new methods.
-
-1999-05-07 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-data-wrapper.[ch]:new class.
- This should not be a class but rather an
- interface. The day Gtk support interfaces,
- it dataWrapper should become an interface.
-
-1999-05-04 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-service.c (camel_service_get_url):
- new method.
-
- * devel-docs/camel/camel-sections.txt: added
- function doc references
-
- * camel/camel-folder.c (__camel_folder_close):
- fixed indentation.
- (camel_folder_expunge): new method.
- (__camel_folder_close): used expunge flag
-
-1999-05-03 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder.c (camel_folder_get_mode):
- typo fix
-
- * camel/camel-folder.c (__camel_folder_list_subfolders):
- new func.
-
- * some doc stuffs
-
-
-1999-05-01 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder.c
- (__camel_folder_get_mode):
- (camel_folder_get_mode):
- (camel_folder_get_parent_store):
- (__camel_folder_get_parent_store):
- (camel_folder_get_parent_folder):
- (__camel_folder_get_parent_folder):
- new methods
-
- * camel/camel-service.c: put __ prefix before
- private virtual funcs.
-
- * camel/camel-folder.c (camel_folder_delete):
- (camel_folder_delete_messages):
- new methods.
-
- * camel/url-util.c (g_url_new): some
- more comments
-
-1999-04-27 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder.c (camel_folder_create):
- new public function.
-
-1999-04-25 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-session.c (camel_session_get_store_from_provider):
- initialize folder object.
-
- * camel/camel-store.c (init): new method.
- called by session object at instantiation time.
-
- * camel/camel-store.h (struct _CamelStore):
- new fields : session and url_name
-
-1999-04-25 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-session.c (camel_session_set_provider):
- new method to set the default provider for a protocol.
- (camel_session_get_store_from_provider):
- new method to instantiate a folder from a provider.
-
- * camel/camel-provider.h: s/GString/gchar/g
- + typo fix.
-
- * camel/camel-provider.[ch]:
- basic provider structure. Have to write the
- code for dynamic loading.
-
-1999-04-24 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/url-util.[ch]: s/new_g_url/g_url_new
-
- * camel/url-util.c (new_g_url): URL
- rewritten completely. Error handling not
- implemented in public functions.
- But URL scan works pretty well :)))
-
-1999-04-24 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/url-util.[ch]: I needed the url
- functions to use GString, and I wanted a more
- general scheme so I finally started rewriting
- the whole thing from scratch.
- No more code from gzilla :(
-
-1999-04-23 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/url-util.[ch]:
- Utility functions to parse URLs.
- Stolen shamelessly from gzilla (www.gzilla.com)
- written by Raph Levien <raph@acm.org>
-
- * camel/Makefile.am: added url-util.[ch]
- compilation.
-
- * Makefile.am (SUBDIRS): removed devel-docs
- until I come up with a correct Makefile.am
-
- * camel/camel-store.h:
- * camel/camel-folder.h:
- correct declarations of structs
-
-
-1999-04-22 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/providers/MH/camel-mh-store.c:
- more test implementation.
-
- * camel/camel-store.c (camel_store_get_type): typo fix
-
-
-1999-04-21 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/providers/MH/camel-mh-folder.c (camel_mh_folder_get_type):
- start test provider.
-
-1999-04-20 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-store.h: now CamelStore inherits from
- CamelService.
-
- * camel/camel-service.c (camel_service_class_init):
- basic abstract service class.
-
-1999-04-19 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/README: added some (few) explanations.
-
-1999-04-18 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-store.[ch]: started implementation
- * camel/camel-folder.c (camel_folder_get_type): typo
- uncommented the store related code.
- (camel_folder_create): enable som store relted code.
- Not finished. Have to define public methods first.
-
- * camel/camel-log.h: some explanation about the
- log system
-
-1999-04-18 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder.c:
- (camel_folder_create): implemented (partially)
- have to write CamelStore before finishing it.
-
- * camel/camel-folder.h (CamelFolder): added full_name field
- (CamelFolderClass): added set/get_full_name methods
-
-1999-04-18 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * camel/camel-folder.c: some work
- * camel/camel-log.c: log system for camel
- * camel/gstring-util.c: some utilities for GString objects
-
-
-1999-04-18 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * autogen.sh (PKG_NAME): groomf -> gnome-mailer
-
diff --git a/HACKING b/HACKING
deleted file mode 100644
index ce31d66dac..0000000000
--- a/HACKING
+++ /dev/null
@@ -1,277 +0,0 @@
-
-1 Patch guidelines
-
-This section lists some guidelines for writing a good patch which is
-more likely to be accepted.
-
-Any new features or large scale work should first be discussed on the
-evolution-hackers list first. This will ensure the idea fits in the
-direction we wish to take Evolution, and also that the effort is not
-duplicated. See section 3 for details on the mailing lists.
-
-1.1 Patch basics
-
-o The patch should apply cleanly at the time it is made.
-
-o It must compile once applied.
-
-o It must not generate any more compile time warnings than were
- already there. This may be platform dependent so simply do your
- best.
-
-o It must conform to C89/C90 (ANSI/ISO C), and build with gcc using
- the default compile flags.
-
- The primary trap is that in C99 you may define variables anywhere in
- the code, in C89 they must be declared in a declaration block which
- follows any block start '{'.
-
- If you wish to ensure the code is C89, try the following.
-
- From the gcc manual page:
- "To select
- this standard in GCC, use one of the options `-ansi', `-std=c89' or
- `-std=iso9899:1990'; to obtain all the diagnostics required by the
- standard, you should also specify `-pedantic'" ...
-
- You may actually have to use '-std=gnu89' if libraries have taken
- advantage of gcc extensions and where not compiled similarly, as the
- above options will disable all gnu extensions.
-
- [FIXME: Add the same option for Forte here]
-
-o It should not add any extra debug printing by default, unless the
- patch is specifically to add extra debug printing.
-
-o It should not use any gcc extensions, except where they are properly
- checked for and not used with other compilers. glib provides some
- of these features as portable macros and should be used when they
- cover the required functionality.
-
-1.1 GUI changes
-
-If the change requires non-trivial user interface changes, then they
-will have to be discussed and approved on the evolution-hackers list
-first. This is highly recommended before embarking on any UI work, or
-large scale work in general. The Gnome HIG document is the place to
-start on any UI changes or additions.
-
-1.2 Translated string changes
-
-Any changes to translated strings in a stable release must be
-discussed on the hackers list (see section 3), and/or as part of the
-patch submission. There must be very good reasons for changing the
-strings in this case.
-
-1.3 Coding style
-
-Generally the coding style employed matches the "Linux Kernel" style,
-that is, basically K&R style indenting with 8 space tabs. Tabs should
-be used rather than space characters. Reformatting of otherwise
-unchanged code is not acceptable. Editors should have any automatic
-reformatting features disabled.
-
-K&R style indenting puts braces on the same line. The opening
-parenthesis of a function call or conditional statement should be on
-the same line as the function. "else" "} else" and "} else {" must
-always occur on lines by themselves.
-
-A single blank line should follow {} blocks (if not immediately
-followed by the close of another block), and conditional statements,
-and be used to separate logical groups of statements in the same
-block.
-
-A single blank line only should separate functions, and other
-structures at the top level of the file (i.e. outside functions). The
-same rule applies to variable declarations at the start of a block.
-
-An example of the most-developer-preferred formatting:
-
-TheType
-the_function (int frank)
-{
- int a = 1;
-
- if (a == frank) {
- a = foo (a);
- } else {
- do {
- a = bob (frank) + a;
- } until (a == frank);
-
- frank = a;
- }
-
- return (TheType) a;
-}
-
-Where there are slight stylistic differences, the style in the
-surrounding code should be followed.
-
-1.3.1 Object casts
-
-You can either use C style casts, or Gtk style casts. Note that Gtk
-style casts can add significant execution overhead, which is not
-adding any extra checking. e.g. if arguments have already been
-type-checked by preconditions. Putting a space between a cast and a
-variable is optional, but preferred by most of the developers.
-
-1.3.2 Preconditions
-
-External api entry points should have preconditions (g_return_if_fail,
-etc), although their use varies from case to case. Internal entry
-points and/or when you are guaranteed the type has already been
-checked, are unecessary. Object initialisation and other virtual
-method invocations are considered internal entry points.
-
-1.3.3 Line lengths
-
-Do not expend effort and resort to unreadable formatting merely to fit
-any long lines into 80 column widths. We use 8 space tabs, and
-because of the lack of namespacing other than extending the function
-name, many of the function and type names are too long for this to be
-practical. We now all uses high resolution displays, and not
-circa-80's VT100 terminals!
-
-On the other hand, lines should generally not exceed 100 characters,
-and absolutely not exceed 160 characters. If your tab nesting is too
-deep you probably have a poor design that needs rethinking.
-
-1.4 Design
-
-This is a tricky issue to document, but the design of new code should
-`fit' with the existing design of the relevent module. It should at
-the very least, be no worse.
-
-Code should not cross existing abstraction boundaries or attempt
-to remove or work around them, if required the existing design may
-need adjustment.
-
-Type and method names should follow the existing practice in the
-surrounding code. Method arguments should follow the same order as
-related methods, and should use the same names for matching
-parameters.
-
-Per file, static class globals are ok, true globals may be ok, but
-should be used sparingly. Use 'i' for a loop variable, if that's all
-it is, don't use 'the_current_index'. etc.
-
-If in doubt, ask on the lists.
-
-2. Patch submission guidelines
-
-This section outlines procedures that should be followed when
-submitting patches to evolution, via the evolution-patches mailing
-list.
-
-You must subcribe to the list at
-`http://lists.ximian.com/mailman/listinfo/evolution-patches' before you
-can submit patches to it.
-
-Also note that if you attach a patch to a bug report, it should always
-be sent to the list for attention.
-
-Any non-trival patches (patches of more than 1 or 2 changed lines in
-more than 5 isolated locations) also require copyright assignment.
-See http://developer.ximian.com/projects/evolution/copyright.html for
-details.
-
-If you follow the guidelines listed here, you should generally expect
-a response within 2 working days. If you re-send the same patch
-repeatedly, you will more likely receive less attention. Do not
-re-send the same patch repeatedly.
-
-2.1 Subject Lines
-
-If the patch addresses a specific bug in bugzilla.ximian.com, then the
-bug number must be included in the subject line, preferably near the
-beginning of the subject line. A concise summary of the bug(s) being
-addressed, should be the remainder of the subject.
-
-It is unnecessary to add "[PATCH]", "patch" or similar to the subject
-line, unless it is being cross-posted to other non-patch lists.
-
-It is absolutely unnecessary to add "please consider", "please review",
-or "seeking review", or similar, to the subject line. Please do not do
-this.
-
-Where the patch does not address a specific bug number, then the subject
-line should simply be a concise summary of the problem/feature it
-addresses.
-
-In all cases the subject line should include the module(s) to which the
-patch applies, and would generally match the component on the bug or
-the top-level module directory (e.g. camel, mail, addressbook, use 'all'
-for more than 3 or 4 modules).
-
-2.2 Message Body
-
-Patches should be attached as attachments, preferably as a single
-diff, when possible, and the changes are related. The diff must be in
-unified diff format, "-up" is a suitable argument to give to "cvs
-diff" (-p may be dropped if not supported by your diff). If you have
-added files, then -N should also be used, but if you are using cvs,
-"cvs add" is needed, and requires write access to the repository.
-
-If the patch does not address a specific bug, then the patch email
-should describe which feature or problem it addresses. If it does
-address a specific bug, then further explanation beyond the bug
-commentary is optional, although often convenient.
-
-It would also be helpful to summarise the module to which it applies
-in the message body.
-
-In all cases you should include which branch, or branches, the patch
-is intended to apply to. If this is not given it will be assumed to
-be the trunk (HEAD), and such patches will and must not be applied to
-any stable branch without further approval.
-
-2.3 ChangeLogs
-
-All patches must include appropriate ChangeLog diff's, to the
-appropriate ChangeLog(s) for the given change (emacs will automatically
-find the correct one, and format the entry appropriately). All but
-the most trivial of patches will not be considered or discussed
-without this. It is ok to contain extra ChangeLog entries for other
-pending patches, but they should not be excessively long - it isn't
-that hard to isolate patch diffs. If the patch addresses a bug in
-bugzilla.ximian.com, then the ChangeLog entry must include some
-reference to that bug number (either the number, or #number, or 'bug
-xxx'). If it addresses a bug in another bug system, it must also
-indicate which bug system ('gnome bugzilla' 'red-hat bugzilla', etc).
-
-2.4 Stable branches
-
-Generally, any patch to the stable branch from non-core developers
-must address a specific bug in bugzilla.ximian.com. The patch should
-also be attached to the bug in question, with the keyword 'patch' set
-on the bug report. The patch email must identify which stable branch
-and version it is to apply to.
-
-3 Mailing lists
-
-3.1 Evolution Hackers
-
-If you wish to discuss patches before they are submitted, or ideas
-before you start to work on them, do it on the evolution-hackers list,
-which may be subscribed and viewed at
-`http://lists.ximian.com/mailman/listinfo/evolution-hackers'.
-
-This is a low-volume list (5-10 posts per day on average).
-
-Some patches may be discussed here to get a wider audience, although
-once a patch has been made it should generally be discussed on
-evolution-patches.
-
-Feature requests, bug reports, and other user related discussions,
-without the intention to write code to address them, will be ignored.
-
-3.2 Evolution Patches
-
-The patch submission list evolution-patches may be subscribed and
-viewed at
-`http://lists.ximian.com/mailman/listinfo/evolution-patches'. Once a
-patch has been written, it may be submitted here for discussion, as
-well as final approval.
-
-Any non-patch related postings to this list will be ignored.
diff --git a/INSTALL b/INSTALL
deleted file mode 100644
index 54caf7c190..0000000000
--- a/INSTALL
+++ /dev/null
@@ -1,229 +0,0 @@
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
-Foundation, Inc.
-
- This file is free documentation; the Free Software Foundation gives
-unlimited permission to copy, distribute and modify it.
-
-Basic Installation
-==================
-
- These are generic installation instructions.
-
- The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation. It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions. Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
-
- It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring. (Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.)
-
- If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release. If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
-may remove or edit it.
-
- The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'. You only need
-`configure.ac' if you want to change it or regenerate `configure' using
-a newer version of `autoconf'.
-
-The simplest way to compile this package is:
-
- 1. `cd' to the directory containing the package's source code and type
- `./configure' to configure the package for your system. If you're
- using `csh' on an old version of System V, you might need to type
- `sh ./configure' instead to prevent `csh' from trying to execute
- `configure' itself.
-
- Running `configure' takes awhile. While running, it prints some
- messages telling which features it is checking for.
-
- 2. Type `make' to compile the package.
-
- 3. Optionally, type `make check' to run any self-tests that come with
- the package.
-
- 4. Type `make install' to install the programs and any data files and
- documentation.
-
- 5. You can remove the program binaries and object files from the
- source code directory by typing `make clean'. To also remove the
- files that `configure' created (so you can compile the package for
- a different kind of computer), type `make distclean'. There is
- also a `make maintainer-clean' target, but that is intended mainly
- for the package's developers. If you use it, you may have to get
- all sorts of other programs in order to regenerate files that came
- with the distribution.
-
-Compilers and Options
-=====================
-
- Some systems require unusual options for compilation or linking that
-the `configure' script does not know about. Run `./configure --help'
-for details on some of the pertinent environment variables.
-
- You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment. Here
-is an example:
-
- ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
-
- *Note Defining Variables::, for more details.
-
-Compiling For Multiple Architectures
-====================================
-
- You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory. To do this, you must use a version of `make' that
-supports the `VPATH' variable, such as GNU `make'. `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script. `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.
-
- If you have to use a `make' that does not support the `VPATH'
-variable, you have to compile the package for one architecture at a
-time in the source code directory. After you have installed the
-package for one architecture, use `make distclean' before reconfiguring
-for another architecture.
-
-Installation Names
-==================
-
- By default, `make install' will install the package's files in
-`/usr/local/bin', `/usr/local/man', etc. You can specify an
-installation prefix other than `/usr/local' by giving `configure' the
-option `--prefix=PATH'.
-
- You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files. If you
-give `configure' the option `--exec-prefix=PATH', the package will use
-PATH as the prefix for installing programs and libraries.
-Documentation and other data files will still use the regular prefix.
-
- In addition, if you use an unusual directory layout you can give
-options like `--bindir=PATH' to specify different values for particular
-kinds of files. Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.
-
- If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-Optional Features
-=================
-
- Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System). The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
- For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
-Specifying the System Type
-==========================
-
- There may be some features `configure' cannot figure out
-automatically, but needs to determine by the type of machine the package
-will run on. Usually, assuming the package is built to be run on the
-_same_ architectures, `configure' can figure that out, but if it prints
-a message saying it cannot guess the machine type, give it the
-`--build=TYPE' option. TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
-
- CPU-COMPANY-SYSTEM
-
-where SYSTEM can have one of these forms:
-
- OS KERNEL-OS
-
- See the file `config.sub' for the possible values of each field. If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the machine type.
-
- If you are _building_ compiler tools for cross-compiling, you should
-use the `--target=TYPE' option to select the type of system they will
-produce code for.
-
- If you want to _use_ a cross compiler, that generates code for a
-platform different from the build platform, you should specify the
-"host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
-
-Sharing Defaults
-================
-
- If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists. Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Defining Variables
-==================
-
- Variables not defined in a site shell script can be set in the
-environment passed to `configure'. However, some packages may run
-configure again during the build, and the customized values of these
-variables may be lost. In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'. For example:
-
- ./configure CC=/usr/local2/bin/gcc
-
-will cause the specified gcc to be used as the C compiler (unless it is
-overridden in the site shell script).
-
-`configure' Invocation
-======================
-
- `configure' recognizes the following options to control how it
-operates.
-
-`--help'
-`-h'
- Print a summary of the options to `configure', and exit.
-
-`--version'
-`-V'
- Print the version of Autoconf used to generate the `configure'
- script, and exit.
-
-`--cache-file=FILE'
- Enable the cache: use and save the results of the tests in FILE,
- traditionally `config.cache'. FILE defaults to `/dev/null' to
- disable caching.
-
-`--config-cache'
-`-C'
- Alias for `--cache-file=config.cache'.
-
-`--quiet'
-`--silent'
-`-q'
- Do not print messages saying which checks are being made. To
- suppress all normal output, redirect it to `/dev/null' (any error
- messages will still be shown).
-
-`--srcdir=DIR'
- Look for the package's source code in directory DIR. Usually
- `configure' can determine that directory automatically.
-
-`configure' also accepts some other, not widely useful, options. Run
-`configure --help' for more details.
-
diff --git a/MAINTAINERS b/MAINTAINERS
deleted file mode 100644
index 28ac3d699a..0000000000
--- a/MAINTAINERS
+++ /dev/null
@@ -1,23 +0,0 @@
-Overall Maintainers:
-JP Rosevear <jpr@novell.com>
-
-Mail:
-Jeff Steadfast <fejj@novell.com>
-Michael Zucchi <notzed@novell.com>
-
-Addressbook:
-Hans Petter Jansson <hpj@novell.com>
-Sivaiah Nallagatla <snallagatla@novell.com>
-
-Calendar
-Harish Krishnaswamy <kharish@novell.com>
-Rodrigo Moya <rodrigo@novell.com>
-
-Composer:
-Radek Doulik <rodo@novell.com>
-
-EPlugin:
-Michael Zucchi <notzed@novell.com>
-
-Documentation:
-Mark Moulder <mmoulder@novell.com> \ No newline at end of file
diff --git a/Makefile.am b/Makefile.am
deleted file mode 100644
index 9c3bd3f118..0000000000
--- a/Makefile.am
+++ /dev/null
@@ -1,71 +0,0 @@
-changelogs = \
- ChangeLog \
- ChangeLog.pre-1-4
-
-%-$(BASE_VERSION).pc: %.pc
- cp $< $@
-
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = \
- evolution-shell-$(BASE_VERSION).pc \
- evolution-plugin-$(BASE_VERSION).pc
-
-EXTRA_DIST = \
- AUTHORS \
- $(changelogs) \
- COPYING-DOCS \
- README \
- HACKING \
- MAINTAINERS \
- NEWS \
- NEWS-1.0 \
- marshal.mk \
- plugin.mk \
- server.mk \
- intltool-merge.in \
- intltool-update.in \
- intltool-extract.in \
- $(pkgconfig_DATA:-$(BASE_VERSION).pc=.pc.in)
-
-if ENABLE_SMIME
-SMIME_DIR=smime
-endif
-
-SUBDIRS = \
- data \
- e-util \
- a11y \
- widgets \
- shell \
- filter \
- $(SMIME_DIR) \
- addressbook \
- calendar \
- art \
- composer \
- mail \
- plugins \
- ui \
- views \
- tools \
- help \
- po
-
-
-# CDE Stuff
-
-if HAVE_DTAPPINTEGRATE
-
-# This installs Evolution into the Application Manager on CDE
-dtappintegrate:
- ( cd data && make dtappintegrate )
-
-# ...And this uninstalls it
-dtappunintegrate:
- ( cd data ; make dtappunintegrate )
-
-# Install/uninstall for CDE
-cde-install: install dtappintegrate
-cde-uninstall: dtappunintegrate uninstall
-
-endif
diff --git a/NEWS b/NEWS
deleted file mode 100644
index 236fd6c71a..0000000000
--- a/NEWS
+++ /dev/null
@@ -1,1469 +0,0 @@
-Evolution 2.1.4, 2004-01-24
-----------------------------
-
-Bugzilla bugs fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Mail
-
- #46287 - Space key should work for checkbox (JP)
- #57090 - Junk Button Sensitivity needs changes (Radek)
- #69122 - Make subject || sender contains the default search (Michael)
- #60664 - message view does not follow theme change (Michael)
- #55831 - missing warning dialog about opening a lot of selected mails (Michael)
- #66943 - Crash when saving draft (Michael)
- #70768 - 'Mark All as Read' marks all the mails which are not in current query as read (Michael)
- #71105 - When trying to rename a folder containing a slash "/" and spaces, evil stuff happens (Michael)
- #65178 - newly created folder on local maildir doesn't show until evolution restart (Michael)
- #71029 - receiving settings not stored (Michael)
- #70990 - NNTP without username broken (Michael)
- #70018 - Signatures don't work (Michael)
- #68352 - Add post message keybinding (Rodney)
-
- * Calendar
-
- #71407 - Input Protect Read-Only Calendars (Rodrigo)
- #65820 - Evolution Calendar weekday names message needs translator comment (JP)
-
- * Addressbook
-
- #70622 - crash (JP)
- #71448 - Deleting many contacts is incredibly slow (Siva)
- #41210 - spacing/padding of "Contact Quick Add" dialog (Rodney)
- #60852 - "Add address" popup dialog UI is ugly/wrong size, and button is resizable (Rodney)
- #41228 - spacing/padding of "duplicate contact detected" dialog (Rodney)
- #70922 - Email address types should show "Other" when importing vcards (Siva)
- #61973 - add TTYTDD translator comment (JP)
-
- * Plugins
-
- #71384 - 'Forward' button is disabled while configuring mail id (Sushma)
- #29985 - Accepted meetings should have a replied-to icon (JP)
-
- * Miscellaneous
-
- #46404 - not remembering printer definition (JP)
-
-Other bugs
-
- * Address Book
-
- - set full name appropriately when quick adding (Hans)
- - fix creation of local addressbooks (Siva)
- - a11y fixes (Hao Sheng)
-
- * Mail
-
- - Add items to folder properties correctly (Jeff)
- - Add async descriptions (Jeff)
-
- * Calendar
-
- - for detached instances, disable recurrence UI (Rodrigo)
- - use receive_objects for importing (Rodrigo)
- - change free/busy prefs title (Nat)
- - handle attachment errors better (Harish)
- - fix possible day view resize crash (Michael)
-
- * Shell
-
- - fix offline handler crash (JP)
- - close import wizard on Esc (Mengjie Yu)
-
- * S/MIME
-
- - don't remove tree node if deleting cert failed (Michael)
-
- * Plugins
-
- - Add addressbook file config plugin so local calendar get set up right (Siva)
- - In BBDB check the buddy account name not alias (Nat)
- - In weather calendar fix units spelling (David Trowbridge)
- - In weather calendar use single metric/imperial specification (David Trowbridge)
- - Add default source plugin so its easy to set for the user (Siva)
- - Make exchange account setup simpler (Sushma)
- - In groupwise account setup simplify the settings for soap only (Siva)
- - Add groupwise status tracking plugin so the user can see the information they requested (Chen)
- - In itip-formatter extract the decoded text so non-ascii works (JP)
- - In itip-formatter handle utc dtstart/dtend correctly (JP)
- - In new-mail-notify fix DBUS event handling (Miguel Angel Lopez Hernandez)
- - In groupwise sendoptions, make sure the global send options actually work (Chen)
- - In groupwise shared folder, improve UI (Vivek)
- - In groupwise shared folder, add a wizard for shared folder notifications (Vivek)
-
-Updated translations:
- - es (Francisco Javier F. Serrador)
- - de (Hendrik Richter, Frank Arnold)
- - it (Marco Ciampa)
- - nl (Vincent van Adrighem)
- - lt (Zygimantas Berucka)
- - nb (Kjartan Maraas)
- - no (Kjartan Maraas)
- - et (Priit Laes)
- - el (Nikos Charonitakis)
- - ja (Takeshi AIHANA)
- - en_CA (Adam Weinberger)
-
-Evolution 2.1.3, 2004-01-10
-----------------------------
-
-Bugzilla bugs fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Calendar
-
- #69663 - Task list on the web does not mark tasks as finished (JP)
- #61076 - Evolution calendar messages unnecessarily marked for translation (JP)
- #41624 - only the last exception is deleted on palm device (JP)
-
- * Addressbook
-
- #61068 - Extraneous space in evolution message (Andre Klapper)
- #61975 - Can't translate string "Reflow test" (JP)
-
- * Plugins
-
- #30992 - Preferences dialog greys out OK button after Apply (JP)
-
-Other bugs
-
- * Address Book
-
- - set read only state better for contact editor (Hans)
- - add UI for marking calendars offline (Siva)
- - use new name selector api (Hans)
-
- * Mail
-
- - Display icon for shared folder (Vivek)
- - New offline folder/store classes (Jeff)
- - Handle reply in mailto: (Michael)
- - a11y fixes (Mengjie Yu)
- - (Mengjie Yu)
-
- * Calendar
-
- - detached instance recurrence handling (Rodrigo)
- - calendar attachments (Harish)
- - send options for meeting (Chen)
- - handle calendar:// uris (JP)
- - handle different calendars having the same uid (Rodrigo)
- - add UI for marking calendars offline (Chen)
- - use new name selector API (Hans)
- - prevent crash when searching for f/b info (JP)
- - a11y fixes (Harry)
- - calendar config cleanup (JP)
-
- * Shell
-
- - Make component buttons configurable (JP)
- - Set offline with gconf key (Siva)
-
- * Plugins
-
- - add component.migration event for calendar (David Trowbridge)
- - fix translations of popup menus (Michael)
- - HIG config dialog fixes (Rodney)
- - Add calendar file config plugin so local calendar get set up right (JP)
- - Add calendar weather config plugin (David Trowbridge)
- - Add exchange account config plugin (Sushma)
- - Add groupwise send options plugin (Partha)
- - Add itip formatter plugin (JP)
- - Add new-mail-notify plugin that uses DBUS (Miguel Angel Lopez Hernandez)
- - Use standard error messages in save-calendar plugin (Philip Van Hoof)
- - Add send options plugin for account editor (Chen)
- - Add shared folder notification plugin (vivek)
-
-Updated translations:
- - lt (Zygimantas Berucka)
- - ja (Takeshi AIHANA)
- - bg (Vladimir Petkov, Alexander Shopov)
- - et (Priit Laes, Ivar Smolin)
-
-Evolution 2.1.2, 2004-12-20
-----------------------------
-
-Bugzilla bugs fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Mail
-
- #68759 - Evolution Shell can't load modules (JP)
- #69579 - Moving a message from an IMAP INBOX to an IMAP folder caused crash (Michael)
- #69339 - postscript and some other attachments not visable (Michael)
- #69579 - vFolders#UNMATCHED generates errors (Michael)
- #68958 - current message forgotten in vfolders (Michael)
- #69446 - Mail shown as attachment if some headers are upper case (Michael)
- #46229 - Filters dialog - label suggestions (Diego Sevilla Ruiz)
-
- * Calendar
-
- #47535 - Snooze Time "minutes" string Improperly marked for translation
- (Rodney)
- #67403 - wrong alarm time displayed (Rodrigo)
-
- * Shell
-
- #61065 - Evolution should be spelled with uppercase E in evolution message (Joan Sanfeliu)
-
-Other bugs
-
- * Address Book
-
- - Turkish locale fixes (S. Caglar Onur)
- - Set proper window title for editing addressbook properties (Vivek)
- - Prevent null UID from causing weird saving problems (Siva)
- - a11y fixes (Harry Lu, Hao Sheng)
-
- * Mail
-
- - Add mnemonics everywhere (Mengjie Yu)
- - Moving a message from an IMAP INBOX to an IMAP folder caused crash (Radek)
-
- * Calendar
-
- - let users set a template for fetching free/busy information (James
- Bowes)
- - Set proper window title for editing calendar/task properties (Vivek)
- - Leak fixes (Harish)
- - Fix 64 bit problem (David Mosberger)
- - UI Fixes for meetings and assigned tasks (Chen)
-
- * Shell
-
- - fix 64 bit problem (David Mosberger)
- - use new window icon (Rodney)
-
- * Plugins
-
- - make plugin hooks available for mail even when the mailer is not
- activated (Michael)
- - move groupwise config code to a plugin (Siva)
- - support csv and rdf calendar saving (Philip Van Hoof)
-
-Updated translations:
-
- - nl (Vincent van Adrighem)
- - sv (Christian Rose)
- - ca (Jordi Mallach)
- - zh_CN (Funda Wang)
- - bg (Alexander Shopov)
- - fi (Ilkka Tuohela)
- - da (Martin Willemoes Hansen)
- - tr (Baris Cicek)
- - lt (Zygimantas Berucka)
- - cy (Dafydd Harries)
-
-Evolution 2.1.1, 2004-11-28
-----------------------------
-
-Bugzilla bugs fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Addressbook
-
- #28725 - should not say "no items in this view" until the backend is done responding (Sushma)
- #61065 - Evolution should be spelled with uppercase E in evolution message (Joan Sanfeliu)
- #61976 - Near-identical strings, should be made identical (Rodney)
- #67656 - almost the same email address are considrered identical (Siva)
- #61966 - Typo in string: Word "be" missing (Andre Klapper)
- #69079 - Data repeated after save with bad date format (Siva)
- #66854 - Some strings are missed to translation (partial, Rodney)
-
- * Mail
-
- #68787 - Crash when migrating 1.4 data to 2.0.2 (Michael)
- #69109 - EHLO or HELO with ip addresses does not conform rfc 821 (Michael)
- #69408 - Evolution hang in message fetching with ima4rev1 (Jeff)
- #69145 - toplevel message/rfc822 parts are broken for IMAP (Michael)
- #69241 - base64 attachement holding PGP block (Jeff)
- #69160 - IMAP4 dont freez on scaning imap folders (Jeff)
- #67496 - html email not rendered in preview pane (Michael)
-
- * Calendar
-
- #68624 - Requires URL to have http:// or webcal:// at beginning (Diego Sevilla Ruiz)
- #47529 - Date in reminder window appears in UTF-8 in non-UTF-8 locale (Rodney)
- #6767 - Fix hardcode colors in day, week, month views (Li Yuan)
- #68707 - Events ending at 12:00 AM show as ending at 12:00 pm (JP)
-
- * Shell
-
- #61065 - Evolution should be spelled with uppercase E in evolution message (Joan Sanfeliu)
-
-Other bugs
-
- * Address Book
-
- - Handle required fields (Siva)
- - a11y fixes (Hao Sheng)
- - make shift-F10 popup menu (Hao Sheng)
- - don't show error dialog when cancelling operation (Siva)
-
- * Mail
-
- - Reduce memory for vfolder operations (Michael)
- - Use unix sockets for spam checking (Radek)
-
- * Calendar
-
- - warn is summary is blank (Chen)
- - allow creating new calendar with right click on a group (Harish)
- - EConfigize new calendar and calendar properties (David Trowbridge)
- - make sure switch between 12/24h time shows immediately (JP)
-
- * Plugins
-
- - set "base" plugin target (Michael)
- - add webcal config plugin (David Trowbridge)
- - mailing list actions plugin (Meilof Venningen)
- - plugin manager plugin (Michael)
-
-Updated translations:
-
- - da (Martin Willemoes Hansen)
- - lt (Žygimantas BeruÄka)
- - nl (Vincent van Adrighem)
- - de (Hendrik Richter)
- - it (Marco Ciampa)
- - ca (Jordi Mallach)
- - fa (Meelad Zakaria)
- - sq (Laurent Dhima)
- - fr (Sebastien Bacher)
- - cs (Juraj Kubelka)
-
-Evolution 2.1.0, 2004-11-01
-----------------------------
-
-Bugzilla bugs fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Addressbook
-
- #61069 - Missing space in evolution addressbook message (Andre Klapper)
- #61972 - Typo in country name: Is "Grena-dines", should be "Grenadines" (Andre Klapper)
-
- * Mail
-
- #68894 - IMAP4 rev1, error on selecting INBOX (Jeff)
- #68814 - evo crash while fetching mail using IMAP4 rev1 (Jeff)
- #44876 - Missing keyboard navigation in the e-mail recipient section (Mengjie Yu)
-
-Other bugs
-
- * Address Book
-
- - Display multi value attributes in the preview (Nat)
-
- * Mail
-
- - Enable IMAP4 camel provider by default (Jeff)
- - IMAP4 offline folder info caching (Jeff)
-
- * Calendar
-
- - a11y fixes (Li Yuan)
- - make free/busy information gathering more efficient (Harish)
-
- * Shell
-
- - remove deprecated calls (Kjartan Maraas)
-
- * Plugins
-
- - convert mail, address book to econfig (Zucchi)
- - convert all components to e-menu (Zucchi)
- - add new mail event (Zucchi)
- - add message replied event (Nat/Zucchi)
- - add online/offline event (Zucchi)
- - inline audio via gstreamer (Radek)
- - big brother database (Nat)
- - copy address tool (Zucchi)
- - folder unsubscribe (Jeff)
- - mail to task (Rodrigo)
- - mark calendar for offline (Harish)
- - prefer plain text for messages (Zucchi)
- - save attachments (Zucchi)
- - save calendar (Rodrigo)
- - select one calendar/task (JP)
- - subject threading (JP/Zucchi)
-
-Updated translations:
-
- - da (Martin Willemoes Hansen)
- - it (Marco Ciampa)
- - sq (Laurent Dhima)
- - el (Nikos Charonitakis)
- - ms (Hasbullah Bin Pit)
- - bg (Vladimir Petkov)
-
-Evolution 2.0.2, 2004-10-11
-----------------------------
-
-Bugzilla bugs fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Addressbook
-
- #66520 - Crash deleting addressbooks (Michael)
- #66369 - VCard import requires blank lines between contacts (Hans)
- #65537 - Updating Contacts Causes Crash (Hans)
-
- * Calendar
-
- #65932 - Crash when accessing the details of an appointment notification (Rodrigo)
- #64683 - meeting invite expands to larger than workspace (Rodrigo and JP)
- #66736 - crash clicking Search Clear button twice (Michael)
- #61766 - select personal calendar/tasks by default when migrating (JP)
- #65599 - 'Evolution 1.5' crash in 'Free/Busy' editor (Rodrigo)
- #62053 - select GroupWise calendar by default (Siva)
- #66164 - popup date edit drop down in correct place (JP)
- #45951 - Scroll properly in task description (Rodrigo)
-
- * Mail
-
- #67170 - Unable to subscribe to the alt hierarchy (Michael)
- #67028 - 2.0.1 compilation fails on camel-service.c: In function `camel_getaddrinfo' (Jeff)
- #67257 - evolution busy waits looking up hostname if network down (Michael)
- #66509 - Evolution Crashes when deleteing a news group (Michael)
- #65828 - Fix typo in error message (Jeff)
- #63881 - "Cannot copy or move messages into a Virtual Folder" when
- dragging from UNMATCHED vfolder into real folder (Ed Catmur)
- #63521 - stale / bogus pop cache file (Michael)
- #66991 - crash creating folders (Michael)
- #66706 - Evolution Crashes while refreshing Folder Subscriptions (Michael)
- #67408 - Seg Fault on exit (Michael)
- #67211 - Evolution crashes when getting summary from folder (Michael)
- #66703 - S/MIME signing fails randomly (Jeff)
-
- * Shell
-
- #61285 - use better query for config pages (Michael)
- #66216 - don't show translator-credits directly in about box (Malcolm Treddinnick)
-
-Other bugs
-
- * Address Book
-
- - Crash when exiting (Hans)
-
- * Mail
-
- - Provide error dialogs if host/name lookups fail (Jeff)
- - Improve NNTP locking (Michael)
- - Work with complete MBox hierarchy (Michael)
- - Forward as inline sends attachments (Michael)
- - Fix possible migration bug from 1.2 (Dave Malcolm)
-
- * Other
-
- - Updated documentation (Rodney and Novell Doc Team)
- - Don't dereference NULL nickname or emailAddr on certificate (Michael)
-
-Updated translations:
-
- - el (ta panta rei, Nikos Charonitakis)
- - ja (Takeshi AIHANA)
- - hu (Laszlo Dvornik)
- - pt (Duarte Loreto)
- - sq (Laurent Dhima)
- - es (Francisco Javier F. Serrador)
- - nl (Vincent van Adrighem, Michel Klijmij)
- - en_CA (Adam Weinberger)
- - zh_CN (Funda Wang)
- - cs (Miloslav Trmac)
- - pl (GNOME PL Team)
- - pt_BR (Raphael Higino)
- - sr (Danilo Segan)
- - sr@Latn (Danilo Segan)
- - en_GB (David Lodge)
- - ca (Xavier Conde Rueda)
- - ko (Changwoo Ryu)
- - ro (Mugurel Tudor)
- - fr (Christophe Merlet)
- - nb (Kjartan Maraas)
- - no (Kjartan Maraas)
- - da (Martin Willemoes Hansen)
- - ru (Leonid Kanter)
- - fa (Meelad Zakaria)
-
-Evolution 2.0.1, 2004-09-24
-----------------------------
-
-Bugzilla bugs fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Addressbook
-
- #61070 - Fix improper grammar (hannah rebekah & fazlu huq)
- #59725 - Conduit syncing to wrong desktop record (JP)
- #63191 - Fix contact list editor title (JP)
- #64080 - addressbook gui component needs to be linked with libcamel (Michael)
- #64024 - Lower pane doesn't go away when you uncheck "Preview Pane" in Contacts (Siva)
- #64011 - Remove C99-ism (Vicent Noel)
- #62856 - in --offline mode, still get prompted for gw addressbook password, work around (Michael)
-
- * Calendar
-
- #66344 - Evolution crashes added start time column to tasks (JP)
- #63513 - G/W appointment acceptance fails ('invalid object') (Chen)
- #60904 - Show all appointments when work week longer than 5 days (JP)
- #66158 - Completion status is not displayed immediately (JP)
- #59194 - Crash editing location field in event list (JP)
- #65682 - get error deleting appointments (Chen)
- #55172 - sync montly recurrences properly (JP)
- #62374 - alarms no function if run over night (Rodrigo)
- #62728 - week day heading in month view does not update after changing week start day in settings (JP)
- #62392 - Crash on close alarm notification (Rodrigo)
-
- * Mail
-
- #65329 - translate standar folder names (Michael)
- #65058 - Specific mails don't display picture but picture data (Michael)
- #64972 - signature auto-selection in composer with Maildir account is broken (Michael)
- #65448 - Opening a mail does not mark it read (Jeff)
- #64974 - Allow selecting of file or folder for maildir and mh accounts (Jeff)
- #65703 - Display reply to all icon (JP)
- #59717 - crash checking supported authentication types (Michael)
- #47821 - try all host names available when connecting (Michael)
- #66199 - Image loading fails with authenticated proxy (Michael)
- #64023 - Forget NNTP password if it was wrong (Michael)
- #64092 - Ambiguity in nomenclature of GW Tasks in Evolution (Siva)
-
- * Shell
-
- #61285 - use better query for config pages (Michael)
- #66216 - don't show translator-credits directly in about box (Malcolm Treddinnick)
-
-Other bugs
-
- * Addressbook
-
- - point to correct documentation file (Rodney)
- - check for LABEL supported (Siva)
-
- * Calendar
-
- - Don't allow deletion of system calendar or tasks (JP)
- - Don't allow a task to be changed to an assigned task if the backend doesn't support it (Chen)
-
- * Mail
-
- - Fix typo setting the root node in folder tree (Dave Malcolm)
- - Handle 0 length token read for summary (Michael)
- - Make SSL connections async and cancellable (Michael)
-
-Updated translations:
- - fr (Christophe Merlet, Craig Jeffares)
- - pl (Artur Flinta)
- - sq (Laurent Dhima)
- - cs (Miloslav Trmac)
- - es (Francisco Javier F. Serrador)
- - nl (Vincent van Adrighem)
- - zh_CN (Funda Wang)
- - en_CA (Adam Weinberger)
- - it (Craig Jeffares)
- - zh_TW (Craig Jeffares)
- - en_GB (Gareth Owen)
- - fa (Roozbeh Pournader)
- - el (Nikos Charonitakis)
- - ja (Takeshi AIHANA)
- - pt_BR (Raphael Higino)
- - da (Martin Willemoes Hansen)
- - ko (Changwoo Ryu)
- - nn (Åsmund Skjæveland)
- - sr (Danilo Segan)
- - hu (Laszlo Dvornik)
- - bs Danilo Segan
- - id (Mohammad DAMT)
- - nb (Sigurd Gartmann)
- - no (Sigurd Gartmann)
- - ar (Arafat Medini))
-
-Evolution 2.0.0, 2004-09-13
-----------------------------
-
-Bugzilla bugs fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Addressbook
-
- #59582 - Contact incompletely updated to LDAP store, address information lost/not editable (Siva)
- #64084 - addressbook gui component needs to be linked with libcamel (Michael)
-
- * Calendar
-
- #65454 - Evolution crashes while opening newly received e-mail (JP)
- #62392 - Crash on close alarm notification (Rodrigo)
- #64800 - broken timezone selector (Rodney)
-
- * Mail
-
- #60515 - signature setting is not preserved changing "Autogenerated" to "None" (Michael)
- #63377 - Crash when replying to a (specific) message (Jeff)
- #62665 - Wrong Folder is deleted (Jeff)
- #64377 - crash creating new folder (Michael)
- #63456 - crash replying to E-mail (Michael)
-
-Other bugs
-
- * Addressbook
-
- - Confirmation dialog was showing up on contact-editor close,
- even if there were no changes (Hans Petter)
-
- * Calendar
-
- - 64 bit build fix (Rodrigo)
-
- * Misc
-
- - new documentation (Rodney)
-
-Updated translations:
-
- - ar (Arafat Medini)
- - bn (Runa Bhattacharjee)
- - cs (Miloslav Trmac)
- - cy (Dafydd Harries, Telsa Gwynne)
- - da (Martin Willemoes Hansen)
- - de (Hendrik Richter)
- - el (Nikos Charonitakis)
- - en_CA (Adam Weinberger)
- - en_GB (David Lodge)
- - es (Francisco Javier F. Serrador)
- - et (Priit Laes)
- - fi (Ilkka Tuohela)
- - hi (Rajesh Ranjan)
- - hu (Laszlo Dvornik)
- - id (Mohammad DAMT)
- - ja (Takeshi AIHANA)
- - ko (Changwoo Ryu)
- - ms (Hasbullah Bin Pit)
- - nb (Sigurd Gartmann)
- - nl (Vincent van Adrighem)
- - nn (Åsmund Skjæveland)
- - no (Kjartan Maraas)
- - pl (Artur Flinta)
- - pt (Duarte Loreto)
- - pt_BR (Raphael Higino)
- - ro (Mugurel Tudor)
- - ru (Leonid Kanter)
- - sq (Laurent Dhima)
- - sr (Danilo Segan)
- - sv (Christian Rose)
- - tr (Baris Cicek)
- - uk (Maxim Dziumanenko)
- - zh_CN (Funda Wang)
- - zh_TW (Abel Cheung)
-
-Evolution 1.5.94, 2004-08-27
-----------------------------
-
-Bugzilla bugs fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Addressbook
-
- #61833 - Blank names in name selector (Hans Petter)
- #62715 - Free-form addresses not loading in contact editor (Hans Petter)
-
- * Calendar
-
- #62869 - Crash: attempt to access GW tasks from evolution (Siva)
- #62706 - Changing time-zone doesn't refresh calendar correctly (JP)
- #62063 - Meeting description does not wrap (Jeff)
- #58824 - Stray message or failing to open tasks? (Rodrigo)
- #62911 - ITIP control blocks mailer opening calendar (JP)
- #54101 - In itip control had "Birthdays & Anniversaries" as calendar (JP)
-
- * Mail
-
- #63189 - Deleting IMAP folders is too aggressive (Michael)
- #63504 - Don't send IMAP commands to a disconnected socket (Jeff)
- #63177 - Can't drag folder to "On This Computer" (Jeff)
- #62812 - Crash when parent of search window is closed (Jeff)
- #62963 - C99-isms in smime/gui/cert-trust-dialog.c (Michael)
-
-Other bugs
-
- * Addressbook
-
- - Confirmation dialog was showing up on contact-editor close,
- even if there were no changes (Hans Petter)
-
- * Calendar
-
- - Fixed problems in alarm daemon (JP, Siva, Rodrigo)
- - Clean up of stray status messages for tasks (Chen)
- - Don't remove GtkDialog's separator if using GTK >= 2.4.0 (Frederic)
- - Fix copy/move problems when pilot syncing (JP)
- - Don't mark menu accels for translation (Christian)
-
- * Mail
-
- - Crash in em-utils on GtkFileChooser with no name selected (Hans Petter)
-
- * Misc
-
- - avoid warnings on dialogs with GTK 2.4 (Frederic)
- - upgrade egg tray icon (Rodrigo)
- - fix memory corruption when pilot syncing tasks/events (JP)
-
-
-Evolution 1.4.1, 2003-06-25
----------------------------
-
-Bugzilla bugs fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Addressbook
-
- #41826 - Focus the first minicard when focusing the view for the
- first time (gilbert.fang@sun.com)
- #43841 - Contact editor will not save Web Page address (Toshok)
- #44477 - Make sure the master category list is upgraded (Toshok)
-
- * Calendar
-
- #41582 - Display incorrect after switching between week and day
- view (Rodrigo)
- #43585 - Ugly tasks printout (Hans Petter)
- #45273 - Tab through events in day view (Bolian Yin)
- #45275 - Shift+F10 to activate Popup menu in ToDo List (Bolian Yin)
- #45423 - Provide shortcus for "Go to today" and "Go to date" (Bolian Yin)
-
- * Mail
-
- #22542 - Creating a folder in the vFolder store fails with a
- meaningless message (Michael)
- #31745 - Cannot view mails under '#mh' namespace. Temporary
- workaround, strip #'s (Michael)
- #33593 - Message remains displayed after last message removed from
- list (Michael)
- #40788 - Broken POP3 server causing evolution to hang/crash (Jeff)
- #42630 - collapsed thread always shows as unread (Jeff)
- #43917 - ECharsetPicker doesn't save user-specified charset strings
- properly (Jeff)
- #43972 - Invert selection doesn't work (Jeff)
- #43974 - Cannot retrieve "Local Delivery" mail (Michael)
- #44121 - Invalid multipart/signed message showing empty (Michael)
- #44139 - Composer spacing is not HIG compliant (Jeff)
- #44322 - Evolution crash with weird IMAP foldername (Michael)
- #44344 - Dont use quoted-printable encoding on anything but text/*
- parts, interoperation with Lookout and others (Jeff)
- #44457 - Crash viewing video content as inline-text (Jeff)
- #44519 - Popup message view redraws when new mail arrives (Michael)
- #44609 - HIG issue with vFolder properties editor (Michael)
- #44991 - Cannot send mail in GB-2312 (Jeff)
- #45082 - GB18030 BIG5HKSCS and EUC-TW charsets not supported in
- evolution mail (suresh.chandrasekharan@sun.com)
- #45063 - Message display refreshes when new mail arrives,
- introducted by #33593 (Michael)
- #45386 - Warnings when sending mail (Michael)
- #45368 - Crash when closing the folder browser
-
- * Summary
-
- #44111 - Crash on exit (Ettore)
- #44798 - Crash when closing print preview dialog (Ettore)
-
- * All
-
- #42691 - Build, make clean doesn't rebuild bonobo-activation
- .server files (Michael)
- #44717 - Tarball cointains generated files (Frederic Crozat)
-
-Other bugs
-
- * Calendar
-
- - Fix invalid shared use of list of calendar factories (Rodrigo)
- - Make the calendar editor window title reflect the summary contents (Rodrigo)
-
- * Mail
-
- - Fix bug in indexer string normalisation (they weren't) (Larry)
- - Major memory leak in message-threading (Larry)
- - Only try to snoop a content-type if its application/octet-stream
- when displaying mail parts (Jeff)
- - Major memory leak in filter-file based filters (Jeff)
- - Try to make asynchronous dns lookup more asynchronously
- cancellable (Michael)
- - Fix a degenerate algorithm case in vFolder shutdown which could
- cause excessive exit cpu usage (Michael)
-
- * Shell
-
- - Wrong version number used for configuration upgrade (Michael)
-
- * All
-
- - Lots of miscellaneous memory leaks
-
-Updated translations:
-
- - cs (Miloslav Trmac, Stanislav Brabec)
- - el (Kostas Papadimas)
- - es (Francisco Javier F. Serrador)
- - hu (Andras Timar)
- - it (Marco Ciampa)
- - ko (Kan Jeong-Hee)
- - mk (Ivan Stojmirov)
- - nl (Vincent van Adrighem)
- - pt_BR (Gustavo Maciel Dias Vieira)
- - sr, sr@Latn (prevod.org)
- - sv (Christian Rose)
- - tr (Gorkem Cetin)
- - zh_CN (Wang Li, Funda Wang)
-
-
-Evolution 1.4, 2003-06-02
--------------------------
-
-Bugzilla bugs fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Calendar
-
- #43388 - Problems importing appointments (Rodrigo)
- #43455 - Crash on exit (Rodrigo)
- #43763 - 2 right mouse menus appear in Week & Month views (Rodrigo)
- #43775 - Crash under Chinese locale (JP)
-
- * Mail
-
- #42854 - Copying files from one IMAP folder to another makes
- multiple copies of file (Jeff)
- #43862 - First run imap account won't load folders until account
- is disabled and re-enabled (Jeff, Michael)
- #42691 - Server files not regenerated after distclean (Michael)
- #43805 - Evolution locked while editing reply to an mail (Jeff)
- #43410 - Flag for Followup dialog opens up too small in Evo (Michael)
- #43688 - Can't save signatures (Michael)
-
- * Summary
-
- #43506 - Spontaneous crash (Ettore)
-
- * Misc
-
- #43596 - Symlink icon file so it doesn't break existing panel
- setups (Ettore)
-
-Other bugs fixed:
-
- * Addressbook
-
- - Removed conflicting shortcut for the Print Preview menu item
- (Rodney)
-
- * Misc
-
- - Corrected some problems in the pkgconfig files (Rodney)
- - Fixed an issue with GConf schema file installation (Joe Marcus
- Clarke)
-
-Updated translations:
-
- - nl (Vincent van Adrighem)
- - ru (GNOME Russian Team)
- - be (GNOME Belarusian Team)
- - es (Francisco Javier F. Serrador)
-
-
-Evolution 1.3.92, 2003-05-22
-----------------------------
-
-Bugzilla bugs fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Addressbook
-
- #38084 - Rename local folder issue in contacts (sean.gao@sun.com)
- #41130 - HIG compliance (Anna)
- #41137 - HIG compliance (Anna)
- #41140 - HIG compliance (Anna)
- #41144 - Use stock buttons in the ldap config page (Toshok)
- #41211 - Add icon to "Add" button in "Add to Contacts" dialog (Toshok)
- #41229 - HIG compliance (Anna)
- #41231 - HIG compliance (Anna)
- #41232 - HIG compliance (Anna)
- #41245 - HIG compliance (Toshok)
- #41248 - HIG compliance (Anna)
- #41249 - HIG compliance (Anna)
- #41250 - HIG compliance (Anna)
- #41251 - HIG compliance (Anna)
- #41254 - HIG compliance (Anna)
- #41255 - Use stock Add/Remove icons in the contact list editor (Toshok)
- #41910 - Crash when deleting addresses from long contact lists (Toshok)
- #42048 - "Print" not hooked up in etable view (Toshok)
- #42177 - Cannot tab out of date edit widgets in contact editor (Toshok)
- #42472 - Selecting a field in a contact highlights entire row (Toshok)
- #42596 - Selecting text in a contact address field selects all
- rows of text (Toshok)
- #42604 - Display not shifted when cursor moved to next address
- line (Toshok)
- #42606 - Not saving information entered in Notes field of Contact
- editor (Toshok)
- #42620 - Crash related to mailing address checkbox (Toshok)
- #42625 - Clicking in white space of contact brings up empty
- contact editor (Toshok)
- #42780 - Crash on solaris due to missing NULL in g_guild_filename.
- (sean.gao@sun.com)
- #42825 - clicking on letters in LDAP address card view does not
- load selected letter (Dan, Toshok)
- #43005 - Crash on reply (Toshok)
- #43016 - Crash when adding duplicate contact (Toshok)
- #43023 - All contacts have disappeared (Toshok)
- #43090 - GalView menu missing from the addressbook (Toshok)
- #43175 - Evolution crashed pasting large amount of text into
- address field (Toshok)
- #43213 - auto-completion folder list wasn't populated correctly on
- fresh install (Toshok)
-
- * Calendar
-
- #40972 - connector crashed while evolution was idle (Rodrigo)
- #41234 - button order of "Enter Delegate" dialog (Rodrigo)
- #41329 - Changing Options in scheduling tab causes display time to shift
- #41579 - Double clicked on meeting in Exchange calendar, Evo
- crashed (Rodrigo)
- #41760 - Alarm dialog does not reappear after snoozing Exchange
- alarm (Rodrigo)
- #41811 - Calendar update failing and crashing (JP)
- #41930 - Warning while running gdb includes: "Some clown returned
- undeclared exception" (JP)
- #41935 - day view ignores scroll wheel (JP)
- #42056 - Accelerators in meeting selector not working/looks bad
- (Hans Petter)
- #42220 - calendar not refreshing correctly after changing meeting
- times (Rodrigo)
- #43029 - When running under valgrind Evolution crashed while
- exiting (JP)
- #43308 - scheduling page alignment (JP)
-
- * Mail
-
- #40074 - Thread expansion state not remembered (Jeff)
- #41748 - Send/Recv not sending mail in connector Outbox (Michael)
- #42000 - Crash selecting a non-selectable folder (Michael)
- #42045 - Another workaround for mailers sending out invalid date
- formats (Jeff)
- #42118 - Edit->Mark as unread doesn't behave the same as right
- click->mark as unread (Jeff)
- #42170 - Thread expansion state lost on deleting messages (Jeff)
- #42212 - Crash entering address in composer (Rodrigo)
- #42294 - Custom fixed font setting not applying to composer
- (Michael)
- #42333 - Crash opening a mail again that was still being opened
- (Jeff)
- #42356 - Adding colour from not working properly (Jeff)
- #42456 - Spelling preferences Enable/Disable button inconsisency
- (Michael)
- #42540 - Crash when pressing send/recv too quickly (Michael)
- #42710 - Invalid 8 bit header data getting to the UI layer
- generating warnings (Michael)
- #42763 - Crash deleting local folder with indexing turned off
- (Jeff)
- #42838 - Crash setting up local mail account (Michael)
- #42854 - Copying many messages between IMAP folders results in
- several duplicates (Jeff)
- #43214 - changing server settings enables the account (Jeff)
- #43234 - crash reading mail (Michael)
- #42748 - Check spelling while I type - broken (Larry)
- #42749 - Composer ignores color for misspelled words (Larry)
- #43392 - Reproducible crash after searching mail w/ attachment and
- closing (Jeff)
- #43406 - Evo crashed during POP download/filtering (Jeff)
-
- * Shell
-
- #36956 - Window title too long (Ettore)
- #40391 - Updated contributor list in the about box (Michael)
- #42038 - Crash hitting escape or closing window on rename box
- (Michael, Ettore)
- #42342 - Send/receive sensitive when startedi in offline mode
- (Ettore)
- #42465 - Unread count problem in the shortcut bar (Ettore)
- #42491 - Compilation problems on Forte (Antonio Xu)
- #42518 - Folder bar selection lost on folder delete (Ettore)
- #43079 - Don't crash when an invalid "default:" URI is given on
- the command-line (Ettore)
- #43119 - Memory corruption problem in settings dialog (Ettore)
- #43216 - Crash on exit (Ettore)
- #43322 - Crash on exit (Ettore)
-
- * Summary
-
- #41131 - HIG compliance (Anna)
- #41133 - HIG compliance (Anna)
- #41849 - Charsets not respected in news feed display (Michael)
- #43101 - Crash on exit (JP)
- #43117 - Crash on exit (Ettore)
-
-Other bugs:
-
- * Addressbook
-
- - 64bit cleanup and warning fixes (Jeremy Katz)
- - Fixed some probable memory corruption (Toshok, Sean Gao)
-
- * Calendar
-
- - Fixed crash in cal_client_discard_alarm (Rodrigo)
- - Fixed Bonobo unrefing problems on components (JP)
- - Fixed multiple initialization in calendar factory (Rodrigo)
-
- * Mail
-
- - Crash on exit if password dialog was open (Ettore)
- - Make Ok the default response on the password dialog (Ettore)
- - Crash in SMTP if unable to resolve the remote host name (Jeff)
- - Fix an automake 1.6 issues with camel-lock-helper (Dan)
- - Reload page if citation color changes (Larry)
- - Made all the composer preferences work (Larry)
- - Made newly created HTML signatures work again (Radek)
-
- * Shell
-
- - HIGified config settings dialog a bit more (Anna)
- - Fixed a bunch of reference count problems (JP)
- - Improved the look of the "open other user's folder" dialog
- (Dan)
-
- * Summary
-
- - Fixed a typo that caused the summary to not see the default
- calendar folder (Ettore)
- - Made the print dialog close properly (Ettore)
- - Reference count fixes (JP)
-
- * All
-
- - Various container referencing issues (JPR)
- - 64 bit and portability fixups (Jeremy Katz)
- - Cleaned up lots of compile time warnings and run-time debugging
- output (everyone)
-
-Updated translations:
-
- - cs (Miloslav Trmac)
- - da (Kenneth Rode Christiansen)
- - de (Christian Neumair)
- - es (Francisco Javier Fernandez)
- - fr (Christophe Fergeau)
- - it (Marco Ciampa)
- - ja (Takuo Kitame)
- - no (Kjartan Maraas)
- - pt (Duarte Loreto)
- - pt_BR (Gustavo Maciel Das Vieira)
- - ru (GNOME Russian Team)
- - sv (Christian Rose, Anders Carlsson)
-
- - Fixed encoding of the ca, en_AU, en_CB, et, eu, ro catalogs (Abel
- Cheung)
-
-
-Evolution 1.3.3, 2003-04-29
----------------------------
-
-Bugzilla bugs fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Addressbook
-
- #37351 - Contact List drag-n-drop broken from sorted list view (Toshok)
- #40954 - Wombat crashes when opening an appointment (Toshok)
- #41843 - Don't use localized field names in the csv exporter (Gilbert Fang)
- #41779 - Fix crash when adding emails to existing contacts (Toshok)
-
- * Calendar
-
- #21499 - No docs in snaps (Rodney)
- #22444 - Deleting recurring meetings menu option (Rodrigo)
- #34498 - alarm-notify not noticing meetings canceled by organizer (Rodrigo)
- #35814 - same mnemonic for File:New:Mail Message and :Meeting (Rodney)
- #37552 - GUI doesn't notice Connector failed to delete task (JP)
- #39735 - Calendar View settings not persistent between sessions (JP)
- #40257 - selecting day from calendar control causes window resize (JP)
- #41129, #41215, #41221, #41256, #41148, #41216, #41235 - gui spacing (Rodrigo, Anna)
- #41230 - forwarded tasks blank when viewed in a separate window (JP)
- #41458 - Crash sending meeting invite (Dan)
- #41459 - remove "Delegate to..." from right click menu in meeting dialog (JP)
- #41641 - crash opening calendar for the first time (Hans)
- #41661 - Only one popup dialog for repeated message alarm (Rodrigo)
- #41671 - audio alarms pop up message dialog instead of playing tune (Rodrigo)
-
- * Mail
-
- #21499 - No docs in snaps (Rodney)
- #38927 - Signature editor help brings up composer help
- #40694 - Focus not in To field of new message when From field is
- visible. (Toshok)
- #40989 - Deleted sub-folders hang around (Michael)
- #41043 - Send/receive accelerators broken (Michael)
- #41142 - Message search dialog has questionable button order (Jeff)
- #41149 - Spacing/padding of "Filters" dialog (Jeff)
- #41150 - Use stock buttons in "Filters" dialog (Jeff)
- #41151 - Spacing/padding of "Add/Edit Filters" window (Jeff)
- #41152 - Spacing/padding of "Vfolders" dialog (Jeff)
- #41153 - Use stock buttons in "VFolders" window (Jeff)
- #41155 - Spacing/padding in "Add/Edit Vfolders" dialog (Jeff)
- #41156 - Use stock** buttons in "add/edit vfolders" dialog (Jeff)
- #41163 - Forwarding HTML mail with inline images results in
- misformatted mail (Michael)
- #41164 - Can't import mails at all (Michael)
- #41190 - Crash cursor navigating Inbox (Michael)
- #41199 - Subscribe dialog's toolbar -- why? :) (Michael)
- #41205 - Use icons on Add/Edit/Delete buttons in "Search Editor" (Jeff)
- #41208 - Spacing/padding in "advanced search" dialog (Jeff)
- #41209 - Spacing/padding of "Create VFolder from Search" dialog (Jeff)
- #41238 - Crash when opening "attachment properties" (Jeff)
- #41239 - Spacing/padding of "attachment properties" (Jeff)
- #41241 - Title capitalisation of "Attachment Properties" (Jeff)
- #41244 - Spacing/padding of "Reformat Mailbox" dialog (Jeff)
- #41389 - Crash creating new Exchange acct (Jeff)
- #41398 - vFolder Sources IMAP folder names not being unencoded
- correctly (Michael)
- #41419 - Variable font key has trailing slash (katzj@redhat.com)
- #41448 - Crash on startup (Michael)
- #41461 - camel_text_to_html doesn't do as good a job with URLs as
- e_text_to_html (Jeff)
- #41513 - Plain text attachments not showing up in the composer (Jeff)
- #41578 - Up/down buttons broken in vfolder list (Jeff)
- #41648 - 1.2 -> 1.3 vfolder conversion (Michael)
- #41730 - Empty "Organization" headers (Jeff)
- #41789 - Bonobo components can pause/freeze the gui (Jeff)
- #41972 - Searching on labels is broken (Michael)
- #42024 - Improper use of Error dialog (Jeff)
-
- * Shell
-
- #21499 - Documentation not working in the snapshots (Rodney)
- #33919 - Crash when opening other user's folder (Dan)
- #41002 - Default folder bar size too narrow (Ettore)
- #41008 - HIG compliance (Anna)
- #41010 - HIG compliance (Anna)
- #41022 - HIG compliance (Anna)
- #41024 - HIG compliance (Anna)
- #41025 - HIG compliance (Anna)
- #41036 - HIG compliance (Anna)
- #41059 - Crash connecting to other user's folder (Ettore)
- #41013 - Startup wizard display problems (Michael)
- #41128 - HIG compliance (Anna)
- #41145 - HIG compliance (Anna)
- #41146 - HIG compliance (Anna)
- #41147 - HIG compliance (Anna)
- #41225 - HIG compliance (Anna)
- #41227 - HIG compliance (Anna)
- #41242 - HIG compliance (Anna)
- #41304 - Missing dialog title (Michael)
- #41392 - HIG compliance (Anna)
- #41413 - Creating folder needs to make sure parent folder is
- expanded (Dan)
- #41468 - New Exchange public folders do not follow type of parent
- folder (Dan)
- #41469 - Upgrade routine crashing on Solaris (Jeff)
- #41484 - Make proxies work (Sanshao Jiang)
- #41567 - HIG compliance (Anna)
- #41569 - HIG compliance (Anna)
- #41648 - Vfolder upgrade problem (Michael)
- #41916 - Memory corruption in Storage interface (Rodrigo)
-
- * Summary
-
- #39693 - Summary weather settings annoyances (Ettore)
- #40902 - HIG compliance (Ettore)
-
-Other bugs:
-
- * Addressbook
-
- - Mostly, if not completely, fixed 33708 (Dan, Toshok)
- - Fix duplicate entry in exported CSV (Gilbert Fang)
- - Use stock buttons (Rodney)
-
- * Misc
-
- - Made Solaris/CDE integration work again (Rodney)
- - Removed some debugging spewage (everyone)
- - Don't crash on malformed GConf folder settings (Toshok)
- - Don't error out if the directory already exists when creating a
- new folder (Ettore)
- - Fixed various memory leaks all over the place (Hans)
-
-Updated translations:
-
- - cs (Miloslav Trmac)
- - de (Christian Neumair)
- - es (Francisco Javier Fernandez)
- - it (Marco Ciampa)
- - nl (Vincent van Adrighem)
- - no (Kjartan Maraas)
- - pt (Duarte Loreto)
- - sv (Christian Rose)
- - zh_CN (Wang Jian)
-
-
-Evolution 1.3.2, 2003-04-11
----------------------------
-
-Bugzilla bugs fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Addressbook
-
- #7103 - Addressbook doesn't play nice with dark themes. (Toshok)
- #19178 - importers only target default contact folder. (Toshok)
- #20210 - Cannot save changes when invoked from mailer. (Toshok)
- #23036 - Export Contact Data to CSV, XLS, etc. (for mail merge,
- etc.) (Gilbert Fang)
- #25148 - Selected contacts fields are not scrolling properly.
- (Toshok)
- #31786 - LDAP config dialog not properly internationalized.
- (Toshok)
- #32113 - Problem with UTF8 and contact list. (Toshok)
- #34085 - drag+drop not finalizing. (Toshok)
- #34651 - Searches with 8bit ascii char. not working in Select
- Contacts. (Toshok)
- #37204 - Ximian, Inc. contact info update. (Michael)
- #38202 - Evolution crashed when I clicked the send button. (Michael)
- #39170 - void function should not has a 'return' keyword. (Philip
- Zhao)
- #39256 - "Forward Contact", "Send Message to Contact" don't
- work. (Michael)
- #39381 - crash when adding an address from an email to addressbook.
- (Toshok)
- #39507 - Select-names search broken. (Toshok)
- #39730 - Search Base Callback Not Working. (Toshok).
- #39763 - Pasting text into "To:" field doesn't work. (Toshok)
- #39788 - Can't add email address to contact. (Toshok)
- #40026 - Using pulldown to view multiple emails changes email to
- random characters. (Toshok)
- #40046 - To: and Cc: fields not accepting accented letters.
- (Toshok)
- #40403 - can't edit contact lists. (Toshok)
- #40715 - Merge email address dialog non functional when adding
- contact that already exists. . (Toshok)
- #40727 - email autocompletion not listing all names. (Toshok)
- #40841 - Ctrl-v was being used for both "Save As VCard" and
- "Paste". (Toshok)
- #40901 - HIG-ify the LDAP server editor dialog's button
- layout. (Toshok)
-
- * Calendar
-
- #17231 - Private settings not retained. (JP)
- #31382 - Free/busy retrieval didn't work for http source. (Rodrigo)
- #31660 - Appointments with "for" recurrence synced with no end date.
- (JP)
- #32248 - Todo items imported from pilot have time set to 00:00. (JP)
- #34095 - Memory leaks. (Hans Petter)
- #34505 - Duplicate alarm dialogs for appts in exchange calendar.
- (Rodrigo)
- #35926 - Contacts entry in appointment editor to be removed.
- (Hans Petter, Dan)
- #37935 - Drawing problems in mini-calendar. (Hans Petter)
- #39262 - Crash when importing an ics file to local calendar. (Rodrigo)
- #39356 - New evo users didn't get calendar. (Rodrigo)
- #39692 - File type names should not be OAF component types. (Ettore)
- #39735 - View settings not persistent between sessions. (Jeff)
- #39736 - Times in day view too large. (Hans Petter)
- #39740 - Crash clicking in Attendees field when creating new
- meeting. (Rodrigo)
- #39757 - Couldn't delete reminder for appointment. (Hans Petter)
- #39770 - Not meeting request sent. (Rodrigo)
- #39803 - Bottom part of text cut off in month view. (Hans Petter)
- #39895 - Selection vanishes when day view loses focus. (Michael/Hans)
- #39954 - Crash when setting recurrence rule for an appointment.
- (Hans Petter)
- #39955 - Crash when forwarding an appointment as icalendar. (JP)
- #39961 - Appointment schedule autopick menu displays under File.
- (Rodrigo)
- #40133 - wombat startup error. (Toshok)
- #40195 - Cannot create new calendar folders (JP)
- #40252 - LOG(e...) syntax error (Michael)
- #40258 - Recurring event displayed truncated description. (Hans Petter)
- #40578 - Event summaries cut off in month view. (Hans Petter)
- #40655 - Mini-calendar always showed January 1970. (Hans Petter)
- #40661 - Missing header for Forte compilation. (Rodrigo)
- #40722 - Crash when closing a meeting. (JP)
- #40789 - Didn't remember reminder text. (JP)
- #40790 - Didn't launch programs added as reminders. (JP)
- #40792 - Buttons in Select File dialog for sound reminder didn't
- work. (Ettore)
- #40876 - Cannot create a meeting with a resource in Exchange
- calendar (JP)
- #40894 - calendar switching weeks selected in small right subcalendars
- (JP)
- #41127 - Evolution crashed when sending new meeting invitation (JP)
-
- * Mail
-
- #29564 - Message list loses focus when you expunge. (Michael)
- #33786 - Crash when invalid expression fed to vFolder. (Michael)
- #36245 - Translation string context problem. (Dan)
- #37084 - Mailer forgets message list pane size on startup.
- (Michael)
- #38227 - Button spacing issues. (Ettore)
- #38461 - Mail importers cannot import to non-local folders.
- (Michael)
- #38659 - RFC2047 word encoding errors. (Jeff)
- #38926 - Configuration dialogs overlap each other. (Ettore, Jeff)
- #39165 - Losing all vFolder rules after editing them, until
- restart. (Michael)
- #39168 - compiler compatability, empty structs. (Jeff)
- #39170 - Compiler compatibility, returning a void return value.
- (Jeff)
- #39173 - prototype mismatch. (Jeff)
- #39204 - Charset handling problems with broken mails. (Jeff)
- #39256 - Send message to contact/forward contact doesn't work.
- (Michael)
- #39325 - Allow user to enable/disable account from account list.
- (Jeff)
- #39382 - Signature editor dialog buttons messed up. (Jeff)
- #39464 - Trying to remove a duplicate vfolder crashes. (Michael)
- #39486 - Cancelling send/receive could cause a crash. (Michael)
- #39654 - vFolder source remove button doesn't work. (Jeff)
- #39696 - Default composer window title is meaningless. (Jeff)
- #39741 - Configuration dialogs overlap each other. (Ettore, Jeff)
- #39744 - Sending 8 bit mime to a smtp server which doesn't say it
- supports it. (Jeff)
- #39759 - Crash using search dialog. (Michael)
- #39800 - Make To: have focus on a new message. (Jeff)
- #39809 - Dialog's don't match gnome 2 layout. (Jeff)
- #39813 - Crash/noop adding signature script. (Jeff)
- #39870 - Message browser button sensitivity not correct. (Jeff)
- #39914 - Configuration dialogs overlap each other. (Ettore, Jeff)
- #39924, and many others - Subject entry box didn't work
- properly/support i18n very well. (Jeff)
- #40043 - A warning dialog wont go away. (Jeff)
- #40074 - Threads always open expanded. (Jeff)
- #40083 - Search box doesn't work on subscription dialog - it was
- removed. (Jeff)
- #40103 - Deadlock at startup. (Michael)
- #40124 - Cannot unsubscribe from folders that aren't selectable.
- (Jeff)
- #40188 - Context menu on addresses crashes. (Michael)
- #40300 - Files are only detected for recovery when you start an
- editor. (Michael)
- #40314 - Some folders not expandable in subscriptions dialog.
- (Jeff)
- #40472 - Crash after entering password. (Michael)
- #40522 - Two passphrase dialogues viewing encrypted mail. (Michael)
- #40536 - Send/receive dialogue should transient for parent.
- (Michael)
- #40608 - Crash saving attachment. (Jeff)
- #40679 - Composer crash browsing files to attach. (Jeff)
- #40728 - Crash while scrolling. (Jeff)
- #40764 - Composer backs up drafts too often. (Jeff)
- #40778 - incorrect IMAP BODY parsing/display (Jeff)
- #40900 - vfolder creation dialog has wrong button order. (Michael)
- #40904 - Spontaneous crash. (Jeff)
- #40921 - Cancel subscription dialogue while busy -> crash. (Michael)
- #41004 - HIG compliance. (Jeff)
-
- * Shell
-
- #17034 - Use UTF-8 in about box. (Michael)
- #34371 - Tries to open other user's folder with blank user field.
- (Ettore)
- #38775 - Version number hardcoded in warning dialog text. (Michael)
- #38974 - Xlib dependency causing linking error on Solaris. (Ettore)
- #39096 - Start-up crash on Solaris. (Ettore)
- #39467 - Crash when splash image not found. (Michael)
- #39599 - Crash when folder icons missing. (Ettore)
- #39692 - OAFIIDs being shown in the importer dialog. (Ettore)
- #39706 - Settings window too big. (Michael)
- #40377 - Old stale wombat servers not being killed. (Ettore)
- #40413 - Problem with closing the folder selector dialog. (Ettore)
- #40474 - Summary settings not imported from 1.2. (Michael)
- #40590 - Signature settings upgrade problem. (Michael)
- #40652 - Folder bar not resizing after resizing Evolution window.
- (Michael)
- #40748 - Cannot resize icons in the shortcut bar. (Ettore)
- #40854 - Problem with selecting other user's folder. (Dan)
- #40888 - Crash when selecting other user's folder. (Dan)
-
- * Summary
-
- #5344 - Missing weather locations. (Marten Woxberg)
- #7153 - Stock folder names not translated. (Ettore)
- #12066 - Missing weather locations. (Dan)
- #15740 - Missing weather locations. (Dan)
- #18015 - Missing weather locations. (Dan)
- #19957 - AM/PM setting not being honoured. (Ettore)
- #40358 - Summary page not showing properly in non-C locales.
- (Ettore)
- #40141 - Preferences settings inconsistency when clicking "Close".
- (Michael)
- #32027 - Missing locations. (Dan)
-
-Other bugs:
-
- * Addressbook
-
- - HIG'ify the e-address-popup's buttons layout. (Toshok)
- - Add input method support to the minicard view. (Toshok)
- - Make the minicard view listen for style changes. (Toshok)
- - Fix the select names component to be more friendly to non-shlib
- components. (Dan)
- - Fix various errors in the contact editor caused by parsing
- addresses when we don't need to - especially after the user has
- explicitly entered the elements of the address
- themselves. (Toshok)
- - Replace GtkImage based arrow buttons in the contact editor with
- GtkArrow. (Toshok)
-
- * Calendar
-
- - Replaced all references to GdkFont deprecatedness with Pango.
- (Hans Petter)
- - Alarm notification fixes. (Rodrigo)
- - Timezone dialog fix. (Dan)
- - Use weak refs instead of destroy signal. (Rodrigo, Hans Petter)
- - Use GtkMessageDialogs for meeting-related questions. (Rodrigo)
- - GtkObject -> GObject fixes. (Everyone)
- - Connector-related fixes. (Dan)
- - Made meeting/scheduling work correctly. (JP)
- - Only remove alarms for backends that request it (Rodrigo)
- - HIG'ify dialogs (Ettore)
-
- * Mail
-
- - Clear passwords didn't work. (Michael)
- - Show preview and view threaded were made per-folder, as in
- 1.2.x, 1.3.1 had them global. (Michael)
- - Make the printing dialog, and account editor transient for the
- parent. (Larry, Jeff)
- - Check for unique filter/vFolder names in all cases. (Michael)
- - Most warnings removed. (Jeff, Michael)
- - some text/plain mails detected as text/html, re-do the fix for
- #16817 to make it pickier. (Michael)
- - Imap buffer overflow potential. (Timo Sirainen)
- - GSSAPI SASL support. (Jeff)
- - Handle broken header charset checking similarly to badly
- labelled/broken body content. (Dan)
- - Various glib deprecation issues, and use non-locale specific
- string compares in various places. (Jeff, Michael)
- - Mail piped to the sendmail transport is canoncalised into Un*x
- format, using network format (CRLF) confuses some versions of
- postfix. (Jeff)
- - Some work on fixing cut and paste shortcuts in composer. (Jeff)
- - Made the EvolutionComposer corba interfaces work again/port to
- GNOME 2. (Michael)
-
- * Shell
-
- - Fixed some problems with the folder dialogs. (Dan)
- - Fixed shell .server files. (Dan)
- - Added --force-shutdown to the shell as a killev replacement.
- (Dan)
- - Make Evolution use large WM icons. (Ettore)
- - Made the offline dialog work again. (Ettore)
- - Fixed importer framework to support non-local folders. (Ettore)
-
- * Summary
-
- - Make creation of the summary settings page faster. (Dan)
-
- * All
-
- - A number of compiler portability fixes, varadic macro's,
- __FUNCTION__ -> G_GNUC_FUNCTION, inline usage, void returns, etc
- (Everyone)
- - Fixed druid colors. (Dan)
-
-
-
-Evolution 1.3.1, 2003-03-05
----------------------------
-
-First release based on GNOME 2.
diff --git a/NEWS-1.0 b/NEWS-1.0
deleted file mode 100644
index b3e5fc7e57..0000000000
--- a/NEWS-1.0
+++ /dev/null
@@ -1,2939 +0,0 @@
-Evolution 1.0.8, 2002-06-23
----------------------------
-
-Bugzilla Bugs Fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Addressbook
-
- #17332 -- Addressbook crashes in LDAP address completion code.
- (Toshok)
- #26130 -- Close contact editor before save as crashes. (Toshok)
-
- * Calendar
-
- #25757 -- Fix quoting of icalendar properties (JP)
- #25829, #25830, #26066
- -- Fix a number of meeting usability and interop issues (JP)
- #25697 -- Exchange reminders still not quite working (Rodrigo)
-
-Other fixes:
-
- * Addressbook
-
- - Some memory leak fixes in the addressbook backends and
- libversit. (Toshok)
-
- * Calendar
-
- - Update time zone information (Damon)
-
-Updated translations:
-
- - sk (Stanislav Visnovsky)
- - sv (Christian Rose)
-
-
-Evolution 1.0.7, 2002-06-07
----------------------------
-
-Bugzilla Bugs Fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Addressbook
-
- #25054 -- "New Contact List" button is no longer active in
- folders that don't support contact lists. (Toshok)
-
- * Calendar
-
- #16962 -- Make the schedule page use the work hours set in the
- preferences. (JP)
- #23350 -- Crash when refreshing meeting or task. (JP)
- #24783 -- Fix crash in wombat. (Rodrigo)
-
- * Mail
-
- #11391 -- Bogus gnome_vfs_file_info_unref() that caused an
- occasional crash. (Frederic Crozat)
- #15185 -- Non-RFC-compliant From/To/Cc being displayed as empty
- in mail display. (Dan)
- #19920 -- Messages hiding in threaded view. (Michael)
- #21604 -- Various crashes. (Michael)
- #23782 -- Stop button causes a hang. (Michael)
- #25056 -- wombat segfaults when scrolling around calendar in month view
- (Rodrigo)
- #25456 -- Crash when deleting an account that has not been added
- to the Evolution storage yet. (Jeff)
- #24615 -- VFolders with the UNMATCHED vfolder as a source hang.
- (Michael)
-
- * Shell
-
- #24284 -- Copyright notice inconsistent in the about box.
- (Ettore)
-
-Other fixes:
-
- * Misc
-
- - Fixed some typos in the names of some French locations.
- (Christophe Merlet)
-
-Updated translations:
-
- - et (GNOME ET Team)
- - eu (Josu Waliño)
- - sk (Stanislav Visnovsky)
- - fr (Christophe Merlet)
- - fi (Sami Pesonen)
- - vi (pclouds)
-
-
-Evolution 1.0.5, 2002-05-06
----------------------------
-
-Bugzilla Bugs Fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Mail
-
- #24140 -- Crash when downloading a message with invalid header.
- (Jeff)
-
- #17174 -- Mail spools appear to be unread forever. (Michael)
-
- * Shell
-
- #23538 -- Intermittent bug when moving folders around. (Michael)
-
-Other fixes:
-
- * Calendar
-
- - Make reminders work with remote backends. (Rodrigo)
-
- * Misc
-
- - Added support for adding an Evolution icon to the CDE
- Application Manager. (Ettore)
-
-Updated translations:
-
- - bg (Borislav Aleksandrov)
- - pl (GNOME PL Team)
-
-
-Evolution 1.0.4, 2002-04-18
----------------------------
-
-Bugzilla Bugs Fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Addressbook
-
- #22965 -- Comply with RFC 2739 for calCalURI and calFBURL. (Toshok)
-
- * Calendar
-
- #22624 -- Unable to accept meeting request that doesn't list user
- as attendee. (JP)
-
- * Startup Wizard
-
- #22047 -- Crash after closing the start-up wizard. (Ettore)
-
- * Mail
-
- #8214 -- "Error Synchronizing Folder" on incoming mail spool.
- (Michael)
- #18929 -- If we get multiple Content-Type header values, change
- subsequent headers to X-Invalid-Content-Type so it doesn't
- wreck processing. (Michael)
- #22363 -- Problems resyncing IMAP folders when going Online. (Jeff)
- #21716 -- Fixes to decoding illegally rfc2047 encoded words. (Michael)
- #22657 -- Fixes printing for some localizations (Radek)
-
-
-Other fixes:
-
- * Calendar
-
- - Use default tasks folder in calendar view. (Rodrigo)
- - Added getQuery method to CalBackend to allow custom queries for
- each calendar backend. (Rodrigo)
-
- * Mail
-
- - Fixed Daylight-Savings-Time calculations on systems that use
- tm.tm_gmtoff rather than 'timezone' (affects BSD systems). (Jeff)
- - Fixed the annoying EINPROGRESS error dialogs when connecting
- to IMAP/SMTP/POP via SSL. (Jeff)
- - Changed the date format used in From-lines in mbox spools to be
- the same as those used by Pine to fix interoperability issues.
- (Michael)
- - Fixed some filtertypes.xml typos. (Michael)
-
- * Summary
-
- - Change the dot.kde.org url.
-
-Updated translations:
-
- - fi (Sami Pesonen)
- - fr (Christophe Merlet, Frederic Riss)
- - ko (Young-Ho Cha)
- - nl (Tino Meinen)
- - no (Kjartan Maraas)
- - pt_BR (Gustavo Maciel Dias Vieira)
-
-
-Evolution 1.0.3, 2002-03-19
----------------------------
-
-Bugzilla Bugs Fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Addressbook
-
- #16097 -- Need a way to let the user specify the DN to
- authenticate against. (Toshok)
- #16680 -- LDAP performance problem. (Toshok)
- #16968 -- Changing search type immediately requeries. (Toshok)
- #20089 -- Cannot copy contacts with comma from "Contacts" to LDAP.
- (Toshok)
- #20690 -- LDAP contacts dont show when using letter shortcuts.
- (Toshok)
- #20740 -- LDAP performance problem. (Toshok)
- #20871 -- SelectNames dialog needs search feedback. (Toshok)
-
- * Calendar
-
- #14705 -- iMIP compatibility with versions of Outlook. (Better fix
- for the pseudo-fix in 1.0.1). We now support Outlook in
- both Workgroup and Internet-Only modes. (Dan)
- #19054 -- Minimum number of alarm repetitions should be
- 1. (Federico)
- #19234 -- BYMONTH off-by-one in RRULE:FREQ=YEARLY. (Damon)
- #20510 -- Load free busy info as attendees are added. (JP)
- #20022 -- Itip addresses are case sensitive. (JP)
- #20226 -- Timezone data missing from some itip replies. (JP)
- #20346 -- Calendar should indicate if backend dies. (Rodrigo)
- #20780 -- Better subjects in iMIP messages. (Dan)
- #20787 -- Accepted/declined messages aren't always clear. (JP)
- #20800 -- Sorting of free busy information in schedule page does
- not work. (JP)
- #20783 -- Accepting updated meeting request doesn't work. (Rodrigo)
- #21198 -- Outlook didn't recognize Evolution's acceptance of an
- updated meeting request. (Dan)
- #21240 -- Calendar Reminders don't appear for appointments in remote
- servers. (Rodrigo)
-
- * Mail
-
- #19564 -- Don't crash when changing to disconnected mode. (Michael)
- #20779 -- Set a 'name' parameter in the Content-Type header
- since Outlook doesn't seem to check the filename
- parameter on the Content-Disposition header. (Jeff)
-
- * Shell
-
- #20234 -- Deleting folder gratuitiously causes /local to open.
- (Ettore)
- #20237 -- Shell silently drops xfer errors. (Ettore)
- #20311 -- New window from shortcuts should not show the folder
- bar and the shortcut bar. (Ettore)
-
- * Summary
-
- #18025 -- Summary crash upon switching to offline mode. (Ettore)
-
-Other fixes:
-
- * Calendar
-
- - Show more descriptive messages on opening errors. (Rodrigo)
- - Remove $filename.ics from remote URIs. (Rodrigo)
-
- * Addressbook
-
- - Fix search weirdness in local addressbooks. (Toshok)
- - Let backends return general error status from load_uri instead
- of just TRUE/FALSE. (Toshok)
- - EBook(View) handling fixes in ESelectNames and
- EAddressbookModel. (Clahey)
- - Rethink (and change) some of the default queries to ones that
- are at the same time useful and more easily implemented
- efficiently by the backends, in both the component's view and in
- the select-names dialog. (Toshok)
- - Change the "beginswith" query implementation on the name field
- to search both first and last name, so it's a little more useful
- in the general case. (Toshok)
-
-Updated translations:
-
- - es (Carlos Perelló Marín)
- - fr (Christophe Merlet)
- - jp (Akira TAGOH)
- - nl (Vincent van Adrighem)
- - nn (Roy-Magne Mo)
- - no (Kjartan Maraas)
- - pt_BR (Gustavo Maciel Dias Vieira)
-
-
-Evolution 1.0.2, 2002-01-24
----------------------------
-
-Bugzilla Bugs Fixed (see http://bugzilla.ximian.com/show_bug.cgi):
-
- * Addressbook
-
- #17725 -- Non-ASCII letter headings are black when printing
- (Zbigniew Chyla)
-
- * Calendar
-
- #6544 -- Make Timezone names translatable (Damon)
- #18801 -- Alarms with specific trigger times are not shown (Damon)
-
- * Importers
-
- #16864 -- LDIF importer chokes on long description field (Toshok)
- #17441 -- Crash trying to import VCards file into an LDAP folder
- (Ettore)
-
- * Mail
-
- #6896 -- message_list_select() with wraparound won't select very
- first message (Jeff)
- #11499 -- All recovered Composer windows have HTML enabled (Jeff)
- #16947 -- Crash while setting up a new mail account (Jeff)
- #17205 -- Crash of evolution-mail on start-up (Jeff)
- #17634 -- Marking a message as unread should undelete it, as well
- (Jeff)
- #17694 -- Exchange 5.5 reporting 2 messages as having the same UID
- breaks Evolution (Jeff)
- #17759 -- Cancelling Send/Receive can lose mail for local case
- (Jeff)
- #18142 -- Mailer crash when trying to send an email (Jeff)
-
-Other fixes:
-
- * Summary
-
- - Change the list of items in the mail preferences (Iain)
-
- * Calendar
-
- - Make Tasks default to public as in Outlook (Rodrigo)
-
- * Importers
-
- - Make the druid as a transient window for the main shell (Iain)
-
- * Mail
-
- - Follow symlinks for mbox files (Jeff)
- - Fixed copy/paste problems in mail-account-gui.c (Ian Goldberg,
- Jeff)
- - Make Vfolders work with add-on storages (Dan)
-
- * Shell
-
- - Don't crash on missing icon on start-up (Michael Meeks)
- - Change activation/deactivation order for views in order to
- reduce flicker in the toolbars (Michael Meeks)
-
-Updated translations:
-
- - bg (Alexander Shopov)
- - el (Nick Niktaris, Panayotis Pakos, Simos Xenitellis)
- - fr (Christophe Merlet)
- - hu (Andras Timar)
- - it (Clara Tattoni, Ettore)
- - lv (Peteris Krisjanis)
- - nn (Roy-Magne Mo)
- - no (Kjartan Maraas)
- - sk (Stanislav Visnovsky)
- - sv (Christian Rose)
-
-
-Evolution 1.0.1, 2001-12-18
----------------------------
-
-New features:
-
- * csv2vcard script to convert CSV addressbook files from Outlook
- into VCard files that the Evolution importer can understand (by
- Michael MacDonald).
-
- * Alarms are now properly synced in the calendar conduit.
-
-Bugs fixed:
-
- * Addressbook
-
- #10114 -- No icon for Delete in the New Contact List editor
- #10241 -- Occasional address completion flakiness
- #10910 -- "Save" in list editor vs. "Save and Close" in contact editor
- #11776 -- Email addresses are case sensitive
- #13751 -- AddressBook address entry form usability problem
- #14002 -- Select names dialog stays up after composer is closed
- #14074 -- Editing fields under the "Collaboration" LDAP contact
- #14715 -- Wombat gets locked up when LDAP server is down
- #14876 -- Modifying LDAP contacts destroys existing objectclass entries
- #15379 -- Printing from the addressbook totally broken
- #16156 -- "Save As", "Send As", "Send To" not available in list editor
- #16176 -- Tab order starts wrong
- #16510 -- Small contact editor fixes
- #16744 -- Crash
- #16852 -- Crash closing empty mail
- #16910 -- Crashed addressbook when selecting addresses
- #17109 -- Crashed when editing a contact
- #17126 -- Adding some addresses does not work
-
- * Calendar
-
- #7641 -- Crash in EMap widget when used in Evolution
- #8993 -- Attendees not stripped properly from itip replies
- #13843 -- Deleting tasks causes crash
- #13952 -- Notifier repeatedly gives alarm after appointment ended
- #14087 -- Daily repeat event with end-date misses one day
- #14489 -- UI bug in Calendar Settings
- #14699 -- gtk_signal_disconnect_by_data warning
- #14705 -- iMIP compatibility with versions of Outlook. (We now support
- Outlook in an Exchange environment by default, but the old
- behavior can be turned on with the environment variable
- EVOLUTION_SEND_IMIP_AS_ATTACHMENT. This will be fixed better
- later.)
- #15401 -- Use UTF-8-aware gnome-print calls
- #15456 -- Typo in translatable string
- #15774 -- Crashed by selecting "decline" in meeting request
- #15941 -- Location missing for the calendar
- #15749 -- Empty end time in all-day-event crashes calendar.
- #15774 -- Selecting decline in schedule meeting request makes evo crash
- #15798 -- Calendar Date Never Updates
- #16232 -- e-itip-control.c - init() doing odd stuff
- #16359 -- Calendar Crash
- #16460 -- Changing a meeting doesn't always offer to send an update
- #16571 -- Weird URI in meeting request email
- #16910 -- Crashed when entering a completion percentage
- #16224 -- remove unsupported columns from Tasks view
- #16880 -- Cannot import ical (ics) even its own
- #17344 -- iCalendar should not be translated
- #17526 -- Refreshing request does not show relevant information
- #17527 -- Refresh requests have wrong menu
- #17531 -- libical does not build with bison 1.30
- #17606 -- libical does not build with autoconf 2.52
- (none) -- Scheduling page did not accurately display no information range
-
- * Conduits
-
- #1183 -- Handle alarms in conduits
- #14452 -- Converting names wrong from Palm
- #15810 -- Crashed during EAddress sync
- #15922 -- Crash
- #16460 -- Changing a meeting doesn't always offer to send an
- update
- #16997 -- Pilot compilation with libiconv
- #17230 -- Custom data on Pilot being over written
-
- * Importers
-
- #14701 -- Importing locks up Evolution
-
- * Mail
-
- #2233 -- Don't show RTF attachments inline
- #5547 -- Crash: Error closing a HTML-mail
- #12062 -- Can't use 'n' to skip to next unread if multiple messages
- are selected
- #13898 -- Crash: Cannot create emails in evolution
- #14127 -- Wrong error message
- #14348 -- Some things that need open messages...
- #14517 -- "Clear" needed twice for non-body+subject searches
- #14662 -- GPG signature showing as attachment
- #14678 -- Timestamp on outgoing mail incorrect on FreeBSD
- #14734 -- Evolution-mail crashes while accessing imap servers
- #14770 -- Appending messages to other IMAP folder can cause INBOX to
- stop updating
- #14838 -- Saving passwords doesn't work
- #14848 -- Forwarding wrong email due to next/prev
- #14965 -- Message copy fails with space in folder names
- #14976 -- Crash when reading a message from an IMAP server
- #15264 -- Crash: evolution-mail seg fault on exit
- #15374 -- "___" in autogenerated name of vfolder created by sender of
- #15415 -- Virtual Folders Editor: display of non-ascii symbols is broken
- #15449 -- `N' wraps `P' doesn't
- #15451 -- Crash when pressing stop during "going offline"
- #15489 -- Evolution crashed while deleting my IMAP mail account
- #15491 -- Evolution crashes/becomes unusable if ppp connection is lost
- #15498 -- Crash: Faulty vFolder editor
- #15512 -- Hangs while scanning for changed messages on S/IMAP+Exchange
- #15552 -- Crash
- #15608 -- RCPT TO: response error: Success
- #15647 -- Composer "send" button has wrong tooltip when offline
- #15657 -- Empty recipients
- #15693 -- Crash: Loading message contents from IMAP and close application
- #15745 -- Search edit window widgets disabled. / Mail component crash.
- #15813 -- Decrypting cuts off initial text
- #15843 -- Attachments inside attachments
- #15946 -- Opening IMAP mailbox made it crash
- #15952 -- Mailer crashed after hitting page down key
- #16227 -- "Body contains" seems to want a regexp
- #16254 -- Add Sender to Addressbook missing from menus
- #16284 -- Evolution-mail crashed selecting "create vfolder on subject"
- #16371 -- Corrupt Email crashes Mail component
- #16416 -- X-Mailer says "Preview Release"
- #16501 -- Crash while creating new account
- #16520 -- Crash
- #16559 -- Race-condition in the Camel type system
- #16669 -- Camel 64-bit badness
- #16695 -- A few dialogs are missing sensible titles
- #16698 -- Crash: Can't empty trash; segfault when I try to exit
- #16722 -- Attachment properties dialog crash
- #16903 -- Crash: segv retrieving mail
- #16924 -- Crash on a particular spam message
- #16936 -- Crash when opening a specific message
- #16947 -- Crash: Trouble Setting up a new mail account
- #17085 -- Bad encoding for subject
- #17386 -- Crash when reading a specific message
-
- * Shell
-
- #7827 -- Switching desktops leaves the folder bar popped up
- #14518 -- Crashed when starting the program
- #14701 -- Importing locks up Evolution
- #15435 -- "Rename folder" dialog: non-ASCII folder names are displayed
- #16507 -- Right Click -> View does nothing
- #16693 -- Crash when creating a new folder
- #17258 -- Shell displays splash even if Evolution is already running
-
- * Summary
-
- #8029 -- Locations.h file for translators
- #11212 -- Degree symbol in weather
- #14483 -- "Hello"?
- #14996 -- All-day appointments are displayed incorrectly in the
- summary view
- #16417 -- Have a better default than CNN headlines
- #16772 -- Summary crashes on startup
- #17249 -- Crash going offline
-
- * Misc
-
- #16358 -- Evolution doesn't have a man page
- #17377 -- Evolution doesn't work on multi-visual displays
-
-
-Evolution 1.0, 2001-11-14
--------------------------
-
-Misc:
- Removed OpenSSL support.
-
-Mailer:
- #14893 -- Mailer hanging if you specify an invalid password
-
-
-Evolution 0.99.2 (Release Candidate 2), 2001-11-14
---------------------------------------------------
-
-Misc:
- #14783 -- killev does not check for system type properly
- #14630 -- HTML docs refer to missing gifs in stylesheet-images
- #15027 -- Typos in the docs
- #15028 -- Corrections to the user documentation
- #15056 -- Spelling Error
-
-Shell:
-
- #6295 -- Go to folder dialog should have the e-tree focused
- #13872 -- Crash
-
-Summary
-
- #13478 -- Summary hangs at startup
- #14518 -- Crashing while starting the program
-
-Mailer:
-
- #10560 -- Messages in Korean charset displayed as blank
- #10735 -- Extra cruft at bottom of Compose window's View menu
- #11177 -- Closing main window while dialog up, hangs
- #11647 -- "Body contains" and "Body does not contain" searches are
- matching strings in the message header
- #13996 -- Searches not available in IMAP in offline mode
- #14351 -- pgp 5.5.8 not supported, recognized as 2.6.x
- #14361 -- IMAP/SSL APPENDs hang
- #14542 -- Crash pressing ctrl-a ctrl-k
- #14569 -- Crash when moving a folder
- #14620 -- Weird font issue in Mdk 7.2
- #14659 -- GPG messages are truncated
- #14672 -- evolution-mail crashes on startup
- #14794 -- PGP signing problem, complaining about 2.6.x when 6.5.1
- is installed
- #14826 -- Crashed the editor by using Alt-C (capitalize word)
- #14838 -- Saving passwords dosen't work
- #14848 -- Forwarding wrong email in separate window when using prev/next
- buttons
- #14861 -- DnD a message from a folder with a space in the name fails
- #14951 -- Cancelling before IMAP connect causes IMAP to loop forever
- #14965 -- Message copy fails with space in folder names
- #15038 -- Can page up or page down off of table
- #15154 -- Long line rendering bug
- #15267 -- Outgoing filter move/copy to folder crashes Mailer
- #15296 -- Mailer hangs when fetching mail
- #15324 -- Table handling code not rendering centered content when
- it should
- #15374 -- "___" in autogenerated name of vfolder created by sender of message
- #15393 -- Pointer grab when shift-double clicking
-
-Addressbook:
-
- #9501 -- Appointment Editor has "Save changes?" confirmation but
- Contact editor does not
- #14107 -- Crash: Address auto-complete pop-up appears after sending mail
- #14646 -- Doesn't handle failure in default_book case
- #14743 -- Contacts crashes when saving a List
- #14780 -- Pushing categories in Contact editor crashes Contacts
- #17355 -- e-select-names/completion from arbitrary storages
-
-Pilot conduits:
-
- #9465 -- Palm Addressbook sync corrupts character set
- #14562 -- Crash
- #15355 -- Bogus warning in calendar conduit
-
-Calendar:
-
- #10285 -- Problem printing the calendar
- #13631 -- Left-over debug print
- #14021 -- Problems entering a task
- #14335 -- UTF-8 Error in schedule meeting
- #14337 -- Meeting is added to calender even when selecting decline
- #14362 -- Appointments (public or private) don't show in the Day
- view of the calendar
- #14392 -- Event editor removes wrong pages when object updated
- #14524 -- Meeting page dragging broken for all day events
- #14655 -- evolution-alarm-notify crash on start
- #14687 -- load_uri failures are not noticed by the client talking
- to the wombat
- #14704 -- Free/busy info not in UTC
- #14765 -- Schedule page timezone problems
- #14842 -- EWeekView - typing in event & day incorrect
- #14845 -- Crash assigning category to new task
- #14941 -- Crash
- #15137 -- Crash when double clicking on empty appointment
-
-
-Version 0.99.0 (1.0 Release Candidate 1), 2001-11-05
-----------------------------------------------------
-
-Shell:
-
- - Fixed problems with icons not showing up in the druids. (Ettore,
- Anna)
-
- - Fixed some dnd brokenness. (Ettore)
-
- - Fixed some random crashes and made the shell more robust in case
- of activation problems or components crashing. (Ettore)
-
- - Implemented a newer, prettier about box. (Ettore)
-
- - Made sure the quit message always gets displayed. (Ettore)
-
- - Made sure the shell doesn't allow for folder names with slashes.
- (Ettore)
-
- - Made the folder selection and folder creation dialogs play better
- with the WM for out-of-proc components. (Ettore)
-
- - Make sure components don't display dialogs before the shell
- windows are displayed. (Ettore)
-
- - Fixed some problems with copying/transferring/renaming folders.
- (Ettore)
-
- - Made the pop-up folder bar have the expected size when popped up.
- (Ettore)
-
-Mailer:
-
- - Fixed SMTP truncation, IMAP/SSL truncation/hangs when
- sending/appending messages. (Jeff)
-
- - Implemented rename for imap/maildir folders. Rename also tracked
- in vfolder and filter code. Use rename for local folders when we
- can instead of copy/delete. (Michael, Jeff)
-
- - Fixed startup wizard next page race bugs. (Michael)
-
- - Fixed toolbars vanishing, Bonobo Suxors. (Michael)
-
- - Made filter/vfolder on mailing lists honour domains, but also
- backward compatible. (Michael)
-
- - Fixed the password coming up behind the main window. (Michael,
- Ettore)
-
- - Fixed numerous crash on startup/exit/while doing nothing/switching
- folder/components, many races and other architectural errors.
- (Michael, Jeff)
-
- - Bunch of vFolder fixes and feature completion. (Michael)
-
- - Added a 'index body' option to configure folder. (Michael)
-
- - Fixed 'unread' counts, again. (Michael)
-
- - Fixed some problems leaking file descriptors and overusing them
- when not necessary. (Michael)
-
- - Implemented iconv() caching and Solaris friendly iconv name
- converter. Made override display charset work in more cases.
- (Michael, Jeff)
-
- - Various untranslated buttons/menus and other translation issues
- fixed. (Michael, Jeff)
-
- - Offline searching in IMAP. (Michael)
-
- - Don't warn the user if he drags a message and drops it in the same
- place. (Jeff)
-
- - Fixed replying-to and forwarding messages with attachments to
- attach the appropriate attachments in the new message. (Jeff, Larry)
-
- - Don't allow the user to edit the default searches and keep all the
- search menus consistant accross all folders. (Jeff)
-
- - Allow the user to drag&drop and/or move messages to the Trash
- folder. (Jeff)
-
- - Various fixes to the filtering code. (Jeff, Michael)
-
- - Make various dialogs non-modal. (Jeff)
-
- - Fixes to POP3 UID caching so users can "leave mail on server" and
- not get duplicates. (Jeff)
-
- - Fixes to IMAP caching code where servers support the UIDPLUS
- extension. Will also now un-cache a folder when the user deletes
- it from the IMAP server. (Jeff)
-
- - Removed support for PGP 2.6.x due to security issues (pgp would
- always return 0 suggesting that the signature was valid even when
- it wasn't). (Jeff)
-
- - "Whitespace-only" recipients are now ignored, rather than being
- flagged as invalid. (Trow)
-
- - Fixed bugs related to message searching: memory leak, i18n problems,
- etc. (Trow)
-
- - We no longer leave stray windows lying around after doing the
- "Add Sender to Addressbook" operation. (Trow)
-
- - Bcc: headers are now shown when viewing drafts, sent mail. (Trow)
-
- - Lots and lots and lots of other little and not so little things.
- (Michael, Jeff, Dan, Trow)
-
-Addressbook:
-
- - General bug fixes. (Everybody)
-
- - Printing fixes. (Trow)
-
- - Fixed the dreaded "this should never happen" bug. (Trow)
-
- - Plugged memory leaks. (Trow)
-
- - Fixed use-score sort ordering when doing completion. (Trow)
-
- - Fixed EAddressPopup race conditions. (Trow)
-
- - Implemented transfer function for shell, so moving contact
- folders now works. (Trow)
-
- - Fixed occasional completion flakiness. (Trow)
-
- - Fixed contact count on folder bar. (Trow)
-
- - Fixes for LDAP/multibook address completion. (Toshok, Trow)
-
- - Added a "Do you want to save changes?" dialog to the contact
- and contact list editors. (Toshok)
-
- - Fixed date (birthday and anniversary) handling for LDAP. (Toshok)
-
- - Fixed nasty LDAP modification bug. (Toshok)
-
- - Add a config setting (/Addressbook/default_book_uri) to specify where
- vcards and email addresses from mail messages are stored as contacts.
- (Toshok)
-
- - Fixed problem that arose in an earlier beta where some contacts
- couldn't be modified or deleted from local addressbook.
- (Chris Toshok)
-
- - LDIF Importer. (Chris Toshok, Michael M. Morrison)
-
- - Fixed Memory Leaks. (Trow)
-
- - Always show the correct message about the number of contacts on the
- message bar. (Trow)
-
- - Fixed printing of contacts. (Trow)
-
- - Fixed the incredibly annoying bug which caused completed
- (underlined) contacts to spontaneously revert when edited.
- (Trow)
-
- - Better event handling in minicard view. (Chris Lahey)
-
- - Fixed Bold font in select names dialog. (Chris Lahey)
-
- - Show error dialog if saving a contact to a file fails. (Chris Lahey)
-
- - Handle carriage returns in any contact field properly. (Chris Lahey)
-
-Summary:
-
- - Worked around gnome-vfs problems that were causing crashes. (Trow)
-
- - Set the defaults to be CNN and Boston (Ettore)
-
- - Move the location of the RDF file to be in a place that will always exist.
-
- - Fixed numerous bugs (Trow, iain)
-
- - Made the offline stuff work correctly (iain)
-
- - Fixed a bug were the summary wouldn't retain settings if all folders,
- or RDFs, or weather stations were removed. (iain)
-
-Importers:
-
- - Made the pine importer work for multidepth mail folders. (iain)
-
-Calendar:
-
- - Underlined accelerators now work in the editor dialogs. (Damon)
-
- - Many fixes for scheduling meetings. (JP)
-
- - Status bar messages for long queries. (Rodrigo)
-
- - Appointments with empty summaries are now deleted from the views.
- Also, you can press Escape to cancel editing [#780]. (Federico)
-
- - The alarm daemon no longer displays "old" alarms twice. (Federico)
-
- - Alarms now handle timezones correctly [#5852]. (Federico)
-
- - Repeating alarms are now handled [#12163]. (Federico)
-
- - The alarm daemon is launched as soon as the calendar starts, not
- when you actually open a folder [#13867]. (Federico)
-
- - You can now set a default reminder to be added to new appointments
- [#13649]. (Federico)
-
- - Fixes for printing week views [#13687, #13688]. (Damon)
-
- - Tasks printout now matches the task list better [#10280]. (Damon)
-
- - Better handling of DATE values, as opposed to DATE-TIME ones. (Damon)
-
- - Many changes to handle the default timezone better. (Damon)
-
- - Recurrence generation fixes [#11525]. (Damon)
-
- - Fixed merging of complete VCALENDAR components. (Damon)
-
- - Fixes to the folder transfer functions. (Ettore, Federico)
-
- - Tasks activation fixes. (Damon)
-
- - Outlook interoperability fixes. (Damon, JP)
-
- - Miscellaneous fixes to the event/task editors. (Damon, JP, Federico)
-
- - New iCalendar importer. (Rodrigo)
-
- - Fixed problems introduced in Beta 6 due to the changes in the URI
- management functions. (Rodrigo)
-
- - Prettier alarm notification dialog. (Larry)
-
- - Session management for the alarm daemon. (Federico)
-
- - Added activity bars for long calendar operations. (Rodrigo)
-
- - Added iCal file importer. (Rodrigo)
-
- - Show error dialogs on calendar failures. (Rodrigo)
-
-Conduits:
-
- - Addressbook phone numbers now preserved if they can't all be
- synced to desktop (JP)
-
- - Sync addressbook phone numbers from non-english pilots (JP)
-
- - Various memory leak fixes (JP)
-
- - Handle multi-day calendar events (without recurrences) (JP)
-
- - Make sure task records are marked complete in every relevant field
- (JP)
-
- - Use new timezone stuff everywhere (JP, Damon)
-
- - Translate task priorities better (JP)
-
-
-Version 0.16 (Beta 6), 2001-10-10
----------------------------------
-
-Shell:
-
- - Now the shell restarts stale components from previous sessions
- properly. This should reduce the need for oaf-slay to only the
- cases in which a specific component is completely stuck (which
- hopefully should never happen). (Ettore)
-
- - Fixed the saving of the size of the shortcut bar and the folder
- bar. (Ettore)
-
- - Always display a new default view for the shell, unless the user
- specified an `evolution:' URI on the command-line. (Ettore)
-
- - Fix the weird behavior for right click -> open in new window in a
- pop-up folder bar. (Ettore)
-
- - Make the copy/move and dnd code to detect copying of folders onto
- themselves correctly. (Ettore)
-
-Mailer:
-
- - Bcc: addresses are now visible when browsing messages in
- the "Sent" folder. (Trow)
-
- - Various backend fixes like thread safeness of concurrent
- triggered events, more forgiving address header decoding,
- fixes for recent breakage to progress reports, adding a deleted
- event/state for folders, various deadlocks. (Michael, Jeff)
-
- - Fixed quick-searching by receipients to work. (Michael)
-
- - Caching of iconv handles to improve performance of many internal
- mail reading/indexing operations. (Michael)
-
- - Major oops in mbox code that caused significant performance
- problems getting/filtering mail fixed. (Michael)
-
- - Message charsets can now be overridden by a user-chosen charset
- encoding in the mail display. (Jeff)
-
- - Report errors when file cannot be attached in the composer. (Jeff)
-
- - File->Folder->Properties and Delete Folder now work for VFolders.
- (Michael)
-
- - VFolders, Filters and Searches are saved in a safe manner so that
- they should not be lost with quota/filled disk problems. (Michael)
-
- - VFolders now update with new mail on their sources. (Michael)
-
- - Fixed the "Load HTML Images" radio button options in the mail
- config dialog to work properly. (Jeff)
-
- - When an IMAP folder is deleted, removed any cached messages that
- had been in that folder when it was "alive". (Jeff)
-
- - New icons for PGP signature authenticity. (Jeff, Jimmac)
-
-Addressbook:
-
- - General fixes. (Chris Toshok, Trow, Iain, Chris Lahey, JP)
-
- - LDAP configuration dialog fixes. (Chris Toshok)
-
- - New authentication work. (Chris Toshok)
-
- - Fixed crashes related to editing the Master Category List. (Trow)
-
- - Address completion is no longer confused by whitespace. (Trow)
-
- - More work on having multiple wombats. (Chris Toshok)
-
- - Contact names no longer mysteriously disappear when using the
- SelectNames dialog. (Trow)
-
-Calendar:
-
- - Backend improvements (Rodrigo)
-
- - Compilation fixes for latest Bonobo (Rodrigo)
-
- - Fixed problem with exceptions to recurring events. (Damon)
-
- - Fixed handling of UNTIL property in recurring events. (Damon)
-
- - The alarm daemon will now notify you of alarms that should have
- occurred while it was not running. (Federico)
-
- - Handle monthly-by-day and "last day" recurrences in the conduits. (JP)
-
- - Added priorities to the fields in the attendee list. (Chris)
-
- - Enhancements to the event editor for meetings. (JP)
-
-Summary:
-
- - Bugfixes. (Iain)
-
- - Recurring events have the correct time and date. (Iain)
-
-
-Version 0.15 (Beta 5), 2001-10-02
----------------------------------
-
-Shell:
-
- - Fixed a problem with shortcuts not appearing when created by the
- mailer. (Ettore)
-
- - Fixed right-click menu behavior for folders in the folder bar.
- (Ettore)
-
- - Got Rename to work again. (Ettore)
-
- - Fixed some folder copy/move/dnd bugs. (Ettore)
-
- - Added a menu item to configure the Pilot settings. (Ettore)
-
- - Fixed some other miscellaneous bugs/crashes. (Ettore)
-
- - Added ability to run the intelligent importers from the File->Import
- menu item. (iain)
-
-Mailer:
-
- - Fixed the multiple error-dialog thing. (Michael)
-
- - Fixes to PGP decrypting and verification code. (Jeff)
-
- - Made vFolders work a lot better. (Michael)
-
- - Added a confirm expunge option to the mail settings dialog.
- (Jeff)
-
- - Fixed the update-IMAP-unread-counts bug. (Jeff)
-
- - Show messages in the user's preferred charset if the message
- itself doesn't contain charset information or if the message
- charset is wrong (ie the system can't convert the text to utf-8).
- (Jeff)
-
- - Many backend fixes that users won't notice. (Michael, Jeff, Dan)
-
- - Fixed the crash that accompanied the invalid address warning. (Trow)
-
- - Properly encode the mailto: links we generate inside of displayed
- messages. (Trow)
-
- - Improve the signature editor. (iain)
-
-Calendar:
-
- - Backend improvements (JP, Rodrigo).
-
- - The alarm daemon can now re-enter properly [#10840]. (Federico)
-
- - Alarms can now have zero-time offsets [#7892]. (Federico)
-
- - Warning fixes. (Chris)
-
- - Fixed custom Glade widgets on non-Linux systems. (Dan)
-
- - Fixed crashing problems in the event/task editor. (Damon)
-
-Addressbook:
-
- - Miscellaneous bug fixes. (Trow, Chris Toshok, Chris Lahey, JP,
- Peter Williams)
-
- - Better handling of addresses containing commas or other special
- characters. (Trow)
-
- - Fixed bugs related to sending mail by left-clicking on an address
- inside a message. (Trow)
-
- - Auto-completion now matches against contact nicknames. (Trow)
-
- - Added help text and generally cleaned up the contact editor.
- (Anna)
-
- - Handle multiple wombats properly. (Chris Toshok)
-
- - Made which book to use for address completion configurable (no gui
- for this yet.) (Chris Toshok)
-
- - Made Print Preview work in addressbook. (Chris Lahey)
-
-Pilot:
-
- - Now syncs exception dates in calendar and addressbook notes. (JP)
-
- - Does not overwrite custom data on pilot. (JP)
-
- - Address completion no longer marks records as changed. (JP)
-
- - Miscellaneous other bug fixes. (JP)
-
-Summary:
-
- - Cache images instead of repeatedly reloading them (iain)
-
- - Only redraw when the summary is visible (iain)
-
- - Use the encoding specified in the RDF file (Takuo Kitame)
-
- - Leak fixes (Larry)
-
- - Show todays tasks works (iain)
-
- - Make the preferences dialog nicer. (iain)
-
-Importers:
-
- - Handle cases where the Netscape transport is nothing. (iain)
-
-Version 0.14 (Beta 4), 2001-09-21
----------------------------------
-
-General:
-
- - Lots of i18n fixes. (Zbigniew Chyla and others)
-
- - Made the splash screen use BackingStore. (Ettore)
-
- - Added a quit dialog box. (Ettore)
-
- - Fixed a shell crash that could happen when launching Evolution
- before a previously launched instance was done initializing itself.
- (Ettore)
-
- - Fixed other random shell crashes. (Ettore)
-
- - Got the shell to remember window geometries on exit. (Ettore)
-
- - Fixed some things for Automake 1.5 (unfinished). (Richard
- Boulton)
-
- - Add nice highlighting to DnD operations in the folder tree.
- (Ettore, Clahey)
-
- - Fixed several leaks. (Dan)
-
- - Fixed some problems with folder creation and deletion. (Toshok)
-
- - Made the Summary the default folder. (Ettore)
-
- - Made the title bar display the unread message count again.
- (Ettore)
-
-Mail:
-
- - Had a few beers while sitting back and relaxin'. (Jeff, Michael)
-
- - Check for valid addresses before sending. (Trow)
-
- - Use contact preferences when deciding whether or not to put the
- composer into HTML mode by default. (Trow)
-
- - Properly address mail from "hidden" contact lists. (Trow)
-
- - Redid folder unread counts/folder tree backend code
- completely. (Michael)
-
- - Implemented/fixed getfolderinfo in maildir/spool/local
- folder/vfolder, required to make unread counts work. (Michael)
-
- - Redid 'local folder' handling code completely. (Michael, Peter)
- Also fixed the properties dialogue to get the list of supported
- types dynamically, and set the right one at startup. (Michael)
-
- - Redid vfolder code in evolution-mail completely. Main visible
- change is they open at startup, and the vfolder editor works
- much better. (Michael)
-
- - Made it so fcntl(2) locking failures on filesystems (e.g. NFS)
- that dont support locking are treated as success. (Michael)
-
- - Fix imap inbox filtering, then moved it to CamelFolder, and
- partly implemented it for spool and maildir mailboxes. (Michael)
-
- - Made the vfolder UNMATCHED folder's name translatable. (Michael)
-
- - Change the way the 'not body contains' filter rule works, so that
- it runs much more efficiently, particularly on IMAP. (Michael)
-
- - Camel will not try and convert charsets of data that contain
- invalid charset data, thus data will not be tainted by
- a failed conversion process. (Michael)
-
- - A few threading scheduling changes to try to optimise the user
- experience. Also changed the way threads are terminated,
- avoiding some possible libpthread bugs. (Michael)
-
- - Changed vfolder uri's to not include the query, set it separately.
-
- - Removed a lot of special case code for vfolder/file uri's, other
- dead or newly redundant code, cleanups, etc. (Michael)
-
- - Fixed a bug in libibex that would overallocate block data and
- corrupt it and crash, also fail-back and reset the index in
- more cases. (Michael)
-
- - Fix filtering on score so the expression compiles. (Michael)
-
- - Came to visit USA at a very wrong time. (Michael)
-
- - Removed X-Evolution headers before sending messages. (Jeff)
-
- - When configuring a new default account, make sure to set it as the
- default. (Jeff)
-
- - Convert all textual parts to 8bit before saving them, this makes
- saved messages more human readable. (Jeff)
-
- - Don't cache PGP passphrases unless the user requests to do so.
- (Jeff)
-
- - Unsubscribe from folders before deleting them. (Jeff)
-
- - Fixed a number of race conditions in the subscribe dialog. (Jeff)
-
- - Save transport (SMTP) passwords if the user has asked us to. (Jeff)
-
- - Hide the S/MIME frame in the account editor, we won't be
- supporting it for 1.0. (Jeff)
-
- - Fixed it so that icons are displayed for PGP messages. (Jeff)
-
- - Give a description for each of the Source and Transport types when
- configuring an account. This makes a few things less confusing.
- (Jeff)
-
- - When performing a Send & Receive on a disconnected IMAP server, if
- the user provides a password, connect tot he IMAP server and display
- it's folders too. (Jeff)
-
- - Return a folder info for each IMAP folder created when the user
- creates a recursive directory structure. (Jeff)
-
- - Added support for more charset conversions (including all
- Windows-cp125x charsets). (Jeff)
-
- - When the disk is full, warn the user and don't crash. (Jeff)
-
- - Handle POP servers that don't support the UIDL extension. (Jeff)
-
- - Several PGP fixes. (Jeff)
-
-Addressbook:
-
- - Miscellaneous bug fixes. (Jon Trowbridge, Chris Toshok, Chris Lahey,
- Ettore Perazzoli, Iain Holmes, Zbigniew Chyla, Jacob Berkman)
-
- - Fixed race conditions associated with adding/removing contacts.
- The addressbook should be much more stable now. (Trow)
-
- - Fixed reference counting bugs in addressbook & wombat. (Trow)
-
- - Made address lookup smarter; cut & paste of address now mostly works.
- (Trow)
-
- - Plugged Trow's memory leaks. (Larry)
-
- - Name completion now works with one-word names, so it is now much
- easier to send mail to Cher. (Trow)
-
- - Better handling of contact lists in the composer entries. (Trow,
- Toshok)
-
- - SelectNames dialog fixes. (Trow)
-
- - Better handling of contact lists in the pilot conduits. (JP)
-
- - Added Free busy URL and Calendar URI info to contact editor and
- ECard. (JP)
-
- - Made it so you can select uneditable text in Contact Editor.
- (Chris Toshok)
-
- - Worked on LDAP dialog. (Chris Toshok)
-
- - General LDAP work. (Chris Toshok)
-
- - Fixed charset handling within VCard handling. (Chris Lahey)
-
- - Reworked Drag & Drop for card view.
-
-Calendar & Tasks:
-
- - Free/Busy changes. (JP, Rodrigo)
-
- - iTIP fixes (JP)
-
- - i18n fixes, particularly for printing (Zbigniew Chyla)
-
- - Added option to confirm deletions (Federico)
-
- - Improved alarm system (Federico)
-
- - Fixed crashing bug when deleting a folder (Federico)
-
- - Added option to hide completed tasks (Damon)
-
- - Timezone changes for interoperability with Outlook (Damon)
-
- - Fixed problems displaying/parsing times in locales which don't specify
- 'am' and 'pm' strings (Damon)
-
- - Added toolbar button to delete the selected calendar event (Damon)
-
- - Meeting selector integrated (JP)
-
-Summary:
-
- - Fixed bugs and leaks. (Iain)
-
- - Fixed bug with handling of the Slashot RDF files. (Iain)
-
- - Made the Addressbook and Tasks links open the editor for
- them. (Iain)
-
- - Mail summary doesn't force all folders to be opened. (Iain)
-
- - Calendar summary shows if an alarm is set for an appointment. (Iain)
-
- - Timezone fixes. (Iain, Damon)
-
-Importers:
-
- - Fixed more bugs. (Iain)
-
- - Netscape importer shouldn't crash on Movemail users anymore.
- (Iain)
-
- - Pine importer should import addressbooks better. (Iain)
-
- - VCard importer will actually import things now. (Iain)
-
-
-Version 0.13 (Beta 3), 2001-08-21
----------------------------------
-
-Global:
-
- - New startup assistant to create mail accounts, import mail and set
- your timezone. (Iain, Taylor)
-
- - Improved the appearance and behavior of the clickable title bar and
- the folder tree. (Ettore)
-
- - "Stock" folders such as Inbox have their names translated now and
- cannot be removed. (Ettore)
-
- - Moved the Summary (formerly known as "My Evolution") to be a
- normal node instead of being the toplevel node. (Ettore)
-
- - Fixed some problems with copying, moving and removing folderes.
- (Jason)
-
- - Fixed the handling of documentation files in the Help menu. It
- now integrates nicely with Nautilus and Scrollkeeper. (Aaron,
- Kjartan)
-
- - Implemented the `File -> New' menu. (Ettore)
-
- - Improved error messages on start-up. (Ettore)
-
- - Fixed various crashes and minor bugs. (Ettore, Jason)
-
- - Various UI tweaks and improvements. (Anna, Tuomas, Jakub)
-
-Mail:
-
- - Fixed creating IMAP folders. (Jeff)
-
- - Add a shortcut to the INBOX of IMAP or spool stores when
- their accounts are first created. (Peter)
-
- - Fixed Crash on Exit bugs. (Jeff)
-
- - Many more i18n fixes. (Zbigniew Chyla, Jeff and others)
-
- - Subscribe dialog UI tweaks. (Peter, Anna)
-
- - Displaying PGP signed messages now shows icons. (Jeff)
-
- - Sensitize menu items based on number of selected messages. (Peter)
-
- - Always-sign options for PGP. (Jeff)
-
- - Fixed keep-on-server for POP servers that don't support UIDL.
- (Jeff)
-
- - Several IMAP fixes. (Peter, Jeff, Danw)
-
- - Fix crash after conversion of an empty folder to another
- format. (Peter)
-
- - Ibex now limits its file descriptor usage. (Michael)
-
- - When deleting an account, remove the shortcuts that point to it. (Peter)
-
- - Several IMAP fixes. (Peter, Jeff, Danw)
-
- - Miscellaneous bugfixes all around. (Peter, Jeff, Danw, Michael, others)
-
-Calendar & Tasks:
-
- - Calendar no longer crashes when you scroll a busy month view
- (Federico).
-
- - Performance improvements throughout (Damon).
-
- - Improved search bar; now handles categories. (Jon, Federico)
-
- - The date navigator now reflects the results of the search bar.
- (Federico)
-
- - An empty task is no longer added when you have selected a
- category. (Federico)
-
- - Internationalization fixes (Zbigniew).
-
- - Timezone fixes (Damon).
-
- - Time transparency and component classification support (Damon).
-
- - Folder bar now displays the selected time range (Damon).
-
- - Improved settings dialog (Anna, Damon, Federico).
-
- - iTIP/iMIP fixes for attendees, cancellation. (JP).
-
- - Category icon drawing fixes. (Rodrigo)
-
- - Alarm fixes. (Federico)
-
- - Calendar components can be saved independently. (JP)
-
- - New icons. (Tuomas)
-
- - Contacts support. (Damon)
-
- - You can double-click on appointments to edit them. (Damon)
-
- - Share more code between the backends. (Rodrigo)
-
- - Miscellaneous fixes all over the place. (Damon, JP, Rodrigo, Federico)
-
-Addressbook:
-
- - Various fixes. (Anna Dirks, Dan Winship, Jason Leach, Jos Dehaes,
- Kjartan Maraas, Lahey, Nat Friedman, Radek Doulik, Toshok, Trow)
-
- - Made addressbook menus match the right click menus. (Lahey)
-
- - Made addressbook use camel for building email addresses. (Trow)
-
- - Fixed up phone number matching to not cause errors. (Lahey)
-
- - Made the alphabet bar change the current search. (Lahey)
-
- - Made duplicate contact matching less sensitive. (Lahey)
-
- - Changed advanced search to match behavior in mailer. (Toshok)
-
- - Redesigned LDAP server dialog. (Anna Dirks)
-
- - Work on addressbook authentication. (Toshok)
-
- - Changes to EDestination. (Trow)
-
- - Magic comma work. (Trow)
-
- - Redesigned ESelectNames dialog. (Anna Dirks)
-
- - Made LDAP changes appear in gui immediately if they're made by the
- local client. (Toshok)
-
- - Made ECard hold a link to its original EBook. (Lahey, Trow)
-
- - Adapted for new ESearchBar. (Federico, Trow)
-
- - Added the ability to create cards from anywhere in evolution.
- (Lahey)
-
- - Made searches for completion not use invalid cached data. (Trow)
-
- - Encode strings typed in by the user for use in sexps. (Toshok)
-
- - Made EContactEditor make the save button active more often.
- (Toshok)
-
- - Made ESelectNames handle LDAP storages. (Toshok)
-
- - Added full country list to addressbook full address editor.
- (Lahey)
-
- - Added the contact count to the folder bar. (Lahey)
-
- - Updated icons. (Damon, Ettore)
-
- - Worked on addressbook conduit. (JP)
-
- - Made ESelectNames only show names on the left that aren't on the
- right. (Trow)
-
- - Fixed up minicard dragging. (Toshok)
-
-My Evolution:
-
- - Miscellaneous fixes all over the place. (iain)
-
- - New icons. (Tuomas and Jakub)
-
- - Works for people whos text colour was a light colour. (iain)
-
-
-Version 0.12 (Beta 2), 2001-07-31
----------------------------------
-
-Shell:
-
- - Change the name of the local storage node from "local" to "Local
- Folders". (Jason)
-
- - Fixed a problem with invalid URIs crashing the shell. (Jason)
-
- - Hide internal folder types (like "vtrash") from user. (Ettore)
-
- - Fixed some crashes that could happen when creating folders.
- (Ettore)
-
- - Fixed the URIs for the installed manuals in the help menu.
- (Ettore)
-
- - Added a status bar to show components' tasks instead of using
- pop-up progress dialogs. (Ettore)
-
- - Other miscellaneous bug and leak fixes. (Jason, Ettore)
-
- - Initialize GConf properly when GtkHTML is built with GConf
- support. (Frederic Crozat)
-
- - Make the shortcut bar not change the current group when renaming
- it. (Jason)
-
-Mail:
-
- - Use new shell ActivityClient interface for progress reporting so
- the ongoing activities appear at the bottom of the window instead of
- using a pop-up. (Michael)
-
- - "Remember this password" check box added. (Peter, Jeff)
-
- - UI for timespan editor cleaned up. (Peter)
-
- - UTF8 issues with PGP and mail display addressed. (Jeff)
-
- - Translate some more strings. (Jeff, Zbigniew Chyla)
-
- - Fix camel_session_*_timeout functions. (Michael)
-
- - Fix application/pgp handling. (Jeff)
-
- - Fix DnD with no messages selected. (Jeff)
-
- - Respect the GTK+ theme when generating the header in the mail
- display. (Jeff)
-
- - Make the default date column smaller. (Peter)
-
- - Don't display "0 hidden" messages. (Peter)
-
- - 'q' now toggles the message (pre)view. (Peter)
-
- - Rename the "Date" column to "Sent". (Peter)
-
- - Fix saving of passwords (some passwords were being saved and
- loaded under different URI's). (Jeff)
-
- - Enter now always open the message in a new window. (Peter)
-
- - Gray out unsupported authentication mechanisms. (Jeff)
-
- - Fix saving/loading of several preferences. (Peter, Jason)
-
- - Overwrite attachment files correctly. (Jeff)
-
- - Don't lose the selection when deleting the last message. (Jason)
-
- - Improve guessing of which address to use when replying. (Jeff, Jason)
-
- - If SSL isn't supported, indicate so. (Peter)
-
- - Improve handling of NoSelect IMAP folders. (Peter)
-
- - Add a browse button for local mailboxes. (Jason)
-
- - VTrash handling improvements. (Jeff, Peter)
-
- - Display "unsent" in outbox summary. (Peter)
-
- - Only have main view folder browsers save view settings. (Peter)
-
- - Fixes to POP3 cache. (Jeff)
-
- - Handle variants of charset names. (Jeff)
-
- - Progress reporting and optimizations for IMAP. (Dan)
-
- - Progress reporting for SMTP. (Michel)
-
- - Handle unencoded eight-bit headers. (Jeff)
-
- - Miscellaneous improvements to Camel backend. (Michael, Jeff)
-
- - Several crashes fixed. (everyone)
-
-Addressbook:
-
- - Fixed some warnings. (Chris T.)
-
- - I18n fixes. (Zbigniew Chyla)
-
- - Address quoting in composer bug fixed. (Jon)
-
- - Made it so that Other Contacts doesn't show up if you don't have
- LDAP compiled in. (Jason)
-
- - Made it so that Other Contacts doesn't show up if you don't have
- any LDAP servers configured. (Jos Dehaes)
-
- - General bug fixes. (Chris T., Jon, Frederic Crozat, Jason,
- JP, Ettore, Chris L.)
-
- - Some LDAP cleanup. (Chris T.)
-
- - Crash fixes. (Jon, Dan)
-
- - Work on contact lists. (Chris T., Jon)
-
- - Made Contact Editor Save & Close button not active if nothing is
- changed. (Chris T.)
-
- - Added accelerators to a few dialogs. (Taylor Hayward)
-
- - Made evolution-vcard-importer.c load the file into the correct directory.
- (Iain)
-
-Calendar & Tasks:
-
- - Show icons for categories. (Rodrigo)
-
- - Multiple selections for cut/copy/paste in task list. (Rodrigo)
-
- - Added missing underlined shortcuts for dialogs. (Taylor)
-
- - Many timezone-related fixes. (Damon, Federico)
-
- - Alarm notification dialogs. (Federico)
-
- - iTIP and iMIP ongoing work. (JP)
-
- - Consistency & cosmetic fixes for dialogs and menus. (Damon,
- Federico)
-
- - You can now create new calendar/tasks folders in the shell.
- (Ettore)
-
- - Printing fixes. (Damon)
-
- - Added a search bar for tasks folders. (Federico)
-
- - The task pad in the day view is now filtered as well. (Federico)
-
- - Timezone support for conduits. (JP)
-
- - General bug fixes. (Federico, JP, Damon, Rodrigo)
-
-My Evolution:
-
- - Removed the wipe trackers option. (Iain)
-
- - Fix broken links in the Calendar. (Iain)
-
- - Added some more German cities. (Iain)
-
- - Fixed the New Feed button. (Iain)
-
- - Fixed the KDE and Newsforge urls. (Iain and Jason)
-
-
-Version 0.11 (Beta 1), 2001-07-12
----------------------------------
-
-Shell:
-
- - Drag and drop handling (Chris T.)
-
- - Online/Offline operation (Ettore)
-
- - Numerous code cleanups and bug fixes (Ettore & Jason)
-
-Mail:
-
- - Added ability to specify a charset in the composer and for the
- Preview Pane. (Jeff, Danw)
-
- - Auto-save messages during composition and composer
- crash-recovery. (Larry)
-
- - Better signature file handling. (Radek)
-
- - File->Insert menu. (Larry)
-
- - Address-completion in the composer. (Trow)
-
- - Much improved PGP/GPG. (Jeff)
-
- - Cut/Copy/Paste and Drag & Drop. (Jeff)
-
- - Disconnected IMAP, IMAP filtering, and other IMAP improvements. (Danw)
-
- - Empty Trash On Exit. (Jeff)
-
- - More informative Folder message counts (new/hidden/total). (Peter)
-
- - Implemented "Select Thread". (Peter)
-
- - Movemail fixes and improvements. (Michael)
-
- - Improved/Configurable Forward/Reply functionality. (Jeff, Trow, Danw)
-
- - Improved Message browser window. (Jeff, Peter)
-
- - Load HTML images Sometimes/Always/Never. (Danw)
-
- - rfc2184 conformance. (Jeff)
-
- - Online/Offline modes. (Ettore, Danw, Jeff)
-
- - HTML indexing. (Michael)
-
- - Spool providers. (Michael)
-
- - Many i18n fixes. (Jeff, Trow, Larry, Michael)
-
- - Fixed saving of html signature preferences. (Peter)
-
- - Cleaned up exiting by having remote stores sync folders (Peter)
-
- - Attached binhex files do not cause infinite loops (Peter)
-
- - Don't send BCC headers when sending via SMTP (Peter)
-
- - Let you show and hide attached message/rfc822's (Peter)
-
- - Implemented Create/Remove/Move Folder. (Jason, Jeff)
-
- - Maildir fixes and improvments, support for subdirectories. (Michael)
-
- - Progress reporting using via shell activity interface. (Michael)
-
- - Many bug fixes all around. (Michael, Jeff, Danw, Peter, Trow and others)
-
-Addressbook:
-
- - Cut/Copy/Paste (Chris T.)
-
- - Improvements to address completion, matching and merging (Jon, Chris L.)
-
- - LDAP improvements (Chris T.)
-
- - Numerous bug fixing (Jon, Chris L., Chris T.)
-
-Calendar & Tasks:
-
- - Timezone support (Damon)
-
- - Cut/Copy/Paste (Rodrigo)
-
- - Event/Task editor rewrite (Federico & JP)
-
- - Improved Printing (Damon)
-
- - Itip/Imip improvements (JP)
-
-Importers:
-
- - Fixes, bug fixes and more fixes. (Iain & Jason)
-
-General:
-
- - New graphics/icons (Jakub & Tuomas)
-
- - UI Improvements (Anna & Taylor)
-
- - 'make distcheck' should hopefully be working again (Peter)
-
- - Have 'make install' work for non-root users in Camel, albeit
- with a large and important warning message (Peter)
-
-My Evolution:
-
- - Completely new and prettier My Evolution (nee Executive Summary)
-
- - Pretty graphics (Jakub)
-
- - Mail, Calendar and Task summaries to tell you what you need to do
- today.
-
- - Weather forecasts so you don't need to look out the window (I
- dunno, hackers seem to dislike looking out the window or
- something...)
-
- - News feeds so you don't need to go to websites to see what news
- articles you don't want to read.
-
- - Printing, you can print it out and make it look like you've got
- lots of stuff to do when really you're just trying to pass the
- time by playing Aisleriot or GLine all day (Iain)
-
-
-Version 0.10 "Tasmanian Devil", 2001-04-26
-------------------------------------------
-
-Shell:
-
- - Fixed some usability bugs in the folder selection and creation
- dialogs. (Ettore)
-
- - Added a --debug option. (Dan)
-
- - Added support for drag and drop operations. (Ettore)
-
-Mail:
-
- - SSL (S/IMAP, S/POP, and S/SMTP). (Jeff)
-
- - Virtual Trash folders in each mail storage and "Empty Trash" menu
- item to expunge all folders in a store. (Jeff)
-
- - Email addresses in mail headers are now right-clickable to add
- them to the Addressbook (Jon, Radek)
-
- - Hide deleted messages is now a mode rather than a one-time
- operation. (Michael)
-
- - When sending plain text mail, use the new plain text mode of the
- GtkHTML editor (Larry)
-
- - Cancellable operations, cancellable/async dns lookup, slightly
- improved progress reporting. (Michael)
-
- - Allow per-identity Draft and Sent folders. (Dan)
-
- - Replies quoted with "> " in messages are now displayed dimmed to
- make it easier to find the new bits of text. (Radek)
-
- - Saved searches. Searches now configurable via XML with supporting
- C code. (Michael)
-
- - UNMATCHED vFolder (shows all messages that are in no other
- vFolder). (Michael)
-
- - SASL Authentication (Kerberos4, DIGEST-MD5, CRAM-MD5, PLAIN,
- LOGIN, ANONYMOUS) for IMAP and SMTP (haven't done POP yet)
- (Jeff, Dan)
-
- - Filter/vFolder on Mailing List. (Michael)
-
- - Resend sent items. (Jeff)
-
- - Allow users to turn on/off headers in the composer and added
- Reply-To header entry in the composer. (Miguel, Jeff)
-
- - Numerous OpenPGP (PGP/MIME) fixes. (Jeff)
-
- - Replying to a message chooses account based on message
- addressee's. (Jeff)
-
- - Redid Forward Inline and Forward Quoted. (Jeff)
-
- - IMAP fixes: greater configurability for faster startup/mail check
- (Dan), folders should now notice new messages when you switch to
- them (Dan), copying/moving many messages at once should be much
- faster (Jeff), better support for old IMAP servers (Dan)
-
- - IMAP message bodies are now cached to local disk to speed up
- re-access (Dan)
-
- - New config dialogs (last time!) (Anna, Dan)
-
- - Sorting by a text field in the message list no longer generates a
- random order. (Michael)
-
- - Fixed "crash when getting new mail from 2 POP servers" bug. (Dan)
-
- - Numerous bugfixes, cleanups and optimisations. (Everyone)
-
-Addressbook:
-
- - Added support for non editable sources. (Toshok)
-
- - Added address completion for use in contact entries using the
- select names system. (Jon Trowbridge)
-
- - Fixed some major crashes in the addressbook backend. (Clahey)
-
- - Updated Ximian's contact information. (Jason Leach)
-
- - Finished LDAP support. (Toshok)
-
-Calendar:
-
- - Event creation fixes. (Miguel)
-
- - Calendar loading fixes and removal of old code. (Federico)
-
- - Made the iTIP control have better spacings. (Anna)
-
- - i18n fixes. (Kjartan)
-
-Tasks:
-
- - Created a popup list item for ETable to select the Status,
- Classification, Priority, Percent & Transparencey fields. (Damon)
-
- - Created a popup date editor item for ETable to set all the dates in the
- tasks. (Damon)
-
-Importers:
-
- - Created Intelligent Importers that look for certain files on your disk
- and works out what type of data it is. Currently Intelligent Importers
- exist for Pine, Elm and Netscape. (Iain)
-
-General:
-
- - Rewrote ETree in gal. Changed evolution to support the changes in
- API. (Clahey)
-
- - Lots of Etable/ETree bug fixes. (Clahey)
-
- - Lots of i18n/l10n fixes. (Kjartan Maraas, Gedeminas Paulauskas,
- and the Evolution gang)
-
- - Fixed the shell interface so it could correctly create folders. (Iain)
-
-
-Version 0.9 "Platypus", 2001-03-12
-----------------------------------
-
-Shell:
-
- - Importing framework. (Iain)
-
- - Made the splash screen a regular window. (Miguel)
-
- - Added a menu item to hide the shortcut bar to the shortuct bar
- right-click menu. (Jason)
-
- - Update the shortcut labels to contain the number of unread
- messages as well. (Jason)
-
- - Pre-select a newly created folder in the folder selection dialog.
- (Ettore)
-
-Mail:
-
- - GPG/PGP support is now mostly working and sort of configurable.
- Except that the pretty pictures are missing. (Jeff)
-
- - Exciting new configuration druid (Anna, Jeff) and configuration
- editor-of-the-month (Jeff). You can now have multiple identities
- that use different transports. (Jeff)
-
- - The folder-tree unread message counts now work much better. But
- vfolders only display their unread message counts *after you've
- looked at the folder for the first time*. (Dan)
-
- - New mail send/receive stuff with status dialog. (NotZed)
-
- - "Stop" button and support for cancelling operations. (NotZed)
-
- - Various fixes involving IMAP folders and subscriptions. (Dan)
-
- - Fake messages to root threads in the message list are now gone. (NotZed)
-
- - NNTP support is no longer configured by default, as this code is
- not expected to be completed by 1.0.
-
- - Interface for hiding messages matching certain criteria. (NotZed)
-
- - Quick search bar now includes "Sender contains" option (Tuomas? Eek!)
-
- - The mailer now properly launches "gnome_segv" when it crashes. I
- mean, if it were to crash. (Dan)
-
- - IMAP attachments are now not loaded unless you look at them. (Dan)
-
- - The X-Mailer header can now include a compile-time-specified
- string (for specifying package version, etc). (Dan)
-
- - The Date header in the message list now formats dates differently
- depending on how long ago they are. (Chris)
-
- - The composer doesn't ask if you want to save before closing if you
- haven't changed anything. Also, it has more useful window titles
- (Jason Leach) And you can now turn off the "are you sure you
- didn't mean to enter a subject?" dialog box. (Jeff)
-
- - The "Menu" key on a Windows keyboard (the one with the picture of
- a pop-up menu) now pops up the message list right-click menu.
- (Dan)
-
- - Lots of internal stuff that doesn't much affect the user-visible
- functionality, particularly involving multithreading, message
- threading, filters/searching, and regression testing. (NotZed)
-
- - Importers for Outlook Express 4 and mbox (used by most mailers like
- Netscape, Pine, Elm, Eudora) (Iain & Jeff)
-
-Addressbook:
-
- - Fixed crashing bug on PPC. (Clahey)
-
- - Updated to work with both OpenLDAP 1 and OpenLDAP 2. (Toshok)
-
- - Added configuration dialog for LDAP. (Toshok)
-
- - Plenty of bug fixes. (Clahey, Toshok, Meeks, JP, Larry, Jason,
- Federico, Dan, Zucchi, Gediminas Paulauskas, Ettore)
-
- - Moved category dialog to gal. (JP)
-
- - Worked on LDAP authentication. (Toshok)
-
- - Worked on status messages. (Toshok)
-
- - Worked on GalView stuff. (Clahey)
-
- - Improved the select names dialog GUI. (Clahey)
-
-Calendar:
-
- - New "go to date" dialog. (JP)
-
- - Categories support for appointments. (JP)
-
- - New alarms page in event editor. (Anna, JP)
-
- - Weekday picker now follows the week start setting. (Federico)
-
- - Date-editing widgets are more consistent with each other.
- (Federico)
-
- - Colorization fixes to the views. (Damon)
-
- - Optimizations to the views. (Damon)
-
- - New, simpler loading interface for calendars in the Wombat. (Federico)
-
- - Removal of lots of old Gnomecal code. (Federico, JP)
-
- - Alarm instance generation support for the Wombat. (Federico)
-
- - Alarm trigger queueing for the GUI. (Federico)
-
- - More robust launching and registration of the components. (Federico)
-
- - More i18n friendliness. (JP, Federico)
-
- - Start of the alarm notification daemon. (Federico)
-
- - Cosmetic and focus fixes all over the place. (Federico, JP)
-
-Tasks:
-
- - New, stand-alone tasks component. (Damon)
-
- - Categories support. (JP, Damon)
-
- - Your old tasks are migrated automatically to the new tasks folder.
- (Federico)
-
- - You get asked for confirmation when trying to delete a task entry.
- (Federico)
-
-Conduits:
-
- - Many bug fixes and cleanups. (JP)
-
-Executive Summary:
-
- - Bugfixes and memory leaks removed. (Iain)
-
- - Calendar summary component. (Iain)
-
- - RDF Summary saves it's state. (Iain)
-
- - Mail summary shows vFolder summaries as well. (Iain)
-
- - User changable number of columns. (Iain)
-
-
-Version 0.8 "Archaeopteryx", 2000-12-14
----------------------------------------
-
-Shell:
-
- - Added a `--no-splash' option. (Ettore)
-
- - Plugged a number of memory leaks. (Federico)
-
- - Added interfaces to display an arbitrary string associated with a
- folder, and highlight it on demand. (Ettore, Dan)
-
- - Changed the Storage IDLs so that you can associate a physical URI
- to the toplevel node as well. (Ettore)
-
- - If a shell is already running, `evolution' will just make it
- create a new view instead of creating a new shell. (Ettore)
-
-Mail:
-
- Display:
-
- - The folder tree now shows unread message counts for mail
- folders. For local folders, this updates in real time. For IMAP, it
- only updates when you "Get Mail". To be continued. (Dan)
-
- - New "important" column in the message list. User-settable. (Dan)
-
- - The message list "Size" column now displays more prettily and
- sorts correctly. (Jeff)
-
- - New command to view the raw source to a message. (Jeff)
-
- - More reliable MIME icon code in the mailer and the composer.
- (Dan, Iain)
-
- - Lots of internationalization fixes. (Dan, Kjartan)
-
- Composer / Outgoing mail
-
- - Various fixes to use the best charset and MIME encoding for
- outgoing messages. (Michael, Jeff)
-
- - You can now forward messages inline, instead of attaching them.
- Forwarding multiple messages now results in a multipart/digest
- attachment. (Jeff)
-
- - Replies are now preceded by "On DATE, PERSON wrote:" (Jeff)
-
- - Better reply editing, automagically sets indentation and paragraph
- style to Normal. (Radek)
-
- - HTML signature support. (Radek)
-
- - Inline image support. (Radek)
-
- - Fixes for addresses with commas. (Jeff, Michael)
-
- - Fix to not allow attaching directories, devices, etc.
- (Jeff)
-
- - Fixed the sign of the GMT offset in generated Date headers.
- (Michael)
-
- - Fixed a bug in base64 encoding. (Michael)
-
- - Fixed a problem in connecting to non-ESMTP SMTP servers. (Jeff)
-
- Miscellaneous Commands / Features:
-
- - The mailer will now remember your passwords, if you configure
- that option for a service. (Dan)
-
- - New "Apply Filters" command to apply filter rules to selected
- messages. (Jeff)
-
- - No more "No new mail" dialog. (Jeff)
-
- - Individual messages can now be saved to disk. (Jeff)
-
- - Synced the Message menu with the right-click menu. (Jeff)
-
- - Mailer now uses the same search bar as the addressbook. (Anna,
- Chris, Jeff)
-
- Filters:
-
- - Now supports filtering on system flags (ie Answered, Seen,
- Unseen). (Jeff)
-
- - Regular expression searches are now moved to their own Option
- menu. (Jeff)
-
- - Allows regex searching on the entire message header. (Jeff)
-
- - Now has soundex filters (x sounds like y). (Jeff)
-
- IMAP:
-
- - "Get Mail" now scans all folders. (Dan)
-
- - IMAP password dialog no longer pops up at startup: click on the
- server in the folder tree to connect. (Dan)
-
- - Folder subscription support. (Chris Toshok, Dan)
-
- - Various IMAP folder naming fixes. (May fix Cyrus support) (Dan)
-
- - Seen/deleted flags are preserved across "Get Mail". (Jeff)
-
- - Fixed a bug that could cause messages to be marked as seen
- even when the UI thought they weren't. (Dan)
-
- - Fixes for IMAP folders with spaces in their names (again).
- (Jeff)
-
- - IMAP Kerberos 4 authentication support. (Dan)
-
- POP3:
-
- - Fixed a bunch of error cases in POP3 connection. (Dan)
-
- - Fixed POP3 to more reliably delete messages when it was supposed
- to be doing so. (Dan)
-
- Local mail:
-
- - Major local mail rewrite that fixed memory leaks, reduced
- memory consumption, improved efficiency, etc. (Michael)
-
- - Maildir support. (Michael)
-
- - Local mail folders are now locked (via dot locking and/or
- fcntl/flock) while Evolution is modifying them, and it will
- notice if they've changed while it's not looking. (Michael)
-
-Calendar:
-
- - To-do and calendar conduits working except for extended
- character support (ie accented chars) (JP)
-
- - Updated wombat implementation of change reporting (JP)
-
- - Majorly kick-ass new recurrence page in the event editor with an
- easy UI, a preview of what will happen, and lots of love. (Anna)
-
- - Imported a new libical with the APIs we require for alarms, the
- start of the timezone code. This may be the last Evolution
- release that uses a CVS-imported libical; in the future we should
- depend on official tarballs. (Federico)
-
- - Event editor now deals gracefully with iCalendar recurrences we
- cannot edit. (Federico)
-
- - Plenty of fixes to the ETable calendar model for the task list
- (Damon).
-
- - The task list now saves its state, selected columns and sort order
- (Damon).
-
- - Lots of love to the iTIP engine and user interface. Scheduling
- appointments via email should be working fine, and they should
- also work when you receive them. (Jesse)
-
- - Lots of work on the calendar preferences code. (Damon)
-
- - Many functional and cosmetic fixes to the day and week
- views. (Damon)
-
- - Event and task editors now ask if you try to close them without
- saving changes. (Damon)
-
- - You are now prompted if you are sure that you want to delete an
- appointment. (Federico)
-
- - Plenty of memory leaks fixed. (JP, Federico)
-
- - Prettified the event editor a bit by making widget spacings
- consistent. (Federico)
-
- - Fixed semantics for handling exception dates (Federico)
-
- - Some fixes to the recurrence instance generation engine. (Damon)
-
- - Fixed insertion of new objects via notification into the task
- list. (JP, Federico)
-
- - Misc. polishing for the event editor's innards. (Damon, Federico)
-
- - Misc. cruft removal from old Gnomecal code (Federico, Miguel)
-
- - Prettier icons for the task list. (Federico)
-
-Addressbook:
-
- - Addressbook conduit now working, experimentally, except for
- extended character support (ie accented chars.) (JP)
-
- - Extended wombat functionality with getChanges call. (JP)
-
- - Full name and address dialogs in contact editor fixed. (Chris)
-
-Executive Summary: (iain)
-
- - Now compiled by default.
-
- - Prettier default dialogs.
-
- - Customisable background.
-
- - RDF Summary, and Mail Summary components.
-
- - Fixes and optimisations.
-
- - Can restore state.
-
-Version 0.7, "Loch Ness Monster", ????
---------------------------------------
-
-There have been no verified sightings of this release.
-
-
-Version 0.6, "Procompsognathus", 2000-10-19
--------------------------------------------
-
-General:
-
- - Split out lots of functionality to gal. Evolution now depends on
- gal. (Chris Lahey, Gal Team)
-
-Shell:
-
- - Added a cute splash screen. (Ettore, TigerT)
-
- - Improved the way `~/evolution' is initialized the first time.
- (Iain)
-
- - Fixed the problem with the folder bar disappearing too son when
- clicking on the scrollbar. (Ettore)
-
- - Updated to use the new toolbar and UI merging code from Bonobo.
- (Michael Meeks, Ettore)
-
-Mail:
-
- - Numerous i18n encoding, decoding, and display fixes. Non-ASCII
- text should be displayed correctly in most context in the mailer
- now. The composer no longer sends undeclared 8bit data. (Jeff)
-
- - The IMAP provider now caches summary info between sessions, so
- startup should be much faster for large folders. (Dan)
-
- - Subscribe/unsubscribe UI for newsgroups. (IMAP subscriptions will
- be supported in a later release.) NNTP authentication support.
- Various other NNTP fixes. (Chris Toshok)
-
- - New "full search" button to do more complicated searches. (NotZed)
-
- - Composer attachment bar improvements. You can now drag files to
- the composer window to attach them to the message. (Iain)
-
- - Message list state (columns selected, sorting, etc) is now saved
- between sessions. (NotZed)
-
- - "Get Mail" now works for IMAP. IMAP mail no longer arrives
- asynchronously (although if you delete mail from another client,
- it will be deleted asynchronously). (Dan)
-
- - Image attachments now use thumbnail images rather than a generic
- image icon. (Iain)
-
- - Various IMAP provider bugs (Dan, Jeff)
-
- - Filter code cleanup/improvements. (NotZed) Filtering can read and
- write message scores. (Jeff) On-demand filters no longer expunge
- the source folder, and don't filter deleted messages. (Jeff)
- Filters now log their actions. (Jeff)
-
- - Drafts, Outbox, and Sent folders now default to showing "To"
- instead of "From" in the header list. Messages output to the Sent
- folder are marked as "Seen". "Send later" on a reply will mark the
- message as having been replied to. (Jeff)
-
- - Message list "attachment" column is now functional. The
- read/unread state of a fake thread header now matches the state of
- the thread. (NotZed) Message list sorting is more clever (Jeff)
-
- - The "Print" toolbar button now opens a Print dialog rather than a
- Print Preview window. (Miguel)
-
- - New "Select All" command. "Mark all messages as seen" became "Mark
- (selected) messages seen". (Jeff)
-
-Calendar:
-
- - Improved todo list and calendar view gui (Damon)
-
- - Printing works again (Federico)
-
- - Config dialog improvement and implementation (Damon)
-
- - Todo and calendar conduits working, except for archiving (JP)
-
-Addressbook:
-
- - Lots of internal refactoring of addressbook, including changes due
- to gal. (Chris, Chris)
-
- - Lots of bug fixes. (Chris, Chris, Matt Bissiri, Iain, Dan)
-
- - Added a working field to save whether the contact wants
- HTML. (Chris Lahey)
-
- - Added "Stop" and "View All" toolbar buttons. (Chris Lahey)
-
- - Lots of work on modifiable LDAP. (Chris Toshok)
-
- - Recognizes a lot more Prefixes and Suffixes when parsing names. (Nat)
-
- - The card view doesn't write out cards unless they've changed. (Chris Lahey)
-
- - New layout of address editor dialog. (Anna, Chris Lahey)
-
-Version 0.5.1, "Salamended", 2000-09-15
----------------------------------------
-
-General:
-
- - Fixed a font-handling problem that would cause Evolution to crash
- at startup with certain Gtk themes. (Chris)
-
- - Fixed some build problems. (Chris)
-
- - We no longer ship an out-of-date Red Hat-only RPM spec file.
-
-Shell:
-
- - The shell now installs the `Sent' folder at startup if it doesn't
- exist yet. (Ettore)
-
- - If a component crashes unexpectedly, the shell displays a dialog
- box informing the user of that. (Ettore)
-
- - Fixed a bug in the folder selector dialog that would result in
- crashes while trying to move messages in the mailer. (Dan)
-
-Addressbook:
-
- - Fixed a bug that would cause the addressbook to crash when
- embedded in the composer. (Dan)
-
-Mail:
-
- - Fixed a display problem caused by expunging an IMAP folder. (Dan)
-
- - Fixed POP mail so that "keep on server" is obeyed correctly. (Dan,
- Jeff)
-
- - Fixed replies so that replying to a message twice doesn't turn off
- the "replied" flag. (Dan)
-
- - Fixed a bug that prevented "Send later" from working. (Dan)
-
-
-Version 0.5, "Salamander", 2000-09-13
--------------------------------------
-
-Shell:
-
- - Switched to using ETree for the folder view. (Chris Toshok,
- Ettore)
-
- - Added interfaces to change the string displayed in the tree view
- as the name of the folder. (Ettore)
-
-Calendar:
-
- - Uses only the new iCalendar standard internally; this means future
- interoperability with new calendaring programs. (JP, Federico)
-
- - New ultra-cool date range selector, aka little calendar. (Damon)
-
- - Plenty of internal refactoring. (JP, Damon, Federico)
-
- - Pilot synch work, mostly on pcs infrastructure and some todo work (JP)
- <EXPERIMENTAL>
-
- - Pilot synch work, mostly on pcs infrastructure and some todo work (JP)
- <EXPERIMENTAL>
-
-Addressbook:
-
- - New advanced search dialog. (Michael Zucchi, Chris Lahey)
-
- - Added parsing of addresses. (Jesse Pavel)
-
- - Converted most of addressbook to UTF8. (Lauris)
-
-Mailer:
-
- - Filters (but not vfolders) are now more powerful: they can check
- any message header, and can do regexp searches on the headers and
- body. (Jeff)
-
- - A first draft of an automated mailing list recognizer
- has been added. (It will need more/better rules.) (Ettore)
-
- - Attachments are handled differently now. All attachments always
- have an icon and a header, and you can right-click on the icon to
- view/hide, save, or launch an external viewer. (Dan)
-
- - It is no longer necessary to quit and restart after adding a new
- IMAP server. (Peter)
-
- - Lots of i18n/charset fixing. (Lauris)
-
- - Shiny new toolbar icons. (Tuomas)
-
- - Giant menu reorganization. Most message operations are now in the
- "Message" menu, and folder operations in the "Folder" menu.
- (Ettore, Dan, Peter)
-
- - "Mark as seen" timeout is now configurable. Mail view remembers
- the location of the message list/message display split. (Richard
- Hult)
-
- - New filter category: "On-demand", for filters to be applied
- at arbitrary times rather than during mail incorporation. (Peter)
-
- - POP/IMAP config pages allow you to specify a port... this may
- go away in a later release when we support ssl/ssh tunneling
- directly. (Peter)
-
- - Reply To All will now remove your own addresses from the recipient
- lists. (Jesse Pavel)
-
- - Folders are synced when you switch to another folder now. (Dan)
-
- - An IMAP bug that caused all messages to be marked as read before
- they were read has been fixed. (Dan)
-
- - The IMAP provider is now more robust about dealing with other
- concurrent IMAP clients. (Jeff)
-
- - POP and IMAP are better about when they do and don't try to
- reconnect. This was part of Camel operation cancellation support,
- which unfortunately didn't make it into 0.5. (Peter)
-
- - Sent and Outbox folders are now functional. You now have 2
- options when sending a message - "Send Now" which will send the
- message imediately and "Send Later" which will queue the message in
- Outbox for later sending. When a message is successfully sent, it
- is copied to the Sent folder for your records. (Jeff)
-
-ETable:
-
- - ETree fixes. (Chris Toshok)
-
- - Lots of small usability fixes. (Chris Lahey)
-
- - Lots of grouping bug fixes. Specifically, fixed crashes when
- grouping in trees and made ETable not go crazy when you change
- data and the table is grouped. (Chris Lahey)
-
- - Improved table printing when grouped. (Chris Lahey)
-
- - Converted most of ETable to UTF8. (Lauris)
-
-
-Version 0.4, "Alewife", 2000-08-14
-----------------------------------
-
-Shell:
-
- - Added interfaces to display messages and a progress bar when the
- component is busy. (Ettore)
-
- - Changed the shell BonoboUIHandler code to allow placing menu items
- such as "Print" in the right places. (Ettore)
-
- - Added code to check if an existing `~/evolution' directory
- actually has the content we expect and, if not, complain to the
- user. (Dan)
-
- - Fixed some Bonobo-related refcounting problems. (Michael Meeks)
-
- - Removed the GConf dependency. (JP)
-
- - Improved the API for the folder selection dialog. (Ettore)
-
- - Memory leak fixes. (Peter)
-
-Calendar:
-
- The calendar is in the middle of major rewrite. Evolution 0.4
- ships with essentially the same calendar component as 0.3 did.
-
-Addressbook:
-
- - More work on the Palm Pilot conduits. (Chris Toshok)
-
- - Fixed some LDAP-related crashes. (Chris Toshok)
-
- - Added support for displaying embedded vCards through a Bonobo
- component. (Chris Lahey)
-
- - Added support for generic fields. (Chris Lahey)
-
- - Fixed the navigation order for the Tab key in the contact editor
- window. (Chris Lahey)
-
- - Fixed some Bonobo-related bugs and crashes. (Chris Lahey, Michael
- Meeks)
-
- - Only display entries that have an email address in the address
- selector dialog. (Chris Lahey)
-
- - Added an utility program to import vCards from Gnomecard. (Chris
- Lahey)
-
-Mailer:
-
- Generic
-
- - Long mailer operations (such as fetching new mail) now run
- asynchronously rather than blocking the UI. This involved
- a major rewrite of much of the Camel and mailer code. (Peter)
-
- - GPG/PGP message decryption support (Nathan Thompson-Amato, Dan)
-
- - Unfinished messages in the composer can be saved to the "Drafts"
- folder and finished later. (Jeff)
-
- - Double-clicking on a message in the message view now opens it in a
- separate window. (Jeff)
-
- - vCards attached to messages now bring up a minicard view with a
- button to add the vCard to the addressbook (Chris Lahey, Dan)
-
- - Inline uuencoded/binhexed "attachment" support (Dan)
-
- - "Mark All Messages Seen" command. (Cody Russell)
-
- Filters / VFolders
-
- - Major filter/vfolder dialog rewrite (Michael Zucchi) VFolders can
- now search any (searchable) folder, not just Inbox.
-
- - Auto-filter/auto-vfolder code (right click on a message in the
- list and pick one of the options at the bottom of the menu to
- create a filter/vfolder rule for similar messages). (Michael)
-
- - You can now set the color of messages in the message list, based
- on filter rules. (Local stores can also now store arbitrary user
- flags, although there is not yet UI code to set/view them.)
- (Michael)
-
- - Added "Save" button to the quicksearch bar to save a search as a
- vfolder. (Michael)
-
- Configuration
-
- - Major mail config dialog rewrite (JP).
-
- - The mailer now remembers your threaded/unthreaded message view
- setting between sessions. (Jeremy Wise).
-
- - Support for multiple identities (JP, Jeff), sources (JP, Peter), and
- IMAP servers (JP, Dan)
-
- Providers
-
- - You can now leave POP mail on the server. (This will [currently]
- only work right with POP servers that support the UIDL command.
- On other servers, it will never download some messages unless you
- never delete mail.)
-
- - There is now an MH-like local store available, and code to convert
- a folder from one type to the other. (Michael)
-
- - The mbox provider now writes out "From " lines that are more
- compatible with other mailers (like Mutt) that are picky about
- their exact format. (Michael)
-
- - The IMAP provider now supports searching (Jeff). Also various
- other speed/efficiency/robustness improvements (Jeff), and support
- for old IMAP4 servers as well as IMAP4rev1 (Jon K Hellan).
-
-
-Version 0.3, "Jellyfish", 2000-07-21
-------------------------------------
-
-Shell:
-
- - Pop-up folder selection. (Ettore)
-
- - Added support for multiple views. (Ettore)
-
- - Added support for saving component-specific settings, and
- some initial code to save the view's configuration.
- (Ettore)
-
- - Fixed the Bonobo menu code so that it works with all the
- locales. (Ettore)
-
-Mailer:
-
- - Lots of IMAP fixes. (Jeff)
-
- - You can use an external setuid/setgid movemail program
- (although we don't ship our own yet). If you have one
- installed with emacs, the configure script will find
- that. Otherwise, you can specify --with-movemail=/path.
- (Dan)
-
- - You can toggle HTML/plain text for an individual message
- in the composer now. (Ettore)
-
- - Bonobo embedding sort of works again, but there are
- problems with size allocation somewhere. Attachments can now
- also be handled by external applications. (Dan)
-
- - text/plain mail is now line-wrapped in the mail display,
- to deal with people who don't put newlines in their mail.
- (Dan)
-
- - Allow user to specify IMAP namespace in the mail config
- dialog. (Dan, Jeff)
-
- - Quoted-printable encoder fixes. (Michael Zucchi)
-
- - Various NNTP fixes, include a news pane in the config
- dialog. (Chris Toshok)
-
- - Some memory corruption fixes. (Peter Williams)
-
- - Fix for message not being re-drawn as deleted. (Peter
- Williams, Jeff)
-
- - Moving a message to another folder copies the flags now
- (Jeff)
-
- - Close signature in HTML mail with </PRE>, not <PRE>, and
- default to ~/.signature. (Michael Meeks)
-
- - Fixed some confusing behavior in the message threading
- algorithm. (Dan)
-
- - Improvements to the item selection code. (Chris Lahey)
-
-Calendar:
-
- - Added support for a bunch of previously unsupported iCalendar
- properties. (Federico)
-
- - Conduit for synchronizing the calendar with gnome-pilot
- (requires gnome-pilot from CVS). (Seth)
-
- - ETable-based to-do list view ("taskpad"), for your viewing
- pleasure.
-
-Addressbook:
-
- - Conduit for synchronizing the addressbook with gnome-pilot
- (requires gnome-pilot from CVS). (Chris Toshok)
-
- - Conduit for synchronizing the addressbook with gnome-pilot
- (requires gnome-pilot from CVS). (Chris Toshok)
-
- - Fixed some random crashes. (Chris Lahey)
-
- - Implemented a vCard Bonobo control so that we can support
- inline vCard viewing in the mailer. (Chris Lahey)
-
- - Quick search looks at both the name and the company name now.
- (Chris Lahey)
-
- - Added more functionality to the contact editor's toolbar. (Chris
- Lahey)
-
- - Support for printing single cards. (Chris Lahey)
-
-Version 0.2, "Saccharomyces", 2000-07-11
-----------------------------------------
-
-Shell:
-
- * Folder selection dialog (Ettore).
-
- * Folder creation dialog (Ettore).
-
-Addressbook:
-
- * LDAP server configuration dialog (Chris Toshok).
-
- * Integration of LDAP servers in the shell's tree view (Chris Toshok).
-
- * ETable-based view (Chris Lahey).
-
- * Printing support for the ETable-based view (Chris Lahey).
-
- * Address selection dialog integrated with the message composer (Chris
- Lahey).
-
- * Many miscellaneous bugs fixed (everyone).
-
-Calendar:
-
- * Printing support (Michael, Federico).
-
- * Many, many behavior fixes and polishing to the day/week/month view
- widgets (Damon).
-
- * New glade-based event editor. This is unfinished but usable (Seth,
- Federico).
-
- * Mouse wheel scrolling support (Anders).
-
- * We have an awesome new engine for computing recurring events
- (Damon). This will be plugged in to the new iCalendar code.
-
- * Internal and public API fixes (Federico, Seth).
-
- * Shell-related changes (Ettore).
-
- * Data model for ETable; this is not used yet (Federico).
-
- * New iCalendar support; this is not used yet (Federico).
-
- * Pilot syncing updates; this is not used yet (Seth).
-
- * Many miscellaneous bugs fixed (everyone).
-
-
-Mailer:
-
- Major features:
-
- * Basic IMAP support (Jeff)
-
- * Threaded message view (Michael, Chris Toshok)
-
- * Filters now work (original work by Michael, bugfixes by Dan)
-
-
- Smaller features:
-
- * Implemented moving messages between folders (Dan)
-
- * Very basic printing support (Dan, but it was only like 5 lines
- of code, because gnome-print kicks ass)
-
- * "Delete", "Forward", and "Refile" operations now work on
- multiple messages. (Chris Lahey, Peter Williams, Dan)
-
- * Toggle read/unread flag when the user clicks on the envelope
- icon (Chris Lahey, Dan).
-
- * The "New folder" menu item now works (Ettore, Dan).
-
- * The filter/vfolder druid now uses the new shell folder selection
- UI (Michael)
-
- * Added "Cc" to the set of filter/vfolderable headers and make the
- filter/vfolder "messages to address" rule work with to or cc.
- (Dan)
-
- * New key bindings: "Delete" deletes the current message and jumps
- to the next undeleted message. "N" and "P" go to next/previous
- unread message. (Dan)
-
- * Keep asking for POP/IMAP password until the user gets it correct
- or hits Cancel, and remember the result until the user exits (or
- chooses "Forget Passwords"). (Dan, Jeff)
-
- * Kludge Camel to output ISO-8859-1 instead of UTF-8, since
- neither GtkHTML nor ETable supports UTF-8 still. (Dan)
-
- * Use the gnome-vfs "sniff buffer" interface to try to identify
- the MIME type of attachments without useful type information
- (Dan)
-
- * Allow saving drafts in the composer (Ettore)
-
- * Added "Received date" header to the set of possible message list
- headers. (Dan)
-
- * Partial gladification of the config dialog (JP Rosevear)
-
-
- Bug fixes:
-
- * Message read/unread/deleted flags should now be saved reliably
- when you exit, and summary should not be rebuilt when a rebuild
- isn't needed. Expunging should work reliably (Dan, Ettore,
- Jeff).
-
- * Fix disappearing toolbar bug (Dan).
-
- * Fixed a bug that made downloading of very large messages over
- POP incredibly slow, and various other smaller POP bugs. (Dan)
-
- * Fixed bugs that made large attachments sometimes get dropped and
- small ones sometimes get truncated. (Dan)
-
- * Fixed filter/vfolder "messages to address" rule to correctly
- match "to" rather than "from". (Michael)
-
- * Fix some text/plain formatting bugs in the composer. (Dan,
- Ettore)
-
- * Turn off search mode when getting new mail (to avoid corrupting
- the display). Make "get mail" always put unfiltered mail into
- Inbox rather than the current folder. (Dan)
-
- * Fixed a bug that caused "Re:" to be prepended even to subjects
- that started with "Re:" when replying. Added a default subject
- to forwarded messages. (Dan)
-
- * Make the "Attach" dialog in the composer remember the last
- directory it was in. (Dan)
-
- * Code to parse invalid date formats since some mailers generate
- them... (Jeff)
-
- * Fixed various small SMTP bugs (Jeff, Chris Lahey)
-
- * Fixed some memory leaks (Peter, Jeff)
-
- * Make replies use the text/plain part of a multipart/alternative
- if the user configured plain text rather than HTML mail sending.
- (Dan)
-
- * Various config dialog fixes (Jeff)
-
- * Partial filter/vfolder GUI facelift (Jacob)
diff --git a/README b/README
deleted file mode 100644
index 42f9923fea..0000000000
--- a/README
+++ /dev/null
@@ -1,170 +0,0 @@
-Evolution is the integrated mail, calendar and address book suite from
-the Evolution Team.
-
-See http://www.gnome.org/projects/evolution for more information.
-
-If you are using Evolution, you may wish to subscribe to the Evolution
-users mailing list. If you are interested in contributing to
-development on it, you should certainly subscribe to the Evolution
-Hackers mailing list. Visit
-
- http://lists.ximian.com
-
-to subscribe or view archives of the Ximian mailing lists.
-
-If you are planning to work on any part of Evolution, please send mail
-to the mailing list first, to avoid duplicated effort (and to make
-sure that you aren't basing your work on interfaces that are expected
-to change).
-
-There is also a #evolution IRC channel on irc.gnome.org.
-
-Help for Evolution is available in the user manual (select "Help" from
-the menu after running the application), at the Novell knowledge base
-(http://support.novell.com), in the Evolution man page (run "man
-evolution" at the command line), and in the --help strings (run
-"evolution --help" at the command line).
-
-The rest of this file is dedicated to building Evolution.
-
-
-DEPENDENCIES
-------------
-
-In order to build Evolution you need to have the full set of GNOME 2.6
-(or greater) development libraries installed.
-
-GNOME 2.6 or greater comes with most of the modern distributions, so
-in most cases it should be enough to just install all the devel
-packages from your distribution.
-
-Please make sure you have the most recent versions of the libraries
-installed, since bugs in the libraries can cause bugs in Evolution.
-
-Additional dependencies, besides the stock GNOME libraries (the
-dependencies should be compiled in the order they are listed here):
-
- * gnome-icon-theme 1.2.0 or later
-
- * ORBit 2.9.8 or later
-
- ftp://ftp.gnome.org/pub/gnome/sources/libsoup
-
- * libsoup 2.2.1 or later
-
- ftp://ftp.gnome.org/pub/gnome/sources/libsoup
-
- * evolution-data-server 1.1.1 or later
-
- ftp://ftp.gnome.org/pub/gnome/sources/evolution-data-server
-
- * gtkhtml 3.5.0 or later
-
- ftp://ftp.gnome.org/pub/gnome/sources/gtkhtml
-
- * gal 2.4.0 or later
-
- ftp://ftp.gnome.org/pub/gnome/sources/gal
-
- * [Optional] Mozilla NSPR/NSS libraries
-
- These are needed if you want to compile Evolution with SSL and S/MIME
- support.
-
- http://www.mozilla.org/
-
- Many distributions ship these as Mozilla development
- packages.
-
- * [Optional] gnome-pilot 2.0 or later
-
- This is only necessary if you want to be able to synchronize
- your Palm device with Evolution.
-
- ftp://ftp.gnome.org/pub/gnome/sources/gnome-pilot
- ftp://ftp.gnome.org/pub/gnome/sources/gnome-pilot-conduits
-
- * [Optional] gnome-spell 1.0.1 or later
-
- This is only necessary if you want to have the spell
- checking functionality in Evolution's message composer.
-
- ftp://ftp.gnome.org/pub/gnome/sources/gnome-spell
-
-CONFIGURING EVOLUTION
----------------------
-
-First you have to decide whether you want to install Evolution (and
-its dependencies) into the same prefix as the rest of your GNOME
-install, or into a new prefix.
-
-Installing everything into the same prefix as the rest of your GNOME
-install will make it much easier to build and run programs, and easier
-to switch between using packages and building it yourself, but it may
-also make it harder to uninstall later. Also, it increases the chance
-that something goes wrong and your GNOME installation gets ruined.
-
-If you want to install in a different prefix, you need to do the
-following things:
-
- * Set the PKG_CONFIG_PATH environment variable to contain a
- colon-separated list of all the pkg-config directories that
- will be involved in the build. This basically means a list
- of $prefix/lib/pkgconfig directory names, where $prefix is
- the prefix where a library is installed.
-
- For example, if you have GNOME installed in /usr and you
- are installing Evolution and its dependencies in
- /opt/evolution, you want to do something like the following
- (assuming you are using Bash):
-
- export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/opt/evolution/lib/pkgconfig
-
- * Edit the bonobo-activation-config.xml file (which is
- normally found in /etc/bonobo-activation/) to include the
- location where you are installing Evolution.
-
- In the example given above (GNOME in /usr, Evolution and
- dependencies in /opt/evolution), your
- bonobo-activation-config.xml will have to look like this:
-
- <?xml version="1.0"?>
- <oafconfig>
- <searchpath>
- <item>/usr/lib/bonobo/servers</item>
- <item>/opt/evolution/lib/bonobo/servers</item>
- </searchpath>
- </oafconfig>
-
- * Pass an appropriate --prefix parameter to the configure
- scripts of Evolution and its dependencies, eg:
-
- ./configure --prefix=/opt/evolution
-
-More information on how to use the configure script is available in
-the INSTALL file which is part of the Evolution tarball.
-
-
-OPTIONAL FEATURES
------------------
-
-Some optional features can be enabled at compilation time by passing
-appropriate flags to the configure script:
-
- * GNOME Pilot support.
-
- Assuming you have installed gnome-pilot, add the following
- options:
-
- --with-pisock=<prefix> --enable-pilot-conduits=yes
-
- Where <prefix> is the location where pilot-link (a package
- that gnome-pilot depends on) was installed.
-
- * SSL support.
-
- Make sure you have Mozilla's NSS nad NSPR libraries
- installed and pass the following flag:
-
- --enable-nss
-
diff --git a/README.translators b/README.translators
deleted file mode 100644
index 6349fc1f8c..0000000000
--- a/README.translators
+++ /dev/null
@@ -1,9 +0,0 @@
-Evolution is translated like most GNOME projects, by updating the the
-.po files in evolution/po and by translating the help files in
-evolution/help/C and placing them in a locale specific dir, ie
-evolution/help/fr. In addition, the default welcome message is in
-evolution/mail/default/C/Inbox and can be tranlated by translating the
-message in the file and also putting it in a locale specific dir, ie
-evolution/mail/default/fr/Inbox. The file name 'Inbox' should not be
-changed, as this is an internally defined string (the name in the
-folder list will still be translated though).
diff --git a/a11y/.cvsignore b/a11y/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/a11y/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/a11y/ChangeLog b/a11y/ChangeLog
deleted file mode 100644
index f905c5a39a..0000000000
--- a/a11y/ChangeLog
+++ /dev/null
@@ -1,328 +0,0 @@
-2005-02-01 Harry Lu <harry.lu@sun.com>
-
- Fix for 71924, 71926, 71932
- Don't split sentences that need translation.
- Also remove two useless variables.
-
- * calendar/ea-cal-view-event.c: (ea_cal_view_event_get_name):
- * calendar/ea-day-view.c: (ea_day_view_get_name):
- * calendar/ea-week-view.c: (ea_week_view_get_name),
- (ea_week_view_get_n_children):
- * widgets/ea-calendar-item.c: (ea_calendar_item_get_name),
- (e_calendar_item_get_offset_for_date):
-
-2005-01-31 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #71929
-
- * calendar/ea-day-view.c (ea_day_view_get_name):
- * calendar/ea-week-view.c (ea_week_view_get_name): don't use spaces
- before colons.
-
-2005-01-28 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * addressbook/ea-minicard-view.c
- (ea_minicard_view_get_name) : fix a typo present
- in the string too
-
-2005-01-28 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * addressbook/ea-minicard-view.c
- (ea_minicard_view_get_name) : use ngetext
- instead of splitting the the sentence to take care
- of different messages for plural vs singular case
- Fixes #61060
-
-2005-01-15 JP Rosevear <jpr@novell.com>
-
- * calendar/ea-calendar-helpers.c
- (ea_calendar_helpers_get_cal_view_from): use E_CALENDAR_VIEW, not
- E_CAL_VIEW
-
- Fixes #71306
-
- * calendar/Makefile.am: no need for any idl in this directory, it
- was not used anywhere
-
-2005-01-04 Harry Lu <harry.lu@sun.com>
-
- * widgets/Makefile.am: add ea-combo-button.[ch] to Makefile.
- * widgets/ea-combo-button.c:
- * widgets/ea-combo-button.h: implement a11y object for e-combo-button.
- * widgets/ea-widgets.c: (e_combo_button_a11y_init): set a11y factory.
- * widgets/ea-widgets.h: add declaration.
-
-2004-12-09 Harry Lu <harry.lu@sun.com>
-
- Fix a warning.
-
- * addressbook/ea-addressbook.c: (ea_addressbook_focus_watcher):
- use object instead of ATK_OBJECT (minicard).
-
-2004-12-1 Hao Sheng <hao.sheng@sun.com>
-
- * a11y/addressbook/ea-minicard.c:
- (atk_action_interface_do_action): Change e_minicard_activiate_editor to
- e_minicard_activate_editor.
-
-2004-11-08 Steven Zhang <steven.zhang@sun.com>
-
- Implement accessible feature for e-minicard and e-mini-card-view.
- Add get_n_children, ref_child, ref_state_set, atk_selection_interface,
- and action_interface for ea-minicard-view and ea-minicard
-
- *ea-minicard-view.c:
- (ea_minicard_view_get_n_children),
- (ea_minicard_view_ref_child),
- (ea_minicard_view_ref_state_set),
- (atk_selection_interface_init),
- (selection_interface_add_selection),
- (selection_interface_clear_selection),
- (selection_interface_ref_selection),
- (selection_interface_get_selection_count),
- (selection_interface_is_child_selected),
- (atk_action_interface_init),
- (atk_action_interface_do_action),
- (atk_action_interface_get_n_action),
- (atk_action_interface_get_description),
- (atk_action_interface_get_name).
-
- *ea-minicard.c:
- (ea_minicard_get_n_children),
- (ea_minicard_ref_child),
- (ea_minicard_ref_state_set),
- (atk_action_interface_init),
- (atk_action_interface_do_action),
- (atk_action_interface_get_n_action),
- (atk_action_interface_get_description),
- (atk_action_interface_get_name).
-
-2004-11-01 Li Yuan <li.yuan@sun.com>
-
- * calendar/ea-day-view.c: (ea_day_view_get_name):
- use ngettext for n_events.
- * calendar/ea-week-view.c: (ea_week_view_get_name):
- ditto.
-
-2004-10-26 Li Yuan <li.yuan@sun.com>
-
- * calendar/ea-day-view.c: (ea_day_view_get_name):
- * calendar/ea-gnome-calendar.c:
- (ea_gnome_calendar_get_label_description),
- (ea_gcal_dates_change_cb):
- * calendar/ea-gnome-calendar.h:
- * calendar/ea-week-view.c: (ea_week_view_get_name):
- for calendar_get_text_for_folder_bar_label has been removed form
- calendar-commands.c, we implement it ourself.
-
-2004-09-23 Li Yuan <li.yuan@sun.com>
-
- * calendar/ea-cal-view-event.c: (ea_cal_view_event_get_type),
- (ea_cal_view_event_get_name), (ea_cal_view_event_get_description):
- Make accessibility name and description translatable.
- (atk_action_interface_init), (ea_cal_view_event_do_action),
- (ea_cal_view_event_get_n_actions),
- (ea_cal_view_event_action_get_name):
- Add action interface to ea-cal-view-event so that it can be
- UI grabbed by GOK.
- * calendar/ea-cal-view.c:
- Make accessibility name and description translatable.
- * calendar/ea-day-view-cell.c: (ea_day_view_cell_new):
- Change atk role of ea-day-view-cell from ATK_ROLE_TABLE_CELL
- to ATK_ROLE_UNKNOWN so that it can be UI grabbed by GOK.
- (atk_component_interface_init), (component_interface_grab_focus):
- Add a component interface function : grab_focus.
- When grab focus, present the Evolution GUI to the front.
- * calendar/ea-day-view-main-item.c:
- (ea_day_view_main_item_get_description):
- Make accessibility name and description translatable.
- (ea_day_view_main_item_time_change_cb):
- Notify the item_cell is selected.
- * calendar/ea-day-view.c: (ea_day_view_get_name),
- (ea_day_view_get_description):
- Make accessibility name and description translatable.
- * calendar/ea-gnome-calendar.c: (ea_gnome_calendar_get_name),
- (ea_gnome_calendar_get_description), (ea_gnome_calendar_ref_child):
- Make accessibility name and description translatable.
- * calendar/ea-jump-button.c: (ea_jump_button_get_name),
- (ea_jump_button_get_description):
- Make accessibility name and description translatable.
- * calendar/ea-week-view-cell.c: (ea_week_view_cell_get_name),
- (atk_component_interface_init), (component_interface_get_extents),
- (component_interface_grab_focus):
- Add a component interface function : grab_focus.
- Add support for different week start days.
- When grab focus, present the Evolutioon GUI to the front.
- * calendar/ea-week-view-main-item.c: (ea_week_view_main_item_new):
- Set the atk role to ATK_ROLE_TABLE.
- (ea_week_view_main_item_get_description):
- Make accessibility name and description translatable.
- (ea_week_view_main_item_time_change_cb):
- Notify the item_cell is selected.
- * calendar/ea-week-view.c: (ea_week_view_get_name),
- (ea_week_view_get_description):
- Make accessibility name and description translatable.
- * widgets/ea-calendar-cell.c: (ea_calendar_cell_new):
- Change atk role of ea-calendar-cell from ATK_ROLE_TABLE_CELL
- to ATK_ROLE_UNKNOWN so that it can be UI grabbed by GOK.
- * widgets/ea-calendar-item.c: (ea_calendar_item_class_init),
- (ea_calendar_item_get_name), (ea_calendar_item_get_description):
- Make accessibility name and description translatable.
- (ea_calendar_item_ref_state_set),:
- Implement ref_state_set so that ea-calendar-item can be UI
- grabbed by GOK.
- (ea_calendar_item_destory_cell_data):
- Fix a crash here.
-
-2004-04-29 Rodney Dawes <dobey@ximian.com>
-
- * calendar/Makefile.am (INCLUDES): Add $(top_srcdir)/widgets/misc
- for the e-activity-handler.h stuff
-
-2004-04-22 Kidd Wang <kidd.wang@sun.com>
-
- * calendar/ea-week-view.c: (ea_week_view_get_n_children): If the
- week view has no spans, there is no visible events in the view.
-
-2004-03-15 JP Rosevear <jpr@ximian.com>
-
- * calendar/ea-cal-view.h: fix include
-
-2003-03-15 Hao Sheng <hao.sheng@sun.com>
-
- * Contritbuted by Leon Zhang <leon.zhang@sun.com>
- * Makefile.am: add directory addressbook.
- * implement basic accessbility addressbook's minicard.
- add new directory and Files below:
- addressbook/
- addressbook/Makefile.am
- addressbook/ea-addressbook.c
- addressbook/ea-addressbook-view.c
- addressbook/ea-minicard.c
- addressbook/ea-minicard-view.c
- addressbook/ea-addressbook.h
- addressbook/ea-addressbook-view.h
- addressbook/ea-minicard.h
- addressbook/ea-minicard-view.h
-
-2003-12-10 Bolian Yin <bolian.yin@sun.com>
-
- * calendar/ea-cal-view-event.c (ea_cal_view_event_get_index_in_parent): corret index error in week view.
- * calendar/ea-day-view-cell.c: impl. get_index_in_parent
- * calendar/ea-day-view-main-item.c: emit signal "active-descendant-changed", fix error in selection_interface_ref_selection.
- * widgets/ea-calendar-cell.c: impl. get_index_in_parent.
- * widgets/ea-calendar-item.c: change signature of e_calendar_item_get_offset_for_date, emit signal "active-descendant-changed".
-
-2003-12-09 Andrew Wu <Yang.Wu@sun.com>
-
- * calendar/Makefile.am: add entries for new source files
- * calendar/ea-calendar-helpers.c: add cases for jump button.
- * calendar/ea-calendar.c: add cases for week view and week view main item.
- * calendar/ea-jump-button.c: new impl.
- * calendar/ea-week-view-cell.c: new impl.
- * calendar/ea-week-view-main-item.c: new impl.
- * calendar/ea-week-view.c: add main item as first child.
-
-2003-12-05 Bolian Yin <bolian.yin@sun.com>
-
- * calendar/ea-cal-view-event.c (ea_cal_view_event_new): shortcut when cal_view is NULL.
- * calendar/ea-cal-view.c: Change an action name.
- * calendar/ea-calendar.c (ea_calendar_focus_watcher): add check for event atk object.
- * calendar/ea-week-view.c (ea_week_view_get_n_children): correct impl.
- (get_visible_text_item_count): removed.
-
-2003-12-06 JP Rosevear <jpr@ximian.com>
-
- * */Makefile.am: Remove hard coded disable deprecated flags
-
-2003-12-03 Ettore Perazzoli <ettore@ximian.com>
-
- * calendar/Makefile.am (SHELL_IDLS): Only get Evolution.idl.
-
-2003-11-11 Bolian Yin <bolian.yin@sun.com>
-
- Fixes #50538
-
- * new files:
- widgets/ea-calendar-cell.[hc]
-
- * widgets/ea-calendar-item: impl. atk selection and atk table interface.
-
- * widgets/Makefile.am : use shared object library (.so)
-
-2003-11-07 JP Rosevear <jpr@ximian.com>
-
- * calendar/Makefile.am (INCLUDES): don't include toplevel libical
-
-2003-11-07 JP Rosevear <jpr@ximian.com>
-
- * Handle some more renaming
-
-2003-11-07 JP Rosevear <jpr@ximian.com>
-
- * Reflect renaming of ECalView to ECalendarView
-
-2003-11-04 Bolian Yin <bolian.yin@sun.com>
-
- Fixes # 48509
-
- * new files:
- ea-cell-table.h ea-cell-table.c
- * calendar/Makefile.am: add entries for new files
- * calendar/New files added:
- ea-day-view-main-item.c ea-day-view-main-item.h
- ea-day-view-cell.c ea-day-view-cell.h
- * Add debug info and remove some non-C99 compilers warnings.
- * calendar/ea-cal-view: add action interface.
-
-2003-10-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * calendar/Makefile.am: INCLUDE path fixes for changes made to
- libical build.
-
-2003-08-27 Bolian Yin <bolian.yin@sun.com>
-
- * Makefile.am: add widgets directory; move calendar idl stuff to
- calendar directory; stop make a single shared lib for whole a11y
- stuff.
-
- * ea-factory.h: make factory macros available to GOBJECT
-
- * calendar/Makefile.am: add calendar idl stuff
-
- * calendar/ea-cal-view-event.c: add atkcomponent interface.
-
- * calendar/ea-gnome-calendar.c (ea_gcal_switch_view_cb): add
- details for "children_changed".
-
- * new widgets directory for widgets a11y stuff, new files are:
- widgets/Makefile.am, widgets/ea-calendar-item.c,
- widgets/ea-calendar-item.h, widgets/ea-widgets.c,
- widgets/ea-widgets.h
-
-2003-08-20 Rodrigo Moya <rodrigo@ximian.com>
-
- * calendar/ea-cal-view-event.c (ea_cal_view_event_get_name):
- adapted to changes in ECalViewEvent.
-
-2003-08-20 Bolian Yin <bolian.yin@sun.com>
- setup the a11y directory for evolution accessibility work
- New files are:
- ChangeLog
- ea-factory.h
- Makefile.am
- calendar/ea-calendar.c
- calendar/ea-calendar.h
- calendar/ea-calendar-helpers.c
- calendar/ea-calendar-helpers.h
- calendar/ea-cal-view.c
- calendar/ea-cal-view.h
- calendar/ea-cal-view-event.c
- calendar/ea-cal-view-event.h
- calendar/ea-day-view.c
- calendar/ea-day-view.h
- calendar/ea-week-view.c
- calendar/ea-week-view.h
- calendar/ea-gnome-calendar.c
- calendar/ea-gnome-calendar.h
- calendar/Makefile.am
diff --git a/a11y/Makefile.am b/a11y/Makefile.am
deleted file mode 100644
index c98e486e7f..0000000000
--- a/a11y/Makefile.am
+++ /dev/null
@@ -1,16 +0,0 @@
-SUBDIRS = . calendar widgets addressbook
-
-# for debug
-#A11Y_CFLAGS += -pedantic -ansi -DACC_DEBUG -Werror
-
-privlib_LTLIBRARIES = libevolution-a11y.la
-
-INCLUDES = \
- -I$(top_srcdir)/a11y \
- $(A11Y_CFLAGS)
-
-libevolution_a11y_la_SOURCES = \
- ea-factory.h \
- ea-cell-table.h \
- ea-cell-table.c
-
diff --git a/a11y/addressbook/.cvsignore b/a11y/addressbook/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/a11y/addressbook/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/a11y/addressbook/Makefile.am b/a11y/addressbook/Makefile.am
deleted file mode 100644
index dfabdf27ba..0000000000
--- a/a11y/addressbook/Makefile.am
+++ /dev/null
@@ -1,34 +0,0 @@
-privlib_LTLIBRARIES = libevolution-addressbook-a11y.la
-
-INCLUDES = \
- -DG_LOG_DOMAIN=\"evolution-a11y\" \
- -I$(top_srcdir) \
- -I$(top_srcdir)/a11y \
- -I$(top_srcdir)/a11y/addressbook \
- -I$(top_srcdir)/shell \
- -I$(top_srcdir)/addressbook \
- -I$(top_srcdir)/addressbook/gui \
- -I$(top_srcdir)/addressbook/gui/widgets \
- -I$(top_srcdir)/addressbook/gui/contact-editor \
- -I$(top_srcdir)/addressbook/backend \
- -I$(top_srcdir)/addressbook/backend/ebook \
- -DEVOLUTION_DATADIR=\""$(datadir)"\" \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_ETSPECDIR=\""$(etspecdir)"\" \
- -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \
- -DEVOLUTION_GALVIEWSDIR=\""$(viewsdir)"\" \
- -DEVOLUTION_UIDIR=\""$(evolutionuidir)"\" \
- -DG_DISABLE_DEPRECATED \
- -DPREFIX=\""$(prefix)"\" \
- $(A11Y_CFLAGS) \
- $(EVOLUTION_ADDRESSBOOK_CFLAGS)
-
-libevolution_addressbook_a11y_la_SOURCES = \
- ea-minicard.c \
- ea-minicard.h \
- ea-minicard-view.c \
- ea-minicard-view.h \
- ea-addressbook-view.c \
- ea-addressbook-view.h \
- ea-addressbook.c \
- ea-addressbook.h
diff --git a/a11y/addressbook/ea-addressbook-view.c b/a11y/addressbook/ea-addressbook-view.c
deleted file mode 100644
index 1d26767a79..0000000000
--- a/a11y/addressbook/ea-addressbook-view.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * ea-addressbook-view.c
- * Copyright (C) 2000 Ximian, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Leon Zhang <leon.zhang@sun.com> Sun Microsystem Inc., 2003
- */
-
-#include <config.h>
-
-#include <libgnome/gnome-i18n.h>
-#include "ea-addressbook-view.h"
-
-static G_CONST_RETURN gchar* ea_ab_view_get_name (AtkObject *accessible);
-static G_CONST_RETURN gchar* ea_ab_view_get_description (AtkObject *accessible);
-
-static void ea_ab_view_class_init (EABViewClass *klass);
-
-static gpointer parent_class = NULL;
-
-GType
-ea_ab_view_get_type (void)
-{
- static GType type = 0;
- AtkObjectFactory *factory;
- GTypeQuery query;
- GType derived_atk_type;
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (EABViewClass),
- (GBaseInitFunc) NULL, /* base_init */
- (GBaseFinalizeFunc) NULL, /* base_finalize */
- (GClassInitFunc) ea_ab_view_class_init,
- (GClassFinalizeFunc) NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EaABView),
- 0, /* n_preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- /*
- * Figure out the size of the class and instance
- * we are run-time deriving from (GailWidget, in this case) */
-
- factory = atk_registry_get_factory (atk_get_default_registry (),
- GTK_TYPE_EVENT_BOX);
- derived_atk_type = atk_object_factory_get_accessible_type (factory);
- g_type_query (derived_atk_type, &query);
-
- tinfo.class_size = query.class_size;
- tinfo.instance_size = query.instance_size;
-
- type = g_type_register_static (derived_atk_type,
- "EaABView", &tinfo, 0);
- }
-
- return type;
-}
-
-static void
-ea_ab_view_class_init (EABViewClass *klass)
-{
- AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_peek_parent (klass);
-
- class->get_name = ea_ab_view_get_name;
- class->get_description = ea_ab_view_get_description;
-}
-
-static G_CONST_RETURN gchar*
-ea_ab_view_get_name (AtkObject *accessible)
-{
- g_return_val_if_fail (EA_IS_AB_VIEW(accessible), NULL);
- if (accessible->name)
- return accessible->name;
-
- return _("evolution addressbook");
-}
-
-static G_CONST_RETURN gchar*
-ea_ab_view_get_description (AtkObject *accessible)
-{
- if (accessible->description)
- return accessible->description;
-
- return _("evolution addressbook");
-}
-
-AtkObject*
-ea_ab_view_new (GObject *obj)
-{
- GObject *object;
- AtkObject *accessible;
-
- g_return_val_if_fail(obj != NULL, NULL);
- g_return_val_if_fail (E_IS_ADDRESSBOOK_VIEW(obj), NULL);
-
- object = g_object_new (EA_TYPE_AB_VIEW, NULL);
-
- accessible = ATK_OBJECT (object);
- atk_object_initialize (accessible, obj);
- accessible->role = ATK_ROLE_CANVAS;
-
- return accessible;
-}
diff --git a/a11y/addressbook/ea-addressbook-view.h b/a11y/addressbook/ea-addressbook-view.h
deleted file mode 100644
index 94f6b2b452..0000000000
--- a/a11y/addressbook/ea-addressbook-view.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * ea-addressbook_view.h
- * Copyright (C) 2000 Ximian, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Leon Zhang <leon.zhang@sun.com> Sun Microsystem Inc., 2003
- */
-#ifndef __EA_ADDRESSBOOK_VIEW_H__
-#define __EA_ADDRESSBOOK_VIEW_H__
-
-#include <gtk/gtkaccessible.h>
-#include "e-addressbook-view.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define EA_TYPE_AB_VIEW (ea_ab_view_get_type ())
-#define EA_AB_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_AB_VIEW, EaABView))
-#define EA_AB_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_AB_VIEW, EaABViewClass))
-#define EA_IS_AB_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_AB_VIEW))
-#define EA_IS_AB_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EA_TYPE_AB_VIEW))
-
-typedef struct _EaABView EaABView;
-typedef struct _EaABViewClass EaABViewClass;
-
-struct _EaABView
-{
- GtkAccessible parent;
-};
-
-
-struct _EaABViewClass
-{
- GtkAccessibleClass parent_class;
-};
-
-GType ea_ab_view_get_type (void);
-AtkObject* ea_ab_view_new(GObject *obj);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __EA_ADDRESSBOOK_VIEW_H__ */
diff --git a/a11y/addressbook/ea-addressbook.c b/a11y/addressbook/ea-addressbook.c
deleted file mode 100644
index 1abe1f2a4d..0000000000
--- a/a11y/addressbook/ea-addressbook.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-addressbook.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Leon Zhang <leon.zhang@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#include <gal/e-text/e-text.h>
-#include "ea-factory.h"
-#include "ea-addressbook.h"
-#include "addressbook/ea-minicard.h"
-#include "addressbook/ea-minicard-view.h"
-#include "addressbook/ea-addressbook-view.h"
-
-EA_FACTORY_GOBJECT (EA_TYPE_MINICARD, ea_minicard, ea_minicard_new);
-EA_FACTORY_GOBJECT (EA_TYPE_MINICARD_VIEW, ea_minicard_view, ea_minicard_view_new);
-EA_FACTORY_GOBJECT (EA_TYPE_AB_VIEW, ea_ab_view, ea_ab_view_new);
-
-static gboolean ea_addressbook_focus_watcher (GSignalInvocationHint *ihint,
- guint n_param_values,
- const GValue *param_values,
- gpointer data);
-
-void e_minicard_a11y_init (void)
-{
- EA_SET_FACTORY (e_minicard_get_type (), ea_minicard);
-}
-
-void e_minicard_view_a11y_init (void)
-{
- EA_SET_FACTORY (e_minicard_view_get_type (), ea_minicard_view);
-
- if (atk_get_root ()) {
- g_signal_add_emission_hook (g_signal_lookup ("event",
- e_minicard_get_type()),
- 0, ea_addressbook_focus_watcher,
- NULL, (GDestroyNotify) NULL);
- }
-}
-
-void eab_view_a11y_init (void)
-{
- EA_SET_FACTORY (eab_view_get_type (), ea_ab_view);
-}
-
-gboolean
-ea_addressbook_focus_watcher (GSignalInvocationHint *ihint,
- guint n_param_values,
- const GValue *param_values,
- gpointer data)
-{
- GObject *object;
- GdkEvent *event;
- AtkObject *ea_event = NULL;
-
- object = g_value_get_object (param_values + 0);
- event = g_value_get_boxed (param_values + 1);
-
- if (E_IS_MINICARD (object)) {
- GnomeCanvasItem *item = GNOME_CANVAS_ITEM (object);
- ea_event = atk_gobject_accessible_for_object (object);
- if (event->type == GDK_FOCUS_CHANGE) {
- if ((event->focus_change.in) && (E_IS_MINICARD (item->canvas->focused_item)))
- atk_focus_tracker_notify (ea_event);
- }
- }
-
- return TRUE;
-}
diff --git a/a11y/addressbook/ea-addressbook.h b/a11y/addressbook/ea-addressbook.h
deleted file mode 100644
index 437d34f1cc..0000000000
--- a/a11y/addressbook/ea-addressbook.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-addressbook.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Leon Zhang <leon.zhang@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-/* Evolution Accessibility
-*/
-
-#ifndef _EA_ADDRESSBOOK_H__
-#define _EA_ADDRESSBOOK_H__
-
-void eab_view_a11y_init (void);
-void e_minicard_view_a11y_init (void);
-void e_minicard_a11y_init (void);
-
-#endif /* _EA_ADDRESSBOOK_H__ */
diff --git a/a11y/addressbook/ea-minicard-view.c b/a11y/addressbook/ea-minicard-view.c
deleted file mode 100644
index a2d87d967f..0000000000
--- a/a11y/addressbook/ea-minicard-view.c
+++ /dev/null
@@ -1,406 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * ea-minicard-view.c
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Leon Zhang < leon.zhang@sun.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-#include <libgnome/gnome-i18n.h>
-#include <string.h>
-#include <gtk/gtkaccessible.h>
-#include <glib/gstrfuncs.h>
-#include <libgnome/gnome-i18n.h>
-#include "ea-minicard.h"
-#include "ea-minicard-view.h"
-#include "eab-gui-util.h"
-#include "e-addressbook-view.h"
-
-static const char * action_name[] = {
- N_("New Contact"),
- N_("New Contact List")
-};
-
-
-static G_CONST_RETURN gchar* ea_minicard_view_get_name (AtkObject *accessible);
-static G_CONST_RETURN gchar* ea_minicard_view_get_description (AtkObject *accessible);
-
-static void ea_minicard_view_class_init (EaMinicardViewClass *klass);
-
-static gint ea_minicard_view_get_n_children (AtkObject *obj);
-static AtkObject *ea_minicard_view_ref_child (AtkObject *obj, gint i);
-
-static AtkStateSet *ea_minicard_view_ref_state_set(AtkObject *obj);
-
-static void atk_selection_interface_init (AtkSelectionIface *iface);
-static gboolean selection_interface_add_selection (AtkSelection *selection,
- gint i);
-static gboolean selection_interface_clear_selection (AtkSelection *selection);
-static AtkObject* selection_interface_ref_selection (AtkSelection *selection,
- gint i);
-static gint selection_interface_get_selection_count (AtkSelection *selection);
-static gboolean selection_interface_is_child_selected (AtkSelection *selection,
- gint i);
-
-static void atk_action_interface_init (AtkActionIface *iface);
-static gboolean atk_action_interface_do_action (AtkAction *iface, gint i);
-static gint atk_action_interface_get_n_action (AtkAction *iface);
-static G_CONST_RETURN gchar* atk_action_interface_get_description (AtkAction *iface, gint i);
-static G_CONST_RETURN gchar* atk_action_interface_get_name (AtkAction *iface, gint i);
-
-static gpointer parent_class = NULL;
-
-GType
-ea_minicard_view_get_type (void)
-{
- static GType type = 0;
- AtkObjectFactory *factory;
- GTypeQuery query;
- GType derived_atk_type;
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (EaMinicardViewClass),
- (GBaseInitFunc) NULL, /* base_init */
- (GBaseFinalizeFunc) NULL, /* base_finalize */
- (GClassInitFunc) ea_minicard_view_class_init,
- (GClassFinalizeFunc) NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EaMinicardView),
- 0, /* n_preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- static const GInterfaceInfo atk_selection_info = {
- (GInterfaceInitFunc) atk_selection_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
-
- static const GInterfaceInfo atk_action_info = {
- (GInterfaceInitFunc) atk_action_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
-
- /*
- * Figure out the size of the class and instance
- * we are run-time deriving from (GailWidget, in this case) */
-
- factory = atk_registry_get_factory (atk_get_default_registry (),
- GNOME_TYPE_CANVAS_GROUP);
- derived_atk_type = atk_object_factory_get_accessible_type (factory);
- g_type_query (derived_atk_type, &query);
-
- tinfo.class_size = query.class_size;
- tinfo.instance_size = query.instance_size;
-
- type = g_type_register_static (derived_atk_type,
- "EaMinicardView", &tinfo, 0);
- g_type_add_interface_static (type, ATK_TYPE_SELECTION,
- &atk_selection_info);
- g_type_add_interface_static (type, ATK_TYPE_ACTION,
- &atk_action_info);
-
- }
-
- return type;
-}
-
-static void
-ea_minicard_view_class_init (EaMinicardViewClass *klass)
-{
- AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_peek_parent (klass);
-
- class->get_name = ea_minicard_view_get_name;
- class->get_description = ea_minicard_view_get_description;
- class->ref_state_set = ea_minicard_view_ref_state_set;
- class->get_n_children = ea_minicard_view_get_n_children;
- class->ref_child = ea_minicard_view_ref_child;
-}
-
-static G_CONST_RETURN gchar*
-ea_minicard_view_get_name (AtkObject *accessible)
-{
- EReflow *reflow;
- gchar *string;
-
- g_return_val_if_fail (EA_IS_MINICARD_VIEW (accessible), NULL);
-
- reflow = E_REFLOW(atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (accessible)));
-
- string = g_strdup_printf (ngettext ("current addressbook folder has %d card",
- "current addressbook folder has %d cards",
- reflow->count), reflow->count);
-
-
- ATK_OBJECT_CLASS (parent_class)->set_name (accessible, string);
- g_free (string);
- return accessible->name;
-}
-
-static G_CONST_RETURN gchar*
-ea_minicard_view_get_description (AtkObject *accessible)
-{
- g_return_val_if_fail (EA_IS_MINICARD_VIEW(accessible), NULL);
- if (accessible->description)
- return accessible->description;
-
- return _("evolution addressbook");
-}
-
-AtkObject*
-ea_minicard_view_new (GObject *obj)
-{
- GObject *object;
- AtkObject *accessible;
-
- g_return_val_if_fail (E_IS_MINICARD_VIEW(obj), NULL);
- object = g_object_new (EA_TYPE_MINICARD_VIEW, NULL);
- accessible = ATK_OBJECT (object);
- atk_object_initialize (accessible, obj);
- accessible->role = ATK_ROLE_UNKNOWN;
- return accessible;
-}
-
-static gint
-ea_minicard_view_get_n_children (AtkObject *accessible)
-{
- EReflow *reflow;
-
- gint child_num = 0;
-
- g_return_val_if_fail (EA_IS_MINICARD_VIEW (accessible), -1);
-
- reflow = E_REFLOW (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE(accessible)));
-
- if (!reflow)
- return -1;
-
- child_num = reflow->count;
-
- return child_num;
-}
-
-static AtkStateSet *ea_minicard_view_ref_state_set (AtkObject *obj)
-{
- AtkStateSet *state_set = NULL;
- GObject *gobj = NULL;
-
- state_set = ATK_OBJECT_CLASS (parent_class)->ref_state_set (obj);
- if( !state_set )
- return NULL;
- gobj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (obj));
- if( !gobj )
- return NULL;
-
- atk_state_set_add_state (state_set, ATK_STATE_ENABLED);
- atk_state_set_add_state (state_set, ATK_STATE_SENSITIVE);
- atk_state_set_add_state (state_set, ATK_STATE_SHOWING);
-
- return state_set;
-}
-
-static AtkObject *
-ea_minicard_view_ref_child (AtkObject *accessible, gint index)
-{
- EReflow *reflow;
- gint child_num;
- AtkObject *atk_object = NULL;
- EMinicard *card = NULL;
-
- g_return_val_if_fail (EA_IS_MINICARD_VIEW (accessible), NULL);
-
- child_num = atk_object_get_n_accessible_children (accessible);
- if (child_num <= 0 || index < 0 || index >= child_num)
- return NULL;
-
- reflow = E_REFLOW (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (accessible)));
- if (!reflow)
- return NULL;
- if (!reflow->items )
- return NULL;
- /* a minicard */
- if (index < child_num) {
- card = E_MINICARD (reflow->items[index]);
- atk_object = atk_gobject_accessible_for_object (G_OBJECT (card));
- } else {
- return NULL;
- }
-
- g_object_ref (atk_object);
- return atk_object;
-}
-
-/* atkselection interface */
-
-static void
-atk_selection_interface_init (AtkSelectionIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->add_selection = selection_interface_add_selection;
- iface->clear_selection = selection_interface_clear_selection;
- iface->ref_selection = selection_interface_ref_selection;
- iface->get_selection_count = selection_interface_get_selection_count;
- iface->is_child_selected = selection_interface_is_child_selected;
-}
-
-static gboolean
-selection_interface_add_selection (AtkSelection *selection, gint i)
-{
- AtkGObjectAccessible *atk_gobj= NULL;
- EReflow *reflow = NULL;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (selection);
- reflow = E_REFLOW (atk_gobject_accessible_get_object (atk_gobj));
-
- if (!reflow)
- return FALSE;
-
- selection_interface_clear_selection (selection);
- e_selection_model_select_single_row (reflow->selection, i);
-
- return TRUE;
-}
-
-static gboolean
-selection_interface_clear_selection (AtkSelection *selection)
-{
- AtkGObjectAccessible *atk_gobj = NULL;
- EReflow *reflow = NULL;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (selection);
- reflow = E_REFLOW(atk_gobject_accessible_get_object (atk_gobj));
-
- if( !reflow )
- return FALSE;
-
- e_selection_model_clear (reflow->selection);
-
- return TRUE;
-}
-
-static AtkObject*
-selection_interface_ref_selection (AtkSelection *selection, gint i)
-{
- return ea_minicard_view_ref_child (ATK_OBJECT (selection), i);
-}
-
-static gint
-selection_interface_get_selection_count (AtkSelection *selection)
-{
- AtkGObjectAccessible *atk_gobj = NULL;
- EReflow *reflow = NULL;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (selection);
- reflow = E_REFLOW (atk_gobject_accessible_get_object (atk_gobj));
-
- if (!reflow )
- return FALSE;
-
- return e_selection_model_selected_count (reflow->selection);
-}
-
-static gboolean
-selection_interface_is_child_selected (AtkSelection *selection, gint i)
-{
- AtkGObjectAccessible *atk_gobj = NULL;
- EReflow *reflow = NULL;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (selection);
- reflow = E_REFLOW(atk_gobject_accessible_get_object (atk_gobj));
-
- if( !reflow )
- return FALSE;
-
- return e_selection_model_is_row_selected (reflow->selection, i);
-}
-
-static void atk_action_interface_init (AtkActionIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->do_action = atk_action_interface_do_action;
- iface->get_n_actions = atk_action_interface_get_n_action;
- iface->get_description = atk_action_interface_get_description;
- iface->get_name = atk_action_interface_get_name;
-}
-
-static gboolean atk_action_interface_do_action (AtkAction *action, gint i)
-{
- gboolean return_value = TRUE;
- EMinicardView *card_view;
- EContact *contact = e_contact_new();
-
- AtkGObjectAccessible *atk_gobj= NULL;
- EReflow *reflow = NULL;
- EBook *book;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (action);
- reflow = E_REFLOW (atk_gobject_accessible_get_object (atk_gobj));
-
- if (reflow == NULL)
- return FALSE;
-
- card_view = E_MINICARD_VIEW (reflow);
- g_object_get(card_view,
- "book", &book,
- NULL);
- g_assert (E_IS_BOOK (book));
-
- switch (i) {
- case 0:
- /* New Contact */
- eab_show_contact_editor (book, contact, TRUE, TRUE);
- break;
- case 1:
- /* New Contact List */
- eab_show_contact_list_editor (book, contact, TRUE, TRUE);
- break;
- default:
- return_value = FALSE;
- break;
- }
- g_object_unref (book);
- g_object_unref (contact);
- return return_value;
-}
-
-static gint atk_action_interface_get_n_action (AtkAction *iface)
-{
- return G_N_ELEMENTS (action_name);
-}
-
-static G_CONST_RETURN gchar*
-atk_action_interface_get_description (AtkAction *iface, gint i)
-{
- return atk_action_interface_get_name (iface, i);
-}
-
-static G_CONST_RETURN gchar*
-atk_action_interface_get_name (AtkAction *iface, gint i)
-{
- if( i >= G_N_ELEMENTS (action_name) || i < 0)
- return NULL;
-
- return action_name[i];
-}
-
diff --git a/a11y/addressbook/ea-minicard-view.h b/a11y/addressbook/ea-minicard-view.h
deleted file mode 100644
index e983ae5229..0000000000
--- a/a11y/addressbook/ea-minicard-view.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * ea-minicard-view.h
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Leon Zhang <leon.zhang@sun.com> Sun Microsystem Inc., 2003
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-#ifndef __EA_MINICARD_VIEW_H__
-#define __EA_MINICARD_VIEW_H__
-
-#include <atk/atkgobjectaccessible.h>
-#include "e-minicard-view.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define EA_TYPE_MINICARD_VIEW (ea_minicard_view_get_type ())
-#define EA_MINICARD_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_MINICARD_VIEW, EaMinicardView))
-#define EA_MINICARD_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_MINICARD_VIEW, EaMiniCardViewClass))
-#define EA_IS_MINICARD_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_MINICARD_VIEW))
-#define EA_IS_MINICARD_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EA_TYPE_MINICARD_VIEW))
-
-
-typedef struct _EaMinicardView EaMinicardView;
-typedef struct _EaMinicardViewClass EaMinicardViewClass;
-
-struct _EaMinicardView
-{
- AtkGObjectAccessible parent;
-};
-
-
-struct _EaMinicardViewClass
-{
- AtkGObjectAccessibleClass parent_class;
-};
-
-GType ea_minicard_view_get_type (void);
-
-AtkObject* ea_minicard_view_new(GObject *obj);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __EA_MINICARD_VIEW_H__ */
diff --git a/a11y/addressbook/ea-minicard.c b/a11y/addressbook/ea-minicard.c
deleted file mode 100644
index 728ac88e8d..0000000000
--- a/a11y/addressbook/ea-minicard.c
+++ /dev/null
@@ -1,269 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * ea-minicard.c
- * Copyright (C) 2000 Ximian, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Leon Zhang <leon.zhang@sun.com> Sun Microsystem Inc., 2003
- */
-
-#include <config.h>
-#include <string.h>
-#include <libgnome/gnome-i18n.h>
-#include "ea-minicard.h"
-#include "ea-minicard-view.h"
-#include "e-minicard.h"
-
-static const char * action_name[] = {
- N_("Open")
-};
-
-static G_CONST_RETURN gchar* ea_minicard_get_name (AtkObject *accessible);
-static G_CONST_RETURN gchar* ea_minicard_get_description (AtkObject *accessible);
-
-static void ea_minicard_class_init (EaMinicardClass *klass);
-
-static gint ea_minicard_get_n_children (AtkObject *obj);
-static AtkObject* ea_minicard_ref_child(AtkObject *obj, gint i);
-
-static AtkStateSet *ea_minicard_ref_state_set (AtkObject *obj);
-
-static void atk_action_interface_init (AtkActionIface *iface);
-static gboolean atk_action_interface_do_action (AtkAction *iface, gint i);
-static gint atk_action_interface_get_n_action (AtkAction *iface);
-static G_CONST_RETURN gchar* atk_action_interface_get_description (AtkAction *iface, gint i);
-static G_CONST_RETURN gchar* atk_action_interface_get_name (AtkAction *iface, gint i);
-
-static gpointer parent_class = NULL;
-
-GType
-ea_minicard_get_type (void)
-{
- static GType type = 0;
- AtkObjectFactory *factory;
- GTypeQuery query;
- GType derived_atk_type;
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (EaMinicardClass),
- (GBaseInitFunc) NULL, /* base_init */
- (GBaseFinalizeFunc) NULL, /* base_finalize */
- (GClassInitFunc) ea_minicard_class_init,
- (GClassFinalizeFunc) NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EaMinicard),
- 0, /* n_preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- static const GInterfaceInfo atk_action_info = {
- (GInterfaceInitFunc) atk_action_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
-
- /*
- * Figure out the size of the class and instance
- * we are run-time deriving from (GailWidget, in this case)
- */
-
- factory = atk_registry_get_factory (atk_get_default_registry (),
- GNOME_TYPE_CANVAS_GROUP);
- derived_atk_type = atk_object_factory_get_accessible_type (factory);
- g_type_query (derived_atk_type, &query);
-
- tinfo.class_size = query.class_size;
- tinfo.instance_size = query.instance_size;
-
- type = g_type_register_static ( derived_atk_type,
- "EaMinicard", &tinfo, 0);
- g_type_add_interface_static (type, ATK_TYPE_ACTION,
- &atk_action_info);
- }
-
- return type;
-}
-
-static void
-ea_minicard_class_init (EaMinicardClass *klass)
-{
- AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_peek_parent (klass);
-
- class->get_name = ea_minicard_get_name;
- class->get_description = ea_minicard_get_description;
- class->ref_state_set = ea_minicard_ref_state_set;
- class->get_n_children = ea_minicard_get_n_children;
- class->ref_child = ea_minicard_ref_child;
-}
-
-/*
- * we access the main content of current minicard, including
- * header text, label(field, field name)
- */
-static G_CONST_RETURN gchar*
-ea_minicard_get_name (AtkObject *accessible)
-{
-#define BUFFERSIZE 500
-
- static gchar name[BUFFERSIZE];
- GString *new_str = g_string_new (NULL);
- gchar *string;
- EMinicard *card;
-
- g_return_val_if_fail (EA_IS_MINICARD(accessible), NULL);
- memset (name, '\0', BUFFERSIZE);
-
- card = E_MINICARD(atk_gobject_accessible_get_object
- (ATK_GOBJECT_ACCESSIBLE(accessible)));
- g_object_get (card->header_text, "text", &string, NULL);
-
- if (e_contact_get (card->contact, E_CONTACT_IS_LIST))
- g_string_append (new_str, _("Contact List: "));
- else g_string_append (new_str, _("Contact: "));
-
- /* get header of current card */
- g_string_append (new_str, string);
- g_free (string);
-
- /* if there exist no enough space for remain info, return */
- if (new_str->len >= BUFFERSIZE) {
- strncpy (name, new_str->str, BUFFERSIZE);
- return name;
- }
-
- strcpy (name, new_str->str);
- g_string_free (new_str, TRUE);
-
- ATK_OBJECT_CLASS (parent_class)->set_name (accessible, name);
-
- return accessible->name;
-}
-
-static G_CONST_RETURN gchar*
-ea_minicard_get_description (AtkObject *accessible)
-{
- if (accessible->description)
- return accessible->description;
-
- return _("evolution minicard");
-}
-
-AtkObject*
-ea_minicard_new (GObject *obj)
-{
- GObject *object;
- AtkObject *accessible;
-
- g_return_val_if_fail(obj != NULL, NULL);
- g_return_val_if_fail (E_IS_MINICARD(obj), NULL);
-
- object = g_object_new (EA_TYPE_MINICARD, NULL);
- accessible = ATK_OBJECT (object);
- atk_object_initialize (accessible, obj);
-
- accessible->role = ATK_ROLE_UNKNOWN;
- return accessible;
-}
-
-static AtkStateSet *ea_minicard_ref_state_set (AtkObject *obj)
-{
- AtkStateSet *state_set = NULL;
- GObject *gobj = NULL;
-
- state_set = ATK_OBJECT_CLASS (parent_class)->ref_state_set (obj);
- if( !state_set )
- return NULL;
- gobj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (obj));
- if( !gobj )
- return NULL;
-
- atk_state_set_add_state (state_set, ATK_STATE_SELECTABLE);
- atk_state_set_add_state (state_set, ATK_STATE_ENABLED);
- atk_state_set_add_state (state_set, ATK_STATE_SENSITIVE);
- atk_state_set_add_state (state_set, ATK_STATE_SHOWING);
-
- return state_set;
-}
-
-static gint
-ea_minicard_get_n_children (AtkObject *accessible)
-{
- return 0;
-}
-
-static AtkObject *
-ea_minicard_ref_child (AtkObject *accessible, gint index)
-{
- return NULL;
-}
-
-static void atk_action_interface_init (AtkActionIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->do_action = atk_action_interface_do_action;
- iface->get_n_actions = atk_action_interface_get_n_action;
- iface->get_description = atk_action_interface_get_description;
- iface->get_name = atk_action_interface_get_name;
-}
-
-static gboolean atk_action_interface_do_action (AtkAction *iface, gint i)
-{
- EMinicard *minicard = NULL;
-
- minicard = E_MINICARD (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (iface)));
- if( minicard == NULL )
- return FALSE;
-
- if( i >= G_N_ELEMENTS (action_name) || i < 0 )
- return FALSE;
-
- switch (i) {
- // open card
- case 0:
- e_minicard_activate_editor (minicard);
- break;
- default:
- return FALSE;
- }
-
- return TRUE;
-}
-
-static gint atk_action_interface_get_n_action (AtkAction *iface)
-{
- return G_N_ELEMENTS (action_name);
-}
-
-static G_CONST_RETURN gchar*
-atk_action_interface_get_description (AtkAction *iface, gint i)
-{
- return atk_action_interface_get_name (iface, i);
-}
-
-static G_CONST_RETURN gchar*
-atk_action_interface_get_name (AtkAction *iface, gint i)
-{
- if( i >= G_N_ELEMENTS (action_name) || i < 0)
- return NULL;
-
- return action_name[i];
-}
-
diff --git a/a11y/addressbook/ea-minicard.h b/a11y/addressbook/ea-minicard.h
deleted file mode 100644
index 1b09ec6839..0000000000
--- a/a11y/addressbook/ea-minicard.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * ea-minicard.h
- * Copyright (C) 2000 Ximian, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Leon Zhang <leon.zhang@sun.com> Sun Microsystem Inc., 2003
- */
-#ifndef __EA_MINICARD_H__
-#define __EA_MINICARD_H__
-
-#include <atk/atkgobjectaccessible.h>
-#include "e-minicard.h"
-#include "e-minicard-label.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define EA_TYPE_MINICARD (ea_minicard_get_type ())
-#define EA_MINICARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_MINICARD, EaMinicard))
-#define EA_MINICARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_MINICARD, EaMiniCardClass))
-#define EA_IS_MINICARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_MINICARD))
-#define EA_IS_MINICARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EA_TYPE_MINICARD))
-
-typedef struct _EaMinicard EaMinicard;
-typedef struct _EaMinicardClass EaMinicardClass;
-
-struct _EaMinicard
-{
- AtkGObjectAccessible parent;
-};
-
-
-struct _EaMinicardClass
-{
- AtkGObjectAccessibleClass parent_class;
-};
-
-GType ea_minicard_get_type (void);
-AtkObject* ea_minicard_new(GObject *obj);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __EA_MINICARD_H__ */
diff --git a/a11y/calendar/.cvsignore b/a11y/calendar/.cvsignore
deleted file mode 100644
index 0e1e389af7..0000000000
--- a/a11y/calendar/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-Makefile
-Makefile.in
-Evolution-*.c
-Evolution.h
-evolution-calendar-*.c
-evolution-calendar.h
diff --git a/a11y/calendar/Makefile.am b/a11y/calendar/Makefile.am
deleted file mode 100644
index 9688fc7ead..0000000000
--- a/a11y/calendar/Makefile.am
+++ /dev/null
@@ -1,55 +0,0 @@
-# Calendar IDL files
-
-# for debug
-#A11Y_CFLAGS += -pedantic -ansi -DACC_DEBUG -Werror
-
-privlib_LTLIBRARIES = libevolution-calendar-a11y.la
-
-INCLUDES = \
- -DG_LOG_DOMAIN=\"evolution-a11y\" \
- -I$(top_srcdir) \
- -I$(top_srcdir)/shell \
- -I$(top_srcdir)/calendar \
- -I$(top_srcdir)/calendar/cal-client \
- -I$(top_srcdir)/calendar/gui \
- -I$(top_srcdir)/widgets \
- -I$(top_srcdir)/widgets/misc \
- -I$(top_srcdir)/a11y \
- -DEVOLUTION_DATADIR=\""$(datadir)"\" \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_ETSPECDIR=\""$(etspecdir)"\" \
- -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \
- -DEVOLUTION_GALVIEWSDIR=\""$(viewsdir)"\" \
- -DEVOLUTION_UIDIR=\""$(evolutionuidir)"\" \
- -DPREFIX=\""$(prefix)"\" \
- $(A11Y_CFLAGS) \
- $(EVOLUTION_CALENDAR_CFLAGS)
-
-libevolution_calendar_a11y_la_SOURCES = \
- ea-calendar.c \
- ea-calendar.h \
- ea-calendar-helpers.c \
- ea-calendar-helpers.h \
- ea-cal-view.c \
- ea-cal-view.h \
- ea-cal-view-event.c \
- ea-cal-view-event.h \
- ea-day-view.c \
- ea-day-view.h \
- ea-day-view-main-item.c \
- ea-day-view-main-item.h \
- ea-day-view-cell.c \
- ea-day-view-cell.h \
- ea-week-view.c \
- ea-week-view.h \
- ea-week-view-main-item.c \
- ea-week-view-main-item.h \
- ea-week-view-cell.c \
- ea-week-view-cell.h \
- ea-jump-button.c \
- ea-jump-button.h \
- ea-gnome-calendar.c \
- ea-gnome-calendar.h
-
-libevolution_calendar_a11y_la_LIBADD = \
- $(top_builddir)/a11y/libevolution-a11y.la
diff --git a/a11y/calendar/ea-cal-view-event.c b/a11y/calendar/ea-cal-view-event.c
deleted file mode 100644
index cbd53f4ebd..0000000000
--- a/a11y/calendar/ea-cal-view-event.c
+++ /dev/null
@@ -1,528 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-cal-view-event.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#include "ea-cal-view-event.h"
-#include "ea-calendar-helpers.h"
-#include "ea-day-view.h"
-#include "ea-week-view.h"
-#include <gal/e-text/e-text.h>
-#include <libgnome/gnome-i18n.h>
-
-static void ea_cal_view_event_class_init (EaCalViewEventClass *klass);
-
-static G_CONST_RETURN gchar* ea_cal_view_event_get_name (AtkObject *accessible);
-static G_CONST_RETURN gchar* ea_cal_view_event_get_description (AtkObject *accessible);
-static AtkObject* ea_cal_view_event_get_parent (AtkObject *accessible);
-static gint ea_cal_view_event_get_index_in_parent (AtkObject *accessible);
-
-/* component interface */
-static void atk_component_interface_init (AtkComponentIface *iface);
-static void ea_cal_view_get_extents (AtkComponent *component,
- gint *x, gint *y, gint *width, gint *height,
- AtkCoordType coord_type);
-/* action interface */
-static void atk_action_interface_init (AtkActionIface *iface);
-static gboolean ea_cal_view_event_do_action (AtkAction *action, gint i);
-static gint ea_cal_view_event_get_n_actions (AtkAction *action);
-static G_CONST_RETURN gchar* ea_cal_view_event_action_get_name (AtkAction *action, gint i);
-
-
-#ifdef ACC_DEBUG
-static gint n_ea_cal_view_event_created = 0, n_ea_cal_view_event_destroyed = 0;
-static void ea_cal_view_finalize (GObject *object);
-#endif
-
-static gpointer parent_class = NULL;
-
-GType
-ea_cal_view_event_get_type (void)
-{
- static GType type = 0;
- AtkObjectFactory *factory;
- GTypeQuery query;
- GType derived_atk_type;
-
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (EaCalViewEventClass),
- (GBaseInitFunc) NULL, /* base init */
- (GBaseFinalizeFunc) NULL, /* base finalize */
- (GClassInitFunc) ea_cal_view_event_class_init, /* class init */
- (GClassFinalizeFunc) NULL, /* class finalize */
- NULL, /* class data */
- sizeof (EaCalViewEvent), /* instance size */
- 0, /* nb preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- static const GInterfaceInfo atk_component_info = {
- (GInterfaceInitFunc) atk_component_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
-
- static const GInterfaceInfo atk_action_info = {
- (GInterfaceInitFunc) atk_action_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
-
-
- /*
- * Figure out the size of the class and instance
- * we are run-time deriving from (atk object for E_TEXT, in this case)
- */
-
- factory = atk_registry_get_factory (atk_get_default_registry (),
- E_TYPE_TEXT);
- derived_atk_type = atk_object_factory_get_accessible_type (factory);
- g_type_query (derived_atk_type, &query);
-
- tinfo.class_size = query.class_size;
- tinfo.instance_size = query.instance_size;
-
- /* we inherit the component, text and other interfaces from E_TEXT */
- type = g_type_register_static (derived_atk_type,
- "EaCalViewEvent", &tinfo, 0);
- g_type_add_interface_static (type, ATK_TYPE_COMPONENT,
- &atk_component_info);
- g_type_add_interface_static (type, ATK_TYPE_ACTION,
- &atk_action_info);
-
-
- }
-
- return type;
-}
-
-static void
-ea_cal_view_event_class_init (EaCalViewEventClass *klass)
-{
- AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
-#ifdef ACC_DEBUG
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->finalize = ea_cal_view_finalize;
-#endif
-
- parent_class = g_type_class_peek_parent (klass);
-
-
- class->get_name = ea_cal_view_event_get_name;
- class->get_description = ea_cal_view_event_get_description;
- class->get_parent = ea_cal_view_event_get_parent;
- class->get_index_in_parent = ea_cal_view_event_get_index_in_parent;
-
-}
-
-#ifdef ACC_DEBUG
-static void ea_cal_view_finalize (GObject *object)
-{
- ++n_ea_cal_view_event_destroyed;
- printf ("ACC_DEBUG: n_ea_cal_view_event_destroyed = %d\n",
- n_ea_cal_view_event_destroyed);
-}
-#endif
-
-AtkObject*
-ea_cal_view_event_new (GObject *obj)
-{
- AtkObject *atk_obj = NULL;
- GObject *target_obj;
- ECalendarView *cal_view;
-
- g_return_val_if_fail (E_IS_TEXT (obj), NULL);
- cal_view = ea_calendar_helpers_get_cal_view_from (GNOME_CANVAS_ITEM (obj));
- if (!cal_view)
- return NULL;
-
- if (E_IS_WEEK_VIEW (cal_view)) {
- gint event_num, span_num;
- EWeekViewEvent *week_view_event;
- EWeekViewEventSpan *event_span;
- EWeekView *week_view = E_WEEK_VIEW (cal_view);
-
- /* for week view, we need to check if a atkobject exists for
- * the first span of the same event
- */
- if (!e_week_view_find_event_from_item (week_view,
- GNOME_CANVAS_ITEM (obj),
- &event_num,
- &span_num))
- return NULL;
- week_view_event = &g_array_index (week_view->events,
- EWeekViewEvent,
- event_num);
- /* get the first span */
- event_span = &g_array_index (week_view->spans,
- EWeekViewEventSpan,
- week_view_event->spans_index);
- target_obj = G_OBJECT (event_span->text_item);
- atk_obj = g_object_get_data (target_obj, "accessible-object");
-
- }
- else
- target_obj = obj;
-
- if (!atk_obj) {
- static AtkRole event_role = ATK_ROLE_INVALID;
- atk_obj = ATK_OBJECT (g_object_new (EA_TYPE_CAL_VIEW_EVENT,
- NULL));
- atk_object_initialize (atk_obj, target_obj);
- if (event_role == ATK_ROLE_INVALID)
- event_role = atk_role_register ("Calendar Event");
- atk_obj->role = event_role;
-#ifdef ACC_DEBUG
- ++n_ea_cal_view_event_created;
- printf ("ACC_DEBUG: n_ea_cal_view_event_created = %d\n",
- n_ea_cal_view_event_created);
-#endif
- }
-
- /* the registered factory for E_TEXT is cannot create a EaCalViewEvent,
- * we should save the EaCalViewEvent object in it.
- */
- g_object_set_data (obj, "accessible-object", atk_obj);
-
- return atk_obj;
-}
-
-static G_CONST_RETURN gchar*
-ea_cal_view_event_get_name (AtkObject *accessible)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- ECalendarViewEvent *event;
- gchar *name_string;
- gchar *alarm_string, *recur_string, *meeting_string, *summary_string;
- const char *summary;
-
-
- g_return_val_if_fail (EA_IS_CAL_VIEW_EVENT (accessible), NULL);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj || !E_IS_TEXT (g_obj))
- return NULL;
- event = ea_calendar_helpers_get_cal_view_event_from (GNOME_CANVAS_ITEM(g_obj));
-
- alarm_string = recur_string = meeting_string = "";
- if (event && event->comp_data) {
- if (e_cal_util_component_has_alarms (event->comp_data->icalcomp))
- alarm_string = _("It has alarms.");
-
- if (e_cal_util_component_has_recurrences (event->comp_data->icalcomp))
- recur_string = _("It has recurrences.");
-
- if (e_cal_util_component_has_organizer (event->comp_data->icalcomp))
- meeting_string = _("It is a meeting.");
-
- }
-
- summary = icalcomponent_get_summary (event->comp_data->icalcomp);
- if (summary)
- summary_string = g_strdup_printf (_("Calendar Event: Summary is %s."), summary);
- else
- summary_string = g_strdup (_("Calendar Event: It has no summary."));
-
- name_string = g_strdup_printf ("%s %s %s %s", summary_string, alarm_string, recur_string, meeting_string);
-
- ATK_OBJECT_CLASS (parent_class)->set_name (accessible, name_string);
-#ifdef ACC_DEBUG
- printf("EvoAcc: name for event accobj=%p, is %s\n",
- (void *)accessible, new_name);
-#endif
- g_free (name_string);
- return accessible->name;
-}
-
-static G_CONST_RETURN gchar*
-ea_cal_view_event_get_description (AtkObject *accessible)
-{
- if (accessible->description)
- return accessible->description;
-
- return _("calendar view event");
-}
-
-static AtkObject *
-ea_cal_view_event_get_parent (AtkObject *accessible)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- GnomeCanvasItem *canvas_item;
- ECalendarView *cal_view;
-
- g_return_val_if_fail (EA_IS_CAL_VIEW_EVENT (accessible), NULL);
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
-
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (g_obj == NULL)
- /* Object is defunct */
- return NULL;
- canvas_item = GNOME_CANVAS_ITEM (g_obj);
-
- cal_view = ea_calendar_helpers_get_cal_view_from (canvas_item);
-
- if (!cal_view)
- return NULL;
-
- return gtk_widget_get_accessible (GTK_WIDGET (cal_view));
-}
-
-static gint
-ea_cal_view_event_get_index_in_parent (AtkObject *accessible)
-{
- GObject *g_obj;
- GnomeCanvasItem *canvas_item;
- ECalendarView *cal_view;
- ECalendarViewEvent *cal_view_event;
-
- g_return_val_if_fail (EA_IS_CAL_VIEW_EVENT (accessible), -1);
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE(accessible));
- if (!g_obj)
- /* defunct object*/
- return -1;
-
- canvas_item = GNOME_CANVAS_ITEM (g_obj);
- cal_view = ea_calendar_helpers_get_cal_view_from (canvas_item);
- if (!cal_view)
- return -1;
-
- cal_view_event = ea_calendar_helpers_get_cal_view_event_from (canvas_item);
- if (!cal_view_event)
- return -1;
-
- if (E_IS_DAY_VIEW (cal_view)) {
- gint day, event_num, num_before;
- EDayViewEvent *day_view_event;
- EDayView *day_view = E_DAY_VIEW (cal_view);
-
- /* the long event comes first in the order */
- for (event_num = day_view->long_events->len - 1; event_num >= 0;
- --event_num) {
- day_view_event = &g_array_index (day_view->long_events,
- EDayViewEvent, event_num);
- if (cal_view_event == (ECalendarViewEvent*)day_view_event)
- return event_num;
-
- }
- num_before = day_view->long_events->len;
-
- for (day = 0; day < day_view->days_shown; ++day) {
- for (event_num = day_view->events[day]->len - 1; event_num >= 0;
- --event_num) {
- day_view_event = &g_array_index (day_view->events[day],
- EDayViewEvent, event_num);
- if (cal_view_event == (ECalendarViewEvent*)day_view_event)
- return num_before + event_num;
- }
- num_before += day_view->events[day]->len;
- }
- }
- else if (E_IS_WEEK_VIEW (cal_view)) {
- AtkObject *atk_parent, *atk_child;
- gint index = 0;
-
- atk_parent = atk_object_get_parent (accessible);
- while ((atk_child = atk_object_ref_accessible_child (atk_parent,
- index)) != NULL) {
- if (atk_child == accessible) {
- g_object_unref (atk_child);
- return index;
- }
- g_object_unref (atk_child);
- ++index;
- }
- }
- else {
- g_assert_not_reached ();
- return -1;
- }
- return -1;
-}
-
-/* Atk Component Interface */
-
-static void
-atk_component_interface_init (AtkComponentIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->get_extents = ea_cal_view_get_extents;
-}
-
-static void
-ea_cal_view_get_extents (AtkComponent *component,
- gint *x,
- gint *y,
- gint *width,
- gint *height,
- AtkCoordType coord_type)
-{
- GObject *g_obj;
- GnomeCanvasItem *canvas_item;
- gint x_window, y_window;
- gint scroll_x, scroll_y;
- ECalendarView *cal_view;
- gint item_x, item_y, item_w, item_h;
- GtkWidget *canvas = NULL;
-
- g_return_if_fail (EA_IS_CAL_VIEW_EVENT (component));
-
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE(component));
- if (!g_obj)
- /* defunct object*/
- return;
- g_return_if_fail (E_IS_TEXT (g_obj));
-
- canvas_item = GNOME_CANVAS_ITEM (g_obj);
- cal_view = ea_calendar_helpers_get_cal_view_from (canvas_item);
- if (!cal_view)
- return;
-
- if (E_IS_DAY_VIEW (cal_view)) {
- gint day, event_num;
-
- if (!e_day_view_find_event_from_item (E_DAY_VIEW (cal_view),
- canvas_item,
- &day, &event_num))
- return;
- if (day == E_DAY_VIEW_LONG_EVENT) {
- gint start_day, end_day;
- if (!e_day_view_get_long_event_position (E_DAY_VIEW (cal_view),
- event_num,
- &start_day,
- &end_day,
- &item_x,
- &item_y,
- &item_w,
- &item_h))
- return;
- canvas = E_DAY_VIEW (cal_view)->top_canvas;
- }
- else {
- if (!e_day_view_get_event_position (E_DAY_VIEW (cal_view), day,
- event_num,
- &item_x, &item_y,
- &item_w, &item_h))
-
- return;
- canvas = E_DAY_VIEW (cal_view)->main_canvas;
- }
- }
- else if (E_IS_WEEK_VIEW (cal_view)) {
- gint event_num, span_num;
- if (!e_week_view_find_event_from_item (E_WEEK_VIEW (cal_view),
- canvas_item, &event_num,
- &span_num))
- return;
-
- if (!e_week_view_get_span_position (E_WEEK_VIEW (cal_view),
- event_num, span_num,
- &item_x, &item_y, &item_w))
- return;
- item_h = E_WEEK_VIEW_ICON_HEIGHT;
- canvas = E_WEEK_VIEW (cal_view)->main_canvas;
- }
- else
- return;
-
- if (!canvas)
- return;
-
- gdk_window_get_origin (canvas->window,
- &x_window, &y_window);
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (canvas), &scroll_x, &scroll_y);
-
- *x = item_x + x_window - scroll_x;
- *y = item_y + y_window - scroll_y;
- *width = item_w;
- *height = item_h;
-
- if (coord_type == ATK_XY_WINDOW) {
- GdkWindow *window;
- gint x_toplevel, y_toplevel;
-
- window = gdk_window_get_toplevel (GTK_WIDGET (cal_view)->window);
- gdk_window_get_origin (window, &x_toplevel, &y_toplevel);
-
- *x -= x_toplevel;
- *y -= y_toplevel;
- }
-
-#ifdef ACC_DEBUG
- printf ("Event Bounds (%d, %d, %d, %d)\n", *x, *y, *width, *height);
-#endif
-}
-
-#define CAL_VIEW_EVENT_ACTION_NUM 1
-
-static const char * action_name [CAL_VIEW_EVENT_ACTION_NUM] = {
- N_("Grab Focus")
-};
-
-static void
-atk_action_interface_init (AtkActionIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->do_action = ea_cal_view_event_do_action;
- iface->get_n_actions = ea_cal_view_event_get_n_actions;
- iface->get_name = ea_cal_view_event_action_get_name;
-}
-
-static gboolean
-ea_cal_view_event_do_action (AtkAction *action, gint i)
-{
- AtkGObjectAccessible *atk_gobj;
- AtkComponent *atk_comp;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (action);
-
- if (i == 0) {
- atk_comp = (AtkComponent *)atk_gobj;
- return atk_component_grab_focus (atk_comp);
- }
-
- return FALSE;
-
-}
-
-static gint
-ea_cal_view_event_get_n_actions (AtkAction *action)
-{
- return CAL_VIEW_EVENT_ACTION_NUM;
-}
-
-static G_CONST_RETURN gchar*
-ea_cal_view_event_action_get_name (AtkAction *action, gint i)
-{
- if (i >= 0 && i < CAL_VIEW_EVENT_ACTION_NUM)
- return action_name [i];
- return NULL;
-}
-
diff --git a/a11y/calendar/ea-cal-view-event.h b/a11y/calendar/ea-cal-view-event.h
deleted file mode 100644
index f139dde9fb..0000000000
--- a/a11y/calendar/ea-cal-view-event.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-cal-view-event.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#ifndef __EA_CAL_VIEW_EVENT_H__
-#define __EA_CAL_VIEW_EVENT_H__
-
-#include <atk/atkgobjectaccessible.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define EA_TYPE_CAL_VIEW_EVENT (ea_cal_view_event_get_type ())
-#define EA_CAL_VIEW_EVENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_CAL_VIEW_EVENT, EaCalViewEvent))
-#define EA_CAL_VIEW_EVENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_CAL_VIEW_EVENT, EaCalViewEventClass))
-#define EA_IS_CAL_VIEW_EVENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_CAL_VIEW_EVENT))
-#define EA_IS_CAL_VIEW_EVENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EA_TYPE_CAL_VIEW_EVENT))
-#define EA_CAL_VIEW_EVENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EA_TYPE_CAL_VIEW_EVENT, EaCalViewEventClass))
-
-typedef struct _EaCalViewEvent EaCalViewEvent;
-typedef struct _EaCalViewEventClass EaCalViewEventClass;
-
-struct _EaCalViewEvent
-{
- AtkGObjectAccessible parent;
-};
-
-GType ea_cal_view_event_get_type (void);
-
-struct _EaCalViewEventClass
-{
- AtkGObjectAccessibleClass parent_class;
-};
-
-AtkObject *ea_cal_view_event_new (GObject *obj);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __EA_CAL_VIEW_EVENT_H__ */
diff --git a/a11y/calendar/ea-cal-view.c b/a11y/calendar/ea-cal-view.c
deleted file mode 100644
index 31400ca2da..0000000000
--- a/a11y/calendar/ea-cal-view.c
+++ /dev/null
@@ -1,441 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-cal-view.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#include "ea-cal-view.h"
-#include "ea-calendar-helpers.h"
-#include "e-day-view.h"
-#include "e-week-view.h"
-#include "calendar-commands.h"
-#include "goto.h"
-#include <glib/gstrfuncs.h>
-#include <libgnome/gnome-i18n.h>
-
-static void ea_cal_view_class_init (EaCalViewClass *klass);
-
-static AtkObject* ea_cal_view_get_parent (AtkObject *accessible);
-static void ea_cal_view_real_initialize (AtkObject *accessible, gpointer data);
-
-static void ea_cal_view_event_changed_cb (ECalendarView *cal_view,
- ECalendarViewEvent *event, gpointer data);
-static void ea_cal_view_event_added_cb (ECalendarView *cal_view,
- ECalendarViewEvent *event, gpointer data);
-
-static gboolean idle_dates_changed (gpointer data);
-static void ea_cal_view_dates_change_cb (GnomeCalendar *gcal, gpointer data);
-
-static void atk_action_interface_init (AtkActionIface *iface);
-static gboolean action_interface_do_action (AtkAction *action, gint i);
-static gint action_interface_get_n_actions (AtkAction *action);
-static G_CONST_RETURN gchar*
-action_interface_get_description(AtkAction *action, gint i);
-static G_CONST_RETURN gchar*
-action_interface_get_keybinding (AtkAction *action, gint i);
-static G_CONST_RETURN gchar*
-action_interface_action_get_name(AtkAction *action, gint i);
-
-static gpointer parent_class = NULL;
-
-GType
-ea_cal_view_get_type (void)
-{
- static GType type = 0;
- AtkObjectFactory *factory;
- GTypeQuery query;
- GType derived_atk_type;
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (EaCalViewClass),
- (GBaseInitFunc) NULL, /* base init */
- (GBaseFinalizeFunc) NULL, /* base finalize */
- (GClassInitFunc) ea_cal_view_class_init, /* class init */
- (GClassFinalizeFunc) NULL, /* class finalize */
- NULL, /* class data */
- sizeof (EaCalView), /* instance size */
- 0, /* nb preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- static const GInterfaceInfo atk_action_info = {
- (GInterfaceInitFunc) atk_action_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
-
- /*
- * Figure out the size of the class and instance
- * we are run-time deriving from (GailWidget, in this case)
- */
-
- factory = atk_registry_get_factory (atk_get_default_registry (),
- GTK_TYPE_WIDGET);
- derived_atk_type = atk_object_factory_get_accessible_type (factory);
- g_type_query (derived_atk_type, &query);
-
- tinfo.class_size = query.class_size;
- tinfo.instance_size = query.instance_size;
-
- type = g_type_register_static (derived_atk_type,
- "EaCalView", &tinfo, 0);
- g_type_add_interface_static (type, ATK_TYPE_ACTION,
- &atk_action_info);
- }
-
- return type;
-}
-
-static void
-ea_cal_view_class_init (EaCalViewClass *klass)
-{
- AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_peek_parent (klass);
-
- class->get_parent = ea_cal_view_get_parent;
- class->initialize = ea_cal_view_real_initialize;
-}
-
-AtkObject*
-ea_cal_view_new (GtkWidget *widget)
-{
- GObject *object;
- AtkObject *accessible;
-
- g_return_val_if_fail (E_IS_CALENDAR_VIEW (widget), NULL);
-
- object = g_object_new (EA_TYPE_CAL_VIEW, NULL);
-
- accessible = ATK_OBJECT (object);
- atk_object_initialize (accessible, widget);
-
- return accessible;
-}
-
-static void
-ea_cal_view_real_initialize (AtkObject *accessible, gpointer data)
-{
- ECalendarView *cal_view;
- GnomeCalendar *gcal;
- static AtkRole role = ATK_ROLE_INVALID;
-
- g_return_if_fail (EA_IS_CAL_VIEW (accessible));
- g_return_if_fail (E_IS_CALENDAR_VIEW (data));
-
- ATK_OBJECT_CLASS (parent_class)->initialize (accessible, data);
- if (role == ATK_ROLE_INVALID)
- role = atk_role_register ("Calendar View");
- accessible->role = role;
- cal_view = E_CALENDAR_VIEW (data);
-
- /* add listener for event_changed, event_added
- * we don't need to listen on event_removed. When the e_text
- * of the event is removed, the cal_view_event will go to the state
- * of "defunct" (changed by weak ref callback of atkgobjectaccessible
- */
- g_signal_connect (G_OBJECT(cal_view), "event_changed",
- G_CALLBACK (ea_cal_view_event_changed_cb), NULL);
- g_signal_connect (G_OBJECT(cal_view), "event_added",
- G_CALLBACK (ea_cal_view_event_added_cb), NULL);
-
- /* listen for date changes of calendar */
- gcal = e_calendar_view_get_calendar (cal_view);
-
- if (gcal)
- g_signal_connect (gcal, "dates_shown_changed",
- G_CALLBACK (ea_cal_view_dates_change_cb),
- accessible);
-}
-
-static AtkObject*
-ea_cal_view_get_parent (AtkObject *accessible)
-{
- ECalendarView *cal_view;
- GnomeCalendar *gnomeCalendar;
-
- g_return_val_if_fail (EA_IS_CAL_VIEW (accessible), NULL);
-
- if (!GTK_ACCESSIBLE (accessible)->widget)
- return NULL;
- cal_view = E_CALENDAR_VIEW (GTK_ACCESSIBLE (accessible)->widget);
-
- gnomeCalendar = e_calendar_view_get_calendar (cal_view);
-
- return gtk_widget_get_accessible (GTK_WIDGET(gnomeCalendar));
-}
-
-static void
-ea_cal_view_event_changed_cb (ECalendarView *cal_view, ECalendarViewEvent *event,
- gpointer data)
-{
- AtkObject *atk_obj;
- EaCalView *ea_cal_view;
- AtkObject *event_atk_obj = NULL;
-
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- atk_obj = gtk_widget_get_accessible (GTK_WIDGET(cal_view));
- if (!EA_IS_CAL_VIEW (atk_obj))
- return;
- ea_cal_view = EA_CAL_VIEW (atk_obj);
-
- if ((E_IS_DAY_VIEW (cal_view)) && event && event->canvas_item) {
- event_atk_obj =
- ea_calendar_helpers_get_accessible_for (event->canvas_item);
- }
- else if ((E_IS_WEEK_VIEW (cal_view)) && event) {
- EWeekViewEventSpan *span;
- EWeekViewEvent *week_view_event = (EWeekViewEvent *)event;
- EWeekView *week_view = E_WEEK_VIEW (cal_view);
- /* get the first span of the event */
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- week_view_event->spans_index);
- if (span && span->text_item)
- event_atk_obj = ea_calendar_helpers_get_accessible_for (span->text_item);
- }
- if (event_atk_obj) {
-#ifdef ACC_DEBUG
- printf ("AccDebug: event=%p changed\n", (void *)event);
-#endif
- g_object_notify (G_OBJECT(event_atk_obj), "accessible-name");
- g_signal_emit_by_name (event_atk_obj, "visible_data_changed");
- }
-
-}
-
-static void
-ea_cal_view_event_added_cb (ECalendarView *cal_view, ECalendarViewEvent *event,
- gpointer data)
-{
- AtkObject *atk_obj;
- EaCalView *ea_cal_view;
- AtkObject *event_atk_obj = NULL;
- gint index;
-
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- atk_obj = gtk_widget_get_accessible (GTK_WIDGET(cal_view));
- if (!EA_IS_CAL_VIEW (atk_obj))
- return;
- ea_cal_view = EA_CAL_VIEW (atk_obj);
-
- if ((E_IS_DAY_VIEW (cal_view)) && event && event->canvas_item) {
- event_atk_obj =
- ea_calendar_helpers_get_accessible_for (event->canvas_item);
- }
- else if ((E_IS_WEEK_VIEW (cal_view)) && event) {
- EWeekViewEventSpan *span;
- EWeekViewEvent *week_view_event = (EWeekViewEvent *)event;
- EWeekView *week_view = E_WEEK_VIEW (cal_view);
- /* get the first span of the event */
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- week_view_event->spans_index);
- if (span && span->text_item)
- event_atk_obj = ea_calendar_helpers_get_accessible_for (span->text_item);
-
- }
- if (event_atk_obj) {
- index = atk_object_get_index_in_parent (event_atk_obj);
- if (index < 0)
- return;
-#ifdef ACC_DEBUG
- printf ("AccDebug: event=%p added\n", (void *)event);
-#endif
- g_signal_emit_by_name (atk_obj, "children_changed::add",
- index, event_atk_obj, NULL);
- }
-}
-
-static gboolean
-idle_dates_changed (gpointer data)
-{
- AtkObject *ea_cal_view;
-
- g_return_val_if_fail (data, FALSE);
- g_return_val_if_fail (EA_IS_CAL_VIEW (data), FALSE);
-
- ea_cal_view = ATK_OBJECT(data);
-
- if (ea_cal_view->name) {
- g_free (ea_cal_view->name);
- ea_cal_view->name = NULL;
- }
- g_object_notify (G_OBJECT (ea_cal_view), "accessible-name");
- g_signal_emit_by_name (ea_cal_view, "visible_data_changed");
- g_signal_emit_by_name (ea_cal_view, "children_changed", NULL);
-#ifdef ACC_DEBUG
- printf ("AccDebug: cal view date changed\n");
-#endif
-
- return FALSE;
-}
-
-static void
-ea_cal_view_dates_change_cb (GnomeCalendar *gcal, gpointer data)
-{
- g_idle_add (idle_dates_changed, data);
-}
-
-/* atk action interface */
-
-#define CAL_VIEW_ACTION_NUM 5
-
-static const char * action_name [CAL_VIEW_ACTION_NUM] = {
- N_("New Appointment"),
- N_("New All Day Event"),
- N_("New Meeting"),
- N_("Go to Today"),
- N_("Go to Date")
-};
-
-static void
-atk_action_interface_init (AtkActionIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->do_action = action_interface_do_action;
- iface->get_n_actions = action_interface_get_n_actions;
- iface->get_description = action_interface_get_description;
- iface->get_keybinding = action_interface_get_keybinding;
- iface->get_name = action_interface_action_get_name;
-}
-
-static gboolean
-action_interface_do_action (AtkAction *action, gint index)
-{
- GtkWidget *widget;
- gboolean return_value = TRUE;
- time_t dtstart, dtend;
- ECalendarView *cal_view;
-
- widget = GTK_ACCESSIBLE (action)->widget;
- if (widget == NULL)
- /*
- * State is defunct
- */
- return FALSE;
-
- if (!GTK_WIDGET_IS_SENSITIVE (widget) || !GTK_WIDGET_VISIBLE (widget))
- return FALSE;
-
- cal_view = E_CALENDAR_VIEW (widget);
- switch (index) {
- case 0:
- /* New Appointment */
- e_calendar_view_new_appointment (cal_view);
- break;
- case 1:
- /* New All Day Event */
- e_calendar_view_get_selected_time_range (cal_view,
- &dtstart, &dtend);
- e_calendar_view_new_appointment_for (cal_view,
- dtstart, dtend, TRUE, FALSE);
- break;
- case 2:
- /* New Meeting */
- e_calendar_view_get_selected_time_range (cal_view,
- &dtstart, &dtend);
- e_calendar_view_new_appointment_for (cal_view,
- dtstart, dtend, FALSE, TRUE);
- break;
- case 3:
- /* Go to today */
- break;
- calendar_goto_today (e_calendar_view_get_calendar (cal_view));
- case 4:
- /* Go to date */
- goto_dialog (e_calendar_view_get_calendar (cal_view));
- break;
- default:
- return_value = FALSE;
- break;
- }
- return return_value;
-}
-
-static gint
-action_interface_get_n_actions (AtkAction *action)
-{
- return CAL_VIEW_ACTION_NUM;
-}
-
-static G_CONST_RETURN gchar*
-action_interface_get_description(AtkAction *action, gint index)
-{
- return action_interface_action_get_name (action, index);
-}
-
-static G_CONST_RETURN gchar*
-action_interface_get_keybinding (AtkAction *action, gint index)
-{
- GtkWidget *widget;
- EaCalView *ea_cal_view;
-
- widget = GTK_ACCESSIBLE (action)->widget;
- if (widget == NULL)
- /*
- * State is defunct
- */
- return NULL;
-
- if (!GTK_WIDGET_IS_SENSITIVE (widget) || !GTK_WIDGET_VISIBLE (widget))
- return FALSE;
-
- ea_cal_view = EA_CAL_VIEW (action);
-
- switch (index) {
- case 0:
- /* New Appointment */
- return "<Alt>fna;<Control>n";
- break;
- case 1:
- /* New Event */
- return "<Alt>fnd;<Shift><Control>d";
- break;
- case 2:
- /* New Meeting */
- return "<Alt>fne;<Shift><Control>e";
- break;
- case 3:
- /* Go to today */
- return "<Alt>vt;<Alt><Control>t";
- break;
- case 4:
- /* Go to date */
- return "<Alt>vd;<Alt><Control>g";
- break;
- default:
- break;
- }
- return NULL;
-}
-
-static G_CONST_RETURN gchar*
-action_interface_action_get_name(AtkAction *action, gint i)
-{
- if (i >= 0 && i < CAL_VIEW_ACTION_NUM)
- return action_name [i];
- return NULL;
-}
diff --git a/a11y/calendar/ea-cal-view.h b/a11y/calendar/ea-cal-view.h
deleted file mode 100644
index 193bb3a3cb..0000000000
--- a/a11y/calendar/ea-cal-view.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-cal-view.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#ifndef __EA_CAL_VIEW_H__
-#define __EA_CAL_VIEW_H__
-
-#include <gtk/gtkaccessible.h>
-#include "e-calendar-view.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define EA_TYPE_CAL_VIEW (ea_cal_view_get_type ())
-#define EA_CAL_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_CAL_VIEW, EaCalView))
-#define EA_CAL_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_CAL_VIEW, EaCalViewClass))
-#define EA_IS_CAL_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_CAL_VIEW))
-#define EA_IS_CAL_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EA_TYPE_CAL_VIEW))
-#define EA_CAL_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EA_TYPE_CAL_VIEW, EaCalViewClass))
-
-typedef struct _EaCalView EaCalView;
-typedef struct _EaCalViewClass EaCalViewClass;
-
-struct _EaCalView
-{
- GtkAccessible parent;
-};
-
-GType ea_cal_view_get_type (void);
-
-struct _EaCalViewClass
-{
- GtkAccessibleClass parent_class;
-};
-
-AtkObject* ea_cal_view_new (GtkWidget *widget);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __EA_CAL_VIEW_H__ */
diff --git a/a11y/calendar/ea-calendar-helpers.c b/a11y/calendar/ea-calendar-helpers.c
deleted file mode 100644
index ff3a502a67..0000000000
--- a/a11y/calendar/ea-calendar-helpers.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-calendar-helpers.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#include "ea-calendar-helpers.h"
-#include "ea-cal-view-event.h"
-#include "ea-jump-button.h"
-#include "e-day-view.h"
-#include "e-week-view.h"
-
-#include <gal/e-text/e-text.h>
-#include <libgnomecanvas/gnome-canvas-pixbuf.h>
-
-/**
- * ea_calendar_helpers_get_accessible_for
- * @canvas_item: the canvas item for a event or a jump button
- * @returns: the atk object for the canvas_item
- *
- **/
-AtkObject *
-ea_calendar_helpers_get_accessible_for (GnomeCanvasItem *canvas_item)
-{
- AtkObject *atk_obj = NULL;
- GObject *g_obj;
-
- g_return_val_if_fail ((E_IS_TEXT (canvas_item)) || (GNOME_IS_CANVAS_ITEM (canvas_item)), NULL);;
-
- g_obj = G_OBJECT (canvas_item);
- /* we cannot use atk_gobject_accessible_for_object here,
- * EaDayViewEvent/EaWeekViewEvent cannot be created by the
- * registered facotry of E_TEXT
- */
- atk_obj = g_object_get_data (g_obj, "accessible-object");
- if (!atk_obj) {
- if (E_IS_TEXT (canvas_item)) {
- atk_obj = ea_cal_view_event_new (g_obj);
- }
- else if (GNOME_IS_CANVAS_PIXBUF(canvas_item)) {
- atk_obj = ea_jump_button_new (g_obj);
- }
- else
- return NULL;
- }
- return atk_obj;
-}
-
-/**
- * ea_calendar_helpers_get_view_widget_from:
- * @canvas_item: the canvas item for a event or a jump button
- * @returns: the cal view widget if exists
- *
- * Get the cal view widget contains the canvas_item.
- *
- **/
-ECalendarView *
-ea_calendar_helpers_get_cal_view_from (GnomeCanvasItem *canvas_item)
-{
- GnomeCanvas *canvas;
- GtkWidget *view_widget = NULL;
-
- g_return_val_if_fail (canvas_item, NULL);
- g_return_val_if_fail ((E_IS_TEXT (canvas_item)) || (GNOME_IS_CANVAS_ITEM (canvas_item)), NULL);
-
- /* canvas_item is the e_text for the event */
- /* canvas_item->canvas is the ECanvas for day view */
- /* parent of canvas_item->canvas is the EDayView or EWeekView widget */
- canvas = canvas_item->canvas;
- view_widget = gtk_widget_get_parent (GTK_WIDGET(canvas));
- if (!view_widget || !E_IS_CALENDAR_VIEW (view_widget))
- return NULL;
-
- return E_CALENDAR_VIEW (view_widget);
-}
-
-/**
- * ea_calendar_helpers_get_cal_view_event_from
- * @canvas_item: the cavas_item (e_text) for the event
- * @returns: the ECalendarViewEvent
- *
- * Get the ECalendarViewEvent for the canvas_item.
- *
- **/
-ECalendarViewEvent *
-ea_calendar_helpers_get_cal_view_event_from (GnomeCanvasItem *canvas_item)
-{
- ECalendarView *cal_view;
- gboolean event_found;
- ECalendarViewEvent *cal_view_event;
-
- g_return_val_if_fail (E_IS_TEXT (canvas_item), NULL);
-
- cal_view = ea_calendar_helpers_get_cal_view_from (canvas_item);
-
- if (!cal_view)
- return NULL;
-
- if (E_IS_DAY_VIEW (cal_view)) {
- gint event_day, event_num;
- EDayViewEvent *day_view_event;
- EDayView *day_view = E_DAY_VIEW (cal_view);
- event_found = e_day_view_find_event_from_item (day_view, canvas_item,
- &event_day, &event_num);
- if (!event_found)
- return NULL;
- if (event_day == E_DAY_VIEW_LONG_EVENT) {
- /* a long event */
- day_view_event = &g_array_index (day_view->long_events,
- EDayViewEvent, event_num);
- }
- else {
- /* a main canvas event */
- day_view_event = &g_array_index (day_view->events[event_day],
- EDayViewEvent, event_num);
- }
- cal_view_event = (ECalendarViewEvent *) day_view_event;
- }
- else if (E_IS_WEEK_VIEW (cal_view)) {
- gint event_num, span_num;
- EWeekViewEvent *week_view_event;
- EWeekView *week_view = E_WEEK_VIEW (cal_view);
- event_found = e_week_view_find_event_from_item (week_view,
- canvas_item,
- &event_num,
- &span_num);
- if (!event_found)
- return NULL;
-
- week_view_event = &g_array_index (week_view->events, EWeekViewEvent,
- event_num);
-
- cal_view_event = (ECalendarViewEvent *)week_view_event;
- }
- else {
- g_assert_not_reached ();
- return NULL;
- }
- return cal_view_event;
-}
diff --git a/a11y/calendar/ea-calendar-helpers.h b/a11y/calendar/ea-calendar-helpers.h
deleted file mode 100644
index 50d997d91d..0000000000
--- a/a11y/calendar/ea-calendar-helpers.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-calendar-helpers.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-/* Evolution Accessibility
- */
-
-#ifndef _EA_CALENDAR_HELPERS_H__
-#define _EA_CALENDAR_HELPERS_H__
-
-#include "ea-cal-view.h"
-
-AtkObject *
-ea_calendar_helpers_get_accessible_for (GnomeCanvasItem *canvas_item);
-
-ECalendarView *
-ea_calendar_helpers_get_cal_view_from (GnomeCanvasItem *canvas_item);
-
-ECalendarViewEvent *
-ea_calendar_helpers_get_cal_view_event_from (GnomeCanvasItem *canvas_item);
-
-#endif /* _EA_CALENDAR_HELPERS_H__ */
diff --git a/a11y/calendar/ea-calendar.c b/a11y/calendar/ea-calendar.c
deleted file mode 100644
index f2510bbcf9..0000000000
--- a/a11y/calendar/ea-calendar.c
+++ /dev/null
@@ -1,195 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-calendar.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#include <gal/e-text/e-text.h>
-#include <libgnomecanvas/gnome-canvas-pixbuf.h>
-#include "ea-calendar-helpers.h"
-#include "ea-factory.h"
-#include "ea-calendar.h"
-
-#include "calendar/ea-cal-view.h"
-#include "calendar/ea-cal-view-event.h"
-#include "calendar/ea-day-view.h"
-#include "calendar/ea-day-view-main-item.h"
-#include "calendar/ea-week-view.h"
-#include "calendar/ea-week-view-main-item.h"
-#include "calendar/ea-gnome-calendar.h"
-
-
-EA_FACTORY (EA_TYPE_CAL_VIEW, ea_cal_view, ea_cal_view_new)
-EA_FACTORY (EA_TYPE_DAY_VIEW, ea_day_view, ea_day_view_new)
-EA_FACTORY_GOBJECT (EA_TYPE_DAY_VIEW_MAIN_ITEM, ea_day_view_main_item, ea_day_view_main_item_new)
-EA_FACTORY (EA_TYPE_WEEK_VIEW, ea_week_view, ea_week_view_new)
-EA_FACTORY_GOBJECT (EA_TYPE_WEEK_VIEW_MAIN_ITEM, ea_week_view_main_item, ea_week_view_main_item_new)
-EA_FACTORY (EA_TYPE_GNOME_CALENDAR, ea_gnome_calendar, ea_gnome_calendar_new)
-
-static gboolean ea_calendar_focus_watcher (GSignalInvocationHint *ihint,
- guint n_param_values,
- const GValue *param_values,
- gpointer data);
-
-void
-gnome_calendar_a11y_init (void)
-{
- EA_SET_FACTORY (gnome_calendar_get_type(), ea_gnome_calendar);
- /* we only add focus watcher when accessibility is enabled
- */
- if (atk_get_root ()) {
- g_signal_add_emission_hook (g_signal_lookup ("event", E_TYPE_TEXT),
- 0, ea_calendar_focus_watcher,
- NULL, (GDestroyNotify) NULL);
- g_signal_add_emission_hook (g_signal_lookup ("event", GNOME_TYPE_CANVAS_PIXBUF),
- 0, ea_calendar_focus_watcher,
- NULL, (GDestroyNotify) NULL);
- g_signal_add_emission_hook (g_signal_lookup ("event-after",
- e_day_view_get_type()),
- 0, ea_calendar_focus_watcher,
- NULL, (GDestroyNotify) NULL);
- g_signal_add_emission_hook (g_signal_lookup ("event",
- e_day_view_main_item_get_type()),
- 0, ea_calendar_focus_watcher,
- NULL, (GDestroyNotify) NULL);
- g_signal_add_emission_hook (g_signal_lookup ("event-after",
- e_week_view_get_type()),
- 0, ea_calendar_focus_watcher,
- NULL, (GDestroyNotify) NULL);
- g_signal_add_emission_hook (g_signal_lookup ("event",
- e_week_view_main_item_get_type()),
- 0, ea_calendar_focus_watcher,
- NULL, (GDestroyNotify) NULL);
-
- }
-}
-
-void
-e_cal_view_a11y_init (void)
-{
- EA_SET_FACTORY (e_cal_view_get_type(), ea_cal_view);
-}
-
-void
-e_day_view_a11y_init (void)
-{
- EA_SET_FACTORY (e_day_view_get_type(), ea_day_view);
-}
-
-void
-e_day_view_main_item_a11y_init (void)
-{
- EA_SET_FACTORY (e_day_view_main_item_get_type (), ea_day_view_main_item);
-}
-
-void
-e_week_view_a11y_init (void)
-{
- EA_SET_FACTORY (e_week_view_get_type(), ea_week_view);
-}
-
-void
-e_week_view_main_item_a11y_init (void)
-{
- EA_SET_FACTORY (e_week_view_main_item_get_type (), ea_week_view_main_item);
-}
-
-gboolean
-ea_calendar_focus_watcher (GSignalInvocationHint *ihint,
- guint n_param_values,
- const GValue *param_values,
- gpointer data)
-{
- GObject *object;
- GdkEvent *event;
- AtkObject *ea_event = NULL;
-
- object = g_value_get_object (param_values + 0);
- event = g_value_get_boxed (param_values + 1);
-
- if ((E_IS_TEXT (object)) || (GNOME_IS_CANVAS_PIXBUF (object))) {
- /* "event" signal on canvas item
- */
- GnomeCanvasItem *canvas_item;
-
- canvas_item = GNOME_CANVAS_ITEM (object);
- if (event->type == GDK_FOCUS_CHANGE) {
- if (event->focus_change.in) {
- ea_event =
- ea_calendar_helpers_get_accessible_for (canvas_item);
- if (!ea_event)
- /* not canvas item we want */
- return TRUE;
-
- }
- atk_focus_tracker_notify (ea_event);
- }
- }
- else if (E_IS_DAY_VIEW (object)) {
- EDayView *day_view = E_DAY_VIEW (object);
- if (event->type == GDK_FOCUS_CHANGE) {
- if (event->focus_change.in) {
- /* give main item chance to emit focus */
- gnome_canvas_item_grab_focus (day_view->main_canvas_item);
- }
- }
- }
- else if (E_IS_DAY_VIEW_MAIN_ITEM (object)) {
- if (event->type == GDK_FOCUS_CHANGE) {
- if (event->focus_change.in) {
- /* we should emit focus on main item */
- ea_event = atk_gobject_accessible_for_object (object);
- }
- else
- /* focus out */
- ea_event = NULL;
-#ifdef ACC_DEBUG
- printf ("EvoAcc: focus notify on day main item %p\n", (void *)object);
-#endif
- atk_focus_tracker_notify (ea_event);
- }
- } else if (E_IS_WEEK_VIEW (object)) {
- EWeekView *week_view = E_WEEK_VIEW (object);
- if (event->type == GDK_FOCUS_CHANGE) {
- if (event->focus_change.in) {
- /* give main item chance to emit focus */
- gnome_canvas_item_grab_focus (week_view->main_canvas_item);
- }
- }
- }
- else if (E_IS_WEEK_VIEW_MAIN_ITEM (object)) {
- if (event->type == GDK_FOCUS_CHANGE) {
- if (event->focus_change.in) {
- /* we should emit focus on main item */
- ea_event = atk_gobject_accessible_for_object (object);
- }
- else
- /* focus out */
- ea_event = NULL;
-#ifdef ACC_DEBUG
- printf ("EvoAcc: focus notify on week main item %p\n", (void *)object);
-#endif
- atk_focus_tracker_notify (ea_event);
- }
- }
- return TRUE;
-}
diff --git a/a11y/calendar/ea-calendar.h b/a11y/calendar/ea-calendar.h
deleted file mode 100644
index 92bb80a962..0000000000
--- a/a11y/calendar/ea-calendar.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-calendar.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-/* Evolution Accessibility
-*/
-
-#ifndef _EA_CALENDAR_H__
-#define _EA_CALENDAR_H__
-
-void gnome_calendar_a11y_init (void);
-void e_cal_view_a11y_init (void);
-void e_day_view_a11y_init (void);
-void e_day_view_main_item_a11y_init (void);
-void e_week_view_a11y_init (void);
-void e_week_view_main_item_a11y_init (void);
-
-#endif /* _EA_CALENDAR_H__ */
diff --git a/a11y/calendar/ea-day-view-cell.c b/a11y/calendar/ea-day-view-cell.c
deleted file mode 100644
index 5b1f81ae1a..0000000000
--- a/a11y/calendar/ea-day-view-cell.c
+++ /dev/null
@@ -1,396 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-day-view-cell.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#include "ea-day-view-cell.h"
-#include "ea-day-view-main-item.h"
-#include "ea-day-view.h"
-#include "ea-factory.h"
-
-/* EDayViewCell */
-
-static void e_day_view_cell_class_init (EDayViewCellClass *class);
-
-EA_FACTORY_GOBJECT (EA_TYPE_DAY_VIEW_CELL, ea_day_view_cell, ea_day_view_cell_new)
-
-GType
-e_day_view_cell_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (EDayViewCellClass),
- (GBaseInitFunc) NULL, /* base init */
- (GBaseFinalizeFunc) NULL, /* base finalize */
- (GClassInitFunc) e_day_view_cell_class_init, /* class init */
- (GClassFinalizeFunc) NULL, /* class finalize */
- NULL, /* class data */
- sizeof (EDayViewCell), /* instance size */
- 0, /* nb preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- type = g_type_register_static (G_TYPE_OBJECT,
- "EDayViewCell", &tinfo, 0);
- }
-
- return type;
-}
-
-static void
-e_day_view_cell_class_init (EDayViewCellClass *class)
-{
- EA_SET_FACTORY (e_day_view_cell_get_type (), ea_day_view_cell);
-}
-
-EDayViewCell *
-e_day_view_cell_new (EDayView *day_view, gint row, gint column)
-{
- GObject *object;
- EDayViewCell *cell;
-
- g_return_val_if_fail (E_IS_DAY_VIEW (day_view), NULL);
-
- object = g_object_new (E_TYPE_DAY_VIEW_CELL, NULL);
- cell = E_DAY_VIEW_CELL (object);
- cell->day_view = day_view;
- cell->row = row;
- cell->column = column;
-
-#ifdef ACC_DEBUG
- printf ("EvoAcc: e_day_view_cell created %p\n", (void *)cell);
-#endif
-
- return cell;
-}
-
-/* EaDayViewCell */
-
-static void ea_day_view_cell_class_init (EaDayViewCellClass *klass);
-
-static G_CONST_RETURN gchar* ea_day_view_cell_get_name (AtkObject *accessible);
-static G_CONST_RETURN gchar* ea_day_view_cell_get_description (AtkObject *accessible);
-static AtkStateSet* ea_day_view_cell_ref_state_set (AtkObject *obj);
-static AtkObject * ea_day_view_cell_get_parent (AtkObject *accessible);
-static gint ea_day_view_cell_get_index_in_parent (AtkObject *accessible);
-
-/* component interface */
-static void atk_component_interface_init (AtkComponentIface *iface);
-static void component_interface_get_extents (AtkComponent *component,
- gint *x, gint *y,
- gint *width, gint *height,
- AtkCoordType coord_type);
-static gboolean component_interface_grab_focus (AtkComponent *component);
-
-static gpointer parent_class = NULL;
-
-#ifdef ACC_DEBUG
-static gint n_ea_day_view_cell_created = 0, n_ea_day_view_cell_destroyed = 0;
-static void ea_day_view_cell_finalize (GObject *object);
-#endif
-
-GType
-ea_day_view_cell_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (EaDayViewCellClass),
- (GBaseInitFunc) NULL, /* base init */
- (GBaseFinalizeFunc) NULL, /* base finalize */
- (GClassInitFunc) ea_day_view_cell_class_init, /* class init */
- (GClassFinalizeFunc) NULL, /* class finalize */
- NULL, /* class data */
- sizeof (EaDayViewCell), /* instance size */
- 0, /* nb preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- static const GInterfaceInfo atk_component_info = {
- (GInterfaceInitFunc) atk_component_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
-
- type = g_type_register_static (ATK_TYPE_GOBJECT_ACCESSIBLE,
- "EaDayViewCell", &tinfo, 0);
- g_type_add_interface_static (type, ATK_TYPE_COMPONENT,
- &atk_component_info);
- }
-
- return type;
-}
-
-static void
-ea_day_view_cell_class_init (EaDayViewCellClass *klass)
-{
- AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
-
-#ifdef ACC_DEBUG
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->finalize = ea_day_view_cell_finalize;
-#endif
-
- parent_class = g_type_class_peek_parent (klass);
-
- class->get_name = ea_day_view_cell_get_name;
- class->get_description = ea_day_view_cell_get_description;
- class->ref_state_set = ea_day_view_cell_ref_state_set;
-
- class->get_parent = ea_day_view_cell_get_parent;
- class->get_index_in_parent = ea_day_view_cell_get_index_in_parent;
-}
-
-AtkObject*
-ea_day_view_cell_new (GObject *obj)
-{
- gpointer object;
- AtkObject *atk_object;
-
- g_return_val_if_fail (E_IS_DAY_VIEW_CELL (obj), NULL);
-
- object = g_object_new (EA_TYPE_DAY_VIEW_CELL, NULL);
- atk_object = ATK_OBJECT (object);
- atk_object_initialize (atk_object, obj);
- atk_object->role = ATK_ROLE_UNKNOWN;
-
-#ifdef ACC_DEBUG
- ++n_ea_day_view_cell_created;
- printf ("ACC_DEBUG: n_ea_day_view_cell_created = %d\n",
- n_ea_day_view_cell_created);
-#endif
- return atk_object;
-}
-
-#ifdef ACC_DEBUG
-static void ea_day_view_cell_finalize (GObject *object)
-{
- ++n_ea_day_view_cell_destroyed;
- printf ("ACC_DEBUG: n_ea_day_view_cell_destroyed = %d\n",
- n_ea_day_view_cell_destroyed);
-}
-#endif
-
-static G_CONST_RETURN gchar*
-ea_day_view_cell_get_name (AtkObject *accessible)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewCell *cell;
-
- g_return_val_if_fail (EA_IS_DAY_VIEW_CELL (accessible), NULL);
-
- if (!accessible->name) {
- AtkObject *ea_main_item;
- GnomeCanvasItem *main_item;
- gchar *new_name = g_strdup ("");
- const gchar *row_label, *column_label;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- cell = E_DAY_VIEW_CELL (g_obj);
- main_item = cell->day_view->main_canvas_item;
- ea_main_item = atk_gobject_accessible_for_object (G_OBJECT (main_item));
- column_label = atk_table_get_column_description (ATK_TABLE (ea_main_item),
- cell->column);
- row_label = atk_table_get_row_description (ATK_TABLE (ea_main_item),
- cell->row);
- new_name = g_strconcat (column_label, " ", row_label, NULL);
- ATK_OBJECT_CLASS (parent_class)->set_name (accessible, new_name);
- g_free (new_name);
- }
- return accessible->name;
-}
-
-static G_CONST_RETURN gchar*
-ea_day_view_cell_get_description (AtkObject *accessible)
-{
- return ea_day_view_cell_get_name (accessible);
-}
-
-static AtkStateSet*
-ea_day_view_cell_ref_state_set (AtkObject *obj)
-{
- AtkStateSet *state_set;
- GObject *g_obj;
- AtkObject *parent;
- gint x, y, width, height;
- gint parent_x, parent_y, parent_width, parent_height;
-
- state_set = ATK_OBJECT_CLASS (parent_class)->ref_state_set (obj);
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE(obj));
- if (!g_obj)
- return state_set;
-
- atk_state_set_add_state (state_set, ATK_STATE_SELECTABLE);
-
- parent = atk_object_get_parent (obj);
- atk_component_get_extents (ATK_COMPONENT (obj), &x, &y,
- &width, &height, ATK_XY_WINDOW);
- atk_component_get_extents (ATK_COMPONENT (parent), &parent_x, &parent_y,
- &parent_width, &parent_height, ATK_XY_WINDOW);
-
-
- if (x + width < parent_x || x > parent_x + parent_width ||
- y + height < parent_y || y > parent_y + parent_height)
- /* the cell is out of the main canvas */
- ;
- else
- atk_state_set_add_state (state_set, ATK_STATE_VISIBLE);
-
- return state_set;
-}
-
-static AtkObject *
-ea_day_view_cell_get_parent (AtkObject *accessible)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewCell *cell;
-
- g_return_val_if_fail (EA_IS_DAY_VIEW_CELL (accessible), NULL);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- cell = E_DAY_VIEW_CELL (g_obj);
- return atk_gobject_accessible_for_object (G_OBJECT (cell->day_view->main_canvas_item));
-}
-
-static gint
-ea_day_view_cell_get_index_in_parent (AtkObject *accessible)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewCell *cell;
- AtkObject *parent;
-
- g_return_val_if_fail (EA_IS_DAY_VIEW_CELL (accessible), -1);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- cell = E_DAY_VIEW_CELL (g_obj);
- parent = atk_object_get_parent (accessible);
- return atk_table_get_index_at (ATK_TABLE (parent),
- cell->row, cell->column);
-}
-
-/* Atk Component Interface */
-
-static void
-atk_component_interface_init (AtkComponentIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->get_extents = component_interface_get_extents;
- iface->grab_focus = component_interface_grab_focus;
-}
-
-static void
-component_interface_get_extents (AtkComponent *component,
- gint *x, gint *y, gint *width, gint *height,
- AtkCoordType coord_type)
-{
- GObject *g_obj;
- AtkObject *atk_obj;
- EDayViewCell *cell;
- EDayView *day_view;
- GtkWidget *main_canvas;
- gint day_view_width, day_view_height;
- gint scroll_x, scroll_y;
-
- *x = *y = *width = *height = 0;
-
- g_return_if_fail (EA_IS_DAY_VIEW_CELL (component));
-
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE(component));
- if (!g_obj)
- /* defunct object*/
- return;
-
- cell = E_DAY_VIEW_CELL (g_obj);
- day_view = cell->day_view;
- main_canvas = cell->day_view->main_canvas;
-
- atk_obj = atk_gobject_accessible_for_object (G_OBJECT (main_canvas));
- atk_component_get_extents (ATK_COMPONENT (atk_obj),
- x, y,
- &day_view_width, &day_view_height,
- coord_type);
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (day_view->main_canvas),
- &scroll_x, &scroll_y);
- *x += day_view->day_offsets[cell->column] - scroll_x;
- *y += day_view->row_height * cell->row
- - scroll_y;
- *width = day_view->day_widths[cell->column];
- *height = day_view->row_height;
-}
-
-static gboolean
-component_interface_grab_focus (AtkComponent *comp)
-{
- GObject *g_obj;
- EDayViewCell *cell;
- EDayView *day_view;
- GtkWidget *toplevel;
-
- g_return_val_if_fail (EA_IS_DAY_VIEW_CELL (comp), FALSE);
-
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (comp));
- if (!g_obj)
- return FALSE;
-
- cell = E_DAY_VIEW_CELL (g_obj);
- day_view = cell->day_view;
-
- day_view->selection_start_day = cell->column;
- day_view->selection_end_day = cell->column;
- day_view->selection_start_row = cell->row;
- day_view->selection_end_row = cell->row;
-
- e_day_view_ensure_rows_visible (day_view,
- day_view->selection_start_row,
- day_view->selection_end_row);
- e_day_view_update_calendar_selection_time (day_view);
- gtk_widget_queue_draw (day_view->main_canvas);
-
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (day_view));
- if (GTK_WIDGET_TOPLEVEL (toplevel))
- gtk_window_present (GTK_WINDOW (toplevel));
-
- return TRUE;
-}
-
diff --git a/a11y/calendar/ea-day-view-cell.h b/a11y/calendar/ea-day-view-cell.h
deleted file mode 100644
index cba2fec15b..0000000000
--- a/a11y/calendar/ea-day-view-cell.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-day-view-cell.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#ifndef __EA_DAY_VIEW_CELL_H__
-#define __EA_DAY_VIEW_CELL_H__
-
-#include <atk/atkgobjectaccessible.h>
-#include "e-day-view.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define E_TYPE_DAY_VIEW_CELL (e_day_view_cell_get_type ())
-#define E_DAY_VIEW_CELL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_DAY_VIEW_CELL, EDayViewCell))
-#define E_DAY_VIEW_CELL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_DAY_VIEW_CELL, EDayViewCellClass))
-#define E_IS_DAY_VIEW_CELL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_DAY_VIEW_CELL))
-#define E_IS_DAY_VIEW_CELL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_DAY_VIEW_CELL))
-#define E_DAY_VIEW_CELL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TYPE_DAY_VIEW_CELL, EDayViewCellClass))
-
-typedef struct _EDayViewCell EDayViewCell;
-typedef struct _EDayViewCellClass EDayViewCellClass;
-
-struct _EDayViewCell
-{
- GObject parent;
- EDayView *day_view;
- gint row;
- gint column;
-};
-
-GType e_day_view_cell_get_type (void);
-
-struct _EDayViewCellClass
-{
- GObjectClass parent_class;
-};
-
-EDayViewCell * e_day_view_cell_new (EDayView *day_view, gint row, gint column);
-
-#define EA_TYPE_DAY_VIEW_CELL (ea_day_view_cell_get_type ())
-#define EA_DAY_VIEW_CELL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_DAY_VIEW_CELL, EaDayViewCell))
-#define EA_DAY_VIEW_CELL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_DAY_VIEW_CELL, EaDayViewCellClass))
-#define EA_IS_DAY_VIEW_CELL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_DAY_VIEW_CELL))
-#define EA_IS_DAY_VIEW_CELL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EA_TYPE_DAY_VIEW_CELL))
-#define EA_DAY_VIEW_CELL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EA_TYPE_DAY_VIEW_CELL, EaDayViewCellClass))
-
-typedef struct _EaDayViewCell EaDayViewCell;
-typedef struct _EaDayViewCellClass EaDayViewCellClass;
-
-struct _EaDayViewCell
-{
- AtkGObjectAccessible parent;
-};
-
-GType ea_day_view_cell_get_type (void);
-
-struct _EaDayViewCellClass
-{
- AtkGObjectAccessibleClass parent_class;
-};
-
-AtkObject* ea_day_view_cell_new (GObject *gobj);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __EA_DAY_VIEW_CELL_H__ */
diff --git a/a11y/calendar/ea-day-view-main-item.c b/a11y/calendar/ea-day-view-main-item.c
deleted file mode 100644
index b65ad63957..0000000000
--- a/a11y/calendar/ea-day-view-main-item.c
+++ /dev/null
@@ -1,1292 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-day-view-main-item.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#include "ea-day-view-main-item.h"
-#include "e-day-view-top-item.h"
-#include "ea-day-view.h"
-#include "ea-day-view-cell.h"
-#include "ea-cell-table.h"
-#include <libgnome/gnome-i18n.h>
-
-/* EaDayViewMainItem */
-static void ea_day_view_main_item_class_init (EaDayViewMainItemClass *klass);
-
-static void ea_day_view_main_item_finalize (GObject *object);
-static G_CONST_RETURN gchar* ea_day_view_main_item_get_name (AtkObject *accessible);
-static G_CONST_RETURN gchar* ea_day_view_main_item_get_description (AtkObject *accessible);
-
-static gint ea_day_view_main_item_get_n_children (AtkObject *obj);
-static AtkObject* ea_day_view_main_item_ref_child (AtkObject *obj,
- gint i);
-static AtkObject * ea_day_view_main_item_get_parent (AtkObject *accessible);
-static gint ea_day_view_main_item_get_index_in_parent (AtkObject *accessible);
-
-/* callbacks */
-static void ea_day_view_main_item_dates_change_cb (GnomeCalendar *gcal, gpointer data);
-static void ea_day_view_main_item_time_change_cb (EDayView *day_view, gpointer data);
-
-/* component interface */
-static void atk_component_interface_init (AtkComponentIface *iface);
-static void component_interface_get_extents (AtkComponent *component,
- gint *x, gint *y,
- gint *width, gint *height,
- AtkCoordType coord_type);
-/* atk table interface */
-static void atk_table_interface_init (AtkTableIface *iface);
-static gint table_interface_get_index_at (AtkTable *table,
- gint row,
- gint column);
-static gint table_interface_get_column_at_index (AtkTable *table,
- gint index);
-static gint table_interface_get_row_at_index (AtkTable *table,
- gint index);
-static AtkObject* table_interface_ref_at (AtkTable *table,
- gint row,
- gint column);
-static gint table_interface_get_n_rows (AtkTable *table);
-static gint table_interface_get_n_columns (AtkTable *table);
-static gint table_interface_get_column_extent_at (AtkTable *table,
- gint row,
- gint column);
-static gint table_interface_get_row_extent_at (AtkTable *table,
- gint row,
- gint column);
-
-static gboolean table_interface_is_row_selected (AtkTable *table,
- gint row);
-static gboolean table_interface_is_column_selected (AtkTable *table,
- gint row);
-static gboolean table_interface_is_selected (AtkTable *table,
- gint row,
- gint column);
-static gint table_interface_get_selected_rows (AtkTable *table,
- gint **rows_selected);
-static gint table_interface_get_selected_columns (AtkTable *table,
- gint **columns_selected);
-static gboolean table_interface_add_row_selection (AtkTable *table, gint row);
-static gboolean table_interface_remove_row_selection (AtkTable *table,
- gint row);
-static gboolean table_interface_add_column_selection (AtkTable *table,
- gint column);
-static gboolean table_interface_remove_column_selection (AtkTable *table,
- gint column);
-static AtkObject* table_interface_get_row_header (AtkTable *table, gint row);
-static AtkObject* table_interface_get_column_header (AtkTable *table,
- gint in_col);
-static AtkObject* table_interface_get_caption (AtkTable *table);
-
-static G_CONST_RETURN gchar*
-table_interface_get_column_description (AtkTable *table, gint in_col);
-
-static G_CONST_RETURN gchar*
-table_interface_get_row_description (AtkTable *table, gint row);
-
-static AtkObject* table_interface_get_summary (AtkTable *table);
-
-/* atk selection interface */
-static void atk_selection_interface_init (AtkSelectionIface *iface);
-static gboolean selection_interface_add_selection (AtkSelection *selection,
- gint i);
-static gboolean selection_interface_clear_selection (AtkSelection *selection);
-static AtkObject* selection_interface_ref_selection (AtkSelection *selection,
- gint i);
-static gint selection_interface_get_selection_count (AtkSelection *selection);
-static gboolean selection_interface_is_child_selected (AtkSelection *selection,
- gint i);
-
-/* helpers */
-static EaCellTable *
-ea_day_view_main_item_get_cell_data (EaDayViewMainItem *ea_main_item);
-
-static void
-ea_day_view_main_item_destory_cell_data (EaDayViewMainItem *ea_main_item);
-
-static gint
-ea_day_view_main_item_get_child_index_at (EaDayViewMainItem *ea_main_item,
- gint row, gint column);
-static gint
-ea_day_view_main_item_get_row_at_index (EaDayViewMainItem *ea_main_item,
- gint index);
-static gint
-ea_day_view_main_item_get_column_at_index (EaDayViewMainItem *ea_main_item,
- gint index);
-static gint
-ea_day_view_main_item_get_row_label (EaDayViewMainItem *ea_main_item,
- gint row, gchar *buffer,
- gint buffer_size);
-
-#ifdef ACC_DEBUG
-static gint n_ea_day_view_main_item_created = 0;
-static gint n_ea_day_view_main_item_destroyed = 0;
-#endif
-
-static gpointer parent_class = NULL;
-
-GType
-ea_day_view_main_item_get_type (void)
-{
- static GType type = 0;
- AtkObjectFactory *factory;
- GTypeQuery query;
- GType derived_atk_type;
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (EaDayViewMainItemClass),
- (GBaseInitFunc) NULL, /* base init */
- (GBaseFinalizeFunc) NULL, /* base finalize */
- (GClassInitFunc) ea_day_view_main_item_class_init,
- (GClassFinalizeFunc) NULL, /* class finalize */
- NULL, /* class data */
- sizeof (EaDayViewMainItem), /* instance size */
- 0, /* nb preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- static const GInterfaceInfo atk_component_info = {
- (GInterfaceInitFunc) atk_component_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
-
- static const GInterfaceInfo atk_table_info = {
- (GInterfaceInitFunc) atk_table_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
- static const GInterfaceInfo atk_selection_info = {
- (GInterfaceInitFunc) atk_selection_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
-
-
- /*
- * Figure out the size of the class and instance
- * we are run-time deriving from (GailCanvasItem, in this case)
- *
- */
-
- factory = atk_registry_get_factory (atk_get_default_registry (),
- e_day_view_main_item_get_type());
- derived_atk_type = atk_object_factory_get_accessible_type (factory);
- g_type_query (derived_atk_type, &query);
-
- tinfo.class_size = query.class_size;
- tinfo.instance_size = query.instance_size;
-
- type = g_type_register_static (derived_atk_type,
- "EaDayViewMainItem", &tinfo, 0);
- g_type_add_interface_static (type, ATK_TYPE_COMPONENT,
- &atk_component_info);
- g_type_add_interface_static (type, ATK_TYPE_TABLE,
- &atk_table_info);
- g_type_add_interface_static (type, ATK_TYPE_SELECTION,
- &atk_selection_info);
- }
-
- return type;
-}
-
-static void
-ea_day_view_main_item_class_init (EaDayViewMainItemClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
-
- gobject_class->finalize = ea_day_view_main_item_finalize;
- parent_class = g_type_class_peek_parent (klass);
-
- class->get_name = ea_day_view_main_item_get_name;
- class->get_description = ea_day_view_main_item_get_description;
-
- class->get_n_children = ea_day_view_main_item_get_n_children;
- class->ref_child = ea_day_view_main_item_ref_child;
- class->get_parent = ea_day_view_main_item_get_parent;
- class->get_index_in_parent = ea_day_view_main_item_get_index_in_parent;
-}
-
-AtkObject*
-ea_day_view_main_item_new (GObject *obj)
-{
- AtkObject *accessible;
- GnomeCalendar *gcal;
- EDayViewMainItem *main_item;
-
- g_return_val_if_fail (E_IS_DAY_VIEW_MAIN_ITEM (obj), NULL);
-
- accessible = ATK_OBJECT (g_object_new (EA_TYPE_DAY_VIEW_MAIN_ITEM,
- NULL));
-
- atk_object_initialize (accessible, obj);
- accessible->role = ATK_ROLE_TABLE;
-
-#ifdef ACC_DEBUG
- ++n_ea_day_view_main_item_created;
- printf ("ACC_DEBUG: n_ea_day_view_main_item_created = %d\n",
- n_ea_day_view_main_item_created);
-#endif
- main_item = E_DAY_VIEW_MAIN_ITEM (obj);
- g_signal_connect (main_item->day_view, "selected_time_changed",
- G_CALLBACK (ea_day_view_main_item_time_change_cb),
- accessible);
-
- /* listen for date changes of calendar */
- gcal = e_calendar_view_get_calendar (E_CALENDAR_VIEW (main_item->day_view));
- if (gcal)
- g_signal_connect (gcal, "dates_shown_changed",
- G_CALLBACK (ea_day_view_main_item_dates_change_cb),
- accessible);
-
- return accessible;
-}
-
-static void
-ea_day_view_main_item_finalize (GObject *object)
-{
- EaDayViewMainItem *ea_main_item;
-
- g_return_if_fail (EA_IS_DAY_VIEW_MAIN_ITEM (object));
-
- ea_main_item = EA_DAY_VIEW_MAIN_ITEM (object);
-
- /* Free the allocated cell data */
- ea_day_view_main_item_destory_cell_data (ea_main_item);
-
- G_OBJECT_CLASS (parent_class)->finalize (object);
-#ifdef ACC_DEBUG
- ++n_ea_day_view_main_item_destroyed;
- printf ("ACC_DEBUG: n_ea_day_view_main_item_destroyed = %d\n",
- n_ea_day_view_main_item_destroyed);
-#endif
-}
-
-static G_CONST_RETURN gchar*
-ea_day_view_main_item_get_name (AtkObject *accessible)
-{
- AtkObject *parent;
- g_return_val_if_fail (EA_IS_DAY_VIEW_MAIN_ITEM (accessible), NULL);
- parent = atk_object_get_parent (accessible);
- return atk_object_get_name (parent);
-}
-
-static G_CONST_RETURN gchar*
-ea_day_view_main_item_get_description (AtkObject *accessible)
-{
- return _("a table to view and select the current time range");
-}
-
-static gint
-ea_day_view_main_item_get_n_children (AtkObject *accessible)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
-
- g_return_val_if_fail (EA_IS_DAY_VIEW_MAIN_ITEM (accessible), -1);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- return day_view->rows * day_view->days_shown;
-}
-
-static AtkObject *
-ea_day_view_main_item_ref_child (AtkObject *accessible, gint index)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- gint n_children;
- EDayViewCell *cell;
- EaCellTable *cell_data;
- EaDayViewMainItem *ea_main_item;
-
- g_return_val_if_fail (EA_IS_DAY_VIEW_MAIN_ITEM (accessible), NULL);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- n_children = ea_day_view_main_item_get_n_children (accessible);
- if (index < 0 || index >= n_children)
- return NULL;
-
- ea_main_item = EA_DAY_VIEW_MAIN_ITEM (accessible);
- cell_data = ea_day_view_main_item_get_cell_data (ea_main_item);
- if (!cell_data)
- return NULL;
-
- cell = ea_cell_table_get_cell_at_index (cell_data, index);
- if (!cell) {
- gint row, column;
-
- row = ea_day_view_main_item_get_row_at_index (ea_main_item, index);
- column = ea_day_view_main_item_get_column_at_index (ea_main_item, index);
- cell = e_day_view_cell_new (day_view, row, column);
- ea_cell_table_set_cell_at_index (cell_data, index, cell);
- g_object_unref (cell);
- }
- return g_object_ref (atk_gobject_accessible_for_object (G_OBJECT(cell)));
-}
-
-static AtkObject *
-ea_day_view_main_item_get_parent (AtkObject *accessible)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
-
- g_return_val_if_fail (EA_IS_DAY_VIEW_MAIN_ITEM (accessible), NULL);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- return gtk_widget_get_accessible (GTK_WIDGET (main_item->day_view));
-}
-
-static gint
-ea_day_view_main_item_get_index_in_parent (AtkObject *accessible)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
-
- g_return_val_if_fail (EA_IS_DAY_VIEW_MAIN_ITEM (accessible), -1);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- /* always the first child of ea-day-view */
- return 0;
-}
-
-/* callbacks */
-
-static void
-ea_day_view_main_item_dates_change_cb (GnomeCalendar *gcal, gpointer data)
-{
- EaDayViewMainItem *ea_main_item;
-
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
- g_return_if_fail (data);
- g_return_if_fail (EA_IS_DAY_VIEW_MAIN_ITEM (data));
-
- ea_main_item = EA_DAY_VIEW_MAIN_ITEM (data);
-
-#ifdef ACC_DEBUG
- printf ("EvoAcc: ea_day_view_main_item update cb\n");
-#endif
-
- ea_day_view_main_item_destory_cell_data (ea_main_item);
-}
-
-static void
-ea_day_view_main_item_time_change_cb (EDayView *day_view, gpointer data)
-{
- EaDayViewMainItem *ea_main_item;
- AtkObject *item_cell = NULL;
-
- g_return_if_fail (E_IS_DAY_VIEW (day_view));
- g_return_if_fail (data);
- g_return_if_fail (EA_IS_DAY_VIEW_MAIN_ITEM (data));
-
- ea_main_item = EA_DAY_VIEW_MAIN_ITEM (data);
-
-#ifdef ACC_DEBUG
- printf ("EvoAcc: ea_day_view_main_item time changed cb\n");
-#endif
- /* only deal with the first selected child, for now */
- item_cell = atk_selection_ref_selection (ATK_SELECTION (ea_main_item),
- 0);
- if (item_cell) {
- AtkStateSet *state_set;
- state_set = atk_object_ref_state_set (item_cell);
- atk_state_set_add_state (state_set, ATK_STATE_FOCUSED);
- g_object_unref (state_set);
-
- g_signal_emit_by_name (ea_main_item,
- "active-descendant-changed",
- item_cell);
- g_signal_emit_by_name (data, "selection_changed");
-
- atk_focus_tracker_notify (item_cell);
- g_object_unref (item_cell);
- }
-
-}
-
-/* helpers */
-
-static gint
-ea_day_view_main_item_get_child_index_at (EaDayViewMainItem *ea_main_item,
- gint row, gint column)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
-
- g_return_val_if_fail (ea_main_item, -1);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- if (row >= 0 && row < day_view->rows &&
- column >= 0 && column < day_view->days_shown)
- return column * day_view->rows + row;
- return -1;
-}
-
-static gint
-ea_day_view_main_item_get_row_at_index (EaDayViewMainItem *ea_main_item,
- gint index)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- gint n_children;
-
- g_return_val_if_fail (ea_main_item, -1);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- n_children = ea_day_view_main_item_get_n_children (ATK_OBJECT (ea_main_item));
- if (index >= 0 && index < n_children)
- return index % day_view->rows;
- return -1;
-}
-
-static gint
-ea_day_view_main_item_get_column_at_index (EaDayViewMainItem *ea_main_item,
- gint index)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- gint n_children;
-
- g_return_val_if_fail (ea_main_item, -1);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- n_children = ea_day_view_main_item_get_n_children (ATK_OBJECT (ea_main_item));
- if (index >= 0 && index < n_children)
- return index / day_view->rows;
- return -1;
-}
-
-static gint
-ea_day_view_main_item_get_row_label (EaDayViewMainItem *ea_main_item,
- gint row, gchar *buffer, gint buffer_size)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- gchar *suffix;
- gint hour, minute, suffix_width;
-
- g_return_val_if_fail (ea_main_item, 0);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return 0 ;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- hour = day_view->first_hour_shown;
- minute = day_view->first_minute_shown;
- minute += row * day_view->mins_per_row;
- hour = (hour + minute / 60) % 24;
- minute %= 60;
-
- e_day_view_convert_time_to_display (day_view, hour, &hour,
- &suffix, &suffix_width);
- return g_snprintf (buffer, buffer_size, "%i:%02i %s",
- hour, minute, suffix);
-}
-
-static EaCellTable *
-ea_day_view_main_item_get_cell_data (EaDayViewMainItem *ea_main_item)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- EaCellTable *cell_data;
-
- g_return_val_if_fail (ea_main_item, NULL);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- cell_data = g_object_get_data (G_OBJECT(ea_main_item),
- "ea-day-view-cell-table");
- if (!cell_data) {
- cell_data = ea_cell_table_create (day_view->rows,
- day_view->days_shown, TRUE);
- g_object_set_data (G_OBJECT(ea_main_item),
- "ea-day-view-cell-table", cell_data);
- }
- return cell_data;
-}
-
-static void
-ea_day_view_main_item_destory_cell_data (EaDayViewMainItem *ea_main_item)
-{
- EaCellTable *cell_data;
-
- g_return_if_fail (ea_main_item);
-
- cell_data = g_object_get_data (G_OBJECT(ea_main_item),
- "ea-day-view-cell-table");
- if (cell_data) {
- ea_cell_table_destroy (cell_data);
- g_object_set_data (G_OBJECT(ea_main_item),
- "ea-day-view-cell-table", NULL);
- }
-}
-
-/* Atk Component Interface */
-
-static void
-atk_component_interface_init (AtkComponentIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->get_extents = component_interface_get_extents;
-}
-
-static void
-component_interface_get_extents (AtkComponent *component,
- gint *x, gint *y, gint *width, gint *height,
- AtkCoordType coord_type)
-{
- GObject *g_obj;
- AtkObject *ea_canvas;
- EDayViewMainItem *main_item;
- EDayView *day_view;
-
- *x = *y = *width = *height = 0;
-
- g_return_if_fail (EA_IS_DAY_VIEW_MAIN_ITEM (component));
-
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE(component));
- if (!g_obj)
- /* defunct object*/
- return;
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- ea_canvas = gtk_widget_get_accessible (day_view->main_canvas);
- atk_component_get_extents (ATK_COMPONENT (ea_canvas), x, y,
- width, height, coord_type);
-}
-
-/* atk table interface */
-
-static void
-atk_table_interface_init (AtkTableIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->ref_at = table_interface_ref_at;
-
- iface->get_n_rows = table_interface_get_n_rows;
- iface->get_n_columns = table_interface_get_n_columns;
- iface->get_index_at = table_interface_get_index_at;
- iface->get_column_at_index = table_interface_get_column_at_index;
- iface->get_row_at_index = table_interface_get_row_at_index;
- iface->get_column_extent_at = table_interface_get_column_extent_at;
- iface->get_row_extent_at = table_interface_get_row_extent_at;
-
- iface->is_selected = table_interface_is_selected;
- iface->get_selected_rows = table_interface_get_selected_rows;
- iface->get_selected_columns = table_interface_get_selected_columns;
- iface->is_row_selected = table_interface_is_row_selected;
- iface->is_column_selected = table_interface_is_column_selected;
- iface->add_row_selection = table_interface_add_row_selection;
- iface->remove_row_selection = table_interface_remove_row_selection;
- iface->add_column_selection = table_interface_add_column_selection;
- iface->remove_column_selection = table_interface_remove_column_selection;
-
- iface->get_row_header = table_interface_get_row_header;
- iface->get_column_header = table_interface_get_column_header;
- iface->get_caption = table_interface_get_caption;
- iface->get_summary = table_interface_get_summary;
- iface->get_row_description = table_interface_get_row_description;
- iface->get_column_description = table_interface_get_column_description;
-}
-
-static AtkObject*
-table_interface_ref_at (AtkTable *table,
- gint row,
- gint column)
-{
- gint index;
-
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table);
- index = ea_day_view_main_item_get_child_index_at (ea_main_item,
- row, column);
- return ea_day_view_main_item_ref_child (ATK_OBJECT (ea_main_item), index);
-}
-
-static gint
-table_interface_get_n_rows (AtkTable *table)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- return day_view->rows;
-}
-
-static gint
-table_interface_get_n_columns (AtkTable *table)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- return day_view->days_shown;
-}
-
-static gint
-table_interface_get_index_at (AtkTable *table,
- gint row,
- gint column)
-{
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table);
- return ea_day_view_main_item_get_child_index_at (ea_main_item,
- row, column);
-}
-
-static gint
-table_interface_get_column_at_index (AtkTable *table,
- gint index)
-{
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table);
- return ea_day_view_main_item_get_column_at_index (ea_main_item, index);
-}
-
-static gint
-table_interface_get_row_at_index (AtkTable *table,
- gint index)
-{
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table);
- return ea_day_view_main_item_get_row_at_index (ea_main_item, index);
-}
-
-static gint
-table_interface_get_column_extent_at (AtkTable *table,
- gint row,
- gint column)
-{
- gint index;
- gint width = 0, height = 0;
- AtkObject *child;
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table);
-
- index = ea_day_view_main_item_get_child_index_at (ea_main_item,
- row, column);
- child = atk_object_ref_accessible_child (ATK_OBJECT (ea_main_item),
- index);
- if (child)
- atk_component_get_size (ATK_COMPONENT (child),
- &width, &height);
-
- return width;
-}
-
-static gint
-table_interface_get_row_extent_at (AtkTable *table,
- gint row,
- gint column)
-{
- gint index;
- gint width = 0, height = 0;
- AtkObject *child;
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table);
-
- index = ea_day_view_main_item_get_child_index_at (ea_main_item,
- row, column);
- child = atk_object_ref_accessible_child (ATK_OBJECT (ea_main_item),
- index);
- if (child)
- atk_component_get_size (ATK_COMPONENT (child),
- &width, &height);
-
- return height;
-}
-
-static gboolean
-table_interface_is_row_selected (AtkTable *table,
- gint row)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- if (day_view->selection_start_day == -1)
- /* no selection */
- return FALSE;
- if (day_view->selection_start_day != day_view->selection_end_day)
- /* all row is selected */
- return TRUE;
- if (row >= day_view->selection_start_row &&
- row <= day_view->selection_end_row)
- return TRUE;
- return FALSE;
-}
-
-static gboolean
-table_interface_is_selected (AtkTable *table,
- gint row,
- gint column)
-{
- return table_interface_is_row_selected (table, row) &&
- table_interface_is_column_selected (table, column);
-}
-
-static gboolean
-table_interface_is_column_selected (AtkTable *table,
- gint column)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- if (column >= day_view->selection_start_day &&
- column <= day_view->selection_end_day)
- return TRUE;
- return FALSE;
-}
-
-static gint
-table_interface_get_selected_rows (AtkTable *table,
- gint **rows_selected)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table);
- gint start_row = -1, n_rows = 0;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- if (day_view->selection_start_day == -1)
- return 0;
-
- if (day_view->selection_start_day != day_view->selection_end_day) {
- /* all the rows should be selected */
- n_rows = day_view->rows;
- start_row = 0;
- }
- else if (day_view->selection_start_row != -1) {
- start_row = day_view->selection_start_row;
- n_rows = day_view->selection_end_row - start_row + 1;
- }
- if (n_rows > 0 && start_row != -1 && rows_selected) {
- gint index;
-
- *rows_selected = (gint *) g_malloc (n_rows * sizeof (gint));
- for (index = 0; index < n_rows; ++index)
- (*rows_selected)[index] = start_row + index;
- }
- return n_rows;
-}
-
-static gint
-table_interface_get_selected_columns (AtkTable *table,
- gint **columns_selected)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table);
- gint start_column = -1, n_columns = 0;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- if (day_view->selection_start_day == -1)
- return 0;
-
- start_column = day_view->selection_start_day;
- n_columns = day_view->selection_end_day - start_column + 1;
- if (n_columns > 0 && start_column != -1 && columns_selected) {
- gint index;
-
- *columns_selected = (gint *) g_malloc (n_columns * sizeof (gint));
- for (index = 0; index < n_columns; ++index)
- (*columns_selected)[index] = start_column + index;
- }
- return n_columns;
-}
-
-static gboolean
-table_interface_add_row_selection (AtkTable *table,
- gint row)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- /* FIXME: we need multi-selection */
-
- day_view->selection_start_day = 0;
- day_view->selection_end_day = 0;
- day_view->selection_start_row = row;
- day_view->selection_end_row = row;
-
- e_day_view_ensure_rows_visible (day_view,
- day_view->selection_start_row,
- day_view->selection_end_row);
- e_day_view_update_calendar_selection_time (day_view);
- gtk_widget_queue_draw (day_view->main_canvas);
- return TRUE;
-}
-
-static gboolean
-table_interface_remove_row_selection (AtkTable *table,
- gint row)
-{
- return FALSE;
-}
-
-static gboolean
-table_interface_add_column_selection (AtkTable *table,
- gint column)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- /* FIXME: we need multi-selection */
-
- day_view->selection_start_day = column;
- day_view->selection_end_day = column;
- day_view->selection_start_row = 0;
- day_view->selection_end_row = day_view->rows;
-
- e_day_view_update_calendar_selection_time (day_view);
- gtk_widget_queue_draw (day_view->main_canvas);
- return TRUE;
-}
-
-static gboolean
-table_interface_remove_column_selection (AtkTable *table,
- gint column)
-{
- /* FIXME: NOT IMPLEMENTED */
- return FALSE;
-}
-
-static AtkObject*
-table_interface_get_row_header (AtkTable *table,
- gint row)
-{
- /* FIXME: NOT IMPLEMENTED */
- return NULL;
-}
-
-static AtkObject*
-table_interface_get_column_header (AtkTable *table,
- gint in_col)
-{
- /* FIXME: NOT IMPLEMENTED */
- return NULL;
-}
-
-static AtkObject*
-table_interface_get_caption (AtkTable *table)
-{
- /* FIXME: NOT IMPLEMENTED */
- return NULL;
-}
-
-static G_CONST_RETURN gchar*
-table_interface_get_column_description (AtkTable *table,
- gint in_col)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table);
- const gchar *description;
- EaCellTable *cell_data;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- if (in_col < 0 || in_col >= day_view->days_shown)
- return NULL;
- cell_data = ea_day_view_main_item_get_cell_data (ea_main_item);
- if (!cell_data)
- return NULL;
-
- description = ea_cell_table_get_column_label (cell_data, in_col);
- if (!description) {
- gchar buffer[128];
- e_day_view_top_item_get_day_label (day_view, in_col, buffer, 128);
- ea_cell_table_set_column_label (cell_data, in_col, buffer);
- description = ea_cell_table_get_column_label (cell_data, in_col);
- }
- return description;
-}
-
-static G_CONST_RETURN gchar*
-table_interface_get_row_description (AtkTable *table,
- gint row)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table);
- const gchar *description;
- EaCellTable *cell_data;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- if (row < 0 || row >= 12 * 24)
- return NULL;
- cell_data = ea_day_view_main_item_get_cell_data (ea_main_item);
- if (!cell_data)
- return NULL;
-
- description = ea_cell_table_get_row_label (cell_data, row);
- if (!description) {
- gchar buffer[128];
- ea_day_view_main_item_get_row_label (ea_main_item, row, buffer, sizeof (buffer));
- ea_cell_table_set_row_label (cell_data, row, buffer);
- description = ea_cell_table_get_row_label (cell_data,
- row);
- }
- return description;
-}
-
-static AtkObject*
-table_interface_get_summary (AtkTable *table)
-{
- /* FIXME: NOT IMPLEMENTED */
- return NULL;
-}
-
-/* atkselection interface */
-
-static void
-atk_selection_interface_init (AtkSelectionIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->add_selection = selection_interface_add_selection;
- iface->clear_selection = selection_interface_clear_selection;
- iface->ref_selection = selection_interface_ref_selection;
- iface->get_selection_count = selection_interface_get_selection_count;
- iface->is_child_selected = selection_interface_is_child_selected;
-}
-
-static gboolean
-selection_interface_add_selection (AtkSelection *selection, gint i)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (selection);
- gint column, row;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- row = ea_day_view_main_item_get_row_at_index (ea_main_item, i);
- column = ea_day_view_main_item_get_column_at_index (ea_main_item, i);
-
- if (row == -1 || column == -1)
- return FALSE;
-
- /*FIXME: multi-selection is needed */
- day_view->selection_start_day = column;
- day_view->selection_end_day = column;
- day_view->selection_start_row = row;
- day_view->selection_end_row = row;
-
- e_day_view_ensure_rows_visible (day_view,
- day_view->selection_start_row,
- day_view->selection_end_row);
- e_day_view_update_calendar_selection_time (day_view);
- gtk_widget_queue_draw (day_view->main_canvas);
- return TRUE;
-}
-
-static gboolean
-selection_interface_clear_selection (AtkSelection *selection)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (selection);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- day_view->selection_start_row = -1;
- day_view->selection_start_day = -1;
- day_view->selection_end_row = -1;
- day_view->selection_end_day = -1;
-
- e_day_view_update_calendar_selection_time (day_view);
- gtk_widget_queue_draw (day_view->main_canvas);
-
- return TRUE;
-}
-
-static AtkObject*
-selection_interface_ref_selection (AtkSelection *selection, gint i)
-{
- gint count;
- GObject *g_obj;
- EDayView *day_view;
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (selection);
- gint start_index;
-
- count = selection_interface_get_selection_count (selection);
- if (i < 0 || i >=count)
- return NULL;
-
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (ea_main_item));
- day_view = E_DAY_VIEW_MAIN_ITEM (g_obj)->day_view;
- start_index = ea_day_view_main_item_get_child_index_at (ea_main_item,
- day_view->selection_start_row,
- day_view->selection_start_day);
-
- return ea_day_view_main_item_ref_child (ATK_OBJECT (selection), start_index + i);
-}
-
-static gint
-selection_interface_get_selection_count (AtkSelection *selection)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (selection);
- gint start_index, end_index;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return 0;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- if (day_view->selection_start_day == -1 ||
- day_view->selection_start_row == -1)
- return 0;
- start_index = ea_day_view_main_item_get_child_index_at (ea_main_item,
- day_view->selection_start_row,
- day_view->selection_start_day);
- end_index = ea_day_view_main_item_get_child_index_at (ea_main_item,
- day_view->selection_end_row,
- day_view->selection_end_day);
-
- return end_index - start_index + 1;
-}
-
-static gboolean
-selection_interface_is_child_selected (AtkSelection *selection, gint i)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EDayViewMainItem *main_item;
- EDayView *day_view;
- EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (selection);
- gint column, row;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- main_item = E_DAY_VIEW_MAIN_ITEM (g_obj);
- day_view = main_item->day_view;
-
- row = ea_day_view_main_item_get_row_at_index (ea_main_item, i);
- column = ea_day_view_main_item_get_column_at_index (ea_main_item, i);
-
- if (column < day_view->selection_start_day ||
- column > day_view->selection_end_day)
- return FALSE;
-
- if ((column == day_view->selection_start_day ||
- column == day_view->selection_end_day) &&
- (row < day_view->selection_start_row ||
- row > day_view->selection_end_row))
- return FALSE;
-
- /* if comes here, the cell is selected */
- return TRUE;
-}
diff --git a/a11y/calendar/ea-day-view-main-item.h b/a11y/calendar/ea-day-view-main-item.h
deleted file mode 100644
index d22372d064..0000000000
--- a/a11y/calendar/ea-day-view-main-item.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-day-view-main-item.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#ifndef __EA_DAY_VIEW_MAIN_ITEM_H__
-#define __EA_DAY_VIEW_MAIN_ITEM_H__
-
-#include <atk/atkgobjectaccessible.h>
-#include "e-day-view-main-item.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define EA_TYPE_DAY_VIEW_MAIN_ITEM (ea_day_view_main_item_get_type ())
-#define EA_DAY_VIEW_MAIN_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_DAY_VIEW_MAIN_ITEM, EaDayViewMainItem))
-#define EA_DAY_VIEW_MAIN_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_DAY_VIEW_MAIN_ITEM, EaDayViewMainItemClass))
-#define EA_IS_DAY_VIEW_MAIN_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_DAY_VIEW_MAIN_ITEM))
-#define EA_IS_DAY_VIEW_MAIN_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EA_TYPE_DAY_VIEW_MAIN_ITEM))
-#define EA_DAY_VIEW_MAIN_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EA_TYPE_DAY_VIEW_MAIN_ITEM, EaDayViewMainItemClass))
-
-typedef struct _EaDayViewMainItem EaDayViewMainItem;
-typedef struct _EaDayViewMainItemClass EaDayViewMainItemClass;
-
-struct _EaDayViewMainItem
-{
- AtkGObjectAccessible parent;
-};
-
-GType ea_day_view_main_item_get_type (void);
-
-struct _EaDayViewMainItemClass
-{
- AtkGObjectAccessibleClass parent_class;
-};
-
-AtkObject* ea_day_view_main_item_new (GObject *obj);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __EA_DAY_VIEW_MAIN_ITEM_H__ */
diff --git a/a11y/calendar/ea-day-view.c b/a11y/calendar/ea-day-view.c
deleted file mode 100644
index cfe96634ba..0000000000
--- a/a11y/calendar/ea-day-view.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-day-view.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#include "ea-day-view.h"
-#include "ea-cal-view-event.h"
-
-#include "ea-calendar-helpers.h"
-#include "ea-gnome-calendar.h"
-#include "calendar-commands.h"
-#include <glib/gstrfuncs.h>
-#include <libgnome/gnome-i18n.h>
-
-static void ea_day_view_class_init (EaDayViewClass *klass);
-
-static G_CONST_RETURN gchar* ea_day_view_get_name (AtkObject *accessible);
-static G_CONST_RETURN gchar* ea_day_view_get_description (AtkObject *accessible);
-static gint ea_day_view_get_n_children (AtkObject *obj);
-static AtkObject* ea_day_view_ref_child (AtkObject *obj,
- gint i);
-static gpointer parent_class = NULL;
-
-GType
-ea_day_view_get_type (void)
-{
- static GType type = 0;
- AtkObjectFactory *factory;
- GTypeQuery query;
- GType derived_atk_type;
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (EaDayViewClass),
- (GBaseInitFunc) NULL, /* base init */
- (GBaseFinalizeFunc) NULL, /* base finalize */
- (GClassInitFunc) ea_day_view_class_init, /* class init */
- (GClassFinalizeFunc) NULL, /* class finalize */
- NULL, /* class data */
- sizeof (EaDayView), /* instance size */
- 0, /* nb preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- /*
- * Figure out the size of the class and instance
- * we are run-time deriving from (EaCalView, in this case)
- *
- * Note: we must still use run-time deriving here, because
- * our parent class EaCalView is run-time deriving.
- */
-
- factory = atk_registry_get_factory (atk_get_default_registry (),
- e_cal_view_get_type());
- derived_atk_type = atk_object_factory_get_accessible_type (factory);
- g_type_query (derived_atk_type, &query);
-
- tinfo.class_size = query.class_size;
- tinfo.instance_size = query.instance_size;
-
- type = g_type_register_static (derived_atk_type,
- "EaDayView", &tinfo, 0);
- }
-
- return type;
-}
-
-static void
-ea_day_view_class_init (EaDayViewClass *klass)
-{
- AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_peek_parent (klass);
-
- class->get_name = ea_day_view_get_name;
- class->get_description = ea_day_view_get_description;
-
- class->get_n_children = ea_day_view_get_n_children;
- class->ref_child = ea_day_view_ref_child;
-}
-
-AtkObject*
-ea_day_view_new (GtkWidget *widget)
-{
- GObject *object;
- AtkObject *accessible;
-
- g_return_val_if_fail (E_IS_DAY_VIEW (widget), NULL);
-
- object = g_object_new (EA_TYPE_DAY_VIEW, NULL);
-
- accessible = ATK_OBJECT (object);
- atk_object_initialize (accessible, widget);
-
-#ifdef ACC_DEBUG
- printf ("EvoAcc: ea_day_view created %p\n", (void *)accessible);
-#endif
-
- return accessible;
-}
-
-static G_CONST_RETURN gchar*
-ea_day_view_get_name (AtkObject *accessible)
-{
- EDayView *day_view;
- GnomeCalendar *gcal;
- const gchar *label_text;
- GnomeCalendarViewType view_type;
- gint n_events;
- gchar *event_str, *name_str;
-
- g_return_val_if_fail (EA_IS_DAY_VIEW (accessible), NULL);
-
- if (!GTK_ACCESSIBLE (accessible)->widget)
- return NULL;
-
- day_view = E_DAY_VIEW (GTK_ACCESSIBLE (accessible)->widget);
- gcal = e_calendar_view_get_calendar (E_CALENDAR_VIEW (day_view));
- label_text = ea_gnome_calendar_get_label_description (gcal);
-
- n_events = atk_object_get_n_accessible_children (accessible);
- /* the child main item is always there */
- --n_events;
- if (n_events >= 1)
- event_str = g_strdup_printf (ngettext ("It has %d event.", "It has %d events.", n_events), n_events);
- else
- event_str = g_strdup (_("It has no events."));
-
- view_type = gnome_calendar_get_view (gcal);
- if (view_type == GNOME_CAL_WORK_WEEK_VIEW)
- name_str = g_strdup_printf (_("Work Week View: %s. %s"),
- label_text, event_str);
- else
- name_str = g_strdup_printf (_("Day View: %s. %s"),
- label_text, event_str);
-
- ATK_OBJECT_CLASS (parent_class)->set_name (accessible, name_str);
- g_free (name_str);
- g_free (event_str);
-
- return accessible->name;
-}
-
-static G_CONST_RETURN gchar*
-ea_day_view_get_description (AtkObject *accessible)
-{
- EDayView *day_view;
-
- g_return_val_if_fail (EA_IS_DAY_VIEW (accessible), NULL);
-
- if (!GTK_ACCESSIBLE (accessible)->widget)
- return NULL;
- day_view = E_DAY_VIEW (GTK_ACCESSIBLE (accessible)->widget);
-
- if (accessible->description)
- return accessible->description;
- else {
- GnomeCalendar *gcal;
- GnomeCalendarViewType view_type;
-
- gcal = e_calendar_view_get_calendar (E_CALENDAR_VIEW (day_view));
- view_type = gnome_calendar_get_view (gcal);
-
- if (view_type == GNOME_CAL_WORK_WEEK_VIEW)
- return _("calendar view for a work week");
- else
- return _("calendar view for one or more days");
- }
-}
-
-static gint
-ea_day_view_get_n_children (AtkObject *accessible)
-{
- EDayView *day_view;
- gint day;
- gint child_num = 0;
-
- g_return_val_if_fail (EA_IS_DAY_VIEW (accessible), -1);
-
- if (!GTK_ACCESSIBLE (accessible)->widget)
- return -1;
-
- day_view = E_DAY_VIEW (GTK_ACCESSIBLE (accessible)->widget);
-
- child_num += day_view->long_events->len;
-
- for (day = 0; day < day_view->days_shown; day++) {
- child_num += day_view->events[day]->len;
- }
-
- /* "+1" for the main item */
- return child_num + 1;
-}
-
-static AtkObject *
-ea_day_view_ref_child (AtkObject *accessible, gint index)
-{
- EDayView *day_view;
- gint child_num;
- gint day;
- AtkObject *atk_object = NULL;
- EDayViewEvent *event = NULL;
-
- g_return_val_if_fail (EA_IS_DAY_VIEW (accessible), NULL);
-
- child_num = atk_object_get_n_accessible_children (accessible);
- if (child_num <= 0 || index < 0 || index >= child_num)
- return NULL;
-
- if (!GTK_ACCESSIBLE (accessible)->widget)
- return NULL;
- day_view = E_DAY_VIEW (GTK_ACCESSIBLE (accessible)->widget);
-
- if (index == 0) {
- /* index == 0 is the main item */
- atk_object = atk_gobject_accessible_for_object (G_OBJECT (day_view->main_canvas_item));
- g_object_ref (atk_object);
- }
- else {
- --index;
- /* a long event */
- if (index < day_view->long_events->len) {
- event = &g_array_index (day_view->long_events,
- EDayViewEvent, index);
- }
- else {
- index -= day_view->long_events->len;
- day = 0;
- while (index >= day_view->events[day]->len) {
- index -= day_view->events[day]->len;
- ++day;
- }
-
- event = &g_array_index (day_view->events[day],
- EDayViewEvent, index);
- }
- if (event && event->canvas_item) {
- /* Not use atk_gobject_accessible_for_object here,
- * we need to do special thing here
- */
- atk_object = ea_calendar_helpers_get_accessible_for (event->canvas_item);
- g_object_ref (atk_object);
- }
- }
- return atk_object;
-}
diff --git a/a11y/calendar/ea-day-view.h b/a11y/calendar/ea-day-view.h
deleted file mode 100644
index 5ca4614f03..0000000000
--- a/a11y/calendar/ea-day-view.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-day-view.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#ifndef __EA_DAY_VIEW_H__
-#define __EA_DAY_VIEW_H__
-
-#include "ea-cal-view.h"
-#include "e-day-view.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define EA_TYPE_DAY_VIEW (ea_day_view_get_type ())
-#define EA_DAY_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_DAY_VIEW, EaDayView))
-#define EA_DAY_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_DAY_VIEW, EaDayViewClass))
-#define EA_IS_DAY_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_DAY_VIEW))
-#define EA_IS_DAY_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EA_TYPE_DAY_VIEW))
-#define EA_DAY_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EA_TYPE_DAY_VIEW, EaDayViewClass))
-
-typedef struct _EaDayView EaDayView;
-typedef struct _EaDayViewClass EaDayViewClass;
-
-struct _EaDayView
-{
- EaCalView parent;
-};
-
-GType ea_day_view_get_type (void);
-
-struct _EaDayViewClass
-{
- EaCalViewClass parent_class;
-};
-
-AtkObject* ea_day_view_new (GtkWidget *widget);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __EA_DAY_VIEW_H__ */
diff --git a/a11y/calendar/ea-gnome-calendar.c b/a11y/calendar/ea-gnome-calendar.c
deleted file mode 100644
index fc0027008f..0000000000
--- a/a11y/calendar/ea-gnome-calendar.c
+++ /dev/null
@@ -1,353 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-gnome-calendar.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#include "ea-gnome-calendar.h"
-#include "calendar-commands.h"
-#include <string.h>
-#include <gtk/gtknotebook.h>
-#include <libecal/e-cal-time-util.h>
-#include <libgnome/gnome-i18n.h>
-
-static void ea_gnome_calendar_class_init (EaGnomeCalendarClass *klass);
-
-static G_CONST_RETURN gchar* ea_gnome_calendar_get_name (AtkObject *accessible);
-static G_CONST_RETURN gchar* ea_gnome_calendar_get_description (AtkObject *accessible);
-static gint ea_gnome_calendar_get_n_children (AtkObject* obj);
-static AtkObject * ea_gnome_calendar_ref_child (AtkObject *obj, gint i);
-
-static void ea_gcal_switch_view_cb (GtkNotebook *widget, GtkNotebookPage *page,
- guint index, gpointer data);
-static void ea_gcal_dates_change_cb (GnomeCalendar *gcal, gpointer data);
-
-static gpointer parent_class = NULL;
-
-GType
-ea_gnome_calendar_get_type (void)
-{
- static GType type = 0;
- AtkObjectFactory *factory;
- GTypeQuery query;
- GType derived_atk_type;
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (EaGnomeCalendarClass),
- (GBaseInitFunc) NULL, /* base init */
- (GBaseFinalizeFunc) NULL, /* base finalize */
- (GClassInitFunc) ea_gnome_calendar_class_init, /* class init */
- (GClassFinalizeFunc) NULL, /* class finalize */
- NULL, /* class data */
- sizeof (EaGnomeCalendar), /* instance size */
- 0, /* nb preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- /*
- * Figure out the size of the class and instance
- * we are run-time deriving from (GailWidget, in this case)
- */
-
- factory = atk_registry_get_factory (atk_get_default_registry (),
- GTK_TYPE_WIDGET);
- derived_atk_type = atk_object_factory_get_accessible_type (factory);
- g_type_query (derived_atk_type, &query);
- tinfo.class_size = query.class_size;
- tinfo.instance_size = query.instance_size;
-
- type = g_type_register_static (derived_atk_type,
- "EaGnomeCalendar", &tinfo, 0);
-
- }
-
- return type;
-}
-
-static void
-ea_gnome_calendar_class_init (EaGnomeCalendarClass *klass)
-{
- AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_peek_parent (klass);
-
- class->get_name = ea_gnome_calendar_get_name;
- class->get_description = ea_gnome_calendar_get_description;
-
- class->get_n_children = ea_gnome_calendar_get_n_children;
- class->ref_child = ea_gnome_calendar_ref_child;
-}
-
-AtkObject*
-ea_gnome_calendar_new (GtkWidget *widget)
-{
- GObject *object;
- AtkObject *accessible;
- GnomeCalendar *gcal;
- GtkWidget *notebook;
-
- g_return_val_if_fail (GNOME_IS_CALENDAR (widget), NULL);
-
- object = g_object_new (EA_TYPE_GNOME_CALENDAR, NULL);
-
- accessible = ATK_OBJECT (object);
- atk_object_initialize (accessible, widget);
-
- accessible->role = ATK_ROLE_FILLER;
-
- gcal = GNOME_CALENDAR (widget);
-
- /* listen on view type change
- */
- g_signal_connect (widget, "dates_shown_changed",
- G_CALLBACK (ea_gcal_dates_change_cb),
- accessible);
- notebook = gnome_calendar_get_view_notebook_widget (gcal);
- if (notebook) {
- g_signal_connect (notebook, "switch_page",
- G_CALLBACK (ea_gcal_switch_view_cb),
- accessible);
- }
-
-#ifdef ACC_DEBUG
- printf ("EvoAcc: ea-gnome-calendar created: %p\n", (void *)accessible);
-#endif
-
- return accessible;
-}
-
-const gchar *
-ea_gnome_calendar_get_label_description (GnomeCalendar *gcal)
-{
- icaltimezone *zone;
- struct icaltimetype start_tt, end_tt;
- time_t start_time, end_time;
- struct tm start_tm, end_tm;
- static char buffer[512];
- char end_buffer[256];
- GnomeCalendarViewType view;
-
- gnome_calendar_get_visible_time_range (gcal, &start_time, &end_time);
- zone = gnome_calendar_get_timezone (gcal);
-
- start_tt = icaltime_from_timet_with_zone (start_time, FALSE, zone);
- start_tm.tm_year = start_tt.year - 1900;
- start_tm.tm_mon = start_tt.month - 1;
- start_tm.tm_mday = start_tt.day;
- start_tm.tm_hour = start_tt.hour;
- start_tm.tm_min = start_tt.minute;
- start_tm.tm_sec = start_tt.second;
- start_tm.tm_isdst = -1;
- start_tm.tm_wday = time_day_of_week (start_tt.day, start_tt.month - 1,
- start_tt.year);
-
- /* Take one off end_time so we don't get an extra day. */
- end_tt = icaltime_from_timet_with_zone (end_time - 1, FALSE, zone);
- end_tm.tm_year = end_tt.year - 1900;
- end_tm.tm_mon = end_tt.month - 1;
- end_tm.tm_mday = end_tt.day;
- end_tm.tm_hour = end_tt.hour;
- end_tm.tm_min = end_tt.minute;
- end_tm.tm_sec = end_tt.second;
- end_tm.tm_isdst = -1;
- end_tm.tm_wday = time_day_of_week (end_tt.day, end_tt.month - 1,
- end_tt.year);
-
- view = gnome_calendar_get_view (gcal);
-
- switch (view) {
- case GNOME_CAL_DAY_VIEW:
- case GNOME_CAL_WORK_WEEK_VIEW:
- case GNOME_CAL_WEEK_VIEW:
- if (start_tm.tm_year == end_tm.tm_year
- && start_tm.tm_mon == end_tm.tm_mon
- && start_tm.tm_mday == end_tm.tm_mday) {
- e_utf8_strftime (buffer, sizeof (buffer),
- _("%A %d %b %Y"), &start_tm);
- } else if (start_tm.tm_year == end_tm.tm_year) {
- e_utf8_strftime (buffer, sizeof (buffer),
- _("%a %d %b"), &start_tm);
- e_utf8_strftime (end_buffer, sizeof (end_buffer),
- _("%a %d %b %Y"), &end_tm);
- strcat (buffer, " - ");
- strcat (buffer, end_buffer);
- } else {
- e_utf8_strftime (buffer, sizeof (buffer),
- _("%a %d %b %Y"), &start_tm);
- e_utf8_strftime (end_buffer, sizeof (end_buffer),
- _("%a %d %b %Y"), &end_tm);
- strcat (buffer, " - ");
- strcat (buffer, end_buffer);
- }
- break;
- case GNOME_CAL_MONTH_VIEW:
- case GNOME_CAL_LIST_VIEW:
- if (start_tm.tm_year == end_tm.tm_year) {
- if (start_tm.tm_mon == end_tm.tm_mon) {
- if (start_tm.tm_mday == end_tm.tm_mday) {
- buffer [0] = '\0';
- } else {
- e_utf8_strftime (buffer, sizeof (buffer),
- "%d", &start_tm);
- strcat (buffer, " - ");
- }
- e_utf8_strftime (end_buffer, sizeof (end_buffer),
- _("%d %b %Y"), &end_tm);
- strcat (buffer, end_buffer);
- } else {
- e_utf8_strftime (buffer, sizeof (buffer),
- _("%d %b"), &start_tm);
- e_utf8_strftime (end_buffer, sizeof (end_buffer),
- _("%d %b %Y"), &end_tm);
- strcat (buffer, " - ");
- strcat (buffer, end_buffer);
- }
- } else {
- e_utf8_strftime (buffer, sizeof (buffer),
- _("%d %b %Y"), &start_tm);
- e_utf8_strftime (end_buffer, sizeof (end_buffer),
- _("%d %b %Y"), &end_tm);
- strcat (buffer, " - ");
- strcat (buffer, end_buffer);
- }
- break;
- default:
- g_assert_not_reached ();
- return NULL;
- }
- return buffer;
-}
-
-static G_CONST_RETURN gchar*
-ea_gnome_calendar_get_name (AtkObject *accessible)
-{
- if (accessible->name)
- return accessible->name;
- return _("Gnome Calendar");
-}
-
-static G_CONST_RETURN gchar*
-ea_gnome_calendar_get_description (AtkObject *accessible)
-{
- if (accessible->description)
- return accessible->description;
- return _("Gnome Calendar");
-}
-
-static gint
-ea_gnome_calendar_get_n_children (AtkObject* obj)
-{
- g_return_val_if_fail (EA_IS_GNOME_CALENDAR (obj), 0);
-
- if (!GTK_ACCESSIBLE (obj)->widget)
- return -1;
- return 4;
-}
-
-static AtkObject *
-ea_gnome_calendar_ref_child (AtkObject *obj, gint i)
-{
- AtkObject * child = NULL;
- GnomeCalendar * calendarWidget;
- GtkWidget *childWidget;
-
- g_return_val_if_fail (EA_IS_GNOME_CALENDAR (obj), NULL);
- /* valid child index range is [0-3] */
- if (i < 0 || i >3 )
- return NULL;
-
- if (!GTK_ACCESSIBLE (obj)->widget)
- return NULL;
- calendarWidget = GNOME_CALENDAR (GTK_ACCESSIBLE (obj)->widget);
-
- switch (i) {
- case 0:
- /* for the search bar */
- childWidget = gnome_calendar_get_search_bar_widget (calendarWidget);
- child = gtk_widget_get_accessible (childWidget);
- atk_object_set_parent (child, obj);
- atk_object_set_name (child, _("search bar"));
- atk_object_set_description (child, _("evolution calendar search bar"));
- break;
- case 1:
- /* for the day/week view */
- childWidget = gnome_calendar_get_current_view_widget (calendarWidget);
- child = gtk_widget_get_accessible (childWidget);
- atk_object_set_parent (child, obj);
- break;
- case 2:
- /* for calendar */
- childWidget = gnome_calendar_get_e_calendar_widget (calendarWidget);
- child = gtk_widget_get_accessible (childWidget);
- break;
- case 3:
- /* for todo list */
- childWidget = GTK_WIDGET (gnome_calendar_get_task_pad (calendarWidget));
- child = gtk_widget_get_accessible (childWidget);
- break;
- default:
- break;
- }
- if (child)
- g_object_ref(child);
- return child;
-}
-
-static void
-ea_gcal_switch_view_cb (GtkNotebook *widget, GtkNotebookPage *page,
- guint index, gpointer data)
-{
- GtkWidget *new_widget;
-
- new_widget = gtk_notebook_get_nth_page (widget, index);
-
- /* views are always the second child in gnome calendar
- */
- if (new_widget)
- g_signal_emit_by_name (G_OBJECT(data), "children_changed::add",
- 1, gtk_widget_get_accessible (new_widget), NULL);
-
-#ifdef ACC_DEBUG
- printf ("AccDebug: view switch to widget %p (index=%d) \n",
- (void *)new_widget, index);
-#endif
-}
-
-static void
-ea_gcal_dates_change_cb (GnomeCalendar *gcal, gpointer data)
-{
- const gchar *new_name;
-
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
- g_return_if_fail (data);
- g_return_if_fail (EA_IS_GNOME_CALENDAR (data));
-
- new_name = ea_gnome_calendar_get_label_description (gcal);
- atk_object_set_name (ATK_OBJECT(data), new_name);
- g_signal_emit_by_name (data, "visible_data_changed");
-
-#ifdef ACC_DEBUG
- printf ("AccDebug: calendar dates changed, label=%s\n", new_name);
-#endif
-}
diff --git a/a11y/calendar/ea-gnome-calendar.h b/a11y/calendar/ea-gnome-calendar.h
deleted file mode 100644
index 130466add3..0000000000
--- a/a11y/calendar/ea-gnome-calendar.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-gnome-calendar.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#ifndef __EA_GNOME_CALENDAR_H__
-#define __EA_GNOME_CALENDAR_H__
-
-#include <gtk/gtkaccessible.h>
-#include "gnome-cal.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define EA_TYPE_GNOME_CALENDAR (ea_gnome_calendar_get_type ())
-#define EA_GNOME_CALENDAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_GNOME_CALENDAR, EaGnomeCalendar))
-#define EA_GNOME_CALENDAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_GNOME_CALENDAR, EaGnomeCalendarClass))
-#define EA_IS_GNOME_CALENDAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_GNOME_CALENDAR))
-#define EA_IS_GNOME_CALENDAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EA_TYPE_GNOME_CALENDAR))
-#define EA_GNOME_CALENDAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EA_TYPE_GNOME_CALENDAR, EaGnomeCalendarClass))
-
-typedef struct _EaGnomeCalendar EaGnomeCalendar;
-typedef struct _EaGnomeCalendarClass EaGnomeCalendarClass;
-
-struct _EaGnomeCalendar
-{
- GtkAccessible parent;
-};
-
-GType ea_gnome_calendar_get_type (void);
-
-struct _EaGnomeCalendarClass
-{
- GtkAccessibleClass parent_class;
-};
-
-AtkObject* ea_gnome_calendar_new (GtkWidget *widget);
-
-const gchar * ea_gnome_calendar_get_label_description (GnomeCalendar *gcal);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __EA_GNOME_CALENDAR_H__ */
diff --git a/a11y/calendar/ea-jump-button.c b/a11y/calendar/ea-jump-button.c
deleted file mode 100644
index d9bab31943..0000000000
--- a/a11y/calendar/ea-jump-button.c
+++ /dev/null
@@ -1,226 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-jump-button.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Yang Wu <yang.wu@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#include "ea-jump-button.h"
-#include "ea-calendar-helpers.h"
-#include "ea-week-view.h"
-#include "e-week-view.h"
-#include <libgnomecanvas/gnome-canvas.h>
-#include <libgnome/gnome-i18n.h>
-
-static void ea_jump_button_class_init (EaJumpButtonClass *klass);
-
-static G_CONST_RETURN gchar* ea_jump_button_get_name (AtkObject *accessible);
-static G_CONST_RETURN gchar* ea_jump_button_get_description (AtkObject *accessible);
-
-/* action interface */
-static void atk_action_interface_init (AtkActionIface *iface);
-static gboolean jump_button_do_action (AtkAction *action,
- gint i);
-static gint jump_button_get_n_actions (AtkAction *action);
-static G_CONST_RETURN gchar* jump_button_get_keybinding (AtkAction *action,
- gint i);
-
-static gpointer parent_class = NULL;
-
-GType
-ea_jump_button_get_type (void)
-{
- static GType type = 0;
- AtkObjectFactory *factory;
- GTypeQuery query;
- GType derived_atk_type;
-
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (EaJumpButtonClass),
- (GBaseInitFunc) NULL, /* base init */
- (GBaseFinalizeFunc) NULL, /* base finalize */
- (GClassInitFunc) ea_jump_button_class_init, /* class init */
- (GClassFinalizeFunc) NULL, /* class finalize */
- NULL, /* class data */
- sizeof (EaJumpButton), /* instance size */
- 0, /* nb preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- static const GInterfaceInfo atk_action_info =
- {
- (GInterfaceInitFunc) atk_action_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
-
- /*
- * Figure out the size of the class and instance
- * we are run-time deriving from (atk object for GNOME_TYPE_CANVAS_ITEM, in this case)
- */
-
- factory = atk_registry_get_factory (atk_get_default_registry (),
- GNOME_TYPE_CANVAS_ITEM);
- derived_atk_type = atk_object_factory_get_accessible_type (factory);
- g_type_query (derived_atk_type, &query);
-
- tinfo.class_size = query.class_size;
- tinfo.instance_size = query.instance_size;
-
- /* we inherit the component and other interfaces from GNOME_TYPE_CANVAS_ITEM */
- type = g_type_register_static (derived_atk_type,
- "EaJumpButton", &tinfo, 0);
-
- g_type_add_interface_static (type, ATK_TYPE_ACTION,
- &atk_action_info);
- }
-
- return type;
-}
-
-static void
-ea_jump_button_class_init (EaJumpButtonClass *klass)
-{
- AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_peek_parent (klass);
-
- class->get_name = ea_jump_button_get_name;
- class->get_description = ea_jump_button_get_description;
-}
-
-AtkObject*
-ea_jump_button_new (GObject *obj)
-{
- AtkObject *atk_obj = NULL;
- GObject *target_obj;
-
- g_return_val_if_fail (GNOME_IS_CANVAS_ITEM (obj), NULL);
-
- target_obj = obj;
- atk_obj = g_object_get_data (target_obj, "accessible-object");
-
- if (!atk_obj) {
- static AtkRole event_role = ATK_ROLE_INVALID;
- atk_obj = ATK_OBJECT (g_object_new (EA_TYPE_JUMP_BUTTON,
- NULL));
- atk_object_initialize (atk_obj, target_obj);
- if (event_role == ATK_ROLE_INVALID)
- event_role = atk_role_register ("Jump Button");
- atk_obj->role = event_role;
- }
-
- /* the registered factory for GNOME_TYPE_CANVAS_ITEM is cannot create a EaJumpbutton,
- * we should save the EaJumpbutton object in it.
- */
- g_object_set_data (obj, "accessible-object", atk_obj);
-
- return atk_obj;
-}
-
-static G_CONST_RETURN gchar*
-ea_jump_button_get_name (AtkObject *accessible)
-{
- g_return_val_if_fail (EA_IS_JUMP_BUTTON (accessible), NULL);
-
- if (accessible->name)
- return accessible->name;
- return _("Jump button");
-}
-
-static G_CONST_RETURN gchar*
-ea_jump_button_get_description (AtkObject *accessible)
-{
- if (accessible->description)
- return accessible->description;
-
- return _("Click here, you can find more events.");
-}
-
-static void
-atk_action_interface_init (AtkActionIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->do_action = jump_button_do_action;
- iface->get_n_actions = jump_button_get_n_actions;
- iface->get_keybinding = jump_button_get_keybinding;
-}
-
-static gboolean
-jump_button_do_action (AtkAction *action,
- gint i)
-{
- gboolean return_value = TRUE;
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- GnomeCanvasItem *item;
- ECalendarView *cal_view;
- EWeekView *week_view;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (action);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- item = GNOME_CANVAS_ITEM (g_obj);
- cal_view = ea_calendar_helpers_get_cal_view_from (GNOME_CANVAS_ITEM (item));
- week_view = E_WEEK_VIEW (cal_view);
-
- switch (i)
- {
- case 0:
- e_week_view_jump_to_button_item (week_view, GNOME_CANVAS_ITEM (item));
- break;
- default:
- return_value = FALSE;
- break;
- }
- return return_value;
-}
-
-static gint
-jump_button_get_n_actions (AtkAction *action)
-{
- return 1;
-}
-
-static G_CONST_RETURN gchar*
-jump_button_get_keybinding (AtkAction *action,
- gint i)
-{
- gchar *return_value = NULL;
-
- switch (i)
- {
- case 0:
- {
- return_value = "space or enter";
- break;
- }
- default:
- break;
- }
- return return_value;
-}
diff --git a/a11y/calendar/ea-jump-button.h b/a11y/calendar/ea-jump-button.h
deleted file mode 100644
index ef1f1efb35..0000000000
--- a/a11y/calendar/ea-jump-button.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-jump-button.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Yang Wu <yang.wu@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#ifndef __EA_JUMP_BUTTON_H__
-#define __EA_JUMP_BUTTON_H__
-
-#include <atk/atkgobjectaccessible.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define EA_TYPE_JUMP_BUTTON (ea_jump_button_get_type ())
-#define EA_JUMP_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_JUMP_BUTTON, EaJumpButton))
-#define EA_JUMP_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_JUMP_BUTTON, EaJumpButtonClass))
-#define EA_IS_JUMP_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_JUMP_BUTTON))
-#define EA_IS_JUMP_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EA_TYPE_JUMP_BUTTON))
-#define EA_JUMP_BUTTON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EA_TYPE_JUMP_BUTTON, EaJumpButtonClass))
-
-typedef struct _EaJumpButton EaJumpButton;
-typedef struct _EaJumpButtonClass EaJumpButtonClass;
-
-struct _EaJumpButton
-{
- AtkGObjectAccessible parent;
-};
-
-GType ea_jump_button_get_type (void);
-
-struct _EaJumpButtonClass
-{
- AtkGObjectAccessibleClass parent_class;
-};
-
-AtkObject *ea_jump_button_new (GObject *obj);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __EA_JUMP_BUTTON_H__ */
diff --git a/a11y/calendar/ea-week-view-cell.c b/a11y/calendar/ea-week-view-cell.c
deleted file mode 100644
index 543b26794a..0000000000
--- a/a11y/calendar/ea-week-view-cell.c
+++ /dev/null
@@ -1,478 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-week-view-cell.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- * Author: Yang Wu <Yang.Wu@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#include "ea-week-view-cell.h"
-#include "ea-week-view-main-item.h"
-#include "ea-factory.h"
-
-/* EWeekViewCell */
-
-static void e_week_view_cell_class_init (EWeekViewCellClass *class);
-
-EA_FACTORY_GOBJECT (EA_TYPE_WEEK_VIEW_CELL, ea_week_view_cell, ea_week_view_cell_new)
-
-GType
-e_week_view_cell_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (EWeekViewCellClass),
- (GBaseInitFunc) NULL, /* base init */
- (GBaseFinalizeFunc) NULL, /* base finalize */
- (GClassInitFunc) e_week_view_cell_class_init, /* class init */
- (GClassFinalizeFunc) NULL, /* class finalize */
- NULL, /* class data */
- sizeof (EWeekViewCell), /* instance size */
- 0, /* nb preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- type = g_type_register_static (G_TYPE_OBJECT,
- "EWeekViewCell", &tinfo, 0);
- }
-
- return type;
-}
-
-static void
-e_week_view_cell_class_init (EWeekViewCellClass *class)
-{
- EA_SET_FACTORY (e_week_view_cell_get_type (), ea_week_view_cell);
-}
-
-EWeekViewCell *
-e_week_view_cell_new (EWeekView *week_view, gint row, gint column)
-{
- GObject *object;
- EWeekViewCell *cell;
-
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), NULL);
-
- object = g_object_new (E_TYPE_WEEK_VIEW_CELL, NULL);
- cell = E_WEEK_VIEW_CELL (object);
- cell->week_view = week_view;
- cell->row = row;
- cell->column = column;
-
-#ifdef ACC_DEBUG
- printf ("EvoAcc: e_week_view_cell created %p\n", (void *)cell);
-#endif
-
- return cell;
-}
-
-/* EaWeekViewCell */
-
-static void ea_week_view_cell_class_init (EaWeekViewCellClass *klass);
-
-static G_CONST_RETURN gchar* ea_week_view_cell_get_name (AtkObject *accessible);
-static G_CONST_RETURN gchar* ea_week_view_cell_get_description (AtkObject *accessible);
-static AtkStateSet* ea_week_view_cell_ref_state_set (AtkObject *obj);
-static AtkObject * ea_week_view_cell_get_parent (AtkObject *accessible);
-static gint ea_week_view_cell_get_index_in_parent (AtkObject *accessible);
-
-/* component interface */
-static void atk_component_interface_init (AtkComponentIface *iface);
-static void component_interface_get_extents (AtkComponent *component,
- gint *x, gint *y,
- gint *width, gint *height,
- AtkCoordType coord_type);
-static gboolean component_interface_grab_focus (AtkComponent *component);
-
-static gpointer parent_class = NULL;
-
-#ifdef ACC_DEBUG
-static gint n_ea_week_view_cell_created = 0, n_ea_week_view_cell_destroyed = 0;
-static void ea_week_view_cell_finalize (GObject *object);
-#endif
-
-GType
-ea_week_view_cell_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (EaWeekViewCellClass),
- (GBaseInitFunc) NULL, /* base init */
- (GBaseFinalizeFunc) NULL, /* base finalize */
- (GClassInitFunc) ea_week_view_cell_class_init, /* class init */
- (GClassFinalizeFunc) NULL, /* class finalize */
- NULL, /* class data */
- sizeof (EaWeekViewCell), /* instance size */
- 0, /* nb preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- static const GInterfaceInfo atk_component_info = {
- (GInterfaceInitFunc) atk_component_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
- type = g_type_register_static (ATK_TYPE_GOBJECT_ACCESSIBLE,
- "EaWeekViewCell", &tinfo, 0);
- g_type_add_interface_static (type, ATK_TYPE_COMPONENT,
- &atk_component_info);
-
- }
-
- return type;
-}
-
-static void
-ea_week_view_cell_class_init (EaWeekViewCellClass *klass)
-{
- AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
-
-#ifdef ACC_DEBUG
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->finalize = ea_week_view_cell_finalize;
-#endif
-
- parent_class = g_type_class_peek_parent (klass);
-
- class->get_name = ea_week_view_cell_get_name;
- class->get_description = ea_week_view_cell_get_description;
- class->ref_state_set = ea_week_view_cell_ref_state_set;
-
- class->get_parent = ea_week_view_cell_get_parent;
- class->get_index_in_parent = ea_week_view_cell_get_index_in_parent;
-
-}
-
-AtkObject*
-ea_week_view_cell_new (GObject *obj)
-{
- gpointer object;
- AtkObject *atk_object;
-
- g_return_val_if_fail (E_IS_WEEK_VIEW_CELL (obj), NULL);
- object = g_object_new (EA_TYPE_WEEK_VIEW_CELL, NULL);
- atk_object = ATK_OBJECT (object);
- atk_object_initialize (atk_object, obj);
- atk_object->role = ATK_ROLE_UNKNOWN;
-
-#ifdef ACC_DEBUG
- ++n_ea_week_view_cell_created;
- printf ("ACC_DEBUG: n_ea_week_view_cell_created = %d\n",
- n_ea_week_view_cell_created);
-#endif
- return atk_object;
-}
-
-#ifdef ACC_DEBUG
-static void ea_week_view_cell_finalize (GObject *object)
-{
- ++n_ea_week_view_cell_destroyed;
- printf ("ACC_DEBUG: n_ea_week_view_cell_destroyed = %d\n",
- n_ea_week_view_cell_destroyed);
-}
-#endif
-
-static G_CONST_RETURN gchar*
-ea_week_view_cell_get_name (AtkObject *accessible)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewCell *cell;
-
- g_return_val_if_fail (EA_IS_WEEK_VIEW_CELL (accessible), NULL);
-
- if (!accessible->name) {
- AtkObject *ea_main_item;
- GnomeCanvasItem *main_item;
- gchar *new_name = g_strdup ("");
- const gchar *row_label, *column_label;
- gint new_column, new_row;
- gint start_day;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- cell = E_WEEK_VIEW_CELL (g_obj);
- main_item = cell->week_view->main_canvas_item;
- ea_main_item = atk_gobject_accessible_for_object (G_OBJECT (main_item));
-
- start_day = cell->week_view->display_start_day;
- if (cell->column + start_day >= 7) {
- new_column = cell->column + start_day - 7;
- new_row = cell->row + 1;
- } else {
- new_column = cell->column + start_day;
- new_row = cell->row;
- }
-
- column_label = atk_table_get_column_description (ATK_TABLE (ea_main_item),
- new_column);
- row_label = atk_table_get_row_description (ATK_TABLE (ea_main_item),
- new_row);
- new_name = g_strconcat (column_label, " ", row_label, NULL);
- ATK_OBJECT_CLASS (parent_class)->set_name (accessible, new_name);
- g_free (new_name);
- }
- return accessible->name;
-}
-
-static G_CONST_RETURN gchar*
-ea_week_view_cell_get_description (AtkObject *accessible)
-{
- return ea_week_view_cell_get_name (accessible);
-}
-
-static AtkStateSet*
-ea_week_view_cell_ref_state_set (AtkObject *obj)
-{
- AtkStateSet *state_set;
- GObject *g_obj;
- AtkObject *parent;
- gint x, y, width, height;
- gint parent_x, parent_y, parent_width, parent_height;
-
- state_set = ATK_OBJECT_CLASS (parent_class)->ref_state_set (obj);
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE(obj));
- if (!g_obj)
- return state_set;
-
- atk_state_set_add_state (state_set, ATK_STATE_SELECTABLE);
-
- parent = atk_object_get_parent (obj);
- atk_component_get_extents (ATK_COMPONENT (obj), &x, &y,
- &width, &height, ATK_XY_WINDOW);
- atk_component_get_extents (ATK_COMPONENT (parent), &parent_x, &parent_y,
- &parent_width, &parent_height, ATK_XY_WINDOW);
-
-
- if (x + width < parent_x || x > parent_x + parent_width ||
- y + height < parent_y || y > parent_y + parent_height)
- /* the cell is out of the main canvas */
- ;
- else
- atk_state_set_add_state (state_set, ATK_STATE_VISIBLE);
-
- return state_set;
-}
-
-static AtkObject *
-ea_week_view_cell_get_parent (AtkObject *accessible)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewCell *cell;
-
- g_return_val_if_fail (EA_IS_WEEK_VIEW_CELL (accessible), NULL);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- cell = E_WEEK_VIEW_CELL (g_obj);
- return atk_gobject_accessible_for_object (G_OBJECT (cell->week_view->main_canvas_item));
-}
-
-static gint
-ea_week_view_cell_get_index_in_parent (AtkObject *accessible)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewCell *cell;
- AtkObject *parent;
-
- g_return_val_if_fail (EA_IS_WEEK_VIEW_CELL (accessible), -1);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- cell = E_WEEK_VIEW_CELL (g_obj);
- parent = atk_object_get_parent (accessible);
- return atk_table_get_index_at (ATK_TABLE (parent),
- cell->row, cell->column);
-}
-
-/* Atk Component Interface */
-
-static void
-atk_component_interface_init (AtkComponentIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->get_extents = component_interface_get_extents;
- iface->grab_focus = component_interface_grab_focus;
-}
-
-static void
-component_interface_get_extents (AtkComponent *component,
- gint *x, gint *y, gint *width, gint *height,
- AtkCoordType coord_type)
-{
- GObject *g_obj;
- AtkObject *atk_obj;
- EWeekViewCell *cell;
- EWeekView *week_view;
- GtkWidget *main_canvas;
- gint week_view_width, week_view_height;
- gint scroll_x, scroll_y;
- gint start_day;
-
- *x = *y = *width = *height = 0;
-
- g_return_if_fail (EA_IS_WEEK_VIEW_CELL (component));
-
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE(component));
- if (!g_obj)
- /* defunct object*/
- return;
-
- cell = E_WEEK_VIEW_CELL (g_obj);
- week_view = cell->week_view;
- main_canvas = cell->week_view->main_canvas;
-
- atk_obj = atk_gobject_accessible_for_object (G_OBJECT (main_canvas));
- atk_component_get_extents (ATK_COMPONENT (atk_obj),
- x, y,
- &week_view_width, &week_view_height,
- coord_type);
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (week_view->main_canvas),
- &scroll_x, &scroll_y);
- start_day = week_view->display_start_day;
- if (week_view->multi_week_view) {
- if (week_view->compress_weekend && (cell->column == (5 - start_day))) {
- *height = week_view->row_heights[cell->row*2];
- *width = week_view->col_widths[cell->column];
- *x += week_view->col_offsets[cell->column] - scroll_x;
- *y += week_view->row_offsets[cell->row*2]- scroll_y;
- } else if (week_view->compress_weekend && (cell->column == (6 - start_day))) {
- *height = week_view->row_heights[cell->row*2];
- *width = week_view->col_widths[cell->column - 1];
- *x += week_view->col_offsets[cell->column - 1]- scroll_x;
- *y += week_view->row_offsets[cell->row*2 + 1]- scroll_y;
- } else if (week_view->compress_weekend && (cell->column > (6 - start_day))){
- *height = week_view->row_heights[cell->row*2]*2;
- *width = week_view->col_widths[cell->column - 1];
- *x += week_view->col_offsets[cell->column - 1] - scroll_x;
- *y += week_view->row_offsets[cell->row*2]- scroll_y;
- } else {
- *height = week_view->row_heights[cell->row*2]*2;
- *width = week_view->col_widths[cell->column];
- *x += week_view->col_offsets[cell->column] - scroll_x;
- *y += week_view->row_offsets[cell->row*2]- scroll_y;
- }
- } else {
- if (start_day < 3) {
- if (cell->column < 3) {
- *height = week_view->row_heights[cell->column*2]*2;
- *width = week_view->col_widths[0];
- *x += week_view->col_offsets[0] - scroll_x;
- *y += week_view->row_offsets[cell->column*2]- scroll_y;
- } else {
- if (cell->column == 5 - start_day) {
- *height = week_view->row_heights[(cell->column - 3)*2];
- *width = week_view->col_widths[1];
- *x += week_view->col_offsets[1] - scroll_x;
- *y += week_view->row_offsets[(cell->column - 3)*2]- scroll_y;
- } else if (cell->column == 6 - start_day) {
- *height = week_view->row_heights[(cell->column - 4)*2];
- *width = week_view->col_widths[1];
- *x += week_view->col_offsets[1] - scroll_x;
- *y += week_view->row_offsets[(cell->column - 3)*2 - 1]- scroll_y;
- } else if (cell->column > 6 - start_day) {
- *height = week_view->row_heights[(cell->column - 4)*2]*2;
- *width = week_view->col_widths[1];
- *x += week_view->col_offsets[1] - scroll_x;
- *y += week_view->row_offsets[(cell->column - 4)*2]- scroll_y;
- } else {
- *height = week_view->row_heights[(cell->column - 3)*2]*2;
- *width = week_view->col_widths[1];
- *x += week_view->col_offsets[1] - scroll_x;
- *y += week_view->row_offsets[(cell->column - 3)*2]- scroll_y;
- }
- }
- } else if (cell->column < 4) {
- if (cell->column == 5 - start_day) {
- *height = week_view->row_heights[cell->column*2];
- *width = week_view->col_widths[0];
- *x += week_view->col_offsets[0] - scroll_x;
- *y += week_view->row_offsets[cell->column*2]- scroll_y;
- } else if (cell->column == 6 - start_day) {
- *height = week_view->row_heights[(cell->column - 1)*2];
- *width = week_view->col_widths[0];
- *x += week_view->col_offsets[0] - scroll_x;
- *y += week_view->row_offsets[cell->column*2 - 1]- scroll_y;
- } else if (cell->column > 6 - start_day) {
- *height = week_view->row_heights[(cell->column - 1)*2]*2;
- *width = week_view->col_widths[0];
- *x += week_view->col_offsets[0] - scroll_x;
- *y += week_view->row_offsets[(cell->column - 1)*2]- scroll_y;
- } else {
- *height = week_view->row_heights[(cell->column)*2]*2;
- *width = week_view->col_widths[0];
- *x += week_view->col_offsets[0] - scroll_x;
- *y += week_view->row_offsets[cell->column*2]- scroll_y;
- }
- } else {
- *height = week_view->row_heights[(cell->column - 4)*2]*2;
- *width = week_view->col_widths[1];
- *x += week_view->col_offsets[1] - scroll_x;
- *y += week_view->row_offsets[(cell->column - 4)*2]- scroll_y;
- }
- }
-}
-
-static gboolean
-component_interface_grab_focus (AtkComponent *comp)
-{
- GObject *g_obj;
- EWeekViewCell *cell;
- EWeekView *week_view;
- GtkWidget *toplevel;
-
- g_return_val_if_fail (EA_IS_WEEK_VIEW_CELL (comp), FALSE);
-
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (comp));
- if (!g_obj)
- return FALSE;
-
- cell = E_WEEK_VIEW_CELL (g_obj);
- week_view = cell->week_view;
-
- week_view->selection_start_day = cell->row * 7 + cell->column;
- week_view->selection_end_day = cell->row * 7 + cell->column;
- gtk_widget_queue_draw (week_view->main_canvas);
-
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (week_view));
- if (GTK_WIDGET_TOPLEVEL (toplevel))
- gtk_window_present (GTK_WINDOW (toplevel));
-
- return TRUE;
-}
diff --git a/a11y/calendar/ea-week-view-cell.h b/a11y/calendar/ea-week-view-cell.h
deleted file mode 100644
index 4fcb0d0890..0000000000
--- a/a11y/calendar/ea-week-view-cell.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-week-view-cell.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- * Author: Yang Wu <yang.wu@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#ifndef __EA_WEEK_VIEW_CELL_H__
-#define __EA_WEEK_VIEW_CELL_H__
-
-#include <atk/atkgobjectaccessible.h>
-#include "e-week-view.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define E_TYPE_WEEK_VIEW_CELL (e_week_view_cell_get_type ())
-#define E_WEEK_VIEW_CELL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_WEEK_VIEW_CELL, EWeekViewCell))
-#define E_WEEK_VIEW_CELL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_WEEK_VIEW_CELL, EWeekViewCellClass))
-#define E_IS_WEEK_VIEW_CELL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_WEEK_VIEW_CELL))
-#define E_IS_WEEK_VIEW_CELL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_WEEK_VIEW_CELL))
-#define E_WEEK_VIEW_CELL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TYPE_WEEK_VIEW_CELL, EWeekViewCellClass))
-
-typedef struct _EWeekViewCell EWeekViewCell;
-typedef struct _EWeekViewCellClass EWeekViewCellClass;
-
-struct _EWeekViewCell
-{
- GObject parent;
- EWeekView *week_view;
- gint row;
- gint column;
-};
-
-GType e_week_view_cell_get_type (void);
-
-struct _EWeekViewCellClass
-{
- GObjectClass parent_class;
-};
-
-EWeekViewCell * e_week_view_cell_new (EWeekView *week_view, gint row, gint column);
-
-#define EA_TYPE_WEEK_VIEW_CELL (ea_week_view_cell_get_type ())
-#define EA_WEEK_VIEW_CELL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_WEEK_VIEW_CELL, EaWeekViewCell))
-#define EA_WEEK_VIEW_CELL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_WEEK_VIEW_CELL, EaWeekViewCellClass))
-#define EA_IS_WEEK_VIEW_CELL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_WEEK_VIEW_CELL))
-#define EA_IS_WEEK_VIEW_CELL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EA_TYPE_WEEK_VIEW_CELL))
-#define EA_WEEK_VIEW_CELL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EA_TYPE_WEEK_VIEW_CELL, EaWeekViewCellClass))
-
-typedef struct _EaWeekViewCell EaWeekViewCell;
-typedef struct _EaWeekViewCellClass EaWeekViewCellClass;
-
-struct _EaWeekViewCell
-{
- AtkGObjectAccessible parent;
-};
-
-GType ea_week_view_cell_get_type (void);
-
-struct _EaWeekViewCellClass
-{
- AtkGObjectAccessibleClass parent_class;
-};
-
-AtkObject* ea_week_view_cell_new (GObject *gobj);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __EA_WEEK_VIEW_CELL_H__ */
diff --git a/a11y/calendar/ea-week-view-main-item.c b/a11y/calendar/ea-week-view-main-item.c
deleted file mode 100644
index 2d013dc802..0000000000
--- a/a11y/calendar/ea-week-view-main-item.c
+++ /dev/null
@@ -1,1275 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-week-view-main-item.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- * Author: Yang Wu <Yang.Wu@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#include "ea-week-view-main-item.h"
-#include "ea-week-view.h"
-#include "ea-week-view-cell.h"
-#include "ea-cell-table.h"
-#include <libgnome/gnome-i18n.h>
-
-/* EaWeekViewMainItem */
-static void ea_week_view_main_item_class_init (EaWeekViewMainItemClass *klass);
-
-static void ea_week_view_main_item_finalize (GObject *object);
-static G_CONST_RETURN gchar* ea_week_view_main_item_get_name (AtkObject *accessible);
-static G_CONST_RETURN gchar* ea_week_view_main_item_get_description (AtkObject *accessible);
-
-static gint ea_week_view_main_item_get_n_children (AtkObject *obj);
-static AtkObject* ea_week_view_main_item_ref_child (AtkObject *obj,
- gint i);
-static AtkObject * ea_week_view_main_item_get_parent (AtkObject *accessible);
-static gint ea_week_view_main_item_get_index_in_parent (AtkObject *accessible);
-
-/* callbacks */
-static void ea_week_view_main_item_dates_change_cb (GnomeCalendar *gcal, gpointer data);
-static void ea_week_view_main_item_time_change_cb (EWeekView *week_view, gpointer data);
-
-/* component interface */
-static void atk_component_interface_init (AtkComponentIface *iface);
-static void component_interface_get_extents (AtkComponent *component,
- gint *x, gint *y,
- gint *width, gint *height,
- AtkCoordType coord_type);
-
-/* atk table interface */
-static void atk_table_interface_init (AtkTableIface *iface);
-static gint table_interface_get_index_at (AtkTable *table,
- gint row,
- gint column);
-static gint table_interface_get_column_at_index (AtkTable *table,
- gint index);
-static gint table_interface_get_row_at_index (AtkTable *table,
- gint index);
-static AtkObject* table_interface_ref_at (AtkTable *table,
- gint row,
- gint column);
-static gint table_interface_get_n_rows (AtkTable *table);
-static gint table_interface_get_n_columns (AtkTable *table);
-static gint table_interface_get_column_extent_at (AtkTable *table,
- gint row,
- gint column);
-static gint table_interface_get_row_extent_at (AtkTable *table,
- gint row,
- gint column);
-
-static gboolean table_interface_is_row_selected (AtkTable *table,
- gint row);
-static gboolean table_interface_is_column_selected (AtkTable *table,
- gint row);
-static gboolean table_interface_is_selected (AtkTable *table,
- gint row,
- gint column);
-static gint table_interface_get_selected_rows (AtkTable *table,
- gint **rows_selected);
-static gint table_interface_get_selected_columns (AtkTable *table,
- gint **columns_selected);
-static gboolean table_interface_add_row_selection (AtkTable *table, gint row);
-static gboolean table_interface_remove_row_selection (AtkTable *table,
- gint row);
-static gboolean table_interface_add_column_selection (AtkTable *table,
- gint column);
-static gboolean table_interface_remove_column_selection (AtkTable *table,
- gint column);
-static AtkObject* table_interface_get_row_header (AtkTable *table, gint row);
-static AtkObject* table_interface_get_column_header (AtkTable *table,
- gint in_col);
-static AtkObject* table_interface_get_caption (AtkTable *table);
-
-static G_CONST_RETURN gchar*
-table_interface_get_column_description (AtkTable *table, gint in_col);
-
-static G_CONST_RETURN gchar*
-table_interface_get_row_description (AtkTable *table, gint row);
-
-static AtkObject* table_interface_get_summary (AtkTable *table);
-
-/* atk selection interface */
-static void atk_selection_interface_init (AtkSelectionIface *iface);
-static gboolean selection_interface_add_selection (AtkSelection *selection,
- gint i);
-static gboolean selection_interface_clear_selection (AtkSelection *selection);
-static AtkObject* selection_interface_ref_selection (AtkSelection *selection,
- gint i);
-static gint selection_interface_get_selection_count (AtkSelection *selection);
-static gboolean selection_interface_is_child_selected (AtkSelection *selection,
- gint i);
-
-/* helpers */
-static EaCellTable *
-ea_week_view_main_item_get_cell_data (EaWeekViewMainItem *ea_main_item);
-
-static void
-ea_week_view_main_item_destory_cell_data (EaWeekViewMainItem *ea_main_item);
-
-static gint
-ea_week_view_main_item_get_child_index_at (EaWeekViewMainItem *ea_main_item,
- gint row, gint column);
-static gint
-ea_week_view_main_item_get_row_at_index (EaWeekViewMainItem *ea_main_item,
- gint index);
-static gint
-ea_week_view_main_item_get_column_at_index (EaWeekViewMainItem *ea_main_item,
- gint index);
-static gint
-ea_week_view_main_item_get_row_label (EaWeekViewMainItem *ea_main_item,
- gint row, gchar *buffer,
- gint buffer_size);
-
-#ifdef ACC_DEBUG
-static gint n_ea_week_view_main_item_created = 0;
-static gint n_ea_week_view_main_item_destroyed = 0;
-#endif
-
-static gpointer parent_class = NULL;
-
-GType
-ea_week_view_main_item_get_type (void)
-{
- static GType type = 0;
- AtkObjectFactory *factory;
- GTypeQuery query;
- GType derived_atk_type;
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (EaWeekViewMainItemClass),
- (GBaseInitFunc) NULL, /* base init */
- (GBaseFinalizeFunc) NULL, /* base finalize */
- (GClassInitFunc) ea_week_view_main_item_class_init,
- (GClassFinalizeFunc) NULL, /* class finalize */
- NULL, /* class data */
- sizeof (EaWeekViewMainItem), /* instance size */
- 0, /* nb preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- static const GInterfaceInfo atk_component_info = {
- (GInterfaceInitFunc) atk_component_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
-
- static const GInterfaceInfo atk_table_info = {
- (GInterfaceInitFunc) atk_table_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
- static const GInterfaceInfo atk_selection_info = {
- (GInterfaceInitFunc) atk_selection_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
-
-
- /*
- * Figure out the size of the class and instance
- * we are run-time deriving from (GailCanvasItem, in this case)
- *
- */
-
- factory = atk_registry_get_factory (atk_get_default_registry (),
- e_week_view_main_item_get_type());
- derived_atk_type = atk_object_factory_get_accessible_type (factory);
- g_type_query (derived_atk_type, &query);
-
- tinfo.class_size = query.class_size;
- tinfo.instance_size = query.instance_size;
-
- type = g_type_register_static (derived_atk_type,
- "EaWeekViewMainItem", &tinfo, 0);
- g_type_add_interface_static (type, ATK_TYPE_COMPONENT,
- &atk_component_info);
- g_type_add_interface_static (type, ATK_TYPE_TABLE,
- &atk_table_info);
- g_type_add_interface_static (type, ATK_TYPE_SELECTION,
- &atk_selection_info);
- }
-
- return type;
-}
-
-static void
-ea_week_view_main_item_class_init (EaWeekViewMainItemClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
-
- gobject_class->finalize = ea_week_view_main_item_finalize;
- parent_class = g_type_class_peek_parent (klass);
-
- class->get_name = ea_week_view_main_item_get_name;
- class->get_description = ea_week_view_main_item_get_description;
-
- class->get_n_children = ea_week_view_main_item_get_n_children;
- class->ref_child = ea_week_view_main_item_ref_child;
- class->get_parent = ea_week_view_main_item_get_parent;
- class->get_index_in_parent = ea_week_view_main_item_get_index_in_parent;
-}
-
-AtkObject*
-ea_week_view_main_item_new (GObject *obj)
-{
- AtkObject *accessible;
- GnomeCalendar *gcal;
- EWeekViewMainItem *main_item;
-
- g_return_val_if_fail (E_IS_WEEK_VIEW_MAIN_ITEM (obj), NULL);
-
- accessible = ATK_OBJECT (g_object_new (EA_TYPE_WEEK_VIEW_MAIN_ITEM,
- NULL));
-
- atk_object_initialize (accessible, obj);
- accessible->role = ATK_ROLE_TABLE;
-
-#ifdef ACC_DEBUG
- ++n_ea_week_view_main_item_created;
- printf ("ACC_DEBUG: n_ea_week_view_main_item_created = %d\n",
- n_ea_week_view_main_item_created);
-#endif
- main_item = E_WEEK_VIEW_MAIN_ITEM (obj);
- g_signal_connect (main_item->week_view, "selected_time_changed",
- G_CALLBACK (ea_week_view_main_item_time_change_cb),
- accessible);
-
- /* listen for date changes of calendar */
- gcal = e_calendar_view_get_calendar (E_CALENDAR_VIEW (main_item->week_view));
- if (gcal)
- g_signal_connect (gcal, "dates_shown_changed",
- G_CALLBACK (ea_week_view_main_item_dates_change_cb),
- accessible);
-
- return accessible;
-}
-
-static void
-ea_week_view_main_item_finalize (GObject *object)
-{
- EaWeekViewMainItem *ea_main_item;
-
- g_return_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (object));
-
- ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (object);
-
- /* Free the allocated cell data */
- ea_week_view_main_item_destory_cell_data (ea_main_item);
-
- G_OBJECT_CLASS (parent_class)->finalize (object);
-#ifdef ACC_DEBUG
- ++n_ea_week_view_main_item_destroyed;
- printf ("ACC_DEBUG: n_ea_week_view_main_item_destroyed = %d\n",
- n_ea_week_view_main_item_destroyed);
-#endif
-}
-
-static G_CONST_RETURN gchar*
-ea_week_view_main_item_get_name (AtkObject *accessible)
-{
- AtkObject *parent;
- g_return_val_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (accessible), NULL);
- parent = atk_object_get_parent (accessible);
- return atk_object_get_name (parent);
-
-}
-
-static G_CONST_RETURN gchar*
-ea_week_view_main_item_get_description (AtkObject *accessible)
-{
- return _("a table to view and select the current time range");
-}
-
-static gint
-ea_week_view_main_item_get_n_children (AtkObject *accessible)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
-
- g_return_val_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (accessible), -1);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- if (week_view->multi_week_view)
- return 7 * week_view->weeks_shown;
- else
- return 7;
-}
-
-static AtkObject *
-ea_week_view_main_item_ref_child (AtkObject *accessible, gint index)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- gint n_children;
- EWeekViewCell *cell;
- EaCellTable *cell_data;
- EaWeekViewMainItem *ea_main_item;
-
- g_return_val_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (accessible), NULL);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- n_children = ea_week_view_main_item_get_n_children (accessible);
- if (index < 0 || index >= n_children)
- return NULL;
-
- ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (accessible);
- cell_data = ea_week_view_main_item_get_cell_data (ea_main_item);
- if (!cell_data)
- return NULL;
- cell = ea_cell_table_get_cell_at_index (cell_data, index);
- if (!cell) {
- gint row, column;
-
- row = ea_week_view_main_item_get_row_at_index (ea_main_item, index);
- column = ea_week_view_main_item_get_column_at_index (ea_main_item, index);
- cell = e_week_view_cell_new (week_view, row, column);
- ea_cell_table_set_cell_at_index (cell_data, index, cell);
- g_object_unref (cell);
- }
-
- return g_object_ref (atk_gobject_accessible_for_object (G_OBJECT(cell)));
-}
-
-static AtkObject *
-ea_week_view_main_item_get_parent (AtkObject *accessible)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
-
- g_return_val_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (accessible), NULL);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- return gtk_widget_get_accessible (GTK_WIDGET (main_item->week_view));
-}
-
-static gint
-ea_week_view_main_item_get_index_in_parent (AtkObject *accessible)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
-
- g_return_val_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (accessible), -1);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- /* always the first child of ea-week-view */
- return 0;
-}
-
-/* callbacks */
-
-static void
-ea_week_view_main_item_dates_change_cb (GnomeCalendar *gcal, gpointer data)
-{
- EaWeekViewMainItem *ea_main_item;
-
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
- g_return_if_fail (data);
- g_return_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (data));
-
- ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (data);
-
-#ifdef ACC_DEBUG
- printf ("EvoAcc: ea_week_view_main_item update cb\n");
-#endif
-
- ea_week_view_main_item_destory_cell_data (ea_main_item);
-}
-
-static void
-ea_week_view_main_item_time_change_cb (EWeekView *week_view, gpointer data)
-{
- EaWeekViewMainItem *ea_main_item;
- AtkObject *item_cell = NULL;
-
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
- g_return_if_fail (data);
- g_return_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (data));
-
- ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (data);
-
-#ifdef ACC_DEBUG
- printf ("EvoAcc: ea_week_view_main_item time changed cb\n");
-#endif
- /* only deal with the first selected child, for now */
- item_cell = atk_selection_ref_selection (ATK_SELECTION (ea_main_item),
- 0);
- if (item_cell) {
- AtkStateSet *state_set;
- state_set = atk_object_ref_state_set (item_cell);
- atk_state_set_add_state (state_set, ATK_STATE_FOCUSED);
- g_object_unref (state_set);
-
- g_signal_emit_by_name (ea_main_item,
- "active-descendant-changed",
- item_cell);
- g_signal_emit_by_name (data, "selection_changed");
- atk_focus_tracker_notify (item_cell);
- g_object_unref (item_cell);
- }
-}
-
-/* helpers */
-
-static gint
-ea_week_view_main_item_get_child_index_at (EaWeekViewMainItem *ea_main_item,
- gint row, gint column)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
-
- g_return_val_if_fail (ea_main_item, -1);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- if (row >= 0 && row < week_view->weeks_shown &&
- column >= 0 && column < 7)
- return row * 7 + column;
-
- return -1;
-}
-
-static gint
-ea_week_view_main_item_get_row_at_index (EaWeekViewMainItem *ea_main_item,
- gint index)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- gint n_children;
-
- g_return_val_if_fail (ea_main_item, -1);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- n_children = ea_week_view_main_item_get_n_children (ATK_OBJECT (ea_main_item));
- if (index >= 0 && index < n_children)
- return index / 7;
- return -1;
-}
-
-static gint
-ea_week_view_main_item_get_column_at_index (EaWeekViewMainItem *ea_main_item,
- gint index)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- gint n_children;
-
- g_return_val_if_fail (ea_main_item, -1);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- n_children = ea_week_view_main_item_get_n_children (ATK_OBJECT (ea_main_item));
- if (index >= 0 && index < n_children)
- return index % 7;
- return -1;
-}
-
-static gint
-ea_week_view_main_item_get_row_label (EaWeekViewMainItem *ea_main_item,
- gint row, gchar *buffer, gint buffer_size)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
-
- g_return_val_if_fail (ea_main_item, 0);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return 0 ;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- return g_snprintf (buffer, buffer_size, "the %i week",
- row + 1);
-
-}
-
-static EaCellTable *
-ea_week_view_main_item_get_cell_data (EaWeekViewMainItem *ea_main_item)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- EaCellTable *cell_data;
-
- g_return_val_if_fail (ea_main_item, NULL);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- cell_data = g_object_get_data (G_OBJECT(ea_main_item),
- "ea-week-view-cell-table");
- if (!cell_data) {
- cell_data = ea_cell_table_create (week_view->weeks_shown, 7, TRUE);
- g_object_set_data (G_OBJECT(ea_main_item),
- "ea-week-view-cell-table", cell_data);
- }
- return cell_data;
-}
-
-static void
-ea_week_view_main_item_destory_cell_data (EaWeekViewMainItem *ea_main_item)
-{
- EaCellTable *cell_data;
-
- g_return_if_fail (ea_main_item);
-
- cell_data = g_object_get_data (G_OBJECT(ea_main_item),
- "ea-week-view-cell-table");
- if (cell_data) {
- ea_cell_table_destroy (cell_data);
- g_object_set_data (G_OBJECT(ea_main_item),
- "ea-week-view-cell-table", NULL);
- }
-}
-
-/* Atk Component Interface */
-
-static void
-atk_component_interface_init (AtkComponentIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->get_extents = component_interface_get_extents;
-}
-
-static void
-component_interface_get_extents (AtkComponent *component,
- gint *x, gint *y, gint *width, gint *height,
- AtkCoordType coord_type)
-{
- GObject *g_obj;
- AtkObject *ea_canvas;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
-
- *x = *y = *width = *height = 0;
-
- g_return_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (component));
-
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE(component));
- if (!g_obj)
- /* defunct object*/
- return;
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- ea_canvas = gtk_widget_get_accessible (week_view->main_canvas);
- atk_component_get_extents (ATK_COMPONENT (ea_canvas), x, y,
- width, height, coord_type);
-}
-
-/* atk table interface */
-
-static void
-atk_table_interface_init (AtkTableIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->ref_at = table_interface_ref_at;
-
- iface->get_n_rows = table_interface_get_n_rows;
- iface->get_n_columns = table_interface_get_n_columns;
- iface->get_index_at = table_interface_get_index_at;
- iface->get_column_at_index = table_interface_get_column_at_index;
- iface->get_row_at_index = table_interface_get_row_at_index;
- iface->get_column_extent_at = table_interface_get_column_extent_at;
- iface->get_row_extent_at = table_interface_get_row_extent_at;
-
- iface->is_selected = table_interface_is_selected;
- iface->get_selected_rows = table_interface_get_selected_rows;
- iface->get_selected_columns = table_interface_get_selected_columns;
- iface->is_row_selected = table_interface_is_row_selected;
- iface->is_column_selected = table_interface_is_column_selected;
- iface->add_row_selection = table_interface_add_row_selection;
- iface->remove_row_selection = table_interface_remove_row_selection;
- iface->add_column_selection = table_interface_add_column_selection;
- iface->remove_column_selection = table_interface_remove_column_selection;
-
- iface->get_row_header = table_interface_get_row_header;
- iface->get_column_header = table_interface_get_column_header;
- iface->get_caption = table_interface_get_caption;
- iface->get_summary = table_interface_get_summary;
- iface->get_row_description = table_interface_get_row_description;
- iface->get_column_description = table_interface_get_column_description;
-}
-
-static AtkObject*
-table_interface_ref_at (AtkTable *table,
- gint row,
- gint column)
-{
- gint index;
-
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
- index = ea_week_view_main_item_get_child_index_at (ea_main_item,
- row, column);
- return ea_week_view_main_item_ref_child (ATK_OBJECT (ea_main_item), index);
-}
-
-static gint
-table_interface_get_n_rows (AtkTable *table)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- return week_view->weeks_shown;
-}
-
-static gint
-table_interface_get_n_columns (AtkTable *table)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- return 7;
-}
-
-static gint
-table_interface_get_index_at (AtkTable *table,
- gint row,
- gint column)
-{
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
- return ea_week_view_main_item_get_child_index_at (ea_main_item,
- row, column);
-}
-
-static gint
-table_interface_get_column_at_index (AtkTable *table,
- gint index)
-{
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
- return ea_week_view_main_item_get_column_at_index (ea_main_item, index);
-}
-
-static gint
-table_interface_get_row_at_index (AtkTable *table,
- gint index)
-{
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
- return ea_week_view_main_item_get_row_at_index (ea_main_item, index);
-}
-
-static gint
-table_interface_get_column_extent_at (AtkTable *table,
- gint row,
- gint column)
-{
- gint index;
- gint width = 0, height = 0;
- AtkObject *child;
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
-
- index = ea_week_view_main_item_get_child_index_at (ea_main_item,
- row, column);
- child = atk_object_ref_accessible_child (ATK_OBJECT (ea_main_item),
- index);
- if (child)
- atk_component_get_size (ATK_COMPONENT (child),
- &width, &height);
-
- return width;
-}
-
-static gint
-table_interface_get_row_extent_at (AtkTable *table,
- gint row,
- gint column)
-{
- gint index;
- gint width = 0, height = 0;
- AtkObject *child;
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
-
- index = ea_week_view_main_item_get_child_index_at (ea_main_item,
- row, column);
- child = atk_object_ref_accessible_child (ATK_OBJECT (ea_main_item),
- index);
- if (child)
- atk_component_get_size (ATK_COMPONENT (child),
- &width, &height);
-
- return height;
-}
-
-static gboolean
-table_interface_is_row_selected (AtkTable *table,
- gint row)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- if (week_view->selection_start_day == -1)
- /* no selection */
- return FALSE;
- if ((row < 0)&&(row + 1 > week_view->weeks_shown ))
- return FALSE;
- if (((week_view->selection_start_day < row*7)&&(week_view->selection_end_day<row*7))
- ||((week_view->selection_start_day > row*7+6)&&(week_view->selection_end_day > row*7+6)))
- return FALSE;
- else
- return TRUE;
-}
-
-static gboolean
-table_interface_is_selected (AtkTable *table,
- gint row,
- gint column)
-{
- return table_interface_is_row_selected (table, row) && table_interface_is_column_selected(table, column);
-}
-
-static gboolean
-table_interface_is_column_selected (AtkTable *table,
- gint column)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- if ((column <0)||(column >6))
- return FALSE;
- else {
- gint i;
- for (i=0;i<week_view->weeks_shown;i++)
- if ((column + i*7>= week_view->selection_start_day ) &&
- (column + i*7<= week_view->selection_end_day))
- return TRUE;
- return FALSE;
- }
-}
-
-static gint
-table_interface_get_selected_rows (AtkTable *table,
- gint **rows_selected)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
- gint start_row = -1, n_rows = 0;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- if (week_view->selection_start_day == -1)
- return 0;
-
- start_row = week_view->selection_start_day;
- n_rows = week_view->selection_end_day - start_row + 1;
-
- if (n_rows > 0 && start_row != -1 && rows_selected) {
- gint index;
-
- *rows_selected = (gint *) g_malloc (n_rows * sizeof (gint));
- for (index = 0; index < n_rows; ++index)
- (*rows_selected)[index] = start_row + index;
- }
- return n_rows;
-}
-
-static gint
-table_interface_get_selected_columns (AtkTable *table,
- gint **columns_selected)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
- gint start_column = -1, n_columns = 0;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- if (week_view->selection_start_day == -1)
- return 0;
- if (week_view->selection_end_day - week_view->selection_start_day >= 6 ) {
- start_column = 0;
- n_columns =7;
- } else {
- start_column = week_view->selection_start_day % 7;
- n_columns = (week_view->selection_end_day % 7) - start_column + 1;
- }
- if (n_columns > 0 && start_column != -1 && columns_selected) {
- gint index;
-
- *columns_selected = (gint *) g_malloc (n_columns * sizeof (gint));
- for (index = 0; index < n_columns; ++index)
- (*columns_selected)[index] = start_column + index;
- }
- return n_columns;
-}
-
-static gboolean
-table_interface_add_row_selection (AtkTable *table,
- gint row)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- /* FIXME: we need multi-selection */
-
- week_view->selection_start_day = row * 7;
- week_view->selection_end_day = row *7 + 6;
-
- gtk_widget_queue_draw (week_view->main_canvas);
- return TRUE;
-}
-
-static gboolean
-table_interface_remove_row_selection (AtkTable *table,
- gint row)
-{
- return FALSE;
-}
-
-static gboolean
-table_interface_add_column_selection (AtkTable *table,
- gint column)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- /* FIXME: we need multi-selection */
-
- week_view->selection_start_day = column;
- week_view->selection_end_day = (week_view->weeks_shown - 1)*7+column;
-
- gtk_widget_queue_draw (week_view->main_canvas);
- return TRUE;
-}
-
-static gboolean
-table_interface_remove_column_selection (AtkTable *table,
- gint column)
-{
- /* FIXME: NOT IMPLEMENTED */
- return FALSE;
-}
-
-static AtkObject*
-table_interface_get_row_header (AtkTable *table,
- gint row)
-{
- /* FIXME: NOT IMPLEMENTED */
- return NULL;
-}
-
-static AtkObject*
-table_interface_get_column_header (AtkTable *table,
- gint in_col)
-{
- /* FIXME: NOT IMPLEMENTED */
- return NULL;
-}
-
-static AtkObject*
-table_interface_get_caption (AtkTable *table)
-{
- /* FIXME: NOT IMPLEMENTED */
- return NULL;
-}
-
-static G_CONST_RETURN gchar*
-table_interface_get_column_description (AtkTable *table,
- gint in_col)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
- const gchar *description;
- EaCellTable *cell_data;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- if (in_col < 0 || in_col > 6)
- return NULL;
- cell_data = ea_week_view_main_item_get_cell_data (ea_main_item);
- if (!cell_data)
- return NULL;
-
- description = ea_cell_table_get_column_label (cell_data, in_col);
- if (!description) {
- gchar buffer[128];
-
- switch (in_col) {
- case 0:
- g_snprintf(buffer,128,"Monday");
- break;
- case 1:
- g_snprintf(buffer,128,"Tuesday");
- break;
- case 2:
- g_snprintf(buffer,128,"Wednesday");
- break;
- case 3:
- g_snprintf(buffer,128,"Thursday");
- break;
- case 4:
- g_snprintf(buffer,128,"Friday");
- break;
- case 5:
- g_snprintf(buffer,128,"Saturday");
- break;
- case 6:
- g_snprintf(buffer,128,"Sunday");
- break;
- default:
- break;
- }
-
- ea_cell_table_set_column_label (cell_data, in_col, buffer);
- description = ea_cell_table_get_column_label (cell_data, in_col);
- }
- return description;
-}
-
-static G_CONST_RETURN gchar*
-table_interface_get_row_description (AtkTable *table,
- gint row)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
- const gchar *description;
- EaCellTable *cell_data;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- if (row < 0 || row >= week_view->weeks_shown)
- return NULL;
- cell_data = ea_week_view_main_item_get_cell_data (ea_main_item);
- if (!cell_data)
- return NULL;
-
- description = ea_cell_table_get_row_label (cell_data, row);
- if (!description) {
- gchar buffer[128];
- ea_week_view_main_item_get_row_label (ea_main_item, row, buffer, sizeof (buffer));
- ea_cell_table_set_row_label (cell_data, row, buffer);
- description = ea_cell_table_get_row_label (cell_data,
- row);
- }
- return description;
-}
-
-static AtkObject*
-table_interface_get_summary (AtkTable *table)
-{
- /* FIXME: NOT IMPLEMENTED */
- return NULL;
-}
-
-/* atkselection interface */
-
-static void
-atk_selection_interface_init (AtkSelectionIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->add_selection = selection_interface_add_selection;
- iface->clear_selection = selection_interface_clear_selection;
- iface->ref_selection = selection_interface_ref_selection;
- iface->get_selection_count = selection_interface_get_selection_count;
- iface->is_child_selected = selection_interface_is_child_selected;
-}
-
-static gboolean
-selection_interface_add_selection (AtkSelection *selection, gint i)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (selection);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- if (i < 0 || i > week_view->weeks_shown * 7 -1)
- return FALSE;
-
- /*FIXME: multi-selection is needed */
- week_view->selection_start_day = i;
- week_view->selection_end_day = i;
-
- gtk_widget_queue_draw (week_view->main_canvas);
- return TRUE;
-}
-
-static gboolean
-selection_interface_clear_selection (AtkSelection *selection)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (selection);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- week_view->selection_start_day = -1;
- week_view->selection_end_day = -1;
-
- gtk_widget_queue_draw (week_view->main_canvas);
-
- return TRUE;
-}
-
-static AtkObject*
-selection_interface_ref_selection (AtkSelection *selection, gint i)
-{
- gint count;
- GObject *g_obj;
- EWeekView *week_view;
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (selection);
- gint start_index;
-
- count = selection_interface_get_selection_count (selection);
- if (i < 0 || i >=count)
- return NULL;
-
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (ea_main_item));
- week_view = E_WEEK_VIEW_MAIN_ITEM (g_obj)->week_view;
- start_index = ea_week_view_main_item_get_child_index_at (ea_main_item,
- week_view->selection_start_day / 7,
- week_view->selection_start_day % 7);
-
- return ea_week_view_main_item_ref_child (ATK_OBJECT (selection), start_index + i);
-}
-
-static gint
-selection_interface_get_selection_count (AtkSelection *selection)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (selection);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return 0;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- if (week_view->selection_start_day == -1 ||
- week_view->selection_end_day == -1)
- return 0;
-
- return week_view->selection_end_day - week_view->selection_start_day + 1;
-}
-
-static gboolean
-selection_interface_is_child_selected (AtkSelection *selection, gint i)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EWeekViewMainItem *main_item;
- EWeekView *week_view;
- EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (selection);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
- week_view = main_item->week_view;
-
- if ((week_view->selection_start_day <= i)&&(week_view->selection_end_day >= i))
- return TRUE;
- else
- return FALSE;
-}
-
diff --git a/a11y/calendar/ea-week-view-main-item.h b/a11y/calendar/ea-week-view-main-item.h
deleted file mode 100644
index fcf8b45fc8..0000000000
--- a/a11y/calendar/ea-week-view-main-item.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-week-view-main-item.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- * Author: Yang Wu <Yang.Wu@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#ifndef __EA_WEEK_VIEW_MAIN_ITEM_H__
-#define __EA_WEEK_VIEW_MAIN_ITEM_H__
-
-#include <atk/atkgobjectaccessible.h>
-#include "e-week-view-main-item.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define EA_TYPE_WEEK_VIEW_MAIN_ITEM (ea_week_view_main_item_get_type ())
-#define EA_WEEK_VIEW_MAIN_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_WEEK_VIEW_MAIN_ITEM, EaWeekViewMainItem))
-#define EA_WEEK_VIEW_MAIN_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_WEEK_VIEW_MAIN_ITEM, EaWeekViewMainItemClass))
-#define EA_IS_WEEK_VIEW_MAIN_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_WEEK_VIEW_MAIN_ITEM))
-#define EA_IS_WEEK_VIEW_MAIN_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EA_TYPE_WEEK_VIEW_MAIN_ITEM))
-#define EA_WEEK_VIEW_MAIN_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EA_TYPE_WEEK_VIEW_MAIN_ITEM, EaWeekViewMainItemClass))
-
-typedef struct _EaWeekViewMainItem EaWeekViewMainItem;
-typedef struct _EaWeekViewMainItemClass EaWeekViewMainItemClass;
-
-struct _EaWeekViewMainItem
-{
- AtkGObjectAccessible parent;
-};
-
-GType ea_week_view_main_item_get_type (void);
-
-struct _EaWeekViewMainItemClass
-{
- AtkGObjectAccessibleClass parent_class;
-};
-
-AtkObject* ea_week_view_main_item_new (GObject *obj);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __EA_WEEK_VIEW_MAIN_ITEM_H__ */
diff --git a/a11y/calendar/ea-week-view.c b/a11y/calendar/ea-week-view.c
deleted file mode 100644
index 3b36ac246d..0000000000
--- a/a11y/calendar/ea-week-view.c
+++ /dev/null
@@ -1,322 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-week-view.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#include "ea-week-view.h"
-#include "ea-cal-view.h"
-#include "ea-cal-view-event.h"
-#include "ea-calendar-helpers.h"
-#include "ea-gnome-calendar.h"
-#include "calendar-commands.h"
-#include <gal/e-text/e-text.h>
-#include <libgnome/gnome-i18n.h>
-
-static void ea_week_view_class_init (EaWeekViewClass *klass);
-
-static G_CONST_RETURN gchar* ea_week_view_get_name (AtkObject *accessible);
-static G_CONST_RETURN gchar* ea_week_view_get_description (AtkObject *accessible);
-static gint ea_week_view_get_n_children (AtkObject *obj);
-static AtkObject* ea_week_view_ref_child (AtkObject *obj,
- gint i);
-
-static gpointer parent_class = NULL;
-
-GType
-ea_week_view_get_type (void)
-{
- static GType type = 0;
- AtkObjectFactory *factory;
- GTypeQuery query;
- GType derived_atk_type;
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (EaWeekViewClass),
- (GBaseInitFunc) NULL, /* base init */
- (GBaseFinalizeFunc) NULL, /* base finalize */
- (GClassInitFunc) ea_week_view_class_init, /* class init */
- (GClassFinalizeFunc) NULL, /* class finalize */
- NULL, /* class data */
- sizeof (EaWeekView), /* instance size */
- 0, /* nb preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- /*
- * Figure out the size of the class and instance
- * we are run-time deriving from (EaCalView, in this case)
- *
- * Note: we must still use run-time deriving here, because
- * our parent class EaCalView is run-time deriving.
- */
-
- factory = atk_registry_get_factory (atk_get_default_registry (),
- e_calendar_view_get_type());
- derived_atk_type = atk_object_factory_get_accessible_type (factory);
- g_type_query (derived_atk_type, &query);
-
- tinfo.class_size = query.class_size;
- tinfo.instance_size = query.instance_size;
-
- type = g_type_register_static (derived_atk_type,
- "EaWeekView", &tinfo, 0);
-
- }
-
- return type;
-}
-
-static void
-ea_week_view_class_init (EaWeekViewClass *klass)
-{
- AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_peek_parent (klass);
-
- class->get_name = ea_week_view_get_name;
- class->get_description = ea_week_view_get_description;
-
- class->get_n_children = ea_week_view_get_n_children;
- class->ref_child = ea_week_view_ref_child;
-}
-
-AtkObject*
-ea_week_view_new (GtkWidget *widget)
-{
- GObject *object;
- AtkObject *accessible;
-
- g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
-
- object = g_object_new (EA_TYPE_WEEK_VIEW, NULL);
-
- accessible = ATK_OBJECT (object);
- atk_object_initialize (accessible, widget);
-
-#ifdef ACC_DEBUG
- printf ("EvoAcc: ea_week_view created %p\n", (void *)accessible);
-#endif
-
- return accessible;
-}
-
-static G_CONST_RETURN gchar*
-ea_week_view_get_name (AtkObject *accessible)
-{
- EWeekView *week_view;
- GnomeCalendar *gcal;
- const gchar *label_text;
- GnomeCalendarViewType view_type;
- gint n_events;
- gchar *event_str, *name_str;
-
- g_return_val_if_fail (EA_IS_WEEK_VIEW (accessible), NULL);
-
- if (!GTK_ACCESSIBLE (accessible)->widget)
- return NULL;
-
- week_view = E_WEEK_VIEW (GTK_ACCESSIBLE (accessible)->widget);
- gcal = e_calendar_view_get_calendar (E_CALENDAR_VIEW (week_view));
- label_text = ea_gnome_calendar_get_label_description (gcal);
-
- n_events = atk_object_get_n_accessible_children (accessible);
- /* the child main item is always there */
- --n_events;
- if (n_events >= 1)
- event_str = g_strdup_printf (ngettext ("It has %d event.", "It has %d events.", n_events), n_events);
- else
- event_str = g_strdup (_("It has no events."));
-
- view_type = gnome_calendar_get_view (gcal);
-
- if (view_type == GNOME_CAL_MONTH_VIEW)
- name_str = g_strdup_printf (_("Month View: %s. %s"),
- label_text, event_str);
-
- else
- name_str = g_strdup_printf (_("Week View: %s. %s"),
- label_text, event_str);
-
- ATK_OBJECT_CLASS (parent_class)->set_name (accessible, name_str);
- g_free (name_str);
- g_free (event_str);
-
- return accessible->name;
-}
-
-static G_CONST_RETURN gchar*
-ea_week_view_get_description (AtkObject *accessible)
-{
- EWeekView *week_view;
-
- g_return_val_if_fail (EA_IS_WEEK_VIEW (accessible), NULL);
-
- if (!GTK_ACCESSIBLE (accessible)->widget)
- return NULL;
- week_view = E_WEEK_VIEW (GTK_ACCESSIBLE (accessible)->widget);
-
- if (accessible->description)
- return accessible->description;
- else {
- GnomeCalendar *gcal;
- GnomeCalendarViewType view_type;
-
- gcal = e_calendar_view_get_calendar (E_CALENDAR_VIEW (week_view));
- view_type = gnome_calendar_get_view (gcal);
-
- if (view_type == GNOME_CAL_MONTH_VIEW)
- return _("calendar view for a month");
- else
- return _("calendar view for one or more weeks");
- }
-}
-
-static gint
-ea_week_view_get_n_children (AtkObject *accessible)
-{
- EWeekView *week_view;
- gint i, count = 0;
- gint event_index;
-
- g_return_val_if_fail (EA_IS_WEEK_VIEW (accessible), -1);
-
- if (!GTK_ACCESSIBLE (accessible)->widget)
- return -1;
- week_view = E_WEEK_VIEW (GTK_ACCESSIBLE (accessible)->widget);
-
- for (event_index = 0; event_index < week_view->events->len;
- ++event_index) {
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
-
- /* If week_view->spans == NULL, there is no visible events. */
- if (!week_view->spans)
- break;
-
- event = &g_array_index (week_view->events,
- EWeekViewEvent, event_index);
- if (!event)
- continue;
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- event->spans_index + 0);
-
- if (!span)
- continue;
-
- /* at least one of the event spans is visible, count it */
- if (span->text_item)
- ++count;
- }
-
- /* add the number of visible jump buttons */
- for (i = 0; i < E_WEEK_VIEW_MAX_WEEKS * 7; i++) {
- if (week_view->jump_buttons[i]->object.flags & GNOME_CANVAS_ITEM_VISIBLE)
- ++count;
- }
-
- /* "+1" for the main item */
- count++;
-
-#ifdef ACC_DEBUG
- printf("AccDebug: week view %p has %d children\n", (void *)week_view, count);
-#endif
- return count;
-}
-
-static AtkObject *
-ea_week_view_ref_child (AtkObject *accessible, gint index)
-{
- EWeekView *week_view;
- gint child_num, max_count;
- AtkObject *atk_object = NULL;
- gint event_index;
- gint jump_button = -1;
- gint span_num = 0;
- gint count = 0;
-
- g_return_val_if_fail (EA_IS_WEEK_VIEW (accessible), NULL);
-
- child_num = atk_object_get_n_accessible_children (accessible);
- if (child_num <= 0 || index < 0 || index >= child_num)
- return NULL;
-
- if (!GTK_ACCESSIBLE (accessible)->widget)
- return NULL;
- week_view = E_WEEK_VIEW (GTK_ACCESSIBLE (accessible)->widget);
- max_count = week_view->events->len;
-
- if (index == 0) {
- /* index == 0 is the main item */
- atk_object = atk_gobject_accessible_for_object (G_OBJECT (week_view->main_canvas_item));
- g_object_ref (atk_object);
- } else
- for (event_index = 0; event_index < max_count; ++event_index) {
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- gint current_day;
-
- event = &g_array_index (week_view->events,
- EWeekViewEvent, event_index);
- if (!event)
- continue;
-
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- event->spans_index + span_num);
-
- if (!span)
- continue;
-
- current_day = span->start_day;
- if (span->text_item)
- ++count;
- else if (current_day != jump_button) {
- /* we should go to the jump button */
- jump_button = current_day;
- ++count;
- }
- else
- continue;
-
- if (count == index) {
- if (span->text_item) {
- /* Not use atk_gobject_accessible_for_object for event
- * text_item we need to do special thing here
- */
- atk_object = ea_calendar_helpers_get_accessible_for (span->text_item);
- }
- else {
- atk_object = ea_calendar_helpers_get_accessible_for (week_view->jump_buttons[current_day == -1 ? 0 : current_day]);
- }
- g_object_ref (atk_object);
- break;
- }
- }
-
-#ifdef ACC_DEBUG
- printf ("EvoAcc: ea_week_view_ref_child [%d]=%p\n",
- index, (void *)atk_object);
-#endif
- return atk_object;
-}
diff --git a/a11y/calendar/ea-week-view.h b/a11y/calendar/ea-week-view.h
deleted file mode 100644
index f0ed117375..0000000000
--- a/a11y/calendar/ea-week-view.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-week-view.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#ifndef __EA_WEEK_VIEW_H__
-#define __EA_WEEK_VIEW_H__
-
-#include <gtk/gtkaccessible.h>
-#include "e-week-view.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define EA_TYPE_WEEK_VIEW (ea_week_view_get_type ())
-#define EA_WEEK_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_WEEK_VIEW, EaWeekView))
-#define EA_WEEK_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_WEEK_VIEW, EaWeekViewClass))
-#define EA_IS_WEEK_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_WEEK_VIEW))
-#define EA_IS_WEEK_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EA_TYPE_WEEK_VIEW))
-#define EA_WEEK_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EA_TYPE_WEEK_VIEW, EaWeekViewClass))
-
-typedef struct _EaWeekView EaWeekView;
-typedef struct _EaWeekViewClass EaWeekViewClass;
-
-struct _EaWeekView
-{
- GtkAccessible parent;
-};
-
-GType ea_week_view_get_type (void);
-
-struct _EaWeekViewClass
-{
- GtkAccessibleClass parent_class;
-};
-
-AtkObject* ea_week_view_new (GtkWidget *widget);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __EA_WEEK_VIEW_H__ */
diff --git a/a11y/ea-cell-table.c b/a11y/ea-cell-table.c
deleted file mode 100644
index 80f5ecbaaa..0000000000
--- a/a11y/ea-cell-table.c
+++ /dev/null
@@ -1,207 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-cell-table.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#include "ea-cell-table.h"
-
-EaCellTable *
-ea_cell_table_create (gint rows, gint columns, gboolean column_first)
-{
- EaCellTable * cell_data;
- gint index;
-
- g_return_val_if_fail (((columns > 0) && (rows > 0)), NULL);
-
- cell_data = g_new0 (EaCellTable, 1);
-
- cell_data->column_first = column_first;
- cell_data->columns = columns;
- cell_data->rows = rows;
-
- cell_data->column_labels = g_new0 (gchar*, columns);
- for (index = columns -1; index >= 0; --index)
- cell_data->column_labels [index] = NULL;
-
- cell_data->row_labels = g_new0 (gchar*, rows);
- for (index = rows -1; index >= 0; --index)
- cell_data->row_labels [index] = NULL;
-
- cell_data->cells = g_new0(gpointer, (columns * rows));
- for (index = (columns * rows) -1; index >= 0; --index)
- cell_data->cells [index] = NULL;
- return cell_data;
-}
-
-void
-ea_cell_table_destroy (EaCellTable * cell_data)
-{
- gint index;
- g_return_if_fail (cell_data);
-
- g_print ("destroy cell table (%d, %d)\n", cell_data->rows,
- cell_data->columns);
- for (index = 0; index < cell_data->columns; ++index)
- if (cell_data->column_labels [index])
- g_free (cell_data->column_labels [index]);
- g_free (cell_data->column_labels);
-
- for (index = 0; index < cell_data->rows; ++index)
- if (cell_data->row_labels [index])
- g_free (cell_data->row_labels [index]);
- g_free (cell_data->row_labels);
-
- for (index = (cell_data->columns * cell_data->rows) -1;
- index >= 0; --index)
- if (cell_data->cells[index] &&
- G_IS_OBJECT (cell_data->cells[index]))
- g_object_unref (cell_data->cells[index]);
-
- g_free (cell_data->cells);
-}
-
-gpointer
-ea_cell_table_get_cell (EaCellTable * cell_data,
- gint row, gint column)
-{
- gint index;
-
- g_return_val_if_fail (cell_data, NULL);
-
- index = ea_cell_table_get_index (cell_data, column, row);
- if (index == -1)
- return NULL;
-
- return cell_data->cells[index];
-}
-
-gboolean
-ea_cell_table_set_cell (EaCellTable * cell_data,
- gint row, gint column, gpointer cell)
-{
- gint index;
-
- g_return_val_if_fail (cell_data, FALSE);
-
- index = ea_cell_table_get_index (cell_data, column, row);
- if (index == -1)
- return FALSE;
-
- if (cell && G_IS_OBJECT(cell))
- g_object_ref (cell);
- if (cell_data->cells[index] &&
- G_IS_OBJECT (cell_data->cells[index]))
- g_object_unref (cell_data->cells[index]);
- cell_data->cells[index] = cell;
-
- return TRUE;
-}
-
-gpointer
-ea_cell_table_get_cell_at_index (EaCellTable * cell_data,
- gint index)
-{
- g_return_val_if_fail (cell_data, NULL);
-
- if (index >=0 && index < (cell_data->columns * cell_data->rows))
- return cell_data->cells [index];
- return NULL;
-}
-
-gboolean
-ea_cell_table_set_cell_at_index (EaCellTable * cell_data,
- gint index, gpointer cell)
-{
- g_return_val_if_fail (cell_data, FALSE);
-
- if (index < 0 || index >=cell_data->columns * cell_data->rows)
- return FALSE;
-
- if (cell && G_IS_OBJECT(cell))
- g_object_ref (cell);
- if (cell_data->cells[index] &&
- G_IS_OBJECT (cell_data->cells[index]))
- g_object_unref (cell_data->cells[index]);
- cell_data->cells[index] = cell;
-
- return TRUE;
-}
-
-G_CONST_RETURN gchar*
-ea_cell_table_get_column_label (EaCellTable * cell_data,
- gint column)
-{
- g_return_val_if_fail (cell_data, NULL);
- g_return_val_if_fail ((column >= 0 && column < cell_data->columns), NULL);
-
- return cell_data->column_labels[column];
-}
-
-void
-ea_cell_table_set_column_label (EaCellTable * cell_data,
- gint column, const gchar *label)
-{
- g_return_if_fail (cell_data);
- g_return_if_fail ((column >= 0 && column < cell_data->columns));
-
- if (cell_data->column_labels[column])
- g_free (cell_data->column_labels[column]);
- cell_data->column_labels[column] = g_strdup(label);
-}
-
-G_CONST_RETURN gchar*
-ea_cell_table_get_row_label (EaCellTable * cell_data,
- gint row)
-{
- g_return_val_if_fail (cell_data, NULL);
- g_return_val_if_fail ((row >= 0 && row < cell_data->rows), NULL);
-
- return cell_data->row_labels[row];
-}
-
-void
-ea_cell_table_set_row_label (EaCellTable * cell_data,
- gint row, const gchar *label)
-{
- g_return_if_fail (cell_data);
- g_return_if_fail ((row >= 0 && row < cell_data->rows));
-
- if (cell_data->row_labels[row])
- g_free (cell_data->row_labels[row]);
- cell_data->row_labels[row] = g_strdup(label);
-}
-
-gint
-ea_cell_table_get_index (EaCellTable *cell_data,
- gint row, gint column)
-{
- g_return_val_if_fail (cell_data, -1);
- if (row < 0 || row >= cell_data->rows ||
- column < 0 || column >= cell_data->columns)
- return -1;
-
- if (cell_data->column_first)
- return column * cell_data->rows + row;
- else
- return row * cell_data->columns + column;
-}
diff --git a/a11y/ea-cell-table.h b/a11y/ea-cell-table.h
deleted file mode 100644
index 932fe8b4fd..0000000000
--- a/a11y/ea-cell-table.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-table-cell.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-/* EaCellTable */
-
-#include <glib.h>
-#include <glib-object.h>
-
-struct _EaCellTable {
- gint columns;
- gint rows;
- gboolean column_first; /* index order */
- gchar **column_labels;
- gchar **row_labels;
- gpointer *cells;
-};
-
-typedef struct _EaCellTable EaCellTable;
-
-EaCellTable * ea_cell_table_create (gint rows, gint columns,
- gboolean column_first);
-void ea_cell_table_destroy (EaCellTable * cell_data);
-gpointer ea_cell_table_get_cell (EaCellTable * cell_data,
- gint row, gint column);
-gboolean ea_cell_table_set_cell (EaCellTable * cell_data,
- gint row, gint column, gpointer cell);
-gpointer ea_cell_table_get_cell_at_index (EaCellTable * cell_data,
- gint index);
-gboolean ea_cell_table_set_cell_at_index (EaCellTable * cell_data,
- gint index, gpointer cell);
-
-G_CONST_RETURN gchar*
-ea_cell_table_get_column_label (EaCellTable * cell_data, gint column);
-void ea_cell_table_set_column_label (EaCellTable * cell_data,
- gint column, const gchar *label);
-G_CONST_RETURN gchar*
-ea_cell_table_get_row_label (EaCellTable * cell_data, gint row);
-void ea_cell_table_set_row_label (EaCellTable * cell_data,
- gint row, const gchar *label);
-gint ea_cell_table_get_index (EaCellTable *cell_data,
- gint row, gint column);
diff --git a/a11y/ea-factory.h b/a11y/ea-factory.h
deleted file mode 100644
index 06ae612d6f..0000000000
--- a/a11y/ea-factory.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-factory.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-/* Evolution Accessibility
-*/
-
-#ifndef _EA_FACTORY_H__
-#define _EA_FACTORY_H__
-
-#include <glib-object.h>
-#include <atk/atkobject.h>
-
-#define EA_FACTORY_PARTA_GOBJECT(type, type_as_function, opt_create_accessible) \
-static AtkObject* \
-type_as_function ## _factory_create_accessible (GObject *obj) \
-{ \
- AtkObject *accessible; \
- g_return_val_if_fail (G_IS_OBJECT (obj), NULL); \
- accessible = opt_create_accessible (G_OBJECT (obj)); \
- return accessible; \
-}
-
-#define EA_FACTORY_PARTA(type, type_as_function, opt_create_accessible) \
-static AtkObject* \
-type_as_function ## _factory_create_accessible (GObject *obj) \
-{ \
- GtkWidget *widget; \
- AtkObject *accessible; \
- \
- g_return_val_if_fail (GTK_IS_WIDGET (obj), NULL); \
- \
- widget = GTK_WIDGET (obj); \
- \
- accessible = opt_create_accessible (widget); \
- return accessible; \
-}
-
-#define EA_FACTORY_PARTB(type, type_as_function, opt_create_accessible) \
- \
-static GType \
-type_as_function ## _factory_get_accessible_type (void) \
-{ \
- return type; \
-} \
- \
- \
-static void \
-type_as_function ## _factory_class_init (AtkObjectFactoryClass *klass) \
-{ \
- klass->create_accessible = type_as_function ## _factory_create_accessible; \
- klass->get_accessible_type = type_as_function ## _factory_get_accessible_type;\
-} \
- \
-static GType \
-type_as_function ## _factory_get_type (void) \
-{ \
- static GType t = 0; \
- \
- if (!t) \
- { \
- char *name; \
- static const GTypeInfo tinfo = \
- { \
- sizeof (AtkObjectFactoryClass), \
- NULL, NULL, (GClassInitFunc) type_as_function ## _factory_class_init, \
- NULL, NULL, sizeof (AtkObjectFactory), 0, NULL, NULL \
- }; \
- \
- name = g_strconcat (g_type_name (type), "Factory", NULL); \
- t = g_type_register_static ( \
- ATK_TYPE_OBJECT_FACTORY, name, &tinfo, 0); \
- g_free (name); \
- } \
- \
- return t; \
-}
-
-#define EA_FACTORY(type, type_as_function, opt_create_accessible) \
- EA_FACTORY_PARTA(type, type_as_function, opt_create_accessible) \
- EA_FACTORY_PARTB(type, type_as_function, opt_create_accessible)
-
-#define EA_FACTORY_GOBJECT(type, type_as_function, opt_create_accessible) \
- EA_FACTORY_PARTA_GOBJECT(type, type_as_function, opt_create_accessible) \
- EA_FACTORY_PARTB(type, type_as_function, opt_create_accessible)
-
-#define EA_SET_FACTORY(obj_type, type_as_function) \
- atk_registry_set_factory_type (atk_get_default_registry (), \
- obj_type, \
- type_as_function ## _factory_get_type ())
-
-#endif /* _EA_FACTORY_H__ */
diff --git a/a11y/widgets/.cvsignore b/a11y/widgets/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/a11y/widgets/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/a11y/widgets/Makefile.am b/a11y/widgets/Makefile.am
deleted file mode 100644
index 6e8e0e4a1d..0000000000
--- a/a11y/widgets/Makefile.am
+++ /dev/null
@@ -1,33 +0,0 @@
-
-# for debug
-#A11Y_CFLAGS += -pedantic -ansi -DACC_DEBUG -Werror
-
-privlib_LTLIBRARIES = libevolution-widgets-a11y.la
-
-INCLUDES = \
- -DG_LOG_DOMAIN=\"evolution-a11y\" \
- -I$(top_srcdir)/widgets \
- -I$(top_srcdir)/a11y \
- -DEVOLUTION_DATADIR=\""$(datadir)"\" \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_ETSPECDIR=\""$(etspecdir)"\" \
- -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \
- -DEVOLUTION_GALVIEWSDIR=\""$(viewsdir)"\" \
- -DEVOLUTION_UIDIR=\""$(evolutionuidir)"\" \
- -DPREFIX=\""$(prefix)"\" \
- $(A11Y_CFLAGS) \
- $(EVOLUTION_CALENDAR_CFLAGS)
-
-libevolution_widgets_a11y_la_SOURCES = \
- ea-calendar-item.c \
- ea-calendar-item.h \
- ea-calendar-cell.c \
- ea-calendar-cell.h \
- ea-combo-button.c \
- ea-combo-button.h \
- ea-widgets.c \
- ea-widgets.h
-
-libevolution_widgets_a11y_la_LIBADD = \
- $(top_builddir)/a11y/libevolution-a11y.la
-
diff --git a/a11y/widgets/ea-calendar-cell.c b/a11y/widgets/ea-calendar-cell.c
deleted file mode 100644
index 682485605f..0000000000
--- a/a11y/widgets/ea-calendar-cell.c
+++ /dev/null
@@ -1,325 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-calendar-cell.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#include "ea-calendar-cell.h"
-#include "ea-calendar-item.h"
-#include "ea-factory.h"
-
-/* ECalendarCell */
-
-static void e_calendar_cell_class_init (ECalendarCellClass *class);
-
-EA_FACTORY_GOBJECT (EA_TYPE_CALENDAR_CELL, ea_calendar_cell, ea_calendar_cell_new)
-
-GType
-e_calendar_cell_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (ECalendarCellClass),
- (GBaseInitFunc) NULL, /* base init */
- (GBaseFinalizeFunc) NULL, /* base finalize */
- (GClassInitFunc) e_calendar_cell_class_init, /* class init */
- (GClassFinalizeFunc) NULL, /* class finalize */
- NULL, /* class data */
- sizeof (ECalendarCell), /* instance size */
- 0, /* nb preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- type = g_type_register_static (G_TYPE_OBJECT,
- "ECalendarCell", &tinfo, 0);
- }
-
- return type;
-}
-
-static void
-e_calendar_cell_class_init (ECalendarCellClass *class)
-{
- EA_SET_FACTORY (e_calendar_cell_get_type (), ea_calendar_cell);
-}
-
-ECalendarCell *
-e_calendar_cell_new (ECalendarItem *calitem, gint row, gint column)
-{
- GObject *object;
- ECalendarCell *cell;
-
- g_return_val_if_fail (E_IS_CALENDAR_ITEM (calitem), NULL);
-
- object = g_object_new (E_TYPE_CALENDAR_CELL, NULL);
- cell = E_CALENDAR_CELL (object);
- cell->calitem = calitem;
- cell->row = row;
- cell->column = column;
-
-#ifdef ACC_DEBUG
- g_print ("EvoAcc: e_calendar_cell created %p\n", (void *)cell);
-#endif
-
- return cell;
-}
-
-/* EaCalendarCell */
-
-static void ea_calendar_cell_class_init (EaCalendarCellClass *klass);
-
-static G_CONST_RETURN gchar* ea_calendar_cell_get_name (AtkObject *accessible);
-static G_CONST_RETURN gchar* ea_calendar_cell_get_description (AtkObject *accessible);
-static AtkObject * ea_calendar_cell_get_parent (AtkObject *accessible);
-static gint ea_calendar_cell_get_index_in_parent (AtkObject *accessible);
-
-/* component interface */
-static void atk_component_interface_init (AtkComponentIface *iface);
-static void component_interface_get_extents (AtkComponent *component,
- gint *x, gint *y,
- gint *width, gint *height,
- AtkCoordType coord_type);
-
-static gpointer parent_class = NULL;
-
-#ifdef ACC_DEBUG
-static gint n_ea_calendar_cell_created = 0, n_ea_calendar_cell_destroyed = 0;
-static void ea_calendar_cell_finalize (GObject *object);
-#endif
-
-GType
-ea_calendar_cell_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (EaCalendarCellClass),
- (GBaseInitFunc) NULL, /* base init */
- (GBaseFinalizeFunc) NULL, /* base finalize */
- (GClassInitFunc) ea_calendar_cell_class_init, /* class init */
- (GClassFinalizeFunc) NULL, /* class finalize */
- NULL, /* class data */
- sizeof (EaCalendarCell), /* instance size */
- 0, /* nb preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- static const GInterfaceInfo atk_component_info = {
- (GInterfaceInitFunc) atk_component_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
-
- type = g_type_register_static (ATK_TYPE_GOBJECT_ACCESSIBLE,
- "EaCalendarCell", &tinfo, 0);
- g_type_add_interface_static (type, ATK_TYPE_COMPONENT,
- &atk_component_info);
- }
-
- return type;
-}
-
-static void
-ea_calendar_cell_class_init (EaCalendarCellClass *klass)
-{
- AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
-
-#ifdef ACC_DEBUG
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->finalize = ea_calendar_cell_finalize;
-#endif
-
- parent_class = g_type_class_peek_parent (klass);
-
- class->get_name = ea_calendar_cell_get_name;
- class->get_description = ea_calendar_cell_get_description;
-
- class->get_parent = ea_calendar_cell_get_parent;
- class->get_index_in_parent = ea_calendar_cell_get_index_in_parent;
-}
-
-AtkObject*
-ea_calendar_cell_new (GObject *obj)
-{
- gpointer object;
- AtkObject *atk_object;
-
- g_return_val_if_fail (E_IS_CALENDAR_CELL (obj), NULL);
- object = g_object_new (EA_TYPE_CALENDAR_CELL, NULL);
- atk_object = ATK_OBJECT (object);
- atk_object_initialize (atk_object, obj);
- atk_object->role = ATK_ROLE_UNKNOWN;
-
-#ifdef ACC_DEBUG
- ++n_ea_calendar_cell_created;
- g_print ("ACC_DEBUG: n_ea_calendar_cell_created = %d\n",
- n_ea_calendar_cell_created);
-#endif
- return atk_object;
-}
-
-#ifdef ACC_DEBUG
-static void ea_calendar_cell_finalize (GObject *object)
-{
- ++n_ea_calendar_cell_destroyed;
- g_print ("ACC_DEBUG: n_ea_calendar_cell_destroyed = %d\n",
- n_ea_calendar_cell_destroyed);
-}
-#endif
-
-static G_CONST_RETURN gchar*
-ea_calendar_cell_get_name (AtkObject *accessible)
-{
- GObject *g_obj;
-
- g_return_val_if_fail (EA_IS_CALENDAR_CELL (accessible), NULL);
-
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE(accessible));
- if (!g_obj)
- /* defunct object*/
- return NULL;
-
- if (!accessible->name) {
- AtkObject *atk_obj;
- EaCalendarItem *ea_calitem;
- ECalendarCell *cell;
- gint day_index;
- gint year, month, day;
- gchar buffer[128];
-
- cell = E_CALENDAR_CELL (g_obj);
- atk_obj = ea_calendar_cell_get_parent (accessible);
- ea_calitem = EA_CALENDAR_ITEM (atk_obj);
- day_index = atk_table_get_index_at (ATK_TABLE (ea_calitem),
- cell->row, cell->column);
- e_calendar_item_get_date_for_offset (cell->calitem, day_index,
- &year, &month, &day);
-
- g_snprintf (buffer, 128, "%d-%d-%d", year, month + 1, day);
- ATK_OBJECT_CLASS (parent_class)->set_name (accessible, buffer);
- }
- return accessible->name;
-}
-
-static G_CONST_RETURN gchar*
-ea_calendar_cell_get_description (AtkObject *accessible)
-{
- return ea_calendar_cell_get_name (accessible);
-}
-
-static AtkObject *
-ea_calendar_cell_get_parent (AtkObject *accessible)
-{
- GObject *g_obj;
- ECalendarCell *cell;
- ECalendarItem *calitem;
-
- g_return_val_if_fail (EA_IS_CALENDAR_CELL (accessible), NULL);
-
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE(accessible));
- if (!g_obj)
- /* defunct object*/
- return NULL;
-
- cell = E_CALENDAR_CELL (g_obj);
- calitem = cell->calitem;
- return atk_gobject_accessible_for_object (G_OBJECT (calitem));
-}
-
-static gint
-ea_calendar_cell_get_index_in_parent (AtkObject *accessible)
-{
- GObject *g_obj;
- ECalendarCell *cell;
- AtkObject *parent;
-
- g_return_val_if_fail (EA_IS_CALENDAR_CELL (accessible), -1);
-
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE(accessible));
- if (!g_obj)
- return -1;
- cell = E_CALENDAR_CELL (g_obj);
- parent = atk_object_get_parent (accessible);
- return atk_table_get_index_at (ATK_TABLE (parent),
- cell->row, cell->column);
-}
-
-/* Atk Component Interface */
-
-static void
-atk_component_interface_init (AtkComponentIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->get_extents = component_interface_get_extents;
-}
-
-static void
-component_interface_get_extents (AtkComponent *component,
- gint *x, gint *y, gint *width, gint *height,
- AtkCoordType coord_type)
-{
- GObject *g_obj;
- AtkObject *atk_obj, *atk_canvas;
- ECalendarCell *cell;
- ECalendarItem *calitem;
- EaCalendarItem *ea_calitem;
- gint day_index;
- gint year, month, day;
- gint canvas_x, canvas_y, canvas_width, canvas_height;
-
- *x = *y = *width = *height = 0;
-
- g_return_if_fail (EA_IS_CALENDAR_CELL (component));
-
-
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE(component));
- if (!g_obj)
- /* defunct object*/
- return;
-
- cell = E_CALENDAR_CELL (g_obj);
- calitem = cell->calitem;
- atk_obj = atk_gobject_accessible_for_object (G_OBJECT (calitem));
- ea_calitem = EA_CALENDAR_ITEM (atk_obj);
- day_index = atk_table_get_index_at (ATK_TABLE (ea_calitem),
- cell->row, cell->column);
- e_calendar_item_get_date_for_offset (calitem, day_index,
- &year, &month, &day);
-
- if (!e_calendar_item_get_day_extents (calitem,
- year, month, day,
- x, y, width, height))
- return;
- atk_canvas = atk_object_get_parent (ATK_OBJECT (ea_calitem));
- atk_component_get_extents (ATK_COMPONENT (atk_canvas),
- &canvas_x, &canvas_y,
- &canvas_width, &canvas_height,
- coord_type);
- *x += canvas_x;
- *y += canvas_y;
-}
diff --git a/a11y/widgets/ea-calendar-cell.h b/a11y/widgets/ea-calendar-cell.h
deleted file mode 100644
index f87ede90a7..0000000000
--- a/a11y/widgets/ea-calendar-cell.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-calendar-cell.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#ifndef __EA_CALENDAR_CELL_H__
-#define __EA_CALENDAR_CELL_H__
-
-#include <atk/atkgobjectaccessible.h>
-#include "misc/e-calendar-item.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define E_TYPE_CALENDAR_CELL (e_calendar_cell_get_type ())
-#define E_CALENDAR_CELL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CALENDAR_CELL, ECalendarCell))
-#define E_CALENDAR_CELL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CALENDAR_CELL, ECalendarCellClass))
-#define E_IS_CALENDAR_CELL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CALENDAR_CELL))
-#define E_IS_CALENDAR_CELL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_CALENDAR_CELL))
-#define E_CALENDAR_CELL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TYPE_CALENDAR_CELL, ECalendarCellClass))
-
-typedef struct _ECalendarCell ECalendarCell;
-typedef struct _ECalendarCellClass ECalendarCellClass;
-
-struct _ECalendarCell
-{
- GObject parent;
- ECalendarItem *calitem;
- gint row;
- gint column;
-};
-
-GType e_calendar_cell_get_type (void);
-
-struct _ECalendarCellClass
-{
- GObjectClass parent_class;
-};
-
-ECalendarCell * e_calendar_cell_new (ECalendarItem *calitem,
- gint row, gint column);
-
-#define EA_TYPE_CALENDAR_CELL (ea_calendar_cell_get_type ())
-#define EA_CALENDAR_CELL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_CALENDAR_CELL, EaCalendarCell))
-#define EA_CALENDAR_CELL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_CALENDAR_CELL, EaCalendarCellClass))
-#define EA_IS_CALENDAR_CELL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_CALENDAR_CELL))
-#define EA_IS_CALENDAR_CELL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EA_TYPE_CALENDAR_CELL))
-#define EA_CALENDAR_CELL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EA_TYPE_CALENDAR_CELL, EaCalendarCellClass))
-
-typedef struct _EaCalendarCell EaCalendarCell;
-typedef struct _EaCalendarCellClass EaCalendarCellClass;
-
-struct _EaCalendarCell
-{
- AtkGObjectAccessible parent;
-};
-
-GType ea_calendar_cell_get_type (void);
-
-struct _EaCalendarCellClass
-{
- AtkGObjectAccessibleClass parent_class;
-};
-
-AtkObject* ea_calendar_cell_new (GObject *gobj);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __EA_CALENDAR_CELL_H__ */
diff --git a/a11y/widgets/ea-calendar-item.c b/a11y/widgets/ea-calendar-item.c
deleted file mode 100644
index b80bbdcb77..0000000000
--- a/a11y/widgets/ea-calendar-item.c
+++ /dev/null
@@ -1,1300 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-calendar-item.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#include <stdio.h>
-#include <time.h>
-#include <string.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include <glib/gdate.h>
-#include <gal/util/e-util.h>
-#include <libgnome/gnome-i18n.h>
-#include "ea-calendar-item.h"
-#include "ea-calendar-cell.h"
-#include "ea-cell-table.h"
-
-#define EA_CALENDAR_COLUMN_NUM E_CALENDAR_COLS_PER_MONTH
-
-/* EaCalendarItem */
-static void ea_calendar_item_class_init (EaCalendarItemClass *klass);
-static void ea_calendar_item_finalize (GObject *object);
-
-static G_CONST_RETURN gchar* ea_calendar_item_get_name (AtkObject *accessible);
-static G_CONST_RETURN gchar* ea_calendar_item_get_description (AtkObject *accessible);
-static gint ea_calendar_item_get_n_children (AtkObject *accessible);
-static AtkObject *ea_calendar_item_ref_child (AtkObject *accessible, gint index);
-static AtkStateSet* ea_calendar_item_ref_state_set (AtkObject *accessible);
-
-/* atk table interface */
-static void atk_table_interface_init (AtkTableIface *iface);
-static gint table_interface_get_index_at (AtkTable *table,
- gint row,
- gint column);
-static gint table_interface_get_column_at_index (AtkTable *table,
- gint index);
-static gint table_interface_get_row_at_index (AtkTable *table,
- gint index);
-static AtkObject* table_interface_ref_at (AtkTable *table,
- gint row,
- gint column);
-static gint table_interface_get_n_rows (AtkTable *table);
-static gint table_interface_get_n_columns (AtkTable *table);
-static gint table_interface_get_column_extent_at (AtkTable *table,
- gint row,
- gint column);
-static gint table_interface_get_row_extent_at (AtkTable *table,
- gint row,
- gint column);
-
-static gboolean table_interface_is_row_selected (AtkTable *table,
- gint row);
-static gboolean table_interface_is_column_selected (AtkTable *table,
- gint row);
-static gboolean table_interface_is_selected (AtkTable *table,
- gint row,
- gint column);
-static gint table_interface_get_selected_rows (AtkTable *table,
- gint **rows_selected);
-static gint table_interface_get_selected_columns (AtkTable *table,
- gint **columns_selected);
-static gboolean table_interface_add_row_selection (AtkTable *table, gint row);
-static gboolean table_interface_remove_row_selection (AtkTable *table,
- gint row);
-static gboolean table_interface_add_column_selection (AtkTable *table,
- gint column);
-static gboolean table_interface_remove_column_selection (AtkTable *table,
- gint column);
-static AtkObject* table_interface_get_row_header (AtkTable *table, gint row);
-static AtkObject* table_interface_get_column_header (AtkTable *table,
- gint in_col);
-static AtkObject* table_interface_get_caption (AtkTable *table);
-
-static G_CONST_RETURN gchar*
-table_interface_get_column_description (AtkTable *table, gint in_col);
-
-static G_CONST_RETURN gchar*
-table_interface_get_row_description (AtkTable *table, gint row);
-
-static AtkObject* table_interface_get_summary (AtkTable *table);
-
-/* atk selection interface */
-static void atk_selection_interface_init (AtkSelectionIface *iface);
-static gboolean selection_interface_add_selection (AtkSelection *selection,
- gint i);
-static gboolean selection_interface_clear_selection (AtkSelection *selection);
-static AtkObject* selection_interface_ref_selection (AtkSelection *selection,
- gint i);
-static gint selection_interface_get_selection_count (AtkSelection *selection);
-static gboolean selection_interface_is_child_selected (AtkSelection *selection,
- gint i);
-
-/* callbacks */
-static void selection_preview_change_cb (ECalendarItem *calitem);
-static void date_range_changed_cb (ECalendarItem *calitem);
-static void selection_changed_cb (ECalendarItem *calitem);
-
-/* helpers */
-static EaCellTable *ea_calendar_item_get_cell_data (EaCalendarItem *ea_calitem);
-static void ea_calendar_item_destory_cell_data (EaCalendarItem *ea_calitem);
-static gboolean ea_calendar_item_get_column_label (EaCalendarItem *ea_calitem,
- gint column,
- gchar *buffer,
- gint buffer_size);
-static gboolean ea_calendar_item_get_row_label (EaCalendarItem *ea_calitem,
- gint row,
- gchar *buffer,
- gint buffer_size);
-static gboolean e_calendar_item_get_offset_for_date (ECalendarItem *calitem,
- gint year, gint month, gint day,
- gint *offset);
-
-#ifdef ACC_DEBUG
-static gint n_ea_calendar_item_created = 0;
-static gint n_ea_calendar_item_destroyed = 0;
-#endif
-
-static gpointer parent_class = NULL;
-
-GType
-ea_calendar_item_get_type (void)
-{
- static GType type = 0;
- AtkObjectFactory *factory;
- GTypeQuery query;
- GType derived_atk_type;
-
- if (!type) {
- static GTypeInfo tinfo = {
- sizeof (EaCalendarItemClass),
- (GBaseInitFunc) NULL, /* base init */
- (GBaseFinalizeFunc) NULL, /* base finalize */
- (GClassInitFunc) ea_calendar_item_class_init, /* class init */
- (GClassFinalizeFunc) NULL, /* class finalize */
- NULL, /* class data */
- sizeof (EaCalendarItem), /* instance size */
- 0, /* nb preallocs */
- (GInstanceInitFunc) NULL, /* instance init */
- NULL /* value table */
- };
-
- static const GInterfaceInfo atk_table_info = {
- (GInterfaceInitFunc) atk_table_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
- static const GInterfaceInfo atk_selection_info = {
- (GInterfaceInitFunc) atk_selection_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
-
- /*
- * Figure out the size of the class and instance
- * we are run-time deriving from (GailCanvasItem, in this case)
- */
-
- factory = atk_registry_get_factory (atk_get_default_registry (),
- GNOME_TYPE_CANVAS_ITEM);
- derived_atk_type = atk_object_factory_get_accessible_type (factory);
- g_type_query (derived_atk_type, &query);
-
- tinfo.class_size = query.class_size;
- tinfo.instance_size = query.instance_size;
-
- type = g_type_register_static (derived_atk_type,
- "EaCalendarItem", &tinfo, 0);
- g_type_add_interface_static (type, ATK_TYPE_TABLE,
- &atk_table_info);
- g_type_add_interface_static (type, ATK_TYPE_SELECTION,
- &atk_selection_info);
- }
-
- return type;
-}
-
-static void
-ea_calendar_item_class_init (EaCalendarItemClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
-
- gobject_class->finalize = ea_calendar_item_finalize;
- parent_class = g_type_class_peek_parent (klass);
-
- class->get_name = ea_calendar_item_get_name;
- class->get_description = ea_calendar_item_get_description;
- class->ref_state_set = ea_calendar_item_ref_state_set;
-
- class->get_n_children = ea_calendar_item_get_n_children;
- class->ref_child = ea_calendar_item_ref_child;
-}
-
-AtkObject*
-ea_calendar_item_new (GObject *obj)
-{
- gpointer object;
- AtkObject *atk_object;
-
- g_return_val_if_fail (E_IS_CALENDAR_ITEM (obj), NULL);
- object = g_object_new (EA_TYPE_CALENDAR_ITEM, NULL);
- atk_object = ATK_OBJECT (object);
- atk_object_initialize (atk_object, obj);
- atk_object->role = ATK_ROLE_TABLE;
-#ifdef ACC_DEBUG
- ++n_ea_calendar_item_created;
- g_print ("ACC_DEBUG: n_ea_calendar_item_created = %d\n",
- n_ea_calendar_item_created);
-#endif
- /* connect signal handlers */
- g_signal_connect (obj, "selection_preview_changed",
- G_CALLBACK (selection_preview_change_cb),
- atk_object);
- g_signal_connect (obj, "date_range_changed",
- G_CALLBACK (date_range_changed_cb),
- atk_object);
- g_signal_connect (obj, "selection_preview_changed",
- G_CALLBACK (selection_changed_cb),
- atk_object);
-
- return atk_object;
-}
-
-static void
-ea_calendar_item_finalize (GObject *object)
-{
- EaCalendarItem *ea_calitem;
-
- g_return_if_fail (EA_IS_CALENDAR_ITEM (object));
-
- ea_calitem = EA_CALENDAR_ITEM (object);
-
- /* Free the allocated cell data */
- ea_calendar_item_destory_cell_data (ea_calitem);
-
- G_OBJECT_CLASS (parent_class)->finalize (object);
-#ifdef ACC_DEBUG
- ++n_ea_calendar_item_destroyed;
- printf ("ACC_DEBUG: n_ea_calendar_item_destroyed = %d\n",
- n_ea_calendar_item_destroyed);
-#endif
-}
-
-static G_CONST_RETURN gchar*
-ea_calendar_item_get_name (AtkObject *accessible)
-{
- GObject *g_obj;
- ECalendarItem *calitem;
- gint start_year, start_month, start_day;
- gint end_year, end_month, end_day;
- gchar *name_str = NULL;
- gchar buffer_start[128] = "";
- gchar buffer_end[128] = "";
- struct tm day_start = { 0 };
- struct tm day_end = { 0 };
-
- g_return_val_if_fail (EA_IS_CALENDAR_ITEM (accessible), NULL);
-
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE(accessible));
- g_return_val_if_fail (E_IS_CALENDAR_ITEM (g_obj), NULL);
-
- calitem = E_CALENDAR_ITEM (g_obj);
- if (e_calendar_item_get_date_range (calitem,
- &start_year, &start_month, &start_day,
- &end_year, &end_month, &end_day)) {
-
- day_start.tm_year = start_year - 1900;
- day_start.tm_mon = start_month;
- day_start.tm_mday = start_day;
- day_start.tm_isdst = -1;
- e_utf8_strftime (buffer_start, sizeof (buffer_start), _("%d %B %Y"), &day_start);
-
- day_end.tm_year = end_year - 1900;
- day_end.tm_mon = end_month;
- day_end.tm_mday = end_day;
- day_end.tm_isdst = -1;
- e_utf8_strftime (buffer_end, sizeof (buffer_end), _("%d %B %Y"), &day_end);
-
- name_str = g_strdup_printf (_("Calendar: from %s to %s"), buffer_start, buffer_end);
- }
-
-#if 0
- if (e_calendar_item_get_selection (calitem, &select_start, &select_end)) {
- GDate select_start, select_end;
- gint year1, year2, month1, month2, day1, day2;
-
- year1 = g_date_get_year (&select_start);
- month1 = g_date_get_month (&select_start);
- day1 = g_date_get_day (&select_start);
-
- year2 = g_date_get_year (&select_end);
- month2 = g_date_get_month (&select_end);
- day2 = g_date_get_day (&select_end);
-
- sprintf (new_name + strlen (new_name),
- " : current selection: from %d-%d-%d to %d-%d-%d.",
- year1, month1, day1,
- year2, month2, day2);
- }
-#endif
-
- ATK_OBJECT_CLASS (parent_class)->set_name (accessible, name_str);
- g_free (name_str);
-
- return accessible->name;
-}
-
-static G_CONST_RETURN gchar*
-ea_calendar_item_get_description (AtkObject *accessible)
-{
- if (accessible->description)
- return accessible->description;
-
- return _("evolution calendar item");
-}
-
-static AtkStateSet*
-ea_calendar_item_ref_state_set (AtkObject *accessible)
-{
- AtkStateSet *state_set;
- GObject *g_obj;
-
- state_set = ATK_OBJECT_CLASS (parent_class)->ref_state_set (accessible);
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE(accessible));
- if (!g_obj)
- return state_set;
-
- atk_state_set_add_state (state_set, ATK_STATE_ENABLED);
- atk_state_set_add_state (state_set, ATK_STATE_SENSITIVE);
-
- return state_set;
-}
-
-static gint
-ea_calendar_item_get_n_children (AtkObject *accessible)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- ECalendarItem *calitem;
- gint n_children = 0;
- gint start_year, start_month, start_day;
- gint end_year, end_month, end_day;
- GDate *start_date, *end_date;
-
- g_return_val_if_fail (EA_IS_CALENDAR_ITEM (accessible), -1);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- calitem = E_CALENDAR_ITEM (g_obj);
- if (!e_calendar_item_get_date_range (calitem, &start_year,
- &start_month, &start_day,
- &end_year, &end_month,
- &end_day))
- return 0;
-
- start_date = g_date_new_dmy (start_day, start_month + 1, start_year);
- end_date = g_date_new_dmy (end_day, end_month + 1, end_year);
-
- n_children = g_date_days_between (start_date, end_date) + 1;
- g_free (start_date);
- g_free (end_date);
- return n_children;
-}
-
-static AtkObject *
-ea_calendar_item_ref_child (AtkObject *accessible, gint index)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- ECalendarItem *calitem;
- gint n_children;
- ECalendarCell *cell;
- EaCellTable *cell_data;
- EaCalendarItem *ea_calitem;
-
- g_return_val_if_fail (EA_IS_CALENDAR_ITEM (accessible), NULL);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- calitem = E_CALENDAR_ITEM (g_obj);
-
- n_children = ea_calendar_item_get_n_children (accessible);
- if (index < 0 || index >= n_children)
- return NULL;
-
- ea_calitem = EA_CALENDAR_ITEM (accessible);
- cell_data = ea_calendar_item_get_cell_data (ea_calitem);
- if (!cell_data)
- return NULL;
-
- cell = ea_cell_table_get_cell_at_index (cell_data, index);
- if (!cell) {
- cell = e_calendar_cell_new (calitem,
- index / EA_CALENDAR_COLUMN_NUM,
- index % EA_CALENDAR_COLUMN_NUM);
- ea_cell_table_set_cell_at_index (cell_data, index, cell);
- g_object_unref (cell);
- }
-
-#ifdef ACC_DEBUG
- g_print ("AccDebug: ea_calendar_item children[%d]=%p\n", index,
- (gpointer)cell);
-#endif
- return g_object_ref (atk_gobject_accessible_for_object (G_OBJECT(cell)));
-}
-
-/* atk table interface */
-
-static void
-atk_table_interface_init (AtkTableIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->ref_at = table_interface_ref_at;
-
- iface->get_n_rows = table_interface_get_n_rows;
- iface->get_n_columns = table_interface_get_n_columns;
- iface->get_index_at = table_interface_get_index_at;
- iface->get_column_at_index = table_interface_get_column_at_index;
- iface->get_row_at_index = table_interface_get_row_at_index;
- iface->get_column_extent_at = table_interface_get_column_extent_at;
- iface->get_row_extent_at = table_interface_get_row_extent_at;
-
- iface->is_selected = table_interface_is_selected;
- iface->get_selected_rows = table_interface_get_selected_rows;
- iface->get_selected_columns = table_interface_get_selected_columns;
- iface->is_row_selected = table_interface_is_row_selected;
- iface->is_column_selected = table_interface_is_column_selected;
- iface->add_row_selection = table_interface_add_row_selection;
- iface->remove_row_selection = table_interface_remove_row_selection;
- iface->add_column_selection = table_interface_add_column_selection;
- iface->remove_column_selection = table_interface_remove_column_selection;
-
- iface->get_row_header = table_interface_get_row_header;
- iface->get_column_header = table_interface_get_column_header;
- iface->get_caption = table_interface_get_caption;
- iface->get_summary = table_interface_get_summary;
- iface->get_row_description = table_interface_get_row_description;
- iface->get_column_description = table_interface_get_column_description;
-}
-
-static AtkObject*
-table_interface_ref_at (AtkTable *table,
- gint row,
- gint column)
-{
- gint index;
-
- EaCalendarItem* ea_calitem = EA_CALENDAR_ITEM (table);
- index = EA_CALENDAR_COLUMN_NUM * row + column;
- return ea_calendar_item_ref_child (ATK_OBJECT (ea_calitem), index);
-}
-
-static gint
-table_interface_get_n_rows (AtkTable *table)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EaCalendarItem* ea_calitem = EA_CALENDAR_ITEM (table);
- gint n_children;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_calitem);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- n_children = ea_calendar_item_get_n_children (ATK_OBJECT (ea_calitem));
- return (n_children - 1) / EA_CALENDAR_COLUMN_NUM + 1;
-}
-
-static gint
-table_interface_get_n_columns (AtkTable *table)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EaCalendarItem* ea_calitem = EA_CALENDAR_ITEM (table);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_calitem);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- return EA_CALENDAR_COLUMN_NUM;
-}
-
-static gint
-table_interface_get_index_at (AtkTable *table,
- gint row,
- gint column)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EaCalendarItem* ea_calitem = EA_CALENDAR_ITEM (table);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_calitem);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- return row * EA_CALENDAR_COLUMN_NUM + column;
-}
-
-static gint
-table_interface_get_column_at_index (AtkTable *table,
- gint index)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EaCalendarItem* ea_calitem = EA_CALENDAR_ITEM (table);
- gint n_children;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_calitem);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- n_children = ea_calendar_item_get_n_children (ATK_OBJECT (ea_calitem));
- if (index >= 0 && index < n_children)
- return index % EA_CALENDAR_COLUMN_NUM;
- return -1;
-}
-
-static gint
-table_interface_get_row_at_index (AtkTable *table,
- gint index)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- EaCalendarItem* ea_calitem = EA_CALENDAR_ITEM (table);
- gint n_children;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_calitem);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return -1;
-
- n_children = ea_calendar_item_get_n_children (ATK_OBJECT (ea_calitem));
- if (index >= 0 && index < n_children)
- return index / EA_CALENDAR_COLUMN_NUM;
- return -1;
-}
-
-static gint
-table_interface_get_column_extent_at (AtkTable *table,
- gint row,
- gint column)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- ECalendarItem *calitem;
- EaCalendarItem* ea_calitem = EA_CALENDAR_ITEM (table);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_calitem);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- calitem = E_CALENDAR_ITEM (g_obj);
- return calitem->cell_width;
-}
-
-static gint
-table_interface_get_row_extent_at (AtkTable *table,
- gint row, gint column)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- ECalendarItem *calitem;
- EaCalendarItem* ea_calitem = EA_CALENDAR_ITEM (table);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_calitem);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- calitem = E_CALENDAR_ITEM (g_obj);
- return calitem->cell_height;
-}
-
-/* any day in the row is selected, the row is selected */
-static gboolean
-table_interface_is_row_selected (AtkTable *table,
- gint row)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- gint n_rows;
- ECalendarItem *calitem;
- gint row_index_start, row_index_end;
- gint sel_index_start, sel_index_end;
-
- GDate start_date, end_date;
-
- g_return_val_if_fail (EA_IS_CALENDAR_ITEM (table), FALSE);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (table);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- n_rows = table_interface_get_n_rows (table);
- if (row < 0 || row >= n_rows)
- return FALSE;
-
- row_index_start = row * EA_CALENDAR_COLUMN_NUM;
- row_index_end = row_index_start + EA_CALENDAR_COLUMN_NUM - 1;
-
- calitem = E_CALENDAR_ITEM (g_obj);
- e_calendar_item_get_selection (calitem, &start_date, &end_date);
-
- e_calendar_item_get_offset_for_date (calitem,
- g_date_get_year (&start_date),
- g_date_get_month (&start_date),
- g_date_get_day (&start_date),
- &sel_index_start);
- e_calendar_item_get_offset_for_date (calitem,
- g_date_get_year (&end_date),
- g_date_get_month (&end_date),
- g_date_get_day (&end_date),
- &sel_index_end);
-
- if ((sel_index_start < row_index_start &&
- sel_index_end >= row_index_start) ||
- (sel_index_start >= row_index_start &&
- sel_index_start <= row_index_end))
- return TRUE;
- return FALSE;
-}
-
-static gboolean
-table_interface_is_selected (AtkTable *table,
- gint row,
- gint column)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- gint n_rows, n_columns;
- ECalendarItem *calitem;
- gint index;
- gint sel_index_start, sel_index_end;
-
- GDate start_date, end_date;
-
- g_return_val_if_fail (EA_IS_CALENDAR_ITEM (table), FALSE);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (table);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- n_rows = table_interface_get_n_rows (table);
- if (row < 0 || row >= n_rows)
- return FALSE;
- n_columns = table_interface_get_n_columns (table);
- if (column < 0 || column >= n_columns)
- return FALSE;
-
- index = table_interface_get_index_at (table, row, column);
-
- calitem = E_CALENDAR_ITEM (g_obj);
- e_calendar_item_get_selection (calitem, &start_date, &end_date);
-
- e_calendar_item_get_offset_for_date (calitem,
- g_date_get_year (&start_date),
- g_date_get_month (&start_date),
- g_date_get_day (&start_date),
- &sel_index_start);
- e_calendar_item_get_offset_for_date (calitem,
- g_date_get_year (&end_date),
- g_date_get_month (&end_date),
- g_date_get_day (&end_date), &sel_index_end);
-
- if (sel_index_start <= index && sel_index_end >= index)
- return TRUE;
- return FALSE;
-}
-
-static gboolean
-table_interface_is_column_selected (AtkTable *table,
- gint column)
-{
- return FALSE;
-}
-
-static gint
-table_interface_get_selected_rows (AtkTable *table,
- gint **rows_selected)
-{
- *rows_selected = NULL;
- return -1;
-}
-
-static gint
-table_interface_get_selected_columns (AtkTable *table,
- gint **columns_selected)
-{
- *columns_selected = NULL;
- return -1;
-}
-
-static gboolean
-table_interface_add_row_selection (AtkTable *table,
- gint row)
-{
- return FALSE;
-}
-
-static gboolean
-table_interface_remove_row_selection (AtkTable *table,
- gint row)
-{
- return FALSE;
-}
-
-static gboolean
-table_interface_add_column_selection (AtkTable *table,
- gint column)
-{
- return FALSE;
-}
-
-static gboolean
-table_interface_remove_column_selection (AtkTable *table,
- gint column)
-{
- /* FIXME: NOT IMPLEMENTED */
- return FALSE;
-}
-
-static AtkObject*
-table_interface_get_row_header (AtkTable *table,
- gint row)
-{
- /* FIXME: NOT IMPLEMENTED */
- return NULL;
-}
-
-static AtkObject*
-table_interface_get_column_header (AtkTable *table,
- gint in_col)
-{
- /* FIXME: NOT IMPLEMENTED */
- return NULL;
-}
-
-static AtkObject*
-table_interface_get_caption (AtkTable *table)
-{
- /* FIXME: NOT IMPLEMENTED */
- return NULL;
-}
-
-static G_CONST_RETURN gchar*
-table_interface_get_column_description (AtkTable *table, gint in_col)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- ECalendarItem *calitem;
- EaCalendarItem* ea_calitem = EA_CALENDAR_ITEM (table);
- const gchar *description = NULL;
- EaCellTable *cell_data;
- gint n_columns;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_calitem);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- calitem = E_CALENDAR_ITEM (g_obj);
- n_columns = table_interface_get_n_columns (table);
- if (in_col < 0 || in_col >= n_columns)
- return NULL;
- cell_data = ea_calendar_item_get_cell_data (ea_calitem);
- if (!cell_data)
- return NULL;
-
- description = ea_cell_table_get_column_label (cell_data, in_col);
- if (!description) {
- gchar buffer[128] = "column description";
- ea_calendar_item_get_column_label (ea_calitem, in_col,
- buffer, sizeof (buffer));
- ea_cell_table_set_column_label (cell_data, in_col, buffer);
- description = ea_cell_table_get_column_label (cell_data,
- in_col);
- }
- return description;
-}
-
-static G_CONST_RETURN gchar*
-table_interface_get_row_description (AtkTable *table, gint row)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- ECalendarItem *calitem;
- EaCalendarItem* ea_calitem = EA_CALENDAR_ITEM (table);
- const gchar *description = NULL;
- EaCellTable *cell_data;
- gint n_rows;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_calitem);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- calitem = E_CALENDAR_ITEM (g_obj);
- n_rows = table_interface_get_n_rows (table);
- if (row < 0 || row >= n_rows)
- return NULL;
- cell_data = ea_calendar_item_get_cell_data (ea_calitem);
- if (!cell_data)
- return NULL;
-
- description = ea_cell_table_get_row_label (cell_data, row);
- if (!description) {
- gchar buffer[128] = "row description";
- ea_calendar_item_get_row_label (ea_calitem, row,
- buffer, sizeof (buffer));
- ea_cell_table_set_row_label (cell_data, row, buffer);
- description = ea_cell_table_get_row_label (cell_data,
- row);
- }
- return description;
-}
-
-static AtkObject*
-table_interface_get_summary (AtkTable *table)
-{
- /* FIXME: NOT IMPLEMENTED */
- return NULL;
-}
-
-/* atkselection interface */
-
-static void
-atk_selection_interface_init (AtkSelectionIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->add_selection = selection_interface_add_selection;
- iface->clear_selection = selection_interface_clear_selection;
- iface->ref_selection = selection_interface_ref_selection;
- iface->get_selection_count = selection_interface_get_selection_count;
- iface->is_child_selected = selection_interface_is_child_selected;
-}
-
-static gboolean
-selection_interface_add_selection (AtkSelection *selection, gint index)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- ECalendarItem *calitem;
- EaCalendarItem* ea_calitem = EA_CALENDAR_ITEM (selection);
- gint year, month, day;
- GDate start_date, end_date;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_calitem);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- calitem = E_CALENDAR_ITEM (g_obj);
- if (!e_calendar_item_get_date_for_offset (calitem, index,
- &year, &month, &day))
- return FALSE;
-
- /* FIXME: not support mulit-selection */
- g_date_set_dmy (&start_date, day, month + 1, year);
- end_date = start_date;
- e_calendar_item_set_selection (calitem, &start_date, &end_date);
- return TRUE;
-}
-
-static gboolean
-selection_interface_clear_selection (AtkSelection *selection)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- ECalendarItem *calitem;
- EaCalendarItem* ea_calitem = EA_CALENDAR_ITEM (selection);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_calitem);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- calitem = E_CALENDAR_ITEM (g_obj);
- e_calendar_item_set_selection (calitem, NULL, NULL);
-
- return TRUE;
-}
-
-static AtkObject*
-selection_interface_ref_selection (AtkSelection *selection, gint i)
-{
- GObject *g_obj;
- ECalendarItem *calitem;
- EaCalendarItem* ea_calitem = EA_CALENDAR_ITEM (selection);
- gint count, sel_offset;
- GDate start_date, end_date;
-
- count = selection_interface_get_selection_count (selection);
- if (i < 0 || i >= count)
- return NULL;
-
- g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (ea_calitem));
-
- calitem = E_CALENDAR_ITEM (g_obj);
- e_calendar_item_get_selection (calitem, &start_date, &end_date);
- if (!e_calendar_item_get_offset_for_date (calitem,
- g_date_get_year (&start_date),
- g_date_get_month (&start_date) - 1,
- g_date_get_day (&start_date),
- &sel_offset))
- return NULL;
-
- return ea_calendar_item_ref_child (ATK_OBJECT (selection), sel_offset + i);
-}
-
-static gint
-selection_interface_get_selection_count (AtkSelection *selection)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- ECalendarItem *calitem;
- EaCalendarItem* ea_calitem = EA_CALENDAR_ITEM (selection);
- GDate start_date, end_date;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_calitem);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return 0;
-
- calitem = E_CALENDAR_ITEM (g_obj);
- e_calendar_item_get_selection (calitem, &start_date, &end_date);
-
- return g_date_days_between (&start_date, &end_date) + 1;
-}
-
-static gboolean
-selection_interface_is_child_selected (AtkSelection *selection, gint index)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- ECalendarItem *calitem;
- EaCalendarItem* ea_calitem = EA_CALENDAR_ITEM (selection);
- gint row, column, n_children;
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_calitem);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- calitem = E_CALENDAR_ITEM (g_obj);
- n_children = atk_object_get_n_accessible_children (ATK_OBJECT (selection));
- if (index < 0 || index >= n_children)
- return FALSE;
-
- row = index / EA_CALENDAR_COLUMN_NUM;
- column = index % EA_CALENDAR_COLUMN_NUM;
-
- return table_interface_is_selected (ATK_TABLE (selection), row, column);
-}
-
-/* callbacks */
-
-static void
-selection_preview_change_cb (ECalendarItem *calitem)
-{
- AtkObject *atk_obj;
- AtkObject *item_cell = NULL;
-
- g_return_if_fail (E_IS_CALENDAR_ITEM (calitem));
- atk_obj = atk_gobject_accessible_for_object (G_OBJECT (calitem));
-
- /* only deal with the first selected child, for now */
- item_cell = atk_selection_ref_selection (ATK_SELECTION (atk_obj),
- 0);
- if (item_cell) {
- AtkStateSet *state_set;
- state_set = atk_object_ref_state_set (item_cell);
- atk_state_set_add_state (state_set, ATK_STATE_FOCUSED);
- g_object_unref (state_set);
- }
- g_signal_emit_by_name (atk_obj,
- "active-descendant-changed",
- item_cell);
- g_signal_emit_by_name (atk_obj, "selection_changed");
-}
-
-static void
-date_range_changed_cb (ECalendarItem *calitem)
-{
- AtkObject *atk_obj;
-
- g_return_if_fail (E_IS_CALENDAR_ITEM (calitem));
- atk_obj = atk_gobject_accessible_for_object (G_OBJECT (calitem));
- ea_calendar_item_destory_cell_data (EA_CALENDAR_ITEM (atk_obj));
-
- g_signal_emit_by_name (atk_obj, "model_changed");
-}
-
-static void
-selection_changed_cb (ECalendarItem *calitem)
-{
- selection_preview_change_cb (calitem);
-}
-
-/* helpers */
-
-static EaCellTable *
-ea_calendar_item_get_cell_data (EaCalendarItem *ea_calitem)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- ECalendarItem *calitem;
- EaCellTable *cell_data;
-
- g_return_val_if_fail (ea_calitem, NULL);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_calitem);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return NULL;
-
- calitem = E_CALENDAR_ITEM (g_obj);
-
- cell_data = g_object_get_data (G_OBJECT(ea_calitem),
- "ea-calendar-cell-table");
-
- if (!cell_data) {
- gint n_cells = ea_calendar_item_get_n_children (ATK_OBJECT(ea_calitem));
- cell_data = ea_cell_table_create (n_cells/EA_CALENDAR_COLUMN_NUM,
- EA_CALENDAR_COLUMN_NUM,
- FALSE);
- g_object_set_data (G_OBJECT(ea_calitem),
- "ea-calendar-cell-table", cell_data);
- }
- return cell_data;
-}
-
-static void
-ea_calendar_item_destory_cell_data (EaCalendarItem *ea_calitem)
-{
- EaCellTable *cell_data;
-
- g_return_if_fail (ea_calitem);
-
- cell_data = g_object_get_data (G_OBJECT(ea_calitem),
- "ea-calendar-cell-table");
- if (cell_data) {
- g_object_set_data (G_OBJECT(ea_calitem),
- "ea-calendar-cell-table", NULL);
- ea_cell_table_destroy (cell_data);
- }
-}
-
-static gboolean
-ea_calendar_item_get_row_label (EaCalendarItem *ea_calitem, gint row,
- gchar *buffer, gint buffer_size)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- ECalendarItem *calitem;
- gint index, week_num;
- gint year, month, day;
-
- g_return_val_if_fail (ea_calitem, FALSE);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_calitem);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- calitem = E_CALENDAR_ITEM (g_obj);
-
- index = atk_table_get_index_at (ATK_TABLE (ea_calitem), row, 0);
- if (!e_calendar_item_get_date_for_offset (calitem, index,
- &year, &month, &day))
- return FALSE;
-
- week_num = e_calendar_item_get_week_number (calitem,
- day, month, year);
-
- g_snprintf (buffer, buffer_size, "week number : %d", week_num);
- return TRUE;
-}
-
-static gboolean
-ea_calendar_item_get_column_label (EaCalendarItem *ea_calitem, gint column,
- gchar *buffer, gint buffer_size)
-{
- AtkGObjectAccessible *atk_gobj;
- GObject *g_obj;
- ECalendarItem *calitem;
- gchar *week_char;
- gint char_size;
-
- g_return_val_if_fail (ea_calitem, FALSE);
-
- atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_calitem);
- g_obj = atk_gobject_accessible_get_object (atk_gobj);
- if (!g_obj)
- return FALSE;
-
- calitem = E_CALENDAR_ITEM (g_obj);
- week_char = g_utf8_offset_to_pointer (calitem->days, column);
- char_size = strlen (calitem->days) -
- strlen (g_utf8_find_next_char (calitem->days, NULL));
-
- if (week_char && char_size < buffer_size) {
- memcpy (buffer, week_char, char_size);
- buffer[char_size] = '\0';
- return TRUE;
- }
- return FALSE;
-}
-
-/* the coordinate the e-calendar canvas coord */
-gboolean
-e_calendar_item_get_day_extents (ECalendarItem *calitem,
- gint year, gint month, gint date,
- gint *x, gint *y,
- gint *width, gint *height)
-{
- GnomeCanvasItem *item;
- GtkWidget *widget;
- GtkStyle *style;
- PangoFontDescription *font_desc;
- PangoContext *pango_context;
- PangoFontMetrics *font_metrics;
- gint char_height, xthickness, ythickness, text_y;
- gint new_year, new_month, num_months, months_offset;
- gint month_x, month_y, month_cell_x, month_cell_y;
- gint month_row, month_col;
- gint day_row, day_col;
- gint days_from_week_start;
-
- g_return_val_if_fail (E_IS_CALENDAR_ITEM (calitem), FALSE);
-
- item = GNOME_CANVAS_ITEM (calitem);
- widget = GTK_WIDGET (item->canvas);
- style = widget->style;
-
- /* Set up Pango prerequisites */
- font_desc = calitem->font_desc;
- if (!font_desc)
- font_desc = style->font_desc;
- pango_context = gtk_widget_get_pango_context (widget);
- font_metrics = pango_context_get_metrics (pango_context, font_desc,
- pango_context_get_language (pango_context));
-
- char_height =
- PANGO_PIXELS (pango_font_metrics_get_ascent (font_metrics)) +
- PANGO_PIXELS (pango_font_metrics_get_descent (font_metrics));
-
- xthickness = style->xthickness;
- ythickness = style->ythickness;
-
- new_year = year;
- new_month = month;
- e_calendar_item_normalize_date (calitem, &new_year, &new_month);
- num_months = calitem->rows * calitem->cols;
- months_offset = (new_year - calitem->year) * 12
- + new_month - calitem->month;
-
- if (months_offset > num_months || months_offset < 0)
- return FALSE;
-
- month_row = months_offset / calitem->cols;
- month_col = months_offset % calitem->cols;
-
- month_x = item->x1 + xthickness + calitem->x_offset
- + month_col * calitem->month_width;
- month_y = item->y1 + ythickness + month_row * calitem->month_height;
-
- month_cell_x = month_x + E_CALENDAR_ITEM_XPAD_BEFORE_WEEK_NUMBERS
- + calitem->month_lpad + E_CALENDAR_ITEM_XPAD_BEFORE_CELLS;
- text_y = month_y + ythickness * 2
- + E_CALENDAR_ITEM_YPAD_ABOVE_MONTH_NAME
- + char_height + E_CALENDAR_ITEM_YPAD_BELOW_MONTH_NAME
- + E_CALENDAR_ITEM_YPAD_ABOVE_DAY_LETTERS + calitem->month_tpad;
-
- month_cell_y = text_y + char_height
- + E_CALENDAR_ITEM_YPAD_BELOW_DAY_LETTERS + 1
- + E_CALENDAR_ITEM_YPAD_ABOVE_CELLS;
-
- days_from_week_start =
- e_calendar_item_get_n_days_from_week_start (calitem, new_year,
- new_month);
- day_row = (date + days_from_week_start - 1) / EA_CALENDAR_COLUMN_NUM;
- day_col = (date + days_from_week_start - 1) % EA_CALENDAR_COLUMN_NUM;
-
- *x = month_cell_x + day_col * calitem->cell_width;
- *y = month_cell_y + day_row * calitem->cell_height;
- *width = calitem->cell_width;
- *height = calitem->cell_height;
-
- return TRUE;
-}
-
-/* month is from 0 to 11 */
-gboolean
-e_calendar_item_get_date_for_offset (ECalendarItem *calitem, gint day_offset,
- gint *year, gint *month, gint *day)
-{
- gint start_year, start_month, start_day;
- gint end_year, end_month, end_day;
- GDate *start_date;
-
- g_return_val_if_fail (E_IS_CALENDAR_ITEM (calitem), FALSE);
-
- if (!e_calendar_item_get_date_range (calitem, &start_year,
- &start_month, &start_day,
- &end_year, &end_month,
- &end_day))
- return FALSE;
-
- start_date = g_date_new_dmy (start_day, start_month + 1, start_year);
-
- g_date_add_days (start_date, day_offset);
-
- *year = g_date_get_year (start_date);
- *month = g_date_get_month (start_date) - 1;
- *day = g_date_get_day (start_date);
-
- return TRUE;
-}
-
-/* the arg month is from 0 to 11 */
-static gboolean
-e_calendar_item_get_offset_for_date (ECalendarItem *calitem,
- gint year, gint month, gint day,
- gint *offset)
-{
- gint start_year, start_month, start_day;
- gint end_year, end_month, end_day;
- GDate *start_date, *end_date;
-
- *offset = 0;
- g_return_val_if_fail (E_IS_CALENDAR_ITEM (calitem), FALSE);
-
- if (!e_calendar_item_get_date_range (calitem, &start_year,
- &start_month, &start_day,
- &end_year, &end_month,
- &end_day))
- return FALSE;
-
- start_date = g_date_new_dmy (start_day, start_month + 1, start_year);
- end_date = g_date_new_dmy (day, month + 1, year);
-
- *offset = g_date_days_between (start_date, end_date);
- g_free (start_date);
- g_free (end_date);
-
- return TRUE;
-}
-
-gint
-e_calendar_item_get_n_days_from_week_start (ECalendarItem *calitem,
- gint year, gint month)
-{
- struct tm tmp_tm;
- gint start_weekday, days_from_week_start;
-
- memset (&tmp_tm, 0, sizeof (tmp_tm));
- tmp_tm.tm_year = year - 1900;
- tmp_tm.tm_mon = month;
- tmp_tm.tm_mday = 1;
- tmp_tm.tm_isdst = -1;
- mktime (&tmp_tm);
- start_weekday = (tmp_tm.tm_wday + 6) % 7; /* 0 to 6 */
- days_from_week_start = (start_weekday + 7 - calitem->week_start_day)
- % 7;
- return days_from_week_start;
-}
diff --git a/a11y/widgets/ea-calendar-item.h b/a11y/widgets/ea-calendar-item.h
deleted file mode 100644
index 5ba0c2b274..0000000000
--- a/a11y/widgets/ea-calendar-item.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-calendar-item.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#ifndef __EA_CALENDAR_ITEM_H__
-#define __EA_CALENDAR_ITEM_H__
-
-#include <atk/atkgobjectaccessible.h>
-#include <misc/e-calendar-item.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define EA_TYPE_CALENDAR_ITEM (ea_calendar_item_get_type ())
-#define EA_CALENDAR_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_CALENDAR_ITEM, EaCalendarItem))
-#define EA_CALENDAR_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_CALENDAR_ITEM, EaCalendarItemClass))
-#define EA_IS_CALENDAR_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_CALENDAR_ITEM))
-#define EA_IS_CALENDAR_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EA_TYPE_CALENDAR_ITEM))
-#define EA_CALENDAR_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EA_TYPE_CALENDAR_ITEM, EaCalendarItemClass))
-
-typedef struct _EaCalendarItem EaCalendarItem;
-typedef struct _EaCalendarItemClass EaCalendarItemClass;
-
-struct _EaCalendarItem
-{
- AtkGObjectAccessible parent;
-};
-
-GType ea_calendar_item_get_type (void);
-
-struct _EaCalendarItemClass
-{
- AtkGObjectAccessibleClass parent_class;
-};
-
-AtkObject *ea_calendar_item_new (GObject *obj);
-gboolean e_calendar_item_get_day_extents (ECalendarItem *calitem,
- gint year, gint month, gint date,
- gint *x, gint *y,
- gint *width, gint *height);
-gboolean e_calendar_item_get_date_for_offset (ECalendarItem *calitem,
- gint day_offset,
- gint *year, gint *month,
- gint *day);
-gint e_calendar_item_get_n_days_from_week_start (ECalendarItem *calitem,
- gint year, gint month);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __EA_CALENDAR_ITEM_H__ */
diff --git a/a11y/widgets/ea-combo-button.c b/a11y/widgets/ea-combo-button.c
deleted file mode 100644
index aad60c3023..0000000000
--- a/a11y/widgets/ea-combo-button.c
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Authors: Harry Lu <harry.lu@sun.com>
- *
- * Copyright (C) 2004 Ximian, Inc.
- */
-
-#include <config.h>
-#include "ea-combo-button.h"
-#include <gtk/gtkbutton.h>
-#include <gtk/gtklabel.h>
-#include <glib/gi18n.h>
-
-static AtkObjectClass *parent_class;
-static GType parent_type;
-
-/*Action IDs */
-enum {
- ACTIVATE_DEFAULT,
- POPUP_MENU,
- LAST_ACTION
-};
-
-/* Static functions */
-static G_CONST_RETURN gchar*
-ea_combo_button_get_name (AtkObject *a11y)
-{
- GtkWidget *widget;
- GtkWidget *label;
- EComboButton *button;
-
- widget = GTK_ACCESSIBLE (a11y)->widget;
- if (!widget)
- return NULL;
-
- button = E_COMBO_BUTTON (widget);
- label = e_combo_button_get_label (button);
- if (label)
- return gtk_label_get_text (GTK_LABEL (label));
-
- return _("Combo Button");
-}
-
-/* Action interface */
-static G_CONST_RETURN gchar *
-ea_combo_button_action_get_name (AtkAction *action, gint i)
-{
- switch (i)
- {
- case ACTIVATE_DEFAULT:
- return _("Activate Default");
- case POPUP_MENU:
- return _("Popup Menu");
- default:
- return NULL;
- }
-}
-
-static gboolean
-ea_combo_button_do_action (AtkAction *action,
- gint i)
-{
- GtkWidget *widget;
- EComboButton *button;
-
- widget = GTK_ACCESSIBLE (action)->widget;
- if (!widget || !GTK_WIDGET_IS_SENSITIVE (widget) || !GTK_WIDGET_VISIBLE (widget))
- return FALSE;
-
- button = E_COMBO_BUTTON (widget);
-
- switch (i)
- {
- case ACTIVATE_DEFAULT:
- g_signal_emit_by_name (button, "activate_default");
- return TRUE;
- case POPUP_MENU:
- return e_combo_button_popup_menu (button);
- default:
- return FALSE;
- }
-}
-
-static gint
-ea_combo_button_get_n_actions (AtkAction *action)
-{
- return LAST_ACTION;
-}
-
-static void
-atk_action_interface_init (AtkActionIface *iface)
-{
- g_return_if_fail (iface != NULL);
-
- iface->do_action = ea_combo_button_do_action;
- iface->get_n_actions = ea_combo_button_get_n_actions;
- iface->get_name = ea_combo_button_action_get_name;
-}
-
-static void
-ea_combo_button_class_init (EaComboButtonClass *klass)
-{
- AtkObjectClass *atk_object_class = ATK_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_ref (parent_type);
-
- atk_object_class->get_name = ea_combo_button_get_name;
-}
-
-static void
-ea_combo_button_init (EaComboButton *a11y)
-{
- /* Empty for now */
-}
-
-GType
-ea_combo_button_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- AtkObjectFactory *factory;
- GTypeQuery query;
-
- GTypeInfo info = {
- sizeof (EaComboButtonClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) ea_combo_button_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (EaComboButton),
- 0,
- (GInstanceInitFunc) ea_combo_button_init,
- NULL /* value_tree */
- };
-
- static const GInterfaceInfo atk_action_info = {
- (GInterfaceInitFunc) atk_action_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
-
- factory = atk_registry_get_factory (atk_get_default_registry (), GTK_TYPE_BUTTON);
- parent_type = atk_object_factory_get_accessible_type (factory);
- g_type_query (parent_type, &query);
-
- info.class_size = query.class_size;
- info.instance_size = query.instance_size;
-
- type = g_type_register_static (parent_type, "EaComboButton", &info, 0);
- g_type_add_interface_static (type, ATK_TYPE_ACTION,
- &atk_action_info);
-
- }
-
- return type;
-}
-
-AtkObject *
-ea_combo_button_new (GtkWidget *widget)
-{
- EaComboButton *a11y;
-
- a11y = g_object_new (ea_combo_button_get_type (), NULL);
-
- GTK_ACCESSIBLE (a11y)->widget = GTK_WIDGET (widget);
- ATK_OBJECT (a11y)->role = ATK_ROLE_PUSH_BUTTON;
-
- return ATK_OBJECT (a11y);
-}
diff --git a/a11y/widgets/ea-combo-button.h b/a11y/widgets/ea-combo-button.h
deleted file mode 100644
index 8f4c279cba..0000000000
--- a/a11y/widgets/ea-combo-button.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Authors: Harry Lu <harry.lu@sun.com>
- *
- * Copyright (C) 2004 Ximian, Inc.
- */
-
-#ifndef __EA_COMBO_BUTTON_H_
-#define __EA_COMBO_BUTTON_H_
-
-#include <gtk/gtkaccessible.h>
-#include <misc/e-combo-button.h>
-
-#define EA_TYPE_COMBO_BUTTON (ea_combo_button_get_type ())
-#define EA_COMBO_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_COMBO_BUTTON, EaComboButton))
-#define EA_COMBO_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_COMBO_BUTTON, EaComboButtonClass))
-#define EA_IS_COMBO_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_COMBO_BUTTON))
-#define EA_IS_COMBO_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EA_TYPE_COMBO_BUTTON))
-
-typedef struct _EaComboButton EaComboButton;
-typedef struct _EaComboButtonClass EaComboButtonClass;
-
-struct _EaComboButton {
- GtkAccessible object;
-};
-
-struct _EaComboButtonClass {
- GtkAccessibleClass parent_class;
-};
-
-
-/* Standard Glib function */
-GType ea_combo_button_get_type (void);
-AtkObject *ea_combo_button_new (GtkWidget *combo_button);
-
-#endif /* ! __EA_COMBO_BUTTON_H_ */
diff --git a/a11y/widgets/ea-widgets.c b/a11y/widgets/ea-widgets.c
deleted file mode 100644
index feef6d1ef3..0000000000
--- a/a11y/widgets/ea-widgets.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-widgets.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-#include "ea-factory.h"
-#include "widgets/ea-calendar-item.h"
-#include "widgets/ea-combo-button.h"
-#include "ea-widgets.h"
-
-EA_FACTORY_GOBJECT (EA_TYPE_CALENDAR_ITEM, ea_calendar_item, ea_calendar_item_new);
-EA_FACTORY (EA_TYPE_COMBO_BUTTON, ea_combo_button, ea_combo_button_new);
-
-void e_calendar_item_a11y_init (void)
-{
- EA_SET_FACTORY (e_calendar_item_get_type (), ea_calendar_item);
-}
-
-void e_combo_button_a11y_init (void)
-{
- EA_SET_FACTORY (e_combo_button_get_type (), ea_combo_button);
-}
diff --git a/a11y/widgets/ea-widgets.h b/a11y/widgets/ea-widgets.h
deleted file mode 100644
index fc8e7f1b90..0000000000
--- a/a11y/widgets/ea-widgets.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* vim:expandtab:shiftwidth=8:tabstop=8:
- */
-/* Evolution Accessibility: ea-widgets.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Bolian Yin <bolian.yin@sun.com> Sun Microsystem Inc., 2003
- *
- */
-
-/* Evolution Accessibility
-*/
-
-#ifndef _EA_WIDGETS_H__
-#define _EA_WIDGETS_H__
-
-void e_calendar_item_a11y_init (void);
-void e_combo_button_a11y_init (void);
-
-#endif /* _EA_WIDGETS_H__ */
diff --git a/acinclude.m4 b/acinclude.m4
deleted file mode 100644
index d3f83734d4..0000000000
--- a/acinclude.m4
+++ /dev/null
@@ -1,182 +0,0 @@
-# evolution/acinclude.m4
-# shared configure.in hacks between Evolution and Connector
-
-
-# EVO_PURIFY_SUPPORT
-# Add --enable-purify. If the user turns it on, subst PURIFY and set
-# the automake conditional ENABLE_PURIFY
-AC_DEFUN([EVO_PURIFY_SUPPORT], [
- AC_ARG_ENABLE(purify,
- [ --enable-purify=[no/yes] Enable support for building executables with Purify.],,enable_purify=no)
- AC_PATH_PROG(PURIFY, purify, impure)
- AC_ARG_WITH(purify-options, [ --with-purify-options=OPTIONS Options passed to the purify command line (defaults to PURIFYOPTIONS variable).])
- if test "x$with_purify_options" = "xno"; then
- with_purify_options="-always-use-cache-dir=yes -cache-dir=/gnome/lib/purify"
- fi
- if test "x$PURIFYOPTIONS" = "x"; then
- PURIFYOPTIONS=$with_purify_options
- fi
- AC_SUBST(PURIFY)
- AM_CONDITIONAL(ENABLE_PURIFY, test "x$enable_purify" = "xyes" -a "x$PURIFY" != "ximpure")
- PURIFY="$PURIFY $PURIFYOPTIONS"
-])
-
-
-# EVO_LDAP_CHECK(default)
-# Add --with-openldap and --with-static-ldap options. --with-openldap
-# defaults to the given value if not specified. If LDAP support is
-# configured, HAVE_LDAP will be defined and the automake conditional
-# ENABLE_LDAP will be set. LDAP_CFLAGS and LDAP_LIBS will be set
-# appropriately.
-AC_DEFUN([EVO_LDAP_CHECK], [
- default="$1"
-
- AC_ARG_WITH(openldap, [ --with-openldap=[no/yes/PREFIX] Enable LDAP support in evolution])
- AC_ARG_WITH(static-ldap, [ --with-static-ldap=[no/yes] Link LDAP support statically into evolution ])
- AC_CACHE_CHECK([for OpenLDAP], ac_cv_with_openldap, ac_cv_with_openldap="${with_openldap:=$default}")
- case $ac_cv_with_openldap in
- no|"")
- with_openldap=no
- ;;
- yes)
- with_openldap=/usr
- ;;
- *)
- with_openldap=$ac_cv_with_openldap
- LDAP_CFLAGS="-I$ac_cv_with_openldap/include"
- LDAP_LDFLAGS="-L$ac_cv_with_openldap/lib"
- ;;
- esac
-
- if test "$with_openldap" != no; then
- AC_DEFINE(HAVE_LDAP,1,[Define if you have LDAP support])
-
- case $with_static_ldap in
- no|"")
- with_static_ldap=no
- ;;
- *)
- with_static_ldap=yes
- ;;
- esac
-
- AC_CACHE_CHECK(if OpenLDAP is version 2.x, ac_cv_openldap_version2, [
- CPPFLAGS_save="$CPPFLAGS"
- CPPFLAGS="$CPPFLAGS $LDAP_CFLAGS"
- AC_EGREP_CPP(yes, [
- #include "ldap.h"
- #if LDAP_VENDOR_VERSION > 20000
- yes
- #endif
- ], ac_cv_openldap_version2=yes, ac_cv_openldap_version2=no)
- CPPFLAGS="$CPPFLAGS_save"
- ])
- if test "$ac_cv_openldap_version2" = no; then
- AC_MSG_ERROR(evolution requires OpenLDAP version >= 2)
- fi
-
- AC_CHECK_LIB(resolv, res_query, LDAP_LIBS="-lresolv")
- AC_CHECK_LIB(socket, bind, LDAP_LIBS="$LDAP_LIBS -lsocket")
- AC_CHECK_LIB(nsl, gethostbyaddr, LDAP_LIBS="$LDAP_LIBS -lnsl")
- AC_CHECK_LIB(lber, ber_get_tag, [
- if test "$with_static_ldap" = "yes"; then
- LDAP_LIBS="$with_openldap/lib/liblber.a $LDAP_LIBS"
-
- # libldap might depend on OpenSSL... We need to pull
- # in the dependency libs explicitly here since we're
- # not using libtool for the configure test.
- if test -f $with_openldap/lib/libldap.la; then
- LDAP_LIBS="`. $with_openldap/lib/libldap.la; echo $dependency_libs` $LDAP_LIBS"
- fi
- else
- LDAP_LIBS="-llber $LDAP_LIBS"
- fi
- AC_CHECK_LIB(ldap, ldap_open, [
- if test $with_static_ldap = "yes"; then
- LDAP_LIBS="$with_openldap/lib/libldap.a $LDAP_LIBS"
- else
- LDAP_LIBS="-lldap $LDAP_LIBS"
- fi],
- LDAP_LIBS="", $LDAP_LDFLAGS $LDAP_LIBS)
- LDAP_LIBS="$LDAP_LDFLAGS $LDAP_LIBS"
- ], LDAP_LIBS="", $LDAP_LDFLAGS $LDAP_LIBS)
-
- if test -z "$LDAP_LIBS"; then
- AC_MSG_ERROR(could not find OpenLDAP libraries)
- fi
-
- AC_SUBST(LDAP_CFLAGS)
- AC_SUBST(LDAP_LIBS)
- fi
- AM_CONDITIONAL(ENABLE_LDAP, test $with_openldap != no)
-])
-
-
-# EVO_PTHREAD_CHECK
-AC_DEFUN([EVO_PTHREAD_CHECK],[
- PTHREAD_LIB=""
- AC_CHECK_LIB(pthread, pthread_create, PTHREAD_LIB="-lpthread",
- [AC_CHECK_LIB(pthreads, pthread_create, PTHREAD_LIB="-lpthreads",
- [AC_CHECK_LIB(c_r, pthread_create, PTHREAD_LIB="-lc_r",
- [AC_CHECK_LIB(pthread, __pthread_attr_init_system, PTHREAD_LIB="-lpthread",
- [AC_CHECK_FUNC(pthread_create)]
- )]
- )]
- )]
- )
- AC_SUBST(PTHREAD_LIB)
- AC_PROVIDE([EVO_PTHREAD_CHECK])
-])
-dnl -*- mode: autoconf -*-
-
-# serial 1
-
-dnl Usage:
-dnl GTK_DOC_CHECK([minimum-gtk-doc-version])
-AC_DEFUN([GTK_DOC_CHECK],
-[
- AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first
- AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first
- dnl for overriding the documentation installation directory
- AC_ARG_WITH(html-dir,
- AC_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),,
- [with_html_dir='${datadir}/gtk-doc/html'])
- HTML_DIR="$with_html_dir"
- AC_SUBST(HTML_DIR)
-
- dnl enable/disable documentation building
- AC_ARG_ENABLE(gtk-doc,
- AC_HELP_STRING([--enable-gtk-doc],
- [use gtk-doc to build documentation [default=no]]),,
- enable_gtk_doc=no)
-
- have_gtk_doc=no
- if test -z "$PKG_CONFIG"; then
- AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
- fi
- if test "$PKG_CONFIG" != "no" && $PKG_CONFIG --exists gtk-doc; then
- have_gtk_doc=yes
- fi
-
- dnl do we want to do a version check?
-ifelse([$1],[],,
- [gtk_doc_min_version=$1
- if test "$have_gtk_doc" = yes; then
- AC_MSG_CHECKING([gtk-doc version >= $gtk_doc_min_version])
- if $PKG_CONFIG --atleast-version $gtk_doc_min_version gtk-doc; then
- AC_MSG_RESULT(yes)
- else
- AC_MSG_RESULT(no)
- have_gtk_doc=no
- fi
- fi
-])
- if test x$enable_gtk_doc = xyes; then
- if test "$have_gtk_doc" != yes; then
- enable_gtk_doc=no
- fi
- fi
-
- AM_CONDITIONAL(ENABLE_GTK_DOC, test x$enable_gtk_doc = xyes)
- AM_CONDITIONAL(GTK_DOC_USE_LIBTOOL, test -n "$LIBTOOL")
-])
diff --git a/addressbook/.cvsignore b/addressbook/.cvsignore
deleted file mode 100644
index 09980ae6ba..0000000000
--- a/addressbook/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-.deps
-.libs
-Makefile
-Makefile.in
-*.lo
-*.la
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog
deleted file mode 100644
index 9eab108cd8..0000000000
--- a/addressbook/ChangeLog
+++ /dev/null
@@ -1,7373 +0,0 @@
-2004-02-02 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/addressbook-component.c (ensure_sources): Implement
- based on the create_groups () function in addressbook-migrate.c.
- (addressbook_component_init): Call ensure_sources (). This will create
- the necessary addressbook source groups if they somehow disappeared
- from GConf.
-
- * gui/component/addressbook-config.c (addressbook_config_edit_source):
- If we can't get any source groups, just issue a console warning and
- return NULL. Creating sources without groups is meaningless.
- Work around for #67411
-
-2005-02-02 Rodney Dawes <dobey@novell.com>
-
- * gui/component/ldap-config.glade: Fix a small spacing issue in the
- Display section's children, to be HIG compliant
-
-2005-01-31 Hans Petter Jansson <hpj@novell.com>
-
- * gui/widgets/eab-config.c (_EABConfigPrivate): Use guint instead of
- ulong for signal ID.
-
-2004-01-29 Parthasarathi Susarla <sparthasarathi@novell.com>
-
- * addressbook/gui/contact-list-editor/e-contact-list-editor.c
- (save_contact) : call the eab_merging_* functions instead of
- e_book_sync* directly. The merging function check for duplication.
- The following functions have been called:
- 1. eab_merging_book_add_contact for adding a new entry
- 2. eab_merging_book_commit_contact for commiting a modified entry
-
- Fixes bug #57819
-
-2005-01-29 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/contact-editor/e-contact-editor.c
- (sensitize_im_types) : new function to sensitize
- im types based on supported fields
-
- (sensitize_im_record) : call sensitize_im_types
- for each record
- (sensitize_im) : if none of the im types
- are supported disable the im entries
- Fixes #68799
-
-2005-01-28 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/widgets/eab-vcard-control.c (pstream_load) :
- Changed a string to make it complete and clear
- for transaltion
- Fixes #61067
-
-2005-01-26 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/component/addressbook.c (addressbook_authenticate) :
- Remove leading "%s" from the transalatable string
- Fixes #36137
-
-2005-01-26 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * util/eab-book-util.c (strstrcase) :
- case insesitive version of strstr. Used
- from camel
-
- (eab_contact_list_from_string) : do case in sensitive
- search for "BEGIN:VCARD" and "END:VCARD" to
- take care of broken vcards
-
- Fixes #70339
-
-
-2005-01-26 Hao Sheng <hao.sheng@sun.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c:
- (setup_name_selector): add access key to 'Member' Button.
-
-2005-01-25 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/contact-editor/e-contact-editor.c (categories_clicked): use the
- new ECategoriesDialog widget.
-
-2005-01-21 JP Rosevear <jpr@novell.com>
-
- Fixes #70622
-
- * gui/widgets/eab-contact-display.c (eab_contact_display_init):
- construct the html widget
-
-2005-01-21 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/widgets/e-addressbook-model.[ch]
- (eab_model_class_init) : renamed the signal
- CONTACT_REMOVED to CONTACTS_REMOVED and chaned
- the param type POINTER from INT
- (remove_contact) : delete all the contacts
- from the model and emit CONATCTS_REMOVED
- signal instead of emitting it many times
-
- * gui/widgets/e-addressbook-reflow-adpater.c
- (e_addressbook_reflow_adapter_construct)
- (remove_contacts) : renamed remove_contact to remove_contacts
- and when number of conacts is more than 1 use _model_changed
- instead of _remove_item
-
- * gui/widgets/e-addressbook-table-adapter.c
- (eab_table_adapter_construct)
- (remove_contacts) : ditto
-
- * gui/widgets/e-addressbook-view.c
- (eab_view_new) :
- (contacts_removed) : renamed contact_removed
- to contacts_removed and traverese over indices
- to find displayed contact indiex
-
- fixes #71448
-
-2005-01-21 Rodney Dawes <dobey@novell.com>
-
- * gui/contact-editor/e-contact-quick-add.c (build_quick_add_dialog):
- Change the xpad and ypad to 0 here, we don't need the extra padding
- Add the GTK_DIALOG_NO_SEPARATOR flag for creating the dialog
- Set proper border widths on some dialog containers for the HIG
- Set the row/column spacings for the table widget
- Create the labels outside of the table packing calls and set the proper
- alignment for them to be HIG compliant
- Set the border width of the table widget to 12 for HIG compliance
-
- * gui/widgets/eab-popup-control.c (edit_contact_info_cb): Removed
- (eab_popup_control_display_contact): Just go ahead and open the
- editor, no need to have an intermittent window with a button for it
- (add_contacts_cb): Remove this as we don't need it any more
- (eab_popup_control_no_matches): Just go straight to the quick-add
- dialog, and don't pop up an intermittent window with a button
-
- Fixes #41210 #60852
-
-2005-01-21 Rodney Dawes <dobey@novell.com>
-
- * gui/contact-editor/e-contact-editor.c (e_contact_editor_init):
- Call gtk_widget_ensure_style to ensure that we set the border widths
- of some dialog containers properly for HIG compliance
-
-2005-01-21 Rodney Dawes <dobey@novell.com>
-
- * gui/merging/eab-contact-duplicate-detected.glade:
- Fix some spacing and remove the separator for HIG compliance
- * gui/merging/eab-contact-merging.c (match_query_callback):
- Set proper border widths on some dialog containers for the HIG
-
- Fixes #41228
-
-2005-01-21 JP Rosevear <jpr@novell.com>
-
- Fixes #46404
-
- * gui/widgets/e-addressbook-view.c (eab_view_print): just show the
- dialog, not show all (margin settings aren't supposed to be used);
- use e_print to get the dialog
- (eab_view_print_preview): use e_print config for previewing
-
- * printing/e-contact-print.c (e_contact_print_preview): get the
- e_print config for previewing
- (e_contact_print_contact_dialog_new): use e_print to get the
- print dialog
-
- * printing/e-contact-print-envelope.c
- (e_contact_print_envelope_dialog_new): use e_print to get the
- print dialog
-
-2005-01-21 Hans Petter Jansson <hpj@novell.com>
-
- * gui/contact-editor/e-contact-quick-add.c (quick_add_set_name)
- (quick_add_set_email): Don't set properties on the contact immediately.
- (clicked_cb): Set the properties on the contact immediately before
- passing it on. This way, the FULL_NAME will only be set once, and so
- the FILE_AS field will be updated here.
-
-2005-01-21 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/component/addressbook-config.c
- (eabc_commit) : in case of new book
- set the uid of the source as the relative
- uri.
-
-2005-01-19 Hao Sheng <hao.sheng@sun.com>
-
- * gui/contact-editor/contact-editor.glade:
- add accessable key to the contact editor UI.
- * gui/contact-list-editor/contact-list-editor.glade:
- add accessable key to the contact list editor UI.
-
-2005-01-18 Hao Sheng <hao.sheng@sun.com>
-
- * gui/component/addressbook-view.c:
- (addressbook_view_init): add a11y name for the contact's
- treeview.
-
-2005-01-18 Hao Sheng <hao.sheng@sun.com>
-
- * gui/contact-editor/contact-editor.glade:
- add a11y names for widgets named "Image","Anniversary" and "Birthday".
- * gui/contact-editor/e-contact-editor.c:
- (e_contact_editor_create_date): add string1 as entry's a11y name.
-
-2005-01-17 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/contact-editor/e-contact-editor.c
- (fill_in_email_record) : show "other" when email
- does not carry "TYPE"
- (fill_in_email) : pass deafult email
- types instead of -1 when clearing fields
-
- Fixes #70922
-
-2005-01-17 Hao Sheng <hao.sheng@sun.com>
-
- * gui/contact-editor/contact-editor.glade:
- add the a11y name for arrow-button named "Telephone".
-
-2005-01-12 JP Rosevear <jpr@novell.com>
-
- Fixes #61973
-
- * gui/widgets/e-addressbook-view.etspec: add translator comment for TTYTDD
-
-2005-01-11 Not Zed <NotZed@Ximian.com>
-
- * util/eab-book-util.c (eab_name_and_email_query): cast length
- specifier to int.
-
-2005-01-10 Hans Petter Jansson <hpj@novell.com>
-
- * gui/widgets/e-minicard.c (e_minicard_activate_editor): When spawning
- an editor, set the initial editability from the target book, not from
- the minicard's own (usually stale, useless) editable state.
-
-2005-01-06 JP Rosevear <jpr@novell.com>
-
- * gui/component/Makefile.am: install schemas properly
-
-2004-12-21 Andre Klapper <a9016009@gmx.de>
-
- * tools/evolution-addressbook-export.c:
- Fixing bug 61068 (removing a white space in a string).
-
-2004-12-23 Sivaiah Nallagatla <snallagatla@novell.com>
-
- Part of merge from offline branch
-
- * gui/widgets/addresbook-config.c (eabc_general_offline) :
- fix some compile warings
- (offline_status_changed_cb) : set "0" instead of NULL
- as e-source property when offline is not checked
-
-2004-11-23 Sivaiah Nallagatla <snallagatla@novell.com>
-
- Part of merge from offline brnach
-
- * gui/widgets/eab-gui-util.c (eab_load_error_dialog) :
- added message which gets prompted when user tries
- to access a book which is not available in offline mode
-
- * gui/component/addressbook-config.c (eabc_general_offline)
- (offline_status_changed_cb) : added a new check box
- to properties page to mark a book for offline usage
-
- * gui/component/addressbook.c (load_source_cb) : do no try to
- authenticate in case of offline mode.
- (auth_required_cb) : new call back which gets called
- when backend sends notification for password to client
-
-2004-12-23 Hans Petter Jansson <hpj@novell.com>
-
- This is the last we see of ESelectNames.
-
- * gui/component/select-names/Evolution-Addressbook-SelectNames.idl
- * gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in
- * gui/component/select-names/Makefile.am
- * gui/component/select-names/e-select-names-bonobo.c
- * gui/component/select-names/e-select-names-bonobo.h
- * gui/component/select-names/e-select-names-completion.c
- * gui/component/select-names/e-select-names-completion.h
- * gui/component/select-names/e-select-names-config-keys.h
- * gui/component/select-names/e-select-names-config.c
- * gui/component/select-names/e-select-names-config.h
- * gui/component/select-names/e-select-names-factory.c
- * gui/component/select-names/e-select-names-factory.h
- * gui/component/select-names/e-select-names-manager.c
- * gui/component/select-names/e-select-names-manager.h
- * gui/component/select-names/e-select-names-marshal.list
- * gui/component/select-names/e-select-names-model.c
- * gui/component/select-names/e-select-names-model.h
- * gui/component/select-names/e-select-names-popup.c
- * gui/component/select-names/e-select-names-popup.h
- * gui/component/select-names/e-select-names-section.etspec
- * gui/component/select-names/e-select-names-table-model.c
- * gui/component/select-names/e-select-names-table-model.h
- * gui/component/select-names/e-select-names-text-model.c
- * gui/component/select-names/e-select-names-text-model.h
- * gui/component/select-names/e-select-names.c
- * gui/component/select-names/e-select-names.etspec
- * gui/component/select-names/e-select-names.h
- * gui/component/select-names/recipient.glade
- * gui/component/select-names/select-names.glade: Begone.
-
-2004-12-23 Hans Petter Jansson <hpj@novell.com>
-
- * gui/component/Makefile.am (SUBDIRS): No more select-names.
- (libevolution_addressbook_la_LIBADD): Remove libeselectnames.la.
-
- * gui/component/component-factory.c (factory): Remove the select-names
- component.
-
- * gui/contact-list-editor/Makefile.am (IDL)
- (IDL_GENERATED_H)
- (selectnamesdir): No longer needed, so removed.
-
-2004-12-22 Hans Petter Jansson <hpj@novell.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (e_contact_list_editor_dispose): Unref the name selector.
- (e_contact_list_editor_save_contact): Fix a warning.
- (add_to_model): Take a list instead of a vector of destinations.
- (select_names_ok_cb): Adapt to new name selector.
- (setup_corba): Renamed to setup_name_selector () and adapted.
- (select_cb): Adapt to new name selector.
-
- * gui/contact-list-editor/e-contact-list-editor.h: Adapt to new
- name selector and remove CORBA/Bonobo.
-
- * gui/widgets/eab-popup.c (eabp_target_free)
- (eabp_popup_target_new_select_names): #ifdef out code that
- depended on the old name selector.
-
-2004-12-17 Not Zed <NotZed@Ximian.com>
-
- * util/ea-popup.c (emp_standard_menu_factory):
-
- * gui/component/select-names/e-select-names.c (section_right_click_cb):
-
- * gui/component/addressbook-view.c (popup_event_callback):
-
- * gui/widgets/e-addressbook-view.c (do_popup_menu): api changes.
-
-2004-12-21 JP Rosevear <jpr@novell.com>
-
- Fixes #61975
-
- * gui/widgets/test-reflow.c: kill translated strings that were #if
- 0'd anyhow
-
-2004-12-21 JP Rosevear <jpr@novell.com>
-
- * gui/search/e-addressbook-search-dialog.c: convert to
- G_DEFINE_TYPE
-
- * gui/widgets/gal-view-factory-minicard.c: ditto
-
- * gui/widgets/gal-view-factory-treeview.c: ditto
-
-2004-12-13 Vivek Jain <jvivek@novell.com>
-
- * gui/component/addressbook-config.c (addressbook_config_edit_source): set the
- window title based upon the source
-
-2004-12-08 Hans Petter Jansson <hpj@novell.com>
-
- * gui/component/addressbook-migrate.c
- * gui/component/select-names/e-select-names-completion.c
- * gui/component/select-names/e-select-names-manager.c
- * gui/component/select-names/e-select-names-model.h
- * gui/contact-list-editor/e-contact-list-editor.h
- * gui/contact-list-editor/e-contact-list-model.h
- * gui/widgets/e-minicard.c
- * gui/widgets/eab-gui-util.c
- * importers/evolution-ldif-importer.c
- * importers/evolution-vcard-importer.c: Include
- <libebook/e-destination.h> from evolution-data-server.
- * util/Makefile.am: Remove e-destination.[ch] from here.
- * util/e-destination.[ch]: Removed.
-
-2004-12-08 S. Caglar Onur <caglar@uludag.org.tr>
-
- * evolution-2.0.2/addressbook/gui/contact-editor/e-contact-editor.c
- (get_ui_slot_param)
- (get_attributes_named): some strcasecmp() calls changed with
- g_ascii_strcasecmp() for Turkish character conversiton problems
- [ http://www.i18nguy.com/unicode/turkish-i18n.html ]
-
-2004-12-06 Not Zed <NotZed@Ximian.com>
-
- * gui/component/addressbook-config.c (eabc_general_type): set the
- active item based on the current group.
-
-2004-12-01 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/contact-editor/e-contact-editor.c (save_contact) :
- save the uid and set it again in the contact. Otherwise, there is
- possibility we trying to save the contact wiht out UID, as we destory the
- contact and create new one when data is wrong
-
-
-2004-11-28 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/contact-editor/e-contact-editor.h : Define
- new list for storing required fields
-
- * gui/contact-editor/e-contact-editor.c
- (e_contact_editor_class_init) : install new REQUIRED_FIELDS
- property
- (e_contact_editor_set_property)
- (e_contact_editor_get_property) : added handling
- for new RQUIRED_FIELDS_PROPERTY
- (e_contact_editor_dispose) : unref the new
- required_fields member
- (required_fields_cb) : call back to set required fields into
- contact editor
- (is_non_string_field) : new method to detect
- whether a particular field in contact is a string or not
- (e_contact_editor_is_valid) : check for presence of
- all required fields
- (save_contact) : extract all the data before
- calling e_contact_editor_is_valid so that
- it can check for required fields. Clean up the contact
- if there is an error
-
-2004-11-27 Sushma Rai <rsushma@novell.com>
-
- * gui/widgets/e-minicard-view.c (set_empty_message):
- Checking for the static capability "do-initial-query",
- and setting the relevent empty addressbook message.
-
-2004-11-26 JP Rosevear <jpr@novell.com>
-
- * gui/component/select-names/e-select-names-popup.c
- (populate_popup_contact): get image directly from icon factory
-
- * gui/contact-editor/e-contact-editor-im.c
- (setup_service_optmenu): ditto
-
-2004-11-25 Hao Sheng <hao.sheng@sun.com>
-
- * gui/contact-editor/contact-editor.glade:
- add "labelled by" between entry and label,
- make accessbility work.
- * gui/contact-editor/e-contact-editor.c:
- (e_contact_editor_create_web): add accessible name to e_url_entry.
-
-2004-11-22 Joan Sanfeliu <joan@fibranet.com>
-
- * gui/component/apps_evolution_addressbook.schemas.in.in:
- * gui/component/ldap-config.glade : Evolution product name spelled
- with an uppercase E
-
- Fixes #61065
-
-2004-11-22 Rodney Dawes <dobey@novell.com>
-
- * importers/GNOME_Evolution_Addressbook_VCard_Importer.server.in.in:
- Fix name attribute values to be identical
-
- Fixes #61976
-
-2004-11-21 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * rever last commit , it is supposed to for offline
- branch not to HEAD
-
-2004-11-21 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/widgets/eab-gui-util.c (eab_load_error_dialog) :
- added message which gets prompted when user tries
- to access a book which is not available in offline mode
-
- * gui/component/addressbook-config.c (eabc_general_offline)
- (offline_status_changed_cb) : added a new check box
- to properties page to mark a book for offline usage
-
- * gui/component/addressbook.c (load_source_cb) : do no try to
- authenticate in case of offline mode.
- (auth_required_cb) : new call back which gets called
- when backend sends notification for password to client
-
-2004-11-07 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * util/eab-book-util.c (eab_name_and_email_query) :
- When name is NULL query against complete email id instead of
- user name part to take care of users@foo.org not matching
- against users@bar.org . Also include query based on name always
-
- Fix for #67656
-
-
-2004-11-16 Not Zed <NotZed@Ximian.com>
-
- * util/Makefile.am (libeabutil_la_LIBADD): remove camel, add
- ADDRESSBOOK_LIBS.
-
- * conduit/Makefile.am (libeaddress_conduit_la_LIBADD): remove
- camel.
-
- * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD):
- remove camel.
-
-2004-11-15 Not Zed <NotZed@Ximian.com>
-
- * *.c: Moved various things from e-util to libedataserver, where
- appropriate.
-
-2004-11-08 Andre Klapper <a901600@gmx.de>
-
- Fixes bug #61966.
-
- * addressbook-errors.xml: Add a missing word to a string.
-
-2004-11-08 Steven Zhang <steven.zhang@sun.com>
-
- * gui/widgets/e-minicard.c: (e_minicard_activate_editor):
- rename and make it a public function.
- (e_minicard_event): change accordingly.
- * gui/widgets/e-minicard.h: ditto.
-
-2004-11-04 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/contact-editor/e-contact-editor.c (save_contact) :
- populate contact only afte we are sure that data is valid
- and we can create that.
- Fixes #69079
-
-2004-11-07 Rodney Dawes <dobey@novell.com>
-
- * gui/contact-editor/e-contact-editor.c
- (init_email_record_location, init_im_record_location):
- Translate the category pretty names that we pass for creation of
- new menu item entries for the E-Mail and IM dropdown selections
-
- Partially fixes bug #66854
-
-2004-11-04 mengjie yu <meng-jie.yu@sun.com>
-
- fix for bugzilla #44876
-
- * gui/component/select-names/e-select-names-manager.c:
- (e_select_names_manager_entry_new):add a atk name for the entry.
-
-2004-11-2 Hao Sheng <hao.sheng@sun.com>
-
- * gui/widgets/e-minicard-view.c: popup right-click menu after
- pressing Shift+F10.
-
-2004-11-01 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/widgets/eab-gui-util.c
- (added_cb) (_modified_cb) : Don't show
- error dialogs when status code is E_BOOK_ERROR_CANCELLED. We don't
- wabt to show "Error adding contact, Cancelled" dialogs when user
- cancels duplicated contact detected dialog.
-
-2004-10-27 Andre Klapper <a9016009@gmx.de>
-
- * tools/evolution-addressbook-export.c:
- Fixing a typo (bug 61069).
-
-2004-10-26 Andre Klapper <a9016009@gmx.de>
-
- Fixes #61972.
-
- * addressbook/gui/contact-editor/e-contact-editor-address.c:
- Typo in country name: was "Grena-dines", now "Grenadines".
-
-2004-10-25 Nat Friedman <nat@novell.com>
-
- * gui/widgets/eab-contact-display.c (accum_multival_attribute):
- Display mutlivalued contact attributes in the preview.
- (render_contact): Render all IM fields using the new multival
- function.
-
-2004-10-21 JP Rosevear <jpr@novell.com>
-
- * gui/widgets/eab-config.c (ecph_class_init): correct hook name
- typo
-
- * gui/component/addressbook-view.c: add appropriate popup icons
-
-2004-10-21 Not Zed <NotZed@Ximian.com>
-
- * gui/component/addressbook-config.c
- (addressbook_config_edit_source): fix a past-o for no-ldap case.
-
-2004-10-20 Not Zed <NotZed@Ximian.com>
-
- * gui/component/addressbook-component.c
- (addressbook_component_init): register config hook.
-
- * gui/component/addressbook-config.c: mostly re-written to use econfig.
- (query_for_supported_bases): convert to gtktreeview.
-
- * gui/widgets/eab-config.c (ecp_set_target): hook onto source changed.
- (ecp_source_changed): propagate changed state info.
- (ecp_class_init): setup private data.
-
-2004-10-19 Not Zed <NotZed@Ximian.com>
-
- * gui/widgets/eab-menu.c (eabm_target_free): don't unref null
- book.
-
-2004-10-19 JP Rosevear <jpr@novell.com>
-
- * gui/component/addressbook-view.c,
- gui/component/select-names/e-select-names.c,
- gui/widgets/e-addressbook-view.c, gui/widgets/eab-menu.c,
- gui/widgets/eab-popup.c: convert to org.gnome hook names
-
-2004-10-15 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/widgets/e-addressbook-view.c : add EAB_POPUP_SELECT_ANY
- mask instead of EAB_POPUP_SELECT_MANY, so that
- all the options like Save as, Forward etc are enabled even
- single contact is selected.
-
-2004-10-15 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/widgets/eab-contact-display.c : uncomment
- HANDLE_MAILTO_INTERNALLY define so that we will
- launch composer through bonobo instead of using
- gnome_url_show
-
-2004-10-15 Not Zed <NotZed@Ximian.com>
-
- * gui/widgets/eab-popup.c: added an any select mask and updated
- the hook maps.
-
- * gui/component/addressbook-component.c
- (addressbook_component_init): register the addressbook hooks.
-
- * gui/component/addressbook-view.c (addressbook_view_init): setup
- the menu manager.
- (control_activate_cb): activate the menu manager.
- (update_command_state): and update the menu manager.
-
- * gui/widgets/eab-menu.[ch]: Added menu manager class.
-
-2004-10-13 JP Rosevear <jpr@novell.com>
-
- * importers/evolution-vcard-importer.c: find source selector and
- option menu in libedataserverui
-
- * importers/evolution-ldif-importer.c: ditto
-
- * gui/widgets/eab-popup.c: ditto
-
- * gui/widgets/eab-gui-util.c: ditto
-
- * gui/contact-list-editor/e-contact-list-editor.c: ditto
-
- * gui/contact-editor/e-contact-editor.c: ditto
-
- * gui/component/select-names/e-select-names.h: ditto
-
- * gui/component/autocompletion-config.c: ditto
-
- * gui/component/addressbook-view.c: ditto
-
-2004-10-11 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/addressbook-view.c (source_list_changed_cb): Don't
- unref the view - removing it from the hash table will do this for us.
- Remove from hash table after removing the notebook page.
- (addressbook_view_init): Unref views when removed from the hash
- table.
-
-2004-10-06 Not Zed <NotZed@Ximian.com>
-
- * gui/component/addressbook-view.c (popup_event_callback):
- * gui/component/select-names/e-select-names.c (section_right_click_cb):
- * gui/widgets/e-addressbook-view.c (do_popup_menu): fix for
- e-popup api changes. Moved all mask specifiers to visible rather
- than enable in the menu table.
-
-2004-10-06 Not Zed <NotZed@Ximian.com>
-
- * gui/contact-editor/e-contact-editor.c: removed
- gnome-popup-menu.h (unused).
-
- * gui/widgets/e-addressbook-reflow-adapter.c:
- * gui/widgets/eab-popup-control.c: remove e-popup-menu.h (unused).
-
- * gui/component/select-names/e-select-names.c
- (section_right_click_cb): use e-popup. Somewhat overengineered
- for this use ...
- (remove_cb): api changes.
-
- * gui/widgets/eab-popup.c (eab_popup_target_new_select_names):
- added pretty useless wrapper for the select names popup. Added to
- hook maps.
-
-2004-10-01 Not Zed <NotZed@Ximian.com>
-
- * gui/widgets/e-addressbook-view.c (do_popup_menu): convert to
- using EABPopup.
- (sources): remove dead code.
- (has_email_address_1, get_has_email_address): removed now
- redundant code.
- (save_as, send_as, send_to, print, copy, paste, cut, delete)
- (copy_to_folder, move_to_folder, new_card, new_list): new api.
- (free_popup_info): dead.
- (print_envelope): not pining.
- (get_contact_list): take a popup target instead, don't ref.
- (get_contact_list_1): not required no more.
- (contact_and_book_free): same.
- (delete): call eab_view_delete_selection.
- (eab_view_delete_selection): do the actual delete here.
-
- * gui/widgets/eab-popup.c (eab_popup_target_new_select): implement.
-
-2004-10-01 Not Zed <NotZed@Ximian.com>
-
- * gui/widgets/eab-popup.[ch]: addressbook popup driver.
-
- * gui/component/addressbook-view.c (delete_addressbook_cb): use
- e-error for the message prompt. don't bother keeping it around,
- it can never be re-sensitised anyway.
- (book_removed): no longer destroy the original dialogue.
-
- * addressbook-errors.xml: add ask-delete for deleting
- addressbooks.
-
- * gui/component/addressbook-view.c (addressbook_view_init):
- connect to popup_event rather than fill_popup_menu now.
- (fill_popup_menu_callback): renamed to popup_event_callback,
- changed to use epopup.
- (add_popup_menu_item): remove, no longer needed.
-
-2004-09-29 Not Zed <NotZed@Ximian.com>
-
- Fixes bug #66520.
-
- * gui/widgets/e-addressbook-view.c (eab_view_dispose): don't unref
- the contact_display_window, it will be destroyed by being
- parented.
-
-2004-09-29 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes bug #66369.
-
- * util/eab-book-util.c (eab_contact_list_from_string): Make the
- vcard splitter work with any amount of blank lines between vcards.
-
-2004-09-29 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes bug #65537.
-
- * gui/merging/eab-contact-compare.c (query_cb): Protect against NULL
- UIDs, and make fewer calls to e_contact_get_const () as a bonus.
-
-2004-09-24 Hao Sheng <hao.sheng@sun.com>
-
- Fix for #66523
-
- * gui/contact-list-editor/e-contact-list-model.c:
- (e_contact_list_model_add_email): estimate the same mail address
- and popup a warning dialog.
- * addressbook-errors.xml: add the question message for the warning
- dialog.
-
-2004-09-23 Pamplona Hackers <gnome-desarrollo@es.gnome.org>
-
- Fixes #61978
-
- * tools/evolution-addressbook-export.c (main): use more
- meaningful error message.
-
-2004-09-23 Fazlu & Hannah <hannah_lins@yahoo.co.in>
-
- * tools/evolution-addressbook-export.c (main):
- Changed the string into proper grammar 'In normal mode, there
- should not need size option.' to 'In normal mode, there is no need
- for the size option.'
-
-2004-09-23 JP Rosevear <jpr@novell.com>
-
- * conduit/address-conduit.c (ecard_from_remote_record): only set
- the file as address to the company if no full name exists
- (delete_record): don't bail out if the record simply isn't found
-
- Fixes #59725
-
- * conduit/address-conduit.c (local_record_from_uid): remove
- extraneous semicolon
-
-2004-09-21 William Jon McCann <mccann@jhu.edu>
-
- * gui/component/component-factory.c (factory): Quiet debug messages.
-
- * gui/widgets/e-addressbook-view.c (eab_view_new): Remove
- unnecessary label widget placeholder. Make vertical scrollbar
- policy automatic. Use gtk_paned_add2 instead of
- gtk_container_add.
-
- * gui/component/apps_evolution_addressbook.schemas.in.in: Add
- missing show_preview schema. Add missing long descriptions.
-
-2004-09-13 Rodney Dawes <dobey@novell.com>
-
- * gui/contact-editor/e-contact-editor.c (show_help_cb):
- Point at the correct XML file for documentation
-
-2004-09-13 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/contact-editor/e-contact-editor.c
- (sensitize_address) : check for _LABEL
- type address fields also in supported fileds
- while sensitizing the address fields
-
-2004-09-03 JP Rosevear <jpr@novell.com>
-
- Fixes #63191
-
- * gui/contact-list-editor/contact-list-editor.glade: set the title
- properly
-
-2004-09-08 Not Zed <NotZed@Ximian.com>
-
- ** See bug #64080.
-
- * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD):
- link addressbook to camel.
-
-2004-09-04 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/widgets/e-addressbook-view.h : add
- new widget variable contact_dsiplay_window to _EABView strcut
- to store. Remove unused scrolled varible
- * gui/widgets/e-addressbook-view.c (eab_view_init)
- (eab_view_dispose) : initialize and unref the new widget
- added
- (eab_view_new) : remove the loca variable scrlled_window
- instead use eav->contact_display_window
- (eab_view_show_contact_preview) : show/hide contact_display_window
- instead of contact_display
- Fixes #64024
-
-
-2004-08-27 Not Zed <NotZed@Ximian.com>
-
- ** See bug #62856 (workaround).
-
- * gui/component/addressbook.c (addressbook_authenticate): add
- online flag to password request.
-
- ** See bug #64011.
-
- * gui/component/addressbook-view.c (edit_addressbook_cb): Remove
- double ;; in declaration section (c99 extension). From Vincent
- Noel <vnoel@cox.net>.
-
-2004-08-26 Hans Petter Jansson <hpj@ximian.com>
-
- Really fixes #61833 and #63697.
-
- * gui/component/select-names/e-select-names.etspec: Fetch values from
- column 86 (NAME_OR_ORG), instead of 2 (FILE_AS).
-
-2004-08-26 Chris Toshok <toshok@ximian.com>
-
- [ patch for the rest of 60889 ]
- * gui/merging/eab-contact-merging.c (add_lookup): new function,
- either start up the query or add it to the queue if we're over the
- number of simultaneous queries.
- (finished_lookup): start up enough pending queries to get us to
- our limit again.
- (free_lookup): free lookup->avoid.
- (final_id_cb): call finished_lookup.
- (eab_merging_book_add_contact): set lookup->avoid to NULL and
- replace call to eab_contact_locate_match_full with add_lookup.
- (eab_merging_book_commit_contact): set lookup->avoid to the
- contact, and make the same
- s/eab_contact_locate_match_full/add_lookup/ replacement.
-
-2004-08-26 Christian Neumair <chris@gnome-de.org>
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in:
- Don't mark component menu accel for translation.
-
-2004-08-25 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/component/addressbook-config.c (source_to_dialog) :
- disbale the display name widget in case of groupwise as we can not handle renames as
- of now
- (dialog_to_source) also copy "use_ssl" property to new source so that
- new books also use ssl
-
-2004-08-25 Hans Petter Jansson <hpj@ximian.com>
-
- May fix #61833.
-
- * gui/component/select-names/e-select-names-table-model.c
- (fill_in_info): Get E_CONTACT_NAME_OR_ORG (first found from File As,
- Full Name, Organization, Email 1) for the "name" field. Hopefully
- will prevent most cases of blank entries.
-
-2004-08-25 Frederic Crozat <fcrozat@mandrakesoft.com>
-
- * gui/component/addressbook-view.c: (delete_addressbook_cb):
- Don't call gtk_dialog_set_has_separator on Gtk Message Dialog
- with GTK+ >= 2.4.0.
-
-2004-08-20 Chris Toshok <toshok@ximian.com>
-
- * gui/component/component-factory.c (factory): remove the dead
- ldap config control stuff.
-
-2004-08-20 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes bug #62715.
-
- * gui/contact-editor/e-contact-editor.c
- (fill_in_address_label_textview): Implement.
- (fill_in_address_field): If structured address information is not
- available, try putting the "label" blob in the free-form field.
-
-2004-08-19 Hans Petter Jansson <hpj@ximian.com>
-
- Makes the contact image selector use GtkFileChooser if available.
-
- * gui/contact-editor/e-contact-editor.c (image_selected_cb): Take just
- the editor as an argument, so we can call from other places without
- having to supply dummy args. Rename to image_selected, since it's no
- longer strictly a callback. Include optional code to use the new
- GtkFileChooser.
- (image_cleared_cb): Ditto. Rename to image_cleared.
- (file_chooser_response): Optional response handling for GtkFileChooser.
- (image_clicked): Include optional code to use the new GtkFileChooser.
- Move common strings to variables. For GtkFileSelection, swap callback
- parameters for the modified image_selected () and image_cleared ().
-
-2004-08-19 Chris Toshok <toshok@ximian.com>
-
- [ likely fixes #61500 ]
- * addressbook-errors.xml (remove-addressbook): remove the
- secondary text, since we don't have the gerror text to supply it
- anymore.
-
- * gui/component/addressbook-view.c (book_removed): new function,
- move the error handling here.
- (delete_addressbook_cb): create a closure with necessary data, and
- call the e_book_async_remove instead of e_book_remove.
-
-2004-08-18 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/component/select-names/e-select-names.c (e_select_names_init) :
- select names dialog can not be modal as password dialogs can come up while
- user is in this dialog for address books which require authentication
- like groupwise and LDAP
- FIxes #63257
-
-2004-08-11 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (app_delete_event_cb):
- Remove the custom prompt-to-save dialogs from here - use
- eab_prompt_save_dialog (), and then only if the contact actually
- changed.
-
-2004-08-16 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/eab-gui-util.c (eab_show_multiple_contacts):
- reinstate the ngettext patch that was part of the #53464 commit of
- 2004-03-24 by dsegan@gmx.net.
-
-2004-08-12 Carlos Garnacho Parro <carlosg@gnome.org>
-
- * gui/widgets/eab-gui-util.c: Optionally use GtkFileChooser if
- compiled against Gtk+ >= 2.4.0
-
-2004-08-10 Not Zed <NotZed@Ximian.com>
-
- * gui/component/addressbook.c (addressbook_authenticate): e
- passwords api change/reprompt if we need to.
-
-2004-08-12 Sivaiah nallagatla <snallagatla@novell.com>
-
- * gui/compoent/addressbook.c : just revering a local change
- gone in in the commit i just made
-
-2004-08-12 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/component/addresbook.c (load_source_auth_cb) :
- when user cancels auth dialog send the anonoymous query
- only in case of ldap
- *gui/component/addresbook-view.c (book_open_cb) : no need to
- display the error dialog when user cancels that
-
-2004-08-04 Rodney Dawes <dobey@novell.com>
-
- * gui/widgets/eab-popup-control.c: #include <gtk/gtkvbox.h>
-
-2004-08-02 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes #60529.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (table_drag_drop_cb): Make sure to get the text/x-vcard target.
-
-2004-08-02 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes #62085.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (e_contact_list_editor_class_init): Set the save_contact method.
- (e_contact_list_editor_save_contact): Implement.
-
-2004-08-02 JP Rosevear <jpr@novell.com>
-
- * conduit/address-conduit.c (addrconduit_load_configuration): get
- source uid
- (addrconduit_dupe_configuration): copy source_uid
- (addrconduit_destroy_configuration): free source_uid
- (e_addr_context_new): get the source list
- (e_addr_context_destroy): unref the source list
- (pre_sync): open the source that was set earlier
- (fill_widgets): set the source option menu value
- (create_settings_window): pass source list to pilot settings
- (save_settings): save source uid
-
- * conduit/Makefile.am: link to and include misc. widgets
-
-2004-08-02 Rodney Dawes <dobey@novell.com>
-
- * gui/component/ldap-config.glade: Make the main dialog here be
- an actual GtkDialog instead of a GtkWindow
- Fix up a few small spacing issues with the UI
- Change "Contacts Group" to "Address Book"
-
- * gui/component/addressbook-config.c (query_for_supported_bases):
- Use gtk_widget_ensure_style instead of gtk_widget_realize
- (addressbook_add_server_dialog):
- Use gtk_widget_ensure_style on the dialog and fix the spacing and
- border width of the dialog containers
-
- Fixes #61365
-
-2004-07-30 Chris Toshok <toshok@ximian.com>
-
- [ fixes #61365 and other misc issues with the addressbook source
- editors ]
-
- * gui/component/ldap-config.glade: change the
- supported-bases-dialog to be initially hidden.
-
- * gui/component/addressbook-view.c (editor_weak_notify): new
- function, remove the editor from our hash.
- (source_list_changed_cb): destroy the editors for given sources if
- they're up when the source disappears.
- (edit_addressbook_cb): add the editor (and some other misc info we
- need) to our uid_to_editor hash so we can look it up later. only
- create the editor if one doesn't exist for the given source.
- (destroy_editor): GHFunc that destroys the widgets.
- (addressbook_view_dispose): destroy uid_to_editor.
- (addressbook_view_init): init uid_to_editor.
-
- * gui/component/addressbook-config.h: change return values for
- _edit_source and _new_source - they both return GtkWidget*s now.
-
- * gui/component/addressbook-config.c (addressbook_ldap_init):
- attempt set the protocol version to LDAPv3. This makes the
- ldap_auth stuff work if the server requires v3.
- (addressbook_root_dse_query): we don't need the separate window
- arg, since all of this now happens *before* the supported bases
- dialog is shown. we just use the source dialog's window for the
- various error dialogs.
- (do_ldap_root_dse_query): same.
- (query_for_supported_bases): same, and set the supported bases
- dialog as transient-for the source dialog, and make it modal.
- Lastly, don't make the editor modal.
- (addressbook_config_edit_source): return the editor's window.
- (addressbook_config_create_new_source): same.
-
-2004-07-26 JP Rosevear <jpr@novell.com>
-
- * gui/component/ldap-config.glade: change contacts group to
- address book
-
- * gui/component/addressbook-component.c
- (impl__get_userCreatableItems): ditto
-
-2004-07-19 Radek Doulik <rodo@ximian.com>
-
- * gui/widgets/eab-vcard-control.c (eab_vcard_control_new): but
- buttons to button box, use vbox instead of table
-
- * gui/widgets/eab-contact-display.c: base this widget directly on
- gtkhtml
-
- * gui/widgets/e-addressbook-view.c (eab_view_new): put contact
- display in scrolled window
-
-2004-07-20 Not Zed <NotZed@Ximian.com>
-
- * gui/widgets/eab-contact-display.c:
- * gui/contact-editor/eab-editor.c:
- * gui/component/addressbook-migrate.c: include config.h #61395.
-
-2004-07-21 Chris Toshok <toshok@ximian.com>
-
- [ fixes #60508 ]
-
- * gui/component/addressbook-config.h: reorder the Scopes so that
- they match the option menu.
-
- * gui/component/ldap-config.glade: change the scope option menu to
- only display One and Sub, and also set the Login field to Lo_gin
- in both dialogs. Add accelerators for the details page as well.
-
-2004-07-21 Rodney Dawes <dobey@novell.com>
-
- * gui/contact-editor/contact-editor.glade:
- Give a reasonable name to the widget for the _Where label
-
- * gui/contact-editor/e-contact-editor.c (e_contact_editor_init):
- Set the mnemonic widget for the _Where label
-
- Fixes #61544
-
-2004-07-20 JP Rosevear <jpr@novell.com>
-
- * gui/component/autocompletion-config.c
- (autocompletion_config_control_new): don't set the toggle
- selection
-
-2004-07-16 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (contact_added_cb)
- (save_contact)
- (app_delete_event_cb): Check source book writeability directly instead
- of relying on stored state.
- (e_contact_editor_init): Don't init source_editable.
- (e_contact_editor_dispose): We don't listen for source writeability
- anymore.
- (writable_changed): Source writeability doesn't affect widget
- status; remove code to check for it.
- (e_contact_editor_set_property): Do nothing if book being set is
- the same as currently set book; previously we would end up
- unreffing then reffing it. Don't watch for source writeability, but
- do so for target; fixes a warning. Only call sensitize_all() if
- writeability on target changed.
-
- * gui/contact-editor/e-contact-editor.h (EContactEditor): We don't
- need the source_editable and source_editable_id vars anymore.
-
-2004-07-14 Chris Toshok <toshok@ximian.com>
-
- [ fixes #60873, and possibly other crashes ]
-
- * gui/widgets/e-addressbook-model.c (get_view): don't call
- free_data before potentially making an async call. Or rather,
- don't call free_data without ensure we'll be emitting
- MODEL_CHANGED shortly after.
-
-2004-07-14 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-list-editor/.cvsignore: ignore
- Evolution-Addressbook-SelectNames.h.
-
- * gui/contact-list-editor/e-contact-list-editor.c: include our
- local (in this directory) generated
- Evolution-Addressbook-SelectNames.h
-
- * gui/contact-list-editor/Makefile.am: add stuff to generate (and
- clean up) the select names header we need to include.
-
-2004-07-13 Rodney Dawes <dobey@novell.com>
-
- [ fixes #56657 ]
-
- * gui/component/addressbook-migrate.c (get_source_by_uri):
- Replace this call with get_source_by_name ()
- (migrate_completion_folders): Fix the non-local folder migration
- to look up sources for the migrated folders based on name, instead
- of using the URI
-
-2004-07-12 Chris Toshok <toshok@ximian.com>
-
- [ fixes #61299 ]
-
- * gui/component/addressbook.c (addressbook_load_default_book):
- don't pass @closure to load_source_cb, since that expects to get a
- LoadSourceData*. also, don't always call e_book_async_open. only
- do that when the book is non-NULL.
-
-2004-07-12 Chris Toshok <toshok@ximian.com>
-
- [ part of fix for bug #56520 ]
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (e_contact_list_editor_init): init allows_contact_lists to TRUE.
- (list_deleted_cb): nuke, it's unused.
- (e_contact_list_editor_set_property): check if the book supports
- contact lists, and desensitize things if it doesn't.
- (select_names_ok_cb): this isn't valid C. declarations must come
- before code.
- (set_editable): the editable state of the dialog depends on
- whether or not the backend supports contact lists.
- (command_state_changed): the ok button needs to depend on
- allows_contact_lists.
- (extract_info): quiet compiler warning.
-
- * gui/contact-list-editor/e-contact-list-editor.h (struct
- _EContactListEditor): add allow_contact_lists.
-
-2004-07-08 Frederic Crozat <fcrozat@mandrakesoft.com>
-
- * gui/component/Makefile.am:
- tarball should ship .schemas.in.in files, not generated files.
-
- * gui/component/apps_evolution_addressbook.schemas.in.in:
- Don't set empty default value on an int, this causes gconf warning.
- (bug #60859)
-
-2004-09-04 Not Zed <NotZed@Ximian.com>
-
- * util/e-destination.c: include gnome-i18n.h since camel-object no
- longer does(!).
-
-2004-07-02 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (command_state_changed): Set the source option menu sensitivity here.
-
-2004-06-30 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c
- (e_contact_editor_dispose): disconnect source/target_editable
- signal ids.
- (e_contact_editor_set_property): disconnect/connect editable
- signals.
- (writable_changed): new function - we need this since writable
- status is generally communicated asynchronously with the async
- interface.
-
- * gui/contact-editor/e-contact-editor.h (struct _EContactEditor):
- add source/target_editable_id slots.
-
-2004-06-29 Rodney Dawes <dobey@novell.com>
-
- * tools/Makefile.am (bin_PROGRAMS): Change to privlibexec_PROGRAMS
-
- Fixes #60832
-
-2004-06-28 Not Zed <NotZed@Ximian.com>
-
- * gui/component/addressbook-component.c
- (impl__get_userCreatableItems): fix shortcuts. #56746
-
-2004-06-25 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/meging/eab-contact-compare.[ch] (eab_contact_compare_file_as):
- Implement.
- (eab_contact_compare_name): Don't leak if only one of the strings is
- NULL.
- (use_common_book_cb): Include file_as in query.
-
-2004-06-25 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (fill_in_address_textview): Add
- a newline between street line and rest of extended address.
- (extract_address_textview): Omit the newline trailing the street line.
-
-2004-06-24 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (address_labels): Add table.
- (append_to_address_label): Implement.
- (set_address_label): Implement.
- (extract_address_record): Set the address label fields.
-
-2004-06-24 Hans Petter Jansson <hpj@ximian.com>
-
- * util/eab-book-util.c (eab_contact_list_from_string): Don't accept
- input that doesn't have at least a "BEGIN:VCARD" in it.
-
-2004-06-24 Radek Doulik <rodo@ximian.com>
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_get_textification): do not limit the text
- len to 2047 characters
-
- See bug #60366
-
-2004-06-23 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Set window to be invisible
- initially.
-
- * gui/contact-editor/e-contact-editor.c (e_contact_editor_init): Set
- the type hint to "normal", and show the window after init.
-
-2004-06-23 Not Zed <NotZed@Ximian.com>
-
- * gui/widgets/eab-gui-util.c
- (eab_send_contact_list_as_attachment): use memcpy not strcpy to
- copy to memory buffer. Fixes a UMW. See #60532.
-
-2004-06-23 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/addressbook-view.c: Add an x-source-vcard target entry
- that includes the source book URI.
- (destroy_merge_context): Implement.
- (removed_contact_cb): Implement.
- (merged_contact_cb): Implement.
- (selector_tree_drag_data_received): Get the source and target books,
- and see if we need to remove contacts from source after they're added
- to target. Copy contacts sequentially, not in parallel, with a
- callback.
-
- * gui/widgets/e-addressbook-view.c: Add an x-source-vcard target entry
- that includes the source book URI.
- (table_drag_data_delete): Remove. This is handled by the drag target.
- (table_drag_data_get): Handle more than one contact. Supply source.
- (create_table_view): Don't connect to the delete signal.
-
- * gui/widgets/e-minicard-view.c: Add an x-source-vcard target entry
- that includes the source book URI.
- (e_minicard_view_drag_data_delete): Remove. This is handled by the
- drag target.
- (e_minicard_view_drag_data_get): Handle x-source-vcard target.
- (e_minicard_view_drag_begin): Don't connect to the delete signal.
- (e_minicard_view_dispose): Don't disconnect from the delete signal.
- (e_minicard_view_init): Don't init delete_id.
-
- * gui/widgets/e-minicard-view.h: Remove delete_id from struct.
-
- * util/eab-book-util.[ch] (eab_contact_list_from_string): Skip the
- source URI if present.
- (eab_book_and_contact_list_from_string): Create the source book from
- the provided URI, if present.
- (eab_book_and_contact_list_to_string): Include the book URI in
- generated string.
-
-2004-06-23 Rodney Dawes <dobey@novell.com>
-
- * gui/component/select-names/select-names.glade:
- Move the search bar to the top and add a label _Search so that the
- entry has a mnemonic for keyboard accessibility
-
- Fixes #52914 and #58448
-
-2004-06-22 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Name the labels.
-
- * gui/contact-editor/e-contact-editor.c (sensitize_email_record)
- (sensitize_phone_record)
- (sensitize_im_record)
- (sensitize_address_textview)
- (sensitize_address_field)
- (simple_field_map)
- (sensitize_simple_field): Make entries uneditable and labels
- insensitive, if field is disabled or read-only.
-
-2004-06-22 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes #59622.
-
- * gui/widgets/e-minicard-view.c (e_minicard_view_init): Clear drag_list
- and canvas_drag_data_delete_id.
- (e_minicard_view_dispose): Clear drag_list. Disconnect drag_data_delete
- signal if connected.
- (e_minicard_view_drag_begin): Set up drag_data_delete signal if
- necessary. Clear old data before drag starts.
- (clear_drag_data): Implement.
- (e_minicard_view_drag_data_delete): Implement.
- (e_minicard_view_drag_data_get): Don't clear drag_list here.
-
-2004-06-22 Chris Toshok <toshok@ximian.com>
-
- [ should fix #60495, #58635 ]
- * gui/widgets/eab-popup-control.c (name_only_query_cb): don't free
- the list of contacts - libebook still owns it.
- (query_cb): same.
-
-2004-06-22 Larry Ewing <lewing@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c (add_email_cb):
- don't set the changed flag unless we actually add something.
-
-2004-06-21 Federico Mena Quintero <federico@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Make the scrolled
- windows around text views use GTK_SHADOW_IN, for consistency with
- the GtkEntries.
-
-2004-06-21 Chris Toshok <toshok@ximian.com>
-
- * gui/component/ldap-config.glade: remove the auth-entry-notebook
- in the edit dialog, and rename the auth entry to... auth-entry.
-
- * gui/component/addressbook-config.c (source_to_dialog_new): nuke
- - it's identical to source_to_dialog.
- (dialog_to_source): we only have one auth entry now. fill it in
- properly.
- (source_to_dialog): fill in the auth entry properly based on the
- auth type, and remove auth_entry_notebook references.
- (auth_optionmenu_activated): remove auth_entry_notebook
- references.
- (setup_general_tab): same, and use auth-entry instead of
- email-entry/dn-entry.
- (general_tab_check): use auth_principle instead of email/binddn.
- (add_folder_modify): same.
- (addressbook_add_server_dialog): put setup_connecting_tab inside
- the ifdef HAVE_LDAP, and call source_to_dialog instead of
- source_to_dialog_new.
- (addressbook_config_edit_source): always call setup_general_tab.
-
- * gui/component/addressbook-config.h (AddressbookLDAPScopeType):
- reorder to match order in option menu (we should really remove
- BASE altogether.. it's useless for searching.)
-
- * gui/component/addressbook-view.c (update_command_state):
- macroize this, annoying seeing the same 4 lines repeated 15 times.
-
-2004-06-21 Jeffrey Stedfast <fejj@novell.com>
-
- * conduit/address-conduit.c (local_record_from_uid): Make sure the
- UIDs match. Should fix bug #59725.
-
-2004-06-19 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/component/addressbook-config.c (dialog_to_source) :
- set auth-domain property on groupwise sources, so that
- newly created contact groups can share remembered passwords
-
-2004-06-18 Jeffrey Stedfast <fejj@novell.com>
-
- * conduit/address-conduit.c (ecard_from_remote_record): Always set
- the File_As attribute in case the pilot attrib changed. Fixes bug
- #59723.
-
-2004-06-18 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_load_contacts): only go through the process
- of creating/loading the EBook if the model has some data in it.
-
-2004-06-18 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #59376 ]
-
- * gui/component/addressbook-view.c (fill_popup_menu_callback):
- make this work with absolute uris in sources. Thanks to Sushma
- Rai for the initial patch to fix this.
-
-2004-06-17 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #58696 ]
-
- * gui/widgets/eab-gui-util.c (eab_transfer_contacts): use
- addressbook_load instead of e_book_async_open, so we do auth stuff
- for the destination book.
-
-2004-06-17 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (e_contact_editor_new):
- EBookFieldsCallback -> EBookEListCallback.
- (e_contact_editor_set_property): same.
-
-2004-06-17 Chris Toshok <toshok@ximian.com>
-
- * util/eab-book-util.c (eab_name_and_email_query):
- EBookContactsCallback -> EBookListCallback.
- (eab_nickname_query): same.
-
- * printing/e-contact-print.c: e-book-async.h -> e-book.h
-
- * gui/widgets/eab-vcard-control.c: e-book-async.h -> e-book.h.
-
- * gui/widgets/e-addressbook-model.h: e-book-async.h -> e-book.h.
-
- * gui/widgets/eab-popup-control.h: e-book-async.h -> e-book.h.
-
- * gui/widgets/eab-popup-control.c: remove e-book-async.h include.
-
- * gui/merging/eab-contact-merging.h: e-book-async.h -> e-book.h.
-
- * gui/contact-editor/e-contact-editor.h: e-book-async.h ->
- e-book.h.
-
- * gui/contact-editor/e-contact-editor.h: same.
-
- * gui/contact-list-editor/e-contact-list-editor.h: same.
-
- * gui/contact-list-editor/e-contact-list-model.h: remove include
- of e-book-async.h
-
- * gui/component/select-names/e-select-names-completion.h: include
- e-book.h, not e-book-async.h
-
- * gui/component/select-names/e-select-names-model.c: same.
-
- * gui/component/select-names/e-select-names.c: same.
-
- * gui/component/addressbook-migrate.c: include e-book.h, not
- e-book-async.h
-
- * gui/component/addressbook-view.c: same.
-
- * gui/component/addressbook.h: same.
-
- * gui/component/addressbook.c: remove include e-book-async.h.
-
-2004-06-17 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/widgets/e-addressbook-view.etspec : update
- the model column numbers as new fields like E_CONTACT_EMAIL_4
- are added to EContact
- Fixes #59621
-
-2004-06-16 Not Zed <NotZed@Ximian.com>
-
- * gui/component/autocompletion-config.c
- (autocompletion_config_control_new): set the source selector to be
- able to toggle the current selection. Fix for #55614.
-
-2004-06-16 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/contact-editor/e-contact-editor.c (full_name_clicked) :
- compare old and new full names and if it is different set the new
- the name using gtk_entry_set_text instead of set_entry_text
- as this function blocks siganls hence preventing ok button being
- enabled
-
-2004-06-14 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (extract_im_record): set
- things to HOME, since we don't offer TYPE=OTHER IM attributes
- through the EContact api, and one choice is just as good as
- another if we aren't displaying it anyway.
-
- * gui/widgets/eab-contact-display.c (render_contact): move the IM
- stuff out of home/work, since we don't allow people to edit
- location for them anymore. Also, change the IM accounts we look
- up to "HOME", since that's what we hardcode them to in the contact
- editor.
-
-2004-06-14 Not Zed <NotZed@Ximian.com>
-
- * importers/evolution-ldif-importer.c (parseLine): handle LIST
- field types.
- (ldif_fields[]): Add a list type. E_CONTACT_EMAIL is a list field
- type. See #58855.
-
-2004-06-08 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-model.c (get_view_idle): new
- function. do the get_view in an idle handler.
- (eab_model_set_property): don't call get_view directly from any
- setter block. instead just add the idle handler (if it's not
- already added.) This keeps us from duplicating queries when both
- "book" and "query" are set using the same g_object_set.
-
- * gui/widgets/e-addressbook-model.h: add book_view_idle_id.
-
-2004-06-07 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes #58921.
-
- * gui/contact-editor/e-contact-editor.c (extract_address_record):
- Also check if the po box field is non-empty.
-
-2004-06-07 Jon Oberheide <jon@focalhost.com>
-
- * gui/contact-list-editor/e-contact-list-model.c: disable editing
- of cells in the contact table.
-
-2004-06-07 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes #57795.
-
- * gui/component/addressbook-migrate.c (migrate_contacts): Change
- the "POSTAL" address in 1.4 to "OTHER" in 1.5.
-
-2004-06-07 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/Makefile.am (SUBDIRS): Fix order of dependencies.
-
-2004-06-07 H P Nadig <hpnadig@pacific.net.in>
-
- * gui/contact-list-editor/e-contact-list-editor.h: Added few
- headers needed for select names dialog.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (e_contact_list_editor_init): Added select button handler.
- (select_cb): The callback function for Select Button.
- (setup_corba): To setup corba for select names dialog.
- (select_names_ok_cb): Handle Select names dialog entries.
- (add_to_model): Adds cards to the model.
-
- * gui/contact-list-editor/contact-list-editor.glade: New 'Select'
- Button. Tooltips added for buttons in button Box.
-
-2004-06-07 Dan Winship <danw@novell.com>
-
- * gui/component/addressbook-view.c: s/stock_save_as/stock_save-as/
-
-2004-06-04 Larry Ewing <lewing@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c: remove bonobo
- menus and cruft add ok/cancel buttons.
-
- * gui/contact-list-editor/e-contact-list-editor.h: add buttons for
- ok/cancel.
-
- * gui/contact-list-editor/contact-list-editor.glade: add fields for
- ok/cancel reparent to GtkDialog, other minor adjustments.
-
-2004-06-04 JP Rosevear <jpr@novell.com>
-
- Fixes #55945
-
- * importers/*.server.in.in: ditto
-
- * importers/evolution-ldif-importer.c: fix OAFIIDs
-
- * importers/evolution-vcard-importer.c: ditto
-
-2004-06-04 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-model.c
- (name_and_email_simple_query_cb): only resolve destinations
- against persons, not contact lists.
-
-2004-06-03 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes #53643 and #26903.
-
- * gui/search/addresstypes.xml: category -> category_list
-
- * gui/search/e-addressbook-search-dialog.c (get_widget): Get
- filter rule from parent view.
- (eab_search_dialog_set_property): Implement.
- (eab_search_dialog_get_property): Impleent.
- (eab_search_dialog_class_init): Set up property methods.
- (get_query): Get filter rule from parent view.
- (eab_search_dialog_init): Don't get the filter widget here,
- wait until parent view property is set.
- (eab_search_dialog_new): Don't poke the parent view in, set it
- as a property instead.
- (eab_search_dialog_dispose): No longer needs to unref rule.
-
- * gui/search/e-addressbook-search-dialog.c: EABSearchDialog no
- longer needs to keep rule internally.
-
- * gui/widgets/Makefile.am: Set SEARCH_RULE_DIR define.
-
- * gui/widgets/e-addressbook-view.c (eab_view_new): Set up filter
- rule and context.
- (eab_view_peek_search_context): Implement.
- (eab_view_peek_search_rule): Implement.
-
- * gui/widgets/e-addressbook-view.h: Keep track of filter rule
- and context. Add protos for added API.
-
-2004-06-03 Jeffrey Stedfast <fejj@novell.com>
-
- * conduit/address-conduit.c (set_status_cleared): Protect against
- a NULL uid. Fixes bug #57619.
- (ecard_from_remote_record): Set the full_name of the contact so
- that we can use that as the FILE_AS rather than the company name,
- which sucked. Fixes a bug I may or may not have reported months
- ago. Ahah, fixes bug #57620.
-
-2004-06-02 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/addressbook-migrate.c
- (migrate_contact_folder_to_source): Add missing negation that caused
- a crash.
-
-2004-06-02 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-migrate.c (addressbook_migrate):
- remove hidden field migration, and add in a phase to clear the
- absolute_uri properties on ESources.
-
-2004-06-02 Rodney Dawes <dobey@novell.com>
-
- * gui/component/addressbook-config.c (focus_help, add_focus_handler):
- Don't need these two functions any more
- (source_to_dialog, auth_optionmenu_func):
- Don't try to change the notebook page or set the widget sensitive,
- for a notebook that doesn't exist any more
- (reparent_to_vbox): Don't need this function any more, as the
- widgets are all contained in the same dialog in the glade now
- (setup_general_tab, setup_connecting_tab, setup_searching_tab):
- We don't need to do the focus-based "tooltip" stuff any more
- We just use tooltips on the widgets now
- (ssl_optionmenu_selected, add_ssl_activate_cb):
- We don't need the ssl_optionmenu_selected callback any more, as the
- tooltips are just set on the necessary widgets now
- (query_for_supported_bases): Set the border widths on the dialog's
- vbox and action_area to be compliant with the HIG
- (addressbook_add_server_dialog): Unref the GConfClient object
- (addressbook_config_edit_source): Create the source_list so that
- we can actually save the changes that we make here
- Create the GladeXML with only the widget subtree that we need to
- use here, to avoid popping up other visible dialogs
- Set the border widths on the dialog's vbox and action_area to be
- compliant with the HIG
- We don't need to reparent widgets to vboxes any more, as the widgets
- are now part of the dialog's widget tree
- If we are without LDAP or not in LDAP mode, then hide the notebook
- borders, and change the border size of its child to appear as though
- we are a normal non-LDAP dialog
- We don't need to set the type hint on the window as we are no a
- real GtkDialog
-
- * gui/component/ldap-config.glade: Update the properties dialogs to
- be compliant with the HIG layout
- Get rid of some of the extra windows and put their children in the
- appropriate places in the properties dialog
- Make the properties dialog be a real GtkDialog
-
- Fixes #41141
-
-2004-06-01 Larry Ewing <lewing@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c: Add in a source
- option menu to the dialog and make is sensitive only on new lists.
-
- * gui/contact-list-editor/e-contact-list-editor.h: add load_book
- fields for async book loading.
-
- * gui/contact-list-editor/contact-list-editor.glade: add the new
- source selector in a table reorder some of the other widgets.
-
-2004-05-28 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/eab-contact-display.c (render_contact): render all
- email addresses, not just the first 3.
- (eab_contact_display_class_init): use a C comment, not C++.
-
-2004-05-28 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_set_property_fn): call e_select_names_model_load_contacts
- after setting text/addresses/destinations.
-
- * gui/component/select-names/e-select-names-model.c
- (name_and_email_simple_query_cb): new function, ripped from the
- 1.4 e-destination stuff.
- (book_opened): new function, fire off eab_name_and_email_query for
- each item in our model (that doesn't represent a contact already).
- (e_select_names_model_load_contacts): new function, open the
- default addressbook (yeah yeah, i know we should open something
- different/more.)
- (e_select_names_cancel_contacts_load): new (unimplemented, and how
- do we implement it?) function.
-
- * gui/component/select-names/e-select-names-model.h: add
- prototypes for e_select_names_model_load_contacts and
- e_select_names_cancel_contacts_load.
-
- * gui/component/select-names/e-select-names.c (set_book): call
- get_query_string and set the book and query in a single call to
- g_object_set, just because we can/should.
- (update_query): reimplement in terms of get_query_string.
- (get_query_string): new function, build up the query string.
-
- * gui/component/select-names/Makefile.am (INCLUDES): add
- $(top_srcdir)/addressbook/util to INCLUDES.
-
-2004-05-28 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Add back office, spouse,
- web log fields. Allow for 8 phone numbers, of which 4 can be hidden.
-
- * gui/contact-editor/e-contact-editor.c (phones_default): Add more
- defaults.
- (im_service_default): Add more defaults.
- (expand_phone): Implement.
- (fill_in_phone_record): Expand if we have any records past 4.
- (init_im_record_location)
- (fill_in_im_record)
- (extract_im_record)
- (sensitize_im_record): Remove location.
- (simple_field_map): Add spouse, office, web log.
- (expand_phone_toggle): Implement.
- (e_contact_editor_init): Hook up expander button.
-
-2004-05-28 Christophe Fergeau <teuf@gnome.org>
-
- * gui/component/addressbook-config.c: added missing #ifdef HAVE_LDAP
-
-2004-05-26 Radek Doulik <rodo@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (e_contact_print_button): call
- gnome_print_beginpage
- (e_contact_print_button): call gnome_print_beginpage
-
- Fixes #58977
-
-2004-05-25 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_activate_obj): reenable this function,
- in a slightly broken manner. we don't have e_contact_get_book
- anymore (well, we never had it really... but we lost
- e_card_get_book). load the system addressbook and supply that to
- the editors. shouldn't be a problem, since it's a read-only
- editor anyway.
-
-2004-05-25 Chris Toshok <toshok@ximian.com>
-
- [ fixes #58654 ]
-
- * gui/component/select-names/e-select-names.c (update_query):
- build up the query using e_book_query calls so we're insulated
- from field name changes. also, conjoin if we have more than 1
- query element, not more than 2 (i *hope* this was an off by 1
- error...)
-
-2004-05-25 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/component/addressbook.c (load_source_auth_cb )
- (load_source_auth_cb ) : read the "auth-domain" property
- from e-source and use it as the component name for e_password_*
- calls if it exists
-
-2004-05-25 Jeffrey Stedfast <fejj@novell.com>
-
- * Makefile.am: Generate the addressbook-errors.xml.h file and
- install the xml file and all that jazz.
-
- * addressbook-errors.xml: New error xml file.
-
- * gui/widgets/e-addressbook-view.c (backend_died): Use
- e_error_run().
-
- * gui/widgets/eab-gui-util.c (eab_error_dialog): Use
- e_error_run().
- (eab_load_error_dialog): Same.
- (eab_search_result_dialog): Same.
- (eab_prompt_save_dialog): Same.
- (save_it): Same.
-
- * gui/contact-editor/e-contact-editor.c (categories_clicked): Use
- e_error_run().
- (e_contact_editor_is_valid): Same.
- (save_contact): Same.
-
- * gui/component/addressbook-view.c (delete_addressbook_cb): Use
- e_error_run().
-
- * gui/component/addressbook-config.c (addressbook_ldap_init): Use
- e_error_run().
- (addressbook_ldap_auth): Same.
- (addressbook_root_dse_query): Same.
- (do_ldap_root_dse_query): Same.
- (do_schema_query): Same.
-
-2004-05-24 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am (SUBDIRS): add tools back to the build.
-
-2004-05-24 Chris Toshok <toshok@ximian.com>
-
- * tools/Makefile.am: fix this for current build foo.
-
- * tools/evolution-addressbook-export-list-folders.c,
- * tools/evolution-addressbook-export-list-cards.c,
- * tools/evolution-addressbook-export.c: revive this.
-
-2004-05-24 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #32194 ]
-
- * importers/evolution-vcard-importer.c (process_item_fn): make
- sure all ADR attributes have HOME/WORK/OTHER.
-
-2004-05-24 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #40013 ]
-
- * importers/evolution-vcard-importer.c (process_item_fn): for TEL
- attribute that don't specify a location (HOME/WORK/OTHER), default
- to "OTHER". For TEL attributes that *only* specify a location,
- default to "VOICE".
-
-2004-05-21 H P Nadig <hpnadig@pacific.net.in>
-
- Fixes #58516.
-
- * gui/contact-editor/contact-editor.glade: 'Job Title' is now called
- 'Title'.
-
-2004-05-20 Hans Petter Jansson <hpj@ximian.com>
-
- * importers/evolution-ldif-importer.c (add_to_notes): Add helper
- func.
- (process_item_fn): Add undisplayed fields to notes.
-
- * importers/evolution-vcard-importer.c (add_to_notes): Add helper
- func.
- (process_item_fn): Add undisplayed fields to notes.
-
-2004-05-20 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/addressbook-migrate.c (add_to_notes): Implement.
- (migrate_contacts_hidden_fields): Implement.
- (migrate_contacts): Copy fields that are now hidden in the UI,
- to the notes field.
-
-2004-05-20 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c (impl_requestCreateItem):
- use the new ebook api here. missed this one in my earlier commit.
-
-2004-05-20 Radek Doulik <rodo@ximian.com>
-
- * printing/e-contact-print.c (complete_sequence): finish pages
- printing by gnome_print_job_close call before showing preview or
- calling gnome_print_job_print
-
- See #54482
-
- * gui/widgets/e-addressbook-view.c (eab_view_print_preview): added
- call to begin page, ref printable and sink it to avoid finalizing of
- floating object
- (eab_view_print): ref and sink printable to avoid finalizing of
- floating object
-
- Fixes #46658
-
-2004-05-19 Chris Toshok <toshok@ximian.com>
-
- * importers/evolution-vcard-importer.c (load_file_fn): use the new
- e_book_new and e_book_open apis.
-
- * importers/evolution-ldif-importer.c (load_file_fn): use the new
- e_book_new and e_book_open apis.
-
- * gui/widgets/eab-gui-util.c (eab_transfer_contacts): use the new
- e_book_new and e_book_async_open apis.
-
- * gui/contact-editor/e-contact-editor.c (cancel_load):
- addressbook_load_source_cancel -> addressbook_load_cancel.
- (source_selected): use the new e_book_new and addressbook_load.
-
- * gui/component/select-names/e-select-names.c
- (addressbook_model_set_source): use the new e_book_new and
- addressbook_load.
-
- * gui/component/select-names/e-select-names-manager.c
- (update_completion_books): use the new e_book_new and
- addressbook_load.
-
- * gui/component/addressbook.h: rename
- addressbook_load_source{_cancel} to addressbook_load{_cancel}, and
- remove the source arg.
-
- * gui/component/addressbook.c (addressbook_load): rename since we
- aren't passing a source anymore.
- (addressbook_load_cancel): same.
- (addressbook_load_default_book): use the new e_book_new_* apis.
-
- * gui/component/addressbook-view.c (delete_addressbook_cb): just
- use e_book_new, not e_book_load_source.
- (selector_tree_drag_data_received): switch to new
- e_book_new_*/e_book_open apis.
- (activate_source): same, and addressbook_load_source ->
- addressbook_load.
-
- * gui/component/addressbook-migrate.c
- (migrate_contact_folder_to_source): switch to new
- e_book_new_*/e_book_open apis.
- (migrate_contact_lists_for_local_folders): same.
- (migrate_company_phone_for_local_folders): same.
-
- * conduit/address-conduit.c (pre_sync): switch to new
- e_book_new_*/e_book_open apis.
-
-2004-05-19 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (sensitize_email): Check
- if individual email fields are supported.
-
-2004-05-19 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (extract_simple_field):
- Remove debug output.
- (real_save_contact): Separate out actual save logic from
- save_contact ().
- (save_contact): If the user wants to move the contact from one
- address book to another, but the source is read-only, as to
- save a copy instead.
- (e_contact_editor_is_valid): The dialog should be an error dialog.
- (app_delete_event_cb): If the target book is read-only, prompt
- to discard. If the user wants to move but cannot, prompt to save
- a copy. Also validate.
-
- * gui/contact-editor/eab-editor.c (eab_editor_prompt_to_save_changes):
- Remove comment about invalid data dialog, it's not handled here
- anymore.
-
-2004-05-19 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes a number of bugs, adds some unimplemented functionality, and
- makes code more structured.
-
- * gui/contact-editor/e-contact-editor.h: Eliminate company,
- fullname_editable, address_editable fields from EContactEditor.
-
- * gui/contact-editor/e-contact-editor.c
- (enable_writable_fields): Removed.
- (set_editable): Removed.
- (fill_in_info): Removed.
- (extract_field): Removed.
- (extract_info): Removed.
- (set_fields): Removed.
- (command_state_changed): Removed.
- (widget_changed): Removed.
- (enable_widget): Removed.
- (nonempty): Invert and rename to STRING_IS_EMPTY().
- (STRING_MAKE_NON_NULL): Impl.
- (is_field_supported): Implement.
- (file_as_get_style): Eliminate editor->company.
- (file_as_set_style): Ditto. Also don't set empty fields in combo.
- (update_file_as_combo): Implement.
- (sensitize_ok): Implement.
- (object_changed): Implement.
- (image_chooser_changed): Don't call widget_changed() from here.
- (set_option_menu_history): Implement.
- (init_email_record_location): Hook up signals after init.
- (init_phone_record_type): Ditto.
- (init_im_record_location): Ditto.
- (init_im_record_service): Ditto.
- (init_address_textview): widget_changed -> object_changed
- (init_address_field): Ditto.
- (fill_in_email_record): Use set_option_menu_history(), blocking
- signals.
- (fill_in_im_record): Ditto.
- (fill_in_address_field): Use set_entry_text(), blocking signals.
- (alloc_ui_slot): nonempty -> STRING_IS_EMPTY
- (extract_email): Ditto.
- (fill_in_phone_record): Ditto.
- (extract_im): Ditto.
- (extract_address_record): Ditto.
- (sensitize_email_record): Implement.
- (sensitize_email): Implement.
- (sensitize_phone_types): Implement.
- (sensitize_phone_record): Impleent.
- (sensitize_phone): Implement.
- (sensitize_im_record): Implement.
- (sensitize_im): Implement.
- (sensitize_address_textview): Implement.
- (sensitize_address_field): Implement.
- (sensitize_address_record): Implement.
- (sensitize_address): Implement.
- (simple_field_map): Add all simple fields/widgets to a table with
- attributes saying how to handle sensitivity and data transfer.
- (init_simple_field): Implement.
- (fill_in_simple_field): Implement.
- (extract_simple_field): Implement.
- (sensitize_simple_field): Implement.
- (init_simple): Implement.
- (fill_in_simple): Implement.
- (extract_simple): Implement.
- (sensitize_simple): Implement.
- (fill_in_all): Implement.
- (extract_all): Implement.
- (sensitize_all): Implement.
- (set_entry_changed_signal_field): Removed.
- (set_urlentry_changed_signal_field): Removed.
- (set_entry_activate_signal_field): Removed.
- (new_target_cb): Don't signal changes.
- (set_entry_activate_signals): Removed.
- (set_entry_changed_signals): Removed.
- (full_name_clicked): Honor field_supported and target_editable.
- Use set_entry_text() and block changed signals.
- (image_selected_cb): widget_changed -> object_changed. Don't clear
- pointer to file_selector.
- (image_cleared_cb): Ditto.
- (contact_moved_cb): command_state_chaned() -> sensitize_all().
- (contact_added_cb): Ditto.
- (supported_fields_cb): Ditto.
- (contact_modified_cb): Ditto.
- (save_contact): extract_info() -> extract_all().
- (e_contact_editor_is_valid): Be more verbose. Make sure File As is
- non-empty.
- (e_contact_editor_init): Call init_all() in place of lots of setup
- calls. Remove reference to editor->company.
- (e_contact_editor_dispose): Remove reference to editor->company.
- (command_state_changed): Removed.
- (e_contact_editor_set_property): Axe unneeded complexity, now that
- we have sensitize_all() and sensitize_ok().
- (set_fields): Removed.
- (fill_in_field): Removed.
- (field_mapping): Removed.
- (disable_widget_foreach): Removed.
- (widget_field_mapping): Removed.
- (num_widget_field_mappings): Removed.
- (enable_widget): Removed.
-
-2004-05-05 William Jon McCann <mccann@jhu.edu>
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in:
- Add menu_label and menu_accelerator.
-
-2004-05-18 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (file_send_as_cb): pass 0 to eab_send_contact.
- (file_send_to_cb): same.
-
-2004-05-18 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/eab-gui-util.c
- (eab_send_to_contact_and_email_num_list): split out the
- DISPOSITION_AS_TO stuff here, and make it take a GList of
- ContactAndEmailNum, so we can set it for the single contact case.
- (eab_send_contact_list_as_attachment): split out the
- DISPOSITION_AS_ATTACHMENT stuff here.
- (eab_send_contact_list): call one or the other of the above,
- munging the list if disposition is set to TO.
- (eab_send_contact): call eab_send_to_contact_and_email_num_list
- directly with the supplied email_num, instead of calling
- eab_send_contact_list.
-
- * gui/widgets/eab-gui-util.h (eab_send_contact) add "email_num"
- arg, so we can specify the email address we want to be selected.
-
- * gui/widgets/eab-contact-display.c (on_link_clicked): add
- (ifdefed out at the moment) code to handle mailto: urls
- internally, instead of farming them out to gnome_url_show.
- (render_contact): same.
-
-2004-05-18 Jerome Lacoste <jerome@coffeebreaks.org>
-
- Fixes #57940
-
- * gui/widgets/e-addressbook-view.c: "Save as VCard" ->
- "Save as VCard..."
-
-2004-05-17 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (e_contact_editor_init):
- Hook up image button.
- (e_contact_editor_dispose): Dispose of file selector if it's around.
- (image_clicked): Implement.
- (file_selector_deleted): Implement.
- (image_cleared_cb): Implement.
- (image_selected_cb): Implement.
-
- * gui/contact-editor/contact-editor.glade: Make the contact image
- be a button that lets you change or discard the image.
-
-2004-05-17 Jeffrey Stedfast <fejj@novell.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c: Change E_PIXMAP
- size args over to E_ICON_SIZE_* values.
-
- * gui/component/addressbook-view.c: Change E_PIXMAP size args over
- to E_ICON_SIZE_* values.
-
- * gui/widgets/e-minicard.c (e_minicard_init): Use an E_ICON_SIZE
- enum value for the icon_size argument to get_icon.
-
- * gui/widgets/eab-gui-util.c (eab_create_image_chooser_widget):
- Use E_ICON_SIZE_DIALOG as the icon_size argument to
- get_icon_filename.
-
- * gui/widgets/eab-contact-display.c (on_url_requested): Use an
- E_ICON_SIZE enum as the icon_size argument to get_icon_filename.
-
- * gui/contact-editor/e-contact-editor-im.c
- (setup_service_optmenu): Use E_ICON_SIZE_MENU here.
-
- * gui/component/select-names/e-select-names-popup.c
- (populate_popup_contact): Use E_ICON_SIZE_MENU here instead of 16.
-
- * gui/component/addressbook-view.c (set_status_message): Use the
- E_ICON_SIZE corresponding to 16x16 pixels.
-
-2004-05-12 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Add PO box entries.
-
- * gui/contact-editor/e-contact-editor.c (init_address_record): Hook
- up PO box entry.
- (fill_in_address_record): Ditto.
- (extract_address_record): Ditto.
-
-2004-04-18 S N Tejasvi <tejasvi_sn@gawab.com>
-
- Fixes bug #55208.
-
- * gui/contact-editor/e-contact-editor.c (save_contact):
- Do e_contact_editor_is_valid check to check the birth date and
- anniversary date format when user wants to save and warn him.
-
-2004-05-11 Not Zed <NotZed@Ximian.com>
-
- * gui/component/addressbook-component.c (impl_upgradeFromVersion):
- set exception properly on failure.
-
- * gui/component/addressbook-migrate.c (addressbook_migrate): take
- a GError error return. Doesn't do anything with it ... but ...
-
-2004-05-11 Dan Winship <danw@ximian.com>
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in: Remove
- the addressbook control
-
- * gui/component/component-factory.c (factory): Remove support for
- the addressbook control
-
- * gui/component/addressbook-view.c: Remove all the property-bag
- stuff.
-
-2004-05-11 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/component/addressbook-config.c (dialog_to_source) : see if the selected
- group is groupwise one and setup the relative uri and other properties into
- e-source
-
-2004-05-10 Suresh Chandrasekharan <suresh.chandrasekharan@sun.com>
-
- Fixes bug #44196 addressbook table view uses ASCII sort
-
- * addressbook/gui/widgets/e-addressbook-view.c (compare_subitems):
- Uses g_utf8_collate for right UTF8 sort. Made faster using
- g_utf8_collate_key.
-
- Also fixes a bug in
-
- * gui/component/select-names/e-select-names.c (select_entry_changed):
- Changed g_utf8_collate for strcmp as we are already comparing keys
- made from g_utf8_collate_key.
-
-2004-05-08 Enver ALTIN <enver.altin@frontsite.com.tr>
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in:
- Fix parts of #53466.
-
-2004-05-05 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (init_address_textview):
- Implement.
- (init_address_record): Init textview.
- (fill_in_address_textview): Implement.
- (fill_in_address_record): Fill in textview.
- (extract_address_textview): Implement.
- (extract_address_record): Extract from textview.
-
- * gui/contact-editor/contact-editor.glade: Combine address-[12] fields
- into one multiline text view, as per Anna's new design.
-
-2004-05-04 Larry Ewing <lewing@ximian.com>
-
- * gui/component/addressbook-config.c (query_for_supported_bases):
- fixup the dialog initialization.
-
-2004-05-04 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (phones_default): Use defaults
- from Anna.
- (im_service_default): Ditto.
- (email_default): Ditto.
- (im_location): Renamed to common_location, as it's used by both IM
- and e-mail.
- (init_email_record_location): im_location -> common_location
- (init_im_record_location): Ditto.
- (email_index_to_location): Ditto.
- (im_index_to_location): Ditto.
- (get_email_location): Ditto.
- (get_im_location): Ditto.
- (fill_in_email_record): Consult defaults.
- (fill_in_im_record): Ditto.
-
-2004-05-04 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (set_entry_activate_signals):
- Remove blog, add home page.
- (set_entry_changed_signals): Ditto.
- (setup_tab_order): Ditto.
- (field_mapping): Ditto.
- (widget_field_mappings): Ditto.
-
- * gui/contact-editor/contact-editor.glade: Replace blog with home
- page.
-
-2004-05-03 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/widgets/e-minicard.c (e_minicard_set_property): Do ref, unref
- in right order, so the same contact can be set twice without ill
- effects.
- (e_minicard_finalize): NULL pointers after unreffing their objects.
-
-2004-05-03 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (phones_default): Establish
- defaults for the phone number option menus.
- (fill_in_phone_record): Fall back to defaults.
-
-2004-05-03 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (show_help_cb): Implement.
- (e_contact_editor_init): Hook up the help button.
-
- * gui/contact-editor/contact-editor.glade: Give the help button a
- sensible name.
-
-2004-05-03 Larry Ewing <lewing@ximian.com>
-
- * gui/component/ldap-config.glade: bump the maximum download limit
- to 1000.
-
- * gui/component/addressbook-config.c (add_folder_modify): set the
- email entry sesitive only when anonymous isn't selected. Make the
- details tab insensitive if the method is local.
-
- * gui/component/ldap-config.glade: remove unused colorpicker.
-
-2004-05-03 JP Rosevear <jpr@ximian.com>
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in: set the
- config item type
-
-2004-05-02 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/component/addressbook-config.c (dialog_to_source) : see if the selected
- group is groupwise one and setup the relative uri and other properties into
- e-source
-
-2004-05-01 Larry Ewing <lewing@ximian.com>
-
- * gui/component/addressbook-config.c: sensitize the details dialog
- where appropriate. Don't try to read from widgets that don't
- exist.
-
-2004-04-30 Chris Toshok <toshok@ximian.com>
-
- * util/e-destination.c (e_destination_set_contact): don't use
- "email" twice for a variable name.. even though they don't really
- conflict, it's ugly and confusing.
-
-2004-04-30 Enver ALTIN <enver.altin@frontsite.com.tr>
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in: Fixed a
- type-o.
-
-2004-04-29 Hans Petter Jansson <hpj@ximian.com>
-
- * printing/e-contact-print.c: Don't dereference the file_as pointer
- if it turns out to be NULL.
-
-2004-04-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/component/addressbook-migrate.c: We need a migration dialog
- if the revision <= 10. Fixes bug #57770.
-
-2004-04-27 Larry Ewing <lewing@ximian.com>
-
- * gui/component/addressbook-config.c: remove debug spew.
-
-2004-04-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/component/addressbook-migrate.c (addressbook_migrate):
- Migrate pilot data.
- (migrate_pilot_data): Oops. Apparently the addressbook didn't
- change the format of the changelog file from db3 to xml, so fix to
- simply copy the file over.
-
-2004-04-27 Rodney Dawes <dobey@ximian.com>
-
- * gui/contact-editor/e-contact-editor-fullname.c:
- (e_contact_editor_fullname_init):
- * gui/contact-editor/fullname.glade:
- * gui/search/e-addressbook-search-dialog.c (eab_search_dialog_init):
- Update dialog vbox and action area border widths to be HIG compliant
- Update main child widget border widths to be HIG compliant
-
-2004-04-27 Larry Ewing <lewing@ximian.com>
-
- * gui/component/addressbook-config.c (source_to_dialog_new): fix
- warnings, remove unused code.
-
- * gui/component/addressbook-config.c: start integrate the new
- dialog.
-
- * gui/component/ldap-config.glade: add the new dialog.
-
-2004-04-26 Rodney Dawes <dobey@ximian.com>
-
- * gui/contact-editor/contact-editor.glade:
- * gui/contact-editor/e-contact-editor.c (e_contact_editor_init):
- Set spacing around notebook widget and the dialog's action area and
- vbox widgets to be compliant with the HIG dialog specs
-
-2004-04-25 Chris Toshok <toshok@ximian.com>
-
- * importers/evolution-ldif-importer.c (ldif_fields): add "mobile"
- mapping to E_CONTACT_PHONE_MOBILE, which is what thunderbird uses
- (and really what we should have always been using.)
-
-2004-04-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * conduit/address-conduit.c (get_next_mail): The firt EMAIL item
- is EMAIL_1, not EMAIL (assuming we want simple strings).
- (local_record_from_ecard): Use e_contact_get() for getting the
- EContactAddress. Loop from FIRST_ADDRESS_ID up to and *including*
- LAST_ADDRESS_ID.
- (ecard_from_remote_record): When searching for an address field,
- loop from FIRST_ADDRESS_ID up to and *including* LAST_ADDRESS_ID.
- (pre_sync): Use e_book_query_any_field_contains() rather than
- e_book_query_from_string ("#t") which doesn't work anyway.
-
-2004-04-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * conduit/address-conduit.c (map_name): Updated to use
- ~/.evolution as the evolution directory rather than ~/evolution.
-
-2004-04-23 Dan Winship <danw@ximian.com>
-
- * gui/component/component-factory.c (factory): Fix the addressbook
- control to not crash. (Temporary fix.)
-
-2004-04-23 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/eab-gui-util.c (added_cb): this signal takes an
- EContact* too.
- (modified_cb): same.
- (deleted_cb): same.
- (eab_error_dialog): pad the table of status messages out with the
- new status codes, and don't specify gui text for messages that
- aren't generated by the backends. This fixes the "U" error
- messages people were seeing.
-
-2004-04-22 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Correct the dialog's title.
-
- * gui/contact-editor/e-contact-editor.c (init_email_record_location):
- Connect to entry's activate signal.
- (init_phone_record_type): Ditto.
- (init_im_record_location): Ditto.
- (init_address_field): Ditto.
- (set_entry_changed_signal_field): Remove unnecessary checks.
- (set_urlentry_changed_signal_field): Ditto.
- (set_entry_changed_signals): Ditto.
- (set_entry_activate_signal_field): Implement.
- (set_urlentry_activate_signal_field): Implement.
- (set_entry_activate_signals): Implement.
- (e_contact_editor_init): Call set_entry_activate_signals ().
-
-2004-04-22 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (e_contact_editor_class_init):
- Override the save_contact function.
- (e_contact_editor_save_contact): Implement.
- (e_contact_editor_init): Remove some unnecessary checks - if
- something's the matter with the UI files, that needs to be warned
- about and fixed, not silently worked around.
-
-2004-04-22 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Make the window be a
- GtkDialog.
-
-2004-04-21 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (free_attr_list): Implement.
- (extract_email): Preserve offscreen addresses.
- (extract_phone): Preserve offscreen phone numbers.
- (extract_im): Preserve offscreen IM accounts.
-
-2004-04-21 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c: Add defines for the slot
- counts for email, phone, im, address.
- (phones): Add E_CONTACT_PHONE_COMPANY back in, now that we can
- differentiate it.
- (init_email): Use EMAIL_SLOTS and a loop.
- (init_im): Ditto for IM_SLOTS.
- (init_phone): Ditto for PHONE_SLOTS.
- (fill_in_address)
- (extract_address)
- (init_address): Ditto for ADDRESS_SLOTS.
- (get_ui_slot_param): Implement.
- (get_ui_slot): Implement.
- (set_ui_slot): Implement.
- (alloc_ui_slot): Implement.
- (fill_in_email): Add code to preserve spatial organization.
- (extract_email): Ditto.
- (fill_in_phone): Ditto.
- (extract_phone): Ditto.
- (fill_in_im): Ditto.
- (exctract_im): Ditto.
-
-2004-04-21 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-migrate.c (setup_progress_dialog):
- store off the label as well as the folder name label, so we can
- reuse the dialog and update the label. Also, no longer take the
- string to display here.
- (dialog_set_label): new function.
- (migrate_contact_lists_for_local_folders): call
- dialog_set_folder_name here so we can see the folder being
- migrated.
- (migrate_company_phone_for_local_folders): new function for
- updating the way we store company phone numbers.
- (addressbook_migrate): split out the logic for setting up/tearing
- down the dialog from the individual migration points so we can
- reuse the same dialog and not have get destroyed/recreated for
- each stage. Also add a new migration point ( <= 1.5.8) for
- migrating the company phone numbers.
-
-2004-04-21 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/component/addressbook.c (remove_parameters_from_uri) : added
- a new function to striff off any parameters present after ';' in
- the uri
- (load_source_auth_cb) (addressbook_authenticate) : call above
- function to remove anything after ';' before passing uri to
- e-password calls
-
-2004-04-21 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.h (EContactEditor): Remove
- unused fields.
-
- * gui/contact-editor/e-contact-editor.c (emails): Remove.
- (e_contact_editor_init): Don't init unused fields.
- (e_contact_editor_dispose): Don't free/clear unused fields.
- (enable_writable_fields): Don't use email_choice anymore. Enable
- checkbutton-htmlmail only once.
-
-2004-04-21 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Make the phone type
- selectors be option menus.
-
- * gui/contact-editor/e-contact-editor.c (phones): Store the phone
- param mappings locally.
- (set_entry_changed_signals): Don't special-case phone entries here.
- (enable_writable_fields): Don't mess with the phone widgets anymore.
- (set_fields): Use fill_in_phone ().
- (extract_info): Use extract_phone ().
- (phone_index_to_type): Implement.
- (get_phone_type): Implement.
- (get_attributes_named): Implement.
- (set_attributes_named): Implement.
- (fill_in_phone_record): Implement.
- (extract_phone_record): Implement.
- (fill_in_phone): Implement.
- (extract_phone): Implement.
- (init_phone_record_type): Implement.
- (init_phone): Implement.
- (connect_arrow_button_signal): Remove.
- (connect_arrow_button_signals): Remove.
- (phone_entry_changed): Remove.
- (set_entry_changed_signal_phone): Remove.
- (_arrow_pressed): Remove.
- (_phone_arrow_pressed): Remove.
- (e_contact_editor_build_ui_info): Remove.
- (e_contact_editor_build_phone_ui): Remove.
- (set_phone_field): Remove.
-
-2004-04-21 Not Zed <NotZed@Ximian.com>
-
- * gui/component/addressbook-view.c (addressbook_view_init): fix
- for e_user_creatable_items handle api changes.
-
-2004-04-20 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-view.etspec: use cursor-mode="line" to
- get rid of the annoying cell cursor.
-
- * gui/widgets/eab-gui-util.c (eab_create_image_chooser_widget):
- create the image chooser even if we aren't given an initial
- filename.
-
- * gui/contact-editor/e-contact-editor.c (new_target_cb):
- addressbook_show_load_error_dialog -> eab_load_error_dialog.
-
-2004-04-19 Rodney Dawes <dobey@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Set the default image for
- the contact photo to be the stock_person image in the icon theme
-
-2004-04-19 Michael Terry <mike@mterry.name>
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in:
- * gui/component/addressbook-component.c:
- * gui/component/addressbook-view.c:
- * gui/component/select-names/e-select-names-popup.c:
- * gui/contact-editor/e-contact-editor-address.c:
- * gui/contact-editor/e-contact-editor-fullname.c:
- * gui/contact-editor/e-contact-editor-im.c:
- * gui/contact-list-editor/contact-list-editor.glade:
- * gui/contact-list-editor/e-contact-list-editor.c:
- * gui/merging/eab-contact-commit-duplicate-detected.glade:
- * gui/merging/eab-contact-duplicate-detected.glade:
- * gui/widgets/e-minicard.c:
- * gui/widgets/eab-contact-display.c:
- * gui/widgets/eab-gui-util.c: Update the addressbook to use the icon
- theme via the EIconFactory object in e-util
-
-2004-04-18 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (nonempty): new macro.
- (extract_email): only create/add the attribute if the email
- address is nonempty.
- (extract_im): same, but for im accounts.
- (extract_address_record): same, but for addresses.
-
-2004-04-16 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Add "wants HTML" checkbox.
-
- * gui/contact-editor/contact-editor.c (email_location_to_index)
- (email_entry_changed)
- (set_entry_changed_signal_email)
- (file_save_cb)
- (file_close_cb)
- (file_save_as_cb)
- (file_send_as_cb)
- (file_send_to_cb)
- (contact_deleted_cb)
- (delete_cb)
- (print_cb)
- (print_envelope_cb)
- (tb_save_and_close_cb)
- (verbs)
- (pixmaps)
- (create_ui): Remove unused funcs.
- (command_state_changed): Remove bonobo calls.
- (e_contact_editor_init): Remove bonobo stuff.
- (fill_in_email)
- (fill_in_im): Remove unused vars.
-
-2004-04-16 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c (book_loaded_cb): new
- function, use the async interface to load the book.
- (impl_requestCreateItem): use
- e_book_async_get_default_addressbook.
-
-2004-04-16 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Commit new contact editor
- UI by Anna.
-
- * gui/contact-editor/e-contact-editor.c: Comment out bonobo includes.
- (_email_arrow_pressed)
- (_address_arrow_pressed)
- (set_im_fields)
- (find_address_mailing)
- (set_address_field)
- (add_im_clicked)
- (edit_im_clicked)
- (remove_im_clicked)
- (im_button_press_cb)
- (im_selected_cb)
- (im_treeview_drag_data_get_cb)
- (im_treeview_drag_data_rcv_cb)
- (setup_im_treeview)
- (email_entry_changed)
- (address_to_text)
- (text_to_address)
- (address_text_changed)
- (address_mailing_changed)
- (full_addr_clicked)
- (e_contact_editor_build_email_ui)
- (e_contact_editor_build_address_ui)
- (_email_arrow_pressed)
- (_address_arrow_pressed)
- (find_address_mailing)
- (add_im_field)
- (set_im_fields)
- (set_address_field): Removed.
- (address_name)
- (im_service)
- (im_location): Add lookup structs.
- (init_email_record_location)
- (init_email)
- (fill_in_email_record)
- (extract_email_record)
- (email_location_to_index)
- (email_index_to_location)
- (im_index_to_location)
- (get_email_location)
- (get_im_location)
- (fill_in_email)
- (extract_email)
- (init_im_record_location)
- (init_im_record_service)
- (init_im)
- (fill_in_im_record)
- (fill_in_im)
- (extract_im_record)
- (extract_im)
- (init_address_field)
- (init_address_record)
- (init_address)
- (fill_in_address_field)
- (fill_in_address_record)
- (fill_in_address)
- (extract_address_field)
- (extract_address_record)
- (extract_address)
- (file_save_and_close_cb)
- (file_cancel_cb)
- (set_entry_text): Implemented.
- (connect_arrow_button_signals): Updated some widget names.
- (set_entry_changed_signals): Removed dead widgets, updated names for
- others.
- (print_cb)
- (tb_save_and_close_cb)
- (create_ui): Disabled Bonobo toolbar/menus.
- (e_contact_editor_init): Disabled Bonobo toolbar/menus. Init new
- UI elements. Remove init of old UI elements.
- (command_state_changed): Disabled Bonobo toolbar/menus. Act on new
- ok/cancel buttons.
- (_phone_arrow_pressed): Updated widget names.
- (set_phone_field): Use set_entry_text ().
- (set_fields): Update widget names, remove old address code, call new
- fill_in_* code.
- (field_mapping): Remove dead widgets.
- (widget_field_mapping): Ditto.
- (enable_writable_fields): Remove calls for old email/address UI.
- Update some names.
- (fill_in_info): Don't find_address_mailing() or set_im_fields().
- (extract_info): Call new extraction funcs.
-
-2004-04-14 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-view.c (book_open_cb): force the info
- label to update its contents here if the load was successful.
-
- * gui/component/addressbook-migrate.c (migration_context_new): use
- e_book_get_addressbooks instead of getting source_list from the
- component.
- (migration_context_free): unref the source_list.
-
- * gui/component/addressbook-config.c (dialog_to_source): sync the
- dialog->source_list, since we have it.
-
-2004-04-14 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c: rip out tons of functions - they
- all live in addressbook-view.c now. the only thing left in this
- file is the addressbook_load* calls that do authentication.
-
- * gui/component/addressbook.h: remove prototypes for
- addressbook_new_control and addressbook_load_uri (it was #if 0'ed
- anyway.)
-
- * gui/component/addressbook-component.h: remove prototypes for
- _peek_activity_handler and _peek_source_list.
-
- * gui/component/addressbook-component.c: rip out tons of functions
- - they all live in addressbook-view.c now.
- (impl_createControls): simplify this immensely. we just create an
- AddressbookView and get the various widgets/controls from it.
- (impl_requestCreateItem): this function loses slightly - it needs
- per-window info (the selected source) but there's no way to get
- it. So we load the default book. Also, this uses a synchronous
- e_book call to load the book, which is not good.
- (addressbook_component_peek_source_list): nuke, not used by
- anything anyway.
- (addressbook_component_peek_activity_handler): nuked, not used by
- anything - and it's per-window anyway.
-
- * gui/component/Makefile.am (libevolution_addressbook_la_SOURCES):
- add addressbook-view.[ch].
-
- * gui/component/addressbook-view.[ch]: rip out all of the per
- window stuff from addressbook.[ch] and addressbook-component.[ch]
- and put it here.
-
-2004-04-13 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/eab-contact-display.c (accum_address): disable the
- map link for 2.0.
-
-2004-04-13 Larry Ewing <lewing@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (create_table_view): add
- GDK_ACTION_COPY to the supported drag types. Connect to the
- table_drag_data_delete callback.
- (table_drag_data_delete): remove the drag rows.
-
-2004-04-13 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/component/addressbook.c (addressbook_authenicate):
- added a check for new auth type "plain/password"
- for groupwise in addressbook_authenicate function
-
-2004-04-12 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/eab-popup-control.c (email_menu_add_option): treat
- "" the same as NULL (don't add it to the list).
-
-2004-04-12 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (addressbook_load_default_book):
- quiet valgrind uninitialized memory warning.
-
-2004-04-12 Chris Toshok <toshok@ximian.com>
-
- [ should fix #56537 ]
-
- * gui/widgets/eab-popup-control.c (EMPTY_ENTRY): use _(), not N_()
- here.
- (email_menu_add_options_from_contact): and g_strdup it here, so
- that the g_list_foreach (... g_free ..) doesn't cause things to
- blow up.
- (email_menu_unset_options): nuke ifdefed function.
-
- * gui/widgets/eab-popup-control.h: don't include gtk.h, include
- just what we need.
-
-2004-04-10 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/eab-gui-util.h: add prototypes for
- eab_load_error_dialog and eab_search_result_dialog.
-
- * gui/widgets/eab-gui-util.c (eab_load_error_dialog): the new
- addressbook_show_load_error_dialog.
- (eab_search_result_dialog): new function, the old contents of
- addressbook.c:search_result.
-
- * gui/component/addressbook.c
- (addressbook_show_load_error_dialog): move this function to
- eab-gui-utils.[ch]
- (search_result): split out the body of this into
- eab_search_result_dialog in eab-gui-utils.[ch].
- (book_open_cb): call eab_load_error_dialog.
-
- * gui/component/addressbook.h: remove prototype for
- addressbook_show_load_error_dialog.
-
-2004-04-10 Chris Toshok <toshok@ximian.com>
-
- * util/e-destination.h: remove the e_destination_get_book api,
- since the function doesn't exist.
-
-2004-04-09 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-migrate.c (addressbook_migrate): bump
- version required to 8 for the contact list migration foo.
-
-2004-04-09 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c
- (selector_tree_drag_motion): pass GDK_CURRENT_TIME instead of a
- function pointer to "time" to gdk_drag_status. not sure if this
- is right, but it's definitely more right than it was :)
- (impl_createControls): create the info label and add it to the
- sidebar control. it's not hooked up yet.
-
-2004-04-09 Chris Toshok <toshok@ximian.com>
-
- * importers/evolution-ldif-importer.c (resolve_list_card): use the
- new e_destination_export_to_vcard_attribute call to build up the
- attributes.
-
- * importers/evolution-vcard-importer.c (process_item_fn): if we're
- importing a vcard that we wrote out previously containing xml in
- the EMAIL attributes, DTRT and strip it out and use
- e_destination_export_to_vcard_attribute to build up the proper
- attribute.
-
- * util/Makefile.am (libeabutil_la_SOURCES): remove
- eab-destination.[ch] and add e-destination.[ch].
-
- * printing/e-contact-print.c (e_contact_print_contact): we don't
- have to worry about the "<?xml..." EMAIL fields anymore.
-
- * gui/widgets/eab-gui-util.c (eab_send_contact_list): just use the
- value as the address (since that's what it is) in the list case.
-
- * gui/widgets/eab-contact-display.c (render_contact_list): remove
- the EABDestination stuff from here.
- (eab_contact_display_render_compact): same.
-
- * gui/widgets/e-minicard.c (activiate_editor): fix warnings - use
- EAB_EDITOR instead of G_OBJECT.
- (add_field): we don't have to worry about the "<?xml..." EMAIL
- fields anymore.
- (remodel): same.
-
- * gui/widgets/e-addressbook-treeview-adapter.c
- (adapter_get_value): we don't have to worry about the "<?xml..."
- EMAIL fields anymore.
-
- * gui/widgets/e-addressbook-table-adapter.c
- (addressbook_value_at): we don't have to worry about the
- "<?xml..." EMAIL fields anymore.
-
- * gui/contact-list-editor/e-contact-list-model.c
- (contact_list_value_at): eab->e.
- (contact_list_model_dispose): we're not a GtkObject, we're a
- GObject. rename _destroy to _dispose, and chain up to the parent
- class's ::dispose.
- (e_contact_list_model_class_init): GtkObject -> GObject, and
- destroy -> dispose.
- (e_contact_list_model_init): GtkObject -> GObject, and EAB -> E.
- (e_contact_list_model_add_destination): EAB -> E.
- (e_contact_list_model_add_email): same.
- (e_contact_list_model_add_contact): same.
- (e_contact_list_model_get_destination): same.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (table_drag_data_received_cb): add email num arg to
- e_contact_list_model_add_contact.
- (extract_info): fill in the vcard attributes instead of just
- generating xml.
- (fill_in_info): extract the values from the vcard attributes.
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_insert_length): eab->e, and don't
- sometimes copy, sometimes ::new. always ::new.
- (e_select_names_text_model_delete): same.
- (e_select_names_text_model_obj_count): same.
- (nth_obj_index): same.
-
- * gui/component/select-names/e-select-names-table-model.c
- (fill_in_info): eab -> e.
-
- * gui/component/select-names/e-select-names-popup.c
- (make_contact_editor_cb): eab -> e.
- (change_email_num_cb): same.
- (toggle_html_mail_cb): same.
- (populate_popup_contact): same, and remove code that checks for
- <?xml, then imports the EDestination.
- (quick_add_cb): eab -> e.
- (populate_popup_nocontact): same.
- (e_select_names_populate_popup): same.
-
- * gui/component/select-names/e-select-names-model.h: eab -> e, and
- remove prototypes for nuked functions.
-
- * gui/component/select-names/e-select-names-model.c
- (destination_changed_proxy, send_changed, connect_destination,
- disconnect_destination): nuke.
- (e_select_names_model_duplicate): EAB -> E.
- (e_select_names_model_get_textification): same.
- (e_select_names_model_get_address_text): same.
- (e_select_names_model_get_destination): same.
- (e_select_names_model_export_destinationv): same.
- (send_changed): same.
- (e_select_names_model_import_destinationv): same.
- (e_select_names_model_get_contact): same.
- (e_select_names_model_contains): same.
- (e_select_names_model_insert): same, and remove call to
- connect_destination.
- (e_select_names_model_append): same.
- (e_select_names_model_replace): same, and remove call to
- disconnect/connect_destination.
- (e_select_names_model_delete): same.
- (delete_all_iter): nuke.
- (e_select_names_model_delete_all): use g_object_unref for the
- foreach call.
- (e_select_names_model_merge): EAB -> E.
- (e_select_names_model_name_pos): same.
- (e_select_names_model_name_pos): same.
- (e_select_names_model_load_all_contacts): nuke.
- (e_select_names_model_cancel_all_contact_load): nuke.
-
- * gui/component/select-names/e-select-names-manager.c
- (clean_cb, focus_in_cb, focus_out_cb, completion_popup_cb): nuke.
- (completion_handler): EAB -> E, and the signals are gone.
-
- * gui/component/select-names/e-select-names-completion.c: in
- general, s/eab_dest/e_dest and s/EABDest/EDest.
- (e_select_names_completion_got_book_view_cb): move the
- e_book_view_start to below the assignment of
- sequence_complete_received, just to put my mind at ease.
- (e_select_names_completion_stop_query): un-#if notyet the call to
- e_book_cancel.
- (e_select_names_completion_start_query): free the waiting_query
- before assigning to it.
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_set_property_fn): remove calls to
- e_select_names_model_load_all_contacts, since that function is
- dead.
-
- * gui/component/addressbook-migrate.c (setup_progress_dialog):
- take the label to display to the user as an arg.
- (migrate_contact_lists_for_local_folders): loop over all contacts
- in all local addressbooks looking for ones that have <?xml in
- their EMAIL attributes. for the ones we find, call
- e_destination_export_to_vcard_attribute to build up the proper
- attribute.
- (addressbook_migrate): add in a clause for all versions under
- 1.5.7 to convert contact lists. also, move the unrefs of the
- sources/groups to outside the if, as they're created outside it.
-
- * gui/component/Makefile.am (INCLUDES): remove the
- addressbook/backend/ dirs, since libebook isn't there anymore
- (nothing is, actually). Add addressbook/util/.
-
-2004-04-09 Dan Winship <danw@ximian.com>
-
- * gui/component/addressbook.c (addressbook_new_control): create an
- EUserCreatableItemsHandler
- (addressbook_view_clear): destroy it
- (control_activate): Activate it
-
- * gui/component/addressbook-component.c
- (impl__get_userCreatableItems): Add object/folder flags to the
- creatable items. Rename "Address Book" to "Contacts Group" per new
- specs
-
-2004-04-07 Chris Toshok <toshok@ximian.com>
-
- * util/e-destination.c (e_destination_copy): we don't have an
- EBook* anymore.
- (e_destination_clear): same.
- (e_destination_set_contact): same.
- (e_destination_set_book): same, just cache the source_uid.
- (e_destination_set_book_uri): nuke.
- (e_destination_set_contact_uid): we don't have an EBook*.
- (e_destination_xml_decode): same.
- (e_destination_export_to_vcard_attribute): new function, fill in
- an EVCardAttribute with EDestination values.
-
- * util/e-destination.h: add prototype for
- e_destination_export_to_vcard_attribute.
-
-2004-04-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/component/autocompletion-config.c
- (source_selection_changed): Sync the changes here rather than
- setting 'changed' on the config control (since that no longer
- exists).
- (autocompletion_config_control_new): Don't connect to an apply
- signal, no such signal.
-
-2004-04-06 Chris Toshok <toshok@ximian.com>
-
- * util/e-destination.[ch]: old name, new trimmed down
- implementation. This will be replacing eab-destination.[ch].
-
-2004-04-06 Hao Sheng <hao.sheng@sun.com>
-
- * gui/widgets/e-minicard.c:
- (e_minicard_event) : implement keyboard navigation(TAB/shift+TAB)
- (activaite_editor) : add a new function to activiate contact editor
- for support "Enter" key
-
- Fixes #55056
-
-2004-04-05 Chris Toshok <toshok@ximian.com>
-
- * util/eab-destination.h: wrap this with the correct #ifdef.
-
-2004-04-05 Chris Toshok <toshok@ximian.com>
-
- * gui/merging/eab-contact-merging.c (match_query_callback): use
- the correct glade filename.
-
-2004-04-01 Hari Prasad Nadig <hp@ndeepak.info>
-
- Fixes #53433.
-
- * gui/component/addressbook-config.c (searching_tab_check): added
- the tab check for search tab.
- (dialog_to_source): added timeout to be saved.
- (source_to_dialog): just a piece to retrieve timeout from source.
- (addressbook_root_dse_query): few necessary changes.
- (do_ldap_root_dse_query): again few changes that were required.
-
- * gui/component/ldap-config.glade : set right the Hscale to
- display the selected value.
-
-2004-03-30 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #34777 ]
-
- * gui/contact-editor/e-contact-editor.c (file_as_entry_changed):
- set the window title to File As if the file as entry has something
- in it. "Contact Editor" otherwise.
- (set_entry_changed_signals): hook up the file-as-entry's "changed"
- signal.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (list_name_changed_cb): analogous fix, but "List Name" and
- "Contact List Editor".
-
-2004-03-30 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #53544 ]
-
- * gui/component/addressbook-component.c
- (impl__get_userCreatableItems): add "address_book" to the user
- creatable items list. complete with incorrect accelerator and
- shortcut!
- (impl_requestCreateItem): handle "address_book" here, and plug a
- memory leak.
-
-2004-03-30 Chris Toshok <toshok@ximian.com>
-
- [ part of the fix for #51977, the other part is in e-d-s ]
-
- * gui/widgets/e-addressbook-view.c (search_activated): the name of
- the category list property has changed from "category" to
- "category" list in 1.5. track the change here to get category
- searching working again.
-
-2004-03-30 Chris Toshok <toshok@ximian.com>
-
- [ part of the fix for #54528, the other part is in e-d-s ]
-
- * importers/evolution-vcard-importer.c (process_item_fn): get and
- set the PHOTO attribute before storing the contact in the book.
- this has the affect of making EContact sniff the image format.
- the apple addressbook doesn't give PHOTO's a TYPE.
-
-
-2004-03-30 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #53094 ]
-
- * gui/component/ldap-config.glade: nuke
- addressbook-sources-window.
-
- * gui/component/addressbook-config.c (main): nuke, we don't need
- this test case anymore, and it doesn't really work anyway anymore.
-
-2004-03-30 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #53634 ]
-
- * gui/widgets/e-addressbook-view.c (eab_view_new): call
- e_search_bar_set_menu to add the Advanced... menu item to the
- search menu, and connect to "menu_activated".
- (search_menu_activated): new function, pop up the advanced dialog
- if id == ESB_ADVANCED.
- (query_changed): use e_search_bar_get_item_id instead of
- g_object_get.
-
- * gui/component/addressbook.c (verbs): remove ToolSearch.
- (pixmaps): remove the ToolSearch pixmap.
-
-2004-03-30 Chris Toshok <toshok@ximian.com>
-
- [ gui part of the fix required for #48665 ]
-
- * gui/widgets/e-addressbook-model.c (get_view): pass the source's
- "limit" property (if it exists) to e_book_async_get_book_view.
-
-2004-03-29 Larry Ewing <lewing@ximian.com>
-
- * gui/component/addressbook-component.c
- (selector_tree_drag_data_received): call drag_finish properly.
- (selector_tree_drag_motion): set the drag status properly.
-
-2004-03-25 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/component/eab-editor.c (eab_editor_prompt_to_save_changes) :
- do eab_editor_is_valid check only when user wants to save.
-
-2004-03-24 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c
- (fill_popup_menu_callback): don't let the user delete their
- Personal addressbook. This is just a nice UI thingy.. A similar
- fix needs to be made to e-d-s. so that attempts that circumvent a
- nice UI will also fail.
-
-2004-03-24 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/eab-gui-util.c (eab_show_multiple_contacts): don't
- know what I was thinking approving this change. the _() was only
- used in the plural case (in fact where n > 5), so a singular case
- was never necessary, and neither was the call to ngettext.
-
-2004-03-24 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (e_contact_list_editor_get_type): parent_type == EAB_TYPE_EDITOR.
- (e_contact_list_editor_class_init): fill in editor_class virtual
- functions, and remove all the signals.
- (list_added_cb): call eab_editor_contact_* instead of emitting a
- signal here. also call eab_editor_close
- (list_modified_cb): same.
- (e_contact_list_editor_is_valid): new function.
- (e_contact_list_editor_is_changed): same.
- (e_contact_list_editor_get_window): same.
- (file_close_cb): call eab_editor_ functions.
- (list_deleted_cb): call eab_editor_contact_* instead of emitting a
- signal here. also call eab_editor_close
- (delete_cb): call eab_editor_* functions.
- (contact_list_editor_destroy_notify): call eab_editor_remove.
- (e_contact_list_editor_new): call eab_editor_add, and remove the
- g_object_ref/gtk_object_sink two-step.
- (e_contact_list_editor_show): make static, and make arg EABEditor.
- (e_contact_list_editor_raise): same.
- (e_contact_list_editor_close): same.
- (app_delete_event_cb): call eab_editor_ functions.
- (command_state_changed): use eab_editor_is_valid instead of
- is_named.
- (e_contact_list_editor_request_close_all): nuke.
-
- * gui/contact-list-editor/e-contact-list-editor.h: nuke a bunch of
- prototypes for functions that are now either virtual functions
- from EABEditor or eab_editor_* functions.
- (struct _EContactListEditor): we subclass from EABEditor.
- (struct _EContactListEditorClass): same, and nuke all the signals.
-
- * gui/contact-editor/e-contact-editor.c
- (e_contact_editor_get_type): parent_type == EAB_TYPE_EDITOR.
- (e_contact_editor_class_init): fill in editor_class virtual
- functions, and remove all the signals.
- (contact_moved_cb): call eab_editor_contact_* instead of emitting
- a signal here. also call eab_editor_close
- (contact_added_cb): same.
- (contact_modified_cb): same.
- (e_contact_editor_close): rename from close_dialog.
- (e_contact_editor_is_valid): new function.
- (e_contact_editor_is_changed): new function.
- (e_contact_editor_get_window): new function.
- (file_close_cb): use eab_editor_ calls here.
- (e_contact_editor_confirm_delete): nuke.
- (contact_deleted_cb): call eab_editor_contact_* instead of
- emitting a signal here. also call eab_editor_close
- (delete_cb): use eab_editor_ functions.
- (e_contact_editor_dispose): chain up to our parent's ::dispose.
- (contact_editor_destroy_notify): use eab_editor_remove.
- (e_contact_editor_new): use eab_editor_add, and remove the
- g_object_ref/gtk_object_sink two-step.
- (_popup_position): nuke dead function.
- (set_fields): i is an index, not a field_id.
- (e_contact_editor_raise): make this static, and it takes an
- EABEditor arg now, not a EContactEditor.
- (e_contact_editor_show): same.
- (e_contact_editor_request_close_all): nuke.
-
- * gui/contact-editor/e-contact-editor.h: nuke a bunch of
- prototypes for functions that are now either virtual functions
- from EABEditor or eab_editor_* functions.
- (struct _EContactEditor): we subclass from EABEditor.
- (struct _EContactEditorClass): same, and remove the signals.
-
- * gui/widgets/e-addressbook-view.c (delete): call
- eab_editor_confirm_delete.
-
- * gui/widgets/eab-popup-control.c (contact_editor_cb): don't
- bother calling e_contact_editor_raise since this is a new contact
- editor anyway.
-
- * gui/widgets/eab-gui-util.c (eab_show_contact_list_editor): use
- EABEditor signals, and eab_editor_show.
-
- * gui/widgets/e-minicard.h: "editor" is now of type EABEditor, not
- GObject.
-
- * gui/widgets/e-minicard.c (e_minicard_event): just use
- eab_editor_raise instead of
- e_contact_editor_raise/e_contact_list_editor_raise.
-
- * gui/component/addressbook-component.c (impl_requestQuit):
- implement this again, calling eab_editor_request_close_all.
- (addressbook_component_class_init): fill in epv->requestQuit.
-
-2004-03-24 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/eab-editor.[ch]: superclass for both
- EContactEditor and EContactListEditor. A start toward simplifying
- the interface to both of them, and a place to abstract code.
-
- * gui/contact-editor/Makefile.am (libecontacteditor_la_SOURCES):
- add eab-editor.[ch]
-
-2004-03-24 Danilo Segan <dsegan@gmx.net>
-
- * gui/widgets/e-addressbook-model.c (update_folder_bar_message):
- Use ngettext for handling plural forms (fixes bug #53464).
- * gui/widgets/eab-gui-util.c (eab_show_multiple_contacts): Likewise.
- * gui/widgets/eab-vcard-control.c (pstream_load): Likewise.
-
-
-2004-03-22 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #53653, and a couple other instances ]
-
- * gui/widgets/eab-gui-util.c (file_exists): REJECT -> CANCEL, so
- esc works (patch from Pratik V. Parikh <pratikvp@despammed.com>)
- (save_it): REJECT -> CANCEL.
- (eab_select_source): same.
-
-2004-03-17 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes #53625.
-
- * gui/widgets/eab-contact-display.c (render_contact): Show home and
- mobile phone numbers too.
-
-2004-03-15 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/contact-editor/e-contact-editor.c (enable_writable_fields) :
- loop only up to < G_N_ELEMENTS instead of <= G_N_ELEMENTS. Prevents
- out of bound indexing of addresses array
-
-2004-03-15 Hao Sheng <hao.sheng@sun.com>
-
- * gui/component/Makefile.am : build a11y/addressbook dir
- * gui/widgets/e-addressbook-view.c :
- (eab_view_class_init) : add the accessibility support for
- EAddressbookView
- * gui/widgets/e-minicard-view.c :
- (e_minicard_view_class_init) : add the accessibility support for
- EMinicardView
- * gui/widgets/e-minicard.c :
- (e_minicard_class_init) : add the accessibility support for EMinicard
-
-2004-03-10 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/eab-contact-display.c (render_address): #if 0 this,
- since nothing uses it anymore.
- (accum_address): new function, build up a GString.
- (accum_name_value): same.
- (accum_attribute): same.
- (render_contact): don't just blindly render the work/personal
- blocks, since if they're empty it looks stupid. instead,
- accumulate each block into a GString and only output the entire
- block if the string is non-empty.
-
-2004-03-10 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (phone_entry_changed):
- phone_choice is an index into the phones array.
- (_phone_arrow_pressed): same.
- (address_text_changed): address_choice is an index into the
- addresses array.
- (_address_arrow_pressed): same.
- (set_address_field): same.
- (_email_arrow_pressed): email_choice is an index into the emails
- array.
- (full_addr_clicked): same, and same with
- s/addresses/address_editable.
- (e_contact_editor_init): initialize the *_choice fields as indices
- into their respective *es arrays.
- (e_contact_editor_build_address_ui): initialize the labels from
- the addresses array.
- (set_fields): *_choice fields are indices into *es arrays.
- (enable_writable_fields): same.
-
-2004-03-09 Rodney Dawes <dobey@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (_arrow_pressed): Don't try
- to calculate the position of the popup menu for the dropdowns
-
-2004-03-09 Rodney Dawes <dobey@ximian.com>
-
- * gui/contact-editor/e-contact-editor-im.c (e_contact_editor_im_edit):
- Remove the dialog separator, and set appropriate border widths for the
- button area box and the dialog's vbox
- * gui/contact-editor/im.glade: Apply patch from Christian Neumair to
- make the IM editor dialog HIG compliant
-
-2004-03-08 Sivaiah Nallagatla <snallagatla@novell.com>
- * gui/contact-editor/e-contact-editor.c (enable_writable_fields):
- fixed a typo, which is causing probelm in building up email ui
-
-2004-03-04 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/component/addressbook-config.c :
- (addressbook_add_server_druid) : maintain a list of only those source groups which are added to menu
- instead of all
- (source_group_changed_cb) : use the new list to get the selected group
- (addressbook_source_dialog_destroy) : free the new list
-
-2004-03-04 Not Zed <NotZed@Ximian.com>
-
- ** See #54991.
-
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_start_query): dont try to unref a null
- query.
- (name_style_query): use a GString to build the query, so we can
- use e_sexp_encode_string to properly encode the sub terms.
-
-2004-03-03 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/addressbook-component.c (delete_addressbook_cb):
- Set error to NULL before using it.
-
-2004-03-03 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/addressbook-component.c (delete_addressbook_cb):
- Remove local data, with error reporting on failure.
-
-2004-03-02 Larry Ewing <lewing@ximian.com>
-
- * gui/component/addressbook-component.c: add drop support for
- text/x-vcard to the source list.
-
-2004-02-27 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/eab-contact-display.c
- (eab_contact_display_render_compact): ref the pixbuf before we
- close/unref the loader so the pixbuf sticks around, and make the
- scaling logic a bit more transparent.
-
-2004-02-27 Rodney Dawes <dobey@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Change the button relief
- back to normal for the drop-down buttons and move the text labels
- inside the buttons as well
-
-2004-02-27 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (eab_view_set_property): add
- missing "break" to PROP_SOURCE's case.
-
-2004-02-27 Rodney Dawes <dobey@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Get rid of some extraneous
- event boxes that were not needed/used for anything really
- Set the button relief for the pop-down buttons to NONE
- Set the shadow type for the arrows in the pop-down buttons to NONE,
- so that we look good with themes that actually handle shadow types on
- arrows, since most things just ignore the shadow type anyway
-
- Fixes #8516
-
-2004-02-26 Hans Petter Jansson <hpj@ximian.com>
-
- * util/eab-destination.c (name_and_email_cb): Move unused variable
- declaration inside notyet conditional.
-
- * printing/e-contact-print.c: Include gal/util/e-util.h
-
- * gui/merging/eab-contact-compare.c (eab_contact_locate_match): Cast
- callback to an EBookCallback.
- (eab_contact_locate_match_full): Ditto.
-
- * gui/contact-editor/e-contact-quick-add.c (quick_add_set_name):
- Remove unused variable and cast 3rd arg to e_contact_set () (perhaps
- this should take a gconstpointer?).
-
- * gui/contact-editor/e-contact-editor-im.c (setup_service_optmenu):
- Remove unused variable.
-
- * gui/component/select-names/e-select-names.c (e_select_names_init):
- Cast the vbox to a GtkBox.
-
- * gui/component/addressbook-config.c (dialog_to_source): Correctly cast
- the spin button to a GtkSpinButton, not a GtkEntry.
-
- * gui/component/addressbook-component.c (load_primary_selection):
- Remove unused variable.
-
-2004-02-26 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/eab-contact-display.c (render_contact): add the
- Groupwise IM attributes to the list of those we render.
-
-2004-02-26 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (set_view_preview): call
- eab_view_show_contact_preview here so we maintain the preview
- state when switching folders. we don't (yet... won't ever?) have
- per-addressbook preview settings.
-
-2004-02-26 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-view.c
- (eab_view_show_contact_preview): view->scrolled ->
- view->contact_display. fixes crash.
-
-2004-02-26 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (edit_im_clicked): fix
- checks for locations.
-
-2004-02-26 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/im.glade: set the location label/option menu
- to visible.
-
- * gui/contact-editor/e-contact-editor.c (add_im_clicked): build up
- the vcard attributes manually so we can set the TYPE= parameter to
- the location the user specifies.
- (edit_im_clicked): same. Also, use COLUMN_IM_LOCATION_TYPE, which
- is not localized to pass the location to the editor.
- (remove_im_clicked): reindent.
- (im_treeview_drag_data_get_cb): same.
- (im_treeview_drag_data_rcv_cb): same.
- (setup_im_treeview): add another column for the (non-localized)
- location type, and reindent.
- (add_im_field): use the new attribute api for EContact so we can
- get the location of each account, and set things appropriately on
- the store.
-
- * gui/contact-editor/e-contact-editor-im.c
- (e_contact_editor_im_class_init): reindent.
- (e_contact_editor_im_new): same.
- (fill_in_info): same.
-
-2004-02-25 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/contact-editor/e-contact-editor-im.c : added
- groupwise im related label and icon image file name
-
- * gui/contact-editor/e-contact-editor.c :
- (im_treeview_drag_data_get_cb), (im_treeview_drag_data_rcv_cb) :
- (set_im_fields) : added code to add Gw Im id to contact-editor
-
-
-2004-02-24 Hans petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-quick-add.c (quick_add_set_name):
- Port to new way of setting name in contact.
-
-2004-02-24 JP Rosevear <jpr@ximian.com>
-
- * gui/component/addressbook-migrate.c (migration_context_new):
- don't init the dialog here
- (addressbook_migrate): init it here
-
- Fixes #54214
-
-2004-02-20 Chris Toshok <toshok@ximian.com>
- * gui/contact-editor/e-contact-editor.c (phone_entry_changed):
- remove some spew.
-
-2004-02-19 Chris Toshok <toshok@ximian.com>
-
- * gui/component/component-factory.c: s/HAVE_NSS/ENABLE_SMIME.
-
- * gui/component/addressbook-component.c: s/HAVE_NSS/ENABLE_SMIME.
-
-2004-02-19 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (activate_source): split out the
- majority of the set_prop code for PROPERTY_SOURCE_UID_IDX here, so
- it can be used for both SOURCE_UID and FOLDER_URI.
- (set_prop): add a setter for "folder_uri". we sorta fudge things
- and use the uri for the uid (the uid is only used as a hash key to
- look up the view associated with the uri/source, so we should be
- good still.)
- (get_prop): add getter for "folder_uri".
- (addressbook_new_control): add the "folder_uri" property to our
- property bag.
-
-2004-02-19 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes #45308 and duplicates.
-
- * gui/widgets/e-addressbook-model.c (eab_model_set_property): Store
- the IDs of book signals connected to, so we can disconnect from them
- later.
-
-2004-02-18 Hao Sheng <hao.sheng@sun.com>
-
- [ fixes bug #52765 ]
-
- * gui/contact-editor/e-contact-editor.c
- (e_contact_editor_confirm_delete): make delete dialog support
- ESC press.
-
-2004-02-17 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-editor.h (struct
- _EContactListEditor): add image_set slot.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (list_image_changed_cb): set image_set = TRUE.
- (e_contact_list_editor_init): init image_set = FALSE
- (extract_info): only set the LOGO attribute if image_set = TRUE.
-
- * gui/contact-editor/e-contact-editor.h (struct _EContactEditor):
- add image_set slot.
-
- * gui/contact-editor/e-contact-editor.c (extract_info): only set
- the PHOTO attribute if image_set == TRUE.
- (image_chooser_changed): new function, set image_set = TRUE and
- call widget_changed.
- (e_contact_editor_init): init image_set to FALSE.
- (_address_arrow_pressed): quiet compiler.
-
-2004-02-17 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #53620 ]
-
- * gui/merging/eab-contact-compare.c (eab_contact_compare_name): ""
- is a valid (and common) value for elements of EContactName now.
- it's semantically equivalent to NULL in the old ECard foo.
-
-2004-02-12 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-migrate.c (migrate_contacts): free up
- the list returned by e_book_get_contacts.
-
-2004-01-12 Rodney Dawes <dobey@ximian.com>
-
- * gui/component/addressbook-component.c (delete_addressbook_cb):
- Fix capitalization of Address Book usage in sentence form
- * gui/component/ldap-config.glade: Use Address Book instead of
- Addressbook in here (Patch from Aaron Weber <aaron@ximian.com>)
-
-2004-02-11 Rodney Dawes <dobey@ximian.com>
-
- * gui/component/addressbook-component.c (delete_addressbook_cb):
- (fill_popup_menu_callback):
- * gui/widgets/e-addressbook-view.c (init_collection):
- * gui/widgets/eab-gui-util.c (eab_error_dialog):
- * gui/widgets/eab-popup-control.c (eab_popup_control_contstruct):
- Address Book, not Addressbook
-
- Fixes #54166 and #54120
-
-2004-02-10 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: build importers dir
-
-2004-02-08 Rodney Dawes <dobey@ximian.com>
-
- * gui/component/addressbook-migrate.c (create_groups): Initialize the
- personal_source to NULL
-
- Fixes #54015
-
-2004-02-08 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/widgets/e-addressbook-view.c (delete) : pass contact
- as an argument instead of contact id to e_book_async_remove_contact
-
-2004-02-06 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-migrate.c (create_groups): don't
- bother using a function-wide variable to store the personal
- source. also, use g_build_filename properly (because fejj is a
- whiner.)
- (migrate_local_folders): same (wrt fejj whining).
-
-2004-02-06 Rodney Dawes <dobey@ximian.com>
-
- * gui/component/addressbook.c (addressbook_new_control): Hide the
- border on the notebook also
- * gui/widgets/e-addressbook-view.c (eab_view_new): Don't pack another
- scrolled window inside of a scrolled window, just pack the contact
- display inside the paned, since it already has a scrolled window
-
-2004-02-06 Rodney Dawes <dobey@ximian.com>
-
- * gui/widgets/e-addressbook-view.c: Use "Address Book" instead of
- "folder" or "Addressbook" for the "Address Book Sources..." and
- copy/move contact menu items
-
- Fixes #53654
-
-2004-02-06 Chris Toshok <toshok@ximian.com>
-
- * importers/evolution-ldif-importer.c (getNextLDIFEntry): only set
- the address if something in it's been filled in.
- (resolve_list_card): build up a separate list representing the xml
- formatted crud.
- (process_item_fn): remove FIXME.
- (factory_fn): use g_new0 since we test for NULL-ness later on.
-
- * importers/evolution-vcard-importer.c (factory_fn): use g_new0
- since we test for NULL-ness later on.
-
-2004-02-06 JP Rosevear <jpr@ximian.com>
-
- * importers/evolution-ldif-importer.c (importer_destroy_cb):
- implement
-
-2004-02-06 JP Rosevear <jpr@ximian.com>
-
- * importers/evolution-vcard-importer.c (importer_destroy_cb):
- implement
- (load_file_fn): use g_file_get_contents to get a string we can
- convert to a contact list with eab_contact_list_from_string
-
-2004-02-06 JP Rosevear <jpr@ximian.com>
-
- * importers/GNOME_Evolution_Addressbook_LDIF_Importer.server.in.in:
- shlib importer info
-
- * importers/GNOME_Evolution_Addressbook_VCard_Importer.server.in.in:
- ditto
-
- * importers/Makefile.am: build shlib addressbook importers
-
- * importers/evolution-ldif-importer.c: First crack at resurrecting
-
- * importers/evolution-vcard-importer.c: ditto
-
-2004-02-03 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/eab-contact-display.c (on_url_requested): remove
- some spew, and add an evo-icon: handler, for things in evolution's
- imagedir.
- (render_address): hack up the html.
- (render_name_value): new function, just render a name/value/icon.
- (render_attribute): split out most of this function into
- render_name_value. this just checks to see if the EContact
- attribute has something in it before passing it along.
- (render_contact_list): split this out from
- eab_contact_display_render_normal.
- (start_block): new function, insert a row of height 20 with a
- header.
- (end_block): new function, insert a row of height 20.
- (render_contact): split this out from
- eab_contact_display_render_normal, and prettify the contact
- display.
- (eab_contact_display_render_normal): call render_contact and
- render_contact_list.
- (eab_contact_display_new): create a scrolled window and add the
- GtkHTML to it so we actually have scrollbars.
-
-2004-02-03 Dan Winship <danw@ximian.com>
-
- * gui/component/select-names/Makefile.am (INCLUDES): add
- widgets/misc for e-activity-handler.h
-
-2004-02-03 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/component/addressbook-config.c (dialog_to_source)
- (source_to_dialog) : use gtk_spin_button_* apis to get and set
- values for download limit spin button instead of gtk_entry
- Fixes #53432
-
-2004-02-02 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (eab_view_new): hook up
- contact_changed/contact_removed signals.
- (contact_changed): new function. if the changed contact is the
- one we're displaying, re-render it.
- (contact_removed): new function. if the removed contact is the
- one we're displaying, clear the display.
- (render_contact): set displayed_contact to the row.
- (eab_view_init): init displayed_contact to -1.
- (selection_changed): set displayed_contact to -1 when we clear the
- display.
-
- * gui/widgets/e-addressbook-view.h (struct _EABView): add
- "displayed_contact" so we can update the contact preview when it
- changes.
-
-2004-01-30 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c: enable d&d drop photos.
-
- * gui/contact-editor/contact-editor.glade: use
- eab_create_image_chooser_widget for the d&d'able image.
-
- * gui/contact-list-editor/e-contact-list-editor.c: abstract out
- all the d&d image support (it's now in
- widgets/misc/e-image-chooser.[ch]).
-
- * gui/contact-list-editor/contact-list-editor.glade: use
- eab_create_image_chooser_widget for the d&d'able image.
-
- * gui/widgets/eab-gui-util.c (eab_create_image_chooser_widget):
- new function.
-
- * gui/widgets/eab-gui-util.h: add prototype for
- eab_create_image_chooser_widget.
-
-2004-01-29 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/widgets/eab-gui-util.c (source_selection_changed_cb): Implement.
- (eab_select_source): Implement. Public function that prompts user to
- select a source from a list.
- (eab_transfer_contacts): Enable and use eab_select_source () and
- ESource, instead of old shell folder/URI stuff.
-
-2004-01-29 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/ldap-config.glade: Changed "Finish" to "Apply" in
- dialog finish page text.
-
-2004-01-29 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/addressbook-config.c (dialog_to_source): Sync the
- modified source list.
-
- * gui/component/addressbook-component.c (delete_addressbook_cb): Sync
- the modified source list.
-
-2004-01-29 Chris Toshok <toshok@m198-139.dsl.rawbw.com>
-
- * gui/component/addressbook-migrate.c (setup_progress_dialog): use
- the MigrationContext struct.
- (dialog_close): same.
- (dialog_set_folder_name): same.
- (dialog_set_progress): same.
- (migrate_contacts): same, and pass it along to other functions.
- (migrate_contact_folder_to_source): same.
- (migrate_contact_folder): same. also, add the old path/uid to the
- folder_uid_map.
- (migrate_local_folders): same.
- (create_groups): use the MigrationContext struct.
- (migrate_completion_folders): if it's a file uri, look up the old
- path in our hash table for a uid to use. otherwise use the old
- behavior.
- (migration_context_new): new function, initialize the
- MigrationContext.
- (migration_context_free): free up everything.
- (addressbook_migrate): create the context, pass it to everything,
- destroy the context, shine toshok's shoes, etc.
-
-2004-01-29 Radek Doulik <rodo@ximian.com>
-
- * gui/component/addressbook-config.c (dialog_to_temp_source): set
- group to temporary source
-
-2004-01-28 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/select-names/e-select-names-table-model.c
- (fill_in_info): Get file_as instead of full_name.
-
- * gui/compoent/select-names/e-select-names.etspec: Show the file_as
- column instead of full_name.
-
-2004-01-27 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor-fullname.c
- (e_contact_editor_fullname_set_property): Handle NULL name. Fixes
- #53071.
-
-2004-01-27 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-config.c (dialog_to_source): set the
- relative_uri of a local source to be its uid.
-
- * gui/component/addressbook-migrate.c
- (migrate_contact_folder_to_source): remove the dest_group arg,
- since we don't use it.
- (migrate_contact_folder): set the relative uri of the source to be
- its uid.
- (PERSONAL_RELATIVE_URI): "Personal" -> "system".
- (create_groups): don't actually make the directory hierarchy for
- the personal folder here. let e-d-s do that. Also remove
- OnThisComputer from the base uri.
- (migrate_local_folders): track change to
- migrate_contact_folder_to_source.
-
-2004-01-26 Chris Toshok <toshok@ximian.com>
-
- [ Should fix #53361 and other migration problems/crashes ]
- * gui/component/addressbook-migrate.c
- (migrate_contact_folder_to_source): new function, takes most of
- migrate_contact_folder's contents. Fix some of the refcounting
- problems though, by not unreffing dest_group, and using
- e_group_add_source instead of e_source_set_group.
- (migrate_contact_folder): convert to calling
- migrate_contact_folder_to_source.
- (create_groups): add an out parameter for *personal_source.
- (migrate_local_folders): add personal_source as an arg, so we can
- get the source that create_groups created/found. Call
- migrate_contact_folder_to_source for the personal_source.
- (addressbook_migrate): pass personal_source to
- migrate_local_folders.
-
-2004-01-26 Chris Toshok <toshok@ximian.com>
-
- [ fixes #53238 ]
- * util/eab-destination.c (nonempty): make this accept NULL's (and
- return FALSE for them).
- (eab_destination_is_empty): shorten some of the tests since
- nonempty takes NULL now.
- (eab_destination_get_address): only call
- camel_internet_address_add if both name and email are non-empty.
- otherwise call camel_address_decode and let camel try to deal with
- it.
- (eab_destination_xml_encode): call xmlEncodeEntitiesReentrant on
- the strings before adding them to the xml, so people that enter
- [<>&] won't end up with broken EABDestinations.
-
-2004-01-26 Radek Doulik <rodo@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (selection_received): make sure
- we pass \0 terminated string to eab_contact_list_from_string
- [it may fix #51743]
-
-2004-01-25 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #51171 ]
- * gui/widgets/eab-gui-util.c (eab_send_contact_list): get this
- working.
-
-2004-01-24 Rodney Dawes <dobey@ximian.com>
-
- * gui/component/select-names/e-select-names.c (e_select_names_init):
- Select Contacts from Address Book, not Contents
-
- Fixes #53263
-
-2004-01-24 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-migrate.c (migrate_local_folders):
- oops.
- (migrate_contact_folder): fix the unreffing.
-
-2004-01-24 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-migrate.c (migrate_local_folders): use
- _("Personal"), not "Personal".
-
-2004-01-24 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-migrate.c (migrate_local_folders):
- don't create/add the source here. it's done in
- migrate_contact_folder.
-
-2004-01-24 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-migrate.c (migrate_local_folders): use
- e_folder_map_local_folders.
- (find_addressbook_dirs): nuke.
-
-2004-01-24 JP Rosevear <jpr@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (init_collection): use
- .evolution to store view info
-
-2004-01-23 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #52571 ]
- * util/eab-book-util.c (escape): ugh. name fields that have \"
- around the name break our queries, because it turns it into (for
- instance): (contains "full_name" ""Toshok""). so we need to turn
- that into: (contains "full_name" "\"Toshok\"").
- (eab_name_and_email_query): escape both the name and email, and
- use an EBookQuery instead of passing the string to
- e_book_async_get_contacts. Looks like ross missed a couple of
- spots.
- (eab_nickname_query): same.
-
- * gui/component/addressbook.c (free_load_source_data): new
- function, free up the data and unref the source if there is one.
- (load_source_auth_cb): call free_load_source_data instead of just
- g_free'ing the struct.
- (load_source_cb): same.
- (default_book_cb): new function, we need this so we can fill in
- the source for the default book. get the source, then call
- load_source_cb to continue processing as normal.
- (addressbook_load_default_book): use default_book_cb instead of
- load_source_cb.
-
-2004-01-22 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #53184 ]
- * gui/component/addressbook-migrate.c (migrate_contacts): handle
- the fact that the xml 1.4 spits out contains unescaped ';'s in the
- EMAIL attributes for mailing lists.
-
-2004-01-22 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #52944 ]
- * gui/component/addressbook-migrate.c (migrate_contacts): do some
- massaging of contacts as we import them, to fix up the differences
- between 1.4 and 1.5 vcards.
-
-2004-01-21 Nat Friedman <nat@novell.com>
-
- * gui/contact-editor/contact-editor.glade: Added missing
- entry-blog widget.
-
-2004-01-21 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/addressbook-config.c (create_source_dir): Remove.
- (dialog_to_source): Don't create source dir, backend takes care of
- that now.
-
-2004-01-21 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c
- (addressbook_component_peek_gconf_client): new function.
-
- * gui/component/addressbook-component.h: add prototype for
- addressbook_component_peek_gconf_client.
-
- * gui/component/addressbook-migrate.c
- (migrate_completion_folders): more gross hacking. migrate the
- completion settings.
- (get_source_by_uri): function to search for an ESource given the
- entire uri. used for migrate_completion_folders.
- (migrate_ldap_servers): get_string_value -> get_string_child.
- same with get_integer_child.
- (get_string_child): rename to make it apparent it's a child, not a
- property.
- (get_integer_child): same.
- (addressbook_migrate): call migrate_completion_folders.
-
-2004-01-21 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (new_target_cb): call
- widget_changed here too, since we're changing the destination.
-
-2004-01-20 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #52955 ]
- * gui/merging/eab-contact-compare.c (use_common_book_cb): handle
- the case properly where there are no query parts (p == 0).
- Instead of passing "" to e_book_query_from_string, just set the
- query to NULL.
-
- * util/eab-book-util.c (eab_contact_list_to_string): we need to
- put a blank line here, so \r\n\r\n, not just \r\n.
-
-2004-01-20 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-migrate.c (create_groups): deal with
- the groups/sources already being there. Essentially make this
- function idempotent.
- (addressbook_migrate): unconditionally call create_groups now.
- move the version logic here from ipl_upgradeFromVersion, and
- include more versions in the set of those we upgrade from.
-
- * gui/component/addressbook-migrate.h: add major/minor/revision
- args to addressbook_migrate.
-
- * gui/component/addressbook-component.c (impl_upgradeFromVersion):
- remove the version logic from here.
-
-2004-01-20 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * printing/e-contact-print.c (e_contact_print_response): do not
- try to unref when query is NULL
-
-2004 -01-20 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/contact-editor/e-contact-editor.c (edit_im_clicked) : do not call
- gtk_tree_model_get when nothing in the list is selected
-
-2004-01-19 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/select-names/e-select-names.etspec: Get name from
- correct model column.
-
-2004-01-19 Hans Petter Jansson <hpj@ximian.com>
-
- * printing/e-contact-print.c (complete_sequence): Only unref if we
- have a query.
-
-2004-01-19 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/addressbook-component.c
- (get_primary_source): Implement.
- (load_primary_selection): Use get_primary_source ().
- (impl_requestCreateItem): Use get_primary_source (), fixing a crash
- when we're asked to create a new item and we don't have the controls.
-
-2004-01-16 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/addressbook.c (load_source_auth_cb): Don't run
- callback if the action was cancelled.
- (load_source_cb): Ditto.
- (addressbook_load_source): Return an ID for the load attempt.
- (addressbook_load_source_cancel): Implement, allows cancelling a
- load attempt.
-
- * gui/contact-editor/e-contact-editor.c (new_target_cb): Clear the
- values for in-progress load operation. Only unref new_book if it's
- non-NULL.
- (cancel_load): Implement. Cancels the load operation if one is in
- progress.
- (source_selected): Cancel any running load operation before starting
- a new one. Set up in-progress values.
- (e_contact_editor_init): Clear the in-progress values.
- (e_contact_editor_dispose): Cancel load operation.
- (e_contact_editor_set_property): If a new target book is set, cancel
- any conflicting load operation in progress.
-
- * gui/widgets/e-addressbook-view.c (set_paned_position): Remove
- debug output.
- (get_paned_position): Ditto.
-
-2004-01-16 JP Rosevear <jpr@ximian.com>
-
- * gui/component/addressbook.c (set_prop): only set the menus and
- command state if we actually are already displayed, otherwise wait
- for activation
-
-2004-01-15 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (set_paned_position): Implement.
- (get_paned_position): Implement.
- (eab_view_new): Connect signal to get paned position changes.
- Remove old hack.
- (display_view): Set paned position properly.
-
-2004-01-12 JP Rosevear <jpr@ximian.com>
-
- * gui/component/addressbook-component.c (impl_upgradeFromVersion):
- revert dumb upgrade change
-
-2004-01-12 JP Rosevear <jpr@ximian.com>
-
- * gui/component/addressbook-component.c (impl_upgradeFromVersion):
- migrate from 1.5.0 and 1.5.1 properly
-
-2004-01-12 JP Rosevear <jpr@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: de-bold ui elements
-
-2004-01-09 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/addressbook-component.c (add_popup_menu_item): Take a
- sensitivity flag per menu item, and fall back to stock icons.
- (delete_addressbook_cb): Implement.
- (fill_popup_menu_callback): Reorder items, remove "remove" item, set
- sensitivity.
-
- * gui/component/ldap-config.glade: "Edit LDAP Server" ->
- "Addressbook Properties".
-
-2004-01-11 Christian Hammond <chipx86@gnupdate.org>
-
- * addressbook/gui/contact-editor/e-contact-editor-im.[ch],
- addressbook/gui/contact-editor/im.glade: Added a dialog for
- adding a new IM account.
- * addressbook/gui/contact-editor/Makefile.am: Added the previously
- mentioned files, and depend on camel for necessary MIME parsing.
-
- * addressbook/gui/contact-editor/contact-editor.[ch],
- addressbook/gui/contact-editor/contact-editor.glade: Add and implement
-
-2004-01-09 Ross Burton <ross@burtonini.com>
-
- * gui/component/select-names/e-select-names-completion.c:
- * gui/merging/eab-contact-compare.c:
- * gui/widgets/e-addressbook-model.c:
- * printing/e-contact-print.c:
- Update for API changes to e-book-async.
-
-2004-01-08 Ross Burton <ross@burtonini.com>
-
- * gui/contact-editor/contact-editor.glade:
- * gui/contact-editor/e-contact-editor.c:
- Add the video conferencing field.
-
-2004-01-07 Rodney Dawes <dobey@ximian.com>
-
- * gui/component/select-names/e-select-names.c:
- * gui/component/select-names/select-names.glade: Make the ESelectNames
- object be a HIG-compliant dialog, change "Folder" to be "Address Book",
- and fix a mnemonic conflict with "Category" and "Cancel"
-
- Fixes #51966
-
-2004-01-07 Rodney Dawes <dobey@ximian.com>
-
- * gui/component/addressbook-component.c: Move the smime_component_init
- call to the instance init callback, rather than the class init, and
- wrap it in #if HAVE_NSS, so the addressbook works without smime support
-
-2004-01-07 JP Rosevear <jpr@ximian.com>
-
- * gui/component/Makefile.am: link in printer stuff
-
- Fixes #51172
-
-2004-01-06 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-migrate.c (check_for_conflict): remove
- spew.
- (migrate_contacts): same.
- (migrate_contact_folder): same.
- (migrate_local_folders): same, and plug a leak.
-
-2004-01-06 Chris Toshok <toshok@ximian.com>
-
- * gui/component/Makefile.am (libevolution_addressbook_la_SOURCES):
- add addressbook-migrate.[ch].
-
- * gui/component/addressbook-component.c
- (addressbook_component_init): remove the source creation from
- here, it's in the migration code now.
- (impl_upgradeFromVersion): new function, call the
- addressbook-migration stuff.
- (addressbook_component_class_init): fill in
- epv->upgradeFromVersion, and call smime_component_init.
- (addressbook_component_peek_base_directory): new function.
- (addressbook_component_peek_source_list): same.
-
- * gui/component/addressbook-component.h: add prototypes for
- _peek_base_directory and _peek_source_list.
-
- * gui/component/addressbook-migrate.[ch]: add migration code to
- convert stuff from 1.x over to 1.5/2.0.
-
-2004-01-06 Rodney Dawes <dobey@ximian.com>
-
- * gui/contact-editor/e-contact-editor-address.c: Apply
- patch from Roozbeh Pournader to update countries list
-
- Fixes #48151
-
-2004-01-06 JP Rosevear <jpr@ximian.com>
-
- * gui/component/select-names/e-select-names-popup.c
- (popup_info_cleanup): disconnect from selection-done signal
-
-2004-01-05 JP Rosevear <jpr@ximian.com>
-
- * gui/component/addressbook.c
- (addressbook_show_load_error_dialog): these line breaks in the
- error messages should actually be spaces
-
- Fixes #51732
-
-2003-12-19 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/addressbook-component.c (find_first_source): Impl.
- from calendar.
- (save_primary_selection): Implement, similar to calendar.
- (load_primary_selection): Implement, similar to calendar.
- (primary_source_selection_changed_callback): Save selection.
- (impl_createControls): Load selection.
-
-2003-12-18 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (widget_changed):
- editable -> target_editable
- (e_contact_editor_get_property): Same.
- (_email_arrow_pressed): Same.
- (enable_writable_fields): Same.
- (set_editable): Same.
- (contact_added_cb): Make sure source book is editable before trying
- to remove contact from there.
- (e_contact_editor_init): Set up source/target editability.
- (command_state_changed): Allow save only if target editable. Allow
- delete only if source editable.
- (e_contact_editor_set_property): Set editability flags for
- source/target.
-
- * gui/contact-editor/e-contact-editor.h: Add source_editable,
- target_editable flags in place of old editable flag.
-
-2003-12-17 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (eab_view_class_init): install
- the "source" property.
- (eab_view_init): init eav->source to NULL.
- (eab_view_dispose): disconnect the ecml_changed_id and unref
- source.
- (eab_view_new): create the search bar here.
- (view_preview): c&p the mailer's code mostly for this - this is
- the toggle listener for the Preview Pane menuitem.
- (setup_menus): add a listener for the ContactsViewPreview toggle.
- (eab_view_set_property): sensitize the search bar based on whether
- or not we have a book set. This makes it so you can't search
- until the book is loaded. Also add handling for the "source"
- attribute and print a warning when it's set multiple times
- (something that's not supported at the moment.)
- (eab_view_get_property): add "source" case.
- (search_activated, query_changed, compare_subitems, make_subitems,
- ecml_changed, get_master_list, connect_master_list_changed): move
- this here from addressbook.c
- (eab_view_show_contact_preview): implement - just show or hide the
- scrolled window.
- (eab_view_setup_menus): call e_search_bar_set_ui_component here,
- kind of a hack.
-
- * gui/widgets/e-addressbook-view.h: make this inherit from GtkVBox
- instead of GtkEventBox since we'll be packing children. Add a
- prototype for eab_view_show_contact_preview.
-
- * gui/component/addressbook.c (get_current_view): return the
- EABView associated with the active notebook page.
- (save_contact_cb): use the current view.
- (view_contact_cb): same.
- (search_cb): same.
- (delete_contact_cb): same.
- (print_cb): same.
- (print_preview_cb): same.
- (stop_loading_cb): same.
- (cut_contacts_cb): same.
- (copy_contacts_cb): same.
- (paste_contacts_cb): same.
- (select_all_contacts_cb): same.
- (send_contact_cb): same.
- (send_contact_to_cb): same.
- (copy_contact_to_cb): same.
- (move_contact_to_cb): same.
- (update_command_state): same.
- (change_view_type): nuke, nothing uses this.
- (control_activate): use the current view.
- (control_activate_cb): same.
- (source_list_changed_cb): new function, remove the notebook pages
- (and destroy the EABView's) for sources that no longer exist.
- (addressbook_view_clear): dispose of the uid_to_view hash.
- (book_open_cb): store the ESource on the EABView too. this
- function now takes a struct containing both EABView and ESource
- since we can't store either in the AddressbookView.
- (set_prop): if we have a view already for this uid, bring it up.
- otherwise create a new one and start the book loading.
- (addressbook_search_activated): nuked - this is being moved to
- e-addressbook-view.
- (addressbook_query_changed): same.
- (compare_subitems, make_subitems, ecml_changed,
- connect_master_list_changed): same.
- (addressbook_new_control): simplify things a bunch. create a
- notebook to store the views in. the search/vbox stuff is gone.
- use e_source_list_new_for_gconf_default, and handle the source
- list's "changed" signal.
-
-2003-12-17 Rodney Dawes <dobey@ximian.com>
-
- * gui/component/autocompletion-config.c:
- (autocompletion_config_control_new): Embed Tree in GtkScrolledWindow
-
-2003-12-16 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (contact_added_cb): Update
- the contact's UID after normal add.
-
-2003-12-16 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/addressbook.c (addressbook_show_load_error_dialog):
- Make a public function that shows an error dialog, which can be used
- when a source fails to load.
- (book_open_cb): Call addressbook_show_load_error_dialog () on error.
- (set_prop): Don't reuse the book when loading a new source. This was
- confusing the contact-editor, which gets the book passed in.
-
- * gui/contact-editor/e-contact-editor.c (e_contact_editor_class_init):
- Make "source_book" and "target_book" distinct properties.
- (new_target_cb): Implement.
- (source_selected): Implement.
- (contact_moved_cb): Implement.
- (contact_added_cb): Handle the case where source_book != target_book as
- a move - if the add was successful, remove contact from source book.
- (save_contact): Handle case where source_book != target_book.
- (delete_cb): "book" renamed to "source_book".
- (e_contact_editor_init): Set up source_selected signal.
- (e_contact_editor_dispose): Dispose of both source and target books.
- (e_contact_editor_new): "book" renamed to "source_book".
- (e_contact_editor_set_property): If a source book is set, and we don't
- have a target book, make target_book == source_book. Allow setting
- target book, and base editability on that. If we're editing an existing
- contact, treat book change as a change, and update command state.
- (e_contact_editor_get_property): Allow getting target book.
- (set_source_field): Indicate the selected book.
-
-2003-12-16 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (set_source_field): Implement.
- Makes the source menu reflect the source for the current book.
-
-2003-12-16 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c
- (e_contact_editor_create_source_option_menu): Implement. Creates
- source selection option menu.
-
- * gui/contact-editor/contact-editor.glade: Add source selection custom
- widget.
-
-2003-12-16 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/widgets/e-addressbook-table-adapter.c
- (addressbook_is_cell_editable): Disable cell editing.
-
-2003-12-15 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (address_to_text): Implement.
- (text_to_address): Implement, using EAddressWestern.
- (address_text_changed): Adapt to EContactAddress.
- (full_addr_clicked): Ditto. Fix field IDs.
- (e_contact_editor_init): Init address_choice.
- (_email_arrow_pressed): Fix field IDs.
- (_address_arrow_pressed): Adapt to EContactAddress and fix field IDs.
- (find_address_mailing): Leave out for now. Addresses don't have flags
- anymore...
- (set_fields): Adapt to EContactAddress and fix field IDs. Make sure
- changes to other widgets don't make us go back to the first listed
- address.
- (set_address_field): Adapt to EContactAddress and fix field IDs.
- (enable_writable_fields): Ditto.
- (fill_in_info): Disable find_address_mailing () for now.
-
-2003-12-10 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-editor/e-contact-editor-address.c
- (e_contact_editor_address_class_init): Make "address" a boxed type.
- (e_contact_editor_address_init): Set address to NULL.
- (e_contact_editor_address_dispose): Free address.
- (e_contact_editor_address_new): Take an EContactAddress.
- (e_contact_editor_address_set_property): Re-implement setting the
- address property.
- (e_contact_editor_address_get_property): Ditto for getting.
- (fill_in_info): Enable, use EContactAddress fields.
- (extract_info): Ditto.
-
- * gui/contact-editor/e-contact-editor-address.h:
- Re-enable the address field, as EContactAddress.
-
-2003-12-09 JP Rosevear <jpr@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c (fill_in_info):
- free email list properly
-
-2003-12-09 JP Rosevear <jpr@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c (extract_info):
- free the list, not unref it, and free the elements
-
- Fixes #51976
-
-2003-12-06 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-manager.c
- (open_book_cb): change prototype to fix warning, and change the
- comment to read load_source instead of load_uri (which isn't what
- we use anymore.)
- (update_completion_books): just use our source list for this.
- check the "completion" source property.
- (source_list_changed): recreate the completion books.
- (e_select_names_manager_init): connect to the source_list's
- changed signal.
- (e_select_names_manager_dispose): don't need to free the
- completion_uids list anymore.
-
- * gui/component/select-names/e-select-names-config.c
- (e_select_names_config_get_completion_books,
- e_select_names_config_set_completion_books,
- e_select_names_config_add_notification_completion_books): remove.
-
- * gui/component/select-names/e-select-names-config.h: remove the
- completion books calls, since we can just use the source list.
-
- * gui/component/component-factory.c (factory): create the
- autocompletion control.
-
- * gui/component/autocompletion-config.[ch]: new config control for
- selecting completion folders. Uses e-source-selector. Could
- probably be beautified a bit.
-
- * gui/component/Makefile.am (libevolution_addressbook_la_SOURCES):
- add autocompletion-config.[ch]
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in: remove
- the ldap config control server, and add the autocompletion one.
-
-2003-12-06 JP Rosevear <jpr@ximian.com>
-
- * */Makefile.am: Remove hard coded disable deprecated flags
-
-2003-12-05 JP Rosevear <jpr@ximian.com>
-
- * gui/component/select-names/select-names.glade: no more custom
- widget for the selection of the search source
-
- * gui/component/select-names/e-select-names.h: add member
-
- * gui/component/select-names/e-select-names.etspec: update model
- column
-
- * gui/component/select-names/e-select-names.c (find_first_source):
- find the first source in the list
- (addressbook_model_set_source): we have the source to set directly
- now
- (source_selected): listen for the source item to change
- (e_select_names_init): create a source option menu and hook it up
- (e_select_names_dispose): destroy the source list
- (e_select_names_new): do away with the config setup here
-
- * gui/component/select-names/e-select-names-manager.h: update
- members
-
- * gui/component/select-names/e-select-names-manager.c
- (update_completion_books): add books based on source uid
- (config_completion_books_changed_cb): handle the completion list
- changing
- (config_min_query_length_changed_cb): handle minimum query length
- changing
- (e_select_names_manager_new): we don't do the settings stuff here
- any more
- (e_select_names_manager_init): do the initial set up here for the
- book loaded and listen for changes
- (e_select_names_manager_dispose): destroy the new stuff
-
- * gui/component/select-names/e-select-names-config.[hc]: config
- information
-
- * gui/component/select-names/e-select-names-config-keys.h: the
- config keys
-
- * gui/component/select-names/e-select-names-bonobo.c
- (impl_SelectNames_activate_dialog): do away with the shell client
- stuff
-
- * gui/component/select-names/Makefile.am: build new files
-
-2003-12-05 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-model.c (book_view_loaded): call
- remove_book_view/free_data here as well, to guard against multiple
- book_view's being loaded.
-
-2003-12-05 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/widgets/e-addressbook-view.etspec: Clean up and sync with
- current model columns.
-
-2003-12-04 Christian Hammond <chipx86@gnupdate.org>
-
- * addressbook/gui/contact-editor/e-contact-editor-im.[ch],
- addressbook/gui/contact-editor/im.glade: Added a dialog for
- adding a new IM account.
- * addressbook/gui/contact-editor/Makefile.am: Added the previously
- mentioned files, and depend on camel for necessary MIME parsing.
-
- * addressbook/gui/contact-editor/contact-editor.[ch],
- addressbook/gui/contact-editor/contact-editor.glade: Add and implement
- the Instant Messaging tab.
-
-2003-12-03 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook.c
- (retrieve_shell_view_interface_from_control): Remove.
- (set_folder_bar_label): Remove.
- (addressbook_new_control): Don't connect.
-
-2003-12-03 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-config.c: Do not depend on
- e-folder-list.
-
- * gui/component/select-names/e-select-names.c: Remove dependency
- on evolution-folder-selector-button.
- (e_addressbook_create_folder_selector): Just return a FIXME label
- for now.
- (folder_selected): #if 0 out.
- (e_select_names_init): Do not connect.
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_activate_dialog): Don't get a shell_client
- arg anymore.
- (load_completion_books): Stub out.
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_new): Don't get an EvolutionShellClient anymore.
- Don't create the folder selector button for now.
-
- * gui/component/select-names/e-select-names.h: Remove dependency
- on evolution-shell-client.
-
- * gui/component/select-names/e-select-names-bonobo.c: Remove
- dependency on evolution-shell-client.
- (impl_SelectNames_activate_dialog): Stub out.
-
- * gui/widgets/eab-gui-util.c: Remove dependency on
- evolution-shell-client.
- (eab_transfer_contacts): Stub out.
-
-2003-12-02 Rodney Dawes <dobey@ximian.com>
-
- * gui/component/Makefile.am: Version the schemas
- * gui/component/apps_evolution_addressbook.schemas: Removed
- * gui/component/apps_evolution_addressbook.schemas.in.in: Added
-
-2003-12-02 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook.c (set_status_message): Call
- e_activity_handler_operation_finished() on the current activity ID
- when done.
-
-2003-12-01 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook.c (struct AddressbookView): Replace
- activity_client with activity_id.
- (set_status_message): Use the EActivityHandler from the
- AddressbookComponent.
-
- * gui/component/addressbook-component.c (struct
- _AddressbookComponentPrivate): New member activity_handler.
- (addressbook_component_init): Init.
- (impl_dispose): Unref.
- (addressbook_component_peek_activity_handler): New.
- (impl_createControls): Return an ETaskBar as the statusbar control
- and attach it to the activity handler.
-
-2003-12-01 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c (impl_createControls):
- Pass a label for the status bar control for now.
-
-2003-12-01 Larry Ewing <lewing@ximian.com>
-
- * gui/component/Makefile.am (INCLUDES): remove
- GTK_DISABLED_DEPRECATED so that we can build with gtk-2.3.
-
-2003-12-01 Rodney Dawes <dobey@ximian.com>
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in:
- * gui/component/addressbook-config.c:
- * gui/component/addressbook.c:
- * gui/component/component-factory.c:
- * gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in:
- * gui/component/select-names/e-select-names-bonobo.c:
- * gui/component/select-names/e-select-names-factory.c:
- * gui/widgets/eab-gui-util.c:
- * gui/widgets/eab-vcard-control.c: Use BASE_VERSION for repo_ids and
- OAFIIDs
-
-2003-12-01 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/ldap-config.glade: Fix start page text.
-
-2003-12-01 JP Rosevear <jpr@ximian.com>
-
- * conduit/Makefile.am: use privconduitdir
-
- * conduit/e-address.conduit.in: subst right thing
-
-2003-12-01 JP Rosevear <jpr@ximian.com>
-
- * conduit/e-address.conduit.in: specify privlibdir as the location
-
- * conduit/Makefile.am: install the conduit to privlibdir
-
-2003-12-01 JP Rosvear <jpr@ximian.com>
-
- * conduit/Makefile.am: version the .conduit file
-
-2003-12-01 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/new-addressbook.glade: Remove this too.
-
- * gui/component/Makefile.am (glade_DATA): Remove new-addressbook.glade.
-
-2003-12-01 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/Makefile.am (libevolution_addressbook_la_SOURCES):
- Remove addressbook-storage.[ch] and new-addressbook.[ch].
-
- * gui/component/addressbook-storage.[ch]: Removed from repository.
-
- * gui/component/new-addressbook.[ch]: Removed from repository.
-
- * gui/component/addressbook-component.c (load_uri_for_selection):
- Set source_uid property on view control, not folder_uri.
- (new_addressbook_cb): Call addressbook_config_create_new_source ().
- (edit_addressbook_cb): Implement.
- (fill_popup_menu_callback): Hook up edit_addressbook_cb ().
- (addressbook_component_init): Create the LDAP source group.
-
- * gui/component/addressbook-config.c (AddressbookSourceDialog):
- Take out the NEW_ADVANCED_UI stuff and add ESource related vars.
- (ldap_unparse_auth)
- (ldap_parse_auth)
- (ldap_unparse_scope)
- (ldap_unparse_ssl)
- (ldap_parse_ssl): Moved here from addressbook-storage.c.
- (addressbook_dialog_get_source)
- (addressbook_dialog_set_source)
- (objectclasses_create_server_table)
- (objectclasses_create_evolution_table)
- (objectclasses_add_foreach)
- (objectclasses_add)
- (objectclasses_sever_double_click)
- (objectclasses_remove_foreach)
- (objectclasses_remove)
- (objectclasses_evolution_double_click)
- (objectclasses_restore_default)
- (server_selection_model_changed)
- (evolution_selection_model_changed)
- (setup_objectclasses_tab): Nuke aging, unfinished NEW_ADVANCED_UI.
- (add_source_clicked)
- (edit_source_clicked)
- (delete_server)
- (delete_source_clicked)
- (ldap_config_control_destroy_callback)
- (ldap_config_control_apply_callback)
- (sources_selection_changed)
- (sources_table_row_activated)
- (ldap_dialog_new)
- (addressbook_dialog_create_sources_table)
- (ldap_config_control_new)
- (addressbook_config_control_new): Nuke config control.
- (create_source_dir)
- (dialog_to_source)
- (dialog_to_temp_source)
- (source_to_uri_parts)
- (source_to_dialog)
- (source_group_changed_cb)
- (source_group_menu_add_groups)
- (folder_page_forward)
- (finish_page_back): Implement.
- (addressbook_ldap_init): Take ESource instead of AddressbookSource.
- (addressbook_ldap_auth): Don't take a source, not needed.
- (addressbook_root_dse_query): Ditto.
- (addressbook_source_dialog_destroy): Clean up destroy function.
- (addressbook_add_server_druid_finish): Clean up, create ESource.
- (general_tab_check): If it's not LDAP, these options don't matter.
- (do_ldap_root_dse_query): Source no longer needed here.
- (query_for_supported_bases): Use a temp source generated from
- current dialog settings.
- (display_name_page_prepare): Renamed to folder_page_prepare ().
- (druid_display_name_page_modify_cb): Renamed to
- druid_folder_page_modify_cb ().
- (addressbook_add_server_druid): Set up source list, group selector.
- Make LDAP pages optional, dependent on selected group. Use ESource.
- (edit_dialog_store_change): Remove config control list stuff,
- export settings to ESource.
- (addressbook_edit_server_dialog): Renamed to
- addressbook_config_edit_source (), which takes an ESource. Remove
- config control list stuff, make LDAP pages show up only if we have
- an LDAP source. Remove NEW_ADVANCED_UI cruft.
- (addressbook_config_create_new_source): Just call
- addressbook_add_server_druid ().
-
- * gui/component/addressbook-config.h: Move LDAP enums here, from
- addressbook-storage.h.
-
- * gui/component/addressbook.c (control_activate_cb): uri -> source
- (addressbook_view_clear): Unref source list.
- (book_open_cb): Use ESource.
- (load_uri_auth_cb): Renamed to load_source_auth_cb (), manipulate
- ESource instead of URI.
- (get_remember_password): Implement.
- (set_remember_password): Implement.
- (addressbook_authenticate): Use ESource properties.
- (load_uri_cb): Renamed to load_source_cb (), ESource adaptation.
- (addressbook_load_uri): Renamed to addressbook_load_source (), takes
- ESource.
- (addressbook_load_default_book): ESource adaptation.
- (get_prop): folder_uri property -> source_uid property.
- (set_prop): folder_uri property -> source_uid property. Find ESource
- by UID.
- (addressbook_new_control): Set up source_uid property and ESourceList.
-
- * gui/component/component-factory.c (factory): Disable config control.
-
- * gui/component/ldap-config.glade: Druid and notebook dialogs
- generalized to deal with local sources as well as LDAP. This file
- should probably be renamed...
-
- * gui/component/select-names/e-select-names-manager.c
- (load_completion_books): Use addressbook_load_source (). However, this
- needs a bit more work to get source UIDs instead of URIs.
-
- * gui/component/select-names/e-select-names.c
- (addressbook_model_set_uri): Use addressbook_load_source (). However,
- this needs a bit more work to get source UIDs instead of URIs.
-
-2003-11-26 JP Rosevear <jpr@ximian.com>
-
- * gui/widgets/Makefile.am: turn on deprecated gtk and libgnomeui
- stuff
-
- * gui/component/select-names/Makefile.am: turn on deprecated gtk
- stuff
-
- * gui/contact-editor/Makefile.am: ditto
-
-2003-11-17 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/addressbook-component.c (impl_createControls): Store
- a ref to the source selector.
- (impl_requestCreateItem): Implement.
- (impl_dispose): Unref the source selector.
- (addressbook_component_init): Set up default sources.
-
- * gui/widgets/e-addressbook-model.c (eab_model_set_property): If
- the 'book' property is set, and editability changes, emit a signal
- to that effect.
-
-2003-11-14 JP Rosevear <jpr@ximian.com>
-
- * gui/component/new-addressbook.c: include e-source from e-d-s
-
-2003-11-13 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-model.c
- (contact_list_is_cell_editable): Return TRUE for all cells, for now.
-
- * gui/widgets/e-addressbook-table-adapter.c (card_modified_cb):
- Renamed to contact_modified_cb ().
- (addressbook_set_value_at): Port to use EContact instead of ECard.
- (addressbook_is_cell_editable): Ditto.
- (addressbook_append_row): Ditto.
-
- * gui/widgets/e-minicard-label.c (e_minicard_label_set_property):
- Make not editable, ever, and add a comment to this effect.
- (e_minicard_label_realize): Ditto.
-
- * gui/widgets/e-minicard.c (e_minicard_set_property): Ditto.
- (add_field): Ditto.
-
-2003-11-13 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c
- (impl__get_userCreatableItems): New, implementation for the
- userCreatableItems property.
- (impl_requestCreateItem): New, implementation for the
- requestCreateItem method.
- (addressbook_component_class_init): Install.
-
-2003-11-12 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in: Add
- component_alias of "contacts".
-
-2003-11-08 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component/Makefile.am (libevolution_addressbook_la_SOURCES):
- Add new-addressbook.[ch].
- (glade_DATA): Add new-addressbook.glade.
-
- * gui/component/addressbook-component.c (add_popup_menu_item):
- Implement.
- (new_addressbook_cb): Implement.
- (delete_addressbook_cb): Implement (skeletal).
- (fill_popup_menu_callback): Implement.
- (impl_createControls): Hook up fill_popup_menu_callback().
-
- * gui/component/new-addressbook.[ch]: New files.
-
- * gui/component/new-addressbook.glade: New file.
-
-2003-11-07 Dan Winship <danw@ximian.com>
-
- * util/Makefile.am (INCLUDES): Remove some includes of directories
- that don't exist any more
-
-2003-11-07 JP Rosevear <jpr@ximian.com>
-
- * gui/contact-editor/Makefile.am: don't include the c marshaller
- file twice
-
- * gui/widgets/Makefile.am: ditto
-
-2003-11-07 JP Rosevear <jpr@ximian.com>
-
- * gui/widgets/Makefile.am: make sure the marshal header is in the
- source list
-
- * gui/component/select-names/Makefile.am: ditto
-
- * gui/contact-editor/Makefile.am: ditto
-
- * gui/contact-list-editor/Makefile.am: ditto
-
-2003-11-07 JP Rosevear <jpr@ximian.com>
-
- * util/Makefile.am: dist the marshal list
-
-2003-11-07 JP Rosevear <jpr@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (change_view_type): don't
- destroy the widget here - its dead when removed from the paned
- container
-
-2003-11-07 JP Rosevear <jpr@ximian.com>
-
- * In the gui this is a search and replace commit for moving the
- addressbook to evolution-data-server; it also deletes the old
- backend files
-
-2003-11-05 Larry Ewing <lewing@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (create_minicard_view): fix cast.
-
-2003-11-03 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/select-names/e-select-names-factory.c: Update
- factory ID.
-
- * gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in:
- Version the SelectNames server IDs by appending a "_2".
-
-2003-11-03 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in: Change
- "evolution:config_item" into "evolution2:config_item".
-
-2003-10-29 Chris Toshok <toshok@ximian.com>
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in: add the
- S/MIME config control here.
-
-2003-10-29 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book-listener.c (e_book_listener_new): change
- the poa hint to PER_REQUEST. fixes a couple of deadlocks.
-
-2003-10-29 Chris Toshok <toshok@ximian.com>
-
- * gui/component/component-factory.c (factory): ifdef the smime
- code with HAVE_NSS.
-
- * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD):
- conditionally include libevolution-smime.la.
-
-2003-10-24 Dan Winship <danw@ximian.com>
-
- * backend/pas/Makefile.am (libpas_la_LIBADD): libpas should depend
- on libebook, but NOT on libpasfile, etc, since it needs to be
- linked into all backends, not just the wombat.
- (libpasfile_la_LIBADD): depend on libpas.la and libedb3util.la
- (libpasvcf_la_LIBADD): depend on libpas.la
- (libpasldap_la_LIBADD): depend on libpas.la and $(LDAP_LIBS)
-
-2003-10-23 Dan Winship <danw@ximian.com>
-
- * backend/ebook/e-contact.c (e_contact_date_equal): new util func
-
- * backend/pas/pas-backend-ldap.c (anniversary_compare,
- birthday_compare): Use it
-
- * backend/pas/pas-backend-summary.c
- (pas_backend_summary_check_contact): Check if an ID exists in the
- summary.
-
-2003-10-23 Chris Toshok <toshok@ximian.com>
-
- * tools/Makefile.am: convert 8 spaces to a tab.
-
- * tools/.cvsignore: ignore evolution-addressbook-abuse and
- evolution-addressbook-clean.
-
- * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD):
- add libevolution-smime.la.
-
- * gui/component/component-factory.c (factory): add the certificate
- manager config control stuff here, at least for now.
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in: same.
-
-2003-10-23 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/component/addressbook-config.c
- (addressbook_dialog_create_source_table): fixed typo in variable name.
-
-2003-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in: Add an
- "evolution:button_icon" attribute.
-
-2003-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in: Add an
- "evolution:button_sort_order" property.
-
-2003-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c (impl_createControls):
- Make the the scrolled window have an "in" shadow.
- * gui/component/addressbook-config.c
- (addressbook_dialog_create_sources_table): Likewise.
- * gui/widgets/e-addressbook-view.c (create_minicard_view): Likewise.
- (create_treeview_view): Likewise.
-
-2003-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c (impl_createControls): Set
- the GtkScrolledWindow scrollbar policy to "automatic" for both the
- horizontal and the vertical scrollbar.
-
-2003-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in: Add an
- "evolution:button_label" property on the component for use in the
- shell.
-
-2003-10-21 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c: make it work with the new ebook api
-
- * backend/pas/pas-book.c (pas_book_respond_get_changes): put the
- vcard in for every change
-
- * backend/pas/pas-backend.c (pas_backend_change_add_new): just use
- the vcard field
- (pas_backend_change_modify_new): ditto
- (pas_backend_change_delete_new): ditto
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_changes_foreach_key): create a fake contact with
- the uid
- (pas_backend_file_get_changes): add the card to the changes
-
- * backend/ebook/tests/ebook/test-changes.c (main): just print the
- uid
-
- * backend/ebook/e-book.c (e_book_free_change_list): unref the
- contact
-
- * backend/ebook/e-book-types.h: the change struct contains an
- EContact now
-
- * backend/ebook/e-book-listener.c
- (impl_BookListener_respond_get_changes): create the contact from
- the vcard string
-
- * backend/idl/addressbook.idl: Book change item is no longer a
- union, it always gives back a card
-
-2003-10-21 Chris Toshok <toshok@ximian.com>
-
- * tools/evolution-addressbook-abuse.c: use the synchronous api for
- this. simplifies it a bunch.
-
-2003-10-21 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-book.c
- (impl_GNOME_Evolution_Addressbook_Book_remove): we can ill afford
- bad debug spew.
- (view_listener_died_cb): implement.
- (impl_GNOME_Evolution_Addressbook_Book_getBookView): hook up an
- ORBit_small connection listener on the view's listener.
- (pas_book_respond_create): use e_contact_get_const instead of
- e_contact_get here. fixes a leak.
-
- * backend/pas/pas-book-view.c
- (impl_GNOME_Evolution_Addressbook_BookView_stop): implement, call
- pas_backend_stop_book_view.
- (pas_book_view_get_listener): return the book view's listener.
- (pas_book_view_class_init): fill in epv->stop.
- (pas_book_view_init): use a #define for THRESHOLD_MAX instead of
- the constant.
-
- * backend/pas/pas-book-view.h: add prototype for
- pas_book_view_get_listener.
-
- * backend/pas/pas-backend.c (pas_backend_stop_book_view):
- implement.
- (pas_backend_remove_book_view): implement.
-
- * backend/pas/pas-backend.h: add prototype for stop_book_view and
- remove_book_view.
-
- * backend/pas/pas-backend-vcf.c (load_file): pass in the fd and
- use fdopen here.
- (foreach_build_list): don't creat EContacts here, because we'll
- just be converting them back to vcards anyway.
- (save_file): use char*'s instead of EContacts, and split entries
- with 2 blank lines. Also, hold the lock over the entire function.
- (do_create): hold the lock around uid generation and touching the
- hash table.
- (pas_backend_vcf_process_remove_contacts): same.
- (pas_backend_vcf_process_modify_contact): same.
- (pas_backend_vcf_stop_book_view): new function, but leave
- unimplemented for now.
- (pas_backend_vcf_load_uri): the uri contains the directory name,
- not the filename.
- (pas_backend_vcf_dispose): grab the lock here just for sanity's
- sake. Also reorder things a bit, and free the hashtable and
- mutex.
- (pas_backend_vcf_init): init the mutex.
-
- * backend/pas/pas-backend-summary.c
- (pas_backend_summary_add_contact): don't unref the contact here.
-
- * backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_process_stop_book_view): new function, but leave
- unimplemented for now.
-
- * backend/pas/pas-backend-file.c (build_summary): use an EContact
- for this call.
- (do_summary_query): nuke, the contents of this has been moved to
- start_book_view.
- (pas_backend_file_search_timeout): same.
- (pas_backend_file_search): same.
- (pas_backend_file_start_book_view): glom everything into here
- involving searching. This function could (and should) be renamed
- and reused from both this function and _get_contact_list.
- (pas_backend_file_stop_book_view): new function.
- (pas_backend_file_class_init): fill in backend->stop_book_view.
-
- * backend/pas/Makefile.am (LDAP_BACKEND): libpasldap.a ->
- libpasldap.la
- (noinst_LTLIBRARIES): *.a -> *.la.
- (libpas_la_SOURCES): same.
- (libpasfile_la_SOURCES): same.
- (libpasvcf_la_SOURCES): same.
- (libpasldap_la_SOURCES): same.
-
- * backend/idl/addressbook.idl: add BookView::stop.
-
- * backend/ebook/e-vcard.c (read_attribute_value): fix GString
- related leaks.
- (read_attribute_params): same.
- (parse): don't leak the EVCardAttributes corresponding to
- BEGIN/END:vCard.
- (free_gstring): new function
- (e_vcard_attribute_remove_values): free the decoded_values list,
- using free_gstring.
-
- * backend/ebook/e-book.c (e_book_response_get_book_view): ref the
- listener here.
-
- * backend/ebook/e-book-view.h: add prototype for e_book_view_stop.
-
- * backend/ebook/e-book-view.c (e_book_view_stop): new function.
-
- * backend/ebook/e-book-async.c (_get_book_view_response_dtor):
- unref the book view.
-
-2003-10-20 Dan Winship <danw@ximian.com>
-
- * backend/pas/pas-book-view.c: Queue up removes and modifies as
- well as adds, and remove the calls that took a list of changes
- rather than a single change, since no one was really using the
- list versions. Keep a list of IDs currently in the view so we can
- more easily figure out what changes count as adds, modifies, and
- removes.
- (send_pending_adds): Don't reset next_threshold if it's being
- called from notify_add.
- (send_pending_changes, send_pending_removes): New
- (pas_book_view_notify_update): Simplified add/change interface.
- Takes an EContact and figures out if it's new, modified, or
- removed relative to this view.
- (pas_book_view_notify_change, pas_book_view_notify_change_1,
- pas_book_view_notify_add, pas_book_view_notify_add_1): Gone.
- (pas_book_view_notify_remove): Now does what remove_1 used to do.
- (pas_book_view_vcard_matches): Remove this; no longer used.
-
- * backend/pas/pas-backend.c (pas_backend_notify_update): New.
- Calls pas_book_view_notify_update() on each of the backend's views.
- (pas_backend_notify_remove): Likewise for notify_remove().
- (pas_backend_notify_complete): And notify_complete().
-
- * backend/pas/pas-book.c (pas_book_respond_create): Take an
- EContact instead of an id and a vcard. Use
- pas_backend_notify_update.
- (pas_book_respond_remove_contacts): Use pas_backend_notify_remove.
- (pas_book_respond_modify): Take a single EContact instead of two
- vcards. Use pas_backend_notify_update.
-
- * backend/pas/pas-backend-sync.c
- (pas_backend_sync_create_contact): Return an EContact rather than
- an id.
- (pas_backend_sync_modify_contact): Return an EContact rather than
- the old_vcard.
- (_pas_backend_create_contact, _pas_backend_modify_contact): Update
-
- * backend/pas/pas-backend-file.c (do_summary_query): Use
- pas_book_view_notify_update.
- (pas_backend_file_search_timeout): Likewise
- (pas_backend_file_create_contact): Update for API changes
- (pas_backend_file_modify_contact): Likewise.
-
- * backend/pas/pas-backend-ldap.c (create_contact_handler,
- pas_backend_ldap_process_create_contact): Update for API changes
- (modify_contact_modify_handler, modify_contact_search_handler,
- pas_backend_ldap_process_modify_contact): Likewise
- (ldap_search_handler): Use pas_book_view_notify_update
-
- * backend/pas/pas-backend-vcf.c (foreach_search_compare): Use
- pas_book_view_notify_update.
- (pas_backend_vcf_process_create_contact): Update for API changes
- (pas_backend_vcf_process_modify_contact): Likewise
-
- * backend/pas/pas-backend-summary.c
- (pas_backend_summary_add_contact): Take an EContact instead of a
- const char *vcard.
-
- * backend/ebook/e-contact.c (photo_getter): s/malloc/g_malloc/
-
-2003-10-20 JP Rosevear <jpr@ximian.com>
-
- * backend/pas/pas-backend-vcf.c (pas_backend_vcf_search): compiler
- with non-c99 compilers
-
-2003-10-17 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-contact.c (fn_getter): new function, just return
- the full name value.
- (fn_setter): rather distasteful hack. set the N attribute if it's
- not already present.
- (n_setter): set the X-EVOLUTION-FILE-AS attribute if it's not
- already set.
-
- * backend/pas/pas-backend-ldap.c (prop_info): add PROP_WRITE_ONLY
- flag for properties (right now just 'sn') that we don't want to
- use when building the EContact - we only use it when storing the
- contact out to the ldap server.
- (build_contact_from_entry): skip WRITE_ONLY properties.
-
-2003-10-17 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (init_collection): add the
- minicard factory back in.
- (display_view): add the minicard case back in.
- (get_selection_model): same.
- (minicard_right_click): resurrect.
- (create_minicard_view): same.
- (change_view_type): add the minicard case back in.
- (eab_view_print): same.
- (eab_view_print_preview): same.
-
- * gui/widgets/e-addressbook-view.h (EABViewType): add MINICARD
- back in.
-
- * gui/widgets/e-addressbook-model.c (eab_model_new):
- E_TYPE_AB_MODEL -> EAB_TYPE_MODEL.
-
- * gui/widgets/e-addressbook-model.h: rename E_TYPE_AB_MODEL to
- EAB_TYPE_MODEL.
-
- * gui/widgets/Makefile.am (libeabwidgets_la_SOURCES): add the
- minicard stuff back into the build.
-
- * gui/widgets/e-addressbook-reflow-adapter.[ch],
- gui/widgets/e-minicard-label.[ch],
- gui/widgets/e-minicard-view-widget.[ch],
- gui/widgets/e-minicard-view.[ch], gui/widgets/e-minicard.[ch],
- gui/widgets/gal-view-factory-minicard.[ch], gal-view-minicard.h:
- resurrect the minicard stuff, in a new uneditable,
- EContact-friendly state. no in-place editing anymore.
-
-
-2003-10-10 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (fill_in_info): un-ifdef
- the date handling code.
- (extract_info): same.
-
- * backend/pas/pas-backend-ldap.c (prop_info): add the address
- labels and dates to the build.
- (anniversary_populate): un-ifdef and get this working.
- (anniversary_ber): same.
- (anniversary_compare): same.
- (birthday_populate): same.
- (birthday_ber): same.
- (birthday_compare): same.
-
- * backend/ebook/tests/ebook/.cvsignore,
- backend/ebook/tests/ebook/Makefile.am
- backend/ebook/tests/ebook/test-date.c: add a test for EContactDate
- getting/setting.
-
- * backend/ebook/e-vcard.h: add EVC_BDAY.
-
- * backend/ebook/e-contact.h: add prototypes for the
- e_contact_date_* functions.
-
- * backend/ebook/e-contact.c (field_info): add
- BIRTH_DATE/ANNIVERSARY fields.
- (date_getter): new
- (date_setter): new
- (e_contact_date_new): new
- (e_contact_date_from_string): new
- (e_contact_date_to_string): new
- (e_contact_date_free): new
-
-2003-10-10 Not Zed <NotZed@Ximian.com>
-
- *
- gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in:
- Use the main factory on the .so file, so it can be found.
-
-2003-10-08 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names.c (contact_key): add a
- descriptive comment about this "#if notyet".
-
- * gui/component/select-names/e-select-names-model.h
- (e_select_names_model_thaw): add prorotype for
- e_select_names_model_cancel_all_contact_load.
-
- * gui/component/select-names/e-select-names-bonobo.c
- (_EntryPropertyID): remove the SIMPLE_CARD_LIST property.
- (entry_get_property_fn): same.
- (impl_SelectNames_get_entry_for_section): same.
-
- * backend/ebook/e-contact.h: add prototype for
- e_contact_name_to_string.
-
-2003-10-07 Chris Toshok <toshok@ximian.com>
-
- * util/eab-book-util.c: remove a bunch of ifdef'ed code (that's
- going to be living in e-book.c)
-
- * backend/pas/pas-backend-summary.c
- (pas_backend_summary_add_contact): un-ifdef some code.
- (pas_backend_summary_get_summary_vcard): same.
-
- * backend/pas/pas-backend-ldap.c (prop_info): remove the
- query_prop field since we can get it from e_contact_field_name.
- also remove it from all the macros and their uses.
- (homephone_populate): un-ifdef.
- (homephone_ber): same.
- (homephone_compare): same.
- (business_populate): same.
- (business_ber): same.
- (business_compare): same.
- (query_prop_to_ldap): use e_contact_field_name to get the query
- prop for a given attribute.
- (add_oc_attributes_to_supported_fields): same.
-
- * backend/pas/pas-backend-card-sexp.c (compare_phone): use the new
- EContactField constants to iterate over the phone list.
-
- * backend/ebook/e-contact.h (EContactField): add some useful
- constants for those pieces of code that iterate over
- email/phones/addresses.
-
-2003-10-07 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/eab-vcard-control.c (book_open_cb): un-ifdef this.
- (eab_vcard_control_new): put the buttons above the vcard so they
- don't move when it's expanded.
-
- * gui/widgets/eab-popup-control.h: remove prototypes for
- eab_popup_control_set_name and eab_popup_control_set_email.
-
- * gui/widgets/eab-popup-control.c (email_table_ok_cb): remove the
- stupid idle function and do the work here.
- (eab_popup_control_set_name): make this static - noone uses it.
- (eab_popup_control_set_email): same.
-
- * gui/widgets/eab-gui-util.c (eab_show_contact_editor):
- e_contact_editor_new is what we use for the time being.
-
- * gui/widgets/eab-contact-display.c (render_string): abstract this
- code out.
- (render_url): same.
- (eab_contact_display_render_normal): make use of render_string and
- render_url.
-
- * gui/widgets/e-addressbook-view.c (delete): un-ifdef this and get
- it working.
- (selection_received): same.
-
- * gui/widgets/e-addressbook-model.c (get_view): nuke some code
- that was moved to another function.
- (eab_model_set_property): get the writable state when we set the
- book - don't rely on the timing of signals.
-
- * gui/contact/editor/contact-editor.glade: add the blog field
- below the homepage url field.
-
- * gui/contact/editor/e-contact-editor-address.[ch]: get this
- building with the new stuff.
-
- * gui/contact/editor/e-contact-editor-fullname.[ch]: get this
- building with the new stuff.
-
- * gui/contact-editor/e-contact-editor.[ch]: get this most of the
- way there.
-
- * gui/contact-editor/e-contact-quick-add.[ch]: get this building
- with the new stuff.
-
- * gui/contact-editor/Makefile.am (libecontacteditor_la_SOURCES):
- remove e-contact-save-as.[ch]. They're in
- addressbook/widgets/eab-gui-util.[ch] now.
-
- * gui/merging/Makefile.am: track all the naming changes.
-
- * gui/merging/*.glade: gratuitous renaming.
-
- * gui/merging/eab-contact-compare.[ch]: gratuitous renaming, and
- move this from the old ebook/
-
- * gui/merging/eab-contact-merging.[ch]: gratuitous renaming.
-
- * backend/ebook/e-contact.[ch]: lots of overly complicated changes
- for an overly complicated piece of code.
-
- * backend/ebook/e-book-view.c (e_book_view_do_added_event): remove
- some ifdef'ed code.
- (e_book_view_do_modified_event): same.
-
- * backend/ebook/e-vcard.c (parse): plug a memory leak.
- (escape_string): deal with @s being NULL.
- (e_vcard_remove_attribute): new function.
- (e_vcard_attribute_remove_params): same.
- (e_vcard_attribute_param_free): same.
- (e_vcard_attribute_param_remove_values): same.
-
- * backend/ebook/e-vcard.h: add prototypes for
- e_vcard_remove_attribute, e_vcard_attribute_remove_params, and
- e_vcard_attribute_param_remove_values.
-
- * backend/ebook/e-book.c (e_book_handle_response): cache the
- writable state of the ebook before generating the signal.
- (e_book_unload_uri): initialize cap to NULL and writable to FALSE.
-
- * backend/ebook/e-book.h: add prototype for e_book_is_writable.
-
- * backend/ebook/e-book-async.c (_get_fields_response_handler):
- don't call the callback if it's NULL.
- (_get_methods_response_handler): same.
- (_auth_user_response_handler): same.
- (_get_contact_response_handler): same.
- (_remove_contacts_response_handler): same.
- (_add_contact_response_handler): same.
- (_commit_contact_response_handler): same.
- (_get_book_view_response_handler): same.
- (_get_contacts_response_handler): same.
- (_remove_contacts_dtor): free the list.
- (e_book_async_remove_contacts): duplicate the list.
-
- * backend/pas/pas-backend.c (pas_backend_open): if we successfully
- load the uri, report the writable status back.
-
- * backend/pas/pas-backend-sync.c (_pas_backend_remove_contacts):
- free the list of ids.
-
- * backend/pas/pas-backend-file.c (do_create): return the contact
- we create here.
- (pas_backend_file_create_contact): format the newly created
- contact as a string to add to the summary.
- (pas_backend_file_remove_contacts): don't free the list of removed
- cards here - it happens in pas-backend-sync.
- (pas_backend_file_load_uri): pass NULL for @contact to do_create.
-
-2003-10-01 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/eab-contact-display.c (render_address): move the :'s
- inside the <b>'s. Thanks for pointing this out, guenther. :)
- (eab_contact_display_render_normal): same.
- (eab_contact_display_render_compact): same.
-
- * gui/widgets/eab-vcard-control.c (save_in_addressbook): track
- change to address_load_default_book.
-
-2003-10-01 Chris Toshok <toshok@ximian.com>
-
- * gui/component/Makefile.am: remove some commented out crap about
- e-address-popup.[ch].
-
- * gui/component/component-factory.c (factory): use
- eab_popup_control_new for the AddressPopup iid.
-
- * gui/widgets/Makefile.am (libeabwidgets_la_SOURCES): add
- eab-popup-control.[ch].
-
- * backend/ebook/e-book.c (e_book_get_default_addressbook): hack
- this so it at least sorta works - hardcode the
- ~/evolution/local/Contacts uri for now.
-
- * gui/component/addressbook.[ch] (addressbook_load_default_book):
- remove the EBook argument, and call
- e_book_async_get_default_addressbook.
-
- * gui/component/e-address-popup.[ch]: nuke.
-
- * gui/widgets/eab-popup-control.c: rename
- gui/component/e-address-popup.c to this.
-
- * gui/widgets/eab-popup-control.h: rename
- gui/component/e-address-popup.h to this.
-
- * backend/ebook/e-book-async.h: add prototype for
- e_book_async_get_default_addressbook.
-
- * backend/ebook/e-book-async.c
- (e_book_async_get_default_addressbook): new function.
-
-2003-10-01 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (eab_view_new): create the
- scrolled window to embed the EABContactDisplay widget inside of.
-
- * gui/widgets/e-addressbook-view.h (struct _EABView): add scrolled;
-
- * gui/widgets/eab-contact-display.h: add
- EABContactDisplayRenderMode enum, and add @render_mode arg to
- eab_contact_display_render.
-
- * gui/widgets/eab-contact-display.c
- (eab_contact_display_render_compact): new function, render a
- compact format suitable for inclusion in the mail display.
- (eab_contact_display_render_normal): move the previouw contents of
- eab_contact_display_render here.
- (eab_contact_display_render): render in either compact or normal
- mode depending on @mode.
- (eab_contact_display_new): remove the scrolled window stuff from
- here, as in the compact mode we don't want it present. push it up
- into the e-addressbook-view.c code.
-
- * gui/widgets/eab-vcard-control.[ch]: bonobo control that wraps up
- the EABContactDisplay stuff and lets us display vcards in a pretty
- format in mail messages.
-
- * gui/component/component-factory.c (factory): replace the #if
- notyet'ed minicard control code with the new vcard control.
-
- * gui/component/Makefile.am (INCLUDES): remove gui/minicard.
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in: remove
- the MiniCard_Control iid, and replace it with VCard_Control.
-
-2003-10-01 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c
- (destination_folder_handle_drop): use
- eab_contact_list_from_string, and un-"#if notyet" this.
-
- * gui/component/addressbook.c: remove #include
- "e-contact-save-as.h"
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (file_save_as_cb): use eab_contact_save.
- (file_send_as_cb): use eab_send_contact, un-"#if notyet" this.
- (file_send_to_cb): same.
- (table_drag_data_received_cb): use eab_contact_list_from_string.
-
- * gui/widgets/e-addressbook-reflow-adapter.[ch]: nuke. last
- vestiges of the minicard view.
-
- * gui/widgets/e-addressbook-view.c (eab_view_init):
- s/clipboard_cards/cliboard_contacts.
- (eab_view_dispose): same.
- (get_contact_list_1): s/card/contact
- (get_contact_list): same.
- (save_as): same, and use eab_contact_list_save.
- (send_as): reenable this code, s/card/contact, and use
- eab_send_contact_list.
- (send_to): same.
- (print): s/card/contact.
- (delete): same.
- (new_card): same, and un-"#if notyet" some code.
- (selection_get): use eab_contact_list_to_string.
- (selection_clear_event): s/card/contact
- (selection_received): same.
- (get_selected_contacts): same.
- (eab_view_save_as): same, and use eab_contact_list_save.
- (eab_view_view): same, and use eab_show_multiple_contacts.
- (eab_view_send): reenable this code, s/card/contact, and use
- eab_send_contact_list.
- (eab_view_send_to): same.
- (eab_view_copy): s/card/contact.
- (view_transfer_contacts): same.
- (eab_view_copy_to_folder): same.
- (eab_view_move_to_folder): same.
-
- * gui/widgets/e-addressbook-view.h (struct _EABView): rename
- clipboard_cards to clipboard_contacts.
-
- * gui/widgets/eab-gui-util.c (view_contacts): un-"#if notyet"
- (file_exists): moved from e-contact-save-as.c
- (save_it): same.
- (close_it): same.
- (destroy_it): same.
- (make_safe_filename): same.
- (eab_contact_save): same, and renamed from e_contact_save_as.
- (eab_contact_list_save): same, and renamed from
- e_contact_list_save_as.
- (contact_deleted_cb): s/card/contact.
- (do_delete): same, and use e_book_async.
- (delete_contacts): s/card/contact.
- (process_unref): same.
- (contact_added_cb): same.
- (do_copy): same, and use e_book_async.
- (got_book_cb): same.
- (eab_transfer_contacts): same, and use e_book_async.
- (eab_send_contact_list): s/card/contact
- (eab_send_contact): same.
-
- * gui/widgets/eab-gui-util.h: some random s/card/contact work, and
- move the contents of e-contact-save-as.h here.
-
- * util/eab-book-util.c (eab_contact_list_from_string): rename
- eab_load_contacts_from_string to this.
- (eab_contact_list_to_string): new function.
-
- * util/eab-book-util.h: add prototype for
- eab_contact_list_to_string, and rename
- eab_load_contacts_from_string to eab_contact_list_from_string.
-
- * gui/contact-editor/e-contact-save-as.[ch]: nuke. the contents
- of these files has been wrapped up in
- gui/widgets/eab-gui-util.[ch].
-
-2003-09-30 Chris Toshok <toshok@ximian.com>
-
- * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD):
- add libecontactlisteditor.la back into the build.
-
- * gui/component/addressbook-component.c (new_item_cb): enable the
- contact list editor portion.
-
- * util/eab-book-util.c (eab_load_contacts_from_string): new
- function, return a GList of EContact*'s parsed from the string.
-
- * util/eab-book-util.h: add prototype for
- eab_load_contacts_from_string.
-
- * gui/contact-list-editor/contact-list-editor.glade: set the id of
- the list-image widget.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (e_contact_list_editor_class_init): PROP_CARD -> PROP_CONTACT.
- (e_contact_list_editor_init): initialize image_buf to null and
- card -> contact. also, hook up the dnd signals on the list_image
- widget so we can drop images.
- (e_contact_list_editor_dispose): free the image_buf.
- (list_added_cb): card -> contact.
- (list_modified_cb): same.
- (save_contact): same, and use the ebook-async api.
- (prompt_to_save_changes): card -> contact.
- (file_save_cb): same.
- (file_save_as_cb): same.
- (file_send_as_cb): #if notyet for now.
- (file_send_to_cb): same.
- (tb_save_and_close_cb): card -> contact.
- (list_deleted_cb): same.
- (delete_cb): same.
- (delete_cb): same, and use ebook-async.
- (e_contact_list_editor_new): card -> contact.
- (e_contact_list_editor_set_property): same.
- (table_drag_motion_cb): use GDK_POINTER_TO_ATOM instead of
- casting.
- (table_drag_data_received_cb): use eab_load_contacts_from_string,
- and card -> contact.
- (set_image_from_data): new function. create a pixbuf from the
- image data and composite it in an image that's the same size as
- the initial list_image widget.
- (image_drag_motion_cb): new function.
- (image_drag_drop_cb): new function.
- (image_drag_data_received_cb): new function.
- (extract_info): port to EContact, and add support for the image.
- (fill_in_info): same.
-
- * gui/contact-list-editor/e-contact-list-editor.h (struct
- _EContactListEditor): add image stuff, and ECard -> EContact.
-
- * gui/contact-list-editor/e-contact-list-model.c
- (contact_list_value_at): e_destination -> eab_destination.
- (e_contact_list_model_init): same.
- (e_contact_list_model_add_destination): same.
- (e_contact_list_model_add_email): same.
- (e_contact_list_model_add_contact): same, and card -> contact.
- (e_contact_list_model_remove_row): e_destination ->
- eab_destination.
- (e_contact_list_model_get_destination): same.
-
- * gui/contact-list-editor/e-contact-list-model.h: card -> contact,
- and e-destination -> eab-destination.
-
- * gui/widgets/e-addressbook-view.etspec: fix a couple of
- fields.. this needs a completely once-over at some point soon.
-
- * gui/widgets/e-addressbook-view.c (table_double_click): reenable
- all of this.
-
- * gui/widgets/eab-contact-display.c (render_address): use
- e_text_to_html to convert the \n's to <br>'s.
- (on_url_requested): get PHOTO if there is one, otherwise LOGO.
- (eab_contact_display_render): escape all the text we're sending to
- gtkhtml with e_text_to_html. also, if it's a contact list, output
- _("List Members") with the contents of _EMAIL.
-
- * gui/widgets/eab-gui-util.h: rename eab_send_card{_list} to
- eab_send_contact{_list}.
-
-2003-09-30 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/tests/ebook/Makefile.am (noinst_PROGRAMS): add
- test-string.
-
- * backend/ebook/tests/ebook/test-string.c: test setting/getting a
- string attribute.
-
- * backend/ebook/e-contact.c (photo_setter): do gnome-vfs mime type
- sniffing before we set the attribute value.
- (e_contact_set_property): implement setting of MULTI list
- attributes (like MAIL).
- (e_contact_get_property): rework the ATTR_TYPE attribute handling
- so we aren't calling g_value_set_pointer on a value that holds a
- string (and vice versa).
-
- * backend/ebook/e-vcard.c (e_vcard_remove_attributes): implement.
- (e_vcard_attribute_add_param): use g_ascii_strcasecmp.
-
- * backend/ebook/e-vcard.h: rename e_vcard_remove_attribute to
- e_vcard_remove_attributes, since it removes all matching
- attributes.
-
- * backend/ebook/e-book.c (e_book_response_add_contact): we need to
- strdup the id here since the listener frees it.
- (e_book_handle_response): implement the WritableStatusEvent part
- of the switch.
-
- * backend/ebook/e-book-listener.c
- (impl_BookListener_report_writable): un-"#if notyet" this.
-
- * backend/ebook/e-book-async.c (_add_contact_handler): fill in
- response->id.
-
-2003-09-29 Chris Toshok <toshok@ximian.com>
-
- * printing/e-contact-print-envelope.c: card -> contact.
-
- * printing/e-contact-print-envelope.h: card -> contact.
-
- * printing/e-contact-print.c: card -> contact.
-
- * printing/e-contact-print.h: card -> contact.
-
- * printing/Makefile.am (contact_print_test_LDADD): add
- libeabutil.la and reorder things so it links.
- (contact_print_style_editor_test_LDADD): same.
-
-2003-09-29 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-text-model.c:
- e-addressbook-util.h -> eab-gui-util.h.
-
- * gui/component/select-names/e-select-names-popup.c:
- e-addressbook-util.h -> eab-gui-util.h.
-
- * gui/component/e-address-popup.c: e-addressbook-util.h ->
- eab-gui-util.h.
-
- * gui/component/component-factory.c: #if notyet the minicard
- control stuff, since it's been completely nuked from the tree.
-
- * gui/component/addressbook.c: e-addressbook-util.h ->
- eab-gui-util.h.
-
- * gui/component/addressbook-component.c: e-addressbook-util.h ->
- eab-gui-util.h.
-
- * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD):
- rename libeminicard to libeabwidgets.
-
- * Makefile.am (SUBDIRS): add util/ to the build.
-
-2003-09-29 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-treeview-adapter.c:
- e-addressbook-util.h -> eab-gui-util.h, and convert some
- EDestination code to EABDestination.
-
- * gui/widgets/e-addressbook-table-adapter.c: e-addressbook-util.h
- -> eab-gui-util.h, and include util/eab-destination.h.
- (addressbook_value_at): un-#if 0 some code.
-
- * gui/widgets/e-addressbook-model.c: e-addressbook-util.h ->
- eab-gui-util.h
-
- * gui/widgets/e-addressbook-view.c: e-addressbook-util.h ->
- eab-gui-util.h
-
- * gui/widgets/e-minicard-control.c,
- gui/widgets/e-minicard-control.h, gui/widgets/e-minicard-label.c,
- gui/widgets/e-minicard-label.h,
- gui/widgets/e-minicard-view-widget.c,
- gui/widgets/e-minicard-view-widget.h,
- gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h,
- gui/widgets/e-minicard-widget-test.c,
- gui/widgets/e-minicard-widget.c, gui/widgets/e-minicard-widget.h,
- gui/widgets/e-minicard.c, gui/widgets/e-minicard.h,
- test-minicard-label.c, test-minicard-view.c, test-minicard.c: nuke
- all of the old minicard stuff.
-
- * gui/widgets/eab-gui-util.[ch]: rename e-addressbook-util.[ch] to
- this and nuke e-addressbook-util.[ch].
-
- * gui/widgets/Makefile.am (INCLUDES): change G_LOG_DOMAIN to
- eab-widgets, and add -I$(top_srcdir)/addressbook.
- (noinst_LTLIBRARIES): rename to libeabwidgets.la
- (libeabwidgets_la_SOURCES): rename e-addressbook-util.[ch] to
- eab-gui-util.[ch].
-
-2003-09-29 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/eab-contact-display.c (eab_contact_display_new):
- track change from E_TYPE_AB_CONTACT_DISPLAY to
- EAB_TYPE_CONTACT_DISPLAY.
-
- * gui/widgets/eab-contact-display.h: change from E_* type foo to
- EAB_* type foo.
-
-2003-09-29 Chris Toshok <toshok@ximian.com>
-
- * gui/search/e-addressbook-search-dialog.[ch]: convert everything
- from e_addressbook_search_dialog to eab_search_dialog, and
- EAddressbookSearchDialog to EABSearchDialog.
-
- * gui/component/addressbook.c (search_cb):
- e_addressbook_search_dialog -> eab_search_dialog.
- (addressbook_search_activated): same.
- (addressbook_query_changed): same.
-
-2003-09-29 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-book.c (pas_book_respond_get_supported_fields):
- don't free the fields here - the backends hold onto them.
- (pas_book_respond_get_supported_auth_methods): don't free the
- auth_methods here - the backends hold onto them.
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_get_supported_fields): fields go from 1 to
- E_CONTACT_FIELD_LAST, not 0.
-
-2003-09-29 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c: e-book-util.h -> eab-book-util.h
-
- * gui/component/addressbook-component.c: e-book-util.h ->
- eab-book-util.h.
- (new_item_cb): enable the contact editor portion of this.
- (user_create_new_item_cb): convert to async_load_uri api, and
- ifdef the _use_default_book crap.
- (ensure_completion_uris_exist): e_book_get_config_database ->
- eab_get_config_database.
-
- * gui/component/e-address-widget.h: e-book-util.h ->
- eab-book-util.h.
-
- * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD):
- add selectnames back in, and add util/libeabutil.la.
-
-2003-09-29 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-contact.c: my head explodes from so many
- changes.
-
- * backend/ebook/e-contact.h: reorder fields such that all the
- string fields are first in the enum (and add a
- E_CONTACT_LAST_SIMPLE_STRING value, ala the old e-card-simple
- stuff.) Also, add E_CONTACT_LOGO, WANTS_HTML, IS_LIST, and
- LIST_SHOW_ADDRESSES. remove E_CONTACT_PHOTO_URI.
-
- * backend/ebook/e-vcard.c (e_vcard_remove_attribute): rename from
- e_card_remove_attribute, and add a g_assert_not_reached.
- (_evc_base64_encode_simple): make this not static (we need it for
- a test.)
- (_evc_base64_decode_simple): same.
-
- * backend/ebook/e-vcard.h: add LOGO, X-MOZILLA-HTML,
- X-EVOLUTION-LIST, and X-EVOLUTION-LIST-SHOW_ADDRESSES #defines.
-
- * backend/ebook/e-book.c (EBookLoadState): change from
- UriNotLoaded to E_BOOK_URI_NOT_LOADED, etc.
- (e_book_add_contact): track _URI_ change.
- (e_book_get_supported_fields): same.
- (e_book_get_supported_auth_methods): same.
- (e_book_authenticate_user): same.
- (e_book_get_contact): same.
- (e_book_response_get_contact): remove the ifdefed call to
- e_contact_set_book.
- (e_book_remove_contacts): track _URI_ change.
- (e_book_get_book_view): same.
- (e_book_get_contacts): same.
- (e_book_get_changes): same.
- (e_book_remove): same.
- (e_book_unload_uri): same.
- (e_book_load_uri): same.
- (e_book_load_uri): same.
- (e_book_get_self): start the implementation of this.
- (e_book_get_default_addressbook): ifdef out a possible
- implementation of this (it's broken.)
- (e_book_init): track _URI_ change.
- (e_book_dispose): same.
-
- * backend/ebook/e-book.h: move get_default_addressbook out of the
- ifdef, and change get_default_addressbook/get_addressbooks to be
- more like the rest of the api.
-
- * backend/ebook/e-book-util.[ch]: nuke.
-
- * backend/ebook/e-card-compare.[ch]: nuke.
-
- * backend/ebook/e-destination.[ch]: nuke.
-
- * backend/ebook/e-book-query.c (func_and): fix valgrind error.
- (func_or): same.
-
- * backend/ebook/e-book-listener.h: drop #include of e-list.h
-
- * backend/ebook/e-book-async.c (_get_contacts_response_handler)
- (_get_contacts_response_dtor, _get_contacts_handler)
- (_get_contacts_dtor, e_book_async_get_contacts): new functions,
- implementing e_book_async_get_contacts.
-
- * backend/ebook/e-book-async.h: add e_book_async_get_contacts.
-
-2003-09-29 Chris Toshok <toshok@ximian.com>
-
- * util/eab-marshal.list: new file.
-
- * util/eab-destination.[ch]: rename
- backend/ebook/e-destination.[ch] to this, and change all the entry
- point names too.
-
- * util/eab-book-util.[ch]: rename backend/ebook/e-book-util.[ch]
- to this, and change all the entry point names too.
-
- * util/Makefile.am: new file, build libeabutil.la
-
-2003-09-29 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (addressbook_model_set_uri): e_addressbook_model -> eab_model.
- (contact_key): e-contactify this, and remove the call to
- e_contact_get_book since we don't have it.
- (sync_one_model): card -> contact.
- (real_add_address_cb): track various name changes.
- (esn_get_key_fn): same.
- (e_addressbook_create_ebook_table): same.
- (folder_selected): same.
- (select_entry_changed): same.
- (e_select_names_new): same.
-
- * gui/component/select-names/e-select-names-text-model.c
- (dump_model): s/card/contact.
- (e_select_names_text_model_insert_length): e-destination ->
- eab-destination.
- (e_select_names_text_model_delete): same.
- (e_select_names_text_model_obj_count): same.
- (nth_obj_index): same.
- (e_select_names_text_model_activate_obj): ifdef this out since we
- don't have e_contact_get_book in the new api.
-
- * gui/component/select-names/e-select-names-table-model.c
- (fill_in_info): convert to e_contact/eab_destination.
-
- * gui/component/select-names/e-select-names-popup.c
- (change_email_num_cb): e_destination -> eab_destination.
- (populate_popup_contact): same, and ECard -> EContact. Also, the
- email attribute is a GList, not an EList. lastly, rename from
- populate_popup_card.
- (populate_popup_nocontact): same, and rename from
- populate_popup_nocard.
- (e_select_names_populate_popup): same.
-
- * gui/component/select-names/e-select-names-model.h: track changes
- to e_destination, and rename the cardify methods to something mode
- descriptive.
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_duplicate): e_destination ->
- eab_destination.
- (e_select_names_model_get_textification): same.
- (e_select_names_model_get_address_text): same.
- (e_select_names_model_get_destination): same.
- (e_select_names_model_export_destinationv): same.
- (send_changed): same.
- (e_select_names_model_import_destinationv): same.
- (e_select_names_model_get_contact): same, and rename from
- _get_card
- (e_select_names_model_get_string): same.
- (connect_destination): same.
- (disconnect_destination): same.
- (e_select_names_model_contains): same.
- (e_select_names_model_insert): same.
- (e_select_names_model_append): same.
- (e_select_names_model_replace): same.
- (e_select_names_model_delete): same.
- (e_select_names_model_clean): same.
- (delete_all_iter): same.
- (e_select_names_model_overwrite_copy): same.
- (e_select_names_model_merge): same.
- (e_select_names_model_name_pos): same.
- (e_select_names_model_text_pos): same.
- (e_select_names_model_cardify): nuke.
- (e_select_names_model_uncardify): nuke.
- (e_select_names_model_cancel_cardify): nuke.
- (e_select_names_model_load_all_contacts): rename _cardify_all to
- this.
- (e_select_names_model_cancel_all_contact_load): rename
- _cancel_cardify to this.
-
- * gui/component/select-names/e-select-names-manager.c
- (focus_in_cb): cancel_cardify_all -> cancel_all_contact_load
- (focus_out_cb): cardify_all -> load_all_contacts.
- (completion_popup_cb): same.
- (load_completion_books): no e_book_expand_uri anymore.
- (e_select_names_manager_new): e_book_get_config_database ->
- eab_get_config_database.
- (e_select_names_manager_dispose): same.
-
- * gui/component/select-names/e-select-names-completion.h: e-book.h
- -> e-book-async.h
-
- * gui/component/select-names/e-select-names-completion.c:
- EContactify this.
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_get_property_fn): ifdef out the SIMPLE_CARD_LIST getter,
- and cardify_all -> load_all_contacts.
-
- * gui/component/select-names/Evolution-Addressbook-SelectNames.idl:
- nuke all the SimpleCard stuff. It's a horribly inefficient way to
- deal with vcards, and since ebook is platform level now, we can
- (and should) promote just linking to ebook to do this.
-
-2003-09-19 Gilbert Fang <gilbert.fang@sun.com>
-
- * addressbook/gui/component/addressbook-component.c (xfer_folder):
- remove the "addressbook.db.summary" correctly. #48538
-
-2003-09-11 Dan Winship <danw@ximian.com>
-
- * backend/ebook/Makefile.am (privlib_LTLIBRARIES): Remove
- libebook-static.la
-
- * conduit/Makefile.am (libeaddress_conduit_la_LIBADD): Use
- non-static versions of libraries: the static ones were only needed
- for libtool 1.3.
-
-2003-09-07 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-contact.c (e_contact_get_property): implement
- getters for the address labels. they aren't really synthetic, but
- we can't handle them as normal strings because they switch off the
- TYPE parameter, not the attribute name (go go vcard.) Also add
- getters for the structured address fields (ADR). Also fix a spot
- where we were using strcmp instead of strcasecmp.
- (e_contact_address_free): new function.
-
- * backend/ebook/e-contact.h: Add EContactAddress structure, which
- will probably go away once i merge in my cool spiffy address
- editor. Add LABEL fields for the address labels, and add
- prototype for e_contact_address_free.
-
- * backend/ebook/e-vcard.h: add EVC_LABEL and EVC_X_BLOG_URL.
-
- * backend/ebook/e-vcard.c (read_attribute_value): step to the next
- character after unescaping \-escaped characters. keeps commas
- from multiplying.
-
- * gui/widgets/eab-contact-display.c (render_address): new function
- (eab_contact_display_render): display email, delivery addresses,
- and the blog url.
-
-2003-09-06 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-contact.c (e_contact_set_property): implement
- E_CONTACT_EMAIL_*.
-
- * backend/pas/pas-backend-ldap.c (email_ber): EContact-ify and
- re-enable this code.
- (email_compare): same.
- (email_populate): same.
-
- * backend/pas/pas-backend-vcf.c (pas_backend_vcf_load_uri): use
- XIMIAN_VCARD.
-
- * backend/pas/pas-backend-file.c (pas_backend_file_load_uri): use
- XIMIAN_VCARD, and don't fail if the directory already exists.
- just try to create the db anyway.
-
- * backend/pas/Makefile.am (libpas_a_SOURCES): add ximian-vcard.h
-
- * backend/pas/ximian-vcard.h (XIMIAN_VCARD): put the initial vcard
- here, so we can share 1 #define between file/vcf backends. Also,
- add a jpeg photo.
-
-2003-09-06 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/Makefile.am (libeminicard_la_SOURCES): add
- eab-contact-display.[ch]
-
- * gui/widgets/e-addressbook-view.c (eab_view_init): just init
- everything to NULL.
- (eab_view_new): move a bunch of stuff that was in eab_view_init
- here. create a vpaned to hold the contact display, and create the
- contact display.
- (render_contact): render the selected contact to the
- contact_display.
- (selection_changed): add logic to display the currently selected
- contact in the preview pane.
- (create_table_view): add the table to the paned.
- (create_treeview_view): add the scrolled to the paned.
- (change_view_type): remove view->widget from the paned.
-
- * gui/widgets/e-addressbook-view.h: switch from using a GtkTable
- to a GtkEventBox - we don't need the table logic anymore.
-
- * gui/widgets/e-addressbook-model.c (create_contact): indent
- (eab_model_get_contact): same.
-
- * gui/widgets/eab-contact-display.[ch]: new files - this
- implements the preview pane.
-
-2003-09-06 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (BINARY_PROP): new type of
- property, for specifying data coming back from the ldap server
- with both data/length (like photos).
- (photo_populate): set the contact's photo.
- (build_contact_from_entry): add PROP_TYPE_BINARY handling.
-
- * backend/ebook/e-vcard.c (EVCardEncoding): new enum for use with
- the ENCODING attribute parameter. Right now, just "raw",
- "base64", and "quoted-printable".
- (struct _EVCardAttribute): add a "decoded_values" list of
- GString*'s, as well as fields to hold encoding/encoding_set.
- (e_vcard_class_init): call _evc_base64_init.
- (e_vcard_attribute_add_value_decoded): based on what encoding the
- attribute uses, add the value properly.
- (e_vcard_attribute_add_param): if the parameter is ENCODING, work
- our magic.
- (e_vcard_attribute_get_values_decoded): spit out properly decoded
- values depending on the decoding type.
- (_evc_base64*): copy the camel base64 routines here.
-
- * backend/ebook/e-vcard.h: add prototypes for
- e_vcard_attribute_add_value_decoded and
- e_vcard_attribute_get_values_decoded.
-
- * backend/ebook/e-contact.c (e_contact_get_first_attr): move this
- to above _set_property so we can make use of it there.
- (e_contact_set_property): fix up the generic STRING field handler,
- and implement E_CONTACT_PHOTO setting.
- (e_contact_get_property): add handling for
- E_CONTACT_PHOTO/E_CONTACT_PHOTO_URI.
- (e_contact_photo_free): new function.
-
- * backend/ebook/e-contact.h: add EContactPhoto struct, a prototype
- for e_contact_photo_free, and two new EContactField elements (PHOTO and
- PHOTO_URI).
-
- * backend/ebook/tests/ebook/.cvsignore: ignore test-photo
-
- * backend/ebook/tests/ebook/Makefile.am (noinst_PROGRAMS): add test-photo
-
- * backend/ebook/tests/ebook/test-photo.c: test for the photo
- set/get routines (which do base64 encoding/decoding).
-
-2003-09-02 Chris Toshok <toshok@ximian.com>
-
- * gui/component/Makefile.am: comment out a buncha stuff just to
- get this building.
-
- * gui/component/select-names/e-select-names.c: #include
- e-book-async.h
- (search_result): EAddressbookModel -> EABModel.
- (addressbook_model_set_uri): same, and don't use
- e_book_expand_uri, as it's dead.
- (esn_get_key_fn): EAddressbookModel -> EABModel.
- (e_addressbook_create_ebook_table): same.
- (status_message): same.
-
- * gui/component/select-names/e-select-names.h (struct
- _ESelectNames): EAddressbookModel -> EABModel.
-
- * gui/component/addressbook-component.c (new_item_cb): ifdef out
- for now.
- (dnd_drop_book_open_cb): s/card/contact.
- (destination_folder_handle_drop): ifdef out.
- (request_quit): same.
-
- * gui/component/addressbook.c: track api changes - e_addressbook_
- -> eab_, and e_book_* becomes e_book_async_*.
-
- * gui/component/addressbook.h: #include e-book-async.h
-
- * gui/component/e-address-widget.c (query_results_cb):
- e/EBookSimpleQueryStatus/EBookStatus
-
- * gui/component/e-address-widget.h: s/ECard/EContact.
-
- * gui/component/e-cardlist-model.[ch]: nuke.
-
- * gui/component/e-address-popup.c: s/e-book.h/e-book-async.h
-
- * gui/component/e-address-popup.h: s/ECard/EContact
-
-2003-09-02 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/Makefile.am (libebook_la_SOURCES): remove
- e-card.c,e-card.simple.c
-
- * backend/ebook/tests/ebook/test-ebook.c: remove #include of
- e-card-simple.h
-
- * backend/ebook/tests/ebook/test-changes.c: remove #include of
- e-card-simple.h
-
- * backend/ebook/e-card.[ch], backend/ebook/e-card-simple.[ch]:
- nuke.
-
- * backend/ebook/e-book-util.h: s/card/contact.
-
- * backend/ebook/e-book-util.c: ifdef out an #include.
-
- * backend/ebook/e-book-async.[ch]: stop doing the stupid #define
- renaming trick, and just rename all the prototypes from e_book_*
- to e_book_async_*. Also, get rid of the *_vcard variants.
-
-2003-09-02 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-card-sexp.[ch]
- (pas_backend_card_sexp_match_contact): rename
- pas_backend_card_sexp_match_card, and it takes an EContact now.
- Also, port this file to use EContact instead of ECard, and ifdef
- out lots of stuff.
-
- * backend/pas/pas-backend-ldap.c: convert this to use EContact
- instead of ECard, and ifdef great swaths of code to make it
- compile.
-
- * backend/pas/pas-book.c (pas_book_respond_modify): convert this
- from ECard to EContact.
-
-2003-09-02 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/Makefile.am (libeminicard_la_SOURCES): remove all
- the reflow/minicard stuff from the build.
- (e-addressbook-marshal.[ch]): change the prefix on the marshallers to
- eab_marshal.
-
- * gui/widgets/e-addressbook-view.etspec: bring this more in line
- with the field ids for EContact, and comment out a ton of them
- that aren't there yet.
-
- * gui/widgets/e-addressbook-view.[ch]: big renaming - rename
- e_addressbook_view to eab_view, and EAddressbookView to EABView.
-
- * gui/widgets/e-addressbook-util.c (eab_error_dialog): rename, and
- change a few of the error strings s/Card/Contact.
- (added_cb): E_BOOK_STATUS_SUCCESS => E_BOOK_ERROR_OK.
- (modified_cb): same.
- (e_addressbook_show_contact_editor): this takes an EContact now,
- and track the change to the contact editor signal names.
- (e_addressbook_show_contact_list_editor): this takes an EContact
- now.
- (view_contacts): rename view_cards to this, and ifdef the body.
- (e_addressbook_show_multiple_contacts): rename
- e_addressbook_show_multiple_cards to this, and s/card/contact.
-
- * gui/widgets/e-addressbook-util.h: ifdef some things out, and
- rename e_addressbook_error_dialog to eab_error_dialog.
-
- * gui/widgets/e-addressbook-table-adapter.[ch]: big renaming -
- rename e_addressbook_table_adapter to eab_table_adapter, and
- EAddressbookTableAdapter to EABTableAdapter. Also, remove the
- simple mapping - we can do ECardSimple-like operations directly on
- the EContacts from the EABModel.
-
- * gui/widgets/e-addressbook-model.[ch]: big renaming - rename
- e_addressbook_model to eab_model, and EAddressbookModel to
- EABModel. Also, convert everything from ECard to EContact.
-
-2003-09-01 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-vcard.c (e_vcard_new_from_string): omg i'm dumb.
- don't call e_vcard_new here since it just turns around and calls
- e_vcard_new_from_string again.
-
-2003-09-01 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-book-view.c (pas_book_view_notify_change): guard
- pending adds foo.
- (pas_book_view_notify_remove): same.
- (pas_book_view_notify_add): same.
- (pas_book_view_notify_complete): same.
- (pas_book_view_construct): init mutex
- (pas_book_view_dispose): free mutex
-
- * backend/pas/pas-backend-ldap.c (func_exists): new function.
- (send_pending_adds): remove
- (ldap_search_handler): let the BookView stuff handle the pending
- adds for us.
- (ldap_search_dtor): remove pending adds stuff.
- (pas_backend_ldap_search): same
-
- * backend/pas/pas-backend-card-sexp.c (func_exists): new function.
-
- * backend/ebook/tests/ebook/test-ebook.c (print_all_emails): use
- an exists query.
-
-2003-08-31 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book-query.c (func_and, func_or, func_not)
- (func_contains, func_is, func_beginswith, func_endswith)
- (e_book_query_from_string): adapt the pas ldap backend sexp
- parsing code to this, build up an EBookQuery that represents the
- sexp.
-
- * backend/ebook/e-contact.h (e_contact_field_id): add prototype.
-
- * backend/ebook/e-contact.c (e_contact_field_id): new function.
-
- * backend/ebook/Makefile.am (libebook_la_SOURCES): add
- e-book-util.c back into the build, if only for the config_database
- thingy.
-
-2003-08-31 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-contact.c (e_contact_duplicate): new function.
-
- * backend/ebook/e-contact.h: add prototype for
- e_contact_duplicate.
-
- * backend/ebook/e-book-util.[ch]: massive ifdeffing. most of this
- is either gone or will be unnecessary soon.
-
- * backend/ebook/e-book-query.c (e_book_query_from_string): hack
- this so it'll at least generate a query.
-
- * backend/ebook/e-book-listener.c
- (impl_BookListener_respond_get_view): add some debug spew and
- remove a c&p'ed comment.
-
- * backend/ebook/e-book-async.h: add prototype for
- e_book_async_unload_uri.
-
- * backend/ebook/e-book-async.c (e_book_async_unload_uri): new
- function.
-
- * backend/pas/pas-book-view.c (pas_book_view_construct): switch to
- CORBA_Object_duplicate, ala pas_book.
-
- * backend/pas/pas-backend-sync.c (pas_backend_sync_class_init):
- fix typo and the build.
-
-2003-08-29 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (ldap_error_to_response):
- s/card/contact.
- (pas_backend_ldap_process_create_contact): same.
- (remove_contact_handler): same.
- (remove_contact_dtor): same.
- (pas_backend_ldap_process_remove_contacts): same.
- (modify_contact_modify_handler): same.
- (modify_contact_dtor): same.
- (pas_backend_ldap_process_modify_contact): same.
- (get_contact_handler): same.
- (get_contact_dtor): same.
- (pas_backend_ldap_process_get_contact): same.
- (pas_backend_ldap_class_init): same.
-
- * backend/pas/pas-backend-summary.c
- (pas_backend_summary_add_contact): s/card/contact, and mostly
- switch from ECard{Simple} to EContact.
- (pas_backend_summary_get_summary_vcard): same.
- (pas_backend_summary_remove_contact): s/card/contact
-
- * backend/pas/pas-backend-summary.h: s/card/contact.
-
- * backend/pas/pas-backend-file.c (build_summary): fix g_warning,
- and return immediately if the db->cursor call fails.
- (pas_backend_file_create_contact): s/card/contact
- (pas_backend_file_remove_contacts): same.
- (pas_backend_file_modify_contact): same.
- (pas_backend_file_get_contact): same.
- (pas_backend_file_get_contact_list): same.
- (pas_backend_file_class_init): same.
-
- * backend/pas/pas-backend-vcf.c
- (pas_backend_vcf_process_create_contact): s/card/contact.
- (pas_backend_vcf_process_remove_contacts): same.
- (pas_backend_vcf_process_modify_contact): same.
- (pas_backend_vcf_process_get_contact): same.
- (pas_backend_vcf_process_get_contact_list): same.
- (pas_backend_vcf_class_init): same.
-
- * backend/pas/pas-backend-sync.c (pas_backend_sync_create_contact): s/card/contact.
- (pas_backend_sync_remove_contacts): same.
- (pas_backend_sync_modify_contact): same.
- (pas_backend_sync_get_contact): same.
- (pas_backend_sync_get_contact_list): same.
- (_pas_backend_create_contact): same.
- (_pas_backend_remove_contacts): same.
- (_pas_backend_modify_contact): same.
- (_pas_backend_get_contact): same.
- (_pas_backend_get_contact_list): same.
- (pas_backend_sync_class_init): same.
-
- * backend/pas/pas-backend-sync.h: s/card/contact.
-
- * backend/pas/pas-backend.c (pas_backend_create_contact): s/card/contact.
- (pas_backend_remove_contacts): same.
- (pas_backend_modify_contact): same.
- (pas_backend_get_contact): same.
- (pas_backend_get_contact_list): same.
- (pas_backend_change_add_new): same.
- (pas_backend_change_modify_new): same.
- (pas_backend_change_delete_new): same.
-
- * backend/pas/pas-backend.h: s/card/contact.
-
- * backend/pas/pas-book-view.c (send_pending_adds): s/card/contact
- (pas_book_view_notify_change): same.
- (pas_book_view_notify_remove): same.
-
- * backend/pas/pas-book.c
- (impl_GNOME_Evolution_Addressbook_Book_getContact): s/card/contact
- (impl_GNOME_Evolution_Addressbook_Book_getContactList): same.
- (impl_GNOME_Evolution_Addressbook_Book_addContact): same.
- (impl_GNOME_Evolution_Addressbook_Book_removeContacts): same.
- (impl_GNOME_Evolution_Addressbook_Book_modifyContact): same.
- (pas_book_respond_create): same.
- (pas_book_respond_remove_contacts): same.
- (pas_book_respond_modify): same.
- (pas_book_respond_get_contact): same.
- (pas_book_respond_get_contact_list): same.
- (pas_book_respond_get_changes): same.
- (pas_book_class_init): same.
-
- * backend/pas/pas-book.h: s/card/contact
-
- * backend/ebook/tests/vcard/dump-vcard.c: #include
- "ebook/e-vcard.h"
-
- * backend/ebook/tests/vcard/Makefile.am (TEST_LIBS): use
- top_builddir.
- (CFLAGS): same.
-
- * backend/ebook/tests/ebook/Makefile.am (TEST_LIBS): use
- top_builddir.
- (CFLAGS): use srcdir
-
- * backend/ebook/test-card.c, backend/ebook/test-client-list.c,
- backend/ebook/test-client.c, backend/ebook/test-ebook.c: remove.
-
- * backend/ebook/e-card-cursor.[ch]: remove.
-
- * backend/ebook/e-card-pairs.h: remove.
-
- * backend/ebook/e-book.c (e_book_add_contact): s/Card/Contact.
- (e_book_commit_contact): same
- (e_book_get_contact): same.
- (e_book_remove_contacts): same.
- (e_book_get_contacts): same.
- (e_book_handle_response): same.
-
- * backend/ebook/e-book-view.c (e_book_view_do_added_event):
- s/card/contact
- (e_book_view_do_modified_event): same.
- (e_book_view_do_removed_event): same.
- (e_book_view_handle_response): same.
- (e_book_view_class_init): same.
-
- * backend/ebook/e-book-view.h: s/card/contact and pad the class
- struct.
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_queue_response): s/Card/Contact.
- (e_book_view_listener_queue_status_event): no need to assign
- things to NULL, we g_new0.
- (e_book_view_listener_queue_idlist_event): s/Card/Contact, and no
- need to assign things to NULL, we g_new0.
- (e_book_view_listener_queue_sequence_event): same.
- (e_book_view_listener_queue_message_event): same.
- (impl_BookViewListener_notify_contacts_added): s/Card/Contact.
- (impl_BookViewListener_notify_contacts_removed): same.
- (impl_BookViewListener_notify_contacts_changed): same.
- (e_book_view_listener_class_init): same.
-
- * backend/ebook/e-book-view-listener.h: s/Card/Contact
-
- * backend/ebook/e-book-types.h: s/CARD/CONTACT
-
- * backend/ebook/e-book-listener.c
- (e_book_listener_convert_status): s/Card/Contact
- (impl_BookListener_respond_create_contact): same.
- (impl_BookListener_respond_remove_contacts): same.
- (impl_BookListener_respond_modify_contact): same.
- (impl_BookListener_respond_get_contact): same.
- (impl_BookListener_respond_get_contact_list): same.
- (impl_BookListener_respond_get_changes): same.
- (e_book_listener_class_init): same.
-
- * backend/ebook/e-book-listener.h: pad the class struct, and
- s/Card/Contact.
-
- * backend/ebook/e-book-async.c (_load_uri_handler): GError
- changes.
- (_get_fields_handler): same.
- (_get_methods_handler): same.
- (_auth_user_handler): same.
- (_get_card_handler): same.
- (_remove_cards_handler): same.
- (_add_vcard_handler): same.
- (_commit_vcard_handler): same.
- (_get_book_view_handler): same.
- (e_book_async_get_book_view): use an EBookQuery instead of a char*.
-
- * backend/ebook/Makefile.am: remove the test handling.
- (SUBDIRS): set to ". tests"
- (libebook_la_SOURCES): add e-book-async.c
-
- * backend/idl/addressbook.idl: possibly gratuitous renaming, but i
- was sick of seeing "Card" being used everywhere. "Contact" is the
- new "Card".
-
-2003-08-28 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book.c (e_book_op_free): rename from
- e_book_free_op.
- (e_book_op_remove): rename from e_book_remove_op.
- (e_book_clear_op): new function, remove the op, unlock its mutex,
- and free it.
- (e_book_add_contact): use e_book_clear_op.
- (e_book_commit_contact): same.
- (e_book_get_supported_fields): same.
- (e_book_get_supported_auth_methods): same.
- (e_book_authenticate_user): same.
- (e_book_get_contact): same.
- (e_book_remove_contacts): same.
- (e_book_get_book_view): same.
- (e_book_get_contacts): same.
- (e_book_get_changes): same.
- (e_book_load_uri): same.
- (e_book_remove): new function.
- (e_book_response_remove): new function.
- (e_book_handle_response): add handling for RemoveBookResponse.
- (e_book_load_local_addressbook): pass TRUE for e_book_load_uri
- @only_if_exists.
-
- * backend/ebook/e-book.h: add @only_if_exists arg to
- e_book_load_uri so we can support folder creation at load_uri
- time, and add prototype for e_book_remove.
-
- * backend/ebook/e-book-types.h: add an "id" slot in EBookChange.
-
- * backend/ebook/e-book-listener.c
- (impl_BookListener_respond_get_changes): handle union in idl.
- (impl_BookListener_respond_open_book): remove unnecessary
- exception check.
- (impl_BookListener_respond_remove_book): new function.
- (impl_BookListener_respond_get_supported_fields): rename this from
- _response_.
- (impl_BookListener_respond_get_supported_auth_methods): same.
- (e_book_listener_class_init): add _remove_book and track change to
- get_supported_fields/get_supported_auth_methods names.
-
- * backend/ebook/e-book-listener.h: add RemoveBookResponse to
- EBookListenerOperation enum.
-
- * backend/idl/addressbook.idl: make BookChangeItem a union that
- switches over BookChangeType.
-
- * backend/pas/pas-backend.c (pas_backend_change_add_new): new
- function, create a BookChangeItem representing the addition of a
- contact.
- (pas_backend_change_modify_new): same, but for modifications.
- (pas_backend_change_delete_new): same, but for deletions.
-
- * backend/pas/pas-backend.h: add prototypes for
- pas_backend_change_{add,modify,delete}_new
-
- * backend/pas/pas-backend-file.c (pas_backend_file_changes): nuke.
- (do_create): fix memory corruption.
- (pas_backend_file_get_changes): copy the body of
- pas_backend_file_changes here, and rework so that it's synchronous
- and return a list instead of the book view hack.
- (pas_backend_file_load_uri): mkdir the directory (we need a mkdir
- -p here).
- (select_changes): new function, scandir helper.
- (pas_backend_file_remove): NULL out bf->priv->summary to quiet
- valgrind, and call scandir to accumulate the .changes.db files
- then unlink them.
-
- * backend/pas/pas-book.c (pas_book_respond_remove): new function.
- (pas_book_respond_get_supported_fields): unifdef this, and make it
- use a glist.
- (pas_book_respond_get_supported_auth_methods): same.
- (pas_book_respond_get_changes): this code is kinda gross... lots
- of copying going on, there's got to be a better way. but it
- works.
-
-2003-08-26 Chris Toshok <toshok@ximian.com>
-
- * backend/idl/addressbook.idl: add oneway void Book::remove() and
- oneway void notifyBookRemoved()
-
-2003-08-26 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend.c (pas_backend_remove): new function.
- (pas_backend_add_book_view): new function.
- (pas_backend_add_client): move the "real_add_client" code here.
- (pas_backend_remove_client): move the "real_remove_client" code
- here.
- (pas_backend_class_init): remove assignments of add_client and
- remove_client vtable entries.
- (pas_backend_is_removed): new function.
- (pas_backend_set_is_removed): new function.
- (pas_backend_init): init clients_mutex and views_mutex.
-
- * backend/pas/pas-backend.h: remove the vtable entries for
- add/remove_client, since these are fully handled in PASBackend.
- Add prototypes for
- pas_backend_is_removed/pas_backend_add_book_view/pas_backend_set_is_removed.
-
- * backend/pas/pas-book.c
- (impl_GNOME_Evolution_Addressbook_Book_remove): new function.
- (impl_GNOME_Evolution_Addressbook_Book_getBookView): clean things
- up a bit, and don't use pas_backend_get_book_views as it can't
- lock the list of views.
- (pas_book_respond_get_supported_auth_methods): remove the extra
- unnecessary arg from the corba call.
- (pas_book_respond_get_changes): same.
- (pas_book_class_init): fill in epv "remove" slot.
-
- * backend/pas/pas-book.h: rename pas_book_respond_remove to
- pas_book_respond_remove_cards, and add a new
- pas_book_respond_remove for use with removing books.
-
- * backend/pas/pas-backend-sync.c (pas_backend_sync_remove): new
- function.
- (_pas_backend_remove): new function.
- (pas_backend_sync_class_init): fill in the "remove" vtable entry.
- (_pas_backend_remove_cards): track change to
- pas_book_respond_remove_cards (pas_book_respond_remove is used for
- removing the book, not the cards.)
-
- * backend/pas/pas-backend-sync.h: add pas_backend_sync_remove
- prototype and add remove_sync virtual function.
-
-2003-08-26 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-file.c (pas_backend_file_create_card,
- pas_backend_file_remove_cards, pas_backend_file_modify_card,
- pas_backend_file_get_vcard, pas_backend_file_get_card_list,
- pas_backend_file_start_book_view, pas_backend_file_get_changes,
- pas_backend_file_authenticate_user,
- pas_backend_file_get_supported_fields): rename from
- pas_backend_file_process_*
- (pas_backend_file_load_uri): save off the dirname/summary
- filename.
- (pas_backend_file_remove): new function, unlink all the files we
- know about.
- (pas_backend_file_class_init): track changes to functions, and add
- pas_backend_file_remove.
-
-2003-08-26 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (ecard_from_remote_record): duplicate
- the extra address lines
-
-2003-08-22 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-book.[ch]: switch from using the PASRequest
- union and a central PASBackend dispatch function. just call the
- pas_backend methods directly and expand the args out.
-
- * backend/pas/pas-backend.[ch]: same.
-
- * backend/pas/pas-backend-sync.[ch]: same.
-
- * backend/pas/pas-backend-vcf.c, backend/pas/pas-backend-file.c,
- backend/pas/pas-backend-ldap.c: same, and get these all compiling
- against the rest of the current pas/ebook code.
-
-2003-08-21 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/test-ebook.c: track GError case.
-
- * backend/ebook/e-book.[ch]: GError-ify the api, and clean up some
- cases where we weren't removing the current op.
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_convert_status): track change from
- E_BOOK_VIEW_STATUS_* to E_BOOK_VIEW_ERROR_*.
-
- * backend/ebook/e-book-types.h: track change from E_BOOK_STATUS_*
- to E_BOOK_ERROR_*, and some E_BOOK_VIEW_STATUS_* to
- E_BOOK_VIEW_ERROR_*.
-
- * backend/ebook/e-book-listener.c
- (e_book_listener_convert_status): track change from
- E_BOOK_STATUS_* to E_BOOK_ERROR_*.
-
- * backend/ebook/e-book-query.c (e_book_query_any_field_contains):
- new function.
- (e_book_query_unref): handle the any_field_contains case.
- (e_book_query_to_string): same.
-
- * backend/ebook/e-book-query.h: add prototype for
- e_book_query_any_field_contains.
-
- * backend/ebook/e-card.c (e_card_load_uri): ifdef this out for
- now.
-
- * backend/ebook/e-contact.[ch] (e_contact_get_const): new
- function/prototype.
-
-2003-08-20 Gilbert Fang <gilbert.fang@sun.com>
-
- * gui/widgets/e-addressbook-util.c
- (e_addressbook_send_card_list): use memcpy to assign
- CORBA_char_sequence instead of strcpy. (#46706)
-
-2003-08-18 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/component-factory.c: Update OAFIIDs.
-
- * gui/widgets/e-addressbook-util.c (e_addressbook_transfer_cards):
- Removed extern declaration for global_shell_client [yuck].
- (e_addressbook_transfer_cards): #if 0 the invocation for
- evolution_shell_client_user_select_folder(), we need to
- reimplement this component-side now.
-
- * gui/component/component-factory.c (factory): Call
- addressbook_component_peek() here instead of
- addressbook_component_init() [since the latter is no more].
-
- * gui/component/addressbook.c (set_status_message): Don't create
- the activity client for now.
-
- * gui/component/addressbook-config.c: Removed member shell from
- struct AddressbookDialog.
- (ldap_dialog_new): Do not take a shell arg anymore.
- (ldap_config_control_new): Likewise.
- (addressbook_config_control_new): No need to get the global shell
- pointer here anymore.
-
- * gui/component/addressbook-component.c: Rewritten to support the
- new ::Component interface.
- * gui/component/addressbook-component.h: Likewise.
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in: Version
- factory's OAFIID. Remove ShellComponent server, add Component
- server.
-
-2003-08-12 Rodrigo Moya <rodrigo@ximian.com>
-
- * backend/ebook/e-book.c (e_book_dispose): unref the
- EComponentListener before unloading the CORBA object.
-
-2003-08-12 Hans Petter Jansson <hpj@ximian.com>
-
- * backend/ebook/e-destination.c (e_destination_dispose): Chain.
-
- * gui/component/e-address-widget.c (e_address_widget_destroy): Chain.
- Prevent double frees. Prevent double GSource removal.
-
- * gui/component/e-cardlist-model.c (e_cardlist_model_class_init):
- Store parent class.
- (e_cardlist_model_dispose): Chain. Prevent double frees and unrefs.
-
- * gui/contact-editor/e-contact-editor-address.c
- (e_contact_editor_address_dispose): Chain.
-
- * gui/contact-editor/e-contact-editor-fullname.c
- (e_contact_editor_fullname_dispose): Chain.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (e_contact_list_editor_dispose): Chain.
-
- * gui/contact-list-editor/e-contact-list-model.c
- (contact_list_model_destroy): Chain. Prevent double frees and unrefs.
-
- * gui/widgets/e-addressbook-reflow-adapter.c (addressbook_dispose):
- Chain.
- (addressbook_finalize): Chain.
-
- * gui/widgets/e-addressbook-table-adapter.c (addressbook_dispose):
- Chain.
-
- * gui/widgets/e-addressbook-treeview-adapter.c (addressbook_destroy):
- Chain. Prevent double free.
-
- * gui/widgets/gal-view-minicard.c (gal_view_minicard_dispose):
- Chain. Prevent double free and detach.
-
- * gui/widgts/gal-view-treeview.c (gal_view_treeview_dispose):
- Chain. Prevent double free and detach.
-
- * printins/e-contact-print-style-editor.c
- (e_contact_print_stule_editor_destroy): Chain. Prevent double unref.
-
-2003-08-07 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-vcard.c (e_vcard_to_string_vcard_21): new,
- unimplemented, function.
- (e_vcard_to_string_vcard_30): move the 3.0 vcard export code here.
- (e_vcard_to_string): call e_vcard_to_string_vcard_21 or
- e_vcard_to_string_vcard_30 based on @format.
- (e_vcard_attribute_remove_values): new function.
-
- * backend/ebook/e-vcard.h: add @format to e_vcard_to_string, and
- add prototype for e_vcard_attribute_remove_values. also, add
- prototype for e_vcard_decode_b_encoding.
-
-2003-08-07 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book-listener.c
- (impl_BookListener_respond_open_book): remove the book arg.
-
- * backend/ebook/e-book-listener.h (struct _EBookListenerResponse):
- remove the corba book.
-
- * backend/ebook/e-book-async.c (_get_book_view_dtor): free the
- query string.
- (e_book_async_get_book_view): dup the query string.
-
- * backend/ebook/e-book.h: change e_book_get_book_view and
- e_book_get_contacts to take a const char * query string instead of
- an EBookQuery.
-
- * backend/ebook/e-book.c (e_book_add_contact): pass
- EVC_FORMAT_VCARD_30 to e_vcard_to_string.
- (e_book_commit_contact): same.
- (e_book_get_book_view): take a const char* query string instead of
- an EBookQuery.
- (e_book_get_contacts): same.
- (e_book_response_open): track change - the Book is no longer
- communicated back here.
- (listener_cb): nuke.
- (e_book_handle_response): track change to e_book_response_open.
- (e_book_load_uri): rework this from using BookFactory::openBook to
- BookFactory::getBook + Book::open.
- (e_book_get_uri): new function, reimplement from old api.
- (e_book_get_static_capabilities): same.
- (e_book_check_static_capability): same.
- (startup_mainloop): new function, run bonobo_main.
- (e_book_activate): start up a thread with startup_mainloop as the
- start func.
- (e_book_new): call e_book_activate.
-
- * backend/idl/addressbook.idl: Add Book::open, remove the Book
- from notifyBookOpened's args, and change BookFactory::openBook to
- BookFactory::getBook.
-
- * backend/pas/pas-backend-file.c (pas_backend_file_load_uri): add
- only_if_exists - stop using the "create-initial" special file.
-
- * backend/pas/pas-backend-vcf.c (pas_backend_vcf_load_uri): add
- only_if_exists - stop using the "create-initial" special file.
-
- * backend/pas/pas-backend.c (pas_backend_load_uri): add
- @only_if_exists, and pass it along to the virtual method.
- (pas_backend_open): new function, lock the mutex so only one
- PASBook can actually call load_uri. call load_uri with
- pas_book_get_uri, and req->only_if_exists.
- (pas_backend_handle_request): rename process_client_request to
- this, and expose it publicly. Also add a case statement for
- "Open".
- (real_add_client): gut this function, we don't need to create the
- book anymore, just add the client to the list and do the weak
- ref/ORBit small stuff.
- (pas_backend_add_client): track change to signature - BookListener
- -> PASBook.
- (pas_backend_init): init open_mutex.
- (pas_backend_dispose): free open_mutex.
-
- * backend/pas/pas-backend.h (PASBackendClass): add @only_if_exists
- to the load_uri virtual method, and change the add_client virtual
- method to take a PASBook instead of a BookListener. add the same
- args to _load_uri and add_client. Also, add prototypes for
- pas_backend_handle_request and pas_backend_open.
-
- * backend/pas/pas-book-factory.c
- (_pas_book_factory_send_open_book_response): nuke.
- (pas_book_factory_launch_backend): just return NULL, don't call
- _pas_book_factory_send_open_book_response, in the error case.
- (start_backend): nuke
- (impl_GNOME_Evolution_Addressbook_BookFactory_getBook): rename
- _openBook to this. clean up the code a bit. Create the PASBook
- here, and always track change to pas_backend_add_client's type (we
- pass the book now, not the listener).
- (pas_book_factory_class_init): openBook -> getBook.
-
- * backend/pas/pas-book.c
- (impl_GNOME_Evolution_Addressbook_Book_open): new function, call
- pas_backend_open.
- (impl_GNOME_Evolution_Addressbook_Book_getVCard): get rid of the
- signal crap, just call pas_backend_handle_request.
- (impl_GNOME_Evolution_Addressbook_Book_getCardList): same.
- (impl_GNOME_Evolution_Addressbook_Book_authenticateUser): same.
- (impl_GNOME_Evolution_Addressbook_Book_addCard): same.
- (impl_GNOME_Evolution_Addressbook_Book_removeCards): same.
- (impl_GNOME_Evolution_Addressbook_Book_modifyCard): same.
- (impl_GNOME_Evolution_Addressbook_Book_getChanges): same.
- (impl_GNOME_Evolution_Addressbook_Book_getSupportedFields): same.
- (impl_GNOME_Evolution_Addressbook_Book_getSupportedAuthMethods):
- same.
- (impl_GNOME_Evolution_Addressbook_Book_cancelOperation): same.
- (pas_book_get_backend): aggregate some g_return_if_fail's.
- (pas_book_get_listener): new function.
- (pas_book_get_uri): new function.
- (pas_book_respond_open): just call BookListener::notifyBookOpened.
- (pas_book_construct): add @uri, and g_strdup it.
- (pas_book_new): add @uri, and pass it to pas_book_construct.
- (pas_book_class_init): remove the "request" signal stuff, and fill
- in epv->open.
-
- * backend/pas/pas-book.h: add PASOpenRequest struct/enum entry.
- Also, add @uri to the pas_book_new args, and add a prototype for
- pas_book_get_uri. Also, remove the "request" signal.
-
-2003-08-07 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-book-factory.c
- (pas_book_factory_get_n_backends): lock map_mutex around hash
- table work.
- (pas_book_factory_dump_active_backends): same.
- (backend_last_client_gone_cb): same.
- (_pas_book_factory_send_open_book_response): track CallStatus idl
- change.
- (start_backend): simplify this greatly, since the factory is
- tagged with HINT_PER_THREAD.
- (impl_GNOME_Evolution_Addressbook_BookFactory_openBook): lock
- around hash table.
- (pas_book_factory_init): initialize map_mutex.
- (pas_book_factory_dispose): free map_mutex.
-
-2003-08-06 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_book_view_copy): nuke.
- (pas_backend_file_book_view_free): same.
- (view_destroy): same.
- (pas_backend_file_changes): #if notyet
- (do_create): e-card -> e-contact.
- (pas_backend_file_process_create_card): remove view handling from
- here.
- (pas_backend_file_process_remove_cards): same.
- (pas_backend_file_process_modify_card): convert to e-contact, and
- remove view handling.
- (pas_backend_file_get_book_view): nuke.
- (pas_backend_file_process_get_supported_fields): e-card-simple ->
- e-contact.
- (pas_backend_file_upgrade_db): e-card -> e-contact.
- (pas_backend_file_cancel_operation): implement, just return
- CouldNotCancel.
- (pas_backend_file_class_init): assign cancel_operation, and remove
- get_book_view assignment.
- (pas_backend_file_init): remove book_views assignment.
-
-2003-08-06 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-vcf.c (pas_backend_vcf_book_view_copy):
- nuke.
- (pas_backend_vcf_book_view_free): same.
- (view_destroy): same.
- (insert_contact): new function, insert the contact into our hash
- table.
- (load_file): reimplement without the e_card stuff.
- (foreach_build_list): e_card -> e_contact.
- (save_file): mostly reimplement in terms of e-contact. more error
- case work needs doing.
- (do_create): e-card -> e-contact.
- (pas_backend_vcf_process_create_card): remove the view handling
- from here.
- (pas_backend_vcf_process_remove_cards): implement this, just
- remove it from the hash table and set ourselves to dirty.
- (pas_backend_vcf_process_modify_card): remove the view handling
- from here.
- (pas_backend_vcf_process_get_book_view): nuke.
- (pas_backend_vcf_process_get_supported_fields): reimplement in
- terms of e-contact.
- (INITIAL_VCARD): add in a FN attribute, and remove the quoted
- printable encoding.
- (pas_backend_vcf_cancel_operation): implement, just always return
- CouldNotCancel.
- (pas_backend_vcf_class_init): fill in cancel_operation, and remove
- get_book_view_sync.
- (pas_backend_vcf_init): remove book_views handling.
-
- * backend/pas/pas-backend-vcf.h: update copyright.
-
-2003-08-06 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-sync.c (pas_backend_sync_remove_cards):
- add out param @ids, so we can call pas_book_respond_remove
- properly.
- (_pas_backend_remove_cards): the other half of the change - pass
- the ids on to pas_book_response_remove.
- (pas_backend_sync_modify_card): add out param @old_vcard so we can
- call pas_book_respond_modify properly.
- (_pas_backend_modify_card): the other half of the change, pass the
- old_vcard on to pas_book_respond_modify.
- (pas_backend_sync_get_book_view): nuke.
- (pas_backend_sync_get_changes): track change (book view -> GList)
- (_pas_backend_is_threaded): nuke.
- (_pas_backend_create_card): indent.
- (_pas_backend_remove_cards): same.
- (_pas_backend_modify_card): same.
- (_pas_backend_get_card_list): same.
- (_pas_backend_get_changes): same.
- (_pas_backend_authenticate_user): same.
- (_pas_backend_get_supported_fields): same.
- (_pas_backend_get_supported_auth_methods): same.
- (_pas_backend_get_book_view): nuke.
- (pas_backend_sync_class_init): remove assignment to is_threaded
- and get_book_view.
-
- * backend/pas/pas-backend-sync.h: add out-params @ids to
- remove_cards_sync, @old_vcard to modify_card_sync.
- get_changes_sync's out-param is a GList instead of a book view,
- and remove get_book_view_sync.
-
- * backend/pas/pas-backend.c (pas_backend_get_book_view): nuke.
- (pas_backend_is_threaded): nuke.
- (pas_backend_start_threaded): nuke.
- (pas_backend_init): initialize priv->views.
- (pas_backend_dispose): free priv->views.
- (pas_backend_get_book_views): new function, return priv->views.
-
- * backend/pas/pas-backend.h: remove the get_book_view virtual
- method, and the pas_backend_get_book_view prototype. Also, track
- the CallStatus change, and add a cancel_operation virtual method
- and prototype, and add pas_backend_get_book_views function, so the
- PASBook's can get ahold of the list.
-
- * backend/pas/pas-book-view.h: track collapsing of
- Addressbook::BookListenerCallStatus and
- Addressbook::BookView::CallStatus enums into
- Addressbook::CallStatus.
-
- * backend/pas/pas-book-view.c: same.
-
- * backend/pas/pas-card-cursor.[ch]: nuke
-
- * backend/pas/pas-book.c: track collapsing of
- Addressbook::BookListenerCallStatus and
- Addressbook::BookView::CallStatus enums into
- Addressbook::CallStatus.
- (impl_GNOME_Evolution_Addressbook_Book_getBookView): implement
- this all here, instead of farming it out to the backends.
- (impl_GNOME_Evolution_Addressbook_Book_getChanges): track change
- to signature. this is no longer a book view, it'll return an
- actual list.
- (impl_GNOME_Evolution_Addressbook_Book_cancelOperation): new
- function, implement.
- (pas_book_respond_create): iterate over the views, notifying them
- if the new card matches their query.
- (pas_book_respond_remove): iterate over the views, telling them to
- delete the card matching the id.
- (pas_book_respond_modify): iterate over the views, notifying them
- if they need to change/add/remove that card.
- (view_destroy): move this here from the backends.
- (pas_book_respond_get_book_view): weak-ref the book view.
- (pas_book_new): remove the is_threaded switch on POA hints, and
- always use PER_REQUEST.
- (pas_book_class_init): fill in cancelOperation.
-
- * backend/pas/pas-book.h: track collapsing of
- Addressbook::BookListenerCallStatus and
- Addressbook::BookView::CallStatus enums into
- Addressbook::CallStatus.
-
-2003-08-01 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book-async.c: mostly finished.
-
-2003-08-01 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book-async.[ch]: new files, create async methods
- similar to the old ebook api that use GThread/GAsyncQueue to
- simulate the old async behavior.
-
-2003-07-29 Chris Toshok <toshok@ximian.com>
-
- * backend/idl/addressbook.idl: collapse
- Addressbook::BookListenerCallStatus and
- Addressbook::BookView::CallStatus enums into
- Addressbook::CallStatus.
-
-2003-07-29 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book-types.h: add EBookChangeType/EBookChange.
-
-2003-07-29 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book-view-listener.c: track collapsing of
- Addressbook::BookListenerCallStatus and
- Addressbook::BookView::CallStatus enums into
- Addressbook::CallStatus.
-
- * backend/ebook/e-book-listener.c track collapsing of
- Addressbook::BookListenerCallStatus and
- Addressbook::BookView::CallStatus enums into
- Addressbook::CallStatus.
- (response_free): nuked
- (e_book_listener_check_queue): nuked
- (e_book_listener_queue_response): nuked
- (e_book_listener_queue_progress): nuked
- (e_book_listener_queue_get_view_response): nuked
- (e_book_listener_queue_get_changes_response): nuked
- (e_book_listener_queue_writable_status): nuked
- (e_book_listener_queue_authentication_response): nuked
- (e_book_listener_queue_get_supported_fields_response): nuked
- (e_book_listener_queue_get_supported_auth_methods_response): nuked
- (e_book_listener_dispose): nuked
-
- * backend/ebook/e-book-listener.h: remove prototypes for
- check_pending and pop_response.
-
- * backend/ebook/e-book.c (e_book_get_changes): new function.
- implement this as more of a getCardList type function, instead of
- getBookView.
- (e_book_response_get_changes): new function.
- (e_book_free_change_list): new function.
-
- * backend/ebook/e-book.h: add prototype for
- e_book_free_change_list.
-
-2003-07-23 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book.c (e_book_get_book_view): new function,
- implement this.
- (e_book_response_get_book_view): same.
- (e_book_get_contacts): remove the op so we don't see BUSY after
- this request.
- (e_book_handle_response): unifdef a few things.
- (e_book_unload_uri): fix the assertion about URI_NOT_LOADED, and
- unifdef some code.
- (e_book_dispose): fix a typo.
-
- * backend/ebook/e-book-view.c (e_book_view_handle_response):
- rename _check_listener_queue to this. we don't need to pop the
- response either, it's passed as an arg.
- (e_book_view_construct): "response_queued" -> "response"
- (e_book_view_start): new function, call BookView.start.
- (e_book_view_dispose): track the signal id change.
-
- * backend/ebook/e-book-view.h: add prototype for
- e_book_view_start.
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_check_queue): remove.
- (e_book_view_listener_queue_response): just emit the signal.
- (impl_BookViewListener_notify_card_added): spew.
- (impl_BookViewListener_notify_card_changed): spew.
- (impl_BookViewListener_notify_sequence_complete): spew.
- (impl_BookViewListener_notify_progress): spew.
- (e_book_view_listener_check_pending): remove
- (e_book_view_listener_check_pop_response): remove
- (e_book_view_listener_new): use the ALL_AT_IDLE poa policy.
- (e_book_view_listener_init): remove the queue/timeout stuff.
- (e_book_view_listener_dispose): remove the queue/timeout stuff.
-
- * backend/ebook/e-book-view-listener.h: remove _check_pending and
- _pop_response.
-
-2003-07-23 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-file.c (do_summary_query): remove the
- completion_search argument, and remove the aggregating stuff.
- just call pas_book_view_notify_add_1.
- (pas_backend_file_book_view_copy): remove card_sexp crap.
- (pas_backend_file_book_view_free): same.
- (get_length): remove
- (get_nth): remove
- (cursor_destroy): remove
- (vcard_matches_search): remove
- (ecard_matches_search): remove
- (pas_backend_file_search_timeout): remove the aggregating stuff.
- just call pas_book_view_notify_add_1.
- (pas_backend_file_search): simplify this a bunch.
- (do_create): use pas_book_view_vcard_matches.
- (pas_backend_file_process_get_card_list): add some more error
- checks.
- (pas_backend_file_process_get_book_view): unifdef this, and
- implement it.
- (pas_backend_file_start_book_view): kick off the search.
- (pas_backend_file_get_uri): remove.
- (pas_backend_file_class_init): remove get_uri, add
- start_book_view.
-
- * backend/pas/pas-backend-ldap.c (view_destroy): don't need to
- unref the card_sexp, as the PASBookView owns it now.
- (create_card_handler): use pas_book_view_vcard_matches.
- (modify_card_modify_handler): same.
- (ldap_get_view): initialize the view properly.
- (pas_backend_ldap_get_uri): remove.
- (pas_backend_ldap_class_init): remove the get_uri assignment.
-
- * backend/pas/pas-backend-sync.c (_pas_backend_get_card_list):
- don't free this, it's freed in the pas_book code.
-
- * backend/pas/pas-backend-sync.h: make use of pas-types.h and
- remove some typedefs.
-
- * backend/pas/pas-backend-summary.h: same.
-
- * backend/pas/pas-backend-card-sexp.h: same.
-
-2003-07-23 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-book.c
- (impl_GNOME_Evolution_Addressbook_Book_getBookView): spew.
- (pas_book_respond_create): unifdef this.
- (pas_book_respond_remove): same.
- (pas_book_respond_modify): same.
- (pas_book_respond_authenticate_user): same.
- (pas_book_respond_get_supported_fields): unref the iterator.
- (pas_book_respond_get_book_view): unifdef, and add spew.
-
- * backend/pas/pas-book.h: make use of pas-types.h and remove some
- typedefs.
-
-2003-07-23 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-types.h: new file, all the typedefs shared
- between files here.
-
-2003-07-23 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-book-view.c (send_pending_adds): abstract all
- the aggregating code to the book view. backends just call
- notify_card_added and the superclass does all the aggregating.
- (pas_book_view_notify_change): if there are pending adds, send
- them before we send the change.
- (pas_book_view_notify_remove): same.
- (pas_book_view_notify_add): the other part of the aggregating
- code.
- (pas_book_view_notify_complete): send pending adds if there are
- any.
- (impl_GNOME_Evolution_Addressbook_BookView_start): new function,
- call pas_backend_start_book_view.
- (pas_book_view_get_card_query): new function.
- (pas_book_view_get_card_sexp): new function.
- (pas_book_view_get_backend): new function.
-
- * backend/pas/pas-book-view.h: add a PASBackend arg to the
- constructor, as well as the char* query and PASBackendCardSExp
- form. also add accessors for card_query, card_sexp, and backend.
-
- * backend/idl/addressbook.idl
- (GNOME::Evolution::Addressbook::BookView): add start() method.
- (GNOME::Evolution::Addressbook::BookListener): remove the oneway
- tag from notifyBookOpened, notifyViewRequested, and
- notifyChangesRequested so the call doesn't return until the remote
- object has gotten the method call.
-
- * backend/pas/pas-backend.c (pas_backend_load_uri): fill in the
- uri slot if the load was successful.
- (pas_backend_get_uri): return the uri, remove the virtual method
- call.
- (pas_backend_start_book_view): new function.
- (process_client_request): ifdef out the threaded foo, since i'm
- not certain it's at all necessary.
- (real_add_client): remove the bonobo_object_unref of the book,
- since it's immortal.
- (pas_backend_dispose): free the uri.
-
- * backend/pas/pas-backend.h: remove the get_uri virtual method,
- and add the start_book_view virtual method and
- pas_backend_start_book_view prototype.
-
-2003-07-23 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/Makefile.am (libpasvcf_a_SOURCES): new.
- (noinst_LIBRARIES): add libpasvcf.a
-
- * backend/pas/pas-backend-vcf.[ch]: new files, implement a vcard
- file backend. the backend api still needs a little work, but it's
- getting easier to write backends.
-
-2003-07-23 Chris Toshok <toshok@ximian.com>
-
- * printing/e-contact-print.c (e_contact_print_response): deal with
- "uses_list". Fixes #30839.
- (e_contact_print_dialog_new): use GINT_TO_POINTER instead of
- casting to void*, and set "uses_list" to FALSE.
- (e_contact_print_card_dialog_new): same.
- (e_contact_print_card_list_dialog_new): same, but set "uses_list"
- to TRUE.
-
-2003-07-23 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book.c (e_book_dispose): fix a typo.
-
-2003-07-22 Akira TAGOH <tagoh@redhat.com>
-
- * printing/e-contact-print-envelope.c (ecpe_print): Use 'Sans'
- instead of 'Helvetica' for the font name.
- * printing/e-contact-print.c (e_contact_build_style): Likewise.
-
-2003-07-23 Dan Winship <danw@ximian.com>
-
- * backend/ebook/Makefile.am: use EVO_MARSHAL_RULE
- * backend/pas/Makefile.am: Likewise
- * gui/component/select-names/Makefile.am: Likewise
- * gui/contact-editor/Makefile.am: Likewise
- * gui/contact-list-editor/Makefile.am: Likewise
- * gui/widgets/Makefile.am: Likewise
-
- * gui/contact-editor/e-contact-editor.c
- (e_contact_editor_class_init):
- s/ece_marshal/e_contact_editor_marshal/
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (e_contact_list_editor_class_init): Likewise for ecle_marshal
-
- * gui/search/e-addressbook-search-dialog.c
- (e_addressbook_search_dialog_init): Remove gtk_window_set_policy
- call since that function is deprecated and it was just setting
- everything to the default values anyway.
-
- * gui/widgets/e-addressbook-util.c: #include gal/util/e-util.h for
- e_free_object_list.
-
-2003-07-22 Dan Winship <danw@ximian.com>
-
- * backend/ebook/e-card.c: (e_card_new,
- e_card_new_with_default_charset): Make the "vcard" arg const.
- ...: add lots and lots of other consts as a side effect
-
-2003-06-30 Dan Winship <danw@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (e_addressbook_view_dispose):
- disconnect from model signals to prevent a race condition at
- shutdown where the view gets destroyed and then the model notices
- the backend dying before being destroyed itself.
-
- * gui/widgets/e-addressbook-reflow-adapter.c
- (addressbook_finalize): add, to free priv.
- (e_addressbook_reflow_adapter_class_init): set it up
-
- * gui/component/e-address-popup.c (e_address_popup_set_free_form):
- Don't leak strings
-
- * gui/component/addressbook-storage.c (load_source_data): don't
- leak xml data.
-
- * gui/component/addressbook-component.c (new_item_cb): don't leak
- the new card.
-
-2003-06-25 Gilbert Fang <gilbert.fang@sun.com>
-
- * gui/widgets/e-minicard-view-widget.c
- (e_minicard_view_widget_real_focus_in_event): new function,
- override the event handler for focus_in_event, set the first item
- be focused if no focused item at all. Fixes bug 41826.
-
-2003-06-18 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (fill_in_field): in the
- EUrlEntry case just reassign widget. it'll be handled by the
- GtkEditable code below. Fixes #43841.
-
-2003-06-14 Larry Ewing <lewing@ximian.com>
-
- * gui/backend/ebook/e-card-simple.c:
- * gui/backend/ebook/e-card.c:
- * gui/backend/ebook/evolution-ldif-importer.c:
- * gui/backend/ebook/load-pine-addressbook.c:
- * gui/backend/ebook/test-card.c:
- * gui/backend/pas/pas-backend-card-sexp.c:
- * gui/backend/pas/pas-backend-ldap.c: Fix lots of leaks, update
- for correct use of g_object_get. Some cleanups.
-
-2003-06-13 Larry Ewing <lewing@ximian.com>
-
- * gui/component/addressbook.c:
- * gui/component/e-cardlist-model.c:
- * gui/component/select-names/e-select-names-text-model.c:
- * gui/contact-editor/e-contact-editor.c:
- * gui/contact-editor/e-contact-save-as.c:
- * gui/contact-list-editor/e-contact-list-editor.c:
- * gui/widgets/e-addressbook-table-adapter.c:
- * gui/widgets/e-addressbook-util.c:
- * gui/widgets/e-addressbook-view.c:
- * gui/widgets/e-minicard-view.c:
- * gui/widgets/e-minicard.c: Fix lots of leaks, update for correct
- use of g_object_get. Some misc cleanups.
-
- * printing/e-contact-print.c: update for correct use of
- g_object_get.
-
-2003-06-05 Not Zed <NotZed@Ximian.com>
-
- ** For #42691.
-
- * gui/component/select-names/Makefile.am (%.server.in): implicit
- rule for .in file.
- (BUILT_SOURCES): added server_DATA.
-
- * gui/component/Makefile.am (%.server.in): use implicit rule for
- .in file.
- (BUILT_SOURCES): added, just server_DATA.
- (CLEANFILES): added
-
- * backend/ebook/Makefile.am (BUILT_SOURCES): add server_DATA.
-
-2003-06-04 Rodrigo Moya <rodrigo@ximian.com>
-
- * backend/ebook/ebook.c (e_book_do_response_open): adapted to
- changes in EComponentListener API.
-
-** See ChangeLog.pre-1-4 for older changes
-
diff --git a/addressbook/ChangeLog.pre-1-4 b/addressbook/ChangeLog.pre-1-4
deleted file mode 100644
index b1c12cb82f..0000000000
--- a/addressbook/ChangeLog.pre-1-4
+++ /dev/null
@@ -1,16758 +0,0 @@
-2003-05-19 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (func_beginswith): use the more
- convoluted (but more correct) query if evolutionPerson is
- supported. Fixes #42825.
-
-2003-05-19 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-destination.c (use_default_book_cb): handle the
- case where @book == NULL, which can happen if there was a problem
- opening the default book. Should fix #43005.
-
-2003-05-19 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c
- (ensure_completion_uris_exist): fix the initial run case. the
- config upgrade code creates all elements so we can't just check
- for NULL - we have to check if the string is empty. Fixes #43213.
-
-2003-05-19 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard-label.c (set_colors): if we've got focus,
- set the background of the rect to bg[NORMAL], and the fill color
- of the text and label to text[NORMAL]. This will make the
- background a different color than the canvas, but won't make it
- use the selected background. fixes #42472
-
-2003-05-19 Chris Toshok <toshok@ximian.com>
-
- * gui/merging/e-card-merging.c (e_card_merging_book_commit_card):
- add a g_object_ref(card), to match the one in
- e_card_merging_book_add_card. Fixes #43175.
-
-2003-05-19 Anna Marie Dirks <anna@ximian.com>
-
- * gui/contact-editor/e-contact-quick-add.c: Added HIG-appropriate
- HIG-appropriate spacing, padding, accelerators. Fixes bug #41210
-
- * gui/component/ldap-config.glade: HIG-ified the various dialogs
- (including the settings pages, the config druid, and the edit dialog)
- in this glade file. This fixes bugs #41140, #41137, #41130
-
- * gui/merging/e-card-merging-book-commit-duplicate-detected.glade:
- Changed button order, and added HIG-appropriate spacing/padding.
- Fixes bug #41232.
-
- * gui/merging/e-card-duplicate-detected.glade: Changed button
- order, and added HIG-appropriate spacing/padding. Fixes bug
- #41229 and #41231.
-
-2003-05-19 Sean Gao <sean.gao@sun.com>
-
- * gui/component/addressbook-component.c (xfer_folder): remove the
- summary if @remove_source is TRUE. Fixes 38084.
-
-2003-05-16 Anna Marie Dirks <anna@ximian.com>
-
- * gui/contact-list-editor/contact-list-editor.glade: Added
- HIG-appropriate spacing, padding, capitalization and accelerators.
- Fixes bug #41254
-
-2003-05-16 Anna Marie Dirks <anna@ximian.com>
-
- * gui/contact-editor/fulladdr.glade: Added HIG-appropriate
- spacing, padding, capitalization and accelerators. Fixes bug #41251
-2003-05-14 Anna Marie Dirks <anna@ximian.com>
-
- * gui/contact-editor/fullname.glade: Added HIG-appropriate
- spacing, padding, caps, title and accelerators. Fixes bug #41249,
- and also bug #41250..
-
-2003-05-16 Anna Marie Dirks <anna@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Added HIG-appropriate
- spacing, padding, capitalization and accelerators. Fixes bug #41248.
-
-
-2003-05-16 Rodney Dawes <dobey@ximian.com>
-
- * addressbook/backend/ebook/Makefile.am: Move the tools to a
- more appropriate directory, privlibexecdir
-
-2003-05-15 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (book_open_cb): backing out a tiny
- porting of jpr's fix - we need to set the book on the
- EAddressbookView, or else it won't do queries, and it won't show
- any cards. Fixes #43023, #43090.
-
-2003-05-15 Chris Toshok <toshok@ximian.com>
-
- * gui/merging/e-card-merging.c (free_lookup): new function, split
- out the duplicated teardown code from final_cb and final_id_cb.
- also, unref the card.
- (final_id_cb): call free_lookup.
- (final_cb): same.
- (e_card_merging_book_add_card): ref the card. fixes bug #43016.
-
-2003-05-14 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (full_addr_clicked):
- replace the text_buffer_delete/text_buffer_insert with
- set_buffer_set_text. call widget_changed if they clicked OK, so
- we actually mark the dialog changed.
- (fill_in_field): make this handle GtkTextViews, because for some
- reason that escapes rational thought GtkTextView's don't implement
- GtkEditable. fixes #42606.
- (extract_field): same.
-
-2003-05-14 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard-label.c (e_minicard_label_reflow): set
- the clip_height on reflow so the name of the field is as high as
- the field's value. makes it possible to click anywhere to the
- left of a tall field (like an address) and have it select the
- field. Fixes #42625.
-
-2003-05-14 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (address_mailing_changed):
- handle the case where we haven't filled in the address yet. fixes
- #42620.
-
-2003-05-14 JP Rosevear <jpr@ximian.com>
-
- * gui/component/addressbook.c (addressbook_view_unref): clear the
- view
- (book_open_cb): track the book in the view, don't unref the book
- (set_prop): set the book
- (retrieve_shell_view_interface_from_control): get the shell view
- every time
- (set_folder_bar_label): release and unref the shell view
-
- * gui/component/addressbook-storage.h: add proto
-
- * gui/component/addressbook-storage.c
- (addressbook_storage_cleanup): unref the storage
-
- * gui/component/addressbook-component.c (owner_unset_cb): clean up
- storage
-
- * backend/ebook/e-book.c (e_book_load_uri): track the listener
- signal
- (e_book_dispose): unref the listener and disconnect the signal
-
-2003-05-13 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_set_separator): strlen ->
- g_utf8_strlen.
- (e_select_names_text_model_insert): same.
- (e_select_names_text_model_insert_length): big change, make this
- work with multibyte utf8.
- (e_select_names_text_model_delete): same. this could possibly use
- a tighter loop + a memmove, but this works.
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_get_textification): make sure our truncation
- to MAX_LENGTH characters uses utf8 characters, not bytes.
- (e_select_names_model_name_pos): track e-text-model change.
- pos/length are now in utf8 character terms, so use g_utf8_strlen
- instead of strlen.
- (e_select_names_model_text_pos): same.
-
-2003-05-13 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-table-adapter.c (addressbook_dispose):
- rename addressbook_destroy to this, and guard against multiple
- calls.
- (e_addressbook_table_adapter_class_init): GtkObject -> GObject,
- and destroy -> dispose.
- (e_addressbook_table_adapter_init): GtkObject -> GObject.
-
-2003-05-12 Sean Gao <sean.gao@sun.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (e_contact_list_editor_init): terminate g_build_filename with
- NULL.
-
-2003-05-11 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #42048 ]
- * gui/widgets/e-addressbook-view.c (e_contact_print_button):
- button => response.
- (e_addressbook_view_print): connect to "response", not "clicked".
-
-2003-05-11 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #41245 ]
- * gui/component/select-names/select-names.glade: fix
- spacing/border widths as per HIG.
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_init): set the border width/spacing on widgets we
- create here.
-
-2003-05-09 Jeremy Katz <katzj@redhat.com>
-
- * printing/e-contact-print.c (e_contact_print_response): Use glib
- macro to case from pointer to int.
-
- * printing/e-contact-print-envelope.c: Add missing #include.
-
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_start_query): Use
- E_SELECT_NAMES_COMPLETION to avoid warning
-
-2003-05-06 Chris Toshok <toshok@ximian.com>
-
- [ really commit this, fixes bug #41910 ]
- * gui/contact-list-editor/e-contact-list-model.c
- (e_contact_list_model_remove_row): change from model_changed to
- row_deleted here. model_changed causes the table to free its
- ETableSelection, which is what we iterate over when deleting
- contacts.
- (e_contact_list_model_add_destination): no need to be calling
- model_changed here either.
-
-2003-04-29 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #41255 ]
- * gui/contact-list-editor/contact-list-editor.glade: use stock
- buttons for Add/Remove.
-
-2003-04-29 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #41144 ]
- * gui/component/ldap-config.glade: use stock buttons for the
- Add/Delete buttons. Switch from "Delete" to "Remove", though, as
- "Remove" fits much better with the one for "Add". Also, add our
- stock-edit-24.png icon for "Edit".
-
-2003-04-29 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #41211 ]
- * gui/component/e-address-popup.c (e_address_popup_no_matches):
- call e_button_new_with_stock_icon to create our button and give it
- the right icon.
-
-2003-04-29 Gilbert Fang <gilbert.fang@sun.com>
-
- * tools/evolution-addressbook-export-list-cards.c
- (set_pre_defined_field): remove duplicate HOME_COUNTRY field add.
-
-2003-04-28 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #41843]
- * tools/evolution-addressbook-export-list-cards.c
- (e_card_simple_csv_get_name): use e_card_simple_get_ecard_field
- instead of e_card_simple_get_name, so the return value won't be
- localized.
-
-2003-04-28 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #41779 ]
- * gui/component/e-address-popup.c (mini_wizard_container_add): we
- don't need to call gtk_widget_destroy on the old child, since
- gtk_container_remove will unref it for us.
-
-2003-04-23 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #37351 ]
- * gui/widgets/e-addressbook-view.c (table_drag_data_get): the row
- the signal is called with is already the model row, not the view
- row, so don't call e_table_view_to_model_row on it.
-
-2003-04-23 Chris Toshok <toshok@ximian.com>
-
- [ either mostly or entirely fixes #33708 ]
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_done): new function, factor it out of
- _seq_complete_cb because we need to run the same code in a couple
- of places.
- (e_select_names_completion_got_book_view_cb): treat an error from
- a book as getting a "sequence_complete", and decrement the count
- of pending complete signals.
- (e_select_names_completion_got_book_view_cb): remove the increment
- of pending_completion_seq from here.
- (e_select_names_completion_seq_complete_cb): factor out the body
- of e_select_names_completion_done from here, and call it.
- (e_select_names_completion_start_query): increment
- pending_completion_seq here. remove the async variable, as we can
- now use pending_completion_seq for that purpose (it's > 0 iff
- async would have been TRUE).
-
-2003-04-19 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #40954 ]
- * backend/pas/pas-backend-file.c (pas_backend_file_dispose): guard
- against NULL bf->priv->summary (happens if the initial load_uri
- failed).
- (pas_backend_file_load_uri): always set bf->priv->uri, since it's
- used in _get_uri, which is called when the backend goes away.
- This only happened before if you tried to load a folder that
- didn't exist.
-
-2003-04-19 Chris Toshok <toshok@ximian.com>
-
- [ fixes #40694 ]
- * gui/component/select-names/e-select-names-bonobo.c
- (control_activate_cb): just grab focus if @activate == TRUE.
- we'll do all merging/unmerging in the focus handler.
- (widget_focus_cb): handle the merging here.
- (e_bonobo_control_automerge_ui): store off the widget (so we can
- grab focus on it) and connect to "activate".
-
-2003-04-18 Rodney Dawes <dobey@ximian.com>
-
- * gui/component/select-names/Makefile.am: Add missing -DPREFIX
-
-2003-04-18 Rodney Dawes <dobey@ximian.com>
-
- [ fixes #21499 ]
- * gui/component/Makefile.am:
- * gui/component/addressbook.c:
- * gui/component/select-names/e-select-names-bonobo.c:
- * gui/contact-editor/Makefile.am:
- * gui/contact-editor/e-contact-editor.c:
- * gui/contact-list-editor/Makefile.am:
- * gui/contact-list-editor/e-contact-list-editor.c:
- Use PREFIX instead of EVOLUTION_DATADIR for bonobo_ui_util_set_ui ()
-
-2003-04-15 Chris Toshok <toshok@ximian.com>
-
- [ fixes #41252 ]
- * gui/contact-editor/fulladdr.glade: change title from "Check
- Address" to "Full Address".
-
-2003-04-09 Chris Toshok <toshok@ximian.com>
-
- [ fixes #40727 ]
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_start_query): if the query text is
- either shorter than the cached query_text or they don't match,
- don't just set can_reuse_cached_cards to FALSE. we also need to
- invalidate the cache.
-
-2003-04-08 Ettore Perazzoli <ettore@ximian.com>
-
- * backend/ebook/e-destination.c (d): Remove all debugging
- messages.
-
-2003-04-08 Dan Winship <danw@ximian.com>
-
- * gui/component/ldap-config.glade: Remove color specifications
- from the druid so it will use theme colors.
-
- * gui/component/addressbook-config.c
- (addressbook_add_server_druid): Use g_signal_connect_after for
- "prepare" signal (to work around b.g.o 81869)
-
-2003-04-07 Chris Toshok <toshok@ximian.com>
-
- [ fixes #7103 ]
- * gui/widgets/e-minicard-label.c (e_minicard_label_class_init):
- init style_set. and add the signal.
- (e_minicard_label_realize): include e_minicard_label_construct's
- code here, and call set_colors after we create the sub-items.
- (e_minicard_label_unrealize): indent, and remove dead code.
- (e_minicard_label_event): indent, and call set_colors instead of
- setting the colors manually.
- (set_colors): new function, set our colors based on the current
- style.
- (e_minicard_label_style_set): new function, just call set_colors.
- (e_minicard_label_new): e_minicard_label_construct doesn't exist
- anymore.
-
- * gui/widgets/e-minicard-label.h (struct _EMinicardLabelClass):
- add style_set signal.
-
- * gui/widgets/e-minicard.c (set_selected): little tweaks in the
- coloring.
- (e_minicard_unrealize): reindent, and remove some unused code.
-
- * gui/widgets/e-minicard-view-widget.h (struct
- _EMinicardViewWidget): add background.
-
- * gui/widgets/e-minicard-view-widget.c
- (e_minicard_view_widget_class_init): init
- widget_class->style_class.
- (e_minicard_view_widget_style_set): new function, just set the
- background's fill_color_gdk to base[GTK_STATE_NORMAL].
- (e_minicard_view_widget_realize): store off the background canvas
- item so we can set the color later.
-
-2003-04-07 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #40901 ]
- * gui/component/ldap-config.glade: HIG-ify the ldap server edit
- dialog's button layout.
-
-2003-04-07 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #39763 ]
- * gui/component/select-names/e-select-names-bonobo.c (copy_cb):
- verb callback for EditCopy
- (cut_cb): verb callback for EditCut.
- (paste_cb): verb callback for EditPaste.
- (select_all_cb): verb callback for SelectAll.
- (free_closure): new function
- (merge_menu_items): same
- (unmerge_menu_items): same
- (control_set_frame_cb): same
- (control_activate_cb): same
- (widget_focus_cb): same
- (e_bonobo_control_automerge_ui): new function, sets up focus
- signals on the widget passed in to merge/unmerge the passed in
- ui/verbs.
- (impl_SelectNames_get_entry_for_section): call
- e_bonobo_control_automerge_ui for this entry.
-
-2003-04-07 Chris Toshok <toshok@ximian.com>
-
- * gui/component/e-address-popup.c (mini_wizard_new): change the
- ok/cancel button layout to be higified.
-
-2003-04-07 Chris Toshok <toshok@ximian.com>
-
- [ last portion of #40046 fix ]
- * gui/component/select-names/e-select-names-popup.c
- (remove_recipient_cb): ifdef this out to quiet the compiler.
- (remove_all_recipients_cb): same.
- (toggle_html_mail_cb): same.
- (populate_popup_card): change the #if 0 to #if
- TOO_MANY_MENU_ITEMS.
- (popup_menu_list): nuke, as it's handled by populate_popup_card.
- (populate_popup_nocard): rename popup_menu_nocard to this, and
- implement it as in populate_popup_card.
- (e_select_names_populate_popup): we don't need the card, since we
- don't check if it's a list here anymore. also, remove the #if 0
- surrounding the nocard case.
-
-2003-04-07 Not Zed <NotZed@Ximian.com>
-
- Fixes #40252.
-
- * conduit/address-conduit.c: Change the LOG macro to a
- single arg macro which copies its arg. Fix all callers. Change
- WARN and INFO to simply g_warning/g_message. Init G_LOG_DOMAIN
- before including anything.
-
-2003-04-07 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am (SUBDIRS): add tools.
-
-2003-04-07 Gilbert Fang <gilbert.fang@sun.com>
-
- [ fixes bug #23036 ]
- * tools/evolution-addressbook-export.c,
- tools/evolution-addressbook-export-list-cards.c,
- tools/evolution-addressbook-export-list-folders.c: : new and
- improved export utility.
-
-2003-04-07 Dan Winship <danw@ximian.com>
-
- * gui/component/GNOME_Evolution_Addressbook.server.in.in: Clean up
- server names.
-
- * gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in:
- Likewise
-
- * backend/ebook/GNOME_Evolution_Addressbook_LDIF_Importer.server.in.in:
- Likewise. Also mark the evolution:menu_name for i18n.
-
- * backend/ebook/GNOME_Evolution_Addressbook_VCard_Importer.server.in.in:
- Likewise
-
-2003-04-03 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard-label.c (e_minicard_label_event): set
- "handle_popup" on the field to be TRUE if it's got focus, FALSE if
- not.
-
-2003-04-03 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard-label.c (e_minicard_label_construct):
- doh, set the im_context on the field name too so we get the Input
- Method submenu in the contxt menu.
-
-2003-04-03 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard-label.c (e_minicard_label_construct): set
- the im_context on the field's EText.
- (e_minicard_label_event): remove a huge swath of #if 0'd code.
-
-2003-04-03 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #40715 ]
- * gui/merging/e-card-merging.c (final_id_cb): add this callback,
- to unref the book/free the closure after calling the user's
- callback.
- (final_cb): same.
- (doit): use final{_id}_cb
- (cancelit): same.
- (response): don't free the lookup struct here.
- (match_query_callback): same.
- (e_card_merging_book_add_card): ref the book.
- (e_card_merging_book_commit_card): same.
-
- * gui/component/e-address-popup.c (card_picker_init): make sure to
- set the "text" attribute on the cell renderer so the text actually
- shows up. also, g_object_connect -> g_signal_connect *sigh*.
- Lastly, get rid of the scrolled window and just make the window
- size to show the text.
-
- * gui/widgets/e-minicard.c (e_minicard_style_set): only call
- set_selected if we're realized (we create all the canvas objects
- that set_selected manipulates in our realize method.)
-
-2003-04-03 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/Makefile.am (INCLUDES): add
- EVOLUTION_IMAGESDIR
-
-2003-04-02 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-popup.c: change all
- this around so that we populate the existing popup. This means we
- get the select names popup stuff on top of the normal EEntry popup
- foo.
-
- * gui/component/select-names/e-select-names-popup.h
- (e_select_names_populate_popup): rename e_select_names_popup to
- this.
-
- * gui/component/select-names/e-select-names-manager.c
- (populate_popup_cb): rename popup_cb here, and
- e_select_names_popup -> e_select_names_populate_popup.
- (e_select_names_manager_entry_new): popup -> populate_popup.
-
-2003-04-02 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-marshal.list: add NONE:OBJECT
-
- * gui/widgets/e-minicard.c (e_minicard_class_init): add style_set
- signal.
- (e_minicard_style_set): just call set_selected with the currently
- selected flag, so we recolor properly.
-
- * gui/widgets/e-minicard.h (struct _EMinicardClass): add style_set
- signal.
-
-2003-04-01 Rodrigo Moya <rodrigo@ximian.com>
-
- * backend/ebook/evolution-ldif-importer.c (load_file_fn):
- * backend/ebook/evolution-vcard-importer.c (load_file_fn): added
- "folder_type" parameter to EvolutionImporterLoadFileFn.
-
-2003-03-31 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book-util.c (get_local_book_uri): new function,
- just return the local uri.
- (set_default_book_uri_local): use get_local_book_uri.
- (e_book_default_book_open): only try and reload the default book
- if it's not already the local book.
-
-2003-03-31 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (card_removed): it emits a list now
-
-2003-03-31 Dan Winship <danw@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_init): Remove folder-selector button
- initialization.
- (e_select_names_new): Initialize folder-selector button here,
- using the passed-in EvolutionShellClient rather than depending on
- a global variable.
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_activate_dialog): take an
- EvolutionShellClient and pass it to e_select_names_new().
-
- * gui/component/select-names/e-select-names-bonobo.c
- (impl_SelectNames_activate_dialog): get a pointer to the shell
- from bonobo-activation, create a shell_client, and pass it to
- e_select_names_manager_activate_dialog.
-
- * backend/ebook/e-book-util.c (e_book_get_default_book_uri):
- constify return value
-
-2003-03-30 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-vcard.[ch]: braindead, and *extremely* forgiving
- vcard parser. not for public consumption yet.
-
-2003-03-30 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #39381 (again) ]
- * gui/component/e-address-popup.c (edit_contact_info_cb): add
- "GtkWidget *button" first arg, so we don't crash.
-
-2003-03-28 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #40403 ]
- * backend/ebook/e-card.c (e_card_get_vobject): revert the fix for
- 28945, as was done on the 1.2 branch. this is because the "fix"
- actually breaks internal use of contact lists. We need to make
- the exporting of contacts DTRT, instead of fixing it here.
-
-2003-03-28 Chris Toshok <toshok@ximian.com>
-
- [ fix the contact editor so that the only time the address is
- parsed is when the user types in the address GtkTextView. ]
- * gui/contact-editor/e-contact-editor.c (address_mailing_changed):
- make this use delivery addresses instead of labels.
- (full_addr_clicked): same.
- (find_address_mailing): same.
-
- * backend/ebook/e-card-simple.c
- (e_card_simple_set_delivery_address): make this operate similar to
- e_card_simple_set_address: it sets both the delivery address and
- the label for the address.
-
-2003-03-26 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #19178 ]
- * backend/ebook/evolution-ldif-importer.c (ebook_open): use
- e_book_load_address_book_by_uri on the passed in uri.
- (load_file_fn): pass the uri.
-
- * backend/ebook/evolution-vcard-importer.c (ebook_open): use
- e_book_load_address_book_by_uri on the passed in uri.
- (load_file_fn): pass the uri.
-
-2003-03-26 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #34651 ]
- * gui/component/select-names/e-select-names.c
- (select_entry_changed): strcmp -> g_utf8_collate.
- (update_query): encode the string we pass for the query.
-
-2003-03-26 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #34085 ]
- * gui/contact-list-editor/e-contact-list-editor.c
- (table_drag_data_received_cb): only successfully complete the drag
- if they dropped a valid vcard (or vcard list). Call
- gtk_drag_finish.
-
-2003-03-26 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-list-editor/Makefile.am (INCLUDES): $evolution_uidir
- -> $evolutionuidir
-
-2003-03-26 Philip Zhao <philip.zhao@sun.com>
-
- [ fixes bug #39170 ]
- * backend/pas/pas-backend.c (pas_backend_create_card): remove
- 'return'.
- (pas_backend_remove_cards): same.
- (pas_backend_modify_card): same.
- (pas_backend_check_connection): same.
- (pas_backend_get_vcard): same.
- (pas_backend_get_cursor): same.
- (pas_backend_get_book_view): same.
- (pas_backend_get_completion_view): same.
- (pas_backend_get_changes): same.
- (pas_backend_authenticate_user): same.
- (pas_backend_get_supported_fields): same.
- (pas_backend_get_supported_auth_methods): same.
-
-2003-03-26 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (local_record_from_ecard): append the
- second line to the address if necessary
- (ecard_from_remote_record): split the address line in two if
- necessary
-
-2003-03-23 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-list-editor/contact-list-editor.glade: set the
- dialog to "Visible: No" so it doesn't flash when we bring it up.
-
-2003-03-23 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #40026 ]
- * gui/contact-editor/e-contact-editor.c (set_field): add
- EContactEditor arg, and block/unblock signals around the
- gtk_entry_set_text, since that generates a "changed" signal which
- causes problems.
- (set_phone_field): take and pass along an EContactEditor arg.
- (set_fields): pass editor to set_field.
-
-2003-03-23 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/arrow.png: nuke.
-
- * gui/contact-editor/Makefile.am (EXTRA_DIST): remove images_DATA
- (images_DATA): nuke, don't need it anymore.
-
- * gui/contact-editor/e-contact-editor.c
- (connect_arrow_button_signal): rename _replace_button to this. we
- no longer create an image, as it's a GtkArrow in the .glade file
- now.
- (connect_arrow_button_signals): rename _replace_buttons to this.
- no longer pass the arrow.png's to _replace_button.
- (e_contact_editor_init): _replace_buttons ->
- connect_arrow_button_signals.
- (_arrow_pressed): remove some dead code, and some args that aren't
- used.
- (_phone_arrow_pressed): track change to _arrow_pressed.
- (_email_arrow_pressed): same.
- (_address_arrow_pressed): same.
-
-2003-03-23 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #31786 ]
- * gui/component/addressbook-config.c
- (addressbook_source_dialog_set_source): fix some gtk warnings.
- (set_advanced_button_state): the advanced dialog isn't present in
- the glade file anymore, so ifdef everything dealing with it.
- (addressbook_edit_server_dialog): same.
-
- * gui/component/ldap-config.glade: remove all the unused Advanced
- UI stuff to lessen the amount of strings needing translation.
-
-2003-03-23 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #32113 ]
- * backend/ebook/e-destination.h: add include_email arg to
- e_destination_get_textrep.
-
- * backend/ebook/e-destination.c (e_destination_get_textrep): add
- include_email arg. if it's TRUE, and if there's an email address to
- add
-
- * gui/contact-list-editor/e-contact-list-model.c
- (contact_list_value_at): use e_destination_get_textrep so we don't
- display QP text, and pass TRUE for include_email.
-
- * gui/widgets/e-minicard.c (add_field): same.
- (remodel): same.
-
- * gui/widgets/e-addressbook-treeview-adapter.c (adapter_get_value): same.
-
- * gui/widgets/e-addressbook-table-adapter.c (addressbook_value_at): same.
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_insert_length): pass FALSE for
- include_email.
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_get_textification): pass FALSE for
- include_email.
- (e_select_names_model_get_string): same.
- (e_select_names_model_replace): same.
- (e_select_names_model_name_pos): same.
- (e_select_names_model_text_pos): same.
-
-2003-03-19 Ettore Perazzoli <ettore@ximian.com>
-
- * backend/ebook/GNOME_Evolution_Addressbook_VCard_Importer.server.in.in:
- Replace "evolution:menu-name" prop with "evolution:menu_name". [#39692]
- * backend/ebook/GNOME_Evolution_Addressbook_LDIF_Importer.server.in.in: Likewise.
-
-2003-03-18 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-table-model.c
- (e_select_names_table_model_col_count): up the column count by one
- for the underline.
- (e_select_names_table_model_value_at): add handling for underline.
-
-2003-03-18 Chris Toshok <toshok@ximian.com>
-
- * gui/component/e-address-popup.c (email_menu_add_option): fix use
- of deprecated gtk_menu_append.
- (card_picker_selection_changed): change this to be used with the
- "changed" signal on GtkTreeSelection.
- (free_str): yeah, gross. i know.
- (card_picker_init): this needed some fixing, so the strings don't
- go away after we insert them into the model. also, connect to the
- "changed" GtkTreeSelection signal instead of using the nonexistant
- gtk_tree_selection_set_func.
- (e_address_popup_construct): gtk_style_unref -> g_object_unref.
- (popup_size_allocate_cb): nuke.
- (e_address_popup_ambiguous_email_add): use gtk_window_set_position
- and let the window manager place the window instead of doing it
- ourself.
-
-2003-03-18 Chris Toshok <toshok@ximian.com>
-
- [ Fixes addressbook bug #39730 ]
- * gui/component/ldap-config.glade: add response ids to the search
- base dialog.
-
- * gui/component/addressbook-config.c
- (addressbook_source_dialog_destroy): use g_object_unref, not
- gtk_widget_destroy, on the GladeXML.
- (addressbook_add_server_druid): call gtk_window_set_type_hint
- GDK_WINDOW_TYPE_HINT_DIALOG so this window looks like a dialog.
- (editor_modify_cb): no more apply button.
- (edit_dialog_apply_clicked): nuked.
- (edit_dialog_close_clicked): rename to _cancal_clicked.
- (edit_dialog_ok_clicked): call gtk_widget_destroy here instead of
- calling _cancel_clicked.
- (addressbook_edit_server_dialog): no more apply button, and
- close_button -> cancel_button. Also, set the hint to
- GDK_WINDOW_TYPE_HINT_DIALOG.
- (ldap_dialog_new): fix compiler warning.
- (addressbook_dialog_create_sources_table): same.
-
-2003-03-18 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-section.etspec: use
- alternating-row-colors="false"
-
- * gui/component/select-names/e-select-names.h: nuke prototypes for
- e_select_names_get_source/section.
-
- * gui/component/select-names/e-select-names.c (set_book): remove
- the signal disconnect from here.
- (addressbook_model_set_uri): same.
- (e_select_names_init): connect to the search_result signal on the
- addressbook model.
- (e_select_names_child_free): disconnect the changed_id signal.
- (e_select_names_add_section): set the underline column so the
- recipient tables look like they did when they were EEntry.
- (e_select_names_add_section): store off the changed_id.
- (e_select_names_get_section): nuke.
- (e_select_names_get_source): nuke.
-
-2003-03-18 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (addrconduit_load_configuration): kill
- warning by sinking objects
-
-2003-03-18 Not Zed <NotZed@Ximian.com>
-
- * gui/component/select-names/e-select-names.c (set_book,
- addressbook_model_set_uri): disconnect/keep track of search result
- signal id.
- (e_select_names_init): Keep track of various signals, particularly
- status signal.
- (e_select_names_dispose): disconnect from any signals that are
- still active. Fixes crash for #38202.
-
-2003-03-13 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c
- (set_entry_changed_signals): use set_entry_changed_signal_email
- for the email entry so the email gets saved out.
- (set_entry_changed_signal_email): new function, analogous to
- set_entry_changed_signal_phone, but for email.
-
-2003-03-12 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #20210 ]
- * gui/component/select-names/e-select-names-popup.c
- (popup_menu_card): change "Edit Contact Info" to "View Contact
- Info", as you can't always edit the contact (if the book is read
- only).
- (popup_menu_list): same, but for a contact list.
-
-2003-03-11 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #39507 ]
- * gui/component/select-names/e-select-names.c (search_result): new
- function, sync the models after we do a search.
- (addressbook_model_set_uri): connect to search_result.
-
-2003-03-11 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_init): fix compiler warnings about deprecated
- functions.
- (e_select_names_child_free): unref the table model.
- (remove_address): re-enable.
- (section_right_click_cb): this is an ETable callback now.
- (e_select_names_add_section): remove a gross gross awful hack, and
- make the recipient tables ETables instead EEntry's. We lose the
- nice underlining, but we can add that back in as another ETable
- style (like strikeout and bold), and we also fix the longstanding
- scrolling problems (like bug #25148) and can finally remove
- addresses by double clicking on them (which is also a bug
- someplace I think.. dunno the # offhand.)
-
- * gui/component/select-names/e-select-names-table-model.c
- (clear_info): always set the count to -1, regardless of what
- model->data is.
-
- * gui/component/select-names/e-select-names-model.c: remove some
- unused enums.
-
- * gui/component/select-names/Makefile.am (etspec_DATA): add
- e-select-names-section.etspec
-
- * gui/component/select-names/e-select-names-section.etspec: new
- file, spec for the To:/Cc:/Bcc: etable's in the select-names
- dialog.
-
-2003-03-11 Not Zed <NotZed@Ximian.com>
-
- * backend/pas/pas-backend-file.c (INITIAL_VCARD): Updated phone
- number. Bug #37204.
-
- * gui/widgets/e-addressbook-util.c (e_addressbook_send_card_list):
- re-enable in build, include e-destination.h. For #39256.
-
-2003-03-06 Ettore Perazzoli <ettore@ximian.com>
-
- * backend/ebook/load-pine-addressbook.c (ebook_create): Likewise.
- * backend/ebook/load-gnomecard-addressbook.c (ebook_create): Likewise.
- * backend/ebook/evolution-vcard-importer.c (ebook_create): Likewise.
- * backend/ebook/evolution-ldif-importer.c (ebook_create): Likewise.
- * backend/ebook/test-client.c (get_cursor_cb): Likewise.
- (ebook_create): Likewise.
- * gui/widgets/e-minicard.c (e_minicard_set_property): Likewise.
- (card_modified_cb): Likewise.
- (e_minicard_event): Likewise.
- * gui/widgets/gal-view-minicard.c (column_width_changed): Likewise.
- * gui/widgets/test-minicard-view.c (ebook_create): Likewise.
- * gui/widgets/gal-view-treeview.c (column_width_changed): Likewise.
-
-2003-03-05 Not Zed <NotZed@Ximian.com>
-
- * gui/component/addressbook-component.c (bonobo_main_quit_cb):
- removed.
- (owner_unset_cb): Basically a noop, the shell does the quit, we
- just note we have no owner anymore.
-
-2003-03-04 JP Rosevear <jpr@ximian.com>
-
- Fixes #37881
-
- * gui/component/select-names/e-simple-card-bonobo.c
- (impl_SimpleCard_get): if we get a null value, send back the empty
- string
-
-2003-03-04 JP Rosevear <jpr@ximian.com>
-
- * gui/component/select-names/e-select-names.etspec: reflect prior column addition
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_get_property_fn): set the arg properly
-
- * gui/component/select-names/Evolution-Addressbook-SelectNames.idl:
- add Icscalendar to field list
-
- * backend/pas/pas-backend-ldap.c: add icscalendar to prop list
-
- * backend/ebook/e-card.h: add icscalendar data member
-
- * backend/ebook/e-card.c: add icscalendar to list and its parse
- routine
- (e_card_get_vobject): add icscalendar prop value
- (parse_icscalendar): parse routine
- (e_card_class_init): add icscalendar arg
- (e_card_destroy): destroy icscalendar member
- (e_card_set_arg): set icscalendar
- (e_card_init): init icscalendar
- (e_card_get_arg): return icscalendar
-
- * backend/ebook/e-card-simple.c (field_data): add icscalendar
-
- * backend/ebook/e-card-simple.h: ditto
-
-2003-03-03 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_new): Don't set the "modal" property through
- g_object_new().
- (e_select_names_init): Explictly make the dialog modal here.
-
-2003-03-03 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (create_minicard_view): No need
- to do any reparenting here; the widget is created with no parent.
-
-2003-03-03 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_init): Instead of using gtk_widget_unparent(),
- remove the widget from the container using gtk_container_remove().
- This fixes a bunch of crashers in all the places using the
- ESelectNames widget/control.
-
-2003-02-28 Dan Winship <danw@ximian.com>
-
- * gui/contact-editor/Makefile.am: Build libecontacteditor as an
- uninstalled shared library.
-
- * gui/contact-list-editor/Makefile.am: Likewise for
- libecontactlisteditor
-
- * gui/merging/Makefile.am: and libecardmerging
-
- * gui/search/Makefile.am: and libeaddressbooksearch
-
- * gui/widgets/Makefile.am: and libeminicard
-
- * printing/Makefile.am: and libecontactprint
-
- * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD):
- Update for new library names (and get rid of libtool portability
- warnings).
-
-2003-02-28 Dan Winship <danw@ximian.com>
-
- * backend/ebook/e-card.c (e_card_list_send, e_card_send): Remove
- these from here; talking to the mailer doesn't really belong at
- the libebook level anyway.
-
- * backend/ebook/Makefile.am: Remove Evolution-Composer CORBA
- stuff, which fixes some linking problems on OS X.
-
- * gui/widgets/e-addressbook-util.c (e_addressbook_send_card_list,
- e_addressbook_send_card): Move from e-card.c and rename.
-
- * gui/widgets/Makefile.am: move Evolution-Composer CORBA stuff
- here
-
- * gui/widgets/e-addressbook-view.c (send_as, send_to,
- e_addressbook_view_send, e_addressbook_view_send_to): Update for
- new function names.
-
- * gui/contact-list-editor/e-contact-list-editor.c (file_send_as_cb,
- file_send_to_cb): Likewise
-
- * gui/contact-editor/e-contact-editor.c (file_send_as_cb,
- file_send_to_cb): Likewise
-
-2003-02-27 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (book_open_cb): use g_signal_connect
- here, not swapped... although since we pass the widget as the
- closure it really doesn't matter.
- (load_uri_auth_cb): use a GtkDialog here.
- (search_result): same.
-
- * gui/component/select-names/e-simple-card-bonobo.h: add prototype
- for e_simple_card_bonobo_construct to fix warning.
-
- * gui/widgets/e-addressbook-view.c (create_alphabet): remove call
- to gtk_widget_set_usize.
-
- * gui/contact-editor/e-contact-editor-address.c
- (e_contact_editor_address_init): gtk_window_set_policy =>
- gtk_window_set_resizable.
-
- * gui/contact-editor/e-contact-editor-fullname.c
- (e_contact_editor_fullname_init): same.
-
-2003-02-27 JP Rosevear <jpr@ximian.com>
-
- * conduit/Makefile.am: link to libversit libtool object
-
-2003-02-27 Rodney Dawes <dobey@ximian.com>
-
- * backend/ebook/Makefile.am: Fix for server files from Antonio Xu
-
-2003-02-26 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book.c (e_book_load_uri): if we fail to activate
- factories for a given protocol, return.
-
- * gui/component/ldap-config.glade: remove the two unused custom
- widgets to cut down on gtk warning spam.
-
-2003-02-21 Dan Winship <danw@ximian.com>
-
- * backend/ebook/Makefile.am (libebook_la_LIBADD): depend on
- libversit.la, libcamel.la, libename.la, and libeutil.la.
- (test_client_LDADD, test_client_list_LDADD, test_card_LDADD,
- evolution_vcard_importer_LDADD, evolution_ldif_importer_LDADD,
- load_pine_addressbook_LDADD, load_gnomecard_addressbook_LDADD):
- Remove those dependencies from here, since they're pulled in by
- libebook.
-
- * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD):
- Remove libebook's dependencies
-
- * gui/component/select-names/Makefile.am
- (libeselectnames_la_LIBADD): add this
-
- * gui/widgets/Makefile.am (various disabled *_test_LDADD): cleanup
-
- * printing/Makefile.am (contact_print_test_LDADD,
- contact_print_style_editor_test_LDADD): cleanup
-
-2003-02-20 Dan Winship <danw@ximian.com>
-
- * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD):
- s/libemiscwidgets.a/libemiscwidgets.la/
-
- * gui/widgets/Makefile.am: Likewise (in a bunch of commented-out
- test programs)
-
-2003-02-19 Dan Winship <danw@ximian.com>
-
- * gui/widgets/e-addressbook-model.c: Make parent_class static.
-
- * gui/widgets/e-addressbook-reflow-adapter.c: Likewise
-
- * gui/widgets/e-addressbook-table-adapter.c: Likewise
-
-2003-02-19 Chris Toshok <toshok@ximian.com>
-
- [ fix #38074 ]
- * gui/component/e-address-popup.c (add_contacts_cb): first arg is
- a GtkWidget. duh.
-
-2003-02-19 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/contact-editor/Makefile.am (INCLUDES): Use $(evolutionuidir)
- instead of $(evolution_uidir). [Pointed out by Grzegorz Goawski.]
-
-2003-02-17 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_start_query): if we can complete solely
- from our cached cards, call e_completion_end_search from here when
- we're done.
-
-2003-02-17 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c
- (ensure_completion_uris_exist): plug memory leak (always free
- val).
-
-2003-02-16 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_search_timeout): move the bulk of the
- non-summary searching stuff here. we aggregate up to our
- threshold, then send them to the front end and register a timeout
- to do another batch. This keeps us from totally spamming the UI,
- making things a bit more responsive.
- (pas_backend_file_search): set up the closure and call the timeout
- in an idle func.
-
-2003-02-16 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_entry_new): indent properly.
-
-2003-02-16 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-reflow-adapter.c (unlink_model):
- disconnect search_started and search_result.
- (addressbook_compare): if we're loading, just compare model
- positions (so we just append while loading).
- (remove_card): use e_reflow_model_item_removed.
- (search_started): new function, set loading = TRUE.
- (search_result): new function, set loading = FALSE and emit
- "comparison_changed".
- (e_addressbook_reflow_adapter_init): init loading and the new
- signal ids.
- (e_addressbook_reflow_adapter_construct): connect "search_started"
- and "search_result".
-
- * gui/widgets/e-addressbook-model.h (struct
- _EAddressbookModelClass): add search_started signal.
-
- * gui/widgets/e-addressbook-model.c
- (e_addressbook_model_class_init): new signal "search_started".
- (book_view_loaded): emit "search_started" after "model_changed".
- (remove_card): simplify this, and use CARD_REMOVED all the time,
- instead of just in the single card case.
-
-2003-02-10 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_search_timeout): split out the bulk of the
- non-summary searching logic to here. we do 1 "card_threshold"
- sized lump per timeout.
- (pas_backend_file_search): use pas_backend_file_search_timeout.
-
-2003-02-10 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #33066 ]
- * gui/contact-editor/e-contact-editor.c
- (set_urlentry_changed_signal_field): new function
- (set_entry_changed_signals): call
- set_urlentry_changed_signal_field for entry-web, entry-caluri, and
- entry-fburl.
- (fill_in_field): add handling for EUrlEntry's.
- (extract_field): same.
- (enable_widget): same.
- (e_contact_editor_create_date): show the widget.
- (e_contact_editor_create_web): same, create a url entry.
- (set_urlentry_changed_signal_field): new function
-
- * gui/contact-editor/contact-editor.glade: entry-web,
- entry-caluri, and entry-fburl are all custom widgets now.
-
-2003-02-10 Ettore Perazzoli <ettore@ximian.com>
-
- * backend/ebook/Makefile.am: Install load-pine-addressbook and
- load-gnomecard-addressbook into ${privdatadir}/tools. Install
- evolution-vcard-importer and evolution-ldif-importer into
- ${privlibexecdir}.
-
- * backend/ebook/GNOME_Evolution_Addressbook_VCard_Importer.server.in:
- Removed.
-
- * backend/ebook/GNOME_Evolution_Addressbook_LDIF_Importer.server.in:
- Removed.
-
- * backend/ebook/GNOME_Evolution_Addressbook_VCard_Importer.server.in.in:
- New. Specify an absolute path for the executable, using
- @LIBEXECDIR@.
- * backend/ebook/GNOME_Evolution_Addressbook_LDIF_Importer.server.in.in:
- Likewise.
-
-2003-02-09 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (sexp_initials): gone.
- (match_initials): gone.
- (book_query_sexp): remove the primary handling.
- (book_query_score): same.
-
- * backend/ebook/e-card.c (e_card_set_property):
- g_value_get_pointer => g_value_get_object for "category_list".
-
- * backend/ebook/e-book.c (struct _EBookPrivate): add a comment.
-
- * backend/pas/pas-backend-ldap.c (func_beginswith): performance at
- the cost of a tiny bit of correctness. If the ldap server doesn't
- support evolutionPerson don't query on fileAs, use sn (since
- that's effectively what gets used in the display when fileAs isn't
- supported.)
-
-2003-02-09 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c: lots of
- changes here. should be a big performance gain. god i hope this
- is finally right.
-
-2003-02-08 Chris Toshok <toshok@ximian.com>
-
- [ huge change, all for 1 little performance problem :) fixes #18207 ]
- * gui/widgets/e-addressbook-model.c (get_view): use
- e_book_check_static_capability here to make things a little
- prettier.
- (remove_card): complain about my life, and add code to use one
- "model_changed" signal if we get back a list of cards instead of
- multiple "card_removed" signals.
-
- * gui/widgets/e-addressbook-model.h: little clean up.
-
- * gui/widgets/e-addressbook-view.c (delete): write a bulk-remove
- case for this. if the backend supports it, send all the ids at
- once. otherwise loop over the ids.
- (e_addressbook_view_delete_selection): fake a CardAndBook
- structure and call delete, instead of duplicating the code in 2
- places.
-
- * gui/component/addressbook.c (delete_contact_cb): don't call
- e_contact_editor_confirm_delete here, it's handled by the
- EAddressbookView.
-
- * backend/pas/pas-card-cursor.c (pas_card_cursor_construct): fix a
- compiler warning about a stupid crash.
-
- * backend/pas/pas-book.h (PASOperation): RemoveCard ->
- RemoveCards.
- (PASRemoveCardsReques): char *id -> GList *ids.
- (PASRequest): PASRemoveCardRequest -> PASRemoveCardsRequest.
-
- * backend/pas/pas-book.c (pas_book_queue_remove_cards): build up a
- GList from the id sequence.
- (pas_book_respond_remove): notifyCardRemoved ->
- notifyCardsRemoved.
- (impl_GNOME_Evolution_Addressbook_Book_removeCards): rename.
- (pas_book_free_request): free the idlist for RemoveCards.
- (pas_book_class_init): removeCard -> removeCards.
-
- * backend/pas/pas-book-view.h: change prototype for
- pas_book_view_notify_remove, and add prototype for
- pas_book_view_notify_remove_1.
-
- * backend/pas/pas-book-view.c (pas_book_view_notify_remove_1):
- build up a list and call pas_book_view_notify_remove.
- (pas_book_view_notify_remove): build up the corba id sequence and
- call BookViewListener::notifyCardsRemoved.
-
- * backend/pas/pas-backend.h: remove_card -> remove_cards.
-
- * backend/pas/pas-backend.c (pas_backend_remove_cards): rename
- from _remove_card.
- (process_client_requests): RemoveCard -> RemoveCards and
- _remove_card -> _remove_cards.
-
- * backend/pas/pas-backend-ldap.c (check_schema_support):
- g_strcasecmp -> g_ascii_strcasecmp.
- (remove_card_handler): _remove => _remove_1.
- (modify_card_modify_handler): same.
- (pas_backend_ldap_process_remove_cards): rename from _remove_card.
- (pas_backend_ldap_class_init): _remove_card -> _remove_cards.
-
- * backend/pas/pas-backend-file.c (pas_backend_file_class_init):
- remove_card -> remove_cards.
- (pas_backend_file_get_static_capabilities): add "bulk-removes".
- (pas_backend_file_process_remove_cards): rewrite this function
- largely, so that it handles lists of ids. first we loop through
- and for every successful deletion we build a list of deleted
- ECards. Then for each view we build a list (a subset of the
- deleted ECard list) and pass back that list to the view.
- (pas_backend_file_process_modify_card): use _remove_1 instead of
- _remove.
- (ecard_matches_search): new function.
-
- * backend/pas/pas-backend-card-sexp.c
- (pas_backend_card_sexp_match_vcard): rewrite in terms of
- _match_ecard.
- (pas_backend_card_sexp_match_ecard): new function, the guts from
- _match_vcard.
-
- * backend/pas/pas-backend-card-sexp.h: add prototype for
- pas_backend_card_sexp_match_ecard.
-
- * backend/idl/addressbook.idl: the card removal stuff now takes
- CardIdList.
-
- * backend/ebook/e-book.c (e_book_get_static_capabilities): cache
- successful capability queries (since they're static).
- (e_book_check_static_capability): new, convenience function to
- check if a particular capability is supported.
- (e_book_remove_card_by_id): build a single element GList and call
- e_book_remove_cards.
- (e_book_remove_cards): build up a CORBA sequence from the GList
- and call Book::removeCards.
- (e_book_dispose): free the cached capabilities string.
-
- * backend/ebook/e-book.h: add new prototypes for
- e_book_check_static_capability and e_book_remove_cards.
-
- * backend/ebook/e-book-view.h (struct _EBookViewClass): rename
- "card_removed" signal to "cards_removed".
-
- * backend/ebook/e-book-view.c (e_book_view_do_removed_event): id
- -> ids, and free the id list.
- (e_book_view_check_listener_queue): CardRemovedEvent ->
- CardsRemovedEvent.
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_queue_response): free the id list.
- (e_book_view_listener_queue_idlist_event): new function, used for
- cards_removed.
- (e_book_view_listener_queue_status_event): id -> ids.
- (e_book_view_listener_queue_sequence_event): same.
- (e_book_view_listener_queue_message_event): same.
- (impl_BookViewListener_notify_cards_removed): call
- queue_idlist_event.
- (e_book_view_listener_dispose): free the id list.
- (e_book_view_listener_class_init): track change to idl call.
-
- * backend/ebook/e-book-view-listener.h
- (EBookViewListenerOperation): CardRemovedEvent ->
- CardsRemovedEvent.
- (EBookViewListenerResponse): char *id -> GList *ids.
-
- * backend/ebook/e-book-listener.c
- (impl_BookListener_respond_remove_cards): rename from remove_card.
-
-2003-02-06 Chris Toshok <toshok@ximian.com>
-
- * gui/component/e-address-popup.c (email_table_save_card_cb):
- check the status, not the book, and unref the book here.
- (contact_editor_cb): same.
- (start_query): unref the book in the failure case.
- (add_card_idle_cb): addressbook_load_default_book returns void
- now.
- (edit_contact_info_cb): same.
- (e_address_popup_query): same.
-
- * gui/component/addressbook.c (control_activate_cb): track change
- to addressbook_load_uri return type.
- (set_prop): same.
- (addressbook_load_uri): return type is void now.
- (addressbook_load_default_book): same.
-
- * gui/component/addressbook.h:
- addressbook_load_uri/addressbook_load_default_book return void
- now.
-
- * conduit/address-conduit.c (start_addressbook_server):
- e_book_load_default_book returns void now.
-
- * backend/ebook/e-book-util.h: track changes to return types.
-
- * backend/ebook/e-book-util.c (e_book_load_address_book_by_uri):
- fallout from change to e_book_load_uri. return type for this
- function is void now too.
- (e_book_use_address_book_by_uri): same.
- (e_book_use_default_book): same.
- (e_book_load_default_book): same.
- (got_uri_book_cb): if unsuccessful and book is non-NULL, unref it
- here.
- (got_default_book_cb): same.
-
- * backend/ebook/e-book.c (e_book_load_uri): no longer return a
- gboolean. any error is communicated to the callback.
-
- * backend/ebook/e-book.h: e_book_load_uri no longer returns a
- gboolean (it's void.)
-
- * backend/ebook/evolution-ldif-importer.c (ebook_create): track
- change to the e_book_load_uri family of functions.
-
- * backend/ebook/test-client-list.c (ebook_create): same.
-
- * backend/ebook/test-client.c (ebook_create): same.
-
- * backend/ebook/load-pine-addressbook.c (ebook_create): same.
-
- * backend/ebook/evolution-vcard-importer.c (ebook_create): same.
-
-2003-02-06 Ettore Perazzoli <ettore@ximian.com>
-
- * backend/ebook/Makefile.am (e-book-marshal.c, e-book-marshal.h):
- Use different tmp file names so these rules can be executed in
- parallel without interfering with each otehr.
-
- * backend/pas/Makefile.am: Make the ORBit compilation work
- properly with parallel makes (i.e. make sure it does not spawn
- multiple orbit-idl processes on the same IDL file at the same
- time).
- * gui/component/select-names/Makefile.am: Likewise.
- * backend/ebook/Makefile.am: Likewise.
-
-2003-02-06 Dan Winship <danw@ximian.com>
-
- * gui/component/addressbook-config.c (main):
- s/PACKAGE/GETTEXT_PACKAGE/ in gettext setup.
-
-2003-02-05 Dan Winship <danw@ximian.com>
-
- * backend/ebook/Makefile.am (INCLUDES): Remove cruft.
- (libebookincludedir): Use privincludedir.
-
- * backend/ebook/e-book-util.c: #include <string.h>
- * backend/ebook/e-card-compare.c: Likewise
- * backend/ebook/load-pine-addressbook.c: Likewise
- * backend/ebook/test-client.c: Likewise
-
- * backend/ebook/evolution-vcard-importer.c: #include
- <e-book-util.h>
- (factory_fn): Fix this to actually return the importer.
-
- * backend/ebook/evolution-ldif-importer.c (parseLine): #include
- <e-book-util.h> and <bonobo/bonobo-main.h>. Use g_ascii_strcmp.
-
- * backend/ebook/e-card.c (e_card_email_match_single_string):
- (e_card_email_find_number): s/g_str/g_ascii_str/
- * backend/ebook/e-destination.c (e_destination_equal): Likewise.
- Also, add an "else return FALSE;"
-
-
- * backend/pas/Makefile.am (INCLUDES): Remove cruft
- (ldapschemadir): Use privdatadir
- (pasincludedir): Use privincludedir.
-
- * backend/pas/pas-book-factory.c (pas_book_factory_activate):
- Remove unused variable.
- * backend/pas/pas-book-view.c (pas_book_view_new): Likewise
-
-
- * printing/Makefile.am (ecpsdir): Define in terms of privdatadir.
- (gladedir): Defined in configure.in now.
-
- * printing/e-contact-print.c: #include <string.h>
-
- * printing/test-print.c: #include <bonobo/bonobo-main.h>
- * printing/test-contact-print-style-editor.c: Likewise
-
-
- * gui/contact-editor/Makefile.am (INCLUDES): Remove some cruft.
- rename ICONSDIR to IMAGESDIR.
- (images_DATA): Install arrow.png in imagesdir instead of
- privdatadir.
-
- * gui/contact-editor/e-contact-quick-add.c: #include <string.h>
-
- * gui/contact-editor/e-contact-editor.c: #include <string.h>
- (e_contact_editor_init): s/EVOLUTION_ICONSDIR/EVOLUTION_IMAGESDIR/
- (e_contact_editor_new): s/gtk_object_ref/g_object_ref/
- (_replace_button): Look in imagesdir, not privdatadir
- (_phone_arrow_pressed): Remove call to deprecated
- gtk_check_menu_item_set_show_toggle.
- (_email_arrow_pressed): Likewise
- (_address_arrow_pressed): Likewise
- (set_address_field): Remove unused variable
- (enable_widget):
- s/gtk_entry_set_editable/gtk_editable_set_editable/
-
- * gui/contact-editor/e-contact-editor-address.c
- (e_contact_editor_address_init):
- s/EVOLUTION_ICONSDIR/EVOLUTION_IMAGESDIR
- (e_contact_editor_address_set_property):
- s/gtk_entry_set_editable/gtk_editable_set_editable/
-
- * gui/contact-editor/e-contact-editor-fullname.c
- (e_contact_editor_fullname_init):
- s/EVOLUTION_ICONSDIR/EVOLUTION_IMAGESDIR
- (e_contact_editor_fullname_set_property): Likewise.
-
-
- * gui/contact-list-editor/Makefile.am (INCLUDES): Remove cruft,
- s/ICONSDIR/IMAGESDIR/
- (gladedir, etspecdir): Remove definitions.
-
- * gui/contact-list-editor/e-contact-list-editor.c: #include
- <string.h>
- (e_contact_list_editor_init): s/ICONSDIR/IMAGESDIR/
- (e_contact_list_editor_new): s/gtk_object_ref/g_object_ref/
-
- * gui/contact-list-editor/e-contact-list-model.c: #include <string.h>
-
-
- * gui/merging/Makefile.am (INCLUDES): Remove cruft.
- * gui/search/Makefile.am (ruledir): Define in terms of privdatadir
-
-
- * gui/widgets/Makefile.am (INCLUDES): Remove cruft.
- (gladedir, etspecdir): Remove definitions.
- (glade_DATA): Empty, so remove it.
-
- * gui/widgets/e-addressbook-reflow-adapter.c: #include <string.h>
- (addressbook_get_property): Remove unused variable
-
- * gui/widgets/e-addressbook-view.c: #include <string.h>
- (get_selection_model): Add a g_return_val_if_reached.
-
- * gui/widgets/e-minicard.c: #include string.h, gtkmain.h,
- gnome-canvas-pixbuf.h
- (field_changed): s/gtk_object_unref/g_object_unref/
- (get_left_width): Remove unused variable
-
- * gui/widgets/e-minicard-control.c: #include <string.h>
- (pstream_load, pstream_save): Use g_ascii_strcasecmp
-
- * gui/widgets/e-minicard-view.c: #include <string.h>
-
- * gui/widgets/e-minicard-view-widget.c
- (e_minicard_view_widget_new): s/gtk_type_new/g_object_new/
-
-
- * gui/component/select-names/Makefile.am (INCLUDES): Remove cruft.
- (serverdir, gladedir, etspecdir): Remove definitions
-
- * gui/component/select-names/e-select-names.c: #include <string.h>
-
- * gui/component/select-names/e-select-names-popup.c
- (init_html_mail): Remove deprecated
- gtk_check_menu_item_set_show_toggle call.
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_entry_free):
- s/gtk_timeout_remove/g_source_remove/
-
-
- * gui/component/Makefile.am (INCLUDES): Remove cruft, rename
- ICONSDIR to IMAGESDIR.
- (serverdir, gladedir): Remove defintions.
-
- * gui/component/addressbook-component.c (IS_CONTACT_TYPE): use
- g_ascii_strcasecmp
- (add_creatable_item): s/ICONSDIR/IMAGESDIR/
-
- * gui/component/component-factory.c: #include <string.h>
-
- * gui/component/e-address-widget.c: Likewise.
- (e_address_widget_destroy): s/gtk_idle_remove/g_source_remove/
- (e_address_widget_schedule_query): s/gtk_idle_add/g_idle_add/
-
-
- * conduit/Makefile.am (INCLUDES): Remove cruft
-
-2003-02-05 Dan Winship <danw@ximian.com>
-
- * gui/component/addressbook-config.c (main): Replace deprecated
- glade_gnome_init() with glade_init().
-
- * gui/contact-editor/test-editor.c (main): Likewise.
-
- * printing/test-contact-print-style-editor.c (main): Likewise.
-
- * printing/test-print.c (main): Likewise.
-
-2003-02-03 Chris Toshok <toshok@ximian.com>
-
- [ pull forward Jack Jia's fix for #34900 ]
- * gui/contact-editor/e-contact-save-as.c (e_contact_save_as): use
- a weak ref for the file selector.
- (e_contact_list_save_as): same.
- (destroy_it): rewrite this as a weak ref notify function.
- (close_it): remove frees of the info (it's freed in the weak ref
- function).
- (save_it): same.
-
-2003-02-03 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c (remove_folder): pull
- forward Jack Jia's fix for #33672, but convert it to use unlink
- instead of the gnome-vfs stuff.
-
-2003-01-27 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: add a scrolled window
- (SHADOW_IN) around the address textview.
-
-2003-01-26 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: rename the category
- entry to entry-categories.
-
- * gui/contact-editor/e-contact-editor.c
- (set_entry_changed_signals): use the specialized "changed" signal
- handlers for entry-company and entry-fullname.
-
-2003-01-26 Chris Toshok <toshok@ximian.com>
-
- * gui/component/Makefile.am: i need to sleep more.
-
-2003-01-26 Chris Toshok <toshok@ximian.com>
-
- * gui/component/Makefile.am (componentdir): need to assign this
- here or else the lib doesn't get built.
-
-2003-01-26 Chris Toshok <toshok@ximian.com>
-
- * printing/e-contact-print.c (e_contact_start_new_page): begin the
- new page after showing the last one.
- (complete_sequence): beginpage before we start printing.
- (e_contact_print_response): GtkDialog-ify this.
- (e_contact_print_dialog_new): "clicked" -> "response".
- (e_contact_print_card_dialog_new): same.
- (e_contact_print_card_list_dialog_new): same.
-
-2003-01-26 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am (CONDUIT_SUBDIR): enable this, as building the
- conduit works if you have gnome-pilot2.
-
-2003-01-25 Chris Toshok <toshok@ximian.com>
-
- * conduit/address-conduit.c: GObjectify the stuff in here that
- refers to addressbook objects. the gnome-pilot stuff is still
- GtkObject for the moment.
-
-2003-01-24 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/Makefile.am (iconsdir): Remove definition; this is
- now in configure.in.
- * gui/contact-editor/Makefile.am (iconsdir): Likewise.
- * gui/contact-list-editor/Makefile.am (iconsdir): Likewise.
-
-2003-01-23 Sean Gao <Sean.Gao@Sun.COM>
-
- [ fixes bug #34898 ]
- * gui/widgets/e-minicard.c (field_changed): handle modifications
- to email addresses in contact lists.
-
-2003-01-23 Sean Gao <Sean.Gao@Sun.COM>
-
- [ fixes bug #36375 ]
- * backend/pas/pas-backend-ldap.c: use PHONE_OTHER_FAX instead of
- PHONE_OTHER for "other_fax".
-
-2003-01-23 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #31014, roll this in from the 1.2 branch ]
- * backend/pas/pas-backend-ldap.c: use "categories" instead of
- "category" for the ECard field so the UI/get_supported_fields stuff
- actually thinks its usable in the contact editor..
-
-2003-01-23 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_connect): fix
- for bug 34883 broke ssl transactions (at least those where we were
- connecting to port 636). Move it to after the SSL stanza.
-
-2003-01-23 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/select-names/Makefile.am (componentdir): Remove
- definition; no need to set it here since it's now defined in
- configure.in
- * gui/component/Makefile.am (componentdir): Likewise.
-
-2003-01-22 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/select-names/Makefile.am (gladedir): Version using
- $(BASE_VERSION).
- (etspecdir): Likewise.
- (iconsdir): Likewise.
-
- * gui/contact-list-editor/Makefile.am (iconsdir): Version using
- $(BASE_VERSION).
- (gladedir): Likewise.
-
- * gui/merging/Makefile.am (gladedir): Version using $(BASE_VERSION).
-
- * gui/search/Makefile.am (ruledir): Version using $(BASE_VERSION).
-
- * gui/component/Makefile.am (INCLUDES): Update EVOLUTION_IMAGESDIR
- to be versioned through $(BASE_VERSION).
-
- * gui/widgets/e-addressbook-view.c (init_collection): Use
- EVOLUTION_GALVIEWSDIR.
-
- * gui/widgets/Makefile.am (INCLUDES): Define EVOLUTION_GALVIEWSDIR
- and update EVOLUTION_IMAGESDIR.
-
-2003-01-21 Radek Doulik <rodo@ximian.com>
-
- * printing/e-contact-print.c (e_contact_print_button): don't use
- gnome_print_multipage_new_from_sizes and add warning
-
-2003-01-14 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/widgets/e-addressbook-util.c
- (e_addressbook_prompt_save_dialog): Change dialog from
- Yes/No/Cancel to Discard/Cancel/Save to match the HIG.
-
- * gui/search/e-addressbook-search-dialog.c
- (e_addressbook_search_dialog_init): Change dialog from OK/Cancel
- to Cancel/OK to match the HIG.
-
- * gui/contact-editor/e-contact-save-as.c (file_exists): Change
- dialog from Overwrite/Cancel to Cancel/Overwrite to match the HIG.
-
- * gui/contact-editor/e-contact-quick-add.c
- (build_quick_add_dialog): Fix typo s/reponse/response/. Also
- change the dialog to be Edit/Cancel/OK instead of OK/Edit/Cancel
- to match the HIG.
-
- * gui/contact-editor/e-contact-editor.c
- (e_contact_editor_confirm_delete): Make alert cancel/delete
- instead of delete/cancel to match the HIG.
-
- * gui/contact-editor/e-contact-editor-fullname.c
- (e_contact_editor_fullname_init): Make dialog Cancel/OK instead of
- OK/Cancel to match the HIG.
-
- * gui/contact-editor/e-contact-editor-address.c
- (e_contact_editor_address_init): Make dialog Cancel/OK instead of
- OK/Cancel to match the HIG.
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_init): Make dialog Cancel/OK instead of OK/Cancel
- to match the HIG.
-
-2003-01-14 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/Makefile.am (EXTRA_DIST): Add $(schema_DATA).
-
-2003-01-09 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (control_activate_cb): try to load
- the uri again if it failed previously.
- (book_open_cb): set failed_to_load based on the response.
- (set_prop): initialize failed_to_load to FALSE before we kick off
- the first load.
-
- * backend/pas/pas-book-factory.c
- (pas_book_factory_process_request): if the load_uri fails, remove
- it from the hashtable and free it, so we'll try to load it again
- from scratch the next time it's requested instead of serving up a
- backend that doesn't function.
-
- * backend/pas/pas-backend.c (pas_backend_get_uri): we need to be
- able to get the uri from backends that aren't loaded (so we can
- remove them from the hashtable.)
-
-2003-01-09 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (query_ldap_root_dse): doh, fix
- build error.
-
-2003-01-09 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-popup.c: #include
- gtklabel.h, fixes an unresolved symbol.
-
-2003-01-09 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (query_ldap_root_dse): build up
- the list of supported auth_methods.
- (pas_backend_ldap_process_get_supported_auth_methods): respond
- with the list of auth methods we've built up.
- (pas_backend_ldap_dispose): unref the auth_method list.
- (pas_backend_ldap_class_init): hook up
- pas_backend_ldap_process_get_supported_auth_methods.
-
- * backend/pas/pas-backend.c
- (pas_backend_get_supported_auth_methods): new function.
- (process_client_requests): add clause for GetSupportedAuthMethods.
-
- * backend/pas/pas-backend.h: add prototype for
- pas_backend_get_supported_auth_methods, and add it to the class
- vtable.
-
- * backend/pas/pas-book.h: add GetSupportedAuthMethods enum member
- and PASGetSupportedAuthMethodsRequest. and add prototype for
- pas_book_respond_get_supported_auth_methods.
-
- * backend/pas/pas-book.c
- (pas_book_queue_get_supported_auth_methods): new function.
- (impl_GNOME_Evolution_Addressbook_Book_getSupportedAuthMethods):
- new function.
- (pas_book_respond_get_supported_auth_methods): new function.
- (pas_book_free_request): add clause for GetSupportedAuthMethods.
- (pas_book_class_init): hook up getSupportedAuthMethods.
-
- * backend/ebook/e-book-listener.c
- (e_book_listener_queue_get_supported_fields_response): fields ->
- list.
- (e_book_listener_queue_get_supported_auth_methods_response): new
- function.
- (impl_BookListener_response_get_supported_auth_methods): new
- function.
- (e_book_listener_class_init): hook up
- epv->notifySupportedAuthMethods.
-
- * backend/ebook/e-book-listener.h: add
- GetSupportedAuthMethodsResponse enum member, and change the field
- name from "fields" to list (and use it for both GetSupportedFields
- and GetSupportedAuthMethods)
-
- * backend/ebook/e-book.c (e_book_get_supported_auth_methods): new
- function.
- (e_book_do_response_get_supported_auth_methods): new function.
-
- * backend/ebook/e-book.h: add prototype for
- e_book_get_supported_auth_methods.
-
- * backend/idl/addressbook.idl: add getSupportedAuthMethods IDL
- call.
-
-2003-01-09 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-book-factory.c (backend_last_client_gone_cb):
- deal with backends that might not have loaded successfully
- (they'll have a NULL uri).
-
-2003-01-09 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-bonobo.c
- (e_select_names_bonobo_new): call e_select_names_bonobo_construct
- on the newly created object.
-
-2003-01-09 Chris Toshok <toshok@ximian.com>
-
- * gui/component/Makefile.am: addressbook-config.etspec is gone.
-
- * gui/component/addressbook-config.c: make the sources table be a
- gtktreeview instead of an etable.
-
- * gui/component/ldap-config.glade: remove all references to
- gnome-hint.png
-
-2003-01-09 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/gal-view-minicard.c (column_width_changed): fix
- parameter types here (this signal isn't generated from an ETable.)
-
- * gui/widgets/gal-view-factory-minicard.c: include e-util.h
-
- * gui/widgets/e-minicard.h: include gnome-canvas.h here.
-
- * gui/widgets/e-addressbook-table-adapter.c: #include
- e-destination.h here.
-
- * gui/widgets/e-minicard.c: same.
-
-2003-01-09 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.[ch]: remove the select
- names stuff (the Related Contacts button/entry.)
-
- * gui/contact-editor/contact-editor.glade: same.
-
-2003-01-09 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in:
- comment out the factory oaf_server, and change the location of the
- SelectNames controls to be
- OAFIID:GNOME_Evolution_Addressbook_Factory so the normal
- addressbook.so will create them.
-
- * gui/component/select-names/Makefile.am
- (libeselectnames_la_SOURCES): remove the
- e-select-names-factory.[ch] stuff for the time being.
-
- * gui/component/component-factory.c (factory): we're now (for the
- time being) the factory for the select names control.
-
-2003-01-08 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-view.c: oops, don't include
- e-treeview-selection-model.h unless we're building the treeview.
-
-2003-01-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_process_authenticate_user): Fix to build.
-
-2003-01-08 Chris Toshok <toshok@ximian.com>
-
- * gui/component/apps_evolution_addressbook.schemas: add in the
- schema entry for minimum_query_length.
-
-2003-01-08 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-view.h: add
- E_ADDRESSBOOK_VIEW_TREEVIEW to the enum, ifdef'ed out.
-
- * gui/widgets/e-addressbook-view.c
- (e_addressbook_view_class_init): add ifdefed treeview code.
- (init_collection): same.
- (display_view): same.
- (get_selection_model): same.
- (treeview_row_activated): same.
- (create_treeview_view): same.
- (change_view_type): same.xo
- (e_addressbook_view_print): same.
- (e_addressbook_view_print_preview): same.
-
- * gui/widgets/Makefile.am: add in the treeview sources (commented
- out).
-
-2003-01-08 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/gal-view-minicard.c (gal_view_minicard_edit): add
- parent arg.
-
- * gui/widgets/e-addressbook-treeview-adapter.[ch]: new files, for
- a GtkTreeView view of contacts.
-
- * gui/widgets/gal-view-treeview.[ch]: same
-
- * gui/widgets/gal-view-favroty-treeview.[ch]: same
-
-2003-01-08 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/Makefile.am: $(datadir)/evolution/images instead
- of $(datadir)/images/evolution.
- * gui/contact-editor/Makefile.am: Likewise.
- * gui/contact-list-editor/Makefile.am (iconsdir): Likewise.
- * gui/widgets/Makefile.am: Likewise.
-
-2002-01-08 Dan Winship <danw@ximian.com>
-
- Move PASBook request handling into PASBackend itself since all
- existing backends do it exactly the same way. (Part of 32866).
-
- * backend/pas/pas-backend.h (PASBackendClass): add new methods for
- the various pas book requests.
-
- * backend/pas/pas-backend.c: Add a clients list to
- PASBackendPrivate.
- (pas_backend_create_card, etc): Add these to invoke the new
- methods.
- (process_client_requests, book_destroy_cb): Moved here and
- slightly rewritten from pas-backend-file.
- (last_client_gone): Now static.
- (add_client, remove_client): Default implementations, based on
- pas-backend-file, that add the client to/remove it from the
- backend's clients list and connect to its requests_queued signal.
- (pas_backend_init, pas_backend_dispose): Deal with the clients
- list.
-
- * backend/pas/pas-backend-file.c (struct _PASBackendFilePrivate):
- Remove GList *clients.
- (pas_backend_file_process_client_requests,
- pas_backend_file_book_destroy_db, pas_backend_file_add_client,
- pas_backend_file_remove_client): Gone.
- (pas_backend_file_class_init): Remove add_client/remove_client
- method initializations, add initializations for processing the
- various book requests.
-
- * backend/pas/pas-backend-ldap.c (struct _PASBackendLDAPPrivate):
- Remove GList *clients.
- (pas_backend_ldap_process_create_card, etc): Make these take the
- specific PAS*Request types rather than a generic PASRequest.
- (pas_backend_ldap_process_client_requests,
- pas_backend_ldap_book_destroy_db, pas_backend_ldap_add_client,
- pas_backend_ldap_remove_client): Gone.
- (pas_backend_ldap_class_init): Remove add_client/remove_client
- method initializations, add initializations for processing the
- various book requests.
-
-2003-01-07 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/evolutionperson.schema: fix the SYNTAX for the
- telephone attributes, and make the fax attributes more closely
- mirror those from core.schema. Fixes the schema for openldap-2.1.
-
-2003-01-06 Dan Winship <danw@ximian.com>
-
- * backend/idl/Makefile.am: remove idldir def (defined by
- configure.in now)
-
- * gui/component/select-names/Makefile.am: Likewise
-
-2003-01-01 Chris Toshok <toshok@ximian.com>
-
- [ fixes the non-ui portion of #36183 ]
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_start_query): use the entry's
- minimum_query_length instead of a constant here.
- (e_select_names_completion_set_minimum_query_length): new
- function, set the entry's minimum_query_length.
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_entry_new): set the minimum_query length
- after setting the completion books.
- (read_completion_settings_from_db): rename
- read_completion_books_from_db to this, and read the
- minimum_query_length too.
- (db_listener): rename uris_listener to this, and listen for
- changes on both the uris and minimum_query_length settings.
-
- * gui/component/select-names/e-select-names-completion.h: add
- prototype for e_select_names_completion_set_minimum_query_length.
-
- * gui/component/select-names/e-select-names-manager.h: add
- minimum_query_length to struct _ESelectNamesManager.
-
-2002-12-19 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-config.c
- (addressbook_config_control_new): Made it return an
- EvolutionConfigControl instead of a BonoboControl (and removed a
- bogus EvolutionConfigControl -> BonoboControl cast).
-
-2002-12-17 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #34897 ]
- * gui/widgets/e-addressbook-table-adapter.c
- (addressbook_value_at): don't free the return of
- e_card_simple_get_const, as this causes a double free later on.
-
-2002-12-18 Chris Toshok <toshok@ximian.com>
-
- * gui/component/e-address-popup.c: convert the clist in here to a
- GtkTreeView. your guess is as good as mine if it works (i can't
- test it at present) but it compiles.
-
-2002-12-18 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (jump_to_letters):
- g_string_sprintfa -> g_string_append_printf.
- (create_alphabet): same.
- (create_minicard_view): remove gtk_widget_{push,pop}_visual.
-
- * gui/widgets/Makefile.am (INCLUDES): add -D*_DISABLE_DEPRECATED.
-
-2002-12-18 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard.c (e_minicard_realize): drop use of
- "font" arg.
- (get_left_width): use pango to calculate this instead of a GdkFont.
-
- * gui/widgets/e-minicard-view.c: drop include of e-unicode.h.
-
- * gui/widgets/e-minicard-label.c (e_minicard_label_construct):
- don't need to create the font anymore.
-
- * gui/search/Makefile.am (INCLUDES): add -D*_DISABLE_DEPRECATED.
-
- * gui/search/e-addressbook-search-dialog.c
- (e_addressbook_search_dialog_new): use g_object_new instead of
- gtk_type_new.
-
- * gui/merging/Makefile.am (INCLUDES): add -D*_DISABLE_DEPRECATED.
-
- * gui/contact-list-editor/Makefile.am (INCLUDES): add
- -D*_DISABLE_DEPRECATED.
-
- * gui/contact-list-editor/e-contact-list-editor.c (is_named):
- strdup (or not, if we don't need to save the value) instead of
- using the e_utf8 functions.
- (fill_in_info): same.
-
- * gui/contact-editor/Makefile.am (INCLUDES): add
- -D*_DISABLE_DEPRECATED.
-
- * gui/contact-editor/e-contact-save-as.c (e_contact_save_as):
- strdup (or not, if we don't need to save the value) instead of
- using the e_utf8 functions.
- (e_contact_list_save_as): same.
-
- * gui/contact-editor/e-contact-quick-add.c (clicked_cb): strdup
- (or not, if we don't need to save the value) instead of using the
- e_utf8 functions.
- (build_quick_add_dialog): same.
-
- * gui/contact-editor/e-contact-editor.c (phone_entry_changed):
- strdup (or not, if we don't need to save the value) instead of
- using the e_utf8 functions.
- (file_as_set_style): same.
- (name_entry_changed): same.
- (full_name_clicked): same.
- (categories_clicked): same.
- (set_field): same.
- (fill_in_field): same.
- (fill_in_single_field): same.
- (extract_field): same.
- (extract_single_field): same.
-
- * gui/contact-editor/e-contact-editor-fullname.c (extract_field):
- just strdup, it's already utf8.
-
- * gui/contact-editor/e-contact-editor-address.c (extract_field):
- they're all entries, use GTK_ENTRY foo here.
-
- * gui/component/select-names/Makefile.am (INCLUDES): add
- -D*_DISABLE_DEPRECATED.
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_add_section): remove the extra
- utf8_from_locale_string stuff.
-
- * gui/component/select-names/e-select-names-popup.c
- (set_uiinfo_label): gtk_container_children ->
- gtk_container_get_children, and remove the extra utf8 stuff.
-
- * gui/component/Makefile.am (INCLUDES): add
- -D*_DISABLE_DEPRECATED.
-
- * gui/component/addressbook-storage.c
- (addressbook_storage_init_source_uri): g_string_sprintfa ->
- g_string_append_printf.
-
- * gui/component/addressbook-config.c (focus_help):
- gtk_notebook_set_page -> gtk_notebook_set_current_page.
- (addressbook_source_dialog_set_source): same.
- (auth_optionmenu_activated): gtk_container_children ->
- gtk_container_get_children.
- (ssl_optionmenu_activated): same.
- (ssl_optionmenu_selected): same, and gtk_notebook_set_page ->
- gtk_notebook_set_current_page.
- (scope_optionmenu_activated): same.
- (set_advanced_button_state): same.
- (addressbook_ldap_init): hook "response" to gtk_widget_destroy to
- make the dialog go away when clicked.
- (addressbook_ldap_auth): same.
- (addressbook_root_dse_query): same.
- (do_ldap_root_dse_query): same.
- (addressbook_config_control_new): fix return type and cast.
- (main): remove call to gtk_widget_push_visual.
-
- * gui/component/addressbook-config.h:
- addressbook_config_control_new returns a BonoboObject, not a
- BonoboControl.
-
- * gui/component/addressbook.c: remove e-unicode.h include.
-
- * backend/pas/Makefile.am (INCLUDES): Add
- -DLIBGNOME_DISABLE_DEPRECATED.
-
- * backend/ebook/Makefile.am (INCLUDES): Add
- -DLIBGNOME_DISABLE_DEPRECATED.
-
- * backend/ebook/e-card.c (e_card_get_property): remove misleading
- comment.
-
-2002-12-17 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (build_card_from_entry):
- g_strcasecmp -> g_ascii_strcasecmp.
- (FIND_INSERT): same.
-
- * backend/pas/pas-backend-file.c (pas_backend_file_load_uri):
- g_dirname -> g_path_get_dirname.
-
- * backend/pas/Makefile.am (INCLUDES): add
- -DG_DISABLE_DEPRECATED.
-
- * backend/ebook/Makefile.am (INCLUDES): add
- -DG_DISABLE_DEPRECATED.
-
-2002-12-17 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-manager.c
- (uris_listener): oops, use strcmp, not !strcmp here.
-
-2002-12-17 Chris Toshok <toshok@ximian.com>
-
- [ Fixes bug #35135 ]
- * backend/ebook/e-book-util.c (set_default_book_uri_local): don't
- free the default_book_uri here, it's done in set_default_book_uri.
- (set_default_book_uri): break some stuff out from
- set_default_book_uri_from_bonobo_conf to here so it can be used
- both from that function and the bonobo listener.
- (default_folder_listener): set the new default book uri.
- (set_default_book_uri_from_bonobo_conf): install the bonobo conf
- listener so we'll get updates.
-
-2002-12-16 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-config.c
- (addressbook_config_control_new): Use
- evolution_shell_client_corba_objref() instead of BONOBO_OBJREF()
- to get the Shell CORBA object.
-
-2002-12-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/component/addressbook-config.c: Don't #include
- <e-util/e-html-utils.h>
-
-2002-12-09 Chris Toshok <toshok@ximian.com>
-
- * gui/search/e-addressbook-search-dialog.[ch]: GObject-ize this.
-
-2002-12-09 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (load_uri_auth_cb): pass
- "Addressbook" to e_passwords*.
- (addressbook_authenticate): same.
-
-2002-12-09 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (search_cb): remove
- PENDING_PORT_WORK.
- (addressbook_search_activated): same.
- (addressbook_query_changed): same.
-
- * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD):
- add libfilter.la back in.
-
-2002-12-09 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/widgets/e-minicard-control.c: #define MINICARD_CONTROL_ID.
-
-2002-12-08 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-util.c (e_addressbook_error_dialog):
- connect ::response to gtk_widget_destroy so the dialog goes away.
-
- * gui/widgets/e-minicard-label.c (e_minicard_label_construct):
- don't use font_gdk anymore on EText. it doesn't exist.
-
-2002-12-08 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-reflow-adapter.c (text_height): this
- uses pango now.
- (addressbook_height): same.
-
-2002-12-06 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book.c (e_book_commit_card): use e_card_set_book
- instead of basically duplicating its code here.
- (e_book_add_card): same.
-
-2002-12-06 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/e-cardlist-model.c: #include <string.h>.
-
- * gui/component/addressbook-storage.c: #include <string.h>,
- <ctype.h>, <unistd.h>.
-
- * gui/component/addressbook-factory.c: Removed.
-
- * gui/component/addressbook-component.c: #include
- <bonobo/bonobo-main.h>, <unistd.h> and <string.h>.
- (create_view): addressbook_new_control() instead of
- addressbook_factory_new_control().
-
- * gui/component/select-names/e-select-names.c
- (e_addressbook_create_ebook_table): Removed unused variable.
- (e_select_names_add_section): Removed unused variable.
-
- * gui/component/select-names/e-select-names-manager.c
- (focus_in_cb): Use g_source_remove() here instead of
- gtk_timeout_remove().
-
- * gui/component/component-factory.c: New.
-
- * gui/widgets/e-minicard-control.c
- (e_minicard_control_factory_init): Removed.
- (e_minicard_control_control_factory): Removed.
- (e_minicard_control_new): New.
-
- * gui/component/e-address-widget.c
- (e_address_widget_factory_init): Removed.
- (e_address_widget_new_control): Renamed from
- e_address_widget_factory_new_control(), made public.
- (e_address_widget_factory): Removed.
-
- * gui/component/e-address-popup.c (e_address_popup_new_control):
- New.
- (e_address_popup_factory_new_control): Removed.
- (e_address_popup_factory): Removed.
- (e_address_popup_factory_init): Removed.
-
- * gui/component/addressbook-config.c
- (addressbook_config_register_factory): Removed.
- (addressbook_config_create_control): New.
-
- * gui/component/addressbook-component.c
- (addressbook_component_factory_init): Removed.
- (addressbook_component_get_object): New.
- (owner_set_cb): Do not call addressbok_config_register_factory().
-
- * gui/component/addressbook.c (addressbook_factory_init): Removed.
- (addressbook_new_control): Renamed from
- addressbook_factory_new_control().
-
-2002-12-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/component/select-names/e-select-names.etspec: Use collate
- for sorting rather than the normal string sort. This fixes bug
- #26335 without causing bug #33933 :-)
-
-2002-11-30 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_connect): only
- enable the LDAPv3 stuff if TLS is being used. Also, deal with
- naming errors returned from query_ldap_root_dse, as some servers
- (older openldap servers among others i'm sure) don't have a root
- dse at all.
-
-2002-12-02 Not Zed <NotZed@Ximian.com>
-
- * gui/widgets/e-addressbook-view.c (e_contact_print_button):
- gnomedialog -> gtkdialog stuff. print dialog is a gtkdialog now.
-
- * gui/contact-editor/e-contact-editor.c: include gtkstock.h
-
-
-2002-11-27 Not Zed <NotZed@Ximian.com>
-
- * gui/contact-editor/e-contact-editor-address.c: #include gtkstock.h
-
-2002-11-29 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard-view-widget.c (column_width_changed): the
- detail is supposed to go after the signal id, not at the end of
- the parameter list.
-
-2002-11-28 Chris Toshok <toshok@ximian.com>
- [ roll forward from 1.2 branch, partial fix for #31763 ]
- * gui/component/select-names/select-names.glade: add the Find
- button back in.
-
-2002-11-28 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (create_minicard_view): remove
- the button_press_event handler (that did nothing). this makes it
- so button presses actually get to the canvas (and therefore we can
- now drag the lines in the reflow widget).
-
-2002-11-26 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-quick-add.c: add include for
- gtkstock.h.
-
- * gui/contact-list-editor/e-contact-list-model.c
- (e_contact_list_model_add_destination): add pre_change call.
- (e_contact_list_model_remove_row): same.
- (e_contact_list_model_remove_all): same.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (e_contact_list_editor_new): ref/sink the contact list editor so
- we don't get the floating unref warning from gtk.
-
- * gui/contact-editor/e-contact-editor.c (e_contact_editor_new):
- ref/sink the contact editor so we don't get the floating unref
- warning from gtk.
- (e_contact_editor_init): use g_build_filename instead of
- g_concat_dir_and_file.
-
- * gui/widgets/e-minicard-label.c
- (e_minicard_label_resize_children): use MAX (value, 0) to make
- sure we aren't passing negative values for clip-widths.
-
- * gui/widgets/e-minicard.c (e_minicard_realize): use MAX (value,
- 0) to make sure we aren't passing negative values for widths.
-
- * gui/contact-editor/e-contact-editor.c (e_contact_editor_init):
- use g_build_filename.
-
-2002-11-26 Chris Toshok <toshok@ximian.com>
-
- [ roll forward from 1.2 branch ]
- * backend/pas/pas-backend-file.c
- (pas_backend_file_process_get_vcard): never pass NULL as the vcard
- to the corba call, it causes a crash. This particular bug bit us
- when we opened a card that contained an unresolvable related
- contact.
-
-2002-11-26 Chris Toshok <toshok@ximian.com>
-
- [ roll forward from 1.2 branch, Fixes addressbook bug #28945 ]
- * backend/ebook/e-card.c (e_card_get_vobject): if the email
- property is xml, get the real address from the e-destination.
- Fixes saving contact lists.
-
-2002-11-26 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard.c (e_minicard_reflow): remove redundant
- setting of y2.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (e_contact_list_editor_init): show the table.
-
- * gui/component/select-names/e-select-names-completion.c: remove
- an unnecessary #include.
-
- * gui/component/addressbook-storage.c (addressbook_storage_setup):
- use g_build_filename.
-
- * gui/component/addressbook-component.c (remove_folder): use
- g_build_filename.
- (add_creatable_item): same.
- (ensure_completion_uris_exist): same, and use the right gconf
- paths for completion uris.
-
-2002-11-26 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-manager.c
- (read_completion_books_from_db): use new schema for
- completion/uris.
- (uris_listener): same.
-
- * gui/component/select-names/e-select-names.h: Convert to
- GtkDialog from GnomeDialog.
-
- * gui/component/select-names/e-select-names.c: Convert to
- GtkDialog from GnomeDialog.
- (folder_selected): use new schema for last_used_uri.
- (e_select_names_init): same.
- (e_select_names_set_default): use pango markup to set
- bold/not-bold.
- (e_select_names_add_section): don't bother creating an EEntry, we
- can use pango and a normal label. This also keeps us from
- wrapping "contacts ->" at the '-'.
-
- * gui/component/apps_evolution_addressbook.schemas: new file.
-
- * gui/component/Makefile.am: add the schema stuff.
-
-2002-11-24 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-config.c (query_for_supported_bases):
- show the etable.
- (addressbook_add_server_druid): show_all before returning the
- dialog, so the druid shows up.
-
-2002-11-23 Chris Toshok <toshok@ximian.com>
-
- [ roll forward from the 1.2 branch. fixes #25540, part of #29630,
- as well as other selection issues in the contact editor and ACL
- issues in the ldap backend ]
- * backend/pas/pas-backend-ldap.c (check_schema_support): reset the
- schema check state to FALSE if the read returned nothing (and the
- user had not authenticated). we'll requery if/when they auth.
- (query_ldap_root_dse): free the schema dn before assigning over
- it.
- (pas_backend_ldap_connect): added a diagnostic warning about the
- root dse query failing in anonymous mode (if it in fact did fail.)
- (pas_backend_ldap_process_authenticate_user): if we successfully
- authed, requery the root dse to pick up any attributes that might
- be protected, and retry the schema query if that failed before.
-
- * gui/contact-editor/e-contact-editor.c (full_name_clicked): set
- the dialog's editable state based on the new field
- "fullname_editable", and only do the Ok button handling if this
- flag is TRUE.
- (full_addr_clicked): set the dialog's editable state based on the
- editable state for the particular address (from
- editor->address_editable[]). also, only do the Ok button handling
- if this flag is TRUE.
- (_address_arrow_pressed): use the address_editable array to
- determine whether the address text and the mailing address
- checkbutton are sensitive.
- (enable_writable_fields): figure out if fullname_editable is
- TRUE/FALSE, also, init the address_editable flags based on the
- field list, and handle the address checkbutton.
-
- * gui/contact-editor/fulladdr.glade: change the label names to
- label-<name> to match {entry,combo}-<name>.
-
- * gui/contact-editor/fullname.glade: same.
-
- * gui/contact-editor/e-contact-editor-fullname.c
- (e_contact_editor_fullname_class_init): rename ARG_IS_READ_ONLY to
- ARG_EDITABLE, to reflect the correct sense of the flag.
- (e_contact_editor_fullname_set_arg): same, and make the labels
- sensitive/insensitive depending on the editable state of the
- dialog.
-
- * gui/contact-editor/e-contact-editor-address.c
- (e_contact_editor_address_class_init): rename ARG_IS_READ_ONLY to
- ARG_EDITABLE, to reflect the correct sense of the flag.
- (e_contact_editor_address_set_arg): same, and make the labels
- sensitive/insensitive depending on the editable state of the
- dialog.
-
-2002-11-22 Chris Toshok <toshok@ximian.com>
-
- [ roll forward Sean.Gao@sun.com's fix for #16870 from the 1.2
- branch ]
- * backend/ebook/evolution-ldif-importer.c (getNextLDIFEntry):
- check for both LR and CRLF as empty line markers.
-
-2002-11-22 Chris Toshok <toshok@ximian.com>
-
- [ rolling forward fix for #34254 from 1.2 branch ]
- * backend/ebook/evolution-vcard-importer.c (check_file_is_vcard):
- use g-ascii_strncasecmp instead of strncmp.
- (support_format_fn): use g_ascii_strcasecmp instead of strcmp.
-
-2002-11-20 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-storage.h: roll forward the scope fix.
-
-2002-11-20 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c: roll forward the fix for
- the contact editor.
-
-2002-11-21 Not Zed <NotZed@Ximian.com>
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_changed): Pass type to bonobo_ctonrol_set_property, and
- also NULL terminate the valist.
-
- * gui/component/select-names/e-select-names-text-model.c
- (changed_cb): Fix signature for signal.
-
-2002-11-19 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in,
- * gui/component/select-names/Makefile.am: Same changes as below
- for the SelectNames component.
-
-2002-11-18 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_init): show the custom table.
-
-2002-11-18 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/gal-view-minicard.c (gal_view_minicard_attach):
- remove the cast to (int) - column_width is a double.
-
- * gui/widgets/e-minicard.c (e_minicard_class_init): the height
- property is only readable, not readwrite.
-
- * gui/widgets/e-minicard-view-widget.c
- (e_minicard_view_widget_class_init): make column_width a double
- property.
- (e_minicard_view_widget_set_property): don't cast to (int).
- column_width is double in the e-minicard-view.
- (e_minicard_view_widget_realize): same.
- (e_minicard_view_widget_get_property): use g_value_set_double for
- column_width.
-
-2002-11-17 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/Makefile.am (servers_DATA): oops,
- missed some "oaf"'s.
-
-2002-11-16 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c
- (e_contact_editor_build_phone_ui): sink the popup.
- (e_contact_editor_build_email_ui): same.
- (e_contact_editor_build_address_ui): same.
-
- * gui/component/addressbook-config.c (ldap_dialog_new): show
- everything from dialog->page down, so custom widgets show up.
-
-2002-11-15 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/Makefile.am: Added rule to generate
- GNOME_Evolution_Addressbook.server.in from
- GNOME_Evolution_Addressbook.server.in.in, substituting
- @LIBEXECDIR@.
-
- * GNOME_Evolution_Addressbook.server.in.in: Renamed from
- GNOME_Evolution_Addressbook.server.in. Added @LIBEXECDIR@ before
- the location of the executable.
-
- * gui/component/select-names/select-names.glade: Ported to Glade
- 2.
-
- * gui/component/select-names/recipient.glade: Ported to Glade 2.
-
-2002-11-15 Rodney Dawes <dobey@ximian.com>
-
- * gui/component/addressbook-component.c: Use bonobo_main_quit.
-
-2002-11-14 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/gal-view-factory-minicard.c: clean this up a tad.
-
- * gui/widgets/e-addressbook-view.c (init_collection): re-enable
- this.
- (setup_menus): same.
-
- * gui/widgets/gal-view-minicard.[ch]: more GObject work.
-
-2002-11-12 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (_popup_position): push_in
- = FALSE, no clue why... :)
- (_arrow_pressed): call g_signal_stop_emission here, seems to fix
- things.
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_init): fix warnings.
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_activate_dialog): fix warning.
-
- * gui/component/addressbook.c (forget_passwords_cb): remove the
- PENDING_PORT ifdef.
- (load_uri_auth_cb): same.
- (addressbook_authenticate): same.
-
- * gui/component/addressbook-factory.c (main): same.
-
- * gui/component/addressbook-storage.c (load_source_data): be
- silent about text nodes if they contain nothing but whitespace.
-
-2002-11-11 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-card-cursor.c (pas_card_cursor_dispose): guard
- against multiple invocations.
-
- * backend/pas/pas-backend-ldap.c (view_destroy): change signature
- to that of a weak ref notify function.
- (cursor_destroy): same.
- (pas_backend_ldap_book_destroy_cb): same.
- (get_cursor_handler): ::destroy -> weak_ref.
- (pas_backend_ldap_process_get_book_view): same.
- (pas_backend_ldap_add_client): same.
-
- * backend/pas/pas-backend-file.c (cursor_destroy): change
- signature to that of a weak ref notify function.
- (view_destroy): same.
- (pas_backend_file_book_destroy_cb): same.
- (pas_backend_file_process_get_cursor): ::destroy -> weak_ref.
- (pas_backend_file_process_get_book_view): same.
- (pas_backend_file_process_get_completion_view): same.
- (pas_backend_file_process_get_changes): same.
- (pas_backend_file_add_client): same.
-
- * backend/ebook/test-client.c (get_cursor_cb): unref the book and
- exit here.
- (get_card_cb): pass a query string to get_cursor.
-
- * backend/ebook/e-book-view.c (e_book_view_class_init): correct
- marshaller for "card_added".
-
-2002-11-11 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/test-reflow.c (destroy_callback): change signature
- to that of a weak ref notify function.
- (main): ::destroy -> weak_ref.
-
- * gui/widgets/test-minicard.c (destroy_callback): change signature
- to that of a weak ref notify function.
- (main): ::destroy -> weak_ref.
-
- * gui/widgets/test-minicard-view.c (destroy_callback): change
- signature to that of a weak ref notify function.
- (main): ::destroy -> weak_ref.
-
- * gui/widgets/test-minicard-label.c (destroy_callback): change
- signature to that of a weak ref notify function.
- (main): ::destroy -> weak_ref.
-
- * gui/widgets/e-minicard-widget.c (e_minicard_widget_init): ifdef
- out the call to gnome_canvas_set_scroll_region. It doesn't seem
- necessary judging from the rest of the code, and it also crashes
- the addressbook if it's in.
-
- * gui/widgets/e-minicard-widget-test.c (destroy_callback): change
- signature to that of a weak ref notify function.
- (main): ::destroy -> weak_ref.
-
- * gui/widgets/e-minicard-control.c (free_struct): change signature
- to that of a weak ref notify function.
- (e_minicard_control_factory): ::destroy -> weak_ref.
-
- * gui/widgets/e-addressbook-view.c (e_addressbook_view_init):
- ::destroy -> weak_ref.
- (e_addressbook_view_print): same.
- (free_closure): change signature to that of a weak ref notify
- function.
- (e_contact_print_destroy): same.
- (invisible_destroyed): same.
-
- * gui/widgets/e-addressbook-util.c
- (e_addressbook_prompt_save_dialog): convert from GnomeDialog to
- GtkDialog.
- (e_addressbook_show_multiple_cards): same.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (prompt_to_save_changes): change response ids to use
- GTK_RESPONSE_.
-
- * gui/component/select-names/e-select-names-manager.c
- (clear_widget): new function.
- (e_select_names_manager_activate_dialog): ::destroy -> weak_ref.
-
- * gui/component/select-names/e-select-names.c (clear_widget):
- change signature to that of a weak ref notify function.
- (e_select_names_init): ::destroy -> weak_ref.
-
- * gui/component/e-address-popup.c (mini_wizard_destroy_cb): change
- signature to that of a weak ref notify function.
- (mini_wizard_new): ::destroy -> weak_ref.
-
- * gui/component/addressbook-config.c
- (addressbook_source_dialog_destroy): change signature to that of a
- weak ref notify function.
- (ldap_config_control_destroy_callback): same.
- (addressbook_add_server_druid): ::destroy -> weak_ref.
- (addressbook_edit_server_dialog): same.
- (ldap_config_control_new): same.
-
- * gui/component/addressbook.c (destroy_callback): change signature
- to that of a a weak ref notify function.
- (addressbook_factory_new_control): ::destroy -> weak_ref.
-
- * gui/merging/e-card-merging.c (response): rename clicked to this,
- and destroy the dialog here.
- (match_query_callback): ::clicked -> ::response
-
- * gui/merging/e-card-merging-book-commit-duplicate-detected.glade:
- convert.
-
- * gui/merging/e-card-duplicate-detected.glade: same.
-
-2002-11-11 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (_arrow_pressed): change
- around a little, still ifdefed though.
-
- * gui/contact-editor/e-contact-save-as.c (file_exists): same.
- (save_it): deal with the GtkDialog response ids.
-
- * gui/contact-editor/e-contact-editor.c
- (e_contact_editor_confirm_delete): just build the dialog here
- (using gtk_message_dialog*).
-
- * gui/contact-editor/Makefile.am (glade_DATA): remove
- file-exists.glade and e-contact-editor-confirm-delete.glade.
-
-2002-11-11 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-card-cursor.c (pas_card_cursor_dispose): guard
- against multiple invocations.
-
- * backend/pas/pas-backend-ldap.c (view_destroy): change signature
- to that of weak ref's notify function - also, don't use the type
- check macros on the freed GObject.
- (cursor_destroy): same.
- (pas_backend_ldap_book_destroy_cb): same.
- (pas_backend_ldap_add_client): use weak_ref insteead of ::destroy.
- (get_cursor_handler): same.
- (pas_backend_ldap_process_get_book_view): same.
-
- * backend/pas/pas-backend-file.c (cursor_destroy): change
- signature to that of weak ref's notify function - also, don't use
- the type check macros on the freed GObject.
- (pas_backend_file_book_destroy_cb): same.
- (view_destroy): same.
- (pas_backend_file_process_get_cursor): use weak_ref instead of
- ::destroy.
- (pas_backend_file_process_get_book_view): same.
- (pas_backend_file_process_get_completion_view): same.
- (pas_backend_file_process_get_changes): same.
- (pas_backend_file_add_client): same.
-
-2002-11-10 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-card-sexp.c
- (pas_backend_card_sexp_dispose): guard against multiple
- invocations.
-
- * backend/pas/pas-card-cursor.c (pas_card_cursor_dispose): same.
-
- * backend/pas/pas-book.c (pas_book_dispose): same.
-
- * backend/pas/pas-book-view.c (pas_book_view_dispose): same.
-
- * backend/pas/pas-book-factory.c (pas_book_factory_dispose): same.
-
- * backend/pas/pas-backend-summary.c (pas_backend_summary_dispose): same.
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_dispose): same.
-
- * backend/pas/pas-backend-file.c (pas_backend_file_dispose): same.
-
- * backend/ebook/e-book-listener.c (e_book_listener_dispose): guard
- against multiple invocations.
-
- * backend/ebook/e-card.c (e_card_dispose): same.
-
- * backend/ebook/e-card-simple.c (e_card_simple_dispose): same.
-
- * backend/ebook/e-card-cursor.c (e_card_cursor_dispose): same.
-
- * backend/ebook/e-book.c (e_book_dispose): same.
-
- * backend/ebook/e-book-view-listener.c (e_book_view_listener_dispose): same.
-
-2002-11-08 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-model.c (free_data): guard against
- multiple invocations.
- (remove_book_view): same.
- (addressbook_dispose): same.
-
- * gui/widgets/e-addressbook-view.c (e_addressbook_view_dispose):
- same.
-
- * gui/widgets/e-minicard-view-widget.c
- (e_minicard_view_widget_dispose): same.
-
- * gui/widgets/e-minicard-view.c (e_minicard_view_dispose): same.
-
- * gui/widgets/e-minicard-widget.c (e_minicard_widget_dispose):
- same.
-
-2002-11-08 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-reflow-adapter.c
- (addressbook_get_property): oops, missed these casts.
-
- * gui/component/addressbook.c (get_master_list): remove the
- PENDING_PORT_WORK ifdef, just ported ECategoriesMasterList.
- (make_suboptions): same.
-
- * gui/contact-editor/e-contact-editor.c (categories_clicked):
- same.
-
-2002-11-08 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/test-reflow.c: port work.
-
- * gui/widgets/test-minicard-view.c: port work.
-
- * gui/widgets/e-minicard.[ch]: port work.
-
- * gui/widgets/e-minicard-widget.c: port work.
-
- * gui/widgets/e-minicard-view.c: port work.
-
- * gui/widgets/e-minicard-view-widget.c
- (e_minicard_view_widget_size_allocate): gtk_->g_ change i missed.
- (e_minicard_view_widget_reflow): same.
-
- * gui/widgets/e-minicard-label.c: port work.
-
- * gui/widgets/e-minicard-control.c (get_prop): gtk_->g_ change i
- missed.
-
- * gui/widgets/e-addressbook-view.c (setup_menus): ifdef this
- PENDING_PORT_WORK for now.
- (has_email_address_1): gtk_->g_ change i missed.
- (print): remove the PENDING_PORT_WORK from here, as the print_*
- symbols now resolve.
- (delete): gtk_->g_ changes.
- (new_card): same.
- (new_list): same.
- (sources): same.
- (create_minicard_view): same.
- (table_double_click): same.
- (create_table_view): same.
- (e_contact_print_destroy): same.
- (e_contact_print_button): same.
- (e_addressbook_view_print): same, and remove the PENDING_PORT_WORK
- ifdef.
- (e_addressbook_view_print_preview): same.
- (do_remove): gtk_->g_ changes.
- (e_addressbook_view_save_state): same.
- (view_transfer_cards): same.
-
- * gui/widgets/e-addressbook-view.h (struct _EAddressbookView):
- GtkObject -> GObject.
-
- * gui/widgets/e-addressbook-util.c (e_addressbook_error_dialog):
- GnomeDialog -> GtkDialog.
-
- * gui/widgets/e-addressbook-table-adapter.c
- (addressbook_set_value_at): a gtk_->g_ change i missed.
- (e_addressbook_table_adapter_class_init): gtk_type_class ->
- g_type_class_peek_parent.
-
- * gui/widgets/e-addressbook-reflow-adapter.c
- (addressbook_get_property): use g_object_get_property for
- aggregated properties.
- (e_addressbook_reflow_adapter_class_init): gtk_type_class ->
- g_type_class_peek_parent.
-
- * gui/merging/e-card-merging.c (match_query_callback): some misc
- gtk_->g_ changes i missed.
-
-2002-11-08 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-model.h: parent class
- is GObjectClass.
-
- * gui/component/select-names/e-simple-card-bonobo.c
- (impl_dispose): guard against multiple invocations, and chain
- dispose.
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_dispose): guard against multiple invocations.
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_dispose): guard against multiple
- invocations.
- (e_select_names_text_model_set_source): fix casts.
-
- * gui/component/select-names/e-select-names-table-model.c
- (e_select_names_table_model_add_source): remove the GTK_OBJECT
- cast, fixes a warning.
- (clear_info): guard against multiple invocations from ::dispose.
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_dispose): same.
-
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_dispose): same.
-
- * gui/component/select-names/e-select-names-bonobo.c
- (impl_dispose): guard against multiple invocations.
-
-2002-11-08 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-list-editor/contact-list-editor.glade: convert to glade-2
-
- * gui/contact-list-editor/e-contact-list-editor.c: port work.
-
- * gui/contact-list-editor/e-contact-list-model.[ch]: port work.
-
-2002-11-08 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor-address.[ch]: port work.
-
- * gui/contact-editor/e-contact-editor-fullname.[ch]: port work.
-
- * gui/contact-editor/e-contact-editor.[ch]: port work.
-
- * gui/contact-editor/e-contact-quick-add.c: port work.
-
- * gui/contact-editor/e-contact-save-as.c: port work.
-
-2002-11-08 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book-util.c
- (set_default_book_uri_from_config_db): prepend /apps/Evolution to
- config db paths.
-
- * gui/component/select-names/e-select-names-manager.c (read_completion_books_from_db): same.
- (uris_listener): same.
-
-2002-11-08 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c: more porting work.
-
- * e-contact-editor-fullname.[ch]: more porting work.
-
- * e-contact-editor.c: more porting work.
-
- * e-contact-quick-add.c: more porting work.
-
- * e-contact-save-as.c: more porting work.
-
- * test-editor.c: more porting work.
-
- * e-contact-editor-confirm-delete.glade, file-exists.glade,
- fulladdr.glade, fullname.glade: run these through
- libglade-convert.
-
-2002-11-07 Chris Toshok <toshok@ximian.com>
-
- * gui/component/Makefile.am (evolution_addressbook_LDADD): add
- lots of libs back in since they're building now.
-
- * gui/component/addressbook-config.c: more porting work.
-
- * gui/component/addressbook.c: more porting work.
-
- * gui/component/e-address-popup.[ch]: more porting work.
-
- * gui/component/e-address-widget.[ch]: more porting work.
-
- * gui/component/e-cardlist-model.[ch]: more porting work.
-
-2002-11-07 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-bonobo.[ch]: more
- porting work.
-
- * gui/component/select-names/e-select-names-completion.[ch]: more
- porting work.
-
- * gui/component/select-names/e-select-names-manager.[ch]: more
- porting work.
-
- * gui/component/select-names/e-select-names-model.[ch]: more
- porting work.
-
- * gui/component/select-names/e-select-names-popup.c: more
- porting work.
-
- * gui/component/select-names/e-select-names-table-model.[ch]: more
- porting work.
-
- * gui/component/select-names/e-select-names-text-model.[ch]: more
- porting work.
-
- * gui/component/select-names/e-select-names.[ch]: more
- porting work.
-
-2002-11-07 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/Makefile.am: tests are linking now, and link in
- libcamel.la.
-
- * backend/ebook/e-destination.c (e_destination_get_name): un-ifdef
- since camel is compiling.
- (e_destination_get_email): same.
- (e_destination_get_address): same.
- (e_destination_get_textrep): same.
-
- * backend/ebook/e-card-compare.c (name_fragment_match): use e_utf8_casefold_*.
- (name_fragment_match_with_synonyms): same.
- (e_card_compare_name_to_string_full): same.
- (e_card_compare_name): same.
-
-2002-11-07 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book-util.h: add prototypes for e_utf8_casefold_collate{_len}
-
- * backend/ebook/e-book-util.c (e_utf8_casefold_collate_len): move
- utf8_casefold_collate_len here.
- (e_utf8_casefold_collate): move utf8_casefold_collate here.
-
-2002-11-06 Chris Toshok <toshok@ximian.com>
-
- * printing/e-contact-print-envelope.c: port this to
- gnome2/gnomeprint2.
-
- * printing/e-contact-print-style-editor.c: same.
-
- * printing/e-contact-print.c: same.
-
- * printing/test-contact-print-style-editor.c: same.
-
- * printing/test-print.c: same.
-
- * printing/e-contact-print.glade: libglade-convert to libglade-2.
-
- * printing/Makefile.am (contact_print_test_LDADD)
- (contact_print_style_editor_test_LDADD): remove libcamel.la from
- these for the time being to get things linking.
-
-2002-11-06 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/gal-view-minicard.[ch]: gobjectify this.
-
- * gui/widgets/e-minicard.[ch]: gobjectify this.
- (e_minicard_class_init): change the
- min/max values of the width/height paramspecs so that they can
- actually be set to something other than 0.0.
-
- * gui/widgets/e-minicard-widget.[ch]: gobjectify this.
-
- * gui/widgets/e-minicard-view.[ch]: gobjectify this.
- (set_empty_message): don't need e_utf8_from_locale_string anymore.
-
- * gui/widgets/e-minicard-view-widget.[ch]: gobjectify this.
-
- * gui/widgets/e-minicard-label.[ch]: gobjectify this.
-
- * gui/widgets/e-addressbook-view.[ch]: gobjectify this.
-
- * gui/widgets/e-addressbook-table-adapter.[ch]: gobjectify this.
-
- * gui/widgets/e-addressbook-reflow-adapter.[ch]: gobjectify this.
-
- * gui/widgets/e-addressbook-model.[ch]: gobjectify this.
-
- * gui/widgets/e-minicard-control.c (e_minicard_control_factory):
- fix bonobo_persist_stream_new api change.
-
- * gui/contact-list-editor/e-contact-list-model.c
- (e_contact_list_model_add_destination): get rid of the
- gtk_object_sink here.
-
- * gui/component/ldap-config.glade: glade-2 version of this file.
-
- * gui/component/e-address-popup.c (e_address_popup_refresh_names):
- don't need e_utf8_to_gtk_string anymore.
-
- * gui/component/addressbook.c (make_suboptions): don't need
- e_utf8_to_locale_string anymore.
-
- * gui/component/addressbook-config.c
- (addressbook_dialog_get_source): get rid of the e_utf8 gtk_entry
- functions.
- (addressbook_source_dialog_set_source): same.
- (general_tab_check): same.
- (port_changed_func): same.
- (connecting_tab_check): same.
- (query_for_supported_bases): same.
- (display_name_check): same.
- (display_name_page_prepare): same.
- (edit_source_clicked): same.
- (addressbook_config_create_new_source): same.
-
-2002-11-06 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-card-sexp.c
- (pas_backend_card_sexp_class_init): use g_type_class_peek_parent.
-
- * backend/pas/pas-card-cursor.c (pas_card_cursor_class_init): same.
-
- * backend/pas/pas-book-view.c (pas_book_view_class_init): same.
-
- * backend/pas/pas-book-factory.c (pas_book_factory_class_init): same.
-
- * backend/pas/pas-backend-summary.c (pas_backend_summary_class_init): same.
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_class_init): same.
-
- * backend/pas/pas-backend-file.c (pas_backend_file_class_init): same.
-
- * backend/ebook/e-book-marshal.list: ENUM -> INT.
-
- * backend/ebook/e-book-view.c (e_book_view_dispose): guard against
- this being called multiple times.
- (e_book_view_class_init): ENUM -> INT in the sequence_complete
- signal.
-
- * backend/ebook/e-book.c (e_book_do_response_open): un-ifdef the
- component_died signal stuff.
-
-2002-11-06 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book-util.c (e_book_expand_uri): call
- g_build_filename, not g_build_path.
-
-2002-11-06 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-destination.[ch]: fix the gnome-xml headers.
-
-2002-11-06 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/gal-view-minicard.c: fix the gnome-xml headers.
-
- * gui/widgets/e-addressbook-view.c
- (e_addressbook_view_class_init): convert from gtk signals and args
- to GSignal and GObject properties.
- (e_addressbook_view_dispose): rename _destroy to this.
- (e_addressbook_view_set_property): rework _set_arg to this.
- (e_addressbook_view_get_property): rework _get_arg to this.
- (display_view): if we're here we need to choose a view, regardless
- of whether or not the GAL_IS_VIEW_* macros tell us which type it
- is.
-
- * gui/widgets/e-addressbook-table-adapter.c: fix the gnome-xml
- headers.
-
- * gui/widgets/e-addressbook-model.c
- (e_addressbook_model_class_init): use INT, not ENUM in the signal here.
-
- * gui/component/addressbook-config.c: another big gtk_* -> g_*
- renaming.
-
- * gui/component/addressbook.c: same.
-
- * gui/component/e-address-popup.c: same.
-
- * gui/component/e-address-widget.c: same.
-
- * gui/component/e-cardlist-model.c: fix the gnome-xml headers, and
- more gtk_* -> g_* renaming.
-
- * gui/component/addressbook-component.c (owner_set_cb): use
- evolution_shell_client_corba_objref as per ettore's change to
- EvolutionShellClient..
- (create_view): fix the call to bonobo_control_set_property.
- (create_component): gtk_signal_connect -> g_signal_connect.
-
- * gui/component/addressbook-storage.c: fix the gnome-xml
- headers.
- (addressbook_storage_setup): use
- evolution_shell_client_corba_objref as per ettore's change to
- EvolutionShellClient..
- (addressbook_get_other_contact_storage): gtk_signal_connect ->
- g_signal_connect.
- (load_source_data): root->childs -> root->childrens.
-
-2002-11-06 Chris Toshok <toshok@ximian.com>
-
- * gui/search/e-addressbook-search-dialog.c: fix some #include's.
-
-2002-11-06 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am (SUBDIRS): only build the backend and gui dirs for
- now. printing and conduits are no-man's land at present.
-
- * addressbook/gui/merging/e-card-merging.[ch]: Port to
- GObject/gnome2.
-
-2002-11-05 Chris Toshok <toshok@ximian.com>
-
- * gui/component/.cvsignore: ignore the new .server file.
-
- * gui/component/Makefile.am: typical port stuff. switch the .oaf
- to .server, and leave out a lot of libs so we can actually get
- things linking.
-
- * gui/component/GNOME_Evolution_Addressbook.server.in: rename
- .oaf.in here.
-
- * gui/component/addressbook-component.c: Port to GObject/gnome2.
-
- * gui/component/addressbook-config.c: Port to GObject/gnome2.
-
- * gui/component/addressbook-factory.c: Port to GObject/gnome2.
-
- * gui/component/addressbook-storage.c: Port to GObject/gnome2.
-
- * gui/component/addressbook.[ch]: Port to GObject/gnome2.
-
- * gui/component/e-address-popup.[ch]: Port to GObject/gnome2.
-
- * gui/component/e-address-widget.[ch]: Port to GObject/gnome2.
-
- * gui/component/e-cardlist-model.h: Port to GObject/gnome2.
-
-2002-11-05 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-list-editor/.cvsignore: ignore the marshal generated
- stuff.
-
- * gui/contact-list-editor/Makefile.am: typical port stuff. add
- marshaller generation foo, dist it...
-
- * gui/contact-list-editor/e-contact-list-editor.[ch]: Port to
- GObject/gnome2.
-
- * gui/contact-list-editor/e-contact-list-model.[ch]: Port to
- GObject/gnome2.
-
-2002-11-05 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/.cvsignore: ignore the marshal generated
- stuff.
-
- * gui/contact-editor/Makefile.am: typical port stuff. add
- marshaller generation foo, dist it...
-
- * gui/contact-editor/e-contact-editor-address.[ch]: Port to GObject/gnome2.
-
- * gui/contact-editor/e-contact-editor-fullname.c: Port to GObject/gnome2.
-
- * gui/contact-editor/e-contact-editor.c: Port to GObject/gnome2.
-
- * gui/contact-editor/e-contact-quick-add.c: Port to GObject/gnome2.
-
- * gui/contact-editor/e-contact-save-as.[ch]: Port to GObject/gnome2.
-
- * gui/contact-editor/test-editor.c: Port to GObject/gnome2.
-
-2002-11-05 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-model.[ch]: Port to GObject/gnome2.
-
- * gui/widgets/e-addressbook-reflow-adapter.c: Port to
- GObject/gnome2.
-
- * gui/widgets/e-addressbook-table-adapter.c: Port to
- GObject/gnome2.
-
- * gui/widgets/e-addressbook-util.c: Port to GObject/gnome2.
-
- * gui/widgets/e-addressbook-view.[ch]: Port to GObject/gnome2.
-
- * gui/widgets/e-minicard-control.c: Port to GObject/gnome2.
-
- * gui/widgets/e-minicard-label.[ch]: Port to GObject/gnome2.
-
- * gui/widgets/e-minicard-view-widget.[ch]: Port to GObject/gnome2.
-
- * gui/widgets/e-minicard-view.[ch]: Port to GObject/gnome2.
-
- * gui/widgets/e-minicard-widget-test.c: Port to GObject/gnome2.
-
- * gui/widgets/e-minicard-widget.c: Port to GObject/gnome2.
-
- * gui/widgets/e-minicard.[ch]: Port to GObject/gnome2.
-
- * gui/widgets/gal-view-factory-minicard.c: Port to GObject/gnome2.
-
- * gui/widgets/gal-view-minicard.c: Port to GObject/gnome2.
-
- * gui/widgets/test-minicard-label.c: Port to GObject/gnome2.
-
- * gui/widgets/test-minicard-view.c: Port to GObject/gnome2.
-
- * gui/widgets/test-minicard.c: Port to GObject/gnome2.
-
- * gui/widgets/test-reflow.c: Port to GObject/gnome2.
-
- * gui/widgets/Makefile.am: typical port stuff. add marshaller
- generation foo, dist it...
-
- * gui/widgets/.cvsignore: ignore the marshaller stuff.
-
-2002-11-05 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-simple-card-bonobo.[ch]: Port to
- GObject/gnome2.
-
- * gui/component/select-names/e-select-names.[ch]: Port to
- GObject/gnome2.
-
- * gui/component/select-names/e-select-names-text-model.c: Port to
- GObject/gnome2.
-
- * gui/component/select-names/e-select-names-table-model.c: Port to
- GObject/gnome2.
-
- * gui/component/select-names/e-select-names-popup.[ch]: Port to
- GObject/gnome2.
-
- * gui/component/select-names/e-select-names-model.c: Port to
- GObject/gnome2.
-
- * gui/component/select-names/e-select-names-manager.[ch]: Port to
- GObject/gnome2.
-
- * gui/component/select-names/e-select-names-factory.c: Port to
- GObject/gnome2.
-
- * gui/component/select-names/e-select-names-completion.[ch]: Port
- to GObject/gnome2.
-
- * gui/component/select-names/e-select-names-bonobo.[ch]: Port to
- GObject/gnome2.
-
- * gui/component/select-names/Makefile.am: typical port stuff. add
- marshaller generation foo, dist it, and switch the .oaf to .server
-
- * gui/component/select-names/.cvsignore: ignore the marshaller
- stuff.
-
-2002-11-05 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/.cvsignore: ignore the generated marshaller files.
-
- * backend/ebook/e-destination.c (e_destination_dispose): rename
- e_destination_destroy.
- (e_destination_equal): ifdef this out for now, PENDING_PORT_WORK.
- (e_destination_get_name): same.
- (e_destination_get_email): same.
- (e_destination_get_address): same.
- (e_destination_get_textrep): same.
-
- * backend/ebook/Makefile.am: don't build the executables
- (importers and loaders) for now. Also, s/oaf/server, and use
- INTLTOOL_SERVER_RULE.
-
- * backend/ebook/e-book-util.c (e_book_get_config_database):
- un-#ifdef this.
- (e_book_default_book_open): un-#ifdef ths code in here that relies
- on the e_config_listener.
-
-2002-11-05 Dan Winship <danw@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (send_pending_adds): copy a
- memleak fix from pas-backend-ad.
-
-2002-11-05 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-card.c: g_date_* => g_date_get_*, fixes
- G_DISABLE_DEPRECATED build.
-
- * backend/ebook/e-book-listener.[ch]: remove the servant crap i'd
- c&p'ed and put in here.
-
- * backend/ebook/e-book-view-listener.[ch]: remove the servant crap
- i'd c&p'ed and put in here.
-
- * backend/pas/pas-book-factory.[ch]: subclass from BonoboObject,
- and remove the servant crap from here too. whee.
-
- * backend/pas/pas-card-cursor.[ch]: remove the servant crap i'd
- c&p'ed and put in here.
-
- * backend/pas/pas-book.[ch]: remove the servant crap i'd c&p'ed
- and put in here.
-
- * backend/pas/pas-book-view.[ch]: remove the servant crap i'd
- c&p'ed and put in here.
-
-2002-11-05 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-card-sexp.[ch]: port to gnome 2.
-
- * backend/pas/pas-backend-file.[ch]: same.
-
- * backend/pas/pas-backend-file.[ch]: same.
-
- * backend/pas/pas-backend-ldap.[ch]: same.
-
- * backend/pas/pas-backend-summary.[ch]: same.
-
- * backend/pas/pas-backend.[ch]: same.
-
- * backend/pas/pas-book-factory.[ch]: same.
-
- * backend/pas/pas-book-view.[ch]: same.
-
- * backend/pas/pas-book.[ch]: same.
-
- * backend/pas/pas-card-cursor.[ch]: same.
-
- * backend/pas/pas-marshal.list: list of marshallers.
-
- * backend/pas/Makefile.am (libpas_a_SOURCES): add pas-marshal.c
- also add the marshal building foo.
-
- * backend/pas/.cvsignore: ignore pas-marshal.[ch]
-
-2002-11-05 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/test-client-list.c (main): don't call
- bonobo_activation_init directly.
-
- * backend/ebook/test-client.c (get_card_cb): don't unref the card
- here since we never reffed it.
- (main): no need to call bonobo_activation_init, as
- gnome_program_init did it for us.
-
- * backend/ebook/e-card-simple.c (e_card_simple_get_property):
- s/g_value_{set,get}_pointer/g_value_{set,get}_object
-
- * backend/ebook/e-book-util.c (set_default_book_uri_local): make
- sure to terminate args with NULL for g_build_filename.
-
- * backend/ebook/e-book-listener.c: nuke e_book_listener_get_type
- and use the BONOBO_TYPE_FUNC_FULL macro.
-
- * backend/ebook/e-book-listener.h: add the epv to
- EBookListenerClass so BONOBO_TYPE_FUNC_FULL works.
-
- * backend/ebook/e-book-view-listener.c: nuke
- e_book_view_listener_get_type and use the BONOBO_TYPE_FUNC_FULL
- macro.
-
- * backend/ebook/e-book-view-listener.h: add the epv to
- EBookViewListenerClass so BONOBO_TYPE_FUNC_FULL works.
-
-2002-11-02 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book-types.h: just include glib.h instead of the
- gtk stuff.
-
- * backend/ebook/e-book-listener.[ch]: convert to
- GObject/bonobo-activation/etc/etc.
- * e-book-util.[ch]: same.
- * e-book-view-listener.[ch]: same.
- * e-book-view.[ch]: same.
- * e-book.[ch]: same.
- * e-card-compare.[ch]: same.
- * e-card-cursor.[ch]: same.
- * e-card-simple.[ch]: same.
- * e-card.[ch]: same.
- * e-destination.[ch]: same.
- * evolution-ldif-importer.c: same.
- * evolution-vcard-importer.c: same.
- * load-gnomecard-addressbook.c: same.
- * load-pine-addressbok.c: same.
- * test-card.c: same.
- * test-client-list.c: same.
- * test-client.c: same.
-
- * backend/ebook/Makefile.am: add e-book-marshal.c to SOURCES, add
- e-book-marshal.[ch] to CLEANFILES, and add e-book-marshal.list to
- EXTRA_DIST. Also, remove the camel libs from the test LDADD's,
- and leave e-destination.[ch] out of the build.
-
- * backend/ebook/.cvsignore: ignore e-book-marshal.[ch]
-
- * backend/ebook/e-book-marshal.list: marshallers for e-book.
-
-2002-10-28 Larry Ewing <lewing@ximian.com>
-
- * backend/ebook/e-card.c (addPropValueUTF8): never set the charset
- on an item without also encoding it. Mime messages don't like
- parts with multiple charsets.
-
-2002-10-25 Dan Winship <danw@ximian.com>
-
- * gui/widgets/e-addressbook-model.c (addressbook_destroy):
- Disconnect from the book's backend_died signal.
-
-2002-10-24 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/Makefile.am: install evolutionperson.schema to
- $(datadir)/evolution.
-
-2002-10-24 Chris Toshok <toshok@ximian.com>
-
- [ fixes #29144 ]
- * gui/component/addressbook-config.c (edit_dialog_store_change):
- use e_table_memory_storage_change instead of remove/insert, so the
- selection is maintained.
-
-2002-10-22 Dan Winship <danw@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (folder_selected): Set /Addressbook/select_names_uri in the
- configdb to the selected folder.
- (e_select_names_init): Look for /Addressbook/select_names_uri
- before /DefaultFolders/contacts_uri for the initial folder. So the
- select names dialog now starts up using the same folder you used
- last time, which is useful when you have an LDAP company directory
- (which can't be your default contacts folder because it's
- read-only).
-
-2002-10-21 Dan Winship <danw@ximian.com>
-
- * gui/component/addressbook-component.c (IS_CONTACT_TYPE): fix the
- sense of a strcmp
-
-2002-10-20 Chris Toshok <toshok@ximian.com>
-
- [ fix for #23764 ]
- * gui/widgets/e-addressbook-view.c (jump_to_letters): handle
- multiple letters associated with a single button.
- (button_toggled): closure->letter -> closure->letters.
- (free_closure): free closure->letters.
- (create_alphabet): init closure->letters.
-
-2002-10-20 Chris Toshok <toshok@ximian.com>
-
- [ fixes #29067 ]
- * backend/pas/pas-backend-file.c (pas_backend_file_search): we
- need to create a card_sexp even when doing summary queries since
- it's used to check modifications of cards in the view.
-
-2002-10-20 Chris Toshok <toshok@ximian.com>
-
- [ fixes #32144 ]
- * gui/contact-editor/e-contact-save-as.c (e_contact_save_as):
- convert the name to the gtk locale before saving.
- (e_contact_list_save_as): same.
-
-2002-10-19 Chris Toshok <toshok@ximian.com>
-
- [ probable fix for #25477, and memory leak fix ]
- * gui/contact-editor/e-contact-editor.c (supported_fields_cb): if
- the dialog isn't in the list of all dialogs it's been destroyed so
- just return here.
-
- * backend/ebook/e-book.c
- (e_book_do_response_get_supported_fields): plug leak of
- resp->fields.
-
-2002-10-15 Dan Winship <danw@ximian.com>
-
- * backend/ebook/e-card.c (e_card_email_match_string): Return right
- away rather than crashing if card->email is NULL.
- (e_card_email_find_number): Likewise.
-
-2002-10-10 Kjartan Maraas <kmaraas@gnome.org>
-
- [ Fix #7094, #7064, #7095, #31944, #31945 ]
- * gui/component/Makefile.am: Hook up new etspec file.
- * gui/component/addressbook-config.c: Remove ETable spec.
- * gui/component/addressbook-config.etspec: New file.
- * gui/component/ldap-config.glade: Fix typo.
- * gui/component/select-names/e-select-names.c: Remove inline spec.
- * gui/component/select-names/e-select-names.etspec: New file.
- * gui/contact-list-editor/Makefile.am: Hook up etspec.
- * gui/contact-list-editor/e-contact-list-editor.c: Remove inline spec.
- * gui/contact-list-editor/e-contact-list-editor.etspec: New file.
- * gui/widgets/Makefile.am: Hook up new spec.
- * gui/widgets/e-addressbook-view.c: Remove inline spec.
- * gui/widgets/e-addressbook-view.etspec: New file.
-
-2002-10-02 Chris Toshok <toshok@ximian.com>
-
- [ Fix #28392 ]
- * gui/widgets/e-addressbook-view.c (do_popup_menu): #if 0 out the
- gal_view submenu, since it's not spec'ed to be there anyway (as
- per bug #16250).
-
-2002-09-30 Chris Toshok <toshok@ximian.com>
-
- [ Fixes #31321 ]
- * backend/ebook/e-card.c (e_card_get_vobject): add VERSION:2.1 to
- exported vCards.
-
-2002-09-30 Chris Toshok <toshok@ximian.com>
-
- [ Fixes #31434 ]
- * backend/pas/pas-backend-file.c (do_summary_query): always
- retrieve the card from the db. use the summary strictly for
- matching, not for storing all information. This fixes completion
- of contact lists, since only 3 addresses were being stored and
- contact lists can have more.
-
-2002-09-30 Aaron Weber <aaron@ximian.com>
-
- * gui/widgets/e-addressbook-util.c (e_addressbook_show_multiple_cards): rephrase string on l. 213
-
-2002-09-30 Dan Winship <danw@ximian.com>
-
- * backend/ebook/e-card.c (e_card_list_send): update for
- Composer_setHeaders change.
-
-2002-09-27 Chris Toshok <toshok@ximian.com>
-
- [ fixes #27521 ]
- * gui/contact-editor/e-contact-quick-add.c (editor_closed_cb):
- always unref the contact editor when we get the editor_closed
- signal.
-
-2002-09-27 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (check_schema_support): set the
- timeout to 30 seconds.
- (query_ldap_root_dse): same, and also return the ldap_error since
- this function is the one that actually causes openldap to
- connect() to the ldap host.
- (pas_backend_ldap_connect): check the return value of
- query_ldap_root_dse, and error out if it's not SUCCESS.
-
-2002-09-26 Dan Winship <danw@ximian.com>
-
- * gui/component/addressbook-storage.c (load_source_data): Change
- folder type to "contacts/ldap".
- (addressbook_storage_add_source): Likewise.
- (create_ldap_folder): Check for type being "contacts" not
- ldap contacts, since the ldap-specific type doesn't appear in the
- menu.
-
-2002-09-25 Dan Winship <danw@ximian.com>
-
- * gui/component/addressbook-component.c (folder_types): Rename
- "ldap-contacts" to "contacts/ldap" and add "contacts/public".
- (IS_CONTACT_TYPE): update for new types.
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_init): Use "contacts/*" for selector_types.
-
- * gui/widgets/e-addressbook-util.c (e_addressbook_transfer_cards):
- Likewise.
-
- * gui/component/GNOME_Evolution_Addressbook.oaf.in: add
- "evolution:config_item:type" = "contacts/ldap" to the LDAP sources
- control so it comes up by default when you open Preferences in an
- LDAP folder.
-
-2002-09-23 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-table-adapter.c (addressbook_destroy):
- free adapter->priv.
-
- * gui/widgets/e-addressbook-model.c (addressbook_destroy): free
- model->query.
-
- * gui/component/select-names/e-select-names-manager.c
- (load_completion_books): use e_book_expand_uri here, and free the
- expanded uri after calling addressbook_load_uri, plugging a leak.
-
- * gui/component/select-names/e-select-names.c (set_book): unref
- esn->model before we unref esn. fixes an edge case memory
- corruption bug.
- (clear_widget): utility function to set a widget's ref to NULL
- when it's destroyed.
- (e_select_names_init): hook the status_message, categories option
- menu, and select_entry to clear_widget.
- (addressbook_model_set_uri): use e_book_expand_uri.
-
-2002-09-23 JP Rosevear <jpr@ximian.com>
-
- * conduit/Makefile.am: add libeutil to the link and link with
- libcamel instead of libcamel-static.la
-
-2002-09-22 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-manager.h: oops, add
- cached_folder_list to struct _ESelectNamesManager.
-
-2002-09-22 Chris Toshok <toshok@ximian.com>
-
- [ Fixes #30481 ]
- * gui/component/select-names/e-select-names.c
- (e_select_names_init): initialize the select names dialog with the
- default contacts folder.
-
-2002-09-22 Chris Toshok <toshok@ximian.com>
-
- [ Fixes #28165, 29171 ]
- * gui/component/select-names/e-select-names-manager.c
- (uris_listener): check to see if the value has really changed.
- the way the preferences dialog works is such that we'll get called
- when any of the Folder Options are changed (default folders,
- offline stuff, etc.) we really only want to tear down and build
- back up the completion books if the autocomplete folder setting
- changed.
- (read_completion_books_from_db): cache the folder list, and call
- load_completion_books.
- (load_completion_books): new function, loads from the
- cached_folder_list.
- (e_select_names_manager_init): init cached_folder_list to NULL.
- (e_select_names_manager_destroy): g_free (cached_folder_list).
-
-2002-09-20 Chris Toshok <toshok@ximian.com>
-
- [ Fixes #30483 ]
- * gui/component/select-names/e-select-names-completion.c
- (name_style_query): argh, contains => beginswith.
-
-2002-09-17 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c (add_creatable_item):
- don't add the user creatable item for ldap-contact folders atm,
- since it results in their being duplicate New Contact and New
- Contact List menu items.
-
-2002-09-17 Kjartan Maraas <kmaraas@gnome.org>
-
- * gui/component/ldap-config.glade: Fix a typo.
-
-2002-09-13 Chris Toshok <toshok@ximian.com>
-
- [ Fixes bug #30250 ]
- * backend/ebook/e-destination.c (e_destination_get_name): handle
- "Unnamed Lists" here by setting their name to _("Unnamed List').
-
- * backend/ebook/e-card-simple.c (e_card_simple_get): same.
-
- * gui/contact-list-editor/e-contact-list-editor.c (is_named): new
- function, return TRUE if the name field is filled in.
- (prompt_to_save_changes): return TRUE if the list isn't named
- (meaning it's not saveable.)
- (command_state_changed): saving requires a name.
- (add_email_cb): always call command_state_changed.
- (remove_entry_cb): same.
- (list_name_changed_cb): same.
- (visible_addrs_toggled_cb): same.
- (table_drag_data_received_cb): same.
-
-2002-09-12 Dan Winship <danw@ximian.com>
-
- * backend/ebook/e-card-simple.c (e_card_simple_get): return
- g_strdup("true"), not "true".
-
-2002-09-11 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_start_query): institute an arbitrary
- minimum limit on the number of characters before we actually try
- to autocomplete. It's 3, btw.
-
-2002-09-11 Chris Toshok <toshok@ximian.com>
-
- [ fixes the other half of #17336 ]
- * gui/contact-editor/e-contact-quick-add.c (quick_add_set_name):
- parse the name when we're asked to set it, so the full name
- doesn't get stored as (potentially) "Last, First" in the card.
-
-2002-09-11 Chris Toshok <toshok@ximian.com>
-
- [ fixes part of #17336 ]
- * gui/contact-editor/e-contact-editor-fullname.c
- (e_contact_editor_fullname_init): get the window title from the
- .glade file, and supply a suitable wm icon.
-
- * gui/contact-editor/e-contact-editor-address.c
- (e_contact_editor_address_init): same.
-
-2002-09-11 Chris Toshok <toshok@ximian.com>
-
- [ fixes #30208 ]
- * gui/component/addressbook.c (load_uri_auth_cb): if the user
- clicked cancel in the password dialog, let them off the hook and
- bind anonymously. Otherwise (if they failed to auth), prompt them
- for the password again.
- (addressbook_authenticate): new function, split out 99% of the
- auth machinery here so it can be called multiple times. Also,
- call the callback with E_BOOK_STATUS_CANCELLED if the user clicked
- the cancel button in the dialog.
- (load_uri_cb): call addressbook_authenticate if the book has auth
- enabled.
- (addressbook_load_uri): use g_new0.
-
-2002-09-05 Anna Dirks <anna@ximian.com>
- * gui/component/GNOME_Evolution_Addressbook.oaf.in : Changed the
- description of the Directory Servers page of the settings dialog
- to be a little less wordy {This page can be used to configure blah-->
- Configure blah.}
-
-
-2002-09-04 Chris Toshok <toshok@ximian.com>
-
- [ Fixes #29904 ]
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_activate_obj): we need to activate
- either a contact list editor or contact editor depending on if
- it's a list (this screams for a utility function.)
-
-2002-09-04 Dan Winship <danw@ximian.com>
-
- * gui/component/addressbook-storage.c
- (addressbook_get_other_contact_storage): Pass FALSE to
- evolution_storage_new: the Other Contacts storage doesn't support
- shared folders.
-
-2002-09-04 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c (create_component): Pass
- NULL as @unpopulate_folder_context_menu_fn to
- evolution_shell_component_new().
-
-2002-09-03 Mike Kestner <mkestner@ximian.com>
-
- * gui/component/select-names/e-select-names.c (e_select_names_destroy):
- unref the "without", adapter, and model, then chain up the GnomeDialog
- destroy function.
-
-2002-09-03 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/GNOME_Evolution_Addressbook.oaf.in: Use
- ldap-settings.png instead of evolution-contacts.png.
-
-2002-09-03 Chris Toshok <toshok@ximian.com>
-
- [ fixes #29699 ]
- * gui/component/addressbook-config.c
- (addressbook_add_server_druid): call _set_source with a NULL
- source to fill in dialog settings that are set from the option
- menus (like the SSL setting).
-
-2002-09-03 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook.c (delete_contact_cb): Fix typo
- [`view>view' instead of `view->view']. Also, cast to
- GTK_WINDOW instead of GTK_WIDGET as it should be.
-
-2002-08-30 Dan Winship <danw@ximian.com>
-
- * backend/idl/addressbook.idl (CallStatus): add QueryRefused, for
- when the backend refuses to perform a query. (part of #25782)
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_convert_status): translate
- GNOME_Evolution_Addressbook_BookViewListener_QueryRefused.
-
- * gui/component/addressbook.c (search_result): Handle
- E_BOOK_VIEW_STATUS_QUERY_REFUSED.
-
-2002-08-30 Chris Toshok <toshok@ximian.com>
-
- [ fixes #27923]
- * backend/pas/pas-backend-summary.c: up the version to 4_0 (4000).
- (pas_backend_summary_load_item): handle wants_html{_set}, list,
- and list_show_addresses.
- (pas_backend_summary_save_item): same.
- (pas_backend_summary_add_card): same.
- (pas_backend_summary_get_summary_vcard): same.
-
-2002-08-29 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c (add_creatable_item): call
- evolution_shell_component_add_user_creatable_item twice here, once
- for the "contacts" folder type, and once for "ldap-contacts".
-
-2002-08-29 Chris Toshok <toshok@ximian.com>
-
- [ fixes #20347 ]
- * gui/widgets/e-addressbook-view.c (e_addressbook_view_init): hook
- up the backend_died signal.
- (backend_died): new function, pop up an error dialog saying the
- backend died.
-
- * gui/widgets/e-addressbook-model.c (backend_died): new function,
- emit the backend_died signal.
- (e_addressbook_model_class_init): create the backend_died signal.
- (e_addressbook_model_init): init backend_died_id
- (e_addressbook_model_set_arg): disconnect the backend_died signal
- from the old book and hook it up to the new book.
-
- * gui/widgets/e-addressbook-model.h: add the backend_died signal.
-
- * backend/ebook/e-book.c (backend_died_cb): new function, emit the
- backend_died signal.
- (e_book_do_response_open): create the component listener and hook
- up the backend_died signal.
- (e_book_destroy): disconnect the component listener and unref it.
-
- * backend/ebook/e-book.h: add backend_died signal.
-
-2002-08-29 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-card-sexp.c (is_helper): use strcasecmp
- here, since all the other helpers use case insensitive
- comparisons.
-
- * backend/pas/pas-backend-summary.c (is_helper): same.
-
-2002-08-29 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (category_ber): return NULL if
- the list is empty.
- (pas_backend_ldap_connect): always try to use ldapv3, not just
- when we want to use tls.
-
-2002-08-29 Chris Toshok <toshok@ximian.com>
-
- [ fixes #25038 ]
- * gui/contact-editor/Makefile.am (INCLUDES): need to have
- EVOLUTION_ICONSDIR defined.
-
- * gui/contact-list-editor/Makefile.am (INCLUDES): same.
-
- * gui/contact-editor/e-contact-editor.c (e_contact_editor_init):
- set the window icon to the contact mini icon.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (e_contact_list_editor_init): set the window icon to the new
- contact list icon.
-
- * gui/widgets/e-minicard.c (LIST_ICON_FILENAME): change to (the
- prettier, imo) "contact-list-16.png"
-
-2002-08-28 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_search): spew
- the filter we're using for the search.
-
-2002-08-28 Mike Kestner <mkestner@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c : stop the
- EBookViews before unreffing.
-
-2002-08-28 Dan Winship <danw@ximian.com>
-
- * gui/component/GNOME_Evolution_Addressbook.oaf.in: Add an
- evolution:shell_component_launch_order and rename
- evolution:shell_component_icon.
-
-2002-08-28 Chris Toshok <toshok@ximian.com>
-
- [ oops, merged the .h and .glade file back to the HEAD from the
- 1-0 branch, but missed the .c file. ]
- * gui/component/select-names/e-select-names.c (status_message): set
- the status label's text.
- (e_select_names_init): get the status message widget from the
- glade ui.
-
-2002-08-28 Chris Toshok <toshok@ximian.com>
-
- [ fixes #19286 ]
- * gui/component/addressbook.c (delete_contact_cb): confirm
- deletion of contacts when using the menubar or toolbar.
-
-2002-08-28 Chris Toshok <toshok@ximian.com>
-
- [ fixes #28897 ]
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_clear_book_data): set book_data to NULL
- after clearing/freeing the list. fixes a crash.
-
-2002-08-28 Chris Toshok <toshok@ximian.com>
-
- [ fixes #20348 ]
- * backend/pas/evolutionperson.schema: deprecate "categories" in
- favor of "category". evolution no longer uses "categories".
-
- * backend/pas/pas-backend-ldap.c (category_populate): new
- function, "category" is the new name, and it's multivalued so we
- need the complex-prop stuff..
- (category_ber): new function, same.
- (category_compare): new function, same.
-
- * gui/component/addressbook.c (addressbook_search_activated): the
- text is "Category is" so we should use "is" instead of "contains"
- for the query.
-
-2002-08-27 Chris Toshok <toshok@ximian.com>
-
- [ Fixes #14835 ]
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_search):
- notify_complete with InvalidQuery if the parse fails.
-
-2002-08-27 Chris Toshok <toshok@ximian.com>
-
- [ fixes #26907 ]
- * gui/component/addressbook.c (addressbook_search_activated): use
- beginswith for email.
-
-2002-08-26 Chris Toshok <toshok@ximian.com>
-
- * printing/e-contact-print.c (complete_sequence): change prototype
- for complete_sequence to match sequence_complete.
- (e_contact_print_button): same.
-
-2002-08-26 Chris Toshok <toshok@ximian.com>
-
- [ fixes #29446 ]
- * gui/component/addressbook-config.c (scope_optionmenu_activated):
- searching_modify_func can be NULL (since we don't require changes
- to enable the "Next" button on this page when you create a
- directory server.)
-
-2002-08-26 Chris Toshok <toshok@ximian.com>
-
- [ Fixes (almost certainly) #24649, #25494, #27351, and other LDAP search crashes ]
- * backend/pas/pas-backend-ldap.c (view_destroy): use an EList
- instead of a GList to store the book_view's so we don't have weird
- issues with modifying the list while it's being traversed.
- (find_book_view): same.
- (create_card_handler): same.
- (remove_card_handler): same.
- (modify_card_modify_handler): same.
- (poll_ldap): same, and also ref the book_view before calling
- ldap_search_op_timeout (and therefore send_pending_adds).
- (ldap_search_handler): same.
- (ldap_op_add): warn about conflicting ldap msgid's (shouldn't ever
- happen..)
- (homephone_populate): make this a bit more robust (if values[0] ==
- NULL, values[1] won't be valid).
- (business_populate): same.
- (build_card_from_entry): break out of the prop_info loop when we
- get a match, and only set the simple field if the value != NULL.
- (ldap_search_dtor): free all the pending adds stuff.
- (pas_backend_ldap_process_get_book_view): g_list_prepend =>
- e_list_append.
- (pas_backend_ldap_remove_client): simplify the removing of the
- book (use g_list_remove instead of searching and then using
- g_list_remove_link.)
- (pas_backend_ldap_destroy): unref the book_views list.
- (pas_backend_ldap_init): initialize the EList for book_views.
-
-2002-08-25 Mike Kestner <mkestner@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (remove_book_view): stop the
- view before unref, in case the listener has pending events.
-
-2002-08-20 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (book_open_cb): not sure what i was
- thinking here... the EBook isn't valid if we couldn't open it, so
- we can't turn around and query it for its capabilities.
-
-2002-08-19 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-manager.h: add the
- listener_id slot.
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_new): store off the listener_id.
- (e_select_names_manager_destroy): remove the bonobo listener -
- fixes a crash when modifying the completion folders after you
- bring up a compose window.
- (e_select_names_manager_entry_new): another random timeout change
- - make the completion at 100ms.
-
-2002-08-19 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-book-view.c (pas_book_view_notify_complete):
- take and pass the CallStatus to our listener.
-
- * backend/pas/pas-book-view.h: change the prototype for
- notify_complete to include the CallStatus.
-
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_seq_complete_cb): add the status arg.
-
- * gui/widgets/e-addressbook-view.c
- (e_addressbook_view_class_init): init the search_result signal.
- (e_addressbook_view_init): connect to the model's search_result
- signal.
- (emit_search_result): emit our search_result signal.
- (search_result): call emit_search_result.
-
- * gui/widgets/e-addressbook-view.h (struct
- _EAddressbookViewClass): add the search_result signal.
-
- * gui/widgets/e-addressbook-model.c (sequence_complete): emit both
- a "search_result" as well as the "stop_state_changed" signal.
- (e_addressbook_model_class_init): init the search_result signal.
-
- * gui/widgets/e-addressbook-model.h: add search_result signal.
-
- * gui/component/addressbook.c (search_result): pop up a dialog
- telling the user why the search failed or was truncated.
- (addressbook_factory_new_control): connect to the "search_result"
- signal on the view.
-
- * conduit/address-conduit.c (sequence_complete): add the status
- parameter to sequence_complete.
-
- * backend/idl/addressbook.idl: add BookViewListener_CallStatus,
- and change notifySequenceComplete to take a CallStatus.
-
- * backend/pas/pas-backend-ldap.c (create_card_handler): pass
- status back in the notify_complete call.
- (remove_card_handler): same.
- (modify_card_modify_handler): same
- (ldap_search_handler): same, and parse out the ldap return code so
- we can report limits being properly.
-
- * backend/pas/pas-backend-file.c (do_summary_query): pass status
- back in the notify_complete call.
- (pas_backend_file_search): same, and get rid of the
- status_message, as the status is passed back properly.
- (pas_backend_file_search): pass status
- back in the notify_complete call.
- (pas_backend_file_changes): same.
- (pas_backend_file_process_create_card): same.
- (pas_backend_file_process_remove_card): same.
- (pas_backend_file_process_modify_card): same.
-
- * backend/ebook/e-book-util.c (simple_query_sequence_complete_cb):
- add status parameter.
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_queue_status_event): change name from
- _queue_empty_event, and take a status arg.
- (e_book_view_listener_queue_id_event): init resp->status (to
- SUCCESS).
- (e_book_view_listener_queue_sequence_event): same.
- (e_book_view_listener_queue_message_event): same.
- (impl_BookViewListener_notify_sequence_complete): call
- queue_status_event, and convert the corba status to
- EBookViewStatus.
- (e_book_view_listener_convert_status): new function, conver the
- corba status to EBookViewStatus.
-
- * backend/ebook/e-book-view-listener.h: add a "status" slot to
- EBookViewListenerResponse.
-
- * backend/ebook/e-book-view.h: change prototype for
- sequence_complete signal.
-
- * backend/ebook/e-book-view.c (e_book_view_do_complete_event):
- sequence_complete takes a parameter now (EBookViewStatus).
- (e_book_view_class_init): add the enum arg to the signal.
-
- * backend/ebook/e-book-types.h: add EBookViewStatus enum.
-
-2002-08-19 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_get_static_capabilities): add
- "cache-completions" here, since file completion results are
- blanket cached (as they're generated from a summary).
-
- * backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_process_get_cursor): there should be no search
- limit on the get_cursor_request, as it's meant to match every card
- it can.
- (ldap_search_handler): parse the ldap result in the
- RES_SEARCH_RESULT case. we'll want more here soon, so we can
- notify the front end if the result was truncated due to either the
- size or time limit being exceeded.
- (pas_backend_ldap_process_get_book_view): in the case of a
- completion view, we hardcode (yeah yeah, i know, but really) the
- search limit to MIN (100, user-specified-limit).
- (pas_backend_ldap_search): each view has its own limit now,
- defaulting from the user specified one for normal searches but
- possibly different for completion views. use the view's limit
- here.
-
-2002-08-19 Dan Winship <danw@ximian.com>
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_get_property_fn): add an "addresses" property, to get the
- "Dan Winship <danw@ximian.com>" form, as opposed to "text", which
- gets you what's displayed, which might be just "Dan Winship".
- (entry_set_property_fn): When setting, just reuse the "text" code,
- since it should properly cardify everything for us anyway.
- (impl_SelectNames_get_entry_for_section): Add the property.
-
-2002-08-16 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-config.c
- (addressbook_source_dialog_set_source): fix c&p error that was
- losing the ssl setting.
-
-2002-08-16 Iain <iain@ximian.com>
-
- * backends/e-book/evolution-ldif-importer.c (ebook_create): Use the
- default EBook instead of the local one.
-
- * backends/e-book/evolution-vcard-importer.c (ebook_create): Ditto.
-
-2002-08-16 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (book_view_notify_status): new
- function to save a little typing.
- (find_book_view): same.
- (pas_backend_ldap_connect): reorder things a bit - set the version
- to VERSION3 *before* doing TLS, as tls requires v3, and if we're
- doing ldaps://, do tls a little differently (not sure if this is
- strictly necessary, but the openldap source did it.. *shrug*).
- also, guard the schema check as this function can be called
- multiple times for the same server (if the server goes down or
- times us out.)
- (pas_backend_ldap_reconnect): new function, reconnect and if
- necessary reauth the user.
- (pas_backend_ldap_process_create_card): use
- find_book_view/book_view_notify_status/pas_backend_ldap_reconnect.
- (pas_backend_ldap_process_remove_card): same.
- (pas_backend_ldap_process_modify_card): same.
- (pas_backend_ldap_process_get_vcard): same.
- (pas_backend_ldap_process_get_cursor): same.
- (pas_backend_ldap_search): same.
- (poll_ldap): reconnect if ldap_result returns -1.
- (pas_backend_ldap_process_authenticate_user): ick ick ick save off
- the dn/passwd we auth with so we can use them to reauthenticate.
-
-2002-08-16 Chris Toshok <toshok@ximian.com>
-
- [ fix 27333 ]
- * gui/widgets/e-addressbook-model.c (get_view): "local" ->
- "do-initial-query".
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_get_static_capabilities): "local" ->
- "local,do-initial-query".
-
- * gui/widgets/e-addressbook-model.c (get_view): "local" ->
- "do-initial-query".
-
- * gui/component/addressbook.c (book_open_cb): Only assume the
- addressbook is local if "local" appears in its static
- capabilities. We still use the ldap special case, but be nicer to
- other networked backends.
-
-2002-08-12 Dan Winship <danw@ximian.com>
-
- * gui/component/addressbook-component.c (user_create_new_item_cb):
- If invoked from a non-contact folder, add the contact to the
- default contact folder, not the local one. If invoked from a
- contact folder, don't append "addressbook.db" to the URI, let
- ebook do the right thing. Fixes #28327 and #28325.
-
- * backend/idl/addressbook.idl (CallStatus): Add NoSuchBook.
- (Initially intended as part of a fix for #28327, but the other
- changes make it so the error code never ends up getting used any
- more, but it's still good to have.)
-
- * gui/widgets/e-addressbook-util.c (e_addressbook_error_dialog):
- Handle NO_SUCH_BOOK.
-
- * backend/ebook/e-book-types.h (EBookStatus): Add
- E_BOOK_STATUS_NO_SUCH_BOOK.
-
- * backend/ebook/e-book-listener.c
- (e_book_listener_convert_status): add case for NoSuchBook.
-
- * backend/ebook/e-book-util.c (e_book_load_local_address_book):
- Kill this. Nothing should ever explicitly load the local
- addressbook.
- (e_book_use_default_book): Replaces e_book_use_local_address_book,
- using the default book instead.
- (e_book_default_book_open): Fall back to local contact folder on
- E_BOOK_STATUS_NO_SUCH_BOOK too.
- (e_book_query_address_default): Use default book, not local.
-
- * gui/component/e-address-widget.c (query_idle_fn): Use the
- default book, not the local book.
-
- * gui/component/select-names/e-select-names-popup.c
- (edit_contact_info_cb): Use the default book, not the local book.
-
- * backend/ebook/e-destination.c (e_destination_cardify): Use the
- default book, not the local book.
- (e_destination_touch): Query the default book, not the local book.
-
- * backend/ebook/e-card-compare.c (e_card_locate_match,
- e_card_locate_match_full): Use the default book, not the local
- book.
-
-2002-08-08 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-summary.c (pas_backend_summary_init):
- initialize summary->upgraded to quiet valgrind.
-
-2002-08-06 Dan Winship <danw@ximian.com>
-
- * backend/ebook/test-client.c (TEST_VCARD): Use "\r" rather than
- including literal CRs in the string, which confuses gcc on OS X.
-
- * backend/ebook/test-card.c (TEST_VCARD): Likewise.
-
-2002-08-01 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #25958 ]
- * gui/component/addressbook.c (alphabet_state_changed): use
- FULL_NAME in the case where we're untoggling a letter, and... well
- use FULL_NAME in the other case too - we should never pop up the
- advanced dialog.
-
-2002-08-01 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names.h (struct
- _ESelectNames): no more search_entry.
-
- * gui/component/select-names/e-select-names.c (update_query): no
- more search_entry, search_entry => select_entry, and add file_as
- to the query since some entries don't have names (like the Ximian,
- Inc. default card.)
- (e_select_names_init): no more search_entry, and add an "activate"
- handler on select_entry that updates the query.
-
-2002-08-01 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names.h (struct
- _ESelectNames): remove folders and folders_by_uri, and the 2
- listeners.
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_destroy): remove the hash_table_destroys of
- folders and folders_by_uri, since they no longer exist. same for
- other_contacts_listener and local_listener.
-
-2002-08-01 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c (create_component): Use
- "contact-list-16.png" for the "New Contact List" item.
-
-2002-07-31 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c (create_component): Change
- the order so that "New Contact" is first and "New Contact List" is
- next.
-
-2002-07-31 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c (add_creatable_item): Pass
- "contacts" as the @folder_type to
- evolution_shell_component_add_user_creatable_item().
-
-2002-07-31 Chris Toshok <toshok@ximian.com>
-
- [ roll in the following change from the 1.0 branch.]
- * backend/pas/pas-backend-ldap.c:
- (prop_info): change the CALURI and FBURL ecard attributes to map to the
- RFC 2739 specified attributes.
- (check_schema_support): check to see if calEntry is supported.
- (add_objectclass_mod): insert calEntry if it's supported.
- * backend/pas/evolutionperson.schema: deprecate freeBusyURI
- and calendarURI.
-
-2002-07-31 Ettore Perazzoli <ettore@ximian.com>
-
- [Patch by Jacob Berkman <jacob@ximian.com>, fixes #25968]
-
- * backend/ebook/e-book.c (activate_factories_for_uri): Don't
- double free protocol and query.
-
-2002-07-27 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-summary.c (save_string): don't save
- empty strings.
- (pas_backend_summary_save): print out the errno when we fail.
-
-2002-07-26 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook.c: Don't set up the ContactNew and
- ContactNewList verbs.
- (update_command_state): Don't set the sensitivity of
- /commands/ContactNew and /commands/ContactNewList anymore.
- (new_contact_cb): Removed.
- (new_contact_list_cb): Removed.
-
-2002-07-24 Peter Williams <peterw@ximian.com>
-
- * conduit/Makefile.am (libeaddress_conduit_la_LIBADD): Change
- libversit.la -> libversit.a for danw's changes.
-
-2002-07-24 Dan Winship <danw@ximian.com>
-
- * conduit/Makefile.am (libeaddress_conduit_la_LIBADD):
- s/libversit_lt/libversit/
-
-2002-07-22 Dan Winship <danw@ximian.com>
-
- * backend/pas/Makefile.am: Split pas-backend-file and
- pas-backend-ldap out of libpas and build them as separate (noinst)
- libraries libpasfile.a and libpasldap.a. This gets the db3 and
- LDAP dependencies out of libpas, and people trying to create an
- addressbook backend shouldn't be calling functions from the
- existing backends anyway so there's no reason to install them.
-
-2002-07-16 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/select-names.glade: remove the option
- menu and browse button, and add a custom widget placeholder for
- the folder-selector.
-
- * gui/component/select-names/e-select-names.c
- (addressbook_model_set_uri): move the "append /addressbook.db"
- stuff here.
- (e_addressbook_create_ebook_table): remove the code setting
- initial uri from here.
- (e_select_names_folder_free): gone.
- (e_select_names_option_activated): gone.
- (add_menu_item): gone.
- (update_option_menu): gone.
- (new_folder): gone.
- (removed_folder): gone.
- (folder_browse): gone.
- (hookup_listner): gone.
- (add_additional_select_names_uris): gone.
- (e_select_names_hookup_listners): gone.
- (e_addressbook_create_folder_selector): new function, create the
- folder selector button.
- (folder_selected): new function, callback for the folder selector.
- just calls addresbook_model_set_uri.
- (e_select_names_init): get the folder selector and initialize it
- to show /local/Contacts. also, set the model's uri here to the
- same folder. nuke the code involving the old option menu and
- browse button.
-
-2002-07-08 Peter Williams <peterw@ximian.com>
-
- * backend/ebook/Makefile.am: Install libebook-static.la.
- Also change --all-static to -all-static, which is the right flag.
-
- * backend/pas/Makefile.am: Install the PAS headers in
- $(includedir)/evolution/pas. Install libpas.a
-
-2002-07-08 Peter Williams <peterw@ximian.com>
-
- * gui/component/select-names/Makefile.am (idl_DATA): Install the
- SelectNames IDL and ancillary changes.
-
-2002-07-12 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-summary.c (free_summary_item): free the
- full_name (as well as given_name. oops.)
- (pas_backend_summary_new): new summaries are version 3.0 now.
- (pas_backend_summary_load_item): all loaded summaries should be
- 3.0+, as we fail to load versions lower than that.
- (pas_backend_summary_load_header): if the summary isn't version
- 3.0 fail out, as we need to rebuild the entire file to cache the
- full_name fields.
- (pas_backend_summary_save_item): save out the full_name.
- (pas_backend_summary_add_card): put the item's full_name in the
- card.
-
-2002-07-12 Dan Winship <danw@ximian.com>
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_get_property_fn): Make the
- ENTRY_PROPERTY_ID_SIMPLE_CARD_LIST case not crash, although
- there's still something wrong.
-
-2002-07-10 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_start_query): e_book_get_book_view =>
- e_book_get_completion_view, so the backends have the option of
- using a pregenerated summary.
-
-2002-07-10 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-summary.c (clear_items): actually remove
- the items from the pointer array too, so an error while loading
- doesn't leave the memory summary corrupted.
- (pas_backend_summary_load_header): bleah, load the num_items and
- summary_mtime in the right order :) Also, set upgraded to TRUE if
- we loaded a v1.0 summary.
- (pas_backend_summary_open): make this return a gboolean, return
- TRUE if the summary is already open (priv->fp != NULL). return
- FALSE in error conditions.
- (pas_backend_summary_load): if summary_open returns FALSE, return
- FALSE, also set the dirty flag to FALSE after we load, and if the
- summary was upgraded write it out.
- (pas_backend_summary_save): update the in memory mtime to that of
- the file when we save.
- (summary_flush_func): if we're not dirty, do nothing and return.
- (pas_backend_summary_is_up_to_date): make sure we've opened the
- summary.
- (pas_backend_summary_get_summary_vcard): fix compiler warning.
-
-2002-07-10 Peter Williams <peterw@ximian.com>
-
- * backend/ebook/e-book-view-listener.h: Oops, missed this one.
-
- * backend/ebook/Makefile.am (libebookinclude_HEADERS): Also
- put addressbook.h here because several headers reference it.
-
-2002-07-08 Peter Williams <peterw@ximian.com>
-
- * backend/ebook/e-book.h: Normalize includes to <ebook/foo.h>, so
- that the installed headers will work sanely.
-
- * backend/ebook/e-card-cursor.h:
- * backend/ebook/e-book-view.h:
- * backend/ebook/e-card-simple.h:
- * backend/ebook/e-card.h:
- * backend/ebook/e-destination.h: Same.
-
- * printing/Makefile.am (INCLUDES): add -Iaddressbook/backend
- to access the ebook headers. Also the builddir version to get
- the generated addressbook.h
-
- * conduit/Makefile.am (INCLUDES): Same.
-
- * gui/widgets/Makefile.am (INCLUDES): Same builddir fix.
-
- * gui/merging/e-card-merging.c: Fix an ebook #include.
-
- * gui/merging/Makefile.am (INCLUDES): Same idea.
-
- * gui/contact-list-editor/Makefile.am (INCLUDES): Same.
-
- * gui/contact-editor/Makefile.am (INCLUDES): Same builddir
- change.
-
-2002-07-10 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-storage.c (load_source_data): Pass
- zero as the @sorting_priority to evolution_storage_new_folder().
- (addressbook_storage_add_source): Likewise.
-
-2002-07-10 Chris Toshok <toshok@ximian.com>
-
- * backend/idl/addressbook.idl: add Book.getCompletionView.
-
- * backend/ebook/e-book.c (e_book_get_completion_view): new
- function, basically c&p of e_book_get_book_view, but call
- getCompletionView.
-
- * backend/ebook/e-book.h: add prototype for
- e_book_get_completion_view.
-
- * backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_process_client_requests): add a
- GetCompletionView case here that just calls the same code as
- GetBookView (since we don't build summaries for the ldap backend.)
-
- * backend/pas/pas-backend-file.c (do_summary_query): add
- @completion_search. If it's TRUE, just create the vcards from the
- summary using pas_backend_summary_get_summary_vcard instead of
- looking them up from the db.
- (pas_backend_file_search): add @completion_search and pass it on
- to do_summary_query.
- (pas_backend_file_process_get_book_view): pass FALSE to
- pas_backend_file_search.
- (pas_backend_file_process_get_completion_view): new function,
- basically c&p pas_backend_file_process_get_book_view, but pass
- TRUE to pas_backend_file_search.
- (pas_backend_file_process_client_requests): add a case for
- GetCompletionView.
- (pas_backend_file_load_uri): track the change to the summary api -
- create the summary filename
-
- * backend/pas/pas-book.c (pas_book_queue_get_completion_view): new
- function, queue a GetCompletionView request to our queue.
- (impl_GNOME_Evolution_Addressbook_Book_getCompletionView): new
- function, call pas_book_queue_get_completion_view.
- (pas_book_respond_get_completion_view): new function, just call
- notifyViewRequested.
- (pas_book_free_request): add a case for GetCompletionView.
- (pas_book_get_epv): fill in epv->getCompletionView.
-
- * backend/pas/pas-book.h: add a GetCompletionView PASOperation,
- and a new structure (PASGetCompletionViewRequest). Also, add
- get_completion_view to PASRequest.
-
- * backend/pas/pas-backend-summary.c (clear_items): remove the
- items from the hash table.
- (pas_backend_summary_new): db_path -> summary_path.
- (pas_backend_summary_destroy): db_.path -> summary_path, and
- destroy the hash table.
- (pas_backend_summary_init): db_path = summary_path, and initialize
- the id_to_item hashtable.
- (pas_backend_summary_load_header): handle the upgrading from
- version 1.0 to version 2.0 (the addition of an mtime field in the
- header)
- (pas_backend_summary_load_item): version 1.0 and 2.0 have the same
- format for items.
- (pas_backend_summary_open): new function. open the summary so we
- can load the header (and get the mtime).
- (pas_backend_summary_load): rework this a bit since the header has
- already been loaded, and also add the items to the hashtable.
- (pas_backend_summary_add_card): add the new item to the hashtable.
- (pas_backend_summary_remove_card): remove the item from the hash
- table.
- (pas_backend_summary_is_up_to_date): new function, chekc @t
- against the summary's mtime.
- (pas_backend_summary_get_summary_vcard): create a vcard from the
- fields we have in the summary.
-
- * backend/pas/pas-backend-summary.h: add prorotypes for
- pas_backend_summary_is_up_to_date and
- pas_backend_summary_get_summary_vcard.
-
-2002-07-09 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-storage.c (load_source_data): Pass
- NULL @custom_icon_name to evolution_storage_new_folder().
- (addressbook_storage_add_source): Likewise. [Note we could be
- passing a nice custom here. ;-)]
-
-2002-07-02 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c (add_creatable_item): New
- arg @tooltip; pass it to
- evolution_shell_component_add_user_creatable_item() [which now has
- a @tooltip arg].
-
-2002-06-29 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/Makefile.am (libpas_a_SOURCES): add
- pas-backend-summary.[ch].
-
- * backend/pas/pas-backend-file.c (string_to_dbt): move this to the
- top of the file so it can be used in..
- (build_summary): loop over the db, adding cards ot the summary.
- (do_summary_query): call pas_backend_summary_search and loop over
- the returned id's looking them up in the db.
- (pas_backend_file_search): call
- pas_backend_summary_is_summary_query, and either call
- do_summary_query if it's a query over just the set of attributes
- in the summary or use the old, slow method if not.
- (pas_backend_file_process_create_card): call
- pas_backend_summary_add_card.
- (pas_backend_file_process_remove_card): call
- pas_backend_summary_remove_card.
- (pas_backend_file_process_modify_card): call remove_card/add_card.
- (pas_backend_file_load_uri): try to load the summary file, and if
- it doesn't exist create it.
- (pas_backend_file_destroy): unref the summary.
-
- * backend/pas/pas-backend-summary.[ch]: new files, reading and
- writing (and querying) summaries.
-
-2002-06-27 Sean Atkinson <sean@cantab.net>
-
- * gui/component/addressbook-config.c (query_for_supported_bases):
- don't unref selection_model (otherwise 3 clicks of
- "Show Supported Bases" crashes if LDAP server isn't running).
-
-2002-06-25 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c (create_component):
- reorder the adding of creatable items so the default is a new
- contact, not a new contact list.
-
-2002-06-21 Sean Atkinson <sean@cantab.net>
-
- * gui/component/addressbook-config.c (addressbook_edit_server_dialog):
- remove source argument (get it from the dialog).
- (edit_source_clicked): same.
- (sources_table_double_click): added to edit server by double-clicking.
- (ldap_dialog_new): use sources_table_double_click.
-
-2002-06-17 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (e_addressbook_view_save_as):
- pass NULL to e_contact_list_save_as. modality sucks. fixes
- broken build.
- (save_as): same.
-
-2002-06-15 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #26130 ]
- * gui/contact-editor/e-contact-editor.c (file_save_as_cb): pass
- ce->app as parent_window.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (file_save_as_cb): same .
-
- * gui/contact-editor/e-contact-save-as.c (e_contact_list_save_as):
- if a parent_window is specified, the file selector should be
- modal/transient for that window.
- (e_contact_save_as): same.
-
- * gui/contact-editor/e-contact-save-as.h: track prototype changes
- (addition of GtkWindow *parent_window to both calls.)
-
-2002-06-15 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_connect): use
- ldap_unbind_ext.
- (create_card_handler): don't leak the new vcard.
- (pas_backend_ldap_process_authenticate_user): don't leak the dn.
-
-2002-06-14 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-file.c (pas_backend_file_search): up the
- max threshold to 3000 cards from 1000 cards.. seems to improve
- performance a bit. also remove the g_list_reverse since it
- doesn't matter what order the cards arrive to the gui.
- (pas_backend_file_changes): plug memory leaks.
-
-2002-06-14 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-compare.c (compare_email_addresses): Made
- "" compare as not equal to "" for addresses.
- (use_common_book_cb): Don't bother checking for nickname here
- since we don't use it as a match later. Don't add "" as an
- address to the list of query parts.
-
-2002-06-13 Christopher James Lahey <clahey@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (enable_writable_fields):
- Don't enable fields if the editor isn't editable and the
- widget_field_mappings lists this field as being desensitize for
- read only.
-
-2002-06-11 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #17332 ]
- * backend/ebook/e-book.c (e_book_get_static_capabilities): we
- shouldn't ever return NULL here. in error cases we need to return
- g_strdup("");
-
-2002-06-11 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-minicard-view.c (e_minicard_view_event): Made
- double clicking on read only folders not do anything.
-
-2002-06-10 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-book-util.c (e_book_expand_uri): Made expand_uri
- a bit more robust and readable.
- (e_book_get_default_book_uri): Made e_book_get_default_book_uri
- use e_book_expand_uri if using the bonobo_config value.
-
- * gui/component/e-address-popup.c (start_query): Handle the
- failure state here by acting as if there are no matches.
-
-2002-06-05 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-minicard.c (e_minicard_event): Call
- e_minicard_selected in the GDK_BUTTON_RELEASE case here.
- (e_minicard_drag_begin): Set E_REFLOW (parent)->maybe_in_drag =
- FALSE if it's an EReflow.
-
-2002-06-04 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_book_ready): Commented out this unused
- function.
-
- * gui/component/select-names/e-select-names-manager.c
- (open_book_cb): Ref if we're keeping the book. Don't unref if
- we're not keeping the book.
- (clean_cb): Commented out this unused function.
-
-2002-06-04 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (init_collection): Set the
- title of our GalVIewCollection.
-
-2002-05-29 Anna Marie Dirks <anna@ximian.com>
-
- * gui/component/select-names/select-names.glade: Changed some spacing
- and expanding behavior to make this dialog behave more like I intended
- to.
-
-2002-05-24 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-config.c (CONFIG_CONTROL_FACTORY_ID):
- put this back in, accidentally got snipped with the hacking going
- on in here.
-
-2002-05-24 Chris Toshok <toshok@ximian.com>
-
- [ part of #25047 ]
- * gui/component/addressbook-config.c: remove the autocompletion
- config control from here, as it lives in the shell now.
-
- * gui/component/GNOME_Evolution_Addressbook.oaf.in: same.
-
-2002-05-24 Chris Toshok <toshok@ximian.com>
-
- [ #24189 ]
- * gui/component/select-names/e-select-names-manager.c
- (focus_out_cb): ifdef out the body of this because it only works
- with a single completion book. not sure what to do here, but it
- doesn't impact most usage scenarios.
- (completion_popup_cb): same.
- (e_select_names_manager_entry_new): add the books that have been
- loaded successfully by the time this entry is created.
- (open_book_cb): add the opened book to the entries that have
- already been created, and store it in our list so that entries
- that are created in the future can catch up.
- (read_completion_books_from_db): slurp in the folder list from the
- config db and load all the uris.
- (uris_listener): listener function - when there's a change it
- calls _clear_books on all the created entries, and clears our
- list. It then re-reads the books from the db.
- (e_select_names_manager_new): create our bonobo listener and call
- read_completion_books_from_db.
- (e_select_names_manager_init): init completion_books.
- (e_select_names_manager_destroy): free our list of
- completion_books.
-
- * gui/component/select-names/e-select-names-manager.h: switch from
- a single EBook to a GList of completion_books here.
-
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_add_book): deal with the case where
- there's an active query (by effectively restarting it.) This is
- quite a contrived edge case.
- (e_select_names_completion_clear_books): stop the current query
- and clear our list of books.
- (e_select_names_completion_new): track change to prototype, and
- axe the majority of this method since an EBook* isn't passed
- anymore.
- (e_select_names_completion_clear_book_data): split this code out
- from the destroy method so it can be called from _clear_books.
-
- * gui/component/select-names/e-select-names-completion.h: the
- constructor no longer takes an EBook -- pass in as many as you
- want using _add_book. Also, add prototype for _clear_books.
-
- * gui/component/addressbook.c (load_uri_cb): when
- storing/retrieving passwords, use the cleaned (without params)
- version of the uri, so changing things like download limit don't
- cause the user to be prompted for a password again.
-
- * gui/component/addressbook-component.c
- (ensure_completion_uris_exist): new function - probably doesn't
- belong in this file. Make sure the basic local Contacts folder
- exists in the completion uris.
- (addressbook_component_factory_init): call
- ensure_completion_uris_exist.
-
- * backend/ebook/e-book-util.h: add prototype for
- e_book_get_default_book_uri.
-
- * backend/ebook/e-book-util.c (e_book_get_default_book_uri): new
- function, just return the default contacts uri.
- (e_book_load_default_book): change
- to use e_book_get_default_book_uri.
-
-2002-05-23 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-config.c (addressbook_root_dse_query):
- fix parameter/local variable overloading.
-
-2002-05-21 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook.c (load_uri_cb): Don't try to invoke
- e_book_get_uri() on NULL. Fixes #25069.
-
-2002-05-17 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-util.c (e_addressbook_error_dialog):
- make sure we map status -> string correctly (add missing strings).
-
- * backend/ebook/e-book-types.h (EBookStatus): add the missing
- AUTHENTICATION_REQUIRED status code, to map to the idl response.
-
- * backend/ebook/e-book-listener.c
- (e_book_listener_convert_status): make sure we map all idl status
- codes to EBookStatus statuses.
-
-2002-05-20 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-storage.c (load_source_data): Pass
- FALSE for @sync_offline to evolution_storage_new_folder().
- (addressbook_storage_add_source): Pass FALSE for @sync_offline to
- evolution_storage_new_folder().
-
-2002-05-16 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c (request_quit): New, quit
- handler for the EvolutionShellComponent.
- (add_creatable_item): Set it up.
-
- * gui/contact-editor/e-contact-list-editor.c
- (e_contact_list_editor_request_close_all): New.
- (e_contact_list_editor_new): Put the contact editor in a static
- list and gtk_object_weakref() it.
- (contact_list_editor_destroy_notify): New, GtkDestroyNotify
- function for the contact editors.
-
- * gui/contact-editor/e-contact-editor.c
- (e_contact_editor_request_close_all): New.
- (e_contact_editor_new): Put the contact editor in a static list
- and gtk_object_weakref() it.
- (contact_editor_destroy_notify): New, GtkDestroyNotify function
- for the contact editors.
-
-2002-05-15 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c (create_component): Pass
- NULL as @request_quit_fn.
-
-2002-05-13 Christopher James Lahey <clahey@ximian.com>
-
- * backend/idl/addressbook.idl: Removed an incorrect comment here.
-
-2002-05-13 Christopher James Lahey <clahey@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (enable_writable_fields):
- Enable the dropdown widgets even if the contact is not editable so
- that you can view any email address, phone number, or postal
- address on read only contacts.
-
-2002-05-10 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/Evolution-Addressbook-SelectNames.idl:
- Added SimpleCard interface.
-
- * gui/component/select-names/Makefile.am: Added
- e-simple-card-bonobo.c and e-simple-card-bonobo.h.
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_get_property_fn): Added SIMPLE_CARD_LIST arg.
-
- * gui/component/select-names/e-simple-card-bonobo.c,
- gui/component/select-names/e-simple-card-bonobo.h: New class to
- represent an ECardSimple across Bonobo.
-
-2002-05-09 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_get_property_fn): Added "first_email" property.
-
-2002-05-09 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-storage.c
- (addressbook_get_other_contact_storage): Pass %FALSE as
- @has_shared_folders to evolution_storage_new().
-
-2002-05-08 JP Rosevear <jpr@ximian.com>
-
- * conduit/Makefile.am: link against the libtool version of
- libversit
-
-2002-05-07 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-config.c
- (addressbook_config_control_new): oops, add the NULL back at the
- end of possible_types.
-
-2002-05-07 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-config.c (addressbook_ldap_init):
- bleah, need to pass the GtkWindow here so we can pop up the a
- modal parented dialog (gtk modal dialogs suck?).
- (addressbook_ldap_auth): same.
- (addressbook_root_dse_query): same.
- (do_ldap_root_dse_query): same.
- (addressbook_config_control_new): add "ldap-contacts" to the list
- of possible types.
-
-2002-05-07 Dan Winship <danw@ximian.com>
-
- * gui/component/addressbook-storage.c (create_ldap_folder):
- s/ldap_config/addressbook_config/
-
-2002-05-03 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book.c (activate_factories_for_uri): finally
- remove the #if 0's and use the oaf query stuff to get backends
- that handle specific protocols.
-
-2002-05-03 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/addressbook-config.c
- (addressbook_folder_list_changed_callback): Call
- evolution_config_control_changed when the EFolderList changes.
-
-2002-05-03 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/GNOME_Evolution_Addressbook.oaf.in: Updated this
- to have the ConfigControlFactory have an addressbookwide generic
- name and added OAFIID:GNOME_Evolution_Addressbook_ConfigControl.
-
- * gui/component/Makefile.am (evolution_addressbook_SOURCES),
- gui/component/addressbook-component.c,
- gui/component/addressbook-storage.c, gui/component/addressbook.c:
- Replaced ldap-config.c and ldap-config.h with addressbook-config.c
- andaddressbook-config.h.
-
- * gui/component/addressbook-config.c,
- gui/component/addressbook-config.h: Based on ldap-config.c and
- ldap-config.h. Added a folder list control. Made this a multi
- factory.
-
- * gui/component/ldap-config.c, gui/component/ldap-config.h:
- Replaced these with addressbook-config.c and addressbook-config.h.
-
-2002-05-02 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.c (selection_change):
- Desensitize the to, cc, and bcc buttons if there's no selection
- here. Fixes Ximian bug #21482.
-
-2002-05-01 Christopher James Lahey <clahey@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c (verbs): Changed
- some of these to bind to the ContactListEditor verbs since they're
- marked as that in the ui file. Fixes Ximian bug #13034.
-
-2002-04-30 JP Rosevear <jpr@ximian.com>
-
- * gui/component/Makefile.am (EXTRA_DIST): fix
-
-2002-04-30 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-model.c,
- gui/widgets/e-addressbook-model.h
- (e_addressbook_model_peek_card): Added this function so that there
- would be less duplication of cards during run time when
- duplication is unnecessary.
-
- * gui/widgets/e-addressbook-view.c: Cleaned up get_card_list and a
- number of associated functions to be much more uniform and
- simpler.
- (get_has_email_address): Don't show the "Send Message to Contact"
- menu item if there are no email addresses in the listed contacts.
- Fixes bug #1298.
-
-2002-04-30 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card.c (e_card_list_send): Changed this to set a
- subject when sending a contact. This makes the signature be set
- properly also.
-
-2002-04-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * printing/Makefile.am: Don't link to libibex anymore.
-
- * conduit/Makefile.am: Same.
-
- * backend/ebook/Makefile.am: Again here.
-
- * gui/component/Makefile.am: And finally here.
-
-2002-04-26 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_child_free): Unref the text_model here instead of
- the model, since the model never gets set. Removed the model
- field since it's no longer used.
-
-2002-04-24 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/ldap-config.c: Updated this for the new
- e_table_memory_store_insert function prototype.
-
-2002-04-24 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.c,
- gui/component/select-names/e-select-names.h,
- gui/component/select-names/select-names.glade (folder_browse):
- Added a "Browse..." button to switch to a different addressbook
- folder.
-
- * gui/widgets/e-addressbook-util.c (e_addressbook_transfer_cards):
- Moved extern EvolutionShellClient out of this function so that
- it'd be more readable.
-
-2002-04-23 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.c,
- gui/component/select-names/e-select-names.h: Coded handling of the
- select_entry to search within the displayed contacts.
-
- * gui/component/select-names/select-names.glade: Updated this
- dialog to have an entry-select instead of an entry-find.
-
-2002-04-23 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/select-names.glade: Updated this
- dialog to match the redesign.
-
-2002-04-23 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (do_popup_menu): Make unused
- menu items disappear instead of graying out.
-
-2002-04-23 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-reflow-adapter.c,
- gui/widgets/e-addressbook-reflow-adapter.h: Removed
- e_addressbook_reflow_adapter_right_click and
- e_addressbook_reflow_adapter_base_right_click.
-
- * gui/widgets/e-addressbook-view.c: Handle right click menu for
- both types of view. Merged right click on white space with right
- click on main area. General clean up.
-
- * gui/widgets/e-minicard-view-widget.c,
- gui/widgets/e-minicard-view-widget.h: Removed a couple unnecessary
- functions. Added e_minicard_view_widget_get_view. Added
- right_click signal.
-
- * gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h:
- Added the right_click signal and the e_minicard_view_get_card_list
- function.
-
-2002-04-22 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.h: Removed an unused
- variable here.
-
- * gui/widgets/e-addressbook-view.c (table_right_click,
- table_white_space_event): Added a current view submenu to the
- popup menu here.
-
-2002-04-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/widgets/e-minicard-view.c (e_minicard_view_drag_begin):
- Allow GDK_ACTION_COPY also, since the composer for example does
- not accept MOVE's. Completes bug #8448.
-
-2002-04-18 Chris Toshok <toshok@ximian.com>
-
- * gui/component/ldap-config.glade: change order of scope option
- menu to match how it's stored.
-
-2002-04-18 Chris Toshok <toshok@ximian.com>
-
- * gui/component/GNOME_Evolution_Addressbook.oaf.in: change ldap
- config control text so it fits in the config dialog.
-
- * gui/component/ldap-config.c: #ifdef lots of stuff HAVE_LDAP so
- it'll build/run in either case.
- (addressbook_source_dialog_destroy): rename
- addressbook_add_server_druid_destroy to this, and free lots more
- stuff.
- (addressbook_add_server_druid):
- addressbook_add_server_druid_destroy ->
- addressbook_source_dialog_destroy.
- (do_schema_query): add 3 second timeout to schema query.
- (addressbook_edit_server_dialog): hook up destroy signal.
- (config_control_new): if HAVE_LDAP isn't defined, put up a label
- saying so.
-
-2002-04-18 Chris Toshok <toshok@ximian.com>
-
- * gui/component/Makefile.am (INCLUDES): add LDAP_CFLAGS to INCLUDES
-
-2002-04-18 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (book_open_cb): no more
- source->type.
-
-2002-04-18 Chris Toshok <toshok@ximian.com>
-
- * gui/component/ldap-config.c (addressbook_dialog_get_source):
- fill in source->ssl.
- (addressbook_source_dialog_set_source): set up auth/scope/ssl
- option menus properly.
-
- * gui/component/addressbook-storage.c
- (addressbook_storage_init_source_uri): always include the
- limit/ssl in the uri so we don't need to rely on defaults
- everywhere.
- (ldap_source_foreach): store the ssl option.
-
- * gui/component/addressbook-storage.h: reorder SSLType to match
- the UI.
-
- * backend/pas/pas-backend-ldap.c: (struct _PASBackendLDAPPrivate)
- add field for ldap_timeout.
- (pas_backend_ldap_connect): reorder things a bit - we need to
- start tls before the root dse query, if we can.
- (pas_backend_ldap_load_uri): track the way ssl parameters are
- given in the uri, and parse out the timeout.
-
- * gui/component/ldap-config.c (port_changed_func): use the
- symbolic SSL name instead of an integer constant.
-
-2002-04-18 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (get_ldap_library_info): fix
- memory leaks.
-
- * gui/component/GNOME_Evolution_Addressbook.oaf.in: remove the
- Addressbook_ConfigControl stuff to LDAP_ConfigControl.
-
- * gui/component/Makefile.am (evolution_addressbook_SOURCES):
- remove addressbook-config.* and add ldap-config.*
- (glade_DATA): same.
- (evolution_addressbook_LDADD): add LDAP_LIBS.
-
- * gui/component/addressbook-component.c (owner_set_cb):
- addressbook_config_register_factory =>
- ldap_config_register_factory.
-
- * gui/component/addressbook.c (book_open_cb): remove source->type
- check - they're always LDAP.
- (load_uri_cb): same.
-
- * gui/component/addressbook-storage.c (ldap_unparse_ssl): new
- function.
- (ldap_parse_ssl): new function.
- (addressbook_storage_init_source_uri): use a more flexible scheme
- to build up the uri's, and add in the ssl parameter.
- (load_source_data): fill in source->ssl, and remove source->type
- assignment.
- (addressbook_source_copy): copy source->ssl, and remove
- source->type copy.
- (create_ldap_folder): addressbook_create_new_source =>
- ldap_config_create_new_source.
-
- * gui/component/addressbook-storage.h: remove
- AddressbookSourceType (it was always LDAP), and add
- AddressbookLDAPSSLType.
-
-2002-04-18 Dan Winship <danw@ximian.com>
-
- * backend/ebook/e-book-util.c (e_book_load_default_book): Append
- /addressbook.db to the end of the default URI if it starts with
- file:
-
- * backend/ebook/e-book.c (e_book_load_uri_step): Fix this to not
- loop forever if you have more than one backend.
-
-2002-04-17 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_create_categories): Changed this to use
- ECategoriesMasterListOptionMenu.
-
- * gui/component/select-names/e-select-names.c
- (section_right_click_cb),
- gui/widgets/e-addressbook-reflow-adapter.c,
- gui/widgets/e-addressbook-view.c: Updated these to match the new
- EPopupMenu.
-
-2002-04-11 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/addressbook-component.c: Include
- addressbook-config.h here as this file uses it.
-
- * gui/component/select-names/e-select-names.c (SPEC, SPEC2): Made
- this dialog searchable by typing in the ETable.
-
- * gui/widgets/e-addressbook-model.c: Include e-addressbook-util.h
- here.
-
- * gui/widgets/e-addressbook-reflow-adapter.c
- (e_addressbook_reflow_adapter_right_click),
- gui/widgets/e-addressbook-view.c (table_right_click): Fixed a
- memory leak here by using "selection-done" signal.
-
- * gui/widgets/e-addressbook-reflow-adapter.c,
- gui/widgets/e-addressbook-reflow-adapter.h,
- gui/widgets/e-addressbook-view.c, gui/widgets/e-minicard-view.c:
- Added a right click menu for areas that aren't cards.
-
-2002-04-09 Dan Winship <danw@ximian.com>
-
- * backend/ebook/e-book-util.c (e_book_load_default_book): Update
- for new-and-improved consistent default folder uri.
-
- * gui/component/addressbook.c (addressbook_load_default_book): Use
- e_book_load_default_book rather than duplicating most of its logic
- here.
- (load_uri_cb): Modify to work as a callback for
- addressbook_load_default_book as well as addressbook_load_uri.
-
-2002-04-08 Dan Winship <danw@ximian.com>
-
- * gui/component/addressbook-component.c (create_view): Add
- view_info arg, but don't do anything with it.
-
-2002-04-06 JP Rosevear <jpr@ximian.com>
-
- * gui/component/GNOME_Evolution_Addressbook.oaf.in: add
- config_item:type
-
-2002-04-04 JP Rosevear <jpr@ximian.com>
-
- * conduit/Makefile.am: link to the static libversit
-
-2002-04-04 Dan Winship <danw@ximian.com>
-
- * gui/widgets/e-addressbook-util.c (e_addressbook_transfer_cards):
- Update for evolution_shell_client_user_select_folder API change.
-
-2002-04-04 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook.c: Remove AddressbookConfig,
- ContactNew, ContactNewList EPixmap entries.
-
- * gui/component/addressbook-factory.c (main): Print out a
- debugging message just before the main loop starts, for debugging
- purposes.
-
-2002-04-02 Dan Winship <danw@ximian.com>
-
- * backend/ebook/e-card-simple.h: Fix spelling of
- E_CARD_SIMPLE_PHONE_ID_TTYTDD and E_CARD_SIMPLE_FIELD_PHONE_TTYTDD
- (they previously ended with "TTD" instead of "TDD")
-
- * backend/ebook/e-card-simple.c: Update for spelling fix.
-
- * backend/pas/pas-backend-ldap.c: Likewise
-
-2002-04-01 Dan Winship <danw@ximian.com>
-
- * gui/component/select-names/e-select-names-text-model.c:
- parent_class should be static. (From Max Horn <max@quendi.de>)
-
-2002-03-29 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/GNOME_Evolution_Addressbook.oaf.in: Add priority
- for the config page. Renamed to "Directory Servers".
-
-2002-03-27 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_process_create_card): don't free req->vcard.
- it's freed in pas_book_free_request.
- (pas_backend_file_process_remove_card): don't free req->id for the
- same reason.
- (pas_backend_file_process_modify_card): don't free req->vcard for
- the same reason.
- (pas_backend_file_process_get_changes): don't free req->change_id
- or release_unref the listener for the same reason.
-
-2002-03-27 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (check_schema_support): make sure
- to call ldap_value_free (values);, and ldap_msgfree (resp).
- (get_ldap_library_info): don't ask me why, but it appears we have
- to free each extension char*.
- (query_ldap_root_dse): make sure to free values in the
- subschemaSubentry code before overwriting it, and call
- ldap_msgfree(resp) when we're all done.
- (build_card_from_entry): don't leak the DN, ldap attributes, or
- the berval the ldap_*_attribute calls use to step through the
- attributes. the docs say this berval is freed when
- ldap_next_attribute returns NULL, but if we don't free it it leaks
- a substantial amount of memory.
- (pas_backend_ldap_search): make sure to only allocate *op once,
- and fix the g_warning since op isn't valid in its scope anymore.
-
-2002-03-19 Dan Winship <danw@ximian.com>
-
- * backend/ebook/Makefile.am: Update for libversit change: Use .a
- rather than .la now.
-
- * printing/Makefile.am: Likewise
-
- * gui/component/Makefile.am: Likewise
-
-2002-03-18 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook.c (addressbook_menu_activated):
- Removed.
- (addressbook_factory_new_control): Don't connect anymore, as this
- signal has been removed from the ESearchBar.
- (addressbook_factory_new_control): No more custom menu items here.
-
-2002-03-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (table_right_click): Update to
- use new EPopupMenu API.
-
- * gui/widgets/e-addressbook-reflow-adapter.c
- (e_addressbook_reflow_adapter_right_click): Update to use new
- EPopupMenu API.
-
- * gui/component/select-names/e-select-names.c
- (section_right_click_cb): Update to match new EPopupMenu api.
-
-2002-03-15 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook.c: Remove the
- `addressbook_search_menu_items'.
- (addressbook_menu_activated): Removed.
- (addressbook_factory_new_control): Don't connect. No menu items.
-
-2002-03-15 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook.c (control_activate): Call
- `e_search_bar_set_ui_component()' to set the BonoboUIComponent for
- the search bar.
-
- * gui/component/GNOME_Evolution_Addressbook.oaf.in: Add an icon
- for the LDAP sources configuration control.
-
-2002-03-12 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook.c: Remove verb "AddressbookConfig".
- (config_cb): Removed.
-
- * gui/component/addressbook-config.c: Remove `dialog' member from
- `AddresbookDialog'. Instead, add a `config_control' member.
- (config_control_new): New.
- (addressbook_config): Removed.
- (addressbook_config_register_factory): New.
- (config_control_factory_fn): New, factory function for the
- ConfigControl page.
- (addressbook_source_edit_changed): Don't change the sensitivity of
- the dialog. Rather, invoke ::changed on the ConfigPage.
- (auth_checkbutton_changed): No need to manually change the
- sensitiviness of the buttons here either.
- (add_source_clicked): Likewise, just invoke
- evolution_config_control_changed().
- (edit_source_clicked): Likewise.
- (addressbook_dialog_close): Removed.
- (config_control_destroy_callback): New, callback for when the
- config control gets destroyed.
- (addressbook_dialog_apply): Removed.
- (config_control_apply_callback): New callback for
- EvolutionConfigControl::apply.
- (addressbook_dialog_ok): Removed.
- (addressbook_config_control_new): Set up ->config_control and
- connect the signals.
-
- * gui/component/addressbook-config.glade: Call the main hbox in
- the addressbook_sources dialog `addressbook_sources_main_hbox'.
-
- * gui/component/addressbook-component.c (owner_set_cb): Call
- `addresbook_config_register_factory'.
-
- * gui/component/GNOME_Evolution_Addressbook.oaf.in: Add items for
- OAFIID:GNOME_Evolution_Addresbook_ConfigControl and
- OAFIID:GNOME_Evolution_Addressbook_ConfigControlFactory.
-
-2002-03-11 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names.c (update_query):
- change contains x-evolution-any-field to beginswith on email,
- full_name, and nickname. faster, and more applicable to this
- dialog.
-
-2002-03-09 Chris Toshok <toshok@ximian.com>
-
- * backend/idl/addressbook.idl: add TLSNotAvailable to
- BookLister_CallStatus.
-
- * backend/ebook/e-book-types.h: add TLS_NOT_AVAILABLE to the EBookStatus enum.
-
- * backend/ebook/e-book-listener.c
- (e_book_listener_convert_status): add TLS_NOT_AVAILABLE to the
- switch.
-
- * backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_get_static_capabilities): fix name.
- (pas_backend_ldap_class_init): fix name.
- (pas_backend_ldap_connect): change return type to CallStatus so we
- can return different errors from here. Also, do STARTTLS if the
- user has asked for it and the connection supports it, returning
- TLSNotAvailable (and close the connection) if they chose to
- require it.
- (pas_backend_ldap_load_uri): return pas_backend_ldap_connect.
- (func_beginswith): pull in change from evolution-1-0-branch to
- make full_name beginswith search both cn and sn.
-
-2002-03-09 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (jump_to_letter): since I've
- gone ahead and made the file backend (by way of
- pas-backend-card-sexp.c) use case insensitive searches for
- beginswith, there's no need to list upper and lower case here.
-
- * gui/component/addressbook.c (addressbook_search_option_items):
- reorder things to put "Any field contains" at the end, since it's
- the least efficient search. Also reorder the enum to the same
- ordering. Change "Name contains" to "Name begins with" and change
- "Email contains" to "Email is".
- (addressbook_search_activated): change FULL_NAME to beginswith,
- and change EMAIL to is to match the labels.
-
- * backend/pas/pas-backend-card-sexp.c (compare_name): new
- function, so we can compare both full and family names (so
- beginswith can operate on them both.)
- (endswith_helper): use e_utf8_strstrcase here, since all the
- backends backends use case insensitive searching.
- (func_endswith): same.
-
-2002-03-06 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-book.c (pas_book_queue_create_card): track
- union/struct change.
- (pas_book_queue_remove_card): same.
- (pas_book_queue_modify_card): same.
- (pas_book_queue_get_cursor): same.
- (pas_book_queue_get_vcard): same.
- (pas_book_queue_authenticate_user): same.
- (pas_book_queue_get_book_view): same.
- (pas_book_queue_get_changes): same.
- (pas_book_free_request): new function - free everything we need to
- for each type of request.
- (pas_book_destroy): call pas_book_free_request here instead of
- just freeing 3 elements of the old struct. yay plugging memleaks.
-
- * backend/pas/pas-book.h: make PASRequest a union and split out
- members into structs, so it's a little clearer which fields are
- used by which requests. Also, add prototype for
- pas_book_free_request so backends can just free everything at once
- (usually in their requests_queued signal func.)
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_process_create_card): track struct/union change.
- (pas_backend_file_process_remove_card): same.
- (pas_backend_file_process_modify_card): same.
- (pas_backend_file_build_cards_list): same.
- (pas_backend_file_process_get_vcard): same.
- (pas_backend_file_process_get_cursor): same.
- (pas_backend_file_process_get_book_view): same.
- (pas_backend_file_process_get_changes): same.
- (pas_backend_file_process_check_connection): same.
- (pas_backend_file_process_authenticate_user): same.
- (pas_backend_file_process_get_supported_fields): same.
- (pas_backend_file_process_client_requests): case the union to the
- specific struct and pass it to the process_* functions. also,
- call pas_book_free_request here, instead of relying on each of the
- functions to free their stuff.
-
-2002-03-07 Dan Winship <danw@ximian.com>
-
- * gui/component/addressbook-storage.c
- (addressbook_get_other_contact_storage): Update for
- evolution_storage_new() change.
-
-2002-03-05 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard-view-widget.c
- (e_minicard_view_widget_realize): don't set "editable" here, as
- the way things work the backend isn't able to override a setting
- from the UI, so writable books never show up as writable.
-
-2002-03-04 Chris Toshok <toshok@ximian.com>
-
- [fixes bug #20871]
- * gui/component/select-names/select-names.glade: add the
- status-message label.
-
- * gui/component/select-names/e-select-names.h (struct
- _ESelectNames): add status_message field.
-
- * gui/component/select-names/e-select-names.c (status_message):
- new function, set the label's text from the message.
- (e_select_names_init): get the status-message label, and if it's
- valid, connect to the status_message signal of the
- EAddressbookModel.
-
-2002-02-28 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_search): don't
- ref the view here, since it keeps the view alive until the search
- is over, which we don't want. we want the view's death to cancel
- the search. This speeds up starting new searches after one is
- already active (since switching searches actually creates a new
- book view and destroys the old one.)
- (ldap_search_dtor): remove the matching unref here. The unref as
- it was was incorrect anyway, and caused a crash (we needed
- search_op->view, not op->view.)
-
-2002-02-27 Chris Toshok <toshok@ximian.com>
-
- [fixes bug #20690]
- * backend/pas/pas-backend-ldap.c (func_and): the data arg is not
- GList** anymore, it's PASBackendLDAPSExpData*, so use
- ldap_data->list instead of *list.
- (func_or): same.
- (func_not): same.
- (func_contains): same.
- (func_is): same.
- (func_endswith): same.
- (func_beginswith): same, but also special case the beginswith
- "fileAs" query type (the one used by the alphabet buttons on the
- right hand side, so we can deal with entries that don't have
- fileAs attributes, and return meaningful responses.)
- (pas_backend_ldap_build_query): initialize the
- PASBackendLDAPSExpData struct and pass that instead of &list.
- Also, take the PASBackendLDAP arg to add to the struct in case we
- need it at some point in the future.
- (ldap_search_handler): pass in the PASBackendLDAP.
-
-2002-02-26 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-file.c (pas_backend_file_search): move
- card_count++ inside the if that checks to see if a card matches
- (and adds the card to the list).
-
-2002-02-24 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (addressbook_query_changed): only
- handle the ESB_ADVANCED case here now. the actual query work is
- done in addressbook_search_activated.
- (addressbook_search_activated): split out all the searching
- functionality here.
- (addressbook_factory_new_control): hook up "search_activated" to
- addressbook_search_activated.
-
-2002-02-24 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-config.c
- (addressbook_source_dialog_set_source): make the right auth page
- start up open.
-
- * gui/component/addressbook-storage.c (addressbook_source_free):
- free the binddn.
- (addressbook_source_copy): copy the binddn;
-
-2002-02-22 Chris Toshok <toshok@ximian.com>
-
- [ Fixes bugs 20740, 16680, and god knows what else :) ]
- * gui/widgets/e-addressbook-model.c (create_card): double the
- allocated size every time we need more space instead of using a
- fixed size increment. this helps huge queries. Also, remove the
- gtk_object_get of "file_as", as it was dead code.
- (book_view_loaded): handle errors here (by popping up a dialog).
-
- * backend/pas/pas-backend-ldap.c (view_destroy): search_idle ->
- search_timeout.
- (build_card_from_entry): comment out some spew, and unref ecard
- when we're done to plug a memory leak.
- (send_pending_adds): send along to the client all the cards we've
- been saving up.
- (poll_ldap): use a timeout for ldap_result to keep the backend
- from blocking (and it turns out keep the frontend from hanging
- waiting on a ref to complete) on large db's with few matches.
-
- Also, add some fairly smart, self-tuning aggregating of cards.
- Keep track of the number of cards we've sent the last time through
- as well as this time, and estimate the number we want to aggregate
- the next time based on them (we average them at the moment),
- subject to maximum/minimum number of cards. also, we have a
- maximum aggregation time, after which we force a flush if there
- are pending cards and recalculate our target pending number.
- there's a minimum wait time to possibly keep outselves from
- spamming the ui, although it's 0 at the moment.
-
- Lastly, make sure to only notify the GUI of status messages when
- we need to. this results in a *huge* savings.
- (ldap_search_handler): initialize all the pending card stuff, and
- use a timeout instead of an idle function for poll_ldap.
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_queue_response): performance optimization
- for large adds. If we're a CardAddedEvent and there's an existing
- CardAddedEvent at the end of the queue, just concat the lists of
- cards together. This is to keep the gui from falling further and
- further behind the ldap backend, which is merrily spewing updates
- at the gui.
-
-2002-02-21 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/Makefile.am: Define $(iconsdir).
-
- * gui/component/addressbook-component.c (add_creatable_item): New
- helper function.
- (create_component): Add the icons for the user creatable items as
- well.
-
-2002-02-20 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-file.c (pas_backend_file_load_uri):
- track change to signature, and (for now) just change all the
- return FALSE's to _RepositoryOffline (what FALSE used to map to in
- pas_book_factory_process_request), and change TRUE to _Success.
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_load_uri):
- track change to signature, and differentiate between
- pas_backend_ldap_connect failing (RepositoryOffline), and
- ldap_url_parse failing (OtherError).
-
- * backend/pas/pas-book-factory.c
- (pas_book_factory_process_request): since pas_backend_load_uri
- returns status now, use it to nodify the BookListener if there's a
- failure.
-
- * backend/pas/pas-backend.c (pas_backend_load_uri): track change
- to signature.
-
- * backend/pas/pas-backend.h: change return type of
- pas_backend_load_uri to
- GNOME_Evolution_Addressbook_BookListener_CallStatus to allow
- differentiation between failure types.
-
- * backend/ebook/e-book-listener.c
- (e_book_listener_convert_status): handle _AUTHENTICATION_FAILED.
-
- * backend/ebook/e-book-types.h (EBookStatus): add
- _AUTHENTICATION_FAILED.
-
-2002-02-18 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-book-factory.c
- (pas_book_factory_process_request): if the load_uri fails, notify
- the listener that the repository is offline. (partial fix for bug
- 20347)
-
-2002-02-18 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (create_dn_from_ecard): escape
- commas in the dn, since they're used by ldap to specify the node's
- placement in the tree. (fixes bug 20089)
- (rfc2254_escape): just use sprintf and %02X instead.
-
-2002-02-13 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.c (set_book): Keep a
- ref of the model in this case as well.
-
-2002-02-13 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.c (set_book): Make
- sure to only set the query once when creating a new book and not
- at all on addressbook model creation. This prevents an accidental
- pair of changes from making the addressbook model load a remote
- addressbook.
-
- * gui/widgets/e-addressbook-model.c (get_view): If this is the
- first_get_view and the addressbook is remote, empty the view
- instead of leaving it in the state it used to be in. This only
- occurs if you set the book after the model has existed for a
- while.
- (e_addressbook_model_set_arg): When setting the book, set
- first_get_view to TRUE.
-
-2002-02-13 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (display_view): Attach to the
- emvw instead of the emv here.
-
- * gui/widgets/e-minicard-view-widget.c, e-minicard-view-widget.h:
- Made this object have a "column_width" argument and a
- "column_width_changed" signal which are a simple layer down to the
- EMinicardView contained within.
-
- * gui/widgets/gal-view-minicard.c, gui/widgets/gal-view-minicard.h
- (gal_view_minicard_attach): Made this attach to an
- EMinicardViewWidget instead of a EMinicardView.
-
-2002-02-13 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-book-util.c, backend/ebook/e-book-util.h
- (e_book_expand_uri, e_book_load_address_book_by_uri,
- e_book_use_address_book_by_uri): New functions that take a file://
- url ending in the directory name and automatically append the
- addressbook.db and do the appropriate thing.
-
- * backend/pas/pas-backend-card-sexp.c,
- backend/pas/pas-backend-card-sexp.h: Added copyright notice here.
-
- * gui/component/addressbook-component.c
- (destination_folder_handle_drop), gui/component/addressbook.c
- (set_prop): Use e_book_expand_uri instead of
- addressbook_expand_uri.
-
- * gui/component/addressbook-storage.c: Fixed the fcntl include
- here.
-
- * gui/component/addressbook.c (ContactsCopyToFolder,
- ContactsMoveToFolder): Added handlers for these two verbs.
-
- * gui/component/addressbook.h: Removed addressbook_expand_uri in
- favor of e_book_expand_uri.
-
- * gui/widgets/e-addressbook-reflow-adapter.c (transfer_cards):
- Added code to handle Move to and Copy to right click menu items.
-
- * gui/widgets/e-addressbook-util.c,
- gui/widgets/e-addressbook-util.h (e_addressbook_transfer_cards):
- New function to pop up a dialog and transfer a set of cards to the
- given folder.
-
- * gui/widgets/e-addressbook-view.c,
- gui/widgets/e-addressbook-view.h (display_view): Don't attach to
- the view if it doesn't exist yet. We have to make this then
- attach later.
- (e_addressbook_view_copy_to_folder,
- e_addressbook_view_move_to_folder): New functions utilizing
- e_addressbook_transfer_cards.
- (table_right_click): Add copy_to_folder and move_to_folder to the
- right click menu for tables here.
- (e_addressbook_view_discard_menus): Handle menu unmerging here.
-
- * gui/widgets/e-minicard-view-widget.h (struct
- _EMinicardViewWidget): Removed unused field.
-
-2002-02-13 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (display_view): Attach the
- GalViewMinicard to the EMinicardView here.
-
- * gui/widgets/gal-view-minicard.c, gui/widgets/gal-view-minicard.h
- (gal_view_minicard_load, gal_view_minicard_save): Made these save
- the column width of the view.
- (gal_view_minicard_attach, gal_view_minicard_detach): Added these
- functions to allow the GalViewMinicard to set the column width of
- a EMinicardView and to monitor its changes.
-
-2002-02-12 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-reflow-adapter.c
- (addressbook_get_arg): Added an argument to get the model.
-
- * gui/widgets/e-addressbook-view.c (writable_status): Don't bother
- connecting to the writable_status callback on the book, simply
- rely on the writable_status callback on the addressbook model.
-
- * gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h
- (set_empty_message): Handle the case of a read only view here.
-
-2002-02-07 JP Rosevear <jpr@ximian.com>
-
- * gui/component/addressbook-component.c (create_component): remove
- "New" from user creatable menu items
-
-2002-02-07 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-view.c,
- gui/widgets/e-addressbook-view.h
- (e_addressbook_view_setup_menus): Changed this function to use the
- new GalViewMenus which takes a GalViewInstance, instead of a
- GalViewCollection.
-
-2002-02-04 JP Rosevear <jpr@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (find_address_mailing): tidy
-
- * conduit/address-conduit.c (addrconduit_load_configuration): load
- default address setting
- (addrconduit_save_configuration): save default address setting
- (e_addr_gui_new): new gui routine for conduit settings
- (e_addr_gui_fill_widgets): ditto
- (e_addr_gui_fill_config): ditto
- (e_addr_gui_destroy): ditto
- (e_addr_context_destroy): destroy the gui and new_cfg
- (local_record_from_ecard): reinstate commented out bits, determine
- which address to sync to pilot
- (ecard_from_remote_record): determine which address to sync from
- pilot
- (fill_widgets): put the gui widgets in
- (create_settings_window): create gui
- (save_settings): fill gui
-
-2002-02-04 JP Rosevear <jpr@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (address_text_changed): if
- the shown address in the mailing address or there is no mailing
- address, set the default flag and make sure the button is checked
- (address_mailing_changed): set the flags properly when the mailing
- address changes
- (e_contact_editor_init): listen for the check button being toggled
- (find_address_mailing): find the address (if any) with the default
- flag
- (set_address_field): set the mailing address button appropriately
- (fill_in_info): find the mailing address
-
- * gui/contact-editor/e-contact-editor.h: add new class data member
-
- * gui/contact-editor/contact-editor.glade: show mailing address
- check button
-
-2002-02-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * backend/ebook/e-destination.c (e_destination_is_auto_recipient):
- New function to find out if a destination was one which was
- auto-matically set by Evolution.
- (e_destination_set_auto_recipient): Set whether or not the dest is
- an auto-recipient.
- (e_destination_touch): Don't touch the address if it is an
- auto_recipient.
- (e_destination_list_to_vector_sized): New function to avoid having
- to calculate the length of the list ourselves. Allows for a bit of
- optimization if our caller knows the length of the list.
- (e_destination_xml_encode): Encode the auto_recipient bit.
- (e_destination_xml_decode): Decode the auto_recipient bit.
-
-2002-02-01 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-simple.c (e_card_simple_sync_card): Made
- this preserve addressbook flags other than the first three.
-
- * backend/ebook/e-card-types.h: Added E_CARD_ADDR_MASK and
- E_CARD_ADDR_DEFAULT.
-
- * backend/ebook/e-card.c (get_address_flags): Added "PREF" to
- E_CARD_ADDR_DEFAULT mapping.
-
- * backend/ebook/test-client.c: Added #include "e-book-util.h".
-
-2002-01-30 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-file.c (pas_backend_file_changes):
- compute the change db filename based on our contact db filename.
- (pas_backend_file_load_uri): store the filename in
- bf->priv->filename.
- (pas_backend_file_destroy): free the filename, and (!) free
- bf->priv too.
-
-2002-01-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * backend/ebook/e-destination.c (e_destination_is_valid): Revert
- my previous change as trow says this will break auto-completion
- stuff.
-
-2002-01-27 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/contact-editor/Makefile.am: Use EVOLUTION_ADDRESSBOOK_CFLAGS.
- * gui/contact-list-editor/Makefile.am: Likewise.
- * gui/merging/Makefile.am: Likewise.
- * gui/search/Makefile.am: Likewise.
- * gui/component/select-names/Makefile.am: Likewise.
-
-2002-01-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * backend/ebook/e-destination.c (e_destination_is_valid): Don't
- check for an @ in the email address. This is to fix bug #10960.
-
-2002-01-24 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug 16097 ]
- * gui/component/addressbook-config.glade: gui love for the new
- auth stuff.
-
- * gui/component/addressbook.c (load_uri_cb): track change to auth,
- and offer up different prompt strings depending on which method
- (binddn or email) we're using.
-
- * gui/component/addressbook-storage.c (ldap_unparse_auth): use the
- new auth types for ldap.
- (ldap_parse_auth): same.
- (addressbook_storage_auth_type_to_string): new function.
- (load_source_data): get the binddn too.
- (ldap_source_foreach): store out binddn or emailaddr, depending on
- the auth type chosen.
-
- * gui/component/addressbook-storage.h: add the more detailed auth
- types, add "binddn" to the source structure, and add a prototype
- for addressbook_storage_auth_type_to_string.
-
- * gui/component/addressbook-config.c (auth_checkbutton_changed):
- set the auth stuff (in)sensitive.
- (auth_optionmenu_activated): new function.
- (addressbook_source_dialog_set_source): track UI change.
- (addressbook_source_dialog_get_source): same.
- (add_scope_activate_cb): rename add_activate_cb to this to
- distinguish it from the auth stuff.
- (add_auth_activate_cb): new function.
- (addressbook_source_dialog): track change to auth UI stuff.
- (addressbook_storage_auth_type_to_string): new function.
-
- * backend/ebook/e-book.h: add auth_method arg to
- e_book_authenticate_user.
-
- * backend/ebook/e-book.c (e_book_authenticate_user): track change
- to prototype - add auth_method arg, and pass it along to the CORBA
- call.
-
- * backend/ebook/test-client.c (book_open_cb): track api change -
- keep this building.
-
- * backend/pas/pas-book.h: add auth_method slot in PASRequest.
-
- * backend/pas/pas-book.c (pas_book_queue_authenticate_user): add
- auth_method arg and add it to the PASRequest.
- (impl_GNOME_Evolution_Addressbook_Book_authenticateUser): track
- idl change, add auth_method and pass it along to
- pas_book_queue_authenticate_user.
-
- * backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_process_authenticate_user): support both
- "ldap/simple-email" and "ldap/simple-binddn" auth methods.
-
- * backend/idl/addressbook.idl: add "in string authMethod" to
- authenticateUser.
-
-2002-01-24 Ettore Perazzoli <ettore@ximian.com>
-
- * conduit/Makefile.am: Use EVOLUTION_ADDRESSBOOK_CONDUIT_CFLAGS
- and EVOLUTION_ADDRESSBOOK_CONDUIT_LIBS and remove unused flags
-
- * gui/component/Makefile.am: Use EVOLUTION_ADDRESSBOOK_CFLAGS and
- EVOLUTION_ADDRESSBOOK_LIBS and remove unused flags.
- * backend/pas/Makefile.am: Likewise.
- * backend/ebook/Makefile.am: Likewise.
- * printing/Makefile.am: Likewise.
- * backend/ebook/Makefile.am: Likewise.
- * gui/widgets/Makefile.am (INCLUDES): Likewise.
-
-2002-01-23 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c (create_component): Pass a
- NULL @icon to
- `evolution_shell_component_add_user_creatable_item()'.
-
-2002-01-23 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/contact-editor/e-contact-editor-address.c: #include
- <locale.h>.
-
-2002-01-22 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug # 16864 ]
- * backend/ebook/evolution-ldif-importer.c (getValue): create and
- return a GString here, instead of writing to a fixed size buffer.
- (parseLine): use a GString here instead of a fixed size buffer.
-
-2002-01-21 Christopher James Lahey <clahey@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (ldap_search_handler): Set the
- number of cards to return to the value specified in the ldap uri,
- leaving the default at 100. Fixes Ximian bug #13953.
-
- * gui/component/addressbook-config.c (addressbook_source_dialog),
- gui/component/addressbook-config.glade: Added a limit entry here
- to edit the limit field of the source.
-
- * gui/component/addressbook-storage.c,
- gui/component/addressbook-storage.h
- (addressbook_storage_init_source_uri): Added a limit field to this
- class and pass that value through in the uri that's generated.
-
-2002-01-18 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-compare.c: Made username match with no
- domain match be vague instead of partial. Fixes Ximian bug
- #13612.
-
-2002-01-18 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/addressbook.c (view_contact_cb): New verb to open
- a bunch of cards.
-
- * gui/widgets/e-addressbook-reflow-adapter.c (open_card): Call
- e_addressbook_show_multiple_cards instead of doing this ourselves.
-
- * gui/widgets/e-addressbook-util.c,
- gui/widgets/e-addressbook-util.h
- (e_addressbook_show_multiple_cards): Added this function to show a
- bunch of cards, including a dialog if lots of windows are going to
- appear.
-
- * gui/widgets/e-addressbook-view.c (e_addressbook_view_view,
- e_addressbook_view_can_view): e_addressbook_view_view calls
- e_addressbook_show_multiple_cards on the appropriate list of
- cards.
-
-2002-01-18 Christopher James Lahey <clahey@ximian.com>
-
- * gui/contact-editor/e-contact-editor-address.c
- (fill_in_countries), gui/contact-editor/fulladdr.glade: Sort
- country list. Country list moves from fulladdr.glade to
- e-contact-editor-address.c, but only a few country names have
- actually changed. Fixes Ximian bug #16545.
-
-2001-12-20 Zbigniew Chyla <cyba@gnome.pl>
-
- Fixes #17725
-
- * evolution/addressbook/printing/e-contact-print.c (complete_sequence):
- Do not assume that the first byte of file_as is the first letter, use
- utf8 functions instead.
-
-2002-01-16 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c: move all functions here, get rid of
- header files, use e-pilot-settings to display gui
-
-2002-01-15 JP Rosevear <jpr@ximian.com>
-
- * gui/component/select-names/select-names.glade: remove misleading
- title and fix spacing
-
-2002-01-11 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/addressbook.c (alphabet_state_changed): Handle
- setting the search bar to "Advanced..." when the alphabet buttons
- are pushed and back when they're cleared. Fixes Ximian bug
- #12904.
- (addressbook_menu_activated): When the user calls Search->clear,
- set the search to ESB_ANY and "", don't just set the text. This
- is especially useful when it's set to ESB_ADVANCED.
-
- * gui/widgets/e-addressbook-view.c,
- gui/widgets/e-addressbook-view.h (alphabet_state_change): Added
- this signal which gets emitted when the alphabet buttons are
- pushed.
- (command_state_change): Removed the ref pair here. It's not
- necessary. gtk_signal_emit refs the object itself.
-
-2002-01-11 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-compare.c (name_synonyms): Added a couple
- of names here.
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_get_nth_obj): Removed an unused
- variable.
-
-2002-01-11 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-view.c,
- gui/widgets/e-addressbook-view.h (create_alphabet): Use toggle
- buttons here. Fixes Ximian bug #10734.
-
-2002-01-09 Christopher James Lahey <clahey@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (set_fields): Choose the
- first filled in address field here. Fixes Ximian bug #2222.
-
-2002-01-03 Joe Shaw <joe@ximian.com>
-
- * backend/ebook/test-card.c: Add a test for getting arbitrary
- fields.
-
- * backend/pas/pas-backend-card-sexp.c (compare_arbitrary): Added.
- (prop_info_table): Add a LIST_PROP for arbitrary fields.
-
-2002-01-03 Nat Friedman <nat@ximian.com>
-
- * backend/ebook/e-book.c (activate_factories_for_uri): Free the
- query if the oaf response is of zero length.
-
-2001-12-27 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (real_add_address_cb): When we clean, don't clean the model's last
- element. This helps keep things working properly when we have
- signal-character separators.
- (section_right_click_cb): Changed to work properly with our
- EText-emitted popup signal.
- (e_select_names_add_section): Use ETexts for the recipient
- sections, rather than tables. This lets us make them directly
- editable. (Bug #1721)
-
- * gui/component/select-names/e-select-names-popup.c
- (popup_info_new): Pass in a ESelectNamesTextModel, not a
- ESelectNamesModel.
- (e_select_names_popup): Adjust for the new signature for
- e_select_names_model_text_pos.
-
- * gui/component/select-names/e-select-names-manager.c
- (focus_out_cb): Schedule a cleaning when we focus out.
- (focus_in_cb): Cancel pending cleaning when we get focus. This
- helps us avoid bad things happening during the fast focus out/ins
- that happen when the completion dropdown appears.
- (completion_handler): Adjust for new signatures of
- e_select_names_model_text_pos and e_select_names_model_name_pos.
- (e_select_names_manager_entry_new): Pass in our
- ESelectNamesTextModel when constructing the
- ESelectNamesCompletion.
- (e_select_names_manager_entry_free): Cancel any pending clean-ups.
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_get_property_fn): Get the text off of the text model.
- Which is the only way that really makes sense when you think about
- it.
-
- * gui/component/select-names/e-select-names-completion.c: Added a
- copy of the associated ESelectNamesTextModel to
- ESelectNamesCompletionPrivate. This replaces the
- ESelectNamesModel.
- (e_select_names_completion_destroy): Unref ->text_model.
- (e_select_names_completion_handle_request): Pass in our text
- model's separator info when calling e_select_names_model_text_pos.
- (e_select_names_completion_new): Pass in the text model as an arg
- instead of the model, and ref it as needed.
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_init): Set separator as either ", " or
- ",", depending on the value of the EVOLUTION_DISABLE_MAGIC_COMMA
- environment variable.
- (e_select_names_text_model_destroy): Free the separator.
- (changed_cb): Flush our cached text on changed.
- (e_select_names_text_model_set_source): Use our own changed_cb
- callback on changed, rather than just connecting up
- e_text_model_changed.
- (e_select_names_text_model_set_separator): Added. Lets the
- separator between recipients be specified.
- (e_select_names_text_model_get_text): Cache the text we get from
- calling e_select_names_model_get_textification.
- (e_select_names_text_model_insert_length): A bunch of small
- changes to properly support generic separators, rather than
- (implicit and explicitly) assuming ", ".
- (e_select_names_text_model_delete): More small tweaks to handle
- generic separators.
- (e_select_names_text_model_get_nth_obj): Use new signature when
- calling e_select_names_model_name_pos, and use our cached text.
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_destroy): We don't cache the text or
- addr_text anymore, so no need to free them here.
- (e_select_names_model_changed): ...and no need to reset our text
- and addr_text caches here.
- (e_select_names_model_get_textification): Take a separator as an
- arg, rather than just using ", ". Also, no caching.
- (e_select_names_model_get_address_text): Take a separator as an
- arg, rather than just using ", ". And no caching here either.
- (e_select_names_model_clean): Add arg that give us control over
- whether or not the last entry should get cleaned. We need this
- when using a one-character separator, so that new destinations
- that get tacked onto the end don't get immediately cleaned away
- for being empty.
- (e_select_names_model_name_pos): Take the separator length as an
- argument, remove implicit assumption of length 2.
- (e_select_names_model_text_pos): Take the separator length as an
- argument, remove implicit assumption of length 2.
-
-2001-12-20 Ettore Perazzoli <ettore@ximian.com>
-
- [Fix #17377, Evolution doesn't work on multi-depth displays.]
-
- * gui/component/addressbook-factory.c (main): Push GdkRGB visual
- and colormap.
-
-2001-12-19 Jon Trowbridge <trow@ximian.com>
-
- * gui/widgets/e-addressbook-reflow-adapter.c
- (e_addressbook_reflow_adapter_right_click): Add cut/copy/paste to
- right-click menu.
-
- * gui/widgets/e-addressbook-view.c (table_right_click): Add
- cut/copy/paste to right-click menu. (Fixes bug #14528.) Also,
- disable some right-click options if our addressbook isn't
- editable.
-
-2001-12-18 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (check_for_slow_setting): go slow and
- clear the map if the last uri and the current uri do not match
- (post_sync): save the last uri
-
- * conduits/address-conduit-config.h: handle a last uri config
- option
-
-2001-12-18 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (addressbook_default_book_open):
- change this to match its e-book counterpart, and only failover to
- the local addressbook if the protocol wasn't supported. that way
- errors like "failure to connect" are still reported to the user.
-
- * backend/ebook/e-book-util.h: add prototypes for
- e_book_load_default_book and e_book_get_config_database.
-
- * backend/ebook/e-book-util.c (e_book_default_book_open): new
- function, basically cut and paste addressbook_default_book_open
- from addressbook.c here.
- (e_book_load_default_book): cut and past
- addressbook_load_default_book here, pretty much, except leave off
- the auth stuff.
- (e_book_get_config_database): new function, returns the
- Bonobo_ConfigDatabase for e_book_load_default_book to use.
-
- * conduit/address-conduit.c (start_addressbook_server): use
- e_book_load_default_book here.
-
-2001-12-17 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug 17355 ]
- * gui/component/select-names/e-select-names.c (new_folder): if
- we're dealing with an LDAP folder, prepend [LDAP] to it. Now that
- we have 3 different places where folders are coming from, it helps
- to be able to differentiate "Contacts" in ~/evolution and a
- "Contacts" ldap server and a "Contacts" exchange folder.
- (add_additional_select_names_uris): loop through the bonobo conf
- settings for additional folders, adding them to the option menu.
- (e_select_names_hookup_shell_listeners): call
- add_additional_select_names_uris.
-
-2001-11-28 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-minicard-view-widget.c
- (e_minicard_view_widget_realize): Use an #ECanvasBackground here
- instead of a #GnomeCanvasRect.
-
-2001-12-16 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c: Added
- 'cache_complete' flag to ESelectNamesCompletionPrivate.
- (e_select_names_completion_seq_complete_cb): Set cache_complete
- to TRUE if our query wasn't interrupted.
- (e_select_names_completion_start_query): Set cache_complete to
- FALSE at the beginning of a potentially-cached query.
- (e_select_names_completion_do_query): Only reuse cached cards
- if cache_complete is TRUE. (Fixes bug #10241)
-
-2001-12-15 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (e_addr_context_destroy): don't free
- the hash table keys, we didn't allocate them and free the change
- objects and unref the associated cards
- (local_record_from_uid): unref the temp card we create
- (replace_record): ref the new card associated with the card change
- and unref the old one
-
-2001-12-13 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (local_record_from_ecard): Make sure
- to copy the custom fields so they are not overwritten
-
-2001-12-13 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-book-util.c (simple_query_new): Used
- g_strdup_printf to dup a string. Doh! Changed to g_strdup.
- (Bug #17126)
-
-2001-12-07 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_entry_new): Remove a reference to code
- I don't want to commit yet. :-)
-
- * gui/component/select-names/e-select-names-manager.c: Extensively
- refactored -- this code had gotten _really_ ugly. Untangle things
- to the point where our reference counting problems are fixable.
-
- * gui/component/select-names/e-select-names-bonobo.c
- (impl_destroy): Remove all of the ugly hacks to work around our
- memory management problems, and just unref the manager.
- (Fixes #14412)
-
-2001-12-05 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c
- (search_for_dn_with_objectclasses): move search_for_dn's contents
- here, and add an "existing_objectclasses" parameter that we pass
- on to build_card_from_entry.
- (search_for_dn): call search_for_dn_with_objectclasses with NULL
- for existing_objectclasses.
- (build_card_from_entry): if existing_objectclasses is non-NULL,
- fill it in with the list of existing objectclass values for this
- entry.
- (add_objectclass_mod): if existing_objectclasses is non-NULL,
- meaning we're modifying an entry, search in the existing
- objectclasses for the ones we want to be there, and only add
- what's missing. If none are missing, don't add objectclass_mod to
- the list of mods.
- (create_card_handler): track change to add_objectclass_mod (pass
- NULL).
- (modify_card_handler): use search_for_dn_with_objectclasses
- instead of search_for_dn, and pass the existing objectclasses to
- add_objectclass_mod. also, free the list when we're done.
- (poll_ldap): track change to build_card_from_entry (pass NULL).
-
-2001-12-05 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (enable_writable_fields):
- we need to be able to disable non-labels here as well. since
- we're using enable_widget and not gtk_widget_set_sensitive, it's
- okay to handle entries/text's, etc, here.
- (widget_field_mappings): add label-caluri and label-fburl here.
-
- * gui/contact-editor/contact-editor.glade: change the label names
- for the freebusy/calendar urls to have more descriptive names,
- since we use them in e-contact-editor.c now.
-
- * backend/pas/pas-backend-ldap.c: add support for
- caluri/calendarURI, fburl/freeBusyURI.
-
- * backend/pas/evolutionperson.schema: add calendarURI and
- freeBusyURI.
-
-2001-12-04 Christopher James Lahey <clahey@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Fixed up the
- accelerators and such here.
-
- * gui/contact-editor/e-contact-editor.c (file_save_as_cb):
- Translate this string.
- (pixmaps): Added a pixmap for the ContactEditorSaveClose command.
- (setup_tab_order): Fixed up the tab order here.
-
- * gui/contact-editor/fulladdr.glade: Made the country combo
- focusable here.
-
-2001-12-03 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-destination.c (e_destination_equal): Make address
- comparisons case-insensitive. (Fixes 11776)
-
- * backend/ebook/e-card.c (e_card_email_match_single_string): Make address
- host comparisons case-insensitive. (Fixes 11776)
-
- * gui/component/select-names/e-select-names-manager.c (focus_out_cb): Clean
- ESelectNamesModel on focus-out. (Half of a fix for 15656)
-
- * backend/ebook/e-destination.c (nonempty): Fix this function
- and make it utf8-safe. (The other half of the fix for 15656)
-
-2001-11-28 Christopher James Lahey <clahey@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c: Consistency
- fixes with standard contact editor. Added Save As, Send As, and
- Send To. Replaced Save toolbar with Save and Close and added Save
- and Close menu item. Added a trash icon.
-
-2001-11-28 Christopher James Lahey <clahey@ximian.com>
-
- * gui/contact-editor/e-contact-editor-address.c (setup_tab_order):
- Setup the tab order here. Fixes Ximian bug #13751.
-
-2001-11-28 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/addressbook.c (connect_master_list_changed,
- make_suboptions): Changed how this list of categories gets
- computed. Fixes Ximian bugs #7707 and #7708.
-
-2001-11-15 Zbigniew Chyla <cyba@gnome.pl>
-
- * printing/e-contact-print-envelope.c (ecpe_linelist_dimensions),
- printing/e-contact-print.c (e_contact_divide_text, e_contact_output,
- e_contact_rectangle, e_contact_print_letter_tab,
- e_contact_print_letter_heading, e_contact_get_card_size,
- e_contact_print_card, e_contact_print_phone_list):
- s/gnome_font_get_width_string/gnome_font_get_width_utf8/
- s/gnome_font_get_width_string_n/gnome_font_get_width_utf8_sized/
-
-2001-11-14 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (search_for_dn): check against
- LDAP_SUCCESS as the return value, not -1.
- (pas_backend_ldap_build_all_cards_list): same.
- (pas_backend_ldap_process_authenticate_user): same.
-
-2001-11-12 Chris Toshok <toshok@ximian.com>
-
- [ Fixes Ximian bug #14843 ]
- * backend/pas/pas-backend-ldap.c (func_and): don't crash if a
- subexpression wasn't filled in.
-
- * backend/pas/pas-backend-ldap.c (func_or): same.
-
-2001-11-12 Jon Trowbridge <trow@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c (list_added_cb):
- Release callback's reference to EContactListEditor.
- (list_modified_cb): Release callback's reference to
- EContactListEditor.
- (save_card): Ref the EContactListEditor on behalf of the
- e_book_foo callback. (Fixes bug #14743)
- (save_card): Set changed to false once we've saved.
- (list_deleted_cb): Release callback's reference.
- (delete_cb): Hold reference for the callback.
-
-2001-11-12 Jon Trowbridge <trow@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (categories_clicked): If
- our call to e_categories_new returns NULL, put up an error dialog
- and return. (Fixed #14780)
-
-2001-11-09 Chris Toshok <toshok@ximian.com>
-
- [ Fixes Ximian bug #14687 ]
- * backend/pas/pas-backend-file.c
-
- * backend/pas/pas-book-factory.c
- (pas_book_factory_process_request): do load_uri before add_client,
- so we know if the load actually worked (add_client uses this
- information to respond to the new client.) before this change,
- the client would still think the book was in a useful state even
- if the load_uri failed.
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_add_client): if
- the we're not connected, say so.
-
- * backend/pas/pas-backend-file.c (pas_backend_file_add_client):
- same.
- (pas_backend_file_load_uri): don't report_writable here,
- add_client does it. was only needed before because of the
- improper ordering in pas-book-factory.c above.
-
-2001-11-09 Chris Toshok <toshok@ximian.com>
-
- [ Fixes Ximian bug #14646 ]
- * gui/component/addressbook.c (addressbook_default_book_open): new
- function. if the default_book failed to load, load the local
- addressbook in its place.
- addressbook_load_default_book): if we're loading the default_book
- uri, use addressbook_default_book_open as the open_response.
-
- * backend/ebook/e-book.c (e_book_load_uri_step): reset the
- load_state to NotLoaded so we can attempt another load_uri on
- the book if it fails.
-
-2001-11-08 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-bonobo.c
- (impl_destroy): Explicitly destroy entries. Part of the fix for
- the lingering completion window bug.
-
-2001-11-04 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c: Use ordering of the pilot's phone
- label list to find fields we sync in order to avoid strcmp'ing the
- pilot's labels rendering phone syncing usable only for english
- language pilots
-
-2001-11-03 Chris Toshok <toshok@ximian.com>
-
- [ Fixes Ximian bug #14410 ]
- * gui/contact-editor/e-contact-editor.c (e_contact_editor_init):
- init in_async_call to FALSE.
- (card_added_cb): turn the UI back on and set in_async_call to
- FALSE.
- (card_modified_cb): same.
- (card_deleted_cb): same.
- (save_card): turn off the UI by setting the dialog insensitive,
- and set in_async_call to TRUE.
- (delete_cb): same.
- (app_delete_event_cb): if we're in an async call don't let the
- window get deleted.
-
- * gui/contact-editor/e-contact-editor.h (struct _EContactEditor):
- add in_async_call flag for when we make a wombat call and need to
- disable the UI.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (e_contact_list_editor_init): init in_async_call to FALSE.
- (list_added_cb): turn the UI back on and set in_async_call to
- FALSE.
- (list_modified_cb): same.
- (list_deleted_cb): same.
- (save_card): turn off the UI by setting the dialog insensitive,
- and set in_async_call to TRUE.
- (delete_cb): same.
- (app_delete_event_cb): if we're in an async call don't let the
- window get deleted.
-
- * gui/contact-list-editor/e-contact-list-editor.h (struct
- _EContactListEditor): add in_async_call flag for when we make a
- wombat call and need to disable the UI.
-
-2001-11-02 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-simple.c (e_card_simple_get): Check for
- NULL dates before converting them to strings. Fixes Ximian bug
- #14394.
-
-2001-11-02 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-bonobo.c
- (impl_destroy): Leak select-names related data structures until
- the memory management issues get sorted out. Fixed bug #14086.
-
-2001-10-31 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/e-cardlist-model.c,
- gui/component/select-names/e-select-names-table-model.c,
- gui/widgets/e-addressbook-table-adapter.c: Make the pre_changes
- and changes match here.
-
-2001-10-31 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_destroy): Check that local_listener and
- other_contacts_listener are non-NULL before
- disconnecting/unrefing.
-
- * gui/component/select-names/e-select-names-manager.c
- (entry_destroyed): The entry shouldn't unref the manager.
- (e_select_names_manager_create_entry): The entry shouldn't hold a
- ref to the manager. It becomes circular.
- (e_select_names_manager_create_entry): On the other hand, we
- should hold a ref to the entry we create.
-
- * gui/component/select-names/e-select-names-bonobo.c
- (impl_destroy): Remove the explicit dialog destroy hack.
-
-2001-10-30 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-bonobo.c
- (impl_destroy): Force the select names dialog to be destroyed.
- This is a hack to fix bug #14002 -- I'll clean up the refcounting
- issues post-freeze. At least now it won't crash.
-
-2001-10-30 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (ecard_from_remote_record): make sure
- to translate the character sets of the names
-
-2001-10-30 JP Rosevear <jpr@ximian.com>
-
- * gui/component/select-names/e-select-names-bonobo.c
- (manager_ok_cb): send a null bonobo arg to prevent explosion
-
-2001-10-30 JP Rosevear <jpr@ximian.com>
-
- * gui/widgets/e-addressbook-view.c: correct include typo
-
-2001-10-29 Jon Trowbridge <trow@ximian.com.
-
- * gui/widgets/e-minicard.c (add_field): Five characters, not four!
-
- * gui/widgets/e-addressbook-table-adapter.c
- (addressbook_value_at): Convert xml-ified destinations into proper
- addresses.
-
-2001-10-29 Jon Trowbridge <trow@ximian.com.
-
- * gui/component/select-names/e-select-names-bonobo.c (init):
- Connect to manager's "ok" signal.
- (manager_ok_cb): Emit "ok" bonobo-signal.
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_class_init): Added "ok" signal.
- (e_select_names_clicked): Emit 'ok' signal.
-
-2001-10-29 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-util.c
- (e_addressbook_prompt_save_dialog): new function, a "Do you want
- to save changes?" dialog.
-
- * gui/widgets/e-addressbook-util.h: add prototype for
- e_addressbook_prompt_save_dialog.
-
- * gui/contact-editor/e-contact-editor.c (prompt_to_save_changes):
- call e_addressbook_prompt_save_dialog and save the card if they
- select save. return TRUE if the dialog should be closed, FALSE
- otherwise.
- (file_close_cb): check prompt_to_save_changes before closing the
- dialog.
- (app_delete_event_cb): same.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (prompt_to_save_changes): call e_addressbook_prompt_save_dialog
- and save the card if they select save. return TRUE if the dialog
- should be closed, FALSE otherwise.
- (file_close_cb): check prompt_to_save_changes before closing the
- dialog.
- (app_delete_event_cb): same.
-
-2001-10-29 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (add_objectclass_mod): overload
- this function for modifying objectclasses too, so we can make sure
- evolutionPerson shows up in the objectclasses of an entry if it
- shows up in the schema for the server.
- (create_card_handler): add @replace = FALSE in the call to
- add_objectclass_mod.
- (modify_card_handler): call add_objectclass_mod with @replace =
- TRUE.
- (anniversary_compare): fix typo - return "equal", not "TRUE".
- (birthday_compare): same.
-
-2001-10-29 Jon Trowbridge <trow@ximian.com>
-
- * conduit/address-conduit.c (pre_sync): Comment out spew.
-
- * gui/contact-list-editor/e-contact-list-editor.c (fill_in_info):
- Comment out spew.
-
- * gui/component/addressbook-component.c
- (destination_folder_handle_drop): Comment out spew.
- (get_dnd_selection): Comment out spew.
-
- * gui/widgets/e-addressbook-table-adapter.c
- (addressbook_set_value_at): Comment out spew.
-
-2001-10-29 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/addressbook.c (update_command_state): Check that
- our BonoboUIComponent has a container so we don't get a lot of
- annoying debug spew.
-
- * printing/smallbook.ecps: Fixed fonts.
-
- * printing/phonelist.ecps: Fixed fonts.
-
- * printing/medbook.ecps: Fixed fonts.
-
- * printing/e-contact-print.c (e_contact_get_card_size): Commented
- out spew.
-
- * gui/widgets/e-minicard.c (remodel): Check that e_minicard->card
- != NULL.
-
-2001-10-29 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_destroy): We were using
- book_data->book_view immediately after unrefing it. Reordered the
- code a bit to avoid this.
-
-2001-10-29 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-book-factory.h: add prototype for
- pas_book_factory_dump_active_backends.
-
- * backend/pas/pas-book-factory.c
- (pas_book_factory_dump_active_backends): new function.
- (dump_active_server_map_entry): new function.
-
-2001-10-29 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (make_match): Drop a match if either of the text fields is NULL.
- This could happen if any of the utf-8 involved is invalid, for
- example. (Bug #13757)
-
-2001-10-29 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (is_syncable): fix bug that allowed
- for phone's not to be in priority order and the item to still be
- syncable
-
- * conduit/address-conduit-config.h
- (addrconduit_load_configuration): get management by id
-
-2001-10-29 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (is_syncable): a card also needs to
- have its phone nums in priority order to be "syncable"
-
-2001-10-29 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (is_syncable): move the syncable
- checking code to a different function
- (ecard_from_remote_record): set the name parts individually
- (local_record_from_ecard): use is_syncable
-
-2001-10-29 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-simple.c (file_as_get_style,
- file_as_set_style): Use the actual ECardName in the ECard instead
- of parsing the full_name here.
-
-2001-10-29 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h
- (e_card_simple_set_name): New function to set the ECardName on
- this card and fix the file_as if necessary.
-
-2001-10-29 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h
- (e_card_simple_get): Handle returning dates here.
- (e_card_simple_get_allow_newlines): New function. Returns whether
- it makes much sense to have newlines in this string.
-
- * gui/component/addressbook-config.c,
- gui/component/addressbook-config.h
- (addressbook_create_new_source): The first argument here should
- be const.
-
- * gui/component/addressbook-storage.c: Added #include
- "addressbook-config.h".
-
- * gui/widgets/e-minicard-label.c (e_minicard_label_event): On an
- escape here, cancel editing and remove the focus from the text.
-
- * gui/widgets/e-minicard.c (add_field): Set allow_newlines here.
- (field_activated): Stop editing on the activate signal and remove
- the focus from the text. Fixes Ximian bug #12286.
-
-2001-10-28 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.h: tidy
-
- * conduit/address-conduit-config.h: ditto
-
- * conduit/address-conduit.c (add_record): unref ecard when done
-
-2001-10-28 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-card.c (e_card_date_from_string): Expose this
- function.
- (e_card_date_to_string): ...and this one. Fixes build problem in
- pas-backend-ldap.c.
-
-2001-10-28 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_hookup_shell_listeners): Change "this should never
- happen" dialog to not give my name/e-mail. Sorry translators.
- But this really should never happen, thanks to my fix below.
-
- * gui/component/addressbook-component.c: Initialize
- global_shell_client to NULL. (Bug #6625)
-
-2001-10-27 Chris Toshok <toshok@ximian.com>
-
- [ bug #12979 ]
- * backend/pas/pas-backend-ldap.c (anniversary_populate): new
- function.
- (anniversary_ber): new function.
- (anniversary_compare): new function.
- (birthday_populate): new function.
- (birthday_ber): new function.
- (birthday_compare): new function.
-
-2001-10-27 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_destroy): free up all the book_data
- list stuff.
- (e_select_names_completion_got_book_view_cb): deal with book_data
- being passed as the closure, and increment the
- pending_completion_seq counter.
- (e_select_names_completion_card_added_cb): deal with book_data
- being passwd as the closure.
- (e_select_names_completion_seq_complete_cb): same, and decrement
- the pending_completion_seq if we haven't gotten one for this book
- view before.
- (e_select_names_completion_stop_query): cancel all the
- book_data's.
- (e_select_names_completion_start_query): use the books_not_ready
- counter instead of book_ready. also, do e_book_get_book_view on
- each of the book's in our list.
- (e_select_names_completion_do_query): change to deal with our
- list.
- (e_select_names_completion_book_ready): decrement the
- book_not_ready counter.
- (e_select_names_completion_new): add the book we're created with
- to our list.
- (e_select_names_completion_add_book): implement.
-
- * gui/component/select-names/e-select-names-completion.h: add
- prototype for e_select_names_completion_add_book.
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_new): use addressbook_config_data, and
- don't unref the db.
- (e_select_names_manager_create_entry): always add NULL for a book
- (which corresponds to the local book), and if the completion_book
- is present, add it to the list of books to complete again.
-
-2001-10-27 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-quick-add.c (merge_cb): change to
- EBookCallback signature, and unref the book.
- (quick_add_merge_card): use addressbook_load_default_book.
- (ce_have_book): change to EBookCallback signature, and unref the
- book.
- (edit_card): use addressbook_load_default_book.
-
- * gui/component/e-address-popup.c (email_table_save_card_cb):
- change to EBookCallback signature, and unref the book.
- (add_card_idle_cb): use addressbook_load_default_book, and call
- the cb if it fails.
- (e_address_popup_cleanup): fix type -- should be "pop->card =
- NULL", not "pop = NULL".
- (contact_editor_cb): change to EBookCallback signature.
- (edit_contact_info_cb): use addressbook_load_default_book.
- (start_query): change to EBookCallback signature.
- (e_address_popup_query): use addressbook_load_default_book.
-
- * gui/widgets/e-minicard-control.c (book_open_cb): change to
- EBookCallback signature, and unref the book.
- (save_in_addressbook): use addressbook_load_default_book instead
- of e_book_use_local_address_book.
-
- * gui/widgets/Makefile.am (INCLUDES): change includes since we're
- including addressbook.h which has it's own set of funky include
- path requirements.
-
-2001-10-27 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-book.c (activate_factories_for_uri): Don't leak
- stuff. (Bug #13709)
-
-2001-10-27 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-destination.c (name_and_email_simple_query_cb,
- nickname_simple_query_cb): Set book_uri when cardification occurs.
-
-2001-10-27 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_add_section): Turned off use_ellipsis (it breaks
- emulate_label_resize) and on emulate_label_resize. Fixes Ximian
- bug #13693.
-
-2001-10-27 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (make_match): Doh! We should be sorting our contacts so that the
- most frequently used ones are at the top of the list, not the
- bottom.
-
- * backend/pas/pas-book.c (pas_book_check_queue): That should be a
- bonobo_object_unref, not a gtk_object_unref.
- (pas_book_queue_request): Likewise, we need to bonobo_object_ref
- here.
- (pas_book_destroy): If our pas_book_check_queue timeout is still
- active, disable it. This should never happen, but it never hurts
- to be careful.
- (pas_book_destroy): Set book->priv to NULL after we free it.
-
-2001-10-27 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (local_record_from_ecard): copy phone
- labels and show phone as well, clear correct entry text and
- correctly detect unsyncable cases
-
-2001-10-27 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (local_record_from_ecard): touch the
- record on lookup
- (check_for_slow_setting): write touched only if we are doing a
- slow sync
- (card_removed): don't touch on lookup
- (match): touch on lookup
-
-2001-10-27 Jon Trowbridge <trow@ximian.com>
-
- * backend/pas/pas-book.c (pas_book_check_queue): Added paranoid
- reentrancy guards.
- (pas_book_queue_request): Changed our idle handler into a timeout,
- so as to work w/ reentrancy guards.
- (pas_book_init): Explicit initialization.
-
-2001-10-26 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.h: add prototypes for
- addressbook_config_database, and addressbook_load_default_book.
-
- * gui/component/addressbook.c (addressbook_config_database): new
- function, so we aren't activating the db everywhere we need to use
- it.
- (addressbook_load_default_book): load the default book, after
- getting the uri from bonobo-config.
-
-2001-10-26 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-book-util.c (simple_query_card_added_cb): Return
- on cancellation.
- (simple_query_sequence_complete_cb): Act if not cancelled.
- (simple_query_book_view_cb): Free & return on cancellation.
- (e_book_simple_query_cancel): Set cancellation flag.
-
- * gui/component/e-address-popup.c (e_address_popup_query): Hold a
- reference to ourselves for the duration of our addressbook fetch.
- (start_query): Release when we've fetched our addressbook.
- (e_address_popup_cleanup): Break out most of what we do in
- _destroy into a separate function.
- (e_address_popup_destroy): Class cleanup.
- (contact_editor_cb): Paranoid clean-up.
- (add_contacts_cb): Paranoid clean-up.
- (e_address_popup_ambiguous_email_add): Paranoid clean-up.
-
-2001-10-26 JP Rosevear <jpr@ximian.com>
-
- * conduit/e-address.conduit.in: remove the merges as valid sync
- types
-
- * conduit/address-conduit.c (pre_sync): write out only the touched
- records if we are doing copies
-
- * conduit/address-conduit-config.h
- (addrconduit_load_configuration): get the sync type
-
-2001-10-26 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/e-address-popup.c (e_address_popup_destroy):
- Cancel any pending queries.
-
- * gui/contact-editor/e-contact-editor.c (close_dialog): Don't
- assert, but check if ce->app != NULL, since this function can
- (apparently) get called multiple times.
-
- * gui/contact-editor/e-contact-save-as.c (file_exists): Remove bad
- dialog ref-counting crap.
-
- * gui/contact-editor/e-contact-editor.c (save_card): Ref our
- EContactEditor, since we are holding a pointer to it in
- EditorCloseStruct.
- (card_modified_cb): Unref our EContactEditor when we free our
- EditorCloseStruct.
- (card_added_cb): Unref our EContactEditor when we free our
- EditorCloseStruct.
-
-2001-10-26 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (check_for_slow_setting): make debug
- info more accurate
-
-2001-10-26 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (e_addr_context_destroy): prevent
- double unref
- (cursor_cb): correct typo
- (card_removed): remove the card from the map if was archived and
- is now deleted
-
-2001-10-26 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.h: new member
-
- * conduit/address-conduit.c (print_remote): free the struct after
- using it
- (e_addr_context_new): make consistent with other conduits
- (e_addr_context_destroy): properly destroy the context
- (cursor_cb): no need to ref the card, its done for us
- (clear_entry_text): util function to free a field
- (free_local): free a local record
- (local_record_to_pilot_record): use a static buffer so we don't
- have to free it later
- (local_record_from_ecard): only fill in the fields we might not
- sync, clear a field before replacing the contents
- (for_each): track locals
- (for_each_modified): ditto
- (free_match): use free_local
-
-2001-10-26 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-minicard.c, gui/widgets/e-minicard.h
- (set_has_cursor): Added has_cursor argument. Setting the argument
- to TRUE if the minicard doesn't have focus will grab the focus.
- Fixes Ximian bug #3024.
-
-2001-10-24 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/addressbook-factory.c (main): Initialize
- gnome-vfs.
-
- * gui/component/addressbook-component.c (xfer_file): Added.
- (Copied from the calendar.)
- (xfer_folder): Fixed to allow renaming of contact folders.
-
-2001-10-24 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-view.c
- (e_addressbook_view_class_init): Removed key_press handler here
- since delete and backspace are now handled by keybindings.
-
-2001-10-23 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/addressbook.c: Fix command paths when we specify
- our pixmaps, so we don't get a lot of totally useless & very ugly
- bonobo-ui spew.
-
- * backend/ebook/e-book-util.c (e_book_nickname_query): The empty
- string as an arg shouldn't generate a warning.
-
- * gui/component/select-names/e-select-names-completion.c: Removed
- our cancelled flag and e_select_names_completion_cancel function,
- since we were just duplicating stuff that had ended up in
- ECompletion.
- (match_name): Form our menu_text properly on an additional-name
- match.
- (e_select_names_completion_got_book_view_cb): Store handles for
- our signals, disconnect them properly when we switch book views.
- (e_select_names_completion_stop_query): Disconnect signals when we
- stop our query.
- (check_capabilities): Spew if we are using LDAP for completion.
- (e_select_names_completion_destroy): Disconnect our signals when
- we destroy.
- This all should fix bug #10241.
-
-2001-10-23 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_add_section): Set "draw_button" argument to TRUE
- on this EEntry.
-
-2001-10-22 Christopher James Lahey <clahey@ximian.com>
-
- * gui/contact-editor/e-contact-save-as.c (save_it): Put up an
- error dialog if there's an error while saving. If the person hits
- cancel on the "file exists" dialog, don't close the file selection
- dialog. Fixes Ximian bug #7055.
-
-2001-10-21 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-reflow-adapter.c
- (model_and_selection_free): right_click_up here when we let go of
- the popup.
-
- * gui/widgets/e-minicard-view.c (e_minicard_view_selection_event):
- right_click_up here.
-
-2001-10-21 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_add_section, e_select_names_set_default): Use an
- EEntry here instead of a GtkLabel. Fixes Ximian bug #7067.
-
-2001-10-21 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/addressbook.c (control_activate_cb): Call
- e_addressbook_model_force_folder_bar_message when we activate the
- component. (Fixes bug #11749)
-
- * gui/widgets/e-addressbook-model.c
- (e_addressbook_model_force_folder_bar_message): Added. Forces
- emission of a folder_bar_message.
-
-2001-10-20 Larry Ewing <lewing@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_set_default): stick with the style font if the
- efont bold font does not exist.
- (e_select_names_set_default): don't forget to unref the oldstyle.
-
-2001-10-20 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (name_style_query): Fix memory leak.
-
- * gui/widgets/e-addressbook-view.c (jump_to_letter): Free our
- string vector letter_v when we are done with it.
-
- * gui/contact-editor/e-contact-quick-add.c (edit_card): Unref our
- QuickAdd structure.
-
- * gui/component/e-address-popup.c (e_address_popup_construct):
- Unref our style after we are done with it.
-
-2001-10-20 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-book.c (activate_factories_for_uri): We
- shouldn't leak the info returned by oaf_query.
-
- * gui/contact-editor/e-contact-quick-add.c (card_added_cb): Remove
- superfluous call to quick_add_unref.
- (editor_closed_cb): Remove superfluous call to quick_add_unref.
-
- * gui/component/select-names/e-select-names.c (esn_get_key_fn): We
- need to unref the card returned by e_addressbook_model_get_card.
-
-2001-10-20 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c: Make LDAP servers
- non-user-creatable.
-
-2001-10-20 Jon Trowbridge <trow@ximian.com>
-
- * printing/e-contact-print.c (e_contact_print_card): Check that the
- string we are checking for xml-ness is non-NULL.
-
- * backend/ebook/e-destination.c (e_destination_importv): Filter
- out empty destinations. (also Bug #13036)
-
- * printing/e-contact-print.c (e_contact_build_style): Use
- gnome_font_new_closest; if gnome_font_new fails and returns NULL,
- our spacing gets all messed up. (Bug #10785)
-
- * gui/widgets/e-addressbook-view.c (e_addressbook_view_can_print):
- Allow printing if there are any cards in our view. The selection
- has nothing to do with it.
-
- * backend/ebook/e-destination.c (e_destination_is_empty): Check
- for strings that contain non-whitespace, rather than just looking
- for a non-zero first character. (Bug #13036)
-
-2001-10-20 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-minicard-view.c (e_minicard_view_selection_event):
- Handle focus_change in event by selecting that contact. Fixes
- Ximian bug #3024.
-
- * gui/component/addressbook-component.c (owner_unset_cb):
- Repeatedly call gtk_main_quit here as long as there is a main loop
- around. This is an ugly hack around Ximian bug #11760.
-
-2001-10-20 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.c: Added #include
- <gal/widgets/e-unicode.h>.
-
- * gui/widgets/e-minicard-control.c: Made this display the number
- of extra cards in the attachment as well as made it save them all
- to the local addressbook if the person selects the button. Fixes
- Ximian bug #9507.
-
-2001-10-20 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-minicard.c (e_minicard_event): Changed this to not
- grab on a right click. Fixes Ximian bug #12660.
-
-2001-10-19 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c
- (destination_folder_handle_motion): Get @folder_type here too [to
- match the changes in the EvolutionShellComponentDnd interface].
- Also, remove a debugging message.
- (destination_folder_handle_drop): Likewise.
-
-2001-10-18 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names.c (add_menu_item):
- Translate labels in select-names option menu. (Bug #9604)
-
- * gui/search/e-addressbook-search-dialog.c
- (e_addressbook_search_dialog_init): Made the default window size
- slightly wider. (Bug #7516)
-
-2001-10-18 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card.c, backend/ebook/e-card.h
- (e_card_list_get_vcard): Made this take a const GList.
-
-2001-10-18 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (check_capabilities): Added. Check if our book is local or
- networked.
- (e_select_names_completion_book_ready): Call check_capabilities.
- (e_select_names_completion_new): Call check_capabilities.
- (e_select_names_completion_do_query): If we have a networked book,
- keep trying if we haven't been able to cache any cards --- our
- earlier attempts could have failed due to too many matches. (Bug
- #12932)
-
- * gui/component/select-names/e-select-names-manager.c
- (focus_out_cb): Lag our cardification on focus-out. This seems to
- help with the unintended cardifications that can result from the
- weird focus-out/focus-in events that get generated when the popup
- disappears.
-
- * backend/ebook/e-card-compare.c: Removed some debug spew.
-
-2001-10-17 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-config.c (addressbook_source_dialog):
- grab focus in the Account entry when preparing the dialog, fixes
- #10406.
-
-2001-10-17 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names.c (new_folder): make
- sure to also add "ldap-contacts" folders to the option menu.
-
-2001-10-17 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (ecard_from_remote_record): sync all
- the fields we can, with out overwriting
- (local_record_from_ecard): write the fields to the pilot in
- priority order unless there are fields on the pilot we can't
- store, then fill in the fields as they are on the pilot
-
-2001-10-17 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card.c (e_card_get_vobject): Did a bit of clean
- up here. Might fix some crashes, specifically Ximian bug #10164.
-
- * gui/widgets/e-addressbook-view.c (SPEC): Updated the model
- column numbers here. Fixes Ximian bug #12308.
-
-2001-10-17 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-file.c (pas_backend_file_upgrade_db):
- add upgrade from 0.1 to 0.2, where we make sure id dbt's match
- vcard id's, fixes longstanding bug (#7406) where cards were not
- modifiable or removable after having been created during a 1-2
- week long window in early betas.
- (PAS_BACKEND_FILE_VERSION): change to 0.2
- (PAS_ID_PREFIX): #define this here.
- (pas_backend_file_create_unique_id): use PAS_ID_PREFIX instead of
- the string.
-
-2001-10-16 Iain Holmes <iain@ximian.com>
-
- * backend/ebook/evolution-ldif-importer.c (support_format_fn): Return
- FALSE if no extension.
-
-2001-10-16 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-card.c (e_card_get_id): If card->id is NULL,
- return an empty string.
- (e_card_set_id): Don't allow the card id to be set to NULL; use
- the empty string instead.
- (e_card_get_vobject): When building our vcard, pass in the empty
- string as the id if card->id is NULL. (Bug #10164)
-
-2001-10-16 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (local_record_from_ecard): don't set
- the phone info if it is blank
- (ecard_from_remote_record): save up to 3 fax numbers
-
-2001-10-15 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_add_client):
- unref the book after we pass it off to evolution-addressbook.
-
-2001-10-15 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (create_card_dtor): unref
- op->view.
- (pas_backend_ldap_process_create_card): ref op->view.
- (remove_card_dtor): unref op->view.
- (pas_backend_ldap_process_remove_card): ref op->view.
- (modify_card_dtor): unref op->view.
- (pas_backend_ldap_process_modify_card): ref op->view.
- (ldap_search_dtor): unref op->view.
- (pas_backend_ldap_search): ref op->view.
-
-2001-10-15 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_process_get_book_view): make sure to unref the
- book_view here so we don't leak them.
-
-2001-10-12 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-factory.c (main): call
- e_passwords_init and e_passwords_shutdown.
-
-2001-10-15 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card.c (addPropValueQP, addPropValueSets,
- e_card_get_vobject): Properly decide whether a property needs to
- be marked as QP by searching for '\n'. Fixes Ximian bug #3021.
-
-2001-10-15 Christopher James Lahey <clahey@ximian.com>
-
- * gui/contact-editor/e-contact-save-as.c (e_contact_save_as,
- e_contact_list_save_as): Set the default file name here. Fixes
- Ximian bug #7053.
-
-2001-10-14 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_hookup_shell_listeners): Added linebreaks to our
- "this shouldn't happen" dialog message. (Bug #12498)
-
-2001-10-12 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/addressbook-factory.c (main): Add a component name
- to the e_passwords_init() call.
-
-2001-10-12 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/evolution-ldif-importer.c: commit the importer
- originally from Michael M. Morrison, with fixups by toshok.
-
- * backend/ebook/Makefile.am (bin_PROGRAMS): add
- evolution-ldif-importer.
- (oaf_in_files): add
- GNOME_Evolution_Addressbook_LDIF_Importer.oaf.in.
-
- * backend/ebook/e-card-simple.h: add WANTS_HTML and IS_LIST.
-
- * backend/ebook/e-card-simple.c (field_data): add WANTS_HTML and
- IS_LIST.
- (e_card_simple_set): fix typo.
-
- * backend/ebook/.cvsignore: ignore
- GNOME_Evolution_Addressbook_LDIF_Importer.oaf and
- evolution-ldif-importer.
-
- * backend/ebook/GNOME_Evolution_Addressbook_LDIF_Importer.oaf.in:
- ldif importer oafinfo.
-
-2001-10-12 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h:
- Added a boolean type here.
-
-2001-10-12 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (addressbook_model_set_uri): Check to see if the uri we are
- setting is the same as the current uri. If so, do nothing.
- (Bug #11324)
-
-2001-10-11 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-destination.c
- (e_destination_reverting_is_a_good_idea): Added. Heuristic for
- whether or not we want to revert to an earlier cardified state.
- (e_destination_cardify): Don't be quite as aggressive about
- reverting to previous cardified states. (Bug #11890)
-
-2001-10-11 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-simple.c (e_card_simple_destroy,
- fill_in_info, e_card_simple_sync_card, e_card_simple_set_phone,
- e_card_simple_set_address, e_card_simple_set_delivery_address,
- file_as_get_style, file_as_set_style, e_card_simple_set,
- e_card_simple_set_arbitrary),
- gui/contact-editor/e-contact-editor-address.c
- (e_contact_editor_address_destroy,
- e_contact_editor_address_set_arg,
- e_contact_editor_address_get_arg),
- gui/contact-editor/e-contact-editor-fullname.c
- (e_contact_editor_fullname_destroy,
- e_contact_editor_fullname_set_arg,
- e_contact_editor_fullname_get_arg),
- gui/contact-editor/e-contact-editor.c (phone_entry_changed,
- address_text_changed, name_entry_changed, full_name_clicked,
- full_addr_clicked, fill_in_info): Changed these to use the new ref
- and unref functions for ECard auxillary types.
-
- * backend/ebook/e-card-simple.h: Added a comment.
-
- * backend/ebook/e-card-types.h: Added ref_count field to all the
- types.
-
- * backend/ebook/e-card.c, backend/ebook/e-card.h: Added ref and
- unref functions here for all the ECard auxillary types. Removed
- the corresponding free functions. Switched to using these
- functions where appropriate.
-
- * gui/component/addressbook-factory.c: #include
- <e-util/e-passwords.h>
-
- * gui/component/addressbook.c (load_uri_cb): const correctify.
-
- * gui/component/select-names/e-select-names-manager.c,
- gui/component/select-names/e-select-names.c: #include
- <addressbook/gui/component/addressbook.h>
-
- * gui/widgets/e-addressbook-model.c (modify_card): Removed an
- unnecessary ref here.
-
-2001-10-11 Dan Winship <danw@ximian.com>
-
- * gui/component/select-names/e-select-names.c (update_folder):
- Don't need this any more.
-
-2001-10-11 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/addressbook.c (new_contact_cb): Check that
- view->view != NULL.
- (save_contact_cb): Check that view->view != NULL.
- (search_cb): Check that view->view != NULL.
- (delete_contact_cb): Check that view->view != NULL.
- (print_cb): Check that view->view != NULL.
- (print_preview_cb): Check that view->view != NULL.
- (stop_loading_cb): Check that view->view != NULL.
- (cut_contacts_cb): Check that view->view != NULL.
- (copy_contacts_cb): Check that view->view != NULL.
- (paste_contacts_cb): Check that view->view != NULL.
- (select_all_contacts_cb): Check that view->view != NULL.
- (send_contact_cb): Check that view->view != NULL.
- (send_contact_to_cb): Check that view->view != NULL.
- (update_command_state): Check that view->view != NULL. Hold a
- reference to the AddressbookView for the duration of the function,
- in case we exit during bonobo-reentrancy.
- (addressbook_view_ref): Added.
- (addressbook_view_unref): Added. Simple ref counting for
- AddressbookView objects.
- (addressbook_view_clear): Zero out an AddressbookView. This is
- now separated from the deallocation of the AddressbookView object,
- so that we don't leave a dangling pointer if we exit during
- bonobo-reentrancy in update_command_state. (Which often seems to
- happen if we exit while addressbook operations are going on.)
- (destroy_callback): Replace previous call to addressbook_view_free
- with addressbook_view_clear/addressbook_view_unref calls.
- (addressbook_factory_new_control): Initialize the reference count
- in the AddressbookView object.
-
- * gui/widgets/e-addressbook-view.c (e_addressbook_view_destroy):
- Carefully zero out our destroyed object.
- (command_state_change): Hold a reference to ourselves during the
- signal emission.
- (get_selected_cards): Ref cards as we add them to the list.
- (e_addressbook_view_stop): Check for view != NULL.
- (e_addressbook_view_can_create): Check for view != NULL.
- (e_addressbook_view_can_print): Check for view != NULL.
- (e_addressbook_view_can_save_as): Check for view != NULL.
- (e_addressbook_view_can_send): Check for view != NULL.
- (e_addressbook_view_can_send_to): Check for view != NULL.
- (e_addressbook_view_can_delete): Check for view != NULL.
- (e_addressbook_view_can_cut): Check for view != NULL.
- (e_addressbook_view_can_copy): Check for view != NULL.
- (e_addressbook_view_can_paste): Check for view != NULL.
- (e_addressbook_view_can_select_all): Check for view != NULL.
- (e_addressbook_view_can_stop): Check for view != NULL.
-
- * gui/widgets/e-addressbook-model.c (addressbook_destroy): Be
- careful about zeroing out our destroyed object.
-
- * backend/ebook/e-book-view.c (e_book_view_stop): Added. Stops
- event processing in the underlying listener.
-
-2001-10-10 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_destroy): If our select names dialog is
- still around, destroy it. Otherwise, the dialog will hang around
- after our composer goes away.
-
-2001-10-06 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-config.glade: add an Email Address
- field/label/help text.
-
- * gui/component/addressbook-config.c
- (addressbook_source_dialog_set_source): fill in the email entry
- from the source. also, set the initial state of the email
- label/entry.
- (auth_checkbutton_changed): set the email label/entry
- sensitive/editable if auth is turned on, and
- insensitive/uneditable if it's off.
- (addressbook_source_dialog_get_source): get the email address from
- the email entry.
- (addressbook_source_dialog): hook up the email entry to the
- changed signal foo, as well as the focus handler for displaying
- help text.
-
-2001-10-06 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_new): db isn't a BonoboObject, so don't
- bonobo_object_unref it!
-
-2001-10-05 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (addressbook_model_set_uri): e_book_load_uri ->
- addressbook_load_uri.
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_new): e_book_load_uri ->
- addressbook_load_uri.
-
- * gui/component/addressbook.c (forget_passwords_cb): new function,
- call e_passwords_forget_passwords.
- (verbs): Add ContactsForgetPasswords.
- (load_uri_auth_cb): new function, call the callback and free up
- our closure stuff.
- (load_uri_cb): once the uri is loaded, check if we're configured
- to authenticate for it, and do so, using the e_passwords stuff.
- (addressbook_load_uri): wrapper around e_book_load_uri. save off
- the parameters and start the load-with-auth machinery.
- (book_open_cb): remove all the auth stuff from here, as it's
- handled elsewhere now.
-
- * gui/component/addressbook-factory.c (main): call
- e_passwords_init.
-
- * gui/component/addressbook-component.c (user_create_new_item_cb):
- e_book_load_uri -> addressbook_load_uri.
- (destination_folder_handle_drop): same.
-
- * gui/component/addressbook.h: add prototype for
- addressbook_load_uri (a wrapper around e_book_load_uri that also
- handles authentication if the user selects it.)
-
-2001-10-05 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (real_add_address_cb): Check to make sure our call to
- e_addressbook_model_get_card doesn't return NULL.
-
- * gui/widgets/e-addressbook-model.c
- (e_addressbook_model_get_card): Chek that we aren't requesting a
- negative row.
-
- * gui/contact-list-editor/e-contact-list-editor.c (add_email_cb):
- Move to the bottom of the scrolled window, so we can see the
- address we just added.
- (table_drag_data_received_cb): Move to the bottom of the scrolled
- window, so we can see the contact we just dropped.
-
- * gui/component/addressbook.c (addressbook_factory_new_control):
- We don't own the string returned by e_categories_master_list_nth,
- so terrible things will happen if we free it. (Bug 10916)
-
-2001-10-05 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (e_addressbook_view_set_arg):
- don't set the editable field on the model - let the book do that.
- (book_writable_cb): call writable_status to propagate a ui-change
- event up (and sensitize the write-only toolbar buttons after you
- authenticate with ldap.)
-
-2001-10-04 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book.c (activate_factories_for_uri): for some
- reason, matching on protocol is causing problems for me.
- disabling it for now.
-
-2001-10-04 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c: use ldap.png for ldap
- contacts.
-
-2001-10-03 Iain Holmes <iain@ximian.com>
-
- * addressbook/gui/component/addressbook-storage.c
- (addressbook_storage_setup): Only load_storages if you have LDAP.
- (load_source_data): Only do stuff if you have LDAP.
-
-2001-10-03 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-reflow-adapter.c (addressbook_height),
- gui/widgets/e-minicard.c (remodel): Fixed these to determine the
- fields to use properly.
-
-2001-10-02 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (name_style_query): Strip out commas before forming our query.
- (match_name): Use e_card_compare_name_to_string_full, rather
- than our crufty old matching code. Not only is this cleaner,
- but that crufty old code was very broken when it came to
- handling strings with whitespace. (Bug 8988)
- (match_nickname): utf8 and bug fixes.
-
- * backend/ebook/e-card-compare.c
- (e_card_compare_name_to_string_full): Added. This is basically
- e_card_compare_name_to_string with a bunch of extra options, so
- that it can more readily be reused in other contexts.
- (e_card_compare_name_to_string): This is now just a call to
- e_card_compare_name_to_string_full with the extra args filled in
- to defaults that simulate the old behavior.
-
-2001-10-02 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book.c (e_book_construct): remove most of the
- oaf stuff from here. we do it in load_uri, where we'll have more
- information (namely, the protocol we're using.)
- (activate_factories_for_uri): do an oaf query to get a list of all
- objects implementing our BookFactory interface and also supporting
- the protocol used in the uri.
- (e_book_load_uri): try activating book factories to handle this
- uri, and start the iteration over the list.
- (e_book_load_uri_from_factory): try and load the uri.
- (e_book_load_uri_open_cb): callback function for the
- BookFactory_openBook call - if it succeeds, call the user's
- callback. otherwise step to the next factory.
- (e_book_load_uri_step): go to the next factory in our list, and
- error out if there are no more.
-
-2001-10-02 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_get_textification): Made the max length of
- the textification be 2047 characters. Fixes Ximian bug #3021.
-
-2001-10-01 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (ecard_from_remote_record): if there
- was no first name or last name, file as the company.
-
-2001-10-01 JP Rosevear <jpr@ximian.com>
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_changes_foreach_key): if there is a db error,
- assume deletion
- (pas_backend_file_changes): write after all is done for efficiency
-
-2001-09-28 JP Rosevear <jpr@ximian.com>
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_changes_foreach_key): g_strdup
- (pas_backend_file_changes): ditto, make sure to free all data and
- do a hash write after each add/remove
-
- * conduit/address-conduit.c (local_record_to_pilot_record): use
- the local record category
- (local_record_from_ecard): ndle the fields and category we don't
- sync by making sure we don't overwrite them
-
-2001-09-27 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book.c (e_book_construct): do an oaf query to
- get a list of all objects implementing our BookFactory interface,
- instead of just activating the one IID. this should really be a
- global list, not a per EBook.
- (e_book_load_uri): start the iteration over our list of
- BookFactory's.
- (e_book_load_uri_from_factory): try and load the uri.
- (e_book_load_uri_open_cb): callback function for the
- BookFactory_openBook call - if it succeeds, call the user's
- callback. otherwise step to the next factory.
- (e_book_load_uri_step): go to the next factory in our list, and
- error out if there are no more.
-
-2001-09-27 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (local_record_from_ecard): use the old
- record (if there was one) so as not to overwrite fields we don't
- sync
- (pre_sync): store the dbi in the context and don't make it object
- data
-
-2001-09-26 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-book-factory.c (pas_book_factory_destroy): use
- priv->iid instead of the hardcoded string here.
- (pas_book_factory_activate): parameterize the factory's iid, as in
- the calendar server, and provide a default if iid == NULL.
-
- * backend/pas/pas-book-factory.h: add iid parameter for
- pas_book_factory_activate.
-
-2001-09-26 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-destination.c (e_destination_get_textrep): Use
- camel_address_format, not camel_address_encode.
-
-2001-09-26 Anna Marie Dirks <anna@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Added help text (thanks
- to Aaron) and re-worded the labels, and fixed the shortcuts on the
- brand-spanking-new Collaboration tab.
-
-
-2001-09-26 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-manager.h: add
- completion_book.
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_new): get /Addressbook/Completion/uri, and
- if it's present, use the corresponding EBook for completing
- addresses.
- (focus_out_cb): use manager->completion_book here instead of NULL,
- which corresponds to the local addressbook.
- (completion_popup_cb): same.
- (e_select_names_manager_create_entry): same.
-
-2001-09-26 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-card-compare.c (e_card_compare_name_to_string):
- Properly handle names when the individual elements (given,
- addition, family) contain whitespace. (Bug #10502)
-
- * backend/ebook/e-destination.c (e_destination_set_name): Reset
- textrep when we change the name.
- (e_destination_set_email): Reset textrep when we change the email.
- (e_destination_get_textrep): Make sure that the textrep version of
- the address is properly quoted if it contains unsafe characters.
- (All related to bug #10796)
-
- * gui/component/select-names/e-select-names-completion.c
- (match_nickname): Fix nickname matching. (bug #9698)
- (make_match): Use e_completion_match_new when building our match,
- rather than ad hoc manipulation of the struct.
-
-2001-09-26 JP Rosevear <jpr@ximian.com>
-
- * backend/pas/pas-backend-file.c (pas_backend_file_changes): set
- the last_use and use_score fields of the card to known values so
- the card doesn't register as changed when only they have changed
-
-2001-09-26 Peter Williams <peterw@ximian.com>
-
- * conduit/address-conduit.c (ecard_from_remote_record): Fix this function
- to set email addresses properly, and handle multiple occurrences of
- email addresses, home phone numbers, and business phone numbers.
-
-2001-09-25 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/addressbook-component.c (user_create_new_item_cb):
- Handle creating the new contact in the current folder if it's a
- contacts folder. Fixes Ximian bug #7814.
-
-2001-09-24 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/Makefile.am (LDAP_SCHEMA): add
- evolutionperson.schema
- (EXTRA_DIST): add LDAP_SCHEMA to the dist (but don't install it).
-
-2001-09-23 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (ecard_from_remote_record): sync the
- note the to pilot and make sure to blank fields when appropriate
- (local_record_from_ecard): sync the note to the desktop
-
-2001-09-22 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-file.c (do_create): g_free (id) in the
- error case to plug a memory leak.
-
-2001-09-22 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard.c (remodel): when creating the cards,
- don't display any of the subname fields (surname, given, middle,
- suffix, etc.)
-
-2001-09-22 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-card-simple.c
- (e_card_simple_get): add getters for the additional name fields.
- (field_data): move FAMILY_NAME to the end of the list, and add
- GIVEN_NAME, ADDITIONAL_NAME (middle name), and NAME_SUFFIX.
-
- * backend/ebook/e-card-simple.h: same.
-
-2001-09-21 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/addressbook.c (print_preview_cb): Hooked up print
- preview button.
-
- * gui/widgets/e-addressbook-view.c,
- gui/widgets/e-addressbook-view.h
- (e_addressbook_view_print_preview): Added this function.
-
- * printing/e-contact-print.c, printing/e-contact-print.h
- (e_contact_print_preview): Added this function.
-
-2001-09-19 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-destination.c (name_and_email_simple_query_cb):
- Use the default e-mail address if we have nothing else to go on.
- Previously we just failed, which basically meant that name-only
- searches would never work properly.
- (nickname_simple_query_cb): The logic was a bit tangled here; if
- our query status isn't SUCCESS, always give up but don't leak the
- destination. And if our nickname query fails and we try the
- name-and-email query, use the textrep for a name-only search. The
- only reason we are doing a nickname query in the first place is if
- we have an obviously invalid e-mail.
- (launch_cardify_query): Use e_destination_is_valid to determine
- if we should try a nickname query first.
- These changes basically fix bug 7728, and generally make the
- auto-cardification of addresses a lot more clever and robust.
-
- * backend/ebook/e-book-util.c (name_and_email_cb): Use
- e_card_compare_name_to_string instead of e_card_name_match_string.
- (e_book_name_and_email_query): The arguments to g_strsplit were
- in the wrong order. Doh!
-
- * backend/ebook/e-card-compare.c (e_card_compare_name_to_string):
- Added. Replaces e_card_name_match_string, and actually works.
-
- * backend/ebook/e-card.c: Removed e_card_name_match_string
- function, which didn't work particularly well.
-
-2001-09-19 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (cursor_cb): don't add to the complete
- list of cards if the card is a list
- (card_added): don't add to the list of changes if the card is a
- list
- (card_changed): ditto
- (card_removed): ditto
-
-2001-09-19 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_hookup_shell_listeners): Change the "this should
- never happen" message into a request for people to e-mail me
- directly with info if they encounter that error.
-
- * backend/ebook/e-book-util.c (e_book_name_and_email_query):
- Freeing name[i] instead of namev[i] is a bad idea. (bug #10270)
-
- * gui/component/select-names/e-select-names-popup.c
- (popup_menu_card): Properly handle our GnomeUIInfo labels so that
- they won't be leaked if they are dynamic strings, so that they
- will be i18n-correct, and so that underscores won't be interpreted
- as key accelerators. What a PITA. Also, don't leak our
- iterators. (Bug #10200.)
- (popup_menu_list): The same GnomeUIInfo tweaking as in
- popup_menu_card.
- (popup_menu_nocard): Ditto.
-
-2001-09-18 JP Rosevear <jpr@ximian.com>
-
- * backend/ebook/e-card-simple.c (field_data): add caluri field data
-
- * backend/ebook/e-card.c (e_card_get_vobject): add the caluri
- property when appropriate
- (parse_caluri): handle read caluri
- (e_card_class_init): add caluri arg
- (e_card_destroy): free the caluri
- (e_card_get_arg): return caluri arg
- (e_card_set_arg): set caluri from arg
- (e_card_init): init caluri to null
-
- * backend/ebook/e-card-simple.h: new simple field
-
- * backend/ebook/e-card.h: new member
-
- * gui/contact-editor/e-contact-editor.c (field_changed): util
- callback to change the command state
- (set_entry_changed_signal_field): hook up a change signal to above
- (set_entry_changed_signals): use above function
-
- * gui/contact-editor/e-contact-editor.glade: Add collaboration
- page and fields
-
-2001-09-18 JP Rosevear <jpr@ximian.com>
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_build_cards_list): create a sexp and check if
- the cards match before adding them to the list
- (pas_backend_file_process_get_cursor): send extra param
-
-2001-09-18 Larry Ewing <lewing@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (book_query_process_card_list): unref the destination regardless
- of whether we get an email addresss.
-
-2001-09-17 Larry Ewing <lewing@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (name_style_query): use g_strfreev.
- (match_name): s/g_free/g_strfreev.
- (match_file_as): s/g_free/g_strfreev.
-
- * backend/ebook/e-book-util.c (e_book_name_and_email_query): fix
- the memory handling here. All there members of the vector need to
- be freed all the time.
-
- * backend/ebook/load-pine-addressbook.c (parse_line): free the
- string outside of the test that makes sure there are three
- entries.
-
- * gui/component/select-names/e-select-names-completion.c
- (match_nickname): don't malloc a match we will never use.
-
- * gui/widgets/e-addressbook-model.c (get_view): free the dup'd
- capabilities.
-
-2001-09-17 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-destination.c (e_destination_is_valid): We want
- to assume that a destination that comes from a card is
- automatically valid, but the right way to check that is by calling
- e_destination_from_card, not by checking if dest->priv->card !=
- NULL. (Fixed bug #10017)
-
- * gui/component/select-names/e-select-names-completion.c
- (match_name): Fixed a stupid bug was causing completion to fail
- for contacts who have only one name. (The classic example we all
- know and love is 'George <jirka@5z.com>') (bug #8353)
-
- * backend/ebook/e-card.c (e_card_list_send): Do the right thing if
- the card we are trying to send to has no valid e-mail addresses.
- (bug #10137)
-
- * gui/widgets/e-minicard.c (e_minicard_event): Code implicitly
- assumed that event->button.button is 1, 2, or 3, causing disaster
- when using a wheel-mouse. Fixed. (bug #9400)
-
-2001-09-16 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (_phone_arrow_pressed):
- use enable_widget instead of gtk_widget_set_sensitive.
- (_email_arrow_pressed): same.
- (_address_arrow_pressed): same.
- (disable_widget_foreach): same.
- (enable_writable_fields): same.
- (set_editable): same.
- (enable_widget): new function, using both gtk_widget_set_sensitive
- and *_set_editable to allow the user to select text in GtkEntry's
- and GtkText's.
-
- * gui/contact-editor/e-contact-editor-fullname.c
- (e_contact_editor_fullname_set_arg): use set_editable as well as
- set_sensitive, to allow the user to select text in GtkEntry's.
-
- * gui/contact-editor/e-contact-editor-address.c
- (e_contact_editor_address_set_arg): same.
-
-2001-09-16 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/evolutionperson.schema: fix syntax errors (which are
- broken, imo...)
-
-2001-09-16 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-storage.h: reorder the LDAP scopes so
- that they match the order of the option menus in the glade file.
-
- * gui/component/addressbook-config.c (auth_checkbutton_changed):
- new function, mostly there to house some #ifdef'ed out code.
- (option_menuitem_activated): new function, to keep track of
- changes to the ldap scope optionmenu.
- (addressbook_source_dialog_set_source): set the menu history as
- well as the dialog's copy of the scope.
- (addressbook_source_dialog_get_source): fill in the source's scope
- from the dialog's copy, and add more #if the_ui_gods_smile_on_me
- code.
- (add_activate_cb): new function, add an activate callback for the
- optionmenu's items.
- (addressbook_source_dialog): more #if the_ui_gods_smile_on_me
- code, always start the dialog on page 0, and hook up the
- scope optionmenu's items.
-
-2001-09-15 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-card-compare.c (e_card_compare_name): No
- loose name matches on family names. (#8802)
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_activate_obj): We can't use NULL as the
- first arg for e_addressbook_show_contact_editor anymore. Damn.
- (#8535)
-
- * backend/ebook/e-book-listener.c (e_book_listener_stop): Make
- "stop" do nothing but set the stopped flag, as in
- e-book-view-listener.c.
- (e_book_listener_destroy): Clean up our queue here, rather than in
- e_book_listener_stop.
- (response_free): Added. Move the rather lengthy bit of code
- needed to free a EBookListenerResponse into one place.
- (e_book_listener_check_queue): Properly deal with the stopped
- flag.
- (e_book_listener_queue_response): If the stopped flag is set, just
- drop the incoming response.
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_stop): Make "stop" do nothing but set the
- stopped flag.
- (e_book_view_listener_destroy): Move all of the clean-up that used
- to be in e_book_view_listener_stop here. This considerably simplifies
- the logic required to avoid various race conditions.
- (e_book_view_listener_check_queue): Properly deal with the stopped flag.
- (e_book_view_listener_queue_response): Drop all incoming responses if
- we are stopped.
-
-2001-09-14 Jon Trowbridge <trow@ximian.com>
-
- * backend/pas/pas-book.c (pas_book_queue_request): Hold a
- reference to the book on behalf of our idle function.
- (pas_book_check_queue): When we are finished, drop the reference
- we've been holding on behalf of the idle function.
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_process_create_card): Hold a reference to the
- book_view while sending our notifications.
- (pas_backend_file_process_remove_card): Hold a reference to the
- book_view while sending our notifications.
-
- * gui/contact-editor/e-contact-quick-add.c (quick_add_unref): Remove
- debugging spew.
-
- * backend/ebook/e-book-util.c: Remove a lot of unused code that
- worked around bugs that have long since been fixed.
- (simple_query_disconnect): Added. Breaks out the part of
- simple_query_free that disconnect signals.
- (simple_query_free): Replace code w/ a call to
- simple_query_disconnect.
- (simple_query_sequence_complete_cb): Call simple_query_disconnect
- before executing the callback, so that our callbacks don't get
- triggered by any book changes that might occur during that
- callback.
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_check_queue): Changed to be consistent with
- e_book_listener_check_queue.
- (e_book_view_listener_queue_response): Also changed to use a
- high-frequency timeout.
-
- * backend/ebook/e-book-listener.c (e_book_listener_check_queue):
- OK, I've agonized over this stupid little function, and it should
- now be race-free.
- (e_book_listener_queue_response): We process our response queue in
- a high-frequency timeout rather than an idle. Using an idle
- function leads to some tricky race conditions and bad interactions
- with bonobo's semi-broken attempts to take over event processing.
- (e_book_view_listener_stop): Manually disable our timeout and
- clean up.
-
-2001-09-14 Ettore Perazzoli <ettore@ximian.com>
-
- [Automake 1.5 fixes pointed out by Richard Boulton
- <richard@tartarus.org>, as per #9258.]
-
- * gui/component/select-names/Makefile.am: Set CLEANFILES directly
- instead of using `+='.
-
- * backend/pas/Makefile.am: Rename `LDAP_BACKEND_SOURCES' to
- `LDAP_BACKEND_FILES'.
-
- * backend/ebook/Makefile.am: Set CLEANFILES directly instead of
- using `+='.
-
-2001-09-13 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_connect): use
- ldap_init. ldap_open is deprecated in openldap 2.x.
-
-2001-09-12 Iain Holmes <iain@ximian.com>
-
- * backends/ebook/evolution-vcard-importer.c (check_file_is_vcard):
- Fix the check.
-
-2001-09-12 Larry Ewing <lewing@ximian.com>
-
- * backend/ebook/e-destination.c: free the values that are being
- leaked here.
-
-2001-09-12 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c (match_email):
- printf arguments were reversed by mistake. Fixed bug #9693.
-
-2001-09-09 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-popup.c
- (popup_menu_list): Added. Treat right-clicks on a contact list as
- a special case.
- (e_select_names_popup): Check if we are dealing with a contact
- list.
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_check_queue): See
- e_book_listener_check_queue below.
- (e_book_view_listener_queue_response): See
- e_book_listener_queue_response below.
-
- * backend/ebook/e-book-listener.c (e_book_listener_check_queue):
- Explicitly prohibit reentrancy. Use gtk-unref rather than
- bobobo-unref.
- (e_book_listener_queue_response): Hold a gtk-ref to the listener
- while the idle function runs, not a bonobo-ref. As far as I can
- tell, it is impossible to avoid a race condition here when we have
- to worry about bonobo reentrancy.
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_insert_length): Alter a copy of the
- original EDestination, rather than just using a new one. We need
- to do this to preserve prior-card information for possible
- reversion later.
- (e_select_names_text_model_delete): Ditto.
-
- * backend/ebook/e-destination.c (e_destination_clear_card): When
- clearing a destination where ->card != NULL, store it for possible
- reversion later.
- (e_destination_revert): If we have an old card stored, go back to
- using it for the destination.
- (e_destination_is_valid): Tries to detect obviously broken
- addresses.
- (e_destination_cardify): If our destination is invalid, first try
- to cardify simply by reverting to an older card.
- (e_destination_destroy): Unref any cached old card.
- (e_destination_copy): Copy the old card information.
-
-2001-09-07 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (sync_table_and_models): Show all rows in the table, and then
- remove the rows that correspond to entries in the
- ESelectNamesModels in the children.
- (real_add_address): Freeze/thaw our ESelectNamesModel, so that we
- don't change our table while we are in the middle of iterating
- over the selection.
- (remove_address): Just delete the address from the
- ESelectNamesModel, the signal handler will do the rest.
- (selected_rows_foreach_cb): Call remove_address to do our dirty
- work.
- (e_select_names_add_section): Connect to the 'changed' signal from
- the ESelectNamesModel, and call sync_table_and_models explicitly to
- get our initial state correct.
-
- * gui/component/select-names/e-select-names-table-model.c
- (fill_in_info): Deal with EDestinations in our table that don't
- come from cards.
-
- * gui/component/select-names/e-select-names-manager.c: Added
- another ESelectNamesModel* to the ESelectNamesManagerSection
- struct. Called 'original_model', this contains a copy of the
- model as it is when we begin using the SelectNames dialog.
- (section_copy): Copy the original model.
- (section_free): Free the original model.
- (e_select_names_manager_add_section_with_limit): Initialize the
- original model.
- (e_select_names_clicked): I've changed the semantics of this
- dialog quite a bit... no UI freeze can stop me! If OK is clicked,
- we do nothing. If Cancel is clicked, we revert to the
- 'original_model' copy of our address entry state before we started
- editting. Finally, we close the dialog before any of thing. Doing
- it last caused problems, because signals were being triggered
- which had dangling pointers as their closures.
- (e_select_names_manager_activate_dialog): Copy our current state
- to the original model, and share the same ESelectNamesModel
- between the dialog and the address entry in the composer..
- (e_select_names_manager_get_cards): Removed. It had been
- #if 0/#endif-ed out for a while.
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_freeze): Added.
- (e_select_names_model_thaw): Added.
- (e_select_names_model_uncardify): Added. If possible,
- "uncardifies" a specific model entry.
- (e_select_names_model_changed): Changed to pay attention
- to the freeze count.
-
- * gui/component/select-names/e-select-names-completion.c
- (clean_query_text): Strip leading/trailing whitespace from
- queries.
-
- * backend/ebook/e-destination.c (e_destination_uncardify): Added.
- Converts a card-associated destination into a text-associated
- destination w/ the e-mail address.
- (e_destination_list_to_vector): Added. A convenience routine.
- (e_destination_freev): Added. A convenience routine.
- (e_destination_touchv): Added. I'm lazy.
-
-2001-09-08 Chris Toshok <toshok@ximian.com>
-
- (make_contact_editor_cb): show the right contact editor (the list
- editor for list cards).
-
-2001-09-08 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-popup.c
- (popup_menu_card): do the EDestination xml magic on email
- addresses we put in the popup.
-
-2001-08-27 Zbigniew Chyla <cyba@gnome.pl>
-
- * gui/component/addressbook.c (addressbook_factory_new_control):
- For every category:
- - set .translate to FALSE (e_categories_master_list_nth returns
- translated category name)
- - convert category name in UTF-8 to locale's encoding
-
-2001-08-23 Zbigniew Chyla <cyba@gnome.pl>
-
- * gui/component/select-names/e-select-names-popup.c
- (popup_menu_card): Fixed two bugs:
- - missing coversion of contact name to GTK+ locale,
- - passing dynamically created string (contact name) inside uiinfo struct
- to gnome-app-helper functions.
- Remember: these functions may change strings, trying to translate them!
- (popup_menu_nocard): Ditto
-
-2001-09-07 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/addressbook-component.c: Removed unused factory
- variable.
-
-2001-09-06 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-storage.c (notify_listener): new
- function, notify the bonobo listener.
- (remove_ldap_folder): track change to EvolutionStorage signal.
- (create_ldap_folder): same, and make sure the type is
- "ldap-contacts".
- (load_source_data): folders that we create should have
- "ldap-contacts" as their type.
- (addressbook_storage_add_source): same.
-
- * gui/component/addressbook-component.c: (folder_types): add
- "ldap-contacts", for display of ldap servers (they get their own
- icon, and their own name in the Create New Folder dialog.
- (create_view): use IS_CONTACT_TYPE since we support two folder
- types now.
- (create_folder): same.
- (remove_folder): same.
- (xfer_folder): same.
-
-2001-09-06 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c: (pixmaps): change
- /Toolbar/ContactEditorSave to /Toolbar/ContactEditorSaveClose.
-
-2001-09-06 Chris Toshok <toshok@ximian.com>
-
- * gui/component/Makefile.am (INCLUDES): add -DEVOLUTION_IMAGESDIR.
-
- * gui/widgets/e-addressbook-view.c (card_deleted_cb): remove
- status messages from here.
- (e_addressbook_view_delete_selection): same.
-
- * gui/widgets/e-addressbook-model.c (sequence_complete): emit a
- NULL status message along with the stop_state_changed. The null
- status message will clear the status bar for this view.
-
- * gui/component/addressbook.c (set_status_message): use the
- EvolutionActivityClient stuff.
-
- * backend/pas/pas-backend-ldap.c (view_destroy): remove status
- message for abandoning a search.
- (ldap_op_process_current): wrap status messages in _().
- (ldap_op_process): same.
- (create_card_handler): same, and remove the notify_status for ""
- and add a notify_complete call after the card is added.
- (remove_card_handler): same.
- (modify_card_handler): same.
- (poll_ldap): wrap status messages with _(), and remove the "Search
- Complete" message.
- (ldap_search_handler): wrap status message.
-
- * backend/pas/pas-backend-file.c (pas_backend_file_search): use
- _() on status messages, and make sure the last notify_* called is
- notify_complete.
-
-2001-09-05 Ettore Perazzoli <ettore@ximian.com>
-
- [Fix #958, ShellComponents should not be created by factories, for
- the addressbook.]
-
- * gui/component/addressbook-component.c
- (GNOME_EVOLUTION_ADDRESSBOOK_COMPONENT_FACTORY_ID): Removed.
- (GNOME_EVOLUTION_ADDRESSBOOK_COMPONENT_ID): New.
- (create_component): Renamed from `factory_fn'. Just register the
- thing on OAF.
- (addressbook_component_factory_init): Just call it.
-
- * gui/component/GNOME_Evolution_Addressbook.oaf.in: Remove the
- ShellComponentFactory.
-
-2001-09-04 Iain Holmes <iain@ximian.com>
-
- * backend/ebook/evolution-vcard-importer.c (load_file_fn): Return FALSE
- if the file isn't a valid VCard file.
-
-2001-08-05 Zbigniew Chyla <cyba@gnome.pl>
-
- I18n fixes (mainly making buttons on the right side less Anglocentric :-)
-
- * backend/ebook/e-card-simple.c
- (field_data): Marked "name" and "short_name" fields for translation.
- (e_card_simple_get_name, e_card_simple_get_short_name): Return
- localized version of the name (using U_() macro).
-
- * gui/contact-editor/e-contact-editor.c (set_entry_changed_signals):
- Connect "changed" signal from "entry-web" entry to widget_changed.
- (changing this field wasn't making "Save and Close" button sensitive)
-
- * gui/widgets/Makefile.am (glade_DATA): Removed alphabet.glade.
-
- * gui/widgets/e-addressbook-view.c
- (button_labels, button_letters): New strings containing a list of
- labels and "values" of all buttons placed on the right side of the
- addressbook view (intended for localization).
- (struct LetterClosure): Changed the type of letter field to gunichar.
- (e_utf8_split): New function, similar to g_strsplit, but operates on
- UTF-8 strings.
- (jump_to_letter): Don't hardcode letters, build queries dynamically
- using UTF-8 and localized letters stored in button_letters.
- (connect_button): Removed.
- (create_alphabet): Don't use glade file, build buttons manually using
- (localized) labels from button_labels. Use (localized) values from
- button_letters when creating LetterClosure.
-
- * gui/widgets/e-minicard-view-widget.[ch]
- (e_minicard_view_widget_jump_to_letter): Changed the type of the
- second argument from char to gunichar.
-
- * gui/widgets/e-minicard-view.c
- (compare_to_utf_str): Renamed from compare_to_letter, now operates on
- UTF-8 string.
- (e_minicard_view_jump_to_letter): Changed the type of the second
- argument from char to gunichar + conversion to UTF-8 string.
-
- * gui/widgets/e-minicard-view.h
- (e_minicard_view_jump_to_letter): Changed the type of the second
- argument from char to gunichar.
-
-2001-09-02 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-book.c (e_book_add_card, e_book_commit_card),
- backend/pas/pas-backend-file.c (do_create),
- backend/pas/pas-backend-ldap.c
- (create_card_handler, remove_card_handler, modify_card_handler,
- pas_backend_ldap_process_get_vcard, poll_ldap): Use
- e_card_get_vcard_assume_utf8 instead of e_card_get_vcard here
- since all internal communications and database storage are assumed
- to be utf8.
-
- * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h
- (e_card_simple_duplicate): Simplified this function considerably.
- (e_card_simple_get_vcard_assume_utf8): Added this function.
-
- * backend/ebook/e-card.c, backend/ebook/e-card.h (e_card_new,
- e_card_load_cards_from_file, e_card_load_cards_from_string): Made
- these functions pay attention to charset attributes.
- (e_card_new_with_default_charset,
- e_card_load_cards_from_file_with_default_charset,
- e_card_load_cards_from_string_with_default_charset): New functions
- that let you change the default charset from UTF-8.
- (e_card_get_vcard): Made this write out charset attributes when
- necessary.
- (e_card_get_vcard_assume_utf8): New function that writes out a
- card without writing out charset attributes.
-
- * backend/ebook/evolution-vcard-importer.c (book_open_cb),
- backend/ebook/load-gnomecard-addressbook.c (book_open_cb),
- backend/ebook/test-card.c (main),
- gui/component/addressbook-component.c
- (destination_folder_handle_drop), gui/contact-editor/test-editor.c
- (main), gui/contact-list-editor/e-contact-list-editor.c
- (table_drag_data_received_cb), gui/widgets/e-addressbook-view.c
- (selection_received), gui/widgets/e-minicard-control.c
- (pstream_load): Changed the default charset to be used here to
- ISO-8859-1.
-
- * backend/ebook/load-gnomecard-addressbook.c (add_card_cb),
- backend/ebook/load-pine-addressbook.c (add_card_cb),
- backend/ebook/test-client-list.c (get_cursor_cb),
- backend/ebook/test-client.c (get_cursor_cb, get_card_cb): Use
- e_card_get_vcard_assume_utf8 to print out testing strings.
-
- * gui/component/select-names/e-select-names-model.c,
- gui/component/select-names/e-select-names-model.h
- (e_select_names_model_contains): Changed this to be const
- EDestination *dest to fix a warning.
-
- * gui/contact-editor/e-contact-editor.c (e_contact_editor_init):
- Translate window title here.
-
-2001-08-31 Zbigniew Chyla <cyba@gnome.pl>
-
- * gui/component/addressbook-storage.c
- (addressbook_get_other_contact_storage): s/_/U_/
-
- * gui/widgets/e-addressbook-reflow-adapter.c (addressbook_compare):
- Use g_utf8_collate.
-
- * gui/widgets/e-minicard.c (e_minicard_compare):
- Ditto.
-
- * printing/e-contact-print.c (card_compare):
- Ditto.
-
-2001-08-29 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_clicked): Use e_select_names_model_merge to
- combine the selected names with any existing ones. This causes
- you to not lose addresses typed directly into the entry while the
- SelectNames dialog is up. (Bug #8058)
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_merge): Merge the contents of one
- ESelectNamesModel into another, avoiding duplicates.
-
- * backend/ebook/e-destination.c (e_destination_equal): Added.
- Determines if two destinations appear to refer to the same
- recipient.
-
- * backend/ebook/e-card.c (e_card_list_send): Added cast to
- g_free args to silence compiler warnings.
-
- * gui/contact-editor/e-contact-quick-add.c (quick_add_set_name):
- Paranoia. Check that name != qa->name.
- (quick_add_set_email): Check that email != qa->email.
- (ce_have_book): Store the QuickAdd data structure in object data,
- so that we can be extra-careful and avoid having a dangling
- pointer floating around out somewhere as the closure for a signal.
- Fixes bug #8155, I think.
- (card_added_cb): Clear object data to ensure single unref.
- (editor_closed_cb): Clear object data to ensure single unref.
-
- * gui/component/select-names/e-select-names-completion.c
- (book_query_score): Make sure that comp->priv->query_text isn't
- NULL. (Fixes bug #8195)
-
- * backend/ebook/e-book-listener.c (e_book_listener_check_queue):
- This function can be re-entrant during the signal emission; Added
- extra ref/unrefs and checks to avoid problems if this happens.
- This is similar to my recent changes to
- e_book_view_listener_check_queue. (Fixes bug #7400)
-
-2001-08-27 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c: Get rid of a warning by
- initializing the closing NULL element in folder_types correctly.
-
- * gui/component/select-names/e-select-names.c: Updated to match
- the studlyCapsification of attributes in shell/Evolution*.idl.
-
-2001-08-27 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (sexp_file_as): Added. Generated queries against file_as.
- (match_file_as): Added. Match results of queries against
- file_as. (Bug #8152)
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_check_queue): Added ref/unref pair to make
- sure that our listener doesn't get finalized during the signal
- emission and leave us with a dangling pointer. (Bug #7661)
-
- * backend/ebook/e-card.c (e_card_list_send): Removed some debugging
- spew that I left in by mistake.
-
- * gui/widgets/e-addressbook-model.c (create_card): Removed debugging
- spew.
-
- * backend/ebook/e-card.c (e_card_list_send): Do the right thing if
- the card we are trying to send to is a contact list. (Bug #6580)
-
-2001-08-27 Zbigniew Chyla <cyba@gnome.pl>
-
- * gui/widgets/e-addressbook-util.c (e_addressbook_error_dialog):
- Display localized status string (added missing _()).
-
-2001-08-24 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-destination.c (e_destination_set_card): Put a
- freeze/thaw around our the set of operations that changes the
- internal state of our card, so 'changed' signal callbacks won't be
- invoked on a card in an intermediary state. This fixes the bug
- that was causing the e-mail addresses in cards to be blank when
- replying to a message. (An unexpected side-effect of toshok's
- change on 8/22 to make sure that priv->email != NULL).
- (e_destination_get_name): Code slightly rearranged for (IMO)
- clarity.
-
-2001-08-23 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard.c (e_minicard_event): add
- BUTTON_PRESS_MASK so double clicks still work.
-
-2001-08-23 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (addressbook_query_changed): switch
- "full_name" to "x-evolution-any-field" in all the queries where we
- want to match all cards, since the backends universally handle
- this special case more efficiently.
-
-2001-08-22 Jon Trowbridge <trow@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c (extract_info):
- In the GUI, the toggle is labelled "hide addresses", not "show
- addresses" -- so we have to reverse the boolean value we read in.
- (fill_in_info): Same bug as before: since the GUI reads "hide", we
- have to initialize the toggle to '!show_addresses', not
- 'show_addresses'.
-
- * backend/ebook/e-destination.c
- (e_destination_list_show_addresses): Added.
- (e_destination_xml_encode): Encode the value of
- e_destination_list_show_addresses into the XML.
- (e_destination_xml_decode): Read and store the "show_addresses"
- flag.
-
-2001-08-22 jacob berkman <jacob@ximian.com>
-
- * gui/component/e-address-popup.c (emit_event): emit an event from
- our event source
- (contact_editor_cb): emit a destroy event so our control frame can
- be destroyed.
- (edit_contact_info_cb): emit a hide event so our control frame can
- be hidden
- (e_address_popup_cardify):
- (add_contacts_cb): emit the destroy event
- (e_address_popup_factory_new_control): don't unref our object at
- widget destroy time as that was really really broken
- (e_address_popup_factory_new_control): create an event source and
- aggregate ourself with it
-
- * gui/contact-editor/e-contact-editor.c (enable_writable_fields):
- display a nicer warning when we can't find a widget for a given
- field
- (e_contact_editor_raise): only raise if there is a window
-
- * gui/contact-editor/contact-editor.glade: name some widgets that
- got unnamed, and set the first entry as defaultable
-
- * gui/contact-editor/e-contact-editor.c: envelope printing is
- disabled in 1.0
-
-2001-08-22 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-destination.c (e_destination_get_email): make
- sure we don't get into a situation where priv->email == NULL.
-
-2001-08-21 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard.c (e_minicard_event): if we're dragging,
- drag_button_down won't be true in the BUTTON_RELEASE case, since
- we set it to false in MOTION_NOTIFY once the threshold is reached.
- (e_minicard_drag_end): remove this function, since it was needed
- to work around a bug in gnome-canvas.
-
-2001-08-20 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_addressbook_create_ebook_table): Wrap our addressbook table
- adapter in an ETableWithout, so that we can make addresses appear
- and disappear when we remove/add them to the section lists
- (To/Cc/Bcc) on the right of the dialog.
- (real_add_address_cb): When we add an address, hide it in the main
- list.
- (e_select_names_init): Get pointer to our without table from the
- table's object data, and store it.
- (remove_address): When we remove an address, show it in the main
- list.
- (card_key): Added. Allocate a unique key from an ECard.
- (esn_get_key_fn): Added. Callback for ETableWithout.
- (esn_dup_key_fn): Added. Callback for ETableWithout.
- (esn_free_gotten_key_fn): Added. Callback for ETableWithout.
- (esn_free_duped_key_fn): Added. Callback for ETableWithout.
-
- * backend/ebook/e-card-simple.c (e_card_simple_get): Changed
- E_CARD_SIMPLE_FIELD_NAME_OR_ORG to first try the FILE_AS
- type. This allows the cards in the ESelectName dialog to
- appear in proper sort order (i.e. as 'Doe, John' rather than
- 'John Doe'). Fixes ximian #6002.
-
-2001-08-20 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-reflow-adapter.c
- (e_addressbook_reflow_adapter_class_init): fix arg info - we're
- only passing 1 GTK_TYPE_POINTER arg, not 2.
-
- * gui/widgets/e-minicard.c (e_minicard_event): lots of fixes for
- DnD. For GDK_BUTTON_PRESS, we grab immediately. For
- GDK_BUTTON_MOTION, we start the drag after a certain threshold,
- and connect to the "drag_end" signal on our canvas so we'll know
- when the drag is complete. For GDK_BUTTON_RELEASE, we release the
- grab if we were dragging and get the event.
- (e_minicard_drag_end): new function, just remove the pointer/gtk
- grabs and disconnect.
-
- * gui/widgets/e-minicard.h (struct _EMinicard): add "gint
- drag_button"
-
-2001-08-20 JP Rosevear <jpr@ximian.com>
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_changes_foreach_key): use DB_NOTFOUND const
-
-2001-08-20 JP Rosevear <jpr@ximian.com>
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_process_get_changes): null out card_sexp so that
- we don't crash when copying
-
-2001-08-20 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c: fix warnings, get compiling again
-
- * conduit/address-conduit-config.h: remove c/p typos
-
- * conduit/address-conduit.h: ditto
-
- * conduit/Makefile.am: link against the static camel
-
-2001-08-20 Damon Chaplin <damon@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c: use bigger Save icon for
- toolbar. Used Delete icon in menu.
-
- * gui/component/addressbook.c: use 'Save As' icon rather than 'Save'
- as it seems more appropriate. Also added delete icon for menu.
-
-2001-08-19 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c: Update the folder list to
- include a display name and a description.
-
-2001-08-19 Damon Chaplin <damon@ximian.com>
-
- * gui/component/addressbook.c: use new Cut/Copy/Paste/Save/Search
- icons.
-
-2001-08-19 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/addressbook.c (set_folder_bar_label),
- gui/widgets/e-addressbook-model.c,
- gui/widgets/e-addressbook-model.h (update_folder_bar_message),
- gui/widgets/e-addressbook-view.c, gui/widgets/e-addressbook-view.h
- (folder_bar_message): Set the folder bar message here. Fixes
- Ximian bug #4670.
-
- * gui/component/select-names/e-select-names-model.c (SEPLEN): Use
- strlen(SEPARATOR) here so that if the separator changes the length
- will work properly.
-
-2001-08-19 Christopher James Lahey <clahey@ximian.com>
-
- * gui/contact-editor/fulladdr.glade: Added full country list.
- Fixes Ximian bug #5123.
-
-2001-08-18 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook.c: Hook up `delete-message.png' as the
- icon for "ContactDelete".
- * gui/contact-editor/e-contact-editor.c: Likewise.
-
-2001-08-17 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-storage.h: add prototype for
- addressbook_get_other_contact_storage.
-
- * gui/component/addressbook-storage.c
- (addressbook_get_other_contact_storage): rename register_storage
- to this, and return the EvolutionStorage.
- (load_source_data): register_storage =>
- addressbook_get_other_contact_storage.
- (addressbook_storage_add_source): register_storage =>
- addressbook_get_other_contact_storage.
-
-2001-08-17 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c
- (set_entry_changed_signals): connect to the "changed" signal on
- "entry-web" to update command state.
-
-2001-08-17 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c (list_added_cb):
- call e_card_set_id on the list's card so we can continue to use
- this dialog. also, call command_state_changed if we aren't
- closing the dialog so the toolbar is properly sensitized.
- (list_deleted_cb): always close the dialog after we successfully
- delete a list.
-
- * gui/contact-editor/e-contact-editor.c (card_added_cb): call
- e_card_set_id on the card so we can continue to use this dialog
- (to modify or delete the card.)
- (card_deleted_cb): always close the dialog after we successfully
- delete a card.
-
-2001-08-17 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (addressbook_query_changed): call
- e_sexp_encode_string on the search string the user types in so it
- doesn't break sexp parsing in the wombat.
-
-2001-08-17 Damon Chaplin <damon@ximian.com>
-
- * gui/component/addressbook.c: changed to new print icon.
-
-2001-08-17 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names.c: (struct
- ESelectNamesFolder): rename physical_uri to uri, since it includes
- the addressbook.db for file: uris.
- (e_select_names_folder_free): physical_uri => uri.
- (e_select_names_option_activated): physical_uri => uri, and we
- don't need to strdup_printf "addressbook.db" onto the end anymore.
- (new_folder): if the physical_uri is a file: uri, append
- /addressbook.db onto it.
- (hookup_listener): new function, split out lots of code from
- e_select_names_hookup_shell_listener.
- (e_select_names_hookup_shell_listeners): rename
- e_select_names_hookup_shell_listener to this, and hookup both the
- local and "Other Contacts" listener, using hookup_listener.
- (e_select_names_destroy): disconnect from the
- other_contacts_listener and unref it.
-
- * gui/component/select-names/e-select-names.h (struct
- _ESelectNames): add a listener for Other Contacts, and rename
- "listener" to "local_listener."
-
-2001-08-17 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_seq_complete_cb): If we get the
- "sequence_complete" signal when we aren't searching, it means the
- addressbook changed out from under us. Clear the search cache, so
- that future completion requests won't use the out-of-date cached
- data. Also, don't unref book_view... we leave the EBookView open
- so that we can catch these addressbook changes.
- (e_select_names_completion_do_query): Don't use the book_view
- being non-NULL as a sign that another query is still running.
- (e_select_names_completion_got_book_view_cb): Properly unref any
- previous value in book_view.
-
-2001-08-17 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-reflow-adapter.c
- (e_addressbook_reflow_adapter_right_click),
- gui/widgets/e-addressbook-view.c (table_right_click): Changed the
- messages here in the right click menus.
-
-2001-08-17 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (view_destroy): unref our
- card_sexp.
- (create_card_handler): make sure to set the id of the vcard so it
- gets properly transmitted back to the BookView, and notify all
- matching BookViews to add the created card.
- (remove_card_handler): notify all matching BookViews to remove the
- card.
- (modify_card_handler): notify all matching BookViews to modify the
- card.
- (pas_backend_ldap_process_get_book_view): init card_sexp based on
- the view's search.
-
-2001-08-17 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_book_view_copy): use card_sexp.
- (pas_backend_file_book_view_free): same.
- (vcard_matches_search): use the new pas_backend_card_sexp_match_vcard call.
- (pas_backend_file_search): use card_sexp.
- (pas_backend_file_process_get_book_view): same.
-
- * backend/pas/Makefile.am (libpas_a_SOURCES): add
- pas-backend-card-sexp.[ch].
-
-2001-08-17 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/addressbook-component.c (factory_fn): Added code
- so the user can create a new contact or contact list from anywhere
- in evolution.
-
-2001-08-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * backend/pas/evolutionperson.schema: Added a closing paren.
-
-2001-08-16 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_handle_request): Renamed from _begin to
- match changes in gal 0.10.99.3.
-
- * gui/contact-editor/e-contact-quick-add.c (e_contact_quick_add):
- Check that name != NULL before we start messing with it.
- (Fixes bug #7329)
-
-2001-08-16 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (match_nickname): Boost scoring on an exact nickname match.
- Manually addressify match.
- (match_name): Manually addressify matches.
- (book_query_score): Remove automatic addressification.
-
- * gui/component/addressbook.c (addressbook_query_changed): Minor
- tweak to avoid a crash if we have a negative subid with id
- ESB_CATEGORY. This should never happen.
- (addressbook_menu_activated): Reset the entry/option when we
- select "Clear".
- Some changes to reflect renaming in ESearchBar.
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_set_property_fn): Cardify after importing destinations.
- This might fix a problem that Damon is having.
-
-2001-08-15 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-config.glade: set title of initial
- dialog to Addressbook Sources (bug #6704).
-
-2001-08-15 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-storage.c (create_ldap_folder): don't
- let people add subdirs in the ldap server storage - everything is
- toplevel there.
-
-2001-08-14 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_process_get_vcard): implement using
- search_for_dn.
-
-2001-08-14 Federico Mena Quintero <federico@ximian.com>
-
- * gui/component/addressbook.c (addressbook_factory_new_control):
- Tell the search bar to translate the subitem texts.
-
-2001-08-14 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/addressbook.c (addressbook_factory_new_control):
- Add "Any Category" option for category searches.
- (addressbook_query_changed): Do the right thing on an
- "Any Category" search.
-
-2001-08-14 Dan Winship <danw@ximian.com>
-
- * backend/pas/pas-backend-ldap.c: Fix up to match the
- pas_book_new/get_vcard changes.
-
-2001-08-14 Christopher James Lahey <clahey@ximian.com>
-
- * gui/merging/e-card-merging-book-commit-duplicate-detected.glade:
- Got rid of an extraneous _ here.
-
- * gui/widgets/e-addressbook-util.c (e_addressbook_error_dialog):
- Changed Canceled to Cancelled here. Fixes Ximian bug #2465.
-
-2001-08-14 Christopher James Lahey <clahey@ximian.com>
-
- * backend/pas/pas-book.c (pas_book_respond_get_vcard): Oops,
- forgot to write this function.
-
-2001-08-14 Christopher James Lahey <clahey@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Added focus targets
- here. Fixes part of Ximian bug #5843.
-
-2001-08-14 Christopher James Lahey <clahey@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (e_contact_editor_init):
- Grab focus here. Fixes Ximian bug #2265.
-
-2001-08-14 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/addressbook.c (addressbook_factory_new_control):
- (addressbook_query_changed): Fixed two const warnings here.
-
- * printing/e-contact-print-envelope.c,
- printing/e-contact-print-envelope.h: Fixed some missing includes
- here.
-
-2001-08-14 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-book-view.c (add_book_iterator): Call
- e_card_set_book here.
-
- * backend/ebook/e-book.c (e_book_do_response_get_vcard): Call
- e_card_set_book here.
-
- * backend/ebook/e-card.c, backend/ebook/e-card.h: Pulled out the
- part where the uri is made part of the uid. Made uri a separate
- field. Fixes Ximian bug #6490.
-
- * backend/ebook/e-destination.c, backend/ebook/e-destination.h:
- Change this to use ECard's split uids and uris.
-
-2001-08-13 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (add_to_supported_fields): don't
- g_strdup the stuff we're passing into e_list_append, since it does
- the copy for us.
- (check_schema_support): don't initialize supported_fields list
- here, since there's a gross case where the programmer/user can
- bring up the contact editor before the connection stuff is
- finished, and we don't want to crash.
- (pas_backend_ldap_init): move it here to we can guarantee it's
- there. (bug #6546).
-
-2001-08-13 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-config.c
- (addressbook_source_dialog_set_source): don't access source->auth
- if source == NULL (bug #7086).
-
-2001-08-13 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-book-listener.c,
- backend/ebook/e-book-listener.h, backend/ebook/e-book.c,
- backend/ebook/e-book.h, backend/idl/addressbook.idl,
- backend/pas/pas-backend-file.c, backend/pas/pas-book.c,
- backend/pas/pas-book.h: Changed get_card to be asyncronous.
-
- * backend/ebook/e-card.c, backend/ebook/test-client.c: Changed
- these to deal with the new get_card functionality.
-
-2001-08-11 Kjartan Maraas <kmaraas@gnome.org>
-
- * gui/component/select-names/e-select-names.c: Mark a string for translation.
- * This fixes bug #7052
- * printing/e-contact-print.h: Add headers to make it stand on itw own.
- * printing/e-contact-print.c: Marked some strings for translation.
- * printing/e-contact-print-envelope.c: Same here.
-
-2001-08-10 Jon Trowbridge <trow@ximian.com>
-
- * gui/contact-editor/e-contact-quick-add.c (e_contact_quick_add):
- Remove single- or double-quotes from names before sticking them
- into the addressbook. (Bug #6499)
-
- * gui/component/addressbook.c (addressbook_query_changed):
- Properly handle "Category is" queries by checking the search bar
- suboption.
- (addressbook_factory_new_control): Attach subitems corresponding
- to all wombat categories to the "Category is" ESearchBarItem.
-
- * gui/component/addressbook.c: Set the ESearchBarItem
- subitems explicitly to NULL.
-
-2001-08-10 Anna Marie Dirks <anna@ximian.com>
- * gui/component/select-names/select-names.glade: did a little
- packing-magic to get the two tables at bottom of this dialog
- to seem to line up.
-
- *gui/component/select-names/e-select-names.c: changed the title
- of this dialog to "Select Contacts from Addressbook".
-
-2001-08-09 Anna Marie Dirks <anna@ximian.com>
- * gui/component/select-names/select-names.glade: redesigned
- this dialog to fix bug #6815.
-
- *gui/component/select-names/e-select-names.c: connected the
- widgets (or one of them anyway. clahey did the rest) for my
- new and lovely glade file.
-
-2001-08-09 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c: remove passwd_cb.
-
-2001-08-09 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-text-model.c
- This change is dedicated to Jacob Berkman.
- (e_select_names_text_model_insert_length): If the last character
- we inserted was a "magic comma", remember its position.
- (e_select_names_text_model_delete): If the last character we
- inserted was a "magic comma", and if the next thing we do is to
- hit backspace, delete both the comma and the extra whitespace we
- added.
- (e_select_names_text_model_init): Initialize our last magic comma
- position.
-
-2001-08-09 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_create_entry): Hook up some magic to
- (basically) cardify an entry on focus-out. (What we do is actually
- more complicated than that.)
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_set_property_fn): After we set an entry's text, try to
- cardify it. We need to do this so that (for example) reply
- e-mails get properly cardified.
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_duplicate): Use e_select_names_model_append,
- rather than manipulating lists directly.
- (e_select_names_model_insert): Connect "changed" signal proxy for
- added EDestination.
- (e_select_names_model_append): Ditto.
- (e_select_names_model_replace): Ditto, and disconnect signals for
- replaced EDestination.
- (e_select_names_model_delete): Ditto on the disconnection.
- (e_select_names_model_delete_all): Ditto.
- (e_select_names_model_cardify): Added. Try to cardify a specified
- EDestination.
- (e_select_names_model_cancel_cardify): Added. Cancel the pending
- cardification of a single EDestination.
- (e_select_names_model_cardify_all): Added. Cardify all of the
- EDestinations in the model.
- (e_select_names_model_cancel_cardify_all): Added. Cancel's any
- and all pending cardifications.
-
- * backend/ebook/e-destination.c (e_destination_class_init): Added
- "changed" and "cardified" signals.
- (e_destination_freeze): Added (static).
- (e_destination_thaw): Added (static).
- (e_destination_clear_card): Reset allow_cardify and
- cannot_cardify, cancel any pending cardifications, and emit the
- "changed" signal.
- (e_destination_clear_strings): Emit the "changed" signal.
- (e_destination_clear): Do freeze/thaw to prevent multiple signal
- emissions.
- (e_destination_set_card): Check that the card we are setting is
- not equal to the current card, and emit the "changed" signal if we
- are actually changing.
- (e_destination_set_card_uri): Emit "changed" signal, if necessary.
- (e_destination_set_name): Emit "changed" signal, if necessary.
- (e_destination_set_email): Emit "changed" signal, if necessary.
- (e_destination_set_html_mail_pref): Emit "changed" signal, if
- necessary.
- (use_card_cb): If we've just loaded/set the ECard, emit the
- "changed" signal.
- (e_destination_set_raw): Emit "changed" signal, if necessary.
- (e_destination_allow_cardification): Added.
- (e_destination_set_allow_cardification): Added.
- (e_destination_cardify): Added. Tries to automatically convert
- a string-based EDestination to one based on an ECard.
- (e_destination_cardify_delayed): Added. Cardifies in a timeout.
- (e_destination_cancel_cardify): Added. Cancels any pending
- cardifications.
- (e_destination_xml_decode): Added freeze/thaw.
-
- * backend/ebook/e-book-util.c (e_book_nickname_query): Added. A
- canned simple query for nicknames.
-
- * backend/ebook/e-card.c (e_card_email_find_number): Added. Given
- a card and an string containing an email address, return the index
- number of the address inside of the card, or -1 if the address is
- not found.
-
-2001-08-09 Chris Toshok <toshok@ximian.com>
-
- [ Fixes ximian bugs #5080, #6021, #6704, #6705 ]
-
- * gui/component/addressbook.c (book_open_cb): create our own
- dialog that prompts for both the email address and the password.
- the email address is stored in the source and filled in for the
- user after the first time they enter one and press OK.
-
- * gui/component/addressbook-storage.c (create_ldap_folder): has a
- return value, not a int* parameter.
- (create_ldap_folder): new function, we can create ldap servers
- from the File->New->Folder menu item now.
- (register_storage): hook up the "create_folder" signal.
- (addressbook_storage_init_source_uri): remove the file case, we
- only build ldap uris here.
- (load_source_data): remove the file source stuff, and handle
- "emailaddr".
- (save_source_data): call ldap_source_foreach directly.
- (addressbook_source_free): remove file source stuff.
- (addressbook_source_copy): same.
-
- * gui/component/addressbook-storage.h: get rid of all the file
- source stuff from AddressbookSource, since this is only being used
- for ldap servers.
-
- * backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_process_authenticate_user): look up the ldap
- entry based on the provided email address and use the resulting
- DN/passwd to authenticate.
-
- * gui/component/addressbook-config.c: pretty much gutted to make
- it work with the new UI.
-
- * gui/component/addressbook-config.glade: new version from anna.
-
-2001-08-09 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (SPEC): Upped the minimum width
- on all addressbook columns to 75. Fixes Ximian bug #2773.
-
-2001-08-08 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-quick-add.c (ce_have_book): mark
- the dialog as changed so the save button is immediately available.
-
- * gui/contact-editor/e-contact-editor.c (card_modified_cb): once
- we save reset the change flag to false if we aren't closing the
- dialog.
- (card_added_cb): same.
- (e_contact_editor_class_init): add a "changed" arg.
- (e_contact_editor_set_arg): add setter for "changed".
- (e_contact_editor_get_arg): add getter for "changed".
-
-2001-08-08 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-quick-add.c (ce_have_book): better
- to assume that we can write to the local addressbook than that we
- can't write to it :)
-
-2001-08-08 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c (create_ui):
- call e_pixmap_update so we can use the same save/save-as pixmaps
- as the contact editor.
-
-2001-08-08 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-reflow-adapter.c (open_card): new
- function, used by the context menu.
- (e_addressbook_reflow_adapter_right_click): put "Open" at the top
- of the menu. also, disable "Delete" if the addressbook isn't
- writable.
-
-2001-08-08 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (rfc2254_escape): escape *, \, (,
- and ), as per rfc2254.
- (func_contains): escape the string.
- (func_is): same.
- (func_beginswith): same.
- (func_endswith): same.
-
-2001-08-08 Nat Friedman <nat@ximian.com>
-
- * gui/widgets/e-addressbook-reflow-adapter.c (print_envelope): If 0'd out
- since Envelope printing is disabled for 1.0.
- * gui/widgets/e-addressbook-view.c (print_envelope): Likewise.
- * gui/contact-editor/e-contact-editor.c (print_envelope_cb): Likewise.
-
- * gui/widgets/e-addressbook-reflow-adapter.c
- (e_addressbook_reflow_adapter_right_click): Removed "Print
- Envelope" menu item.
- * gui/widgets/e-addressbook-view.c (table_right_click): Likewise.
- * gui/contact-editor/e-contact-editor.c (verbs): Likewise.
-
-2001-08-07 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-storage.c (remove_ldap_folder): ifdef
- this HAVE_LDAP.
-
-2001-08-07 Chris Toshok <toshok@ximian.com>
-
- * gui/search/e-addressbook-search-dialog.c
- (e_addressbook_search_dialog_init): set the title of the window to
- "Advanced Search".
-
-2001-08-07 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (search_cb): pass view->view instead
- of the EBook.
- (addressbook_search_menu_items): remove E_FILTERBAR_ADVANCED.
- (addressbook_menu_activated): remove E_FILTERBAR_ADVANCED.
- (addressbook_search_option_items): add "Advanced..." here.
- (addressbook_query_changed): add special handling for Advanced...
-
- * gui/search/e-addressbook-search-dialog.h (struct
- _EAddressbookSearchDialog): add EAddressbookView and remove the
- model/adapter fields. Also fix prototype of
- e_addressbook_search_dialog_new.
-
- * gui/search/e-addressbook-search-dialog.c
- (e_addressbook_search_dialog_class_init): get rid of
- set_arg/get_arg.
- (button_press): set the query on the EAddressbookView, and always
- close the dialog.
- (e_addressbook_search_dialog_init): get rid of the minicard view,
- and pack the other widgets accordingly.
- (e_addressbook_search_dialog_new): pass EAddressbookView instead
- of EBook.
- (e_addressbook_search_dialog_destroy): remove model/adapter stuff.
-
-2001-08-07 Chris Toshok <toshok@ximian.com>
-
- [ Fixes bug #5066 ]
- * gui/component/addressbook-storage.c (remove_ldap_folder): new
- function, remove the source.
- (register_storage): connect to the "remove_folder" signal so we
- know when to remove the folder.
-
-2001-08-07 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (build_card_from_entry): use
- g_strcasecmp since ldap attribute names are not case sensitive.
-
-2001-08-07 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (table_drag_data_received_cb): make sure we update the changed
- state if a successful drop happens.
-
-2001-08-07 Jason Leach <jleach@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_init): Make the OK button the keyboard default
- instead of Cancel. Bug #4942.
-
-2001-08-06 Radek Doulik <rodo@ximian.com>
-
- * backend/ebook/e-book.c (e_book_op_free): new EBookOp destructor
- (e_book_unqueue_op): use e_book_op_free
- (e_book_do_response_create_card): ditto
- (e_book_do_response_generic): ditto
- (e_book_do_response_get_cursor): ditto
- (e_book_do_response_get_view): ditto
- (e_book_do_response_get_changes): ditto
- (e_book_do_response_open): ditto
- (e_book_do_response_get_supported_fields): ditto
-
-2001-08-05 Radek Doulik <rodo@ximian.com>
-
- * backend/ebook/e-book.c (e_book_do_response_get_view): set
- op->listener to NULL to catch possible use of freed op
- (e_book_do_response_get_changes): ditto
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_check_queue): this callback could be (and
- indeed is) called from signal emited above,
- signal handler could call e_book_view_listener_stop, so we need to check
- if idle is still set and if not we don't want to unref again
-
-2001-08-04 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-compare.c (e_card_compare_name): Made it so
- that if there's one less match than possible compares are
- considered more VAGUE. Fixes Ximian bug #3400.
-
-2001-08-03 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_hookup_shell_listener): Check for storage != NULL
- here. This shouldn't come up unless addressbook has crashed
- previously within this session of evolution, but this is just a
- bit of insurance. Fixes Ximian bug #3699.
-
-2001-08-03 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card.c (e_card_name_match_string): Changed the
- criteria of whether the first part of each iteration matched or
- the second one did. Before it got it wrong sometimes and caused
- the pointer to jump off the end of the array. Fixes Ximian bug
- #4674.
-
-2001-08-03 Jason Leach <jleach@ximian.com>
-
- * gui/component/addressbook-storage.c (load_source_data): Update
- for EvolutionStorage API changes.
- (addressbook_storage_add_source): Ditto.
-
-2001-08-03 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (jump_to_letter): Made this
- change the query based on which letter is clicked. Fixes Ximian
- bug #2202.
-
-2001-08-03 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/addressbook.c (addressbook_factory_new_control):
- Fixed warnings here.
-
- * gui/component/select-names/e-select-names-completion.c
- (hash_cleanup_fn): Removed this unused function.
-
-2001-08-03 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-simple.c (e_card_simple_sync_card,
- fill_in_info): Made the list of E_CARD_PHONE types in
- phone_correspondences more complete by adding the new 5
- E_CARD_PHONE types. Also, made it a bit less restrictive for some
- types (E_CARD_PHONE_HOME will actually match
- E_CARD_SIMPLE_PHONE_ID_HOME now.) Made e_card_simple_sync_card
- and fill_in_info search for an exact match in the list of
- phone_correspondences and then look for a partial match. Got rid
- of not going forward when doing a remove from an EList since EList
- handles this case automatically.
-
- * backend/ebook/e-card-types.h: Added E_CARD_PHONE types for
- assistant, callback, radio, telex, and ttytdd.
-
- * backend/ebook/e-card.c (get_phone_flags, set_phone_flags):
- Handle the new E_CARD_PHONE types.
-
-2001-08-02 Jon Trowbridge <trow@ximian.com>
-
- * printing/Makefile.am (ecpsdir): Add camel dependency.
-
- * gui/component/Makefile.am: Add camel dependency.
-
- * backend/ebook/Makefile.am: Add camel dependency.
-
- * gui/component/addressbook-factory.c (main): Properly init camel.
-
- * backend/ebook/e-destination.c (e_destination_clear_strings):
- Clear ->raw.
- (e_destination_is_empty): We aren't empty if ->raw is set..
- (e_destination_set_raw): Replaces e_destination_set_string.
- (e_destination_get_name): Use camel's parser to extract the name
- from ->raw.
- (e_destination_get_email): Use camel's parser to extract the email
- address from ->raw.
- (e_destination_get_address): Use camel to produce properly quoted,
- RFC-compliant addresses. Thanks camel! (Bug #5860)
-
- * gui/component/select-names/e-select-names-completion.c
- (emailify_match): Always append an e-mail address, as long as it
- doesn't have one already at it's beginning or end. Don't limit
- self to just emailifying entries tied to cards with multiple
- addresses. (I didn't really want to do this, but people seem to
- like keeping multiple cards for the same person, and other
- solutions (like scanning all matches for duplicate names, and only
- emailifying those) just seemed like way too much work for such a
- limited payoff.)
-
- * gui/component/select-names/e-select-names-text-model.c:
- s/e_destination_set_string/e_destination_set_raw/.
-
- * gui/component/select-names/e-select-names-popup.c
- (popup_menu_card): Quote _'s in our popup menus, so that "foo_bar"
- doesn't get displayed as "foobar" w/ the 'b' underlined. (Bug
- #5558)
- (popup_menu_nocard): Ditto.
-
-2001-08-02 Jason Leach <jleach@ximian.com>
-
- * gui/component/addressbook.c (addressbook_factory_new_control):
- Removed some extra padding and pack the addressbook view into a
- frame with inward shadowing, just because it looks prettier.
-
- * gui/contact-editor/e-contact-editor.c: Use the updated Save,
- Save As, and Print icons for the menus and toolbar.
-
-2001-08-02 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/addressbook.c: Added ContactsSaveAsVCard,
- ContactsSendContactToOther, and ContactsSendMessageToContact verbs
- here.
-
- * gui/widgets/e-addressbook-view.c,
- gui/widgets/e-addressbook-view.h (e_addressbook_view_save_as,
- e_addressbook_view_send, e_addressbook_view_send_to): New
- functions to allow outside users to cause the addressbook to save,
- send, or send a message to its selection.
-
-2001-08-01 Christopher James Lahey <clahey@ximian.com>
-
- * contact-editor/.cvsignore: Removed this file from this unused
- directory.
-
-2001-08-01 Christopher James Lahey <clahey@ximian.com>
-
- * gui/contact-editor/Makefile.am: Added file-exists.glade.
-
- * gui/contact-editor/e-contact-save-as.c (file_exists),
- gui/contact-editor/file-exists.glade: Added a dialog to ask the
- user whether to replace an already existing file. Mostly from a
- patch by Jos Dehaes. Fixes Ximian bug #2231.
-
-2001-08-01 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_check_queue): Removed thrash checking code
- here since thrashing shouldn't happen now that we've cleaned this
- up some.
-
- * backend/ebook/e-book.c (e_book_do_response_get_view): Properly
- handle cases where construction fails.
-
-2001-07-30 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/evolution-vcard-importer.c: Added #include
- <e-util/e-path.h>.
-
-2001-07-23 Zbigniew Chyla <cyba@gnome.pl>
-
- * gui/component/addressbook-config.c (addressbook_source_dialog):
- Convert translated string to UTF8 before calling put_html.
-
-2001-07-30 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_do_query): Properly handle the case
- where our "cleaned" completion is the empty string. This happens,
- for example, if the query text is the string "\"". (Bug #5610).
-
- * backend/ebook/e-destination.c (e_destination_get_address_textv):
- Reassure fejj that I'm not doing something stupid here.
- (e_destination_get_address): Fix address quoting. This is a
- stop-gap measure until I can change this code to use Camel's
- superior address-handling routines. (Also Bug #5610)
-
-2001-07-30 Jason Leach <jleach@ximian.com>
-
- * gui/component/addressbook-storage.c (load_source_data): Fix a
- return value bug, to make it so if it fails to load an
- addressbook-sources.xml file (either a parse error or it doesn't
- exist for example), it deregisters the storage.
- (register_storage): Don't make a storage for users who don't have
- LDAP support built in. Bug #1950.
-
-2001-07-30 Frederic Crozat <fcrozat@mandrakesoft.com>
-
- * addressbook/gui/component/addressbook-factory.c: Fix crashes
- when gtkhtml is compiled with gconf support
-
-2001-07-27 JP Rosevear <jpr@ximian.com>
-
- * conduit/Makefile.am: Tidy ldadds
-
-2001-07-26 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-bonobo.c: Fixing a
- small, stupid mistake; use e_select_names_model_get_textification
- for the getter for "text".
-
- * backend/ebook/e-card.c: Removed some debugging chatter.
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_create_entry): Store the completion
- handler in the entry's object data.
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_get_property_fn): Added support for getting "destinations"
- and "allow_contact_lists" properties.
- (entry_set_property_fn): Added support for setting "destinations"
- and "allow_contact_lists" properties.
- (impl_SelectNames_get_entry_for_section): Added definitions for
- "destinations" and "allow_contact_lists" properties.
-
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_get_match_contact_lists): Added.
- (e_select_names_completion_set_match_contact_lists): Added.
- Controls whether contact lists are offered as options during
- completion.
- (book_query_process_card_list): Check if match_contact_lists
- is set before (duh!) matching on a contact list.
- (e_select_names_completion_init): Set match_contact_lists
- to TRUE by default.
-
-2001-07-25 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (func_contains): change the way
- x-evolution-any-field is converted to an ldap query. it used to
- be we'd nest queries like: (|(|(|(foo=*x*))(bar=*x*))(baz=*x*)).
- now we build it like: (|(foo=*x*)(bar=*x*)(baz=*x*)). much more
- efficient (both in the building, and on the server side no doubt).
-
-2001-07-25 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-destination.c (e_destination_get_name): Properly dup
- the results of e_destination_get_email.
-
- * gui/component/select-names/e-select-names-popup.c
- (e_select_names_popup): Check that our destination isn't empty
- before building our popup. (Bug #5250)
-
- * backend/ebook/e-destination.c (e_destination_is_empty): Made
- argument const.
-
-2001-07-24 Jon Trowbridge <trow@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-model.c: Added checks
- for all of the args of the exposed functions, so that
- we won't crash on bad inputs. (Related to bug #4856.)
-
-2001-07-24 Jason Leach <jleach@ximian.com>
-
- * gui/merging/e-card-duplicate-detected.glade: "_Add Anyway" to
- "Add Anyway".
-
-2001-07-24 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-destination.c (e_destination_get_name): Added
- fallbacks for the name in the case of an e-card, to avoid the
- "nameless contact" bug.
-
-2001-07-24 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard.c (remodel): need the EDestination magic
- here too for when we modify an already shown card.
-
- * gui/contact-list-editor/e-contact-list-model.c: make
- parent_class static, just to be anal.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (remove_entry_cb): removing entries changes the list, so flag it.
- (table_drag_data_received_cb): restrict cards we add to lists to
- be non-list cards.
- (extract_info): clear out the email list in the card before we
- repopulate it from the contact list model.
- (fill_in_info): set the checkbox to active/inactive based on
- thecard.
-
-2001-07-24 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (wants_html_changed): call
- widget_changed.
- (phone_entry_changed): same.
- (email_entry_changed): same.
- (address_text_changed): same.
- (name_entry_changed): same.
- (company_entry_changed): same.
- (widget_changed): new function that we can either call or set as a
- signal to change the "changed" flag on the dialog.
- (set_entry_changed_signals): connect lots of "changed" signals on
- widgets to widget_changed.
- (add_lists): connect "changed" to widget_changed.
-
-2001-07-24 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_hookup_shell_listener): Check if
- evolution_shell_client_get_local_storage returns CORBA_OBJECT_NIL,
- which it should never do. If it does, print a warning in a dialog
- and try to recover w/o crashing. (Bug #5193)
-
-2001-07-24 Dan Winship <danw@ximian.com>
-
- * backend/ebook/e-book-listener.c (e_book_listener_stop): Don't
- stop the idle_queue and unref from here, since this might be
- called from inside e_book_listener_check_queue, and we don't want
- to return to that function with the listener having been
- destroyed.
- (e_book_listener_check_queue): Don't exit early if the queue is
- stopped. Proceed through the check if the queue is NULL (which is
- must be if the queue is stopped), and then reach the existing code
- to remove the idle handler. Combined with the above, this fixes
- ximian #4485 (again). This is not a plot to boost my
- showstopper-bugfixing count by fixing the same bug over and over
- again.
-
-2001-07-23 Dan Winship <danw@ximian.com>
-
- Re-fix for my 07-18 not-quite-fix.
-
- * backend/ebook/e-book-listener.c: Add a "stopped" flag like
- EBookViewListener.
- (e_book_listener_check_queue): Don't emit signals if the listener
- is stopped.
- (e_book_listener_queue_generic_response, etc): Don't queue
- responses if the listener is stopped.
- (e_book_listener_stop): Flush the queue and stop queue/emitting
- further responses.
-
- * backend/ebook/e-book.c (e_book_unload_uri): Revert the previous
- change and call e_book_listener_stop() instead.
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_stop): When removing an idle handler, unref
- the listener as well, since e_book_view_listener_queue_response
- will have ref'ed it.
-
-2001-07-22 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c (remove_folder): Add a
- @type arg. If the type is not "contacts", report an
- `UNSUPPORTED_TYPE' error through the listener. Also, remove
- `g_print()' debugging messages.
- (xfer_folder): Likewise.
-
-2001-07-21 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c: Make the "contacts"
- folders user-creatable by setting `user_creatable' to %TRUE in the
- `EvolutionShellComponentFolderType's.
-
-2001-07-18 Chris Toshok <toshok@ximian.com>
-
- [ patch contributed by Jos Dehaes <jos.dehaes@bigfoot.com> ]
-
- * gui/component/addressbook-storage.c (register_storage): new
- function, register our evolution_storage.
- (addressbook_storage_setup): remove storage registration from
- here.
- (load_source_data): register the storage here before we load
- addressbook-sources.xml, and deregister it if there are no sources
- listed.
- (addressbook_storage_remove_source): unregister the storage if the
- list of sources hits 0 length.
-
-2001-07-18 Dan Winship <danw@ximian.com>
-
- * backend/ebook/e-book.c (e_book_unload_uri): Flush the listener's
- queue before unreffing it to ensure that it doesn't emit any more
- "responses_queued" signals after the EBook is destroyed.
-
- * backend/ebook/e-book-listener.c (e_book_listener_check_queue,
- e_book_listener_queue_response, e_book_listener_new): Use
- bonobo_object_ref/unref rather than gtk_object_ref/unref.
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_queue_response, e_book_view_listener_new):
- Likewise.
-
-2001-07-18 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-card-compare.c (simple_query_cb): prune the list
- of cards that match our query using the avoid list here, instead
- of using the avoid list in the query itself, since ldap can't
- handle that.
- (use_common_book_cb): remove the block of code including the avoid
- list in the query sent to wombat.
-
-2001-07-17 Chris Toshok <toshok@ximian.com>
-
- [ Fixes bugs #4611 - crash searching in the name field at Bigfoot for "\"
- and #4554 - general ldap search crash ]
-
- * backend/pas/pas-backend-ldap.c (func_contains): the length of
- the big query string needs to take into account the length of the
- footer as well as the header - fix random memory corruption here.
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_build_query):
- list can be NULL, specifically if there's a parsing error in the
- sexp, so deal with it.
-
-2001-07-17 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_queue_response): Hold a reference to our
- listener while the idle function is active.
- (e_book_view_listener_check_queue): Only unref the listener when
- the idle function is finished.
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_clicked): Instead of replacing section->model with
- source, copy source onto section->model with
- e_select_names_model_overwrite_copy. #if 0/#endif out all of the
- stuff related to ETextModels, because it doesn't make any sense to
- me, and everything appears to work without it.
- (Die bug #2059. Die! Die! Die!)
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_overwrite_copy): Added. Copies the contents
- of one ESelectNamesModel onto another.
-
- * backend/ebook/e-destination.c (e_destination_copy): Made the argument
- const.
-
- * backend/ebook/e-destination.c (e_destination_set_string): Removed
- old, broken code and annoying g_messages.
-
- * backend/ebook/e-book-listener.c
- (e_book_listener_queue_response): Hold a reference to the listener
- while the idle function is active.
- (e_book_listener_check_queue): Only release our reference to the
- listener when the queue is empty. These two changes fix a race
- condition, since the listener could be unrefed while the listener
- was still active. (Seems to fix bug #4485)
-
-2001-07-17 Christopher James Lahey <clahey@ximian.com>
-
- * gui/contact-editor/contact-editor.glade,
- gui/merging/e-card-duplicate-detected.glade,
- gui/merging/e-card-merging-book-commit-duplicate-detected.glade,
- printing/e-contact-print.glade: Patch from Taylor Hayward
- <thayward@gjpc.com>. Added accelerators to a few dialogs.
-
-2001-07-16 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/Evolution-Addressbook-SelectNames.idl:
- Added addSectionWithLimit to the SelectNames interface.
-
- * gui/component/select-names/e-select-names-bonobo.c
- (impl_SelectNames_add_section_with_limit): Added. Implements
- addSectionWithLimit.
- (e_select_names_bonobo_construct): Set up as a BonoboEventSource.
- (init): Listen for "changed" signals from our manager.
- (manager_changed_cb): Notify our listeners if we get a changed
- signal from our manager.
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_class_init): Added a "changed" signal".
- (section_copy): Propogate the signal connection.
- (section_free): Disconnect the changed handler.
- (e_select_names_manager_add_section_with_limit): Connect to the
- new section's model, listening for changes.
- (e_select_names_manager_activate_dialog): Connect to the "working
- copy" model, listening for changes.
- (e_select_names_manager_add_section_with_limit): Added.
- (e_select_names_manager_add_section): Changed to just be a special
- case of e_select_names_manager_add_section_with_limit.
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_set_limit): Added. Allows a max number of
- names allowed in the model.
- (e_select_names_model_get_limit): Added. Returns the limit.
- (e_select_names_model_at_limit): Added. Returns TRUE if the
- model is "full".
- (e_select_names_model_insert): Check that we aren't at the
- limit before inserting. Silently return if we are.
- (e_select_names_model_append): Check that we aren't at the
- limit before appending. Silently return if we are.
-
-2001-07-16 Chris Toshok <toshok@ximian.com>
-
- [ Fix bug #4705 - LDAP storage gets saved with corrupted binddn]
-
- * gui/component/addressbook-config.c (addressbook_dialog_apply):
- call addressbook_storage_write_sources here after we're done
- rebuilding them.
-
- * gui/component/addressbook-storage.c
- (addressbook_storage_clear_sources): don't write the source file
- here.
- (addressbook_storage_add_source): same.
- (addressbook_storage_remove_source): same.
- (addressbook_storage_write_sources): new function, write the
- source file out.
- (addressbook_source_copy): g_strdup the binddn so we don't end up
- free'ing it multiple times thanks to copies freeing theirs.
-
- * gui/component/addressbook-storage.h: add prototype for
- address_storage_write_sources.
-
-2001-07-16 Iain Holmes <iain@ximian.com>
-
- * backend/pas/evolution-vcard-importer.c (ebook_create): Don't just
- use the default directory. Use the directory that is passed into the
- load file function.
-
-2001-07-15 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-destination.c (e_destination_set_string):
- Commented out some unused variables and labels.
- (e_destination_importv): Check for the xml not parsing correctly
- and just return NULL here.
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_import_destinationv): Handle a NULL destv
- here.
-
-2001-07-15 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (table_drag_data_get): Added a
- call to e_table_view_to_model_row here.
- (e_addressbook_view_can_print, e_addressbook_view_can_delete,
- e_addressbook_view_can_copy): If the selection model is NULL here,
- return NULL (this was done before in a g_return_val_if_fail which
- is only conditionally included.)
-
-2001-07-13 Christopher James Lahey <clahey@ximian.com>
-
- * gui/contact-editor/contact-editor.glade: Changed Company to
- Organization here.
-
-2001-07-12 JP Rosevear <jpr@ximian.com>
-
- * backend/pas/Makefile.am: add ldap cflags
-
-2001-07-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * backend/ebook/e-destination.c (e_destination_xml_decode):
- Oops. I introduced my own bug, accidently set `email' to a
- g_free'd pointer - eek!
-
-2001-07-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * backend/ebook/e-destination.c (e_destination_importv): Optimized
- the same way I optimized g_strsplit. If you use a GPtrArray
- instead of a linked list, you save yourself from having to iterate
- through the list an extra 3 times.
- (e_destination_xml_decode): Do NOT, I repeat: do NOT!
- e_utf8_xml1_decode something which is already in UTF-8 or you'll
- corrupt it!! I smack thee who hath done this evil deed!
-
-2001-07-12 Iain Holmes <iain@ximian.com>
-
- * backend/e-book/evolution-vcard-importer.c (support_format_fn):
- Check for no extension. Actually same as Jason's fix below :) but
- also check the file contents.
-
-2001-07-12 JP Rosevear <jpr@ximian.com>
-
- * gui/component/addressbook-config.glade: add accelerators,
- taylor's patch
-
-2001-07-12 Jason Leach <jleach@ximian.com>
-
- * backend/ebook/evolution-vcard-importer.c (support_format_fn):
- Crash fix because strcmp() hates NULL arguments. Bug #3777.
-
-2001-07-11 Jason Leach <jleach@ximian.com>
-
- * gui/component/select-names/e-select-names.c (remove_cb): Added
- some comments for clarity and fixed a pretty noticable bug with
- how right click "Remove" was deleting more than it should with
- consecutive runs.
-
-2001-07-10 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/evolutionperson.schema: assign OID's to the schema
- entries, and add schema support for contact lists.
-
-2001-07-10 Christopher James Lahey <clahey@ximian.com>
-
- * backend/pas/pas-backend-file.c (pas_backend_file_load_uri): Set
- bf->priv->file_db before calling do_create.
-
-2001-07-06 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/addressbook-component.c (factory_fn): Fixed order
- of arguments to evolution_shell_component_new.
-
-2001-07-08 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_insert_length): Check that str isn't
- the empty string before doing an insert.
-
- * backend/ebook/e-destination.c (e_destination_set_string): We were
- being too smart for our own good here, and causing problems for
- the completion code... (bug #4253, bug #4255, bug #4280)
- (e_destination_set_name): Clear any cached address.
- (e_destination_set_email): Clear any cached address.
- (e_destination_get_address): Handle the cases where the name
- contains some e-mail information.
-
-2001-07-09 Kjartan Maraas <kmaraas@gnome.org>
-
- * gui/contact-list-editor/e-contact-list-editor.c: Marked a
- string for translation. Also add the neccesary includes to make
- _() macros work.
-
-2001-07-07 Jon Trowbridge <trow@ximian.com>
-
- * gui/widgets/e-minicard.c (add_field): Detect the embedded
- EDestination XML, and convert it to a nice-looking e-mail address.
-
- * gui/contact-list-editor/e-contact-list-editor.c: Adjusted to
- reflect changes to EContactListModel. (Yeah, this is vague,
- but the changes are _really_ obvious and boring.)
-
- * gui/contact-list-editor/e-contact-list-model.c: Revamped
- to make everything an EDestination, rather than storing either
- cards or strings.
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_insert_length): Use
- e_destination_get_textrep.
-
- * gui/component/select-names/e-select-names-table-model.c
- (fill_in_info): Use e_destination_get_name and
- e_destination_get_email.
-
- * gui/component/select-names/e-select-names-popup.c
- (popup_menu_card): Use e_destination_get_name instead of
- e_card_name_to_string.
- (quick_add_cb): Use e_destination_get_address.
- (popup_menu_nocard): Use e_destination_get_name.
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_changed): Removed obsolete debugging code.
- (e_select_names_model_get_textification): Use e_destination_get_textrep.
- (e_select_names_model_get_address_text): Use e_destination_get_address.
- (e_select_names_model_get_string): Use e_destination_get_textrep.
- (e_select_names_model_replace): Use e_destination_get_textrep.
- (e_select_names_model_name_pos): Use e_destination_get_textrep.
-
- * gui/component/select-names/e-select-names-completion.c
- (emailify_match): Match only if this isn't a contact list.
- (match_email): Match only if this isn't a contact list.
- (match_name): Do the right thing in the case of a contact list.
- (book_query_process_card_list): Don't construct a match for
- each possible e-mail address if this is a contact list.
-
- * backend/ebook/e-destination.c: Major-league de-crufting and
- rationalization, combined with lots of hacks to make things work
- properly with contact lists.
- (e_destination_copy): Copy contact list info.
- (e_destination_clear_card): Clear contact list info.
- (e_destination_is_empty): If we contain a contact list, we aren't
- empty.
- (e_destination_set_card_uri): Added. Allows us to set a
- destination by card URI.
- (e_destination_set_name): Allows the contact's name only ("Jane
- Smith") to be set.
- (e_destination_set_email): Allows the contact's e-mail only
- ("jane@assbarn.com") to be set.
- (e_destination_set_string): Takes a free-form string containing a
- contact's name and/or e-mail, and tries to do the right thing with
- it.
- (e_destination_contains_card): Renamed. Used to be
- e_destination_has_card.
- (e_destination_from_card): Added. Returns TRUE if the
- EDestination comes from either a ECard (which we presently hold)
- or is specified by an ECard URI.
- (e_destination_use_card): Allows an EDestination's ECard to be
- accessed, via a callback. If we only are holding the URI, the
- card will be loaded and stored in the EDestination.
- (e_destination_get_name): Returns the name only ("Jane Smith"), or
- NULL.
- (e_destination_get_email): Returns the email only
- ("jane@assbarn.com"), or NULL.
- (e_destination_get_address): Added. Returns a "full address" if
- both the name & e-mail are available ("Jane Smith
- <jane@assbarn.com>"), or just the e-mail if the name is unknown
- ("jane@assbarn.com>"). If the destination is a contact list,
- returns a comma-separated list of addresses.
- (e_destination_get_textrep): Added. Returns a "text
- representation" of the EDestination. This is what is now
- displayed for completed, "cardified" destinations in addressbook
- entries.
- (e_destination_is_evolution_list): Check to see if this
- destination is for a contact list.
- (e_destination_xml_encode): Added. Build an XML data structure
- representing an EDestination.
- (e_destination_xml_decode): Added. Parse an XML data structure,
- constructing an EDestination.
- (e_destination_export): Added. Returns a null-terminated string
- containing an XML representation of the EDestination, with
- newlines and excess whitespace removed.
- (e_destination_import): Added. Parses a string containing an XML
- representation of an EDestination.
- (e_destination_exportv): Added. Returns a null-terminated string
- containing an XML representation of a collection of EDestinations,
- with newlines and excess whitespace removed.
- (e_destination_importv): Added. Takes an XML representation of a
- collection of destinations, parses it, and returns a vector of
- EDestinations.
-
- * backend/ebook/e-card.c (e_card_duplicate): Copy the ->book
- pointer.
- (e_card_get_id): Check that the argument is valid.
- (e_card_set_id): Check that the argument is valid.
- (e_card_get_book): Added. Return the EBook the ECard came from.
- (e_card_get_uri): Added. Tries to returns a URI for the ECard,
- which is of the form (EBook URI)/(ECard unique ID). Returns NULL
- if the EBook URI or the ID are unknown/not set.
- (e_card_get_vobject): If we have the URI, use it as the
- VCUniqueStringProp, rather than just the ID. This is a hack to
- make DnD work properly.
- (parse_id): Detect if the unique ID we've been passed is a URI or
- just a plain card ID, and do the right thing in either case.
- (e_card_uri_extract_book_uri): Added. Convenience function for
- parsing card URIs.
- (e_card_uri_extract_card_id): Added. Convenience function for
- parsing card URIs.
- (e_card_load_uri): Added. Allows an ECard to be loaded by its
- URI.
-
- * backend/ebook/e-book-view.c: Added a EBook * to the
- _EBookViewPrivate struct. This is meant to contain the EBook the
- EBookView is associated with.
- (add_book_iterator): Added. A convenience function for attaching
- the EBook to a GList of cards (if no EBook is already stored).
- (e_book_view_do_added_event): Record the EBook in the added
- ECards.
- (e_book_view_do_modified_event): Record the EBook in the modified
- ECards.
- (e_book_view_set_book): Added. Stores a pointer to the
- EBookView's "parent" EBook.
- (e_book_view_init): Init book_view->priv->book to NULL.
- (e_book_view_destroy): Unref book_view->priv->book.
-
- * backend/ebook/e-book.c: Added a uri field to _EBookPrivate.
- (e_book_unqueue_op): Removed debugging spew.
- (e_book_do_response_get_view): Attach the current EBook to the
- created EBookView.
- (e_book_do_response_get_changes): Attach the current EBook to the
- created EBookView.
- (e_book_load_uri): Save a copy of the uri in the EBook.
- (e_book_get_uri): Added. Just returns book->priv->uri.
- (e_book_get_card): Attach a pointer to the Ebook to the
- newly-loaded ECard.
- (e_book_add_card): Attach a pointer to the EBook to the
- newly-added ECard.
- (e_book_commit_card): Attach a pointer to the EBook to the
- committed ECard.
- (e_book_init): Initialize the uri to NULL.
- (e_book_destroy): Free the uri string on destruction.
-
-2001-07-06 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c (populate_context_menu):
- Removed. [It was just bogus testing code for the right-click menu
- populating interface in the shell].
- (factory_fn): Pass NULL as the PopulateContextMenuFn.
-
-2001-07-05 Anna Marie Dirks <anna@ximian.com>
-
- * gui/contact-list-editor/contact-list-editor.glade:
- Added some accelerators, padding, and a "memebers" frame;
- also fixed spacing and growth behaviour of this dialog.
-
-2001-07-05 Christopher James Lahey <clahey@ximian.com>
-
- * backend/pas/pas-backend-file.c (compare_category): Fix a memory
- leak here.
-
-2001-07-05 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-compare.c (match_search_info_free): Set
- info->avoid = NULL. This shouldn't make a difference, but it
- can't hurt.
-
-2001-07-05 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-table-adapter.c
- (addressbook_is_cell_editable): Check if the row is within our
- table and return from this function as if the card is a standard
- card, not a list.
-
-2001-07-03 Damon Chaplin <damon@ximian.com>
-
- * backend/ebook/Makefile.am (evolution_vcard_importer_LDADD):
- added $(BONOBO_CONF_LIBS) to get it to compile.
-
-2001-07-02 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/Makefile.am (evolution_addressbook_LDADD): Added
- $(BONOBO_CONF_LIBS).
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_create_categories),
- gui/contact-editor/e-contact-editor.c (categories_clicked):
- Switched to an ECategoriesMasterListWombat instead of an
- ECategoriesMasterListArray here.
-
-2001-07-02 Peter Williams <peterw@ximian.com>
-
- * gui/contact-editor/Makefile.am (INCLUDES): srcdir !=
- builddir compile fix.
-
- * gui/contact-list-editor/Makefile.am (INCLUDES): Same.
-
- * gui/widgets/Makefile.am (INCLUDES): Same.
-
- * gui/search/Makefile.am (INCLUDES): Same.
-
-2001-07-02 Christopher James Lahey <clahey@ximian.com>
-
- * gui/contact-editor/e-contact-editor.c (categories_clicked):
- Turned off wombatification of the categories master list here.
-
-2001-07-01 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-editor.c (fill_in_info):
- use ECARD_UID_LINK_PREFIX.
-
- * gui/contact-list-editor/e-contact-list-model.c
- (e_contact_list_model_get_email): use ECARD_UID_LINK_PREFIX.
-
- * backend/ebook/e-destination.h: add prototype for
- e_destination_importv_list.
-
- * backend/ebook/e-destination.c (e_destination_importv_list): new
- function, take an ECard corresponding to an address list and
- resolve any linked cards, returning an EDestination vector.
-
- * backend/ebook/e-card.h (ECARD_UID_LINK_PREFIX): #define this here,
- since we need to use it in a few places.
-
-2001-07-02 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card.c, backend/ebook/e-card.h: Added
- related_contacts field.
-
- * gui/component/select-names/e-select-names-model.c,
- gui/component/select-names/e-select-names-model.h
- (e_select_names_model_import_destinationv): Added this function.
-
- * gui/contact-editor/contact-editor.glade: Replaced the entry here
- for related contacts with a table which is filled in in the C code.
-
- * gui/contact-editor/e-contact-editor.c,
- gui/contact-editor/e-contact-editor.h (add_lists): Added a select
- names entry here for the related contacts field.
-
- * gui/widgets/Makefile.am: Removed all the test programs here
- since there are circular dependencies now.
-
-2001-07-01 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-destination.c (e_destination_get_string): Fall
- back to use the name field if all else fails (which can happen
- with imported EDestinations).
-
- * backend/ebook/e-destination.c (e_destination_is_empty): Fix for the
- "recipient not specified" bug --- we were not correctly checking
- for whether or not an EDestination was actually empty.
-
-2001-06-30 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-card.c (e_card_evolution_list): Check args.
- Somewhere in the code (somewhere in the minicard stuff) this can
- be called with a NULL arg, which was causing crashes.
- (e_card_evolution_list_show_addresses): Check args.
-
- * backend/ebook/e-destination.c (build_field): I was accidentally
- comparing characters and strings here, and didn't see the compiler
- warning. Fixed.
- (e_destination_exportv): Don't export any empty destinations.
- (bug#3825).
-
-2001-06-30 Zbigniew Chyla <cyba@gnome.pl>
-
- * gui/component/e-address-popup.c (e_address_popup_construct): Marked
- strings for translation.
-
-2001-06-30 Jon Trowbridge <trow@ximian.com>
-
- * gui/merging/e-card-merging.c (match_query_callback): Make the
- standard for considering two cards to be match stricter.
-
- * gui/component/select-names/e-select-names-completion.c
- (make_match): Use the card's use-score to set the match's
- sort_major value.
- (match_name): Removed obsolete code.
- (e_select_names_completion_begin): Added (double) cast to make
- match->score calculation come out properly.
-
- * backend/ebook/e-card.c: Added X-EVOLUTION-LAST-USE and
- X-EVOLUTION-USE-SCORE to attribute_jump_array.
- (e_card_get_today): Added. A convenience routine for getting
- today's date and putting it in a GDate.
- (e_card_get_use_score): Added. Compute the current, time-decayed,
- use-score for the card.
- (e_card_touch): Increment the use-score by one; update the last
- used date.
- (e_card_date_to_string): Added as a convenience routine, getting
- rid of some code duplication.
- (e_card_get_vobject): Add handlers for X-EVOLUTION-USE-SCORE and
- X-EVOLUTION-LAST-USE.
- (parse_last_use): Added.
- (parse_use_score): Added.
- (e_card_class_init): Added args for last-use and use-score.
- (e_card_get_arg): Added handlers for last-use and use-score.
- o
- (e_card_set_arg): Added handlers for last-use and use-score.
-
- * backend/ebook/e-destination.c: Added pending_card_id to
- EDestinationPrivate struct.
- (e_destination_copy): Copy the pending_card_id.
- (e_destination_is_empty): Check for a pending_card_id. We are
- non-empty if we have one.
- (e_destination_clear_card): Clear pending_card_id.
- (e_destination_set_card): Clear pending_card_id.
- (e_destination_has_pending_card): Added.
- (e_destination_use_card): Added. An asynchronous way to load a
- pending card and then apply a callback to it.
- (build_field): Be paranoid, map our special characters to '_'.
- (e_destination_export): Use EXPORT_MAX_FIELDS symbol rather than a
- hard-wired array size. Added the "card" entry.
- (e_destination_import): Fix bug in handling of the "name" field.
- Process the "card" field.
- (e_destination_touch): "Touch" and commit the ECard corresponding
- to the e-mail address in the destination. (A query against the
- local addressbook is actually performed, in case the destination
- isn't cardified.
-
- * backend/ebook/e-card-compare.c (e_card_compare_name): Revamp the
- way E_CARD_MATCH_FOO results are mapped to comparison results.
- Report better matches when the family name is matched.
-
-2001-06-29 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.c (update_query):
- Added a search field to the query here.
- (e_select_names_init): Update the query on a number of signals here.
-
- * gui/component/select-names/e-select-names.h: Added search_entry
- here.
-
- * gui/component/select-names/select-names.glade: Added the search
- entry here. Added some labels. Removed the update button.
-
-2001-06-29 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_option_activated): Change the uri here to have
- addressbook.db at the end.
-
- * gui/component/select-names/select-names.glade: Changed the name
- of the folder option menu here to match the name used in the code.
-
-2001-06-29 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.c (update_query):
- Change the query when the "Update List" button is pushed.
-
- * gui/component/select-names/e-select-names.h: Removed
- currently_selected field. Added categories_entry field.
-
- * gui/component/select-names/select-names.glade: Added "Update
- List" button.
-
-2001-06-29 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/Makefile.am (INCLUDES): add EVOLUTION_IMAGESDIR
- define.
-
- * gui/widgets/e-minicard.h (struct _EMinicard): add our pixbuf and
- pixbuf size.
-
- * gui/widgets/e-minicard.c (e_minicard_init): init the icon pixbuf
- and its size.
- (e_minicard_destroy): unref the list_icon_pixbuf.
- (e_minicard_realize): create the list_icon GnomeCanvasPixbuf.
- (e_minicard_resize_children): clip the header_text by the
- list_icon, and place the list_icon in the right spot.
- (remodel): show the list_icon if we're a list, and hide it
- otherwise.
-
-2001-06-28 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (table_double_click): pop up
- list editor for lists, contact editor otherwise.
-
- * gui/widgets/e-minicard.c (e_minicard_event): same.
-
- * gui/widgets/e-minicard.h (struct _EMinicard): change "editor" to
- GtkOjbect, since it can be either a contact editor or contact list
- editor.
-
- * gui/widgets/e-addressbook-table-adapter.c
- (addressbook_is_cell_editable): don't allow editting of any fields
- except the name and file_as for lists.
-
-2001-06-28 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-list-editor/Makefile.am (INCLUDES): remove ancient
- e-table include, and add include for contact-editor so we can
- reuse the confirm_delete dialog.
-
- * gui/contact-list-editor/e-contact-list-editor.h (struct
- _EContactListEditor): remove prototype for
- e_contact_list_editor_close, since the function no longer exists.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (list_deleted_cb): new function, emit our "list_deleted" signal.
- (delete_cb): new function, called from the Delete toolbar item.
- (e_contact_list_editor_raise): flesh out function.
- (extract_info): "evolution_list" => "list".
- (fill_in_info): same.
-
-2001-06-28 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-card.c (e_card_get_vobject): add support for
- X-EVOLUTION-LIST and X-EVOLUTION-LIST-SHOW-ADDRESSES.
- (parse_list): new function, parse the boolean X-EVOLUTION-LIST.
- (parse_list_show_addresses): new function, parse the boolean
- X-EVOLUTION-LIST-SHOW-ADDRESSES.
- (e_card_class_init): add args for "list" and
- "list_show_addresses".
- (e_card_set_arg): add support for list and list_show_addresses.
- (e_card_get_arg): same.
- (e_card_init): init list and list_show_addresses.
-
-2001-06-27 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c (factory_fn): Pass NULL as
- the @external_uri_schemas argument to
- `evolution_shell_component_new()'.
-
-2001-06-27 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-list-editor/e-contact-list-model.c
- (contact_list_row_count): track storage change - we're only using
- 1 array now.
- (contact_list_value_at): same.
- (contact_list_model_destroy): same.
- (e_contact_list_model_init): same.
- (e_contact_list_model_add_email): same.
- (e_contact_list_model_add_card): same.
- (e_contact_list_model_remove_row): same.
- (e_contact_list_model_remove_all): new function - just free/unref
- all existing rows.
- (e_contact_list_model_get_email): new function, returns the
- alloc'ed string containing either an email address or an encoded
- ECardId.
-
- * gui/contact-list-editor/e-contact-list-model.h: remove the 2
- separate arrays for email and cards, and store them in the same
- array.
-
- * gui/contact-list-editor/e-contact-list-editor.h (struct
- _EContactListEditor): add the visible_addr_checkbutton widget.
-
- * gui/contact-list-editor/e-contact-list-editor.c
- (visible_addrs_toggled_cb): new function.
- (e_contact_list_editor_init): connect to "toggled" on
- visible_addrs_checkbutton.
- (file_save_cb): new function.
- (tb_save_and_close_cb): new function.
- (verbs): add Save and Save & Close.
- (list_added_cb): new function.
- (list_modified_cb): new function.
- (save_card): new function - we do *not* use e_card_merging_* calls
- here.
- (e_contact_list_editor_get_arg): un-#if 0 code in the "card"
- getter.
- (e_contact_list_editor_set_arg): same for the "card" setter.
- (extract_info): new function.
- (fill_in_info): new function.
-
- * gui/contact-list-editor/contact-list-editor.glade: add a
- checkbutton at the bottom to determine whether to visibly include
- mail addresses in mail sent to this list.
-
-2001-06-26 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_create_categories): Oops. Can't use the wombat
- version of the master categories list yet.
-
-2001-06-26 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-table-adapter.c (create_card): memmove
- counts were off in this function.
- (remove_card, modify_card): Moved the table notifications around a
- bit here.
-
-2001-06-26 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names.c,
- gui/component/select-names/e-select-names.h,
- gui/component/select-names/select-names.glade
- (e_select_names_create_categories): Added a categories combo here.
- It's not used yet.
-
-2001-06-26 Christopher James Lahey <clahey@ximian.com>
-
- * gui/search/addresstypes.xml: Added category searching to the
- advanced search dialog here.
-
-2001-06-26 Christopher James Lahey <clahey@ximian.com>
-
- * backend/pas/pas-backend-file.c (compare_category): Added
- category searching to the file backend.
-
- * gui/component/addressbook.c (addressbook_query_changed): Added
- category searching to the search bar.
-
-2001-06-25 Peter Williams <peterw@ximian.com>
-
- * conduit/Makefile.am (INCLUDES): Fix for srcdir != builddir.
-
-2001-06-25 Chris Toshok <toshok@ximian.com>
-
- * gui/contact-list-editor/contact-list-editor.glade: change layout
- slightly, the icon no longer pushes everything to the left, and
- make the buttons on the right smaller and more in line with the
- other widgets.
-
- * gui/contact-list-editor/e-contact-list-model.c
- (contact_list_value_at): return the SimpleAndString->string
- instead of querying the ecardsimple.
- (e_contact_list_model_init): initially allocate 10 of each type
- (email and simple).
- (e_contact_list_model_add_email): realloc if need be.
- (e_contact_list_model_add_card): same, and initialize the string
- displayed to be "[Name] [<email>]".
- (e_contact_list_model_remove_row): change for SimpleAndString.
- (contact_list_model_destroy): free our 2 arrays.
-
- * gui/contact-list-editor/e-contact-list-model.h: add alloc counts
- and the SimpleAndString struct.
-
- * gui/contact-list-editor/e-contact-list-editor.c: Helix Code =>
- Ximian.
- (e_contact_list_editor_init): hook up d&d destination signals, and
- un-#if 0 the delete_event signal.
- (table_drag_motion_cb): new function.
- (table_drag_drop_cb): new function.
- (table_drag_data_received_cb): new function.
- (file_close_cb): new function.
- (verbs) uncomment the close verb.
- (close_dialog): new function.
- (app_delete_event_cb): new function.
-
- * gui/contact-list-editor/e-contact-list-editor.h: Helix Code =>
- Ximian.
-
-2001-06-25 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/e-address-popup.c: Add a huge steaming pile of
- code to handle the case of single-address merging. In other
- words, if you go to "harvest" an address by right-clicking on it
- in the mail viewer, and you already have a closely-matching
- contact (w/ a different e-mail address), this gives you the
- option of editting that contact's e-mail addresses to add the
- one you just clicked on.
-
- * backend/ebook/e-card-compare.c (match_search_info_free): It is
- amazing how much better things work when you don't try to
- dereference the pointer you just freed.
-
-2001-06-24 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/Makefile.am (minicard_test_LDADD): correct path to
- libecontacteditor.a.
- (minicard_widget_test_LDADD): same.
- (INCLUDES): same, for the includes.
-
- * gui/widgets/e-minicard.h: correct e-contact-editor.h path.
-
- * gui/widgets/e-addressbook-util.h: correct path to
- e-contact-editor.h, and add e-contact-list-editor.h. Add
- prototype for e_addressbook_show_contact_list_editor.
-
- * gui/widgets/e-addressbook-util.c: remove #include
- "e-contact-editor.h" (our header includes it.)
- (added_cb): rename card_added_cb to this, and make it so it can be
- reused in both the list and card cases. remove the g_print too.
- (modified_cb): same for modified case.
- (deleted_cb): same for deleted case.
- (editor_closed_cb): change first arg to GtkObject* so we can reuse
- this for both list and card.
- (e_addressbook_show_contact_editor): use added_cb, modified_cb,
- deleted_cb, and pass FALSE as user_data.
- (e_addressbook_show_contact_list_editor): new function, same as
- above but creating a contact-list-editor, and pass TRUE as
- user_data.
-
- * gui/component/e-address-popup.c: correct path to contact-editor.
-
- * gui/component/e-address-widget.c: same.
-
- * gui/component/select-names/e-select-names-popup.c: same.
-
- * gui/component/select-names/e-select-names-text-model.c: same.
-
- * gui/component/addressbook.c (new_contact_list_cb): new function.
- (update_command_state): update ContactNewList command.
- (verbs): remove ViewAll from the toolbar from the verb list. Add
- ContactNewList.
- (pixmaps): same for pixmaps.
-
- * gui/component/Makefile.am (evolution_addressbook_LDADD): new
- path for contact-editor.
- (INCLUDES): same.
-
- * gui/contact-list-editor/e-contact-list-model.h:
- * gui/contact-list-editor/e-contact-list-model.c:
- * gui/contact-list-editor/e-contact-list-editor.h:
- * gui/contact-list-editor/e-contact-list-editor.c:
- * gui/contact-list-editor/Makefile.am: Initial contact-list editor
- commit.
-
- * gui/Makefile.am (SUBDIRS): add contact-editor.
-
- * Makefile.am: (SUBDIRS): remove contact-editor.
-
-2001-06-21 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-popup.c
- (make_contact_editor_cb): Renamed. (The old name,
- edit_contact_info_have_book_cb was a hold-over from before, when
- we weren't using e_book_use_local_address_book.)
-
- * gui/component/e-address-popup.c
- (e_address_popup_schedule_refresh): A Added. We now do the name
- refreshes in an idle function, rather than in the setters.
- (e_address_popup_set_free_form): Added. Properly handle inputs of
- the form "Foo <bar@zar.com>", extracting the name and e-mail
- address.
- (e_address_popup_set_name): Check to make sure that the free-form
- handler shouldn't be used to handle the input. Schedule a refresh
- after making any changes.
- (e_address_popup_set_email): Check to make sure that the free-form
- handler shouldn't be used to handle the input. Schedule a refresh
- after making any changes.
- (e_address_popup_name_only_matches): Temporary place-holder for
- handling name-only matches.
- (query_cb): If our initial query fails (and included e-mail
- information), do a name-only query. This is to handle the case of
- adding new e-mail addresses to existing contacts.
- (e_address_popup_query): Eliminated the "common_book" crap; using
- e_book_use_local_address_book instead.
-
- * backend/ebook/e-card-compare.c (match_search_info_free): Make
- sure that the ->avoid list gets properly freed.
-
-2001-06-20 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_process_get_supported_fields): fix a refcounting
- memleak.
-
-2001-06-20 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book-listener.c
- (e_book_listener_queue_get_supported_fields_response): fix memory
- leak.
-
-2001-06-20 Chris Toshok <toshok@ximian.com>
-
- * contact-editor/e-contact-editor.c: add prototype for
- close_dialog to remove warnings.
-
-2001-06-20 Dave Camp <dave@ximian.com>
-
- * backend/ebook/e-card.c (e_card_list_send): Changed attach_data
- to be a GNOME_Evolution_Composer_AttachmentData rather than a
- CORBA_char*.
-
-2001-06-19 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (table_double_click): track
- change to e_addressbook_show_contact_editor signature.
-
- * gui/widgets/e-minicard-view.c (e_minicard_view_event): same.
-
- * gui/widgets/e-minicard.c (e_minicard_event): same.
-
- * gui/widgets/e-addressbook-util.c (e_addressbook_error_dialog):
- add an entry for "Card ID already exists".
- (e_addressbook_show_contact_editor): track the change to signal
- names and e_contact_editor_new signature here.
-
- * gui/widgets/e-addressbook-util.h: change
- e_addressbook_show_contact_editor's signature to match
- e_contact_editor_new more closely.
-
- * gui/widgets/e-addressbook-table-adapter.c (unlink_model): free
- up the simple mapping to plug a potentially sizeable memory leak.
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_activate_obj): call
- e_addressbook_show_contact_editor here.
-
- * gui/component/select-names/e-select-names-popup.c
- (edit_contact_info_have_book_cb): remove the get_supported_fields
- stuff, since the contact editor handles it for us now, and call
- e_addressbook_show_contact_editor.
-
- * gui/component/e-address-popup.c (edit_contact_info_cb): same.
-
- * gui/component/addressbook.c (new_contact_cb): track change to
- e_addressbook_show_contact_editor.
-
-2001-06-19 Chris Toshok <toshok@ximian.com>
-
- * contact-editor/e-contact-quick-add.c (ce_have_book): rename
- ce_book_found_fields to this, remove the fetching of fields (the
- contact editor code handles that now.), and change the add_card
- signal to card_added.
- (card_added_cb): copied somewhat from merge_cb above. we don't
- need to do the merge here, just call the callback.
-
- * contact-editor/e-contact-editor.c (e_contact_editor_class_init):
- track signal change. add book arg, and is_read_only -> editable.
- (wants_html_changed): if the card isn't already changed, flag it
- as such (and update the commands.)
- (phone_entry_changed): same.
- (email_entry_changed): same.
- (address_text_changed): same.
- (name_entry_changed): same.
- (company_entry_changed): same.
- (full_name_clicked): is_read_only -> editable.
- (full_addr_clicked): same.
- (card_added_cb): new function, emit our card_added signal, and
- close the dialog if we're supposed to. properly deal with error
- status here.
- (card_modified_cb): same, modulo card_added -> card_modified.
- (save_card): actually call e_card_merging_book_{add/commit}_card
- instead of using a signal. Also, add a gboolean arg to tell
- whether or not to close the dialog after saving the card.
- (card_deleted_cb): new function, just emit our "card_deleted"
- signal.
- (delete_cb): actually call e_book_remove_card here, instead of
- using a signal.
- (tb_save_and_close_cb): call save_card with TRUE for should_close.
- (e_contact_editor_init): init changed = FALSE;
- (e_contact_editor_destroy): unref our book if we have one.
- (e_contact_editor_new): new signature, set the "book" arg, and
- call e_book_get_supported_fields here.
- (supported_fields_cb): new function, show the contact editor.
- (e_contact_editor_set_arg): initialize changed to FALSE when
- setting the card (but *after*, since the changed callbacks will
- set it to TRUE.) also, call command_state_changed if editable
- changes. also handle setting "book". oh, and is_read_only ->
- editable.
- (command_state_changed): new function - set the state of the
- commands we care about.
- (e_contact_editor_get_arg): add "book" handling, and is_read_only
- -> editable.
- (_phone_arrow_pressed): is_read_only -> editable.
- (_email_arrow_pressed): same.
- (_address_arrow_pressed): same.
- (enable_writable_fields): same.
- (set_editable): rename set_read_only to this, and is_read_only ->
- editable.
-
- * contact-editor/e-contact-editor.h (struct _EContactEditor):
- is_read_only -> editable, add a "changed" flag so we can sensitize
- commands correctly, and add an EBook* arg to e_contact_editor_new
- and to the EContactEditor struct. Also, change all the signals to
- past tense, and send the EBookStatus in them.
-
- * contact-editor/e-contact-editor-address.c
- (e_contact_editor_address_class_init): is_read_only -> editable.
- (e_contact_editor_address_set_arg): same.
- (e_contact_editor_address_get_arg): same.
-
- * contact-editor/e-contact-editor-address.h (struct
- _EContactEditorAddress): same.
-
- * contact-editor/e-contact-editor-fullname.c
- (e_contact_editor_fullname_class_init): same.
- (e_contact_editor_fullname_set_arg): same.
- (e_contact_editor_fullname_get_arg): same.
-
- * contact-editor/e-contact-editor-fullname.h (struct
- _EContactEditorFullname): same.
-
- * contact-editor/Makefile.am: don't build contact-editor-test now,
- until contact-editor gets moved to gui/ and we can more easily
- depend on the e_card_merging_* calls.
-
- * backend/pas/pas-backend-ldap.c (ldap_error_to_response): return
- CardIdAlreadyExists for LDAP_ALREADY_EXISTS.
-
- * backend/idl/addressbook.idl: Add CardIdAlreadyExists to the
- BookListener status enum.
-
- * backend/ebook/e-book-types.h: add
- E_BOOK_STATUS_CARD_ID_ALREADY_EXISTS.
-
- * backend/ebook/e-book-listener.c
- (e_book_listener_convert_status): add support for
- CardIdAlreadyExists.
-
-2001-06-19 Jon Trowbridge <trow@ximian.com>
-
- * contact-editor/e-contact-quick-add.c: Serious de-crufting,
- removal of gtk_object_set_data() hacks, simplified by using
- some of the newer ebook convenience routines, etc.
- (ce_book_found_fields):
- s/e_contact_editor_raise/e_contact_editor_show/, to accomodate the
- small changes in the contact editor API.
-
-2001-06-18 Eskil Heyn Olsen <eskil@eskil.dk>
-
- * conduit/address-conduit.c: (check_for_slow_setting),
- (conduit_get_gpilot_conduit):
- Tweaked for some gnome-pilot api changes
-
-2001-06-15 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (search_for_dn): implement this
- properly, using base and (objectclass=*).
-
-2001-06-14 Chris Toshok <toshok@ximian.com>
-
- * contact-editor/e-contact-editor.c (delete_cb): save ourselves a
- function call - call close_dialog instead of file_close_cb.
-
-2001-06-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/component/addressbook-component.c: Set the
- "expoted_dnd_types" to NULL in the folder_types.
-
-2001-06-11 Dan Winship <danw@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (search_override_check): Add a workaround for an EText bug.
- (e_select_names_completion_begin): Fix up the match scoring in the
- search_override case so the lines are offered in the correct
- order.
-
-2001-06-11 Christopher James Lahey <clahey@ximian.com>
-
- * gui/merging/Makefile.am (glade_DATA): Added
- e-card-merging-book-commit-duplicate-detected.glade here.
-
- * gui/merging/e-card-merging-book-commit-duplicate-detected.glade:
- Added this file. The GUI for asking whether to commit a modified
- card.
-
- * gui/merging/e-card-merging.c, gui/merging/e-card-merging.h
- (e_card_merging_book_commit_card): Added this function.
-
- * gui/widgets/e-addressbook-table-adapter.c
- (addressbook_set_value_at), gui/widgets/e-addressbook-util.c
- (commit_card_cb), gui/widgets/e-minicard.c (e_minicard_event): Use
- e_card_merging_book_commit_card instead of e_book_commit_card here.
-
-2001-06-11 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h:
- Made e_card_simple_get_id return const char *.
-
- * backend/ebook/e-card.c, backend/ebook/e-card.h: Made
- e_card_get_id return const char *.
-
- * gui/component/e-cardlist-model.c (e_cardlist_model_add): Made id
- variable const here. Added a break to make it slightly more
- efficient.
-
- * gui/widgets/e-minicard.c, gui/widgets/e-minicard.h: Made
- e_minicard_get_card_id return const char *.
-
-2001-06-11 Christopher James Lahey <clahey@ximian.com>
-
- * backend/pas/pas-backend-file.c (entry_compare): Made this handle
- the "id" property in searches.
- (pas_backend_file_process_modify_card): Made id variable const
- here.
-
- * backend/pas/pas-backend-ldap.c (modify_card_handler): Made id
- variable const here.
-
-2001-06-11 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-book-listener.c,
- backend/ebook/e-book-listener.h, backend/ebook/e-book.c: Rolled
- back the change 2 ago, dated 06/11/2001 01:51 in CVS, involving
- e-book-listener.[ch] and e-book.c.
-
-2001-06-11 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-book.c (e_book_load_uri,
- e_book_get_supported_fields, e_book_authenticate_user,
- e_book_remove_card_by_id, e_book_add_vcard, e_book_commit_vcard,
- e_book_get_cursor, e_book_get_book_view, e_book_get_changes): Made
- it so that all of these functions queue their ops before calling
- their CORBA functions. This way, if the response is sent back
- before the CORBA function returns there's no problem. Added
- e_book_unqueue_op so that the op could be unqueued if the CORBA
- call fails.
-
-2001-06-11 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-book-listener.c, backend/ebook/e-book-listener.h
- (e_book_listener_unpop_response): Added this function to put a
- response back into the queue.
-
- * backend/ebook/e-book.c (e_book_check_listener_queue,
- e_book_queue_op): Handle the case where the op hasn't been queued
- yet when we get the response. In this case we unpop the response.
- Also, when queueing an op, we check to see if there are any
- responses waiting.
-
- * This change has been reverted.
-
-2001-06-11 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-compare.c, backend/ebook/e-card-compare.h
- (e_card_locate_match_full): Added this function to let you do
- slightly more complicated searches.
-
- * gui/merging/e-card-merging.c (e_card_merging_book_add_card): Use
- e_card_locate_match_full to check if the card exists in the book
- it's being added to instead of in the default book.
-
-2001-06-09 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (match_name): Removed unused email variable.
-
-2001-06-09 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-compare.c (use_common_book_cb): Null
- terminate the strv here.
- (e_card_locate_match): ref here instead of unref.
-
- * backend/ebook/e-card-simple.c (e_card_simple_get): Handle a NULL
- card here.
-
- * contact-editor/Makefile.am (INCLUDES), gui/widgets/Makefile.am
- (INCLUDES): Added addressbook/gui/merging here.
-
- * contact-editor/e-contact-quick-add.c (book_ready_cb),
- gui/component/addressbook-component.c (dnd_drop_book_open_cb),
- gui/widgets/e-addressbook-table-adapter.c
- (addressbook_append_row), gui/widgets/e-addressbook-util.c
- (add_card_cb), gui/widgets/e-addressbook-view.c
- (selection_received), gui/widgets/e-minicard-control.c
- (book_open_cb): Use e_card_merging_book_add_card instead of
- e_book_add_card here.
-
- * gui/Makefile.am (SUBDIRS): Added merging.
-
- * gui/component/Makefile.am (evolution_addressbook_LDADD),
- gui/widgets/Makefile.am (minicard_test_LDADD,
- minicard_widget_test_LDADD): Added libecardmerging.a here.
-
- * gui/merging/, gui/merging/.cvsignore, gui/merging/Makefile.am:
- New addressbook library.
-
- * gui/merging/e-card-duplicate-detected.glade: Glade file for
- duplicate detected dialog.
-
- * gui/merging/e-card-merging.c, gui/merging/e-card-merging.h: New
- files for detecting duplicates before adding and putting up a
- dialog if duplicates are found.
-
- * gui/widgets/e-minicard-view.c: Include e-addressbook-util.h
- here.
-
-2001-06-08 Chris Toshok <toshok@ximian.com>
-
- * contact-editor/e-contact-editor.c (e_contact_editor_new): remove
- the gtk_widget_show call...
- (e_contact_editor_show): and put it here.
-
- * contact-editor/e-contact-editor.h: add prototype for
- e_contact_editor_show.
-
- * gui/widgets/e-minicard.c (e_minicard_event): call
- e_addressbook_show_contact_editor.
- (card_modified_cb): call e_addressbook_error_dialog if status !=
- SUCCESS.
-
- * gui/widgets/e-minicard-view.c (e_minicard_view_event): call
- e_addressbook_show_contact_editor. also, use card_modified_cb as
- the commit_card callback.
-
- * gui/widgets/e-addressbook-view.c (table_double_click): clean
- this area up alot, call e_addressbook_show_contact_editor.
- (card_deleted_cb): call e_addressbook_error_dialog.
-
- * gui/widgets/e-addressbook-table-adapter.c
- (card_modified_cb): new function, call e_addressbook_error_dialog
- if the status != SUCCESS.
- (addressbook_set_value_at): use card_modified_cb as the callback
- for e_book_commit_card.
-
- * gui/widgets/Makefile.am (libeminicard_a_SOURCES): add
- e-addressbook-util.[ch].
-
- * gui/component/addressbook.c (new_contact_cb): use
- e_addressbook_show_contact_editor here.
-
-2001-06-05 Christopher James Lahey <clahey@ximian.com>
-
- * contact-editor/e-contact-editor.c (categories_clicked): Remove
- references to ECategoryMasterListWombat.
-
-2001-06-05 Jason Leach <jleach@ximian.com>
-
- * gui/component/select-names/e-select-names.c (remove_cb): Make
- this work when multiple names are selected then right
- click->Remove.
-
-2001-06-05 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card.c (e_card_set_arg): Copy dates as they come
- in.
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_changes_foreach_key, pas_backend_file_changes,
- pas_backend_file_process_remove_card,
- pas_backend_file_process_modify_card,
- pas_backend_file_build_all_cards_list, pas_backend_file_get_vcard,
- pas_backend_file_maybe_upgrade_db): memset DBTs to 0 before using
- them.
- (pas_backend_file_build_all_cards_list): Reindented.
-
- * contact-editor/contact-editor.glade: Replaced GnomeDateEdits
- with a custom widget that creates an EDateEdit.
-
- * contact-editor/e-contact-editor.c: Use an EDateEdit here instead
- of a GnomeDateEdit.
-
-2001-06-05 Jason Leach <jleach@ximian.com>
-
- (Fix bug #655: SelectNames doesn't let you remove addresses after
- you add them)
-
- * gui/component/select-names/e-select-names.c
- (section_right_click_cb): New function, provides a popup menu with
- just "Remove" in it.
- (remove_cb): New callback to do the remove.
- (e_select_names_add_section): Attach the "right_click" signal to
- the section_right_click_cb above.
-
-2001-06-05 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-manager.c
- (completion_handler): Change the completion handler to use the
- ECompletionMatch.
-
- * gui/component/select-names/e-select-names-completion.c
- General changes to convert for ECompletionMatch use.
- (emailify_match): Use extra sort keys in ECompletionMatch to let
- us ensure that the primary email address is always the first
- option, the secondary comes second, etc. There was no nice way to
- do this previously.
- (match_name): Removed code that adjusted score based on
- similarities between the "real name" and the e-mail address. It
- seemed like a good idea at the time, but produced unexpected and
- confusing results.
-
-2001-06-04 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-card-compare.c: Added. Code for testing
- if two ECards appear to pertain to the same contact (using loose
- matching rules, as opposed to requiring exact equality) and to
- query the addressbook for the "best match" to ECard.
-
-2001-06-03 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (set_status_message): remove spew,
- and don't call the ShellView CORBA method if the interface doesn't
- exist (for whatever reason.)
-
- * gui/widgets/e-addressbook-view.c (e_addressbook_view_destroy):
- unref the EAddressbookModel.
- (create_minicard_view): unref the adapter.
- (card_added_cb): call e_book_error_dialog if status != SUCCESS.
- (card_modified_cb): same.
- (card_removed_cb): new function, and same.
- (delete_card_cb): pass card_removed_cb as the callback.
- (emit_status_message): new function, just emit status_message.
- (status_message): change to call emit_status_message.
- (card_deleted_cb): emit_status_message ("Done."), and call
- e_book_error_dialog if status != SUCCESS.
- (do_remove): pass view in the closure arg.
- (e_addressbook_view_delete_selection): emit status "Removing
- cards..." before starting the removal.
- (e_book_error_dialog): new function - pop up a (possibly) helpful
- message about why an operation failed.
-
- * gui/widgets/e-minicard-view-widget.c
- (e_minicard_view_widget_new): ref the EAddressbookReflowAdapter.
- (e_minicard_view_widget_destroy): unref the adapter.
- (e_minicard_view_widget_get_selection_model): if there isn't a
- minicard view return NULL.
-
- * gui/widgets/e-addressbook-table-adapter.c
- (e_addressbook_table_adapter_construct): ref the
- EAddressbookModel.
-
- * gui/widgets/e-addressbook-reflow-adapter.c
- (addressbook_finalize): rename this from addressbook_destroy, to
- reflect the method change.
- (e_addressbook_reflow_adapter_class_init): same.
- (e_addressbook_reflow_adapter_construct): ref the
- EAddressbookModel.
-
- * gui/widgets/e-addressbook-model.h: add editable_set flag.
-
- * gui/widgets/e-addressbook-model.c (writable_status): only record
- the writable state of the addressbook if the user hasn't set it.
- (e_addressbook_model_init): init editable_set to FALSE.
- (e_addressbook_model_set_arg): set editable_set to TRUE.
-
-2001-06-03 Ettore Perazzoli <ettore@ximian.com>
-
- * backend/ebook/Makefile.am (evolution_vcard_importer_LDADD): Move
- `$(DB3_LDADD)' before libeutil.
-
-2001-06-01 Ettore Perazzoli <ettore@ximian.com>
-
- * backend/ebook/Makefile.am (evolution_vcard_importer_LDADD): Add
- $(DB3_LDADD)'.
-
-2001-05-31 Christopher James Lahey <clahey@ximian.com>
-
- * backend/pas/Makefile.am (INCLUDES): Added db3 cflags.
-
- * backend/pas/pas-backend-file.c: Updated this to use db3.
-
-2001-05-31 Federico Mena Quintero <federico@ximian.com>
-
- * gui/widgets/e-addressbook-view.h (EAddressbookView): Added
- fields for the GalViewMenus and GalViewCollection; we need to keep
- them around while the component is active.
-
- * gui/widgets/e-addressbook-view.c
- (e_addressbook_view_setup_menus): Plug leak; unref the spec.
- Unref the factories. Do not unref the collection, since we need
- it for the signal emission (okay, so the views object adds a
- reference to it, but if we are interested in it we should keep a
- reference anyways).
- (e_addressbook_view_setup_menus): Create the collection and views
- on the EAddressbookView's fields so that we can keep them around.
- (e_addressbook_view_discard_menus): New function; gets rid of the
- collection and views objects.
-
- * gui/component/addressbook.c (control_activate_cb): Call
- e_addressbook_view_discard_menus().
-
-2001-05-31 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names.h (struct
- _ESelectNames): add the EAddressbookModel* and change the
- ETableModel's name to "adapter".
-
- * gui/component/select-names/e-select-names.c (set_book),
- (addressbook_model_set_uri): these two things take an
- EAddressbookModel* instead of an ETableModel now.
- (e_addressbook_create_ebook_table): don't case the
- EAddressbookModel* to ETableModel*, create an EAddressbookTableAdapter
- on the EAddressbookModel instead.
- (e_select_names_init): set e_select_names->adapter.
-
-2001-05-31 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-model.c (remove_card): decrement
- data_count before emitting the card_removed signal, and break
- after we've removed the matching card.
- (e_addressbook_model_class_init): change signature of
- "card_removed" signal to match what we emit (and what is
- expected.)
-
- * gui/widgets/e-addressbook-view.c (e_addressbook_view_init): the
- signal name is "destroy", not "destroyed".
- (do_remove): new function, actually remove the card.
- (e_addressbook_view_delete_selection): get this working for both
- view types.
-
-2001-05-31 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c: Print Preview =>
- ContactsPrintPreview. Changed peter's change so that the node
- name is more in line with "Print.."'s
-
-2001-05-30 Peter Williams <peterw@ximian.com>
-
- * gui/component/addressbook.c: Use the correct path to the print
- preview menu item.
-
-2001-05-30 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (cut_contacts_cb): new function, for
- the Cut verb.
- (copy_contacts_cb): new function, for the Copy verb.
- (paste_contacts_cb): new function, for the Paste verb.
- (select_all_contacts_cb): new function, for the Select All verb.
- (update_command_state): add handling for sensitivity of
- Cut/Copy/Paste/Select All.
-
- * gui/widgets/e-addressbook-view.c (e_addressbook_view_init): init
- the invisible and set up selection/destroy signals.
- (get_selection_model): new function, so we can get the
- ETableSelectionModel from either view type. makes lots of the
- other functions easier, since we can get the list of selected
- cards using the same code regardless of view type.
- (invisible_destroyed): new function.
- (selection_get): new function. convert the clipboard list to
- string.
- (selection_clear_event): new function - free up the list of
- ECards.
- (selection_received): if the selection data is valid and
- well-formed, add the corresponding cards to the ebook.
- (add_to_list): new function.
- (get_selected_cards): new function.
- (e_addressbook_view_cut): new function, implement in terms of
- _copy and _delete_selection.
- (e_addressbook_view_copy): claim ownership of the CLIPBOARD
- selection after saving the list of selected ECards.
- (e_addressbook_view_paste): call gtk_selection_convert.
- (e_addressbook_view_select_all): new function, using
- e_selection_model_select_all.
- (e_addressbook_view_can_print): re-implement in terms of
- get_selection_model.
- (e_addressbook_view_can_delete): same.
- (e_addressbook_view_can_cut): new function.
- (e_addressbook_view_can_copy): new function.
- (e_addressbook_view_can_paste): new function. hmm, always return
- TRUE here.
- (e_addressbook_view_can_select_all): new function.
-
- * gui/widgets/e-addressbook-view.h (struct _EAddressbookView): add
- selection stuff - the list of selected cards, and the GtkInvisible
- selection owner, and add prototypes for
- e_addressbook_view_[can]_{cut,copy,paste,select_all}.
-
- * gui/widgets/e-minicard-view-widget.h: add a prototype for
- e_minicard_view_widget_get_selection_model.
-
- * gui/widgets/e-minicard-view-widget.c
- (e_minicard_view_widget_get_selection_model): new function.
-
-2001-05-27 Dan Winship <danw@ximian.com>
-
- * gui/component/addressbook.c: #include
- "evolution-shell-component-utils.h" rather than "e-gui-utils.h"
- for e_pixmaps_update.
-
-2001-05-25 Peter Williams <peterw@ximian.com>
-
- * gui/component/Makefile.am: Reference libeshell.la instead of
- libeshell.a.
-
-2001-05-25 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-reflow-adapter.c (addressbook_height):
- Correct the height calculation here to not include the
- E_CARD_SIMPLE_FIELD_FAMILY_NAME since it won't be displayed.
-
- * gui/widgets/e-minicard.c (remodel): Changed this to continue to
- be more consistent and simpler.
-
-2001-05-23 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (view_destroy): fix strings such
- that ones that happening at the beginning or during an operation
- are followed by "..." and those that stop the operation are
- followed by "."
- (create_card_handler): same.
- (ldap_op_process_current): same, and also call _notify_complete if
- we can't connect to ldap server.
- (poll_ldap): same, and change "Polling for LDAP search result" to
- "Receiving LDAP search results"
-
- * backend/pas/pas-backend-file.c (pas_backend_file_search): call
- notify_status_message at the beginning of this function, and
- whenever we call _notify_complete.
-
-2001-05-23 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-addressbook-model.h: add sequence_complete_id to
- EAddressbookModel and stop_state_changed to
- EAddressbookModelClass. also, add prototype for
- e_addressbook_model_can_stop.
-
- * gui/widgets/e-addressbook-model.c (remove_book_view): disconnect
- from "sequence_complete", and set search_in_progress to FALSE.
- (sequence_complete): set search_in_progress to FALSE and emit
- "stop_state_changed."
- (e_addressbook_model_class_init): create the "stop_state_changed"
- signal.
- (e_addressbook_model_init): init stuff.
- (book_view_loaded): connect to "sequence_complete" signal.
- (book_view_loaded): set search_in_progress to TRUE and emit
- "stop_state_changed"
- (e_addressbook_model_stop): set search_in_progress to false, emit
- "stop_state_changed", and set our status to "Search Interrupted."
- (e_addressbook_model_can_stop): return search_in_progress.
-
- * gui/widgets/e-addressbook-view.c (e_addressbook_view_init):
- connect to the stop_state_changed signal on EAddressbookModel.
- (stop_state_changed): new function.
- (e_addressbook_view_can_stop): call e_addressbook_model_can_stop.
-
- * gui/component/addressbook.c (update_command_state): use
- e_addressbook_view_can_stop to set the sensitivity of the stop
- button.
-
-2001-05-22 Dan Winship <danw@ximian.com>
-
- * backend/ebook/e-book-listener.c (e_book_listener_check_queue):
- ref the listener for the duration of this function, since emitting
- "responses_queued" may cause it to be unreffed by its EBook in
- some cases, which could cause the second response_queue check to
- look at garbage data if it got destroyed.
- (e_book_listener_destroy): Call g_source_remove if idle_id is set.
-
-2001-05-22 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c: track the change in
- evolution-addressbook.xml's bonobo ui path's.
-
-2001-05-21 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (change_view_type): update_view_type
- is gone, since the menu item is gone.
-
- * gui/widgets/e-addressbook-table-adapter.c (create_card): use
- e_table_model_rows_inserted here.
-
-2001-05-20 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/addressbook-config.c
- (addressbook_source_item_new): Removed an unused variable.
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_get_property_fn): Made text here non-const.
-
- * gui/component/select-names/e-select-names-popup.c
- (edit_contact_info_cb): Cast to a gpointer here.
-
- * gui/component/select-names/e-select-names.c
- (e_addressbook_create_ebook_table): Cast to E_TABLE_MODEL here.
-
-2001-05-18 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (match_name): Do a better job constructing match strings, so we
- never try to use a segment of the name that isn't there (resulting
- in ugly (null)'s in the string). Boost our score if some part of
- the name also matches the front part of the e-mail address, so the
- name match will always trump the e-mail match.
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_get_property_fn): Return the serialized EDestinations
- (rather than just a string w/ e-mail addresses) through the bonobo
- component's property bag.
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_export_destinationv): Added. A convenience routine
- for serializing the model's EDestinations into a string.
-
- * gui/component/select-names/e-select-names-popup.c
- (add_html_mail): Added. Puts in a check menu item for whether or
- not the recipient wants HTML mail.
- (popup_menu_card): Add menu item for HTML mail. Enable edit
- contact info item.
- (popup_menu_nocard): Add menu item for HTML mail. Enable edit
- contact info item.
-
- * backend/ebook/e-book-util.c (e_book_use_local_address_book):
- Added. Fetches the local addressbook and caches it on the first
- call. This is meant to be an easy and efficient way to get at the
- local addressbook with the minimum of code.
- (e_book_query_address_locally): Added. Convenience code that
- does an e-mail only e_book_name_and_email_query against the
- local address book.
-
- * backend/ebook/e-destination.c
- (e_destination_set_html_mail_pref): Added. Allows the intended
- recipient's HTML mail preference to be manipulated.
- (e_destination_get_email_verbose): Added. Cleaned up to use
- e_destination_get_name.
- (e_destination_get_html_mail_pref): Added. Read the recipient's HTML mail
- preference. If the destination is linked to a card, the
- preference is taken from the card (unless it has been explicitly
- overridden by a called to e_destination_set_html_mail_pref).
- (e_destination_get_address_textv): Added. Form a unified address string
- from a NULL-terminated vector of EDestinations.
- (e_destination_export): Added. Serialize an EDestination to a string.
- (e_destination_import): Added. Unserialize a string to build an
- EDestination.
- (e_destination_exportv): Added. Serialize a NULL-terminated vector of
- EDestinations to a string.
- (e_destination_importv): Added. Unserialize a string to build a
- NULL-terminated vector of EDestinations.
-
- * gui/component/select-names/e-select-names-completion.c:
- Implemented local versions of g_strcasecmp and g_strncasecmp
- (which should really be in glib, I think...) for utf8, and used
- them to make this code utf8-safe.
-
-2001-05-17 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (update_command_state): no more
- ContactFind command.
-
-2001-05-17 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard-view-widget.c
- (e_minicard_view_widget_class_init): add our selection_change
- signal.
- (e_minicard_view_widget_realize): connect to the ESelectionModel's
- selection_changed signal.
- (e_minicard_view_widget_selected_count): new function.
- (selection_change): new function - emit our "selection_change"
- signal.
-
- * gui/widgets/e-minicard-view-widget.h (struct
- _EMinicardViewWidgetClass): add selection_change signal. also,
- add prototype for e_minicard_view_widget_selected_count.
-
- * gui/widgets/e-addressbook-view.c
- (e_addressbook_view_class_init): add our command_state_change
- signal.
- (e_addressbook_view_init): connect to the writable_status signal
- on the EAddressbookModel.
- (minicard_selection_change): new function - calls
- command_state_change.
- (create_minicard_view): connect to selection_change on the
- minicard_view so we know when to update command state.
- (table_selection_change): new function - calls
- command_state_change.
- (writable_status): new function - calls command_state_change.
- (command_state_change): new function - emits our
- "command_state_change" signal.
- (create_table_view): connect to the selection_change signal so we
- know to update the command state.
- (change_view_type): update the command state every time we change
- view types.
- (e_addressbook_view_can_create): new function.
- (e_addressbook_view_can_print): new function.
- (e_addressbook_view_can_delete): new function.
- (e_addressbook_view_can_stop): new function.
-
- * gui/widgets/e-addressbook-view.h (struct
- _EAddressbookViewClass): add command_state_change signal, and
- prototypes of functions the component can use to test the state of
- commands.
-
- * gui/widgets/e-addressbook-model.c (addressbook_destroy): unlink
- the writable_status signal on the EBook.
- (writable_status): new function.
- (e_addressbook_model_class_init): add our writable_status signal.
- (e_addressbook_model_init): init writable_status_id.
- (e_addressbook_model_set_arg): unlink the writable_status signal
- on the old EBook, and connect it on the new one.
-
- * gui/widgets/e-addressbook-model.h: add writable_status signal.
-
- * gui/component/addressbook.c (update_command_state): new
- function, set the sensitivity of the bonobo commands.
- (control_activate): update our command state immediately upon
- activating the control.
- (addressbook_factory_new_control): register command_state_change
- to update the commands.
-
-2001-05-15 Chris Toshok <toshok@ximian.com>
-
- * gui/search/e-addressbook-search-dialog.c
- (e_addressbook_search_dialog_init): initialize the model and
- adapter.
- (button_press): set on the model.
- (e_addressbook_search_dialog_new): same.
- (e_addressbook_search_dialog_set_arg): same.
- (e_addressbook_search_dialog_destroy): unref the model and
- adapter.
-
- * gui/search/e-addressbook-search-dialog.h (struct
- _EAddressbookSearchDialog): add our model and reflow adapter.
-
-2001-05-16 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-minicard-view.c: (e_minicard_view_destroy): Fixed
- up the lifetime of the drag_data_get signal a bit.
-
-2001-05-15 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard-view.c (add_to_list): MinicardViewModel
- -> ReflowAdapter name change.
- (get_card_list): same.
- (e_minicard_view_drag_begin): same.
- (supported_fields_cb): model -> adapter.
- (adapter_changed): hook up signals and set the empty message on
- our adapter.
- (e_minicard_view_set_arg): add support for "adapter", and set
- model -> adapter.
- (e_minicard_view_get_arg): same.
- (disconnect_signals): no more status_message.
- (do_remove): track to use adapter.
- (e_minicard_view_class_init): add adapter arg, and remove
- status_message.
- (e_minicard_view_init): all the code here is in adapter_changed
- now.
-
- * gui/widgets/e-minicard-view.h (struct _EMinicardView):
- EMinicardViewModel -> EAddressbookReflowAdapter.
- (struct _EMinicardViewClass): get rid of status_message.
-
- * gui/widgets/e-minicard-view-widget.c
- (e_minicard_view_widget_class_init): remove the status_message
- signal.
- (e_minicard_view_widget_new): take the adapter as our argument,
- and store it away for when we create the view.
- (e_minicard_view_widget_realize): when we create the view just set
- the adapter field on it. also, don't connect to status_message.
-
- * gui/widgets/e-minicard-view-widget.h (struct
- _EMinicardViewWidget): add our adapter here, so we can pass it
- into the view when we create it.
- (struct _EMinicardViewWidgetClass): remove status_message.
-
- * gui/widgets/e-addressbook-view.c (status_message): new function,
- no more propagating status messages!
- (e_addressbook_view_init): create our model and conenct to its
- status_message signal.
- (book_writable_cb): set "editable" on the model, not our object.
- (e_addressbook_view_set_arg): same, but with "book" and "query" as
- well.
- (create_minicard_view): create our reflow adapter and pass it to
- the minicard view widget. also, call e_reflow_model_changed so
- it'll pick up any already present cards.
- (table_double_click): ADDRESSBOOK_MODEL -> TABLE_ADAPTER.
- (get_card_list_1): remove the cast, since we don't need it any
- longer.
- (table_right_click): ADDRESSBOOK_MODEL -> TABLE_ADAPTER.
- (table_drag_data_get): same.
- (create_table_view): create the table adapter, and use it as our
- ETableModel.
- (change_view_type): remove the status_message hook up and setting
- of query/book/editable.
- (e_addressbook_view_stop): just call e_addressbook_model_stop here
- instead of switching on the view type.
-
- * gui/widgets/e-addressbook-view.h (struct _EAddressbookView): add
- our EAddressbookModel.
-
- * gui/widgets/Makefile.am (libeminicard_a_SOURCES): add the
- adapter files, and remove e-minicard-view-model.[ch].
-
- * gui/widgets/e-minicard-view-model.[ch]: removed.
-
- * gui/widgets/e-addressbook-table-adapter.c: new file.
-
- * gui/widgets/e-addressbook-table-adapter.h: new file.
-
- * gui/widgets/e-addressbook-reflow-adapter.c: new file.
-
- * gui/widgets/e-addressbook-reflow-adapter.h: new file.
-
- * gui/widgets/e-addressbook-model.c: rework this class to now
- subclass from ETableModel anymore. It not subclasses from
- GtkObject, and we use table and reflow adapters to get at the
- data.
-
- * gui/widgets/e-addressbook-model.h: same.
-
-2001-05-14 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-minicard-view-model.c (remove_card): Fix a small
- error not decreasing the data_count here.
-
-2001-05-13 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.h: add prototype for
- addressbook_expand_uri.
-
- * gui/component/addressbook-component.c
- (destination_folder_handle_drop): create an EBook for
- @physical_uri.
- (dnd_drop_book_open_cb): actually add the dropped cards.
-
- * gui/component/addressbook.c (addressbook_expand_uri): abstract
- this code out from the set_prop method so we can use it in the
- component.
- (set_prop): call addressbook_expand_uri.
-
- * backend/ebook/e-card.c (e_card_load_cards_from_string): new
- function.
-
- * backend/ebook/e-card.h: add prototype for
- e_card_load_cards_from_string.
-
-2001-05-12 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c
- (destination_folder_handle_drop): spew the data passed to us.
- (destination_folder_handle_motion): the suggested_action is not an
- ActionSet, but an Action, so don't or together multiple actions.
-
-2001-05-11 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-config.c (addressbook_source_dialog):
- correct bug causing the Ok button to never be enabled.
-
-2001-05-11 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c (populate_context_menu):
- example.
-
-2001-05-11 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard-view.c (e_minicard_view_drag_data_get):
- use e_card_list_get_vcard to build up the data to send.
- (e_minicard_view_init): connect to the model's drag_begin signal.
- (e_minicard_view_drag_begin): gather the list of cards being
- dragged and call gtk_drag_begin.
- (add_to_list): new function.
- (get_card_list): same.
- (disconnect_signals): disconnect the drag_data_get signal.
- (e_minicard_view_init): connect to the drag_begin signal on our
- model.
-
- * gui/widgets/e-minicard-view.h (struct _EMinicardView): change
- drag_card to drag_list.
-
- * gui/widgets/e-minicard-view-model.c (minicard_drag_begin): new
- function, emit our drag_begin signal.
- (addressbook_incarnate): connect to the item's drag_begin signal.
- (e_minicard_view_model_class_init): init our drag_begin signal.
-
- * gui/widgets/e-minicard-view-model.h: add drag_begin signal.
-
- * gui/component/addressbook-config.c (addressbook_source_dialog):
- always loop through all source types here, making LDAP first so
- it's forces as the first notebook item.
- (addressbook_config_auth_label): remove SASL case.
- (addressbook_source_edit_changed): same.
- (addressbook_source_item_new): flag the area of code that needs to
- go into the advanced dialog (if we add one before someone
- graciously redesigns the entire addressbook gui :)
-
-
- * gui/component/addressbook-storage.c (ldap_unparse_auth): remove
- SASL case.
- (ldap_parse_auth): same.
-
- * gui/component/addressbook-storage.h: make LDAP come first in our
- source type enumeration, and remove the SASL auth type.
-
-2001-05-11 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card.c (e_card_set_arg): If the name is set and
- the full_name or file_as haven't been yet, set them.
-
-2001-05-11 Christopher James Lahey <clahey@ximian.com>
-
- * backend/pas/pas-backend-file.c: Reordered the includes here.
- (string_to_dbt): The sleepycat libdb documentation suggests
- memseting the DBT to 0 so we do that here.
-
- * gui/widgets/e-minicard-view-model.c (addressbook_height): Skip
- the E_CARD_SIMPLE_FIELD_FAMILY_NAME field.
-
- * gui/widgets/e-minicard.c (remodel): Skip the
- E_CARD_SIMPLE_FIELD_FAMILY_NAME field.
-
-2001-05-11 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_connect): only
- check schema support if we've connected.
-
-2001-05-11 Chris Toshok <toshok@ximian.com>
-
- * contact-editor/e-contact-editor.c (enable_writable_fields):
- don't leak the ECard or ECardSimple.
-
-2001-05-08 Iain Holmes <iain@ximian.com>
-
- * backend/ebook/GNOME_Evolution_Addressbook_VCard_Importer.oaf.in:
- Renamed the GnomeCard_Importer.oaf.in to this, and change the IID.
-
- * Makefile.am: Rename all the GnomeCard to VCard.
-
- * evolution-vcard-importer.c: Make the GnomeCard a generic
- vcard importer.
-
-2001-05-08 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/Makefile.am (libebookinclude_HEADERS): Removed
- e-card-pairs.h since we're not using it.
-
- * backend/ebook/e-book-view.c (e_book_view_check_listener_queue):
- Added break; to default: case here.
-
- * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h:
- Added changed variable so as to avoid sync_card when possible.
- (e_card_simple_destroy): Free all the data here properly.
- (e_card_simple_get_arg): Slight simplification here.
- (fill_in_info, e_card_simple_arbitrary_foreach,
- e_card_simple_get_arbitrary): Call e_card_free_empty_lists here to
- save a bit of memory.
-
- * backend/ebook/e-card.c, backend/ebook/e-card.h: Fixed up
- includes a bit.
- (e_card_list_get_vcard, e_card_list_send): Added these functions
- for acting on a group of cards.
- (parse_org): Cleaned up this function a bit.
- (e_card_free_empty_lists): Added this function to delete
- unnecessary ELists and save a bit of memory.
- (e_v_object_get_child_value): Made this return NULL if not found
- instead of g_strdup("").
-
- * contact-editor/e-contact-save-as.c,
- contact-editor/e-contact-save-as.h (e_contact_list_save_as): Added
- this function to save multiple contacts.
-
- * gui/widgets/Makefile.am: Commented out reflow test.
- (libeminicard_a_SOURCES): Added e-minicard-view-model.c and
- e-minicard-view-model.h.
-
- * gui/widgets/e-minicard-view-model.c,
- gui/widgets/e-minicard-view-model.h: Model for use in
- EMinicardView.
-
- * gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h:
- Reworked this to use the new EReflow stuff.
-
- * gui/widgets/e-minicard.c (e_minicard_event): Doesn't handle
- right click menus now. Emits a signal on the parent canvas item
- instead.
-
- * printing/e-contact-print-envelope.c,
- printing/e-contact-print-envelope.h
- (e_contact_print_envelope_list_dialog_new): Added this function to
- print multiple envelopes (only prints first for now.)
-
- * printing/e-contact-print.c, printing/e-contact-print.h
- (e_contact_print_card_list_dialog_new): Added this function to
- print multiple cards. Only prints the first for now.
-
-2001-05-07 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c (remove_folder): flesh out
- the function more. It should work now, but there's no way to
- invoke this method from the ui at the moment, heh.
-
-2001-05-07 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook.c (book_open_cb): Use a different
- error message in the ldap support/no ldap support/file cases.
-
-2001-05-07 Gediminas Paulauskas <menesis@delfi.lt>
-
- * gui/component/addressbook.c: use define from
- widgets/misc/e-filter-bar.h instead of own enumeration and search menu
- names.
-
- * gui/component/Makefile.am, gui/component/select-names/Makefile.am:
- removed EVOLUTION_VERSION.
-
-2001-05-04 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c (remove_folder): un-#if 0
- this.
- (xfer_folder): add skeleton code to validate xfer request. always
- notifies with PERMISSION_DENIED at present.
- (populate_context_menu): un-#if 0 this.
- (get_dnd_selection): same.
- (destination_folder_handle_motion): new function.
- (destination_folder_handle_drop): new function.
- (factory_fn): create a EvolutionShellComponentDndDestinationFolder
- interface, and add it to our shell component.
-
-2001-05-04 JP Rosevear <jpr@ximian.com>
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_process_get_book_view): init change_id to NULL
-
-2001-05-02 JP Rosevear <jpr@ximian.com>
-
- * gui/component/addressbook.c (addressbook_view_free): unref the
- book if the view is being destroyed
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_process_get_book_view): unref the book_view when
- we are finished, it is only interesting if someone else has reffed
- it now (weak reference)
- (pas_backend_file_add_client): unref the book for the same reason
- as above
-
- * Fixes bug #2255
-
-2001-04-30 JP Rosevear <jpr@ximian.com>
-
- * backend/pas/pas-backend-file.c (vcard_matches_search): if the
- view does not contain a search context, the result is by default
- false fixes #2470
-
-2001-04-25 Dan Winship <danw@ximian.com>
-
- * gui/component/addressbook-factory.c (main): Remove call to
- unicode_init.
-
-2001-04-23 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/e-address-popup.c: Lots of code has been
- simplified here.
- (e_address_popup_factory_new_control): Rather than directly pop
- our control up in a window (via the e_address_popup_popup
- function, which is now gone), just return the widget and let the
- caller do the popping. This works better, since it means we don't
- have to work around the vagaries of bonobo focus & event handling.
- (e_address_popup_set_name): Refresh when both name & email have
- been set, rather than checking a stupid counter.
- (e_address_popup_set_email): Ditto.
-
-2001-04-22 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/addressbook-storage.c
- (addressbook_storage_clear_sources): Added save_source_data here.
-
-2001-04-21 Jon Trowbridge <trow@ximian.com>
-
- * contact-editor/e-contact-quick-add.c (clicked_cb): Properly
- convert to utf8. (Bug #2256)
- (build_quick_add_dialog): Properly convert from utf8. (Bug #2256)
-
-2001-04-16 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-destination.c (e_destination_get_name): Added.
-
- * gui/component/select-names/e-select-names.c
- (real_add_address_cb): Use e_select_names_model_append. It's
- nicer.
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_append): Added.
-
- * gui/component/select-names/e-select-names-completion.c
- (book_query_process_card_list): Filter out completion matches that
- don't have an associated e-mail address.
- (book_query_score): Give a bonus to the primary address, so that
- it always comes up first in the completion results.
-
- * gui/component/e-address-popup.c (e_address_popup_refresh_names):
- Convert utf8 strings into gtk strings before displaying.
-
-2001-04-14 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-book-view-listener.c,
- backend/ebook/e-book-view-listener.h: Added the function
- e_book_view_listener_stop to tell the book view listener to stop
- sending signals.
-
- * backend/ebook/e-book-view.c (e_book_view_destroy): Tell the
- EBookViewListener to stop when we're destroyed.
-
- * backend/pas/pas-backend-file.c (view_destroy,
- pas_backend_file_process_get_book_view,
- pas_backend_file_process_get_changes): Cleaned these up a bit
- using bonobo_object_ref and bonobo_object_unref.
- (pas_backend_file_process_get_book_view,
- pas_backend_file_process_get_changes): bonobo_object_release_unref
- the EBookListener here.
-
- * backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_process_get_book_view): Cleaned this up a bit
- using bonobo_object_ref. Make sure to unref the listener when
- we're done with it. Put the new book_view in the list before
- telling the book_listener that it's ready.
-
- * backend/pas/pas-book-view.c (pas_book_view_construct): Cleaned
- this up a bit using bonobo_object_dup_ref.
- (pas_book_view_destroy): Cleaned this up a bit using
- bonobo_object_release_unref.
-
- * backend/pas/pas-book.c (pas_book_queue_get_book_view,
- pas_book_queue_get_changes): bonobo_object_dup_ref here instead of
- just duplicating.
-
-2001-04-14 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-book-listener.c
- (impl_BookListener_respond_get_cursor): Ref the cursor here when
- we receive it.
- (impl_BookListener_respond_get_view,
- impl_BookListener_respond_get_changes): Ref the book_view here
- when we receive it.
- (impl_BookListener_respond_open_book): Ref the book here when we
- receive it.
- (e_book_listener_destroy): Unref the objects in our queue here.
-
- * backend/ebook/e-book-view.c (e_book_view_construct): Cleaned
- this up using bonobo_object_dup_ref.
- (e_book_view_destroy): Cleaned this up using
- bonobo_object_release_unref.
-
- * backend/ebook/e-book.c (e_book_do_response_get_cursor,
- e_book_do_response_get_view, e_book_do_response_get_changes,
- e_book_unload_uri): Cleaned this up using
- bonobo_object_release_unref.
-
-2001-04-13 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_get_property_fn): Get the ESelectNamesModel from the
- widget's text model instead of storing it as a gtk_object_set_data
- since it may change.
-
-2001-04-12 Jason Leach <jasonleach@usa.net>
-
- * backend/pas/pas-backend-file.c (INITIAL_VCARD): Update the Voice
- and Fax phone numbers too, finishing off bug #1667.
-
-2001-04-11 Christopher James Lahey <clahey@ximian.com>
-
- * backend/pas/pas-backend-file.c (INITIAL_VCARD): Update the built
- in VCard.
-
-2001-04-12 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (local_record_from_ecard): put the
- business address into the pilot record as that is what we put into
- the desktop record
- (ecard_from_remote_record): set both the address label and
- delivery address to avoid bad parser guessing, fixes #2143
-
- * backend/ebook/e-card-types.h: remove deprecated pilot code
-
- * backend/ebook/e-card.c: ditto
-
- * backend/ebook/e-card.h: ditto
-
-2001-04-11 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (local_record_from_ecard): Don't add
- more than five phone numbers and set the remaining blank entries
- to some reasonable defaults
-
-2001-04-11 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-simple.h: Added
- E_CARD_SIMPLE_FIELD_LAST_SIMPLE_STRING.
-
- * gui/component/addressbook-component.c (accepted_dnd_types):
- Fixed a warning here.
-
- * gui/widgets/e-addressbook-model.c: Modified this to have more
- columns, but not let them be edited if they're not a simple
- string.
-
- * gui/widgets/e-minicard-view.c (e_minicard_view_init): Fixed a
- warning and a memory leak here.
-
-2001-04-10 Gediminas Paulauskas <menesis@delfi.lt>
-
- * backend/ebook/evolution-gnomecard-importer.c: added missing #include.
- * contact-editor/e-contact-editor.c (_arrow_pressed): popup menu items were
- not translated after selecting one of them.
- * gui/widgets/e-addressbook-view.c: mark popup menu items with N_().
- Updated list[] for translators.
- * gui/widgets/e-minicard.c: same.
- * gui/widgets/e-minicard-view-widget.c (e_minicard_view_widget_set_arg): fix warning
- for "editable" arg.
- * gui/widgets/e-minicard-view.c: convert "empty_message" to utf8.
-
-2001-04-09 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-component.c (remove_folder): stubbed,
- #if 0'ed
- (xfer_folder): same.
- (populate_context_menu): same.
- (get_dnd_selection): same.
- (factory_fn): add the accepted drag types ("text/x-vard") to
- folder_types.
-
-2001-04-09 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard.c (e_minicard_event): on BUTTON_PRESS: if
- it's button 1, store the button x, y, and set drag_button_down to
- TRUE. on BUTTON_RELEASE: always set drag_button_down to FALSE.
- for MOTION_NOTIFY: initiate drag if the pointer has moved 3
- pixels.
-
- * gui/widgets/e-minicard.h (struct _EMinicard): add fields for
- button x, y, and a bit for if the button has been pressed so we
- can tell whether a motion should be a drag.
- (struct _EMinicardClass): add drag_begin signal.
-
- * gui/widgets/e-minicard-view.c (e_minicard_view_drag_begin): new
- function, starts the drag.
- (book_view_loaded): connect the "drag_data_get" signal.
- (e_minicard_view_drag_data_get): new function.
-
- * gui/widgets/e-minicard-view.h (struct _EMinicardView): add
- drag_card and id for canvas_drag_data_get_id.
-
- * gui/widgets/e-addressbook-view.c (table_drag_data_get): new
- function.
- (create_table_view): add d&d stuff.
-
-2001-04-08 Chris Toshok <toshok@ximian.com>
-
- * printing/e-contact-print.c: add #include <sys/types.h> since
- gnome-print.h uses time_t without including it. this really
- should be fixed in gnome-print.
-
-2001-04-08 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_add_client):
- make sure to notify new clients to the writable status of an
- already open (and authenticated) book.
-
-2001-04-04 Kjartan Maraas <kmaraas@gnome.org>
-
- * contact-editor/e-contact-editor.[ch]: Fix headers.
- * component/addressbook-storage.c: Same here.
- * gui/search/e-addressbook-search-dialog.c: Same here.
- * gui/widgets/e-addressbook-view.c: Same here.
- * gui/widgets/e-minicard-label.c: Same here.
- * gui/widgets/e-minicard-view-widget.c: Same here.
- * gui/widgets/e-minicard-view.c: Same here.
- * gui/widgets/e-minicard-widget-test.c: Same here.
- * gui/widgets/e-minicard-widget.c: Same here.
- * gui/widgets/e-minicard.c: Same here.
- * gui/widgets/test-minicard-label.c: Same here.
-
-2001-04-03 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (table_double_click): Fixed a
- crash here.
-
-2001-04-03 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-model.c (COLS): Made this table model
- more consistent in the number of columns it has.
- (addressbook_append_row): Fixed this function. We removed the col
- offset.
-
-2001-04-02 Iain Holmes <iain@ximian.com>
-
- * backend/ebook/evolution-gnomecard-importer.c (importer_init): Shut
- down and unregister the factory on exit.
-
-2001-04-01 Gediminas Paulauskas <menesis@delfi.lt>
-
- * contact-editor/contact-editor.glade: changed icon to
- evolution-contacts-plain.png.
- * gui/component/addressbook.c: use new pixmap cache. Added icon for new
- contact, print, print preview, changed filenames of renamed icons.
-
-2001-03-31 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (real_add_address_cb): Call e_select_names_model_clean after
- adding address. This should deal with the bug reports related
- to stray commas.
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_clean): Added. Remove all empty destinations.
-
- * backend/ebook/e-destination.c (e_destination_is_empty): Added. Check
- if an EDestination is in essentially a null state.
-
-2001-03-30 Christopher James Lahey <clahey@ximian.com>
-
- * backend/pas/pas-backend-file.c (pas_backend_file_add_client):
- Tell new clients that are added whether they're writable.
-
-2001-03-29 Jon Trowbridge <trow@ximian.com>
-
- * printing/e-contact-print.c: Added #include <libgnome/gnome-paper.h>
-
- * printing/e-contact-print-envelope.c: Added #include <time.h>
- and #include <libgnome/gnome-paper.h>
-
-2001-04-03 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (match_email): Better handle matching of "nameless" contacts.
-
- * backend/ebook/e-destination.c (e_destination_get_string): Better
- handle the case of a "nameless" contact.
-
-2001-03-29 Kjartan Maraas <kmaraas@gnome.org>
-
- * *.*: Clean up #includes. Replace <gnome.h>, <bonobo.h> and
- <gtk/gtk.h> with more finegrained headers where needed.
-
-2001-03-28 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card.c (e_card_set_arg): Fixed some crashes.
-
-2001-03-28 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names-table-model.c
- (fill_in_info): Use E_CARD_SIMPLE_FIELD_NAME_OR_ORG instead of
- getting the NAME and then the ORG. That way if we expand
- NAME_OR_ORG, this will use it.
-
- * gui/component/select-names/e-select-names.c
- (e_addressbook_create_ebook_table, SPEC): Use the correct column
- in the SPEC.
-
-2001-03-25 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_seq_complete_cb): Rather than starting
- the pending query by directly calling
- e_select_names_completion_do_query, call
- e_completion_begin_search. Circumventing the ECompletion API was
- causing it to get confused in some cases.
-
-2001-03-23 Jon Trowbridge <trow@ximian.com>
-
- * gui/widgets/e-minicard-widget.c (e_minicard_widget_set_card):
- Added. Call me old-fashioned, but I just prefer to have a real
- API rather than doing everything via gtk_object_get/set-type
- calls.
- (e_minicard_widget_set_arg): Changed to call
- e_minicard_widget_set_card.
-
- * backend/ebook/e-book-util.c: Small changes to get rid of
- compiler warnings. (Casting out const, removed unused variables,
- etc.) Removed some debugging messages.
-
- * gui/component/addressbook-factory.c (main): Added call
- to e_address_popup_factory_init.
-
- * gui/component/e-address-popup.c: Added. A popup gadget that is
- invoked (as a bonobo control) when an address is left-clicked in
- the mailer. The addressbook is queries, and the address is either
- displayed as a minicard (if it already exists) or in a "generic
- format". A button is provided for editting/adding the contact.
- Some of the semantics of this widget are a bit... non-standard,
- because of bonobo issues. I can't really seem to replicate
- popup-menu behavior because of how bonobo propogates events, etc.
- so I've tried to produce something that I think is non-annoying.
- YMMV.
-
-2001-03-22 Iain Holmes <iain@ximian.com>
-
- * backend/ebook/evolution-gnomecard-importer.c: Update to the new
- IDL.
-
-2001-03-20 Miguel de Icaza <miguel@ximian.com>
-
- * gui/component/addressbook.c (update_pixmaps): Added artwork from
- Jakub.
-
-2001-03-19 Christopher James Lahey <clahey@ximian.com>
-
- * Merged branch:
-
-2001-03-14 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-minicard-view.c: Call
- e_selection_model_simple_insert_rows and
- e_selection_model_simple_delete_rows instead of
- e_selection_model_simple_insert_row and
- e_selection_model_simple_delete_row.
-
-End of branch
-
-2001-03-17 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c: Brutally
- refactored to boost performance in large-addressbook situations.
- These fixes give accepable performance (even with the suboptimal
- pas-backend-file searching) using tigert's addressbook-of-death.
-
- * backend/pas/pas-backend-file.c (pas_backend_file_search):
- Start feeding query matches back to the caller before the
- entire search is complete; this gives us some "instant feedback"
- rather than causing evolution to totally lock up...
-
- * backend/ebook/e-book.c (e_book_queue_op): Tag all queued ops.
- (e_book_cancel_op): Added. Search for a pending op with a given
- tag, and mark it as inactive.
- (e_book_do_response_get_cursor): Don't execute callback if this
- operations has been cancelled.
- (e_book_do_response_get_view): Ditto.
- (e_book_do_response_get_changes): Ditto.
- (e_book_do_response_get_supported_fields): Ditto.
- (e_book_get_supported_fields): Return an operation tag (that can
- be used to cancel the operation) rather than just TRUE/FALSE.
- Zero is always an invalid tag and is returned in the case of an
- error, so this shouldn't break any code that looked at the return
- value (unless it did so in a particularly stupid way, of course).
- (e_book_get_cursor): Ditto.
- (e_book_get_book_view): Ditto.
- (e_book_get_changes): Ditto.
- (e_book_cancel): Added. Cancel a pending operation. (Basically
- a call to e_book_cancel_op with error checking, etc.)
-
- * backend/ebook/e-book-types.h: Added E_BOOK_STATUS_CANCELLED.
-
-2001-03-17 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book-listener.c
- (e_book_listener_queue_writable_status): new function.
- (impl_BookListener_report_writable): new function.
- (e_book_listener_get_epv): fill in epv->notifyWritable.
-
- * backend/ebook/e-book-listener.h: add writable status entries.
-
- * backend/ebook/e-book.c (e_book_do_writable_event): new function.
- (e_book_check_listener_queue): add WritableStatusEvent to the
- switch.
- (e_book_class_init): register writable_status signal.
-
- * backend/ebook/e-book.h: add writable_status signal.
-
- * backend/idl/addressbook.idl: add notifyWritable method to
- BookListener.
-
- * gui/widgets/e-minicard.c (e_minicard_class_init): add "editable"
- arg.
- (e_minicard_init): init editable.
- (e_minicard_set_arg): loop over the minicard fields setting their
- "editable".
- (e_minicard_get_arg): add editable.
- (supported_fields_cb): use editable when creating the
- contact_editor.
- (add_field): set "editable" when creatin the e_minicard.
-
- * gui/widgets/e-minicard.h (struct _EMinicard): add "editable".
-
- * gui/widgets/e-minicard-view.c (e_minicard_view_class_init): add
- editable arg.
- (e_minicard_view_init): init editable.
- (create_card): pass editable to e_minicard canvas item.
- (e_minicard_view_set_arg): bit of a hack - loop over all the
- canvas items setting their "editable."
- (e_minicard_view_get_arg): add editable.
- (supported_fields_cb): use editable when creating the contact
- editor.
-
- * gui/widgets/e-minicard-view.h (struct _EMinicardView): add
- "editable."
-
- * gui/widgets/e-minicard-view-widget.c
- (e_minicard_view_widget_class_init): add "editable" field.
- (e_minicard_view_widget_init): init editable to FALSE.
- (e_minicard_view_widget_set_arg): save editable, and pass it along
- the e-minicard-view.
- (e_minicard_view_widget_realize): same.
- (e_minicard_view_widget_get_arg): add editable.
-
- * gui/widgets/e-minicard-view-widget.h (struct
- _EMinicardViewWidget): add "editable" field.
-
- * gui/widgets/e-minicard-label.h (struct _EMinicardLabel): add
- "editable" field.
-
- * gui/widgets/e-minicard-label.c (e_minicard_label_class_init):
- add "editable" arg.
- (e_minicard_label_set_arg): editable, set it on the e_text too.
- (e_minicard_label_get_arg): editable.
- (e_minicard_label_construct): set the "editable" field when we
- create the e_text cavas item
-
- * gui/widgets/e-addressbook-view.c (e_addressbook_view_init):
- default editable to FALSE.
- (book_writable_cb): new function, set our editable field and
- gtk_object_set it on the active view.
- (e_addressbook_view_set_arg): set the active view's editable when
- we set the view's book, and connect the "writable_status" signal
- to book_writable_cb.
- (change_view_type): same.
- (supported_fields_cb): use our "editable" when creating the
- contact editor.
-
- * gui/widgets/e-addressbook-view.h (struct _EAddressbookView): add
- editable field.
-
- * gui/widgets/e-addressbook-model.c (e_addressbook_model_init):
- change the default of editable to FALSE.
-
- * backend/pas/pas-book.c (pas_book_report_writable): new function.
-
- * backend/pas/pas-book.h: prototype for pas_book_report_writable.
-
- * backend/pas/pas-backend-file.c (pas_backend_file_load_uri): if
- we open the file O_RDWR (or create it) report it as writable. if
- we can't open it as O_RDWR, try opening it read-only before we
- attempt to create it.
-
- * backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_process_authenticate_user): if we authenticate
- successfully, grant write permissions (this is lacking but there's
- really nothing we can do to determine the extent of the access
- afforded a user.)
-
-
-2001-03-15 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/e-address-widget.c: Added addressbook querying and
- "cardification" functions, which are turned off by default for now
- because of addressbook bugs. Added a popup menu option to turn
- queries on, so that others can enjoy the thrill of massive flaming
- death.
-
- * gui/component/addressbook-factory.c (main): Made warnings always
- be fatal.
-
- * backend/pas/pas-book-view.c: Added some debugging spew.
-
- * backend/pas/pas-backend-file.c (pas_backend_file_search): Added
- a little experimental code to try to make file searches scale
- better. #if 0/#endif-ed out for now.
-
- * contact-editor/e-contact-quick-add.c: #included e-book-util.h.
-
- * backend/ebook/e-card.c (e_card_name_match_string): Added.
- Looser name-matching function.
- (e_card_email_match_string): Added. Loose e-mail matching.
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_check_queue): Added code to cause us to
- abort rather than get trapped in a 100%-CPU-consuming loop in
- certain situations. Now we just need to figure out how to avoid
- these situations altogether.
-
- * backend/ebook/e-book-util.c: Added. Now contains the simple
- query stuff and the open local addressbook functions.
-
- * backend/ebook/e-book.c: Moved simple query stuff and open local
- addressbook functions into e-book-util.c.
-
-2001-03-15 Dan Winship <danw@ximian.com>
-
- * gui/widgets/e-minicard-label.c (e_minicard_label_set_arg):
- * gui/widgets/e-minicard.c (e_minicard_set_arg, e_minicard_event):
- Update arguments to e_canvas_item_grab_focus.
-
-2001-03-13 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/addressbook.c (update_pixmaps): Fix a warning
- here.
-
-2001-03-13 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/Makefile.am (minicard_label_test_LDADD): Change to
- ld order from Greg Williams.
-
-2001-03-13 Christopher James Lahey <clahey@ximian.com>
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_process_get_book_view): Moved where we call
- pas_book_respond_get_book_view.
-
-2001-03-12 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c: add E_STRING_PROP for
- categories.
-
- * backend/pas/evolutionperson.schema: add categories attribute.
-
- * backend/ebook/e-card-simple.c (field_data): add
- E_CARD_SIMPLE_FIELD_CATEGORIES.
-
- * backend/ebook/e-card-simple.h: add
- E_CARD_SIMPLE_FIELD_CATEGORIES.
-
-2001-03-12 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard.c (supported_fields_cb): add is_read_only
- param.
-
- * gui/widgets/e-minicard-view.c (supported_fields_cb): add
- is_read_only param.
-
- * gui/widgets/e-addressbook-view.c (supported_fields_cb): add
- is_read_only param.
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_activate_obj): add is_read_only param.
- also, include a little policy here and make it TRUE, as the user
- shouldn't be editting in this context anyway (imo).
-
- * gui/component/addressbook.c (supported_fields_cb): add
- is_read_only param.
-
- * contact-editor/test-editor.c (main): add is_read_only param.
-
- * contact-editor/e-contact-editor.c (set_read_only): new function,
- that either enables or disables all the text fields, combo boxes,
- and some buttons, depending on the state of is_read_only.
- (e_contact_editor_class_init): add read/write arg "is_read_only".
- (full_name_clicked): set the is_read_only of the fullname dialog
- to the editor's.
- (full_addr_clicked): same.
- (e_contact_editor_new): add is_read_only param, that gets set
- along with the other params.
- (e_contact_editor_set_arg): add setter for is_read_only.
- (e_contact_editor_get_arg): add getter for is_read_only.
- (_phone_arrow_pressed): change TRUE to !editor->is_read_only for
- entry.
- (_email_arrow_pressed): same.
- (_address_arrow_pressed): same.
- (enable_writable_fields): same.
-
- * contact-editor/e-contact-editor-fullname.c
- (e_contact_editor_fullname_class_init): add read/write arg
- "is_read_only".
- (e_contact_editor_fullname_set_arg): add setter for is_read_only
- that enables/disables all the entries/combos.
- (e_contact_editor_fullname_get_arg): add getter for is_read_only.
-
- * contact-editor/e-contact-editor-fullname.h (struct
- _EContactEditorFullname): add is_read_only flag.
-
- * contact-editor/e-contact-editor-address.c
- (e_contact_editor_address_class_init): add read/write arg
- "is_read_only".
- (e_contact_editor_address_set_arg): add setter for is_read_only
- that disables/enables all the entries/combos.
- (e_contact_editor_address_get_arg): add getter for is_read_only.
-
- * contact-editor/e-contact-editor-address.h (struct
- _EContactEditorAddress): add is_read_only flag.
-
-2001-03-13 Iain Holmes <iain@ximian.com>
-
- * backend/ebook/Makefile.am: Change the importer includes around a bit.
-
- * backend/ebook/evolution-gnomecard-importer.c: Correctly add the includes.
-
-2001-03-09 JP Rosevear <jpr@ximian.com>
-
- * conduit/Makefile.am: PISOCK_INCLUDEDIR has become
- PISOCK_CFLAGS in gnome-pilot.m4 and remove capplet foo
-
-2001-03-11 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-book.c (e_book_simple_query): Added. A
- simplified, cancellable query mechanism that lets you avoid
- dealing with EBookView.
- (e_book_simple_query_cancel): Added. Cancels a running query.
-
- * backend/ebook/e-book-types.h: Add enum EBookSimpleQueryStatus.
-
-2001-03-08 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-popup.c
- (quick_add_cb): Switched to use e_contact_quick_add_free_form.
- Removed debugging code, hopefully without introducing any bugs
- in the process.
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_insert_length): Fix bug with commas
- inside of name/address combos. As long as the comma is inside of
- quotes, it will be treated as part of the name rather than as a
- break between addresses.
-
- * gui/component/select-names/e-select-names-completion.c
- (match_nickname): Use e_card_name_to_string for nickname match
- strings.
- (match_email): Use e_card_name_to_string for email match strings.
- (e_select_names_completion_begin): Strip quotes out of query text,
- so we don't produce malformed sexps.
- Added William Blake quote easter egg.
-
- * contact-editor/e-contact-quick-add.c: Further attempts to fix...
- mostly unsuccessful.
- (e_contact_quick_add_free_form): Added. Takes a single string
- and tries to parse out (using some simple, loose rules) the
- name and e-mail -- then calls e_contact_quick_add. An attempt to
- get the computer to automatically Do The Right Thing.
-
- * backend/ebook/e-book.c: Fixed some broken indentation. Yes, I'm
- anal.
-
- * gui/component/GNOME_Evolution_Addressbook.oafinfo: Added oaf_server
- info for EAddressWidget.
-
- * gui/component/GNOME_Evolution_Addressbook.oaf.in: Added oaf_server
- info for EAddressWidget.
-
- * gui/component/addressbook-factory.c (main): Add call to
- e_address_widget_factory_init.
-
- * gui/component/e-address-widget.h:
- * gui/component/e-address-widget.c: Added. A little widget (and a
- Bonobo control, BTW) for displaying addresses, with a left-click
- menu. Used to display addresses in the mail viewer (as embedded
- GtkHTML objects, replacing the text previously used). Still quite
- incomplete.
-
-2001-03-08 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook-component.c (factory_fn): Specify a
- NULL `EvolutionShellComponentGetDndSelectionFn'.
-
-2001-03-06 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_insert_length): Fix glitch with
- inserting comma-delimited stuff when length > 1.
-
-2001-03-06 Jon Trowbridge <trow@ximian.com>
-
- * backend/ebook/e-book.c (e_book_load_local_address_book): Added.
- Just encapsulates opening
- file://~username/evolution/local/Contactes/addressbook.db, so that
- path doesn't need to be hardwired in throughout the code.
-
-2001-03-06 Benjamin Kahn <xkahn@cybersites.com>
-
- * contact-editor/e-contact-quick-add.c (clicked_cb):
- Added the third argument to e_contact_editor_new. (Cheated
- and send NULL for the field argument, which is probably
- troublesome. It will be fixed soon by either clahey or
- toshok.)
-
-2001-03-06 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-model.c
- (e_select_names_model_replace): Fix a reference counting bug.
-
- * gui/component/select-names/e-select-names-manager.c (popup_cb):
- A callback for creating the appropriate popup by calling
- e_select_names_popup.
- (e_select_names_manager_create_entry): Connect popup_cb to the
- entry's popup signal
-
- * gui/component/select-names/e-select-names-popup.c: Added. Code
- for popup right-click menus for recipient entries. Still a bit
- incomplete.
-
- * backend/ebook/e-destination.c (e_destination_get_email_num):
- Added.
-
- * contact-editor/e-contact-quick-add.c: Added. Some code and a
- dialog for very quickly adding entries to the address book.
- Still not fully working.
-
-2001-03-04 Christopher James Lahey <clahey@ximian.com>
-
- * backend/ebook/e-card-simple.c: Cleaned up the formatting in this
- file a bit.
-
- * contact-editor/e-contact-editor.c (e_contact_editor_set_arg):
- Made it so that passing in NULL to the writable_fields arg sets
- the set of writable fields to the empty set.
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_activate_obj): Pass NULL as the
- writable_fields argument here.
-
- * gui/widgets/e-addressbook-model.c: Don't offset by one here.
- This way we will get the file_as field as one of our
- ETableColumns.
-
- * gui/widgets/e-addressbook-view.c (SPEC): Updated this for the
- changes in ECardSimple.
-
- * gui/widgets/e-minicard.c (remodel): Don't remodel if the item
- isn't realized.
-
-2001-03-02 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c: doh, track renaming of
- objectclass from evolvePerson to evolutionPerson.
-
-2001-03-02 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/evolutionperson.schema: rename evolveperson.schema
- to this, and add remaining attributes.
-
- * backend/pas/pas-backend-ldap.c: add remaining fields, and fix up
- ones that were incorrent (either the ldap_attr or the query prop).
-
-2001-03-02 JP Rosevear <jpr@ximian.com>
-
- * conduit/Makefile.am: update sed script
-
- * conduit/e-address.conduit.in: update for new pilot foo
-
-2001-03-02 Chris Toshok <toshok@ximian.com>
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_activate_obj): track change to
- e_contact_editor_new.
-
-2001-03-02 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (add_objectclass_mod): add
- objectclasses for "person", "organizationalPerson", and "top" as
- well, just to be complete.
- (check_schema_support): rename check_for_evolve_person to this, to
- reflect that we're doing more than just checking for that
- objectClass.
- (add_oc_attributes_to_supported_fields): new function.
- (add_to_supported_fields): new function.
- (pas_backend_ldap_destroy): unref supported_fields.
-
-2001-03-02 Chris Toshok <toshok@ximian.com>
-
- * gui/widgets/e-minicard-view.c (supported_fields_cb): new
- function.
- (e_minicard_view_event): split out the creation of the contact
- editor to the supported_fields callback.
-
- * gui/widgets/e-minicard.c (supported_fields_cb): new function.
- (e_minicard_event): split out the creation of the contact editor
- to the supported_fields callback.
-
- * gui/widgets/e-addressbook-view.c (table_double_click): split
- function into two functions, since e_book_get_supported_fields
- requires a callback now.
- (supported_fields_cb): new function.
-
- * gui/component/addressbook.c (new_contact_cb): split this into
- two functions, since e_book_get_supported_fields requires a
- callback now.
- (supported_fields_cb): new function.
-
- * contact-editor/test-editor.c (main): track change to
- e_contact_editor_new (pass NULL for the writable_fields arg.)
-
- * contact-editor/contact-editor.glade: fix several labels so they
- make better sense (since we look them up in e-contact-editor.c.)
-
- * contact-editor/e-contact-editor.h (struct _EContactEditor): add
- writable_fields. also, add it to e_contact_editor_new.
-
- * contact-editor/e-contact-editor.c (e_contact_editor_class_init):
- add writable_fields arg.
- (e_contact_editor_destroy): unref the writable_fields list.
- (e_contact_editor_new): pass @fields as the writable_fields arg.
- (e_contact_editor_set_arg): add writable_fields support.
- (enable_writable_fields): new (very hairy) function, to disable
- everything and reenable just the fields listed in the
- writable_fields list.
- (_email_arrow_pressed): set label-email1, entry-email1, and
- checkbutton-htmlmail to be sensitive since the only way to get
- here is to activate a writable field in the menu.
- (_address_arrow_pressed): set label-address, button-fulladdr, and
- text-address to be sensitive for the same reason.
- (_phone_arrow_pressed): sensitize the label and entry for the same
- reason.
-
-2001-03-02 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-card-simple.c (field_data): add new entries for
- phone enums, and fill in the ecard_field with (bogus in all but a
- few cases) strings. these are the strings sent from wombat to
- evolution-addressbook for supported_fields.
- (e_card_simple_get_ecard_field): new function.
- (e_card_simple_map_phone_to_field): new function.
- (e_card_simple_map_email_to_field): new function.
- (e_card_simple_map_address_to_field): new function.
-
- * backend/ebook/e-card-simple.h: add a few phone entries to the
- ECardSimpleField enum, and add prototypes for mapping the list
- types (phone, email, address) to ECardSimpleField. Also, add
- prototype for e_card_simple_get_ecard_field.
-
- * backend/ebook/e-book.c
- (e_book_do_response_get_supported_fields): don't build the EList
- here, it's already built.
-
- * backend/ebook/e-book-listener.h: change fields from the CORBA
- sequence to the EList in our reponse struct.
-
- * backend/ebook/e-book-listener.c
- (e_book_listener_queue_get_supported_fields_response): we make the
- EList here, since after we return the CORBA list is freed up.
-
-2001-03-02 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_process_get_supported_fields): implement
- properly, we support everything.
-
-2001-03-01 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_set_property_fn): Oops, we do need to be able to write to
- "text" after all (for things like Reply-to: to work properly).
- Fixed.
- (impl_SelectNames_get_entry_for_section): Made "text" a writeable
- property again.
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_insert_length): Increment pos so that
- we don't reverse strings when length > 1 (a particularly amusing
- bug).
-
- * gui/component/select-names/e-select-names-completion.c
- (e_select_names_completion_destroy): Check for NULL before calling
- gtk_object_unref (GTK_OBJECT (---)), to get rid of annoying error
- messages.
-
-2001-03-01 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-completion.c: I am an
- idiot.
-
-2001-03-01 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-table-model.c
- (fill_in_info): Change for new EDestination/ESelectNamesModel API.
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_get_source): Added. A function for
- looking up the ESelectNamesModel by id. (I didn't end up using
- this function, but it might come in handy later.)
- (e_select_names_manager_get_cards): #if 0/#endif out this
- function.
- (e_select_names_manager_create_entry): Modified to attach an
- ESelectNamesCompletion to the entry we create.
- (completion_handler): A post-completion handler for our EEntry, to
- take the completion's extra data (an EDestination) and properly
- stick it into our ESelectNamesModel.
-
- * gui/component/select-names/e-select-names.c
- (real_add_address_cb): Changed to operate on EDestinations rather
- than ECards and to use the new ESelectNamesModel API. This leads
- to a rather nice code simplication.
- (remove_address): Changed for new ESelectNamesModel API.
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_get_property_fn): Rather than just passing the entry's text
- through the property bag, get the "address text" from the model.
- This returns a nice, verbose string of addresses with names
- expanded when the address is tied to an ECard (i.e. "Jon
- Trowbridge <trow@ximian.com>").
- (impl_SelectNames_get_entry_for_section): Make the text property
- read-only.
- (entry_set_property_fn): ...and since it is read-only now, chop
- out the setter code.
-
- * gui/component/select-names/e-select-names-text-model.h:
- * gui/component/select-names/e-select-names-text-model.c: Again,
- this code has been (pretty much) totally rewritten to convert all
- text operations into changes on the ESelectNamesModel. This lets
- us give the associated EEntry some (IMHO) nice semantics regarding
- whitespace, etc. Includes object activation, so destinations tied
- to ECards are underlined and can be double-clicked to bring up a
- contact editor.
-
- * gui/component/select-names/e-select-names-model.h:
- * gui/component/select-names/e-select-names-model.c: I've heavily
- modified this object to both hide all implementation details
- (which the old version exposed a bit too much for my peculiar
- tastes) and to act as an EDestination container. The old code put
- the text model operations here. I've moved them all to
- ESelectNamesTextModel --- so the text model actions (insert,
- delete, etc.) are all done through the API rather than operating on
- ESelectNamesModel internals.
-
- * gui/component/select-names/e-select-names-completion.c: Added. A
- fairly complicated object derived from ECompletion that searches
- our local addressbook in various and sundry ways.
-
- * gui/component/select-names/e-select-names-completion.h:
-
- * backend/ebook/e-destination.h:
- * backend/ebook/e-destination.c: Added. This object encapsulates
- a place to sent an email to, which can either be just a address as
- a string ("trow@ximian.com"), a fancier string ("Jon Trowbridge
- <trow@ximian.com>"), or an ECard and a specific address within
- that ECard.
-
-2001-03-01 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h,
- gui/widgets/e-minicard.c, gui/widgets/e-minicard.h: Used
- ESelectionModelSimple and the changes to EReflow and EReflowSorted
- to get multiple selection in the minicard view.
-
- * gui/widgets/test-reflow.c: Changed this to get it to compile
- with the changes to EReflow.
-
-2001-02-21 Christopher James Lahey <clahey@ximian.com>
-
- * backend/pas/pas-backend-file.c (pas_backend_file_search): Made
- this pay attention to the return value of e_sexp_parse.
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_activate_obj): Fixed a const
- inconsistency here.
-
-2001-02-21 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-book.c (pas_book_queue_get_supported_fields):
- new function.
- (impl_GNOME_Evolution_Addressbook_Book_getSupportedFields): track
- change to idl.
- (pas_book_respond_get_supported_fields): new function.
-
- * backend/pas/pas-book.h: add GetSupportedFields to the
- PASOperation enum. Also, add a stringlist field to the PASRequest
- struct. lastly, add a prototype for
- pas_book_respond_get_supported_fields.
-
- * backend/pas/pas-backend.h: remove prototype for
- pas_backend_get_supported_fields, and remove it from the vtable.
-
- * backend/pas/pas-backend.c (pas_backend_get_supported_fields):
- remove.
- (pas_backend_class_init): no vtable entry for get_supported_fields
- anymore.
-
- * backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_process_get_supported_fields): new function.
- (pas_backend_ldap_process_client_requests): add case for
- GetSupportedFields.
- (pas_backend_ldap_class_init): get_supported_fields isn't in
- vtable anymore.
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_process_get_supported_fields): new function.
- (pas_backend_file_process_client_requests): add case for
- GetSupportedFields.
- (pas_backend_file_class_init): get_supported_fields isn't in
- vtable anymore.
-
- * backend/idl/addressbook.idl: Book::getSupportedFields now
- returns void and add BookListener::notifySupportedFields.
-
- * backend/ebook/test-client.c (get_fields_cb): new function.
- (auth_user_cb): track change to e_book_get_supported_fields.
-
- * backend/ebook/e-book.c
- (e_book_do_response_get_supported_fields): new function.
- (e_book_check_listener_queue): add case
- GetSupportedFieldsResponse.
- (e_book_get_supported_fields): switch to async model.
-
- * backend/ebook/e-book.h: switch e_book_get_supported_fields to an
- async model.
-
- * backend/ebook/e-book-listener.c
- (e_book_listener_queue_get_supported_fields_response): new
- function.
- (impl_BookListener_response_get_supported_fields): new function.
- (e_book_listener_get_epv): fill in epv's "notifySupportedFields"
-
- * backend/ebook/e-book-listener.h: add an async response for
- GetSupportedFields and add a stringlist member to the
- EBookListenerResponse struct.
-
-2001-02-20 Federico Mena Quintero <federico@ximian.com>
-
- * backend/pas/pas-book-factory.c (pas_book_factory_activate):
- Moved the register_factory() code to here, since it was the only
- thing being called anyways.
- (PasBookFactoryPrivate): Added a "registered" flag.
- (pas_book_factory_activate): Set the registered flag.
- (pas_book_factory_destroy): Deactivate the factory when we go away.
-
-2001-02-20 Chris Toshok <toshok@ximian.com>
-
- * backend/ebook/e-book.c (e_book_get_supported_fields): new function.
-
- * backend/ebook/e-book.h: add e-book interface to getting
- supported fields.
-
- * backend/ebook/test-client.c (auth_user_cb): shoe-horn in some
- spew about supported fields.
-
-2001-02-19 JP Rosevear <jpr@ximian.com>
-
- * conduit/Makefile.am: Remove PISOCK_LIBDIR
-
-2001-02-19 Jon Trowbridge <trow@ximian.com>
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_create_entry): When creating the entry,
- open up an ebook (corresponding to the local addressbook) and make
- the entry use an EAddressCompletion.
- (completion_handler): Added; this is the actual completion
- handler, which manipulates the entry when the user selects
- something from the drop-down.
-
- * gui/component/select-names/e-select-names-model.c: Various hacks
- by clahey to unbreak e_select_names_model_add_item,
- e_select_names_model_replace_item (which I added) and
- e_select_names_model_remove_item.
-
- * gui/component/select-names/e-select-names-text-model.c
- (e_select_names_text_model_obj_count,
- e_select_names_text_model_get_nth_obj): Make chunks of text that
- correspond to ECards in the ESelectNamesModel be embedded objects.
- (e_select_names_text_model_activate_obj): On activation, pop up a
- contact editor for the embedded object's card.
- (e_select_names_text_model_model_changed): Fixed to work with
- ETextModel API changes.
- (e_select_names_text_model_set_text): Make const correct.
- (e_select_names_text_model_insert): Make const correct.
- (e_select_names_text_model_insert_length): Make const correct.
-
- * backend/ebook/e-address-completion.h,
- backend/ebook/e-address-completion.c: Added. EAddressCompletion
- is a derived class of ECompletion that does asynchronous address
- lookups for completions.
-
-2001-02-17 Chris Toshok <toshok@ximian.com>
-
- * backend/idl/addressbook.idl: add sequence<string> typedef, and
- add getSupportedFields method.
-
- * backend/pas/pas-book.c
- (impl_GNOME_Evolution_Addressbook_Book_getSupportedFields): new
- function.
-
- * backend/pas/pas-backend.c (pas_backend_class_init): init
- get_supported_fields = NULL.
- (pas_backend_get_supported_fields): new function.
-
- * backend/pas/pas-backend.h: add prototype for
- pas_backend_get_supported_fields.
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_get_supported_fields): new function.
- (pas_backend_file_class_init): fill in get_supported_fields.
-
- * backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_get_supported_fields): new function.
- (pas_backend_ldap_class_init): fill in get_supported_fields.
-
-2001-02-14 Christopher James Lahey <clahey@ximian.com>
-
- * backend/pas/pas-backend-ldap.c: Undefine E_STRING_PROP and
- E_LIST_PROP here.
-
- * contact-editor/e-contact-editor.c,
- contact-editor/e-contact-editor.h (e_contact_editor_raise): Added
- this function.
-
- * gui/widgets/e-minicard.c, gui/widgets/e-minicard.h
- (e_minicard_event): Added an editor field to the EMinicard object.
- Made it so that if you double click on the same card twice, it
- doesn't open a new window, but instead raises the old.
-
-2001-02-08 Iain Holmes <iain@ximian.com>
-
- * gui/component/addressbook-storage.c (addressbook_source_free):
- Free the ldap.binddn.
-
- * gui/widgets/e-addressbook-view.c
- (e_addressbook_view_setup_menus): Free the dir strings.
-
-2001-02-08 Christopher James Lahey <clahey@ximian.com>
-
- * contact-editor/e-contact-editor.c (categories_clicked): Set the
- header on the category dialog we pop up.
-
-2001-02-12 Kjartan Maraas <kmaraas@gnome.org>
-
- * backend/ebook/GNOME_Evolution_Addressbook_GnomeCard_Importer.oaf.in: Translations.
- * gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.oaf.in:
- Marked strings for translation in this newly created file.
- * gui/component/select-names/Makefile.am: Hook up the .oaf.in files in the
- xml-i18n-tools framework.
- * gui/component/Makefile.am: Same as above.
- * gui/component/GNOME_Evolution_Addressbook.oaf.in: Marked stuff for translation here
- too.
-
-2001-02-11 Jason Leach <jasonleach@usa.net>
-
- * gui/component/addressbook.c: Removed an ancient #include
- <libgnorba/gnorba.h>
-
-2001-02-11 Gediminas Paulauskas <menesis@delfi.lt>
-
- Really use xml-i18n-tools.
-
- * conduit/e-address-conduit-control-applet.desktop: removed.
- * conduit/e-address-conduit-control-applet.desktop.in: added empty.
- * conduit/Makefile.am: reflect above changes, merge translations.
-
- * contact-editor/e-contact-editor-strings.h,
- contact-editor/fulladdr.glade.h, contact-editor/fullname-strings.h,
- contact-editor/e-contact-editor-confirm-delete.glade.h,
- gui/component/select-names/select-names.glade.h:
- removed these files, xml-i18n-extract takes care of strings itself.
-
- * contact-editor/*.glade,
- gui/component/select-names/select-names.glade,
- gui/widgets/alphabet.glade, printing/e-contact-print.glade:
- changed project options to not output_translatable_strings.
-
- * contact-editor/Makefile.am, gui/widgets/Makefile.am,
- gui/component/select-names/Makefile.am, printing/Makefile.am:
- do not include removed files in EXTRA_DIST.
-
-2001-02-07 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (check_for_evolve_person): flesh
- out this check. #ifdef the entire thing OPENLDAP2, as it only
- works with the new schema stuff in openldap 2.x (both on server
- and client, so upgrade your server.)
-
-2001-02-07 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/e-addressbook-view.c: Added N_("* Click here to add
- a contact *").
-
-2001-02-07 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_connect): only
- set the DEBUG_LEVEL if we're OPENLDAP2.
-
-2001-02-06 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (email_compare): return TRUE if
- equal, FALSE otherwise.
- (business_compare): same.
- (homephone_compare): same.
- (email_ber): return NULL if there are no elements in our list.
- (homephone_ber): same.
- (business_ber): same.
- (build_mods_from_ecards): add smarts to handle list elements
- properly (like email, business_phone, home_phone.) now we'll
- properly send updates if any element in the list changes.
-
-2001-02-06 Christopher James Lahey <clahey@ximian.com>
-
- * gui/widgets/Makefile.am (INCLUDES): Added
- -DEVOLUTION_DATADIR=\""$(datadir)"\".
-
- * gui/widgets/e-addressbook-view.c
- (e_addressbook_view_setup_menus): Changed the local and system
- directories.
-
-2001-02-06 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (create_card_handler): doh,
- didn't mean to commit this.
-
-2001-02-06 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/evolveperson.schema: new file. this will eventually
- form the suggested additions to an existing openldap server that,
- along with support for inetorgperson, will allow people to store
- all evolution attributes in ldap.
-
-2001-02-06 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_init): don't
- need the = NULL's since we g_new0.
- (check_for_evolve_person): new function.
- (pas_backend_ldap_connect): check to see if the evolvePerson
- objectclass is there.
- (build_mods_from_ecards): right now, just silently skip the extra
- attributes if we don't support evolvePerson.
- (add_objectclass_mod): new function, add both inetOrgPerson and
- (if it's available) evolvePerson as objectclasses.
- (pas_backend_ldap_process_authenticate_user): also check to see if
- evolvePerson is there, if we couldn't do it (due to auth reasons)
- in the connect method.
- (prop_info): change the telephoneNumber LDAP attribute to be used
- for evolution's business phone numbers. the primary phone number
- will be a single valued attribute on evolvePerson.
- (business_populate): new function.
- (business_ber): new function.
- (business_compare): new function.
-
-2001-02-05 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (create_card_handler): err,
- allocate 2 char*s when i assign 2 char*s.
-
-2001-02-05 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (modify_card_handler): switch to
- ldap_modify_ext_s if OPENLDAP2, as ldap_modify_s is deprecated.
- (build_mods_from_ecards): don't include the mod if the value is ""
- - this isn't valid on schema checking ldap servers.
- (homephone_populate): new function.
- (homephone_ber): new function.
- (homephone_compare): new function.
- (create_card_handler): add spew when adding cards so I can see
- what's going on.
-2001-02-05 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook-config.c (table_add_elem): Save the
- help_text in the closure.
-
-2001-02-05 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/widgets/Makefile.am (libeminicard_a_SOURCES): Added
- gal-view-factory-minicard.c, gal-view-factory-minicard.h,
- gal-view-minicard.c, and gal-view-minicard.h.
-
- * gui/widgets/gal-view-factory-minicard.c,
- gui/widgets/gal-view-factory-minicard.h,
- gui/widgets/gal-view-minicard.c, and
- gui/widgets/gal-view-minicard.h: New classes for minicard view
- type.
-
- * gui/widgets/e-addressbook-view.c: Deploy gal-view stuff
- properly.
-
-2001-02-05 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card.c (e_card_get_vcard): Make the Note field
- be quoted printable.
-
-2001-01-27 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/search/e-addressbook-search-dialog.c
- (e_addressbook_search_dialog_init): This should be a close button,
- not a cancel button.
-
-2001-02-04 Christopher James Lahey <clahey@ximian.com>
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_activate_dialog): Call
- e_select_names_set_default when appropriate.
-
- * gui/component/select-names/e-select-names.c,
- gui/component/select-names/e-select-names.h: Added support for
- double clicking sending the selected contacts to the default
- section. Added a set_default function. Made multiple selection
- work.
-
-2001-01-29 Chris Toshok <toshok@ximian.com>
-
- * gui/component/addressbook-config.c
- (addressbook_config_source_label): #ifdef INCLUDE_FILE_SOURCE.
- (table_add_elem): add help_text parameter and set up focus_in
- events to display the help in the dialog's html area.
- (focus_help): new function, calls put_html on the help text.
- (addressbook_ldap_auth_item_new): add help texts.
- (addressbook_source_item_new): add help texts.
- (addressbook_source_dialog): add help texts.
-
-2001-01-27 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_add_section): Remove the butt-ugly arrow icon and
- replace it with a less invasive "->" icon.
-
-2001-01-25 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (build_mods_from_ecards): add
- comment about the else block here.
- (prop_info): add home_address, business_address, business_fax,
- assistant, and isdn.
-
-2001-01-25 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/pas/pas-backend-file.c (pas_backend_file_load_uri): Made
- this only add the initial VCard if it finds a file
- "create-initial" in the directory it's creating the database in.
-
- * gui/component/addressbook-component.c (factory_fn): Added a
- create_folder function.
-
- * gui/search/e-addressbook-search-dialog.c
- (e_addressbook_search_dialog_init): Fixed an unused variable
- warning.
-
-2001-01-25 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/widgets/e-addressbook-view.c
- (e_addressbook_view_setup_menus): Setup the view collection
- properly and handle the "display_view" signal.
-
-2001-01-25 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook.c (update_pixmaps): Consider the
- placeholder in the path for the "Print" item.
-
-2001-01-25 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook.c (update_pixmaps): Set the icon for
- "/Toolbar/Find" to "24_find_contact.xpm".
-
-2001-01-25 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component/addressbook.c (set_pixmap): New.
- (update_pixmaps): New function, setting the pixmaps for the items
- of type "pixbuf", using `set_pixmap'.
- (control_activate): Call it.
-
-2001-01-25 Not Zed <NotZed@Ximian.com>
-
- * backend/pas/pas-backend-ldap.c: esexp api change fixes.
-
- * backend/pas/pas-backend-file.c (entry_compare): Fix for e_sexp api changes.
- (vcard_matches_search): esexp api fixes.
- (pas_backend_file_search): Ouch, unref the e-sexp properly (not gtk object).
-
-2001-01-24 Chris Toshok <toshok@ximian.com>
-
- * backend/pas/pas-backend-ldap.c (email_ber_func): make sure to
- add the lengths here (include the \0? anyone?).
- (build_mods_from_ecards): if we're filling in mod->mod_bvalues,
- set mod_op |= LDAP_MOD_BVALUES.
-
-2001-01-23 Jason Leach <jasonleach@usa.net>
-
- (Fix #1225: advanced search cancel/close)
-
- * gui/search/e-addressbook-search-dialog.c
- (e_addressbook_search_dialog_init): Set it up with Search and a
- Cancel button, Search is still the default.
-
-2001-01-23 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (local_record_from_ecard): properly ref
- the ecard. still need to kill some memory leaks.
-
-2001-01-22 JP Rosevear <jpr@ximian.com>
-
- * conduit/Makefile.am: remove vfs dependency
-
-2001-01-21 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (delete_record): Remove
- deleted records from the pilot map so we don't have dupes in the future
-
-2001-01-19 Dan Winship <danw@ximian.com>
-
- * gui/widgets/e-addressbook-view.c (table_right_click):
- * gui/widgets/e-minicard.c (e_minicard_event): Update for
- e_popup_menu_run prototype change.
-
-2001-01-19 Jason Leach <jasonleach@usa.net>
-
- (Adding a boolean "entry_changed" BonoboPropertyBag arg)
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_set_property_fn): Use a gtk_object_set_data to set the
- property to TRUE here.
-
- (entry_changed): New function, calls bonobo_control_set_property
- if entry_changed hasn't been set to TRUE yet.
-
- (impl_SelectNames_get_entry_for_section): Connect "changed" on
- each entry_widget to the new entry_changed() func.
-
-2001-01-19 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (ecard_from_remote_record): always free
- the delivery elements and correct embarrassingly stupid memory error
- that was causing the addressbook conduit problems.
-
- * backend/ebook/e-book-view-listener.c
- (e_book_view_listener_check_queue): ref/unref ourself when processing
- in case someone we signal unrefs us.
-
- * conduit/address-conduit.c (sequence_complete): disconnect signals
- when complete
-
-2001-01-17 Federico Mena Quintero <federico@ximian.com>
-
- * backend/pas/pas-book-factory.c (pas_book_factory_activate): Made
- it return a gboolean; it was completely ignoring the return value
- from register_factory().
-
-2001-01-17 Larry Ewing <lewing@helixcode.com>
-
- * backend/ebook/.cvsignore: add evolution-gnomecard-importer.
-
- * backend/ebook/Makefile.am (oaf_DATA): don't require the pine
- oainfo file until it is actually added to the repository. We need
- to keep the build working for nightlies to work.
-
-2001-01-16 Jason Leach <jasonleach@usa.net>
-
- * backend/pas/pas-backend-file.c (INITIAL_VCARD): s/Helix
- Code/Ximian/ for the initial contact card.
-
-2001-01-15 JP Rosevear <jpr@ximian.com>
-
- * conduit/address-conduit.c (print_local): prevent segfaults and
- buffer overflows
- (print_remote): ditto
-
-2001-01-14 JP Rosevear <jpr@ximian.com>
-
- * conduit/Makefile.am: pass -module and -avoid-version to conduit
- linker
-
-2001-01-12 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/addressbook-component.c (factory_fn): Pass NULL as
- the @copy_folder_fn arg to `evolution_shell_component_new'.
-
-2001-01-12 Miguel de Icaza <miguel@ximian.com>
-
- * gui/widgets/e-addressbook-view.c: added i18n for etable.
-
-2001-01-11 Chris Toshok <toshok@helixcode.com>
-
- * backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_process_create_card): get a book view from
- somewhere so we can give status messages - choose the first one in
- the list.
- (pas_backend_ldap_process_modify_card): same.
- (pas_backend_ldap_process_remove_card): same.
- (prop_info): add more properties, like home_phone, mobile, pager,
- uri, org_unit, office, title, and manager.
-
-2001-01-09 Miguel de Icaza <miguel@gnu.org>
-
- * gui/widgets/Makefile.am (minicard_widget_test_LDADD): Put GNOME
- libraries at the end to make the thing compile.
-
- * printing/Makefile.am: Order LDADD flags correctly so it compiles.
-
-2001-01-09 Chris Toshok <toshok@helixcode.com>
-
- * gui/component/addressbook.c (addressbook_factory_new_control):
- connect with the EAddressbookView's status_message signal.
- (set_status_message): set the status message on the ShellView
- Interface associated with our control.
- (retrieve_shell_view_interface_from_control): new function. get
- the shell view inteface associated with a control.
-
- * gui/widgets/e-addressbook-view.c
- (e_addressbook_view_class_init): register status_message signal.
- (status_message): new function, emit our status_message signal.
- (change_view_type): connect with the view->object's
- "status_message" signal.
-
- * gui/widgets/e-addressbook-view.h (struct
- _EAddressbookViewClass): add status_message signal.
-
-2001-01-09 Chris Toshok <toshok@helixcode.com>
-
- * gui/widgets/e-minicard-view-widget.c
- (e_minicard_view_widget_class_init): register our status_message
- signal.
- (status_message): new function, emit our status_message signal.
- (e_minicard_view_widget_realize): connect to the EMinicardView's
- status_message signal.
-
- * gui/widgets/e-minicard-view-widget.h: add status_message signal.
-
- * gui/widgets/e-minicard-view.c (e_minicard_view_class_init):
- register our status_message signal.
- (e_minicard_view_init): init status_message_id.
- (status_message): new function, emit our status_message signal.
- (book_view_loaded): connect to the EBookView's status_message
- signal.
- (disconnect_signals): disconnect status_message_id.
-
- * gui/widgets/e-minicard-view.h: add status_mesage_id, and
- status_message signal.
-
- * gui/widgets/e-addressbook-model.c (status_message): new
- function, emit our status_message.
- (e_addressbook_model_class_init): register our "status_message"
- signal.
- (book_view_loaded): connect to the EBookView's status_message
- signal, so we can chain it to our parent.
- (e_addressbook_model_init): init status_message_id.
- (remove_book_view): disconnect status_message_id.
-
- * gui/widgets/e-addressbook-model.h: add status_message_id, and
- status_message signal.
-
- * backend/pas/pas-backend-ldap.c change the objectclass we create
- objects with to "inetOrgPerson" as it encompasses the fields we
- use.
- (create_dn_from_ecard): remove the mail/org handling from
- here. we just prepend cn=$cn onto the base dn.
- (create_card_handler): remove the NULL that build_mods_from_ecards
- adds at the end, and insert our objectClass.
- (modify_card_handler): call search_for_dn to get the ECardSimple
- of the old card, since it might (and does in the current code)
- doing a brute force search.
- (search_for_dn): new function, to search for an entry by its dn.
- right now we brute force (objectclass=*) under the base dn and
- compare dn's. going to add a first pass that explodes the dn and
- searches that way, using (objectclass=*) as a last resort. also,
- here's where we'd put the extensibleMatch code if we want to go
- that route.
-
- * backend/ebook/e-card.c (e_card_set_arg): if we're setting the
- full name regenerate ecard->name.
-
-2001-01-04 Chris Toshok <toshok@helixcode.com>
-
- * backend/ebook/e-book-listener.c
- (e_book_listener_queue_authentication_response): new function.
- (impl_BookListener_respond_authentication_result): new function.
- (e_book_listener_get_epv): fill in
- epv->notifyAuthenticationResult.
-
- * backend/ebook/e-book-listener.h: add AuthenticationResponse to
- EBookListenerOperation.
-
- * backend/ebook/e-book.c (e_book_authenticate_user): new function.
-
- * backend/ebook/e-book.h: add prototype for
- e_book_authenticate_user.
-
- * backend/idl/addressbook.idl (GNOME:Evolution:Addressbook:Book):
- add authenticateUser method.
- (GNOME:Evolution:Addressbook:BookListener): add
- AuthenticationFailed and AuthenticationRequired to CallStatus.
- also add notifyAuthenticationResult method.
-
- * backend/pas/pas-backend-file.c
- (pas_backend_file_process_authenticate_user): dummy
- authenticate_user function that always succeeds.
- (pas_backend_file_process_client_requests): respond to the
- AuthenticateUser request.
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_build_query):
- gtk_object_unref(sexp) => s_exp_unref(sexp).
- (pas_backend_ldap_process_authenticate_user): fill in to use
- ldap_simple_bind_s.
- (pas_backend_ldap_process_client_requests): respond to the
- AuthenticateUser request.
-
- * backend/pas/pas-book.c (pas_book_queue_authenticate_user): new
- function.
- (impl_GNOME_Evolution_Addressbook_Book_authenticateUser): new
- function.
- (pas_book_respond_authenticate_user): new function.
- (pas_book_get_epv): fill in epv->authenticateUser.
-
- * backend/pas/pas-book.h: add AuthenticateUser operation type, and
- add user/passwd to the PASRequest struct.
-
- * gui/component/addressbook-storage.c
- (addressbook_storage_get_source_by_uri): new function. should use
- a hashtable, perhaps, but the lists will generally be small
- anyway.
-
- * gui/component/addressbook-storage.h: add prototype for
- addressbook_storage_get_source_by_uri.
-
- * gui/component/addressbook-config.c
- (addressbook_source_dialog_set_source): fill in the binddn if the
- auth page is shown.
-
- * gui/component/addressbook.c (book_open_cb): shoe-horn
- authentication in here. if the source was configured to use
- authentication, authenticate the user after opening the ebook.
- also, be paranoid and clear out the password after authenticating.
- (book_auth_cb): callback for auth. set the "book" arg on the
- view->view here.
- (passwd_cb): set the view's passwd that'll be used in
- book_open_cb.
- (addressbook_view_free): g_free view->passwd.
-
-2001-01-04 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook-component.c,
- gui/component/addressbook-component.h
- (addressbook_component_get_shell_client): Added this function.
-
- * gui/component/select-names/e-select-names.c,
- gui/component/select-names/e-select-names.h: Added code for the
- ability to switch between different folders. This doesn't work
- yet.
-
- * gui/component/select-names/select-names.glade,
- gui/component/select-names/select-names.glade.h: Added an option
- menu to this dialog.
-
-2001-01-04 JP Rosevear <jpr@helixcode.com>
-
- * conduit/Makefile.am: Fix hard coded library names that were
- accidentally committed (i'm looking at you miggie)
-
- * contact-editor/e-contact-editor.c (categories_clicked): Reflect
- renaming.
-
- * contact-editor/e-contact-editor-categories.[hc]: These are
- living in gal now
-
-2001-01-04 JP Rosevear <jpr@helixcode.com>
-
- * backend/pas/pas-backend-file.c (pas_backend_file_book_view_free):
- Need to e_sexp_unref the the sexp, not gtk_object_unref it.
-
-2001-01-03 Michael Meeks <michael@helixcode.com>
-
- * gui/widgets/e-addressbook-model.c (get_view): check
- capabilities is valid before doing a strstr.
-
-2001-01-03 Michael Meeks <michael@helixcode.com>
-
- * backend/pas/pas-backend-file.c (pas_backend_file_search):
- g_strdup things we g_free.
-
-2001-01-02 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.c (delete_cb): Make sure this
- won't crash if the given contact is removed from the database
- while this function is being called.
-
- * gui/widgets/e-minicard.c: Made sure this won't crash if the
- given contact is removed from the database while the right click
- menu is being displayed.
-
-2000-12-30 Chris Toshok <toshok@helixcode.com>
-
- * gui/component/addressbook-config.c (edit_source_clicked): copy
- the dialog's source, destroy the dialog after we're done, and make
- sure to update both columns in the clist.
- (add_source_clicked): copy the dialog's source, and destroy the
- dialog when we're done.
- (addressbook_source_dialog_destroy): free up all the dialog's
- memory.
-
- * gui/component/addressbook.c (set_prop): allow file: uri's that
- point to files, not just dirs that contain addressbook.db. The
- rule is the addressbook file has to end in .db.
-
- * gui/component/addressbook-storage.c (file_source_foreach):
- contactserver => contactfile. cut and paste error.
- (addressbook_storage_init_source_uri): use file://%s to build the
- uri.
-
- * gui/component/e-ldap-server-dialog.[ch]: forgot to remove these
- in my last commit.
-
-2000-12-29 Chris Toshok <toshok@helixcode.com>
-
- * gui/component/addressbook.c (config_cb): new function, calling
- our new config ui code.
- (control_activate): no longer load evolution-addressbook-ldap.xml,
- as it's not there.
-
- * gui/component/addressbook-component.c (owner_set_cb):
- setup_ldap_storage => addressbook_storage_setup.
-
- * gui/component/Makefile.am (evolution_addressbook_SOURCES):
- remove e-ldap-storage.[ch] and add addressbook-storage.[ch].
- (glade_DATA): remove ldap-server-dialog.glade and add
- addressbook-config.glade.
- (EXTRA_DIST): same.
-
- * gui/component/addressbook-config.[ch]: add another dialog to
- give a list of our sources and offer the Add/Delete/Edit
- interface. This plugs into the previous dialog work (the source
- editor.)
-
- * gui/component/addressbook-storage.[ch]: new files, containing
- the remains of e-ldap-storage.[ch] and adding the new
- AddressbookSource type and it's subordinates. Also, the xml
- format has changed slightly and the file name is no longer
- ~/evolution/ldap-servers.xml - it's
- ~/evolution/addressbook-sources.xml.
-
- * gui/component/addressbook-config.glade: new file, new config
- interface.
-
- * gui/component/ldap-server-dialog.glade: removed.
-
- * gui/component/e-ldap-storage.[ch]: removed.
-
-2000-12-28 Chris Toshok <toshok@helixcode.com>
-
- * gui/component/Makefile.am (evolution_addressbook_SOURCES): add
- addressbook-config.[ch].
-
- * gui/component/addressbook-config.c,
- gui/component/addressbook-config.h: new files, containing at the
- moment a beautiful "new/edit source dialog" inspired by the
- mail-config-gui code. It'll be ready for prime time after rev'ing
- the .xml file the addressbook uses to store it's "other sources"
- to include files, and the addition of the ldap auth stuff.
-
-2000-12-25 Miguel de Icaza <miguel@helixcode.com>
-
- * gui/widgets/e-minicard.c (e_minicard_realize): Set draw
- background to FALSE.
-
- * gui/widgets/e-minicard-label.c (e_minicard_label_construct): ditto.
- (e_minicard_label_construct): ditto
-
-2000-12-23 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/fullname-strings.h,
- contact-editor/fullname.glade: Added Ms. and Miss to the prefix
- drop down box. Patch submitted by Martin Hicks <mort@bork.org>.
-
-2000-12-21 JP Rosevear <jpr@helixcode.com>
-
- * conduit/address-conduit.c (cursor_cb): Ref the cards that get put
- in the change list
- (next_changed_item): util function to get the real next changed item
- (compute_status): really compute the status of the record
- (local_record_from_uid): Set the id of the temporary card
- (check_for_slow_setting): Make this check a little saner
- (card_added): Only record the CardObjectChange if the card is not
- archived
- (card_changed): ditto
- (card_removed): ditto
- (set_status_cleared): actually clear the status
- (for_each_modified): Clean out cruft and use next_changed_item
- (add_record): Set the new id properly in our local card copy
- (replace_record): handle the case where the record has been deleted
- and we need to call add. need to update the changed_hash entry
- (delete_record): Don't panic if the card is not found, its already
- been deleted.
-
- * backend/pas/pas-backend-file.c (pas_backend_file_book_view_copy):
- The change_context no longer has a del_cards member
- (pas_backend_file_book_view_free): ditto
- (pas_backend_file_process_get_changes): ditto
- (pas_backend_file_changes_foreach_key): just record the id
- (pas_backend_file_changes): notify_remove needs an id not a vcard
-
-2000-12-20 JP Rosevear <jpr@helixcode.com>
-
- * conduit/address-conduit.c (match): Use my own wrapper
- functions instead of trying to *directly* access the the data
- structures my self
- (post_sync): Put in hack to prevent syncing the same records twice
- (local_record_from_uid): set the card id when creating a blank one
- (add_record): Set the id of the card we have and don't go to the
- server to get the latest version
-
-2000-12-19 JP Rosevear <jpr@helixcode.com>
-
- * conduit/address-conduit.c (ecard_from_remote_record): Convert
- pilot strings to utf for the e-cards.
-
-2000-12-19 JP Rosevear <jpr@helixcode.com>
-
- * conduit/address-conduit.c (local_record_from_ecard): Convert ecard
- strings to pilot encodings
-
-2000-12-19 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/widgets/e-addressbook-view.c (delete): Made it so that if
- you select multiple contacts, the right click menu to delete
- deletes them all.
-
-2000-12-18 Chris Toshok <toshok@helixcode.com>
-
- * backend/pas/pas-backend-ldap.c (ldap_error_to_response): always
- use LDAP_NAME_ERROR (in the openldap1 case it's #defined to
- NAME_ERROR).
- (build_card_from_entry): ldap_get_values can return NULL. also,
- openldap2 keeps us from getting at ldap->ld_errno, so we can't
- tell if there was a decoding error like we used to. the double
- free problem where ldap would free the ber if there was a decoding
- problem might be fixed now.. further investigation is needed.
- for now we leak in openldap2.
- (ldap_search_handler): the ldap structure is opaque, so use
- ldap_search_ext to give the extra information (the max responses,
- timeout, etc.) in the openldap2 case.
-
-2000-12-13 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/pas/pas-backend-ldap.c (ldap_error_to_response): Test
- for the existance of LDAP_NAME_ERROR and if it exists as a macro,
- use it instead of NAME_ERROR.
-
-2000-12-14 Michael Meeks <michael@helixcode.com>
-
- * gui/component/GNOME_Evolution_Addressbook.oafinfo: update cut
- and paste description error.
-
-2000-12-13 Dan Winship <danw@helixcode.com>
-
- * gui/widgets/e-minicard-control.c (stream_read): NULL-terminate
- the returned vcard so we don't sometimes end up with trailing
- junk that makes libversit unhappy.
-
-2000-12-13 Iain Holmes <iain@helixcode.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_add_section): Make the -> into a GNOME stock image.
-
-2000-12-09 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_init): Connect to the "cursor_change" signal on
- the ETable here instead of the ETableScrolled.
- (remove_address): Added the col and event parameters to this
- callback to match the added parameters to the double click signal.
- (e_select_names_add_section): Connect to the "double_click" signal
- on the ETable here instead of the ETableScrolled.
-
-2000-12-09 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card.c (e_card_set_arg): When setting the "name"
- argument, copy the incoming name. This fixes a crash.
-
-2000-12-09 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.c: Made editing the name using
- the full name button set the file as entry properly. Made it
- so that the address parse that the user chooses after
- clicking on the Full Address... button gets saved.
-
-2000-12-08 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.c (full_name_clicked): Made it
- so that the editor->name is set after the entry is changed. This
- means that the reparse that the person chose is saved.
-
-2000-12-07 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/e-ldap-storage.c (setup_ldap_storage): Pass NULL
- as the @toplevel_node_handler_id argument to
- `evolution_storage_new'.
-
-2000-12-08 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card.c: Fixed some formatting.
-
- * contact-editor/e-contact-editor-categories.h: Removed an
- unneeded #include.
-
- * gui/widgets/e-addressbook-view.c: Connect to the signals on the
- ETable instead of the ETableScrolled.
-
-2000-12-07 JP Rosevear <jpr@helixcode.com>
-
- * conduit/address-conduit.c (local_record_from_uid): Pass "" rather
- than NULL to e_card_new.
- (local_record_from_ecard): Make sure ecard->name is valid
- (check_for_slow_setting): Remove hard coded test value
- (card_added): g_strdup the resul of e_card_get_id
- (card_changed): ditto
-
-2000-12-07 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/widgets/e-addressbook-view.c: Got rid of code referencing
- the ETableScrolled proxy functions.
-
-2000-12-06 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c: Moved the gal view menu stuff from
- here to EAddressbookView.
-
- * gui/widgets/e-addressbook-view.c,
- gui/widgets/e-addressbook-view.h: New function to set up the menus
- for the EAddressbookView.
-
-2000-12-06 JP Rosevear <jpr@helixcode.com>
-
- * conduit/Makefile.am: Another conduit build fix
-
-2000-12-05 JP Rosevear <jpr@helixcode.com>
-
- * backend/pas/pas-backend-file.c (pas_backend_file_changes_foreach_key):
- Create an empty vcard with the appropriate id for deleted cards
-
- * conduit/address-conduit.c (ecard_from_remote_record): Ensure the
- address fields are added sensibly
-
-2000-12-05 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/e-ldap-storage.c (setup_ldap_storage): Updated the
- call to `evolution_storage_new()': pass NULL for
- @toplevel_node_uri.
-
-2000-11-28 JP Rosevear <jpr@helixcode.com>
-
- * conduit/address-conduit.c (local_record_to_pilot_record): Return
- a struct rather than a pointer to a struct
- (view_cb): kill warning
- (compare): local_record_to_pilot_record now returns a struct
- (prepare): ditto
- (free_prepare): remove as per gnome-pilot changes
- (conduit_get_gpilot_conduit): don't listen for free_prepare signal
-
-2000-11-27 JP Rosevear <jpr@helixcode.com>
-
- * conduit/address-conduit.h: Remove "complete" field
-
- * conduit/address-conduit.c (print_local): Make it print useful debug
- info
- (print_remote): ditto
- (local_record_from_ecard): Make sure phone numbers get out to the pilot
- (ecard_from_remote_record): Set phone strings to "" if they are null
- (sequence_complete): unref the book view
- (view_cb): ref the book view
- (free_prepare): do nothing
-
- * backend/pas/pas-backend-file.c (pas_backend_file_book_view_free):
- Destroy the card lists with the rest of the view.
- (pas_backend_file_changes): Don't destroy the card lists here
- (pas_backend_file_book_view_free): Free the card/id lists in the
- change context here, the correct place.
- (pas_backend_file_changes): instead of here...
-
-2000-11-22 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/pas/pas-backend-file.c: Set view.change_context to NULL
- in pas_backend_file_process_get_book_view. Changed
- pas_backend_file_book_view_copy a bit.
-
- * backend/pas/pas-backend-ldap.c: Got rid of a warning.
-
-2000-11-18 Matt Bissiri <matt@bissiri.org>
-
- * gui/component/Makefile.am:
- Add widgets/menus/libmenus.la to evolution_addressbook_LDADD
- so that it will link properly now that gal-view-menus.[ch]
- was moved from gal into evolution.
-
-2000-11-15 JP Rosevear <jpr@helixcode.com>
-
- * backend/pas/pas-backend-file.c (pas_backend_file_book_view_copy):
- Initialize destination struct with '0's.
-
-2000-11-12 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card.c: Changed the mime type from "text/vcard"
- to "text/x-vcard".
-
-2000-11-11 Matt Bissiri <bissiri@eecs.umich.edu>
-
- * backend/ebook/.cvsignore: Add idl-generated files.
- * backend/ebook/e-book.c: (e_book_do_response_get_changes):
- * backend/ebook/e-card.c: (e_card_send):
- s/Evolution_/GNOME_Evolution_/g;
-
-2000-11-11 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/Makefile.am: Link in composer bonobo code.
-
- * backend/ebook/e-card.c, backend/ebook/e-card.h: Added code to
- send mail to an ECard or send an ECard as a VCard attachment.
-
- * contact-editor/e-contact-editor.c: Add verbs to send the contact
- as a VCard or send mail to the contact.
-
- * gui/search/e-addressbook-search-dialog.c: Removed some unused
- variables.
-
- * gui/widgets/e-addressbook-view.c, gui/widgets/e-minicard.c:
- Added menu items to send the contact as a VCard or send mail to
- the contact.
-
-2000-11-11 Matt Bissiri <bissiri@eecs.umich.edu>
-
- * gui/component/addressbook.oafinfo:
- * gui/component/select-names/evolution-addressbook-select-names.oafinfo:
- Update the remaining "IDL:Evolution*" to "IDL:GNOME/Evolution*"
- to sync up with yesterday's IDL re-scoping.
-
-2000-11-09 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/pas/pas-backend-ldap.c: Fixed a warning.
-
- * gui/component/addressbook.c: Put in gal view menus for testing
- purposes.
-
- * printing/e-contact-print-envelope.c: Fixed up envelope printing
- a bit. Added code for printing return addresses.
-
-2000-11-09 JP Rosevear <jpr@helixcode.com>
-
- * conduit/address-conduit.h: Add changed_hash, change list and complete bool
-
- * conduit/address-conduit.c (local_record_from_ecard): Add empty field checks
- (card_added): callback for book view
- (card_changed): ditto
- (card_removed): ditto
- (sequence_complete): ditto
- (view_cb): callback for the get changes call
- (pre_sync): force synchronous loading of book view
- (for_each): we already have the card so create the local record directly
- (for_each_modified): Uncomment and fix
- (delete_record): ditto
-
- * conduit/Makefile.am: link against gal for ebook - needs fixing
-
- * backend/ebook/e-book.c (e_book_do_response_get_changes): Properly respond
- to a get_changes call
- (e_book_check_listener_queue): define the get changes response operation
-
- * backend/ebook/e-book-listener.c (e_book_listener_queue_get_changes_response):
- Queue up a get changes response
- (impl_BookListener_respond_get_changes): Implement the get_changes method
- (e_book_listener_get_epv): add get_changes implementation to epv
-
- * backend/pas/pas-backend-file.c (pas_backend_file_book_view_copy): Only
- copy the search_context and change_context elements if they actually exist
- (pas_backend_file_changes): Hard code a path for now, only notify if
- there is something to notify about
-
-2000-11-07 JP Rosevear <jpr@helixcode.com>
-
- * backend/pas/pas-book.h: Update PASRequest structure
-
- * backend/pas/pas-book.c (impl_Evolution_Book_get_changes): update param name
- (pas_book_queue_get_changes): Use PASRequest change_id slot
-
- * backend/pas/pas-backend-file.c (pas_backend_file_book_view_copy):
- Properly copy change_id and change_context
- (pas_backend_file_book_view_free): Free change_id/change_context
- (pas_backend_file_changes_foreach_key): Callback to figure out the
- deleted cards
- (pas_backend_file_changes): Use new e-dbhash stuff to implement.
- Write out updated hash
-
- * backend/idl/addressbook.idl: Rename get_changes param
-
-2000-11-06 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c: Switched from EAddressbookSearch to
- ESearchBar.
-
- * gui/widgets/Makefile.am, gui/widgets/e-addressbook-search.c,
- gui/widgets/e-addressbook-search.h: Removed EAddressbookSearch.
- This has been moved to filter/ and renamed ESearchBar.
-
- * printing/e-contact-print-envelope.c: Forgot to set the font.
- This works for me now.
-
-2000-11-06 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/select-names/e-select-names-bonobo.c
- (impl_SelectNames_get_entry_for_section): Duplicate the object
- reference before returning.
-
-2000-11-05 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.c,
- gui/widgets/e-addressbook-view.c, gui/widgets/e-minicard.c: Add
- menus items to the envelope printing stuff.
-
- * gui/component/addressbook.c: Hook up the search menu.
-
- * gui/widgets/e-addressbook-search.c,
- gui/widgets/e-addressbook-search.h: Add the search menu.
-
- * printing/Makefile.am: Add e-contact-print-envelope.c and
- e-contact-print-envelope.h.
-
- * printing/e-contact-print-envelope.c,
- printing/e-contact-print-envelope.h: Added envelope printing.
-
-2000-11-03 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/component/select-names/Makefile.am: Clean the idl-generated
- files properly.
-
-2000-11-02 Christopher James Lahey <clahey@helixcode.com>
-
- * ename/.cvsignore, gui/minicard/.cvsignore: Removed these
- unnecessary .cvsignores.
-
- * gui/component/addressbook.c: Switch to using EAddressbookSearch
- instead of custom quick search widget.
-
- * gui/component/select-names/e-select-names.c: Made this do a
- slightly better job of rendering names.
-
- * gui/widgets/Makefile.am: Added e-addressbook-search.c and
- e-addressbook-search.h.
-
- * gui/widgets/e-addressbook-search.c,
- gui/widgets/e-addressbook-search.h: New class that puts up an
- entry and a combo box.
-
-2000-11-01 Dan Winship <danw@helixcode.com>
-
- * gui/component/e-ldap-storage.c (load_ldap_data):
- (e_ldap_storage_add_server): Add "highlighted" flag to
- evolution_storage_new_folder
-
-2000-10-31 JP Rosevear <jpr@helixcode.com>
-
- * conduit/address-conduit.c (cursor_cb): Let the warning make sense
- (compute_pid): remove
- (local_record_from_ecard): Create local record from ecard - not finished
- (local_record_from_uid): Obtain local_record from uid with the proper
- e-book way
- (set_status_cleared): Add empty callback
- (add_archive_record): kill
- (delete_archive_record): kill
- (archive_record): Add empty callback
- (conduit_get_gpilot_conduit): Update signal connects
-
- * backend/pas/pas-backend-file.c (vcard_change_type): Function to determine
- the type of change - not finished
- (pas_backend_file_search_changes): Create a view and callback based on
- how the cards have changed
- (pas_backend_file_process_get_changes): Implement the get changes operation
- for files
- (pas_backend_file_process_client_requests): Add GetChanges method for
- processing
-
- * backend/pas/pas-book.c (pas_book_queue_get_changes): Add changes to
- the list
- (impl_Evolution_Book_get_changes): implement object method
- (pas_book_get_epv): Add get changes to epv
- (pas_book_respond_get_changes): Respond to the get changes operation
-
- * backend/pas/pas-book.h: Add GetChanges PASOperation
-
- * backend/idl/addressbook.idl: add get_changes and respond_get_changes
- methods
-
- * backend/ebook/e-book.c (e_book_get_changes): Client function
- to a view of the changed objects
-
- * backend/ebook/e-book.h: New prototype
-
-2000-10-30 Kjartan Maraas <kmaraas@gnome.org>
-
- * backend/e-book/e-card.c: Fixed marking of strings
- for translation. Use "_(" instead of "_ (".
- * gui/component/addressbook-factory.c: Add missing
- calls to bindtextdomain() and textdomain noticed by
- Dan Winship.
- * gui/component/addressbook.c: Marked string for translation.
-
-2000-10-27 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/pas/Makefile.am, gui/search/Makefile.am,
- printing/Makefile.am: Fixed these to include EXTRA_GNOME_CFLAGS.
-
- * gui/component/select-names/e-select-names-manager.c: Turned off
- newlines in header fields.
-
-2000-10-26 Michael Meeks <michael@helixcode.com>
-
- * printing/e-contact-print.c (e_contact_print_letter_tab),
- (complete_sequence, e_contact_do_print_phone_list, lowify):
- unsigned charness.
-
-2000-10-25 Chris Toshok <toshok@helixcode.com>
-
- * backend/pas/pas-backend-ldap.c (ldap_op_process_current): only
- call the handler if the if we're connected, and if we fail to
- connect finish the op and post a message.
- (pas_backend_ldap_connect): add debug spew if DEBUG is defined.
- (modify_card_handler): LDAP_RES_SEARCH_ENTRY => LDAP_SUCCESS.
- (modify_card_handler): only perform the ldap_modify_s if we have a
- list of modifications.
- (get_cursor_handler): use ldap_error_to_response here.
- (pas_backend_ldap_load_uri): use LDAP_PORT instead of the constant
- 389.
-
-2000-10-23 Dan Winship <danw@helixcode.com>
-
- * gui/component/select-names/Makefile.am (INCLUDES):
- * gui/component/Makefile.am (INCLUDES): Update EVOLUTION_LOCALEDIR
-
- * backend/pas/Makefile.am (INCLUDES):
- * backend/ebook/Makefile.am (INCLUDES): Update GNOMELOCALEDIR.
-
-2000-10-23 JP Rosevear <jpr@helixcode.com>
-
- * conduit/address-conduit.h: Use new libeconduit calls and
- abstraction
-
- * conduit/address-conduit.c: ditto
-
-2000-10-23 JP Rosevear <jpr@helixcode.com>
-
- * conduit/address-conduit.c (pre_sync): Use e_pilot_map_read
- (post_sync): Use e_pilot_map_write
-
- * conduit/Makefile.am: Link libeconduit and not libical
-
-2000-10-20 Michael Meeks <michael@helixcode.com>
-
- * contact-editor/e-contact-editor.c (tb_save_and_close_cb):
-
- * gui/component/addressbook.c (toggle_view_as_cb):
-
-2000-10-20 JP Rosevear <jpr@helixcode.com>
-
- * conduit/address-conduit.h: New structure of file - similar
- to calendar/todo conduits
-
- * conduit/address-conduit.c: ditto
-
- * conduit/address-conduit-config.h: Config stuff for conduit
-
- * conduit/.cvsignore: Update
-
- * conduit/Makefile.am: Build fixes
-
- * conduit/address-conduit-control-applet.desktop: Renamed
- to e-address-conduit-control-applet.desktop
-
- * conduit/address.conduit.in: Renamed to e-address.conduit.in
-
-2000-10-19 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/widgets/e-addressbook-view.c (SPEC): Remove Family name
- column since it's a bit weird. This also fixes the initial state
- since all of the column choices were off by one.
-
-2000-10-19 Ettore Perazzoli <ettore@helixcode.com>
-
- * printing/Makefile.am (glade_DATA): Remove
- `e-contact-print.glade.h'.
- (EXTRA_DIST): Move here.
-
- * gui/component/Makefile.am (glade_DATA): Remove
- `ldap-server-dialog.glade.h'.
- (EXTRA_DIST): Move here.
-
-2000-10-19 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card.c: Change how the extension field acts when
- converting delivery addresses to labels.
-
-2000-10-18 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card.c, backend/ebook/e-card.h: Added the
- function e_card_delivery_address_to_label.
-
- * contact-editor/e-contact-editor-address.c: Fixed a potential
- crash.
-
- * contact-editor/e-contact-editor.c: Made this save the changed
- data to the string version of the address.
-
-2000-10-19 Michael Meeks <michael@helixcode.com>
-
- * gui/component/addressbook.c (change_view_type): update to new
- UI handler.
- (update_view_type): split from (change_view_type).
- (control_activate): add an update_view_type.
-
-2000-10-18 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card-simple.c: Change NAME_OR_ORG to return the
- email address if both name and organization are taken.
-
- * gui/component/select-names/e-select-names.c: Fixed up the spec
- strings in this class. Removed the "cursor_mode" argument to
- ETable since it's part of the spec now.
-
-2000-10-17 Iain Holmes <iain@helixcode.com>
-
- * contact-editor/contact-editor.glade: Change the initial dialog
- visibility to FALSE
- so the contact editor doesn't flash when it appears.
-
-2000-10-16 Iain Holmes <iain@helixcode.com>
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_activate_dialog): Only allow one dialog
- per manager.
-
-2000-10-16 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/fulladdr.glade: Fixed a typo. Made this look a
- bit better.
-
-2000-10-15 Dan Winship <danw@helixcode.com>
-
- * gui/component/select-names/Makefile.am:
- * gui/component/Makefile.am: Remove CPPFLAGS since they just
- duplicate flags that were already in INCLUDES.
-
- * printing/Makefile.am (ecpsdir):
- * gui/widgets/Makefile.am:
- * contact-editor/Makefile.am: Move -D flags from CPPFLAGS to
- INCLUDES so they don't override any CPPFLAGS set at configure
- time.
-
-2000-10-14 Michael Meeks <michael@helixcode.com>
-
- * gui/component/addressbook.c (control_activate): if we are in
- LDAP mode then merge in the extra few items, otherwise just merge
- the standard thing; saves duplication.
-
-2000-10-14 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/addressbook.oafinfo: Added
- "evolution:shell-component-icon" property.
-
-2000-10-14 Iain Holmes <iain@helixcode.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_manager_activate_dialog): Only allow one dialog
- per id.
- (e_select_names_manager_destroy): Destroy the hashtable.
- (e_select_names_manager_init): Init the hashtable.
-
-2000-10-13 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/fulladdr.glade, contact-editor/fulladdr.glade.h:
- Rearranged these fields a bit more.
-
-2000-10-13 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor-categories.c,
- gui/component/select-names/e-select-names.c,
- gui/widgets/e-addressbook-view.c: Changed these for boolean
- ascending attribute instead of int ascending attribute. Fixed
- e-select-names to not use a column past the end of its array.
-
- * contact-editor/e-contact-editor-address.c,
- contact-editor/fulladdr.glade, contact-editor/fulladdr.glade.h:
- Rearranged the address editor dialog.
-
-2000-10-11 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor-categories.c: Fixed the column
- elements, the no-headers attribute and added a cursor-mode=line
- attribute.
-
- * gui/component/select-names/e-select-names.c,
- gui/widgets/e-addressbook-view.c: Fixed the column elements here.
-
-2000-10-11 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor-categories.c,
- gui/component/select-names/e-select-names.c,
- gui/widgets/e-addressbook-view.c: Updated these to the new style
- ETables.
-
-2000-10-06 Not Zed <NotZed@HelixCode.com>
-
- * gui/search/e-addressbook-search-dialog.c (get_widget): Removed
- ondemand callback nonsense from rule_context_load().
-
-2000-10-05 Michael Meeks <michael@helixcode.com>
-
- * contact-editor/e-contact-editor.c (create_ui): upd.
- (e_contact_editor_init): upd.
-
- * gui/component/addressbook.c (control_activate_cb): upd.
- (control_deactivate): kill.
- (control_activate): upd.
-
-2000-09-22 Michael Meeks <michael@helixcode.com>
-
- * gui/component/addressbook.c (control_activate): update.
-
- * contact-editor/e-contact-editor.c (create_ui): upd.
-
-Fri Sep 29 07:33:54 2000 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/widgets/e-minicard.c, gui/widgets/e-minicard.h: Made it so
- that minicard doesn't write out changes to the backend unless
- something's actually changed.
-
-Tue Sep 26 16:28:47 2000 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card.c: Make sure that card->name and
- card->full_name are always valid.
-
- * contact-editor/e-contact-editor.c: Removed some unused
- variables.
-
-2000-09-22 Matt Bissiri <bissiri@eecs.umich.edu>
-
- * contact-editor/e-contact-editor-fullname.c (extract_info): If
- (editor->name == NULL), store ptr to newly allocated ECardName in
- editor->name, not just in a stack variable. This fixes a crash
- which happened when you click "New", then click "Full Name...",
- then enter name, then click "OK".
-
- * backend/ebook/e-card.c (e_card_name_to_string): Add
- g_return_val_if_fail.
-
-2000-09-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * gui/widgets/Makefile.am:
- * gui/component/Makefile.am:
- * contact-editor/Makefile.am:
- * printing/Makefile.am: Look for ename in /e-util/ename instead of
- /addressbook/ename
-
- * backend/ebook/e-card.c: Updated to include e-util/ename/*.h
-
- * ename: Moved to /e-util so it could be shared
-
- * Makefile.am (SUBDIRS): took out ename
-
-2000-09-25 Nat Friedman <nat@helixcode.com>
-
- * ename/e-name-western-tables.h: Added a ton of new prefixes and
- suffixes.
-
-2000-09-22 Michael Meeks <michael@helixcode.com>
-
- * gui/component/addressbook.c (control_activate): update.
-
- * contact-editor/e-contact-editor.c (create_ui): upd.
-
-2000-09-22 Chris Toshok <toshok@helixcode.com>
-
- * backend/pas/pas-backend-ldap.c: lots of changes. flesh out the
- remove/modify/create functions. add another flag for the property
- table, PROP_DN, which makes it easy for us to determine when we
- need to create a new DN for a record when we're modifying. also
- add a ber_func to the table for PROP_TYPE_LIST fields, which fills
- in the list of bvalues that we send to the ldap server. The
- add/modify/delete stuff hasn't been tested yet, and it hopelessly
- complex (yay ldap).
- (ldap_search_handler): act synchronous when ldap_search responds
- with -1.
- (view_destroy): use pas_book_view_notify_status_message.
- (ldap_op_process_current): same
- (ldap_op_process): same
- (poll_ldap): same
- (ldap_search_handler): same
-
-2000-09-22 Chris Toshok <toshok@helixcode.com>
-
- * backend/ebook/e-card-simple.h: add
- E_CARD_SIMPLE_FIELD_FAMILY_NAME to the enum.
-
- * backend/ebook/e-card-simple.c (field_data): add
- E_CARD_SIMPLE_FIELD_FAMILY_NAME.
- (e_card_simple_get): add getter for FAMILY_NAME.
-
-2000-09-22 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card.c: Made addresses be quoted printable again
- so that they will encode properly if they have carriage returns in
- them. This is possible now because of a fix in libversit.
-
-2000-09-22 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-book-view-listener.c,
- backend/ebook/e-book-view-listener.h, backend/ebook/e-book-view.c,
- backend/ebook/e-book-view.h, backend/idl/addressbook.idl,
- backend/pas/pas-book-view.c, backend/pas/pas-book-view.h: Added a
- function to set the status message associated with a given view.
- This is not yet implemented in the gui.
-
-2000-09-22 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-book.c, backend/ebook/e-book.h,
- backend/idl/addressbook.idl, backend/pas/pas-backend-file.c,
- backend/pas/pas-backend-ldap.c, backend/pas-backend.c,
- backend/pas/pas-backend.h, backend/pas/pas-book.c,
- backend/pas/pas-book.h: Added a function to query static
- capabilities (capabilities that can be reported immediately) and
- implemented them in the 2 servers.
-
- * gui/component/addressbook.c: Added a View All button and a Stop
- button. Sorted out the new directory server stuff a bit.
-
- * gui/widgets/e-addressbook-model.c,
- gui/widgets/e-addressbook-model.h: Cleaned up a bit. Added a stop
- function. Check for capabilities before deciding whether to load
- all cards when initially viewed.
-
- * gui/widgets/e-addressbook-view.c,
- gui/widgets/e-addressbook-view.h: Added stop and view all
- functions.
-
- * gui/widgets/e-minicard-view-widget.c,
- gui/widgets/e-minicard-view-widget.h,
- gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h:
- Added a stop function. Check for capabilities before deciding
- whether to load all cards when initially viewed.
-
-2000-09-21 Michael Meeks <michael@helixcode.com>
-
- * gui/component/addressbook.c (control_activate): remove _UIHandler
-
-2000-09-21 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/load-pine-addressbook.c: Added a missing include
- of ctype.h.
-
- * backend/pas/pas-backend-file.c: Fixed a problem where using a
- GList was causing us to not be reentrant. We now use an EList
- here and so now this is reentrant. This should fix the "wombat
- crashes every time you run evolution" bug.
-
- * contact-editor/e-contact-editor.c: Fixed a type mismatch.
-
-2000-09-21 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/load-pine-addressbook.c: Make this work when a
- field is spread across multiple lines.
-
-2000-09-20 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card.c, backend/ebook/e-card.h: Added a
- wants_html field to cards. Uses "x-mozilla-html".
-
- * contact-editor/Makefile.am: Added definition of
- EVOLUTION_DATADIR.
-
- * contact-editor/contact-editor.glade: Make Wants HTML check
- button visible.
-
- * contact-editor/e-contact-editor.c,
- contact-editor/e-contact-editor.h: Make Wants HTML check button
- active. Fix UI stuff to use XML. Set parent window of
- confirm_delete dialog.
-
- * gui/widgets/e-addressbook-view.c, gui/widgets/e-minicard.c: Set
- the parent window of the confirm_delete dialog.
-
-2000-09-20 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/widgets/e-addressbook-view.c: Fixed display of the minicards
- when the addressbook was first loading. (It was overwriting a
- string with NULL during init.)
-
-2000-09-19 Dan Winship <danw@helixcode.com>
-
- * gui/search/Makefile.am (ruledir): Use $(datadir), not
- $(prefix)/share
-
-2000-09-18 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/Makefile.am, contact-editor/Makefile.am,
- ename/Makefile.am, gui/component/Makefile.am,
- gui/widgets/Makefile.am: Added $(EXTRA_GNOME_CFLAGS) and
- $(EXTRA_GNOME_LIBS). Removed unneeded libraries.
-
- * backend/ebook/e-card.c, backend/pas/pas-backend-file.c,
- contact-editor/e-contact-editor-address.c,
- contact-editor/e-contact-editor-categories.c,
- contact-editor/e-contact-editor-categories.h,
- contact-editor/e-contact-editor-fullname.c,
- contact-editor/e-contact-editor.c,
- contact-editor/e-contact-save-as.c, ename/e-address-western.c,
- ename/test-ename-western-gtk.c,
- gui/component/addressbook-factory.c, gui/component/addressbook.c,
- gui/component/e-cardlist-model.h, gui/component/e-ldap-storage.c,
- gui/component/select-names/e-select-names-bonobo.c,
- gui/component/select-names/e-select-names-manager.c,
- gui/component/select-names/e-select-names-model.c,
- gui/component/select-names/e-select-names-table-model.c,
- gui/component/select-names/e-select-names-table-model.h,
- gui/component/select-names/e-select-names-text-model.h,
- gui/component/select-names/e-select-names.c,
- gui/component/select-names/e-select-names.h,
- gui/search/e-addressbook-search-dialog.c,
- gui/widgets/e-addressbook-model.h,
- gui/widgets/e-addressbook-view.c, gui/widgets/e-minicard-label.c,
- gui/widgets/e-minicard-view-widget.c,
- gui/widgets/e-minicard-view-widget.h,
- gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h,
- gui/widgets/e-minicard-widget.h, gui/widgets/e-minicard.c,
- gui/widgets/test-minicard-label.c, gui/widgets/test-reflow.c,
- printing/e-contact-print.c: Fixed the #include lines to deal
- properly with gal.
-
-2000-09-15 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.h,
- contact-editor/e-contact-save-as.h,
- gui/widgets/e-addressbook-model.h,
- gui/widgets/e-minicard-view-widget.h,
- gui/widgets/e-minicard-view.h, gui/widgets/e-minicard.c,
- gui/widgets/e-minicard.h: Fixed the paths of some .h #includes.
-
- * gui/component/addressbook.c: Removed all of the code to actually
- create and display the correct view of the addressbook and moved
- it to the new class gui/widgets/e-addressbook-view.c.
-
- * gui/widgets/Makefile.am: Added everything necessary for
- e-addressbook-view.c and e-addressbook-view.h.
-
- * gui/widgets/e-addressbook-view.c,
- gui/widgets/e-addressbook-view.h: New class to deal with actual
- display of addresses and switching between card view and table
- view.
-
- * gui/widgets/e-minicard-view-widget.c: Made this deal more
- gracefully with having the book set to NULL.
-
-2000-09-16 Michael Meeks <michael@helixcode.com>
-
- * gui/component/select-names/e-select-names.c: fix broken include.
-
- * gui/component/Makefile.am (INCLUDES): define datadir.
- (evolution_addressbook_SOURCES): remove e-addressbook-model.[ch]
-
- * gui/component/addressbook.c (control_activate): use datadir.
-
-2000-09-16 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/widgets/Makefile.am (gladedir): Define.
- (glade_DATA): Install `alphabet.glade'.
- (EXTRA_DIST): Define.
-
- * gui/component/Makefile.am (glade_DATA): Remove `alphabet.glade'.
- (EXTRA_DIST): Remove `alphabet.glade.h'.
-
- * gui/widgets/Makefile.am (libeminicard_a_SOURCES): Add
- `e-addressbook-model.c' and `e-addressbook-model.h'. I hope this
- is what Chris meant to do.
-
- * gui/component/Makefile.am (INCLUDES): Add
- `-I$(top_srcdir)/addressbook/gui/widgets'.
- (evolution_addressbook_SOURCES): Remove `e-addressbook-model.c'
- and `e-addressbook-model.h'.
-
- * gui/component/select-names/e-select-names.c: #include
- "e-addressbook-model.h" from "addressbook/gui/widgets" instead of
- "addressbook/gui/component", as it has been moved there.
-
-2000-09-15 Chris Toshok <toshok@helixcode.com>
-
- * backend/pas/pas-backend-ldap.c: split all the ldap operations
- into 2 halves, a handler, and destructor, and create a structure
- containing two function pointers and any data they need. this
- allows us queue up pending operations (since the LDAP*'s are no
- longer view specific. there's one per backend.) also, add
- support for restarting async operations if the SERVER DOWN error
- isn't communicated until sometime after the handler is called (as
- is the case with the async search stuff.)
-
-2000-09-14 Dan Winship <danw@helixcode.com>
-
- * gui/component/addressbook-factory.c (main): Call unicode_init
- for e-font stuff.
-
-2000-09-14 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/Makefile.am, gui/widgets/Makefile.am: Added
- $(GNOME_PRINT_LIBS) to all of the test files in these directories.
-
-2000-09-14 Michael Meeks <michael@helixcode.com>
-
- * gui/component/Makefile.am (evolution_addressbook_LDADD): fix path.
-
- * gui/component/addressbook.c: update include.
-
- * gui/component/addressbook-factory.c: update include.
-
- * gui/widgets/e-minicard-view.h: update include.
-
- * gui/search/e-addressbook-search-dialog.c: update include path.
-
-2000-09-13 Michael Meeks <michael@helixcode.com>
-
- * contact-editor/e-contact-editor.c (e_contact_editor_init): hack.
- (create_toolbar): ditto.
-
-2000-09-07 Michael Meeks <michael@helixcode.com>
-
- * gui/component/addressbook.c: Radicaly update UI handler code.
-
-2000-09-13 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/widgets/*, gui/minicard/*: Moved gui/minicard to
- gui/widgets, except for e-reflow.c, e-reflow.h, e-reflow-sorted.c,
- and e-reflow-sorted.h.
-
- * gui/widgets/Makefile.am: Added e-reflow to the INCLUDES list and
- libereflow.a to a bunch of LDADD lines.
-
- * gui/component/Makefile.am (evolution_addressbook_LDADD): Added
- libereflow.a here.
-
- * gui/Makefile.am (SUBDIRS): Replaced minicard with widgets.
-
-2000-09-12 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/select-names/Makefile.am: Add space after `-I'
- when invoking `orbit-idl'.
-
-2000-09-12 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/Makefile.am (EXTRA_DIST): Remove `ui.xml'.
-
-2000-09-11 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.c: Fixed a crash error.
-
-2000-09-11 Christopher James Lahey <clahey@helixcode.com>
-
- * ename/e-address-western.c: Fixed some warnings.
-
-2000-09-11 Jesse Pavel <jpavel@helixcode.com>
-
- * ename/e-address-western.c: fixed certain address parsing
- problems.
-
-2000-09-11 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/fulladdr.glade: Made this a bit better balanced.
-
- * gui/component/addressbook.c: Make the toolbar button for find do
- the same thing that the menu item for search does.
-
- * gui/search/e-addressbook-search-dialog.c: Made the top half of
- this not expand.
-
-2000-09-11 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h:
- Removed a bunch of redundant code. Made it so that when you set
- an address label, it sets the delivery address as well. Added
- functions to set and get the delivery address.
-
- * backend/ebook/e-card.c, backend/ebook/e-card.h: Added code to
- convert and address label to a delivery address.
-
- * contact-editor/Makefile.am: Added e-contact-editor-address.[ch],
- fulladdr.glade, fulladdr.glade.h.
-
- * contact-editor/contact-editor.glade,
- contact-editor/e-contact-editor-strings.h: Switched from a label
- to a button to show the parsed address.
-
- * contact-editor/e-contact-editor-address.c,
- contact-editor/e-contact-editor-address.h: New class to implement
- the parsed address dialog.
-
- * contact-editor/e-contact-editor-fullname.c,
- contact-editor/e-contact-editor-fullname.h: Added const to the
- _new function.
-
- * contact-editor/e-contact-editor.c: Implemented clicking on the
- address button.
-
- * contact-editor/fulladdr.glade, contact-editor/fulladdr.glade.h:
- New glade files for the parsed address dialog.
-
- * contact-editor/fullname-strings.h, fullname.glade: Changed these
- accellabels to labels.
-
- * ename/Makefile.am: Added e-address-western.c.
-
- * ename/e-address-western.c: Fixed some warnings.
-
-2000-09-10 Christopher James Lahey <clahey@helixcode.com>
-
- * ename/e-address-western.c: Added by Jesse.
-
-2000-09-08 Lauris Kaplinski <lauris@helixcode.com>
-
- * gui/minicard/e-minicard-label.c (e_minicard_label_construct):
- Use canvas default font
-
- * gui/minicard/e-minicard.c (e_minicard_realize): Ditto
- (get_left_width): Ditto
-
-2000-09-08 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor-categories.c: Fixed a few warnings.
-
-2000-09-02 Lauris kaplinski <lauris@helixcode.com>
-
- * contact-editor/e-contact-editor-categories.c: e_utf8 wrappers
-
- * contact-editor/e-contact-editor.c: e_utf8 wrappers
-
-2000-09-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/e-ldap-storage.c (load_ldap_data): Updated for the
- extra arg now needed by `evolution_storage_new_folder()'.
- (e_ldap_storage_add_server): Likewise.
-
-2000-08-31 Ettore Perazzoli <ettore@helixcode.com>
-
- * conduit/Makefile.am (INCLUDES): Add `BONOBO_GNOME_CFLAGS' and
- `-I$(top_srcdir)'.
-
-2000-08-31 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/Makefile.am: Install load-gnomecard-addressbook
- and load-pine-addressbook.
-
-2000-08-30 Lauris Kaplinski <lauris@helixcode.com>
-
- * printing/e-contact-print.c: Countless small changes for gnome-print 0.21+
-
-2000-08-30 Dan Winship <danw@helixcode.com>
-
- * gui/component/addressbook.oafinfo: Add a name to the minicard
- viewer.
-
-2000-08-29 Dan Winship <danw@helixcode.com>
-
- * backend/ebook/e-book.c:
- * backend/ebook/test-client.c:
- * backend/ebook/test-client-list.c:
- * backend/ebook/load-gnomecard-addressbook.c:
- * backend/ebook/load-pine-addressbook.c:
- * backend/pas/pas-book-factory.c:
- * conduit/address-conduit.h: Remove USING_OAF checks
-
-2000-08-28 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c: Use the right argument name to turn
- on grid lines.
-
-2000-08-26 JP Rosevear <jpr@helixcode.com>
-
- * gui/minicard/Makefile.am: Comment out minicard-view-test
- since its gnorba dependent
-
-2000-08-26 JP Rosevear <jpr@helixcode.com>
-
- * gui/component/addressbook-component.c: Remove gnorba stuff
-
- * gui/minicard/e-minicard-control.c (e_minicard_control_factory_init):
- ditto
-
- * gui/component/addressbook.c: ditto
-
- * gui/component/addressbook-factory.c: ditto
-
-2000-08-25 Christopher James Lahey <clahey@helixcode.com>
-
- * demo/* Removed the demo directory since it's no longer used.
-
-2000-08-26 JP Rosevear <jpr@helixcode.com>
-
- * gui/minicard/Makefile.am: Remove gnorba stuff
-
- * gui/minicard/e-minicard-control.gnorba: Kill
-
-2000-08-26 JP Rosevear <jpr@helixcode.com>
-
- * gui/component/addressbook.gnorba: Kill
-
- * gui/component/Makefile.am: Remove gnorba stuff
-
-2000-08-25 Dan Winship <danw@helixcode.com>
-
- * gui/component/Makefile.am (evolution_addressbook_LDFLAGS): Add
- -export-dynamic so libglade will be able to resolve custom widget
- callbacks.
-
-2000-08-23 Lauris Kaplinski <lauris@helixcode.com>
-
- * backend/pas/pas-backend-file.c (func_contains): Use e_utf8_strstrcase
-
- * contact-editor/e-contact-editor-fullname.c (fill_in_field): Use e_utf8 wrapper
- (extract_field): Same
-
- * contact-editor/e-contact-editor.c (full_name_clicked): Don't crash
-
- * ename/Makefile.am: Link demo with libeutil.la
-
- * ename/test-ename-western-gtk.c (full_changed_cb): Use e_utf8 wrapper
-
- * gui/component/addressbook.c (find_contact_cb): Use e_utf8 wrapper
- (search_entry_activated): Same
-
-2000-08-22 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/search/e-addressbook-search-dialog.c: Fix an error in the
- arguments to rule_context_load.
-
- * backend/ebook/e-card.c: Fix this to not mess up if the person
- passes a VCard with a carriage return in the mailing address.
-
-2000-08-14 Not Zed <NotZed@HelixCode.com>
-
- * gui/search/addresstypes.xml: Fixed fullname->full_name for
- search field.
-
- * gui/search/e-addressbook-search-dialog.c (get_widget): Check we
- actually got any parts to build the dialogue with.
-
-2000-08-13 Not Zed <NotZed@HelixCode.com>
-
- * gui/component/addressbook-component.c (owner_set_cb): Set the
- global_shell_client nastyhack when we know it.
- This is only required to link with the filter code ...
-
- * gui/component/Makefile.am (evolution_addressbook_LDADD): Added
- libfilter.a to the link line.
-
- * gui/search/Makefile.am (noinst_LIBRARIES): Change library name
- from libaddressbooksearchdialog to libaddressbooksearch, as used
- elsewhere.
-
- * gui/search/e-addressbook-search-dialog.c (get_widget):
- Implement.
- (get_query): Likewise.
- (e_addressbook_search_dialog_destroy): Unref filter stuff when
- done.
-
- * gui/component/addressbook.c (control_deactivate): Added chris's
- patch to put the meny in
-
-2000-08-22 Lauris Kaplinski <lauris@helixcode.com>
-
- * contact-editor/e-contact-editor.c: Use e_utf8 wrappers everywhere
-
-2000-08-22 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/e-card.h: Started adding a time zone field to ECard.
-
- * gui/component/e-addressbook-model.c: Added
- e_table_model_pre_change where appropriate.
-
- * gui/minicard/e-minicard-control.c: Added a ref and unref pair.
-
-2000-08-22 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c: Linked in the search dialog again.
- It looks like some changes in the shell made this not work.
-
-2000-08-19 Christopher James Lahey <clahey@helixcode.com>
-
- * conduit/address-conduit.c, conduit/address-conduit.h: Changed
- this to use ECardSimple.
-
- * contact-editor/e-contact-editor.c: Fixed a memory leak.
-
- * gui/component/addressbook.c: Added stuff to the right click
- menu. Activated the new search dialog that doesn't quite work
- yet.
-
- * gui/minicard/e-minicard-view.c: Fixed some run time warnings.
-
-2000-08-15 Larry Ewing <lewing@helixcode.com>
-
- * gui/minicard/e-minicard.c (e_minicard_event): use style colors
- for the selected state. This doesn't properly redraw the minicard
- when there is a style_change event, that is next.
- (e_minicard_realize): use style colors.
-
-2000-08-14 Peter Williams <peterw@helixcode.com>
-
- * backend/pas/pas-backend-file.c: Include the proper db1/db.h
- as in RedHat 7.0 -- patch from Kenny Graunke <kwg@teleport.com>
-
-2000-08-13 Chris Toshok <toshok@helixcode.com>
-
- * conduit/Makefile.am (libaddress_conduit_la_SOURCES): add
- address-conduit.h
-
- * Makefile.am (CONDUIT_SUBDIR): only set subdir if
- ENABLE_PILOT_CONDUITS is set.
-
-2000-08-13 Chris Toshok <toshok@helixcode.com>
-
- * Makefile.am (SUBDIRS): add conduit subdir.
-
-2000-08-13 Chris Toshok <toshok@helixcode.com>
-
- * conduit/address-conduit.c (conduit_get_gpilot_conduit): add
- special oaf initialization hack so conduit can find wombat, and
- accept all cookies so that we can actually talk to oaf.
-
-2000-08-13 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/pas/pas-backend-file.c: Fixed a typo that cause the
- wrong field to be searched.
-
- * gui/component/select-names/e-select-names.c: Made the select
- names dialog only display entries with email addresses.
-
-2000-08-12 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/contact-editor.glade: Fixed a typo in the name of
- the first phone entry.
-
-2000-08-12 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/search/Makefile.am,
- gui/search/e-addressbook-search-dialog.c,
- gui/search/e-addressbook-search-dialog.h: A few small interface
- fixes.
-
- * gui/component/Makefile.am: Link in the addressbook search
- dialog.
-
-2000-08-12 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/Makefile.am: Added the search directory.
-
- * backend/ebook/e-book.c: Fixed a potential crash.
-
- * gui/minicard/e-reflow-sorted.h: Fixed an include line.
-
- * gui/search/.cvsignore, gui/search/Makefile.am: New files.
-
- * gui/search/e-addressbook-search-dialog.c: Fixed compilation.
-
-2000-08-12 Christopher James Lahey <clahey@helixcode.com>
-
- * printing/Makefile.am: Ettore fixed compilation.
-
-2000-08-12 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/.cvsignore: Added load-gnomecard-addressbook.
-
-2000-08-12 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/search/e-addressbook-search-dialog.c,
- gui/search/e-addressbook-search-dialog.h: Made this into a Gtk
- object.
-
-2000-08-12 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/pas/pas-book-view.c: Ref our book view listener.
-
- * gui/component/addressbook.c: Updated to use new minicard view
- widget.
-
- * gui/minicard/Makefile.am: Added e-minicard-view-widget.c and
- e-minicard-view-widget.h.
-
- * gui/minicard/e-minicard-view-widget.c,
- gui/minicard/e-minicard-view-widget.h: New class that's just a
- minicard view in an ECanvas.
-
- * gui/search/e-addressbook-search-dialog.c: New file for
- implementing a search dialog.
-
-2000-08-11 Chris Toshok <toshok@helixcode.com>
-
- * conduit/address-conduit.c (transmit): implement code to encode
- the first email address and send to the pilot.
- (get_phone_label_by_flag): rename find_phone_label_for_flags to
- this, and implement by calling get_phone_label_by_name.
-
-2000-08-11 Chris Toshok <toshok@helixcode.com>
-
- * conduit/address-conduit.c (ecard_from_remote_record): add code
- for handling email addresses from pilot (which stores it as a
- phone number entry. go figure.)
- (check_for_slow_setting): #if 0 out, since we don't use it (yet).
- (update_record): un #if 0 the code to handle the case where the
- pilot info has changed for a local record.
- (merge_ecard_with_remote_record): implement function, but for now
- just return the existing (desktop) record - we still don't allow
- merge from the pilot.
-
-
-2000-08-10 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/search/addresstypes.xml: Changed a couple of input field
- names.
-
-2000-08-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/addressbook-component.c: Remove prototype for
- `setup_ldap_storage()', which shouldn't be here anyway.
-
-2000-08-10 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/search/, gui/search/addresstypes.xml: New search dialog for
- addressbook.
-
-2000-08-10 Dan Winship <danw@helixcode.com>
-
- * gui/component/addressbook-component.c (owner_set_cb): Update for
- changed prototype, pass evolution_homedir arg to
- setup_ldap_storage.
-
- * gui/component/e-ldap-storage.c (setup_ldap_storage): Now takes
- an evolution_homedir arg, uses that to generate the path to the
- ldapservers.xml file, and stores the result in a static variable.
- (e_ldap_storage_add_server, e_ldap_storage_remove_server): Use that
- static variable rather than hardcoding the path to the file.
-
-2000-08-10 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/pas/pas-backend-file.c: Fixed any search to not crash on
- missing phone numbers or email addresses.
-
-2000-08-09 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/minicard/e-minicard-control.c: Added a button to save to
- your addressbook.
-
-2000-08-09 Cody Russell <bratsche@gnome.org>
-
- * gui/component/addressbook.c: Make the toolbar honor the user's
- gnomecc settings for detachable toolbars.
-
-2000-08-09 Nat Friedman <nat@helixcode.com>
-
- * ename/e-name-western-tables.h: Added some military prefixes.
-
-2000-08-09 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c: Fixed a warning.
-
-2000-08-09 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/addressbook.c (control_activate): Add the stock
- print icon to the print item.
-
-2000-08-09 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/addressbook.c (control_activate): Put the print
- item in the right placeholder so that it gets the right position
- in the "File" menu.
- (control_deactivate): Updated accordingly.
-
-2000-08-09 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c, gui/minicard/e-minicard.c: Changed
- e_popup_menu_run call to match the new arguments.
-
- * gui/component/addressbook.oafinfo: Fixed this file to work
- properly.
-
- * gui/minicard/e-minicard-control.c: Use the correct oafinfo ID
- here. Also cleaned up the code a bit with the help of Michael
- Meeks.
-
-2000-08-08 Chris Toshok <toshok@helixcode.com>
-
- * gui/component/e-addressbook-model.c (e_addressbook_model_init):
- use x-evolution-any-field.
-
- * gui/component/addressbook.c (search_entry_activated): use
- x-evolution-any-field.
- (change_view_type): same.
-
- * gui/minicard/e-minicard-view.c (e_minicard_view_init): set query
- to x-evolution-any-field.
-
- * backend/pas/pas-backend-ldap.c (func_contains): support
- x-evolution-any-field for matching any evolution supported field.
-
- * backend/pas/pas-backend-file.c (compare_email): switch to using
- ECardSimple calls.
- (compare_phone): same.
- (compare_address): same.
- (entry_compare): switch to using ECardSimple calls, and support a
- 'x-evolution-any-field' wildcard field.
- (vcard_matches_search): use an ECardSimple.
-
-2000-08-07 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.c: Removed the next and prev
- toolbar buttons since they don't do anything.
-
-2000-08-07 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/contact-editor.glade,
- contact-editor/e-contact-editor.c: Fixed the tab order to not
- repeat the web page address field.
-
-2000-08-07 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.c: Fixed the tab order for this
- dialog.
-
-2000-08-05 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card-simple.c: Fixed a warning.
-
- * backend/ebook/e-card.c: Cast to (char *) in
- e_card_load_cards_from_file since libversit isn't const correct.
-
- * backend/pas/pas-backend-file.c: Fixed a warning.
-
-2000-08-04 Michael Meeks <michael@helixcode.com>
-
- * gui/component/addressbook.c (control_activate): unref.
-
- * demo/addressbook.c (control_activate): unref.
-
-2000-08-02 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor-categories.c,
- gui/component/e-addressbook-model.c: Emit "model_pre_change"
- signal as appropriate.
-
-2000-08-02 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/e-addressbook-model.c: Adapted this to supply the
- new append_row API of ETableModel.
-
-2000-07-31 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c: Changed the default set of columns.
-
-2000-07-29 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/Makefile.am: Added load-gnomecard-addressbook
- compilation.
-
- * backend/ebook/e-card.c, backend/ebook/e-card.h: Added
- e_card_load_cards_from_file helper function to load multiple cards
- from a single file.
-
- * backend/ebook/load-gnomecard-addressbook.c: New file to load
- vcard files. I think this is the format that gnomecard uses so if
- you copy your gnomecard file to gnomecard.vcf and then run this
- program in the same directory, it'll copy all your gnome contacts
- into evolution. It needs to be changed to take a filename as a
- parameter. Some fields (phone and address information, for
- example) aren't displayed properly, but are saved. This is new
- code, so some other than phone and address may be lost.
-
-2000-07-28 Ettore Perazzoli <ettore@helixcode.com>
-
- * backend/pas/Makefile.am: Add `pas-backend-ldap.c' and
- `pas-backend-ldap.h' to `EXTRA_DIST' so they get distributed even
- if the OpenLDAP support is not enabled.
-
-2000-07-27 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/load-pine-addressbook.c: Changed the URI to load
- to.
-
-2000-07-26 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/minicard/e-minicard-widget-test.c: Fixed a warning.
-
-2000-07-26 Chris Toshok <toshok@helixcode.com>
-
- * backend/pas/pas-backend-ldap.c (view_destroy): wait to free the
- view until we've taken care of freeing its internals. also, close
- the ldap connection here.
- (pas_backend_ldap_connect): rename p_b_l_ensure_connected to this,
- since it's always called when we create a view.
- (pas_backend_ldap_build_all_cards_list): open an ldap connection
- in this function and close it at the end.
- (poll_ldap): make sure to call ldap_unbind to close the view's
- connection here.
- (pas_backend_ldap_search): call pas_backend_ldap_connect here -
- ldap_unbind will either be called from poll_ldap or from
- view_destroy.
- (pas_backend_ldap_get_vcard): the PASBackendLDAP no longer has an
- LDAP*.
-
-2000-07-26 Chris Toshok <toshok@helixcode.com>
-
- * backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_build_all_cards_list): add support for user settable scope.
- (pas_backend_ldap_search): same.
- (pas_backend_ldap_load_uri): same.
-
-2000-07-26 Dan Winship <danw@helixcode.com>
-
- * gui/component/addressbook.oafinfo: lowercasify the
- supported_mime_types
-
-2000-07-25 Chris Toshok <toshok@helixcode.com>
-
- * backend/ebook/e-card-types.h: add enum for e-card pilot status.
-
- * conduit/address-conduit.c: #ifdef out all the archiving code with SUPPORT_ARCHIVING.
- (purge): implement correctly - deleting ecards whose pilot status is DELETED.
- (set_status): implement.
- (set_pilot_id): add gtk_main call here to change commit_card into a synchronous
- (delete_all): implement correctly - don't delete the records, just set their status to DELETED.
- (local_record_from_ecard): get the current status from the ecard.
-
- * backend/ebook/e-card.c (e_card_get_vcard): add vcard support for pilot status.
- (parse_pilot_status): new function.
- (e_card_class_init): add pilot status object arg.
- (e_card_set_arg): add pilot status support.
- (e_card_get_arg): same.
- (e_card_init): initialize pilot_status to 0.
-
-2000-07-25 Chris Toshok <toshok@helixcode.com>
-
- * conduit/address-conduit.c: add comment headers to signals that
- didn't have any.
-
-2000-07-25 Chris Toshok <toshok@helixcode.com>
-
- * conduit/address-conduit.c (start_address_server): use the user's
- Contact db. not toshok's.
-
-2000-07-25 Michael Meeks <michael@helixcode.com>
-
- * backend/ebook/load-pine-addressbook.c (book_open_cb): check we
- opened ok.
-
-2000-07-25 Seth Alves <alves@hungry.com>
-
- * ename/Makefile.am (libename_static_la_LDFLAGS): build static
- version of the library for address conduit to use
-
- * backend/ebook/Makefile.am: build a static version of the library
- to link into the conduit
-
-2000-07-25 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card.c: Added a #define for
- "X-EVOLUTION-PILOTID". Added a parse_pilot_id to read pilot id's
- in properly from VCards. Rearranged some field orders. Added a
- get_arg case for ARG_PILOTID. Initialize pilot_id field to 0.
-
-2000-07-24 Chris Toshok <toshok@helixcode.com>
-
- * backend/ebook/e-card.h: add pilot_id.
-
- * backend/ebook/e-card.c (e_card_get_vcard): add support for
- X-EVOLUTION-PILOTD vcard field.
- (e_card_class_init): add pilot_id arg.
- (e_card_set_arg): handle pilot_id arg.
-
-2000-07-23 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-book-view-listener.c: Remove the idle handler
- when we're destroyed.
-
- * printing/e-contact-print.c: Fixed the spacing on the card
- header.
-
-2000-07-20 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.oafinfo: Fixed the oaf info.
-
- * gui/minicard/.cvsignore, gui/minicard/Makefile.am,
- gui/minicard/e-minicard-widget-test.c: Added a test for the
- minicard widget.
-
- * gui/minicard/e-minicard-control.c: Fixed the mime type.
-
- * gui/minicard/e-minicard.c: Fixed some crashes if your parent
- isn't a minicard view.
-
- * gui/minicard/e-minicard-control.oafinfo: Removed.
-
-2000-07-20 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/addressbook-component.c (factory_fn): Update for
- the new `evolution_shell_component_new()'.
-
-2000-07-19 Fatih Demir <kabalak@gmx.net>
-
- * conduit/address-conduit-control-applet.desktop:
- Added the Turkish desktop entry.
-
-2000-07-18 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/minicard/e-minicard-control.c: Added "text/vCard" to the
- list of mime types we support.
-
-2000-07-18 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/minicard/Makefile.am: Added
- gui/minicard/e-minicard-control.c,
- gui/minicard/e-minicard-control.h,
- gui/minicard/e-minicard-widget.c, and
- gui/minicard/e-minicard-widget.h.
-
- * gui/minicard/e-minicard-control.c,
- gui/minicard/e-minicard-control.h,
- gui/minicard/e-minicard-widget.c,
- gui/minicard/e-minicard-widget.h: Got these to compile.
-
- * gui/minicard/e-minicard-control.gnorba,
- gui/minicard/e-minicard-control.oafinfo: Copied directly from
- bonobo-clock-control. These aren't done yet.
-
-2000-07-18 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/minicard/e-minicard-control.c,
- gui/minicard/e-minicard-control.h,
- gui/minicard/e-minicard-widget.c,
- gui/minicard/e-minicard-widget.h: New files for using a minicard
- as a widget or a bonobo control.
-
-2000-07-14 Chris Toshok <toshok@helixcode.com>
-
- * gui/component/e-ldap-storage.c (ldap_server_foreach): duh.
- don't save the port in the host slot either.
-
-2000-07-13 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor-confirm-delete.glade,
- contact-editor/e-contact-editor-confirm-delete.glade.h: Added
- these.
-
-2000-07-13 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Switched the order of compilation of printing and
- contact-editor.
-
- * contact-editor/Makefile.am: Added printing libraries and a
- confirm delete dialog glade file.
-
- * contact-editor/e-contact-editor.c,
- contact-editor/e-contact-editor.h: Enabled the delete and print
- functions as well as providing a confirm delete dialog to the
- outside world.
-
- * gui/component/addressbook.c: Made the delete button on new cards
- active.
-
- * gui/minicard/Makefile.am: Added printing libraries to a number
- of test programs.
-
- * gui/minicard/e-minicard.c: Added print and delete to the right
- click menu. Made the delete button on the card editor active.
-
- * printing/e-contact-print.c, printing/e-contact-print.h: Added a
- function to print a single card.
-
-2000-07-12 Chris Toshok <toshok@helixcode.com>
-
- * gui/component/e-ldap-storage.c (ldap_server_foreach): oops. fix
- typo that was saving the port in the rootdn spot.
- (save_ldap_data): make this a bit safer - writing to a new file
- and renaming it.
- (load_ldap_data): make this a bit smarter - if parsing the
- ldapservers.xml file fails and there's a .new file there,
- rename it.
-
-2000-07-12 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/pas/pas-backend-file.c: Do case insensitive compares.
-
- * addressbook/gui/component/addressbook.c: Make quick search
- search both name and company name.
-
-2000-07-12 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.c: Add icons to the toolbars.
-
-2000-07-12 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/Makefile.am: Added installation of arrow.png.
-
- * contact-editor/e-contact-editor.c: Use EVOLUTIONDIR #define.
-
-2000-07-11 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c: Removed an unused function
-
-2000-07-10 Dan Winship <danw@helixcode.com>
-
- * gui/component/select-names/Makefile.am (EXTRA_DIST): add idl
- file to EXTRA_DIST
-
-2000-07-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/addressbook.c (control_activate): Remove the
- SelectNames test.
-
-2000-07-10 Peter Williams <peterw@curious-george.helixcode.com>
-
- * gui/component/select-names/e-select-names-model.c: (Clahey's fix)
- Make multiple addresses be concatenated correctly.
-
-2000-07-09 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c,
- gui/component/select-names/e-select-names.c,
- gui/component/select-names/e-select-names.h: Switched from ETable
- to ETableScrolled.
-
- * addressbook/gui/minicard/e-minicard.c: Don't display mailer or
- "name or org" fields.
-
-2000-07-09 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h:
- Added a field that gives the name if it exists and the company
- name otherwise.
-
- * gui/component/e-addressbook-model.c: Formatting changes.
-
- * gui/component/select-names/e-select-names-table-model.c: Added
- stripping of names and display of company name if name doesn't
- exist.
-
- * gui/component/select-names/e-select-names.c: Fixed up the
- display so that we display both name and email address.
-
-2000-07-09 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/select-names/e-select-names-model.c: Fixed a small
- off by one error that was causing an extra character to get
- deleted sometimes.
-
-2000-07-09 Anders Carlsson <andersca@gnu.org>
-
- * gui/minicard/test-reflow.c (allocate_callback): Fix off by one bug with
- scroll region setting.
- (resize): Likewise.
- (main): Put the contacts list in an EScrolledFrame instead of using a
- separate GtkScrollbar.
-
- * gui/minicard/e-reflow.c (e_reflow_event): Don't change mouse cursor and
- don't allow drags on dividers that aren't visible.
-
- * gui/component/addressbook.c (allocate_callback): Fix off by one bug with
- scroll region setting.
- (resize): Likewise.
- (create_minicard_view): Put the contacts list in an EScrolledFrame instead of
- using a separate GtkScrollbar.
-
-2000-07-09 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c: Removed unused do_nothing_cb
- function.
-
- * gui/component/select-names/e-select-names-manager.c,
- gui/component/select-names/e-select-names-manager.h: Made the OK
- and Cancel buttons in the ESelectNames dialog we create work
- properly.
-
- * gui/component/select-names/e-select-names-model.c,
- gui/component/select-names/e-select-names-model.h: Added
- e_select_names_model_duplicate.
-
- * gui/component/select-names/e-select-names-text-model.c: Made the
- text be set correctly if there's already data in the source when
- the text model is created.
-
- * gui/component/select-names/e-select-names.c,
- gui/component/select-names/e-select-names.h: Removed handling of
- the buttons (the user of this dialog will have to handle them.)
- Added e_select_names_get_source. Fixed some typos.
-
-2000-07-09 Not Zed <NotZed@HelixCode.com>
-
- * gui/component/addressbook.c: Link the toolbar print button to
- the print callback.
-
-2000-07-08 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/select-names/e-select-names.c
- (e_select_names_clicked): Hitting OK or Cancel at least closes the
- dialog now.
-
-2000-07-08 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_create_entry): Set the returned entry to
- use the ellipsis.
-
-2000-07-08 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook-factory.c: Include
- e-select-names-factory.h.
-
- * gui/component/select-names/e-select-names-model.c: Handle a NULL
- iterator properly in the replace function.
-
- * gui/component/select-names/e-select-names-table-model.c: Fill in
- info properly in the value_at function.
-
- * gui/component/select-names/e-select-names-text-model.c: Don't
- strlen a NULL text object.
-
- * gui/component/select-names/e-select-names.c: Close if the person
- hits ok or cancel (doesn't yet actually undo changes if Cancel is
- hit.) Handle removing addresses when they're double clicked on.
-
- * gui/component/select-names/select-names.glade,
- gui/component/select-names/select-names.glade.h: Hid some unused
- fields and changed the text at the top of the dialog.
-
-2000-07-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * gui/component/select-names/.cvsignore: Ignore dynamically
- created source files
-
-2000-07-08 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/select-names/e-select-names-bonobo.c
- (entry_get_property_fn): New function to set the properties.
-
-2000-07-08 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/addressbook-factory.c (main): Start up the factory
- for `Evolution::Addressbook::SelectNames'.
-
- * gui/component/select-names/evolution-addressbook-select-names.oafinfo:
- New.
-
- * gui/component/select-names/e-select-names-factory.c: New.
- * gui/component/select-names/e-select-names-factory.h: New.
-
- * gui/component/select-names/e-select-names-bonobo.c: New.
- * gui/component/select-names/e-select-names-bonobo.h: New.
-
- * gui/component/addressbook-factory.c (main): Call
- `e_select_names_factory_init()'.
-
- * gui/component/select-names/e-select-names-manager.c
- (e_select_names_manager_add_section): Made const-aware.
- (e_select_names_manager_create_entry): Made const-aware.
- (e_select_names_manager_activate_dialog): Made const-aware.
-
- * gui/component/select-names/Evolution-Addressbook-SelectNames.idl:
- New.
-
-2000-07-08 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/e-addressbook-model.c,
- gui/component/e-addressbook-model.h: Added an "editable" argument.
-
- * gui/component/select-names/e-select-names.c: Set our
- EAddressModel to not be editable.
-
-2000-07-07 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/select-names/e-select-names.c: Changed to line
- mode.
-
-2000-07-07 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/select-names/e-select-names-manager.c,
- gui/component/select-names/e-select-names-model.c: Implemented the
- get_cards function.
-
- * gui/component/select-names/e-select-names.c: Implemented adding
- cards through the interface.
-
-2000-07-07 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/select-names/e-select-names-manager.c: Make the
- entry widgets we create editable.
-
- * gui/component/select-names/e-select-names-model.c: Use
- e_strsplit instead of g_strsplit. Fixed an off by 1 error.
-
- * gui/component/select-names/e-select-names-table-model.c: When
- the model changes, send a model changed signal.
-
- * gui/component/select-names/e-select-names-text-model.c: Made
- changing this work correctly if it's empty. Made change signals
- propagate properly. Is a bit better about freeing iterators when
- done.
-
- * gui/component/select-names/e-select-names.c: Made the finished
- lists be in order instead of being sorted.
-
-2000-07-07 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c (new_server_cb): Since
- ELDAPServer->port is a char *, allocate a string with the number
- 389 contained.
-
- * gui/component/addressbook.c: Make the select names test test the
- new code instead of the old way of getting to an ESelectNames
- dialog.
-
- * gui/component/select-names/e-select-names-manager.c: Coded
- storing the model for each section, creating an entry and
- returning it, and for activating the dialog. Wrote a bit of the
- get_cards code, but not all of it.
-
- * gui/component/select-names/e-select-names-model.c,
- gui/component/select-names/e-select-names-model.h: Coded all of
- the code needed to make ESelectNamesTextModel work (it doesn't
- yet, but all the code should be there.) Removed
- E_SELECT_NAMES_MODEL_DATA_TYPE_SEPARATION_MATERIAL.
-
- * gui/component/select-names/e-select-names-table-model.c,
- gui/component/select-names/e-select-names-text-model.c: Changed
- these to compensate for removal of
- E_SELECT_NAMES_MODEL_DATA_TYPE_SEPARATION_MATERIAL.
-
- * gui/component/select-names/e-select-names-table-model.h,
- gui/component/select-names/e-select-names-text-model.h: Fixed some
- silly typos.
-
- * gui/component/select-names/e-select-names.c,
- gui/component/select-names/e-select-names.h: Added a parameter to
- add_section that lets you specify the source ESelectNamesModel.
-
-2000-07-06 Chris Toshok <toshok@helixcode.com>
-
- * gui/component/e-ldap-storage.h: add scope to ELDAPServer, and
- make port a string.
-
- * gui/component/e-ldap-storage.c (load_ldap_data): don't load a
- uri, load all the bits and pieces and build up the uri when
- creating the folder, according to the openldap url format.
- (ldap_server_foreach): store out each of the individual uri
- pieces.
- (e_ldap_storage_remove_server): free the new fields.
- (get_string_value): if the text is empty, return the empty string
- instead of NULL.
-
- * gui/component/e-ldap-server-dialog.c (extract_server_info): port is a string now.
- (fill_in_server_info): port is a string now.
-
-2000-07-06 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.c: Changed "FIXME: Save and
- Close" to "Save and Close". Removed some toolbar items that will
- never be used.
-
- * gui/component/select-names/e-select-names-model.c,
- gui/component/select-names/e-select-names-model.h: Added functions
- to allow you to modify the model (not implemented yet.)
-
- * gui/component/select-names/e-select-names-table-model.c,
- gui/component/select-names/e-select-names-table-model.h: Finished
- this. Doesn't support changing the model at all.
-
- * gui/component/select-names/e-select-names-text-model.c: Finished
- this. Changing the model by typing is done, but doesn't work
- since none of the functions in the base model are implemented.
-
-2000-07-05 Chris Toshok <toshok@helixcode.com>
-
- * gui/component/addressbook.c (new_server_cb): call
- e_ldap_storage_add_server call.
-
- * gui/component/ldap-server-dialog.glade: add name row.
-
- * gui/component/e-ldap-server-dialog.h: remove the ELDAPServer type.
-
- * gui/component/e-ldap-server-dialog.c (extract_server_info): add
- support for the name-entry.
-
- * gui/component/e-ldap-server-dialog.c (fill_in_server_info): same.
-
- * gui/component/e-ldap-storage.h: add ELDAPServer type, and add
- prototypes for e_ldap_storage_add_server and
- e_ldap_storage_remove_server.
-
- * gui/component/e-ldap-storage.c (e_ldap_storage_add_server): new
- function, add it to our hash table, add a shell folder, and save
- out the metadata.
- (ldap_server_foreach): add the ldap server info under a
- "contactserver" node.
- (setup_ldap_storage): create our hashtable.
-
-2000-07-05 Chris Toshok <toshok@helixcode.com>
-
- * gui/component/addressbook.c (set_prop): remove hack to read
- "uri" file from local directory.
-
- * gui/component/Makefile.am (evolution_addressbook_SOURCES): add
- e-ldap-storage.{c,h}
-
- * gui/component/addressbook-component.c (owner_set_cb): call
- setup_ldap_storage.
-
- * gui/component/e-ldap-storage.c (setup_ldap_storage): Register
- the LDAP storage and load the .xml file.
- (load_ldap_data): function to load our xml file.
- (save_ldap_data): function to save our xml file.
-
- * gui/component/e-ldap-storage.h: new file.
-
-2000-07-03 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/select-names/e-select-names-manager.c,
- gui/component/select-names/e-select-names-text-model.c,
- gui/component/select-names/e-select-names.c: Fixed more compile
- errors.
-
-2000-07-03 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/select-names/Makefile.am: Fixed compile error.
-
-2000-07-03 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/Makefile.am: Removed e-card-iterator.c,
- e-card-iterator.h, e-card-list-iterator.c, e-card-list-iterator.h,
- e-card-list.c, e-card-list.h.
-
- * backend/ebook/e-card-iterator.c,
- backend/ebook/e-card-iterator.h,
- backend/ebook/e-card-list-iterator.c,
- backend/ebook/e-card-list-iterator.h, backend/ebook/e-card-list.c,
- backend/ebook/e-card-list.h: Removed in favor or versions without
- the -card in the e-util directory since these classes are not
- specific to cards at all.
-
- * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h,
- backend/ebook/e-card.c, backend/ebook/e-card.h,
- backend/ebook/load-pine-addressbook.c, backend/ebook/test-card.c,
- backend/pas/pas-backend-file.c: Changed the references to
- e-card-list.c and friends to e-list.c and friends.
-
- * contact-editor/e-contact-editor.c: Added #include
- <e-contact-save-as.h> to fix a warning.
-
- * gui/component/Makefile.am: Moved a number of classes associated
- with the select-names object to the new select-names directory.
-
- * gui/component/addressbook.c: Changed the reference to
- e-select-names.h.
-
- * gui/component/e-select-names.c, gui/component/e-select-names.h,
- gui/component/select-names.glade,
- gui/component/select-names.glade.h: Moved these files into
- select-names/.
-
- * gui/component/select-names/.cvsignore,
- gui/component/select-names/Makefile.am,
- gui/component/select-names/e-select-names-manager.c,
- gui/component/select-names/e-select-names-manager.h,
- gui/component/select-names/e-select-names-model.c,
- gui/component/select-names/e-select-names-model.h,
- gui/component/select-names/e-select-names-table-model.c,
- gui/component/select-names/e-select-names-table-model.h,
- gui/component/select-names/e-select-names-text-model.c,
- gui/component/select-names/e-select-names-text-model.h,
- gui/component/select-names/e-select-names.c,
- gui/component/select-names/e-select-names.h,
- gui/component/select-names/recipient.glade,
- gui/component/select-names/select-names.glade,
- gui/component/select-names/select-names.glade.h: New files for
- select names dialog (e-select-names.c, e-select-names.h,
- select-names.glade, select-names.glade.h and recipient.glade moved
- from gui/component/.)
-
-2000-06-29 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/addressbook-component.c (owner_set_cb): Get an
- EvolutionShellClient instead of an Evolution_Shell to match the
- changes in libeshell.
-
-2000-06-28 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/select-names/,
- gui/component/select-names/e-select-names-manager.c,
- gui/component/select-names/e-select-names-manager.h: New select
- names manager interface (Not complete.)
-
-2000-06-26 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor-categories.c,
- addressbook/gui/component/e-cardlist-model.c: Added
- value_to_string handlers.
-
- * demo/addressbook-widget.c, demo/demo.c: Removed usage of "x" and
- "y" arguments.
-
- * addressbook/gui/component/addressbook.c: Activated Click To Add
- and set the click to add message.
-
- * addressbook/gui/component/e-addressbook-model.c: Added
- value_to_string and append_row handlers.
-
- * addressbook/gui/component/e-select-names.c: Added a column.
-
-2000-06-26 Chris Toshok <toshok@helixcode.com>
-
- * backend/pas/pas-backend-ldap.c (poll_ldap): remove spew.
- (pas_backend_ldap_ensure_connected): duh, don't access a pointer
- we know to be NULL.
- (query_prop_to_ldap): rename map_e_card_prop_to_ldap to this.
- easier to type.
-
-2000-06-21 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/minicard/test-minicard-label.c,
- gui/minicard/test-minicard.c, gui/minicard/test-reflow.c: Remove
- usage of "x" and "y" arguments.
-
-2000-06-18 <ettore@helixcode.com>
-
- * contact-editor/Makefile.am (INCLUDES): Use
- `$(BONOBO_GNOME_CFLAGS)' so that we compile when Bonobo is not in
- the default GNOME prefix.
-
-2000-06-17 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/minicard/e-minicard-label.c,
- gui/minicard/e-minicard-label.h, gui/minicard/e-minicard.c: Made
- the left column of minicards not get any wider than the widest
- possible name.
-
-2000-06-13 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/Makefile.am (SHELL_OBJS): Removed.
- (evolution_addressbook_LDADD): Link with
- `$(top_builddir)/shell/libeshell.a'.
-
-2000-06-12 Federico Mena Quintero <federico@helixcode.com>
-
- * contact-editor/e-contact-editor-categories.c: Removed the
- ETableModel thaw handler.
- * gui/component/e-cardlist-model.c: Likewise.
-
-2000-06-11 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/e-select-names.c: Fixed the widget reparenting.
-
-2000-06-11 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/Makefile.am: Added glade files.
-
- * gui/component/addressbook.c: Added a test of the Select Names
- functionality.
-
- * gui/component/e-addressbook-model.c: Made this class_init
- function a bit cleaner.
-
- * gui/component/e-select-names.c: Tested this and fixed some
- obvious errors.
-
- * gui/component/select-names.glade: The main window shouldn't be
- visible by default.
-
-2000-06-11 Ettore Perazzoli <ettore@helixcode.com>
-
- * contact-editor/Makefile.am (contact_editor_test_LDADD): Link
- with libemiscwidgets.a.
- * gui/component/Makefile.am (evolution_addressbook_LDADD): Likewise.
- * gui/minicard/Makefile.am (minicard_test_LDADD): Likewise.
- (reflow_test_LDADD): Likewise.
- (minicard_view_test_LDADD): Likewise.
-
-2000-06-10 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/e-cardlist-model.c: Renamed a bunch of functions
- for better readability.
-
- * gui/component/e-select-names.c, gui/component/e-select-names.h:
- This should be a working dialog now.
-
- * gui/component/select-names.glade: Changed the name & creation
- function of the ETable here.
-
-2000-06-10 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/select-names.glade,
- gui/component/select-names.glade.h: Glade files for Select Names
- dialog.
-
-2000-06-10 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.c: Do e_card_simple_sync and
- extract_info more often.
-
- * gui/component/addressbook.c: Added table printing code.
-
-2000-06-09 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/addressbook-component.c (factory_fn): Pass NULL
- for the new args @create_folder_fn and @remove_folder_fn.
-
-2000-06-08 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/addressbook-component.c (create_view): Updated for
- the new `EvolutionShellComponentCreateViewFn'. Return
- `EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE' if @type is not
- "contacts".
-
-2000-06-08 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.c: Bind Save As to save the
- current view of the contact as a vcard.
-
-2000-06-08 Federico Mena Quintero <federico@helixcode.com>
-
- * contact-editor/e-contact-editor.c (save_card): Doh, sync the
- card simple and extract the card info.
-
-2000-06-08 Federico Mena Quintero <federico@helixcode.com>
-
- * contact-editor/e-contact-editor.h (EContactEditor): Now this
- derives from GtkObject. It follows the same strategy as the
- EventEditor in the calendar.
- (EContactEditor): Added an is_new_card field so that we can know
- whether to add() or commit() the card.
-
- * contact-editor/e-contact-editor.c (e_contact_editor_get_type):
- Derive from GtkObject.
- (e_contact_editor_class_init): Likewise.
- (e_contact_editor_class_init): Added an "is_new_card" argument.
- (e_contact_editor_set_arg): Handle ARG_IS_NEW_CARD.
- (e_contact_editor_get_arg): Likewise.
- (e_contact_editor_new): Take in an is_new_arg argument and set it
- on the object.
- (e_contact_editor_init): Load the app widget into the app field of
- the EContactEditor structure. Create its UIHandler as well.
- (e_contact_editor_class_init): New "add_card", "commit_card", and
- "editor_closed" signals.
-
- * contact-editor/test-editor.c (main): Modified for the new API.
- (editor_closed_cb): Tweaked for the new API.
- Since this test program does not use Bonobo, it doesn't work,
- though.
-
- * gui/component/addressbook.c (new_contact_cb): Use the new
- contact editor API.
- (table_double_click): Ditto.
-
- * gui/minicard/e-minicard-view.c (e_minicard_view_event): Use the
- new contact editor API.
-
- * gui/minicard/e-minicard.c (e_minicard_event): Use the new
- contact editor API.
-
-2000-06-08 Ettore Perazzoli <ettore@helixcode.com>
-
- * contact-editor/Makefile.am (contact_editor_test_LDADD): Remove
- the `$(srcdir)/' prefix from `libecontacteditor.a' because [of
- course] the library is built in the build directory, not in the
- source directory.
- * gui/minicard/Makefile.am (minicard_test_LDADD): Likewise with
- `libeminicard.a'.
- (minicard_label_test_LDADD): Likewise.
- (reflow_test_LDADD): Likewise.
- (minicard_view_test_LDADD): Likewise.
-
-2000-06-06 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c: Bind right click on the ETable to
- "Save to VCard."
-
-2000-06-02 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.c: Made phone/email/address
- labels change correctly again.
-
-2000-06-02 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook-component.c: Made
- evolution-addressbook shut down when the shell is done with it.
-
-2000-06-02 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/minicard/e-minicard-view.c, gui/minicard/e-minicard.c: Made
- double click only work on the first button.
-
-2000-06-01 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/minicard/e-minicard.c: return TRUE if opening a contact
- editor so that we don't get a "new dialog" contact editor.
-
-2000-06-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/addressbook.c (new_contact_cb): Use the stock
- cancel button for the dialog.
- (table_double_click): Likewise.
- (find_contact_cb): Likewise.
-
-2000-05-31 Miguel de Icaza <miguel@helixcode.com>
-
- * contact-editor/contact-editor.glade: Added accelerators for
- the remaining items.
-
- Add spacing, beautify the dialogs.
-
-2000-06-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/addressbook.c (control_activate): Put the toolbar
- into a frame to make it look like standard GNOME toolbars. Also,
- set `GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL' so that it does not do
- evil things when its moved to the left or the right of the window.
-
-2000-05-30 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/e-cardlist-model.c,
- gui/component/e-cardlist-model.h: New files for card list.
-
-2000-05-30 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c: Fixed a memory leak.
-
-2000-05-30 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/alphabet.glade: Made the alphabet buttons not
- focusable.
-
- * gui/minicard/e-minicard-view.c: Made the "123" button work.
-
- * gui/minicard/e-reflow-sorted.c: Made all buttons past the last
- letter available work.
-
-2000-05-30 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/alphabet.glade: Added a bit of space around the
- alphabet bar.
-
-2000-05-30 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/Makefile.am: Added alphabet.glade and
- alphabet.glade.h.
-
- * gui/component/addressbook.c, gui/component/alphabet.glade,
- gui/component/alphabet.glade.h: Added an alphabet bar.
-
- * gui/minicard/e-minicard-view.c, gui/minicard/e-minicard-view.h,
- gui/minicard/e-reflow-sorted.c, gui/minicard/e-reflow-sorted.h:
- Added the ability to just to a particular spot in the reflow.
-
-2000-05-30 Christopher James Lahey <clahey@helixcode.com>
-
- * printing/Makefile.am: Added BONOBO_GNOME_CFLAGS to CPPFLAGS.
-
-2000-05-30 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/minicard/e-minicard-view.c: Made double clicking create a
- new card. Set the empty message.
-
- * gui/minicard/e-minicard.c: Made sorting be case insensitive.
-
- * gui/minicard/e-reflow-sorted.c, e-reflow.c, e-reflow.h: Added a
- message for when the reflow is empty.
-
- * printing/e-contact-print.c, printing/medbook.ecps: Made the
- default printout be full page. Made sorting case insensitive.
-
-2000-05-30 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-book-view-listener.c,
- backend/ebook/e-book-view-listener.h, backend/ebook/e-book-view.c,
- backend/ebook/e-book-view.h, backend/idl/addressbook.idl,
- backend/pas/pas-backend-file.c, backend/pas/pas-backend-ldap.c,
- backend/pas/pas-book-factory.c, backend/pas/pas-book-view.c,
- backend/pas/pas-book-view.h: Added "sequence_complete" signal.
-
- * printing/e-contact-print.c: Made printing wait for
- "sequence_complete" signal and made it sort.
-
-2000-05-25 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c,
- gui/component/e-addressbook-model.c,
- gui/component/e-addressbook-model.h: Added double click to open
- contact editor.
-
-2000-05-25 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c: Removed some columns.
-
-2000-05-25 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component/addressbook.c (addressbook_factory_new_control):
- New function.
- (addressbook_factory): Use it.
-
- * Makefile.am (evolution_addressbook_LDADD): Link with
- `evolution-shell-component.o' from the shell directory.
-
- * gui/component/addressbook-component.c: New.
- * gui/component/addressbook-component.h: New.
-
-2000-05-23 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Switched printing and gui.
-
- * backend/ebook/e-book-view-listener.h,
- backend/ebook/e-book-view.h, backend/ebook/e-book.h,
- backend/ebook/e-card-cursor.h, backend/ebook/e-card-list.h,
- backend/ebook/e-card-simple.h, backend/ebook/e-card.h: Fixed the
- #defines to work elsewhere in evolution.
-
- * gui/component/Makefile.am: Added linking to libecontactprint.
-
- * gui/component/addressbook.c: Added a menu item to print the
- current query.
-
- * printing/Makefile.am: Add linking to libebook and requirements.
- Add installation of ecps files.
-
- * printing/e-contact-print.c, printing/e-contact-print.h: Changed
- this to use real data from an EBook.
-
- * printing/test-print.c: Made this pass NULL, NULL to
- e_contact_print_dialog_new so that it will compile.
-
-2000-05-23 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-save-as.c: Fixed some memory leaks.
-
-2000-05-23 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/Makefile.am: Added e-contact-editor-save-as.c and
- e-contact-editor-save-as.h.
-
- * contact-editor/e-contact-save-as.c,
- contact-editor/e-contact-save-as.h: New files that display a save
- as dialog and then save the given card to that file.
-
- * gui/minicard/e-minicard.c: Call e_contact_save_as in a right
- click menu.
-
-2000-05-19 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor-categories.c,
- gui/component/e-addressbook-model.c: Added initialize_value and
- value_is_empty callbacks.
-
-2000-05-19 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.c: Fixed a bug that broke
- address field support.
-
-2000-05-19 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.c,
- contact-editor/e-contact-editor.h: Added support for arbitrary
- fields in the contact editor.
-
-2000-05-18 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card.c: Fixed e_card_name_copy and
- e_card_arbitrary_copy to deal correctly with a passed NULL.
-
- * contact-editor/Makefile.am: Removed imagesdir stuff.
-
- * contact-editor/arrow.png: Made this transparent.
-
- * contact-editor/contact-editor.glade,
- contact-editor/e-contact-editor-strings.h: Renamed some widgets
- and added custom widgets for all of the images.
-
- * contact-editor/e-contact-editor.c: Worked on making this work
- decently well with messed up glade files. Cleaned up a lot of code.
-
-2000-05-18 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card.c: Fixed the code to write out and read in
- arbitrary fields.
-
-2000-05-18 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h,
- backend/ebook/e-card-types.h, backend/ebook/e-card.c,
- backend/ebook/e-card.h: Implemented "MAILER" field. Added
- arbitrary field support.
-
- * contact-editor/e-contact-editor-categories.c: Fixed a warning.
-
-2000-05-16 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h:
- Added E_CARD_SIMPLE_FIELD_MAILER. Not implemented yet.
-
-2000-05-16 Chris Toshok <toshok@helixcode.com>
-
- * backend/pas/pas-backend-ldap.c (construct_email_list): convert to use ECardSimple.
- (poll_ldap): same.
-
-2000-05-16 Chris Toshok <toshok@helixcode.com>
-
- * backend/pas/pas-book.h: add typedefs for the can_write
- functions, and add parameters to pas_book_new.
-
- * backend/pas/pas-book.c (pas_book_construct): add can_write/can_write_card params.
- (pas_book_new): same.
- (impl_Evolution_Book_can_write): new function.
- (impl_Evolution_Book_can_write_card): same.
- (pas_book_get_epv): assign the can_write/can_write_card slots in the epv.
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_can_write): new function.
- (pas_backend_ldap_can_write_card): same.
- (pas_backend_ldap_add_client): add can_write/can_write_card to pas_book_new call.
-
- * backend/pas/pas-backend-file.c (pas_backend_file_can_write_card): new function, calls can_write.
- (pas_backend_file_can_write): same.
- (can_write): return TRUE if we can write to the addressbook file.
- (pas_backend_file_add_client): add can_write/can_write_card to pas_book_new call.
-
- * backend/idl/addressbook.idl (Evolution): add can_write and
- can_write_card permission requests.
-
-2000-05-16 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card.c (e_card_get_vcard): Fixed a large memory leak.
-
-2000-05-16 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card.c (add_list_unique): Fixed another memory
- leak.
-
-2000-05-16 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card-simple.c, backend/pas/pas-backend-file.c,
- contact-editor/e-contact-editor.c, ename/e-name-western.c,
- gui/component/addressbook.c, gui/minicard/e-minicard-view.c: Fixed
- some memory leaks.
-
- * backend/ebook/e-card.c: Rearranged some code.
-
-2000-05-16 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor-categories.c: Fixed a reference
- leak.
-
-2000-05-16 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor-categories.c: Fixed a compile
- error.
-
-2000-05-16 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor-categories.c: Got rid of a
- memory leak. Rearranged a couple functions.
-
- * gui/minicard/e-minicard-view.c, gui/minicard/e-minicard-view.h:
- Added some code to stop watching the EBook when the canvas is
- destroyed (apparently the canvas is destroyed before our widget is
- destroyed.)
-
-2000-05-14 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor-categories.c: Use the correct
- policy for resize.
-
-2000-05-14 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/Makefile.am: Added libeutil for e-card's support
- for categories.
-
- * backend/ebook/e-card-list.c, backend/ebook/e-card-list.h: Added
- a function to get the length.
-
- * backend/ebook/e-card.c, backend/ebook/e-card.h: Added categories
- support (accessible either as "categories" or "category_list".)
-
- * contact-editor/Makefile.am: Added e-table and all of the
- categories files.
-
- * contact-editor/categories.glade,
- contact-editor/categories-strings.h,
- contact-editor/e-contact-editor-categories.c,
- contact-editor/e-contact-editor-categories.h:
-
- * contact-editor/contact-editor.glade,
- contact-editor/e-contact-editor-strings.h: Rearranged this dialog.
-
- * contact-editor/e-contact-editor.c: Rearranged dialog a bit.
- Added opening of categories dialog.
-
- * gui/component/Makefile.am: Rearranged libraries so that
- libetable would be available for the contact editor categories
- dialog.
-
- * gui/component/addressbook.c: Fix for new ETable resizing. Make
- contact editor dialog resizable.
-
- * gui/minicard/Makefile.am: Added libetable contact editor
- categories dialog.
-
- * gui/minicard/e-minicard.c: Make contact editor dialog resizable.
-
-2000-05-12 Miguel de Icaza <miguel@gnu.org>
-
- * contact-editor/fulname.glade: Use accelerators here.
-
-2000-05-13 Valek Filippov <frob@df.ru>
-
- * gui/component/ldap-server-dialog.glade: save translatable strings
- * gui/component/ldap-server-dialog.glade.h: file with strings
- * printing/e-contact-print.glade: save translatable strings
- * printing/e-contact-print.glade.h: file with strings
-
-2000-05-11 Dan Winship <danw@helixcode.com>
-
- * gui/component/addressbook.c (control_activate): Now that we
- depend on recent gnome-libs we can make the toolbar detachable
- again.
-
-2000-05-10 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c: Make the table view be sorted by
- name initially.
-
-2000-05-10 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/pas/pas-book-factory.c: Send a proper response when you
- can't find the ldap URI.
-
- * gui/component/addressbook.c: Cleaned up the open error dialog a
- bit.
-
-2000-05-10 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c: Added a dialog for when you can't
- open an addressbook.
-
-2000-05-10 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/Makefile.am: Added e-book-types.h, e-card-pairs.h,
- e-card-types.h.
-
- * backend/pas/Makefile.am: Added pas-backend-ldap.h.
-
- * contact-editor/Makefile.am: Added a proper EXTRA_DIST section.
- Removed some old defines.
-
- * ename/Makefile.am: Added e-name-western-tables.h.
-
- * gui/component/Makefile.am: Added e-ldap-server-dialog.h. Added
- a proper EXTRA_DIST section.
-
- * gui/minicard/e-reflow.c: Added a missed cast.
-
- * printing/Makefile.am: Added a proper EXTRA_DIST section.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.c: Make sure that the canvas
- doesn't intercept keyboard focus.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.c: Use new art.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/contact-editor.glade,
- contact-editor/e-contact-editor-strings.h: Replaced the Address
- button with a label and rearranged the address area a bit.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/minicard/e-minicard.c: Reenable editting.
-
- * gui/minicard/e-reflow-sorted.c: Make reflow flow on deletion.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c: Destroy the view object when
- leaving the minicard view.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/minicard/e-reflow-sorted.c: Fixed reflow sorting to call
- reflow_request when sorting on an item changes.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card-simple.c: Make File As change if name or
- company are changed pretty much anywhere.
-
- * gui/minicard/e-minicard.c: Turned off having minicard editing
- effect anything since it's so crashy.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/pas/pas-backend-ldap.c: Enabled a couple more fields
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/pas/pas-backend-file.c: Added a default card to all new
- file backends.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/e-addressbook-model.c: Rearranged order of things
- getting destroyed.
-
- * gui/minicard/e-minicard-view.c: Rearranged order of things
- getting destroyed. Don't set attributes of non-null or destroyed
- items. Destroy parent object when destroyed. Maintain ref_count
- of items in list.
-
- * gui/minicard/e-minicard.c: Don't set attributes of non-null
- items.
-
- * gui/minicard/e-reflow-sorted.c: Maintain ref_count of items in
- list.
-
- * gui/minicard/e-reflow.c: Maintain ref_count of items in list.
- Destroy parent object when destroyed.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card-simple.c: Fixed some indentation.
-
- * contact-editor/contact-editor.glade,
- contact-editor/e-contact-editor-strings.h: Changed Email to
- Primary Email.
-
- * contact-editor/e-contact-editor.c: Added checkmarks to indicate
- if data exists in the pull down menus for the phone, address, and
- email fields.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card-simple.c: Fixed the string duplication
- problem. Fixed the business/home address string mix up.
-
- * gui/component/addressbook.c: Made the minicard view the default
- view.
-
-2000-05-08 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card-simple.c: Fixed this up a bit. Syncing
- should work better now.
-
-2000-05-08 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/minicard/e-minicard-view.c, gui/minicard/e-minicard.c,
- gui/minicard/e-minicard.h, gui/minicard/e-reflow-sorted.c,
- gui/minicard/e-reflow-sorted.h: Made a minimal number of things be
- destroyed and recreated when updating a field.
-
-2000-05-07 <toshok@the-dot-in.helixcode.com>
-
- * gui/minicard/e-minicard.c (remodel): make sure to free the
- return value of e_card_simple_get.
-
- * gui/component/addressbook.c (teardown_table_view): destroy the
- ECardSimple here, plug memory leak.
- (create_table_view): use view->simple so we can destroy the
- ECardSimple later on.
-
-2000-05-07 Chris Toshok <toshok@helixcode.com>
-
- * ename/e-name-western.c (e_name_western_extract_middle): comment
- function, and fix an ABR.
-
-2000-05-07 Chris Toshok <toshok@helixcode.com>
-
- * ename/e-name-western.c (e_name_western_cleanup_string): comment
- function, and fix an ABR.
-
-2000-05-08 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/minicard/e-minicard.c: Added saving in minicard view.
-
-2000-05-07 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/pas/pas-backend-file.c: Fixed an off by 2 error.
-
-2000-05-07 Chris Toshok <toshok@helixcode.com>
-
- * gui/component/addressbook.c (set_prop): don't create a new
- ebook. instead, unload the current uri (if there is one) and load
- the new one.
- (addressbook_factory): create the ebook once.
-
-2000-05-07 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/e-addressbook-model.c: Replaced some model_changed
- calls with row_inserted calls.
-
-2000-05-07 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/pas/pas-backend-file.c, backend/pas/pas-backend-ldap.c:
- Removed some code that was notifying too many clients at the wrong
- times.
-
- * gui/component/addressbook.c: Set view->book. Unreffed
- view->book. Unreffed the model instead of destroying it. Removed
- the /tmp/test.db stuff.
-
-2000-05-07 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c: Make the addressbook create the
- correct file uri. Added a default query. Initialize view->model
- and view->view to NULL.
-
- * gui/component/e-addressbook-model.c,
- gui/minicard/e-minicard-view.c: Only call get_book_view if both
- book and query and non-null.
-
-2000-05-06 Chris Toshok <toshok@helixcode.com>
-
- * gui/component/addressbook.c (control_deactivate): remove the
- separator and toggle view items as well.
- (toggle_view_as_cb): callback for the "/View/Toggle View" menu
- item.
- (get_query): getter for the query string that takes into account
- the two view types.
- (set_query): setter for the query string that takes into account
- the two view types.
- (set_book): setter for the EBook type - not really a setter, since
- the book is kept in the AddressbookView, but this method actually
- sets the "book" property on the current view.
- (find_contact_cb): make use of get/set_query
- (search_entry_activated): make use of set_query.
- (control_activate): add a menu separator and an item to toggle
- between view types.
- (book_open_cb): make use of set_book.
- (ebook_create): no longer needs to return the EBook, since we set
- the book field in our view.
- (teardown_minicard_view): destructor function for the minicard
- specific ui.
- (create_minicard_view): constructor function for the minicard
- specific ui.
- (teardown_table_view): destructor function for the e-table
- specific ui.
- (create_table_view): constructor function for the e-table specific
- ui.
- (change_view_type): destroy the old and create the new view ui,
- change the label of the Toggle View menu item, and reset the book
- and query on the new view type.
- (addressbook_factory): create an all-encompassing vbox that the
- view uses to create the bonobo control, which contains 1 widget
- per ui specific view (the e-table in the table case, and another
- vbox in the minicard case.) use change_view_type to create the
- initial view.
-
-2000-05-07 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-book.c: Made a NULL callback just mean to not
- call back.
-
- * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h:
- Reordered fields. Added a get_const function to get a constant
- string that persists until the simple is destroyed.
-
- * gui/component/Makefile.am: Added e-addressbook-model.c and
- e-addressbook-model.h and all of the libraries and includes that
- they are dependent on.
-
- * gui/component/addressbook-factory.c: Initialize e cursors.
-
- * gui/component/addressbook.c: Added inactive code to display an
- ETable view of the addressbook.
-
- * gui/component/e-addressbook-model.c,
- gui/component/e-addressbook-model.h: New files to implement an
- ETable model with a EBook back end.
-
-2000-05-06 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h:
- Mostly finished ECardSimple.
-
- * contact-editor/e-contact-editor.c: Changed this to match with
- some of the changes to ECardSimple.
-
- * gui/component/addressbook.c: Changed this to look for
- "addressbook.db" in the given directory if it doesn't find the
- file "uri".
-
- * gui/minicard/e-minicard.c, gui/minicard/e-minicard.h: Changed
- this to use ECardSimple.
-
-2000-05-06 Chris Toshok <toshok@helixcode.com>
-
- * gui/component/.cvsignore: ignore evolution-addressbook.pure
-
- * gui/component/Makefile.am: add support for generating
- evolution-addressbook.pure.
-
-2000-05-06 Chris Toshok <toshok@helixcode.com>
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_load_uri): if a
- port isn't specified in the uri default to 389.
-
-2000-05-06 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component/addressbook.c: Made this take a uri through its
- property bag.
-
-2000-05-05 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/Makefile.am: Added e-card-simple.c and
- e-card-simple.h.
-
- * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h:
- New card wrapper class to simplify things.
-
- * contact-editor/e-contact-editor.c,
- contact-editor/e-contact-editor.h: Changed e-contact-editor to use
- ECardSimple a bit.
-
-2000-05-03 Chris Toshok <toshok@helixcode.com>
-
- * gui/component/addressbook.c (control_deactivate): #ifdef
- HAVE_LDAP the ldap specific stuff.
- (null_cb): same.
- (control_activate): same.
-
-2000-05-02 Ettore Perazzoli <ettore@helixcode.com>
-
- * backend/ebook/Makefile.am (INCLUDES): Add
- `-I$(top_srcdir)/addressbook/ename'.
-
-2000-05-02 Matt Loper <matt@helixcode.com>
-
- * demo/Makefile.am: set G_LOG_DOMAIN.
- * printing/Makefile.am: same.
-
-2000-05-01 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/pas/pas-book-factory.c: Add back in the
- CORBA_Object_release.
-
- * backend/pas/pas-book.c: Properly duplicate and release the
- listener passed to us.
-
-2000-05-01 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/pas/pas-backend-file.c, backend/pas/pas-backend-ldap.c:
- Made uri slightly better managed.
-
- * backend/pas/pas-book-factory.c
- (pas_book_factory_process_request): Remove this
- CORBA_Object_release that causes things not to work. This is just
- a temporary fix until we figure out what's actually wrong.
-
- * backend/pas/pas-book.c: Fixed a copy and paste error in a warning.
-
-2000-05-01 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Switched the subdirs order since backend depends on
- ename.
-
-2000-05-01 Larry Ewing <lewing@helixcode.com>
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_remove_client):
- fix a typo in the for loop.
-
-2000-05-01 Michael Meeks <michael@helixcode.com>
-
- * backend/pas/pas-book-factory.c: include gtk.
-
-2000-04-30 Federico Mena Quintero <federico@helixcode.com>
-
- * backend/ebook/e-book-types.h (EBookStatus): Added new status
- values for the IDL stuff.
-
- * backend/pas/pas-book-factory.h (PASBookFactoryClass): New
- "last_book_gone" signal.
-
- * backend/pas/pas-book-factory.c
- (pas_book_factory_launch_backend): Better error handling.
- (pas_book_factory_process_queue): Let
- pas_book_factory_process_request() free the request.
- (pas_book_factory_process_request): Free the request here.
- Perform better error handling.
- (free_active_server_map_entry): Free an active server map entry;
- free the URI key and unref the backend value. This function was
- renamed; the old one was trying to CORBA_Object_unref() a GTK+
- object!
- (remove_backends_entry): Free a backend table entry; free the URI
- key.
- (backend_last_client_gone_cb): Remove the backend from the active
- server map and emit the "last_book_gone" signal if appropriate.
- (pas_book_factory_get_n_backends): New function to query the
- number of running backends in an addressbook factory.
-
- * backend/idl/addressbook.idl (BookListener::CallStatus): Added a
- ProtocolNotSupported code. This is for when the addressbook
- factory cannot find a provider for the requested URI.
-
- * backend/pas/pas-backend.h (PASBackendClass): New
- "last_client_gone" signal.
- (PASBackendClass): New get_uri virtual method.
-
- * backend/pas/pas-backend.c (pas_backend_load_uri): Return a
- gboolean success code.
- (pas_backend_add_client): Return a gboolean success code.
- (pas_backend_last_client_gone): New function used by backend
- implementations to notify upwards when the backend's last client
- is destroyed.
- (pas_backend_get_uri): New function to get the URI of a backend.
-
- * backend/pas/pas-backend-file.c (pas_backend_file_add_client):
- Pass the backend as the closure data to the "destroy" handler of
- the book. We cannot call pas_book_get_backend() in the callback
- since the book's private data has already been destroyed when the
- callback is invoked. Alternatively, we could move the private
- data destruction step to the book's ::finalize() method.
- (pas_backend_file_book_destroy_cb): Get the backend from the
- callback's data, not from the book.
- (pas_backend_file_remove_client): Remove the book from the list of
- clients. When all clients go away, call
- pas_backend_last_client_gone().
- (PASBackendFilePrivate): Added an uri field.
- (pas_backend_file_get_uri): Implement the get_uri method.
- (pas_backend_file_load_uri): Return a gboolean success code.
- Also, store the URI in the private structure.
- (pas_backend_file_add_client): Return a gboolean success code.
- Also, call pas_backend_last_client_gone() if appropriate.
- (pas_backend_file_destroy): Free the bf->priv->uri.
-
- * backend/pas/pas-backend-ldap.c (pas_backend_ldap_add_client):
- Pass the backend as the closure data to the "destroy" handler of
- the book. See above for rationale.
- (pas_backend_ldap_book_destroy_cb): Get the backend from the
- callback's data.
- (pas_backend_ldap_remove_client): Remove the book from the list of
- clients. When all clients go away, call
- pas_backend_last_client_gone().
- (pas_backend_ldap_load_uri): Return a gboolean success code.
- (pas_backend_ldap_add_client): Return a gboolean success code.
- Also, call pas_backend_last_client_gone() if appropriate.
- (PASBackendLDAPPrivate): New uri field.
- (pas_backend_ldap_get_uri): Implement the get_uri method.
- (pas_backend_ldap_load_uri): Store the uri in the private
- structure.
- (pas_backend_ldap_destroy): Free the bl->priv->uri.
-
-2000-04-30 Chris Toshok <toshok@helixcode.com>
-
- * gui/component/Makefile.am (evolution_addressbook_SOURCES): added
- e-ldap-server-dialog.c
- (glade_DATA): added ldap-server-dialog.glade
-
- * gui/component/ldap-server-dialog.glade: new file.
-
- * gui/component/e-ldap-server-dialog.h: new file.
-
- * gui/component/e-ldap-server-dialog.c: new file, contains logic
- associated with ldap server dialog.
-
- * gui/component/addressbook.c (control_deactivate): remove the
- directory server menu item.
- (null_cb): do nothing callback for e_book_load_uri call. should
- change to (at the very least) pop up a dialog if there was an
- error.
- (new_server_cb): new function - really just switches to a
- particular ldap server, since the information isn't saved
- anywhere.
- (control_activate): add directory server menu item.
-
-2000-04-30 Chris Toshok <toshok@helixcode.com>
-
- * backend/ebook/e-book.c (e_book_load_uri): create the book
- listener here, since it's destroyed in unload_uri.
- (e_book_construct): remove the book listener construction here.
-
-2000-04-30 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/.cvsignore: Added load-pine-addressbook.
-
-2000-04-30 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/contact-editor.glade,
- contact-editor/e-contact-editor.c, gui/minicard/e-minicard.c: Made
- some fields invisible that were visible before.
-
-2000-04-30 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card.c: Make file as not have the : after it if
- it's empty. If there's no name, or file_as, fill in these fields
- with defaults based on full_name or name respectively.
-
- * backend/ebook/load-pine-addressbook.c: New file to do import of
- pine .addressbook files.
-
- * backend/pas/pas-backend-file.c: Made empty fields act as the
- empty string for searches.
-
- * contact-editor/e-contact-editor.c,
- contact-editor/e-contact-editor.h: Made the File As field update
- properly as you edit the name and company fields. Added the pull
- down list of File As choices. Made sure that all fields will
- be set to NULL if they are deleted to the empty string.
-
- * gui/minicard/e-minicard.c: Use the File As field instead of the
- Full Name field for the header. Make identical compares on the
- File As field do a compare on the uid.
-
-2000-04-30 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor-fullname.c,
- contact-editor/fullname.glade: Fixed a string mismatch.
-
-2000-04-30 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/Makefile.am: Added ename includes and libs.
-
- * backend/ebook/e-card.c, backend/ebook/e-card.h: Added
- e_card_name_from_string. Added header for
- e_card_delivery_address_from_string, even though it's not
- implemented yet.
-
- * contact-editor/Makefile.am: Removed the ename includes since we
- no longer use ename directly here.
-
- * contact-editor/e-contact-editor.c: Fixed this to properly save
- the address labels displayed. Updated this to use the function
- e_card_name_from_string instead of doing it by hand.
-
- * contact-editor/fullname-strings.h,
- contact-editor/fullname.glade: Deleted an unused field. Changed
- the set of prefixes and suffixes.
-
-2000-04-30 Chris Toshok <toshok@helixcode.com>
-
- * backend/pas/pas-backend-ldap.c
- (pas_backend_ldap_ensure_connected): add support for a rootdn in
- the uri.
- (pas_backend_ldap_build_all_cards_list): make use of the rootdn in
- the call to ldap_search_s.
- (pas_backend_ldap_search): same.
- (pas_backend_ldap_load_uri): get the rootdn out of the passed in uri.
-
-2000-04-29 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card.c, backend/ebook/e-card.h: Added
- e_card_phone_new e_card_delivery_address_new,
- e_card_delivery_address_to_string, e_card_name_copy,
- e_card_name_new, e_card_name_to_string, and made e_card_name_free
- public. Removed some unused code.
-
- * backend/pas/pas-backend-file.c: Fixed a warning.
-
- * contact-editor/Makefile.am: Added e-contact-editor-fullname.[ch]
- and fullname.glade. Added e-name libs and includes.
-
- * contact-editor/e-contact-editor-fullname.c,
- contact-editor/e-contact-editor-fullname.h,
- contact-editor/fullname-strings.h, contact-editor/fullname.glade:
- New dialog for editing the fields of a name separately.
-
- * contact-editor/e-contact-editor.c,
- contact-editor/e-contact-editor.h: Create an
- EContactEditorFullname when you click on the Full Name button.
- Maintain a parsed name at all times.
-
- * gui/component/Makefile.am, gui/minicard/Makefile.am: Added
- e-name libs.
-
-2000-04-28 Larry Ewing <lewing@helixcode.com>
-
- * backend/pas/pas-book-factory.c (register_factory): fix the
- `USING_OAF' changes so that they work for when we are not using
- oaf.
-
-2000-04-27 Ettore Perazzoli <ettore@helixcode.com>
-
- * ename/Makefile.am
- (gnome_libs): Use `BONOBO_GNOME_LIBS'.
- (INCLUDES): Add `-I$(srcdir)/..'.
-
- * backend/pas/pas-book-factory.c
- (register_factory): New function to register the factory.
- Implementation different according to `USING_OAF'.
- (pas_book_factory_activate): Use `register_factory()'.
-
- * gui/component/addressbook.c: New #define `CONTROL_FACTORY_ID',
- varying depending on whether we are `USING_OAF'.
- (addressbook_factory_init): Use `CONTROL_FACTORY_ID'.
-
- * backend/ebook/test-client.c (init_corba): New function,
- implemented differently according to the `USING_OAF' #define.
-
- * backend/ebook/e-book.c: New #define `CARDSERVER_OAF_ID'.
- (e_book_construct): Work with OAF #if `USING_OAF'.
-
- * backend/ebook/Makefile.am (gnome_libs): Removed.
- (corbadir): Removed.
- (ebook_libs): Removed.
- (test_client_LDADD): Just add `libebook.la'.
- (test_card_LDADD): Likewise.
- (test_client_list_LDADD): Likewise.
-
- * gui/component/addressbook-factory.c
- (init_corba): New helper function, implemented differently
- according to `USING_OAF'.
- (main): Call `init_corba()'.
-
-2000-04-27 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card.c, backend/ebook/e-card.h: Added file as,
- office, manager, assistant, spouse, and anniversary fields. These
- all use "X-EVOLUTION-" fields in the VCards.
-
- * backend/pas/pas-backend-file.c: Added all the new fields (except
- anniversary) to the list of fields.
-
- * contact-editor/contact-editor.glade,
- contact-editor/e-contact-editor-strings.h: Fixed some misnamed
- fields and fixed the placement of the comments field.
-
- * contact-editor/e-contact-editor.c: Made the newly added fields
- display properly.
-
- * Makefile.am: Added ename.
-
- * ename/e-name-western.h, ename/test-ename-western-gtk.c,
- ename/test-ename-western.c: Fixed up some #includes.
-
- * ename/.cvsignore: Added .cvsignore.
-
-2000-04-26 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card-types.h, backend/ebook/e-card.c,
- backend/ebook/e-card.h: Added an address label field.
-
- * contact-editor/contact-editor.glade,
- contact-editor/e-contact-editor-strings.h: Got rid of some unused
- fields.
-
- * contact-editor/e-contact-editor.c,
- contact-editor/e-contact-editor.h: Added the address label field.
- Load only. Editing these fields seems to mess things up.
-
-2000-04-26 Christopher James Lahey <clahey@helixcode.com>
-
- * contact-editor/e-contact-editor.c: Added proper handling of the
- email field.
-
-2000-04-26 Christopher James Lahey <clahey@helixcode.com>
-
- * backend/ebook/e-card-types.h, backend/ebook/e-card.c,
- gui/minicard/e-minicard.c: Prefixed the ADDR_ flags.
-
- * contact-editor/contact-editor.glade,
- contact-editor/e-contact-editor-strings.h: Edited the glade file.
- Removed all the fields that we don't use.
-
- * contact-editor/e-contact-editor.c,
- contact-editor/e-contact-editor.h: Made the phone fields work
- properly. The address and email fields are temporarily turned off
- until they can be made to work as the phone fields do.
-
-2000-04-25 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/minicard/Makefile.am (INCLUDES): Use
- `$(BONOBO_GNOME_CFLAGS)'.
-
- * backend/pas/Makefile.am (idl_flags): Add `-I $(datadir)/idl' to
- pick up IDL files in the installation prefix as well.
- (INCLUDES): Use `$(BONOBO_GNOME_CFLAGS)'.
-
- * backend/ebook/Makefile.am (ORBIT_IDL): Use `-I $(datadir)/idl'
- to get the IDLs from the installation prefix as well.
- (INCLUDES): Add `$(BONOBO_GNOME_CFLAGS)'.
- (test_client_LDADD): Use `$(BONOBO_GNOME_LIBS)' instead of
- hardcoding `-lbonobo'! Also get rid of some other useless flags,
- as `$(BONOBO_GNOME_LIBS)' really has all what we need.
- (test_client_list_LDADD): Likewise.
- (test_card_LDADD): Likewise.
-
-2000-04-18 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/minicard/Makefile.am (INCLUDES): Use "e-minicard" as the log
- domain.
-
- * gui/component/Makefile.am (INCLUDES): Use
- "evolution-addressbook" as the log domain.
-
- * backend/pas/Makefile.am: Build libpas.a, not a shared library.
- Do not install any header files.
- (INCLUDES): Remove spurious include paths.
-
- * backend/pas/*.[ch]: Fix includes.
-
- * backend/ebook/Makefile.am: Do not install the test programs.
- Fixed some include weirdness.
-
- * backend/ebook/*.[ch]: Fix includes.
-
- * contact-editor/Makefile.am (INCLUDES): Set the log domain to
- "contact-editor".
- (INCLUDES): Fix.
-
- * contact-editor/*.[ch]: Fix includes.
-
- * gui/minicard/*.[ch]: Fix includes.
-
- * ChangeLog: Started a ChangeLog here.
diff --git a/addressbook/Makefile.am b/addressbook/Makefile.am
deleted file mode 100644
index 4fde08a4a9..0000000000
--- a/addressbook/Makefile.am
+++ /dev/null
@@ -1,23 +0,0 @@
-if ENABLE_PILOT_CONDUITS
-CONDUIT_SUBDIR=conduit
-endif
-
-SUBDIRS = \
- util printing gui importers tools $(CONDUIT_SUBDIR)
-
-error_DATA = addressbook-errors.xml
-error_i18n = $(error_DATA:.xml=.xml.h)
-errordir = $(privdatadir)/errors
-%.xml.h: %.xml
- $(top_builddir)/e-util/e-error-tool $^
-
-EXTRA_DIST = \
- ChangeLog.pre-1-4 \
- $(error_DATA)
-
-dist-hook:
- cd $(distdir); rm -f $(BUILT_SOURCES)
-
-BUILT_SOURCES = $(error_i18n)
-
-CLEANFILES = $(BUILT_SOURCES)
diff --git a/addressbook/addressbook-errors.xml b/addressbook/addressbook-errors.xml
deleted file mode 100644
index 6aa5abb017..0000000000
--- a/addressbook/addressbook-errors.xml
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<error-list domain="addressbook">
-
- <error id="ldap-init" type="error" modal="true">
- <primary>This addressbook could not be opened.</primary>
- <secondary>This addressbook server might be unreachable or the server name may be misspelled or your network connection could be down.</secondary>
- </error>
-
- <error id="ldap-auth" type="error" modal="true">
- <primary>Failed to authenticate with LDAP server.</primary>
- <secondary>Check to make sure your password is spelled correctly and that you are using a supported login method. Remember that many passwords are case sensitive; your caps lock might be on.</secondary>
- </error>
-
- <error id="ldap-search-base" type="error" modal="true">
- <primary>This addressbook server does not have any suggested search bases.</primary>
- <secondary>This LDAP server may use an older version of LDAP, which does not support this functionality or it may be misconfigured. Ask your administrator for supported search bases.</secondary>
- </error>
-
- <error id="ldap-v3-schema" type="error" modal="true">
- <primary>This server does not support LDAPv3 schema information.</primary>
- </error>
-
- <error id="ldap-get-schema" type="error" modal="true">
- <primary>Could not get schema information for LDAP server.</primary>
- </error>
-
- <error id="ldap-invalid-schema" type="error" modal="true">
- <primary>LDAP server did not respond with valid schema information.</primary>
- </error>
-
- <error id="remove-addressbook" type="error" modal="true">
- <primary>Could not remove addressbook.</primary>
- </error>
-
- <error id="ask-delete-addressbook" type="question" modal="true" default="GTK_RESPONSE_CANCEL">
- <primary>Delete address book '{0}'?</primary>
- <secondary>This address book will be removed permanently.</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/>
- <button stock="gtk-delete" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="edit-categories" type="error">
- <primary>Category editor not available.</primary>
- </error>
-
- <error id="generic-error" type="error">
- <primary>{0}</primary>
- <secondary>{1}</secondary>
- </error>
-
- <error id="load-error" type="error">
- <title>Unable to open addressbook</title>
- <primary>Error loading addressbook.</primary>
- <secondary>{0}</secondary>
- </error>
-
- <error id="search-error" type="error">
- <primary>Unable to perform search.</primary>
- <secondary>{0}</secondary>
- </error>
-
- <error id="prompt-save" type="question" default="GTK_RESPONSE_YES">
- <primary>Would you like to save your changes?</primary>
- <secondary>You have made modifications to this contact. Do you want to save these changes?</secondary>
- <button label="_Discard" response="GTK_RESPONSE_NO"/>
- <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/>
- <button stock="gtk-save" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-move" type="question" default="GTK_RESPONSE_NO">
- <primary>Cannot move contact.</primary>
- <secondary>You are attempting to move a contact from one addressbook to another but it cannot be removed from the source. Do you want to save a copy instead?</secondary>
- <button stock="gtk-no" response="GTK_RESPONSE_NO"/>
- <button stock="gtk-yes" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="save-error" type="error">
- <primary>Unable to save contact(s).</primary>
- <secondary>Error saving contacts to {0}: {1}</secondary>
- </error>
-
- <error id="backend-died" type="error">
- <primary>The Evolution addressbook has quit unexpectedly.</primary>
- <secondary>Your contacts for {0} will not be available until Evolution is restarted.</secondary>
- </error>
-
- <error id="ask-list-add-exists" type="question" default="GTK_RESPONSE_NO">
- <primary>Address '{0}' already exists.</primary>
- <secondary>A contact already exists with this address. Would you like to add a new card with the same address anyway?</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/>
- <button stock="gtk-ok" label="_Add" response="GTK_RESPONSE_YES"/>
- </error>
-</error-list>
diff --git a/addressbook/addressbook-errors.xml.h b/addressbook/addressbook-errors.xml.h
deleted file mode 100644
index b3d6896910..0000000000
--- a/addressbook/addressbook-errors.xml.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* addressbook:ldap-init primary */
-char *s = N_("This addressbook could not be opened.");
-/* addressbook:ldap-init secondary */
-char *s = N_("This addressbook server might be unreachable or the server name may be misspelled or your network connection could be down.");
-/* addressbook:ldap-auth primary */
-char *s = N_("Failed to authenticate with LDAP server.");
-/* addressbook:ldap-auth secondary */
-char *s = N_("Check to make sure your password is spelled correctly and that you are using a supported login method. Remember that many passwords are case sensitive; your caps lock might be on.");
-/* addressbook:ldap-search-base primary */
-char *s = N_("This addressbook server does not have any suggested search bases.");
-/* addressbook:ldap-search-base secondary */
-char *s = N_("This LDAP server may use an older version of LDAP, which does not support this functionality or it may be misconfigured. Ask your administrator for supported search bases.");
-/* addressbook:ldap-v3-schema primary */
-char *s = N_("This server does not support LDAPv3 schema information.");
-/* addressbook:ldap-get-schema primary */
-char *s = N_("Could not get schema information for LDAP server.");
-/* addressbook:ldap-invalid-schema primary */
-char *s = N_("LDAP server did not respond with valid schema information.");
-/* addressbook:remove-addressbook primary */
-char *s = N_("Could not remove addressbook.");
-/* addressbook:ask-delete-addressbook primary */
-char *s = N_("Delete address book '{0}'?");
-/* addressbook:ask-delete-addressbook secondary */
-char *s = N_("This address book will be removed permanently.");
-/* addressbook:edit-categories primary */
-char *s = N_("Category editor not available.");
-/* addressbook:generic-error primary */
-char *s = N_("{0}");
-/* addressbook:generic-error secondary */
-char *s = N_("{1}");
-/* addressbook:load-error title */
-char *s = N_("Unable to open addressbook");
-/* addressbook:load-error primary */
-char *s = N_("Error loading addressbook.");
-/* addressbook:load-error secondary */
-char *s = N_("{0}");
-/* addressbook:search-error primary */
-char *s = N_("Unable to perform search.");
-/* addressbook:search-error secondary */
-char *s = N_("{0}");
-/* addressbook:prompt-save primary */
-char *s = N_("Would you like to save your changes?");
-/* addressbook:prompt-save secondary */
-char *s = N_("You have made modifications to this contact. Do you want to save these changes?");
-char *s = N_("_Discard");
-/* addressbook:prompt-move primary */
-char *s = N_("Cannot move contact.");
-/* addressbook:prompt-move secondary */
-char *s = N_("You are attempting to move a contact from one addressbook to another but it cannot be removed from the source. Do you want to save a copy instead?");
-/* addressbook:save-error primary */
-char *s = N_("Unable to save contact(s).");
-/* addressbook:save-error secondary */
-char *s = N_("Error saving contacts to {0}: {1}");
-/* addressbook:backend-died primary */
-char *s = N_("The Evolution addressbook has quit unexpectedly.");
-/* addressbook:backend-died secondary */
-char *s = N_("Your contacts for {0} will not be available until Evolution is restarted.");
-/* addressbook:ask-list-add-exists primary */
-char *s = N_("Address '{0}' already exists.");
-/* addressbook:ask-list-add-exists secondary */
-char *s = N_("A contact already exists with this address. Would you like to add a new card with the same address anyway?");
-char *s = N_("_Add");
diff --git a/addressbook/conduit/.cvsignore b/addressbook/conduit/.cvsignore
deleted file mode 100644
index 594beaac72..0000000000
--- a/addressbook/conduit/.cvsignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.deps
-.libs
-*.lo
-Makefile.in
-Makefile
-libeaddress_conduit.la
-e-address-conduit-control-applet
-e-address-conduit-control-applet.desktop
-e-address*.conduit
diff --git a/addressbook/conduit/Makefile.am b/addressbook/conduit/Makefile.am
deleted file mode 100644
index f93b9bce1b..0000000000
--- a/addressbook/conduit/Makefile.am
+++ /dev/null
@@ -1,41 +0,0 @@
-INCLUDES = \
- -I$(top_srcdir) \
- -I$(top_srcdir)/addressbook \
- -I$(top_srcdir)/addressbook/backend \
- -I$(top_builddir)/addressbook/backend \
- -I$(top_srcdir)/e-util \
- -I$(top_builddir)/e-util \
- -I$(top_srcdir)/widgets/misc \
- -I$(top_builddir)/widgets/misc \
- $(EVOLUTION_ADDRESSBOOK_CONDUIT_CFLAGS)
-
-# Address Conduit
-privconduit_LTLIBRARIES = libeaddress_conduit.la
-
-libeaddress_conduit_la_SOURCES = \
- address-conduit.c
-
-libeaddress_conduit_la_LDFLAGS = -module -avoid-version
-libeaddress_conduit_la_LIBADD = \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/e-util/libeconduit.la \
- $(top_builddir)/widgets/misc/libemiscwidgets.la \
- $(EVOLUTION_ADDRESSBOOK_CONDUIT_LIBS)
-
-e-address-$(BASE_VERSION).conduit: e-address.conduit.in
- sed -e 's^\@privconduitdir\@^$(privconduitdir)^g' \
- -e 's^\@datadir\@^$(datadir)^g' \
- -e 's^\@BASE_VERSION\@^$(BASE_VERSION)^g' \
- $< > $@
-
-conduitdir = $(datadir)/gnome-pilot/conduits/
-conduit_DATA = e-address-$(BASE_VERSION).conduit
-
-BUILT_SOURCES = $(conduit_DATA)
-CLEANFILES = $(BUILT_SOURCES)
-
-EXTRA_DIST = \
- e-address.conduit.in
-
-dist-hook:
- cd $(distdir); rm -f $(BUILT_SOURCES)
diff --git a/addressbook/conduit/address-conduit.c b/addressbook/conduit/address-conduit.c
deleted file mode 100644
index 15573c190b..0000000000
--- a/addressbook/conduit/address-conduit.c
+++ /dev/null
@@ -1,1766 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution addressbook - Address Conduit
- *
- * Copyright (C) 1998 Free Software Foundation
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: Eskil Heyn Olsen <deity@eskil.dk>
- * JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#define G_LOG_DOMAIN "eaddrconduit"
-
-#include <bonobo.h>
-#include <libxml/parser.h>
-#include <pi-source.h>
-#include <pi-socket.h>
-#include <pi-dlp.h>
-#include <pi-address.h>
-#include <libebook/e-book.h>
-#include <gpilotd/gnome-pilot-conduit.h>
-#include <gpilotd/gnome-pilot-conduit-sync-abs.h>
-#include <libgpilotdCM/gnome-pilot-conduit-management.h>
-#include <libgpilotdCM/gnome-pilot-conduit-config.h>
-#include <e-dialog-widgets.h>
-#include <e-pilot-map.h>
-#include <e-pilot-settings.h>
-#include <e-pilot-util.h>
-
-GnomePilotConduit * conduit_get_gpilot_conduit (guint32);
-void conduit_destroy_gpilot_conduit (GnomePilotConduit*);
-
-#define CONDUIT_VERSION "0.1.2"
-
-#define DEBUG_CONDUIT 1
-/* #undef DEBUG_CONDUIT */
-
-#ifdef DEBUG_CONDUIT
-#define LOG(x) x
-#else
-#define LOG(x)
-#endif
-
-#define WARN g_warning
-#define INFO g_message
-
-enum {
- LABEL_WORK,
- LABEL_HOME,
- LABEL_FAX,
- LABEL_OTHER,
- LABEL_EMAIL,
- LABEL_MAIN,
- LABEL_PAGER,
- LABEL_MOBILE
-};
-
-static EContactField priority [] = {
- E_CONTACT_PHONE_BUSINESS,
- E_CONTACT_PHONE_HOME,
- E_CONTACT_PHONE_BUSINESS_FAX,
- E_CONTACT_EMAIL_1,
- E_CONTACT_PHONE_PAGER,
- E_CONTACT_PHONE_MOBILE,
- E_CONTACT_PHONE_BUSINESS_2,
- E_CONTACT_PHONE_HOME_2,
- E_CONTACT_PHONE_HOME_FAX,
- E_CONTACT_EMAIL_2,
- E_CONTACT_PHONE_OTHER,
- E_CONTACT_PHONE_PRIMARY,
- E_CONTACT_PHONE_OTHER_FAX,
- E_CONTACT_EMAIL_3,
- E_CONTACT_FIELD_LAST
-};
-
-static int priority_label [] = {
- LABEL_WORK,
- LABEL_HOME,
- LABEL_FAX,
- LABEL_EMAIL,
- LABEL_PAGER,
- LABEL_MOBILE,
- LABEL_WORK,
- LABEL_HOME,
- LABEL_FAX,
- LABEL_EMAIL,
- LABEL_OTHER,
- LABEL_MAIN,
- LABEL_FAX,
- LABEL_EMAIL,
- -1
-};
-
-typedef struct _EAddrLocalRecord EAddrLocalRecord;
-typedef struct _EAddrConduitCfg EAddrConduitCfg;
-typedef struct _EAddrConduitGui EAddrConduitGui;
-typedef struct _EAddrConduitContext EAddrConduitContext;
-
-/* Local Record */
-struct _EAddrLocalRecord {
- /* The stuff from gnome-pilot-conduit-standard-abs.h
- Must be first in the structure, or instances of this
- structure cannot be used by gnome-pilot-conduit-standard-abs.
- */
- GnomePilotDesktopRecord local;
-
- /* The corresponding ECard object */
- EContact *contact;
-
- /* pilot-link address structure, used for implementing Transmit. */
- struct Address *addr;
-};
-
-
-static void
-addrconduit_destroy_record (EAddrLocalRecord *local)
-{
- g_object_unref (local->contact);
- free_Address (local->addr);
- g_free (local->addr);
- g_free (local);
-}
-
-/* Configuration */
-struct _EAddrConduitCfg {
- guint32 pilot_id;
- GnomePilotConduitSyncType sync_type;
-
- ESourceList *source_list;
- ESource *source;
- gboolean secret;
- EContactField default_address;
-
- gchar *last_uri;
-};
-
-static EAddrConduitCfg *
-addrconduit_load_configuration (guint32 pilot_id)
-{
- EAddrConduitCfg *c;
- GnomePilotConduitManagement *management;
- GnomePilotConduitConfig *config;
- gchar *address, prefix[256];
- g_snprintf (prefix, 255, "/gnome-pilot.d/e-address-conduit/Pilot_%u/",
- pilot_id);
-
- c = g_new0 (EAddrConduitCfg,1);
- g_assert (c != NULL);
-
- c->pilot_id = pilot_id;
- management = gnome_pilot_conduit_management_new ("e_address_conduit", GNOME_PILOT_CONDUIT_MGMT_ID);
- gtk_object_ref (GTK_OBJECT (management));
- gtk_object_sink (GTK_OBJECT (management));
- config = gnome_pilot_conduit_config_new (management, pilot_id);
- gtk_object_ref (GTK_OBJECT (config));
- gtk_object_sink (GTK_OBJECT (config));
- if (!gnome_pilot_conduit_config_is_enabled (config, &c->sync_type))
- c->sync_type = GnomePilotConduitSyncTypeNotSet;
- gtk_object_unref (GTK_OBJECT (config));
- gtk_object_unref (GTK_OBJECT (management));
-
- /* Custom settings */
- gnome_config_push_prefix (prefix);
-
- if (!e_book_get_addressbooks (&c->source_list, NULL))
- c->source_list = NULL;
- if (c->source_list) {
- c->source = e_pilot_get_sync_source (c->source_list);
- if (!c->source)
- c->source = e_source_list_peek_source_any (c->source_list);
- if (c->source) {
- g_object_ref (c->source);
- } else {
- g_object_unref (c->source_list);
- c->source_list = NULL;
- }
- }
-
- c->secret = gnome_config_get_bool ("secret=FALSE");
- address = gnome_config_get_string ("default_address=business");
- if (!strcmp (address, "business"))
- c->default_address = E_CONTACT_ADDRESS_WORK;
- else if (!strcmp (address, "home"))
- c->default_address = E_CONTACT_ADDRESS_HOME;
- else if (!strcmp (address, "other"))
- c->default_address = E_CONTACT_ADDRESS_OTHER;
- g_free (address);
- c->last_uri = gnome_config_get_string ("last_uri");
-
- gnome_config_pop_prefix ();
-
- return c;
-}
-
-static void
-addrconduit_save_configuration (EAddrConduitCfg *c)
-{
- gchar prefix[256];
-
- g_snprintf (prefix, 255, "/gnome-pilot.d/e-address-conduit/Pilot_%u/",
- c->pilot_id);
-
- gnome_config_push_prefix (prefix);
- e_pilot_set_sync_source (c->source_list, c->source);
- gnome_config_set_bool ("secret", c->secret);
- switch (c->default_address) {
- case E_CONTACT_ADDRESS_WORK:
- gnome_config_set_string ("default_address", "business");
- break;
- case E_CONTACT_ADDRESS_HOME:
- gnome_config_set_string ("default_address", "home");
- break;
- case E_CONTACT_ADDRESS_OTHER:
- gnome_config_set_string ("default_address", "other");
- break;
- default:
- g_warning ("Unknown default_address value");
- }
- gnome_config_set_string ("last_uri", c->last_uri);
- gnome_config_pop_prefix ();
-
- gnome_config_sync ();
- gnome_config_drop_all ();
-}
-
-static EAddrConduitCfg*
-addrconduit_dupe_configuration (EAddrConduitCfg *c)
-{
- EAddrConduitCfg *retval;
-
- g_return_val_if_fail (c != NULL, NULL);
-
- retval = g_new0 (EAddrConduitCfg, 1);
- retval->sync_type = c->sync_type;
- retval->pilot_id = c->pilot_id;
-
- if (c->source_list)
- retval->source_list = g_object_ref (c->source_list);
- if (c->source)
- retval->source = g_object_ref (c->source);
- retval->secret = c->secret;
- retval->default_address = c->default_address;
- retval->last_uri = g_strdup (c->last_uri);
-
- return retval;
-}
-
-static void
-addrconduit_destroy_configuration (EAddrConduitCfg *c)
-{
- g_return_if_fail (c != NULL);
-
- g_object_unref (c->source_list);
- g_object_unref (c->source);
- g_free (c->last_uri);
- g_free (c);
-}
-
-/* Gui */
-struct _EAddrConduitGui {
- GtkWidget *default_address;
-};
-
-static EAddrConduitGui *
-e_addr_gui_new (EPilotSettings *ps)
-{
- EAddrConduitGui *gui;
- GtkWidget *lbl, *menu;
- gint rows, i;
- static const char *items[] = {"Business", "Home", "Other", NULL};
-
- g_return_val_if_fail (ps != NULL, NULL);
- g_return_val_if_fail (E_IS_PILOT_SETTINGS (ps), NULL);
-
- gtk_table_resize (GTK_TABLE (ps), E_PILOT_SETTINGS_TABLE_ROWS + 1,
- E_PILOT_SETTINGS_TABLE_COLS);
-
- gui = g_new0 (EAddrConduitGui, 1);
-
- rows = E_PILOT_SETTINGS_TABLE_ROWS;
- lbl = gtk_label_new (_("Default Sync Address:"));
- gtk_misc_set_alignment (GTK_MISC (lbl), 0.0, 0.5);
- gui->default_address = gtk_option_menu_new ();
- menu = gtk_menu_new ();
- for (i = 0; items[i] != NULL; i++) {
- GtkWidget *item;
-
- item = gtk_menu_item_new_with_label (items[i]);
- gtk_widget_show (item);
-
- gtk_menu_append (GTK_MENU (menu), item);
- }
- gtk_widget_show (menu);
- gtk_option_menu_set_menu (GTK_OPTION_MENU (gui->default_address), menu);
- gtk_table_attach_defaults (GTK_TABLE (ps), lbl, 0, 1, rows, rows + 1);
- gtk_table_attach_defaults (GTK_TABLE (ps), gui->default_address, 1, 2, rows, rows + 1);
- gtk_widget_show (lbl);
- gtk_widget_show (gui->default_address);
-
- return gui;
-}
-
-static const int default_address_map[] = {
- E_CONTACT_ADDRESS_WORK,
- E_CONTACT_ADDRESS_HOME,
- E_CONTACT_ADDRESS_OTHER,
- -1
-};
-
-static void
-e_addr_gui_fill_widgets (EAddrConduitGui *gui, EAddrConduitCfg *cfg)
-{
- g_return_if_fail (gui != NULL);
- g_return_if_fail (cfg != NULL);
-
- e_dialog_option_menu_set (gui->default_address,
- cfg->default_address,
- default_address_map);
-}
-
-static void
-e_addr_gui_fill_config (EAddrConduitGui *gui, EAddrConduitCfg *cfg)
-{
- g_return_if_fail (gui != NULL);
- g_return_if_fail (cfg != NULL);
-
- cfg->default_address = e_dialog_option_menu_get (gui->default_address,
- default_address_map);
-}
-
-static void
-e_addr_gui_destroy (EAddrConduitGui *gui)
-{
- g_free (gui);
-}
-
-/* Context */
-struct _EAddrConduitContext {
- GnomePilotDBInfo *dbi;
-
- EAddrConduitCfg *cfg;
- EAddrConduitCfg *new_cfg;
- EAddrConduitGui *gui;
- GtkWidget *ps;
-
- struct AddressAppInfo ai;
-
- EBook *ebook;
- GList *cards;
- GList *changed;
- GHashTable *changed_hash;
- GList *locals;
-
- EPilotMap *map;
-};
-
-static EAddrConduitContext *
-e_addr_context_new (guint32 pilot_id)
-{
- EAddrConduitContext *ctxt = g_new0 (EAddrConduitContext, 1);
-
- ctxt->cfg = addrconduit_load_configuration (pilot_id);
- ctxt->new_cfg = addrconduit_dupe_configuration (ctxt->cfg);
- ctxt->gui = NULL;
- ctxt->ps = NULL;
- ctxt->ebook = NULL;
- ctxt->cards = NULL;
- ctxt->changed_hash = NULL;
- ctxt->changed = NULL;
- ctxt->locals = NULL;
- ctxt->map = NULL;
-
- return ctxt;
-}
-
-static void
-e_addr_context_destroy (EAddrConduitContext *ctxt)
-{
- GList *l;
-
- g_return_if_fail (ctxt != NULL);
-
- if (ctxt->cfg != NULL)
- addrconduit_destroy_configuration (ctxt->cfg);
- if (ctxt->new_cfg != NULL)
- addrconduit_destroy_configuration (ctxt->new_cfg);
- if (ctxt->gui != NULL)
- e_addr_gui_destroy (ctxt->gui);
-
- if (ctxt->ebook != NULL)
- g_object_unref (ctxt->ebook);
-
- if (ctxt->cards != NULL) {
- for (l = ctxt->cards; l != NULL; l = l->next)
- g_object_unref (l->data);
- g_list_free (ctxt->cards);
- }
-
- if (ctxt->changed_hash != NULL)
- g_hash_table_destroy (ctxt->changed_hash);
-
- if (ctxt->changed != NULL)
- e_book_free_change_list (ctxt->changed);
-
- if (ctxt->locals != NULL) {
- for (l = ctxt->locals; l != NULL; l = l->next)
- addrconduit_destroy_record (l->data);
- g_list_free (ctxt->locals);
- }
-
- if (ctxt->map != NULL)
- e_pilot_map_destroy (ctxt->map);
-
- g_free (ctxt);
-}
-
-/* Debug routines */
-static char *
-print_local (EAddrLocalRecord *local)
-{
- static char buff[ 4096 ];
-
- if (local == NULL) {
- sprintf (buff, "[NULL]");
- return buff;
- }
-
- if (local->addr) {
- g_snprintf (buff, 4096, "['%s' '%s' '%s']",
- local->addr->entry[entryLastname] ?
- local->addr->entry[entryLastname] : "",
- local->addr->entry[entryFirstname] ?
- local->addr->entry[entryFirstname] : "",
- local->addr->entry[entryCompany] ?
- local->addr->entry[entryCompany] : "");
- return buff;
- }
-
- return "";
-}
-
-static char *print_remote (GnomePilotRecord *remote)
-{
- static char buff[ 4096 ];
- struct Address addr;
-
- if (remote == NULL) {
- sprintf (buff, "[NULL]");
- return buff;
- }
-
- memset (&addr, 0, sizeof (struct Address));
- unpack_Address (&addr, remote->record, remote->length);
-
- g_snprintf (buff, 4096, "['%s' '%s' '%s']",
- addr.entry[entryLastname] ?
- addr.entry[entryLastname] : "",
- addr.entry[entryFirstname] ?
- addr.entry[entryFirstname] : "",
- addr.entry[entryCompany] ?
- addr.entry[entryCompany] : "");
-
- free_Address (&addr);
-
- return buff;
-}
-
-/* Utility routines */
-static char *
-map_name (EAddrConduitContext *ctxt)
-{
- char *filename = NULL;
-
- filename = g_strdup_printf ("%s/.evolution/addressbook/local/system/pilot-map-%d.xml", g_get_home_dir (), ctxt->cfg->pilot_id);
-
- return filename;
-}
-
-static GList *
-next_changed_item (EAddrConduitContext *ctxt, GList *changes)
-{
- EBookChange *ebc;
- GList *l;
-
- for (l = changes; l != NULL; l = l->next) {
- ebc = l->data;
-
- if (g_hash_table_lookup (ctxt->changed_hash, e_contact_get_const (ebc->contact, E_CONTACT_UID)))
- return l;
- }
-
- return NULL;
-}
-
-static EContactField
-get_next_mail (EContactField *field)
-{
- if (field == NULL)
- return E_CONTACT_EMAIL_1;
-
- switch (*field) {
- case E_CONTACT_EMAIL_1:
- return E_CONTACT_EMAIL_2;
- case E_CONTACT_EMAIL_2:
- return E_CONTACT_EMAIL_3;
- default:
- break;
- }
-
- return E_CONTACT_FIELD_LAST;
-}
-
-static EContactField
-get_next_home (EContactField *field)
-{
- if (field == NULL)
- return E_CONTACT_PHONE_HOME;
-
- switch (*field) {
- case E_CONTACT_PHONE_HOME:
- return E_CONTACT_PHONE_HOME_2;
- default:
- break;
- }
-
- return E_CONTACT_FIELD_LAST;
-}
-
-static EContactField
-get_next_work (EContactField *field)
-{
- if (field == NULL)
- return E_CONTACT_PHONE_BUSINESS;
-
- switch (*field) {
- case E_CONTACT_PHONE_BUSINESS:
- return E_CONTACT_PHONE_BUSINESS_2;
- default:
- break;
- }
-
- return E_CONTACT_FIELD_LAST;
-}
-
-static EContactField
-get_next_fax (EContactField *field)
-{
- if (field == NULL)
- return E_CONTACT_PHONE_BUSINESS_FAX;
-
- switch (*field) {
- case E_CONTACT_PHONE_BUSINESS_FAX:
- return E_CONTACT_PHONE_HOME_FAX;
- case E_CONTACT_PHONE_HOME_FAX:
- return E_CONTACT_PHONE_OTHER_FAX;
- default:
- break;
- }
-
- return E_CONTACT_FIELD_LAST;
-}
-
-static EContactField
-get_next_other (EContactField *field)
-{
- if (field == NULL)
- return E_CONTACT_PHONE_OTHER;
-
- return E_CONTACT_FIELD_LAST;
-}
-
-static EContactField
-get_next_main (EContactField *field)
-{
- if (field == NULL)
- return E_CONTACT_PHONE_PRIMARY;
-
- return E_CONTACT_FIELD_LAST;
-}
-
-static EContactField
-get_next_pager (EContactField *field)
-{
- if (field == NULL)
- return E_CONTACT_PHONE_PAGER;
-
- return E_CONTACT_FIELD_LAST;
-}
-
-static EContactField
-get_next_mobile (EContactField *field)
-{
- if (field == NULL)
- return E_CONTACT_PHONE_MOBILE;
-
- return E_CONTACT_FIELD_LAST;
-}
-
-static void
-get_next_init (EContactField *next_mail,
- EContactField *next_home,
- EContactField *next_work,
- EContactField *next_fax,
- EContactField *next_other,
- EContactField *next_main,
- EContactField *next_pager,
- EContactField *next_mobile)
-{
- *next_mail = get_next_mail (NULL);
- *next_home = get_next_home (NULL);
- *next_work = get_next_work (NULL);
- *next_fax = get_next_fax (NULL);
- *next_other = get_next_other (NULL);
- *next_main = get_next_main (NULL);
- *next_pager = get_next_pager (NULL);
- *next_mobile = get_next_mobile (NULL);
-}
-
-static gboolean
-is_next_done (EContactField field)
-{
- if (field == E_CONTACT_FIELD_LAST)
- return TRUE;
-
- return FALSE;
-}
-
-static gboolean
-is_syncable (EAddrConduitContext *ctxt, EAddrLocalRecord *local)
-{
- EContactField next_mail, next_home, next_work, next_fax;
- EContactField next_other, next_main, next_pager, next_mobile;
- gboolean syncable = TRUE;
- int i, l = 0;
-
- /* See if there are fields we can't sync or not in priority order */
- get_next_init (&next_mail, &next_home, &next_work, &next_fax,
- &next_other, &next_main, &next_pager, &next_mobile);
-
- for (i = entryPhone1; i <= entryPhone5 && syncable; i++) {
- int phonelabel = local->addr->phoneLabel[i - entryPhone1];
- const char *phone_str = local->addr->entry[i];
- gboolean empty = !(phone_str && *phone_str);
-
- if (empty)
- continue;
-
- for ( ; priority_label[l] != -1; l++)
- if (phonelabel == priority_label[l])
- break;
-
- if (priority_label[l] == -1) {
- syncable = FALSE;
- continue;
- }
-
- if (phonelabel == LABEL_EMAIL) {
- if (is_next_done (next_mail) || next_mail != priority[l]) {
- syncable = FALSE;
- break;
- }
- next_mail = get_next_mail (&next_mail);
- } else if (phonelabel == LABEL_HOME) {
- if (is_next_done (next_home) || next_home != priority[l]) {
- syncable = FALSE;
- break;
- }
- next_home = get_next_home (&next_home);
- } else if (phonelabel == LABEL_WORK) {
- if (is_next_done (next_work) || next_work != priority[l]) {
- syncable = FALSE;
- break;
- }
- next_work = get_next_work (&next_work);
- } else if (phonelabel == LABEL_FAX) {
- if (is_next_done (next_fax) || next_fax != priority[l]) {
- syncable = FALSE;
- break;
- }
- next_fax = get_next_fax (&next_fax);
- } else if (phonelabel == LABEL_OTHER) {
- if (is_next_done (next_other) || next_other != priority[l]) {
- syncable = FALSE;
- break;
- }
- next_other = get_next_other (&next_other);
- } else if (phonelabel == LABEL_MAIN) {
- if (is_next_done (next_main) || next_main != priority[l]) {
- syncable = FALSE;
- break;
- }
- next_main = get_next_main (&next_main);
- } else if (phonelabel == LABEL_PAGER) {
- if (is_next_done (next_pager) || next_pager != priority[l]) {
- syncable = FALSE;
- break;
- }
- next_pager = get_next_pager (&next_pager);
- } else if (phonelabel == LABEL_MOBILE) {
- if (is_next_done (next_mobile) || next_mobile != priority[l]) {
- syncable = FALSE;
- break;
- }
- next_mobile = get_next_mobile (&next_mobile);
- }
- }
-
- return syncable;
-}
-
-static void
-set_contact_text (EContact *contact, EContactField field, struct Address address, int entry)
-{
- char *text = NULL;
-
- if (address.entry[entry])
- text = e_pilot_utf8_from_pchar (address.entry[entry]);
-
- e_contact_set (contact, field, text);
-
- g_free (text);
-}
-
-static char *
-get_entry_text (struct Address address, int entry)
-{
- if (address.entry[entry])
- return e_pilot_utf8_from_pchar (address.entry[entry]);
-
- return NULL;
-}
-
-static void
-clear_entry_text (struct Address address, int field)
-{
- if (address.entry[field]) {
- free (address.entry[field]);
- address.entry[field] = NULL;
- }
-}
-
-static void
-compute_status (EAddrConduitContext *ctxt, EAddrLocalRecord *local, const char *uid)
-{
- EBookChange *ebc;
-
- local->local.archived = FALSE;
- local->local.secret = FALSE;
-
- ebc = g_hash_table_lookup (ctxt->changed_hash, uid);
-
- if (ebc == NULL) {
- local->local.attr = GnomePilotRecordNothing;
- return;
- }
-
- switch (ebc->change_type) {
- case E_BOOK_CHANGE_CARD_ADDED:
- local->local.attr = GnomePilotRecordNew;
- break;
- case E_BOOK_CHANGE_CARD_MODIFIED:
- local->local.attr = GnomePilotRecordModified;
- break;
- case E_BOOK_CHANGE_CARD_DELETED:
- local->local.attr = GnomePilotRecordDeleted;
- break;
- }
-}
-
-static GnomePilotRecord
-local_record_to_pilot_record (EAddrLocalRecord *local,
- EAddrConduitContext *ctxt)
-{
- GnomePilotRecord p;
- static char record[0xffff];
-
- g_assert (local->addr != NULL );
-
- LOG (g_message ( "local_record_to_pilot_record\n" ));
-
- p.ID = local->local.ID;
- p.category = local->local.category;
- p.attr = local->local.attr;
- p.archived = local->local.archived;
- p.secret = local->local.secret;
-
- /* Generate pilot record structure */
- p.record = record;
- p.length = pack_Address (local->addr, p.record, 0xffff);
-
- return p;
-}
-
-static void
-local_record_from_ecard (EAddrLocalRecord *local, EContact *contact, EAddrConduitContext *ctxt)
-{
- EContactAddress *address = NULL;
- int phone = entryPhone1;
- EContactField field;
- gboolean syncable;
- int i;
-
- g_return_if_fail (local != NULL);
- g_return_if_fail (contact != NULL);
-
- local->contact = g_object_ref (contact);
- local->local.ID = e_pilot_map_lookup_pid (ctxt->map, e_contact_get_const (contact, E_CONTACT_UID), TRUE);
-
- compute_status (ctxt, local, e_contact_get_const (contact, E_CONTACT_UID));
-
- local->addr = g_new0 (struct Address, 1);
-
- /* Handle the fields and category we don't sync by making sure
- * we don't overwrite them
- */
- if (local->local.ID != 0) {
- struct Address addr;
- char record[0xffff];
- int cat = 0;
-
- if (dlp_ReadRecordById (ctxt->dbi->pilot_socket,
- ctxt->dbi->db_handle,
- local->local.ID, &record,
- NULL, NULL, NULL, &cat) > 0) {
- local->local.category = cat;
- memset (&addr, 0, sizeof (struct Address));
- unpack_Address (&addr, record, 0xffff);
- for (i = 0; i < 5; i++) {
- if (addr.entry[entryPhone1 + i])
- local->addr->entry[entryPhone1 + i] =
- strdup (addr.entry[entryPhone1 + i]);
- local->addr->phoneLabel[i] = addr.phoneLabel[i];
- }
- local->addr->showPhone = addr.showPhone;
- for (i = 0; i < 4; i++) {
- if (addr.entry[entryCustom1 + i])
- local->addr->entry[entryCustom1 + i] =
- strdup (addr.entry[entryCustom1 + i]);
- }
- free_Address (&addr);
- }
- }
-
- local->addr->entry[entryFirstname] = e_pilot_utf8_to_pchar (e_contact_get_const (contact, E_CONTACT_GIVEN_NAME));
- local->addr->entry[entryLastname] = e_pilot_utf8_to_pchar (e_contact_get_const (contact, E_CONTACT_FAMILY_NAME));
- local->addr->entry[entryCompany] = e_pilot_utf8_to_pchar (e_contact_get_const (contact, E_CONTACT_ORG));
- local->addr->entry[entryTitle] = e_pilot_utf8_to_pchar (e_contact_get_const (contact, E_CONTACT_TITLE));
-
- /* See if the default has something in it */
- if ((address = e_contact_get (contact, ctxt->cfg->default_address))) {
- field = ctxt->cfg->default_address;
- } else {
- /* Try to find a non-empty address field */
- for (field = E_CONTACT_FIRST_ADDRESS_ID; field <= E_CONTACT_LAST_ADDRESS_ID; field++) {
- if ((address = e_contact_get (contact, field)))
- break;
- }
- }
-
- if (address) {
- char *add;
-
- /* If the address has 2 lines, make sure both get added */
- if (address->ext != NULL)
- add = g_strconcat (address->street, "\n", address->ext, NULL);
- else
- add = g_strdup (address->street);
- local->addr->entry[entryAddress] = e_pilot_utf8_to_pchar (add);
- g_free (add);
-
- local->addr->entry[entryCity] = e_pilot_utf8_to_pchar (address->locality);
- local->addr->entry[entryState] = e_pilot_utf8_to_pchar (address->region);
- local->addr->entry[entryZip] = e_pilot_utf8_to_pchar (address->code);
- local->addr->entry[entryCountry] = e_pilot_utf8_to_pchar (address->country);
-
- e_contact_address_free (address);
- }
-
- /* Phone numbers */
-
- /* See if everything is syncable */
- syncable = is_syncable (ctxt, local);
-
- if (syncable) {
- INFO ("Syncable");
-
- /* Sync by priority */
- for (i = 0, phone = entryPhone1;
- priority[i] != E_CONTACT_FIELD_LAST && phone <= entryPhone5; i++) {
- const char *phone_str;
-
- phone_str = e_contact_get_const (contact, priority[i]);
- if (phone_str && *phone_str) {
- clear_entry_text (*local->addr, phone);
- local->addr->entry[phone] = e_pilot_utf8_to_pchar (phone_str);
- local->addr->phoneLabel[phone - entryPhone1] = priority_label[i];
- phone++;
- }
- }
- for ( ; phone <= entryPhone5; phone++)
- local->addr->phoneLabel[phone - entryPhone1] = phone - entryPhone1;
- local->addr->showPhone = 0;
- } else {
- EContactField next_mail, next_home, next_work, next_fax;
- EContactField next_other, next_main, next_pager, next_mobile;
-
- INFO ("Not Syncable");
- get_next_init (&next_mail, &next_home, &next_work, &next_fax,
- &next_other, &next_main, &next_pager, &next_mobile);
-
- /* Not completely syncable, so do the best we can */
- for (i = entryPhone1; i <= entryPhone5; i++) {
- int phonelabel = local->addr->phoneLabel[i - entryPhone1];
- const char *phone_str = NULL;
-
- if (phonelabel == LABEL_EMAIL && !is_next_done (next_mail)) {
- phone_str = e_contact_get_const (contact, next_mail);
- next_mail = get_next_mail (&next_mail);
- } else if (phonelabel == LABEL_HOME && !is_next_done (next_home)) {
- phone_str = e_contact_get_const (contact, next_home);
- next_home = get_next_home (&next_home);
- } else if (phonelabel == LABEL_WORK && !is_next_done (next_work)) {
- phone_str = e_contact_get_const (contact, next_work);
- next_work = get_next_work (&next_work);
- } else if (phonelabel == LABEL_FAX && !is_next_done (next_fax)) {
- phone_str = e_contact_get_const (contact, next_fax);
- next_fax = get_next_fax (&next_fax);
- } else if (phonelabel == LABEL_OTHER && !is_next_done (next_other)) {
- phone_str = e_contact_get_const (contact, next_other);
- next_other = get_next_other (&next_other);
- } else if (phonelabel == LABEL_MAIN && !is_next_done (next_main)) {
- phone_str = e_contact_get_const (contact, next_main);
- next_main = get_next_main (&next_main);
- } else if (phonelabel == LABEL_PAGER && !is_next_done (next_pager)) {
- phone_str = e_contact_get_const (contact, next_pager);
- next_pager = get_next_pager (&next_pager);
- } else if (phonelabel == LABEL_MOBILE && !is_next_done (next_mobile)) {
- phone_str = e_contact_get_const (contact, next_mobile);
- next_mobile = get_next_mobile (&next_mobile);
- }
-
- if (phone_str && *phone_str) {
- clear_entry_text (*local->addr, i);
- local->addr->entry[i] = e_pilot_utf8_to_pchar (phone_str);
- }
- }
- }
-
- /* Note */
- local->addr->entry[entryNote] = e_pilot_utf8_to_pchar (e_contact_get_const (contact, E_CONTACT_NOTE));
-}
-
-static void
-local_record_from_uid (EAddrLocalRecord *local,
- const char *uid,
- EAddrConduitContext *ctxt)
-{
- EContact *contact = NULL;
- const char *cuid;
- GList *l;
-
- g_assert (local != NULL);
-
- for (l = ctxt->cards; l != NULL; l = l->next) {
- contact = l->data;
-
- /* FIXME Do we need to check for the empty string? */
- if ((cuid = e_contact_get_const (contact, E_CONTACT_UID)) && !strcmp (cuid, uid))
- break;
-
- contact = NULL;
- }
-
- if (contact != NULL) {
- local_record_from_ecard (local, contact, ctxt);
- } else {
- contact = e_contact_new ();
- e_contact_set (contact, E_CONTACT_UID, (gpointer) uid);
- local_record_from_ecard (local, contact, ctxt);
- g_object_unref (contact);
- }
-}
-
-static EContact *
-ecard_from_remote_record(EAddrConduitContext *ctxt,
- GnomePilotRecord *remote,
- EContact *in_contact)
-{
- struct Address address;
- EContact *contact;
- EContactName *name;
- EContactAddress *eaddress;
- EContactField mailing_address;
- char *txt, *find, *full_name;
- EContactField next_mail, next_home, next_work, next_fax;
- EContactField next_other, next_main, next_pager, next_mobile;
- int i;
-
- g_return_val_if_fail(remote!=NULL,NULL);
- memset (&address, 0, sizeof (struct Address));
- unpack_Address (&address, remote->record, remote->length);
-
- if (in_contact == NULL)
- contact = e_contact_new ();
- else
- contact = e_contact_duplicate (in_contact);
-
- /* Name */
- name = e_contact_name_new ();
- name->given = get_entry_text (address, entryFirstname);
- name->family = get_entry_text (address, entryLastname);
-
- full_name = e_contact_name_to_string (name);
- e_contact_set (contact, E_CONTACT_FULL_NAME, full_name);
- e_contact_name_free (name);
-
- /* File As */
- if (!full_name || !*full_name)
- set_contact_text (contact, E_CONTACT_FILE_AS, address, entryCompany);
-
- g_free (full_name);
-
- /* Title and Company */
- set_contact_text (contact, E_CONTACT_TITLE, address, entryTitle);
- set_contact_text (contact, E_CONTACT_ORG, address, entryCompany);
-
- /* Address */
- mailing_address = -1;
- if ((eaddress = e_contact_get (contact, ctxt->cfg->default_address))) {
- mailing_address = ctxt->cfg->default_address;
- e_contact_address_free (eaddress);
- } else {
- for (i = E_CONTACT_FIRST_ADDRESS_ID; i <= E_CONTACT_LAST_ADDRESS_ID; i++) {
- if ((eaddress = e_contact_get (contact, i))) {
- e_contact_address_free (eaddress);
- mailing_address = i;
- break;
- }
- }
- }
-
- if (mailing_address == -1)
- mailing_address = ctxt->cfg->default_address;
-
- eaddress = g_new0 (EContactAddress, 1);
-
- txt = get_entry_text (address, entryAddress);
- if (txt && (find = strchr (txt, '\n')) != NULL) {
- *find = '\0';
- find++;
- } else {
- find = NULL;
- }
-
- eaddress->street = txt;
- eaddress->ext = find != NULL ? g_strdup (find) : g_strdup ("");
- eaddress->locality = get_entry_text (address, entryCity);
- eaddress->region = get_entry_text (address, entryState);
- eaddress->country = get_entry_text (address, entryCountry);
- eaddress->code = get_entry_text (address, entryZip);
-
- e_contact_set (contact, mailing_address, eaddress);
- e_contact_address_free (eaddress);
-
- /* Phone numbers */
- get_next_init (&next_mail, &next_home, &next_work, &next_fax,
- &next_other, &next_main, &next_pager, &next_mobile);
-
- for (i = entryPhone1; i <= entryPhone5; i++) {
- int phonelabel = address.phoneLabel[i - entryPhone1];
- char *phonenum = get_entry_text (address, i);
-
- if (phonelabel == LABEL_EMAIL && !is_next_done (next_mail)) {
- e_contact_set (contact, next_mail, phonenum);
- next_mail = get_next_mail (&next_mail);
- } else if (phonelabel == LABEL_HOME && !is_next_done (next_home)) {
- e_contact_set (contact, next_home, phonenum);
- next_home = get_next_home (&next_home);
- } else if (phonelabel == LABEL_WORK && !is_next_done (next_work)) {
- e_contact_set (contact, next_work, phonenum);
- next_work = get_next_work (&next_work);
- } else if (phonelabel == LABEL_FAX && !is_next_done (next_fax)) {
- e_contact_set (contact, next_fax, phonenum);
- next_fax = get_next_fax (&next_fax);
- } else if (phonelabel == LABEL_OTHER && !is_next_done (next_other)) {
- e_contact_set (contact, next_other, phonenum);
- next_other = get_next_other (&next_other);
- } else if (phonelabel == LABEL_MAIN && !is_next_done (next_main)) {
- e_contact_set (contact, next_main, phonenum);
- next_main = get_next_main (&next_main);
- } else if (phonelabel == LABEL_PAGER && !is_next_done (next_pager)) {
- e_contact_set (contact, next_pager, phonenum);
- next_pager = get_next_pager (&next_pager);
- } else if (phonelabel == LABEL_MOBILE && !is_next_done (next_mobile)) {
- e_contact_set (contact, next_mobile, phonenum);
- next_mobile = get_next_mobile (&next_mobile);
- }
-
- g_free (phonenum);
- }
-
- /* Note */
- set_contact_text (contact, E_CONTACT_NOTE, address, entryNote);
-
- free_Address(&address);
-
- return contact;
-}
-
-static void
-check_for_slow_setting (GnomePilotConduit *c, EAddrConduitContext *ctxt)
-{
- GnomePilotConduitStandard *conduit = GNOME_PILOT_CONDUIT_STANDARD (c);
- int map_count;
- const char *uri;
-
- map_count = g_hash_table_size (ctxt->map->pid_map);
- if (map_count == 0)
- gnome_pilot_conduit_standard_set_slow (conduit, TRUE);
-
- /* Or if the URI's don't match */
- uri = e_book_get_uri (ctxt->ebook);
- LOG (g_message (" Current URI %s (%s)\n", uri, ctxt->cfg->last_uri ? ctxt->cfg->last_uri : "<NONE>"));
- if (ctxt->cfg->last_uri != NULL && strcmp (ctxt->cfg->last_uri, uri)) {
- gnome_pilot_conduit_standard_set_slow (conduit, TRUE);
- e_pilot_map_clear (ctxt->map);
- }
-
- if (gnome_pilot_conduit_standard_get_slow (conduit)) {
- ctxt->map->write_touched_only = TRUE;
- LOG (g_message ( " doing slow sync\n" ));
- } else {
- LOG (g_message ( " doing fast sync\n" ));
- }
-}
-
-/* Pilot syncing callbacks */
-static gint
-pre_sync (GnomePilotConduit *conduit,
- GnomePilotDBInfo *dbi,
- EAddrConduitContext *ctxt)
-{
- GnomePilotConduitSyncAbs *abs_conduit;
- EBookQuery *query;
- GList *l;
- int len;
- unsigned char *buf;
- char *filename;
- char *change_id;
- gint num_records, add_records = 0, mod_records = 0, del_records = 0;
-
- abs_conduit = GNOME_PILOT_CONDUIT_SYNC_ABS (conduit);
-
- LOG (g_message ( "---------------------------------------------------------\n" ));
- LOG (g_message ( "pre_sync: Addressbook Conduit v.%s", CONDUIT_VERSION ));
- /* g_message ("Addressbook Conduit v.%s", CONDUIT_VERSION); */
-
- ctxt->dbi = dbi;
-
- if (ctxt->cfg->source) {
- ctxt->ebook = e_book_new (ctxt->cfg->source, NULL);
- } else {
- ctxt->ebook = e_book_new_default_addressbook (NULL);
- }
- if (!ctxt->ebook || !e_book_open (ctxt->ebook, TRUE, NULL)) {
- WARN(_("Could not load addressbook"));
- gnome_pilot_conduit_error (conduit, _("Could not load addressbook"));
-
- return -1;
- }
-
- /* Load the uid <--> pilot id mappings */
- filename = map_name (ctxt);
- e_pilot_map_read (filename, &ctxt->map);
- g_free (filename);
-
- /* Get a list of all contacts */
- if (!(query = e_book_query_any_field_contains (""))) {
- LOG (g_warning ("Failed to get EBookQuery"));
- return -1;
- }
-
- if (!e_book_get_contacts (ctxt->ebook, query, &ctxt->cards, NULL)) {
- LOG (g_warning ("Failed to get Contacts"));
- e_book_query_unref (query);
- return -1;
- }
-
- e_book_query_unref (query);
-
- /* Count and hash the changes */
- change_id = g_strdup_printf ("pilot-sync-evolution-addressbook-%d", ctxt->cfg->pilot_id);
- if (!e_book_get_changes (ctxt->ebook, change_id, &ctxt->changed, NULL))
- return -1;
- ctxt->changed_hash = g_hash_table_new (g_str_hash, g_str_equal);
- g_free (change_id);
-
- for (l = ctxt->changed; l != NULL; l = l->next) {
- EBookChange *ebc = l->data;
- const char *uid;
-
- uid = e_contact_get_const (ebc->contact, E_CONTACT_UID);
- if (!e_pilot_map_uid_is_archived (ctxt->map, uid)) {
-
- g_hash_table_insert (ctxt->changed_hash, g_strdup (uid), ebc);
-
- switch (ebc->change_type) {
- case E_BOOK_CHANGE_CARD_ADDED:
- add_records++;
- break;
- case E_BOOK_CHANGE_CARD_MODIFIED:
- mod_records++;
- break;
- case E_BOOK_CHANGE_CARD_DELETED:
- del_records++;
- break;
- }
- } else if (ebc->change_type == E_BOOK_CHANGE_CARD_DELETED) {
- e_pilot_map_remove_by_uid (ctxt->map, uid);
- }
- }
-
- /* Set the count information */
- num_records = g_list_length (ctxt->cards);
- gnome_pilot_conduit_sync_abs_set_num_local_records(abs_conduit, num_records);
- gnome_pilot_conduit_sync_abs_set_num_new_local_records (abs_conduit, add_records);
- gnome_pilot_conduit_sync_abs_set_num_updated_local_records (abs_conduit, mod_records);
- gnome_pilot_conduit_sync_abs_set_num_deleted_local_records(abs_conduit, del_records);
-
- buf = (unsigned char*)g_malloc (0xffff);
- len = dlp_ReadAppBlock (dbi->pilot_socket, dbi->db_handle, 0,
- (unsigned char *)buf, 0xffff);
-
- if (len < 0) {
- WARN (_("Could not read pilot's Address application block"));
- WARN ("dlp_ReadAppBlock(...) = %d", len);
- gnome_pilot_conduit_error (conduit,
- _("Could not read pilot's Address application block"));
- return -1;
- }
- unpack_AddressAppInfo (&(ctxt->ai), buf, len);
- g_free (buf);
-
- check_for_slow_setting (conduit, ctxt);
- if (ctxt->cfg->sync_type == GnomePilotConduitSyncTypeCopyToPilot
- || ctxt->cfg->sync_type == GnomePilotConduitSyncTypeCopyFromPilot)
- ctxt->map->write_touched_only = TRUE;
-
- return 0;
-}
-
-static gint
-post_sync (GnomePilotConduit *conduit,
- GnomePilotDBInfo *dbi,
- EAddrConduitContext *ctxt)
-{
- GList *changed;
- gchar *filename, *change_id;
-
- LOG (g_message ( "post_sync: Address Conduit v.%s", CONDUIT_VERSION ));
-
- g_free (ctxt->cfg->last_uri);
- ctxt->cfg->last_uri = g_strdup (e_book_get_uri (ctxt->ebook));
- addrconduit_save_configuration (ctxt->cfg);
-
- filename = map_name (ctxt);
- e_pilot_map_write (filename, ctxt->map);
- g_free (filename);
-
- /* FIX ME ugly hack - our changes musn't count, this does introduce
- * a race condition if anyone changes a record elsewhere during sycnc
- */
- change_id = g_strdup_printf ("pilot-sync-evolution-addressbook-%d", ctxt->cfg->pilot_id);
- if (e_book_get_changes (ctxt->ebook, change_id, &changed, NULL))
- e_book_free_change_list (changed);
- g_free (change_id);
-
- LOG (g_message ( "---------------------------------------------------------\n" ));
-
- return 0;
-}
-
-static gint
-set_pilot_id (GnomePilotConduitSyncAbs *conduit,
- EAddrLocalRecord *local,
- guint32 ID,
- EAddrConduitContext *ctxt)
-{
- LOG (g_message ( "set_pilot_id: setting to %d\n", ID ));
-
- e_pilot_map_insert (ctxt->map, ID, e_contact_get_const (local->contact, E_CONTACT_UID), FALSE);
-
- return 0;
-}
-
-static gint
-set_status_cleared (GnomePilotConduitSyncAbs *conduit,
- EAddrLocalRecord *local,
- EAddrConduitContext *ctxt)
-{
- const char *uid;
-
- LOG (g_message ( "set_status_cleared: clearing status\n" ));
-
- if ((uid = e_contact_get_const (local->contact, E_CONTACT_UID)))
- g_hash_table_remove (ctxt->changed_hash, uid);
-
- return 0;
-}
-
-static gint
-for_each (GnomePilotConduitSyncAbs *conduit,
- EAddrLocalRecord **local,
- EAddrConduitContext *ctxt)
-{
- static GList *cards, *iterator;
- static int count;
-
- g_return_val_if_fail (local != NULL, -1);
-
- if (*local == NULL) {
- LOG (g_message ( "beginning for_each" ));
-
- cards = ctxt->cards;
- count = 0;
-
- if (cards != NULL) {
- LOG (g_message ( "iterating over %d records", g_list_length (cards) ));
-
- *local = g_new0 (EAddrLocalRecord, 1);
- local_record_from_ecard (*local, cards->data, ctxt);
- g_list_prepend (ctxt->locals, *local);
-
- iterator = cards;
- } else {
- LOG (g_message ( "no events" ));
- (*local) = NULL;
- return 0;
- }
- } else {
- count++;
- if (g_list_next (iterator)) {
- iterator = g_list_next (iterator);
-
- *local = g_new0 (EAddrLocalRecord, 1);
- local_record_from_ecard (*local, iterator->data, ctxt);
- g_list_prepend (ctxt->locals, *local);
- } else {
- LOG (g_message ( "for_each ending" ));
-
- /* Tell the pilot the iteration is over */
- *local = NULL;
-
- return 0;
- }
- }
-
- return 0;
-}
-
-static gint
-for_each_modified (GnomePilotConduitSyncAbs *conduit,
- EAddrLocalRecord **local,
- EAddrConduitContext *ctxt)
-{
- static GList *iterator;
- static int count;
-
- g_return_val_if_fail (local != NULL, 0);
-
- if (*local == NULL) {
- LOG (g_message ( "for_each_modified beginning\n" ));
-
- iterator = ctxt->changed;
-
- count = 0;
-
- iterator = next_changed_item (ctxt, iterator);
- if (iterator != NULL) {
- EBookChange *ebc = iterator->data;
-
- LOG (g_message ( "iterating over %d records", g_hash_table_size (ctxt->changed_hash)));
-
- *local = g_new0 (EAddrLocalRecord, 1);
- local_record_from_ecard (*local, ebc->contact, ctxt);
- g_list_prepend (ctxt->locals, *local);
- } else {
- LOG (g_message ( "no events" ));
-
- *local = NULL;
- }
- } else {
- count++;
- iterator = g_list_next (iterator);
- if (iterator && (iterator = next_changed_item (ctxt, iterator))) {
- EBookChange *ebc = iterator->data;
-
- *local = g_new0 (EAddrLocalRecord, 1);
- local_record_from_ecard (*local, ebc->contact, ctxt);
- g_list_prepend (ctxt->locals, *local);
- } else {
- LOG (g_message ( "for_each_modified ending" ));
-
- /* Signal the iteration is over */
- *local = NULL;
-
- return 0;
- }
- }
-
- return 0;
-}
-
-static gint
-compare (GnomePilotConduitSyncAbs *conduit,
- EAddrLocalRecord *local,
- GnomePilotRecord *remote,
- EAddrConduitContext *ctxt)
-{
- GnomePilotRecord local_pilot;
- int retval = 0;
-
- LOG (g_message ("compare: local=%s remote=%s...\n",
- print_local (local), print_remote (remote)));
-
- g_return_val_if_fail (local != NULL, -1);
- g_return_val_if_fail (remote != NULL, -1);
-
- local_pilot = local_record_to_pilot_record (local, ctxt);
-
- if (remote->length != local_pilot.length
- || memcmp (local_pilot.record, remote->record, remote->length))
- retval = 1;
-
- if (retval == 0)
- LOG (g_message ( " equal" ));
- else
- LOG (g_message ( " not equal" ));
-
- return retval;
-}
-
-static gint
-add_record (GnomePilotConduitSyncAbs *conduit,
- GnomePilotRecord *remote,
- EAddrConduitContext *ctxt)
-{
- EContact *contact;
- int retval = 0;
-
- g_return_val_if_fail (remote != NULL, -1);
-
- LOG (g_message ( "add_record: adding %s to desktop\n", print_remote (remote) ));
-
- contact = ecard_from_remote_record (ctxt, remote, NULL);
-
- /* add the ecard to the server */
- if (!e_book_add_contact (ctxt->ebook, contact, NULL)) {
- WARN ("add_record: failed to add card to ebook\n");
- g_object_unref (contact);
-
- return -1;
- }
-
- e_pilot_map_insert (ctxt->map, remote->ID, e_contact_get (contact, E_CONTACT_UID), FALSE);
-
- g_object_unref (contact);
-
- return retval;
-}
-
-static gint
-replace_record (GnomePilotConduitSyncAbs *conduit,
- EAddrLocalRecord *local,
- GnomePilotRecord *remote,
- EAddrConduitContext *ctxt)
-{
- EContact *new_contact;
- EBookChange *ebc;
- char *old_id;
- int retval = 0;
-
- g_return_val_if_fail (remote != NULL, -1);
-
- LOG (g_message ("replace_record: replace %s with %s\n",
- print_local (local), print_remote (remote)));
-
- old_id = e_contact_get (local->contact, E_CONTACT_UID);
- ebc = g_hash_table_lookup (ctxt->changed_hash, old_id);
-
- new_contact = ecard_from_remote_record (ctxt, remote, local->contact);
- g_object_unref (local->contact);
- local->contact = new_contact;
-
- if (ebc && ebc->change_type == E_BOOK_CHANGE_CARD_DELETED) {
- if (!e_book_add_contact (ctxt->ebook, local->contact, NULL)) {
- WARN (G_STRLOC ": failed to add card\n");
-
- return -1;
- }
-
- } else {
- if (!e_book_commit_contact (ctxt->ebook, local->contact, NULL)) {
- WARN (G_STRLOC ": failed to commit card\n");
-
- return -1;
- }
- }
-
- /* Adding a record causes wombat to assign a new uid so we must tidy */
- if (ebc && ebc->change_type == E_BOOK_CHANGE_CARD_DELETED) {
- const char *uid = e_contact_get_const (local->contact, E_CONTACT_UID);
- gboolean arch;
-
- arch = e_pilot_map_uid_is_archived (ctxt->map, uid);
- e_pilot_map_insert (ctxt->map, remote->ID, uid, arch);
-
- ebc = g_hash_table_lookup (ctxt->changed_hash, old_id);
- if (ebc) {
- g_hash_table_remove (ctxt->changed_hash, old_id);
- g_object_unref (ebc->contact);
- g_object_ref (local->contact);
- ebc->contact = local->contact;
- /* FIXME We should possibly be duplicating the uid */
- g_hash_table_insert (ctxt->changed_hash, (gpointer) uid, ebc);
- }
- }
-
- return retval;
-}
-
-static gint
-delete_record (GnomePilotConduitSyncAbs *conduit,
- EAddrLocalRecord *local,
- EAddrConduitContext *ctxt)
-{
- GError *error = NULL;
- int retval = 0;
-
- g_return_val_if_fail (local != NULL, -1);
- g_return_val_if_fail (local->contact != NULL, -1);
-
- LOG (g_message ( "delete_record: delete %s\n", print_local (local) ));
-
- e_pilot_map_remove_by_uid (ctxt->map, e_contact_get_const (local->contact, E_CONTACT_UID));
- if (!e_book_remove_contact (ctxt->ebook, e_contact_get_const (local->contact, E_CONTACT_UID), &error) && error->code != E_BOOK_ERROR_CONTACT_NOT_FOUND) {
- WARN ("delete_record: failed to delete card in ebook\n");
- g_error_free (error);
-
- retval = -1;
- }
-
- return retval;
-}
-
-static gint
-archive_record (GnomePilotConduitSyncAbs *conduit,
- EAddrLocalRecord *local,
- gboolean archive,
- EAddrConduitContext *ctxt)
-{
- int retval = 0;
-
- g_return_val_if_fail (local != NULL, -1);
-
- LOG (g_message ( "archive_record: %s\n", archive ? "yes" : "no" ));
-
- e_pilot_map_insert (ctxt->map, local->local.ID, e_contact_get_const (local->contact, E_CONTACT_UID), archive);
-
- return retval;
-}
-
-static gint
-match (GnomePilotConduitSyncAbs *conduit,
- GnomePilotRecord *remote,
- EAddrLocalRecord **local,
- EAddrConduitContext *ctxt)
-{
- const char *uid;
-
- LOG (g_message ("match: looking for local copy of %s\n",
- print_remote (remote)));
-
- g_return_val_if_fail (local != NULL, -1);
- g_return_val_if_fail (remote != NULL, -1);
-
- *local = NULL;
- uid = e_pilot_map_lookup_uid (ctxt->map, remote->ID, TRUE);
-
- if (!uid)
- return 0;
-
- LOG (g_message ( " matched\n" ));
-
- *local = g_new0 (EAddrLocalRecord, 1);
- local_record_from_uid (*local, uid, ctxt);
-
- return 0;
-}
-
-static gint
-free_match (GnomePilotConduitSyncAbs *conduit,
- EAddrLocalRecord *local,
- EAddrConduitContext *ctxt)
-{
- LOG (g_message ( "free_match: freeing\n" ));
-
- g_return_val_if_fail (local != NULL, -1);
-
- addrconduit_destroy_record (local);
-
- return 0;
-}
-
-static gint
-prepare (GnomePilotConduitSyncAbs *conduit,
- EAddrLocalRecord *local,
- GnomePilotRecord *remote,
- EAddrConduitContext *ctxt)
-{
- LOG (g_message ( "prepare: encoding local %s\n", print_local (local) ));
-
- *remote = local_record_to_pilot_record (local, ctxt);
-
- return 0;
-}
-
-/* Pilot Settings Callbacks */
-static void
-fill_widgets (EAddrConduitContext *ctxt)
-{
- if (ctxt->cfg->source)
- e_pilot_settings_set_source (E_PILOT_SETTINGS (ctxt->ps),
- ctxt->cfg->source);
- e_pilot_settings_set_secret (E_PILOT_SETTINGS (ctxt->ps),
- ctxt->cfg->secret);
-
- e_addr_gui_fill_widgets (ctxt->gui, ctxt->cfg);
-}
-
-static gint
-create_settings_window (GnomePilotConduit *conduit,
- GtkWidget *parent,
- EAddrConduitContext *ctxt)
-{
- LOG (g_message ( "create_settings_window" ));
-
- if (!ctxt->cfg->source_list)
- return -1;
-
- ctxt->ps = e_pilot_settings_new (ctxt->cfg->source_list);
- ctxt->gui = e_addr_gui_new (E_PILOT_SETTINGS (ctxt->ps));
-
- gtk_container_add (GTK_CONTAINER (parent), ctxt->ps);
- gtk_widget_show (ctxt->ps);
-
- fill_widgets (ctxt);
-
- return 0;
-}
-static void
-display_settings (GnomePilotConduit *conduit, EAddrConduitContext *ctxt)
-{
- LOG (g_message ( "display_settings" ));
-
- fill_widgets (ctxt);
-}
-
-static void
-save_settings (GnomePilotConduit *conduit, EAddrConduitContext *ctxt)
-{
- LOG (g_message ( "save_settings" ));
-
- if (ctxt->new_cfg->source)
- g_object_unref (ctxt->new_cfg->source);
- ctxt->new_cfg->source = e_pilot_settings_get_source (E_PILOT_SETTINGS (ctxt->ps));
- g_object_ref (ctxt->new_cfg->source);
- ctxt->new_cfg->secret =
- e_pilot_settings_get_secret (E_PILOT_SETTINGS (ctxt->ps));
- e_addr_gui_fill_config (ctxt->gui, ctxt->new_cfg);
-
- addrconduit_save_configuration (ctxt->new_cfg);
-}
-
-static void
-revert_settings (GnomePilotConduit *conduit, EAddrConduitContext *ctxt)
-{
- LOG (g_message ( "revert_settings" ));
-
- addrconduit_save_configuration (ctxt->cfg);
- addrconduit_destroy_configuration (ctxt->new_cfg);
- ctxt->new_cfg = addrconduit_dupe_configuration (ctxt->cfg);
-}
-
-GnomePilotConduit *
-conduit_get_gpilot_conduit (guint32 pilot_id)
-{
- GtkObject *retval;
- EAddrConduitContext *ctxt;
-
- LOG (g_message ( "in address's conduit_get_gpilot_conduit\n" ));
-
- retval = gnome_pilot_conduit_sync_abs_new ("AddressDB", 0x61646472);
- g_assert (retval != NULL);
-
- ctxt = e_addr_context_new (pilot_id);
- gtk_object_set_data (GTK_OBJECT (retval), "addrconduit_context", ctxt);
-
- gtk_signal_connect (retval, "pre_sync", (GtkSignalFunc) pre_sync, ctxt);
- gtk_signal_connect (retval, "post_sync", (GtkSignalFunc) post_sync, ctxt);
-
- gtk_signal_connect (retval, "set_pilot_id", (GtkSignalFunc) set_pilot_id, ctxt);
- gtk_signal_connect (retval, "set_status_cleared", (GtkSignalFunc) set_status_cleared, ctxt);
-
- gtk_signal_connect (retval, "for_each", (GtkSignalFunc) for_each, ctxt);
- gtk_signal_connect (retval, "for_each_modified", (GtkSignalFunc) for_each_modified, ctxt);
- gtk_signal_connect (retval, "compare", (GtkSignalFunc) compare, ctxt);
-
- gtk_signal_connect (retval, "add_record", (GtkSignalFunc) add_record, ctxt);
- gtk_signal_connect (retval, "replace_record", (GtkSignalFunc) replace_record, ctxt);
- gtk_signal_connect (retval, "delete_record", (GtkSignalFunc) delete_record, ctxt);
- gtk_signal_connect (retval, "archive_record", (GtkSignalFunc) archive_record, ctxt);
-
- gtk_signal_connect (retval, "match", (GtkSignalFunc) match, ctxt);
- gtk_signal_connect (retval, "free_match", (GtkSignalFunc) free_match, ctxt);
-
- gtk_signal_connect (retval, "prepare", (GtkSignalFunc) prepare, ctxt);
-
- /* Gui Settings */
- gtk_signal_connect (retval, "create_settings_window", (GtkSignalFunc) create_settings_window, ctxt);
- gtk_signal_connect (retval, "display_settings", (GtkSignalFunc) display_settings, ctxt);
- gtk_signal_connect (retval, "save_settings", (GtkSignalFunc) save_settings, ctxt);
- gtk_signal_connect (retval, "revert_settings", (GtkSignalFunc) revert_settings, ctxt);
-
- return GNOME_PILOT_CONDUIT (retval);
-}
-
-void
-conduit_destroy_gpilot_conduit (GnomePilotConduit *conduit)
-{
- EAddrConduitContext *ctxt;
-
- ctxt = gtk_object_get_data (GTK_OBJECT (conduit),
- "addrconduit_context");
-
- e_addr_context_destroy (ctxt);
-
- gtk_object_destroy (GTK_OBJECT (conduit));
-}
diff --git a/addressbook/conduit/e-address.conduit.in b/addressbook/conduit/e-address.conduit.in
deleted file mode 100644
index 669a506001..0000000000
--- a/addressbook/conduit/e-address.conduit.in
+++ /dev/null
@@ -1,9 +0,0 @@
-<gnome-pilot-conduit version="1.0">
- <conduit id="e_address_conduit" type="shlib" location="@privconduitdir@/libeaddress_conduit.so"/>
- <name value="EAddress"/>
- <conduit-attribute name="description" value="Synchronizes Addressbook with Evolution"/>
- <conduit-attribute name="default-synctype" value="synchronize"/>
- <conduit-attribute name="valid-synctypes" value="synchronize copy_from_pilot copy_to_pilot"/>
- <conduit-attribute name="settings" value="TRUE"/>
- <conduit-attribute name="icon" value="@datadir@/images/evolution/conduits/48_evo-address-conduit.png"/>
-</gnome-pilot-conduit>
diff --git a/addressbook/gui/.cvsignore b/addressbook/gui/.cvsignore
deleted file mode 100644
index 09980ae6ba..0000000000
--- a/addressbook/gui/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-.deps
-.libs
-Makefile
-Makefile.in
-*.lo
-*.la
diff --git a/addressbook/gui/Makefile.am b/addressbook/gui/Makefile.am
deleted file mode 100644
index 4e049a7116..0000000000
--- a/addressbook/gui/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-SUBDIRS = merging contact-editor contact-list-editor widgets search component
diff --git a/addressbook/gui/component/.cvsignore b/addressbook/gui/component/.cvsignore
deleted file mode 100644
index 847efaf29c..0000000000
--- a/addressbook/gui/component/.cvsignore
+++ /dev/null
@@ -1,15 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-evolution-addressbook
-evolution-addressbook.pure
-test-addressbook
-GNOME_Evolution_Addressbook*.server
-GNOME_Evolution_Addressbook*.server.in
-addressbook-marshal.c
-addressbook-marshal.h
-*.schemas \ No newline at end of file
diff --git a/addressbook/gui/component/GNOME_Evolution_Addressbook.server.in.in b/addressbook/gui/component/GNOME_Evolution_Addressbook.server.in.in
deleted file mode 100644
index f57fcb7f09..0000000000
--- a/addressbook/gui/component/GNOME_Evolution_Addressbook.server.in.in
+++ /dev/null
@@ -1,135 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_Factory:@VERSION@"
- type="shlib"
- location="@COMPONENTDIR@/libevolution-addressbook.so">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/ObjectFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution Addressbook"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_VCard_Control:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Addressbook_Factory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Bonobo/Control:1.0"/>
- <item value="IDL:Bonobo/PersistStream:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="bonobo:supported_mime_types" type="stringv">
- <item value="text/vcard"/>
- <item value="text/x-vcard"/>
- </oaf_attribute>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution Addressbook card viewer"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_Component:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Addressbook_Factory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution/Component:@VERSION@"/>
- </oaf_attribute>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution Addressbook component"/>
-
- <oaf_attribute name="evolution:component_alias" type="string" value="contacts"/>
-
- <oaf_attribute name="evolution:menu_label" type="string" _value="C_ontacts"/>
- <oaf_attribute name="evolution:menu_accelerator" type="string" value="*Control*F2"/>
- <oaf_attribute name="evolution:button_label" type="string" _value="Contacts"/>
- <oaf_attribute name="evolution:button_sort_order" type="string" value="-9"/>
- <oaf_attribute name="evolution:button_icon" type="string" value="stock_addressbook"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_AddressWidget:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Addressbook_Factory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:BonoboControl/address-widget:@VERSION@"/>
- <item value="IDL:GNOME/Control:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution Addressbook address viewer"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_AddressPopup:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Addressbook_Factory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:BonoboControl/address-widget:@VERSION@"/>
- <item value="IDL:GNOME/Control:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution Addressbook address pop-up"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_SMime_CertificateManager_ConfigControl:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Addressbook_Factory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution/ConfigControl:@VERSION@"/>
- </oaf_attribute>
-
- <oaf_attribute name="evolution2:config_item:title" type="string"
- _value="Certificates"/>
-
- <oaf_attribute name="evolution2:config_item:description" type="string"
- _value="Manage your S/MIME certificates here"/>
-
- <oaf_attribute name="evolution2:config_item:icon_name" type="string"
- value="stock_lock-ok"/>
-
- <oaf_attribute name="evolution2:config_item:priority" type="string" value="-6"/>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution S/Mime Certificate Management Control"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_Autocompletion_ConfigControl:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Addressbook_Factory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution/ConfigControl:@VERSION@"/>
- </oaf_attribute>
-
- <oaf_attribute name="evolution2:config_item:title" type="string"
- _value="Autocompletion"/>
-
- <oaf_attribute name="evolution2:config_item:description" type="string"
- _value="Configure autocomplete here"/>
-
- <oaf_attribute name="evolution2:config_item:icon_name" type="string"
- value="stock_contact"/>
-
- <oaf_attribute name="evolution2:config_item:type" type="stringv">
- <item value="contacts"/>
- </oaf_attribute>
-
- <oaf_attribute name="evolution2:config_item:priority" type="string" value="-9"/>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution folder settings configuration control"/>
-</oaf_server>
-
-</oaf_info>
diff --git a/addressbook/gui/component/Makefile.am b/addressbook/gui/component/Makefile.am
deleted file mode 100644
index a2798ec665..0000000000
--- a/addressbook/gui/component/Makefile.am
+++ /dev/null
@@ -1,111 +0,0 @@
-INCLUDES = \
- -DG_LOG_DOMAIN=\"evolution-addressbook\" \
- -I$(top_srcdir) \
- -I$(top_builddir) \
- -I$(top_srcdir)/shell \
- -I$(top_builddir)/shell \
- -I$(top_srcdir)/widgets/misc \
- -I$(top_srcdir)/addressbook/util \
- -I$(top_srcdir)/addressbook/gui/contact-editor \
- -I$(top_srcdir)/addressbook/gui/contact-list-editor \
- -I$(top_srcdir)/addressbook/gui/widgets \
- -I$(top_builddir)/a11y/addressbook \
- -DEVOLUTION_DATADIR=\""$(datadir)"\" \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_ETSPECDIR=\""$(etspecdir)"\" \
- -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \
- -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \
- -DEVOLUTION_UIDIR=\""$(evolutionuidir)"\" \
- -DPREFIX=\""$(prefix)"\" \
- $(LDAP_CFLAGS) \
- $(EVOLUTION_ADDRESSBOOK_CFLAGS)
-
-component_LTLIBRARIES = libevolution-addressbook.la
-
-libevolution_addressbook_la_SOURCES = \
- addressbook-component.c \
- addressbook-component.h \
- addressbook-config.c \
- addressbook-config.h \
- addressbook-migrate.c \
- addressbook-migrate.h \
- autocompletion-config.c \
- autocompletion-config.h \
- addressbook.c \
- addressbook.h \
- addressbook-view.c \
- addressbook-view.h \
- component-factory.c
-
-# $(top_builddir)/addressbook/printing/libecontactprint.la
-
-if ENABLE_SMIME
-SMIME_LIB=$(top_builddir)/smime/gui/libevolution-smime.la
-endif
-
-libevolution_addressbook_la_LIBADD = \
- $(SMIME_LIB) \
- $(top_builddir)/addressbook/printing/libecontactprint.la \
- $(top_builddir)/shell/libeshell.la \
- $(top_builddir)/addressbook/gui/merging/libeabbookmerging.la \
- $(top_builddir)/addressbook/gui/widgets/libeabwidgets.la \
- $(top_builddir)/addressbook/gui/search/libeaddressbooksearch.la \
- $(top_builddir)/filter/libfilter.la \
- $(top_builddir)/addressbook/util/libeabutil.la \
- $(top_builddir)/addressbook/gui/contact-editor/libecontacteditor.la \
- $(top_builddir)/addressbook/gui/contact-list-editor/libecontactlisteditor.la \
- $(top_builddir)/widgets/misc/libemiscwidgets.la \
- $(top_builddir)/widgets/menus/libmenus.la \
- $(top_builddir)/a11y/addressbook/libevolution-addressbook-a11y.la \
- $(EVOLUTION_ADDRESSBOOK_LIBS) $(LDAP_LIBS)
-
-
-
-libevolution_addressbook_la_LDFLAGS = -module -avoid-version
-
-# GConf schemas
-
-schemadir = $(GCONF_SCHEMA_FILE_DIR)
-schema_in_files = apps_evolution_addressbook.schemas.in.in
-schema_DATA = $(schema_in_files:.schemas.in.in=-$(BASE_VERSION).schemas)
-%-$(BASE_VERSION).schemas.in: %.schemas.in.in
- cp $< $@
-
-@INTLTOOL_SCHEMAS_RULE@
-
-install-data-local:
- if test -z "$(DESTDIR)" ; then \
- for p in $(schema_DATA) ; do \
- GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $$p; \
- done \
- fi
-
-server_in_files = GNOME_Evolution_Addressbook.server.in.in
-server_DATA = $(server_in_files:.server.in.in=_$(BASE_VERSION).server)
-@EVO_SERVER_RULE@
-@INTLTOOL_SERVER_RULE@
-
-glade_DATA = \
- ldap-config.glade
-
-BUILT_SOURCES = $(server_DATA)
-CLEANFILES = $(BUILT_SOURCES)
-
-EXTRA_DIST = \
- $(glade_DATA) \
- $(schema_in_files) \
- $(server_in_files)
-
-dist-hook:
- cd $(distdir); rm -f $(BUILT_SOURCES)
-
-if ENABLE_PURIFY
-PLINK = $(LIBTOOL) --mode=link $(PURIFY) $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-
-all-local: evolution-addressbook.pure
-
-evolution-addressbook.pure: evolution-addressbook
- @rm -f evolution-addressbook.pure
- $(PLINK) $(evolution_addressbook_LDFLAGS) $(evolution_addressbook_OBJECTS) $(evolution_addressbook_LDADD) $(LIBS)
-
-endif
diff --git a/addressbook/gui/component/addressbook-component.c b/addressbook/gui/component/addressbook-component.c
deleted file mode 100644
index a0c3c58c04..0000000000
--- a/addressbook/gui/component/addressbook-component.c
+++ /dev/null
@@ -1,393 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* addressbook-component.c
- *
- * Copyright (C) 2003 Ettore Perazzoli
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli <ettore@ximian.com>
- */
-
-/* EPFIXME: Add autocompletion setting. */
-
-
-#include <config.h>
-
-#include "addressbook-component.h"
-#include "addressbook-config.h"
-#include "addressbook-migrate.h"
-#include "addressbook-view.h"
-#include "addressbook/gui/contact-editor/eab-editor.h"
-#include "addressbook/gui/widgets/eab-gui-util.h"
-#include "e-util/e-plugin.h"
-#include "addressbook/gui/widgets/eab-popup.h"
-#include "addressbook/gui/widgets/eab-menu.h"
-#include "addressbook/gui/widgets/eab-config.h"
-
-#include "widgets/misc/e-task-bar.h"
-#include "widgets/misc/e-info-label.h"
-
-#include <string.h>
-#include <bonobo/bonobo-i18n.h>
-#include <gtk/gtkimage.h>
-#include <gconf/gconf-client.h>
-#include <gal/util/e-util.h>
-
-#ifdef ENABLE_SMIME
-#include "smime/gui/component.h"
-#endif
-
-#define LDAP_BASE_URI "ldap://"
-#define PERSONAL_RELATIVE_URI "system"
-
-#define PARENT_TYPE bonobo_object_get_type ()
-static BonoboObjectClass *parent_class = NULL;
-
-struct _AddressbookComponentPrivate {
- GConfClient *gconf_client;
- char *base_directory;
-};
-
-static void
-ensure_sources (AddressbookComponent *component)
-{
- GSList *groups;
- ESourceList *source_list;
- ESourceGroup *group;
- ESourceGroup *on_this_computer;
- ESourceGroup *on_ldap_servers;
- ESource *personal_source;
- char *base_uri, *base_uri_proto;
-
- on_this_computer = NULL;
- on_ldap_servers = NULL;
- personal_source = NULL;
-
- if (!e_book_get_addressbooks (&source_list, NULL)) {
- g_warning ("Could not get addressbook source list from GConf!");
- return;
- }
-
- base_uri = g_build_filename (addressbook_component_peek_base_directory (component),
- "addressbook", "local",
- NULL);
-
- base_uri_proto = g_strconcat ("file://", base_uri, NULL);
-
- groups = e_source_list_peek_groups (source_list);
- if (groups) {
- /* groups are already there, we need to search for things... */
- GSList *g;
-
- for (g = groups; g; g = g->next) {
-
- group = E_SOURCE_GROUP (g->data);
-
- if (!on_this_computer && !strcmp (base_uri_proto, e_source_group_peek_base_uri (group)))
- on_this_computer = group;
- else if (!on_ldap_servers && !strcmp (LDAP_BASE_URI, e_source_group_peek_base_uri (group)))
- on_ldap_servers = group;
- }
- }
-
- if (on_this_computer) {
- /* make sure "Personal" shows up as a source under
- this group */
- GSList *sources = e_source_group_peek_sources (on_this_computer);
- GSList *s;
- for (s = sources; s; s = s->next) {
- ESource *source = E_SOURCE (s->data);
- if (!strcmp (PERSONAL_RELATIVE_URI, e_source_peek_relative_uri (source))) {
- personal_source = source;
- break;
- }
- }
- }
- else {
- /* create the local source group */
- group = e_source_group_new (_("On This Computer"), base_uri_proto);
- e_source_list_add_group (source_list, group, -1);
-
- on_this_computer = group;
- }
-
- if (!personal_source) {
- /* Create the default Person addressbook */
- ESource *source = e_source_new (_("Personal"), PERSONAL_RELATIVE_URI);
- e_source_group_add_source (on_this_computer, source, -1);
-
- personal_source = source;
- }
-
- if (!on_ldap_servers) {
- /* Create the LDAP source group */
- group = e_source_group_new (_("On LDAP Servers"), LDAP_BASE_URI);
- e_source_list_add_group (source_list, group, -1);
-
- on_ldap_servers = group;
- }
-
- g_free (base_uri_proto);
- g_free (base_uri);
-}
-
-/* Evolution::Component CORBA methods. */
-
-static void
-impl_createControls (PortableServer_Servant servant,
- Bonobo_Control *corba_sidebar_control,
- Bonobo_Control *corba_view_control,
- Bonobo_Control *corba_statusbar_control,
- CORBA_Environment *ev)
-{
- AddressbookView *view = addressbook_view_new ();
- BonoboControl *sidebar_control;
- BonoboControl *view_control;
- BonoboControl *statusbar_control;
-
- sidebar_control = bonobo_control_new (addressbook_view_peek_sidebar (view));
- view_control = addressbook_view_peek_folder_view (view);
- statusbar_control = bonobo_control_new (addressbook_view_peek_statusbar (view));
-
- *corba_sidebar_control = CORBA_Object_duplicate (BONOBO_OBJREF (sidebar_control), ev);
- *corba_view_control = CORBA_Object_duplicate (BONOBO_OBJREF (view_control), ev);
- *corba_statusbar_control = CORBA_Object_duplicate (BONOBO_OBJREF (statusbar_control), ev);
-}
-
-static GNOME_Evolution_CreatableItemTypeList *
-impl__get_userCreatableItems (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- GNOME_Evolution_CreatableItemTypeList *list = GNOME_Evolution_CreatableItemTypeList__alloc ();
-
- list->_length = 3;
- list->_maximum = list->_length;
- list->_buffer = GNOME_Evolution_CreatableItemTypeList_allocbuf (list->_length);
-
- CORBA_sequence_set_release (list, FALSE);
-
- list->_buffer[0].id = "contact";
- list->_buffer[0].description = _("New Contact");
- list->_buffer[0].menuDescription = _("_Contact");
- list->_buffer[0].tooltip = _("Create a new contact");
- list->_buffer[0].menuShortcut = 'c';
- list->_buffer[0].iconName = "stock_contact";
- list->_buffer[0].type = GNOME_Evolution_CREATABLE_OBJECT;
-
- list->_buffer[1].id = "contact_list";
- list->_buffer[1].description = _("New Contact List");
- list->_buffer[1].menuDescription = _("Contact _List");
- list->_buffer[1].tooltip = _("Create a new contact list");
- list->_buffer[1].menuShortcut = 'l';
- list->_buffer[1].iconName = "stock_contact-list";
- list->_buffer[1].type = GNOME_Evolution_CREATABLE_OBJECT;
-
- list->_buffer[2].id = "address_book";
- list->_buffer[2].description = _("New Address Book");
- list->_buffer[2].menuDescription = _("Address _Book");
- list->_buffer[2].tooltip = _("Create a new address book");
- list->_buffer[2].menuShortcut = 'b';
- list->_buffer[2].iconName = "stock_addressbook";
- list->_buffer[2].type = GNOME_Evolution_CREATABLE_FOLDER;
-
- return list;
-}
-
-static void
-book_loaded_cb (EBook *book, EBookStatus status, gpointer data)
-{
- EContact *contact;
- char *item_type_name = data;
-
- if (status != E_BOOK_ERROR_OK) {
- /* XXX we really need a dialog here, but we don't have
- access to the ESource so we can't use
- eab_load_error_dialog. fun! */
- return;
- }
-
- contact = e_contact_new ();
-
- if (!strcmp (item_type_name, "contact")) {
- eab_show_contact_editor (book, contact, TRUE, TRUE);
- }
- else if (!strcmp (item_type_name, "contact_list")) {
- eab_show_contact_list_editor (book, contact, TRUE, TRUE);
- }
-
- g_object_unref (book);
- g_object_unref (contact);
-
- g_free (item_type_name);
-}
-
-static void
-impl_requestCreateItem (PortableServer_Servant servant,
- const CORBA_char *item_type_name,
- CORBA_Environment *ev)
-{
- AddressbookComponent *addressbook_component = ADDRESSBOOK_COMPONENT (bonobo_object_from_servant (servant));
- AddressbookComponentPrivate *priv;
- EBook *book;
-
- priv = addressbook_component->priv;
-
- if (!item_type_name ||
- (strcmp (item_type_name, "address_book") &&
- strcmp (item_type_name, "contact") &&
- strcmp (item_type_name, "contact_list"))) {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Component_UnknownType, NULL);
- return;
- }
-
- if (!strcmp (item_type_name, "address_book")) {
- addressbook_config_create_new_source (NULL);
- return;
- }
-
- book = e_book_new_default_addressbook (NULL);
- e_book_async_open (book, FALSE, book_loaded_cb, g_strdup (item_type_name));
-}
-
-static void
-impl_upgradeFromVersion (PortableServer_Servant servant, short major, short minor, short revision, CORBA_Environment *ev)
-{
- GError *err = NULL;
-
- if (!addressbook_migrate (addressbook_component_peek (), major, minor, revision, &err)) {
- GNOME_Evolution_Component_UpgradeFailed *failedex;
-
- failedex = GNOME_Evolution_Component_UpgradeFailed__alloc();
- failedex->what = CORBA_string_dup(_("Failed upgrading Addressbook settings or folders."));
- failedex->why = CORBA_string_dup(err->message);
- CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Component_UpgradeFailed, failedex);
- }
-
- if (err)
- g_error_free(err);
-}
-
-static CORBA_boolean
-impl_requestQuit (PortableServer_Servant servant, CORBA_Environment *ev)
-{
- return eab_editor_request_close_all ();
-}
-
-/* GObject methods. */
-
-static void
-impl_dispose (GObject *object)
-{
- AddressbookComponentPrivate *priv = ADDRESSBOOK_COMPONENT (object)->priv;
-
- if (priv->gconf_client != NULL) {
- g_object_unref (priv->gconf_client);
- priv->gconf_client = NULL;
- }
-
- (* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-static void
-impl_finalize (GObject *object)
-{
- AddressbookComponentPrivate *priv = ADDRESSBOOK_COMPONENT (object)->priv;
-
- g_free (priv);
-
- (* G_OBJECT_CLASS (parent_class)->finalize) (object);
-}
-
-
-/* Initialization. */
-
-static void
-addressbook_component_class_init (AddressbookComponentClass *class)
-{
- POA_GNOME_Evolution_Component__epv *epv = &class->epv;
- GObjectClass *object_class = G_OBJECT_CLASS (class);
-
- epv->createControls = impl_createControls;
- epv->_get_userCreatableItems = impl__get_userCreatableItems;
- epv->requestCreateItem = impl_requestCreateItem;
- epv->upgradeFromVersion = impl_upgradeFromVersion;
- epv->requestQuit = impl_requestQuit;
-
- object_class->dispose = impl_dispose;
- object_class->finalize = impl_finalize;
-
- parent_class = g_type_class_peek_parent (class);
-}
-
-static void
-addressbook_component_init (AddressbookComponent *component)
-{
- AddressbookComponentPrivate *priv;
- static int first = TRUE;
-
- priv = g_new0 (AddressbookComponentPrivate, 1);
-
- /* EPFIXME: Should use a custom one instead? */
- priv->gconf_client = gconf_client_get_default ();
-
- priv->base_directory = g_build_filename (g_get_home_dir (), ".evolution", NULL);
-
- component->priv = priv;
-
- ensure_sources (component);
-
-#ifdef ENABLE_SMIME
- smime_component_init ();
-#endif
-
- if (first) {
- first = FALSE;
- e_plugin_hook_register_type(eab_popup_hook_get_type());
- e_plugin_hook_register_type(eab_menu_hook_get_type());
- e_plugin_hook_register_type(eab_config_hook_get_type());
- }
-}
-
-
-/* Public API. */
-
-AddressbookComponent *
-addressbook_component_peek (void)
-{
- static AddressbookComponent *component = NULL;
-
- if (component == NULL)
- component = g_object_new (addressbook_component_get_type (), NULL);
-
- return component;
-}
-
-GConfClient*
-addressbook_component_peek_gconf_client (AddressbookComponent *component)
-{
- g_return_val_if_fail (ADDRESSBOOK_IS_COMPONENT (component), NULL);
-
- return component->priv->gconf_client;
-}
-
-const char *
-addressbook_component_peek_base_directory (AddressbookComponent *component)
-{
- g_return_val_if_fail (ADDRESSBOOK_IS_COMPONENT (component), NULL);
-
- return component->priv->base_directory;
-}
-
-BONOBO_TYPE_FUNC_FULL (AddressbookComponent, GNOME_Evolution_Component, PARENT_TYPE, addressbook_component)
diff --git a/addressbook/gui/component/addressbook-component.h b/addressbook/gui/component/addressbook-component.h
deleted file mode 100644
index de92637a59..0000000000
--- a/addressbook/gui/component/addressbook-component.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* addressbook-component.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli <ettore@ximian.com>
- */
-
-#ifndef _ADDRESSBOOK_COMPONENT_H_
-#define _ADDRESSBOOK_COMPONENT_H_
-
-#include <bonobo/bonobo-object.h>
-
-#include "Evolution.h"
-#include "e-activity-handler.h"
-#include <libedataserver/e-source-list.h>
-
-#define ADDRESSBOOK_TYPE_COMPONENT (addressbook_component_get_type ())
-#define ADDRESSBOOK_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ADDRESSBOOK_TYPE_COMPONENT, AddressbookComponent))
-#define ADDRESSBOOK_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ADDRESSBOOK_TYPE_COMPONENT, AddressbookComponentClass))
-#define ADDRESSBOOK_IS_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ADDRESSBOOK_TYPE_COMPONENT))
-#define ADDRESSBOOK_IS_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), ADDRESSBOOK_TYPE_COMPONENT))
-
-
-typedef struct _AddressbookComponent AddressbookComponent;
-typedef struct _AddressbookComponentPrivate AddressbookComponentPrivate;
-typedef struct _AddressbookComponentClass AddressbookComponentClass;
-
-struct _AddressbookComponent {
- BonoboObject parent;
-
- AddressbookComponentPrivate *priv;
-};
-
-struct _AddressbookComponentClass {
- BonoboObjectClass parent_class;
-
- POA_GNOME_Evolution_Component__epv epv;
-};
-
-
-GType addressbook_component_get_type (void);
-
-AddressbookComponent *addressbook_component_peek (void);
-
-GConfClient *addressbook_component_peek_gconf_client (AddressbookComponent *component);
-const char *addressbook_component_peek_base_directory (AddressbookComponent *component);
-
-#endif /* _ADDRESSBOOK_COMPONENT_H_ */
diff --git a/addressbook/gui/component/addressbook-config.c b/addressbook/gui/component/addressbook-config.c
deleted file mode 100644
index 980ae3bc77..0000000000
--- a/addressbook/gui/component/addressbook-config.c
+++ /dev/null
@@ -1,1129 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Toshok <toshok@ximian.com>
- * Chris Lahey <clahey@ximian.com>
- * Michael Zucchi <notzed@ximian.com>
- * And no doubt others ...
- **/
-
-/*#define STANDALONE*/
-
-#include <config.h>
-
-#include <string.h>
-#include <stdlib.h>
-#include <sys/time.h>
-
-#include <gtk/gtkcombo.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkrange.h>
-#include <gtk/gtktreeview.h>
-#include <gtk/gtkliststore.h>
-#include <gtk/gtkscrolledwindow.h>
-#include <gtk/gtktreeselection.h>
-#include <gtk/gtkcellrenderertext.h>
-#include <gtk/gtkcombobox.h>
-#include <gtk/gtkoptionmenu.h>
-#include <gtk/gtkspinbutton.h>
-#include <gtk/gtkcelllayout.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtk.h>
-#include <libgnome/gnome-i18n.h>
-
-#include <bonobo/bonobo-generic-factory.h>
-
-#include <glade/glade.h>
-
-#include "addressbook.h"
-#include "addressbook-component.h"
-#include "addressbook-config.h"
-
-#include "widgets/misc/e-error.h"
-
-#include "evolution-config-control.h"
-
-#include "addressbook/gui/widgets/eab-config.h"
-
-#define d(x)
-
-#ifdef HAVE_LDAP
-#include "ldap.h"
-#include "ldap_schema.h"
-#endif
-
-#define LDAP_PORT_STRING "389"
-#define LDAPS_PORT_STRING "636"
-
-#define GLADE_FILE_NAME "ldap-config.glade"
-#define CONFIG_CONTROL_FACTORY_ID "OAFIID:GNOME_Evolution_Addressbook_ConfigControlFactory:" BASE_VERSION
-#define LDAP_CONFIG_CONTROL_ID "OAFIID:GNOME_Evolution_LDAPStorage_ConfigControl:" BASE_VERSION
-
-GtkWidget* supported_bases_create_table (char *name, char *string1, char *string2,
- int num1, int num2);
-
-/* default objectclasses */
-#define TOP "top"
-#define PERSON "person"
-#define ORGANIZATIONALPERSON "organizationalPerson"
-#define INETORGPERSON "inetOrgPerson"
-#define EVOLUTIONPERSON "evolutionPerson"
-#define CALENTRY "calEntry"
-
-
-typedef struct _AddressbookSourceDialog AddressbookSourceDialog;
-
-struct _AddressbookSourceDialog {
- GladeXML *gui;
-
- EABConfig *config; /* the config manager */
-
- GtkWidget *window;
-
- /* Source selection (druid only) */
- ESourceList *source_list;
- GSList *menu_source_groups;
- GtkWidget *group_optionmenu;
-
- /* ESource we're currently editing */
- ESource *source;
- /* The original source in edit mode. Also used to flag when we are in edit mode. */
- ESource *original_source;
-
- /* Source group we're creating/editing a source in */
- ESourceGroup *source_group;
-
- /* info page fields */
- GtkWidget *host;
- GtkWidget *auth_optionmenu;
- AddressbookLDAPAuthType auth;
- GtkWidget *auth_principal;
-
- /* connecting page fields */
- GtkWidget *port_combo;
- GtkWidget *ssl_optionmenu;
- AddressbookLDAPSSLType ssl;
-
- /* searching page fields */
- GtkWidget *rootdn;
- AddressbookLDAPScopeType scope;
- GtkWidget *scope_optionmenu;
- GtkWidget *timeout_scale;
- GtkWidget *limit_spinbutton;
-
- /* display name page fields */
- GtkWidget *display_name;
-};
-
-
-
-#ifdef HAVE_LDAP
-
-static char *
-ldap_unparse_auth (AddressbookLDAPAuthType auth_type)
-{
- switch (auth_type) {
- case ADDRESSBOOK_LDAP_AUTH_NONE:
- return "none";
- case ADDRESSBOOK_LDAP_AUTH_SIMPLE_EMAIL:
- return "ldap/simple-email";
- case ADDRESSBOOK_LDAP_AUTH_SIMPLE_BINDDN:
- return "ldap/simple-binddn";
- default:
- g_assert(0);
- return "none";
- }
-}
-
-static AddressbookLDAPAuthType
-ldap_parse_auth (const char *auth)
-{
- if (!auth)
- return ADDRESSBOOK_LDAP_AUTH_NONE;
-
- if (!strcmp (auth, "ldap/simple-email") || !strcmp (auth, "simple"))
- return ADDRESSBOOK_LDAP_AUTH_SIMPLE_EMAIL;
- else if (!strcmp (auth, "ldap/simple-binddn"))
- return ADDRESSBOOK_LDAP_AUTH_SIMPLE_BINDDN;
- else
- return ADDRESSBOOK_LDAP_AUTH_NONE;
-}
-
-static char *
-ldap_unparse_scope (AddressbookLDAPScopeType scope_type)
-{
- switch (scope_type) {
- case ADDRESSBOOK_LDAP_SCOPE_BASE:
- return "base";
- case ADDRESSBOOK_LDAP_SCOPE_ONELEVEL:
- return "one";
- case ADDRESSBOOK_LDAP_SCOPE_SUBTREE:
- return "sub";
- default:
- g_assert(0);
- return "";
- }
-}
-
-static char *
-ldap_unparse_ssl (AddressbookLDAPSSLType ssl_type)
-{
- switch (ssl_type) {
- case ADDRESSBOOK_LDAP_SSL_NEVER:
- return "never";
- case ADDRESSBOOK_LDAP_SSL_WHENEVER_POSSIBLE:
- return "whenever_possible";
- case ADDRESSBOOK_LDAP_SSL_ALWAYS:
- return "always";
- default:
- g_assert(0);
- return "";
- }
-}
-
-static AddressbookLDAPSSLType
-ldap_parse_ssl (const char *ssl)
-{
- if (!ssl)
- return ADDRESSBOOK_LDAP_SSL_WHENEVER_POSSIBLE; /* XXX good default? */
-
- if (!strcmp (ssl, "always"))
- return ADDRESSBOOK_LDAP_SSL_ALWAYS;
- else if (!strcmp (ssl, "never"))
- return ADDRESSBOOK_LDAP_SSL_NEVER;
- else
- return ADDRESSBOOK_LDAP_SSL_WHENEVER_POSSIBLE;
-}
-
-static gboolean
-source_to_uri_parts (ESource *source, gchar **host, gchar **rootdn, AddressbookLDAPScopeType *scope, gint *port)
-{
- gchar *uri;
- LDAPURLDesc *lud;
- gint ldap_error;
-
- g_assert (source);
-
- uri = e_source_get_uri (source);
- ldap_error = ldap_url_parse ((gchar *) uri, &lud);
- g_free (uri);
-
- if (ldap_error != LDAP_SUCCESS)
- return FALSE;
-
- if (host)
- *host = g_strdup (lud->lud_host ? lud->lud_host : "");
- if (rootdn)
- *rootdn = g_strdup (lud->lud_dn ? lud->lud_dn : "");
- if (port)
- *port = lud->lud_port ? lud->lud_port : LDAP_PORT;
- if (scope)
- *scope = lud->lud_scope == LDAP_SCOPE_BASE ? ADDRESSBOOK_LDAP_SCOPE_BASE :
- lud->lud_scope == LDAP_SCOPE_ONELEVEL ? ADDRESSBOOK_LDAP_SCOPE_ONELEVEL :
- lud->lud_scope == LDAP_SCOPE_SUBTREE ? ADDRESSBOOK_LDAP_SCOPE_SUBTREE :
- ADDRESSBOOK_LDAP_SCOPE_ONELEVEL;
-
- ldap_free_urldesc (lud);
- return TRUE;
-}
-
-static gboolean
-source_group_is_remote (ESourceGroup *group)
-{
- return strncmp ("ldap:", e_source_group_peek_base_uri (group), 5) == 0;
-}
-
-/* ldap api foo */
-static LDAP *
-addressbook_ldap_init (GtkWidget *window, ESource *source)
-{
- LDAP *ldap;
- gchar *host;
- gint port;
- int ldap_error;
- int protocol_version = LDAP_VERSION3;
-
- if (!source_to_uri_parts (source, &host, NULL, NULL, &port))
- return NULL;
-
- if (!(ldap = ldap_init (host, port))) {
- e_error_run ((GtkWindow *) window, "addressbook:ldap-init", NULL);
- goto done;
- }
-
- ldap_error = ldap_set_option (ldap, LDAP_OPT_PROTOCOL_VERSION, &protocol_version);
- if (LDAP_OPT_SUCCESS != ldap_error)
- g_warning ("failed to set protocol version to LDAPv3");
-
- /* XXX do TLS if it's configured in */
-
- done:
- g_free (host);
- return ldap;
-}
-
-static gint
-addressbook_ldap_auth (GtkWidget *window, LDAP *ldap)
-{
- gint ldap_error;
-
- /* XXX use auth info from source */
- ldap_error = ldap_simple_bind_s (ldap, NULL, NULL);
- if (LDAP_SUCCESS != ldap_error)
- e_error_run ((GtkWindow *) window, "addressbook:ldap-auth", NULL);
-
- return ldap_error;
-}
-
-static int
-addressbook_root_dse_query (AddressbookSourceDialog *dialog, LDAP *ldap,
- char **attrs, LDAPMessage **resp)
-{
- int ldap_error;
- struct timeval timeout;
-
- timeout.tv_sec = (gint) gtk_adjustment_get_value (GTK_RANGE(dialog->timeout_scale)->adjustment);
- timeout.tv_usec = 0;
-
- ldap_error = ldap_search_ext_s (ldap,
- LDAP_ROOT_DSE, LDAP_SCOPE_BASE,
- "(objectclass=*)",
- attrs, 0, NULL, NULL, &timeout, LDAP_NO_LIMIT, resp);
- if (LDAP_SUCCESS != ldap_error)
- e_error_run (GTK_WINDOW (dialog->window), "addressbook:ldap-search-base", NULL);
-
- return ldap_error;
-}
-
-/* searching page */
-GtkWidget*
-supported_bases_create_table (char *name, char *string1, char *string2, int num1, int num2)
-{
- GtkWidget *table, *scrolled;
- GtkTreeSelection *selection;
- GtkCellRenderer *renderer;
- GtkListStore *model;
-
- scrolled = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled), GTK_SHADOW_IN);
-
- model = gtk_list_store_new (1, G_TYPE_STRING);
- table = gtk_tree_view_new_with_model ((GtkTreeModel *) model);
- renderer = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes ((GtkTreeView *) table, -1, _("Base"), renderer, "text", 0, NULL);
- gtk_tree_view_set_headers_visible ((GtkTreeView *) table, FALSE);
- selection = gtk_tree_view_get_selection ((GtkTreeView *) table);
- gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
-
- gtk_container_add (GTK_CONTAINER (scrolled), table);
- g_object_set_data((GObject *)scrolled, "table", table);
-
- return scrolled;
-}
-
-static gboolean
-do_ldap_root_dse_query (AddressbookSourceDialog *sdialog, GtkListStore *model, ESource *source)
-{
- LDAP *ldap;
- char *attrs[2];
- int ldap_error;
- char **values;
- LDAPMessage *resp;
- int i;
-
- ldap = addressbook_ldap_init (sdialog->window, source);
- if (!ldap)
- return FALSE;
-
- if (LDAP_SUCCESS != addressbook_ldap_auth (sdialog->window, ldap))
- goto fail;
-
- attrs[0] = "namingContexts";
- attrs[1] = NULL;
-
- ldap_error = addressbook_root_dse_query (sdialog, ldap, attrs, &resp);
-
- if (ldap_error != LDAP_SUCCESS)
- goto fail;
-
- values = ldap_get_values (ldap, resp, "namingContexts");
- if (!values || values[0] == NULL) {
- e_error_run (GTK_WINDOW (sdialog->window), "addressbook:ldap-search-base", NULL);
- goto fail;
- }
-
- for (i = 0; values[i]; i++) {
- GtkTreeIter iter;
-
- gtk_list_store_append (model, &iter);
- gtk_list_store_set (model, &iter, 0, values[i], -1);
- }
-
- ldap_value_free (values);
- ldap_unbind_s (ldap);
- return TRUE;
-
- fail:
- ldap_unbind_s (ldap);
- return FALSE;
-}
-
-static void
-search_base_selection_model_changed (GtkTreeSelection *selection, GtkWidget *dialog)
-{
- gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
- GTK_RESPONSE_OK,
- gtk_tree_selection_get_selected(selection, NULL, NULL));
-}
-
-static void
-query_for_supported_bases (GtkWidget *button, AddressbookSourceDialog *sdialog)
-{
- GtkTreeSelection *selection;
- GtkListStore *model;
- GtkTreeView *table;
- GtkWidget *dialog;
- GtkWidget *supported_bases_table;
- GladeXML *gui;
- GtkTreeIter iter;
-
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, "supported-bases-dialog", NULL);
- dialog = glade_xml_get_widget (gui, "supported-bases-dialog");
-
- gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (sdialog->window));
- gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
-
- gtk_widget_ensure_style (dialog);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 0);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area), 12);
-
- supported_bases_table = glade_xml_get_widget (gui, "supported-bases-table");
- gtk_widget_show_all (supported_bases_table);
-
- table = g_object_get_data((GObject *)supported_bases_table, "table");
- model = (GtkListStore *)gtk_tree_view_get_model(table);
- selection = gtk_tree_view_get_selection (table);
- g_signal_connect (selection, "changed", G_CALLBACK (search_base_selection_model_changed), dialog);
- search_base_selection_model_changed (selection, dialog);
-
- if (do_ldap_root_dse_query (sdialog, model, sdialog->source)) {
- gtk_widget_show (dialog);
-
- if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK
- && gtk_tree_selection_get_selected(selection, (GtkTreeModel **)&model, &iter)) {
- char *dn;
-
- gtk_tree_model_get ((GtkTreeModel *)model, &iter, 0, &dn, -1);
- gtk_entry_set_text((GtkEntry *)sdialog->rootdn, dn);
- g_free(dn);
- }
- }
-
- gtk_widget_destroy (dialog);
-}
-
-#endif /* HAVE_LDAP */
-
-GtkWidget*
-addressbook_config_create_new_source (GtkWidget *parent)
-{
- return addressbook_config_edit_source(parent, NULL);
-}
-
-/* ********************************************************************** */
-
-static void
-eabc_type_changed(GtkComboBox *dropdown, AddressbookSourceDialog *sdialog)
-{
- int id = gtk_combo_box_get_active(dropdown);
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- model = gtk_combo_box_get_model(dropdown);
- if (id == -1 || !gtk_tree_model_iter_nth_child(model, &iter, NULL, id))
- return;
-
- /* TODO: when we change the group type, we lose all of the pre-filled dialog info */
-
- gtk_tree_model_get(model, &iter, 1, &sdialog->source_group, -1);
- /* HACK: doesn't work if you don't do this */
- e_source_set_absolute_uri(sdialog->source, NULL);
- e_source_set_group(sdialog->source, sdialog->source_group);
-
- /* BIG HACK: We load the defaults for each type here.
- I guess plugins will have to use the do it in their factory callbacks */
- if (!strncmp(e_source_group_peek_base_uri(sdialog->source_group), "groupwise:", 10)) {
- GSList *l;
- ESource *source;
- char *tmp;
-
- l = e_source_group_peek_sources(sdialog->source_group);
- if (l && l->data ) {
- source = l->data;
- e_source_set_property(sdialog->source, "auth", e_source_get_property(source, "auth"));
- e_source_set_property(sdialog->source, "user", e_source_get_property(source, "user"));
- e_source_set_property(sdialog->source, "user_ssl", e_source_get_property(source, "use_ssl"));
- }
-
- e_source_set_property(sdialog->source, "auth-domain", "Groupwise");
- tmp = g_strconcat (";", e_source_peek_name(sdialog->source), NULL);
- e_source_set_relative_uri (sdialog->source, tmp);
- g_free (tmp);
-#ifdef HAVE_LDAP
- } else if (!strncmp(e_source_group_peek_base_uri(sdialog->source_group), "ldap:", 5)) {
- char *tmp;
-
- tmp = g_strdup_printf ("%s:%s/%s?" /* trigraph prevention */ "?%s",
- "", LDAP_PORT_STRING,
- "",
- "one");
- e_source_set_relative_uri (sdialog->source, tmp);
- g_free (tmp);
- e_source_set_property(sdialog->source, "timeout", "3");
- e_source_set_property(sdialog->source, "limit", "100");
-#endif
- } else {
- e_source_set_relative_uri (sdialog->source, e_source_peek_uid (sdialog->source));
- }
-
- e_config_target_changed((EConfig *)sdialog->config, E_CONFIG_TARGET_CHANGED_REBUILD);
-}
-
-static GtkWidget *
-eabc_general_type(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data)
-{
- AddressbookSourceDialog *sdialog = data;
- GtkComboBox *dropdown;
- GtkCellRenderer *cell;
- GtkListStore *store;
- GtkTreeIter iter;
- GSList *l;
- GtkWidget *w, *label;
- int i, row;
-
- if (old)
- return old;
-
- w = gtk_hbox_new(FALSE, 6);
- label = gtk_label_new_with_mnemonic(_("_Type:"));
- gtk_box_pack_start((GtkBox *)w, label, FALSE, FALSE, 0);
-
- dropdown = (GtkComboBox *)gtk_combo_box_new();
- cell = gtk_cell_renderer_text_new();
- store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER);
- i = 0;
- for (l=sdialog->menu_source_groups;l;l=g_slist_next(l)) {
- ESourceGroup *group = l->data;
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, e_source_group_peek_name(group), 1, group, -1);
- if (e_source_peek_group(sdialog->source) == group)
- row = i;
- i++;
- }
-
- gtk_cell_layout_pack_start((GtkCellLayout *)dropdown, cell, TRUE);
- gtk_cell_layout_set_attributes((GtkCellLayout *)dropdown, cell, "text", 0, NULL);
- gtk_combo_box_set_model(dropdown, (GtkTreeModel *)store);
- gtk_combo_box_set_active(dropdown, -1);
- gtk_combo_box_set_active(dropdown, row);
- g_signal_connect(dropdown, "changed", G_CALLBACK(eabc_type_changed), sdialog);
- gtk_widget_show((GtkWidget *)dropdown);
- gtk_box_pack_start((GtkBox *)w, (GtkWidget *)dropdown, TRUE, TRUE, 0);
- gtk_label_set_mnemonic_widget((GtkLabel *)label, (GtkWidget *)dropdown);
-
- gtk_box_pack_start((GtkBox *)parent, (GtkWidget *)w, FALSE, FALSE, 0);
-
- gtk_widget_show_all(w);
-
- return (GtkWidget *)w;
-}
-
-static void
-name_changed_cb(GtkWidget *w, AddressbookSourceDialog *sdialog)
-{
- e_source_set_name (sdialog->source, gtk_entry_get_text (GTK_ENTRY (sdialog->display_name)));
-}
-
-static void
-offline_status_changed_cb (GtkWidget *widget, AddressbookSourceDialog *sdialog)
-{
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
- e_source_set_property (sdialog->source, "offline_sync", "1");
- else
- e_source_set_property (sdialog->source, "offline_sync", "0");
-
-}
-
-static GtkWidget *
-eabc_general_name(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data)
-{
- AddressbookSourceDialog *sdialog = data;
- const char *uri;
- GtkWidget *w;
- GladeXML *gui;
-
-
- if (old)
- return old;
-
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, item->label, NULL);
- w = glade_xml_get_widget(gui, item->label);
- gtk_box_pack_start((GtkBox *)parent, w, FALSE, FALSE, 0);
-
- sdialog->display_name = glade_xml_get_widget (gui, "account-editor-display-name-entry");
- g_signal_connect(sdialog->display_name, "changed", G_CALLBACK(name_changed_cb), sdialog);
- gtk_entry_set_text((GtkEntry *)sdialog->display_name, e_source_peek_name(sdialog->source));
-
- /* Hardcoded: groupwise can't edit the name (or anything else) */
- if (sdialog->original_source) {
- uri = e_source_group_peek_base_uri (sdialog->source_group);
- if (uri && strncmp(uri, "groupwise:", 10) == 0) {
- gtk_widget_set_sensitive (GTK_WIDGET(sdialog->display_name), FALSE);
- }
- }
-
- g_object_unref(gui);
-
- return w;
-}
-
-
-static GtkWidget *
-eabc_general_offline(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data)
-{
- AddressbookSourceDialog *sdialog = data;
- GtkWidget *offline_setting;
- const char *offline_sync;
- int row;
- gboolean is_local_book;
-
- is_local_book = g_str_has_prefix (e_source_group_peek_base_uri (sdialog->source_group), "file:");
- offline_sync = e_source_get_property (sdialog->source, "offline_sync");
- if (old)
- return old;
- else {
- row = ((GtkTable*)parent)->nrows;
- offline_setting = gtk_check_button_new_with_label (N_("Copy book content locally for offline operation"));
- gtk_widget_show (offline_setting);
- gtk_container_add (GTK_CONTAINER (parent), offline_setting);
- g_signal_connect (offline_setting, "toggled", G_CALLBACK (offline_status_changed_cb), sdialog);
-
- }
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (offline_setting), (offline_sync && g_str_equal (offline_sync, "1")) ? TRUE : FALSE);
- if (is_local_book)
- gtk_widget_hide (offline_setting);
- return offline_setting;
-
-}
-
-#ifdef HAVE_LDAP
-static void
-url_changed(AddressbookSourceDialog *sdialog)
-{
- char *str;
-
- str = g_strdup_printf ("%s:%s/%s?" /* trigraph prevention */ "?%s",
- gtk_entry_get_text (GTK_ENTRY (sdialog->host)),
- gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (sdialog->port_combo)->entry)),
- gtk_entry_get_text (GTK_ENTRY (sdialog->rootdn)),
- ldap_unparse_scope (sdialog->scope));
- e_source_set_relative_uri (sdialog->source, str);
- g_free (str);
-}
-
-static void
-host_changed_cb(GtkWidget *w, AddressbookSourceDialog *sdialog)
-{
- url_changed(sdialog);
-}
-
-static void
-port_entry_changed_cb(GtkWidget *w, AddressbookSourceDialog *sdialog)
-{
- const char *port = gtk_entry_get_text((GtkEntry *)w);
-
- if (!strcmp (port, LDAPS_PORT_STRING)) {
- sdialog->ssl = ADDRESSBOOK_LDAP_SSL_ALWAYS;
- gtk_option_menu_set_history (GTK_OPTION_MENU(sdialog->ssl_optionmenu), sdialog->ssl);
- gtk_widget_set_sensitive (sdialog->ssl_optionmenu, FALSE);
- } else {
- gtk_widget_set_sensitive (sdialog->ssl_optionmenu, TRUE);
- }
-
- url_changed(sdialog);
-}
-
-static void
-ssl_optionmenu_changed_cb(GtkWidget *w, AddressbookSourceDialog *sdialog)
-{
- sdialog->ssl = gtk_option_menu_get_history((GtkOptionMenu *)w);
- e_source_set_property (sdialog->source, "ssl", ldap_unparse_ssl (sdialog->ssl));
-}
-
-
-static GtkWidget *
-eabc_general_host(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data)
-{
- AddressbookSourceDialog *sdialog = data;
- const char *tmp;
- GtkWidget *w;
- char *uri, port[16];
- LDAPURLDesc *lud;
- GladeXML *gui;
-
- if (!source_group_is_remote(sdialog->source_group))
- return NULL;
-
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, item->label, NULL);
- w = glade_xml_get_widget(gui, item->label);
- gtk_box_pack_start((GtkBox *)parent, w, FALSE, FALSE, 0);
-
- uri = e_source_get_uri(sdialog->source);
- if (ldap_url_parse(uri, &lud) != LDAP_SUCCESS)
- lud = NULL;
- g_free(uri);
-
- sdialog->host = glade_xml_get_widget (gui, "server-name-entry");
- gtk_entry_set_text((GtkEntry *)sdialog->host, lud && lud->lud_host ? lud->lud_host : "");
- g_signal_connect (sdialog->host, "changed", G_CALLBACK (host_changed_cb), sdialog);
-
- sdialog->port_combo = glade_xml_get_widget (gui, "port-combo");
- sprintf(port, "%u", lud && lud->lud_port? lud->lud_port : LDAP_PORT);
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (sdialog->port_combo)->entry), port);
- g_signal_connect (GTK_COMBO(sdialog->port_combo)->entry, "changed", G_CALLBACK (port_entry_changed_cb), sdialog);
-
- if (lud)
- ldap_free_urldesc (lud);
-
- sdialog->ssl_optionmenu = glade_xml_get_widget (gui, "ssl-optionmenu");
- tmp = e_source_get_property (sdialog->source, "ssl");
- sdialog->ssl = tmp ? ldap_parse_ssl (tmp) : ADDRESSBOOK_LDAP_SSL_WHENEVER_POSSIBLE;
- gtk_option_menu_set_history (GTK_OPTION_MENU(sdialog->ssl_optionmenu), sdialog->ssl);
- g_signal_connect(sdialog->ssl_optionmenu, "changed", G_CALLBACK(ssl_optionmenu_changed_cb), sdialog);
-
- g_object_unref(gui);
-
- return w;
-}
-
-static void
-auth_entry_changed_cb(GtkWidget *w, AddressbookSourceDialog *sdialog)
-{
- const char *principal = gtk_entry_get_text((GtkEntry *)w);
-
- /* seems messy ... but the api is */
- switch (sdialog->auth) {
- case ADDRESSBOOK_LDAP_AUTH_SIMPLE_BINDDN:
- e_source_set_property(sdialog->source, "email_addr", NULL);
- e_source_set_property(sdialog->source, "binddn", principal);
- break;
- case ADDRESSBOOK_LDAP_AUTH_SIMPLE_EMAIL:
- e_source_set_property(sdialog->source, "binddn", NULL);
- e_source_set_property(sdialog->source, "email_addr", principal);
- break;
- case ADDRESSBOOK_LDAP_AUTH_NONE:
- default:
- e_source_set_property(sdialog->source, "email_addr", NULL);
- e_source_set_property(sdialog->source, "binddn", NULL);
- break;
- }
-}
-
-static void
-auth_optionmenu_changed_cb(GtkWidget *w, AddressbookSourceDialog *sdialog)
-{
- sdialog->auth = gtk_option_menu_get_history((GtkOptionMenu *)w);
- e_source_set_property (sdialog->source, "auth", ldap_unparse_auth (sdialog->auth));
-
- /* make sure the right property is set for the auth - ugh, funny api */
- auth_entry_changed_cb(sdialog->auth_principal, sdialog);
-}
-
-static GtkWidget *
-eabc_general_auth(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data)
-{
- AddressbookSourceDialog *sdialog = data;
- GtkWidget *w;
- const char *tmp;
- GladeXML *gui;
-
- if (!source_group_is_remote(sdialog->source_group))
- return NULL;
-
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, item->label, NULL);
- w = glade_xml_get_widget(gui, item->label);
- gtk_box_pack_start((GtkBox *)parent, w, FALSE, FALSE, 0);
-
- sdialog->auth_optionmenu = glade_xml_get_widget (gui, "auth-optionmenu");
- tmp = e_source_get_property(sdialog->source, "auth");
- sdialog->auth = tmp ? ldap_parse_auth(tmp) : ADDRESSBOOK_LDAP_AUTH_NONE;
- gtk_option_menu_set_history (GTK_OPTION_MENU(sdialog->auth_optionmenu), sdialog->auth);
- g_signal_connect(sdialog->auth_optionmenu, "changed", G_CALLBACK(auth_optionmenu_changed_cb), sdialog);
-
- sdialog->auth_principal = glade_xml_get_widget (gui, "auth-entry");
- switch (sdialog->auth) {
- case ADDRESSBOOK_LDAP_AUTH_SIMPLE_EMAIL:
- tmp = e_source_get_property(sdialog->source, "email_addr");
- break;
- case ADDRESSBOOK_LDAP_AUTH_SIMPLE_BINDDN:
- tmp = e_source_get_property(sdialog->source, "binddn");
- break;
- case ADDRESSBOOK_LDAP_AUTH_NONE:
- default:
- tmp = "";
- break;
- }
- gtk_entry_set_text((GtkEntry *)sdialog->auth_principal, tmp?tmp:"");
- g_signal_connect (sdialog->auth_principal, "changed", G_CALLBACK (auth_entry_changed_cb), sdialog);
-
- g_object_unref(gui);
-
- return w;
-}
-
-static void
-rootdn_changed_cb(GtkWidget *w, AddressbookSourceDialog *sdialog)
-{
- url_changed(sdialog);
-}
-
-static void
-scope_optionmenu_changed_cb(GtkWidget *w, AddressbookSourceDialog *sdialog)
-{
- sdialog->scope = gtk_option_menu_get_history((GtkOptionMenu *)w);
- url_changed(sdialog);
-}
-
-static GtkWidget *
-eabc_details_search(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data)
-{
- AddressbookSourceDialog *sdialog = data;
- GtkWidget *w;
- LDAPURLDesc *lud;
- char *uri;
- GladeXML *gui;
-
- if (!source_group_is_remote(sdialog->source_group))
- return NULL;
-
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, item->label, NULL);
- w = glade_xml_get_widget(gui, item->label);
- gtk_box_pack_start((GtkBox *)parent, w, FALSE, FALSE, 0);
-
- uri = e_source_get_uri(sdialog->source);
- if (ldap_url_parse(uri, &lud) != LDAP_SUCCESS)
- lud = NULL;
- g_free(uri);
-
- sdialog->rootdn = glade_xml_get_widget (gui, "rootdn-entry");
- gtk_entry_set_text((GtkEntry *)sdialog->rootdn, lud && lud->lud_dn ? lud->lud_dn : "");
- g_signal_connect (sdialog->rootdn, "changed", G_CALLBACK (rootdn_changed_cb), sdialog);
-
- sdialog->scope_optionmenu = glade_xml_get_widget (gui, "scope-optionmenu");
- switch (lud->lud_scope) {
- case LDAP_SCOPE_BASE:
- sdialog->scope = ADDRESSBOOK_LDAP_SCOPE_BASE;
- break;
- default:
- case LDAP_SCOPE_ONELEVEL:
- sdialog->scope = ADDRESSBOOK_LDAP_SCOPE_ONELEVEL;
- break;
- case LDAP_SCOPE_SUBTREE:
- sdialog->scope = ADDRESSBOOK_LDAP_SCOPE_SUBTREE;
- break;
- }
- gtk_option_menu_set_history (GTK_OPTION_MENU(sdialog->scope_optionmenu), sdialog->scope);
- g_signal_connect(sdialog->scope_optionmenu, "changed", G_CALLBACK(scope_optionmenu_changed_cb), sdialog);
-
- g_signal_connect (glade_xml_get_widget(gui, "rootdn-button"), "clicked",
- G_CALLBACK(query_for_supported_bases), sdialog);
-
- if (lud)
- ldap_free_urldesc (lud);
-
- g_object_unref(gui);
-
- return w;
-}
-
-static void
-timeout_changed_cb(GtkWidget *w, AddressbookSourceDialog *sdialog)
-{
- char *timeout;
-
- timeout = g_strdup_printf("%f", gtk_adjustment_get_value(((GtkRange *)sdialog->timeout_scale)->adjustment));
- e_source_set_property(sdialog->source, "timeout", timeout);
- g_free(timeout);
-}
-
-static void
-limit_changed_cb(GtkWidget *w, AddressbookSourceDialog *sdialog)
-{
- char limit[16];
-
- sprintf(limit, "%d", gtk_spin_button_get_value_as_int((GtkSpinButton *)sdialog->limit_spinbutton));
- e_source_set_property(sdialog->source, "limit", limit);
-}
-
-static GtkWidget *
-eabc_details_limit(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data)
-{
- AddressbookSourceDialog *sdialog = data;
- GtkWidget *w;
- const char *tmp;
- GladeXML *gui;
-
- if (!source_group_is_remote(sdialog->source_group))
- return NULL;
-
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, item->label, NULL);
- w = glade_xml_get_widget(gui, item->label);
- gtk_box_pack_start((GtkBox *)parent, w, FALSE, FALSE, 0);
-
- sdialog->timeout_scale = glade_xml_get_widget (gui, "timeout-scale");
- tmp = e_source_get_property(sdialog->source, "timeout");
- gtk_adjustment_set_value(((GtkRange *)sdialog->timeout_scale)->adjustment, tmp?g_strtod(tmp, NULL):3.0);
- g_signal_connect (GTK_RANGE(sdialog->timeout_scale)->adjustment, "value_changed", G_CALLBACK (timeout_changed_cb), sdialog);
-
- sdialog->limit_spinbutton = glade_xml_get_widget (gui, "download-limit-spinbutton");
- tmp = e_source_get_property(sdialog->source, "limit");
- gtk_spin_button_set_value((GtkSpinButton *)sdialog->limit_spinbutton, tmp?g_strtod(tmp, NULL):100.0);
- g_signal_connect (sdialog->limit_spinbutton, "changed", G_CALLBACK (limit_changed_cb), sdialog);
-
- g_object_unref(gui);
-
- return w;
-}
-#endif
-
-static EConfigItem eabc_items[] = {
- { E_CONFIG_BOOK, "", },
- { E_CONFIG_PAGE, "00.general", N_("General") },
- { E_CONFIG_SECTION, "00.general/10.display", N_("Addressbook") },
- { E_CONFIG_ITEM, "00.general/10.display/10.name", "hbox122", eabc_general_name },
- { E_CONFIG_ITEM, "00.general/10.display/20.offline", NULL, eabc_general_offline },
-#ifdef HAVE_LDAP
- { E_CONFIG_SECTION, "00.general/20.server", N_("Server Information") },
- { E_CONFIG_ITEM, "00.general/20.server/00.host", "table31", eabc_general_host },
- { E_CONFIG_SECTION, "00.general/30.auth", N_("Authentication") },
- { E_CONFIG_ITEM, "00.general/30.auth/00.auth", "table32", eabc_general_auth },
-
- { E_CONFIG_PAGE, "10.details", N_("Details") },
- { E_CONFIG_SECTION, "10.details/00.search", N_("Searching") },
- { E_CONFIG_ITEM, "10.details/00.search/00.search", "table33", eabc_details_search },
- { E_CONFIG_SECTION, "10.details/10.limit", N_("Downloading") },
- { E_CONFIG_ITEM, "10.details/10.limit/00.limit", "table34", eabc_details_limit },
-#endif
- { 0 },
-};
-
-/* items needed for the 'new addressbook' window */
-static EConfigItem eabc_new_items[] = {
- { E_CONFIG_ITEM, "00.general/10.display/00.type", NULL, eabc_general_type },
- { 0 },
-};
-
-static void
-eabc_commit(EConfig *ec, GSList *items, void *data)
-{
- AddressbookSourceDialog *sdialog = data;
- xmlNodePtr xml;
-#if d(!)0
- char *txt;
-#endif
- if (sdialog->original_source) {
- d(printf("committing addressbook changes\n"));
-
- /* these api's kinda suck */
- xml = xmlNewNode(NULL, "dummy");
- e_source_dump_to_xml_node(sdialog->source, xml);
- e_source_update_from_xml_node(sdialog->original_source, xml->children, NULL);
- xmlFreeNode(xml);
-#if d(!)0
- txt = e_source_to_standalone_xml(sdialog->original_source);
- printf("source is now:\n%s\n", txt);
- g_free(txt);
-#endif
- } else {
- d(printf("committing new source\n"));
- e_source_group_add_source(sdialog->source_group, sdialog->source, -1);
- e_source_list_sync(sdialog->source_list, NULL);
- }
-
-#if d(!)0
- txt = e_source_to_standalone_xml(sdialog->source);
- printf("running source is now:\n%s\n", txt);
- g_free(txt);
-#endif
-}
-
-static void
-eabc_free(EConfig *ec, GSList *items, void *data)
-{
- AddressbookSourceDialog *sdialog = data;
-
- g_slist_free(items);
-
- g_object_unref(sdialog->source);
- if (sdialog->original_source)
- g_object_unref(sdialog->original_source);
- if (sdialog->source_list)
- g_object_unref(sdialog->source_list);
- g_slist_free(sdialog->menu_source_groups);
-
- g_object_unref(sdialog->gui);
-
- g_free(sdialog);
-}
-
-static gboolean
-eabc_check_complete(EConfig *ec, const char *pageid, void *data)
-{
- AddressbookSourceDialog *sdialog = data;
- int valid = TRUE;
- const char *tmp;
- ESource *source;
-
- d(printf("check complete, pageid = '%s'\n", pageid?pageid:"<all>"));
- /* have name, and unique */
- tmp = e_source_peek_name(sdialog->source);
- valid = tmp && tmp[0] != 0
- && ((source = e_source_group_peek_source_by_name(sdialog->source_group, tmp)) == NULL
- || source == sdialog->original_source);
-
-#ifdef HAVE_LDAP
- if (valid && source_group_is_remote(sdialog->source_group)) {
- char *uri = e_source_get_uri(sdialog->source);
- LDAPURLDesc *lud;
-
- /* check host and port set */
- if (ldap_url_parse(uri, &lud) == LDAP_SUCCESS) {
- valid = lud->lud_host != NULL
- && lud->lud_host[0] != 0
- && lud->lud_port != 0;
- ldap_free_urldesc (lud);
- } else
- valid = FALSE;
- g_free(uri);
-
- /* check auth name provided if auth set */
- if (valid && (tmp = e_source_get_property(sdialog->source, "auth"))) {
- switch (ldap_parse_auth(tmp)) {
- case ADDRESSBOOK_LDAP_AUTH_SIMPLE_EMAIL:
- tmp = e_source_get_property(sdialog->source, "email_addr");
- break;
- case ADDRESSBOOK_LDAP_AUTH_SIMPLE_BINDDN:
- tmp = e_source_get_property(sdialog->source, "binddn");
- break;
- default:
- tmp = "dummy";
- break;
- }
- valid = tmp && tmp[0];
- }
-
- /* check timeout isn't too short (why don't we just force it?) */
- if (valid) {
- tmp = e_source_get_property(sdialog->source, "timeout");
- valid = tmp && g_strtod(tmp, NULL) > 0.0;
- }
- }
-#endif
- return valid;
-}
-
-/* debug only: */
-#if d(!)0
-static void
-source_changed(ESource *source, AddressbookSourceDialog *sdialog)
-{
- char *xml;
-
- xml = e_source_to_standalone_xml(source);
- printf("source changed:\n%s\n", xml);
- g_free(xml);
-}
-#endif
-
-GtkWidget*
-addressbook_config_edit_source (GtkWidget *parent, ESource *source)
-{
- AddressbookSourceDialog *sdialog = g_new0 (AddressbookSourceDialog, 1);
- EABConfig *ec;
- int i;
- GSList *items = NULL;
- EABConfigTargetSource *target;
- char *xml;
-
- sdialog->gui = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, "account-editor-notebook", NULL);
-
- if (source) {
- sdialog->original_source = source;
- g_object_ref(source);
- sdialog->source_group = e_source_peek_group (source);
- xml = e_source_to_standalone_xml(source);
- sdialog->source = e_source_new_from_standalone_xml(xml);
- g_free(xml);
- } else {
- GConfClient *gconf;
- GSList *l;
-
- sdialog->source = e_source_new("", "");
- gconf = gconf_client_get_default();
- sdialog->source_list = e_source_list_new_for_gconf(gconf, "/apps/evolution/addressbook/sources");
- l = e_source_list_peek_groups(sdialog->source_list);
- if (!l) {
- g_warning ("Addressbook source groups are missing! Check your GConf setup.");
- g_free (sdialog);
- return NULL;
- }
-
- sdialog->menu_source_groups = g_slist_copy(l);
-#ifndef HAVE_LDAP
- for (;l;l = g_slist_next(l))
- if (!strncmp("ldap:", e_source_group_peek_base_uri(l->data), 5))
- sdialog->menu_source_groups = g_slist_remove (sdialog->menu_source_groups, l->data);
-#endif
- sdialog->source_group = (ESourceGroup *)sdialog->menu_source_groups->data;
- for (i=0;eabc_new_items[i].path;i++)
- items = g_slist_prepend(items, &eabc_new_items[i]);
- g_object_unref(gconf);
- }
-
- /* HACK: doesn't work if you don't do this */
- e_source_set_absolute_uri(sdialog->source, NULL);
- e_source_set_group(sdialog->source, sdialog->source_group);
-
-#if d(!)0
- xml = e_source_to_standalone_xml(sdialog->source);
- printf("but working standalone xml: %s\n", xml);
- g_free(xml);
- g_signal_connect(sdialog->source, "changed", source_changed, sdialog);
-#endif
-
- sdialog->config = ec = eab_config_new(E_CONFIG_BOOK, "com.novell.evolution.addressbook.config.accountEditor");
-
- for (i=0;eabc_items[i].path;i++)
- items = g_slist_prepend(items, &eabc_items[i]);
-
- e_config_add_items((EConfig *)ec, items, eabc_commit, NULL, eabc_free, sdialog);
- e_config_add_page_check((EConfig *)ec, NULL, eabc_check_complete, sdialog);
-
- target = eab_config_target_new_source(ec, sdialog->source);
- e_config_set_target((EConfig *)ec, (EConfigTarget *)target);
-
- if(source)
- sdialog->window = e_config_create_window((EConfig *)ec, NULL, _("Address Book Properties"));
- else
- sdialog->window = e_config_create_window((EConfig *)ec, NULL, _("New Address Book"));
-
-
- /* forces initial validation */
- if (!sdialog->original_source)
- e_config_target_changed((EConfig *)ec, E_CONFIG_TARGET_CHANGED_STATE);
-
- return sdialog->window;
-}
diff --git a/addressbook/gui/component/addressbook-config.h b/addressbook/gui/component/addressbook-config.h
deleted file mode 100644
index 8818fd08d7..0000000000
--- a/addressbook/gui/component/addressbook-config.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* addressbook-storage.h
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Authors:
- * Chris Toshok <toshok@ximian.com>
- * Chris Lahey <clahey@ximian.com>
- **/
-
-#ifndef __ADDRESSBOOK_CONFIG_H__
-#define __ADDRESSBOOK_CONFIG_H__
-
-#include "evolution-config-control.h"
-
-typedef enum {
- ADDRESSBOOK_LDAP_AUTH_NONE,
- ADDRESSBOOK_LDAP_AUTH_SIMPLE_EMAIL,
- ADDRESSBOOK_LDAP_AUTH_SIMPLE_BINDDN,
-} AddressbookLDAPAuthType;
-
-typedef enum {
- ADDRESSBOOK_LDAP_SCOPE_ONELEVEL,
- ADDRESSBOOK_LDAP_SCOPE_SUBTREE,
- ADDRESSBOOK_LDAP_SCOPE_BASE,
- ADDRESSBOOK_LDAP_SCOPE_LAST
-} AddressbookLDAPScopeType;
-
-typedef enum {
- ADDRESSBOOK_LDAP_SSL_ALWAYS,
- ADDRESSBOOK_LDAP_SSL_WHENEVER_POSSIBLE,
- ADDRESSBOOK_LDAP_SSL_NEVER
-} AddressbookLDAPSSLType;
-
-GtkWidget* addressbook_config_edit_source (GtkWidget *parent, ESource *source);
-GtkWidget* addressbook_config_create_new_source (GtkWidget *parent);
-
-#endif /* __ADDRESSBOOK_CONFIG_H__ */
diff --git a/addressbook/gui/component/addressbook-migrate.c b/addressbook/gui/component/addressbook-migrate.c
deleted file mode 100644
index e2933c2de6..0000000000
--- a/addressbook/gui/component/addressbook-migrate.c
+++ /dev/null
@@ -1,1201 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2004, Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Chris Toshok (toshok@ximian.com)
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <errno.h>
-
-#include "addressbook-migrate.h"
-#include <libebook/e-destination.h>
-#include <libebook/e-book.h>
-#include <libgnome/gnome-i18n.h>
-#include <gal/util/e-util.h>
-#include <gal/util/e-xml-utils.h>
-#include <gtk/gtkwidget.h>
-#include <gtk/gtkvbox.h>
-#include <gtk/gtkmain.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkprogressbar.h>
-#include <e-util/e-folder-map.h>
-
-/*#define SLOW_MIGRATION*/
-
-typedef struct {
- /* this hash table maps old folder uris to new uids. It's
- build in migrate_contact_folder and it's used in
- migrate_completion_folders. */
- GHashTable *folder_uid_map;
-
- ESourceList *source_list;
-
- AddressbookComponent *component;
-
- GtkWidget *window;
- GtkWidget *label;
- GtkWidget *folder_label;
- GtkWidget *progress;
-} MigrationContext;
-
-static void
-setup_progress_dialog (MigrationContext *context)
-{
- GtkWidget *vbox, *hbox;
-
- context->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title (GTK_WINDOW (context->window), _("Migrating..."));
- gtk_window_set_modal (GTK_WINDOW (context->window), TRUE);
- gtk_container_set_border_width (GTK_CONTAINER (context->window), 6);
-
- vbox = gtk_vbox_new (FALSE, 6);
- gtk_widget_show (vbox);
- gtk_container_add (GTK_CONTAINER (context->window), vbox);
-
- context->label = gtk_label_new ("");
- gtk_label_set_line_wrap (GTK_LABEL (context->label), TRUE);
- gtk_widget_show (context->label);
- gtk_box_pack_start_defaults (GTK_BOX (vbox), context->label);
-
- hbox = gtk_hbox_new (FALSE, 6);
- gtk_widget_show (hbox);
- gtk_box_pack_start_defaults (GTK_BOX (vbox), hbox);
-
- context->folder_label = gtk_label_new ("");
- gtk_widget_show (context->folder_label);
- gtk_box_pack_start_defaults (GTK_BOX (hbox), context->folder_label);
-
- context->progress = gtk_progress_bar_new ();
- gtk_widget_show (context->progress);
- gtk_box_pack_start_defaults (GTK_BOX (hbox), context->progress);
-
- gtk_widget_show (context->window);
-}
-
-static void
-dialog_close (MigrationContext *context)
-{
- gtk_widget_destroy (context->window);
-}
-
-static void
-dialog_set_label (MigrationContext *context, const char *str)
-{
- gtk_label_set_text (GTK_LABEL (context->label), str);
-
- while (gtk_events_pending ())
- gtk_main_iteration ();
-
-#ifdef SLOW_MIGRATION
- sleep (1);
-#endif
-}
-
-static void
-dialog_set_folder_name (MigrationContext *context, const char *folder_name)
-{
- char *text;
-
- text = g_strdup_printf (_("Migrating `%s':"), folder_name);
- gtk_label_set_text (GTK_LABEL (context->folder_label), text);
- g_free (text);
-
- gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (context->progress), 0.0);
-
- while (gtk_events_pending ())
- gtk_main_iteration ();
-
-#ifdef SLOW_MIGRATION
- sleep (1);
-#endif
-}
-
-static void
-dialog_set_progress (MigrationContext *context, double percent)
-{
- char text[5];
-
- snprintf (text, sizeof (text), "%d%%", (int) (percent * 100.0f));
-
- gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (context->progress), percent);
- gtk_progress_bar_set_text (GTK_PROGRESS_BAR (context->progress), text);
-
- while (gtk_events_pending ())
- gtk_main_iteration ();
-
-#ifdef SLOW_MIGRATION
- sleep (1);
-#endif
-}
-
-static gboolean
-check_for_conflict (ESourceGroup *group, char *name)
-{
- GSList *sources;
- GSList *s;
-
- sources = e_source_group_peek_sources (group);
-
- for (s = sources; s; s = s->next) {
- ESource *source = E_SOURCE (s->data);
-
- if (!strcmp (e_source_peek_name (source), name))
- return TRUE;
- }
-
- return FALSE;
-}
-
-static char *
-get_source_name (ESourceGroup *group, const char *path)
-{
- char **p = g_strsplit (path, "/", 0);
- int i, j, starting_index;
- int num_elements;
- gboolean conflict;
- GString *s = g_string_new ("");
-
- for (i = 0; p[i]; i ++) ;
-
- num_elements = i;
- i--;
-
- /* p[i] is now the last path element */
-
- /* check if it conflicts */
- starting_index = i;
- do {
- g_string_assign (s, "");
- for (j = starting_index; j < num_elements; j += 2) {
- if (j != starting_index)
- g_string_append_c (s, '_');
- g_string_append (s, p[j]);
- }
-
- conflict = check_for_conflict (group, s->str);
-
-
- /* if there was a conflict back up 2 levels (skipping the /subfolder/ element) */
- if (conflict)
- starting_index -= 2;
-
- /* we always break out if we can't go any further,
- regardless of whether or not we conflict. */
- if (starting_index < 0)
- break;
-
- } while (conflict);
-
- return g_string_free (s, FALSE);
-}
-
-static void
-add_to_notes (EContact *contact, EContactField field)
-{
- const gchar *old_text;
- const gchar *field_text;
- gchar *new_text;
-
- old_text = e_contact_get_const (contact, E_CONTACT_NOTE);
- if (old_text && strstr (old_text, e_contact_pretty_name (field)))
- return;
-
- field_text = e_contact_get_const (contact, field);
- if (!field_text || !*field_text)
- return;
-
- new_text = g_strdup_printf ("%s%s%s: %s",
- old_text ? old_text : "",
- old_text && *old_text &&
- *(old_text + strlen (old_text) - 1) != '\n' ? "\n" : "",
- e_contact_pretty_name (field), field_text);
- e_contact_set (contact, E_CONTACT_NOTE, new_text);
- g_free (new_text);
-}
-
-static void
-migrate_contacts (MigrationContext *context, EBook *old_book, EBook *new_book)
-{
- EBookQuery *query = e_book_query_any_field_contains ("");
- GList *l, *contacts;
- int num_added = 0;
- int num_contacts;
-
- /* both books are loaded, start the actual migration */
- e_book_get_contacts (old_book, query, &contacts, NULL);
-
- num_contacts = g_list_length (contacts);
- for (l = contacts; l; l = l->next) {
- EContact *contact = l->data;
- GError *e = NULL;
- GList *attrs, *attr;
-
- /* do some last minute massaging of the contact's attributes */
-
- attrs = e_vcard_get_attributes (E_VCARD (contact));
- for (attr = attrs; attr;) {
- EVCardAttribute *a = attr->data;
-
- /* evo 1.4 used the non-standard X-EVOLUTION-OFFICE attribute,
- evo 1.5 uses the third element in the ORG list attribute. */
- if (!strcmp ("X-EVOLUTION-OFFICE", e_vcard_attribute_get_name (a))) {
- GList *v = e_vcard_attribute_get_values (a);
- GList *next_attr;
-
- if (v && v->data)
- e_contact_set (contact, E_CONTACT_OFFICE, v->data);
-
- next_attr = attr->next;
- e_vcard_remove_attribute (E_VCARD (contact), a);
- attr = next_attr;
- }
- /* evo 1.4 didn't put TYPE=VOICE in for phone numbers.
- evo 1.5 does.
-
- so we search through the attribute params for
- either TYPE=VOICE or TYPE=FAX. If we find
- either we do nothing. If we find neither, we
- add TYPE=VOICE.
- */
- else if (!strcmp ("TEL", e_vcard_attribute_get_name (a))) {
- GList *params, *param;
- gboolean found = FALSE;
-
- params = e_vcard_attribute_get_params (a);
- for (param = params; param; param = param->next) {
- EVCardAttributeParam *p = param->data;
- if (!strcmp (EVC_TYPE, e_vcard_attribute_param_get_name (p))) {
- GList *v = e_vcard_attribute_param_get_values (p);
- if (v && v->data)
- if (!strcmp ("VOICE", v->data)
- || !strcmp ("FAX", v->data))
- found = TRUE;
- }
- }
-
- if (!found)
- e_vcard_attribute_add_param_with_value (a,
- e_vcard_attribute_param_new (EVC_TYPE),
- "VOICE");
- attr = attr->next;
- }
- /* Replace "POSTAL" (1.4) addresses with "OTHER" (1.5) */
- else if (!strcmp ("ADR", e_vcard_attribute_get_name (a))) {
- GList *params, *param;
- gboolean found = FALSE;
- EVCardAttributeParam *p;
-
- params = e_vcard_attribute_get_params (a);
- for (param = params; param; param = param->next) {
- p = param->data;
- if (!strcmp (EVC_TYPE, e_vcard_attribute_param_get_name (p))) {
- GList *v = e_vcard_attribute_param_get_values (p);
- if (v && v->data && !strcmp ("POSTAL", v->data)) {
- found = TRUE;
- break;
- }
- }
- }
-
- if (found) {
- e_vcard_attribute_param_remove_values (p);
- e_vcard_attribute_param_add_value (p, "OTHER");
- }
-
- attr = attr->next;
- }
- /* this is kinda gross. The new vcard parser
- needs ';'s to be escaped by \'s. but the
- 1.4 vcard generator would put unescaped xml
- (including entities like &gt;) in the value
- of attributes, so we need to go through and
- escape those ';'s. */
- else if (!strcmp ("EMAIL", e_vcard_attribute_get_name (a))) {
- GList *v = e_vcard_attribute_get_values (a);
-
- if (v && v->data) {
- if (!strncmp ((char*)v->data, "<?xml", 5)) {
- /* k, this is the nasty part. we glomb all the
- value strings back together again (if there is
- more than one), then work our magic */
- GString *str = g_string_new ("");
- while (v) {
- g_string_append (str, v->data);
- if (v->next)
- g_string_append_c (str, ';');
- v = v->next;
- }
-
- e_vcard_attribute_remove_values (a);
- e_vcard_attribute_add_value (a, str->str);
- g_string_free (str, TRUE);
- }
- }
-
- attr = attr->next;
- }
- else {
- attr = attr->next;
- }
- }
-
- if (!e_book_add_contact (new_book,
- contact,
- &e))
- g_warning ("contact add failed: `%s'", e->message);
-
- num_added ++;
-
- dialog_set_progress (context, (double)num_added / num_contacts);
- }
-
- g_list_foreach (contacts, (GFunc)g_object_unref, NULL);
- g_list_free (contacts);
-}
-
-static void
-migrate_contact_folder_to_source (MigrationContext *context, char *old_path, ESource *new_source)
-{
- char *old_uri = g_strdup_printf ("file://%s", old_path);
- GError *e = NULL;
-
- EBook *old_book = NULL, *new_book = NULL;
- ESource *old_source;
- ESourceGroup *group;
-
- group = e_source_group_new ("", old_uri);
- old_source = e_source_new ("", "");
- e_source_group_add_source (group, old_source, -1);
-
- dialog_set_folder_name (context, e_source_peek_name (new_source));
-
- old_book = e_book_new (old_source, &e);
- if (!old_book
- || !e_book_open (old_book, TRUE, &e)) {
- g_warning ("failed to load source book for migration: `%s'", e->message);
- goto finish;
- }
-
- new_book = e_book_new (new_source, &e);
- if (!new_book
- || !e_book_open (new_book, FALSE, &e)) {
- g_warning ("failed to load destination book for migration: `%s'", e->message);
- goto finish;
- }
-
- migrate_contacts (context, old_book, new_book);
-
- finish:
- g_object_unref (old_source);
- g_object_unref (group);
- if (old_book)
- g_object_unref (old_book);
- if (new_book)
- g_object_unref (new_book);
- g_free (old_uri);
-}
-
-static void
-migrate_contact_folder (MigrationContext *context, char *old_path, ESourceGroup *dest_group, char *source_name)
-{
- ESource *new_source;
-
- new_source = e_source_new (source_name, source_name);
- e_source_set_relative_uri (new_source, e_source_peek_uid (new_source));
- e_source_group_add_source (dest_group, new_source, -1);
-
- g_hash_table_insert (context->folder_uid_map, g_strdup (old_path), g_strdup (e_source_peek_uid (new_source)));
-
- migrate_contact_folder_to_source (context, old_path, new_source);
-
- g_object_unref (new_source);
-}
-
-#define LDAP_BASE_URI "ldap://"
-#define PERSONAL_RELATIVE_URI "system"
-
-static void
-create_groups (MigrationContext *context,
- ESourceGroup **on_this_computer,
- ESourceGroup **on_ldap_servers,
- ESource **personal_source)
-{
- GSList *groups;
- ESourceGroup *group;
- char *base_uri, *base_uri_proto;
-
- *on_this_computer = NULL;
- *on_ldap_servers = NULL;
- *personal_source = NULL;
-
- base_uri = g_build_filename (addressbook_component_peek_base_directory (context->component),
- "addressbook", "local",
- NULL);
-
- base_uri_proto = g_strconcat ("file://", base_uri, NULL);
-
- groups = e_source_list_peek_groups (context->source_list);
- if (groups) {
- /* groups are already there, we need to search for things... */
- GSList *g;
-
- for (g = groups; g; g = g->next) {
-
- group = E_SOURCE_GROUP (g->data);
-
- if (!*on_this_computer && !strcmp (base_uri_proto, e_source_group_peek_base_uri (group)))
- *on_this_computer = g_object_ref (group);
- else if (!*on_ldap_servers && !strcmp (LDAP_BASE_URI, e_source_group_peek_base_uri (group)))
- *on_ldap_servers = g_object_ref (group);
- }
- }
-
- if (*on_this_computer) {
- /* make sure "Personal" shows up as a source under
- this group */
- GSList *sources = e_source_group_peek_sources (*on_this_computer);
- GSList *s;
- for (s = sources; s; s = s->next) {
- ESource *source = E_SOURCE (s->data);
- if (!strcmp (PERSONAL_RELATIVE_URI, e_source_peek_relative_uri (source))) {
- *personal_source = g_object_ref (source);
- break;
- }
- }
- }
- else {
- /* create the local source group */
- group = e_source_group_new (_("On This Computer"), base_uri_proto);
- e_source_list_add_group (context->source_list, group, -1);
-
- *on_this_computer = group;
- }
-
- if (!*personal_source) {
- /* Create the default Person addressbook */
- ESource *source = e_source_new (_("Personal"), PERSONAL_RELATIVE_URI);
- e_source_group_add_source (*on_this_computer, source, -1);
-
- *personal_source = source;
- }
-
- if (!*on_ldap_servers) {
- /* Create the LDAP source group */
- group = e_source_group_new (_("On LDAP Servers"), LDAP_BASE_URI);
- e_source_list_add_group (context->source_list, group, -1);
-
- *on_ldap_servers = group;
- }
-
- g_free (base_uri_proto);
- g_free (base_uri);
-}
-
-static gboolean
-migrate_local_folders (MigrationContext *context, ESourceGroup *on_this_computer, ESource *personal_source)
-{
- char *old_path = NULL;
- GSList *dirs, *l;
- char *local_contact_folder = NULL;
-
- old_path = g_strdup_printf ("%s/evolution/local", g_get_home_dir ());
-
- dirs = e_folder_map_local_folders (old_path, "contacts");
-
- /* migrate the local addressbook first, to local/system */
- local_contact_folder = g_build_filename (g_get_home_dir (),
- "evolution", "local", "Contacts",
- NULL);
-
- for (l = dirs; l; l = l->next) {
- char *source_name;
- /* we handle the system folder differently */
- if (personal_source && !strcmp ((char*)l->data, local_contact_folder)) {
- g_hash_table_insert (context->folder_uid_map, g_strdup (l->data), g_strdup (e_source_peek_uid (personal_source)));
- migrate_contact_folder_to_source (context, local_contact_folder, personal_source);
- continue;
- }
-
- source_name = get_source_name (on_this_computer, (char*)l->data);
- migrate_contact_folder (context, l->data, on_this_computer, source_name);
- g_free (source_name);
- }
-
- g_slist_foreach (dirs, (GFunc)g_free, NULL);
- g_slist_free (dirs);
- g_free (local_contact_folder);
- g_free (old_path);
-
- return TRUE;
-}
-
-static char *
-get_string_child (xmlNode *node,
- const char *name)
-{
- xmlNode *p;
- xmlChar *xml_string;
- char *retval;
-
- p = e_xml_get_child_by_name (node, (xmlChar *) name);
- if (p == NULL)
- return NULL;
-
- p = e_xml_get_child_by_name (p, (xmlChar *) "text");
- if (p == NULL) /* there's no text between the tags, return the empty string */
- return g_strdup("");
-
- xml_string = xmlNodeListGetString (node->doc, p, 1);
- retval = g_strdup ((char *) xml_string);
- xmlFree (xml_string);
-
- return retval;
-}
-
-static int
-get_integer_child (xmlNode *node,
- const char *name,
- int defval)
-{
- xmlNode *p;
- xmlChar *xml_string;
- int retval;
-
- p = e_xml_get_child_by_name (node, (xmlChar *) name);
- if (p == NULL)
- return defval;
-
- p = e_xml_get_child_by_name (p, (xmlChar *) "text");
- if (p == NULL) /* there's no text between the tags, return the default */
- return defval;
-
- xml_string = xmlNodeListGetString (node->doc, p, 1);
- retval = atoi (xml_string);
- xmlFree (xml_string);
-
- return retval;
-}
-
-static gboolean
-migrate_ldap_servers (MigrationContext *context, ESourceGroup *on_ldap_servers)
-{
- char *sources_xml = g_strdup_printf ("%s/evolution/addressbook-sources.xml",
- g_get_home_dir ());
-
- printf ("trying to migrate from %s\n", sources_xml);
-
- if (g_file_test (sources_xml, G_FILE_TEST_EXISTS)) {
- xmlDoc *doc = xmlParseFile (sources_xml);
- xmlNode *root;
- xmlNode *child;
- int num_contactservers;
- int servernum;
-
- if (!doc)
- return FALSE;
-
- root = xmlDocGetRootElement (doc);
- if (root == NULL || strcmp (root->name, "addressbooks") != 0) {
- xmlFreeDoc (doc);
- return FALSE;
- }
-
- /* count the number of servers, so we can give progress */
- num_contactservers = 0;
- for (child = root->children; child; child = child->next) {
- if (!strcmp (child->name, "contactserver")) {
- num_contactservers++;
- }
- }
- printf ("found %d contact servers to migrate\n", num_contactservers);
-
- dialog_set_folder_name (context, _("LDAP Servers"));
-
- servernum = 0;
- for (child = root->children; child; child = child->next) {
- if (!strcmp (child->name, "contactserver")) {
- char *port, *host, *rootdn, *scope, *authmethod, *ssl;
- char *emailaddr, *binddn, *limitstr;
- int limit;
- char *name, *description;
- GString *uri = g_string_new ("");
- ESource *source;
-
- name = get_string_child (child, "name");
- description = get_string_child (child, "description");
- port = get_string_child (child, "port");
- host = get_string_child (child, "host");
- rootdn = get_string_child (child, "rootdn");
- scope = get_string_child (child, "scope");
- authmethod = get_string_child (child, "authmethod");
- ssl = get_string_child (child, "ssl");
- emailaddr = get_string_child (child, "emailaddr");
- binddn = get_string_child (child, "binddn");
- limit = get_integer_child (child, "limit", 100);
- limitstr = g_strdup_printf ("%d", limit);
-
- g_string_append_printf (uri,
- "%s:%s/%s?"/*trigraph prevention*/"?%s",
- host, port, rootdn, scope);
-
- source = e_source_new (name, uri->str);
- e_source_set_property (source, "description", description);
- e_source_set_property (source, "limit", limitstr);
- e_source_set_property (source, "ssl", ssl);
- e_source_set_property (source, "auth", authmethod);
- if (emailaddr)
- e_source_set_property (source, "email_addr", emailaddr);
- if (binddn)
- e_source_set_property (source, "binddn", binddn);
-
- e_source_group_add_source (on_ldap_servers, source, -1);
-
- g_string_free (uri, TRUE);
- g_free (port);
- g_free (host);
- g_free (rootdn);
- g_free (scope);
- g_free (authmethod);
- g_free (ssl);
- g_free (emailaddr);
- g_free (binddn);
- g_free (limitstr);
- g_free (name);
- g_free (description);
-
- servernum++;
- dialog_set_progress (context, (double)servernum/num_contactservers);
- }
- }
-
- xmlFreeDoc (doc);
- }
-
- g_free (sources_xml);
-
- return TRUE;
-}
-
-static ESource*
-get_source_by_name (ESourceList *source_list, const char *name)
-{
- GSList *groups;
- GSList *g;
-
- groups = e_source_list_peek_groups (source_list);
- if (!groups)
- return NULL;
-
- for (g = groups; g; g = g->next) {
- GSList *sources;
- GSList *s;
- ESourceGroup *group = E_SOURCE_GROUP (g->data);
-
- sources = e_source_group_peek_sources (group);
- if (!sources)
- continue;
-
- for (s = sources; s; s = s->next) {
- ESource *source = E_SOURCE (s->data);
- const char *source_name = e_source_peek_name (source);
-
- if (!strcmp (name, source_name))
- return source;
- }
- }
-
- return NULL;
-}
-
-static gboolean
-migrate_completion_folders (MigrationContext *context)
-{
- char *uris_xml = gconf_client_get_string (addressbook_component_peek_gconf_client (context->component),
- "/apps/evolution/addressbook/completion/uris",
- NULL);
-
- printf ("trying to migrate completion folders\n");
-
- if (uris_xml) {
- xmlDoc *doc = xmlParseMemory (uris_xml, strlen (uris_xml));
- xmlNode *root;
- xmlNode *child;
-
- if (!doc)
- return FALSE;
-
- dialog_set_folder_name (context, _("Autocompletion Settings"));
-
- root = xmlDocGetRootElement (doc);
- if (root == NULL || strcmp (root->name, "EvolutionFolderList") != 0) {
- xmlFreeDoc (doc);
- return FALSE;
- }
-
- for (child = root->children; child; child = child->next) {
- if (!strcmp (child->name, "folder")) {
- char *physical_uri = e_xml_get_string_prop_by_name (child, "physical-uri");
- ESource *source = NULL;
-
- /* if the physical uri is file://...
- we look it up in our folder_uid_map
- hashtable. If it's a folder we
- converted over, we should get back
- a uid we can search for.
-
- if the physical_uri is anything
- else, we strip off the args
- (anything after ;) before searching
- for the uri. */
-
- if (!strncmp (physical_uri, "file://", 7)) {
- char *uid = g_hash_table_lookup (context->folder_uid_map,
- physical_uri + 7);
-
- if (uid)
- source = e_source_list_peek_source_by_uid (context->source_list, uid);
- }
- else {
- char *name = e_xml_get_string_prop_by_name (child, "display-name");
-
- source = get_source_by_name (context->source_list, name);
-
- g_free (name);
- }
-
- if (source) {
- e_source_set_property (source, "completion", "true");
- }
- else {
- g_warning ("found completion folder with uri `%s' that "
- "doesn't correspond to anything we migrated.", physical_uri);
- }
-
- g_free (physical_uri);
- }
- }
-
- g_free (uris_xml);
- }
- else {
- g_message ("no completion folder settings to migrate");
- }
-
- return TRUE;
-}
-
-static void
-migrate_contact_lists_for_local_folders (MigrationContext *context, ESourceGroup *on_this_computer)
-{
- GSList *sources, *s;
-
- sources = e_source_group_peek_sources (on_this_computer);
- for (s = sources; s; s = s->next) {
- ESource *source = s->data;
- EBook *book;
- EBookQuery *query;
- GList *l, *contacts;
- int num_contacts, num_converted;
-
- dialog_set_folder_name (context, e_source_peek_name (source));
-
- book = e_book_new (source, NULL);
- if (!book
- || !e_book_open (book, TRUE, NULL)) {
- char *uri = e_source_get_uri (source);
- g_warning ("failed to migrate contact lists for source %s", uri);
- g_free (uri);
- continue;
- }
-
- query = e_book_query_any_field_contains ("");
-
- e_book_get_contacts (book, query, &contacts, NULL);
-
- num_converted = 0;
- num_contacts = g_list_length (contacts);
- for (l = contacts; l; l = l->next) {
- EContact *contact = l->data;
- GError *e = NULL;
- GList *attrs, *attr;
- gboolean converted = FALSE;
-
- attrs = e_contact_get_attributes (contact, E_CONTACT_EMAIL);
- for (attr = attrs; attr; attr = attr->next) {
- EVCardAttribute *a = attr->data;
- GList *v = e_vcard_attribute_get_values (a);
-
- if (v && v->data) {
- if (!strncmp ((char*)v->data, "<?xml", 5)) {
- EDestination *dest = e_destination_import ((char*)v->data);
-
- e_destination_export_to_vcard_attribute (dest, a);
-
- g_object_unref (dest);
-
- converted = TRUE;
- }
- }
- }
-
- if (converted) {
- e_contact_set_attributes (contact, E_CONTACT_EMAIL, attrs);
-
- if (!e_book_commit_contact (book,
- contact,
- &e))
- g_warning ("contact commit failed: `%s'", e->message);
- }
-
- num_converted ++;
-
- dialog_set_progress (context, (double)num_converted / num_contacts);
- }
-
- g_list_foreach (contacts, (GFunc)g_object_unref, NULL);
- g_list_free (contacts);
-
- g_object_unref (book);
- }
-}
-
-static void
-migrate_company_phone_for_local_folders (MigrationContext *context, ESourceGroup *on_this_computer)
-{
- GSList *sources, *s;
-
- sources = e_source_group_peek_sources (on_this_computer);
- for (s = sources; s; s = s->next) {
- ESource *source = s->data;
- EBook *book;
- EBookQuery *query;
- GList *l, *contacts;
- int num_contacts, num_converted;
-
- dialog_set_folder_name (context, e_source_peek_name (source));
-
- book = e_book_new (source, NULL);
- if (!book
- || !e_book_open (book, TRUE, NULL)) {
- char *uri = e_source_get_uri (source);
- g_warning ("failed to migrate company phone numbers for source %s", uri);
- g_free (uri);
- continue;
- }
-
- query = e_book_query_any_field_contains ("");
-
- e_book_get_contacts (book, query, &contacts, NULL);
-
- num_converted = 0;
- num_contacts = g_list_length (contacts);
- for (l = contacts; l; l = l->next) {
- EContact *contact = l->data;
- GError *e = NULL;
- GList *attrs, *attr;
- gboolean converted = FALSE;
- int num_work_voice = 0;
-
- attrs = e_vcard_get_attributes (E_VCARD (contact));
- for (attr = attrs; attr;) {
- EVCardAttribute *a = attr->data;
- GList *next_attr = attr->next;
-
- if (!strcmp ("TEL", e_vcard_attribute_get_name (a))) {
- GList *params, *param;
- gboolean found_voice = FALSE;
- gboolean found_work = FALSE;
-
- params = e_vcard_attribute_get_params (a);
- for (param = params; param; param = param->next) {
- EVCardAttributeParam *p = param->data;
- if (!strcmp (EVC_TYPE, e_vcard_attribute_param_get_name (p))) {
- GList *v = e_vcard_attribute_param_get_values (p);
- if (v && v->data) {
- if (!strcmp ("VOICE", v->data))
- found_voice = TRUE;
- else if (!strcmp ("WORK", v->data))
- found_work = TRUE;
- }
- }
-
- if (found_work && found_voice)
- num_work_voice++;
-
- if (num_work_voice == 3) {
- GList *v = e_vcard_attribute_get_values (a);
-
- if (v && v->data)
- e_contact_set (contact, E_CONTACT_PHONE_COMPANY, v->data);
-
- e_vcard_remove_attribute (E_VCARD (contact), a);
-
- converted = TRUE;
- break;
- }
- }
- }
-
- attr = next_attr;
-
- if (converted)
- break;
- }
-
- if (converted) {
- if (!e_book_commit_contact (book,
- contact,
- &e))
- g_warning ("contact commit failed: `%s'", e->message);
- }
-
- num_converted ++;
-
- dialog_set_progress (context, (double)num_converted / num_contacts);
- }
-
- g_list_foreach (contacts, (GFunc)g_object_unref, NULL);
- g_list_free (contacts);
-
- g_object_unref (book);
- }
-}
-
-static void
-migrate_pilot_data (const char *old_path, const char *new_path)
-{
- struct dirent *dent;
- const char *ext;
- char *filename;
- DIR *dir;
-
- if (!(dir = opendir (old_path)))
- return;
-
- while ((dent = readdir (dir))) {
- if ((!strncmp (dent->d_name, "pilot-map-", 10) &&
- ((ext = strrchr (dent->d_name, '.')) && !strcmp (ext, ".xml"))) ||
- (!strncmp (dent->d_name, "pilot-sync-evolution-addressbook-", 33) &&
- ((ext = strrchr (dent->d_name, '.')) && !strcmp (ext, ".db")))) {
- /* src and dest file formats are identical for both map and changelog files */
- unsigned char inbuf[4096];
- size_t nread, nwritten;
- int fd0, fd1;
- ssize_t n;
-
- filename = g_build_filename (old_path, dent->d_name, NULL);
- if ((fd0 = open (filename, O_RDONLY)) == -1) {
- g_free (filename);
- continue;
- }
-
- g_free (filename);
- filename = g_build_filename (new_path, dent->d_name, NULL);
- if ((fd1 = open (filename, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1) {
- g_free (filename);
- close (fd0);
- continue;
- }
-
- do {
- do {
- n = read (fd0, inbuf, sizeof (inbuf));
- } while (n == -1 && errno == EINTR);
-
- if (n < 1)
- break;
-
- nread = n;
- nwritten = 0;
- do {
- do {
- n = write (fd1, inbuf + nwritten, nread - nwritten);
- } while (n == -1 && errno == EINTR);
-
- if (n > 0)
- nwritten += n;
- } while (nwritten < nread && n != -1);
-
- if (n == -1)
- break;
- } while (1);
-
- if (n != -1)
- n = fsync (fd1);
-
- if (n == -1) {
- g_warning ("Failed to migrate %s: %s", dent->d_name, strerror (errno));
- unlink (filename);
- }
-
- close (fd0);
- close (fd1);
- g_free (filename);
- }
- }
-
- closedir (dir);
-}
-
-static MigrationContext*
-migration_context_new (AddressbookComponent *component)
-{
- MigrationContext *context = g_new (MigrationContext, 1);
-
- /* set up the mapping from old uris to new uids */
- context->folder_uid_map = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, (GDestroyNotify)g_free);
-
- e_book_get_addressbooks (&context->source_list, NULL);
-
- context->component = component;
-
- return context;
-}
-
-static void
-migration_context_free (MigrationContext *context)
-{
- e_source_list_sync (context->source_list, NULL);
-
- g_hash_table_destroy (context->folder_uid_map);
-
- g_object_unref (context->source_list);
-
- g_free (context);
-}
-
-int
-addressbook_migrate (AddressbookComponent *component, int major, int minor, int revision, GError **err)
-{
- ESourceGroup *on_this_computer;
- ESourceGroup *on_ldap_servers;
- ESource *personal_source;
- MigrationContext *context = migration_context_new (component);
- gboolean need_dialog = FALSE;
-
- printf ("addressbook_migrate (%d.%d.%d)\n", major, minor, revision);
-
- /* we call this unconditionally now - create_groups either
- creates the groups/sources or it finds the necessary
- groups/sources. */
- create_groups (context, &on_this_computer, &on_ldap_servers, &personal_source);
-
- /* figure out if we need the dialog displayed */
- if (major == 1
- /* we only need the most recent upgrade point here.
- further decomposition will happen below. */
- && (minor < 5 || (minor == 5 && revision <= 10)))
- need_dialog = TRUE;
-
- if (need_dialog)
- setup_progress_dialog (context);
-
- if (major == 1) {
-
- if (minor < 5 || (minor == 5 && revision <= 2)) {
- /* initialize our dialog */
- dialog_set_label (context,
- _("The location and hierarchy of the Evolution contact "
- "folders has changed since Evolution 1.x.\n\nPlease be "
- "patient while Evolution migrates your folders..."));
-
- if (on_this_computer)
- migrate_local_folders (context, on_this_computer, personal_source);
- if (on_ldap_servers)
- migrate_ldap_servers (context, on_ldap_servers);
-
- migrate_completion_folders (context);
- }
-
- if (minor < 5 || (minor == 5 && revision <= 7)) {
- dialog_set_label (context,
- _("The format of mailing list contacts has changed.\n\n"
- "Please be patient while Evolution migrates your "
- "folders..."));
-
- migrate_contact_lists_for_local_folders (context, on_this_computer);
- }
-
- if (minor < 5 || (minor == 5 && revision <= 8)) {
- dialog_set_label (context,
- _("The way Evolution stores some phone numbers has changed.\n\n"
- "Please be patient while Evolution migrates your "
- "folders..."));
-
- migrate_company_phone_for_local_folders (context, on_this_computer);
- }
-
- if (minor < 5 || (minor == 5 && revision <= 10)) {
- char *old_path, *new_path;
-
- dialog_set_label (context, _("Evolution's Palm Sync changelog and map files have changed.\n\n"
- "Please be patient while Evolution migrates your Pilot Sync data..."));
-
- old_path = g_build_filename (g_get_home_dir (), "evolution", "local", "Contacts", NULL);
- new_path = g_build_filename (addressbook_component_peek_base_directory (component),
- "addressbook", "local", "system", NULL);
- migrate_pilot_data (old_path, new_path);
- g_free (new_path);
- g_free (old_path);
- }
-
- /* we only need to do this next step if people ran
- older versions of 1.5. We need to clear out the
- absolute URI's that were assigned to ESources
- during one phase of development, as they take
- precedent over relative uris (but aren't updated
- when editing an ESource). */
- if (minor == 5 && revision <= 11) {
- GSList *g;
- for (g = e_source_list_peek_groups (context->source_list); g; g = g->next) {
- ESourceGroup *group = g->data;
- GSList *s;
-
- for (s = e_source_group_peek_sources (group); s; s = s->next) {
- ESource *source = s->data;
- e_source_set_absolute_uri (source, NULL);
- }
- }
- }
- }
-
- if (need_dialog)
- dialog_close (context);
-
- if (on_this_computer)
- g_object_unref (on_this_computer);
- if (on_ldap_servers)
- g_object_unref (on_ldap_servers);
- if (personal_source)
- g_object_unref (personal_source);
-
-
- migration_context_free (context);
-
- return TRUE;
-}
diff --git a/addressbook/gui/component/addressbook-migrate.h b/addressbook/gui/component/addressbook-migrate.h
deleted file mode 100644
index dc7c473e12..0000000000
--- a/addressbook/gui/component/addressbook-migrate.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2004, Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Chris Toshok (toshok@ximian.com)
- */
-
-#ifndef _ADDRESSBOOK_MIGRATE_H_
-#define _ADDRESSBOOK_MIGRATE_H_
-
-#include "addressbook-component.h"
-
-struct _GError;
-
-int addressbook_migrate (AddressbookComponent *component, int major, int minor, int revision, struct _GError **err);
-
-#endif /* _ADDRESSBOOK_MIGRATE_H_ */
diff --git a/addressbook/gui/component/addressbook-view.c b/addressbook/gui/component/addressbook-view.c
deleted file mode 100644
index f8b4802c0d..0000000000
--- a/addressbook/gui/component/addressbook-view.c
+++ /dev/null
@@ -1,1399 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* addressbook-view.c
- *
- * Copyright (C) 2000, 2001, 2002, 2003 Ximian, Inc.
- * Copyright (C) 2004 Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Chris Toshok (toshok@ximian.com)
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <glib.h>
-#include <gtk/gtkvbox.h>
-#include <gtk/gtknotebook.h>
-#include <gtk/gtkwidget.h>
-#include <gtk/gtkmessagedialog.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/gnome-app.h>
-#include <libgnomeui/gnome-href.h>
-#include <libgnomeui/gnome-uidefs.h>
-#include <bonobo/bonobo-generic-factory.h>
-#include <bonobo/bonobo-ui-util.h>
-#include <bonobo/bonobo-exception.h>
-#include <gal/util/e-util.h>
-#include <libedataserverui/e-source-selector.h>
-
-#include "widgets/misc/e-error.h"
-#include "widgets/misc/e-task-bar.h"
-#include "widgets/misc/e-info-label.h"
-
-
-#include "e-util/e-passwords.h"
-#include "e-util/e-icon-factory.h"
-#include "shell/e-user-creatable-items-handler.h"
-
-#include "evolution-shell-component-utils.h"
-#include "e-activity-handler.h"
-#include "e-contact-editor.h"
-#include "addressbook-config.h"
-#include "addressbook.h"
-#include "addressbook-view.h"
-#include "addressbook-component.h"
-#include "addressbook/gui/search/e-addressbook-search-dialog.h"
-#include "addressbook/gui/widgets/e-addressbook-view.h"
-#include "addressbook/gui/widgets/eab-gui-util.h"
-#include "addressbook/gui/merging/eab-contact-merging.h"
-#include "addressbook/printing/e-contact-print.h"
-#include "addressbook/util/eab-book-util.h"
-#include "addressbook/gui/widgets/eab-popup.h"
-#include "addressbook/gui/widgets/eab-menu.h"
-
-#define PARENT_TYPE G_TYPE_OBJECT
-static GObjectClass *parent_class = NULL;
-
-/* This is used for the addressbook status bar */
-#define EVOLUTION_CONTACTS_PROGRESS_IMAGE "stock_contact"
-static GdkPixbuf *progress_icon = NULL;
-
-#define d(x)
-
-struct _AddressbookViewPrivate {
- GtkWidget *notebook;
- BonoboControl *folder_view_control;
-
- GtkWidget *statusbar_widget;
- EActivityHandler *activity_handler;
-
- GtkWidget *info_widget;
- GtkWidget *sidebar_widget;
- GtkWidget *selector;
-
- GConfClient *gconf_client;
-
- GHashTable *uid_to_view;
- GHashTable *uid_to_editor;
-
- EBook *book;
- guint activity_id;
- ESourceList *source_list;
- char *passwd;
- EUserCreatableItemsHandler *creatable_items_handler;
-
- EABMenu *menu;
-};
-
-enum DndTargetType {
- DND_TARGET_TYPE_VCARD_LIST,
- DND_TARGET_TYPE_SOURCE_VCARD_LIST
-};
-#define VCARD_TYPE "text/x-vcard"
-#define SOURCE_VCARD_TYPE "text/x-source-vcard"
-static GtkTargetEntry drag_types[] = {
- { SOURCE_VCARD_TYPE, 0, DND_TARGET_TYPE_SOURCE_VCARD_LIST },
- { VCARD_TYPE, 0, DND_TARGET_TYPE_VCARD_LIST }
-};
-static gint num_drag_types = sizeof(drag_types) / sizeof(drag_types[0]);
-
-static void set_status_message (EABView *eav, const char *message, AddressbookView *view);
-static void search_result (EABView *eav, EBookViewStatus status, AddressbookView *view);
-
-static void activate_source (AddressbookView *view, ESource *source);
-
-static void addressbook_view_init (AddressbookView *view);
-static void addressbook_view_class_init (AddressbookViewClass *klass);
-static void addressbook_view_dispose (GObject *object);
-
-typedef struct {
- GtkWidget *editor;
- char *uid;
- AddressbookView *view;
-} EditorUidClosure;
-
-static void
-editor_weak_notify (gpointer data, GObject *o)
-{
- EditorUidClosure *closure = data;
- AddressbookViewPrivate *priv = closure->view->priv;
-
- g_hash_table_remove (priv->uid_to_editor,
- closure->uid);
-}
-
-static EABView *
-get_current_view (AddressbookView *view)
-{
- AddressbookViewPrivate *priv = view->priv;
-
- return EAB_VIEW (gtk_notebook_get_nth_page (GTK_NOTEBOOK (priv->notebook),
- gtk_notebook_get_current_page (GTK_NOTEBOOK (priv->notebook))));
-}
-
-static void
-save_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- AddressbookView *view = (AddressbookView *) user_data;
- EABView *v = get_current_view (view);
- if (v)
- eab_view_save_as(v);
-}
-
-static void
-view_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- AddressbookView *view = (AddressbookView *) user_data;
- EABView *v = get_current_view (view);
- if (v)
- eab_view_view(v);
-}
-
-static void
-search_cb (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- AddressbookView *view = (AddressbookView *) user_data;
- EABView *v = get_current_view (view);
- if (v)
- gtk_widget_show(eab_search_dialog_new(v));
-}
-
-static void
-delete_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- AddressbookView *view = (AddressbookView *) user_data;
- EABView *v = get_current_view (view);
- if (v)
- eab_view_delete_selection(v);
-}
-
-static void
-print_cb (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- AddressbookView *view = (AddressbookView *) user_data;
- EABView *v = get_current_view (view);
- if (v)
- eab_view_print(v);
-}
-
-static void
-print_preview_cb (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- AddressbookView *view = (AddressbookView *) user_data;
- EABView *v = get_current_view (view);
- if (v)
- eab_view_print_preview(v);
-}
-
-static void
-stop_loading_cb (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- AddressbookView *view = (AddressbookView *) user_data;
- EABView *v = get_current_view (view);
- if (v)
- eab_view_stop(v);
-}
-
-static void
-cut_contacts_cb (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- AddressbookView *view = (AddressbookView *) user_data;
- EABView *v = get_current_view (view);
- if (v)
- eab_view_cut(v);
-}
-
-static void
-copy_contacts_cb (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- AddressbookView *view = (AddressbookView *) user_data;
- EABView *v = get_current_view (view);
- if (v)
- eab_view_copy(v);
-}
-
-static void
-paste_contacts_cb (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- AddressbookView *view = (AddressbookView *) user_data;
- EABView *v = get_current_view (view);
- if (v)
- eab_view_paste(v);
-}
-
-static void
-select_all_contacts_cb (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- AddressbookView *view = (AddressbookView *) user_data;
- EABView *v = get_current_view (view);
- if (v)
- eab_view_select_all (v);
-}
-
-static void
-send_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- AddressbookView *view = (AddressbookView *) user_data;
- EABView *v = get_current_view (view);
- if (v)
- eab_view_send (v);
-}
-
-static void
-send_contact_to_cb (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- AddressbookView *view = (AddressbookView *) user_data;
- EABView *v = get_current_view (view);
- if (v)
- eab_view_send_to (v);
-}
-
-static void
-copy_contact_to_cb (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- AddressbookView *view = (AddressbookView *) user_data;
- EABView *v = get_current_view (view);
- if (v)
- eab_view_copy_to_folder (v);
-}
-
-static void
-move_contact_to_cb (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- AddressbookView *view = (AddressbookView *) user_data;
- EABView *v = get_current_view (view);
- if (v)
- eab_view_move_to_folder (v);
-}
-
-static void
-forget_passwords_cb (BonoboUIComponent *uih, void *user_data, const char *path)
-{
- e_passwords_forget_passwords();
-}
-
-static void
-set_status_message (EABView *eav, const char *message, AddressbookView *view)
-{
- AddressbookViewPrivate *priv = view->priv;
- EActivityHandler *activity_handler = priv->activity_handler;
-
- if (!message || !*message) {
- if (priv->activity_id != 0) {
- e_activity_handler_operation_finished (activity_handler, priv->activity_id);
- priv->activity_id = 0;
- }
- } else if (priv->activity_id == 0) {
- char *clientid = g_strdup_printf ("%p", view);
-
- if (progress_icon == NULL)
- progress_icon = e_icon_factory_get_icon (EVOLUTION_CONTACTS_PROGRESS_IMAGE, E_ICON_SIZE_STATUS);
-
- priv->activity_id = e_activity_handler_operation_started (activity_handler, clientid,
- progress_icon, message, TRUE);
-
- g_free (clientid);
- } else {
- e_activity_handler_operation_progressing (activity_handler, priv->activity_id, message, -1.0);
- }
-
-}
-
-static void
-set_folder_bar_message (EABView *eav, const char *message, AddressbookView *view)
-{
- AddressbookViewPrivate *priv = view->priv;
- EABView *current_view = get_current_view (view);
-
- if (eav == current_view) {
- ESource *source = eav->source;
-
- if (source) {
- const char *name = e_source_peek_name (source);
-
- e_info_label_set_info((EInfoLabel*)priv->info_widget, name, message);
- }
- }
-}
-
-static void
-search_result (EABView *eav, EBookViewStatus status, AddressbookView *view)
-{
- eab_search_result_dialog (NULL /* XXX */, status);
-}
-
-static void
-update_command_state (EABView *eav, AddressbookView *view)
-{
- AddressbookViewPrivate *priv = view->priv;
- BonoboUIComponent *uic;
- EABMenuTargetSelect *target;
-
- if (eav != get_current_view (view))
- return;
-
- g_object_ref (view);
-
- target = eab_view_get_menu_target(eav, priv->menu);
- e_menu_update_target((EMenu *)priv->menu, target);
-
- uic = bonobo_control_get_ui_component (priv->folder_view_control);
-
- /* TODO: this stuff can mostly be made to use the target bits instead */
-
- if (bonobo_ui_component_get_container (uic) != CORBA_OBJECT_NIL) {
-#define SET_SENSITIVE(verb,f) \
- bonobo_ui_component_set_prop (uic, (verb), "sensitive", (f)(eav) ? "1" : "0", NULL)
-
- SET_SENSITIVE ("/commands/ContactsSaveAsVCard", eab_view_can_save_as);
- SET_SENSITIVE ("/commands/ContactsView", eab_view_can_view);
-
- /* Print Contact */
- SET_SENSITIVE ("/commands/ContactsPrint", eab_view_can_print);
- SET_SENSITIVE ("/commands/ContactsPrintPreview", eab_view_can_print);
-
- /* Delete Contact */
- SET_SENSITIVE ("/commands/ContactDelete", eab_view_can_delete);
- SET_SENSITIVE ("/commands/ContactsCut", eab_view_can_cut);
-
- SET_SENSITIVE ("/commands/ContactsCopy", eab_view_can_copy);
- SET_SENSITIVE ("/commands/ContactsPaste", eab_view_can_paste);
- SET_SENSITIVE ("/commands/ContactsSelectAll", eab_view_can_select_all);
- SET_SENSITIVE ("/commands/ContactsSendContactToOther", eab_view_can_send);
- SET_SENSITIVE ("/commands/ContactsSendMessageToContact", eab_view_can_send_to);
- SET_SENSITIVE ("/commands/ContactsMoveToFolder", eab_view_can_move_to_folder);
- SET_SENSITIVE ("/commands/ContactsCopyToFolder", eab_view_can_copy_to_folder);
-
- /* Stop */
- SET_SENSITIVE ("/commands/ContactStop", eab_view_can_stop);
-#undef SET_SENSITIVE
- }
-
- g_object_unref (view);
-}
-
-static BonoboUIVerb verbs [] = {
- BONOBO_UI_UNSAFE_VERB ("ContactsPrint", print_cb),
- BONOBO_UI_UNSAFE_VERB ("ContactsPrintPreview", print_preview_cb),
- BONOBO_UI_UNSAFE_VERB ("ContactsSaveAsVCard", save_contact_cb),
- BONOBO_UI_UNSAFE_VERB ("ContactsView", view_contact_cb),
-
- BONOBO_UI_UNSAFE_VERB ("ContactDelete", delete_contact_cb),
- BONOBO_UI_UNSAFE_VERB ("ContactStop", stop_loading_cb),
-
- BONOBO_UI_UNSAFE_VERB ("ContactsCut", cut_contacts_cb),
- BONOBO_UI_UNSAFE_VERB ("ContactsCopy", copy_contacts_cb),
- BONOBO_UI_UNSAFE_VERB ("ContactsPaste", paste_contacts_cb),
- BONOBO_UI_UNSAFE_VERB ("ContactsSelectAll", select_all_contacts_cb),
-
- BONOBO_UI_UNSAFE_VERB ("ContactsSendContactToOther", send_contact_cb),
- BONOBO_UI_UNSAFE_VERB ("ContactsSendMessageToContact", send_contact_to_cb),
- BONOBO_UI_UNSAFE_VERB ("ContactsMoveToFolder", move_contact_to_cb),
- BONOBO_UI_UNSAFE_VERB ("ContactsCopyToFolder", copy_contact_to_cb),
- BONOBO_UI_UNSAFE_VERB ("ContactsForgetPasswords", forget_passwords_cb),
- /* ContactsViewPreview is a toggle */
-
- BONOBO_UI_VERB_END
-};
-
-static EPixmap pixmaps [] = {
- E_PIXMAP ("/menu/File/FileOps/ContactsSaveAsVCard", "stock_save-as", E_ICON_SIZE_MENU),
- E_PIXMAP ("/menu/File/Print/ContactsPrint", "stock_print", E_ICON_SIZE_MENU),
- E_PIXMAP ("/menu/File/Print/ContactsPrintPreview", "stock_print-preview", E_ICON_SIZE_MENU),
-
- E_PIXMAP ("/menu/EditPlaceholder/Edit/ContactsCut", "stock_cut", E_ICON_SIZE_MENU),
- E_PIXMAP ("/menu/EditPlaceholder/Edit/ContactsCopy", "stock_copy", E_ICON_SIZE_MENU),
- E_PIXMAP ("/menu/EditPlaceholder/Edit/ContactsPaste", "stock_paste", E_ICON_SIZE_MENU),
- E_PIXMAP ("/menu/EditPlaceholder/Edit/ContactDelete", "stock_delete", E_ICON_SIZE_MENU),
-
- E_PIXMAP ("/Toolbar/ContactsPrint", "stock_print", E_ICON_SIZE_LARGE_TOOLBAR),
- E_PIXMAP ("/Toolbar/ContactDelete", "stock_delete", E_ICON_SIZE_LARGE_TOOLBAR),
-
- E_PIXMAP_END
-};
-
-static void
-control_activate (BonoboControl *control,
- BonoboUIComponent *uic,
- AddressbookView *view)
-{
- AddressbookViewPrivate *priv = view->priv;
- Bonobo_UIContainer remote_ui_container;
- EABView *v = get_current_view (view);
-
- remote_ui_container = bonobo_control_get_remote_ui_container (control, NULL);
- bonobo_ui_component_set_container (uic, remote_ui_container, NULL);
- bonobo_object_release_unref (remote_ui_container, NULL);
-
- bonobo_ui_component_add_verb_list_with_data (
- uic, verbs, view);
-
- bonobo_ui_component_freeze (uic, NULL);
-
- bonobo_ui_util_set_ui (uic, PREFIX,
- EVOLUTION_UIDIR "/evolution-addressbook.xml",
- "evolution-addressbook", NULL);
-
- if (v)
- eab_view_setup_menus (v, uic);
-
- e_pixmaps_update (uic, pixmaps);
-
- e_user_creatable_items_handler_activate (priv->creatable_items_handler, uic);
-
- bonobo_ui_component_thaw (uic, NULL);
-
- if (v)
- update_command_state (v, view);
-}
-
-static void
-control_activate_cb (BonoboControl *control,
- gboolean activate,
- AddressbookView *view)
-{
- BonoboUIComponent *uic;
- EABView *v = get_current_view (view);
-
- uic = bonobo_control_get_ui_component (control);
- g_assert (uic != NULL);
-
- if (activate) {
- control_activate (control, uic, view);
- e_menu_activate((EMenu *)view->priv->menu, uic, activate);
- if (activate && v && v->model)
- eab_model_force_folder_bar_message (v->model);
- } else {
- e_menu_activate((EMenu *)view->priv->menu, uic, activate);
- bonobo_ui_component_unset_container (uic, NULL);
- eab_view_discard_menus (v);
- }
-}
-
-static void
-gather_uids_foreach (char *key,
- gpointer value,
- GList **list)
-{
- (*list) = g_list_prepend (*list, key);
-}
-
-static void
-source_list_changed_cb (ESourceList *source_list, AddressbookView *view)
-{
- AddressbookViewPrivate *priv = view->priv;
- GList *uids, *l;
- EABView *v;
-
- uids = NULL;
- g_hash_table_foreach (priv->uid_to_view, (GHFunc)gather_uids_foreach, &uids);
- for (l = uids; l; l = l->next) {
- char *uid = l->data;
- if (e_source_list_peek_source_by_uid (source_list, uid)) {
- /* the source still exists, do nothing */
- }
- else {
- /* the source no longer exists, remove its
- view remove it from our hash table. */
- v = g_hash_table_lookup (priv->uid_to_view,
- uid);
- gtk_notebook_remove_page (GTK_NOTEBOOK (priv->notebook),
- gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook),
- GTK_WIDGET (v)));
- g_hash_table_remove (priv->uid_to_view, uid);
- }
- }
- g_list_free (uids);
-
- uids = NULL;
- g_hash_table_foreach (priv->uid_to_editor, (GHFunc)gather_uids_foreach, &uids);
- for (l = uids; l; l = l->next) {
- char *uid = l->data;
- if (e_source_list_peek_source_by_uid (source_list, uid)) {
- /* the source still exists, do nothing */
- }
- else {
- /* the source no longer exists, remove its
- editor remove it from our hash table. */
- EditorUidClosure *closure = g_hash_table_lookup (priv->uid_to_editor,
- uid);
- g_object_weak_unref (G_OBJECT (closure->editor),
- editor_weak_notify, closure);
- gtk_widget_destroy (closure->editor);
- g_hash_table_remove (priv->uid_to_editor, uid);
- }
- }
- g_list_free (uids);
-
- /* make sure we've got the current view selected and updated
- properly */
- v = get_current_view (view);
- if (v) {
- eab_view_setup_menus (v, bonobo_control_get_ui_component (priv->folder_view_control));
- update_command_state (v, view);
- }
-}
-
-static void
-load_uri_for_selection (ESourceSelector *selector,
- AddressbookView *view)
-{
- ESource *selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (selector));
-
- if (selected_source != NULL)
- activate_source (view, selected_source);
-}
-
-static ESource *
-find_first_source (ESourceList *source_list)
-{
- GSList *groups, *sources, *l, *m;
-
- groups = e_source_list_peek_groups (source_list);
- for (l = groups; l; l = l->next) {
- ESourceGroup *group = l->data;
-
- sources = e_source_group_peek_sources (group);
- for (m = sources; m; m = m->next) {
- ESource *source = m->data;
-
- return source;
- }
- }
-
- return NULL;
-}
-
-static void
-save_primary_selection (AddressbookView *view)
-{
- AddressbookViewPrivate *priv = view->priv;
- ESource *source;
-
- source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (priv->selector));
- if (!source)
- return;
-
- /* Save the selection for next time we start up */
- gconf_client_set_string (priv->gconf_client,
- "/apps/evolution/addressbook/display/primary_addressbook",
- e_source_peek_uid (source), NULL);
-}
-
-static ESource *
-get_primary_source (AddressbookView *view)
-{
- AddressbookViewPrivate *priv = view->priv;
- ESource *source;
- char *uid;
-
- uid = gconf_client_get_string (priv->gconf_client,
- "/apps/evolution/addressbook/display/primary_addressbook",
- NULL);
- if (uid) {
- source = e_source_list_peek_source_by_uid (priv->source_list, uid);
- g_free (uid);
- } else {
- /* Try to create a default if there isn't one */
- source = find_first_source (priv->source_list);
- }
-
- return source;
-}
-
-static void
-load_primary_selection (AddressbookView *view)
-{
- AddressbookViewPrivate *priv = view->priv;
- ESource *source;
-
- source = get_primary_source (view);
- if (source)
- e_source_selector_set_primary_selection (E_SOURCE_SELECTOR (priv->selector), source);
-}
-
-/* Folder popup menu callbacks */
-typedef struct {
- AddressbookView *view;
- ESource *selected_source;
- GtkWidget *toplevel;
-} BookRemovedClosure;
-
-static void
-book_removed (EBook *book, EBookStatus status, gpointer data)
-{
- BookRemovedClosure *closure = data;
- AddressbookView *view = closure->view;
- AddressbookViewPrivate *priv = view->priv;
- ESource *source = closure->selected_source;
- GtkWidget *toplevel = closure->toplevel;
-
- g_free (closure);
-
- g_object_unref (book);
-
- if (E_BOOK_ERROR_OK == status) {
- /* Remove source */
- if (e_source_selector_source_is_selected (E_SOURCE_SELECTOR (priv->selector),
- source))
- e_source_selector_unselect_source (E_SOURCE_SELECTOR (priv->selector),
- source);
-
- e_source_group_remove_source (e_source_peek_group (source), source);
-
- e_source_list_sync (priv->source_list, NULL);
- }
- else {
- e_error_run (GTK_WINDOW (toplevel),
- "addressbook:remove-addressbook",
- NULL);
- }
-}
-
-static void
-delete_addressbook_cb(EPopup *ep, EPopupItem *pitem, void *data)
-{
- AddressbookView *view = data;
- AddressbookViewPrivate *priv = view->priv;
- ESource *selected_source;
- EBook *book;
- GError *error = NULL;
- GtkWindow *toplevel;
-
- selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (priv->selector));
- if (!selected_source)
- return;
-
- toplevel = (GtkWindow *)gtk_widget_get_toplevel(ep->target->widget);
-
- if (e_error_run(toplevel, "addressbook:ask-delete-addressbook", e_source_peek_name(selected_source)) != GTK_RESPONSE_YES)
- return;
-
- /* Remove local data */
- book = e_book_new (selected_source, &error);
- if (book) {
- BookRemovedClosure *closure = g_new (BookRemovedClosure, 1);
-
- closure->toplevel = (GtkWidget *)toplevel;
- closure->view = view;
- closure->selected_source = selected_source;
-
- if (e_book_async_remove (book, book_removed, closure)) {
- e_error_run (toplevel, "addressbook:remove-addressbook", NULL);
- g_free (closure);
- g_object_unref (book);
- }
- }
-}
-
-static void
-new_addressbook_cb(EPopup *ep, EPopupItem *pitem, void *data)
-{
- addressbook_config_create_new_source (gtk_widget_get_toplevel(ep->target->widget));
-}
-
-static void
-edit_addressbook_cb(EPopup *ep, EPopupItem *pitem, void *data)
-{
- AddressbookView *view = data;
- AddressbookViewPrivate *priv = view->priv;
- ESource *selected_source;
- const char *uid;
- EditorUidClosure *closure;
-
- selected_source =
- e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (priv->selector));
- if (!selected_source)
- return;
-
- uid = e_source_peek_uid (selected_source);
-
- closure = g_hash_table_lookup (priv->uid_to_editor, uid);
- if (!closure) {
- char *uid_copy = g_strdup (uid);
-
- closure = g_new (EditorUidClosure, 1);
- closure->editor = addressbook_config_edit_source (gtk_widget_get_toplevel(ep->target->widget), selected_source);
- closure->uid = uid_copy;
- closure->view = view;
-
- g_hash_table_insert (priv->uid_to_editor,
- uid_copy,
- closure);
-
- g_object_weak_ref (G_OBJECT (closure->editor),
- editor_weak_notify, closure);
- }
-
- gtk_window_present (GTK_WINDOW (closure->editor));
-}
-
-/* Callbacks. */
-
-static void
-primary_source_selection_changed_callback (ESourceSelector *selector,
- AddressbookView *view)
-{
- load_uri_for_selection (selector, view);
- save_primary_selection (view);
-}
-
-static EPopupItem abv_source_popups[] = {
- { E_POPUP_ITEM, "10.new", N_("New Address Book"), new_addressbook_cb, NULL, "stock_contact", 0, 0 },
- { E_POPUP_ITEM, "20.delete", N_("Delete"), delete_addressbook_cb, NULL, "stock_delete", 0, EAB_POPUP_SOURCE_USER|EAB_POPUP_SOURCE_PRIMARY },
- { E_POPUP_BAR, "30.bar"},
- { E_POPUP_ITEM, "30.properties", N_("Properties..."), edit_addressbook_cb, NULL,"stock_folder-properties", 0, EAB_POPUP_SOURCE_PRIMARY },
-};
-
-static void
-abv_source_popup_free(EPopup *ep, GSList *list, void *data)
-{
- g_slist_free(list);
-}
-
-static gboolean
-popup_event_callback(ESourceSelector *selector, ESource *source, GdkEventButton *event, AddressbookView *view)
-{
- EABPopup *ep;
- EABPopupTargetSource *t;
- GSList *menus = NULL;
- int i;
- GtkMenu *menu;
-
- ep = eab_popup_new("org.gnome.evolution.addressbook.source.popup");
- t = eab_popup_target_new_source(ep, selector);
- t->target.widget = (GtkWidget *)view->priv->notebook;
-
- for (i=0;i<sizeof(abv_source_popups)/sizeof(abv_source_popups[0]);i++)
- menus = g_slist_prepend(menus, &abv_source_popups[i]);
-
- e_popup_add_items((EPopup *)ep, menus, NULL, abv_source_popup_free, view);
-
- menu = e_popup_create_menu_once((EPopup *)ep, (EPopupTarget *)t, 0);
- gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event?event->button:0, event?event->time:gtk_get_current_event_time());
-
- return TRUE;
-}
-
-static gboolean
-selector_tree_drag_drop (GtkWidget *widget,
- GdkDragContext *context,
- int x,
- int y,
- guint time,
- AddressbookView *view)
-{
- GtkTreeViewColumn *column;
- int cell_x;
- int cell_y;
- GtkTreePath *path;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gpointer data;
-
- if (!gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), x, y, &path, &column, &cell_x, &cell_y))
- return FALSE;
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
-
- if (!gtk_tree_model_get_iter (model, &iter, path)) {
- gtk_tree_path_free (path);
- return FALSE;
- }
-
- gtk_tree_model_get (model, &iter, 0, &data, -1);
-
- if (E_IS_SOURCE_GROUP (data)) {
- g_object_unref (data);
- gtk_tree_path_free (path);
- return FALSE;
- }
-
- gtk_tree_path_free (path);
- return TRUE;
-}
-
-static gboolean
-selector_tree_drag_motion (GtkWidget *widget,
- GdkDragContext *context,
- int x,
- int y)
-{
- GtkTreePath *path = NULL;
- gpointer data = NULL;
- GtkTreeViewDropPosition pos;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GdkDragAction action;
-
- if (!gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW (widget),
- x, y, &path, &pos))
- goto finish;
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
-
- if (!gtk_tree_model_get_iter (model, &iter, path))
- goto finish;
-
- gtk_tree_model_get (model, &iter, 0, &data, -1);
-
- if (E_IS_SOURCE_GROUP (data) || e_source_get_readonly (data))
- goto finish;
-
- gtk_tree_view_set_drag_dest_row(GTK_TREE_VIEW (widget), path, GTK_TREE_VIEW_DROP_INTO_OR_BEFORE);
- action = context->suggested_action;
-
- finish:
- if (path)
- gtk_tree_path_free (path);
- if (data)
- g_object_unref (data);
-
- gdk_drag_status (context, action, GDK_CURRENT_TIME);
- return TRUE;
-}
-
-typedef struct
-{
- guint remove_from_source : 1;
- guint copy_done : 1;
- gint pending_removals;
-
- EContact *current_contact;
- GList *remaining_contacts;
-
- EBook *source_book;
- EBook *target_book;
-}
-MergeContext;
-
-static void
-destroy_merge_context (MergeContext *merge_context)
-{
- if (merge_context->source_book)
- g_object_unref (merge_context->source_book);
- if (merge_context->target_book)
- g_object_unref (merge_context->target_book);
-
- g_free (merge_context);
-}
-
-static void
-removed_contact_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- MergeContext *merge_context = closure;
-
- merge_context->pending_removals--;
-
- if (merge_context->copy_done && merge_context->pending_removals == 0) {
- /* Finished */
-
- destroy_merge_context (merge_context);
- }
-}
-
-static void
-merged_contact_cb (EBook *book, EBookStatus status, const char *id, gpointer closure)
-{
- MergeContext *merge_context = closure;
-
- if (merge_context->remove_from_source && status == E_BOOK_ERROR_OK) {
- /* Remove previous contact from source */
-
- e_book_async_remove_contact (merge_context->source_book, merge_context->current_contact,
- removed_contact_cb, merge_context);
- merge_context->pending_removals++;
- }
-
- g_object_unref (merge_context->current_contact);
-
- if (merge_context->remaining_contacts) {
- /* Copy next contact */
-
- merge_context->current_contact = merge_context->remaining_contacts->data;
- merge_context->remaining_contacts = g_list_delete_link (merge_context->remaining_contacts,
- merge_context->remaining_contacts);
- eab_merging_book_add_contact (merge_context->target_book, merge_context->current_contact,
- merged_contact_cb, merge_context);
- } else if (merge_context->pending_removals == 0) {
- /* Finished */
-
- destroy_merge_context (merge_context);
- } else {
- /* Finished, but have pending removals */
-
- merge_context->copy_done = TRUE;
- }
-}
-
-static gboolean
-selector_tree_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- GtkSelectionData *data,
- guint info,
- guint time,
- gpointer user_data)
-{
- GtkTreePath *path = NULL;
- GtkTreeViewDropPosition pos;
- gpointer target = NULL;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gboolean success = FALSE;
- EBook *source_book, *target_book;
- MergeContext *merge_context;
- GList *contactlist;
-
- if (!gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW (widget),
- x, y, &path, &pos))
- goto finish;
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
-
- if (!gtk_tree_model_get_iter (model, &iter, path))
- goto finish;
-
- gtk_tree_model_get (model, &iter, 0, &target, -1);
-
- if (E_IS_SOURCE_GROUP (target) || e_source_get_readonly (target))
- goto finish;
-
- target_book = e_book_new (target, NULL);
- if (!target_book) {
- g_message (G_STRLOC ":Couldn't create EBook.");
- return FALSE;
- }
- e_book_open (target_book, TRUE, NULL);
-
- eab_book_and_contact_list_from_string (data->data, &source_book, &contactlist);
-
- if (source_book) {
- if (!e_book_open (source_book, FALSE, NULL)) {
- g_warning (G_STRLOC ": Couldn't open source EBook.");
- g_object_unref (source_book);
- source_book = NULL;
- }
- } else {
- g_warning (G_STRLOC ": No source EBook provided.");
- }
-
- /* Set up merge context */
-
- merge_context = g_new0 (MergeContext, 1);
-
- merge_context->source_book = source_book;
- merge_context->target_book = target_book;
-
- merge_context->current_contact = contactlist->data;
- merge_context->remaining_contacts = g_list_delete_link (contactlist, contactlist);
-
- merge_context->remove_from_source = context->suggested_action == GDK_ACTION_MOVE ? TRUE : FALSE;
-
- /* Start merge */
-
- eab_merging_book_add_contact (target_book, merge_context->current_contact,
- merged_contact_cb, merge_context);
-
- finish:
- if (path)
- gtk_tree_path_free (path);
- if (target)
- g_object_unref (target);
-
- gtk_drag_finish (context, success, context->action == GDK_ACTION_MOVE, time);
-
- return TRUE;
-}
-
-static void
-selector_tree_drag_leave (GtkWidget *widget, GdkDragContext *context, guint time, gpointer data)
-{
- gtk_tree_view_set_drag_dest_row(GTK_TREE_VIEW (widget), NULL, GTK_TREE_VIEW_DROP_BEFORE);
-}
-
-
-static void
-destroy_callback(gpointer data, GObject *where_object_was)
-{
- AddressbookView *view = data;
- g_object_unref (view);
-}
-
-GType
-addressbook_view_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (AddressbookViewClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) addressbook_view_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EABView),
- 0, /* n_preallocs */
- (GInstanceInitFunc) addressbook_view_init,
- };
-
- type = g_type_register_static (PARENT_TYPE, "AddressbookView", &info, 0);
- }
-
- return type;
-}
-
-static void
-addressbook_view_class_init (AddressbookViewClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->dispose = addressbook_view_dispose;
-
- parent_class = g_type_class_peek_parent (klass);
-}
-
-static void
-addressbook_view_init (AddressbookView *view)
-{
- AddressbookViewPrivate *priv;
- GtkWidget *selector_scrolled_window;
- AtkObject *a11y;
-
- view->priv =
- priv = g_new0 (AddressbookViewPrivate, 1);
-
- priv->gconf_client = addressbook_component_peek_gconf_client (addressbook_component_peek ());
-
- priv->uid_to_view = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, (GDestroyNotify)g_object_unref);
- priv->uid_to_editor = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, (GDestroyNotify)g_free);
-
- priv->notebook = gtk_notebook_new ();
- gtk_notebook_set_show_tabs (GTK_NOTEBOOK (priv->notebook), FALSE);
- gtk_notebook_set_show_border (GTK_NOTEBOOK (priv->notebook), FALSE);
-
- g_object_weak_ref (G_OBJECT (priv->notebook), destroy_callback, view);
-
- /* Create the control. */
- priv->folder_view_control = bonobo_control_new (priv->notebook);
-
- gtk_widget_show (priv->notebook);
-
- e_book_get_addressbooks (&priv->source_list, NULL);
- g_signal_connect (priv->source_list,
- "changed",
- G_CALLBACK (source_list_changed_cb), view);
-
- priv->creatable_items_handler = e_user_creatable_items_handler_new ("contacts", NULL, NULL);
- priv->menu = eab_menu_new("org.gnome.evolution.addressbook.view");
-
- g_signal_connect (priv->folder_view_control, "activate",
- G_CALLBACK (control_activate_cb), view);
-
- priv->activity_handler = e_activity_handler_new ();
-
- priv->statusbar_widget = e_task_bar_new ();
- gtk_widget_show (priv->statusbar_widget);
-
- e_activity_handler_attach_task_bar (priv->activity_handler,
- E_TASK_BAR (priv->statusbar_widget));
-
- priv->info_widget = e_info_label_new("stock_contact");
- e_info_label_set_info((EInfoLabel*)priv->info_widget, _("Contacts"), "");
- gtk_widget_show (priv->info_widget);
-
- priv->selector = e_source_selector_new (priv->source_list);
-
- g_signal_connect (priv->selector, "drag-motion", G_CALLBACK (selector_tree_drag_motion), view);
- g_signal_connect (priv->selector, "drag-leave", G_CALLBACK (selector_tree_drag_leave), view);
- g_signal_connect (priv->selector, "drag-drop", G_CALLBACK (selector_tree_drag_drop), view);
- g_signal_connect (priv->selector, "drag-data-received", G_CALLBACK (selector_tree_drag_data_received), view);
- gtk_drag_dest_set (priv->selector, GTK_DEST_DEFAULT_ALL, drag_types, num_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE);
- a11y = gtk_widget_get_accessible (GTK_WIDGET (priv->selector));
- atk_object_set_name (a11y, _("Contact Source Selector"));
-
- e_source_selector_show_selection (E_SOURCE_SELECTOR (priv->selector), FALSE);
- gtk_widget_show (priv->selector);
-
- selector_scrolled_window = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (selector_scrolled_window), GTK_SHADOW_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (selector_scrolled_window),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_container_add (GTK_CONTAINER (selector_scrolled_window), priv->selector);
- gtk_widget_show (selector_scrolled_window);
-
- priv->sidebar_widget = gtk_vbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX (priv->sidebar_widget), priv->info_widget, FALSE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX (priv->sidebar_widget), selector_scrolled_window, TRUE, TRUE, 0);
- gtk_widget_show (priv->sidebar_widget);
-
- g_signal_connect_object (priv->selector, "primary_selection_changed",
- G_CALLBACK (primary_source_selection_changed_callback),
- G_OBJECT (view), 0);
- g_signal_connect_object (priv->selector, "popup_event",
- G_CALLBACK (popup_event_callback),
- G_OBJECT (view), 0);
-
- load_primary_selection (view);
- load_uri_for_selection (E_SOURCE_SELECTOR (priv->selector), view);
-}
-
-static void
-destroy_editor (char *key,
- gpointer value,
- gpointer nada)
-{
- EditorUidClosure *closure = value;
-
- g_object_weak_unref (G_OBJECT (closure->editor),
- editor_weak_notify, closure);
-
- gtk_widget_destroy (GTK_WIDGET (closure->editor));
-}
-
-static void
-addressbook_view_dispose (GObject *object)
-{
- AddressbookView *view = ADDRESSBOOK_VIEW (object);
- AddressbookViewPrivate *priv = view->priv;
-
- if (view->priv) {
- if (priv->book)
- g_object_unref (priv->book);
-
- g_free(priv->passwd);
-
- if (priv->source_list)
- g_object_unref (priv->source_list);
-
- if (priv->uid_to_view)
- g_hash_table_destroy (priv->uid_to_view);
-
- if (priv->uid_to_editor) {
- g_hash_table_foreach (priv->uid_to_editor, (GHFunc)destroy_editor, NULL);
- g_hash_table_destroy (priv->uid_to_editor);
- }
-
- if (priv->creatable_items_handler)
- g_object_unref (priv->creatable_items_handler);
-
- if (priv->menu)
- g_object_unref (priv->menu);
-
- g_free (view->priv);
- view->priv = NULL;
- }
-
- if (G_OBJECT_CLASS (parent_class)->dispose)
- (* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-typedef struct {
- EABView *view;
- ESource *source;
-} BookOpenData;
-
-static void
-book_open_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- BookOpenData *data = closure;
- EABView *view = data->view;
- ESource *source = data->source;
-
- g_free (data);
-
- /* we always set the "source" property on the EABView, since
- we use it to reload a previously failed book. */
- g_object_set(view,
- "source", source,
- NULL);
-
- if (status == E_BOOK_ERROR_OK) {
- g_object_set(view,
- "book", book,
- NULL);
-
- if (view->model)
- eab_model_force_folder_bar_message (view->model);
- }
- else if (status != E_BOOK_ERROR_CANCELLED) {
- eab_load_error_dialog (NULL /* XXX */, source, status);
- }
-
-
- g_object_unref (source);
-}
-
-static void
-activate_source (AddressbookView *view,
- ESource *source)
-{
- AddressbookViewPrivate *priv = view->priv;
- const char *uid;
- GtkWidget *uid_view;
- EBook *book;
- BookOpenData *data;
-
- uid = e_source_peek_uid (source);
- uid_view = g_hash_table_lookup (priv->uid_to_view, uid);
-
- if (uid_view) {
- /* there is a view for this uid. make
- sure that the view actually
- contains an EBook (if it doesn't
- contain an EBook a previous load
- failed. try to load it again */
- g_object_get (uid_view,
- "book", &book,
- NULL);
-
- if (book) {
- g_object_unref (book);
- }
- else {
- g_object_get (uid_view,
- "source", &source,
- NULL);
-
- /* source can be NULL here, if
- a previous load hasn't
- actually made it to
- book_open_cb yet. */
- if (source) {
- book = e_book_new (source, NULL);
-
- if (!book) {
- g_object_unref (source);
- }
- else {
- data = g_new (BookOpenData, 1);
- data->view = g_object_ref (uid_view);
- data->source = source; /* transfer the ref we get back from g_object_get */
-
- addressbook_load (book, book_open_cb, data);
- }
- }
- }
- }
- else {
- /* we don't have a view for this uid already
- set up. */
- GtkWidget *label = gtk_label_new (uid);
- GError *error = NULL;
-
- uid_view = eab_view_new ();
-
- gtk_widget_show (uid_view);
- gtk_widget_show (label);
-
- g_object_set (uid_view, "type", EAB_VIEW_TABLE, NULL);
-
- gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook),
- uid_view,
- label);
-
- g_hash_table_insert (priv->uid_to_view, g_strdup (uid), uid_view);
-
- g_signal_connect (uid_view, "status_message",
- G_CALLBACK(set_status_message), view);
-
- g_signal_connect (uid_view, "search_result",
- G_CALLBACK(search_result), view);
-
- g_signal_connect (uid_view, "folder_bar_message",
- G_CALLBACK(set_folder_bar_message), view);
-
- g_signal_connect (uid_view, "command_state_change",
- G_CALLBACK(update_command_state), view);
-
- book = e_book_new (source, &error);
-
- if (book) {
- data = g_new (BookOpenData, 1);
- data->view = g_object_ref (uid_view);
- data->source = g_object_ref (source);
-
- addressbook_load (book, book_open_cb, data);
- }
- else {
- g_warning ("error loading addressbook : %s", error->message);
- g_error_free (error);
- }
- }
-
- gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook),
- gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook),
- uid_view));
-
- if (EAB_VIEW (uid_view)->model)
- eab_model_force_folder_bar_message (EAB_VIEW (uid_view)->model);
-
- /* change menus/toolbars to reflect the new view, assuming we are already displayed */
- if (bonobo_ui_component_get_container (bonobo_control_get_ui_component (priv->folder_view_control)) != CORBA_OBJECT_NIL) {
- eab_view_setup_menus (EAB_VIEW (uid_view), bonobo_control_get_ui_component (priv->folder_view_control));
- update_command_state (EAB_VIEW (uid_view), view);
- }
-}
-
-AddressbookView *
-addressbook_view_new (void)
-{
- return g_object_new (ADDRESSBOOK_TYPE_VIEW, NULL);
-}
-
-EActivityHandler*
-addressbook_view_peek_activity_handler (AddressbookView *view)
-{
- g_return_val_if_fail (ADDRESSBOOK_IS_VIEW (view), NULL);
-
- return view->priv->activity_handler;
-}
-
-GtkWidget*
-addressbook_view_peek_info_label (AddressbookView *view)
-{
- g_return_val_if_fail (ADDRESSBOOK_IS_VIEW (view), NULL);
-
- return view->priv->info_widget;
-}
-
-GtkWidget*
-addressbook_view_peek_sidebar (AddressbookView *view)
-{
- g_return_val_if_fail (ADDRESSBOOK_IS_VIEW (view), NULL);
-
- return view->priv->sidebar_widget;
-}
-
-GtkWidget*
-addressbook_view_peek_statusbar (AddressbookView *view)
-{
- g_return_val_if_fail (ADDRESSBOOK_IS_VIEW (view), NULL);
-
- return view->priv->statusbar_widget;
-}
-
-BonoboControl*
-addressbook_view_peek_folder_view (AddressbookView *view)
-{
- g_return_val_if_fail (ADDRESSBOOK_IS_VIEW (view), NULL);
-
- return view->priv->folder_view_control;
-}
diff --git a/addressbook/gui/component/addressbook-view.h b/addressbook/gui/component/addressbook-view.h
deleted file mode 100644
index e2292c4527..0000000000
--- a/addressbook/gui/component/addressbook-view.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* addressbook-view.h
- *
- * Copyright (C) 2004 Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Chris Toshok <toshok@ximian.com>
- */
-
-#ifndef _ADDRESSBOOK_VIEW_H_
-#define _ADDRESSBOOK_VIEW_H_
-
-#include <bonobo/bonobo-control.h>
-
-#define ADDRESSBOOK_TYPE_VIEW (addressbook_view_get_type ())
-#define ADDRESSBOOK_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ADDRESSBOOK_TYPE_VIEW, AddressbookView))
-#define ADDRESSBOOK_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ADDRESSBOOK_TYPE_VIEW, AddressbookViewClass))
-#define ADDRESSBOOK_IS_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ADDRESSBOOK_TYPE_VIEW))
-#define ADDRESSBOOK_IS_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), ADDRESSBOOK_TYPE_VIEW))
-
-
-typedef struct _AddressbookView AddressbookView;
-typedef struct _AddressbookViewPrivate AddressbookViewPrivate;
-typedef struct _AddressbookViewClass AddressbookViewClass;
-
-struct _AddressbookView {
- GObject parent;
-
- AddressbookViewPrivate *priv;
-};
-
-struct _AddressbookViewClass {
- GObjectClass parent_class;
-};
-
-
-GType addressbook_view_get_type (void);
-
-AddressbookView *addressbook_view_new (void);
-
-EActivityHandler *addressbook_view_peek_activity_handler (AddressbookView *view);
-GtkWidget *addressbook_view_peek_info_label (AddressbookView *view);
-GtkWidget *addressbook_view_peek_sidebar (AddressbookView *view);
-GtkWidget *addressbook_view_peek_statusbar (AddressbookView *view);
-BonoboControl *addressbook_view_peek_folder_view (AddressbookView *view);
-
-#endif /* _ADDRESSBOOK_VIEW_H_ */
diff --git a/addressbook/gui/component/addressbook.c b/addressbook/gui/component/addressbook.c
deleted file mode 100644
index c2ab48e55b..0000000000
--- a/addressbook/gui/component/addressbook.c
+++ /dev/null
@@ -1,318 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* addressbook.c
- *
- * Copyright (C) 2000, 2001, 2002 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Chris Lahey (clahey@ximian.com)
- */
-
-#include <config.h>
-
-#include <string.h>
-
-#include <gtk/gtkmessagedialog.h>
-#include <libgnome/gnome-i18n.h>
-#include <libebook/e-book.h>
-
-#include "e-util/e-passwords.h"
-
-#include "addressbook.h"
-
-#define d(x)
-
-static void addressbook_authenticate (EBook *book, gboolean previous_failure,
- ESource *source, EBookCallback cb, gpointer closure);
-
-typedef struct {
- EBookCallback cb;
- ESource *source;
- gpointer closure;
- guint cancelled : 1;
-} LoadSourceData;
-
-static void
-free_load_source_data (LoadSourceData *data)
-{
- if (data->source)
- g_object_unref (data->source);
- g_free (data);
-}
-
-/*this function removes of anything present after semicolon
-in uri*/
-
-static gchar*
-remove_parameters_from_uri (gchar *uri)
-{
- gchar **components;
- gchar *new_uri = NULL;
-
- components = g_strsplit (uri, ";", 2);
- if (components[0])
- new_uri = g_strdup (components[0]);
- g_strfreev (components);
- return new_uri;
-}
-
-static void
-load_source_auth_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- LoadSourceData *data = closure;
-
- if (data->cancelled) {
- free_load_source_data (data);
- return;
- }
-
- if (status != E_BOOK_ERROR_OK) {
-
- /* the user clicked cancel in the password dialog */
- if (status == E_BOOK_ERROR_CANCELLED) {
-
- if (e_book_check_static_capability (book, "anon-access")) {
-
- GtkWidget *dialog;
-
- /* XXX "LDAP" has to be removed from the folowing message
- so that it wil valid for other servers which provide
- anonymous access*/
-
- dialog = gtk_message_dialog_new (NULL,
- 0,
- GTK_MESSAGE_WARNING,
- GTK_BUTTONS_OK,
- _("Accessing LDAP Server anonymously"));
- g_signal_connect (dialog, "response", G_CALLBACK(gtk_widget_destroy), NULL);
- gtk_widget_show (dialog);
- data->cb (book, E_BOOK_ERROR_OK, data->closure);
- free_load_source_data (data);
- return;
- }
- }
- else {
- gchar *uri = e_source_get_uri (data->source);
- gchar *stripped_uri = remove_parameters_from_uri (uri);
- const gchar *auth_domain = e_source_get_property (data->source, "auth-domain");
- const gchar *component_name;
-
- component_name = auth_domain ? auth_domain : "Addressbook";
-
- e_passwords_forget_password (component_name, stripped_uri);
- addressbook_authenticate (book, TRUE, data->source, load_source_auth_cb, closure);
-
- g_free (stripped_uri);
- g_free (uri);
- return;
- }
- }
-
- if (data->cb)
- data->cb (book, status, data->closure);
-
- free_load_source_data (data);
-}
-
-static gboolean
-get_remember_password (ESource *source)
-{
- const gchar *value;
-
- value = e_source_get_property (source, "remember_password");
- if (value && !strcasecmp (value, "true"))
- return TRUE;
-
- return FALSE;
-}
-
-static void
-set_remember_password (ESource *source, gboolean value)
-{
- e_source_set_property (source, "remember_password",
- value ? "true" : "false");
-}
-
-static void
-addressbook_authenticate (EBook *book, gboolean previous_failure, ESource *source,
- EBookCallback cb, gpointer closure)
-{
- const char *password = NULL;
- char *pass_dup = NULL;
- const gchar *auth;
- const gchar *user;
- gchar *uri = e_source_get_uri (source);
- gchar *stripped_uri = remove_parameters_from_uri (uri);
- const gchar *auth_domain = e_source_get_property (source, "auth-domain");
- const gchar *component_name;
-
- component_name = auth_domain ? auth_domain : "Addressbook";
- g_free (uri);
- uri = stripped_uri;
-
- password = e_passwords_get_password (component_name, uri);
-
- auth = e_source_get_property (source, "auth");
-
- if (auth && !strcmp ("ldap/simple-binddn", auth))
- user = e_source_get_property (source, "binddn");
- else if (auth && !strcmp ("plain/password", auth))
- user = e_source_get_property (source, "user");
- else
- user = e_source_get_property (source, "email_addr");
- if (!user)
- user = "";
-
- if (!password) {
- char *prompt;
- char *password_prompt;
- gboolean remember;
- char *failed_auth;
- guint32 flags = E_PASSWORDS_REMEMBER_FOREVER|E_PASSWORDS_SECRET|E_PASSWORDS_ONLINE;
-
- if (previous_failure) {
- failed_auth = _("Failed to authenticate.\n");
- flags |= E_PASSWORDS_REPROMPT;
- }
- else {
- failed_auth = "";
- }
-
- password_prompt = g_strdup_printf (_("Enter password for %s (user %s)"),
- e_source_peek_name (source), user);
-
- prompt = g_strconcat (failed_auth, password_prompt, NULL);
- g_free (password_prompt);
-
- remember = get_remember_password (source);
- pass_dup = e_passwords_ask_password (prompt, component_name, uri, prompt,
- flags, &remember,
- NULL);
- if (remember != get_remember_password (source))
- set_remember_password (source, remember);
-
- g_free (prompt);
- }
-
- if (password || pass_dup) {
- e_book_async_authenticate_user (book, user, password ? password : pass_dup,
- e_source_get_property (source, "auth"),
- cb, closure);
- g_free (pass_dup);
- }
- else {
- /* they hit cancel */
-
- cb (book, E_BOOK_ERROR_CANCELLED, closure);
- }
-
- g_free (uri);
-}
-
-
-
-static void
-auth_required_cb (EBook *book, gpointer data)
-{
- LoadSourceData *load_source_data = g_new0(LoadSourceData, 1);
-
- load_source_data->source = g_object_ref (g_object_ref (e_book_get_source (book)));
- load_source_data->cancelled = FALSE;
- addressbook_authenticate (book, FALSE, load_source_data->source,
- load_source_auth_cb, load_source_data);
-
-
-
-}
-static void
-load_source_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- LoadSourceData *load_source_data = closure;
-
- if (load_source_data->cancelled) {
- free_load_source_data (load_source_data);
- return;
- }
-
- if (status == E_BOOK_ERROR_OK && book != NULL) {
- const gchar *auth;
-
- auth = e_source_get_property (load_source_data->source, "auth");
- if (auth && strcmp (auth, "none")) {
- g_signal_connect (book, "auth_required", auth_required_cb, NULL);
-
- if (e_book_is_online (book)) {
- addressbook_authenticate (book, FALSE, load_source_data->source,
- load_source_auth_cb, closure);
- return;
- }
- }
- }
- load_source_data->cb (book, status, load_source_data->closure);
- free_load_source_data (load_source_data);
-}
-
-guint
-addressbook_load (EBook *book,
- EBookCallback cb, gpointer closure)
-{
- LoadSourceData *load_source_data = g_new0 (LoadSourceData, 1);
-
- load_source_data->cb = cb;
- load_source_data->closure = closure;
- load_source_data->source = g_object_ref (g_object_ref (e_book_get_source (book)));
- load_source_data->cancelled = FALSE;
-
- e_book_async_open (book, FALSE, load_source_cb, load_source_data);
-
- return GPOINTER_TO_UINT (load_source_data);
-}
-
-void
-addressbook_load_cancel (guint id)
-{
- LoadSourceData *load_source_data = GUINT_TO_POINTER (id);
-
- load_source_data->cancelled = TRUE;
-}
-
-static void
-default_book_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- LoadSourceData *load_source_data = closure;
-
- if (status == E_BOOK_ERROR_OK)
- load_source_data->source = g_object_ref (e_book_get_source (book));
-
- load_source_cb (book, status, closure);
-}
-
-void
-addressbook_load_default_book (EBookCallback cb, gpointer closure)
-{
- LoadSourceData *load_source_data = g_new (LoadSourceData, 1);
- EBook *book;
-
- load_source_data->cb = cb;
- load_source_data->source = NULL;
- load_source_data->closure = closure;
- load_source_data->cancelled = FALSE;
-
- book = e_book_new_default_addressbook (NULL);
- if (!book)
- load_source_cb (NULL, E_BOOK_ERROR_OTHER_ERROR, load_source_data); /* XXX we should just use a GError and it's error code here */
- else
- e_book_async_open (book, FALSE, default_book_cb, load_source_data);
-}
diff --git a/addressbook/gui/component/addressbook.h b/addressbook/gui/component/addressbook.h
deleted file mode 100644
index a2a475951a..0000000000
--- a/addressbook/gui/component/addressbook.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef __ADDRESSBOOK_H__
-#define __ADDRESSBOOK_H__
-
-#include <bonobo/bonobo-control.h>
-#include <e-util/e-config-listener.h>
-#include <bonobo/bonobo-object.h>
-#include <bonobo/bonobo-moniker-util.h>
-#include <libebook/e-book.h>
-
-guint addressbook_load (EBook *book, EBookCallback cb, gpointer closure);
-void addressbook_load_cancel (guint id);
-void addressbook_load_default_book (EBookCallback open_response, gpointer closure);
-
-#endif /* __ADDRESSBOOK_H__ */
diff --git a/addressbook/gui/component/apps_evolution_addressbook.schemas.in.in b/addressbook/gui/component/apps_evolution_addressbook.schemas.in.in
deleted file mode 100644
index fd473c4169..0000000000
--- a/addressbook/gui/component/apps_evolution_addressbook.schemas.in.in
+++ /dev/null
@@ -1,70 +0,0 @@
-<gconfschemafile>
- <schemalist>
-
- <!-- Completion uris -->
-
- <schema>
- <key>/schemas/apps/evolution/addressbook/completion/uris</key>
- <applyto>/apps/evolution/addressbook/completion/uris</applyto>
- <owner>evolution-addressbook</owner>
- <type>string</type>
- <default></default>
- <locale name="C">
- <short>EFolderList XML for the list of completion URIs</short>
- <long>EFolderList XML for the list of completion URIs.</long>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/addressbook/completion/minimum_query_length</key>
- <applyto>/apps/evolution/addressbook/completion/minimum_query_length</applyto>
- <owner>evolution-addressbook</owner>
- <type>int</type>
- <default>3</default>
- <locale name="C">
- <short>The number of characters that must be typed before Evolution will attempt to autocomplete</short>
- <long>The number of characters that must be typed before Evolution will attempt to autocomplete.</long>
- </locale>
- </schema>
-
- <!-- Select names last used uri -->
-
- <schema>
- <key>/schemas/apps/evolution/addressbook/select_names/last_used_uri</key>
- <applyto>/apps/evolution/addressbook/select_names/last_used_uri</applyto>
- <owner>evolution-addressbook</owner>
- <type>string</type>
- <default></default>
- <locale name="C">
- <short>URI for the folder last used in the select names dialog</short>
- <long>URI for the folder last used in the select names dialog.</long>
- </locale>
- </schema>
-
- <!-- View state -->
-
- <schema>
- <key>/schemas/apps/evolution/addressbook/display/vpane_position</key>
- <applyto>/apps/evolution/addressbook/display/vpane_position</applyto>
- <owner>evolution-addressbook</owner>
- <type>int</type>
- <locale name="C">
- <short>Position of the vertical pane in main view</short>
- <long>Position of the vertical pane in main view.</long>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/addressbook/display/show_preview</key>
- <applyto>/apps/evolution/addressbook/display/show_preview</applyto>
- <owner>evolution-addressbook</owner>
- <type>bool</type>
- <default>true</default>
- <locale name="C">
- <short>Show the "Preview" pane</short>
- <long>Show the "Preview" pane.</long>
- </locale>
- </schema>
-
- </schemalist>
-</gconfschemafile>
diff --git a/addressbook/gui/component/autocompletion-config.c b/addressbook/gui/component/autocompletion-config.c
deleted file mode 100644
index 0324ad838e..0000000000
--- a/addressbook/gui/component/autocompletion-config.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell-config-autocompletion.h - Configuration page for addressbook autocompletion.
- *
- * Copyright (C) 2003 Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Authors: Chris Toshok <toshok@ximian.com>
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
-#include "autocompletion-config.h"
-
-#include "Evolution.h"
-
-#include <bonobo/bonobo-exception.h>
-
-#include <libedataserver/e-source-list.h>
-#include <libedataserverui/e-source-selector.h>
-#include <libgnome/gnome-i18n.h>
-#include <gtk/gtkscrolledwindow.h>
-#include <gtk/gtktreeselection.h>
-#include <gtk/gtkwidget.h>
-#include <gtk/gtksignal.h>
-
-
-typedef struct {
- EvolutionConfigControl *config_control;
-
- GtkWidget *control_widget;
-
- ESourceList *source_list;
-} AutocompletionConfig;
-
-static void
-source_selection_changed (ESourceSelector *selector,
- AutocompletionConfig *ac)
-{
- GSList *selection;
- GSList *l;
- GSList *groups;
-
- /* first we clear all the completion flags from all sources */
- for (groups = e_source_list_peek_groups (ac->source_list); groups; groups = groups->next) {
- ESourceGroup *group = E_SOURCE_GROUP (groups->data);
- GSList *sources;
- for (sources = e_source_group_peek_sources (group); sources; sources = sources->next) {
- ESource *source = E_SOURCE (sources->data);
-
- e_source_set_property (source, "completion", NULL);
- }
- }
-
- /* then we loop over the selector's selection, setting the
- property on those sources */
- selection = e_source_selector_get_selection (selector);
- for (l = selection; l; l = l->next) {
- e_source_set_property (E_SOURCE (l->data), "completion", "true");
- }
- e_source_selector_free_selection (selection);
-
- e_source_list_sync (ac->source_list, NULL); /* XXX we should pop up a dialog if this fails */
-}
-
-static void
-config_control_destroy_notify (void *data,
- GObject *where_the_config_control_was)
-{
- AutocompletionConfig *ac = (AutocompletionConfig *) data;
-
- g_object_unref (ac->source_list);
-
- g_free (ac);
-}
-
-static void
-initialize_selection (AutocompletionConfig *ac)
-{
- GSList *groups;
-
- for (groups = e_source_list_peek_groups (ac->source_list); groups; groups = groups->next) {
- ESourceGroup *group = E_SOURCE_GROUP (groups->data);
- GSList *sources;
- for (sources = e_source_group_peek_sources (group); sources; sources = sources->next) {
- ESource *source = E_SOURCE (sources->data);
- const char *completion = e_source_get_property (source, "completion");
- if (completion && !g_ascii_strcasecmp (completion, "true"))
- e_source_selector_select_source (E_SOURCE_SELECTOR (ac->control_widget),
- source);
- }
- }
-}
-
-EvolutionConfigControl*
-autocompletion_config_control_new (void)
-{
- AutocompletionConfig *ac;
- CORBA_Environment ev;
- GtkWidget *scrolledwin;
-
- ac = g_new0 (AutocompletionConfig, 1);
-
- CORBA_exception_init (&ev);
-
- ac->source_list = e_source_list_new_for_gconf_default ("/apps/evolution/addressbook/sources");
- /* XXX should we watch for the source list to change and
- update it in the control? what about our local changes? */
- /* g_signal_connect (ac->source_list, "changed", G_CALLBACK (source_list_changed), ac); */
-
- scrolledwin = gtk_scrolled_window_new (NULL, NULL);
-
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwin),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwin),
- GTK_SHADOW_IN);
-
- ac->control_widget = e_source_selector_new (ac->source_list);
-
- gtk_container_add (GTK_CONTAINER (scrolledwin), ac->control_widget);
-
- initialize_selection (ac);
-
- gtk_widget_show (ac->control_widget);
- gtk_widget_show (scrolledwin);
-
- ac->config_control = evolution_config_control_new (scrolledwin);
-
- g_signal_connect (ac->control_widget, "selection_changed",
- G_CALLBACK (source_selection_changed), ac);
-
- g_object_weak_ref (G_OBJECT (ac->config_control), config_control_destroy_notify, ac);
-
- CORBA_exception_free (&ev);
-
- return ac->config_control;
-}
-
diff --git a/addressbook/gui/component/autocompletion-config.h b/addressbook/gui/component/autocompletion-config.h
deleted file mode 100644
index 86f056477e..0000000000
--- a/addressbook/gui/component/autocompletion-config.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell-config-autocompletion.h - Configuration page for addressbook autocompletion.
- *
- * Copyright (C) 2003 Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Authors: Chris Toshok <toshok@ximian.com>
- */
-
-#ifndef _AUTOCOMPLETION_CONFIG_H
-#define _AUTOCOMPLETION_CONFIG_H
-
-#include "evolution-config-control.h"
-
-EvolutionConfigControl* autocompletion_config_control_new (void);
-
-#endif /* _AUTOCOMPLETION_CONFIG_H */
diff --git a/addressbook/gui/component/component-factory.c b/addressbook/gui/component/component-factory.c
deleted file mode 100644
index 4aaee9637b..0000000000
--- a/addressbook/gui/component/component-factory.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* component-factory.c - Factory for Evolution's Addressbook component.
- *
- * Copyright (C) 2002 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli <ettore@ximian.com>
- */
-
-#include <config.h>
-
-#include <string.h>
-#include "addressbook.h"
-#include "addressbook-component.h"
-#include "addressbook-config.h"
-#include "addressbook-view.h"
-#include "autocompletion-config.h"
-#include "eab-popup-control.h"
-#include "eab-vcard-control.h"
-#ifdef ENABLE_SMIME
-#include "smime/gui/certificate-manager.h"
-#endif
-#include <bonobo/bonobo-shlib-factory.h>
-
-
-#define FACTORY_ID "OAFIID:GNOME_Evolution_Addressbook_Factory:" BASE_VERSION
-
-#define VCARD_CONTROL_ID "OAFIID:GNOME_Evolution_Addressbook_VCard_Control:" BASE_VERSION
-#define COMPONENT_ID "OAFIID:GNOME_Evolution_Addressbook_Component:" BASE_VERSION
-#define ADDRESS_POPUP_ID "OAFIID:GNOME_Evolution_Addressbook_AddressPopup:" BASE_VERSION
-#define COMPLETION_CONFIG_CONTROL_ID "OAFIID:GNOME_Evolution_Addressbook_Autocompletion_ConfigControl:" BASE_VERSION
-#define CERTIFICATE_MANAGER_CONFIG_CONTROL_ID "OAFIID:GNOME_Evolution_SMime_CertificateManager_ConfigControl:" BASE_VERSION
-
-#define d(x)
-
-
-static BonoboObject *
-factory (BonoboGenericFactory *factory,
- const char *component_id,
- void *closure)
-{
- d(printf ("asked to activate component_id `%s'\n", component_id));
-
- if (strcmp (component_id, VCARD_CONTROL_ID) == 0)
- return BONOBO_OBJECT (eab_vcard_control_new ());
- if (strcmp (component_id, COMPONENT_ID) == 0) {
- BonoboObject *object = BONOBO_OBJECT (addressbook_component_peek ());
- bonobo_object_ref (object);
- return object;
- }
- if (strcmp (component_id, ADDRESS_POPUP_ID) == 0)
- return BONOBO_OBJECT (eab_popup_control_new ());
- if (strcmp (component_id, COMPLETION_CONFIG_CONTROL_ID) == 0)
- return BONOBO_OBJECT (autocompletion_config_control_new ());
-#ifdef ENABLE_SMIME
- if (strcmp (component_id, CERTIFICATE_MANAGER_CONFIG_CONTROL_ID) == 0)
- return BONOBO_OBJECT (certificate_manager_config_control_new ());
-#endif
-
- g_warning (FACTORY_ID ": Don't know what to do with %s", component_id);
- return NULL;
-}
-
-BONOBO_ACTIVATION_SHLIB_FACTORY (FACTORY_ID, "Evolution Addressbook component factory", factory, NULL)
diff --git a/addressbook/gui/component/ldap-config.glade b/addressbook/gui/component/ldap-config.glade
deleted file mode 100644
index 32ef5a6f72..0000000000
--- a/addressbook/gui/component/ldap-config.glade
+++ /dev/null
@@ -1,2676 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkDialog" id="account-editor-window">
- <property name="visible">True</property>
- <property name="title" translatable="yes">Address Book Properties</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="has_separator">False</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox7">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area7">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="account-editor-cancel-button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-6</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="account-editor-ok-button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-5</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkNotebook" id="account-editor-notebook">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="show_tabs">True</property>
- <property name="show_border">True</property>
- <property name="tab_pos">GTK_POS_TOP</property>
- <property name="scrollable">False</property>
- <property name="enable_popup">False</property>
-
- <child>
- <widget class="GtkVBox" id="account-editor-general-vbox">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label564">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Display&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox122">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label563">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label431">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Name:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">account-editor-display-name-entry</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="account-editor-display-name-entry">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">This is the name for this server that will appear in your Evolution folder list. It is for display purposes only. </property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="account-editor-connecting-vbox">
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label557">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Server Information&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox123">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label558">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table31">
- <property name="visible">True</property>
- <property name="n_rows">3</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label554">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Port:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry27</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label556">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Server:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">server-name-entry</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox123">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label555">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Use secure connection:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">ssl-optionmenu</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="ssl-optionmenu">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget41">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget42">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Selecting this option means that Evolution will only connect to your LDAP server if your LDAP server supports SSL or TLS.</property>
- <property name="label" translatable="yes">Always</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget43">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Selecting this option means that Evolution will only try to use SSL/TLS if you are in a insecure environment. For example, if you and your LDAP server are behind a firewall at work, then Evolution doesn't need to use SSL/TLS because your connection is already secure.</property>
- <property name="label" translatable="yes">Whenever Possible</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget44">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Selecting this option means that your server does not support either SSL or TLS. This means that your connection will be insecure, and that you will be vulnerable to security exploits. </property>
- <property name="label" translatable="yes">Never</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">expand|shrink|fill</property>
- <property name="y_options">shrink|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCombo" id="port-combo">
- <property name="visible">True</property>
- <property name="value_in_list">False</property>
- <property name="allow_empty">True</property>
- <property name="case_sensitive">False</property>
- <property name="enable_arrow_keys">True</property>
- <property name="enable_arrows_always">False</property>
-
- <child internal-child="entry">
- <widget class="GtkEntry" id="entry27">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">This is the port on the LDAP server that Evolution will try to connect to. A list of standard ports has been provided. Ask your system administrator what port you should specify.</property>
- <property name="can_focus">True</property>
- <property name="has_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- </child>
-
- <child internal-child="list">
- <widget class="GtkList" id="convertwidget32">
- <property name="visible">True</property>
- <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-
- <child>
- <widget class="GtkListItem" id="listitem16">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">389</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="listitem17">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">636</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="listitem18">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">3268</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="server-name-entry">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">This is the full name of your ldap server. For example, &quot;ldap.mycompany.com&quot;.</property>
- <property name="can_focus">True</property>
- <property name="has_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label559">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Authentication&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox124">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label562">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table32">
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label560">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Log in method:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">auth-optionmenu</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label561">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Lo_gin:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">auth-entry</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="auth-optionmenu">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">This is the method Evolution will use to authenticate you. Note that setting this to &quot;Email Address&quot; requires anonymous access to your ldap server.</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget28">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget29">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Anonymously</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget30">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Using email address</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget31">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Using distinguished name (DN)</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">expand|shrink|fill</property>
- <property name="y_options">shrink</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="auth-entry">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Evolution will use this email address to authenticate you with the server.</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label334">
- <property name="visible">True</property>
- <property name="label" translatable="yes">General</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="account-editor-searching-vbox">
- <property name="border_width">12</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label565">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Searching&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox125">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label571">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table33">
- <property name="visible">True</property>
- <property name="n_rows">3</property>
- <property name="n_columns">3</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label569">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label566">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Search _base:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">rootdn-entry</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">expand|shrink|fill</property>
- <property name="y_options">shrink|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label567">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Search scope:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">scope-optionmenu</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">expand|shrink|fill</property>
- <property name="y_options">shrink|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="scope-optionmenu">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">The search scope defines how deep you would like the search to extend down the directory tree. A search scope of &quot;sub&quot; will include all entries below your search base. A search scope of &quot;one&quot; will only include the entries one level beneath your base.</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu12">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem7">
- <property name="visible">True</property>
- <property name="label" translatable="yes">One</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem8">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Sub</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">expand|shrink|fill</property>
- <property name="y_options">shrink|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="rootdn-entry">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">The search base is the distinguished name (DN) of the entry where your searches will begin. If you leave this blank, the search will begin at the root of the directory tree.</property>
- <property name="can_focus">True</property>
- <property name="has_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">expand|shrink|fill</property>
- <property name="y_options">shrink|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkButton" id="rootdn-button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment61">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox126">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child>
- <widget class="GtkImage" id="image10">
- <property name="visible">True</property>
- <property name="stock">gtk-find</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label568">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Find Possible Search Bases</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">expand|shrink|fill</property>
- <property name="y_options">shrink|fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label572">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Downloading&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox127">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label579">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table34">
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">3</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkHBox" id="hbox128">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label575">
- <property name="visible">True</property>
- <property name="label" translatable="yes">1</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHScale" id="timeout-scale">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="draw_value">False</property>
- <property name="value_pos">GTK_POS_TOP</property>
- <property name="digits">1</property>
- <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
- <property name="inverted">False</property>
- <property name="adjustment">3 1 5 0.5 1 0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label576">
- <property name="visible">True</property>
- <property name="label" translatable="yes">5</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">expand|shrink|fill</property>
- <property name="y_options">shrink|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label574">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">shrink|fill</property>
- <property name="y_options">shrink|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label578">
- <property name="visible">True</property>
- <property name="label" translatable="yes">cards</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">shrink|fill</property>
- <property name="y_options">shrink|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label573">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Timeout:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">timeout-scale</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">shrink|fill</property>
- <property name="y_options">shrink|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label577">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Download limit:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">download-limit-spinbutton</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">shrink|fill</property>
- <property name="y_options">shrink|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="download-limit-spinbutton">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">This is the maximum number of entries to download. Setting this number to be too large will slow down your address book.</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">False</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">0 0 1000 1 10 10</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">expand|shrink|fill</property>
- <property name="y_options">shrink|fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label344">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Details</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-<widget class="GtkDialog" id="supported-bases-dialog">
- <property name="title" translatable="yes">Supported Search Bases</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_CENTER</property>
- <property name="modal">False</property>
- <property name="default_width">320</property>
- <property name="default_height">200</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="has_separator">False</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox8">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area8">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="cancelbutton1">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-6</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="okbutton1">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-5</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox40">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="Custom" id="supported-bases-table">
- <property name="visible">True</property>
- <property name="creation_function">supported_bases_create_table</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Fri, 12 Apr 2002 20:06:45 GMT</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-<widget class="GtkDialog" id="account-add-window">
- <property name="visible">True</property>
- <property name="title" translatable="yes">Add Address Book</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="has_separator">False</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox10">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area10">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="cancel-button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-6</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="ok-button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">0</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment62">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox129">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child>
- <widget class="GtkImage" id="image11">
- <property name="visible">True</property>
- <property name="stock">gtk-add</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label580">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Add Address Book</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkNotebook" id="notebook1">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="show_tabs">True</property>
- <property name="show_border">True</property>
- <property name="tab_pos">GTK_POS_TOP</property>
- <property name="scrollable">False</property>
- <property name="enable_popup">False</property>
-
- <child>
- <widget class="GtkVBox" id="vbox5">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkHBox" id="hbox19">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label64">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Type:&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="group-optionmenu">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">-1</property>
-
- <child>
- <widget class="GtkMenu" id="menu11">
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="frame1">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkTable" id="table7">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="n_rows">1</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkEntry" id="display-name-entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label41">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Name:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">display-name-entry</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label38">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Display&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="server-frame">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkTable" id="table8">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="n_rows">3</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkEntry" id="server-name-entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label44">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Port:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">port-entry</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCombo" id="port-combo">
- <property name="visible">True</property>
- <property name="value_in_list">False</property>
- <property name="allow_empty">True</property>
- <property name="case_sensitive">False</property>
- <property name="enable_arrow_keys">True</property>
- <property name="enable_arrows_always">False</property>
-
- <child internal-child="entry">
- <widget class="GtkEntry" id="port-entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- </child>
-
- <child internal-child="list">
- <widget class="GtkList" id="combo-list1">
- <property name="visible">True</property>
- <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-
- <child>
- <widget class="GtkListItem" id="listitem11">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">389</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="listitem12">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">636</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="listitem13">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">3268</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox15">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label50">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Use secure connection:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">ssl-optionmenu</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="ssl-optionmenu">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu9">
-
- <child>
- <widget class="GtkMenuItem" id="always1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Always</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_always1_activate" last_modification_time="Mon, 29 Mar 2004 21:37:12 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Whenever Possible</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_whenever_possible1_activate" last_modification_time="Mon, 29 Mar 2004 21:37:12 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="never1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Never</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_never1_activate" last_modification_time="Mon, 29 Mar 2004 21:37:12 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="server-name-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Server:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">server-name-entry</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label39">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Server Information&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="authentication-frame">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkTable" id="table9">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label46">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Log in method:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">auth-optionmenu</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label47">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Lo_gin:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">auth-entry</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="auth-entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="auth-optionmenu">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu8">
-
- <child>
- <widget class="GtkMenuItem" id="anonymously1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Anonymously</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_anonymously1_activate" last_modification_time="Mon, 29 Mar 2004 21:27:10 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="email_address2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Email address</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_email_address2_activate" last_modification_time="Mon, 29 Mar 2004 21:27:10 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="distinguished_name2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Distinguished name</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_distinguished_name2_activate" last_modification_time="Mon, 29 Mar 2004 21:27:10 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label49">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Authentication&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="basic-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Basic</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="details-vbox">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkFrame" id="searching-frame">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkTable" id="table10">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="n_rows">3</property>
- <property name="n_columns">3</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label53">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Search _base:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">rootdn-entry</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label54">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Search scope:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">scope-optionmenu</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="rootdn-entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkButton" id="rootdn-button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment13">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox16">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child>
- <widget class="GtkImage" id="image9">
- <property name="visible">True</property>
- <property name="stock">gtk-find</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label57">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Find Possible Search Bases</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="scope-optionmenu">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu10">
-
- <child>
- <widget class="GtkMenuItem" id="one">
- <property name="visible">True</property>
- <property name="label" translatable="yes">One</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="sub">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Sub</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label55">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label56">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label51">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Searching&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="downloading-frame">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkTable" id="table11">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">3</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label58">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Timeout:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">timeout-scale</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label59">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox17">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label60">
- <property name="visible">True</property>
- <property name="label" translatable="yes">1</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHScale" id="timeout-scale">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="draw_value">False</property>
- <property name="value_pos">GTK_POS_TOP</property>
- <property name="digits">1</property>
- <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
- <property name="inverted">False</property>
- <property name="adjustment">3 1 5 0.5 1 0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label61">
- <property name="visible">True</property>
- <property name="label" translatable="yes">5</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label62">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Download limit:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">download-limit-spinbutton</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label63">
- <property name="visible">True</property>
- <property name="label" translatable="yes">cards</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="download-limit-spinbutton">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">False</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">0 0 1000 1 10 10</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label52">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Downloading&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="details-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Details</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/addressbook/gui/component/select-names/.cvsignore b/addressbook/gui/component/select-names/.cvsignore
deleted file mode 100644
index 1520453f86..0000000000
--- a/addressbook/gui/component/select-names/.cvsignore
+++ /dev/null
@@ -1,15 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-Evolution-Addressbook-SelectNames-stubs.c
-Evolution-Addressbook-SelectNames-skels.c
-Evolution-Addressbook-SelectNames-common.c
-Evolution-Addressbook-SelectNames.h
-GNOME_Evolution_Addressbook_SelectNames*.server
-GNOME_Evolution_Addressbook_SelectNames*.server.in
-e-select-names-marshal.c
-e-select-names-marshal.h
diff --git a/addressbook/gui/contact-editor/.cvsignore b/addressbook/gui/contact-editor/.cvsignore
deleted file mode 100644
index ddbd38bb6e..0000000000
--- a/addressbook/gui/contact-editor/.cvsignore
+++ /dev/null
@@ -1,11 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-contact-editor-test
-contact-editor.gladep
-e-contact-editor-marshal.c
-e-contact-editor-marshal.h
diff --git a/addressbook/gui/contact-editor/Makefile.am b/addressbook/gui/contact-editor/Makefile.am
deleted file mode 100644
index 376aa65205..0000000000
--- a/addressbook/gui/contact-editor/Makefile.am
+++ /dev/null
@@ -1,50 +0,0 @@
-INCLUDES = \
- -I$(top_srcdir) \
- -I$(top_srcdir)/addressbook/ \
- -I$(top_srcdir)/addressbook/backend \
- -I$(top_builddir)/addressbook/backend \
- -I$(top_srcdir)/addressbook/gui/merging \
- -I$(top_srcdir)/widgets/e-table \
- -I$(top_builddir)/shell \
- -I$(top_srcdir)/camel \
- -I$(top_builddir)/camel \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_DATADIR=\""$(datadir)"\" \
- -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \
- -DEVOLUTION_UIDIR=\""$(evolutionuidir)\"" \
- -DPREFIX=\""$(prefix)"\" \
- -DG_LOG_DOMAIN=\"contact-editor\" \
- $(EVOLUTION_ADDRESSBOOK_CFLAGS)
-
-noinst_LTLIBRARIES = \
- libecontacteditor.la
-
-libecontacteditor_la_SOURCES = \
- $(MARSHAL_GENERATED) \
- eab-editor.c \
- eab-editor.h \
- e-contact-editor-im.c \
- e-contact-editor-im.h \
- e-contact-editor-address.c \
- e-contact-editor-address.h \
- e-contact-editor-fullname.c \
- e-contact-editor-fullname.h \
- e-contact-editor.c \
- e-contact-editor.h \
- e-contact-quick-add.c \
- e-contact-quick-add.h
-
-MARSHAL_GENERATED = e-contact-editor-marshal.c e-contact-editor-marshal.h
-@EVO_MARSHAL_RULE@
-
-glade_DATA = \
- im.glade \
- contact-editor.glade \
- fulladdr.glade \
- fullname.glade
-
-BUILT_SOURCES = $(MARSHAL_GENERATED)
-CLEANFILES = $(BUILT_SOURCES)
-
-EXTRA_DIST= $(glade_DATA) \
- e-contact-editor-marshal.list
diff --git a/addressbook/gui/contact-editor/contact-editor.glade b/addressbook/gui/contact-editor/contact-editor.glade
deleted file mode 100644
index f396def9f1..0000000000
--- a/addressbook/gui/contact-editor/contact-editor.glade
+++ /dev/null
@@ -1,3769 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkDialog" id="contact editor">
- <property name="title" translatable="yes">Contact Editor</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="has_separator">False</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="button-help">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-help</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-11</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="button-cancel">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-6</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="button-ok">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="has_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-5</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkNotebook" id="notebook11">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="show_tabs">True</property>
- <property name="show_border">True</property>
- <property name="tab_pos">GTK_POS_TOP</property>
- <property name="scrollable">False</property>
- <property name="enable_popup">False</property>
-
- <child>
- <widget class="GtkVBox" id="vbox33">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">1</property>
-
- <child>
- <widget class="GtkHBox" id="hbox55">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkButton" id="button-image">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <accessibility>
- <atkproperty name="AtkObject::accessible_name" translatable="yes">Image</atkproperty>
- </accessibility>
-
- <child>
- <widget class="Custom" id="image-chooser">
- <property name="visible">True</property>
- <property name="creation_function">eab_create_image_chooser_widget</property>
- <property name="string1">stock_person</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Tue, 13 Apr 2004 20:51:33 GMT</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table83">
- <property name="visible">True</property>
- <property name="n_rows">3</property>
- <property name="n_columns">4</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label-nickname">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Ni_ckname:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-nickname</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-fullname">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="button-fullname" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="accellabel-fileas">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_File under:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-file-as</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="where-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Where:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkButton" id="button-categories">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Categories</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-categories">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="button-categories" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">4</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-nickname">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCombo" id="combo-file-as">
- <property name="visible">True</property>
- <property name="value_in_list">False</property>
- <property name="allow_empty">True</property>
- <property name="case_sensitive">False</property>
- <property name="enable_arrow_keys">True</property>
- <property name="enable_arrows_always">False</property>
- <accessibility>
- <atkrelation target="accellabel-fileas" type="labelled-by"/>
- </accessibility>
-
- <child internal-child="entry">
- <widget class="GtkEntry" id="entry-file-as">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- </child>
-
- <child internal-child="list">
- <widget class="GtkList" id="list14">
- <property name="visible">True</property>
- <property name="selection_mode">GTK_SELECTION_BROWSE</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="source-option-menu-source">
- <property name="visible">True</property>
- <property name="creation_function">e_contact_editor_create_source_option_menu</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Tue, 13 Apr 2004 20:47:50 GMT</property>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkButton" id="button-fullname">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Full _Name...</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHSeparator" id="hseparator10">
- <property name="visible">True</property>
- </widget>
- <packing>
- <property name="padding">6</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox34">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">10</property>
-
- <child>
- <widget class="GtkFrame" id="frame65">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkTable" id="table85">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="n_rows">3</property>
- <property name="n_columns">4</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkOptionMenu" id="optionmenu-email-1">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu169">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem380">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Work</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem381">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Personal</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="optionmenu-email-2">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu170">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem382">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Work</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem383">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Personal</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-email-2">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="optionmenu-email-2" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="optionmenu-email-3">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu171">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem384">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Work</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem385">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Personal</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="optionmenu-email-4">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu172">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem386">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Work</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem387">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Personal</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-email-1">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="optionmenu-email-1" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-email-3">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="optionmenu-email-3" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-email-4">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="optionmenu-email-4" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="checkbutton-htmlmail">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Wants to receive HTML mail</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">4</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label400">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Email&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox38">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkFrame" id="frame64">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkVBox" id="vbox37">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkTable" id="table84">
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">4</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkEntry" id="entry-phone-1">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="optionmenu-phone-1" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-phone-2">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="optionmenu-phone-2" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-phone-4">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="optionmenu-phone-4" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-phone-3">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="optionmenu-phone-3" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="optionmenu-phone-1">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu179">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem412">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Work</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem413">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Personal</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="optionmenu-phone-2">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu180">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem414">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Work</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem415">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Personal</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="optionmenu-phone-3">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu181">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem416">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Work</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem417">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Personal</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="optionmenu-phone-4">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu182">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem418">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Work</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem419">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Personal</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table-phone-extended">
- <property name="n_rows">2</property>
- <property name="n_columns">4</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkOptionMenu" id="optionmenu-phone-5">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu187">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem430">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Work</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem431">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Personal</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="optionmenu-phone-6">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu188">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem432">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Work</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem433">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Personal</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-phone-5">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="optionmenu-phone-5" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-phone-6">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="optionmenu-phone-6" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="optionmenu-phone-7">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu189">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem434">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Work</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem435">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Personal</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="optionmenu-phone-8">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu190">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem436">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Work</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem437">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Personal</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-phone-7">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="optionmenu-phone-7" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-phone-8">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="optionmenu-phone-8" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox56">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">4</property>
-
- <child>
- <widget class="GtkLabel" id="label399">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Telephone&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkButton" id="button-phone-expand">
- <property name="width_request">20</property>
- <property name="height_request">20</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NONE</property>
- <property name="focus_on_click">True</property>
- <accessibility>
- <atkproperty name="AtkObject::accessible_name" translatable="yes">Telephone</atkproperty>
- </accessibility>
-
- <child>
- <widget class="GtkArrow" id="arrow-phone-expand">
- <property name="visible">True</property>
- <property name="arrow_type">GTK_ARROW_RIGHT</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="frame66">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkTable" id="table86">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">4</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkOptionMenu" id="optionmenu-im-service-1">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu173">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem388">
- <property name="visible">True</property>
- <property name="label" translatable="yes">AIM</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_aim1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem389">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Novell Groupwise</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_novell_groupwise1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem390">
- <property name="visible">True</property>
- <property name="label" translatable="yes">MSN Messenger</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_msn_messenger1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-im-name-1">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="optionmenu-im-service-1" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="optionmenu-im-service-2">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu174">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem391">
- <property name="visible">True</property>
- <property name="label" translatable="yes">AIM</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_aim1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem392">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Novell Groupwise</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_novell_groupwise1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem393">
- <property name="visible">True</property>
- <property name="label" translatable="yes">MSN Messenger</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_msn_messenger1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-im-name-2">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="optionmenu-im-service-2" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="optionmenu-im-service-3">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu175">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem394">
- <property name="visible">True</property>
- <property name="label" translatable="yes">AIM</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_aim1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem395">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Novell Groupwise</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_novell_groupwise1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem396">
- <property name="visible">True</property>
- <property name="label" translatable="yes">MSN Messenger</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_msn_messenger1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-im-name-3">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="optionmenu-im-service-3" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="optionmenu-im-service-4">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu183">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem420">
- <property name="visible">True</property>
- <property name="label" translatable="yes">AIM</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_aim1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem421">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Novell Groupwise</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_novell_groupwise1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem422">
- <property name="visible">True</property>
- <property name="label" translatable="yes">MSN Messenger</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_msn_messenger1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-im-name-4">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="optionmenu-im-service-4" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label404">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Instant Messaging&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">True</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label405">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Contact</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox35">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkFrame" id="frame67">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkTable" id="table87">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="n_rows">5</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="accellabel-homepage">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Home Page:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-homepage</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-caluri">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Calendar:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-caluri</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-fburl">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Free/Busy:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-fburl</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-videourl">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Video Chat:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-videourl</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="entry-homepage">
- <property name="visible">True</property>
- <property name="creation_function">e_contact_editor_create_web</property>
- <property name="string1">Home Page:</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Tue, 13 Apr 2004 22:04:21 GMT</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="entry-caluri">
- <property name="visible">True</property>
- <property name="creation_function">e_contact_editor_create_web</property>
- <property name="string1">Calendar:</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Tue, 13 Apr 2004 22:04:51 GMT</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="entry-fburl">
- <property name="visible">True</property>
- <property name="creation_function">e_contact_editor_create_web</property>
- <property name="string1">Free/Busy:</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Tue, 13 Apr 2004 22:05:05 GMT</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="entry-videourl">
- <property name="visible">True</property>
- <property name="creation_function">e_contact_editor_create_web</property>
- <property name="string1">Video Chat:</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Tue, 13 Apr 2004 22:05:30 GMT</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-weblog">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Web Log:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-weblog</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="entry-weblog">
- <property name="visible">True</property>
- <property name="creation_function">e_contact_editor_create_web</property>
- <property name="string1">Web Log:</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Tue, 13 Apr 2004 22:04:21 GMT</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label410">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Web Addresses&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="frame68">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkTable" id="table88">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="n_rows">3</property>
- <property name="n_columns">4</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label-profession">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Profession:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-profession</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-profession">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-profession" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-jobtitle">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Title:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-jobtitle</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-jobtitle">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-jobtitle" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-company">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Company:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-company</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-company">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-company" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-department">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Department:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-department</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-department">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-department" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-manager">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Manager:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-manager</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-manager">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-manager" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-assistant">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Assistant:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-assistant</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-assistant">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-assistant" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label417">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Job&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="frame69">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkTable" id="table89">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="n_rows">3</property>
- <property name="n_columns">4</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow41">
- <property name="height_request">38</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
- <child>
- <widget class="GtkTextView" id="text-comments">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="overwrite">False</property>
- <property name="accepts_tab">True</property>
- <property name="justification">GTK_JUSTIFY_LEFT</property>
- <property name="wrap_mode">GTK_WRAP_NONE</property>
- <property name="cursor_visible">True</property>
- <property name="pixels_above_lines">0</property>
- <property name="pixels_below_lines">0</property>
- <property name="pixels_inside_wrap">0</property>
- <property name="left_margin">0</property>
- <property name="right_margin">0</property>
- <property name="indent">0</property>
- <property name="text" translatable="yes"></property>
- <accessibility>
- <atkrelation target="label-comments" type="labelled-by"/>
- </accessibility>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">4</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-comments">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Notes:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">text-comments</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-office">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Office:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-office</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-spouse">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Spouse:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-spouse</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-office">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-office" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-spouse">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-spouse" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-birthday">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Birthday:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">dateedit-birthday</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-anniversary">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Anniversary:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">dateedit-anniversary</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="dateedit-anniversary">
- <property name="visible">True</property>
- <property name="creation_function">e_contact_editor_create_date</property>
- <property name="string1">Anniversary</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Tue, 13 Apr 2004 23:56:03 GMT</property>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="dateedit-birthday">
- <property name="visible">True</property>
- <property name="creation_function">e_contact_editor_create_date</property>
- <property name="string1">Birthday</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Tue, 13 Apr 2004 23:55:46 GMT</property>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label421">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Miscellaneous&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label422">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Personal Information</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox36">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkFrame" id="frame70">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkTable" id="table90">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="n_rows">4</property>
- <property name="n_columns">4</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label-home-city">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_City:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-home-city</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-home-city">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-home-city" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-home-zip">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Zip/Postal Code:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-home-zip</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-home-zip">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-home-zip" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-home-state">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_State/Province:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-home-state</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-home-state">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-home-state" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-home-country">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Country:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-home-country</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-home-country">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-home-country" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-home-address">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Address:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">textview-home-address</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow42">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
- <child>
- <widget class="GtkTextView" id="textview-home-address">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="overwrite">False</property>
- <property name="accepts_tab">True</property>
- <property name="justification">GTK_JUSTIFY_LEFT</property>
- <property name="wrap_mode">GTK_WRAP_NONE</property>
- <property name="cursor_visible">True</property>
- <property name="pixels_above_lines">0</property>
- <property name="pixels_below_lines">0</property>
- <property name="pixels_inside_wrap">0</property>
- <property name="left_margin">0</property>
- <property name="right_margin">0</property>
- <property name="indent">0</property>
- <property name="text" translatable="yes"></property>
- <accessibility>
- <atkrelation target="label-home-address" type="labelled-by"/>
- </accessibility>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">3</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-home-pobox">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-home-pobox" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-home-pobox">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_PO Box:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-home-pobox</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label429">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Home&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="frame71">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkTable" id="table91">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="n_rows">4</property>
- <property name="n_columns">4</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label-work-city">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_City:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-work-city</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-work-city">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-work-city" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-work-state">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_State/Province:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-work-state</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-work-state">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-work-state" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-work-zip">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Zip/Postal Code:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-work-zip</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-work-zip">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-work-zip" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-work-country">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Country:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-work-country</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-work-country">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-work-country" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-work-address">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Address:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">textview-work-address</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow43">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
- <child>
- <widget class="GtkTextView" id="textview-work-address">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="overwrite">False</property>
- <property name="accepts_tab">True</property>
- <property name="justification">GTK_JUSTIFY_LEFT</property>
- <property name="wrap_mode">GTK_WRAP_NONE</property>
- <property name="cursor_visible">True</property>
- <property name="pixels_above_lines">0</property>
- <property name="pixels_below_lines">0</property>
- <property name="pixels_inside_wrap">0</property>
- <property name="left_margin">0</property>
- <property name="right_margin">0</property>
- <property name="indent">0</property>
- <property name="text" translatable="yes"></property>
- <accessibility>
- <atkrelation target="label-work-address" type="labelled-by"/>
- </accessibility>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">3</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-work-pobox">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-work-pobox" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-work-pobox">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_PO Box:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-work-pobox</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label436">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Work&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="frame72">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkTable" id="table92">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="n_rows">4</property>
- <property name="n_columns">4</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label-other-city">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_City:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-other-city</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-other-city">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-other-city" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-other-address">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Address:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">textview-other-address</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-other-state">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-other-state" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-other-state">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_State/Province:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-other-state</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-other-zip">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Zip/Postal Code:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-other-zip</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-other-zip">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-other-zip" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-other-country">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Country:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-other-country</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-other-country">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-other-country" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow44">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
- <child>
- <widget class="GtkTextView" id="textview-other-address">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="overwrite">False</property>
- <property name="accepts_tab">True</property>
- <property name="justification">GTK_JUSTIFY_LEFT</property>
- <property name="wrap_mode">GTK_WRAP_NONE</property>
- <property name="cursor_visible">True</property>
- <property name="pixels_above_lines">0</property>
- <property name="pixels_below_lines">0</property>
- <property name="pixels_inside_wrap">0</property>
- <property name="left_margin">0</property>
- <property name="right_margin">0</property>
- <property name="indent">0</property>
- <property name="text" translatable="yes"></property>
- <accessibility>
- <atkrelation target="label-other-address" type="labelled-by"/>
- </accessibility>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">3</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-other-pobox">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="label-other-pobox" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-other-pobox">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_PO Box:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-other-pobox</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label444">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Other&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label437">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Mailing Address</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/addressbook/gui/contact-editor/e-contact-editor-address.c b/addressbook/gui/contact-editor/e-contact-editor-address.c
deleted file mode 100644
index 1fc4994594..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor-address.c
+++ /dev/null
@@ -1,627 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-editor-address.c
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include <e-contact-editor-address.h>
-#include <e-util/e-icon-factory.h>
-
-#include <glib.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnome/gnome-util.h>
-#include <gal/widgets/e-gui-utils.h>
-#include <gtk/gtkcombo.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkstock.h>
-#include <gtk/gtklabel.h>
-#include <string.h>
-#include <stdlib.h>
-#include <locale.h>
-
-static void e_contact_editor_address_init (EContactEditorAddress *card);
-static void e_contact_editor_address_class_init (EContactEditorAddressClass *klass);
-static void e_contact_editor_address_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
-static void e_contact_editor_address_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
-static void e_contact_editor_address_dispose (GObject *object);
-
-static void fill_in_info(EContactEditorAddress *editor);
-static void extract_info(EContactEditorAddress *editor);
-
-static GtkDialogClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- PROP_0,
- PROP_ADDRESS,
- PROP_EDITABLE
-};
-
-GType
-e_contact_editor_address_get_type (void)
-{
- static GType contact_editor_address_type = 0;
-
- if (!contact_editor_address_type) {
- static const GTypeInfo contact_editor_address_info = {
- sizeof (EContactEditorAddressClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) e_contact_editor_address_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EContactEditorAddress),
- 0, /* n_preallocs */
- (GInstanceInitFunc) e_contact_editor_address_init,
- };
-
- contact_editor_address_type = g_type_register_static (GTK_TYPE_DIALOG, "EContactEditorAddress", &contact_editor_address_info, 0);
- }
-
- return contact_editor_address_type;
-}
-
-static void
-e_contact_editor_address_class_init (EContactEditorAddressClass *klass)
-{
- GObjectClass *object_class;
-
- object_class = G_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_ref (GTK_TYPE_DIALOG);
-
- object_class->set_property = e_contact_editor_address_set_property;
- object_class->get_property = e_contact_editor_address_get_property;
- object_class->dispose = e_contact_editor_address_dispose;
-
- g_object_class_install_property (object_class, PROP_ADDRESS,
- g_param_spec_boxed ("address",
- _("Address"),
- /*_( */"XXX blurb" /*)*/,
- e_contact_address_get_type (),
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_EDITABLE,
- g_param_spec_boolean ("editable",
- _("Editable"),
- /*_( */"XXX blurb" /*)*/,
- FALSE,
- G_PARAM_READWRITE));
-}
-
-static GList *
-add_to_tab_order(GList *list, GladeXML *gui, char *name)
-{
- GtkWidget *widget = glade_xml_get_widget(gui, name);
- return g_list_prepend(list, widget);
-}
-
-static void
-setup_tab_order(GladeXML *gui)
-{
- GtkWidget *container;
- GList *list = NULL;
-
- container = glade_xml_get_widget(gui, "table-checkaddress");
-
- if (container) {
- list = add_to_tab_order(list, gui, "entry-city");
- list = add_to_tab_order(list, gui, "entry-region");
- list = add_to_tab_order(list, gui, "entry-code");
- list = add_to_tab_order(list, gui, "combo-country");
- list = g_list_reverse(list);
- e_container_change_tab_order(GTK_CONTAINER(container), list);
- g_list_free(list);
- }
-}
-
-static char * countries [] = {
- N_("United States"),
- N_("Afghanistan"),
- N_("Albania"),
- N_("Algeria"),
- N_("American Samoa"),
- N_("Andorra"),
- N_("Angola"),
- N_("Anguilla"),
- N_("Antarctica"),
- N_("Antigua And Barbuda"),
- N_("Argentina"),
- N_("Armenia"),
- N_("Aruba"),
- N_("Australia"),
- N_("Austria"),
- N_("Azerbaijan"),
- N_("Bahamas"),
- N_("Bahrain"),
- N_("Bangladesh"),
- N_("Barbados"),
- N_("Belarus"),
- N_("Belgium"),
- N_("Belize"),
- N_("Benin"),
- N_("Bermuda"),
- N_("Bhutan"),
- N_("Bolivia"),
- N_("Bosnia And Herzegowina"),
- N_("Botswana"),
- N_("Bouvet Island"),
- N_("Brazil"),
- N_("British Indian Ocean Territory"),
- N_("Brunei Darussalam"),
- N_("Bulgaria"),
- N_("Burkina Faso"),
- N_("Burundi"),
- N_("Cambodia"),
- N_("Cameroon"),
- N_("Canada"),
- N_("Cape Verde"),
- N_("Cayman Islands"),
- N_("Central African Republic"),
- N_("Chad"),
- N_("Chile"),
- N_("China"),
- N_("Christmas Island"),
- N_("Cocos (Keeling) Islands"),
- N_("Colombia"),
- N_("Comoros"),
- N_("Congo"),
- N_("Congo, The Democratic Republic Of The"),
- N_("Cook Islands"),
- N_("Costa Rica"),
- N_("Cote d'Ivoire"),
- N_("Croatia"),
- N_("Cuba"),
- N_("Cyprus"),
- N_("Czech Republic"),
- N_("Denmark"),
- N_("Djibouti"),
- N_("Dominica"),
- N_("Dominican Republic"),
- N_("Ecuador"),
- N_("Egypt"),
- N_("El Salvador"),
- N_("Equatorial Guinea"),
- N_("Eritrea"),
- N_("Estonia"),
- N_("Ethiopia"),
- N_("Falkland Islands"),
- N_("Faroe Islands"),
- N_("Fiji"),
- N_("Finland"),
- N_("France"),
- N_("French Guiana"),
- N_("French Polynesia"),
- N_("French Southern Territories"),
- N_("Gabon"),
- N_("Gambia"),
- N_("Georgia"),
- N_("Germany"),
- N_("Ghana"),
- N_("Gibraltar"),
- N_("Greece"),
- N_("Greenland"),
- N_("Grenada"),
- N_("Guadeloupe"),
- N_("Guam"),
- N_("Guatemala"),
- N_("Guernsey"),
- N_("Guinea"),
- N_("Guinea-bissau"),
- N_("Guyana"),
- N_("Haiti"),
- N_("Heard And McDonald Islands"),
- N_("Holy See"),
- N_("Honduras"),
- N_("Hong Kong"),
- N_("Hungary"),
- N_("Iceland"),
- N_("India"),
- N_("Indonesia"),
- N_("Iran"),
- N_("Iraq"),
- N_("Ireland"),
- N_("Isle of Man"),
- N_("Israel"),
- N_("Italy"),
- N_("Jamaica"),
- N_("Japan"),
- N_("Jersey"),
- N_("Jordan"),
- N_("Kazakhstan"),
- N_("Kenya"),
- N_("Kiribati"),
- N_("Korea, Democratic People's Republic Of"),
- N_("Korea, Republic Of"),
- N_("Kuwait"),
- N_("Kyrgyzstan"),
- N_("Laos"),
- N_("Latvia"),
- N_("Lebanon"),
- N_("Lesotho"),
- N_("Liberia"),
- N_("Libya"),
- N_("Liechtenstein"),
- N_("Lithuania"),
- N_("Luxembourg"),
- N_("Macao"),
- N_("Macedonia"),
- N_("Madagascar"),
- N_("Malawi"),
- N_("Malaysia"),
- N_("Maldives"),
- N_("Mali"),
- N_("Malta"),
- N_("Marshall Islands"),
- N_("Martinique"),
- N_("Mauritania"),
- N_("Mauritius"),
- N_("Mayotte"),
- N_("Mexico"),
- N_("Micronesia"),
- N_("Moldova, Republic Of"),
- N_("Monaco"),
- N_("Mongolia"),
- N_("Montserrat"),
- N_("Morocco"),
- N_("Mozambique"),
- N_("Myanmar"),
- N_("Namibia"),
- N_("Nauru"),
- N_("Nepal"),
- N_("Netherlands"),
- N_("Netherlands Antilles"),
- N_("New Caledonia"),
- N_("New Zealand"),
- N_("Nicaragua"),
- N_("Niger"),
- N_("Nigeria"),
- N_("Niue"),
- N_("Norfolk Island"),
- N_("Northern Mariana Islands"),
- N_("Norway"),
- N_("Oman"),
- N_("Pakistan"),
- N_("Palau"),
- N_("Palestinian Territory"),
- N_("Panama"),
- N_("Papua New Guinea"),
- N_("Paraguay"),
- N_("Peru"),
- N_("Philippines"),
- N_("Pitcairn"),
- N_("Poland"),
- N_("Portugal"),
- N_("Puerto Rico"),
- N_("Qatar"),
- N_("Reunion"),
- N_("Romania"),
- N_("Russian Federation"),
- N_("Rwanda"),
- N_("Saint Kitts And Nevis"),
- N_("Saint Lucia"),
- N_("Saint Vincent And The Grenadines"),
- N_("Samoa"),
- N_("San Marino"),
- N_("Sao Tome And Principe"),
- N_("Saudi Arabia"),
- N_("Senegal"),
- N_("Serbia And Montenegro"),
- N_("Seychelles"),
- N_("Sierra Leone"),
- N_("Singapore"),
- N_("Slovakia"),
- N_("Slovenia"),
- N_("Solomon Islands"),
- N_("Somalia"),
- N_("South Africa"),
- N_("South Georgia And The South Sandwich Islands"),
- N_("Spain"),
- N_("Sri Lanka"),
- N_("St. Helena"),
- N_("St. Pierre And Miquelon"),
- N_("Sudan"),
- N_("Suriname"),
- N_("Svalbard And Jan Mayen Islands"),
- N_("Swaziland"),
- N_("Sweden"),
- N_("Switzerland"),
- N_("Syria"),
- N_("Taiwan"),
- N_("Tajikistan"),
- N_("Tanzania, United Republic Of"),
- N_("Thailand"),
- N_("Timor-Leste"),
- N_("Togo"),
- N_("Tokelau"),
- N_("Tonga"),
- N_("Trinidad And Tobago"),
- N_("Tunisia"),
- N_("Turkey"),
- N_("Turkmenistan"),
- N_("Turks And Caicos Islands"),
- N_("Tuvalu"),
- N_("Uganda"),
- N_("Ukraine"),
- N_("United Arab Emirates"),
- N_("United Kingdom"),
- N_("United States Minor Outlying Islands"),
- N_("Uruguay"),
- N_("Uzbekistan"),
- N_("Vanuatu"),
- N_("Venezuela"),
- N_("Viet Nam"),
- N_("Virgin Islands, British"),
- N_("Virgin Islands, U.S."),
- N_("Wallis And Futuna Islands"),
- N_("Western Sahara"),
- N_("Yemen"),
- N_("Zambia"),
- N_("Zimbabwe"),
- NULL
-};
-
-static int
-compare_func (const void *voida, const void *voidb)
-{
- char * const *stringa = voida, * const *stringb = voidb;
-
- return strcoll (*stringa, *stringb);
-}
-
-static void
-fill_in_countries (GladeXML *gui)
-{
- GtkCombo *combo;
- combo = (GtkCombo *) glade_xml_get_widget(gui, "combo-country");
- if (combo && GTK_IS_COMBO (combo)) {
- static gboolean sorted = FALSE;
- static GList *country_list;
- if (!sorted) {
- int i;
- char *locale;
-
- for (i = 0; countries[i]; i++) {
- countries[i] = _(countries[i]);
- }
-
- locale = setlocale (LC_COLLATE, NULL);
- qsort (countries + 1, i - 1, sizeof (countries[0]), compare_func);
- country_list = NULL;
- for (i = 0; countries[i]; i++) {
- country_list = g_list_prepend (country_list, countries[i]);
- }
- country_list = g_list_reverse (country_list);
- sorted = TRUE;
- }
- gtk_combo_set_popdown_strings (combo, country_list);
- }
-}
-
-static void
-e_contact_editor_address_init (EContactEditorAddress *e_contact_editor_address)
-{
- GladeXML *gui;
- GtkWidget *widget;
- GList *icon_list;
-
- gtk_dialog_add_buttons (GTK_DIALOG (e_contact_editor_address),
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- NULL);
-
- gtk_window_set_resizable(GTK_WINDOW(e_contact_editor_address), TRUE);
-
- e_contact_editor_address->address = NULL;
-
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/fulladdr.glade", NULL, NULL);
- e_contact_editor_address->gui = gui;
-
- setup_tab_order (gui);
- fill_in_countries (gui);
-
- widget = glade_xml_get_widget(gui, "dialog-checkaddress");
- gtk_window_set_title (GTK_WINDOW (e_contact_editor_address),
- GTK_WINDOW (widget)->title);
-
- widget = glade_xml_get_widget(gui, "table-checkaddress");
- g_object_ref(widget);
- gtk_container_remove(GTK_CONTAINER(widget->parent), widget);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (e_contact_editor_address)->vbox), widget, TRUE, TRUE, 0);
- g_object_unref(widget);
-
- icon_list = e_icon_factory_get_icon_list ("stock_contact");
- if (icon_list) {
- gtk_window_set_icon_list (GTK_WINDOW (e_contact_editor_address), icon_list);
- g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
- g_list_free (icon_list);
- }
-}
-
-void
-e_contact_editor_address_dispose (GObject *object)
-{
- EContactEditorAddress *e_contact_editor_address = E_CONTACT_EDITOR_ADDRESS(object);
-
- if (e_contact_editor_address->gui) {
- g_object_unref(e_contact_editor_address->gui);
- e_contact_editor_address->gui = NULL;
- }
-
- if (e_contact_editor_address->address) {
- e_contact_address_free (e_contact_editor_address->address);
- e_contact_editor_address->address = NULL;
- }
-
- if (G_OBJECT_CLASS (parent_class)->dispose)
- (* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-GtkWidget*
-e_contact_editor_address_new (const EContactAddress *address)
-{
- GtkWidget *widget = g_object_new (E_TYPE_CONTACT_EDITOR_ADDRESS, NULL);
-
- g_object_set (widget,
- "address", address,
- NULL);
-
- return widget;
-}
-
-static void
-e_contact_editor_address_set_property (GObject *object, guint prop_id,
- const GValue *value, GParamSpec *pspec)
-{
- EContactEditorAddress *e_contact_editor_address;
-
- e_contact_editor_address = E_CONTACT_EDITOR_ADDRESS (object);
-
- switch (prop_id){
- case PROP_ADDRESS:
- if (e_contact_editor_address->address)
- g_boxed_free (e_contact_address_get_type (), e_contact_editor_address->address);
-
- e_contact_editor_address->address = g_value_dup_boxed (value);
- fill_in_info (e_contact_editor_address);
- break;
- case PROP_EDITABLE: {
- int i;
- char *widget_names[] = {
- "entry-street",
- "entry-city",
- "entry-ext",
- "entry-po",
- "entry-region",
- "combo-country",
- "entry-code",
- "label-street",
- "label-city",
- "label-ext",
- "label-po",
- "label-region",
- "label-country",
- "label-code",
- NULL
- };
- e_contact_editor_address->editable = g_value_get_boolean (value) ? TRUE : FALSE;
- for (i = 0; widget_names[i] != NULL; i ++) {
- GtkWidget *w = glade_xml_get_widget(e_contact_editor_address->gui, widget_names[i]);
- if (GTK_IS_ENTRY (w)) {
- gtk_editable_set_editable (GTK_EDITABLE (w),
- e_contact_editor_address->editable);
- }
- else if (GTK_IS_COMBO (w)) {
- gtk_editable_set_editable (GTK_EDITABLE (GTK_COMBO (w)->entry),
- e_contact_editor_address->editable);
- gtk_widget_set_sensitive (GTK_COMBO (w)->button, e_contact_editor_address->editable);
- }
- else if (GTK_IS_LABEL (w)) {
- gtk_widget_set_sensitive (w, e_contact_editor_address->editable);
- }
- }
- break;
- }
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-e_contact_editor_address_get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec)
-{
- EContactEditorAddress *e_contact_editor_address;
-
- e_contact_editor_address = E_CONTACT_EDITOR_ADDRESS (object);
-
- switch (prop_id) {
- case PROP_ADDRESS:
- extract_info (e_contact_editor_address);
- g_value_set_static_boxed (value, e_contact_editor_address->address);
- break;
- case PROP_EDITABLE:
- g_value_set_boolean (value, e_contact_editor_address->editable ? TRUE : FALSE);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-fill_in_field(EContactEditorAddress *editor, char *field, char *string)
-{
- GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field));
- if (entry) {
- if (string)
- gtk_entry_set_text(entry, string);
- else
- gtk_entry_set_text(entry, "");
- }
-}
-
-static void
-fill_in_info(EContactEditorAddress *editor)
-{
- EContactAddress *address = editor->address;
-
- if (address) {
- fill_in_field (editor, "entry-street" , address->street );
- fill_in_field (editor, "entry-po" , address->po );
- fill_in_field (editor, "entry-ext" , address->ext );
- fill_in_field (editor, "entry-city" , address->locality);
- fill_in_field (editor, "entry-region" , address->region );
- fill_in_field (editor, "entry-code" , address->code );
- fill_in_field (editor, "entry-country", address->country );
- }
-}
-
-static char *
-extract_field(EContactEditorAddress *editor, char *field)
-{
- GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field));
- if (entry)
- return g_strdup (gtk_entry_get_text(entry));
- else
- return NULL;
-}
-
-static void
-extract_info(EContactEditorAddress *editor)
-{
- EContactAddress *address = editor->address;
-
- if (address) {
- g_boxed_free (e_contact_address_get_type (), address);
- }
-
- address = g_new0 (EContactAddress, 1);
- editor->address = address;
-
- address->street = extract_field(editor, "entry-street" );
- address->po = extract_field(editor, "entry-po" );
- address->ext = extract_field(editor, "entry-ext" );
- address->locality = extract_field(editor, "entry-city" );
- address->region = extract_field(editor, "entry-region" );
- address->code = extract_field(editor, "entry-code" );
- address->country = extract_field(editor, "entry-country");
-}
diff --git a/addressbook/gui/contact-editor/e-contact-editor-address.h b/addressbook/gui/contact-editor/e-contact-editor-address.h
deleted file mode 100644
index 30fefa0e56..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor-address.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-editor-address.h
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-#ifndef __E_CONTACT_EDITOR_ADDRESS_H__
-#define __E_CONTACT_EDITOR_ADDRESS_H__
-
-#include <gtk/gtkdialog.h>
-#include <glade/glade.h>
-#include <libebook/e-contact.h>
-
-G_BEGIN_DECLS
-
-/* EContactEditorAddress - A dialog displaying information about a contact.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- * name ECardName * RW The card currently being edited. Returns a copy.
- */
-
-#define E_TYPE_CONTACT_EDITOR_ADDRESS (e_contact_editor_address_get_type ())
-#define E_CONTACT_EDITOR_ADDRESS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CONTACT_EDITOR_ADDRESS, EContactEditorAddress))
-#define E_CONTACT_EDITOR_ADDRESS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CONTACT_EDITOR_ADDRESS, EContactEditorAddressClass))
-#define E_IS_CONTACT_EDITOR_ADDRESS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CONTACT_EDITOR_ADDRESS))
-#define E_IS_CONTACT_EDITOR_ADDRESS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_CONTACT_EDITOR_ADDRESS))
-
-
-typedef struct _EContactEditorAddress EContactEditorAddress;
-typedef struct _EContactEditorAddressClass EContactEditorAddressClass;
-
-struct _EContactEditorAddress
-{
- GtkDialog parent;
-
- /* item specific fields */
- EContactAddress *address;
-
- guint editable : 1;
-
- GladeXML *gui;
-};
-
-struct _EContactEditorAddressClass
-{
- GtkDialogClass parent_class;
-};
-
-
-GtkWidget *e_contact_editor_address_new (const EContactAddress *address);
-GType e_contact_editor_address_get_type (void);
-
-G_END_DECLS
-
-#endif /* __E_CONTACT_EDITOR_ADDRESS_H__ */
diff --git a/addressbook/gui/contact-editor/e-contact-editor-fullname.c b/addressbook/gui/contact-editor/e-contact-editor-fullname.c
deleted file mode 100644
index 1847a463f1..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor-fullname.c
+++ /dev/null
@@ -1,303 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * eab-contact-editor-phones.c
- * Copyright (C) 2003 Ximian, Inc.
- * Author: Chris Toshok <toshok@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-#include "e-contact-editor-fullname.h"
-#include <e-util/e-icon-factory.h>
-#include <libgnome/gnome-util.h>
-#include <libgnome/gnome-i18n.h>
-#include <gtk/gtkcombo.h>
-#include <gtk/gtkstock.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtklabel.h>
-
-static void e_contact_editor_fullname_init (EContactEditorFullname *card);
-static void e_contact_editor_fullname_class_init (EContactEditorFullnameClass *klass);
-static void e_contact_editor_fullname_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
-static void e_contact_editor_fullname_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
-static void e_contact_editor_fullname_dispose (GObject *object);
-
-static void fill_in_info(EContactEditorFullname *editor);
-static void extract_info(EContactEditorFullname *editor);
-
-static GtkDialogClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- PROP_0,
- PROP_NAME,
- PROP_EDITABLE
-};
-
-GType
-e_contact_editor_fullname_get_type (void)
-{
- static GType contact_editor_fullname_type = 0;
-
- if (!contact_editor_fullname_type) {
- static const GTypeInfo contact_editor_fullname_info = {
- sizeof (EContactEditorFullnameClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) e_contact_editor_fullname_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EContactEditorFullname),
- 0, /* n_preallocs */
- (GInstanceInitFunc) e_contact_editor_fullname_init,
- };
-
- contact_editor_fullname_type = g_type_register_static (GTK_TYPE_DIALOG, "EContactEditorFullname", &contact_editor_fullname_info, 0);
- }
-
- return contact_editor_fullname_type;
-}
-
-static void
-e_contact_editor_fullname_class_init (EContactEditorFullnameClass *klass)
-{
- GObjectClass *object_class;
-
- object_class = G_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_ref (GTK_TYPE_DIALOG);
-
- object_class->set_property = e_contact_editor_fullname_set_property;
- object_class->get_property = e_contact_editor_fullname_get_property;
- object_class->dispose = e_contact_editor_fullname_dispose;
-
- g_object_class_install_property (object_class, PROP_NAME,
- g_param_spec_pointer ("name",
- _("Name"),
- /*_( */"XXX blurb" /*)*/,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_EDITABLE,
- g_param_spec_boolean ("editable",
- _("Editable"),
- /*_( */"XXX blurb" /*)*/,
- FALSE,
- G_PARAM_READWRITE));
-}
-
-static void
-e_contact_editor_fullname_init (EContactEditorFullname *e_contact_editor_fullname)
-{
- GladeXML *gui;
- GtkWidget *widget;
- GList *icon_list;
-
- gtk_widget_realize (GTK_WIDGET (e_contact_editor_fullname));
- gtk_dialog_set_has_separator (GTK_DIALOG (e_contact_editor_fullname),
- FALSE);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (e_contact_editor_fullname)->vbox), 0);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (e_contact_editor_fullname)->action_area), 12);
-
- gtk_dialog_add_buttons (GTK_DIALOG (e_contact_editor_fullname),
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- NULL);
-
- gtk_window_set_resizable(GTK_WINDOW(e_contact_editor_fullname), TRUE);
-
- e_contact_editor_fullname->name = NULL;
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/fullname.glade", NULL, NULL);
- e_contact_editor_fullname->gui = gui;
-
- widget = glade_xml_get_widget(gui, "dialog-checkfullname");
- gtk_window_set_title (GTK_WINDOW (e_contact_editor_fullname),
- GTK_WINDOW (widget)->title);
-
- widget = glade_xml_get_widget(gui, "table-checkfullname");
- g_object_ref(widget);
- gtk_container_remove(GTK_CONTAINER(widget->parent), widget);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (e_contact_editor_fullname)->vbox), widget, TRUE, TRUE, 0);
- g_object_unref(widget);
-
- icon_list = e_icon_factory_get_icon_list ("stock_contact");
- if (icon_list) {
- gtk_window_set_icon_list (GTK_WINDOW (e_contact_editor_fullname), icon_list);
- g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
- g_list_free (icon_list);
- }
-}
-
-void
-e_contact_editor_fullname_dispose (GObject *object)
-{
- EContactEditorFullname *e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME(object);
-
- if (e_contact_editor_fullname->gui) {
- g_object_unref(e_contact_editor_fullname->gui);
- e_contact_editor_fullname->gui = NULL;
- }
-
- if (e_contact_editor_fullname->name) {
- e_contact_name_free(e_contact_editor_fullname->name);
- e_contact_editor_fullname->name = NULL;
- }
-
- if (G_OBJECT_CLASS (parent_class)->dispose)
- (* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-GtkWidget*
-e_contact_editor_fullname_new (const EContactName *name)
-{
- GtkWidget *widget = g_object_new (E_TYPE_CONTACT_EDITOR_FULLNAME, NULL);
-
- g_object_set (widget,
- "name", name,
- NULL);
- return widget;
-}
-
-static void
-e_contact_editor_fullname_set_property (GObject *object, guint prop_id,
- const GValue *value, GParamSpec *pspec)
-{
- EContactEditorFullname *e_contact_editor_fullname;
-
- e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME (object);
-
- switch (prop_id){
- case PROP_NAME:
- e_contact_name_free(e_contact_editor_fullname->name);
-
- if (g_value_get_pointer (value) != NULL) {
- e_contact_editor_fullname->name = e_contact_name_copy(g_value_get_pointer (value));
- fill_in_info(e_contact_editor_fullname);
- }
- else {
- e_contact_editor_fullname->name = NULL;
- }
- break;
- case PROP_EDITABLE: {
- int i;
- char *widget_names[] = {
- "combo-title",
- "combo-suffix",
- "entry-first",
- "entry-middle",
- "entry-last",
- "label-title",
- "label-suffix",
- "label-first",
- "label-middle",
- "label-last",
- NULL
- };
- e_contact_editor_fullname->editable = g_value_get_boolean (value) ? TRUE : FALSE;
- for (i = 0; widget_names[i] != NULL; i ++) {
- GtkWidget *w = glade_xml_get_widget(e_contact_editor_fullname->gui, widget_names[i]);
- if (GTK_IS_ENTRY (w)) {
- gtk_editable_set_editable (GTK_EDITABLE (w),
- e_contact_editor_fullname->editable);
- }
- else if (GTK_IS_COMBO (w)) {
- gtk_editable_set_editable (GTK_EDITABLE (GTK_COMBO (w)->entry),
- e_contact_editor_fullname->editable);
- gtk_widget_set_sensitive (GTK_COMBO (w)->button, e_contact_editor_fullname->editable);
- }
- else if (GTK_IS_LABEL (w)) {
- gtk_widget_set_sensitive (w, e_contact_editor_fullname->editable);
- }
- }
- break;
- }
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-e_contact_editor_fullname_get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec)
-{
- EContactEditorFullname *e_contact_editor_fullname;
-
- e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME (object);
-
- switch (prop_id) {
- case PROP_NAME:
- extract_info(e_contact_editor_fullname);
- g_value_set_pointer (value, e_contact_name_copy(e_contact_editor_fullname->name));
- break;
- case PROP_EDITABLE:
- g_value_set_boolean (value, e_contact_editor_fullname->editable ? TRUE : FALSE);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-fill_in_field(EContactEditorFullname *editor, char *field, char *string)
-{
- GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field));
- if (entry) {
- if (string)
- gtk_entry_set_text(entry, string);
- else
- gtk_entry_set_text(entry, "");
- }
-}
-
-static void
-fill_in_info(EContactEditorFullname *editor)
-{
- EContactName *name = editor->name;
- if (name) {
- fill_in_field(editor, "entry-title", name->prefixes);
- fill_in_field(editor, "entry-first", name->given);
- fill_in_field(editor, "entry-middle", name->additional);
- fill_in_field(editor, "entry-last", name->family);
- fill_in_field(editor, "entry-suffix", name->suffixes);
- }
-}
-
-static char *
-extract_field(EContactEditorFullname *editor, char *field)
-{
- GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field));
- if (entry)
- return g_strdup (gtk_entry_get_text(entry));
- else
- return NULL;
-}
-
-static void
-extract_info(EContactEditorFullname *editor)
-{
- EContactName *name = editor->name;
- if (!name) {
- name = e_contact_name_new();
- editor->name = name;
- }
-
- name->prefixes = extract_field(editor, "entry-title" );
- name->given = extract_field(editor, "entry-first" );
- name->additional = extract_field(editor, "entry-middle");
- name->family = extract_field(editor, "entry-last" );
- name->suffixes = extract_field(editor, "entry-suffix");
-}
diff --git a/addressbook/gui/contact-editor/e-contact-editor-fullname.h b/addressbook/gui/contact-editor/e-contact-editor-fullname.h
deleted file mode 100644
index 0b254c789c..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor-fullname.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-editor-fullname.h
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-#ifndef __E_CONTACT_EDITOR_FULLNAME_H__
-#define __E_CONTACT_EDITOR_FULLNAME_H__
-
-#include <gtk/gtkdialog.h>
-#include <glade/glade.h>
-#include <libebook/e-contact.h>
-
-G_BEGIN_DECLS
-
-/* EContactEditorFullname - A dialog displaying information about a contact.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- * name ECardName * RW The card currently being edited. Returns a copy.
- */
-
-#define E_TYPE_CONTACT_EDITOR_FULLNAME (e_contact_editor_fullname_get_type ())
-#define E_CONTACT_EDITOR_FULLNAME(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CONTACT_EDITOR_FULLNAME, EContactEditorFullname))
-#define E_CONTACT_EDITOR_FULLNAME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CONTACT_EDITOR_FULLNAME, EContactEditorFullnameClass))
-#define E_IS_CONTACT_EDITOR_FULLNAME(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CONTACT_EDITOR_FULLNAME))
-#define E_IS_CONTACT_EDITOR_FULLNAME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_CONTACT_EDITOR_FULLNAME))
-
-
-typedef struct _EContactEditorFullname EContactEditorFullname;
-typedef struct _EContactEditorFullnameClass EContactEditorFullnameClass;
-
-struct _EContactEditorFullname
-{
- GtkDialog parent;
-
- /* item specific fields */
- EContactName *name;
- GladeXML *gui;
-
- /* Whether the dialog will accept modifications */
- guint editable : 1;
-};
-
-struct _EContactEditorFullnameClass
-{
- GtkDialogClass parent_class;
-};
-
-
-GtkWidget *e_contact_editor_fullname_new(const EContactName *name);
-GType e_contact_editor_fullname_get_type (void);
-
-G_END_DECLS
-
-#endif /* __E_CONTACT_EDITOR_FULLNAME_H__ */
diff --git a/addressbook/gui/contact-editor/e-contact-editor-im.c b/addressbook/gui/contact-editor/e-contact-editor-im.c
deleted file mode 100644
index 2c1c89af9a..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor-im.c
+++ /dev/null
@@ -1,481 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-editor-im.c
- * Copyright (C) 2003 Ximian, Inc.
- * Author: Christian Hammond <chipx86@gnupdate.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-#include "e-contact-editor-im.h"
-#include <libgnome/gnome-util.h>
-#include <libgnome/gnome-i18n.h>
-#include <gtk/gtkbox.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkhbox.h>
-#include <gtk/gtkimage.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkmenuitem.h>
-#include <gtk/gtkoptionmenu.h>
-#include <gtk/gtksizegroup.h>
-#include <gtk/gtkstock.h>
-#include <string.h>
-#include <e-util/e-icon-factory.h>
-
-static void e_contact_editor_im_init (EContactEditorIm *card);
-static void e_contact_editor_im_class_init (EContactEditorImClass *klass);
-static void e_contact_editor_im_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
-static void e_contact_editor_im_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
-static void e_contact_editor_im_dispose (GObject *object);
-
-static void fill_in_info(EContactEditorIm *editor);
-static void extract_info(EContactEditorIm *editor);
-
-static GtkDialogClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- PROP_0,
- PROP_SERVICE,
- PROP_LOCATION,
- PROP_USERNAME,
- PROP_EDITABLE
-};
-
-#define FIRST_IM_TYPE E_CONTACT_IM_AIM
-#define LAST_IM_TYPE E_CONTACT_IM_ICQ
-
-static const char *im_labels[] = {
- N_("AOL Instant Messenger"),
- N_("Novell Groupwise"),
- N_("Jabber"),
- N_("Yahoo Messenger"),
- N_("MSN Messenger"),
- N_("ICQ")
-};
-
-static const char *im_images[] = {
- "im-aim",
- "im-nov",
- "im-jabber",
- "im-yahoo",
- "im-msn",
- "im-icq"
-};
-
-GType
-e_contact_editor_im_get_type (void)
-{
- static GType contact_editor_im_type = 0;
-
- if (!contact_editor_im_type) {
- static const GTypeInfo contact_editor_im_info = {
- sizeof (EContactEditorImClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) e_contact_editor_im_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EContactEditorIm),
- 0, /* n_preallocs */
- (GInstanceInitFunc) e_contact_editor_im_init,
- };
-
- contact_editor_im_type = g_type_register_static (GTK_TYPE_DIALOG, "EContactEditorIm", &contact_editor_im_info, 0);
- }
-
- return contact_editor_im_type;
-}
-
-static void
-e_contact_editor_im_class_init (EContactEditorImClass *klass)
-{
- GObjectClass *object_class;
-
- object_class = G_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_ref (GTK_TYPE_DIALOG);
-
- object_class->set_property = e_contact_editor_im_set_property;
- object_class->get_property = e_contact_editor_im_get_property;
- object_class->dispose = e_contact_editor_im_dispose;
-
- g_object_class_install_property (object_class, PROP_SERVICE,
- g_param_spec_int ("service",
- _("Service"),
- /*_( */"XXX blurb" /*)*/,
- FIRST_IM_TYPE,
- LAST_IM_TYPE,
- FIRST_IM_TYPE,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_LOCATION,
- g_param_spec_string ("location",
- _("Location"),
- /*_( */"XXX blurb" /*)*/,
- "HOME",
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_USERNAME,
- g_param_spec_string ("username",
- _("Username"),
- /*_( */"XXX blurb" /*)*/,
- NULL,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_EDITABLE,
- g_param_spec_boolean ("editable",
- _("Editable"),
- /*_( */"XXX blurb" /*)*/,
- FALSE,
- G_PARAM_READWRITE));
-}
-
-static void
-service_changed_cb(GtkWidget *optmenu, EContactEditorIm *editor)
-{
- editor->service = gtk_option_menu_get_history(GTK_OPTION_MENU(optmenu)) + FIRST_IM_TYPE;
-}
-
-static void
-location_changed_cb(GtkWidget *optmenu, EContactEditorIm *editor)
-{
- int i = gtk_option_menu_get_history(GTK_OPTION_MENU(optmenu));
-
- if (editor->location != NULL)
- g_free(editor->location);
-
- if (i == 0)
- editor->location = g_strdup("HOME");
- else if (i == 1)
- editor->location = g_strdup("WORK");
- else
- editor->location = NULL;
-}
-
-static void
-setup_service_optmenu(EContactEditorIm *editor)
-{
- GtkWidget *optmenu;
- GtkWidget *menu;
- GtkWidget *hbox;
- GtkWidget *item;
- GtkWidget *label;
- GtkWidget *image;
- GtkSizeGroup *sg;
- int i;
-
- optmenu = glade_xml_get_widget(editor->gui, "optmenu-service");
- g_signal_connect(G_OBJECT(optmenu), "changed",
- G_CALLBACK(service_changed_cb), editor);
-
- menu = gtk_menu_new();
- gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu);
- gtk_widget_show(menu);
-
- sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
-
- for (i = 0; i < G_N_ELEMENTS(im_labels); i++) {
- item = gtk_menu_item_new();
-
- hbox = gtk_hbox_new(FALSE, 4);
- gtk_container_add(GTK_CONTAINER(item), hbox);
- gtk_widget_show(hbox);
-
- image = e_icon_factory_get_image (im_images[i], E_ICON_SIZE_MENU);
-
- gtk_size_group_add_widget(sg, image);
-
- gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
- gtk_widget_show(image);
-
- label = gtk_label_new(im_labels[i]);
- gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
- gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
- gtk_widget_show(label);
-
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
- gtk_widget_show(item);
- }
-}
-
-static void
-setup_location_optmenu(EContactEditorIm *editor)
-{
- GtkWidget *item;
- GtkWidget *optmenu;
- GtkWidget *menu;
-
- optmenu = glade_xml_get_widget(editor->gui, "optmenu-location");
-
- g_signal_connect(G_OBJECT(optmenu), "changed",
- G_CALLBACK(location_changed_cb), editor);
-
- menu = gtk_menu_new();
- gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu);
- gtk_widget_show(menu);
-
- item = gtk_menu_item_new_with_label(_("Home"));
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
- gtk_widget_show(item);
-
- item = gtk_menu_item_new_with_label(_("Work"));
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
- gtk_widget_show(item);
-
- item = gtk_menu_item_new_with_label(_("Other"));
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
- gtk_widget_show(item);
-}
-
-static void
-e_contact_editor_im_init (EContactEditorIm *e_contact_editor_im)
-{
- GladeXML *gui;
- GtkWidget *widget;
- GList *icon_list;
-
- gtk_dialog_add_buttons (GTK_DIALOG (e_contact_editor_im),
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- NULL);
- gtk_dialog_set_has_separator (GTK_DIALOG (e_contact_editor_im), FALSE);
-
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (e_contact_editor_im)->action_area), 12);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (e_contact_editor_im)->vbox), 0);
-
- gtk_window_set_resizable(GTK_WINDOW(e_contact_editor_im), TRUE);
-
- e_contact_editor_im->service = FIRST_IM_TYPE;
- e_contact_editor_im->location = g_strdup("HOME");
- e_contact_editor_im->username = NULL;
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/im.glade", NULL, NULL);
- e_contact_editor_im->gui = gui;
-
- widget = glade_xml_get_widget(gui, "dialog-im");
- gtk_window_set_title (GTK_WINDOW (e_contact_editor_im),
- GTK_WINDOW (widget)->title);
-
- widget = glade_xml_get_widget(gui, "table-im");
- g_object_ref(widget);
- gtk_container_remove(GTK_CONTAINER(widget->parent), widget);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (e_contact_editor_im)->vbox), widget, TRUE, TRUE, 0);
- g_object_unref(widget);
-
- setup_service_optmenu(e_contact_editor_im);
- setup_location_optmenu(e_contact_editor_im);
-
- gtk_widget_grab_focus(glade_xml_get_widget(gui, "entry-username"));
-
- /* set the icon */
- icon_list = e_icon_factory_get_icon_list ("stock_contact");
- if (icon_list) {
- gtk_window_set_icon_list (GTK_WINDOW (e_contact_editor_im), icon_list);
- g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
- g_list_free (icon_list);
- }
-}
-
-void
-e_contact_editor_im_dispose (GObject *object)
-{
- EContactEditorIm *e_contact_editor_im = E_CONTACT_EDITOR_IM(object);
-
- if (e_contact_editor_im->gui) {
- g_object_unref(e_contact_editor_im->gui);
- e_contact_editor_im->gui = NULL;
- }
-
- if (e_contact_editor_im->location) {
- g_free(e_contact_editor_im->location);
- e_contact_editor_im->location = NULL;
- }
-
- if (e_contact_editor_im->username) {
- g_free(e_contact_editor_im->username);
- e_contact_editor_im->username = NULL;
- }
-
- if (G_OBJECT_CLASS (parent_class)->dispose)
- (* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-GtkWidget*
-e_contact_editor_im_new (EContactField service, const char *location, const char *username)
-{
- GtkWidget *widget = g_object_new (E_TYPE_CONTACT_EDITOR_IM, NULL);
- g_object_set (widget,
- "service", GINT_TO_POINTER(service),
- "location", location,
- "username", username,
- NULL);
- return widget;
-}
-
-static void
-e_contact_editor_im_set_property (GObject *object, guint prop_id,
- const GValue *value, GParamSpec *pspec)
-{
- EContactEditorIm *e_contact_editor_im;
- const char *str;
-
- e_contact_editor_im = E_CONTACT_EDITOR_IM (object);
-
- switch (prop_id){
- case PROP_SERVICE:
- e_contact_editor_im->service = g_value_get_int(value);
- fill_in_info(e_contact_editor_im);
- break;
-
- case PROP_LOCATION:
- if (e_contact_editor_im->location != NULL)
- g_free(e_contact_editor_im->location);
-
- str = g_value_get_string(value);
-
- if (str == NULL)
- e_contact_editor_im->location = NULL;
- else if (!g_ascii_strcasecmp(str, "HOME"))
- e_contact_editor_im->location = g_strdup("HOME");
- else if (!g_ascii_strcasecmp(str, "WORK"))
- e_contact_editor_im->location = g_strdup("WORK");
- else
- e_contact_editor_im->location = NULL;
-
- fill_in_info(e_contact_editor_im);
- break;
-
- case PROP_USERNAME:
- if (e_contact_editor_im->username != NULL)
- g_free(e_contact_editor_im->username);
-
- e_contact_editor_im->username = g_strdup(g_value_get_string(value));
- fill_in_info(e_contact_editor_im);
- break;
-
- case PROP_EDITABLE: {
- int i;
- char *widget_names[] = {
- "optmenu-service",
- "optmenu-location",
- "entry-username",
- "label-service",
- "label-location",
- "label-username",
- NULL
- };
- e_contact_editor_im->editable = g_value_get_boolean (value) ? TRUE : FALSE;
- for (i = 0; widget_names[i] != NULL; i ++) {
- GtkWidget *w = glade_xml_get_widget(e_contact_editor_im->gui, widget_names[i]);
- if (GTK_IS_ENTRY (w)) {
- gtk_editable_set_editable (GTK_EDITABLE (w),
- e_contact_editor_im->editable);
- }
- else {
- gtk_widget_set_sensitive (w, e_contact_editor_im->editable);
- }
- }
- break;
- }
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-e_contact_editor_im_get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec)
-{
- EContactEditorIm *e_contact_editor_im;
-
- e_contact_editor_im = E_CONTACT_EDITOR_IM (object);
-
- switch (prop_id) {
- case PROP_SERVICE:
- g_value_set_int (value, e_contact_editor_im->service);
- break;
- case PROP_LOCATION:
- g_value_set_string (value, e_contact_editor_im->location);
- break;
- case PROP_USERNAME:
- extract_info(e_contact_editor_im);
- g_value_set_string (value, e_contact_editor_im->username);
- break;
- case PROP_EDITABLE:
- g_value_set_boolean (value, e_contact_editor_im->editable ? TRUE : FALSE);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-fill_in_field(EContactEditorIm *editor, char *field, char *string)
-{
- GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field));
- if (entry) {
- if (string)
- gtk_entry_set_text(entry, string);
- else
- gtk_entry_set_text(entry, "");
- }
-}
-
-static void
-fill_in_info(EContactEditorIm *editor)
-{
- GtkWidget *optmenu;
-
- fill_in_field(editor, "entry-username", editor->username);
-
- optmenu = glade_xml_get_widget(editor->gui, "optmenu-service");
-
- if (optmenu != NULL)
- gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), editor->service - FIRST_IM_TYPE);
-
- optmenu = glade_xml_get_widget(editor->gui, "optmenu-location");
-
- if (optmenu != NULL)
- gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu),
- (editor->location == NULL ? 2 :
- !strcmp(editor->location, "WORK") ? 1 : 0));
-}
-
-static char *
-extract_field(EContactEditorIm *editor, char *field)
-{
- GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field));
- if (entry)
- return g_strdup (gtk_entry_get_text(entry));
- else
- return NULL;
-}
-
-static void
-extract_info(EContactEditorIm *editor)
-{
- if (editor->username != NULL)
- g_free(editor->username);
-
- editor->username = extract_field(editor, "entry-username");
-
- /*
- * NOTE: We don't need to handle the option menus.
- * These are set by the callbacks.
- */
-}
diff --git a/addressbook/gui/contact-editor/e-contact-editor-im.h b/addressbook/gui/contact-editor/e-contact-editor-im.h
deleted file mode 100644
index da5bd652b2..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor-im.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-editor-add-im.h
- * Copyright (C) 2003 Ximian, Inc.
- * Author: Christian Hammond <chipx86@gnupdate.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-#ifndef __E_CONTACT_EDITOR_IM_H__
-#define __E_CONTACT_EDITOR_IM_H__
-
-#include <gtk/gtkdialog.h>
-#include <glade/glade.h>
-#include <libebook/e-contact.h>
-
-G_BEGIN_DECLS
-
-/* EContactEditorIm - A dialog allowing the user to add an IM account to a contact.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- * service EContactField RW The field of the IM service.
- * location char * RW The location type.
- * username char * RW The username of the account.
- */
-
-#define E_TYPE_CONTACT_EDITOR_IM (e_contact_editor_im_get_type ())
-#define E_CONTACT_EDITOR_IM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CONTACT_EDITOR_IM, EContactEditorIm))
-#define E_CONTACT_EDITOR_IM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CONTACT_EDITOR_IM, EContactEditorImClass))
-#define E_IS_CONTACT_EDITOR_IM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CONTACT_EDITOR_IM))
-#define E_IS_CONTACT_EDITOR_IM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_CONTACT_EDITOR_IM))
-
-
-typedef struct _EContactEditorIm EContactEditorIm;
-typedef struct _EContactEditorImClass EContactEditorImClass;
-
-struct _EContactEditorIm
-{
- GtkDialog parent;
-
- /* item specific fields */
- EContactField service;
- char *location;
- char *username;
- GladeXML *gui;
-
- /* Whether the dialog will accept modifications */
- guint editable : 1;
-};
-
-struct _EContactEditorImClass
-{
- GtkDialogClass parent_class;
-};
-
-
-GtkWidget *e_contact_editor_im_new(EContactField service, const char *location, const char *username);
-GType e_contact_editor_im_get_type (void);
-
-G_END_DECLS
-
-#endif /* __E_CONTACT_EDITOR_IM_H__ */
-
diff --git a/addressbook/gui/contact-editor/e-contact-editor-marshal.list b/addressbook/gui/contact-editor/e-contact-editor-marshal.list
deleted file mode 100644
index 58b2640de5..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor-marshal.list
+++ /dev/null
@@ -1,2 +0,0 @@
-NONE:INT,OBJECT
-NONE:NONE
diff --git a/addressbook/gui/contact-editor/e-contact-editor.c b/addressbook/gui/contact-editor/e-contact-editor.c
deleted file mode 100644
index 2cd7984337..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor.c
+++ /dev/null
@@ -1,3553 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-editor.c
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include "eab-editor.h"
-#include "e-contact-editor.h"
-
-#include <string.h>
-#include <time.h>
-#include <gtk/gtkcheckbutton.h>
-#include <gtk/gtkcheckmenuitem.h>
-#include <gtk/gtkcombo.h>
-#include <gtk/gtktextview.h>
-#include <gtk/gtkmessagedialog.h>
-#include <gtk/gtkstock.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtklabel.h>
-#include <libgnomeui/gnome-window-icon.h>
-#include <libgnome/gnome-util.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnome/gnome-help.h>
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <libedataserverui/e-categories-dialog.h>
-#include <gal/widgets/e-gui-utils.h>
-#include <gal/e-text/e-entry.h>
-
-#include <libebook/e-address-western.h>
-#include <libedataserverui/e-source-option-menu.h>
-
-#include <camel/camel.h>
-
-#include "addressbook/gui/component/addressbook.h"
-#include "addressbook/printing/e-contact-print.h"
-#include "addressbook/printing/e-contact-print-envelope.h"
-#include "addressbook/gui/widgets/eab-gui-util.h"
-#include "e-util/e-gui-utils.h"
-#include "widgets/misc/e-error.h"
-#include "widgets/misc/e-dateedit.h"
-#include "widgets/misc/e-image-chooser.h"
-#include "widgets/misc/e-url-entry.h"
-#include "shell/evolution-shell-component-utils.h"
-#include "e-util/e-icon-factory.h"
-
-#include "eab-contact-merging.h"
-
-#include "e-contact-editor-address.h"
-#include "e-contact-editor-im.h"
-#include "e-contact-editor-fullname.h"
-#include "e-contact-editor-marshal.h"
-
-#define EMAIL_SLOTS 4
-#define PHONE_SLOTS 8
-#define IM_SLOTS 4
-#define ADDRESS_SLOTS 3
-
-#define EVOLUTION_UI_SLOT_PARAM "X-EVOLUTION-UI-SLOT"
-
-/* IM columns */
-enum {
- COLUMN_IM_ICON,
- COLUMN_IM_SERVICE,
- COLUMN_IM_SCREENNAME,
- COLUMN_IM_LOCATION,
- COLUMN_IM_LOCATION_TYPE,
- COLUMN_IM_SERVICE_FIELD,
- NUM_IM_COLUMNS
-};
-
-
-static void e_contact_editor_init (EContactEditor *editor);
-static void e_contact_editor_class_init (EContactEditorClass *klass);
-static void e_contact_editor_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
-static void e_contact_editor_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
-static void e_contact_editor_dispose (GObject *object);
-
-static void e_contact_editor_raise (EABEditor *editor);
-static void e_contact_editor_show (EABEditor *editor);
-static void e_contact_editor_save_contact (EABEditor *editor, gboolean should_close);
-static void e_contact_editor_close (EABEditor *editor);
-static gboolean e_contact_editor_is_valid (EABEditor *editor);
-static gboolean e_contact_editor_is_changed (EABEditor *editor);
-static GtkWindow* e_contact_editor_get_window (EABEditor *editor);
-
-static void save_contact (EContactEditor *ce, gboolean should_close);
-static void entry_activated (EContactEditor *editor);
-
-static void set_entry_text(EContactEditor *editor, GtkEntry *entry, const char *string);
-
-static EABEditorClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- PROP_0,
- PROP_SOURCE_BOOK,
- PROP_TARGET_BOOK,
- PROP_CONTACT,
- PROP_IS_NEW_CONTACT,
- PROP_EDITABLE,
- PROP_CHANGED,
- PROP_WRITABLE_FIELDS,
- PROP_REQUIRED_FIELDS
-};
-
-enum {
- DYNAMIC_LIST_EMAIL,
- DYNAMIC_LIST_PHONE,
- DYNAMIC_LIST_ADDRESS
-};
-
-static struct {
- EContactField field_id;
- const gchar *type_1;
- const gchar *type_2;
-}
-phones [] = {
- { E_CONTACT_PHONE_ASSISTANT, EVC_X_ASSISTANT, NULL },
- { E_CONTACT_PHONE_BUSINESS, "WORK", "VOICE" },
- { E_CONTACT_PHONE_BUSINESS_FAX, "WORK", "FAX" },
- { E_CONTACT_PHONE_CALLBACK, EVC_X_CALLBACK, NULL },
- { E_CONTACT_PHONE_CAR, "CAR", NULL },
- { E_CONTACT_PHONE_COMPANY, "X-EVOLUTION-COMPANY", NULL },
- { E_CONTACT_PHONE_HOME, "HOME", "VOICE" },
- { E_CONTACT_PHONE_HOME_FAX, "HOME", "FAX" },
- { E_CONTACT_PHONE_ISDN, "ISDN", NULL },
- { E_CONTACT_PHONE_MOBILE, "CELL", NULL },
- { E_CONTACT_PHONE_OTHER, "VOICE", NULL },
- { E_CONTACT_PHONE_OTHER_FAX, "FAX", NULL },
- { E_CONTACT_PHONE_PAGER, "PAGER", NULL },
- { E_CONTACT_PHONE_PRIMARY, "PREF", NULL },
- { E_CONTACT_PHONE_RADIO, EVC_X_RADIO, NULL },
- { E_CONTACT_PHONE_TELEX, EVC_X_TELEX, NULL },
- { E_CONTACT_PHONE_TTYTDD, EVC_X_TTYTDD, NULL }
-};
-
-/* Defaults from the table above */
-gint phones_default [] = { 1, 6, 9, 2, 7, 12, 10, 10 };
-
-static EContactField addresses [] = {
- E_CONTACT_ADDRESS_WORK,
- E_CONTACT_ADDRESS_HOME,
- E_CONTACT_ADDRESS_OTHER
-};
-
-static EContactField address_labels [] = {
- E_CONTACT_ADDRESS_LABEL_WORK,
- E_CONTACT_ADDRESS_LABEL_HOME,
- E_CONTACT_ADDRESS_LABEL_OTHER
-};
-
-static gchar *address_name [] = {
- "work",
- "home",
- "other"
-};
-
-static struct {
- EContactField field;
- gchar *pretty_name;
-}
-im_service [] =
-{
- { E_CONTACT_IM_AIM, N_ ("AIM") },
- { E_CONTACT_IM_JABBER, N_ ("Jabber") },
- { E_CONTACT_IM_YAHOO, N_ ("Yahoo") },
- { E_CONTACT_IM_MSN, N_ ("MSN") },
- { E_CONTACT_IM_ICQ, N_ ("ICQ") },
- { E_CONTACT_IM_GROUPWISE, N_ ("GroupWise") }
-};
-
-/* Defaults from the table above */
-gint im_service_default [] = { 0, 2, 4, 5 };
-
-static struct {
- gchar *name;
- gchar *pretty_name;
-}
-common_location [] =
-{
- { "WORK", N_ ("Work") },
- { "HOME", N_ ("Home") },
- { "OTHER", N_ ("Other") }
-};
-
-/* Default from the table above */
-gint email_default [] = { 0, 1, 2, 2 };
-
-#define STRING_IS_EMPTY(x) (!(x) || !(*(x)))
-#define STRING_MAKE_NON_NULL(x) ((x) ? (x) : "")
-
-GType
-e_contact_editor_get_type (void)
-{
- static GType contact_editor_type = 0;
-
- if (!contact_editor_type) {
- static const GTypeInfo contact_editor_info = {
- sizeof (EContactEditorClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) e_contact_editor_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EContactEditor),
- 0, /* n_preallocs */
- (GInstanceInitFunc) e_contact_editor_init,
- };
-
- contact_editor_type = g_type_register_static (EAB_TYPE_EDITOR, "EContactEditor", &contact_editor_info, 0);
- }
-
- return contact_editor_type;
-}
-
-static void
-e_contact_editor_class_init (EContactEditorClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- EABEditorClass *editor_class = EAB_EDITOR_CLASS (klass);
-
- parent_class = g_type_class_ref (EAB_TYPE_EDITOR);
-
- object_class->set_property = e_contact_editor_set_property;
- object_class->get_property = e_contact_editor_get_property;
- object_class->dispose = e_contact_editor_dispose;
-
- editor_class->raise = e_contact_editor_raise;
- editor_class->show = e_contact_editor_show;
- editor_class->close = e_contact_editor_close;
- editor_class->is_valid = e_contact_editor_is_valid;
- editor_class->save_contact = e_contact_editor_save_contact;
- editor_class->is_changed = e_contact_editor_is_changed;
- editor_class->get_window = e_contact_editor_get_window;
-
- g_object_class_install_property (object_class, PROP_SOURCE_BOOK,
- g_param_spec_object ("source_book",
- _("Source Book"),
- /*_( */"XXX blurb" /*)*/,
- E_TYPE_BOOK,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_TARGET_BOOK,
- g_param_spec_object ("target_book",
- _("Target Book"),
- /*_( */"XXX blurb" /*)*/,
- E_TYPE_BOOK,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_CONTACT,
- g_param_spec_object ("contact",
- _("Contact"),
- /*_( */"XXX blurb" /*)*/,
- E_TYPE_CONTACT,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_IS_NEW_CONTACT,
- g_param_spec_boolean ("is_new_contact",
- _("Is New Contact"),
- /*_( */"XXX blurb" /*)*/,
- FALSE,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_WRITABLE_FIELDS,
- g_param_spec_object ("writable_fields",
- _("Writable Fields"),
- /*_( */"XXX blurb" /*)*/,
- E_TYPE_LIST,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_REQUIRED_FIELDS,
- g_param_spec_object ("required_fields",
- _("Required Fields"),
- /*_( */"XXX blurb" /*)*/,
- E_TYPE_LIST,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_EDITABLE,
- g_param_spec_boolean ("editable",
- _("Editable"),
- /*_( */"XXX blurb" /*)*/,
- FALSE,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_CHANGED,
- g_param_spec_boolean ("changed",
- _("Changed"),
- /*_( */"XXX blurb" /*)*/,
- FALSE,
- G_PARAM_READWRITE));
-}
-
-static void
-entry_activated (EContactEditor *editor)
-{
- save_contact (editor, TRUE);
-}
-
-/* FIXME: Linear time... */
-static gboolean
-is_field_supported (EContactEditor *editor, EContactField field_id)
-{
- EList *fields;
- const gchar *field;
- EIterator *iter;
-
- fields = editor->writable_fields;
- if (!fields)
- return FALSE;
-
- field = e_contact_field_name (field_id);
- if (!field)
- return FALSE;
-
- for (iter = e_list_get_iterator (fields);
- e_iterator_is_valid (iter);
- e_iterator_next (iter)) {
- const gchar *this_field = e_iterator_get (iter);
-
- if (!this_field)
- continue;
-
- if (!strcmp (field, this_field))
- return TRUE;
- }
-
- return FALSE;
-}
-
-/* This function tells you whether name_to_style will make sense. */
-static gboolean
-style_makes_sense (const EContactName *name, const gchar *company, int style)
-{
- switch (style) {
- case 0: /* Fall Through */
- case 1:
- return TRUE;
- case 2:
- if (company && *company)
- return TRUE;
- else
- return FALSE;
- case 3: /* Fall Through */
- case 4:
- if (company && *company && name && ((name->given && *name->given) || (name->family && *name->family)))
- return TRUE;
- else
- return FALSE;
- default:
- return FALSE;
- }
-}
-
-static char *
-name_to_style (const EContactName *name, const gchar *company, int style)
-{
- char *string;
- char *strings[4], **stringptr;
- char *substring;
- switch (style) {
- case 0:
- stringptr = strings;
- if (name) {
- if (name->family && *name->family)
- *(stringptr++) = name->family;
- if (name->given && *name->given)
- *(stringptr++) = name->given;
- }
- *stringptr = NULL;
- string = g_strjoinv(", ", strings);
- break;
- case 1:
- stringptr = strings;
- if (name) {
- if (name->given && *name->given)
- *(stringptr++) = name->given;
- if (name->family && *name->family)
- *(stringptr++) = name->family;
- }
- *stringptr = NULL;
- string = g_strjoinv(" ", strings);
- break;
- case 2:
- string = g_strdup(company);
- break;
- case 3: /* Fall Through */
- case 4:
- stringptr = strings;
- if (name) {
- if (name->family && *name->family)
- *(stringptr++) = name->family;
- if (name->given && *name->given)
- *(stringptr++) = name->given;
- }
- *stringptr = NULL;
- substring = g_strjoinv(", ", strings);
- if (!(company && *company))
- company = "";
- if (style == 3)
- string = g_strdup_printf("%s (%s)", substring, company);
- else
- string = g_strdup_printf("%s (%s)", company, substring);
- g_free(substring);
- break;
- default:
- string = g_strdup("");
- }
- return string;
-}
-
-static int
-file_as_get_style (EContactEditor *editor)
-{
- GtkEntry *file_as = GTK_ENTRY(glade_xml_get_widget(editor->gui, "entry-file-as"));
- GtkEntry *company_w = GTK_ENTRY (glade_xml_get_widget (editor->gui, "entry-company"));
- char *filestring;
- char *trystring;
- EContactName *name = editor->name;
- const gchar *company;
- int i;
- int style;
-
- if (!(file_as && GTK_IS_ENTRY(file_as)))
- return -1;
-
- company = gtk_entry_get_text (GTK_ENTRY (company_w));
- filestring = g_strdup (gtk_entry_get_text (file_as));
-
- style = -1;
- for (i = 0; i < 5; i++) {
- trystring = name_to_style (name, company, i);
- if (!strcmp(trystring, filestring)) {
- g_free(trystring);
- g_free(filestring);
- return i;
- }
- g_free(trystring);
- }
- g_free (filestring);
- return -1;
-}
-
-static void
-file_as_set_style (EContactEditor *editor, int style)
-{
- char *string;
- int i;
- GList *strings = NULL;
- GtkEntry *file_as = GTK_ENTRY (glade_xml_get_widget (editor->gui, "entry-file-as"));
- GtkEntry *company_w = GTK_ENTRY (glade_xml_get_widget (editor->gui, "entry-company"));
- GtkWidget *widget;
- const gchar *company;
-
- if (!(file_as && GTK_IS_ENTRY (file_as)))
- return;
-
- company = gtk_entry_get_text (GTK_ENTRY (company_w));
-
- if (style == -1) {
- string = g_strdup (gtk_entry_get_text(file_as));
- strings = g_list_append (strings, string);
- }
-
- widget = glade_xml_get_widget (editor->gui, "combo-file-as");
-
- for (i = 0; i < 5; i++) {
- if (style_makes_sense (editor->name, company, i)) {
- char *u;
- u = name_to_style (editor->name, company, i);
- if (!STRING_IS_EMPTY (u))
- strings = g_list_append (strings, u);
- else
- g_free (u);
- }
- }
-
- if (widget && GTK_IS_COMBO (widget)) {
- GtkCombo *combo = GTK_COMBO (widget);
- gtk_combo_set_popdown_strings (combo, strings);
- g_list_foreach (strings, (GFunc) g_free, NULL);
- g_list_free (strings);
- }
-
- if (style != -1) {
- string = name_to_style (editor->name, company, style);
- set_entry_text (editor, file_as, string);
- g_free (string);
- }
-}
-
-static void
-name_entry_changed (GtkWidget *widget, EContactEditor *editor)
-{
- int style = 0;
- const char *string;
-
- style = file_as_get_style (editor);
- e_contact_name_free (editor->name);
- string = gtk_entry_get_text (GTK_ENTRY (widget));
- editor->name = e_contact_name_from_string (string);
- file_as_set_style (editor, style);
-}
-
-static void
-file_as_entry_changed (GtkWidget *widget, EContactEditor *editor)
-{
- char *string = gtk_editable_get_chars (GTK_EDITABLE (widget), 0, -1);
- char *title;
-
- if (string && *string)
- title = string;
- else
- title = _("Contact Editor");
-
- gtk_window_set_title (GTK_WINDOW (editor->app), title);
- g_free (string);
-}
-
-static void
-company_entry_changed (GtkWidget *widget, EContactEditor *editor)
-{
- int style = 0;
-
- style = file_as_get_style (editor);
- file_as_set_style (editor, style);
-}
-
-static void
-update_file_as_combo (EContactEditor *editor)
-{
- file_as_set_style (editor, file_as_get_style (editor));
-}
-
-static void
-fill_in_source_field (EContactEditor *editor)
-{
- GtkWidget *source_menu;
- ESource *source;
-
- if (!editor->target_book)
- return;
-
- source_menu = glade_xml_get_widget (editor->gui, "source-option-menu-source");
- source = e_book_get_source (editor->target_book);
-
- e_source_option_menu_select (E_SOURCE_OPTION_MENU (source_menu), source);
-}
-
-static void
-sensitize_ok (EContactEditor *ce)
-{
- GtkWidget *widget;
- gboolean allow_save;
-
- allow_save = ce->target_editable && ce->changed ? TRUE : FALSE;
-
- widget = glade_xml_get_widget (ce->gui, "button-ok");
- gtk_widget_set_sensitive (widget, allow_save);
-}
-
-static void
-object_changed (GObject *object, EContactEditor *editor)
-{
- if (!editor->target_editable) {
- g_warning ("non-editable contact editor has an editable field in it.");
- return;
- }
-
- if (!editor->changed) {
- editor->changed = TRUE;
- sensitize_ok (editor);
- }
-}
-
-static void
-image_chooser_changed (GtkWidget *widget, EContactEditor *editor)
-{
- editor->image_set = TRUE;
-}
-
-static void
-set_entry_text (EContactEditor *editor, GtkEntry *entry, const gchar *string)
-{
- const char *oldstring = gtk_entry_get_text (entry);
-
- if (!string)
- string = "";
-
- if (strcmp (string, oldstring)) {
- g_signal_handlers_block_matched (entry, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, editor);
- gtk_entry_set_text (entry, string);
- g_signal_handlers_unblock_matched (entry, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, editor);
- }
-}
-
-static void
-set_option_menu_history (EContactEditor *editor, GtkOptionMenu *option_menu, gint history)
-{
- g_signal_handlers_block_matched (option_menu, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, editor);
- gtk_option_menu_set_history (option_menu, history);
- g_signal_handlers_unblock_matched (option_menu, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, editor);
-}
-
-static void
-init_email_record_location (EContactEditor *editor, gint record)
-{
- GtkWidget *location_option_menu;
- GtkWidget *location_menu;
- GtkWidget *email_entry;
- gchar *widget_name;
- gint i;
-
- widget_name = g_strdup_printf ("entry-email-%d", record);
- email_entry = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- widget_name = g_strdup_printf ("optionmenu-email-%d", record);
- location_option_menu = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- location_menu = gtk_menu_new ();
-
- for (i = 0; i < G_N_ELEMENTS (common_location); i++) {
- GtkWidget *item;
-
- item = gtk_menu_item_new_with_label (_(common_location [i].pretty_name));
- gtk_menu_shell_append (GTK_MENU_SHELL (location_menu), item);
- }
-
- gtk_widget_show_all (location_menu);
- gtk_option_menu_set_menu (GTK_OPTION_MENU (location_option_menu), location_menu);
-
- g_signal_connect (location_option_menu, "changed", G_CALLBACK (object_changed), editor);
- g_signal_connect (email_entry, "changed", G_CALLBACK (object_changed), editor);
- g_signal_connect_swapped (email_entry, "activate", G_CALLBACK (entry_activated), editor);
-}
-
-static void
-init_email (EContactEditor *editor)
-{
- gint i;
-
- for (i = 1; i <= EMAIL_SLOTS; i++)
- init_email_record_location (editor, i);
-}
-
-static void
-fill_in_email_record (EContactEditor *editor, gint record, const gchar *address, gint location)
-{
- GtkWidget *location_option_menu;
- GtkWidget *email_entry;
- gchar *widget_name;
-
- widget_name = g_strdup_printf ("optionmenu-email-%d", record);
- location_option_menu = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- widget_name = g_strdup_printf ("entry-email-%d", record);
- email_entry = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- set_option_menu_history (editor, GTK_OPTION_MENU (location_option_menu),
- location >= 0 ? location : email_default [2]);
- set_entry_text (editor, GTK_ENTRY (email_entry), address ? address : "");
-}
-
-static void
-extract_email_record (EContactEditor *editor, gint record, gchar **address, gint *location)
-{
- GtkWidget *location_option_menu;
- GtkWidget *email_entry;
- gchar *widget_name;
-
- widget_name = g_strdup_printf ("optionmenu-email-%d", record);
- location_option_menu = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- widget_name = g_strdup_printf ("entry-email-%d", record);
- email_entry = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- *address = g_strdup (gtk_entry_get_text (GTK_ENTRY (email_entry)));
- *location = gtk_option_menu_get_history (GTK_OPTION_MENU (location_option_menu));
-}
-
-static const gchar *
-email_index_to_location (gint index)
-{
- return common_location [index].name;
-}
-
-static const gchar *
-im_index_to_location (gint index)
-{
- return common_location [index].name;
-}
-
-static void
-phone_index_to_type (gint index, const gchar **type_1, const gchar **type_2)
-{
- *type_1 = phones [index].type_1;
- *type_2 = phones [index].type_2;
-}
-
-static gint
-get_email_location (EVCardAttribute *attr)
-{
- gint i;
-
- for (i = 0; i < G_N_ELEMENTS (common_location); i++) {
- if (e_vcard_attribute_has_type (attr, common_location [i].name))
- return i;
- }
-
- return -1;
-}
-
-static gint
-get_im_location (EVCardAttribute *attr)
-{
- gint i;
-
- for (i = 0; i < G_N_ELEMENTS (common_location); i++) {
- if (e_vcard_attribute_has_type (attr, common_location [i].name))
- return i;
- }
-
- return -1;
-}
-
-static gint
-get_phone_type (EVCardAttribute *attr)
-{
- gint i;
-
- for (i = 0; i < G_N_ELEMENTS (phones); i++) {
- if (e_vcard_attribute_has_type (attr, phones [i].type_1) &&
- (phones [i].type_2 == NULL || e_vcard_attribute_has_type (attr, phones [i].type_2)))
- return i;
- }
-
- return -1;
-}
-
-static EVCardAttributeParam *
-get_ui_slot_param (EVCardAttribute *attr)
-{
- EVCardAttributeParam *param = NULL;
- GList *param_list;
- GList *l;
-
- param_list = e_vcard_attribute_get_params (attr);
-
- for (l = param_list; l; l = g_list_next (l)) {
- const gchar *str;
-
- param = l->data;
-
- str = e_vcard_attribute_param_get_name (param);
- if (!g_ascii_strcasecmp (str, EVOLUTION_UI_SLOT_PARAM))
- break;
-
- param = NULL;
- }
-
- return param;
-}
-
-static gint
-get_ui_slot (EVCardAttribute *attr)
-{
- EVCardAttributeParam *param;
- gint slot = -1;
-
- param = get_ui_slot_param (attr);
-
- if (param) {
- GList *value_list;
-
- value_list = e_vcard_attribute_param_get_values (param);
- slot = atoi (value_list->data);
- }
-
- return slot;
-}
-
-static void
-set_ui_slot (EVCardAttribute *attr, gint slot)
-{
- EVCardAttributeParam *param;
- gchar *slot_str;
-
- param = get_ui_slot_param (attr);
- if (!param) {
- param = e_vcard_attribute_param_new (EVOLUTION_UI_SLOT_PARAM);
- e_vcard_attribute_add_param (attr, param);
- }
-
- e_vcard_attribute_param_remove_values (param);
-
- slot_str = g_strdup_printf ("%d", slot);
- e_vcard_attribute_param_add_value (param, slot_str);
- g_free (slot_str);
-}
-
-static gint
-alloc_ui_slot (EContactEditor *editor, const gchar *widget_base, gint preferred_slot, gint num_slots)
-{
- gchar *widget_name;
- GtkWidget *widget;
- const gchar *entry_contents;
- gint i;
-
- /* See if we can get the preferred slot */
-
- if (preferred_slot >= 1) {
- widget_name = g_strdup_printf ("%s-%d", widget_base, preferred_slot);
- widget = glade_xml_get_widget (editor->gui, widget_name);
- entry_contents = gtk_entry_get_text (GTK_ENTRY (widget));
- g_free (widget_name);
-
- if (STRING_IS_EMPTY (entry_contents))
- return preferred_slot;
- }
-
- /* Find first empty slot */
-
- for (i = 1; i <= num_slots; i++) {
- widget_name = g_strdup_printf ("%s-%d", widget_base, i);
- widget = glade_xml_get_widget (editor->gui, widget_name);
- entry_contents = gtk_entry_get_text (GTK_ENTRY (widget));
- g_free (widget_name);
-
- if (STRING_IS_EMPTY (entry_contents))
- return i;
- }
-
- return -1;
-}
-
-static void
-free_attr_list (GList *attr_list)
-{
- GList *l;
-
- for (l = attr_list; l; l = g_list_next (l)) {
- EVCardAttribute *attr = l->data;
- e_vcard_attribute_free (attr);
- }
-
- g_list_free (attr_list);
-}
-
-static void
-fill_in_email (EContactEditor *editor)
-{
- GList *email_attr_list;
- GList *l;
- gint record_n;
-
- /* Clear */
-
- for (record_n = 1; record_n <= EMAIL_SLOTS; record_n++) {
- fill_in_email_record (editor, record_n, NULL, email_default [record_n - 1]);
- }
-
- /* Fill in */
-
- email_attr_list = e_contact_get_attributes (editor->contact, E_CONTACT_EMAIL);
-
- for (record_n = 1, l = email_attr_list; l && record_n <= EMAIL_SLOTS; l = g_list_next (l)) {
- EVCardAttribute *attr = l->data;
- gchar *email_address;
- gint slot;
-
- email_address = e_vcard_attribute_get_value (attr);
- slot = alloc_ui_slot (editor, "entry-email", get_ui_slot (attr), EMAIL_SLOTS);
- if (slot < 1)
- break;
-
- fill_in_email_record (editor, slot, email_address,
- get_email_location (attr));
-
- record_n++;
- }
-}
-
-static void
-extract_email (EContactEditor *editor)
-{
- GList *attr_list = NULL;
- GList *old_attr_list;
- GList *l, *l_next;
- gint i;
-
- for (i = 1; i <= EMAIL_SLOTS; i++) {
- gchar *address;
- gint location;
-
- extract_email_record (editor, i, &address, &location);
-
- if (!STRING_IS_EMPTY (address)) {
- EVCardAttribute *attr;
- attr = e_vcard_attribute_new ("", e_contact_vcard_attribute (E_CONTACT_EMAIL));
-
- if (location >= 0)
- e_vcard_attribute_add_param_with_value (attr,
- e_vcard_attribute_param_new (EVC_TYPE),
- email_index_to_location (location));
-
- e_vcard_attribute_add_value (attr, address);
- set_ui_slot (attr, i);
-
- attr_list = g_list_append (attr_list, attr);
- }
-
- g_free (address);
- }
-
- /* Splice in the old attributes, minus the EMAIL_SLOTS first */
-
- old_attr_list = e_contact_get_attributes (editor->contact, E_CONTACT_EMAIL);
- for (l = old_attr_list, i = 1; l && i <= EMAIL_SLOTS; l = l_next, i++) {
- l_next = g_list_next (l);
-
- e_vcard_attribute_free (l->data);
- g_list_delete_link (l, l);
- }
-
- old_attr_list = l;
- attr_list = g_list_concat (attr_list, old_attr_list);
-
- e_contact_set_attributes (editor->contact, E_CONTACT_EMAIL, attr_list);
-
- free_attr_list (attr_list);
-}
-
-static void
-sensitize_email_record (EContactEditor *editor, gint record, gboolean enabled)
-{
- GtkWidget *location_option_menu;
- GtkWidget *email_entry;
- gchar *widget_name;
-
- widget_name = g_strdup_printf ("optionmenu-email-%d", record);
- location_option_menu = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- widget_name = g_strdup_printf ("entry-email-%d", record);
- email_entry = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- gtk_widget_set_sensitive (location_option_menu, enabled);
- gtk_editable_set_editable (GTK_EDITABLE (email_entry), enabled);
-}
-
-static void
-sensitize_email (EContactEditor *editor)
-{
- gint i;
-
- for (i = 1; i <= EMAIL_SLOTS; i++) {
- gboolean enabled = TRUE;
-
- if (!editor->target_editable)
- enabled = FALSE;
-
- if (E_CONTACT_FIRST_EMAIL_ID + i - 1 <= E_CONTACT_LAST_EMAIL_ID &&
- !is_field_supported (editor, E_CONTACT_FIRST_EMAIL_ID + i - 1))
- enabled = FALSE;
-
- sensitize_email_record (editor, i, enabled);
- }
-}
-
-/* EContact can get attributes by field ID only, and there is none for TEL, so we need this */
-static GList *
-get_attributes_named (EVCard *vcard, const gchar *attr_name)
-{
- GList *attr_list_in;
- GList *attr_list_out = NULL;
- GList *l;
-
- attr_list_in = e_vcard_get_attributes (vcard);
-
- for (l = attr_list_in; l; l = g_list_next (l)) {
- EVCardAttribute *attr = l->data;
- const gchar *name;
-
- name = e_vcard_attribute_get_name (attr);
-
- if (!g_ascii_strcasecmp (attr_name, name)) {
- attr_list_out = g_list_append (attr_list_out, e_vcard_attribute_copy (attr));
- }
- }
-
- return attr_list_out;
-}
-
-/* EContact can set attributes by field ID only, and there is none for TEL, so we need this */
-static void
-set_attributes_named (EVCard *vcard, const gchar *attr_name, GList *attr_list)
-{
- GList *l;
-
- e_vcard_remove_attributes (vcard, NULL, attr_name);
-
- for (l = attr_list; l; l = g_list_next (l)) {
- EVCardAttribute *attr = l->data;
-
- e_vcard_add_attribute (vcard, e_vcard_attribute_copy (attr));
- }
-}
-
-static void
-expand_phone (EContactEditor *editor, gboolean expanded)
-{
- GtkWidget *phone_ext_table;
- GtkWidget *phone_ext_arrow;
-
- phone_ext_table = glade_xml_get_widget (editor->gui, "table-phone-extended");
- phone_ext_arrow = glade_xml_get_widget (editor->gui, "arrow-phone-expand");
-
- if (expanded) {
- gtk_arrow_set (GTK_ARROW (phone_ext_arrow), GTK_ARROW_DOWN, GTK_SHADOW_NONE);
- gtk_widget_show (phone_ext_table);
- } else {
- gtk_arrow_set (GTK_ARROW (phone_ext_arrow), GTK_ARROW_RIGHT, GTK_SHADOW_NONE);
- gtk_widget_hide (phone_ext_table);
- }
-}
-
-static void
-fill_in_phone_record (EContactEditor *editor, gint record, const gchar *phone, gint phone_type)
-{
- GtkWidget *phone_type_option_menu;
- GtkWidget *phone_entry;
- gchar *widget_name;
-
- widget_name = g_strdup_printf ("optionmenu-phone-%d", record);
- phone_type_option_menu = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- widget_name = g_strdup_printf ("entry-phone-%d", record);
- phone_entry = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- set_option_menu_history (editor, GTK_OPTION_MENU (phone_type_option_menu),
- phone_type >= 0 ? phone_type :
- phones_default [record - 1]);
- set_entry_text (editor, GTK_ENTRY (phone_entry), phone ? phone : "");
-
- if (phone && *phone && record >= 5)
- expand_phone (editor, TRUE);
-}
-
-static void
-extract_phone_record (EContactEditor *editor, gint record, gchar **phone, gint *phone_type)
-{
- GtkWidget *phone_type_option_menu;
- GtkWidget *phone_entry;
- gchar *widget_name;
-
- widget_name = g_strdup_printf ("optionmenu-phone-%d", record);
- phone_type_option_menu = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- widget_name = g_strdup_printf ("entry-phone-%d", record);
- phone_entry = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- *phone = g_strdup (gtk_entry_get_text (GTK_ENTRY (phone_entry)));
- *phone_type = gtk_option_menu_get_history (GTK_OPTION_MENU (phone_type_option_menu));
-}
-
-static void
-fill_in_phone (EContactEditor *editor)
-{
- GList *phone_attr_list;
- GList *l;
- gint record_n;
-
- /* Clear */
-
- for (record_n = 1; record_n <= PHONE_SLOTS; record_n++) {
- fill_in_phone_record (editor, record_n, NULL, -1);
- }
-
- /* Fill in */
-
- phone_attr_list = get_attributes_named (E_VCARD (editor->contact), "TEL");
-
- for (record_n = 1, l = phone_attr_list; l && record_n <= PHONE_SLOTS; l = g_list_next (l)) {
- EVCardAttribute *attr = l->data;
- gchar *phone;
- gint slot;
-
- phone = e_vcard_attribute_get_value (attr);
- slot = alloc_ui_slot (editor, "entry-phone", get_ui_slot (attr), PHONE_SLOTS);
- if (slot < 1)
- break;
-
- fill_in_phone_record (editor, slot, phone,
- get_phone_type (attr));
-
- record_n++;
- }
-}
-
-static void
-extract_phone (EContactEditor *editor)
-{
- GList *attr_list = NULL;
- GList *old_attr_list;
- GList *l, *l_next;
- gint i;
-
- for (i = 1; i <= PHONE_SLOTS; i++) {
- gchar *phone;
- gint phone_type;
-
- extract_phone_record (editor, i, &phone, &phone_type);
-
- if (!STRING_IS_EMPTY (phone)) {
- EVCardAttribute *attr;
-
- attr = e_vcard_attribute_new ("", "TEL");
-
- if (phone_type >= 0) {
- const gchar *type_1;
- const gchar *type_2;
-
- phone_index_to_type (phone_type, &type_1, &type_2);
-
- e_vcard_attribute_add_param_with_value (
- attr, e_vcard_attribute_param_new (EVC_TYPE), type_1);
-
- if (type_2)
- e_vcard_attribute_add_param_with_value (
- attr, e_vcard_attribute_param_new (EVC_TYPE), type_2);
-
- }
-
- e_vcard_attribute_add_value (attr, phone);
- set_ui_slot (attr, i);
-
- attr_list = g_list_append (attr_list, attr);
- }
-
- g_free (phone);
- }
-
- /* Splice in the old attributes, minus the PHONE_SLOTS first */
-
- old_attr_list = get_attributes_named (E_VCARD (editor->contact), "TEL");
- for (l = old_attr_list, i = 1; l && i <= PHONE_SLOTS; l = l_next, i++) {
- l_next = g_list_next (l);
-
- e_vcard_attribute_free (l->data);
- g_list_delete_link (l, l);
- }
-
- old_attr_list = l;
- attr_list = g_list_concat (attr_list, old_attr_list);
-
- set_attributes_named (E_VCARD (editor->contact), "TEL", attr_list);
-
- free_attr_list (attr_list);
-}
-
-static void
-init_phone_record_type (EContactEditor *editor, gint record)
-{
- GtkWidget *phone_type_option_menu;
- GtkWidget *phone_type_menu;
- GtkWidget *phone_entry;
- gchar *widget_name;
- gint i;
-
- widget_name = g_strdup_printf ("entry-phone-%d", record);
- phone_entry = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- widget_name = g_strdup_printf ("optionmenu-phone-%d", record);
- phone_type_option_menu = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- phone_type_menu = gtk_menu_new ();
-
- for (i = 0; i < G_N_ELEMENTS (phones); i++) {
- GtkWidget *item;
-
- item = gtk_menu_item_new_with_label (e_contact_pretty_name (phones [i].field_id));
- gtk_menu_shell_append (GTK_MENU_SHELL (phone_type_menu), item);
- }
-
- gtk_widget_show_all (phone_type_menu);
- gtk_option_menu_set_menu (GTK_OPTION_MENU (phone_type_option_menu), phone_type_menu);
-
- g_signal_connect (phone_type_option_menu, "changed", G_CALLBACK (object_changed), editor);
- g_signal_connect (phone_entry, "changed", G_CALLBACK (object_changed), editor);
- g_signal_connect_swapped (phone_entry, "activate", G_CALLBACK (entry_activated), editor);
-}
-
-static void
-init_phone (EContactEditor *editor)
-{
- gint i;
-
- expand_phone (editor, FALSE);
-
- for (i = 1; i <= PHONE_SLOTS; i++)
- init_phone_record_type (editor, i);
-}
-
-static void
-sensitize_phone_types (EContactEditor *editor, GtkWidget *option_menu)
-{
- GtkWidget *menu;
- GList *item_list, *l;
- gint i;
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (option_menu));
- l = item_list = gtk_container_get_children (GTK_CONTAINER (menu));
-
- for (i = 0; i < G_N_ELEMENTS (phones); i++) {
- GtkWidget *widget;
-
- if (!l) {
- g_warning (G_STRLOC ": Unexpected end of phone items in option menu");
- return;
- }
-
- widget = l->data;
- gtk_widget_set_sensitive (widget, is_field_supported (editor, phones [i].field_id));
-
- l = g_list_next (l);
- }
-}
-
-static void
-sensitize_phone_record (EContactEditor *editor, gint record, gboolean enabled)
-{
- GtkWidget *phone_type_option_menu;
- GtkWidget *phone_entry;
- gchar *widget_name;
-
- widget_name = g_strdup_printf ("optionmenu-phone-%d", record);
- phone_type_option_menu = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- widget_name = g_strdup_printf ("entry-phone-%d", record);
- phone_entry = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- gtk_widget_set_sensitive (phone_type_option_menu, enabled);
- gtk_editable_set_editable (GTK_EDITABLE (phone_entry), enabled);
-
- sensitize_phone_types (editor, phone_type_option_menu);
-}
-
-static void
-sensitize_phone (EContactEditor *editor)
-{
- gint i;
-
- for (i = 1; i <= PHONE_SLOTS; i++) {
- gboolean enabled = TRUE;
-
- if (!editor->target_editable)
- enabled = FALSE;
-
- sensitize_phone_record (editor, i, enabled);
- }
-}
-
-static void
-init_im_record_location (EContactEditor *editor, gint record)
-{
- GtkWidget *location_option_menu;
- GtkWidget *location_menu;
- GtkWidget *name_entry;
- gchar *widget_name;
- gint i;
-
- widget_name = g_strdup_printf ("entry-im-name-%d", record);
- name_entry = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
-#ifdef ENABLE_IM_LOCATION
- widget_name = g_strdup_printf ("optionmenu-im-location-%d", record);
- location_option_menu = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- location_menu = gtk_menu_new ();
-
- for (i = 0; i < G_N_ELEMENTS (common_location); i++) {
- GtkWidget *item;
-
- item = gtk_menu_item_new_with_label (_(common_location [i].pretty_name));
- gtk_menu_shell_append (GTK_MENU_SHELL (location_menu), item);
- }
-
- gtk_widget_show_all (location_menu);
- gtk_option_menu_set_menu (GTK_OPTION_MENU (location_option_menu), location_menu);
-
- g_signal_connect (location_option_menu, "changed", G_CALLBACK (object_changed), editor);
-#endif
-
- g_signal_connect (name_entry, "changed", G_CALLBACK (object_changed), editor);
- g_signal_connect_swapped (name_entry, "activate", G_CALLBACK (entry_activated), editor);
-}
-
-static void
-init_im_record_service (EContactEditor *editor, gint record)
-{
- GtkWidget *service_option_menu;
- GtkWidget *service_menu;
- gchar *widget_name;
- gint i;
-
- widget_name = g_strdup_printf ("optionmenu-im-service-%d", record);
- service_option_menu = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- service_menu = gtk_menu_new ();
-
- for (i = 0; i < G_N_ELEMENTS (im_service); i++) {
- GtkWidget *item;
-
- item = gtk_menu_item_new_with_label (im_service [i].pretty_name);
- gtk_menu_shell_append (GTK_MENU_SHELL (service_menu), item);
- }
-
- gtk_widget_show_all (service_menu);
- gtk_option_menu_set_menu (GTK_OPTION_MENU (service_option_menu), service_menu);
-
- g_signal_connect (service_option_menu, "changed", G_CALLBACK (object_changed), editor);
-}
-
-static void
-init_im (EContactEditor *editor)
-{
- gint i;
-
- for (i = 1; i <= IM_SLOTS; i++) {
- init_im_record_service (editor, i);
- init_im_record_location (editor, i);
- }
-}
-
-static void
-fill_in_im_record (EContactEditor *editor, gint record, gint service, const gchar *name, gint location)
-{
- GtkWidget *service_option_menu;
-#ifdef ENABLE_IM_LOCATION
- GtkWidget *location_option_menu;
-#endif
- GtkWidget *name_entry;
- gchar *widget_name;
-
- widget_name = g_strdup_printf ("optionmenu-im-service-%d", record);
- service_option_menu = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
-#ifdef ENABLE_IM_LOCATION
- widget_name = g_strdup_printf ("optionmenu-im-location-%d", record);
- location_option_menu = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-#endif
-
- widget_name = g_strdup_printf ("entry-im-name-%d", record);
- name_entry = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
-#ifdef ENABLE_IM_LOCATION
- set_option_menu_history (editor, GTK_OPTION_MENU (location_option_menu),
- location >= 0 ? location : 0);
-#endif
- set_option_menu_history (editor, GTK_OPTION_MENU (service_option_menu),
- service >= 0 ? service : im_service_default [record - 1]);
- set_entry_text (editor, GTK_ENTRY (name_entry), name ? name : "");
-}
-
-static void
-fill_in_im (EContactEditor *editor)
-{
- GList *im_attr_list;
- GList *l;
- gint record_n;
- gint i;
-
- /* Clear */
-
- for (record_n = 1 ; record_n <= IM_SLOTS; record_n++) {
- fill_in_im_record (editor, record_n, -1, NULL, -1);
- }
-
- /* Fill in */
-
- for (record_n = 1, i = 0; i < G_N_ELEMENTS (im_service); i++) {
- im_attr_list = e_contact_get_attributes (editor->contact, im_service [i].field);
-
- for (l = im_attr_list; l && record_n <= IM_SLOTS; l = g_list_next (l)) {
- EVCardAttribute *attr = l->data;
- gchar *im_name;
- gint slot;
-
- im_name = e_vcard_attribute_get_value (attr);
- slot = alloc_ui_slot (editor, "entry-im-name", get_ui_slot (attr), IM_SLOTS);
- if (slot < 1)
- break;
-
- fill_in_im_record (editor, slot, i, im_name,
- get_im_location (attr));
-
- record_n++;
- }
- }
-}
-
-static void
-extract_im_record (EContactEditor *editor, gint record, gint *service, gchar **name, gint *location)
-{
- GtkWidget *service_option_menu;
-#ifdef ENABLE_IM_LOCATION
- GtkWidget *location_option_menu;
-#endif
- GtkWidget *name_entry;
- gchar *widget_name;
-
- widget_name = g_strdup_printf ("optionmenu-im-service-%d", record);
- service_option_menu = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
-#ifdef ENABLE_IM_LOCATION
- widget_name = g_strdup_printf ("optionmenu-im-location-%d", record);
- location_option_menu = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-#endif
-
- widget_name = g_strdup_printf ("entry-im-name-%d", record);
- name_entry = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- *name = g_strdup (gtk_entry_get_text (GTK_ENTRY (name_entry)));
- *service = gtk_option_menu_get_history (GTK_OPTION_MENU (service_option_menu));
-#ifdef ENABLE_IM_LOCATION
- *location = gtk_option_menu_get_history (GTK_OPTION_MENU (location_option_menu));
-#else
- *location = 1; /* set everything to HOME */
-#endif
-}
-
-static void
-extract_im (EContactEditor *editor)
-{
- GList **service_attr_list;
- gint remaining_slots = IM_SLOTS;
- gint i;
-
- service_attr_list = g_new0 (GList *, G_N_ELEMENTS (im_service));
-
- for (i = 1; i <= IM_SLOTS; i++) {
- EVCardAttribute *attr;
- gchar *name;
- gint service;
- gint location;
-
- extract_im_record (editor, i, &service, &name, &location);
-
- if (!STRING_IS_EMPTY (name)) {
- attr = e_vcard_attribute_new ("", e_contact_vcard_attribute (im_service [service].field));
-
- if (location >= 0)
- e_vcard_attribute_add_param_with_value (attr,
- e_vcard_attribute_param_new (EVC_TYPE),
- im_index_to_location (location));
-
- e_vcard_attribute_add_value (attr, name);
- set_ui_slot (attr, i);
-
- service_attr_list [service] = g_list_append (service_attr_list [service], attr);
- }
-
- g_free (name);
- }
-
- for (i = 0; i < G_N_ELEMENTS (im_service); i++) {
- GList *old_service_attr_list;
- gint filled_in_slots;
- GList *l, *l_next;
- gint j;
-
- /* Splice in the old attributes, minus the filled_in_slots first */
-
- old_service_attr_list = e_contact_get_attributes (editor->contact, im_service [i].field);
- filled_in_slots = MIN (remaining_slots, g_list_length (old_service_attr_list));
- remaining_slots -= filled_in_slots;
-
- for (l = old_service_attr_list, j = 0; l && j < filled_in_slots; l = l_next, j++) {
- l_next = g_list_next (l);
-
- e_vcard_attribute_free (l->data);
- g_list_delete_link (l, l);
- }
-
- old_service_attr_list = l;
- service_attr_list [i] = g_list_concat (service_attr_list [i], old_service_attr_list);
-
- e_contact_set_attributes (editor->contact, im_service [i].field,
- service_attr_list [i]);
-
- free_attr_list (service_attr_list [i]);
- }
-
- g_free (service_attr_list);
-}
-static void
-sensitize_im_types (EContactEditor *editor, GtkWidget *option_menu)
-{
- GtkWidget *menu;
- GList *item_list, *l;
- gint i;
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (option_menu));
- l = item_list = gtk_container_get_children (GTK_CONTAINER (menu));
-
- for (i = 0; i < G_N_ELEMENTS (im_service); i++) {
- GtkWidget *widget;
-
- if (!l) {
- g_warning (G_STRLOC ": Unexpected end of im items in option menu");
- return;
- }
-
- widget = l->data;
- gtk_widget_set_sensitive (widget, is_field_supported (editor, im_service [i].field));
-
- l = g_list_next (l);
- }
-}
-
-static void
-sensitize_im_record (EContactEditor *editor, gint record, gboolean enabled)
-{
- GtkWidget *service_option_menu;
-#ifdef ENABLE_IM_LOCATION
- GtkWidget *location_option_menu;
-#endif
- GtkWidget *name_entry;
- gchar *widget_name;
-
- widget_name = g_strdup_printf ("optionmenu-im-service-%d", record);
- service_option_menu = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
-#ifdef ENABLE_IM_LOCATION
- widget_name = g_strdup_printf ("optionmenu-im-location-%d", record);
- location_option_menu = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-#endif
-
- widget_name = g_strdup_printf ("entry-im-name-%d", record);
- name_entry = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- gtk_widget_set_sensitive (service_option_menu, enabled);
-#ifdef ENABLE_IM_LOCATION
- gtk_widget_set_sensitive (location_option_menu, enabled);
-#endif
- gtk_editable_set_editable (GTK_EDITABLE (name_entry), enabled);
- sensitize_im_types (editor, service_option_menu);
-}
-
-static void
-sensitize_im (EContactEditor *editor)
-{
- gint i;
- gboolean enabled;
- gboolean no_ims_supported;
-
- enabled = editor->target_editable;
- no_ims_supported = TRUE;
-
- for (i = 0; i < G_N_ELEMENTS (im_service); i++)
- if (is_field_supported (editor, im_service[i].field)) {
- no_ims_supported = FALSE;
- break;
- }
-
- if (no_ims_supported)
- enabled = FALSE;
-
- for (i = 1; i <= IM_SLOTS; i++) {
- sensitize_im_record (editor, i, enabled);
- }
-}
-
-static void
-init_address_textview (EContactEditor *editor, gint record)
-{
- gchar *textview_name;
- GtkWidget *textview;
- GtkTextBuffer *text_buffer;
-
- textview_name = g_strdup_printf ("textview-%s-address", address_name [record]);
- textview = glade_xml_get_widget (editor->gui, textview_name);
- g_free (textview_name);
-
- text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
- g_signal_connect (text_buffer, "changed", G_CALLBACK (object_changed), editor);
-}
-
-static void
-init_address_field (EContactEditor *editor, gint record, const gchar *widget_field_name)
-{
- gchar *entry_name;
- GtkWidget *entry;
-
- entry_name = g_strdup_printf ("entry-%s-%s", address_name [record], widget_field_name);
- entry = glade_xml_get_widget (editor->gui, entry_name);
- g_free (entry_name);
-
- g_signal_connect (entry, "changed", G_CALLBACK (object_changed), editor);
- g_signal_connect_swapped (entry, "activate", G_CALLBACK (entry_activated), editor);
-}
-
-static void
-init_address_record (EContactEditor *editor, gint record)
-{
- init_address_textview (editor, record);
- init_address_field (editor, record, "city");
- init_address_field (editor, record, "state");
- init_address_field (editor, record, "zip");
- init_address_field (editor, record, "country");
- init_address_field (editor, record, "pobox");
-}
-
-static void
-init_address (EContactEditor *editor)
-{
- gint i;
-
- for (i = 0; i < ADDRESS_SLOTS; i++)
- init_address_record (editor, i);
-}
-
-static void
-fill_in_address_textview (EContactEditor *editor, gint record, EContactAddress *address)
-{
- gchar *textview_name;
- GtkWidget *textview;
- GtkTextBuffer *text_buffer;
- GtkTextIter iter;
-
- textview_name = g_strdup_printf ("textview-%s-address", address_name [record]);
- textview = glade_xml_get_widget (editor->gui, textview_name);
- g_free (textview_name);
-
- text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
- gtk_text_buffer_set_text (text_buffer, address->street ? address->street : "", -1);
-
- gtk_text_buffer_get_end_iter (text_buffer, &iter);
- gtk_text_buffer_insert (text_buffer, &iter, "\n", -1);
- gtk_text_buffer_insert (text_buffer, &iter, address->ext ? address->ext : "", -1);
-}
-
-static void
-fill_in_address_label_textview (EContactEditor *editor, gint record, const gchar *label)
-{
- gchar *textview_name;
- GtkWidget *textview;
- GtkTextBuffer *text_buffer;
-
- textview_name = g_strdup_printf ("textview-%s-address", address_name [record]);
- textview = glade_xml_get_widget (editor->gui, textview_name);
- g_free (textview_name);
-
- text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
- gtk_text_buffer_set_text (text_buffer, label ? label : "", -1);
-}
-
-static void
-fill_in_address_field (EContactEditor *editor, gint record, const gchar *widget_field_name,
- const gchar *string)
-{
- gchar *entry_name;
- GtkWidget *entry;
-
- entry_name = g_strdup_printf ("entry-%s-%s", address_name [record], widget_field_name);
- entry = glade_xml_get_widget (editor->gui, entry_name);
- g_free (entry_name);
-
- set_entry_text (editor, GTK_ENTRY (entry), string);
-}
-
-static void
-fill_in_address_record (EContactEditor *editor, gint record)
-{
- EContactAddress *address;
- gchar *address_label;
-
- address = e_contact_get (editor->contact, addresses [record]);
- address_label = e_contact_get (editor->contact, address_labels [record]);
-
- if (address &&
- (!STRING_IS_EMPTY (address->street) ||
- !STRING_IS_EMPTY (address->ext) ||
- !STRING_IS_EMPTY (address->locality) ||
- !STRING_IS_EMPTY (address->region) ||
- !STRING_IS_EMPTY (address->code) ||
- !STRING_IS_EMPTY (address->po) ||
- !STRING_IS_EMPTY (address->country))) {
- fill_in_address_textview (editor, record, address);
- fill_in_address_field (editor, record, "city", address->locality);
- fill_in_address_field (editor, record, "state", address->region);
- fill_in_address_field (editor, record, "zip", address->code);
- fill_in_address_field (editor, record, "country", address->country);
- fill_in_address_field (editor, record, "pobox", address->po);
- } else if (!STRING_IS_EMPTY (address_label)) {
- fill_in_address_label_textview (editor, record, address_label);
- }
-
- g_free (address_label);
- if (address)
- g_boxed_free (e_contact_address_get_type (), address);
-}
-
-static void
-fill_in_address (EContactEditor *editor)
-{
- gint i;
-
- for (i = 0; i < ADDRESS_SLOTS; i++)
- fill_in_address_record (editor, i);
-}
-
-static void
-extract_address_textview (EContactEditor *editor, gint record, EContactAddress *address)
-{
- gchar *textview_name;
- GtkWidget *textview;
- GtkTextBuffer *text_buffer;
- GtkTextIter iter_1, iter_2;
-
- textview_name = g_strdup_printf ("textview-%s-address", address_name [record]);
- textview = glade_xml_get_widget (editor->gui, textview_name);
- g_free (textview_name);
-
- text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
- gtk_text_buffer_get_start_iter (text_buffer, &iter_1);
-
- /* Skip blank lines */
- while (gtk_text_iter_get_chars_in_line (&iter_1) < 1 &&
- !gtk_text_iter_is_end (&iter_1))
- gtk_text_iter_forward_line (&iter_1);
-
- if (gtk_text_iter_is_end (&iter_1))
- return;
-
- iter_2 = iter_1;
- gtk_text_iter_forward_to_line_end (&iter_2);
-
- /* Extract street (first line of text) */
- address->street = gtk_text_iter_get_text (&iter_1, &iter_2);
-
- iter_1 = iter_2;
- gtk_text_iter_forward_line (&iter_1);
-
- if (gtk_text_iter_is_end (&iter_1))
- return;
-
- gtk_text_iter_forward_to_end (&iter_2);
-
- /* Extract extended address (remaining lines of text) */
- address->ext = gtk_text_iter_get_text (&iter_1, &iter_2);
-}
-
-static gchar *
-extract_address_field (EContactEditor *editor, gint record, const gchar *widget_field_name)
-{
- gchar *entry_name;
- GtkWidget *entry;
-
- entry_name = g_strdup_printf ("entry-%s-%s", address_name [record], widget_field_name);
- entry = glade_xml_get_widget (editor->gui, entry_name);
- g_free (entry_name);
-
- return g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
-}
-
-static gchar *
-append_to_address_label (gchar *address_label, const gchar *part, gboolean newline)
-{
- gchar *new_address_label;
-
- if (STRING_IS_EMPTY (part))
- return address_label;
-
- if (address_label)
- new_address_label = g_strjoin (newline ? "\n" : ", ", address_label, part, NULL);
- else
- new_address_label = g_strdup (part);
-
- g_free (address_label);
- return new_address_label;
-}
-
-static void
-set_address_label (EContact *contact, EContactField field, EContactAddress *address)
-{
- gchar *address_label = NULL;
-
- if (address) {
- address_label = append_to_address_label (address_label, address->street, TRUE);
- address_label = append_to_address_label (address_label, address->ext, TRUE);
- address_label = append_to_address_label (address_label, address->locality, TRUE);
- address_label = append_to_address_label (address_label, address->region, FALSE);
- address_label = append_to_address_label (address_label, address->code, TRUE);
- address_label = append_to_address_label (address_label, address->po, TRUE);
- address_label = append_to_address_label (address_label, address->country, TRUE);
- }
-
- e_contact_set (contact, field, address_label);
- g_free (address_label);
-}
-
-static void
-extract_address_record (EContactEditor *editor, gint record)
-{
- EContactAddress *address;
-
- address = g_new0 (EContactAddress, 1);
-
- extract_address_textview (editor, record, address);
- address->locality = extract_address_field (editor, record, "city");
- address->region = extract_address_field (editor, record, "state");
- address->code = extract_address_field (editor, record, "zip");
- address->country = extract_address_field (editor, record, "country");
- address->po = extract_address_field (editor, record, "pobox");
-
- if (!STRING_IS_EMPTY (address->street) ||
- !STRING_IS_EMPTY (address->ext) ||
- !STRING_IS_EMPTY (address->locality) ||
- !STRING_IS_EMPTY (address->region) ||
- !STRING_IS_EMPTY (address->code) ||
- !STRING_IS_EMPTY (address->po) ||
- !STRING_IS_EMPTY (address->country)) {
- e_contact_set (editor->contact, addresses [record], address);
- set_address_label (editor->contact, address_labels [record], address);
- }
- else {
- e_contact_set (editor->contact, addresses [record], NULL);
- set_address_label (editor->contact, address_labels [record], NULL);
- }
-
- g_boxed_free (e_contact_address_get_type (), address);
-}
-
-static void
-extract_address (EContactEditor *editor)
-{
- gint i;
-
- for (i = 0; i < ADDRESS_SLOTS; i++)
- extract_address_record (editor, i);
-}
-
-static void
-sensitize_address_textview (EContactEditor *editor, gint record, gboolean enabled)
-{
- gchar *widget_name;
- GtkWidget *textview;
- GtkWidget *label;
-
- widget_name = g_strdup_printf ("textview-%s-address", address_name [record]);
- textview = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- widget_name = g_strdup_printf ("label-%s-address", address_name [record]);
- label = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- gtk_text_view_set_editable (GTK_TEXT_VIEW (textview), enabled);
- gtk_widget_set_sensitive (label, enabled);
-}
-
-static void
-sensitize_address_field (EContactEditor *editor, gint record, const gchar *widget_field_name,
- gboolean enabled)
-{
- gchar *widget_name;
- GtkWidget *entry;
- GtkWidget *label;
-
- widget_name = g_strdup_printf ("entry-%s-%s", address_name [record], widget_field_name);
- entry = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- widget_name = g_strdup_printf ("label-%s-%s", address_name [record], widget_field_name);
- label = glade_xml_get_widget (editor->gui, widget_name);
- g_free (widget_name);
-
- gtk_editable_set_editable (GTK_EDITABLE (entry), enabled);
- gtk_widget_set_sensitive (label, enabled);
-}
-
-static void
-sensitize_address_record (EContactEditor *editor, gint record, gboolean enabled)
-{
- sensitize_address_textview (editor, record, enabled);
- sensitize_address_field (editor, record, "city", enabled);
- sensitize_address_field (editor, record, "state", enabled);
- sensitize_address_field (editor, record, "zip", enabled);
- sensitize_address_field (editor, record, "country", enabled);
- sensitize_address_field (editor, record, "pobox", enabled);
-}
-
-static void
-sensitize_address (EContactEditor *editor)
-{
- gint i;
-
- for (i = 0; i < ADDRESS_SLOTS; i++) {
- gboolean enabled = TRUE;
-
- if (!editor->target_editable ||
- !(is_field_supported (editor, addresses [i]) ||
- is_field_supported (editor, address_labels[i])))
- enabled = FALSE;
-
- sensitize_address_record (editor, i, enabled);
- }
-}
-
-typedef struct {
- char *widget_name;
- gint field_id; /* EContactField or -1 */
- gboolean process_data; /* If we should extract/fill in contents */
- gboolean desensitize_for_read_only;
-}
-FieldMapping;
-
-/* Table of widgets that interact with simple fields. This table is used to:
- *
- * - Fill in data.
- * - Extract data.
- * - Set sensitivity based on backend capabilities.
- * - Set sensitivity based on book writeability. */
-
-static FieldMapping simple_field_map [] = {
- { "entry-homepage", E_CONTACT_HOMEPAGE_URL, TRUE, TRUE },
- { "accellabel-homepage", E_CONTACT_HOMEPAGE_URL, FALSE, TRUE },
-
- { "entry-jobtitle", E_CONTACT_TITLE, TRUE, TRUE },
- { "label-jobtitle", E_CONTACT_TITLE, FALSE, TRUE },
-
- { "entry-company", E_CONTACT_ORG, TRUE, TRUE },
- { "label-company", E_CONTACT_ORG, FALSE, TRUE },
-
- { "entry-department", E_CONTACT_ORG_UNIT, TRUE, TRUE },
- { "label-department", E_CONTACT_ORG_UNIT, FALSE, TRUE },
-
- { "entry-profession", E_CONTACT_ROLE, TRUE, TRUE },
- { "label-profession", E_CONTACT_ROLE, FALSE, TRUE },
-
- { "entry-manager", E_CONTACT_MANAGER, TRUE, TRUE },
- { "label-manager", E_CONTACT_MANAGER, FALSE, TRUE },
-
- { "entry-assistant", E_CONTACT_ASSISTANT, TRUE, TRUE },
- { "label-assistant", E_CONTACT_ASSISTANT, FALSE, TRUE },
-
- { "entry-nickname", E_CONTACT_NICKNAME, TRUE, TRUE },
- { "label-nickname", E_CONTACT_NICKNAME, FALSE, TRUE },
-
- { "dateedit-birthday", E_CONTACT_BIRTH_DATE, TRUE, TRUE },
- { "label-birthday", E_CONTACT_BIRTH_DATE, FALSE, TRUE },
-
- { "dateedit-anniversary", E_CONTACT_ANNIVERSARY, TRUE, TRUE },
- { "label-anniversary", E_CONTACT_ANNIVERSARY, FALSE, TRUE },
-
- { "entry-spouse", E_CONTACT_SPOUSE, TRUE, TRUE },
- { "label-spouse", E_CONTACT_SPOUSE, FALSE, TRUE },
-
- { "entry-office", E_CONTACT_OFFICE, TRUE, TRUE },
- { "label-office", E_CONTACT_OFFICE, FALSE, TRUE },
-
- { "text-comments", E_CONTACT_NOTE, TRUE, TRUE },
- { "label-comments", E_CONTACT_NOTE, FALSE, TRUE },
-
- { "entry-fullname", E_CONTACT_FULL_NAME, TRUE, TRUE },
- { "button-fullname", E_CONTACT_FULL_NAME, FALSE, TRUE },
-
- { "entry-categories", E_CONTACT_CATEGORIES, TRUE, TRUE },
- { "button-categories", E_CONTACT_CATEGORIES, FALSE, TRUE },
-
- { "entry-weblog", E_CONTACT_BLOG_URL, TRUE, TRUE },
- { "label-weblog", E_CONTACT_BLOG_URL, FALSE, TRUE },
-
- { "entry-caluri", E_CONTACT_CALENDAR_URI, TRUE, TRUE },
- { "label-caluri", E_CONTACT_CALENDAR_URI, FALSE, TRUE },
-
- { "entry-fburl", E_CONTACT_FREEBUSY_URL, TRUE, TRUE },
- { "label-fburl", E_CONTACT_FREEBUSY_URL, FALSE, TRUE },
-
- { "entry-videourl", E_CONTACT_VIDEO_URL, TRUE, TRUE },
- { "label-videourl", E_CONTACT_VIDEO_URL, FALSE, TRUE },
-
- { "checkbutton-htmlmail", E_CONTACT_WANTS_HTML, TRUE, TRUE },
-
- { "image-chooser", E_CONTACT_PHOTO, TRUE, TRUE },
- { "button-image", E_CONTACT_PHOTO, FALSE, TRUE },
-
- { "combo-file-as", E_CONTACT_FILE_AS, FALSE, TRUE },
- { "entry-file-as", E_CONTACT_FILE_AS, TRUE, TRUE },
- { "accellabel-fileas", E_CONTACT_FILE_AS, FALSE, TRUE },
-};
-
-static void
-init_simple_field (EContactEditor *editor, GtkWidget *widget)
-{
- GObject *changed_object = NULL;
-
- if (GTK_IS_ENTRY (widget)) {
- changed_object = G_OBJECT (widget);
- g_signal_connect_swapped (widget, "activate", G_CALLBACK (entry_activated), editor);
- }
- else if (GTK_IS_TEXT_VIEW (widget)) {
- changed_object = G_OBJECT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget)));
- }
- else if (E_IS_URL_ENTRY (widget)) {
- changed_object = G_OBJECT (e_url_entry_get_entry (E_URL_ENTRY (widget)));
- g_signal_connect_swapped (GTK_WIDGET (changed_object), "activate",
- G_CALLBACK (entry_activated), editor);
- }
- else if (E_IS_DATE_EDIT (widget)) {
- changed_object = G_OBJECT (widget);
- }
- else if (E_IS_IMAGE_CHOOSER (widget)) {
- changed_object = G_OBJECT (widget);
- g_signal_connect (widget, "changed", G_CALLBACK (image_chooser_changed), editor);
- }
- else if (GTK_IS_TOGGLE_BUTTON (widget)) {
- g_signal_connect (widget, "toggled", G_CALLBACK (object_changed), editor);
- }
-
- if (changed_object)
- g_signal_connect (changed_object, "changed", G_CALLBACK (object_changed), editor);
-}
-
-static void
-fill_in_simple_field (EContactEditor *editor, GtkWidget *widget, gint field_id)
-{
- EContact *contact;
-
- contact = editor->contact;
-
- g_signal_handlers_block_matched (widget, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, editor);
-
- if (GTK_IS_ENTRY (widget)) {
- gchar *text = e_contact_get (contact, field_id);
- gtk_entry_set_text (GTK_ENTRY (widget), STRING_MAKE_NON_NULL (text));
- g_free (text);
- }
- else if (GTK_IS_TEXT_VIEW (widget)) {
- GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
- gchar *text = e_contact_get (contact, field_id);
- gtk_text_buffer_set_text (buffer, STRING_MAKE_NON_NULL (text), -1);
- g_free (text);
- }
- else if (E_IS_URL_ENTRY (widget)) {
- GtkWidget *entry = e_url_entry_get_entry (E_URL_ENTRY (widget));
- gchar *text = e_contact_get (contact, field_id);
- gtk_entry_set_text (GTK_ENTRY (entry), STRING_MAKE_NON_NULL (text));
- g_free (text);
- }
- else if (E_IS_DATE_EDIT (widget)) {
- EContactDate *date = e_contact_get (contact, field_id);
- if (date)
- e_date_edit_set_date (E_DATE_EDIT (widget),
- date->year,
- date->month,
- date->day);
- else
- e_date_edit_set_time (E_DATE_EDIT (widget), -1);
-
- e_contact_date_free (date);
- }
- else if (E_IS_IMAGE_CHOOSER (widget)) {
- EContactPhoto *photo = e_contact_get (contact, field_id);
- if (photo) {
- e_image_chooser_set_image_data (E_IMAGE_CHOOSER (widget),
- photo->data,
- photo->length);
- editor->image_set = TRUE;
- }
- else {
- gchar *file_name = e_icon_factory_get_icon_filename ("stock_person", 48);
- e_image_chooser_set_from_file (E_IMAGE_CHOOSER (widget), file_name);
- editor->image_set = FALSE;
- g_free (file_name);
- }
-
- e_contact_photo_free (photo);
- }
- else if (GTK_IS_TOGGLE_BUTTON (widget)) {
- gboolean val = (gboolean) e_contact_get (contact, field_id);
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), val);
- }
- else {
- g_warning (G_STRLOC ": Unhandled widget class in mappings!");
- }
-
- g_signal_handlers_unblock_matched (widget, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, editor);
-}
-
-static void
-extract_simple_field (EContactEditor *editor, GtkWidget *widget, gint field_id)
-{
- EContact *contact;
-
- contact = editor->contact;
-
- if (GTK_IS_ENTRY (widget)) {
- const gchar *text = gtk_entry_get_text (GTK_ENTRY (widget));
- e_contact_set (contact, field_id, (gchar *) text);
- }
- else if (GTK_IS_TEXT_VIEW (widget)) {
- GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
- GtkTextIter start, end;
- gchar *text;
-
- gtk_text_buffer_get_start_iter (buffer, &start);
- gtk_text_buffer_get_end_iter (buffer, &end);
- text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
- e_contact_set (contact, field_id, text);
- g_free (text);
- }
- else if (E_IS_URL_ENTRY (widget)) {
- GtkWidget *entry = e_url_entry_get_entry (E_URL_ENTRY (widget));
- const gchar *text = gtk_entry_get_text (GTK_ENTRY (entry));
- e_contact_set (contact, field_id, (gchar *) text);
- }
- else if (E_IS_DATE_EDIT (widget)) {
- EContactDate date;
- if (e_date_edit_get_date (E_DATE_EDIT (widget),
- &date.year,
- &date.month,
- &date.day))
- e_contact_set (contact, field_id, &date);
- else
- e_contact_set (contact, field_id, NULL);
- }
- else if (E_IS_IMAGE_CHOOSER (widget)) {
- EContactPhoto photo;
-
- if (editor->image_set &&
- e_image_chooser_get_image_data (E_IMAGE_CHOOSER (widget),
- &photo.data, &photo.length)) {
- e_contact_set (contact, field_id, &photo);
- g_free (photo.data);
- }
- else {
- e_contact_set (contact, E_CONTACT_PHOTO, NULL);
- }
- }
- else if (GTK_IS_TOGGLE_BUTTON (widget)) {
- gboolean val = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
- e_contact_set (contact, field_id, (gpointer) val);
- }
- else {
- g_warning (G_STRLOC ": Unhandled widget class in mappings!");
- }
-}
-
-static void
-sensitize_simple_field (GtkWidget *widget, gboolean enabled)
-{
- if (GTK_IS_ENTRY (widget))
- gtk_editable_set_editable (GTK_EDITABLE (widget), enabled);
- else if (GTK_IS_TEXT_VIEW (widget))
- gtk_text_view_set_editable (GTK_TEXT_VIEW (widget), enabled);
- else if (E_IS_URL_ENTRY (widget)) {
- GtkWidget *entry = e_url_entry_get_entry (E_URL_ENTRY (widget));
- gtk_editable_set_editable (GTK_EDITABLE (entry), enabled);
- }
- else if (E_IS_DATE_EDIT (widget))
- e_date_edit_set_editable (E_DATE_EDIT (widget), enabled);
- else
- gtk_widget_set_sensitive (widget, enabled);
-}
-
-static void
-init_simple (EContactEditor *editor)
-{
- GtkWidget *widget;
- gint i;
-
- for (i = 0; i < G_N_ELEMENTS (simple_field_map); i++) {
- GtkWidget *widget;
-
- widget = glade_xml_get_widget (editor->gui, simple_field_map [i].widget_name);
- if (!widget)
- continue;
-
- init_simple_field (editor, widget);
- }
-
- /* --- Special cases --- */
-
- /* Update file_as */
-
- widget = glade_xml_get_widget (editor->gui, "entry-fullname");
- g_signal_connect (widget, "changed", G_CALLBACK (name_entry_changed), editor);
- widget = glade_xml_get_widget (editor->gui, "entry-file-as");
- g_signal_connect (widget, "changed", G_CALLBACK (file_as_entry_changed), editor);
- widget = glade_xml_get_widget (editor->gui, "entry-company");
- g_signal_connect (widget, "changed", G_CALLBACK (company_entry_changed), editor);
-}
-
-static void
-fill_in_simple (EContactEditor *editor)
-{
- EContactName *name;
- gint i;
-
- for (i = 0; i < G_N_ELEMENTS (simple_field_map); i++) {
- GtkWidget *widget;
-
- if (simple_field_map [i].field_id < 0 ||
- !simple_field_map [i].process_data)
- continue;
-
- widget = glade_xml_get_widget (editor->gui, simple_field_map [i].widget_name);
- if (!widget)
- continue;
-
- fill_in_simple_field (editor, widget, simple_field_map [i].field_id);
- }
-
- /* --- Special cases --- */
-
- /* Update broken-up name */
-
- g_object_get (editor->contact,
- "name", &name,
- NULL);
-
- if (editor->name)
- e_contact_name_free (editor->name);
-
- editor->name = name;
-
- /* Update file_as combo options */
-
- update_file_as_combo (editor);
-}
-
-static void
-extract_simple (EContactEditor *editor)
-{
- gint i;
-
- for (i = 0; i < G_N_ELEMENTS (simple_field_map); i++) {
- GtkWidget *widget;
-
- if (simple_field_map [i].field_id < 0 ||
- !simple_field_map [i].process_data)
- continue;
-
- widget = glade_xml_get_widget (editor->gui, simple_field_map [i].widget_name);
- if (!widget)
- continue;
-
- extract_simple_field (editor, widget, simple_field_map [i].field_id);
- }
-
- /* Special cases */
-
- e_contact_set (editor->contact, E_CONTACT_NAME, editor->name);
-}
-
-static void
-sensitize_simple (EContactEditor *editor)
-{
- gint i;
-
- for (i = 0; i < G_N_ELEMENTS (simple_field_map); i++) {
- GtkWidget *widget;
- gboolean enabled = TRUE;
-
- widget = glade_xml_get_widget (editor->gui, simple_field_map [i].widget_name);
- if (!widget)
- continue;
-
- if (simple_field_map [i].field_id >= 0 &&
- !is_field_supported (editor, simple_field_map [i].field_id))
- enabled = FALSE;
-
- if (simple_field_map [i].desensitize_for_read_only &&
- !editor->target_editable)
- enabled = FALSE;
-
- sensitize_simple_field (widget, enabled);
- }
-}
-
-static void
-fill_in_all (EContactEditor *editor)
-{
- fill_in_source_field (editor);
- fill_in_simple (editor);
- fill_in_email (editor);
- fill_in_phone (editor);
- fill_in_im (editor);
- fill_in_address (editor);
-}
-
-static void
-extract_all (EContactEditor *editor)
-{
- extract_simple (editor);
- extract_email (editor);
- extract_phone (editor);
- extract_im (editor);
- extract_address (editor);
-}
-
-static void
-sensitize_all (EContactEditor *editor)
-{
- sensitize_ok (editor);
- sensitize_simple (editor);
- sensitize_email (editor);
- sensitize_phone (editor);
- sensitize_im (editor);
- sensitize_address (editor);
-}
-
-static void
-init_all (EContactEditor *editor)
-{
- init_simple (editor);
- init_email (editor);
- init_phone (editor);
- init_im (editor);
- init_address (editor);
-}
-
-static void
-new_target_cb (EBook *new_book, EBookStatus status, EContactEditor *editor)
-{
- editor->load_source_id = 0;
- editor->load_book = NULL;
-
- if (status != E_BOOK_ERROR_OK || new_book == NULL) {
- GtkWidget *source_option_menu;
-
- eab_load_error_dialog (NULL, e_book_get_source (new_book), status);
-
- source_option_menu = glade_xml_get_widget (editor->gui, "source-option-menu-source");
- e_source_option_menu_select (E_SOURCE_OPTION_MENU (source_option_menu),
- e_book_get_source (editor->target_book));
-
- if (new_book)
- g_object_unref (new_book);
- return;
- }
-
- g_object_set (editor, "target_book", new_book, NULL);
- g_object_unref (new_book);
-}
-
-static void
-cancel_load (EContactEditor *editor)
-{
- if (editor->load_source_id) {
- addressbook_load_cancel (editor->load_source_id);
- editor->load_source_id = 0;
-
- g_object_unref (editor->load_book);
- editor->load_book = NULL;
- }
-}
-
-static void
-source_selected (GtkWidget *source_option_menu, ESource *source, EContactEditor *editor)
-{
- cancel_load (editor);
-
- if (e_source_equal (e_book_get_source (editor->target_book), source))
- return;
-
- if (e_source_equal (e_book_get_source (editor->source_book), source)) {
- g_object_set (editor, "target_book", editor->source_book, NULL);
- return;
- }
-
- editor->load_book = e_book_new (source, NULL);
- editor->load_source_id = addressbook_load (editor->load_book,
- (EBookCallback) new_target_cb, editor);
-}
-
-static void
-full_name_clicked (GtkWidget *button, EContactEditor *editor)
-{
- GtkDialog *dialog = GTK_DIALOG (e_contact_editor_fullname_new (editor->name));
- gboolean fullname_supported;
- int result;
-
- fullname_supported = is_field_supported (editor, E_CONTACT_FULL_NAME);
-
- g_object_set (dialog,
- "editable", fullname_supported & editor->target_editable,
- NULL);
- gtk_widget_show (GTK_WIDGET(dialog));
- result = gtk_dialog_run (dialog);
- gtk_widget_hide (GTK_WIDGET (dialog));
-
- if (fullname_supported && editor->target_editable && result == GTK_RESPONSE_OK) {
- EContactName *name;
- GtkWidget *fname_widget;
- int style = 0;
-
- g_object_get (dialog,
- "name", &name,
- NULL);
-
- style = file_as_get_style(editor);
-
- fname_widget = glade_xml_get_widget(editor->gui, "entry-fullname");
- if (fname_widget && GTK_IS_ENTRY (fname_widget)) {
- char *full_name = e_contact_name_to_string(name);
- const char *old_full_name = gtk_entry_get_text (GTK_ENTRY(fname_widget));
-
- if (strcmp (full_name, old_full_name))
- gtk_entry_set_text (GTK_ENTRY (fname_widget), full_name);
- g_free(full_name);
- }
-
- e_contact_name_free(editor->name);
- editor->name = name;
-
- file_as_set_style(editor, style);
- }
- gtk_widget_destroy (GTK_WIDGET (dialog));
-}
-
-static void
-categories_clicked (GtkWidget *button, EContactEditor *editor)
-{
- char *categories = NULL;
- GtkDialog *dialog;
- int result;
- GtkWidget *entry = glade_xml_get_widget(editor->gui, "entry-categories");
-
- if (entry && GTK_IS_ENTRY(entry))
- categories = g_strdup (gtk_entry_get_text(GTK_ENTRY(entry)));
- else if (editor->contact)
- categories = e_contact_get (editor->contact, E_CONTACT_CATEGORIES);
-
- if (!(dialog = GTK_DIALOG (e_categories_dialog_new (categories)))) {
- e_error_run (NULL, "addressbook:edit-categories", NULL);
- g_free (categories);
- return;
- }
-
- gtk_widget_show(GTK_WIDGET(dialog));
- result = gtk_dialog_run (dialog);
- g_free (categories);
- if (result == GTK_RESPONSE_OK) {
- categories = e_categories_dialog_get_categories (E_CATEGORIES_DIALOG (dialog));
- if (entry && GTK_IS_ENTRY(entry))
- gtk_entry_set_text (GTK_ENTRY (entry), categories);
- else
- e_contact_set (editor->contact, E_CONTACT_CATEGORIES, categories);
- }
- gtk_widget_destroy(GTK_WIDGET(dialog));
-}
-
-static void
-image_selected (EContactEditor *editor)
-{
- gchar *file_name;
- GtkWidget *image_chooser;
-
-#ifdef USE_GTKFILECHOOSER
- file_name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (editor->file_selector));
-#else
- file_name = (gchar *) gtk_file_selection_get_filename (GTK_FILE_SELECTION (editor->file_selector));
-#endif
-
- if (!file_name)
- return;
-
- image_chooser = glade_xml_get_widget (editor->gui, "image-chooser");
-
- g_signal_handlers_block_by_func (image_chooser, image_chooser_changed, editor);
- e_image_chooser_set_from_file (E_IMAGE_CHOOSER (image_chooser), file_name);
- g_signal_handlers_unblock_by_func (image_chooser, image_chooser_changed, editor);
-
- editor->image_set = TRUE;
- object_changed (G_OBJECT (image_chooser), editor);
-}
-
-static void
-image_cleared (EContactEditor *editor)
-{
- GtkWidget *image_chooser;
- gchar *file_name;
-
- image_chooser = glade_xml_get_widget (editor->gui, "image-chooser");
-
- file_name = e_icon_factory_get_icon_filename ("stock_person", 48);
-
- g_signal_handlers_block_by_func (image_chooser, image_chooser_changed, editor);
- e_image_chooser_set_from_file (E_IMAGE_CHOOSER (image_chooser), file_name);
- g_signal_handlers_unblock_by_func (image_chooser, image_chooser_changed, editor);
-
- g_free (file_name);
-
- editor->image_set = FALSE;
- object_changed (G_OBJECT (image_chooser), editor);
-}
-
-#ifdef USE_GTKFILECHOOSER
-
-static void
-file_chooser_response (GtkWidget *widget, gint response, EContactEditor *editor)
-{
- if (response == GTK_RESPONSE_ACCEPT)
- image_selected (editor);
- else if (response == GTK_RESPONSE_NO)
- image_cleared (editor);
-
- gtk_widget_hide (editor->file_selector);
-}
-
-#endif
-
-static gboolean
-file_selector_deleted (GtkWidget *widget)
-{
- gtk_widget_hide (widget);
- return TRUE;
-}
-
-static void
-image_clicked (GtkWidget *button, EContactEditor *editor)
-{
- GtkWidget *clear_button;
- GtkWidget *dialog;
- const gchar *title = _("Please select an image for this contact");
- const gchar *no_image = _("No image");
-
- if (!editor->file_selector) {
-#ifdef USE_GTKFILECHOOSER
- editor->file_selector = gtk_file_chooser_dialog_new (title,
- GTK_WINDOW (editor->app),
- GTK_FILE_CHOOSER_ACTION_OPEN,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
- no_image, GTK_RESPONSE_NO,
- NULL);
- gtk_dialog_set_default_response (GTK_DIALOG (editor->file_selector), GTK_RESPONSE_ACCEPT);
-
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (editor->file_selector), g_get_home_dir ());
-
- g_signal_connect (editor->file_selector, "response",
- G_CALLBACK (file_chooser_response), editor);
-#else
- /* Create the selector */
-
- editor->file_selector = gtk_file_selection_new (title);
-
- dialog = GTK_FILE_SELECTION (editor->file_selector)->fileop_dialog;
-
- clear_button = gtk_dialog_add_button (GTK_DIALOG (editor->file_selector), no_image, 0);
-
- g_signal_connect_swapped (GTK_OBJECT (GTK_FILE_SELECTION (editor->file_selector)->ok_button),
- "clicked", G_CALLBACK (image_selected), editor);
-
- g_signal_connect_swapped (clear_button,
- "clicked", G_CALLBACK (image_cleared), editor);
-
- /* Ensure that the dialog box gets hidden when the user clicks a button */
-
- g_signal_connect_swapped (GTK_OBJECT (GTK_FILE_SELECTION (editor->file_selector)->ok_button),
- "clicked", G_CALLBACK (gtk_widget_hide), editor->file_selector);
-
- g_signal_connect_swapped (GTK_OBJECT (GTK_FILE_SELECTION (editor->file_selector)->cancel_button),
- "clicked", G_CALLBACK (gtk_widget_hide), editor->file_selector);
-
- g_signal_connect_swapped (clear_button,
- "clicked", G_CALLBACK (gtk_widget_hide), editor->file_selector);
-#endif
-
- g_signal_connect_after (editor->file_selector,
- "delete-event", G_CALLBACK (file_selector_deleted),
- editor->file_selector);
- }
-
- /* Display the dialog */
-
- gtk_window_present (GTK_WINDOW (editor->file_selector));
-}
-
-typedef struct {
- EContactEditor *ce;
- gboolean should_close;
- gchar *new_id;
-} EditorCloseStruct;
-
-static void
-contact_moved_cb (EBook *book, EBookStatus status, EditorCloseStruct *ecs)
-{
- EContactEditor *ce = ecs->ce;
- gboolean should_close = ecs->should_close;
-
- gtk_widget_set_sensitive (ce->app, TRUE);
- ce->in_async_call = FALSE;
-
- e_contact_set (ce->contact, E_CONTACT_UID, ecs->new_id);
-
- eab_editor_contact_deleted (EAB_EDITOR (ce), status, ce->contact);
-
- ce->is_new_contact = FALSE;
-
- if (should_close) {
- eab_editor_close (EAB_EDITOR (ce));
- }
- else {
- ce->changed = FALSE;
-
- g_object_ref (ce->target_book);
- g_object_unref (ce->source_book);
- ce->source_book = ce->target_book;
-
- sensitize_all (ce);
- }
-
- g_object_unref (ce);
- g_free (ecs->new_id);
- g_free (ecs);
-}
-
-static void
-contact_added_cb (EBook *book, EBookStatus status, const char *id, EditorCloseStruct *ecs)
-{
- EContactEditor *ce = ecs->ce;
- gboolean should_close = ecs->should_close;
-
- if (ce->source_book != ce->target_book && e_book_is_writable (ce->source_book) &&
- status == E_BOOK_ERROR_OK && ce->is_new_contact == FALSE) {
- ecs->new_id = g_strdup (id);
- e_book_async_remove_contact (ce->source_book, ce->contact,
- (EBookCallback) contact_moved_cb, ecs);
- return;
- }
-
- gtk_widget_set_sensitive (ce->app, TRUE);
- ce->in_async_call = FALSE;
-
- e_contact_set (ce->contact, E_CONTACT_UID, (char *) id);
-
- eab_editor_contact_added (EAB_EDITOR (ce), status, ce->contact);
-
- if (status == E_BOOK_ERROR_OK) {
- ce->is_new_contact = FALSE;
-
- if (should_close) {
- eab_editor_close (EAB_EDITOR (ce));
- }
- else {
- ce->changed = FALSE;
- sensitize_all (ce);
- }
- }
-
- g_object_unref (ce);
- g_free (ecs);
-}
-
-static void
-contact_modified_cb (EBook *book, EBookStatus status, EditorCloseStruct *ecs)
-{
- EContactEditor *ce = ecs->ce;
- gboolean should_close = ecs->should_close;
-
- gtk_widget_set_sensitive (ce->app, TRUE);
- ce->in_async_call = FALSE;
-
- eab_editor_contact_modified (EAB_EDITOR (ce), status, ce->contact);
-
- if (status == E_BOOK_ERROR_OK) {
- if (should_close) {
- eab_editor_close (EAB_EDITOR (ce));
- }
- else {
- ce->changed = FALSE;
- sensitize_all (ce);
- }
- }
-
- g_object_unref (ce);
- g_free (ecs);
-}
-
-/* Emits the signal to request saving a contact */
-static void
-real_save_contact (EContactEditor *ce, gboolean should_close)
-{
- EditorCloseStruct *ecs;
-
- ecs = g_new0 (EditorCloseStruct, 1);
- ecs->ce = ce;
- g_object_ref (ecs->ce);
-
- ecs->should_close = should_close;
-
- gtk_widget_set_sensitive (ce->app, FALSE);
- ce->in_async_call = TRUE;
-
- if (ce->source_book != ce->target_book) {
- /* Two-step move; add to target, then remove from source */
- eab_merging_book_add_contact (ce->target_book, ce->contact,
- (EBookIdCallback) contact_added_cb, ecs);
- } else {
- if (ce->is_new_contact)
- eab_merging_book_add_contact (ce->target_book, ce->contact,
- (EBookIdCallback) contact_added_cb, ecs);
- else
- eab_merging_book_commit_contact (ce->target_book, ce->contact,
- (EBookCallback) contact_modified_cb, ecs);
- }
-}
-
-static void
-save_contact (EContactEditor *ce, gboolean should_close)
-{
- char *uid;
-
- if (!ce->target_book)
- return;
-
-
- if (ce->target_editable && !e_book_is_writable (ce->source_book)) {
- if (e_error_run (GTK_WINDOW (ce->app), "addressbook:prompt-move", NULL) == GTK_RESPONSE_NO)
- return;
- }
- extract_all (ce);
-
- if (!e_contact_editor_is_valid (EAB_EDITOR (ce))) {
- uid = e_contact_get (ce->contact, E_CONTACT_UID);
- g_object_unref (ce->contact);
- ce->contact = e_contact_new ();
- if (uid) {
- e_contact_set (ce->contact, E_CONTACT_UID, uid);
- g_free (uid);
- }
- return;
- }
-
- real_save_contact (ce, should_close);
-}
-
-static void
-e_contact_editor_save_contact (EABEditor *editor, gboolean should_close)
-{
- save_contact (E_CONTACT_EDITOR (editor), should_close);
-}
-
-/* Closes the dialog box and emits the appropriate signals */
-static void
-e_contact_editor_close (EABEditor *editor)
-{
- EContactEditor *ce = E_CONTACT_EDITOR (editor);
-
- if (ce->app != NULL) {
- gtk_widget_destroy (ce->app);
- ce->app = NULL;
- eab_editor_closed (editor);
- }
-}
-
-EContactField non_string_fields [] = {
- E_CONTACT_FULL_NAME,
- E_CONTACT_ADDRESS,
- E_CONTACT_ADDRESS_HOME,
- E_CONTACT_ADDRESS_WORK,
- E_CONTACT_ADDRESS_OTHER,
- E_CONTACT_EMAIL,
- E_CONTACT_IM_AIM,
- E_CONTACT_IM_GROUPWISE,
- E_CONTACT_IM_JABBER,
- E_CONTACT_IM_YAHOO,
- E_CONTACT_IM_MSN,
- E_CONTACT_IM_ICQ,
- E_CONTACT_PHOTO,
- E_CONTACT_LOGO,
- E_CONTACT_X509_CERT,
- E_CONTACT_CATEGORY_LIST,
- E_CONTACT_BIRTH_DATE,
- E_CONTACT_ANNIVERSARY
-
-
-};
-
-static gboolean
-is_non_string_field (EContactField id)
-{
- int count = sizeof (non_string_fields) / sizeof (EContactField);
- int i;
- for (i = 0; i < count; i++)
- if (id == non_string_fields[i])
- return TRUE;
- return FALSE;
-
-}
-
-
-/* insert checks here (date format, for instance, etc.) */
-static gboolean
-e_contact_editor_is_valid (EABEditor *editor)
-{
- EContactEditor *ce = E_CONTACT_EDITOR (editor);
- GtkWidget *widget;
- gboolean validation_error = FALSE;
- EIterator *iter;
- GString *errmsg = g_string_new (_("The contact data is invalid:\n\n"));
-
- widget = glade_xml_get_widget (ce->gui, "dateedit-birthday");
- if (!(e_date_edit_date_is_valid (E_DATE_EDIT (widget)))) {
- g_string_append_printf (errmsg, "'%s' has an invalid format",
- e_contact_pretty_name (E_CONTACT_BIRTH_DATE));
- validation_error = TRUE;
- }
-
- widget = glade_xml_get_widget (ce->gui, "dateedit-anniversary");
- if (!(e_date_edit_date_is_valid (E_DATE_EDIT (widget)))) {
- g_string_append_printf (errmsg, "%s'%s' has an invalid format",
- validation_error ? ",\n" : "",
- e_contact_pretty_name (E_CONTACT_ANNIVERSARY));
- validation_error = TRUE;
- }
-
- iter = e_list_get_iterator (ce->required_fields);
- for (e_iterator_last (iter);
- e_iterator_is_valid (iter);
- e_iterator_prev (iter)) {
- const char *field_name = e_iterator_get (iter);
- EContactField field_id = e_contact_field_id (field_name);
-
- if (is_non_string_field (field_id)) {
- if (e_contact_get_const (ce->contact, field_id) == NULL) {
- g_string_append_printf (errmsg, "%s'%s' is empty",
- validation_error ? ",\n" : "",
- e_contact_pretty_name (field_id));
- validation_error = TRUE;
- break;
- }
-
- } else {
-
- char *text = e_contact_get_const (ce->contact, field_id);
- if (STRING_IS_EMPTY (text)) {
- g_string_append_printf (errmsg, "%s'%s' is empty",
- validation_error ? ",\n" : "",
- e_contact_pretty_name (field_id));
- validation_error = TRUE;
- break;
- }
-
-
- }
- }
-
-
- if (validation_error) {
- g_string_append (errmsg, ".");
- e_error_run (GTK_WINDOW (ce->app), "addressbook:generic-error",
- _("Invalid contact."), errmsg->str, NULL);
- g_string_free (errmsg, TRUE);
- return FALSE;
- }
- else {
- g_string_free (errmsg, TRUE);
- return TRUE;
- }
-}
-
-static gboolean
-e_contact_editor_is_changed (EABEditor *editor)
-{
- return E_CONTACT_EDITOR (editor)->changed;
-}
-
-static GtkWindow*
-e_contact_editor_get_window (EABEditor *editor)
-{
- return GTK_WINDOW (E_CONTACT_EDITOR (editor)->app);
-}
-
-static void
-file_save_and_close_cb (GtkWidget *widget, gpointer data)
-{
- EContactEditor *ce;
-
- ce = E_CONTACT_EDITOR (data);
- save_contact (ce, TRUE);
-}
-
-static void
-file_cancel_cb (GtkWidget *widget, gpointer data)
-{
- EContactEditor *ce = E_CONTACT_EDITOR (data);
-
- eab_editor_close (EAB_EDITOR (ce));
-}
-
-/* Callback used when the dialog box is destroyed */
-static gint
-app_delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
-{
- EContactEditor *ce;
-
- ce = E_CONTACT_EDITOR (data);
-
- /* if we're saving, don't allow the dialog to close */
- if (ce->in_async_call)
- return TRUE;
-
- if (ce->changed) {
- switch (eab_prompt_save_dialog (GTK_WINDOW (ce->app))) {
- case GTK_RESPONSE_YES:
- if (!eab_editor_is_valid (EAB_EDITOR (ce)))
- return TRUE;
-
- eab_editor_save_contact (EAB_EDITOR (ce), TRUE);
- return TRUE;
-
- case GTK_RESPONSE_NO:
- break;
-
- case GTK_RESPONSE_CANCEL:
- default:
- return TRUE;
-
- }
- }
-
- eab_editor_close (EAB_EDITOR (ce));
- return TRUE;
-}
-
-static void
-show_help_cb (GtkWidget *widget, gpointer data)
-{
- GError *error = NULL;
-
- gnome_help_display_desktop (NULL,
- "evolution-" BASE_VERSION,
- "evolution-" BASE_VERSION ".xml",
- "usage-contact-cards",
- &error);
- if (error != NULL)
- g_warning ("%s", error->message);
-}
-
-static GList *
-add_to_tab_order(GList *list, GladeXML *gui, char *name)
-{
- GtkWidget *widget = glade_xml_get_widget(gui, name);
- return g_list_prepend(list, widget);
-}
-
-static void
-setup_tab_order(GladeXML *gui)
-{
- GtkWidget *container;
- GList *list = NULL;
-
- container = glade_xml_get_widget(gui, "table-contact-editor-general");
-
- if (container) {
- list = add_to_tab_order(list, gui, "entry-fullname");
- list = add_to_tab_order(list, gui, "entry-jobtitle");
- list = add_to_tab_order(list, gui, "entry-company");
- list = add_to_tab_order(list, gui, "combo-file-as");
- list = add_to_tab_order(list, gui, "entry-phone-1");
- list = add_to_tab_order(list, gui, "entry-phone-2");
- list = add_to_tab_order(list, gui, "entry-phone-3");
- list = add_to_tab_order(list, gui, "entry-phone-4");
-
- list = add_to_tab_order(list, gui, "entry-email1");
- list = add_to_tab_order(list, gui, "alignment-htmlmail");
- list = add_to_tab_order(list, gui, "entry-web");
- list = add_to_tab_order(list, gui, "entry-homepage");
- list = add_to_tab_order(list, gui, "button-fulladdr");
- list = add_to_tab_order(list, gui, "text-address");
- list = g_list_reverse(list);
- e_container_change_tab_order(GTK_CONTAINER(container), list);
- g_list_free(list);
- }
-}
-
-static void
-expand_phone_toggle (EContactEditor *ce)
-{
- GtkWidget *phone_ext_table;
-
- phone_ext_table = glade_xml_get_widget (ce->gui, "table-phone-extended");
- expand_phone (ce, GTK_WIDGET_VISIBLE (phone_ext_table) ? FALSE : TRUE);
-}
-
-static void
-e_contact_editor_init (EContactEditor *e_contact_editor)
-{
- GladeXML *gui;
- GtkWidget *widget, *label;
- char *icon_path;
-
- e_contact_editor->name = e_contact_name_new();
-
- e_contact_editor->contact = NULL;
- e_contact_editor->changed = FALSE;
- e_contact_editor->image_set = FALSE;
- e_contact_editor->in_async_call = FALSE;
- e_contact_editor->target_editable = TRUE;
-
- e_contact_editor->load_source_id = 0;
- e_contact_editor->load_book = NULL;
-
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/contact-editor.glade", NULL, NULL);
- e_contact_editor->gui = gui;
-
- setup_tab_order(gui);
-
- e_contact_editor->app = glade_xml_get_widget (gui, "contact editor");
- widget = e_contact_editor->app;
-
- gtk_widget_ensure_style (widget);
- gtk_window_set_type_hint (GTK_WINDOW (widget), GDK_WINDOW_TYPE_HINT_NORMAL);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (widget)->vbox), 0);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (widget)->action_area), 12);
-
- init_all (e_contact_editor);
-
- widget = glade_xml_get_widget (e_contact_editor->gui, "button-image");
- g_signal_connect (widget, "clicked", G_CALLBACK (image_clicked), e_contact_editor);
-
- widget = glade_xml_get_widget(e_contact_editor->gui, "button-fullname");
- g_signal_connect (widget, "clicked", G_CALLBACK (full_name_clicked), e_contact_editor);
- widget = glade_xml_get_widget(e_contact_editor->gui, "button-categories");
- g_signal_connect (widget, "clicked", G_CALLBACK (categories_clicked), e_contact_editor);
- widget = glade_xml_get_widget (e_contact_editor->gui, "source-option-menu-source");
- g_signal_connect (widget, "source_selected", G_CALLBACK (source_selected), e_contact_editor);
- label = glade_xml_get_widget (e_contact_editor->gui, "where-label");
- gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget);
- widget = glade_xml_get_widget (e_contact_editor->gui, "button-ok");
- g_signal_connect (widget, "clicked", G_CALLBACK (file_save_and_close_cb), e_contact_editor);
- widget = glade_xml_get_widget (e_contact_editor->gui, "button-cancel");
- g_signal_connect (widget, "clicked", G_CALLBACK (file_cancel_cb), e_contact_editor);
- widget = glade_xml_get_widget (e_contact_editor->gui, "button-help");
- g_signal_connect (widget, "clicked", G_CALLBACK (show_help_cb), e_contact_editor);
- widget = glade_xml_get_widget (e_contact_editor->gui, "button-phone-expand");
- g_signal_connect_swapped (widget, "clicked", G_CALLBACK (expand_phone_toggle), e_contact_editor);
-
- widget = glade_xml_get_widget (e_contact_editor->gui, "entry-fullname");
- if (widget)
- gtk_widget_grab_focus (widget);
-
- /* Connect to the deletion of the dialog */
-
- g_signal_connect (e_contact_editor->app, "delete_event",
- GTK_SIGNAL_FUNC (app_delete_event_cb), e_contact_editor);
-
- /* set the icon */
- icon_path = g_build_filename (EVOLUTION_IMAGESDIR, "evolution-contacts-mini.png", NULL);
- gnome_window_icon_set_from_file (GTK_WINDOW (e_contact_editor->app), icon_path);
- g_free (icon_path);
-
- /* show window */
- gtk_widget_show (e_contact_editor->app);
-}
-
-void
-e_contact_editor_dispose (GObject *object)
-{
- EContactEditor *e_contact_editor = E_CONTACT_EDITOR(object);
-
- if (e_contact_editor->file_selector != NULL) {
- gtk_widget_destroy (e_contact_editor->file_selector);
- e_contact_editor->file_selector = NULL;
- }
-
- if (e_contact_editor->writable_fields) {
- g_object_unref(e_contact_editor->writable_fields);
- e_contact_editor->writable_fields = NULL;
- }
- if (e_contact_editor->required_fields) {
- g_object_unref (e_contact_editor->required_fields);
- e_contact_editor->required_fields = NULL;
- }
- if (e_contact_editor->contact) {
- g_object_unref(e_contact_editor->contact);
- e_contact_editor->contact = NULL;
- }
-
- if (e_contact_editor->source_book) {
- g_object_unref(e_contact_editor->source_book);
- e_contact_editor->source_book = NULL;
- }
-
- if (e_contact_editor->target_book) {
- g_signal_handler_disconnect (e_contact_editor->target_book, e_contact_editor->target_editable_id);
- g_object_unref(e_contact_editor->target_book);
- e_contact_editor->target_book = NULL;
- }
-
- if (e_contact_editor->name) {
- e_contact_name_free(e_contact_editor->name);
- e_contact_editor->name = NULL;
- }
-
- if (e_contact_editor->gui) {
- g_object_unref(e_contact_editor->gui);
- e_contact_editor->gui = NULL;
- }
-
- cancel_load (e_contact_editor);
-
- if (G_OBJECT_CLASS (parent_class)->dispose)
- (* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-static void
-supported_fields_cb (EBook *book, EBookStatus status,
- EList *fields, EContactEditor *ce)
-{
- if (!g_slist_find ((GSList*)eab_editor_get_all_editors (), ce)) {
- g_warning ("supported_fields_cb called for book that's still around, but contact editor that's been destroyed.");
- return;
- }
-
- g_object_set (ce,
- "writable_fields", fields,
- NULL);
-
- eab_editor_show (EAB_EDITOR (ce));
-
- sensitize_all (ce);
-}
-
-static void
-required_fields_cb (EBook *book, EBookStatus status,
- EList *fields, EContactEditor *ce)
-{
-
- if (!g_slist_find ((GSList*)eab_editor_get_all_editors (), ce)) {
- g_warning ("supported_fields_cb called for book that's still around, but contact editor that's been destroyed.");
- return;
- }
-
- g_object_set (ce,
- "required_fields", fields,
- NULL);
-
-
-}
-
-
-static void
-contact_editor_destroy_notify (void *data,
- GObject *where_the_object_was)
-{
- eab_editor_remove (EAB_EDITOR (data));
-}
-
-EContactEditor *
-e_contact_editor_new (EBook *book,
- EContact *contact,
- gboolean is_new_contact,
- gboolean editable)
-{
- EContactEditor *ce;
-
- g_return_val_if_fail (E_IS_BOOK (book), NULL);
- g_return_val_if_fail (E_IS_CONTACT (contact), NULL);
-
- ce = g_object_new (E_TYPE_CONTACT_EDITOR, NULL);
-
- eab_editor_add (EAB_EDITOR (ce));
- g_object_weak_ref (G_OBJECT (ce), contact_editor_destroy_notify, ce);
-
- g_object_set (ce,
- "source_book", book,
- "contact", contact,
- "is_new_contact", is_new_contact,
- "editable", editable,
- NULL);
-
- if (book)
- e_book_async_get_supported_fields (book, (EBookEListCallback)supported_fields_cb, ce);
-
- return ce;
-}
-
-static void
-writable_changed (EBook *book, gboolean writable, EContactEditor *ce)
-{
- int new_target_editable;
- gboolean changed = FALSE;
-
- new_target_editable = e_book_is_writable (ce->target_book);
-
- if (ce->target_editable != new_target_editable)
- changed = TRUE;
-
- ce->target_editable = new_target_editable;
-
- if (changed)
- sensitize_all (ce);
-}
-
-static void
-e_contact_editor_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
- EContactEditor *editor;
-
- editor = E_CONTACT_EDITOR (object);
-
- switch (prop_id){
- case PROP_SOURCE_BOOK: {
- gboolean writable;
- gboolean changed = FALSE;
- EBook *source_book;
-
- source_book = E_BOOK (g_value_get_object (value));
-
- if (source_book == editor->source_book)
- break;
-
- if (editor->source_book)
- g_object_unref(editor->source_book);
-
- editor->source_book = source_book;
- g_object_ref (editor->source_book);
-
- if (!editor->target_book) {
- editor->target_book = editor->source_book;
- g_object_ref (editor->target_book);
-
- editor->target_editable_id = g_signal_connect (editor->target_book, "writable_status",
- G_CALLBACK (writable_changed), editor);
-
- e_book_async_get_supported_fields (editor->target_book,
- (EBookEListCallback) supported_fields_cb, editor);
- e_book_async_get_required_fields (editor->target_book,
- (EBookEListCallback) required_fields_cb, editor);
- }
-
- writable = e_book_is_writable (editor->target_book);
- if (writable != editor->target_editable) {
- editor->target_editable = writable;
- changed = TRUE;
- }
-
- if (changed)
- sensitize_all (editor);
-
- break;
- }
-
- case PROP_TARGET_BOOK: {
- gboolean writable;
- gboolean changed = FALSE;
- EBook *target_book;
-
- target_book = E_BOOK (g_value_get_object (value));
-
- if (target_book == editor->target_book)
- break;
-
- if (editor->target_book) {
- g_signal_handler_disconnect (editor->target_book, editor->target_editable_id);
- g_object_unref(editor->target_book);
- }
-
- editor->target_book = target_book;
- g_object_ref (editor->target_book);
-
- editor->target_editable_id = g_signal_connect (editor->target_book, "writable_status",
- G_CALLBACK (writable_changed), editor);
-
- e_book_async_get_supported_fields (editor->target_book,
- (EBookEListCallback) supported_fields_cb, editor);
-
- e_book_async_get_required_fields (editor->target_book,
- (EBookEListCallback) required_fields_cb, editor);
- if (!editor->is_new_contact)
- editor->changed = TRUE;
-
- writable = e_book_is_writable (editor->target_book);
-
- if (writable != editor->target_editable) {
- editor->target_editable = writable;
- changed = TRUE;
- }
-
- if (changed)
- sensitize_all (editor);
-
- /* If we're trying to load a new target book, cancel that here. */
- cancel_load (editor);
- break;
- }
-
- case PROP_CONTACT:
- if (editor->contact)
- g_object_unref(editor->contact);
- editor->contact = e_contact_duplicate(E_CONTACT(g_value_get_object (value)));
- fill_in_all (editor);
- editor->changed = FALSE;
- break;
-
- case PROP_IS_NEW_CONTACT:
- editor->is_new_contact = g_value_get_boolean (value) ? TRUE : FALSE;
- break;
-
- case PROP_EDITABLE: {
- gboolean new_value = g_value_get_boolean (value) ? TRUE : FALSE;
- gboolean changed = (editor->target_editable != new_value);
-
- editor->target_editable = new_value;
-
- if (changed)
- sensitize_all (editor);
- break;
- }
-
- case PROP_CHANGED: {
- gboolean new_value = g_value_get_boolean (value) ? TRUE : FALSE;
- gboolean changed = (editor->changed != new_value);
-
- editor->changed = new_value;
-
- if (changed)
- sensitize_ok (editor);
- break;
- }
- case PROP_WRITABLE_FIELDS:
- if (editor->writable_fields)
- g_object_unref(editor->writable_fields);
-
- editor->writable_fields = g_value_get_object (value);
- if (editor->writable_fields)
- g_object_ref (editor->writable_fields);
- else
- editor->writable_fields = e_list_new(NULL, NULL, NULL);
-
- sensitize_all (editor);
- break;
- case PROP_REQUIRED_FIELDS:
- if (editor->required_fields)
- g_object_unref (editor->required_fields);
- editor->required_fields = g_value_get_object (value);
- if (editor->required_fields)
- g_object_ref (editor->required_fields);
- else
- editor->required_fields = e_list_new (NULL, NULL, NULL);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-e_contact_editor_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
- EContactEditor *e_contact_editor;
-
- e_contact_editor = E_CONTACT_EDITOR (object);
-
- switch (prop_id) {
- case PROP_SOURCE_BOOK:
- g_value_set_object (value, e_contact_editor->source_book);
- break;
-
- case PROP_TARGET_BOOK:
- g_value_set_object (value, e_contact_editor->target_book);
- break;
-
- case PROP_CONTACT:
- extract_all (e_contact_editor);
- g_value_set_object (value, e_contact_editor->contact);
- break;
-
- case PROP_IS_NEW_CONTACT:
- g_value_set_boolean (value, e_contact_editor->is_new_contact ? TRUE : FALSE);
- break;
-
- case PROP_EDITABLE:
- g_value_set_boolean (value, e_contact_editor->target_editable ? TRUE : FALSE);
- break;
-
- case PROP_CHANGED:
- g_value_set_boolean (value, e_contact_editor->changed ? TRUE : FALSE);
- break;
-
- case PROP_WRITABLE_FIELDS:
- if (e_contact_editor->writable_fields)
- g_value_set_object (value, e_list_duplicate (e_contact_editor->writable_fields));
- else
- g_value_set_object (value, NULL);
- break;
- case PROP_REQUIRED_FIELDS:
- if (e_contact_editor->required_fields)
- g_value_set_object (value, e_list_duplicate (e_contact_editor->required_fields));
- else
- g_value_set_object (value, NULL);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-/**
- * e_contact_editor_raise:
- * @config: The %EContactEditor object.
- *
- * Raises the dialog associated with this %EContactEditor object.
- */
-static void
-e_contact_editor_raise (EABEditor *editor)
-{
- EContactEditor *ce = E_CONTACT_EDITOR (editor);
-
- if (GTK_WIDGET (ce->app)->window)
- gdk_window_raise (GTK_WIDGET (ce->app)->window);
-}
-
-/**
- * e_contact_editor_show:
- * @ce: The %EContactEditor object.
- *
- * Shows the dialog associated with this %EContactEditor object.
- */
-static void
-e_contact_editor_show (EABEditor *editor)
-{
- EContactEditor *ce = E_CONTACT_EDITOR (editor);
- gtk_widget_show (ce->app);
-}
-
-GtkWidget *
-e_contact_editor_create_date(gchar *name,
- gchar *string1, gchar *string2,
- gint int1, gint int2);
-
-GtkWidget *
-e_contact_editor_create_date(gchar *name,
- gchar *string1, gchar *string2,
- gint int1, gint int2)
-{
- GtkWidget *widget = e_date_edit_new ();
- AtkObject *a11y;
-
- e_date_edit_set_allow_no_date_set (E_DATE_EDIT (widget),
- TRUE);
- e_date_edit_set_show_time (E_DATE_EDIT (widget), FALSE);
- e_date_edit_set_time (E_DATE_EDIT (widget), -1);
-
- a11y = gtk_widget_get_accessible (e_date_edit_get_entry (E_DATE_EDIT(widget)));
- if (a11y != NULL) {
- atk_object_set_name (a11y, string1);
- }
-
- gtk_widget_show (widget);
- return widget;
-}
-
-GtkWidget *
-e_contact_editor_create_web(gchar *name,
- gchar *string1, gchar *string2,
- gint int1, gint int2);
-
-GtkWidget *
-e_contact_editor_create_web(gchar *name,
- gchar *string1, gchar *string2,
- gint int1, gint int2)
-{
- GtkWidget *widget = e_url_entry_new ();
- AtkObject *a11y = gtk_widget_get_accessible (e_url_entry_get_entry (widget));
-
- if (a11y != NULL) {
- atk_object_set_name (a11y, string1);
- }
-
- gtk_widget_show (widget);
- return widget;
-}
-
-GtkWidget *
-e_contact_editor_create_source_option_menu (gchar *name,
- gchar *string1, gchar *string2,
- gint int1, gint int2);
-
-GtkWidget *
-e_contact_editor_create_source_option_menu (gchar *name,
- gchar *string1, gchar *string2,
- gint int1, gint int2)
-{
- GtkWidget *menu;
- GConfClient *gconf_client;
- ESourceList *source_list;
-
- gconf_client = gconf_client_get_default ();
- source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/addressbook/sources");
-
- menu = e_source_option_menu_new (source_list);
- g_object_unref (source_list);
-
- gtk_widget_show (menu);
- return menu;
-}
diff --git a/addressbook/gui/contact-editor/e-contact-editor.h b/addressbook/gui/contact-editor/e-contact-editor.h
deleted file mode 100644
index b27790d32a..0000000000
--- a/addressbook/gui/contact-editor/e-contact-editor.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-editor.h
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-#ifndef __E_CONTACT_EDITOR_H__
-#define __E_CONTACT_EDITOR_H__
-
-#include <libgnomeui/gnome-app.h>
-#include <libgnomeui/gnome-app-helper.h>
-#include <bonobo/bonobo-ui-component.h>
-#include <glade/glade.h>
-
-#include "addressbook/gui/contact-editor/eab-editor.h"
-
-#include <libebook/e-book.h>
-#include <libebook/e-contact.h>
-
-#include <gtk/gtktreeview.h>
-#include <gtk/gtkliststore.h>
-
-G_BEGIN_DECLS
-
-/* EContactEditor - A dialog displaying information about a contact.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- * card ECard * RW The card currently being edited
- */
-
-#define E_TYPE_CONTACT_EDITOR (e_contact_editor_get_type ())
-#define E_CONTACT_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CONTACT_EDITOR, EContactEditor))
-#define E_CONTACT_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CONTACT_EDITOR, EContactEditorClass))
-#define E_IS_CONTACT_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CONTACT_EDITOR))
-#define E_IS_CONTACT_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_CONTACT_EDITOR))
-
-
-typedef struct _EContactEditor EContactEditor;
-typedef struct _EContactEditorClass EContactEditorClass;
-
-struct _EContactEditor
-{
- EABEditor object;
-
- /* item specific fields */
- EBook *source_book;
- EBook *target_book;
- EContact *contact;
-
- /* UI handler */
- BonoboUIComponent *uic;
-
- GladeXML *gui;
- GtkWidget *app;
-
- GtkWidget *file_selector;
-
- EContactName *name;
-
- /* Whether we are editing a new contact or an existing one */
- guint is_new_contact : 1;
-
- /* Whether the image chooser widget has been changed. */
- guint image_set : 1;
-
- /* Whether the contact has been changed since bringing up the contact editor */
- guint changed : 1;
-
- /* Whether the contact editor will accept modifications, save */
- guint target_editable : 1;
-
- /* Whether an async wombat call is in progress */
- guint in_async_call : 1;
-
- EList *writable_fields;
-
- EList *required_fields;
-
- /* ID for async load_source call */
- guint load_source_id;
- EBook *load_book;
-
- /* signal ids for "writable_status" */
- int target_editable_id;
-};
-
-struct _EContactEditorClass
-{
- EABEditorClass parent_class;
-};
-
-EContactEditor *e_contact_editor_new (EBook *book,
- EContact *contact,
- gboolean is_new_contact,
- gboolean editable);
-GType e_contact_editor_get_type (void);
-
-G_END_DECLS
-
-#endif /* __E_CONTACT_EDITOR_H__ */
diff --git a/addressbook/gui/contact-editor/e-contact-quick-add.c b/addressbook/gui/contact-editor/e-contact-quick-add.c
deleted file mode 100644
index d3765314ba..0000000000
--- a/addressbook/gui/contact-editor/e-contact-quick-add.c
+++ /dev/null
@@ -1,457 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * e-contact-quick-add.c
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Developed by Jon Trowbridge <trow@ximian.com>
- */
-
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA.
- */
-
-#include <config.h>
-#include <ctype.h>
-#include <string.h>
-#include <glib.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtktable.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtkstock.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/gnome-app.h>
-#include <libebook/e-book.h>
-#include <libebook/e-contact.h>
-#include <addressbook/gui/component/addressbook.h>
-#include <addressbook/util/eab-book-util.h>
-#include "e-contact-editor.h"
-#include "e-contact-quick-add.h"
-#include "eab-contact-merging.h"
-
-typedef struct _QuickAdd QuickAdd;
-struct _QuickAdd {
- gchar *name;
- gchar *email;
- EContact *contact;
-
- EContactQuickAddCallback cb;
- gpointer closure;
-
- GtkWidget *name_entry;
- GtkWidget *email_entry;
-
- gint refs;
-
-};
-
-static QuickAdd *
-quick_add_new (void)
-{
- QuickAdd *qa = g_new0 (QuickAdd, 1);
- qa->contact = e_contact_new ();
- qa->refs = 1;
- return qa;
-}
-
-static void
-quick_add_ref (QuickAdd *qa)
-{
- if (qa) {
- ++qa->refs;
- }
-}
-
-static void
-quick_add_unref (QuickAdd *qa)
-{
- if (qa) {
- --qa->refs;
- if (qa->refs == 0) {
- g_free (qa->name);
- g_free (qa->email);
- g_object_unref (qa->contact);
- g_free (qa);
- }
- }
-}
-
-static void
-quick_add_set_name (QuickAdd *qa, const gchar *name)
-{
- if (name == qa->name)
- return;
-
- g_free (qa->name);
- qa->name = g_strdup (name);
-}
-
-static void
-quick_add_set_email (QuickAdd *qa, const gchar *email)
-{
- if (email == qa->email)
- return;
-
- g_free (qa->email);
- qa->email = g_strdup (email);
-}
-
-static void
-merge_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- QuickAdd *qa = (QuickAdd *) closure;
-
- if (status == E_BOOK_ERROR_OK) {
- eab_merging_book_add_contact (book, qa->contact, NULL, NULL);
- if (qa->cb)
- qa->cb (qa->contact, qa->closure);
- g_object_unref (book);
- } else {
- /* Something went wrong. */
- if (book)
- g_object_unref (book);
- if (qa->cb)
- qa->cb (NULL, qa->closure);
- }
-
- quick_add_unref (qa);
-}
-
-static void
-quick_add_merge_contact (QuickAdd *qa)
-{
- quick_add_ref (qa);
-
- addressbook_load_default_book (merge_cb, qa);
-}
-
-
-/*
- * Raise a contact editor with all fields editable, and hook up all signals accordingly.
- */
-
-static void
-contact_added_cb (EContactEditor *ce, EBookStatus status, EContact *contact, gpointer closure)
-{
- QuickAdd *qa = (QuickAdd *) g_object_get_data (G_OBJECT (ce), "quick_add");
-
- if (qa) {
-
- if (qa->cb)
- qa->cb (qa->contact, qa->closure);
-
- /* We don't need to unref qa because we set_data_full below */
- g_object_set_data (G_OBJECT (ce), "quick_add", NULL);
- }
-}
-
-static void
-editor_closed_cb (GtkWidget *w, gpointer closure)
-{
- QuickAdd *qa = (QuickAdd *) g_object_get_data (G_OBJECT (w), "quick_add");
-
- if (qa)
- /* We don't need to unref qa because we set_data_full below */
- g_object_set_data (G_OBJECT (w), "quick_add", NULL);
-
- g_object_unref (w);
-}
-
-static void
-ce_have_book (EBook *book, EBookStatus status, gpointer closure)
-{
- QuickAdd *qa = (QuickAdd *) closure;
-
- if (status != E_BOOK_ERROR_OK) {
- if (book)
- g_object_unref (book);
- g_warning ("Couldn't open local address book.");
- quick_add_unref (qa);
- } else {
- EContactEditor *contact_editor = e_contact_editor_new (book, qa->contact, TRUE, TRUE /* XXX */);
-
- /* mark it as changed so the Save buttons are enabled when we bring up the dialog. */
- g_object_set (contact_editor,
- "changed", TRUE,
- NULL);
-
- /* We pass this via object data, so that we don't get a dangling pointer referenced if both
- the "contact_added" and "editor_closed" get emitted. (Which, based on a backtrace in bugzilla,
- I think can happen and cause a crash. */
- g_object_set_data_full (G_OBJECT (contact_editor), "quick_add", qa,
- (GDestroyNotify) quick_add_unref);
-
- g_signal_connect (contact_editor,
- "contact_added",
- G_CALLBACK (contact_added_cb),
- NULL);
- g_signal_connect (contact_editor,
- "editor_closed",
- G_CALLBACK (editor_closed_cb),
- NULL);
-
- g_object_unref (book);
- }
-}
-
-static void
-edit_contact (QuickAdd *qa)
-{
- addressbook_load_default_book (ce_have_book, qa);
-}
-
-#define QUICK_ADD_RESPONSE_EDIT_FULL 2
-
-static void
-clicked_cb (GtkWidget *w, gint button, gpointer closure)
-{
- QuickAdd *qa = (QuickAdd *) closure;
-
- /* Get data out of entries. */
- if (button == GTK_RESPONSE_OK || button == QUICK_ADD_RESPONSE_EDIT_FULL) {
- gchar *name = NULL;
- gchar *email = NULL;
-
- if (qa->name_entry) {
- gchar *tmp;
- tmp = gtk_editable_get_chars (GTK_EDITABLE (qa->name_entry), 0, -1);
- name = tmp;
- }
-
- if (qa->email_entry) {
- gchar *tmp;
- tmp = gtk_editable_get_chars (GTK_EDITABLE (qa->email_entry), 0, -1);
- email = tmp;
- }
-
- e_contact_set (qa->contact, E_CONTACT_FULL_NAME, (char *) name ? name : "");
- e_contact_set (qa->contact, E_CONTACT_EMAIL_1, (char *) email ? email : "");
-
- g_free (name);
- g_free (email);
- }
-
- gtk_widget_destroy (w);
-
- if (button == GTK_RESPONSE_OK) {
-
- /* OK */
- quick_add_merge_contact (qa);
-
- } else if (button == QUICK_ADD_RESPONSE_EDIT_FULL) {
-
- /* EDIT FULL */
- edit_contact (qa);
-
- } else {
- /* CANCEL */
- quick_add_unref (qa);
- }
-
-}
-
-static GtkWidget *
-build_quick_add_dialog (QuickAdd *qa)
-{
- GtkWidget *dialog;
- GtkWidget *label;
- GtkTable *table;
- const gint xpad=0, ypad=0;
-
- g_return_val_if_fail (qa != NULL, NULL);
-
- dialog = gtk_dialog_new_with_buttons (_("Contact Quick-Add"),
- NULL, /* XXX */
- GTK_DIALOG_NO_SEPARATOR,
- _("_Edit Full"), QUICK_ADD_RESPONSE_EDIT_FULL,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- NULL);
-
- gtk_widget_ensure_style (dialog);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox),
- 0);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area),
- 12);
-
- g_signal_connect (dialog, "response", G_CALLBACK (clicked_cb), qa);
-
- qa->name_entry = gtk_entry_new ();
- if (qa->name)
- gtk_entry_set_text (GTK_ENTRY (qa->name_entry), qa->name);
-
-
- qa->email_entry = gtk_entry_new ();
- if (qa->email)
- gtk_entry_set_text (GTK_ENTRY (qa->email_entry), qa->email);
-
- table = GTK_TABLE (gtk_table_new (2, 2, FALSE));
- gtk_table_set_row_spacings (table, 6);
- gtk_table_set_col_spacings (table, 12);
-
- label = gtk_label_new_with_mnemonic (_("_Full name:"));
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-
- gtk_table_attach (table, label,
- 0, 1, 0, 1,
- GTK_FILL, 0, xpad, ypad);
- gtk_table_attach (table, qa->name_entry,
- 1, 2, 0, 1,
- GTK_EXPAND | GTK_FILL, 0, xpad, ypad);
-
- label = gtk_label_new_with_mnemonic (_("E-_mail:"));
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-
- gtk_table_attach (table, label,
- 0, 1, 1, 2,
- GTK_FILL, 0, xpad, ypad);
- gtk_table_attach (table, qa->email_entry,
- 1, 2, 1, 2,
- GTK_EXPAND | GTK_FILL, 0, xpad, ypad);
-
- gtk_container_set_border_width (GTK_CONTAINER (table),
- 12);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
- GTK_WIDGET (table),
- FALSE, FALSE, 0);
- gtk_widget_show_all (GTK_WIDGET (table));
-
-
- return dialog;
-}
-
-void
-e_contact_quick_add (const gchar *in_name, const gchar *email,
- EContactQuickAddCallback cb, gpointer closure)
-{
- QuickAdd *qa;
- GtkWidget *dialog;
- gchar *name = NULL;
- gint len;
-
- /* We need to have *something* to work with. */
- if (in_name == NULL && email == NULL) {
- if (cb)
- cb (NULL, closure);
- return;
- }
-
- if (in_name) {
- name = g_strdup (in_name);
-
- /* Remove extra whitespace and the quotes some mailers put around names. */
- g_strstrip (name);
- len = strlen (name);
- if ((name[0] == '\'' && name[len-1] == '\'') || (name[0] == '"' && name[len-1] == '"')) {
- name[0] = ' ';
- name[len-1] = ' ';
- }
- g_strstrip (name);
- }
-
- qa = quick_add_new ();
- qa->cb = cb;
- qa->closure = closure;
- if (name)
- quick_add_set_name (qa, name);
- if (email)
- quick_add_set_email (qa, email);
-
- dialog = build_quick_add_dialog (qa);
- gtk_widget_show_all (dialog);
-
- g_free (name);
-}
-
-void
-e_contact_quick_add_free_form (const gchar *text, EContactQuickAddCallback cb, gpointer closure)
-{
- gchar *name=NULL, *email=NULL;
- const gchar *last_at, *s;
- gboolean in_quote;
-
- if (text == NULL) {
- e_contact_quick_add (NULL, NULL, cb, closure);
- return;
- }
-
- /* Look for things that look like e-mail addresses embedded in text */
- in_quote = FALSE;
- last_at = NULL;
- for (s = text; *s; ++s) {
- if (*s == '@' && !in_quote)
- last_at = s;
- else if (*s == '"')
- in_quote = !in_quote;
- }
-
-
- if (last_at == NULL) {
- /* No at sign, so we treat it all as the name */
- name = g_strdup (text);
- } else {
- gboolean bad_char = FALSE;
-
- /* walk backwards to whitespace or a < or a quote... */
- while (last_at >= text && !bad_char
- && !(isspace ((gint) *last_at) || *last_at == '<' || *last_at == '"')) {
- /* Check for some stuff that can't appear in a legal e-mail address. */
- if (*last_at == '['
- || *last_at == ']'
- || *last_at == '('
- || *last_at == ')')
- bad_char = TRUE;
- --last_at;
- }
- if (last_at < text)
- last_at = text;
-
- /* ...and then split the text there */
- if (!bad_char) {
- if (text < last_at)
- name = g_strndup (text, last_at-text);
- email = g_strdup (last_at);
- }
- }
-
- /* If all else has failed, make it the name. */
- if (name == NULL && email == NULL)
- name = g_strdup (text);
-
-
-
- /* Clean up email, remove bracketing <>s */
- if (email && *email) {
- gboolean changed = FALSE;
- g_strstrip (email);
- if (*email == '<') {
- *email = ' ';
- changed = TRUE;
- }
- if (email[strlen (email)-1] == '>') {
- email[strlen (email)-1] = ' ';
- changed = TRUE;
- }
- if (changed)
- g_strstrip (email);
- }
-
-
- e_contact_quick_add (name, email, cb, closure);
- g_free (name);
- g_free (email);
-}
diff --git a/addressbook/gui/contact-editor/e-contact-quick-add.h b/addressbook/gui/contact-editor/e-contact-quick-add.h
deleted file mode 100644
index a969211915..0000000000
--- a/addressbook/gui/contact-editor/e-contact-quick-add.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * e-contact-quick-add.h
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Developed by Jon Trowbridge <trow@ximian.com>
- */
-
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA.
- */
-
-#ifndef __E_CONTACT_QUICK_ADD_H__
-#define __E_CONTACT_QUICK_ADD_H__
-
-#include <libebook/e-contact.h>
-
-typedef void (*EContactQuickAddCallback) (EContact *new_contact, gpointer closure);
-
-void e_contact_quick_add (const gchar *name, const gchar *email,
- EContactQuickAddCallback cb, gpointer closure);
-
-void e_contact_quick_add_free_form (const gchar *text, EContactQuickAddCallback cb, gpointer closure);
-
-#endif /* __E_CONTACT_QUICK_ADD_H__ */
-
diff --git a/addressbook/gui/contact-editor/eab-editor.c b/addressbook/gui/contact-editor/eab-editor.c
deleted file mode 100644
index 4f535e47c8..0000000000
--- a/addressbook/gui/contact-editor/eab-editor.c
+++ /dev/null
@@ -1,390 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* eab-editor.c
- * Copyright (C) 2004 Novell, Inc.
- * Author: Chris Toshok <toshok@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkstock.h>
-#include <gtk/gtkmessagedialog.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "eab-editor.h"
-#include "addressbook/gui/widgets/eab-gui-util.h"
-#include "e-contact-editor-marshal.h"
-
-static void eab_editor_default_show (EABEditor *editor);
-static void eab_editor_default_raise (EABEditor *editor);
-static void eab_editor_default_close (EABEditor *editor);
-static void eab_editor_class_init (EABEditorClass *klass);
-static void eab_editor_init (EABEditor *editor);
-
-/* Signal IDs */
-enum {
- CONTACT_ADDED,
- CONTACT_MODIFIED,
- CONTACT_DELETED,
- EDITOR_CLOSED,
- LAST_SIGNAL
-};
-
-static GSList *all_editors = NULL;
-
-static GtkObjectClass *parent_class = NULL;
-
-static guint editor_signals[LAST_SIGNAL];
-
-GType
-eab_editor_get_type (void)
-{
- static GType editor_type = 0;
-
- if (!editor_type) {
- static const GTypeInfo editor_info = {
- sizeof (EABEditorClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) eab_editor_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EABEditor),
- 0, /* n_preallocs */
- (GInstanceInitFunc) eab_editor_init,
- };
-
- editor_type = g_type_register_static (G_TYPE_OBJECT, "EABEditor", &editor_info, 0);
- }
-
- return editor_type;
-}
-
-static void
-eab_editor_default_show (EABEditor *editor)
-{
- g_warning ("abstract eab_editor_show called");
-}
-
-static void
-eab_editor_default_close (EABEditor *editor)
-{
- g_warning ("abstract eab_editor_close called");
-}
-
-static void
-eab_editor_default_raise (EABEditor *editor)
-{
- g_warning ("abstract eab_editor_raise called");
-}
-
-static void
-eab_editor_default_save_contact (EABEditor *editor, gboolean should_close)
-{
- g_warning ("abstract eab_editor_save_contact called");
-}
-
-static gboolean
-eab_editor_default_is_valid (EABEditor *editor)
-{
- g_warning ("abstract eab_editor_is_valid called");
- return FALSE;
-}
-
-static gboolean
-eab_editor_default_is_changed (EABEditor *editor)
-{
- g_warning ("abstract eab_editor_is_changed called");
- return FALSE;
-}
-
-static GtkWindow*
-eab_editor_default_get_window (EABEditor *editor)
-{
- g_warning ("abstract eab_editor_get_window called");
- return NULL;
-}
-
-static void
-eab_editor_class_init (EABEditorClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_ref (G_TYPE_OBJECT);
-
- klass->show = eab_editor_default_show;
- klass->close = eab_editor_default_close;
- klass->raise = eab_editor_default_raise;
- klass->save_contact = eab_editor_default_save_contact;
- klass->is_valid = eab_editor_default_is_valid;
- klass->is_changed = eab_editor_default_is_changed;
- klass->get_window = eab_editor_default_get_window;
-
- editor_signals[CONTACT_ADDED] =
- g_signal_new ("contact_added",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EABEditorClass, contact_added),
- NULL, NULL,
- e_contact_editor_marshal_NONE__INT_OBJECT,
- G_TYPE_NONE, 2,
- G_TYPE_INT, G_TYPE_OBJECT);
-
- editor_signals[CONTACT_MODIFIED] =
- g_signal_new ("contact_modified",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EABEditorClass, contact_modified),
- NULL, NULL,
- e_contact_editor_marshal_NONE__INT_OBJECT,
- G_TYPE_NONE, 2,
- G_TYPE_INT, G_TYPE_OBJECT);
-
- editor_signals[CONTACT_DELETED] =
- g_signal_new ("contact_deleted",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EABEditorClass, contact_deleted),
- NULL, NULL,
- e_contact_editor_marshal_NONE__INT_OBJECT,
- G_TYPE_NONE, 2,
- G_TYPE_INT, G_TYPE_OBJECT);
-
- editor_signals[EDITOR_CLOSED] =
- g_signal_new ("editor_closed",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EABEditorClass, editor_closed),
- NULL, NULL,
- e_contact_editor_marshal_NONE__NONE,
- G_TYPE_NONE, 0);
-}
-
-static void
-eab_editor_init (EABEditor *editor)
-{
-}
-
-
-
-void
-eab_editor_show (EABEditor *editor)
-{
- g_return_if_fail (EAB_IS_EDITOR (editor));
-
- if (EAB_EDITOR_GET_CLASS(editor)->show)
- EAB_EDITOR_GET_CLASS(editor)->show (editor);
-}
-
-void
-eab_editor_close (EABEditor *editor)
-{
- g_return_if_fail (EAB_IS_EDITOR (editor));
-
- if (EAB_EDITOR_GET_CLASS(editor)->close)
- EAB_EDITOR_GET_CLASS(editor)->close (editor);
-}
-
-void
-eab_editor_raise (EABEditor *editor)
-{
- g_return_if_fail (EAB_IS_EDITOR (editor));
-
- if (EAB_EDITOR_GET_CLASS(editor)->raise)
- EAB_EDITOR_GET_CLASS(editor)->raise (editor);
-}
-
-void
-eab_editor_save_contact (EABEditor *editor, gboolean should_close)
-{
- g_return_if_fail (EAB_IS_EDITOR (editor));
-
- if (EAB_EDITOR_GET_CLASS(editor)->save_contact)
- EAB_EDITOR_GET_CLASS(editor)->save_contact (editor, should_close);
-}
-
-gboolean
-eab_editor_is_changed (EABEditor *editor)
-{
- g_return_val_if_fail (EAB_IS_EDITOR (editor), FALSE);
-
- if (EAB_EDITOR_GET_CLASS(editor)->is_changed)
- return EAB_EDITOR_GET_CLASS(editor)->is_changed (editor);
- else
- return FALSE;
-}
-
-gboolean
-eab_editor_is_valid (EABEditor *editor)
-{
- g_return_val_if_fail (EAB_IS_EDITOR (editor), FALSE);
-
- if (EAB_EDITOR_GET_CLASS(editor)->is_valid)
- return EAB_EDITOR_GET_CLASS(editor)->is_valid (editor);
- else
- return FALSE;
-}
-
-GtkWindow*
-eab_editor_get_window (EABEditor *editor)
-{
- g_return_val_if_fail (EAB_IS_EDITOR (editor), NULL);
-
- if (EAB_EDITOR_GET_CLASS(editor)->get_window)
- return EAB_EDITOR_GET_CLASS(editor)->get_window (editor);
- else
- return NULL;
-}
-
-gboolean
-eab_editor_prompt_to_save_changes (EABEditor *editor, GtkWindow *window)
-{
- if (!eab_editor_is_changed (editor))
- return TRUE;
-
- switch (eab_prompt_save_dialog (window)) {
- case GTK_RESPONSE_YES:
- if (!eab_editor_is_valid (editor)) {
- return FALSE;
- }
- eab_editor_save_contact (editor, FALSE);
- return TRUE;
- case GTK_RESPONSE_NO:
- return TRUE;
- case GTK_RESPONSE_CANCEL:
- default:
- return FALSE;
- }
-}
-
-gboolean
-eab_editor_request_close_all (void)
-{
- GSList *p;
- GSList *pnext;
- gboolean retval;
-
- retval = TRUE;
- for (p = all_editors; p != NULL; p = pnext) {
- EABEditor *editor = EAB_EDITOR (p->data);
- GtkWindow *window = eab_editor_get_window (editor);
-
- pnext = p->next;
-
- eab_editor_raise (editor);
- if (! eab_editor_prompt_to_save_changes (editor, window)) {
- retval = FALSE;
- break;
- }
- eab_editor_close (editor);
- }
-
- return retval;
-}
-
-const GSList*
-eab_editor_get_all_editors (void)
-{
- return all_editors;
-}
-
-gboolean
-eab_editor_confirm_delete (GtkWindow *parent)
-{
- GtkWidget *dialog;
- gint result;
-
- dialog = gtk_message_dialog_new (parent,
- 0,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
-#if notyet
- /* XXX we really need to handle the plural case here.. */
- (plural
- ? _("Are you sure you want\n"
- "to delete these contacts?"))
-#endif
- _("Are you sure you want\n"
- "to delete this contact?"));
-
- gtk_dialog_add_buttons (GTK_DIALOG (dialog),
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_DELETE, GTK_RESPONSE_ACCEPT,
- NULL);
-
- result = gtk_dialog_run(GTK_DIALOG (dialog));
-
- gtk_widget_destroy (dialog);
-
- return (result == GTK_RESPONSE_ACCEPT);
-}
-
-
-void
-eab_editor_contact_added (EABEditor *editor, EBookStatus status, EContact *contact)
-{
- g_return_if_fail (EAB_IS_EDITOR (editor));
- g_return_if_fail (E_IS_CONTACT (contact));
-
- g_signal_emit (editor, editor_signals[CONTACT_ADDED], 0,
- status, contact);
-}
-
-void
-eab_editor_contact_modified (EABEditor *editor, EBookStatus status, EContact *contact)
-{
- g_return_if_fail (EAB_IS_EDITOR (editor));
- g_return_if_fail (E_IS_CONTACT (contact));
-
- g_signal_emit (editor, editor_signals[CONTACT_MODIFIED], 0,
- status, contact);
-}
-
-void
-eab_editor_contact_deleted (EABEditor *editor, EBookStatus status, EContact *contact)
-{
- g_return_if_fail (EAB_IS_EDITOR (editor));
- g_return_if_fail (E_IS_CONTACT (contact));
-
- g_signal_emit (editor, editor_signals[CONTACT_DELETED], 0,
- status, contact);
-}
-
-void
-eab_editor_closed (EABEditor *editor)
-{
- g_return_if_fail (EAB_IS_EDITOR (editor));
-
- g_signal_emit (editor, editor_signals[EDITOR_CLOSED], 0);
-}
-
-void
-eab_editor_add (EABEditor *editor)
-{
- g_return_if_fail (EAB_IS_EDITOR (editor));
-
- all_editors = g_slist_prepend (all_editors, editor);
-}
-
-void
-eab_editor_remove (EABEditor *editor)
-{
- g_return_if_fail (EAB_IS_EDITOR (editor));
-
- all_editors = g_slist_remove (all_editors, editor);
-}
diff --git a/addressbook/gui/contact-editor/eab-editor.h b/addressbook/gui/contact-editor/eab-editor.h
deleted file mode 100644
index 6c1afccf21..0000000000
--- a/addressbook/gui/contact-editor/eab-editor.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* eab-editor.h
- * Copyright (C) 2004 Novell, Inc.
- * Author: Chris Toshok <toshok@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-#ifndef __EAB_EDITOR_H__
-#define __EAB_EDITOR_H__
-
-#include <libgnomeui/gnome-app.h>
-#include <libgnomeui/gnome-app-helper.h>
-#include <bonobo/bonobo-ui-component.h>
-#include <glade/glade.h>
-
-#include <libebook/e-book.h>
-#include <libebook/e-contact.h>
-
-#include <gtk/gtktreeview.h>
-#include <gtk/gtkliststore.h>
-
-G_BEGIN_DECLS
-
-/* EABEditor - A dialog displaying information about a contact.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- * card ECard * RW The card currently being edited
- */
-
-#define EAB_TYPE_EDITOR (eab_editor_get_type ())
-#define EAB_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EAB_TYPE_EDITOR, EABEditor))
-#define EAB_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EAB_TYPE_EDITOR, EABEditorClass))
-#define EAB_IS_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EAB_TYPE_EDITOR))
-#define EAB_IS_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EAB_TYPE_EDITOR))
-#define EAB_EDITOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EAB_EDITOR_TYPE, EABEditorClass))
-
-
-typedef struct _EABEditor EABEditor;
-typedef struct _EABEditorClass EABEditorClass;
-
-struct _EABEditor
-{
- GObject parent;
-};
-
-struct _EABEditorClass
-{
- GObjectClass parent_class;
-
- /* virtual functions */
- void (* show) (EABEditor *editor);
- void (* close) (EABEditor *editor);
- void (* raise) (EABEditor *editor);
- void (* save_contact) (EABEditor *editor, gboolean should_close);
- gboolean (* is_valid) (EABEditor *editor);
- gboolean (* is_changed) (EABEditor *editor);
- GtkWindow* (* get_window) (EABEditor *editor);
-
- /* signals */
- void (* contact_added) (EABEditor *editor, EBookStatus status, EContact *contact);
- void (* contact_modified) (EABEditor *editor, EBookStatus status, EContact *contact);
- void (* contact_deleted) (EABEditor *editor, EBookStatus status, EContact *contact);
- void (* editor_closed) (EABEditor *editor);
-};
-
-GType eab_editor_get_type (void);
-
-/* virtual functions */
-void eab_editor_show (EABEditor *editor);
-void eab_editor_close (EABEditor *editor);
-void eab_editor_raise (EABEditor *editor);
-void eab_editor_save_contact (EABEditor *editor, gboolean should_close);
-gboolean eab_editor_is_valid (EABEditor *editor);
-gboolean eab_editor_is_changed (EABEditor *editor);
-GtkWindow* eab_editor_get_window (EABEditor *editor);
-
-gboolean eab_editor_prompt_to_save_changes (EABEditor *editor, GtkWindow *window);
-gboolean eab_editor_confirm_delete (GtkWindow *parent);
-
-/* these four generate EABEditor signals */
-void eab_editor_contact_added (EABEditor *editor, EBookStatus status, EContact *contact);
-void eab_editor_contact_modified (EABEditor *editor, EBookStatus status, EContact *contact);
-void eab_editor_contact_deleted (EABEditor *editor, EBookStatus status, EContact *contact);
-void eab_editor_closed (EABEditor *editor);
-
-/* these maintain the global list of editors so we can prompt the user
- if there are unsaved changes when they exit. */
-void eab_editor_add (EABEditor *editor);
-void eab_editor_remove (EABEditor *editor);
-gboolean eab_editor_request_close_all (void);
-const GSList* eab_editor_get_all_editors (void);
-
-G_END_DECLS
-
-#endif /* __E_CONTACT_EDITOR_H__ */
diff --git a/addressbook/gui/contact-editor/fulladdr.glade b/addressbook/gui/contact-editor/fulladdr.glade
deleted file mode 100644
index c7767b9751..0000000000
--- a/addressbook/gui/contact-editor/fulladdr.glade
+++ /dev/null
@@ -1,446 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkDialog" id="dialog-checkaddress">
- <property name="title" translatable="yes">Full Address</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">True</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="has_separator">True</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="vbox-container">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">8</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="hbuttonbox1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="button1">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="has_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">0</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="button2">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">0</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table-checkaddress">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="n_rows">4</property>
- <property name="n_columns">4</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label-street">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Address:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-street</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-city">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Ci_ty:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-city</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-city">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-ext">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-po">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_PO Box:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-po</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-ext">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Address _2:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-ext</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-po">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-street">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="has_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">4</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-region">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_State/Province:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-region</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-region">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCombo" id="combo-country">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="value_in_list">False</property>
- <property name="allow_empty">True</property>
- <property name="case_sensitive">False</property>
- <property name="enable_arrow_keys">True</property>
- <property name="enable_arrows_always">False</property>
-
- <child internal-child="entry">
- <widget class="GtkEntry" id="entry-country">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- </child>
-
- <child internal-child="list">
- <widget class="GtkList" id="convertwidget1">
- <property name="visible">True</property>
- <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-
- <child>
- <widget class="GtkListItem" id="convertwidget2">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget3">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-code">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-code">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_ZIP Code:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-code</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-country">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Countr_y:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-country</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/addressbook/gui/contact-editor/fullname.glade b/addressbook/gui/contact-editor/fullname.glade
deleted file mode 100644
index f2ae7c92eb..0000000000
--- a/addressbook/gui/contact-editor/fullname.glade
+++ /dev/null
@@ -1,681 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkDialog" id="dialog-checkfullname">
- <property name="title" translatable="yes">Full Name</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">True</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="has_separator">False</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="vbox-container">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">8</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="hbuttonbox1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="button1">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">0</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="button2">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">0</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table-checkfullname">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="n_rows">5</property>
- <property name="n_columns">3</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkCombo" id="combo-title">
- <property name="visible">True</property>
- <property name="value_in_list">False</property>
- <property name="allow_empty">True</property>
- <property name="case_sensitive">False</property>
- <property name="enable_arrow_keys">True</property>
- <property name="enable_arrows_always">False</property>
-
- <child internal-child="entry">
- <widget class="GtkEntry" id="entry-title">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- </child>
-
- <child internal-child="list">
- <widget class="GtkList" id="convertwidget1">
- <property name="visible">True</property>
- <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-
- <child>
- <widget class="GtkListItem" id="convertwidget2">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget3">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="convertwidget4">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget5">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Mr.</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="convertwidget6">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget7">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Mrs.</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="convertwidget8">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget9">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Ms.</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="convertwidget10">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget11">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Miss</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="convertwidget12">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget13">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Dr.</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="convertwidget14">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget15">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCombo" id="combo-suffix">
- <property name="visible">True</property>
- <property name="value_in_list">False</property>
- <property name="allow_empty">True</property>
- <property name="case_sensitive">False</property>
- <property name="enable_arrow_keys">True</property>
- <property name="enable_arrows_always">False</property>
-
- <child internal-child="entry">
- <widget class="GtkEntry" id="entry-suffix">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- </child>
-
- <child internal-child="list">
- <widget class="GtkList" id="convertwidget16">
- <property name="visible">True</property>
- <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-
- <child>
- <widget class="GtkListItem" id="convertwidget17">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget18">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="convertwidget19">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget20">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Sr.</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="convertwidget21">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget22">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Jr.</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="convertwidget23">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget24">
- <property name="visible">True</property>
- <property name="label" translatable="yes">I</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="convertwidget25">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget26">
- <property name="visible">True</property>
- <property name="label" translatable="yes">II</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="convertwidget27">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget28">
- <property name="visible">True</property>
- <property name="label" translatable="yes">III</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="convertwidget29">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget30">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Esq.</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="convertwidget31">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget32">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-first">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-middle">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-last">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">3</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-first">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_First:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-first</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-title">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Title:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-title</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-middle">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Middle:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-middle</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-last">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Last:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-last</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-suffix">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Suffix:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-suffix</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/addressbook/gui/contact-editor/im.glade b/addressbook/gui/contact-editor/im.glade
deleted file mode 100644
index eb8832e8f1..0000000000
--- a/addressbook/gui/contact-editor/im.glade
+++ /dev/null
@@ -1,206 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkDialog" id="dialog-im">
- <property name="title" translatable="yes">Add IM Account</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">True</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="has_separator">False</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="cancelbutton1">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">-6</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="okbutton1">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">-5</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table-im">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="n_rows">3</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label-service">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_IM Service:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">optmenu-service</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="optmenu-service">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">-1</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-username">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Account name:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry-username</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry-username">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label-location">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Location:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">optmenu-location</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="optmenu-location">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">-1</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/addressbook/gui/contact-editor/test-editor.c b/addressbook/gui/contact-editor/test-editor.c
deleted file mode 100644
index 4a8c111563..0000000000
--- a/addressbook/gui/contact-editor/test-editor.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * test-editor.c
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <gtk/gtkmain.h>
-#include <libgnomeui/gnome-app.h>
-#include <libgnomeui/gnome-ui-init.h>
-#include <glade/glade.h>
-#include "e-contact-editor.h"
-#include "ebook/e-card.h"
-
-#define TEST_VCARD \
-"BEGIN:VCARD
-" \
-"FN:Nat
-" \
-"N:Friedman;Nat;D;Mr.
-" \
-"BDAY:1977-08-06
-" \
-"TEL;WORK:617 679 1984
-" \
-"TEL;CELL:123 456 7890
-" \
-"EMAIL;INTERNET:nat@nat.org
-" \
-"EMAIL;INTERNET:nat@ximian.com
-" \
-"ADR;WORK;POSTAL:P.O. Box 101;;;Any Town;CA;91921-1234;
-" \
-"ADR;HOME;POSTAL;INTL:P.O. Box 202;;;Any Town 2;MI;12344-4321;USA
-" \
-"END:VCARD
-" \
-"
-"
-
-static char *
-read_file (char *name)
-{
- int len;
- char buff[65536];
- char line[1024];
- FILE *f;
-
- f = fopen (name, "r");
- if (f == NULL)
- g_error ("Unable to open %s!\n", name);
-
- len = 0;
- while (fgets (line, sizeof (line), f) != NULL) {
- strcpy (buff + len, line);
- len += strlen (line);
- }
-
- fclose (f);
-
- return g_strdup (buff);
-}
-
-/* Callback used when a contact editor is closed */
-static void
-editor_closed_cb (EContactEditor *ce, gpointer data)
-{
- static int count = 2;
-
- count--;
- g_object_unref (ce);
-
- if (count == 0)
- exit (0);
-}
-
-#if 0
-static void about_callback( GtkWidget *widget, gpointer data )
-{
-
- const gchar *authors[] =
- {
- "Christopher James Lahey <clahey@umich.edu>",
- NULL
- };
-
- GtkWidget *about =
- gnome_about_new ( _( "Contact Editor Test" ), VERSION,
- _( "Copyright (C) 2000, Ximian, Inc." ),
- authors,
- _( "This should test the contact editor canvas item" ),
- NULL);
- gtk_widget_show (about);
-}
-#endif
-
-int main( int argc, char *argv[] )
-{
- char *cardstr;
- EContactEditor *ce;
-
- gnome_program_init("Contact Editor Test", VERSION, LIBGNOMEUI_MODULE, argc, argv, NULL);
-
- glade_init ();
-
- cardstr = NULL;
- if (argc == 2)
- cardstr = read_file (argv [1]);
-
- if (cardstr == NULL)
- cardstr = TEST_VCARD;
-
- ce = e_contact_editor_new (NULL, e_card_new_with_default_charset (cardstr, "ISO-8859-1"), TRUE, FALSE);
- g_signal_connect (ce, "editor_closed",
- G_CALLBACK (editor_closed_cb), NULL);
-
- ce = e_contact_editor_new (NULL, e_card_new_with_default_charset (cardstr, "ISO-8859-1"), TRUE, FALSE);
- g_signal_connect (ce, "editor_closed",
- G_CALLBACK (editor_closed_cb), NULL);
-
- gtk_main();
-
- /* Not reached. */
- return 0;
-}
diff --git a/addressbook/gui/contact-list-editor/.cvsignore b/addressbook/gui/contact-list-editor/.cvsignore
deleted file mode 100644
index 1fe141cc30..0000000000
--- a/addressbook/gui/contact-list-editor/.cvsignore
+++ /dev/null
@@ -1,7 +0,0 @@
-Evolution-Addressbook-SelectNames.h
-Makefile.in
-Makefile
-.deps
-.pure
-e-contact-list-editor-marshal.c
-e-contact-list-editor-marshal.h
diff --git a/addressbook/gui/contact-list-editor/Makefile.am b/addressbook/gui/contact-list-editor/Makefile.am
deleted file mode 100644
index 43abc3ff47..0000000000
--- a/addressbook/gui/contact-list-editor/Makefile.am
+++ /dev/null
@@ -1,39 +0,0 @@
-INCLUDES = \
- -I$(top_srcdir) \
- -I$(top_srcdir)/addressbook/ \
- -I$(top_srcdir)/addressbook/backend \
- -I$(top_builddir)/addressbook/backend \
- -I$(top_srcdir)/addressbook/gui/merging \
- -I$(top_srcdir)/addressbook/gui/contact-editor \
- -I$(top_builddir)/shell \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_ETSPECDIR=\""$(etspecdir)"\" \
- -DEVOLUTION_DATADIR=\""$(datadir)"\" \
- -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \
- -DEVOLUTION_UIDIR=\""$(evolutionuidir)\"" \
- -DPREFIX=\""$(prefix)"\" \
- -DG_LOG_DOMAIN=\"contact-list-editor\" \
- $(EVOLUTION_ADDRESSBOOK_CFLAGS)
-
-noinst_LTLIBRARIES = \
- libecontactlisteditor.la
-
-libecontactlisteditor_la_SOURCES = \
- $(MARSHAL_GENERATED) \
- e-contact-list-editor.c \
- e-contact-list-editor.h \
- e-contact-list-model.c \
- e-contact-list-model.h
-
-MARSHAL_GENERATED = e-contact-list-editor-marshal.c e-contact-list-editor-marshal.h
-@EVO_MARSHAL_RULE@
-
-glade_DATA = contact-list-editor.glade
-etspec_DATA = e-contact-list-editor.etspec
-
-BUILT_SOURCES = $(MARSHAL_GENERATED)
-CLEANFILES = $(BUILT_SOURCES)
-
-EXTRA_DIST = $(glade_DATA) \
- $(etspec_DATA) \
- e-contact-list-editor-marshal.list
diff --git a/addressbook/gui/contact-list-editor/contact-list-editor.glade b/addressbook/gui/contact-list-editor/contact-list-editor.glade
deleted file mode 100644
index bc5c2c18ee..0000000000
--- a/addressbook/gui/contact-list-editor/contact-list-editor.glade
+++ /dev/null
@@ -1,436 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkDialog" id="contact list editor">
- <property name="visible">True</property>
- <property name="title" translatable="yes">Contact List Editor</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="has_separator">True</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="cancel-button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-6</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="ok-button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-5</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox8">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkHBox" id="hbox6">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkTable" id="table1">
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label10">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_List name:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">list-name-entry</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="list-name-entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="has_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="source-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Where:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="source-option-menu-source">
- <property name="visible">True</property>
- <property name="creation_function">e_contact_list_editor_create_source_option_menu</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Tue, 01 Jun 2004 18:22:38 GMT</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="list-image">
- <property name="visible">True</property>
- <property name="creation_function">eab_create_image_chooser_widget</property>
- <property name="string1">stock_addressbook</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Sat, 23 Jun 2001 05:59:21 GMT</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="frame3">
- <property name="border_width">3</property>
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
- <child>
- <widget class="GtkHBox" id="hbox7">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkVBox" id="vbox9">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label11">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Type an email address or drag a contact into the list below:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">email-entry</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="email-entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="contact-list-table">
- <property name="visible">True</property>
- <property name="creation_function">e_contact_list_editor_create_table</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Sat, 23 Jun 2001 06:00:16 GMT</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="visible-addrs-checkbutton">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Hide addresses when sending mail to this list</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox10">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="label12">
- <property name="visible">True</property>
- <property name="label" translatable="yes">
-</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVButtonBox" id="vbuttonbox4">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_START</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkButton" id="add-email-button">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Add an email to the List</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-add</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="remove-button">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Remove an email address from the List</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-remove</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="select-button">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Insert email adresses from Adress Book</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Select</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label11">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Members</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/addressbook/gui/contact-list-editor/e-contact-list-editor-marshal.list b/addressbook/gui/contact-list-editor/e-contact-list-editor-marshal.list
deleted file mode 100644
index 8d94a0bf3b..0000000000
--- a/addressbook/gui/contact-list-editor/e-contact-list-editor-marshal.list
+++ /dev/null
@@ -1,4 +0,0 @@
-INT:OBJECT
-NONE:INT,OBJECT
-NONE:INT,OBJECT
-NONE:NONE
diff --git a/addressbook/gui/contact-list-editor/e-contact-list-editor.c b/addressbook/gui/contact-list-editor/e-contact-list-editor.c
deleted file mode 100644
index 7cbf1d8dff..0000000000
--- a/addressbook/gui/contact-list-editor/e-contact-list-editor.c
+++ /dev/null
@@ -1,1133 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-list-editor.c
- * Copyright (C) 2001 Ximian, Inc.
- * Author: Chris Toshok <toshok@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include "e-contact-list-editor.h"
-#include <e-util/e-icon-factory.h>
-
-#include <string.h>
-
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/gnome-window-icon.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtktogglebutton.h>
-#include <gtk/gtkdialog.h>
-
-#include <libedataserverui/e-source-option-menu.h>
-
-#include <gal/e-table/e-table-scrolled.h>
-#include <libgnomevfs/gnome-vfs-ops.h>
-
-#include "shell/evolution-shell-component-utils.h"
-
-#include "widgets/misc/e-image-chooser.h"
-
-#include "addressbook/gui/component/addressbook.h"
-#include "addressbook/gui/widgets/eab-gui-util.h"
-#include "addressbook/util/eab-book-util.h"
-
-#include "eab-editor.h"
-#include "e-contact-editor.h"
-#include "e-contact-list-model.h"
-#include "e-contact-list-editor-marshal.h"
-#include "eab-contact-merging.h"
-
-static void e_contact_list_editor_init (EContactListEditor *editor);
-static void e_contact_list_editor_class_init (EContactListEditorClass *klass);
-static void e_contact_list_editor_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
-static void e_contact_list_editor_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
-static void e_contact_list_editor_dispose (GObject *object);
-
-static void e_contact_list_editor_show (EABEditor *editor);
-static void e_contact_list_editor_raise (EABEditor *editor);
-static void e_contact_list_editor_close (EABEditor *editor);
-static void e_contact_list_editor_save_contact (EABEditor *editor, gboolean should_close);
-static gboolean e_contact_list_editor_is_valid (EABEditor *editor);
-static gboolean e_contact_list_editor_is_changed (EABEditor *editor);
-static GtkWindow* e_contact_list_editor_get_window (EABEditor *editor);
-
-static void set_editable (EContactListEditor *editor);
-static void command_state_changed (EContactListEditor *editor);
-static void extract_info(EContactListEditor *editor);
-static void fill_in_info(EContactListEditor *editor);
-
-static void add_email_cb (GtkWidget *w, EContactListEditor *editor);
-static void remove_entry_cb (GtkWidget *w, EContactListEditor *editor);
-static void select_cb (GtkWidget *w, EContactListEditor *editor);
-static void list_name_changed_cb (GtkWidget *w, EContactListEditor *editor);
-static void list_image_changed_cb (GtkWidget *w, EContactListEditor *editor);
-static void visible_addrs_toggled_cb (GtkWidget *w, EContactListEditor *editor);
-static void source_selected (GtkWidget *source_option_menu, ESource *source, EContactListEditor *editor);
-
-static void close_cb (GtkWidget *widget, EContactListEditor *editor);
-static void save_and_close_cb (GtkWidget *widget, EContactListEditor *editor);
-
-static gint app_delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data);
-static gboolean table_drag_drop_cb (ETable *table, int row, int col, GdkDragContext *context,
- gint x, gint y, guint time, EContactListEditor *editor);
-static gboolean table_drag_motion_cb (ETable *table, int row, int col, GdkDragContext *context,
- gint x, gint y, guint time, EContactListEditor *editor);
-static void table_drag_data_received_cb (ETable *table, int row, int col,
- GdkDragContext *context,
- gint x, gint y,
- GtkSelectionData *selection_data, guint info, guint time,
- EContactListEditor *editor);
-
-static EABEditorClass *parent_class = NULL;
-
-enum DndTargetType {
- DND_TARGET_TYPE_VCARD,
-};
-#define VCARD_TYPE "text/x-vcard"
-
-static GtkTargetEntry list_drag_types[] = {
- { VCARD_TYPE, 0, DND_TARGET_TYPE_VCARD },
-};
-static const int num_list_drag_types = sizeof (list_drag_types) / sizeof (list_drag_types[0]);
-
-/* The arguments we take */
-enum {
- PROP_0,
- PROP_BOOK,
- PROP_CONTACT,
- PROP_IS_NEW_LIST,
- PROP_EDITABLE
-};
-
-GType
-e_contact_list_editor_get_type (void)
-{
- static GType cle_type = 0;
-
- if (!cle_type) {
- static const GTypeInfo cle_info = {
- sizeof (EContactListEditorClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) e_contact_list_editor_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EContactListEditor),
- 0, /* n_preallocs */
- (GInstanceInitFunc) e_contact_list_editor_init,
- };
-
- cle_type = g_type_register_static (EAB_TYPE_EDITOR, "EContactListEditor", &cle_info, 0);
- }
-
- return cle_type;
-}
-
-
-static void
-e_contact_list_editor_class_init (EContactListEditorClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- EABEditorClass *editor_class = EAB_EDITOR_CLASS (klass);
-
- parent_class = g_type_class_ref (EAB_TYPE_EDITOR);
-
- editor_class->show = e_contact_list_editor_show;
- editor_class->raise = e_contact_list_editor_raise;
- editor_class->close = e_contact_list_editor_close;
- editor_class->save_contact = e_contact_list_editor_save_contact;
- editor_class->is_valid = e_contact_list_editor_is_valid;
- editor_class->is_changed = e_contact_list_editor_is_changed;
- editor_class->get_window = e_contact_list_editor_get_window;
-
- object_class->set_property = e_contact_list_editor_set_property;
- object_class->get_property = e_contact_list_editor_get_property;
- object_class->dispose = e_contact_list_editor_dispose;
-
- g_object_class_install_property (object_class, PROP_BOOK,
- g_param_spec_object ("book",
- _("Book"),
- /*_( */"XXX blurb" /*)*/,
- E_TYPE_BOOK,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_CONTACT,
- g_param_spec_object ("contact",
- _("Contact"),
- /*_( */"XXX blurb" /*)*/,
- E_TYPE_CONTACT,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_IS_NEW_LIST,
- g_param_spec_boolean ("is_new_list",
- _("Is New List"),
- /*_( */"XXX blurb" /*)*/,
- FALSE,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_EDITABLE,
- g_param_spec_boolean ("editable",
- _("Editable"),
- /*_( */"XXX blurb" /*)*/,
- FALSE,
- G_PARAM_READWRITE));
-}
-
-static void
-e_contact_list_editor_init (EContactListEditor *editor)
-{
- GladeXML *gui;
- GList *icon_list;
-
- editor->contact = NULL;
- editor->changed = FALSE;
- editor->image_set = FALSE;
- editor->editable = TRUE;
- editor->allows_contact_lists = TRUE;
- editor->in_async_call = FALSE;
- editor->is_new_list = FALSE;
-
- editor->load_source_id = 0;
- editor->load_book = NULL;
-
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/contact-list-editor.glade", NULL, NULL);
- editor->gui = gui;
-
- editor->app = glade_xml_get_widget (gui, "contact list editor");
-
- editor->table = glade_xml_get_widget (gui, "contact-list-table");
- editor->model = g_object_get_data (G_OBJECT(editor->table), "model");
-
- /* XXX need this for libglade-2 it seems */
- gtk_widget_show (editor->table);
-
- editor->add_button = glade_xml_get_widget (editor->gui, "add-email-button");
- editor->remove_button = glade_xml_get_widget (editor->gui, "remove-button");
- editor->select_button = glade_xml_get_widget (editor->gui, "select-button");
-
- editor->email_entry = glade_xml_get_widget (gui, "email-entry");
- editor->list_name_entry = glade_xml_get_widget (gui, "list-name-entry");
- editor->list_image = glade_xml_get_widget (gui, "list-image");
- editor->visible_addrs_checkbutton = glade_xml_get_widget (gui, "visible-addrs-checkbutton");
- editor->source_menu = glade_xml_get_widget (gui, "source-option-menu-source");
-
- editor->ok_button = glade_xml_get_widget (gui, "ok-button");
- editor->cancel_button = glade_xml_get_widget (gui, "cancel-button");
-
- /* connect signals */
- g_signal_connect (editor->add_button,
- "clicked", G_CALLBACK(add_email_cb), editor);
- g_signal_connect (editor->email_entry,
- "activate", G_CALLBACK(add_email_cb), editor);
- g_signal_connect (editor->remove_button,
- "clicked", G_CALLBACK(remove_entry_cb), editor);
- g_signal_connect (editor->select_button,
- "clicked", G_CALLBACK(select_cb), editor);
- g_signal_connect (editor->list_name_entry,
- "changed", G_CALLBACK(list_name_changed_cb), editor);
- g_signal_connect (editor->visible_addrs_checkbutton,
- "toggled", G_CALLBACK(visible_addrs_toggled_cb), editor);
-
- e_table_drag_dest_set (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)),
- 0, list_drag_types, num_list_drag_types, GDK_ACTION_LINK);
-
- g_signal_connect (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)),
- "table_drag_motion", G_CALLBACK(table_drag_motion_cb), editor);
- g_signal_connect (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)),
- "table_drag_drop", G_CALLBACK (table_drag_drop_cb), editor);
- g_signal_connect (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)),
- "table_drag_data_received", G_CALLBACK(table_drag_data_received_cb), editor);
-
- g_signal_connect (editor->ok_button,
- "clicked", G_CALLBACK(save_and_close_cb), editor);
- g_signal_connect (editor->cancel_button,
- "clicked", G_CALLBACK(close_cb), editor);
-
-
- g_signal_connect (editor->list_image,
- "changed", G_CALLBACK(list_image_changed_cb), editor);
-
- g_signal_connect (editor->source_menu,
- "source_selected", G_CALLBACK (source_selected), editor);
-
- command_state_changed (editor);
-
- /* Connect to the deletion of the dialog */
- g_signal_connect (editor->app, "delete_event",
- G_CALLBACK (app_delete_event_cb), editor);
-
- gtk_dialog_set_has_separator (GTK_DIALOG (editor->app), FALSE);
-
- /* set the icon */
- icon_list = e_icon_factory_get_icon_list ("stock_contact-list");
- if (icon_list) {
- gtk_window_set_icon_list (GTK_WINDOW (editor->app), icon_list);
- g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
- g_list_free (icon_list);
- }
-
- gtk_widget_show_all (editor->app);
-}
-
-static void
-new_target_cb (EBook *new_book, EBookStatus status, EContactListEditor *editor)
-{
- editor->load_source_id = 0;
- editor->load_book = NULL;
-
- if (status != E_BOOK_ERROR_OK || new_book == NULL) {
- eab_load_error_dialog (NULL, e_book_get_source (new_book), status);
-
- e_source_option_menu_select (E_SOURCE_OPTION_MENU (editor->source_menu),
- e_book_get_source (editor->book));
-
- if (new_book)
- g_object_unref (new_book);
- return;
- }
-
- g_object_set (editor, "book", new_book, NULL);
- g_object_unref (new_book);
-}
-
-static void
-cancel_load (EContactListEditor *editor)
-{
- if (editor->load_source_id) {
- addressbook_load_cancel (editor->load_source_id);
- editor->load_source_id = 0;
-
- g_object_unref (editor->load_book);
- editor->load_book = NULL;
- }
-}
-
-static void
-source_selected (GtkWidget *source_option_menu, ESource *source, EContactListEditor *editor)
-{
- cancel_load (editor);
-
- if (e_source_equal (e_book_get_source (editor->book), source))
- return;
-
- editor->load_book = e_book_new (source, NULL);
- editor->load_source_id = addressbook_load (editor->load_book,
- (EBookCallback) new_target_cb, editor);
-}
-
-static void
-e_contact_list_editor_dispose (GObject *object)
-{
- EContactListEditor *editor = E_CONTACT_LIST_EDITOR (object);
-
- cancel_load (editor);
-
- if (editor->name_selector) {
- g_object_unref (editor->name_selector);
- editor->name_selector = NULL;
- }
-
- if (G_OBJECT_CLASS (parent_class)->dispose)
- (* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-typedef struct {
- EContactListEditor *cle;
- gboolean should_close;
-} EditorCloseStruct;
-
-static void
-list_added_cb (EBook *book, EBookStatus status, const char *id, EditorCloseStruct *ecs)
-{
- EContactListEditor *cle = ecs->cle;
- gboolean should_close = ecs->should_close;
-
- if (cle->app)
- gtk_widget_set_sensitive (cle->app, TRUE);
- cle->in_async_call = FALSE;
-
- e_contact_set (cle->contact, E_CONTACT_UID, (char*)id);
-
- eab_editor_contact_added (EAB_EDITOR (cle), status, cle->contact);
-
- if (status == E_BOOK_ERROR_OK) {
- cle->is_new_list = FALSE;
-
- if (should_close)
- eab_editor_close (EAB_EDITOR (cle));
- else
- command_state_changed (cle);
- }
-
- g_object_unref (cle);
- g_free (ecs);
-}
-
-static void
-list_modified_cb (EBook *book, EBookStatus status, EditorCloseStruct *ecs)
-{
- EContactListEditor *cle = ecs->cle;
- gboolean should_close = ecs->should_close;
-
- if (cle->app)
- gtk_widget_set_sensitive (cle->app, TRUE);
- cle->in_async_call = FALSE;
-
- eab_editor_contact_modified (EAB_EDITOR (cle), status, cle->contact);
-
- if (status == E_BOOK_ERROR_OK) {
- if (should_close)
- eab_editor_close (EAB_EDITOR (cle));
- }
-
- g_object_unref (cle); /* release ref held for ebook callback */
- g_free (ecs);
-}
-
-static void
-save_contact (EContactListEditor *cle, gboolean should_close)
-{
- extract_info (cle);
-
- if (cle->book) {
- EditorCloseStruct *ecs = g_new(EditorCloseStruct, 1);
-
- ecs->cle = cle;
- g_object_ref (cle);
- ecs->should_close = should_close;
-
- if (cle->app)
- gtk_widget_set_sensitive (cle->app, FALSE);
- cle->in_async_call = TRUE;
-
- if (cle->is_new_list)
- eab_merging_book_add_contact (cle->book, cle->contact, (EBookIdCallback)list_added_cb, ecs);
- else
- eab_merging_book_commit_contact (cle->book, cle->contact, (EBookCallback)list_modified_cb, ecs);
-
- cle->changed = FALSE;
- }
-}
-
-static gboolean
-is_named (EContactListEditor *editor)
-{
- char *string = gtk_editable_get_chars(GTK_EDITABLE (editor->list_name_entry), 0, -1);
- gboolean named = FALSE;
-
- if (string && *string) {
- named = TRUE;
- }
-
- g_free (string);
-
- return named;
-}
-
-static void
-e_contact_list_editor_save_contact (EABEditor *editor, gboolean should_close)
-{
- EContactListEditor *cle = E_CONTACT_LIST_EDITOR (editor);
-
- save_contact (cle, should_close);
-}
-
-static gboolean
-e_contact_list_editor_is_valid (EABEditor *editor)
-{
- EContactListEditor *cle = E_CONTACT_LIST_EDITOR (editor);
-
- return is_named (cle);
-}
-
-static gboolean
-e_contact_list_editor_is_changed (EABEditor *editor)
-{
- EContactListEditor *cle = E_CONTACT_LIST_EDITOR (editor);
-
- return cle->changed;
-}
-
-static GtkWindow*
-e_contact_list_editor_get_window (EABEditor *editor)
-{
- return GTK_WINDOW (E_CONTACT_LIST_EDITOR (editor)->app);
-}
-
-static void
-close_cb (GtkWidget *widget, EContactListEditor *cle)
-{
- if (!eab_editor_prompt_to_save_changes (EAB_EDITOR (cle), GTK_WINDOW (cle->app)))
- return;
-
- eab_editor_close (EAB_EDITOR (cle));
-}
-
-static void
-save_and_close_cb (GtkWidget *widget, EContactListEditor *cle)
-{
- save_contact (cle, TRUE);
-}
-
-static void
-contact_list_editor_destroy_notify (gpointer data,
- GObject *where_the_object_was)
-{
- eab_editor_remove (EAB_EDITOR (data));
-}
-
-EContactListEditor *
-e_contact_list_editor_new (EBook *book,
- EContact *list_contact,
- gboolean is_new_list,
- gboolean editable)
-{
- EContactListEditor *ce = g_object_new (E_TYPE_CONTACT_LIST_EDITOR, NULL);
-
- eab_editor_add (EAB_EDITOR (ce));
- g_object_weak_ref (G_OBJECT (ce), contact_list_editor_destroy_notify, ce);
-
- g_object_set (ce,
- "book", book,
- "contact", list_contact,
- "is_new_list", is_new_list,
- "editable", editable,
- NULL);
-
- return ce;
-}
-
-static void
-e_contact_list_editor_set_property (GObject *object, guint prop_id,
- const GValue *value, GParamSpec *pspec)
-{
- EContactListEditor *editor;
-
- editor = E_CONTACT_LIST_EDITOR (object);
-
- switch (prop_id){
- case PROP_BOOK: {
- gboolean changed;
-
- if (editor->book)
- g_object_unref (editor->book);
- editor->book = E_BOOK(g_value_get_object (value));
- g_object_ref (editor->book);
- /* XXX more here about editable/etc. */
-
- changed = (editor->allows_contact_lists != e_book_check_static_capability (editor->book,
- "contact-lists"));
- editor->allows_contact_lists = e_book_check_static_capability (editor->book,
- "contact-lists");
-
- if (changed) {
- set_editable (editor);
- command_state_changed (editor);
- }
- break;
- }
- case PROP_CONTACT:
- if (editor->contact)
- g_object_unref (editor->contact);
- editor->contact = e_contact_duplicate(E_CONTACT(g_value_get_object (value)));
- fill_in_info(editor);
- editor->changed = FALSE;
- command_state_changed (editor);
- break;
- case PROP_IS_NEW_LIST: {
- gboolean new_value = g_value_get_boolean (value);
- gboolean changed = (editor->is_new_list != new_value);
-
- editor->is_new_list = new_value;
-
- if (changed)
- command_state_changed (editor);
- break;
- }
- case PROP_EDITABLE: {
- gboolean new_value = g_value_get_boolean (value);
- gboolean changed = (editor->editable != new_value);
-
- editor->editable = new_value;
-
- if (changed) {
- set_editable (editor);
- command_state_changed (editor);
- }
- break;
- }
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-e_contact_list_editor_get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec)
-{
- EContactListEditor *editor;
-
- editor = E_CONTACT_LIST_EDITOR (object);
-
- switch (prop_id) {
- case PROP_BOOK:
- g_value_set_object (value, editor->book);
- break;
-
- case PROP_CONTACT:
- extract_info(editor);
- g_value_set_object (value, editor->contact);
- break;
-
- case PROP_IS_NEW_LIST:
- g_value_set_boolean (value, editor->is_new_list);
- break;
-
- case PROP_EDITABLE:
- g_value_set_boolean (value, editor->editable);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-e_contact_list_editor_show (EABEditor *editor)
-{
- EContactListEditor *cle = E_CONTACT_LIST_EDITOR (editor);
- gtk_widget_show (cle->app);
-}
-
-static void
-e_contact_list_editor_raise (EABEditor *editor)
-{
- EContactListEditor *cle = E_CONTACT_LIST_EDITOR (editor);
- gdk_window_raise (GTK_WIDGET (cle->app)->window);
-}
-
-static void
-e_contact_list_editor_close (EABEditor *editor)
-{
- EContactListEditor *cle = E_CONTACT_LIST_EDITOR (editor);
- g_assert (cle->app != NULL);
-
- gtk_widget_destroy (cle->app);
- cle->app = NULL;
-
- eab_editor_closed (EAB_EDITOR (cle));
-}
-
-GtkWidget *
-e_contact_list_editor_create_table(gchar *name,
- gchar *string1, gchar *string2,
- gint int1, gint int2);
-
-GtkWidget *
-e_contact_list_editor_create_table(gchar *name,
- gchar *string1, gchar *string2,
- gint int1, gint int2)
-{
-
- ETableModel *model;
- GtkWidget *table;
-
- model = e_contact_list_model_new ();
-
- table = e_table_scrolled_new_from_spec_file (model,
- NULL,
- EVOLUTION_ETSPECDIR "/e-contact-list-editor.etspec",
- NULL);
-
- g_object_set_data(G_OBJECT(table), "model", model);
-
- return table;
-}
-
-static void
-add_to_model (EContactListEditor *editor, GList *destinations)
-{
- GList *l;
-
- for (l = destinations; l; l = g_list_next (l)) {
- EDestination *destination = l->data;
- e_contact_list_model_add_destination (E_CONTACT_LIST_MODEL(editor->model), destination);
- }
-}
-
-static void
-select_names_ok_cb (GtkWidget *widget, gint response, gpointer data)
-{
- EContactListEditor *ce;
- ENameSelectorDialog *name_selector_dialog;
- ENameSelectorModel *name_selector_model;
- EDestinationStore *destination_store;
- GList *destinations;
-
- ce = E_CONTACT_LIST_EDITOR (data);
-
- name_selector_dialog = e_name_selector_peek_dialog (ce->name_selector);
- gtk_widget_hide (GTK_WIDGET (name_selector_dialog));
-
- name_selector_model = e_name_selector_peek_model (ce->name_selector);
- e_name_selector_model_peek_section (name_selector_model, "Members", NULL, &destination_store);
- destinations = e_destination_store_list_destinations (destination_store);
-
- add_to_model (ce, destinations);
-
- g_list_free (destinations);
-
- ce->changed = TRUE;
- command_state_changed (ce);
-}
-
-static void
-setup_name_selector (EContactListEditor *editor)
-{
- ENameSelectorModel *name_selector_model;
- ENameSelectorDialog *name_selector_dialog;
-
- if (editor->name_selector)
- return;
-
- editor->name_selector = e_name_selector_new ();
-
- name_selector_model = e_name_selector_peek_model (editor->name_selector);
- e_name_selector_model_add_section (name_selector_model, "Members", gettext ("_Members"), NULL);
-
- name_selector_dialog = e_name_selector_peek_dialog (editor->name_selector);
- gtk_window_set_title (GTK_WINDOW (name_selector_dialog), _("Contact List Members"));
- g_signal_connect (name_selector_dialog, "response",
- G_CALLBACK (select_names_ok_cb), editor);
-}
-
-static void
-select_cb (GtkWidget *w, EContactListEditor *editor)
-{
- ENameSelectorModel *name_selector_model;
- ENameSelectorDialog *name_selector_dialog;
- EDestinationStore *destination_store;
- GList *destinations;
- GList *l;
-
- setup_name_selector (editor);
-
- /* We need to empty out the destination store, since we copy its contents every time.
- * This sucks, we should really be wired directly to the EDestinationStore that
- * the name selector uses in true MVC fashion. */
-
- name_selector_model = e_name_selector_peek_model (editor->name_selector);
- e_name_selector_model_peek_section (name_selector_model, "Members", NULL, &destination_store);
- destinations = e_destination_store_list_destinations (destination_store);
-
- for (l = destinations; l; l = g_list_next (l)) {
- EDestination *destination = l->data;
- e_destination_store_remove_destination (destination_store, destination);
- }
-
- g_list_free (destinations);
-
- name_selector_dialog = e_name_selector_peek_dialog (editor->name_selector);
- gtk_widget_show (GTK_WIDGET (name_selector_dialog));
-}
-
-GtkWidget *
-e_contact_list_editor_create_source_option_menu (gchar *name,
- gchar *string1, gchar *string2,
- gint int1, gint int2);
-
-GtkWidget *
-e_contact_list_editor_create_source_option_menu (gchar *name,
- gchar *string1, gchar *string2,
- gint int1, gint int2)
-{
-
- GtkWidget *menu;
- GConfClient *gconf_client;
- ESourceList *source_list;
-
- gconf_client = gconf_client_get_default ();
- source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/addressbook/sources");
-
- menu = e_source_option_menu_new (source_list);
- g_object_unref (source_list);
-
- gtk_widget_show (menu);
- return menu;
-}
-
-static void
-add_email_cb (GtkWidget *w, EContactListEditor *editor)
-{
- GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (editor->table));
- const char *text = gtk_entry_get_text (GTK_ENTRY(editor->email_entry));
-
- if (text && *text) {
- e_contact_list_model_add_email (E_CONTACT_LIST_MODEL(editor->model), text);
-
- /* Skip to the end of the list */
- if (adj->upper - adj->lower > adj->page_size)
- gtk_adjustment_set_value (adj, adj->upper);
-
- editor->changed = TRUE;
-
- }
-
- gtk_entry_set_text (GTK_ENTRY(editor->email_entry), "");
- command_state_changed (editor);
-}
-
-static void
-remove_row (int model_row, EContactListEditor *editor)
-{
- e_contact_list_model_remove_row (E_CONTACT_LIST_MODEL (editor->model), model_row);
-}
-
-static void
-remove_entry_cb (GtkWidget *w, EContactListEditor *editor)
-{
- e_table_selected_row_foreach (e_table_scrolled_get_table(E_TABLE_SCROLLED(editor->table)),
- (EForeachFunc)remove_row, editor);
- editor->changed = TRUE;
- command_state_changed (editor);
-}
-
-static void
-list_name_changed_cb (GtkWidget *w, EContactListEditor *editor)
-{
- char *string = gtk_editable_get_chars(GTK_EDITABLE (w), 0, -1);
- char *title;
-
- editor->changed = TRUE;
-
- if (string && *string)
- title = string;
- else
- title = _("Contact List Editor");
-
- gtk_window_set_title (GTK_WINDOW (editor->app), title);
-
- g_free (string);
-
- command_state_changed (editor);
-}
-
-static void
-list_image_changed_cb (GtkWidget *w, EContactListEditor *editor)
-{
- editor->image_set = TRUE;
- editor->changed = TRUE;
- command_state_changed (editor);
-}
-
-static void
-visible_addrs_toggled_cb (GtkWidget *w, EContactListEditor *editor)
-{
- editor->changed = TRUE;
- command_state_changed (editor);
-}
-
-static void
-set_editable (EContactListEditor *editor)
-{
- gtk_widget_set_sensitive (editor->email_entry, editor->editable && editor->allows_contact_lists);
- gtk_widget_set_sensitive (editor->list_name_entry, editor->editable && editor->allows_contact_lists);
- gtk_widget_set_sensitive (editor->add_button, editor->editable && editor->allows_contact_lists);
- gtk_widget_set_sensitive (editor->remove_button, editor->editable && editor->allows_contact_lists);
- gtk_widget_set_sensitive (editor->select_button, editor->editable && editor->allows_contact_lists);
- gtk_widget_set_sensitive (editor->table, editor->editable && editor->allows_contact_lists);
-}
-
-/* Callback used when the editor is destroyed */
-static gint
-app_delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
-{
- EContactListEditor *ce;
-
- ce = E_CONTACT_LIST_EDITOR (data);
-
- /* if we're in an async call, don't allow the dialog to close */
- if (ce->in_async_call)
- return TRUE;
-
- if (!eab_editor_prompt_to_save_changes (EAB_EDITOR (ce), GTK_WINDOW (ce->app)))
- return TRUE;
-
- eab_editor_close (EAB_EDITOR (ce));
- return TRUE;
-}
-
-static gboolean
-table_drag_motion_cb (ETable *table, int row, int col,
- GdkDragContext *context,
- gint x, gint y, guint time, EContactListEditor *editor)
-{
- GList *p;
-
- for (p = context->targets; p != NULL; p = p->next) {
- char *possible_type;
-
- possible_type = gdk_atom_name (GDK_POINTER_TO_ATOM (p->data));
- if (!strcmp (possible_type, VCARD_TYPE)) {
- g_free (possible_type);
- gdk_drag_status (context, GDK_ACTION_LINK, time);
- return TRUE;
- }
-
- g_free (possible_type);
- }
-
- return FALSE;
-}
-
-static gboolean
-table_drag_drop_cb (ETable *table, int row, int col,
- GdkDragContext *context,
- gint x, gint y, guint time, EContactListEditor *editor)
-{
- GList *p;
-
- for (p = context->targets; p != NULL; p = p->next) {
- char *possible_type;
-
- possible_type = gdk_atom_name (GDK_POINTER_TO_ATOM (p->data));
- if (!strcmp (possible_type, VCARD_TYPE)) {
- g_free (possible_type);
- break;
- }
-
- g_free (possible_type);
- }
-
-
- if (p) {
- gtk_drag_get_data (GTK_WIDGET (table), context,
- GDK_POINTER_TO_ATOM (p->data),
- time);
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-table_drag_data_received_cb (ETable *table, int row, int col,
- GdkDragContext *context,
- gint x, gint y,
- GtkSelectionData *selection_data,
- guint info, guint time, EContactListEditor *editor)
-{
- GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (editor->table));
- char *target_type;
- gboolean changed = FALSE;
- gboolean handled = FALSE;
-
- target_type = gdk_atom_name (selection_data->target);
-
- if (!strcmp (target_type, VCARD_TYPE)) {
-
- GList *contact_list = eab_contact_list_from_string (selection_data->data);
- GList *c;
-
- if (contact_list)
- handled = TRUE;
-
- for (c = contact_list; c; c = c->next) {
- EContact *contact = c->data;
-
- if (!e_contact_get (contact, E_CONTACT_IS_LIST)) {
- e_contact_list_model_add_contact (E_CONTACT_LIST_MODEL (editor->model),
- contact,
- 0 /* Hard-wired for default e-mail */);
-
- changed = TRUE;
- }
- }
- g_list_foreach (contact_list, (GFunc)g_object_unref, NULL);
- g_list_free (contact_list);
-
- /* Skip to the end of the list */
- if (adj->upper - adj->lower > adj->page_size)
- gtk_adjustment_set_value (adj, adj->upper);
-
- if (changed) {
- editor->changed = TRUE;
- command_state_changed (editor);
- }
- }
-
- gtk_drag_finish (context, handled, FALSE, time);
-}
-
-static void
-command_state_changed (EContactListEditor *editor)
-{
- gboolean valid = eab_editor_is_valid (EAB_EDITOR (editor));
-
- /* FIXME set the ok button to ok */
- gtk_widget_set_sensitive (editor->ok_button, valid && editor->allows_contact_lists);
- gtk_widget_set_sensitive (editor->source_menu, editor->is_new_list);
- gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "source-label"), editor->is_new_list);
-}
-
-static void
-extract_info(EContactListEditor *editor)
-{
- EContact *contact = editor->contact;
- if (contact) {
- int i;
- char *image_data;
- gsize image_data_len;
- char *string = gtk_editable_get_chars(GTK_EDITABLE (editor->list_name_entry), 0, -1);
-
- if (string && *string) {
- e_contact_set (contact, E_CONTACT_FILE_AS, string);
- e_contact_set (contact, E_CONTACT_FULL_NAME, string);
- }
-
- g_free (string);
-
- e_contact_set (contact, E_CONTACT_IS_LIST, GINT_TO_POINTER (TRUE));
- e_contact_set (contact, E_CONTACT_LIST_SHOW_ADDRESSES,
- GINT_TO_POINTER (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->visible_addrs_checkbutton))));
-
- e_vcard_remove_attributes (E_VCARD (contact), "", EVC_EMAIL);
-
- /* then refill it from the contact list model */
- for (i = 0; i < e_table_model_row_count (editor->model); i ++) {
- const EDestination *dest = e_contact_list_model_get_destination (E_CONTACT_LIST_MODEL (editor->model), i);
- EVCardAttribute *attr;
-
- attr = e_vcard_attribute_new (NULL, EVC_EMAIL);
-
- e_vcard_add_attribute (E_VCARD (contact), attr);
-
- e_destination_export_to_vcard_attribute ((EDestination*)dest, attr);
- }
-
- if (editor->image_set
- && e_image_chooser_get_image_data (E_IMAGE_CHOOSER (editor->list_image),
- &image_data,
- &image_data_len)) {
- EContactPhoto photo;
-
- photo.data = image_data;
- photo.length = image_data_len;
-
- e_contact_set (contact, E_CONTACT_LOGO, &photo);
- g_free (image_data);
- }
- else {
- e_contact_set (contact, E_CONTACT_LOGO, NULL);
- }
- }
-}
-
-static void
-fill_in_info(EContactListEditor *editor)
-{
- if (editor->contact) {
- EContactPhoto *photo;
- char *file_as;
- gboolean show_addresses = FALSE;
- gboolean is_evolution_list = FALSE;
- GList *email_list;
- GList *iter;
-
- file_as = e_contact_get_const (editor->contact, E_CONTACT_FILE_AS);
- email_list = e_contact_get_attributes (editor->contact, E_CONTACT_EMAIL);
- is_evolution_list = GPOINTER_TO_INT (e_contact_get (editor->contact, E_CONTACT_IS_LIST));
- show_addresses = GPOINTER_TO_INT (e_contact_get (editor->contact, E_CONTACT_LIST_SHOW_ADDRESSES));
-
- gtk_editable_delete_text (GTK_EDITABLE (editor->list_name_entry), 0, -1);
- if (file_as) {
- int position = 0;
- gtk_editable_insert_text (GTK_EDITABLE (editor->list_name_entry), file_as, strlen (file_as), &position);
- g_free (file_as);
- }
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(editor->visible_addrs_checkbutton), !show_addresses);
-
- e_contact_list_model_remove_all (E_CONTACT_LIST_MODEL (editor->model));
-
- for (iter = email_list; iter; iter = iter->next) {
- EVCardAttribute *attr = iter->data;
- GList *p;
- EDestination *list_dest = e_destination_new ();
- char *contact_uid = NULL;
- char *email = NULL;
- char *name = NULL;
- int email_num = -1;
- gboolean html_pref = FALSE;
-
- for (p = e_vcard_attribute_get_params (attr); p; p = p->next) {
- EVCardAttributeParam *param = p->data;
- const char *param_name = e_vcard_attribute_param_get_name (param);
- if (!g_ascii_strcasecmp (param_name,
- EVC_X_DEST_CONTACT_UID)) {
- GList *v = e_vcard_attribute_param_get_values (param);
- contact_uid = v ? v->data : NULL;
- }
- else if (!g_ascii_strcasecmp (param_name,
- EVC_X_DEST_EMAIL_NUM)) {
- GList *v = e_vcard_attribute_param_get_values (param);
- email_num = v ? atoi (v->data) : -1;
- }
- else if (!g_ascii_strcasecmp (param_name,
- EVC_X_DEST_NAME)) {
- GList *v = e_vcard_attribute_param_get_values (param);
- name = v ? v->data : NULL;
- }
- else if (!g_ascii_strcasecmp (param_name,
- EVC_X_DEST_EMAIL)) {
- GList *v = e_vcard_attribute_param_get_values (param);
- email = v ? v->data : NULL;
- }
- else if (!g_ascii_strcasecmp (param_name,
- EVC_X_DEST_HTML_MAIL)) {
- GList *v = e_vcard_attribute_param_get_values (param);
- html_pref = v ? !g_ascii_strcasecmp (v->data, "true") : FALSE;
- }
- }
-
- if (contact_uid) e_destination_set_contact_uid (list_dest, contact_uid, email_num);
- if (name) e_destination_set_name (list_dest, name);
- if (email) e_destination_set_email (list_dest, email);
- e_destination_set_html_mail_pref (list_dest, html_pref);
-
- e_contact_list_model_add_destination (E_CONTACT_LIST_MODEL (editor->model), list_dest);
- }
-
- g_list_foreach (email_list, (GFunc) e_vcard_attribute_free, NULL);
- g_list_free (email_list);
-
- photo = e_contact_get (editor->contact, E_CONTACT_LOGO);
- if (photo) {
- e_image_chooser_set_image_data (E_IMAGE_CHOOSER (editor->list_image), photo->data, photo->length);
- e_contact_photo_free (photo);
- }
- }
-
- if (editor->book) {
- ESource *source;
-
- source = e_book_get_source (editor->book);
- e_source_option_menu_select (E_SOURCE_OPTION_MENU (editor->source_menu), source);
- gtk_widget_set_sensitive (editor->source_menu, editor->is_new_list);
- gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "source-label"), editor->is_new_list);
- }
-}
diff --git a/addressbook/gui/contact-list-editor/e-contact-list-editor.etspec b/addressbook/gui/contact-list-editor/e-contact-list-editor.etspec
deleted file mode 100644
index 6d5f4f2514..0000000000
--- a/addressbook/gui/contact-list-editor/e-contact-list-editor.etspec
+++ /dev/null
@@ -1,7 +0,0 @@
-<ETableSpecification no-headers="true" cursor-mode="line" selection-mode="single">
-<ETableColumn model_col= "0" _title="Contact" expansion="1.0" minimum_width="20" resizable="true" cell="string" compare="string" />
- <ETableState>
- <column source="0"/>
- <grouping> </grouping>
- </ETableState>
-</ETableSpecification>
diff --git a/addressbook/gui/contact-list-editor/e-contact-list-editor.h b/addressbook/gui/contact-list-editor/e-contact-list-editor.h
deleted file mode 100644
index af1f8e1163..0000000000
--- a/addressbook/gui/contact-list-editor/e-contact-list-editor.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-list-editor.h
- * Copyright (C) 2001 Ximian, Inc.
- * Author: Chris Toshok <toshok@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-#ifndef __E_CONTACT_LIST_EDITOR_H__
-#define __E_CONTACT_LIST_EDITOR_H__
-
-#include <libgnomeui/gnome-app.h>
-#include <libgnomeui/gnome-app-helper.h>
-#include <glade/glade.h>
-#include <gal/e-table/e-table-model.h>
-#include <libedataserverui/e-name-selector.h>
-
-#include "addressbook/gui/contact-editor/eab-editor.h"
-
-#include <libebook/e-book.h>
-#include <libebook/e-contact.h>
-#include <libebook/e-destination.h>
-
-G_BEGIN_DECLS
-
-#define E_TYPE_CONTACT_LIST_EDITOR (e_contact_list_editor_get_type ())
-#define E_CONTACT_LIST_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CONTACT_LIST_EDITOR, EContactListEditor))
-#define E_CONTACT_LIST_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CONTACT_LIST_EDITOR, EContactListEditorClass))
-#define E_IS_CONTACT_LIST_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CONTACT_LIST_EDITOR))
-#define E_IS_CONTACT_LIST_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_CONTACT_LIST_EDITOR))
-
-typedef struct _EContactListEditor EContactListEditor;
-typedef struct _EContactListEditorClass EContactListEditorClass;
-
-struct _EContactListEditor
-{
- EABEditor parent;
-
- /* item specific fields */
- EBook *book;
-
- EContact *contact;
-
- GladeXML *gui;
- GtkWidget *app;
-
- GtkWidget *table;
- ETableModel *model;
- GtkWidget *email_entry;
- GtkWidget *list_name_entry;
- GtkWidget *add_button;
- GtkWidget *remove_button;
- GtkWidget *select_button;
- GtkWidget *list_image_button;
- GtkWidget *visible_addrs_checkbutton;
- GtkWidget *list_image;
- GtkWidget *source_menu;
- GtkWidget *ok_button;
- GtkWidget *cancel_button;
-
- ENameSelector *name_selector;
-
- /* Whether we are editing a new contact or an existing one */
- guint is_new_list : 1;
-
- /* Whether the image chooser widget has been changed. */
- guint image_set : 1;
-
- /* Whether the contact has been changed since bringing up the contact editor */
- guint changed : 1;
-
- /* Whether the contact editor will accept modifications */
- guint editable : 1;
-
- /* Whether the target book accepts storing of contact lists */
- guint allows_contact_lists : 1;
-
- /* Whether an async wombat call is in progress */
- guint in_async_call : 1;
-
- /* ID for async load_source call */
- guint load_source_id;
- EBook *load_book;
-};
-
-struct _EContactListEditorClass
-{
- EABEditorClass parent_class;
-};
-
-EContactListEditor *e_contact_list_editor_new (EBook *book,
- EContact *list_contact,
- gboolean is_new_list,
- gboolean editable);
-GType e_contact_list_editor_get_type (void);
-
-gboolean e_contact_list_editor_request_close_all (void);
-
-G_END_DECLS
-
-
-#endif /* __E_CONTACT_LIST_EDITOR_H__ */
diff --git a/addressbook/gui/contact-list-editor/e-contact-list-model.c b/addressbook/gui/contact-list-editor/e-contact-list-model.c
deleted file mode 100644
index 4560413c19..0000000000
--- a/addressbook/gui/contact-list-editor/e-contact-list-model.c
+++ /dev/null
@@ -1,284 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#include <config.h>
-#include <string.h>
-#include "e-contact-list-model.h"
-#include "widgets/misc/e-error.h"
-
-#include <gtk/gtkmessagedialog.h>
-#define PARENT_TYPE e_table_model_get_type()
-static ETableModelClass *parent_class;
-
-#define COLS 1
-
-/* This function returns the number of columns in our ETableModel. */
-static int
-contact_list_col_count (ETableModel *etc)
-{
- return COLS;
-}
-
-/* This function returns the number of rows in our ETableModel. */
-static int
-contact_list_row_count (ETableModel *etc)
-{
- EContactListModel *model = E_CONTACT_LIST_MODEL (etc);
- return model->data_count;
-}
-
-/* This function returns the value at a particular point in our ETableModel. */
-static void *
-contact_list_value_at (ETableModel *etc, int col, int row)
-{
- EContactListModel *model = E_CONTACT_LIST_MODEL (etc);
-
- return (void *) e_destination_get_textrep (model->data[row], TRUE);
-}
-
-/* This function sets the value at a particular point in our ETableModel. */
-static void
-contact_list_set_value_at (ETableModel *etc, int col, int row, const void *val)
-{
- /* nothing */
-}
-
-/* This function returns whether a particular cell is editable. */
-static gboolean
-contact_list_is_cell_editable (ETableModel *etc, int col, int row)
-{
- return FALSE;
-}
-
-/* This function duplicates the value passed to it. */
-static void *
-contact_list_duplicate_value (ETableModel *etc, int col, const void *value)
-{
- return g_strdup(value);
-}
-
-/* This function frees the value passed to it. */
-static void
-contact_list_free_value (ETableModel *etc, int col, void *value)
-{
- g_free(value);
-}
-
-static void *
-contact_list_initialize_value (ETableModel *etc, int col)
-{
- return g_strdup("");
-}
-
-static gboolean
-contact_list_value_is_empty (ETableModel *etc, int col, const void *value)
-{
- return !(value && *(char *)value);
-}
-
-static char *
-contact_list_value_to_string (ETableModel *etc, int col, const void *value)
-{
- return g_strdup(value);
-}
-
-static void
-contact_list_model_dispose (GObject *o)
-{
- EContactListModel *model = E_CONTACT_LIST_MODEL (o);
- int i;
-
- if (model->data != NULL) {
- for (i = 0; i < model->data_count; i ++) {
- g_object_unref (model->data[i]);
- }
- g_free (model->data);
- model->data = NULL;
- }
-
- model->data_count = 0;
- model->data_alloc = 0;
-
- (* G_OBJECT_CLASS (parent_class)->dispose) (o);
-}
-
-static void
-e_contact_list_model_class_init (GObjectClass *object_class)
-{
- ETableModelClass *model_class = (ETableModelClass *) object_class;
-
- parent_class = g_type_class_ref (PARENT_TYPE);
-
- object_class->dispose = contact_list_model_dispose;
-
- model_class->column_count = contact_list_col_count;
- model_class->row_count = contact_list_row_count;
- model_class->value_at = contact_list_value_at;
- model_class->set_value_at = contact_list_set_value_at;
- model_class->is_cell_editable = contact_list_is_cell_editable;
- model_class->duplicate_value = contact_list_duplicate_value;
- model_class->free_value = contact_list_free_value;
- model_class->initialize_value = contact_list_initialize_value;
- model_class->value_is_empty = contact_list_value_is_empty;
- model_class->value_to_string = contact_list_value_to_string;
-}
-
-static void
-e_contact_list_model_init (GObject *object)
-{
- EContactListModel *model = E_CONTACT_LIST_MODEL(object);
-
- model->data_alloc = 10;
- model->data_count = 0;
- model->data = g_new (EDestination*, model->data_alloc);
-}
-
-GType
-e_contact_list_model_get_type (void)
-{
- static GType cle_type = 0;
-
- if (!cle_type) {
- static const GTypeInfo cle_info = {
- sizeof (EContactListModelClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) e_contact_list_model_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EContactListModel),
- 0, /* n_preallocs */
- (GInstanceInitFunc) e_contact_list_model_init,
- };
-
- cle_type = g_type_register_static (E_TABLE_MODEL_TYPE, "EContactListModel", &cle_info, 0);
- }
-
- return cle_type;
-}
-
-void
-e_contact_list_model_construct (EContactListModel *model)
-{
-}
-
-ETableModel *
-e_contact_list_model_new ()
-{
- EContactListModel *model;
-
- model = g_object_new (E_TYPE_CONTACT_LIST_MODEL, NULL);
-
- e_contact_list_model_construct (model);
-
- return E_TABLE_MODEL(model);
-}
-
-void
-e_contact_list_model_add_destination (EContactListModel *model, EDestination *dest)
-{
- g_return_if_fail (E_IS_CONTACT_LIST_MODEL (model));
- g_return_if_fail (E_IS_DESTINATION (dest));
-
- e_table_model_pre_change (E_TABLE_MODEL (model));
-
- if (model->data_count + 1 >= model->data_alloc) {
- model->data_alloc *= 2;
- model->data = g_renew (EDestination*, model->data, model->data_alloc);
- }
-
- model->data[model->data_count ++] = dest;
- g_object_ref (dest);
-
- e_table_model_row_inserted (E_TABLE_MODEL (model), model->data_count - 1);
-}
-
-void
-e_contact_list_model_add_email (EContactListModel *model,
- const char *email)
-{
- EDestination *new_dest;
- char *list_email;
- int row;
- int row_count;
-
- g_return_if_fail (E_IS_CONTACT_LIST_MODEL (model));
- g_return_if_fail (email != NULL);
-
- row_count = e_table_model_row_count (E_TABLE_MODEL (model));
-
- for (row = 0; row < row_count; row++) {
- list_email = (char *) e_table_model_value_at (E_TABLE_MODEL (model), 1, row);
-
- if (strcmp (list_email, email) == 0) {
- if (e_error_run (NULL, "addressbook:ask-list-add-exists",
- email) != GTK_RESPONSE_YES)
- return;
- break;
- }
- }
-
- new_dest = e_destination_new ();
- e_destination_set_email (new_dest, email);
-
- e_contact_list_model_add_destination (model, new_dest);
-}
-
-void
-e_contact_list_model_add_contact (EContactListModel *model,
- EContact *contact,
- int email_num)
-{
- EDestination *new_dest;
-
- g_return_if_fail (E_IS_CONTACT_LIST_MODEL (model));
- g_return_if_fail (E_IS_CONTACT (contact));
-
- new_dest = e_destination_new ();
- e_destination_set_contact (new_dest, contact, email_num);
-
- e_contact_list_model_add_destination (model, new_dest);
-}
-
-void
-e_contact_list_model_remove_row (EContactListModel *model, int row)
-{
- g_return_if_fail (E_IS_CONTACT_LIST_MODEL (model));
- g_return_if_fail (0 <= row && row < model->data_count);
-
- e_table_model_pre_change (E_TABLE_MODEL (model));
-
- g_object_unref (model->data[row]);
- memmove (model->data + row, model->data + row + 1, sizeof (EDestination*) * (model->data_count - row - 1));
- model->data_count --;
-
- e_table_model_row_deleted (E_TABLE_MODEL (model), row);
-}
-
-void
-e_contact_list_model_remove_all (EContactListModel *model)
-{
- int i;
-
- g_return_if_fail (E_IS_CONTACT_LIST_MODEL (model));
-
- e_table_model_pre_change (E_TABLE_MODEL (model));
-
- for (i = 0; i < model->data_count; i ++) {
- g_object_unref (model->data[i]);
- model->data[i] = NULL;
- }
-
- model->data_count = 0;
-
- e_table_model_changed (E_TABLE_MODEL (model));
-}
-
-
-const EDestination *
-e_contact_list_model_get_destination (EContactListModel *model, int row)
-{
- g_return_val_if_fail (E_IS_CONTACT_LIST_MODEL (model), NULL);
- g_return_val_if_fail (0 <= row && row < model->data_count, NULL);
-
- return model->data[row];
-}
diff --git a/addressbook/gui/contact-list-editor/e-contact-list-model.h b/addressbook/gui/contact-list-editor/e-contact-list-model.h
deleted file mode 100644
index f7d2c50ced..0000000000
--- a/addressbook/gui/contact-list-editor/e-contact-list-model.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_CONTACT_LIST_MODEL_H_
-#define _E_CONTACT_LIST_MODEL_H_
-
-#include <gal/e-table/e-table-model.h>
-#include <libebook/e-contact.h>
-#include <libebook/e-destination.h>
-
-G_BEGIN_DECLS
-
-#define E_TYPE_CONTACT_LIST_MODEL (e_contact_list_model_get_type ())
-#define E_CONTACT_LIST_MODEL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_CONTACT_LIST_MODEL, EContactListModel))
-#define E_CONTACT_LIST_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), E_TYPE_CONTACT_LIST_MODEL, EContactListModelClass))
-#define E_IS_CONTACT_LIST_MODEL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_CONTACT_LIST_MODEL))
-#define E_IS_CONTACT_LIST_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_CONTACT_LIST_MODEL))
-
-typedef struct _EContactListModel EContactListModel;
-typedef struct _EContactListModelClass EContactListModelClass;
-
-struct _EContactListModel {
- ETableModel parent;
-
- EDestination **data;
- int data_count;
- int data_alloc;
-};
-
-
-struct _EContactListModelClass {
- ETableModelClass parent_class;
-};
-
-
-GType e_contact_list_model_get_type (void);
-void e_contact_list_model_construct (EContactListModel *model);
-ETableModel *e_contact_list_model_new (void);
-
-void e_contact_list_model_add_destination (EContactListModel *model, EDestination *dest);
-void e_contact_list_model_add_email (EContactListModel *model, const char *email);
-void e_contact_list_model_add_contact (EContactListModel *model, EContact *contact, int email_num);
-
-void e_contact_list_model_remove_row (EContactListModel *model, int row);
-void e_contact_list_model_remove_all (EContactListModel *model);
-
-const EDestination *e_contact_list_model_get_destination (EContactListModel *model, int row);
-
-G_END_DECLS
-
-#endif /* _E_CONTACT_LIST_MODEL_H_ */
diff --git a/addressbook/gui/merging/.cvsignore b/addressbook/gui/merging/.cvsignore
deleted file mode 100644
index b6fa83ca4c..0000000000
--- a/addressbook/gui/merging/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-*.gladep
diff --git a/addressbook/gui/merging/Makefile.am b/addressbook/gui/merging/Makefile.am
deleted file mode 100644
index f1d589ad00..0000000000
--- a/addressbook/gui/merging/Makefile.am
+++ /dev/null
@@ -1,24 +0,0 @@
-INCLUDES = \
- -DG_LOG_DOMAIN=\"eab-contact-merging\" \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -I$(top_srcdir) \
- -I$(top_srcdir)/addressbook \
- -I$(top_srcdir)/addressbook/backend \
- -I$(top_builddir)/addressbook/backend \
- $(EVOLUTION_ADDRESSBOOK_CFLAGS)
-
-noinst_LTLIBRARIES = \
- libeabbookmerging.la
-
-libeabbookmerging_la_SOURCES = \
- eab-contact-compare.c \
- eab-contact-compare.h \
- eab-contact-merging.c \
- eab-contact-merging.h
-
-
-glade_DATA = eab-contact-duplicate-detected.glade \
- eab-contact-commit-duplicate-detected.glade
-
-EXTRA_DIST = \
- $(glade_DATA)
diff --git a/addressbook/gui/merging/eab-contact-commit-duplicate-detected.glade b/addressbook/gui/merging/eab-contact-commit-duplicate-detected.glade
deleted file mode 100644
index 3ad86b40ba..0000000000
--- a/addressbook/gui/merging/eab-contact-commit-duplicate-detected.glade
+++ /dev/null
@@ -1,212 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkDialog" id="dialog-duplicate-contact">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="title" translatable="yes">Duplicate Contact Detected</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="has_separator">True</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="button3">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">1</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="button4">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-add</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">0</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table1">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="n_rows">5</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="Custom" id="custom-old-contact">
- <property name="visible">True</property>
- <property name="creation_function">_eab_contact_merging_create_contact_display</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Sun, 05 Oct 2003 03:54:20 GMT</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">The changed email or name of this contact already
-exists in this folder. Would you like to add it anyway?</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Conflicting Contact:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Changed Contact:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="custom-new-contact">
- <property name="visible">True</property>
- <property name="creation_function">_eab_contact_merging_create_contact_display</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Sun, 05 Oct 2003 03:53:42 GMT</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="alignment1">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0</property>
- <property name="xscale">1</property>
- <property name="yscale">0</property>
-
- <child>
- <widget class="Custom" id="custom2">
- <property name="visible">True</property>
- <property name="creation_function">e_create_image_widget</property>
- <property name="string1">stock_person</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Fri, 08 Jun 2001 00:18:39 GMT</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">5</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/addressbook/gui/merging/eab-contact-compare.c b/addressbook/gui/merging/eab-contact-compare.c
deleted file mode 100644
index 4244f3fbff..0000000000
--- a/addressbook/gui/merging/eab-contact-compare.c
+++ /dev/null
@@ -1,798 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * eab-contact-compare.c
- *
- * Copyright (C) 2001, 2002, 2003 Ximian, Inc.
- *
- * Authors: Jon Trowbridge <trow@ximian.com>
- * Chris Toshok <toshok@ximian.com>
- */
-
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA.
- */
-
-#include <config.h>
-#include <ctype.h>
-#include <string.h>
-#include "util/eab-book-util.h"
-#include "../component/addressbook.h"
-#include "eab-contact-compare.h"
-
-/* This is an "optimistic" combiner: the best of the two outcomes is
- selected. */
-static EABContactMatchType
-combine_comparisons (EABContactMatchType prev,
- EABContactMatchType new_info)
-{
- if (new_info == EAB_CONTACT_MATCH_NOT_APPLICABLE)
- return prev;
- return (EABContactMatchType) MAX ((gint) prev, (gint) new_info);
-}
-
-
-/*** Name comparisons ***/
-
-/* This *so* doesn't belong here... at least not implemented in a
- sucky way like this. But it can be fixed later. */
-
-/* This is very Anglocentric. */
-static gchar *name_synonyms[][2] = {
- { "jon", "john" }, /* Ah, the hacker's perogative */
- { "joseph", "joe" },
- { "robert", "bob" },
- { "gene", "jean" },
- { "jesse", "jessie" },
- { "ian", "iain" },
- { "richard", "dick" },
- { "william", "bill" },
- { "william", "will" },
- { "anthony", "tony" },
- { "michael", "mike" },
- { "eric", "erik" },
- { "elizabeth", "liz" },
- { "jeff", "geoff" },
- { "jeff", "geoffrey" },
- { "tom", "thomas" },
- { "dave", "david" },
- { "jim", "james" },
- { "abigal", "abby" },
- { "amanda", "amy" },
- { "amanda", "manda" },
- { "jennifer", "jenny" },
- { "christopher", "chris" },
- { "rebecca", "becca" },
- { "rebecca", "becky" },
- { "anderson", "andersen" },
- { "johnson", "johnsen" },
- /* We could go on and on... */
- /* We should add soundex here. */
- { NULL, NULL }
-};
-
-static gboolean
-name_fragment_match (const gchar *a, const gchar *b, gboolean strict)
-{
- gint len;
-
- if (!(a && b && *a && *b))
- return FALSE;
-
- /* If we are in 'strict' mode, b must match the beginning of a.
- So "Robert", "Rob" would match, but "Robert", "Robbie" wouldn't.
-
- If strict is FALSE, it is sufficient for the strings to share
- some leading characters. In this case, "Robert" and "Robbie"
- would match, as would "Dave" and "Dan". */
-
- if (strict) {
- len = g_utf8_strlen (b, -1);
- } else {
- len = MIN (g_utf8_strlen (a, -1), g_utf8_strlen (b, -1));
- }
-
- return !e_utf8_casefold_collate_len (a, b, len);
-}
-
-static gboolean
-name_fragment_match_with_synonyms (const gchar *a, const gchar *b, gboolean strict)
-{
- gint i;
-
- if (!(a && b && *a && *b))
- return FALSE;
-
- if (name_fragment_match (a, b, strict))
- return TRUE;
-
- /* Check for nicknames. Yes, the linear search blows. */
- for (i=0; name_synonyms[i][0]; ++i) {
-
- if (!e_utf8_casefold_collate (name_synonyms[i][0], a)
- && !e_utf8_casefold_collate (name_synonyms[i][1], b))
- return TRUE;
-
- if (!e_utf8_casefold_collate (name_synonyms[i][0], b)
- && !e_utf8_casefold_collate (name_synonyms[i][1], a))
- return TRUE;
- }
-
- return FALSE;
-}
-
-EABContactMatchType
-eab_contact_compare_name_to_string (EContact *contact, const gchar *str)
-{
- return eab_contact_compare_name_to_string_full (contact, str, FALSE, NULL, NULL, NULL);
-}
-
-EABContactMatchType
-eab_contact_compare_name_to_string_full (EContact *contact, const gchar *str, gboolean allow_partial_matches,
- gint *matched_parts_out, EABContactMatchPart *first_matched_part_out, gint *matched_character_count_out)
-{
- gchar **namev, **givenv = NULL, **addv = NULL, **familyv = NULL;
-
- gint matched_parts = EAB_CONTACT_MATCH_PART_NONE;
- EABContactMatchPart first_matched_part = EAB_CONTACT_MATCH_PART_NONE;
- EABContactMatchPart this_part_match = EAB_CONTACT_MATCH_PART_NOT_APPLICABLE;
- EABContactMatchType match_type;
- EContactName *contact_name;
-
- gint match_count = 0, matched_character_count = 0, fragment_count;
- gint i, j;
- gchar *str_cpy, *s;
-
- g_return_val_if_fail (E_IS_CONTACT (contact), EAB_CONTACT_MATCH_NOT_APPLICABLE);
-
- if (!e_contact_get_const (contact, E_CONTACT_FULL_NAME))
- return EAB_CONTACT_MATCH_NOT_APPLICABLE;
- if (str == NULL)
- return EAB_CONTACT_MATCH_NOT_APPLICABLE;
-
- str_cpy = s = g_strdup (str);
- while (*s) {
- if (*s == ',' || *s == '"')
- *s = ' ';
- ++s;
- }
- namev = g_strsplit (str_cpy, " ", 0);
- g_free (str_cpy);
-
- contact_name = e_contact_get (contact, E_CONTACT_NAME);
-
- if (contact_name->given)
- givenv = g_strsplit (contact_name->given, " ", 0);
- if (contact_name->additional)
- addv = g_strsplit (contact_name->additional, " ", 0);
- if (contact_name->family)
- familyv = g_strsplit (contact_name->family, " ", 0);
-
- e_contact_name_free (contact_name);
-
- fragment_count = 0;
- for (i = 0; givenv && givenv[i]; ++i)
- ++fragment_count;
- for (i = 0; addv && addv[i]; ++i)
- ++fragment_count;
- for (i = 0; familyv && familyv[i]; ++i)
- ++fragment_count;
-
- for (i = 0; namev[i] && this_part_match != EAB_CONTACT_MATCH_PART_NONE; ++i) {
-
- if (*namev[i]) {
-
- this_part_match = EAB_CONTACT_MATCH_PART_NONE;
-
- /* When we are allowing partials, we are strict about the matches we allow.
- Does this make sense? Not really, but it does the right thing for the purposes
- of completion. */
-
- if (givenv && this_part_match == EAB_CONTACT_MATCH_PART_NONE) {
- for (j = 0; givenv[j]; ++j) {
- if (name_fragment_match_with_synonyms (givenv[j], namev[i], allow_partial_matches)) {
-
- this_part_match = EAB_CONTACT_MATCH_PART_GIVEN_NAME;
-
- /* We remove a piece of a name once it has been matched against, so
- that "john john" won't match "john doe". */
- g_free (givenv[j]);
- givenv[j] = g_strdup ("");
- break;
- }
- }
- }
-
- if (addv && this_part_match == EAB_CONTACT_MATCH_PART_NONE) {
- for (j = 0; addv[j]; ++j) {
- if (name_fragment_match_with_synonyms (addv[j], namev[i], allow_partial_matches)) {
-
- this_part_match = EAB_CONTACT_MATCH_PART_ADDITIONAL_NAME;
-
- g_free (addv[j]);
- addv[j] = g_strdup ("");
- break;
- }
- }
- }
-
- if (familyv && this_part_match == EAB_CONTACT_MATCH_PART_NONE) {
- for (j = 0; familyv[j]; ++j) {
- if (allow_partial_matches ? name_fragment_match_with_synonyms (familyv[j], namev[i], allow_partial_matches)
- : !e_utf8_casefold_collate (familyv[j], namev[i])) {
-
- this_part_match = EAB_CONTACT_MATCH_PART_FAMILY_NAME;
-
- g_free (familyv[j]);
- familyv[j] = g_strdup ("");
- break;
- }
- }
- }
-
- if (this_part_match != EAB_CONTACT_MATCH_PART_NONE) {
- ++match_count;
- matched_character_count += g_utf8_strlen (namev[i], -1);
- matched_parts |= this_part_match;
- if (first_matched_part == EAB_CONTACT_MATCH_PART_NONE)
- first_matched_part = this_part_match;
- }
- }
- }
-
- match_type = EAB_CONTACT_MATCH_NONE;
-
- if (this_part_match != EAB_CONTACT_MATCH_PART_NONE) {
-
- if (match_count > 0)
- match_type = EAB_CONTACT_MATCH_VAGUE;
-
- if (fragment_count == match_count) {
-
- match_type = EAB_CONTACT_MATCH_EXACT;
-
- } else if (fragment_count == match_count + 1) {
-
- match_type = EAB_CONTACT_MATCH_PARTIAL;
-
- }
- }
-
- if (matched_parts_out)
- *matched_parts_out = matched_parts;
- if (first_matched_part_out)
- *first_matched_part_out = first_matched_part;
- if (matched_character_count_out)
- *matched_character_count_out = matched_character_count;
-
- g_strfreev (namev);
- g_strfreev (givenv);
- g_strfreev (addv);
- g_strfreev (familyv);
-
- return match_type;
-}
-
-EABContactMatchType
-eab_contact_compare_file_as (EContact *contact1, EContact *contact2)
-{
- EABContactMatchType match_type;
- gchar *a, *b;
-
- g_return_val_if_fail (E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE);
- g_return_val_if_fail (E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE);
-
- a = e_contact_get (contact1, E_CONTACT_FILE_AS);
- b = e_contact_get (contact2, E_CONTACT_FILE_AS);
-
- if (a == NULL || b == NULL) {
- g_free (a);
- g_free (b);
- return EAB_CONTACT_MATCH_NOT_APPLICABLE;
- }
-
- if (!strcmp (a, b))
- match_type = EAB_CONTACT_MATCH_EXACT;
- else if (g_utf8_validate (a, -1, NULL) && g_utf8_validate (b, -1, NULL) &&
- !g_utf8_collate (a, b))
- match_type = EAB_CONTACT_MATCH_PARTIAL;
- else
- match_type = EAB_CONTACT_MATCH_NONE;
-
- g_free (a);
- g_free (b);
- return match_type;
-}
-
-EABContactMatchType
-eab_contact_compare_name (EContact *contact1, EContact *contact2)
-{
- EContactName *a, *b;
- gint matches=0, possible=0;
- gboolean given_match = FALSE, additional_match = FALSE, family_match = FALSE;
-
- g_return_val_if_fail (E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE);
- g_return_val_if_fail (E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE);
-
- a = e_contact_get (contact1, E_CONTACT_NAME);
- b = e_contact_get (contact2, E_CONTACT_NAME);
-
- if (a == NULL || b == NULL) {
- g_free (a);
- g_free (b);
- return EAB_CONTACT_MATCH_NOT_APPLICABLE;
- }
-
- if (a->given && b->given && *a->given && *b->given) {
- ++possible;
- if (name_fragment_match_with_synonyms (a->given, b->given, FALSE /* both inputs are complete */)) {
- ++matches;
- given_match = TRUE;
- }
- }
-
- if (a->additional && b->additional && *a->additional && *b->additional) {
- ++possible;
- if (name_fragment_match_with_synonyms (a->additional, b->additional, FALSE /* both inputs are complete */)) {
- ++matches;
- additional_match = TRUE;
- }
- }
-
- if (a->family && b->family && *a->family && *b->family) {
- ++possible;
- /* We don't allow "loose matching" (i.e. John vs. Jon) on family names */
- if (! e_utf8_casefold_collate (a->family, b->family)) {
- ++matches;
- family_match = TRUE;
- }
- }
-
- e_contact_name_free (a);
- e_contact_name_free (b);
-
- /* Now look at the # of matches and try to intelligently map
- an EAB_CONTACT_MATCH_* type to it. Special consideration is given
- to family-name matches. */
-
- if (possible == 0)
- return EAB_CONTACT_MATCH_NOT_APPLICABLE;
-
- if (possible == 1)
- return family_match ? EAB_CONTACT_MATCH_VAGUE : EAB_CONTACT_MATCH_NONE;
-
- if (possible == matches)
- return family_match ? EAB_CONTACT_MATCH_EXACT : EAB_CONTACT_MATCH_PARTIAL;
-
- if (possible == matches+1)
- return family_match ? EAB_CONTACT_MATCH_VAGUE : EAB_CONTACT_MATCH_NONE;
-
- return EAB_CONTACT_MATCH_NONE;
-}
-
-
-/*** Nickname Comparisons ***/
-
-EABContactMatchType
-eab_contact_compare_nickname (EContact *contact1, EContact *contact2)
-{
- g_return_val_if_fail (contact1 && E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE);
- g_return_val_if_fail (contact2 && E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE);
-
- return EAB_CONTACT_MATCH_NOT_APPLICABLE;
-}
-
-
-
-/*** E-mail Comparisons ***/
-
-static gboolean
-match_email_username (const gchar *addr1, const gchar *addr2)
-{
- gint c1, c2;
- if (addr1 == NULL || addr2 == NULL)
- return FALSE;
-
- while (*addr1 && *addr2 && *addr1 != '@' && *addr2 != '@') {
- c1 = isupper (*addr1) ? tolower (*addr1) : *addr1;
- c2 = isupper (*addr2) ? tolower (*addr2) : *addr2;
- if (c1 != c2)
- return FALSE;
- ++addr1;
- ++addr2;
- }
-
- return *addr1 == *addr2;
-}
-
-static gboolean
-match_email_hostname (const gchar *addr1, const gchar *addr2)
-{
- gint c1, c2;
- gboolean seen_at1, seen_at2;
- if (addr1 == NULL || addr2 == NULL)
- return FALSE;
-
- /* Walk to the end of each string. */
- seen_at1 = FALSE;
- if (*addr1) {
- while (*addr1) {
- if (*addr1 == '@')
- seen_at1 = TRUE;
- ++addr1;
- }
- --addr1;
- }
-
- seen_at2 = FALSE;
- if (*addr2) {
- while (*addr2) {
- if (*addr2 == '@')
- seen_at2 = TRUE;
- ++addr2;
- }
- --addr2;
- }
-
- if (!seen_at1 && !seen_at2)
- return TRUE;
- if (!seen_at1 || !seen_at2)
- return FALSE;
-
- while (*addr1 != '@' && *addr2 != '@') {
- c1 = isupper (*addr1) ? tolower (*addr1) : *addr1;
- c2 = isupper (*addr2) ? tolower (*addr2) : *addr2;
- if (c1 != c2)
- return FALSE;
- --addr1;
- --addr2;
- }
-
- /* This will match bob@foo.ximian.com and bob@ximian.com */
- return *addr1 == '.' || *addr2 == '.';
-}
-
-static EABContactMatchType
-compare_email_addresses (const gchar *addr1, const gchar *addr2)
-{
- if (addr1 == NULL || *addr1 == 0 ||
- addr2 == NULL || *addr2 == 0)
- return EAB_CONTACT_MATCH_NOT_APPLICABLE;
-
- if (match_email_username (addr1, addr2))
- return match_email_hostname (addr1, addr2) ? EAB_CONTACT_MATCH_EXACT : EAB_CONTACT_MATCH_VAGUE;
-
- return EAB_CONTACT_MATCH_NONE;
-}
-
-EABContactMatchType
-eab_contact_compare_email (EContact *contact1, EContact *contact2)
-{
- EABContactMatchType match = EAB_CONTACT_MATCH_NOT_APPLICABLE;
- GList *contact1_email, *contact2_email;
- GList *i1, *i2;
-
- g_return_val_if_fail (contact1 && E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE);
- g_return_val_if_fail (contact2 && E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE);
-
- contact1_email = e_contact_get (contact1, E_CONTACT_EMAIL);
- contact2_email = e_contact_get (contact2, E_CONTACT_EMAIL);
-
- if (contact1_email == NULL || contact2_email == NULL) {
- g_list_foreach (contact1_email, (GFunc)g_free, NULL);
- g_list_free (contact1_email);
-
- g_list_foreach (contact2_email, (GFunc)g_free, NULL);
- g_list_free (contact2_email);
- return EAB_CONTACT_MATCH_NOT_APPLICABLE;
- }
-
- i1 = contact1_email;
-
- /* Do pairwise-comparisons on all of the e-mail addresses. If
- we find an exact match, there is no reason to keep
- checking. */
- while (i1 && match != EAB_CONTACT_MATCH_EXACT) {
- char *addr1 = (char *) i1->data;
-
- i2 = contact2_email;
- while (i2 && match != EAB_CONTACT_MATCH_EXACT) {
- char *addr2 = (char *) i2->data;
-
- match = combine_comparisons (match, compare_email_addresses (addr1, addr2));
-
- i2 = i2->next;
- }
-
- i1 = i1->next;
- }
-
- g_list_foreach (contact1_email, (GFunc)g_free, NULL);
- g_list_free (contact1_email);
-
- g_list_foreach (contact2_email, (GFunc)g_free, NULL);
- g_list_free (contact2_email);
-
- return match;
-}
-
-EABContactMatchType
-eab_contact_compare_address (EContact *contact1, EContact *contact2)
-{
- g_return_val_if_fail (contact1 && E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE);
- g_return_val_if_fail (contact2 && E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE);
-
- /* Unimplemented */
-
- return EAB_CONTACT_MATCH_NOT_APPLICABLE;
-}
-
-EABContactMatchType
-eab_contact_compare_telephone (EContact *contact1, EContact *contact2)
-{
- g_return_val_if_fail (contact1 && E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE);
- g_return_val_if_fail (contact2 && E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE);
-
- /* Unimplemented */
-
- return EAB_CONTACT_MATCH_NOT_APPLICABLE;
-}
-
-EABContactMatchType
-eab_contact_compare (EContact *contact1, EContact *contact2)
-{
- EABContactMatchType result;
-
- g_return_val_if_fail (contact1 && E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE);
- g_return_val_if_fail (contact2 && E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE);
-
- result = EAB_CONTACT_MATCH_NONE;
- result = combine_comparisons (result, eab_contact_compare_name (contact1, contact2));
- result = combine_comparisons (result, eab_contact_compare_nickname (contact1, contact2));
- result = combine_comparisons (result, eab_contact_compare_email (contact1, contact2));
- result = combine_comparisons (result, eab_contact_compare_address (contact1, contact2));
- result = combine_comparisons (result, eab_contact_compare_telephone (contact1, contact2));
- result = combine_comparisons (result, eab_contact_compare_file_as (contact1, contact2));
-
- return result;
-}
-
-typedef struct _MatchSearchInfo MatchSearchInfo;
-struct _MatchSearchInfo {
- EContact *contact;
- GList *avoid;
- EABContactMatchQueryCallback cb;
- gpointer closure;
-};
-
-static void
-match_search_info_free (MatchSearchInfo *info)
-{
- if (info) {
- g_object_unref (info->contact);
-
- /* This should already have been deallocated, but just in case... */
- if (info->avoid) {
- g_list_foreach (info->avoid, (GFunc) g_object_unref, NULL);
- g_list_free (info->avoid);
- info->avoid = NULL;
- }
-
- g_free (info);
- }
-}
-
-static void
-query_cb (EBook *book, EBookStatus status, GList *contacts, gpointer closure)
-{
- /* XXX we need to free contacts */
- MatchSearchInfo *info = (MatchSearchInfo *) closure;
- EABContactMatchType best_match = EAB_CONTACT_MATCH_NONE;
- EContact *best_contact = NULL;
- GList *remaining_contacts = NULL;
- const GList *i;
-
- if (status != E_BOOK_ERROR_OK) {
- info->cb (info->contact, NULL, EAB_CONTACT_MATCH_NONE, info->closure);
- match_search_info_free (info);
- return;
- }
-
- /* remove the contacts we're to avoid from the list, if they're present */
- for (i = contacts; i != NULL; i = g_list_next (i)) {
- EContact *this_contact = E_CONTACT (i->data);
- const gchar *this_uid;
- GList *iterator;
- gboolean avoid = FALSE;
-
- this_uid = e_contact_get_const (this_contact, E_CONTACT_UID);
- if (!this_uid)
- continue;
-
- for (iterator = info->avoid; iterator; iterator = iterator->next) {
- const gchar *avoid_uid;
-
- avoid_uid = e_contact_get_const (iterator->data, E_CONTACT_UID);
- if (!avoid_uid)
- continue;
-
- if (!strcmp (avoid_uid, this_uid)) {
- avoid = TRUE;
- break;
- }
- }
- if (!avoid)
- remaining_contacts = g_list_prepend (remaining_contacts, this_contact);
- }
-
- remaining_contacts = g_list_reverse (remaining_contacts);
-
- for (i = remaining_contacts; i != NULL; i = g_list_next (i)) {
- EContact *this_contact = E_CONTACT (i->data);
- EABContactMatchType this_match = eab_contact_compare (info->contact, this_contact);
- if ((gint)this_match > (gint)best_match) {
- best_match = this_match;
- best_contact = this_contact;
- }
- }
-
- g_list_free (remaining_contacts);
-
- info->cb (info->contact, best_contact, best_match, info->closure);
- match_search_info_free (info);
-}
-
-#define MAX_QUERY_PARTS 10
-static void
-use_common_book_cb (EBook *book, gpointer closure)
-{
- MatchSearchInfo *info = (MatchSearchInfo *) closure;
- EContact *contact = info->contact;
- EContactName *contact_name;
- GList *contact_email;
- gchar *query_parts[MAX_QUERY_PARTS];
- gint p=0;
- gchar *contact_file_as, *qj;
- EBookQuery *query = NULL;
- int i;
-
- if (book == NULL) {
- info->cb (info->contact, NULL, EAB_CONTACT_MATCH_NONE, info->closure);
- match_search_info_free (info);
- return;
- }
-
- contact_file_as = e_contact_get (contact, E_CONTACT_FILE_AS);
- if (contact_file_as) {
- query_parts [p++] = g_strdup_printf ("(contains \"file_as\" \"%s\")", contact_file_as);
- g_free (contact_file_as);
- }
-
- contact_name = e_contact_get (contact, E_CONTACT_NAME);
- if (contact_name) {
- if (contact_name->given && *contact_name->given)
- query_parts[p++] = g_strdup_printf ("(contains \"full_name\" \"%s\")", contact_name->given);
-
- if (contact_name->additional && *contact_name->additional)
- query_parts[p++] = g_strdup_printf ("(contains \"full_name\" \"%s\")", contact_name->additional);
-
- if (contact_name->family && *contact_name->family)
- query_parts[p++] = g_strdup_printf ("(contains \"full_name\" \"%s\")", contact_name->family);
-
- e_contact_name_free (contact_name);
- }
-
- contact_email = e_contact_get (contact, E_CONTACT_EMAIL);
- if (contact_email) {
- GList *iter;
- for (iter = contact_email; iter && p < MAX_QUERY_PARTS; iter = iter->next) {
- gchar *addr = g_strdup (iter->data);
- if (addr && *addr) {
- gchar *s = addr;
- while (*s) {
- if (*s == '@') {
- *s = '\0';
- break;
- }
- ++s;
- }
- query_parts[p++] = g_strdup_printf ("(beginswith \"email\" \"%s\")", addr);
- g_free (addr);
- }
- }
- }
- g_list_foreach (contact_email, (GFunc)g_free, NULL);
- g_list_free (contact_email);
-
-
- /* Build up our full query from the parts. */
- query_parts[p] = NULL;
- qj = g_strjoinv (" ", query_parts);
- for(i = 0; query_parts[i] != NULL; i++)
- g_free(query_parts[i]);
- if (p > 1) {
- char *s;
- s = g_strdup_printf ("(or %s)", qj);
- query = e_book_query_from_string (s);
- g_free (s);
- }
- else if (p == 1) {
- query = e_book_query_from_string (qj);
- }
- else {
- query = NULL;
- }
-
- if (query)
- e_book_async_get_contacts (book, query, query_cb, info);
- else
- query_cb (book, E_BOOK_ERROR_OK, NULL, info);
-
- g_free (qj);
- if (query)
- e_book_query_unref (query);
-}
-
-void
-eab_contact_locate_match (EContact *contact, EABContactMatchQueryCallback cb, gpointer closure)
-{
- MatchSearchInfo *info;
-
- g_return_if_fail (contact && E_IS_CONTACT (contact));
- g_return_if_fail (cb != NULL);
-
- info = g_new (MatchSearchInfo, 1);
- info->contact = contact;
- g_object_ref (contact);
- info->cb = cb;
- info->closure = closure;
- info->avoid = NULL;
-
- addressbook_load_default_book ((EBookCallback) use_common_book_cb, info);
-}
-
-/**
- * e_contact_locate_match_full:
- * @book: The book to look in. If this is NULL, use the default
- * addressbook.
- * @contact: The contact to compare to.
- * @avoid: A list of contacts to not match. These will not show up in the search.
- * @cb: The function to call.
- * @closure: The closure to add to the call.
- *
- * Look for the best match and return it using the EABContactMatchQueryCallback.
- **/
-void
-eab_contact_locate_match_full (EBook *book, EContact *contact, GList *avoid, EABContactMatchQueryCallback cb, gpointer closure)
-{
- MatchSearchInfo *info;
-
- g_return_if_fail (contact && E_IS_CONTACT (contact));
- g_return_if_fail (cb != NULL);
-
- info = g_new (MatchSearchInfo, 1);
- info->contact = contact;
- g_object_ref (contact);
- info->cb = cb;
- info->closure = closure;
- info->avoid = g_list_copy (avoid);
- g_list_foreach (info->avoid, (GFunc) g_object_ref, NULL);
-
- if (book)
- use_common_book_cb (book, info);
- else
- addressbook_load_default_book ((EBookCallback) use_common_book_cb, info);
-}
-
diff --git a/addressbook/gui/merging/eab-contact-compare.h b/addressbook/gui/merging/eab-contact-compare.h
deleted file mode 100644
index 153e44aef1..0000000000
--- a/addressbook/gui/merging/eab-contact-compare.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * eab-contact-compare.h
- *
- * Copyright (C) 2001,2002,2003 Ximian, Inc.
- *
- * Authors: Jon Trowbridge <trow@ximian.com>
- * Chris Toshok <toshok@ximian.com>
- */
-
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA.
- */
-
-#ifndef __EAB_CONTACT_COMPARE_H__
-#define __EAB_CONTACT_COMPARE_H__
-
-#include <libebook/e-book.h>
-#include <libebook/e-contact.h>
-
-typedef enum {
- EAB_CONTACT_MATCH_NOT_APPLICABLE = 0,
- EAB_CONTACT_MATCH_NONE = 1,
- EAB_CONTACT_MATCH_VAGUE = 2,
- EAB_CONTACT_MATCH_PARTIAL = 3,
- EAB_CONTACT_MATCH_EXACT = 4
-} EABContactMatchType;
-
-typedef enum {
- EAB_CONTACT_MATCH_PART_NOT_APPLICABLE = -1,
- EAB_CONTACT_MATCH_PART_NONE = 0,
- EAB_CONTACT_MATCH_PART_GIVEN_NAME = 1<<0,
- EAB_CONTACT_MATCH_PART_ADDITIONAL_NAME = 1<<2,
- EAB_CONTACT_MATCH_PART_FAMILY_NAME = 1<<3
-} EABContactMatchPart;
-
-typedef void (*EABContactMatchQueryCallback) (EContact *contact, EContact *match, EABContactMatchType type, gpointer closure);
-
-EABContactMatchType eab_contact_compare_name_to_string (EContact *contact, const gchar *str);
-
-EABContactMatchType eab_contact_compare_name_to_string_full (EContact *contact, const gchar *str,
- gboolean allow_partial_matches,
- gint *matched_parts, EABContactMatchPart *first_matched_part,
- gint *matched_character_count);
-
-EABContactMatchType eab_contact_compare_file_as (EContact *contact1, EContact *contact2);
-EABContactMatchType eab_contact_compare_name (EContact *contact1, EContact *contact2);
-EABContactMatchType eab_contact_compare_nickname (EContact *contact1, EContact *contact2);
-EABContactMatchType eab_contact_compare_email (EContact *contact1, EContact *contact2);
-EABContactMatchType eab_contact_compare_address (EContact *contact1, EContact *contact2);
-EABContactMatchType eab_contact_compare_telephone (EContact *contact1, EContact *contact2);
-
-EABContactMatchType eab_contact_compare (EContact *contact1, EContact *contact2);
-
-void eab_contact_locate_match (EContact *contact, EABContactMatchQueryCallback cb, gpointer closure);
-void eab_contact_locate_match_full (EBook *book, EContact *contact, GList *avoid, EABContactMatchQueryCallback cb, gpointer closure);
-
-
-
-#endif /* __E_CONTACT_COMPARE_H__ */
-
diff --git a/addressbook/gui/merging/eab-contact-duplicate-detected.glade b/addressbook/gui/merging/eab-contact-duplicate-detected.glade
deleted file mode 100644
index 0aea834b5c..0000000000
--- a/addressbook/gui/merging/eab-contact-duplicate-detected.glade
+++ /dev/null
@@ -1,222 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkDialog" id="dialog-duplicate-contact">
- <property name="visible">True</property>
- <property name="title" translatable="yes">Duplicate Contact Detected</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="has_separator">False</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="button4">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">1</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="button3">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-add</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">0</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table1">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="n_rows">5</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">12</property>
-
- <child>
- <widget class="Custom" id="custom-old-contact">
- <property name="visible">True</property>
- <property name="creation_function">_eab_contact_merging_create_contact_display</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Sun, 05 Oct 2003 03:55:10 GMT</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">The name or email address of this contact already exists
-in this folder. Would you like to add it anyway?</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Original Contact:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="label" translatable="yes">New Contact:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="custom-new-contact">
- <property name="visible">True</property>
- <property name="creation_function">_eab_contact_merging_create_contact_display</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Sun, 05 Oct 2003 03:54:50 GMT</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="alignment1">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0</property>
- <property name="xscale">1</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="Custom" id="custom2">
- <property name="visible">True</property>
- <property name="creation_function">e_create_image_widget</property>
- <property name="string1">stock_person</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Fri, 08 Jun 2001 00:18:39 GMT</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">5</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/addressbook/gui/merging/eab-contact-merging.c b/addressbook/gui/merging/eab-contact-merging.c
deleted file mode 100644
index a43c56043d..0000000000
--- a/addressbook/gui/merging/eab-contact-merging.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Code for checking for duplicates when doing EContact work.
- *
- * Authors:
- * Christopher James Lahey <clahey@ximian.com>
- * Chris Toshok <toshok@ximian.com>
- *
- * Copyright (C) 2001, 2002, 2003, Ximian, Inc.
- */
-
-#include <config.h>
-
-#include "eab-contact-merging.h"
-#include "eab-contact-compare.h"
-#include <glade/glade.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtkcontainer.h>
-#include "addressbook/gui/widgets/eab-contact-display.h"
-
-typedef enum {
- E_CONTACT_MERGING_ADD,
- E_CONTACT_MERGING_COMMIT
-} EContactMergingOpType;
-
-typedef struct {
- EContactMergingOpType op;
- EBook *book;
- EContact *contact;
- GList *avoid;
- EBookIdCallback id_cb;
- EBookCallback cb;
- gpointer closure;
-} EContactMergingLookup;
-
-static void match_query_callback (EContact *contact, EContact *match, EABContactMatchType type, gpointer closure);
-
-#define SIMULTANEOUS_MERGING_REQUESTS 20
-
-static GList *merging_queue = NULL;
-static int running_merge_requests = 0;
-
-
-static void
-add_lookup (EContactMergingLookup *lookup)
-{
- if (running_merge_requests < SIMULTANEOUS_MERGING_REQUESTS) {
- running_merge_requests++;
- eab_contact_locate_match_full (lookup->book, lookup->contact, lookup->avoid, match_query_callback, lookup);
- }
- else {
- merging_queue = g_list_append (merging_queue, lookup);
- }
-}
-
-static void
-finished_lookup (void)
-{
- running_merge_requests--;
-
- while (running_merge_requests < SIMULTANEOUS_MERGING_REQUESTS) {
- EContactMergingLookup *lookup;
-
- if (!merging_queue)
- break;
-
- lookup = merging_queue->data;
-
- merging_queue = g_list_remove_link (merging_queue, merging_queue);
-
- running_merge_requests++;
- eab_contact_locate_match_full (lookup->book, lookup->contact, lookup->avoid, match_query_callback, lookup);
- }
-}
-
-static void
-free_lookup (EContactMergingLookup *lookup)
-{
- g_object_unref (lookup->book);
- g_object_unref (lookup->contact);
- g_list_free (lookup->avoid);
-
- g_free (lookup);
-}
-
-static void
-final_id_cb (EBook *book, EBookStatus status, const char *id, gpointer closure)
-{
- EContactMergingLookup *lookup = closure;
-
- if (lookup->id_cb)
- lookup->id_cb (lookup->book, status, id, lookup->closure);
-
- free_lookup (lookup);
-
- finished_lookup ();
-}
-
-static void
-final_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- EContactMergingLookup *lookup = closure;
-
- if (lookup->cb)
- lookup->cb (lookup->book, status, lookup->closure);
-
- free_lookup (lookup);
-
- finished_lookup ();
-}
-
-static void
-doit (EContactMergingLookup *lookup)
-{
- if (lookup->op == E_CONTACT_MERGING_ADD)
- e_book_async_add_contact (lookup->book, lookup->contact, final_id_cb, lookup);
- else if (lookup->op == E_CONTACT_MERGING_COMMIT)
- e_book_async_commit_contact (lookup->book, lookup->contact, final_cb, lookup);
-}
-
-static void
-cancelit (EContactMergingLookup *lookup)
-{
- if (lookup->op == E_CONTACT_MERGING_ADD) {
- if (lookup->id_cb)
- final_id_cb (lookup->book, E_BOOK_ERROR_CANCELLED, NULL, lookup);
- } else if (lookup->op == E_CONTACT_MERGING_COMMIT) {
- if (lookup->cb)
- final_cb (lookup->book, E_BOOK_ERROR_CANCELLED, lookup);
- }
-}
-
-static void
-response (GtkWidget *dialog, int response, EContactMergingLookup *lookup)
-{
- gtk_widget_destroy (dialog);
-
- switch (response) {
- case 0:
- doit (lookup);
- break;
- case 1:
- cancelit (lookup);
- break;
- }
-}
-
-static void
-match_query_callback (EContact *contact, EContact *match, EABContactMatchType type, gpointer closure)
-{
- EContactMergingLookup *lookup = closure;
-
- if ((gint) type <= (gint) EAB_CONTACT_MATCH_VAGUE) {
- doit (lookup);
- } else {
- GladeXML *ui;
-
- GtkWidget *widget;
-
- if (lookup->op == E_CONTACT_MERGING_ADD)
- ui = glade_xml_new (EVOLUTION_GLADEDIR "/eab-contact-duplicate-detected.glade", NULL, NULL);
- else if (lookup->op == E_CONTACT_MERGING_COMMIT)
- ui = glade_xml_new (EVOLUTION_GLADEDIR "/eab-contact-commit-duplicate-detected.glade", NULL, NULL);
- else {
- doit (lookup);
- return;
- }
-
- widget = glade_xml_get_widget (ui, "custom-old-contact");
- eab_contact_display_render (EAB_CONTACT_DISPLAY (widget),
- match, EAB_CONTACT_DISPLAY_RENDER_COMPACT);
-
- widget = glade_xml_get_widget (ui, "custom-new-contact");
- eab_contact_display_render (EAB_CONTACT_DISPLAY (widget),
- contact, EAB_CONTACT_DISPLAY_RENDER_COMPACT);
-
- widget = glade_xml_get_widget (ui, "dialog-duplicate-contact");
-
- gtk_widget_ensure_style (widget);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (widget)->vbox), 0);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (widget)->action_area), 12);
-
- g_signal_connect (widget, "response",
- G_CALLBACK (response), lookup);
-
- gtk_widget_show_all (widget);
- }
-}
-
-gboolean
-eab_merging_book_add_contact (EBook *book,
- EContact *contact,
- EBookIdCallback cb,
- gpointer closure)
-{
- EContactMergingLookup *lookup;
-
- lookup = g_new (EContactMergingLookup, 1);
-
- lookup->op = E_CONTACT_MERGING_ADD;
- lookup->book = g_object_ref (book);
- lookup->contact = g_object_ref (contact);
- lookup->id_cb = cb;
- lookup->closure = closure;
- lookup->avoid = NULL;
-
- add_lookup (lookup);
-
- return TRUE;
-}
-
-gboolean
-eab_merging_book_commit_contact (EBook *book,
- EContact *contact,
- EBookCallback cb,
- gpointer closure)
-{
- EContactMergingLookup *lookup;
-
- lookup = g_new (EContactMergingLookup, 1);
-
- lookup->op = E_CONTACT_MERGING_COMMIT;
- lookup->book = g_object_ref (book);
- lookup->contact = g_object_ref (contact);
- lookup->cb = cb;
- lookup->closure = closure;
- lookup->avoid = g_list_append (NULL, contact);
-
- add_lookup (lookup);
-
- return TRUE;
-}
-
-GtkWidget *
-_eab_contact_merging_create_contact_display(gchar *name,
- gchar *string1, gchar *string2,
- gint int1, gint int2);
-
-GtkWidget *
-_eab_contact_merging_create_contact_display(gchar *name,
- gchar *string1, gchar *string2,
- gint int1, gint int2)
-{
- return eab_contact_display_new();
-}
diff --git a/addressbook/gui/merging/eab-contact-merging.h b/addressbook/gui/merging/eab-contact-merging.h
deleted file mode 100644
index 80a7717ce8..0000000000
--- a/addressbook/gui/merging/eab-contact-merging.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * The Evolution addressbook client object.
- *
- * Authors:
- * Christopher James Lahey <clahey@ximian.com>
- * Chris Toshok <toshok@ximian.com>
- *
- * Copyright (C) 2001, 2002, 2003 Ximian, Inc.
- */
-
-#ifndef __E_CONTACT_MERGING_H__
-#define __E_CONTACT_MERGING_H__
-
-#include <libebook/e-book.h>
-
-G_BEGIN_DECLS
-
-gboolean eab_merging_book_add_contact (EBook *book,
- EContact *contact,
- EBookIdCallback cb,
- gpointer closure);
-gboolean eab_merging_book_commit_contact (EBook *book,
- EContact *contact,
- EBookCallback cb,
- gpointer closure);
-
-G_END_DECLS
-
-#endif /* ! __EAB_CONTACT_MERGING_H__ */
diff --git a/addressbook/gui/search/.cvsignore b/addressbook/gui/search/.cvsignore
deleted file mode 100644
index d6c55c7345..0000000000
--- a/addressbook/gui/search/.cvsignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
diff --git a/addressbook/gui/search/Makefile.am b/addressbook/gui/search/Makefile.am
deleted file mode 100644
index 391039d81f..0000000000
--- a/addressbook/gui/search/Makefile.am
+++ /dev/null
@@ -1,23 +0,0 @@
-ruledir = $(privdatadir)
-rule_DATA = addresstypes.xml
-
-EXTRA_DIST = addresstypes.xml
-
-INCLUDES = \
- -DG_LOG_DOMAIN=\"e-addressbook-search\" \
- -I$(top_srcdir) \
- -I$(top_srcdir)/addressbook/backend \
- -I$(top_builddir)/addressbook/backend \
- -I$(top_srcdir)/addressbook/contact-editor \
- -I$(top_srcdir)/widgets/e-text \
- -I$(top_srcdir)/widgets/misc \
- -I$(top_builddir)/shell \
- -DSEARCH_RULE_DIR=\"$(ruledir)\" \
- $(EVOLUTION_ADDRESSBOOK_CFLAGS)
-
-noinst_LTLIBRARIES = \
- libeaddressbooksearch.la
-
-libeaddressbooksearch_la_SOURCES = \
- e-addressbook-search-dialog.c \
- e-addressbook-search-dialog.h
diff --git a/addressbook/gui/search/addresstypes.xml b/addressbook/gui/search/addresstypes.xml
deleted file mode 100644
index 4adbfd694b..0000000000
--- a/addressbook/gui/search/addresstypes.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0"?>
-<filterdescription>
-<partset>
- <part name="name">
- <title>Name</title>
- <input type="optionlist" name="name-type">
- <option value="contains">
- <title>contains</title>
- <code>(contains "full_name" ${name})</code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>(not (contains "full_name" ${name}))</code>
- </option>
- <option value="is">
- <title>is</title>
- <code>(is "full_name" ${name})))</code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>(not (is "full_name" ${name}))</code>
- </option>
- <option value="begin">
- <title>begins with</title>
- <code>(beginswith "full_name" ${name})</code>
- </option>
- <option value="end">
- <title>ends in</title>
- <code>(endswith "full_name" ${name})</code>
- </option>
- </input>
- <input type="string" name="name"/>
- </part>
- <part name="email">
- <title>Email</title>
- <input type="optionlist" name="email-type">
- <option value="contains">
- <title>contains</title>
- <code>(contains "email" ${email})</code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>(not (contains "email" ${email}))</code>
- </option>
- <option value="is">
- <title>is</title>
- <code>(is "email" ${email})</code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>(not (is "email" ${email}))</code>
- </option>
- </input>
- <input type="address" name="email"/>
- </part>
- <part name="category">
- <title>Category</title>
- <input type="optionlist" name="category-type">
- <option value="contains">
- <title>contains</title>
- <code>(contains "category_list" ${category})</code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>(not (contains "category_list" ${category}))</code>
- </option>
- <option value="is">
- <title>is</title>
- <code>(is "category_list" ${category})</code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>(not (is "category_list" ${category}))</code>
- </option>
- </input>
- <input type="string" name="category"/>
- </part>
- <part name="sexp">
- <title>Expression</title>
- <input type="code" name="code"/>
- </part>
-</partset>
-</filterdescription>
diff --git a/addressbook/gui/search/e-addressbook-search-dialog.c b/addressbook/gui/search/e-addressbook-search-dialog.c
deleted file mode 100644
index 2c66a931e6..0000000000
--- a/addressbook/gui/search/e-addressbook-search-dialog.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-addressbook-search-dialog.c
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkbox.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkstock.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "e-addressbook-search-dialog.h"
-
-
-static void eab_search_dialog_init (EABSearchDialog *widget);
-static void eab_search_dialog_class_init (EABSearchDialogClass *klass);
-static void eab_search_dialog_dispose (GObject *object);
-
-G_DEFINE_TYPE (EABSearchDialog, eab_search_dialog, GTK_TYPE_DIALOG)
-
-enum
-{
- PROP_VIEW = 1
-};
-
-static GtkWidget *
-get_widget (EABSearchDialog *view)
-{
- RuleContext *context;
- FilterRule *rule;
-
- context = eab_view_peek_search_context (view->view);
- rule = eab_view_peek_search_rule (view->view);
-
- if (!context || !rule) {
- g_warning ("Could not get search context.");
- return gtk_entry_new ();
- }
-
- return filter_rule_get_widget (rule, context);
-}
-
-static void
-eab_search_dialog_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
-{
- EABSearchDialog *search_dialog;
-
- search_dialog = EAB_SEARCH_DIALOG (object);
-
- switch (property_id) {
- case PROP_VIEW:
- search_dialog->view = g_value_get_object (value);
- search_dialog->search = get_widget (search_dialog);
- gtk_container_set_border_width (GTK_CONTAINER (search_dialog->search), 12);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (search_dialog)->vbox),
- search_dialog->search, TRUE, TRUE, 0);
- gtk_widget_show (search_dialog->search);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-eab_search_dialog_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
-{
- EABSearchDialog *search_dialog;
-
- search_dialog = EAB_SEARCH_DIALOG (object);
-
- switch (property_id) {
- case PROP_VIEW:
- g_value_set_object (value, search_dialog->view);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-eab_search_dialog_class_init (EABSearchDialogClass *klass)
-{
- GObjectClass *object_class;
-
- object_class = (GObjectClass*) klass;
-
- object_class->set_property = eab_search_dialog_set_property;
- object_class->get_property = eab_search_dialog_get_property;
- object_class->dispose = eab_search_dialog_dispose;
-
- g_object_class_install_property (object_class, PROP_VIEW,
- g_param_spec_object ("view", NULL, NULL, E_TYPE_AB_VIEW,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-}
-
-static char *
-get_query (EABSearchDialog *view)
-{
- FilterRule *rule;
- GString *out = g_string_new("");
- char *ret;
-
- rule = eab_view_peek_search_rule (view->view);
-
- filter_rule_build_code(rule, out);
- ret = out->str;
- printf("Searching using %s\n", ret);
- g_string_free(out, FALSE);
- return ret;
-}
-
-static void
-dialog_response (GtkWidget *widget, int response_id, EABSearchDialog *dialog)
-{
- char *query;
-
- if (response_id == GTK_RESPONSE_OK) {
- query = get_query(dialog);
- g_object_set(dialog->view,
- "query", query,
- NULL);
- g_free(query);
- }
-
- gtk_widget_destroy(GTK_WIDGET (dialog));
-}
-
-static void
-eab_search_dialog_init (EABSearchDialog *view)
-{
- GtkDialog *dialog = GTK_DIALOG (view);
-
- gtk_widget_realize (GTK_WIDGET (dialog));
- gtk_dialog_set_has_separator (dialog, FALSE);
- gtk_container_set_border_width (GTK_CONTAINER (dialog->vbox), 0);
- gtk_container_set_border_width (GTK_CONTAINER (dialog->action_area), 12);
-
- gtk_window_set_default_size (GTK_WINDOW (view), 550, 400);
- gtk_window_set_title(GTK_WINDOW(view), _("Advanced Search"));
-
- gtk_dialog_add_buttons (dialog,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- /*GTK_STOCK_SAVE, GTK_RESPONSE_APPLY,*/
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- NULL);
-
- gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK);
-
- g_signal_connect(dialog, "response",
- G_CALLBACK(dialog_response), view);
-}
-
-GtkWidget *
-eab_search_dialog_new (EABView *addr_view)
-{
- EABSearchDialog *view = g_object_new (EAB_SEARCH_DIALOG_TYPE, "view", addr_view, NULL);
-
- return GTK_WIDGET(view);
-}
-
-static void
-eab_search_dialog_dispose (GObject *object)
-{
- EABSearchDialog *view;
-
- view = EAB_SEARCH_DIALOG (object);
-
- G_OBJECT_CLASS(eab_search_dialog_parent_class)->dispose (object);
-}
diff --git a/addressbook/gui/search/e-addressbook-search-dialog.h b/addressbook/gui/search/e-addressbook-search-dialog.h
deleted file mode 100644
index 1321409f94..0000000000
--- a/addressbook/gui/search/e-addressbook-search-dialog.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-minicard-view-widget.h
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef __EAB_SEARCH_DIALOG_H__
-#define __EAB_SEARCH_DIALOG_H__
-
-#include <libebook/e-book.h>
-
-#include "addressbook/gui/widgets/e-addressbook-view.h"
-#include "filter/rule-context.h"
-#include "filter/filter-rule.h"
-#include <gtk/gtkdialog.h>
-
-G_BEGIN_DECLS
-
-#define EAB_SEARCH_DIALOG_TYPE (eab_search_dialog_get_type ())
-#define EAB_SEARCH_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EAB_SEARCH_DIALOG_TYPE, EABSearchDialog))
-#define EAB_SEARCH_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EAB_SEARCH_DIALOG_TYPE, EABSearchDialogClass))
-#define E_IS_ADDRESSBOOK_SEARCH_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EAB_SEARCH_DIALOG_TYPE))
-#define E_IS_ADDRESSBOOK_SEARCH_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EAB_SEARCH_DIALOG_TYPE))
-
-
-typedef struct _EABSearchDialog EABSearchDialog;
-typedef struct _EABSearchDialogClass EABSearchDialogClass;
-
-struct _EABSearchDialog
-{
- GtkDialog parent;
-
- GtkWidget *search;
- EABView *view;
-};
-
-struct _EABSearchDialogClass
-{
- GtkDialogClass parent_class;
-};
-
-GType eab_search_dialog_get_type (void);
-
-GtkWidget *eab_search_dialog_new (EABView *view);
-
-G_END_DECLS
-
-#endif /* __EAB_SEARCH_DIALOG_H__ */
diff --git a/addressbook/gui/widgets/.cvsignore b/addressbook/gui/widgets/.cvsignore
deleted file mode 100644
index b67f65e6c3..0000000000
--- a/addressbook/gui/widgets/.cvsignore
+++ /dev/null
@@ -1,19 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-minicard-label-test
-minicard-test
-minicard-view-test
-minicard-widget-test
-reflow-test
-eab-marshal.c
-eab-marshal.h
-Evolution-Composer-stubs.c
-Evolution-Composer-skels.c
-Evolution-Composer-common.c
-Evolution-Composer.h
-
diff --git a/addressbook/gui/widgets/Makefile.am b/addressbook/gui/widgets/Makefile.am
deleted file mode 100644
index da204a4f06..0000000000
--- a/addressbook/gui/widgets/Makefile.am
+++ /dev/null
@@ -1,98 +0,0 @@
-ruledir = $(privdatadir)
-
-INCLUDES = \
- -DG_LOG_DOMAIN=\"eab-widgets\" \
- -DEVOLUTION_ETSPECDIR=\""$(etspecdir)"\" \
- -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \
- -DEVOLUTION_GALVIEWSDIR=\""$(viewsdir)"\" \
- -I$(top_srcdir) \
- -I$(top_srcdir)/addressbook \
- -I$(top_srcdir)/addressbook/backend \
- -I$(top_builddir)/addressbook/backend \
- -I$(top_srcdir)/addressbook/gui/contact-editor \
- -I$(top_srcdir)/addressbook/gui/merging \
- -I$(top_srcdir)/addressbook/gui/component \
- -I$(top_srcdir)/widgets/misc \
- -I$(top_builddir)/shell \
- -DSEARCH_RULE_DIR=\"$(ruledir)\" \
- $(EVOLUTION_ADDRESSBOOK_CFLAGS)
-
-CORBA_COMPOSER_SOURCE_H = \
- Evolution-Composer.h
-CORBA_COMPOSER_SOURCE_C = \
- Evolution-Composer-common.c \
- Evolution-Composer-skels.c \
- Evolution-Composer-stubs.c
-CORBA_COMPOSER_IDL = $(srcdir)/../../../composer/Evolution-Composer.idl
-
-$(CORBA_COMPOSER_SOURCE_H): $(CORBA_COMPOSER_IDL)
- $(ORBIT_IDL) -I $(srcdir) $(IDL_INCLUDES) $(CORBA_COMPOSER_IDL)
-
-$(CORBA_COMPOSER_SOURCE_C): $(CORBA_COMPOSER_SOURCE_H)
-
-CORBA_SOURCE_H = $(CORBA_COMPOSER_SOURCE_H)
-CORBA_SOURCE_C = $(CORBA_COMPOSER_SOURCE_C)
-CORBA_SOURCE = $(CORBA_SOURCE_H) $(CORBA_SOURCE_C)
-
-noinst_LTLIBRARIES = \
- libeabwidgets.la
-
-libeabwidgets_la_SOURCES = \
- $(CORBA_SOURCE) \
- $(MARSHAL_GENERATED) \
- eab-config.c \
- eab-config.h \
- eab-contact-display.c \
- eab-contact-display.h \
- eab-gui-util.c \
- eab-gui-util.h \
- eab-menu.c \
- eab-menu.h \
- eab-popup.c \
- eab-popup.h \
- eab-popup-control.c \
- eab-popup-control.h \
- eab-vcard-control.c \
- eab-vcard-control.h \
- e-minicard.c \
- e-minicard.h \
- e-minicard-label.c \
- e-minicard-label.h \
- e-minicard-view.c \
- e-minicard-view.h \
- e-minicard-view-widget.c \
- e-minicard-view-widget.h \
- e-addressbook-reflow-adapter.c \
- e-addressbook-reflow-adapter.h \
- e-addressbook-table-adapter.c \
- e-addressbook-table-adapter.h \
- e-addressbook-model.c \
- e-addressbook-model.h \
- e-addressbook-view.c \
- e-addressbook-view.h \
- gal-view-minicard.c \
- gal-view-minicard.h \
- gal-view-factory-minicard.c \
- gal-view-factory-minicard.h
-
-#TREEVIEW_SOURCES= e-addressbook-treeview-adapter.c \
-# e-addressbook-treeview-adapter.h \
-# gal-view-factory-treeview.c \
-# gal-view-factory-treeview.h \
-# gal-view-treeview.c \
-# gal-view-treeview.h
-
-MARSHAL_GENERATED = eab-marshal.c eab-marshal.h
-@EVO_MARSHAL_RULE@
-
-BUILT_SOURCES = $(CORBA_SOURCE) $(MARSHAL_GENERATED)
-CLEANFILES = $(BUILT_SOURCES)
-
-dist-hook:
- cd $(distdir); rm -f $(BUILT_SOURCES)
-
-etspec_DATA= e-addressbook-view.etspec
-
-EXTRA_DIST = \
- $(etspec_DATA) \
- eab-marshal.list
diff --git a/addressbook/gui/widgets/e-addressbook-model.c b/addressbook/gui/widgets/e-addressbook-model.c
deleted file mode 100644
index da029adb19..0000000000
--- a/addressbook/gui/widgets/e-addressbook-model.c
+++ /dev/null
@@ -1,721 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- *
- * Author:
- * Christopher James Lahey <clahey@ximian.com>
- *
- * (C) 1999 Ximian, Inc.
- */
-
-#include <config.h>
-#include "eab-marshal.h"
-#include "e-addressbook-model.h"
-#include <libxml/tree.h>
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-#include <gnome.h>
-#include <gal/widgets/e-gui-utils.h>
-#include "eab-gui-util.h"
-
-#define PARENT_TYPE G_TYPE_OBJECT
-static GObjectClass *parent_class;
-
-/*
- * EABModel callbacks
- * These are the callbacks that define the behavior of our custom model.
- */
-static void eab_model_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
-static void eab_model_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
-
-
-enum {
- PROP_0,
- PROP_BOOK,
- PROP_QUERY,
- PROP_EDITABLE,
-};
-
-enum {
- WRITABLE_STATUS,
- STATUS_MESSAGE,
- SEARCH_STARTED,
- SEARCH_RESULT,
- FOLDER_BAR_MESSAGE,
- CONTACT_ADDED,
- CONTACTS_REMOVED,
- CONTACT_CHANGED,
- MODEL_CHANGED,
- STOP_STATE_CHANGED,
- BACKEND_DIED,
- LAST_SIGNAL
-};
-
-static guint eab_model_signals [LAST_SIGNAL] = {0, };
-
-static void
-free_data (EABModel *model)
-{
- if (model->data) {
- int i;
-
- for ( i = 0; i < model->data_count; i++ ) {
- g_object_unref (model->data[i]);
- }
-
- g_free(model->data);
- model->data = NULL;
- model->data_count = 0;
- model->allocated_count = 0;
- }
-}
-
-static void
-remove_book_view(EABModel *model)
-{
- if (model->book_view && model->create_contact_id)
- g_signal_handler_disconnect (model->book_view,
- model->create_contact_id);
- if (model->book_view && model->remove_contact_id)
- g_signal_handler_disconnect (model->book_view,
- model->remove_contact_id);
- if (model->book_view && model->modify_contact_id)
- g_signal_handler_disconnect (model->book_view,
- model->modify_contact_id);
- if (model->book_view && model->status_message_id)
- g_signal_handler_disconnect (model->book_view,
- model->status_message_id);
- if (model->book_view && model->sequence_complete_id)
- g_signal_handler_disconnect (model->book_view,
- model->sequence_complete_id);
-
- model->create_contact_id = 0;
- model->remove_contact_id = 0;
- model->modify_contact_id = 0;
- model->status_message_id = 0;
- model->sequence_complete_id = 0;
-
- model->search_in_progress = FALSE;
-
- if (model->book_view) {
- e_book_view_stop (model->book_view);
- g_object_unref (model->book_view);
- model->book_view = NULL;
- }
-}
-
-static void
-addressbook_dispose(GObject *object)
-{
- EABModel *model = EAB_MODEL(object);
-
- remove_book_view(model);
- free_data (model);
-
- if (model->book) {
- if (model->writable_status_id)
- g_signal_handler_disconnect (model->book,
- model->writable_status_id);
- model->writable_status_id = 0;
-
- if (model->backend_died_id)
- g_signal_handler_disconnect (model->book,
- model->backend_died_id);
- model->backend_died_id = 0;
-
- g_object_unref (model->book);
- model->book = NULL;
- }
-
- if (model->query) {
- e_book_query_unref (model->query);
- model->query = NULL;
- }
-
- if (G_OBJECT_CLASS(parent_class)->dispose)
- G_OBJECT_CLASS(parent_class)->dispose(object);
-}
-
-static void
-update_folder_bar_message (EABModel *model)
-{
- int count;
- char *message;
-
- count = model->data_count;
-
- switch (count) {
- case 0:
- message = g_strdup (_("No contacts"));
- break;
- default:
- message = g_strdup_printf (ngettext("%d contact", "%d contacts", count), count);
- break;
- }
-
- g_signal_emit (model,
- eab_model_signals [FOLDER_BAR_MESSAGE], 0,
- message);
-
- g_free (message);
-}
-
-static void
-create_contact(EBookView *book_view,
- const GList *contacts,
- EABModel *model)
-{
- int old_count = model->data_count;
- int length = g_list_length ((GList *)contacts);
-
- if (model->data_count + length > model->allocated_count) {
- while (model->data_count + length > model->allocated_count)
- model->allocated_count = model->allocated_count * 2 + 1;
- model->data = g_renew(EContact *, model->data, model->allocated_count);
- }
-
- for ( ; contacts; contacts = contacts->next) {
- model->data[model->data_count++] = contacts->data;
- g_object_ref (contacts->data);
- }
-
- g_signal_emit (model,
- eab_model_signals [CONTACT_ADDED], 0,
- old_count, model->data_count - old_count);
-
- update_folder_bar_message (model);
-}
-
-static void
-remove_contact(EBookView *book_view,
- GList *ids,
- EABModel *model)
-{
- /* XXX we should keep a hash around instead of this O(n*m) loop */
- gint i = 0;
- GList *l;
- GArray *indices;
-
- indices = g_array_new (FALSE, FALSE, sizeof (gint));
- for (l = ids; l; l = l->next) {
- char *id = l->data;
- for ( i = 0; i < model->data_count; i++) {
- if ( !strcmp(e_contact_get_const (model->data[i], E_CONTACT_UID), id) ) {
- g_object_unref (model->data[i]);
- memmove(model->data + i, model->data + i + 1, (model->data_count - i - 1) * sizeof (EContact *));
- model->data_count--;
- g_array_append_val (indices, i);
- break;
- }
- }
- }
- g_signal_emit (model,
- eab_model_signals [CONTACTS_REMOVED], 0,
- indices);
- g_array_free (indices, FALSE);
- update_folder_bar_message (model);
-}
-
-static void
-modify_contact(EBookView *book_view,
- const GList *contacts,
- EABModel *model)
-{
- for ( ; contacts; contacts = contacts->next) {
- int i;
- for ( i = 0; i < model->data_count; i++) {
- if ( !strcmp(e_contact_get_const(model->data[i], E_CONTACT_UID),
- e_contact_get_const(E_CONTACT(contacts->data), E_CONTACT_UID)) ) {
- g_object_unref (model->data[i]);
- model->data[i] = e_contact_duplicate(E_CONTACT(contacts->data));
- g_signal_emit (model,
- eab_model_signals [CONTACT_CHANGED], 0,
- i);
- break;
- }
- }
- }
-}
-
-static void
-status_message (EBookView *book_view,
- char* status,
- EABModel *model)
-{
- g_signal_emit (model,
- eab_model_signals [STATUS_MESSAGE], 0,
- status);
-}
-
-static void
-sequence_complete (EBookView *book_view,
- EBookViewStatus status,
- EABModel *model)
-{
- model->search_in_progress = FALSE;
- status_message (book_view, NULL, model);
- g_signal_emit (model,
- eab_model_signals [SEARCH_RESULT], 0,
- status);
- g_signal_emit (model,
- eab_model_signals [STOP_STATE_CHANGED], 0);
-}
-
-static void
-writable_status (EBook *book,
- gboolean writable,
- EABModel *model)
-{
- if (!model->editable_set) {
- model->editable = writable;
-
- g_signal_emit (model,
- eab_model_signals [WRITABLE_STATUS], 0,
- writable);
- }
-}
-
-static void
-backend_died (EBook *book,
- EABModel *model)
-{
- g_signal_emit (model,
- eab_model_signals [BACKEND_DIED], 0);
-}
-
-static void
-eab_model_class_init (GObjectClass *object_class)
-{
- parent_class = g_type_class_ref (PARENT_TYPE);
-
- object_class->dispose = addressbook_dispose;
- object_class->set_property = eab_model_set_property;
- object_class->get_property = eab_model_get_property;
-
- g_object_class_install_property (object_class, PROP_BOOK,
- g_param_spec_object ("book",
- _("Book"),
- /*_( */"XXX blurb" /*)*/,
- E_TYPE_BOOK,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_QUERY,
- g_param_spec_string ("query",
- _("Query"),
- /*_( */"XXX blurb" /*)*/,
- NULL,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_EDITABLE,
- g_param_spec_boolean ("editable",
- _("Editable"),
- /*_( */"XXX blurb" /*)*/,
- FALSE,
- G_PARAM_READWRITE));
-
- eab_model_signals [WRITABLE_STATUS] =
- g_signal_new ("writable_status",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EABModelClass, writable_status),
- NULL, NULL,
- eab_marshal_NONE__BOOL,
- G_TYPE_NONE,
- 1, G_TYPE_BOOLEAN);
-
- eab_model_signals [STATUS_MESSAGE] =
- g_signal_new ("status_message",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EABModelClass, status_message),
- NULL, NULL,
- eab_marshal_NONE__POINTER,
- G_TYPE_NONE,
- 1, G_TYPE_POINTER);
-
- eab_model_signals [SEARCH_STARTED] =
- g_signal_new ("search_started",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EABModelClass, search_started),
- NULL, NULL,
- eab_marshal_NONE__NONE,
- G_TYPE_NONE, 0);
-
- eab_model_signals [SEARCH_RESULT] =
- g_signal_new ("search_result",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EABModelClass, search_result),
- NULL, NULL,
- eab_marshal_NONE__INT,
- G_TYPE_NONE, 1, G_TYPE_INT);
-
- eab_model_signals [FOLDER_BAR_MESSAGE] =
- g_signal_new ("folder_bar_message",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EABModelClass, folder_bar_message),
- NULL, NULL,
- eab_marshal_NONE__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
-
- eab_model_signals [CONTACT_ADDED] =
- g_signal_new ("contact_added",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EABModelClass, contact_added),
- NULL, NULL,
- eab_marshal_NONE__INT_INT,
- G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
-
- eab_model_signals [CONTACTS_REMOVED] =
- g_signal_new ("contacts_removed",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EABModelClass, contacts_removed),
- NULL, NULL,
- eab_marshal_NONE__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
-
- eab_model_signals [CONTACT_CHANGED] =
- g_signal_new ("contact_changed",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EABModelClass, contact_changed),
- NULL, NULL,
- eab_marshal_NONE__INT,
- G_TYPE_NONE, 1, G_TYPE_INT);
-
- eab_model_signals [MODEL_CHANGED] =
- g_signal_new ("model_changed",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EABModelClass, model_changed),
- NULL, NULL,
- eab_marshal_NONE__NONE,
- G_TYPE_NONE, 0);
-
- eab_model_signals [STOP_STATE_CHANGED] =
- g_signal_new ("stop_state_changed",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EABModelClass, stop_state_changed),
- NULL, NULL,
- eab_marshal_NONE__NONE,
- G_TYPE_NONE, 0);
-
- eab_model_signals [BACKEND_DIED] =
- g_signal_new ("backend_died",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EABModelClass, backend_died),
- NULL, NULL,
- eab_marshal_NONE__NONE,
- G_TYPE_NONE, 0);
-}
-
-static void
-eab_model_init (GObject *object)
-{
- EABModel *model = EAB_MODEL(object);
- model->book = NULL;
- model->query = e_book_query_any_field_contains ("");
- model->book_view = NULL;
- model->create_contact_id = 0;
- model->remove_contact_id = 0;
- model->modify_contact_id = 0;
- model->status_message_id = 0;
- model->writable_status_id = 0;
- model->backend_died_id = 0;
- model->sequence_complete_id = 0;
- model->data = NULL;
- model->data_count = 0;
- model->allocated_count = 0;
- model->search_in_progress = FALSE;
- model->editable = FALSE;
- model->editable_set = FALSE;
- model->first_get_view = TRUE;
-}
-
-static void
-book_view_loaded (EBook *book, EBookStatus status, EBookView *book_view, gpointer closure)
-{
- EABModel *model = closure;
-
- if (status != E_BOOK_ERROR_OK) {
- eab_error_dialog (_("Error getting book view"), status);
- return;
- }
-
- remove_book_view (model);
- free_data (model);
-
- model->book_view = book_view;
- if (model->book_view)
- g_object_ref (model->book_view);
- model->create_contact_id = g_signal_connect(model->book_view,
- "contacts_added",
- G_CALLBACK (create_contact),
- model);
- model->remove_contact_id = g_signal_connect(model->book_view,
- "contacts_removed",
- G_CALLBACK (remove_contact),
- model);
- model->modify_contact_id = g_signal_connect(model->book_view,
- "contacts_changed",
- G_CALLBACK(modify_contact),
- model);
- model->status_message_id = g_signal_connect(model->book_view,
- "status_message",
- G_CALLBACK(status_message),
- model);
- model->sequence_complete_id = g_signal_connect(model->book_view,
- "sequence_complete",
- G_CALLBACK(sequence_complete),
- model);
-
- model->search_in_progress = TRUE;
- g_signal_emit (model,
- eab_model_signals [MODEL_CHANGED], 0);
- g_signal_emit (model,
- eab_model_signals [SEARCH_STARTED], 0);
- g_signal_emit (model,
- eab_model_signals [STOP_STATE_CHANGED], 0);
-
- e_book_view_start (model->book_view);
-}
-
-static void
-get_view (EABModel *model)
-{
- gboolean success;
-
- if (model->book && model->query) {
- ESource *source;
- const char *limit_str;
- int limit = -1;
-
- source = e_book_get_source (model->book);
-
- limit_str = e_source_get_property (source, "limit");
- if (limit_str && *limit_str)
- limit = atoi (limit_str);
-
- remove_book_view(model);
-
- if (model->first_get_view) {
- model->first_get_view = FALSE;
-
- if (e_book_check_static_capability (model->book, "do-initial-query")) {
- success = e_book_async_get_book_view (model->book, model->query, NULL, limit, book_view_loaded, model);
- } else {
- free_data (model);
-
- g_signal_emit (model,
- eab_model_signals [MODEL_CHANGED], 0);
- g_signal_emit (model,
- eab_model_signals [STOP_STATE_CHANGED], 0);
- return;
- }
- }
- else
- success = e_book_async_get_book_view (model->book, model->query, NULL, limit, book_view_loaded, model);
-
- }
-}
-
-static gboolean
-get_view_idle (EABModel *model)
-{
- model->book_view_idle_id = 0;
- get_view (model);
- g_object_unref (model);
- return FALSE;
-}
-
-
-EContact *
-eab_model_get_contact(EABModel *model,
- int row)
-{
- if (model->data && 0 <= row && row < model->data_count) {
- return e_contact_duplicate (model->data[row]);
- }
- return NULL;
-}
-
-static void
-eab_model_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
- EABModel *model;
- gboolean need_get_book_view = FALSE;
-
- model = EAB_MODEL (object);
-
- switch (prop_id){
- case PROP_BOOK:
- if (model->book) {
- if (model->writable_status_id)
- g_signal_handler_disconnect (model->book,
- model->writable_status_id);
- model->writable_status_id = 0;
-
- if (model->backend_died_id)
- g_signal_handler_disconnect (model->book,
- model->backend_died_id);
- model->backend_died_id = 0;
-
- g_object_unref (model->book);
- }
- model->book = E_BOOK(g_value_get_object (value));
- if (model->book) {
- model->writable_status_id =
- g_signal_connect (model->book,
- "writable_status",
- G_CALLBACK (writable_status), model);
- model->backend_died_id =
- g_signal_connect (model->book,
- "backend_died",
- G_CALLBACK (backend_died), model);
-
- if (!model->editable_set) {
- model->editable = e_book_is_writable (model->book);
-
- g_signal_emit (model,
- eab_model_signals [WRITABLE_STATUS], 0,
- model->editable);
- }
-
- model->first_get_view = TRUE;
- g_object_ref (model->book);
- need_get_book_view = TRUE;
- }
- break;
- case PROP_QUERY:
- if (model->query)
- e_book_query_unref (model->query);
- model->query = e_book_query_from_string (g_value_get_string (value));
- need_get_book_view = TRUE;
- break;
- case PROP_EDITABLE:
- model->editable = g_value_get_boolean (value);
- model->editable_set = TRUE;
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-
- if (need_get_book_view) {
- if (!model->book_view_idle_id) {
- g_object_ref (model);
- model->book_view_idle_id = g_idle_add ((GSourceFunc)get_view_idle, model);
- }
- }
-
-}
-
-static void
-eab_model_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
- EABModel *eab_model;
-
- eab_model = EAB_MODEL (object);
-
- switch (prop_id) {
- case PROP_BOOK:
- g_value_set_object (value, eab_model->book);
- break;
- case PROP_QUERY: {
- char *query_string = e_book_query_to_string (eab_model->query);
- g_value_set_string (value, query_string);
- break;
- }
- case PROP_EDITABLE:
- g_value_set_boolean (value, eab_model->editable);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-GType
-eab_model_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (EABModelClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) eab_model_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EABModel),
- 0, /* n_preallocs */
- (GInstanceInitFunc) eab_model_init,
- };
-
- type = g_type_register_static (PARENT_TYPE, "EABModel", &info, 0);
- }
-
- return type;
-}
-
-EABModel*
-eab_model_new (void)
-{
- EABModel *et;
-
- et = g_object_new (EAB_TYPE_MODEL, NULL);
-
- return et;
-}
-
-void eab_model_stop (EABModel *model)
-{
- remove_book_view(model);
- g_signal_emit (model,
- eab_model_signals [STOP_STATE_CHANGED], 0);
- g_signal_emit (model,
- eab_model_signals [STATUS_MESSAGE], 0,
- "Search Interrupted.");
-}
-
-gboolean
-eab_model_can_stop (EABModel *model)
-{
- return model->search_in_progress;
-}
-
-void
-eab_model_force_folder_bar_message (EABModel *model)
-{
- update_folder_bar_message (model);
-}
-
-int
-eab_model_contact_count (EABModel *model)
-{
- return model->data_count;
-}
-
-const EContact *
-eab_model_contact_at (EABModel *model, int index)
-{
- return model->data[index];
-}
-
-gboolean
-eab_model_editable (EABModel *model)
-{
- return model->editable;
-}
-
-EBook *
-eab_model_get_ebook (EABModel *model)
-{
- return model->book;
-}
diff --git a/addressbook/gui/widgets/e-addressbook-model.h b/addressbook/gui/widgets/e-addressbook-model.h
deleted file mode 100644
index 8ccc4f0693..0000000000
--- a/addressbook/gui/widgets/e-addressbook-model.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _EAB_MODEL_H_
-#define _EAB_MODEL_H_
-
-#include <glib.h>
-#include <glib-object.h>
-#include <libebook/e-book.h>
-#include <libebook/e-book-view.h>
-
-#define EAB_TYPE_MODEL (eab_model_get_type ())
-#define EAB_MODEL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EAB_TYPE_MODEL, EABModel))
-#define EAB_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), EAB_TYPE_MODEL, EABModelClass))
-#define E_IS_ADDRESSBOOK_MODEL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EAB_TYPE_MODEL))
-#define E_IS_ADDRESSBOOK_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EAB_TYPE_MODEL))
-
-typedef struct _EABModel EABModel;
-typedef struct _EABModelClass EABModelClass;
-
-struct _EABModel {
- GObject parent;
-
- /* item specific fields */
- EBook *book;
- EBookQuery *query;
- EBookView *book_view;
-
- int book_view_idle_id;
-
- EContact **data;
- int data_count;
- int allocated_count;
-
- int create_contact_id, remove_contact_id, modify_contact_id;
- int status_message_id, writable_status_id, sequence_complete_id;
- int backend_died_id;
-
- guint search_in_progress : 1;
- guint editable : 1;
- guint editable_set : 1;
- guint first_get_view : 1;
-};
-
-
-struct _EABModelClass {
- GObjectClass parent_class;
-
- /*
- * Signals
- */
- void (*writable_status) (EABModel *model, gboolean writable);
- void (*search_started) (EABModel *model);
- void (*search_result) (EABModel *model, EBookViewStatus status);
- void (*status_message) (EABModel *model, const gchar *message);
- void (*folder_bar_message) (EABModel *model, const gchar *message);
- void (*contact_added) (EABModel *model, gint index, gint count);
- void (*contacts_removed) (EABModel *model, gpointer id_list);
- void (*contact_changed) (EABModel *model, gint index);
- void (*model_changed) (EABModel *model);
- void (*stop_state_changed) (EABModel *model);
- void (*backend_died) (EABModel *model);
-};
-
-
-GType eab_model_get_type (void);
-EABModel *eab_model_new (void);
-
-/* Returns object with ref count of 1. */
-EContact *eab_model_get_contact (EABModel *model,
- int row);
-EBook *eab_model_get_ebook (EABModel *model);
-
-void eab_model_stop (EABModel *model);
-gboolean eab_model_can_stop (EABModel *model);
-
-void eab_model_force_folder_bar_message (EABModel *model);
-
-int eab_model_contact_count (EABModel *model);
-const EContact *eab_model_contact_at (EABModel *model,
- int index);
-gboolean eab_model_editable (EABModel *model);
-
-#endif /* _EAB_MODEL_H_ */
diff --git a/addressbook/gui/widgets/e-addressbook-reflow-adapter.c b/addressbook/gui/widgets/e-addressbook-reflow-adapter.c
deleted file mode 100644
index 96a7ceaa91..0000000000
--- a/addressbook/gui/widgets/e-addressbook-reflow-adapter.c
+++ /dev/null
@@ -1,523 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-
-#include <config.h>
-#include <string.h>
-
-#include <libgnome/gnome-i18n.h>
-#include "eab-marshal.h"
-#include "e-addressbook-reflow-adapter.h"
-#include "e-addressbook-model.h"
-#include "e-addressbook-view.h"
-#include "eab-gui-util.h"
-
-#include "e-minicard.h"
-#include <gal/widgets/e-gui-utils.h>
-#include "addressbook/printing/e-contact-print.h"
-#include "addressbook/printing/e-contact-print-envelope.h"
-
-
-struct _EAddressbookReflowAdapterPrivate {
- EABModel *model;
-
- gboolean loading;
-
- int create_contact_id, remove_contact_id, modify_contact_id, model_changed_id;
- int search_started_id, search_result_id;
-};
-
-#define PARENT_TYPE e_reflow_model_get_type()
-static EReflowModel *parent_class;
-
-#define d(x)
-
-enum {
- PROP_0,
- PROP_BOOK,
- PROP_QUERY,
- PROP_EDITABLE,
- PROP_MODEL,
-};
-
-enum {
- DRAG_BEGIN,
- LAST_SIGNAL
-};
-
-static guint e_addressbook_reflow_adapter_signals [LAST_SIGNAL] = {0, };
-
-static void
-unlink_model(EAddressbookReflowAdapter *adapter)
-{
- EAddressbookReflowAdapterPrivate *priv = adapter->priv;
-
- if (priv->model && priv->create_contact_id)
- g_signal_handler_disconnect (priv->model,
- priv->create_contact_id);
- if (priv->model && priv->remove_contact_id)
- g_signal_handler_disconnect (priv->model,
- priv->remove_contact_id);
- if (priv->model && priv->modify_contact_id)
- g_signal_handler_disconnect (priv->model,
- priv->modify_contact_id);
- if (priv->model && priv->model_changed_id)
- g_signal_handler_disconnect (priv->model,
- priv->model_changed_id);
- if (priv->model && priv->search_started_id)
- g_signal_handler_disconnect (priv->model,
- priv->search_started_id);
- if (priv->model && priv->search_result_id)
- g_signal_handler_disconnect (priv->model,
- priv->search_result_id);
-
- priv->create_contact_id = 0;
- priv->remove_contact_id = 0;
- priv->modify_contact_id = 0;
- priv->model_changed_id = 0;
- priv->search_started_id = 0;
- priv->search_result_id = 0;
-
- if (priv->model)
- g_object_unref (priv->model);
-
- priv->model = NULL;
-}
-
-
-static int
-text_height (PangoLayout *layout, const gchar *text)
-{
- int height;
-
- pango_layout_set_text (layout, text, -1);
-
- pango_layout_get_pixel_size (layout, NULL, &height);
-
- return height;
-}
-
-static void
-addressbook_dispose(GObject *object)
-{
- EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(object);
-
- unlink_model (adapter);
-}
-
-static void
-addressbook_set_width (EReflowModel *erm, int width)
-{
-}
-
-/* This function returns the number of items in our EReflowModel. */
-static int
-addressbook_count (EReflowModel *erm)
-{
- EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(erm);
- EAddressbookReflowAdapterPrivate *priv = adapter->priv;
-
- return eab_model_contact_count (priv->model);
-}
-
-/* This function returns the height of the minicontact in question */
-static int
-addressbook_height (EReflowModel *erm, int i, GnomeCanvasGroup *parent)
-{
- EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(erm);
- EAddressbookReflowAdapterPrivate *priv = adapter->priv;
- EContactField field;
- int count = 0;
- char *string;
- EContact *contact = (EContact*)eab_model_contact_at (priv->model, i);
- PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET (GNOME_CANVAS_ITEM (parent)->canvas), "");
- int height;
-
- string = e_contact_get(contact, E_CONTACT_FILE_AS);
- height = text_height (layout, string ? string : "") + 10.0;
- g_free(string);
-
- for(field = E_CONTACT_FULL_NAME; field != E_CONTACT_LAST_SIMPLE_STRING && count < 5; field++) {
-
- if (field == E_CONTACT_FAMILY_NAME || field == E_CONTACT_GIVEN_NAME)
- continue;
-
- string = e_contact_get(contact, field);
- if (string && *string) {
- int this_height;
- int field_text_height;
-
- this_height = text_height (layout, e_contact_pretty_name(field));
-
- field_text_height = text_height (layout, string);
- if (this_height < field_text_height)
- this_height = field_text_height;
-
- this_height += 3;
-
- height += this_height;
- count ++;
- }
- g_free (string);
- }
- height += 2;
-
- g_object_unref (layout);
-
- return height;
-}
-
-static int
-addressbook_compare (EReflowModel *erm, int n1, int n2)
-{
- EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(erm);
- EAddressbookReflowAdapterPrivate *priv = adapter->priv;
- EContact *contact1, *contact2;
-
- if (priv->loading) {
- return n1-n2;
- }
- else {
- contact1 = (EContact*)eab_model_contact_at (priv->model, n1);
- contact2 = (EContact*)eab_model_contact_at (priv->model, n2);
-
- if (contact1 && contact2) {
- const char *file_as1, *file_as2;
- file_as1 = e_contact_get_const (contact1, E_CONTACT_FILE_AS);
- file_as2 = e_contact_get_const (contact2, E_CONTACT_FILE_AS);
- if (file_as1 && file_as2)
- return g_utf8_collate(file_as1, file_as2);
- if (file_as1)
- return -1;
- if (file_as2)
- return 1;
- return strcmp(e_contact_get_const (contact1, E_CONTACT_UID),
- e_contact_get_const (contact2, E_CONTACT_UID));
- }
- if (contact1)
- return -1;
- if (contact2)
- return 1;
- return 0;
- }
-}
-
-static int
-adapter_drag_begin (EMinicard *card, GdkEvent *event, EAddressbookReflowAdapter *adapter)
-{
- gint ret_val = 0;
-
- g_signal_emit (adapter,
- e_addressbook_reflow_adapter_signals[DRAG_BEGIN], 0,
- event, &ret_val);
-
- return ret_val;
-}
-
-static GnomeCanvasItem *
-addressbook_incarnate (EReflowModel *erm, int i, GnomeCanvasGroup *parent)
-{
- EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(erm);
- EAddressbookReflowAdapterPrivate *priv = adapter->priv;
- GnomeCanvasItem *item;
-
- item = gnome_canvas_item_new(parent,
- e_minicard_get_type(),
- "contact", eab_model_contact_at (priv->model, i),
- "editable", eab_model_editable (priv->model),
- NULL);
-
-#if 0
- g_signal_connect (item, "selected",
- G_CALLBACK(card_selected), 0, emvm);
-#endif
-
- g_signal_connect (item, "drag_begin",
- G_CALLBACK(adapter_drag_begin), adapter);
-
- return item;
-}
-
-static void
-addressbook_reincarnate (EReflowModel *erm, int i, GnomeCanvasItem *item)
-{
- EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(erm);
- EAddressbookReflowAdapterPrivate *priv = adapter->priv;
-
- gnome_canvas_item_set(item,
- "contact", eab_model_contact_at (priv->model, i),
- NULL);
-}
-
-static void
-create_contact (EABModel *model,
- gint index, gint count,
- EAddressbookReflowAdapter *adapter)
-{
- e_reflow_model_items_inserted (E_REFLOW_MODEL (adapter),
- index,
- count);
-}
-
-static void
-remove_contacts (EABModel *model,
- gpointer data,
- EAddressbookReflowAdapter *adapter)
-{
- GArray *indices = (GArray *) data;
- int count = indices->len;
-
- if (count == 1)
- e_reflow_model_item_removed (E_REFLOW_MODEL (adapter), g_array_index (indices, gint, 0));
- else
- e_reflow_model_changed (E_REFLOW_MODEL (adapter));
-
-}
-
-static void
-modify_contact (EABModel *model,
- gint index,
- EAddressbookReflowAdapter *adapter)
-{
- e_reflow_model_item_changed (E_REFLOW_MODEL (adapter), index);
-}
-
-static void
-model_changed (EABModel *model,
- EAddressbookReflowAdapter *adapter)
-{
- e_reflow_model_changed (E_REFLOW_MODEL (adapter));
-}
-
-static void
-search_started (EABModel *model,
- EAddressbookReflowAdapter *adapter)
-{
- EAddressbookReflowAdapterPrivate *priv = adapter->priv;
-
- priv->loading = TRUE;
-}
-
-static void
-search_result (EABModel *model,
- EBookViewStatus status,
- EAddressbookReflowAdapter *adapter)
-{
- EAddressbookReflowAdapterPrivate *priv = adapter->priv;
-
- priv->loading = FALSE;
-
- e_reflow_model_comparison_changed (E_REFLOW_MODEL (adapter));
-}
-
-static void
-addressbook_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
- EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(object);
- EAddressbookReflowAdapterPrivate *priv = adapter->priv;
-
- switch (prop_id) {
- case PROP_BOOK:
- g_object_set (priv->model,
- "book", g_value_get_object (value),
- NULL);
- break;
- case PROP_QUERY:
- g_object_set (priv->model,
- "query", g_value_get_string (value),
- NULL);
- break;
- case PROP_EDITABLE:
- g_object_set (priv->model,
- "editable", g_value_get_boolean (value),
- NULL);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-addressbook_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
- EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(object);
- EAddressbookReflowAdapterPrivate *priv = adapter->priv;
-
- switch (prop_id) {
- case PROP_BOOK: {
- g_object_get_property (G_OBJECT (priv->model),
- "book", value);
- break;
- }
- case PROP_QUERY: {
- g_object_get_property (G_OBJECT (priv->model),
- "query", value);
- break;
- }
- case PROP_EDITABLE: {
- g_object_get_property (G_OBJECT (priv->model),
- "editable", value);
- break;
- }
- case PROP_MODEL:
- g_value_set_object (value, priv->model);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-e_addressbook_reflow_adapter_class_init (GObjectClass *object_class)
-{
- EReflowModelClass *model_class = (EReflowModelClass *) object_class;
-
- parent_class = g_type_class_peek_parent (object_class);
-
- object_class->set_property = addressbook_set_property;
- object_class->get_property = addressbook_get_property;
- object_class->dispose = addressbook_dispose;
-
- g_object_class_install_property (object_class, PROP_BOOK,
- g_param_spec_object ("book",
- _("Book"),
- /*_( */"XXX blurb" /*)*/,
- E_TYPE_BOOK,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_QUERY,
- g_param_spec_string ("query",
- _("Query"),
- /*_( */"XXX blurb" /*)*/,
- NULL,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_EDITABLE,
- g_param_spec_boolean ("editable",
- _("Editable"),
- /*_( */"XXX blurb" /*)*/,
- FALSE,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_MODEL,
- g_param_spec_object ("model",
- _("Model"),
- /*_( */"XXX blurb" /*)*/,
- EAB_TYPE_MODEL,
- G_PARAM_READABLE));
-
- e_addressbook_reflow_adapter_signals [DRAG_BEGIN] =
- g_signal_new ("drag_begin",
- G_OBJECT_CLASS_TYPE(object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EAddressbookReflowAdapterClass, drag_begin),
- NULL, NULL,
- eab_marshal_INT__POINTER,
- G_TYPE_INT, 1, G_TYPE_POINTER);
-
- model_class->set_width = addressbook_set_width;
- model_class->count = addressbook_count;
- model_class->height = addressbook_height;
- model_class->compare = addressbook_compare;
- model_class->incarnate = addressbook_incarnate;
- model_class->reincarnate = addressbook_reincarnate;
-}
-
-static void
-e_addressbook_reflow_adapter_init (GtkObject *object)
-{
- EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(object);
- EAddressbookReflowAdapterPrivate *priv;
-
- priv = adapter->priv = g_new0 (EAddressbookReflowAdapterPrivate, 1);
-
- priv->loading = FALSE;
- priv->create_contact_id = 0;
- priv->remove_contact_id = 0;
- priv->modify_contact_id = 0;
- priv->model_changed_id = 0;
- priv->search_started_id = 0;
- priv->search_result_id = 0;
-}
-
-GType
-e_addressbook_reflow_adapter_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (EAddressbookReflowAdapterClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) e_addressbook_reflow_adapter_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EAddressbookReflowAdapter),
- 0, /* n_preallocs */
- (GInstanceInitFunc) e_addressbook_reflow_adapter_init,
- };
-
- type = g_type_register_static (PARENT_TYPE, "EAddressbookReflowAdapter", &info, 0);
- }
-
- return type;
-}
-
-void
-e_addressbook_reflow_adapter_construct (EAddressbookReflowAdapter *adapter,
- EABModel *model)
-{
- EAddressbookReflowAdapterPrivate *priv = adapter->priv;
-
- priv->model = model;
- g_object_ref (priv->model);
-
- priv->create_contact_id = g_signal_connect(priv->model,
- "contact_added",
- G_CALLBACK(create_contact),
- adapter);
- priv->remove_contact_id = g_signal_connect(priv->model,
- "contacts_removed",
- G_CALLBACK(remove_contacts),
- adapter);
- priv->modify_contact_id = g_signal_connect(priv->model,
- "contact_changed",
- G_CALLBACK(modify_contact),
- adapter);
- priv->model_changed_id = g_signal_connect(priv->model,
- "model_changed",
- G_CALLBACK(model_changed),
- adapter);
- priv->search_started_id = g_signal_connect(priv->model,
- "search_started",
- G_CALLBACK(search_started),
- adapter);
- priv->search_result_id = g_signal_connect(priv->model,
- "search_result",
- G_CALLBACK(search_result),
- adapter);
-}
-
-EReflowModel *
-e_addressbook_reflow_adapter_new (EABModel *model)
-{
- EAddressbookReflowAdapter *et;
-
- et = g_object_new (E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER, NULL);
-
- e_addressbook_reflow_adapter_construct (et, model);
-
- return E_REFLOW_MODEL(et);
-}
-
-
-EContact *
-e_addressbook_reflow_adapter_get_contact (EAddressbookReflowAdapter *adapter,
- int index)
-{
- EAddressbookReflowAdapterPrivate *priv = adapter->priv;
-
- return eab_model_get_contact (priv->model, index);
-}
diff --git a/addressbook/gui/widgets/e-addressbook-reflow-adapter.h b/addressbook/gui/widgets/e-addressbook-reflow-adapter.h
deleted file mode 100644
index 1321b27bb4..0000000000
--- a/addressbook/gui/widgets/e-addressbook-reflow-adapter.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_ADDRESSBOOK_REFLOW_ADAPTER_H_
-#define _E_ADDRESSBOOK_REFLOW_ADAPTER_H_
-
-#include <gal/widgets/e-reflow-model.h>
-#include <libebook/e-contact.h>
-#include "e-addressbook-model.h"
-
-#define E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER (e_addressbook_reflow_adapter_get_type ())
-#define E_ADDRESSBOOK_REFLOW_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER, EAddressbookReflowAdapter))
-#define E_ADDRESSBOOK_REFLOW_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER, EAddressbookReflowAdapterClass))
-#define E_IS_ADDRESSBOOK_REFLOW_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER))
-#define E_IS_ADDRESSBOOK_REFLOW_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER))
-
-typedef struct _EAddressbookReflowAdapter EAddressbookReflowAdapter;
-typedef struct _EAddressbookReflowAdapterPrivate EAddressbookReflowAdapterPrivate;
-typedef struct _EAddressbookReflowAdapterClass EAddressbookReflowAdapterClass;
-
-struct _EAddressbookReflowAdapter {
- EReflowModel parent;
-
- EAddressbookReflowAdapterPrivate *priv;
-};
-
-
-struct _EAddressbookReflowAdapterClass {
- EReflowModelClass parent_class;
-
- /*
- * Signals
- */
- gint (* drag_begin) (EAddressbookReflowAdapter *adapter, GdkEvent *event);
-};
-
-
-GType e_addressbook_reflow_adapter_get_type (void);
-void e_addressbook_reflow_adapter_construct (EAddressbookReflowAdapter *adapter,
- EABModel *model);
-EReflowModel *e_addressbook_reflow_adapter_new (EABModel *model);
-
-/* Returns object with ref count of 1. */
-EContact *e_addressbook_reflow_adapter_get_contact (EAddressbookReflowAdapter *adapter,
- int index);
-#endif /* _E_ADDRESSBOOK_REFLOW_ADAPTER_H_ */
diff --git a/addressbook/gui/widgets/e-addressbook-table-adapter.c b/addressbook/gui/widgets/e-addressbook-table-adapter.c
deleted file mode 100644
index a11f749523..0000000000
--- a/addressbook/gui/widgets/e-addressbook-table-adapter.c
+++ /dev/null
@@ -1,354 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#include <config.h>
-#include "e-addressbook-model.h"
-#include "e-addressbook-table-adapter.h"
-#include "eab-contact-merging.h"
-#include "eab-gui-util.h"
-#include <libxml/tree.h>
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-#include <gnome.h>
-
-struct _EAddressbookTableAdapterPrivate {
- EABModel *model;
-
- int create_contact_id, remove_contact_id, modify_contact_id, model_changed_id;
-};
-
-#define PARENT_TYPE e_table_model_get_type()
-static ETableModelClass *parent_class;
-
-#define COLS (E_CONTACT_FIELD_LAST)
-
-static void
-unlink_model(EAddressbookTableAdapter *adapter)
-{
- EAddressbookTableAdapterPrivate *priv = adapter->priv;
-
- g_signal_handler_disconnect (priv->model,
- priv->create_contact_id);
- g_signal_handler_disconnect (priv->model,
- priv->remove_contact_id);
- g_signal_handler_disconnect (priv->model,
- priv->modify_contact_id);
- g_signal_handler_disconnect (priv->model,
- priv->model_changed_id);
-
- priv->create_contact_id = 0;
- priv->remove_contact_id = 0;
- priv->modify_contact_id = 0;
- priv->model_changed_id = 0;
-
- g_object_unref (priv->model);
-
- priv->model = NULL;
-}
-
-static void
-addressbook_dispose(GObject *object)
-{
- EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(object);
-
- if (adapter->priv) {
- unlink_model(adapter);
-
- g_free (adapter->priv);
- adapter->priv = NULL;
- }
-
- if (G_OBJECT_CLASS (parent_class)->dispose)
- (* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-/* This function returns the number of columns in our ETableModel. */
-static int
-addressbook_col_count (ETableModel *etc)
-{
- return COLS;
-}
-
-/* This function returns the number of rows in our ETableModel. */
-static int
-addressbook_row_count (ETableModel *etc)
-{
- EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(etc);
- EAddressbookTableAdapterPrivate *priv = adapter->priv;
-
- return eab_model_contact_count (priv->model);
-}
-
-/* This function returns the value at a particular point in our ETableModel. */
-static void *
-addressbook_value_at (ETableModel *etc, int col, int row)
-{
- EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(etc);
- EAddressbookTableAdapterPrivate *priv = adapter->priv;
- const char *value;
-
- if ( col >= COLS || row >= eab_model_contact_count (priv->model) )
- return NULL;
-
- value = e_contact_get_const((EContact*)eab_model_contact_at (priv->model, row), col);
-
- return (void *)(value ? value : "");
-}
-
-/* This function sets the value at a particular point in our ETableModel. */
-static void
-contact_modified_cb (EBook* book, EBookStatus status,
- gpointer user_data)
-{
- if (status != E_BOOK_ERROR_OK)
- eab_error_dialog (_("Error modifying card"), status);
-}
-
-static void
-addressbook_set_value_at (ETableModel *etc, int col, int row, const void *val)
-{
- EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(etc);
- EAddressbookTableAdapterPrivate *priv = adapter->priv;
-
- if (eab_model_editable (priv->model)) {
- EContact *contact;
-
- if (col >= COLS || row >= eab_model_contact_count (priv->model))
- return;
-
- contact = eab_model_get_contact (priv->model, row);
- if (!contact)
- return;
-
- e_table_model_pre_change(etc);
-
- e_contact_set(contact, col, (void *) val);
- eab_merging_book_commit_contact (eab_model_get_ebook (priv->model),
- contact, contact_modified_cb, NULL);
-
- g_object_unref (contact);
-
- /* XXX do we need this? shouldn't the commit_contact generate a changed signal? */
- e_table_model_cell_changed(etc, col, row);
- }
-}
-
-/* This function returns whether a particular cell is editable. */
-static gboolean
-addressbook_is_cell_editable (ETableModel *etc, int col, int row)
-{
-#if 0
- EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(etc);
- EAddressbookTableAdapterPrivate *priv = adapter->priv;
- const EContact *contact;
-
- if (row >= 0 && row < eab_model_contact_count (priv->model))
- contact = eab_model_contact_at (priv->model, row);
- else
- contact = NULL;
-
- if (!eab_model_editable(priv->model))
- return FALSE;
- else if (contact && e_contact_get ((EContact *) contact, E_CONTACT_IS_LIST))
- /* we only allow editing of the name and file as for
- lists */
- return col == E_CONTACT_FULL_NAME || col == E_CONTACT_FILE_AS;
- else
- return col < E_CONTACT_LAST_SIMPLE_STRING;
-#endif
-
- return FALSE;
-}
-
-static void
-addressbook_append_row (ETableModel *etm, ETableModel *source, gint row)
-{
- EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(etm);
- EAddressbookTableAdapterPrivate *priv = adapter->priv;
- EContact *contact;
- int col;
-
- contact = e_contact_new ();
-
- for (col = 1; col < E_CONTACT_LAST_SIMPLE_STRING; col++) {
- const void *val = e_table_model_value_at (source, col, row);
- e_contact_set (contact, col, (void *) val);
- }
-
- eab_merging_book_add_contact (eab_model_get_ebook (priv->model), contact, NULL, NULL);
-
- g_object_unref (contact);
-}
-
-/* This function duplicates the value passed to it. */
-static void *
-addressbook_duplicate_value (ETableModel *etc, int col, const void *value)
-{
- return g_strdup(value);
-}
-
-/* This function frees the value passed to it. */
-static void
-addressbook_free_value (ETableModel *etc, int col, void *value)
-{
- g_free(value);
-}
-
-static void *
-addressbook_initialize_value (ETableModel *etc, int col)
-{
- return g_strdup("");
-}
-
-static gboolean
-addressbook_value_is_empty (ETableModel *etc, int col, const void *value)
-{
- return !(value && *(char *)value);
-}
-
-static char *
-addressbook_value_to_string (ETableModel *etc, int col, const void *value)
-{
- return g_strdup(value);
-}
-
-static void
-eab_table_adapter_class_init (GObjectClass *object_class)
-{
- ETableModelClass *model_class = (ETableModelClass *) object_class;
-
- parent_class = g_type_class_peek_parent (object_class);
-
- object_class->dispose = addressbook_dispose;
-
- model_class->column_count = addressbook_col_count;
- model_class->row_count = addressbook_row_count;
- model_class->value_at = addressbook_value_at;
- model_class->set_value_at = addressbook_set_value_at;
- model_class->is_cell_editable = addressbook_is_cell_editable;
- model_class->append_row = addressbook_append_row;
- model_class->duplicate_value = addressbook_duplicate_value;
- model_class->free_value = addressbook_free_value;
- model_class->initialize_value = addressbook_initialize_value;
- model_class->value_is_empty = addressbook_value_is_empty;
- model_class->value_to_string = addressbook_value_to_string;
-}
-
-static void
-eab_table_adapter_init (GObject *object)
-{
- EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(object);
- EAddressbookTableAdapterPrivate *priv;
-
- priv = adapter->priv = g_new0 (EAddressbookTableAdapterPrivate, 1);
-
- priv->create_contact_id = 0;
- priv->remove_contact_id = 0;
- priv->modify_contact_id = 0;
- priv->model_changed_id = 0;
-}
-
-
-static void
-create_contact (EABModel *model,
- gint index, gint count,
- EAddressbookTableAdapter *adapter)
-{
- e_table_model_pre_change (E_TABLE_MODEL (adapter));
- e_table_model_rows_inserted (E_TABLE_MODEL (adapter), index, count);
-}
-
-static void
-remove_contacts (EABModel *model,
- gpointer data,
- EAddressbookTableAdapter *adapter)
-{
- GArray *indices = (GArray *) data;
- int count = indices->len;
-
-
- e_table_model_pre_change (E_TABLE_MODEL (adapter));
- if (count == 1)
- e_table_model_rows_deleted (E_TABLE_MODEL (adapter), g_array_index (indices, gint, 0), 1);
- else
- e_table_model_changed (E_TABLE_MODEL (adapter));
-}
-
-static void
-modify_contact (EABModel *model,
- gint index,
- EAddressbookTableAdapter *adapter)
-{
- e_table_model_pre_change (E_TABLE_MODEL (adapter));
- e_table_model_row_changed (E_TABLE_MODEL (adapter), index);
-}
-
-static void
-model_changed (EABModel *model,
- EAddressbookTableAdapter *adapter)
-{
- e_table_model_pre_change (E_TABLE_MODEL (adapter));
- e_table_model_changed (E_TABLE_MODEL (adapter));
-}
-
-GType
-eab_table_adapter_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (EAddressbookTableAdapterClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) eab_table_adapter_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EAddressbookTableAdapter),
- 0, /* n_preallocs */
- (GInstanceInitFunc) eab_table_adapter_init,
- };
-
- type = g_type_register_static (PARENT_TYPE, "EAddressbookTableAdapter", &info, 0);
- }
-
- return type;
-}
-
-void
-eab_table_adapter_construct (EAddressbookTableAdapter *adapter,
- EABModel *model)
-{
- EAddressbookTableAdapterPrivate *priv = adapter->priv;
-
- priv->model = model;
- g_object_ref (priv->model);
-
- priv->create_contact_id = g_signal_connect(priv->model,
- "contact_added",
- G_CALLBACK(create_contact),
- adapter);
- priv->remove_contact_id = g_signal_connect(priv->model,
- "contacts_removed",
- G_CALLBACK(remove_contacts),
- adapter);
- priv->modify_contact_id = g_signal_connect(priv->model,
- "contact_changed",
- G_CALLBACK(modify_contact),
- adapter);
- priv->model_changed_id = g_signal_connect(priv->model,
- "model_changed",
- G_CALLBACK(model_changed),
- adapter);
-}
-
-ETableModel *
-eab_table_adapter_new (EABModel *model)
-{
- EAddressbookTableAdapter *et;
-
- et = g_object_new(E_TYPE_AB_TABLE_ADAPTER, NULL);
-
- eab_table_adapter_construct (et, model);
-
- return E_TABLE_MODEL(et);
-}
diff --git a/addressbook/gui/widgets/e-addressbook-table-adapter.h b/addressbook/gui/widgets/e-addressbook-table-adapter.h
deleted file mode 100644
index cf139e2bee..0000000000
--- a/addressbook/gui/widgets/e-addressbook-table-adapter.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _EAB_TABLE_ADAPTER_H_
-#define _EAB_TABLE_ADAPTER_H_
-
-#include <gal/e-table/e-table-model.h>
-#include <libebook/e-book.h>
-#include <libebook/e-book-view.h>
-
-#define E_TYPE_AB_TABLE_ADAPTER (eab_table_adapter_get_type ())
-#define EAB_TABLE_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_AB_TABLE_ADAPTER, EAddressbookTableAdapter))
-#define EAB_TABLE_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), E_TYPE_AB_TABLE_ADAPTER, EAddressbookTableAdapterClass))
-#define E_IS_ADDRESSBOOK_TABLE_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_AB_TABLE_ADAPTER))
-#define E_IS_ADDRESSBOOK_TABLE_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_AB_TABLE_ADAPTER))
-
-typedef struct _EAddressbookTableAdapter EAddressbookTableAdapter;
-typedef struct _EAddressbookTableAdapterPrivate EAddressbookTableAdapterPrivate;
-typedef struct _EAddressbookTableAdapterClass EAddressbookTableAdapterClass;
-
-struct _EAddressbookTableAdapter {
- ETableModel parent;
-
- EAddressbookTableAdapterPrivate *priv;
-};
-
-
-struct _EAddressbookTableAdapterClass {
- ETableModelClass parent_class;
-};
-
-
-GType eab_table_adapter_get_type (void);
-void eab_table_adapter_construct (EAddressbookTableAdapter *adapter,
- EABModel *model);
-ETableModel *eab_table_adapter_new (EABModel *model);
-
-#endif /* _EAB_TABLE_ADAPTER_H_ */
diff --git a/addressbook/gui/widgets/e-addressbook-treeview-adapter.c b/addressbook/gui/widgets/e-addressbook-treeview-adapter.c
deleted file mode 100644
index 2d0c4b8c93..0000000000
--- a/addressbook/gui/widgets/e-addressbook-treeview-adapter.c
+++ /dev/null
@@ -1,621 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#include <config.h>
-#include "e-addressbook-model.h"
-#include "e-addressbook-treeview-adapter.h"
-#include "e-card-merging.h"
-#include "eab-gui-util.h"
-#include <gtk/gtktreednd.h>
-#include <libxml/tree.h>
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-
-struct _EAddressbookTreeViewAdapterPrivate {
- EAddressbookModel *model;
-
- gint stamp;
-
- ECardSimple **simples;
- int count;
-
- int create_card_id, remove_card_id, modify_card_id, model_changed_id;
-};
-
-#define PARENT_TYPE G_TYPE_OBJECT
-GObjectClass *parent_class;
-
-#define COLS (E_CARD_SIMPLE_FIELD_LAST)
-
-static void
-unlink_model(EAddressbookTreeViewAdapter *adapter)
-{
- EAddressbookTreeViewAdapterPrivate *priv = adapter->priv;
- int i;
-
- g_signal_handler_disconnect (priv->model,
- priv->create_card_id);
- g_signal_handler_disconnect (priv->model,
- priv->remove_card_id);
- g_signal_handler_disconnect (priv->model,
- priv->modify_card_id);
- g_signal_handler_disconnect (priv->model,
- priv->model_changed_id);
-
- priv->create_card_id = 0;
- priv->remove_card_id = 0;
- priv->modify_card_id = 0;
- priv->model_changed_id = 0;
-
- /* free up the existing mapping if there is one */
- if (priv->simples) {
- for (i = 0; i < priv->count; i ++)
- g_object_unref (priv->simples[i]);
- g_free (priv->simples);
- priv->simples = NULL;
- }
-
- g_object_unref (priv->model);
-
- priv->model = NULL;
-}
-
-static void
-build_simple_mapping(EAddressbookTreeViewAdapter *adapter)
-{
- EAddressbookTreeViewAdapterPrivate *priv = adapter->priv;
- int i;
-
- /* free up the existing mapping if there is one */
- if (priv->simples) {
- for (i = 0; i < priv->count; i ++)
- g_object_unref (priv->simples[i]);
- g_free (priv->simples);
- }
-
- /* build up our mapping to ECardSimple*'s */
- priv->count = e_addressbook_model_card_count (priv->model);
- priv->simples = g_new (ECardSimple*, priv->count);
- for (i = 0; i < priv->count; i ++) {
- priv->simples[i] = e_card_simple_new (e_addressbook_model_card_at (priv->model, i));
- g_object_ref (priv->simples[i]);
- }
-}
-
-static void
-addressbook_destroy(GtkObject *object)
-{
- EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER(object);
-
- unlink_model(adapter);
-
- g_free (adapter->priv);
- adapter->priv = NULL;
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-#if 0
-static void
-addressbook_set_value_at (ETableModel *etc, int col, int row, const void *val)
-{
- EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TABLE_ADAPTER(etc);
- EAddressbookTableAdapterPrivate *priv = adapter->priv;
- if (e_addressbook_model_editable (priv->model)) {
- ECard *card;
-
- if ( col >= COLS|| row >= e_addressbook_model_card_count (priv->model) )
- return;
-
- e_table_model_pre_change(etc);
-
- e_card_simple_set(priv->simples[row],
- col,
- val);
- g_object_get(priv->simples[row],
- "card", &card,
- NULL);
-
- e_card_merging_book_commit_card(e_addressbook_model_get_ebook(priv->model),
- card, card_modified_cb, NULL);
-
- /* XXX do we need this? shouldn't the commit_card generate a changed signal? */
- e_table_model_cell_changed(etc, col, row);
- }
-}
-
-/* This function returns whether a particular cell is editable. */
-static gboolean
-addressbook_is_cell_editable (ETableModel *etc, int col, int row)
-{
- EAddressbookTableAdapter *adapter = E_ADDRESSBOOK_TABLE_ADAPTER(etc);
- EAddressbookTableAdapterPrivate *priv = adapter->priv;
- ECard *card;
-
- if (row >= 0 && row < e_addressbook_model_card_count (priv->model))
- card = e_addressbook_model_card_at (priv->model, row);
- else
- card = NULL;
-
- if (!e_addressbook_model_editable(priv->model))
- return FALSE;
- else if (card && e_card_evolution_list (card))
- /* we only allow editing of the name and file as for
- lists */
- return col == E_CARD_SIMPLE_FIELD_FULL_NAME || col == E_CARD_SIMPLE_FIELD_FILE_AS;
- else
- return col < E_CARD_SIMPLE_FIELD_LAST_SIMPLE_STRING;
-}
-
-static void
-addressbook_append_row (ETableModel *etm, ETableModel *source, gint row)
-{
- EAddressbookTableAdapter *adapter = E_ADDRESSBOOK_TABLE_ADAPTER(etm);
- EAddressbookTableAdapterPrivate *priv = adapter->priv;
- ECard *card;
- ECardSimple *simple;
- int col;
-
- card = e_card_new("");
- simple = e_card_simple_new(card);
-
- for (col = 0; col < E_CARD_SIMPLE_FIELD_LAST_SIMPLE_STRING; col++) {
- const void *val = e_table_model_value_at(source, col, row);
- e_card_simple_set(simple, col, val);
- }
- e_card_simple_sync_card(simple);
- e_card_merging_book_add_card (e_addressbook_model_get_ebook (priv->model), card, NULL, NULL);
- g_object_unref (simple);
- g_object_unref (card);
-}
-#endif
-
-static void
-e_addressbook_treeview_adapter_class_init (GtkObjectClass *object_class)
-{
- parent_class = g_type_class_peek_parent (object_class);
-
- object_class->destroy = addressbook_destroy;
-}
-
-static void
-e_addressbook_treeview_adapter_init (GtkObject *object)
-{
- EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER(object);
- EAddressbookTreeViewAdapterPrivate *priv;
-
- priv = adapter->priv = g_new0 (EAddressbookTreeViewAdapterPrivate, 1);
-
- priv->create_card_id = 0;
- priv->remove_card_id = 0;
- priv->modify_card_id = 0;
- priv->model_changed_id = 0;
- priv->simples = NULL;
- priv->count = 0;
-}
-
-static void
-get_iter (EAddressbookTreeViewAdapter *adapter, gint index, GtkTreeIter *iter)
-{
- EAddressbookTreeViewAdapterPrivate *priv = adapter->priv;
-
- iter->stamp = priv->stamp;
- iter->user_data = GINT_TO_POINTER (index);
-}
-
-static void
-create_card (EAddressbookModel *model,
- gint index, gint count,
- EAddressbookTreeViewAdapter *adapter)
-{
- EAddressbookTreeViewAdapterPrivate *priv = adapter->priv;
- int i;
-
- priv->count += count;
- priv->simples = g_renew(ECardSimple *, priv->simples, priv->count);
- memmove (priv->simples + index + count, priv->simples + index, (priv->count - index - count) * sizeof (ECardSimple *));
-
- for (i = 0; i < count; i ++) {
- GtkTreeIter iter;
- GtkTreePath *path;
-
- priv->simples[index + i] = e_card_simple_new (e_addressbook_model_card_at (priv->model, index + i));
-
- get_iter (adapter, index + i, &iter);
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (adapter), &iter);
-
- gtk_tree_model_row_inserted (GTK_TREE_MODEL (adapter), path, &iter);
- gtk_tree_model_row_changed (GTK_TREE_MODEL (adapter), path, &iter);
-
- gtk_tree_path_free (path);
- }
-}
-
-static void
-remove_card (EAddressbookModel *model,
- gint index,
- EAddressbookTreeViewAdapter *adapter)
-{
- EAddressbookTreeViewAdapterPrivate *priv = adapter->priv;
- GtkTreeIter iter;
- GtkTreePath *path;
-
- g_object_unref (priv->simples[index]);
- memmove (priv->simples + index, priv->simples + index + 1, (priv->count - index - 1) * sizeof (ECardSimple *));
- priv->count --;
- get_iter (adapter, index, &iter);
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (adapter), &iter);
-
- gtk_tree_model_row_deleted (GTK_TREE_MODEL (adapter), path);
-
- gtk_tree_path_free (path);
-}
-
-static void
-modify_card (EAddressbookModel *model,
- gint index,
- EAddressbookTreeViewAdapter *adapter)
-{
- EAddressbookTreeViewAdapterPrivate *priv = adapter->priv;
- GtkTreeIter iter;
- GtkTreePath *path;
-
- g_object_unref (priv->simples[index]);
- priv->simples[index] = e_card_simple_new (e_addressbook_model_card_at (priv->model, index));
-
- get_iter (adapter, index, &iter);
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (adapter), &iter);
-
- gtk_tree_model_row_changed (GTK_TREE_MODEL (adapter), path, &iter);
-
- gtk_tree_path_free (path);
-}
-
-static void
-model_changed (EAddressbookModel *model,
- EAddressbookTreeViewAdapter *adapter)
-{
- int i;
-
- /* there has *got* to be an easier/faster way to do this... */
- for (i = 0; i < adapter->priv->count; i++) {
- remove_card (model, i, adapter);
- }
-
- build_simple_mapping (adapter);
-
- if (adapter->priv->count) {
- printf ("AIIEEEEEE\n");
- }
-
- /* XXX this isn't right either, we need to add the new cards */
-}
-
-static GtkTreeModelFlags
-adapter_get_flags (GtkTreeModel *tree_model)
-{
- g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), 0);
-
- return GTK_TREE_MODEL_LIST_ONLY;
-}
-
-static gint
-adapter_get_n_columns (GtkTreeModel *tree_model)
-{
- g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), 0);
-
- return COLS;
-}
-
-static GType
-adapter_get_column_type (GtkTreeModel *tree_model,
- gint index)
-{
- g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), G_TYPE_INVALID);
- g_return_val_if_fail (index < COLS && index >= 0, G_TYPE_INVALID);
-
- return G_TYPE_STRING;
-}
-
-static gboolean
-adapter_get_iter (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreePath *path)
-{
- EAddressbookTreeViewAdapter *adapter;
- GSList *list;
- gint i;
-
- g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), FALSE);
- g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE);
-
- adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model);
-
- i = gtk_tree_path_get_indices (path)[0];
-
- if (i >= adapter->priv->count)
- return FALSE;
-
- iter->stamp = adapter->priv->stamp;
- iter->user_data = GINT_TO_POINTER (i);
-
- return TRUE;
-}
-
-static GtkTreePath *
-adapter_get_path (GtkTreeModel *tree_model,
- GtkTreeIter *iter)
-{
- EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model);
- GtkTreePath *retval;
-
- g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), NULL);
- g_return_val_if_fail (iter->stamp == adapter->priv->stamp, NULL);
-
-
- if (GPOINTER_TO_INT (iter->user_data) >= adapter->priv->count)
- return NULL;
-
- retval = gtk_tree_path_new ();
- gtk_tree_path_append_index (retval, GPOINTER_TO_INT (iter->user_data));
- return retval;
-}
-
-static void
-adapter_get_value (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- gint column,
- GValue *value)
-{
- EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model);
- ECardSimple *simple;
- gint tmp_column = column;
- const char *v;
-
- g_return_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model));
- g_return_if_fail (column < COLS);
- g_return_if_fail (adapter->priv->stamp == iter->stamp);
-
- simple = adapter->priv->simples [ GPOINTER_TO_INT (iter->user_data) ];
-
- v = e_card_simple_get_const(simple, column);
-
- g_value_init (value, G_TYPE_STRING);
- g_value_set_string (value, (v ? v : ""));
-}
-
-static gboolean
-adapter_iter_next (GtkTreeModel *tree_model,
- GtkTreeIter *iter)
-{
- EAddressbookTreeViewAdapter *adapter;
-
- g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), FALSE);
- g_return_val_if_fail (E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model)->priv->stamp == iter->stamp, FALSE);
-
- adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model);
-
- iter->user_data = GINT_TO_POINTER (GPOINTER_TO_INT (iter->user_data) + 1);
-
- return (GPOINTER_TO_INT (iter->user_data) < adapter->priv->count);
-}
-
-static gboolean
-adapter_iter_children (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *parent)
-{
- EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model);
-
- /* this is a list, nodes have no children */
- if (parent)
- return FALSE;
-
- /* but if parent == NULL we return the list itself as children of the
- * "root"
- */
- if (adapter->priv->count) {
- iter->stamp = adapter->priv->stamp;
- iter->user_data = GINT_TO_POINTER (0);
- return TRUE;
- }
- else
- return FALSE;
-}
-
-static gboolean
-adapter_iter_has_child (GtkTreeModel *tree_model,
- GtkTreeIter *iter)
-{
- return FALSE;
-}
-
-static gint
-adapter_iter_n_children (GtkTreeModel *tree_model,
- GtkTreeIter *iter)
-{
- EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model);
-
- g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), -1);
- if (iter == NULL)
- return adapter->priv->count;
-
- g_return_val_if_fail (adapter->priv->stamp == iter->stamp, -1);
- return 0;
-}
-
-static gboolean
-adapter_iter_nth_child (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *parent,
- gint n)
-{
- EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model);
-
- g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), FALSE);
-
- if (parent)
- return FALSE;
-
- if (n < adapter->priv->count) {
- iter->stamp = adapter->priv->stamp;
- iter->user_data = GINT_TO_POINTER (n);
- return TRUE;
- }
- else
- return FALSE;
-}
-
-static gboolean
-adapter_iter_parent (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *child)
-{
- return FALSE;
-}
-
-static void
-adapter_tree_model_init (GtkTreeModelIface *iface)
-{
- iface->get_flags = adapter_get_flags;
- iface->get_n_columns = adapter_get_n_columns;
- iface->get_column_type = adapter_get_column_type;
- iface->get_iter = adapter_get_iter;
- iface->get_path = adapter_get_path;
- iface->get_value = adapter_get_value;
- iface->iter_next = adapter_iter_next;
- iface->iter_children = adapter_iter_children;
- iface->iter_has_child = adapter_iter_has_child;
- iface->iter_n_children = adapter_iter_n_children;
- iface->iter_nth_child = adapter_iter_nth_child;
- iface->iter_parent = adapter_iter_parent;
-}
-
-static gboolean
-adapter_drag_data_delete (GtkTreeDragSource *drag_source,
- GtkTreePath *path)
-{
- g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (drag_source), FALSE);
-
- return FALSE;
-}
-
-static gboolean
-adapter_drag_data_get (GtkTreeDragSource *drag_source,
- GtkTreePath *path,
- GtkSelectionData *selection_data)
-{
- g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (drag_source), FALSE);
-
- /* Note that we don't need to handle the GTK_TREE_MODEL_ROW
- * target, because the default handler does it for us, but
- * we do anyway for the convenience of someone maybe overriding the
- * default handler.
- */
-
- if (gtk_tree_set_row_drag_data (selection_data,
- GTK_TREE_MODEL (drag_source),
- path)) {
- return TRUE;
- }
- else {
- if (selection_data->target == gdk_atom_intern ("text/x-vcard", FALSE)) {
- printf ("HI THERE\n");
- }
- }
-
- return FALSE;
-}
-
-static void
-adapter_drag_source_init (GtkTreeDragSourceIface *iface)
-{
- iface->drag_data_delete = adapter_drag_data_delete;
- iface->drag_data_get = adapter_drag_data_get;
-}
-
-GType
-e_addressbook_treeview_adapter_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo adapter_info = {
- sizeof (EAddressbookTreeViewAdapterClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) e_addressbook_treeview_adapter_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EAddressbookTreeViewAdapter),
- 0, /* n_preallocs */
- (GInstanceInitFunc) e_addressbook_treeview_adapter_init,
- };
-
- static const GInterfaceInfo tree_model_info = {
- (GInterfaceInitFunc) adapter_tree_model_init,
- NULL,
- NULL
- };
-
- static const GInterfaceInfo drag_source_info = {
- (GInterfaceInitFunc) adapter_drag_source_init,
- NULL,
- NULL
- };
-
- type = g_type_register_static (PARENT_TYPE, "EAddressbookTreeViewAdapter", &adapter_info, 0);
-
- g_type_add_interface_static (type,
- GTK_TYPE_TREE_MODEL,
- &tree_model_info);
-
- g_type_add_interface_static (type,
- GTK_TYPE_TREE_DRAG_SOURCE,
- &drag_source_info);
- }
-
- return type;
-}
-
-void
-e_addressbook_treeview_adapter_construct (EAddressbookTreeViewAdapter *adapter,
- EAddressbookModel *model)
-{
- EAddressbookTreeViewAdapterPrivate *priv = adapter->priv;
-
- priv->model = model;
- g_object_ref (priv->model);
-
- priv->stamp = g_random_int ();
-
- priv->create_card_id = g_signal_connect(priv->model,
- "card_added",
- G_CALLBACK(create_card),
- adapter);
- priv->remove_card_id = g_signal_connect(priv->model,
- "card_removed",
- G_CALLBACK(remove_card),
- adapter);
- priv->modify_card_id = g_signal_connect(priv->model,
- "card_changed",
- G_CALLBACK(modify_card),
- adapter);
- priv->model_changed_id = g_signal_connect(priv->model,
- "model_changed",
- G_CALLBACK(model_changed),
- adapter);
-
- build_simple_mapping (adapter);
-}
-
-GtkTreeModel *
-e_addressbook_treeview_adapter_new (EAddressbookModel *model)
-{
- EAddressbookTreeViewAdapter *et;
-
- et = g_object_new(E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER, NULL);
-
- e_addressbook_treeview_adapter_construct (et, model);
-
- return (GtkTreeModel*)et;
-}
diff --git a/addressbook/gui/widgets/e-addressbook-treeview-adapter.h b/addressbook/gui/widgets/e-addressbook-treeview-adapter.h
deleted file mode 100644
index 2c4370dee3..0000000000
--- a/addressbook/gui/widgets/e-addressbook-treeview-adapter.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_ADDRESSBOOK_TREEVIEW_ADAPTER_H_
-#define _E_ADDRESSBOOK_TREEVIEW_ADAPTER_H_
-
-#include <gtk/gtktreemodel.h>
-#include "addressbook/backend/ebook/e-book.h"
-#include "addressbook/backend/ebook/e-book-view.h"
-#include "addressbook/backend/ebook/e-card-simple.h"
-
-#define E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER (e_addressbook_treeview_adapter_get_type ())
-#define E_ADDRESSBOOK_TREEVIEW_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER, EAddressbookTreeViewAdapter))
-#define E_ADDRESSBOOK_TREEVIEW_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER, EAddressbookTreeViewAdapterClass))
-#define E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER))
-#define E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER))
-
-/* Virtual Column list:
- 0 Email
- 1 Full Name
- 2 Street
- 3 Phone
-*/
-
-typedef struct _EAddressbookTreeViewAdapter EAddressbookTreeViewAdapter;
-typedef struct _EAddressbookTreeViewAdapterPrivate EAddressbookTreeViewAdapterPrivate;
-typedef struct _EAddressbookTreeViewAdapterClass EAddressbookTreeViewAdapterClass;
-
-struct _EAddressbookTreeViewAdapter {
- GObject parent;
-
- EAddressbookTreeViewAdapterPrivate *priv;
-};
-
-
-struct _EAddressbookTreeViewAdapterClass {
- GObjectClass parent_class;
-};
-
-
-GType e_addressbook_treeview_adapter_get_type (void);
-void e_addressbook_treeview_adapter_construct (EAddressbookTreeViewAdapter *adapter,
- EAddressbookModel *model);
-GtkTreeModel *e_addressbook_treeview_adapter_new (EAddressbookModel *model);
-
-#endif /* _E_ADDRESSBOOK_TABLE_ADAPTER_H_ */
diff --git a/addressbook/gui/widgets/e-addressbook-view.c b/addressbook/gui/widgets/e-addressbook-view.c
deleted file mode 100644
index 5f8397161b..0000000000
--- a/addressbook/gui/widgets/e-addressbook-view.c
+++ /dev/null
@@ -1,2206 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-addressbook-view.c
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- * Chris Toshok <toshok@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include <gtk/gtk.h>
-
-#include <libgnome/gnome-i18n.h>
-#include <libgnome/gnome-util.h>
-#include <gtk/gtkscrolledwindow.h>
-#include <gal/e-table/e-table-scrolled.h>
-#include <gal/e-table/e-table-model.h>
-#include <gal/widgets/e-gui-utils.h>
-#include <gal/menus/gal-view-factory-etable.h>
-#include <gal/menus/gal-view-etable.h>
-#include <gal/util/e-xml-utils.h>
-#include <libgnomeui/gnome-dialog-util.h>
-
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
-
-#include "addressbook/printing/e-contact-print.h"
-#include "addressbook/printing/e-contact-print-envelope.h"
-#include "addressbook/gui/search/e-addressbook-search-dialog.h"
-#include "addressbook/gui/widgets/eab-popup.h"
-#include "addressbook/gui/widgets/eab-menu.h"
-
-#include "e-util/e-categories-master-list-wombat.h"
-#include "e-util/e-print.h"
-#include "libedataserver/e-sexp.h"
-
-#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW
-#include <gal/widgets/e-treeview-selection-model.h>
-#include "gal-view-factory-treeview.h"
-#include "gal-view-treeview.h"
-#endif
-#include "gal-view-minicard.h"
-#include "gal-view-factory-minicard.h"
-
-#include "eab-marshal.h"
-#include "e-addressbook-view.h"
-#include "e-addressbook-model.h"
-#include "eab-gui-util.h"
-#include "util/eab-book-util.h"
-#include "e-addressbook-table-adapter.h"
-#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW
-#include "e-addressbook-treeview-adapter.h"
-#endif
-#include "eab-contact-merging.h"
-
-#include "widgets/misc/e-error.h"
-
-#include "e-contact-editor.h"
-#include <gdk/gdkkeysyms.h>
-#include <ctype.h>
-#include <string.h>
-
-#include <libxml/tree.h>
-#include <libxml/parser.h>
-
-#define SHOW_ALL_SEARCH "(contains \"x-evolution-any-field\" \"\")"
-
-#define d(x)
-
-static void eab_view_init (EABView *card);
-static void eab_view_class_init (EABViewClass *klass);
-
-static void eab_view_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
-static void eab_view_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
-
-static void eab_view_dispose (GObject *object);
-static void change_view_type (EABView *view, EABViewType view_type);
-
-static void status_message (GtkObject *object, const gchar *status, EABView *eav);
-static void search_result (GtkObject *object, EBookViewStatus status, EABView *eav);
-static void folder_bar_message (GtkObject *object, const gchar *status, EABView *eav);
-static void stop_state_changed (GtkObject *object, EABView *eav);
-static void writable_status (GtkObject *object, gboolean writable, EABView *eav);
-static void backend_died (GtkObject *object, EABView *eav);
-static void contact_changed (EABModel *model, gint index, EABView *eav);
-static void contacts_removed (EABModel *model, gpointer data, EABView *eav);
-static GList *get_selected_contacts (EABView *view);
-
-static void command_state_change (EABView *eav);
-
-static void selection_clear_event (GtkWidget *invisible, GdkEventSelection *event,
- EABView *view);
-static void selection_received (GtkWidget *invisible, GtkSelectionData *selection_data,
- guint time, EABView *view);
-static void selection_get (GtkWidget *invisible, GtkSelectionData *selection_data,
- guint info, guint time_stamp, EABView *view);
-static void invisible_destroyed (gpointer data, GObject *where_object_was);
-
-static void make_suboptions (EABView *view);
-static void query_changed (ESearchBar *esb, EABView *view);
-static void search_activated (ESearchBar *esb, EABView *view);
-static void search_menu_activated (ESearchBar *esb, int id, EABView *view);
-static void connect_master_list_changed (EABView *view);
-static ECategoriesMasterList *get_master_list (void);
-
-#define PARENT_TYPE GTK_TYPE_VBOX
-static GtkVBoxClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- PROP_0,
- PROP_BOOK,
- PROP_SOURCE,
- PROP_QUERY,
- PROP_TYPE,
-};
-
-enum {
- STATUS_MESSAGE,
- SEARCH_RESULT,
- FOLDER_BAR_MESSAGE,
- COMMAND_STATE_CHANGE,
- LAST_SIGNAL
-};
-
-enum DndTargetType {
- DND_TARGET_TYPE_SOURCE_VCARD,
- DND_TARGET_TYPE_VCARD
-};
-#define VCARD_TYPE "text/x-vcard"
-#define SOURCE_VCARD_TYPE "text/x-source-vcard"
-static GtkTargetEntry drag_types[] = {
- { SOURCE_VCARD_TYPE, 0, DND_TARGET_TYPE_SOURCE_VCARD },
- { VCARD_TYPE, 0, DND_TARGET_TYPE_VCARD }
-};
-static const int num_drag_types = sizeof (drag_types) / sizeof (drag_types[0]);
-
-static guint eab_view_signals [LAST_SIGNAL] = {0, };
-
-static GdkAtom clipboard_atom = GDK_NONE;
-
-static GalViewCollection *collection = NULL;
-
-enum {
- ESB_FULL_NAME,
- ESB_EMAIL,
- ESB_CATEGORY,
- ESB_ANY,
- ESB_ADVANCED
-};
-
-static ESearchBarItem addressbook_search_option_items[] = {
- { N_("Name begins with"), ESB_FULL_NAME, NULL },
- { N_("Email begins with"), ESB_EMAIL, NULL },
- { N_("Category is"), ESB_CATEGORY, NULL }, /* We attach subitems below */
- { N_("Any field contains"), ESB_ANY, NULL },
- { N_("Advanced..."), ESB_ADVANCED, NULL },
- { NULL, -1, NULL }
-};
-
-static ESearchBarItem addressbook_search_items[] = {
- { N_("Advanced..."), ESB_ADVANCED, NULL },
- { NULL, -1, NULL },
-};
-
-GType
-eab_view_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (EABViewClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) eab_view_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EABView),
- 0, /* n_preallocs */
- (GInstanceInitFunc) eab_view_init,
- };
-
- type = g_type_register_static (PARENT_TYPE, "EABView", &info, 0);
- }
-
- return type;
-}
-
-static void
-eab_view_class_init (EABViewClass *klass)
-{
- GObjectClass *object_class;
- GtkWidgetClass *widget_class;
-
- object_class = G_OBJECT_CLASS(klass);
- widget_class = GTK_WIDGET_CLASS(klass);
-
- parent_class = gtk_type_class (PARENT_TYPE);
-
- object_class->set_property = eab_view_set_property;
- object_class->get_property = eab_view_get_property;
- object_class->dispose = eab_view_dispose;
-
- g_object_class_install_property (object_class, PROP_BOOK,
- g_param_spec_object ("book",
- _("Book"),
- /*_( */"XXX blurb" /*)*/,
- E_TYPE_BOOK,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_SOURCE,
- g_param_spec_object ("source",
- _("Source"),
- /*_( */"XXX blurb" /*)*/,
- E_TYPE_SOURCE,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_QUERY,
- g_param_spec_string ("query",
- _("Query"),
- /*_( */"XXX blurb" /*)*/,
- NULL,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_TYPE,
- g_param_spec_int ("type",
- _("Type"),
- /*_( */"XXX blurb" /*)*/,
- EAB_VIEW_NONE,
- EAB_VIEW_TABLE,
- EAB_VIEW_NONE,
- G_PARAM_READWRITE));
-
- eab_view_signals [STATUS_MESSAGE] =
- g_signal_new ("status_message",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EABViewClass, status_message),
- NULL, NULL,
- eab_marshal_NONE__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
-
- eab_view_signals [SEARCH_RESULT] =
- g_signal_new ("search_result",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EABViewClass, search_result),
- NULL, NULL,
- eab_marshal_NONE__INT,
- G_TYPE_NONE, 1, G_TYPE_INT);
-
- eab_view_signals [FOLDER_BAR_MESSAGE] =
- g_signal_new ("folder_bar_message",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EABViewClass, folder_bar_message),
- NULL, NULL,
- eab_marshal_NONE__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
-
- eab_view_signals [COMMAND_STATE_CHANGE] =
- g_signal_new ("command_state_change",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EABViewClass, command_state_change),
- NULL, NULL,
- eab_marshal_NONE__NONE,
- G_TYPE_NONE, 0);
-
- if (!clipboard_atom)
- clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE);
-
- /* init the accessibility support for e_addressbook_view */
- eab_view_a11y_init();
-}
-
-static void
-eab_view_init (EABView *eav)
-{
- eav->view_type = EAB_VIEW_NONE;
-
- eav->model = NULL;
- eav->object = NULL;
- eav->widget = NULL;
- eav->contact_display_window = NULL;
- eav->contact_display = NULL;
- eav->displayed_contact = -1;
-
- eav->view_instance = NULL;
- eav->view_menus = NULL;
- eav->current_view = NULL;
- eav->uic = NULL;
-
- eav->book = NULL;
- eav->source = NULL;
- eav->query = NULL;
-
- eav->invisible = NULL;
- eav->clipboard_contacts = NULL;
-}
-
-static void
-eab_view_dispose (GObject *object)
-{
- EABView *eav = EAB_VIEW(object);
-
- if (eav->model) {
- g_signal_handlers_disconnect_matched (eav->model,
- G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL,
- object);
- g_object_unref (eav->model);
- eav->model = NULL;
- }
-
- if (eav->book) {
- g_object_unref (eav->book);
- eav->book = NULL;
- }
-
- if (eav->source) {
- g_object_unref (eav->source);
- eav->source = NULL;
- }
-
- if (eav->query) {
- g_free(eav->query);
- eav->query = NULL;
- }
-
- eav->uic = NULL;
-
- if (eav->view_instance) {
- g_object_unref (eav->view_instance);
- eav->view_instance = NULL;
- }
-
- if (eav->view_menus) {
- g_object_unref (eav->view_menus);
- eav->view_menus = NULL;
- }
-
- if (eav->clipboard_contacts) {
- g_list_foreach (eav->clipboard_contacts, (GFunc)g_object_unref, NULL);
- g_list_free (eav->clipboard_contacts);
- eav->clipboard_contacts = NULL;
- }
-
- if (eav->invisible) {
- gtk_widget_destroy (eav->invisible);
- eav->invisible = NULL;
- }
-
- if (eav->ecml_changed_id != 0) {
- g_signal_handler_disconnect (get_master_list(),
- eav->ecml_changed_id);
- eav->ecml_changed_id = 0;
- }
-
- if (G_OBJECT_CLASS(parent_class)->dispose)
- G_OBJECT_CLASS(parent_class)->dispose(object);
-}
-
-static void
-set_paned_position (EABView *eav)
-{
- GConfClient *gconf_client;
- gint pos;
-
- /* XXX this should use the addressbook's global gconf client */
- gconf_client = gconf_client_get_default ();
- pos = gconf_client_get_int (gconf_client, "/apps/evolution/addressbook/display/vpane_position", NULL);
- if (pos < 1)
- pos = 144;
-
- gtk_paned_set_position (GTK_PANED (eav->paned), pos);
-
- g_object_unref (gconf_client);
-}
-
-static gboolean
-get_paned_position (EABView *eav)
-{
- GConfClient *gconf_client;
- gint pos;
-
- /* XXX this should use the addressbook's global gconf client */
- gconf_client = gconf_client_get_default ();
-
- pos = gtk_paned_get_position (GTK_PANED (eav->paned));
- gconf_client_set_int (gconf_client, "/apps/evolution/addressbook/display/vpane_position", pos, NULL);
-
- g_object_unref (gconf_client);
-
- return FALSE;
-}
-
-GtkWidget*
-eab_view_new (void)
-{
- GtkWidget *widget = GTK_WIDGET (g_object_new (E_TYPE_AB_VIEW, NULL));
- EABView *eav = EAB_VIEW (widget);
- FilterPart *part;
-
- /* create our model */
- eav->model = eab_model_new ();
-
- g_signal_connect (eav->model, "status_message",
- G_CALLBACK (status_message), eav);
- g_signal_connect (eav->model, "search_result",
- G_CALLBACK (search_result), eav);
- g_signal_connect (eav->model, "folder_bar_message",
- G_CALLBACK (folder_bar_message), eav);
- g_signal_connect (eav->model, "stop_state_changed",
- G_CALLBACK (stop_state_changed), eav);
- g_signal_connect (eav->model, "writable_status",
- G_CALLBACK (writable_status), eav);
- g_signal_connect (eav->model, "backend_died",
- G_CALLBACK (backend_died), eav);
- g_signal_connect (eav->model, "contact_changed",
- G_CALLBACK (contact_changed), eav);
- g_signal_connect (eav->model, "contacts_removed",
- G_CALLBACK (contacts_removed), eav);
-
- eav->editable = FALSE;
- eav->query = g_strdup (SHOW_ALL_SEARCH);
-
- /* create our search bar */
- eav->search = E_SEARCH_BAR (e_search_bar_new (NULL, addressbook_search_option_items));
- e_search_bar_set_menu (eav->search, addressbook_search_items);
- make_suboptions (eav);
- connect_master_list_changed (eav);
- g_signal_connect (eav->search, "query_changed",
- G_CALLBACK (query_changed), eav);
- g_signal_connect (eav->search, "search_activated",
- G_CALLBACK (search_activated), eav);
- g_signal_connect (eav->search, "menu_activated",
- G_CALLBACK (search_menu_activated), eav);
- gtk_box_pack_start (GTK_BOX (eav), GTK_WIDGET (eav->search), FALSE, FALSE, 0);
- gtk_widget_show (GTK_WIDGET (eav->search));
- gtk_widget_set_sensitive (GTK_WIDGET (eav->search), FALSE);
-
- /* create the search context */
- eav->search_context = rule_context_new ();
- rule_context_add_part_set (eav->search_context, "partset", filter_part_get_type (),
- rule_context_add_part, rule_context_next_part);
- rule_context_load (eav->search_context, SEARCH_RULE_DIR "/addresstypes.xml", "");
-
- eav->search_rule = filter_rule_new ();
- part = rule_context_next_part (eav->search_context, NULL);
-
- if (part == NULL)
- g_warning ("Could not load addressbook search; no parts.");
- else
- filter_rule_add_part (eav->search_rule, filter_part_clone (part));
-
- /* create the paned window and contact display */
- eav->paned = gtk_vpaned_new ();
- gtk_box_pack_start (GTK_BOX (eav), eav->paned, TRUE, TRUE, 0);
- g_signal_connect_swapped (eav->paned, "button_release_event",
- G_CALLBACK (get_paned_position), eav);
-
- eav->contact_display = eab_contact_display_new ();
- eav->contact_display_window = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (eav->contact_display_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (eav->contact_display_window), GTK_SHADOW_IN);
- gtk_container_add (GTK_CONTAINER (eav->contact_display_window), eav->contact_display);
- gtk_paned_add2 (GTK_PANED (eav->paned), eav->contact_display_window);
- gtk_widget_show (eav->contact_display);
- gtk_widget_show (eav->contact_display_window);
- gtk_widget_show (eav->paned);
-
- /* gtk selection crap */
- eav->invisible = gtk_invisible_new ();
-
- gtk_selection_add_target (eav->invisible,
- clipboard_atom,
- GDK_SELECTION_TYPE_STRING,
- 0);
-
- g_signal_connect (eav->invisible, "selection_get",
- G_CALLBACK (selection_get),
- eav);
- g_signal_connect (eav->invisible, "selection_clear_event",
- G_CALLBACK (selection_clear_event),
- eav);
- g_signal_connect (eav->invisible, "selection_received",
- G_CALLBACK (selection_received),
- eav);
- g_object_weak_ref (G_OBJECT (eav->invisible), invisible_destroyed, eav);
-
- return widget;
-}
-
-RuleContext *
-eab_view_peek_search_context (EABView *view)
-{
- return view->search_context;
-}
-
-FilterRule *
-eab_view_peek_search_rule (EABView *view)
-{
- return view->search_rule;
-}
-
-static void
-writable_status (GtkObject *object, gboolean writable, EABView *eav)
-{
- eav->editable = writable;
- command_state_change (eav);
-}
-
-static void
-init_collection (void)
-{
- GalViewFactory *factory;
- ETableSpecification *spec;
- char *galview;
-
- if (collection == NULL) {
- collection = gal_view_collection_new();
-
- gal_view_collection_set_title (collection, _("Address Book"));
-
- galview = gnome_util_prepend_user_home("/.evolution/addressbook/views");
- gal_view_collection_set_storage_directories
- (collection,
- EVOLUTION_GALVIEWSDIR "/addressbook/",
- galview);
- g_free(galview);
-
- spec = e_table_specification_new();
- e_table_specification_load_from_file (spec, EVOLUTION_ETSPECDIR "/e-addressbook-view.etspec");
-
- factory = gal_view_factory_etable_new (spec);
- g_object_unref (spec);
- gal_view_collection_add_factory (collection, factory);
- g_object_unref (factory);
-
- factory = gal_view_factory_minicard_new();
- gal_view_collection_add_factory (collection, factory);
- g_object_unref (factory);
-
-#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW
- factory = gal_view_factory_treeview_new ();
- gal_view_collection_add_factory (collection, factory);
- g_object_unref (factory);
-#endif
-
- gal_view_collection_load(collection);
- }
-}
-
-static void
-set_view_preview (EABView *view)
-{
- /* XXX this should use the addressbook's global gconf client */
- GConfClient *gconf_client;
- gboolean state;
-
- gconf_client = gconf_client_get_default();
- state = gconf_client_get_bool(gconf_client, "/apps/evolution/addressbook/display/show_preview", NULL);
- bonobo_ui_component_set_prop (view->uic,
- "/commands/ContactsViewPreview",
- "state",
- state ? "1" : "0", NULL);
-
- eab_view_show_contact_preview (view, state);
-
- g_object_unref (gconf_client);
-}
-
-static void
-display_view(GalViewInstance *instance,
- GalView *view,
- gpointer data)
-{
- EABView *address_view = data;
- if (GAL_IS_VIEW_ETABLE(view)) {
- change_view_type (address_view, EAB_VIEW_TABLE);
- gal_view_etable_attach_table (GAL_VIEW_ETABLE(view), e_table_scrolled_get_table(E_TABLE_SCROLLED(address_view->widget)));
- }
- else if (GAL_IS_VIEW_MINICARD(view)) {
- change_view_type (address_view, EAB_VIEW_MINICARD);
- gal_view_minicard_attach (GAL_VIEW_MINICARD (view), E_MINICARD_VIEW_WIDGET (address_view->object));
- }
-#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW
- else if (GAL_IS_VIEW_TREEVIEW (view)) {
- change_view_type (address_view, EAB_VIEW_TREEVIEW);
- gal_view_treeview_attach (GAL_VIEW_TREEVIEW(view), GTK_TREE_VIEW (address_view->object));
- }
-#endif
- address_view->current_view = view;
-
- set_paned_position (address_view);
- set_view_preview (address_view);
-}
-
-static void
-view_preview(BonoboUIComponent *uic, const char *path, Bonobo_UIComponent_EventType type, const char *state, void *data)
-{
- /* XXX this should use the addressbook's global gconf client */
- GConfClient *gconf_client;
- EABView *view = EAB_VIEW (data);
-
- if (type != Bonobo_UIComponent_STATE_CHANGED)
- return;
-
- gconf_client = gconf_client_get_default();
- gconf_client_set_bool(gconf_client, "/apps/evolution/addressbook/display/show_preview", state[0] != '0', NULL);
-
- eab_view_show_contact_preview(view, state[0] != '0');
-
- g_object_unref (gconf_client);
-}
-
-static void
-setup_menus (EABView *view)
-{
- if (view->book && view->view_instance == NULL) {
- init_collection ();
- view->view_instance = gal_view_instance_new (collection, e_book_get_uri (view->book));
- }
-
- if (view->view_instance && view->uic) {
- view->view_menus = gal_view_menus_new(view->view_instance);
- gal_view_menus_apply(view->view_menus, view->uic, NULL);
-
- display_view (view->view_instance, gal_view_instance_get_current_view (view->view_instance), view);
-
- g_signal_connect(view->view_instance, "display_view",
- G_CALLBACK (display_view), view);
- }
-
- bonobo_ui_component_add_listener(view->uic, "ContactsViewPreview", view_preview, view);
-
- set_view_preview (view);
-}
-
-static void
-eab_view_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
- EABView *eav = EAB_VIEW(object);
-
- switch (prop_id){
- case PROP_BOOK:
- if (eav->book) {
- g_object_unref (eav->book);
- }
- if (g_value_get_object (value)) {
- eav->book = E_BOOK(g_value_get_object (value));
- g_object_ref (eav->book);
- gtk_widget_set_sensitive (GTK_WIDGET (eav->search), TRUE);
- }
- else {
- eav->book = NULL;
- gtk_widget_set_sensitive (GTK_WIDGET (eav->search), FALSE);
- }
-
- if (eav->view_instance) {
- g_object_unref (eav->view_instance);
- eav->view_instance = NULL;
- }
-
- g_object_set(eav->model,
- "book", eav->book,
- NULL);
-
- setup_menus (eav);
-
- break;
- case PROP_SOURCE:
- if (eav->source) {
- g_warning ("EABView at present does not support multiple writes on the \"source\" property.");
- break;
- }
- else {
- if (g_value_get_object (value)) {
- eav->source = E_SOURCE(g_value_get_object (value));
- g_object_ref (eav->source);
- }
- else {
- eav->source = NULL;
- }
- }
- break;
- case PROP_QUERY:
-#if 0 /* This code will mess up ldap a bit. We need to think about the ramifications of this more. */
- if ((g_value_get_string (value) == NULL && !strcmp (eav->query, SHOW_ALL_SEARCH)) ||
- (g_value_get_string (value) != NULL && !strcmp (eav->query, g_value_get_string (value))))
- break;
-#endif
- g_free(eav->query);
- eav->query = g_strdup(g_value_get_string (value));
- if (!eav->query)
- eav->query = g_strdup (SHOW_ALL_SEARCH);
- g_object_set(eav->model,
- "query", eav->query,
- NULL);
- break;
- case PROP_TYPE:
- change_view_type(eav, g_value_get_int (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-eab_view_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
- EABView *eav = EAB_VIEW(object);
-
- switch (prop_id) {
- case PROP_BOOK:
- if (eav->book)
- g_value_set_object (value, eav->book);
- else
- g_value_set_object (value, NULL);
- break;
- case PROP_SOURCE:
- if (eav->source)
- g_value_set_object (value, eav->source);
- else
- g_value_set_object (value, NULL);
- break;
-
- case PROP_QUERY:
- g_value_set_string (value, eav->query);
- break;
- case PROP_TYPE:
- g_value_set_int (value, eav->view_type);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static ESelectionModel*
-get_selection_model (EABView *view)
-{
- if (view->view_type == EAB_VIEW_TABLE)
- return e_table_get_selection_model (e_table_scrolled_get_table (E_TABLE_SCROLLED(view->widget)));
- else if (view->view_type == EAB_VIEW_MINICARD)
- return e_minicard_view_widget_get_selection_model (E_MINICARD_VIEW_WIDGET(view->object));
-#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW
- else if (view->view_type == EAB_VIEW_TREEVIEW)
- return e_treeview_get_selection_model (GTK_TREE_VIEW (view->object));
-#endif
- g_return_val_if_reached (NULL);
-}
-
-/* Popup menu stuff */
-typedef struct {
- EABView *view;
- gpointer closure;
-} ContactAndBook;
-
-static ESelectionModel*
-contact_and_book_get_selection_model (ContactAndBook *contact_and_book)
-{
- return get_selection_model (contact_and_book->view);
-}
-
-static GList *
-get_contact_list (EABPopupTargetSelect *t)
-{
- GList *list = NULL;
- int i;
-
- for (i=0;i<t->cards->len;i++)
- list = g_list_prepend(list, t->cards->pdata[i]);
-
- return list;
-}
-
-static void
-save_as (EPopup *ep, EPopupItem *pitem, void *data)
-{
- /*ContactAndBook *contact_and_book = data;*/
- GList *contacts = get_contact_list ((EABPopupTargetSelect *)ep->target);
-
- if (contacts) {
- eab_contact_list_save(_("Save as VCard..."), contacts, NULL);
- g_list_free(contacts);
- }
-}
-
-static void
-send_as (EPopup *ep, EPopupItem *pitem, void *data)
-{
- /*ContactAndBook *contact_and_book = data;*/
- GList *contacts = get_contact_list ((EABPopupTargetSelect *)ep->target);
-
- if (contacts) {
- eab_send_contact_list(contacts, EAB_DISPOSITION_AS_ATTACHMENT);
- g_list_free(contacts);
- }
-}
-
-static void
-send_to (EPopup *ep, EPopupItem *pitem, void *data)
-{
- /*ContactAndBook *contact_and_book = data;*/
- GList *contacts = get_contact_list ((EABPopupTargetSelect *)ep->target);
-
- if (contacts) {
- eab_send_contact_list(contacts, EAB_DISPOSITION_AS_TO);
- g_list_free(contacts);
- }
-}
-
-static void
-print (EPopup *ep, EPopupItem *pitem, void *data)
-{
- /*ContactAndBook *contact_and_book = data;*/
- EABPopupTargetSelect *t = (EABPopupTargetSelect *)ep->target;
-
- if (t->cards->len == 1) {
- gtk_widget_show(e_contact_print_contact_dialog_new(t->cards->pdata[0]));
- } else {
- GList *contacts = get_contact_list(t);
-
- gtk_widget_show(e_contact_print_contact_list_dialog_new(contacts));
- g_list_free(contacts);
- }
-}
-
-static void
-copy (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ContactAndBook *contact_and_book = data;
-
- eab_view_copy (contact_and_book->view);
-}
-
-static void
-paste (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ContactAndBook *contact_and_book = data;
-
- eab_view_paste (contact_and_book->view);
-}
-
-static void
-cut (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ContactAndBook *contact_and_book = data;
-
- eab_view_cut (contact_and_book->view);
-}
-
-static void
-delete (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ContactAndBook *contact_and_book = data;
-
- eab_view_delete_selection(contact_and_book->view);
-}
-
-static void
-copy_to_folder (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ContactAndBook *contact_and_book = data;
-
- eab_view_copy_to_folder (contact_and_book->view);
-}
-
-static void
-move_to_folder (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ContactAndBook *contact_and_book = data;
-
- eab_view_move_to_folder (contact_and_book->view);
-}
-
-static void
-new_card (EPopup *ep, EPopupItem *pitem, void *data)
-{
- /*ContactAndBook *contact_and_book = data;*/
- EContact *contact = e_contact_new();
-
- eab_show_contact_editor (((EABPopupTargetSelect *)ep->target)->book, contact, TRUE, TRUE);
- g_object_unref (contact);
-}
-
-static void
-new_list (EPopup *ep, EPopupItem *pitem, void *data)
-{
- /*ContactAndBook *contact_and_book = data;*/
- EContact *contact = e_contact_new ();
-
- eab_show_contact_list_editor (((EABPopupTargetSelect *)ep->target)->book, contact, TRUE, TRUE);
- g_object_unref(contact);
-}
-
-static EPopupItem eabv_popup_items[] = {
- { E_POPUP_ITEM, "10.new", N_("New Contact..."), new_card, NULL, "stock_contact", 0, EAB_POPUP_SELECT_EDITABLE},
- { E_POPUP_ITEM, "15.newlist", N_("New Contact List..."), new_list, NULL, "stock_contact-list", 0, EAB_POPUP_SELECT_EDITABLE },
-
- { E_POPUP_BAR, "20.bar" },
- { E_POPUP_ITEM, "30.saveas", N_("Save as VCard..."), save_as, NULL, "stock_save-as", 0, EAB_POPUP_SELECT_ANY },
- { E_POPUP_ITEM, "40.forward", N_("Forward Contact"), send_as, NULL, "stock_mail-forward", 0, EAB_POPUP_SELECT_ANY },
- { E_POPUP_ITEM, "50.mailto", N_("Send Message to Contact"), send_to, NULL, "stock_mail-send", 0, EAB_POPUP_SELECT_ANY|EAB_POPUP_SELECT_EMAIL },
- { E_POPUP_ITEM, "60.print", N_("Print"), print, NULL, "stock_print", 0, EAB_POPUP_SELECT_ANY },
-
- { E_POPUP_BAR, "70.bar" },
- { E_POPUP_ITEM, "80.copyto", N_("Copy to Address Book..."), copy_to_folder, NULL, NULL, 0, EAB_POPUP_SELECT_ANY },
- { E_POPUP_ITEM, "90.moveto", N_("Move to Address Book..."), move_to_folder, NULL, NULL, 0, EAB_POPUP_SELECT_ANY|EAB_POPUP_SELECT_EDITABLE },
-
- { E_POPUP_BAR, "a0.bar" },
- { E_POPUP_BAR, "b0.cut", N_("Cut"), cut, NULL, "stock_cut", 0, EAB_POPUP_SELECT_ANY|EAB_POPUP_SELECT_EDITABLE },
- { E_POPUP_ITEM, "c0.copy", N_("Copy"), copy, NULL, "stock_copy", 0, EAB_POPUP_SELECT_ANY },
- { E_POPUP_ITEM, "d0.paste", N_("Paste"), paste, NULL, "stock_paste", 0, EAB_POPUP_SELECT_EDITABLE },
- { E_POPUP_ITEM, "e0.delete", N_("Delete"), delete, NULL, "stock_delete", 0, EAB_POPUP_SELECT_EDITABLE|EAB_POPUP_SELECT_ANY },
-};
-
-static void
-get_card_1(gint model_row, void *data)
-{
- ContactAndBook *contact_and_book = data;
- EContact *contact;
-
- contact = eab_model_get_contact(contact_and_book->view->model, model_row);
- if (contact)
- g_ptr_array_add((GPtrArray *)contact_and_book->closure, contact);
-}
-
-static void
-eabv_popup_free(EPopup *ep, GSList *list, void *data)
-{
- ContactAndBook *cab = data;
- ESelectionModel *selection;
-
- /* NB: this looks strange to me */
- selection = contact_and_book_get_selection_model(cab);
- if (selection)
- e_selection_model_right_click_up(selection);
-
- g_slist_free(list);
- g_object_unref(cab->view);
- g_free(cab);
-}
-
-static void
-do_popup_menu(EABView *view, GdkEvent *event)
-{
- EABPopup *ep;
- EABPopupTargetSelect *t;
- GSList *menus = NULL;
- int i;
- GtkMenu *menu;
- GPtrArray *cards = g_ptr_array_new();
- ContactAndBook *contact_and_book;
- ESelectionModel *selection_model;
-
- contact_and_book = g_new(ContactAndBook, 1);
- contact_and_book->view = view;
- g_object_ref(contact_and_book->view);
-
- selection_model = contact_and_book_get_selection_model(contact_and_book);
- if (selection_model) {
- contact_and_book->closure = cards;
- e_selection_model_foreach(selection_model, get_card_1, contact_and_book);
- }
-
- ep = eab_popup_new("org.gnome.evolution.addressbook.view.popup");
- t = eab_popup_target_new_select(ep, view->book, !eab_model_editable(view->model), cards);
- t->target.widget = (GtkWidget *)view;
-
- for (i=0;i<sizeof(eabv_popup_items)/sizeof(eabv_popup_items[0]);i++)
- menus = g_slist_prepend(menus, &eabv_popup_items[i]);
-
- e_popup_add_items((EPopup *)ep, menus, NULL, eabv_popup_free, contact_and_book);
-
- menu = e_popup_create_menu_once((EPopup *)ep, (EPopupTarget *)t, 0);
- gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event?event->button.button:0, event?event->button.time:gtk_get_current_event_time());
-}
-
-static void
-render_contact (int row, EABView *view)
-{
- EContact *contact = eab_model_get_contact (view->model, row);
-
- view->displayed_contact = row;
-
- eab_contact_display_render (EAB_CONTACT_DISPLAY (view->contact_display), contact,
- EAB_CONTACT_DISPLAY_RENDER_NORMAL);
-}
-
-static void
-selection_changed (GObject *o, EABView *view)
-{
- ESelectionModel *selection_model;
-
- command_state_change (view);
-
- selection_model = get_selection_model (view);
-
- if (e_selection_model_selected_count (selection_model) == 1)
- e_selection_model_foreach (selection_model,
- (EForeachFunc)render_contact, view);
- else {
- view->displayed_contact = -1;
- eab_contact_display_render (EAB_CONTACT_DISPLAY (view->contact_display), NULL,
- EAB_CONTACT_DISPLAY_RENDER_NORMAL);
- }
-
-}
-
-static void
-table_double_click(ETableScrolled *table, gint row, gint col, GdkEvent *event, EABView *view)
-{
- if (E_IS_ADDRESSBOOK_TABLE_ADAPTER(view->object)) {
- EABModel *model = view->model;
- EContact *contact = eab_model_get_contact (model, row);
- EBook *book;
-
- g_object_get(model,
- "book", &book,
- NULL);
-
- g_assert (E_IS_BOOK (book));
-
- if (e_contact_get (contact, E_CONTACT_IS_LIST))
- eab_show_contact_list_editor (book, contact, FALSE, view->editable);
- else
- eab_show_contact_editor (book, contact, FALSE, view->editable);
-
- g_object_unref (book);
- g_object_unref (contact);
- }
-}
-
-static gint
-table_right_click(ETableScrolled *table, gint row, gint col, GdkEvent *event, EABView *view)
-{
- do_popup_menu(view, event);
- return TRUE;
-}
-
-static gint
-table_white_space_event(ETableScrolled *table, GdkEvent *event, EABView *view)
-{
- if (event->type == GDK_BUTTON_PRESS && ((GdkEventButton *)event)->button == 3) {
- do_popup_menu(view, event);
- return TRUE;
- } else {
- return FALSE;
- }
-}
-
-static void
-table_drag_data_get (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- gpointer user_data)
-{
- EABView *view = user_data;
- GList *contact_list;
-
- if (!E_IS_ADDRESSBOOK_TABLE_ADAPTER(view->object))
- return;
-
- contact_list = get_selected_contacts (view);
-
- switch (info) {
- case DND_TARGET_TYPE_VCARD: {
- char *value;
-
- value = eab_contact_list_to_string (contact_list);
-
- gtk_selection_data_set (selection_data,
- selection_data->target,
- 8,
- value, strlen (value));
- break;
- }
- case DND_TARGET_TYPE_SOURCE_VCARD: {
- char *value;
-
- value = eab_book_and_contact_list_to_string (view->book, contact_list);
-
- gtk_selection_data_set (selection_data,
- selection_data->target,
- 8,
- value, strlen (value));
- break;
- }
- }
-
- g_list_foreach (contact_list, (GFunc) g_object_unref, NULL);
- g_list_free (contact_list);
-}
-
-static void
-emit_status_message (EABView *eav, const gchar *status)
-{
- g_signal_emit (eav,
- eab_view_signals [STATUS_MESSAGE], 0,
- status);
-}
-
-static void
-emit_search_result (EABView *eav, EBookViewStatus status)
-{
- g_signal_emit (eav,
- eab_view_signals [SEARCH_RESULT], 0,
- status);
-}
-
-static void
-emit_folder_bar_message (EABView *eav, const gchar *message)
-{
- g_signal_emit (eav,
- eab_view_signals [FOLDER_BAR_MESSAGE], 0,
- message);
-}
-
-static void
-status_message (GtkObject *object, const gchar *status, EABView *eav)
-{
- emit_status_message (eav, status);
-}
-
-static void
-search_result (GtkObject *object, EBookViewStatus status, EABView *eav)
-{
- emit_search_result (eav, status);
-}
-
-static void
-folder_bar_message (GtkObject *object, const gchar *status, EABView *eav)
-{
- emit_folder_bar_message (eav, status);
-}
-
-static void
-stop_state_changed (GtkObject *object, EABView *eav)
-{
- command_state_change (eav);
-}
-
-static void
-command_state_change (EABView *eav)
-{
- /* Reffing during emission is unnecessary. Gtk automatically refs during an emission. */
- g_signal_emit (eav, eab_view_signals [COMMAND_STATE_CHANGE], 0);
-}
-
-static void
-backend_died (GtkObject *object, EABView *eav)
-{
- e_error_run (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (eav))),
- "addressbook:backend-died", e_book_get_uri (eav->book), NULL);
-}
-
-static void
-contact_changed (EABModel *model, gint index, EABView *eav)
-{
- if (eav->displayed_contact == index) {
- /* if the contact that's presently displayed is changed, re-render it */
- render_contact (index, eav);
- }
-}
-
-static void
-contacts_removed (EABModel *model, gpointer data, EABView *eav)
-{
- GArray *indices = (GArray *) data;
- int count = indices->len;
- gint i;
-
- for (i = 0; i < count; i ++) {
-
-
- if (eav->displayed_contact == g_array_index (indices, gint, i)) {
-
- /* if the contact that's presently displayed is changed, clear the display */
- eab_contact_display_render (EAB_CONTACT_DISPLAY (eav->contact_display), NULL,
- EAB_CONTACT_DISPLAY_RENDER_NORMAL);
- eav->displayed_contact = -1;
- break;
- }
- }
-}
-
-static void
-minicard_right_click (EMinicardView *minicard_view_item, GdkEvent *event, EABView *view)
-{
- do_popup_menu(view, event);
-}
-
-static void
-create_minicard_view (EABView *view)
-{
- GtkWidget *scrolled_window;
- GtkWidget *minicard_view;
- EAddressbookReflowAdapter *adapter;
-
- adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(e_addressbook_reflow_adapter_new (view->model));
- minicard_view = e_minicard_view_widget_new(adapter);
-
- g_signal_connect(minicard_view, "selection_change",
- G_CALLBACK(selection_changed), view);
-
- g_signal_connect(minicard_view, "right_click",
- G_CALLBACK(minicard_right_click), view);
-
- scrolled_window = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
-
- view->object = G_OBJECT(minicard_view);
- view->widget = scrolled_window;
-
- gtk_container_add (GTK_CONTAINER (scrolled_window), minicard_view);
- gtk_widget_show (minicard_view);
-
- gtk_widget_show_all( GTK_WIDGET(scrolled_window) );
-
- gtk_paned_add1 (GTK_PANED (view->paned), scrolled_window);
-
- e_reflow_model_changed (E_REFLOW_MODEL (adapter));
-}
-
-static void
-create_table_view (EABView *view)
-{
- ETableModel *adapter;
- GtkWidget *table;
-
- adapter = eab_table_adapter_new(view->model);
-
- /* Here we create the table. We give it the three pieces of
- the table we've created, the header, the model, and the
- initial layout. It does the rest. */
- table = e_table_scrolled_new_from_spec_file (adapter, NULL, EVOLUTION_ETSPECDIR "/e-addressbook-view.etspec", NULL);
-
- view->object = G_OBJECT(adapter);
- view->widget = table;
-
- g_signal_connect(e_table_scrolled_get_table(E_TABLE_SCROLLED(table)), "double_click",
- G_CALLBACK(table_double_click), view);
- g_signal_connect(e_table_scrolled_get_table(E_TABLE_SCROLLED(table)), "right_click",
- G_CALLBACK(table_right_click), view);
- g_signal_connect(e_table_scrolled_get_table(E_TABLE_SCROLLED(table)), "white_space_event",
- G_CALLBACK(table_white_space_event), view);
- g_signal_connect(e_table_scrolled_get_table(E_TABLE_SCROLLED(table)), "selection_change",
- G_CALLBACK(selection_changed), view);
-
- /* drag & drop signals */
- e_table_drag_source_set (E_TABLE(E_TABLE_SCROLLED(table)->table), GDK_BUTTON1_MASK,
- drag_types, num_drag_types, GDK_ACTION_MOVE | GDK_ACTION_COPY);
-
- g_signal_connect (E_TABLE_SCROLLED(table)->table,
- "table_drag_data_get",
- G_CALLBACK (table_drag_data_get),
- view);
-
- gtk_paned_add1 (GTK_PANED (view->paned), table);
-
- gtk_widget_show( GTK_WIDGET(table) );
-}
-
-#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW
-static void
-treeview_row_activated(GtkTreeView *treeview,
- GtkTreePath *path, GtkTreeViewColumn *column,
- EABView *view)
-{
- EABModel *model = view->model;
- int row = gtk_tree_path_get_indices (path)[0];
- ECard *card = eab_model_get_card(model, row);
- EBook *book;
-
- g_object_get(model,
- "book", &book,
- NULL);
-
- g_assert (E_IS_BOOK (book));
-
- if (e_card_evolution_list (card))
- eab_show_contact_list_editor (book, card, FALSE, view->editable);
- else
- eab_show_contact_editor (book, card, FALSE, view->editable);
-
- g_object_unref (book);
- g_object_unref (card);
-}
-
-static void
-create_treeview_view (EABView *view)
-{
- GtkTreeModel *adapter;
- ECardSimple *simple;
- GtkWidget *treeview;
- GtkWidget *scrolled;
- int i;
-
- simple = e_card_simple_new(NULL);
-
- adapter = eab_treeview_adapter_new(view->model);
-
- scrolled = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow (GTK_SCROLLED_WINDOW (scrolled), GTK_SHADOW_IN);
- treeview = gtk_tree_view_new_with_model (adapter);
-
- gtk_widget_show (treeview);
-
- gtk_container_add (GTK_CONTAINER (scrolled), treeview);
-
- for (i = 0; i < 15; i ++) {
- GtkTreeViewColumn *column =
- gtk_tree_view_column_new_with_attributes (e_card_simple_get_name (simple, i),
- gtk_cell_renderer_text_new (),
- "text", i,
- NULL);
-
- gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
- }
-
- view->object = G_OBJECT(treeview);
- view->widget = scrolled;
-
- gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)), GTK_SELECTION_MULTIPLE);
- gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (treeview),
- GDK_BUTTON1_MASK,
- drag_types,
- num_drag_types,
- GDK_ACTION_MOVE);
-
- g_signal_connect(treeview, "row_activated",
- G_CALLBACK (treeview_row_activated), view);
-#if 0
- g_signal_connect(e_table_scrolled_get_table(E_TABLE_SCROLLED(table)), "right_click",
- G_CALLBACK(table_right_click), view);
-
- /* drag & drop signals */
- e_table_drag_source_set (E_TABLE(E_TABLE_SCROLLED(table)->table), GDK_BUTTON1_MASK,
- drag_types, num_drag_types, GDK_ACTION_MOVE);
-
- g_signal_connect (E_TABLE_SCROLLED(table)->table,
- "table_drag_data_get",
- G_CALLBACK (table_drag_data_get),
- view);
-#endif
-
-
- g_signal_connect(e_treeview_get_selection_model (GTK_TREE_VIEW (treeview)), "selection_changed",
- G_CALLBACK(selection_changed), view);
-
- gtk_paned_add1 (GTK_PANED (view->paned), scrolled);
-
- gtk_widget_show( GTK_WIDGET(scrolled) );
-
- g_object_unref (simple);
-}
-#endif
-
-static void
-change_view_type (EABView *view, EABViewType view_type)
-{
- if (view_type == view->view_type)
- return;
-
- if (view->widget) {
- gtk_container_remove (GTK_CONTAINER (view->paned), view->widget);
- view->widget = NULL;
- }
- view->object = NULL;
-
- switch (view_type) {
- case EAB_VIEW_TABLE:
- create_table_view (view);
- break;
- case EAB_VIEW_MINICARD:
- create_minicard_view (view);
- break;
-#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW
- case EAB_VIEW_TREEVIEW:
- create_treeview_view (view);
- break;
-#endif
- default:
- g_warning ("view_type not recognized.");
- return;
- }
-
- view->view_type = view_type;
-
- command_state_change (view);
-}
-
-
-
-static void
-search_activated (ESearchBar *esb, EABView *v)
-{
- ECategoriesMasterList *master_list;
- char *search_word, *search_query;
- const char *category_name;
- int search_type, subid;
-
- g_message ("in search_activated");
-
- g_object_get(esb,
- "text", &search_word,
- "item_id", &search_type,
- NULL);
-
- if (search_type == ESB_ADVANCED) {
- gtk_widget_show(eab_search_dialog_new(v));
- }
- else {
- if ((search_word && strlen (search_word)) || search_type == ESB_CATEGORY) {
- GString *s = g_string_new ("");
- e_sexp_encode_string (s, search_word);
- switch (search_type) {
- case ESB_ANY:
- search_query = g_strdup_printf ("(contains \"x-evolution-any-field\" %s)",
- s->str);
- break;
- case ESB_FULL_NAME:
- search_query = g_strdup_printf ("(beginswith \"full_name\" %s)",
- s->str);
- break;
- case ESB_EMAIL:
- search_query = g_strdup_printf ("(beginswith \"email\" %s)",
- s->str);
- break;
- case ESB_CATEGORY:
- subid = e_search_bar_get_subitem_id (esb);
-
- if (subid < 0 || subid == G_MAXINT) {
- /* match everything */
- search_query = g_strdup ("(contains \"x-evolution-any-field\" \"\")");
- } else {
- master_list = get_master_list ();
- category_name = e_categories_master_list_nth (master_list, subid);
- search_query = g_strdup_printf ("(is \"category_list\" \"%s\")", category_name);
- }
- break;
- default:
- search_query = g_strdup ("(contains \"x-evolution-any-field\" \"\")");
- break;
- }
- g_string_free (s, TRUE);
- } else
- search_query = g_strdup ("(contains \"x-evolution-any-field\" \"\")");
-
- if (search_query)
- g_object_set (v,
- "query", search_query,
- NULL);
-
- g_free (search_query);
- }
-
- g_free (search_word);
-}
-
-static void
-search_menu_activated (ESearchBar *esb, int id, EABView *view)
-{
- if (id == ESB_ADVANCED)
- gtk_widget_show(eab_search_dialog_new(view));
-}
-
-static void
-query_changed (ESearchBar *esb, EABView *view)
-{
- int search_type;
-
- search_type = e_search_bar_get_item_id(esb);
- if (search_type == ESB_ADVANCED)
- gtk_widget_show(eab_search_dialog_new(view));
-}
-
-static int
-compare_subitems (const void *a, const void *b)
-{
- const ESearchBarSubitem *subitem_a = a;
- const ESearchBarSubitem *subitem_b = b;
- char *collate_a, *collate_b;
- int ret;
-
- collate_a = g_utf8_collate_key (subitem_a->text, -1);
- collate_b = g_utf8_collate_key (subitem_b->text, -1);
-
- ret = strcmp (collate_a, collate_b);
-
- g_free (collate_a);
- g_free (collate_b);
-
- return ret;
-}
-
-static void
-make_suboptions (EABView *view)
-{
- ESearchBarSubitem *subitems, *s;
- ECategoriesMasterList *master_list;
- gint i, N;
-
- master_list = get_master_list ();
- N = e_categories_master_list_count (master_list);
- subitems = g_new (ESearchBarSubitem, N+2);
-
- subitems[0].id = G_MAXINT;
- subitems[0].text = g_strdup (_("Any Category"));
- subitems[0].translate = FALSE;
-
- for (i=0; i<N; ++i) {
- const char *category = e_categories_master_list_nth (master_list, i);
-
- subitems[i+1].id = i;
- subitems[i+1].text = g_strdup (category);
- subitems[i+1].translate = FALSE;
- }
- subitems[N+1].id = -1;
- subitems[N+1].text = NULL;
-
- qsort (subitems + 1, N, sizeof (subitems[0]), compare_subitems);
-
- e_search_bar_set_suboption (view->search, ESB_CATEGORY, subitems);
-
- for (s = subitems; s->id != -1; s++) {
- if (s->text)
- g_free (s->text);
- }
- g_free (subitems);
-}
-
-static void
-ecml_changed (ECategoriesMasterList *ecml, EABView *view)
-{
- make_suboptions (view);
-}
-
-static ECategoriesMasterList *
-get_master_list (void)
-{
- static ECategoriesMasterList *category_list = NULL;
-
- if (category_list == NULL)
- category_list = e_categories_master_list_wombat_new ();
- return category_list;
-}
-
-static void
-connect_master_list_changed (EABView *view)
-{
- view->ecml_changed_id =
- g_signal_connect (get_master_list(), "changed",
- G_CALLBACK (ecml_changed), view);
-}
-
-
-
-typedef struct {
- GtkWidget *table;
- GObject *printable;
-} EContactPrintDialogWeakData;
-
-static void
-e_contact_print_destroy(gpointer data, GObject *where_object_was)
-{
- EContactPrintDialogWeakData *weak_data = data;
- g_object_unref (weak_data->printable);
- g_object_unref (weak_data->table);
- g_free (weak_data);
-}
-
-static void
-e_contact_print_button(GtkDialog *dialog, gint response, gpointer data)
-{
- GnomePrintJob *master;
- GnomePrintContext *pc;
- EPrintable *printable = g_object_get_data(G_OBJECT(dialog), "printable");
- GtkWidget *preview;
- switch( response ) {
- case GNOME_PRINT_DIALOG_RESPONSE_PRINT:
- master = gnome_print_job_new(gnome_print_dialog_get_config ( GNOME_PRINT_DIALOG(dialog) ));
- pc = gnome_print_job_get_context( master );
- e_printable_reset(printable);
- while (e_printable_data_left(printable)) {
- gnome_print_beginpage (pc, "Contacts");
- if (gnome_print_gsave(pc) == -1)
- /* FIXME */;
- if (gnome_print_translate(pc, 72, 72) == -1)
- /* FIXME */;
- e_printable_print_page(printable,
- pc,
- 6.5 * 72,
- 5 * 72,
- TRUE);
- if (gnome_print_grestore(pc) == -1)
- /* FIXME */;
- if (gnome_print_showpage(pc) == -1)
- /* FIXME */;
- }
- gnome_print_job_close(master);
- gnome_print_job_print(master);
- g_object_unref (master);
- gtk_widget_destroy((GtkWidget *)dialog);
- break;
- case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW:
- master = gnome_print_job_new (gnome_print_dialog_get_config ( GNOME_PRINT_DIALOG(dialog) ));
- pc = gnome_print_job_get_context( master );
- e_printable_reset(printable);
- while (e_printable_data_left(printable)) {
- gnome_print_beginpage (pc, "Contacts");
- if (gnome_print_gsave(pc) == -1)
- /* FIXME */;
- if (gnome_print_translate(pc, 72, 72) == -1)
- /* FIXME */;
- e_printable_print_page(printable,
- pc,
- 6.5 * 72,
- 9 * 72,
- TRUE);
- if (gnome_print_grestore(pc) == -1)
- /* FIXME */;
- if (gnome_print_showpage(pc) == -1)
- /* FIXME */;
- }
- gnome_print_job_close(master);
- preview = GTK_WIDGET(gnome_print_job_preview_new(master, "Print Preview"));
- gtk_widget_show_all(preview);
- g_object_unref (master);
- break;
- case GNOME_PRINT_DIALOG_RESPONSE_CANCEL:
- default:
- gtk_widget_destroy((GtkWidget *)dialog);
- break;
- }
-}
-
-void
-eab_view_show_contact_preview (EABView *view, gboolean show)
-{
- g_return_if_fail (view && E_IS_ADDRESSBOOK_VIEW (view));
-
- if (show)
- gtk_widget_show (view->contact_display_window);
- else
- gtk_widget_hide (view->contact_display_window);
-}
-
-void
-eab_view_setup_menus (EABView *view,
- BonoboUIComponent *uic)
-{
-
- g_return_if_fail (view != NULL);
- g_return_if_fail (E_IS_ADDRESSBOOK_VIEW (view));
- g_return_if_fail (uic != NULL);
- g_return_if_fail (BONOBO_IS_UI_COMPONENT (uic));
-
- init_collection ();
-
- view->uic = uic;
-
- setup_menus (view);
-
- /* XXX toshok - yeah this really doesn't belong here, but it
- needs to happen at the same time and takes the uic */
- e_search_bar_set_ui_component (view->search, uic);
-}
-
-/**
- * eab_view_discard_menus:
- * @view: An addressbook view.
- *
- * Makes an addressbook view discard its GAL view menus and its views instance
- * objects. This should be called when the corresponding Bonobo component is
- * deactivated.
- **/
-void
-eab_view_discard_menus (EABView *view)
-{
- g_return_if_fail (view != NULL);
- g_return_if_fail (E_IS_ADDRESSBOOK_VIEW (view));
- g_return_if_fail (view->view_instance);
-
- if (view->view_menus) {
- gal_view_menus_unmerge (view->view_menus, NULL);
-
- g_object_unref (view->view_menus);
- view->view_menus = NULL;
- }
-
- if (view->view_instance) {
- g_object_unref (view->view_instance);
- view->view_instance = NULL;
- }
-
- view->uic = NULL;
-}
-
-void
-eab_view_print(EABView *view)
-{
- if (view->view_type == EAB_VIEW_MINICARD) {
- char *query;
- EBook *book;
- GtkWidget *print;
-
- g_object_get (view->model,
- "query", &query,
- "book", &book,
- NULL);
- print = e_contact_print_dialog_new(book, query);
- g_free(query);
- gtk_widget_show(print);
- }
- else if (view->view_type == EAB_VIEW_TABLE) {
- GtkWidget *dialog;
- EPrintable *printable;
- ETable *etable;
- EContactPrintDialogWeakData *weak_data;
-
- dialog = e_print_get_dialog (_("Print cards"), GNOME_PRINT_DIALOG_RANGE | GNOME_PRINT_DIALOG_COPIES);
- gnome_print_dialog_construct_range_any(GNOME_PRINT_DIALOG(dialog), GNOME_PRINT_RANGE_ALL | GNOME_PRINT_RANGE_SELECTION,
- NULL, NULL, NULL);
-
- g_object_get(view->widget, "table", &etable, NULL);
- printable = e_table_get_printable(etable);
- g_object_ref (printable);
- gtk_object_sink (GTK_OBJECT (printable));
- g_object_unref(etable);
- g_object_ref (view->widget);
-
- g_object_set_data (G_OBJECT (dialog), "table", view->widget);
- g_object_set_data (G_OBJECT (dialog), "printable", printable);
-
- g_signal_connect(dialog,
- "response", G_CALLBACK(e_contact_print_button), NULL);
-
- weak_data = g_new (EContactPrintDialogWeakData, 1);
-
- weak_data->table = view->widget;
- weak_data->printable = G_OBJECT (printable);
-
- g_object_weak_ref (G_OBJECT (dialog), e_contact_print_destroy, weak_data);
-
- gtk_widget_show(dialog);
- }
-#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW
- else if (view->view_type == EAB_VIEW_TREEVIEW) {
- /* XXX */
- }
-#endif
-}
-
-void
-eab_view_print_preview(EABView *view)
-{
- if (view->view_type == EAB_VIEW_MINICARD) {
- char *query;
- EBook *book;
-
- g_object_get (view->model,
- "query", &query,
- "book", &book,
- NULL);
- e_contact_print_preview(book, query);
- g_free(query);
- } else if (view->view_type == EAB_VIEW_TABLE) {
- EPrintable *printable;
- ETable *etable;
- GnomePrintJob *master;
- GnomePrintContext *pc;
- GnomePrintConfig *config;
- GtkWidget *preview;
-
- g_object_get(view->widget, "table", &etable, NULL);
- printable = e_table_get_printable(etable);
- g_object_unref(etable);
- g_object_ref (printable);
- gtk_object_sink (GTK_OBJECT (printable));
-
- config = e_print_load_config ();
- master = gnome_print_job_new (config);
- pc = gnome_print_job_get_context( master );
- e_printable_reset(printable);
- while (e_printable_data_left(printable)) {
- gnome_print_beginpage (pc, "Contacts");
- if (gnome_print_gsave(pc) == -1)
- /* FIXME */;
- if (gnome_print_translate(pc, 72, 72) == -1)
- /* FIXME */;
- e_printable_print_page(printable,
- pc,
- 6.5 * 72,
- 9 * 72,
- TRUE);
- if (gnome_print_grestore(pc) == -1)
- /* FIXME */;
- if (gnome_print_showpage(pc) == -1)
- /* FIXME */;
- }
- gnome_print_job_close(master);
- preview = GTK_WIDGET(gnome_print_job_preview_new(master, "Print Preview"));
- gtk_widget_show_all(preview);
- g_object_unref (master);
- g_object_unref (printable);
- }
-#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW
- else if (view->view_type == EAB_VIEW_TREEVIEW) {
- /* XXX */
- }
-#endif
-}
-
-void
-eab_view_delete_selection(EABView *view)
-{
- GList *list, *l;
-
- if (!eab_editor_confirm_delete(GTK_WINDOW(gtk_widget_get_toplevel(view->widget))))
- return;
-
- list = get_selected_contacts(view);
- if (e_book_check_static_capability (view->book, "bulk-remove")) {
- GList *ids = NULL;
-
- for (l=list;l;l=g_list_next(l)) {
- EContact *contact = l->data;
-
- ids = g_list_prepend (ids, (char*)e_contact_get_const (contact, E_CONTACT_UID));
- }
-
- /* Remove the cards all at once. */
- /* XXX no callback specified... ugh */
- e_book_async_remove_contacts (view->book,
- ids,
- NULL,
- NULL);
-
- g_list_free (ids);
- }
- else {
- for (l=list;l;l=g_list_next(l)) {
- EContact *contact = l->data;
- /* Remove the card. */
- /* XXX no callback specified... ugh */
- e_book_async_remove_contact (view->book,
- contact,
- NULL,
- NULL);
- }
- }
-
- e_free_object_list(list);
-}
-
-static void
-invisible_destroyed (gpointer data, GObject *where_object_was)
-{
- EABView *view = data;
- view->invisible = NULL;
-}
-
-static void
-selection_get (GtkWidget *invisible,
- GtkSelectionData *selection_data,
- guint info,
- guint time_stamp,
- EABView *view)
-{
- char *value;
-
- value = eab_contact_list_to_string (view->clipboard_contacts);
-
- gtk_selection_data_set (selection_data, GDK_SELECTION_TYPE_STRING,
- 8, value, strlen (value));
-
-}
-
-static void
-selection_clear_event (GtkWidget *invisible,
- GdkEventSelection *event,
- EABView *view)
-{
- if (view->clipboard_contacts) {
- g_list_foreach (view->clipboard_contacts, (GFunc)g_object_unref, NULL);
- g_list_free (view->clipboard_contacts);
- view->clipboard_contacts = NULL;
- }
-}
-
-static void
-selection_received (GtkWidget *invisible,
- GtkSelectionData *selection_data,
- guint time,
- EABView *view)
-{
- if (selection_data->length <= 0 || selection_data->type != GDK_SELECTION_TYPE_STRING) {
- return;
- } else {
- GList *contact_list;
- GList *l;
- char *str = NULL;
-
- if (selection_data->data [selection_data->length - 1] != 0) {
- str = g_malloc0 (selection_data->length + 1);
- memcpy (str, selection_data->data, selection_data->length);
- contact_list = eab_contact_list_from_string (str);
- } else
- contact_list = eab_contact_list_from_string (selection_data->data);
-
- for (l = contact_list; l; l = l->next) {
- EContact *contact = l->data;
-
- /* XXX NULL for a callback /sigh */
- eab_merging_book_add_contact (view->book, contact, NULL /* XXX */, NULL);
- }
-
- g_list_foreach (contact_list, (GFunc)g_object_unref, NULL);
- g_list_free (contact_list);
- g_free (str);
- }
-}
-
-static void
-add_to_list (int model_row, gpointer closure)
-{
- GList **list = closure;
- *list = g_list_prepend (*list, GINT_TO_POINTER (model_row));
-}
-
-static GList *
-get_selected_contacts (EABView *view)
-{
- GList *list;
- GList *iterator;
- ESelectionModel *selection = get_selection_model (view);
-
- list = NULL;
- e_selection_model_foreach (selection, add_to_list, &list);
-
- for (iterator = list; iterator; iterator = iterator->next) {
- iterator->data = eab_model_get_contact (view->model, GPOINTER_TO_INT (iterator->data));
- }
- list = g_list_reverse (list);
- return list;
-}
-
-void
-eab_view_save_as (EABView *view)
-{
- GList *list = get_selected_contacts (view);
- if (list)
- eab_contact_list_save (_("Save as VCard..."), list, NULL);
- e_free_object_list(list);
-}
-
-void
-eab_view_view (EABView *view)
-{
- GList *list = get_selected_contacts (view);
- eab_show_multiple_contacts (view->book, list, view->editable);
- e_free_object_list(list);
-}
-
-void
-eab_view_send (EABView *view)
-{
- GList *list = get_selected_contacts (view);
- if (list)
- eab_send_contact_list (list, EAB_DISPOSITION_AS_ATTACHMENT);
- e_free_object_list(list);
-}
-
-void
-eab_view_send_to (EABView *view)
-{
- GList *list = get_selected_contacts (view);
- if (list)
- eab_send_contact_list (list, EAB_DISPOSITION_AS_TO);
- e_free_object_list(list);
-}
-
-void
-eab_view_cut (EABView *view)
-{
- eab_view_copy (view);
- eab_view_delete_selection (view);
-}
-
-void
-eab_view_copy (EABView *view)
-{
- view->clipboard_contacts = get_selected_contacts (view);
-
- gtk_selection_owner_set (view->invisible, clipboard_atom, GDK_CURRENT_TIME);
-}
-
-void
-eab_view_paste (EABView *view)
-{
- gtk_selection_convert (view->invisible, clipboard_atom,
- GDK_SELECTION_TYPE_STRING,
- GDK_CURRENT_TIME);
-}
-
-void
-eab_view_select_all (EABView *view)
-{
- ESelectionModel *model = get_selection_model (view);
-
- g_return_if_fail (model);
-
- e_selection_model_select_all (model);
-}
-
-void
-eab_view_show_all(EABView *view)
-{
- g_object_set(view,
- "query", NULL,
- NULL);
-}
-
-void
-eab_view_stop(EABView *view)
-{
- if (view)
- eab_model_stop (view->model);
-}
-
-static void
-view_transfer_contacts (EABView *view, gboolean delete_from_source)
-{
- EBook *book;
- GList *contacts;
- GtkWindow *parent_window;
-
- g_object_get(view->model,
- "book", &book,
- NULL);
- contacts = get_selected_contacts (view);
- parent_window = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view)));
-
- eab_transfer_contacts (book, contacts, delete_from_source, parent_window);
- g_object_unref(book);
-}
-
-void
-eab_view_copy_to_folder (EABView *view)
-{
- view_transfer_contacts (view, FALSE);
-}
-
-void
-eab_view_move_to_folder (EABView *view)
-{
- view_transfer_contacts (view, TRUE);
-}
-
-
-static gboolean
-eab_view_selection_nonempty (EABView *view)
-{
- ESelectionModel *selection_model;
-
- selection_model = get_selection_model (view);
- if (selection_model == NULL)
- return FALSE;
-
- return e_selection_model_selected_count (selection_model) != 0;
-}
-
-gboolean
-eab_view_can_create (EABView *view)
-{
- return view ? eab_model_editable (view->model) : FALSE;
-}
-
-gboolean
-eab_view_can_print (EABView *view)
-{
- return view && view->model ? eab_model_contact_count (view->model) : FALSE;
-}
-
-gboolean
-eab_view_can_save_as (EABView *view)
-{
- return view ? eab_view_selection_nonempty (view) : FALSE;
-}
-
-gboolean
-eab_view_can_view (EABView *view)
-{
- return view ? eab_view_selection_nonempty (view) : FALSE;
-}
-
-gboolean
-eab_view_can_send (EABView *view)
-{
- return view ? eab_view_selection_nonempty (view) : FALSE;
-}
-
-gboolean
-eab_view_can_send_to (EABView *view)
-{
- return view ? eab_view_selection_nonempty (view) : FALSE;
-}
-
-gboolean
-eab_view_can_delete (EABView *view)
-{
- return view ? eab_view_selection_nonempty (view) && eab_model_editable (view->model) : FALSE;
-}
-
-gboolean
-eab_view_can_cut (EABView *view)
-{
- return view ? eab_view_selection_nonempty (view) && eab_model_editable (view->model) : FALSE;
-}
-
-gboolean
-eab_view_can_copy (EABView *view)
-{
- return view ? eab_view_selection_nonempty (view) : FALSE;
-}
-
-gboolean
-eab_view_can_paste (EABView *view)
-{
- return view ? eab_model_editable (view->model) : FALSE;
-}
-
-gboolean
-eab_view_can_select_all (EABView *view)
-{
- return view ? eab_model_contact_count (view->model) != 0 : FALSE;
-}
-
-gboolean
-eab_view_can_stop (EABView *view)
-{
- return view ? eab_model_can_stop (view->model) : FALSE;
-}
-
-gboolean
-eab_view_can_copy_to_folder (EABView *view)
-{
- return view ? eab_view_selection_nonempty (view) : FALSE;
-}
-
-gboolean
-eab_view_can_move_to_folder (EABView *view)
-{
- return view ? eab_view_selection_nonempty (view) && eab_model_editable (view->model) : FALSE;
-}
-
-EABMenuTargetSelect *
-eab_view_get_menu_target (EABView *view, EABMenu *menu)
-{
- GPtrArray *cards = g_ptr_array_new();
- ESelectionModel *selection_model;
- EABMenuTargetSelect *t;
-
- selection_model = get_selection_model (view);
- if (selection_model) {
- ContactAndBook cab;
-
- cab.view = view;
- cab.closure = cards;
- e_selection_model_foreach(selection_model, get_card_1, &cab);
- }
-
- t = eab_menu_target_new_select(menu, view->book, !eab_model_editable(view->model), cards);
- t->target.widget = (GtkWidget *)view;
-
- return t;
-}
diff --git a/addressbook/gui/widgets/e-addressbook-view.etspec b/addressbook/gui/widgets/e-addressbook-view.etspec
deleted file mode 100644
index a74a53e798..0000000000
--- a/addressbook/gui/widgets/e-addressbook-view.etspec
+++ /dev/null
@@ -1,65 +0,0 @@
-<ETableSpecification draw-grid="true" cursor-mode="line">
- <ETableColumn model_col= "2" _title="File As" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "3" _title="Full Name" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "4" _title="Given Name" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "5" _title="Family Name" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "6" _title="Nickname" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
-
- <ETableColumn model_col= "7" _title="Email" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "8" _title="Email 2" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "9" _title="Email 3" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
-
- <ETableColumn model_col= "15" _title="Assistant Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "16" _title="Business Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "17" _title="Business Phone 2" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="18" _title="Business Fax" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="19" _title="Callback Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="20" _title="Car Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="21" _title="Company Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="22" _title="Home Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="23" _title="Home Phone 2" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="24" _title="Home Fax" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="25" _title="ISDN Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="26" _title="Mobile Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="27" _title="Other Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="28" _title="Other Fax" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="29" _title="Pager" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="30" _title="Primary Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="31" _title="Radio" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="32" _title="Telex" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
-
-<!-- Translators: This is a vcard standard and stands for the type of
- phone used by the hearing impaired. TTY stands for "teletype"
- (familiar from Unix device names), and TDD is "Telecommunications
- Device for Deaf". However, you probably want to leave this
- abbreviation unchanged unless you know that there is actually a
- different and established translation for this in your language. -->
- <ETableColumn model_col="33" _title="TTYTDD" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
-
- <ETableColumn model_col="34" _title="Organization" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="35" _title="Unit" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="36" _title="Office" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="37" _title="Title" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="38" _title="Role" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="39" _title="Manager" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="40" _title="Assistant" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
-
- <ETableColumn model_col="41" _title="Web Site" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="42" _title="Journal" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
-
- <ETableColumn model_col="43" _title="Categories" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
-
- <ETableColumn model_col="48" _title="Spouse" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col="49" _title="Note" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/>
-
- <ETableState>
- <column source="0"/>
- <column source="1"/>
- <column source="5"/>
- <column source="23"/>
- <column source="36"/>
- <grouping>
- <leaf column="0" ascending="true"/>
- </grouping>
- </ETableState>
-</ETableSpecification>
diff --git a/addressbook/gui/widgets/e-addressbook-view.h b/addressbook/gui/widgets/e-addressbook-view.h
deleted file mode 100644
index a55406915e..0000000000
--- a/addressbook/gui/widgets/e-addressbook-view.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-addressbook-view.h
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-#ifndef __EAB_VIEW_H__
-#define __EAB_VIEW_H__
-
-#include <gtk/gtkvbox.h>
-#include <bonobo/bonobo-ui-component.h>
-#include <gal/menus/gal-view-instance.h>
-#include <libebook/e-book.h>
-#include "e-addressbook-model.h"
-#include "eab-contact-display.h"
-#include "widgets/menus/gal-view-menus.h"
-#include "widgets/misc/e-search-bar.h"
-#include "widgets/misc/e-filter-bar.h"
-
-G_BEGIN_DECLS
-
-struct _EABMenu;
-struct _EABMenuTargetSelect;
-
-/* EABView - A card displaying information about a contact.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- */
-
-#define E_TYPE_AB_VIEW (eab_view_get_type ())
-#define EAB_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_AB_VIEW, EABView))
-#define EAB_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_AB_VIEW, EABViewClass))
-#define E_IS_ADDRESSBOOK_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_AB_VIEW))
-#define E_IS_ADDRESSBOOK_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_AB_VIEW))
-
-typedef enum {
- EAB_VIEW_NONE, /* initialized to this */
- EAB_VIEW_MINICARD,
- EAB_VIEW_TABLE,
-#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW
- ,EAB_VIEW_TREEVIEW
-#endif
-} EABViewType;
-
-
-typedef struct _EABView EABView;
-typedef struct _EABViewClass EABViewClass;
-
-struct _EABView
-{
- GtkVBox parent;
-
- /* item specific fields */
- EABViewType view_type;
-
- EABModel *model;
-
- GtkWidget *invisible;
- GList *clipboard_contacts;
-
- EBook *book;
- ESource *source;
- char *query;
- guint editable : 1;
-
- gint displayed_contact;
-
- GObject *object;
- GtkWidget *widget;
-
- GtkWidget *contact_display_window;
- GtkWidget *contact_display;
- GtkWidget *paned;
-
- /* Menus handler and the view instance */
- GalViewInstance *view_instance;
- GalViewMenus *view_menus;
- GalView *current_view;
- BonoboUIComponent *uic;
-
- /* the search bar and related machinery */
- ESearchBar *search;
- gint ecml_changed_id;
- RuleContext *search_context;
- FilterRule *search_rule;
-};
-
-struct _EABViewClass
-{
- GtkVBoxClass parent_class;
-
- /*
- * Signals
- */
- void (*status_message) (EABView *view, const gchar *message);
- void (*search_result) (EABView *view, EBookViewStatus status);
- void (*folder_bar_message) (EABView *view, const gchar *message);
- void (*command_state_change) (EABView *view);
-};
-
-GtkWidget *eab_view_new (void);
-GType eab_view_get_type (void);
-
-void eab_view_show_contact_preview (EABView *view, gboolean show);
-
-void eab_view_setup_menus (EABView *view,
- BonoboUIComponent *uic);
-void eab_view_discard_menus (EABView *view);
-
-RuleContext *eab_view_peek_search_context (EABView *view);
-FilterRule *eab_view_peek_search_rule (EABView *view);
-
-void eab_view_save_as (EABView *view);
-void eab_view_view (EABView *view);
-void eab_view_send (EABView *view);
-void eab_view_send_to (EABView *view);
-void eab_view_print (EABView *view);
-void eab_view_print_preview (EABView *view);
-void eab_view_delete_selection (EABView *view);
-void eab_view_cut (EABView *view);
-void eab_view_copy (EABView *view);
-void eab_view_paste (EABView *view);
-void eab_view_select_all (EABView *view);
-void eab_view_show_all (EABView *view);
-void eab_view_stop (EABView *view);
-void eab_view_copy_to_folder (EABView *view);
-void eab_view_move_to_folder (EABView *view);
-
-gboolean eab_view_can_create (EABView *view);
-gboolean eab_view_can_print (EABView *view);
-gboolean eab_view_can_save_as (EABView *view);
-gboolean eab_view_can_view (EABView *view);
-gboolean eab_view_can_send (EABView *view);
-gboolean eab_view_can_send_to (EABView *view);
-gboolean eab_view_can_delete (EABView *view);
-gboolean eab_view_can_cut (EABView *view);
-gboolean eab_view_can_copy (EABView *view);
-gboolean eab_view_can_paste (EABView *view);
-gboolean eab_view_can_select_all (EABView *view);
-gboolean eab_view_can_stop (EABView *view);
-gboolean eab_view_can_copy_to_folder (EABView *view);
-gboolean eab_view_can_move_to_folder (EABView *view);
-
-struct _EABMenuTargetSelect *eab_view_get_menu_target (EABView *view, struct _EABMenu *menu);
-
-G_END_DECLS;
-
-#endif /* __EAB_VIEW_H__ */
diff --git a/addressbook/gui/widgets/e-minicard-label.c b/addressbook/gui/widgets/e-minicard-label.c
deleted file mode 100644
index df1465349e..0000000000
--- a/addressbook/gui/widgets/e-minicard-label.c
+++ /dev/null
@@ -1,508 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-minicard-label.c
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include "e-minicard-label.h"
-#include "eab-marshal.h"
-
-#include <gtk/gtksignal.h>
-#include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
-#include <libgnome/gnome-i18n.h>
-#include <gal/util/e-util.h>
-#include <gal/e-text/e-text.h>
-#include <gal/widgets/e-canvas.h>
-#include <gal/widgets/e-canvas-utils.h>
-#include <gdk/gdkkeysyms.h>
-
-static void e_minicard_label_init (EMinicardLabel *card);
-static void e_minicard_label_class_init (EMinicardLabelClass *klass);
-static void e_minicard_label_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
-static void e_minicard_label_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
-static gboolean e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event);
-static void e_minicard_label_realize (GnomeCanvasItem *item);
-static void e_minicard_label_unrealize (GnomeCanvasItem *item);
-static void e_minicard_label_reflow(GnomeCanvasItem *item, int flags);
-static void e_minicard_label_style_set (EMinicardLabel *label, GtkStyle *previous_style);
-
-static void e_minicard_label_resize_children( EMinicardLabel *e_minicard_label );
-
-static void set_colors (EMinicardLabel *label);
-
-static GnomeCanvasGroupClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- PROP_0,
- PROP_WIDTH,
- PROP_HEIGHT,
- PROP_HAS_FOCUS,
- PROP_FIELD,
- PROP_FIELDNAME,
- PROP_TEXT_MODEL,
- PROP_MAX_FIELD_NAME_WIDTH,
- PROP_EDITABLE
-};
-
-enum {
- STYLE_SET,
- LAST_SIGNAL
-};
-
-static guint e_minicard_label_signals [LAST_SIGNAL] = {0, };
-
-GType
-e_minicard_label_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (EMinicardLabelClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) e_minicard_label_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EMinicardLabel),
- 0, /* n_preallocs */
- (GInstanceInitFunc) e_minicard_label_init,
- };
-
- type = g_type_register_static (gnome_canvas_group_get_type (), "EMinicardLabel", &info, 0);
- }
-
- return type;
-}
-
-static void
-e_minicard_label_class_init (EMinicardLabelClass *klass)
-{
- GObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = G_OBJECT_CLASS (klass);
- item_class = (GnomeCanvasItemClass *) klass;
-
- klass->style_set = e_minicard_label_style_set;
-
- parent_class = g_type_class_peek_parent (klass);
-
- object_class->set_property = e_minicard_label_set_property;
- object_class->get_property = e_minicard_label_get_property;
- /* object_class->destroy = e_minicard_label_destroy; */
-
- g_object_class_install_property (object_class, PROP_WIDTH,
- g_param_spec_double ("width",
- _("Width"),
- /*_( */"XXX blurb" /*)*/,
- 0.0, G_MAXDOUBLE, 10.0,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_HEIGHT,
- g_param_spec_double ("height",
- _("Height"),
- /*_( */"XXX blurb" /*)*/,
- 0.0, G_MAXDOUBLE, 10.0,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_HAS_FOCUS,
- g_param_spec_boolean ("has_focus",
- _("Has Focus"),
- /*_( */"XXX blurb" /*)*/,
- FALSE,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_FIELD,
- g_param_spec_string ("field",
- _("Field"),
- /*_( */"XXX blurb" /*)*/,
- NULL,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_FIELDNAME,
- g_param_spec_string ("fieldname",
- _("Field Name"),
- /*_( */"XXX blurb" /*)*/,
- NULL,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_TEXT_MODEL,
- g_param_spec_object ("text_model",
- _("Text Model"),
- /*_( */"XXX blurb" /*)*/,
- E_TYPE_TEXT_MODEL,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_MAX_FIELD_NAME_WIDTH,
- g_param_spec_double ("max_field_name_length",
- _("Max field name length"),
- /*_( */"XXX blurb" /*)*/,
- -1.0, G_MAXDOUBLE, -1.0,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_EDITABLE,
- g_param_spec_boolean ("editable",
- _("Editable"),
- /*_( */"XXX blurb" /*)*/,
- FALSE,
- G_PARAM_READWRITE));
-
- e_minicard_label_signals [STYLE_SET] =
- g_signal_new ("style_set",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EMinicardLabelClass, style_set),
- NULL, NULL,
- eab_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1,
- GTK_TYPE_STYLE);
-
- /* GnomeCanvasItem method overrides */
- item_class->realize = e_minicard_label_realize;
- item_class->unrealize = e_minicard_label_unrealize;
- item_class->event = e_minicard_label_event;
-}
-
-static void
-e_minicard_label_init (EMinicardLabel *minicard_label)
-{
- minicard_label->width = 10;
- minicard_label->height = 10;
- minicard_label->rect = NULL;
- minicard_label->fieldname = NULL;
- minicard_label->field = NULL;
-
- minicard_label->max_field_name_length = -1;
-
- e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(minicard_label), e_minicard_label_reflow);
-}
-
-static void
-e_minicard_label_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
- EMinicardLabel *e_minicard_label;
- GnomeCanvasItem *item;
-
- e_minicard_label = E_MINICARD_LABEL (object);
- item = GNOME_CANVAS_ITEM (object);
-
- switch (prop_id){
- case PROP_WIDTH:
- e_minicard_label->width = g_value_get_double (value);
- e_minicard_label_resize_children(e_minicard_label);
- e_canvas_item_request_reflow (item);
- break;
- case PROP_HAS_FOCUS:
- if (e_minicard_label->field && (g_value_get_boolean (value) != E_FOCUS_NONE))
- e_canvas_item_grab_focus(e_minicard_label->field, FALSE);
- break;
- case PROP_FIELD:
- gnome_canvas_item_set( e_minicard_label->field, "text", g_value_get_string (value), NULL );
- break;
- case PROP_FIELDNAME:
- gnome_canvas_item_set( e_minicard_label->fieldname, "text", g_value_get_string (value), NULL );
- break;
- case PROP_TEXT_MODEL:
- gnome_canvas_item_set( e_minicard_label->field, "model", g_value_get_object (value), NULL);
- break;
- case PROP_MAX_FIELD_NAME_WIDTH:
- e_minicard_label->max_field_name_length = g_value_get_double (value);
- break;
- case PROP_EDITABLE:
- e_minicard_label->editable = g_value_get_boolean (value);
- g_object_set (e_minicard_label->field, "editable", FALSE /* e_minicard_label->editable */, NULL);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-e_minicard_label_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
- EMinicardLabel *e_minicard_label;
-
- e_minicard_label = E_MINICARD_LABEL (object);
-
- switch (prop_id) {
- case PROP_WIDTH:
- g_value_set_double (value, e_minicard_label->width);
- break;
- case PROP_HEIGHT:
- g_value_set_double (value, e_minicard_label->height);
- break;
- case PROP_HAS_FOCUS:
- g_value_set_boolean (value, e_minicard_label->has_focus ? E_FOCUS_CURRENT : E_FOCUS_NONE);
- break;
- case PROP_FIELD:
- g_object_get_property (G_OBJECT (e_minicard_label->field),
- "text", value);
- break;
- case PROP_FIELDNAME:
- g_object_get_property (G_OBJECT (e_minicard_label->fieldname),
- "text", value);
- break;
- case PROP_TEXT_MODEL:
- g_object_get_property (G_OBJECT (e_minicard_label->field),
- "model", value);
- break;
- case PROP_MAX_FIELD_NAME_WIDTH:
- g_value_set_double (value, e_minicard_label->max_field_name_length);
- break;
- case PROP_EDITABLE:
- g_value_set_boolean (value, e_minicard_label->editable);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-e_minicard_label_realize (GnomeCanvasItem *item)
-{
- EMinicardLabel *e_minicard_label;
- GnomeCanvasGroup *group;
-
- e_minicard_label = E_MINICARD_LABEL (item);
- group = GNOME_CANVAS_GROUP( item );
-
- if (GNOME_CANVAS_ITEM_CLASS( parent_class )->realize)
- (* GNOME_CANVAS_ITEM_CLASS( parent_class )->realize) (item);
-
- e_canvas_item_request_reflow(item);
-
- e_minicard_label->rect =
- gnome_canvas_item_new( group,
- gnome_canvas_rect_get_type(),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) e_minicard_label->width - 1,
- "y2", (double) e_minicard_label->height - 1,
- "outline_color", NULL,
- NULL );
- e_minicard_label->fieldname =
- gnome_canvas_item_new( group,
- e_text_get_type(),
- "anchor", GTK_ANCHOR_NW,
- "clip_width", (double) ( e_minicard_label->width / 2 - 4 ),
- "clip", TRUE,
- "use_ellipsis", TRUE,
- "fill_color", "black",
- "draw_background", FALSE,
- "im_context", E_CANVAS (item->canvas)->im_context,
- NULL );
- e_canvas_item_move_absolute(e_minicard_label->fieldname, 2, 1);
-
- e_minicard_label->field =
- gnome_canvas_item_new( group,
- e_text_get_type(),
- "anchor", GTK_ANCHOR_NW,
- "clip_width", (double) ( ( e_minicard_label->width + 1 ) / 2 - 4 ),
- "clip", TRUE,
- "use_ellipsis", TRUE,
- "fill_color", "black",
- "editable", FALSE, /* e_minicard_label->editable, */
- "draw_background", FALSE,
- "im_context", E_CANVAS (item->canvas)->im_context,
- NULL );
- e_canvas_item_move_absolute(e_minicard_label->field, ( e_minicard_label->width / 2 + 2), 1);
-
- set_colors (e_minicard_label);
-
- e_canvas_item_request_reflow(item);
-}
-
-static void
-e_minicard_label_unrealize (GnomeCanvasItem *item)
-{
- EMinicardLabel *e_minicard_label;
-
- e_minicard_label = E_MINICARD_LABEL (item);
-
- if (GNOME_CANVAS_ITEM_CLASS( parent_class )->unrealize)
- (* GNOME_CANVAS_ITEM_CLASS( parent_class )->unrealize) (item);
-}
-
-static gboolean
-e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- EMinicardLabel *e_minicard_label;
-
- e_minicard_label = E_MINICARD_LABEL (item);
-
- switch( event->type ) {
- case GDK_KEY_PRESS:
- if (event->key.keyval == GDK_Escape) {
- GnomeCanvasItem *parent;
-
- e_text_cancel_editing (E_TEXT (e_minicard_label->field));
-
- parent = GNOME_CANVAS_ITEM (e_minicard_label)->parent;
- if (parent)
- e_canvas_item_grab_focus(parent, FALSE);
- }
- break;
- case GDK_FOCUS_CHANGE: {
- GdkEventFocus *focus_event = (GdkEventFocus *) event;
-
- e_minicard_label->has_focus = focus_event->in;
- set_colors (e_minicard_label);
-
- g_object_set (e_minicard_label->field,
- "handle_popup", e_minicard_label->has_focus,
- NULL);
- break;
- }
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- case GDK_MOTION_NOTIFY:
- case GDK_ENTER_NOTIFY:
- case GDK_LEAVE_NOTIFY: {
- gboolean return_val;
- g_signal_emit_by_name(e_minicard_label->field, "event", event, &return_val);
- return return_val;
- }
- default:
- break;
- }
-
- if (GNOME_CANVAS_ITEM_CLASS( parent_class )->event)
- return (* GNOME_CANVAS_ITEM_CLASS( parent_class )->event) (item, event);
- else
- return 0;
-}
-
-static void
-e_minicard_label_resize_children(EMinicardLabel *e_minicard_label)
-{
- double left_width;
- if (e_minicard_label->max_field_name_length != -1 && ((e_minicard_label->width / 2) - 4 > e_minicard_label->max_field_name_length))
- left_width = e_minicard_label->max_field_name_length;
- else
- left_width = e_minicard_label->width / 2 - 4;
-
- gnome_canvas_item_set( e_minicard_label->fieldname,
- "clip_width", (double) MAX ( left_width, 0 ),
- NULL );
- gnome_canvas_item_set( e_minicard_label->field,
- "clip_width", (double) MAX ( e_minicard_label->width - 8 - left_width, 0 ),
- NULL );
-}
-
-static void
-set_colors (EMinicardLabel *label)
-{
- if ( (GTK_OBJECT_FLAGS( label ) & GNOME_CANVAS_ITEM_REALIZED) ) {
- GtkWidget *canvas = GTK_WIDGET (GNOME_CANVAS_ITEM (label)->canvas);
- GtkStyle *style = gtk_widget_get_style (canvas);
- if (label->has_focus) {
- gnome_canvas_item_set (label->rect,
- "outline_color_gdk", &style->mid[GTK_STATE_SELECTED],
- "fill_color_gdk", &style->bg[GTK_STATE_NORMAL],
- NULL);
-
- gnome_canvas_item_set (label->field,
- "fill_color_gdk", &canvas->style->text[GTK_STATE_NORMAL],
- NULL);
-
- gnome_canvas_item_set (label->fieldname,
- "fill_color_gdk", &canvas->style->text[GTK_STATE_NORMAL],
- NULL);
- }
- else {
- gnome_canvas_item_set (label->rect,
- "outline_color_gdk", NULL,
- "fill_color_gdk", NULL,
- NULL);
-
- gnome_canvas_item_set (label->field,
- "fill_color_gdk", &canvas->style->text[GTK_STATE_NORMAL],
- NULL);
-
- gnome_canvas_item_set (label->fieldname,
- "fill_color_gdk", &canvas->style->text[GTK_STATE_NORMAL],
- NULL);
- }
- }
-}
-
-static void
-e_minicard_label_style_set (EMinicardLabel *label, GtkStyle *previous_style)
-{
- set_colors (label);
-}
-
-static void
-e_minicard_label_reflow(GnomeCanvasItem *item, int flags)
-{
- EMinicardLabel *e_minicard_label = E_MINICARD_LABEL(item);
-
- gint old_height;
- gdouble text_height;
- gdouble left_width;
-
- old_height = e_minicard_label->height;
-
- g_object_get(e_minicard_label->fieldname,
- "text_height", &text_height,
- NULL);
-
- e_minicard_label->height = text_height;
-
-
- g_object_get(e_minicard_label->field,
- "text_height", &text_height,
- NULL);
-
- if (e_minicard_label->height < text_height)
- e_minicard_label->height = text_height;
- e_minicard_label->height += 3;
-
- gnome_canvas_item_set( e_minicard_label->rect,
- "x2", (double) e_minicard_label->width - 1,
- "y2", (double) e_minicard_label->height - 1,
- NULL );
-
- gnome_canvas_item_set( e_minicard_label->fieldname,
- "clip_height", (double) e_minicard_label->height - 3,
- NULL );
-
- if (e_minicard_label->max_field_name_length != -1 && ((e_minicard_label->width / 2) - 4 > e_minicard_label->max_field_name_length))
- left_width = e_minicard_label->max_field_name_length;
- else
- left_width = e_minicard_label->width / 2 - 4;
-
- e_canvas_item_move_absolute(e_minicard_label->field, left_width + 6, 1);
-
- if (old_height != e_minicard_label->height)
- e_canvas_item_request_parent_reflow(item);
-}
-
-GnomeCanvasItem *
-e_minicard_label_new(GnomeCanvasGroup *parent)
-{
- GnomeCanvasItem *item = gnome_canvas_item_new(parent, e_minicard_label_get_type(), NULL);
- return item;
-}
-
diff --git a/addressbook/gui/widgets/e-minicard-label.h b/addressbook/gui/widgets/e-minicard-label.h
deleted file mode 100644
index d914cb30bb..0000000000
--- a/addressbook/gui/widgets/e-minicard-label.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-minicard-label.h
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-#ifndef __E_MINICARD_LABEL_H__
-#define __E_MINICARD_LABEL_H__
-
-#include <glib.h>
-#include <libgnomecanvas/gnome-canvas.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* EMinicardLabel - A label doing focus with non-marching ants.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- * width double RW width of the label
- * height double R height of the label
- * field string RW text in the field label
- * fieldname string RW text in the fieldname label
- */
-
-#define E_TYPE_MINICARD_LABEL (e_minicard_label_get_type ())
-#define E_MINICARD_LABEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MINICARD_LABEL, EMinicardLabel))
-#define E_MINICARD_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MINICARD_LABEL, EMiniCardLabelClass))
-#define E_IS_MINICARD_LABEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MINICARD_LABEL))
-#define E_IS_MINICARD_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MINICARD_LABEL))
-
-
-typedef struct _EMinicardLabel EMinicardLabel;
-typedef struct _EMinicardLabelClass EMinicardLabelClass;
-
-struct _EMinicardLabel
-{
- GnomeCanvasGroup parent;
-
- /* item specific fields */
- double width;
- double height;
- double max_field_name_length;
- guint editable : 1;
- GnomeCanvasItem *fieldname;
- GnomeCanvasItem *field;
- GnomeCanvasItem *rect;
-
- gboolean has_focus;
-};
-
-struct _EMinicardLabelClass
-{
- GnomeCanvasGroupClass parent_class;
-
- void (* style_set) (EMinicardLabel *label, GtkStyle *previous_style);
-};
-
-
-GType e_minicard_label_get_type (void);
-GnomeCanvasItem *e_minicard_label_new(GnomeCanvasGroup *parent);
-void e_minicard_label_construct (GnomeCanvasItem *item);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_MINICARD_LABEL_H__ */
diff --git a/addressbook/gui/widgets/e-minicard-view-widget.c b/addressbook/gui/widgets/e-minicard-view-widget.c
deleted file mode 100644
index ff1bdc1f06..0000000000
--- a/addressbook/gui/widgets/e-minicard-view-widget.c
+++ /dev/null
@@ -1,440 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-minicard-view-widget.c
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include <gtk/gtksignal.h>
-#include <gal/widgets/e-canvas-background.h>
-#include <gal/widgets/e-canvas.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "eab-marshal.h"
-#include "e-minicard-view-widget.h"
-
-static void e_minicard_view_widget_init (EMinicardViewWidget *widget);
-static void e_minicard_view_widget_class_init (EMinicardViewWidgetClass *klass);
-static void e_minicard_view_widget_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
-static void e_minicard_view_widget_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
-static void e_minicard_view_widget_dispose (GObject *object);
-static void e_minicard_view_widget_reflow (ECanvas *canvas);
-static void e_minicard_view_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation);
-static void e_minicard_view_widget_style_set (GtkWidget *widget, GtkStyle *previous_style);
-static void e_minicard_view_widget_realize (GtkWidget *widget);
-
-static ECanvasClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
- PROP_0,
- PROP_BOOK,
- PROP_QUERY,
- PROP_EDITABLE,
- PROP_COLUMN_WIDTH
-};
-
-enum {
- SELECTION_CHANGE,
- COLUMN_WIDTH_CHANGED,
- RIGHT_CLICK,
- LAST_SIGNAL
-};
-
-static guint signals [LAST_SIGNAL] = {0, };
-
-GType
-e_minicard_view_widget_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (EMinicardViewWidgetClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) e_minicard_view_widget_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EMinicardViewWidget),
- 0, /* n_preallocs */
- (GInstanceInitFunc) e_minicard_view_widget_init,
- };
-
- type = g_type_register_static (e_canvas_get_type (), "EMinicardViewWidget", &info, 0);
- }
-
- return type;
-}
-
-static void
-e_minicard_view_widget_class_init (EMinicardViewWidgetClass *klass)
-{
- GObjectClass *object_class;
- GtkWidgetClass *widget_class;
- ECanvasClass *canvas_class;
-
- object_class = (GObjectClass*) klass;
- widget_class = GTK_WIDGET_CLASS (klass);
- canvas_class = E_CANVAS_CLASS (klass);
-
- parent_class = gtk_type_class (e_canvas_get_type ());
-
- object_class->set_property = e_minicard_view_widget_set_property;
- object_class->get_property = e_minicard_view_widget_get_property;
- object_class->dispose = e_minicard_view_widget_dispose;
-
- g_object_class_install_property (object_class, PROP_BOOK,
- g_param_spec_object ("book",
- _("Book"),
- /*_( */"XXX blurb" /*)*/,
- E_TYPE_BOOK,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_QUERY,
- g_param_spec_string ("query",
- _("Query"),
- /*_( */"XXX blurb" /*)*/,
- NULL,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_EDITABLE,
- g_param_spec_boolean ("editable",
- _("Editable"),
- /*_( */"XXX blurb" /*)*/,
- FALSE,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_COLUMN_WIDTH,
- g_param_spec_double ("column_width",
- _("Column Width"),
- /*_( */"XXX blurb" /*)*/,
- 0.0, G_MAXDOUBLE, 150.0,
- G_PARAM_READWRITE));
-
- signals [SELECTION_CHANGE] =
- g_signal_new ("selection_change",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EMinicardViewWidgetClass, selection_change),
- NULL, NULL,
- eab_marshal_NONE__NONE,
- G_TYPE_NONE, 0);
-
- signals [COLUMN_WIDTH_CHANGED] =
- g_signal_new ("column_width_changed",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EMinicardViewWidgetClass, column_width_changed),
- NULL, NULL,
- eab_marshal_NONE__DOUBLE,
- G_TYPE_NONE, 1, G_TYPE_DOUBLE);
-
- signals [RIGHT_CLICK] =
- g_signal_new ("right_click",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EMinicardViewWidgetClass, right_click),
- NULL, NULL,
- eab_marshal_INT__POINTER,
- G_TYPE_INT, 1, G_TYPE_POINTER);
-
- widget_class->style_set = e_minicard_view_widget_style_set;
- widget_class->realize = e_minicard_view_widget_realize;
- widget_class->size_allocate = e_minicard_view_widget_size_allocate;
-
- canvas_class->reflow = e_minicard_view_widget_reflow;
-
- klass->selection_change = NULL;
- klass->column_width_changed = NULL;
- klass->right_click = NULL;
-}
-
-static void
-e_minicard_view_widget_init (EMinicardViewWidget *view)
-{
- view->emv = NULL;
-
- view->book = NULL;
- view->query = NULL;
- view->editable = FALSE;
- view->column_width = 150;
-}
-
-GtkWidget *
-e_minicard_view_widget_new (EAddressbookReflowAdapter *adapter)
-{
- EMinicardViewWidget *widget = E_MINICARD_VIEW_WIDGET (g_object_new (e_minicard_view_widget_get_type (), NULL));
-
- widget->adapter = adapter;
- g_object_ref (widget->adapter);
-
- return GTK_WIDGET (widget);
-}
-
-static void
-e_minicard_view_widget_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- EMinicardViewWidget *emvw;
-
- emvw = E_MINICARD_VIEW_WIDGET (object);
-
- switch (prop_id){
- case PROP_BOOK:
- if (emvw->book)
- g_object_unref (emvw->book);
- if (g_value_get_object (value)) {
- emvw->book = E_BOOK(g_value_get_object (value));
- if (emvw->book)
- g_object_ref(emvw->book);
- } else
- emvw->book = NULL;
- if (emvw->emv)
- g_object_set(emvw->emv,
- "book", emvw->book,
- NULL);
- break;
- case PROP_QUERY:
- emvw->query = g_strdup(g_value_get_string (value));
- if (emvw->emv)
- g_object_set(emvw->emv,
- "query", emvw->query,
- NULL);
- break;
- case PROP_EDITABLE:
- emvw->editable = g_value_get_boolean (value);
- if (emvw->emv)
- g_object_set (emvw->emv,
- "editable", emvw->editable,
- NULL);
- break;
- case PROP_COLUMN_WIDTH:
- emvw->column_width = g_value_get_double (value);
- if (emvw->emv) {
- g_object_set (emvw->emv,
- "column_width", emvw->column_width,
- NULL);
- }
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-e_minicard_view_widget_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- EMinicardViewWidget *emvw;
-
- emvw = E_MINICARD_VIEW_WIDGET (object);
-
- switch (prop_id) {
- case PROP_BOOK:
- g_value_set_object (value, emvw->book);
- break;
- case PROP_QUERY:
- g_value_set_string (value, emvw->query);
- break;
- case PROP_EDITABLE:
- g_value_set_boolean (value, emvw->editable);
- break;
- case PROP_COLUMN_WIDTH:
- g_value_set_double (value, emvw->column_width);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-e_minicard_view_widget_dispose (GObject *object)
-{
- EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(object);
-
- if (view->book) {
- g_object_unref (view->book);
- view->book = NULL;
- }
- if (view->query) {
- g_free(view->query);
- view->query = NULL;
- }
-
- if (view->adapter) {
- g_object_unref (view->adapter);
- view->adapter = NULL;
- }
-
- if (G_OBJECT_CLASS(parent_class)->dispose)
- G_OBJECT_CLASS(parent_class)->dispose (object);
-}
-
-static void
-selection_change (ESelectionModel *esm, EMinicardViewWidget *widget)
-{
- g_signal_emit (widget,
- signals [SELECTION_CHANGE], 0);
-}
-
-static void
-selection_row_change (ESelectionModel *esm, int row, EMinicardViewWidget *widget)
-{
- gboolean selected = e_selection_model_is_row_selected (esm, row);
-
- /* we only handle the selected case here */
- if (!selected)
- return;
-
- selection_change (esm, widget);
-}
-
-static void
-column_width_changed (ESelectionModel *esm, double width, EMinicardViewWidget *widget)
-{
- g_signal_emit (widget,
- signals [COLUMN_WIDTH_CHANGED], 0, width);
-}
-
-static guint
-right_click (EMinicardView *view, GdkEvent *event, EMinicardViewWidget *widget)
-{
- guint ret_val;
- g_signal_emit (widget,
- signals [RIGHT_CLICK], 0,
- event, &ret_val);
- return ret_val;
-}
-
-static void
-e_minicard_view_widget_style_set (GtkWidget *widget, GtkStyle *previous_style)
-{
- EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(widget);
-
- if (view->background)
- gnome_canvas_item_set (view->background,
- "fill_color_gdk", &widget->style->base[GTK_STATE_NORMAL],
- NULL );
-
- if (GTK_WIDGET_CLASS(parent_class)->style_set)
- GTK_WIDGET_CLASS(parent_class)->style_set (widget, previous_style);
-}
-
-
-static void
-e_minicard_view_widget_realize (GtkWidget *widget)
-{
- EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(widget);
- GtkStyle *style = gtk_widget_get_style (widget);
-
- view->background = gnome_canvas_item_new(gnome_canvas_root( GNOME_CANVAS(view) ),
- e_canvas_background_get_type(),
- "fill_color_gdk", &style->base[GTK_STATE_NORMAL],
- NULL );
-
- view->emv = gnome_canvas_item_new(
- gnome_canvas_root( GNOME_CANVAS(view) ),
- e_minicard_view_get_type(),
- "height", (double) 100,
- "minimum_width", (double) 100,
- "adapter", view->adapter,
- "column_width", view->column_width,
- NULL );
-
- g_signal_connect (E_REFLOW(view->emv)->selection,
- "selection_changed",
- G_CALLBACK (selection_change), view);
- g_signal_connect (E_REFLOW(view->emv)->selection,
- "selection_row_changed",
- G_CALLBACK (selection_row_change), view);
- g_signal_connect (view->emv,
- "column_width_changed",
- G_CALLBACK (column_width_changed), view);
- g_signal_connect (view->emv,
- "right_click",
- G_CALLBACK (right_click), view);
-
- if (GTK_WIDGET_CLASS(parent_class)->realize)
- GTK_WIDGET_CLASS(parent_class)->realize (widget);
-}
-
-static void
-e_minicard_view_widget_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
-{
- if (GTK_WIDGET_CLASS(parent_class)->size_allocate)
- GTK_WIDGET_CLASS(parent_class)->size_allocate (widget, allocation);
-
- if (GTK_WIDGET_REALIZED(widget)) {
- double width;
- EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(widget);
-
- gnome_canvas_item_set( view->emv,
- "height", (double) allocation->height,
- NULL );
- gnome_canvas_item_set( view->emv,
- "minimum_width", (double) allocation->width,
- NULL );
- g_object_get(view->emv,
- "width", &width,
- NULL);
- width = MAX(width, allocation->width);
- gnome_canvas_set_scroll_region (GNOME_CANVAS (view), 0, 0, width - 1, allocation->height - 1);
- }
-}
-
-static void
-e_minicard_view_widget_reflow(ECanvas *canvas)
-{
- double width;
- EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(canvas);
-
- if (E_CANVAS_CLASS(parent_class)->reflow)
- E_CANVAS_CLASS(parent_class)->reflow (canvas);
-
- g_object_get(view->emv,
- "width", &width,
- NULL);
- width = MAX(width, GTK_WIDGET(canvas)->allocation.width);
- gnome_canvas_set_scroll_region(GNOME_CANVAS(canvas), 0, 0, width - 1, GTK_WIDGET(canvas)->allocation.height - 1);
-}
-
-ESelectionModel *
-e_minicard_view_widget_get_selection_model (EMinicardViewWidget *view)
-{
- if (view->emv)
- return E_SELECTION_MODEL (E_REFLOW (view->emv)->selection);
- else
- return NULL;
-}
-
-EMinicardView *
-e_minicard_view_widget_get_view (EMinicardViewWidget *view)
-{
- if (view->emv)
- return E_MINICARD_VIEW (view->emv);
- else
- return NULL;
-}
diff --git a/addressbook/gui/widgets/e-minicard-view-widget.h b/addressbook/gui/widgets/e-minicard-view-widget.h
deleted file mode 100644
index ef8401b88c..0000000000
--- a/addressbook/gui/widgets/e-minicard-view-widget.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-minicard-view-widget.h
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-#ifndef __E_MINICARD_VIEW_WIDGET_H__
-#define __E_MINICARD_VIEW_WIDGET_H__
-
-#include <gal/widgets/e-canvas.h>
-#include <libebook/e-book.h>
-#include "e-minicard-view.h"
-
-G_BEGIN_DECLS
-
-#define E_TYPE_MINICARD_VIEW_WIDGET (e_minicard_view_widget_get_type ())
-#define E_MINICARD_VIEW_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MINICARD_VIEW_WIDGET, EMinicardViewWidget))
-#define E_MINICARD_VIEW_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MINICARD_VIEW_WIDGET, EMinicardViewWidgetClass))
-#define E_IS_MINICARD_VIEW_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MINICARD_VIEW_WIDGET))
-#define E_IS_MINICARD_VIEW_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MINICARD_VIEW_WIDGET))
-
-
-typedef struct _EMinicardViewWidget EMinicardViewWidget;
-typedef struct _EMinicardViewWidgetClass EMinicardViewWidgetClass;
-
-struct _EMinicardViewWidget
-{
- ECanvas parent;
-
- GnomeCanvasItem *background;
- GnomeCanvasItem *emv;
-
- EAddressbookReflowAdapter *adapter;
-
- EBook *book;
- char *query;
- guint editable : 1;
-
- double column_width;
-};
-
-struct _EMinicardViewWidgetClass
-{
- ECanvasClass parent_class;
- void (*selection_change) (EMinicardViewWidget *emvw);
- void (*column_width_changed) (EMinicardViewWidget *emvw, double width);
- guint (*right_click) (EMinicardViewWidget *emvw);
-};
-
-
-GType e_minicard_view_widget_get_type (void);
-GtkWidget *e_minicard_view_widget_new (EAddressbookReflowAdapter *adapter);
-
-/* Get parts of the view widget. */
-ESelectionModel *e_minicard_view_widget_get_selection_model (EMinicardViewWidget *view);
-EMinicardView *e_minicard_view_widget_get_view (EMinicardViewWidget *view);
-
-G_END_DECLS
-
-#endif /* __E_MINICARD_VIEW_WIDGET_H__ */
diff --git a/addressbook/gui/widgets/e-minicard-view.c b/addressbook/gui/widgets/e-minicard-view.c
deleted file mode 100644
index e66bb6047a..0000000000
--- a/addressbook/gui/widgets/e-minicard-view.c
+++ /dev/null
@@ -1,630 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-minicard-view.c
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include "e-minicard-view.h"
-
-#include "eab-gui-util.h"
-#include "eab-marshal.h"
-#include "util/eab-book-util.h"
-
-#include <gtk/gtkselection.h>
-#include <gtk/gtkdnd.h>
-#include <gdk/gdkkeysyms.h>
-#include <gal/widgets/e-canvas.h>
-#include <libgnome/gnome-i18n.h>
-#include <string.h>
-
-static void e_minicard_view_drag_data_get(GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- EMinicardView *view);
-
-static EReflowClass *parent_class = NULL;
-#define PARENT_TYPE (E_REFLOW_TYPE)
-
-/* The arguments we take */
-enum {
- PROP_0,
- PROP_ADAPTER,
- PROP_BOOK,
- PROP_QUERY,
- PROP_EDITABLE
-};
-
-
-enum {
- RIGHT_CLICK,
- LAST_SIGNAL
-};
-
-static guint signals [LAST_SIGNAL] = {0, };
-
-enum DndTargetType {
- DND_TARGET_TYPE_VCARD_LIST,
- DND_TARGET_TYPE_SOURCE_VCARD_LIST
-};
-#define VCARD_LIST_TYPE "text/x-vcard"
-#define SOURCE_VCARD_LIST_TYPE "text/x-source-vcard"
-static GtkTargetEntry drag_types[] = {
- { SOURCE_VCARD_LIST_TYPE, 0, DND_TARGET_TYPE_SOURCE_VCARD_LIST },
- { VCARD_LIST_TYPE, 0, DND_TARGET_TYPE_VCARD_LIST }
-};
-static gint num_drag_types = sizeof(drag_types) / sizeof(drag_types[0]);
-
-static void
-e_minicard_view_drag_data_get(GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- EMinicardView *view)
-{
- if (!E_IS_MINICARD_VIEW(view))
- return;
-
- switch (info) {
- case DND_TARGET_TYPE_VCARD_LIST: {
- char *value;
-
- value = eab_contact_list_to_string (view->drag_list);
-
- gtk_selection_data_set (selection_data,
- selection_data->target,
- 8,
- value, strlen (value));
- break;
- }
- case DND_TARGET_TYPE_SOURCE_VCARD_LIST: {
- EBook *book;
- char *value;
-
- g_object_get (view->adapter, "book", &book, NULL);
- value = eab_book_and_contact_list_to_string (book, view->drag_list);
-
- gtk_selection_data_set (selection_data,
- selection_data->target,
- 8,
- value, strlen (value));
- break;
- }
- }
-}
-
-static void
-clear_drag_data (EMinicardView *view)
-{
- g_list_foreach (view->drag_list, (GFunc)g_object_unref, NULL);
- g_list_free (view->drag_list);
- view->drag_list = NULL;
-}
-
-static int
-e_minicard_view_drag_begin (EAddressbookReflowAdapter *adapter, GdkEvent *event, EMinicardView *view)
-{
- GdkDragContext *context;
- GtkTargetList *target_list;
- GdkDragAction actions = GDK_ACTION_MOVE | GDK_ACTION_COPY;
-
- clear_drag_data (view);
-
- view->drag_list = e_minicard_view_get_card_list (view);
-
- g_print ("dragging %d card(s)\n", g_list_length (view->drag_list));
-
- target_list = gtk_target_list_new (drag_types, num_drag_types);
-
- context = gtk_drag_begin (GTK_WIDGET (GNOME_CANVAS_ITEM (view)->canvas),
- target_list, actions, 1/*XXX*/, event);
-
- if (!view->canvas_drag_data_get_id)
- view->canvas_drag_data_get_id = g_signal_connect (GNOME_CANVAS_ITEM (view)->canvas,
- "drag_data_get",
- G_CALLBACK (e_minicard_view_drag_data_get),
- view);
-
- gtk_drag_set_icon_default (context);
-
- return TRUE;
-}
-
-static void
-set_empty_message (EMinicardView *view)
-{
- char *empty_message;
- gboolean editable = FALSE, perform_initial_query = FALSE;
- EBook *book;
-
- if (view->adapter) {
- g_object_get (view->adapter,
- "editable", &editable,
- NULL);
-
- g_object_get (view->adapter, "book", &book, NULL);
- if (!e_book_check_static_capability (book, "do-initial-query"))
- perform_initial_query = TRUE;
- }
-
- if (editable) {
- if (perform_initial_query)
- empty_message = _("\n\nSearch for the Contact\n\n"
- "or double-click here to create a new Contact.");
- else
- empty_message = _("\n\nThere are no items to show in this view.\n\n"
- "Double-click here to create a new Contact.");
- }
- else {
- if (perform_initial_query)
- empty_message = _("\n\nSearch for the Contact.");
- else
- empty_message = _("\n\nThere are no items to show in this view.");
- }
-
- g_object_set (view,
- "empty_message", empty_message,
- NULL);
-}
-
-static void
-writable_status_change (EABModel *model, gboolean writable, EMinicardView *view)
-{
- set_empty_message (view);
-}
-
-static void
-adapter_changed (EMinicardView *view)
-{
- set_empty_message (view);
-
- g_signal_connect (view->adapter, "drag_begin",
- G_CALLBACK (e_minicard_view_drag_begin), view);
-}
-
-static void
-e_minicard_view_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- EMinicardView *view;
-
- view = E_MINICARD_VIEW (object);
-
- switch (prop_id){
- case PROP_ADAPTER:
- if (view->adapter) {
- if (view->writable_status_id) {
- EABModel *model;
- g_object_get (view->adapter,
- "model", &model,
- NULL);
- if (model) {
- g_signal_handler_disconnect (model, view->writable_status_id);
- }
- }
-
- g_object_unref (view->adapter);
- }
- view->writable_status_id = 0;
- view->adapter = g_value_get_object (value);
- g_object_ref (view->adapter);
- adapter_changed (view);
- g_object_set (view,
- "model", view->adapter,
- NULL);
- if (view->adapter) {
- EABModel *model;
- g_object_get (view->adapter,
- "model", &model,
- NULL);
- if (model) {
- view->writable_status_id =
- g_signal_connect (model, "writable_status",
- G_CALLBACK (writable_status_change), view);
- }
-
- }
- break;
- case PROP_BOOK:
- g_object_set (view->adapter,
- "book", g_value_get_object (value),
- NULL);
- set_empty_message (view);
- break;
- case PROP_QUERY:
- g_object_set (view->adapter,
- "query", g_value_get_string (value),
- NULL);
- break;
- case PROP_EDITABLE:
- g_object_set (view->adapter,
- "editable", g_value_get_boolean (value),
- NULL);
- set_empty_message (view);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-e_minicard_view_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- EMinicardView *view;
-
- view = E_MINICARD_VIEW (object);
-
- switch (prop_id) {
- case PROP_ADAPTER:
- g_value_set_object (value, view->adapter);
- break;
- case PROP_BOOK:
- g_object_get_property (G_OBJECT (view->adapter),
- "book", value);
- break;
- case PROP_QUERY:
- g_object_get_property (G_OBJECT (view->adapter),
- "query", value);
- break;
- case PROP_EDITABLE:
- g_object_get_property (G_OBJECT (view->adapter),
- "editable", value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-e_minicard_view_dispose (GObject *object)
-{
- EMinicardView *view = E_MINICARD_VIEW(object);
-
- clear_drag_data (view);
-
- if (view->canvas_drag_data_get_id) {
- g_signal_handler_disconnect (GNOME_CANVAS_ITEM (view)->canvas,
- view->canvas_drag_data_get_id);
- view->canvas_drag_data_get_id = 0;
- }
-
- if (view->adapter) {
- if (view->writable_status_id) {
- EABModel *model;
- g_object_get (view->adapter,
- "model", &model,
- NULL);
- if (model) {
- g_signal_handler_disconnect (model, view->writable_status_id);
- }
- }
-
- g_object_unref (view->adapter);
- }
- view->writable_status_id = 0;
- view->adapter = NULL;
-
- if (G_OBJECT_CLASS(parent_class)->dispose)
- G_OBJECT_CLASS(parent_class)->dispose (object);
-}
-
-static guint
-e_minicard_view_right_click (EMinicardView *view, GdkEvent *event)
-{
- guint ret_val = 0;
- g_signal_emit (view, signals[RIGHT_CLICK], 0,
- event, &ret_val);
- return ret_val;
-}
-
-static gboolean
-e_minicard_view_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- EMinicardView *view;
-
- view = E_MINICARD_VIEW (item);
-
- switch( event->type ) {
- case GDK_2BUTTON_PRESS:
- if (((GdkEventButton *)event)->button == 1) {
- gboolean editable;
-
- g_object_get(view->adapter, "editable", &editable, NULL);
-
- if (editable) {
- EBook *book;
- g_object_get(view, "book", &book, NULL);
-
- if (book && E_IS_BOOK (book))
- eab_show_contact_editor (book, e_contact_new(), TRUE, editable);
- }
- return TRUE;
- }
- case GDK_BUTTON_PRESS:
- if (event->button.button == 3) {
- e_minicard_view_right_click (view, event);
- }
- break;
- case GDK_KEY_PRESS:
- if (event->key.keyval & GDK_SHIFT_MASK &&
- event->key.keyval == GDK_F10) {
- e_minicard_view_right_click (view, event);
- }
- break;
- default:
- break;
- }
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->event)
- return GNOME_CANVAS_ITEM_CLASS(parent_class)->event(item, event);
- else
- return FALSE;
-}
-
-static gint
-e_minicard_view_selection_event (EReflow *reflow, GnomeCanvasItem *item, GdkEvent *event)
-{
- EMinicardView *view;
- int return_val = FALSE;
-
- view = E_MINICARD_VIEW (reflow);
- if (parent_class->selection_event) {
- return_val = parent_class->selection_event (reflow, item, event);
- }
-
- switch (event->type) {
- case GDK_FOCUS_CHANGE:
- if (event->focus_change.in) {
- int i;
- for (i = 0; i < reflow->count; i++) {
- if (reflow->items[i] == item) {
- e_selection_model_maybe_do_something(reflow->selection, i, 0, 0);
- break;
- }
- }
- }
- break;
- case GDK_BUTTON_PRESS:
- if (event->button.button == 3) {
- return_val = e_minicard_view_right_click (view, event);
- if (!return_val)
- e_selection_model_right_click_up(reflow->selection);
- }
- break;
- default:
- break;
- }
- return return_val;
-}
-
-typedef struct {
- EMinicardView *view;
- EBookCallback cb;
- gpointer closure;
-} ViewCbClosure;
-
-static void
-do_remove (int i, gpointer user_data)
-{
- EBook *book;
- EContact *contact;
- ViewCbClosure *viewcbclosure = user_data;
- EMinicardView *view = viewcbclosure->view;
- EBookCallback cb = viewcbclosure->cb;
- gpointer closure = viewcbclosure->closure;
-
- g_object_get (view->adapter,
- "book", &book,
- NULL);
-
- contact = e_addressbook_reflow_adapter_get_contact (view->adapter, i);
-
- e_book_async_remove_contact(book, contact, cb, closure);
-
- g_object_unref (contact);
-}
-
-#if 0
-static int
-compare_to_utf_str (EMinicard *card, const char *utf_str)
-{
- g_return_val_if_fail(card != NULL, 0);
- g_return_val_if_fail(E_IS_MINICARD(card), 0);
-
- if (g_unichar_isdigit (g_utf8_get_char (utf_str))) {
- return 1;
- }
-
- if (card->card) {
- char *file_as;
- g_object_get(card->card,
- "file_as", &file_as,
- NULL);
- if (file_as)
- return g_utf8_strcasecmp (file_as, utf_str);
- else
- return 0;
- } else {
- return 0;
- }
-}
-#endif
-
-static void
-e_minicard_view_class_init (EMinicardViewClass *klass)
-{
- GObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
- EReflowClass *reflow_class;
-
- object_class = G_OBJECT_CLASS (klass);
- item_class = (GnomeCanvasItemClass *) klass;
- reflow_class = (EReflowClass *) klass;
-
- parent_class = g_type_class_peek_parent (klass);
-
- object_class->set_property = e_minicard_view_set_property;
- object_class->get_property = e_minicard_view_get_property;
- object_class->dispose = e_minicard_view_dispose;
-
- g_object_class_install_property (object_class, PROP_ADAPTER,
- g_param_spec_object ("adapter",
- _("Adapter"),
- /*_( */"XXX blurb" /*)*/,
- E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_BOOK,
- g_param_spec_object ("book",
- _("Book"),
- /*_( */"XXX blurb" /*)*/,
- E_TYPE_BOOK,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_QUERY,
- g_param_spec_string ("query",
- _("Query"),
- /*_( */"XXX blurb" /*)*/,
- NULL,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_EDITABLE,
- g_param_spec_boolean ("editable",
- _("Editable"),
- /*_( */"XXX blurb" /*)*/,
- FALSE,
- G_PARAM_READWRITE));
-
- signals [RIGHT_CLICK] =
- g_signal_new ("right_click",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EMinicardViewClass, right_click),
- NULL, NULL,
- eab_marshal_INT__POINTER,
- G_TYPE_INT, 1, G_TYPE_POINTER);
-
- item_class->event = e_minicard_view_event;
-
- reflow_class->selection_event = e_minicard_view_selection_event;
- /* GnomeCanvasItem method overrides */
-
- /* init the accessibility support for e_minicard_view */
- e_minicard_view_a11y_init();
-}
-
-static void
-e_minicard_view_init (EMinicardView *view)
-{
- view->drag_list = NULL;
- view->adapter = NULL;
- view->canvas_drag_data_get_id = 0;
- view->writable_status_id = 0;
-
- set_empty_message (view);
-}
-
-GType
-e_minicard_view_get_type (void)
-{
- static GType reflow_type = 0;
-
- if (!reflow_type) {
- static const GTypeInfo reflow_info = {
- sizeof (EMinicardViewClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) e_minicard_view_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EMinicardView),
- 0, /* n_preallocs */
- (GInstanceInitFunc) e_minicard_view_init,
- };
-
- reflow_type = g_type_register_static (PARENT_TYPE, "EMinicardView", &reflow_info, 0);
- }
-
- return reflow_type;
-}
-
-void
-e_minicard_view_remove_selection(EMinicardView *view,
- EBookCallback cb,
- gpointer closure)
-{
- ViewCbClosure viewcbclosure;
- viewcbclosure.view = view;
- viewcbclosure.cb = cb;
- viewcbclosure.closure = closure;
-
- e_selection_model_foreach (E_REFLOW (view)->selection,
- do_remove,
- &viewcbclosure);
-}
-
-void
-e_minicard_view_jump_to_letter (EMinicardView *view,
- gunichar letter)
-{
-#if 0
- char uft_str[6 + 1];
-
- utf_str [g_unichar_to_utf8 (letter, utf_str)] = '\0';
- e_reflow_sorted_jump (E_REFLOW_SORTED (view),
- (GCompareFunc) compare_to_utf_str,
- utf_str);
-#endif
-}
-
-typedef struct {
- GList *list;
- EAddressbookReflowAdapter *adapter;
-} ModelAndList;
-
-static void
-add_to_list (int index, gpointer closure)
-{
- ModelAndList *mal = closure;
- mal->list = g_list_prepend (mal->list, e_addressbook_reflow_adapter_get_contact (mal->adapter, index));
-}
-
-GList *
-e_minicard_view_get_card_list (EMinicardView *view)
-{
- ModelAndList mal;
-
- mal.adapter = view->adapter;
- mal.list = NULL;
-
- e_selection_model_foreach (E_REFLOW (view)->selection, add_to_list, &mal);
-
- mal.list = g_list_reverse (mal.list);
- return mal.list;
-}
diff --git a/addressbook/gui/widgets/e-minicard-view.h b/addressbook/gui/widgets/e-minicard-view.h
deleted file mode 100644
index 50964568cf..0000000000
--- a/addressbook/gui/widgets/e-minicard-view.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-minicard-view.h
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-#ifndef __E_MINICARD_VIEW_H__
-#define __E_MINICARD_VIEW_H__
-
-#include "e-minicard.h"
-
-#include <gal/widgets/e-reflow.h>
-#include <gal/widgets/e-selection-model-simple.h>
-#include <libebook/e-book.h>
-#include "e-addressbook-reflow-adapter.h"
-
-G_BEGIN_DECLS
-
-/* EMinicardView - A canvas item container.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- * book EBook RW book to query
- * query string RW query string
- *
- * From EReflowSorted: (you should really know what you're doing if you set these.)
- * compare_func GCompareFunc RW compare function
- * string_func EReflowStringFunc RW string function
- *
- * From EReflow:
- * minimum_width double RW minimum width of the reflow. width >= minimum_width
- * width double R width of the reflow
- * height double RW height of the reflow
- */
-
-#define E_TYPE_MINICARD_VIEW (e_minicard_view_get_type ())
-#define E_MINICARD_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MINICARD_VIEW, EMinicardView))
-#define E_MINICARD_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MINICARD_VIEW, EMinicardViewClass))
-#define E_IS_MINICARD_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MINICARD_VIEW))
-#define E_IS_MINICARD_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MINICARD_VIEW))
-
-
-typedef struct _EMinicardView EMinicardView;
-typedef struct _EMinicardViewClass EMinicardViewClass;
-
-struct _EMinicardView
-{
- EReflow parent;
-
- EAddressbookReflowAdapter *adapter;
-
- /* item specific fields */
-
- GList *drag_list;
-
- guint canvas_drag_data_get_id;
- guint writable_status_id;
-};
-
-struct _EMinicardViewClass
-{
- EReflowClass parent_class;
-
- void (*right_click) (EMinicardView *view, GdkEvent *event);
-};
-
-GType e_minicard_view_get_type (void);
-void e_minicard_view_remove_selection (EMinicardView *view,
- EBookCallback cb,
- gpointer closure);
-void e_minicard_view_jump_to_letter (EMinicardView *view,
- gunichar letter);
-GList *e_minicard_view_get_card_list (EMinicardView *view);
-
-
-G_END_DECLS
-
-#endif /* __E_MINICARD_VIEW_H__ */
diff --git a/addressbook/gui/widgets/e-minicard.c b/addressbook/gui/widgets/e-minicard.c
deleted file mode 100644
index 0abdff7fce..0000000000
--- a/addressbook/gui/widgets/e-minicard.c
+++ /dev/null
@@ -1,1015 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-minicard.c
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-#include <string.h>
-#include <glib.h>
-#include <gtk/gtkdnd.h>
-#include <gtk/gtkmain.h>
-#include <gdk/gdkkeysyms.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
-#include <libgnomecanvas/gnome-canvas-pixbuf.h>
-#include <gal/e-text/e-text.h>
-#include <gal/util/e-util.h>
-#include <gal/widgets/e-canvas-utils.h>
-#include <gal/widgets/e-canvas.h>
-#include <libebook/e-book.h>
-#include "eab-marshal.h"
-#include "eab-gui-util.h"
-#include "e-minicard.h"
-#include "e-minicard-label.h"
-#include "e-minicard-view.h"
-#include "e-contact-editor.h"
-#include <e-util/e-icon-factory.h>
-#include <libebook/e-destination.h>
-
-static void e_minicard_init (EMinicard *card);
-static void e_minicard_class_init (EMinicardClass *klass);
-static void e_minicard_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
-static void e_minicard_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
-static void e_minicard_dispose (GObject *object);
-static void e_minicard_finalize (GObject *object);
-static gboolean e_minicard_event (GnomeCanvasItem *item, GdkEvent *event);
-static void e_minicard_realize (GnomeCanvasItem *item);
-static void e_minicard_unrealize (GnomeCanvasItem *item);
-static void e_minicard_reflow ( GnomeCanvasItem *item, int flags );
-static void e_minicard_style_set (EMinicard *minicard, GtkStyle *previous_style);
-
-static void e_minicard_resize_children( EMinicard *e_minicard );
-static void remodel( EMinicard *e_minicard );
-
-static gint e_minicard_drag_begin (EMinicard *minicard, GdkEvent *event);
-
-static GnomeCanvasGroupClass *parent_class = NULL;
-
-#define d(x)
-
-#define LIST_ICON_NAME "stock_contact-list"
-
-static void
-e_minicard_field_destroy(EMinicardField *field)
-{
- gtk_object_destroy(GTK_OBJECT(field->label));
- g_free(field);
-}
-
-/* The arguments we take */
-enum {
- PROP_0,
- PROP_WIDTH,
- PROP_HEIGHT,
- PROP_HAS_FOCUS,
- PROP_SELECTED,
- PROP_HAS_CURSOR,
- PROP_EDITABLE,
- PROP_CONTACT
-};
-
-enum {
- SELECTED,
- DRAG_BEGIN,
- STYLE_SET,
- LAST_SIGNAL
-};
-
-static guint e_minicard_signals [LAST_SIGNAL] = {0, };
-
-GType
-e_minicard_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (EMinicardClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) e_minicard_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EMinicard),
- 0, /* n_preallocs */
- (GInstanceInitFunc) e_minicard_init,
- };
-
- type = g_type_register_static (gnome_canvas_group_get_type (), "EMinicard", &info, 0);
- }
-
- return type;
-}
-
-static void
-e_minicard_class_init (EMinicardClass *klass)
-{
- GObjectClass *object_class = (GObjectClass*) klass;
- GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) klass;
-
- object_class->set_property = e_minicard_set_property;
- object_class->get_property = e_minicard_get_property;
- object_class->dispose = e_minicard_dispose;
- object_class->finalize = e_minicard_finalize;
-
- klass->style_set = e_minicard_style_set;
-
- parent_class = gtk_type_class (gnome_canvas_group_get_type ());
-
- g_object_class_install_property (object_class, PROP_WIDTH,
- g_param_spec_double ("width",
- _("Width"),
- /*_( */"XXX blurb" /*)*/,
- 0.0, G_MAXDOUBLE, 10.0,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_HEIGHT,
- g_param_spec_double ("height",
- _("Height"),
- /*_( */"XXX blurb" /*)*/,
- 0.0, G_MAXDOUBLE, 10.0,
- G_PARAM_READABLE));
-
- g_object_class_install_property (object_class, PROP_HAS_FOCUS,
- /* XXX should be _enum */
- g_param_spec_int ("has_focus",
- _("Has Focus"),
- /*_( */"XXX blurb" /*)*/,
- E_MINICARD_FOCUS_TYPE_START, E_MINICARD_FOCUS_TYPE_END,
- E_MINICARD_FOCUS_TYPE_START,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_SELECTED,
- g_param_spec_boolean ("selected",
- _("Selected"),
- /*_( */"XXX blurb" /*)*/,
- FALSE,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_HAS_CURSOR,
- g_param_spec_boolean ("has_cursor",
- _("Has Cursor"),
- /*_( */"XXX blurb" /*)*/,
- FALSE,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_EDITABLE,
- g_param_spec_boolean ("editable",
- _("Editable"),
- /*_( */"XXX blurb" /*)*/,
- FALSE,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_CONTACT,
- g_param_spec_object ("contact",
- _("Contact"),
- /*_( */"XXX blurb" /*)*/,
- E_TYPE_CONTACT,
- G_PARAM_READWRITE));
-
- e_minicard_signals [SELECTED] =
- g_signal_new ("selected",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EMinicardClass, selected),
- NULL, NULL,
- eab_marshal_INT__POINTER,
- G_TYPE_INT, 1, G_TYPE_POINTER);
-
- e_minicard_signals [DRAG_BEGIN] =
- g_signal_new ("drag_begin",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EMinicardClass, drag_begin),
- NULL, NULL,
- eab_marshal_INT__POINTER,
- G_TYPE_INT, 1, G_TYPE_POINTER);
-
- e_minicard_signals [STYLE_SET] =
- g_signal_new ("style_set",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EMinicardClass, style_set),
- NULL, NULL,
- eab_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1,
- GTK_TYPE_STYLE);
-
- /* GnomeCanvasItem method overrides */
- item_class->realize = e_minicard_realize;
- item_class->unrealize = e_minicard_unrealize;
- item_class->event = e_minicard_event;
-
- klass->selected = NULL;
-
- /* init the accessibility support for e_minicard */
- e_minicard_a11y_init();
-}
-
-static void
-e_minicard_init (EMinicard *minicard)
-{
- minicard->rect = NULL;
- minicard->fields = NULL;
- minicard->width = 10;
- minicard->height = 10;
- minicard->has_focus = FALSE;
- minicard->selected = FALSE;
- minicard->editable = FALSE;
- minicard->has_cursor = FALSE;
-
- minicard->contact = NULL;
-
- minicard->list_icon_pixbuf = e_icon_factory_get_icon (LIST_ICON_NAME, E_ICON_SIZE_MENU);
- minicard->list_icon_size = gdk_pixbuf_get_height (minicard->list_icon_pixbuf);
-
- minicard->editor = NULL;
-
- minicard->changed = FALSE;
-
- e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(minicard), e_minicard_reflow);
-}
-
-static void
-set_selected (EMinicard *minicard, gboolean selected)
-{
- GtkWidget *canvas = GTK_WIDGET(GNOME_CANVAS_ITEM(minicard)->canvas);
- if (selected) {
- gnome_canvas_item_set (minicard->rect,
- "outline_color_gdk", &canvas->style->bg[GTK_STATE_ACTIVE],
- NULL);
- gnome_canvas_item_set (minicard->header_rect,
- "fill_color_gdk", &canvas->style->bg[GTK_STATE_SELECTED],
- NULL);
- gnome_canvas_item_set (minicard->header_text,
- "fill_color_gdk", &canvas->style->text[GTK_STATE_SELECTED],
- NULL);
- } else {
- gnome_canvas_item_set (minicard->rect,
- "outline_color", NULL,
- NULL);
- gnome_canvas_item_set (minicard->header_rect,
- "fill_color_gdk", &canvas->style->bg[GTK_STATE_NORMAL],
- NULL);
- gnome_canvas_item_set (minicard->header_text,
- "fill_color_gdk", &canvas->style->text[GTK_STATE_NORMAL],
- NULL);
- }
- minicard->selected = selected;
-}
-
-static void
-set_has_cursor (EMinicard *minicard, gboolean has_cursor)
-{
- if (!minicard->has_focus && has_cursor)
- e_canvas_item_grab_focus(GNOME_CANVAS_ITEM (minicard), FALSE);
- minicard->has_cursor = has_cursor;
-}
-
-
-static void
-e_minicard_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
- GnomeCanvasItem *item;
- EMinicard *e_minicard;
- EContact *contact;
- GList *l;
-
- item = GNOME_CANVAS_ITEM (object);
- e_minicard = E_MINICARD (object);
-
- switch (prop_id){
- case PROP_WIDTH:
- if (e_minicard->width != g_value_get_double (value)) {
- e_minicard->width = g_value_get_double (value);
- e_minicard_resize_children(e_minicard);
- if ( GTK_OBJECT_FLAGS( e_minicard ) & GNOME_CANVAS_ITEM_REALIZED )
- e_canvas_item_request_reflow(item);
- }
- break;
- case PROP_HAS_FOCUS:
- if (e_minicard->fields) {
- if ( g_value_get_int(value) == E_FOCUS_START ||
- g_value_get_int(value) == E_FOCUS_CURRENT) {
- gnome_canvas_item_set(E_MINICARD_FIELD(e_minicard->fields->data)->label,
- "has_focus", g_value_get_int (value),
- NULL);
- } else if ( g_value_get_int (value) == E_FOCUS_END ) {
- gnome_canvas_item_set(E_MINICARD_FIELD(g_list_last(e_minicard->fields)->data)->label,
- "has_focus", g_value_get_int (value),
- NULL);
- }
- }
- else {
- if (!e_minicard->has_focus)
- e_canvas_item_grab_focus(item, FALSE);
- }
- break;
- case PROP_SELECTED:
- if (e_minicard->selected != g_value_get_boolean (value))
- set_selected (e_minicard, g_value_get_boolean (value));
- break;
- case PROP_EDITABLE:
- e_minicard->editable = g_value_get_boolean (value);
- for (l = e_minicard->fields; l; l = l->next) {
- g_object_set (E_MINICARD_FIELD (l->data)->label,
- "editable", FALSE /* e_minicard->editable */,
- NULL);
- }
- break;
- case PROP_HAS_CURSOR:
- d(g_print("%s: PROP_HAS_CURSOR\n", G_GNUC_FUNCTION));
- if (e_minicard->has_cursor != g_value_get_boolean (value))
- set_has_cursor (e_minicard, g_value_get_boolean (value));
- break;
- case PROP_CONTACT:
- contact = E_CONTACT (g_value_get_object (value));
- if (contact)
- g_object_ref (contact);
-
- if (e_minicard->contact)
- g_object_unref (e_minicard->contact);
-
- e_minicard->contact = contact;
-
- remodel(e_minicard);
- e_canvas_item_request_reflow(item);
- e_minicard->changed = FALSE;
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-e_minicard_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
- EMinicard *e_minicard;
-
- e_minicard = E_MINICARD (object);
-
- switch (prop_id) {
- case PROP_WIDTH:
- g_value_set_double (value, e_minicard->width);
- break;
- case PROP_HEIGHT:
- g_value_set_double (value, e_minicard->height);
- break;
- case PROP_HAS_FOCUS:
- g_value_set_int (value, e_minicard->has_focus ? E_FOCUS_CURRENT : E_FOCUS_NONE);
- break;
- case PROP_SELECTED:
- g_value_set_boolean (value, e_minicard->selected);
- break;
- case PROP_HAS_CURSOR:
- g_value_set_boolean (value, e_minicard->has_cursor);
- break;
- case PROP_EDITABLE:
- g_value_set_boolean (value, e_minicard->editable);
- break;
- case PROP_CONTACT:
- g_value_set_object (value, e_minicard->contact);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-e_minicard_dispose (GObject *object)
-{
- EMinicard *e_minicard;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (E_IS_MINICARD (object));
-
- e_minicard = E_MINICARD (object);
-
- if (e_minicard->fields) {
- g_list_foreach(e_minicard->fields, (GFunc) e_minicard_field_destroy, NULL);
- g_list_free(e_minicard->fields);
- e_minicard->fields = NULL;
- }
-
- if (e_minicard->list_icon_pixbuf) {
- gdk_pixbuf_unref (e_minicard->list_icon_pixbuf);
- e_minicard->list_icon_pixbuf = NULL;
- }
-
- if (G_OBJECT_CLASS (parent_class)->dispose)
- (* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-
-
-static void
-e_minicard_finalize (GObject *object)
-{
- EMinicard *e_minicard;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (E_IS_MINICARD (object));
-
- e_minicard = E_MINICARD (object);
-
- if (e_minicard->contact) {
- g_object_unref (e_minicard->contact);
- e_minicard->contact = NULL;
- }
-
- if (e_minicard->list_icon_pixbuf) {
- g_object_unref (e_minicard->list_icon_pixbuf);
- e_minicard->list_icon_pixbuf = NULL;
- }
-
- if (G_OBJECT_CLASS (parent_class)->finalize)
- (* G_OBJECT_CLASS (parent_class)->finalize) (object);
-}
-
-static void
-e_minicard_style_set (EMinicard *minicard, GtkStyle *previous_style)
-{
- if ( (GTK_OBJECT_FLAGS( minicard ) & GNOME_CANVAS_ITEM_REALIZED) )
- set_selected (minicard, minicard->selected);
-}
-
-static void
-e_minicard_realize (GnomeCanvasItem *item)
-{
- EMinicard *e_minicard;
- GnomeCanvasGroup *group;
- GtkWidget *canvas;
-
- e_minicard = E_MINICARD (item);
- group = GNOME_CANVAS_GROUP( item );
- canvas = GTK_WIDGET (GNOME_CANVAS_ITEM (item)->canvas);
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->realize)
- (* GNOME_CANVAS_ITEM_CLASS(parent_class)->realize) (item);
-
- e_minicard->rect =
- gnome_canvas_item_new( group,
- gnome_canvas_rect_get_type(),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) MAX (e_minicard->width - 1, 0),
- "y2", (double) MAX (e_minicard->height - 1, 0),
- "outline_color", NULL,
- NULL );
-
- e_minicard->header_rect =
- gnome_canvas_item_new( group,
- gnome_canvas_rect_get_type(),
- "x1", (double) 2,
- "y1", (double) 2,
- "x2", (double) MAX (e_minicard->width - 3, 0),
- "y2", (double) MAX (e_minicard->height - 3, 0),
- "fill_color_gdk", &canvas->style->bg[GTK_STATE_NORMAL],
- NULL );
-
- e_minicard->header_text =
- gnome_canvas_item_new( group,
- e_text_get_type(),
- "anchor", GTK_ANCHOR_NW,
- "width", (double) MAX( e_minicard->width - 12, 0 ),
- "clip", TRUE,
- "use_ellipsis", TRUE,
- "fill_color_gdk", &canvas->style->fg[GTK_STATE_NORMAL],
- "text", "",
- "draw_background", FALSE,
- NULL );
-
- e_canvas_item_move_absolute(e_minicard->header_text, 6, 6);
-
- e_minicard->list_icon =
- gnome_canvas_item_new ( group,
- gnome_canvas_pixbuf_get_type(),
- "pixbuf", e_minicard->list_icon_pixbuf,
- NULL);
-
- set_selected (e_minicard, e_minicard->selected);
-
- remodel(e_minicard);
- e_canvas_item_request_reflow(item);
-}
-
-static void
-e_minicard_unrealize (GnomeCanvasItem *item)
-{
- EMinicard *e_minicard;
-
- e_minicard = E_MINICARD (item);
-
- if (GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize)
- (* GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize) (item);
-}
-
-/* Callback used when the contact editor is closed */
-static void
-editor_closed_cb (GtkObject *editor, gpointer data)
-{
- EMinicard *minicard = data;
- g_object_unref (editor);
- minicard->editor = NULL;
-}
-
-gboolean
-e_minicard_activate_editor(EMinicard *minicard)
-{
- GnomeCanvasItem *item = NULL;
- item = minicard;
-
- if (minicard->editor) {
- eab_editor_raise (minicard->editor);
- }
- else {
- EBook *book = NULL;
- if (E_IS_MINICARD_VIEW(item->parent)) {
- g_object_get(item->parent, "book", &book, NULL);
- }
-
- if (book != NULL) {
- if (e_contact_get (minicard->contact, E_CONTACT_IS_LIST)) {
- EContactListEditor *editor = eab_show_contact_list_editor (book, minicard->contact,
- FALSE, e_book_is_writable (book));
- minicard->editor = EAB_EDITOR (editor);
- }
- else {
- EContactEditor *editor = eab_show_contact_editor (book, minicard->contact,
- FALSE, e_book_is_writable (book));
- minicard->editor = EAB_EDITOR (editor);
- }
-
- g_object_ref (minicard->editor);
- g_signal_connect (minicard->editor, "editor_closed",
- G_CALLBACK (editor_closed_cb), minicard);
-
- g_object_unref (book);
- }
- }
-
- return TRUE;
-}
-
-static gboolean
-e_minicard_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- EMinicard *e_minicard;
- GtkWidget *canvas;
-
- e_minicard = E_MINICARD (item);
- canvas = GTK_WIDGET (GNOME_CANVAS_ITEM (item)->canvas);
-
- switch( event->type ) {
- case GDK_FOCUS_CHANGE:
- {
- GdkEventFocus *focus_event = (GdkEventFocus *) event;
- d(g_print("%s: GDK_FOCUS_CHANGE: %s\n", G_GNUC_FUNCTION, focus_event->in?"in":"out"));
- if (focus_event->in) {
- /* Chris: When EMinicard gets the cursor, if it doesn't have the focus, it should take it. */
- e_minicard->has_focus = TRUE;
- if (!e_minicard->selected) {
- e_minicard_selected(e_minicard, event);
- }
- }
- else {
- e_minicard->has_focus = FALSE;
- }
- }
- break;
- case GDK_BUTTON_PRESS: {
- if (1 <= event->button.button && event->button.button <= 2) {
- int ret_val = e_minicard_selected(e_minicard, event);
- GdkEventMask mask = ((1 << (4 + event->button.button)) |
- GDK_POINTER_MOTION_MASK |
- GDK_BUTTON_PRESS_MASK |
- GDK_BUTTON_RELEASE_MASK);
-
- e_canvas_item_grab_focus(item, TRUE);
-
- if (gnome_canvas_item_grab (GNOME_CANVAS_ITEM (e_minicard),
- mask, NULL, event->button.time)) {
- return FALSE;
- }
- gtk_grab_add (GTK_WIDGET (GNOME_CANVAS_ITEM (e_minicard)->canvas));
- e_minicard->button_x = event->button.x;
- e_minicard->button_y = event->button.y;
- e_minicard->drag_button = event->button.button;
- e_minicard->drag_button_down = TRUE;
- return ret_val;
- } else if (event->button.button == 3) {
- int ret_val = e_minicard_selected(e_minicard, event);
- if (ret_val != 0)
- return ret_val;
- }
- break;
- }
- case GDK_BUTTON_RELEASE:
- e_minicard_selected(e_minicard, event);
- if (e_minicard->drag_button == event->button.button) {
- e_minicard->drag_button = 0;
- e_minicard->drag_button_down = FALSE;
- e_minicard->button_x = -1;
- e_minicard->button_y = -1;
-
- if (GTK_WIDGET_HAS_GRAB (GNOME_CANVAS_ITEM (e_minicard)->canvas)) {
- gtk_grab_remove (GTK_WIDGET (GNOME_CANVAS_ITEM (e_minicard)->canvas));
- gnome_canvas_item_ungrab (GNOME_CANVAS_ITEM (e_minicard), event->button.time);
- }
- }
- break;
- case GDK_MOTION_NOTIFY:
- if (e_minicard->drag_button_down && event->motion.state & GDK_BUTTON1_MASK) {
- if (MAX (abs (e_minicard->button_x - event->motion.x),
- abs (e_minicard->button_y - event->motion.y)) > 3) {
- gint ret_val;
-
- ret_val = e_minicard_drag_begin(e_minicard, event);
-
- e_minicard->drag_button_down = FALSE;
-
- return ret_val;
- }
- }
- break;
- case GDK_2BUTTON_PRESS:
- if (event->button.button == 1 && E_IS_MINICARD_VIEW (item->parent)) {
- return e_minicard_activate_editor (e_minicard);
- }
- break;
- case GDK_KEY_PRESS:
- if (event->key.keyval == GDK_Tab ||
- event->key.keyval == GDK_KP_Tab ||
- event->key.keyval == GDK_ISO_Left_Tab) {
-
- EMinicardView *view = E_MINICARD_VIEW (item->parent);
- EReflow *reflow = E_REFLOW(view);
-
- if (reflow == NULL) {
- return FALSE;
- }
-
- if (event->key.state & GDK_SHIFT_MASK) {
- if (event->key.state & GDK_CONTROL_MASK) {
- return FALSE;
- }
- else {
- int row_count = e_selection_model_row_count (reflow->selection);
- int model_index = e_selection_model_cursor_row (reflow->selection);
- int view_index = e_sorter_model_to_sorted (reflow->selection->sorter, model_index);
-
- if (view_index == 0)
- view_index = row_count-1;
- else
- view_index--;
-
- model_index = e_sorter_sorted_to_model (E_SORTER (reflow->sorter), view_index);
- e_canvas_item_grab_focus (reflow->items[model_index], FALSE);
- return TRUE;
- }
- }
- else {
- if (event->key.state & GDK_CONTROL_MASK) {
- return FALSE;
- }
- else {
- int row_count = e_selection_model_row_count(reflow->selection);
- int model_index = e_selection_model_cursor_row (reflow->selection);
- int view_index = e_sorter_model_to_sorted (reflow->selection->sorter, model_index);
-
- if (view_index == row_count-1)
- view_index = 0;
- else
- view_index++;
-
- model_index = e_sorter_sorted_to_model (E_SORTER (reflow->sorter), view_index);
- e_canvas_item_grab_focus(reflow->items[model_index], FALSE);
- return TRUE;
- }
- }
- }
- else if (event->key.keyval == GDK_Return ||
- event->key.keyval == GDK_KP_Enter) {
- return e_minicard_activate_editor (e_minicard);
- }
- break;
- default:
- break;
- }
-
- if (GNOME_CANVAS_ITEM_CLASS( parent_class )->event)
- return (* GNOME_CANVAS_ITEM_CLASS( parent_class )->event) (item, event);
- else
- return 0;
-}
-
-static void
-e_minicard_resize_children( EMinicard *e_minicard )
-{
- GList *list;
- gboolean is_list = GPOINTER_TO_INT (e_contact_get (e_minicard->contact, E_CONTACT_IS_LIST));
-
- if (e_minicard->header_text) {
- gnome_canvas_item_set( e_minicard->header_text,
- "width", ((double) e_minicard->width - 12
- - (is_list ? e_minicard->list_icon_size : 0.0)),
- NULL );
- }
- if (e_minicard->list_icon) {
- e_canvas_item_move_absolute(e_minicard->list_icon,
- e_minicard->width - e_minicard->list_icon_size - 3,
- 3);
- }
- for ( list = e_minicard->fields; list; list = g_list_next( list ) ) {
- gnome_canvas_item_set( E_MINICARD_FIELD( list->data )->label,
- "width", (double) e_minicard->width - 4.0,
- NULL );
- }
-}
-
-static void
-add_field (EMinicard *e_minicard, EContactField field, gdouble left_width)
-{
- GnomeCanvasItem *new_item;
- GnomeCanvasGroup *group;
- EMinicardField *minicard_field;
- char *name;
- char *string;
-
- group = GNOME_CANVAS_GROUP( e_minicard );
-
- name = g_strdup_printf("%s:", e_contact_pretty_name (field));
- string = e_contact_get (e_minicard->contact, field);
-
- new_item = e_minicard_label_new(group);
- gnome_canvas_item_set( new_item,
- "width", e_minicard->width - 4.0,
- "fieldname", name,
- "field", string,
- "max_field_name_length", left_width,
- "editable", FALSE /* e_minicard->editable */,
- NULL );
-#if notyet
- g_object_set(E_MINICARD_LABEL(new_item)->field,
- "allow_newlines", e_card_simple_get_allow_newlines (e_minicard->contact, field),
- NULL);
-#endif
- g_object_set_data(G_OBJECT (E_MINICARD_LABEL(new_item)->field),
- "EMinicard:field",
- GINT_TO_POINTER(field));
-
- minicard_field = g_new(EMinicardField, 1);
- minicard_field->field = field;
- minicard_field->label = new_item;
-
- e_minicard->fields = g_list_append( e_minicard->fields, minicard_field);
- e_canvas_item_move_absolute(new_item, 2, e_minicard->height);
- g_free(name);
- g_free(string);
-}
-
-static int
-get_left_width(EMinicard *e_minicard)
-{
- gchar *name;
- EContactField field;
- int width = -1;
- PangoLayout *layout;
-
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (GNOME_CANVAS_ITEM (e_minicard)->canvas), "");
- for(field = E_CONTACT_FULL_NAME; field != E_CONTACT_LAST_SIMPLE_STRING; field++) {
- int this_width;
-
- if (field == E_CONTACT_FAMILY_NAME || field == E_CONTACT_GIVEN_NAME)
- continue;
-
- name = g_strdup_printf("%s:", e_contact_pretty_name (field));
- pango_layout_set_text (layout, name, -1);
- pango_layout_get_pixel_size (layout, &this_width, NULL);
- if (width < this_width)
- width = this_width;
- g_free(name);
- }
- g_object_unref (layout);
- return width;
-}
-
-static void
-remodel( EMinicard *e_minicard )
-{
- int count = 0;
- if ( !(GTK_OBJECT_FLAGS( e_minicard ) & GNOME_CANVAS_ITEM_REALIZED) )
- return;
- if (e_minicard->contact) {
- EContactField field;
- GList *list;
- char *file_as;
- int left_width = -1;
-
- if (e_minicard->header_text) {
- file_as = e_contact_get (e_minicard->contact, E_CONTACT_FILE_AS);
- gnome_canvas_item_set (e_minicard->header_text,
- "text", file_as ? file_as : "",
- NULL );
- g_free(file_as);
- }
-
- if (e_minicard->contact && e_contact_get (e_minicard->contact, E_CONTACT_IS_LIST))
- gnome_canvas_item_show (e_minicard->list_icon);
- else
- gnome_canvas_item_hide (e_minicard->list_icon);
-
- list = e_minicard->fields;
- e_minicard->fields = NULL;
-
- for(field = E_CONTACT_FULL_NAME; field != E_CONTACT_LAST_SIMPLE_STRING && count < 5; field++) {
- EMinicardField *minicard_field = NULL;
-
- if (field == E_CONTACT_FAMILY_NAME || field == E_CONTACT_GIVEN_NAME)
- continue;
-
- if (list)
- minicard_field = list->data;
- if (minicard_field && minicard_field->field == field) {
- GList *this_list = list;
- char *string;
-
- string = e_contact_get(e_minicard->contact, field);
- if (string && *string) {
- e_minicard->fields = g_list_append(e_minicard->fields, minicard_field);
- g_object_set(minicard_field->label,
- "field", string,
- NULL);
- count ++;
- } else {
- e_minicard_field_destroy(minicard_field);
- }
- list = g_list_remove_link(list, this_list);
- g_list_free_1(this_list);
- g_free(string);
- } else {
- char *string;
- if (left_width == -1) {
- left_width = get_left_width(e_minicard);
- }
-
- string = e_contact_get(e_minicard->contact, field);
- if (string && *string) {
- add_field(e_minicard, field, left_width);
- count++;
- }
- g_free(string);
- }
- }
-
- g_list_foreach(list, (GFunc) e_minicard_field_destroy, NULL);
- g_list_free(list);
- }
-}
-
-static void
-e_minicard_reflow( GnomeCanvasItem *item, int flags )
-{
- EMinicard *e_minicard = E_MINICARD(item);
- if ( GTK_OBJECT_FLAGS( e_minicard ) & GNOME_CANVAS_ITEM_REALIZED ) {
- GList *list;
- gdouble text_height;
- gint old_height;
-
- old_height = e_minicard->height;
-
- g_object_get( e_minicard->header_text,
- "text_height", &text_height,
- NULL );
-
- e_minicard->height = text_height + 10.0;
-
- gnome_canvas_item_set( e_minicard->header_rect,
- "y2", text_height + 9.0,
- NULL );
-
- for(list = e_minicard->fields; list; list = g_list_next(list)) {
- EMinicardField *field = E_MINICARD_FIELD(list->data);
- GnomeCanvasItem *item = field->label;
- g_object_get (item,
- "height", &text_height,
- NULL);
- e_canvas_item_move_absolute(item, 2, e_minicard->height);
- e_minicard->height += text_height;
- }
- e_minicard->height += 2;
-
- gnome_canvas_item_set( e_minicard->rect,
- "x2", (double) e_minicard->width - 1.0,
- "y2", (double) e_minicard->height - 1.0,
- NULL );
- gnome_canvas_item_set( e_minicard->header_rect,
- "x2", (double) e_minicard->width - 3.0,
- NULL );
-
- if (old_height != e_minicard->height)
- e_canvas_item_request_parent_reflow(item);
- }
-}
-
-const char *
-e_minicard_get_card_id (EMinicard *minicard)
-{
- g_return_val_if_fail(minicard != NULL, NULL);
- g_return_val_if_fail(E_IS_MINICARD(minicard), NULL);
-
- if (minicard->contact) {
- return e_contact_get_const (minicard->contact, E_CONTACT_UID);
- } else {
- return "";
- }
-}
-
-int
-e_minicard_compare (EMinicard *minicard1, EMinicard *minicard2)
-{
- int cmp = 0;
-
- g_return_val_if_fail(minicard1 != NULL, 0);
- g_return_val_if_fail(E_IS_MINICARD(minicard1), 0);
- g_return_val_if_fail(minicard2 != NULL, 0);
- g_return_val_if_fail(E_IS_MINICARD(minicard2), 0);
-
- if (minicard1->contact && minicard2->contact) {
- char *file_as1, *file_as2;
- g_object_get(minicard1->contact,
- "file_as", &file_as1,
- NULL);
- g_object_get(minicard2->contact,
- "file_as", &file_as2,
- NULL);
-
- if (file_as1 && file_as2)
- cmp = g_utf8_collate(file_as1, file_as2);
- else if (file_as1)
- cmp = -1;
- else if (file_as2)
- cmp = 1;
- else
- cmp = strcmp(e_minicard_get_card_id(minicard1), e_minicard_get_card_id(minicard2));
-
- g_free (file_as1);
- g_free (file_as2);
- }
-
- return cmp;
-}
-
-int
-e_minicard_selected (EMinicard *minicard, GdkEvent *event)
-{
- gint ret_val = 0;
- GnomeCanvasItem *item = GNOME_CANVAS_ITEM (minicard);
- if (item->parent) {
- guint signal_id = g_signal_lookup ("selection_event", G_OBJECT_TYPE (item->parent));
- /* We should probably check the signature here, but I
- * don't think it's worth the time required to code
- * it.
- */
- if (signal_id != 0) {
- g_signal_emit(item->parent,
- signal_id, 0,
- item, event, &ret_val);
- }
- }
- return ret_val;
-}
-
-static gint
-e_minicard_drag_begin (EMinicard *minicard, GdkEvent *event)
-{
- gint ret_val = 0;
- GnomeCanvasItem *parent;
- g_signal_emit (minicard,
- e_minicard_signals[DRAG_BEGIN], 0,
- event, &ret_val);
-
- parent = GNOME_CANVAS_ITEM (minicard)->parent;
- if (parent && E_IS_REFLOW (parent)) {
- E_REFLOW (parent)->maybe_in_drag = FALSE;
- }
- return ret_val;
-}
diff --git a/addressbook/gui/widgets/e-minicard.h b/addressbook/gui/widgets/e-minicard.h
deleted file mode 100644
index 3ce1754edd..0000000000
--- a/addressbook/gui/widgets/e-minicard.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-minicard.h
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-#ifndef __E_MINICARD_H__
-#define __E_MINICARD_H__
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include "addressbook/gui/contact-editor/eab-editor.h"
-#include <libgnomecanvas/gnome-canvas.h>
-#include <libebook/e-contact.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* EMinicard - A small card displaying information about a contact.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- * width double RW width of the card
- * height double R height of the card
- * card ECard* RW Pointer to the ECard
- */
-
-#define E_TYPE_MINICARD (e_minicard_get_type ())
-#define E_MINICARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MINICARD, EMinicard))
-#define E_MINICARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MINICARD, EMinicardClass))
-#define E_IS_MINICARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MINICARD))
-#define E_IS_MINICARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MINICARD))
-
-
-typedef struct _EMinicard EMinicard;
-typedef struct _EMinicardClass EMinicardClass;
-typedef enum _EMinicardFocusType EMinicardFocusType;
-
-enum _EMinicardFocusType {
- E_MINICARD_FOCUS_TYPE_START,
- E_MINICARD_FOCUS_TYPE_END
-};
-
-struct _EMinicard
-{
- GnomeCanvasGroup parent;
-
- /* item specific fields */
- EContact *contact;
-
- GnomeCanvasItem *rect;
- GnomeCanvasItem *header_rect;
- GnomeCanvasItem *header_text;
- GnomeCanvasItem *list_icon;
-
- GdkPixbuf *list_icon_pixbuf;
- double list_icon_size;
-
- EABEditor *editor;
-
- GList *fields; /* Of type EMinicardField */
- guint needs_remodeling : 1;
-
- guint changed : 1;
-
- guint selected : 1;
- guint has_cursor : 1;
-
- guint has_focus : 1;
-
- guint editable : 1;
-
- guint drag_button_down : 1;
- gint drag_button;
-
- gint button_x;
- gint button_y;
-
- double width;
- double height;
-};
-
-struct _EMinicardClass
-{
- GnomeCanvasGroupClass parent_class;
-
- gint (* selected) (EMinicard *minicard, GdkEvent *event);
- gint (* drag_begin) (EMinicard *minicard, GdkEvent *event);
-
- void (* style_set) (EMinicard *minicard, GtkStyle *previous_style);
-};
-
-typedef struct _EMinicardField EMinicardField;
-
-struct _EMinicardField {
- EContactField field;
- GnomeCanvasItem *label;
-};
-
-#define E_MINICARD_FIELD(field) ((EMinicardField *)(field))
-
-GType e_minicard_get_type (void);
-const char *e_minicard_get_card_id (EMinicard *minicard);
-int e_minicard_compare (EMinicard *minicard1,
- EMinicard *minicard2);
-
-int e_minicard_selected (EMinicard *minicard,
- GdkEvent *event);
-gboolean e_minicard_activate_editor (EMinicard *minicard);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_MINICARD_H__ */
diff --git a/addressbook/gui/widgets/eab-config.c b/addressbook/gui/widgets/eab-config.c
deleted file mode 100644
index 0670b5d5e0..0000000000
--- a/addressbook/gui/widgets/eab-config.c
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Authors: David Trowbridge <trowbrds@cs.colorado.edu>
- *
- * Copyright (C) 2004 Novell, Inc (www.novell.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "eab-config.h"
-
-static GObjectClass *ecp_parent_class;
-static GObjectClass *ecph_parent_class;
-
-struct _EABConfigPrivate {
- guint source_changed_id;
-};
-
-#define _PRIVATE(o) (g_type_instance_get_private((GTypeInstance *)o, eab_config_get_type()))
-
-static void
-ecp_init (GObject *o)
-{
-}
-
-static void
-ecp_target_free (EConfig *ec, EConfigTarget *t)
-{
- struct _EABConfigPrivate *p = _PRIVATE(ec);
-
- if (ec->target == t) {
- switch (t->type) {
- case EAB_CONFIG_TARGET_SOURCE: {
- EABConfigTargetSource *s = (EABConfigTargetSource *)t;
-
- if (p->source_changed_id) {
- g_signal_handler_disconnect(s->source, p->source_changed_id);
- p->source_changed_id = 0;
- }
- break; }
- }
- }
-
- switch (t->type) {
- case EAB_CONFIG_TARGET_SOURCE: {
- EABConfigTargetSource *s = (EABConfigTargetSource *)t;
-
- if (s->source)
- g_object_unref (s->source);
- break; }
- }
-
- ((EConfigClass *) ecp_parent_class)->target_free (ec, t);
-}
-
-static void
-ecp_source_changed(struct _ESource *source, EConfig *ec)
-{
- e_config_target_changed(ec, E_CONFIG_TARGET_CHANGED_STATE);
-}
-
-static void
-ecp_set_target (EConfig *ec, EConfigTarget *t)
-{
- struct _EABConfigPrivate *p = _PRIVATE(ec);
-
- ((EConfigClass *)ecp_parent_class)->set_target(ec, t);
-
- if (t) {
- switch (t->type) {
- case EAB_CONFIG_TARGET_SOURCE: {
- EABConfigTargetSource *s = (EABConfigTargetSource *)t;
-
- p->source_changed_id = g_signal_connect(s->source, "changed", G_CALLBACK(ecp_source_changed), ec);
- break; }
- }
- }
-}
-
-static void
-ecp_class_init (GObjectClass *klass)
-{
- ((EConfigClass *)klass)->set_target = ecp_set_target;
- ((EConfigClass *)klass)->target_free = ecp_target_free;
-
- g_type_class_add_private(klass, sizeof(struct _EABConfigPrivate));
-}
-
-GType
-eab_config_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (EABConfigClass),
- NULL, NULL,
- (GClassInitFunc) ecp_class_init,
- NULL, NULL,
- sizeof (EABConfig), 0,
- (GInstanceInitFunc) ecp_init
- };
-
- ecp_parent_class = g_type_class_ref (e_config_get_type ());
- type = g_type_register_static (e_config_get_type (), "EABConfig", &info, 0);
- }
-
- return type;
-}
-
-EABConfig *
-eab_config_new (int type, const char *menuid)
-{
- EABConfig *ecp = g_object_new (eab_config_get_type(), 0);
- e_config_construct (&ecp->config, type, menuid);
- return ecp;
-}
-
-EABConfigTargetSource *
-eab_config_target_new_source (EABConfig *ecp, struct _ESource *source)
-{
- EABConfigTargetSource *t = e_config_target_new (&ecp->config, EAB_CONFIG_TARGET_SOURCE, sizeof (*t));
-
- t->source = source;
- g_object_ref (source);
-
- return t;
-}
-
-static const EConfigHookTargetMask ecph_no_masks[] = {
- { 0 }
-};
-
-static const EConfigHookTargetMap ecph_targets[] = {
- { "source", EAB_CONFIG_TARGET_SOURCE, ecph_no_masks },
- { 0 },
-};
-
-static void
-ecph_class_init (EPluginHookClass *klass)
-{
- int i;
-
- klass->id = "org.gnome.evolution.addressbook.config:1.0";
-
- for (i = 0; ecph_targets[i].type; i++) {
- e_config_hook_class_add_target_map ((EConfigHookClass *)klass, &ecph_targets[i]);
- }
-
- ((EConfigHookClass *)klass)->config_class = g_type_class_ref (eab_config_get_type ());
-}
-
-GType
-eab_config_hook_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (EABConfigHookClass),
- NULL, NULL,
- (GClassInitFunc) ecph_class_init,
- NULL, NULL,
- sizeof (EABConfigHook), 0,
- (GInstanceInitFunc) NULL
- };
-
- ecph_parent_class = g_type_class_ref (e_config_hook_get_type ());
- type = g_type_register_static (e_config_hook_get_type (), "EABConfigHook", &info, 0);
- }
-
- return type;
-}
diff --git a/addressbook/gui/widgets/eab-config.h b/addressbook/gui/widgets/eab-config.h
deleted file mode 100644
index 93d26abf1c..0000000000
--- a/addressbook/gui/widgets/eab-config.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Authors: David Trowbridge <trowbrds@cs.colorado.edu>
- *
- * Copyright (C) 2004 Novell, Inc (www.novell.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifndef __EAB_CONFIG_H__
-#define __EAB_CONFIG_H__
-
-#include <glib-object.h>
-
-#include "e-util/e-config.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif
-
-typedef struct _EABConfig EABConfig;
-typedef struct _EABConfigClass EABConfigClass;
-
-struct _EABConfig {
- EConfig config;
-};
-
-struct _EABConfigClass {
- EConfigClass config_class;
-};
-
-enum _eab_config_target_t {
- EAB_CONFIG_TARGET_SOURCE,
-};
-
-typedef struct _EABConfigTargetSource EABConfigTargetSource;
-
-struct _EABConfigTargetSource {
- EConfigTarget target;
-
- struct _ESource *source;
-};
-
-typedef struct _EConfigItem EABConfigItem;
-
-GType eab_config_get_type (void);
-EABConfig *eab_config_new (int type, const char *menuid);
-
-EABConfigTargetSource *eab_config_target_new_source (EABConfig *ecp, struct _ESource *source);
-
-/* ********************************************************************** */
-
-typedef struct _EABConfigHook EABConfigHook;
-typedef struct _EABConfigHookClass EABConfigHookClass;
-
-struct _EABConfigHook {
- EConfigHook hook;
-};
-
-struct _EABConfigHookClass {
- EConfigHookClass hook_class;
-};
-
-GType eab_config_hook_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/addressbook/gui/widgets/eab-contact-display.c b/addressbook/gui/widgets/eab-contact-display.c
deleted file mode 100644
index 145b755781..0000000000
--- a/addressbook/gui/widgets/eab-contact-display.c
+++ /dev/null
@@ -1,693 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Chris Toshok <toshok@ximian.com>
- *
- * Copyright (C) 2003 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "eab-contact-display.h"
-
-#include "eab-gui-util.h"
-#include "e-util/e-html-utils.h"
-#include "e-util/e-icon-factory.h"
-
-#include <string.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnome/gnome-url.h>
-#include <gtkhtml/gtkhtml.h>
-#include <gtkhtml/gtkhtml-stream.h>
-
-#define HANDLE_MAILTO_INTERNALLY 1
-
-#define PARENT_TYPE (GTK_TYPE_HTML)
-
-struct _EABContactDisplayPrivate {
- EContact *contact;
-};
-
-
-#define HTML_HEADER "<!doctype html public \"-//W3C//DTD HTML 4.0 TRANSITIONAL//EN\">\n<html>\n" \
- "<head>\n<meta name=\"generator\" content=\"Evolution Addressbook Component\">\n</head>\n"
-
-#define HEADER_COLOR "#7f7f7f"
-#define IMAGE_COL_WIDTH "20"
-#define CONTACT_LIST_ICON "stock_contact-list"
-#define AIM_ICON "im-aim"
-#define GROUPWISE_ICON "im-nov"
-#define ICQ_ICON "im-icq"
-#define JABBER_ICON "im-jabber"
-#define MSN_ICON "im-msn"
-#define YAHOO_ICON "im-yahoo"
-#define VIDEOCONF_ICON "stock_video-conferencing"
-
-#define MAX_COMPACT_IMAGE_DIMENSION 48
-
-static void
-on_url_requested (GtkHTML *html, const char *url, GtkHTMLStream *handle,
- EABContactDisplay *display)
-{
- if (!strcmp (url, "internal-contact-photo:")) {
- EContactPhoto *photo;
-
- photo = e_contact_get (display->priv->contact, E_CONTACT_PHOTO);
- if (!photo)
- photo = e_contact_get (display->priv->contact, E_CONTACT_LOGO);
-
- gtk_html_stream_write (handle, photo->data, photo->length);
-
- gtk_html_end (html, handle, GTK_HTML_STREAM_OK);
- }
- else if (!strncmp (url, "evo-icon:", strlen ("evo-icon:"))) {
- gchar *data;
- gsize data_length;
- gchar *filename;
-
- filename = e_icon_factory_get_icon_filename (url + strlen ("evo-icon:"), E_ICON_SIZE_MENU);
- if (g_file_get_contents (filename, &data, &data_length, NULL)) {
- gtk_html_stream_write (handle, data, data_length);
- g_free (data);
- }
-
- gtk_html_stream_close (handle, GTK_HTML_STREAM_OK);
-
- g_free (filename);
- }
-}
-
-static void
-on_link_clicked (GtkHTML *html, const char *url, EABContactDisplay *display)
-{
- GError *err = NULL;
-
-#ifdef HANDLE_MAILTO_INTERNALLY
- if (!strncmp (url, "internal-mailto:", strlen ("internal-mailto:"))) {
- int mail_num = atoi (url + strlen ("internal-mailto:"));
-
- if (mail_num == -1)
- return;
-
- eab_send_contact (display->priv->contact, mail_num, EAB_DISPOSITION_AS_TO);
-
- return;
- }
-#endif
-
- gnome_url_show (url, &err);
-
- if (err) {
- g_warning ("gnome_url_show: %s", err->message);
- g_error_free (err);
- }
-}
-
-#if 0
-static void
-render_address (GtkHTMLStream *html_stream, EContact *contact, const char *html_label, EContactField adr_field, EContactField label_field)
-{
- EContactAddress *adr;
- const char *label;
-
- label = e_contact_get_const (contact, label_field);
- if (label) {
- char *html = e_text_to_html (label, E_TEXT_TO_HTML_CONVERT_NL);
-
- gtk_html_stream_printf (html_stream, "<tr><td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\"></td><td valign=\"top\" width=\"100\"><font color=" HEADER_COLOR ">%s:</font><br><a href=\"http://www.mapquest.com/\">%s</a></td><td valign=\"top\">%s</td></tr>", html_label, _("(map)"), html);
-
- g_free (html);
- return;
- }
-
- adr = e_contact_get (contact, adr_field);
- if (adr &&
- (adr->po || adr->ext || adr->street || adr->locality || adr->region || adr->code || adr->country)) {
-
- gtk_html_stream_printf (html_stream, "<tr><td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\"></td><td valign=\"top\" width=\"100\"><font color=" HEADER_COLOR ">%s:</font><br><a href=\"http://www.mapquest.com/\">%s</a></td><td valign=\"top\">", html_label, _("map"));
-
- if (adr->po && *adr->po) gtk_html_stream_printf (html_stream, "%s<br>", adr->po);
- if (adr->ext && *adr->ext) gtk_html_stream_printf (html_stream, "%s<br>", adr->ext);
- if (adr->street && *adr->street) gtk_html_stream_printf (html_stream, "%s<br>", adr->street);
- if (adr->locality && *adr->locality) gtk_html_stream_printf (html_stream, "%s<br>", adr->locality);
- if (adr->region && *adr->region) gtk_html_stream_printf (html_stream, "%s<br>", adr->region);
- if (adr->code && *adr->code) gtk_html_stream_printf (html_stream, "%s<br>", adr->code);
- if (adr->country && *adr->country) gtk_html_stream_printf (html_stream, "%s<br>", adr->country);
-
- gtk_html_stream_printf (html_stream, "</td></tr>");
- }
- if (adr)
- e_contact_address_free (adr);
-}
-#endif
-
-static void
-render_name_value (GtkHTMLStream *html_stream, const char *label, const char *str, const char *icon, unsigned int html_flags)
-{
- char *value = e_text_to_html (str, html_flags);
-
- gtk_html_stream_printf (html_stream, "<tr><td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\">");
- if (icon)
- gtk_html_stream_printf (html_stream, "<img width=\"16\" height=\"16\" src=\"evo-icon:%s\">", icon);
- gtk_html_stream_printf (html_stream, "</td><td valign=\"top\" width=\"100\" nowrap><font color=" HEADER_COLOR ">%s:</font></td> <td valign=\"top\">%s</td></tr>", label, value);
-
- g_free (value);
-}
-
-static void
-render_attribute (GtkHTMLStream *html_stream, EContact *contact, const char *html_label, EContactField field, const char *icon, unsigned int html_flags)
-{
- const char *str;
-
- str = e_contact_get_const (contact, field);
-
- if (str && *str) {
- render_name_value (html_stream, html_label, str, icon, html_flags);
- }
-}
-
-static void
-accum_address (GString *gstr, EContact *contact, const char *html_label, EContactField adr_field, EContactField label_field)
-{
- EContactAddress *adr;
- const char *label;
-
- label = e_contact_get_const (contact, label_field);
- if (label) {
- char *html = e_text_to_html (label, E_TEXT_TO_HTML_CONVERT_NL);
-
-#if mapping_works
- g_string_append_printf (gstr, "<tr><td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\"></td><td valign=\"top\" width=\"100\"><font color=" HEADER_COLOR ">%s:</font><br><a href=\"http://www.mapquest.com/\">%s</a></td><td valign=\"top\">%s</td></tr>", html_label, _("(map)"), html);
-#else
- g_string_append_printf (gstr, "<tr><td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\"></td><td valign=\"top\" width=\"100\"><font color=" HEADER_COLOR ">%s:</font></td><td valign=\"top\">%s</td></tr>", html_label, html);
-#endif
-
- g_free (html);
- return;
- }
-
- adr = e_contact_get (contact, adr_field);
- if (adr &&
- (adr->po || adr->ext || adr->street || adr->locality || adr->region || adr->code || adr->country)) {
-
- g_string_append_printf (gstr, "<tr><td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\"></td><td valign=\"top\" width=\"100\"><font color=" HEADER_COLOR ">%s:</font><br><a href=\"http://www.mapquest.com/\">%s</a></td><td valign=\"top\">", html_label, _("map"));
-
- if (adr->po && *adr->po) g_string_append_printf (gstr, "%s<br>", adr->po);
- if (adr->ext && *adr->ext) g_string_append_printf (gstr, "%s<br>", adr->ext);
- if (adr->street && *adr->street) g_string_append_printf (gstr, "%s<br>", adr->street);
- if (adr->locality && *adr->locality) g_string_append_printf (gstr, "%s<br>", adr->locality);
- if (adr->region && *adr->region) g_string_append_printf (gstr, "%s<br>", adr->region);
- if (adr->code && *adr->code) g_string_append_printf (gstr, "%s<br>", adr->code);
- if (adr->country && *adr->country) g_string_append_printf (gstr, "%s<br>", adr->country);
-
- g_string_append_printf (gstr, "</td></tr>");
- }
- if (adr)
- e_contact_address_free (adr);
-}
-
-static void
-accum_name_value (GString *gstr, const char *label, const char *str, const char *icon, unsigned int html_flags)
-{
- char *value = e_text_to_html (str, html_flags);
-
- g_string_append_printf (gstr, "<tr><td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\">");
- if (icon)
- g_string_append_printf (gstr, "<img width=\"16\" height=\"16\" src=\"evo-icon:%s\">", icon);
- g_string_append_printf (gstr, "</td><td valign=\"top\" width=\"100\" nowrap><font color=" HEADER_COLOR ">%s:</font></td> <td valign=\"top\">%s</td></tr>", label, value);
-
- g_free (value);
-}
-
-
-static void
-accum_attribute (GString *gstr, EContact *contact, const char *html_label, EContactField field, const char *icon, unsigned int html_flags)
-{
- const char *str;
-
- str = e_contact_get_const (contact, field);
-
- if (str && *str) {
- accum_name_value (gstr, html_label, str, icon, html_flags);
- }
-}
-
-static void
-accum_multival_attribute (GString *gstr, EContact *contact, const char *html_label, EContactField field, const char *icon, unsigned int html_flags)
-{
- GList *val_list, *l;
-
- val_list = e_contact_get (contact, field);
- for (l = val_list; l; l = l->next) {
- const char *str = (const char *) l->data;
- accum_name_value (gstr, html_label, str, icon, html_flags);
- }
- g_list_foreach (val_list, (GFunc) g_free, NULL);
- g_list_free (val_list);
-}
-
-static void
-render_contact_list (GtkHTMLStream *html_stream, EContact *contact)
-{
- GList *email_list;
- GList *l;
-
- gtk_html_stream_printf (html_stream, "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr>");
- gtk_html_stream_printf (html_stream, "<td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\">");
- gtk_html_stream_printf (html_stream, "<img width=\"16\" height=\"16\" src=\"evo-icon:" CONTACT_LIST_ICON "\">");
- gtk_html_stream_printf (html_stream, "</td><td valign=\"top\" width=\"100\" nowrap><font color=" HEADER_COLOR ">%s:</font></td> <td valign=\"top\">", _("List Members"));
-
- email_list = e_contact_get (contact, E_CONTACT_EMAIL);
- for (l = email_list; l; l = l->next) {
- char *html = e_text_to_html (l->data, E_TEXT_TO_HTML_CONVERT_ADDRESSES);
- gtk_html_stream_printf (html_stream, "%s<br>", html);
- g_free (html);
- }
- gtk_html_stream_printf (html_stream, "</td></tr></table>");
-}
-
-static void
-start_block (GtkHTMLStream *html_stream, const char *label)
-{
- gtk_html_stream_printf (html_stream, "<tr><td height=\"20\" colspan=\"3\"><font color=" HEADER_COLOR "><b>%s</b></font></td></tr>", label);
-}
-
-static void
-end_block (GtkHTMLStream *html_stream)
-{
- gtk_html_stream_printf (html_stream, "<tr><td height=\"20\">&nbsp;</td></tr>");
-}
-
-static void
-render_contact (GtkHTMLStream *html_stream, EContact *contact)
-{
- GString *accum;
- GList *email_list, *l;
-#ifdef HANDLE_MAILTO_INTERNALLY
- int email_num = 0;
-#endif
- char *nl;
-
- gtk_html_stream_printf (html_stream, "<table border=\"0\">");
-
- accum = g_string_new ("");
- nl = "";
-
- start_block (html_stream, "");
-
- email_list = e_contact_get (contact, E_CONTACT_EMAIL);
- for (l = email_list; l; l = l->next) {
-#ifdef HANDLE_MAILTO_INTERNALLY
- char *html = e_text_to_html (l->data, 0);
- g_string_append_printf (accum, "%s<a href=\"internal-mailto:%d\">%s</a>", nl, email_num, html);
- email_num ++;
- g_free (html);
- nl = "<br>";
-
-#else
- g_string_append_printf (accum, "%s%s", nl, (char*)l->data);
- nl = "\n";
-#endif
- }
- g_list_foreach (email_list, (GFunc)g_free, NULL);
- g_list_free (email_list);
-
- if (accum->len) {
-
-#ifdef HANDLE_MAILTO_INTERNALLY
- gtk_html_stream_printf (html_stream, "<tr><td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\">");
- gtk_html_stream_printf (html_stream,
- "</td><td valign=\"top\" width=\"100\" nowrap><font color=" HEADER_COLOR ">%s:</font></td> <td valign=\"top\">%s</td></tr>",
- _("E-mail"), accum->str);
-#else
- render_name_value (html_stream, _("E-mail"), accum->str, NULL,
- E_TEXT_TO_HTML_CONVERT_ADDRESSES | E_TEXT_TO_HTML_CONVERT_NL);
-#endif
- }
-
- g_string_assign (accum, "");
-
- accum_multival_attribute (accum, contact, _("AIM"), E_CONTACT_IM_AIM, AIM_ICON, 0);
- accum_multival_attribute (accum, contact, _("GroupWise"), E_CONTACT_IM_GROUPWISE, GROUPWISE_ICON, 0);
- accum_multival_attribute (accum, contact, _("ICQ"), E_CONTACT_IM_ICQ, ICQ_ICON, 0);
- accum_multival_attribute (accum, contact, _("Jabber"), E_CONTACT_IM_JABBER, JABBER_ICON, 0);
- accum_multival_attribute (accum, contact, _("MSN"), E_CONTACT_IM_MSN, MSN_ICON, 0);
- accum_multival_attribute (accum, contact, _("Yahoo"), E_CONTACT_IM_YAHOO, YAHOO_ICON, 0);
-
- if (accum->len > 0)
- gtk_html_stream_printf (html_stream, accum->str);
-
- end_block (html_stream);
-
- g_string_assign (accum, "");
-
- accum_attribute (accum, contact, _("Organization"), E_CONTACT_ORG, NULL, 0);
- accum_attribute (accum, contact, _("Position"), E_CONTACT_TITLE, NULL, 0);
- accum_attribute (accum, contact, _("Video Conferencing"), E_CONTACT_VIDEO_URL, VIDEOCONF_ICON, E_TEXT_TO_HTML_CONVERT_URLS);
- accum_attribute (accum, contact, _("Phone"), E_CONTACT_PHONE_BUSINESS, NULL, 0);
- accum_attribute (accum, contact, _("Fax"), E_CONTACT_PHONE_BUSINESS_FAX, NULL, 0);
- accum_address (accum, contact, _("Address"), E_CONTACT_ADDRESS_WORK, E_CONTACT_ADDRESS_LABEL_WORK);
-
- if (accum->len > 0) {
- start_block (html_stream, _("work"));
- gtk_html_stream_printf (html_stream, accum->str);
- end_block (html_stream);
- }
-
- g_string_assign (accum, "");
-
- accum_attribute (accum, contact, _("WWW"), E_CONTACT_HOMEPAGE_URL, NULL, E_TEXT_TO_HTML_CONVERT_URLS);
- accum_attribute (accum, contact, _("Blog"), E_CONTACT_BLOG_URL, NULL, E_TEXT_TO_HTML_CONVERT_URLS);
-
- accum_attribute (accum, contact, _("Phone"), E_CONTACT_PHONE_HOME, NULL, 0);
- accum_attribute (accum, contact, _("Mobile Phone"), E_CONTACT_PHONE_MOBILE, NULL, 0);
- accum_address (accum, contact, _("Address"), E_CONTACT_ADDRESS_HOME, E_CONTACT_ADDRESS_LABEL_HOME);
-
- if (accum->len > 0) {
- start_block (html_stream, _("personal"));
- gtk_html_stream_printf (html_stream, accum->str);
- end_block (html_stream);
- }
-
- start_block (html_stream, "");
-
- render_attribute (html_stream, contact, _("Note"), E_CONTACT_NOTE, NULL,
- E_TEXT_TO_HTML_CONVERT_ADDRESSES | E_TEXT_TO_HTML_CONVERT_URLS | E_TEXT_TO_HTML_CONVERT_NL);
- end_block (html_stream);
-
- gtk_html_stream_printf (html_stream, "</table>");
-}
-
-static void
-eab_contact_display_render_normal (EABContactDisplay *display, EContact *contact)
-{
- GtkHTMLStream *html_stream;
-
- if (display->priv->contact)
- g_object_unref (display->priv->contact);
- display->priv->contact = contact;
- if (display->priv->contact)
- g_object_ref (display->priv->contact);
-
- html_stream = gtk_html_begin (GTK_HTML (display));
- gtk_html_stream_write (html_stream, HTML_HEADER, sizeof (HTML_HEADER) - 1);
- gtk_html_stream_write (html_stream, "<body>\n", 7);
-
- if (contact) {
- char *str, *html;
- EContactPhoto *photo;
-
- gtk_html_stream_printf (html_stream, "<table cellspacing=\"20\" border=\"0\"><td valign=\"top\">");
- photo = e_contact_get (contact, E_CONTACT_PHOTO);
- if (!photo)
- photo = e_contact_get (contact, E_CONTACT_LOGO);
- if (photo) {
- gtk_html_stream_printf (html_stream, "<img border=\"1\" src=\"internal-contact-photo:\">");
- e_contact_photo_free (photo);
- }
-
- gtk_html_stream_printf (html_stream, "</td><td valign=\"top\">\n");
-
- str = e_contact_get_const (contact, E_CONTACT_FILE_AS);
- if (!str)
- str = e_contact_get_const (contact, E_CONTACT_FULL_NAME);
-
- if (str) {
- html = e_text_to_html (str, 0);
- gtk_html_stream_printf (html_stream, "<h2>%s</h2>", html);
- g_free (html);
- }
-
-
- if (e_contact_get (contact, E_CONTACT_IS_LIST))
- render_contact_list (html_stream, contact);
- else
- render_contact (html_stream, contact);
-
- gtk_html_stream_printf (html_stream, "</td></tr></table>\n");
- }
-
- gtk_html_stream_write (html_stream, "</body></html>\n", 15);
- gtk_html_end (GTK_HTML (display), html_stream, GTK_HTML_STREAM_OK);
-}
-
-static void
-eab_contact_display_render_compact (EABContactDisplay *display, EContact *contact)
-{
- GtkHTMLStream *html_stream;
-
- if (display->priv->contact)
- g_object_unref (display->priv->contact);
- display->priv->contact = contact;
- if (display->priv->contact)
- g_object_ref (display->priv->contact);
-
- html_stream = gtk_html_begin (GTK_HTML (display));
- gtk_html_stream_write (html_stream, HTML_HEADER, sizeof (HTML_HEADER) - 1);
- gtk_html_stream_write (html_stream, "<body>\n", 7);
-
- if (contact) {
- char *str, *html;
- EContactPhoto *photo;
-
- gtk_html_stream_printf (html_stream,
- "<table width=\"100%%\" cellpadding=1 cellspacing=0 bgcolor=\"#000000\">"
- "<tr><td valign=\"top\">"
- "<table width=\"100%%\" cellpadding=0 cellspacing=0 bgcolor=\"#eeeeee\">"
- "<tr><td valign=\"top\">"
- "<table>"
- "<tr><td valign=\"top\">");
-
- photo = e_contact_get (contact, E_CONTACT_PHOTO);
- if (!photo)
- photo = e_contact_get (contact, E_CONTACT_LOGO);
- if (photo) {
- int calced_width = MAX_COMPACT_IMAGE_DIMENSION, calced_height = MAX_COMPACT_IMAGE_DIMENSION;
- GdkPixbufLoader *loader = gdk_pixbuf_loader_new ();
- GdkPixbuf *pixbuf;
-
- /* figure out if we need to downscale the
- image here. we don't scale the pixbuf
- itself, just insert width/height tags in
- the html */
- gdk_pixbuf_loader_write (loader, photo->data, photo->length, NULL);
- pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
- if (pixbuf)
- gdk_pixbuf_ref (pixbuf);
- gdk_pixbuf_loader_close (loader, NULL);
- g_object_unref (loader);
- if (pixbuf) {
- int max_dimension;
-
- calced_width = gdk_pixbuf_get_width (pixbuf);
- calced_height = gdk_pixbuf_get_height (pixbuf);
-
- max_dimension = calced_width;
- if (max_dimension < calced_height)
- max_dimension = calced_height;
-
- if (max_dimension > MAX_COMPACT_IMAGE_DIMENSION) {
- calced_width *= ((float)MAX_COMPACT_IMAGE_DIMENSION / max_dimension);
- calced_height *= ((float)MAX_COMPACT_IMAGE_DIMENSION / max_dimension);
- }
- }
-
- gdk_pixbuf_unref (pixbuf);
- gtk_html_stream_printf (html_stream, "<img width=\"%d\" height=\"%d\" src=\"internal-contact-photo:\">",
- calced_width, calced_height);
- e_contact_photo_free (photo);
- }
-
- gtk_html_stream_printf (html_stream, "</td><td valign=\"top\">\n");
-
- str = e_contact_get_const (contact, E_CONTACT_FILE_AS);
- if (str) {
- html = e_text_to_html (str, 0);
- gtk_html_stream_printf (html_stream, "<b>%s</b>", html);
- g_free (html);
- }
- else {
- str = e_contact_get_const (contact, E_CONTACT_FULL_NAME);
- if (str) {
- html = e_text_to_html (str, 0);
- gtk_html_stream_printf (html_stream, "<b>%s</b>", html);
- g_free (html);
- }
- }
-
- gtk_html_stream_write (html_stream, "<hr>", 4);
-
- if (e_contact_get (contact, E_CONTACT_IS_LIST)) {
- GList *email_list;
- GList *l;
-
- gtk_html_stream_printf (html_stream, "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr><td valign=\"top\">");
- gtk_html_stream_printf (html_stream, "<b>%s:</b>&nbsp;<td>", _("List Members"));
-
- email_list = e_contact_get (contact, E_CONTACT_EMAIL);
- for (l = email_list; l; l = l->next) {
- char *html = e_text_to_html (l->data, 0);
- gtk_html_stream_printf (html_stream, "%s, ", html);
- g_free (html);
- }
- gtk_html_stream_printf (html_stream, "</td></tr></table>");
- }
- else {
- gboolean comma = FALSE;
- str = e_contact_get_const (contact, E_CONTACT_TITLE);
- if (str) {
- html = e_text_to_html (str, 0);
- gtk_html_stream_printf (html_stream, "<b>%s:</b> %s<br>", _("Job Title"), str);
- g_free (html);
- }
-
- gtk_html_stream_printf (html_stream, "<b>%s:</b> ", _("Email"));
- str = e_contact_get_const (contact, E_CONTACT_EMAIL_1);
- if (str) {
- html = e_text_to_html (str, 0);
- gtk_html_stream_printf (html_stream, "%s", str);
- g_free (html);
- comma = TRUE;
- }
- str = e_contact_get_const (contact, E_CONTACT_EMAIL_2);
- if (str) {
- html = e_text_to_html (str, 0);
- gtk_html_stream_printf (html_stream, "%s%s", comma ? ", " : "", str);
- g_free (html);
- comma = TRUE;
- }
- str = e_contact_get_const (contact, E_CONTACT_EMAIL_3);
- if (str) {
- html = e_text_to_html (str, 0);
- gtk_html_stream_printf (html_stream, "%s%s", comma ? ", " : "", str);
- g_free (html);
- }
- gtk_html_stream_write (html_stream, "<br>", 4);
-
- str = e_contact_get_const (contact, E_CONTACT_HOMEPAGE_URL);
- if (str) {
- html = e_text_to_html (str, E_TEXT_TO_HTML_CONVERT_URLS);
- gtk_html_stream_printf (html_stream, "<b>%s:</b> %s<br>",
- _("Home page"), html);
- g_free (html);
- }
-
- str = e_contact_get_const (contact, E_CONTACT_BLOG_URL);
- if (str) {
- html = e_text_to_html (str, E_TEXT_TO_HTML_CONVERT_URLS);
- gtk_html_stream_printf (html_stream, "<b>%s:</b> %s<br>",
- _("Blog"), html);
- }
- }
-
- gtk_html_stream_printf (html_stream, "</td></tr></table></td></tr></table></td></tr></table>\n");
- }
-
- gtk_html_stream_write (html_stream, "</body></html>\n", 15);
- gtk_html_end (GTK_HTML (display), html_stream, GTK_HTML_STREAM_OK);
-}
-
-void
-eab_contact_display_render (EABContactDisplay *display, EContact *contact,
- EABContactDisplayRenderMode mode)
-{
- switch (mode) {
- case EAB_CONTACT_DISPLAY_RENDER_NORMAL:
- eab_contact_display_render_normal (display, contact);
- break;
- case EAB_CONTACT_DISPLAY_RENDER_COMPACT:
- eab_contact_display_render_compact (display, contact);
- break;
- }
-}
-
-GtkWidget*
-eab_contact_display_new (void)
-{
- EABContactDisplay *display;
-
- display = g_object_new (EAB_TYPE_CONTACT_DISPLAY, NULL);
-
- display->priv = g_new0 (EABContactDisplayPrivate, 1);
-
- gtk_html_set_default_content_type (GTK_HTML (display), "text/html; charset=utf-8");
-
- gtk_html_set_editable (GTK_HTML (display), FALSE);
-
- g_signal_connect (display, "url_requested",
- G_CALLBACK (on_url_requested),
- display);
- g_signal_connect (display, "link_clicked",
- G_CALLBACK (on_link_clicked),
- display);
-#if 0
- g_signal_connect (display, "object_requested",
- G_CALLBACK (on_object_requested),
- mail_display);
- g_signal_connect (display, "button_press_event",
- G_CALLBACK (html_button_press_event), mail_display);
- g_signal_connect (display, "motion_notify_event",
- G_CALLBACK (html_motion_notify_event), mail_display);
- g_signal_connect (display, "enter_notify_event",
- G_CALLBACK (html_enter_notify_event), mail_display);
- g_signal_connect (display, "iframe_created",
- G_CALLBACK (html_iframe_created), mail_display);
- g_signal_connect (display, "on_url",
- G_CALLBACK (html_on_url), mail_display);
-#endif
-
- return GTK_WIDGET (display);
-}
-
-
-static void
-eab_contact_display_init (GObject *object)
-{
- gtk_html_construct (object);
-}
-
-static void
-eab_contact_display_class_init (GtkObjectClass *object_class)
-{
- /* object_class->destroy = mail_display_destroy;*/
-}
-
-GType
-eab_contact_display_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (EABContactDisplayClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) eab_contact_display_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EABContactDisplay),
- 0, /* n_preallocs */
- (GInstanceInitFunc) eab_contact_display_init,
- };
-
- type = g_type_register_static (PARENT_TYPE, "EABContactDisplay", &info, 0);
- }
-
- return type;
-}
diff --git a/addressbook/gui/widgets/eab-contact-display.h b/addressbook/gui/widgets/eab-contact-display.h
deleted file mode 100644
index 08c3936cad..0000000000
--- a/addressbook/gui/widgets/eab-contact-display.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Chris Toshok <toshok@ximian.com>
- *
- * Copyright 2003 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifndef _EAB_CONTACT_DISPLAY_H_
-#define _EAB_CONTACT_DISPLAY_H_
-
-#include <gtkhtml/gtkhtml.h>
-#include <libebook/e-contact.h>
-
-#define EAB_TYPE_CONTACT_DISPLAY (eab_contact_display_get_type ())
-#define EAB_CONTACT_DISPLAY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EAB_TYPE_CONTACT_DISPLAY, EABContactDisplay))
-#define EAB_CONTACT_DISPLAY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), EAB_TYPE_CONTACT_DISPLAY, EABContactDisplayClass))
-#define IS_EAB_CONTACT_DISPLAY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EAB_TYPE_CONTACT_DISPLAY))
-#define IS_EAB_CONTACT_DISPLAY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EAB_TYPE_CONTACT_DISPLAY))
-
-typedef struct _EABContactDisplay EABContactDisplay;
-typedef struct _EABContactDisplayPrivate EABContactDisplayPrivate;
-typedef struct _EABContactDisplayClass EABContactDisplayClass;
-
-typedef enum {
- EAB_CONTACT_DISPLAY_RENDER_NORMAL, /* for use in the preview pane */
- EAB_CONTACT_DISPLAY_RENDER_COMPACT /* for use with embedded vcards (e.g, the EABVCardControl) */
-} EABContactDisplayRenderMode;
-
-struct _EABContactDisplay {
- GtkHTML parent;
-
- EABContactDisplayPrivate *priv;
-};
-
-struct _EABContactDisplayClass {
- GtkHTMLClass parent_class;
-};
-
-GtkType eab_contact_display_get_type (void);
-GtkWidget * eab_contact_display_new (void);
-
-void eab_contact_display_render (EABContactDisplay *display, EContact *contact,
- EABContactDisplayRenderMode render_mode);
-
-#endif /* _EAB_CONTACT_DISPLAY_H_ */
diff --git a/addressbook/gui/widgets/eab-gui-util.c b/addressbook/gui/widgets/eab-gui-util.c
deleted file mode 100644
index 24bbe248d4..0000000000
--- a/addressbook/gui/widgets/eab-gui-util.c
+++ /dev/null
@@ -1,1097 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-field-chooser.c
- * Copyright (C) 2001 Ximian, Inc.
- * Author: Chris Toshok <toshok@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <string.h>
-
-#include <libedataserverui/e-source-selector.h>
-#include <gal/util/e-util.h>
-#include "eab-gui-util.h"
-#include "util/eab-book-util.h"
-#include <libebook/e-destination.h>
-#include "widgets/misc/e-error.h"
-#include "widgets/misc/e-image-chooser.h"
-#include <e-util/e-icon-factory.h>
-
-#include <gnome.h>
-
-#include "addressbook/gui/contact-editor/eab-editor.h"
-#include "addressbook/gui/contact-editor/e-contact-editor.h"
-#include "addressbook/gui/contact-list-editor/e-contact-list-editor.h"
-#include "addressbook/gui/component/addressbook-component.h"
-#include "addressbook/gui/component/addressbook.h"
-
-/* the NULL's in this table correspond to the status codes
- that should *never* be generated by a backend */
-static const char *status_to_string[] = {
- /* E_BOOK_ERROR_OK */ N_("Success"),
- /* E_BOOK_ERROR_INVALID_ARG */ NULL,
- /* E_BOOK_ERROR_BUSY */ N_("Backend busy"),
- /* E_BOOK_ERROR_REPOSITORY_OFFLINE */ N_("Repository offline"),
- /* E_BOOK_ERROR_NO_SUCH_BOOK */ N_("Address Book does not exist"),
- /* E_BOOK_ERROR_NO_SELF_CONTACT */ N_("No Self Contact defined"),
- /* E_BOOK_ERROR_URI_NOT_LOADED */ NULL,
- /* E_BOOK_ERROR_URI_ALREADY_LOADED */ NULL,
- /* E_BOOK_ERROR_PERMISSION_DENIED */ N_("Permission denied"),
- /* E_BOOK_ERROR_CONTACT_NOT_FOUND */ N_("Contact not found"),
- /* E_BOOK_ERROR_CONTACT_ID_ALREADY_EXISTS */ N_("Contact ID already exists"),
- /* E_BOOK_ERROR_PROTOCOL_NOT_SUPPORTED */ N_("Protocol not supported"),
- /* E_BOOK_ERROR_CANCELLED */ N_("Cancelled"),
- /* E_BOOK_ERROR_COULD_NOT_CANCEL */ N_("Could not cancel"),
- /* E_BOOK_ERROR_AUTHENTICATION_FAILED */ N_("Authentication Failed"),
- /* E_BOOK_ERROR_AUTHENTICATION_REQUIRED */ N_("Authentication Required"),
- /* E_BOOK_ERROR_TLS_NOT_AVAILABLE */ N_("TLS not Available"),
- /* E_BOOK_ERROR_CORBA_EXCEPTION */ NULL,
- /* E_BOOK_ERROR_NO_SUCH_SOURCE */ N_("No such source"),
- /* E_BOOK_ERROR_OTHER_ERROR */ N_("Other error")
-};
-
-void
-eab_error_dialog (const char *msg, EBookStatus status)
-{
- const char *status_str = status_to_string [status];
-
- if (status_str)
- e_error_run (NULL, "addressbook:generic-error", msg, status_str, NULL);
-}
-
-void
-eab_load_error_dialog (GtkWidget *parent, ESource *source, EBookStatus status)
-{
- char *label_string, *uri;
-
- g_return_if_fail (source != NULL);
-
- uri = e_source_get_uri (source);
-
- if (status == E_BOOK_ERROR_OFFLINE_UNAVAILABLE) {
- label_string = _("We were unable to open this addressbook. This either means "
- "this book is not marked for offline usage or not yet downloaded "
- "for offline usage. Please load the addressbook once in online mode "
- "to download its contents");
- }
-
- else if (!strncmp (uri, "file:", 5)) {
- label_string =
- _("We were unable to open this addressbook. Please check that the "
- "path exists and that you have permission to access it.");
- }
- else if (!strncmp (uri, "ldap:", 5)) {
- /* special case for ldap: contact folders so we can tell the user about openldap */
-#if HAVE_LDAP
- label_string =
- _("We were unable to open this addressbook. This either "
- "means you have entered an incorrect URI, or the LDAP server "
- "is unreachable.");
-#else
- label_string =
- _("This version of Evolution does not have LDAP support "
- "compiled in to it. If you want to use LDAP in Evolution, "
- "you must install an LDAP-enabled Evolution package.");
-#endif
- } else {
- /* other network folders */
- label_string =
- _("We were unable to open this addressbook. This either "
- "means you have entered an incorrect URI, or the server "
- "is unreachable.");
- }
-
- e_error_run ((GtkWindow *) parent, "addressbook:load-error", label_string, NULL);
-
- g_free (uri);
-}
-
-void
-eab_search_result_dialog (GtkWidget *parent,
- EBookViewStatus status)
-{
- char *str = NULL;
-
- switch (status) {
- case E_BOOK_VIEW_STATUS_OK:
- return;
- case E_BOOK_VIEW_STATUS_SIZE_LIMIT_EXCEEDED:
- str = _("More cards matched this query than either the server is \n"
- "configured to return or Evolution is configured to display.\n"
- "Please make your search more specific or raise the result limit in\n"
- "the directory server preferences for this addressbook.");
- break;
- case E_BOOK_VIEW_STATUS_TIME_LIMIT_EXCEEDED:
- str = _("The time to execute this query exceeded the server limit or the limit\n"
- "you have configured for this addressbook. Please make your search\n"
- "more specific or raise the time limit in the directory server\n"
- "preferences for this addressbook.");
- break;
- case E_BOOK_VIEW_ERROR_INVALID_QUERY:
- str = _("The backend for this addressbook was unable to parse this query.");
- break;
- case E_BOOK_VIEW_ERROR_QUERY_REFUSED:
- str = _("The backend for this addressbook refused to perform this query.");
- break;
- case E_BOOK_VIEW_ERROR_OTHER_ERROR:
- str = _("This query did not complete successfully.");
- break;
- default:
- g_assert_not_reached ();
- }
-
- e_error_run ((GtkWindow *) parent, "addressbook:search-error", str, NULL);
-}
-
-gint
-eab_prompt_save_dialog (GtkWindow *parent)
-{
- return e_error_run (parent, "addressbook:prompt-save", NULL);
-}
-
-static void
-added_cb (EBook* book, EBookStatus status, EContact *contact,
- gpointer data)
-{
- gboolean is_list = GPOINTER_TO_INT (data);
-
- if (status != E_BOOK_ERROR_OK && status != E_BOOK_ERROR_CANCELLED) {
- eab_error_dialog (is_list ? _("Error adding list") : _("Error adding contact"), status);
- }
-}
-
-static void
-modified_cb (EBook* book, EBookStatus status, EContact *contact,
- gpointer data)
-{
- gboolean is_list = GPOINTER_TO_INT (data);
-
- if (status != E_BOOK_ERROR_OK && status != E_BOOK_ERROR_CANCELLED) {
- eab_error_dialog (is_list ? _("Error modifying list") : _("Error modifying contact"),
- status);
- }
-}
-
-static void
-deleted_cb (EBook* book, EBookStatus status, EContact *contact,
- gpointer data)
-{
- gboolean is_list = GPOINTER_TO_INT (data);
-
- if (status != E_BOOK_ERROR_OK) {
- eab_error_dialog (is_list ? _("Error removing list") : _("Error removing contact"),
- status);
- }
-}
-
-static void
-editor_closed_cb (GtkObject *editor, gpointer data)
-{
- g_object_unref (editor);
-}
-
-EContactEditor *
-eab_show_contact_editor (EBook *book, EContact *contact,
- gboolean is_new_contact,
- gboolean editable)
-{
- EContactEditor *ce;
-
- ce = e_contact_editor_new (book, contact, is_new_contact, editable);
-
- g_signal_connect (ce, "contact_added",
- G_CALLBACK (added_cb), GINT_TO_POINTER (FALSE));
- g_signal_connect (ce, "contact_modified",
- G_CALLBACK (modified_cb), GINT_TO_POINTER (FALSE));
- g_signal_connect (ce, "contact_deleted",
- G_CALLBACK (deleted_cb), GINT_TO_POINTER (FALSE));
- g_signal_connect (ce, "editor_closed",
- G_CALLBACK (editor_closed_cb), NULL);
-
- return ce;
-}
-
-EContactListEditor *
-eab_show_contact_list_editor (EBook *book, EContact *contact,
- gboolean is_new_contact,
- gboolean editable)
-{
- EContactListEditor *ce;
-
- ce = e_contact_list_editor_new (book, contact, is_new_contact, editable);
-
- g_signal_connect (ce, "contact_added",
- G_CALLBACK (added_cb), GINT_TO_POINTER (TRUE));
- g_signal_connect (ce, "contact_modified",
- G_CALLBACK (modified_cb), GINT_TO_POINTER (TRUE));
- g_signal_connect (ce, "contact_deleted",
- G_CALLBACK (deleted_cb), GINT_TO_POINTER (TRUE));
- g_signal_connect (ce, "editor_closed",
- G_CALLBACK (editor_closed_cb), GINT_TO_POINTER (TRUE));
-
- eab_editor_show (EAB_EDITOR (ce));
-
- return ce;
-}
-
-static void
-view_contacts (EBook *book, GList *list, gboolean editable)
-{
- for (; list; list = list->next) {
- EContact *contact = list->data;
- if (e_contact_get (contact, E_CONTACT_IS_LIST))
- eab_show_contact_list_editor (book, contact, FALSE, editable);
- else
- eab_show_contact_editor (book, contact, FALSE, editable);
- }
-}
-
-void
-eab_show_multiple_contacts (EBook *book,
- GList *list,
- gboolean editable)
-{
- if (list) {
- int length = g_list_length (list);
- if (length > 5) {
- GtkWidget *dialog;
- gint response;
-
- dialog = gtk_message_dialog_new (NULL,
- 0,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_YES_NO,
- ngettext("Opening %d contact will open %d new window as well.\n"
- "Do you really want to display this contact?",
- "Opening %d contacts will open %d new windows as well.\n"
- "Do you really want to display all of these contacts?",
- length),
- length,
- length);
-
- response = gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- if (response == GTK_RESPONSE_YES)
- view_contacts (book, list, editable);
- } else {
- view_contacts (book, list, editable);
- }
- }
-}
-
-
-static gint
-file_exists(GtkWindow *window, const char *filename)
-{
- GtkWidget *dialog;
- gint response;
-
- dialog = gtk_message_dialog_new (window,
- 0,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- _("%s already exists\nDo you want to overwrite it?"), filename);
-
- gtk_dialog_add_buttons (GTK_DIALOG (dialog),
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- _("Overwrite"), GTK_RESPONSE_ACCEPT,
- NULL);
-
- response = gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- return response;
-}
-
-typedef struct {
- GtkWidget *filesel;
- char *vcard;
-} SaveAsInfo;
-
-static void
-save_it(GtkWidget *widget, SaveAsInfo *info)
-{
- const char *filename;
- gint error = 0;
- gint response = 0;
-
-
-#ifdef USE_GTKFILECHOOSER
- filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (info->filesel));
-#else
- filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (info->filesel));
-#endif
-
- error = e_write_file (filename, info->vcard, O_WRONLY | O_CREAT | O_EXCL | O_TRUNC);
-
- if (error == EEXIST) {
- response = file_exists(GTK_WINDOW (info->filesel), filename);
- switch (response) {
- case GTK_RESPONSE_ACCEPT : /* Overwrite */
- e_write_file(filename, info->vcard, O_WRONLY | O_CREAT | O_TRUNC);
- break;
- case GTK_RESPONSE_CANCEL : /* cancel */
- return;
- }
- } else if (error != 0) {
- e_error_run (GTK_WINDOW (info->filesel), "addressbook:save-error", filename, g_strerror (errno));
- return;
- }
-
- gtk_widget_destroy(GTK_WIDGET(info->filesel));
-}
-
-static void
-close_it(GtkWidget *widget, SaveAsInfo *info)
-{
- gtk_widget_destroy (GTK_WIDGET (info->filesel));
-}
-
-static void
-destroy_it(void *data, GObject *where_the_object_was)
-{
- SaveAsInfo *info = data;
- g_free (info->vcard);
- g_free (info);
-}
-
-#ifdef USE_GTKFILECHOOSER
-static void
-filechooser_response (GtkWidget *widget, gint response_id, SaveAsInfo *info)
-{
- if (response_id == GTK_RESPONSE_ACCEPT)
- save_it (widget, info);
- else
- close_it (widget, info);
-}
-#endif
-
-static char *
-make_safe_filename (char *name)
-{
- char *safe;
-
- if (!name) {
- /* This is a filename. Translators take note. */
- name = _("card.vcf");
- }
-
- if (!g_strrstr (name, ".vcf"))
- safe = g_strdup_printf ("%s%s", name, ".vcf");
- else
- safe = g_strdup (name);
-
- e_filename_make_safe (safe);
-
- return safe;
-}
-
-static void
-source_selection_changed_cb (GtkWidget *selector, GtkWidget *ok_button)
-{
- gtk_widget_set_sensitive (ok_button,
- e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (selector)) ?
- TRUE : FALSE);
-}
-
-ESource *
-eab_select_source (const gchar *title, const gchar *message, const gchar *select_uid, GtkWindow *parent)
-{
- ESource *source;
- ESourceList *source_list;
- GtkWidget *dialog;
- GtkWidget *ok_button;
- GtkWidget *cancel_button;
- GtkWidget *label;
- GtkWidget *selector;
- GtkWidget *scrolled_window;
- gint response;
-
- if (!e_book_get_addressbooks (&source_list, NULL))
- return NULL;
-
- dialog = gtk_dialog_new_with_buttons (title, parent,
- GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
- NULL);
- gtk_window_set_default_size (GTK_WINDOW (dialog), 200, 350);
-
- cancel_button = gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
- ok_button = gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT);
- gtk_widget_set_sensitive (ok_button, FALSE);
-
- label = gtk_label_new (message);
-
- selector = e_source_selector_new (source_list);
- e_source_selector_show_selection (E_SOURCE_SELECTOR (selector), FALSE);
- g_signal_connect (selector, "primary_selection_changed",
- G_CALLBACK (source_selection_changed_cb), ok_button);
-
- if (select_uid) {
- source = e_source_list_peek_source_by_uid (source_list, select_uid);
- if (source)
- e_source_selector_set_primary_selection (E_SOURCE_SELECTOR (selector), source);
- }
-
- scrolled_window = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN);
- gtk_container_add (GTK_CONTAINER (scrolled_window), selector);
-
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), label, FALSE, FALSE, 4);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scrolled_window, TRUE, TRUE, 4);
-
- gtk_widget_show_all (dialog);
- response = gtk_dialog_run (GTK_DIALOG (dialog));
-
- if (response == GTK_RESPONSE_ACCEPT)
- source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (selector));
- else
- source = NULL;
-
- gtk_widget_destroy (dialog);
- return source;
-}
-
-void
-eab_contact_save (char *title, EContact *contact, GtkWindow *parent_window)
-{
- GtkWidget *filesel;
- char *file, *full_filename;
- char *name;
- SaveAsInfo *info = g_new(SaveAsInfo, 1);
-
- name = e_contact_get (contact, E_CONTACT_FILE_AS);
- file = make_safe_filename (name);
-
-#ifdef USE_GTKFILECHOOSER
- filesel = gtk_file_chooser_dialog_new (title,
- parent_window,
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
- NULL);
- gtk_dialog_set_default_response (GTK_DIALOG (filesel), GTK_RESPONSE_ACCEPT);
-
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (filesel), g_get_home_dir ());
- gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filesel), file);
-
- info->filesel = filesel;
- info->vcard = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30);
-
- g_signal_connect (G_OBJECT (filesel), "response",
- G_CALLBACK (filechooser_response), info);
- g_object_weak_ref (G_OBJECT (filesel), destroy_it, info);
-#else
- filesel = gtk_file_selection_new (title);
-
- full_filename = g_strdup_printf ("%s/%s", g_get_home_dir (), file);
- gtk_file_selection_set_filename (GTK_FILE_SELECTION (filesel), full_filename);
- g_free (full_filename);
-
- info->filesel = filesel;
- info->vcard = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30);
-
- g_signal_connect(G_OBJECT (GTK_FILE_SELECTION (filesel)->ok_button), "clicked",
- G_CALLBACK (save_it), info);
- g_signal_connect(G_OBJECT (GTK_FILE_SELECTION (filesel)->cancel_button), "clicked",
- G_CALLBACK (close_it), info);
- g_object_weak_ref (G_OBJECT (filesel), destroy_it, info);
-#endif
-
- if (parent_window) {
- gtk_window_set_transient_for (GTK_WINDOW (filesel),
- parent_window);
- gtk_window_set_modal (GTK_WINDOW (filesel), TRUE);
- }
-
- gtk_widget_show(GTK_WIDGET(filesel));
- g_free (file);
-}
-
-void
-eab_contact_list_save (char *title, GList *list, GtkWindow *parent_window)
-{
- GtkWidget *filesel;
- SaveAsInfo *info = g_new(SaveAsInfo, 1);
- char *file, *full_filename;
-
-#ifdef USE_GTKFILECHOOSER
- filesel = gtk_file_chooser_dialog_new (title,
- parent_window,
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
- NULL);
- gtk_dialog_set_default_response (GTK_DIALOG (filesel), GTK_RESPONSE_ACCEPT);
-#else
- filesel = gtk_file_selection_new(title);
-#endif
-
- /* This is a filename. Translators take note. */
- if (list && list->data && list->next == NULL) {
- char *name;
- name = e_contact_get (E_CONTACT (list->data), E_CONTACT_FILE_AS);
- if (!name)
- name = e_contact_get (E_CONTACT (list->data), E_CONTACT_FULL_NAME);
-
- file = make_safe_filename (name);
- } else {
- file = make_safe_filename (_("list"));
- }
-
-#ifdef USE_GTKFILECHOOSER
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (filesel), g_get_home_dir ());
- gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filesel), file);
-#else
- full_filename = g_strdup_printf ("%s/%s", g_get_home_dir (), file);
- gtk_file_selection_set_filename (GTK_FILE_SELECTION (filesel), full_filename);
- g_free (full_filename);
-#endif
-
- info->filesel = filesel;
- info->vcard = eab_contact_list_to_string (list);
-
-#ifdef USE_GTKFILECHOOSER
- g_signal_connect (G_OBJECT (filesel), "response",
- G_CALLBACK (filechooser_response), info);
- g_object_weak_ref (G_OBJECT (filesel), destroy_it, info);
-#else
- g_signal_connect(G_OBJECT (GTK_FILE_SELECTION (filesel)->ok_button), "clicked",
- G_CALLBACK (save_it), info);
- g_signal_connect(G_OBJECT (GTK_FILE_SELECTION (filesel)->cancel_button), "clicked",
- G_CALLBACK (close_it), info);
- g_object_weak_ref (G_OBJECT (filesel), destroy_it, info);
-#endif
-
- if (parent_window) {
- gtk_window_set_transient_for (GTK_WINDOW (filesel),
- parent_window);
- gtk_window_set_modal (GTK_WINDOW (filesel), TRUE);
- }
-
- gtk_widget_show(GTK_WIDGET(filesel));
- g_free (file);
-}
-
-typedef struct ContactCopyProcess_ ContactCopyProcess;
-
-typedef void (*ContactCopyDone) (ContactCopyProcess *process);
-
-struct ContactCopyProcess_ {
- int count;
- GList *contacts;
- EBook *source;
- EBook *destination;
- ContactCopyDone done_cb;
-};
-
-static void
-contact_deleted_cb (EBook* book, EBookStatus status, gpointer user_data)
-{
- if (status != E_BOOK_ERROR_OK) {
- eab_error_dialog (_("Error removing contact"), status);
- }
-}
-
-static void
-do_delete (gpointer data, gpointer user_data)
-{
- EBook *book = user_data;
- EContact *contact = data;
-
- e_book_async_remove_contact(book, contact, contact_deleted_cb, NULL);
-}
-
-static void
-delete_contacts (ContactCopyProcess *process)
-{
- g_list_foreach (process->contacts,
- do_delete,
- process->source);
-}
-
-static void
-process_unref (ContactCopyProcess *process)
-{
- process->count --;
- if (process->count == 0) {
- if (process->done_cb) {
- process->done_cb (process);
- }
- e_free_object_list(process->contacts);
- g_object_unref (process->source);
- g_object_unref (process->destination);
- g_free (process);
- }
-}
-
-static void
-contact_added_cb (EBook* book, EBookStatus status, const char *id, gpointer user_data)
-{
- ContactCopyProcess *process = user_data;
-
- if (status != E_BOOK_ERROR_OK) {
- eab_error_dialog (_("Error adding contact"), status);
- } else {
- process_unref (process);
- }
-}
-
-static void
-do_copy (gpointer data, gpointer user_data)
-{
- EBook *book;
- EContact *contact;
- ContactCopyProcess *process;
-
- process = user_data;
- contact = data;
-
- book = process->destination;
-
- process->count ++;
- e_book_async_add_contact(book, contact, contact_added_cb, process);
-}
-
-static void
-got_book_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- ContactCopyProcess *process;
- process = closure;
- if (status == E_BOOK_ERROR_OK) {
- process->destination = book;
- g_object_ref (book);
- g_list_foreach (process->contacts,
- do_copy,
- process);
- }
- process_unref (process);
-}
-
-void
-eab_transfer_contacts (EBook *source, GList *contacts /* adopted */, gboolean delete_from_source, GtkWindow *parent_window)
-{
- EBook *dest;
- ESource *destination_source;
- static char *last_uid = NULL;
- ContactCopyProcess *process;
- char *desc;
-
- if (contacts == NULL)
- return;
-
- if (last_uid == NULL)
- last_uid = g_strdup ("");
-
- if (contacts->next == NULL) {
- if (delete_from_source)
- desc = _("Move contact to");
- else
- desc = _("Copy contact to");
- } else {
- if (delete_from_source)
- desc = _("Move contacts to");
- else
- desc = _("Copy contacts to");
- }
-
- destination_source = eab_select_source (desc, _("Select target addressbook."),
- last_uid, parent_window);
-
- if (!destination_source)
- return;
-
- if (strcmp (last_uid, e_source_peek_uid (destination_source)) != 0) {
- g_free (last_uid);
- last_uid = g_strdup (e_source_peek_uid (destination_source));
- }
-
- process = g_new (ContactCopyProcess, 1);
- process->count = 1;
- process->source = source;
- g_object_ref (source);
- process->contacts = contacts;
- process->destination = NULL;
-
- if (delete_from_source)
- process->done_cb = delete_contacts;
- else
- process->done_cb = NULL;
-
- dest = e_book_new (destination_source, NULL);
- addressbook_load (dest, got_book_cb, process);
-}
-
-#include <Evolution-Composer.h>
-
-#define COMPOSER_OAFID "OAFIID:GNOME_Evolution_Mail_Composer:" BASE_VERSION
-
-typedef struct {
- EContact *contact;
- int email_num; /* if the contact is a person (not a list), the email address to use */
-} ContactAndEmailNum;
-
-static void
-eab_send_to_contact_and_email_num_list (GList *c)
-{
- GNOME_Evolution_Composer composer_server;
- CORBA_Environment ev;
- GNOME_Evolution_Composer_RecipientList *to_list, *cc_list, *bcc_list;
- CORBA_char *subject;
- int to_i, bcc_i;
- GList *iter;
- gint to_length = 0, bcc_length = 0;
-
- if (c == NULL)
- return;
-
- CORBA_exception_init (&ev);
-
- composer_server = bonobo_activation_activate_from_id (COMPOSER_OAFID, 0, NULL, &ev);
-
- /* Figure out how many addresses of each kind we have. */
- for (iter = c; iter != NULL; iter = g_list_next (iter)) {
- ContactAndEmailNum *ce = iter->data;
- EContact *contact = ce->contact;
- GList *emails = e_contact_get (contact, E_CONTACT_EMAIL);
- if (e_contact_get (contact, E_CONTACT_IS_LIST)) {
- gint len = g_list_length (emails);
- if (e_contact_get (contact, E_CONTACT_LIST_SHOW_ADDRESSES))
- to_length += len;
- else
- bcc_length += len;
- } else {
- if (emails != NULL)
- ++to_length;
- }
- g_list_foreach (emails, (GFunc)g_free, NULL);
- g_list_free (emails);
- }
-
- /* Now I have to make a CORBA sequences that represents a recipient list with
- the right number of entries, for the contacts. */
- to_list = GNOME_Evolution_Composer_RecipientList__alloc ();
- to_list->_maximum = to_length;
- to_list->_length = to_length;
- if (to_length > 0) {
- to_list->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (to_length);
- }
-
- cc_list = GNOME_Evolution_Composer_RecipientList__alloc ();
- cc_list->_maximum = cc_list->_length = 0;
-
- bcc_list = GNOME_Evolution_Composer_RecipientList__alloc ();
- bcc_list->_maximum = bcc_length;
- bcc_list->_length = bcc_length;
- if (bcc_length > 0) {
- bcc_list->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (bcc_length);
- }
-
- to_i = 0;
- bcc_i = 0;
- while (c != NULL) {
- ContactAndEmailNum *ce = c->data;
- EContact *contact = ce->contact;
- int nth = ce->email_num;
- char *name, *addr;
- gboolean is_list, is_hidden;
- GNOME_Evolution_Composer_Recipient *recipient;
- GList *emails = e_contact_get (contact, E_CONTACT_EMAIL);
- GList *iterator;
-
- if (emails != NULL) {
-
- is_list = (gboolean)e_contact_get (contact, E_CONTACT_IS_LIST);
- is_hidden = is_list && !e_contact_get (contact, E_CONTACT_LIST_SHOW_ADDRESSES);
-
- if (is_list) {
- for (iterator = emails; iterator; iterator = iterator->next) {
-
- if (is_hidden) {
- recipient = &(bcc_list->_buffer[bcc_i]);
- ++bcc_i;
- } else {
- recipient = &(to_list->_buffer[to_i]);
- ++to_i;
- }
-
- name = NULL;
- addr = NULL;
- if (iterator && iterator->data) {
- /* XXX we should probably try to get the name from the attribute parameter here.. */
- addr = g_strdup ((char*)iterator->data);
- }
-
- recipient->name = CORBA_string_dup (name ? name : "");
- recipient->address = CORBA_string_dup (addr ? addr : "");
-
- g_free (name);
- g_free (addr);
- }
- }
- else {
- EContactName *contact_name = e_contact_get (contact, E_CONTACT_NAME);
- int length = g_list_length (emails);
-
- if (is_hidden) {
- recipient = &(bcc_list->_buffer[bcc_i]);
- ++bcc_i;
- } else {
- recipient = &(to_list->_buffer[to_i]);
- ++to_i;
- }
-
- if (nth >= length)
- nth = 0;
-
- if (contact_name) {
- name = e_contact_name_to_string (contact_name);
- e_contact_name_free (contact_name);
- }
- else
- name = NULL;
-
- addr = g_strdup (g_list_nth_data (emails, nth));
-
-
- recipient->name = CORBA_string_dup (name ? name : "");
- recipient->address = CORBA_string_dup (addr ? addr : "");
-
- g_free (name);
- g_free (addr);
- }
-
- g_list_foreach (emails, (GFunc)g_free, NULL);
- g_list_free (emails);
- }
-
- c = c->next;
- }
-
- subject = CORBA_string_dup ("");
-
- GNOME_Evolution_Composer_setHeaders (composer_server, "", to_list, cc_list, bcc_list, subject, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_printerr ("gui/e-meeting-edit.c: I couldn't set the composer headers via CORBA! Aagh.\n");
- CORBA_exception_free (&ev);
- return;
- }
-
- CORBA_free (to_list);
- CORBA_free (cc_list);
- CORBA_free (bcc_list);
- CORBA_free (subject);
-
- GNOME_Evolution_Composer_show (composer_server, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_printerr ("gui/e-meeting-edit.c: I couldn't show the composer via CORBA! Aagh.\n");
- CORBA_exception_free (&ev);
- return;
- }
-
- CORBA_exception_free (&ev);
-}
-
-static void
-eab_send_contact_list_as_attachment (GList *contacts)
-{
- GNOME_Evolution_Composer composer_server;
- CORBA_Environment ev;
- CORBA_char *content_type, *filename, *description;
- GNOME_Evolution_Composer_AttachmentData *attach_data;
- CORBA_boolean show_inline;
- char *tempstr;
- GNOME_Evolution_Composer_RecipientList *to_list, *cc_list, *bcc_list;
- CORBA_char *subject;
-
- if (contacts == NULL)
- return;
-
- CORBA_exception_init (&ev);
-
- composer_server = bonobo_activation_activate_from_id (COMPOSER_OAFID, 0, NULL, &ev);
-
-
-
- content_type = CORBA_string_dup ("text/x-vcard");
- filename = CORBA_string_dup ("");
-
- if (contacts->next) {
- description = CORBA_string_dup (_("Multiple VCards"));
- } else {
- char *file_as = e_contact_get (E_CONTACT (contacts->data), E_CONTACT_FILE_AS);
- tempstr = g_strdup_printf (_("VCard for %s"), file_as);
- description = CORBA_string_dup (tempstr);
- g_free (tempstr);
- g_free (file_as);
- }
-
- show_inline = FALSE;
-
- tempstr = eab_contact_list_to_string (contacts);
- attach_data = GNOME_Evolution_Composer_AttachmentData__alloc();
- attach_data->_maximum = attach_data->_length = strlen (tempstr);
- attach_data->_buffer = CORBA_sequence_CORBA_char_allocbuf (attach_data->_length);
- memcpy (attach_data->_buffer, tempstr, attach_data->_length);
- g_free (tempstr);
-
- GNOME_Evolution_Composer_attachData (composer_server,
- content_type, filename, description,
- show_inline, attach_data,
- &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_printerr ("gui/e-meeting-edit.c: I couldn't attach data to the composer via CORBA! Aagh.\n");
- CORBA_exception_free (&ev);
- return;
- }
-
- CORBA_free (content_type);
- CORBA_free (filename);
- CORBA_free (description);
- CORBA_free (attach_data);
-
- to_list = GNOME_Evolution_Composer_RecipientList__alloc ();
- to_list->_maximum = to_list->_length = 0;
-
- cc_list = GNOME_Evolution_Composer_RecipientList__alloc ();
- cc_list->_maximum = cc_list->_length = 0;
-
- bcc_list = GNOME_Evolution_Composer_RecipientList__alloc ();
- bcc_list->_maximum = bcc_list->_length = 0;
-
- if (!contacts || contacts->next) {
- subject = CORBA_string_dup ("Contact information");
- } else {
- EContact *contact = contacts->data;
- const gchar *tempstr2;
-
- tempstr2 = e_contact_get_const (contact, E_CONTACT_FILE_AS);
- if (!tempstr2 || !*tempstr2)
- tempstr2 = e_contact_get_const (contact, E_CONTACT_FULL_NAME);
- if (!tempstr2 || !*tempstr2)
- tempstr2 = e_contact_get_const (contact, E_CONTACT_ORG);
- if (!tempstr2 || !*tempstr2)
- tempstr2 = e_contact_get_const (contact, E_CONTACT_EMAIL_1);
- if (!tempstr2 || !*tempstr2)
- tempstr2 = e_contact_get_const (contact, E_CONTACT_EMAIL_2);
- if (!tempstr2 || !*tempstr2)
- tempstr2 = e_contact_get_const (contact, E_CONTACT_EMAIL_3);
-
- if (!tempstr2 || !*tempstr2)
- tempstr = g_strdup_printf ("Contact information");
- else
- tempstr = g_strdup_printf ("Contact information for %s", tempstr2);
- subject = CORBA_string_dup (tempstr);
- g_free (tempstr);
- }
-
- GNOME_Evolution_Composer_setHeaders (composer_server, "", to_list, cc_list, bcc_list, subject, &ev);
-
- CORBA_free (to_list);
- CORBA_free (cc_list);
- CORBA_free (bcc_list);
- CORBA_free (subject);
-
- GNOME_Evolution_Composer_show (composer_server, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_printerr ("gui/e-meeting-edit.c: I couldn't show the composer via CORBA! Aagh.\n");
- CORBA_exception_free (&ev);
- return;
- }
-
- CORBA_exception_free (&ev);
-}
-
-void
-eab_send_contact_list (GList *contacts, EABDisposition disposition)
-{
- switch (disposition) {
- case EAB_DISPOSITION_AS_TO: {
- GList *list = NULL, *l;
-
- for (l = contacts; l; l = l->next) {
- ContactAndEmailNum *ce = g_new (ContactAndEmailNum, 1);
- ce->contact = l->data;
- ce->email_num = 0; /* hardcode this */
-
- list = g_list_append (list, ce);
- }
-
- eab_send_to_contact_and_email_num_list (list);
-
- g_list_foreach (list, (GFunc)g_free, NULL);
- g_list_free (list);
- break;
- }
- case EAB_DISPOSITION_AS_ATTACHMENT:
- eab_send_contact_list_as_attachment (contacts);
- break;
- }
-}
-
-void
-eab_send_contact (EContact *contact, int email_num, EABDisposition disposition)
-{
- GList *list = NULL;
-
- switch (disposition) {
- case EAB_DISPOSITION_AS_TO: {
- ContactAndEmailNum ce;
-
- ce.contact = contact;
- ce.email_num = email_num;
-
- list = g_list_prepend (NULL, &ce);
- eab_send_to_contact_and_email_num_list (list);
- break;
- }
- case EAB_DISPOSITION_AS_ATTACHMENT: {
- list = g_list_prepend (NULL, contact);
- eab_send_contact_list_as_attachment (list);
- break;
- }
- }
-
- g_list_free (list);
-}
-
-GtkWidget *
-eab_create_image_chooser_widget(gchar *name,
- gchar *string1, gchar *string2,
- gint int1, gint int2)
-{
- char *filename;
- GtkWidget *w = NULL;
-
- w = e_image_chooser_new ();
- gtk_widget_show_all (w);
-
- if (string1) {
- filename = e_icon_factory_get_icon_filename (string1, E_ICON_SIZE_DIALOG);
-
- e_image_chooser_set_from_file (E_IMAGE_CHOOSER (w), filename);
-
- g_free (filename);
- }
-
- return w;
-}
diff --git a/addressbook/gui/widgets/eab-gui-util.h b/addressbook/gui/widgets/eab-gui-util.h
deleted file mode 100644
index 4a3dffba0b..0000000000
--- a/addressbook/gui/widgets/eab-gui-util.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* eab-gui-util.h
- * Copyright (C) 2001-2003 Ximian, Inc.
- * Author: Chris Toshok <toshok@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-#ifndef __E_ADDRESSBOOK_UTIL_H__
-#define __E_ADDRESSBOOK_UTIL_H__
-
-#include <gtk/gtkwindow.h>
-#include <libebook/e-book.h>
-#include "addressbook/gui/contact-editor/e-contact-editor.h"
-#include "addressbook/gui/contact-list-editor/e-contact-list-editor.h"
-
-G_BEGIN_DECLS
-
-void eab_error_dialog (const gchar *msg,
- EBookStatus status);
-void eab_load_error_dialog (GtkWidget *parent,
- ESource *source,
- EBookStatus status);
-void eab_search_result_dialog (GtkWidget *parent,
- EBookViewStatus status);
-gint eab_prompt_save_dialog (GtkWindow *parent);
-
-EContactEditor *eab_show_contact_editor (EBook *book,
- EContact *contact,
- gboolean is_new_contact,
- gboolean editable);
-EContactListEditor *eab_show_contact_list_editor (EBook *book,
- EContact *contact,
- gboolean is_new_contact,
- gboolean editable);
-void eab_show_multiple_contacts (EBook *book,
- GList *list,
- gboolean editable);
-void eab_transfer_contacts (EBook *source,
- GList *contacts, /* adopted */
- gboolean delete_from_source,
- GtkWindow *parent_window);
-
-void eab_contact_save (char *title,
- EContact *contact,
- GtkWindow *parent_window);
-
-void eab_contact_list_save (char *title,
- GList *list,
- GtkWindow *parent_window);
-
-typedef enum {
- EAB_DISPOSITION_AS_ATTACHMENT,
- EAB_DISPOSITION_AS_TO,
-} EABDisposition;
-
-void eab_send_contact (EContact *contact,
- int email_num,
- EABDisposition disposition);
-void eab_send_contact_list (GList *contacts,
- EABDisposition disposition);
-
-GtkWidget *eab_create_image_chooser_widget (gchar *name, gchar *string1, gchar *string2, gint int1, gint int2);
-
-
-ESource *eab_select_source (const gchar *title, const gchar *message,
- const gchar *select_uid, GtkWindow *parent);
-
-G_END_DECLS
-
-#endif /* __E_ADDRESSBOOK_UTIL_H__ */
diff --git a/addressbook/gui/widgets/eab-marshal.list b/addressbook/gui/widgets/eab-marshal.list
deleted file mode 100644
index 2b34707dbb..0000000000
--- a/addressbook/gui/widgets/eab-marshal.list
+++ /dev/null
@@ -1,11 +0,0 @@
-INT:POINTER
-NONE:NONE
-NONE:BOOL
-NONE:POINTER
-NONE:OBJECT
-NONE:ENUM
-NONE:INT,INT
-NONE:INT
-NONE:UINT
-NONE:DOUBLE
-INT:POINTER
diff --git a/addressbook/gui/widgets/eab-menu.c b/addressbook/gui/widgets/eab-menu.c
deleted file mode 100644
index fd6c94c81e..0000000000
--- a/addressbook/gui/widgets/eab-menu.c
+++ /dev/null
@@ -1,258 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Michael Zucchi <notzed@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <stdlib.h>
-
-#include <glib.h>
-
-#include <libebook/e-contact.h>
-
-#include "eab-menu.h"
-
-static void eabm_standard_menu_factory(EMenu *emp, void *data);
-
-static GObjectClass *eabm_parent;
-
-static void
-eabm_init(GObject *o)
-{
- /*EABMenu *emp = (EABMenu *)o; */
-}
-
-static void
-eabm_finalise(GObject *o)
-{
- ((GObjectClass *)eabm_parent)->finalize(o);
-}
-
-static void
-eabm_target_free(EMenu *ep, EMenuTarget *t)
-{
- switch (t->type) {
- case EAB_MENU_TARGET_SELECT: {
- EABMenuTargetSelect *s = (EABMenuTargetSelect *)t;
- int i;
-
- for (i=0;i<s->cards->len;i++)
- g_object_unref(s->cards->pdata[i]);
- g_ptr_array_free(s->cards, TRUE);
- if (s->book)
- g_object_unref(s->book);
- break; }
- }
-
- ((EMenuClass *)eabm_parent)->target_free(ep, t);
-}
-
-static void
-eabm_class_init(GObjectClass *klass)
-{
- klass->finalize = eabm_finalise;
- ((EMenuClass *)klass)->target_free = eabm_target_free;
-
- e_menu_class_add_factory((EMenuClass *)klass, NULL, (EMenuFactoryFunc)eabm_standard_menu_factory, NULL);
-}
-
-GType
-eab_menu_get_type(void)
-{
- static GType type = 0;
-
- if (type == 0) {
- static const GTypeInfo info = {
- sizeof(EABMenuClass),
- NULL, NULL,
- (GClassInitFunc)eabm_class_init,
- NULL, NULL,
- sizeof(EABMenu), 0,
- (GInstanceInitFunc)eabm_init
- };
- eabm_parent = g_type_class_ref(e_menu_get_type());
- type = g_type_register_static(e_menu_get_type(), "EABMenu", &info, 0);
- }
-
- return type;
-}
-
-EABMenu *eab_menu_new(const char *menuid)
-{
- EABMenu *emp = g_object_new(eab_menu_get_type(), 0);
-
- e_menu_construct(&emp->menu, menuid);
-
- return emp;
-}
-
-/**
- * eab_menu_target_new_select - create a menu target of the current selection.
- * @eabp: Address book menu.
- * @book: Book the cards belong to. May be NULL in which case cards must be an empty GPtrArray.
- * @readonly: Book is read-only mode. FIXME: Why can't we just get this off the book?
- * @cards: Cards selected. This will be freed on completion and the array indices unreferenced.
- *
- * Create a new selection menu target.
- *
- * Return value:
- **/
-EABMenuTargetSelect *
-eab_menu_target_new_select(EABMenu *eabp, struct _EBook *book, int readonly, GPtrArray *cards)
-{
- EABMenuTargetSelect *t = e_menu_target_new(&eabp->menu, EAB_MENU_TARGET_SELECT, sizeof(*t));
- guint32 mask = ~0;
- int has_email = FALSE, i;
-
- /* FIXME: duplicated in eab-popup.c */
-
- t->book = book;
- if (book)
- g_object_ref(book);
- t->cards = cards;
-
- for (i=0;i<cards->len && !has_email;i++) {
- EContact *contact = cards->pdata[i];
- GList *email;
-
- email = e_contact_get(E_CONTACT(contact), E_CONTACT_EMAIL);
- if (email) {
- has_email = TRUE;
-
- g_list_foreach(email, (GFunc)g_free, NULL);
- g_list_free(email);
- }
- }
-
- if (has_email)
- mask &= ~EAB_MENU_SELECT_EMAIL;
-
- if (!readonly)
- mask &= ~EAB_MENU_SELECT_EDITABLE;
-
- if (cards->len == 1)
- mask &= ~EAB_MENU_SELECT_ONE;
-
- if (cards->len > 1)
- mask &= ~EAB_MENU_SELECT_MANY;
-
- if (cards->len >= 1)
- mask &= ~EAB_MENU_SELECT_ANY;
-
- t->target.mask = mask;
-
- return t;
-}
-
-static void
-eabm_standard_menu_factory(EMenu *emp, void *data)
-{
- /* noop */
-}
-
-/* ********************************************************************** */
-
-/* menu plugin handler */
-
-/*
-<e-plugin
- class="org.gnome.mail.plugin.popup:1.0"
- id="org.gnome.mail.plugin.popup.item:1.0"
- type="shlib"
- location="/opt/gnome2/lib/camel/1.0/libcamelimap.so"
- name="imap"
- description="IMAP4 and IMAP4v1 mail store">
- <hook class="org.gnome.mail.popupMenu:1.0"
- handler="HandlePopup">
- <menu id="any" target="select">
- <item
- type="item|toggle|radio|image|submenu|bar"
- active
- path="foo/bar"
- label="label"
- icon="foo"
- mask="select_one"
- activate="eabm_view_emacs"/>
- </menu>
- </extension>
-
-*/
-
-static void *eabmph_parent_class;
-#define eabmph ((EABMenuHook *)eph)
-
-static const EMenuHookTargetMask eabmph_select_masks[] = {
- { "one", EAB_MENU_SELECT_ONE },
- { "many", EAB_MENU_SELECT_MANY },
- { "any", EAB_MENU_SELECT_ANY },
- { "editable", EAB_MENU_SELECT_EDITABLE },
- { "email", EAB_MENU_SELECT_EMAIL },
- { 0 }
-};
-
-static const EMenuHookTargetMap eabmph_targets[] = {
- { "select", EAB_MENU_TARGET_SELECT, eabmph_select_masks },
- { 0 }
-};
-
-static void
-eabmph_finalise(GObject *o)
-{
- /*EPluginHook *eph = (EPluginHook *)o;*/
-
- ((GObjectClass *)eabmph_parent_class)->finalize(o);
-}
-
-static void
-eabmph_class_init(EPluginHookClass *klass)
-{
- int i;
-
- ((GObjectClass *)klass)->finalize = eabmph_finalise;
- ((EPluginHookClass *)klass)->id = "org.gnome.evolution.addressbook.bonobomenu:1.0";
-
- for (i=0;eabmph_targets[i].type;i++)
- e_menu_hook_class_add_target_map((EMenuHookClass *)klass, &eabmph_targets[i]);
-
- /* FIXME: leaks parent set class? */
- ((EMenuHookClass *)klass)->menu_class = g_type_class_ref(eab_menu_get_type());
-}
-
-GType
-eab_menu_hook_get_type(void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof(EABMenuHookClass), NULL, NULL, (GClassInitFunc) eabmph_class_init, NULL, NULL,
- sizeof(EABMenuHook), 0, (GInstanceInitFunc) NULL,
- };
-
- eabmph_parent_class = g_type_class_ref(e_menu_hook_get_type());
- type = g_type_register_static(e_menu_hook_get_type(), "EABMenuHook", &info, 0);
- }
-
- return type;
-}
diff --git a/addressbook/gui/widgets/eab-menu.h b/addressbook/gui/widgets/eab-menu.h
deleted file mode 100644
index 0427d43fe1..0000000000
--- a/addressbook/gui/widgets/eab-menu.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Authors: Michel Zucchi <notzed@ximian.com>
- *
- * Copyright 2004 Novell Inc. (www.novell.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifndef __EAB_MENU_H__
-#define __EAB_MENU_H__
-
-#include <glib-object.h>
-
-#include "e-util/e-menu.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-struct _EBook;
-
-typedef struct _EABMenu EABMenu;
-typedef struct _EABMenuClass EABMenuClass;
-
-/* Current target description */
-enum _eab_menu_target_t {
- EAB_MENU_TARGET_SELECT,
-};
-
-/**
- * enum _eab_menu_target_select_t - EABMenuTargetSelect qualifiers.
- *
- * @EAB_MENU_SELECT_ONE: Only one item is selected.
- * @EAB_MENU_SELECT_MANY: More than one item selected.
- * @EAB_MENU_SELECT_ANY: One or more items selected.
- * @EAB_MENU_SELECT_EDITABLE: Editable addressbook.
- * @EAB_MENU_SELECT_EMAIL: Has an email address.
- **/
-enum _eab_menu_target_select_t {
- EAB_MENU_SELECT_ONE = 1<<0,
- EAB_MENU_SELECT_MANY = 1<<1,
- EAB_MENU_SELECT_ANY = 1<<2,
- EAB_MENU_SELECT_EDITABLE = 1<<3,
- EAB_MENU_SELECT_EMAIL = 1<<4,
-};
-
-typedef struct _EABMenuTargetSelect EABMenuTargetSelect;
-
-struct _EABMenuTargetSelect {
- EMenuTarget target;
-
- struct _EBook *book;
- GPtrArray *cards;
-};
-
-typedef struct _EMenuItem EABMenuItem;
-
-/* The object */
-struct _EABMenu {
- EMenu menu;
-
- struct _EABMenuPrivate *priv;
-};
-
-struct _EABMenuClass {
- EMenuClass menu_class;
-};
-
-GType eab_menu_get_type(void);
-
-EABMenu *eab_menu_new(const char *menuid);
-
-EABMenuTargetSelect *eab_menu_target_new_select(EABMenu *eabp, struct _EBook *book, int readonly, GPtrArray *cards);
-
-/* ********************************************************************** */
-
-typedef struct _EABMenuHook EABMenuHook;
-typedef struct _EABMenuHookClass EABMenuHookClass;
-
-struct _EABMenuHook {
- EMenuHook hook;
-};
-
-struct _EABMenuHookClass {
- EMenuHookClass hook_class;
-};
-
-GType eab_menu_hook_get_type(void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __EAB_MENU_H__ */
diff --git a/addressbook/gui/widgets/eab-popup-control.c b/addressbook/gui/widgets/eab-popup-control.c
deleted file mode 100644
index 1ff1544958..0000000000
--- a/addressbook/gui/widgets/eab-popup-control.c
+++ /dev/null
@@ -1,1174 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * eab-popup-control.c
- *
- * Copyright (C) 2001-2003, Ximian, Inc.
- *
- * Authors: Jon Trowbridge <trow@ximian.com>
- * Chris Toshok <toshok@ximian.com>
- */
-
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA.
- */
-
-/*
- * This file is too big and this widget is too complicated. Forgive me.
- */
-
-#include <config.h>
-#include <string.h>
-#include "addressbook.h"
-#include "eab-popup-control.h"
-#include <gtk/gtkbutton.h>
-#include <gtk/gtkcellrenderertext.h>
-#include <gtk/gtkframe.h>
-#include <gtk/gtkhbbox.h>
-#include <gtk/gtkhseparator.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkoptionmenu.h>
-#include <gtk/gtkstock.h>
-#include <gtk/gtktable.h>
-#include <gtk/gtktreeselection.h>
-#include <gtk/gtktreeview.h>
-#include <gtk/gtkvbox.h>
-#include <bonobo/bonobo-control.h>
-#include <bonobo/bonobo-property-bag.h>
-#include <bonobo/bonobo-generic-factory.h>
-#include <addressbook/util/eab-book-util.h>
-#include <addressbook/gui/contact-editor/e-contact-editor.h>
-#include <addressbook/gui/contact-editor/e-contact-quick-add.h>
-#include <addressbook/gui/widgets/eab-contact-display.h>
-#include <addressbook/gui/widgets/eab-gui-util.h>
-#include "e-util/e-gui-utils.h"
-
-static void eab_popup_control_set_name (EABPopupControl *pop, const gchar *name);
-static void eab_popup_control_set_email (EABPopupControl *pop, const gchar *email);
-
-/*
- * Some general scaffolding for our widgets. Think of this as a really, really
- * lame implementation of a wizard (...which is still somewhat more general that
- * we really need it to be).
- */
-
-typedef struct _MiniWizard MiniWizard;
-struct _MiniWizard {
- GtkWidget *body;
-
- GtkWidget *vbox;
- GtkWidget *ok_button;
- GtkWidget *cancel_button;
-
- void (*ok_cb) (MiniWizard *, gpointer);
- void (*cleanup_cb) (gpointer);
- gpointer closure;
-
- void (*destroy_cb) (MiniWizard *, gpointer);
- gpointer destroy_closure;
-};
-
-static void
-mini_wizard_container_add (MiniWizard *wiz, GtkWidget *w)
-{
- GList *iter = gtk_container_get_children (GTK_CONTAINER (wiz->vbox));
- while (iter != NULL) {
- GtkWidget *oldw = (GtkWidget *) iter->data;
- iter = g_list_next (iter);
- gtk_container_remove (GTK_CONTAINER (wiz->vbox), oldw);
- }
- gtk_container_add (GTK_CONTAINER (wiz->vbox), w);
-}
-
-static void
-mini_wizard_destroy (MiniWizard *wiz)
-{
- if (wiz->cleanup_cb)
- wiz->cleanup_cb (wiz->closure);
- wiz->cleanup_cb = NULL;
-
- if (wiz->destroy_cb)
- wiz->destroy_cb (wiz, wiz->destroy_closure);
-}
-
-static void
-mini_wizard_ok_cb (GtkWidget *b, gpointer closure)
-{
- MiniWizard *wiz = (MiniWizard *) closure;
-
- gpointer old_closure = wiz->closure;
- void (*old_cleanup) (gpointer) = wiz->cleanup_cb;
-
- wiz->cleanup_cb = NULL;
-
- if (wiz->ok_cb)
- wiz->ok_cb (wiz, wiz->closure);
-
- if (old_cleanup)
- old_cleanup (old_closure);
-
-}
-
-static void
-mini_wizard_cancel_cb (GtkWidget *b, gpointer closure)
-{
- mini_wizard_destroy ((MiniWizard *) closure);
-}
-
-static void
-mini_wizard_destroy_cb (gpointer closure, GObject *where_object_was)
-{
- MiniWizard *wiz = (MiniWizard *) closure;
- if (wiz->cleanup_cb)
- wiz->cleanup_cb (wiz->closure);
- g_free (wiz);
-}
-
-static MiniWizard *
-mini_wizard_new (void)
-{
- MiniWizard *wiz = g_new (MiniWizard, 1);
- GtkWidget *bbox;
-
- wiz->body = gtk_vbox_new (FALSE, 2);
- wiz->vbox = gtk_vbox_new (FALSE, 2);
- wiz->ok_button = gtk_button_new_from_stock (GTK_STOCK_OK);
- wiz->cancel_button = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
-
- wiz->ok_cb = NULL;
- wiz->cleanup_cb = NULL;
- wiz->closure = NULL;
-
- wiz->destroy_cb = NULL;
- wiz->destroy_closure = NULL;
-
- bbox = gtk_hbutton_box_new ();
- gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox),
- GTK_BUTTONBOX_END);
-
- gtk_box_pack_start (GTK_BOX (bbox), wiz->cancel_button, FALSE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (bbox), wiz->ok_button, FALSE, TRUE, 0);
-
- gtk_box_set_spacing (GTK_BOX (bbox),
- 10 /* ugh */);
-
- gtk_box_pack_start (GTK_BOX (wiz->body), wiz->vbox, TRUE, TRUE, 2);
- gtk_box_pack_start (GTK_BOX (wiz->body), gtk_hseparator_new (), FALSE, TRUE, 2);
- gtk_box_pack_start (GTK_BOX (wiz->body), bbox, FALSE, TRUE, 2);
-
- gtk_widget_show_all (wiz->body);
-
- g_signal_connect (wiz->ok_button,
- "clicked",
- G_CALLBACK (mini_wizard_ok_cb),
- wiz);
- g_signal_connect (wiz->cancel_button,
- "clicked",
- G_CALLBACK (mini_wizard_cancel_cb),
- wiz);
-
- g_object_weak_ref (G_OBJECT (wiz->body),
- mini_wizard_destroy_cb,
- wiz);
-
- return wiz;
-
-}
-
-
-
-/*
- * This is the code for the UI thingie that lets you manipulate the e-mail
- * addresses (and *only* the e-mail addresses) associated with an existing
- * contact.
- */
-
-#define EMPTY_ENTRY _("(none)")
-
-typedef struct _EMailMenu EMailMenu;
-struct _EMailMenu {
- GtkWidget *option_menu;
- GList *options;
- gchar *current_selection;
-};
-
-static void
-email_menu_free (EMailMenu *menu)
-{
- if (menu == NULL)
- return;
-
- g_list_foreach (menu->options, (GFunc) g_free, NULL);
- g_list_free (menu->options);
- g_free (menu);
-}
-
-static EMailMenu *
-email_menu_new (void)
-{
- EMailMenu *menu = g_new (EMailMenu, 1);
-
- menu->option_menu = gtk_option_menu_new ();
- menu->options = NULL;
- menu->current_selection = NULL;
-
- gtk_option_menu_set_menu (GTK_OPTION_MENU (menu->option_menu), gtk_menu_new ());
-
- return menu;
-}
-
-static void
-menu_activate_cb (GtkWidget *w, gpointer closure)
-{
- EMailMenu *menu = (EMailMenu *) closure;
- gchar *addr = (gchar *) g_object_get_data (G_OBJECT (w), "addr");
-
- menu->current_selection = addr;
-}
-
-static void
-email_menu_add_option (EMailMenu *menu, char *addr)
-{
- GtkWidget *menu_item;
-
- g_return_if_fail (menu != NULL);
- if (!addr || !*addr)
- return;
-
- menu->options = g_list_append (menu->options, addr);
-
- menu_item = gtk_menu_item_new_with_label (addr);
- g_object_set_data (G_OBJECT (menu_item), "addr", addr);
- gtk_widget_show_all (menu_item);
- gtk_menu_shell_append (GTK_MENU_SHELL (gtk_option_menu_get_menu (GTK_OPTION_MENU (menu->option_menu))), menu_item);
-
- g_signal_connect (menu_item,
- "activate",
- G_CALLBACK (menu_activate_cb),
- menu);
-}
-
-static void
-email_menu_add_options_from_contact (EMailMenu *menu, EContact *contact, const gchar *extra_addr)
-{
- g_return_if_fail (contact && E_IS_CONTACT (contact));
-
- /* If any of these three e-mail fields are NULL, email_menu_add_option will just
- return without doing anything. */
- email_menu_add_option (menu, e_contact_get (contact, E_CONTACT_EMAIL_1));
- email_menu_add_option (menu, e_contact_get (contact, E_CONTACT_EMAIL_2));
- email_menu_add_option (menu, e_contact_get (contact, E_CONTACT_EMAIL_3));
- email_menu_add_option (menu, g_strdup (extra_addr));
- email_menu_add_option (menu, g_strdup (EMPTY_ENTRY));
-}
-
-static void
-email_menu_set_option (EMailMenu *menu, const gchar *addr)
-{
- guint count = 0;
- GList *iter;
-
- g_return_if_fail (menu != NULL);
-
- if (addr == NULL) {
- email_menu_set_option (menu, EMPTY_ENTRY);
- return;
- }
-
- iter = menu->options;
- while (iter && strcmp (addr, (gchar *) iter->data)) {
- ++count;
- iter = g_list_next (iter);
- }
-
- if (iter) {
- gtk_option_menu_set_history (GTK_OPTION_MENU (menu->option_menu), count);
- menu->current_selection = (gchar *) iter->data;
- }
-}
-
-typedef struct _EMailTable EMailTable;
-struct _EMailTable {
- GtkWidget *table;
- EContact *contact;
- EMailMenu *primary;
- EMailMenu *email2;
- EMailMenu *email3;
-};
-
-static void
-email_table_cleanup_cb (gpointer closure)
-{
- EMailTable *et = (EMailTable *) closure;
-
- if (et == NULL)
- return;
-
- g_object_unref (et->contact);
- email_menu_free (et->primary);
- email_menu_free (et->email2);
- email_menu_free (et->email3);
-
- g_free (et);
-}
-
-static void
-email_table_from_contact (EMailTable *et)
-{
- g_return_if_fail (et != NULL);
-
- email_menu_set_option (et->primary, e_contact_get_const (et->contact, E_CONTACT_EMAIL_1));
- email_menu_set_option (et->email2, e_contact_get_const (et->contact, E_CONTACT_EMAIL_2));
- email_menu_set_option (et->email3, e_contact_get_const (et->contact, E_CONTACT_EMAIL_3));
-}
-
-static void
-email_table_to_contact (EMailTable *et)
-{
- gchar *curr;
-
- g_return_if_fail (et != NULL);
-
- curr = et->primary->current_selection;
- if (curr && !strcmp (curr, _(EMPTY_ENTRY)))
- curr = NULL;
- e_contact_set (et->contact, E_CONTACT_EMAIL_1, curr);
-
- curr = et->email2->current_selection;
- if (curr && !strcmp (curr, _(EMPTY_ENTRY)))
- curr = NULL;
- e_contact_set (et->contact, E_CONTACT_EMAIL_2, curr);
-
- curr = et->email3->current_selection;
- if (curr && !strcmp (curr, _(EMPTY_ENTRY)))
- curr = NULL;
- e_contact_set (et->contact, E_CONTACT_EMAIL_3, curr);
-}
-
-static void
-email_table_save_contact_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- EContact *contact = E_CONTACT (closure);
-
- if (status == E_BOOK_ERROR_OK) {
- e_book_async_commit_contact (book, contact, NULL, NULL);
- }
- if (book)
- g_object_unref (book);
- g_object_unref (contact);
-}
-
-static void
-email_table_ok_cb (MiniWizard *wiz, gpointer closure)
-{
- EMailTable *et = (EMailTable *) closure;
-
- email_table_to_contact (et);
-
- g_object_ref (et->contact);
-
- addressbook_load_default_book (email_table_save_contact_cb, et->contact);
-
- mini_wizard_destroy (wiz);
-}
-
-static void
-email_table_init (MiniWizard *wiz, EContact *contact, const gchar *extra_address)
-{
- EMailTable *et;
-
- gchar *name_str;
- gint xpad, ypad;
- GtkAttachOptions label_x_opts, label_y_opts;
- GtkAttachOptions menu_x_opts, menu_y_opts;
-
- g_return_if_fail (contact && E_IS_CONTACT (contact));
-
- et = g_new (EMailTable, 1);
-
- et->contact = contact;
- g_object_ref (et->contact);
-
- et->table = gtk_table_new (4, 2, FALSE);
-
- et->primary = email_menu_new ();
- et->email2 = email_menu_new ();
- et->email3 = email_menu_new ();
-
- email_menu_add_options_from_contact (et->primary, et->contact, extra_address);
- email_menu_add_options_from_contact (et->email2, et->contact, extra_address);
- email_menu_add_options_from_contact (et->email3, et->contact, extra_address);
-
- email_table_from_contact (et);
-
- label_x_opts = GTK_FILL;
- label_y_opts = GTK_FILL;
- menu_x_opts = GTK_EXPAND | GTK_FILL;
- menu_y_opts = GTK_EXPAND | GTK_FILL;
- xpad = 3;
- ypad = 3;
-
- name_str = e_contact_get (et->contact, E_CONTACT_FULL_NAME);
- gtk_table_attach (GTK_TABLE (et->table),
- gtk_label_new (name_str),
- 0, 2, 0, 1,
- label_x_opts, label_y_opts, xpad, ypad);
- g_free (name_str);
-
- gtk_table_attach (GTK_TABLE (et->table),
- gtk_label_new (_("Primary Email")),
- 0, 1, 1, 2,
- label_x_opts, label_y_opts, xpad, ypad);
-
- gtk_table_attach (GTK_TABLE (et->table),
- et->primary->option_menu,
- 1, 2, 1, 2,
- menu_x_opts, menu_y_opts, xpad, ypad);
-
- gtk_table_attach (GTK_TABLE (et->table),
- gtk_label_new (_("Email 2")),
- 0, 1, 2, 3,
- label_x_opts, label_y_opts, xpad, ypad);
-
- gtk_table_attach (GTK_TABLE (et->table),
- et->email2->option_menu,
- 1, 2, 2, 3,
- menu_x_opts, menu_y_opts, xpad, ypad);
-
- gtk_table_attach (GTK_TABLE (et->table),
- gtk_label_new (_("Email 3")),
- 0, 1, 3, 4,
- label_x_opts, label_y_opts, xpad, ypad);
-
- gtk_table_attach (GTK_TABLE (et->table),
- et->email3->option_menu,
- 1, 2, 3, 4,
- menu_x_opts, menu_y_opts, xpad, ypad);
-
- gtk_widget_show_all (et->primary->option_menu);
- gtk_widget_show_all (et->email2->option_menu);
- gtk_widget_show_all (et->email3->option_menu);
-
- gtk_widget_show_all (et->table);
- mini_wizard_container_add (wiz, et->table);
- wiz->ok_cb = email_table_ok_cb;
- wiz->cleanup_cb = email_table_cleanup_cb;
- wiz->closure = et;
-}
-
-/*
- * This code is for the little UI thing that lets you pick from a set of contacts
- * and decide which one you want to add the e-mail address to.
- */
-
-typedef struct _ContactPicker ContactPicker;
-struct _ContactPicker {
- GtkWidget *body;
- GtkWidget *list;
- GtkListStore *model;
- GList *contacts;
- gchar *new_name;
- gchar *new_email;
-
- EContact *current_contact;
-};
-
-enum {
- COLUMN_ACTION,
- COLUMN_CONTACT
-};
-
-static void
-contact_picker_selection_changed (GtkTreeSelection *selection, gpointer closure)
-{
- MiniWizard *wiz = (MiniWizard *) closure;
- ContactPicker *pick = (ContactPicker *) wiz->closure;
- gboolean selected;
- GtkTreeIter iter;
-
- selected = gtk_tree_selection_get_selected (selection, NULL, &iter);
-
- gtk_widget_set_sensitive (wiz->ok_button, selected);
-
- if (selected) {
- gtk_tree_model_get (GTK_TREE_MODEL (pick->model), &iter,
- COLUMN_CONTACT, &pick->current_contact,
- -1);
- }
- else {
- pick->current_contact = NULL;
- }
-}
-
-static void
-contact_picker_ok_cb (MiniWizard *wiz, gpointer closure)
-{
- ContactPicker *pick = (ContactPicker *) closure;
-
- if (pick->current_contact == NULL) {
- e_contact_quick_add (pick->new_name, pick->new_email, NULL, NULL);
- mini_wizard_destroy (wiz);
- } else {
- email_table_init (wiz, pick->current_contact, pick->new_email);
- }
-}
-
-static void
-contact_picker_cleanup_cb (gpointer closure)
-{
- ContactPicker *pick = (ContactPicker *) closure;
-
- g_list_foreach (pick->contacts, (GFunc) g_object_unref, NULL);
- g_list_free (pick->contacts);
-
- g_free (pick->new_name);
- g_free (pick->new_email);
-}
-
-static void
-free_str (gpointer data,
- GObject *where_the_object_was)
-{
- g_free (data);
-}
-
-static void
-contact_picker_init (MiniWizard *wiz, const GList *contacts, const gchar *new_name, const gchar *new_email)
-{
- ContactPicker *pick;
- gchar *str;
- GtkWidget *w;
- GtkTreeIter iter;
-
- pick = g_new (ContactPicker, 1);
-
- pick->body = gtk_vbox_new (FALSE, 2);
-
- pick->model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER);
-
- pick->list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (pick->model));
-
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (pick->list), TRUE);
-
- gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (pick->list),
- COLUMN_ACTION,
- _("Select an Action"),
- gtk_cell_renderer_text_new (),
- "text", COLUMN_ACTION,
- NULL);
-
- gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (pick->list)),
- GTK_SELECTION_SINGLE);
-
- str = g_strdup_printf (_("Create a new contact \"%s\""), new_name);
- gtk_list_store_append (pick->model, &iter);
- gtk_list_store_set (pick->model, &iter,
- COLUMN_ACTION, str,
- COLUMN_CONTACT, NULL,
- -1);
- g_object_weak_ref (G_OBJECT (pick->model), free_str, str);
-
- pick->contacts = NULL;
- while (contacts) {
- EContact *contact = (EContact *) contacts->data;
- gchar *name_str = e_contact_get (contact, E_CONTACT_FULL_NAME);
-
- pick->contacts = g_list_append (pick->contacts, contact);
- g_object_ref (contact);
-
- str = g_strdup_printf (_("Add address to existing contact \"%s\""), name_str);
- gtk_list_store_append (pick->model, &iter);
- gtk_list_store_set (pick->model, &iter,
- COLUMN_ACTION, str,
- COLUMN_CONTACT, contact,
- -1);
- g_free (name_str);
-
- g_object_weak_ref (G_OBJECT (pick->model), free_str, str);
-
- contacts = g_list_next (contacts);
- }
-
- pick->new_name = g_strdup (new_name);
- pick->new_email = g_strdup (new_email);
-
- pick->current_contact = NULL;
- gtk_widget_set_sensitive (wiz->ok_button, FALSE);
-
- /* Connect some signals & callbacks */
-
- wiz->ok_cb = contact_picker_ok_cb;
- wiz->cleanup_cb = contact_picker_cleanup_cb;
-
- g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (pick->list)),
- "changed", G_CALLBACK (contact_picker_selection_changed),
- wiz);
-
- /* Build our widget */
-
- w = gtk_label_new (new_email);
- gtk_box_pack_start (GTK_BOX (pick->body), w, FALSE, TRUE, 3);
-
- gtk_box_pack_start (GTK_BOX (pick->body), pick->list, TRUE, TRUE, 2);
- gtk_widget_show_all (pick->body);
-
-
- /* Put it in our mini-wizard */
-
- wiz->closure = pick;
- mini_wizard_container_add (wiz, pick->body);
-}
-
-/* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */
-
-/*
- * The code for the actual EABPopupControl widget begins here.
- */
-
-/* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */
-
-
-static GtkObjectClass *parent_class;
-
-static void eab_popup_control_dispose (GObject *);
-static void eab_popup_control_query (EABPopupControl *);
-
-
-static void
-eab_popup_control_class_init (EABPopupControlClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_peek_parent (klass);
-
- object_class->dispose = eab_popup_control_dispose;
-}
-
-static void
-eab_popup_control_init (EABPopupControl *pop)
-{
- pop->transitory = TRUE;
-}
-
-static void
-eab_popup_control_cleanup (EABPopupControl *pop)
-{
- if (pop->contact) {
- g_object_unref (pop->contact);
- pop->contact = NULL;
- }
-
- if (pop->scheduled_refresh) {
- g_source_remove (pop->scheduled_refresh);
- pop->scheduled_refresh = 0;
- }
-
- if (pop->query_tag) {
-#if notyet
- e_book_simple_query_cancel (pop->book, pop->query_tag);
-#endif
- pop->query_tag = 0;
- }
-
- if (pop->book) {
- g_object_unref (pop->book);
- pop->book = NULL;
- }
-
- g_free (pop->name);
- pop->name = NULL;
-
- g_free (pop->email);
- pop->email = NULL;
-}
-
-static void
-eab_popup_control_dispose (GObject *obj)
-{
- EABPopupControl *pop = EAB_POPUP_CONTROL (obj);
-
- eab_popup_control_cleanup (pop);
-
- if (G_OBJECT_CLASS (parent_class)->dispose)
- G_OBJECT_CLASS (parent_class)->dispose (obj);
-}
-
-GType
-eab_popup_control_get_type (void)
-{
- static GType pop_type = 0;
-
- if (!pop_type) {
- static const GTypeInfo pop_info = {
- sizeof (EABPopupControlClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) eab_popup_control_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EABPopupControl),
- 0, /* n_preallocs */
- (GInstanceInitFunc) eab_popup_control_init,
- };
-
- pop_type = g_type_register_static (gtk_event_box_get_type (), "EABPopupControl", &pop_info, 0);
- }
-
- return pop_type;
-}
-
-static void
-eab_popup_control_refresh_names (EABPopupControl *pop)
-{
- if (pop->name_widget) {
- if (pop->name && *pop->name) {
- gtk_label_set_text (GTK_LABEL (pop->name_widget), pop->name);
- gtk_widget_show (pop->name_widget);
- } else {
- gtk_widget_hide (pop->name_widget);
- }
- }
-
- if (pop->email_widget) {
- if (pop->email && *pop->email) {
- gtk_label_set_text (GTK_LABEL (pop->email_widget), pop->email);
- gtk_widget_show (pop->email_widget);
- } else {
- gtk_widget_hide (pop->email_widget);
- }
- }
-
- eab_popup_control_query (pop);
-}
-
-static gint
-refresh_timeout_cb (gpointer ptr)
-{
- EABPopupControl *pop = EAB_POPUP_CONTROL (ptr);
- eab_popup_control_refresh_names (pop);
- pop->scheduled_refresh = 0;
- return 0;
-}
-
-static void
-eab_popup_control_schedule_refresh (EABPopupControl *pop)
-{
- if (pop->scheduled_refresh == 0)
- pop->scheduled_refresh = g_timeout_add (20, refresh_timeout_cb, pop);
-}
-
-/* If we are handed something of the form "Foo <bar@bar.com>",
- do the right thing. */
-static gboolean
-eab_popup_control_set_free_form (EABPopupControl *pop, const gchar *txt)
-{
- gchar *lt, *gt = NULL;
-
- g_return_val_if_fail (pop && EAB_IS_POPUP_CONTROL (pop), FALSE);
-
- if (txt == NULL)
- return FALSE;
-
- lt = strchr (txt, '<');
- if (lt)
- gt = strchr (txt, '>');
-
- if (lt && gt && lt+1 < gt) {
- gchar *name = g_strndup (txt, lt-txt);
- gchar *email = g_strndup (lt+1, gt-lt-1);
- eab_popup_control_set_name (pop, name);
- eab_popup_control_set_email (pop, email);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-eab_popup_control_set_name (EABPopupControl *pop, const gchar *name)
-{
- g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop));
-
- /* We only allow the name to be set once. */
- if (pop->name)
- return;
-
- if (!eab_popup_control_set_free_form (pop, name)) {
- pop->name = g_strdup (name);
- if (pop->name)
- g_strstrip (pop->name);
- }
-
- eab_popup_control_schedule_refresh (pop);
-}
-
-static void
-eab_popup_control_set_email (EABPopupControl *pop, const gchar *email)
-{
- g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop));
-
- /* We only allow the e-mail to be set once. */
- if (pop->email)
- return;
-
- if (!eab_popup_control_set_free_form (pop, email)) {
- pop->email = g_strdup (email);
- if (pop->email)
- g_strstrip (pop->email);
- }
-
- eab_popup_control_schedule_refresh (pop);
-}
-
-void
-eab_popup_control_construct (EABPopupControl *pop)
-{
- GtkWidget *vbox, *name_holder;
- GdkColor color = { 0x0, 0xffff, 0xffff, 0xffff };
-
- g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop));
-
- pop->main_vbox = gtk_vbox_new (FALSE, 0);
-
- /* Build Generic View */
-
- name_holder = gtk_event_box_new ();
- vbox = gtk_vbox_new (FALSE, 2);
- pop->name_widget = gtk_label_new ("");
- pop->email_widget = gtk_label_new ("");
-
- gtk_box_pack_start (GTK_BOX (vbox), pop->name_widget, TRUE, TRUE, 2);
- gtk_box_pack_start (GTK_BOX (vbox), pop->email_widget, TRUE, TRUE, 2);
- gtk_container_add (GTK_CONTAINER (name_holder), GTK_WIDGET (vbox));
-
- if (gdk_colormap_alloc_color (gtk_widget_get_colormap (GTK_WIDGET (name_holder)), &color, FALSE, TRUE)) {
- GtkStyle *style = gtk_style_copy (gtk_widget_get_style (GTK_WIDGET (name_holder)));
- style->bg[0] = color;
- gtk_widget_set_style (GTK_WIDGET (name_holder), style);
- g_object_unref (style);
- }
-
- pop->generic_view = gtk_frame_new (NULL);
- gtk_container_add (GTK_CONTAINER (pop->generic_view), name_holder);
- gtk_box_pack_start (GTK_BOX (pop->main_vbox), pop->generic_view, TRUE, TRUE, 0);
- gtk_widget_show_all (pop->generic_view);
-
- pop->query_msg = gtk_label_new (_("Querying Address Book..."));
- gtk_box_pack_start (GTK_BOX (pop->main_vbox), pop->query_msg, TRUE, TRUE, 0);
- gtk_widget_show (pop->query_msg);
-
- /* Build ContactDisplay */
- pop->contact_display = eab_contact_display_new ();
- gtk_box_pack_start (GTK_BOX (pop->main_vbox), pop->contact_display, TRUE, TRUE, 0);
-
-
- /* Final assembly */
-
- gtk_container_add (GTK_CONTAINER (pop), pop->main_vbox);
- gtk_widget_show (pop->main_vbox);
-
- gtk_container_set_border_width (GTK_CONTAINER (vbox), 3);
- gtk_container_set_border_width (GTK_CONTAINER (pop), 2);
-}
-
-static GtkWidget *
-eab_popup_new (void)
-{
- EABPopupControl *pop = g_object_new (EAB_TYPE_POPUP_CONTROL, NULL);
- eab_popup_control_construct (pop);
- return GTK_WIDGET (pop);
-}
-
-static void
-emit_event (EABPopupControl *pop, const char *event)
-{
- if (pop->es) {
- BonoboArg *arg;
-
- arg = bonobo_arg_new (BONOBO_ARG_BOOLEAN);
- BONOBO_ARG_SET_BOOLEAN (arg, TRUE);
- bonobo_event_source_notify_listeners_full (pop->es,
- "GNOME/Evolution/Addressbook/AddressPopup",
- "Event",
- event,
- arg, NULL);
- bonobo_arg_release (arg);
- }
-}
-
-static void
-contact_editor_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- if (status == E_BOOK_ERROR_OK) {
- EABPopupControl *pop = EAB_POPUP_CONTROL (closure);
- eab_show_contact_editor (book, pop->contact, FALSE, TRUE);
- eab_popup_control_cleanup (pop);
- emit_event (pop, "Destroy");
- }
-
- if (book)
- g_object_unref (book);
-}
-
-static void
-eab_popup_control_display_contact (EABPopupControl *pop, EContact *contact)
-{
- GtkWidget *b;
-
- g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop));
- g_return_if_fail (contact && E_IS_CONTACT (contact));
- g_return_if_fail (pop->contact == NULL);
-
- pop->contact = contact;
- g_object_ref (pop->contact);
-
- addressbook_load_default_book (contact_editor_cb, pop);
-}
-
-static void
-eab_popup_control_no_matches (EABPopupControl *pop)
-{
- if (pop->email && *pop->email) {
- if (pop->name && *pop->name)
- e_contact_quick_add (pop->name, pop->email, NULL, NULL);
- else
- e_contact_quick_add_free_form (pop->email, NULL, NULL);
-
- }
- eab_popup_control_cleanup (pop);
- emit_event (pop, "Destroy");
-}
-
-static void
-wizard_destroy_cb (MiniWizard *wiz, gpointer closure)
-{
- gtk_widget_destroy (GTK_WIDGET (closure));
-}
-
-static void
-eab_popup_control_ambiguous_email_add (EABPopupControl *pop, const GList *contacts)
-{
- MiniWizard *wiz = mini_wizard_new ();
- GtkWidget *win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-
- wiz->destroy_cb = wizard_destroy_cb;
- wiz->destroy_closure = win;
-
- gtk_window_set_title (GTK_WINDOW (win), _("Merge E-Mail Address"));
- gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_MOUSE);
-
- contact_picker_init (wiz, contacts, pop->name, pop->email);
-
- eab_popup_control_cleanup (pop);
- emit_event (pop, "Destroy");
-
- gtk_container_add (GTK_CONTAINER (win), wiz->body);
- gtk_widget_show_all (win);
-}
-
-static void
-eab_popup_control_multiple_matches (EABPopupControl *pop, const GList *contacts)
-{
- pop->multiple_matches = TRUE;
-
- eab_popup_control_ambiguous_email_add (pop, contacts);
-}
-
-/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/
-
-/*
- * Addressbook Query Fun
- */
-
-static void
-name_only_query_cb (EBook *book, EBookStatus status, GList *contacts, gpointer closure)
-{
- EABPopupControl *pop;
-
- if (status != E_BOOK_ERROR_OK)
- return;
-
- pop = EAB_POPUP_CONTROL (closure);
-
- pop->query_tag = 0;
-
- if (contacts == NULL) {
- eab_popup_control_no_matches (pop);
- } else {
- eab_popup_control_ambiguous_email_add (pop, contacts);
- }
-}
-
-static void
-query_cb (EBook *book, EBookStatus status, GList *contacts, gpointer closure)
-{
- EABPopupControl *pop;
-
- if (status != E_BOOK_ERROR_OK)
- return;
-
- pop = EAB_POPUP_CONTROL (closure);
-
- pop->query_tag = 0;
- gtk_widget_hide (pop->query_msg);
-
- if (contacts == NULL) {
-
- /* Do a name-only query if:
- (1) The name is non-empty.
- (2) The e-mail is also non-empty (so that the query we just did wasn't actually a name-only query.
- */
- if (pop->name && *pop->name && pop->email && *pop->email) {
- pop->query_tag = eab_name_and_email_query (book, pop->name, NULL, name_only_query_cb, pop);
- } else {
- eab_popup_control_no_matches (pop);
- }
-
- } else {
- if (g_list_length ((GList *) contacts) == 1)
- eab_popup_control_display_contact (pop, E_CONTACT (contacts->data));
- else
- eab_popup_control_multiple_matches (pop, contacts);
- }
-}
-
-static void
-start_query (EBook *book, EBookStatus status, gpointer closure)
-{
- EABPopupControl *pop = EAB_POPUP_CONTROL (closure);
-
- if (status != E_BOOK_ERROR_OK) {
- eab_popup_control_no_matches (pop);
- if (book)
- g_object_unref (book);
- return;
- }
-
-#if notyet
- if (pop->query_tag)
- e_book_simple_query_cancel (book, pop->query_tag);
-#endif
-
- if (pop->book != book) {
- g_object_ref (book);
- if (pop->book)
- g_object_unref (pop->book);
- pop->book = book;
- }
-
- pop->query_tag = eab_name_and_email_query (book, pop->name, pop->email, query_cb, pop);
-
- g_object_unref (pop);
-}
-
-static void
-eab_popup_control_query (EABPopupControl *pop)
-{
- g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop));
-
- g_object_ref (pop);
-
- addressbook_load_default_book (start_query, pop);
-}
-
-/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/
-
-enum {
- PROPERTY_NAME,
- PROPERTY_EMAIL,
- PROPERTY_TRANSITORY
-};
-
-static void
-set_prop (BonoboPropertyBag *bag, const BonoboArg *arg, guint arg_id, CORBA_Environment *ev, gpointer user_data)
-{
- EABPopupControl *pop = EAB_POPUP_CONTROL (user_data);
-
- switch (arg_id) {
-
- case PROPERTY_NAME:
- eab_popup_control_set_name (pop, BONOBO_ARG_GET_STRING (arg));
- break;
-
- case PROPERTY_EMAIL:
- eab_popup_control_set_email (pop, BONOBO_ARG_GET_STRING (arg));
- break;
-
- default:
- g_assert_not_reached ();
- }
-}
-
-static void
-get_prop (BonoboPropertyBag *bag, BonoboArg *arg, guint arg_id, CORBA_Environment *ev, gpointer user_data)
-{
- EABPopupControl *pop = EAB_POPUP_CONTROL (user_data);
-
- switch (arg_id) {
-
- case PROPERTY_NAME:
- BONOBO_ARG_SET_STRING (arg, pop->name);
- break;
-
- case PROPERTY_EMAIL:
- BONOBO_ARG_SET_STRING (arg, pop->email);
- break;
-
- case PROPERTY_TRANSITORY:
- BONOBO_ARG_SET_BOOLEAN (arg, pop->transitory);
- break;
-
- default:
- g_assert_not_reached ();
- }
-}
-
-BonoboControl *
-eab_popup_control_new (void)
-{
- BonoboControl *control;
- BonoboPropertyBag *bag;
- EABPopupControl *addy;
- GtkWidget *w;
-
- w = eab_popup_new ();
- addy = EAB_POPUP_CONTROL (w);
-
- control = bonobo_control_new (w);
- gtk_widget_show (w);
-
- bag = bonobo_property_bag_new (get_prop, set_prop, w);
- bonobo_property_bag_add (bag, "name", PROPERTY_NAME,
- BONOBO_ARG_STRING, NULL, NULL,
- BONOBO_PROPERTY_WRITEABLE | BONOBO_PROPERTY_READABLE);
-
- bonobo_property_bag_add (bag, "email", PROPERTY_EMAIL,
- BONOBO_ARG_STRING, NULL, NULL,
- BONOBO_PROPERTY_WRITEABLE | BONOBO_PROPERTY_READABLE);
-
- bonobo_property_bag_add (bag, "transitory", PROPERTY_TRANSITORY,
- BONOBO_ARG_BOOLEAN, NULL, NULL,
- BONOBO_PROPERTY_READABLE);
-
- bonobo_control_set_properties (control, bonobo_object_corba_objref (BONOBO_OBJECT (bag)), NULL);
- bonobo_object_unref (BONOBO_OBJECT (bag));
-
- addy->es = bonobo_event_source_new ();
- bonobo_object_add_interface (BONOBO_OBJECT (control),
- BONOBO_OBJECT (addy->es));
-
- return control;
-}
diff --git a/addressbook/gui/widgets/eab-popup-control.h b/addressbook/gui/widgets/eab-popup-control.h
deleted file mode 100644
index 1f4f22558f..0000000000
--- a/addressbook/gui/widgets/eab-popup-control.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * eab-popup-control.h
- *
- * Copyright (C) 2001-2003, Ximian, Inc.
- *
- * Authors: Jon Trowbridge <trow@ximian.com>
- * Chris Toshok <toshok@ximian.com>
- */
-
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA.
- */
-
-#ifndef __EAB_POPUP_CONTROL_H__
-#define __EAB_POPUP_CONTROL_H__
-
-#include <bonobo/bonobo-event-source.h>
-#include <libebook/e-book.h>
-#include <libebook/e-contact.h>
-
-#include <gtk/gtkeventbox.h>
-
-G_BEGIN_DECLS
-
-#define EAB_TYPE_POPUP_CONTROL (eab_popup_control_get_type ())
-#define EAB_POPUP_CONTROL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EAB_TYPE_POPUP_CONTROL, EABPopupControl))
-#define EAB_POPUP_CONTROL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), EAB_TYPE_POPUP_CONTROL, EABPopupControlClass))
-#define EAB_IS_POPUP_CONTROL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EAB_TYPE_POPUP_CONTROL))
-#define EAB_IS_POPUP_CONTROL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EAB_TYPE_POPUP_CONTROL))
-
-typedef struct _EABPopupControl EABPopupControl;
-typedef struct _EABPopupControlClass EABPopupControlClass;
-
-struct _EABPopupControl {
- GtkEventBox parent;
-
- gchar *name;
- gchar *email;
-
- GtkWidget *name_widget;
- GtkWidget *email_widget;
- GtkWidget *query_msg;
-
- GtkWidget *main_vbox;
- GtkWidget *generic_view;
- GtkWidget *contact_display;
-
- gboolean transitory;
-
- guint scheduled_refresh;
- EBook *book;
- guint query_tag;
- gboolean multiple_matches;
- EContact *contact;
-
- BonoboEventSource *es;
-};
-
-struct _EABPopupControlClass {
- GtkEventBoxClass parent_class;
-};
-
-GType eab_popup_control_get_type (void);
-
-void eab_popup_control_construct (EABPopupControl *);
-
-BonoboControl *eab_popup_control_new (void);
-
-G_END_DECLS
-
-#endif /* __EAB_POPUP_CONTROL_H__ */
-
diff --git a/addressbook/gui/widgets/eab-popup.c b/addressbook/gui/widgets/eab-popup.c
deleted file mode 100644
index 8a292b745f..0000000000
--- a/addressbook/gui/widgets/eab-popup.c
+++ /dev/null
@@ -1,321 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Michael Zucchi <notzed@ximian.com>
- *
- * Copyright 2004 Novell, Inc. (www.novell.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <stdlib.h>
-
-#include <glib.h>
-
-#include "eab-popup.h"
-#include <libedataserverui/e-source-selector.h>
-#include <libebook/e-contact.h>
-
-static GObjectClass *eabp_parent;
-
-static void
-eabp_init(GObject *o)
-{
- /*EABPopup *eabp = (EABPopup *)o; */
-}
-
-static void
-eabp_finalise(GObject *o)
-{
- ((GObjectClass *)eabp_parent)->finalize(o);
-}
-
-static void
-eabp_target_free(EPopup *ep, EPopupTarget *t)
-{
- switch (t->type) {
- case EAB_POPUP_TARGET_SELECT: {
- EABPopupTargetSelect *s = (EABPopupTargetSelect *)t;
- int i;
-
- for (i=0;i<s->cards->len;i++)
- g_object_unref(s->cards->pdata[i]);
- g_ptr_array_free(s->cards, TRUE);
- g_object_unref(s->book);
-
- break; }
- case EAB_POPUP_TARGET_SOURCE: {
- EABPopupTargetSource *s = (EABPopupTargetSource *)t;
-
- g_object_unref(s->selector);
- break; }
-
-#ifdef ADAPTED_TO_E_NAME_SELECTOR
-
- case EAB_POPUP_TARGET_SELECT_NAMES: {
- EABPopupTargetSelectNames *s = (EABPopupTargetSelectNames *)t;
-
- g_object_unref(s->model);
- break; }
-
-#endif
-
- }
-
- ((EPopupClass *)eabp_parent)->target_free(ep, t);
-}
-
-static void
-eabp_class_init(GObjectClass *klass)
-{
- klass->finalize = eabp_finalise;
- ((EPopupClass *)klass)->target_free = eabp_target_free;
-}
-
-GType
-eab_popup_get_type(void)
-{
- static GType type = 0;
-
- if (type == 0) {
- static const GTypeInfo info = {
- sizeof(EABPopupClass),
- NULL, NULL,
- (GClassInitFunc)eabp_class_init,
- NULL, NULL,
- sizeof(EABPopup), 0,
- (GInstanceInitFunc)eabp_init
- };
- eabp_parent = g_type_class_ref(e_popup_get_type());
- type = g_type_register_static(e_popup_get_type(), "EABPopup", &info, 0);
- }
-
- return type;
-}
-
-EABPopup *eab_popup_new(const char *menuid)
-{
- EABPopup *eabp = g_object_new(eab_popup_get_type(), 0);
-
- e_popup_construct(&eabp->popup, menuid);
-
- return eabp;
-}
-
-/**
- * eab_popup_target_new_select:
- * @eabp: Address book popup.
- * @book: Book the cards belong to.
- * @readonly: Book is read-only mode. FIXME: Why can't we just get this off the book?
- * @cards: Cards selected. This will be freed on completion.
- *
- * Create a new selection popup target.
- *
- * Return value:
- **/
-EABPopupTargetSelect *
-eab_popup_target_new_select(EABPopup *eabp, struct _EBook *book, int readonly, GPtrArray *cards)
-{
- EABPopupTargetSelect *t = e_popup_target_new(&eabp->popup, EAB_POPUP_TARGET_SELECT, sizeof(*t));
- guint32 mask = ~0;
- int has_email = FALSE, i;
-
- /* FIXME: duplicated in eab-menu.c */
-
- t->book = book;
- g_object_ref(book);
- t->cards = cards;
-
- for (i=0;i<cards->len && !has_email;i++) {
- EContact *contact = cards->pdata[i];
- GList *email;
-
- email = e_contact_get(E_CONTACT(contact), E_CONTACT_EMAIL);
- if (email) {
- has_email = TRUE;
-
- g_list_foreach(email, (GFunc)g_free, NULL);
- g_list_free(email);
- }
- }
-
- if (has_email)
- mask &= ~EAB_POPUP_SELECT_EMAIL;
-
- if (!readonly)
- mask &= ~EAB_POPUP_SELECT_EDITABLE;
-
- if (cards->len == 1)
- mask &= ~EAB_POPUP_SELECT_ONE;
-
- if (cards->len > 1)
- mask &= ~EAB_POPUP_SELECT_MANY;
-
- if (cards->len >= 1)
- mask &= ~EAB_POPUP_SELECT_ANY;
-
- t->target.mask = mask;
-
- return t;
-}
-
-EABPopupTargetSource *
-eab_popup_target_new_source(EABPopup *eabp, ESourceSelector *selector)
-{
- EABPopupTargetSource *t = e_popup_target_new(&eabp->popup, EAB_POPUP_TARGET_SOURCE, sizeof(*t));
- guint32 mask = ~0;
- const char *source_uri;
- ESource *source;
-
- /* TODO: this is duplicated for calendar and tasks too */
-
- t->selector = selector;
- g_object_ref(selector);
-
- /* TODO: perhaps we need to copy this so it doesn't change during the lifecycle */
- source = e_source_selector_peek_primary_selection(selector);
- if (source)
- mask &= ~EAB_POPUP_SOURCE_PRIMARY;
-
- /* FIXME Gross hack, should have a property or something */
- source_uri = e_source_peek_relative_uri(source);
- if (source_uri && !strcmp("system", source_uri))
- mask &= ~EAB_POPUP_SOURCE_SYSTEM;
- else
- mask &= ~EAB_POPUP_SOURCE_USER;
-
- t->target.mask = mask;
-
- return t;
-}
-
-#ifdef ADAPTED_TO_E_NAME_SELECTOR
-
-EABPopupTargetSelectNames *
-eab_popup_target_new_select_names(EABPopup *eabp, struct _ESelectNamesModel *model, int row)
-{
- EABPopupTargetSelectNames *t = e_popup_target_new(&eabp->popup, EAB_POPUP_TARGET_SELECT_NAMES, sizeof(*t));
-
- /* TODO: this is sort of not very useful, maybe the popup which uses it doesn't
- need to be pluggable */
-
- t->model = model;
- g_object_ref(model);
- t->row = row;
-
- return t;
-}
-
-#endif
-
-/* ********************************************************************** */
-/* Popup menu plugin handler */
-
-/*
-<e-plugin
- class="org.gnome.mail.plugin.popup:1.0"
- id="org.gnome.mail.plugin.popup.iteab:1.0"
- type="shlib"
- location="/opt/gnome2/lib/camel/1.0/libcamelimap.so"
- name="imap"
- description="IMAP4 and IMAP4v1 mail store">
- <hook class="org.gnome.mail.popupMenu:1.0"
- handler="HandlePopup">
- <menu id="any" target="select">
- <iteab
- type="iteab|toggle|radio|image|submenu|bar"
- active
- path="foo/bar"
- label="label"
- icon="foo"
- mask="select_one"
- activate="eabp_view_eabacs"/>
- </menu>
- </extension>
-
-*/
-
-static void *eabph_parent_class;
-#define eabph ((EABPopupHook *)eph)
-
-static const EPopupHookTargetMask eabph_select_masks[] = {
- { "one", EAB_POPUP_SELECT_ONE },
- { "many", EAB_POPUP_SELECT_MANY },
- { "any", EAB_POPUP_SELECT_ANY },
- { "editable", EAB_POPUP_SELECT_EDITABLE },
- { "email", EAB_POPUP_SELECT_EMAIL },
- { 0 }
-};
-
-static const EPopupHookTargetMask eabph_source_masks[] = {
- { "primary", EAB_POPUP_SOURCE_PRIMARY },
- { "system", EAB_POPUP_SOURCE_SYSTEM },
- { 0 }
-};
-
-static const EPopupHookTargetMask eabph_select_names_masks[] = {
- { 0 }
-};
-
-static const EPopupHookTargetMap eabph_targets[] = {
- { "select", EAB_POPUP_TARGET_SELECT, eabph_select_masks },
- { "source", EAB_POPUP_TARGET_SOURCE, eabph_source_masks },
- { "select-names", EAB_POPUP_TARGET_SELECT_NAMES, eabph_select_names_masks },
- { 0 }
-};
-
-static void
-eabph_finalise(GObject *o)
-{
- /*EPluginHook *eph = (EPluginHook *)o;*/
-
- ((GObjectClass *)eabph_parent_class)->finalize(o);
-}
-
-static void
-eabph_class_init(EPluginHookClass *klass)
-{
- int i;
-
- ((GObjectClass *)klass)->finalize = eabph_finalise;
- ((EPluginHookClass *)klass)->id = "org.gnome.evolution.addressbook.popup:1.0";
-
- for (i=0;eabph_targets[i].type;i++)
- e_popup_hook_class_add_target_map((EPopupHookClass *)klass, &eabph_targets[i]);
-
- ((EPopupHookClass *)klass)->popup_class = g_type_class_ref(eab_popup_get_type());
-}
-
-GType
-eab_popup_hook_get_type(void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof(EABPopupHookClass), NULL, NULL, (GClassInitFunc) eabph_class_init, NULL, NULL,
- sizeof(EABPopupHook), 0, (GInstanceInitFunc) NULL,
- };
-
- eabph_parent_class = g_type_class_ref(e_popup_hook_get_type());
- type = g_type_register_static(e_popup_hook_get_type(), "EABPopupHook", &info, 0);
- }
-
- return type;
-}
diff --git a/addressbook/gui/widgets/eab-popup.h b/addressbook/gui/widgets/eab-popup.h
deleted file mode 100644
index 20aab2edfe..0000000000
--- a/addressbook/gui/widgets/eab-popup.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Michael Zucchi <notzed@ximian.com>
- *
- * Copyright 2004 Novell, Inc. (www.novell.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifndef __EAB_POPUP_H__
-#define __EAB_POPUP_H__
-
-#include <glib-object.h>
-
-#include "e-util/e-popup.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define ADAPTED_TO_E_NAME_SELECTOR 1
-
-typedef struct _EABPopup EABPopup;
-typedef struct _EABPopupClass EABPopupClass;
-
-/**
- * enum _eab_popup_target_t - A list of mail popup target types.
- *
- * @EAB_POPUP_TARGET_SELECT: A selection of cards
- * @EAB_POPUP_TARGET_SOURCE: A source selection.
- *
- * Defines the value of the targetid for all EABPopup target types.
- **/
-enum _eab_popup_target_t {
- EAB_POPUP_TARGET_SELECT,
- EAB_POPUP_TARGET_SOURCE,
- EAB_POPUP_TARGET_SELECT_NAMES,
-};
-
-/**
- * enum _eab_popup_target_select_t - EABPopupTargetSelect qualifiers.
- *
- * @EAB_POPUP_SELECT_ONE: Only one item is selected.
- * @EAB_POPUP_SELECT_MANY: Two or more items are selected.
- * @EAB_POPUP_SELECT_ANY: One or more items are selected.
- * @EAB_POPUP_SELECT_EDITABLE: Read/writable source.
- * @EAB_POPUP_SELECT_EMAIL: Has an email address.
- **/
-enum _eab_popup_target_select_t {
- EAB_POPUP_SELECT_ONE = 1<<0,
- EAB_POPUP_SELECT_MANY = 1<<1,
- EAB_POPUP_SELECT_ANY = 1<<2,
- EAB_POPUP_SELECT_EDITABLE = 1<<3,
- EAB_POPUP_SELECT_EMAIL = 1<<4,
-};
-
-/**
- * enum _eab_popup_target_source_t - EABPopupTargetSource qualifiers.
- *
- * @EAB_POPUP_SOURCE_PRIMARY: Has a primary selection.
- * @EAB_POPUP_SOURCE_SYSTEM: Is a 'system' folder.
- *
- **/
-enum _eab_popup_target_source_t {
- EAB_POPUP_SOURCE_PRIMARY = 1<<0,
- EAB_POPUP_SOURCE_SYSTEM = 1<<1, /* system folder */
- EAB_POPUP_SOURCE_USER = 1<<2, /* user folder (!system) */
-};
-
-typedef struct _EABPopupTargetSelect EABPopupTargetSelect;
-typedef struct _EABPopupTargetSource EABPopupTargetSource;
-typedef struct _EABPopupTargetSelectNames EABPopupTargetSelectNames;
-
-/**
- * struct _EABPopupTargetSelect - A list of address cards.
- *
- * @target: Superclass.
- * @book: Book the cards belong to.
- * @cards: All selected cards.
- *
- * Used to represent a selection of cards as context for a popup
- * menu.
- **/
-struct _EABPopupTargetSelect {
- EPopupTarget target;
-
- struct _EBook *book;
- GPtrArray *cards;
-};
-
-/**
- * struct _EABPopupTargetSource - A source target.
- *
- * @target: Superclass.
- * @selector: Selector holding the source selection.
- *
- * This target is used to represent a source selection.
- **/
-struct _EABPopupTargetSource {
- EPopupTarget target;
-
- struct _ESourceSelector *selector;
-};
-
-#ifdef ADAPTED_TO_E_NAME_SELECTOR
-
-/**
- * struct _EABPopupTargetSelectNames - A select names target.
- *
- * @target: Superclass.
- * @model: Select names model.
- * @row: Row of item selected.
- *
- * This target is used to represent an item selected in an
- * ESelectNames model.
- **/
-struct _EABPopupTargetSelectNames {
- EPopupTarget target;
-
- struct _ESelectNamesModel *model;
- int row;
-};
-
-#endif
-
-typedef struct _EPopupItem EABPopupItem;
-
-/* The object */
-struct _EABPopup {
- EPopup popup;
-
- struct _EABPopupPrivate *priv;
-};
-
-struct _EABPopupClass {
- EPopupClass popup_class;
-};
-
-GType eab_popup_get_type(void);
-
-EABPopup *eab_popup_new(const char *menuid);
-
-EABPopupTargetSelect *eab_popup_target_new_select(EABPopup *eabp, struct _EBook *book, int readonly, GPtrArray *cards);
-EABPopupTargetSource *eab_popup_target_new_source(EABPopup *eabp, struct _ESourceSelector *selector);
-
-#ifdef ADAPTED_TO_E_NAME_SELECTOR
-
-EABPopupTargetSelectNames *eab_popup_target_new_select_names(EABPopup *eabp, struct _ESelectNamesModel *model, int row);
-
-#endif
-
-/* ********************************************************************** */
-
-typedef struct _EABPopupHook EABPopupHook;
-typedef struct _EABPopupHookClass EABPopupHookClass;
-
-struct _EABPopupHook {
- EPopupHook hook;
-};
-
-struct _EABPopupHookClass {
- EPopupHookClass hook_class;
-};
-
-GType eab_popup_hook_get_type(void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __EAB_POPUP_H__ */
diff --git a/addressbook/gui/widgets/eab-vcard-control.c b/addressbook/gui/widgets/eab-vcard-control.c
deleted file mode 100644
index 77497767ca..0000000000
--- a/addressbook/gui/widgets/eab-vcard-control.c
+++ /dev/null
@@ -1,311 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * eab-vcard-control.c
- *
- * Copyright (C) 1999, 2000, 2001, 2002, 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Authors:
- * Chris Lahey <clahey@ximian.com>
- * Chris Toshok <toshok@ximian.com>
- */
-
-#include <config.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-#include <bonobo/bonobo-generic-factory.h>
-#include <bonobo/bonobo-persist.h>
-#include <bonobo/bonobo-persist-stream.h>
-#include <bonobo/bonobo-stream-client.h>
-#include <gal/util/e-util.h>
-
-#include <libebook/e-book.h>
-#include <libebook/e-contact.h>
-#include <addressbook/gui/component/addressbook.h>
-#include <addressbook/gui/widgets/eab-contact-display.h>
-#include <addressbook/util/eab-book-util.h>
-
-#include "eab-vcard-control.h"
-#include "eab-contact-merging.h"
-
-typedef struct {
- EABContactDisplay *display;
- GList *card_list;
- GtkWidget *label;
- EABContactDisplayRenderMode render_mode;
-} EABVCardControl;
-
-#define VCARD_CONTROL_ID "OAFIID:GNOME_Evolution_Addressbook_VCard_Control:" BASE_VERSION
-
-/*
- * Bonobo::PersistStream
- *
- * These two functions implement the Bonobo::PersistStream load and
- * save methods which allow data to be loaded into and out of the
- * BonoboObject.
- */
-static char *
-stream_read (Bonobo_Stream stream)
-{
- Bonobo_Stream_iobuf *buffer;
- CORBA_Environment ev;
- char *data = NULL;
- gint length = 0;
-
- CORBA_exception_init (&ev);
- do {
-#define READ_CHUNK_SIZE 65536
- Bonobo_Stream_read (stream, READ_CHUNK_SIZE,
- &buffer, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- if (buffer->_length <= 0)
- break;
-
- data = g_realloc (data, length + buffer->_length + 1);
-
- memcpy (data + length, buffer->_buffer, buffer->_length);
-
- length += buffer->_length;
-
- CORBA_free (buffer);
- } while (1);
-
- CORBA_free (buffer);
- CORBA_exception_free (&ev);
-
- if (data)
- data[length] = '\0';
- else
- data = g_strdup("");
-
- return data;
-} /* stream_read */
-
-/*
- * This function implements the Bonobo::PersistStream:load method.
- */
-static void
-pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream,
- Bonobo_Persist_ContentType type, void *data,
- CORBA_Environment *ev)
-{
- GList *list;
- char *vcard;
- EABVCardControl *vcard_control = data;
-
- if (type && g_ascii_strcasecmp (type, "text/vCard") != 0 &&
- g_ascii_strcasecmp (type, "text/x-vCard") != 0) {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Bonobo_Persist_WrongDataType, NULL);
- return;
- }
-
- if ((vcard = stream_read (stream)) == NULL) {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Bonobo_Persist_FileNotFound, NULL);
- return;
- }
-
- e_free_object_list (vcard_control->card_list);
- list = eab_contact_list_from_string (vcard);
- g_free(vcard);
- vcard_control->card_list = list;
- if (list) {
- eab_contact_display_render (vcard_control->display, E_CONTACT (list->data),
- vcard_control->render_mode);
- }
- if (list && list->next) {
- char *message;
- int length = g_list_length (list) - 1;
- message = g_strdup_printf (ngettext("There is one other contact.",
- "There are %d other contacts.", length),
- length);
- gtk_label_set_text (GTK_LABEL (vcard_control->label), message);
- g_free (message);
- gtk_widget_show (vcard_control->label);
- } else {
- gtk_widget_hide (vcard_control->label);
- }
-} /* pstream_load */
-
-/*
- * This function implements the Bonobo::PersistStream:save method.
- */
-static void
-pstream_save (BonoboPersistStream *ps, const Bonobo_Stream stream,
- Bonobo_Persist_ContentType type, void *data,
- CORBA_Environment *ev)
-{
- EABVCardControl *vcard_control = data;
- char *vcard;
- int length;
-
- if (type && g_ascii_strcasecmp (type, "text/vCard") != 0 &&
- g_ascii_strcasecmp (type, "text/x-vCard") != 0) {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_Bonobo_Persist_WrongDataType, NULL);
- return;
- }
-
- vcard = eab_contact_list_to_string (vcard_control->card_list);
- length = strlen (vcard);
- bonobo_stream_client_write (stream, vcard, length, ev);
- g_free (vcard);
-} /* pstream_save */
-
-static Bonobo_Persist_ContentTypeList *
-pstream_get_content_types (BonoboPersistStream *ps, void *closure,
- CORBA_Environment *ev)
-{
- return bonobo_persist_generate_content_types (2, "text/vCard", "text/x-vCard");
-}
-
-static void
-book_open_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- GList *list = closure;
- if (status == E_BOOK_ERROR_OK) {
- GList *p;
- for (p = list; p; p = p->next) {
- /* XXX argh, more passing of NULL's for callbacks */
- eab_merging_book_add_contact (book, E_CONTACT (p->data), NULL, NULL);
- }
- }
- if (book)
- g_object_unref (book);
- e_free_object_list (list);
-}
-
-static void
-save_in_addressbook(GtkWidget *button, gpointer data)
-{
- EABVCardControl *vcard_control = data;
- GList *list, *p;
-
- list = g_list_copy (vcard_control->card_list);
-
- for (p = list; p; p = p->next)
- g_object_ref (p->data);
-
- addressbook_load_default_book (book_open_cb, list);
-}
-
-static void
-toggle_full_vcard(GtkWidget *button, gpointer data)
-{
- EABVCardControl *vcard_control = data;
- char *label;
-
- if (!vcard_control->card_list)
- return;
-
- if (vcard_control->render_mode == EAB_CONTACT_DISPLAY_RENDER_NORMAL) {
- vcard_control->render_mode = EAB_CONTACT_DISPLAY_RENDER_COMPACT;
- label = _("Show Full VCard");
- }
- else {
- vcard_control->render_mode = EAB_CONTACT_DISPLAY_RENDER_NORMAL;
- label = _("Show Compact VCard");
- }
-
- gtk_button_set_label (GTK_BUTTON (button), label);
- eab_contact_display_render (vcard_control->display, E_CONTACT (vcard_control->card_list->data),
- vcard_control->render_mode);
-}
-
-static void
-free_struct (gpointer data, GObject *where_object_was)
-{
- EABVCardControl *vcard_control = data;
- e_free_object_list (vcard_control->card_list);
- g_free (vcard_control);
-}
-
-BonoboControl *
-eab_vcard_control_new (void)
-{
- BonoboControl *control;
- BonoboPersistStream *stream;
- GtkWidget *display;
- GtkWidget *button1, *button2;
- GtkWidget *bbox;
- GtkWidget *vbox;
-
- EABVCardControl *vcard_control = g_new (EABVCardControl, 1);
-
- printf ("inside eab_vcard_control_new\n");
-
- vcard_control->card_list = NULL;
- vcard_control->display = NULL;
- vcard_control->label = NULL;
-
- vcard_control->render_mode = EAB_CONTACT_DISPLAY_RENDER_COMPACT;
-
- /* Create the control. */
-
- display = eab_contact_display_new ();
- vcard_control->display = EAB_CONTACT_DISPLAY (display);
-
- bbox = gtk_hbutton_box_new ();
- gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_START);
- gtk_box_set_spacing (GTK_BOX (bbox), 12);
-
- button1 = gtk_button_new_with_label(_("Show Full VCard"));
- g_signal_connect (button1, "clicked",
- G_CALLBACK (toggle_full_vcard), vcard_control);
- gtk_box_pack_start (GTK_BOX (bbox), button1, FALSE, FALSE, 0);
-
- button2 = gtk_button_new_with_label(_("Save in addressbook"));
- g_signal_connect (button2, "clicked",
- G_CALLBACK (save_in_addressbook), vcard_control);
- gtk_box_pack_start (GTK_BOX (bbox), button2, FALSE, FALSE, 0);
-
- /* This is intentionally not shown. */
- vcard_control->label = gtk_label_new ("");
-
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), display, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), vcard_control->label, TRUE, TRUE, 0);
- gtk_widget_show_all (bbox);
- gtk_widget_show (display);
- gtk_widget_show (vbox);
-
- control = bonobo_control_new (vbox);
-
- g_object_weak_ref (G_OBJECT (control), free_struct, vcard_control);
-
- stream = bonobo_persist_stream_new (pstream_load, pstream_save,
- pstream_get_content_types,
- VCARD_CONTROL_ID,
- vcard_control);
-
- if (stream == NULL) {
- bonobo_object_unref (BONOBO_OBJECT (control));
- return NULL;
- }
-
- bonobo_object_add_interface (BONOBO_OBJECT (control),
- BONOBO_OBJECT (stream));
-
- return control;
-}
diff --git a/addressbook/gui/widgets/eab-vcard-control.h b/addressbook/gui/widgets/eab-vcard-control.h
deleted file mode 100644
index 5f6643c1ca..0000000000
--- a/addressbook/gui/widgets/eab-vcard-control.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef __EAB_VCARD_CONTROL_H__
-#define __EAB_VCARD_CONTROL_H__
-
-#include <bonobo/bonobo-control.h>
-
-BonoboControl *eab_vcard_control_new (void);
-
-#endif /* __EAB_VCARD_CONTROL_H__ */
diff --git a/addressbook/gui/widgets/gal-view-factory-minicard.c b/addressbook/gui/widgets/gal-view-factory-minicard.c
deleted file mode 100644
index 6e8df82a4a..0000000000
--- a/addressbook/gui/widgets/gal-view-factory-minicard.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * gal-view-factory-minicard.c: A View Factory
- *
- * Authors:
- * Chris Lahey <clahey@ximian.com>
- *
- * (C) 2000, 2001 Ximian, Inc.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include <libgnome/gnome-i18n.h>
-#include "gal-view-factory-minicard.h"
-#include "gal-view-minicard.h"
-
-G_DEFINE_TYPE (GalViewFactoryMinicard, gal_view_factory_minicard, GAL_VIEW_FACTORY_TYPE)
-
-static const char *
-gal_view_factory_minicard_get_title (GalViewFactory *factory)
-{
- return _("Card View");
-}
-
-static GalView *
-gal_view_factory_minicard_new_view (GalViewFactory *factory,
- const char *name)
-{
- return gal_view_minicard_new(name);
-}
-
-static const char *
-gal_view_factory_minicard_get_type_code (GalViewFactory *factory)
-{
- return "minicard";
-}
-
-static void
-gal_view_factory_minicard_class_init (GalViewFactoryMinicardClass *minicard_class)
-{
- GalViewFactoryClass *view_factory_class = GAL_VIEW_FACTORY_CLASS(minicard_class);
-
- view_factory_class->get_title = gal_view_factory_minicard_get_title;
- view_factory_class->new_view = gal_view_factory_minicard_new_view;
- view_factory_class->get_type_code = gal_view_factory_minicard_get_type_code;
-}
-
-static void
-gal_view_factory_minicard_init (GalViewFactoryMinicard *factory)
-{
-}
-
-/**
- * gal_view_minicard_new
- *
- * A new GalViewFactory for creating Minicard views. Create one of
- * these and pass it to GalViewCollection for use.
- *
- * Returns: The new GalViewFactoryMinicard.
- */
-GalViewFactory *
-gal_view_factory_minicard_new (void)
-{
- return gal_view_factory_minicard_construct (g_object_new (GAL_TYPE_VIEW_FACTORY_MINICARD, NULL));
-}
-
-/**
- * gal_view_minicard_construct
- * @factory: The factory to construct
- *
- * constructs the GalViewFactoryMinicard. To be used by subclasses and
- * language bindings.
- *
- * Returns: The GalViewFactoryMinicard.
- */
-GalViewFactory *
-gal_view_factory_minicard_construct (GalViewFactoryMinicard *factory)
-{
- return GAL_VIEW_FACTORY(factory);
-}
-
-
diff --git a/addressbook/gui/widgets/gal-view-factory-minicard.h b/addressbook/gui/widgets/gal-view-factory-minicard.h
deleted file mode 100644
index 02eea99e47..0000000000
--- a/addressbook/gui/widgets/gal-view-factory-minicard.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * gal-view-factory-minicard.c: A View Factory
- *
- * Authors:
- * Chris Lahey <clahey@ximian.com>
- *
- * (C) 2000, 2001 Ximian, Inc.
- */
-#ifndef _GAL_VIEW_FACTORY_MINICARD_H_
-#define _GAL_VIEW_FACTORY_MINICARD_H_
-
-#include <gtk/gtkobject.h>
-#include <gal/menus/gal-view-factory.h>
-
-#define GAL_TYPE_VIEW_FACTORY_MINICARD (gal_view_factory_minicard_get_type ())
-#define GAL_VIEW_FACTORY_MINICARD(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GAL_TYPE_VIEW_FACTORY_MINICARD, GalViewFactoryMinicard))
-#define GAL_VIEW_FACTORY_MINICARD_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GAL_TYPE_VIEW_FACTORY_MINICARD, GalViewFactoryMinicardClass))
-#define GAL_IS_VIEW_FACTORY_MINICARD(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GAL_TYPE_VIEW_FACTORY_MINICARD))
-#define GAL_IS_VIEW_FACTORY_MINICARD_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GAL_TYPE_VIEW_FACTORY_MINICARD))
-
-typedef struct {
- GalViewFactory base;
-} GalViewFactoryMinicard;
-
-typedef struct {
- GalViewFactoryClass parent_class;
-} GalViewFactoryMinicardClass;
-
-/* Standard functions */
-GType gal_view_factory_minicard_get_type (void);
-GalViewFactory *gal_view_factory_minicard_new (void);
-GalViewFactory *gal_view_factory_minicard_construct (GalViewFactoryMinicard *factory);
-
-#endif /* _GAL_VIEW_FACTORY_MINICARD_H_ */
diff --git a/addressbook/gui/widgets/gal-view-factory-treeview.c b/addressbook/gui/widgets/gal-view-factory-treeview.c
deleted file mode 100644
index d983a636d1..0000000000
--- a/addressbook/gui/widgets/gal-view-factory-treeview.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8
- -*- */
-/*
- * gal-view-factory-treeview.c: A View Factory
- *
- * Authors:
- * Chris Lahey <clahey@ximian.com>
- *
- * (C) 2000, 2001 Ximian, Inc.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include <libgnome/gnome-i18n.h>
-#include "gal-view-factory-treeview.h"
-#include "gal-view-treeview.h"
-
-G_DEFINE_TYPE(GalViewFactoryTreeView, gal_view_factory_treeview, GAL_VIEW_FACTORY_TYPE)
-
-static const char *
-gal_view_factory_treeview_get_title (GalViewFactory *factory)
-{
- return _("GTK Tree View");
-}
-
-static GalView *
-gal_view_factory_treeview_new_view (GalViewFactory *factory,
- const char *name)
-{
- return gal_view_treeview_new(name);
-}
-
-static const char *
-gal_view_factory_treeview_get_type_code (GalViewFactory *factory)
-{
- return "treeview";
-}
-
-static void
-gal_view_factory_treeview_class_init (GalViewFactoryTreeViewClass *treeview_class)
-{
- GalViewFactoryClass *view_factory_class = GAL_VIEW_FACTORY_CLASS(treeview_class);
-
- view_factory_class->get_title = gal_view_factory_treeview_get_title;
- view_factory_class->new_view = gal_view_factory_treeview_new_view;
- view_factory_class->get_type_code = gal_view_factory_treeview_get_type_code;
-}
-
-static void
-gal_view_factory_treeview_init (GalViewFactoryTreeView *factory)
-{
-}
-
-/**
- * gal_view_treeview_new
- *
- * A new GalViewFactory for creating TreeView views. Create one of
- * these and pass it to GalViewCollection for use.
- *
- * Returns: The new GalViewFactoryTreeView.
- */
-GalViewFactory *
-gal_view_factory_treeview_new (void)
-{
- return gal_view_factory_treeview_construct (g_object_new (GAL_TYPE_VIEW_FACTORY_TREEVIEW, NULL));
-}
-
-/**
- * gal_view_treeview_construct
- * @factory: The factory to construct
- *
- * constructs the GalViewFactoryTreeView. To be used by subclasses and
- * language bindings.
- *
- * Returns: The GalViewFactoryTreeView.
- */
-GalViewFactory *
-gal_view_factory_treeview_construct (GalViewFactoryTreeView *factory)
-{
- return GAL_VIEW_FACTORY(factory);
-}
diff --git a/addressbook/gui/widgets/gal-view-factory-treeview.h b/addressbook/gui/widgets/gal-view-factory-treeview.h
deleted file mode 100644
index 4795c6d3aa..0000000000
--- a/addressbook/gui/widgets/gal-view-factory-treeview.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * gal-view-factory-treeview.c: A View Factory
- *
- * Authors:
- * Chris Toshok <toshok@ximian.com>
- *
- * (C) 2000, 2001 Ximian, Inc.
- */
-#ifndef _GAL_VIEW_FACTORY_TREEVIEW_H_
-#define _GAL_VIEW_FACTORY_TREEVIEW_H_
-
-#include <gtk/gtkobject.h>
-#include <gal/menus/gal-view-factory.h>
-
-#define GAL_TYPE_VIEW_FACTORY_TREEVIEW (gal_view_factory_treeview_get_type ())
-#define GAL_VIEW_FACTORY_TREEVIEW(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GAL_TYPE_VIEW_FACTORY_TREEVIEW, GalViewFactoryTreeView))
-#define GAL_VIEW_FACTORY_TREEVIEW_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GAL_TYPE_VIEW_FACTORY_TREEVIEW, GalViewFactoryTreeViewClass))
-#define GAL_IS_VIEW_FACTORY_TREEVIEW(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GAL_TYPE_VIEW_FACTORY_TREEVIEW))
-#define GAL_IS_VIEW_FACTORY_TREEVIEW_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GAL_TYPE_VIEW_FACTORY_TREEVIEW))
-
-typedef struct {
- GalViewFactory base;
-} GalViewFactoryTreeView;
-
-typedef struct {
- GalViewFactoryClass parent_class;
-} GalViewFactoryTreeViewClass;
-
-/* Standard functions */
-GType gal_view_factory_treeview_get_type (void);
-GalViewFactory *gal_view_factory_treeview_new (void);
-GalViewFactory *gal_view_factory_treeview_construct (GalViewFactoryTreeView *factory);
-
-#endif /* _GAL_VIEW_FACTORY_TREEVIEW_H_ */
diff --git a/addressbook/gui/widgets/gal-view-minicard.c b/addressbook/gui/widgets/gal-view-minicard.c
deleted file mode 100644
index da60497cdb..0000000000
--- a/addressbook/gui/widgets/gal-view-minicard.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * gal-view-minicard.c: An Minicard View
- *
- * Authors:
- * Chris Lahey <clahey@ximian.com>
- *
- * (C) 2000, 2001 Ximian, Inc.
- */
-#include <config.h>
-#include "gal-view-minicard.h"
-#include <libxml/parser.h>
-#include <gal/util/e-xml-utils.h>
-
-#define PARENT_TYPE gal_view_get_type ()
-#define d(x) x
-
-static GalViewClass *gal_view_minicard_parent_class;
-
-static void
-gal_view_minicard_edit (GalView *view, GtkWindow *parent_window)
-{
- /* GalViewMinicard *minicard_view = GAL_VIEW_MINICARD(view); */
-}
-
-static void
-gal_view_minicard_load (GalView *view,
- const char *filename)
-{
- xmlDoc *doc;
- doc = xmlParseFile (filename);
- if (doc) {
- xmlNode *root = xmlDocGetRootElement(doc);
- GAL_VIEW_MINICARD (view)->column_width = e_xml_get_double_prop_by_name_with_default (root, "column_width", 150);
- xmlFreeDoc(doc);
- }
-}
-
-static void
-gal_view_minicard_save (GalView *view,
- const char *filename)
-{
- xmlDoc *doc;
- xmlNode *root;
-
- doc = xmlNewDoc("1.0");
- root = xmlNewNode (NULL, "EMinicardViewState");
- e_xml_set_double_prop_by_name (root, "column_width", GAL_VIEW_MINICARD (view)->column_width);
- xmlDocSetRootElement(doc, root);
- xmlSaveFile(filename, doc);
- xmlFreeDoc(doc);
-}
-
-static const char *
-gal_view_minicard_get_title (GalView *view)
-{
- return GAL_VIEW_MINICARD(view)->title;
-}
-
-static void
-gal_view_minicard_set_title (GalView *view,
- const char *title)
-{
- g_free(GAL_VIEW_MINICARD(view)->title);
- GAL_VIEW_MINICARD(view)->title = g_strdup(title);
-}
-
-static const char *
-gal_view_minicard_get_type_code (GalView *view)
-{
- return "minicard";
-}
-
-static GalView *
-gal_view_minicard_clone (GalView *view)
-{
- GalViewMinicard *gvm, *new;
-
- gvm = GAL_VIEW_MINICARD(view);
-
- new = g_object_new (GAL_TYPE_VIEW_MINICARD, NULL);
- new->title = g_strdup (gvm->title);
- new->column_width = gvm->column_width;
-
- return GAL_VIEW(new);
-}
-
-static void
-gal_view_minicard_dispose (GObject *object)
-{
- GalViewMinicard *view = GAL_VIEW_MINICARD(object);
-
- if (view->title != NULL) {
- gal_view_minicard_detach (view);
- g_free(view->title);
- view->title = NULL;
- }
-
- if (G_OBJECT_CLASS (gal_view_minicard_parent_class)->dispose)
- (* G_OBJECT_CLASS (gal_view_minicard_parent_class)->dispose) (object);
-}
-
-static void
-gal_view_minicard_class_init (GObjectClass *object_class)
-{
- GalViewClass *gal_view_class = GAL_VIEW_CLASS(object_class);
- gal_view_minicard_parent_class = g_type_class_ref (PARENT_TYPE);
-
- gal_view_class->edit = gal_view_minicard_edit ;
- gal_view_class->load = gal_view_minicard_load ;
- gal_view_class->save = gal_view_minicard_save ;
- gal_view_class->get_title = gal_view_minicard_get_title ;
- gal_view_class->set_title = gal_view_minicard_set_title ;
- gal_view_class->get_type_code = gal_view_minicard_get_type_code;
- gal_view_class->clone = gal_view_minicard_clone ;
-
- object_class->dispose = gal_view_minicard_dispose ;
-}
-
-static void
-gal_view_minicard_init (GalViewMinicard *gvm)
-{
- gvm->title = NULL;
- gvm->column_width = 150.0;
-
- gvm->emvw = NULL;
- gvm->emvw_column_width_changed_id = 0;
-}
-
-/**
- * gal_view_minicard_new
- * @title: The name of the new view.
- *
- * Returns a new GalViewMinicard. This is primarily for use by
- * GalViewFactoryMinicard.
- *
- * Returns: The new GalViewMinicard.
- */
-GalView *
-gal_view_minicard_new (const gchar *title)
-{
- return gal_view_minicard_construct (g_object_new (GAL_TYPE_VIEW_MINICARD, NULL), title);
-}
-
-/**
- * gal_view_minicard_construct
- * @view: The view to construct.
- * @title: The name of the new view.
- *
- * constructs the GalViewMinicard. To be used by subclasses and
- * language bindings.
- *
- * Returns: The GalViewMinicard.
- */
-GalView *
-gal_view_minicard_construct (GalViewMinicard *view,
- const gchar *title)
-{
- view->title = g_strdup(title);
- return GAL_VIEW(view);
-}
-
-GType
-gal_view_minicard_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (GalViewMinicardClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) gal_view_minicard_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (GalViewMinicard),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gal_view_minicard_init,
- };
-
- type = g_type_register_static (PARENT_TYPE, "GalViewMinicard", &info, 0);
- }
-
- return type;
-}
-
-static void
-column_width_changed (EMinicardViewWidget *w, double width, GalViewMinicard *view)
-{
- d(g_print("%s: Old width = %f, New width = %f\n", G_GNUC_FUNCTION, view->column_width, width));
- if (view->column_width != width) {
- view->column_width = width;
- gal_view_changed(GAL_VIEW(view));
- }
-}
-
-void
-gal_view_minicard_attach (GalViewMinicard *view, EMinicardViewWidget *emvw)
-{
- gal_view_minicard_detach (view);
-
- view->emvw = emvw;
-
- g_object_ref (view->emvw);
-
- g_object_set (view->emvw,
- "column_width", view->column_width,
- NULL);
-
- view->emvw_column_width_changed_id =
- g_signal_connect(view->emvw, "column_width_changed",
- G_CALLBACK (column_width_changed), view);
-}
-
-void
-gal_view_minicard_detach (GalViewMinicard *view)
-{
- if (view->emvw == NULL)
- return;
- if (view->emvw_column_width_changed_id) {
- g_signal_handler_disconnect (view->emvw,
- view->emvw_column_width_changed_id);
- view->emvw_column_width_changed_id = 0;
- }
- g_object_unref (view->emvw);
- view->emvw = NULL;
-}
diff --git a/addressbook/gui/widgets/gal-view-minicard.h b/addressbook/gui/widgets/gal-view-minicard.h
deleted file mode 100644
index e586012f73..0000000000
--- a/addressbook/gui/widgets/gal-view-minicard.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * gal-view-minicard.h: An Minicard View
- *
- * Authors:
- * Chris Lahey <clahey@ximian.com>
- *
- * (C) 2000, 2001 Ximian, Inc.
- */
-#ifndef _GAL_VIEW_MINICARD_H_
-#define _GAL_VIEW_MINICARD_H_
-
-#include <gal/menus/gal-view.h>
-#include <e-minicard-view-widget.h>
-
-#define GAL_TYPE_VIEW_MINICARD (gal_view_minicard_get_type ())
-#define GAL_VIEW_MINICARD(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GAL_TYPE_VIEW_MINICARD, GalViewMinicard))
-#define GAL_VIEW_MINICARD_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GAL_TYPE_VIEW_MINICARD, GalViewMinicardClass))
-#define GAL_IS_VIEW_MINICARD(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GAL_TYPE_VIEW_MINICARD))
-#define GAL_IS_VIEW_MINICARD_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GAL_TYPE_VIEW_MINICARD))
-
-typedef struct {
- GalView base;
-
- char *title;
- double column_width;
-
- EMinicardViewWidget *emvw;
- guint emvw_column_width_changed_id;
-} GalViewMinicard;
-
-typedef struct {
- GalViewClass parent_class;
-} GalViewMinicardClass;
-
-/* Standard functions */
-GType gal_view_minicard_get_type (void);
-GalView *gal_view_minicard_new (const gchar *title);
-GalView *gal_view_minicard_construct (GalViewMinicard *view,
- const gchar *title);
-void gal_view_minicard_attach (GalViewMinicard *view,
- EMinicardViewWidget *emvw);
-void gal_view_minicard_detach (GalViewMinicard *view);
-
-#endif /* _GAL_VIEW_MINICARD_H_ */
diff --git a/addressbook/gui/widgets/gal-view-treeview.c b/addressbook/gui/widgets/gal-view-treeview.c
deleted file mode 100644
index e18ae6341b..0000000000
--- a/addressbook/gui/widgets/gal-view-treeview.c
+++ /dev/null
@@ -1,234 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * gal-view-treeview.c: An TreeView View
- *
- * Authors:
- * Chris Lahey <clahey@ximian.com>
- *
- * (C) 2000, 2001 Ximian, Inc.
- */
-#include <config.h>
-#include "gal-view-treeview.h"
-#include <libxml/parser.h>
-#include <gal/util/e-xml-utils.h>
-
-#define PARENT_TYPE gal_view_get_type ()
-#define d(x) x
-
-static GalViewClass *gal_view_treeview_parent_class;
-
-static void
-gal_view_treeview_edit (GalView *view, GtkWindow *parent_window)
-{
- /* GalViewTreeView *treeview_view = GAL_VIEW_TREEVIEW(view); */
-}
-
-static void
-gal_view_treeview_load (GalView *view,
- const char *filename)
-{
-#if 0
- xmlDoc *doc;
- doc = xmlParseFile (filename);
- if (doc) {
- xmlNode *root = xmlDocGetRootElement(doc);
- GAL_VIEW_TREEVIEW (view)->column_width = e_xml_get_double_prop_by_name_with_default (root, "column_width", 150);
- xmlFreeDoc(doc);
- }
-#endif
-}
-
-static void
-gal_view_treeview_save (GalView *view,
- const char *filename)
-{
-#if 0
- xmlDoc *doc;
- xmlNode *root;
-
- doc = xmlNewDoc("1.0");
- root = xmlNewNode (NULL, "ETreeViewViewState");
- e_xml_set_double_prop_by_name (root, "column_width", GAL_VIEW_TREEVIEW (view)->column_width);
- xmlDocSetRootElement(doc, root);
- xmlSaveFile(filename, doc);
- xmlFreeDoc(doc);
-#endif
-}
-
-static const char *
-gal_view_treeview_get_title (GalView *view)
-{
- return GAL_VIEW_TREEVIEW(view)->title;
-}
-
-static void
-gal_view_treeview_set_title (GalView *view,
- const char *title)
-{
- g_free(GAL_VIEW_TREEVIEW(view)->title);
- GAL_VIEW_TREEVIEW(view)->title = g_strdup(title);
-}
-
-static const char *
-gal_view_treeview_get_type_code (GalView *view)
-{
- return "treeview";
-}
-
-static GalView *
-gal_view_treeview_clone (GalView *view)
-{
- GalViewTreeView *gvm, *new;
-
- gvm = GAL_VIEW_TREEVIEW(view);
-
- new = g_object_new (GAL_TYPE_VIEW_TREEVIEW, NULL);
- new->title = g_strdup (gvm->title);
-
- return GAL_VIEW(new);
-}
-
-static void
-gal_view_treeview_dispose (GObject *object)
-{
- GalViewTreeView *view = GAL_VIEW_TREEVIEW(object);
-
- if (view->title != NULL) {
- gal_view_treeview_detach (view);
- g_free(view->title);
- view->title = NULL;
- }
-
- if (G_OBJECT_CLASS (gal_view_treeview_parent_class)->dispose)
- (* G_OBJECT_CLASS (gal_view_treeview_parent_class)->dispose) (object);
-}
-
-static void
-gal_view_treeview_class_init (GObjectClass *object_class)
-{
- GalViewClass *gal_view_class = GAL_VIEW_CLASS(object_class);
- gal_view_treeview_parent_class = g_type_class_ref (PARENT_TYPE);
-
- gal_view_class->edit = gal_view_treeview_edit ;
- gal_view_class->load = gal_view_treeview_load ;
- gal_view_class->save = gal_view_treeview_save ;
- gal_view_class->get_title = gal_view_treeview_get_title ;
- gal_view_class->set_title = gal_view_treeview_set_title ;
- gal_view_class->get_type_code = gal_view_treeview_get_type_code;
- gal_view_class->clone = gal_view_treeview_clone ;
-
- object_class->dispose = gal_view_treeview_dispose ;
-}
-
-static void
-gal_view_treeview_init (GalViewTreeView *gvm)
-{
- gvm->title = NULL;
-
- gvm->tree = NULL;
-}
-
-/**
- * gal_view_treeview_new
- * @title: The name of the new view.
- *
- * Returns a new GalViewTreeView. This is primarily for use by
- * GalViewFactoryTreeView.
- *
- * Returns: The new GalViewTreeView.
- */
-GalView *
-gal_view_treeview_new (const gchar *title)
-{
- return gal_view_treeview_construct (g_object_new (GAL_TYPE_VIEW_TREEVIEW, NULL), title);
-}
-
-/**
- * gal_view_treeview_construct
- * @view: The view to construct.
- * @title: The name of the new view.
- *
- * constructs the GalViewTreeView. To be used by subclasses and
- * language bindings.
- *
- * Returns: The GalViewTreeView.
- */
-GalView *
-gal_view_treeview_construct (GalViewTreeView *view,
- const gchar *title)
-{
- view->title = g_strdup(title);
- return GAL_VIEW(view);
-}
-
-GType
-gal_view_treeview_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (GalViewTreeViewClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) gal_view_treeview_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (GalViewTreeView),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gal_view_treeview_init,
- };
-
- type = g_type_register_static (PARENT_TYPE, "GalViewTreeView", &info, 0);
- }
-
- return type;
-}
-
-#if 0
-static void
-column_width_changed (ETable *table, double width, GalViewMinicard *view)
-{
- d(g_print("%s: Old width = %f, New width = %f\n", G_GNUC_FUNCTION, view->column_width, width));
- if (view->column_width != width) {
- view->column_width = width;
- gal_view_changed(GAL_VIEW(view));
- }
-}
-#endif
-
-void
-gal_view_treeview_attach (GalViewTreeView *view, GtkTreeView *tree)
-{
-#if 0
- gal_view_treeview_detach (view);
-
- view->emvw = emvw;
-
- g_object_ref (view->emvw);
-
- g_object_set (view->emvw,
- "column_width", view->column_width,
- NULL);
-
- view->emvw_column_width_changed_id =
- g_signal_connect(view->emvw, "column_width_changed",
- G_CALLBACK (column_width_changed), view);
-#endif
-}
-
-void
-gal_view_treeview_detach (GalViewTreeView *view)
-{
-#if 0
- if (view->emvw == NULL)
- return;
- if (view->emvw_column_width_changed_id) {
- g_signal_handler_disconnect (view->emvw,
- view->emvw_column_width_changed_id);
- view->emvw_column_width_changed_id = 0;
- }
- g_object_unref (view->emvw);
- view->emvw = NULL;
-#endif
-}
diff --git a/addressbook/gui/widgets/gal-view-treeview.h b/addressbook/gui/widgets/gal-view-treeview.h
deleted file mode 100644
index a0313856a6..0000000000
--- a/addressbook/gui/widgets/gal-view-treeview.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * gal-view-treeview.h: An TreeView View
- *
- * Authors:
- * Chris Toshok <toshok@ximian.com>
- *
- * (C) 2000, 2001 Ximian, Inc.
- */
-#ifndef _GAL_VIEW_TREEVIEW_H_
-#define _GAL_VIEW_TREEVIEW_H_
-
-#include <gal/menus/gal-view.h>
-#include <gtk/gtktreeview.h>
-
-#define GAL_TYPE_VIEW_TREEVIEW (gal_view_treeview_get_type ())
-#define GAL_VIEW_TREEVIEW(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GAL_TYPE_VIEW_TREEVIEW, GalViewTreeView))
-#define GAL_VIEW_TREEVIEW_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GAL_TYPE_VIEW_TREEVIEW, GalViewTreeViewClass))
-#define GAL_IS_VIEW_TREEVIEW(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GAL_TYPE_VIEW_TREEVIEW))
-#define GAL_IS_VIEW_TREEVIEW_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GAL_TYPE_VIEW_TREEVIEW))
-
-typedef struct {
- GalView base;
-
- char *title;
-
- GtkTreeView *tree;
-} GalViewTreeView;
-
-typedef struct {
- GalViewClass parent_class;
-} GalViewTreeViewClass;
-
-/* Standard functions */
-GType gal_view_treeview_get_type (void);
-GalView *gal_view_treeview_new (const gchar *title);
-GalView *gal_view_treeview_construct (GalViewTreeView *view,
- const gchar *title);
-void gal_view_treeview_attach (GalViewTreeView *view,
- GtkTreeView *tree);
-void gal_view_treeview_detach (GalViewTreeView *view);
-
-#endif /* _GAL_VIEW_TREEVIEW_H_ */
diff --git a/addressbook/gui/widgets/test-reflow.c b/addressbook/gui/widgets/test-reflow.c
deleted file mode 100644
index 081c061f3e..0000000000
--- a/addressbook/gui/widgets/test-reflow.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* test-reflow.c
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#define TEST_VCARD \
-"BEGIN:VCARD
-" \
-"FN:Nat
-" \
-"N:Friedman;Nat;D;Mr.
-" \
-"TITLE:Head Geek
-" \
-"BDAY:1977-08-06
-" \
-"TEL;WORK:617 679 1984
-" \
-"TEL;CELL:123 456 7890
-" \
-"EMAIL;INTERNET:nat@nat.org
-" \
-"EMAIL;INTERNET:nat@ximian.com
-" \
-"ADR;WORK;POSTAL:P.O. Box 101;;;Any Town;CA;91921-1234;
-" \
-"ADR;HOME;POSTAL;INTL:P.O. Box 202;;;Any Town 2;MI;12344-4321;USA
-" \
-"END:VCARD
-" \
-"
-"
-
-
-#include "config.h"
-
-#include <gtk/gtkmain.h>
-#include <gtk/gtkvbox.h>
-#include <libgnomeui/gnome-canvas-rect-ellipse.h>
-#include <libgnomeui/gnome-init.h>
-#include <gal/widgets/e-canvas.h>
-#include <gal/widgets/e-reflow.h>
-#include <gal/widgets/e-scroll-frame.h>
-
-#include "e-minicard.h"
-
-/* This is a horrible thing to do, but it is just a test. */
-GnomeCanvasItem *reflow;
-GnomeCanvasItem *rect;
-GtkAllocation last_alloc;
-
-static void destroy_callback(gpointer data, GObject *where_object_was)
-{
- exit(0);
-}
-
-static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpointer data)
-{
- double width;
- last_alloc = *allocation;
- gnome_canvas_item_set( reflow,
- "height", (double) allocation->height,
- NULL );
- gnome_canvas_item_set( reflow,
- "minimum_width", (double) allocation->width,
- NULL );
- g_object_get(reflow,
- "width", &width,
- NULL);
- width = MAX(width, allocation->width);
- gnome_canvas_set_scroll_region(GNOME_CANVAS( canvas ), 0, 0, width - 1, allocation->height - 1);
- gnome_canvas_item_set( rect,
- "x2", (double) width,
- "y2", (double) allocation->height,
- NULL );
-}
-
-static void resize(GnomeCanvas *canvas, gpointer data)
-{
- double width;
- g_object_get(reflow,
- "width", &width,
- NULL);
- width = MAX(width, last_alloc.width);
- gnome_canvas_set_scroll_region(canvas , 0, 0, width - 1, last_alloc.height - 1);
- gnome_canvas_item_set( rect,
- "x2", (double) width,
- "y2", (double) last_alloc.height,
- NULL );
-}
-
-int main( int argc, char *argv[] )
-{
- GtkWidget *app;
- GtkWidget *canvas;
- GtkWidget *vbox;
- GtkWidget *scrollframe;
- int i;
-
- /* bindtextdomain (PACKAGE, GNOMELOCALEDIR);
- textdomain (PACKAGE);*/
-
- gnome_init( "Reflow Test", VERSION, argc, argv);
- app = gnome_app_new("Reflow Test", NULL);
-
- vbox = gtk_vbox_new(FALSE, 0);
-
- canvas = e_canvas_new();
- rect = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( canvas ) ),
- gnome_canvas_rect_get_type(),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) 100,
- "y2", (double) 100,
- "fill_color", "white",
- NULL );
- reflow = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( canvas ) ),
- e_reflow_get_type(),
- "height", (double) 100,
- "minimum_width", (double) 100,
- NULL );
- g_signal_connect( canvas, "reflow",
- G_CALLBACK ( resize ),
- ( gpointer ) app);
- for ( i = 0; i < 200; i++ )
- {
- GnomeCanvasItem *item;
- ECard *card = e_card_new (TEST_VCARD);
- item = gnome_canvas_item_new( GNOME_CANVAS_GROUP(reflow),
- e_minicard_get_type(),
- "card", card,
- NULL);
- e_reflow_add_item(E_REFLOW(reflow), item, NULL);
- }
- gnome_canvas_set_scroll_region ( GNOME_CANVAS( canvas ),
- 0, 0,
- 100, 100 );
-
- scrollframe = e_scroll_frame_new (gtk_layout_get_hadjustment(GTK_LAYOUT(canvas)),
- gtk_layout_get_vadjustment(GTK_LAYOUT(canvas)));
- e_scroll_frame_set_policy (E_SCROLL_FRAME (scrollframe),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_NEVER);
-
- gtk_container_add (GTK_CONTAINER (scrollframe), canvas);
-
- gnome_app_set_contents( GNOME_APP( app ), scrollframe );
-
- /* Connect the signals */
- g_object_weak_ref (app, destroy_callback, app);
-
- g_signal_connect( canvas, "size_allocate",
- G_CALLBACK ( allocate_callback ),
- ( gpointer ) app );
-
- gtk_widget_show_all( app );
- gdk_window_set_back_pixmap( GTK_LAYOUT(canvas)->bin_window, NULL, FALSE);
-
- gtk_main();
-
- /* Not reached. */
- return 0;
-}
diff --git a/addressbook/importers/.cvsignore b/addressbook/importers/.cvsignore
deleted file mode 100644
index 665a07cc24..0000000000
--- a/addressbook/importers/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.deps
-.libs
-Makefile
-Makefile.in
-*.lo
-*.la
-GNOME_Evolution_Addressbook*.server
-GNOME_Evolution_Addressbook*.server.in
diff --git a/addressbook/importers/GNOME_Evolution_Addressbook_LDIF_Importer.server.in.in b/addressbook/importers/GNOME_Evolution_Addressbook_LDIF_Importer.server.in.in
deleted file mode 100644
index 954ff9eece..0000000000
--- a/addressbook/importers/GNOME_Evolution_Addressbook_LDIF_Importer.server.in.in
+++ /dev/null
@@ -1,29 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_LDIF_ImporterFactory:@VERSION@"
- type="shlib"
- location="@IMPORTERSDIR@/libevolution-addressbook-ldif-importer.so">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/ObjectFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution LDIF importer"/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_LDIF_Importer:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Addressbook_LDIF_ImporterFactory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution/Importer:@VERSION@"/>
- </oaf_attribute>
-
- <oaf_attribute name="evolution:menu_name" type="string"
- _value="LDAP Data Interchange Format (.ldif)"/>
- <oaf_attribute name="name" type="string"
- _value="Evolution LDIF importer"/>
-</oaf_server>
-
-</oaf_info>
diff --git a/addressbook/importers/GNOME_Evolution_Addressbook_VCard_Importer.server.in.in b/addressbook/importers/GNOME_Evolution_Addressbook_VCard_Importer.server.in.in
deleted file mode 100644
index ead2acb5f3..0000000000
--- a/addressbook/importers/GNOME_Evolution_Addressbook_VCard_Importer.server.in.in
+++ /dev/null
@@ -1,29 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_VCard_ImporterFactory:@VERSION@"
- type="shlib"
- location="@IMPORTERSDIR@/libevolution-addressbook-vcard-importer.so">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/ObjectFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution VCard Importer"/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_VCard_Importer:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Addressbook_VCard_ImporterFactory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution/Importer:@VERSION@"/>
- </oaf_attribute>
-
- <oaf_attribute name="evolution:menu_name" type="string"
- _value="VCard (.vcf, .gcrd)"/>
- <oaf_attribute name="name" type="string"
- _value="Evolution VCard Importer"/>
-</oaf_server>
-
-</oaf_info>
diff --git a/addressbook/importers/Makefile.am b/addressbook/importers/Makefile.am
deleted file mode 100644
index 3c04c22f37..0000000000
--- a/addressbook/importers/Makefile.am
+++ /dev/null
@@ -1,53 +0,0 @@
-importersdir = $(privlibdir)/evolution-addressbook-importers
-
-importers_LTLIBRARIES = \
- libevolution-addressbook-ldif-importer.la \
- libevolution-addressbook-vcard-importer.la
-
-INCLUDES = \
- -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \
- -DEVOLUTION_SOUNDDIR=\""$(soundsdir)"\" \
- -DG_LOG_DOMAIN=\"Evolution-Importer\" \
- -I$(top_srcdir) \
- -I$(top_builddir)/shell \
- -I$(top_srcdir)/shell \
- -I$(top_srcdir)/addressbook \
- -I$(top_builddir)/addressbook \
- $(EVOLUTION_ADDRESSBOOK_CFLAGS)
-
-# VCard Importer
-libevolution_addressbook_vcard_importer_la_SOURCES = \
- evolution-vcard-importer.c
-
-libevolution_addressbook_vcard_importer_la_LDFLAGS = -avoid-version -module
-
-libevolution_addressbook_vcard_importer_la_LIBADD = \
- $(top_builddir)/shell/importer/libevolution-importer.la \
- $(top_builddir)/e-util/libeutil.la \
- $(IMPORTERS_LIBS)
-
-# LDIF Importer
-libevolution_addressbook_ldif_importer_la_SOURCES = \
- evolution-ldif-importer.c
-
-libevolution_addressbook_ldif_importer_la_LDFLAGS = -avoid-version -module
-
-libevolution_addressbook_ldif_importer_la_LIBADD = \
- $(top_builddir)/shell/importer/libevolution-importer.la \
- $(top_builddir)/e-util/libeutil.la \
- $(IMPORTERS_LIBS)
-
-server_in_files = \
- GNOME_Evolution_Addressbook_LDIF_Importer.server.in.in \
- GNOME_Evolution_Addressbook_VCard_Importer.server.in.in
-server_DATA = $(server_in_files:.server.in.in=_$(BASE_VERSION).server)
-@EVO_SERVER_RULE@
-@INTLTOOL_SERVER_RULE@
-
-BUILT_SOURCES = $(server_DATA)
-CLEANFILES = $(BUILT_SOURCES)
-
-EXTRA_DIST = $(server_in_files)
-
-dist-hook:
- cd $(distdir); rm -f $(BUILT_SOURCES)
diff --git a/addressbook/importers/evolution-ldif-importer.c b/addressbook/importers/evolution-ldif-importer.c
deleted file mode 100644
index a2203f7e8b..0000000000
--- a/addressbook/importers/evolution-ldif-importer.c
+++ /dev/null
@@ -1,655 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * LDIF importer. LDIF is the file format of an exported Netscape
- * addressbook.
- *
- * Framework copied from evolution-gnomecard-importer.c
- *
- * Michael M. Morrison (mmorrison@kqcorp.com)
- *
- * Multi-line value support, mailing list support, base64 support, and
- * various fixups: Chris Toshok (toshok@ximian.com)
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-
-#include <gtk/gtkwidget.h>
-#include <gtk/gtkvbox.h>
-#include <libgnome/gnome-init.h>
-#include <bonobo/bonobo-shlib-factory.h>
-#include <bonobo/bonobo-main.h>
-#include <bonobo/bonobo-control.h>
-
-#include <libebook/e-book.h>
-#include <libedataserverui/e-source-selector.h>
-
-#include <importer/evolution-importer.h>
-#include <importer/GNOME_Evolution_Importer.h>
-#include <libebook/e-destination.h>
-
-#define COMPONENT_FACTORY_IID "OAFIID:GNOME_Evolution_Addressbook_LDIF_ImporterFactory:" BASE_VERSION
-#define COMPONENT_IID "OAFIID:GNOME_Evolution_Addressbook_LDIF_Importer:" BASE_VERSION
-
-static GHashTable *dn_contact_hash;
-
-typedef struct {
- ESource *primary;
-
- GList *contactlist;
- GList *iterator;
- EBook *book;
- gboolean ready;
-} LDIFImporter;
-
-static struct {
- char *ldif_attribute;
- EContactField contact_field;
-#define FLAG_ADDRESS 0x01
-#define FLAG_LIST 0x02
- int flags;
-}
-ldif_fields[] = {
- { "cn", E_CONTACT_FULL_NAME },
- { "mail", E_CONTACT_EMAIL, FLAG_LIST },
-#if 0
- { "givenname", E_CONTACT_GIVEN_NAME },
-#endif
- { "sn", E_CONTACT_FAMILY_NAME },
- { "xmozillanickname", E_CONTACT_NICKNAME },
- { "o", E_CONTACT_ORG },
- { "locality", 0, FLAG_ADDRESS},
- { "st", 0, FLAG_ADDRESS },
- { "streetaddress", 0, FLAG_ADDRESS },
- { "title", E_CONTACT_TITLE },
- { "postalcode", 0, FLAG_ADDRESS },
- { "countryname", 0, FLAG_ADDRESS },
- { "telephonenumber", E_CONTACT_PHONE_BUSINESS},
- { "homephone", E_CONTACT_PHONE_HOME },
- { "facsimiletelephonenumber", E_CONTACT_PHONE_BUSINESS_FAX },
- { "ou", E_CONTACT_ORG_UNIT },
- { "pagerphone", E_CONTACT_PHONE_PAGER },
- { "cellphone", E_CONTACT_PHONE_MOBILE },
- { "mobile", E_CONTACT_PHONE_MOBILE },
- { "homeurl", E_CONTACT_HOMEPAGE_URL },
- { "description", E_CONTACT_NOTE },
- { "xmozillausehtmlmail", E_CONTACT_WANTS_HTML }
-};
-static int num_ldif_fields = sizeof(ldif_fields) / sizeof (ldif_fields[0]);
-
-static unsigned char base64_rank[256] = {
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255, 62,255,255,255, 63,
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,255,255,255, 0,255,255,
- 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,255,255,255,255,255,
- 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-};
-
-/**
- * base64_decode_step: decode a chunk of base64 encoded data
- * @in: input stream
- * @len: max length of data to decode
- * @out: output stream
- * @state: holds the number of bits that are stored in @save
- * @save: leftover bits that have not yet been decoded
- *
- * Decodes a chunk of base64 encoded data
- **/
-static int
-base64_decode_step(unsigned char *in, int len, unsigned char *out, int *state, unsigned int *save)
-{
- register unsigned char *inptr, *outptr;
- unsigned char *inend, c;
- register unsigned int v;
- int i;
-
- inend = in+len;
- outptr = out;
-
- /* convert 4 base64 bytes to 3 normal bytes */
- v=*save;
- i=*state;
- inptr = in;
- while (inptr<inend) {
- c = base64_rank[*inptr++];
- if (c != 0xff) {
- v = (v<<6) | c;
- i++;
- if (i==4) {
- *outptr++ = v>>16;
- *outptr++ = v>>8;
- *outptr++ = v;
- i=0;
- }
- }
- }
-
- *save = v;
- *state = i;
-
- /* quick scan back for '=' on the end somewhere */
- /* fortunately we can drop 1 output char for each trailing = (upto 2) */
- i=2;
- while (inptr>in && i) {
- inptr--;
- if (base64_rank[*inptr] != 0xff) {
- if (*inptr == '=')
- outptr--;
- i--;
- }
- }
-
- /* if i!= 0 then there is a truncation error! */
- return outptr-out;
-}
-
-static int
-base64_decode_simple (char *data, int len)
-{
- int state = 0;
- unsigned int save = 0;
-
- return base64_decode_step ((unsigned char *)data, len,
- (unsigned char *)data, &state, &save);
-}
-
-static GString *
-getValue( char **src )
-{
- GString *dest = g_string_new("");
- char *s = *src;
- gboolean need_base64 = (*s == ':');
-
- copy_line:
- while( *s != 0 && *s != '\n' && *s != '\r' )
- dest = g_string_append_c (dest, *s++);
-
- if (*s == '\r') s++;
- if (*s == '\n') s++;
-
- /* check for continuation here */
- if (*s == ' ') {
- s++;
- goto copy_line;
- }
-
- if (need_base64) {
- int new_len;
- /* it's base64 encoded */
- dest = g_string_erase (dest, 0, 2);
- new_len = base64_decode_simple (dest->str, strlen (dest->str));
- dest = g_string_truncate (dest, new_len);
- }
-
- *src = s;
-
- return dest;
-}
-
-static gboolean
-parseLine (EContact *contact, EContactAddress *address, char **buf)
-{
- char *ptr;
- char *colon, *value;
- gboolean field_handled;
- GString *ldif_value;
-
- ptr = *buf;
-
- /* if the string is empty, return */
- if (*ptr == '\0') {
- *buf = NULL;
- return TRUE;
- }
-
- /* skip comment lines */
- if (*ptr == '#') {
- ptr = strchr (ptr, '\n');
- if (!ptr)
- *buf = NULL;
- else
- *buf = ptr + 1;
- return TRUE;
- }
-
- /* first, check for a 'continuation' line */
- if( ptr[0] == ' ' && ptr[1] != '\n' ) {
- g_warning ("unexpected continuation line");
- return FALSE;
- }
-
- colon = (char *)strchr( ptr, ':' );
- if (colon) {
- int i;
-
- *colon = 0;
- value = colon + 1;
- while ( isspace(*value) )
- value++;
-
- ldif_value = getValue(&value );
-
- field_handled = FALSE;
- for (i = 0; i < num_ldif_fields; i ++) {
- if (!g_ascii_strcasecmp (ptr, ldif_fields[i].ldif_attribute)) {
- if (ldif_fields[i].flags & FLAG_ADDRESS) {
- if (!g_ascii_strcasecmp (ptr, "locality"))
- address->locality = g_strdup (ldif_value->str);
- else if (!g_ascii_strcasecmp (ptr, "countryname"))
- address->country = g_strdup (ldif_value->str);
- else if (!g_ascii_strcasecmp (ptr, "postalcode"))
- address->code = g_strdup (ldif_value->str);
- else if (!g_ascii_strcasecmp (ptr, "st"))
- address->region = g_strdup (ldif_value->str);
- else if (!g_ascii_strcasecmp (ptr, "streetaddress"))
- address->street = g_strdup (ldif_value->str);
- }
- else if (ldif_fields[i].flags & FLAG_LIST) {
- GList *list;
-
- list = e_contact_get (contact, ldif_fields[i].contact_field);
- list = g_list_append (list, g_strdup (ldif_value->str));
- e_contact_set (contact, ldif_fields[i].contact_field, list);
-
- g_list_foreach (list, (GFunc) g_free, NULL);
- g_list_free (list);
- }
- else {
- /* FIXME is everything a string? */
- e_contact_set (contact, ldif_fields[i].contact_field, ldif_value->str);
- g_message ("set %s to %s", ptr, ldif_value->str);
- }
- field_handled = TRUE;
- break;
- }
- }
-
- /* handle objectclass/dn/member out here */
- if (!field_handled) {
- if (!g_ascii_strcasecmp (ptr, "dn"))
- g_hash_table_insert (dn_contact_hash, g_strdup(ldif_value->str), contact);
- else if (!g_ascii_strcasecmp (ptr, "objectclass") && !g_ascii_strcasecmp (ldif_value->str, "groupofnames")) {
- e_contact_set (contact, E_CONTACT_IS_LIST, GINT_TO_POINTER (TRUE));
- }
- else if (!g_ascii_strcasecmp (ptr, "member")) {
- GList *email;
-
- email = e_contact_get (contact, E_CONTACT_EMAIL);
- email = g_list_append (email, g_strdup (ldif_value->str));
- e_contact_set (contact, E_CONTACT_EMAIL, email);
-
- g_list_foreach (email, (GFunc) g_free, NULL);
- g_list_free (email);
- }
- }
-
- /* put the colon back the way it was, just for kicks */
- *colon = ':';
-
- g_string_free (ldif_value, TRUE);
- }
- else {
- g_warning ("unrecognized entry %s", ptr);
- return FALSE;
- }
-
- *buf = value;
-
- return TRUE;
-}
-
-static EContact *
-getNextLDIFEntry( FILE *f )
-{
- EContact *contact;
- EContactAddress *address;
- GString *str;
- char line[1024];
- char *buf;
-
- str = g_string_new ("");
- /* read from the file until we get to a blank line (or eof) */
- while (!feof (f)) {
- if (!fgets (line, sizeof(line), f))
- break;
- if (line[0] == '\n' || (line[0] == '\r' && line[1] == '\n'))
- break;
- str = g_string_append (str, line);
- }
-
- if (strlen (str->str) == 0) {
- g_string_free (str, TRUE);
- return NULL;
- }
-
- /* now parse that entry */
- contact = e_contact_new ();
- address = g_new0 (EContactAddress, 1);
-
- buf = str->str;
- while (buf) {
- if (!parseLine (contact, address, &buf)) {
- /* parsing error */
- g_object_unref (contact);
- return NULL;
- }
- }
-
- /* fill in the address */
- if (address->locality || address->country ||
- address->code || address->region || address->street)
- e_contact_set (contact, E_CONTACT_ADDRESS_HOME, address);
-
- g_string_free (str, TRUE);
-
- return contact;
-}
-
-static void
-resolve_list_card (LDIFImporter *gci, EContact *contact)
-{
- GList *email, *l;
- GList *email_attrs = NULL;
- char *full_name;
-
- /* set file_as to full_name so we don't later try and figure
- out a first/last name for the list. */
- full_name = e_contact_get (contact, E_CONTACT_FULL_NAME);
- if (full_name)
- e_contact_set (contact, E_CONTACT_FILE_AS, full_name);
- g_free (full_name);
-
- /* FIMXE getting might not be implemented in ebook */
- email = e_contact_get (contact, E_CONTACT_EMAIL);
- for (l = email; l; l = l->next) {
- /* mozilla stuffs dn's in the EMAIL list for contact lists */
- char *dn = l->data;
- EContact *dn_contact = g_hash_table_lookup (dn_contact_hash, dn);
-
- /* break list chains here, since we don't support them just yet */
- if (dn_contact && !e_contact_get (dn_contact, E_CONTACT_IS_LIST)) {
- EDestination *dest;
- EVCardAttribute *attr = e_vcard_attribute_new (NULL, EVC_EMAIL);
-
- /* Hard-wired for default e-mail, since netscape only exports 1 email address */
- dest = e_destination_new ();
- e_destination_set_contact (dest, dn_contact, 0);
-
- e_destination_export_to_vcard_attribute (dest, attr);
-
- g_object_unref (dest);
-
- email_attrs = g_list_append (email_attrs, attr);
- }
- }
- e_contact_set_attributes (contact, E_CONTACT_EMAIL, email_attrs);
-
- g_list_foreach (email, (GFunc) g_free, NULL);
- g_list_free (email);
- g_list_foreach (email_attrs, (GFunc) e_vcard_attribute_free, NULL);
- g_list_free (email_attrs);
-}
-
-static GList *
-create_contacts_from_ldif (const char *filename)
-{
- GList * list = NULL;
- GList * list_list = NULL;
- FILE * file;
- EContact *contact;
-
- if(!( file = fopen( filename, "r" ) )) {
- g_warning("Can't open .ldif file");
- return NULL;
- }
-
- dn_contact_hash = g_hash_table_new (g_str_hash, g_str_equal);
-
- while ((contact = getNextLDIFEntry (file))) {
-
- if (e_contact_get (contact, E_CONTACT_IS_LIST))
- list_list = g_list_append (list_list, contact);
- else
- list = g_list_append (list, contact);
- }
-
- fclose (file);
-
- list = g_list_reverse (list);
- list_list = g_list_reverse (list_list);
- list = g_list_concat (list, list_list);
-
- return list;
-}
-
-static void
-add_to_notes (EContact *contact, EContactField field)
-{
- const gchar *old_text;
- const gchar *field_text;
- gchar *new_text;
-
- old_text = e_contact_get_const (contact, E_CONTACT_NOTE);
- if (old_text && strstr (old_text, e_contact_pretty_name (field)))
- return;
-
- field_text = e_contact_get_const (contact, field);
- if (!field_text || !*field_text)
- return;
-
- new_text = g_strdup_printf ("%s%s%s: %s",
- old_text ? old_text : "",
- old_text && *old_text &&
- *(old_text + strlen (old_text) - 1) != '\n' ? "\n" : "",
- e_contact_pretty_name (field), field_text);
- e_contact_set (contact, E_CONTACT_NOTE, new_text);
- g_free (new_text);
-}
-
-/* EvolutionImporter methods */
-static void
-process_item_fn (EvolutionImporter *importer,
- CORBA_Object listener,
- void *closure,
- CORBA_Environment *ev)
-{
- LDIFImporter *gci = (LDIFImporter *) closure;
- EContact *contact;
-
- if (gci->iterator == NULL)
- gci->iterator = gci->contactlist;
-
- if (gci->ready == FALSE) {
- GNOME_Evolution_ImporterListener_notifyResult (listener,
- GNOME_Evolution_ImporterListener_NOT_READY,
- gci->iterator ? TRUE : FALSE,
- ev);
- return;
- }
-
- if (gci->iterator == NULL) {
- GNOME_Evolution_ImporterListener_notifyResult (listener,
- GNOME_Evolution_ImporterListener_UNSUPPORTED_OPERATION,
- FALSE, ev);
- return;
- }
-
- contact = gci->iterator->data;
- if (e_contact_get (contact, E_CONTACT_IS_LIST))
- resolve_list_card (gci, contact);
- else {
- /* Work around the fact that these fields no longer show up in the UI */
- add_to_notes (contact, E_CONTACT_OFFICE);
- add_to_notes (contact, E_CONTACT_SPOUSE);
- add_to_notes (contact, E_CONTACT_BLOG_URL);
- }
-
- /* FIXME Error checking */
- e_book_add_contact (gci->book, contact, NULL);
-
- gci->iterator = gci->iterator->next;
-
- GNOME_Evolution_ImporterListener_notifyResult (listener,
- GNOME_Evolution_ImporterListener_OK,
- gci->iterator ? TRUE : FALSE,
- ev);
- if (ev->_major != CORBA_NO_EXCEPTION) {
- g_warning ("Error notifying listeners.");
- }
-
- return;
-}
-
-static void
-primary_selection_changed_cb (ESourceSelector *selector, gpointer data)
-{
- LDIFImporter *gci = data;
-
- if (gci->primary)
- g_object_unref (gci->primary);
- gci->primary = g_object_ref (e_source_selector_peek_primary_selection (selector));
-}
-
-static void
-create_control_fn (EvolutionImporter *importer, Bonobo_Control *control, void *closure)
-{
- LDIFImporter *gci = closure;
- GtkWidget *vbox, *selector;
- ESource *primary;
- ESourceList *source_list;
-
- vbox = gtk_vbox_new (FALSE, FALSE);
-
- /* FIXME Better error handling */
- if (!e_book_get_addressbooks (&source_list, NULL))
- return;
-
- selector = e_source_selector_new (source_list);
- e_source_selector_show_selection (E_SOURCE_SELECTOR (selector), FALSE);
- gtk_box_pack_start (GTK_BOX (vbox), selector, FALSE, TRUE, 6);
-
- /* FIXME What if no sources? */
- primary = e_source_list_peek_source_any (source_list);
- e_source_selector_set_primary_selection (E_SOURCE_SELECTOR (selector), primary);
- if (!gci->primary)
- gci->primary = g_object_ref (primary);
- g_object_unref (source_list);
-
- g_signal_connect (G_OBJECT (selector), "primary_selection_changed",
- G_CALLBACK (primary_selection_changed_cb), gci);
-
- gtk_widget_show_all (vbox);
-
- *control = BONOBO_OBJREF (bonobo_control_new (vbox));
-}
-
-static char *supported_extensions[2] = {
- ".ldif", NULL
-};
-
-static gboolean
-support_format_fn (EvolutionImporter *importer,
- const char *filename,
- void *closure)
-{
- char *ext;
- int i;
-
- ext = strrchr (filename, '.');
- if (ext == NULL) {
- return FALSE;
- }
-
- for (i = 0; supported_extensions[i] != NULL; i++) {
- if (strcmp (supported_extensions[i], ext) == 0)
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-importer_destroy_cb (gpointer data,
- GObject *where_object_was)
-{
- LDIFImporter *gci = data;
-
- if (gci->primary)
- g_object_unref (gci->primary);
-
- if (gci->book)
- g_object_unref (gci->book);
-
- g_list_foreach (gci->contactlist, (GFunc) g_object_unref, NULL);
- g_list_free (gci->contactlist);
-
- g_free (gci);
-}
-
-static gboolean
-load_file_fn (EvolutionImporter *importer,
- const char *filename,
- void *closure)
-{
- LDIFImporter *gci;
-
- gci = (LDIFImporter *) closure;
- gci->contactlist = NULL;
- gci->iterator = NULL;
- gci->ready = FALSE;
-
- /* Load the book and the cards */
- gci->book = e_book_new (gci->primary, NULL);
- if (!gci->book) {
- g_message (G_STRLOC ":Couldn't create EBook.");
- return FALSE;
- }
- e_book_open (gci->book, TRUE, NULL);
- gci->contactlist = create_contacts_from_ldif (filename);
- gci->ready = TRUE;
-
- return TRUE;
-}
-
-static BonoboObject *
-factory_fn (BonoboGenericFactory *_factory,
- const char *component_id,
- void *closure)
-{
- EvolutionImporter *importer;
- LDIFImporter *gci;
-
- if (!strcmp (component_id, COMPONENT_IID)) {
- gci = g_new0 (LDIFImporter, 1);
- importer = evolution_importer_new (create_control_fn, support_format_fn,
- load_file_fn, process_item_fn, NULL, gci);
-
- g_object_weak_ref (G_OBJECT (importer),
- importer_destroy_cb, gci);
-
- return BONOBO_OBJECT (importer);
- }
- else {
- g_warning (COMPONENT_FACTORY_IID ": Don't know what to do with %s", component_id);
- return NULL;
- }
-}
-
-BONOBO_ACTIVATION_SHLIB_FACTORY (COMPONENT_FACTORY_IID, "Evolution LDIF importer Factory", factory_fn, NULL)
diff --git a/addressbook/importers/evolution-vcard-importer.c b/addressbook/importers/evolution-vcard-importer.c
deleted file mode 100644
index 8179179558..0000000000
--- a/addressbook/importers/evolution-vcard-importer.c
+++ /dev/null
@@ -1,443 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution calendar importer component
- *
- * Copyright (C) 2004 Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Authors: Chris Toshok <toshok@ximian.com>
- * JP Rosevear <jpr@ximian.com>
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <string.h>
-
-#include <gtk/gtkcheckbutton.h>
-#include <gtk/gtkhbox.h>
-#include <gtk/gtkvbox.h>
-#include <gtk/gtkmain.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkradiobutton.h>
-#include <gtk/gtknotebook.h>
-#include <bonobo/bonobo-context.h>
-#include <bonobo/bonobo-shlib-factory.h>
-#include <bonobo/bonobo-control.h>
-
-#include <libebook/e-book.h>
-#include <libedataserverui/e-source-selector.h>
-
-#include <importer/evolution-importer.h>
-#include <importer/GNOME_Evolution_Importer.h>
-#include <util/eab-book-util.h>
-#include <libebook/e-destination.h>
-
-#define COMPONENT_FACTORY_IID "OAFIID:GNOME_Evolution_Addressbook_VCard_ImporterFactory:" BASE_VERSION
-#define COMPONENT_IID "OAFIID:GNOME_Evolution_Addressbook_VCard_Importer:" BASE_VERSION
-
-typedef struct {
- ESource *primary;
-
- GList *contactlist;
- GList *iterator;
- EBook *book;
- gboolean ready;
-} VCardImporter;
-
-static void
-add_to_notes (EContact *contact, EContactField field)
-{
- const gchar *old_text;
- const gchar *field_text;
- gchar *new_text;
-
- old_text = e_contact_get_const (contact, E_CONTACT_NOTE);
- if (old_text && strstr (old_text, e_contact_pretty_name (field)))
- return;
-
- field_text = e_contact_get_const (contact, field);
- if (!field_text || !*field_text)
- return;
-
- new_text = g_strdup_printf ("%s%s%s: %s",
- old_text ? old_text : "",
- old_text && *old_text &&
- *(old_text + strlen (old_text) - 1) != '\n' ? "\n" : "",
- e_contact_pretty_name (field), field_text);
- e_contact_set (contact, E_CONTACT_NOTE, new_text);
- g_free (new_text);
-}
-
-/* EvolutionImporter methods */
-static void
-process_item_fn (EvolutionImporter *importer,
- CORBA_Object listener,
- void *closure,
- CORBA_Environment *ev)
-{
- VCardImporter *gci = (VCardImporter *) closure;
- EContact *contact;
- EContactPhoto *photo;
- GList *attrs, *attr;
-
- if (gci->iterator == NULL)
- gci->iterator = gci->contactlist;
-
- if (gci->ready == FALSE) {
- GNOME_Evolution_ImporterListener_notifyResult (listener,
- GNOME_Evolution_ImporterListener_NOT_READY,
- gci->iterator ? TRUE : FALSE,
- ev);
- return;
- }
-
- if (gci->iterator == NULL) {
- GNOME_Evolution_ImporterListener_notifyResult (listener,
- GNOME_Evolution_ImporterListener_UNSUPPORTED_OPERATION,
- FALSE, ev);
- return;
- }
-
- contact = gci->iterator->data;
-
- /* Apple's addressbook.app exports PHOTO's without a TYPE
- param, so let's figure out the format here if there's a
- PHOTO attribute missing a TYPE param.
-
- this is sort of a hack, as EContact sets the type for us if
- we use the setter. so let's e_contact_get + e_contact_set
- on E_CONTACT_PHOTO.
- */
- photo = e_contact_get (contact, E_CONTACT_PHOTO);
- if (photo) {
- e_contact_set (contact, E_CONTACT_PHOTO, photo);
- e_contact_photo_free (photo);
- }
-
- /* Deal with our XML EDestination stuff in EMAIL attributes, if there is any. */
- attrs = e_contact_get_attributes (contact, E_CONTACT_EMAIL);
- for (attr = attrs; attr; attr = attr->next) {
- EVCardAttribute *a = attr->data;
- GList *v = e_vcard_attribute_get_values (a);
-
- if (v && v->data) {
- if (!strncmp ((char*)v->data, "<?xml", 5)) {
- EDestination *dest = e_destination_import ((char*)v->data);
-
- e_destination_export_to_vcard_attribute (dest, a);
-
- g_object_unref (dest);
-
- }
- }
- }
- e_contact_set_attributes (contact, E_CONTACT_EMAIL, attrs);
-
- /*
- Deal with TEL attributes that don't conform to what we need.
-
- 1. if there's no location (HOME/WORK/OTHER), default to OTHER.
- 2. if there's *only* a location specified, default to VOICE.
- */
- attrs = e_vcard_get_attributes (E_VCARD (contact));
- for (attr = attrs; attr; attr = attr->next) {
- EVCardAttribute *a = attr->data;
- gboolean location_only = TRUE;
- gboolean no_location = TRUE;
- GList *params, *param;
-
- if (g_ascii_strcasecmp (e_vcard_attribute_get_name (a),
- EVC_TEL))
- continue;
-
- params = e_vcard_attribute_get_params (a);
- for (param = params; param; param = param->next) {
- EVCardAttributeParam *p = param->data;
- GList *vs, *v;
-
- if (g_ascii_strcasecmp (e_vcard_attribute_param_get_name (p),
- EVC_TYPE))
- continue;
-
- vs = e_vcard_attribute_param_get_values (p);
- for (v = vs; v; v = v->next) {
- if (!g_ascii_strcasecmp ((char*)v->data, "WORK") ||
- !g_ascii_strcasecmp ((char*)v->data, "HOME") ||
- !g_ascii_strcasecmp ((char*)v->data, "OTHER"))
- no_location = FALSE;
- else
- location_only = FALSE;
- }
- }
-
- if (location_only) {
- /* add VOICE */
- e_vcard_attribute_add_param_with_value (a,
- e_vcard_attribute_param_new (EVC_TYPE),
- "VOICE");
- }
- if (no_location) {
- /* add OTHER */
- e_vcard_attribute_add_param_with_value (a,
- e_vcard_attribute_param_new (EVC_TYPE),
- "OTHER");
- }
- }
-
- /*
- Deal with ADR attributes that don't conform to what we need.
-
- if HOME or WORK isn't specified, add TYPE=OTHER.
- */
- attrs = e_vcard_get_attributes (E_VCARD (contact));
- for (attr = attrs; attr; attr = attr->next) {
- EVCardAttribute *a = attr->data;
- gboolean no_location = TRUE;
- GList *params, *param;
-
- if (g_ascii_strcasecmp (e_vcard_attribute_get_name (a),
- EVC_ADR))
- continue;
-
- params = e_vcard_attribute_get_params (a);
- for (param = params; param; param = param->next) {
- EVCardAttributeParam *p = param->data;
- GList *vs, *v;
-
- if (g_ascii_strcasecmp (e_vcard_attribute_param_get_name (p),
- EVC_TYPE))
- continue;
-
- vs = e_vcard_attribute_param_get_values (p);
- for (v = vs; v; v = v->next) {
- if (!g_ascii_strcasecmp ((char*)v->data, "WORK") ||
- !g_ascii_strcasecmp ((char*)v->data, "HOME"))
- no_location = FALSE;
- }
- }
-
- if (no_location) {
- /* add OTHER */
- e_vcard_attribute_add_param_with_value (a,
- e_vcard_attribute_param_new (EVC_TYPE),
- "OTHER");
- }
- }
-
- /* Work around the fact that these fields no longer show up in the UI */
- add_to_notes (contact, E_CONTACT_OFFICE);
- add_to_notes (contact, E_CONTACT_SPOUSE);
- add_to_notes (contact, E_CONTACT_BLOG_URL);
-
- /* FIXME Error checking */
- e_book_add_contact (gci->book, contact, NULL);
-
- gci->iterator = gci->iterator->next;
-
- GNOME_Evolution_ImporterListener_notifyResult (listener,
- GNOME_Evolution_ImporterListener_OK,
- gci->iterator ? TRUE : FALSE,
- ev);
- if (ev->_major != CORBA_NO_EXCEPTION) {
- g_warning ("Error notifying listeners.");
- }
-
- return;
-}
-
-static char *supported_extensions[3] = {
- ".vcf",
- ".gcrd",
- NULL
-};
-
-/* Actually check the contents of this file */
-static gboolean
-check_file_is_vcard (const char *filename)
-{
- FILE *handle;
- char line[4096];
- gboolean result;
-
- handle = fopen (filename, "r");
- if (handle == NULL) {
- g_print ("\n");
- return FALSE;
- }
-
- fgets (line, 4096, handle);
- if (line == NULL) {
- fclose (handle);
- g_print ("\n");
- return FALSE;
- }
-
- if (g_ascii_strncasecmp (line, "BEGIN:VCARD", 11) == 0) {
- result = TRUE;
- } else {
- result = FALSE;
- }
-
- fclose (handle);
- return result;
-}
-
-static void
-primary_selection_changed_cb (ESourceSelector *selector, gpointer data)
-{
- VCardImporter *gci = data;
-
- if (gci->primary)
- g_object_unref (gci->primary);
- gci->primary = g_object_ref (e_source_selector_peek_primary_selection (selector));
-}
-
-static void
-create_control_fn (EvolutionImporter *importer, Bonobo_Control *control, void *closure)
-{
- VCardImporter *gci = closure;
- GtkWidget *vbox, *selector;
- ESource *primary;
- ESourceList *source_list;
-
- vbox = gtk_vbox_new (FALSE, FALSE);
-
- /* FIXME Better error handling */
- if (!e_book_get_addressbooks (&source_list, NULL))
- return;
-
- selector = e_source_selector_new (source_list);
- e_source_selector_show_selection (E_SOURCE_SELECTOR (selector), FALSE);
- gtk_box_pack_start (GTK_BOX (vbox), selector, FALSE, TRUE, 6);
-
- /* FIXME What if no sources? */
- primary = e_source_list_peek_source_any (source_list);
- e_source_selector_set_primary_selection (E_SOURCE_SELECTOR (selector), primary);
- if (!gci->primary)
- gci->primary = g_object_ref (primary);
- g_object_unref (source_list);
-
- g_signal_connect (G_OBJECT (selector), "primary_selection_changed",
- G_CALLBACK (primary_selection_changed_cb), gci);
-
- gtk_widget_show_all (vbox);
-
- *control = BONOBO_OBJREF (bonobo_control_new (vbox));
-}
-
-static gboolean
-support_format_fn (EvolutionImporter *importer,
- const char *filename,
- void *closure)
-{
- char *ext;
- int i;
-
- ext = strrchr (filename, '.');
- if (ext == NULL) {
- return check_file_is_vcard (filename);
- }
- for (i = 0; supported_extensions[i] != NULL; i++) {
- if (g_ascii_strcasecmp (supported_extensions[i], ext) == 0)
- return check_file_is_vcard (filename);
- }
-
- return FALSE;
-}
-
-static void
-importer_destroy_cb (gpointer data,
- GObject *where_object_was)
-{
- VCardImporter *gci = data;
-
- if (gci->primary)
- g_object_unref (gci->primary);
-
- if (gci->book)
- g_object_unref (gci->book);
-
- g_list_foreach (gci->contactlist, (GFunc) g_object_unref, NULL);
- g_list_free (gci->contactlist);
-
- g_free (gci);
-}
-
-static gboolean
-load_file_fn (EvolutionImporter *importer,
- const char *filename,
- void *closure)
-{
- VCardImporter *gci;
- char *contents;
-
- if (check_file_is_vcard (filename) == FALSE) {
- return FALSE;
- }
-
- gci = (VCardImporter *) closure;
- gci->contactlist = NULL;
- gci->iterator = NULL;
- gci->ready = FALSE;
-
- /* Load the book */
- gci->book = e_book_new (gci->primary, NULL);
- if (!gci->book) {
- g_message (G_STRLOC ":Couldn't create EBook.");
- return FALSE;
- }
- e_book_open (gci->book, TRUE, NULL);
-
- /* Load the file and the contacts */
- if (!g_file_get_contents (filename, &contents, NULL, NULL)) {
- g_message (G_STRLOC ":Couldn't read file.");
- return FALSE;
- }
- gci->contactlist = eab_contact_list_from_string (contents);
- g_free (contents);
-
- gci->ready = TRUE;
-
- return TRUE;
-}
-
-static BonoboObject *
-factory_fn (BonoboGenericFactory *_factory,
- const char *component_id,
- void *closure)
-{
- EvolutionImporter *importer;
- VCardImporter *gci;
-
- if (!strcmp (component_id, COMPONENT_IID)) {
- gci = g_new0 (VCardImporter, 1);
- importer = evolution_importer_new (create_control_fn, support_format_fn,
- load_file_fn, process_item_fn, NULL, gci);
-
- g_object_weak_ref (G_OBJECT (importer),
- importer_destroy_cb, gci);
- return BONOBO_OBJECT (importer);
- }
- else {
- g_warning (COMPONENT_FACTORY_IID ": Don't know what to do with %s", component_id);
- return NULL;
- }
-}
-
-BONOBO_ACTIVATION_SHLIB_FACTORY (COMPONENT_FACTORY_IID, "Evolution VCard Importer Factory", factory_fn, NULL)
diff --git a/addressbook/printing/.cvsignore b/addressbook/printing/.cvsignore
deleted file mode 100644
index 96194f7fd7..0000000000
--- a/addressbook/printing/.cvsignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-contact-print-test
-contact-print-style-editor-test
diff --git a/addressbook/printing/Makefile.am b/addressbook/printing/Makefile.am
deleted file mode 100644
index 8da93df0b8..0000000000
--- a/addressbook/printing/Makefile.am
+++ /dev/null
@@ -1,57 +0,0 @@
-ecpsdir = $(privdatadir)/ecps
-ecps_DATA = \
- smallbook.ecps \
- medbook.ecps \
- phonelist.ecps
-
-glade_DATA = \
- e-contact-print.glade
-
-INCLUDES = \
- $(GNOME_INCLUDEDIR) \
- -DG_LOG_DOMAIN=\"addressbook-printing\" \
- -I$(top_srcdir)/addressbook \
- -I$(top_srcdir)/addressbook/backend \
- -I$(top_builddir)/addressbook/backend \
- -I$(top_srcdir) \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_ECPSDIR=\""$(ecpsdir)"\" \
- $(EVOLUTION_ADDRESSBOOK_CFLAGS)
-
-noinst_LTLIBRARIES = \
- libecontactprint.la
-
-libecontactprint_la_SOURCES = \
- e-contact-print-envelope.c \
- e-contact-print-envelope.h \
- e-contact-print-style-editor.c \
- e-contact-print-style-editor.h \
- e-contact-print-types.h \
- e-contact-print.c \
- e-contact-print.h
-
-noinst_PROGRAMS = \
- contact-print-test \
- contact-print-style-editor-test
-
-contact_print_test_SOURCES = \
- test-print.c
-
-contact_print_test_LDADD = \
- libecontactprint.la \
- $(top_builddir)/addressbook/util/libeabutil.la \
- $(EVOLUTION_ADDRESSBOOK_LIBS)
-
-contact_print_style_editor_test_SOURCES = \
- test-contact-print-style-editor.c
-
-contact_print_style_editor_test_LDADD = \
- libecontactprint.la \
- $(top_builddir)/addressbook/util/libeabutil.la \
- $(EVOLUTION_ADDRESSBOOK_LIBS)
-
-
-
-EXTRA_DIST = \
- $(glade_DATA) \
- $(ecps_DATA)
diff --git a/addressbook/printing/e-contact-print-envelope.c b/addressbook/printing/e-contact-print-envelope.c
deleted file mode 100644
index 38532720fa..0000000000
--- a/addressbook/printing/e-contact-print-envelope.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-print-envelope.c
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-#include "addressbook/printing/e-contact-print-envelope.h"
-#include <glib.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <time.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
-#include <e-util/e-print.h>
-
-#define ENVELOPE_HEIGHT (72.0 * 4.0)
-#define ENVELOPE_WIDTH (72.0 * 9.5)
-
-typedef struct {
- int start;
- int length;
-} EcpeLine;
-
-static void
-startset(void *pointer, EcpeLine **iterator)
-{
- (*iterator)--;
- (*iterator)->start = GPOINTER_TO_INT(pointer);
-}
-
-static void
-lengthset(void *pointer, EcpeLine **iterator)
-{
- (*iterator)--;
- (*iterator)->length = GPOINTER_TO_INT(pointer);
-}
-
-static EcpeLine *
-ecpe_break(char *address)
-{
- int i;
- int length = 0;
- int laststart = 0;
- GList *startlist = NULL;
- GList *lengthlist = NULL;
- EcpeLine *ret_val;
- EcpeLine *iterator;
-
- for (i = 0; address[i]; i++) {
- if (address[i] == '\n') {
- startlist = g_list_prepend (startlist, GINT_TO_POINTER(laststart));
- lengthlist = g_list_prepend (lengthlist, GINT_TO_POINTER(i - laststart));
- length ++;
- laststart = i + 1;
- }
- }
- startlist = g_list_prepend (startlist, GINT_TO_POINTER(laststart));
- lengthlist = g_list_prepend (lengthlist, GINT_TO_POINTER(i - laststart));
- length ++;
-
- ret_val = g_new(EcpeLine, length + 1);
-
- iterator = ret_val + length;
- g_list_foreach(startlist, (GFunc) startset, &iterator);
- g_list_free(startlist);
-
- iterator = ret_val + length;
- g_list_foreach(lengthlist, (GFunc) lengthset, &iterator);
- g_list_free(lengthlist);
-
- ret_val[length].start = -1;
- ret_val[length].length = -1;
-
- return ret_val;
-}
-
-static void
-ecpe_linelist_dimensions(GnomeFont *font, char *address, EcpeLine *linelist, double *widthp, double *heightp)
-{
- double width = 0;
- int i;
- if (widthp) {
- for (i = 0; linelist[i].length != -1; i++) {
- width = MAX(width, gnome_font_get_width_utf8_sized (font, address + linelist[i].start, linelist[i].length));
- }
- *widthp = width;
- } else {
- for (i = 0; linelist[i].length != -1; i++)
- /* Intentionally empty */;
- }
- if (heightp) {
- *heightp = gnome_font_get_size(font) * i;
- }
-}
-
-static void
-ecpe_linelist_print(GnomePrintContext *pc, GnomeFont *font, char *address, EcpeLine *linelist, double x, double y)
-{
- int i;
- gnome_print_setfont(pc, font);
- for (i = 0; linelist[i].length != -1; i++) {
- gnome_print_moveto(pc, x, y + gnome_font_get_ascender(font));
- gnome_print_show_sized (pc, address + linelist[i].start, linelist[i].length);
- y -= gnome_font_get_size(font);
- }
-}
-
-static gint
-e_contact_print_envelope_close(GnomeDialog *dialog, gpointer data)
-{
- return FALSE;
-}
-
-static void
-ecpe_print(GnomePrintContext *pc, EContact *contact, gboolean as_return)
-{
- char *address;
- EcpeLine *linelist;
- double x;
- double y;
- GnomeFont *font;
-
-
- gnome_print_rotate(pc, 90);
- gnome_print_translate(pc, 72.0 * 11.0 - ENVELOPE_WIDTH, -72.0 * 8.5 + (72.0 * 8.5 - ENVELOPE_HEIGHT) / 2);
-
- address = e_contact_get(contact, E_CONTACT_ADDRESS_LABEL_WORK);
- linelist = ecpe_break(address);
- if (as_return)
- font = gnome_font_find ("Sans", 9);
- else
- font = gnome_font_find ("Sans", 12);
- ecpe_linelist_dimensions(font, address, linelist, NULL, &y);
- if (as_return) {
- x = 36;
- y = ENVELOPE_HEIGHT - 36;
- } else {
- x = ENVELOPE_WIDTH / 2;
- y = (ENVELOPE_HEIGHT - y) / 2;
- }
- ecpe_linelist_print(pc, font, address, linelist, x, y);
- g_object_unref(font);
- g_free(linelist);
-
- g_free(address);
-
- gnome_print_showpage(pc);
- gnome_print_context_close(pc);
-}
-
-static void
-e_contact_print_envelope_button(GnomeDialog *dialog, gint button, gpointer data)
-{
- GnomePrintJob *master;
- GnomePrintContext *pc;
- GnomePrintConfig *config;
- EContact *contact = NULL;
- GtkWidget *preview;
-
- contact = g_object_get_data(G_OBJECT(dialog), "contact");
-
- switch( button ) {
- case GNOME_PRINT_DIALOG_RESPONSE_PRINT:
- config = gnome_print_dialog_get_config (GNOME_PRINT_DIALOG (dialog));
- master = gnome_print_job_new (config);
- pc = gnome_print_job_get_context( master );
-
- ecpe_print(pc, contact, FALSE);
-
- gnome_print_job_print(master);
- gnome_dialog_close(dialog);
- break;
- case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW:
- config = gnome_print_dialog_get_config (GNOME_PRINT_DIALOG (dialog));
- master = gnome_print_job_new (config);
- pc = gnome_print_job_get_context( master );
-
- ecpe_print(pc, contact, FALSE);
-
- preview = GTK_WIDGET(gnome_print_job_preview_new(master, "Print Preview"));
- gtk_widget_show_all(preview);
- break;
- case GNOME_PRINT_DIALOG_RESPONSE_CANCEL:
- g_object_unref(contact);
- gnome_dialog_close(dialog);
- break;
- }
-}
-
-GtkWidget *
-e_contact_print_envelope_dialog_new(EContact *contact)
-{
- GtkWidget *dialog;
-
- dialog = e_print_get_dialog (_("Print envelope"), GNOME_PRINT_DIALOG_COPIES);
-
- contact = e_contact_duplicate(contact);
- g_object_set_data(G_OBJECT(dialog), "contact", contact);
- g_signal_connect(dialog,
- "clicked", G_CALLBACK(e_contact_print_envelope_button), NULL);
- g_signal_connect(dialog,
- "close", G_CALLBACK(e_contact_print_envelope_close), NULL);
- return dialog;
-}
-
-/* FIXME: Print all the contacts selected. */
-GtkWidget *
-e_contact_print_envelope_list_dialog_new(GList *list)
-{
- GtkWidget *dialog;
- EContact *contact;
-
- if (list == NULL)
- return NULL;
-
- dialog = e_print_get_dialog(_("Print envelope"), GNOME_PRINT_DIALOG_COPIES);
-
- contact = e_contact_duplicate(list->data);
- g_object_set_data(G_OBJECT(dialog), "contact", contact);
- g_signal_connect(dialog,
- "clicked", G_CALLBACK(e_contact_print_envelope_button), NULL);
- g_signal_connect(dialog,
- "close", G_CALLBACK(e_contact_print_envelope_close), NULL);
- return dialog;
-}
diff --git a/addressbook/printing/e-contact-print-envelope.h b/addressbook/printing/e-contact-print-envelope.h
deleted file mode 100644
index a7a8492638..0000000000
--- a/addressbook/printing/e-contact-print-envelope.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-print-envelope.h
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef E_CONTACT_PRINT_ENVELOPE_H
-#define E_CONTACT_PRINT_ENVELOPE_H
-
-#include <gtk/gtkwidget.h>
-#include <libebook/e-contact.h>
-#include "e-contact-print-types.h"
-
-GtkWidget *e_contact_print_envelope_dialog_new(EContact *contact);
-GtkWidget *e_contact_print_envelope_list_dialog_new(GList *list);
-
-#endif /* E_CONTACT_PRINT_ENVELOPE_H */
diff --git a/addressbook/printing/e-contact-print-style-editor.c b/addressbook/printing/e-contact-print-style-editor.c
deleted file mode 100644
index 436aaddff0..0000000000
--- a/addressbook/printing/e-contact-print-style-editor.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-print-style-editor.c
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include "e-contact-print-style-editor.h"
-
-static void e_contact_print_style_editor_init (EContactPrintStyleEditor *card);
-static void e_contact_print_style_editor_class_init (EContactPrintStyleEditorClass *klass);
-static void e_contact_print_style_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void e_contact_print_style_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void e_contact_print_style_editor_destroy (GtkObject *object);
-
-static GtkVBoxClass *parent_class = NULL;
-
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_CARD
-};
-
-GtkType
-e_contact_print_style_editor_get_type (void)
-{
- static GtkType contact_print_style_editor_type = 0;
-
- if (!contact_print_style_editor_type)
- {
- static const GtkTypeInfo contact_print_style_editor_info =
- {
- "EContactPrintStyleEditor",
- sizeof (EContactPrintStyleEditor),
- sizeof (EContactPrintStyleEditorClass),
- (GtkClassInitFunc) e_contact_print_style_editor_class_init,
- (GtkObjectInitFunc) e_contact_print_style_editor_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- contact_print_style_editor_type = gtk_type_unique (gtk_vbox_get_type (), &contact_print_style_editor_info);
- }
-
- return contact_print_style_editor_type;
-}
-
-static void
-e_contact_print_style_editor_class_init (EContactPrintStyleEditorClass *klass)
-{
- GtkObjectClass *object_class;
- GtkVBoxClass *vbox_class;
-
- object_class = (GtkObjectClass*) klass;
- vbox_class = (GtkVBoxClass *) klass;
-
- parent_class = gtk_type_class (gtk_vbox_get_type ());
-
- object_class->set_arg = e_contact_print_style_editor_set_arg;
- object_class->get_arg = e_contact_print_style_editor_get_arg;
- object_class->destroy = e_contact_print_style_editor_destroy;
-}
-
-#if 0
-static void
-_add_image(GtkTable *table, gchar *image, int left, int right, int top, int bottom)
-{
- gtk_table_attach(table,
- gtk_widget_new(gtk_alignment_get_type(),
- "child", gnome_pixmap_new_from_file(image),
- "xalign", (double) 0,
- "yalign", (double) 0,
- "xscale", (double) 0,
- "yscale", (double) 0,
- NULL),
- left, right, top, bottom,
- GTK_FILL, GTK_FILL,
- 0, 0);
-}
-#endif
-
-static void
-e_contact_print_style_editor_init (EContactPrintStyleEditor *e_contact_print_style_editor)
-{
- GladeXML *gui;
-
- /* e_contact_print_style_editor->card = NULL;*/
- gui = glade_xml_new (EVOLUTION_GLADEDIR "/e-contact-print.glade", NULL, NULL);
- e_contact_print_style_editor->gui = gui;
- gtk_widget_reparent(glade_xml_get_widget(gui, "vbox-contact-print-style-editor"),
- GTK_WIDGET(e_contact_print_style_editor));
-}
-
-void
-e_contact_print_style_editor_destroy (GtkObject *object)
-{
- EContactPrintStyleEditor *e_contact_print_style_editor = E_CONTACT_PRINT_STYLE_EDITOR(object);
-
- if (e_contact_print_style_editor->gui != NULL) {
- g_object_unref(e_contact_print_style_editor->gui);
- e_contact_print_style_editor->gui = NULL;
- }
-
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-GtkWidget*
-e_contact_print_style_editor_new (char *filename)
-{
- GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_contact_print_style_editor_get_type ()));
- return widget;
-}
-
-static void
-e_contact_print_style_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- EContactPrintStyleEditor *e_contact_print_style_editor;
-
- e_contact_print_style_editor = E_CONTACT_PRINT_STYLE_EDITOR (o);
-
- switch (arg_id){
- default:
- break;
- }
-}
-
-static void
-e_contact_print_style_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
- EContactPrintStyleEditor *e_contact_print_style_editor;
-
- e_contact_print_style_editor = E_CONTACT_PRINT_STYLE_EDITOR (object);
-
- switch (arg_id) {
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
diff --git a/addressbook/printing/e-contact-print-style-editor.h b/addressbook/printing/e-contact-print-style-editor.h
deleted file mode 100644
index e4604d551c..0000000000
--- a/addressbook/printing/e-contact-print-style-editor.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-contact-print-style-editor.h
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef __E_CONTACT_PRINT_STYLE_EDITOR_H__
-#define __E_CONTACT_PRINT_STYLE_EDITOR_H__
-
-#include <gtk/gtkvbox.h>
-#include <glade/glade.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* EContactPrintStyleEditor - A dialog displaying information about a contact.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- * card ECard * R The card currently being edited
- */
-
-#define E_CONTACT_PRINT_STYLE_EDITOR_TYPE (e_contact_print_style_editor_get_type ())
-#define E_CONTACT_PRINT_STYLE_EDITOR(obj) (GTK_CHECK_CAST ((obj), E_CONTACT_PRINT_STYLE_EDITOR_TYPE, EContactPrintStyleEditor))
-#define E_CONTACT_PRINT_STYLE_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CONTACT_PRINT_STYLE_EDITOR_TYPE, EContactPrintStyleEditorClass))
-#define E_IS_MINICARD(obj) (GTK_CHECK_TYPE ((obj), E_CONTACT_PRINT_STYLE_EDITOR_TYPE))
-#define E_IS_MINICARD_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CONTACT_PRINT_STYLE_EDITOR_TYPE))
-
-
-typedef struct _EContactPrintStyleEditor EContactPrintStyleEditor;
-typedef struct _EContactPrintStyleEditorClass EContactPrintStyleEditorClass;
-
-struct _EContactPrintStyleEditor
-{
- GtkVBox parent;
-
- /* item specific fields */
- GladeXML *gui;
-};
-
-struct _EContactPrintStyleEditorClass
-{
- GtkVBoxClass parent_class;
-};
-
-
-GtkWidget *e_contact_print_style_editor_new(char *filename);
-GtkType e_contact_print_style_editor_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_CONTACT_PRINT_STYLE_EDITOR_H__ */
diff --git a/addressbook/printing/e-contact-print-types.h b/addressbook/printing/e-contact-print-types.h
deleted file mode 100644
index b7082b41f6..0000000000
--- a/addressbook/printing/e-contact-print-types.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-print-types.h
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef E_CONTACT_PRINT_TYPES_H
-#define E_CONTACT_PRINT_TYPES_H
-
-#include <glib.h>
-#include <libgnomeprint/gnome-font.h>
-
-typedef struct _EContactPrintStyle EContactPrintStyle;
-typedef enum _EContactPrintType EContactPrintType;
-
-enum _EContactPrintType {
- E_CONTACT_PRINT_TYPE_CARDS,
- E_CONTACT_PRINT_TYPE_MEMO_STYLE,
- E_CONTACT_PRINT_TYPE_PHONE_LIST
-};
-
-struct _EContactPrintStyle
-{
- gchar *title;
- EContactPrintType type;
- gboolean sections_start_new_page;
- guint num_columns;
- guint blank_forms;
- gboolean letter_tabs;
- gboolean letter_headings;
- GnomeFont *headings_font;
- GnomeFont *body_font;
- gboolean print_using_grey;
- gint paper_type;
- gdouble paper_width;
- gdouble paper_height;
- gint paper_source;
- gdouble top_margin;
- gdouble left_margin;
- gdouble bottom_margin;
- gdouble right_margin;
- gint page_size;
- gdouble page_width;
- gdouble page_height;
- gboolean orientation_portrait;
- GnomeFont *header_font;
- gchar *left_header;
- gchar *center_header;
- gchar *right_header;
- GnomeFont *footer_font;
- gchar *left_footer;
- gchar *center_footer;
- gchar *right_footer;
- gboolean reverse_on_even_pages;
-};
-
-#endif /* E_CONTACT_PRINT_TYPES_H */
-
diff --git a/addressbook/printing/e-contact-print.c b/addressbook/printing/e-contact-print.c
deleted file mode 100644
index f0a7eff6d6..0000000000
--- a/addressbook/printing/e-contact-print.c
+++ /dev/null
@@ -1,1103 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-print.c
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-#include "e-contact-print.h"
-
-#include <ctype.h>
-#include <sys/types.h>
-#include <stdlib.h>
-#include <string.h>
-#include <glib.h>
-#include <libxml/tree.h>
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-#include <libgnome/gnome-util.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-font.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
-#include <libebook/e-book.h>
-#include <libebook/e-contact.h>
-#include <gal/util/e-util.h>
-#include <e-util/e-print.h>
-
-#define SCALE 5
-#define HYPHEN_PIXELS 20
-#define HYPHEN_PENALTY ( (SCALE) * (SCALE) * (HYPHEN_PIXELS) * (HYPHEN_PIXELS) )
-
-typedef struct _EContactPrintContext EContactPrintContext;
-
-struct _EContactPrintContext
-{
- GnomePrintContext *pc;
- GnomePrintJob *master;
- gdouble x;
- gdouble y;
- gint column;
- EContactPrintStyle *style;
- gboolean first_section;
- gchar first_char_on_page;
- gchar last_char_on_page;
- GnomeFont *letter_heading_font;
- GnomeFont *letter_tab_font;
- char *character;
- gboolean first_contact;
-
- gboolean uses_book;
- int type;
- EBook *book;
- EBookQuery *query;
-
- GList *contacts;
-};
-
-static gint
-e_contact_divide_text(GnomePrintContext *pc, GnomeFont *font, double width, const gchar *text, GList **return_val /* Of type char[] */)
-{
- if ( width == -1 || gnome_font_get_width_utf8(font, text) <= width ) {
- if ( return_val ) {
- *return_val = g_list_append(*return_val, g_strdup(text));
- }
- return 1;
- } else {
-#if 1
- int i, l;
- double x = 0;
- int lastend = 0;
- int linestart = 0;
- int firstword = 1;
- int linecount = 0;
- l = strlen(text);
- for ( i = 0; i < l; i++ ) {
- if ( text[i] == ' ' ) {
- if ( (!firstword) && x + gnome_font_get_width_utf8_sized(font, text + lastend, i - lastend) > width ) {
- if (return_val) {
- *return_val = g_list_append(*return_val, g_strndup(text + linestart, lastend - linestart));
- }
- x = gnome_font_get_width_utf8(font, " ");
- linestart = lastend + 1;
- x += gnome_font_get_width_utf8_sized(font, text + linestart, i - linestart);
- lastend = i;
- linecount ++;
- } else {
- x += gnome_font_get_width_utf8_sized(font, text + lastend, i - lastend);
- lastend = i;
- }
- firstword = 0;
- } else if ( text[i] == '\n' ) {
- if ( (!firstword) && x + gnome_font_get_width_utf8_sized(font, text + lastend, i - lastend) > width ) {
- if (return_val) {
- *return_val = g_list_append(*return_val, g_strndup(text + linestart, lastend - linestart));
- }
- linestart = lastend + 1;
- lastend = i;
- linecount ++;
- }
- if (return_val) {
- *return_val = g_list_append(*return_val, g_strndup(text + linestart, i - linestart));
- }
- linestart = i + 1;
- lastend = i + 1;
- linecount ++;
- x = gnome_font_get_width_utf8(font, " ");
-
- firstword = 1;
- }
- }
- if ( (!firstword) && x + gnome_font_get_width_utf8_sized(font, text + lastend, i - lastend) > width ) {
- if (return_val) {
- *return_val = g_list_append(*return_val, g_strndup(text + linestart, lastend - linestart));
- }
- linestart = lastend + 1;
- lastend = i;
- linecount ++;
- }
- if (return_val) {
- *return_val = g_list_append(*return_val, g_strndup(text + linestart, i - linestart));
- }
- linecount ++;
- return(linecount);
-#else
- HnjBreak *breaks;
- gint *result;
- gint *is;
- gint n_breaks = 0, n_actual_breaks = 0;
- gint i;
- gint l;
- gchar *hyphenation;
- double x = - gnome_font_get_width_utf8(font, " ") * SCALE;
- HnjParams hnjparams;
-
- hnjparams.set_width = width * SCALE + x;
- hnjparams.max_neg_space = 0;
- hnjparams.tab_width = 0;
-
- l = strlen(text);
-
- /* find possible line breaks. */
- for (i = 0; i < l; i++) {
- if (text[i] == '-')
- n_breaks++;
- else if (text[i] == ' ')
- n_breaks++;
-#if 0
- else if (hyphenation[i] & 1)
- n_breaks++;
-#endif
- }
-
- breaks = g_new( HnjBreak, n_breaks + 1 );
- result = g_new( gint, n_breaks + 1 );
- is = g_new( gint, n_breaks + 1 );
- n_breaks = 0;
- /* find possible line breaks. */
-
- for (i = 0; i < l; i++) {
- if ( text[i] == '-' ) {
- x += gnome_font_get_width(font, text[i]) * SCALE;
- breaks[n_breaks].x0 = x;
- breaks[n_breaks].x1 = x;
- breaks[n_breaks].penalty = HYPHEN_PENALTY;
- breaks[n_breaks].flags = HNJ_JUST_FLAG_ISHYPHEN;
- is[n_breaks] = i + 1;
- n_breaks++;
- } else if ( text[i] == ' ' ) {
- breaks[ n_breaks ].x0 = x;
- x += gnome_font_get_width(font, text[i]) * SCALE;
- breaks[ n_breaks ].x1 = x;
- breaks[ n_breaks ].penalty = 0;
- breaks[ n_breaks ].flags = HNJ_JUST_FLAG_ISSPACE;
- is[ n_breaks ] = i + 1;
- n_breaks++;
-#if 0
- } else if (word->hyphenation[i] & 1) {
- breaks[n_breaks].x0 = x + gnome_font_get_width(font, '-') * SCALE;
- breaks[n_breaks].x1 = x;
- breaks[n_breaks].penalty = HYPHEN_PENALTY;
- breaks[n_breaks].flags = HNJ_JUST_FLAG_ISHYPHEN;
- is[n_breaks] = i + 1;
- n_breaks++;
-#endif
- } else
- x += gnome_font_get_width(font, text[i]) * SCALE;
-
- }
- is[n_breaks] = i;
- breaks[n_breaks].flags = 0;
- n_breaks++;
-
- /* Calculate optimal line breaks. */
- n_actual_breaks = hnj_hs_just (breaks, n_breaks,
- &hnjparams, result);
-
- if ( return_val ) {
- gchar *next_val;
- if ( breaks[result[0]].flags == HNJ_JUST_FLAG_ISHYPHEN && text[is[result[0]]] != '-' ) {
- next_val = g_new(gchar, is[result[0]] + 2);
- strncpy(next_val, text, is[result[0]]);
- next_val[is[result[0]]] = 0;
- strcat(next_val, "-");
- } else {
- next_val = g_new(gchar, is[result[0]] + 1);
- strncpy(next_val, text, is[result[0]]);
- next_val[is[result[0]]] = 0;
- }
- *return_val = g_list_append(*return_val, next_val);
-
- for ( i = 1; i < n_actual_breaks; i++ ) {
- if ( (breaks[result[i]].flags & HNJ_JUST_FLAG_ISHYPHEN) && (text[is[result[i]]] != '-') ) {
- next_val = g_new(gchar, is[result[i]] - is[result[i - 1]] + 2);
- strncpy(next_val, text + is[result[i - 1]], is[result[i]] - is[result[i - 1]]);
- next_val[is[result[i]] - is[result[i - 1]]] = 0;
- strcat(next_val, "-");
- } else {
- next_val = g_new(gchar, is[result[i]] - is[result[i - 1]] + 1);
- strncpy(next_val, text + is[result[i - 1]], is[result[i]] - is[result[i - 1]]);
- next_val[is[result[i]] - is[result[i - 1]]] = 0;
- }
- *return_val = g_list_append(*return_val, next_val);
- }
- }
-
- g_free (breaks);
- g_free (result);
- g_free (is);
- return n_actual_breaks;
-#endif
- }
-}
-
-static void
-e_contact_output(GnomePrintContext *pc, GnomeFont *font, double x, double y, double width, const gchar *text)
-{
- GList *list = NULL, *list_start;
- int first_line = 1;
- gnome_print_gsave(pc);
- gnome_print_setfont(pc, font);
- e_contact_divide_text(pc, font, width, text, &list);
- for ( list_start = list; list; list = g_list_next(list)) {
- y -= gnome_font_get_ascender(font);
- gnome_print_moveto(pc, x, y);
- gnome_print_show(pc, (char *)list->data);
- y -= gnome_font_get_descender(font);
- y -= .2 * gnome_font_get_size (font);
- if ( first_line ) {
- x += gnome_font_get_width_utf8(font, " ");
- first_line = 0;
- }
- }
- g_list_foreach( list_start, (GFunc) g_free, NULL );
- g_list_free( list_start );
- gnome_print_grestore(pc);
-}
-
-static gdouble
-e_contact_text_height(GnomePrintContext *pc, GnomeFont *font, double width, const gchar *text)
-{
- int line_count = e_contact_divide_text(pc, font, width, text, NULL);
- return line_count * (gnome_font_get_ascender(font) + gnome_font_get_descender(font)) +
- (line_count - 1) * .2 * gnome_font_get_size (font);
-}
-
-#if 0
-static void
-e_contact_output_and_advance(EContactPrintContext *ctxt, GnomeFont *font, double x, double width, gchar *text)
-{
- ctxt->y -= .1 * gnome_font_get_size (font);
- e_contact_output(ctxt->pc, font, x, ctxt->y, width, text);
- ctxt->y -= e_contact_text_height(ctxt->pc, font, width, text);
- ctxt->y -= .1 * gnome_font_get_size (font);
-}
-#endif
-
-static void
-e_contact_rectangle(GnomePrintContext *pc,
- gdouble x0,
- gdouble y0,
- gdouble x1,
- gdouble y1,
- gdouble r,
- gdouble g,
- gdouble b)
-{
- gnome_print_gsave(pc);
- gnome_print_setrgbcolor(pc, r, g, b);
- gnome_print_moveto(pc, x0, y0);
- gnome_print_lineto(pc, x1, y0);
- gnome_print_lineto(pc, x1, y1);
- gnome_print_lineto(pc, x0, y1);
- gnome_print_lineto(pc, x0, y0);
- gnome_print_fill(pc);
- gnome_print_grestore(pc);
-}
-
-static double
-e_contact_get_letter_tab_width (EContactPrintContext *ctxt)
-{
- return gnome_font_get_width_utf8(ctxt->letter_tab_font, "123") + 4 + 18;
-}
-
-static double
-e_contact_print_letter_tab (EContactPrintContext *ctxt)
-{
- unsigned char character;
- gdouble x, y;
- gdouble page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin);
- gdouble tab_height, tab_width;
- gdouble font_size;
- tab_height = 72 * (ctxt->style->page_height - ctxt->style->top_margin - ctxt->style->bottom_margin) / 27.0;
- font_size = tab_height / 2;
- tab_width = e_contact_get_letter_tab_width(ctxt) - 18;
- x = page_width + 72 * (ctxt->style->left_margin) - tab_width;
- y = 72 * (ctxt->style->page_height - ctxt->style->top_margin);
-
-
- gnome_print_gsave( ctxt->pc );
- if ( ctxt->style->print_using_grey )
- e_contact_rectangle( ctxt->pc, x, 72 * (ctxt->style->page_height - ctxt->style->top_margin), x + tab_width, ctxt->style->bottom_margin * 72, .85, .85, .85 );
- for ( character = 'A' - 1; character <= 'Z'; character ++ ) {
- char string[] = "123";
- if ( character >= 'A' ) {
- string[0] = tolower(character);
- string[1] = 0;
- }
- if ( character >= ctxt->first_char_on_page && character <= ctxt->last_char_on_page ) {
- e_contact_rectangle( ctxt->pc, x + 1, y - 1, x + tab_width - 1, y - (tab_height - 1), 0, 0, 0 );
- gnome_print_setrgbcolor( ctxt->pc, 1, 1, 1 );
- e_contact_output( ctxt->pc, ctxt->letter_tab_font, x + tab_width / 2 - gnome_font_get_width_utf8(ctxt->letter_tab_font, string) / 2, y - (tab_height - font_size) / 2, -1, string );
- } else {
- gnome_print_setrgbcolor( ctxt->pc, 0, 0, 0 );
- e_contact_output( ctxt->pc, ctxt->letter_tab_font, x + tab_width / 2 - gnome_font_get_width_utf8(ctxt->letter_tab_font, string) / 2, y - (tab_height - font_size) / 2, -1, string );
- }
- y -= tab_height;
- }
- gnome_print_grestore( ctxt->pc );
- return gnome_font_get_width_utf8(ctxt->style->body_font, "123") + gnome_font_get_size (ctxt->style->body_font) / 5;
-}
-
-static double
-e_contact_get_letter_heading_height (EContactPrintContext *ctxt)
-{
- gdouble ascender, descender;
- ascender = gnome_font_get_ascender(ctxt->letter_heading_font);
- descender = gnome_font_get_descender(ctxt->letter_heading_font);
- return ascender + descender + 9;
-}
-
-static void
-e_contact_print_letter_heading (EContactPrintContext *ctxt, gchar *character)
-{
- gdouble ascender, descender;
- gdouble width;
-
- width = gnome_font_get_width_utf8(ctxt->letter_heading_font, "m") * 1.7;
- ascender = gnome_font_get_ascender(ctxt->letter_heading_font);
- descender = gnome_font_get_descender(ctxt->letter_heading_font);
- gnome_print_gsave( ctxt->pc );
- e_contact_rectangle( ctxt->pc, ctxt->x, ctxt->y, ctxt->x + width, ctxt->y - (ascender + descender + 6), 0, 0, 0);
- gnome_print_setrgbcolor(ctxt->pc, 1, 1, 1);
- ctxt->y -= 4;
- e_contact_output(ctxt->pc, ctxt->letter_heading_font, ctxt->x + (width - gnome_font_get_width_utf8(ctxt->letter_heading_font, character))/ 2, ctxt->y, -1, character);
- ctxt->y -= ascender + descender;
- ctxt->y -= 2;
- ctxt->y -= 3;
- gnome_print_grestore( ctxt->pc );
-}
-
-static void
-e_contact_start_new_page(EContactPrintContext *ctxt)
-{
- ctxt->x = ctxt->style->left_margin * 72;
- ctxt->y = (ctxt->style->page_height - ctxt->style->top_margin) * 72;
- ctxt->column = 0;
- if ( ctxt->style->letter_tabs )
- e_contact_print_letter_tab(ctxt);
- gnome_print_showpage(ctxt->pc);
-
- gnome_print_beginpage (ctxt->pc, NULL);
-
- ctxt->first_char_on_page = ctxt->last_char_on_page + 1;
-}
-
-static double
-e_contact_get_contact_size(EContact *contact, EContactPrintContext *ctxt)
-{
- gdouble height = 0;
- gdouble page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin);
- gdouble column_width;
- const char *file_as;
- gint field;
- if ( ctxt->style->letter_tabs )
- page_width -= e_contact_get_letter_tab_width(ctxt);
- column_width = (page_width + 18) / ctxt->style->num_columns - 18;
-
- height += gnome_font_get_size (ctxt->style->headings_font) * .2;
-
- height += gnome_font_get_size (ctxt->style->headings_font) * .2;
-
- file_as = e_contact_get_const (contact, E_CONTACT_FILE_AS);
-
- height += e_contact_text_height(ctxt->pc, ctxt->style->headings_font, column_width - 4, file_as);
-
- height += gnome_font_get_size (ctxt->style->headings_font) * .2;
-
- height += gnome_font_get_size (ctxt->style->headings_font) * .2;
-
- for(field = E_CONTACT_FILE_AS; field != E_CONTACT_LAST_SIMPLE_STRING; field++) {
- char *string;
- string = e_contact_get(contact, field);
- if (string && *string) {
- double xoff = 0;
- xoff += gnome_font_get_width_utf8(ctxt->style->body_font, e_contact_pretty_name (field));
- xoff += gnome_font_get_width_utf8(ctxt->style->body_font, ": ");
- height += e_contact_text_height(ctxt->pc, ctxt->style->body_font, column_width - xoff, string);
- height += .2 * gnome_font_get_size (ctxt->style->body_font);
- }
- g_free(string);
- }
- height += gnome_font_get_size (ctxt->style->headings_font) * .4;
-
- /* g_message ("%s %g", e_card_simple_get (simple, E_CARD_SIMPLE_FIELD_FILE_AS), height); */
- return height;
-}
-
-
-static void
-e_contact_print_contact (EContact *contact, EContactPrintContext *ctxt)
-{
- gdouble page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin);
- gdouble column_width;
- char *file_as;
- int field;
-
- if ( ctxt->style->letter_tabs )
- page_width -= e_contact_get_letter_tab_width(ctxt);
- column_width = (page_width + 18) / ctxt->style->num_columns - 18;
-
- gnome_print_gsave(ctxt->pc);
-
- ctxt->y -= gnome_font_get_size (ctxt->style->headings_font) * .2;
- ctxt->y -= gnome_font_get_size (ctxt->style->headings_font) * .2;
-
- file_as = e_contact_get (contact, E_CONTACT_FILE_AS);
- if (ctxt->style->print_using_grey)
- e_contact_rectangle(ctxt->pc, ctxt->x, ctxt->y + gnome_font_get_size (ctxt->style->headings_font) * .3, ctxt->x + column_width, ctxt->y - e_contact_text_height(ctxt->pc, ctxt->style->headings_font, column_width - 4, file_as) - gnome_font_get_size (ctxt->style->headings_font) * .3, .85, .85, .85);
- e_contact_output(ctxt->pc, ctxt->style->headings_font, ctxt->x + 2, ctxt->y, column_width - 4, file_as);
- ctxt->y -= e_contact_text_height(ctxt->pc, ctxt->style->headings_font, column_width - 4, file_as);
- g_free (file_as);
-
- ctxt->y -= gnome_font_get_size (ctxt->style->headings_font) * .2;
- ctxt->y -= gnome_font_get_size (ctxt->style->headings_font) * .2;
-
- for(field = E_CONTACT_FILE_AS; field != E_CONTACT_LAST_SIMPLE_STRING; field++) {
- char *string;
- string = e_contact_get(contact, field);
-
- if (string && *string) {
- double xoff = 0;
- e_contact_output(ctxt->pc, ctxt->style->body_font, ctxt->x + xoff, ctxt->y, -1, e_contact_pretty_name (field));
- xoff += gnome_font_get_width_utf8(ctxt->style->body_font, e_contact_pretty_name (field));
- e_contact_output(ctxt->pc, ctxt->style->body_font, ctxt->x + xoff, ctxt->y, -1, ": ");
- xoff += gnome_font_get_width_utf8(ctxt->style->body_font, ": ");
- e_contact_output(ctxt->pc, ctxt->style->body_font, ctxt->x + xoff, ctxt->y, column_width - xoff, string);
- ctxt->y -= e_contact_text_height(ctxt->pc, ctxt->style->body_font, column_width - xoff, string);
- ctxt->y -= .2 * gnome_font_get_size (ctxt->style->body_font);
- }
- g_free(string);
- }
-
- ctxt->y -= gnome_font_get_size (ctxt->style->headings_font) * .4;
- gnome_print_grestore(ctxt->pc);
-}
-
-static void
-e_contact_start_new_column (EContactPrintContext *ctxt)
-{
- gdouble page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin);
- gdouble column_offset;
- if ( ctxt->style->letter_tabs )
- page_width -= e_contact_get_letter_tab_width(ctxt);
- column_offset = (page_width + 18) / ctxt->style->num_columns;
- ctxt->column ++;
- if (ctxt->column >= ctxt->style->num_columns) {
- e_contact_start_new_page(ctxt);
- ctxt->column = 0;
- }
- ctxt->x = (72 * ctxt->style->left_margin) + column_offset * ctxt->column;
- ctxt->y = 72 * (ctxt->style->page_height - ctxt->style->top_margin);
-}
-
-static void
-complete_sequence(EBookView *book_view, EBookViewStatus status, EContactPrintContext *ctxt)
-{
- GList *contacts = ctxt->contacts;
-
- gdouble page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin);
-
- ctxt->first_contact = TRUE;
- ctxt->character = NULL;
- ctxt->y = (ctxt->style->page_height - ctxt->style->top_margin) * 72;
- ctxt->x = (ctxt->style->left_margin) * 72;
- if ( ctxt->style->letter_tabs )
- page_width -= e_contact_get_letter_tab_width(ctxt);
-
- ctxt->first_char_on_page = 'A' - 1;
-
- gnome_print_beginpage (ctxt->pc, NULL);
-
- for(; contacts; contacts = contacts->next) {
- EContact *contact = contacts->data;
- guchar *file_as;
- gchar *letter_str = NULL;
-
- file_as = e_contact_get (contact, E_CONTACT_FILE_AS);
-
- if (file_as != NULL) {
- letter_str = g_strndup (file_as, g_utf8_next_char (file_as) - (gchar *) file_as);
- }
- if ( file_as && (!ctxt->character || g_utf8_collate (ctxt->character, letter_str) != 0) ) {
- g_free (ctxt->character);
- ctxt->character = g_strdup (letter_str);
- if (ctxt->style->sections_start_new_page && ! ctxt->first_contact) {
- e_contact_start_new_page(ctxt);
- }
- else if ((!ctxt->first_contact) && (ctxt->y - e_contact_get_letter_heading_height(ctxt) - e_contact_get_contact_size(contact, ctxt) < ctxt->style->bottom_margin * 72))
- e_contact_start_new_column(ctxt);
- if ( ctxt->style->letter_headings )
- e_contact_print_letter_heading(ctxt, ctxt->character);
- ctxt->first_section = FALSE;
- }
- else if ( (!ctxt->first_contact) && (ctxt->y - e_contact_get_contact_size(contact, ctxt) < ctxt->style->bottom_margin * 72)) {
- e_contact_start_new_column(ctxt);
- if ( ctxt->style->letter_headings )
- e_contact_print_letter_heading(ctxt, ctxt->character);
- }
- g_free (letter_str);
- ctxt->last_char_on_page = file_as ? toupper (*file_as) : ' ';
- if ( ctxt->last_char_on_page < ctxt->first_char_on_page )
- ctxt->first_char_on_page = ctxt->last_char_on_page;
- e_contact_print_contact(contact, ctxt);
- ctxt->first_contact = FALSE;
- }
- ctxt->last_char_on_page = 'Z';
- if ( ctxt->style->letter_tabs )
- e_contact_print_letter_tab(ctxt);
- gnome_print_showpage(ctxt->pc);
- gnome_print_context_close(ctxt->pc);
- gnome_print_job_close(ctxt->master);
- g_free(ctxt->character);
- if (book_view)
- g_object_unref(book_view);
- if (ctxt->type == GNOME_PRINT_DIALOG_RESPONSE_PREVIEW) {
- GtkWidget *preview;
- preview = GTK_WIDGET(gnome_print_job_preview_new(ctxt->master, "Print Preview"));
- gtk_widget_show_all(preview);
- } else {
- gnome_print_job_print(ctxt->master);
- }
- g_object_unref(ctxt->pc);
- g_object_unref(ctxt->master);
- if (ctxt->book)
- g_object_unref(ctxt->book);
- if (ctxt->query)
- e_book_query_unref (ctxt->query);
- g_list_foreach(ctxt->contacts, (GFunc) g_object_unref, NULL);
- g_list_free(ctxt->contacts);
- g_object_unref(ctxt->style->headings_font);
- g_object_unref(ctxt->style->body_font);
- g_object_unref(ctxt->style->header_font);
- g_object_unref(ctxt->style->footer_font);
- g_object_unref(ctxt->letter_heading_font);
- g_object_unref(ctxt->letter_tab_font);
- g_free(ctxt->style);
- g_free(ctxt);
-}
-
-static int
-contact_compare (EContact *contact1, EContact *contact2)
-{
- if (contact1 && contact2) {
- const char *file_as1, *file_as2;
- file_as1 = e_contact_get_const (contact1, E_CONTACT_FILE_AS);
- file_as2 = e_contact_get_const (contact2, E_CONTACT_FILE_AS);
-
- if (file_as1 && file_as2)
- return g_utf8_collate(file_as1, file_as2);
- if (file_as1)
- return -1;
- if (file_as2)
- return 1;
- return strcmp(e_contact_get_const(contact1, E_CONTACT_UID), e_contact_get_const(contact2, E_CONTACT_UID));
- } else {
- return 0;
- }
-}
-
-static void
-create_contact(EBookView *book_view, const GList *contacts, EContactPrintContext *ctxt)
-{
- for(; contacts; contacts = contacts->next) {
- EContact *contact = contacts->data;
- g_object_ref(contact);
- ctxt->contacts = g_list_insert_sorted(ctxt->contacts, contact, (GCompareFunc) contact_compare);
- }
-}
-
-static void
-book_view_loaded (EBook *book, EBookStatus status, EBookView *book_view, EContactPrintContext *ctxt)
-{
- g_object_ref(book_view);
-
- g_signal_connect(book_view,
- "contacts_added",
- G_CALLBACK(create_contact),
- ctxt);
-
- g_signal_connect(book_view,
- "sequence_complete",
- G_CALLBACK(complete_sequence),
- ctxt);
-
- e_book_view_start (book_view);
-}
-
-static void
-e_contact_do_print_contacts (EBook *book, EBookQuery *query, EContactPrintContext *ctxt)
-{
- e_book_async_get_book_view(book, query, NULL, -1, (EBookBookViewCallback) book_view_loaded, ctxt);
-}
-
-static void
-e_contact_do_print (EBook *book, EBookQuery *query, EContactPrintContext *ctxt)
-{
- switch ( ctxt->style->type ) {
- case E_CONTACT_PRINT_TYPE_CARDS:
- e_contact_do_print_contacts( book, query, ctxt);
- break;
- default:
- break;
- }
-}
-
-static void lowify( char *data )
-{
- for ( ; *data; data++ )
- *data = tolower((unsigned char) *data);
-}
-
-static gboolean get_bool( char *data )
-{
- if ( data ) {
- lowify ( data );
- return ! strcmp(data, "true");
- } else
- return FALSE;
-}
-
-static void get_string( char *data, char **variable )
-{
- g_free ( *variable );
- if ( data )
- *variable = g_strdup( data );
- else
- *variable = g_strdup( "" );
-}
-
-static int get_integer( char *data )
-{
- if ( data )
- return atoi(data);
- else
- return 0;
-}
-
-static double get_float( char *data )
-{
- if ( data )
- return atof(data);
- else
- return 0;
-}
-
-static void get_font( char *data, GnomeFont **variable )
-{
- if ( data ) {
- GnomeFont *font = gnome_font_find_from_full_name( data );
- if ( font ) {
- g_object_unref(*variable);
- *variable = font;
- }
- }
-}
-
-
-static void
-e_contact_build_style(EContactPrintStyle *style)
-{
- xmlDocPtr styledoc;
- gchar *filename;
-
- style->title = g_strdup("");
- style->type = E_CONTACT_PRINT_TYPE_CARDS;
- style->sections_start_new_page = TRUE;
- style->num_columns = 2;
- style->blank_forms = 2;
- style->letter_tabs = TRUE;
- style->letter_headings = FALSE;
-
- style->headings_font = gnome_font_find_closest_from_weight_slant ("Sans", GNOME_FONT_BOLD, FALSE, 8);
- style->body_font = gnome_font_find_closest_from_weight_slant ("Sans", GNOME_FONT_BOOK, FALSE, 6);
-
- style->print_using_grey = TRUE;
- style->paper_type = 0;
- style->paper_width = 8.5;
- style->paper_height = 11;
- style->paper_source = 0;
- style->top_margin = .5;
- style->left_margin = .5;
- style->bottom_margin = .5;
- style->right_margin = .5;
- style->page_size = 0;
- style->page_width = 2.75;
- style->page_height = 4.25;
-#if 0
- style->page_width = 4.25;
- style->page_height = 5.5;
-#endif
-#if 0
- style->page_width = 5.5;
- style->page_height = 8.5;
-#endif
- style->orientation_portrait = FALSE;
-
- style->header_font = gnome_font_find_closest_from_weight_slant ("Sans", GNOME_FONT_BOOK, FALSE, 6);
-
- style->left_header = g_strdup("");
- style->center_header = g_strdup("");
- style->right_header = g_strdup("");
-
- style->footer_font = gnome_font_find_closest_from_weight_slant ("Sans", GNOME_FONT_BOOK, FALSE, 6);
-
- style->left_footer = g_strdup("");
- style->center_footer = g_strdup("");
- style->right_footer = g_strdup("");
- style->reverse_on_even_pages = FALSE;
- filename = g_concat_dir_and_file(EVOLUTION_ECPSDIR, "medbook.ecps");
- styledoc = xmlParseFile(filename);
- g_free(filename);
- if (styledoc) {
- xmlNodePtr stylenode = xmlDocGetRootElement(styledoc);
- xmlNodePtr node;
- for (node = stylenode->children; node; node = node->next) {
- char *data = xmlNodeGetContent ( node );
- if ( !strcmp( node->name, "title" ) ) {
- get_string(data, &(style->title));
- } else if ( !strcmp( node->name, "type" ) ) {
- lowify( data );
- if ( !strcmp( data, "cards" ) )
- style->type = E_CONTACT_PRINT_TYPE_CARDS;
- else if ( !strcmp( data, "memo_style" ) )
- style->type = E_CONTACT_PRINT_TYPE_MEMO_STYLE;
- else if ( !strcmp( data, "phone_list" ) )
- style->type = E_CONTACT_PRINT_TYPE_PHONE_LIST;
- } else if ( !strcmp( node->name, "sections_start_new_page" ) ) {
- style->sections_start_new_page = get_bool(data);
- } else if ( !strcmp( node->name, "num_columns" ) ) {
- style->num_columns = get_integer(data);
- } else if ( !strcmp( node->name, "blank_forms" ) ) {
- style->blank_forms = get_integer(data);
- } else if ( !strcmp( node->name, "letter_tabs" ) ) {
- style->letter_tabs = get_bool(data);
- } else if ( !strcmp( node->name, "letter_headings" ) ) {
- style->letter_headings = get_bool(data);
- } else if ( !strcmp( node->name, "headings_font" ) ) {
- get_font( data, &(style->headings_font) );
- } else if ( !strcmp( node->name, "body_font" ) ) {
- get_font( data, &(style->body_font) );
- } else if ( !strcmp( node->name, "print_using_grey" ) ) {
- style->print_using_grey = get_bool(data);
- } else if ( !strcmp( node->name, "paper_width" ) ) {
- style->paper_width = get_float(data);
- } else if ( !strcmp( node->name, "paper_height" ) ) {
- style->paper_height = get_float(data);
- } else if ( !strcmp( node->name, "top_margin" ) ) {
- style->top_margin = get_float(data);
- } else if ( !strcmp( node->name, "left_margin" ) ) {
- style->left_margin = get_float(data);
- } else if ( !strcmp( node->name, "bottom_margin" ) ) {
- style->bottom_margin = get_float(data);
- } else if ( !strcmp( node->name, "right_margin" ) ) {
- style->right_margin = get_float(data);
- } else if ( !strcmp( node->name, "page_width" ) ) {
- style->page_width = get_float(data);
- } else if ( !strcmp( node->name, "page_height" ) ) {
- style->page_height = get_float(data);
- } else if ( !strcmp( node->name, "orientation" ) ) {
- if ( data ) {
- lowify(data);
- style->orientation_portrait = strcmp(data, "landscape");
- } else {
- style->orientation_portrait = TRUE;
- }
- } else if ( !strcmp( node->name, "header_font" ) ) {
- get_font( data, &(style->header_font) );
- } else if ( !strcmp( node->name, "left_header" ) ) {
- get_string(data, &(style->left_header));
- } else if ( !strcmp( node->name, "center_header" ) ) {
- get_string(data, &(style->center_header));
- } else if ( !strcmp( node->name, "right_header" ) ) {
- get_string(data, &(style->right_header));
- } else if ( !strcmp( node->name, "footer_font" ) ) {
- get_font( data, &(style->footer_font) );
- } else if ( !strcmp( node->name, "left_footer" ) ) {
- get_string(data, &(style->left_footer));
- } else if ( !strcmp( node->name, "center_footer" ) ) {
- get_string(data, &(style->center_footer));
- } else if ( !strcmp( node->name, "right_footer" ) ) {
- get_string(data, &(style->right_footer));
- } else if ( !strcmp( node->name, "reverse_on_even_pages" ) ) {
- style->reverse_on_even_pages = get_bool(data);
- }
- if ( data )
- xmlFree (data);
- }
- xmlFreeDoc(styledoc);
- }
-}
-
-static gint
-e_contact_print_close(GnomeDialog *dialog, gpointer data)
-{
- return FALSE;
-}
-
-static void
-e_contact_print_response(GtkWidget *dialog, gint response_id, gpointer data)
-{
- EContactPrintContext *ctxt = g_new(EContactPrintContext, 1);
- EContactPrintStyle *style = g_new(EContactPrintStyle, 1);
- GnomePrintJob *master;
- GnomePrintConfig *config;
- GnomePrintContext *pc;
- gboolean uses_book = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(dialog), "uses_book"));
- gboolean uses_list = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(dialog), "uses_list"));
- EBook *book = NULL;
- EBookQuery *query = NULL;
- EContact *contact = NULL;
- GList *contact_list = NULL;
- gdouble font_size;
-
- if (uses_book) {
- book = g_object_get_data(G_OBJECT(dialog), "book");
- query = g_object_get_data(G_OBJECT(dialog), "query");
- e_book_query_ref (query);
- }
- else if (uses_list) {
- contact_list = g_object_get_data(G_OBJECT(dialog), "contact_list");
- }
- else {
- contact = g_object_get_data(G_OBJECT(dialog), "contact");
- }
- switch( response_id ) {
- case GNOME_PRINT_DIALOG_RESPONSE_PRINT:
- config = gnome_print_dialog_get_config (GNOME_PRINT_DIALOG(dialog));
- master = gnome_print_job_new( config );
- pc = gnome_print_job_get_context( master );
- e_contact_build_style(style);
-
- ctxt->x = 0;
- ctxt->y = 0;
- ctxt->column = 0;
- ctxt->style = style;
- ctxt->master = master;
- ctxt->first_section = TRUE;
- ctxt->first_char_on_page = 'A' - 1;
- ctxt->type = GNOME_PRINT_DIALOG_RESPONSE_PRINT;
-
- font_size = 72 * ctxt->style->page_height / 27.0 / 2.0;
- ctxt->letter_heading_font = gnome_font_find (gnome_font_get_name(ctxt->style->headings_font), gnome_font_get_size (ctxt->style->headings_font) * 1.5);
- ctxt->letter_tab_font = gnome_font_find (gnome_font_get_name(ctxt->style->headings_font), font_size);
-
- ctxt->pc = pc;
-#warning FIXME gnome_print_multipage_new_from_sizes
-#if 0
- ctxt->pc = GNOME_PRINT_CONTEXT(gnome_print_multipage_new_from_sizes(pc,
- 72 * style->paper_width,
- 72 * style->paper_height,
- 72 * style->page_width,
- 72 * style->page_height));
-#endif
-
- ctxt->book = book;
- ctxt->query = query;
- if (uses_book) {
- ctxt->contacts = NULL;
- e_contact_do_print(book, ctxt->query, ctxt);
- }
- else if (uses_list) {
- ctxt->contacts = contact_list;
- complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, ctxt);
- }
- else {
- ctxt->contacts = g_list_append(NULL, contact);
- complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, ctxt);
- }
- gtk_widget_destroy (dialog);
-
- break;
- case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW:
- config = gnome_print_dialog_get_config (GNOME_PRINT_DIALOG(dialog));
- master = gnome_print_job_new( config );
- pc = gnome_print_job_get_context( master );
- e_contact_build_style(style);
-
- ctxt->x = 0;
- ctxt->y = 0;
- ctxt->column = 0;
- ctxt->style = style;
- ctxt->master = master;
- ctxt->first_section = TRUE;
- ctxt->first_char_on_page = 'A' - 1;
- ctxt->type = GNOME_PRINT_DIALOG_RESPONSE_PREVIEW;
-
- font_size = 72 * ctxt->style->page_height / 27.0 / 2.0;
- ctxt->letter_heading_font = gnome_font_find (gnome_font_get_name(ctxt->style->headings_font), gnome_font_get_size (ctxt->style->headings_font) * 1.5);
- ctxt->letter_tab_font = gnome_font_find (gnome_font_get_name(ctxt->style->headings_font), font_size);
-
- ctxt->pc = pc;
-#warning FIXME gnome_print_multipage_new_from_sizes
-#if 0
- ctxt->pc = GNOME_PRINT_CONTEXT(gnome_print_multipage_new_from_sizes(pc,
- 72 * style->paper_width,
- 72 * style->paper_height,
- 72 * style->page_width,
- 72 * style->page_height));
-#endif
- ctxt->book = book;
- ctxt->query = query;
-
- if (uses_book) {
- ctxt->contacts = NULL;
- g_object_ref(book);
- e_contact_do_print(book, ctxt->query, ctxt);
- }
- else if (uses_list) {
- ctxt->contacts = g_list_copy (contact_list);
- g_list_foreach (ctxt->contacts, (GFunc)g_object_ref, NULL);
- complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, ctxt);
- }
- else {
- ctxt->contacts = g_list_append(NULL, contact);
- g_object_ref(contact);
- complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, ctxt);
- }
- break;
- case GNOME_PRINT_DIALOG_RESPONSE_CANCEL:
- if (uses_book)
- g_object_unref(book);
- else if (uses_list)
- e_free_object_list (contact_list);
- else
- g_object_unref(contact);
-
- if (query)
- e_book_query_unref (query);
-
- gtk_widget_destroy (dialog);
- g_free(style);
- g_free(ctxt);
- break;
- }
-}
-
-GtkWidget *
-e_contact_print_dialog_new(EBook *book, char *query)
-{
- GtkWidget *dialog;
-
-
- dialog = e_print_get_dialog(_("Print contacts"), GNOME_PRINT_DIALOG_RANGE | GNOME_PRINT_DIALOG_COPIES);
- gnome_print_dialog_construct_range_any(GNOME_PRINT_DIALOG(dialog), GNOME_PRINT_RANGE_ALL | GNOME_PRINT_RANGE_SELECTION,
- NULL, NULL, NULL);
-
- g_object_ref(book);
- g_object_set_data(G_OBJECT(dialog), "uses_book", GINT_TO_POINTER (TRUE));
- g_object_set_data(G_OBJECT(dialog), "uses_list", GINT_TO_POINTER (FALSE));
- g_object_set_data(G_OBJECT(dialog), "book", book);
- g_object_set_data(G_OBJECT(dialog), "query", e_book_query_from_string (query));
- g_signal_connect(dialog,
- "response", G_CALLBACK(e_contact_print_response), NULL);
- g_signal_connect(dialog,
- "close", G_CALLBACK(e_contact_print_close), NULL);
- return dialog;
-}
-
-void
-e_contact_print_preview(EBook *book, char *query)
-{
- EContactPrintContext *ctxt = g_new(EContactPrintContext, 1);
- EContactPrintStyle *style = g_new(EContactPrintStyle, 1);
- GnomePrintJob *master;
- GnomePrintContext *pc;
- GnomePrintConfig *config;
- gdouble font_size;
-
- config = e_print_load_config ();
- master = gnome_print_job_new (config);
- pc = gnome_print_job_get_context (master);
- e_contact_build_style (style);
-
- ctxt->x = 0;
- ctxt->y = 0;
- ctxt->column = 0;
- ctxt->style = style;
- ctxt->master = master;
- ctxt->first_section = TRUE;
- ctxt->first_char_on_page = 'A' - 1;
- ctxt->type = GNOME_PRINT_DIALOG_RESPONSE_PREVIEW;
-
- font_size = 72 * ctxt->style->page_height / 27.0 / 2.0;
- ctxt->letter_heading_font = gnome_font_find (gnome_font_get_name(ctxt->style->headings_font), gnome_font_get_size (ctxt->style->headings_font) * 1.5);
- ctxt->letter_tab_font = gnome_font_find (gnome_font_get_name(ctxt->style->headings_font), font_size);
-
- ctxt->pc = pc;
-#warning FIXME gnome_print_multipage_new_from_sizes
-#if 0
- ctxt->pc = GNOME_PRINT_CONTEXT(gnome_print_multipage_new_from_sizes(pc,
- 72 * style->paper_width,
- 72 * style->paper_height,
- 72 * style->page_width,
- 72 * style->page_height));
-#endif
- ctxt->book = book;
- ctxt->query = e_book_query_from_string (query);
- ctxt->contacts = NULL;
- g_object_ref(book);
- e_contact_do_print(book, ctxt->query, ctxt);
-}
-
-GtkWidget *
-e_contact_print_contact_dialog_new(EContact *contact)
-{
- GtkWidget *dialog;
-
- dialog = e_print_get_dialog(_("Print contact"), GNOME_PRINT_DIALOG_COPIES);
-
- contact = e_contact_duplicate(contact);
- g_object_set_data(G_OBJECT(dialog), "contact", contact);
- g_object_set_data(G_OBJECT(dialog), "uses_list", GINT_TO_POINTER (FALSE));
- g_object_set_data(G_OBJECT(dialog), "uses_book", GINT_TO_POINTER (FALSE));
- g_signal_connect(dialog,
- "response", G_CALLBACK(e_contact_print_response), NULL);
- g_signal_connect(dialog,
- "close", G_CALLBACK(e_contact_print_close), NULL);
- return dialog;
-}
-
-GtkWidget *
-e_contact_print_contact_list_dialog_new(GList *list)
-{
- GtkWidget *dialog;
- GList *copied_list;
- GList *l;
-
- if (list == NULL)
- return NULL;
-
- copied_list = g_list_copy (list);
- for (l = copied_list; l; l = l->next)
- l->data = e_contact_duplicate (E_CONTACT (l->data));
-
- dialog = e_print_get_dialog(_("Print contact"), GNOME_PRINT_DIALOG_COPIES);
-
- g_object_set_data(G_OBJECT(dialog), "contact_list", copied_list);
- g_object_set_data(G_OBJECT(dialog), "uses_list", GINT_TO_POINTER (TRUE));
- g_object_set_data(G_OBJECT(dialog), "uses_book", GINT_TO_POINTER (FALSE));
- g_signal_connect(dialog,
- "response", G_CALLBACK(e_contact_print_response), NULL);
- g_signal_connect(dialog,
- "close", G_CALLBACK(e_contact_print_close), NULL);
- return dialog;
-}
diff --git a/addressbook/printing/e-contact-print.glade b/addressbook/printing/e-contact-print.glade
deleted file mode 100644
index d1721e3509..0000000000
--- a/addressbook/printing/e-contact-print.glade
+++ /dev/null
@@ -1,2018 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd" >
-
-<glade-interface>
- <widget class="GtkDialog" id="print-edit-style">
- <property name="visible">no</property>
- <property name="title" translatable="yes">Page Setup:</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="modal">no</property>
- <property name="allow_shrink">no</property>
- <property name="allow_grow">no</property>
- <property name="window-position">GTK_WIN_POS_NONE</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox1">
- <property name="homogeneous">no</property>
- <property name="spacing">8</property>
- <property name="visible">yes</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area1">
- <property name="layout_style">GTK_BUTTONBOX_END</property>
- <property name="spacing">8</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkButton" id="button1">
- <property name="can_default">yes</property>
- <property name="can_focus">yes</property>
- <property name="visible">yes</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">yes</property>
- <property name="use_underline">yes</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="button2">
- <property name="can_default">yes</property>
- <property name="can_focus">yes</property>
- <property name="visible">yes</property>
- <property name="label">gtk-apply</property>
- <property name="use_stock">yes</property>
- <property name="use_underline">yes</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="button3">
- <property name="can_default">yes</property>
- <property name="can_focus">yes</property>
- <property name="visible">yes</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">yes</property>
- <property name="use_underline">yes</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">yes</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox-contact-print-style-editor">
- <property name="homogeneous">no</property>
- <property name="spacing">5</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkHBox" id="hbox2">
- <property name="border_width">5</property>
- <property name="homogeneous">no</property>
- <property name="spacing">16</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="label8">
- <property name="label" translatable="yes">Style name:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="label-style-name">
- <property name="can_focus">yes</property>
- <property name="editable">no</property>
- <property name="text" translatable="yes"></property>
- <property name="max-length">0</property>
- <property name="visibility">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkNotebook" id="notebook1">
- <property name="can_focus">yes</property>
- <property name="show_tabs">yes</property>
- <property name="show_border">yes</property>
- <property name="tab_pos">GTK_POS_TOP</property>
- <property name="scrollable">no</property>
- <property name="tab_hborder">2</property>
- <property name="tab_vborder">2</property>
- <property name="enable-popup">no</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkVBox" id="vbox2">
- <property name="border_width">5</property>
- <property name="homogeneous">no</property>
- <property name="spacing">5</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment1">
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkFrame" id="frame5">
- <property name="label" translatable="yes">Preview:</property>
- <property name="label_xalign">0</property>
- <property name="shadow">GTK_SHADOW_ETCHED_IN</property>
- <property name="visible">yes</property>
-
- <child>
- <placeholder />
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox1">
- <property name="homogeneous">yes</property>
- <property name="spacing">7</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkFrame" id="frame6">
- <property name="label" translatable="yes">Options</property>
- <property name="label_xalign">0</property>
- <property name="shadow">GTK_SHADOW_ETCHED_IN</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment4">
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkTable" id="table1">
- <property name="border_width">8</property>
- <property name="homogeneous">no</property>
- <property name="row_spacing">0</property>
- <property name="column_spacing">0</property>
- <property name="n-rows">6</property>
- <property name="n-columns">5</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="label5">
- <property name="label" translatable="yes">Include:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label4">
- <property name="label" translatable="yes">Sections:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="alignment2">
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkRadioButton" id="radiobutton1">
- <property name="can_focus">yes</property>
- <property name="label" translatable="yes">Immediately follow each other</property>
- <property name="active">yes</property>
- <property name="draw_indicator">yes</property>
- <property name="visible">yes</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">5</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="checkbutton1">
- <property name="can_focus">yes</property>
- <property name="label" translatable="yes">Letter tabs on side</property>
- <property name="active">no</property>
- <property name="draw_indicator">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">5</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="checkbutton2">
- <property name="can_focus">yes</property>
- <property name="label" translatable="yes">Headings for each letter</property>
- <property name="active">no</property>
- <property name="draw_indicator">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">5</property>
- <property name="top_attach">5</property>
- <property name="bottom_attach">6</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="alignment3">
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkRadioButton" id="radiobutton2">
- <property name="can_focus">yes</property>
- <property name="label" translatable="yes">Start on a new page</property>
- <property name="active">no</property>
- <property name="draw_indicator">yes</property>
- <property name="visible">yes</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">5</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label6">
- <property name="label" translatable="yes">Number of columns:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_padding">0</property>
- <property name="y_padding">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label7">
- <property name="label" translatable="yes">Blank forms at end:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">3</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_padding">0</property>
- <property name="y_padding">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="alignment6">
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkSpinButton" id="spinbutton2">
- <property name="can_focus">yes</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">no</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="wrap">no</property>
- <property name="snap_to_ticks">no</property>
- <property name="visible">yes</property>
- <property name="adjustment">2 0 100 1 10 10</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_padding">0</property>
- <property name="y_padding">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="alignment5">
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkSpinButton" id="spinbutton1">
- <property name="can_focus">yes</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">no</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="wrap">no</property>
- <property name="width-request">45</property>
- <property name="snap_to_ticks">no</property>
- <property name="visible">yes</property>
- <property name="adjustment">1 0 100 1 10 10</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_padding">0</property>
- <property name="y_padding">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox3">
- <property name="homogeneous">no</property>
- <property name="spacing">8</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkFrame" id="frame7">
- <property name="label" translatable="yes">Fonts</property>
- <property name="label_xalign">0</property>
- <property name="shadow">GTK_SHADOW_ETCHED_IN</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkTable" id="table2">
- <property name="border_width">8</property>
- <property name="homogeneous">no</property>
- <property name="row_spacing">13</property>
- <property name="column_spacing">8</property>
- <property name="n-rows">2</property>
- <property name="n-columns">2</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment7">
- <property name="xalign">0.5</property>
- <property name="yalign">1</property>
- <property name="xscale">1</property>
- <property name="yscale">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkButton" id="button6">
- <property name="can_focus">yes</property>
- <property name="label" translatable="yes">F_ont...</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="visible">yes</property>
- <property name="use_underline">yes</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="alignment8">
- <property name="xalign">0.5</property>
- <property name="yalign">1</property>
- <property name="xscale">1</property>
- <property name="yscale">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkButton" id="button5">
- <property name="can_focus">yes</property>
- <property name="label" translatable="yes">_Font...</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="width-request">90</property>
- <property name="visible">yes</property>
- <property name="use_underline">yes</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox4">
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="label10">
- <property name="label" translatable="yes">Headings</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry3">
- <property name="can_focus">yes</property>
- <property name="editable">yes</property>
- <property name="text" translatable="yes">10 pt. Tahoma</property>
- <property name="width-request">100</property>
- <property name="max-length">0</property>
- <property name="visibility">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">expand|fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox5">
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="label9">
- <property name="label" translatable="yes">Body</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry2">
- <property name="can_focus">yes</property>
- <property name="editable">yes</property>
- <property name="text" translatable="yes">8 pt. Tahoma</property>
- <property name="width-request">100</property>
- <property name="max-length">0</property>
- <property name="visibility">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">expand|fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="frame8">
- <property name="label" translatable="yes">Shading</property>
- <property name="label_xalign">0</property>
- <property name="shadow">GTK_SHADOW_ETCHED_IN</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkCheckButton" id="checkbutton3">
- <property name="can_focus">yes</property>
- <property name="label" translatable="yes">Print using gray shading</property>
- <property name="active">no</property>
- <property name="draw_indicator">yes</property>
- <property name="visible">yes</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label1">
- <property name="label" translatable="yes">Format</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox3">
- <property name="homogeneous">yes</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkVBox" id="vbox6">
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkFrame" id="frame9">
- <property name="label" translatable="yes">Paper</property>
- <property name="label_xalign">0</property>
- <property name="shadow">GTK_SHADOW_ETCHED_IN</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkVBox" id="vbox16">
- <property name="border_width">10</property>
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkVBox" id="vbox17">
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="label21">
- <property name="label" translatable="yes">Type:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow1">
- <property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
- <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkTreeView" id="clist1">
- <property name="can_focus">yes</property>
- <property name="headers-visible">no</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="label26">
- <property name="child_name">CList:title</property>
- <property name="label" translatable="yes">label26</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- </child>
- </widget>
- </child>
-
- <child internal-child="hscrollbar">
- <widget class="GtkHScrollbar" id="convertwidget1">
- <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
- <property name="visible">yes</property>
- </widget>
- </child>
-
- <child internal-child="vscrollbar">
- <widget class="GtkVScrollbar" id="convertwidget2">
- <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
- <property name="visible">yes</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox18">
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="label24">
- <property name="label" translatable="yes">Dimensions:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox5">
- <property name="homogeneous">yes</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="label27">
- <property name="label" translatable="yes">Width:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry9">
- <property name="can_focus">yes</property>
- <property name="editable">yes</property>
- <property name="text" translatable="yes"></property>
- <property name="width-request">1</property>
- <property name="max-length">0</property>
- <property name="visibility">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label28">
- <property name="label" translatable="yes">Height:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry10">
- <property name="can_focus">yes</property>
- <property name="editable">yes</property>
- <property name="text" translatable="yes"></property>
- <property name="width-request">1</property>
- <property name="max-length">0</property>
- <property name="visibility">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox19">
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="label25">
- <property name="label" translatable="yes">Paper source:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCombo" id="combo1">
- <property name="value_in_list">no</property>
- <property name="case_sensitive">no</property>
- <property name="enable_arrow_keys">yes</property>
- <property name="enable_arrows_always">no</property>
- <property name="allow_empty">yes</property>
- <property name="visible">yes</property>
-
- <child internal-child="entry">
- <widget class="GtkEntry" id="combo-entry1">
- <property name="can_focus">yes</property>
- <property name="editable">yes</property>
- <property name="text" translatable="yes"></property>
- <property name="max-length">0</property>
- <property name="visibility">yes</property>
- <property name="visible">yes</property>
- </widget>
- </child>
-
- <child internal-child="list">
- <widget class="GtkList" id="convertwidget3">
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkListItem" id="convertwidget4">
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget5">
- <property name="label" translatable="yes"></property>
- <property name="xalign">0.0</property>
- <property name="visible">yes</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="frame10">
- <property name="label" translatable="yes">Margins</property>
- <property name="label_xalign">0</property>
- <property name="shadow">GTK_SHADOW_ETCHED_IN</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkTable" id="table4">
- <property name="border_width">15</property>
- <property name="homogeneous">yes</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">9</property>
- <property name="n-rows">2</property>
- <property name="n-columns">4</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="label29">
- <property name="label" translatable="yes">Top:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">expand|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label30">
- <property name="label" translatable="yes">Bottom:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">expand|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label31">
- <property name="label" translatable="yes">Left:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">expand|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry11">
- <property name="can_focus">yes</property>
- <property name="editable">yes</property>
- <property name="text" translatable="yes"></property>
- <property name="width-request">1</property>
- <property name="max-length">0</property>
- <property name="visibility">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">expand|fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry12">
- <property name="can_focus">yes</property>
- <property name="editable">yes</property>
- <property name="text" translatable="yes"></property>
- <property name="width-request">1</property>
- <property name="max-length">0</property>
- <property name="visibility">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">expand|fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry13">
- <property name="can_focus">yes</property>
- <property name="editable">yes</property>
- <property name="text" translatable="yes"></property>
- <property name="width-request">1</property>
- <property name="max-length">0</property>
- <property name="visibility">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">expand|fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry14">
- <property name="can_focus">yes</property>
- <property name="editable">yes</property>
- <property name="text" translatable="yes"></property>
- <property name="width-request">1</property>
- <property name="max-length">0</property>
- <property name="visibility">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">expand|fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label32">
- <property name="label" translatable="yes">Right:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">expand|fill</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox7">
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkFrame" id="frame11">
- <property name="label" translatable="yes">Page</property>
- <property name="label_xalign">0</property>
- <property name="shadow">GTK_SHADOW_ETCHED_IN</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkVBox" id="vbox8">
- <property name="border_width">10</property>
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkVBox" id="vbox20">
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="label33">
- <property name="label" translatable="yes">Size:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow2">
- <property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
- <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkTreeView" id="clist2">
- <property name="can_focus">yes</property>
- <property name="headers-visible">no</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="label35">
- <property name="child_name">CList:title</property>
- <property name="label" translatable="yes">label26</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- </child>
- </widget>
- </child>
-
- <child internal-child="hscrollbar">
- <widget class="GtkHScrollbar" id="convertwidget6">
- <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
- <property name="visible">yes</property>
- </widget>
- </child>
-
- <child internal-child="vscrollbar">
- <widget class="GtkVScrollbar" id="convertwidget7">
- <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
- <property name="visible">yes</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox21">
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="label34">
- <property name="label" translatable="yes">Dimensions:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox6">
- <property name="homogeneous">yes</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="label36">
- <property name="label" translatable="yes">Width:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry15">
- <property name="can_focus">yes</property>
- <property name="editable">yes</property>
- <property name="text" translatable="yes"></property>
- <property name="width-request">1</property>
- <property name="max-length">0</property>
- <property name="visibility">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label37">
- <property name="label" translatable="yes">Height:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry16">
- <property name="can_focus">yes</property>
- <property name="editable">yes</property>
- <property name="text" translatable="yes"></property>
- <property name="width-request">1</property>
- <property name="max-length">0</property>
- <property name="visibility">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="frame12">
- <property name="label" translatable="yes">Orientation</property>
- <property name="label_xalign">0</property>
- <property name="shadow">GTK_SHADOW_ETCHED_IN</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkHBox" id="hbox4">
- <property name="homogeneous">no</property>
- <property name="spacing">10</property>
- <property name="visible">yes</property>
-
- <child>
- <placeholder />
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox9">
- <property name="homogeneous">no</property>
- <property name="spacing">5</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment9">
- <property name="xalign">0</property>
- <property name="yalign">1</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkRadioButton" id="radiobutton3">
- <property name="can_focus">yes</property>
- <property name="label" translatable="yes">Portrait</property>
- <property name="active">no</property>
- <property name="draw_indicator">yes</property>
- <property name="visible">yes</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="alignment10">
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkRadioButton" id="radiobutton4">
- <property name="can_focus">yes</property>
- <property name="label" translatable="yes">Landscape</property>
- <property name="active">no</property>
- <property name="draw_indicator">yes</property>
- <property name="visible">yes</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label2">
- <property name="label" translatable="yes">Paper</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox10">
- <property name="border_width">8</property>
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkTable" id="table5">
- <property name="homogeneous">yes</property>
- <property name="row_spacing">4</property>
- <property name="column_spacing">4</property>
- <property name="n-rows">4</property>
- <property name="n-columns">3</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment15">
- <property name="xalign">0</property>
- <property name="yalign">1</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkButton" id="button11">
- <property name="can_focus">yes</property>
- <property name="label" translatable="yes">F_ont...</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="visible">yes</property>
- <property name="use_underline">yes</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTextView" id="text10">
- <property name="can_focus">yes</property>
- <property name="editable">no</property>
- <property name="text" translatable="yes"></property>
- <property name="wrap_mode">GTK_WRAP_WORD</property>
- <property name="height-request">50</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">expand|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTextView" id="text11">
- <property name="can_focus">yes</property>
- <property name="editable">no</property>
- <property name="text" translatable="yes"></property>
- <property name="wrap_mode">GTK_WRAP_WORD</property>
- <property name="height-request">50</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">expand|fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTextView" id="text12">
- <property name="can_focus">yes</property>
- <property name="editable">no</property>
- <property name="text" translatable="yes"></property>
- <property name="wrap_mode">GTK_WRAP_WORD</property>
- <property name="height-request">50</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTextView" id="text13">
- <property name="can_focus">yes</property>
- <property name="editable">no</property>
- <property name="text" translatable="yes"></property>
- <property name="wrap_mode">GTK_WRAP_WORD</property>
- <property name="height-request">50</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">expand|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTextView" id="text14">
- <property name="can_focus">yes</property>
- <property name="editable">no</property>
- <property name="text" translatable="yes"></property>
- <property name="wrap_mode">GTK_WRAP_WORD</property>
- <property name="height-request">5</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTextView" id="text15">
- <property name="can_focus">yes</property>
- <property name="editable">no</property>
- <property name="text" translatable="yes"></property>
- <property name="wrap_mode">GTK_WRAP_WORD</property>
- <property name="height-request">50</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="alignment16">
- <property name="xalign">0.5</property>
- <property name="yalign">1</property>
- <property name="xscale">1</property>
- <property name="yscale">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkVBox" id="vbox14">
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="label14">
- <property name="label" translatable="yes">Header</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry7">
- <property name="can_focus">yes</property>
- <property name="editable">yes</property>
- <property name="text" translatable="yes"></property>
- <property name="max-length">0</property>
- <property name="visibility">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">expand|fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="alignment17">
- <property name="xalign">0.5</property>
- <property name="yalign">1</property>
- <property name="xscale">1</property>
- <property name="yscale">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkVBox" id="vbox15">
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="label15">
- <property name="label" translatable="yes">Footer:</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="entry8">
- <property name="can_focus">yes</property>
- <property name="editable">yes</property>
- <property name="text" translatable="yes"></property>
- <property name="max-length">0</property>
- <property name="visibility">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">expand|fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="alignment14">
- <property name="xalign">0</property>
- <property name="yalign">1</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkButton" id="button10">
- <property name="can_focus">yes</property>
- <property name="label" translatable="yes">_Font...</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="visible">yes</property>
- <property name="use_underline">yes</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox7">
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkToolbar" id="toolbar1">
- <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property>
- <property name="toolbar-style">GTK_TOOLBAR_ICONS</property>
- <property name="visible">yes</property>
-
- <child>
- <placeholder />
- </child>
-
- <child>
- <placeholder />
- </child>
-
- <child>
- <placeholder />
- </child>
-
- <child>
- <placeholder />
- </child>
-
- <child>
- <placeholder />
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">no</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">yes</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="checkbutton4">
- <property name="can_focus">yes</property>
- <property name="label" translatable="yes">Reverse on even pages</property>
- <property name="active">no</property>
- <property name="draw_indicator">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="label" translatable="yes">Header/Footer</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">4</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
- </widget>
-</glade-interface>
diff --git a/addressbook/printing/e-contact-print.h b/addressbook/printing/e-contact-print.h
deleted file mode 100644
index 4edc948082..0000000000
--- a/addressbook/printing/e-contact-print.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-contact-print.h
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef E_CONTACT_PRINT_H
-#define E_CONTACT_PRINT_H
-
-#include <glib.h>
-#include <gtk/gtkwidget.h>
-#include <libebook/e-book.h>
-#include <libebook/e-contact.h>
-#include "e-contact-print-types.h"
-
-GtkWidget *e_contact_print_dialog_new(EBook *book, char *query);
-void e_contact_print_preview(EBook *book, char *query);
-GtkWidget *e_contact_print_contact_dialog_new(EContact *card);
-GtkWidget *e_contact_print_contact_list_dialog_new(GList *list);
-
-#endif /* E_CONTACT_PRINT_H */
diff --git a/addressbook/printing/medbook.ecps b/addressbook/printing/medbook.ecps
deleted file mode 100644
index ef76c0b46e..0000000000
--- a/addressbook/printing/medbook.ecps
+++ /dev/null
@@ -1,30 +0,0 @@
-<style>
-<title/>
-<type>cards</type>
-<sections_start_new_page>FALSE</sections_start_new_page>
-<num_columns>2</num_columns>
-<blank_forms>2</blank_forms>
-<letter_tabs>TRUE</letter_tabs>
-<letter_headings>TRUE</letter_headings>
-<headings_font>Helvetica Bold 12</headings_font>
-<body_font>Helvetica 8</body_font>
-<print_using_grey>TRUE</print_using_grey>
-<paper_width>8.5</paper_width>
-<paper_height>11</paper_height>
-<top_margin>0.5</top_margin>
-<left_margin>0.5</left_margin>
-<bottom_margin>0.5</bottom_margin>
-<right_margin>0.5</right_margin>
-<page_width>8.5</page_width>
-<page_height>11</page_height>
-<orientation>portrait</orientation>
-<header_font>Helvetica 8</header_font>
-<left_header/>
-<center_header/>
-<right_header/>
-<footer_font>Helvetica 8</footer_font>
-<left_footer/>
-<center_footer>[Page #]</center_footer>
-<right_footer/>
-<reverse_on_even_pages>FALSE</reverse_on_even_pages>
-</style>
diff --git a/addressbook/printing/phonelist.ecps b/addressbook/printing/phonelist.ecps
deleted file mode 100644
index 980750a6b2..0000000000
--- a/addressbook/printing/phonelist.ecps
+++ /dev/null
@@ -1,29 +0,0 @@
-<style>
-<title/>
-<type>phone_list</type>
-<sections_start_new_page>FALSE</sections_start_new_page>
-<num_columns>2</num_columns>
-<letter_tabs>FALSE</letter_tabs>
-<letter_headings>TRUE</letter_headings>
-<headings_font>Helvetica Bold 10</headings_font>
-<body_font>Helvetica 8</body_font>
-<print_using_grey>TRUE</print_using_grey>
-<paper_width>8.5</paper_width>
-<paper_height>11</paper_height>
-<top_margin>0.5</top_margin>
-<left_margin>0.5</left_margin>
-<bottom_margin>0.5</bottom_margin>
-<right_margin>0.5</right_margin>
-<page_width>8.5</page_width>
-<page_height>11</page_height>
-<orientation>portrait</orientation>
-<header_font>Helvetica 8</header_font>
-<left_header/>
-<center_header/>
-<right_header/>
-<footer_font>Helvetica 8</footer_font>
-<left_footer>[User Name]</left_footer>
-<center_footer>[Page #]</center_footer>
-<right_footer>[Date Printed]</right_footer>
-<reverse_on_even_pages>FALSE</reverse_on_even_pages>
-</style>
diff --git a/addressbook/printing/smallbook.ecps b/addressbook/printing/smallbook.ecps
deleted file mode 100644
index 0bb19aa92e..0000000000
--- a/addressbook/printing/smallbook.ecps
+++ /dev/null
@@ -1,30 +0,0 @@
-<style>
-<title/>
-<type>cards</type>
-<sections_start_new_page>FALSE</sections_start_new_page>
-<num_columns>1</num_columns>
-<blank_forms>2</blank_forms>
-<letter_tabs>TRUE</letter_tabs>
-<letter_headings>TRUE</letter_headings>
-<headings_font>Helvetica Bold 8</headings_font>
-<body_font>Helvetica 6</body_font>
-<print_using_grey>TRUE</print_using_grey>
-<paper_width>8.5</paper_width>
-<paper_height>11</paper_height>
-<top_margin>0.5</top_margin>
-<left_margin>0.5</left_margin>
-<bottom_margin>0.5</bottom_margin>
-<right_margin>0.5</right_margin>
-<page_width>2.75</page_width>
-<page_height>4.25</page_height>
-<orientation>portrait</orientation>
-<header_font>Helvetica 6</header_font>
-<left_header/>
-<center_header/>
-<right_header/>
-<footer_font>Helvetica 6</footer_font>
-<left_footer/>
-<center_footer>[Page #]</center_footer>
-<right_footer/>
-<reverse_on_even_pages>FALSE</reverse_on_even_pages>
-</style>
diff --git a/addressbook/printing/test-contact-print-style-editor.c b/addressbook/printing/test-contact-print-style-editor.c
deleted file mode 100644
index f49625434e..0000000000
--- a/addressbook/printing/test-contact-print-style-editor.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * test-contact-print-style-editor.c
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <gtk/gtkmain.h>
-#include <libgnomeui/gnome-app.h>
-#include <libgnomeui/gnome-ui-init.h>
-#include <bonobo/bonobo-main.h>
-#include "e-contact-print-style-editor.h"
-
-/* This is a horrible thing to do, but it is just a test. */
-GtkWidget *editor;
-
-static void destroy_callback(GtkWidget *app, gpointer data)
-{
- static int count = 2;
- count --;
- if ( count <= 0 )
- exit(0);
-}
-
-#if 0
-static void about_callback( GtkWidget *widget, gpointer data )
-{
-
- const gchar *authors[] =
- {
- "Christopher James Lahey <clahey@umich.edu>",
- NULL
- };
-
- GtkWidget *about =
- gnome_about_new ( _( "Contact Print Style Editor Test" ), VERSION,
- _( "Copyright (C) 2000, Ximian, Inc." ),
- authors,
- _( "This should test the contact print style editor widget" ),
- NULL);
- gtk_widget_show (about);
-}
-#endif
-
-int main( int argc, char *argv[] )
-{
- GtkWidget *app;
-
- /* bindtextdomain (PACKAGE, GNOMELOCALEDIR);
- textdomain (PACKAGE);*/
-
- gnome_program_init ("Contact Print Style Editor Test", VERSION,
- LIBGNOMEUI_MODULE,
- argc, argv,
- NULL);
-
- glade_init ();
-
- app = gnome_app_new("Contact Print Style Editor Test", NULL);
-
- editor = e_contact_print_style_editor_new("");
-
- gnome_app_set_contents( GNOME_APP( app ), editor );
-
- /* Connect the signals */
- g_signal_connect( app, "destroy",
- G_CALLBACK ( destroy_callback ),
- ( gpointer ) app );
-
- gtk_widget_show_all( app );
-
- bonobo_main();
-
- /* Not reached. */
- return 0;
-}
diff --git a/addressbook/printing/test-print.c b/addressbook/printing/test-print.c
deleted file mode 100644
index a1dede7bde..0000000000
--- a/addressbook/printing/test-print.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * test-print.c
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <gtk/gtkmain.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <libgnomeui/gnome-ui-init.h>
-#include <glade/glade.h>
-#include <bonobo/bonobo-main.h>
-#include "e-contact-print.h"
-
-/* This is a horrible thing to do, but it is just a test. */
-GtkWidget *print;
-
-static gint test_close(GnomeDialog *dialog, gpointer data)
-{
- exit(0);
- return 1;
-}
-
-#if 0
-static void about_callback( GtkWidget *widget, gpointer data )
-{
-
- const gchar *authors[] =
- {
- "Christopher James Lahey <clahey@umich.edu>",
- NULL
- };
-
- GtkWidget *about =
- gnome_about_new ( _( "Contact Print Test" ), VERSION,
- _( "Copyright (C) 2000, Ximian, Inc." ),
- authors,
- _( "This should test the contact print code" ),
- NULL);
- gtk_widget_show (about);
-}
-#endif
-
-int main( int argc, char *argv[] )
-{
- GList *shown_fields = NULL;
-
- /* bindtextdomain (PACKAGE, GNOMELOCALEDIR);
- textdomain (PACKAGE);*/
-
- gnome_program_init ("Contact Print Test", VERSION,
- LIBGNOMEUI_MODULE,
- argc, argv,
- NULL);
-
- glade_init ();
-
- shown_fields = g_list_append(shown_fields, "First field");
- shown_fields = g_list_append(shown_fields, "Second field");
- shown_fields = g_list_append(shown_fields, "Third field");
- shown_fields = g_list_append(shown_fields, "Fourth field");
-
- print = e_contact_print_dialog_new(NULL, NULL);
- gtk_widget_show_all(print);
- g_signal_connect(print, "close", G_CALLBACK(test_close), NULL);
-
- bonobo_main();
-
- /* Not reached. */
- return 0;
-}
diff --git a/addressbook/tools/.cvsignore b/addressbook/tools/.cvsignore
deleted file mode 100644
index 25963ae030..0000000000
--- a/addressbook/tools/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-Makefile
-Makefile.in
-evolution-addressbook-export
-evolution-addressbook-abuse
-evolution-addressbook-clean
diff --git a/addressbook/tools/Makefile.am b/addressbook/tools/Makefile.am
deleted file mode 100644
index c925cb5e05..0000000000
--- a/addressbook/tools/Makefile.am
+++ /dev/null
@@ -1,39 +0,0 @@
-privlibexec_SCRIPTS = \
- csv2vcard \
- evolution-addressbook-clean
-
-privlibexec_PROGRAMS = \
- evolution-addressbook-export
-
-INCLUDES = \
- -DG_LOG_DOMAIN=\"evolution-addressbook-tools\" \
- -I$(top_srcdir) \
- -I$(top_builddir) \
- -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \
- -DPREFIX=\""$(prefix)"\" \
- -DSYSCONFDIR=\""$(sysconfdir)"\" \
- -DDATADIR=\""$(datadir)"\" \
- -DLIBDIR=\""$(libdir)"\" \
- -I$(top_srcdir)/addressbook \
- -I$(top_builddir)/addressbook \
- $(EVOLUTION_ADDRESSBOOK_CFLAGS)
-
-evolution_addressbook_export_SOURCES = \
- evolution-addressbook-export.c \
- evolution-addressbook-export-list-cards.c \
- evolution-addressbook-export-list-folders.c \
- evolution-addressbook-export.h
-
-evolution_addressbook_export_LDADD = \
- $(EVOLUTION_ADDRESSBOOK_LIBS)
-
-EXTRA_DIST = $(privlibexec_SCRIPTS) \
- evolution-addressbook-clean.in
-
-CLEANFILES= evolution-addressbook-clean
-
-evolution-addressbook-clean: evolution-addressbook-clean.in Makefile
-## Use sed and then mv to avoid problems if the user interrupts.
- sed -e 's?\@EVOLUTION_TOOLSDIR\@?$(privlibexecdir)?g' \
- < $(srcdir)/evolution-addressbook-clean.in > evolution-addressbook-clean.tmp \
- && mv evolution-addressbook-clean.tmp evolution-addressbook-clean
diff --git a/addressbook/tools/csv2vcard b/addressbook/tools/csv2vcard
deleted file mode 100755
index b968fbd9c3..0000000000
--- a/addressbook/tools/csv2vcard
+++ /dev/null
@@ -1,236 +0,0 @@
-#!/usr/bin/perl -w
-#
-# cvs2vcard - Script to convert Outlook CSV files into VCard files
-# suitable to be imported into Evolution.
-#
-# Copyright (C) 2001 Ximian, Inc.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of version 2 of the GNU General Public
-# License as published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public
-# License along with this program; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-#
-# Author: Michael MacDonald <mjmac@ximian.com>
-#
-
-use strict;
-use diagnostics;
-use Text::ParseWords;
-
-sub usage
-{
- print STDERR << "--EndOfUsage";
-
-Takes a CSV-formatted list of contacts from Outlook and attempts to
-convert it into a list of VCards suitable for import into Evolution.
-
-Usage: $0 [infile outfile]
-
---EndOfUsage
-
- exit;
-}
-
-sub is_recognized_format
-{
- my $line = shift;
-
- # Making some assumptions here... Prolly OK.
- return $line =~ /(First Name|Middle Name|Last Name)/;
-}
-
-sub map_columns
-{
- my $line = shift;
-
- my @names = parse_line(',', 0, $line);
-
- my $ctr = 0;
- my %fieldmap = map { $_ => $ctr++ } @names;
-
- return %fieldmap;
-}
-
-sub build_vcard_attr_from_def
-{
- my ($def, $fields, $map) = @_;
-
- # Valid chars for lookup (from Outlook CSV) are
- # A-Za-z0-9_-'/
- # Valid chars for formatting of attr are
- # \s,|
- my @lookup = map { s/=0A$//; s/[^\w\s\-'\/]//; $_; } split /[\s,]*\|[\s,]*/, $def;
-
- foreach my $el (@lookup) {
- unless (defined($map->{ $el })) {
- print STDERR "$el is undefined\n";
- next;
- }
- if (defined($fields->[$map->{ $el }])) {
- unless ($fields->[$map->{ $el }] =~ /(^$|0\/0\/00)/) {
- $def =~ s/$el/$fields->[$map->{ $el }]/;
- } else {
- $def =~ s/((?<=\|)\s*)?$el(\s*?(?=\|))?(=0A)?,?//;
- }
- } else {
- $def =~ s/((?<=\|)\s*)?$el(\s*?(?=\|))?(=0A)?,?//;
- }
- }
- # Get rid of field delimiters
- $def =~ s/\|//g;
- # Snip off any trailing semicolons or whitespace
- $def =~ s/[\s;]*$//;
-
- return $def;
-}
-
-sub build_vcard_from_line {
- my ($line, %map) = @_;
- my %vcard;
-
- my @fields = parse_line(',', 0, $line);
-
- my %vcard_def = ( FN => 'Title |First Name |Middle Name |Last Name |Suffix',
- N => 'Last Name| Suffix|;First Name|;Middle Name|;Title',
- 'ADR;WORK' => 'PO Box|;Business Street 2|;Business Street|;Business City|;Business State|;Business Postal Code|;Business Country',
- 'LABEL;QUOTED-PRINTABLE;WORK' => 'PO Box |Business Street=0A|Business Street 2=0A|Business City,| Business State| Business Postal Code=0A|Business Country',
- 'TEL;WORK;VOICE' => 'Business Phone',
- 'TEL;WORK;VOICE2' => 'Business Phone 2',
- 'TEL;WORK;FAX' => 'Business Fax',
- 'TEL;WORK;COMPANY' => 'Company Main Phone',
- 'ADR;HOME' => ';Home Street 2|;Home Street|;Home City|;Home State|;Home Postal Code|;Home Country',
- 'LABEL;QUOTED-PRINTABLE;HOME' => 'Home Street=0A|Home Street 2=0A|Home City,| Home State| Home Postal Code=0A|Home Country',
- 'TEL;HOME;VOICE' => 'Home Phone',
- 'TEL;HOME;VOICE2' => 'Home Phone 2',
- 'TEL;HOME;FAX' => 'Home Fax',
- 'ADR;POSTAL' => ';Other Street 2|;Other Street|;Other City|;Other State|;Other Postal Code|;Other Country',
- 'LABEL;QUOTED-PRINTABLE;POSTAL' => 'Other Street=0A|Other Street 2=0A|Other City,| Other State| Other Postal Code=0A|Other Country',
- 'TEL;VOICE' => 'Other Phone',
- 'TEL;FAX' => 'Other Fax',
- 'TEL;CELL' => 'Mobile Phone',
- 'TEL;CAR' => 'Car Phone',
- 'TEL;PAGER' => 'Pager',
- 'TEL;PREF' => 'Primary Phone',
- 'TEL;ISDN' => 'ISDN',
- 'TEL;X-EVOLUTION-CALLBACK' => 'Callback',
- 'TEL;X-EVOLUTION-TTYTDD' => 'TTY/TDD Phone',
- 'TEL;X-EVOLUTION-TELEX' => 'Telex',
- 'TEL;X-EVOLUTION-RADIO' => 'Radio Phone',
- 'EMAIL;INTERNET' => 'E-mail Address',
- 'EMAIL;INTERNET2' => 'E-mail 2 Address',
- 'EMAIL;INTERNET3' => 'E-mail 3 Address',
- ORG => 'Company|;Department',
- TITLE => 'Job Title',
- ROLE => 'Profession',
- 'X-EVOLUTION-ASSISTANT' => "Assistant's Name",
- 'TEL;X-EVOLUTION-ASSISTANT' => "Assistant's Phone",
- 'X-EVOLUTION-SPOUSE' => 'Spouse',
- 'X-EVOLUTION-ANNIVERSARY' => 'Anniversary',
- 'X-EVOLUTION-MANAGER' => "Manager's Name",
- 'X-EVOLUTION-OFFICE' => 'Office Location',
- BDAY => 'Birthday',
- NOTE => 'Notes',
- FBURL => 'Internet Free Busy',
- URL => 'Web Page',
- );
-
- foreach my $key (keys(%vcard_def)) {
- my $attr = build_vcard_attr_from_def($vcard_def{ $key }, \@fields, \%map);
- if (defined($attr)) {
- $vcard{ $key } = $attr unless ($attr =~ /^$/);
- }
- }
-
- return %vcard;
-}
-
-sub print_vcard_to_fh
-{
- my ($fh, %vcard) = @_;
-
- print $fh "BEGIN:VCARD\n";
- foreach my $key (keys(%vcard)) {
- # Dirty hack because Evolution's vcard stores multiple email addrs
- # with same sttribute, hence key collision. Bleah.
- # Ugh! Same deal for multiple phones... (eg. bus. phone)
- #
- # And finally, while we're special-casing... Outlook exports dates
- # differently, so munge 'em if we find 'em.
- if ($key =~ /EMAIL;INTERNET/o) {
- (my $temp = $key) =~ s/\d$//;
- print $fh "$temp:$vcard{ $key }\n";
- } elsif ($key =~ /TEL;(HOME|WORK)/o) {
- (my $temp = $key) =~ s/\d$//;
- print $fh "$temp:$vcard{ $key }\n";
- } elsif ($key =~ /(BDAY|X\-EVOLUTION\-ANNIVERSARY)/o) {
- my $temp = $vcard{ $key };
- if ($temp =~ /(\d\d)\/(\d\d)\/(\d\d)/) {
- # Y2k !! MS Didn't learn anything.
- # Hope no one was born before 1915
- if ((1900 + $3) < 1915) {
- print $fh "$key:20$3-$1-$2\n";
- } else {
- print $fh "$key:19$3-$1-$2\n";
- }
- } else {
- # Something's funky... Just delete the attribute
- print STDERR "Couldn't figure out what to do with $key:$vcard{ $key }\n";
- delete($vcard{ $key });
- }
- } else {
- print $fh "$key:$vcard{ $key }\n";
- }
- }
- print $fh "END:VCARD\n\n";
-}
-
-my $in = $ARGV[0];
-my $out = $ARGV[1];
-
-usage() unless(defined($in) && defined($out));
-
-open (IN, $in)
- or die "Can't open($in): $!\n";
-
-open (OUT, ">$out")
- or die "Can't open($out): $!\n";
-
-my $linectr = 0;
-my %map;
-
-while (my $line = <IN>) {
- $line =~ s/\r//g;
- $line =~ s/\n$//;
- if ($linectr == 0) {
- $linectr++;
- usage() unless is_recognized_format($line);
- %map = map_columns($line);
- #if ($line =~ /\r\n$/) {
- # print STDERR "Apparenlty found DOS-style EOL indicators...\n";
- $/ = "\r\n";
- #}
- } else {
- $linectr++;
- while ($line =~ /^(("([^"]|\n|"")*")?,)*"([^"]|\n|"")*$/) {
- my $temp = $line;
- $line = <IN>;
- $line =~ s/\r//g;
- $line =~ s/\n$//;
- $line = "$temp $line";
- }
- my %vcard = build_vcard_from_line($line, %map);
- print_vcard_to_fh(\*OUT, %vcard);
- }
-}
-
-close(IN);
-close(OUT);
diff --git a/addressbook/tools/evolution-addressbook-abuse.c b/addressbook/tools/evolution-addressbook-abuse.c
deleted file mode 100644
index 3446e15938..0000000000
--- a/addressbook/tools/evolution-addressbook-abuse.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#include <config.h>
-
-#include <bonobo/bonobo-main.h>
-
-#include <backend/ebook/e-book.h>
-#include <gnome.h>
-
-#define CONTACTS_TO_ADD 2000
-
-static gchar *
-make_random_string (void)
-{
- const gchar *elements = " abcdefghijklmnopqrstuvwxyz1234567890 ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- gint len = strlen (elements);
- gint i, N = 5 + (random () % 10);
- gchar *str = g_malloc (N+1);
-
- for (i = 0; i < N; ++i) {
- str[i] = elements[random () % len];
- }
- str[i] = '\0';
-
- return str;
-}
-
-static gchar *
-make_random_vcard (void)
-{
- gchar *fa = make_random_string ();
- gchar *name = make_random_string ();
- gchar *email = make_random_string ();
- gchar *org = make_random_string ();
-
- gchar *vcard;
-
- vcard = g_strdup_printf ("BEGIN:VCARD\n"
- "X-EVOLUTION-FILE-AS:%s\n"
- "N:%s\n"
- "EMAIL;INTERNET:%s\n"
- "ORG:%s\n"
- "END:VCARD",
- fa, name, email, org);
- g_free (fa);
- g_free (name);
- g_free (email);
- g_free (org);
-
- return vcard;
-}
-
-int
-main (int argc, char *argv[])
-{
- EBook *book;
- int i;
-
- if (getenv ("ABUSE_THE_WOMBAT") == NULL) {
- g_print ("You probably don't want to use this program.\n"
- "It isn't very nice.\n");
- exit(0);
- }
-
- bindtextdomain (GETTEXT_PACKAGE, EVOLUTION_LOCALEDIR);
- textdomain (GETTEXT_PACKAGE);
-
- gnome_program_init ("evolution-addressbook-abuse", VERSION,
- LIBGNOMEUI_MODULE, argc, argv,
- GNOME_PROGRAM_STANDARD_PROPERTIES,
- NULL);
-
- if (!e_book_get_default_addressbook (&book, NULL)) {
- g_warning ("couldn't open addressbook");
- exit (1);
- }
-
- for (i = 0; i < CONTACTS_TO_ADD; ++i) {
- gchar *vcard = make_random_vcard ();
- EContact *contact = e_contact_new_from_vcard (vcard);
- g_message ("adding %d", i);
- if (!e_book_add_contact (book, contact, NULL)) {
- g_warning ("something went wrong...");
- exit (1);
- }
- g_free (vcard);
- g_object_unref (contact);
- }
-
- return 0;
-}
diff --git a/addressbook/tools/evolution-addressbook-clean.in b/addressbook/tools/evolution-addressbook-clean.in
deleted file mode 100644
index b7ee7ba167..0000000000
--- a/addressbook/tools/evolution-addressbook-clean.in
+++ /dev/null
@@ -1,24 +0,0 @@
-#! /usr/bin/perl -w
-
-sub do_system
-{
- my ($command) = @_;
- system ($command);
- if ($? != 0) {
- die "Command failed: $command";
- }
-}
-
-$filename = `@EVOLUTION_TOOLSDIR@/evolution-addressbook-export`;
-if ($? != 0) {
- $! = $?;
- die $!;
-}
-
-$HOME = $ENV{"HOME"};
-
-system ("@EVOLUTION_TOOLSDIR@/killev");
-do_system ("/bin/mv ${HOME}/evolution/local/Contacts/addressbook.db ${HOME}/evolution/local/Contacts/addressbook-backup.db");
-do_system ("@EVOLUTION_TOOLSDIR@/evolution-addressbook-import --input-file $filename");
-do_system ("/bin/rm $filename");
-
diff --git a/addressbook/tools/evolution-addressbook-export-list-cards.c b/addressbook/tools/evolution-addressbook-export-list-cards.c
deleted file mode 100644
index 88923fd244..0000000000
--- a/addressbook/tools/evolution-addressbook-export-list-cards.c
+++ /dev/null
@@ -1,796 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-addressbook-export-list-cards.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Gilbert Fang <gilbert.fang@sun.com>
- *
- */
-
-#include <config.h>
-
-#include <string.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <glib.h>
-#include <bonobo-activation/bonobo-activation.h>
-#include <libbonobo.h>
-#include <libgnome/libgnome.h>
-
-#include <libebook/e-book.h>
-#include <libebook/e-contact.h>
-
-#include "evolution-addressbook-export.h"
-
-#define COMMA_SEPARATOR ","
-
-typedef enum _CARD_FORMAT CARD_FORMAT;
-typedef enum _DeliveryAddressField DeliveryAddressField;
-typedef enum _EContactFieldCSV EContactFieldCSV;
-typedef struct _EContactCSVFieldData EContactCSVFieldData;
-
-enum _CARD_FORMAT
-{
- CARD_FORMAT_CSV,
- CARD_FORMAT_VCARD
-};
-
-enum _DeliveryAddressField
-{
- DELIVERY_ADDRESS_STREET,
- DELIVERY_ADDRESS_EXT,
- DELIVERY_ADDRESS_LOCALITY,
- DELIVERY_ADDRESS_REGION,
- DELIVERY_ADDRESS_CODE,
- DELIVERY_ADDRESS_COUNTRY
-};
-
-enum _EContactFieldCSV
-{
- E_CONTACT_CSV_FILE_AS,
- E_CONTACT_CSV_FULL_NAME,
- E_CONTACT_CSV_EMAIL,
- E_CONTACT_CSV_PHONE_PRIMARY,
- E_CONTACT_CSV_PHONE_ASSISTANT,
- E_CONTACT_CSV_PHONE_BUSINESS,
- E_CONTACT_CSV_PHONE_CALLBACK,
- E_CONTACT_CSV_PHONE_COMPANY,
- E_CONTACT_CSV_PHONE_HOME,
- E_CONTACT_CSV_ORG,
- /*E_CONTACT_CSV_ADDRESS_BUSINESS, */
- E_CONTACT_CSV_ADDRESS_BUSINESS_STREET,
- E_CONTACT_CSV_ADDRESS_BUSINESS_EXT,
- E_CONTACT_CSV_ADDRESS_BUSINESS_CITY,
- E_CONTACT_CSV_ADDRESS_BUSINESS_REGION,
- E_CONTACT_CSV_ADDRESS_BUSINESS_POSTCODE,
- E_CONTACT_CSV_ADDRESS_BUSINESS_COUNTRY,
- /*E_CONTACT_CSV_ADDRESS_HOME, */
- E_CONTACT_CSV_ADDRESS_HOME_STREET,
- E_CONTACT_CSV_ADDRESS_HOME_EXT,
- E_CONTACT_CSV_ADDRESS_HOME_CITY,
- E_CONTACT_CSV_ADDRESS_HOME_REGION,
- E_CONTACT_CSV_ADDRESS_HOME_POSTCODE,
- E_CONTACT_CSV_ADDRESS_HOME_COUNTRY,
- E_CONTACT_CSV_PHONE_MOBILE,
- E_CONTACT_CSV_PHONE_CAR,
- E_CONTACT_CSV_PHONE_BUSINESS_FAX,
- E_CONTACT_CSV_PHONE_HOME_FAX,
- E_CONTACT_CSV_PHONE_BUSINESS_2,
- E_CONTACT_CSV_PHONE_HOME_2,
- E_CONTACT_CSV_PHONE_ISDN,
- E_CONTACT_CSV_PHONE_OTHER,
- E_CONTACT_CSV_PHONE_OTHER_FAX,
- E_CONTACT_CSV_PHONE_PAGER,
- E_CONTACT_CSV_PHONE_RADIO,
- E_CONTACT_CSV_PHONE_TELEX,
- E_CONTACT_CSV_PHONE_TTYTDD,
- /*E_CONTACT_CSV_ADDRESS_OTHER, */
- E_CONTACT_CSV_ADDRESS_OTHER_STREET,
- E_CONTACT_CSV_ADDRESS_OTHER_EXT,
- E_CONTACT_CSV_ADDRESS_OTHER_CITY,
- E_CONTACT_CSV_ADDRESS_OTHER_REGION,
- E_CONTACT_CSV_ADDRESS_OTHER_POSTCODE,
- E_CONTACT_CSV_ADDRESS_OTHER_COUNTRY,
- E_CONTACT_CSV_EMAIL_2,
- E_CONTACT_CSV_EMAIL_3,
- E_CONTACT_CSV_HOMEPAGE_URL,
- E_CONTACT_CSV_ORG_UNIT,
- E_CONTACT_CSV_OFFICE,
- E_CONTACT_CSV_TITLE,
- E_CONTACT_CSV_ROLE,
- E_CONTACT_CSV_MANAGER,
- E_CONTACT_CSV_ASSISTANT,
- E_CONTACT_CSV_NICKNAME,
- E_CONTACT_CSV_SPOUSE,
- E_CONTACT_CSV_NOTE,
- E_CONTACT_CSV_CALENDAR_URI,
- E_CONTACT_CSV_FREEBUSY_URL,
- /*E_CONTACT_CSV_ANNIVERSARY, */
- E_CONTACT_CSV_ANNIVERSARY_YEAR,
- E_CONTACT_CSV_ANNIVERSARY_MONTH,
- E_CONTACT_CSV_ANNIVERSARY_DAY,
- /*E_CONTACT_CSV_BIRTH_DATE, */
- E_CONTACT_CSV_BIRTH_DATE_YEAR,
- E_CONTACT_CSV_BIRTH_DATE_MONTH,
- E_CONTACT_CSV_BIRTH_DATE_DAY,
- E_CONTACT_CSV_MAILER,
- E_CONTACT_CSV_NAME_OR_ORG,
- E_CONTACT_CSV_CATEGORIES,
- E_CONTACT_CSV_FAMILY_NAME,
- E_CONTACT_CSV_GIVEN_NAME,
- E_CONTACT_CSV_WANTS_HTML,
- E_CONTACT_CSV_IS_LIST,
- E_CONTACT_CSV_LAST
-};
-
-struct _EContactCSVFieldData
-{
- gint csv_field;
- gint contact_field;
- gchar *csv_name;
-};
-
-#define NOMAP -1
-static EContactCSVFieldData csv_field_data[] = {
- {E_CONTACT_CSV_FILE_AS, E_CONTACT_FILE_AS, ""},
- {E_CONTACT_CSV_FULL_NAME, E_CONTACT_CSV_FULL_NAME, ""},
- {E_CONTACT_CSV_EMAIL, E_CONTACT_EMAIL, ""},
- {E_CONTACT_CSV_PHONE_PRIMARY, E_CONTACT_PHONE_PRIMARY,
- ""},
- {E_CONTACT_CSV_PHONE_ASSISTANT,
- E_CONTACT_PHONE_ASSISTANT, ""},
- {E_CONTACT_CSV_PHONE_BUSINESS,
- E_CONTACT_PHONE_BUSINESS, ""},
- {E_CONTACT_CSV_PHONE_CALLBACK,
- E_CONTACT_PHONE_CALLBACK, ""},
- {E_CONTACT_CSV_PHONE_COMPANY, E_CONTACT_PHONE_COMPANY,
- ""},
- {E_CONTACT_CSV_PHONE_HOME, E_CONTACT_PHONE_HOME, ""},
- {E_CONTACT_CSV_ORG, E_CONTACT_ORG, ""},
- /*E_CONTACT_CSV_ADDRESS_BUSINESS, */
- {E_CONTACT_CSV_ADDRESS_BUSINESS_STREET, NOMAP,
- "Business Address"},
- {E_CONTACT_CSV_ADDRESS_BUSINESS_EXT, NOMAP,
- "Business Address2"},
- {E_CONTACT_CSV_ADDRESS_BUSINESS_CITY, NOMAP,
- "Business Address City"},
- {E_CONTACT_CSV_ADDRESS_BUSINESS_REGION, NOMAP,
- "Business Address State"},
- {E_CONTACT_CSV_ADDRESS_BUSINESS_POSTCODE, NOMAP,
- "Business Address PostCode"},
- {E_CONTACT_CSV_ADDRESS_BUSINESS_COUNTRY, NOMAP,
- "Business Address Country"},
- /*E_CONTACT_CSV_ADDRESS_HOME, */
- {E_CONTACT_CSV_ADDRESS_HOME_STREET, NOMAP, "Home Address"},
- {E_CONTACT_CSV_ADDRESS_HOME_EXT, NOMAP, "Home Address2"},
- {E_CONTACT_CSV_ADDRESS_HOME_CITY, NOMAP, "Home Address City"},
- {E_CONTACT_CSV_ADDRESS_HOME_REGION, NOMAP,
- "Home Address State"},
- {E_CONTACT_CSV_ADDRESS_HOME_POSTCODE, NOMAP,
- "Home Address PostCode"},
- {E_CONTACT_CSV_ADDRESS_HOME_COUNTRY, NOMAP,
- "Home Address Country"},
- {E_CONTACT_CSV_PHONE_MOBILE, E_CONTACT_PHONE_MOBILE,
- ""},
- {E_CONTACT_CSV_PHONE_CAR, E_CONTACT_PHONE_CAR, ""},
- {E_CONTACT_CSV_PHONE_BUSINESS_FAX,
- E_CONTACT_PHONE_BUSINESS_FAX, ""},
- {E_CONTACT_CSV_PHONE_HOME_FAX,
- E_CONTACT_PHONE_HOME_FAX, ""},
- {E_CONTACT_CSV_PHONE_BUSINESS_2,
- E_CONTACT_PHONE_BUSINESS_2, ""},
- {E_CONTACT_CSV_PHONE_HOME_2, E_CONTACT_PHONE_HOME_2,
- ""},
- {E_CONTACT_CSV_PHONE_ISDN, E_CONTACT_PHONE_ISDN, ""},
- {E_CONTACT_CSV_PHONE_OTHER, E_CONTACT_PHONE_OTHER, ""},
- {E_CONTACT_CSV_PHONE_OTHER_FAX,
- E_CONTACT_PHONE_OTHER_FAX, ""},
- {E_CONTACT_CSV_PHONE_PAGER, E_CONTACT_PHONE_PAGER, ""},
- {E_CONTACT_CSV_PHONE_RADIO, E_CONTACT_PHONE_RADIO, ""},
- {E_CONTACT_CSV_PHONE_TELEX, E_CONTACT_PHONE_TELEX, ""},
- {E_CONTACT_CSV_PHONE_TTYTDD, E_CONTACT_PHONE_TTYTDD,
- ""},
- /*E_CONTACT_CSV_ADDRESS_OTHER, */
- {E_CONTACT_CSV_ADDRESS_OTHER_STREET, NOMAP, "Other Address"},
- {E_CONTACT_CSV_ADDRESS_OTHER_EXT, NOMAP, "Other Address2"},
- {E_CONTACT_CSV_ADDRESS_OTHER_CITY, NOMAP,
- "Other Address City"},
- {E_CONTACT_CSV_ADDRESS_OTHER_REGION, NOMAP,
- "Other Address State"},
- {E_CONTACT_CSV_ADDRESS_OTHER_POSTCODE, NOMAP,
- "Other Address PostCode"},
- {E_CONTACT_CSV_ADDRESS_OTHER_COUNTRY, NOMAP,
- "Other Address Country"},
- {E_CONTACT_CSV_EMAIL_2, E_CONTACT_EMAIL_2, ""},
- {E_CONTACT_CSV_EMAIL_3, E_CONTACT_EMAIL_3, ""},
- {E_CONTACT_CSV_HOMEPAGE_URL, E_CONTACT_HOMEPAGE_URL, ""},
- {E_CONTACT_CSV_ORG_UNIT, E_CONTACT_ORG_UNIT, ""},
- {E_CONTACT_CSV_OFFICE, E_CONTACT_OFFICE, ""},
- {E_CONTACT_CSV_TITLE, E_CONTACT_TITLE, ""},
- {E_CONTACT_CSV_ROLE, E_CONTACT_ROLE, ""},
- {E_CONTACT_CSV_MANAGER, E_CONTACT_MANAGER, ""},
- {E_CONTACT_CSV_ASSISTANT, E_CONTACT_ASSISTANT, ""},
- {E_CONTACT_CSV_NICKNAME, E_CONTACT_NICKNAME, ""},
- {E_CONTACT_CSV_SPOUSE, E_CONTACT_SPOUSE, ""},
- {E_CONTACT_CSV_NOTE, E_CONTACT_NOTE, ""},
- {E_CONTACT_CSV_CALENDAR_URI, E_CONTACT_CALENDAR_URI, ""},
- {E_CONTACT_CSV_FREEBUSY_URL, E_CONTACT_FREEBUSY_URL, ""},
- /*E_CONTACT_ANNIVERSARY, */
- {E_CONTACT_CSV_ANNIVERSARY_YEAR, NOMAP, "Anniversary Year"},
- {E_CONTACT_CSV_ANNIVERSARY_MONTH, NOMAP, "Anniversary Month"},
- {E_CONTACT_CSV_ANNIVERSARY_DAY, NOMAP, "Anniversary Day"},
- /*E_CONTACT_BIRTH_DATE, */
- {E_CONTACT_CSV_BIRTH_DATE_YEAR, NOMAP, "Birth Year"},
- {E_CONTACT_CSV_BIRTH_DATE_MONTH, NOMAP, "Birth Month"},
- {E_CONTACT_CSV_BIRTH_DATE_DAY, NOMAP, "Birth Day"},
- {E_CONTACT_CSV_MAILER, E_CONTACT_MAILER, ""},
- {E_CONTACT_CSV_NAME_OR_ORG, E_CONTACT_NAME_OR_ORG, ""},
- {E_CONTACT_CSV_CATEGORIES, E_CONTACT_CATEGORIES, ""},
- {E_CONTACT_CSV_FAMILY_NAME, E_CONTACT_FAMILY_NAME, ""},
- {E_CONTACT_CSV_GIVEN_NAME, E_CONTACT_GIVEN_NAME, ""},
- {E_CONTACT_CSV_WANTS_HTML, E_CONTACT_WANTS_HTML, ""},
- {E_CONTACT_CSV_IS_LIST, E_CONTACT_IS_LIST, ""},
- {E_CONTACT_CSV_LAST, NOMAP, ""}
-
-};
-
-static GSList *pre_defined_fields;
-
-/*function prototypes*/
-gint e_contact_csv_get_contact_field (EContactFieldCSV csv_field);
-gchar *e_contact_csv_get_name (EContactFieldCSV csv_field);
-gchar *e_contact_csv_get (EContact * contact, EContactFieldCSV csv_field);
-gchar *e_contact_csv_get_header_line (GSList * csv_all_fields);
-gchar *e_contact_to_csv (EContact * contact, GSList * csv_all_fields);
-gchar *e_contact_get_csv (EContact * contact, GSList * csv_all_fields);
-gchar *delivery_address_get_sub_field (const EContactAddress * delivery_address, DeliveryAddressField sub_field);
-gchar *check_null_pointer (gchar * orig);
-gchar *escape_string (gchar * orig);
-int output_n_cards_file (FILE * outputfile, GList *contacts, int size, int begin_no, CARD_FORMAT format);
-static void fork_to_background (void);
-void set_pre_defined_field (GSList ** pre_defined_fields);
-guint action_list_cards_init (ActionContext * p_actctx);
-
-
-/* function declarations*/
-gint
-e_contact_csv_get_contact_field (EContactFieldCSV csv_field)
-{
- return csv_field_data[csv_field].contact_field;
-}
-
-gchar *
-e_contact_csv_get_name (EContactFieldCSV csv_field)
-{
- gint contact_field;
- gchar *name;
- gchar *quoted_name;
-
- contact_field = e_contact_csv_get_contact_field (csv_field);
-
- if (contact_field != NOMAP) {
- name = g_strdup (e_contact_field_name (contact_field));
- } else {
- name = g_strdup (csv_field_data[csv_field].csv_name);
- }
- quoted_name = escape_string (name);
- g_free (name);
- return quoted_name;
-}
-
-
-gchar *
-e_contact_csv_get (EContact * contact, EContactFieldCSV csv_field)
-{
- gint contact_field;
- gchar *field_value;
- gchar *quoted_field_value;
-
- EContactAddress *delivery_address = NULL;
- EContactDate *date;
-
- contact_field = e_contact_csv_get_contact_field (csv_field);
-
- if (contact_field != NOMAP) {
- field_value = e_contact_get (contact, contact_field);
- } else {
-
- switch (csv_field) {
- case E_CONTACT_CSV_ADDRESS_HOME_STREET:
- delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_HOME);
- field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_STREET);
- break;
- case E_CONTACT_CSV_ADDRESS_HOME_EXT:
- delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_HOME);
- field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_EXT);
- break;
- case E_CONTACT_CSV_ADDRESS_HOME_CITY:
- delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_HOME);
- field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_LOCALITY);
- break;
- case E_CONTACT_CSV_ADDRESS_HOME_REGION:
- delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_HOME);
- field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_REGION);
- break;
- case E_CONTACT_CSV_ADDRESS_HOME_POSTCODE:
- delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_HOME);
- field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_CODE);
- break;
- case E_CONTACT_CSV_ADDRESS_HOME_COUNTRY:
- delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_HOME);
- field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_COUNTRY);
- break;
- case E_CONTACT_CSV_ADDRESS_BUSINESS_STREET:
- delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_WORK);
- field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_STREET);
- break;
- case E_CONTACT_CSV_ADDRESS_BUSINESS_EXT:
- delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_WORK);
- field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_EXT);
- break;
- case E_CONTACT_CSV_ADDRESS_BUSINESS_CITY:
- delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_WORK);
- field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_LOCALITY);
- break;
- case E_CONTACT_CSV_ADDRESS_BUSINESS_REGION:
- delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_WORK);
- field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_REGION);
- break;
- case E_CONTACT_CSV_ADDRESS_BUSINESS_POSTCODE:
- delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_WORK);
- field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_CODE);
- break;
- case E_CONTACT_CSV_ADDRESS_BUSINESS_COUNTRY:
- delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_WORK);
- field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_COUNTRY);
- break;
- case E_CONTACT_CSV_BIRTH_DATE_YEAR:
- date = e_contact_get (contact, E_CONTACT_BIRTH_DATE);
- if (date) {
- field_value = g_strdup_printf ("%04d", date->year);
- e_contact_date_free (date);
- }
- else {
- field_value = g_strdup ("");
- }
- break;
-
- case E_CONTACT_CSV_BIRTH_DATE_MONTH:
- date = e_contact_get (contact, E_CONTACT_BIRTH_DATE);
- if (date) {
- field_value = g_strdup_printf ("%04d", date->month);
- e_contact_date_free (date);
- }
- else {
- field_value = g_strdup ("");
- }
- break;
-
- case E_CONTACT_CSV_BIRTH_DATE_DAY:
- date = e_contact_get (contact, E_CONTACT_BIRTH_DATE);
- if (date) {
- field_value = g_strdup_printf ("%04d", date->day);
- e_contact_date_free (date);
- }
- else {
- field_value = g_strdup ("");
- }
- break;
-
- default:
- field_value = g_strdup ("");
- }
- }
-
- /*checking to avoid the NULL pointer */
- if (field_value == NULL)
- field_value = g_strdup ("");
-
- quoted_field_value = escape_string (field_value);
- g_free (field_value);
-
- if (delivery_address)
- e_contact_address_free (delivery_address);
-
- return quoted_field_value;
-}
-
-
-gchar *
-e_contact_csv_get_header_line (GSList * csv_all_fields)
-{
-
- guint field_number;
- gint csv_field;
- gchar **field_name_array;
- gchar *header_line;
-
- gint loop_counter;
-
- field_number = g_slist_length (csv_all_fields);
- field_name_array = g_new0 (gchar *, field_number + 1);
-
- for (loop_counter = 0; loop_counter < field_number; loop_counter++) {
- csv_field = GPOINTER_TO_INT (g_slist_nth_data (csv_all_fields, loop_counter));
- *(field_name_array + loop_counter) = e_contact_csv_get_name (csv_field);
- }
-
- header_line = g_strjoinv (COMMA_SEPARATOR, field_name_array);
-
- for (loop_counter = 0; loop_counter < field_number; loop_counter++) {
- g_free (*(field_name_array + loop_counter));
- }
- g_free (field_name_array);
-
- return header_line;
-
-}
-
-
-gchar *
-e_contact_to_csv (EContact * contact, GSList * csv_all_fields)
-{
- guint field_number;
- gint csv_field;
- gchar **field_value_array;
- gchar *aline;
-
- gint loop_counter;
-
- field_number = g_slist_length (csv_all_fields);
- field_value_array = g_new0 (gchar *, field_number + 1);
-
- for (loop_counter = 0; loop_counter < field_number; loop_counter++) {
- csv_field = GPOINTER_TO_INT (g_slist_nth_data (csv_all_fields, loop_counter));
- *(field_value_array + loop_counter) = e_contact_csv_get (contact, csv_field);
- }
-
- aline = g_strjoinv (COMMA_SEPARATOR, field_value_array);
-
- for (loop_counter = 0; loop_counter < field_number; loop_counter++) {
- g_free (*(field_value_array + loop_counter));
- }
- g_free (field_value_array);
-
- return aline;
-
-}
-
-
-gchar *
-e_contact_get_csv (EContact * contact, GSList * csv_all_fields)
-{
- gchar *aline;
-
- aline = e_contact_to_csv (contact, csv_all_fields);
- return aline;
-}
-
-
-gchar *
-check_null_pointer (gchar * orig)
-{
- gchar *result;
- if (orig == NULL)
- result = g_strdup ("");
- else
- result = g_strdup (orig);
- return result;
-}
-
-gchar *
-delivery_address_get_sub_field (const EContactAddress * address, DeliveryAddressField sub_field)
-{
- gchar *sub_field_value;
- gchar *str_temp, *str_temp_a;
- if (address != NULL) {
- switch (sub_field) {
- case DELIVERY_ADDRESS_STREET:
- str_temp_a = check_null_pointer (address->po);
- str_temp = check_null_pointer (address->street);
- sub_field_value = g_strdup_printf ("%s %s", str_temp_a, str_temp);
- g_free (str_temp);
- g_free (str_temp_a);
- break;
- case DELIVERY_ADDRESS_EXT:
- sub_field_value = check_null_pointer (address->ext);
- break;
- case DELIVERY_ADDRESS_LOCALITY:
- sub_field_value = check_null_pointer (address->locality);
- break;
- case DELIVERY_ADDRESS_REGION:
- sub_field_value = check_null_pointer (address->region);
- break;
- case DELIVERY_ADDRESS_CODE:
- sub_field_value = check_null_pointer (address->code);
- break;
- case DELIVERY_ADDRESS_COUNTRY:
- sub_field_value = check_null_pointer (address->country);
- break;
- default:
- sub_field_value = g_strdup ("");
- }
- } else {
- sub_field_value = g_strdup ("");
- }
- return sub_field_value;
-}
-
-gchar *
-escape_string (gchar *orig)
-{
- const guchar *p;
- gchar *dest;
- gchar *q;
-
- if (orig == NULL)
- return g_strdup ("\"\"");
-
- p = (guchar *) orig;
- /* Each source byte needs maximally two destination chars (\n), and the extra 2 is for the leading and trailing '"' */
- q = dest = g_malloc (strlen (orig) * 2 + 1 + 2);
-
- *q++ = '\"';
- while (*p)
- {
- switch (*p)
- {
- case '\n':
- *q++ = '\\';
- *q++ = 'n';
- break;
- case '\r':
- *q++ = '\\';
- *q++ = 'r';
- break;
- case '\\':
- *q++ = '\\';
- *q++ = '\\';
- break;
- case '"':
- *q++ = '"';
- *q++ = '"';
- break;
- default:
- *q++ = *p;
- }
- p++;
- }
-
- *q++ = '\"';
- *q = 0;
-
- return dest;
-}
-
-int
-output_n_cards_file (FILE * outputfile, GList *contacts, int size, int begin_no, CARD_FORMAT format)
-{
- int i;
- if (format == CARD_FORMAT_VCARD) {
- for (i = begin_no; i < size + begin_no; i++) {
- EContact *contact = g_list_nth_data (contacts, i);
- gchar *vcard = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30);
- fprintf (outputfile, "%s\n", vcard);
- g_free (vcard);
- }
- } else if (format == CARD_FORMAT_CSV) {
- gchar *csv_fields_name = e_contact_csv_get_header_line (pre_defined_fields);
- fprintf (outputfile, "%s\n", csv_fields_name);
- g_free (csv_fields_name);
-
- for (i = begin_no; i < size + begin_no; i++) {
- EContact *contact = g_list_nth_data (contacts, i);
- gchar *csv = e_contact_get_csv (contact, pre_defined_fields);
- fprintf (outputfile, "%s\n", csv);
- g_free (csv);
- }
- }
-
- return SUCCESS;
-
-}
-
-static void
-fork_to_background (void)
-{
- pid_t pid;
- pid = fork ();
- if (pid == -1) {
- /* ouch, fork() failed */
- perror ("fork");
- exit (-1);
- } else if (pid == 0) {
- /* child */
- /*contunue */
-
- } else {
- /* parent exit, note the use of _exit() instead of exit() */
- _exit (-1);
- }
-}
-
-
-
-
-static void
-action_list_cards (GList *contacts, ActionContext * p_actctx)
-{
- FILE *outputfile;
- long length;
- int IsFirstOne;
- int series_no;
- gchar *file_series_name;
- CARD_FORMAT format;
- int size;
-
- length = g_list_length (contacts);
-
- if (length <= 0) {
- g_warning ("Couldn't load addressbook correctly!!!! %s####", p_actctx->action_list_cards.addressbook_folder_uri);
- exit (-1);
- }
-
-
- if (p_actctx->action_list_cards.async_mode == FALSE) { /* normal mode */
-
- if (p_actctx->action_list_cards.output_file == NULL) {
- outputfile = stdout;
- } else {
- /* fopen output file */
- if (!(outputfile = fopen (p_actctx->action_list_cards.output_file, "w"))) {
- g_warning (_("Can not open file"));
- exit (-1);
- }
- }
-
- if (p_actctx->action_list_cards.IsVCard == TRUE)
- format = CARD_FORMAT_VCARD;
- else
- format = CARD_FORMAT_CSV;
-
- output_n_cards_file (outputfile, contacts, length, 0, format);
-
- if (p_actctx->action_list_cards.output_file != NULL) {
- fclose (outputfile);
- }
- }
-
-
- /*async mode */
- else {
-
- size = p_actctx->action_list_cards.file_size;
- IsFirstOne = TRUE;
- series_no = 0;
-
- do {
- /* whether it is the last file */
- if ((series_no + 1) * size >= length) { /*last one */
- file_series_name = g_strdup_printf ("%s.end", p_actctx->action_list_cards.output_file);
-
- } else { /*next one */
- file_series_name =
- g_strdup_printf ("%s.%04d", p_actctx->action_list_cards.output_file, series_no);
- }
-
- if (!(outputfile = fopen (file_series_name, "w"))) {
- g_warning (_("Can not open file"));
- exit (-1);
- }
-
-
- if (p_actctx->action_list_cards.IsVCard == TRUE)
- format = CARD_FORMAT_VCARD;
- else
- format = CARD_FORMAT_CSV;
- output_n_cards_file (outputfile, contacts, size, series_no * size, format);
-
- fclose (outputfile);
-
- series_no++;
-
- if (IsFirstOne == TRUE) {
- fork_to_background ();
- IsFirstOne = FALSE;
- }
-
-
- }
- while (series_no * size < length);
- g_free (file_series_name);
- }
-}
-
-void
-set_pre_defined_field (GSList ** pre_defined_fields)
-{
- *pre_defined_fields = NULL;
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_GIVEN_NAME));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_FAMILY_NAME));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_FULL_NAME));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_NICKNAME));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_EMAIL));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_EMAIL_2));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_WANTS_HTML));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_PHONE_BUSINESS));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_PHONE_HOME));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_PHONE_BUSINESS_FAX));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_PHONE_PAGER));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_PHONE_MOBILE));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_HOME_STREET));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_HOME_EXT));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_HOME_CITY));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_HOME_REGION));
- *pre_defined_fields =
- g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_HOME_POSTCODE));
- *pre_defined_fields =
- g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_HOME_COUNTRY));
- *pre_defined_fields =
- g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_BUSINESS_STREET));
- *pre_defined_fields =
- g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_BUSINESS_EXT));
- *pre_defined_fields =
- g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_BUSINESS_CITY));
- *pre_defined_fields =
- g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_BUSINESS_REGION));
- *pre_defined_fields =
- g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_BUSINESS_POSTCODE));
- *pre_defined_fields =
- g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_BUSINESS_COUNTRY));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_TITLE));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_OFFICE));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ORG));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_HOMEPAGE_URL));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_CALENDAR_URI));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_BIRTH_DATE_YEAR));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_BIRTH_DATE_MONTH));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_BIRTH_DATE_DAY));
- *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_NOTE));
-}
-
-guint
-action_list_cards_init (ActionContext * p_actctx)
-{
- EBook *book;
- EBookQuery *query;
- GList *contacts;
-
- if (p_actctx->action_list_cards.addressbook_folder_uri != NULL) {
- book = e_book_new_from_uri (p_actctx->action_list_cards.addressbook_folder_uri, NULL);
- } else {
- book = e_book_new_default_addressbook (NULL);
- }
-
- if (!book
- || !e_book_open (book, TRUE, NULL)) {
- g_warning ("Couldn't load addressbook %s", p_actctx->action_list_cards.addressbook_folder_uri);
- exit (-1);
- }
-
- query = e_book_query_any_field_contains ("");
- e_book_get_contacts (book, query, &contacts, NULL);
- e_book_query_unref (query);
-
- action_list_cards (contacts, p_actctx);
-
- g_list_foreach (contacts, (GFunc)g_object_unref, NULL);
- g_list_free (contacts);
-
- return SUCCESS;
-}
diff --git a/addressbook/tools/evolution-addressbook-export-list-folders.c b/addressbook/tools/evolution-addressbook-export-list-folders.c
deleted file mode 100644
index 78fdca7f9f..0000000000
--- a/addressbook/tools/evolution-addressbook-export-list-folders.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-addressbook-export-list-folders.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Gilbert Fang <gilbert.fang@sun.com>
- *
- */
-
-#include <config.h>
-
-#include <glib.h>
-#include <bonobo-activation/bonobo-activation.h>
-#include <libbonobo.h>
-#include <libgnome/libgnome.h>
-
-#include <libebook/e-book.h>
-
-#include "evolution-addressbook-export.h"
-
-guint
-action_list_folders_init (ActionContext * p_actctx)
-{
- ESourceList *addressbooks = NULL;
- GSList *groups, *group;
- FILE *outputfile = NULL;
-
- if (!e_book_get_addressbooks (&addressbooks, NULL)) {
- g_warning (_("Couldn't get list of addressbooks"));
- exit (-1);
- }
-
- if (p_actctx->action_list_folders.output_file != NULL) {
- if (!(outputfile = fopen (p_actctx->action_list_folders.output_file, "w"))) {
- g_warning (_("Can not open file"));
- exit (-1);
- }
- }
-
- groups = e_source_list_peek_groups (addressbooks);
- for (group = groups; group; group = group->next) {
- ESourceGroup *g = group->data;
- GSList *sources, *source;
-
- sources = e_source_group_peek_sources (g);
- for (source = sources; source; source = source->next) {
- ESource *s = source->data;
- EBook *book;
- EBookQuery *query;
- GList *contacts;
- char *uri;
- const char *name;
-
- book = e_book_new (s, NULL);
- if (!book
- || !e_book_open (book, TRUE, NULL)) {
- g_warning (_("failed to open book"));
- continue;
- }
-
- query = e_book_query_any_field_contains ("");
- e_book_get_contacts (book, query, &contacts, NULL);
- e_book_query_unref (query);
-
- uri = e_source_get_uri (s);
- name = e_source_peek_name (s);
-
- if (outputfile)
- fprintf (outputfile, "\"%s\",\"%s\",%d\n", uri, name, g_list_length (contacts));
- else
- printf ("\"%s\",\"%s\",%d\n", uri, name, g_list_length (contacts));
-
- g_free (uri);
- g_list_foreach (contacts, (GFunc)g_object_unref, NULL);
- g_list_free (contacts);
-
- g_object_unref (book);
- }
- }
-
- if (outputfile)
- fclose (outputfile);
-
- return SUCCESS;
-}
diff --git a/addressbook/tools/evolution-addressbook-export.c b/addressbook/tools/evolution-addressbook-export.c
deleted file mode 100644
index 070436dc0d..0000000000
--- a/addressbook/tools/evolution-addressbook-export.c
+++ /dev/null
@@ -1,160 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-addressbook-export.c
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Gilbert Fang <gilbert.fang@sun.com>
- *
- */
-
-#include <config.h>
-
-#include <glib.h>
-#include <bonobo-activation/bonobo-activation.h>
-#include <bonobo/bonobo-main.h>
-#include <gnome.h>
-
-#include <libebook/e-book.h>
-
-#include "evolution-addressbook-export.h"
-
-int
-main (int argc, char **argv)
-{
- ActionContext actctx;
- GnomeProgram *program;
- poptContext context;
- const gchar **argvn;
-
- int current_action = ACTION_NOTHING;
- int IsCSV = FALSE;
- int IsVCard = FALSE;
-
- /*** popttable */
- char *output_file = NULL;
- int list_folders_mode = FALSE;
- char *output_format = NULL;
- char *addressbook_folder_uri = NULL;
- int async_mode = FALSE;
- int file_size = 0;
-
- struct poptOption options[] = {
- {"output", '\0', POPT_ARG_STRING, &output_file, 0, N_("Specify the output file instead of standard output"),
- N_("OUTPUTFILE")},
- {"list-addressbook-folders", 'l', POPT_ARG_NONE, &list_folders_mode, 0, N_("List local addressbook folders"),
- NULL},
- {"format", '\0', POPT_ARG_STRING, &output_format, 0, N_("Show cards as vcard or csv file"), N_("[vcard|csv]")},
- {"async", 'a', POPT_ARG_NONE, &async_mode, 0, N_("Export in asynchronous mode"), NULL},
- {"size", '\0', POPT_ARG_INT, &file_size, 0,
- N_("The number of cards in one output file in asychronous mode, default size 100."), N_("NUMBER")},
- {NULL, '\0', 0, NULL, 0, NULL, NULL}
- };
- /* popttable end ** */
-
- /*i18n-lize */
- bindtextdomain (GETTEXT_PACKAGE, EVOLUTION_LOCALEDIR);
- bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
- textdomain (GETTEXT_PACKAGE);
-
- program =
- gnome_program_init (PACKAGE, VERSION, GNOME_BONOBO_MODULE, argc, argv, GNOME_PARAM_POPT_TABLE, options,
- GNOME_PARAM_NONE);
-
- /* Parsing Parameter */
- g_object_get (program, "popt-context", &context, NULL);
- argvn = poptGetArgs (context);
- if (!argvn) {
- addressbook_folder_uri = NULL;
- } else { /* there at lease is a one argument, and that should be addressbook folder uri */
- addressbook_folder_uri = g_strdup (*argvn);
- }
- poptFreeContext (context);
-
- if (list_folders_mode != FALSE) {
- current_action = ACTION_LIST_FOLDERS;
- /* check there should not be addressbook-folder-uri , and async and size , output_format */
- if (addressbook_folder_uri != NULL || async_mode != FALSE || output_format != NULL || file_size != 0) {
- g_warning (_("Command line arguments error, please use --help option to see the usage."));
- exit (-1);
- }
- } else {
-
- current_action = ACTION_LIST_CARDS;
-
- /* check the output format */
- if (output_format == NULL) {
- IsVCard = TRUE;
- } else {
- IsCSV = !strcmp (output_format, "csv");
- IsVCard = !strcmp (output_format, "vcard");
- if (IsCSV == FALSE && IsVCard == FALSE) {
- g_warning (_("Only support csv or vcard format."));
- exit (-1);
- }
- }
-
- /*check async and output file */
- if (async_mode == TRUE) {
- /* check have to output file , set default file_size */
- if (output_file == NULL) {
- g_warning (_("In async mode, output must be file."));
- exit (-1);
- }
- if (file_size == 0)
- file_size = DEFAULT_SIZE_NUMBER;
- } else {
- /*check no file_size */
- if (file_size != 0) {
- g_warning (_("In normal mode, there is no need for the size option."));
- exit (-1);
- }
- }
- }
-
- /* do actions */
- if (current_action == ACTION_LIST_FOLDERS) {
- actctx.action_type = current_action;
- if (output_file == NULL) {
- actctx.action_list_folders.output_file = NULL;
- } else {
- actctx.action_list_folders.output_file = g_strdup (output_file);
- }
- action_list_folders_init (&actctx);
- } else if (current_action == ACTION_LIST_CARDS) {
- actctx.action_type = current_action;
- if (output_file == NULL) {
- actctx.action_list_cards.output_file = NULL;
- } else {
- actctx.action_list_cards.output_file = g_strdup (output_file);
- }
- actctx.action_list_cards.IsCSV = IsCSV;
- actctx.action_list_cards.IsVCard = IsVCard;
- actctx.action_list_cards.addressbook_folder_uri = g_strdup (addressbook_folder_uri);
- actctx.action_list_cards.async_mode = async_mode;
- actctx.action_list_cards.file_size = file_size;
-
- action_list_cards_init (&actctx);
-
- } else {
- g_warning (_("Unhandled error"));
- exit (-1);
- }
-
- /*FIXME:should free actctx's some char* field, such as output_file! but since the program will end, so that will not cause mem leak. */
-
- exit (0);
-}
diff --git a/addressbook/tools/evolution-addressbook-export.h b/addressbook/tools/evolution-addressbook-export.h
deleted file mode 100644
index 13749aed61..0000000000
--- a/addressbook/tools/evolution-addressbook-export.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-addressbook-export.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Gilbert Fang <gilbert.fang@sun.com>
- *
- */
-
-#ifndef _EVOLUTION_ADDRESSBOOK_EXPORT_H_
-#define _EVOLUTION_ADDRESSBOOK_EXPORT_H__
-
-#include <glib.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define SUCCESS 0
-#define FAILED -1
-
-#define ACTION_NOTHING 0
-#define ACTION_LIST_FOLDERS 1
-#define ACTION_LIST_CARDS 2
-
-#define DEFAULT_SIZE_NUMBER 100
-
-union _ActionContext
-{
-
- guint action_type;
-
- struct
- {
- gint action_type;
- gchar *output_file;
- }
- action_list_folders;
-
- struct
- {
- gint action_type;
- gchar *output_file;
- gint IsCSV;
- gint IsVCard;
- gchar *addressbook_folder_uri;
- gint async_mode;
- gint file_size;
- }
- action_list_cards;
-};
-
-typedef union _ActionContext ActionContext;
-
-
-/* action_list_folders */
-guint action_list_folders_init (ActionContext * p_actctx);
-
-/*action list cards*/
-guint action_list_cards_init (ActionContext * p_actctx);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _EVOLUTION_ADDRESSBOOK_EXPORT_H_ */
diff --git a/addressbook/tools/evolution-addressbook-import.c b/addressbook/tools/evolution-addressbook-import.c
deleted file mode 100644
index 28871efd96..0000000000
--- a/addressbook/tools/evolution-addressbook-import.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#include <config.h>
-
-#include <bonobo-activation/bonobo-activation.h>
-#include <bonobo/bonobo-main.h>
-#include <backend/ebook/e-book-async.h>
-#include <gnome.h>
-
-static int exec_ref_count = 0;
-
-static void
-ref_executable (void)
-{
- exec_ref_count ++;
-}
-
-static void
-unref_executable (void)
-{
- exec_ref_count --;
- if (exec_ref_count == 0)
- g_main_loop_quit (0);
-}
-
-static void
-add_cb (EBook *book, EBookStatus status, const char *id, gpointer closure)
-{
- switch (status) {
- case E_BOOK_ERROR_OK:
- unref_executable ();
- break;
- default:
- g_main_loop_quit (NULL);
- break;
- }
-}
-
-static void
-use_addressbook (EBook *book, gpointer closure)
-{
- GList *cards, *list;
- char *filename = closure;
-
- if (book == NULL)
- g_error (_("Error loading default addressbook."));
-
- cards = e_card_load_cards_from_file (filename);
-
- ref_executable ();
-
- for (list = cards; list; list = list->next) {
- ref_executable ();
- e_book_add_card (book, list->data, add_cb, closure);
- }
- sync();
-
- unref_executable ();
-}
-
-int
-main (int argc, char *argv[])
-{
- char *filename = NULL;
-
- struct poptOption options[] = {
- { "input-file", '\0', POPT_ARG_STRING, &filename, 0, N_("Input File"), NULL },
- POPT_AUTOHELP
- { NULL, '\0', 0, NULL, 0, NULL, NULL }
- };
-
- bindtextdomain (GETTEXT_PACKAGE, EVOLUTION_LOCALEDIR);
- textdomain (GETTEXT_PACKAGE);
-
- gnome_program_init ("evolution-addressbook-import", VERSION,
- LIBGNOMEUI_MODULE, argc, argv,
- GNOME_PROGRAM_STANDARD_PROPERTIES,
- GNOME_PARAM_POPT_TABLE, options,
- NULL);
-
- if (filename == NULL) {
- g_error (_("No filename provided."));
- }
-
- e_book_async_get_default_addressbook (use_addressbook, filename);
-
- bonobo_main ();
-
- return 0;
-}
diff --git a/addressbook/util/.cvsignore b/addressbook/util/.cvsignore
deleted file mode 100644
index 6205c6f3ab..0000000000
--- a/addressbook/util/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Makefile
-Makefile.in
-eab-marshal.c
-eab-marshal.h
diff --git a/addressbook/util/Makefile.am b/addressbook/util/Makefile.am
deleted file mode 100644
index 7c42f2a73b..0000000000
--- a/addressbook/util/Makefile.am
+++ /dev/null
@@ -1,34 +0,0 @@
-INCLUDES = \
- -DPREFIX=\"$(prefix)\" \
- -DSYSCONFDIR=\"$(sysconfdir)\" \
- -DDATADIR=\"$(datadir)\" \
- -DLIBDIR=\"$(libdir)\" \
- -DG_LOG_DOMAIN=\"EBook\" \
- -I$(top_srcdir) \
- -I$(top_srcdir)/camel \
- -I$(top_builddir)/shell \
- -I$(top_srcdir)/shell \
- $(EVOLUTION_ADDRESSBOOK_CFLAGS)
-
-noinst_LTLIBRARIES = libeabutil.la
-
-libeabutil_la_SOURCES = \
- eab-marshal.c \
- eab-book-util.c \
- eab-book-util.h
-
-libeabutil_la_LIBADD = \
- $(EVOLUTION_ADDRESSBOOK_LIBS) \
- $(top_builddir)/e-util/libeutil.la
-
-MARSHAL_GENERATED = eab-marshal.c eab-marshal.h
-@EVO_MARSHAL_RULE@
-
-BUILT_SOURCES = $(MARSHAL_GENERATED)
-CLEANFILES = $(BUILT_SOURCES)
-
-EXTRA_DIST = \
- eab-marshal.list
-
-dist-hook:
- cd $(distdir); rm -f $(BUILT_SOURCES)
diff --git a/addressbook/util/eab-book-util.c b/addressbook/util/eab-book-util.c
deleted file mode 100644
index 473d386f54..0000000000
--- a/addressbook/util/eab-book-util.c
+++ /dev/null
@@ -1,432 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * eab-util.c
- *
- * Copyright (C) 2001-2003 Ximian, Inc.
- *
- * Authors: Jon Trowbridge <trow@ximian.com>
- * Chris Toshok <toshok@ximian.com>
- */
-
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA.
- */
-
-#include <config.h>
-#include "eab-book-util.h"
-
-#include <string.h>
-#include <glib.h>
-#include <glib-object.h>
-#include <e-util/e-config-listener.h>
-
-EConfigListener *
-eab_get_config_database ()
-{
- static EConfigListener *config_db;
-
- if (config_db == NULL)
- config_db = e_config_listener_new ();
-
- return config_db;
-}
-
-/*
- *
- * Specialized Queries
- *
- */
-
-static char*
-escape (const char *str)
-{
- GString *s = g_string_new ("");
- const char *p = str;
-
- while (*p) {
- if (*p == '\\')
- g_string_append (s, "\\\\");
- else if (*p == '"')
- g_string_append (s, "\\\"");
- else
- g_string_append_c (s, *p);
-
- p ++;
- }
-
- return g_string_free (s, FALSE);
-}
-
-guint
-eab_name_and_email_query (EBook *book,
- const gchar *name,
- const gchar *email,
- EBookListCallback cb,
- gpointer closure)
-{
- gchar *email_query=NULL, *name_query=NULL;
- EBookQuery *query;
- guint tag;
- char *escaped_name, *escaped_email;
-
- g_return_val_if_fail (book && E_IS_BOOK (book), 0);
- g_return_val_if_fail (cb != NULL, 0);
-
- if (name && !*name)
- name = NULL;
- if (email && !*email)
- email = NULL;
-
- if (name == NULL && email == NULL)
- return 0;
-
- escaped_name = name ? escape (name) : NULL;
- escaped_email = email ? escape (email) : NULL;
-
- /* Build our e-mail query.
- * We only query against the username part of the address, to avoid not matching
- * fred@foo.com and fred@mail.foo.com. While their may be namespace collisions
- * in the usernames of everyone out there, it shouldn't be that bad. (Famous last words.)
- * But if name is missing we query against complete email id to avoid matching emails like
- * users@foo.org with users@bar.org
- */
- if (escaped_email) {
- const gchar *t = escaped_email;
- while (*t && *t != '@')
- ++t;
- if (*t == '@' && escaped_name) {
- email_query = g_strdup_printf ("(beginswith \"email\" \"%.*s@\")", (int)(t-escaped_email), escaped_email);
-
- } else {
- email_query = g_strdup_printf ("(beginswith \"email\" \"%s\")", escaped_email);
- }
- }
-
- /* Build our name query.*/
-
- if (escaped_name)
- name_query = g_strdup_printf ("(or (beginswith \"file_as\" \"%s\") (beginswith \"full_name\" \"%s\"))", escaped_name, escaped_name);
-
- /* Assemble our e-mail & name queries */
- if (email_query && name_query) {
- char *full_query = g_strdup_printf ("(and %s %s)", email_query, name_query);
- query = e_book_query_from_string (full_query);
- g_free (full_query);
- }
- else if (email_query) {
- query = e_book_query_from_string (email_query);
- }
- else if (name_query) {
- query = e_book_query_from_string (name_query);
- }
- else
- return 0;
-
- tag = e_book_async_get_contacts (book, query, cb, closure);
-
- g_free (email_query);
- g_free (name_query);
- g_free (escaped_email);
- g_free (escaped_name);
- e_book_query_unref (query);
-
- return tag;
-}
-
-/*
- * Simple nickname query
- */
-guint
-eab_nickname_query (EBook *book,
- const char *nickname,
- EBookListCallback cb,
- gpointer closure)
-{
- EBookQuery *query;
- char *query_string;
- guint retval;
-
- g_return_val_if_fail (E_IS_BOOK (book), 0);
- g_return_val_if_fail (nickname != NULL, 0);
-
- /* The empty-string case shouldn't generate a warning. */
- if (! *nickname)
- return 0;
-
- query_string = g_strdup_printf ("(is \"nickname\" \"%s\")", nickname);
-
- query = e_book_query_from_string (query_string);
-
- retval = e_book_async_get_contacts (book, query, cb, closure);
-
- g_free (query_string);
- g_object_unref (query);
-
- return retval;
-}
-
-/* Copied from camel_strstrcase */
-static char *
-eab_strstrcase (const char *haystack, const char *needle)
-{
- /* find the needle in the haystack neglecting case */
- const char *ptr;
- guint len;
-
- g_return_val_if_fail (haystack != NULL, NULL);
- g_return_val_if_fail (needle != NULL, NULL);
-
- len = strlen (needle);
- if (len > strlen (haystack))
- return NULL;
-
- if (len == 0)
- return (char *) haystack;
-
- for (ptr = haystack; *(ptr + len - 1) != '\0'; ptr++)
- if (!g_ascii_strncasecmp (ptr, needle, len))
- return (char *) ptr;
-
- return NULL;
-}
-
-
-GList*
-eab_contact_list_from_string (const char *str)
-{
- GList *contacts = NULL;
- GString *gstr = g_string_new ("");
- char *str_stripped;
- char *p = (char*)str;
- char *q;
-
- if (!p)
- return NULL;
-
- if (!strncmp (p, "Book: ", 6)) {
- p = strchr (p, '\n');
- if (!p) {
- g_warning (G_STRLOC ": Got book but no newline!");
- return NULL;
- }
- p++;
- }
-
- while (*p) {
- if (*p != '\r') g_string_append_c (gstr, *p);
-
- p++;
- }
-
- q = p = str_stripped = g_string_free (gstr, FALSE);
-
- /* Note: The VCard standard says
- *
- * vcard = "BEGIN" [ws] ":" [ws] "VCARD" [ws] 1*CRLF
- * items *CRLF "END" [ws] ":" [ws] "VCARD"
- *
- * which means we can have whitespace (e.g. "BEGIN : VCARD"). So we're not being
- * fully compliant here, although I'm not sure it matters. The ideal solution
- * would be to have a vcard parsing function that returned the end of the vcard
- * parsed. Arguably, contact list parsing should all be in libebook's e-vcard.c,
- * where we can do proper parsing and validation without code duplication. */
-
- for (p = eab_strstrcase (p, "BEGIN:VCARD"); p; p = eab_strstrcase (q, "\nBEGIN:VCARD")) {
- gchar *card_str;
-
- if (*p == '\n')
- p++;
-
- for (q = eab_strstrcase (p, "END:VCARD"); q; q = eab_strstrcase (q, "END:VCARD")) {
- gchar *temp;
-
- q += 9;
- temp = q;
- temp += strspn (temp, "\r\n\t ");
-
- if (*temp == '\0' || !g_ascii_strncasecmp (temp, "BEGIN:VCARD", 11))
- break; /* Found the outer END:VCARD */
- }
-
- if (!q)
- break;
-
- card_str = g_strndup (p, q - p);
- contacts = g_list_append (contacts, e_contact_new_from_vcard (card_str));
- g_free (card_str);
- }
-
- g_free (str_stripped);
-
- return contacts;
-}
-
-char*
-eab_contact_list_to_string (GList *contacts)
-{
- GString *str = g_string_new ("");
- GList *l;
-
- for (l = contacts; l; l = l->next) {
- EContact *contact = l->data;
- char *vcard_str = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30);
-
- g_string_append (str, vcard_str);
- if (l->next)
- g_string_append (str, "\r\n\r\n");
- }
-
- return g_string_free (str, FALSE);
-}
-
-gboolean
-eab_book_and_contact_list_from_string (const char *str, EBook **book, GList **contacts)
-{
- const char *s0, *s1;
- char *uri;
-
- g_return_val_if_fail (str != NULL, FALSE);
- g_return_val_if_fail (book != NULL, FALSE);
- g_return_val_if_fail (contacts != NULL, FALSE);
-
- *contacts = eab_contact_list_from_string (str);
-
- if (!strncmp (str, "Book: ", 6)) {
- s0 = str + 6;
- s1 = strchr (str, '\r');
-
- if (!s1)
- s1 = strchr (str, '\n');
- } else {
- s0 = NULL;
- s1 = NULL;
- }
-
- if (!s0 || !s1) {
- *book = NULL;
- return FALSE;
- }
-
- uri = g_strndup (s0, s1 - s0);
- *book = e_book_new_from_uri (uri, NULL);
- g_free (uri);
-
- return *book ? TRUE : FALSE;
-}
-
-char *
-eab_book_and_contact_list_to_string (EBook *book, GList *contacts)
-{
- char *s0, *s1;
-
- s0 = eab_contact_list_to_string (contacts);
- if (!s0)
- s0 = g_strdup ("");
-
- if (book)
- s1 = g_strconcat ("Book: ", e_book_get_uri (book), "\r\n", s0, NULL);
- else
- s1 = g_strdup (s0);
-
- g_free (s0);
- return s1;
-}
-
-#if notyet
-/*
- * Convenience routine to check for addresses in the local address book.
- */
-
-typedef struct _HaveAddressInfo HaveAddressInfo;
-struct _HaveAddressInfo {
- gchar *email;
- EBookHaveAddressCallback cb;
- gpointer closure;
-};
-
-static void
-have_address_query_cb (EBook *book, EBookSimpleQueryStatus status, const GList *contacts, gpointer closure)
-{
- HaveAddressInfo *info = (HaveAddressInfo *) closure;
-
- info->cb (book,
- info->email,
- contacts && (status == E_BOOK_ERROR_OK) ? E_CONTACT (contacts->data) : NULL,
- info->closure);
-
- g_free (info->email);
- g_free (info);
-}
-
-static void
-have_address_book_open_cb (EBook *book, gpointer closure)
-{
- HaveAddressInfo *info = (HaveAddressInfo *) closure;
-
- if (book) {
-
- e_book_name_and_email_query (book, NULL, info->email, have_address_query_cb, info);
-
- } else {
-
- info->cb (NULL, info->email, NULL, info->closure);
-
- g_free (info->email);
- g_free (info);
-
- }
-}
-
-void
-eab_query_address_default (const gchar *email,
- EABHaveAddressCallback cb,
- gpointer closure)
-{
- HaveAddressInfo *info;
-
- g_return_if_fail (email != NULL);
- g_return_if_fail (cb != NULL);
-
- info = g_new0 (HaveAddressInfo, 1);
- info->email = g_strdup (email);
- info->cb = cb;
- info->closure = closure;
-
- e_book_use_default_book (have_address_book_open_cb, info);
-}
-#endif
-
-/* bad place for this i know. */
-int
-e_utf8_casefold_collate_len (const gchar *str1, const gchar *str2, int len)
-{
- gchar *s1 = g_utf8_casefold(str1, len);
- gchar *s2 = g_utf8_casefold(str2, len);
- int rv;
-
- rv = g_utf8_collate (s1, s2);
-
- g_free (s1);
- g_free (s2);
-
- return rv;
-}
-
-int
-e_utf8_casefold_collate (const gchar *str1, const gchar *str2)
-{
- return e_utf8_casefold_collate_len (str1, str2, -1);
-}
diff --git a/addressbook/util/eab-book-util.h b/addressbook/util/eab-book-util.h
deleted file mode 100644
index c1362f1571..0000000000
--- a/addressbook/util/eab-book-util.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * e-book-util.h
- *
- * Copyright (C) 2001-2003 Ximian, Inc.
- *
- * Authors: Jon Trowbridge <trow@ximian.com>
- * Chris Toshok <toshok@ximian.com>
- */
-
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA.
- */
-
-#ifndef __EAB_UTIL_H__
-#define __EAB_UTIL_H__
-
-#include <bonobo/bonobo-object.h>
-#include <bonobo/bonobo-moniker-util.h>
-#include <libebook/e-book.h>
-#include "e-util/e-config-listener.h"
-
-G_BEGIN_DECLS
-
-typedef void (*EABHaveAddressCallback) (EBook *book, const gchar *addr, EContact *contact, gpointer closure);
-
-/* config database interface. */
-EConfigListener *eab_get_config_database (void);
-
-/* Specialized Name/Email Queries */
-guint eab_name_and_email_query (EBook *book,
- const char *name,
- const char *email,
- EBookListCallback cb,
- gpointer closure);
-guint eab_nickname_query (EBook *book,
- const char *nickname,
- EBookListCallback cb,
- gpointer closure);
-
-GList *eab_contact_list_from_string (const char *str);
-char *eab_contact_list_to_string (GList *contacts);
-
-gboolean eab_book_and_contact_list_from_string (const char *str, EBook **book, GList **contacts);
-char *eab_book_and_contact_list_to_string (EBook *book, GList *contacts);
-
-/* Returns the EContact associated to email in the callback,
- or NULL if no match is found in the default address book. */
-void eab_query_address_default (const gchar *email,
- EABHaveAddressCallback cb,
- gpointer closure);
-
-int e_utf8_casefold_collate_len (const gchar *str1, const gchar *str2, int len);
-int e_utf8_casefold_collate (const gchar *str1, const gchar *str2);
-
-G_END_DECLS
-
-#endif /* __EAB_UTIL_H__ */
-
diff --git a/addressbook/util/eab-marshal.list b/addressbook/util/eab-marshal.list
deleted file mode 100644
index 680ea039a3..0000000000
--- a/addressbook/util/eab-marshal.list
+++ /dev/null
@@ -1,5 +0,0 @@
-NONE:NONE
-NONE:BOOL
-NONE:POINTER
-NONE:STRING
-NONE:INT
diff --git a/art/.cvsignore b/art/.cvsignore
deleted file mode 100644
index c038ed7864..0000000000
--- a/art/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in \ No newline at end of file
diff --git a/art/16x16/.cvsignore b/art/16x16/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/art/16x16/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/art/16x16/Makefile.am b/art/16x16/Makefile.am
deleted file mode 100644
index 2b5b8ca0fb..0000000000
--- a/art/16x16/Makefile.am
+++ /dev/null
@@ -1,3 +0,0 @@
-images16_DATA =
-
-EXTRA_DIST = $(images16_DATA)
diff --git a/art/48x48/.cvsignore b/art/48x48/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/art/48x48/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/art/48x48/Makefile.am b/art/48x48/Makefile.am
deleted file mode 100644
index be681b0c2e..0000000000
--- a/art/48x48/Makefile.am
+++ /dev/null
@@ -1,3 +0,0 @@
-images48_DATA =
-
-EXTRA_DIST = $(images48_DATA)
diff --git a/art/ChangeLog b/art/ChangeLog
deleted file mode 100644
index e11e991a48..0000000000
--- a/art/ChangeLog
+++ /dev/null
@@ -1,151 +0,0 @@
-2004-05-20 Rodney Dawes <dobey@ximian.com>
-
- * Makefile.am (EXTRA_DIST): Add README and jump.xpm
-
-2004-05-19 Jeffrey Stedfast <fejj@novell.com>
-
- * README: New file explaining how to add icons to the build, etc.
-
- * broken-image-*.xpm: Added for use with e-icon-factory.c so we
- can return a "bropken image" icon for any icon we can't find/load.
-
- * .: Removed many *many* icons that are no longer used.
-
-2004-03-09 Jakub Steiner <jimmac@ximian.com>
-
- * autocompletion.png:
- * Makefile.am: autocompletion icon for the preferences
-
-2004-03-08 Radek Doulik <rodo@ximian.com>
-
- * Makefile.am (images_DATA): added 16 pixels versions of junk
- icons from the gnome-icon-theme module
-
-2004-03-08 Jakub Steiner <jimmac@ximian.com>
-
- * alarm.png
- * briefcase.png
- * cellphone.png
- * envelope.png
- * evolution-calendar.png
- * evolution-notes-mini.png
- * evolution-notes.png
- * evolution-tasks-mini.png
- * evolution-tasks.png
- * evolution-today.png
- * ico-calendar.png
- * im-invisible.png
- * import.png
- * mail-config-druid-identity.png
- * print-preview-24.png
- * print.png
- * schedule-meeting-16.png
- * schedule-meeting-16.xpm
- * schedule-meeting-24.png
- * stock-notjunk-24.png
- * summary-settings.png: since using gnome-icon-theme is miles away, I tried
- bringing the art/ mess a bit up to date. Lots of xpm hell still
- :(
-
-2004-03-08 Jakub Steiner <jimmac@ximian.com>
-
- * im-nov.png: (16x16). closes bug #54972
-
-2004-02-25 Sivaiah Nallagatla <snallagatla@novell.com>
- * Makefile.am : added im-nov.png (icon for Groupwise im)
- to images_DATA
-
-2004-02-03 Jakub Steiner <jimmac@ximian.com>
-
- * im-jabber.png: 16x16 jabber
-
-2004-01-29 Jakub Steiner <jimmac@ximian.com>
-
- * im-aim.png
- * im-icq.png
- * im-msn.png
- * im-yahoo.png: it indeed appears you need 16x16
-
-2004-01-29 Jakub Steiner <jimmac@ximian.com>
-
- * im-aim.png
- * im-icq.png
- * im-msn.png
- * im-yahoo.png: although I'm adding these to gnome-icon-theme
- instead, these are so ugly I replaced them here too. The rest
- of the im-* stuff I'm not quite sure what those represent. Will
- try to redo those as well.
-
- I have 16x16 versions of these in git, so if those are used
- scaled down, as I saw in a screenshot, feel free to use the
- 16x16 versions. They will look better.
-
- Also feel free to file icon requests agains the
- gnome-icon-theme if you want Evolution icons.
-
-2004-01-15 Not Zed <NotZed@Ximian.com>
-
- * Makefile.am (images_DATA): added flag-for-followup-done-16.png
- (glade_DATA): added flag-for-followup-done-48.png
-
-2003-01-11 Christian Hammond <chipx86@gnupdate.org>
-
- * art/im*.png, art/Makefile.am: Added IM png files from Gaim.
-
-2004-01-08 Ross Burton <ross@burtonini.com>
-
- * Makefile.am:
- * videoconf.png:
- Add a video conferencing icon.
-
- * globe.png:
- Replace with the 24x24 version.
-
- Both of these are for the redesigned Collaboration tab in the
- contact editor.
-
-2003-12-04 Radek Doulik <rodo@ximian.com>
-
- * Makefile.am (buttons_DATA): added stock junk button and notjunk
- placeholder (until artists have the right one)
-
-2003-12-02 Rodney Dawes <dobey@ximian.com>
-
- * Makefile.am: Add flag-for-followup-done.xpm to EXTRA_DIST
-
-2003-12-02 Not Zed <NotZed@Ximian.com>
-
- * flag-for-folloup*: Changed the base flag colour to reddish, and
- created a -done set, the original blue-ish colour.
-
-2003-11-12 Jakub Steiner <jimmac@ximian.com>
-
- * about-box.png: replace the foobar file
-
-2003-10-10 Hans Petter Jansson <hpj@ximian.com>
-
- * listview.xpm: Add calendar list view icon.
-
-2003-09-24 Ettore Perazzoli <ettore@ximian.com>
-
- * about-box.png: More artwork from Jakub.
-
-2003-09-24 Ettore Perazzoli <ettore@ximian.com>
-
- * splash.png: New artwork from Jakub.
-
-2003-09-12 Bolian Yin <bolian.yin@sun.com>
-
- * jump.xpm: add icon for the focused jump button.
-
-2003-08-28 Hans Petter Jansson <hpj@ximian.com>
-
- * appointment-reminder.png:
- * appointment-reminder-excl.png: Add icons used by the calendar alarm's
- systray notification. These are also in gnome-icon-theme HEAD, but
- until we have workable stock packages, we use this.
-
-2003-06-23 Jakub Steiner <jimmac@ximian.com>
-
- * splash.png:
- * about-box.png: update Copyright info
diff --git a/art/ChangeLog.pre-1-4 b/art/ChangeLog.pre-1-4
deleted file mode 100644
index 9dec5cedc8..0000000000
--- a/art/ChangeLog.pre-1-4
+++ /dev/null
@@ -1,712 +0,0 @@
-2003-06-02 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (install-data-local) [DEFAULT_BINARY]: Symlink
- evolution.png to evolution-$(BASE_VERSION).png. [#43596]
-
-2003-05-27 Jakub Steiner <jimmac@ximian.com>
-
- * about-box.png, splash.png: Update copyright info
-
-2003-05-21 Ettore Perazzoli <ettore@ximian.com>
-
- * about-box.png, splash.png: New artwork from Jakub.
-
-2003-05-05 Jakub Steiner <jimmac@ximian.com>
-
- * evolution-contacts-plain.png
- * evolution-contacts.png:
- * globe.png:
- * malehead.png:
- * next-message.png:
- * previous-message.png:
- * receive-24.png:
- * reply-to-all.png:
- * reply.png:
- * send-24-receive.png:
- * send-24.png:
- * send-16.png:
- * send-receive.xpm:
- * send.png: quick fix of the artwork, the rest goes to the
- (future) icon theme
-
-2003-04-29 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am (images_DATA): add stock-edit-{16,24}.png
-
-2003-03-03 Ettore Perazzoli <ettore@ximian.com>
-
- * about-box.png: New artwork from Jakub.
-
-2003-02-06 Dan Winship <danw@ximian.com>
-
- * Makefile.am: remove imagesdir, etc, which are now defined in
- configure.in
-
-2003-01-22 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (imagesdir): Version using $(BASE_VERSION).
- (buttonsdir): Likewise.
- (conduitsdir): Likewise.
- (install-data-local): New rule to install evolution.png as
- evolution-$(BASE_VERSION).png.
- (EXTRA_DIST): Add evolution.png.
-
-2003-01-08 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (imagesdir): Install images into
- $(datadir)/evolution/images instead of
- $(datadir)/images/evolution.
- (buttonsdir): Likewise, these go into
- $(datadir)/evolution/images/buttons now.
- (conduits_DATA): Likewise, $(datadir)/evolution/images/conduits.
-
-2002-11-25 Ettore Perazzoli <ettore@ximian.com>
-
- * splash.png: New work-in-progress splash from Jakub.
-
-2002-10-28 Ettore Perazzoli <ettore@ximian.com>
-
- * splash.png: New artwork from Jakub.
- * about-box.png: New artwork from Jakub.
-
-2002-10-28 Ettore Perazzoli <ettore@ximian.com>
-
- * settings.png: New.
- * settings-16.png: New.
-
-2002-10-07 Ettore Perazzoli <ettore@ximian.com>
-
- * splash.png: New artwork from Jakub.
-
-2002-09-27 Dan Winship <danw@ximian.com>
-
- * post-reply-24.png: New icon for "Post a Reply" from Jakub.
-
-2002-02-29 Ettore Perazzoli <ettore@ximian.com>
-
- * about-box.png, splash.png: New artwork from Jakub.
-
-2002-09-03 Ettore Perazzoli <ettore@ximian.com>
-
- * folder-settings.png: New icon from Jakub.
-
-2002-09-03 Jakub Steiner <jimmac@ximian.com>
-
- * ldap-settings.png: use a more gnomeish version
-
-2002-08-01 Ettore Perazzoli <ettore@ximian.com>
-
- * contact-list-16.png: New artwork from Jakub.
- * post-message-16.png: Likewise.
- * meeting-request-16.png: Likewise.
-
- * meeting.xpm: Removed.
-
-2002-07-26 Ettore Perazzoli <ettore@ximian.com>
-
- * mail.png: New icon for mail (gnome-textfile.png from GNOME 2, by
- Tuomas' suggestion).
-
-2002-07-23 Jakub Steiner <jimmac@ximian.com>
-
- * inbox.png,outbox.png: fix the arrows
- * font.png: the former one was vector style - from gorilla
-
-2002-07-22 <jpr@ximian.com>
-
- * Makefile.am: add new image
-
-2002-07-16 Ettore Perazzoli <ettore@ximian.com>
-
- * inbox.png, outbox.png: Added final large versions of the Inbox
- and Outbox icons.
-
-2002-07-09 Dan Winship <danw@ximian.com>
-
- * Makefile.am (images_DATA): add folder.png, folder-mini.png,
- public-folder.png, and public-folder-mini.png
-
- * folder-mini.png: Renamed from local-16.png
-
- * folder.png, public-folder.png, public-folder-mini.png: New, from
- Jakub.
-
-2002-07-09 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (images_DATA): inbox-mini.png instead of
- inbox-16.png, outbox-mini.png instead of outbox-16.png. Also add
- inbox.png and outbox.png.
- (inbox.png): New.
- (outbox.png): New.
-
-2002-05-20 Ettore Perazzoli <ettore@ximian.com>
-
- * schedule-meeting-24.png: New.
-
-2002-04-25 Larry Ewing <lewing@ximian.com>
-
- * Makefile.am (images_DATA): font.png: Add for the font config
- prefs.
-
-2002-04-17 Dan Winship <danw@ximian.com>
-
- * monkey-16.png: Replace with an antialiased version
-
-2002-04-10 Dan Winship <danw@ximian.com>
-
- * Makefile.am (images_DATA), folder-settings.png: Add. (Copied
- from Unscalable Gorilla because it was handy. Will probably get
- changed to something else...)
-
-2002-03-28 Ettore Perazzoli <ettore@ximian.com>
-
- * calendar-and-tasks-settings.png: New.
- * composer-settings.png: New.
- * ldap-settings.png: New.
- * mail-accounts-settings.png: New.
- * summary-settings.png: New.
-
-2002-03-25 Dan Winship <danw@ximian.com>
-
- * Makefile.am (images_DATA): Add working-16.png (the GNOME2 stock
- "wait" icon, from Jakub)
-
-2002-03-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * forward.xpm, reply.xpm, reply_to_all.xpm: Rename the internal
- structure to coincide with the filenames.
-
-2002-02-29 Ettore Perazzoli <ettore@ximian.com>
-
- * about-box.png, splash.png: New cool artwork from Jakub.
-
-2002-02-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * Makefile.am: Remove meeting_widget.png from the build since it
- doesn't seem to be in cvs?
-
-2002-02-20 Jakub Steiner <jimmac@ximian.com>
-
- * summary_preferences-16.png: menu icon for summary preferences
- * Makefile.am: added the icon
-
-2002-02-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * flag-for-followup.xpm:
- * flag-for-followup-16.png:
- * flag-for-followup-48.png: New icons.
-
- * Makefile.am: Added the new icons...
-
-2002-02-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * Makefile.am: Install mail-new.xpm, mail-read.xpm and
- priority-high.xpm in the same place as other bonobo-ui menu
- pixmaps so we can use these in menus too.
-
-2002-02-08 JP Rosevear <jpr@ximian.com>
-
- * connect_to_url-16.xpm: new icon
-
- * new_all_day_event.png: ditto
-
- * Makefile.am: install and dist new images
-
-2001-12-11 Jon Trowbridge <trow@ximian.com>
-
- * mail-need-reply.xpm: A new icon that sucks less. We still need
- some Tuomas-love.
-
-2001-12-09 Jon Trowbridge <trow@ximian.com>
-
- * mail-need-reply.xpm: Added a really, really ugly and
- awful icon to symbolize "message needs a reply".
-
- * Makefile.am (EXTRA_DIST): Added mail-need-reply.xpm.
-
-2001-11-06 Ettore Perazzoli <ettore@ximian.com>
-
- * evolution.png: New, updated icon from Tuomas.
-
-2001-11-05 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am (EXTRA_DIST): dist the glade data
-
-2001-11-01 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (gladedir): New.
- (glade_DATA): Pixmap files required to be installed by the glade
- files.
-
-2001-10-31 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am: Install `evolution.png', not `evolution-icon.png'.
-
- * evolution.png: Renamed from `evolution-icon.png', removing the
- old, now unused `evolution.png'.
-
-2001-10-30 Jakub Steiner <jimmac@ximian.com>
-
- * splash-1-0.png: new style splash
-
-2001-10-23 Tuomas Kuosmanen <tigert@ximian.com>
-
- * splash.png: Remove the "1" from "1.0 Release Candidate 1" so it
- looks better.
-
-2001-10-23 Tuomas Kuosmanen <tigert@ximian.com>
-
- * Makefile.am (appicon_DATA): Changed the filename here too
- so the icon gets installed.
-
- * evolution-icon.png: New icon that scales better.
-
-2001-10-22 Jakub Steiner <jimmac@ximian.com>
-
- * about-box.png: update the layout a bit
- * splash.png: update to 0.17
-
-2001-10-16 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (images_DATA): Add `about-box.png'.
-
- * about-box.png: New image for the about box from Jakub.
-
-2001-10-18 Larry Ewing <lewing@ximian.com>
-
- * Makefile.am (images_DATA): add alarm.png for the new alarm
- notification code.
-
-2001-10-04 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am (images_DATA): change ldap-16.png to ldap-mini.png,
- and add ldap.png.
-
-2001-10-04 Jakub Steiner <jimmac@ximian.com>
-
- * splash.png: bump to 0.16
- * ldap.png: 48x48 version for shortcut bar
-
-2001-09-25 Iain Holmes <iain@ximian.com>
-
- * add task.png
-
-2001-09-21 Iain Holmes <iain@ximian.com>
-
- * remove timezone.png...dunno where it came from.
-
-2001-09-21 Iain Holmes <iain@ximian.com>
-
- * install timezone-16.xpm
-
-2001-09-21 Jakub Steiner <jimmac@ximian.com>
-
- * splash.png: beta4
-
-2001-09-08 Jakub Steiner <jimmac@ximian.com>
-
- * pgp-signature-*: for the pgp signature checking
- * Makefile.am (images_DATA): add the icon files
-
-2001-09-06 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am (images_DATA): add ldap-16.png.
-
-2001-09-05 Jakub Steiner <jimmac@ximian.com>
-
- * meeting-request.png: for the inline .ics stuff
- * Makefile.am (images_DATA): add the icon file
-
-2001-09-04 Jakub Steiner <jimmac@ximian.com>
-
- * timezone-48.png: for the timezone configuration step in the
- first-time-druid
- * Makefile.am (images_DATA): add the icon file
-
-2001-08-20 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: install new file
-
- * talking-heads.png: new graphic for meeting requests
-
-2001-08-20 Damon Chaplin <damon@ximian.com>
-
- * Makefile.am (images_DATA): added goto-16.png & new_task-16.png.
- (buttons_DATA): added save-24.png.
-
-2001-08-20 Damon Chaplin <damon@ximian.com>
-
- * Makefile.am (buttons_DATA): added cut.png, copy.png & paste.png,
- so we can use them for the tasks toolbar.
-
-2001-08-18 Damon Chaplin <damon@ximian.com>
-
- * Makefile.am (images_DATA): added 16_copy.png, 16_customize.png,
- 16_cut.png & 16_paste.png.
- (buttons_DATA): added new_task.png, which I made from scaling up the
- smaller task.xpm icon.
-
-2001-08-18 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (buttons_DATA): Added `delete-message.png'.
-
-2001-08-17 Damon Chaplin <damon@ximian.com>
-
- * Makefile.am (images_DATA): moved task.xpm here, so it gets installed,
- so we can use it for the menus. Note that we don't have an icon to
- use in the toolbar for a new task, and we need one. Jakub?
-
-2001-08-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * wax-seal.png: Added.
-
- * wax-seal-broken.png: Added.
-
-2001-08-17 Jakub Steiner <jimmac@ximian.com>
-
- * splash.png: marketing spoils the fun. boring splash again.
-
-2001-08-17 Jakub Steiner <jimmac@ximian.com>
-
- * splash.png: Ruperzilla splash
-
- * splash-1-0.png: 1.0 candidate
-
-2001-08-16 Jakub Steiner <jimmac@ximian.com>
-
- * {next,previous}-message.png: use new document template. maybe
- still a bit dark.
-
-2001-08-15 Jakub Steiner <jimmac@ximian.com>
-
- * add-attachment.png: get rid of the yellow
-
- * compose-message.png: the old one seemed too dark to me. This one
- shares the same document base as the new stuff.
-
-2001-08-15 Jakub Steiner <jimmac@ximian.com>
-
- * all_contacts.xpm, new_contact.xpm: Nat wanted something bigger
- that would match the new button style. The filename of
- all_contacts.xpm is crap, maybe you guys can fix it to be
- "new_list.xpm" or something. Didn't want to break things.
-
-2001-08-15 Jakub Steiner <jimmac@ximian.com>
-
- * save-16.png, save-as-16.png: fix bottom. Tuomas didn't like too
- much detail.
-
-2001-08-15 Tuomas Kuosmanen <tigert@ximian.com>
-
- * goto-24.png: Icon for "Goto date.." -button. Someone could add
- this into the code?
-
-2001-08-14 Tuomas Kuosmanen <tigert@ximian.com>
-
- * arrow-[left,right]-24.png: new arrow icons for calendar
- toolbar..
-
-2001-08-14 Jakub Steiner <jimmac@ximian.com>
-
- * evolution-today-mini.png: new summary tree view icon.
-
-2001-08-10 Rodrigo Moya <rodrigo@ximian.com>
-
- * 16_category_*: removed these files, which are now in gal
-
-2001-08-09 Tuomas Kuosmanen <tigert@ximian.com>
-
- * send-receive.xpm: Updated this to have the yellow/green arrows
- so it matches the style of other icons. Noticed that tasklist
- scales 16x16 icons larger, so they generally look Bad(tm). (fixes
- #6475)
-
-2001-08-07 Damon Chaplin <damon@ximian.com>
-
- * timezone-16.xpm: copied from the international category icon.
- It would be better to have 2 different icons for these, but I had
- to get rid of that square timezone icon!
-
-2001-08-07 Jakub Steiner <jimmac@ximian.com>
-
- * evolution-trash-mini.png: scaled down Tuomas' trash icon.
- tweaked a bit. looks a lot better than the previous one.
-
-2001-08-07 Jakub Steiner <jimmac@ximian.com>
-
- * inbox-*, outbox-*: tree view icons * filters.xpm, edit-16.xpm,
- marlboro_filters.xpm: remove unused * vfolder-16.xpm,
- delete-message.xpm, undelete-message.xpm: let's not use xpms *
- evolution-trash-mini.png: new version for edit>delete message,
- tree view and everything * undelete_message-16.png,
- folder-move-16.png, open-in-new-window-16.png, folder-copy-16.png:
- tree view icons * faq-16.png, mark-as-important-16.png: menu icons
- * Makefile.am (images_DATA): add new icons, change some xpms to
- pngs
-
-
-2001-08-03 Jakub Steiner <jimmac@ximian.com>
-
- * ldap-16.png, imap-16.png, local-16.png: tree view icons for
- imap, ldap and local folders.
-
-2001-08-02 Jakub Steiner <jimmac@ximian.com>
-
- * myevo-mail-summary.png, myevo-post-it.png, *
- myevo-appointments.png: icons for My Evolution -- mail summary,
- tasks, appointments. These are _NOT_TO_ replace the shortcut
- icons, but solely for My Evolution.
-
-2001-08-02 Tuomas Kuosmanen <tigert@ximian.com>
-
- * receive-24.png: Icon for the send/receive dialog at least.
-
-2001-07-31 Jakub Steiner <jimmac@ximian.com>
-
- * splash.png: beta2 splash
-
-2001-07-31 Tuomas Kuosmanen <tigert@ximian.com>
-
- * send-24-receive.png: New version, looks more consistent with the
- other icons.
-
-2001-07-30 Jakub Steiner <jimmac@ximian.com>
-
- * search-16.png, search-and-replace-16.png: menu versions for
- shell and editor. * properties-16.png: properties for shel
- (maybe other places too) * send-16.png, send-later-16.png:
- editor, shell menu. * work_online-16.png: to accompany work
- online menu toggle. * save-16.png, save-as-16.png:
- everywhere. (based on Tuomas new gnome stock panel icon)
-
-2001-07-27 <tigert@ximian.com>
-
- * new_appointment.[xpm,png]: New version, fixes bug #4704
- hopefully.
-
-2001-07-25 Damon Chaplin <damon@ximian.com>
-
- * Makefile.am (images_DATA): added print-preview-24.png.
-
-2001-07-25 Jakub Steiner <jimmac@ximian.com>
-
- * print-preview-24.png: toolbar icon for calendar's appointment
- dialog (now using the menu version)
-
-2001-07-20 JP Rosevear <jpr@ximian.com>
-
- * Pull in new splash screen
-
-2001-07-20 Rodrigo Moya <rodrigo@ximian.com>
-
- * Makefile.am: install 2 new category icons
- (16_category_suppliers.png and 16_category_time-and-expenses.png)
-
-2001-07-20 <tigert@ximian.com>
-
- * 16_category_time-and-expenses.png: Icon for "Time & Expenses"
- category..
-
- * 16_category_suppliers.png: Icon for "Suppliers" category..
-
- * evolution-calendar.png, evolution-contacts.png,
- evolution-inbox.png, evolution-tasks.png, evolution-today.png:
- Took out the colored background circles from the icons, apparently
- people found them confusing rather than useful, especially on
- small icons -mode of the shortcutbar.
-
-2001-07-19 Rodrigo Moya <rodrigo@ximian.com>
-
- * Makefile.am: install the 2 new category icons
-
-2001-07-19 <tigert@ximian.com>
-
- * 16_category_strategies.png, 16_category_status.png: New category
- icons.
-
-2001-07-19 Jakub Steiner <jimmac@ximian.com>
-
- * insert-link-24.png, insert-table-24.png, insert-image-24.png:
- toolbar icons for message editor.
-
-2001-07-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * Makefile.am: install category icons
-
-2001-07-17 Tuomas Kuosmanen <tigert@ximian.com>
-
- * 16_category_holiday-cards.png 16_category_hot-contacts.png
- 16_category_ideas.png: new category icons..
-
-2001-07-16 Tuomas Kuosmanen <tigert@ximian.com>
-
- * 16_category_favorites.png 16_category_gifts.png
- 16_category_goals.png: New additions for the category stuff..
- still more to do..
-
-2001-07-13 Tuomas Kuosmanen <tigert@ximian.com>
-
- * 16_category_*.png: Some category icons for calendar/tasks, to
- match the different category types for events. Still many to do,
- but I wanted to commit them so you people can start hacking on the
- code already. More to follow shortly.
-
- * 16_customize.png: Icon for "Customize toolbars" or whatever menu
- item that deals with customizing stuff (the icon is a wrench)
-
-2001-07-12 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: extra dist another xpm
-
-2001-07-12 <tigert@ximian.com>
-
- * delete_message.[png,xpm]: New versions for the trashcan icon. I
- am wondering if we should do some filename cleanup here, all menu
- icons should really be 16_foo.png, whereas the toolbar ones should
- be foo.png. Currently we are mixing PNG and XPM here with some
- files having otherwise same names (like this one)..
-
-2001-07-11 <tigert@ximian.com>
-
- * new_appointment.[png,xpm]: New versions
-
-2001-07-10 Tuomas Kuosmanen <tigert@ximian.com>
-
- * new_appointment.png: New appointment icon. *
- new_appointment.xpm: Small version.. (should we change this to
- 16_new_appointment.png btw?
-
-2001-07-09 Iain Holmes <iain@ximian.com>
-
- * Makefile.am: Install the myweather-* icons.
-
-2001-07-07 <tigert@ximian.com>
-
- * 16_[cut,copy,paste].png: New icons for the
- Edit->[Cut,Copy,Paste] entries, the current gnome-stock ones start
- to look bad when scaled down, so these are already 16x16 pixels.
-
-2001-07-05 Jakub Steiner <jimmac@ximian.com>
-
- * myweather-*: weather status icons for My Evolution
-
-2001-07-04 Gediminas Paulauskas <menesis@delfi.lt>
-
- * Makefile.am: install apply-filters-16.xpm
-
-2001-07-03 Tuomas Kuosmanen <tigert@ximian.com>
-
- * cut.png, copy.png, paste.png: icons for cut/copy/paste to fit
- the general style.
-
-2001-07-01 Jakub Steiner <jimmac@ximian.com>
-
- * print.xpm, print-preview.xpm: nat didn't like the jaggy
- version. This one is based on tuomas 48x48 print icon.
-
-2001-06-30 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (buttons_DATA): Add `print.png', `next-message.png',
- `previous-message.png'.
-
-2001-06-29 Jakub Steiner <jimmac@ximian.com>
-
- * remove-nntp-folder-24.png, add-nntp-folder-24.png,
- refresh-nntp-folders-24.png: manage subscriptions toolbar icons
-
-2001-06-29 Tuomas Kuosmanen <tigert@ximian.com>
-
- * print.png: Icon for print message.
-
- * next-message.png, previous-message.png: New icons to replace the
- < > arrows in the mailer.
-
-2001-06-29 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am (images_DATA): add contact-is-a-list.png
-
-2001-06-29 Tuomas Kuosmanen <tigert@ximian.com>
-
- * contact-is-a-list.png: icon for toshok, for contact lists.
-
-2001-06-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * Makefile.am: Install the add-attachment.png icon.
-
-2001-06-27 Tuomas Kuosmanen <tigert@ximian.com>
-
- * evolution-calendar-mini.png: New version of the folder tree's
- calendar icon. Doesnt look too much like the contacts icon.
-
-2001-06-19 Damon Chaplin <damon@ximian.com>
-
- * world_map-960.png: world map picture used for selecting
- timezones. * Makefile.am (images_DATA): added world_map-960.png
- for timezones.
-
-2001-06-14 Jakub Steiner <jimmac@ximian.com>
-
- * apply-filters-16.xpm: for mailer menu. * vfolder-16.xpm:
- vfolder icon for menu items * hand-16.xpm: originally ment for
- customize toolbars. might not work * edit-16.xpm: edit message
- (message open)
-
-2001-06-13 Jakub Steiner <jimmac@ximian.com>
-
- * rdf.png, ico-rdf.png: ximianize those
-
-2001-06-13 Jakub Steiner <jimmac@ximian.com>
-
- * splash-1-0.png: Initial mockup for the final splash. Didn't
- wan't to overwrite the unstable splash.png.
-
-2001-06-07 Iain Holmes <iain@ximian.com>
-
- * empty.gif: es-weather.png es-appointments.png ico-calendar.png
- ico-mail.png ico-rdf.png ico-weather.png bcg.png rdf.png
- pattern.png: Added all these for the new My Evolution
-
-2001-06-04 Jakub Steiner <jimmac@ximian.com>
-
- * timezone-16.xpm: for events in a diffrent timezone
-
-2001-05-22 Jakub Steiner <jimmac@ximian.com>
-
- * evolution-inbox-mini.png: fixed the shadow
-
-2001-05-17 Dan Winship <danw@ximian.com>
-
- * Makefile.am (images_DATA): Install Jakub's new icons
-
-2001-05-16 Jakub Steiner <jimmac@ximian.com>
-
- * mail-config-druid-48.png, mail-config-druid-identity.png,
- mail-config-druid-account-name.png,
- mail-config-druid-receive.png, mail-config-druid-send.png,
- thankyou.png: config druid icons
-
- thankyou.png can be used for the last step in every evo
- druid (like the import one)
-
-2001-05-16 Jakub Steiner <jimmac@ximian.com>
-
- * evolution-calendar.png, evolution-contacts.png,
- evolution-inbox.png, evolution-today.png, evolution-tasks.png:
- fixed bug #2862. Also changed the envelope icon Oh and we use
- #b39169 for calendar now
-
-2001-05-16 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (images_DATA): Added `online.png' and `offline.png'.
-
- * online.png: New icon by Tuomas. * offline.png: New icon by
- Tuomas.
-
-2001-05-14 Duncan Mak <duncan@ximian.com>
-
- * Makefile.am (images_DATA): add in the new find_message.xpm
-
-2001-05-14 Jakub Steiner <jimmac@ximian.com>
-
- * find_message.xpm: Duncan requested this
-
diff --git a/art/Makefile.am b/art/Makefile.am
deleted file mode 100644
index 87bb7ded87..0000000000
--- a/art/Makefile.am
+++ /dev/null
@@ -1,26 +0,0 @@
-images_DATA = \
- about-box.png \
- bcg.png \
- evolution-contacts-mini.png \
- monkey-16.png \
- offline.png \
- online.png \
- world_map-960.png
-
-install-data-local:
- $(mkinstalldirs) $(DESTDIR)$(datadir)/pixmaps
- $(INSTALL_DATA) $(srcdir)/evolution.png $(DESTDIR)$(datadir)/pixmaps/evolution-$(BASE_VERSION).png
-if DEFAULT_BINARY
- cd $(DESTDIR)$(datadir)/pixmaps && rm -f evolution.png && $(LN_S) evolution-$(BASE_VERSION).png evolution.png
-endif
-
-EXTRA_DIST = \
- ChangeLog \
- ChangeLog.pre-1-4 \
- README \
- broken-image-16.xpm \
- broken-image-24.xpm \
- empty.xpm \
- evolution.png \
- jump.xpm \
- $(images_DATA)
diff --git a/art/README b/art/README
deleted file mode 100644
index 9f78332ce1..0000000000
--- a/art/README
+++ /dev/null
@@ -1,46 +0,0 @@
-Evolution Icons
-===============
-
-Licensing
----------
-
-FIXME: add license info here.
-
-
-Adding Icons
-------------
-
-Icons that are meant to someday be themeable MUST be for one or more
-of the following sizes:
-
-- 16x16
-- 18x18
-- 20x20
-- 24x24
-- 32x32
-- 48x48
-
-(the following sizes may also be added for use with window
-decorations: 64x64 and 128x128)
-
-All icons should be named consistantly and be placed within the proper
-subdir that corresponds to their size (if the subdir does not yet
-exist, because no icons have been made for that size - then create the
-subdir and add it to the build as well).
-
-If it is expected that the icon(s) you've created will make it into
-the GNOME icon themes package at some point (or is already there?),
-then you will want to name your icons accordingly so that if the user
-installs a GNOME icons theme package with the appropriate icon(s),
-then he or she will see those icons rather than the ones installed by
-default with Evolution.
-
-The icons within the WWxHH subdirs will ONLY be used if they cnnot be
-found in the theme.
-
-The ONLY image files that may be placed in the toplevel art/ srcdir
-(eg. *this* dir) are xpm files that are built into the Evolution binary
-(or libs) and/or are not meant to be used as "icons".
-
-
--- fejj
diff --git a/art/about-box.png b/art/about-box.png
deleted file mode 100644
index c3613fb4bb..0000000000
--- a/art/about-box.png
+++ /dev/null
Binary files differ
diff --git a/art/bcg.png b/art/bcg.png
deleted file mode 100644
index ec03f8ab6e..0000000000
--- a/art/bcg.png
+++ /dev/null
Binary files differ
diff --git a/art/broken-image-16.xpm b/art/broken-image-16.xpm
deleted file mode 100644
index e96ee1aab0..0000000000
--- a/art/broken-image-16.xpm
+++ /dev/null
@@ -1,61 +0,0 @@
-/* XPM */
-static char * broken_image_16_xpm[] = {
-"16 16 42 1",
-" c None",
-". c #000000",
-"+ c #FEFEFE",
-"@ c #FDFDFD",
-"# c #E0E0E0",
-"$ c #C1C1C1",
-"% c #F1F1F1",
-"& c #C3C3C3",
-"* c #FBFBFB",
-"= c #A8A8A8",
-"- c #ADADAD",
-"; c #767676",
-"> c #5D5D5D",
-", c #404040",
-"' c #F0F0F0",
-") c #E2E2E2",
-"! c #858585",
-"~ c #4B4B49",
-"{ c #161616",
-"] c #EFEFEF",
-"^ c #EEEEEE",
-"/ c #C5C5C5",
-"( c #DF421E",
-"_ c #ECECEC",
-": c #C4C4C4",
-"< c #EBEBEB",
-"[ c #EDEDED",
-"} c #EAEAEA",
-"| c #E8E8E8",
-"1 c #C0C0C0",
-"2 c #E7E7E7",
-"3 c #BFBFBF",
-"4 c #E6E6E6",
-"5 c #E5E5E5",
-"6 c #BEBEBE",
-"7 c #E4E4E4",
-"8 c #BDBDBD",
-"9 c #E3E3E3",
-"0 c #BBBBBB",
-"a c #C2C2C2",
-"b c #BCBCBC",
-"c c #A0A0A0",
-" ......... ",
-" .++++++@#$. ",
-" .+%%%%%%&*=. ",
-" .+%%%%%%-;>,. ",
-" .+%%%%%')!~{. ",
-" .+%]]]]]]^^/. ",
-" .+]]((^((^_:. ",
-" .@^^(((((^<&. ",
-" .@[__(((}}}$. ",
-" .@<|(((((||1. ",
-" .@}}((|((223. ",
-" .@|444444456. ",
-" .@2244455778. ",
-" .@4555779990. ",
-" .a888bb0000c. ",
-" ........... "};
diff --git a/art/broken-image-24.xpm b/art/broken-image-24.xpm
deleted file mode 100644
index ba6cc6854e..0000000000
--- a/art/broken-image-24.xpm
+++ /dev/null
@@ -1,169 +0,0 @@
-/* XPM */
-static char * broken_image_24_xpm[] = {
-"24 24 142 2",
-" c None",
-". c #000000",
-"+ c #D3D3D3",
-"@ c #F6F6F6",
-"# c #FFFFFF",
-"$ c #F9F9F9",
-"% c #DADADA",
-"& c #585858",
-"* c #C7C7C7",
-"= c #D1D1D1",
-"- c #D6D6D6",
-"; c #B2B2B2",
-"> c #D9D9D9",
-", c #D8D8D8",
-"' c #DDDDDD",
-") c #C0C0C0",
-"! c #E1E1E1",
-"~ c #F0F0F0",
-"{ c #9B9B9B",
-"] c #D4D4D4",
-"^ c #FEFEFE",
-"/ c #FDFDFD",
-"( c #FCFCFB",
-"_ c #FBFBFB",
-": c #AFAFAE",
-"< c #E9E9E9",
-"[ c #DFDFDF",
-"} c #8F8F8F",
-"| c #FAFAF9",
-"1 c #F9F9F8",
-"2 c #A4A4A3",
-"3 c #F4F4F4",
-"4 c #CFCFCF",
-"5 c #A2A2A2",
-"6 c #D5D5D5",
-"7 c #F8F8F7",
-"8 c #F8F7F6",
-"9 c #9E9E9E",
-"0 c #F7F6F5",
-"a c #F6F6F4",
-"b c #F4F3F2",
-"c c #DEDDDC",
-"d c #D3D2D0",
-"e c #B7B7B5",
-"f c #9F9E9D",
-"g c #706F6F",
-"h c #65625A",
-"i c #F5F4F3",
-"j c #F2F2F0",
-"k c #E4E4E2",
-"l c #DAD9D7",
-"m c #D8D8D6",
-"n c #E3E3E1",
-"o c #AFAEAC",
-"p c #88847B",
-"q c #D3D2D1",
-"r c #DF421E",
-"s c #F3F3F1",
-"t c #EEEDEB",
-"u c #EDECEA",
-"v c #E9E8E6",
-"w c #EEEEED",
-"x c #C4C3C2",
-"y c #8F8A81",
-"z c #F6F5F4",
-"A c #D0D0CE",
-"B c #ECEBE9",
-"C c #EAE9E7",
-"D c #E5E4E2",
-"E c #D2D1CE",
-"F c #8D887E",
-"G c #CECDCD",
-"H c #F0F0EE",
-"I c #EFEFED",
-"J c #F1F0EE",
-"K c #F0EFED",
-"L c #EFEEEC",
-"M c #E8E7E5",
-"N c #E5E4E1",
-"O c #E4E3E0",
-"P c #E1DFDC",
-"Q c #979288",
-"R c #A49E93",
-"S c #CBCBC9",
-"T c #E7E6E3",
-"U c #E3E2DF",
-"V c #E2E0DD",
-"W c #E0DFDB",
-"X c #A19C90",
-"Y c #EDEDEB",
-"Z c #C9C8C7",
-"` c #EBEAE8",
-" . c #E9E8E5",
-".. c #E6E4E1",
-"+. c #E3E2DE",
-"@. c #DFDEDA",
-"#. c #DDDCD8",
-"$. c #A19B90",
-"%. c #C6C5C3",
-"&. c #E8E7E4",
-"*. c #E7E5E2",
-"=. c #E4E3DF",
-"-. c #DEDDD9",
-";. c #DCDBD7",
-">. c #C3C2C0",
-",. c #E6E5E2",
-"'. c #E5E4E0",
-"). c #E2E1DD",
-"!. c #EDECEB",
-"~. c #D9D7D3",
-"{. c #9F998D",
-"]. c #C1C0BD",
-"^. c #E4E2DF",
-"/. c #E1E0DC",
-"(. c #DDDBD7",
-"_. c #DCDAD6",
-":. c #D8D6D2",
-"<. c #9E988D",
-"[. c #EDEDED",
-"}. c #E1E0DD",
-"|. c #D6D4D2",
-"1. c #EBEBE8",
-"2. c #EAE8E6",
-"3. c #E6E5E3",
-"4. c #F1F1EF",
-"5. c #D7D5D1",
-"6. c #9D978B",
-"7. c #E1DFDB",
-"8. c #E0DEDA",
-"9. c #DEDCD8",
-"0. c #D7D6D1",
-"a. c #D5D3CE",
-"b. c #9B958A",
-"c. c #999891",
-"d. c #A39E92",
-"e. c #A39D92",
-"f. c #A39D91",
-"g. c #A29C90",
-"h. c #A19B8F",
-"i. c #9D978C",
-"j. c #9B968A",
-"k. c #676359",
-" ",
-" . . . . . . . . . . . . . ",
-" . + @ # # # # # # # # $ % & . ",
-" . @ # # # # # # # # # # * = - . ",
-" . # # ; > > > > , > , ' ) ! ~ { . ",
-" . # # ] # # ^ / ( / ( _ : < # [ } . ",
-" . # # > ^ / ( _ | _ | 1 2 ~ # 3 4 5 . ",
-" . # ^ 6 ( _ | 1 7 1 7 8 9 . . . . . . . ",
-" . # ( 6 | 1 7 8 0 8 0 a b c d e f g h . ",
-" . # | + 7 8 0 a i a i b j k l m n o p . ",
-" . # 7 q 0 a i r r b s r r t u v w x y . ",
-" . # z A b b s j r r r r t B C D i E F . ",
-" . # b G j H I J K r r L B M N O I P Q . ",
-" . # b G j H I J r r r r B M N O I P R . ",
-" . # H S I L t r r u u r r T U V L W X . ",
-" . # Y Z B B B ` .` . .N ..+.@.Y #.$.. ",
-" . # ` %.v M &.&.T &.T *.=.+.W -.u ;.$.. ",
-" . # T >.,.,.N ..'...'.=.).W -.;.!.~.{.. ",
-" . $ O ].+.^.=.).+.).+././.-.(._.t :.<.. ",
-" . [.}.|.1.1.u 1.B 1.B ` ` 2. .3.4.5.6.. ",
-" . = 7.8.@.-.W -.8.-.8.9.9._._.:.0.a.b.. ",
-" . c.d.R e.f.e.X g.X g.h.$.{.{.i.i.j.k.. ",
-" . . . . . . . . . . . . . . . . . . ",
-" "};
diff --git a/art/empty.xpm b/art/empty.xpm
deleted file mode 100644
index aca06618b1..0000000000
--- a/art/empty.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static char * empty_xpm[] = {
-"16 16 2 1",
-" c None",
-". c #FFFFFF",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" "};
diff --git a/art/evolution-contacts-mini.png b/art/evolution-contacts-mini.png
deleted file mode 100644
index 5ddb92c1ce..0000000000
--- a/art/evolution-contacts-mini.png
+++ /dev/null
Binary files differ
diff --git a/art/evolution.png b/art/evolution.png
deleted file mode 100644
index 412dcfbbc0..0000000000
--- a/art/evolution.png
+++ /dev/null
Binary files differ
diff --git a/art/jump.xpm b/art/jump.xpm
deleted file mode 100644
index 7c289e738f..0000000000
--- a/art/jump.xpm
+++ /dev/null
@@ -1,30 +0,0 @@
-/* XPM */
-static char * jump_xpm[] = {
-"16 8 3 1",
-" c None",
-". c #000000",
-"+ c #FFFF00",
-"................",
-".++++++++++++++.",
-".++++++++++++++.",
-".++..++..++..++.",
-".++..++..++..++.",
-".++++++++++++++.",
-".++++++++++++++.",
-"................"};
-
-static char * jump_xpm_focused[] = {
-"16 8 3 1",
-" c None",
-". c #0000FF",
-"+ c #FFFF00",
-"................",
-"................",
-"..++++++++++++..",
-"..+..++..++..+..",
-"..+..++..++..+..",
-"..++++++++++++..",
-"................",
-"................"};
-
-
diff --git a/art/monkey-16.png b/art/monkey-16.png
deleted file mode 100644
index 02fb7b6eb5..0000000000
--- a/art/monkey-16.png
+++ /dev/null
Binary files differ
diff --git a/art/offline.png b/art/offline.png
deleted file mode 100644
index 57bdd27be2..0000000000
--- a/art/offline.png
+++ /dev/null
Binary files differ
diff --git a/art/online.png b/art/online.png
deleted file mode 100644
index 9a6a3980c2..0000000000
--- a/art/online.png
+++ /dev/null
Binary files differ
diff --git a/art/world_map-960.png b/art/world_map-960.png
deleted file mode 100644
index 0512d20115..0000000000
--- a/art/world_map-960.png
+++ /dev/null
Binary files differ
diff --git a/autogen.sh b/autogen.sh
deleted file mode 100755
index 4b51a10c76..0000000000
--- a/autogen.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/sh
-# Run this to generate all the initial makefiles, etc.
-
-#!/bin/sh
-# Run this to generate all the initial makefiles, etc.
-
-srcdir=`dirname $0`
-test -z "$srcdir" && srcdir=.
-
-PKG_NAME="Evolution"
-REQUIRED_AUTOMAKE_VERSION=1.6
-
-(test -f $srcdir/configure.in \
- && test -f $srcdir/ChangeLog \
- && test -d $srcdir/shell) || {
- echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
- echo " top-level $PKG_NAME directory"
- exit 1
-}
-
-which gnome-autogen.sh || {
- echo "You need to install gnome-common from the GNOME CVS"
- exit 1
-}
-USE_GNOME2_MACROS=1 . gnome-autogen.sh
diff --git a/calendar/.cvsignore b/calendar/.cvsignore
deleted file mode 100644
index b7f7dea650..0000000000
--- a/calendar/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-Makefile.in
-Makefile
-.deps
-_libs
-.libs
-*.lo
diff --git a/calendar/AUTHORS b/calendar/AUTHORS
deleted file mode 100644
index e4fda3d3bc..0000000000
--- a/calendar/AUTHORS
+++ /dev/null
@@ -1,7 +0,0 @@
-Miguel de Icaza <miguel@kernel.org>
-Federico Mena <federico@helixcode.com>
-Arturo Esponosa <arturo@nuclecu.unam.mx>
-Russell Steinthal <rms39@columbia.edu>
-Rodrigo Moya <rodrigo@ximian.com>
-JP Rosevear <jpr@ximian.com>
-Damon Chaplin <damon@ximian.com>
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
deleted file mode 100644
index 758494861a..0000000000
--- a/calendar/ChangeLog
+++ /dev/null
@@ -1,9349 +0,0 @@
-2005-02-04 Yong Sun <yong.sun@sun.com>
-
- Fix for #56901
-
- * gui/print.c: (bound_text): When the width>maxwidth, the
- pointer 'p' should also be backwarded, same as 'o'.
-
-2005-02-03 Rodney Dawes <dobey@novell.com>
-
- * calendar-errors.xml.h: Update to include new strings from the
- calendar-errors.xml file
-
-2005-02-03 Li Yuan <li.yuan@sun.com>
-
- * gui/dialogs/task-details-page.c: (get_widgets):
- add a11y name to url.
- * gui/dialogs/task-details-page.glade:
- add a11y name to date completed.
- * gui/dialogs/task-page.glade:
- add a11y names to due date and start date.
-
-2005-02-03 Vivek Jain <jvivek@novell.com>
-
- * calendar-errors.xml : added a warning message for invalid server
- version
- * gui/gnome-cal.c (default_client_cal_opened_cb)
- (client_cal_opened_cb): added a case to check the
- call status and display warning
-
-2005-02-02 Rodney Dawes <dobey@novell.com>
-
- * gui/dialogs/alarm-dialog.c (alarm_dialog_run): Set the border width
- for the internal dialog containers to be HIG compliant
-
- * gui/dialogs/alarm-dialog.glade: Remove the separator in the dialog
- and fix some spacing/padding issues to be HIG compliant
-
- * gui/dialogs/alarm-list-dialog.c (alarm_list_dialog_run): Set the
- border width for the internal dialog containers to be HIG compliant
-
- * gui/dialogs/alarm-list-dialog.glade: Remove the separator in the
- dialog and fix some spacing/padding issues to be HIG compliant
-
-2005-02-02 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #72090
-
- * gui/calendar-component.c (impl_handleURI): don't assume the URI is
- always correct.
-
-2005-02-01 Rodney Dawes <dobey@novell.com>
-
- * gui/dialogs/comp-editor.c (setup_widgets): Clean up the spacing
- and padding, and shove the notebook and expander arrow into a vbox
- so that we can be HIG compliant
- (comp_editor_init): Remove the separator from the "dialog" and set
- the border width for the internal dialog widgets appropriately to
- be compliant with the HIG for dialog borders
-
-2005-02-01 JP Rosevear <jpr@novell.com>
-
- * gui/e-tasks.c (e_tasks_destroy): fix typo
-
- * gui/gnome-cal.c (gnome_calendar_destroy): ditto
-
-2005-02-01 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-cal-menu.c (e_cal_menu_target_new_select):
- * gui/e-cal-popup.c (e_cal_popup_target_new_select): add correct mask
- for detached recurrences.
-
-2005-02-01 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/calendar-commands.c
- (calendar_control_sensitize_calendar_commands): only add real data
- to the array.
-
-2005-02-01 JP Rosevear <jpr@novell.com>
-
- Fixes #71944
-
- * gui/e-tasks.c: declare config_categories_changed_cb before its
- used
-
-2005-01-31 Hans Petter Jansson <hpj@novell.com>
-
- * common/Makefile.am (libevolution_calendarprivate_la_LDFLAGS):
- Remove the -module flag, this isn't supposed to be a module.
-
-2005-01-31 Hans Petter Jansson <hpj@novell.com>
-
- * idl/evolution-calendar.idl: Remove definition of CalObjUID and
- include that from Evolution-DataServer-Calendar.idl instead. This
- prevents the typecode from being defined twice.
-
-2005-01-31 Hans Petter Jansson <hpj@novell.com>
-
- * gui/e-cal-config.c (_ECalConfigPrivate): Use guint instead of ulong
- for signal ID.
-
-2005-01-31 Priit Laes <amd@tt.ee>
-
- Fixes #61078
-
- * gui/dialogs/task-page.glade: use consistent style for markup.
-
-2005-01-31 Chenthill Palanisamy <pchenthill@novell.com>
-
- Fixes #64682
- * gui/e-calendar-view.c: (transfer_item_to): Added an
- X property to identify if the appointment is moved from
- another calendar.
-
-2005-01-28 JP Rosevear <jpr@novell.com>
-
- Fixes #71452
-
- * gui/dialogs/comp-editor.c (setup_widgets): listen for
- delete_event signal and handle it outside of the response signal
- so that cancel works properly
-
-2005-01-28 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-tasks.c (setup_widgets):
- * gui/gnome-cal.c (setup_widgets): use correct key name.
-
-2005-01-28 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #33078
-
- * gui/gnome-cal.c: deal now with categories entirely here, no more
- "categories_changed" signal from the backends.
- (free_categories, add_categories, append_category_cb,
- client_categories_changed_cb, copy_categories): removed.
- (gnome_calendar_add_source): don't connect to removed signal.
- (gnome_calendar_destroy): destroy the config listener.
- (gnome_calendar_init): create a listener for the categories list
- GConf key.
- (config_categories_changed_cb): callback for configuration changes
- in category list.
- (setup_widgets): initialize the search bar with categories from
- the configuration.
-
- * gui/e-tasks.c (client_categories_changed_cb, e_tasks_add_todo_source,
- e_tasks_init, config_categories_changed_cb, e_tasks_destroy,
- setup_widgets): same as gnome-cal.c.
-
-2005-01-26 JP Rosevear <jpr@novell.com>
-
- Fixes #71485
-
- * calendar-errors.xml: fix paste-o
-
-2005-01-27 Harry Lu <harry.lu@sun.com>
-
- Fix a runtime invalid cast warning.
-
- * gui/e-calendar-table.c: (e_calendar_table_init): only set
- a11y name if atk is enabled.
-
-2005-01-26 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/dialogs/recurrence-page.c (sensitize_buttons): objects returned
- from e_cal_get_objects_for_uid are ECalComponent's, so use
- g_object_unref to free them, not icalcomponent_free.
-
-2005-01-26 Li Yuan <li.yuan@sun.com>
-
- * gui/dialogs/cal-prefs-dialog.glade:
- use full name for the weekday checkbox.
-
- Fixes #71729.
-
-
-2005-01-26 JP Rosevear <jpr@novell.com>
-
- * gui/itip-utils.c (itip_send_comp): make sure we free the user
- list
-
-2005-01-25 Li Yuan <li.yuan@sun.com>
-
- * gui/e-calendar-table.c: (e_calendar_table_init):
- add a11y name to task table.
-
-2005-01-24 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/dialogs/recurrence-page.c (sensitize_buttons): if there are
- detached instances, disable recurrence date widgets.
-
-2005-01-21 JP Rosevear <jpr@novell.com>
-
- Fixes #46404
-
- * gui/tasks-control.c (tasks_control_print_cmd): just call print
- tasks, we don't do the dialog here
-
- * gui/print.h: update protos
-
- * gui/print.c (print_calendar): use e_print routines for config
- and dialog and make copies and range settings properly available
- (print_comp): ditto
- (print_table): bring up dialog here so that printing for calendar
- list view works correctly
-
- * gui/calendar-commands.c (print): pass extra params to print
- table
-
-2005-01-19 Rodrigo Moya <rodrigo@novell.com>
-
- * importers/icalendar-importer.c (update_objects): use receive_objects
- method instead of individually updating objects. Set the method on the
- VCALENDAR object we create.
-
-2005-01-18 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #71407
-
- * gui/e-week-view.c (process_component): killed warnings.
- (e_week_view_start_editing_event): do nothing if the calendar is
- read only.
-
- * gui/e-day-view.c (e_day_view_start_editing_event): ditto.
-
-2005-01-18 Harish Krishnaswamy <kharish@novell.com>
-
- * gui/dialogs/cal-attachment-bar.c
- (cal_attachment_bar_get_attachment_list): handle error conditions more
- gracefully.
-
-2005-01-17 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/calendar-component.c:
- * gui/calendar-offline-handler.c:
- * gui/comp-editor-factory.c:
- * gui/e-tasks.c:
- * gui/gnome-cal.c:
- * gui/misc.c:
- * gui/alarm-notify/alarm-notify.c: use libedataserver's e-url.
-
-2005-01-17 Nat Friedman <nat@novell.com>
-
- * gui/dialogs/url-editor-dialog.glade: Changed the title for the
- free/busy publishing settings dialog to "Free/Busy Publishing
- Settings" (away from "Free/Busy Editor" which made no sense).
-
-2005-01-17 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-calendar-view.c (on_unrecur_appointment): removed the
- e_day_view_... prefix in warning messages.
-
-2005-01-17 Harish Krishnaswamy <kharish@novell.com>
-
- * gui/dialogs/cal-attachment-bar.c (destroy):
- fixed a kludge.
-
-2005-01-12 JP Rosevear <jpr@novell.com>
-
- Fixes #65820
-
- * gui/weekday-picker.c (get_day_text): add translator comment
-
-2005-01-08 Not Zed <NotZed@Ximian.com>
-
- * gui/e-day-view.c (e_day_view_finish_resize): set
- last_Edited_comp_string to NULL, not test it for null.
-
-2005-01-12 Harish Krishnaswamy <kharish@novell.com>
-
- * gui/dialogs/cal-attachment-bar.c:
- (cal_attachment_bar_set_attachment_list):
- reverting the offset 'hyphen' fix - not required anymore.
-
-2005-01-10 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-day-view.c (e_day_view_on_editing_stopped): remove the
- temporary object from the view when stopping editing.
-
- * gui/e-week-view.c (e_week_view_on_editing_stopped): ditto.
-
-2005-01-10 Harish Krishnaswamy <kharish@novell.com>
-
- * gui/dialogs/cal-attachment-bar.c:
- (cal_attachment_bar_set_attachment_list):
- offset the file name to account for the 'hyphen'.
-
-2005-01-10 Chenthill Palanisamy <pchenthill@novell.com>
-
- * gui/dialogs/event-page.glade
- * gui/dialogs/task-page.glade: Showed the send options
- button and label. Hided the Send options Frame.
-
-2005-01-10 Harish Krishnaswamy <kharish@novell.com>
-
- * gui/dialogs/cal-attachment-bar.[ch]: (destroy), (init),
- (cal_attachment_bar_set_local_attachment_store),
- (cal_attachment_bar_get_attachment_list),
- (cal_attachment_bar_get_nth_attachment_filename),
- (cal_attachment_bar_set_attachment_list):
- Modified cal-attachment-bar to allow the path to
- the local attachment store be set externally, thereby
- hiding the storage policy of different backends from it.
- * gui/dialogs/comp-editor.c: (real_edit_comp):
- set the local attachment store after obtaining it from
- the calendar.
-
-2005-01-09 JP Rosevear <jpr@novell.com>
-
- * gui/calendar-component.c (impl_handleURI): handle calendar://
- uris
-
-2005-01-07 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/event-editor.c (event_editor_edit_comp): clear the
- attendees, somehow I remove this in an earlier commit
-
-2005-01-07 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/dialogs/event-page.glade:
- * gui/dialogs/task-page.glade: put a name to the 'Send options' frame.
-
- * gui/dialogs/event-page.c (event_page_init): initialize reference to
- the 'Send options' frame.
- (get_widgets): get the 'Send options' frame from the .glade file.
- (event_page_hide_options): just hide the frame.
- (event_page_show_options): just show the frame.
-
- * gui/dialogs/task-page.c (task_page_init): initialize reference to the
- 'Send options' frame.
- (get_widgets): get the 'Send options' frame from the .glade file.
- (task_page_hide_options): just hide the frame.
- (task_page_show_options): just show the frame.
-
-2005-01-06 David Trowbridge <trowbrds@cs.colorado.edu>
-
- * gui/e-cal-event[hc]: initial import of ECalEvent targets
-
- * gui/migration.c (migrate_calendars): add component.migration event
-
-2005-01-06 JP Rosevear <jpr@novell.com>
-
- * gui/Makefile.am: install schemas properly
-
-2005-01-06 Chenthill Palanisamy <pchenthill@novell.com>
-
- merging send options
- * gui/dialogs/Makefile.am: Added two new files for send options.
- * gui/dialogs/e-send-options-utils.{ch}:
- (e_sendoptions_utils_set_default_data),
- (e_sendoptions_utils_fill_component): For setting and gettings the
- send options.
- * gui/dialogs/event-editor.c (event_editor_construct): Check for the static
- capabilities before showing send options.
- * gui/dialogs/event-page.c: (event_page_show_options),
- (event_page_fill_component), (e_sendoptions_clicked_cb):
- * gui/dialogs/event-page.glade:
- * gui/dialogs/event-page.h: Added function to show/hide the send options button
- and label and run the send options dialog.
- * gui/dialogs/task-editor.c: (task_editor_construct),
- (task_editor_edit_comp):
- * gui/dialogs/task-page.c: (task_page_init), (task_page_finalize),
- (sensitize_widgets), (task_page_hide_options),
- (task_page_show_options), (task_page_fill_widgets),
- (task_page_fill_component), (get_widgets), (source_changed_cb),
- (e_sendoptions_clicked_cb), (init_widgets): Same as event-page.
- * gui/dialogs/task-page.glade: Added the send options button
- * gui/dialogs/task-page.h: Added functions hiding and showing send
- options button
-
-2005-01-05 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-day-view.c (e_day_view_find_event_from_uid): added a new
- argument to pass the calendar client, since it might happen to have
- events with the same UID on different calendars.
- (e_day_view_do_key_press, model_rows_deleted_cb): added new argument
- to e_day_view_find_event_from_uid.
-
- * gui/e-week-view.c (e_week_view_find_event_from_uid): same as
- e-day-view.c.
- (e_week_view_do_key_press, model_rows_deleted_cb): added new argument
- to e_week_view_find_event_from_uid.
-
-2005-01-04 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-cal-component-preview.c (write_html): use the new e-categories
- API in e-d-s.
-
-2005-01-04 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-week-view.c (model_rows_deleted_cb): search our internal data
- for the correct event.
-
-2005-01-04 Harry Lu <harry.lu@sun.com>
-
- * gui/calendar-component.c: (create_component_view): add a11y name
- to calendar sidebar selector.
- * gui/tasks-component.c: (create_component_view): add a11y name
- to task sidebar selector.
-
-2005-01-03 JP Rosevear <jpr@novell.com>
-
- Fixes #69663
-
- * gui/e-cal-model-tasks.c (is_complete): look at the percent
- complete and status properties as well for completeness clues
-
-2005-01-03 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-cal-model.c (e_cal_model_set_time_range): redo the queries
- after emitting the 'time_range_changed' signal, since now the
- views will only update their internal data but not redraw the
- events on that signal.
-
- * gui/e-day-view.c (model_changed_cb): removed, no longer needed.
- (e_day_view_recalc_day_starts): no need to call e_day_view_update_query.
- (e_day_view_init): no need to connect to 'model_changed' signal
- on the model, we already connect to the row/cell_changed ones.
-
- * gui/e-week-view.c (time_range_changed_cb): no need to call
- e_week_view_update_query.
- (model_changed_cb): removed, no longer needed.
- (e_week_view_init): no need to connect to 'model_changed' signal
- on the model, we already connect to the row/cell_changed ones.
-
-2004-12-31 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/schedule-page.c: add necessary include
-
- * gui/dialogs/meeting-page.c (sensitize_widgets): kill warning
-
- * gui/dialogs/cal-prefs-dialog.c (template_url_changed): kill warning
-
- * gui/dialogs/alarm-dialog.c (malarm_widgets_to_alarm): kill warnings
- (init_widgets): ditto
-
- * gui/main.c (initialize): no need to init the config system now
-
- * gui/e-cell-date-edit-config.h: include date edit text header
-
- * gui/e-cal-config.c (ecp_target_free): kill warning
-
- * gui/calendar-config.c: clean up includes, internally initialize
- the config setup to make it easier for others; kill dead functions
-
-2004-12-26 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-cal-model.c (search_by_uid_and_client): removed superfluous if
- check.
- (e_cal_view_objects_modified_cb): add all objects at once.
-
- * gui/e-day-view.c (e_day_view_remove_event_cb): set fields we
- free to NULL.
-
-2004-12-24 Harish Krishnaswamy <kharish@novell.com>
-
- * gui/dialogs/event-editor.c (event_editor_edit_comp):
- Check for the existence of the meet/sched pages before
- attempting to remove them.
-
-2004-12-23 Chenthill Palanisamy <pchenthill@novell.com>
-
- Part of merge from offline branch
-
- * gui/dialogs/calendar-setup.c
- (eccp_general_offline): function to add the check box for
- folder offline settings.
- (offline_status_changed_cb): call back function for the same.
- (ECalConfigItem eccp_items[]), (ECalConfigItem ectp_items[]):
- Added the check box function call in both the structures.
-
-2004-12-23 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-cal-model.c (set_instance_times): get instance times using
- the correct timezone.
- (redo_queries): emit signals before clearing the array.
-
- * gui/e-day-view.c (process_component):
- * gui/e-week-view.c (process_component): no need to try to update,
- always add.
-
-2004-12-23 Hans Petter Jansson <hpj@novell.com>
-
- * gui/e-select-names-editable.c: Correct bad include.
-
- * gui/dialogs/Makefile.am (IDL_GENERATED_H)
- (IDL_GENERATED)
- (BUILT_SOURCES): No longer needed, removed.
-
-2004-12-22 Hans Petter Jansson <hpj@novell.com>
-
- * gui/Makefile.am (IDLS)
- (SELECT_NAMES_IDL_GENERATED_H)
- (SELECT_NAMES_IDL_GENERATED_C)
- (SELECT_NAMES_IDL_GENERATED)
- (IDL_GENERATED): Remove the addressbook IDL.
-
- * gui/e-meeting-list-view.c (e_meeting_list_finalize)
- (add_section)
- (e_meeting_list_view_init)
- (process_section)
- (name_selector_dialog_close_cb)
- (get_select_name_dialog): Adapt to new ENameSelector.
-
- * gui/e-select-names-editable.c (esne_start_editing)
- (esne_finalize)
- (esne_init)
- (e_select_names_editable_get_type)
- (entry_activate)
- (e_select_names_editable_construct)
- (e_select_names_editable_get_address)
- (e_select_names_editable_get_name)
- (e_select_names_editable_set_address): Adapt to new ENameSelector.
-
- * gui/e-select-names-renderer.c (e_select_names_renderer_editing_done)
- (e_select_names_renderer_activated)
- (e_select_names_renderer_start_editing): Adapt to new ENameSelector.
-
- * gui/dialogs/alarm-dialog.c (malarm_widgets_to_alarm)
- (addressbook_clicked_cb)
- (addressbook_response_cb)
- (setup_select_names)
- (check_custom_email)
- (malarm_addresses_changed_cb): Adapt to new ENameSelector.
-
- * gui/dialogs/e-delegate-dialog.c (e_delegate_dialog_finalize)
- (e_delegate_dialog_construct)
- (addressbook_clicked_cb)
- (addressbook_response_cb)
- (e_delegate_dialog_get_delegate)
- (e_delegate_dialog_get_delegate_name): Adapt to new ENameSelector.
-
-2004-12-22 JP Rosevear <jpr@novell.com>
-
- * gui/e-meeting-store.c (freebusy_async): prevent compare against
- null default_fb_uri and fix thinko
-
-2004-12-22 JP Rosevear <jpr@novell.com>
-
- * gui/e-cal-model.c: Change copyright from ximian to novell
-
-2004-12-17 Not Zed <NotZed@Ximian.com>
-
- * gui/e-calendar-table.c (e_calendar_table_show_popup_menu):
-
- * gui/tasks-component.c (popup_event_cb):
-
- * gui/gnome-cal.c (gnome_calendar_view_popup_factory):
-
- * gui/e-calendar-view.c (e_calendar_view_create_popup_menu):
-
- * gui/alarm-notify/alarm-queue.c (tray_icon_clicked_cb):
-
- * gui/dialogs/meeting-page.c (button_press_event):
-
- * gui/calendar-component.c (popup_event_cb):
-
-2004-12-22 JP Rosevear <jpr@novell.com>
-
- Fixes #61077
-
- * gui/dialogs/task-details-page.glade: remove extraneous tab
-
- * gui/dialogs/alarm-dialog.c: ditto
-
-2004-12-22 JP Rosevear <jpr@novell.com>
-
- Fixes #61076
-
- * gui/comp-editor-factory.c (open_client): don't translate command
- line warnings
-
- * gui/calendar-offline-handler.c (backend_go_online): ditto
- (backend_go_offline): ditto
-
-2004-12-21 JP Rosevear <jpr@novell.com>
-
- Fixes #41624
-
- * conduits/calendar/calendar-conduit.c (local_record_from_comp):
- append the exceptions, don't keep overwriting the first
-
-2004-12-21 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-cal-model.c (set_instance_times): no need to convert times now.
- (add_instance_cb): no need to convert here.
-
-2004-12-21 Rodrigo Moya <rodrigo@novell.com>
-
- Merge from recurrences-work-branch
-
- * gui/e-cal-model.c (free_comp_data): renamed to
- e_cal_model_free_component_data and made it public.
- (clear_objects_array, e_cal_view_objects_removed_cb,
- remove_client_objects): use e_cal_model_free_component_data.
- (get_dtstart): get the DTSTART correctly for recurrences.
- (add_instance_cb): initialize all members of ECalModelComponent, and
- use the correct icalcomponent when setting the field.
- (set_instance_times): new function to set the instance_* fields of
- the ECalModelComponent when not expanding recurrences.
- (e_cal_view_objects_added_cb): expand recurrences for all objects when
- the model is set to expand. Call set_instance_times when not
- expanding recurrences.
- (e_cal_view_objects_modified_cb): made it remove objects and re-add
- them.
- (copy_ecdv): check values before using them.
- (e_cal_model_copy_component_data): Added code to copy the instance_* and
- color fields.
-
- * gui/e-cal-model-calendar.c (get_dtend): get the DTEND correctly for
- recurrences.
- (ecmc_set_value_at): ask user which instances to modify.
-
- * gui/e-day-view.c (e_day_view_find_event_from_uid): changed to search
- by UID and RID if given.
- (process_component): changed to not expand recurrences at all, this is
- now done on the model.
- (row_deleted_check_cb, remove_uid_cb): removed these functions.
- (model_rows_deleted_cb): changed to just remove the rows signalled from
- the model, which is the responsible for the recurrence expansion.
- (e_day_view_new): set the model to expand recurrences.
- (e_day_view_remove_event_cb): check the value searched in the array.
- (e_day_view_do_key_press): use e_day_view_find_event_from_uid correctly.
-
- * gui/e-week-view.c (e_week_view_find_event_from_uid): changed to search
- by UID and RID if given.
- (process_component_recur_cb): removed.
- (process_component): changed to not expand recurrences at all, this is
- now done on the model.
- (row_deleted_check_cb, remove_uid_cb): removed these functions.
- (model_rows_deleted_cb): changed to just remove the rows signalled from
- the model, which is the responsible for the recurrence expansion.
- (e_week_view_new): set the model to expand recurrences.
- (e_week_view_remove_event_cb): check the value searched in the array.
- Set the ECalModelComponent field to NULL after freeing it.
- (e_week_view_do_key_press): use e_week_view_find_event_from_uid
- correctly.
-
- * gui/dialogs/recur-comp.c (recur_component_dialog): remove the
- RECURRENCE-ID from the object when modifying all instances.
-
-2004-12-18 James Bowes <bowes@cs.dal.ca>
-
- * gui/apps_evolution_calendar.schemas.in.in: Add schema for Free/Busy
- template uri.
- * gui/calendar-config-keys.h:
- * gui/calendar-config.c: (calendar_config_get_free_busy_template),
- (calendar_config_set_free_busy_template),
- (calendar_config_add_notification_free_busy_template):
- * gui/calendar-config.h: Functions to get, set and monitor the
- Free/Busy template uri gconf setting.
- * gui/dialogs/cal-prefs-dialog.c: (template_url_changed),
- (setup_changes), (get_widgets), (show_fb_config):
- * gui/dialogs/cal-prefs-dialog.glade:
- * gui/dialogs/cal-prefs-dialog.h: Change 'Free/Busy Publish' tab to
- 'Free/Busy'. Add an entry for setting the default Free/Busy uri.
- Only change the gconf setting on 'focus out' event
- * gui/e-meeting-store.c: (refresh_queue_remove): Check the hash using
- the attendee's mailto: address, rather than the memory address of the
- attendee object as the key.
- (e_meeting_store_get_fb_uri), (e_meeting_store_set_fb_uri): Get and set
- the EMeetingStore's Free/Busy template string.
- (process_callbacks_main_thread), (process_callbacks): Process callbacks
- in the main thread, so that widgets can be redrawn properly.
- (replace_string): Utility function for replacing wildcards in the
- default Free/Busy uri.
- (ems_finalize), (ems_init), (freebusy_async), (refresh_busy_periods),
- (refresh_queue_add), (e_meeting_store_refresh_busy_periods): Add the
- ability to check for Free/Busy information from a default location,
- if all else fails.
- (start_async_read): Use gnome-vfs to read the Free/Busy information.
- * gui/e-meeting-store.h: Add function prototypes for get and set fb_uri
- * gui/e-meeting-time-sel.c: (e_meeting_time_selector_init),
- (e_meeting_time_selector_destroy), (free_busy_timeout_refresh),
- (free_busy_template_changed_cb): Watch for a change in the Free/Busy
- template gconf setting, and check for new Free/Busy data if it occurs.
- * gui/e-meeting-time-sel.h: Include variable for notification function
- id on changes to the Free/Busy uri in the EMeetingTimeSelector .
-
-2004-12-17 Rodney Dawes <dobey@novell.com>
-
- * gui/alarm-notify/alarm-notify-dialog.c (an_minutes_update_label):
- Add callback function for doing ngettext on the "minutes" label
- (alarm_notify_dialog): Get the "minutes" label from the glade file
- and set the callback for its "value_changed" signal
-
- Fixes #47535
-
-2004-12-13 Harish Krishnaswamy <kharish@novell.com>
-
- * gui/dialogs/calendar-setup.c : Correct some white space
- ugliness in the previous commit.
-
-2004-12-13 Vivek Jain <jvivek@novell.com>
-
- * gui/dialogs/calendar-setup.c : Changed the window title based upon
- the source.
-
-2003-12-09 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-calendar-view.c (on_unrecur_appointment): keep a local copy
- of the ECal.
-
-2004-12-08 Hans Petter Jansson <hpj@novell.com>
-
- * gui/e-meeting-list-view.c
- * gui/e-select-names-editable.c
- * gui/dialogs/alarm-dialog.c
- * gui/dialogs/e-delegate-dialog.c: Include <libebook/e-destination.h>
- from evolution-data-server.
-
-2004-12-08 Harish Krishnaswamy <kharish@novell.com>
-
- * gui/e-week.c (time_range_changed_cb, e_week_view_set_first_day_shown):
- update the query so currently held events can be cleared off.
-
-2004-12-08 David Mosberger <davidm@napali.hpl.hp.com>
-
- * gui/main.c: include plugin headers to fix 64 bit problems.
-
-2004-12-06 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #67403
-
- * gui/dialogs/event-page.c (sensitize_widgets): don't unsensitize
- the 'Customize' button, to allow users to look at the alarm list
- for read only events.
-
- * gui/dialogs/alarm-list-dialog.c (sensitize_buttons): unsensitize
- buttons if the event is read only.
-
-2004-12-02 Chenthill Palanisamy <pchenthill@novell.com>
-
- * gui/dialogs/task-editor.[ch] (task_editor_new), (task_editor_construct),
- (show_assignment):
- Add a boolean variable to denote assigned task and construct the
- meeting page only for the assigned task. Set it as a group item
- in component editor.
- (_TaskEditorPrivate): added the boolean variable (is_assigned).
- (task_editor_init): initialized the variable.
- * gui/dialogs/comp-editor.[ch]: Added functions to set and get whether comp
- is a group item or individual item.
- * gui/comp-editor.c (make_title_from_string), (make_title_from_comp):
- Set the Title for the appointment editor window as "Meeting" or "Assigned
- Task" if its a group calendar/task item.
- (_CompEditorPrivate): added a boolean variable (is_group_item).
- (comp_editor_init): initialized the same.
- * gui/dialogs/event-editor.c (event_editor_construct), (show_meeting): Set whether
- the component is a group item or not in comp editor.
- * gui/e-calendar-table.c (e_calendar_table_open_task), (e_calendar_table_open_selected),
- (open_task_by_row): Check whether the component being opened is an assigned task by
- checking for attendees and call open_task with proper value for boolean variable assign.
- * gui/comp-editor-factory.c (edit_existing):
- * gui/e-calendar-table.c (open_task):
- * gui/e-tasks.c (e_tasks_new_task):
- * gui/gnome-cal.c (gnome_calendar_new_task):
- * gui/tasks-component.c (create_new_todo):
- Called the function task_editor_new with a added argument.
-
-2004-12-02 Chenthill Palanisamy <pchenthill@novell.com>
-
- * gui/e-day-view.c (e_day_view_finish_resize), (e_day_view_reshape_day_event)
- (e_day_view_change_event_time): Free the string day_view->last_edited_comp_string
- before changing assigning it another value.
- * gui/e-week-view.c (e_week_view_change_event_time): Free the string
- week_view->last_edited_comp_string for the same reason above.
-
-2004-11-29 Chenthill Palanisamy <pchenthill@novell.com>
-
- * calendar-errors.xml.h: committng this file. Missed to
- commit this one.
-
-2004-11-29 Chenthill Palanisamy <pchenthill@novell.com>
-
- * gui/dialogs/comp-editor.c (response_cb): Moved the call
- for the warning dialog (send_component_prompt_subject) after
- the component is saved (save_comp_with_send).
-
-2004-11-26 JP Rosevear <jpr@novell.com>
-
- * gui/alarm-notify/alarm-queue.c (display_notification): ditto
-
- * gui/e-timezone-entry.c (e_timezone_entry_init): get the image
- directly from the icon factory
-
-2004-11-26 JP Rosevear <jpr@novell.com>
-
- * gui/alarm-notify/alarm-queue.c (display_notification): prevent
- crash if there is no description
-
-2004-11-25 Harish Krishnaswamy <kharish@novell.com>
-
- * gui/calendar-component.c:
- (new_calendar_cb), (edit_calendar_cb): Use modified_setup_edit_calendar call.
- (popup_event_cb): If source is null (Rt click on a source group), show the new
- calendar popup menu item. Else, do not show the new calendar option.
- * gui/dialogs/calendar-setup.[ch] (eccp_get_source_type): Compare the
- source_groups by their uid and not the pointers, so that the correct option
- is activated on the combo box.
- (calendar_setup_edit_calendar) : add a source_group parameter to the function.
- (calendar_setup_new_calendar): Use modified signature of the above function.
- * gui/e-calendar-view.c (on_edit_appointment): check the icalcomponent
- to see if it is a meeting and set the argument to e_calendar_view_edit_appointment
- correctly.
-
-2004-11-25 Chenthill Palanisamy <pchenthill@novell.com>
-
- * gui/dialogs/event-deitor.c (show_meeting): removed the
- call for comp_editor_show_page, so that the event page
- shows up at first instead of meeting page when a meeting
- is opened.
-
-2004-11-25 Chenthill Palanisamy <pchenthill@novell.com>
-
- * calendar-errors.xml: Added two error ids to display use
- it when the meeting is created without a summary.
- * gui/dialogs/send-comp.[ch] (send_component_prompt_subject): Added a
- function to prompt for a dialog when a meeting/assigned task is sent
- without a summary.
- * gui/dialogs/comp-editor.c (response_cb): Called the above mentioned
- function when the summary is not present.
-
-2004-11-23 Rodney Dawes <dobey@novell.com>
-
- * gui/alarm-notify/alarm-notify-dialog.[ch]:
- Add gtkimage.h to includes, and remove gtkhtml headers
- Add and remove some widgets in the AlarmNotify struct
- (dialog_destroy_cb, delete_event_cb, close_clicked_cb):
- (snooze_clicked_cb, edit_clicked_cb, url_requested_cb):
- (make_html_display, write_times, write_html_heading):
- (alarm_notify_dialog_disable_buttons):
- Remove all these unneeded functions (no more GtkHTML in the dialog)
- (alarm_notify_dialog): Add description and location arguments
- Rename message argument to summary
- Update gtk-doc comment block to reflect API changes
- Clean up code to use gtk_dialog_run () and use a HIG compliant dialog
-
- * gui/alarm-notify/alarm-notify.glade: Update the alarm notify
- dialog to be HIG compliant and not use GtkHTML, and display more
- information that is relevant to the appointment we are alerting of
-
- * gui/alarm-notify/alarm-queue.c: Add new variables to the
- TrayIconData structure so we can access the description and location
- (on_dialog_objs_removed_cb): Remove alarm_dialog bits
- (notify_dialog_cb): Remove alarm_dialog bits
- (tray_icon_destroyed_cb): Free the description and location as well
- (open_alarm_dialog): alarm_notify_dialog does all the work now, we
- don't need to trap the dialog widget here
- (display_notification): Add code to get the description and location
- information from the cal component
- Avoid using an alarm component which has less useful API
- Fix a warning when creating the tray_icon widget
-
-2004-11-15 Not Zed <NotZed@Ximian.com>
-
- * gui/dialogs/Makefile.am (libcal_dialogs_la_LIBADD): add
- libeabutil, since we use e-destination.
-
-2004-11-08 Rodney Dawes <dobey@novell.com>
-
- * gui/alarm-notify/alarm-notify-dialog.c (write_html_heading):
- Don't try to convert the results of timet_to_str_with_zone to UTF-8,
- since the return value is already encoded in UTF-8
-
- Fixes #47529
-
-2004-11-04 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/dialogs/event-page.glade:
- * gui/dialogs/task-page.glade: expand the horizontal box so that it
- fills all available space.
-
-2004-11-03 David Trowbridge <trowbrds@cs.colorado.edu>
-
- * gui/e-cal-config.c: added EConfig subclass for calendars
- * gui/calendar-component.c, gui/tasks-component.c: initialize
- plugin hooks on component startup.
- * gui/dialogs/calendar-setup.c: Converted to use EConfig
-
-2004-11-04 Li Yuan <li.yuan@sun.com>
-
- Fixes #6767
-
- * gui/e-day-view-main-item.c:
- (e_day_view_main_item_draw_day_event):
- use widget->style instead of hard code colors.
- * gui/e-day-view.c: (e_day_view_realize), (e_day_view_set_colors),
- (e_day_view_style_set), (e_day_view_reshape_long_event),
- (e_day_view_reshape_day_event):
- ditto.
- * gui/e-week-view.c: (e_week_view_realize),
- (e_week_view_set_colors), (e_week_view_style_set),
- (e_week_view_reshape_event_span):
- ditto.
-
-2004-11-02 JP Rosevear <jpr@novell.com>
-
- * gui/e-day-view-config.c (set_twentyfour_hour): make sure the day
- view times redraw themselves if we switch 24/12 hour modes
-
-2004-11-02 JP Rosevear <jpr@novell.com>
-
- Fixes #68707
-
- * gui/e-week-view-event-item.c (e_week_view_event_item_draw):
- restrict the range to 0-23 (midnight end times became '24')
-
-2004-10-28 Not Zed <NotZed@Ximian.com>
-
- * gui/tasks-component.c (popup_event_cb):
- * gui/e-calendar-view.c (e_calendar_view_create_popup_menu):
- * gui/e-calendar-table.c (e_calendar_table_show_popup_menu):
- * gui/calendar-component.c (popup_event_cb): added hook doco.
-
-2004-10-27 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-cal-list-view.c (e_cal_list_view_new): don't expand recurrences
- for the list view.
-
-2004-10-21 Harish Krishnaswamy <kharish@novell.com>
-
- * gui/e-cal-popup.[ch]: (e_cal_popup_target_new_source):
- Add status bits to denote if the calendar source is available offline
- so that plugins to calendar popups can use the status qualifier to denote
- their visibility preferences.
-
-2004-10-21 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/dialogs/select-source-dialog.c: use the new source selector
- dialog in libedataserverui.
-
-2004-10-20 JP Rosevear <jpr@novell.com>
-
- * gui/calendar-component.c: put an icon on the properties menu item
-
- * gui/tasks-component.c: ditto
-
- * gui/main.c (initialize): register plugin hooks for tasks and
- calendar
-
-2004-10-20 JP Rosevear <jpr@novell.com>
-
- * gui/e-cal-popup.c (ecalph_class_init): correct classid
-
-2004-10-19 JP Rosevear <jpr@novell.com>
-
- * gui/calendar-component.c, gui/e-cal-menu.c, gui/e-cal-popup.c,
- gui/e-calendar-table.c, gui/e-calendar-view.c, gui/gnome-cal.c,
- gui/tasks-component.c, gui/alarm-notify/alarm-queue.c,
- gui/dialogs/meeting-page.c: convert to org.gnome hook names
-
-2004-10-19 Harish Krishnaswamy <kharish@novell.com>
-
- * gui/comp-editor-factory.c: (edit_existing):
- Use e_cal_component_has_attendees to test if it is a meeting.
- * gui/dialogs/event-editor.c: (event_editor_init):
- By default, the event is not a meeting.
- (event_editor_construct): Do not add the invitation, scheduling pages
- to the editor if it is not a meeting.
- * gui/e-day-view.c: (e_day_view_on_event_double_click):
- check the icalproperty to test if the event is a meeting.
-
-2004-10-19 JP Rosevear <jpr@novell.com>
-
- * gui/gnome-cal.c (connect_list_view_focus): listen to the canvas
- for focus events
- (setup_widgets): listen for listen view selection changes
-
- * gui/e-cal-list-view.c (setup_e_table): listen for the cursor to
- move
- (e_cal_list_view_cursor_change_cb): indicate the selection changed
-
-2004-10-19 Harish Krishnaswamy <kharish@novell.com>
-
- * gui/calendar-component.c (create_new_event):
- * gui/e-calendar-view.c: (e_calendar_view_edit_appointment):
- * gui/comp-editor-factory.c (edit_existing), (edit_new):
- * gui/dialogs/event-editor.c (event_editor_edit_comp),
- (event_editor_new): updated the calls to event_editor_new
- with additional argument.
- * gui/dialogs/event-editor.h: add parameter is_meeting to
- distinguish between events and meetings.
- * gui/dialogs/meeting-page.c: (sensitize_widgets):
- use explicit GError variable so that BUSY_ERROR
- conditions do not lead us to think the calendar is readonly.
- * gui/e-meeting-store.c: (refresh_queue_remove), (ems_init),
- (e_meeting_store_remove_attendee), (freebusy_async),
- (refresh_busy_periods), (refresh_queue_add): Make free-busy calls
- to backends async. Fixed the problem of spurious attendees getting
- added to the refresh_data.
-
-2004-10-14 Not Zed <NotZed@Ximian.com>
-
- * gui/e-cal-menu.c (e_cal_menu_target_new_select): dont access a
- NULL client.
-
- * gui/gnome-cal.c (gnome_calendar_get_taskpad_menu)
- (gnome_calendar_get_calendar_menu): accessors to get the menu
- managers.
- (gnome_calendar_init): setup menu managers.
-
-2004-10-13 Not Zed <NotZed@Ximian.com>
-
- * gui/calendar-commands.c (calendar_control_activate)
- (calendar_control_deactivate): activate and deactivate the
- calendar and taskpad menu handlers.
- (sensitize_items): helper to sensitise items based on target
- masks.
- (calendar_control_sensitize_calendar_commands): update the
- calendar menu manager target appropriately.
- (sensitize_taskpad_commands): same for the taskpad.
-
- * gui/e-cal-menu.[ch]: Targets for main menu management.
-
- * gui/e-cal-popup.c (e_cal_popup_target_new_select): fix cast.
- Also include the tasks stuff in the hook metadata.
-
-2004-10-15 JP Rosevear <jpr@novell.com>
-
- * gui/calendar-commands.c (calendar_control_activate): remove
- useless ifdef'd out statement (its been unused for 3+ years)
-
-2004-10-15 JP Rosevear <jpr@novell.com>
-
- * gui/calendar-commands.h (calendar_goto_today): remove prototype
-
- * gui/calendar-commands.c: remove dead function
-
-2004-10-14 JP Rosevear <jpr@novell.com>
-
- * gui/e-meeting-attendee.c: convert to G_DEFINE_TYPE
-
- * gui/e-meeting-list-view.c: ditto
-
- * gui/e-meeting-time-sel.c: ditto
-
- * gui/e-meeting-time-sel-item.c: ditto
-
- * gui/e-select-names-renderer.c: ditto
-
- * gui/e-timezone-entry.c: ditto
-
- * gui/e-tasks.c: ditto
-
- * gui/gnome-cal.c: ditto
-
- * gui/weekday-picker.c: ditto
-
-2004-10-14 JP Rosevear <jpr@novell.com>
-
- * gui/e-cell-date-edit-config.c: convert to G_DEFINE_TYPE
-
- * gui/e-cell-date-edit-text.c: ditto
-
- * gui/e-comp-editor-registry.c: ditto
-
- * gui/e-date-edit-config.c: ditto
-
- * gui/e-mini-calendar-config.c: ditto
-
-2004-10-14 JP Rosevear <jpr@novell.com>
-
- * gui/e-cal-list-view-config.c: convert to G_DEFINE_TYPE
-
- * gui/e-cal-list-view.c: ditto
-
- * gui/e-cal-model-calendar.c: ditto
-
- * gui/e-cal-model-tasks.c: ditto
-
- * gui/e-cal-model.c: ditto
-
- * gui/e-calendar-table-config.c: ditto
-
- * gui/e-calendar-table.c: ditto
-
- * gui/e-calendar-view.c: ditto
-
-2004-10-14 JP Rosevear <jpr@novell.com>
-
- * gui/calendar-view.c: convert to G_DEFINE_TYPE
-
- * gui/calendar-view-factory.c: ditto
-
- * gui/cal-search-bar.c: ditto
-
- * gui/e-cal-component-preview.c: ditto
-
-2004-10-14 JP Rosevear <jpr@novell.com>
-
- * gui/e-week-view-config.c: convert to G_DEFINE_TYPE
-
- * gui/e-week-view-event-item.c: ditto
-
- * gui/e-week-view-main-item.c: ditto
-
- * gui/e-week-view-titles-item.c: ditto
-
- * gui/e-week-view.c: ditto
-
-2004-10-14 JP Rosevear <jpr@novell.com>
-
- * gui/e-day-view.c: convert to G_DEFINE_TYPE
-
- * gui/e-day-view-config.c: ditto
-
- * gui/e-day-view-main-item.c: ditto
-
- * gui/e-day-view-time-item.c: ditto
-
- * gui/e-day-view-top-item.c: ditto
-
-2004-10-14 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/comp-editor.c: convert to G_DEFINE_TYPE
-
- * gui/dialogs/meeting-page.c: ditto
-
- * gui/dialogs/recurrence-page.c: ditto
-
- * gui/dialogs/schedule-page.c: ditto
-
- * gui/dialogs/e-delegate-dialog.c: ditto
-
- * gui/dialogs/event-editor.c: ditto
-
- * gui/dialogs/task-editor.c: ditto
-
- * gui/dialogs/task-details-page.c: ditto
-
- * gui/dialogs/select-source-dialog.c
- (primary_selection_changed_cb): fix warning
-
-2004-10-13 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/task-page.c: ditto
-
- * gui/calendar-component.h: remove e-source-selector include
-
- * gui/tasks-component.h: ditto
-
- * gui/calendar-component.c: update include to libedataserverui for
- source selector and option menus
-
- * gui/e-cal-popup.c: ditto
-
- * gui/dialogs/url-editor-dialog.h: ditto
-
- * gui/dialogs/select-source-dialog.c: ditto
-
- * gui/tasks-component.c: ditto
-
- * importers/icalendar-importer.c: ditto
-
- * gui/e-itip-control.c: ditto; use G_DEFINE_TYPE instead of
- E_MAKE_TYPE
-
- * gui/dialogs/event-page.c: ditto
-
- * gui/dialogs/task-page.c: ditto
-
-2004-10-12 Li Yuan <li.yuan@sun.com>
-
- * gui/e-day-view.c: (e_day_view_on_main_canvas_button_press):
- * gui/e-week-view.c: (e_week_view_on_button_press):
- If main_canvas has focus, do not grub it. Emit the
- selected_time_changed signal after the selection day changed.
-
-2004-10-12 Not Zed <NotZed@Ximian.com>
-
- * gui/dialogs/meeting-page.c (button_press_event): convert menu to
- epopup.
-
-2004-10-12 Not Zed <NotZed@Ximian.com>
-
- * gui/e-calendar-table.c (setup_popup_icons): removed.
- (e_calendar_table_show_popup_menu): convert to use e-popup for
- pluggable popup menu.
- (e_calendar_table_on_open_task, e_calendar_table_on_save_as)
- (e_calendar_table_on_print_task, e_calendar_table_on_cut)
- (e_calendar_table_on_copy, e_calendar_table_on_paste)
- (e_calendar_table_on_assign, e_calendar_table_on_forward)
- (delete_cb):
- (mark_as_complete_cb, open_url_cb): convert to epopup callbacks.
- Moved all of the callbacks above the table rather than maintaining
- forward declarations for some of them.
-
- * gui/e-cal-popup.c (e_cal_popup_target_new_select): add the task
- required masks, and make one vs many mutally exclusive.
-
- * gui/e-calendar-view.c (e_calendar_view_create_popup_menu):
- copy/setup the event list here.
-
- * gui/e-cal-popup.c (e_cal_popup_target_new_select): take model +
- events rather than the calendar view.
-
-2004-10-12 Li Yuan <li.yuan@sun.com>
-
- * gui/calendar-commands.c:
- (calendar_get_text_for_folder_bar_label):
- When the start year and the end year are the same, the num should
- be displayed in start time.
- * gui/dialogs/alarm-dialog.glade:
- Add names to comboxes in alarm-dialog page.
- * gui/dialogs/cal-prefs-dialog.glade:
- Add labbled_by relation for e_date_edit.
- Add names to comboxes in general tab and display tab.
- Add shortcut keys to start_of_day_label and end_of_day_label.
- * gui/dialogs/event-page.c: (init_widgets):
- Use the default text_buffer of gtk_text_view instead of
- creating one.
- * gui/dialogs/event-page.glade:
- Add labbled_by relation for e_date_edit.
- * gui/dialogs/meeting-page.glade:
- Set an atk name for organizer widget.
- * gui/dialogs/task-page.c: (init_widgets):
- Use the default text_buffer of gtk_text_view instead of
- creating one.
- * gui/dialogs/task-page.glade:
- Add labbled_by relation for e_date_edit.
- Add a11y names to task description and categories.
- * gui/e-alarm-list.c: (e_alarm_list_iter_n_children):
- Remove the iter checker. The iter can't have a valid value at this time.
- * gui/e-date-time-list.c: (e_date_time_list_iter_n_children):
- Remove the iter checker. The iter can't have a valid value at this time.
- * gui/e-meeting-time-sel.c: (e_meeting_time_selector_construct):
- Add labbled_by relation for e_date_edit.
- * gui/e-timezone-entry.c: (e_timezone_entry_class_init),
- (e_timezone_entry_init), (e_timezone_entry_mnemonic_activate),
- (e_timezone_entry_focus):
- Add a focus handler for e-timezone-entry. Set an atk name for the
- button.
- * gui/e-week-view.c: (e_week_view_do_cursor_key_up),
- (e_week_view_do_cursor_key_down), (e_week_view_do_cursor_key_left),
- (e_week_view_do_cursor_key_right), (e_month_view_do_cursor_key_up),
- (e_month_view_do_cursor_key_down),
- (e_month_view_do_cursor_key_left),
- (e_month_view_do_cursor_key_right):
- Emit the selected_time_changed signal after the selection day changed.
-
-2004-10-11 Not Zed <NotZed@Ximian.com>
-
- * gui/alarm-notify/alarm-queue.c (tray_icon_clicked_cb): convert
- to epopup.
- (add_popup_menu_item): removed, now redundant.
-
-2004-10-08 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #45951
-
- * gui/dialogs/event-page.glade:
- * gui/dialogs/task-page.glade: attach the description field correctly
- to the table so that it scrolls correctly instead of making the dialog
- bigger as you write.
-
- * gui/dialogs/comp-editor.c (setup_widgets): no need to create an extra
- GtkVBox, just use the GtkDialog's one.
-
-2004-10-07 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/cal-prefs-dialog.c: remove useless include
-
- * gui/dialogs/url-editor-dialog.c: ditto
-
-2004-10-07 JP Rosevear <jpr@novell.com>
-
- * gui/print.c: guard config.h
-
- * gui/tasks-control.c: guard config.h, remove useless include
-
- * gui/migration.c: remove useless include
-
- * gui/main.c: remove useless include
-
- * gui/e-calendar-view.h: #define the type
-
- * gui/calendar-offline-handler.c: remove useless include
-
- * gui/calendar-config.c: tidy header
-
-2004-10-07 JP Rosevear <jpr@novell.com>
-
- * gui/calendar-commands.c: guard config.h include, kill warning
- and remove useless include
-
-2004-10-06 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #65932
-
- * common/authentication.c: keep a hash table of all the source lists.
- (auth_new_cal_from_uri): do a search in the source list for the given
- URI, and use that ESource if we find it. Also, keep the hash table of
- source lists up to date.
-
- * gui/comp-editor-factory.c (cal_opened_cb): don't assert on error
- cases, just display an error dialog.
-
-2004-10-06 Not Zed <NotZed@Ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_setup_view_popup): rename to
- view_popup_factory. Make it build an epopup item list directly.
- Can't re-use the galview cruft :-/
- (gnome_calendar_discard_view_popup): no longer needed.
- (gc_set_view, gc_save_custom_view, gc_define_views_response)
- (gc_define_views): implement the gal-view popup menu items.
-
- * gui/gnome-cal.h:
- * gui/e-week-view.h:
- * gui/e-day-view.h:
- * gui/e-cal-list-view.h: removed old e-popup-menu header.
-
- * gui/e-calendar-view.c (setup_popup_icons): removed.
- (e_calendar_view_create_popup_menu): converted to use e-popup.
- (on_paste, on_copy, on_cut, on_delete_occurrence)
- (on_unrecur_appointment, on_delete_appointment, on_publish)
- (on_forward, on_meeting, on_move_to, on_copy_to, on_print_event)
- (on_save_as, on_print, on_edit_appointment, on_goto_today)
- (on_goto_date, on_new_task, on_new_meeting, on_new_event)
- (on_new_appointment): convert to use e-popup stuff.
-
- * gui/tasks-component.c (popup_event_cb): e-popup api changes.
-
- * gui/e-cal-popup.c (e_cal_popup_target_new_select): implement the
- selection target.
- (ecalp_target_free): and free it.
-
- * gui/e-cal-model.h: Make the ECalModel struct non-anonymous so it
- can be forward-declared.
-
- * gui/calendar-component.c (popup_event_cb): e-popup api changes.
-
-2004-10-06 Rodrigo Moya <rodrigo@novell.com>
-
- Revert fix for #60551
-
- * gui/dialogs/task-page.c (task_page_fill_component): start date
- can be after the due date, no need to compare.
-
-2004-10-02 Iván Frade <frade@asturlinux.org>
-
- Fixes #48116
-
- * gui/dialogs/task-details.page.c (task_details_page_fill_component):
- Validation: completed date is not a future date.
-
-2004-10-01 Not Zed <NotZed@Ximian.com>
-
- * gui/tasks-component.c (create_component_view): cast warning
- away.
- (create_component_view): connect to popup_event rather than
- fill_popup_menu.
-
- * gui/calendar-component.c (create_component_view): cast a warning
- away.
-
- * calendar-errors.xml: add prompt-delete-task-list.
-
- * gui/tasks-component.c (fill_popup_menu_cb): renamed to
- popup_event_cb, make use e-cal-popup.
- (edit_task_list_cb, new_task_list_cb, delete_task_list_cb)
- (copy_task_list_cb): deja-vu. update for api.
- (add_popup_menu_item): killed. murdered. drawn and quatered.
- (delete_task_list_cb): use e-error for the delete prompt.
-
- * gui/calendar-component.c (create_component_view): hook onto
- popup event instead of fill_popup_menu.
-
- * calendar-errors.xml: added prompt-delete-calendar.
-
- * gui/calendar-component.c (fill_popup_menu_cb): rename to
- popup_event_cb, make use e-cal-popup.
- (edit_calendar_cb, new_calendar_cb, delete_calendar_cb)
- (copy_calendar_cb): fix for api changes.
- (add_popup_menu_item): removed.
- (delete_calendar_cb): use e-error for the delete thing.
-
- * gui/e-cal-popup.[ch]: calendar popup driver.
-
-2004-09-29 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #64683
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_construct): create
- a scrolled window for the attendees list, and synchronize it with the
- scrolling in the F/B area.
-
-2004-09-28 Not Zed <NotZed@Ximian.com>
-
- ** See bug #66736.
-
- * gui/e-itip-control.c (e_itip_control_set_data): noop if we were
- destroyed (priv == null).
-
-2004-09-28 JP Rosevear <jpr@novell.com>
-
- Fixes #61766
-
- * gui/migration.c (create_calendar_contact_source): set a color
- for the contacts
- (create_calendar_sources): set a color for the personal source and
- make in primary and default if nothing else is either
- (create_task_sources): ditto for tasks personal source
-
-2004-09-24 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #65599
-
- * gui/itip-utils.c (comp_fb_normalize): don't use NULL properties.
-
- * gui/e-pub-utils.c (e_pub_publish): use auth_new_cal_from_source()
- instead of auth_new_cal_from_uri().
-
-2004-09-24 JP Rosevear <jpr@novell.com>
-
- Fixes #64955, Vincent Noel <vnoel@cox.net>
-
- * libecal/e-cal.c (e_cal_get_alarms_in_range): fix c99-ism
-
-2004-09-24 JP Rosevear <jpr@novell.com>
-
- Fixes #66344
-
- * gui/e-cal-model-calendar.c (get_dtend): check for existence of
- property and null time instead of sending through bad data
-
- * gui/e-cal-model.c (get_dtstart): ditto
-
- * gui/e-cal-model-tasks.c (get_completed): ditto
- (get_due): ditto
-
-2004-09-24 Chenthill Palanisamy <pchenthill@novell.com>
-
- Fixes #63513
- * gui/e-itip-control.c
- (ok_clicked_cb): Now the myaddress can be set to ecal address
- since ok will be sentized only when ecal is loaded.
-
-2004-09-22 JP Rosevear <jpr@novell.com>
-
- * gui/calendar-component.c (fill_popup_menu_cb): ditto
-
- * gui/tasks-component.c (fill_popup_menu_cb): don't allow a delete
- of the system calendar
-
-2004-09-21 JP Rosevear <jpr@novell.com>
-
- Fixes #60904
-
- * gui/gnome-cal.c (set_week_start): update the view
- (get_times_for_views): mimic the work week guessing code exactly
- for calculating the time range needed instead of hardcoding 5 days
- (set_working_days): new routine to update the view
- (working_days_changed_cb): use above when getting config change
- notification
- (setup_config): set working days and add notification
-
-2004-09-21 JP Rosevear <jpr@novell.com>
-
- Fixes #66158
-
- * gui/e-cal-model-tasks.c (e_cal_model_tasks_mark_task_complete):
- notify of change so completion status updates immediately
-
-2004-09-21 JP Rosevear <jpr@novell.com>
-
- Fixes #59194
-
- * gui/e-cal-model-calendar.c (get_location): return "" instead of
- NULL
-
-2004-09-21 Chenthill Palanisamy <pchenthill@novell.com>
-
- Fixes #65682
- * gui/itip-utils.c
- (itip_send_comp): check the static capability before
- booking the deletion.
-
-2004-09-15 JP Rosevear <jpr@novell.com>
-
- Fixes #55172
-
- * conduits/calendar/calendar-conduit.c (local_record_from_comp):
- handle -1 (last) for monthly recurrences and check both by_set_pos
- and by_day since either can indicate this type of recurrence
-
-2004-09-20 Tony Tsui <ttsui9@gmail.com>
-
- Fixes #66174
-
- * gui/dialogs/meeting-page.c (existing_attendee): fixed memory leak.
-
-2004-09-10 Hannah & Fazlu <hannah_lins@yahoo.co.in>
-
- Fixes bug #65051
-
- * calendar/gui/dialogs/task-page.c (task_page_fill_component):
- Compared the dates and time
-
-2004-09-10 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #62374
-
- * gui/alarm-notify/alarm-queue.c (load_missed_alarms): removed this
- function.
- (cal_opened_cb): no need to call load_missed_alarms,
- load_alarms_for_today will do everything.
- (alarm_queue_add_client): ditto.
- (load_alarms_for_today): take into account the last saved notification
- time.
- (load_alarms): unref the previous query, this function should now
- only be called once per time range.
-
-2004-09-09 JP Rosevear <jpr@novell.com>
-
- Fixes #65454
-
- * gui/e-itip-control.c (class_init): only use a destroy function,
- no finalize
- (cleanup_ecal): util function
- (init): use above for hash table and killed destroyed flag
- (weren't using it anywhere)
- (destroy): collapse finalize work into here and guard against
- multiple destroy calls
-
-2004-09-08 JP Rosevear <jpr@novell.com>
-
- Fixes #62728
-
- * gui/e-week-view.c (e_week_view_set_week_start_day): trigger a
- redraw when changing the start day
-
-2004-09-05 Chenthill Palanisamy <pchenthill@novell.com>
-
- * gui/e-calendar-table.c
- (e_calendar_table_show_popup_menu): Check the
- static capability to enable or disable the assign
- tasks in the popup menu.
-
- * gui/dialogs/recurrence-page.c
- (sensitize_buttons): Check for the static capability
- to convert a existing appointment to recurrence appointment
- for enabling or diabling the recurrence widgets.
-
-2004-08-31 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #62392
-
- * gui/alarm-notify/alarm-queue.c (display_notification): ref the
- client's query object so that it doesn't disappear on us.
- (tray_icon_destroyed_cb): unref the query previously ref'ed.
-
-2004-08-31 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-cal-model-tasks.c: include missing string.h, to avoid
- problems in 64 bit builds.
-
-2004-08-27 Not Zed <NotZed@Ximian.com>
-
- * common/authentication.c (auth_func_cb): constify the strings to
- remove a warning.
-
- ** See bug #64856 (workaround).
-
- * common/authentication.c (auth_func_cb):
- * gui/e-pub-utils.c(e_pub_publish): add ONLINE flag to password
- request.
-
-2004-08-28 JP Rosevear <jpr@novell.com>
-
- * gui/e-itip-control.c (rsvp_clicked_cb): get the active state
- (insert_rsvp): set inital rsvp state
-
- * gui/alarm-notify/alarm-queue.c (alarm_queue_add_client): load
- immediately if they are loaded
-
-2004-08-27 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/alarm-notify/alarm-queue.c (load_alarms): use the
- new 'has-alarms-in-range' query.
- (alarm_queue_add_client): make sure we don't add twice the same alarm.
-
-2004-08-27 JP Rosevear <jpr@novell.com>
-
- Fixes #62911, #54101
-
- * gui/e-itip-control.c (set_ok_sens): util routine to set
- sensitivity of OK button
- (cal_opened_cb): cal back when calendar opens, sensitize ok button
- (start_calendar_server): open async and take call back arg
- (source_selected_cb): desensitize ok button until calendar is
- loaded
- (find_cal_opened_cb): check to see if the calendar contains the
- object we are looking for, if none do show the source selector
- option menu
- (find_server): search async for the server
- (destroy): clean up html widget
- (finalize): instead of here
- (get_publish_options): use only object tag
- (get_request_options): ditto
- (get_request_fb_options): ditto
- (get_reply_options): ditto
- (get_refresh_options): ditto
- (get_cancel_options): ditto
- (show_current_event): use new options, remove groupwise NEEDS
- ACTION check, handle async loading
- (show_current_todo): use new options, handle async loading
- (option_activated_cb): record action
- (add_option): add action item
- (insert_boxes): layout widgets
- (insert_label): insert label
- (rsvp_clicked_cb): record rsvp status
- (insert_rsvp): insert rsvp check box
- (insert_ok): insert ok button
- (publish_options_object): spit out relevant options
- (request_options_object): ditto
- (freebusy_options_object): ditto
- (reply_options_object): ditto
- (refresh_options_object): ditto
- (cancel_options_object): ditto
- (object_requested_cb): handle object requests
- (ok_clicked_cb): use recorded actions
-
-2004-08-27 JP Rosevear <jpr@novell.com>
-
- * gui/alarm-notify/alarm-notify.h: update proto
-
- * gui/alarm-notify/alarm-notify.c (list_changed_cb): use per
- source type client hash
- (alarm_notify_init): ditto
- (alarm_notify_finalize): ditto
- (cal_opened_cb): ditto
- (alarm_notify_add_calendar): ditto
- (alarm_notify_remove_calendar): ditto, take source_type arg
- (load_calendars_cb): don't call list_changed if the source list is
- NULL
-
-2004-08-26 Christian Neumair <chris@gnome-de.org>
-
- * gui/GNOME_Evolution_Calendar.server.in.in:
- Don't mark component menu accels for translation.
-
-2004-08-25 JP Rosevear <jpr@novell.com>
-
- * conduits/todo/todo-conduit.c (for_each): prepare the local
- record correctly, should fix copy to/from problems when syncing
-
- * conduits/calendar/calendar-conduit.c (for_each): ditto
-
-2004-08-25 Frederic Crozat <fcrozat@mandrakesoft.com>
-
- * gui/dialogs/recur-comp.c: (recur_component_dialog):
- Don't call gtk_dialog_set_has_separator on Gtk Message Dialog
- with GTK+ >= 2.4.0.
-
-2004-08-25 Chenthill Palanisamy <pchenthill@novell.com>
-
- * gui/e-tasks.c
- (default_client_cal_opened_cb): Reset the Status Bar message to
- NUll, if the status of the Calendar is returned OK.
-
-2004-08-24 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #58824
-
- * gui/gnome-cal.c (open_ecal): Only try to open the calendar if not
- loaded yet.
- (update_query, client_cal_opened_cb, default_client_cal_opened_cb,
- backend_died_cb): use always the same view for status messages.
- (gnome_calendar_set_activity_handler): set the activity handlers on
- all views, not just the current one.
- (display_view): no need to set the activity handler here.
-
-2004-08-13 Jeffrey Stedfast <fejj@novell.com>
-
- * gui/dialogs/event-page.glade: Make the description scrolled
- window scroll policy "automatic" rather than "never". Fixes bug
- #62063.
-
-2004-08-18 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/alarm-notify/alarm-notify.c (alarm-notify_init) :
- initialize the mutext needed to prevent concurrect access
- priv->uri_clients_hash. Also install a timeout handler for
- loading sources which requires auth later
- (alarm_notify_finalize) : free the new mutex
- (load_calendars_cb) : call back which adds sources again after
- one minute
- (alarm_notify_add_calendar) : lock ad unlock the new mutex
- before and after accessing uri_clients_hash
-
-2004-08-16 JP Rosevear <jpr@ximian.com>
-
- Fixes #62706
-
- * gui/e-cal-model.c (e_cal_model_set_timezone): set the default
- timezone on the server
-
-2004-08-16 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/alarm-notify/alarm-notify.h : change the prototype of
- alarm_notify_add_calendar to take Esource instead of uri
-
- * gui/alarm-notify/alarm-notify.c (alarm_notify_add_calendar) :
- use auth_new_cal_from_source instead of _from_uri to create cal
- client also do not try to load the cal backend which require auth
- and for which there is no password availble in e-password seesion
- (list_changed_cb) (load_calendars) : pass Esource insted of uri to
- alarm_notify_add_calendar
-
-2004-08-14 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/e-tasks.c (e_tasks_init) : initialize priv->default_lcient
- (default_client_cal_opened_cb) : unref priv->default_client and
- make it NULL
- (client_cal_opened_cb) : don't unref client explicitly as removing
- from priv->clients already does that. Remove client based on uid
- instead of uri
- (backend_died_cb) : Remove client based on uid insted of uri Fixes
- #62869
-
-2004-08-12 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/calendar-setup.glade: make the button say Add Task
- List instead of Add Group (matches menu item)
-
-2004-08-12 Carlos Garnacho Parro <carlosg@gnome.org>
-
- * gui/dialogs/alarm-dialog.glade: added the property
- "use_filechooser" to the GnomeFileEntry
-
-2004-08-10 Not Zed <NotZed@Ximian.com>
-
- * gui/e-pub-utils.c (e_pub_publish):
- * common/authentication.c (auth_func_cb): epasswords api change.
-
-2004-08-11 JP Rosevear <jpr@ximian.com>
-
- Fixes #61555
-
- * gui/dialogs/meeting-page.c (existing_attendee): check if an
- attendee was pre-existing
- (remove_attendee): only add the attendee to the cancel comp if it
- was pre-existing
-
-2004-08-10 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-cal-model.c (e_cal_model_set_search_query): guard against
- re-running the same query.
-
-2004-08-10 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/alarm-notify/alarm-queue.c (tray_icon_destroyed_cb): disconnect
- from signals also when using only the system tray. Fixes a crash when
- removing an event that had an alarm popup recently.
-
-2004-08-09 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-calendar-view.c: re-added 'Make this occurrence movable' menu
- item, gone by mistake.
- (on_unrecur_appointment): new callback for the new menu item.
-
-2004-08-06 JP Rosevear <jpr@ximian.com>
-
- Fixes #62452
-
- * gui/e-itip-control.c (find_my_address): take option to retrieve
- current status as well, actually look for the delegator in the
- list so we can retrieve status there as well
- (show_current_event): use find_my_address to get the status so we
- properly handle not finding the address in the list of attendees
- (show_current): pass extra param
- (ok_clicked_cb): ditto
-
-2004-08-06 JP Rosevear <jpr@ximian.com>
-
- Fixes #62021
-
- * gui/dialogs/event-page.c (source_changed_cb): set the default
- timezone
-
- * gui/e-itip-control.c (start_calendar_server): set the default
- timezone
-
- * gui/calendar-component.c (setup_create_ecal): set the default
- timezone, as the component view is not alive and hence has not set
- it
-
- * gui/tasks-component.c (setup_create_ecal): ditto
-
-2004-08-05 Parthasarathi S A <sparthasarathi@novell.com>
-
- Fix for bug #61673.
- * calendar/gui/dialogs/save_comp.c(save_component_dialog):
- The function takes two arguments now, instead of one. The second
- argument is the pointer to the ECalComponent from which the component
- type can be determined. Based on the component type the corresponding
- error message is displayed.
- * calendar/gui/dialogs/save_comp.h:
- Function definition updated for save_component_dialog.
- * calendar/gui/dialogs/comp_editor.c(prompt_to_save_changes):
- passing the ECalComponent pointer to the 'save_component_dialog' function
- * calendar/calendar-errors.xml: New error message string for task included
- * calendar/calendar-errors.xml.h
-
-2004-08-05 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #62030
-
- * gui/alarm-notify/alarm-queue.c (tray_icon_destroyed_cb):
- only remove the tray icon blinking timeout if we installed
- it.
- (display_notification): only install the tray icon blinking
- timeout if using the system tray.
- (tray_icon_blink_cb): use g_object_unref instead of the
- deprecated gdk_pixbuf_unref.
-
- * gui/alarm-notify/alarm.c (alarm_add): added missing argument
- documentation.
-
-2004-08-03 JP Rosevear <jpr@novell.com>
-
- * gui/gnome-cal.c (gnome_calendar_destroy): clean up all the
- default clients
- (default_client_cal_opened_cb): change the if statement to a
- switch to be consistent with the other code bits and set the
- default client for the source type
- (gnome_calendar_add_source): look at the default based on the
- source type
- (gnome_calendar_set_default_source): set the default for the
- source type
- (gnome_calendar_new_task): bail out if we have no ecal
-
- * gui/gnome-cal.c (set_timezone): set the timezone for all the
- default clients
-
- * gui/calendar-component.c (update_primary_task_selection): look
- in the task source list, not the plain source list
-
-2004-08-05 JP Rosevear <jpr@novell.com>
-
- * gui/tasks-control.c (tasks_control_sensitize_commands): kill
- warning by checking if there is a default client first (can happen
- when first starting up)
-
-2004-08-05 JP Rosevear <jpr@novell.com>
-
- Fixes #62363
-
- * gui/calendar-component.c (create_new_event):
- commit the sequence
-
-2004-08-04 Harish Krishnaswamy <kharish@novell.com>
-
- * gui/e-itip-control.c: (ok_clicked_cb): Handle decline request by
- using update_item rather than remove_item, so the backend receives
- the notification and can handle it. Also, do not rsvp if the backend
- has the 'save_schedule' capability.
-
-2004-08-01 JP Rosevear <jpr@novell.com>
-
- * conduits/todo/todo-conduit.c (todoconduit_load_configuration):
- get source list and source
- (todoconduit_dupe_configuration): copy source list and source
- (todoconduit_destroy_configuration): unref source list and source
- (start_calendar_server): open the source that was set earlier
- (fill_widgets): set the source option menu value
- (create_settings_window): pass source list to pilot settings
- (save_settings): mark source with pilot-sync property
-
- * conduits/calendar/calendar-conduit.c: as above
-
- * conduits/todo/Makefile.am: link to and include misc. widgets
-
- * conduits/calendar/Makefile.am: ditto
-
-2004-07-30 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #57622
-
- * gui/e-cal-model.h: added ECalModelFlags enum type.
-
- * gui/e-cal-model.c (e_cal_model_set_flags, e_cal_model_get_flags):
- new functions.
- (e_cal_model_init): initialize the new internal field to keep the flags.
- (e_cal_view_objects_added_cb): expand recurrences if the model flags
- contain the EXPAND_RECUR bit.
- (e_cal_view_objects_modified_cb): if EXPAND_RECUR is on, remove all
- recurrences and regenerate them.
- (e_cal_view_objects_removed_cb): remove all instances for given UIDs.
- (add_new_client): killed warning.
- (get_dtstart): use the instance_start time when dealing with recurrences.
-
- * gui/e-cal-model-calendar.c (get_dtend): use the instance_end time
- when dealing with recurrences.
-
- * gui/e-cal-list-view.c (e_cal_list_view_new): set the EXPAND_RECUR
- flag on the model for the list view.
-
- * gui/e-week-view.c (e_week_view_add_event):
- * gui/e-day-view.c (e_day_view_add_event): fill in the instance's
- start and end times in the ECalModelComponent struct.
-
- * gui/e-calendar-view.c (e_calendar_view_delete_selected_occurrence):
- use the instance_start field to retrieve the RECUR-ID, now that all the
- views fill it in.
-
-2004-07-29 JP Rosevear <jpr@novell.com>
-
- * gui/e-calendar-view.c: creating new items no longer needs to be
- disabled since the user can switch to a writable calendar and the
- editor ui is disabled properly
-
-2004-07-31 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/event-editor.c (show_meeting): use Invitations not
- Meetings
- (event_editor_edit_comp): ditto
-
-2004-07-31 JP Rosevear <jpr@novell.com>
-
- * gui/e-day-view.c (e_day_view_finish_long_event_resize): guard
- with is_instance instead of has_recurrences because most of the
- backends don't support this yet
- (e_day_view_finish_resize): ditto
- (e_day_view_change_event_time): ditto
- (e_day_view_on_editing_stopped): ditto
- (e_day_view_on_top_canvas_drag_data_received): ditto
- (e_day_view_on_main_canvas_drag_data_received): ditto
-
- * gui/e-week-view.c (e_week_view_change_event_time): ditto
- (e_week_view_on_editing_stopped): ditto
-
-2004-07-30 Harish Krishnaswamy <kharish@novell.com>
-
- * gui/e-tasks.c: (client_cal_opened_cb),
- (default_client_cal_opened_cb):
- * gui/gnome-cal.c: (client_cal_opened_cb),
- (default_client_cal_opened_cb):
- Handle E_CALENDAR_STATUS_BUSY conditions and do not
- remove the source from the gnome-calendar. The fix
- for #59335 exposed this problem.
-
-2004-07-28 Larry Ewing <lewing@novell.com>
-
- * gui/dialogs/calendar-setup.c (dialog_hide_unused_options): hide
- dialog items that don't apply when editing properties.
- (general_update_dialog): check to make sure we have a source
- before checking its state.
-
-2004-07-27 JP Rosevear <jpr@novell.com>
-
- Fixes #62006
-
- * gui/e-cal-model.c (add_new_client): don't load the events if we
- are already doing the query
-
-2004-07-25 JP Rosevear <jpr@ximian.com>
-
- Fixes #61058
-
- * gui/e-week-view.c (process_component_recur_cb): add but don't
- prepend
- (process_component): use above as call back so we can pass the
- prepend bool
- (e_week_view_add_event): take a prepend bool and prepend to the
- events array if asked so the event will be shown first when drawn
- (e_week_view_do_key_press): If the event can't be fit on the
- screen, ie not even one event can be shown in the day, don't try
- to edit it
-
-2004-07-26 Rodney Dawes <dobey@novell.com>
-
- * gui/dialogs/event-page.glade: Fix mnemonic for "Location" to not
- be duplicated with "OK"
-
- * gui/dialogs/meeting-page.c (get_widgets): Get the "Attendees" label
- (meeting_page_construct): Fix padding of GtkScrolledWindow widget
- Set the mnemonic widget for the "Attendees" label
-
- * gui/dialogs/meeting-page.glade: Fix HIG spacing to be correct
- Fix the mnemonic for "Organizer" to not conflict
- Add mnemonic for "Attendees"
-
- * gui/dialogs/task-page.glade: Add mnemonic for "Description"
-
-2004-07-26 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/calendar-setup.c (calendar_setup_edit_calendar): set
- a different title if we are editing; de-sensitize option menu if
- we are editing
- (calendar_setup_edit_task_list): set a different title if we are editing
-
- * gui/dialogs/calendar-setup.glade: use task list instead of tasks
- group
-
- * gui/tasks-component.c (impl__get_userCreatableItems): add
- assigned task as an item, use task list instead of tasks group
-
- * gui/calendar--component.c (impl__get_userCreatableItems): fiddle
- with shortcuts
-
-2004-07-25 pchenthill <pchenthill@novell.com>
-
- Fixes #59983
- If the ecal component is already loaded, check for the participation
- status of the attendee and display the menu for selecting the
- calendar.
-
-2004-07-23 JP Rosevear <jpr@ximian.com>
-
- Fixes #61571
-
- * gui/e-week-view.c (e_week_view_start_editing_event): if the
- event moves, find it again using the model data as the invariant
- and then find the span again
-
-2004-07-23 JP Rosevear <jpr@novell.com>
-
- Fixes #61760
-
- * gui/e-cal-model.c (add_new_client): don't check against the URI,
- just against the client
-
-2004-07-23 pchenthill <pchenthill@novell.com>
-
- * Retracting the commit made below for #59983 as it has
- results in crash some cases
-
-2004-07-23 pchenthill <pchenthill@novell.com>
-
- Fixes #59983
- * gui/e-itip-control.c (show_current_event):
- If the ecal component is already loaded, check for the participation
- status of the attendee and display the menu for selecting the
- calendar.
-
-2004-07-22 Larry Ewing <lewing@ximian.com>
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_style_set):
- fix the row heights and tweek the offsets so that things come out
- OK.
-
-2004-07-21 JP Rosevear <jpr@novell.com>
-
- Fixes #61776
-
- * gui/e-calendar-table.c (clipboard_get_text_cb): make sure the
- text is not NULL
-
-2004-07-21 JP Rosevear <jpr@novell.com>
-
- Fixes #61738
-
- * gui/dialogs/meeting-page.c (clear_widgets): by default we have a
- user as organizer
- (sensitize_widgets): use user_org to determine widget sensitivity
- (meeting_page_fill_widgets): set user_org value appropriately
- (change_clicked_cb): set user_org to TRUE
-
-2004-07-21 JP Rosevear <jpr@novell.com>
-
- Fixes #61779
-
- * gui/dialogs/task-page.c (init_widgets): listen for changes on
- start and due dates
-
- * gui/dialogs/task-details-page.c (init_widgets): listen for
- changes on completion date
-
-2004-07-20 Not Zed <NotZed@Ximian.com>
-
- * gui/e-cal-model.c:
- * importers/icalendar-importer.c:
- * gui/dialogs/select-source-dialog.c:
- * gui/dialogs/copy-source-dialog.c:
- * gui/alarm-notify/util.c:
- * common/authentication.c:
- * gui/migration.c: include config.h. See #61395.
-
-2004-07-16 JP Rosevear <jpr@novell.com>
-
- Fixes #61451
-
- * gui/e-itip-control.c (get_cancel_options): don't give a cancel
- option if the event is no where to be found
- (show_current_event): pass in kind
- (show_current_todo): ditto
-
-2004-07-16 Larry Ewing <lewing@ximian.com>
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_style_set):
- fix the row heights and tweek the offsets so that things come out
- OK.
-
-2004-07-16 Larry Ewing <lewing@ximian.com>
-
- * gui/calendar-component.c (set_info): use short month forms to
- limit the maximum width of the label.
-
-2004-07-15 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #57142
-
- * gui/e-day-view.c (e_day_view_on_editing_stopped): commit the
- sequence on the object before sending it to the backend.
- (e_day_view_add_event): s/abort_sequence/commit_sequence.
-
- * gui/e-week-view.c (e_week_view_on_editing_stopped): commit the
- sequence here also.
- (e_week_view_add_event): s/abort_sequence/commit_sequence.
-
- * gui/comp-util.c (cal_comp_event_new_with_current_time): don't
- commit the sequence here.
-
-2004-07-14 JP Rosevear <jpr@novell.com>
-
- Fixes #61572
-
- * gui/dialogs/schedule-page.c (times_changed_cb): call notify
- changed
-
- * gui/dialogs/comp-editor.c (page_summary_changed_cb): no need to
- mark the editor changed here, it doesn't do the right thing anyhow
- (page_dates_changed_cb): ditto
-
-2004-07-14 JP Rosevear <jpr@novell.com>
-
- Fixes #60678
-
- * gui/dialogs/cancel-comp.c (cancel_component_dialog): flip the
- messages around, the "deleting" flag means something else is doing
- the deleting
-
-2004-07-12 JP Rosevear <jpr@novell.com>
-
- Fixes #57287, 58748
-
- * gui/tasks-component.c (source_added_cb): if the source was
- added in the main calendar, select it because the user caused this
- to happen by creating a task
- (create_component_view): listen for source_added signal on the
- tasks
-
- * gui/gnome-cal.c (view_selection_changed_cb): if the user created
- a task, make sure we are displaying the relevant event list
- (set_timezone): set the default zone of the default client
- (setup_widgets): listen for the user_created signal
- (gnome_calendar_destroy): clean up default client
- (client_cal_opened_cb): disconnect from the open signal
- (default_client_cal_opened_cb): set the default client on the
- models
- (open_ecal): make the callback function a param
- (gnome_calendar_add_source): include the default client when
- searching for an existing client
- (gnome_calendar_set_default_source): make the default client
- independent of the rest of the clients
-
- * gui/e-week-view.c (e_week_view_on_editing_stopped): emit
- user_created signal
-
- * gui/e-tasks.c (user_created_cb): if the user created a task,
- make sure we are displaying the relevant task list
- (set_timezone): set the timezone on the client
- (setup_widgets): listen for user_created signal
- (e_tasks_destroy): unref default client
- (default_client_cal_opened_cb): set the default on the model when
- it opens
- (open_ecal): open a task list
- (e_tasks_add_todo_source): include the default client when
- searching for an existing client
- (e_tasks_set_default_source): make the default client independent
- of the rest of the clients
-
- * gui/e-day-view.c (e_day_view_on_editing_stopped): emit
- user_created signal
-
- * gui/e-calendar-view.h: add signal proto
-
- * gui/e-calendar-view.c (e_calendar_view_class_init): add
- user_created signal
-
- * gui/e-calendar-table.h: add signal proto
-
- * gui/e-calendar-table.c (e_calendar_table_class_init): add
- user_created signal
- (row_appended_cb): if row is appended, emit user_created signal
- (e_calendar_table_init): listen for row_appended signal
-
- * gui/e-cal-model.h: add signal proto
-
- * gui/e-cal-model.c (e_cal_model_class_init): add row_appended
- signal
- (ecm_append_row): don't leak, emit row appended signal
- (e_cal_model_set_default_client): remove the existing default if
- it was only used as the default
- (update_e_cal_view_for_client): short circuit query create
- (add_new_client): look for an existing client and update its
- record if found, handle opening things here
- (e_cal_model_add_client): just call add_new_client
- (remove_client_objects): just remove a client's objects
- (remove_client): use above, handle removal of client if its
- default
-
- * gui/calendar-component.c (source_added_cb): if the source was
- added in the main calendar, select it because the user caused this
- to happen by creating an appointment
- (create_component_view): listen for source_added signal on the
- calendar
-
-2004-07-08 Radek Doulik <rodo@ximian.com>
-
- * gui/e-cal-model.c (e_cal_model_date_value_to_string): as below
-
- * gui/e-cal-model-calendar.c (ecmc_value_to_string): as below
-
- * gui/e-cal-model.c (ecm_value_to_string): as below
-
- * gui/e-cal-model-tasks.c (ecmt_value_to_string): dup the string
- value, it's free-ed later. instead of returning NULL return
- g_strdup ("") as gal does
-
- Fixes #56271
-
-2004-07-12 Rodney Dawes <dobey#novell.com>
-
- * gui/e-tasks.c (pane_realized): Add this callback so we can set the
- paned position on realize
- (setup_widgets): Move the paned widget to the priv structure so that
- we can access it elsewhere
- (display_view_cb): Set the paned position when the view gets displayed
-
- Fixes #55653
-
-2004-07-12 Rodney Dawes <dobey@novell.com>
-
- * gui/dialogs/recur-comp.c (recur_component_dialog):
- Update the layout of the dialog to be more usable
-
- Partially fixes #56171
-
-2004-07-11 Jürg Billeter <j@bitron.ch>
-
- * gui/dialogs/event-page.c (event_page_fill_component):
- busy should be opaque, not transparent
-
-2004-07-09 Rodrigo Moya <rodrigo@novell.com>
-
- Revert my patches from July 5th and 6th.
-
- * gui/gnome-cal.c (gnome_calendar_init): call setup_config/widgets
- in the previous order.
- (setup_widgets): set the timezone on the views when creating them.
- (set_timezone): no need to set the timezone on the views here.
- (client_cal_opened_cb): removed call to set_timezone().
-
-2004-07-09 Rodney Dawes <dobey@novell.com>
-
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw_triangle):
- Add an argument for the event_num so we can get the event object
- Draw the left/right triangles with the right color for the event
- Fix a small alignment bug with the triangle points
-
- * gui/e-week-view-event-item.c (e_week_view_event_item_draw_triangle):
- Draw the left/right triangles with the right color for the event
- Fix a small alignment bug with the triangle points
-
-2004-07-09 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #60289
-
- * gui/dialogs/select-source-dialog.c (select_source_dialog): set the
- absolute URI on the selected source, so that the ESource we keep
- around has a valid URI.
-
- * gui/e-calendar-view.c (transfer_item_to): when copying appointments,
- change the UID.
- (transfer_selected_items): don't pass hardcoded values to transfer_item_to.
-
-2004-07-08 Frederic Crozat <fcrozat@mandrakesoft.com>
-
- * gui/Makefile.am:
- tarball should ship .schemas.in.in files, not generated files.
-
-2004-07-06 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/gnome-cal.c (gnome_calendar_init): setup the widgets before
- the configuration.
-
-2004-07-06 JP Rosevear <jpr@novell.com>
-
- Fixes #60645
-
- * gui/e-calendar-view.c (e_calendar_view_new_appointment_full):
- guess when an item should be all day based on the selection time
-
-2004-07-05 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/gnome-cal.c (setup_widgets): don't set the timezone on the views
- here.
- (set_timezone): do it here.
- (client_cal_opened_cb): call set_timezone() here.
-
-2004-07-02 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/gnome-cal.c (set_view): update the internal current_view_type
- field and focus the newly selected view.
-
-2004-07-02 Rodney Dawes <dobey@novell.com>
-
- * gui/dialogs/url-editor-dialog.c (get_widgets):
- Get the label for the calendar list header also
- (init_widgets): Set the border widths for the dialog's vbox and
- action area to be more compliant with the HIG
- Set the mnemonic widget for the calendar label, to the Source Selector
- Remove the unneeded settings for the scrolled window, these are in the
- glade xml for the widget
- Set the icon list on the correct dialog widget, not the settings dialog
-
- * gui/dialogs/url-editor-dialog.h:
- Add the calendar_list_label widget here so we can access it
-
- * gui/dialogs/url-editor-dialog.glade:
- Change the dialog's layout to be HIG compliant and fix some strings
- to do the same
- Add mnemonics to all the labels that are associated with widgets
-
-2004-06-29 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/e-tasks.c (e_tasks_add_todo_source)
- (e_tasks_remove_todo_source) : store and lookup clients
- based on ESource uid instead of uri in priv->clients
-
-2004-06-28 Not Zed <NotZed@Ximian.com>
-
- * gui/tasks-component.c (impl__get_userCreatableItems): same.
-
- * gui/calendar-component.c (impl__get_userCreatableItems): fix up
- shortcuts. #56746.
-
-2004-06-25 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/alarm-dialog.glade: don't show option tabs
-
-2004-06-25 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/task-editor.c (task_editor_construct): use "Task"
- instead of "Basic"
-
- * gui/dialogs/event-editor.c (event_editor_construct): use
- "Invitations" instead of "Meeting"
-
-2004-06-25 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/e-delegate-dialog.glade: use "Contacts..."
-
- * gui/dialogs/alarm-dialog.glade: add custom message email toggle
-
- * gui/dialogs/alarm-dialog.c (get_widgets): get custom email
- message toggle
- (check_custom_email): check the custom message when setting
- sensitivity of OK button
- (malarm_message_toggled_cb): check custom email
- (malarm_description_changed_cb): ditto
- (action_selection_done_cb): ditto
-
-2004-06-25 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/alarm-dialog.c (alarm_to_dialog): set the default
- address here if possible
- (dialog_to_alarm): don't set it here
- (check_custom_email): check for To: entries
- (malarm_addresses_changed_cb): update when the text in the to
- entry changes
- (action_selection_done_cb): for the custom email settings
- (init_widgets): listen for email To: changes
- (alarm_dialog_run): only save the alarm if the response was "OK"
-
-2004-06-25 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/event-page.c (event_page_init): init alarm interval
- to -1
- (clear_widgets): give the alarm time option menu a sensible
- default
- (is_custom_alarm): account for the user defined alarm time if it
- doesn't match the default set
- (event_page_fill_widgets): default the option menu to the 15
- minute or user define alarm if no alarm is currently set
- (event_page_fill_component): account for the user defined alarm
- tme
- (init_widgets): add in the user defined alarm time if it doesn't
- match the default set
-
-2004-06-25 JP Rosevaer <jpr@novell.com>
-
- * gui/dialogs/alarm-dialog.c (palarm_widgets_to_alarm): the args
- are optional, don't store them if they aren't there
- (check_custom_sound): sensitize the ok button based on whether or
- not there needs to be input
- (check_custom_message): ditto
- (check_custom_program): ditto
- (dalarm_message_toggled_cb): check custom message
- (dalarm_description_changed_cb): ditto
- (aalarm_sound_toggled_cb): check custom sound
- (aalarm_attach_changed_cb): ditto
- (palarm_program_changed_cb): check custom program
- (action_selection_done_cb): use above checks as appropriate
- (init_widgets): listen for changed signals
-
-2004-06-25 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/event-page.c (event_page_finalize): free old_summary
- (is_custom_alarm): take description into account when checking for
- custom alarm
- (is_custom_alarm_uid_list): pass old_summary
- (is_custom_alarm_store): ditto
- (is_custom_alarm_store): ditto
- (sensitize_widgets): ditto
- (event_page_fill_component): ditto
- (event_page_fill_widgets): store the initial summary
- (alarm_changed_cb): make sure the needs description property gets
- set on the default alarm
- (alarm_custom_clicked_cb): copy the current store in case the user
- hits cancel, if all the alarms are erased uncheck the alarm toggle
-
- * gui/dialogs/alarm-dialog.glade: add toggles for custom messages
- and sound
-
- * gui/dialogs/alarm-dialog.c (aalarm_widgets_to_alarm): store
- custom sound only if the toggle is checked
- (dalarm_widgets_to_alarm): store custom message only if toggle is
- checked
- (get_widgets): load new widgets
- (aalarm_sound_toggled_cb): sensitize sound entry
- (dalarm_message_toggled_cb): sensitize message entry
- (init_widgets): listen for toggle signals
-
-2004-06-24 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/alarm-list-dialog.c (selection_changed_cb):
- sensitize the buttons
- (init_widgets): listen for selection changes so we can delete
- alarms
-
-2004-06-24 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/event-page.c (event_page_fill_component): store all
- the custom alarms
- (alarm_custom_clicked_cb): emit changed signal if necessary
-
- * gui/dialogs/alarm-list-dialog.c (alarm_list_dialog_run): return
- true/false based on button pushed
-
- * gui/dialogs/alarm-dialog.c: move repeat options and per alarm
- type options here
-
- * gui/dialogs/alarm-dialog.glade: ditto
-
- * gui/dialogs/Makefile.am: remove alarm options dialog
-
-2004-06-24 Rodney Dawes <dobey@novell.com>
-
- * gui/calendar-component.c (create_component_view):
- * gui/tasks-component.c (create_component_view):
- Add a call to e_source_selector_set_select_new here so that we can
- select new sources when we create them
-
-2004-06-23 Jeffrey Stedfast <fejj@novell.com>
-
- * conduits/todo/todo-conduit.c: Bump the version to 0.1.5 to help
- track down bug #59726.
-
-2004-06-23 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/comp-editor.c (comp_editor_init): set the window
- type hint to normal so it can go below the shell window
-
-2004-06-23 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/dialogs/comp-editor.c (comp_editor_notify_client_changed):
- fixed gtk-doc comments and made it enable/disable the dialog's
- OK button depending on the selected source.
-
-2004-06-23 Rodney Dawes <dobey@novell.com>
-
- * gui/calendar-component.c: Revert previous change to add the
- callbacks for notification of calendar selection changes
- (create_new_view): Update the comment for watching notification on
- the tasks selection to state it is for the mini tasks view
-
-2004-06-23 JP Rosevear <jpr@novell.com>
-
- Fixes #57862
-
- * gui/gnome-cal.c (connect_day_view_focus): connect after the
- focus events happen so the day view knows what is selected
-
-2004-06-23 JP Rosevear <jpr@novell.com>
-
- * gui/e-itip-control.c (update_attendee_status): tidy up to work
- again
- (ok_clicked_cb): use above when replying
-
-2004-06-23 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/meeting-page.c (remove_attendee): util function to
- do the actual removal
- (remove_attendee_at_row): ditto based on row number
- (remove_clicked_cb): make the remove button work
- (popup_delete_cb): use utility routines to do removal
- (button_press_event): do the icon properly
-
-2004-06-22 Rodney Dawes <dobey@novell.com>
-
- * gui/calendar-component.c (config_calendars_selection_changed_cb):
- (config_primary_calendar_selection_changed_cb):
- Add these two callbacks so that we can update the selection in the
- calendar when the gconf key changes, like we do for tasks
-
- (create_component_view): Register the two callbacks that we created
- for updating the selection in the view, and their notification IDs
-
-
-2004-06-22 JP Rosevear <jpr@novell.com>
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_construct):
- clean up mnemonic handling and put the proper icon in the contacts
- button
-
-2004-06-22 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/recurrence-page.glade: fix mnemonics
-
- * gui/dialogs/event-page.glade: ditto
-
-2004-06-22 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/comp-editor.c: kill warnings
-
-2004-06-22 JP Rosevear <jpr@novell.com>
-
- * gui/calendar-component.c (create_new_event): kill warning
-
-2004-06-22 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/dialogs/Makefile.am: removed alarm-page.*.
-
-2004-06-22 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/Makefile.am, gui/dialogs/alarm-dialog.c,
- gui/dialogs/alarm-dialog.glade, gui/dialogs/alarm-dialog.h,
- gui/dialogs/alarm-list-dialog.c,
- gui/dialogs/alarm-list-dialog.glade,
- gui/dialogs/alarm-list-dialog.h, gui/dialogs/alarm-options.c,
- gui/dialogs/alarm-options.h, gui/dialogs/alarm-page.c,
- gui/dialogs/alarm-page.glade, gui/dialogs/alarm-page.h,
- gui/dialogs/comp-editor.c, gui/dialogs/comp-editor.h,
- gui/dialogs/event-editor.c, gui/dialogs/event-page.c,
- gui/dialogs/event-page.glade, gui/dialogs/meeting-page.c,
- gui/dialogs/meeting-page.glade, gui/dialogs/recurrence-page.c,
- gui/dialogs/recurrence-page.glade,
- gui/dialogs/task-details-page.c,
- gui/dialogs/task-details-page.glade, gui/dialogs/task-editor.c,
- gui/dialogs/task-page.c, gui/dialogs/task-page.glade: HIGify and
- newer design; alarm page is gone, Cancel/OK buttons for the
- dialog, no more menus; slightly improve read-only workings for
- entry areas
-
-2004-06-22 JP Rosevear <jpr@novell.com>
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_construct):
- rename widgets to be consistent with those else where
- (e_meeting_time_selector_set_read_only): cast properly
- (e_meeting_time_selector_on_invite_others_button_expose): remove,
- the widget sensitization is taken care of elsewhere
-
-2004-06-22 Larry Ewing <lewing@ximian.com>
-
- Fixes #59824
-
- * gui/e-week-view.h: increase some of the passing so that the text
- does not appear to run together. Ideally this would be based on
- the font size but this will work for now.
-
-2004-06-21 Rodney Dawes <dobey@novell.com>
-
- Fixes #56892
-
- * gui/dialogs/select-source-dialog.c (row_activated_cb): Add this
- callback to activate the OK button when we double-click or press
- the Enter key on a row
- (select_source_dialog): Change the default size to be reasonable
- Use ensure_style instead of realize on the dialog
- Set the default response for the dialog to OK
- Fix the packing of the group label to not have extraneous padding
- Connect up the callback for row_activated
-
-2004-06-18 Jeffrey Stedfast <fejj@novell.com>
-
- Fixes bug #57592
-
- * conduits/calendar/calendar-conduit.c (pre_sync): Same as below.
-
- * conduits/todo/todo-conduit.c (pre_sync):
- s/wombat/evolution-data-server/g
-
-2004-06-18 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #58747
-
- * gui/dialogs/comp-editor.c (prompt_to_save_changes): if the source
- is read only, don't prompt the user.
-
-2004-06-18 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #56323
-
- * gui/calendar-component.c (create_new_event): removed read-only
- check, just call the editor with the currently selected client and
- let it do the job.
-
- * gui/tasks-component.c (create_new_todo): ditto.
-
-2004-06-18 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #60293
-
- * gui/dialogs/recurrence-page.c (type_toggled_cb): make sure
- we enable/disable correctly the 'Add' button.
-
-2004-06-17 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * gui/itip-utils.c (itip_publish_comp) : check for
- host being non-NULL in soup uri. host can be null
- for uri's of the form file:/foo or http:/foo etc
-
-2004-06-17 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #60309
-
- * gui/meeting-page.c (sensitize_widgets): moved up in the file, to
- be declared before any use.
-
-2004-06-16 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-itip-control.c: use e-util's HTML conversion function,
- instead of camel's.
- (write_html): use e_text_to_html_full().
-
-2004-06-15 JP Rosevear <jpr@novell.com>
-
- Fixes #56197
-
- * gui/e-cal-list-view.etspec: add back categories
-
- * gui/e-calendar-table.etspec: ditto
-
-2004-06-15 JP Rosevear <jpr@novell.com>
-
- Fixes #59401
-
- * gui/e-week-view.c (e_week_view_on_text_item_event): if we are
- editing the event, don't ignore the right click, stop editing the
- event and continue on
-
-2004-06-15 JP Rosevear <jpr@novell.com>
-
- Fixes #57393
-
- * gui/e-week-view.c (e_week_view_set_compress_weekend): redraw the
- titles as well since the spacing is different
-
-2004-06-15 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/dialogs/meeting-page.c (meeting_page_construct): connect
- to "client_changed" signal on the page.
- (client_changed_cb): new callback.
- (sensitize_widgets): new function.
- (meeting_page_fill_widgets): call sensitize_widgets().
-
- * gui/e-meeting-time-sel.[ch]
- (e_meeting_time_selector_set_read_only): new function.
- (e_meeting_time_selector_construct): store some missing buttons
- in the EMeetingTimeSelector structure.
-
- * gui/dialogs/schedule-page.c (schedule_page_construct):
- connect to "client_changed" signal on the page.
- (client_changed_cb): new callback.
- (sensitize_widgets): new function.
- (schedule_page_fill_widgets): call sensitize_widgets().
-
-2004-06-10 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-cal-model.c (e_cal_view_objects_modified_cb): removed
- g_assert call, since we shouldn't crash when getting wrong
- notifications from a backend.
-
-2004-06-10 JP Rosevear <jpr@novell.com>
-
- * gui/gnome-cal.c
- (gnome_calendar_on_date_navigator_selection_changed): only do the
- range selected hack in one case
-
-2004-06-10 JP Rosevear <jpr@novell.com>
-
- * gui/gnome-cal.c (setup_widgets): set 6 weeks shown
- (display_view): ditto
-
-2004-06-10 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #58748
-
- * gui/gnome-cal.c (setup_widgets): set the timezone on all views
- when creating them.
-
-2004-06-10 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-calendar-table.c (e_calendar_table_init): don't set
- the "bg_color_column" property on the ECellToggle class.
-
-2004-06-10 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #58799
-
- * gui/e-calendar-view.c (e_calendar_view_delete_selected_occurrence):
- Use the timezone for getting the RECUR-ID from the instance start
- date if available. Also, use dates only as the recurrence ID, and
- do nothing if not a recurrent appointment.
-
-2004-06-09 JP Rosevear <jpr@novell.com>
-
- Fixes #59242, #57404, ##55394
-
- * gui/gnome-cal.c (get_times_for_views): calculate the work week,
- week, and month views more exactly
- (update_adjustment): update the view based on week view scrolling
- (setup_widgets): listen for the scroll bar moving on the week
- views
- (gnome_calendar_update_date_navigator): adjust for compressed
- weekends in the month view
- (gnome_calendar_on_date_navigator_selection_changed): ditto
-
- * gui/e-week-view.h: add protos
-
- * gui/e-week-view.c (time_range_changed_cb): calculate the
- base_date and first_day_shown more simply, allows multi-week
- selection to work better; update the base date when told to do so
- (e_week_view_init): init update_base_value var
- (e_week_view_get_update_base_date): accessor
- (e_week_view_set_update_base_date): ditto
-
-2004-06-08 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #57578
-
- * gui/e-calendar-view.c (on_move_to, on_copy_to): simplified to
- just call transfer_selected_items() with the approppriate
- arguments.
- (transfer_selected_items): new function to transfer all selected
- items to another calendar.
- (transfer_item_to): added missing implementation.
-
-2004-06-08 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #57579
-
- * gui/dialogs/select-source-dialog.c (select_source_dialog): start
- with the OK button disabled.
- (primary_selection_changed_cb): enable/disable the OK button depending
- on the selection on the ESourceSelector.
-
-2004-06-08 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/dialogs/comp-editor.[ch] (comp_editor_notify_client_changed):
- new function for notifying all pages of the client change.
- (page_client_changed_cb): no need for this callback.
- (comp_editor_append_page): no need to connect to "client_changed"
- signal on the pages.
-
- * gui/dialogs/comp-editor-page.c
- (comp_editor_page_notify_client_changed): re-added the call to
- comp_editor_page_set_e_cal(), the client was not being set anywhere.
-
- * gui/dialogs/event-page.c (source_changed_cb): use
- comp_editor_notify_client_changed() so that all pages get informed
- of the client change.
-
- * gui/dialogs/task-page.c (source_changed_cb): ditto.
-
-2004-06-08 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/dialogs/comp-editor-page.c
- (comp_editor_page_notify_client_changed): do not set the private
- client here, it is set in comp-editor.c.
-
- * gui/dialogs/event-page.c (sensitize_widgets): new function.
- (source_changed_cb): call sensitize_buttons().
-
- * gui/dialogs/recurrence-page.c (sensitize_buttons): new
- function, to deal correctly with the sensitivity of all widgets
- in the page.
- (recurrence_page_fill_widgets, type_toggled_cb, client_changed_cb):
- call sensitize_buttons() instead of sensitize_recur_widgets().
- (recurrence_page_construct): g_signal_connect_after for
- "client_changed", to get notifications after CompEditorPage
- gets his.
-
- * gui/dialogs/alarm-page.c (sensitize_buttons): sensitize the missing
- widgets in the page.
- (alarm_page_construct): g_signal_connect_after for "client_changed",
- to get notifications after CompEditorPage gets his.
-
-2004-06-08 JP Rosevear <jpr@novell.com>
-
- * gui/e-week-view.c (e_week_view_do_key_press): cast week view
- correctly
-
-2004-06-08 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/dialogs/recurrence-page.c (recurrence_page_construct): connect
- to "client_changed" signal on the page.
- (client_changed_cb): new callback.
-
- * gui/dialogs/alarm-page.c (sensitize_buttons): fixed missing stuff
- in last commit.
-
-2004-06-08 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #59650
-
- * gui/dialogs/alarm-page.c (alarm_page_construct): connect to
- "client_changed" signal on the page.
- (client_changed_cb): new callback.
- (sensitize_buttons): added code for dealing with read only calendars
- and disable/enable buttons approppriately.
-
-2004-06-07 Dan Winship <danw@novell.com>
-
- * gui/dialogs/comp-editor.c (pixmaps): s/stock_save_as/stock_save-as/
-
-2004-06-07 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-tasks.c (e_tasks_add_todo_source): open task lists
- asynchronously.
- (client_cal_opened_cb): callback from the client when opened.
-
- * gui/gnome-cal.c (client_cal_opened_cb): disconnect from all
- signals of the client when opening it fails. Clean up the status
- messages correctly, based on source type.
- (open_ecal): for tasks, use e_calendar_table_set_status_message
- not e_calendar_view_set_status_message.
- (gnome_calendar_remove_source_by_uid): call update_query only when
- removing calendars, not tasks lists.
- (update_query): set meaningful status messages.
-
-2004-06-06 Vardhman Jain <vardhman@students.iiit.net>
-
- * Bug #36247
- * gui/e-itip-control.c (write_html, set_date_label):
- Changes to improve the performance of _(str) function call on strings
- str of the type <tar>str</tag> to avoid translation of tag.
-
-2004-06-04 <jpr@novell.com>
-
- * gui/gnome-cal.c: define G_MAXINT32 if it isn't already
-
-2004-06-04 JP Rosevear <jpr@novell.com>
-
- Fixes #58739
-
- * gui/migration.c (migrate_calendars): guard against NULL
- gconf_val
-
-2004-06-04 JP Rosevear <jpr@novell.com>
-
- Fixes #59058
-
- * gui/gnome-cal.c (gnome_calendar_purge): make purging actually
- work
-
-2004-06-04 JP Rosevear <jpr@novell.com>
-
- * gui/dialogs/task-page.c (task_page_fill_widgets): guard
- against the text value being NULL
-
- * gui/dialogs/event-page.c (event_page_fill_widgets): add guards
- here as well
-
-2004-06-03 Jeffrey Stedfast <fejj@novell.com>
-
- * conduits/calendar/calendar-conduit.c
- (calconduit_load_configuration): If the last_uri string value is
- the Evolution 1.4 URI, change it to the new URI. Fixes bug #54134.
-
-2004-06-03 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #59481
-
- * gui/e-tasks.c (set_status_message): don't use vsprintf with
- NULL strings, crashes on FreeBSD.
-
-2004-06-03 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/dialogs/comp-editor-page.c
- (comp_editor_page_notify_client_changed): update the internal client
- when it changes.
-
-2004-06-03 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #56875
-
- * gui/dialogs/event-editor.c (event_editor_construct): connect to
- "client_changed" signal on the EventPage.
- (client_changed_cb): set menu sensibility when the client changes.
-
- * gui/dialogs/task-editor.c (task_editor_construct): connect to
- "client_changed signal on the TaskPage.
- (client_changed_cb): set menu sensibility when the client changes.
-
-2004-06-02 JP Rosevear <jpr@novell.com>
-
- * gui/alarm-notify/alarm-notify.c (process_removal_in_hash): free
- the correct uri, preventing bad memory corruption
- (list_changed_cb): track the removals in a list so we don't
- clobber the hash table data during the foreach loop
-
-2004-06-02 Chris Toshok <toshok@ximian.com>
-
- * gui/migration.c (migrate_calendars): remove absolute_uri from
- ESource's.
- (migrate_tasks): same.
-
-2004-06-02 Rodrigo Moya <rodrigo@novell.com>
-
- * gui/e-meeting-list-view.c (start_addressbook_server): removed
- pre-completion code, not needed anymore.
- (emlv_finalize): no need to unref the book anymore.
- (emlv_init): don't call start_addressbook_server.
-
- * gui/dialogs/copy-source-dialog.c (copy_source): fixed
- leak and pass the correct icalcomponent to e_cal_modify_object.
-
-2004-06-02 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #59333
-
- * gui/dialogs/task-page.c (task_page_fill_widgets): guard against
- list items being NULL.
-
-2004-06-02 Larry Ewing <lewing@ximian.com>
-
- * gui/e-tasks.c (table_drag_data_delete): add a drag delete handler.
- (table_drag_data_get): support text/vcard drags.
- (setup_widgets): setup the etable as a drag source.
-
- * gui/tasks-component.c: add source selector Drag & Drop handlers.
-
-2004-06-01 Larry Ewing <lewing@ximian.com>
-
- * gui/dialogs/calendar-setup.c: rename can_add to is_mutable, add
- sensitivity logic for both readonly and mutable cases. The
- esource attributes are a complete mess and need discussion.
-
- * gui/dialogs/calendar-setup.glade: remove edit dialogs and name
- the tables.
-
-
-2004-06-01 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #59369
-
- * gui/e-calendar-view.c (clipboard_get_text_cb): don't pass NULL strings
- to libical functions.
-
-2004-05-31 Priyanshu Raj <Priyanshu@students.iiit.net>
-
- * Bug #51968 "Invite others.." button confusing in Appointment
- editor dialog(Fixed)"
-
-2004-05-29 Priyanshu Raj <priyanshu@students.iiit.net>
-
- * Bug #48134: Menu items in Scheduling tab should have sentence
- capitalization (Fixed)
-
-2004-05-28 Kidd Wang <kidd.wang@sun.com>
-
- * gui/e-week-view.c: (e_week_view_event_move),
- (e_week_view_get_day_offset_of_event): a more straightforward way
- to calculate the offset of a day within the week.
-
-2004-05-26 Jeffrey Stedfast <fejj@novell.com>
-
- Fix for bug #57818.
-
- * gui/e-tasks.c (setup_widgets): Same.
-
- * gui/gnome-cal.c (setup_widgets): Updated to pass a set of
- bitflags to cal_search_bar_new().
-
- * gui/cal-search-bar.c (cal_search_bar_new): Now takes a bit flag
- argument specifying which search options to present.
- (cal_search_bar_construct): Same as above. Construct the search
- menu to use based on the bit flags.
-
- * gui/apps_evolution_calendar.schemas.in.in: Changed the default
- "Tasks due today" colour to be a light-blue (one of the default
- colour values in the colour picker dialog). Fixes bug #53412.
-
-2004-05-26 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #57759
-
- * gui/gnome-cal.c (gnome_calendar_remove_source_by_uid): remove all
- queries we've got for the removed source.
-
-2004-05-26 Kidd Wang <kidd.wang@sun.com>
-
- * gui/e-week-view.c: (e_week_view_event_move),
- (e_week_view_get_day_offset_of_event): a more straightforward way
- to calculate the offset of a day within the week.
-
-2004-05-26 Kidd Wang <kidd.wang@sun.com>
-
- * gui/e-week-view.c: (e_week_view_event_move),
- (e_week_view_change_event_time): In week view all-day events should
- keep all-dayness when moved around.
-
-2004-05-25 Larry Ewing <lewing@ximian.com>
-
- * gui/dialogs/calendar-setup.c: remove now unused functions.
- (source_group_can_add): fix can add logic, remove more unused
- functions.
-
- * gui/dialogs/calendar-setup.c (calendar_setup_edit_task_list):
- use the new dialog.
- (calendar_setup_edit_calendar): use the new dialog.
- (key_press_event): look for escape press and destroy dialog.
-
-2004-05-25 Jeffrey Stedfast <fejj@novell.com>
-
- * gui/dialogs/url-editor-dialog.c (init_widgets): Use
- gtk_window_set_icon_list() here instead of gtk_window_set_icon().
-
- * gui/dialogs/select-source-dialog.c (select_source_dialog): Use
- gtk_window_set_icon_list() here instead of gtk_window_set_icon().
-
- * gui/dialogs/calendar-setup.c (source_to_dialog): Huh?? Why are
- integer colours in an array of char*? Fixed to be an array of
- guint32.
-
- * gui/dialogs/changed-comp.c (changed_component_dialog): Use
- gtk_window_set_icon_list() here instead of gtk_window_set_icon().
-
- * gui/dialogs/calendar-setup.c (calendar_setup_new_calendar):
- Don't bother calling tk_window_set_icon() if we are gonna call
- gtk_window_set_icon_list a few lines later.
- (calendar_setup_edit_calendar): Same.
- instead.
- (calendar_setup_new_task_list): Same.
- (calendar_setup_edit_task_list): Same.
-
- * gui/dialogs/alarm-options.c (alarm_options_dialog_run): Use
- gtk_window_set_icon_list() instead of gtk_window_set_icon() so gtk
- can do the Right Thing (tm).
-
-2004-05-25 Jeffrey Stedfast <fejj@novell.com>
-
- * Makefile.am: Make calendar-errors.xml.h and install the xml
- file.
-
- * calendar-errors.xml: New error definitions file.
-
- * gui/gnome-cal.c (backend_died_cb): Use e-error
-
- * gui/e-tasks.c (backend_died_cb): Use e-error
-
- * gui/dialogs/send-comp.c (send_component_dialog): Use e-error
-
- * gui/dialogs/save-comp.c (save_component_dialog): Use e-error
-
- * gui/dialogs/delete-comp.c (delete_component_dialog): Use e-error
-
- * gui/dialogs/cancel-comp.c (cancel_component_dialog): Use e-error
-
-2004-05-25 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * common/authentication.c (auth_func_cb): read the "auth-domain"
- property to use as component name for e-password calls instead of
- hard coded component name
-
-2004-05-25 Trent Lloyd <lathiat@bur.st>
-
- Fixes: #57472
-
- * gui/dialogs/alarm-options.c:
- * gui/dialogs/calendar-setup.c:
- * gui/dialogs/cancel-comp.c:
- * gui/dialogs/changed-comp.c:
- * gui/dialogs/delete-comp.c:
- * gui/dialogs/delete-error.c:
- * gui/dialogs/save-comp.c:
- * gui/dialogs/select-source-dialog.c:
- * gui/dialogs/send-comp.c
- * gui/dialogs/url-editor-dialog.c:
- - Add include of e-icon-factory.h
- - Set icon on window to be calendar/tasks icon rather than mail icon
-
-2004-05-21 Larry Ewing <lewing@ximian.com>
-
- * gui/dialogs/calendar-setup.c: set the dialog icons appropriately
- for add task and calendar dialogs.
-
-2004-05-21 Larry Ewing <lewing@ximian.com>
-
- * gui/dialogs/calendar-setup.c: remove references to the uri
- buttons.
-
- * gui/dialogs/calendar-setup.glade: remove uri buttons, make add
- task window wider and make the button spacing larger.
-
-2004-05-21 H P Nadig <hpnadig@pacific.net.in>
-
- * gui/dialogs/calendar-setup.glade: Adjusted the default size of
- New Calendar Dialog. Fixes 57469.
-
-2004-05-20 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (find_server): proper look for figuring out
- if the object is on the server
-
-2004-05-20 JP Rosevear <jpr@novell.com>
-
- * gui/tag-calendar.c (tag_calendar_by_comp): pass the client
- properly
-
-2004-05-19 Chris Toshok <toshok@ximian.com>
-
- * gui/e-meeting-store.c (start_addressbook_server): use the new
- e_book_new_* and e_book_open apis.
-
- * gui/e-meeting-list-view.c (start_addressbook_server): use the
- new e_book_new_* and e_book_open apis.
-
-2004-05-19 William Jon McCann <mccann@jhu.edu>
-
- * gui/GNOME_Evolution_Calendar.server.in.in: Add menu_label and
- menu_accelerator.
-
-2004-05-18 JP Rosevear <jpr@novell.com>
-
- * idl/evolution-calendar.idl: add arg
-
- * gui/alarm-notify/alarm-queue.c (edit_component): send a mode
- type
-
- * gui/alarm-notify/alarm-notify.c: add fixme note
-
- * gui/comp-editor-factory.c (impl_editExisting): take a editor
- mode and twist it into a source type
- (impl_editNew): ditto
- (open_client): take a source type for creating the client
- (lookup_open_client): ditto
-
-2004-05-18 JP Rosevear <jpr@novell.com>
-
- * gui/alarm-notify/notify-main.c (init_alarm_service): just set up
- the alarm notify object
-
- * gui/alarm-notify/alarm-notify.h: update proto
-
- * gui/alarm-notify/alarm-notify.c (process_removal_in_hash):
- process removals using the source list
- (list_changed_cb): when the list changes, update
- (load_calendars): initially load the calendars
- (alarm_notify_init): load the calendars here and don't listen for
- a selection notification
- (alarm_notify_add_calendar): get the source type when adding a
- calendar
-
- * gui/alarm-notify/notify-main.c (main): no need to init/shutdown
- gnome vfs
-
- * gui/alarm-notify/config-data.h: new proto
-
- * gui/alarm-notify/config-data.c
- (config_data_get_notify_with_tray): routine to get schema value
-
- * gui/alarm-notify/alarm.c (alarm_ready_cb): no timeout checking
- here, setup_timeout does that
- (queue_alarm): ditto
- (setup_timeout): calculate the timeout better
-
- * gui/alarm-notify/alarm-queue.c (query_objects_changed_cb): tidy
- (edit_component): clean up exception handling
- (display_notification): don't show the tray icon if we aren't
- notifying with the tray
-
- * gui/apps_evolution_calendar.schemas.in.in: add notify_with_tray
- option
-
-2004-05-18 Kidd Wang <kidd.wang@sun.com>
-
- * gui/e-week-view.c: (e_week_view_do_cursor_key_up),
- (e_week_view_do_cursor_key_down), (e_week_view_do_cursor_key_left),
- (e_week_view_do_cursor_key_right), (e_month_view_do_cursor_key_up),
- (e_month_view_do_cursor_key_down),
- (e_month_view_do_cursor_key_left),
- (e_month_view_do_cursor_key_right), (e_week_view_cursor_key_up),
- (e_week_view_cursor_key_down), (e_week_view_cursor_key_left),
- (e_week_view_cursor_key_right), (e_week_view_do_key_press): make
- the focus movable in week/month view when no events are selected.
-
-2004-05-17 Jeffrey Stedfast <fejj@novell.com>
-
- * gui/dialogs/event-editor.c: Same.
-
- * gui/dialogs/comp-editor.c: Change E_PIXMAP size args
- over to E_ICON_SIZE_* values.
-
- * gui/alarm-notify/alarm-queue.c (tray_icon_blink_cb): Use
- E_ICON_SIZE enum here.
- (display_notification): Same.
-
- * gui/alarm-notify/alarm-notify-dialog.c (write_html_heading): Use
- E_ICON_SIZE_DIALOG here.
-
- * gui/e-week-view.c (e_week_view_realize): Same as below.
-
- * gui/e-day-view.c (e_day_view_realize): Use E_ICON_SIZE_MENU for
- the icon sizes rather than using pixel values.
-
- * gui/calendar-commands.c (pixmaps): Change E_PIXMAP size args
- over to E_ICON_SIZE_* values.
-
- * gui/tasks-component.c (add_popup_menu_item): Use
- E_ICON_SIZE_MENU
-
- * gui/e-timezone-entry.c (e_timezone_entry_init): Use
- E_ICON_SIZE_BUTTON
-
- * gui/e-itip-control.c (write_error_html): Use E_ICON_SIZE enums.
- (write_html): Same.
-
- * gui/e-calendar-view.c (e_calendar_view_set_status_message): Use
- E_ICON_SIZE_STATUS
- (setup_popup_icons): Use E_ICON_SIZE_MENU
-
- * gui/e-calendar-table.c (e_calendar_table_init): Use
- E_ICON_SIZE_LIST rather than a hard-coded value of 16 pixels.
- (e_calendar_table_set_status_message): Use E_ICON_SIZE_STATUS
-
- * gui/calendar-component.c (add_popup_menu_item): Use
- E_ICON_SIZE_MENU rather than hard-coding the pixel size.
-
-2004-05-17 JP Rosevear <jpr@novell.com>
-
- Fixes #56373
-
- * gui/comp-editor-factory.c (open_client): guess its an event for
- now
-
-2004-05-17 V Ravi Kumar Raju <vravikr@yahoo.co.uk>
-
- * gui/e-alarm-list.c (get_alarm_string):
- * gui/dialogs/alarm-page.glade: Change dropdown list item 'Display
- a message' for reminder types to 'Pop up an alert'
-
-2004-05-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-calendar-view.c (e_calendar_view_delete_selected_occurrence):
- if we don't have a RECURRENCE-ID, remove nothing, and use the instance
- start time for the RECURRENCE-ID as the default.
-
-2004-05-17 H P Nadig <hpnadig@pacific.net.in>
-
- Fixes #56885
-
- * gui/dialogs/select-source-dialog.c (select_source_dialog): Changed
- the window size of source dialog and a minor naming issue.
-
-2004-05-14 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view.c (process_component):
- * gui/e-week-view.c (process_component):
- * gui/gnome-cal.c (gnome_calendar_purge):
- * gui/tag-calendar.c (tag_calendar_by_comp):
- * gui/e-cal-model.c (e_cal_model_generate_instances): use
- e_cal_generate_instances_for_object instead of
- e_cal_recur_generate_instances.
-
-2004-05-14 Nicel KM <mnicel@novell.com>
-
- * gui/dialogs/alarm-page.c (button_options_clicked_cb): invoke options
- dialog even if backend does not support email alarms and get email
- address only if supported.
-
-2004-05-13 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/alarm-page.c (add_clicked_cb): only get the email address
- for alarms if the backend supports email alarms.
-
-2004-05-13 Not Zed <NotZed@Ximian.com>
-
- Fixes #57644.
-
- * gui/e-day-view.c (row_deleted_check_cb): strdup the uid, as
- below.
- (remove_uid_cb): and free it.
-
- * gui/e-week-view.c (row_deleted_check_cb): strdup the uid, 'cause
- otherwise it can go away later as we delete stuff.
- (remove_uid_cb): free the uid.
-
- * gui/e-week-view-event-item.c (e_week_view_event_item_draw): add
- some array bounds checking as an attempt to isolate the crash in
- #57644.
-
-2004-05-11 Not Zed <NotZed@Ximian.com>
-
- * gui/migration.c (migrate_calendars, migrate_tasks): add GError
- return for error details & return errors.
-
- * gui/calendar-component.c (impl_upgradeFromVersion): fix for api
- change, and erturn exception if we need to.
-
-2004-05-11 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-itip-control.c (update_item): get error information from
- the call to e_cal_receive_objects, and use that as the error message.
-
-2004-05-11 Dan Winship <danw@ximian.com>
-
- * gui/GNOME_Evolution_Calendar.server.in.in: Remove the calendar
- and task list controls
-
- * gui/main.c (factory): Remove support for the calendar and task
- list controls
-
- * gui/control-factory.c: Remove the property-bag stuff
-
- * gui/tasks-control.c: Likewise
-
-2004-05-11 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #53137
-
- * gui/dialogs/schedule-page.c (schedule_page_fill_widgets): check dates
- from the ECalComponent before using them.
-
-2004-05-11 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-cal-model-tasks.c (set_due): use/set the DUE date, not
- the DTEND date.
-
-2004-05-07 Umeshtej <umeshtej@gawab.com>
-
- Fixes #58014
-
- * gui/e-meeting-list-view.c (process_section):Run the for loop
- for the number of elements in cards.
-
-2004-05-10 Trent Lloyd <lathiat@bur.st>
-
- * gui/dialogs/select-source-dialog.c: Include gtkhbox.h and gtkvbox.h
- to fix implicit declaration
- * gui/dialogs/meeting-page.c: (get_current_page) Cast GTK_ENTRY from
- GTK_COMBO to fix compiler warning
- * gui/dialogs/cal-prefs-dialog.c: Remove lvalue casts, produces
- compiler warnings and are not necessary
-
-2004-05-07 JP Rosevear <jpr@ximian.com>
-
- Fixes #52294
-
- * gui/e-cal-model.c (set_dtstart): set the tzid properly
- (ecm_is_cell_editable): set check properly
-
- * gui/e-cal-model-tasks.c (set_due): set the tzid properly
- (ecmt_is_cell_editable): set check properly
-
- * gui/e-cal-model-calendar.c (set_dtend): set the tzid properly
- (ecmc_is_cell_editable): kill fixme and set check properly
-
-2004-05-07 JP Rosevear <jpr@ximian.com>
-
- * gui/e-cal-model.c (ecm_is_cell_editable): fix comment and check
-
- * gui/e-cal-model-tasks.c (ecmt_set_value_at): set a parent field
- properly
- (ecmt_is_cell_editable): fix comment and check
-
-2004-05-06 Larry Ewing <lewing@ximian.com>
-
- * gui/dialogs/calendar-setup.c (source_to_dialog): use random
- color for calendar default.
-
-2004-05-05 JP Rosevear <jpr@ximian.com>
-
- Fixes #58025
-
- * gui/gnome-cal.c (set_search_query): kill warning
- (setup_config): don't set time out here
- (setup_widgets): set it here
- (gnome_calendar_destroy): clear the time out
-
- * gui/e-tasks.c (search_bar_sexp_changed_cb): kill warning
- (setup_config): don't set time out here
- (setup_widgets): set it here and remember the time out id
- (e_tasks_destroy): clear the time out
-
-2004-05-05 Larry Ewing <lewing@ximian.com>
-
- * gui/dialogs/calendar-setup.c: make sure that we don't crash if
- there are no sources.
- (calendar_setup_new_task_list): fix the previous fix to work if
- there are sources.
-
-2004-05-04 Larry Ewing <lewing@ximian.com>
-
- * gui/dialogs/calendar-setup.c: fix logic error.
- (source_group_can_add): helper function to fix groupwise case.
- I'm still not happy with this but it will work for now.
-
- * gui/dialogs/calendar-setup.c (source_to_dialog): convert units.
- (dialog_to_source): convert time units.
-
- * gui/dialogs/calendar-setup.glade. name the unit option menus.
-
-2004-05-03 Rodney Dawes <dobey@ximian.com>
-
- * gui/dialogs/select-source-dialog.c (select_source_dialog):
- Make this dialog be HIG-compliant and accessible
-
-2004-05-03 Edgar Luna Díaz <eald@linuxuanl.org>
-
- * gui/dialogs/select-source-dialog.c (select_source_dialog):
- Set the default window size to 276 x 320
-
- Fixes #57298
-
-2004-05-03 Larry Ewing <lewing@ximian.com>
-
- * gui/dialogs/calendar-setup.glade: rename the cancel button.
-
-2004-04-29 Larry Ewing <lewing@ximian.com>
-
- * gui/e-cal-model.c (ecm_get_color_for_component): use the source
- color if it is set. Yay for ugly colors.
-
- * gui/e-cal-model.h: add a color holder to the ECalModelComponent
- since the return value of the color stuff is const.
-
-2004-05-03 JP Rosevear <jpr@ximian.com>
-
- Fixes #51714
-
- * gui/e-cal-list-view.c (setup_e_table): listen for double click
- signal
- (e_cal_list_view_on_table_double_click): edit the appointment that
- was double clicked on
-
-2004-05-03 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-component.c (set_info): set the info label
- (calendar_dates_changed_cb): call back for when the dates of the
- calendar change
- (create_component_view): store the info label for later use;
- listen for date changes to set the info label
-
-2004-05-03 JP Rosevear <jpr@ximian.com>
-
- Fixes #57897
-
- * gui/e-tasks.c (setup_widgets): no need to listen for the deleted
- signal, the cursor will change in that case
-
-2004-05-03 JP Rosevear <jpr@ximian.com>
-
- * gui/e-cal-model-tasks.c (set_completed): remove useless debug
- statement
-
-2004-05-03 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-component.c (set_info): set the info label message
- (model_changed_cb): call above
- (table_selection_change_cb): ditto
- (model_rows_inserted_cb): ditto
- (model_rows_deleted_cb): ditto
- (create_component_view): remember the info in the view struct;
- listen for events that require the info label to be updated
-
-2004-05-03 JP Rosevear <jpr@ximian.com>
-
- Fixes #57899
-
- * gui/e-day-view.c (e_day_view_do_key_press): bail if the client
- is read only (or we get an error trying to find out)
-
- * gui/e-week-view.c (e_week_view_do_key_press): ditto
-
-2004-05-03 JP Rosevear <jpr@ximian.com>
-
- Fixes #57894
-
- * gui/gnome-cal.c (gnome_calendar_new_task): make sure we use the
- default component of the correct model
-
-2004-04-30 Rodney Dawes <dobey@ximian.com>
-
- * gui/alarm-notify/alarm-notify-dialog.c (alarm_notify_dialog):
- * gui/alarm-notify/alarm-notify.glade:
- Update the alarm notify dialog to be HIG compliant
-
- Fixes #41224
-
-2004-04-30 Gary Ekker <gekker@novell.com>
-
- * gui/e-tasks.c: (e_tasks_init): Set up the model to use the correct
- query. Setup callbacks for gconf changes. Add an idle timeout to hide
- completed items.
- Add update_view, update_view_cb, and
- config_hide_completed_tasks_changed_cb to update the model view.
-
- * gui/gnome-cal.c: ditto
-
- * gui/calendar-config.h: Add notifications for hide_completed_tasks
- settings.
-
- * gui/calendar-config.c: ditto
-
-2004-04-30 Not Zed <NotZed@Ximian.com>
-
- * gui/dialogs/meeting-page.c (get_widgets): make the entry
- non-editable. Quick fix for #48132 (could convert to optionmenu
- but then we need to change again for gnome >?2.6).
-
-2004-04-29 Rodney Dawes <dobey@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.glade: Update the prefs dialog pages
- for the calendar and tasks components to be HIG compliant
-
-2004-04-29 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-component.h (tasks_component_peek_source_list): remove
- prototypes
-
- * gui/tasks-component.c (source_removed_cb): unselect the
- source in the selector if source removed from calendar
- (create_component_view): create the activity handler and listen to
- source remove signal
-
- * gui/gnome-cal.h: add signals, protos
-
- * gui/gnome-cal.c (gnome_calendar_class_init): add source added
- and removed signals
- (client_cal_opened_cb): emit source removed signal
- (open_ecal): set the status message
- (backend_died_cb): emit source removed signal
- (gnome_calendar_set_activity_handler): allow an activity handler
- to be set
- (gnome_calendar_add_source): emit source added signal
- (gnome_calendar_remove_source): emit source removed signal
- (display_view): update the active activity handler
-
- * gui/e-tasks.h: add signal prototypes
-
- * gui/e-tasks.c (e_tasks_class_init): add source added and removed
- signals
- (backend_died_cb): emit source removed signal
- (e_tasks_add_todo_source): emit source added/removed signals
- (e_tasks_remove_todo_source): emit source removed signal
-
- * gui/e-calendar-view.h: add proto
-
- * gui/e-calendar-view.c (e_calendar_view_set_activity_handler):
- allow an activity handler to be set
- (e_calendar_view_set_status_message): use private activity handler
- (if any) to set status message
-
- * gui/e-calendar-table.h: add data member and proto
-
- * gui/e-calendar-table.c (e_calendar_table_set_activity_handler):
- allow an activity handler to be set
- (e_calendar_table_set_status_message): use private activity
- handler (if any) to set status message
-
- * gui/e-calendar-marshal.list: add extra marshallers
-
- * gui/calendar-component.h: kill protos
-
- * gui/calendar-component.c (source_removed_cb): unselect the
- source in the selector if source removed from calendar
- (create_component_view): create the activity handler and listen to
- source remove signal
-
-2004-04-29 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor.c (send_timezone): ditto
-
- * gui/dialogs/task-page.c (task_page_fill_component): kill warning
-
-2004-04-29 JP Rosevear <jpr@ximian.com>
-
- * gui/e-cal-model.c (e_cal_model_set_default_client): kill warning
-
-2004-04-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/migration.c (migrate_pilot_data): Removed the terminating
- NULL vararg since we don't need it for g_strdup_printf, it was
- only needed when it was g_build_filename(). Gets rid of a gcc
- warning.
-
-2004-04-29 Not Zed <NotZed@Ximian.com>
-
- * gui/e-itip-control.c (e_itip_control_set_data): check we find
- any usable components of the icalendar entry before dereferncing
- it. Fixes crash in #57264.
-
-2004-04-28 Not Zed <NotZed@Ximian.com>
-
- * gui/e-itip-control.c (object_requested_cb): dont shadow source
- with another source in the fallback case. Related to #54094.
-
-2004-04-27 JP Rosevear <jpr@ximian.com>
-
- * gui/cal-search-bar.c: disable comment searching which is
- currently useless
-
-2004-04-27 JP Rosevear <jpr@ximian.com>
-
- Fixes #52270 and #57593
-
- * gui/e-cal-model-tasks.c (ecmt_set_value_at): remove checks for
- start after due
- (ecmt_duplicate_value): copy the completed and due dates properly
- (ecmt_fill_component_from_model): only set the percent and status
- if the completion isn't set
- (ensure_task_partially_complete): ensure the task is not complete,
- in progress and make the percentage sensible if its 0 or 100
- (set_status): make sure the status and related vars are set
- properly
- (ecmt_set_value_at): handle status
- (ecmt_fill_component_from_model): make sure the click to add
- fields don't clobber each other
- (ecmt_is_cell_editable): status is editable
-
- * gui/e-cal-model-calendar.c (ecmc_duplicate_value): copy the
- dtend correctly
-
-2004-04-27 Larry Ewing <lewing@ximian.com>
-
- * gui/dialogs/calendar-setup.c: hook up the color picker and test
- buttons in the new task dialog.
-
- * gui/dialogs/calendar-setup.glade: fix visibility and color
- picker names.
-
-2004-04-27 Larry Ewing <lewing@ximian.com>
-
- * gui/dialogs/calendar-setup.c (new_calendar_test_uri): add
- handler for test button.
- (calendar_setup_new_calendar): connect test button, fill in color
- picker member.
- (source_to_dialog): set the color picker color if the source has
- one.
- (dialog_to_source): set the source color.
-
-2004-04-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/migration.c (migrate_tasks): Fixed the version checks for
- migrating pilot data.
- (migrate_calendars): Same.
- (migrate_pilot_data): Doh. Take a third argument to specify what
- component we are migrating ("todo" vs "calendar") so that we can
- compare against the correct filename. Might help :-)
- (migrate_pilot_db_key): Just set an empty value for the data since
- there's no way to actually get it and I don't think it really
- matters anyway.
-
-2004-04-27 Kidd Wang <kidd.wang@sun.com>
-
- * gui/e-cal-model-tasks.c: (ecmt_set_value_at): compare the start
- time and the due time only when both are not null.
-
-2004-04-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/migration.c (migrate_pilot_data): New function to migrate
- pilot data.
- (migrate_calendars): Migrate pilot data if upgrade version <=1.5.9
- (migrate_tasks): Same.
-
-2004-04-23 Rodney Dawes <dobey@ximian.com>
-
- * gui/alarm-notify/notify-main.c (main): Call e_icon_factory_init ()
-
- Fixes #57497
-
-2004-04-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (start_calendar_server):
- Use e_cal_open_default() instead of e_cal_open().
- (map_name): Changed the path for the pilot map filename.
- (pre_sync): Changed the query to "#t" instead of "(#t)" and
- removed a duplicate block of code (seems to have been a paste-o?).
-
- * conduits/todo/todo-conduit.c (start_calendar_server): Use
- e_cal_open_default() instead of e_cal_open().
- (map_name): Changed the path for the pilot map filename.
- (pre_sync): Changed the query to "#t" instead of "(#t)" and
- removed a duplicate block of code (seems to have been a paste-o?).
-
-2004-04-22 JP Rosevear <jpr@ximian.com>
-
- Fixes #56092
-
- * gui/e-day-view.c (e_day_view_show_popup_menu): weak ref for the
- menu to be destroyed
- (popup_destroyed_cb): reset popup_event_num and popup_event_day
-
- * gui/e-week-view.c (e_week_view_show_popup_menu): weak ref for
- the menu to be destroyed
- (popup_destroyed_cb): reset the popup_event_num
-
-2004-04-21 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-component.c (create_new_event): make sure we don't
- deref a NULL pointer
-
-2004-04-21 JP Rosevear <jpr@ximian.com>
-
- Fixes #56504
-
- * gui/gnome-cal.c (gnome_calendar_destroy): no need to destroy the
- creatable item handler
- (gnome_calendar_set_ui_component): don't do the creatable
- item stuff here
-
- * gui/e-tasks.c (e_tasks_set_ui_component): don't do the creatable
- item stuff here
- (e_tasks_destroy): no need to destroy creatable item handler
-
- * gui/e-calendar-table.c (e_calendar_table_set_status_message):
- comment out temporarily
-
- * gui/e-calendar-view.c (e_calendar_view_set_status_message): ditto
-
- * gui/calendar-component.c: switch to using per component view
- information; don't listen for config changes to the primary
- selection and selection so that different windows can have
- different calendar selections; use a local creatable items handler
- so that the new button is associated with the right window when
- setting the default times
-
- * gui/tasks-component.c: ditto
-
-2004-04-21 JP Rosevear <jpr@ximian.com>
-
- * gui/e-tasks.c (set_timezone): only set the preview zone if the
- preview has been created
- (setup_widgets): set the default zone for the preview pane
-
-2004-04-21 JP Rosevear <jpr@ximian.com>
-
- Fixes #55797
-
- * gui/calendar-component.c (create_new_event): force an all day
- event if we are viewing the week, month or list view, which mimics
- double click in the view
-
-2004-04-21 Frederic Crozat <fcrozat@mandrakesoft.com>
-
- * gui/migration.c: (migrate_calendars):
- Fix crash when gconf value are not existing in the gconf
- database.
-
-2004-04-21 Not Zed <NotZed@Ximian.com>
-
- ** Fixes #57034.
-
- * gui/dialogs/calendar-setup.c (create_new_source_with_group):
- NULL out source if we can't open the calendar.
- (source_group_menu_add_groups): if the group is readonly, then
- desensitise it.
- (source_group_menu_add_groups): return the first non-readonly
- calendar index.
- (calendar_setup_new_calendar): set the group history to the first
- non-readonly group.
- (calendar_setup_new_task_list): same.
-
- * gui/gnome-cal.c (gnome_calendar_set_ui_component): fix for
- user_creatable_items api changes.
-
- * gui/e-tasks.c (e_tasks_set_ui_component): fix for
- user_creatable_items api changes.
-
-2004-04-19 Michael Terry <mike@mterry.name>
-
- * gui/GNOME_Evolution_Calendar.server.in.in:
- * gui/calendar-commands.c:
- * gui/calendar-component.c:
- * gui/e-calendar-table.c:
- * gui/e-calendar-view.c:
- * gui/e-day-view-main-item.c:
- * gui/e-day-view-top-item.c:
- * gui/e-day-view.c:
- * gui/e-day-view.h:
- * gui/e-itip-control.c:
- * gui/e-timezone-entry.c:
- * gui/e-week-view-event-item.c:
- * gui/e-week-view.c:
- * gui/e-week-view.h:
- * gui/tasks-component.c:
- * gui/alarm-notify/alarm-notify-dialog.c:
- * gui/alarm-notify/alarm-queue.c:
- * gui/dialogs/comp-editor.c:
- * gui/dialogs/event-editor.c: Update the calendar to use the icon theme
- through the EIconFactory object in e-util
-
-2004-04-19 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (set_view): take a range_selected boolean for
- internal use
- (gnome_calendar_set_view): use above
- (display_view): use priv->range_selected, we'll set it correctly
- before this
- (display_view_cb): only pass focus boolean
- (gnome_calendar_on_date_navigator_selection_changed): set the view
- so the view menu is accurate
-
-2004-04-18 JP Rosevear <jpr@ximian.com>
-
- Fixes #54021
-
- * importers/icalendar-importer.c (update_single_object): ensure
- UID exists
-
-2004-04-18 JP Rosevear <jpr@ximian.com>
-
- Fixes #53124
-
- * gui/e-tasks.c: remove preview pieces, they are in their own
- class now; use the new class for preview
-
- * gui/e-cal-component-preview.[hc]: implement a preview area for
- tasks and events
-
-2004-04-17 Trent Lloyd <lathiat@sixlabs.org>
-
- * gui/e-calendar-view.c: include libecal/e-cal-component.h to kill
- implicit declaration of e_cal_component_get_recur_id_as_string at line
- 869.
-
-2004-04-15 Gary Ekker <gekker@novell.com>
-
- Fixes #52271
-
- * gui/e-cal-model-tasks.c: (set_percent): shouldn't call
- ensure_task_not_complete here, it removes the percent property that
- we just set.
-
-
-2004-04-15 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/task-page.c (task_page_fill_component): don't
- actually check if start date is after due date, its perfectly
- valid for that to occur
-
-2004-04-15 JP Rosevear <jpr@ximian.com>
-
- Fixes #53903
-
- * gui/dialogs/meeting-page.c (meeting_page_fill_widgets):
- show/hide add button properly
- (change_clicked_cb): ditto
-
- * gui/dialogs/comp-editor.c (needs_send_cb): call back when "needs_send"
- (page_changed_cb): use accessor
-
-2004-04-15 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor.c (save_comp): stop listening to changes
- since we are just going to save and close
- (save_cmd): remove, its ok since we are toasting menus shortly
- anyhow
- (obj_modified_cb): no need to look at update flag
- (obj_removed_cb): ditto
-
-2004-04-15 Gary Ekker <gekker@novell.com>
-
- * gui/calendar-component.h: move the calendar publishing initialization
- from createControls to main.c
-
- * gui/calendar-component.c: (create_controls): Ditto
-
- * gui/main.c: (initialize): Ditto
-
- * gui/dialogs/cal-prefs-dialog.c: (url_list_changed): remove a gfree
- that was freeing a before it should have been. Also removed cruft from
- a previous attempt to fix the crash.
-
-2004-04-15 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/select-source-dialog.c (select_source_dialog): added some
- spacing.
-
- * gui/e-calendar-view.c (e_calendar_view_delete_selected_occurrence):
- use the DTSTART for the recur-id if it's not available.
-
-2004-04-14 Larry Ewing <lewing@ximian.com>
-
- * gui/calendar-component.c (selector_tree_drag_motion): fix
- missing parameters, wow that was a mess.
-
- * gui/dialogs/calendar-setup.glade: add the new "new" dialogs,
- remove the old druids.
-
- * gui/dialogs/calendar-setup.c (calendar_setup_new_calendar): use
- the new dialogs, colors are still not functional.
- (calendar_setup_new_task_list): use the new dialogs, with no colors.
-
-2004-04-14 JP Rosevear <jpr@ximian.com>
-
- Fixes #56613
-
- * gui/gnome-cal.h: add proto
-
- * gui/gnome-cal.c (client_cal_opened_cb): key the clients by uid
- (backend_died_cb): ditto
- (gnome_calendar_add_source): ditto
- (gnome_calendar_remove_source): use remove_source_by_uid
- (gnome_calendar_remove_source_by_uid): new function to remove a
- source by uid
- (gnome_calendar_set_default_source): key the clients by uid
-
- * gui/calendar-component.c (update_task_selection): the source
- could be NULL if the source was deleted rather than unchecked
- (update_primary_task_selection): look at the task source list
-
-2004-04-14 JP Rosevear <jpr@ximian.com>
-
- Fixes #56553
-
- * importers/icalendar-importer.c (prepare_events): don't double
- free or continue, we need to move to the next item
- (prepare_tasks): don't continue, move to the next item
-
-2004-04-14 Not Zed <NotZed@Ximian.com>
-
- * gui/tasks-component.c (impl_createControls): Same as below for
- the tasks component.
-
- * gui/calendar-component.c (impl_createControls): add the info
- area label widget to the sidebar control (c&p the addressbook
- code).
-
-2004-04-12 Gary Ekker <gekker@novell.com>
-
- Fixes #56628
-
- * gui/calendar-component.c (create_new_event): Add informational dialog
- when user attempts event creation in read-only calendar.
-
-
-2004-04-09 Gary Ekker <gekker@novell.com>
-
- * gui/dialogs/url-editor-dialog.c: Fixed to use e-passwords.
-
- * gui/dialogs/cal-prefs-dialog.c: Fixed crash and bugs created by
- changes made for instant apply.
-
- * gui/itip-utils.c: Fixed to use e-passwords.
-
- * gui/e-pub-utils.c: Fixed to use e-passwords.
- (just_published): Fixed error in logic.
- (e_pub_publish): Fixed crash if ESource is NULL.
-
-
-2004-04-09 Chris Toshok <toshok@ximian.com>
-
- * gui/dialogs/e-delegate-dialog.c (e_delegate_dialog_construct):
- EABDestination -> EDestination.
- (e_delegate_dialog_get_delegate): same.
- (e_delegate_dialog_get_delegate_name): same.
-
- * gui/dialogs/alarm-options.c (alarm_to_malarm_widgets):
- EABDestination -> EDestination.
- (malarm_widgets_to_alarm): same.
-
- * gui/e-select-names-editable.c
- (e_select_names_editable_get_address): EABDestination ->
- EDestination.
- (e_select_names_editable_get_name): same.
-
- * gui/e-meeting-list-view.c (process_section): EABDestination ->
- EDestination.
- (select_names_ok_cb): same.
-
-2004-04-09 Dan Winship <danw@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_set_ui_component): Create an
- EUserCreatableItemsHandler for the view if there isn't one yet,
- and then activate it.
- (gnome_calendar_destroy): destroy it.
-
- * gui/calendar-component.c (impl__get_userCreatableItems): add
- object/folder flags to items.
-
- * gui/e-tasks.c (e_tasks_set_ui_component): Create an
- EUserCreatableItemsHandler for the view if there isn't one yet,
- and then activate it.
- (e_tasks_destroy): destroy it.
-
- * gui/tasks-component.c (impl__get_userCreatableItems): add
- object/folder flags. Change "Task List" to "Tasks Group" per new
- specs.
-
- * gui/calendar-commands.c (calendar_control_deactivate): clear the
- GnomeCal's ui_component rather than setting it again
-
-2004-04-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.c: Fixed to be instant-apply.
-
-2004-04-07 JP Rosevear <jpr@ximian.com>
-
- * gui/e-cal-model.c (e_cal_model_set_default_client): just add the
- client, we have protection against re-adding it any how
- (cal_opened_cb): stop listening to the open signal
-
-2004-04-07 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_dayjump): remove extra set view
- params
- (gnome_calendar_set_view): simplify, just set the current view id
- and let the gal view stuff do the rest
- (display_view): modify from set_view, don't set the view id here
- or update the default view config setting
- (display_view_cb): update the date navigator
- (gnome_calendar_construct): kill the default view stuff, gal view
- handles that
- (gnome_calendar_on_date_navigator_selection_changed): use display_view
-
- * gui/e-week-view.c (time_range_changed_cb): ditto
- (e_week_view_set_selected_time_range): just set the selection,
- don't fool with the base date
- (e_week_view_on_button_press): do a full day event if double
- clicked on
-
- * gui/e-day-view.c (time_range_changed_cb): only set the selection
- if we can't preserve an existing selection
-
- * gui/control-factory.c (set_prop): allow list view, remove
- default view usage
-
- * gui/calendar-config.h: remove protos
-
- * gui/calendar-config.c: remove default view calls
-
- * gui/calendar-commands.c (show_day_view_clicked): remove extra
- params to gnome_calendar_set_view
- (show_work_week_view_clicked): ditto
- (show_week_view_clicked): ditto
- (show_month_view_clicked): ditto
- (show_list_view_clicked): ditto
-
- * gui/apps_evolution_calendar.schemas.in.in: remove default view
- setting, gal view remembers this for us
-
-2004-04-05 JP Rosevear <jpr@ximian.com>
-
- * gui/e-week-view.c (time_range_changed_cb): only select one day
-
-2004-04-05 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-queue.c: removed commented code.
-
- * gui/alarm-notify/notify-main.c (main): removed useless call to set
- the POA after construction.
-
-2004-04-05 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #56316
-
- * gui/dialogs/comp-editor-page.[ch]: added "fill_timezones" virtual
- method to CompEditorPage class.
- (comp_editor_page_fill_timezones): new function.
- (comp_editor_page_class_init): initialize new virtual method.
-
- * gui/dialogs/event-page.c (event_page_fill_timezones,
- event_page_class_init):
- * gui/dialogs/task-page.c (task_page_fill_timezones,
- task_page_class_init):
- * gui/dialogs/task-details-page.c (task_details_page_fill_timezones,
- task_details_page_class_init): implemented new virtual method for pages
- dealing with timezones.
-
- * gui/dialogs/comp-editor.c (save_comp): call the "fill_timezones"
- method on all pages, and call...
- (send_timezone): ...this function for each hash table item.
-
-2004-04-01 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (client_cal_opened_cb): set the default timezone
- on all clients when opened.
-
-2004-04-01 Radek Doulik <rodo@ximian.com>
-
- * gui/e-calendar-view.c
- (e_calendar_view_delete_selected_occurrence): fix small typo
-
-2004-04-01 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/recur-comp.c (recur_component_dialog): return correct
- values (boolean).
-
-2004-03-31 JP Rosevear <jpr@ximian.com>
-
- * gui/migration.c (migrate_calendars): make sure we unset the
- float value for the panes if converting from 1.4 and earlier
-
-2004-03-31 JP Rosevear <jpr@ximian.com>
-
- Fixes #56120
-
- * gui/gnome-cal.c (append_category_cb): update the correct element
- (client_categories_changed_cb): pass the array, not a reference to
- it
-
-2004-03-31 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c: fixed documentation typos.
-
-2004-03-31 Sarfraaz Ahmed <asarfraaz@novell.com>
-
- * gui/config-control.c (set_prop) : Replaced add_event_source
- with add_source and passed the VEVENT type as argument.
-
-2004-03-30 William Jon McCann <mccann@jhu.edu>
-
- * gui/dialogs/calendar-setup.glade:
- * gui/dialogs/calendar-setup.c (new_task_list_finish)
- (calendar_setup_new_task_list, calendar_setup_edit_task_list):
- add remote calendar setup page to task list setup assistant and
- edit dialog. Remove separators from dialog.
-
-2004-03-29 Larry Ewing <lewing@ximian.com>
-
- * gui/calendar-component.c (selector_tree_drag_data_received):
- deal with the action type a properly. in the normal case.
-
- * gui/calendar-component.c (selector_tree_drag_data_received):
- call drag_finish properly, change the uid.
- (selector_tree_drag_motion): set drag status properly.
-
-2004-03-29 William Jon McCann <mccann@jhu.edu>
-
- * gui/tasks-component.c (delete_task_list_cb):
- * gui/calendar-component.c (delete_calendar_cb):
- don't require client to be loaded in order to remove the source
-
- * gui/migration.c (create_task_sources, migrate_tasks): create
- On The Web source group for tasks.
-
-2004-03-29 Hari Prasad Nadig <hp@ndeepak.info>
-
- * gui/goto-dialog.glade: Naming issue, Go to Date -> Select Date,
- Go to Today -> Select today. Solves 48293
-
- * gui/e-calendar-view.c: gives aid to the above change.
-
-2004-03-29 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-queue.c (query_objects_changed_cb): removed
- misplaced return statement that prevented the rest of the objects list
- to be processed.
-
-2004-03-29 Kidd Wang <kidd.wang@sun.com>
-
- * gui/e-calendar-view.c: (e_calendar_view_class_init): remove the
- EVENT_MOVE signal which was binded to Alt + Arrows.
- * gui/e-calendar-view.h: ditto.
- * gui/e-day-view.c: (e_day_view_class_init),
- (e_day_view_do_key_press), (e_day_view_event_move): handle Alt + Arrows
- in the more general place e_day_view_do_key_press so that we can avoid
- the conflicting accessible key. When an appointment is selected,
- pressing Alt + Arrows causes it to be moved around. Otherwise, pressing
- Alt + LEFT/RIGHT will move the focus to the same day in the
- previous/next week.
- * gui/e-week-view.c: (e_week_view_class_init),
- (e_week_view_event_move), (e_week_view_do_key_press): ditto.
-
-2004-03-26 JP Rosevear <jpr@ximian.com>
-
- * gui/e-cal-model.c (update_e_cal_view_for_client): guard against
- the case that we redo queries while still waiting for a client to
- open
-
-2004-03-26 JP Rosevear <jpr@ximian.com>
-
- Fixes #53134
-
- * gui/e-cal-model.c (get_description): make sure to set the string
- to NULL so that if this component doesn't have a description we
- don't double free next time we are called
-
-2004-03-26 JP Rosevear <jpr@ximian.com>
-
- * gui/migration.c (migrate_calendars): no need to explicitly add
- the contacts group, the create function does this properly
-
-2004-03-26 JP Rosevear <jpr@ximian.com>
-
- * gui/migration.c (migrate_calendars): make sure we always sync
- the source list and just do it once; unref the sources we get
- (migrate_tasks): make sure we always sync
- the source list and just do it once
-
-2004-03-26 JP Rosevear <jpr@ximian.com>
-
- Fixes #55648
-
- * gui/print.c (print_todo_details): get the default from the model
-
- * gui/gnome-cal.h: remove and update protos
-
- * gui/gnome-cal.c (update_query): the clients and client_list
- members are now arrays of source types
- (setup_widgets): default the query to everything for tasks, cast
- the config items
- (gnome_calendar_init): init all the client hashs
- (gnome_calendar_destroy): clean them up, clean up all categories
- (client_cal_opened_cb): handle based on source type
- (append_category_cb): don't track the size in the closure
- (client_categories_changed_cb): do all the merging here
- (backend_died_cb): handle based on source type
- (gnome_calendar_construct): we don't special case the task stuff
- any more
- (gnome_calendar_get_default_client): return the default of the
- current view
- (gnome_calendar_add_source): take a source type argument and
- append accordingly
- (gnome_calendar_remove_source): similar, but remove accordingly
- (gnome_calendar_set_default_source): take a source type argument and
- set the default accordingly
- (gnome_calendar_new_task): use the default of the task model
-
- * gui/e-calendar-view.c (e_calendar_view_add_event): kill warning
-
- * gui/calendar-component.c (update_uris_for_selection): pass
- source type when adding/removing
- (update_uri_for_primary_selection): ditto
- (update_task_selection): make sure we show the correct list of
- tasks
- (update_primary_task_selection): make sure we track the primary
- task correctly
- (delete_calendar_cb): pass source type when removing
- (config_primary_selection_changed_cb): config listener callback
- for tasks
- (config_tasks_selection_changed_cb): ditto
- (impl_createControls): load the initial task selection, listen for
- changes
- (calendar_component_init): get the source lists
-
- * gui/calendar-commands.c (sensitize_taskpad_commands): get the
- task pad and then the default client from that
-
-2004-03-26 JP Rosevear <jpr@ximian.com>
-
- * gui/e-cal-model.c (find_client_data): finds the client data for
- a client
- (cal_opened_cb): update the query
- (add_new_client): return client data
- (e_cal_model_add_client): add the client immediately no matter
- what, and possibly wait for it to open
- (remove_client): guard against NULL query
- (e_cal_model_remove_client): use find_client_data
- (e_cal_model_dispose): guard against a NULL query
-
-2004-03-25 JP Rosevear <jpr@ximian.com>
-
- * gui/e-cal-model.c (remove_client): fix off by one error when
- emitting deleted signal
-
-2004-03-25 JP Rosevear <jpr@ximian.com>
-
- Fixes #53499
-
- * gui/gnome-cal.c (setup_widgets): don't give the state file to
- the list view
- (set_view): ensure that if the list view was in custom mode it
- stays that way
- (display_view_cb): attach to the etable of the list view
- (gnome_calendar_setup_view_menus): use an etable gal view for the
- list view and don't set the view twice
-
- * gui/e-tasks.c (e_tasks_setup_view_menus): the instance should no
- longer be per task uri since all the uris are shown together
-
- * gui/e-cal-list-view.h: update/add protos
-
- * gui/e-cal-list-view.etspec: limit the available columns to what
- product design agreed on
-
- * gui/e-calendar-table.etspec: ditto
-
- * gui/e-cal-list-view.c (e_cal_list_view_class_init): ignore
- update query calls
- (e_cal_list_view_load_state): make public
- (e_cal_list_view_save_state): ditto
- (setup_e_table): don't handle state saving ourselves
- (e_cal_list_view_construct): ditto
- (e_cal_list_view_new): ditto
- (e_cal_list_view_destroy): ditto
-
- * gui/calendar-view.c (calendar_view_get_type_code): we don't
- handle the list view here
-
- * gui/calendar-view-factory.c
- (calendar_view_factory_get_type_code): we don't handle the list
- view here
- (calendar_view_factory_get_title): ditto
-
-2004-03-24 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (update_query): don't create queries for the clients
- that are not loaded yet.
-
-2004-03-24 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (client_cal_opened_cb): remove debug code that
- slipped in
-
-2004-03-24 Danilo Å egan <dsegan@gmx.net>
-
- * gui/e-alarm-list.c (get_alarm_duration_string): Use ngettext for
- handling plural forms (fixes bug #53464).
- * gui/dialogs/delete-comp.c (delete_component_dialog): Likewise.
- * gui/e-itip-control.c (write_recurrence_piece): Likewise.
-
-2004-03-23 JP Rosevear <jpr@ximian.com>
-
- Fixes #51948
-
- * gui/dialogs/meeting-page.c (button_press_event): compile this
- again, determine the row with a different method
- (button_press_event): pass mpage
- (meeting_page_construct): listen for button press event
-
- * gui/e-meeting-list-view.c: remove commit that wasn't supposed to
- go in
-
-2004-03-23 JP Rosevear <jpr@ximian.com>
-
- * gui/e-calendar-view.c: make the flow control correct
-
-2004-03-23 JP Rosevear <jpr@ximian.com>
-
- * gui/migration.c (create_calendar_sources, create_task_sources):
- ensure that only one Personal calendar/task list gets created when
- moving between minor versions
-
-2004-03-23 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/copy-source-dialog.c (copy_source): remove unused
- variable
-
- * gui/e-cal-model.c (e_cal_model_copy_component_data): make the
- precondition return NULL
-
- * gui/control-factory.c (get_prop): make sure this code isn't
- reached
-
- * gui/calendar-component.c
- (calendar_component_peek_source_selector): cast to kill warning
-
-2004-03-23 Umesh Tiwari <tiwariumesh232@rediffmaiil.com>
-
- For bug#53417
-
- * gui/e-tasks.c:
- Clear the preview panel after the last task is deleted.
-
-2004-03-23 Alfred Peng <alfred.peng@sun.com>
-
- * gui/dialogs/alarm-options.c (malarm_widgets_to_alarm): get
- the mail alarm description message from "malarm_description"
- instead of "dalarm_description".
-
-2004-03-23 Alfred Peng <alfred.peng@sun.com>
-
- * gui/alarm-notify/alarm-queue.c (audio_notification): If there
- is no attachment for a audio reminder, only a message window
- shows up.
- Get a beep sound even without attachment for audio reminder.
-
-2004-03-22 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-calendar-view.c (e_calendar_view_add_event): get the UID
- from the server on newly created events and set the ECalComponent's
- UID to that, for further operations.
-
-2004-03-20 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-calendar-view.c: added 'Copy/Move to Calendar' menu entries.
- (on_copy_to, on_move_to): callbacks for new menu items.
- (on_print_event): don't leak selection list.
-
-2004-03-19 JP Rosevear <jpr@ximian.com>
-
- Fixes #55716
-
- * gui/e-cal-model.c (remove_client): unset the default if the
- client removed was the default
-
-2004-03-19 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.c (update_uris_for_selection): if
- gnome_calendar_add_event_source fails, don't add the client to the
- internal client list.
-
-2004-03-19 JP Rosevear <jpr@ximian.com>
-
- Fixes #55723
-
- * gui/e-day-view.c (process_component): compare ecalcomponents,
- not icalcomponents (the compare func is borked), check recurrence
- changes better
- (e_day_view_init): just use the model the parent creates
-
- * gui/e-week-view.c (process_component): create the temporary item
- from the correct icalcomp
- (e_week_view_init): just use the model the parent creates
-
-2004-03-18 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/select-source-dialog.c (select_source_dialog): create
- an ESourceSelector instead of a ESourceOptionMenu, to be consistent
- with the other components, and create a scrolled window to hold the
- source selector.
- (primary_selection_changed_cb): callback for "primary_selection_changed"
- signal in the ESourceSelector.
-
-2004-03-18 Alfred Peng <alfred.peng@sun.com>
-
- * Fix #51187 on bugzilla of ximian
- * gui/alarm-notify/alarm-queue.c (query_objects_changed_cb):
- If "alarms" or "alarms->alarms" is NULL after querying a calendar
- for the alarms of a particular object, the reuse of "cqa" will
- probably cause evolution-alarm-notify to crash.
- So remove "cqa" when "alarms" or "alarms->alarms" is NULL. Otherwise
- update it.
-
-2004-03-17 hpnadig <hp@ndeepak.info>
-
- * gui/dialogs/task-page.glade: Capitalized words changed. Solves 48115.
-
- * gui/dialogs/task-details-page.glade: s/Date Completed/Date completed.
-
- * gui/e-calendar-table.etspec: Capitalization checked. Solves 48130.
-
-2004-03-17 Gary Ekker <gekker@novell.com>
-
- Fixes #55292
-
- * gui/e-pub-utils.c (e_pub_publish): fix a crash when trying to
- publish a NULL component
-
-2004-03-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/select-source-dialog.[ch]: new dialog for allowing the
- user to select a source.
-
- * gui/dialogs/copy-source-dialog.c (copy_source_dialog): use the
- select_source_dialog function to ask user for the source to use.
- (source_selected_cb): removed unneeded function.
-
- * gui/dialogs/Makefile.am: added new files.
-
-2004-03-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-commands.c
- (calendar_control_sensitize_calendar_commands): check if the selected
- event has its associated ECalModelComponent.
-
-2004-03-15 JP Rosevear <jpr@ximian.com>
-
- * gui/e-tasks.c (search_bar_sexp_changed_cb): set the search query
- (e_tasks_init): set the query to be #t by default
-
- * gui/e-cal-model.c (redo_queries): use the search query if there
- is one (and no time is set), make sure to dup the #f
-
-2004-03-15 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor-page.c (comp_editor_page_fill_widgets):
- use right cast macro
-
-2004-03-15 JP Rosevear <jpr@ximian.com>
-
- * Rename e-cal-view to e-calendar-view and fix includes
-
- * gui/dialogs/comp-editor-page.c (comp_editor_page_fill_widgets):
- pre-conditions should return FALS
-
- * gui/e-cal-model.c (copy_ecdv): return the new struct
-
- * gui/Makefile.am: build renamed files
-
-2004-03-15 JP Rosevear <jpr@ximian.com>
-
- Fixes #52253
-
- * gui/print.c (print_week_summary_cb): copy component data
-
- * gui/gnome-cal.c (get_times_for_views): calculate the time range
- for each view
- (set_search_query): set the search query on the model
- (set_week_start): set the week start day
- (week_start_changed_cb): track if it changes
- (setup_config): set its notification
- (setup_widgets): update the view times and date navigator
- (gnome_calendar_init): remove dead values
- (gnome_calendar_goto_date): just calc the new time and let
- update_view_times handle it
- (gnome_calendar_goto): ditto
- (gnome_calendar_direction): ditto
- (gnome_calendar_set_selected_time_range): ditto
- (gnome_calendar_dayjump): ditto
- (update_view_times): set the time ranges on the models
- (set_view): use the new preserve day setting
- (gnome_calendar_set_view): don't update the view times, just
- switch
- (gnome_calendar_get_selected_time_range): get the time range
- (gnome_calendar_on_date_navigator_selection_changed): don't
- re-update the date navigator, centralize the view setting
-
- * gui/e-week-view.c (time_range_changed_cb): handle the time range
- changing
- (process_component): move here
- (model_changed_cb): handle the model changing
- (update_row): updated a changed row
- (model_row_changed_cb): update a row
- (model_cell_changed_cb): ditto
- (model_rows_inserted_cb): handle events being added
- (row_deleted_check_cb, remove_uid_cb, model_rows_deleted_cb):
- handle events being deleted
- (timezone_changed_cb): handle timezone changing
- (e_week_view_init): create the model and listen to it
- (e_week_view_new): don't create the model here
- (e_week_view_set_selected_time_range): no need to cast
- (e_week_view_set_first_day_shown): ditto
- (e_week_view_set_weeks_shown): ditto
- (e_week_view_update_event_cb): free and copy the data using new
- routines
- (e_week_view_foreach_event): step through every event
- (e_week_view_remove_event_cb): we no longer track allocated status
- (e_week_view_on_button_release): don't set the seleciton in the
- calendar
- (e_week_view_free_events): free the data with the util
- (e_week_view_add_event): no need to track allocated status
- (e_week_view_on_adjustment_changed): no need to cast
-
- * gui/e-day-view.c (e_day_view_class_init): update query is no
- longer used via class method
- (time_range_changed_cb): handle the time range changing
- (process_component): move here
- (model_changed_cb): handle the model changing
- (update_row): updated a changed row
- (model_row_changed_cb): update a row
- (model_cell_changed_cb): ditto
- (model_rows_inserted_cb): handle events being added
- (row_deleted_check_cb, remove_uid_cb, model_rows_deleted_cb):
- handle events being deleted
- (timezone_changed_cb): handle timezone changing
- (e_day_view_init): create a model, connect to its signals
- (e_day_view_destroy): we don't have our own query anymore
- (e_day_view_update_event_cb): free and copy the data using new
- routines
- (e_day_view_remove_event_cb): we no longer track allocated status
- (e_day_view_set_selected_time_range): actually set the selection
- (e_day_view_recalc_day_starts): no need to cast
- (e_day_view_recalc_work_week): ditto
- (e_day_view_update_calendar_selection_time): don't call back to
- the main calendar
- (e_day_view_free_event_array): use the free util
- (e_day_view_add_event): don't track allocated status
-
- * gui/e-calendar-marshal.list: add marshaller
-
- * gui/e-cal-view.h: remove field
-
- * gui/e-cal-view.c: no longer listen for model signals
- (e_calendar_view_class_init): make the model arg not construct
- time
-
- * gui/e-cal-model.h: update/add protos
-
- * gui/e-cal-model.c (e_cal_model_class_init): set the dispose
- handler and add a time_range_changed signal
- (e_cal_model_init): defaults for queries
- (e_cal_model_dispose): dispose of things
- (e_cal_model_finalize): remove bits that are in dispose now
- (search_by_uid_and_client): allow NULL client to find any uid
- (e_cal_view_objects_added_cb): ref the client
- (update_e_cal_view_for_client): use the full query
- (remove_client): pre change for each row and emit deleted signals
- (redo_queries): relaunch the query for each client
- (e_cal_model_get_time_range): get the time range
- (e_cal_model_set_time_range): set the time range and redo the
- queries
- (e_cal_model_set_search_query): get the search query
- (e_cal_model_set_search_query): set the search query and redo the
- queries
- (e_cal_model_get_component_for_uid): get the component info based
- on uid
- (copy_ecdv): copy and ECellDateEditValue
- (e_cal_model_copy_component_data): copy component data
- (e_cal_model_free_component_data): unref the client
-
-2004-03-15 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #48112
-
- * gui/calendar-commands.c (calendar_control_sensitize_calendar_commands):
- disable the 'Delete' menu item on recurring meetings, since 'Delete all
- Occurrences' already deals with that.
-
-2004-03-15 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #35577
-
- * gui/e-cal-view.c (e_calendar_view_delete_selected_occurrence):
- if the component is an instance, pass the recurrence ID to
- e_cal_remove_object_with_mod. Also, make the user confirm the
- deletion, and send the cancellation message for meetings.
-
-2004-03-12 Not Zed <NotZed@Ximian.com>
-
- * gui/e-cal-model.c (ecm_initialize_value): return "" instead of
- NULL if there is no default_category set. Fixes #53419.
-
-2004-03-09 Kidd Wang <kidd.wang@sun.com>
-
- * gui/e-day-view.c: (e_day_view_finish_long_event_resize): add a call
- to e_cal_component_commit_sequence since we have changed the property
- of the component. Whether the new event is all day should also be
- set properly according to the value of the original event.
-
-2004-03-08 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #48106
-
- * gui/dialogs/alarm-page.glade: s/Send an Email/Send an email.
-
-2004-03-05 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-notify.c (alarm_notify_init): set a GConf
- listener callback to list for changes in selected calendars.
- (alarm_notify_finalize): remove the GConf notification listener.
- (conf_changed_cb): callback to react on configuration changes. Process
- the new selected calendars and remove the unselected ones.
- (process_removal_in_hash): callback to remove unselected calendars.
-
-2004-03-04 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #50294
-
- * gui/e-tasks.c (setup_widgets): connect to "model_rows_deleted" signal
- on the ETable's model.
- (model_rows_deleted_cb): callback for clearing the preview widget when
- the currently selected task is removed.
-
-2004-03-04 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-commands.c (calendar_control_sensitize_calendar_commands):
- set the sensitivity correctly, depending on whether the command applied
- to the currently selected event or the default client.
- (calendar_control_activate): make sure we start with the menu items
- correctly enabled/disabled.
-
-2004-03-04 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #53496
-
- * gui/dialogs/cal-prefs-dialog.glade: set the same spacing for all
- tabs in the notebook.
-
-2004-03-04 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/comp-editor.c (comp_editor_append_page): always add
- the page.
-
- * gui/dialogs/event-page.c (event_page_fill_widgets): continue filling
- up all other fields even if there are missing ones, and return the
- validation result.
-
-2004-03-04 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-notify-dialog.c (alarm_notify_dialog):
- don't make the dialog window sticky, the icon on the system tray
- already shows in all workspaces.
-
-2004-03-04 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #54028
-
- * gui/alarm-notify/alarm-queue.c (query_objects_changed_cb): fixed the
- time range for the alarm query, to include the end of today.
-
-2004-03-04 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #53137
-
- * gui/dialogs/comp-editor-page.[ch]: made fill_widgets virtual
- method return a gboolean.
- (comp_editor_page_fill_widgets): return value from virtual method
- implementation.
-
- * gui/dialogs/event-page.c (event_page_fill_widgets):
- * gui/dialogs/meeting-page.c (meeting_page_fill_widgets):
- * gui/dialogs/recurrence-page.c (recurrence_page_fill_widgets):
- * gui/dialogs/schedule-page.c (schedule_page_fill_widgets):
- * gui/dialogs/task-details-page.c (task_details_page_fill_widgets):
- * gui/dialogs/task-page.c (task_page_fill_widgets):
- * gui/dialogs/alarm-page.c (alarm_page_fill_widgets): return value,
- as expected from the virtual method signature.
-
- * gui/dialogs/comp-editor.c (comp_editor_append_page): dont add the
- page if there was an error calling the fill_widgets method.
-
-2004-03-03 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-cal-model.c (e_cal_model_add_client): prevent from adding
- the same client more than once.
-
-2004-03-02 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/cal-search-bar.c: added support for searching the location
- field also.
- (regen_query): take into account the new search field.
-
-2004-03-02 JP Rosevear <jpr@ximian.com>
-
- * gui/Makefile.am: remove conduit dir creation
-
-2004-03-02 Larry Ewing <lewing@ximian.com>
-
- * gui/calendar-component.c: add untested start of dnd support for
- source selector.
-
-2004-03-01 Dan Winship <danw@ximian.com>
-
- * gui/alarm-notify/alarm-notify.c: fix rampant double-freeing.
-
-2004-03-01 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/itip-utils.c (comp_server_send): pass the user list and
- returned icalcomponent to e_cal_send_objects().
-
-2004-03-01 Kidd Wang <kidd.wang@sun.com>
-
- * gui/print.c: (print_date_label): ignore the timezone info of all-day
- events.
-
-2004-02-27 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.h: remove proto
-
- * gui/gnome-cal.c (set_query): rename from
- gnome_calendar_set_query and make static
-
- * gui/e-day-view.h: remove proto for dead function
-
- * gui/e-day-view.c: guard config.h include
-
-2004-02-26 Rodney Dawes <dobey@ximian.com>
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_construct):
- Create the arrows in these widgets as GTK_SHADOW_NONE, since the
- default arrow type in GTK+ 2.x is flat triangle arrows, and shadow
- types are generally ignored for arrows anyway, and so we don't look
- ugly with themes that handle shadow types on arrows correctly
-
-2004-02-26 Rodney Dawes <dobey@ximian.com>
-
- * gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.server.in.in:
- Fix the repo_id to include the evolution base version
-
-2004-02-26 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (client_cal_opened_cb): make sure we unref the
- task pad client and the calendar clients are unreffed by the hash
- table
-
-2004-02-24 JP Rosevear <jpr@ximian.com>
-
- * gui/migration.c (migrate_calendars): fix float type pane
- position keys (we migrated these improperly in the past), just use
- the default value
-
- Fixes #53087
-
-2004-02-18 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-notify.c (free_client_hash): remove the client
- from the queue also.
-
- * gui/gnome-cal.c (client_cal_opened_cb): set the task pad client to NULL
- if opening it failed. Show more verbose status bar messages.
-
-2004-02-18 Rodrigo Moya <rodrigo@ximian.com>
-
- * common/authentication.c (auth_func_cb): call first e_passwords_get_password
- before calling _ask_password.
-
- * gui/alarm-notify/alarm-queue.c (query_objects_changed_cb): add 1 second
- to the last notification time, or we'll get many times the same notification.
-
-2004-02-18 Kidd Wang <kidd.wang@sun.com>
-
- * gui/e-cal-view.c: (e_calendar_view_add_event),
- (clipboard_get_text_cb): make copy & paste and drag & drop behave
- the same way described as follows:
- In day view and work week view
- from main canvas to top canvas
- before copy or drag: short event
- after paste or drop: all-day event
- from main canvas to main canvas
- before copy or drag: short event
- after paste or drop: short event
- from top canvas to top canvas
- before copy or drag: all-day event
- after paste or drop: all-day event
- before copy or drag: long event
- after paste or drop: long event
- from top canvas to main canvas
- before copy or drag: all-day event
- after paste or drop: short event
- before copy or drag: long event
- after paste or drop: short event
- In week view, month view and list view life is pretty simple since
- there's no top canvas in these three views. We just get what we copy
- or drag after we perform paste or drop.
-
-2004-02-18 Kidd Wang <kidd.wang@sun.com>
-
- * gui/itip-utils.c: (itip_send_comp): set the string length properly.
-
-2004-02-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-queue.c (tray_icon_clicked_cb): removed buggy
- characters from menu items' texts.
-
-2004-02-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-notify.c (alarm_notify_add_calendar): open the
- calendars asynchonously.
- (cal_opened_cb): callback for "cal_opened" signal. Add the calendars to
- the alarm queue here.
-
- * gui/alarm-notify/alarm-queue.c (query_objects_changed_cb): get alarms
- since the last notification, only use current time when there is no
- previous notification time.
-
- * gui/alarm-notify/notify-main.c (init_session): set session restart
- style to RESTART_IF_RUNNING.
-
-2004-02-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/notify-main.c: no need to keep the master client.
- (init_session): just set the daemon's restart style, not the restart
- command. Connect to "save_yourself" signal on the session also.
- (save_session_cb): set the restart command here.
-
-2004-02-12 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/dialogs/copy-source-dialog.c (copy_source_dialog): Instead
- of saying "Select destination source", we now say "... calendar" or
- "... task list", based on object type.
-
-2004-02-12 Chris Toshok <toshok@ximian.com>
-
- * gui/migration.c (CONTACTS_BASE_URI): rename from
- CONTACT_BASE_URI, and change to contacts:// to match e-d-s.
- (create_calendar_contact_source): CONTACT -> CONTACTS.
- (create_calendar_sources): same.
-
-2004-02-13 Bruce Tao <bruce.tao@sun.com>
-
- See #51567
- * gui/dialogs/delete-comp.c (delete_component_dialog):
- use "gtk_dialog_add_buttons" to change the response_id of button
- "YES" and "NO".
-
-2004-02-11 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #53886
-
- * gui/gnome-cal.c (gnome_calendar_paste_clipboard,
- gnome_calendar_delete_selection, gnome_calendar_cut_clipboard,
- gnome_calendar_copy_clipboard): removed g_assert_if_reached calls
- since we might get a different widget getting the focus.
- (get_focus_location): check the canvas's' focused item.
-
-2004-02-11 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #53271
-
- * gui/calendar-component.c (delete_calendar_cb): remove the source from
- the GnomeCalendar widget also.
-
- * gui/tasks-component.c (delete_task_list_cb): ditto.
-
-2004-02-11 Kidd Wang <kidd.wang@sun.com>
-
- * gui/print.c: (print_date_label): guarantee we do have some timezone
- before the time convertion.
-
-2004-02-10 JP Rosevear <jpr@ximian.com>
-
- * importers/icalendar-importer.c: remove useless include
-
- * importers/Makefile.am: remove executable build cruft
-
-2004-02-09 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (client_cal_opened_cb): don't add the clients to the
- internal hash/list here, just remove it if opening the calendar fails.
- (gnome_calendar_add_event_source): add the client to the internal
- hash/list here.
-
-2004-02-09 Kidd Wang <kidd.wang@sun.com>
-
- * gui/e-cal-model-tasks.c: (ecmt_set_value_at): refuse to update
- the task info if due date is before start date.
-
-2004-02-05 JP Rosevear <jpr@ximian.com>
-
- * Convert the calendar_config_get_timezone and
- icaltimezone_get_builtin_timezone pair to just
- calendar_config_get_icaltimezone, this also guarantees we will
- have some timezone (even if its just UTC)
-
- Fixes #53754
-
-2004-02-05 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-config.h: add proto
-
- * gui/calendar-config.c (calendar_config_get_icaltimezone): return
- the icaltimezone based on the location and default to utc if we
- can't find one
- (calendar_config_get_hide_completed_tasks_sexp): use above
-
-2004-02-05 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.c (set_color_picker): make failure
- not so draconian - make the color black
-
- Fixes #53547
-
-2004-02-05 Kidd Wang <kidd.wang@sun.com>
-
- * gui/goto-dialog.glade: add a mnemonic for the 'Go to Today' button
- in the 'Go To Date' dialog.
-
-2004-02-05 Sarfraaz Ahmed <asarfraaz@novell.com>
-
- Fixes #53388
-
- * gui/e-itip-control.c (get_next): added a check for NULL
-
-2004-02-04 JP Rosevear <jpr@ximian.com>
-
- * importers/icalendar-importer.c (gnome_calendar_import_data_fn):
- use new cal auth functions
-
- * common/authentication.c (auth_new_cal_from_default): get a
- default calendar with auth
-
- * common/authentication.h: add proto
-
-2004-02-04 JP Rosevear <jpr@ximian.com>
-
- * importers/icalendar-importer.c (importer_destroy_cb): we only
- have a single client to free
- (prepare_events): make the vtodo list optional
- (button_toggled_cb): handle the type of thing to import switching
- (primary_selection_changed_cb): handle the selected item switching
- (create_control_fn): create a control with types (events, tasks)
- and corresponding source selectors
- (process_item_fn): only import one type of item at a time
- (load_file_fn): load the ecal as dictated by the source and type
- (vcal_importer_new): pass in control function
- (gnome_calendar_import_data_fn): get the default calendars
-
- * importers/Makefile.am (importersdir): add lib
-
-2004-02-04 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #52970
-
- * idl/evolution-calendar.idl: added back the AlarmNotify interface.
-
- * gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.server.in.in:
- changed to have the AlarmNotify component be created via a factory.
-
- * gui/alarm-notify/alarm-notify.[ch]: converted to implement the
- AlarmNotify interface.
-
- * gui/alarm-notify/notify-main.c (main): register the factory with
- bonobo_generic_factory_new, not the object itself. Removed redundant
- call to bonobo_object_unref. Call e_passwords_shutdown on exit.
-
- * gui/alarm-notify/config-data.c (config_data_get_calendars_to_load):
- get only the selected calendars/task lists.
-
-2004-02-04 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_add_event_source): don't update the
- date navigator query nor the internal lists here...
- (client_cal_opened_cb): do it here.
-
-2004-02-04 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/main.c (launch_alarm_daemon_cb): display the exception message
- on error.
-
- * gui/gnome-cal.c (open_ecal): open calendars asynchronously.
- (client_cal_opened_cb): on success, add the clients to the models here.
- (gnome_calendar_add_event_source, gnome_calendar_construct): not here.
-
-2004-02-04 Kidd Wang <kidd.wang@sun.com>
-
- * gui/dialogs/alarm-page.glade: change the access key for adding a
- reminder from Alt+a to Alt+d to avoid conflict with the menuitem.
-
-2004-02-04 Yong Sun <Yong.Sun@sun.com>
-
- * gui/print.c: Fix a bug in evolution/calendar/gui/print.c:
- bound_text(). It does not break lines with the correct boundary of UTF-8
- characters. So, for non-latin locales, it will cause printing issues.
-
-2004-02-03 Dan Winship <danw@ximian.com>
-
- * gui/tasks-component.h: Fix location of e-activity-handler.h
- #include
-
- * gui/Makefile.am (INCLUDES): add widgets/misc for
- e-activity-handler.h and e-task-bar.h
-
- * gui/dialogs/Makefile.am (INCLUDES): Likewise
-
-2004-02-02 JP Rosevear <jpr@ximian.com>
-
- * importers/icalendar-importer.c (support_format_fn): use
- g_file_get_contents
- (load_file_fn): ditto
- (vcal_support_format_fn): ditto
- (load_vcalendar_file): ditto
-
-2004-01-30 JP Rosevear <jpr@ximian.com>
-
- * remove dead files
-
-2004-01-29 Gary Ekker <gekker@novell.com>
-
- Fixes #51871
-
- * gui/dialogs/calendar-setup.c (calendar_setup_edit_calendar): add
- activate handler for name_entry
- (calendar_setup_edit_task_list): ditto
-
-2004-01-30 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-component.c (create_new_todo): remove extraneous ;
-
- Fixes #53418
-
-2004-01-29 JP Rosevear <jpr@ximian.com>
-
- * gui/migration.c (create_calendar_contact_source): don't set the
- group to be read only until after the source is added.
-
-2004-01-29 JP Rosevear <jpr@ximian.com>
-
- * gui/migration.c (migrate_ical_folder_to_source): migrate to a
- specific source
- (migrate_ical_folder): create a new source based on the new source
- name/uid
- (create_calendar_contact_source): use the #define for the base uri
- (create_calendar_sources): try and find the right sources if they
- already exist
- (create_task_sources): ditto
- (migrate_calendars): make sure the personal source is the system
- source
- (migrate_tasks): ditto
-
-2004-01-29 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-view.c (calendar_view_get_type_code): added support for
- the list view also.
-
-2004-01-28 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (update_query):
- * gui/e-cal-list-view.c (e_cal_list_view_update_query):
- * gui/e-cal-view.c (e_calendar_view_update_query): stop status bar
- messages madness.
-
-2004-01-27 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-component.c (delete_calendar_cb): use e_cal_remove
-
- * gui/tasks-component.c (delete_task_list_cb): ditto
-
-2004-01-27 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #53276
-
- * gui/dialogs/copy-source-dialog.c (show_error): new function to
- create an error message dialog.
- (copy_source): check if the destination calendar is read only, and
- if so, don't try to copy components over. Fixed leaks. Call show_error
- to display meaningful error messages.
-
-2004-01-26 JP Rosevear <jpr@ximian.com>
-
- * gui/migration.c (migrate_ical_folder): add the source to the
- group so it actually shows up
-
-2004-01-26 JP Rosevear <jpr@ximian.com>
-
- * gui/migration.c (migrate_calendars): get the source name with
- out using freed memory
- (migrate_tasks): ditto
-
-2004-01-26 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #53338
-
- * gui/dialogs/calendar-setup.c (dialog_to_source): set the relative
- URI on the source for remote sources.
-
-2004-01-26 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #52312
-
- * gui/dialogs/calendar-setup.c (create_new_source_with_group):
- * gui/migration.c (migrate_ical_folder, create_calendar_sources,
- create_task_sources): set the relative URI for local calendars and
- task lists to be the source UID.
-
-2004-01-24 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.[ch]
- (calendar_component_peek_source_selector): new function.
-
- * gui/tasks-component.[ch]
- (tasks_component_peek_source_selector): new function.
-
- * gui/e-tasks.c (backend_died_cb):
- * gui/gnome-cal.c (backend_died_cb): don't tell the user to restart
- Evolution, there is no need now, just unselecting and selecting
- back the calendar loads it again. Also, remove the crashed client
- from the list of loaded clients. Also, unselect the source on
- the source selector.
-
-2004-01-24 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-component.c (update_primary_selection): use
- e_source_list_peek_source_any
- (setup_create_ecal): ditto
- (create_new_todo): just use the default call directly
- (update_uris_for_selection): just use e-tasks remove/add todo
- source directly
-
-2004-01-24 JP Rosevear <jpr@ximian.com>
-
- * gui/e-tasks.c (e_tasks_add_todo_source): don't unref and ref,
- the hash table does this
- (e_tasks_remove_todo_source): ditto
-
- Fixes #53281
-
-2004-01-24 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-calendar-table.c (e_calendar_table_init): use the colors from
- the model as background, not as foreground.
-
- * gui/e-cal-model-tasks.c (ecmt_get_color_for_component): return the
- color assigned to each URI if it's not overdue.
-
-2004-01-24 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-component.c (delete_task_list_cb): sync the source
- list after the source removal
-
- * gui/calendar-component.c (delete_calendar_cb): ditto
-
- Fixes #53271
-
-2004-01-24 JP Rosevear <jpr@ximian.com>
-
- * gui/migration.c (setup_progress_dialog): display a progress
- dialog
- (dialog_close): destroy it
- (dialog_set_folder_name): display the folder being migrated
- (dialog_set_progress): update the progress
- (check_for_conflict): make sure we don't name anything the same
- (get_source_name): create a source name
- (migrate_ical): migrate the events/tasks from one ecal to another
- (migrate_ical_folder): migrate a specific folder
- (migrate_calendars): use above
- (migrate_tasks): ditto
-
-2004-01-23 Rodney Dawes <dobey@ximian.com>
-
- * gui/e-itip-control.c: Use PUBLISH if no METHOD defined
-
- Fixes #45564
-
-2004-01-22 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-cal-model.c (e_cal_view_objects_removed_cb): don't assert
- if we can't find the component, just continue with next item in
- the list.
-
-2004-01-22 JP Rosevear <jpr@ximian.com>
-
- * gui/migration.c (process_old_dir): remove useless e_mkdir_hier
- call.
-
- Fixes #53065
-
-2004-01-22 JP Rosevear <jpr@ximian.com>
-
- * gui/e-tasks.c (e_tasks_setup_view_menus): Remove debugging
- statement
-
-2004-01-22 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (setup_widgets): use the calendar component
- config dir
- (gnome_calendar_setup_view_menus): use the calendar component base
- dir for the view storage
-
- * gui/e-tasks.c (e_tasks_setup_view_menus): use the task component
- base dir for the view storage
-
- Fixes #53133
-
-2004-01-21 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-tasks.c (e_tasks_add_todo_source): check return value
- from auth_new_cal_from_source(). Connect to "backend_died"
- signal on the ECal class.
- (backend_died_cb): callback for "backend_died" that displays
- an error message when that happens.
-
- * gui/gnome-cal.c (backend_died_cb): use a GtkMessageDialog.
-
-2004-01-21 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-tasks.[ch] (e_tasks_add_todo_uri, e_tasks_remove_todo_uri,
- e_tasks_get_default_uri): renamed to _source and made them work
- with ESource's.
-
- * gui/tasks-component.c (update_uri_for_primary_selection,
- add_uri_for_source, remove_uri_for_source):
- * gui/tasks-control.c (tasks_control_set_property): updated for
- changes in e-tasks.[ch].
-
-2004-01-21 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/calendar-setup.c (create_new_source_with_group):
- added 'ECalSourceType' argument to be able to create the
- ECal correctly. Added a call to e_cal_open with 'only_if_exists'
- set to FALSE so that the backend creates the calendar.
- (new_calendar_finish, new_task_list_finish): pass new argument
- to create_new_source_with_group.
-
-2004-01-21 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/tasks-component.c (delete_task_list_cb): call
- e_cal_remove_calendar to actually remove the task list via
- the backend.
-
-2004-01-21 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #51705
-
- * gui/calendar-component.c (delete_calendar_cb): call
- e_cal_remove_calendar to actually remove the calendar via
- the backend.
-
-2004-01-21 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/calendar-setup.c (calendar_setup_new_calendar): just
- use the convienence function for the default gconf client (fixes
- leak)
- (calendar_setup_new_task_list): ditto
- (new_task_list_finish): we don't support task uri's
-
-2004-01-21 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/calendar-setup.c (source_to_dialog): only block
- widgets that exist
-
-2004-01-19 JP Rosevear <jpr@ximian.com>
-
- * gui/e-cal-model-tasks.c (ensure_task_not_complete): correct
- property name c/p error
-
- Fixes # 52269
-
-2004-01-19 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-component.c (update_primary_selection): handle the
- case where we have a bogus uid
-
- * gui/calendar-component.c (update_primary_selection): ditto
-
-2004-01-19 Radek Doulik <rodo@ximian.com>
-
- * gui/print.c (print_day_add_event): uncomment and use
- ECalModelComponent
- (print_day_details): use e_cal_model_generate_instances
- (print_day_details_cb): use ECalModelGenerateInstancesData
- (print_day_long_event): use event color
- (print_day_event): ditto
- (print_month_small): use e_cal_model_generate_instances
- (instance_cb): use ECalModelGenerateInstancesData
-
-2004-01-18 Radek Doulik <rodo@ximian.com>
-
- * gui/print.c (print_border_with_triangles): use rgb color as
- fillcolor
- (print_week_day_event): ditto
- (print_table): set page orientation, it may be changed from last
- printing
- (print_comp): ditto
-
- * gui/e-cal-model.c (e_cal_model_get_rgb_color_for_component): new
- helper function, gets component color as rgb double values
-
- * gui/print.c (print_week_summary_cb): uncommented and updated for
- e_cal_model_generate_instances
- (print_week_summary): use e_cal_model_generate_instances
- (print_border_with_triangles): pass rgb fillcolor
- (print_border_rgb): new function to print border with rgb color
- background
-
- * gui/e-cal-model.c (e_cal_model_generate_instances): new
- function, similar to e_cal_generate_instances. see comments to
- understand how to use cb_data
-
-2004-01-17 JP Rosevear <jpr@ximian.com>
-
- * gui/e-calendar-table.c (e_calendar_table_delete_selected): don't
- create the component if there is a multiple selection
-
- Fixes #52266
-
-2004-01-17 JP Rosevear <jpr@ximian.com>
-
- * gui/e-cal-view.c (on_print): we are required to pass in the end
- in-out arg
-
- Fixes #52972
-
-2004-01-17 JP Rosevear <jpr@ximian.com>
-
- * gui/print.h: update protos
-
- * gui/print.c (print_title): util routine to print a title
- (print_table): print out an etable
-
- * gui/calendar-commands.c (print): handle printing the list view
-
- * gui/e-cal-list-view.etspec: draw the grid to mimic tasks
-
- * gui/tasks-control.c (tasks_control_print_cmd): use print_table
-
- Fixes #51751, #52958
-
-2004-01-16 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-commands.c (print): handle list view by printing
- the month
-
-2004-01-16 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (find_server): we actually want to not
- return on any error as well (like NOT FOUND)
-
-2004-01-16 JP Rosevear <jpr@ximian.com>
-
- * gui/e-comp-editor-registry.h: convert to GObject
-
- * gui/e-comp-editor-registry.c (registry_data_free): routine to
- free the registry data
- (dispose): destroy the registry data
- (finalize): finalize it
- (class_init): setup above
- (init): create full hash table
- (e_comp_editor_registry_add): weak ref the editor and strdup the
- hash table key
- (editor_destroy_cb): we get the registry data now, just remove it
-
- * gui/dialogs/comp-editor.c (close_dialog): disconnect the signal
- handlers, its a bit of a hack but it is a simple fix
-
-2004-01-16 Radek Doulik <rodo@ximian.com>
-
- * gui/print.c (print_calendar): don't set old orientation, preview
- needs right orientation even after everything is printed
-
-2004-01-16 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #52920
-
- * gui/dialogs/calendar-setup.glade: match label's text with the
- button's text.
-
-2004-01-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/tasks-component.c (impl_dispose): unref the activity
- handler.
-
-2004-01-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/tasks-component.[ch]
- (tasks_component_peek_activity_handler): new function.
- (impl_createControls): create a task bar also for the tasks
- component. We can't rely on the calendar component's one.
- (tasks_component_init): create the private activity handler.
-
- * gui/e-calendar-table.c (e_calendar_table_set_status_message):
- use the tasks component's activity handler.
-
- * gui/e-tasks.c (on_url_cb): new callback to display status
- bar messages when mousing over links.
- (setup_widgets): connect to "on_url" signal on the HTML widget.
-
-2004-01-15 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/comp-editor.c: reverted my changes made on Jan 8th.
-
-2004-01-15 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/save.[ch]: removed.
-
- * gui/alarm-notify/Makefile.am: removed save.[ch].
-
- * gui/alarm-notify/notify-main.c: removed obsolete headers.
-
- * gui/alarm-notify/config-data.[ch]
- (config_data_set_last_notification_time,
- config_data_get_last_notification_time,
- config_data_save_blessed_program, config_data_is_blessed_program):
- new functions.
-
- * gui/alarm-notify/alarm-queue.c: dont use removed functions.
- (alarm_trigger_cb, procedure_notification_dialog,
- alarm_queue_init):
- use config_data_* functions.
-
- * gui/alarm-notify/alarm-notify.c: dont use removed functions.
-
-2004-01-15 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-component.h: update protos
-
- * gui/tasks-component.c (impl_finalize): free base dir
- (impl_upgradeFromVersion): just call migrate_tasks
- (tasks_component_init): set base dir value
- (tasks_component_peek_base_directory): accessor
- (tasks_component_peek_source_list): ditto
-
- * gui/migration.c (process_old_dir): look for a source with the
- name and fallback to creating it
- (create_calendar_contact_source): create the contacts:// source
- (create_calendar_sources): use above and create all the necessary
- sources
- (create_task_sources): create all the necessary sources
- (migrate_calendars): do all the migration logic here, upgrade
- bonobo-conf to gconf
- (migrate_tasks): ditto
-
- * gui/calendar-component.h: update prototypes
-
- * gui/calendar-component.c (impl_finalize): free the base
- directory
- (impl_upgradeFromVersion): just call migrate_calendars
- (calendar_component_init): fill in base dir value
- (calendar_component_peek_base_directory): accessor
- (calendar_component_peek_source_list): ditto
-
-2004-01-15 Radek Doulik <rodo@ximian.com>
-
- * gui/calendar-component.c (create_new_event): test priv->calendar
- is not NULL before getting current view
-
- * gui/tasks-component.c (primary_source_selection_changed_cb):
- reset create_ecal
-
- * gui/calendar-component.c (impl_requestCreateItem): merge with
- JP's changes
- (primary_source_selection_changed_cb): reset create_ecal
-
-2004-01-14 Radek Doulik <rodo@ximian.com>
-
- * gui/e-cal-list-view.c (e_cal_list_view_get_selected_time_range):
- new implementation, use time range from selected event
-
- * gui/e-cal-view.c (e_calendar_view_get_selected_time_range):
- return gboolean, TRUE if requested time was set, FALSE otherwise
- (e_calendar_view_new_appointment_full): use current time if time
- range is unavailable
-
- * gui/calendar-component.c (impl_requestCreateItem): use
- e_calendar_view_new_appointment_full instead of
- cal_comp_event_new_with_current_time
-
- * gui/e-cal-view.c (e_calendar_view_new_appointment_full): new
- helper function
-
- * gui/comp-editor-factory.c (edit_new): use
- cal_comp_event_new_with_current_time
-
- * gui/calendar-component.c (impl_requestCreateItem): use
- cal_comp_event_new_with_current_time
-
- * gui/comp-util.c (cal_comp_event_new_with_current_time): new
- function, cut'n'pasted from get_default_event
- (calendar-component.c and comp-editor-factory.c)
-
-2004-01-14 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-component.c (impl_requestCreateItem): new utility
- routine to create new tasks
- (create_new_todo): use above so we don't try to set up the
- creation ecal unless we are actually creating a new item
-
- * gui/calendar-component.c (create_new_event): new utility routine
- to create new events
- (impl_requestCreateItem): use above so we don't try to set up the
- creation ecal unless we are actually creating a new item
-
-2004-01-14 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-calendar-table.c (e_calendar_table_show_popup_menu):
- use get_selected_objects() instead of get_selected_comp().
-
-2004-01-14 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-cal-model-tasks.c (get_status): removed assertion.
-
-2004-01-14 Rodrigo Moya <rodrigo@ximian.com>
-
- * common/authentication.c (auth_new_cal_from_source): check
- return value from e_cal_new().
-
- * gui/gnome-cal.c (gnome_calendar_construct): if there is no
- default tasks folder, don't create the ECal from it.
-
-2004-01-14 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-component.c (impl_requestCreateItem): don't try to set
- up the creation ecal unless we are actually creating a new item
-
-2004-01-13 Rodney Dawes <dobey@ximian.com>
-
- * gui/Makefile.am: Only link in libsoup where we need it
-
-2004-01-13 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.c (impl_upgradeFromVersion): free 'base_uri'
- at the end of the function, or it will leak, and removed duplicated
- code to create the birthdays backend.
-
-2004-01-12 Gary Ekker <gekker@novell.com>
-
- * gui/Makefile.am: add e-pub-utils.[ch]
- for Free/Busy publishing
-
- * gui/apps_evolution_calendar.schemas.in.in: add schema for
- /apps/evo/calendar/free_busy key
-
- * gui/calendar-commands.c (publish_freebusy_cmd): change to
- publish component rather than attach as email
-
- * gui/calendar-config-keys.h: add free_busy/urls key definition
-
- * gui/calendar-config.[ch] (calendar_config_get_free_busy): new
- method for retrieving FB gconf key
- (calendar_config_set_free_busy): new method for saving FB
- gconf key
-
- * gui/e-cal-view.c (on_publish): change to publish component
- rather than attach as email
-
- * gui/itip-utils.[ch] (itip_publish_begin): new method to process
- e_cal_components and aggregate the data if we are publishing
- for multiple calendars
- (itip_publish_comp): new method to publish the ical data to an
- http server via libsoup
- (comp_fb_normalize): new static method to ensure rfc 2446 compliant
- data before publishing icalcomponent_get_uid
- (fb_sort): new static method to sort FB properties in ascending order
-
- * gui/dialogs/Makefile.am: add url-editor-dialog.[ch] and
- url-editor-dialog.glade for configure FB publishing
-
- * gui/dialogs/cal-prefs-dialog.[ch] (cal_prefs_dialog_url_add_clicked):
- (cal_prefs_dialog_url_edit_clicked):new method for events in FB tab
- of cal-prefs-dialog
- (cal_prefs_dialog_url_remove_clicked): ditto
- (cal_prefs_dialog_url_enable_clicked): ditto
- (cal_prefs_dialog_url_url_list_change): ditto
- (cal_prefs_dialog_url_url_list_enable_toggled): ditto
- (cal_prefs_dialog_url_url_list_double_click): ditto
- (show_fb_config): new method for updating dialog with FB specific
- data in gconf
- (update_fb_config): new method for updating gconf with FB specific
- data from dialogs
- (setup_changes): detect changes in url_list gtk_tree_view
- (get_widgets): include new dialog widgets for FB config
- (init_widgets): connect signals for new FB config widgets
-
- * gui/dialogs/cal-prefs-dialog.glade: add new widgets for FB config
-
- * gui/dialogs/url-editor-dialog.[ch]: add files for FB url-editor dialog
-
- * gui/dialogs/url-editor-dialog.glade: ditto
-
- * gui/e-pub-utils.[ch]: add files with FB publishing utilities
-
- * gui/calendar-component.c (init_calendar_publishing): sets up
- listeners to publish calendar, g_idle_add, and on gconf change
- (init_calendar_publishing_cb): ditto
- (conf_changed_callback): ditto
- (impl_createControls): ditto
-
-2004-01-12 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.c (impl_upgradeFromVersion): sync the source
- list after creating the remote source group.
-
-2004-01-12 JP Rosevear <jpr@ximian.com>
-
- * Revert William McCann's patch of 2003-12-19 until we can get
- consistent across all of evolution
-
-2004-01-12 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/dialogs/calendar-setup.c (source_to_dialog): Only update dialog
- widgets if they exist.
-
-2004-01-11 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-component.c: Fix copyright notice, its copyright
- Novell not our hackers
-
- * gui/tasks-component.h: ditto
-
- * gui/calendar-component.c: ditto
-
- * gui/calendar-component.h: ditto
-
-2004-01-10 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (open_ecal): cast the views to E_CALENDAR_VIEW,
- not to E_CAL_VIEW.
-
-2004-01-10 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/notify-main.c: added missing headers.
-
- * gui/alarm-notify/alarm-notify.c (alarm_notify_remove_calendar):
- use the correct variable when calling alarm_queue_remove_client().
-
- * gui/calendar-component.c (impl_upgradeFromVersion): removed redundant
- variable declarations.
-
- * gui/migration.c (process_old_dir):
- * gui/e-timezone-entry.c (e_timezone_entry_mnemonic_activate):
- * gui/e-date-time-list.c (e_date_time_list_finalize):
- * gui/e-alarm-list.c (e_alarm_list_finalize): fixed warnings.
-
- * gui/e-calendar-table.c: added missing prototypes at the top to
- avoid warnings.
-
- * gui/e-week-view.c (e_week_view_scroll_a_step):
- * gui/e-day-view.c (e_day_view_event_move): directly return in the
- default: case.
-
- * gui/e-tasks.c (setup_widgets): connect to changes on the model.
- (model_row_changed_cb): callback to update the HTML detailed view
- when the currently selected task changes.
- (client_obj_updated_cb): removed unused function.
- (set_status_message): changed to accept a variable list of arguments.
- (e_tasks_add_todo_uri): display status messages and get error message
- from backend and display it in a dialog.
- (cal_opened_cb, load_error, method_error, permission_error): removed
- unused functions.
-
- * gui/gnome-cal.c (open_ecal): added a GnomeCalendar argument, and
- display status messages.
- (gnome_calendar_construct, gnome_calendar_add_event_source):
- adapted to changes in open_ecal().
-
-2004-01-10 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-queue.c (display_notification): keep
- all the tray icons we create in a list.
- (tray_icon_destroyed_cb): remove the tray icon data from the list.
- (popup_dismiss_cb, popup_dismiss_all_cb): implemented missing
- popup menu items.
-
-2004-01-09 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/calendar-component.c (new_calendar_cb): calendar_config ->
- calendar_setup.
- (edit_calendar_cb): Ditto.
- (impl_requestCreateItem): Ditto.
-
- * gui/tasks-component.c (new_task_list_cb): Use calendar_setup.
- (edit_task_list_cb): Implement properties callback.
- (rename_task_list_cb): Remove.
- (fill_popup_menu_cb): Remove "rename" and add "properties".
- (impl_requestCreateItem): Use calendar_setup.
-
- * gui/dialogs/Makefile.am (libcal_dialogs_la_SOURCES): calendar_config
- -> calendar_setup. Remove new-task-list.[ch].
- (glade_DATA): calendar_config -> calendar_setup. Remove
- new-task-list.glade.
-
- * gui/dialogs/new-task-list.[ch]: Remove.
-
- * gui/dialogs/calendar-config.[ch]: Rename to calendar-setup.[ch].
-
- * gui/dialogs/calendar-config.glade: Rename to calendar-setup.glade.
-
-2004-01-09 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-component.c (impl_upgradeFromVersion): make sure we
- sync the source list when appropriate
-
- * gui/tasks-component.c (impl_upgradeFromVersion): ditto
-
-2004-01-09 ERDI Gergo <cactus@cactus.rulez.org>
-
- * gui/calendar-component.c (impl_upgradeFromVersion): Create
- ESource for anniversaries
-
-2004-01-09 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/calendar-component.c (new_calendar_cb): Call
- calendar_config_new_calendar().
- (rename_calendar_cb): Remove.
- (edit_calendar_cb): Implement properties callback.
- (fill_popup_menu_cb): Add "Properties..." item and remove "Rename".
-
- * gui/dialogs/Makefile.am (libcal_dialogs_la_SOURCES): Add
- calendar-config.[ch] and remove new-calendar.[ch].
- (glade_DATA): Add calendar-config.glade and remove new-calendar.glade.
-
- * gui/dialogs/calendar-config.[ch]: Implement calendar creation and
- editing.
-
- * gui/dialogs/calendar-config.glade: Add GUI for above.
-
-2004-01-09 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-component.c (impl_upgradeFromVersion): return the
- corba values
-
- * gui/calendar-component.c (impl_upgradeFromVersion): ditto
-
-2004-01-09 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.c (impl_upgradeFromVersion): only migrate
- old calendars if migrating from <= 1.4.x.
-
- * gui/tasks-component.c (impl_upgradeFromVersion): ditto for tasks.
-
-2004-01-09 Andrew Wu <Yang.Wu@sun.com>
-
- * gui/e-cal-view.c (e_calendar_view_class_init):
- add a new signal "event_move" and its key binding.
-
- * gui/e-cal-view.h:
- add a new type "ECalViewMoveDirection".
- add a new virtual method "event_move" for ECalView.
-
- * gui/e-day-view.c
- (e_day_view_event_move), (e_day_view_change_event_time):
- Use "Alt + Arrow" to move a selected event through time lines
- or different days.
-
- * gui/e-day-view.h:
- add a new property "last_edited_comp_string" for EWeekView.
-
- * gui/e-week-view.c (e_week_view_class_init), (e_week_view_init),
- (e_week_view_reshape_events), (e_week_view_event_move),
- (e_week_view_get_day_offset_of_event), (e_week_view_scroll_a_step),
- (e_week_view_change_event_time), (e_week_view_do_key_press),
- (e_week_view_move_selection_day),
- (e_week_view_get_adjust_days_for_move_up),
- (e_week_view_get_adjust_days_for_move_down),
- (e_week_view_get_adjust_days_for_move_left),
- (e_week_view_get_adjust_days_for_move_right):
- Use "Alt + Arrow" to move a selected event through different days.
-
- * gui/e-week-view.h:
- add a new property "last_edited_comp_string" for EWeekView.
-
-2004-01-08 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-queue.c (display_notification): store
- the ECal's associated ECalView, and connect to its "objects_removed"
- signal.
- (notifiy_dialog_cb): disconnect signals from the ECalView, not the
- ECal.
- (on_dialog_objs_removed_cb): adapted to respond to "objects_removed"
- signal on ECalView. Made it destroy the tray bar icon also.
- (add_popup_menu_item): new function to create the popup items.
- (tray_icon_clicked_cb): remove connection to obsolete signal, and
- made it popup a menu on right-click.
- (popup_open_cb, popup_dismiss_cb, popup_dismiss_all_cb): callbacks
- for popup menu.
-
- * gui/gnome-cal.c (connect_week_view_focus): don't access the
- widget's private fields if NULL.
-
-2004-01-08 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/comp-editor.c (save_comp): moved the line that sets
- priv->updating to FALSE up some lines, to avoid getting callbacks
- with an incorrect value on it.
- (obj_modified_cb): check the UIDs of the objects we get passed to
- see if the one being edited is amongst them.
-
-2004-01-08 Kidd Wang <kidd.wang@sun.com>
-
- * gui/e-cal-view.h: delete the ECalViewMoveDirection type declaration
- which was added by mistake yesterday.
-
- * ChangeLog: add a missed entry for calender-commands.c.
-
-2004-01-07 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-queue.c (load_alarms): call e_cal_view_start
- to actually start the live query.
- (add_component_alarms): check the 'alarms' parameter before using it.
-
-2004-01-07 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-queue.c: added an ECalQuery for each loaded
- client.
- (load_alarms): use a live query to the calendar instead of calling
- e_cal_get_alarms_in_range().
- (alarm_queue_add_client): set query initially to NULL.
- (query_objects_changed_cb): renamed and made it manage both
- "objects_added" and "objects_modified" signals of ECalView.
- (query_objects_removed_cb): manage the "objects_removed" signal of
- ECalView.
- (alarm_queue_remove_client): unref the live query.
-
-2004-01-06 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_add_event_source): remove the
- item from the hash last and don't free its members because the
- hash table does that for us
-
-2004-01-06 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.c (impl_upgradeFromVersion): new
- method's implementation.
- (calendar_component_class_init): initialize new epv's member.
- (calendar_component_init): moved migration code to
- impl_upgradeFromVersion.
- (update_uri_for_primary_selection): fixed warning.
-
- * gui/tasks-component.c (impl_upgradeFromVersion): new
- method's implementation.
- (tasks_component_class_init): initialize new epv's member.
- (tasks_component_init): moved migration code to
- impl_upgradeFromVersion.
-
-2004-01-06 JP Rosevear <jpr@ximian.com>
-
- * gui/e-select-names-renderer.c (esnr_editing_done): disconnect
- the activated signal
-
-2004-01-06 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor.c (comp_editor_finalize): we don't put
- any signal handlers on the client or source client now, but we do
- on the view
- (real_set_e_cal): no signal handlers on the client
- (obj_modified_cb): we are guaranteed this is a signal for our
- component
- (obj_removed_cb): ditto
- (listen_for_changes): listen for changes on the object
- (save_comp): use above since the source_client changed
- (real_edit_comp): use above since the comp changed
-
-2004-01-06 JP Rosevear <jpr@ximian.com>
-
- * gui/e-select-names-renderer.c (esnr_activated): if we are
- de-activated, the editing is done
- (esnr_start_editing): listen for activated signal on the control
- frame
-
- Fixes #52196
-
-2004-01-06 Kidd Wang <kidd.wang@sun.com>
-
- * gui/e-calendar-table.[ch] (e_calendar_table_open_selected):
- open a dialog for the selected task.
- * gui/e-tasks.[ch] (e_tasks_open_task): ditto.
- * gui/tasks-control.c (tasks_control_sensitize_commands),
- (tasks_control_open_task_cmd): add a menu item for "Open Task".
- * gui/calender-commands.c: the event should also be allowed to open
- even when it's readonly.
-
-2004-01-05 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (open_ecal): new function to open ECal's, get any
- error information and display it to the user, all-in-one.
- (gnome_calendar_construct, gnome_calendar_add_event_source): use the
- above function, instead of e_cal_open().
- (open_error, method_error, permission_error): removed unneeded
- functions, we just display the error message returned from the
- backend.
-
-2004-01-05 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_construct): no need to connect to
- the "cal_opened" signal on the task client. Also, added code to
- add the client to the ECalendarTable's model.
- (client_cal_opened_cb, update_e_cal_view_timeout): removed unneeded
- function.
-
-2004-01-05 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_construct): display the tasks'
- primary selection in the task list, and actually open the tasks
- folder.
-
- * gui/e-tasks.c (e_tasks_set_default_uri): use the ECalModel to
- get the client for a given URI.
-
-2004-01-04 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.c (add_uri_for_source,
- remove_uri_for_source): removed redundant functions.
- (update_uris_for_selection): dont call above functions, use
- gnome_calendar_* directly.
-
-2003-12-29 Kidd Wang <kidd.wang@sun.com>
-
- * gui/calendar-commands.c (file_open_event_cb): add a menu item
- for "open appointment".
-
- * gui/e-cal-view.[ch] (e_calendar_view_open_event): add a signal
- "open_event" and bind it to "ctrl+o". When the signal is delivered,
- a dialog will be opened to edit the selected event.
-
- * gui/e-calendar-table.c (e_calendar_table_on_key_press): press "ctrl-o"
- to open a dialog.
-
-2003-12-24 JP Rosevear <jpr@ximian.com>
-
- * gui/e-select-names-renderer.c (esnr_start_editing): fix the
- signal name
-
- * gui/dialogs/meeting-page.glade: add Add Attendee button
-
- * gui/dialogs/meeting-page.c (get_widgets): extract add button
- (add_clicked_cb): edit the attendee after we add it
- (init_widgets): listen for add clicked
- (meeting_page_construct): the add button is in the glade file now
-
- * gui/e-select-names-editable.c (esne_start_editing): activate the
- control
- (e_select_names_editable_get_address): handle null dest
- (e_select_names_editable_get_name): ditto
-
- * gui/e-meeting-store.h: add proto
-
- * gui/e-meeting-store.c (e_meeting_store_find_attendee_path):
- create the path to a given attendee
-
- * gui/e-meeting-list-view.h: add proto
-
- * gui/e-meeting-list-view.c (e_meeting_list_view_edit): start
- editing the address of a particular
-
-2003-12-22 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.[ch] (gnome_calendar_add_event_source,
- gnome_calendar_remove_event_source): renamed from *_uri, to work with
- ESource's rather than with plain URIs.
- (gnome_calendar_set_default_source): ditto.
-
- * gui/control-factory.c (set_prop):
- * gui/calendar-component.c (add_uri_for_source, remove_uri_for_source,
- update_uri_for_primary_selection):
- use sources instead of uris with the GnomeCalendar widget.
-
-2003-12-22 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/save.c (get_saved_notification_time): if the setting
- is not in the config database, use the current time, to avoid getting
- hundreds of alarms for past events.
-
-2003-12-22 Rodrigo Moya <rodrigo@ximian.com>
-
- * common/authentication.[ch]: new files for managing interactive
- authentication with backends.
-
- * common/Makefile.am: build new private library.
-
- * gui/alarm-notify/alarm-notify.c (alarm_notify_add_calendar):
- * gui/dialogs/event-page.c (source_changed_cb):
- * gui/dialogs/task-page.c (source_changed_cb):
- * gui/dialogs/copy-source-dialog.c (copy_source):
- * gui/calendar-component.c (setup_create_ecal):
- * gui/calendar-offline-handler.c (backend_go_offline,
- backend_go_online, calendar_offline_handler_init):
- * gui/comp-editor-factory.c (open_client):
- * gui/e-itip-control.c (start_calendar_server):
- * gui/e-tasks.c (e_tasks_add_todo_uri):
- * gui/gnome-cal.c (gnome_calendar_construct,
- gnome_calendar_add_event_uri):
- * gui/tasks-component.c (setup_create_ecal):
- * importers/icalendar-importer.c (load_file_fn, vcal_load_file_fn,
- gnome_calendar_import_data_fn): create the ECal's via the
- auth_new_cal_from* functions in the authentication module.
-
- * gui/alarm-notify/Makefile.am:
- * gui/Makefile.am:
- * importers/Makefile.am: link new private library.
-
- * Makefile.am: added new directory to the build.
-
-2003-12-21 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.[hc]: rewrite for new ecal api, cache all
- ecal's by type and minimize loading. Switch to using the source
- option menu
-
- * conduits/todo/todo-conduit.c (start_calendar_server): ditto
-
- * conduits/calendar/calendar-conduit.c (start_calendar_server):
- use ECalSourceType
-
- * importers/icalendar-importer.c (load_file_fn): ditto
- (vcal_load_file_fn): ditto
- (gnome_calendar_import_data_fn): ditto
-
- * gui/dialogs/task-page.c (source_changed_cb): ditto
-
- * gui/dialogs/event-page.c (source_changed_cb): ditto
-
- * gui/dialogs/copy-source-dialog.h: update proto
-
- * gui/dialogs/copy-source-dialog.c (copy_source_dialog): ditto
-
- * gui/alarm-notify/alarm-notify.c (alarm_notify_add_calendar): ditto
-
- * gui/tasks-component.c (copy_task_list_cb): ditto
- (setup_create_ecal): ditto
-
- * gui/gnome-cal.c (gnome_calendar_construct): ditto
- (gnome_calendar_add_event_uri): ditto
-
- * gui/e-tasks.c (e_tasks_add_todo_uri): ditto
-
- * gui/comp-editor-factory.c (open_client): ditto
-
- * gui/calendar-offline-handler.c (backend_go_offline): ditto
- (backend_go_online): ditto
- (calendar_offline_handler_init): ditto
-
- * gui/calendar-component.c (copy_calendar_cb): ditto
- (setup_create_ecal): ditto
-
- * gui/print.c (print_month_small): don't pass type to
- e_cal_generate_instances
- (print_day_details): ditto
- (print_week_summary): ditto
-
- * gui/tag-calendar.c (tag_calendar_by_client): ditto
-
-2003-12-19 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-control.c (tasks_control_sensitize_commands): make
- sure there is a ui container
-
- * gui/calendar-commands.c (calendar_control_sensitize_calendar_commands): ditto
-
- * gui/tasks-component.c (impl_createControls): update after the
- signals are connected so that the ecal's are actually loaded
-
- * gui/calendar-component.c: ditto
-
-2003-12-19 William Jon McCann <mccann@jhu.edu>
-
- * gui/dialogs/task-page.c (source_changed_cb):
- * gui/dialogs/send-comp.c (send_component_dialog):
- * gui/dialogs/save-comp.c (save_component_dialog):
- * gui/dialogs/recur-comp.c (recur_component_dialog):
- * gui/dialogs/event-page.c (source_changed_cb):
- * gui/dialogs/delete-error.c (delete_error_dialog):
- * gui/dialogs/delete-comp.c (delete_component_dialog):
- * gui/dialogs/changed-comp.c (changed_component_dialog):
- * gui/dialogs/cancel-comp.c (cancel_component_dialog):
- * gui/dialogs/alarm-options.glade:
- * gui/dialogs/alarm-page.glade:
- * gui/dialogs/cal-prefs-dialog.glade:
- * gui/dialogs/e-delegate-dialog.glade:
- * gui/dialogs/event-page.glade:
- * gui/dialogs/new-calendar.glade:
- * gui/dialogs/new-task-list.glade:
- * gui/dialogs/recurrence-page.glade:
- * gui/dialogs/task-details-page.glade:
- * gui/dialogs/task-page.glade:
- * gui/tasks-control.c (confirm_purge):
- * gui/tasks-component.c (delete_task_list_cb)
- (rename_task_list_cb, setup_create_ecal):
- * gui/goto-dialog.glade:
- * gui/e-cal-model-tasks.c (show_geo_warning):
- * gui/comp-editor-factory.c (cal_opened_cb):
- * gui/calendar-component.c (delete_calendar_cb)
- (rename_calendar_cb, setup_create_ecal, delete_calendar_cb):
- * gui/calendar-commands.c (purge_cmd):
- Remove separators from dialogs. Use frame style recommended
- by the HIG.
-
-2003-12-18 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/tasks-component.c (impl_createControls):
- * gui/calendar-component.c (impl_createControls): make sure we
- connect to the "changed" signals after setting the initial selections
- on the ESourceSelector. Fixes some nasty warnings because of
- calendar_control_sensitize_calendar_commands being called with
- no container yet for the control.
-
-2003-12-17 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/dialogs/comp-editor.c: Add the concept of a source client, where
- the object lives currently. The plain client is where it will be
- stored.
- (comp_editor_finalize): If we have a source client, disconnect from
- and unref it.
- (save_comp): Check if the object is being moved, and if so, remove it
- from the source client, and make the target client the new source.
- (comp_editor_append_page): Connect to client_changed signal.
- (real_set_e_cal): Change an old gtk_signal_disconnect_by_data() to
- the GLib equivalent, and don't cast ECal to GtkObject. If the source
- client is not set, make it equivalent to the target client.
- (page_client_changed_cb): Implement. Handles a client change.
-
- * gui/dialogs/comp-editor-page.c (comp_editor_page_class_init): Add
- a new signal, "client_changed", that notifies that the ECal client
- was changed from one of the editor pages.
- (comp_editor_page_set_e_cal): Fix two bugs in this function; if the
- same client is set twice, its ref count could drop to 0. Additionally,
- it was unreffing the new client instead of the old one.
- (comp_editor_page_notify_client_changed): Implement.
-
- * gui/dialogs/event-page.c (event_page_fill_widgets): Fill in the
- source menu.
- (get_widgets): Get the source menu.
- (source_changed_cb): Implement. Try to open a client for the new
- source, and if successful, notify of the change. Show a dialog on
- failure, and revert to last selected source.
- (init_widgets): Connect to source menu.
- (event_page_create_source_option_menu): Implement Glade helper.
-
- * gui/dialogs/task-page.c (task_page_fill_widgets): Fill in the source
- menu.
- (get_widgets): Get the source menu.
- (source_changed_cb): Implement, similar to the event page, but for
- tasks.
- (init_widgets): Connect to source menu.
- (task_page_construct): Fix a message booboo.
- (task_page_create_source_option_menu): Implement Glade helper.
-
- * gui/dialogs/event-page.glade: Add source menu widget.
-
- * gui/dialogs/task-page.glade: Add source menu widget.
-
-2003-12-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/tasks-component.c (add_popup_menu_item):
- * gui/calendar-component.c (add_popup_menu_item): use g_file_test
- to check if the 'pixmap' argument is a file. If so, get the pixmap
- from it, or gtk_image_new_from_stock will return an empty pixmap.
-
-2003-12-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (client_cal_opened_cb): set a correct status
- message.
-
- * gui/tasks-component.c (fill_popup_menu_cb):
- * gui/calendar-component.c (fill_popup_menu_cb): use the folder*.png
- icons for folder operations.
-
- * gui/Makefile.am: removed cal-client directory from $INCLUDES.
-
-2003-12-17 Harry Lu <harry.lu@sun.com>
-
- Fixes #51665.
-
- * gui/e-week-view.c: (e_week_view_focus): call
- e_week_view_check_layout() so that the spans won't be NULL.
-
-2003-12-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-commands.c: removed the 'NewCalendar' verb.
- (file_new_calendar_cb): removed callback for 'NewCalendar' verb.
-
- * gui/calendar-component.c: (impl__get_userCreatableItems): added
- 'New Calendar' to the list of user creatable items.
- (impl_requestCreateItem): implemented 'New Calendar'.
-
- * gui/tasks-component.c (impl__get_userCreatableItems): added
- 'New Task List' to the list of user creatable items.
- (impl_requestCreateItem): implemented 'New Task List'.
-
-2003-12-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/tasks-control.[ch] (tasks_control_sensitize_commands): made
- it public.
-
- * gui/tasks-component.c (update_uri_for_primary_selection): call
- tasks_control_sensitize_commands() when the primary selection
- changes.
-
-2003-12-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.c (update_uri_for_primary_selection): call
- calendar_control_sensitize_calendar_commands when the primary selection
- changes.
- (impl_createControls): keep the view_control in the private structure and
- use control_factory_new_control() to create the control.
- (control_activate_cb): removed unneeded function.
-
- * gui/tasks-component.c (impl_createControls): use tasks_control_new to
- create the tasks view control.
- (control_activate_cb): removed unneeded function.
-
- * gui/gnome-cal.c (gnome_calendar_add_event_uri): check the return
- value from e_cal_new_from_uri.
-
-2003-12-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-notify.c (alarm_notify_remove_calendar):
- make sure we free the data stored in the hash table.
- (alarm_notify_add_calendar): call alarm_queue_add_client, or we wont
- have alarms at all.
-
- * gui/alarm-notify/alarm-queue.c: no need to hold a ref count.
- (alarm_queue_add_client, alarm_queue_remove_client): don't use the
- refcount private member.
- (alarm_queue_add_client): don't connect to non-existing ECal signals.
- (display_notification, free_client_alarms_cb): fixed warnings.
-
-2003-12-16 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes part of #41237
-
- * gui/e-calendar-table.c: use GtkClipboard instead of GtkInvisible
- for cut/copy/paste.
- (selection_clear_event, selection_received, selection_get): removed
- unneeded functions.
- (e_calendar_table_init): don't create the invisible widget.
- (e_calendar_table_copy_clipboard): use gtk_clipboard_set_text().
- (e_calendar_table_paste_clipboard): use gtk_clipboard_request_text().
- (clipboard_get_text_cb): callback for gtk_clipboard_request_text().
-
- * gui/e-cal-view.c (e_calendar_view_init, e_calendar_view_destroy,
- e_calendar_view_copy_clipboard): no need anymore to keep the last
- clipboard selection, GtkClipboard does it for us.
-
-2003-12-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/notify-main.c (alarm_notify_factory_fn): return
- a reference to the alarm_notify_service, not NULL and ref the object
- before returning it.
-
-2003-12-15 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (setup_widgets): set the list view config
- properly (so we don't blow away the month view config
-
-2003-12-15 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (setup_widgets): set the calendar for the day
- view
-
-2003-12-14 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-component.c (impl_requestCreateItem): set a proper
- exception if we fail
-
-2003-12-14 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-config.c
- (calendar_config_get_hide_completed_tasks_units): make sure the
- string is non-null before strcmp'ing it
-
- Fixes #52033
-
-2003-12-10 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_add_event_uri): remove the client
- from the list if there are errors, instead of re-adding it again.
- Also, unref the ECal object on errors, for not leaking.
-
-2003-12-10 Bolian Yin <bolian.yin@sun.com>
-
- *gui/e-week-view.c: Fix a event/jump button tabbing bug
-
-2003-12-10 Harry Lu <harry.lu@sun.com>
-
- Fix for bugzilla bug #51628.
-
- * gui/weekday-picker.c: (weekday_picker_class_init): setup focus
- handler.
- (day_clicked): new function to set day_mask when mouse clicked
- or keyboard input of space/enter.
- (handle_key_press_event): new function to handle key press event.
- (day_event_cb): handle key press event too.
- (weekday_picker_init): set widget can be focused.
- (colorize_items): change the box's outline if it is focused.
- (weekday_picker_focus): new function to handler focus event.
-
-2003-12-09 Andrew Wu <Yang.Wu@sun.com>
-
- * gui/e-week-view-main-item.c (e_week_view_main_item_class_init): init a11y.
- * gui/e-week-view.c: emit signal "selected_time_changed".
-
-2003-12-08 Bolian Yin <bolian.yin@sun.com>
-
- * gui/e-day-view.c (e_day_view_on_editing_started): remove setting property of "handle_popup".
- * gui/e-week-view.c (e_week_view_on_editing_started): remove setting property of "handle_popup".
-
-2003-12-08 Carl Sun <carl.sun@sun.com>
-
- Fixes #46351
-
- * gui/e-timezone-entry.c (e_timezone_entry_mnemonic_activate):
- new function. override the member function of GtkWidget to handle
- nemonic_activate signal of custom class ETimezoneEntry.
-
-
-2003-12-08 Bolian Yin <bolian.yin@sun.com>
-
- * gui/gnome-cal.c (gnome_calendar_class_init): correct argument mismatch in "goto_date" signal definition.
-
-2003-12-05 Yong Sun <Yong.Sun@Sun.com>
-
- Fix for #51337
-
- * gui/dialogs/alarm-page.c
- Change raw string "Action/Trigger" to _("Action/Trigger")
- * gui/dialogs/recurrence-page.c
- Change raw string "Date/Time" to _("Date/Time")
-
-2003-12-04 Harry Lu <harry.lu@sun.com>
-
- Fix for bugzilla bug #51627.
-
- * gui/goto.c: (create_ecal): set calitem's move_selection_when_moving
- to FALSE so that changing month and year won't send out
- a "selection_changed" signal.
-
-2003-12-03 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/tasks-control.c (tasks_control_activate): Do not call
- control_util_set_folder_bar_label().
-
- * gui/e-calendar-table.c (e_calendar_table_set_status_message):
- Use e_activity_handler_operation_progressing(), not
- evolution_activity_client_update().
-
- * gui/e-cal-view.c: Remove settings menu.
- (on_settings): Remove.
-
- * gui/calendar-commands.c (get_shell_view_interface): Remove.
- (control_util_set_folder_bar_label): Remove.
- (calendar_set_folder_bar_label): Remove.
- (control_util_show_settings): Remove.
- (gcal_calendar_dates_change_cb): Remove.
- (calendar_control_activate): Do not connect, do not call
- calendar_set_folder_bar_label().
-
-2003-12-03 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_destroy): free the notification
- list
-
- * gui/tasks-component.c (impl_dispose): ditto
-
- * gui/calendar-component.c (impl_dispose): ditto
-
-2003-12-03 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-component.c (impl_dispose): free up the notifications
- and the ecal
- (config_create_ecal_changed_cb): clear the create_ecal if the
- primary selection changes
- (setup_create_ecal): find a default ecal to do creation with
- (impl_requestCreateItem): use above
-
-2003-12-03 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-component.c (rename_task_list_cb): cast the parent
- (impl_createControls): add notification for primary tasks
- (config_primary_selection_changed_cb): handle primary selection
- changing in gconf
-
- * gui/calendar-config-keys.h: fix config key for primary tasks
-
-2003-12-03 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-component.c (rename_calendar_cb): cast the parent
- (config_primary_selection_changed_cb): handle the primary
- selection changing elsewhere
- (impl_dispose): remove the list of notifications
- (impl_createControls): add primary calendar notification
- (config_create_ecal_changed_cb): clear create_ecal if the primary
- key changes
- (setup_create_ecal): find an ecal to use for creation
- (impl_requestCreateItem): use above
-
-2003-12-03 Ettore Perazzoli <ettore@ximian.com>
-
- * importers/icalendar-importer.c: Do not #include shell stuff.
-
- * gui/main.c: Do not #include <evolution-shell-client.h>.
-
- * gui/e-itip-control.c: Do not #include
- <e-folder-selector-button.h> nor <evolution-shell-client.h>.
- (start_default_server): Return FALSE.
- (default_server_started_cb): Do not connect the "selected" signal
- on the button since it's now NULL.
- (button_selected_cb): #if 0 out.
-
- * gui/e-cal-list-view.h: Do not #include
- "evolution-activity-client.h".
-
- * gui/tasks-component.c (impl_createControls): Give an empty label
- for the status bar.
-
- * gui/e-day-view.h: Remove all deps on evolution-activity-client.
-
-2003-12-02 Rodney Dawes <dobey@ximian.com>
-
- * gui/Makefile.am: Version the schemas
- * gui/apps_evolution_calendar.schemas: Removed
- * gui/apps_evolution_calendar.schemas.in.in: Added
-
-2003-12-02 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/copy-source-dialog.c (copy_source_dialog): added
- a label to the dialog to make it look less ugly.
-
-2003-12-02 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/copy-source-dialog.c: converted to use an
- ESourceOptionMenu instead of the ESourceSelector.
- (primary_selection_changed_cb): removed.
- (copy_source_dialog): create the ESourceOptionMenu here.
- (source_selected_cb): callback for the "source_selected"
- signal on the ESourceOptionMenu widget.
-
-2003-12-02 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/e-calendar-table.h (struct _ECalendarTable): Replace member
- "activity" with an "activity_id".
-
- * gui/e-cal-view.c (struct _ECalendarViewPrivate): Replace member
- "activity" with "activity_id".
- (e_calendar_view_destroy): Don't unref activity here anymore.
- (e_calendar_view_set_status_message): Report progress using the
- EActivityHandler off the CalendarComponent.
-
- * gui/calendar-component.c
- (struct _CalendarComponentPrivate): New member activity_handler.
- (calendar_component_init): Init.
- (calendar_component_peek_activity_handler): New.
- (impl_dispose): Unref.
- (impl_createControls): Return an ETaskBar for the statusbar
- control.
-
-2003-12-01 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/calendar-component.c (impl_createControls): Pass a label for
- the status bar control for now.
-
- * gui/tasks-component.c (impl_createControls): Pass a label for
- the status bar control for now.
-
-2003-12-01 Rodney Dawes <dobey@ximian.com>
-
- * gui/GNOME_Evolution_Calendar.server.in.in:
- * gui/calendar-commands.c:
- * gui/e-meeting-list-view.c:
- * gui/e-meeting-model.c:
- * gui/e-select-names-editable.c:
- * gui/itip-bonobo-control.c:
- * gui/itip-utils.c:
- * gui/main.c:
- * gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.server.in.in:
- * gui/alarm-notify/alarm-queue.c:
- * gui/alarm-notify/notify-main.c:
- * gui/dialogs/alarm-options.c:
- * gui/dialogs/e-delegate-dialog.c:
- * importers/GNOME_Evolution_Calendar_Importer.server.in.in:
- * importers/main.c: Use BASE_VERSION for repo_ids and OAFIIDs
-
-2003-12-01 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/Makefile.am: put the conduits in their own dir
-
- * conduits/calendar/Makefile.am: ditto
-
- * conduits/todo/e-todo.conduit.in: subst in correct thing
-
- * conduits/calendar/e-calendar.conduit.in: ditto
-
-2003-12-01 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/Makefile.am: install to privlibdir
-
- * conduits/calendar/Makefile.am: ditto
-
- * conduits/todo/e-todo.conduit.in: subst in correct thing
-
- * conduits/calendar/e-calendar.conduit.in: subst in correct thing
-
-2003-12-01 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-notify.c (add_uri_to_load, remove_uri_to_load):
- removed unneeded functions.
- (alarm_notify_add_calendar, alarm_notify_remove_calendar): no need
- anymore to add/remove URIs to load on startup to the configuration.
-
-2003-12-01 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/save.c (save_calendars_to_load): removed this
- function, since we now use the ESourceList to know what calendars
- to load.
- (get_calendars_to_load): moved to config-data.c.
- (save_notification_time, get_saved_notification_time,
- save_blessed_program, is_blessed_program): use the
- shared GConfClient.
-
- * gui/alarm-notify/config-data.[ch]: use a GConfClient instead of a
- EConfigListener.
- (config_data_get_conf_client): renamed from _get_listener.
- (config_data_get_timezone, config_data_get_24_hour_format): changed
- to use the GConfClient.
- (config_data_get_calendars_to_load): new function.
- (ensure_inited): create the source lists for calendar and tasks here.
- (do_cleanup): cleanup the source lists here.
-
- * gui/alarm-notify/notify-main.c (load_calendars): use
- config_data_get_calendars_to_load().
-
-2003-11-28 JP Rosevear <jpr@ximian.com>
-
- * gui/e-tasks.c (e_tasks_delete_completed): we want to skip if it
- *is* read only
-
-2003-11-28 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-store.c (e_meeting_store_get_type): allocate the
- type information correctly
-
-2003-11-26 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/calendar-offline-handler.c (backend_go_offline): e_cal_new () ->
- e_cal_new_from_uri ().
- (backend_go_online): Ditto.
- (calendar_offline_handler_init): Ditto.
-
- * gui/comp-editor-factory.c (open_client): Ditto.
-
- * gui/e-itip-control.c (start_calendar_server): Ditto.
- (object_requested_cb): Ditto.
-
- * gui/e-tasks.c (e_tasks_add_todo_uri): Ditto.
-
- * gui/gnome-cal.c (gnome_calendar_construct): Ditto.
- (gnome_calendar_add_event_uri): Ditto.
-
- * gui/alarm-notify/alarm-notify.c (alarm_notify_add_calendar): Ditto.
-
- * importers/icalendar-importer.c (load_file_fn): Ditto.
- (vcal_load_file_fn): Ditto.
- (gnome_calendar_import_data_fn): Ditto.
-
- * gui/dialogs/copy-source-dialog.c (copy_source): Pass sources to
- e_cal_new ().
-
-2003-11-24 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/copy-source-dialog.c (copy_source): use the correct
- icalcomponent when calling e_cal_create_object.
-
- * gui/tasks-control.c (sensitize_commands): no need to have a
- selection for Paste to work.
-
- * gui/e-calendar-table.c (e_calendar_table_show_popup_menu): disable
- editing items if the selected task list is read only, not if it's not.
-
-2003-11-24 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/new-task-list.glade:
- * gui/dialogs/new-task-list.[ch]: new files containing the
- implementation of the 'New Task List' dialog.
-
- * gui/dialogs/Makefile.am: added new files.
-
- * gui/dialogs/new-calendar.c (new_calendar_dialog): use G_STRLOC
- for g_warning messages.
-
- * gui/tasks-component.c (new_task_list_cb): implemented.
-
-2003-11-24 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/copy-source-dialog.c (copy_source_dialog): actually
- add the source selector to the dialog's box.
-
-2003-11-23 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/tasks-component.c:
- * gui/dialogs/copy-source-dialog.[ch]: fixed compilation errors.
-
- * gui/dialogs/Makefile.am: added missing header directories.
-
-2003-11-23 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/new-calendar.[ch]: fixed copyright notices.
-
- * gui/dialogs/copy-source-dialog.[ch]: implementation of the
- Copy command for sources.
-
- * gui/dialogs/Makefile.am: added new files.
-
- * gui/calendar-component.c (fill_popup_menu_cb, copy_calendar_cb):
- added Copy command.
-
- * gui/tasks-component.c (fill_popup_menu_cb, copy_task_list_cb):
- added Copy command.
-
-2003-11-23 Ross Burton <ross@burtonini.com>
-
- * gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.server.in.in:
- Append "_2" to the OAFIID to avoid conflicting with Evo 1.4.
-
- * gui/main.c:
- * gui/alarm-notify/notify-main.c:
- Updated with new OAFIID.
-
-2003-11-20 JP Rosevear <jpr@ximian.com>
-
- * Remove a bunch of gal includes that are no longer needed
-
-2003-11-19 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #43556
-
- * gui/e-cal-view.c (selection_get, selection_clear_event,
- selection_received): removed this unneeded functions.
- (e_calendar_view_init): don't create a GtkInvisible anymore.
- (e_calendar_view_destroy): no need to destroy the GtkInvisible.
- (e_cal_view_copy_clipboard, e_cal_view_paste_clipboard):
- use GtkClipboard.
-
-2003-11-19 JP Rosevear <jpr@ximian.com>
-
- * gui/e-cal-model-tasks.c (get_due): make sure timezone value is
- sane
- (get_completed): ditto
-
- * gui/e-cal-model.c (get_dtstart): add more guards
-
- * gui/e-cal-model-calendar.c (get_dtend): ditto
-
-2003-11-19 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #51052
-
- * importers/icalendar-importer.c (prepare_events, prepare_tasks):
- call icalcompiter_next to move the pointer to the next before
- removing a component avoid breaking the link.
-
-2003-11-18 JP Rosevear <jpr@ximian.com>
-
- * gui/e-cal-model.c (get_dtstart): make sure the timezone value is
- sane
-
- * gui/e-cal-model-calendar.c (get_dtend): ditto
-
-2003-11-18 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-config.h: add protos
-
- * gui/calendar-config.c (calendar_config_get_primary_calendar):
- get the primary calendar
- (calendar_config_set_primary_calendar): set it
- (calendar_config_add_notification_primary_calendar): set
- notifications for it
- (calendar_config_get_primary_tasks): get the primary task list
- (calendar_config_set_primary_tasks): set it
- (calendar_config_add_notification_primary_tasks): set
- notifications for it
-
- * gui/calendar-config-keys.h: add primary keys
-
- * gui/calendar-component.c (find_first_source): find any source
- (update_uri_for_primary_selection): set the default uri and save
- the source uid
- (update_primary_selection): set the primary selection
- (primary_source_selection_changed_cb): use above
- (impl_createControls): set the primary selection
-
- * gui/tasks-component.c: as above
-
-2003-11-18 JP Rosevear <jpr@ximian.com>
-
- * gui/Makefile.am: remove db3 include
-
-2003-11-18 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-commands.c
- (calendar_control_sensitize_calendar_commands,
- sensitize_taskpad_commands): removed the 'New...' menu items
- from the UI, it's now implemented in the shell.
- (file_new_appointment_cb, file_new_event_cb, file_new_meeting_cb,
- file_new_task_cb): removed.
-
-2003-11-18 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.c (add_popup_menu_item): added 'sensitive'
- argument.
- (fill_popup_menu_cb): disable/enable menu items depending on whether
- there is a selection or not.
-
- * gui/tasks-component.c (add_popup_menu_item, fill_popup_menu_cb):
- ditto.
-
-2003-11-17 JP Rosevear <jpr@ximian.com>
-
- * Cleanup some ref/unref calls
-
-2003-11-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.c (delete_calendar_cb, rename_calendar_cb):
- * gui/tasks-component.c (delete_task_list_cb, rename_task_list_cb):
- peek the primary selection.
-
-2003-11-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/tasks-component.c (fill_popup_menu_cb): added 'Delete' and
- 'Rename' menu items.
- (delete_task_list_cb, rename_task_list_cb): callbacks for new
- menu items.
-
-2003-11-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.c (add_popup_menu_item): try first to
- create the icon from the stock, and then from a file.
- (fill_popup_menu_cb): set callback for 'Rename' menu item.
- (rename_calendar_cb): callback for 'Rename' menu item.
- (new_calendar_cb): fixed arguments.
-
- * gui/tasks-component.c (impl_createControls): connect to
- "fill_popup_menu" signal on the source selector.
- (fill_popup_menu_cb): callback to create our menu items.
-
-2003-11-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * idl/evolution-calendar.idl: remove the AlarmNotify service, no
- more need for it, since the alarm daemon will listen for changes
- on the GConf key.
-
- * gui/gnome-cal.c (add_alarms): removed function to talk to the
- alarm daemon.
- (client_cal_opened_cb): don't call add_alarms().
-
- * gui/alarm-notify/alarm-notify.[ch]: made it a basic GObject.
- (AlarmNotify_addCalendar, AlarmNotify_removeCalendar): removed
- AlarmNotify interface implementation.
- (alarm_notify_class_init): no epv to initialize.
- (alarm_notify_remove_calendar): new function, copied from the
- CORBA method implementation.
- (alarm_notify_factory_fn): return NULL, since there is no objects
- that can be created via this factory now.
-
- * gui/alarm-notify/notify-main.c (main): now the factory is the alarm
- notification service itself.
- (load_calendars): no need to use exceptions here.
-
- * gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.server.in.in:
- now the factory is the alarm notification service itself.
-
- * gui/main.c (launch_alarm_daemon_cb): dont use the AlarmNotify CORBA
- types.
-
-2003-11-17 Harry Lu <harry.lu@sun.com>
-
- * gui/dialogs/recurrence-page.c (make_ending_count_special):
- Make ending count of occurrences of Recurrence tab numeric only.
-
-2003-11-16 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-control.c (tasks_control_set_property): add a uri
-
- * gui/e-tasks.c: kill e_tasks_open
-
- * gui/e-tasks.h: remove proto
-
-2003-11-16 JP Rosevear <jpr@ximian.com>
-
- * gui/e-cal-model.c (e_cal_view_objects_added_cb): emit the added
- signal for the correct rows
-
-2003-11-16 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-component.c (is_in_uids): copy in here
- (update_uris_for_selection): save the selection
- (update_selection): update the selection when its changed
- somewhere else
- (config_selection_changed_cb): update the selection if the
- configuration changes
- (impl_createControls): store the source selector
-
- * gui/calendar-config.h: add protos
-
- * gui/calendar-config.c (calendar_config_get_tasks_selected): get
- the list of task lists selected
- (calendar_config_set_tasks_selected): save it
- (calendar_config_add_notification_tasks_selected): get notified
- about it
-
-2003-11-16 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-component.c (add_uri_for_source): add it via e-tasks
- (remove_uri_for_source): remove it via e-tasks
- (get_default_task): provide a default for editing
- (impl_createControls): create the control directly
- (impl_requestCreateItem): implement
-
- * gui/gnome-cal.c (gnome_calendar_purge): don't let the two list
- iterators clobber each other
-
- * gui/e-tasks.h: add protos
-
- * gui/e-tasks.c (e_tasks_destroy): free the client list and the
- hash, disconnect signals
- (e_tasks_new_task): use the default client
- (e_tasks_add_todo_uri): add a uri
- (e_tasks_remove_todo_uri): remove a uri
- (e_tasks_set_default_uri): set default uri
- (e_tasks_get_default_client): get default client
- (e_tasks_delete_completed): expunge from all clients
- (e_tasks_setup_view_menus): use default client uri
-
- * gui/e-tasks.c (set_timezone): set the timezone for all clients
- (e_tasks_init): set up the clients has table
-
- * gui/e-calendar-table.etspec: yank some useless display columns
-
- * gui/e-cal-model.c (remove_client): remove objects in reverse
- order so we don't clobber ourselves
-
- * gui/calendar-component.c: add FIXME
-
-2003-11-16 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-component.c (get_default_event): set up a event to
- be edited
- (impl_requestCreateItem): implement
-
-2003-11-14 JP Rosevear <jpr@ximian.com>
-
- * gui/*.[hc]: include e-source* from e-d-s
-
-2003-11-14 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-config.c (calendar_config_get_calendars_selected):
- config accessor
- (calendar_config_set_calendars_selected): ditto
- (calendar_config_add_notification_calendars_selected): config
- notification
-
- * gui/calendar-config.h: add protos
-
- * gui/calendar-config-keys.h: add new key
-
- * gui/calendar-component.c (is_in_uids): util function
- (update_uris_for_selection): save the selection in the
- configuration
- (update_selection): update the selection from the config info
- (source_selection_changed_cb): only pass one param
- (config_selection_changed_cb): listen for config changes
- (impl_dispose): remove config notification
- (impl_createControls): use bonobo_exception_set; add a config
- notification
-
-2003-11-13 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/tasks-component.c (impl__get_userCreatableItems): New.
- (impl_requestCreateItem): New.
- (tasks_component_class_init): Install.
-
- * gui/calendar-component.c (impl__get_userCreatableItems): New.
- (impl_requestCreateItem): New, for now just a stub.
- (calendar_component_class_init): Install into the EPV.
-
-2003-11-13 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/GNOME_Evolution_Calendar.server.in.in: Add a component_alias
- of "calendar" for the calendar and "tasks" for the tasks.
-
-2003-11-12 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/calendar-component.c (add_popup_menu_item): Use non-deprecated
- gtk_menu_shell_append ().
-
-2003-11-11 Bolian Yin <bolian.yin@sun.com>
-
- Fixes #50808
-
- * gui/goto.c (goto_dialog): set initial selection to current day.
-
-2003-11-11 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-offline-handler.c (backend_cal_opened_offline): use
- a standard calendar status
- (backend_cal_opened_online): ditto
-
- * gui/alarm-notify/alarm-queue.c (cal_opened_cb): ditto
-
- * gui/gnome-cal.c (client_cal_opened_cb): ditto
-
- * gui/e-tasks.c (cal_opened_cb): ditto
-
- * gui/e-itip-control.c (default_server_started_cb): ditto
-
- * gui/e-cal-model.c (cal_opened_cb): ditto
-
- * gui/comp-editor-factory.c (cal_opened_cb): ditto
-
-2003-11-11 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/todo-conduit.c (start_calendar_server): load the
- calendar synchronously
-
- * conduits/calendar/calendar-conduit.c (start_calendar_server): ditto
-
-2003-11-10 JP Rosevear <jpr@ximian.com>
-
- * importers/icalendar-importer.c (update_single_object): return
- boolean not ECalStatus
- (update_objects): ditto
- (process_item_fn): handle above returns
-
-2003-11-10 JP Rosevear <jpr@ximian.com>
-
- * gui/e-cal-model-tasks.c (get_due_status): just check the boolean
-
-2003-11-10 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c
- (e_calendar_context_destroy): use proper change list free function
- name
- (post_sync): ditto
-
- * conduits/todo/todo-conduit.c: same
-
-2003-11-10 Dan Winship <danw@ximian.com>
-
- * gui/e-tasks.c (e_tasks_delete_completed): Remove get-vtype check
- from the completed-tasks query (and don't leak the sexp string).
-
- * gui/e-cal-model.c (update_e_cal_view_for_client): Don't adjust
- the sexp to use get-vtype.
-
- * gui/gnome-cal.c (adjust_e_cal_view_sexp, gnome_calendar_purge):
- Remove get-vtype check from queries
-
-2003-11-07 JP Rosevear <jpr@ximian.com>
-
- * gui/Makefile.am: remove includes for toplevel libical dir
-
- * gui/dialogs/Makefile.am: ditto
-
- * importers/Makefile.am: ditto
-
-2003-11-07 JP Rosevear <jpr@ximian.com>
-
- * In the gui this is a search and replace commit for moving the
- calendar to evolution-data-server; it also deletes the old backend
- files; e-cal-view was rename to e-calendar-view to remove name
- conflict
-
-2003-11-05 JP Rosevear <jpr@ximian.com>
-
- * gui/migration.c: fix typo
-
-2003-11-05 Larry Ewing <lewing@ximian.com>
-
- * gui/migration.c (process_old_dir): add a unimplemented warning
- so we at least avoid relocation errors.
-
-2003-11-04 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.c (fill_popup_menu_callback): added more
- menu items.
- (delete_calendar_cb): callbacks for new popup menu items.
- (impl_createControls): add the source selector widget to the
- CalendarComponentPrivate structure.
-
- * gui/migration.[ch] (migrate_old_tasks): new function to migrate
- old tasks setups.
- (process_old_dir): renamed and added a "filename" argument, so that
- the same function can be used for tasks and calendar directories.
- (migrate_old_calendars): added new argument when calling
- process_old_dir().
-
- * gui/tasks-component.c (tasks_component_init): call
- migrate_old_tasks() if there are no groups defined.
-
-2003-11-04 Bolian Yin <bolian.yin@sun.com>
-
- * gui/e-cal-view.c: add new signal "selected_time_changed"
- * gui/e-day-view-main-item.c (e_day_view_main_item_class_init):
- a11y initialization
- * gui/e-day-view-top-item (e_day_view_top_item_get_day_label):
- new public function.
- * gui/e-day-view.c (e_day_view_ensure_rows_visible,
- e_day_view_update_calendar_selection_time): make static functions public
- (e_day_view_cursor_key_up, e_day_view_cursor_key_down,
- e_day_view_cursor_key_left, e_day_view_cursor_key_right): emit
- "selected_time_changed".
-
-2003-11-03 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/e-meeting-model.c (SELECT_NAMES_OAFID): Append "_2".
- * gui/e-select-names-editable.c (SELECT_NAMES_OAFIID): Likewise.
- * gui/e-meeting-list-view.c (SELECT_NAMES_OAFID): Likewise.
- * gui/dialogs/alarm-options.c (SELECT_NAMES_OAFID): Likewise.
- * gui/dialogs/e-delegate-dialog.c (SELECT_NAMES_OAFID): Likewise
-
-2003-11-03 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/GNOME_Evolution_Calendar.server.in.in: use
- "evolution2:config_item" properties instead of
- "evolution:config_item" ones.
-
-2003-11-03 Harry Lu <harry.lu@sun.com>
-
- Fix for #50387.
-
- * importers/icalendar-importer.c (support_format_fn):
- Call icalcomponent_is_valid() to check whether the returned
- icalcomponent is valid.
-
-2003-10-31 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/calendar-component.c (calendar_component_init): Add the webcal
- source group.
-
- * gui/dialogs/new-calendar.c (print_uri_noproto): Implement.
- (group_is_remote): Implement.
- (create_new_source_with_group): Implement webcal case.
- (new_calendar_dialog): Get optional location from dialog.
-
- * gui/dialogs/new-calendar.glade: Add location entry.
-
- * pcs/Makefile.am: Build http backend.
-
- * pcs/cal-backend-http.[ch]: Add skeleton based on cal-backend-file.
-
-2003-10-31 Dan Winship <danw@ximian.com>
-
- * cal-util/cal-util.h: Add CAL_STATIC_CAPABILITY_NO_THISANDFUTURE
- and CAL_STATIC_CAPABILITY_NO_THISANDPRIOR
-
- * gui/dialogs/recur-comp.c (recur_component_dialog): Add a
- CalClient argument. Use cal_client_get_static_capability to decide
- whether or not to offer THISANDFUTURE and THISANDPRIOR options
-
- * gui/dialogs/comp-editor.c (prompt_to_save_changes, save_cmd,
- save_close_cmd): Pass a CalClient to recur_component_dialog.
-
- * gui/e-day-view.c (e_day_view_finish_long_event_resize,
- e_day_view_finish_resize, e_day_view_on_editing_stopped,
- e_day_view_on_top_canvas_drag_data_received,
- e_day_view_on_main_canvas_drag_data_received): Likewise
-
- * gui/e-week-view.c (e_week_view_on_editing_stopped): Likewise
-
- * gui/calendar-component.c (impl_createControls): set an exception
- if we fail, so evo won't crash.
-
-2003-10-31 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-calendar-table.c (e_calendar_table_show_popup_menu): fixed
- mismatched condition in if/else statement.
-
-2003-10-30 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-tasks.[ch] (e_tasks_get_cal_client): removed.
-
- * gui/tasks-control.c (sensitize_commands): fixed to work correctly
- with the ECalView's model.
- (tasks_control_set_property): don't use e_tasks_get_cal_client.
-
- * gui/alarm-notify/alarm-notify.c (free_client_hash): new function
- to remove items from the CalClient's hash table.
- (alarm_notify_finalize): call free_client_hash() for each item
- in the hash table.
-
-2003-10-30 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/notify-main.c (client_die_cb): use
- bonobo_main_quit, not gtk_main_quit.
-
- * gui/alarm-notify/alarm-queue.c (free_client_alarms_cb): callback
- for freeing ClientAlarms stored in the hash table.
- (alarm_queue_done): call free_client_alarms_cb() for each opened
- client.
-
-2003-10-30 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-file.c (mark_dirty, save_idle): removed, since
- we dont save the file anymore in idle callbacks.
- (cal_backend_file_dispose): removed all traces of the idle saving.
- (check_dup_uid, create_cal, cal_backend_file_add_timezone,
- cal_backend_file_create_object, cal_backend_file_modify_object,
- cal_backend_file_remove_object, cal_backend_file_receive_objects):
- call save() directly instead of mark_dirty().
-
-2003-10-30 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-file.c (cal_backend_file_modify_object):
- implemented THIS and ALL recurrences cases, blowing away or detaching
- recurrences from the main component as required.
- (get_rid_string): make it return const.
- (get_rid_timetype): new convenience function for getting
- libical's recurrence ID from a CalComponent.
- (cal_backend_file_is_read_only, remove_recurrence_cb,
- remove_component): fixed warnings.
- (remove_object_instance_cb): callback to remove the instances
- from the hash on the THISANDPRIOR and THISANDFUTURE cases.
- (cal_backend_file_remove_object): replaced mismatched if/else
- statement with proper management of each of the recurrence cases.
-
-2003-10-29 JP Rosevear <jpr@ximian.com>
-
- * gui/Makefile.am: build new files
-
- * gui/dialogs/comp-editor-util.c (date_edit_destroy_cb): unref the
- config manager
- (comp_editor_new_date_edit): set up a config manager for the date
- editor
-
- * gui/e-date-edit-config.[hc]: config manager for e-date-edit
-
-2003-10-29 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.c (update_config): no need to
- update config settings everywhere explicitly
-
- * gui/tasks-component.c (update_uris_for_selection): cast the
- widget
-
- * gui/gnome-cal.h: remove proto
-
- * gui/gnome-cal.c (setup_widgets): don't update config settings
- explicitly
- (gnome_calendar_update_config_settings): kill
-
- * gui/e-week-view.c: remove null chars
-
- * gui/e-tasks.h: remove proto
-
- * gui/e-tasks.c (set_timezone): set the timezone on the client
- (timezone_changed_cb): changed timezone callback
- (setup_config): setup config stuff
- (e_tasks_init): setup config and widgets here
- (e_tasks_new): construct is dead, no need to track all widgets
- (cal_opened_cb): set the timezone upon opening
- (e_tasks_update_all_config_settings): kill
-
- * gui/control-factory.c (control_factory_new_control): create the
- calendar ourselves
-
- * gui/calendar-config.c (on_timezone_set): don't update the
- settings everywhere here, we have config managers now
-
- * gui/calendar-component.c (impl_createControls): create the
- calendar ourselves
-
- * gui/calendar-commands.h: remove protos
-
- * gui/calendar-commands.c: remove dead functions
-
-2003-10-29 JP Rosevear <jpr@ximian.com>
-
- * gui/e-day-view-config.c (set_twentyfour_hour): set the format on
- the cal view
-
- * gui/e-week-view-config.c (set_twentyfour_hour): ditto
-
- * gui/e-cal-list-view-config.c (set_twentyfour_hour): set the 24
- hour format on the view
- (twentyfour_hour_changed_cb): 24 hour format change callback
- (e_cal_list_view_config_set_view): handle 24 hour format changes
-
-2003-10-29 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/recurrence-page.c (recurrence_page_finalize): unref
- config manager
- (init_widgets): create config manager for the e-calendar
-
- * gui/e-tasks.c (setup_widgets): create config manager for the
- table view
- (e_tasks_destroy): unref config manager
- (e_tasks_open): return FALSE not NULL
- (e_tasks_update_all_config_settings): don't configure the calendar
- table here, we have a manager
-
- * gui/calendar-config.c: remove dead config functions (handled by
- config managers now)
-
-2003-10-29 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (set_timezone): set the timezone for all clients
- (timezone_changed_cb): callback for changes
- (setup_config): setup the configuration
- (setup_widgets): setup up configuration managers for the list
- view, task list and date navigator
- (gnome_calendar_init): setup config
- (gnome_calendar_destroy): destroy configuration managers and
- notifications
- (gnome_calendar_update_config_settings): remove dead bits
-
- * gui/e-mini-calendar-config.[hc]: manage configuration of an
- e-calendar
-
- * gui/e-day-view-config.h: remove extraneous comment, type the
- parent class correctly
-
- * gui/e-week-view-config.h: ditto
-
- * gui/e-day-view-config.c (e_day_view_config_class_init): type the
- class correctly
- (set_timezone): set timezone
- (timezone_changed_cb): timezone changed callback
- (e_day_view_config_set_view): track timezone changes
-
- * gui/e-week-view-config.c: ditto
-
- * gui/e-cell-date-edit-config.[hc]: manage configuration of a date
- edit cell
-
- * gui/e-calendar-table-config.[hc]: manage configuration of a
- e-calendar-table
-
- * gui/e-cal-list-view.c (get_current_time_cb): use the view
- timezone to compute
-
- * gui/e-cal-list-view-config.[hc]: manage configuration of a
- list view
-
- * gui/calendar-config.h: update protos
-
- * gui/calendar-config.c
- (calendar_config_add_notification_timezone): notify of timezone
- change
- (calendar_config_add_notification_dnav_show_week_no): notify of
- show week number setting change
-
- * gui/calendar-component.c (calendar_component_peek): remove bad
- comma
-
- * gui/Makefile.am: build new config classes
-
-2003-10-29 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.c (fill_popup_menu_callback): fixed
- typo in menu item label.
-
- * gui/e-cal-model.[ch] (e_cal_model_get_use_24_hour_format): new
- function.
-
- * gui/e-cal-view.[ch]: no need to keep the 'use_24_hour' setting,
- it's already in the model.
- (e_cal_view_get_use_24_hour_format,
- e_cal_view_set_use_24_hour_format): new functions.
-
- * gui/e-day-view.[ch] (e_day_view_get_24_hour_format,
- (e_day_view_set_24_hour_format): removed.
- (e_day_view_convert_time_to_display, e_day_view_update_event_label,
- e_day_view_get_time_string_width): use the ECalView's function to
- get the 24 hour format.
-
- * gui/e-week-view.[ch] (e_week_view_get_24_hour_format,
- e_week_view_set_24_hour_format): removed.
- (e_week_view_convert_time_to_display,
- e_week_view_get_time_string_width): use the ECalView's function
- to get the 24 hour format.
-
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw_long_event):
- * gui/e-day-view-time-item.c (e_day_view_time_item_draw):
- * gui/e-week-view-event-item.c (e_week_view_draw_time):
- don't use the view's use_24_hour_format, but the ECalView method.
-
-2003-10-28 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.c (impl_createControls): connect to
- "fill_popup_menu" on the ESourceSelector.
- (fill_popup_menu_callback): add popup menu items here.
- (add_popup_menu_item): new function to add items to the
- popup menu.
- (new_calendar_cb): callbacks for the popup menu items.
-
-2003-10-28 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-cal-view.c: no need to keep the timezone here, it is
- already stored in the model.
- (e_cal_view_get_timezone): call e_cal_model_get_timezone().
- (e_cal_view_set_timezone): call e_cal_model_set_timezone().
- (e_cal_view_new_appointment_for): use the model's timezone.
-
-2003-10-27 Dan Winship <danw@ximian.com>
-
- * pcs/cal-backend.c (cal_backend_notify_object_created,
- cal_backend_notify_object_modified,
- cal_backend_notify_object_removed): New; tell each query about a
- created/modified/removed object.
-
- * pcs/cal.c (cal_notify_object_created): Use
- cal_backend_notify_object_created.
- (cal_notify_object_modified, cal_notify_object_removed): Likewise
- for modified/removed
- (cal_notify_objects_received): we need both the before and after
- forms for the modified objects so they can be resolved as
- adds/modifies/removes per-query. But the caller can just call the
- cal_backend_* routines for each object anyway, so just remove the
- created/modified/removed lists.
-
- * pcs/cal-backend-sync.c (cal_backend_sync_receive_objects):
- Remove created/modified/removed list arguments.
- (_cal_backend_receive_objects): Likewise.
-
- * pcs/cal-backend-file.c (cal_backend_file_receive_objects):
- Remove created/modified/removed list arguments. Replace the one
- use of *removed with a call to cal_backend_notify_object_removed.
-
-2003-10-27 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (setup_widgets): store config objects as well
- (gnome_calendar_set_default_uri): return FALSE if the
- pre-condition fails
- (gnome_calendar_update_config_settings): remove settings that are
- now handled by the config objects
-
- * gui/e-week-view.c (e_week_view_set_compress_weekend): queue a
- draw
-
- * gui/e-itip-control.c (start_default_server): comment out
-
- * gui/e-day-view-config.[hc]: a class to track config changes of
- interest to day views
-
- * gui/e-week-view.[hc]: ditto for week views
-
- * gui/calendar-config.h: add protos
-
- * gui/calendar-config.c: use the #defines for the keys and add
- notification routines
-
- * gui/calendar-config-keys.h: a list of defines for gconf keys
-
- * gui/Makefile.am: build new files
-
-2003-10-27 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-cal-model.h: changed fill_component_from_model virtual
- method to get an ETableModel, not an ECalModel.
-
- * gui/e-cal-model.c (ecm_append_row): the source model sent from
- ETable is an ETableModel, not an ECalModel.
-
- * gui/e-cal-model-calendar.c (ecmc_fill_component_from_model):
- get an ETableModel for the 'source_model' argument.
-
- * gui/e-cal-model-tasks.c (ecmt_fill_component_from_model): ditto.
-
-2003-10-27 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/tasks-component.c (add_uri_for_source): pass FALSE as the
- 'only_if_exists' parameter, so that the calendar gets created when
- it still does not exist.
-
-2003-10-24 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/tasks-component.c (tasks_component_init): initialize private
- structure on TasksComponent.
-
-2003-10-24 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.c (calendar_component_class_init): removed
- repeated initialization.
- (calendar_component_peek): use G_STRLOC for g_warning's.
-
- * gui/tsaks-control.[ch] (tasks_control_activate,
- tasks_control_deactivate): made these 2 functions public.
-
- * gui/tasks-component.[ch]: implementation of the tasks component.
-
- * gui/Makefile.am:
- * gui/GNOME_Evolution_Calendar.server.in.in: added tasks component.
-
- * gui/main.c: ditto.
- (factory): added code to create the tasks component when requested.
-
-2003-10-24 Dan Winship <danw@ximian.com>
-
- * cal-client/cal-client.c (cal_client_get_changes): Remove type arg
-
- * conduits/calendar/calendar-conduit.c (pre_sync, post_sync):
- Update for that
-
- * conduits/todo/todo-conduit.c (pre_sync, post_sync): Likewise
-
- * idl/evolution-calendar.idl (getChanges): Remove type arg.
-
- * pcs/cal.c (impl_Cal_getChanges): Likewise
-
- * pcs/cal-backend.c (cal_backend_get_changes): Likewise
-
- * pcs/cal-backend-sync.c (cal_backend_sync_get_changes): Likewise
-
- * pcs/cal-backend-file.c (cal_backend_file_get_changes): Update
- for that
-
- * pcs/Makefile.am: build libpcs.la and libpcsfile.la instead of
- just .a.
- (libpcs_la_LIBADD): depend on libcal-util.la and libeutil.la
- (libpcsfile_la_LIBADD): depend on libpcs.la
-
-2003-10-24 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-util/cal-util.[ch] (cal_util_construct_instance,
- cal_util_remove_instances): new functions for individual
- instances management.
-
- * pcs/cal-backend-file.c (cal_backend_file_get_object): if we
- dont have a recurrence in our hash table, generate one for the
- specified recurrence ID.
- (match_recurrence_sexp): new function to match recurrences on
- regular expresessions.
- (match_object_sexp): call match_recurrence_sexp() for all recurrences.
- (cal_backend_file_modify_object): handle mod_types.
- (cal_backend_file_remove_object): handle mod_types.
-
-2003-10-24 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.h: update protos
-
- * gui/gnome-cal.c (gnome_calendar_set_default_uri): set the
- default client based on uri
-
- * gui/calendar-component.c (add_uri_for_source): rename from
- load_uri_for_source and take a calendar
- (remove_uri_for_source): utility routine to remove the source's
- uri from the calendar
- (is_in_selection): checks to see if the uid of the given source
- matches any of those in the given selection
- (update_uris_for_selection): remove any uris no longer in the
- selection, add those that still exist
- (source_selection_changed_callback): call above
- (primary_source_selection_changed_callback): we have the calendar
- easily now; set the default by uri
- (control_activate_cb): handle activation and de-activation
- (impl_createControls): create the calendar control ourselves so we
- have access to the calendar
- (impl_dispose): release the source selection
-
-2003-10-23 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-file.c (add_component): if the component received
- is an instance, add it to the recurrences hash table.
- (free_recurrence): callback for g_hash_table_foreach() to free
- the recurrences in the CalBackendFileObject structure.
- (free_object): call free_recurrence for each recurrence.
- (remove_recurrence_cb): g_hash_table_foreach() callback to
- remove recurrences from the calendar.
- (remove_component): remove all recurrences.
- (cal_backend_file_open): check write access on the file, and
- set read_only flag appropriately.
- (cal_backend_file_is_read_only): return the private flag.
- (cal_backend_file_init): initialize read_only flag.
- (cal_backend_file_get_object): deal with recurrences.
-
- * gui/alarm-notify/notify-main.c (main): unref the alarm
- notification service when terminating.
- (client_die_cb): call bonobo_main_quit instead of gtk_main_quit.
-
-2003-10-23 <jpr@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_get_current_view_widget): just
- uses the views array and the current view type
- (setup_widgets): ditto
- (set_view): ditto
- (backend_died_cb): ditto
- (gnome_calendar_get_calendar_model): ditto
- (gnome_calendar_update_config_settings): ditto
-
-2003-10-23 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view.c: accept also text/calendar for D&D.
-
-2003-10-23 JP Rosevear <jpr@ximian.com>
-
- * gui/e-day-view.c (e_day_view_on_top_canvas_drag_data_received):
- fix typo
- (e_day_view_on_main_canvas_drag_data_received): fix C99 issue, fix
- typo
-
-2003-10-23 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (update_query): use the internal client list to
- create the queries
- (gnome_calendar_destroy): use the internal client list to
- disconnect signal handlers
- (gnome_calendar_add_event_uri): add the client to the internal
- list
- (gnome_calendar_remove_event_uri): remove the client from the
- internal list and lookup the client
- (gnome_calendar_update_config_settings): use the internal client
- list to update the config settings
-
-2003-10-23 Harry Lu <harry.lu@sun.com>
-
- * cal-client/cal-client.c: (cal_client_get_timezone): remove and free
- op before return.
-
- * gui/e-cal-view.c (e_cal_view_add_event): modified from
- selection_received_add_event() so that it call be called out of
- e-cal-view.c.
- (selection_received): modified to call e_cal_view_add_event().
-
- * gui/e-cal-view.h: add declaration for e_cal_view_add_event().
-
- * gui/e-day-view.c (e_day_view_on_drag_data_get): Provide a
- icalcomponent for both TARGET_CALENDAR_EVENT and TARGET_VCALENDAR.
- (e_day_view_on_top_canvas_drag_data_received): If dragging between
- different windows, make it works like a copy and paste.
- (e_day_view_on_main_canvas_drag_data_received): ditto.
-
-2003-10-23 JP Rosevear <jpr@ximian.com>
-
- * cal-util/cal-recur.c: update g_date calls to non-deprecated
- calls
-
- * cal-util/Makefile.am: turn off deprecated funcs
-
- * cal-client/Makefile.am: turn off deprecated funcs
-
- * cal-client/cal-client.c (cal_client_get_error_message): add OK
- message
-
- * pcs/cal-backend.[hc]: remove dead funcs
-
- * pcs/query.c: tidy headers
-
-2003-10-23 JP Rosevear <jpr@ximian.com>
-
- * pcs/query.c (query_notify_objects_removed_1): Fix c/p typo -
- call removed instead of modify
-
-2003-10-23 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-cal-view.c (e_cal_view_init): connect also to ETableModel's
- "model_cell_changed" signal.
- (e_cal_view_set_model): likewise.
- (model_cell_changed_cb): callback for "model_cell_changed".
- (e_cal_view_destroy): use g_signal_handlers_disconnect_matched instead
- of g_signal_handlers_disconnect_by_func, so that all handlers are
- disconnected.
-
-2003-10-23 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal.c (cal_notify_object_modified): guard against irrelevant
- args (ie if there was an error)
- (cal_notify_object_removed): ditto
- (cal_notify_timezone_added): ditto
-
- * pcs/cal-backend-sync.c (_cal_backend_is_read_only): init value
- to something known
- (_cal_backend_get_cal_address): ditto
- (_cal_backend_get_alarm_email_address): ditto
- (_cal_backend_get_ldap_attribute): ditto
- (_cal_backend_get_static_capabilities): ditto
- (_cal_backend_modify_object): ditto
- (_cal_backend_remove_object): ditto
- (_cal_backend_get_object_list): ditto
-
-2003-10-22 JP Rosevear <jpr@ximian.com>
-
- * gui/e-cal-list-view.c (e_cal_list_view_new): create a model and
- pass it as an arg during creation
-
- * gui/e-day-view.c (e_day_view_new): unref the model
-
- * gui/e-week-view.c (e_week_view_new): ditto
-
-2003-10-22 JP Rosevear <jpr@ximian.com>
-
- * cal-client/cal-client.c (cal_client_get_object): only change to
- invalid object error code if we got the object but couldn't parse
- it, and only check for timezones if we had success
-
- * gui/comp-util.c (cal_comp_is_on_server): don't throw a warning
- if the object simply does not exist
-
-2003-10-22 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.[ch] (gnome_calendar_remove_event_uri): new
- function to remove calendars from the views.
-
-2003-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/GNOME_Evolution_Calendar.server.in.in: Add an
- "evolution:button_icon" attribute.
-
-2003-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/GNOME_Evolution_Calendar.server.in.in: Add an
- "evoution:button_sort_order" attribute.
-
-2003-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/calendar-component.c (impl_createControls): Make the
- scrolled window have a GTK_SHADOW_IN shadow.
- * gui/dialogs/meeting-page.c (meeting_page_construct): Likewise.
-
-2003-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/calendar-component.c (impl_createControls): Set the
- scrollbar policy to "automatic" for both the horizontal and
- vertical scrollbars around the source selector.
-
-2003-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/GNOME_Evolution_Calendar.server.in.in: Add an
- "evolution:button_label" property on the component for use in the
- shell.
-
-2003-10-21 Rodney Dawes <dobey@ximian.com>
-
- * cal-client/Makefile.am: Fix typo in libcal_client_la_SOURCES
-
-2003-10-21 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.c (calendar_component_init): fixed
- a leak caused by only freeing 'base_uri' in some cases.
-
-2003-10-21 JP Rosevear <jpr@ximian.com>
-
- * gui/control-factory.c (get_prop): fix parse error
- (set_prop): gnome_calendar_open was renamed
-
- * conduits/todo/todo-conduit.c (start_calendar_server): adapt to
- the cal_client_new changes and the lack of a default calendar
- routine
- (pre_sync): don't have to pass a type for the default object any
- more
-
- * conduits/calendar/calendar-conduit.c (start_calendar_server):
- adapt to the cal_client_new changes and the lack of a default
- calendar routine
- (pre_sync): don't have to pass a type for the default object any
- more
-
- * cal-client/cal-client.c (cal_client_open_async): add FIXME
- comment
-
-2003-10-21 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-file.c: store recurrences per object.
- (free_object): free correctly the CalBackendFileObject's
- contained in 'priv->comp_uid_hash'.
- (lookup_component, check_dup_uid, add_component, remove_component,
- match_object_sexp):
- adapted to changes in comp_uid_hash.
-
-2003-10-20 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.[ch] (gnome_calendar_add_event_uri): renamed
- from gnome_calendar_open.
-
- * gui/calendar-component.c (load_uri_for_source): call
- gnome_calendar_add_event_uri instead of setting the URI property on
- the Bonobo control.
-
-2003-10-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/migration.c (process_calendar_dir): process subfolders.
-
-2003-10-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/migration.[ch] (migrate_old_calendars): new function.
-
- * gui/calendar-component.c (calendar_component_init): call
- the above function to migrate from old setups.
-
- * gui/Makefile.am: added new files.
-
-2003-10-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * conduits/calendar/Makefile.am: Fixed for libical build changes.
-
- * conduits/todo/Makefile.am: Same.
-
-2003-10-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-cal-view.c (on_print): call
- e_cal_view_get_visible_time_range, not the gnome_calendar_
- version.
- (e_cal_view_new_appointment_for, e_cal_view_new_appointment,
- e_cal_view_edit_appointment): new functions.
-
- * gui/gnome-cal.[ch] (gnome_calendar_new_appointment_for,
- gnome_calendar_new_appointment, gnome_calendar_edit_object):
- removed these functions, now available in e-cal-view.
-
- * gui/calendar-commands.c:
- * gui/e-day-view.c:
- * gui/e-week-view-event-item.c:
- * gui/e-week-view.c: replaced calls to gnome_calendar_* with
- e_cal_view_* equivalents.
-
-2003-10-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-cal-view.[ch] (e_cal_view_get_default_category):
- (e_cal_view_set_default_category): new functions.
- (e_cal_view_destroy): free the default_category field.
-
- * gui/e-day-view.[ch] (e_day_view_set_default_category):
- removed obsolete function.
- (e_day_view_init, e_day_view_destroy, e_day_view_do_key_press):
- use the ECalView's default_category.
-
- * gui/e-week-view.[ch] (e_week_view_set_default_category):
- removed obsolete function.
- (e_week_view_init, e_week_view_destroy, e_week_view_do_key_press):
- use the ECalView's default_category.
-
- * gui/gnome-cal.c (gnome_calendar_set_query): set the query
- also on the list view by using the priv->views array.
- (search_bar_category_changed_cb, gnome_calendar_set_default_client):
- use the priv->views array.
- (gnome_calendar_get_calendar_model): return the model for the
- current view widget.
- (gnome_calendar_open): removed tasks opening code.
-
-2003-10-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/new-calendar.c (new_calendar_dialog): if the user
- presses Cancel, just terminate.
-
-2003-10-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.c (calendar_component_init): create
- directories for the newly-created calendars.
-
- * gui/dialogs/new-calendar.c (create_new_source_with_group): use
- e_mkdir_hier instead of mkdir.
-
-2003-10-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-component.c (calendar_component_init): if no groups
- are present in the configuration, create the "On This Computer"
- group and the "Personal" and "Work" calendars on it.
-
- * gui/dialogs/new-calendar.c (new_calendar_dialog): moved the
- source creation...
- (create_new_source_with_group): ...here, and made the code create
- the directory for the new calendar.
-
-2003-10-15 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/e-select-names-editable.c (e_selct_names_editable_get_address):
- EDestination -> EABDestination.
-
- * gui/gnome-cal.c (setup_widgets): evolution_dir -> ".evolution".
-
-2003-10-15 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-select-names-editable.c (e_select_names_editable_get_address):
- use EABDestination instead of EDestination.
-
- * gui/gnome-cal.c (gnome_calendar_open): disabled tasks opening code.
-
-2003-10-15 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-meeting-list-view.c: adapted to new addressbook API.
-
- * gui/e-meeting-store.c: adapted to new addressbook API.
- (find_zone): fixed usage of icalcomponent where an icalproperty
- is expected.
- (refresh_busy_periods): fixed call to cal_client_get_free_busy().
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_construct):
- added missing variable.
-
-2003-10-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/dialogs/meeting-page.c: #include <gal/e-table/e-table.h>
-
-2003-10-15 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-meeting-list-view.c (start_addressbook_server):
- updated to new addressbook API.
- (book_open_cb): removed unneeded function, since we load
- the local addressbook synchronously.
-
-2003-10-15 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/Makefile.am: added missing header directories.
-
- * pcs/cal-factory.h: include <libical/ical.h>, not <ical.h>.
-
- * gui/dialogs/meeting-page.c: added missing headers.
- (meeting_page_construct): free 'backend_address' as returned
- by cal_client_get_cal_address(). Removed code to create the
- meeting model's ETable not removed with the merge.
-
- * gui/e-meeting-list-view.c: updated addressbook headers.
-
- * gui/gnome-cal.h: added missing ',' in the GnomeCalendarViewType
- enum.
-
-2003-10-14 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view.c (e_day_view_update_query): dont set status
- messages here, already set in e_cal_view_update_query.
- (update_query): removed this function.
- (e_day_view_recalc_day_starts): call e_day_view_update_query,
- not update_query.
-
- * gui/e-week-view.c (e_week_view_update_query): dont set status
- messages here, already set in e_cal_view_update_query.
-
- * gui/gnome-cal.c (adjust_query_for_view): new function to adjust
- the query for the visible time range on a given view.
- (gnome_calendar_set_query): call adjust_query_for_view for each
- one of the views.
-
-2003-10-14 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-cal-view.c (e_cal_view_init): connect to signals on the
- model we create here, so that we get notifications for changes.
-
- * gui/gnome-cal.c (gnome_calendar_set_query): set the query
- on all models.
- (gnome_calendar_open): update the date navigator query.
-
-2003-10-14 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal.c (cal_notify_timezone_requested): never send NULL
- strings to ORBit.
-
- * gui/e-cal-view.c (e_cal_view_create_popup_menu): removed
- unneeded variables. Also, fixed a typo that was making the
- menu options be disabled when they should be enabled.
-
-2003-10-13 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-cal-model.[ch] (e_cal_model_get_client_for_uri): new function.
-
- * gui/gnome-cal.[ch] (gnome_calendar_set_default_client): new function.
-
- * gui/calendar-component.c (primary_source_selection_changed_callback):
- set the default client on the calendar view to be the primary
- selection on the source list.
-
-2003-10-13 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/new-calendar.c (new_calendar_dialog): set a default group
- on the calendar group option menu and create the source if all checks
- are passed.
-
-2003-10-12 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/new-calendar.c (new_calendar_dialog): set up widgets
- loaded from the Glade file.
-
-2003-10-10 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/Makefile.am (etspec_DATA): Add e-cal-list-view.etspec.
- (libevolution_calendar_la_SOURCES): Add e-cal-list-view.[ch].
-
- * gui/calendar-commands.c (show_list_view_clicked): Implement.
- (calendar_get_text_for_folder_bar_label): Add case for list view.
- Use month case and tweak it so it doesn't show "%d - %d" if the
- time span contains only one day.
- (verbs): Add list view.
- (pixmaps): Add list view.
-
- * gui/calendar-view-factory.c (calendar_view_factory_get_title):
- Add list view case.
- (calendar_view_factory_get_type_code): Add list view case.
-
- * gui/control-factory.c (get_prop): Add list view case.
-
- * gui/e-cal-model.c (get_classification): Fix to conform to updated
- libical.
- (ecm_set_value_at): Add missing break statements.
- (ecm_get_color_for_component): Add braces for clarity.
-
- * gui/gnome-cal.c (gnome_calendar_get_current_view_widget): Add
- list view case.
- (get_focus_location): Add list view case.
- (connect_list_view_focus): Implement.
- (setup_widgets): Set up list view.
- (gnome_calendar_direction): Add list view case.
- (set_view): Add list view case.
- (gnome_calendar_setup_view_menus): Add list view factory.
- (gnome_calendar_construct): Account for list view.
- (gnome_calendar_update_config_settings): Account for list view.
- (get_days_shown): Implement list view case.
-
- * gui/gnome-cal.h (GnomeCalendarViewType): Add list view.
-
- * gui/e-cal-list-view.[ch]: Implement ECalListView, subclassing
- ECalView.
-
-2003-10-10 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/new-calendar.[ch]: added new widget, which implements
- the dialog to create new calendars.
-
- * gui/dialogs/new-calendar.glade: basic mockup of the dialog.
-
- * gui/dialogs/Makefile.am: added new files.
-
- * gui/calendar-commands.c (file_new_calendar_cb): open the new calendar
- dialog to allow user to create a new cal.
-
-2003-10-10 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/control-factory.c (calendar_properties_init): pass the
- BonoboControl to get_prop/set_prop.
- (get_prop): obtain the GnomeCalendar from the control.
- (set_prop): ditto, and when the URI property is changed,
- sensitize the UI as approppriate.
-
- * gui/calendar-commands.c (calendar_control_sensitize_calendar_commands):
- made this function public.
-
- * gui/calendar-commands.h: added new prototype.
-
-2003-10-10 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-commands.c (file_new_calendar_cb,
- file_new_appointment_cb, file_new_event_cb, file_new_meeting_cb,
- file_new_task_cb): callbacks for "New..." verbs.
- (sensitize_calendar_commands): sensitize new verbs, and made it
- sensitize correctly based on the set of clients currently loaded.
- (sensitize_taskpad_commands): likewise.
-
-2003-10-09 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/e-cal-model.c (get_classification): Adapt to libical API changes.
- (ecm_set_value_at): Break after each case, so we don't set the passed value
- in more than one field.
-
-2003-10-09 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-cal-view.c (e_cal_view_delete_selected_occurrence):
- * cal-client/cal-client.c (cal_client_remove_object): added missing
- argument when calling cal_client_remove_object_with_mod().
-
-2003-10-09 Rodrigo Moya <rodrigo@ximian.com>
-
- * idl/evolution-calendar.idl: added missing 'rid' argument to the
- removeObject method.
-
- * cal-client/cal-client.c (cal_client_remove_object_with_mod):
- * pcs/cal-backend.h:
- * pcs/cal-backend.c (cal_backend_remove_object):
- * pcs/cal-backend-sync.h:
- * pcs/cal-backend-sync.c (cal_backend_sync_remove_object,
- _cal_backend_remove_object):
- * pcs/cal-backend-file.c (cal_backend_file_remove_object):
- * pcs/cal.c (impl_cal_removeObject): adapted to changes in IDL.
-
-2003-10-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * cal-client/Makefile.am: INCLUDE path fixes for changes made to
- libical build.
-
- * cal-util/Makefile.am: INCLUDE path fixes for changes made to
- libical build.
-
- * cal-util/*.[c,h]: #include <libical/ical.h> instead of <ical.h>
-
- * gui/Makefile.am: INCLUDE path fixes for changes made to libical
- build.
-
- * gui/*.[c,h]: #include <libical/ical.h> instead of <ical.h>
-
- * gui/alarm-notify/Makefile.am: INCLUDE path fixes for changes
- made to libical build.
-
- * gui/alarm-notify/config-data.h: #include <libical/ical.h>
- instead of <ical.h>
-
- * gui/dialogs/Makefile.am: INCLUDE path fixes for changes made to
- libical build.
-
- * gui/dialogs/comp-editor-util.c: #include <libical/ical.h>
- instead of <ical.h>
-
- * gui/dialogs/e-delegate-dialog.c: #include <libical/ical.h>
- instead of <ical.h>
-
- * importers/Makefile.am: INCLUDE path fixes for changes made to
- libical build.
-
- * pcs/Makefile.am: INCLUDE path fixes for changes made to libical
- build.
-
- * pcs/cal.c: #include <libical/ical.h> instead of <ical.h>
-
-2003-10-08 Harry Lu <harry.lu@sun.com>
-
- * gui/dialogs/alarm-options.glade: Make repeat-quantity and
- repeat-value of alarm option dialog numeric only.
-
- * gui/dialogs/task-details-page.glade: Make percent-complete of
- task details dialog numeric only.
-
-2003-10-08 Chris Toshok <toshok@ximian.com>
-
- * gui/dialogs/e-delegate-dialog.c (e_delegate_dialog_construct):
- EDestination => EABDestination, and e_destination =>
- eab_destination.
- (e_delegate_dialog_get_delegate): same.
- (e_delegate_dialog_get_delegate_name): same.
-
- * gui/dialogs/comp-editor-util.c: remove unnecessary #include of
- e-destination.h.
-
- * gui/dialogs/alarm-options.c (alarm_to_malarm_widgets):
- EDestination => EABDestination, and e_destination =>
- eab_destination.
- (malarm_widgets_to_alarm): same.
-
- * gui/e-meeting-model.c (book_open_cb): track change to error
- return codes.
- (start_addressbook_server): use
- e_book_async_get_default_addressbook.
- (contacts_cb): rename cursor_cb to this, as we no longer get
- passed a cursur, and we don't need to check the email address
- since the query is now "is" instead of "contains".
- (refresh_busy_periods): use an "is" query, and use
- e_book_async_get_contacts instead of getting a CardCursor.
- (process_section): this takes an EABDestination** instead of a
- SimpleCardList*, which is gone.
- (select_names_ok_cb): get "destinations" instead of
- "simple_card_list".
-
-2003-10-08 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/cal-client.c (cal_client_is_read_only): fixed
- documentation comments.
-
- * gui/calendar-commands.c (sensitize_calendar_commands): figure
- out read-only menu items to disable based on the currently
- selected object's CalClient.
-
-2003-10-08 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/cal-client.c: set better error m,essages on the
- E_CALENDAR_CHECK_STATUS macro.
- (cal_client_get_error_message): new function.
-
- * cal-client/cal-client.h: added new prototype.
-
- * gui/dialogs/comp-editor.c (save_comp): use the GError argument
- for the cal_client_create/_modify_object calls, and display the
- error message coming from the backend.
-
- * gui/comp-util.c (cal_comp_is_on_server): likewise.
-
-2003-10-07 Dan Winship <danw@ximian.com>
-
- * idl/evolution-calendar.idl (getDefaultObject): Remove the "type"
- arg; the backend knows what type it is
-
- * pcs/cal.c (impl_Cal_getDefaultObject): Likewise
-
- * pcs/cal-backend.c (cal_backend_get_default_object): Likewise
-
- * pcs/cal-backend-sync.c (cal_backend_sync_get_default_object,
- _cal_backend_get_default_object): Likewise
-
- * pcs/cal-backend-file.c (cal_backend_file_get_default_object):
- Likewise. (Use cal_backend_get_kind() instead.)
-
- * cal-client/cal-client.c (cal_client_get_default_object):
- Likewise
-
- * gui/comp-util.c (cal_comp_event_new_with_defaults,
- cal_comp_task_new_with_defaults): Update calls to
- cal_client_get_default_object().
-
- * pcs/cal-backend-sync.c (_cal_backend_get_static_capabilities):
- Use the right cal notification
-
-2003-10-07 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-cal-model.c (e_cal_model_create_component_with_defaults):
- dont clone NULL icalcomponent's.
-
-2003-10-07 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-cal-model.c (e_cal_model_get_default_client): make sure we
- always return a default client, if possible, since we rely on having
- a default client in many places.
-
- * gui/e-day-view.c (e_day_view_do_key_press): dont create event if
- e_cal_model_create_component_with_defaults returns NULL.
-
- * gui/e-week-view.c (e_week_view_do_key_press): dont create event if
- e_cal_model_create_component_with_defaults returns NULL.
-
-2003-10-06 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-cal-model.c (e_cal_model_create_component_with_defaults):
- make sure the component has always an UID.
-
- * gui/e-day-view.c (e_day_view_find_event_from_uid):
- * gui/e-week-view.c (e_week_view_find_event_from_uid): check
- pointers passed to strcmp().
-
-2003-10-06 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_open): added missing call to
- cal_client_open().
-
- * cal-client/cal-client.c (cal_client_new): fixed documentation
- comments.
- (cal_client_open): emit CAL_OPENED signal with appropriate status codes.
- (open_sync): dont emit CAL_OPENED signal, it's already emitted in
- cal_client_open().
-
-2003-10-06 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/comp-editor-factory.c (open_client):
- * gui/gnome-cal.c (gnome_calendar_open, gnome_calendar_construct):
- * gui/calendar-offline-handler.c (backend_go_offline, backend_go_online,
- calendar_offline_handler_init): adapted to changes in cal_client and
- manage GError's returned by cal_client_open.
-
- * gui/e-itip-control.c: dont run anymore sub event loops.
- (start_calendar_server): use synchronous interface for opening calendars.
- (start_default_server): renamed it from *_async.
- (start_calendar_server_cb): removed unneeded function.
- (object_requested_cb): use sync interface.
-
- * gui/e-tasks.c (e_tasks_construct): dont create the CalClient here.
- (e_tasks_open): do it here, where we've got all the info needed.
-
- * importers/icalendar-importer.c (update_single_object): killed warning.
- (ical_importer_new, vcal_importer_new): don't create CalClient's here.
- (load_file_fn): create them here.
- (vcal_load_file_fn): and here.
- (gnome_calendar_import_data_fn): fixed usage of cal_client_*.
-
- * */*: integrated JP's changes for synchronous open's in cal_client
- and one model per view instead of one model for all views.
-
-2003-10-02 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/cal-client.c (cal_client_modify_object): return FALSE
- if the icalcomponent is NULL.
-
- * gui/e-day-view.c (e_day_view_finish_resize): commit sequence on
- CalComponent after changing start/end dates.
-
-2003-10-01 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view.c (process_component):
- * gui/e-week-view.c (process_component): expand recurrences here.
-
-2003-09-30 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-file.c (match_recurrence_sexp): removed.
- (match_object_sexp): dont expand recurrences here.
-
-2003-09-30 Mike Kestner <mkestner@ximian.com>
-
- * cal-util/cal-util-marshal.list : new VOID:STRING,STRING,STRING
- * gui/Makefile.am : build the new view/store/renderer/editable
- * gui/e-select-names-renderer.* : new completion cell renderer
- * gui/e-select-names-editable.* : new completion cell editable
- * gui/e-meeting-model.* : killed. code reused in list-view/store
- * gui/e-meeting-store.* : port of EMeetingModel to GtkTreeModel
- * gui/e-meeting-list-view.* : GtkTreeView subclass for attendee lists
- * gui/e-meeting-time-sel.c : Use the new store/view
- * gui/e-meeting-time-sel-item.c : Use the new store/view
- * gui/dialogs/Makefile.am : don't install the etspec anymore.
- * gui/dialogs/event-editor.c : Use the new store/view.
- * gui/dialogs/meeting-page.c : Use the new store/view.
- * gui/dialogs/shedule-page.c : Use the new store/view.
- * gui/dialogs/task-editor.c : Use the new store/view.
-
-2003-09-29 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/Makefile.am: link to libical-evolution
-
- * conduits/calendar/Makefile.am: ditto
-
-2003-09-26 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal-backend.c (cal_backend_class_init): remove cal_added
- signal
-
-2003-09-26 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal.h: add protos
-
- * pcs/cal.c (cal_get_backend): accessor
- (cal_get_listener): ditto
-
- * pcs/cal-factory.c (impl_CalFactory_getCal): update to new
- routine name
-
- * pcs/cal-backend.h: add protos
-
- * pcs/cal-backend.c (cal_backend_init): init client mutex
- (cal_backend_finalize): destroy client mutex
- (cal_destroy_cb): just remove the client
- (listener_died_cb): remove the client, the listener died so it
- can't really do anything
- (last_client_gone): signal the last client gone
- (cal_backend_add_client): add a client with locking and listen for
- the death of the listener
- (cal_backend_remove_client): remove client
-
-2003-09-26 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-sync.c (_cal_backend_create_object): only free the
- returned UID if it's not NULL.
-
- * pcs/cal.c (cal_notify_object_created): dont send NULL strings to
- ORBit code.
-
-2003-09-26 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/comp-util.c (cal_comp_is_on_server): free the icalcomponent
- returned from cal_client_get_object, and return TRUE if we find
- the component on the backend.
-
- * gui/e-day-view.c (process_component):
- * gui/e-week-view.c (process_component): added missing case, so that
- we also display recurrent meetings starting before the time range and
- ending after the time range.
-
- * cal-client/cal-listener.c (impl_notifyReadOnly): pass the
- 'read_only' argument to the signal callback correctly (a gboolean
- not a 'gboolean *').
-
- * gui/comp-editor-factory.c (resolve_pending_requests): removed
- the g_assert on 'oc->pending != NULL', since there are now cases
- (local calendar) where we get to call this function (cal_opened_cb)
- with no pending requests yet.
-
-2003-09-25 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-commands.c (publish_freebusy_cmd): adapt to new
- get_free_busy api
-
- * conduits/calendar/calendar-conduit.c (post_sync): ditto
- (pre_sync): ditto
-
- * conduits/todo/todo-conduit.c (pre_sync): ditto
- (post_sync): ditto
-
- * gui/e-meeting-model.c (refresh_busy_periods): ditto
-
- * gui/e-itip-control.c (send_freebusy): ditto
-
- * gui/e-cal-view.c (on_publish): ditto
-
- * cal-client/cal-listener.h: add signals
-
- * cal-client/cal-listener.c (build_change_list): move here from
- cal-client.c
- (impl_notifyChanges): implement
- (build_free_busy_list): util to create the GList of free busy
- objects
- (impl_notifyFreeBusy): implement
- (cal_listener_class_init): set free busy and changes epv methods,
- add signals
-
- * cal-client/cal-client.h: update protos
-
- * cal-client/cal-client.c (cal_get_changes_cb): get changes call
- back
- (cal_get_free_busy_cb): get free busy call back
- (cal_client_init): listen for free busy and changes signals
- (cal_client_get_changes): convert to new threaded sync api
- (cal_client_get_free_busy): ditto
-
- * pcs/cal.h: add protos
-
- * pcs/cal.c: remove dead type conversion function
- (impl_Cal_getChanges): implement by just calling, no return stuff
- (impl_Cal_getFreeBusy): ditto
- (cal_notify_changes): do getChanges callback
- (cal_notify_free_busy): do getFreeBusy callback
-
- * pcs/cal-backend.h: update protos, vmethods
-
- * pcs/cal-backend.c (cal_backend_get_free_busy): call through
- (cal_backend_get_changes): ditto
-
- * pcs/cal-backend-sync.h: add vmethods, protos
-
- * pcs/cal-backend-sync.c (cal_backend_sync_get_changes): call
- through
- (cal_backend_sync_get_free_busy): ditto
- (_cal_backend_get_changes): backend implementation, notify
- (_cal_backend_get_free_busy): ditto
- (cal_backend_sync_class_init): set free busy and changes
- implementations
-
- * pcs/cal-backend-file.c (cal_backend_file_get_free_busy): convert
- to sync backend method
- (cal_backend_file_compute_changes_foreach_key): remove from the
- hash here
- (cal_backend_file_compute_changes): no need to build the sequence
- here
- (cal_backend_file_get_changes): convert to sync backend method
- (cal_backend_file_class_init): set sync backend methods for free
- busy and changes
-
- * idl/evolution-calendar.idl: convert getChanges and getFreeBusy
- to new async api
-
-2003-09-25 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal-backend.h: remove dead result enums
-
- * pcs/cal-backend.c: fix comments
-
- * idl/evolution-calendar.idl: remove dead exceptions
-
-2003-09-25 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal.c (cal_notify_default_object): send back the empty
- string if the object is NULL
- (cal_notify_object): ditto
-
-2003-09-25 JP Rosevear <jpr@ximian.com>
-
- * gui/comp-editor-factory.c (edit_existing): convert to api
- changes
-
- * conduits/todo/todo-conduit.c (local_record_from_uid): ditto
- (pre_sync): ditto
-
- * conduits/calendar/calendar-conduit.c (local_record_from_uid):
- ditto
- (pre_sync): ditto
-
- * importers/icalendar-importer.c (update_single_object): ditto
-
- * gui/dialogs/comp-editor.c (obj_updated_cb): ditto
-
- * gui/e-itip-control.c (get_real_item): ditto
- (find_server): ditto
-
- * gui/comp-util.c (cal_comp_is_on_server): ditto
- (cal_comp_event_new_with_defaults): ditto
- (cal_comp_task_new_with_defaults): ditto
-
- * cal-client/cal-listener.h: add signals
-
- * cal-client/cal-listener.c (impl_notifyDefaultObjectRequested):
- implement
- (impl_notifyObjectRequested): ditto
- (cal_listener_class_init): set above epv implementations, add signals
-
- * cal-client/cal-client.h: update protos
-
- * cal-client/cal-client.c (cal_default_object_requested_cb): get
- default object callback
- (cal_object_requested_cb): get object callback
- (cal_client_init): listen for get and get default object signals
- (cal_client_get_default_object): convert to new sync api
- (cal_client_get_object): ditto
-
- * pcs/cal.h: add protos
-
- * pcs/cal.c (impl_Cal_getDefaultObject): just call the backend, it
- does the notification now
- (impl_Cal_getObject): ditto
- (cal_notify_default_object): do getDefaultObject response
- (cal_notify_object): do getObject response
-
- * pcs/cal-backend.h: remove vmethods, protos
-
- * pcs/cal-backend.c: remove a couple of dead functions
- (cal_backend_class_init): get_object_component is no longer a
- vmethod
- (cal_backend_get_default_object): call through
- (cal_backend_get_object): ditto
-
- * pcs/cal-backend-sync.h: add protos, vmethods
-
- * pcs/cal-backend-sync.c (cal_backend_sync_get_default_object):
- call through
- (cal_backend_sync_get_object): ditto
- (_cal_backend_discard_alarm): pass correct params to
- cal_notify_discard_alarm
- (_cal_backend_get_default_object): call through and notify
- (_cal_backend_get_object): ditto
- (cal_backend_sync_class_init): set backend implementations
-
- * pcs/cal-backend-file.c (cal_backend_file_get_default_object):
- convert to sync backend method
- (cal_backend_file_get_object): ditto
- (cal_backend_file_compute_changes_foreach_key): just look up the
- component rather than using the backend vmethod
- (cal_backend_file_remove_object): return valid sync status codes
- (cal_backend_file_class_init): move get_object, get_default_object
- to sync class
-
- * idl/evolution-calendar.idl: convert getObject and
- getDefaultObject to new async idl
-
-2003-09-25 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal.c (impl_Cal_discardAlarm): just call the backend
- function, it does the notification
- (cal_notify_alarm_discarded): notify of discard alarm call
-
- * pcs/cal-backend.h: update proto
-
- * pcs/cal-backend.c (cal_backend_discard_alarm): call through
-
- * pcs/cal-backend-sync.h: add proto, vmethod
-
- * pcs/cal-backend-sync.c (cal_backend_sync_discard_alarm): call
- through
- (_cal_backend_discard_alarm): call through and notify
- (cal_backend_sync_class_init): set discard alarm implementation
-
- * pcs/cal-backend-file.c (cal_backend_file_discard_alarm): match
- sync backend vmethod
- (cal_backend_file_class_init): set alarm vmethod implementation
-
- * idl/evolution-calendar.idl: switch discardAlarm to new api
-
- * gui/alarm-notify/alarm-queue.c (remove_queued_alarm): match new
- api
-
- * cal-client/cal-listener.h: add signal
-
- * cal-client/cal-listener.c (impl_notifyAlarmDiscarded): implement
- (cal_listener_class_init): add alarm, send, receive epv functions,
- alarm signal
-
- * cal-client/cal-client.h: update proto
-
- * cal-client/cal-client.c (cal_alarm_discarded_cb): discardAlarm
- callback
- (cal_client_init): listen to discard alarm signal
- (cal_client_discard_alarm): implement with new threaded sync api
-
-2003-09-25 JP Rosevear <jpr@ximian.com>
-
- * idl/evolution-calendar.idl: remove unused user exceptions
-
-2003-09-24 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-util.[ch] (cal_backend_util_fill_alarm_instances_seq):
- removed unneeded function.
-
-2003-09-24 JP Rosevear <jpr@ximian.com>
-
- * conduits/*/*.c: adjust to new timezone api calls
-
- * gui/*.c: ditto
-
- * gui/dialogs/*.c: ditto
-
- * cal-client/cal-listener.h: add new signals
-
- * cal-client/cal-listener.c (convert_status): convert invalid
- object as well
- (impl_notifyTimezoneRequested): implement
- (impl_notifyDefaultTimezoneSet): ditto
- (cal_listener_class_init): set epv implementations for timezone
- functions
- (cal_listener_class_init): create timezone response signals
-
- * cal-client/cal-client.h: update protos
-
- * cal-client/cal-client.c: fix return values all over the place
- (cal_get_timezone_cb): getTimezone response
- (cal_query_cb): setDefaultTimezone response
- (cal_client_init): listen for new response signals
- (cal_client_get_timezone): implement using new thread sync api
- (cal_client_ensure_timezone_on_server): use add timezone call
- (cal_client_set_default_timezone): oimplement using new thread sync
- api
-
- * cal-client/cal-client-types.h: add invalid object status code
-
- * idl/evolution-calendar.idl: getQuery no longer raises any user
- exceptions, remove dead types and exceptions
-
-2003-09-24 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal.h: new protos
-
- * pcs/cal.c (impl_Cal_getTimezone): call backend implementation
- (impl_Cal_addTimezone): ditto
- (impl_Cal_setDefaultTimezone): ditto
- (cal_class_init): set epv implementations of timezone functions
- (cal_notify_timezone_requested): notify of get timezone response
- (cal_notify_default_timezone_set): notify of default timezone
- being set
-
- * pcs/cal-backend.h: new vmethods, protos
-
- * pcs/cal-backend.c (cal_backend_class_init): init new timezone
- vmethods
- (cal_backend_get_timezone): call through
- (cal_backend_set_default_timezone): ditto
- (cal_backend_add_timezone): ditto
- (cal_backend_internal_get_default_timezone): ditto
- (cal_backend_internal_get_timezone): ditto
-
- * pcs/cal-backend-sync.h: add vmethods, protos
-
- * pcs/cal-backend-sync.c (cal_backend_sync_get_timezone): call
- through
- (cal_backend_sync_set_default_timezone): ditto
- (_cal_backend_set_default_timezone): call through and notify
- (_cal_backend_get_timezone): ditto
- (cal_backend_sync_class_init): set backend implementations for new
- funcs
-
- * pcs/cal-backend-object-sexp.c (func_occur_in_time_range): get
- time_t values based on the zone
-
- * pcs/cal-backend-file.c: reorg so we don't have to prototype
- everything
- (cal_backend_file_get_timezone): implement the sync backend way
- (cal_backend_file_add_timezone): ditto
- (cal_backend_file_set_default_timezone): ditto
- (cal_backend_file_internal_get_default_timezone): internal method,
- for sexp comparison
- (cal_backend_file_internal_get_timezone): ditto
-
- * idl/evolution-calendar.idl: convert timezone routines to async
- api
-
-2003-09-23 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-object-sexp.c (func_occur_in_time_range): dont expand
- recurrences, since they are supposed to be expanded in the backends.
- (instance_occur_cb, resolve_tzid): removed unneeded functions.
-
- * pcs/cal-backend-file.c (cal_backend_file_add_timezone): guard against
- adding the timezone if it's already there.
-
-2003-09-23 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal.c (cal_notify_object_created): notify with the object,
- not the uid
-
- * gui/e-cal-model.c (add_new_client): don't listen for
- non-existent signal
-
-2003-09-23 JP Rosevear <jpr@ximian.com>
-
- * cal-client/cal-client.h: remove dead proto
-
-2003-09-23 JP Rosevear <jpr@ximian.com>
-
- * cal-client/cal-client.h: remove send result enum
-
- * gui/itip-utils.c (comp_server_send): use the new send_objects
- routine
-
-2003-09-23 JP Rosevear <jpr@ximian.com>
-
- * cal-client/cal-client.h: remove send result enum
-
-2003-09-23 JP Rosevear <jpr@ximian.com>
-
- * cal-client/cal-client.h: remove enum, protos
-
- * cal-client/cal-client.c: remove remove status enum typing
-
-2003-09-23 Rodrigo Moya <rodrigo@ximian.com>
-
- * importers/icalendar-importer.c (update_objects): new function
- to manage the update of components, taking into account
- VTIMEZONE components.
- (process_item_fn, gnome_calendar_import_data_fn): use
- update_objects instead of cal_client_update_objects.
-
-2003-09-23 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal.h: update proto
-
- * pcs/cal.c (impl_Cal_addTimezone): just call add_timezone, it
- does the notification
- (cal_notify_object_created): only notify the query if the object
- matches
- (cal_notify_object_removed): ditto
-
- * pcs/cal-backend.h: update proto, vmethod
-
- * pcs/cal-backend.c (cal_backend_add_timezone): returns void
-
- * pcs/cal-backend-sync.h: update proto, vmethod
-
- * pcs/cal-backend-sync.c (cal_backend_sync_remove_object): add the
- object as an out param
- (_cal_backend_remove_object): get the object and pass it in the
- notification
-
- * pcs/cal-backend-file.c (cal_backend_file_create_object): kill
- cal_backend_file_update_objects call, its more efficient to create
- the comp ourselves; stamp the creation time, add the component to
- the toplevel
- (cal_backend_file_modify_object): kill the
- cal_backend_file_update_objects call, add the component to the
- toplevel
- (cal_backend_file_remove_object): pass back the object when
- removing
-
-2003-09-23 JP Rosevear <jpr@ximian.com>
-
- * cal-client/cal-query.c (cal_query_finalize): disconnect the
- signal handlers
-
- * cal-client/cal-client.c (cal_client_get_query): unref the
- listener when done
-
-2003-09-23 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-cal-view.c (selection_received): add VTIMEZONE components
- contained in the clipboard data to the backend.
-
-2003-09-22 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor.c (save_comp): modify and create instead
- of update, simplify mod code
-
-2003-09-22 JP Rosevear <jpr@ximian.com>
-
- * gui/e-day-view.c (e_day_view_finish_long_event_resize): modify
- the object instead of update, simplify the instance handling
- (e_day_view_finish_resize): ditto
- (e_day_view_on_top_canvas_drag_data_received): ditto
- (e_day_view_on_main_canvas_drag_data_received): ditto
-
-2003-09-22 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/cal-client.c (cal_client_get_alarms_in_range): use
- 'has-alarms' function in the search expression.
-
- * pcs/cal-backend-object-sexp.c (func_has_alarms): new SExp function.
-
-2003-09-22 JP Rosevear <jpr@ximian.com>
-
- * gui/e-day-view.c (e_day_view_on_editing_stopped): create the
- object if its not on the server or modify it if it is
-
- * gui/e-week-view.c (e_week_view_on_editing_stopped): we return if
- there is no text and it *not* on the server
-
-2003-09-22 JP Rosevear <jpr@ximian.com>
-
- * gui/e-week-view.c (e_week_view_on_editing_stopped): create the
- object if its not on the server or modify it if it is
-
-2003-09-22 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.h: remove proto
-
- * gui/gnome-cal.c: remove gnome_calendar_unrecur_selection
-
- * gui/e-week-view.h: remove proto
-
- * gui/e-week-view.c: remove e_week_view_unrecur_appointment
-
- * gui/e-day-view.h: remove proto
-
- * gui/e-day-view.c: remove e_day_view_unrecur_appointment
-
- * gui/e-cal-view.c: remove on_unrecur_appointment (this is handled
- better via recurrence id's now)
-
-2003-09-22 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (update_attendee_status): ifdef out, leave
- temporarily for reference, but otherwise it shouldn't be needed
- (update_item): switch to using receive objects
- (ok_clicked_cb): update item when receiving a reply
-
- * gui/e-calendar-table.c (selection_received): switch to using
- create object from update_objects
-
- * gui/e-cal-view.c (selection_received_add_event): util routine to
- prevent duplication
- (selection_received): use above
-
- * gui/e-cal-model.c (ecm_set_value_at): switch to using modify
- object from update_objects
- (ecm_append_row): switch to using create object from
- update_objects
-
- * gui/e-cal-model-calendar.c (ecmc_set_value_at): switch to using
- modify object from update_objects
-
- * gui/e-cal-model-tasks.c (ecmt_set_value_at): ditto
-
-2003-09-22 Hans Petter Jansson <hpj@ximian.com>
-
- * cal-util/Makefile.am (libical_util_la_LIBADD):
- libical.la -> libical-evolution.la
-
- * importers/Makefile.am (libevolution_calendar_importers_la_LIBADD):
- libicalvcal.la -> libicalvcal-evolution.la
-
-
-2003-09-19 Rodrigo Moya <rodrigo@ximian.com>
-
- * idl/evolution-calendar.idl: removed getAlarmsInRange and
- getAlarmsForObject methods.
-
- * pcs/cal.c (impl_Cal_getAlarmsInRange, impl_Cal_getAlarmsForObject):
- removed unneeded CORBA methods.
- (cal_class_init): dont set removed methods in the epv.
-
- * pcs/cal-backend.[ch]: removed get_alarms_in_range and
- get_alarms_for_object virtual methods.
- (cal_backend_get_alarms_in_range, cal_backend_get_alarms_for_object):
- removed.
- (cal_backend_class_init): dont set removed virtual methods.
-
- * pcs/cal-backend-file.c (cal_backend_file_get_alarms_in_range,
- cal_backend_file_get_alarms_for_object): removed.
- (cal_backend_file_class_init): dont set removed virtual methods.
-
-2003-09-19 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/cal-client.c (cal_client_get_alarms_in_range): changed
- to use queries.
- (build_component_alarms_list): create the alarm list from a list
- of iCalendar strings.
- (build_alarm_instance_list): removed.
- (cal_client_get_alarms_for_object): dont call the CORBA methods,
- just get alarms by itself.
-
-2003-09-18 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/cal-listener.[ch]: added "add_timezone" signal.
- (impl_notifyTimezoneAdded): implemented new CalListener method.
- (cal_listener_class_init): create "add_timezone" signal for the class.
-
- * cal-client/cal-client.[ch] (cal_client_add_timezone): new function.
- (cal_client_init): connect to "add_timezone" signal on the
- CalListener.
- (cal_add_timezone_cb): callback for the "add_timezone" signal.
-
-2003-09-18 Rodrigo Moya <rodrigo@ximian.com>
-
- * idl/evolution-calendar.idl: added 'notifyTimezoneAdded' method
- to the Calendar::Listener interface.
-
- * pcs/cal-backend-sync.[ch] (cal_backend_sync_add_timezone):
- (_cal_backend_add_timezone): new functions for the new virtual
- method implementation.
-
- * pcs/cal.[ch] (cal_notify_timezone_added): new function.
-
- * pcs/cal-backend-file.c (cal_backend_add_timezone): converted to
- return a CalBackendSyncStatus.
- (cal_backend_file_class_init): the 'add_timezone' method we implement
- is the one in the CalBackendSync class.
- (cancel_receive_object): added missing 'return'.
- (free_cal_component): removed unused function.
-
-2003-09-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-file.c (cal_backend_add_timezone): added new
- virtual method implementation.
-
- * pcs/cal.c (impl_Cal_addTimezone): check return value from
- cal_backend_add_timezone, and set an exception if an error is
- returned.
-
-2003-09-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * idl/evolution-calendar.idl: added addTimezone method.
-
- * pcs/cal.c (impl_Cal_addTimezone): implemented new method.
- (cal_class_init): set new method on the epv.
-
- * pcs/cal-backend.[ch]: added 'add_timezone' virtual method.
- (cal_backend_add_timezone): implemented new virtual method.
-
- * pcs/cal-backend-file.c (cal_backend_file_modify_object): it's
- cal_component_get_as_string, not cal_component_as_string.
-
- * cal-client/cal-client.c (cal_client_ensure_timezone_on_server):
- dont use anymore updateObjects method, use addTimezone instead.
-
-2003-09-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * conduits/todo/Makefile.am: removed libwombat reference.
-
-2003-09-15 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-file.c (cal_backend_file_create_object): return
- the UID of the added object.
- (cal_backend_file_remove_object): ditto for old_object.
-
-2003-09-15 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/todo-conduit.c (replace_record): switch to modify
- object
- (add_record): switch to using create object
-
- * conduits/calendar/calendar-conduit.c (process_multi_day): switch
- to using create object
- (add_record): switch to using create object
- (replace_record): switch to modify object
-
- * cal-client/cal-listener.h: add signals
-
- * cal-client/cal-listener.c (impl_notifyObjectsReceived):
- implement listener method
- (build_object_list): ditto
- (cal_listener_class_init): create receive_objects and send_objects
- signals
-
- * cal-client/cal-client.h: add, update protos
-
- * cal-client/cal-client.c (cal_objects_received_cb):
- receive_objects callback
- (cal_objects_sent_cb): send_objects callback
- (cal_client_init): listen for above signals
- (cal_client_create_object): pass back uid
- (cal_client_receive_objects): implement
- (cal_client_send_objects): ditto
-
- * idl/evolution-calendar.idl: add receive/send objects methods and
- yank updateObjects
-
- * pcs/cal.h: add protos
-
- * pcs/cal.c (impl_Cal_receiveObjects): implement
- (impl_Cal_sendObjects): ditto
- (cal_class_init): add epv methods
- (cal_notify_objects_received): notify of objects received call,
- updating queries
- (cal_notify_objects_sent): notify of objects sent
-
- * pcs/cal-backend.h: remove proto
-
- * pcs/cal-backend.c (cal_backend_class_init): remove obj_updated
- signal
- (cal_backend_class_init): init vmethods properly
- (cal_backend_receive_objects): call through
- (cal_backend_send_objects): ditto
-
- * pcs/cal-backend-sync.h: add protos, vmethods
-
- * pcs/cal-backend-sync.c (cal_backend_sync_receive_objects): call
- through
- (cal_backend_sync_send_objects): ditto
- (_cal_backend_receive_objects): call backend method and notify
- (_cal_backend_send_objects): ditto
- (cal_backend_sync_class_init): override send/receive object
- vmethods
-
- * pcs/cal-backend-file.c (cal_backend_file_class_init): set
- remove/send objects sync vmethods
- (cal_backend_file_create_object): remove call to dead method
- (cal_backend_file_remove_object): ditto
- (cal_backend_file_modify_object): ditto
- (cancel_received_object): cancel an object
- (check_tzids): check we have all the tzid's for the object
- (cal_backend_file_receive_objects): receive a bunch of objects via
- itip
- (cal_backend_file_send_objects): skeleton implementation
-
-2003-09-15 Rodrigo Moya <rodrigo@ximian.com>
-
- * idl/evolution-calendar.idl: added InvalidObject CallStatus.
-
- * pcs/cal-backend-file.c (cal_backend_file_create_object): implemented.
- (cal_backend_file_modify_object): implemented.
-
-2003-09-15 Harry Lu <harry.lu@sun.com>
-
- * gui/apps_evolution_calendar.schemas: change last_notification_time's
- type from string to int.
-
-2003-09-12 Bolian Yin <bolian.yin@sun.com>
-
- * e-week-view.c (e_week_view_focus): make jump button focusable
- (e_week_view_on_jump_button_event): key_press and focus event for jump button
- (e_week_view_jump_to_button_item): new function, jump to the day view.
- (e_week_view_is_jump_button_visible): new function.
-
-
-2003-09-12 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal.c (cal_notify_cal_address, cal_notify_alarm_email_address,
- cal_notify_ldap_attribute, cal_notify_static_capability):
- make sure we always notify listeners, regardless of whether the
- string is empty or not.
-
- * cal-client/cal-client.c (check_capability): guard against using
- NULL strings with strstr.
-
-2003-09-12 JP Rosevear <jpr@ximian.com>
-
- * cal-client/client-test.c (cal_opened_cb): listen for other query
- signals
-
- * cal-client/cal-listener.h: add signals
-
- * cal-client/cal-listener.c (impl_notifyObjectCreated): implement
- (impl_notifyObjectModified): implement
- (cal_listener_class_init): assign epv implementations
- (cal_listener_class_init): add create/modify object signals
-
- * cal-client/cal-client.h: add protos
-
- * cal-client/cal-client.c (cal_object_created_cb): object created
- callback
- (cal_object_modified_cb): object modified callback
- (cal_client_init): listen for create/modify object signals from
- the listener
- (cal_client_create_object): call the create object method
- (cal_client_modify_object): call the modify object method
-
- * cal-client/client-test.c (cal_opened_cb): listen for all the
- query signals, tidy
-
-2003-09-12 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal.c (impl_Cal_createObject): implement
- (impl_Cal_modifyObject): ditto
- (cal_class_init): set epv methods for create/modify
-
- * pcs/cal-backend.h: add protos, vmethod
-
- * pcs/cal-backend.c (cal_backend_class_init): init new vmethods
- (cal_backend_create_object): call through
- (cal_backend_modify_object): ditto
-
- * pcs/cal-backend-sync.h: add protos, vmethods
-
- * pcs/cal-backend-sync.c (cal_backend_sync_create_object): call
- through
- (cal_backend_sync_modify_object): ditto
- (_cal_backend_create_object): create object and notify
- (_cal_backend_modify_object): modify object and notify
-
- * pcs/cal-backend-file.c (cal_backend_file_create_object):
- skeleton routine for creating objects
- (cal_backend_file_modify_object): ditto for modifying
-
- * idl/evolution-calendar.idl: add createObject and modifyObject
- calls
-
-2003-09-12 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal.c (cal_notify_object_removed): its uid, not uids
-
-2003-09-12 JP Rosevear <jpr@ximian.com>
-
- * pcs/query.h: add protos
-
- * pcs/query.c (query_object_matches): use the sexp to check for a
- match
- (query_notify_objects_added_1): notify of one object added to
- query
- (query_notify_objects_modified_1): ditto for modification
- (query_notify_objects_removed_1): ditto for removal
-
- * pcs/cal.h: add protos
-
- * pcs/cal.c (cal_notify_object_created): notify of object creation
- (cal_notify_object_modified): notify of object modification
- (cal_notify_object_removed): use the _1 routines
-
- * pcs/cal-backend-file.c (match_recurrence_sexp): this returns a
- boolean
- (cal_backend_file_update_objects): don't signal removals here now
-
- * idl/evolution-calendar.idl: add object created and modified
- responses
-
-
-2003-09-11 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal.h: update proto
-
- * pcs/cal.c (cal_notify_object_removed): notify relevant queries
- of removal
-
- * pcs/cal-backend.c (cal_backend_get_queries): ref the list before
- passing it back
-
- * pcs/cal-backend-sync.c (_cal_backend_remove_object): pass uid to
- notification
-
-2003-09-11 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal-backend-file.c (match_recurrence_sexp): don't unref the
- component
-
- * cal-client/client-test.c (cal_opened_cb): listen to objects
- added signal
- (objects_added_cb): print the object uid
-
-2003-09-11 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal-backend-object-sexp.c (cal_backend_object_sexp_text):
- return the base text
-
-2003-09-11 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (update_query): fix c/p typo
-
-2003-09-11 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (update_query): start the query
-
- * gui/e-cal-model.c (update_query_for_client): ditto
-
- * cal-client/client-test.c (cal_opened_cb): ditto
-
-2003-09-11 JP Rosevear <jpr@ximian.com>
-
- * cal-client/cal-query.h: add proto
-
- * cal-client/cal-query.c (cal_query_start): start the query
-
-2003-09-11 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/delete-error.c (delete_error_dialog): accept GError
- and base error messages on that
-
- * gui/dialogs/delete-error.h: update proto
-
- * gui/e-tasks.c (e_tasks_delete_completed): pass extra param to
- cal_client_remove_object
-
- * conduits/todo/todo-conduit.c (delete_record): ditto
-
- * conduits/calendar/calendar-conduit.c (process_multi_day): ditto
- (delete_record): ditto
-
- * gui/gnome-cal.c (gnome_calendar_purge): ditto
-
- * gui/dialogs/comp-editor.c (delete_comp): ditto
-
- * gui/e-cal-view.c (e_cal_view_cut_clipboard): pass the error to
- delete_error_dialog
- (delete_event): ditto
- (e_cal_view_delete_selected_occurrence): ditto
-
- * gui/e-itip-control.c (remove_item): ditto
-
- * gui/e-calendar-table.c (delete_selected_components): ditto
-
- * cal-client/cal-listener.h: add signal
-
- * cal-client/cal-listener.c (impl_notifyObjectRemoved): implement
- (cal_listener_class_init): set object removed implementation and
- create signal
-
- * cal-client/cal-client.h: update protos
-
- * cal-client/cal-client.c (cal_object_removed_cb): object removal
- callback
- (cal_client_init): listen for object removal signal
- (cal_client_remove_object_with_mod): make call synchronous
- (cal_client_remove_object): pass new params
-
- * pcs/cal.h: add proto
-
- * pcs/cal.c (impl_Cal_removeObject): just call the backend
- function
- (cal_notify_object_removed): notify of removal
-
- * pcs/cal-backend.h: remove and update protos, remove signal
-
- * pcs/cal-backend.c (cal_backend_class_init): kill obj_removed
- signal
- (cal_backend_remove_object): there is no return value now
-
- * pcs/cal-backend-sync.h: add vmethod, proto
-
- * pcs/cal-backend-sync.c (cal_backend_sync_remove_object): call
- through
- (_cal_backend_remove_object): remove the object and then do the
- notification
-
- * pcs/cal-backend-file.c (cal_backend_file_class_init): remove
- object is not part of the sync class
- (cal_backend_file_update_objects): there is no more removed signal
- (cal_backend_file_remove_object): return sync status codes
-
- * idl/evolution-calendar.idl: make removeObject oneway and and a
- notification method in the listener
-
-2003-09-11 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/query.[ch] (query_get_text): new function.
- (query_get_object_sexp): new function.
-
- * pcs/cal-backend-file.c (cal_backend_file_start_query): implemented.
-
-2003-09-11 Hans Petter Jansson <hpj@ximian.com>
-
- * cal-util/Makefile.am (libcal_util_la_LIBADD):
- libical-evolution.la -> libical.la
-
- * cal-util/cal-component.c (cal_component_get_classification)
- (cal_component_set_classification)
- (get_text_list)
- (get_icaltimetype)
- (get_datetime)
- (get_period_list)
- (get_recur_list)
- (cal_component_get_transparency)
- (cal_component_set_transparency): Adapt to new libical.
-
- * cal-util/cal-util.c (cal_util_event_dates_match): Ditto.
-
- * pcs/cal-backend-file.c (create_user_free_busy): Ditto.
-
- * gui/e-cal-model-tasks.c (get_completed)
- (get_due)
- (get_due_status): Ditto.
-
- * gui/e-cal-model.c (get_dtstart)
- (set_classification): Ditto.
-
- * gui/e-cal-model-calendar.c (get_dtend)
- (get_transparency)
- (set_transparency): Adapt to new libical and fix a comparison bug.
-
- * importers/Makefile.am (libevolution_calendar_importers_la_LIBADD):
- libical-evolution.la -> libical.la
-
-2003-09-11 Dan Winship <danw@ximian.com>
-
- * cal-util/Makefile.am (privlib_LTLIBRARIES): Remove
- libcal-util-static.la
-
- * cal-client/Makefile.am (noinst_LTLIBRARIES): Remove
- libcal-client-static.la
-
- * conduits/calendar/Makefile.am (libecalendar_conduit_la_LIBADD):
- use non-static libraries. The static ones were only needed for
- libtool 1.3.
-
- * conduits/todo/Makefile.am (libetodo_conduit_la_LIBADD): Likewise
-
- * gui/Makefile.am (IDL_GENERATED): Don't compile the calendar idl
- here. It's already in libcal-client.
-
-2003-09-11 Frederic Crozat <fcrozat@mandrakesoft.com>
-
- * conduits/todo/Makefile.am:
- Statically link with wombat. Fix ETodo conduit.
- (Mdk bug #5348)
-
-
-2003-09-10 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal.h: update proto
-
- * pcs/cal.c (impl_Cal_getObjectList): just call the backend, it
- will do the notification now
- (cal_notify_object_list): the list is a list of strings
-
- * pcs/cal-backend.h: update vmethod, proto
-
- * pcs/cal-backend.c (cal_backend_get_object_list): call through
-
- * pcs/cal-backend-sync.h: add proto, vmethod
-
- * pcs/cal-backend-sync.c (cal_backend_sync_get_object_list): call
- through
- (_cal_backend_get_object_list): get the list of objects from the
- sync backend and do the notification
- (cal_backend_sync_class_init): set vmethod implementation
-
- * pcs/cal-backend-file.c (cal_backend_file_class_init): the get
- object list call is now part of the sync backend
- (cal_backend_file_get_object_list): return a status and put the
- object list in the passed in param
-
-2003-09-10 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal-backend.c (cal_backend_finalize): unref the elist
- (cal_backend_init): init the query elist
-
-2003-09-10 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (dn_query_objects_added_cb): match new query
- signals - just tag here
- (dn_query_objects_modified_cb): always retag
- (dn_query_objects_removed_cb): ditto
- (update_query): connect to new signals
- (gnome_calendar_destroy): we don't keep a list of expunging
- queries
- (gnome_calendar_purge): no need to do the
- expunge async, just get the object list immediately
-
- * gui/e-tasks.c (e_tasks_delete_completed): no need to do the
- expunge async, just get the object list immediately
-
- * gui/e-cal-model.c (query_objects_added_cb): callback for objects
- added to the query
- (query_objects_modified_cb): ditto for modifications
- (query_objects_removed_cb): ditto for removed
- (query_progress_cb): progress of the query
- (query_done_cb): query is done
- (update_query_for_client): connect to the new signals
-
- * cal-client/client-test.c (cal_opened_cb): run a query
-
- * cal-client/cal-query.c: we are given the listener now - listen
- for signals from the listener and emit signals matching the api
- changes
-
- * cal-client/query-listener.[hc]: rewrite to match new query
- listener methods and emit signals rather than using function
- callbacks
-
- * cal-client/cal-marshal.list: add to marshallers
-
- * cal-client/cal-listener.h: add query signal
-
- * cal-client/cal-listener.c (impl_notifyQuery): implement
- (cal_listener_class_init): set notifyQuery method
- (cal_listener_class_init): add query signal
-
- * cal-client/cal-client.h: update protos
-
- * cal-client/cal-client.c (cal_query_cb): handle response to
- getQuery
- (cal_client_init): listen for query signal
- (cal_client_get_query): get a query from the calendar
-
- * pcs/query.h: update protos
-
- * pcs/query.c: rewrite to implement the query start method and
- provide notification calls
-
- * pcs/cal.h: add proto
-
- * pcs/cal.c (impl_Cal_getQuery): re-implement so the backend
- doesn't create the query for us
- (cal_notify_query): respond with the query
-
- * pcs/cal-factory.c: re-order includes
-
- * pcs/cal-common.h: add types
-
- * pcs/cal-backend.h: update protos, vmethods
-
- * pcs/cal-backend.c (cal_backend_class_init): init start_query
- vmethod
- (cal_backend_finalize): free mutex
- (cal_backend_start_query): call through
- (cal_backend_add_query): add a query to the list the backend is
- running
- (cal_backend_get_queries): get the query list
-
- * pcs/cal-backend-object-sexp.h: add proto
-
- * pcs/cal-backend-file.c (cal_backend_file_start_query): skeleton
- for new backend implementation
-
- * pcs/Makefile.am: don't build dead files
-
- * idl/evolution-calendar.idl: make the getQuery call async, make
- the query listener calls oneway and match the addressbook
-
-2003-09-09 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-file.c (cal_backend_file_get_object_component):
- added case for getting the individual recurrences if 'rid' is
- not NULL,
-
-2003-09-09 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-file.c (match_object_sexp): expand recurrences
- for recurrent objects.
- (match_recurrence_sexp): add the recurrences that match the query
- expression to the object list.
-
-2003-09-08 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-file.c: don't store all recurrences in the
- private structure.
-
-2003-09-04 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-vie
diff --git a/calendar/ChangeLog.pre-1-4 b/calendar/ChangeLog.pre-1-4
deleted file mode 100644
index 912411acd1..0000000000
--- a/calendar/ChangeLog.pre-1-4
+++ /dev/null
@@ -1,21872 +0,0 @@
-2003-06-02 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes part of #43388
-
- * importers/icalendar-importer.c (prepare_events):
- (prepare_tasks): use external iterators for removing components from
- the main component.
-
-2003-05-29 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #43763
-
- * gui/e-week-view.c (e_week_view_init): use g_signal_connect_after
- for "button_press_event" callback.
-
- * gui/e-day-view.c (e_day_view_init): ditto.
-
-2003-05-29 JP Rosevear <jpr@ximian.com>
-
- Fixes #43775
-
- * gui/weekday-picker.c (get_day_text): calculate the characters to
- display correctly
- (configure_items): use it
- (weekday_picker_style_set): ditto
-
- * gui/print.c (format_date): use e_utf8_strftime
- (print_week_view_background): ditto
- (print_month_summary): ditto
- (range_selector_new): ditto
- (print_comp_item): ditto
-
- * gui/itip-utils.c (comp_description): the translation is already
- utf8
-
- * gui/e-itip-control.c (write_label_piece): the string is already
- in utf8
-
- * gui/e-day-view.c (e_day_view_style_set): use e_utf8_strftime
- (e_day_view_recalc_cell_sizes): ditto
-
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw): use
- e_utf8_strftime
-
- * gui/e-cell-date-edit-text.c (ecd_get_text): return the
- duplicated buffer (its already utf8)
- (show_date_warning): use e_utf8_strftime
-
- * gui/calendar-model.c (date_value_to_string): return the
- duplicated buffer (its already utf8)
- (calendar_model_value_to_string): the translations should already
- be in utf8
-
- * gui/calendar-config.c
- (calendar_config_locale_supports_12_hour_format): use
- e_utf8_strftime
-
- * gui/calendar-commands.c (calendar_set_folder_bar_label): use
- e_utf8_strftime
-
-2003-05-28 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #43455
-
- * gui/tasks-control.c (confirm_expunge): converted to a GtkMessageDialog
- and removed object weak's ref code, not needed anymore.
-
-2003-05-20 JP Rosevear <jpr@ximian.com>
-
- Fixes #43308
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_style_set):
- adjust row heights to reflect changes in etable row heights and
- set display top to align properly
-
-2003-05-22 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor-page.c (comp_editor_page_destroy): unref
- not ref the client
-
-2003-05-22 JP Rosevear <jpr@ximian.com>
-
- Fixes #41329
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_on_zoomed_out_toggled): make sure the
- meeting time is shown afterwards
- (e_meeting_time_selector_on_working_hours_toggled): ditto
-
-2003-05-21 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #41234
-
- * gui/dialogs/e-delegate-dialog.glade: changed button ordering.
-
-2003-05-20 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_setup_view_menus): Removed
- debugging message.
-
-2003-05-20 Anna Marie Dirks <anna@ximian.com>
-
- * gui/dialogs/save-comp.c (save_component_dialog): Change this
- dialog from using a gnome_message_box (which has been deprecated),
- to using a gtk_message_dialog. This HIG-ifies this dialog, and
- fixes bug #42046.
-
-2003-05-20 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes #42056
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_construct):
- Don't create accel groups for menuitem mnemonics. Don't use
- deprecated functions where we actually need accel groups.
-
-2003-05-19 Dan Winship <danw@ximian.com>
-
- * pcs/cal-backend.c (cal_backend_finalize): Don't double-free
- newly-added categories that the gui hasn't been told about yet.
- #43321
-
-2003-05-19 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/main.c (factory): set 'initialized' to TRUE when initialization
- is done, or we get the initialization code called over and over.
-
-2003-05-19 Anna Marie Dirks <anna@ximian.com>
-
- * gui/e-meeting-time-sel.c: (e_meeting_time_selector_construct):
- Added HIG-blessed padding to (some of) the widgets in the
- dialog.
-
- * gui/dialogs/meeting-page.glade: Added HIG-blessed border width
- and spacing to the meeting page of the event editor.
-
- * gui/dialogs/schedule-page.glade: Added HIG-blessed border width
- to the schedule page on the event editor.
-
-
-2003-05-19 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_destroy): remove the query time
- out if its still alive
- (update_query_timeout): update the query and clear the time out
- (client_cal_opened_cb): add the query update timeout
-
-2003-05-19 JP Rosevear <jpr@ximian.com>
-
- Fixes #43103
-
- * gui/e-day-view.c (e_day_view_init): connect normally instead of
- after so that our boolean return values afffect the action signal
- emmissions properly
- (e_day_view_on_top_canvas_drag_motion): fix proto to be a gboolean
- (e_day_view_on_main_canvas_drag_motion): ditto
-
- * gui/e-week-view.c (e_week_view_init): connect normally instead
- of after so that our boolean return values afffect the action
- signal emmissions properly
-
-2003-05-16 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor.c (make_title_from_comp): the title is
- already in UTF-8
-
-2003-05-16 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #42220
-
- * gui/e-day-view.c (e_day_view_finish_resize): hide canvas items and
- update internal fields before updating the object.
-
-2003-05-15 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor.c (comp_editor_finalize): unref the
- client and the ui component
-
-2003-05-15 JP Rosevear <jpr@ximian.com>
-
- Fixes #41935
-
- * gui/e-week-view.c (e_week_view_init): listen for scroll events
- on the canvas
- (e_week_view_on_button_press): don't scroll here
- (e_week_view_on_scroll): scroll here
-
- * gui/e-day-view.c (e_day_view_init): listen for scroll events on
- the time and main canvases
- (e_day_view_on_main_canvas_button_press): don't scroll here
- (e_day_view_on_main_canvas_scroll): scroll here
- (e_day_view_on_time_canvas_scroll): and here
-
-2003-05-15 JP Rosevear <jpr@ximian.com>
-
- Fixes #43029
-
- * gui/e-week-view.c (e_week_view_init): don't listen for destroy
- signal
- (e_week_view_destroy): check for NULL and make invisible NULL
- after we destroy it, unref cursors and NULL them out as well,
- guard against freeing events multiple times
-
- * gui/e-day-view.c (e_day_view_destroy): check for NULL and make
- invisible NULL after we destroy it, unref cursors and NULL them
- out as well, guard against freeing events multiple times
- (e_day_view_init): don't listen for destroy signal
-
- * gui/e-calendar-table.c (e_calendar_table_init): don't listen for
- destroy signal
- (e_calendar_table_destroy): check for NULL and make invisible NULL
- after we destroy it
-
-2003-05-15 JP Rosevear <jpr@ximian.com>
-
- Fixes #41930
-
- * idl/evolution-calendar.idl: Make sure everything that can raise
- a NotFound exception lists it
-
-2003-05-15 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_refresh_free_busy): ref ourselves the
- number of times we'll get called back
-
-2003-05-14 JP Rosevear <jpr@ximian.com>
-
- * gui/e-tasks.c (e_tasks_destroy): guard against multiple destroys
-
- * cal-client/cal-client.c (cal_client_finalize): unref the
- bonobo listener
-
- * gui/gnome-cal.c (gnome_calendar_destroy): guard against multiple
- destroy calls
-
- * gui/e-week-view.c (e_week_view_init): connect after destroy
- (invisible_destroyed): don't unref, its already destroyed
-
- * gui/e-day-view.c (e_day_view_init): connect after destroy
- (invisible_destroyed): don't unref, its already destroyed
-
- * gui/e-calendar-table.c (e_calendar_table_class_init): make sure
- we set the parent class
- (e_calendar_table_init): connect after the destroy handler runs
- (e_calendar_table_destroy): guard against multiple destroys
- (invisible_destroyed): don't unref the invisible, its already
- being destroyed
-
- * gui/calendar-offline-handler.c (backend_cal_set_mode): unref the
- client, we are done with it now
- (backend_cal_opened_online): ditto
- (impl_dispose): unref our main client
-
- * gui/calendar-commands.c (control_util_set_folder_bar_label):
- release/unref the shell view once we are done with it
- (control_util_show_settings): ditto
-
-2003-05-13 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-queue.c (notify_dialog_cb): fixed memory
- leak introduced by previous commit.
-
-2003-05-12 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #41760
-
- * gui/alarm-notify/alarm-queue.c (create_snooze): don't add a new
- alarm, but update the already existing one.
- (notify_dialog_cb): make sure we don't remove the alarm if we are
- snoozing.
-
-2003-05-07 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/task-page.glade: fix button conversion problem
-
- * gui/dialogs/task-details-page.c
- (task_details_page_fill_widgets): only free the percent if its
- non-null
-
-2003-05-07 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/cal-client.c (cal_client_discard_alarm): added missing
- assignment.
-
-2003-05-05 JP Rosevear <jpr@ximian.com>
-
- Fixes #41811
-
- * gui/alarm-notify/Makefile.am: don't dist idl generated files
-
-2003-05-01 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/task-editor.c (task_editor_finalize): unref the
- model again
- (task_editor_edit_comp): don't allow editing if the assignee has
- delegated
-
- * gui/dialogs/meeting-page.c (popup_delete_cb): set the new
- non-delegator to be editable
-
- * gui/dialogs/event-editor.c (event_editor_edit_comp): don't allow
- editing if the attendee has delegated
- (event_editor_finalize): unref the model again
-
- * gui/e-meeting-model.c: remove e-table-without related functions
- (finalize): don't create without table
- (e_meeting_model_etable_from_model): build the table with this as
- model
- (e_meeting_model_etable_model_to_view_row): directly use the
- model_to_view call
- (e_meeting_model_etable_view_to_model_row): as above
- (attendee_changed_cb): make sure pre change is alwasy called
-
- * gui/e-meeting-model.h: use DECLS, remove protos for long dead
- functions, don't include config.h
-
-2003-04-30 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-notify.c (alarm_notify_add_calendar): removed
- unused code.
-
-2003-04-29 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/task-editor.c (task_editor_finalize): ditto
-
- * gui/dialogs/event-editor.c (event_editor_finalize): don't unref
- the model here
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_destroy): null
- up the display_top and display_main for re-entrancy purposes
-
-2003-04-25 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (itip_send_comp): kill warnings
-
-2003-04-28 Anna Marie Dirks <anna@ximian.com>
-
- * gui/dialogs/alarm-options.glade: Added HIG-blessed padding
- to the alarm options dialog. Fixes bug #41221.
-
-2003-04-28 Anna Marie Dirks <anna@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.glade: Added appropriate spacing
- and padding to the calendar/tasks page of the settings dialog.
- Fixes bug #41129
-
-
-2003-04-28 Anna Marie Dirks <anna@ximian.com>
-
- * gui/dialogs/task-page.glade: Finishes up fixing #41256 by
- adding appropriate spacing/padding to the main task page.
-
- * gui/dialogs/task-details-page.glade: Added appropriate
- spacing and padding to the task-details page. Partially
- fixes #41256.
-
-
-2003-04-28 Anna Marie Dirks <anna@ximian.com>
-
- * gui/dialogs/recurrence-page.glade: Added padding/spacing
- to this page as specified by the HIG. Partially fixes #41215.
-
- * gui/dialogs/alarm-page.glade: Added padding/spacing/stock
- buttons to the alarm page. Partially fixes #41215.
-
- * gui/dialogs/event-page.glade: Added padding/spacing to the
- event-page (partially fixes #41215)
-
-
-2003-04-27 Rodney Dawes <dobey@ximian.com>
-
- Fixes #35814
-
- * gui/calendar-component.c: Change mnemonic/keybinding for
- New Meeting to not conflict with other items in the File->New menu
-
-2003-04-24 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #41661
-
- * idl/evolution-calendar.idl: added discardAlarm method to
- GNOME:Evolution:Calendar:Cal interface.
-
- * pcs/cal.c (cal_class_init): set new epv's method.
- (impl_Cal_discardAlarm): implementation of new CORBA method.
-
- * pcs/cal-backend.[ch]: added 'discard_alarm' virtual method, and
- CAL_BACKEND_RESULT_NOT_IMPLEMENTED to CalBackendResult enum.
- (cal_backend_class_init): initialize new class method.
- (cal_backend_discard_alarm): new method.
- (cal_backend_update_objects, cal_backend_remove_object): return
- proper CalBackendResult values.
-
- * pcs/cal-backend-file.c (cal_backend_file_class_init): initialize
- new class method.
- (cal_backend_file_discard_alarm): implementation of new method.
-
- * pcs/cal-client.[ch] (cal_client_discard_alarm): new function.
-
- * gui/alarm-notify/alarm-queue.c (remove_qeueud_alarm): don't remove
- the alarm directly from the component, call cal_client_discard_alarm
- and let the backend deal with it.
-
-2003-04-24 JP Rosevear <jpr@ximian.com>
-
- * gui/apps_evolution_calendar.schemas: set the hpane default to
- 32000 so we never see a pane no matter the start up window size
- unless the user changes it
-
-2003-04-24 JP Rosevear <jpr@ximian.com>
-
- Fixes #37552
-
- * gui/dialogs/Makefile.am: build delete-error.[hc]
-
- * gui/e-tasks.c: wrap calls to cal_client_remove_object with
- delete_error_dialog
-
- * gui/e-itip-control.c: ditto
-
- * gui/e-calendar-table.c: ditto
-
- * gui/e-week-view.c: ditto
-
- * gui/e-day-view.c: ditto
-
- * gui/dialogs/delete-error.[hc]: gemerate an error message based
- on result
-
-2003-04-23 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view.c (e_day_view_on_delete_occurrence): removed
- unused variable..
-
-2003-04-23 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes #41641
-
- * gui/e-day-view.c (e_day_view_focus_in): Remove assert an old
- input method code.
- (e_day_view_focus_out): Ditto.
- (e_day_view_reshape_long_event): Set input method context.
- (e_day_view_reshape_day_event): Ditto.
- (e_day_view_on_editing_started): Let EText handle the context popup.
- (e_day_view_on_editing_stopped): Turn off EText's handling of context
- popup.
-
- * gui/e-week-view.c (e_week_view_reshape_event_span): Set input
- method context.
- (e_week_view_on_text_item_event): Let the EText item handle
- right-click context popup if we're editing it.
- (e_week_view_on_editing_started): Let the EText item handle the
- context popup.
- (e_weeK_view_on_editing_stopped): Turn off EText's handling of
- context popup.
-
-2003-04-23 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #41671
-
- * gui/alarm-notify/notify-main.c (main): added calls to gnome_sound_init
- and gnome_sound_shutdown.
-
- * gui/alarm-notify/alarm-queue.c (audio_notification): check that the
- sound file exists, and gdk_beep if not.
-
-2003-04-22 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes part of #41148, #41216 and #41235
-
- * gui/e-itip-control.c (init):
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_construct,
- e_meeting_time_selector_add_key_color):
- * gui/e-timezone-entry.c (e_timezone_entry_init):
- * gui/gnome-cal.c (setup_widgets):
- * gui/tasks-control.c (confirm_expunge):
- * gui/dialogs/comp-editor.c (setup_widgets):
- * gui/dialogs/e-delegate-dialog.c (e_delegate_dialog_construct):
- * gui/dialogs/meeting-page.c (meeting_page_construct):
- * gui/dialogs/recurrence-page.c (make_weekly_special,
- make_monthly_special, make_ending_count_special):
- * gui/dialogs/schedule-page.c (schedule_page_construct):
- use HIG-suggested spacing.
-
-2003-04-21 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #22444
-
- * gui/calendar-commands.c: added new verbs for occurrence-related
- menu items.
- (delete_occurrence_cmd): added callback for "Delete this occurrence"
- menu item. "Delete all occurrences" is just the same as "Delete".
- (sensitize_calendar_commands): sensitive ocurrence-related menu items.
-
- * gui/gnome-cal.[ch] (gnome_calendar_delete_selected_occurrence): new
- function.
- (gnome_calendar_get_current_view_widget): made this public.
-
- * gui/e-week-view.[ch] (e_week_view_get_selected_event):
- (e_week_view_delete_occurrence): new functions.
- (e_week_view_delete_occurrence_internal): real implementation of the
- 'Delete Occurrence' logic.
- (e_week_view_on_delete_occurrence): call delete_instance_internal.
-
- * gui/e-day-view.[ch] (e_day_view_get_selected_event):
- (e_day_view_delete_occurrence): new functions.
- (e_week_view_delete_occurrence_internal): real implementation of the
- 'Delete Occurrence' logic.
- (e_week_view_on_delete_occurrence): call delete_occurrence_internal.
-
-2003-04-18 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-notify.glade: removed 'heading' and
- 'message' labels.
-
- * gui/alarm-notify/alarm-notify-dialog.c: removed deleted widgets.
- (alarm_notify_dialog): don't load the removed widgets.
-
-2003-04-18 Rodney Dawes <dobey@ximian.com>
-
- Fixes #21499
-
- * gui/Makefile.am:
- * gui/calendar-commands.c:
- * gui/tasks-control.c:
- * gui/dialogs/Makefile.am:
- * gui/dialogs/comp-editor.c:
- Use PREFIX instead of EVOLUTION_DATADIR for bonobo_ui_util_set_ui ()
-
-2003-04-17 JP Rosevear <jpr@ximian.com>
-
- Fixes #41459
-
- * gui/dialogs/meeting-page.c: comment out delegation stuff
-
-2003-04-17 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #34498
-
- * gui/alarm-notify/alarm-queue.c: added a 'uid' field to the
- CompQueuedAlarms structure.
- (remove_queued_alarm): free the 'uid' field when freeing the
- structure.
- (add_component_alarms): g_strdup the component's UID and use that as
- the key for the hash table.
-
-2003-04-16 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #41129, #41215, #41221, #41256
-
- * gui/alarm-notify/alarm-notify.glade:
- * gui/dialogs/alarm-options.glade:
- * gui/dialogs/alarm-page.glade:
- * gui/dialogs/cal-prefs-dialog.glade:
- * gui/dialogs/e-delegate-dialog.glade:
- * gui/dialogs/meeting-page.glade:
- * gui/dialogs/recurrence-page.glade:
- * gui/dialogs/schedule-page.glade:
- * gui/dialogs/task-details-dialog.glade:
- * gui/dialogs/task-page.glade:
- * gui/dialogs/event-page.glade: set spacing to 6 pixels
- everywhere.
-
-2003-04-16 JP Rosevear <jpr@ximian.com>
-
- Fixes #41230
-
- * gui/e-itip-control.c (show_current): make sure to pass TRUE for
- tasks
- (start_calendar_server): make sure we don't gtk_main_quit if we
- haven't gtk_main'ed
- (start_calendar_server_cb): ditto
-
-2003-04-15 JP Rosevear <jpr@ximian.com>
-
- Fixes #39735 and 40257
-
- * gui/gnome-cal.c: convert float pane positions to ints
- (setup_widgets): set the initial position after realization and
- track the drags to get the new position, pack the panes slightly
- differently
- (gnome_calendar_set_pane_positions): set purely pixel oriented
- positions
- (gnome_calendar_update_config_settings): no need to update quanta
- setting
- (gnome_calendar_hpane_realized): realization callback
- (gnome_calendar_vpane_realized): ditto
- (gnome_calendar_vpane_resized): resize callback, store new size
- (gnome_calendar_hpane_resized): ditto
-
- * gui/calendar-model.c (get_due_status): handle an error getting
- the timezone
-
- * gui/calendar-config.c (calendar_config_get_hpane_pos): return an int
- (calendar_config_set_hpane_pos): take an int
- (calendar_config_get_vpane_pos): return an int
- (calendar_config_set_vpane_pos): take an int
-
- * gui/calendar-config.h: update protos
-
- * gui/apps_evolution_calendar.schemas: update defaults for pane
- positions
-
-2003-04-15 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/calendar-component.c (owner_set_cb): If we already have an
- evolution_dir, free the old one before setting it anew.
-
- * gui/e-day-view-time-item.c (e_day_view_time_item_draw): Unref the
- metrics.
-
- * gui/e-day-view.c (e_day_view_style_set): Unref the metrics.
- (e_day_view_recalc_cell_sizes): We don't need font metrics here.
- (e_day_view_reshape_long_event): Ditto.
-
- * gui/e-meeting-model.c (init): Don't dup the string passed to
- e_table_without_hide().
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_style_set):
- Unref the metrics.
- (e_meeting_time_selector_recalc_date_form): Doesn't need metrics.
-
- * gui/e-week-view-main-item.c (e_week_view_main_item_draw_day):
- Unref the metrics.
-
- * gui/e-week-view.c (e_week_view_style_set): Unref metrics.
- (e_week_view_recalc_cell_sizes): Ditto.
- (e_week_view_reshape_event_span): Move Pango stuff to where it
- can't be leaked due to an early return. Unref metrics.
-
- * gui/weekday-picker.c (weekday_picker_style_set): Unref metrics.
-
- * gui/dialogs/meeting-page.c (meeting_page_finalize): Free default
- address.
-
-2003-04-11 Dan Winship <danw@ximian.com>
-
- * gui/dialogs/Makefile.am (IDL_GENERATED, etc): Oops. Add this
- back. Turns out it's still needed by other parts.
-
-2003-04-11 Dan Winship <danw@ximian.com>
-
- * gui/dialogs/task-page.glade: Remove the "Contacts" button and
- entry from here too. Supposed to have been part of #35926
-
- * gui/dialogs/task-page.c: Remove all code pertaining to the
- contacts button
-
- * gui/dialogs/comp-editor-util.c:
- * gui/dialogs/comp-editor-util.h: Likewise
-
- * gui/dialogs/Makefile.am (IDL_GENERATED, etc): Remove
- select-names stuff, which is no longer used.
-
-2003-04-11 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-util/cal-util.h: added missing capabilities.
-
- * cal-client/cal-client.c (cal_client_get_one_alarm_only,
- cal_client_get_organizer_must_attend,
- cal_client_get_save_schedules):
- * gui/itip-utils.c (itip_organizer_is_user):
- * gui/e-calendar-table.c (e_calendar_table_on_right_click):
- * gui/dialogs/task-editor.c (set_menu_sens):
- * gui/dialogs/event-page.c (event_page_fill_widgets):
- * gui/dialogs/meeting-page.c (meeting_page_fill_widgets):
- * gui/dialogs/alarm-page.c (button_options_clicked_cb): use the macros
- defined in cal-util.h for static capabilities.
-
-2003-04-11 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-model.c (start_addressbook_server): load the
- default book to look for additional free/busy info in
- (init): ugly hack to make sure we get destroyed, set idle id to 0
- (process_callbacks): unref the im because we are now done with it
- (refresh_busy_periods): set idle id to 0, ref the model and handle
- e_book_get_cursor error
-
-2003-04-11 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-time-sel-item.c
- (e_meeting_time_selector_item_destroy): guard against multiple
- destroy calls
-
-2003-04-11 JP Rosevear <jpr@ximian.com>
-
- * cal-client/cal-client.c (cal_client_get_free_busy): only print a
- message if the exception isn't the reasonable NotFound
-
-2003-04-11 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/schedule-page.c (schedule_page_finalize): unref the
- main widget since we ref it when we un-parent it
-
- * gui/dialogs/alarm-page.c (alarm_page_finalize): ditto
-
- * gui/dialogs/task-page.c (task_page_finalize): ditto
-
- * gui/dialogs/event-page.c (event_page_finalize): ditto
-
- * gui/dialogs/task-details-page.c (task_details_page_finalize):
- ditto
-
- * gui/dialogs/recurrence-page.c (recurrence_page_finalize): ditto
-
- * gui/dialogs/meeting-page.c (meeting_page_finalize): ditto
-
-2003-04-10 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_options_menu_position_callback):
- (e_meeting_time_selector_autopick_menu_position_callback): added the
- allocation's X and Y position to the calculated coordinates.
-
-2003-04-10 JP Rosevear <jpr@ximian.com>
-
- Fixes #41127
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_refresh_cb):
- unref here, when the callback is done
- (e_meeting_time_selector_refresh_free_busy): don't unref here
-
- * gui/e-meeting-model.c (process_free_busy): if the type is
- unexpected, make sure we cleanup properly
-
-2003-04-10 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-queue.c (remove_queued_alarm): only remove
- the alarm for backends that want it (Exchange).
-
-2003-04-10 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-util/cal-util.h: added #define's for static capabilities.
-
- * pcs/cal-backend-file.c (cal_backend_file_get_static_capabilities):
- use the #define's above.
-
-2003-04-09 Chris Toshok <toshok@ximian.com>
-
- Fixes #40133
-
- * pcs/cal-backend.c (cal_backend_class_init): use G_TYPE_INT
- instead of G_TYPE_ENUM as a parameter type for the signal to get
- rid of runtime warning.
-
-2003-04-09 JP Rosevear <jpr@ximian.com>
-
- Fixes #40915
-
- * gui/calendar-model.c (get_due_status): when getting the current
- time for date values, use a timezone aware function
-
-2003-04-09 JP Rosevear <jpr@ximian.com>
-
- Fixes #40952
-
- * pcs/cal-backend-file.c (cal_backend_file_open): check for file
- method instead of is_local
-
-2003-04-08 JP Rosevear <jpr@ximian.com>
-
- Fixes #40894
-
- * gui/gnome-cal.c
- (gnome_calendar_on_date_navigator_selection_changed): update the
- selection for all view types
-
-2003-04-08 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/dialogs/alarm-options.c: Remove button_ok, button_cancel,
- canceled members from struct Dialog.
- (get_widgets): Do not initialize.
- (close_dialog): Destroy the toplevel.
- (toplevel_delete_event_cb): Removed.
- (button_cancel_clicked_cb): Removed.
- (button_ok_clicked_cb): Removed.
- (close_dialog): Removed.
- (alarm_options_dialog_run): Use gtk_dialog_run.
- (init_widgets): Do not init ->canceled, do not connect OK/Cancel
- buttons.
- (alarm_to_dialog): No need to make the file entry modal from here
- anymore.
-
- * gui/dialogs/alarm-options.glade: Turned into a GtkDialog. Set
- the "modal" property to True for the file entry.
-
-2003-04-07 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes #35926.
-
- * gui/dialogs/event-page.glade: Remove contacts entry/chooser.
-
- * gui/dialogs/event-page.c: Remove contacts entry/chooser.
- (event_page_init): Remove references.
- (event_page_finalize): Ditto.
- (event_page_fill_widgets): Ditto.
- (event_page_fill_component): Ditto.
- (get_widgets): Ditto.
- (init_widgets): Ditto.
- (contacts_clicked_cb): Remove wholesale.
- (contacts_changed_cb): Ditto.
-
-2003-04-07 JP Rosevear <jpr@ximian.com>
-
- Fixes #40876
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_refresh_free_busy): guard against
- callbacks after destruction
- (e_meeting_time_selector_refresh_cb): ditto
-
-2003-04-07 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/event-page.glade: create buttons properly
-
- * gui/itip-utils.c (comp_server_send): for errors other than busy,
- we want to email the results
-
- * pcs/cal-backend.c (cal_backend_ref_categories): insert the new
- category in the category list as well
- (idle_notify_categories_changed): reset idle id
-
-2003-04-07 Not Zed <NotZed@Ximian.com>
-
- Fixes #40252
-
- * conduits/todo/todo-conduit.c: Same as below.
-
- * conduits/calendar/calendar-conduit.c: Change the LOG macro to a
- single arg macro which copies its arg. Fix all callers. Change
- WARN and INFO to simply g_warning/g_message. Init G_LOG_DOMAIN
- before including anything.
-
-2003-04-07 Dan Winship <danw@ximian.com>
-
- * gui/GNOME_Evolution_Calendar.server.in.in: Clean up server names
-
- * gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.server.in.in:
- Likewise
-
- * importers/GNOME_Evolution_Calendar_Importer.server.in.in:
- Likewise. Also mark the evolution:menu_name for i18n
-
-2003-04-07 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/e-meeting-attendee.[ch]: GObjectify. Eliminates ref/sink
- warnings from the meeting editor.
-
-2003-04-06 Hans Petter Jansson <hpj@ximian.com>
-
- Week view part of fix for #39895.
-
- * gui/e-week-view-main-item.c (e_week_view_main_item_draw_day):
- Use the UNFOCUSSED colour if we're not focused, rather than not
- drawing anything.
-
- * gui/e-week-view.c: Set up the UNFOCUSSED colour.
-
- * gui/e-week-view.h: Add the UNFOCUSSED colour.
-
-2003-04-04 JP Rosevear <jpr@ximian.com>
-
- Fixes #40790
-
- * gui/alarm-notify/alarm-queue.c (procedure_notification_dialog):
- return based on the response code (not old button stuff)
-
-2003-04-04 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/dialogs/alarm-options.c (alarm_to_dialog): Make the file
- entry modal. [#40792]
-
-2003-04-04 JP Rosevear <jpr@ximian.com>
-
- Fixes #40789
-
- * gui/dialogs/alarm-options.c (alarm_to_dalarm_widgets):
- description is a text buffer
- (alarm_to_malarm_widgets): ditto
- (dalarm_widgets_to_alarm): ditto
- (malarm_widgets_to_alarm): ditto
- (alarm_to_repeat_widgets): check repeat status correctly
-
-2003-04-04 Dan Winship <danw@ximian.com>
-
- * gui/e-itip-control.c (write_html): Don't free static string.
-
-2003-04-04 JP Rosevear <jpr@ximian.com>
-
- * gui/cal-search-bar.c (cal_search_bar_destroy): guard against
- multiple destroy calls
-
-2003-04-04 JP Rosevear <jpr@ximian.com>
-
- * cal-client/cal-client.c (get_default_uri): guard against empty
- uri as well
-
-2003-04-04 JP Rosevear <jpr@ximian.com>
-
- Fixes #40722
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_destroy):
- guard against multiple destroy calls
-
-2003-04-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/control-factory.c (set_prop): Add a check to see if the view
- should be the day-view and change the default to be whatever
- calendar_config_get_default_view() returns. Should fix bug #39735.
-
- * gui/calendar-config.h: calendar_config_write() and
- calendar_config_write_on_exit() no longer exist. Removed
- prototypes.
-
- * gui/control-factory.c (set_prop): g_strcasecmp() is
- deprecated. Since the values can never be anything other than all
- lowercase anyway, just use strcmp.
-
-2003-04-02 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #39262
-
- * importers/icalendar-importer.c (load_file_fn, vcal_load_file_fn):
- use folder_type argument to determine what to import.
-
-2003-04-02 Rodrigo Moya <rodrigo@ximian.com>
-
- * importers/icalendar-importer.c (load_file_fn, vcal_load_file_fn):
- added "folder_type" parameter to EvolutionImporterLoadFileFn.
-
-2003-04-02 JP Rosevear <jpr@ximian.com>
-
- Fixes #39955
-
- * gui/itip-utils.c (comp_sentby): don't unref the the account
-
-2003-04-02 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #40661
-
- * gui/itip-utils.c: added missing header for Forte compilation.
-
-2003-04-01 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/e-day-view-main-item.c (e_day_view_main_item_draw):
- Nuke GdkFont and use Pango's font measuring.
-
- * gui/e-day-view-time-itme.c (e_day_view_time_item_get_column_width)
- (e_day_view_time_item_draw): Ditto.
-
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw)
- (e_day_view_top_item_draw_long_event): Ditto.
-
- * gui/e-day-view.c (e_day_view_style_set)
- (e_day_view_recalc_cell_sizes)
- (e_day_view_reshape_long_event)
- (e_day_view_update_top_canvas_drag)
- (e_day_view_update_main_canvas_drag): Ditto.
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_style_set)
- (e_meeting_time_selector_recalc_date_form): Ditto.
-
- * gui/e-week-view-event-item.c (e_week_view_draw_time): Ditto.
-
- * gui/e-week-view-main-item.c (e_week_view_main_item_draw_day):
- Ditto.
-
- * gui/e-week-view-titles-item.c (e_week_view_titles_item_draw):
- Ditto.
-
- * gui/e-week-view.c (e_week_view_style_set)
- (e_week_view_recalc_cell_sizes)
- (e_week_view_reshape_event_span): Ditto.
-
- * gui/weekday-picker.c (weekday_picker_style_set): Ditto.
-
-2003-04-01 JP Rosevear <jpr@ximian.com>
-
- Fix for #17231 (Evo portion)
-
- * conduits/todo/todo-conduit.c (comp_from_remote_record): test for
- secret flag properly
-
- * conduits/calendar/calendar-conduit.c (comp_from_remote_record):
- ditto
-
-2003-04-01 Rodrigo Moya <rodrigo@ximian.com>
-
- * importers/icalendar-importer.c (load_file_fn, vcal_load_file_fn):
- added filename (tasks.ics/calendar.ics) to the URI if it does not
- contain it.
-
-2003-03-31 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #39961
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_options_menu_position_callback):
- (e_meeting_time_selector_autopick_menu_position_callback): use the
- button's allocation to position the popup menu.
-
-2003-03-29 Not Zed <NotZed@Ximian.com>
-
- Fixes #39895
-
- * gui/e-day-view.h (EDayViewColors): add an unfocussed colour to
- draw the selection in when we're not focussed.
-
- * gui/e-day-view.c (e_day_view_realize): Initialise
- E_DAY_VIEW_COLOR_BG_SELECTED_UNFOCUSSED to be 1/2 saturation of
- the focussed colour.
-
- * gui/e-day-view-main-item.c (e_day_view_main_item_draw): Use the
- UFOCUSSED colour if we aren't focussed, rather than just not
- drawing anything.
-
-2003-03-28 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (get_servers): the shell client is a
- g_object now, ref appropriately
-
-2003-03-28 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/e-day-view.c (comp_destroy_cb)
- (e_day_view_on_long_event_button_press)
- (e_day_view_on_event_button_press)
- (e_day_view_on_long_event_click)
- (e_day_view_on_event_click)
- (e_day_view_on_event_double_click)
- (e_day_view_on_delete_appointment): Hold weak references to the
- CalComponent instead of connecting to the "destroy" signal.
-
- * gui/e-week-view.c (comp_destroy_cb)
- (e_week_view_on_text_item_event): Ditto.
-
-2003-03-28 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes #39954
-
- * gui/dialogs/recurrence-page.c (make_recurrence_special):
- Destroy would-be children of the container before the container.
-
-2003-03-28 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/meeting-page.c (meeting_page_init): init new members
- (get_current_account): get a matching account for the currently
- selected user in the combo
- (meeting_page_finalize): unref the meeting attendee if there is
- one
- (meeting_page_fill_widgets): don't set the combo list here
- (clear_widgets): set the default organizer here and if we don't
- have an organizer, add the default organizer as an attendee
- (meeting_page_fill_component): use get_current_account
- (org_changed_cb): if this is a new meeting and the organizer
- changes, change the attendee
- (change_clicked_cb): no need to set the default here
- (init_widgets): reflect changed callback name
- (meeting_page_construct): set the combo strings here
- (popup_delete_cb): remove the organizer attendee if the user
- explicitly deletes it
-
- * gui/e-meeting-model.c (attendee_changed_cb): set row properly
-
- * gui/itip-utils.c (comp_to_list): skip the user themselves if
- cancelling or requesting
-
-2003-03-26 Rodrigo Moya <rodrigo@ximian.com>
-
- * importers/icalendar-importer.c (gnome_calendar_import_data_fn): use
- g_object_unref for CalClient's.
- (create_checkboxes_control): use g_signal_connect.
-
- * cal-client/cal-client.c (cal_client_get_load_state): return correct
- values in g_return_val_if_fail.
-
-2003-03-26 Jack Jia <jack.jia@sun.com>
-
- * calendar/gui/dialogs/alarm-options.c
- (malarm_widgets_to_alarm): add a parameter(TC_CORBA_string) to
- the bonobo_widget_get_property.
-
-2003-03-25 Dan Winship <danw@ximian.com>
-
- * gui/itip-utils.c: Update for e_notice move
-
- * gui/tasks-control.c (confirm_expunge): Move the code that used
- to be e_gnome_dialog_set_parent here, since it was marked
- deprecated and this was the only place using it.
-
- * gui/dialogs/comp-editor.c: Update for e_notice move
- (page_changed_cb, page_summary_changed_cb, page_dates_changed_cb):
- Pass a parent_window to e_notice.
-
- * gui/dialogs/meeting-page.c: Update for e_notice move.
- (meeting_page_fill_component, meeting_page_fill_component,
- popup_delegate_cb): Pass a parent_window to e_notice
-
-2003-03-25 Dan Winship <danw@ximian.com>
-
- * cal-util/cal-util.c (cal_util_parse_ics_file): Utility wrapper
- around icalparser.
-
- * cal-util/test-recur.c (main): Use it
-
- * pcs/cal-backend-file.c (open_cal): Likewise
-
- * gui/comp-editor-factory.c (open_client): Add the OpenClient to
- the hash before calling cal_client_open_calendar, since in some
- failure cases, that will call cal_opened_cb (which will free the
- oc) with a failure immediately, causing a crash if we then try to
- deref it.
-
-2003-03-21 JP Rosevear <jpr@ximian.com>
-
- Fixes #32248
-
- * conduits/todo/todo-conduit.c (comp_from_remote_record): make
- sure the due date is actually a date
-
-2003-03-21 JP Rosevear <jpr@ximian.com>
-
- Fixes #31660
-
- * conduits/calendar/calendar-conduit.c (rrules_mostly_equal):
- check if the rrules are equal other than until/count
- (find_last_cb): update the data with the start timet
- (local_record_from_comp): handle the case where the recurrence
- rule ends after a certain number occurrences
- (comp_from_remote_record): same
-
-2003-03-20 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c
- (e_calendar_context_destroy): calcomponents are gobjects now
- (calconduit_load_configuration): ref and sink to avoid warnings
-
- * conduits/todo/todo-conduit.c (todoconduit_load_configuration):
- ref and sink to avoid warnings
- (e_todo_context_destroy): calcomponents are gobjects now
-
-2003-03-20 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/cancel-comp.c (cancel_component_dialog): use a
- GtkMessageDialog and deal correctly with the dialog's reponses.
-
-2003-03-20 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #39770
-
- * gui/itip-utils.c (itip_Send_comp): check the CORBA exception instead
- of the g_return_val_if_fail. Also, use a CORBA_Object for the value
- returned from bonobo_activation_activate_from_id.
-
-2003-03-20 Rodrigo Moya <rodrigo@ximian.com>
-
- * importers/ical-importer.c: removed activation of shell_client.
- (importer_destroy_cb): no need to unref shell_client.
- (connect_to_shell): removed.
- (ical_importer_new, vcal_importer_new): don't call connect_to_shell.
-
-2003-03-20 Rodrigo Moya <rodrigo@ximian.com>
-
- * importers/ical-importer.c (get_uri_from_folder_path): removed.
- (load_file_fn, vcal_load_file_fn): use physical_uri instead of
- folderpath.
-
-2003-03-19 Ettore Perazzoli <ettore@ximian.com>
-
- * importers/GNOME_Evolution_Calendar_Importer.server.in.in:
- Replace "evolution:menu-name" prop with "evolution:menu_name".
- [#39692]
-
-2003-03-18 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/send-comp.c (send_component_dialog): use GtkMessageDialog
- instead of gnome_question_dialog, and deal correctly with the dialog's
- response.
-
-2003-03-18 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #34505
-
- * gui/alarm-notify/alarm-queue.c (remove_queued_alarm): added removal
- of the alarm itself in the calendar if the (new) argument says so.
- Also, set expecting_update flag to TRUE.
- (add_component_alarms): initialize expecting_update to FALSE.
- (remove_alarms): don't remove the component if expecting_update is
- TRUE.
- (obj_updated_cb, notify_dialog_cb, procedure_notification): adapted
- to changes in remove_queued_alarm.
-
-2003-03-17 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes #34095
-
- * gui/e-meeting-model.c (append_row): Don't leak meeting attendees;
- unref the attendee after it's assigned to model.
-
- * gui/dialogs/meeting-page.c (meeting_page_destroy): Free the actual
- array of deleted attendees.
-
- * gui/dialogs/event-editor.c (event_editor_destroy): Free the private
- structure.
-
- * gui/itip-utils.c (comp_description): Rework free/busy information
- composer so we can free date/time information after use. Then free it.
- (itip_send_comp): Free the allocated CORBA buffer for attachment data.
-
- * gui/dialogs/comp-editor-util.c (comp_editor_contacts_to_component):
- Free the destination contacts string once we're done with it.
-
- * gui/e-calendar-table.c (invisible_destroyed): Unref the invisible.
-
- * gui/e-day-view.c (invisible_destroyed): Ditto.
-
- * gui/e-week-view.c (invisible_destroyed): Ditto.
-
-2003-03-17 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes #39757
-
- * gui/dialogs/alarm-page.c (sensitize_buttons): Somehow this code
- reverted to thinking it was dealing with a GtkCList, when in reality
- it's a GtkTreeView. Fix that, so the buttons are sensitized correctly.
-
-2003-03-17 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes #39736
-
- * gui/e-day-view.c: Reduce the size of the large-digits font so it's
- en par with the one in 1.2.
-
-2003-03-14 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #39740
-
- * gui/e-meeting-model.c (is_cell_editable): check row number is valid
- before using it as index for the GPtrArray.
-
-2003-03-14 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #39356
-
- * gui/Makefile.am:
- * gui/tasks-migrate.[ch]: removed tasks migration obsolete stuff.
-
- * gui/calendar-component.c (owner_set_cb): don't call tasks_migrate.
-
-2003-03-14 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-factory.c (impl_CalFactory_uriList): set_release
- on the sequence we create.
-
- * cal-client/cal-client.c (cal_client_uri_list): don't leak the
- string sequence returned by CalFactory_uriList.
-
-2003-03-13 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/query-backend.c (query_backend_new): use a weak ref instead
- of connecting to backend's "destroy" signal.
- (backend_destroyed_cb, query_destroyed_cb): changed to be weak
- reference callbacks.
-
-2003-03-12 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/save-comp.c (save_component_dialog): don't use
- GNOME_STOCK_* defines, but GTK_STOCK_*.
-
-2003-03-12 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/save-comp.[ch] (save_component_dialog): corrected
- button ordering and changed the return type to be a GtkResponseType.
-
- * gui/dialogs/comp-editor.c (prompt_to_save_changes): adapted to
- changes in save_component_dialog.
-
-2003-03-11 Dan Winship <danw@ximian.com>
-
- * gui/calendar-config.c (on_timezone_set): Update for timezone
- dialog API changes.
-
- * gui/e-timezone-entry.c: Likewise
-
-2003-03-11 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_open): issue more descriptive
- warnings.
-
-2003-03-09 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-notify.c (alarm_notify_add_calendar): if we
- already have the client loaded, don't remove it, just increment its
- reference count.
-
- * gui/alarm-notify/alarm-queue.c (remove_queued_alarm): added new
- argument to specify whether we want the component's structure removed
- if no more alarms exist, and only free the structure if TRUE.
- (remove_alarms): added same new argument and pass it over to
- remove_queued_alarm.
- (remove_comp, obj_updated_cb): passed new argument to remove_alarms.
- (procedure_notification): passed new argument to remove_queued_alarm.
- (obj_removed_cb): set all freed pointers to NULL.
- (notify_dialog_cb): only remove the alarm if the pointers are not NULL.
-
-2003-03-07 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/save.c (get_calendars_to_load): create the array
- to be returned only once.
-
-2003-03-06 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-queue.c (display_notification): ref the CalClient.
- (notify_dialog_cb): unref the CalClient.
-
-2003-03-06 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-notify-dialog.[ch]
- (alarm_notify_dialog_disable_buttons): new function.
- (alarm_notify_dialog): made it return a pointer to the dialog structure.
-
- * gui/alarm-notify/alarm-queue.c (remove_alarms, remove_comp): splitted
- alarm removal out of remove_comp.
- (obj_updated_cb): remove the component only when needed. In normal
- updates, just update the internal structure.
- (edit_component): don't get a CompQueuedAlarms as argument, since it
- might be removed.
- (on_dialog_obj_updated_cb, on_dialog_obj_removed_cb): callbacks for
- modifications during dialog display.
- (notify_dialog_cb): disconnect from "obj_*ed" signals and call
- edit_component with the new set of arguments.
- (display_notification): added more data to the closure structure.
-
-2003-03-05 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #31382
-
- * gui/e-meeting-model.c (async_read): don't assume the buffer is
- always full, but use GNOME_VFS_ERROR_EOF instead for knowing when
- the read has finished.
-
-2003-03-05 JP Rosevear <jpr@ximian.com>
-
- * gui/apps_evolution_calendar.schemas: fix defaults and
- descriptions to match what calendar-config wants them to be
-
-2003-03-05 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (show_current): g_objectify ref/unref
-
- * gui/itip-bonobo-control.c (set_data_idle_cb): as above
- (pstream_load): ditto
-
- * gui/dialogs/alarm-options.c (alarm_to_malarm_widgets): as above
-
-2003-03-05 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (class_init): override finalize, not
- destroy
- (start_calendar_server): take itip as a param and gtk_main_quit if
- it gets destroyed while we are waiting for the cal client to load
- (start_default_server): ditto
- (get_servers): take itip as a param and don't load if we've been
- destroyed, check for an except when retrieving the folder list
- (init): ref the html control
- (destroy): mark ourselves as destroyed
- (finalize): clean up, unref html control
- (write_html): if the html widget has been destroyed, don't write
- anything out
- (show_current_todo): pass extra param
- (show_current): ref/unref the itip control to avoid finalization while
- we are working, pass extra param
- (button_selected_cb): pass extra param
- (object_requested_cb): ditto
-
-2003-03-05 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-offline-handler.c (backend_go_offline,
- backend_go_online): cast CalClient's to GObject, not GtkObject.
-
-2003-03-04 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/meeting-page.c (meeting_page_fill_widgets): don't
- let the user change to an email organizer if the back end is not
- an email addres
-
-2003-03-04 JP Rosevear <jpr@ximian.com>
-
- Fixes #37881
-
- * gui/e-meeting-model.c (process_section): if the attendee is the
- empty string, try to get the email
-
-2003-03-04 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-offline-handler.c (backend_cal_opened_online): set
- the backend to REMOTE mode when it opens
- (backend_go_online): prepare to set calendar mode to REMOTE
- (impl_goOnline): get all the local calendars and set to REMOTE
-
-2003-03-04 JP Rosevear <jpr@ximian.com>
-
- Fixes #37881
-
- * gui/e-meeting-model.c (process_section): if the attendee is the
- empty string, try to get the email
-
-2003-03-04 JP Rosevear <jpr@ximian.com>
-
- Fixes #37883
-
- * idl/evolution-calendar.idl: getLdapAttribute can raise NotFound
-
-2003-03-04 JP Rosevear <jpr@ximian.com>
-
- Fixes #37806, #37697
-
- * gui/e-itip-control.c (e_itip_control_set_data): if the text is
- null or the empty string, just clear the widget
- (init): set the html widget to initially be blank
-
-2003-03-04 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal.c (impl_Cal_get_ldap_attribute): implement
-
- * pcs/cal-backend.h: add virtual method
-
- * pcs/cal-backend.c (cal_backend_get_ldap_attribute): call
- get_ldap_attribute_method
-
- * pcs/cal-backend-file.c (cal_backend_file_class_init): overrid
- get_ldap_attribute method
-
- * idl/evolution-calendar.idl: add getLdapAttribute method
-
- * gui/e-meeting-model.c (process_section): take simple card list
- as arg and try to use the ldap attribute (if any) as the attendee,
- else use the email address
- (select_names_ok_cb): get the simple card list
-
- * cal-client/cal-client.h: add proto
-
- * cal-client/cal-client.c (cal_client_init): init ldap_attribute
- to NULL
- (cal_client_destroy): free ldap_attribute
- (cal_client_get_ldap_attribute): accessor
-
-2003-03-04 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (itip_organizer_is_user): call
- cal_client_get_cal_address instead of cal_client_get_email_address
-
- * gui/dialogs/meeting-page.c (meeting_page_construct): ditto
-
- * pcs/cal.c (impl_Cal_get_cal_address): implement updated method
- name
- (cal_class_init): set method implementation
-
- * pcs/cal-backend.c (cal_backend_class_init): init get_cal_address
- virtual function
- (cal_backend_get_cal_address): call proper function
-
- * pcs/cal-backend.h: update proto, rename get_email_address
- virtual function to get_cal_address virtual function
-
- * pcs/cal-backend-file.c (cal_backend_file_class_init): match
- get_cal_address call
- (cal_backend_file_get_cal_address): rename from
- cal_backend_file_get_email_address
-
- * cal-client/cal-client.c: rename email_address private member to
- cal_address
- (cal_client_init): init cal_address
- (cal_client_destroy): free cal_address and properly free
- alarm_email_address
- (cal_client_get_cal_address): rename from
- cal_client_get_email_address and call proper corba function
-
-2003-03-04 JP Rosevear <jpr@ximian.com>
-
- * idl/evolution-calendar.idl: fix comment
-
-2003-03-04 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-model.c (calendar_model_append_row): update FIXME
- note
-
-2003-03-04 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/recur-comp.h: fix copyright
-
- * gui/dialogs/recur-comp.c: fix copyright
- (recur_component_dialog): say "recurring journal entry" instead of
- just "recurring journal"
-
-2003-03-04 JP Rosevear <jpr@ximian.com>
-
- Partially Fixes #23606 (from Jack Jia <jack.jia@sun.com>)
-
- * gui/dialogs/schedule-page.c (update_time): handle no end date if
- the start is date only
-
- * gui/dialogs/event-page.c (update_time): ditto
-
-2003-03-04 JP Rosevear <jpr@ximian.com>
-
- Merging in 1.2 stuff
-
- Fixes #35598
-
- * gui/dialogs/task-details-page.c
- (task_details_page_fill_widgets): count a status of needs action
- as a status of none (not started)
- (date_changed_cb): set the option menu to a status of none
- (status_changed): no need to handle needs action status now
-
- * gui/dialogs/task-details-page.glade: remove needs-action menu
- item
-
- Fixes #36763
-
- * gui/dialogs/alarm-page.c (add_clicked_cb): if no address was set
- for an email alarm, set the default
- (button_options_clicked_cb): pass the default email address
-
- * gui/dialogs/alarm-options.h (alarm_options_dialog_run): update proto
-
- * gui/dialogs/alarm-options.c (alarm_to_malarm_widgets): if there
- are no email attendees, default to the passed in value
- (alarm_options_dialog_run): take and track an email param
-
- * pcs/cal.c (impl_Cal_get_alarm_email_address): implement by
- calling backend method
- (cal_class_init): set alarm email address method implementation
-
- * pcs/cal-backend.h: add new virtual proto
-
- * pcs/cal-backend.c (cal_backend_class_init): set alarm email
- address virtual method to NULL
- (cal_backend_get_alarm_email_address): call backend method
-
- * pcs/cal-backend-file.c (cal_backend_file_class_init): set alarm
- email address method
- (cal_backend_file_get_alarm_email_address): implement by returning
- NULL
-
- * idl/evolution-calendar.idl: add getAlarmEmailAddress method
-
- Fixes #37102
-
- * gui/dialogs/task-editor.c (set_menu_sens): don't allow task
- assignment if the backend says not to
-
- * gui/dialogs/recurrence-page.c (fill_component): kill warning
- (preview_recur): display the recurrences in the dtstart timezone
- if possible
-
- * gui/gnome-cal.c (dn_query_obj_updated_cb): pass NULL to use
- default tag zone
-
- * gui/tag-calendar.c (tag_calendar_by_comp): allow display zone
- for the tagged calendar to be passed in
- (prepare_tag): use the passed in timezone for display if non-null
-
- * gui/tag-calendar.h (tag_calendar_by_comp): update proto
-
- * gui/dialogs/recurrence-page.c (recurrence_page_set_dates): make
- sure we always update the preview
-
- * conduits/todo/todo-conduit.c (add_record): make sure to create a
- unique uid for the record
-
- * conduits/calendar/calendar-conduit.c (add_record): ditto
-
- * conduits/todo/todo-conduit.c (e_todo_context_new): init default
- comp and timezone to NULL
- (e_todo_context_destroy): unref default comp
- (pre_sync): et the default comp via the client and set the default
- timezone
- (add_record): pass the default comp as the base comp
-
- * conduits/calendar/calendar-conduit.c (e_calendar_context_new):
- init default comp to NULL
- (e_calendar_context_destroy): unref default comp
- (pre_sync): get the default comp via the client
- (add_record): pass the default comp as the base comp
-
- * conduits/calendar/calendar-conduit.c (local_record_from_comp):
- only add the recurrence rule if its not an instance
-
- * gui/itip-control-factory.c (set_data_idle_cb): idle call back to
- set control data
- (pstream_load): set the data in an idle callback to avoid deadlock
- (get_prop): handle view_only
- (set_prop): ditto
- (itip_control_factory): add view_only
-
- * gui/e-itip-control.h: add protos
-
- * gui/e-itip-control.c (write_html): only write out the options if
- we aren't in view_only mode
- (e_itip_control_set_view_only): accessor
- (e_itip_control_get_view_only): ditto
-
- Fixes #36909
-
- * gui/dialogs/alarm-page.c (button_options_clicked_cb): indicate
- whether the options dialog should allow repeating
-
- * gui/dialogs/alarm-options.h: update proto
-
- * gui/dialogs/alarm-options.c (alarm_to_repeat_widgets): if
- repeating is not allowed, sensitize the widgets appropriately
- (alarm_options_dialog_run): store the repeat param
-
- * gui/calendar-model.c (calendar_model_append_row): guard against
- saving before the calendar is open
-
- * gui/e-day-view.c (e_day_view_key_press): ditto
-
- * gui/dialogs/comp-editor.c (page_changed_cb): change warning
- dialog to not mention email
- (page_summary_changed_cb): ditto
- (page_dates_changed_cb): ditto
-
- * gui/itip-utils.c (itip_organizer_is_user): make the compare case
- insensitive
-
- * gui/dialogs/meeting-page.c (meeting_page_fill_widgets): don't
- allow the organizer to be changed if its not an email address
-
- * gui/e-day-view.c, calendar-model.c, e-week-view.c,
- task-editor.c, event-editor.c, comp-editor.c, meeting-page.c: pass
- additional param
-
- * gui/itip-utils.c (itip_organizer_is_user): take client as param,
- and if organizer-not-email-address and email address and organizer
- match, assume the user is the organizer
-
- * gui/itip-utils.h: update proto
-
- * pcs/cal.c (build_fb_seq): set the max
-
- * gui/e-meeting-model.c
- (e_meeting_model_add_attendee_with_defaults): correct typo and set
- rsvp appropriately
-
- * gui/dialogs/send-comp.c (send_component_dialog): if save
- schedules, return FALSE for now
-
- * gui/dialogs/recurrence-page.c (sensitize_recur_widgets):
- de-sensitize the preview widget if we are viewing an instance
- (preview_recur): return if the comp is an instance
-
- * gui/dialogs/event-page.glade: name the show time frame
-
- * gui/dialogs/event-page.c (event_page_fill_widgets)
- (event_page_init): init show time frame
- (event_page_fill_widgets): hide/show frame as needed
- (get_widgets): get the frame
-
- * gui/alarm-notify/alarm-queue.c (mail_notification): kill mail
- notification code
-
- * cal-client/cal-client.c (load_static_capabilities): grab static
- capabilities string
- (check_capability): see if a capability is in the string
- (cal_client_get_one_alarm_only): accessor
- (cal_client_get_organizer_must_attend): use check_capability
- (cal_client_get_static_capability): ditto
-
- * cal-client/cal-client.h: new, changed protos
-
- * idl/evolution-calendar.idl: change over getSchedulingInformation
- to a more general getStaticCapabilities call
-
- * pcs/cal-backend-file.c
- (cal_backend_file_get_static_capabilities): return
- "no-email-alarms"
-
- * pcs/cal-backend.c (cal_backend_get_static_capabilities): ditto
-
- * pcs/cal-backend.h: ditto
-
- * pcs/cal.c (impl_Cal_get_static_capabilities): ditto
-
- * gui/alarm-notify/alarm-queue.c (get_default_address): utility
- routine to snag address info
-
- * gui/alarm-notify/Makefile.am: build composer idl
-
- * *.c: pass client param for send an cancel params
-
- * gui/dialogs/send-comp.c (send_component_dialog): take client as
- a parm and if save schedules return true right away
-
- * gui/dialogs/send-comp.h: update proto
-
- * gui/dialogs/cancel-comp.c (cancel_component_dialog): take client
- as a param and if we are deleting and schedule saves, return true
- right away
-
- * gui/dialogs/cancel-comp.h (cancel_component_dialog): update proto
-
- * gui/dialogs/alarm-options.glade: add Send To: button
-
- * gui/dialogs/alarm-options.c (addressbook_clicked_cb): display
- dialog
- (setup_select_names): attach above to Send To: button clicked
- signal
-
- * gui/dialogs/alarm-options.c (get_widgets): get mail alarm
- widgets
- (setup_select_names): add the select names widget
- (alarm_to_malarm_widgets): show the attendees and description
- (alarm_to_dialog): set the title for mail alarms properly
- (malarm_widgets_to_alarm): save attendees and descriptions in
- alarm
- (alarm_options_dialog_run): call setup_select_names
-
- * gui/dialogs/alarm-page.c: add email to alarm types
-
- * gui/dialogs/alarm-options.glade: add mail alarm widgets
-
- * gui/dialogs/alarm-page.glade: add email to alarm types
-
- * cal-util/cal-component.c (scan_attendee): kill unnecessary
- CalComponent param
- (scan_property): don't pass same
- (set_attendee_list): take an icalcomp instead of a CalComponent
- (cal_component_set_attendee_list): pass same
- (scan_alarm_property): if its an attendee, scan it
- (make_alarm): set attendee_list member to null
- (cal_component_alarm_new): ditto
- (cal_component_alarm_free): free attendee list
- (cal_component_alarm_get_attendee_list): return attendee list
- (cal_component_alarm_set_attendee_list): set attendee list
- (cal_component_alarm_has_attendees): return true if alarm has attendees
-
- * cal-util/cal-component.h: new protos
-
- * gui/calendar-model.c (calendar_model_append_row): use
- cal_comp_task_new_with_defaults
-
- * gui/comp-editor-factory.c (get_default_task): ditto
-
- * gui/e-tasks.c (e_tasks_new_task): ditto
-
- * gui/gnome-cal.c (gnome_calendar_new_task): ditto
-
- * gui/comp-util.h (cal_comp_task_new_with_defaults): new proto
-
- * gui/comp-util.c (cal_comp_task_new_with_defaults): new utility
- routine
-
- * cal-util/cal-util.c (generate_absolute_triggers): skip omitted
- alarm types
- (add_alarm_occurrences_cb): ditto
- (cal_util_generate_alarms_for_list): take/pass omit param
- (cal_util_generate_alarms_for_comp): ditto
-
- * cal-util/cal-util.h: update protos
-
- * pcs/cal-backend-file.c (cal_backend_file_get_alarms_for_object):
- add omit param
- (cal_backend_file_get_alarms_in_range): ditto
-
- * pcs/cal-backend.c (cal_backend_get_scheduling_information):
- remove dead param
-
- * gui/dialogs/meeting-page.h: delete proto
-
- * gui/dialogs/meeting-page.c: remove dead routine
-
- * gui/dialogs/event-editor.c (event_editor_edit_comp): we don't
- need to add the organizer as an attendee ourselves, just set the
- edit level properly
-
- * gui/dialogs/task-editor.c (task_editor_edit_comp): ditto
-
- * gui/comp-util.c (cal_comp_event_new_with_defaults): take client
- as arg so we can obtain the default from the backend
-
- * gui/comp-editor-factory.c (get_default_event): pass
- cal_comp_event_new_with_defaults the new param
-
- * gui/gnome-cal.c (gnome_calendar_new_appointment_for): ditto
-
- * gui/e-week-view.c (e_week_view_key_press): ditto
-
- * gui/e-day-view.c (e_day_view_key_press): ditto
-
- * gui/calendar-model.c (calendar_model_append_row): ditto
-
- * gui/comp-util.h (cal_comp_event_new_with_defaults): update proto
-
- * pcs/cal-backend-file.c (cal_backend_file_get_default_object):
- return appropriate default object
-
- * pcs/cal-backend.c (cal_backend_get_default_object): call
- get_default_backend class method
-
- * pcs/cal-backend.h: add proto
-
- * pcs/cal.c (impl_Cal_get_default_object): implement
- (cal_class_init): set handler for getDefaultObject call
-
- * idl/evolution-calendar.idl: remove always schedule from
- SchedulingInformation and add getDefaultObject call
-
- * cal-client/cal-client.c (cal_client_get_default_object): gets a
- default object from the server
- (cal_client_init): remove always_schedule
- (load_scheduling_info): ditto
-
- * cal-client/cal-client.h: add a proto, delete a proto
-
- * gui/dialogs/meeting-page.c (right_click_cb): if the attendee is
- not fully editable, don't allow deletion
- (meeting_page_construct): keep the default organizer as an itip
- address
- (meeting_page_get_default_organizer): return the default organizer
-
- * gui/dialogs/meeting-page.h: new proto
-
- * gui/dialogs/event-editor.c (event_editor_edit_comp): we set
- appropriate edit levels now for users and if the backend always
- schedules we always show the meeting pages and add the organizer
- as an attendee
-
- * gui/dialogs/task-editor.c (task_editor_edit_comp): same
-
- * gui/e-meeting-model.c (is_cell_editable): use the edit level of
- the attendee to determine if cell is editable
- (init): we no longer keep the attendee list of restricted
-
- * gui/e-meeting-attendee.c (e_meeting_attendee_get_edit_level): accessor
- (e_meeting_attendee_set_edit_level): ditto
-
- * gui/e-meeting-attendee.h: new protos and edit level enum
-
- * cal-client/cal-client.c (load_scheduling_info): load the
- scheduling info
- (cal_client_get_always_schedule): accessor
- (cal_client_get_organizer_must_attend): ditto
- (cal_client_get_save_schedules): ditto
- (cal_client_init): init scheduling data members
-
- * cal-client/cal-client.h: accessors for scheduling information
-
- * pcs/cal-backend-file.c
- (cal_backend_file_get_scheduling_information): implement the new
- virtual method
-
- * pcs/cal-backend.c (cal_backend_get_scheduling_information): call
- the class specific method
-
- * pcs/cal-backend.h: add virtual method
-
- * idl/evolution-calendar.idl: add a getSchedulingInformation call
- which describes how the backend does its scheduling
-
- * pcs/cal.c (impl_Cal_get_scheduling_information): implement above
-
- * gui/e-day-view.c: pass NULL as parent to recur dialog
-
- * gui/e-week-view.c: ditto
-
- * gui/dialogs/comp-editor.c (prompt_to_save_changes): show recur
- dialog after prompting, not before
- (save_cmd): ditto
- (save_close_cmd): ditto
- (real_edit_comp): don't show recur dialog before opening
-
- * gui/dialogs/recur-comp.h (recur_component_dialog): update proto
-
- * gui/dialogs/recur-comp.c (recur_component_dialog): take a parent
- argument and set the dialog parent if non-null
-
- * gui/e-week-view.c (e_day_view_on_editing_stopped): Don't update
- appointment if both the old and the new summary texts are empty.
-
- * gui/e-week-view.c (e_week_view_show_popup_menu): mask out "make
- moveable" if its an instance
-
- * gui/e-day-view.c (e_day_view_on_event_right_click): ditto
-
- * gui/e-week-view.c (e_week_view_on_editing_stopped): if its
- an instance, show the recur comp dialog and modify it based on the
- response (or not if cancel is hit)
-
- * gui/e-day-view.c (e_day_view_finish_long_event_resize): if its
- an instance, show the recur comp dialog and modify it based on the
- response (or not if cancel is hit)
- (e_day_view_finish_resize): ditto
- (e_day_view_on_editing_stopped): ditto
- (e_day_view_on_top_canvas_drag_data_received): ditto
- (e_day_view_on_main_canvas_drag_data_received): ditto
-
- * gui/dialogs/comp-editor.c (real_edit_comp): reflect changes in
- proto of recur_component_dialog
-
- * gui/dialogs/recur-comp.c (recur_component_dialog): use ok/cancel
- instead and radio buttons for the mod type
-
- * gui/dialogs/recur-comp.h: update proto
-
- * gui/e-day-view.c (e_day_view_on_long_event_click): allow
- dragging if its an instance
- (e_day_view_on_event_click): ditto
- (e_day_view_on_top_canvas_motion): ditto
- (e_day_view_on_main_canvas_motion): ditto
-
- * gui/dialogs/comp-editor.c (save_comp): if its an instance,
- update with the mod type
- (real_edit_comp): ask the user what instances they want to change
-
- * gui/dialogs/recur-comp.[hc]: new dialog to ask user what
- recurrences to modify
-
- * gui/dialogs/Makefile.am: Compile new files
-
- * gui/e-day-view.c (e_day_view_on_delete_occurrence): if its an
- instance, just remove with THIS mod
-
- * gui/e-week-view.c (e_week_view_on_delete_occurrence): ditto
-
- * cal-client/cal-client.c (cal_client_remove_object_with_mod):
- send the mod parameter to the backend
- (cal_client_remove_object): implement with above
- (cal_client_update_object_with_mod): send the mod parameter to the
- backend
- (cal_client_update_object): implement with above
-
- * cal-client/cal-client.h: new protos
-
- * cal-client/cal-client.c (cal_client_is_read_only): return
- booleans in the pre conditions
- (cal_client_update_object): pass mod param
- (cal_client_update_objects): ditto
- (cal_client_remove_object): ditto
- (cal_client_ensure_timezone_on_server): ditto
-
- * pcs/cal.c (impl_Cal_update_objects): take mod param
- (impl_Cal_remove_object): ditto
-
- * pcs/cal-backend.h: fix protos
-
- * pcs/cal-backend.c (cal_backend_update_objects): take mod param
- (cal_backend_remove_object): ditto
-
- * pcs/cal-backend-file.c (cal_backend_file_update_objects): take
- mod param
- (cal_backend_file_remove_object): ditto
-
- * cal-util/cal-util.h: add mod enum
-
- * cal-util/cal-recur.c (cal_recur_generate_instances_of_rule): if
- its an instance, just report the instance
-
- * cal-util/cal-component.h: new protos
-
- * cal-util/cal-component.c (cal_component_is_instance): indicate
- whether the component is an instance or not
- (cal_component_free_range): free a range
-
- * idl/evolution-calendar.idl: get remove and update to take mod
- type
-
-2003-03-03 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/dialogs/alarm-page.c
- * gui/dialogs/event-page.c
- * gui/dialogs/meeting-page.c
- * gui/dialogs/recurrence-page.c
- * gui/dialogs/schedule-page.c
- * gui/dialogs/task-details-page.c
- * gui/dialogs/task-page.c (get_widgets): gtk_widget_unparent() ->
- gtk_container_remove(). The former caused crashes in the
- addressbook's name-selector.
-
-2003-03-01 Hans Petter Jansson <hpj@ximian.com>
-
- * Makefile.am: Do importers after the other dirs, as it relies on
- generated files from there. This is still not optimal... Should
- probably introduce dependencies.
-
-2003-02-28 Hans Petter Jansson <hpj@ximian.com>
-
- * importers/Makefile.am: Shlibify.
-
- * importers/GNOME_Evolution_Calendar_Importer.server.in.in:
- Shlibify.
-
- * importers/icalendar-importer.c: Add necessary includes.
- (importer_destroy_cb): This is now a GWeakNotify func. gtk_ -> g_.
- (ical_importer_new)
- (vcal_importer_new)
- (gnome_calendar_importer_destroy_cb): Destroy signal -> weak ref.
-
- * importers/main.c: Add necessary includes. Shlibify.
-
-2003-02-28 Dan Winship <danw@ximian.com>
-
- * gui/dialogs/Makefile.am: build libcal-dialogs as an uninstalled
- shared library
- ($(IDL_GENERATED_H), etc): Only generate
- Evolution-Addressbook-SelectNames.h, not the corresponding .c
- files, or we'll get duplicate symbol errors trying to link this
- into libevolution_calendar.la
-
- * gui/Makefile.am (libevolution_calendar_la_LIBADD): Update for
- that (and eliminate libtool portability warnings)
-
-2003-02-28 Hans Petter Jansson <hpj@ximian.com>
-
- * Makefile.am (SUBDIRS): Add importers/.
-
- * importers/Makefile.am (server_in_files)
- (server_DATA): Insert $(libexecdir).
-
- * importers/icalendar-importer.c (connect_to_shell):
- oaf_activate_from_id() -> bonobo_activation_activate_from_id().
- (load_vcalendar_file): U_() -> _().
-
- * importers/GNOME_Evolution_Calendar_Importer.server.in:
- Renamed to corresponding .in.in.
-
-2003-02-28 Dan Winship <danw@ximian.com>
-
- * gui/Makefile.am (libevolution_calendar_la_LIBADD): Remove
- libalarm.a, which was not being used by the calendar.
-
- * gui/main.c: Remove unneeded alarm.h include.
-
- * gui/alarm-notify/Makefile.am (noinst_LIBRARIES): Stop building
- libalarm.a
- (evolution_alarm_notify_SOURCES): Add alarm.c, alarm.h
- (evolution_alarm_notify_LDADD): Remove libalarm.a
-
-2003-02-27 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/Makefile.am: link to versist libtool object
-
- * conduits/calendar/Makefile.am: ditto
-
-2003-02-26 Hans Petter Jansson <hpj@ximian.com>
-
- This makes alarm notification work.
-
- * gui/alarm-notify/notify-main.c (main): Initialize GTK. Don't
- initialize bonobo activation - bonobo_init() does that for us.
-
-2003-02-26 Hans Petter Jansson <hpj@ximian.com>
-
- This makes creating appointments and tasks from the "New" button work.
-
- * gui/main.c (comp_editor_factory_fn): Doesn't need to take any args.
- (factory): Add a handler for CompEditorFactory.
-
-2003-02-26 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes Ximian #37895.
-
- * gui/e-day-view.c (e_day_view_destroy): g_object_unref () ->
- pango_font_description_free ().
- (e_day_view_style_set): Ditto.
-
- * gui/e-week-view.c (e_week_view_destroy): Ditto.
-
-2003-02-26 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes Ximian #38306.
-
- * gui/e-itip-control.c (clean_up): Do nothing if the private structure
- has been freed. Don't call non-g_free() freers with NULL pointers.
- (destroy): Do nothing if the private structure has been freed. Clear
- pointers to freed blocks.
-
-2003-02-25 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/print.c (print_calendar): Use fixed margins of 5% of page
- width/height. This is the same cheat as gtkhtml employs to get
- around the fact that GNOME_PRINT_KEY_PAGE_MARGIN_* don't return
- useful values (I think). It sort of sucks, but is better than
- no margins at all.
- (print_comp): Ditto.
-
-2003-02-25 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/calendar-config.c (calendar_config_get_default_view): Get
- default view from correct key.
-
-2003-02-25 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.c (get_widgets): Show start/end-of-day
- widgets.
-
-2003-02-23 Hans Petter Jansson <hpj@ximian.com>
-
- * cal-client/cal-client.c (cal_client_is_read_only): Don't warn
- if calendar isn't loaded... Doesn't seem to hurt, but this should
- probably be investigated further.
-
- * gui/dialogs/comp-editor-util.c (comp_editor_contacts_to_widget):
- If we have no contacts, don't bother trying to set them in the
- widget. Used to pass a NULL list, which would lead to much anxiety
- in callees.
-
- * gui/dialogs/meeting-page.c (meeting_page_fill_widgets):
- If we have no potential organizers, emit a sensible warning.
-
- * gui/dialogs/task-page.c (init_widgets): Don't try to connect to
- the "changed" signal of the GtkTextView -- we listen to the
- GtkTextBuffer now.
-
-2003-02-20 Not Zed <NotZed@Ximian.com>
-
- * gui/e-itip-control.c (destroy): dont unref accounts anymore.
- (change_status): itipAddress -> EAccount.
-
- * gui/calendar-model.c (calendar_model_destroy): dont unref
- accounts anymore.
- (calendar_model_value_at): simplify logic using account_list_find.
-
- * gui/dialogs/task-editor.c (task_editor_edit_comp): use new
- itip_addresses interfaces.
-
- * gui/dialogs/meeting-page.c (meeting_page_construct): use new
- itip_addresses_* interfaces. Should probably be using e_account
- directly.
- (meeting_page_finalize): dont unref the accounts list.
-
- * gui/dialogs/event-editor.c (event_editor_edit_comp): dont unref
- accounts anymore.
-
- * gui/itip-utils.c (itip_addresses_get_default): Just use
- e_account_list_get_default.
- (itip_addresses_get): dont ref the account object, just keep 1 ref
- to it.
- (find_account): remove.
- (itip_organizer_is_user): use e_account_list_find now.
- (itip_sentby_is_user): "
- (comp_limit_attendees): "
-
-2003-02-19 Not Zed <NotZed@Ximian.com>
-
- * gui/dialogs/meeting-page.c: addresses->accounts
- (meeting_page_finalize): unref accounts.
-
- * gui/dialogs/event-editor.c: Use EAccountList api's
-
- * pcs/cal-backend-util.c (cal_backend_mail_account_get): Removed,
- use a global EAccountList instead.
- (cal_backend_mail_account_get_default): Use the global
- EAccountList directly.
- (cal_backend_mail_account_is_valid): And here too.
-
- * gui/itip-utils.h: Removed ItipAddress structure.
-
- * gui/itip-utils.c (itip_addresses_get): Change it to return a
- global account object, so we dont need to duplicate all account
- info in the calendar.
- (itip_addresses_free, itip_address_free): Removed, use
- g_object_unref.
- (itip_addresses_get_default): Return an EAccount.
- (find_account): helper to lookup accounts based on name/address.
- (itip_organizer_is_user): Use helper to find account.
- (itip_sentby_is_user): "
- (comp_limit_attendees): "
- (comp_sentby): Update to use an EAccount direclty.
- (get_address): Removed, now redundant.
-
- * gui/e-itip-control.c: Changed priv->addresses to be accounts
- EAccountList.
- (destroy): unref accounts.
- (find_my_address): Change to use accounts list directly, also fix
- a small potential memleak.
-
- * gui/calendar-model.c: Change priv->addresses to be a direct
- reference to an EAccountList, renamed priv->accounts.
- (calendar_model_destroy): unref accounts.
- (calendar_model_value_at): Use EAccountList directly to lookup
- members.
-
- * gui/calendar-config.c (calendar_config_get_timezone)
- (calendar_config_set_timezone): Fix timezone key.
- (calendar_config_get_24_hour_format): Same for 24 hour format key.
- (calendar_config_set_24_hour_format): And here.
- (calendar_config_get_week_start_day): "
- (calendar_config_set_week_start_day): "
- (calendar_config_get_day_start_hour): "
- (calendar_config_set_day_start_hour): "
- (calendar_config_get_day_start_minute): "
- (calendar_config_set_day_start_minute): "
- (calendar_config_get_day_end_hour): "
- (calendar_config_set_day_end_hour): "
- (calendar_config_get_day_end_minute)
- (calendar_config_set_day_end_minute)
- (calendar_config_get_time_divisions)
- (calendar_config_set_time_divisions)
- (calendar_config_get_dnav_show_week_no)
- (calendar_config_set_dnav_show_week_no)
- (calendar_config_get_default_view)
- (calendar_config_set_default_view)
- (calendar_config_get_hpane_pos, calendar_config_set_hpane_pos)
- (calendar_config_get_vpane_pos, calendar_config_set_vpane_pos)
- (calendar_config_get_month_hpane_pos)
- (calendar_config_set_month_hpane_pos)
- (calendar_config_get_month_vpane_pos)
- (calendar_config_set_month_vpane_pos)
- (calendar_config_get_compress_weekend)
- (calendar_config_set_compress_weekend)
- (calendar_config_get_show_event_end)
- (calendar_config_set_show_event_end)
- (calendar_config_get_working_days)
- (calendar_config_set_working_days)
- (calendar_config_get_hide_completed_tasks)
- (calendar_config_set_hide_completed_tasks)
- (calendar_config_get_hide_completed_tasks_units)
- (calendar_config_set_hide_completed_tasks_units)
- (calendar_config_get_hide_completed_tasks_value)
- (calendar_config_set_hide_completed_tasks_value)
- (calendar_config_get_confirm_delete)
- (calendar_config_set_confirm_delete)
- (calendar_config_get_confirm_expunge)
- (calendar_config_set_confirm_expunge)
- (calendar_config_get_tasks_due_today_color)
- (calendar_config_set_tasks_due_today_color)
- (calendar_config_get_tasks_overdue_color)
- (calendar_config_set_tasks_overdue_color)
- (calendar_config_get_use_default_reminder)
- (calendar_config_set_use_default_reminder)
- (calendar_config_get_default_reminder_interval)
- (calendar_config_set_default_reminder_interval)
- (calendar_config_get_default_reminder_units)
- (calendar_config_set_default_reminder_units)
- (calendar_config_default_calendar_folder)
- (calendar_config_default_tasks_folder): Update config paths for
- new config convention, etc.
-
- * gui/alarm-notify/save.c (KEY_LAST_NOTIFICATION_TIME, etc):
- Updated keys to lowercase/proper path.
- (save_calendars_to_load): Store the calendars list as a gconf
- list.
- (get_calendars_to_load): Load the calendars list as a gconf list.
- (save_blessed_program): Similar, for the blessed program list.
- (is_blessed_program): Same here.
-
- * gui/alarm-notify/config-data.c (config_data_get_timezone): Update
- the path to the timezone key.
- (config_data_get_24_hour_format): Fix path to config option.
-
- * conduits/todo/todo-conduit.c (get_default_timezone): lower-case
- the timezone key.
-
- * conduits/calendar/calendar-conduit.c (get_default_timezone):
- lower-case the timezone key.
-
- * cal-client/cal-client.c (get_default_uri): Use the proper path
- to get the default folder uri's.
-
-2003-02-23 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/gnome-cal.c (backend_died_cb): Appease the compiler.
- (gnome_calendar_update_paned_quanta): Don't actually try to set
- the quantum properties. The quantum code should probably go away
- entirely now that the panes update during resize, but let's keep
- it around for a bit more.
-
- * gui/dialogs/event-editor.c (event_editor_construct): Ref & sink
- the pages.
-
- * gui/dialogs/task-editor.c (task_editor_construct): Ref & sink
- the pages.
-
-2003-02-23 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/cal-search-bar.c (make_suboptions): Eliminate
- e_utf8_to_gtk_string ().
-
- * gui/e-timezone-entry.c (e_timezone_entry_get_display_name):
- Ditto.
-
- * gui/calendar-model.c (date_value_to_string):
- e_utf8_from_locale_string () -> g_locale_to_utf8 ().
- (calendar_model_value_to_string): Ditto.
-
- * gui/e-cell-date-edit-text.c (ecd_get_text): Ditto.
-
- * gui/e-itip-control.c (write_label_piece): Ditto.
-
- * gui/print.c (format_date): Ditto.
- (print_week_view_background): Ditto.
- (print_month_summary): Ditto.
- (print_date_label): Ditto.
- (print_comp_item): Ditto.
-
- * gui/alarm-notify/alarm-notify-dialog.c (write_html_heading):
- Ditto.
-
-2003-02-22 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/dialogs/task-details-page.c (get_widgets): Show the custom
- widgets, since libglade appears to not want to do that.
-
- * gui/dialogs/task-page.c (clear_widgets): Make the description
- field use a GtkTextView.
- (task_page_fill_widgets): Ditto.
- (task_page_fill_component): Ditto.
- (init_widgets): Ditto.
- (get_widgets): Show the custom widgets, since libglade doesn't do it.
-
-2003-02-22 Hans Petter Jansson <hpj@ximian.com>
-
- * pcs/cal-backend.c (cal_backend_unref_categories): Add an
- iteration statement. Fixes hang in wombat.
-
-2003-02-22 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/apps_evolution_calendar.schemas: Commit fixes from
- Grzegorz Goawski <grzegol@pld.org.pl>.
-
-2003-02-21 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/calendar-model.c (calendar_model_class_init): GObject, not
- GtkObject.
- (calendar_model_destroy): -> calendar_model_finalize ().
-
- * gui/calendar-view.c (calendar_view_class_init): GObject, not
- GtkObject.
- (calendar_view_destroy): -> calendar_view_finalize ().
-
- * gui/comp-editor-factory.c (comp_editor_factory_class_init):
- GObject, not GtkObject.
- (comp_editor_factory_destroy): -> comp_editor_factory_finalize ().
-
- * gui/e-day-view.c (e_day_view_long_event_button_press):
- gtk_signal_disconnect () -> g_signal_handler_disconnect ().
- (e_day_view_on_event_button_press): Ditto.
- (e_day_view_on_long_event_click): Ditto.
- (e_day_view_on_event_click): Ditto.
- (e_day_view_on_event_double_click): Ditto.
- (e_day_view_on_delete_appointment): Ditto.
-
- * gui/e-week-view.c (e_week_view_on_text_item_event):
- gtk_signal_disconnect () -> g_signal_handler_disconnect ().
-
- * gui/alarm-notify/alarm-notify.c (AlarmNotify_RemoveCalendar):
- Don't cast to GtkObject.
-
-2003-02-21 Dan Winship <danw@ximian.com>
-
- * cal-client/Makefile.am (libcal_client_la_LIBADD): depend on
- libcal-util, libwombat, and libeutil
- (client_test_LDADD): Remove those deps from here
-
- * cal-util/Makefile.am (libcal_util_la_LIBADD): depend on
- libical-evolution.la
- (test_recur_LDADD): Remove that dependency here (and an ancient
- libversit dependency).
-
- * gui/alarm-notify/Makefile.am (evolution_alarm_notify_LDADD):
- remove some deps
-
- * gui/Makefile.am (libevolution_calendar_la_LIBADD): Likewise.
-
-2003-02-20 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/apps_evolution_calendar.schemas: Add GConf schemas.
-
- * gui/Makefile.am (EXTRA_DIST): Dist GConf schemas.
- (install-data-local): Install GConf schemas.
-
-2003-02-20 Dan Winship <danw@ximian.com>
-
- * gui/Makefile.am (libevolution_calendar_la_LIBADD):
- s/libemiscwidgets.a/libemiscwidgets.la/ and likewise for
- libetimezonedialog
-
-2003-02-19 Ettore Perazzoli <ettore@ximian.com>
-
- * pcs/Makefile.am: Split $(CORBA_GENERATED_H) rule from the
- $(CORBA_GENERATED_C) rule to that it autogens properly when using
- parallel makes.
- * cal-client/Makefile.am: Likewise.
-
- * gui/gnome-cal.c (gnome_calendar_setup_view_menus): Fix path to
- the calendar's GAL Views directory. [Pointed out by Grzegorz
- Goawski.]
-
-2003-02-11 Hans Petter Jansson <hpj@ximian.com>
-
- Enable printing for calendar and tasks.
-
- * gui/print.c: Set default font to be "Sans". Store the PrintConfig
- globally instead of PaperInfo (which doesn't exist anymore).
- (get_font_for_size): Don't use
- gnome_font_face_find_closest_from_weight_slant() anymore, since
- it's broken. Instead, use gnome_font_face_find() and put bold- and
- italicness in the name to look for. Descenders can now be negative,
- so have to take the absolute value to get font height.
- (print_comp): Use global, persistent print configuration.
- GnomePrintDialog is now a GtkDialog. Remove manual configuration
- parameter shuffling. Set up page using new methods.
- (print_calendar): Like print_comp(). For month view, force landscape
- mode by temporarily setting it in the config, and remove the old hack.
- (print_setup): Port. I'm not sure this works, but at least it
- compiles now. How do I test this code path?
- (print_day_view): Pass NULL for page denominator.
- (print_week_view): Ditto.
- (print_month_view): Ditto.
- (print_year_view): Ditto.
- (print_comp_item): Add missing gnome_print_beginpage(). How did this
- work before?
-
- * gui/tasks-control.c: Store the PrintConfig globally instead of
- passing individual parameters every time. Persistent too.
- (print_title): Look for "Sans Bold" instead of "Times" with
- GNOME_FONT_BOLD property. Don't use find_closest_from_weight_slant().
- (print_tasks): Set up page using new methods. GnomePrintMaster ->
- GnomePrintJob. Get params from global config instead of args.
- (tasks_control_print_cmd): Use global, persistent print configuration.
- Remove manual portrait/landscape hack. GnomePrintDialog is now a
- GtkDialog. Set params in global config instead of passing them to
- print_tasks().
- (tasks_control_print_preview_cmd): print_tasks() now takes fewer
- args.
-
-2003-02-11 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_construct):
- Don't use gtk_scrolled_window_set_scrollbar_spacing() anymore.
-
-2003-02-10 Hans Petter Jansson <hpj@ximian.com>
-
- * pcs/cal-backend-file.c (save): Don't try to make an error string
- from an uninitialized GnomeVFSResult.
-
-2003-02-10 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/Makefile.am: Make the CORBA IDL compilation work with
- parallel makes.
- * gui/dialogs/Makefile.am: Likewise.
- * gui/alarm-notify/Makefile.am: Likewise.
-
-2003-02-07 Rodney Dawes <dobey@ximian.com>
-
- * gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.server.in:
- remove this file, as it's generated now
- * gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.server.in.in:
- Add this file to generate the .server.in from, with hardcoded path
- * gui/alarm-notify/Makefile.am: Hardcode path in server file
-
-2003-02-07 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #37706
-
- * gui/comp-editor-factory.c (cal_opened_cb): added PERMISSION_DENIED
- case for not ending process on g_assert_not_reached.
-
-2003-02-06 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/e-day-view-time-item.c
- (e_day_view_time_item_show_popup_menu): Use
- e_auto_kill_popup_menu_on_selection_done() instead of
- e_auto_kill_popup_menu_on_hide().
- * gui/dialogs/meeting-page.c (right_click_cb): Likewise.
-
-2003-02-06 Dan Winship <danw@ximian.com>
-
- * gui/dialogs/event-page.c (make_timezone_entry): show the widget
- before returning it.
-
- * importers/main.c (main): s/PACKAGE/GETTEXT_PACKAGE/ in gettext
- init
-
-2003-02-05 Dan Winship <danw@ximian.com>
-
- * gui/Makefile.am (INCLUDES): Remove cruft. Rename ICONSDIR to
- IMAGESDIR.
- (gladedir, etspecdir, serverdir): Remove definitions
- (libevolution_calendar_la_LDFLAGS): Remove -export-dynamic, add
- -module.
-
- * gui/calendar-config.c: #include <string.h>
-
- * gui/calendar-component.c (add_creatable_item):
- s/ICONSDIR/IMAGESDIR/
-
- * gui/comp-util.c: #include <string.h>
-
- * gui/e-alarm-list.c: #include e-time-utils.h
- (row_deleted): Remove unused variable.
- (e_alarm_list_append): Likewise.
-
- * gui/e-date-time-list.c: #include e-time-utils.h, timeutil.h,
- calendar-config.h
- (row_deleted): Remove unused variable
- (e_date_time_list_append): Likewise.
-
- * gui/e-day-view.c (e_day_view_unrealize): Remove unused var
- (e_day_view_style_set): Likewise.
- (e_day_view_set_event_font_cb): Likewise.
-
- * gui/e-day-view-time-item.c: #include <string.h>
- (e_day_view_time_item_get_column_width): Remove unused variable.
-
- * gui/e-itip-control.c: #include <unistd.h>
- (url_requested_cb): s/ICONSDIR/IMAGESDIR/
-
- * gui/e-week-view.c (e_week_view_unrealize): Remove unused variable
- (e_week_view_style_set): Likewise
-
- * gui/e-week-view-titles-item.c: #include string.h
- * gui/itip-bonobo-control.c: Likewise
- * gui/print.c: Likewise
-
-
- * gui/alarm-notify/Makefile.am: Use privlibexecdir.
- (INCLUDES): Remove cruft.
- (gladedir, serversdir): Remove definitions
- (evolution_alarm_notify_LDFLAGS): Remove no-longer-needed
- -export-dynamic.
-
- * gui/alarm-notify/alarm-notify-dialog.c (write_html_heading):
- s/ICONSDIR/IMAGESDIR
-
- * gui/alarm-notify/notify-main.c (main): Fix up gettext
- initialization
-
-
- * gui/dialogs/Makefile.am (INCLUDES): Remove cruft. Rename
- ICONSDIR to IMAGESDIR.
- (gladedir, etspecdir): Remove definitions
-
- * gui/dialogs/alarm-page.c: #include gtktreeselection.h and
- gtkcellrenderertext.h
- (append_reminder): Remove unused variable.
- (alarm_page_fill_component): Likewise.
- (alarm_page_set_summary): Likewise.
- (delete_clicked_cb): Likewise.
-
- * gui/dialogs/comp-editor.c (make_icon_from_comp):
- s/ICONSDIR/IMAGESDIR/
-
- * gui/dialogs/event-page.c: #include <string.h>
-
- * gui/dialogs/meeting-page.c (meeting_page_construct): Remove
- unused variable.
- (meeting_page_fill_widgets): Likewise
-
- * gui/dialogs/recurrence-page.c: #include gtktreeselection.h and
- gtkcellrenderertext.h
- (append_exception): Remove unused variable
- (fill_component): Likewise
- (recurrence_page_set_summary): Likewise.
- (exception_delete_cb): Likewise
-
-
- * cal-client/Makefile.am (libcal_clientincludedir): Define in
- terms of privincludedir
-
- * cal-client/client-test.c (main): Fix up gettext initialization
-
- * cal-client/cal-client.c (cal_client_construct): Likewise
-
-
- * cal-util/Makefile.am (INCLUDES): Remove cruft.
- (libcal_utilincludedir): Define in terms of privincludedir
-
-
- * pcs/Makefile.am (INCLUDES): Remove cruft.
- (pcsincludedir): Define in terms of privincludedir
-
- * pcs/cal-backend-file.c (cal_backend_file_finalize): Remove
- unused variable
-
-
- * importers/Makefile.am: Update this some although it's not
- currently being built
-
-2003-02-05 Dan Winship <danw@ximian.com>
-
- * gui/alarm-notify/notify-main.c (main):
- s/glade_gnome_init/glade_init/
-
- * gui/calendar-offline-handler.c: s/BonoboXObject/BonoboObject/
-
- * gui/comp-editor-factory.c: Likewise
-
-2003-02-05 Dan Winship <danw@ximian.com>
-
- * cal-util/cal-recur.c (cal_recur_nth): array of localized month
- day names ("1st" - "31st")
-
- * gui/dialogs/recurrence-page.c (make_recur_month_num_submenu,
- make_recur_month_num_menu, month_num_menu_selection_done_cb): Use
- the new cal_recur_nth[] array. The way this was done before didn't
- localize properly.
-
- From evolution-1-2-branch:
-
- * gui/e-itip-control.c (write_recurrence_piece): Describe
- recurrences, if we can. #30993
- (set_date_label): If the meeting has recurrences, call
- write_recurrence_piece after writing the start and end dates.
- (write_label_piece): Wrap the timezone in <font size=-1> to
- de-emphasize it a bit and try to keep the timestamp on a single
- line even with big Outlook timezone names. Add an option to show
- just the date, for describing the end of recurrences (since the
- time in the UNTIL is the *beginning* of the last instance, which
- would confuse people).
- (update_item): Set the VCALENDAR's METHOD.
- (ok_clicked_cb): Use update_item, not remove_item, to process a
- cancelation. Part of #33875.
-
- * pcs/cal-backend-file.c (cal_backend_file_cancel_object): New,
- handle an ICAL_METHOD_CANCEL update.
- (cal_backend_file_update_objects): Call
- cal_backend_file_update_object or cal_backend_file_cancel_object
- as appropriate.
-
-2003-02-04 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_on_invite_others_button_draw):
- Rename to e_meeting_time_selector_on_invite_others_button_expose()
- and handle "expose-event" instead of "draw".
- (e_meeting_time_selector_construct): The "draw" signal doesn't exist
- anymore - connect to "expose-event" instead.
-
- * gui/dialogs/event-page.c (clear_widgets): Clear the GtkTextBuffer
- for the description.
- (event_page_fill_widgets): Use the GtkTextBuffer.
- (event_page_fill_component): Use the GtkTextBuffer.
- (init_widgets): Create a GtkTextBuffer for the GtkTextView. Set word
- wrap. Connect to the "changed" signal of the model instead of the view.
-
-2003-02-04 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/e-meeting-time-sel-item.c
- (e_meeting_time_selector_item_paint_day_top): Use PangoLayout to
- draw text.
-
-2003-02-02 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/e-day-view.c (e_day_view_set_event_font_cb): Skip setting the
- "font_gdk" arg for now.
- (e_day_view_update_main_canvas_drag): Ditto.
-
- * gui/e-week-view.c (e_week_view_style_set): Ditto.
-
- * gui/weekday-picker.c (configure_items): Ditto.
-
- * gui/dialogs/event-page.c (get_widgets): Show custom widgets
- manually, since the visibility specified in the Glade XML appears
- to not have any effect.
-
- * gui/dialogs/recurrence-page.c (get_widgets): Ditto.
-
-2003-01-30 Ronald Kuetemeier <ronald@kuetemeier.com>
-
- Fixes #35572
-
- * gui/alarm-notify/alarm-queue.c: set saved_notification_time to last
- notification time when we update the config to last notification, so
- alarms will not get trigged again if a new calendar window is opened.
-
-2003-01-26 Chris Toshok <toshok@ximian.com>
-
- * conduits/todo/todo-conduit.c: CalClient and CalComponent are
- GObjects.
-
- * conduits/calendar/calendar-conduit.c: same.
-
-2003-01-26 Chris Toshok <toshok@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (start_calendar_server):
- fix warning.
- (get_default_timezone): BonoboConfigDatabase -> e_config_listener.
- (accept_all_cookies): remove.
- (conduit_get_gpilot_conduit): remove the oaf initialization stuff.
-
- * conduits/todo/todo-conduit.c (start_calendar_server):
- fix warning.
- (get_default_timezone): BonoboConfigDatabase -> e_config_listener.
- (accept_all_cookies): remove.
- (conduit_get_gpilot_conduit): remove the oaf initialization stuff.
-
- * Makefile.am (CONDUIT_DIR): uncomment the conduit stuff.
-
-2003-01-26 Hans Petter Jansson <hpj@ximian.com>
-
- Make clicks, drags and resizes work, and pangoize remaining strings.
- Fix EText placement.
-
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw_long_event):
- Use Pango.
-
- * gui/e-day-view.c (e_day_view_on_top_canvas_button_press):
- Don't add scroll offset, it's already factored in.
- (e_day_view_on_main_canvas_button_press): Ditto.
- (e_day_view_on_top_canvas_motion): Ditto.
- (e_day_view_on_main_canvas_motion): Ditto.
- (e_day_view_reshape_long_event): Don't set the "font_gdk" property.
- Its non-existence will prevent the other properties from being set as
- well.
- (e_day_view_reshape_day_event): Ditto.
- (e_day_view_update_top_canvas_drag): Ditto.
- (e_day_view_start_editing_event): ETextEventProcessor is a GObject
- now. So use g_signal_stuff.
- (e_day_view_check_auto_scroll): Factor out scroll offset before
- checking the pointer's position relative to widget.
- (e_day_view_auto_scroll_handler): Don't freeze the canvas when
- scrolling - it will fail to update the canvas. If this is not
- intended behaviour, it's a bug in the canvas, I think.
- (e_day_view_on_main_canvas_drag_motion): Factor in the scroll offset
- before checking for auto-scroll, since the function requires this.
-
- * gui/e-week-view.c (e_week_view_reshape_event_span): Don't set the
- "font_gdk" property. Its non-existence will prevent the other
- properties from being set as well.
- (e_week_view_start_editing_event): ETextEventProcessor is a GObject
- now. So use g_signal_stuff.
-
-2003-01-25 Hans Petter Jansson <hpj@ximian.com>
-
- Mainly making all views use PangoLayouts for text. When drawing a
- PangoLayout, the draw offset is the top left corner of the layout,
- not the text's baseline. Keep this in mind when viewing the
- changes. I'll be brief about the exact changes, since they speak
- better for themselves.
-
- * gui/e-day-view-time-item.c (e_day_view_time_item_get_column_width):
- Use Pango.
- (e_day_view_time_item_draw): Use Pango.
-
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw): Use Pango.
- (e_day_view_top_item_draw_long_event): Add some FIXME text so we can
- see when this is being used. Is it in use at all?
-
- * gui/e-day-view.c: No longer specify an explicit X font string for
- the large font. Use the main font, and change the point size.
- (e_day_view_init): Use Pango.
- (e_day_view_style_set): Use Pango. Comment out the gdk_font setting
- for the drag text items for now.
-
- * gui/e-day-view.h: Use Pango.
-
- * gui/e-week-view-event-item.c (e_week_view_draw_time): Use Pango.
-
- * gui/e-week-view-main-item.c (e_week_view_main_item_draw_day):
- Use Pango.
-
- * gui/e-week-view-titles-item.c (e_week_view_titles_item_draw):
- Use Pango.
-
- * gui/e-week-view.c: No longer specify an explicit X font string for
- the small font. Use the main font, and change the point size.
- (e_week_view_init): Use Pango.
- (e_week_view_destroy): Use Pango.
- (get_string_width): Implemented for convenience.
- (get_digit_width): Implemented for convenience.
- (e_week_view_style_set): Use Pango.
- (e_week_view_recalc_cell_sizes): Use Pango.
- (e_week_view_get_time_string_width): Use Pango.
-
- * gui/e-week-view.h: Use Pango.
-
- Following are some random UTF-8 fixes and a crash fix.
-
- * gui/itip-utils.c (comp_description): Use g_locale_to_utf8 ().
-
- * gui/dialogs/comp-editor.c (make_title_from_comp): Return a
- UTF-8 string.
-
- * gui/dialogs/alarm-page.c (alarm_page_set_summary): Pass UTF-8
- directly to GTK.
-
- * gui/dialogs/delete-comp.c (delete_component_dialog): Ditto.
-
- * gui/dialogs/meeting-page.c (meeting_page_fill_widgets): Ditto.
- (meeting_page_construct): Ditto.
-
- * gui/dialogs/recurrence-page.c (recurrence_page_set_summary): Ditto.
-
- * gui/dialogs/event-editor.c (event_editor_finalize): Fix crash caused
- by gtk_object_destroy()-ing a non-GtkObject.
-
-2003-01-24 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/e-day-view.c (e_day_view_on_editing_stopped): Don't insist
- appointment is updated if both old and new summary are blank.
-
- * gui/e-week-view.c (e_week_view_on_editing_stopped): Ditto.
-
- * gui/e-timezone-entry.c (on_button_clicked): Timezone dialog is now
- a GtkDialog. Treat it as such.
-
- * gui/goto.c (ecal_event): Goto dialog is now a GtkDialog. Treat it
- as such.
- (goto_dialog): Ditto.
-
- * gui/goto-dialog.glade: Set the return IDs from the dialog buttons.
-
- * gui/dialogs/meeting-page.c (popup_delegate_cb): Enable the delegate
- dialog. It's now a GtkDialog, so treat it like one.
- (right_click_cb): Use GTK stock item, not GNOME (that doesn't work
- anymore).
-
- * gui/e-delegate-dialog.glade: Set the return IDs from dialog buttons.
-
- * gui/print.c (print_calendar): Correct the print dialog init. Code
- is still not enabled, though.
-
- * gui/tasks-control.c (print_tasks): Add a warning about printing
- being disabled.
-
-2003-01-24 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/dialogs/Makefile.am (iconsdir): Remove, this is now defined
- in configure.in.
-
- * gui/Makefile.am (iconsdir): Remove; this is now defined in
- configure.in.
-
- * gui/alarm-notify/Makefile.am (iconsdir): Remove; this is now
- defined in configure.in.
-
-2003-01-23 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/dialogs/event-page.c (get_widgets): GTK_OBJECT -> G_OBJECT cast.
-
- * gui/dialogs/alarm-page.c (get_widgets): Ditto.
-
- * gui/dialogs/meeting-page.c (get_widgets): Ditto.
-
- * gui/dialogs/recurrence-page.c (get_widgets): Ditto.
-
- * gui/dialogs/schedule-page.c (get_widget): Ditto.
-
- * gui/dialogs/task-details-page.c (get_widget): Ditto.
-
- * gui/dialogs/task-page.c (get_widget): Ditto.
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_construct): Add a
- FIXME comment to think about.
-
- * gui/dialogs/comp-editor.c (comp_editor_merge_ui): Add a terminating
- NULL to the concatenation.
-
-2003-01-23 Hans Petter Jansson <hpj@ximian.com>
-
- Fixes some trivial, but distracting, warnings.
-
- * gui/calendar-config.c (on_timezone_set): Fix constness.
-
- * gui/e-timezone-entry.c (on_button_clicked): Fix constness.
-
- * gui/dialogs/event-page.c (contacts_changed_cb): Fix constness.
-
- * gui/dialogs/task-page.c (contacts_changed_cb): Fix constness.
-
- * gui/e-itip-control.c (start_default_server): Cast callback with
- G_CALLBACK ().
-
- * gui/dialogs/schedule-page.c (init_widgets): Cast callback with
- G_CALLBACK ().
-
- * gui/calendar-offline-handler.c (impl_dispose): Takes GObject,
- not GtkObject.
- (impl_finalize): Ditto.
-
- * gui/calendar-view.c (calendar_view_edit): Now takes parent window
- as second arg.
-
- * gui/e-meeting-model.c (select_names_ok_cb): Fix constness.
- (get_select_name_dialog): Cast callback to BonoboListenerCallbackFn.
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_options_menu_position_callback): Add the
- push_in arg to arg list. This was crash-prone before.
- (e_meeting_time_selector_autopick_menu_position_callback): Ditto.
-
- * gui/alarm-notify/alarm-notify-dialog.c: Include e-unicode.h.
-
-2003-01-23 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/Makefile.am (componentdir): Removed definition; this is now
- defined in configure.in.
-
-2003-01-22 Ettore Perazzoli <ettore@ximian.com>
-
- * pcs/cal-backend.c (cal_backend_ref_categories): Do not put the
- category in both the changed_categories and the categories hashes;
- fixes a double-free when finalizing the CalBackend.
-
-2003-01-22 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_setup_view_menus): Use
- EVOLUTION_GALVIEWSDIR.
-
- * gui/e-tasks.c (e_tasks_setup_view_menus): Use
- EVOLUTION_GALVIEWSDIR.
-
- * cal-util/Makefile.am: Install libcal-util.la in $(privlibdir)
- instead of $(libdir).
-
- * gui/dialogs/comp-editor.c (setup_widgets): Get
- evolution-comp-editor.xml from EVOLUTION_UIDIR.
- (comp_editor_merge_ui): Get the file in EVOLUTION_UIDIR.
-
- * gui/tasks-control.c (tasks_control_activate): Get
- evolution-tasks.xml from EVOLUTION_UI_DIRECTORY.
-
- * gui/calendar-commands.c (calendar_control_activate): Get
- evolution-calendar.xml from EVOLUTION_UI_DIRECTORY.
-
- * pcs/Makefile.am (pcsincludedir): Version using $(BASE_VERSION).
-
- * importers/Makefile.am: Install evolution-calendar-importer in
- $(libexecdir)/evolution/$(BASE_VERSION).
- (sounddir): Remove.
-
- * gui/dialogs/Makefile.am (iconsdir): Version using
- $(BASE_VERSION).
- (gladedir): Likewise.
- (etspecdir): Likewise.
-
- * gui/Makefile.am (help_base): Remove.
- (install-data-local): Do not make the $(help_base)/C directory.
- (etspecdir): Version using $(BASE_VERSION).
- (gladedir): Likewise.
- (iconsdir): Likewise.
- (INCLUDES): Update the EVOLUTION_IMAGESDIR define to be versioned,
- and add a -DEVOLUTION_GALVIEWSDIR.
-
- * cal-util/Makefile.am: Install evolution-alarm-notify in
- $(libexecdir)/evolution/$(BASE_VERSION).
-
- * cal-util/Makefile.am (libcal_utilincludedir): Version using
- $(BASE_VERSION).
- * gui/alarm-notify/Makefile.am (iconsdir): Likewise.
- (gladedir): Likewise.
-
- * cal-client/Makefile.am: Install libcal-client.la in privlibdir
- instead of libdir.
- (libcal_clientincludedir): Version using $(BASE_VERSION).
-
-2003-01-18 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/print.c (print_calendar): Create a GnomePrintDialog,
- not a GnomePrinterDialog. They're different things. Patch from
- Chema.
-
-2003-01-17 Dan Winship <danw@ximian.com>
-
- * pcs/cal-backend.c: Move some non-file-backend-specific stuff
- from cal-backend-file here so it can be shared with other
- backends.
- (CalBackendPrivate): add this, containing the categories hashes
- and the (formerly public) clients list.
- (cal_backend_init, cal_backend_finalize): Handle backend->priv.
- (cal_destroy_cb): Simplify this (and redo it as a weak notify
- func)
- (cal_backend_add_cal): Keep a weak ref on the cal rather than
- connecting to its "destroy" signal. Call notify_categories_changed
- to let the new cal know about them.
- (get_object): Default implementation of cal_backend_get_object.
- that calls cal_component_get_as_string on the return value of
- cal_backend_get_object_component.
- (cal_backend_notify_mode, cal_backend_notify_update,
- cal_backend_notify_remove, cal_backend_notify_error): Notify each
- Cal about something.
- (cal_backend_ref_categories, cal_backend_unref_categories):
- Maintain a list of categories that are used by components in the
- backend, and trigger categories_changed notifications as needed.
-
- * pcs/cal-backend-file.c: Remove stuff that was moved to
- CalBackend (notify funcs, category handling, get_object
- implementation)
-
-2003-01-16 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/e-alarm-list.[ch]: Implement EAlarmList as CalComponentAlarm
- list with a GtkTreeModel interface.
-
- * gui/Makefile.am: Add e-alarm-list.[ch].
-
- * gui/dialogs/alarm-page.[ch]: Use GtkTreeView with the new
- EAlarmList as model for the alarm list. Update copyright.
-
- * gui/dialogs/recurrence-page.[ch]: Update copyright.
- (free_exception_date_time): Removed.
- (fill_exception_widgets): Kill a lingering clist operation.
-
-2003-01-15 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_construct):
- Create accel groups for popup menus. Fixes crash.
-
- * gui/e-date-time-list.[ch]: Implement EDateTimeList as
- CalComponentDateTime list with a GtkTreeModel interface.
-
- * gui/Makefile.am: Add e-date-time-list.[ch].
-
- * gui/dialogs/recurrence-page.c: Use GtkTreeView with the new
- EDateTimeList as model for the exception list.
-
- * gui/e-day-view.c: Silence warnings caused by missing casts.
-
- * gui/e-week-view.c: Silence warnings caused by missing casts.
-
-2003-01-15 Rodney Dawes <dobey@ximian.com>
-
- * gui/Makefile.am: Added libevolution_calendar_la_LDFLAGS, and
- avoid versioning the shlib component
-
-2003-01-14 Ettore Perazzoli <ettore@ximian.com>
-
- * cal-client/Makefile.am (CORBA_SOURCES_GENERATED): Renamed from
- CORBA_GENERATED.
- (CORBA_GENERATED): New, put both $(CORBA_SOURCES_GENERATED) and
- $(CORBA_HEADERS_GENERATED) in it.
- (BUILT_SOURCES): Put $(CORBA_GENERATED) in here.
-
-2003-01-14 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/e-calendar-table.c (tasks_popup_menu): Cast signal handlers
- to GtkSignalFunc, avoid warnings.
-
- * gui/gnome-cal.c (set_view): Only set view ID if we have an instance.
-
-2003-01-14 Ettore Perazzoli <ettore@ximian.com>
-
- * cal-util/Makefile.am (EXTRA_DIST): cal-util-marshal.list.
-
- * Makefile.am: Comment out the CONDUIT_DIR stuff for now.
-
-2003-01-14 Rodney Dawes <dobey@ximian.com>
-
- * gui/gnome-cal.c: Use GtkPaned instead of EPaned
-
-2003-01-14 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/e-day-view.c (e_day_view_init): Work around canvas crashes
- by ensuring rectangles have an initial width.
-
-2003-01-13 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/config-control-factory.h: Removed.
- * gui/config-control-factory.c: Removed.
-
- * gui/itip-bonobo-control.c: Renamed from itip-control-factory.c.
- (itip_bonobo_control_new): New.
- (itip_control_factory_init): Removed.
-
- * gui/itip-bonobo-control.h: Renamed from itip-control-factory.h.
-
- * gui/tasks-control-factory.c: Removed.
- * gui/tasks-control-factory.h: Removed.
-
- * gui/control-factory.c (control_factory_init): Removed.
-
- * gui/Makefile.am: Updated to build everything as
- libevolution-calendar.so and install in the COMPONENTDIR.
-
- * gui/GNOME_Evolution_Calendar.server.in.in: Updated to build the
- component as a shared library.
-
- * gui/main.c (main): Removed.
-
- * gui/calendar-component.c (calendar_component_get_object): New.
- (owner_set_cb): Do not store the shell pointer in shells.
- (owner_unset_cb): Do not remove the shell pointer from shells;
- instead, just set global_shell_client to NULL.
-
- * gui/calendar-component.h: Renamed from component-factory.h.
- * gui/calendar-component.c: Renamed from component-factory.c.
-
-2003-01-10 Ettore Perazzoli <ettore@ximian.com>
-
- * importers/icalendar-importer.c (connect_to_shell):
- CORBA_Object_release() the CORBA shell.
-
-2003-01-09 Dan Winship <danw@ximian.com>
-
- * gui/dialogs/recurrence-page.c (make_recur_month_num_submenu,
- make_recur_month_num_menu, month_num_menu_selection_done_cb): Use
- the new cal_recur_nth[] array. The way this was done before didn't
- localize properly.
-
- * cal-util/cal-recur.c (cal_recur_nth): array of localized month
- day names ("1st" - "31st")
-
- * cal-util/cal-component.c (cal_component_set_recurid): Allow
- recur_id to be NULL to clear the recurrence id. (Based on a story
- by JP on evolution-1-2-recurid-branch)
-
- * gui/print.c: Remove unused gnome-print-copies.h #include
-
- * pcs/query.c (query_new): Use g_object_weak_ref rather than
- connecting to "destroy" (which doesn't actually exist on a
- CalBackend)
- (backend_destroyed_cb): Update prototype.
-
-2003-01-08 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/alarm-notify/Makefile.am: Icons are now in
- $(datadir)/evolution/images instead of
- $(datadir)/images/evolution.
- * gui/Makefile.am: Likewise.
- * gui/dialogs/Makefile.am: Likewise.
-
-2003-01-06 Dan Winship <danw@ximian.com>
-
- * idl/Makefile.am: remove idldir definition. (It's defined in
- configure.in now)
-
-2002-12-19 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/calendar-commands.c (calendar_control_deactivate):
- Replace gtk_signal_disconnect_by_data() with
- g_signal_handlers_disconnect_matched(). Former takes GtkObject,
- latter takes GObject.
-
- * gui/calendar-model.c (calendar_model_destroy): Ditto.
- (update_query): Ditto.
- (calendar_model_set_cal_client): Ditto.
-
- * gui/e-day-view.c (e_day_view_destroy): Ditto.
- (update_query): Ditto.
- (e_day_view_set_cal_client): Ditto.
-
- * gui/e-tasks.c (query_eval_error_cb): Ditto.
- (query_query_done_cb): Ditto.
-
- * gui/e-week-view.c (e_week_view_destroy): Ditto.
- (update_query): Ditto.
- (e_week_view_set_cal_client): Ditto.
-
- * gui/gnome-cal.c (update_query): Ditto.
- (gnome_calendar_destroy): Ditto.
-
- * gui/tasks-control.c (tasks_control_deactivate): Ditto.
-
- * gui/e-comp-editor-registry.c (foreach_close_cb): Replace
- gtk_signal_handler_(un)block_by_data() with
- g_signal_handlers_(un)block_matched(). Former takes GtkObject, latter
- takes GObject.
-
- * gui/dialogs/alarm-page.c (alarm_page_get_type): Replace with
- E_MAKE_TYPE().
- (alarm_page_class_init): Use GObject as base class instead of
- GtkObject, and set up finalization instead of destroy handler.
- (alarm_page_destroy): Change to alarm_page_finalize() and assume
- parent is GObject, not GtkObject.
- (alarm_page_new): Use g_object_new(), not gtk_type_new().
-
- * gui/dialogs/event-page.c: Same general changes as above file.
- (update_time): Replace gtk_signal_handler_(un)block_by_data()
- with g_signal_handlers_(un)block_matched().
- (clear_widgets): Ditto.
- (times_updated): Ditto.
-
- * gui/dialogs/recurrence-page.c: Same general changes as above file.
- (clear_widgets): Replace gtk_signal_handler_(un)block_by_data()
- with g_signal_handlers_(un)block_matched().
- (append_exception): Ditto.
- (fill_ending_date): Ditto.
- (recurrence_page_fill_widgets): Ditto.
-
- * gui/dialogs/comp-editor.c: Same general changes as above file.
- (comp_editor_finalize): Replace gtk_signal_disconnect_by_data()
- with g_signal_handlers_disconnect_matched().
- (comp_editor_remove_page): Ditto.
-
- * gui/dialogs/event-editor.c: Same general changes as above file.
- * gui/dialogs/meeting-page.c: Same general changes as above file.
- * gui/dialogs/schedule-page.c: Same general changes as above file.
- * gui/dialogs/task-details-page.c: Same general changes.
- * gui/dialogs/task-editor.c: Same general changes as above file.
- * gui/dialogs/task-page.c: Same general changes as above file.
- * gui/dialogs/e-delegate-dialog.c: Same general changes.
-
-2002-12-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/e-itip-control.c (write_html): Use camel_text_to_html()
- instead.
-
-2002-12-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/e-itip-control.c (write_html): Correctly convert text.value
- into HTML here (ie, don't pass "<i>None</i>" into e_text_to_html()
- if text.value is NULL).
-
-2002-12-06 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #35003
-
- * gui/misc.[ch] (get_uri_without_password): new function for
- removing the password from the CalClient's uris.
-
- * gui/gnome-cal.c (client_cal_opened_cb): use the URI returned by
- get_uri_without_password for messages.
- (backend_error_cb): likewise.
- (backend_died_cb): likewise.
- (gnome_calendar_open): likewise.
- (open_error, method_error, permission_error): likewise.
-
- * gui/e-tasks.c (e_tasks_open): hide the password from the URI
- being displayed in messages.
- (backend_error_cb): likewise.
-
-2002-12-06 Hans Petter Jansson <hpj@ximian.com>
-
- * cal-client/cal-query.c (cal_query_done_status_enum_get_type):
- Implement GType for this enumeration.
- (cal_query_class_init): Use the enumeration instead of the
- abstract one.
-
- * cal-client/cal-query.h: Add type macro and proto for enum.
-
-2002-12-06 Hans Petter Jansson <hpj@ximian.com>
-
- * gui/component-factory.c (create_view): Pass the env argument to
- bonobo_control_set_property ().
-
- * gui/e-meeting-model.c (class_init): We're no longer derived from
- GtkObject, so use GObject class methods instead. destroy->finalize.
- (destroy): Zapped.
- (finalize): Implement based on old destroy ().
-
-2002-12-06 Hans Petter Jansson <hpj@ximian.com>
-
- * cal-client/cal-client.c (cal_client_open_status_enum_get_type):
- Create a non-abstract enumeration type derived from GEnum.
- (cal_client_set_mode_status_enum_get_type): Ditto.
- (cal_mode_enum_get_type): Ditto.
- (cal_client_class_init): Use our enumerations and not the abstract
- one.
- (cal_client_finalize): Don't destroy factories, since the CalClient
- doesn't own them anymore. They're shared between CalClients now.
- (get_factories): Implement. Move the factory setup code here from
- cal_client_construct (), and cache the factories. This is hopefully
- temporary, until wombat goes away or is fixed.
- (cal_client_construct): Most of the code moved to get_factories ().
-
- * cal-client/cal-client.h: Add enumeration type macros and protos.
-
- * gui/cal-search-bar.c (cal_search_bar_get_type): Removed in favour
- of E_MAKE_TYPE, which uses GObject calls.
- (cal_search_bar_class_init): Use g_type_class_peek_parent ().
-
- * gui/calendar-model.c (calendar_model_get_type):
- (calendar_model_class_init): Ditto, like above file.
- * gui/calendar-view.c (calendar_view_get_type):
- (calendar_view_class_init): Ditto.
- * gui/e-calendar-table.c (e_calendar_table_get_type):
- (e_calendar_table_class_init): Ditto.
- * gui/e-comp-editor-registry.c (e_comp_editor_registry_get_type):
- (class_init): Ditto.
- * gui/e-day-view-main-item.c (e_day_view_main_item_get_type):
- (e_day_view_main_item_class_init): Ditto.
- * gui/e-day-view-time-item.c (e_day_view_time_item_get_type):
- (e_day_view_time_item_class_init): Ditto.
- * gui/e-day-view-top-item.c (e_day_view_top_item_get_type):
- (e_day_view_top_item_class_init): Ditto.
- * gui/e-day-view.c (e_day_view_get_type):
- (e_day_view_class_init): Ditto.
- * gui/e-itip-control.c (e_itip_control_get_type):
- (class_init): Ditto.
- * gui/e-meeting-attendee.c (e_meeting_attendee_get_type):
- (class_init): Ditto.
- * gui/e-meeting-model.c (e_meeting_model_get_type):
- (class_init): Ditto.
- * gui/e-meeting-time-sel-item.c
- (e_meeting_time_selector_item_get_type):
- (e_meeting_time_selector_item_class_init): Ditto.
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_get_type):
- (e_meeting_time_selector_class_init): Ditto.
- * gui/e-timezone-entry.c (e_timezone_entry_get_type):
- (e_timezone_entry_class_init): Ditto.
- * gui/e-week-view-event-item.c (e_week_view_event_item_get_type):
- (e_week_view_event_item_class_init): Ditto.
- * gui/e-week-view-main-item.c (e_week_view_main_item_get_type):
- (e_week_view_main_item_class_init): Ditto.
- * gui/e-week-view-titles-item.c (e_week_view_titles_item_get_type):
- (e_week_view_titles_item_class_init): Ditto.
- * gui/gnome-cal.c (gnome_calendar_get_type):
- (gnome_calendar_class_init): Ditto.
- * gui/weekday-picker.c (weekday_picker_get_type):
- (weekday_picker_class_init): Ditto.
-
- * gui/e-week-view.c (e_week_view_get_type):
- (e_week_view_class_init): Ditto, but parent_class init was moved
- from get_type() to class_init().
-
- * gui/calendar-view-factory.c (calendar_view_factory_get_type):
- (calendar_view_factory_class_init): Ditto, and set up finalize
- callback instead of destroy.
- (calendar_view_factory_finalize): It's a GObject, so implement this.
- (celendar_view_factory_destroy): Move code to _finalize() and remove.
-
- * gui/main.c (init_bonobo): Remove extraneous bonobo_activation_init().
-
-2002-11-27 Not Zed <NotZed@Ximian.com>
-
- * gui/itip-utils.[ch]: run fix.sh over this.
-
- * gui/dialogs/*.[ch]: run fix.sh over all of this.
-
-2002-11-26 Richard Li <Richard.Li@Sun.COM>
-
- * cal-client/cal-client.c (cal_client_construct): removed extra call
- to CORBA_exception_init.
-
-2002-11-22 Not Zed <NotZed@Ximian.com>
-
- * gui/dialogs/delete-comp.c (delete_component_dialog): Changed
- e_messagebox -> gtk_messagedialog.
-
-2002-11-21 Not Zed <NotZed@Ximian.com>
-
- * gui/component-factory.c (create_view): pass type to
- bonobo_control_set_property.
-
-2002-11-20 Not Zed <NotZed@Ximian.com>
-
- * gui/Makefile.am (EXTRA_DIST): fix typo, servers_in_files ->
- server_in_files.
-
-2002-11-19 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am: Added rule to generate
- GNOME_Evolution_Calendar.server.in from
- GNOME_Evolution_Calendar.server.in.in, substituting @LIBEXECDIR@.
- Also, install evolution-calendar in $libexecdir instead of
- $bindir.
-
- * gui/GNOME_Evolution_Calendar.server.in.in: Renamed from
- GNOME_Evolution_Calendar.server.in. Prepended the executable name
- with @LIBEXECDIR@.
-
-2002-11-19 Not Zed <NotZed@Ximian.com>
-
- * gui/e-meeting-model.c (get_select_name_dialog): pass type to
- bonobo_widget::set_property.
- (select_names_ok_cb): ", for get_property.
-
- * gui/dialogs/e-delegate-dialog.c (e_delegate_dialog_construct):
- pass type to bonobo_widget::set_property & plug small leak.
- (e_delegate_dialog_get_delegate): ", for get_property.
- (e_delegate_dialog_get_delegate_name): "
-
- * gui/dialogs/comp-editor-util.c (comp_editor_contacts_to_widget):
- pass type to bonobo_widget::set_property.
- (comp_editor_contacts_to_component): ", for get_property
-
-2002-11-16 Chris Toshok <toshok@ximian.com>
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_style_set):
- use new e_table_header_compute_height signature.
-
-2002-11-15 Rodney Dawes <dobey@ximian.com>
-
- * gui/component-factory.c: Use bonobo_main_quit instead of gtk
-
-2002-11-13 Federico Mena Quintero <federico@ximian.com>
-
- * cal-client/cal-query.c: #include <string.h>
- (obj_removed_cb): Fixed prototype.
-
- * cal-client/cal-client.c (get_objects_atomically): Fix use of
- g_signal_handler_disconnect().
-
- * cal-client/client-test.c (create_client): Add G_CALLBACK casts.
-
-2002-11-12 Federico Mena Quintero <federico@ximian.com>
-
- * pcs/cal-backend-util.c: #include <string.h>
-
- * pcs/cal.c: Fixed prototypes of the CORBA method implementations.
-
- * pcs/cal-backend-file.c (cal_backend_file_dispose): Added a
- dispose method.
- (cal_backend_file_get_free_busy): Converted to use EConfigListener
- rather than BonoboConfigDatabase.
-
- * gui/alarm-notify/alarm-notify.c: #include <string.h>, fix use of
- g_hash_table_lookup_extended().
-
- * gui/alarm-notify/alarm-notify-dialog.c: Substitute deprecated
- GTK+ functions for new ones.
-
- * gui/alarm-notify/alarm-queue.c: Likewise.
-
- * gui/alarm-notify/notify-main.c: #include <string.h>,
- <gtk/gtkmain.h>.
-
- * gui/alarm-notify/save.c: #include <string.h>.
-
-2002-11-08 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/calendar-commands.c (calendar_control_deactivate): Use
- g_object_set_data(..., NULL) instead of gtk_object_remove_data().
-
- * gui/calendar-commands.c: Use g_object_{set,get}_* functions
- instead of gtk_object_{set,get}_*.
- * gui/calendar-commands.c: Likewise.
- * gui/calendar-config.c: Likewise.
- * gui/control-factory.c: Likewise.
- * gui/e-calendar-table.c: Likewise.
- * gui/e-comp-editor-registry.c: Likewise.
- * gui/e-day-view-main-item.c: Likewise.
- * gui/e-day-view-time-item.c: Likewise.
- * gui/e-day-view-top-item.c: Likewise.
- * gui/e-day-view.c: Likewise.
- * gui/e-meeting-attendee.c: Likewise.
- * gui/e-meeting-model.c: Likewise.
- * gui/e-meeting-time-sel-item.c: Likewise.
- * gui/e-meeting-time-sel.c: Likewise.
- * gui/e-week-view-event-item.c: Likewise.
- * gui/e-week-view-layout.c: Likewise.
- * gui/e-week-view-main-item.c: Likewise.
- * gui/e-week-view-titles-item.c: Likewise.
- * gui/e-week-view.c: Likewise.
- * gui/gnome-cal.c: Likewise.
- * gui/print.c: Likewise.
-
-2002-11-08 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/calendar-commands.c: Use g_object_ref()/g_object_unref()
- instead of gtk_object_ref/gtk_object_unref().
- * gui/calendar-config.c: Likewise.
- * gui/calendar-model.c: Likewise.
- * gui/comp-editor-factory.c: Likewise.
- * gui/comp-util.c: Likewise.
- * gui/e-calendar-table.c: Likewise.
- * gui/e-day-view.c: Likewise.
- * gui/e-itip-control.c: Likewise.
- * gui/e-meeting-model.c: Likewise.
- * gui/e-meeting-time-sel.c: Likewise.
- * gui/e-tasks.c: Likewise.
- * gui/e-timezone-entry.c: Likewise.
- * gui/e-week-view.c: Likewise.
- * gui/gnome-cal.c: Likewise.
- * gui/goto.c: Likewise.
- * gui/itip-utils.c: Likewise.
- * gui/print.c: Likewise.
- * gui/tasks-control.c: Likewise.
- * gui/tasks-migrate.c: Likewise.
-
- * gui/cal-search-bar.c: Use g_object_new() instead of
- gtk_type_new().
- * gui/calendar-model.c: Likewise.
- * gui/calendar-view-factory.c: Likewise.
- * gui/calendar-view.c: Likewise.
- * gui/calendar-view.c: Likewise.
- * gui/comp-editor-factory.c: Likewise.
- * gui/e-calendar-table.c: Likewise.
- * gui/e-cell-date-edit-text.c: Likewise.
- * gui/e-comp-editor-registry.c: Likewise.
- * gui/e-day-view.c: Likewise.
- * gui/e-itip-control.c: Likewise.
- * gui/e-meeting-attendee.c: Likewise.
- * gui/e-meeting-attendee.c: Likewise.
- * gui/e-meeting-model.c: Likewise.
- * gui/e-meeting-time-sel.c: Likewise.
- * gui/e-tasks.c: Likewise.
- * gui/e-timezone-entry.c: Likewise.
- * gui/e-week-view.c: Likewise.
- * gui/gnome-cal.c: Likewise.
- * gui/weekday-picker.c: Likewise.
-
- * gui/e-itip-control.c (get_servers): g_object_unref the
- shell_client instead of using bonobo_object_unref().
-
- * gui/component-factory.c (owner_set_cb): Use
- evolution_shell_client_corba_objref() instead of
- bonobo_object_corba_objref().
-
-2002-11-08 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/calendar-commands.c: Use g_signal_connect() instead of
- gtk_signal_connect().
- * calendar-commands.c: Likewise.
- * calendar-config.c: Likewise.
- * calendar-model.c: Likewise.
- * comp-editor-factory.c: Likewise.
- * component-factory.c: Likewise.
- * control-factory.c: Likewise.
- * e-calendar-table.c: Likewise.
- * e-comp-editor-registry.c: Likewise.
- * e-day-view-time-item.c: Likewise.
- * e-day-view.c: Likewise.
- * e-itip-control.c: Likewise.
- * e-meeting-model.c: Likewise.
- * e-meeting-time-sel.c: Likewise.
- * e-tasks.c: Likewise.
- * e-timezone-entry.c: Likewise.
- * e-week-view.c: Likewise.
- * gnome-cal.c: Likewise.
- * goto.c: Likewise.
- * tasks-control.c: Likewise.
- * tasks-migrate.c: Likewise.
- * weekday-picker.c: Likewise.
-
-2002-11-08 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/calendar-offline-handler.c
- (calendar_offline_handler_class_init): GObjectified.
- (impl_finalize): Finalize impl.
- (impl_dispose): Dispose impl.
- (calendar_offline_handler_new): Use g_object_new().
- (backend_cal_opened): use g_signal_connect() instead of
- gtk_signal_connect().
- (backend_go_offline): Likewise.
- (backend_cal_opened): g_object_unref() instead of
- gtk_object_unref().
- (backend_go_offline): Likewise.
-
-2002-11-08 Rodrigo Moya <rodrigo@ximian.com>
-
- * importers/evolution-calendar-importer.h: use GLib macros.
-
- * importers/main.c (init_importer): use bonobo_generic_factory_new,
- not bonobo_generic_factory_new_multi.
- (main): don't use libgnome functions.
-
-2002-11-07 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/client-test.c: don't use GTK, we don't need it.
-
-2002-11-07 JP Rosevear <jpr@ximian.com>
-
- * Initial port of gui/ subdir to GNOME 2
-
-2002-11-07 Rodrigo Moya <rodrigo@ximian.com>
-
- * importers/icalendar-importer.c: removed non-existant headers.
-
- * importers/Makefile.am: changes for BonoboActivation.
-
- * gui/GNOME_Evolution_Calendar.server.in: install to $libdir, not
- $datadir.
-
-2002-11-07 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/query-listener.[ch]: converted to BonoboObject.
-
- * gui/dialogs/comp-editor-util.c (parse_contact_string): use glib's
- g_utf8_strchr.
-
- * gui/dialogs/delete-comp.c: removed non-existant headers. Use
- GtkStock instead of GnomeStock.
-
- * gui/dialogs/e-delegate-dialog.c: converted to BonoboActivation.
- (e_delegate_dialog_construct): adapted to changes in glade_xml_new.
-
-2002-11-07 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal.[ch]: converted to BonoboObject.
- (impl_Cal_get_query): bonobo_object_unref the query returned by
- cal_backend_get_query if we can't duplicate it.
-
- * pcs/query.[ch]:
- * pcs/cal-factory.[ch]: converted to BonoboObject.
-
- * pcs/query-backend.[ch]:
- * pcs/cal-backend-file.[ch]:
- * pcs/cal-backend.[ch]: GObjectify.
-
-2002-11-06 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/cal-prefs-dialog.c: #include gtkoptionmenu.h.
- (cal_prefs_dialog_new): adapted to changes in glade_xml_new.
-
- * gui/dialogs/event-page.h:
- * gui/dialogs/meeting-page.h:
- * gui/dialogs/recurrence-page.h:
- * gui/dialogs/schedule-page.h:
- * gui/dialogs/task-details-page.h:
- * gui/dialogs/task-page.h:
- * gui/cal-prefs-dialog.h: use correctly the macros.
-
- * gui/dialogs/cancel-comp.c:
- * gui/dialogs/changed-comp.c:
- * gui/dialogs/comp-editor-page.c:
- * gui/gnome-cal.h: removed non-existent headers.
-
- * gui/dialogs/comp-editor.c: remove non-existent headers.
- (close_dialog): gtk_widget_destroy the widget.
- (setup_widgets, comp_editor_merge_ui): use BonoboWindow correctly.
- (comp_editor_set_cal_client, comp_editor_send_comp,
- comp_editor_edit_comp): use G_OBJECT_GET_CLASS for
- getting the class of an object.
-
- * gui/dialogs/comp-editor-page.c (comp_editor_page_class_init):
- use g_signal_* functions.
-
- * gui/dialogs/comp-editor-util.c: converted to BonoboActivation.
-
- * gui/dialogs/comp-editor.h: #include bonobo-window.h, not
- bonobo-win.h.
-
-2002-11-06 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.server.in:
- * gui/GNOME_Evolution_Calendar.server.in: renmaed .oaf.in files.
-
- * gui/alarm-notify/Makefile.am:
- * gui/Makefile.am: fixed rules for .server files.
-
-2002-11-06 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/comp-editor-util.[ch]
- (comp_editor_connect_contacts_changed): don't return a
- Bonobo_EventSource_ListenerId, since it does not exist anymore,
- and was not even being used.
-
- * gui/e-timezone-entry.h: use GLib macros.
-
- * gui/dialogs/*.glade:
- * gui/alarm-notify/*.glade:
- * gui/*.glade: converted to Glade2 format.
-
-2002-11-05 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/alarm-options.c (alarm_options_dialog_run): adapted to
- to new glade_xml_new signature.
-
- * gui/calendar-model.h:
- * gui/dialogs/comp-editor-page.h:
- * gui/dialogs/alarm-page.[ch]: removed non-existant header files.
-
- * gui/dialogs/comp-editor-util.h: added missing headers.
-
-2002-11-05 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend.c: use libxml2 headers.
-
- * gui/alarm-notify/Makefile.am:
- * gui/dialogs/Makefile.am:
- * gui/Makefile.am: s/XML_I18N/INTLTOOL. Fixed execution of
- $(ORBIT_IDL).
-
- * gui/alarm-notify/alarm-notify.[ch]: converted to BonoboObject.
-
- * gui/alarm-notify/alarm-notify-dialog.c: compilation fixes.
- (alarm_notify_dialog): adapted to new glade_xml_new signature.
-
- * gui/alarm-notify/alarm-queue.c: ported to BonoboActivation and
- GtkStock and GtkDialog.
-
- * gui/alarm-notify/notify-main.c: ported to BonoboActivation and
- use GObject functions instead of GtkObject ones.
-
- * gui/alarm-notify/save.h: removed BonoboConfig related functions.
-
- * gui/alarm-notify/config-data.c: use GObject functions instead of
- GtkObject ones.
-
- * TODO.port: added file for keeping track of disabled things while we
- port.
-
-2002-11-04 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-util/cal-util-marshal.list: added new marshallers.
-
- * cal-client/cal-client.c (get_objects_atomically): fixed calls to
- g_signal_handler_disconnect_by_func.
- (cal_client_class_init): fixed typos.
-
- * cal-client/cal-client-multi.[ch]:
- * cal-client/cal-client-types.c:
- * cal-client/cal-query.[ch]: ported to GObject.
-
- * cal-client/cal-listener.[ch]: converted to BonoboObject.
-
- * cal-client/Makefile.am:
- * pcs/Makefile.am: fixed flags for orbit-idl
-
-2002-11-04 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-util/Makefile.am:
- * cal-util/cal-util-marshal.list: added marshallers.
-
- * cal-client/cal-client.[ch]: ported to GObject.
-
-2002-11-04 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-util/cal-component.[ch]: ported to GObject.
-
- * cal-util/cal-util.c (cal_util_generate_alarms_for_comp): use
- g_object_* instead of gtk_object_*.
-
-2002-11-03 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/cal-client.c (get_default_uri): use EConfigListener
- instead of BonoboConfig.
-
- * cal-client/cal-client.c:
- * cal-client/cal-listener.[ch]:
- * cal-client/query-listener.c: warning free.
-
-2002-11-03 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-util.[ch]: don't use BonoboConfig, but
- EConfigListener.
-
- * gui/calendar-config.c: use /apps/Evolution prefix for all
- configuration keys.
-
-2002-10-31 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-util/cal-component.[ch]:
- * cal-util/cal-recur.h:
- * cal-util/cal-util.[ch]:
- * cal-client/cal-client.h:
- * cal-client/cal-client-multi.h:
- * cal-client/cal-client-types.[ch]:
- * cal-client/cal-listener.h
- * cal-client/cal-query.[ch]:
- * cal-client/query-listener.h:
- * pcs/cal.h:
- * pcs/cal-backend.[ch]:
- * pcs/cal-backend-file.h:
- * pcs/cal-backend-util.h:
- * pcs/cal-common.h:
- * pcs/cal-factory.h:
- * pcs/query.[ch]:
- * pcs/query-backend.[ch]: started GNOME 2 porting.
- cal-util, cal-client and pcs compiled ok.
-
- * cal-client/cal-client.c (cal_client_construct):
- * pcs/cal-factory.c: use b-a instead of OAF and bonobo-config
- instead of bonobo-conf.
-
-2002-10-29 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (backend_died_cb): cleaned up the status bar
- messages for all widgets.
-
-2002-10-24 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (init): initialize new values
- (clean_up): free new values
- (find_my_address): if we have a delegator address, use it instead
- (write_html): display delegator info to user
- (show_current_event): if we have a calendar uri, use that and
- describe the event differently
- (show_current_todo): ditto
- (show_current): search for delegator X properties
- (e_itip_control_set_delegator_address): accessor
- (e_itip_control_get_delegator_address): ditto
- (e_itip_control_set_delegator_name): ditto
- (e_itip_control_get_delegator_name): ditto
- (e_itip_control_set_calendar_uri): ditto
- (e_itip_control_get_calendar_uri): ditto
-
- * gui/e-itip-control.h: add protos
-
- * gui/itip-utils.c (comp_from): use the first attendee as the from
- address for things other than request, cancel and add (use
- organizer) and publish (use default address)
-
-2002-10-23 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #32613
-
- * gui/component-factory.c (sc_user_create_new_item_cb): use the
- default calendar/tasks folder to activate the component editor.
- (get_data_uri): deal correctly with the URIs being used.
-
-2002-10-23 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (show_current): fix warning
-
-2002-10-22 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #32371
-
- * pcs/query.c (start_cached_query_cb): CORBA_exception_init the
- CORBA_Environment before using it.
-
-2002-10-22 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-factory.c (lookup_backend): use NULL for pointer instead of
- FALSE.
-
-2002-10-22 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (get_address): use e_config_listener_* to get
- values
- (itip_addresses_get): ditto
- (itip_addresses_get_default): ditto
-
- * gui/calendar-model.c (calendar_model_value_to_string): don't
- send back a null string (affects if it is the group header)
- (calendar_model_init): pre load config database info so we don't
- do corba calls during draws
-
- Fixes #32276
-
-2002-10-17 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_construct): fix c/p type
-
-2002-10-17 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/recurrence-page.c (fill_ending_date): if the value
- is a datetime, convert it to a date
-
- * gui/itip-utils.c (comp_compliant): convert an UNTIL date value
- to a datetime value
-
- * cal-util/cal-component.c (cal_component_has_simple_recurrence):
- check to see if the component recurrences meet our definition of
- "simple"
-
- * cal-util/cal-component.h: new proto
-
-2002-10-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/recurrence-page.c (fill_component): changed to have a
- gboolean return type, which is what it's supposed to do.
- (recurrence_page_fill_component): return the result from
- fill_component.
-
- * gui/dialogs/comp-editor-page.h: fixed typo in function prototype.
-
-2002-10-11 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c
- (gnome_calendar_on_date_navigator_selection_changed): try to
- preserve the work week view setting if it makes sense
- (set_view): don't update the info again based on our view change
- call
-
- Fixes #16036
-
-2002-10-08 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #11434
-
- * gui/dialogs/comp-editor-page.[ch]
- (comp_editor_page_display_validation_error): new function.
-
- * gui/dialogs/event-page.c (event_page_fill_component):
- * gui/dialogs/recurrence-page.c (fill_component):
- * gui/dialogs/task-details-page.c (task_details_page_fill_component):
- * gui/dialogs/task-page.c (task_page_fill_component): added
- checks for all date values, and return FALSE if we find
- some invalid date/times.
-
- * gui/dialogs/comp-editor.c (save_comp): activate the page that
- returns error in fill_component.
-
-2002-10-08 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.c
- (cal_prefs_dialog_create_time_edit): set the 24 hour format
- initially
-
- Fixes #31812
-
-2002-10-08 JP Rosevear <jpr@ximian.com>
-
- * gui/e-week-view.c: remove pilot settings from contextual menu
-
- * gui/e-day-view.c: ditto
-
-2002-10-07 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #31774
-
- * gui/dialogs/alarm-options.c (dalarm_widgets_to_alarm,
- palarm_widgets_to_alarm): use correct pointer in loop.
-
-2002-10-07 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.c (setup_changes): cast the correct
- item
-
-2002-10-07 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes crash in #19159
-
- * gui/alarm-notify/alarm-queue.c (lookup_queued_alarm): don't crash if
- we don't find the queued alarm in the internal list.
- (alarm_trigger_cb, create_snooze, display_notification,
- audio_notification, procedure_notification, remove_queued_alarm):
- check return value from lookup_queued_alarm.
-
-2002-10-04 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #15892
-
- * idl/evolution-calendar.idl: added notifyErrorOccurred method to
- the Listener interface, so that backends can notify clients of errors
- that can't be reported otherwise.
-
- * pcs/cal.[ch] (cal_notify_error): new function.
-
- * pcs/cal-backend-file.c (save): made to save to temporary file and
- then moved to the correct file, so that we don't lose any data if
- there's a problem while saving.
- (notify_error): new function for notifying error messages to clients.
-
- * cal-client/cal-listener.[ch]: added new callback function for getting
- error messages from backends.
- (impl_notifyErrorOccurred): new method implementation.
- (cal_listener_class_init): initialize new epv member.
- (cal_listener_init, cal_listener_destroy, cal_listener_construct,
- cal_listener_new): initialize new function pointer.
-
- * cal-client/cal-client.[ch]: adapted to changes in CalListener class.
- (cal_client_class_init): added "backend_error" signal to CalClient class.
- (backend_error_cb): callback for "error_occurred" signal on the CalListener,
- which just emits the "backend_error" signal of CalClient.
-
- * gui/gnome-cal.c (gnome_calendar_construct): connect to "backend_error"
- signal on the CalClient's we create.
- (backend_error_cb): display error message on error from backend.
-
- * gui/e-tasks.c: likewise.
-
-2002-10-02 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/notify-main.c (alarm_notify_factory_fn): removed
- unneeded g_assert which was preventing the alarm daemon to
- start correctly in some cases.
-
-2002-10-02 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #30057
-
- * cal-client/cal-client.c (cal_client_is_read_only): added check
- of the status of the client before trying to make CORBA calls.
-
- * gui/calendar-commands.c (sensitize_calendar_commands,
- sensitize_taskpad_commands):
- * gui/tasks-control.c (sensitize_commands):
- * gui/dialogs/event-editor.c (set_menu_sens):
- * gui/dialogs/task-editor.c (set_menu_sens):
- * gui/e-calendar-table.c (e_calendar_table_on_right_click):
- * gui/e-day-view.c (e_day_view_on_event_right_click):
- * gui/e-week-view.c (e_week_view_show_popup_menu): take into account
- the read-onlyness of clients to disable/enable menu items.
-
-2002-10-01 Rodrigo Moya <rodrigo@ximian.com>
-
- * idl/evolution-calendar.idl: added isReadOnly method to Cal
- interface.
-
- * pcs/cal.c (impl_Cal_is_read_only): new method implementation.
-
- * pcs/cal-backend.[ch]: added is_read_only method to CalBackend class.
- (cal_backend_is_read_only): new function.
-
- * pcs/cal-backend-file.c (cal_backend_file_is_read_only): new method.
- (cal_backend_file_class_init): set new signal's virtual method.
-
- * cal-client/cal-client.[ch] (cal_client_is_read_only): new function.
-
-2002-10-01 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #15710
-
- * gui/dialogs/alarm-page.c (alarm_page_init): added a
- X-EVOLUTION-NEEDS-DESCRIPTION property, so that we later set it
- correctly if it hasn't been set in the meanwhile (editing options for
- the alarm).
-
- * gui/dialogs/alarm-options.c (dalarm_widgets_to_alarm,
- palarm_widgets_to_alarm): removed X-EVOLUTION-NEEDS-DESCRIPTION
- property from alarms every time we set the description of the alarm.
-
-2002-10-01 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #30290
-
- * importers/icalendar-importer.c (process_item_fn): return a status of
- BUSY rather than NOT_READY, to avoid the display of the error message.
-
-2002-09-30 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c
- (calconduit_load_configuration): load multi_day_split
- (calconduit_save_configuration): save it
- (calconduit_dupe_configuration): copy it
- (e_cal_gui_new): create gui for it
- (e_cal_gui_fill_widgets): fill gui with value
- (e_cal_gui_fill_config): get value from gui and store in config
- (e_calendar_context_destroy): destroy new_cfg and gui properly
- (process_multi_day): skip item if its multi-day and we don't want
- to split
- (fill_widgets): fill local config widgets
- (create_settings_window): create local config widgets
- (save_settings): fill config from local widgets
-
- Fixes #23763
-
-2002-09-30 Aaron Weber <aaron@ximian.com>
-
- * gui/e-itip-control.c (update_item): adjust string on line 1609
- and 1517.
-
- * gui/dialogs/alarm-options.glade: rephrase string on line 270
-
-2002-09-27 Dan Winship <danw@ximian.com>
-
- * gui/calendar-commands.c (pixmaps): Remove "/Toolbar/New" and
- "/Toolbar/NewTask" since they're not there any more. Kills some
- bonobo-ui spewage.
-
-2002-09-26 Dan Winship <danw@ximian.com>
-
- Non-Connector part of #29334 (meeting created by a delegate in the
- delegator's calendar should have the delegator as Organizer).
-
- * idl/evolution-calendar.idl: add Cal_getEmailAddress, to return
- the email address associated with a backend (if any).
-
- * pcs/cal-backend.c (cal_backend_get_email_address): New.
-
- * pcs/cal-backend-file.c (cal_backend_file_get_email_address):
- Return NULL (for now).
-
- * pcs/cal.c (impl_Cal_get_email_address): Implement this by
- calling cal_backend_get_email_address and returning a NotFound
- exception if it returns NULL.
-
- * cal-client/cal-client.c (cal_client_get_email_address): New.
- (cal_client_init, cal_client_destroy, etc): initialize/free
- email_address
-
- * gui/dialogs/event-editor.c (event_editor_construct): Split this
- out of event_editor_init. Take and set a CalClient.
- (event_editor_new): Take a CalClient.
-
- * gui/dialogs/task-editor.c (task_editor_construct,
- task_editor_new): Likewise.
-
- * gui/dialogs/meeting-page.c (meeting_page_new,
- meeting_page_construct): Take a CalClient and call
- cal_client_get_email_address to find the default organizer
- address. (Also fix a bug if the default account's name has
- non-ASCII characters.)
-
- * gui/itip-utils.c (comp_from): New. When sending a REQUEST or
- CANCEL, use the Organizer as the From address.
- (itip_send_comp): Call comp_from and pass the result to
- Composer_setHeaders.
-
- * gui/comp-editor-factory.c (edit_existing, edit_new): Pass the
- CalClient to event_editor_new/task_editor_new
-
- * gui/e-calendar-table.c (open_task): Likewise.
-
- * gui/e-tasks.c (e_tasks_new_task): Likewise.
-
- * gui/gnome-cal.c (gnome_calendar_edit_object,
- gnome_calendar_new_task): Likewise.
-
-2002-09-26 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-model.c (set_value_at): only change the attendee
- value if it isn't empty
-
-2002-09-26 Rodrigo Moya <rodrigo@ximian.com>
-
- Should fix once for all #24210
-
- * idl/evolution-calendar.idl: changed the notifyObjUpdated method
- of the QueryListener interface accept a list of UIDs.
-
- * cal-client/query-listener.[ch] (impl_notifyObjUpdated): likewise for
- the QueryListener class.
-
- * cal-client/cal-query.c (obj_updated_cb): changed to adapt the
- multiple-id's received in the QueryListener class' signal to the
- one-by-one update notification of the public CalQuery class, thus
- keeping the changes needed for this minimal.
-
- * pcs/query.c (add_component, start_cached_query_cb): changed to
- send sequences of UIDs.
-
-2002-09-25 Dan Winship <danw@ximian.com>
-
- * gui/component-factory.c (folder_types): Add "calendar/public"
- and "tasks/public".
- (type_is_calendar, type_is_tasks): New utility functions
- (create_view, create_folder, remove_folder, xfer_folder,
- sc_user_create_new_item_cb): Use type_is_calendar/type_is_tasks
-
- * importers/icalendar-importer.c (get_uri_from_folder_path): allow
- importing into public calendar/task folders too.
-
- * gui/e-itip-control.c: Note that it's intentional that we use
- "calendar" and "tasks" here instead of "calendar/*" and "tasks/*".
- (31032)
-
-2002-09-25 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (itip_send_comp): if the item being sent is not
- a meeting, send it as a mixed item with a description and the
- calendar text in an attachment
-
- Fixes #30638
-
-2002-09-25 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #27961
-
- * pcs/cal-backend-file.c (cal_backend_file_update_object): set the
- LAST-MODIFIED time of the components when we save them.
-
-2002-09-24 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-file.c (cal_backend_file_get_timezone_object,
- cal_backend_file_get_timezone): return a builtin timezone if we
- don't find the timezone in our component.
-
-2002-09-24 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (comp_from_remote_record):
- make sure the start/end for no time palm events are DATE values,
- tidy code slightly
-
- Fixes #21631
-
-2002-09-24 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (process_multi_day):
- convert to date values if the original start and end were both
- dates
-
-2002-09-24 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/cal-query.c (cal_query_destroy): unref the query
- since now the query object on the server keeps a copy of it and
- must know when the listener is no longer valid.
-
- * pcs/query.c (listener_died_cb): unref the QueryListener object.
- (query_construct): create an EComponentListener for the non-cached
- queries' listeners also.
-
-2002-09-23 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/Makefile.am: add libeutil to the link
-
- * conduits/calendar/Makefile.am: ditto
-
-2002-09-23 Dan Winship <danw@ximian.com>
-
- * pcs/cal.c (imple_Cal_update_objects, impl_Cal_remove_object):
- fix non-ANSI switch statements.
-
- * gui/e-meeting-model.c (is_cell_editable, value_is_empty,
- process_free_busy_comp): Likewise
-
- * gui/itip-utils.c (comp_compliant): Likewise.
-
-2002-09-23 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/main.c (launch_alarm_daemon): install an idle callback that will
- start the alarm daemon.
- (launch_alarm_daemon_cb): actually activate the alarm daemon here.
-
- * pcs/query.c (start_cached_query_cb): remove timeout function always
- and re-add it if the query is in progress.
-
-2002-09-23 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/query.c (start_cached_query_cb): move success notification code
- to its own code block, since it was being run for parse errors also.
- Also, remove all traces of the query from the cache if there is an
- error. Also, use GINT_TO_POINTER instead of GPOINTER_TO_INT.
-
-2002-09-23 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #28310
-
- * gui/alarm-notify/save.c (save_notification_time): only save the
- new notification time if it is bigger than the already saved one.
- This should avoid some reminders showing up twice.
-
-2002-09-20 JP Rosevear <jpr@ximian.com>
-
- * gui/comp-util.c (cal_comp_is_on_server): check to see if the
- component is already on the server or not
-
- * gui/comp-util.h: change proto
-
- * gui/e-week-view.c (e_week_view_on_editing_stopped): only delete
- the event if the summary is empty and the component is not already
- on the server
-
- * gui/e-day-view.c (e_day_view_on_editing_stopped): same
-
- Fixes #14111
-
-2002-09-20 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/meeting-page.c (meeting_page_fill_widgets): set the
- deleted attendees array to size 0 after we clean it up
-
- Fixes #30479
-
-2002-09-20 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/query.c (parse_sexp): remove the query from the cache if it
- failed.
- (start_cached_query_cb): notify of errors in the query.
-
-2002-09-19 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/query.c: added a list of EComponentListener's to control the
- lifetime of the listeners.
- (query_init): initialize new member.
- (query_destroy): free new member.
- (start_cached_query_cb): create a EComponentListener for the new
- listener being added.
-
-2002-09-19 Rodrigo Moya <rodrigo@ximian.com>
-
- More fixes for #24210
-
- * pcs/query.c: added list of cached queries and changed the Query
- class to work with several listeners, not only one.
- (query_init): initialize new members.
- (query_destroy): free new members.
- (add_component, remove_component, parse_sexp, match_component,
- process_components_cb): notify all listeners.
- (notify_uid_cb, start_cached_query_cb): implemented integration of
- cached queries.
- (query_new): search the query in the cache before creating a new
- one. And if we create a new one, store it in the cache.
-
-2002-09-19 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/recurrence-page.c (simple_recur_to_comp): bump the
- month_num by 1 because it indexs at 0
- (recurrence_page_fill_widgets): lower the month_num by one as above
-
- Fixes #30381
-
-2002-09-17 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #26362
-
- * gui/e-itip-control.c (show current): add a default reminder if
- default reminders are set in the configuration.
-
-2002-09-11 JP Rosevear <jpr@ximian.com>
-
- * gui/e-day-view.c (e_day_view_on_top_canvas_button_press): keep
- the selection if we right click in it (but not on an appointment)
- (e_day_view_on_main_canvas_button_press): ditto
-
- * gui/e-week-view.c (e_week_view_on_button_press): same
-
-2002-09-11 JP Rosevear <jpr@ximian.com>
-
- * gui/e-week-view.c (e_week_view_new_appointment): create a new
- appointment based on the selection
- (e_week_view_on_button_press): use above
- (e_week_view_on_new_appointment): ditto
- (e_week_view_on_new_meeting): ditto
-
- Fixes #18162
-
-2002-09-10 JP Rosevear <jpr@ximian.com>
-
- * gui/comp-editor-factory.c (get_default_event): duh, don't
- blindly increment the hour without adjusting for the day
- boundaries
-
- Fixes #29983
-
-2002-09-10 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #24032
-
- * gui/e-itip-control.c (init): don't get servers here, since we don't
- know the type of the component(s) to be loaded.
- (show_current): get servers here.
- (destroy): only free stuff that needs to be freed.
-
-2002-09-09 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (client_cal_opened_cb): display status messages for
- all operations we make, so that when using remote slow backends, so
- that users have always indication of what's happening.
-
-2002-09-06 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_edit_object): kill warning
-
- * gui/e-week-view.h: new proto
-
- * gui/e-week-view.c (e_week_view_set_selected_time_range_visible):
- select a range of time in the currently visible area, if out side
- the visible area, select as much as possible
- (e_week_view_on_text_item_event): call above
-
- * gui/e-week-view-event-item.c
- (e_week_view_event_item_button_press): call above
-
- * gui/e-day-view.c
- (e_day_view_set_selected_time_range_in_top_visible): select a
- range of time in the currently visible area, if out side the
- visible area, select as much as possible
- (e_day_view_set_selected_time_range_visible): the same for the
- main canvas
- (e_day_view_on_long_event_button_press): call above
- (e_day_view_on_event_button_press): ditto
-
-2002-09-05 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (itip_send_comp): don't try to send via the
- server if we are publishing; don't bail out on a 0 length to list
- if we are publishing
-
-2002-09-05 Anna Marie Dirks <anna@ximian.com>
-
- * gui/GNOME_Evolution_Calendar.oaf.in: Changed the description of
- the calendar/tasks page of the settings dialog, to be hopefully
- more descriptive and less awkwardly worded.
-
-
-2002-09-05 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view.c (e_day_view_on_drag_data_get): added support for
- text/x-calendar targets, in which case a VCALENDAR component, with
- full timezone information is returned.
-
-2002-09-04 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_destroy): don't listen to client
- signals after we get destroyed
-
- Fixes #17036
-
-2002-09-04 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/event-editor.c (event_editor_send_comp): bail out if
- we couldn't send the cancel
-
- * gui/dialogs/task-editor.c (task_editor_send_comp): ditto
-
- * gui/dialogs/comp-editor.c (save_comp_with_send): indicate send
- status
- (real_send_comp): return success/fail, only resave the component a
- if we successfully sent
- (comp_editor_send_comp): return success/fail
-
- * gui/itip-utils.h: update proto
-
- * gui/itip-utils.c (itip_send_comp): return true if we sent the
- message
-
-2002-09-04 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (comp_server_send): provide error message
- param, give a dialog with the message if we get a busy result;
- return TRUE if we succeed
- (itip_send_comp): bail out if we had a problem sending via the
- server
-
- * cal-client/cal-client.c (cal_client_send_object): pass back
- error message if we get the busy exception in the new param
-
- * cal-client/cal-client.h: update proto
-
- * pcs/cal.c (impl_Cal_send_object): dump backend error message
- into Busy exception
-
- * pcs/cal-backend.h: update proto
-
- * pcs/cal-backend.c (cal_backend_send_object): take/pass new error
- message parameter
-
- * pcs/cal-backend-file.c (cal_backend_file_send_object): take new param
-
- * idl/evolution-calendar.idl: add errorMsg to Busy exception
-
-2002-09-04 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component-factory.c (create_object): Pass NULL as
- @unpopulate_folder_context_menu_fn to
- evolution_shell_component_new().
-
-2002-09-03 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (comp_compliant): don't make the reply
- component minimal
-
- Fixes #28956
-
-2002-08-30 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (itip_send_comp): make the sure to list is 0
- length before sending via imip
-
- Fixes #29624
-
-2002-08-30 Mike Kestner <mkestner@ximian.com>
-
- * gui/dialogs/event-page.c:
- * gui/dialogs/task-page.c: use bonobo_object_release_unref to release
- the remote SelectNames component, not CORBA_Object_release.
-
-2002-08-29 JP Rosevear <jpr@ximian.com>
-
- * gui/e-day-view.c (e_day_view_on_top_canvas_button_press): select
- the top canvas if the user right-clicks on it
- (e_day_view_on_main_canvas_button_press): select the row the user
- is right-clicking on
- (e_day_view_on_long_event_button_press): select the top canvas if
- the user right-clicks on an event there
- (e_day_view_on_event_button_press): select the relevant rows if
- the user right-clicks on an event
- (e_day_view_set_selected_time_range_in_top): select a number of
- days in the top canvas
-
- * gui/e-week-view.c (e_week_view_on_button_press): select the day
- the user is right-clicking on
- (e_week_view_on_text_item_event): select the corresponding time
- range when showing the contextual menu for an event
-
- * gui/e-week-view-event-item.c
- (e_week_view_event_item_button_press): select the corresponding
- time range when showing the contextual menu for an event
-
- Fixes #14660
-
-2002-08-28 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view.c:
- * gui/e-week-view.c: added missing header file.
-
-2002-08-28 Dan Winship <danw@ximian.com>
-
- * gui/GNOME_Evolution_Calendar.oaf.in: Add an
- evolution:shell_component_launch_order and rename
- evolution:shell_component_icon.
-
-2002-08-27 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-config.c: use EConfigListener instead of direct access
- to the bonobo-conf database.
- (calendar_config_init): create the EConfigListener here, and install
- an atexit function to unref the config listener object.
- (config_read, property_change_cb, calendar_config_write,
- calendar_config_write_on_exit): removed unneeded functions.
- (calendar_config_get_*, calendar_config_set_*): changed to make use of
- EConfigListener directly.
-
- * gui/main.c (main): removed call to calendar_config_write_on_exit.
-
- * gui/dialogs/cal-prefs-dialog.c (update_config): removed call to
- calendar_config_write.
-
-2002-08-26 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #12326
-
- * gui/alarm-notify/config-data.c (ensure_inited): create a
- EConfigListener for configuration access.
- (do_cleanup): g_atexit installed function, to clean up configuration
- database resources.
- (config_data_get_timezone): retrieve the configuration for the
- EConfigListener object.
- (config_data_get_listener): new function.
-
- * gui/alarm-notify/save.c (get_config_db, discard_config_db): removed.
- Use EConfigListener instead.
- (save_notification_time, get_saved_notification_time,
- save_calendars_to_load, get_calendars_to_load, save_blessed_program,
- is_blessed_program): use EConfigListener.
-
- * gui/alarm-notify/notify-main.c (init_alarm_notify_service): removed.
- (alarm_notify_factory_fn): create here the alarm_notify_service if it
- hasn't been created yet.
- (load_calendars): likewise.
- (main): don't call init_alarm_notify_service.
-
-2002-08-22 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-model.c (process_section): if its a
- non-participant, add it as a resource to match dialog label
- (set_value_at): if the type is set to be a resource, switch the
- role to non-participant by default
-
-2002-08-22 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-model.c (set_completed): if the value given is a
- date, convert to a time in the current zone
-
-2002-08-20 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-control.c (tasks_control_activate): don't set the
- tasks ui component until the container is set, remove unused
- pixmaps
-
-2002-08-19 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-model.c (destroy): disconnect destroy signal
- callbacks on tables
-
- Fixes #28231
-
-2002-08-19 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (comp_toplevel_with_zones): clone the ical
- component before adding it
-
- Fixes #29061
-
-2002-08-19 JP Rosevear <jpr@ximian.com>
-
- * gui/comp-editor-factory.c (get_default_event): make sure to get
- the date in the current zone, not at UTC
-
- Fixes #17692
-
-2002-08-19 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (set_date_label): stop adding redundant
- information for start/end/due/complete times
- (write_html): convert newlines properly and escape characters for
- summary, location, description; put text information on separate
- line from bolded title to make it look nicer when there are line
- breaks
-
- Fixes #26964
-
-2002-08-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/cal-client.[ch]: added internal EComponentListener
- object, to listen for the activated Cal.
- (cal_client_class_init): added "backend_died" signal.
- (cal_client_destroy): clean up component listener.
- (backend_died_cb): new callback for getting signals from the
- EComponentListener.
- (cal_opened_cb): setup component listener.
-
- * cal-client/Makefile.am: added libetuil to needed LIBS.
-
- * gui/gnome-cal.c (backend_died_cb): new callback.
- (gnome_calendar_construct): connect to "backend_died" signal
- on all CalClient's we create.
-
-2002-08-14 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.c (init_widgets): listen for the
- time editors to change
- (cal_prefs_dialog_start_of_day_changed): make sure the start is
- never after the end
- (cal_prefs_dialog_end_of_day_changed): make sure the end is never
- after the start
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_set_working_hours): make sure to show a
- minimum of 1 hour for work day
-
- * gui/e-day-view-main-item.c (e_day_view_main_item_draw):
- calculate the work/not working color boxes to the nearest pixel,
- rather the the nearest time division
-
- Fixes #10286, #26285
-
-2002-08-13 Dan Winship <danw@ximian.com>
-
- * gui/e-itip-control.c: Remove a bunch of old #if 0 code.
- (update_item): Set X-MICROSOFT-CDO-REPLYTIME here.
-
- * gui/itip-utils.c (comp_toplevel_with_zones): Don't set it here.
-
- * cal-util/cal-component.c (ensure_mandatory_properties): Use
- icaltime_current_time_with_zone rather than rolling our own.
- (cal_component_strip_errors): Remove unused variable.
-
-2002-08-13 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_open): set status message on
- ECalendarTable when opening the tasks.
- (client_cal_opened_cb): set ECalendarTable status message to NULL
- when we open the tasks folder. Also, clear up calendar status message
- in all cases, not only if the folder was opened successfully.
-
-2002-08-13 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_open): set status message to NULL
- if there is an error opening the calendar.
- (client_cal_opened_cb): set status message to NULL only when we have
- successfully opened the main CalClient.
-
-2002-08-09 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor.c (real_send_comp): set the editor to
- changed so the item actually gets saved
-
-2002-08-08 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (users_has_attendee): check for an attendee in
- the list
- (comp_to_list): only add the user if they aren't on the list
- (comp_server_send): don't remove the users, pass back the list
- (itip_send_comp): send to server before doing comp_minimal
-
- * gui/dialogs/comp-editor.c (real_send_comp): edit and save the
- updated comp
-
- * pcs/cal.c (impl_Cal_send_object): copy the correct item to pass
- back
-
-2002-08-08 Dan Winship <danw@ximian.com>
-
- * pcs/query-backend.c (query_backend_new): Initialize
- loaded_backends before using it. (Just kills off a harmless
- g_warning.)
-
-2002-08-08 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #15710
-
- * cal-util/cal-component.[ch]
- (cal_component_alarm_get_icalcomponent): new function for getting
- the icalcomponent from a CalComponentAlarm.
-
- * gui/comp-util.c (cal_comp_event_new_with_defaults): added
- X-EVOLUTION-NEEDS-DESCRIPTION property to the default reminder
- alarm, so that we can identify it when saving the component.
-
- * gui/dialogs/alarm-page.c (alarm_page_fill_component): if the
- alarm has the X-EVOLUTION-NEEDS-DESCRIPTION property, set the
- description to be the same as of the component.
-
-2002-08-07 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal-backend-file.c (cal_backend_file_send_object): just
- return the object untouched since we don't send anything
-
- * pcs/cal-backend.c (cal_backend_remove_object): call virtual method
-
- * pcs/cal-backend.h: add send result codes, new proto
-
- * pcs/cal.c (impl_Cal_send_object): implement sendObject corba call
- (cal_class_init): add to epv
-
- * gui/itip-utils.c (comp_toplevel_with_zones): utility function to
- create icalcomponent with necessary timezone info
- (comp_has_attendee): see if attendee is in the attendee list
- (comp_server_send): use above and remove attendees if the server
- sends them
-
- * gui/e-itip-control.c (show_current_todo): remove unused var
-
- * idl/evolution-calendar.idl: add Busy exception and
-
- * cal-client/cal-client.c (cal_client_send_object): send object
- via the server (if the server can)
-
- * cal-client/cal-client.h: add send results and new proto
-
-2002-08-05 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/query-backend.[ch] (query_backend_get_object_component): new
- function.
- (query_backend_get_uids): new function.
- (query_backend_new): create the static GHashTable if it hasn't been
- created yet.
- (query_backend_destroy): destroy the static GHashTable if empty.
- (foreach_uid_cb): call object_updated_cb, which does everything.
-
- * pcs/query.c: make use of the new QueryBackend class.
- (query_init): initialize new private structure member.
- (query_destroy): clean up new member, without freeing it, since it is
- managed internally in query-backend.c.
- (query_construct): create a QueryBackend for the query.
-
-2002-08-04 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes the crash in #19159
-
- * gui/alarm-notify/alarm-queue.c (create_snooze): check for NULL
- pointers before using them.
-
-2002-08-02 JP Rosevear <jpr@ximian.com>
-
- * gui/e-week-view.c (e_week_view_init): don't warn if we can't use
- the small font, just set use_small_font to FALSE
-
-2002-08-02 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (adjust_item): new util function to add
- information to an itip message that might not already be there for
- display purposes (summary, location, etc)
- (show_current_event): use above
- (show_current_todo): ditto
-
-2002-08-02 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-model.c (init): initialize value to corba nil
-
-2002-08-01 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component-factory.c (create_object): Use
- meeting-request-16.png instead of meeting-request.png.
-
- * gui/calendar-commands.c (pixmaps): Remove pixmaps in
- /menu/File/New/NewFirstItem/.
-
-2002-08-01 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-model.c (is_overdue): use get_due_status
- (get_color): ditto
- (get_due_status): utility function to reduce replicated code,
- handle the case where the due date is just a date
-
-2002-07-31 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/query-backend.[ch]: new class for implementing a backend cache
- for the calendar queries.
-
- * pcs/Makefile.am: added new files.
-
-2002-07-31 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component-factory.c (create_object): Change the order of the
- user creatable items a bit so that "New Appointment" and "New
- Meeting" are at the top when in a calendar folder.
-
-2002-07-31 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component-factory.c (add_creatable_item): New arg
- @folder_type, pass it to
- evolution_shell_component_add_user_creatable_item().
- (create_object): Set the right folder types for the various
- user-creatable items.
-
-2002-07-31 JP Rosevear <jpr@ximian.com>
-
- * gui/e-tasks.c (e_tasks_destroy): we no longer need to manually
- save the state
- (e_tasks_open): we no longer need to manually load the state
- (display_view_cb): attach the gal view to the table
-
- Fixes #27894
-
-2002-07-29 JP Rosevear <jpr@ximian.com>
-
- * gui/e-day-view.c (e_day_view_find_work_week_start): make sure
- that the work week view goes to the current work week if the day
- selected is before the start of the work week
-
- Fixes #20317
-
-2002-07-28 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/task-details-page.c: fixed mapping of popdown menu
- to ICAL_STATUS_ values.
- (task_details_page_fill_widgets): when we can't set the status,
- default to ICAL_STATUS_NONE, which maps to 'Not started'. Fixed
- use of 'percent' variable, which was being used after being freed.
- (percent_complete_changed): default to ICAL_STATUS_NONE (Not Started).
-
- * gui/dialogs/task-details-page.glade: added 'Needs Action' to
- popdown menu values.
-
-2002-07-26 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-util/cal-util.[ch] (cal_util_add_timezones_from_component):
- new function for adding VTIMEZONE components to a VCALENDAR
- component.
-
- * gui/e-calendar-table.c (copy_row_cb): added VTIMEZONE components
- to resulting VCALENDAR top-level component.
-
- * gui/e-week-view.c (e_week_view_copy_clipboard): copy to the
- clipboard a top-level VCALENDAR component, with all the needed
- VTIMEZONE components.
- (e_week_view_on_copy): likewise.
-
- * gui/e-day-view.c (e_day_view_copy_clipboard): likewise.
- (e_day_view_on_copy): likewise.
-
-2002-07-26 JP Rosevear <jpr@ximian.com>
-
- * cal-client/cal-client.c (cal_client_construct): remove useless
- debug statement
-
- Probably fixes #19333
-
-2002-07-26 JP Rosevear <jpr@ximian.com>
-
- * gui/comp-editor-factory.c (impl_editExisting): focus the editor
- if it does exist, create a new one if it doesn't (not vice-versa)
-
- Fixes #23468
-
-2002-07-25 JP Rosevear <jpr@ximian.com>
-
- * gui/e-day-view.c (e_day_view_init): set large_font to NULL
- (e_day_view_style_set): calculate large font, fall back to the
- style->font if necessary
-
- Fixes #11773
-
-2002-07-24 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (write_html): display the location in the
- itip information
-
- Fixes #24690
-
-2002-07-24 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-model.c (set_percent): set status to in progress if
- the percent is between 0 and 100
- (set_status): if the value is set to in process, change the
- percent to 50
-
- Fixes #1590
-
-2002-07-24 JP Rosevear <jpr@ximian.com>
-
- * cal-util/timeutil.c (time_day_of_year): add a day for the leap
- year only if we are currently counting Feb., not if the month
- passed in is Feb. Fixes #23446.
-
-2002-07-23 JP Rosevear <jpr@ximian.com>
-
- * gui/e-day-view.c (e_day_view_realize): use proper meeting icon
-
-2002-07-22 Dan Winship <danw@ximian.com>
-
- * pcs/Makefile.am: Split pcs-backend-file out of libpcs and build
- it as a separate (noinst) library libpcsfile.a. This gets the db3
- dependencies out of libpcs, and people trying to create a calendar
- backend shouldn't be calling functions from the existing backends
- anyway so there's no reason to install them.
-
- * cal-util/timeutil.c: Replace a bunch of old gnomecal functions
- with the functionally identical ones from Connector.
-
-2002-07-18 Rodrigo Moya <rodrigo@ximian.com>
-
- * importers/icalendar-importer.c (get_uri_from_folder_path): if
- there's an exception, continue with the next item.
-
-2002-07-08 Peter Williams <peterw@ximian.com>
-
- * cal-util/Makefile.am: Install libcal-util-static.la
- and fix the -all-static flag to make it install statically.
-
- * pcs/Makefile.am: Install libpcs.a and its headers.
-
- * pcs/cal-backend-util.h: Same sort of include namespacing fix,
- but for pcs.
-
- * pcs/cal.h:
- * pcs/query.h:
- * pcs/cal-factory.h:
- * pcs/cal-backend.h:
- * pcs/cal-backend-file.h: Same.
-
-2002-07-17 <jpr@ximian.com>
-
- * gui/calendar-model.c (calendar_model_value_at): use util
- function to see if the user is the organizer
-
- * gui/dialogs/cancel-comp.c (cancel_component_dialog): add
- deleting proto to indicate whether cancelling or deleting is the
- primary operation
-
- * gui/dialogs/cancel-comp.h: update proto
-
- * gui/dialogs/comp-editor.c (delete_cmd): offer to cancel
-
- * gui/dialogs/task-editor.c (cancel_task_cmd): call
- cancel_component_dialog with new param
-
- * gui/dialogs/event-editor.c (cancel_meeting_cmd): ditto
-
- * gui/e-week-view.c (e_week_view_on_editing_stopped): only update
- request if user is organizer
- (e_week_view_show_popup_menu): disable the meeting and meeting
- organizer mask if appropriate
- (e_week_view_delete_event_internal): offer to cancel the meeting
- (e_week_view_on_cut): ditto
- (selection_received): send request if its a meeting
-
- * gui/e-day-view.h: add meeting icon/mask
-
- * gui/e-day-view.c (e_day_view_on_event_right_click): disable the
- meeting and meeting organizer mask if appropriate
- (e_day_view_delete_event_internal): offer to cancel meeting
- (e_day_view_on_cut): ditto
- (e_day_view_finish_long_event_resize): only update request if user
- is organizer
- (e_day_view_reshape_long_event): add meeting icon to count
- (e_day_view_reshape_day_event): ditto
- (e_day_view_on_top_canvas_drag_data_received): only update request
- if user is organizer
- (e_day_view_on_main_canvas_drag_data_received): ditto
- (selection_received): offer to send meeting info
-
- * gui/e-day-view-main-item.c
- (e_day_view_main_item_draw_day_event): draw meeting icon if
- appropriate (using dummy icon atm)
-
-2002-07-14 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #8001
-
- * importers/icalendar-importer.c (connect_to_shell): new function for
- connecting the importers (both iCal and vCal) to the shell, needed for
- some information retrieval about the folders we're importing to.
- (ical_importer_new, vcal_importer_new): call connect_to_shell.
- (importer_destroy_cb): unref the shell client object.
- (get_uri_from_folder_path): retrieve the uri from the storage
- registry.
- (check_folder_type): removed.
-
- * importers/Makefile.am: included libeshell to LIBS.
-
-2002-07-12 Peter Williams <peterw@ximian.com>
-
- * pcs/cal.c: Sigh, fix for the wombat.idl -> Evolution-Wombat.idl
- rename here too. At least grep indicates that's all that needs to
- be fixed.
-
-2002-07-08 Peter Williams <peterw@ximian.com>
-
- * gui/Makefile.am (INCLUDES): Change the -I flags to get
- it to play nicely with the new Ebook header paradigm.
-
- * gui/dialogs/Makefile.am: Same.
-
- * gui/e-meeting-model.c: More of the same.
-
- * gui/dialogs/e-delegate-dialog.c:
- * gui/dialogs/e-meeting-model.c:
- * gui/dialogs/comp-editor-util.c: Fix include lines to get
- ebook headers.
-
- * pcs/Makefile.am: Same.
-
-2002-07-02 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #16034
-
- * gui/e-day-view.c (e_day_view_reshape_long_event):
- (e_day_view_reshape_day_event):
- * gui/e-day-view-main-item.c (e_day_view_main_item_draw_day_event):
- * gui/e-week-view.c (e_week_view_reshape_event_span):
- * gui/e-week-view-event-item.c (e_week_view_event_item_draw_icons):
- Don't assume all categories have icons when allocating space for
- the icons.
-
-2002-07-02 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component-factory.c (add_creatable_item): New arg @tooltip.
- Pass it to evolution_shell_component_add_user_creatable_item(),
- which now has a @tooltip arg.
- (create_object): Added tooltips.
-
-2002-07-01 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-config.c (config_read): listen for timezone config
- change
- (property_change_cb): set the timezone if it changed elsewhere
-
- * gui/main.c (init_bonobo): call bonobo_activate because we make
- bonobo related calls before the bonobo_main call
-
-2002-06-25 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #25410
-
- * gui/alarm-notify.c (AlarmNotify_removeCalendar): do proper
- cleanup on removal of clients.
- (alarm_notify_add_calendar): ditto.
-
-2002-06-27 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (comp_compliant): plug leak and actually use
- the minimal comp we create
-
-2002-06-25 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor-page.h: add back proto
-
- * gui/dialogs/comp-editor-page.c
- (comp_editor_page_notify_needs_send): add page needs_send signal
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_on_invite_others_button_draw): check to
- see if the button should be sensitive when drawing
- (e_meeting_time_selector_construct): listen for the button draw
- signal
-
- * cal-util/cal-component.c (cal_component_strip_errors): remove
- X-LIC-ERROR x properties
-
- * cal-util/cal-component.h: new proto
-
- * gui/dialogs/meeting-page.c (change_clicked_cb): set needs_send
- to true
- (meeting_page_fill_widgets): set up gui based on if the user or
- someone else is the organizer
- (meeting_page_construct): read the addresses here for the combo
- box
- (get_widgets): explicitly set the value in list values
-
- * gui/dialogs/event-editor.c (set_menu_sens): base this on the
- exist org and user org values of the comp editor
- (event_editor_edit_comp): set up editable row restrictions on the
- meeting model if the user is not an organizer, and don't set needs
- send if we aren't the organizer initially
- (model_row_changed_cb): set needs_send to true
- (row_count_changed_cb): ditto
-
- * gui/dialogs/meeting-page.glade: update gui
-
- * gui/dialogs/comp-editor.c (save_comp_with_send): if the user is
- not the organizer, REPLY rather than REQUEST
- (comp_editor_set_existing_org): accessor
- (comp_editor_get_existing_org): ditto
- (comp_editor_set_user_org): ditto
- (comp_editor_get_user_org): ditto
- (real_edit_comp): determine if there is an existing organizer and
- if the organizers is a user
- (page_changed_cb): warn the user that changes may be discarded
- (page_summary_changed_cb): ditto
- (page_dates_changed_cb): ditto
-
- * gui/dialogs/comp-editor.h: new protos
-
- * gui/itip-utils.c (itip_organizer_is_user): determine if the
- organizer of a component is a user
- (itip_sentby_is_user): same for sentby field of organizer
- (comp_sentby): use above routines instead
- (comp_compliant): strip all X-LIC-ERROR fields generated by
- libical
-
- * gui/e-meeting-model.c (is_cell_editable): if there is a list of
- editable rows, allow only the status column of those rows to be
- edited
- (init): init edit_rows
- (e_meeting_model_restricted_add): add an editable row to the model
- (e_meeting_model_restricted_remove): remove an editable row
- (e_meeting_model_restricted_clear): clear all editable rows
- (e_meeting_model_etable_click_to_add): set the click to add arg on
- all tables
- (e_meeting_model_etable_from_model): track the tables
- (table_destroy_list_cb): remove the table being destroyed from the
- list
- (table_destroy_state_cb): remove the table being destroyed from
- the list
-
- * gui/e-meeting-model.h: new protos
-
- * gui/e-itip-control.c (update_attendee_status): kill warning
-
-2002-06-18 JP Rosevear <jpr@ximian.com>
-
- * zones.h: update for new zones
-
-2002-06-17 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes wombat crash (for JP and myself)
-
- * gui/gnome-cal.c (gnome_calendar_open): don't call add_alarms here,
- since the client is not yet attached to the backend, and the alarm
- daemon does unref the client before creating a new one.
- (client_cal_opened_cb): call add_alarms here.
-
-2002-06-12 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify.c: added timeout_id to LoadedClient structure, to
- keep track of the timeout function.
- (retry_timeout_cb): don't use RetryData, but the LoadedClient.
- (cal_opened_cb): ditto, and assigned lc->timeout_id to the return
- value of g_timeout_add().
- (alarm_notify_add_calendar): destroy the timeout callback when
- destroying the LoadedClient structure.
-
-2002-06-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * pcs/cal-factory.c (open_fn): Free the uri_string once we're done
- with it.
-
-2002-06-12 Kjartan Maraas <kmaraas@gnome.org>
-
- * gui/dialogs/cal-prefs-dialog.glade: Fix a typo.
-
-2002-06-10 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-notify.c (alarm_notify_add_calendar): removed
- already loaded client when asked to be opened again, and *really*
- re-open it again.
-
-2002-06-04 Christopher James Lahey <clahey@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_setup_view_menus):
- gal_view_menus_set_show_define_views (..., FALSE);
-
-2002-06-04 Christopher James Lahey <clahey@ximian.com>
-
- * gui/e-tasks.c (e_tasks_setup_view_menus), gui/gnome-cal.c
- (gnome_calendar_setup_view_menus): Set the title of our
- GalViewCollection.
-
-2002-06-03 Anna Marie Dirks <anna@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.glade: In an attempt to clean up the
- config dialog (and to reduce its overall girth), I have re-laid-out the
- calendar preferences dialog. It now conforms to standard Evolution
- spacing and padding guidelines, and exhibits proper alignment, etc.
-
-2002-06-03 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/query.c: keep a reference to the Query object, to avoid
- crashes when the queries are destroyed before finishing processing.
- Fixes #25056.
-
-2002-05-26 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor.h: update proto
-
- * gui/dialogs/comp-editor.c (comp_editor_get_comp): new function
- to get base comp
-
- * gui/e-comp-editor-registry.c (e_comp_editor_registry_add): get
- the base comp, not the current comp, don't unref it
- (foreach_close_cb): block the signal, unblock it if the editor
- could not be closed
- (e_comp_editor_registry_close_all): fix preconditions
- (editor_destroy_cb): get the base comp, not the current comp,
- don't unref it
-
-2002-05-26 JP Rosevear <jpr@ximian.com>
-
- * gui/e-comp-editor-registry.c (e_comp_editor_registry_close_all):
- if there are remaining items, return false
- (foreach_close_cb): don't remove the item if it couldn't be closed
-
- * gui/e-comp-editor-registry.h: update proto
-
- * gui/component-factory.c (request_quit): return a boolean
- indicating if everything was closed
-
- * gui/dialogs/comp-editor.h: update proto
-
- * gui/dialogs/comp-editor.c (comp_editor_close): return true if
- the editor was closed, false otherwise
-
-2002-05-26 JP Rosevear <jpr@ximian.com>
-
- * gui/e-comp-editor-registry.[hc]: a registry of comp editors so
- we can close them all centrally
-
- * gui/gnome-cal.c (gnome_calendar_init): there is no editor hash
- now
- (gnome_calendar_destroy): ditto
- (gnome_calendar_edit_object): look for the event editor in the
- registry, if it isn't there, create it and add it to the registry
-
- * gui/e-calendar-table.c (open_task): look for the task editor in
- the registry, if it isn't there, create it and add it to the
- registry
-
- * gui/component-factory.c (request_quit): close all open editors
- (create_object): add a request_quit function to the shell
- component
-
- * gui/comp-editor-factory.c (free_client): there is no
- uid_comp_hash to free any more
- (editor_destroy_cb): we get an OpenClient as callback data now,
- reduce the editor count and destroy it if it is 0
- (edit_existing): don't create the Component, add the new editor to
- the registry, increase the editor count
- (edit_new): ditto
- (open_client): set the editor count to 0
- (impl_editExisting): look in the registry for the editor
-
- * gui/Makefile.am: Build new sources
-
- * gui/main.c (main): create the registry
-
- * gui/dialogs/comp-editor.c (comp_editor_close): prompt to save
- and then close dialog
-
- * gui/dialogs/comp-editor.h: new proto
-
- * gui/GNOME_Evolution_Calendar.oaf.in: remove dead summary stuff
-
-2002-05-24 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-file.c (save): check the value returned by
- gnome_vfs_uri_to_string before using it.
- (cal_backend_file_open): ditto.
-
-2002-05-20 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/dialogs/event-editor.c (event_editor_init): Pass the
- @component_pixmaps in so we give the new "Meeting" button an icon.
-
- * gui/dialogs/comp-editor.c (comp_editor_merge_ui): New arg
- @component_pixmaps to pass in custom pixmaps.
-
-2002-05-20 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/alarm-notify/alarm-notify.c:
- * gui/alarm-notify/notify-main.c: ported changes from evolution-1-0
- to make it work with reminders on remote backends.
-
- * pcs/cal-backend-file.c (cal_backend_file_open): check the string
- returned by gnome_vfs_uri_to_string, which can be empty. If so,
- return an error.
-
-2002-05-17 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_setup_view_menus): set the view
- to the current view
-
-2002-05-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (client_cal_opened_cb): added support for
- CAL_CLIENT_OPEN_PERMISSION_DENIED error code.
- (permission_error): new function to display 'Permission Denied'
- error message when opening the calendar.
-
- * gui/e-tasks.c: likewise.
-
- * idl/evolution-calendar.idl: added PERMISSION_DENIED to Listener's
- OpenStatus enumeration.
-
- * cal-client/cal-client.c (cal_opened_cb): added code for retrieving
- 'Permission Denied' errors, and convert it to CalClientOpenStatus
- values.
-
- * pcs/cal-factory.c (open_backend): added code for informing of
- 'Permission Denied' errors.
-
-2002-05-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * idl/evolution-calendar.idl: added PermissionDenied exception and
- make it be raised in open, updateObjects and removeObject.
-
- * pcs/cal-backend.h: added CAL_BACKEND_OPEN_PERMISSION_DENIED to
- CalBackendOpenStatus enumeration, added CalBackendResult enumeration.
-
- * pcs/cal.c:
- * pcs/cal-backend.c:
- * pcs/cal-backend-file.c: adapted to changes in update_objects and
- remove_object methods.
-
- * cal-client/cal-client.[ch]: added CalClientResult enumeration.
- (cal_client_update_object, cal_client_update_objects,
- cal_client_remove_object): changed to return a CalClientResult.
-
- * conduits/calendar/calendar-conduit.c:
- * calendar/conduits/todo/todo-conduit.c:
- * importers/icalendar-importer.c:
- * gui/dialogs/comp-editor.c:
- * gui/calendar-model.c:
- * gui/e-calendar-table.c:
- * gui/e-day-view.c:
- * gui/e-itip-control.c:
- * gui/e-week-view.c:
- * gui/comp-util.c:
- * gui/e-tasks.c:
- * gui/tasks-migrate.c: adapted to changes in cal_client_update_object(s)
- and cal_client_remove_object.
-
-2002-05-15 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component-factory.c (create_object): Pass NULL as
- @request_quit_fn.
-
-2002-05-14 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/schedule-page.c (schedule_page_construct): set the
- working hours for the meeting time selector
-
-2002-05-14 JP Rosevear <jpr@ximian.com>
-
- * cal-util/cal-component.h: make the range datetime member a
- struct not a pointer
-
- * cal-util/cal-component.c (cal_component_get_recurid): take a
- pointer to a range
- (cal_component_set_recurid): ditto
-
- * gui/itip-utils.c (comp_minimal): get/set the recurrence id
- properly
-
-2002-05-09 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/e-itip-control.c (get_servers): use
- GNOME_Evolution_Storage__get_folderList instead of
- GNOME_Evolution_Storage_getFolderList since I have now changed
- that to be an attribute instead of a method.
-
-2002-05-07 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (start_calendar_server): start a server a
- uri
- (start_default_server): start a default server
- (get_servers): get all clients for all folders of the given
- type(s)
- (find_server): locate a server for a particular uid
- (init): get_servers, listen for object_requested signal
- (destroy): destroy all clients
- (write_html): put options is there own cell
- (get_publish_options): place selector in if param is true
- (get_request_options): ditto
- (get_real_item): only try and look up the item if we know its in
- the server
- (show_current_event): find the server (if any) for the current
- comp
- (show_current_todo): ditto
- (update_attendee_status): if there is no server for the comp, it
- doesn't exist
- (remove_item): ditto
- (button_selected_cb): get a client for the selected folder
- (object_requested_cb): draw the folder button in
-
- * gui/calendar-config.h: new protos
-
- * gui/calendar-config.c (calendar_config_default_tasks_folder):
- get default tasks uri
- (calendar_config_default_calendar_folder): get default calendar
- uri
-
- * cal-client/cal-client.c (get_default_uri): use
- cal_util_expand_uri
-
- * cal-util/cal-util.h: new proto
-
- * cal-util/cal-util.c (cal_util_expand_uri): tack on the file name
- if its a file uri
-
-2002-05-03 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-tasks.c (e_tasks_delete_selected):
- (e_tasks_complete_selected): show progress messages
- on the status bar.
-
-2002-05-02 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/query.c: #include <gtk/gtkmain.h> to avoid warnings.
-
-2002-05-02 JP Rosevear <jpr@ximian.com>
-
- * gui/e-week-view.c (free_view_popup): only discard the popup if
- we created one
-
-2002-05-02 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/query.c: refactored a bit, to not do things in idle loops.
-
-2002-05-01 JP Rosevear <jpr@ximian.com>
-
- * gui/print.c (print_day_details): modify the start and end hours
- to accomodate all the events in the day
-
- * gui/e-day-view.c (free_view_popup): only discard the popup if we
- created one
-
-2002-04-30 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_construct): remove setup_widgets
- from here
- (gnome_calendar_init): move setup_widgets back here
-
-2002-04-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/Makefile.am: Don't link to libibex anymore!!
-
-2002-04-24 JP Rosevear <jpr@ximian.com>
-
- * gui/e-day-view.c (e_day_view_on_pilot_settings): launch pilot
- settings capplet
-
- * gui/e-week-view.c (e_week_view_on_pilot_settings): ditto
-
-2002-04-24 JP Rosevear <jpr@ximian.com>
-
- * gui/e-week-view.c (free_view_popup): free the view popup
- (e_week_view_show_popup_menu): add the view popup to the
- "main_item" menu and listen for destruction
-
- * gui/e-day-view.c (free_view_popup): as above
- (e_day_view_on_event_right_click): as above
-
- * gui/e-week-view.h: add class member
-
- * gui/e-day-view.h: add a class member
-
- * gui/gnome-cal.h: new protos
-
- * gui/gnome-cal.c (set_view): set the instance view id properly
- when switching views
- (gnome_calendar_setup_view_popup): generate a view popup
- (gnome_calendar_discard_view_popup): destroy a view popup
-
-2002-04-22 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal.c (impl_Cal_get_alarms_in_range): raise an exception if the
- backend's method returns NULL, since we can't send a NULL pointer to
- ORBit.
-
-2002-04-19 Anna Marie Dirks <anna@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.glade: Collapsed notebook into two pages
- and added accelerators for everything, as part of my config dialog
- polishing project
-
-2002-04-18 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/recurrence-page.c (simple_recur_to_comp): properly
- handle -ve recurrence values
- (month_num_submenu_selection_done_cb): track the current date in
- use
- (make_recur_month_num_submenu): make a submenu of dates
- (make_recur_month_num_menu): make the date/relation option menu
- (month_num_menu_selection_done_cb): update the date properly and
- keep both option menus consistent
- (month_day_menu_selection_done_cb): keep both option menus
- consistent
- (make_monthly_special): listen for selection done signal
- (make_recurrence_special): destroy old month_num_menu
- (recurrence_page_fill_widgets): properly handle -ve recurrence
- values
-
-2002-04-18 JP Rosevear <jpr@ximian.com>
-
- * gui/e-day-view.c (e_day_view_on_settings): show the settings
-
- * gui/e-week-view.c (e_week_view_on_settings): ditto
-
- * gui/calendar-commands.c (control_util_show_settings): show the
- settings dialog
-
- * gui/calendar-commands.h: new proto
-
- * gui/control-factory.c (control_factory_new_control): set the
- control as object data on the calendar
-
-2002-04-17 Christopher James Lahey <clahey@ximian.com>
-
- * gui/e-calendar-table.c, gui/e-day-view.c, gui/e-week-view.c,
- gui/dialogs/meeting-page.c: Updated these to match the new
- EPopupMenu.
-
-2002-04-05 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend.[ch] (cal_backend_get_query): new method.
-
- * pcs/cal-backend-file.c (cal_backend_file_get_query): new method.
-
- * pcs/cal.c (impl_Cal_get_query): call the CalBackend's implementation
- instead of calling query_new directly.
-
- * pcs/query.[ch]: fixed headers.
-
-2002-04-10 Dan Winship <danw@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_open): Fix this: Rodrigo's patch
- used one of the functions I just removed. :)
-
-2002-04-10 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_open): use the default uri for
- tasks (as stored in the configuration) when the calendar URI is not
- a local one (connector, etc).
-
-2002-04-10 Dan Winship <danw@ximian.com>
-
- * cal-client/cal-client.c (get_default_uri): Use new-and-improved
- default folder URI config paths.
-
- * gui/calendar-config.c (calendar_config_{get,set}_default_uri,
- calendar_config_{get,set}_default_tasks_uri): Remove these. The
- shell owns this information now. (Weren't being used anyway.)
-
- * gui/component-factory.c (get_data_uri): Fix another place that
- hardcoded tacking foo.ics on to the end of URLs.
-
-2002-04-08 Dan Winship <danw@ximian.com>
-
- * gui/component-factory.c (create_view): Add view_info arg. If the
- view_info is non-empty and this is a calendar folder, set the
- "view" property on the control's propertybag.
-
- * gui/control-factory.c (calendar_properties_init): Set up the
- "view" property.
- (get_prop, set_prop): handle the "view" property by
- getting/setting the GnomeCalendar's view. Unfortunately, this
- doesn't actually work. See #23208.
-
- * gui/calendar-commands.c (calendar_control_activate): Set the UI
- component's container before calling
- gnome_calendar_set_ui_component so that the search bar
- initialization will work.
-
-2002-04-06 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal-backend-db.[hc]: Remove dead files.
-
-2002-04-06 JP Rosevear <jpr@ximian.com>
-
- * gui/GNOME_Evolution_Calendar.oaf.in: add config_item:type
-
-2002-04-01 Kjartan Maraas <kmaraas@gnome.org>
-
- * gui/e-itip-control.c: Fix a string.
-
-2002-04-01 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-db.c: simple fix for DB3 header inclusion in
- Mac OS X, by Max Horn <max@quendi.de>
-
-2002-03-31 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (clean_up): free the my_address member
- (find_my_address): fall back on a CN match if possible
- (change_status): handle changing the status of a non-existent
- address by adding a new attendee
- (update_attendee_status): if the attendee response is not from a
- user on the list of attendees, ask the user if they want to add
- the attendee any how (as an optional participant)
- (ok_clicked_cb): if we are suppose to rsvp and the status was ok,
- but the attendee address is not known, find it
-
-2002-03-29 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/GNOME_Evolution_Calendar.oaf.in: Set a priority for the
- config item. Rename to "Calendar and Tasks".
-
-2002-03-29 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/Makefile.am: s/libversit.la/libversit.a/
-
- * conduits/todo/Makefile.am: ditto
-
-2002-03-29 JP Rosevear <jpr@ximian.com>
-
- * gui/e-calendar-table.c: implement new pop up menu items for
- "Save as", "Print", "Assign Task", "Forward as iCalendar"
-
- * gui/e-day-view.c: similarly, also "Publish Free/Busy
- Information" and "New Meeting" and "New Task"
-
- * gui/e-week-view.c: ditto
-
- * gui/dialogs/task-editor.c (show_assignment): move the assignment
- page stuff here
- (task_editor_show_assignment): use it
- (assign_task_cmd): ditto
-
- * gui/dialogs/task-editor.h: new proto
-
- * gui/dialogs/comp-editor.c (save_as_cmd): use new e-util file
- selector function
-
- * meeting-mockup.glade: Remove old file
-
- * topic.dat
-
-2002-03-19 Dan Winship <danw@ximian.com>
-
- * cal-util/Makefile.am: s/libversit.la/libversit.a/
-
- * cal-client/Makefile.am: Likewise
-
- * gui/Makefile.am: Likewise
-
-2002-03-18 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/cal-search-bar.c: Removed `search_menu_items'.
- (cal_search_bar_menu_activated): Removed.
- (cal_search_bar_class_init): Don't install.
- (cal_search_bar_construct): No menu items here.
-
-2002-03-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/e-day-view.c: Updated to use new EPopupMenu API.
-
- * gui/e-week-view.c: Updated to use new EPopupMenu API.
-
- * gui/e-calendar-table.c: Updated to use new EPopupMenu API.
-
-2002-03-15 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/tasks-control.c (tasks_control_activate): Call
- `e_tasks_set_ui_component()' here to give it the
- BonoboUIComponent.
- (tasks_control_deactivate): Likewise, call it here to unset the
- BonoboUIComponent.
-
- * gui/e-tasks.c (e_tasks_set_ui_component): New.
-
- * gui/calendar-commands.c (calendar_control_activate): Call
- gnome_calendar_set_ui_component() here.
- (calendar_control_deactivate): ...And here, with a NULL
- BonoboUIComponent.
-
- * gui/gnome-cal.c (gnome_calendar_set_ui_component): New.
-
-2002-03-15 JP Rosevear <jpr@ximian.com>
-
- * gui/main.c: use bonobo exception macros to tidy
-
- * gui/itip-control-factory.c: ditto
-
- * gui/gnome-cal.c: ditto
-
- * gui/comp-editor-factory.c: ditto
-
- * gui/calendar-commands.c: ditto
-
-2002-03-14 JP Rosevear <jpr@ximian.com>
-
- * idl/evolution-calendar.idl: add all day event editor mode
-
- * gui/component-factory.c: clean up exception handling
- (sc_user_create_new_item_cb): support the all day event id
- (create_object): add a user creatable all day appointment item
-
- * gui/comp-editor-factory.c (get_default_event): get a default
- event either all day or starting at the top of the hour
- (get_default_task): get a default task
- (edit_new): support the all day event mode
-
- * gui/calendar-commands.c: remove unused functions/verbs
-
-2002-03-13 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/GNOME_Evolution_Calendar.oaf.in: Add an
- "evolution:config_item:icon_path" attribute so we get an icon for
- the calendar preferences.
-
-2002-03-12 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.glade: Add <visible>False</visible>
- to cal-prefs-dialog so it doesn't get shown when we load the Glade
- file with libglade.
-
- * gui/component-factory.c (owner_set_cb): Register the
- ConfigControl factory.
-
- * gui/tasks-control.c: Removed verb "TaskSettings".
- (tasks_control_settings_cmd): Removed.
-
- * gui/calendar-commands.c: Removed verb "CalendarSettings".
- (settings_cmd): Removed.
-
- * gui/dialogs/cal-prefs-dialog.c: Renamed `CalPrefsDialogPrivate'
- to `DialogData'. Replace `dialog' member with a `page' member.
- Remove `toplevel_notebook' member.
- (init_widgets): Renamed from `cal_prefs_dialog_init_widgets'.
- Just get a DialogData.
- (get_widgets): Get a DialogData pointer.
- (cal_prefs_dialog_destroy): Removed.
- (config_control_destroy_callback): New, signal handler for
- ::destroy for ConfigControl.
- (cal_prefs_dialog_new): Create a new DialogData, connect all the
- signal handlers.
- (create_time_edit): Renamed from
- `cal_prefs_dialog_create_time_edit'.
- (cal_prefs_dialog_show): Removed.
- (cal_prefs_dialog_button_clicked): Removed.
- (show_task_list_config): Get a DialogData.
- (show_config): Renamed from `cal_prefs_dialog_show_config'.
- Likewise.
- (update_task_list_config): Likewise.
- (update_config): Renamed from
- `cal_prefs_dialog_update_config'. Likewise.
- (color_set_callback): New callback, makes the dialog report
- changes when the setting in any of the color widgets is changed.
- (widget_changed_callback): New callback, makes the dialog report
- changes when any of the widgets changes status.
- (connect_changed): New utility function to connect this callback
- to all the widgets.
- (setup_widgets): Connect all the widgets.
- (cal_prefs_dialog_new): Call `setup_widgets'.
-
- * gui/config-control-factory.c: New.
- * gui/config-control-factory.h: New.
-
- * gui/GNOME_Evolution_Calendar.oaf.in: Add
- OAFIID:GNOME_Evolution_Calendar_ConfigControl and
- OAFIID:GNOME_Evolution_Calendar_ConfigControlFactory.
-
-2002-03-06 Rodrigo Moya <rodrigo@ximian.com>
-
- Should fix #21240
-
- * gui/alarm-notify/alarm-notify.c: replaced use of GnomeVFSURI
- with EUri, to allow non-registered methods.
-
-2002-03-05 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-itip-control.c (e_itip_control_set_data): reverted my last
- change of adding the METHOD property to the incoming request.
-
- * gui/itip-utils.c (comp_string): added extra
- X-MICROSOFT-CDO-REPLYTIME property for broken Outlook. Should fix
- #20783.
-
-2002-03-04 Dan Winship <danw@ximian.com>
-
- * gui/itip-utils.c (comp_compliant): Reset the DTSTAMP of the new
- component. (RFC2245 says DTSTAMP corresponds to the time the
- particular iCalendar representation of the object was created.)
- Fixes #21198.
-
-2002-03-05 JP Rosevear <jpr@ximian.com>
-
- * gui/print.c: remove unneeded parameter from print_text_size
- everywhere
- (get_font_for_size): calculate a font size based on the available
- height
- (print_text): calculate the top of where the font should be drawn
- (print_text_size): use get_font_for_size
- (print_day_background): use get_font_for_size
-
-2002-03-05 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-time-sel-item.c
- (e_meeting_time_selector_item_draw): pass the real table
- to e_meeting_model_etable_view_to_model_row
- (e_meeting_time_selector_item_paint_busy_periods): ditto
-
- * gui/dialogs/meeting-page.c (right_click_cb): ditto
-
- * gui/e-meeting-model.h: update protos
-
- * gui/e-meeting-model.c
- (e_meeting_model_etable_model_to_view_row): take in to account the
- fact the table used the without model
- (e_meeting_model_etable_view_to_model_row): ditto
-
-2002-03-04 Damon Chaplin <damon@ximian.com>
-
- * gui/tasks-control.c: added support for printing the Tasks table.
- I hacked it a bit so the user could choose portrait or landscape mode.
- This is bug #9677. ETable printing has a few issues, though, and it
- isn't very pretty.
-
-2002-03-04 Dan Winship <danw@ximian.com>
-
- * gui/itip-utils.c (comp_subject): Prefix the subject with an
- indicator like "Accepted" or "Cancelled" explaining what the
- action is, since Outlook doesn't display any of that information
- inline like we do. (20780)
-
-2002-02-28 Rodrigo Moya <rodrigo@ximian.com>
-
- * calendar/gui/e-itip-control.c (e_itip_control_set_data): added the
- METHOD property to the top level component we create.
-
-2002-02-26 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/control-factory.c (set_prop):
- * gui/tasks-control.c (tasks_control_set_property): display an error
- message if the call to gnome_calendar_open or e_tasks_open does not
- return TRUE. Fixes #20346.
-
-2002-02-25 Dan Winship <danw@ximian.com>
-
- * gui/itip-utils.c (itip_send_comp): use
- GNOME_Evolution_Composer_setBody rather than _setMultipartType and
- _attachData now, to send a message containing just a text/calendar
- part. Fixes 14705. Mostly.
- (comp_content_type): Include the filename here since we can't add
- a Content-Disposition now.
-
-2002-02-24 Chris Toshok <toshok@ximian.com>
-
- * gui/cal-search-bar.c (cal_search_bar_class_init): change
- query_changed to search_activated.
- (cal_search_bar_search_activated): rename
- cal_search_bar_query_changed to this.
-
-2002-02-21 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component-factory.c (add_creatable_item): New helper
- function.
- (create_object): Add icons for the various user creatable items.
-
-2002-02-19 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (send_item): pass extra itip_send_comp
- params
- (send_freebusy): ditto
- (ok_clicked_cb): ditto, including the timezones culled from the
- component
-
- * gui/e-week-view.c: pass extra itip_send_comp params
-
- * gui/calendar-commands.c: ditto
-
- * gui/e-day-view.c: ditto
-
- * gui/dialogs/task-editor.c: ditto
-
- * gui/dialogs/event-editor.c: ditto
-
- * gui/dialogs/comp-editor.c: ditto
-
- * gui/itip-utils.h (itip_send_comp): update proto
-
- * gui/itip-utils.c (foreach_tzid_callback): check the passed in
- zones, then the builtin time zones then the client
-
-2002-02-19 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (find_my_address): strip the ical value and
- do a case insensitive compare
- (find_attendee): ditto
- (change_status): put the error message here
- (ok_clicked_cb): don't update the item or rsvp unless
- change_status was successful, trip the ical value and do a case
- insensitive compare
-
- * gui/itip-utils.c (get_address): strip the incoming address
- (itip_strip_mailto): use g_strncasecmp
- (comp_limit_attendees): strip the ical value and do a case
- insensitive compare
-
-2002-02-14 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-model.c: use new column enums
- (set_value_at): emit pre-change/cell change signals
- (destroy): destroy refresh_queue and refresh_data
- (init): init new elements
- (refresh_queue_add): if the attendee is being refreshed already,
- possibly update the start/end times to look for and update the
- callback info, otherwise add it to the queue
- (refresh_queue_remove): remove a refreshing attende from the queue
- (process_callbacks): make all the callbacks and remove the
- attendee from the queue
- (process_free_busy): process the callbacks immediately if parsing
- fails or on successful completion of processing
- (async_close): process free busy
- (cursor_cb): we're only looking for one at a time now
- (refresh_busy_periods): idle callback to start processing the queue
- (e_meeting_model_refresh_all_busy_periods): add every row to the queue
- (e_meeting_model_refresh_busy_periods): add a single row to the queue
-
- * gui/e-meeting-model.h: new protos, enum the columns
-
- * gui/e-meeting-time-sel.c: use new compare time function
- (e_meeting_time_selector_construct): listen for a cell changed
- signal and use separate callbacks for rows_inserted and
- rows_deleted
- (e_meeting_time_selector_refresh_free_busy): util function to
- refresh free busy info
- (e_meeting_time_selector_on_update_free_busy): use above
- (rows_inserted_cb): refresh free busy on the new rows
- (cell_changed_cb): refresh free busy on the row when the address
- changes
- (rows_deleted_cb): redraw
-
- * gui/e-meeting-utils.[hc]: a holding spot for a meeting time
- comparison function
-
- * gui/Makefile.am: compile new files
-
-2002-02-13 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/control-factory.c (set_prop): don't append 'calendar.ics'
- to the URI.
- (get_prop): finished.
-
- * gui/tasks-control.c (tasks_control_set_property): don't append
- 'tasks.ics' to the URI.
- (tasks_control_get_property): finished.
-
- * gui/gnome-cal.c (gnome_calendar_open):
- * gui/e-tasks.c (e_tasks_open): append $filename.ics to the uri to be
- opened if the uri is local. Leave intact in other cases.
-
-2002-02-08 Damon Chaplin <damon@ximian.com>
-
- * gui/comp-util.c (cal_comp_util_compare_event_timezones): check if
- the CalComponentDateTime values are set before trying to use them.
- Possibly fixes bug #18529.
-
- * importers/icalendar-importer.c: added vCalendar importer and
- intelligent GnomeCalendar importer code here, as it shares a lot of
- code with the iCalendar importer.
-
- NOTE: check_folder_type() needs to be finished at some point.
- It needs a new shell Corba call so it can decide whether to import
- events or tasks into the folder. Currently it just imports both.
-
- * importers/main.c (importer_factory_fn): create vCalendar importer
- or GnomeCalendar importer if required.
-
- * importers/evolution-calendar-importer.h: added declarations for
- creating a vCalendar importer and intelligent Gnome Calendar importer.
-
- * importers/Makefile.am: added -DEVOLUTION_SOUNDDIR so the importer
- knows what filename to use for audio alarms in vCalendar files.
- Added libicalvcal-evolution to LDADD.
-
- * importers/GNOME_Evolution_Calendar_Importer.oaf.in: added vCalendar
- importer and intelligent Gnome Calendar importer.
-
- * gui/comp-util.c (cal_comp_util_compare_event_timezones): return TRUE
- if the event uses UTC. We don't want to flag all events from Outlook,
- which use UTC.
-
-2002-02-08 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/task-details-page.glade: change custom widget
- creator to e_url_entry_new
-
- * gui/dialogs/task-details-page.c (get_widgets): get the url entry
- and its entry
-
-2002-02-08 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/task-details-page.glade: add a custom widget created
- with e_url_button_new
-
- * gui/dialogs/task-details-page.c (task_details_page_init): init
- url_button member to NULL
- (init_widgets): set the url button entry
- (get_widgets): get the url button
-
- * gui/calendar-commands.c (pixmaps): use new all day event icon
-
-2002-02-07 JP Rosevear <jpr@ximian.com>
-
- * gui/e-day-view.c: pass meeting boolean for
- gnome_calendar_edit_object and gnome_calendar_new_appointment_for
-
- * gui/e-week-view-event-item.c: ditto
-
- * gui/e-week-view.c: ditto
-
- * gui/tasks-control.c (confirm_expunge): kill warning
-
- * gui/calendar-commands.c (new_meeting_cb): show a new meeting
- dialog
- (new_event_cb): pass new param
-
- * gui/gnome-cal.c (gnome_calendar_edit_object): take meeting
- boolean and show meeting page if true
- (gnome_calendar_new_appointment_for): takeing meeting param and
- pass to above
- (gnome_calendar_new_appointment): add new param
-
- * gui/gnome-cal.h: update proto
-
- * gui/component-factory.c (create_component): take a comp editor
- mode, determine vtype
- (sc_user_create_new_item_cb): check for meeting user creatable
- item
- (create_object): add meeting as user creatable item
-
- * gui/comp-editor-factory.c (edit_new): get a comp editor mode
- now, determine vtype and show meeting page if required
- (queue_edit_new): get comp editor mode
- (impl_editNew): ditto, plus queue the mode directly instead of
- determining the vtype
-
- * gui/dialogs/event-editor.c (show_meeting): new internal util
- function to show meeting page
- (event_editor_show_meeting): show the meeting
- (schedule_meeting_cmd): use show_meeting
-
- * gui/dialogs/event-editor.h: new proto
-
- * idl/evolution-calendar.idl: editNew takes a mode rather than a
- type now
-
- * cal-util/Makefile.am: fix includes
-
-2002-02-07 Christopher James Lahey <clahey@ximian.com>
-
- * gui/e-tasks.c (e_tasks_setup_view_menus), gui/gnome-cal.c
- (gnome_calendar_setup_view_menus): Made these use the new
- GalViewMenus stuff.
-
-2002-02-06 Damon Chaplin <damon@ximian.com>
-
- * cal-util/cal-recur.c (cal_recur_from_icalproperty): convert months
- from 1-12 to 0-11. Fixes bug #19235.
-
-2002-02-04 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/todo-conduit.c (e_todo_gui_new): new gui routines
- for conduit settings
- (e_todo_gui_fill_config): ditto
- (e_todo_gui_fill_widgets): ditto
- (e_todo_gui_destroy): ditto
- (e_todo_context_destroy): destroy new_cfg and gui properly
- (local_record_from_comp): set the priority to the default setting
- if none is set on the icalendar object
- (fill_widgets): fill gui widgets
- (create_settings_window): create gui
-
-2002-01-30 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (write_html): if this is a reply, print the
- attendee status
-
-2002-01-25 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/alarm-options.glade: Use 1 instead of zero as the
- minimum value for the repetitions spin button as we use a check
- box to specify whether the alarm has repetitions or not. Fixes
- bug #19054.
-
-2002-01-24 Ettore Perazzoli <ettore@ximian.com>
-
- * importers/Makefile.am (evolution_calendar_importer_LDADD):
- Ooops. Forgot to use EVOLUTION_CALENDAR_LIBS here.
-
-2002-01-24 Ettore Perazzoli <ettore@ximian.com>
-
- * conduits/calendar/Makefile.am: Use
- EVOLUTION_CALENDAR_CONDUIT_LIBS and
- EVOLUTION_CALENDAR_CONDUIT_CFLAGS.
- * conduits/todo/Makefile.am: Likewise.
-
- * cal-client/Makefile.am: Use EVOLUTION_CALENDAR_LIBS and
- EVOLUTION_CALENDAR_CFLAGS.
- * cal-util/Makefile.am: Likewise.
- * gui/alarm-notify/Makefile.am: Likewise.
- * gui/Makefile.am: Likewise.
-
-2002-01-23 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component-factory.c (create_object): Pass a NULL @icon to
- `evolution_shell_component_add_user_creatable_item()'.
-
-2002-01-21 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/todo-conduit.c (todoconduit_load_configuration):
- return a new configuration struct, load default priority setting
- (todoconduit_save_configuration): save default priority setting
- (e_todo_context_new): dupe configuration
-
- * conduits/calendar/calendar-conduit.c (e_calendar_context_new):
- set ps to NULL
-
-2002-01-17 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/alarm-page.c (get_alarm_string): save the alarm string
- in the correct variable (str), so it actually gets shown for alarms
- with specific trigger times. Fixes bug #18801.
-
-2002-01-15 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/task-page.c (task_page_fill_widgets): default component
- classification to PUBLIC. Fixes internal bug #1066
-
-2002-01-14 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c: move all functions here,
- get rid of header files, use e-pilot-settings to display gui
-
- * conduits/todo/todo-conduit.c: as above
-
-2002-01-14 JP Rosevear <jpr@ximian.com>
-
- * gui/gnome-cal.c (get_current_time): use icaltimetype_to_tm
-
-2002-01-14 JP Rosevear <jpr@ximian.com>
-
- * gui/e-week-view-main-item.c (e_week_view_main_item_draw_day):
- figure out when today is and highlight if it is not selected
-
- * gui/e-week-view.h: enum the "today" color
-
- * gui/e-week-view.c (e_week_view_realize): init the "today" color
-
-2002-01-13 JP Rosevear <jpr@ximian.com>
-
- * gui/alarm-notify/save.h: add protos
-
- * gui/alarm-notify/save.c (save_blessed_program): records a
- program as blessed
- (is_blessed_program): checks to see if a program is blessed
-
- * gui/alarm-notify/alarm-queue.c (procedure_notification_dialog):
- popup a dialog notifying the user that is a program and let them
- not see the dialog about this program again
- (procedure_notification): use above
-
-2002-01-11 Damon Chaplin <damon@ximian.com>
-
- * gui/e-timezone-entry.c:
- * gui/e-itip-control.c (write_label_piece):
- * gui/calendar-config.c (on_timezone_set): translate timezone names
- when displayed. Fixes bug #6544.
-
-2002-01-03 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-control.c (tasks_control_complete_cmd): new verb
- callback
- (sensitize_commands): set sensitivity of mark complete command
-
- * gui/e-tasks.h: new proto
-
- * gui/e-tasks.c (e_tasks_complete_selected): mark selected tasks
- in the table as complete
-
- * gui/e-calendar-table.h: new proto
-
- * gui/e-calendar-table.c (e_calendar_table_complete_selected):
- mark selected rows as complete
-
-2002-01-03 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-control.c (confirm_expunge): only need one warning
- message now
-
- * gui/e-tasks.c (create_sexp): change the logic to expunge all
- completed tasks not just hidden ones
-
-2002-01-03 JP Rosevear <jpr@ximian.com>
-
- * gui/tasks-control.c (confirm_expunge): confirm expunging of the
- tasks
- (tasks_control_expunge_cmd): verb callback
-
- * gui/calendar-config.c (config_read): read confirm expunge value
- (calendar_config_write): write confirm expunge value
- (calendar_config_write_on_exit): ditto
- (calendar_config_get_confirm_expunge): get value
- (calendar_config_set_confirm_expunge): set value
-
- * gui/calendar-config.h: new proto
-
- * gui/e-itip-control.c (start_calendar_server): kill warning
-
- * gui/e-tasks.c (e_tasks_init): init query member to NULL
- (set_status_message): util function to set status message
- (e_tasks_open): use above
- (cal_opened_cb): ditto
- (create_sexp): create sexp of items to be deleted
- (query_obj_updated_cb): remove any items found
- (query_eval_error_cb): bail out on error
- (query_query_done_cb): tidy when done
- (e_tasks_delete_completed): set up query
-
- * gui/e-tasks.h: new proto
-
- * gui/calendar-model.c (query_query_done_cb): use g_warning
- instead of printing to stderr
- (query_eval_error_cb): ditto
- (update_query): clear the status message if we can't create the
- query
-
- * gui/tag-calendar.c (resolve_tzid_cb): make this static
-
-2001-12-21 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor.c: remove needs send signal related
- cruft
- (save_comp_with_send): with send_component_dialog, indicate if the
- meeting info is newly created or not
- (real_edit_comp): remember if the dialog initially needs a send
-
- * gui/dialogs/send-comp.c (send_component_dialog): take a "new"
- parameter indicating whether the dialog should intimate if the
- component to be sent is a new meeting or not
-
- * gui/dialogs/send-comp.h: update proto
-
- * gui/dialogs/comp-editor.c: remove no longer used needs_send
- notification and signal
-
- * gui/dialogs/comp-editor.h: remove proto
-
- * gui/e-day-view.c (e_day_view_on_main_canvas_drag_data_received): add new
- param to send_component_dialog
- (e_day_view_finish_long_event_resize): ditto
- (e_day_view_finish_resize): ditto
- (e_day_view_on_editing_stopped): ditto
- (e_day_view_on_top_canvas_drag_data_received): ditto
-
- * gui/e-week-view.c (e_week_view_on_editing_stopped): add new
- param to send_component_dialog
-
-2001-12-21 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor.h: inherit from bonobo window
-
- * gui/dialogs/comp-editor.c: inherit from bonobo window
- (comp_editor_key_press_event): Look for an escape key press and
- close the window if found
-
-2001-12-20 Ettore Perazzoli <ettore@ximian.com>
-
- [Fixes #17377, Evolution doesn't work on multi-depth displays.]
-
- * gui/main.c (main): Push GdkRGB visual and colormap.
-
-2001-12-19 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (check_for_slow_setting):
- go slow and clear the map if the last uri and the current uri do
- not match
- (post_sync): save the last uri
-
- * conduits/calendar/calendar-conduit-config.h: handle a last uri
- config option
-
- * conduits/todo/todo-conduit-config.h: ditto
-
- * conduits/calendar/calendar-conduit.c (start_calendar_server):
- use the open_default_calendar method
-
- * conduits/todo/todo-conduit.c (start_calendar_server): same as above
-
- * cal-client/Makefile.am: link with bonobo conf
-
- * cal-client/cal-client.h: new protos
-
- * idl/evolution-calendar.idl: make sure open method raises
- appropriate exceptions
-
- * gui/e-itip-control.c (start_calendar_server): use
- cal_client_open_default_* calls
-
- * cal-client/cal-client.c (real_open_calendar): do the real work
- of loading
- (cal_client_open_calendar): use above
- (get_fall_back_uri): get the basic local uri
- (get_default_uri): get the default uri from the config db
- (cal_client_open_default_calendar): open the default uri or the
- fallback if the method is unsupported
- (cal_client_open_default_tasks): same for tasks
-
-2001-12-17 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (send_item): use get_real_item
- (get_refresh_options): uncomment out
- (get_real_item): obtain the real object which has the uid of the
- item received
- (show_current_todo): use get_refresh_options for refresh method
- and provide the description and summary from the real component
- since its not in the reply
- (show_current_event): ditto
- (send_item): use get_real_item
-
-2001-12-17 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (comp_limit_attendees): can't remove properties
- in an iteration loop, so remove them outside the loop
- (comp_minimal): don't set a recurid if there isn't one, add the x
- properties to the clone
- (comp_compliant): unref the clone for DECLINECOUNTER
-
- * gui/e-itip-control.c (get_refresh_options): make function
- available again
- (show_current_event): use it here
- (ok_clicked_cb): can't remove properties in an iteration loop, so
- remove them outside the loop
-
- * cal-util/cal-component.c (free_icalcomponent): properly free the
- attendee list
- (cal_component_rescan): don't destroy the alarm hash
-
-2001-12-13 Damon Chaplin <damon@ximian.com>
-
- * zones.h: new file to contain all timezone names for translation.
- We won't be using the translations in 1.0.1, but it gives translators
- time before we do use them in 1.0.2.
-
- * Makefile.am: added zones.h to EXTRA_DIST.
-
-2001-12-12 JP Rosevear <jpr@ximian.com>
-
- * gui/e-day-view.c (e_day_view_on_top_canvas_button_release):
- ungrab the pointer before calling
- e_day_view_finish_long_event_resize
- (e_day_view_on_main_canvas_button_release): ditto
- (e_day_view_finish_long_event_resize): ask if the meeting should
- be sent
- (e_day_view_finish_resize): ditto
- (e_day_view_on_editing_stopped): ditto
- (e_day_view_on_top_canvas_drag_data_received): ditto
- (e_day_view_on_main_canvas_drag_data_received): ditto
-
-2001-12-11 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-model.c (process_free_busy_comp): properly convert
- the dtstart and dtend times if they are UTC
- (cursor_cb): if we don't have anybody to get f/b info for, process
- the callbacks immediately
- (e_meeting_model_refresh_busy_periods): take start/end times,
- calculate the timet values with object timezone
- (e_meeting_model_etable_model_to_view_row): proper cast
- (e_meeting_model_etable_view_to_model_row): ditto
- (async_open): bail out if we couldn't open properly
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_on_update_free_busy): use defines for
- determining the number of days before and after of free busy to
- request
- (e_meeting_time_selector_update_dates_shown): use defines for the
- number of days shown
-
- * gui/e-meeting-model.h: update proto
-
-2001-12-10 Damon Chaplin <damon@ximian.com>
-
- * gui/control-factory.c (control_factory_new_control): removed code
- that connects to GnomeCalendar's "dates_shown_changed" signal.
-
- * gui/calendar-commands.c (gcal_calendar_dates_change_cb):
- (calendar_control_activate): moved it here, so it gets reconnected
- whenever the control is activated. Fixes bug #15798.
-
-2001-12-10 Damon Chaplin <damon@ximian.com>
-
- * importers/GNOME_Evolution_Calendar_Importer.oaf.in: fixed executable
- name. Fixes bug #16880.
-
-2001-12-08 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (local_record_from_comp):
- if we have an alarm that can be represented on the pilot, set the
- appointment fields appropriately, if the duration has values for
- minutes and/or hours and/or days, use the lowest common
- denominator
- (comp_from_remote_record): if the appointment on the pilot has an
- alarm, find the first alarm an item currently had that is relative
- to the start and with a negative duration and update it (or create
- a new one if no valid ones exist)
-
- * cal-util/cal-component.c (cal_component_get_alarm_uids): build
- list in the order they appear in the component so we get
- consisting order for the gui and for the pilot
-
-2001-12-08 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-config.c (calendar_config_get_default_uri):
- (calendar_config_get_default_tasks_uri): s/%/%s
-
-2001-11-09 Federico Mena Quintero <federico@ximian.com>
-
- (committed by Damon)
-
- Fix bug #14699.
-
- * pcs/query.c (QueryState): Added a state QUERY_WAIT_FOR_BACKEND
- to indicate that the query is not populated as we are waiting for
- the backend to be opened.
- (query_init): Start in the QUERY_WAIT_FOR_BACKEND state.
- (query_destroy): Only disconnect from the backend if we are in a
- state that implies that we are connected to its signals.
- (query_construct): If the backend is already loaded, immediately
- set the state to QUERY_START_PENDING.
- (backend_opened_cb): Disconnect from the backend's "opened"
- signal. Set the state to QUERY_START_PENDING.
- (match_component): We can now only match components if the query
- is in progress or if it is done. Assert to that effect, and do
- not ensure_sexp().
- (match_component): Do not check for a nonexistent component using
- g_return_if_fail(). Also, there is no need to ref/unref the
- component.
- (backend_obj_updated_cb): Assert to the effect of our state.
- (backend_obj_removed_cb): Likewise.
- (parse_sexp): Renamed from ensure_sexp(). Assert that the query
- has not started. Do not disconnect from the backend's signals
- here, since we have no connections.
- (start_query_cb): Set the state to QUERY_IN_PROGRESS here instead
- of in populate_query().
-
-2001-12-07 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-config.c (calendar_config_get_default_uri):
- (calendar_config_get_default_tasks_uri): if the key in the config
- database does not exist, just return the local URIs, but never
- return NULL
-
-2001-12-06 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/event-page.c (event_page_fill_widgets): default
- component classification to PUBLIC
-
-2001-12-06 Jon Trowbridge <trow@ximian.com>
-
- * gui/dialogs/event-editor.c (event_editor_destroy): Explicitly
- destroy the EMeetingModel. This is a hack to work around problems
- with the reference counting; we are still leaking the
- EMeetingModels.
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_construct): Ref our EMeetingModel.
- (e_meeting_time_selector_destroy): Unref the model.
-
- * gui/e-meeting-model.c (destroy): Properly destroy
- corba_select_names with a call to bonobo_object_release_unref.
- (Fixes 14002)
-
-2001-12-05 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/event-page.glade: added entry for the LOCATION field
-
- * gui/dialogs/event-page.c: added support for the new LOCATION entry
- added in the Event editor.
-
-2001-12-05 Zbigniew Chyla <cyba@gnome.pl>
-
- * gui/itip-utils.c (comp_subject, comp_description):
- Marked strings for translation.
-
-2001-12-03 Damon Chaplin <damon@ximian.com>
-
- * gui/e-meeting-model.c:
- * gui/calendar-model.c: make sure we call e_table_model_pre_change()
- before changing the model.
-
- * gui/calendar-config.c (calendar_config_configure_e_calendar_table):
- removed call to e_table_model_changed(). calendar_model_refresh()
- results in that anyway.
-
-2001-12-03 Damon Chaplin <damon@ximian.com>
-
- * gui/e-calendar-table.etspec: disabled 'Alarms', 'End Date' and
- 'Show Time As' fields, as these are not useful for tasks. We may want
- to reenable them later if we add a table view of calendar events.
-
-2001-12-02 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-offline-handler.c (backend_cal_opened): connect to
- "cal_set_mode" signal before calling cal_client_set_mode. Also,
- s/cal_mode_set/cal_set_mode
- (backend_go_offline): connect to "cal_opened" signal before calling
- cal_client_open_calendar
-
-2001-11-30 Damon Chaplin <damon@ximian.com>
-
- * gui/e-itip-control.c (remove_item): only show the dialog if we
- created it. Hopefully fixes bug #15774.
- Also ifdef'ed out a lot of code that isn't currently used, including
- code to use a label which is never created. The unused code was there
- to support handling multiple iTIP objects in a message, but was never
- updated when we switched to use HTML for the control. Fixes bug #16232.
-
-2001-11-28 Federico Mena Quintero <federico@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_new_task): Set the category of
- the new task to that of the search bar. Fixes bug #15533.
-
-2001-11-27 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-itip-control.c (update_attendee_status):
- * gui/itip-utils.c (comp_to_list): fixed typos in translatable
- strings. Fixes Ximian #15456
-
-2001-11-14 Damon Chaplin <damon@ximian.com>
-
- * gui/print.c: Substituted gnome_font_get_width_string() with
- gnome_font_get_width_utf8() and gnome_font_get_width_string_n()
- with gnome_font_get_width_utf8_sized(). Fixes calendar part of #15379.
-
-2001-11-14 Federico Mena Quintero <federico@ximian.com>
-
- * gui/calendar-model.c (date_value_to_string): Convert the buffer
- to UTF8.
- (calendar_model_value_to_string): Do not convert the string fields
- to UTF8 again; they are already in UTF8. Fixes the UTF8-related
- bits of bug #15304.
-
-2001-11-14 Damon Chaplin <damon@ximian.com>
-
- * gui/calendar-model.c:
- * cal-util/cal-component.h: #ifdef'ed out the LOCATION field for now,
- since it wasn't supported everywhere, or in the .etspec file.
-
-2001-11-14 Damon Chaplin <damon@ximian.com>
-
- * gui/e-calendar-table.c: don't abort when e_table_selected_count()
- returns odd values. There seems to be a bug in ETable. This is to
- avoid bug #13843.
-
-2001-11-13 Federico Mena Quintero <federico@ximian.com>
-
- (committed to CVS by Damon)
- Fixes bug #15137.
-
- * gui/e-day-view.c (e_day_view_on_delete_appointment): Do not try
- to operate on the event if it gets deleted while stopping the
- edition.
- (e_day_view_on_event_double_click): Likewise.
- (e_day_view_on_long_event_button_press): Likewise.
- (e_day_view_on_event_button_press): Likewise.
- (e_day_view_on_long_event_click): Likewise.
- (e_day_view_on_event_click): Likewise.
-
- * gui/e-week-view.c (e_week_view_on_text_item_event): Likewise.
-
-2001-11-14 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (pre_sync): remove silly
- debug warning
-
-2001-11-13 Damon Chaplin <damon@ximian.com>
-
- * gui/alarm-notify/config-data.c (ensure_inited):
- * gui/calendar-config.c (config_read):
- * conduits/todo/todo-conduit.c (get_default_timezone):
- * conduits/calendar/calendar-conduit.c (get_default_timezone):
- make the timezone default to UTC. Fixes bug #14362.
-
-2001-11-13 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-week-view.c (selection_received): only change the day,
- month and year for the start date, for not screwing up the start
- time, which was being set to midnight always (Fixes Ximian #5287)
- Also, deal correctly with VCALENDAR components
-
- * gui/e-day-view.c (selection_received): dela correctly with
- VCALENDAR components being pasted
-
-2001-11-11 Federico Mena Quintero <federico@ximian.com>
-
- * gui/alarm-notify/save.c (get_calendars_to_load): The last
- argument to the bonobo_config_get_XXX_with_default() is a gboolean
- *, not a CORBA_Environment *. Fixes bug #14655.
-
-2001-11-11 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal-backend-file.c (free_busy_instance): recurrence
- expansion callback for free/busy
- (create_user_free_busy): expand recurrences and use date/time
- values for dtstart and dtend
-
-2001-11-11 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-model.h: new protos
-
- * gui/e-meeting-model.c (e_meeting_model_get_zone): accessor
- (e_meeting_model_set_zone): ditto
- (init): init to the calendar default zone
- (process_free_busy_comp): take the zone to convert to as a param
- (e_meeting_model_refresh_busy_periods): redraw properly
-
- * gui/dialogs/schedule-page.c (update_time): set the zone of the
- model
-
-2001-11-09 Damon Chaplin <damon@ximian.com>
-
- * gui/e-week-view.c (e_week_view_key_press): don't subtract a day
- from DTEND. For DATE values we don't include the entire day now.
- Fixes bug #14842.
-
-2001-11-09 Damon Chaplin <damon@ximian.com>
-
- * gui/e-week-view-layout.c (e_week_view_layout_events): fix buffer
- overflow. Fixes bug #10285 (the printing of lines & dates in the
- printout of the month view).
-
-2001-11-09 Zbigniew Chyla <cyba@gnome.pl>
-
- * gui/dialogs/meeting-page.c
- (meeting_page_fill_widgets): Convert strings to GTK+ encoding.
- (meeting_page_destroy): Free allocated strings before freeing the list
- itself.
-
-2001-11-08 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_timeout_handler): don't let an empty
- event occur for all days when auto scrolling
-
-2001-11-08 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-file.c
- (cal_backend_file_compute_changes_foreach_key): don't leak the
- string returned by cal_component_get_as_string nor the temporary
- CalComponent we create
-
-2001-11-08 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (ok_clicked_cb): don't add the item, remove
- it if declining (in case it was added before)
- (remove_item): Since we can't discern between an item not found
- and another error, always say the removal is complete
-
-2001-11-07 Zbigniew Chyla <cyba@gnome.pl>
-
- * gui/e-cell-date-edit-text.c (ecd_get_text):
- Convert generated string to UTF-8.
-
-2001-11-07 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_on_start_time_changed): emit changed
- signal
- (e_meeting_time_selector_on_end_time_changed): emit changed
- signal, if end time is now before start time and all day event,
- make sure a whole day is still selected
- (e_meeting_time_selector_drag_meeting_time): calculate the first
- and last_time's in whole days for all day events
- (e_meeting_time_selector_timeout_handler): calculate the drag time
- to be whole days for all day events and scroll the canvas even if
- we don't update the time so the user can see where they're headed
-
-2001-11-06 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/event-editor.c (event_editor_edit_comp): make sure
- to remove all attendees from the model when we edit a new comp,
- append the pages if they are needed and we weren't showing them
- before
-
- * gui/dialogs/task-editor.c (task_editor_edit_comp): same as above
-
- * gui/dialogs/comp-editor.c (comp_editor_remove_page): check for a
- return value indicating the page was not found and return if so
-
-2001-11-05 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/dialogs/e-delegate-dialog.c: #include
- "Evolution-Addressbook-SelectNames.h", not
- "../Evolution-Addressbook-SelectNames.h". Grrr.
-
-2001-11-05 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_class_init):
- add a changed signal
- (e_meeting_time_selector_construct): emit changed signal
- (e_meeting_time_selector_set_meeting_time): ditto
- (e_meeting_time_selector_set_all_day): set the all day setting
- (e_meeting_time_selector_autopick): emit changed signal
- (e_meeting_time_selector_find_nearest_interval): find proper
- interval when in all day mode
- (e_meeting_time_selector_find_nearest_interval_backward): ditto
- (e_meeting_time_selector_drag_meeting_time): for all day events,
- move the time when past the 12 hour mark, and and always make sure
- 1 full day is selected, emit changed signal when appropriate
- (e_meeting_time_selector_update_start_date_edit): set date and
- time of day together
- (e_meeting_time_selector_update_end_date_edit): ditto, and adjust
- display time if all day event
-
- * gui/e-meeting-time-sel-item.c
- (e_meeting_time_selector_item_draw): remove unused variable
- (e_meeting_time_selector_item_button_press): for all day mode,
- make the interval a whole day
-
- * gui/dialogs/schedule-page.c (update_time): set the meeting time
- selector setting instead of manual mucking with the e-date-edit
- widgets
- (init_widgets): listen to the changed signal of the meeting time
- selector instead of propagating multiple events as it updates
-
- * gui/dialogs/event-page.c (update_time): block time zone change
- signals
-
-2001-11-05 Damon Chaplin <damon@ximian.com>
-
- * gui/calendar-model.c (dup_date_edit_value): removed ';' in the wrong
- place. Fixes bug #14421.
-
-2001-11-05 Dan Winship <danw@ximian.com>
-
- * gui/alarm-notify/Makefile.am (evolution_alarm_notify_LDFLAGS):
- -export-dynamic for libglade custom widget.
-
-2001-11-04 Damon Chaplin <damon@ximian.com>
-
- * gui/comp-editor-factory.c (get_default_component): use TZID from the
- builtin timezone, instead of using the location name.
-
-2001-11-02 Federico Mena Quintero <federico@ximian.com>
-
- * cal-util/cal-util.c (compute_alarm_range): Short-circuit the
- calculation of the repeat time if there are zero repetitions.
- (compute_alarm_range): I'm a moron. De-reference alarm_start when
- subtracting stuff from it! Fixes bug #14209.
-
-2001-10-31 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/dialogs/Makefile.am: Added rules to generate
- `Evolution-Addressbook-SelectNames.h'.
-
- * gui/dialogs/comp-editor-util.h: #include
- "Evolution-Addressbook-SelectNames.h" from this directory.
-
-2001-10-31 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/alarm-options.c: #include <string.h>
-
-2001-10-31 Federico Mena Quintero <federico@ximian.com>
-
- * gui/gnome-cal.c (dn_query_obj_updated_cb): If a query is not in
- progress, just retag the whole thing. An event may change dates
- and tag_calendar_by_comp() would not know how to untag the old
- dates. Fixes bug #10220.
-
- * pcs/query.c (start_query_cb): Connect to the backend's
- "obj_updated" and "obj_removed" signals here instead of in
- query_construct(). If a query is started while another one is
- notifying of an update, these signal connections would get appened
- to the running signal (the one that triggered the notification
- about an update) and the new signal handlers would also get
- called. We are really not interested in updates before we
- populate the query, because we'll catch the changes anyways.
-
-2001-10-31 Federico Mena Quintero <federico@ximian.com>
-
- Fix bug #13723.
-
- * gui/gnome-cal.h (GnomeCalendarClass): New signals
- "calendar_focus_change", "taskpad_focus_change", and
- "taskpad_selection_changed". Renamed "selection_changed" to
- "calendar_selection_changed".
-
- * gui/gnome-cal.c (gnome_calendar_get_num_tasks_selected): New
- function.
- (setup_widgets): Connect to the focus event signals of the task
- pad and the calendar view widgets.
- (gnome_calendar_delete_selection): Renamed from
- gnome_calendar_delete_event().
- (gnome_calendar_cut_clipboard): Handle the current focus location.
- (gnome_calendar_copy_clipboard): Likewise.
- (gnome_calendar_paste_clipboard): Likewise.
- (gnome_calendar_delete_selection): Likewise.
- (table_selection_change_cb): New callback.
-
- * gui/calendar-commands.c (sensitize_calendar_commands): Take in
- whether we should unconditionally disable everything.
- (sensitize_taskpad_commands): Analogous function to the above.
- (gcal_calendar_focus_change_cb): New callback, used for calendar
- views.
- (gcal_taskpad_focus_change_cb): New callback, used for the
- taskpad.
-
- * gui/e-day-view.c (e_day_view_key_press): Use a better test for
- keys that should start editing. Fixes bug #6447.
-
- * gui/e-week-view.c (e_week_view_key_press): Likewise.
-
-2001-10-31 Christopher James Lahey <clahey@ximian.com>
-
- * gui/calendar-model.c: Make the pre_changes and changes match
- here.
-
-2001-10-31 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (itip_send_comp): send as mixed rather than
- alternative
-
-2001-10-31 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/alarm-notify/save.c (KEY_CALENDARS_TO_LOAD):
- Removed.
- (KEY_NUM_CALENDARS_TO_LOAD): New key, containing the number of
- calendars to load.
- (BASE_KEY_CALENDAR_TO_LOAD): New base key name for the URIs of the
- calendars to load.
- (save_calendars_to_load): Rewrote to not use a sequence, to work
- around an ORBit bug that causes bonobo-moniker-xmldb to crash.
- (get_calendars_to_load): Likewise.
-
-2001-10-30 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/comp-editor.c (comp_editor_remove_page): disconnect
- signals added in append_page(). Fixes Gtk-Critical warning about
- GtkAccelGroup being added twice to a window.
-
-2001-10-30 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (itip_send_comp): set a body for the message
-
-2001-10-30 Dan Winship <danw@ximian.com>
-
- * gui/itip-utils.c (itip_send_comp): call
- GNOME_Evolution_Composer_setMultipartType to get a
- multipart/alternative.
-
-2001-10-30 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_on_start_time_changed): don't overwrite
- memory
- (e_meeting_time_selector_on_end_time_changed): ditto
-
-2001-10-30 Damon Chaplin <damon@ximian.com>
-
- * gui/calendar-model.c (dup_date_edit_value): return NULL if passed
- NULL. Should fix bug #14048.
-
-2001-10-30 Federico Mena Quintero <federico@ximian.com>
-
- * gui/calendar-config.c (config_read): Do not ignore the
- exceptions of the cases that do not have defaults.
-
-2001-10-30 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_drag_meeting_time): if we are doing all
- day stuff, make the drag increment 1 day at a time
-
-2001-10-30 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/meeting-page.c (meeting_page_fill_component): Add
- _() to a string that was missing it.
-
-2001-10-30 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/meeting-page.c (table_canvas_focus_out_cb): Commit
- the ETable click-to-add for if the dialog is being destroyed.
- Should fix bug #13959.
-
-2001-10-30 Federico Mena Quintero <federico@ximian.com>
-
- * gui/itip-utils.c (itip_send_comp): Allocate enough space for the
- string! (was missing the null terminator) Possibly fixes #13924.
- Thanks a *LOT* to Michael Zucchi for running this through Purify.
-
-2001-10-30 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-time-sel-item.c
- (e_meeting_time_selector_item_button_press): move in whole day
- increments if we are in all day mode
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_on_start_time_changed): get rid of
- localtime call
- (e_meeting_time_selector_on_end_time_changed): ditto
- (e_meeting_time_selector_update_start_date_edit): set the date
- editor using the meeting time fields directly
- (e_meeting_time_selector_update_end_date_edit): ditto
-
- * gui/dialogs/schedule-page.c (update_time): do the set_show_time
- stuff first
-
- * conduits/calendar/calendar-conduit.c (process_multi_day): don't
- adjust the time, set the default timezone for date values
-
-2001-10-30 Dan Winship <danw@ximian.com>
-
- * gui/alarm-notify/Makefile.am (INCLUDES):
- s/BONOBO_HTML_GNOME_LIBS/BONOBO_HTML_GNOME_CFLAGS/
-
-2001-10-30 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-model.c (e_meeting_model_count_actual_attendees):
- count the actual attendees (doesn't include people delegating
-
- * gui/e-meeting-time-sel.c: use
- e_meeting_model_count_actual_attendees (renamed)
-
- * gui/e-meeting-time-sel-item.c: use
- e_meeting_model_etable_view_to_model_row calls instead of calling
- on the model directly, use e_meeting_model_count_actual_attendees
-
- * gui/e-meeting-model.c
- (e_meeting_model_etable_model_to_view_row): get the real mapping
- (e_meeting_model_etable_view_to_model_row): ditto
- (get_key): e-table-without callback
- (duplicate_key): ditto
- (free_gotten_key): ditto
- (free_duplicated_key): ditto
- (init): create without model
- (e_meeting_model_etable_from_model): build etable from without
- model
-
- * gui/e-meeting-model.h: update protos
-
- * gui/dialogs/meeting-page.c (right_click_cb): convert row from
- view to model row
-
-2001-10-30 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/task-page.c (task_page_fill_widgets): set to the default
- timezone for DATE values, in case the user switches to a DATE-TIME.
-
-2001-10-30 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/task-page.c: handle DATE values for Start and Due dates.
-
-2001-10-30 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/schedule-page.c:
- * gui/dialogs/event-page.c:
- * gui/dialogs/comp-editor-util.c: updated code to handle DATE values.
-
- * gui/gnome-cal.c (gnome_calendar_new_appointment_for):
- * gui/e-day-view.c (e_day_view_key_press): updated DATE code.
-
- * gui/e-cell-date-edit-text.c:
- * gui/calendar-model.c: updated to support DATE values.
-
- * cal-util/cal-recur.c (cal_recur_generate_instances_of_rule): updated
- to use DATE values in same way as Outlook - i.e. the DTEND date is
- not included entirely. Though I did make it so that if the DTSTART
- and DTEND used the same DATE value, it includes the entire day.
- So 1-day events should be the same. Long All-Day events will be
- 1 day shorter.
-
- * cal-util/cal-component.c (cal_component_get_start_plus_duration):
- don't subtract a day from the end date.
-
- * gui/tasks-control.c: updated the EPixmap paths for Cut/Copy etc.
- Removed Print & Print Preview paths, since we don't have menu commands
- for these any more.
-
-2001-10-30 Federico Mena Quintero <federico@ximian.com>
-
- Fix bug #10016.
-
- * gui/dialogs/comp-editor.c (comp_editor_merge_ui): Use
- bonobo_ui_util_set_ui() instead of doing things by hand. Hmmm, if
- only that function had a way of telling us whether it failed so
- that we could avoid setting the verb list...
-
- * gui/dialogs/event-editor.c (event_editor_init): Do not pass the
- filename with the full path so that Bonobo can find it in a smart
- way.
-
- * gui/dialogs/task-editor.c (task_editor_init): Likewise.
-
-2001-10-30 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/delete-comp.c (delete_component_dialog): Use an
- EMessageBox instead of a gnome_dialog_question so that the label
- gets line breaking. Fixes bug #11260.
-
-2001-10-29 Federico Mena Quintero <federico@ximian.com>
-
- Fix bug #13649.
-
- * gui/calendar-config.c
- (calendar_config_get_use_default_reminder): New function.
- (calendar_config_set_use_default_reminder): New function.
- (calendar_config_get_default_reminder_interval): New function.
- (calendar_config_set_default_reminder_interval): New function.
- (calendar_config_get_default_reminder_units): New function.
- (calendar_config_set_default_reminder_units): New function.
- (config_read): Get the options for default reminders.
- (calendar_config_write): Set the options for default reminders.
-
- * gui/dialogs/cal-prefs-dialog.c (cal_prefs_dialog_show_config):
- Set the default reminder widgets from the config values.
- (cal_prefs_dialog_update_config): Set the config values from the
- widgets.
-
- * gui/comp-util.c (cal_comp_event_new_with_defaults): New
- function; creates a VEVENT component with the default alarm.
-
- * gui/e-day-view.c (e_day_view_key_press): Use
- cal_comp_event_new_with_defaults ();
-
- * gui/e-week-view.c (e_week_view_key_press): Likewise.
- * gui/calendar-model.c (calendar_model_append_row): Likewise.
- * gui/comp-editor-factory.c (get_default_component): Likewise.
- * gui/gnome-cal.c (gnome_calendar_new_appointment_for): Likewise.
-
- * cal-util/cal-component.c (ensure_alarm_properties_cb): Ensure we
- have a DESCRIPTION property.
- (cal_component_commit_sequence): Ensure we have the mandatory
- alarm properties.
-
-2001-10-30 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-model.c (process_section): process an individual
- section here
- (select_names_ok_cb): call above
- (get_select_name_dialog): listen for ok:dialog signal
-
-2001-10-29 Damon Chaplin <damon@ximian.com>
-
- * importers/Makefile.am (evolution_calendar_importer_LDADD):
- * gui/Makefile.am (evolution_calendar_LDADD):
- * cal-util/Makefile.am (test_recur_LDADD):
- * cal-client/Makefile.am (client_test_LDADD): use libical-evolution.la
-
- * gui/dialogs/schedule-page.c: save the timezone passed in for the
- start time, so if our times are changed we use this. Also, if the
- end time was passed in in a different timezone, convert it.
- Also hide the time fields for DATE values. Note that DATE values still
- do not work.
-
- * gui/dialogs/meeting-page.glade: changed "Invite Others" to
- "Invite Others..." to be consistent with the other page.
-
- * gui/dialogs/event-page.c (times_updated):
- (all_day_event_toggled_cb): set is_date if appropriate.
-
- * gui/e-itip-control.c (write_label_piece): convert all UTC times to
- the current timezone. Outlook sends simple, non-recurring, events as
- UTC times, which isn't very useful.
-
-2001-10-29 Federico Mena Quintero <federico@ximian.com>
-
- * gui/main.c (launch_alarm_daemon): Launch the alarm daemon as
- soon as the calendar component is started. Fixes bug #13867;
- we can't really do much better than this.
-
-2001-10-29 Federico Mena Quintero <federico@ximian.com>
-
- * gui/tasks-control.c (pixmaps): Fix the verb names for the
- pixmaps in the Edit menu; they were out of synch with the XML
- UI description.
-
-2001-10-29 Chris Toshok <toshok@ximian.com>
-
- * pcs/cal-factory.c (cal_factory_dump_active_backends): new
- function.
- (dump_backend): new function.
-
- * pcs/cal-factory.h: add prototype for
- cal_factory_dump_active_backends.
-
-2001-10-29 Federico Mena Quintero <federico@ximian.com>
-
- Fix bug #12163.
-
- * cal-util/cal-util.c (compute_alarm_range): Take alarm
- repetitions into account.
- (add_alarm_occurrences_cb): Add alarm repetitions.
- (generate_absolute_triggers): Likewise.
- (generate_absolute_triggers): Oops, absolute triggers are in UTC,
- so convert them as such. Also, pay attention to the timezones of
- the dtstart and dtend properties.
-
-2001-10-29 JP Rosevear <jpr@ximian.com>
-
- * importers/Makefile.am: include the header as a source so it gets
- dist'ed.
-
-2001-10-29 Ettore Perazzoli <ettore@ximian.com>
-
- * importers/Makefile.am (INCLUDES):
- s/BONOBO_CFLAGS/BONOBO_GNOME_CFLAGS/.
-
-2001-10-29 Rodrigo Moya <rodrigo@ximian.com>
-
- * importers/icalendar-importer.c (load_file_fn): fixed URI
- construction, which was preventing importing into the root
- calendar (~/evo/local/Calendar/)
-
-2001-10-29 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (is_all_day): handle date
- values
-
-2001-10-29 Rodrigo Moya <rodrigo@ximian.com>
-
- * importers/: added evolution-calendar-importer binary, starting
- with an iCalendar file importer
-
-2001-10-29 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/todo-conduit-config.h
- (todoconduit_load_configuration): get the management object by id
-
- * conduits/calendar/calendar-conduit-config.h
- (calconduit_load_configuration): ditto
-
-2001-10-29 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-config.[ch] (calendar_config_get_default_uri):
- (calendar_config_set_default_uri):
- (calendar_config_get_default_tasks_uri):
- (calendar_config_set_default_tasks_uri): new functions for setting
- and retrieving the default calendar URIs
-
- * gui/e-itip-control.c (init): don't use
- hard-coded URI, but use the default calendar URI, as returned
- by calendar_config_get_default_uri
- (start_calendar_server): added a "gboolean tasks" parameter, so
- that the local tasks.ics file is used if the calendar to be
- started is for tasks when no default tasks URI is found in
- the configuration
-
-2001-10-28 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (add_record): unref the
- comp when finished
-
- * conduits/todo/todo-conduit.c (add_record): ditto
-
-2001-10-28 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/task-page.c (task_page_fill_widgets): added break
- statements after each case, when setting the classification.
- Fixes bug #13772.
-
-2001-10-28 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/cal-client.c (destroy_wombat_client): removed this
- function, as we don't need to unref at all the WombatClient
- object, since it is aggregated to the CalListener object, which
- will take care of unrefing it (Fixes Ximian #12001)
- (cal_client_open_calendar): create the WombatClient here
-
-2001-10-28 Damon Chaplin <damon@ximian.com>
-
- * gui/print.c (print_todo_details): get the tasks directly from the
- CalendarModel, so we get the filtering & sorting for free. Fixes
- bug #10280. Hmm. This seems too easy. It isn't going to work is it...
-
- * gui/gnome-cal.c (gnome_calendar_get_task_pad): new function to get
- the TaskPad ECalendarTable, for printing.
-
- * gui/calendar-model.c:
- * gui/calendar-config.c (calendar_config_get_hide_completed_tasks_sexp):
- split this out from calendar-model.c so we could use it for printing,
- but ended up doing that a different way.
-
- * gui/dialogs/task-page.c (init_widgets): removed a duplicated signal
- connected to field_changed_cb().
-
-2001-10-27 Damon Chaplin <damon@ximian.com>
-
- * gui/print.c (print_week_view):
- (range_selector_new): when the week start day is set to Sunday, we
- have to be careful to make sure we print the correct week, since
- the previous Saturday is actually printed first. Fixes bug #13687.
- (print_week_summary): always set compress_weekend to true if
- multi_week_view is FALSE (i.e. we are printing the week view).
- Fixes bug #13688.
-
- * gui/e-itip-control.c (send_freebusy): use the timezones from the
- DTSTART and DTEND.
- (write_label_piece): output the date-time and the timezone after it.
- Note that we may want to convert it to the current timezone and display
- that as well. Also converted COMPLETED to the current timezone.
- And fixed all uses of old timezone functions.
-
- * gui/dialogs/comp-editor.c (commit_all_fields): added function to
- set the focus in the window to NULL, so all fields lose their focus,
- so they emit "changed" signals and update their values if needed.
- We call this when most menu commands are used, e.g. 'Save and Close',
- 'Print' etc. Fixes bug #11434. In future we should also check fields
- are valid and show dialogs if they are not.
-
- * gui/calendar-model.c (get_completed): use the completed value
- properly. Fixes bug #13694.
-
- * cal-util/timeutil.c (icaltimetype_to_tm_with_zone): don't check
- from_zone and to_zone != NULL. A NULL zone is valid, it is for
- floating times.
-
-2001-10-27 Federico Mena Quintero <federico@ximian.com>
-
- * gui/e-day-view.c (e_day_view_on_text_item_event): Cancel editing
- if the user presses Escape.
-
- * gui/e-week-view.c (e_week_view_on_text_item_event): Likewise.
-
- * gui/cal-search-bar.c: #include <string.h>
-
-2001-10-27 Federico Mena Quintero <federico@ximian.com>
-
- * gui/e-day-view.c (e_day_view_on_editing_stopped): Delete
- appointments with empty summaries. Fixes Ximian bug #780.
-
- * gui/e-week-view.c (e_week_view_on_editing_stopped): Likewise.
-
- * gui/dialogs/delete-comp.c (delete_component_dialog): Added an
- argument to specify whether we unconditionally want single
- components to be considered as not having a summary.
-
- * gui/comp-util.c (cal_comp_confirm_delete_empty_comp): New
- function.
-
- * gui/misc.[ch]: New files with miscellaneous utility functions;
- moved string_is_empty() over from calendar-model.c.
-
- * gui/calendar-model.c: Use the string_is_empty()
- function from misc.c.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Added misc.[ch] to
- the list of sources.
-
-2001-10-27 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/todo-conduit.c (local_record_from_comp): touch on
- lookup
- (check_for_slow_setting): write touched only if slow sync
- (match): touch on lookup
-
- * conduits/calendar/calendar-conduit.c (local_record_from_comp):
- touch the record on lookup
- (check_for_slow_setting): write touched only if slow sync
- (pre_sync): don't touch on lookup
- (match): touch on lookup
-
-2001-10-26 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/e-calendar.conduit.in: remove the merges as
- valid sync types
-
- * conduits/todo/e-todo.conduit.in: as above
-
- * conduits/calendar/calendar-conduit.c (pre_sync): write out only
- the touched records if we are doing copies
-
- * conduits/todo/todo-conduit.c: as above
-
- * conduits/calendar/calendar-conduit-config.h
- (calconduit_load_configuration): get the sync type
-
- * conduits/todo/todo-conduit-config.h: as above
-
-2001-10-26 Damon Chaplin <damon@ximian.com>
-
- * gui/e-itip-control.c (write_label_piece): convert the formatted
- date to UTF-8.
-
- * cal-util/cal-recur.c (CAL_OBJ_DEBUG): turn off debug functions.
-
- * gui/dialogs/comp-editor-util.c (parse_contact_string): handle UTF8
- correctly. Bug #4450. Good enough for 1.0.
-
- * gui/e-week-view-event-item.c (e_week_view_draw_time): set the gc
- color before drawing. Should fix bug #11469.
-
- * gui/dialogs/task-editor.c (task_editor_edit_comp): show or hide the
- meeting page as appropriate. Note this may be called more than once,
- if the task gets updated somewhere else and the user clicks 'Update
- the object'. Hopefully fixes bug #12930.
-
- * gui/print.c (print_comp_item): printed more fields and made a little
- prettier. Fixes bug #9352.
- (print_date_label): used the correct timezones for each date field.
-
- * *.c: removed several debug messages.
-
-2001-10-26 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (check_for_slow_setting):
- make debug output more accurate
-
- * conduits/todo/todo-conduit.c (check_for_slow_setting): ditto
-
-2001-10-26 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/todo-conduit.c (pre_sync): remove the uid from the
- map if was archived and is now deleted
-
- * conduits/calendar/calendar-conduit.c: ditto
-
-2001-10-26 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-calendar_table.c (delete_selected_components):
- (selection_received): added status bar messages
-
- * gui/e-day-view.c (e_day_view_cut_clipboard):
- (selection_received): likewise
-
- * gui/e-week-view.c (e_week_view_cut_clipboard):
- (selection_received): likewise
-
-2001-10-26 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.h: modify fields
-
- * conduits/todo/todo-conduit.h: as above
-
- * conduits/calendar/calendar-conduit.c (print_remote): free the
- struct after use
- (e_calendar_context_new): explicitly init context fields
- (e_calendar_context_destroy): free local records and properly free
- changed hash elements
- (start_calendar_server_cb): tidy
- (start_calendar_server): ditto
- (free_local): free a local record
- (local_record_to_pilot_record): use a static buffer to avoid leaks
- (local_record_from_comp): only copy over alarm stuff from the
- original record, we sync everything else
- (local_record_from_uid): unref the comp when we are done
- (pre_sync): free change_id
- (post_sync): ditto
- (for_each): track locals
- (for_each_modified): ditto
- (free_match): use free_local
-
- * conduits/todo/todo-conduit.c: as above
-
-2001-10-26 Federico Mena Quintero <federico@ximian.com>
-
- * pcs/cal.c (cal_construct): Get a fresh CORBA_Environment for
- every CORBA call. Hopefully will fix #11978, but I'm not sure
- about what else could be happening.
- (cal_get_password): Free the exception.
-
-2001-10-25 Damon Chaplin <damon@ximian.com>
-
- * gui/e-itip-control.c: used functions to get PUBLISH_OPTIONS etc.,
- so we can translate them.
-
-2001-10-25 Damon Chaplin <damon@ximian.com>
-
- * cal-util/cal-recur.c (cal_obj_bysetpos_filter): subtract 1 from
- any positive BYSETPOS value, since our array is 0-based.
-
- * gui/dialogs/recurrence-page.c (simple_recur_to_comp):
- (recurrence_page_fill_widgets): Outlook (2000) will not accept monthly
- recurrences like BYDAY=2TU. Instead it uses BYDAY=TU;BYSETPOS=2.
- So to be compatable with it we now do the same, although we still
- accept and convert the old format.
-
- * cal-client/cal-client.c (cal_client_get_component_as_string): new
- function to return a complete VCALENDAR string containing a VEVENT
- or VTODO with all the VTIMEZONEs it uses.
-
- * gui/dialogs/comp-editor.c (save_as_ok): use above function so we
- save the VTIMEZONE data with the VEVENT/VTODO. Fixes bug #8626.
- Also made sure we output "METHOD:PUBLISH" since Outlook (2000) will
- not import it otherwise.
-
- * gui/dialogs/comp-editor.c (page_mapped_cb):
- (page_unmapped_cb): install/uninstall the GtkAccelGroup for the page.
- (comp_editor_append_page): connect to the map/unmap signals to
- install/uninstall the accelerators. (This is all for bug #11609,
- though of course it doesn't work too well in GTK+ 1.2 anyway.)
-
- * gui/dialogs/task-page.c (get_widgets):
- * gui/dialogs/task-details-page.c (get_widgets):
- * gui/dialogs/schedule-page.c (get_widgets):
- * gui/dialogs/recurrence-page.c (get_widgets):
- * gui/dialogs/meeting-page.c (get_widgets):
- * gui/dialogs/event-page.c (get_widgets):
- * gui/dialogs/alarm-page.c (get_widgets): got the GtkAccelGroup from
- the original window, ref'ed it and placed it in the CompEditorPage
- struct.
-
- * gui/dialogs/comp-editor-page.c (comp_editor_page_destroy): unref
- any GtkAccelGroup for the page.
-
- * gui/dialogs/task-page.glade: changed '_Confidential' to
- 'Con_fidential' as it clashed with '_Contacts'. It now matches the
- event editor as well.
-
- * gui/dialogs/event-page.glade:
- * gui/dialogs/task-page.glade: Set CAN_FOCUS to TRUE for the custom
- EDateEdit widgets, and set them as the accel targets of the labels.
-
-2001-10-25 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/comp-editor.c (save_comp): show an error message when
- we can't update the object on the calendar server
-
-2001-10-25 Federico Mena Quintero <federico@ximian.com>
-
- * gui/control-factory.c: Ifdef-ed out the PersistFile bits.
-
- * gui/GNOME_Evolution_Calendar.oaf.in: The tasks folder does not
- support the PersistFile interface; removed it. Removed it as well
- from the calendar folder since it is aggregated but not actually
- implemented.
-
-2001-10-25 Federico Mena Quintero <federico@ximian.com>
-
- * gui/component-factory.c (xfer_folder): Handle tasks folders as
- well; was always using "calendar.ics" as the filename.
-
-2001-10-24 Damon Chaplin <damon@ximian.com>
-
- * gui/GNOME_Evolution_Calendar.oaf.in: added sections for Tasks
- factory and control. I hope someone checks these!
-
-2001-10-24 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component-factory.c (xfer_folder): Fixed to only copy the
- `calendar.ics' and `calendar.ics~' files.
-
-2001-10-24 Damon Chaplin <damon@ximian.com>
-
- * pcs/cal-backend-file.c (cal_backend_file_update_objects): when
- iterating over the subcomponents, use 'subcomp' rather than 'icalcomp'.
- That meant it wasn't working at all well when an entire VCALENDAR
- was passed in.
-
- * cal-util/cal-component.c: handle DURATION property used instead of
- DTEND or DUE. In cal_component_get_dtend/due we will return DTSTART
- + DURATION if necessary. In set_dtend/due we remove any DURATION
- property. Fixes bug #11262.
-
- * gui/e-meeting-model.c (build_etable):
- * gui/e-calendar-table.c (e_calendar_table_init): use U_ for the
- ECellCombo popdown strings, as it expects UTF-8 strings.
-
-2001-10-24 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_construct):
- track the spacer vbox
- (e_meeting_time_selector_style_set): make sure the rows are the
- correct size for the style
-
- * gui/e-meeting-time-sel-item.c
- (e_meeting_time_selector_item_paint_day_top): slight adjustments
- to where the text is drawn
-
- * gui/e-meeting-time-sel.h: new member
-
- * gui/e-meeting-model.c (build_etable): ensure uniform row height
-
- * conduits/todo/todo-conduit.c (comp_from_remote_record): mark
- status as completed in appropriate places and don't overwrite
- legitimate percentages and such
-
-2001-10-24 Federico Mena Quintero <federico@ximian.com>
-
- Fixes bug #5282.
-
- * cal-util/timeutil.c (icaltimetype_to_tm_with_zone): New function
- to avoid copying the same code all over the place.
- (icaltimetype_to_tm): Also set the tm.tm_wday.
-
- * gui/alarm-notify/alarm-queue.c (queue_midnight_refresh): Use
- time_day_end_with_zone().
- (load_alarms_for_today): Likewise. And oops, we were only
- computing the times and not loading the alarms.
- (obj_updated_cb): Likewise.
- (load_alarms): Removed assertion that is no longer valid because
- we may load the alarms for a client in two stages.
-
- * gui/dialogs/alarm-page.c (get_alarm_string): Convert absolute
- trigger times to the local timezone.
-
- * gui/alarm-notify/alarm-notify-dialog.c (write_html_heading):
- Convert the times to the local timezone.
- (alarm_notify_dialog): Likewise, for the window title.
- (alarm_notify_dialog): Set the window layer to WIN_LAYER_ONTOP.
-
- * gui/e-cell-date-edit-text.c (ecd_get_text): Use
- icaltimetype_to_tm_with_zone().
-
- * gui/alarm-notify/save.c (get_config_db): Made public.
- (discard_config_db): Made public.
-
- * gui/alarm-notify/config-data.[ch]: New files with functions to
- fetch the calendar configuration data used by the alarm daemon.
-
-2001-10-23 Damon Chaplin <damon@ximian.com>
-
- * cal-util/cal-component.c (cal_component_event_dates_match): make sure
- we free all the CalComponentDateTime's when we are finished.
-
- * gui/gnome-cal.c (gnome_calendar_notify_dates_shown_changed): just
- return if no time range is set.
-
-2001-10-23 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_table_vadjustment_changed): adjust the
- display canvas when the table scrolls
- (e_meeting_time_selector_construct): listen for table scrolling
-
-2001-10-23 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-model.c (build_etable): no longer set the
- scrollbar policy here
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_update_main_canvas_scroll_region): add an
- extra row to the height so the click to add row can be properly
- seen
- (e_meeting_time_selector_construct): set the scrollbar policy for
- the etable scrolled
-
-2001-10-23 JP Rosevear <jpr@ximian.com>
-
- * cal-util/timeutil.c (icaltimetype_to_tm): convert an
- icaltimetype to a tm
- (tm_to_icaltimetype): vice versa
-
- * cal-util/timeutil.h: new protos
-
- * conduits/calendar/calendar-conduit.c: replace all mktime and
- localtime calls (except for debugging calls)
-
- * conduits/todo/todo-conduit.c: ditto
- (comp_from_remote_record): make sure the completed time is in UTC
-
-2001-10-23 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/cal-query.c (cal_query_construct) set priv->corba_query
- to CORBA_OBJECT_NIL if there was an error
-
-2001-10-22 Damon Chaplin <damon@ximian.com>
-
- * idl/evolution-calendar.idl: added setDefaultTimezone() method.
-
- * pcs/cal-backend.c (cal_backend_get_default_timezone):
- (cal_backend_set_default_timezone): new functions to call class
- methods.
-
- * pcs/cal-backend-file.c: lots of changes to handle the default
- timezone and use it.
-
- * pcs/query.c: use the default timezone.
-
- * gui/dialogs/task-details-page.c (date_changed_cb): initialized
- completed_tt.
-
- * gui/dialogs/event-page.c: changed it to handle DATE values. The
- 'All Day Event' checkbox is only set now when the DTSTART and DTEND
- are DATE values.
-
- * gui/dialogs/comp-editor-util.c (comp_editor_free_dates): free the
- CalComponentDateTime structs as well.
-
- * gui/e-tasks.c: set the default timezone on the server.
-
- * gui/tag-calendar.c:
- * gui/gnome-cal.c:
- * gui/e-week-view.c:
- * gui/e-day-view.c: updates to handle DATE values.
-
- * gui/e-calendar-table.c (date_compare_cb): updated to use the new
- ECellDateEditValue values, so it now works.
- (percent_compare_cb): updated to use GPOINTER_TO_INT values.
- (e_calendar_table_init): use an ECellPercent for the percent field
- and an ECellDateEditText for the date fields.
-
- * gui/comp-util.c (cal_comp_util_compare_event_timezones): return TRUE
- if the DTSTART or DTEND is a DATE value. We don't want to show the
- timezone icons for DATE values.
-
- * gui/comp-editor-factory.c (resolve_pending_requests): set the default
- timezone on the server.
-
- * gui/calendar-model.c: major changes to support sorting properly.
- For date and percent fields we now use subclasses of ECellText, so
- we don't use a char* as the model value. For the percent field we now
- use a GINT_TO_POINTER. For the date fields we now use a
- ECellDateEditValue* as the value.
-
- * gui/calendar-config.c (calendar_config_configure_e_cell_date_edit):
- set the timezone and use_24_hour flags of the new ECellDateEditText.
-
- * conduits/todo/todo-conduit.c (pre_sync):
- * conduits/calendar/calendar-conduit.c (pre_sync): set the default
- timezone on the server.
-
- * cal-util/timeutil.c (time_days_in_month): removed debug message.
-
- * cal-util/test-recur.c: try to handle timezones in the iCalendar
- file properly, and updated to pass default timezone.
-
- * cal-util/cal-util.c (cal_util_generate_alarms_for_comp):
- (cal_util_generate_alarms_for_list): added default timezone argument.
-
- * cal-util/cal-recur.c: changed many of the functions to take a default
- timezone, to use to resolve DATE and floating DATE-TIME values.
-
- * cal-client/cal-client.c (cal_client_set_default_timezone): new
- function to set the default timezone.
- (cal_client_ensure_timezone_on_server): new function to ensure that
- a given timezone is on the server.
-
- * gui/e-cell-date-edit-text.c: new subclass of ECellText to display
- and edit a date value.
-
- * cal-util/cal-recur.c (cal_obj_byday_expand_monthly): changed week_num
- to -week_num when calculating the weeks to go back from the end of the
- month for things like BYDAY=-2WE. Fixes bug #11525.
- (cal_recur_generate_instances_of_rule): only go up to MAX_YEAR (2037).
- We can't really handle anything past that anyway.
- (cal_recur_ensure_rule_end_date): initialize cb_date.end_date to 0,
- so if the RULE doesn't generate COUNT instances we save 0 as the
- time_t.
-
-2001-10-22 Federico Mena Quintero <federico@ximian.com>
-
- * gui/tasks-control-factory.c (tasks_control_factory_fn): Put up a
- warning dialog box if we failed to create the tasks control.
- Fixes bug #13033.
-
-2001-10-22 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (set_date_label): write out the correct
- time in the control
-
- * pcs/cal.c (build_fb_seq): utility function to build sequences of
- f/b data
- (impl_Cal_get_free_busy): use above so we never return a NULL
-
- * conduits/calendar/calendar-conduit-config.h
- (calconduit_save_configuration): fix c/p error
- (calconduit_load_configuration): ditto
-
-2001-10-22 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/meeting-page.c (meeting_page_destroy): we don't need
- to save the state
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_destroy):
- ditto
-
- * gui/e-meeting-model.c (build_etable): listen for the etable
- being destroyed
- (table_destroy_cb): save the state when the etable is destroyed
-
-2001-10-21 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/schedule-page.c (init_widgets): listen for changes
- in the date editors
- (schedule_page_set_dates): update the times when they change
- elsewhere
- (update_time): set the time in the dialog
- (time_changed_cb): notify of changed times
-
- * gui/dialogs/comp-editor.c (page_dates_changed_cb): don't call
- the set dates function on the page that noted the change
- (page_summary_changed_cb): same for set summary function
-
- * gui/dialogs/event-page.c (update_time): move time setting stuff
- to util function
- (event_page_set_dates): use it
- (event_page_fill_component): ditto
-
- * gui/e-meeting-time-sel.h: fix comment
-
-2001-10-19 Federico Mena Quintero <federico@ximian.com>
-
- * gui/alarm-notify/alarm-notify.c (add_uri_to_load): Do not assert
- if we fail to load the URI list. This would of course have been a
- bonobo-conf activation problem.
- (remove_uri_to_load): Likewise.
-
- * gui/alarm-notify/notify-main.c (load_calendars): Likewise.
-
- * gui/alarm-notify/alarm-queue.c (load_missed_alarms): Make the
- time range half-open so that we do not display the last alarm
- twice.
-
-2001-10-19 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-model.c (calendar_model_set_status_message): make
- it a public function
-
- * gui/e-tasks.c (e_tasks_open): display progress messages
- (cal_opened_cb): clean up status bar messages
-
- * gui/gnome-cal.c (gnome_calendar_open): display progress messages
- (client_cal_opened_cb): clean up status bar messages
-
-2001-10-19 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-model.c (set_status_message): new function
- (update_query): call set_status_message
- (query_query_done_cb):
- (query_eval_error_cb): clean up status bar messages
- (get_location, set_location): new functions for setting and
- retrieving the location in the calendar model
-
-2001-10-19 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/component-factory.c (owner_set_cb): keep a reference to the
- EvolutionShellClient component
-
- * gui/e-week-view.c (e_week_view_set_status_message): new function
- (update_query): call e_week_view_set_status_message
- (query_query_done_cb):
- (query_eval_error_cb): clean up status bar messages
-
- * gui/e-day-view.c (e_day_view_set_status_message): new function
- (update_query): call e_day_view_set_status_message
- (query_query_done_cb):
- (query_eval_error_cb): clean up status bar messages
-
- * gui/Makefile.am: added EVOLUTION_IMAGESDIR to CFLAGS
-
-2001-10-18 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-time-sel.c
- (e_meeting_time_selector_on_invite_others_button_clicked): call
- the invite others dialog in the model
-
- * gui/e-meeting-attendee.c (e_meeting_attendee_get_atype): pick
- attendee type based on role and cutype
-
- * gui/e-meeting-attendee.h: remove proto
-
- * gui/Makefile.am: compile select names idl
-
- * gui/e-meeting-model.h: new proto
-
- * gui/dialogs/meeting-page.c: remove invite others dialogs bits
- from here
-
- * gui/e-meeting-model.c (e_meeting_model_invite_others_dialog):
- and put them here
-
- * gui/dialogs/Makefile.am: compile corba bits in parent dir
-
- * gui/dialogs/comp-editor-util.h: reflect above in includes
-
- * gui/dialogs/e-delegate-dialog.c: ditto
-
- * gui/dialogs/schedule-page.c: ditto and clean includes
-
-2001-10-18 Larry Ewing <lewing@ximian.com>
-
- * gui/alarm-notify/alarm-notify-dialog.c: add html widget
- (url_requested_cb): add function to load images from file as they
- are requested.
- (write_html_heading): convert to using html.
- (alarm_notify_dialog): convert to use html display.
- (make_html_display): this is the function the custom widget in the
- galde file uses to create the html widget.
-
- * gui/alarm-notify/alarm-notify.glade: add placeholder for the
- custom html widget.
-
- * gui/alarm-notify/Makefile.am: add flags for gtkhtml and gal.
-
-2001-10-18 Federico Mena Quintero <federico@ximian.com>
-
- Adds session management for the alarm daemon. Also makes it store
- a list of calendars to be monitored. Those calendars will all be
- loaded when the alarm daemon starts up.
-
- * idl/evolution-calendar.idl (AlarmNotify): Removed the ::die()
- method. The alarm daemon now handles termination via the session
- manager's commands.
-
- * gui/alarm-notify/notify-main.c (set_session_parameters): New
- function, sets some parameters so that the session manager can
- restart the daemon via the evolution-alarm-client program. Also,
- sets up the "die" signal so that the daemon can terminate when the
- session ends.
- (load_calendars): New function to load the calendars on startup.
- (main): Set the session parameters. Load the calendars on startup.
-
- * gui/alarm-notify/alarm-notify.c (alarm_notify_add_calendar): New
- function, moved over from the impl_ function. Added a
- load_afterwards argument to indicate whether the calendar should
- just be loaded or if it should also be added to the list of
- calendars to load on startup.
- (AlarmNotify_addCalendar): Use alarm_notify_add_calendar().
- (AlarmNotify_removeCalendar): Remove the calendar from the list of
- calendars to load on startup.
-
- * gui/alarm-notify/save.c (save_calendars_to_load): New function,
- saves a sequence of the URIs to load.
- (get_calendars_to_load): New function, loads a sequence of
- calendars to load.
-
- * gui/alarm-notify/alarm.h: Removed stale prototype for alarm_init().
-
- * gui/component-factory.c (remove_folder): Ask the alarm daemon to
- stop monitoring alarms for the folder that is being deleted.
-
-2001-10-18 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-time-sel.c
-
- * gui/e-meeting-time-sel-item.c
- (e_meeting_time_selector_item_paint_day_top): use 12 or 24 hour
- settings
-
- * gui/e-meeting-time-sel.c: strings for 12 hour setting
- (e_meeting_time_selector_construct): increase width slightly
-
- * gui/e-meeting-time-sel.h: extern the new char array
-
-2001-10-18 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-util/cal-component.[ch] (cal_component_get_location):
- (cal_component_set_location): new functions
-
-2001-10-18 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-model.c (process_callbacks): util routine to
- handle calling back
- (async_close): use above
- (e_meeting_model_refresh_busy_periods): ditto
-
-2001-10-17 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/todo-conduit.c (local_record_from_comp): translate
- 1-5 priorites to 1-9 priorities better
- (comp_from_remote_record): ditto
-
-2001-10-17 JP Rosevear <jpr@ximian.com>
-
- * idl/evolution-calendar.idl: allow some decent exceptions
-
-2001-10-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/query.c (match_component): there may be cases when the backend
- will return an invalid component from a valid UID (an UID returned
- by the get_uids method), so don't abort if that's the case
-
-2001-10-15 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.glade: removed Help button. Do we have
- any others?
-
-2001-10-15 Larry Ewing <lewing@ximian.com>
-
- * gui/dialogs/comp-editor.c (set_icon_from_comp): remove warnings.
-
-2001-10-15 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (process_multi_day):
- function to break up multi day events into single events for both
- evo and the pilot and create new CalClientChange structures
- (pre_sync): call above function, and adjust changed list if
- necessary
-
-2001-10-15 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (is_all_day): util function
- to determine if event is all day
- (local_record_from_comp): use new util function
- (comp_from_remote_record): kill use of deprecated time functions
-
-2001-10-13 Larry Ewing <lewing@ximian.com>
-
- * gui/dialogs/comp-editor.c (real_edit_comp): call
- set_icon_from_comp.
- (set_icon_from_comp): set the window icon from the comp.
- (make_icon_from_comp): get the icon path based on comp type.
-
- * gui/dialogs/Makefile.am (iconsdir): EVOLUTION_ICONSDIR bits.
-
-2001-10-13 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/task-editor.c (task_editor_send_comp): send
- cancellation comp if necessary
-
-2001-10-12 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/alarm-page.c: return fill_component success
-
- * gui/dialogs/task-page.c: ditto
-
- * gui/dialogs/task-details-page.c: ditto
-
- * gui/dialogs/schedule-page.c: ditto
-
- * gui/dialogs/recurrence-page.c: ditto
-
- * gui/dialogs/event-page.c: ditto
-
- * gui/dialogs/meeting-page.c: use e_notice instead of
- duplicate_error
- (meeting_page_get_cancel_comp): duh, deleted_attendees is an array
- now
- (meeting_page_fill_component): spew gui errors if there is no
- organizer or no attendees, return success
-
- * gui/dialogs/event-editor.c (event_editor_send_comp): always call
- parent method and don't send the cancellation comp if the method
- is publish
- (refresh_meeting_cmd): use the orginal comp to refresh
- (forward_cmd): prompt the user for the version they want to send
- (current, original)
-
- * gui/dialogs/task-editor.c (forward_cmd): as above
- (refresh_task_cmd): ditto
-
- * gui/dialogs/comp-editor-page.c
- (comp_editor_page_fill_component): return boolean of whether the
- component could be filled or not
-
- * gui/dialogs/comp-editor-page.h: update proto
-
- * gui/dialogs/comp-editor.c (prompt_to_save_changes): take a param
- on whether to try and send or not
- (comp_editor_get_current_comp): only fill component if its changed
- (comp_editor_save_comp): prompt user as well
-
- * gui/dialogs/comp-editor.h: change proto
-
- * gui/itip-utils.c: replace error_dialog with e_notice
- (comp_content_type): specify charset
-
-2001-10-11 Larry Ewing <lewing@ximian.com>
-
- * gui/e-itip-control.c: large reworking of i18n tagging and now
- uses gtk_html_stream write and U_ where appropriate. More to
- come.
-
-2001-10-10 Larry Ewing <lewing@ximian.com>
-
- * gui/e-itip-control.c (init): set the default character set to
- utf-8.
-
-2001-10-10 Federico Mena Quintero <federico@ximian.com>
-
- * pcs/cal-factory.c (lookup_backend): Return the original key in
- the hash table if requested.
- (backend_last_client_gone_cb): Use lookup_backend() so that we
- have the URI mangling done for us.
- (impl_CalFactory_open): The type should be GtkType *, not GtkType!
-
-2001-10-10 JP Rosevear <jpr@ximian.com>
-
- * cal-client/cal-client.c (cal_set_mode_cb): remove unneeded
- assertions
-
-2001-10-10 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal-factory.c (add_uri): fix logic checks
-
- * gui/dialogs/event-editor.c (event_editor_init): init the
- exisiting_org boolean
- (set_menu_sens): base sensitivity on existing_org boolean
- (event_editor_edit_comp): set exisiting_org boolean
-
- * gui/dialogs/task-editor.c: same as above
-
- * gui/calendar-offline-handler.c (add_connection): handle the
- protocol or host being unknown
-
- * cal-util/cal-component.c (cal_component_has_organizer):
- implement
-
-2001-10-09 Federico Mena Quintero <federico@ximian.com>
-
- Fixes bug #884.
-
- * gui/alarm-notify/save.[ch]: New files with functions to
- save/load the last notification time.
-
- * gui/alarm-notify/alarm-queue.c (alarm_trigger_cb): Save the last
- notification time.
- (alarm_queue_init): Load the last notification time when the
- daemon is inited.
- (alarm_queue_add_client): Load the alarms that we missed while the
- alarm daemon was not running.
- (cal_opened_cb): Likewise.
-
- * gui/alarm-notify/Makefile.am (evolution_alarm_notify_SOURCES):
- Added save.[ch] to the list of sources.
-
-2001-10-09 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (get_address): util function to get address
- (itip_addresses_get_default): get only the default address
- (itip_address_free): free single address
- (itip_addresses_free): use above
- (comp_limit_attendees): limit the number of attendees to one, the
- user
- (comp_sentby): set the sentby parameter if the user is not the
- organizer
- (comp_minimal): remove extraneous info for send (for refresh and
- declinecounter)
- (comp_compliant): remove all alarms, do various things to make the
- components comply with itip spec based on method
- (itip_send_comp): use comp_compliant method
-
- * gui/itip-utils.h: new protos
-
- * gui/e-itip-control.c: rescan the component when necessary
- (get_next): don't get stuck in infinite loop if there are no
- viewable components
- (e_itip_control_set_data): if there are no viewable components,
- spit an error message
-
- * gui/dialogs/meeting-page.h: tidy
-
- * gui/dialogs/meeting-page.c (meeting_page_fill_widgets): use
- organizer's cn if possible
- (other_clicked_cb): no longer doing the sent by stuff directly,
- hide more widgets
-
- * pcs/query.c: use bonobo exception stuff
-
- * cal-util/cal-component.c (cal_component_rescan): have the comp
- rescan its libical component (for when you change things directly)
- (free_icalcomponent): take a param on whether to free the
- component or just clean up the mappings
- (cal_component_has_attendees): util function
-
- * cal-util/cal-component.h: new protos
-
-2001-10-09 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-factory.c (lookup_backend, add_backend): deal correctly with
- URIs to be inserted into the hash table, so that we don't add the same
- backend over and over because the URI strings were different (although
- refering to the same backend)
-
- * pcs/cal-backend-file.c (mail_account_*): moved to a common place
- (cal_backend_file_open): check if "uristr != NULL" and not
- "uri != NULL"
-
- * pcs/cal-backend-util.c: moved to here
-
- * gui/e-day-view.c: add missing header file
-
-2001-10-09 Dan Winship <danw@ximian.com>
-
- * gui/e-meeting-model.c (process_free_busy_comp): Fix incorrect
- variable name check.
-
-2001-10-03 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (itip_send_comp): refactor functionality into
- several function
- (comp_string): if we are publishing, empty the attendee list
-
- * gui/dialogs/event-editor.c (schedule_meeting_cmd): when we
- schedule a new meeting, mark the event editor as changed
-
- * pcs/cal.c (cal_class_init): get correct parent class
-
- * gui/dialogs/comp-editor.c (comp_editor_merge_ui): use the
- generated ui component name
-
-2001-10-03 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/component-factory.c:
- * gui/calendar-offline-handler.c:
- * gui/comp-editor-factory.c: replace use of gnome_vfs_uri with e_uri
-
- * gui/e-meeting-model.c (start_addressbook_server): make it return void,
- since the return value does not mind
-
- * pcs/cal.c:
- * pcs/cal-factory.c:
- * pcs/cal-backend.[ch]: don't use GnomeVFS for URI management
-
- * pcs/cal-backend-file.c: ditto, only use GnomeVFS for internal
- operations
-
- * cal-client/cal-client.c (cal_client_open_calendar): don't CORBA_exception_free
- before checking for exceptions
-
-2001-10-03 Christopher James Lahey <clahey@ximian.com>
-
- * gui/e-calendar-table.etspec: Added priorities to a bunch of
- these columns. Fixes Ximian bug #7158.
-
-2001-10-03 Damon Chaplin <damon@ximian.com>
-
- * gui/comp-util.c (cal_comp_util_add_exdate): save the EXDATE as a
- DATE-TIME value, since we know the exact time. Fixes bug #11278.
- (Before we were setting is_date, but icaltime_from_timet_with_zone()
- didn't convert it properly. We need to figure out how to handle DATEs
- when using time_t's.)
-
- * gui/dialogs/recurrence-page.c (get_exception_string): use
- e_time_format_date_and_time() so we show the time as well, if the
- exception is a DATE-TIME value.
-
- * cal-util/timeutil.c: removed time_add_month(), time_year_begin(),
- time_month_begin() & time_week_begin() - old pre-timezone functions
- which we no longer use.
-
- * cal-util/cal-recur.c (cal_recur_from_icalproperty): set
- ir.until.is_date to FALSE before converting to a time_t.
- Hopefully fixes bug #5034.
-
-2001-10-02 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/dialogs/comp-editor.c (setup_widgets): Use
- `bonobo_ui_component_new_default()', not
- `bonobo_ui_component_new()'.
-
-2001-10-02 JP Rosevear <jpr@ximian.com>
-
- * cal-client/cal-query.c: use bonobo-exception to tidy
-
-2001-10-02 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (nth_weekday): handle -1 as
- well
- (comp_from_remote_record): fix monthly by day recurrences and
- handle "last" day type
-
-2001-10-01 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/comp-editor.c (comp_editor_destroy): unref the page
- objects here, instead of in close_dialog(). (This was fixed a while
- ago, but accidentally reverted.) Fixes bug #7543.
-
-2001-10-01 Federico Mena Quintero <federico@ximian.com>
-
- * gui/alarm-notify/alarm-notify-dialog.c (alarm_notify_dialog):
- Set the window state to sticky. Thanks to Peter Teichman for the
- suggestion.
-
-2001-10-01 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (local_record_from_comp):
- Convert the comp exceptions to the pilot record
- (comp_from_remote_record): record exceptions on the desktop and
- use time zone stuff on recurrence end date
-
-2001-10-01 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal-backend-file.c (cal_backend_file_compute_changes):
- strdup the uid to avoid double free, write out only after
- everything is done
-
-2001-10-01 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_open): don't use
- gnome_vfs_uri_is_local on URIs created with
- gnome_vfs_uri_new_private
-
-2001-09-28 Damon Chaplin <damon@ximian.com>
-
- * gui/print.c (print_comp_item): use bound_text to print the summary,
- so it wraps instead of being clipped to 1 line. Fixes part 3 of bug
- #10285, I think.
-
- * gui/dialogs/alarm-page.glade: left-aligned the Date/Time label.
- Also set the width of the Summary & Date/Time labels to 10, and set
- expand to TRUE, to make sure that the dialog doesn't keep getting
- wider as the summary text on the main page gets longer. Could possibly
- use an EClippedLabel here instead, so we get a '...' at the end if it
- is clipped.
-
- * gui/dialogs/recurrence-page.glade: changed Summary & Date/Time
- widths as above.
-
- * gui/print.c (print_calendar): use landscape mode for the month
- preview.
- (print_border_with_triangles): use EPSILON to account for floating
- point errors. Hopefully fixes part 2b of bug #10285.
-
-2001-09-28 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (local_record_from_comp):
- Handle the fields and category we don't sync by making sure we
- don't overwrite them
- (local_record_to_pilot_record): use local record category
- (pre_sync): track db info
-
- * conduits/calendar/calendar-conduit.h: db info field
-
- * conduits/todo/todo-conduit.[hc]: same as above
-
- * pcs/cal-backend-file.c
- (cal_backend_file_compute_changes_foreach_key): create a dummy
- component of the right type and strdup the uid
- (cal_backend_file_compute_changes): sync the db hash after each
- change and free the uid
-
-2001-09-28 JP Rosevear <jpr@ximian.com>
-
- * cal-client/cal-client.c (cal_client_open_calendar): init the
- execption rather than freeing it
-
-2001-09-28 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/cal-client.c (cal_client_construct): use bonobo-exception
- for exceptions
- (cal_client_open_calendar): likewise
-
-2001-09-27 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/calendar-commands.c (pixmaps): Update pixmap menu paths;
- /menu/ComponentToolsPlaceholder/Tools ->
- /menu/Tools/ComponentPlaceholder .
- * gui/tasks-control.c: Likewise.
-
-2001-09-27 Rodrigo Moya <rodrigo@ximian.com>
-
- * idl/evolution-calendar.idl: added InvalidURI and UnsupportedMethod
- exceptions to the CalFactory interface
-
- * pcs/cal-factory.c (impl_CalFactory_open): raise InvalidURI exception on
- URI errors and UnsupportedMethod when we don't support the method for
- a given URI
-
-2001-09-26 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/cal-client.c: added support for using multiple calendar
- factories
- (cal_client_uri_list): use the list of factories loaded for this
- CalClient
-
-2001-09-26 Damon Chaplin <damon@ximian.com>
-
- * gui/e-calendar-table.c (date_compare_cb):
- (percent_compare_cb):
- (priority_compare_cb): added comparison functions for these special
- cell types. But the date and percent ones don't work yet due to the
- use of static text buffers for return cell values.
- (e_calendar_table_init): added the comparison functions to the
- ETableExtras. NOTE: task_compare_cb() never seems to be called.
- I'm not sure why it is there.
-
- * gui/e-calendar-table.etspec: set the comparison function names for
- the date/percent/priority fields.
-
- * cal-util/cal-util.c (cal_util_priority_to_string):
- (cal_util_priority_from_string): new utility functions.
-
- * gui/calendar-model.c (get_priority):
- (set_priority): used above utility functions, and removed the warning
- dialog which isn't useful now that the field isn't editable.
-
- * gui/dialogs/event-page.c (times_updated): handle timezones and for
- all-day events make sure it stays an all-day event after adjusting.
- Fixes bugs #5945 and #10222.
-
- * gui/calendar-commands.c (pixmaps): fixed the E_PIXMAP paths - the
- edit items were moved beneath 'EditPlaceholder'. This gets rid of
- those long Bonobo warnings! (and we get the icons back)
-
- * gui/dialogs/comp-editor.c (pixmaps): removed the PrintPreview toolbar
- icon, since it doesn't appear in the xml file. Gets rid of warning.
-
- * gui/dialogs/event-page.c (notify_dates_changed): new function to
- emit the notification signal when the dates are changed. It also
- handles timezones now.
-
- * gui/dialogs/comp-editor-page.h (CompEditorPageDates): used
- CalComponentDateTime for start/end/due so we have the timezone as well
- as the time.
-
- * gui/dialogs/comp-editor-util.c (comp_editor_dates): updated to get
- the timezones as well as the times.
- (comp_editor_free_dates): new function needed to free all the structs.
-
- * gui/dialogs/recurrence-page.c (recurrence_page_set_dates): added call
- to preview_recur() to make sure the preview gets updated.
-
- * gui/dialogs/alarm-page.c (alarm_page_fill_widgets): free the
- CompEditorPageDates struct after use.
-
- * gui/tag-calendar.c (tag_calendar_by_comp): added 'comp_is_on_server'
- argument. If FALSE, we try to use builtin timezones first. This is
- needed for the recurrence page of the event editor, because the
- timezones may not have been added to the server yet. This and the
- changes to the notification stuff should fix bug #5034.
-
- * gui/gnome-cal.c (dn_query_obj_updated_cb): call above
- tag_calendar_by_comp() with TRUE since the events will be on the
- server in this case.
-
- * gui/e-day-view-layout.c:
- * gui/e-day-view.c: made sure an event always takes up at least one
- row, even when the start & end times are the same. Fixes bug #5944.
- I don't know if we should try to also handle events with the end time
- before the start time.
-
- * gui/e-week-view.c (e_week_view_style_set): check that the small font
- is actually smaller than the normal font. If it isn't, don't use it.
- Hopefully fixes bug #6876.
- (e_week_view_on_new_appointment): if only one day is selected, then
- we set the initial time of the event to 1/2-hour from the start of the
- working day, to differentiate 'New Appointment' from 'New All Day
- Event'. Fixes bug #8892.
-
- * gui/e-day-view.c (e_day_view_on_new_appointment): do the same as the
- above.
-
-2001-09-26 Federico Mena Quintero <federico@ximian.com>
-
- Fixes the GUI part of bug #7892.
-
- * gui/dialogs/alarm-page.c (get_alarm_duration_string): Return
- NULL if the duration is zero.
- (get_alarm_string): Handle duration of zero. Also, hopefully
- make the strings be more l10n-friendly.
-
- * gui/alarm-notify/alarm.c (alarm_ready_cb): I am a moron. Fix
- reversed test.
-
-2001-09-26 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor.c (comp_editor_destroy): disconnect
- signals first thing
-
-2001-09-26 Dan Winship <danw@ximian.com>
-
- * gui/Makefile.am (evolution_calendar_LDFLAGS): Add
- -export-dynamic to make glade custom widgets work on non-Linux.
-
-2001-09-26 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-util/cal-util.h: added CAL_MODE_INVALID to CalMode enum
-
-2001-09-26 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal.h: new proto
-
- * pcs/cal.c (impl_Cal_set_mode): implement set mode method
- (cal_class_init): set setMode function in epv
- (cal_notify_mode): notify listener of mode change
-
- * pcs/cal-factory.c (add_uri): deal with UriType renaming
-
- * pcs/cal-backend.h: add new virtual methods and protos
-
- * pcs/cal-backend.c (cal_backend_class_init): init new virtual
- methods to null
- (cal_backend_set_mode): sets mode
- (cal_backend_get_mode): gets mode
-
- * pcs/cal-backend-file.c (cal_backend_file_class_init): overide
- get_mode and set_mode methods
- (cal_backend_file_get_mode): return mode
- (notify_mode): have listeners notified of the set mode call
- (cal_backend_file_set_mode): set the mode by indicating not
- supported
-
- * cal-client/cal-listener.h: update proto
-
- * cal-client/cal-listener.c (impl_notifyCalSetMode): implement set
- mode callback
- (cal_listener_construct): take set mode callback
- (cal_listener_new): ditto
-
- * cal-client/cal-client.h: update protos, add signal proto
-
- * cal-client/cal-client.c (cal_client_class_init): add
- cal_set_mode signal
- (cal_set_mode_cb): handle set mode callback from listener
- (cal_client_open_calendar): pass additional param to cal_listener_new
- (cal_client_set_mode): wrapper to set the calendar mode
-
- * idl/evolution-calendar.idl: make UriType into CalMode, add
- SetModeStatus enum and notifyCalSetMode method to the listener
-
- * gui/calendar-offline-handler.c (create_connection_list): fetch
- the uri list ourselves
- (impl_prepareForOffline): reflect param change of
- create_connect_list
- (update_offline): ditto
- (backend_cal_set_mode): set mode call back
- (backend_cal_opened): cal opened call back, set mode to local
- (impl_goOffline): reflect UriType renaming
-
- * cal-util/cal-util.h: rename UriType to CalMode
-
-2001-09-25 Federico Mena Quintero <federico@ximian.com>
-
- Warning fixes courtesy of Chris Lahey <clahey@ximian.com>.
-
- * gui/e-itip-control.c (write_html): Warning fixes. Also, don't
- strdup() more than necessary.
-
- * gui/e-meeting-time-sel.c (e_meeting_time_selector_refresh_cb):
- Warning fixes.
-
- * gui/itip-utils.c (itip_addresses_get): Warning fixes.
-
- * gui/print.c (print_day_background): Warning fixes.
-
- * gui/dialogs/alarm-options.c (alarm_to_aalarm_widgets): Warning
- fixes.
- (alarm_to_palarm_widgets): Likewise.
-
- * gui/dialogs/delete-comp.c: #include "../calendar-config.h"
-
-2001-09-25 Federico Mena Quintero <federico@ximian.com>
-
- * gui/alarm-notify/alarm.c (alarm_ready_cb): Check that the
- timeout is not set up before we create a new one; the alarm_fn
- callback may cause the alarm system to re-enter and add a new
- alarm. Fixes bug #10840.
- (pop_alarm): Assert that there is at least one alarm in the queue.
-
-2001-09-25 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal.c: use bonobo-exception stuff to clean code
-
- * pcs/cal-factory.c (add_uri): add uri to the list if the type
- matches
- (impl_CalFactory_uriList): implement uriList method
-
- * pcs/cal-backend.h: new virtual function member
-
- * pcs/cal-backend.c (cal_backend_is_remote): call virtual function
-
- * pcs/cal-backend-file.c (cal_backend_file_class_init): override
- virtual function
- (cal_backend_file_is_remote): new virtual function, always return
- FALSE
-
- * idl/evolution-calendar.idl: uriList factory call, with flags for
- types to get
-
- * gui/dialogs/comp-editor.c (comp_editor_destroy): cast to remove
- warning
-
- * gui/e-itip-control.c (write_label_piece): kill warnings by take
- const char *
-
- * gui/component-factory.c (create_object): aggregate offline
- interface
-
- * gui/Makefile.am: compile new files
-
- * calobj.[hc]: Remove obsolete files
-
- * cal-util/cal-util.h: enum URI types for uriList call
-
- * cal-client/cal-client.c (build_uri_list): build list from string
- sequence
- (cal_client_uri_list): factory call to get uri list
-
- * cal-client/cal-client.h: new proto
-
- * cal-client/cal-client.c: use bonobo exception stuff to clean
- code
-
- * gui/calendar-offline-handler.[hc]: Start some skeleton routines
- for online/offline handling
-
- * pcs/cal-factory.c (launch_backend_for_uri): use accessor and
- remove FIXME
-
-2001-09-23 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (set_date_label): base text on component
- type
-
-2001-09-20 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/component-factory.c: don't use gnome_vfs_uri_new_private
- (fixes Ximian #10544)
-
-2001-09-20 Federico Mena Quintero <federico@ximian.com>
-
- * gui/component-factory.c: #include a few files we were missing
- from libgnomevfs.
-
-2001-09-20 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal-backend-file.c (load_db): gets a config db
- (cal_backend_file_destroy): release config db
- (cal_backend_file_init): use load_db
- (mail_account_get): gets a mail account by number
- (mail_account_get_default): gets the default mail account
- (mail_account_is_valid): looks to see if any accounts have the
- given address
- (create_user_free_busy): modularize so we can call multiple times
- if necessary, set organizer
- (cal_backend_file_get_free_busy): if the list of users is null,
- use the default account otherwise get the same info for each
- address that is an identity in the mailer
-
- * gui/itip-utils.c (itip_addresses_get): s/gint/glong/ for bonobo
- conf returns
-
- * gui/calendar-commands.c (publish_freebusy_cmd): fix problems
- from a merge so that we publish 6 weeks of free/busy information
- again
-
-2001-09-20 Larry Ewing <lewing@ximian.com>
-
- * gui/dialogs/recurrence-page.c (recurrence_page_destroy): make
- sure to release the ref on priv->comp.
-
- * gui/dialogs/comp-editor.c (real_edit_comp): make sure to release
- the ref on priv->comp.
-
-2001-09-19 Federico Mena Quintero <federico@ximian.com>
-
- * gui/alarm-notify/alarm-queue.c (audio_notification): Display a
- notification message always, in addition to playing the sound.
- (procedure_notification): Present a confirmation dialog before
- actually running the alarm's program.
- (procedure_notification): Use gnome_execute_shell() instead of
- gnome_execute_async() so that we handle multiple arguments
- properly. Plus, it is most likely what the user expects.
- (mail_notification): Display a message about unsupported email
- reminders instead of blindly dropping the alarm.
-
- * gui/dialogs/alarm-options.glade: Added an explanatory message
- about mail alarms not being supported.
-
- * gui/dialogs/alarm-page.glade: Removed the "Send an email"
- option.
-
- * gui/dialogs/alarm-page.c (action_map): Removed CAL_ALARM_EMAIL.
-
-2001-09-19 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/task-editor.c (init_widgets): listen for model
- changes
- (task_editor_edit_comp): add the attendees to the model and notify
- of need send
- (row_count_changed_cb): mark as changed when row added/deleted
- (model_row_changed_cb): mark as changed when row changes
-
- * gui/dialogs/event-editor.c (init_widgets): listen for model
- changes
- (event_editor_init): flip page order
- (event_editor_edit_comp): set needs send value
- (schedule_meeting_cmd): flip page order
- (row_count_changed_cb): mark as changed when row added/deleted
- (model_row_changed_cb): mark as changed when row changes
-
- * gui/dialogs/schedule-page.c: remove model change notification
- stuff
- (schedule_page_fill_widgets): no need to do the needs_send here
- because the editor handles this since it owns the model
-
- * gui/dialogs/event-editor.c (init_widgets): listen for model
- changes
- (event_editor_init): flip page order
- (event_editor_edit_comp): set needs send value
- (schedule_meeting_cmd): flip page order
- (row_count_changed_cb): mark as changed when row added/deleted
- (model_row_changed_cb): mark as changed when row changes
-
- * gui/dialogs/meeting-page.c (meeting_page_fill_widgets): no need
- to do the needs_send here because the editor handles this since it
- owns the model
- (invite_entry_changed): ditto
-
- * gui/dialogs/comp-editor.c (comp_editor_set_changed): new
- accessor
- (comp_editor_get_changed): ditto
- (comp_editor_set_needs_send): ditto
- (comp_editor_get_needs_send): ditto
-
- * gui/dialogs/comp-editor.h: new protos
-
- * gui/itip-utils.c (itip_addresses_get): reflect configuration
- path changes in the mailer
-
- * gui/e-meeting-model.c: remove commented out code, ifdef one
- section for later
-
-2001-09-19 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-factory.c (cal_factory_oaf_register): add a new parameter
- (const char *iid) to specify the OAFIID of the factory being
- registered
-
-2001-09-19 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-model.c (e_meeting_model_refresh_busy_periods):
- remove silly debug #if 0
-
- * gui/calendar-commands.c (publish_freebusy_cmd): g_list_free
- rather than g_free
-
- * gui/e-itip-control.c (write_html): eliminate code path that
- caused double freed memory
-
-2001-09-18 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/schedule-page.*: A page that shows the meeting time
- selector and free/busy data for attendees
-
- * gui/dialogs/meeting-page.c: use the meeting model to track/edit
- attendees, remove table value conversion routines and simple table
- routines
- (set_attendees): take a pointer array
- (meeting_page_destroy): destroy the pointer array, save state
- (meeting_page_init): new pointer array
- (meeting_page_fill_widgets): don't null the deleted attendees
- field
- (popup_delegate_cb): array add
- (popup_delete_cb): array add
- (cleanup_attendees): iterate over the array to unref now
- (meeting_page_fill_widgets): don't null out fields, no need to add
- attendees here
- (invite_entry_changed): use e_meeting_attendee routines
- (popup_delegate_cb): ditto
- (popup_delete_cb): ditto
- (meeting_page_new): take new arg and pass it to construct
- (meeting_page_construct): take new arg, use e-meeting-model
- routines to construct table
-
- * gui/dialogs/task-editor.c (task_editor_init): new meeting model
- (task_editor_destroy): unref the model
-
- * gui/dialogs/event-editor.c (event_editor_init): make new model
- and pass it to meeting and schedule pages
- (event_editor_set_cal_client): virtual function, set meeting model
- client
- (event_editor_edit_comp): add the attendees to the model
- (event_editor_destroy): unref model
-
- * gui/dialogs/comp-editor.h: add virtual function
- * gui/dialogs/comp-editor.c (comp_editor_set_cal_client): make
- set_cal_client a virutal function
-
- * gui/e-meeting-types.h: generally useful type defines
-
- * gui/e-meeting-time-sel*.[hc]: Move here and use an e-table for
- the attendee list and extract display information from the new
- meeting model and attendees
-
- * gui/e-meeting-time-sel.etspec: spec for the table
-
- * gui/e-meeting-attendee.[hc]: meeting attendees for the model,
- with to/from conversions for CalComponentAttendee structure, emits
- changed signal and allows getting and setting of free busy
- periods
-
- * gui/e-meeting-model.[hc]: move the model out on its own
-
- * gui/e-itip-control.c (write_error_html): clean up warnings
-
-2001-09-18 Federico Mena Quintero <federico@ximian.com>
-
- Fixes bug #6350.
-
- * gui/component-factory.c (remove_folder): Use a simplified method
- for removing our folder data; we just need to remove calendar.ics
- or tasks.ics and the corresponding backup files.
-
-2001-09-18 Federico Mena Quintero <federico@ximian.com>
-
- Fixes bug #2830.
-
- * gui/calendar-config.c (calendar_config_get_confirm_delete): New
- function.
- (calendar_config_set_confirm_delete): New function.
- (config_read): Get the default value for the ConfirmDelete option.
- (calendar_config_write): Set the value of ConfirmDelete.
-
- * gui/dialogs/delete-comp.c (delete_component_dialog): Handle the
- configuration option for confirmation.
-
- * gui/dialogs/cal-prefs-dialog.c (CalPrefsDialogPrivate): Added
- the fields for the Other page.
- (get_widgets): Handle the new widgets.
- (cal_prefs_dialog_show_config): Likewise.
- (cal_prefs_dialog_update_config): Likewise.
-
-2001-09-18 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/cal-client-multi.[ch]: new class for managing multiple
- calendars, with an API very similar to the CalClient one,
- for ease of transition from one to the other
-
- * gui/component-factory.c (xfer_folder, remove_folder, create_folder):
- reworked to be able to manage folders for any calendar backend, and
- not only the file: one
-
-2001-09-18 Rodrigo Moya <rodrigo@ximian.com>
-
- * idl/evolution-calendar.idl: changed signature for the getFreeBusy
- method, to return a sequence of CalObj's, and added sequence of users
- as a new parameter to that method
-
- * cal-client/cal-client.c (cal_client_get_free_busy): adapted to new
- IDL method signature, by adding a new "GList *users" parameter, for
- callers to be able to specify a list of users
-
- * pcs/cal-backend.[ch] (cal_backend_get_free_busy):
- * pcs/cal-backend-file.c (cal_backend_file_get_free_busy): add the
- "GList *users" parameter. In cal_backend_file_get_free_busy, call
- lookup_component to get the CalComponent for each uid, instead
- of calling cal_backend_get_object, which meant converting the
- component to a string and then parsing it again.
-
- * cal-client/client-test.c (cal_opened_cb):
- * gui/e-itip-control.c (send_freebusy):
- * gui/calendar-commands.c (publish_freebusy_cmd): adapted to
- new getFreeBusy method signature
-
-2001-09-17 Damon Chaplin <damon@ximian.com>
-
- * gui/calendar-model.c: added a timeout to refresh the list every
- 10 minutes. Not ideal, as the user may be editing a task when it gets
- refreshed.
- (adjust_query_sexp): use the 'completed-before?' operator to filter
- out tasks according to the config settings.
-
- * gui/dialogs/task-details-page.c (task_details_page_fill_widgets):
- added support for the 'Completed' date. This code must have got lost
- somewhere, as it used to work.
- (date_changed_cb): set the priv->updating flag while updating the other
- widgets.
-
- * pcs/cal-backend-file.c (cal_backend_file_update_objects): made sure
- we freed the components.
-
- * pcs/query.c (func_completed_before): added 'completed-before?'
- operator.
-
- * gui/calendar-config.c (calendar_config_configure_e_cell_date_edit):
- don't set the lower & upper hour. Use 0-24 like the EDateEdit does.
-
- * gui/dialogs/cal-prefs-dialog.c (cal_prefs_dialog_show_config): set
- the 12/24-hour time format options sensitive only if we support both.
-
- * gui/calendar-config.c (config_read): if the locale doesn't define
- 'am' and 'pm' strings then we must use 24-hour format.
-
- * gui/calendar-commands.c (calendar_set_folder_bar_label): don't
- translate the '%d' as it doesn't make much sense. Resolves bug #8027.
-
-2001-09-17 Federico Mena Quintero <federico@ximian.com>
-
- * gui/component-factory.c (owner_set_cb): Do not call
- calendar_config_init() here.
-
- * gui/main.c (main): Call calendar_config_init() here.
-
-2001-09-17 Federico Mena Quintero <federico@ximian.com>
-
- * gui/alarm-notify/alarm.c (queue_alarm): Duh, only setup the
- timeout if the list was empty.
- (alarm_ready_cb): Notify with the ID of the original alarm.
- (alarm_remove): Likewise.
-
-2001-09-17 Federico Mena Quintero <federico@ximian.com>
-
- Switch the alarm system from using SIGALRM to normal glib timers.
- Also, use a more robust de-queueing mechanism.
-
- * gui/alarm-notify/alarm.c (alarm_init): Removed.
- (alarm_done): Remove the glib timeout instead of closing the pipes
- and the signal handler.
- (alarm_add): Allow adding alarms that happen before right now.
- (queue_alarm): Use a glib timer instead of a signal.
- (alarm_remove): Adjust the timeout as appropriate.
-
- * gui/alarm-notify/notify-main.c (main): There is no need to
- initialize the alarm system now.
-
- * gui/main.c (main): Likewise.
-
-2001-09-17 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-model.c (calendar_model_init): get itip addresses
- (calendar_model_destroy): destroy same
- (calendar_model_value_at): do more thorough checking on whether to
- use recurring, assigned, assigned to or regular task icons
-
-2001-09-17 JP Rosevear <jpr@ximian.com>
-
- * cal-util/cal-component.c (for_each_remove_all_alarms): for each
- call back, removes the alarms
- (cal_component_remove_all_alarms): remove all alarms from the
- component
-
- * cal-util/cal-component.h: new proto
-
- * gui/e-itip-control.c (write_error_html): writes error messages
- rather than normal html
-
- * gui/itip-utils.c (itip_send_comp): remove all alarms if the
- method warrants it
-
-2001-09-16 Christopher James Lahey <clahey@ximian.com>
-
- * gui/dialogs/meeting-page.c (build_etable): Updated this to match
- the new ETableSimple interface.
-
-2001-09-14 Ettore Perazzoli <ettore@ximian.com>
-
- [Automake 1.5 fixes pointed out by Richard Boulton
- <richard@tartarus.org>, as per #9258.]
-
- * cal-client/Makefile.am: Set CLEANFILES directly instead of using
- `+='.
- * gui/Makefile.am: Likewise.
- * gui/alarm-notify/Makefile.am: Likewise.
- * pcs/Makefile.am: Likewise.
-
-2001-09-14 Damon Chaplin <damon@ximian.com>
-
- * gui/e-itip-control.c (ok_clicked_cb): added space after 'identities'
- in the message. Fixes bug #9896.
-
-2001-09-14 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/e-calendar.conduit.in: remove translation
- marker for now
-
-2001-09-13 JP Rosevear <jpr@ximian.com>
-
- * cal-util/cal-component.h: use ical partstat, role, cutypes
- directly
-
- * cal-util/cal-component.c: ditto
-
- * gui/e-itip-control.c (find_my_address): set my addresses if the
- addresses match
- (find_attendee): strstr returns non-null on a match
- (write_html): use new icon, select the name displayed (organizer
- or attendee) based on method,
- (ok_clicked_cb): when rsvp'ing strip off all but the attendee
- being replied for as is specified in the spec
- (find_attendee_partstat): new util function to extract the
- partstat of an attendee
- (update_attendee_status): updates the partstat of a specific
- attendee in the reply message
-
- * gui/dialogs/meeting-page.c: use ical partstat, role, cutypes
- directly
- (popup_delegate_cb): if we delegate, notify of needs send and
- changed
- (popup_delete_cb): notify of needs send and changed for each
- deletion
-
-2001-09-12 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-commands.c (publish_freebusy_cmd): send 6 weeks of
- free busy info starting with the UTC start of day
-
- * gui/itip-utils.c (get_label): create a text representation of
- the given icaltime
- (itip_send_comp): if the summary is empty, set the subject based
- on the type of component, put the right extension on free/busy
- components and base descriptions on type of component, include
- start/end for free/busy info
-
-2001-09-11 Federico Mena Quintero <federico@ximian.com>
-
- * gui/alarm-notify/alarm-queue.c (display_notification): Added an
- use_description argument so that other alarms can fall back to
- this type.
- (audio_notification): Implemented.
- (remove_comp): Call remove_queued_alarm() here; there is no longer
- a destroy notification function for alarms so must we do this
- manually.
- (alarm_trigger_cb): Do not pass the alarm to the notification
- functions so that we can free it ourselves before all the alarms
- in the component get freed.
- (display_notification): Get the alarm here instead of getting it
- as an argument.
- (procedure_notification): Implemented.
-
-2001-09-11 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/meeting-page.c (invite_entry_changed): free the
- destination vector when we finish with it, if we actually add
- anyone, notify listeners of the needs send and changed info. Fixes
- bug #8632.
-
-2001-09-10 Zbigniew Chyla <cyba@gnome.pl>
-
- * gui/print.c
- (format_date): Convert string generated by strftime to UTF-8.
- (print_week_view_background): Ditto.
- (print_month_summary): Ditto.
- (print_month_small): Use U_() instead of _().
- (print_day_background): Ditto.
- (print_todo_details): Ditto.
- (print_date_label): Convert generated string to UTF-8.
-
-2001-09-10 Federico Mena Quintero <federico@ximian.com>
-
- * cal-util/cal-component.c (cal_component_alarm_get_attach):
- Handle the new icalattach type instead of struct icalattachtype.
- (cal_component_alarm_set_attach): Likewise.
-
- * gui/dialogs/alarm-options.c (alarm_to_aalarm_widgets): Likewise.
- (alarm_to_palarm_widgets): Likewise.
- (aalarm_widgets_to_alarm): Likewise.
- (palarm_widgets_to_alarm): Likewise.
-
-2001-09-05 Ettore Perazzoli <ettore@ximian.com>
-
- [Fix #958, ShellComponents should not be created by factories, for
- the calendar.]
-
- * gui/GNOME_Evolution_Calendar.oaf.in: Remove the
- ShellComponentFactory.
-
- * gui/component-factory.c (create_object): Renamed from
- `component_fn'. Don't get any args.
- (component_factory_init): Create the component using
- `create_object()' and register it into OAF.
- (COMPONENT_FACTORY_ID): Removed.
- (COMPONENT_ID): New.
-
-2001-09-04 Federico Mena Quintero <federico@ximian.com>
-
- * gui/component-factory.c (sc_user_create_new_item_cb):
- Implemented.
-
- * gui/main.c (component_editor_factory_init): New function to
- create the factory for the comp_editor_factory.
-
- * gui/comp-editor-factory.c: Finished implementation.
-
- * gui/alarm-notify/alarm-queue.c (edit_component): Implemented the
- Edit command.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Added
- comp-editor-factory.[ch] to the list of sources.
-
-2001-09-03 Damon Chaplin <damon@ximian.com>
-
- * gui/calendar-commands.c (calendar_control_activate):
- * gui/tasks-control.c (tasks_control_activate): don't call
- calendar_config_check_timezone_set() now, since the startup wizard
- handles that.
-
- * gui/e-tasks.c (e_tasks_class_init): changed selection_changed signal
- to GTK_RUN_LAST. It has no reason to be GTK_RUN_FIRST.
-
- * gui/gnome-cal.c:
- * gui/e-week-view.c:
- * gui/e-day-view.c: added "selection_changed" signal,
- XX_delete_event() and XX_get_num_events_selected().
-
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw): fix the shadow
- around the dates at the top - it was 1 pixel off.
-
- * gui/calendar-commands.c: added sensitize_commands(), similar to in
- tasks-control.c, so we only make Cut/Copy/Delete sensitive when an
- event is selected. Also added delete_event_cmd().
-
- * gui/dialogs/task-page.c (task_page_set_summary):
- * gui/dialogs/event-page.c (event_page_set_summary): do nothing,
- since the summary only gets changed on the main event/task page now.
- Fixes bug #6939.
-
- * gui/e-day-view.c (e_day_view_on_main_canvas_drag_data_received):
- (e_day_view_on_top_canvas_drag_data_received): check that we are
- dragging an event from the same EDayView. We currently don't support
- DnD from other widgets.
- (e_day_view_update_top_canvas_drag): only get the summary if we
- actually have an event. Fixes bug #5162.
-
- * gui/e-day-view.c (e_day_view_on_editing_stopped): if the text hasn't
- changed we need to call e_day_view_update_event_label() to show the
- times again if necessary. Fixes bug #1813.
-
- * gui/dialogs/comp-editor.c (comp_editor_destroy): destroy the
- CompEditorPage objects here rather than in close_dialog(), after the
- widgets have been destroyed. We do this because the widgets have lots
- of signal handlers connected with the CompEditorPage objects as the
- signal data, so we want to ensure that the data pointer is always
- valid. (Alternatively we could disconnect all the handlers when the
- CompEditorPage objects are destroyed, or use connect_while_alive()).
- Fixes bug #7543.
-
- Note: there is still a small bug in that if you type in a time and
- then hit 'Save and Close', the time won't be saved. I'm not sure
- where this should be fixed - should the actions which close the
- dialog grab the focus to the toplevel, so any widgets currently
- being edited finish the edit and emit 'changed'?
-
- * gui/dialogs/recurrence-page.c (append_exception): use
- gtk_clist_set_row_data_full() so freeing is handled automatically by
- the GtkClist. This helps avoid problems at destroy-time.
- (exception_delete_cb): just call gtk_clist_remove() now. No need to
- free the row data as GtkCList now handles it.
- (recurrence_page_destroy): no need to free the data in the clist.
-
- * gui/dialogs/alarm-page.c: ditto.
-
- * gui/dialogs/meeting-page.c: ditto.
- (etable_destroy_cb): save the ETable state in this new handler cb
- rather than in the destroy method, since the widget will already be
- destroyed by then.
-
-2001-08-31 Damon Chaplin <damon@ximian.com>
-
- * gui/e-itip-control.c: changed 3 occurrences of 'Replyed' to 'replied'
-
-2001-08-31 Zbigniew Chyla <cyba@gnome.pl>
-
- * gui/e-itip-control.c (write_html):
- Marked strings for translation (with U_).
-
- * gui/itip-utils.c (itip_send_comp):
- Ditto.
-
-2001-08-31 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/comp-editor-util.c (comp_editor_contacts_to_widget):
- (comp_editor_contacts_to_component): fix debugging messages so they
- use "" rather than NULL. Fixes bug #8559.
-
-2001-08-29 Federico Mena Quintero <federico@ximian.com>
-
- * pcs/cal-backend-file.c (cal_backend_file_remove_object): See if
- the set of categories changed by using the removed_categories hash
- table.
- (cal_backend_file_init): Create a table of removed categories.
- This allows us to notify if and only if the set of category
- changes when an object is updated/removed, instead of
- unconditionally notifying if an object is updated.
- (cal_backend_file_update_objects): Only notify if the set of
- categories really changed.
- (update_categories_from_comp): Shuffle the categories between the
- priv->categories and priv->removed_categories lists.
-
-2001-08-28 Federico Mena Quintero <federico@ximian.com>
-
- Fixes bug #7879, a query may receive an update notification from
- the backend before the query itself gets populated.
-
- * pcs/query.c (ensure_sexp): New function; ensures that the esexp
- is created and notifies of parse errors. It is the bulk of
- start_query_cb() but put in a separate function so that we can
- share it elsewhere.
- (start_query_cb): Use ensure_sexp().
- (process_component_cb): Oops, notify of a successfully finished
- query.
- (match_component): Call ensure_sexp(). This function can be
- called by the backend notification callbacks before the query is
- populated, so we need to make sure the esexp exists here.
-
-2001-08-22 Federico Mena Quintero <federico@ximian.com>
-
- * gui/cal-search-bar.c (cal_search_bar_construct): Set the
- "category is" criterion as the default for the calendar and tasks.
-
-2001-08-22 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/recurrence-page.c (recurrence_page_fill_widgets):
- Unset the priv->updating flag before returning in the case the
- component has no recurrence information. Fixes bug #6850.
-
-2001-08-22 Federico Mena Quintero <federico@ximian.com>
-
- * gui/alarm-notify/alarm-queue.c (QueuedAlarm): Added a snooze
- flag to differentiate snoozed alarms from real occurrences.
- (add_component_alarms): Do not specify a destroy function for the
- alarm trigger. We handle this in the callbacks now.
- (alarm_trigger_cb): Just remove the alarms for the unimplemented
- notification types.
- (create_snooze): Implemented snooze.
- (notify_dialog_cb): Snooze as appropriate.
-
-2001-08-22 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (foreach_tzid_callback): call back to add
- timezones to the top level
- (itip_send_comp): call icalcomponent_foreach_tzid
-
-2001-08-22 Dan Winship <danw@ximian.com>
-
- * gui/gnome-cal.c: #include <libgnomevfs/gnome-vfs-types.h> so
- this will compile against gnome-vfs 1.0.1.
-
-2001-08-22 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_open): open the tasks folder
- associated with the calendar being opened, and not always the local
- tasks.ics file
-
- * pcs/cal-factory.c (open_fn): use gnome_vfs_uri_new_private when
- parsing the URI to allow non-registered URIs
-
-2001-08-21 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/alarm-options.c (alarm_to_palarm_widgets): Handle
- the case where there is no attachment. Fixes bug #7257.
-
-2001-08-21 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (write_html): strip the mailto bit for the
- email address if we display it
-
-2001-08-21 Damon Chaplin <damon@ximian.com>
-
- * pcs/query.c (func_is_completed): added new e-sexp operator. We
- don't currently use it though.
-
- * gui/dialogs/cal-prefs-dialog.glade: Changed '_Overdue' to 'O_verdue'
- since we have an '_Other' notebook tab. Added '_Hide' accel.
-
- * gui/dialogs/cal-prefs-dialog.c: hooked up config options to dialog.
-
- * gui/calendar-config.c: added config options for hiding completed
- tasks.
-
- * gui/e-week-view-event-item.c (e_week_view_event_item_draw):
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw_long_event):
- * gui/e-day-view.c (e_day_view_reshape_long_event): added 2 pixels
- extra space between icons and text for long events, and 1 pixel space
- between icons in all events.
- (e_day_view_realize): changed the background color to match the
- EGrayBar in the shell.
-
-2001-08-21 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-util.[ch]: new files to contain utility functions
- for calendar backends
-
- * pcs/cal-backend.c (cal_backend_add_cal): implement it here, and not in
- the calendar backends. Add a "cal_added" signal, so that backends are
- notified when a new Cal is added, if they need to
- (cal_backend_get_type_by_uid): implement it here
-
- * pcs/cal-backend-file.c (fill_alarm_instances_seq): moved to
- cal-backend-util.c
- (cal_backend_file_add_cal): removed
- (cal_backend_file_init): connect to the "cal_added" signal in the
- CalBackend class so that we can update categories when a new Cal is
- added
- (cal_backend_file_get_type_by_uid): removed
-
- * pcs/cal-backend-db.c (fill_alarm_instances_seq): moved to
- cal-backend-util.c
- (cal_backend_db_add_cal): removed
- (cal_backend_db_get_type_by_uid): removed
-
- * AUTHORS: added JP and Damon to list of authors
-
-2001-08-20 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-util/cal-util.[ch] (cal_util_generate_alarms_for_list):
- (cal_util_generate_alarms_for_comp):
- new functions moved from the CalBackendFile, to allow its use outside
- of it. The signature has changed a little bit, since these functions
- need a way to get the timezones from the callers, so a callback
- function to resolve the timezones has been added to the list of
- parameters
-
- * pcs/cal-backend-file.c (generate_alarms_for_list):
- (generate_alarms_for_comp): moved to cal-util, with all their related
- functions/structures
-
- * pcs/cal-backend-db.c: removed functions that were moved to cal-util
-
-2001-08-20 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/comp-editor.c (pixmaps): use Delete icon in menu, and
- change to bigger Save icon in toolbar.
-
- * gui/tasks-control.c:
- * gui/calendar-commands.c (pixmaps): used new_task-16.png and
- goto-16.png.
-
-2001-08-20 Damon Chaplin <damon@ximian.com>
-
- * gui/calendar-commands.c (pixmaps): added delete icons for menu
- and toolbar.
-
-2001-08-20 Damon Chaplin <damon@ximian.com>
-
- * gui/tasks-control.c: added Cut/Copy/Paste icons for toolbar.
-
-2001-08-20 Damon Chaplin <damon@ximian.com>
-
- * gui/tasks-control.c: uses new delete icons in menu & toolbar.
-
-2001-08-19 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component-factory.c: Update the folder list to include a
- display name and a description.
-
-2001-08-20 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/comp-editor.c (pixmaps): use new delete icon for toolbar.
-
-2001-08-19 Damon Chaplin <damon@ximian.com>
-
- * gui/e-itip-control.c: fixed typo, 'send' -> 'sent'. Bug #7621.
-
-2001-08-18 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.glade: added option to hide completed
- tasks after a given number of minutes/hours/days. Unfinished.
-
- * gui/dialogs/event-page.c (event_page_fill_component): initialize
- zone to NULL to avoid a warning.
- (contacts_clicked_cb): work around a bug in SelectNames by notifying
- that the page has changed when you click the 'Contacts' button.
- Otherwise it is easy to lose changes.
-
- * gui/dialogs/task-page.c (contacts_clicked_cb): ditto.
-
-2001-08-18 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/comp-editor.c (pixmaps): used new Save/Save As icons.
-
- * gui/tasks-control.c:
- * gui/calendar-commands.c (pixmaps): added new Cut/Copy/Paste icons,
- and changed the 'New Task' icon to use the bigger one I made.
-
-2001-08-05 Zbigniew Chyla <cyba@gnome.pl>
-
- * gui/dialogs/task-page.c (summary_changed_cb):
- Use e_dialog_editable_get instead of gtk_editable_get_chars (we need
- UTF-8 string).
-
-2001-08-18 Zbigniew Chyla <cyba@gnome.pl>
-
- * gui/calendar-config.c (locale_uses_24h_time_format): New.
- (config_read): Use locale's setting as default for
- /Calendar/Display/Use24HourFormat so that Europeans don't have to
- switch to 24-hour format manually.
-
-2001-08-17 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (destroy): destroy the addresses
- (clean_up): don't free the addresses, we need them
-
-2001-08-17 Damon Chaplin <damon@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_new_task): new function to open the
- task editor to add a new task.
-
- * gui/calendar-commands.c: added new_task_cb() to create a new task
- in the calendar folder, and added menu commands for it, and a toolbar
- button (I think that is what Ettore wanted. Maybe he just meant menu
- commands. Anyway, it is easy to take out.) Note that we don't have a
- decent icon for 'New Task' for the toolbar.
- Also added the new Goto button (but we don't have a similar one for
- the menu command).
-
-2001-08-16 Iain Holmes <iain@ximian.com>
-
- * gui/Makefile.am: Add the libetimezonedialog.a lib link
-
- * gui/calendar-config.c: Change the #include for the timezone dialog
-
- * gui/e-timezone-entry.c: Ditto.
-
- * gui/dialogs/Makefile.am: Remove the e-timezone-dialog stuff.
-
-2001-08-16 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/event-page.c: hide the timezone fields for all-day
- events. We will use DATE values for these eventually, and these
- don't have timezones associated with them. Currently we just use the
- default timezone for all-day events, as a workaround until we have
- DATE values working.
-
- * gui/dialogs/comp-editor-util.c (comp_editor_new_date_edit): added
- make_time_insensitive flag. Though we may not use it.
-
- * gui/dialogs/event-page.glade: made the 'All day event' toggle
- right-aligned, so it doesn't move when the other widgets are shown
- and hidden.
-
- * gui/e-timezone-entry.c (e_timezone_entry_set_default_timezone): new
- function to set the default timezone of the widget. If the current
- timezone setting matches the default then the entry field is hidden.
- Most people won't use timezones so this makes the GUI simpler.
-
- * gui/dialogs/event-page.c (init_widgets):
- * gui/dialogs/task-page.c (init_widgets): set the default timezone
- using the above function.
-
- * gui/dialogs/task-page.c (task_page_fill_widgets): if the start date
- or due date is not set, we use the default timezone, so the user
- doesn't have to set this each time they set the date.
-
-2001-08-16 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/alarm-page.c (alarm_page_fill_widgets): If the
- component has no alarms remember to set the priv->updating flag to
- FALSE before returning.
-
-2001-08-16 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/e-delegate-dialog.c
- (e_delegate_dialog_get_delegate_name): get the destinations
- property, not the text property
-
-2001-08-16 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/alarm-page.c (clear_widgets): Set the default-to-add
- notification to be display a message 15 minutes before the start
- of the appointment. Fixes bug #7175.
-
-2001-08-16 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/comp-editor-util.c (comp_editor_strip_categories):
- New function to strip surrounding whitespace from a string of
- categories entered by the user.
-
- * gui/dialogs/task-page.c (task_page_fill_component): Use
- comp_editor_strip_categories().
-
- * gui/dialogs/event-page.c (event_page_fill_component): Likewise.
-
-2001-08-16 Federico Mena Quintero <federico@ximian.com>
-
- * gui/calendar-config.c (calendar_config_configure_e_date_edit):
- Do not set the time popup range. We also want to be able to
- create appointments that are not within nine-to-five! Think of
- going to the movies! Fixes bug #7436.
-
- * gui/dialogs/cal-prefs-dialog.glade: "am/pm" is now "AM/PM".
- Fixes bug #7367.
-
-2001-08-16 Jon Trowbridge <trow@ximian.com>
-
- * gui/cal-search-bar.c: Changed to reflect my renaming of some of
- the more hideously-named functions in the ESearchBar API.
-
-2001-08-15 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor.c (save_comp): only fill the component
- and save it if something has changed
- (save_comp_with_send): only try to send if something has changed
- and the editor needs a send
-
-2001-08-15 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.glade: OK, re-added the default
- alarm options. Way too many people are asking for them.
-
-2001-08-15 Federico Mena Quintero <federico@ximian.com>
-
- * gui/component-factory.c (factory_fn): Add the user creatable
- items. The callback is not actually implemented yet; this is just
- to finalize the GUI.
-
- * gui/dialogs/cal-prefs-dialog.glade: Added an option to ask for
- confirmation when deleting items. Added underlined shortcuts
- (they may not all work currently).
-
-2001-08-14 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/task-page.c:
- * gui/dialogs/event-page.c: added support for the Contacts field.
- Note that I'm not sure what we should put in the iCalendar CONTACT
- properties. Currently we put "name <email>", but it isn't recognized
- as a contact when we reopen the dialog, so we may need more info here.
- Also we currently use a simple parser to parse the above format, and
- we should maybe use some camel function.
-
- * gui/dialogs/task-page.glade:
- * gui/dialogs/event-page.glade: replaced the GtkEntry fields for the
- Contacts with a GtkEventBox which we put the BonoboControl in at
- runtime.
-
- * gui/dialogs/meeting-page.c (invite_entry_changed): added FIXMEs
- since it doesn't seem to be freeing the EDestination stuff. JP?
-
- * gui/dialogs/comp-editor-util.c: added bunch of utility functions to
- handle the Contacts field in the main Event and Task pages.
-
- * gui/gnome-cal.c: added visible_start and visible_end fields, so we
- only emit the 'dates-shown-changed' signal when really necessary.
- Currently changing the folder title bar label results in a complete
- redraw of the Evolution window (silly GtkLabel queueing a resize),
- so we want to avoid that as much as possible.
- (gnome_calendar_new_appointment_for): only move the event's end time
- to the end of the day if it is not already 00:00:00.
-
- * gui/e-week-view-event-item.c:
- * gui/e-week-view.c:
- * gui/e-day-view.c: added support for double-clicking on an event to
- open it, and for double-clicking on the background to create a new
- event. There is still a minor problem to sort out, but it basically
- works.
-
- * cal-util/cal-component.c: added support for CONTACT properties,
- mainly by copying the code for COMMENT properties which are exactly
- the same type.
-
- * gui/e-day-view.c (e_day_view_realize): use the same color for the
- top canvas background as the shortcut bar, to make it look a little
- nicer (I think). Although we still have the theme problem with
- hard-coded colors.
-
-2001-08-14 Federico Mena Quintero <federico@ximian.com>
-
- * gui/e-calendar-table.etspec: Made the click-to-add message
- shorter. Fixes bug #7177.
-
-2001-08-14 Federico Mena Quintero <federico@ximian.com>
-
- * gui/calendar-commands.c (pixmaps): Added Tigert's new icons for
- Prev and Next.
-
-2001-08-14 Federico Mena Quintero <federico@ximian.com>
-
- * gui/cal-search-bar.c (make_suboptions): Make the "Any Category"
- item consistent with the one in the addressbook. Also, free the
- items correctly.
-
-2001-08-14 Federico Mena Quintero <federico@ximian.com>
-
- * gui/cal-search-bar.c (get_current_category): Handle an array of
- categories in the CalSearchBar instead of our own menu items.
- (notify_query_contains): Fetch the text from the search bar here
- instead of in regen_query().
- (regen_query): Handle category searches.
- (notify_category_is): New function.
- (cal_search_bar_construct): Do not create an option menu.
- (make_suboptions): New function to create the suboption items from
- the list of categories.
- (notify_query_contains): Do not include a category sexp here.
-
-2001-08-13 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (update_item): add dialog for feedback
- (remove_item): ditto
- (send_item): ditto
- (send_freebusy): ditto
-
-2001-08-13 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c: rewrite the gui to use gtkhtml
-
- * gui/Makefile.am: define the icon dir
-
-2001-08-12 Kjartan Maraas <kmaraas@gnome.org>
-
- * gui/e-itip-control.h: Remove #include <config.h> from here.
- * gui/itip-utilss.h: Same here.
-
-2001-08-11 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/tasks-control.c: Update the paths of the Tools menu
- according to the changes in the XML [i.e. things are moved to the
- ComponentToolsPlaceholder].
-
- * gui/calendar-commands.c: Likewise.
-
-2001-08-11 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/event-page.c (init_widgets):
- * gui/dialogs/task-page.c (init_widgets): turn on word-wrap for the
- description fields. Fixes bug #6821.
-
-2001-08-10 Jon Trowbridge <trow@ximian.com>
-
- * gui/cal-search-bar.c: Where we have ESearchBarItems, set their
- subitems to NULL.
-
-2001-08-09 Damon Chaplin <damon@ximian.com>
-
- * pcs/cal-backend.c (cal_backend_get_object_component): added new
- backend method to get the component given a UID.
-
- * pcs/cal-backend-file.c (cal_backend_file_get_object_component):
- added implementation of above virtual method.
-
- * pcs/query.c (match_component): use the new backend function to get
- the CalComponent rather than the string. This avoids converting all
- the calendar components to strings and parsing them back into
- components for every query! (That wasn't a good idea, was it ;)
-
- * gui/e-week-view.c:
- * gui/e-day-view.c: use a timeout handler to layout the events,
- to avoid doing a layout for each event we get from a query.
-
- * gui/print.c (print_day_add_event):
- * gui/e-day-view.c (e_day_view_add_event): set start_row_or_col and
- num_columns to 0. They are guint8's.
-
- * gui/e-week-view.c (e_week_view_free_events): hide all the jump
- buttons. Fixes bug #5946.
-
- * gui/calendar-commands.c (calendar_set_folder_bar_label): added the
- day numbers for the month view.
-
- * gui/dialogs/recurrence-page.glade: changed "_Delete" to "_Remove",
- since it clashed with "_Add". Also added underlined accelerators for
- the recurrence radio buttons. Note that none of these accelerators
- actually work at present, due to the way we are using .glade files
- for each notebook page. I need to add a bug about this.
- Also, the "_Action" menu doesn't popup when I press Alt+A, even though
- the "_File" menu does popup when I press Alt+F. Strange.
-
- * pcs/cal-backend-file.c (cal_backend_file_get_timezone_object):
- removed debug msgs.
-
-2001-08-09 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw_long_event):
- * gui/e-day-view-main-item.c (e_day_view_main_item_draw_day_event):
- * gui/e-week-view-event-item.c (e_week_view_event_item_draw_icons):
- unref the GdkPixmap and GdkBitmap returned by the function
- e_categories_config_get_icon_for ()
-
-2001-08-09 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/task-page.*: Remove progress frame
-
- * gui/dialogs/task-details-page.*: Put in progress frame, remove
- basics frame
-
- * gui/dialogs/task-editor.c (set_menu_sens): util function to set
- menu sensitivity based on state
- (task_editor_init): add meeting page
- (task_editor_edit_comp): show page if necessary
- (task_editor_destroy): unref meeting page
- (assign_task_cmd): bring up meeting page
- (refresh_task_cmd): save before sending
- (forward_cmd): ditto
-
- * gui/dialogs/comp-editor.c (save_cmd): implement new save command
-
-2001-08-09 Federico Mena Quintero <federico@ximian.com>
-
- * gui/e-itip-control.c (destroy): Chain to the destroy handler in
- the parent class!
-
- * gui/dialogs/comp-editor-page.c (comp_editor_page_destroy):
- Likewise. Sigh.
-
- * gui/cal-search-bar.c (cal_search_bar_destroy): Whoops, added a
- destroy handler.
-
-2001-08-08 Damon Chaplin <damon@ximian.com>
-
- * gui/goto-dialog.glade: removed underlined accelerator key from
- "_Go To Today" button. GnomeDialog doesn't actually support underlined
- accelerator keys for buttons. We could hack it, like Glade does, if
- we really need to. Fixes bug #6418.
-
-2001-08-08 Federico Mena Quintero <federico@ximian.com>
-
- * gui/e-day-view.c (update_query): Stop editing any event. Fixes
- bug #5949.
-
-2001-08-08 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/alarm-page.c (alarm_page_fill_component): Duuuh, set
- the alarm_copy on the component, not the original alarm. Fixes
- bug #5214.
-
-2001-08-08 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/meeting-page.c (set_attendees): set the attendees of
- a component
- (meeting_page_fill_component): use above
- (meeting_page_get_cancel_comp): return a comp with the attendees
- to be cancelled
-
- * gui/dialogs/meeting-page.h: get a component that will be sent as
- a cancellation
-
- * gui/dialogs/event-editor.c (event_editor_class_init): override
- send_comp class method
- (event_editor_send_comp): send cancellation notices to deleted
- attendees
- (refresh_meeting_cmd): save before send
- (forward_cmd): ditto
-
- * gui/dialogs/comp-editor.c (comp_editor_class_init): set default
- send_comp method
- (real_send_comp): do the real work
- (comp_editor_send_comp): call class method
- (save_comp): don't do any sending
- (save_comp_with_send): save and send here
- (prompt_to_save_changes): use above
- (save_close_cmd): ditto
-
- * gui/dialogs/comp-editor.h: add virtual function
-
-2001-08-08 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-week-view-event-item.c
- (e_week_view_event_item_draw_icons): don't use a NULL mask in the
- call to gdk_gc_set_clip_mask
-
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw_long_event):
- ditto
-
- * gui/e-day-view-main-item.c
- (e_day_view_main_item_draw_day_event): ditto
-
-2001-08-08 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit-config.h: fix pre-processor
- macros
-
- * conduits/calendar/calendar-conduit.h: ditto
-
- * conduits/todo/todo-conduit-config.h: fix pre-processor macros
-
- * conduits/todo/todo-conduit.h: ditto
-
-2001-08-07 Federico Mena Quintero <federico@ximian.com>
-
- * cal-client/cal-listener.c (cal_listener_stop_notification): New
- function to stop further notification from happening.
- (impl_notifyCalOpened): Do not notify if requested.
- (impl_notifyObjUpdated): Likewise.
- (impl_notifyObjRemoved): Likewise.
- (impl_notifyCategoriesChanged): Likewise.
- (CalListenerPrivate): Do not keep a reference to the server-side
- Cal. This would create a circular reference since the server
- keeps a reference to the listener.
- (cal_listener_destroy): Likewise.
- (impl_notifyCalOpened): Likewise.
-
- * pcs/cal.c (cal_destroy): bonobo_object_release_unref() the listener.
-
- * cal-client/cal-client.c (cal_client_destroy): Ask the listener
- to stop notifications. Also, do not unref it as the server does
- that itself when we unref the Cal.
-
-2001-08-07 Federico Mena Quintero <federico@ximian.com>
-
- * gui/calendar-model.c (calendar_model_free_value): Only unref the
- FIELD_COMPONENT if it is non-NULL. We return a NULL for that
- field from ::initialize_value(), after all. Fixes bug #6098.
-
-2001-08-07 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (itip_send_comp): Make calendar.ics the
- suggested name when attaching the ical object
-
-2001-08-06 Damon Chaplin <damon@ximian.com>
-
- * gui/e-week-view.h:
- * gui/e-day-view.h: added 'different_timezone' fields to EDayViewEvent
- and EWeekViewEvent, to note that the event is in a different timezone.
- We now compute this once when we add the event to the array, rather
- than each time we draw the event. If it is set, we will draw the
- timezone icon next to the event.
-
- * gui/e-day-view-main-item.c: take transparency into account when
- drawing the blue vertical bars to represent busy time.
-
- * gui/tag-calendar.c: take transparency into account when tagging
- the mini calendar.
-
- * gui/e-calendar-table.c (e_calendar_table_init): removed the "None"
- options for transparency and classification, since these properties
- have defaults anyway, so we may as well use those to keep it simple.
- Also use "Free" and "Busy" for transparency, rather than "Transparent"
- and "Opaque".
-
- * gui/calendar-model.c: updated classification & transparency code
- as above.
-
- * gui/e-calendar-table.etspec: changed "Transparency" to "Show Time As"
- since people have a chance of understanding that.
-
- * gui/e-week-view.c:
- * gui/e-day-view.c:
- * gui/gnome-cal.c: added functions to get the visible time range.
-
- * gui/calendar-commands.c: finished stuff to set the folder bar
- label to the dates currently displayed.
-
- * gui/control-factory.c (control_factory_new_control): connected
- signal to update the folder title bar label when the dates shown
- are changed. I had to connect it here since we need the BonoboControl
- in the callback, and I don't know how to get the control from the
- widget.
-
- * gui/tasks-control.c (tasks_control_activate): clear the folder bar
- label. We could display something here at some point.
-
- * gui/dialogs/recurrence-page.glade: changed "_Add" to "A_dd", since
- we have an "_Actions" menu. (These also use Alt+key, right?)
-
- * gui/dialogs/event-page.glade:
- * gui/dialogs/event-page.c: added 'Show Time As' field, which is
- really the TRANSP property but with a better name!
- Also changed one of the "_Confidential" to "Con_fidential" since we
- already have "_Contacts" using the same 'C' key.
-
- * pcs/cal-backend-file.c (cal_backend_file_get_free_busy): skip
- events that are TRANSPARENT. Also added comment as this code looks
- inefficient.
-
- * cal-util/cal-component.c: removed stuff for comparing timezones.
-
- * gui/comp-util.c (cal_comp_util_compare_event_timezones): moved the
- above function here, and updated it to compare the UTC offsets of the
- times as well as the TZIDs.
-
-2001-08-06 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.glade: In process of fixing bug
- #6005. The "Calendar" page is now "Display", and it has no
- frames. The "Task list" page has colons between the labels and
- the color pickers, and it has no frame.
-
-2001-08-06 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/cal-client.c (destroy_wombat_client): added check for
- NULL pointers. Maybe fixes #5203 (I can't reproduce it, so I'm not
- sure)
-
-2001-08-03 Federico Mena Quintero <federico@ximian.com>
-
- * cal-client/query-listener.c (query_listener_stop_notification):
- New function; stops further notification from happening. This is
- needed since the listener is destroyed asynchronously from the
- Wombat and the corresponding CalQuery may already have died.
- (impl_notifyObjUpdated): Do not notify if requested.
- (impl_notifyObjRemoved): Likewise.
- (impl_notifyQueryDone): Likewise.
- (impl_notifyEvalError): Likewise.
-
- * cal-client/cal-query.c (cal_query_destroy): Use
- query_listener_stop_notification().
-
- * cal-client/cal-listener.c (cal_listener_destroy): Nullify the
- pointers to the callback functions.
-
- * gui/e-day-view.c (update_query): Commit our state of no longer
- having a query before unrefing it. We may reenter from the ORBit
- main loop and we *really* want this information to be committed.
-
- * gui/e-week-view.c (update_query): Likewise.
-
- * gui/calendar-model.c (update_query): Likewise.
-
- * gui/tag-calendar.c (tag_calendar_by_comp): Added a "clear_first"
- argument that indicates whether the ECalendar should be cleared of
- any marks first.
-
- * gui/calendar-commands.c (calendar_control_activate): Removed
- ifdefed-out view buttons code from the Gnomecal days.
-
- * gui/gnome-cal.c (client_categories_changed_cb): Merge the
- categories of the calendar and tasks clients so that we can
- display the categories in both sets.
- (gnome_calendar_construct): Connect to "categories_changed" on
- both clients.
- (gnome_calendar_on_date_navigator_selection_changed): Removed call
- to gnome_calendar_update_view_buttons().
- (gnome_calendar_update_view_buttons): Removed. We cannot have
- this until Bonobo supports radio toolbar items.
- (gnome_calendar_set_view_buttons): Removed.
- (gnome_calendar_dayjump): Do not use priv->day_button.
- (GnomeCalendarPrivate): Removed the {day,work_week,week,month}_button
- fields.
- (gnome_calendar_set_query): Start a retagging process of the date
- navigator so that it reflects the current query.
- (update_query): New function to restart a query for the date navigator.
- (initial_load): Use update_query() instead of tagging the date
- navigator directly.
- (gnome_calendar_on_date_navigator_date_range_changed): Likewise.
- (client_cal_opened_cb): Use update_query() instead of initial_load().
- (initial_load): Removed.
- (client_obj_updated_cb): Removed.
- (client_obj_removed_cb): Removed.
- (gnome_calendar_new_appointment_for): Set the default category of
- the new component.
- (search_bar_category_changed_cb): Set the default category for the
- calendar views.
-
- * gui/cal-search-bar.c (cal_search_bar_set_categories): Sort the
- categories before creating the menu.
-
- * gui/e-day-view.c (adjust_query_sexp): Return NULL instead of
- "#f" if the time range is not set yet.
- (update_query): Do not start a query if the time range is not set.
- (e_day_view_set_default_category): New function.
- (e_day_view_key_press): Set the default category on the new
- component.
-
- * gui/e-week-view.c (adjust_query_sexp): Analogous to the above.
- (update_query): Analogous to the above.
- (e_week_view_set_default_category): Analogous to the above.
- (e_week_view_key_press): Analogous to the above.
-
-2001-08-03 Federico Mena Quintero <federico@ximian.com>
-
- Fixes bug #1407.
-
- * gui/dialogs/cal-prefs-dialog.glade: Removed the alarm
- preferences page, since we decided it was unnecessary.
-
-2001-08-03 Zbigniew Chyla <cyba@gnome.pl>
-
- I18n fixes.
-
- * gui/dialogs/event-page.c (summary_changed_cb):
- Use e_dialog_editable_get instead of gtk_editable_get_chars (we need
- UTF-8 string).
-
- * gui/itip-utils.c:
- Added missing #include <config.h>
-
-2001-08-02 Jon Trowbridge <trow@ximian.com>
-
- * gui/Makefile.am: Added camel dependency (now needed by ebook).
-
-2001-08-01 Federico Mena Quintero <federico@ximian.com>
-
- * gui/calendar-model.c (calendar_model_value_is_empty): If the
- default category is the same as the value passed in to this
- function, return TRUE. This could be a hack or not, but it
- prevents two items from being added to the table if a category is
- selected.
-
- * gui/e-tasks.c (setup_widgets): Allow the search bar to shrink
- horizontally.
-
- * gui/dialogs/task-page.c (clear_widgets): Pass valid values to
- e_dialog_option_menu_set(); these need to come from the status map.
-
-2001-08-01 Damon Chaplin <damon@ximian.com>
-
- * cal-client/cal-client.c: removed debugging messages.
-
-2001-08-01 Federico Mena Quintero <federico@ximian.com>
-
- The calendar search bar widget now includes a drop-down menu of
- available categories.
-
- * pcs/query.c (func_has_categories): Handle one and only one #f
- value as meaning "unfiled", for components that have no categories
- at all.
-
- * pcs/cal-backend-file.c (open_cal): Duh, do not notify here about
- changed categories since at this point we don't have any clients
- bound to us yet.
- (create_cal): Likewise.
- (cal_backend_file_add_cal): Notify here.
-
- * gui/cal-search-bar.h (CalSearchBarClass): New signal
- "category_changed".
-
- * gui/cal-search-bar.c (cal_search_bar_construct): Add a drop-down
- menu for the list of categories.
- (search_option_items): Removed the "Has category" option, since we
- now have the drop-down menu instad and it would be confusing to
- have both options.
- (regen_query): Likewise. Also, this function is now the old
- cal_search_bar_query_changed() and is shared by that very function
- and by the callback from the drop-down menu.
- (notify_query_contains): Include the sub-sexp for the categories.
- (cal_search_bar_set_categories): New function.
- (cal_search_bar_get_category): New function.
- (categories_selection_done_cb): Emit the "category_changed" signal.
-
- * gui/e-tasks.c (obj_updated_cb): Removed function since it did
- not do anything; all updates are handled by the CalendarModel.
- (obj_removed_cb): Likewise.
- (ETasksPrivate): Removed the fields for the categories option
- menu, since now it is in the ESearchBar.
- (search_bar_sexp_changed_cb): Use calendar_model_set_query()
- directly here, as we do not need to frob the sexp anymore.
- (update_query): Removed.
- (client_categories_changed_cb): New callback.
- (search_bar_category_changed_cb): New callback.
- (e_tasks_new_task): Set the default category on the component to
- the one that is selected in the search bar.
- (e_tasks_on_filter_selected): Removed.
- (e_tasks_on_categories_changed): Removed.
- (e_tasks_rebuild_categories_menu): Removed.
- (e_tasks_add_menu_item): Removed.
- (e_tasks_setup_view_menus): Sanitized not to sink objects wildly.
- (e_tasks_discard_view_menus): New function.
-
- * gui/calendar-model.h (CalendarModelClass): Removed the
- "categories_changed" signal since this is handled in the Wombat
- now.
-
- * gui/calendar-model.c (calendar_model_get_categories): Removed.
- (calendar_model_set_value_at): Do not collect the categories.
- (query_obj_updated_cb): Likewise.
- (calendar_model_collect_categories): Removed.
- (calendar_model_set_default_category): Constify.
-
- * gui/tasks-control.c (tasks_control_deactivate): Call
- e_tasks_discard_view_menus().
-
- * gui/gnome-cal.c (search_bar_category_changed_cb): Set the
- default category for the task pad's model.
-
-2001-07-31 Federico Mena Quintero <federico@ximian.com>
-
- The Wombat now keeps track of which categories are present in the
- objects of a calendar. It will notify the clients of changes in
- this set. This is to make the category drop-down menus in the
- calendar/tasks views be always up to date.
-
- * idl/evolution-calendar.idl (Listener): Added a
- notifyCategoriesChanged() method. The Wombat now keeps track of
- the categories within a calendar.
-
- * cal-client/cal-listener.[ch]: Switched it to use BonoboXObject.
- Also added the notifyCategoriesChanged implementation.
-
- * cal-client/cal-client.[ch]: Added a "categories_changed" signal.
-
- * pcs/cal-backend-file.c: Maintain a list of the live categories.
- (update_categories_from_comp): New function to maintain the set of
- live categories.
- (add_component): Update the set of categories.
- (remove_component): Likewise.
- (open_cal): Notify about changes in the set of categories.
- (create_cal): Likewise.
- (cal_backend_file_update_objects): Likewise.
- (cal_backend_file_remove_object): Likewise.
- (notify_categories_changed): New function to notify the clients
- about the current set of categories.
-
- * pcs/cal.c (cal_notify_categories_changed): New function.
-
-2001-07-31 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view.c (selection_received):
- * gui/e-week-view.c (selection_received): yes, set the end date, but
- correctly calculated, not by using the component's duration, which
- may not exist. Now really fixes #5836
-
-2001-07-31 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view.c (selection_received):
- * gui/e-week-view.c (selection_received): don't set the end date
- for the pasted components, since it will be recalculated when the start
- date is set, thus keeping the same duration than the original
- cut/copied component. Fixes #5836
-
-2001-07-30 Damon Chaplin <damon@ximian.com>
-
- * gui/gnome-cal.c:
- * gui/calendar-commands.c (clear_folder_bar_label): started some code
- to show the currently displayed dates in the folder title bar.
- Unfinished.
-
- * gui/e-itip-control.c (set_date_label):
- * conduits/todo/todo-conduit.c (local_record_from_comp):
- * conduits/calendar/calendar-conduit.c (local_record_from_comp): free
- the CalComponentDateTimes. (Note the iTIP control needs updating for
- timezone support.)
-
- * cal-util/cal-component.c: Changed CalComponentDateTime so that the
- TZID is malloc'ed and freed rather than being a pointer to a static
- string. This was causing problems as sometimes we were freeing the
- string that was being pointed to, so we got corrupted TZIDs.
-
- * gui/comp-util.c (cal_comp_util_add_exdate): set TZID to NULL.
- DATE values do not have timezones.
-
- * gui/e-week-view.c:
- * gui/e-day-view.c: Moved 'Paste' after the New Appointment commands,
- since I think they are more commonly-used. Also added underlined
- accelerator keys.
-
- * gui/e-calendar-table.c: changed 'Edit this task' to 'Open' in the
- popup menu to be consistent with other folders, and separated from the
- clipboard commands. Also changed to use EPopupMenu so the accelerators
- work, and the masks may be useful at some point.
-
- * gui/dialogs/recurrence-page.c: use DATE values for UNTIL, since
- that makes it simpler. Fixes bug #5034.
-
- * gui/calendar-config.c (calendar_config_set_timezone): strdup the
- location string. Fixes bug #4990.
-
- * gui/tag-calendar.c (tag_calendar_cb): take 1 off iend as the times
- don't include the end time.
-
- * gui/e-week-view-layout.c (e_week_view_layout_event): fixed
- days_shown. Fixes bug #5709.
-
- * cal-client/cal-client.c (cal_client_get_timezone): took out some
- debugging messages.
-
-2001-07-30 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.glade: added Help button. Though of
- course it doesn't do anything yet.
-
-2001-07-30 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/meeting-page.c: Mark strings for translation
-
-2001-07-30 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/client-test.c (cal_opened_cb): call
- cal_client_get_free_busy for testing the new method
-
- * pcs/cal-backend-file.c (cal_backend_file_get_free_busy): implemented
-
-2001-07-28 Federico Mena Quintero <federico@ximian.com>
-
- Fixes bug #5352.
-
- * gui/dialogs/cal-prefs-dialog.c (cal_prefs_dialog_show): Added a
- `page' argument so that we can select which page to show when
- popping up the dialog.
- (cal_prefs_dialog_construct): Added the `page' argument as well.
- (cal_prefs_dialog_new): Likewise.
-
- * gui/calendar-commands.c (settings_cmd): Set the page to the main
- calendar settings one.
-
- * gui/tasks-control.c (tasks_control_settings_cmd): Implemented
- callback for the "Task Settings" command.
- (verbs): Added the "TasksSettings" verb.
- (pixmaps): Added an icon for the tasks settings command.
-
-2001-07-27 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (local_record_from_comp):
- recur is always in UTC
-
-2001-07-27 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c: handle timezones
- everywhere
- (get_timezone): new function to get a timezone based
- on a tzid
- (get_default_timezone): get default timezone
-
- * conduits/calendar/calendar-conduit.h: time zone field for the
- context
-
- * conduits/calendar/Makefile.am: link to bonobo conf
-
- * conduits/todo/todo-conduit.c: handle timezones
- everywhere
- (get_timezone): new function to get a timezone based
- on a tzid
- (get_default_timezone): get default timezone
-
- * conduits/todo/todo-conduit.h: time zone field for the
- context
-
- * conduits/todo/Makefile.am: link to bonobo conf
-
-2001-07-27 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view-main-item.c (e_day_view_main_item_draw_day_event):
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw_long_event):
- * gui/e-week-view-event-item.c (e_week_view_event_item_draw_icons):
- initialize to NULL some pointers
-
- * e-calendar-table.c (selection_received): deal correctly with
- VCALENDAR objects
- (e_calendar_table_copy_clipboard): g_strdup the value returned by
- icalcomponent_get_as_ical_string
-
-2001-07-27 Federico Mena Quintero <federico@ximian.com>
-
- * gui/gnome-cal.c (gnome_calendar_set_query): Constify and set the
- query sexp on the task pad's model as well.
-
-2001-07-27 Federico Mena Quintero <federico@ximian.com>
-
- * gui/cal-search-bar.[ch]: New files with a derivative of
- ESearchBar that generates sexps for calendar queries directly.
-
- * gui/gnome-cal.c (setup_widgets): Use CalSearchBar instead of
- ESearchBar.
-
- * gui/e-calendar-table.h (ECalendarTable): Removed the ->colors
- array since it is handled by ETableExtras now.
-
- * gui/e-calendar-table.[ch]: Removed the subset_model. Now we use
- the live query facility to filter tasks. Removed the filter
- function stuff as well.
-
- * gui/e-tasks.c (e_tasks_construct): Use
- calendar_model_set_cal_client() directly instead of
- e_calendar_table_set_model().
- (setup_widgets): Create a calendar search bar for the tasks
- component.
- (search_bar_sexp_changed_cb): Set the query sexp on the table model.
- (e_tasks_on_filter_selected): Regenerate the query from the
- selected category and the current sexp.
- (update_query): New convenience function to recompute the real
- query sexp.
-
- * gui/gnome-cal.c (gnome_calendar_construct): Likewise.
-
- * gui/e-calendar-table.c (e_calendar_table_set_cal_client):
- Removed function; people are now supposed to get the model from
- the calendar table and operate on it.
-
- * gui/calendar-commands.c (verbs): Consistency fixes with the XML
- file.
- (pixmaps): Likewise.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Added
- cal-search-bar.[ch] to the list of sources.
-
-2001-07-20 Federico Mena Quintero <federico@ximian.com>
-
- * idl/evolution-calendar.idl (CompEditorFactory): New interface to
- a centralized factory for calendar component editors. Has
- editExisting() and editNew() methods to edit an existing component
- from a URI/UID pair, and to create a new component in a calendar
- that is in a particular URI, respectively.
-
- * gui/comp-editor-factory.[ch]: Implementation files for the
- component editor factory.
-
- * gui/GNOME_Evolution_Calendar.oaf.in: Added the CompEditorFactory
- stuff.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Added
- comp-editor-factory.[ch] to the list of sources.
-
-2001-07-26 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/meeting-page.c (invite_entry_changed): when an entry
- has changed, iterate over the elements of the entry and add them
- to the list if need be
- (get_select_name_dialog): add a Chair Persons section
-
- * gui/itip-utils.c (itip_send_comp): send the empty string as
- subject if there is no summary
-
-2001-07-26 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c (itip_send_comp): send the empty string as
- subject if there is no summary
-
- * gui/dialogs/meeting-page.c (cleanup_attendees): free a list of
- attendees
- (meeting_page_fill_widgets): clean up attendee lists and fix typo
- (find_match): add ability to return pos of match
- (popup_delete_cb): if deletion happens, make sure to tidy up
- delegation chain
-
- * gui/dialogs/e-delegate-dialog.c (e_delegate_dialog_construct):
- use the destination rather than text property
- (e_delegate_dialog_get_delegate): ditto
- (e_delegate_dialog_new): take name/address pair for dialog default
-
- * gui/dialogs/e-delegate-dialog.h: update protos
-
- * gui/e-itip-control.c (clean_up): only unref the object if we
- have one
-
- * gui/itip-control-factory.c (stream_read): make sure we null
- terminate the final buffer
-
- * gui/itip-utils.c (itip_send_comp): strip the mailto: from the
- organizer address if necessary
-
-2001-07-26 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/recurrence-page.c (exception_select_row_cb): check that
- the row passed in is valid. Sometimes we get the "row-selected"
- signal for row 0 when there are no rows in the list. Fixes bug #4266.
-
- * cal-client/cal-client.c (cal_client_get_object): prefetch all the
- timezone data needed by the object, to try to avoid making Corba
- calls all over the place. They can cause problems because they call
- the GTK+ main loop recursively. This currently leads to an assertion
- failure in the GnomeCanvas occasionally.
-
-2001-07-25 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (e_itip_control_set_data): gracefully
- handle the lack of a method
-
-2001-07-25 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view.c (selection_received_cb): check type of component
- before actually pasting.
- Deal with VCALENDAR components also (fixes bug #5140)
-
- * gui/e-week-view.c (selection_received_cb): ditto
-
- * cal-client/cal-client.c (cal_client_update_object): check the return
- value from cal_component_get_as_string and don't call
- GNOME_Evolution_Calendar_Cal_updateObjects if NULL
-
-2001-07-25 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/comp-editor.c (pixmaps): used the new print preview icon.
-
- * gui/print.c (range_selector_new): changed the 'Current day/week...'
- strings to 'Selected day/week...' to make a little less confusing.
- Fixes bug #5451.
-
-2001-07-25 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/meeting-page.c (is_duplicate): see if the address is
- already in the list of attendees
- (duplicate_error): throw up an error dialog
- (popup_delegate_cb): if the attendee has already delegated, delete
- the old delegatee
- (value_at): cast to kill warnings
- (append_row): don't add the new attendee if they are already in
- the list
-
-2001-07-24 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/recurrence-page.c (get_exception_string): calculate
- tmp_tm.tm_wday ourselves. strftime has a habit of crashing if you
- have weird values here. I think this fixes bug #4574.
-
-2001-07-24 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/meeting-page.c (value_at): stip the delto and
- delfrom
- (popup_delegate_cb): show a delegate dialog and add the new
- delegatee and update the delegator
- (add_section): listen for changes in a more direct manner
- (get_select_name_dialog): add_section now takes a limit argument
-
- * gui/dialogs/e-delegate-dialog.[hc]: New dialog to query the user
- for a person to delegate to
-
- * gui/dialogs/Makefile.am: build/install new files
-
- * gui/Makefile.am: add ldadd line for ebook
-
-2001-07-21 Damon Chaplin <damon@ximian.com>
-
- * gui/e-week-view-event-item.c (e_week_view_event_item_draw): fixed
- the test to see whether we should draw the icons.
-
-2001-07-22 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component-factory.c (get_local_file_name_for_folder_type):
- New helper function.
- (remove_folder): Add a @type arg and handle it, by deleting
- "tasks.ics" instead of "calendar.ics" if the type is "tasks". If
- the type is not "tasks" or "calendar", report an
- `UNSUPPORTED_TYPE' error.
- (xfer_folder): Likewise.
-
-2001-07-21 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component-factory.c: Make folders of type "calendar" and
- "tasks" user-creatable by setting `user_creatable' to %TRUE in the
- `EvolutionShellComponentFolderType's.
-
-2001-07-19 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/event-editor.h (event_editor_update_widgets):
- Removed unused prototype.
-
- * gui/dialogs/task-editor.h (task_editor_update_widgets):
- Likewise.
-
-2001-07-19 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (clean_up): free various data related
- settings
- (destroy): use cleanup and unref the clients
- (e_itip_control_set_data): clean up before setting the data and
- store the timezones in a top level component
- (update_item): use cal_client_update_objects and our top level
- (including the timezones)
-
-2001-07-19 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/comp-editor.c (pixmaps):
- * gui/calendar-commands.c (pixmaps): updated to use new print icon.
-
-2001-07-17 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/recurrence-page.c (init_widgets): don't show the time
- in the EDateEdit widget for adding EXDATEs.
-
- * cal-util/cal-component.c (cal_component_alarm_set_trigger): don't
- set t.time.is_date to -1. It is a boolean flag, 0 or 1. We probably
- don't want a date value, so we leave it at 0.
-
-2001-07-18 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view-main-item.c (e_day_view_main_item_draw_day_event):
- do not discard drawing icon if mask is NULL
-
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw_long_event):
- ditto
-
-2001-07-17 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (get_next): find the next displayable
- component
- (get_prev): find the previous displayable component
- (e_itip_control_set_data): use above
- (prev_clicked_cb): ditto
- (next_clicked_cb): ditto
-
-2001-07-17 Federico Mena Quintero <federico@ximian.com>
-
- Really fixes #4380. The previous fix was necessary but not
- sufficient; it worked for me because my system timezone happens to
- match the Evolution timezone --- if they don't match, the bug
- would persist. Not matching is *not* an error; it is just a
- matter of Unix sucking a lot and XST not being finished :)
-
- * cal-util/timeutil.c (time_to_gdate_with_zone): New function. We
- cannot use g_date_set_time() anymore because it does not take
- timezones into account.
-
- * gui/gnome-cal.c (get_days_shown): Use the function above.
-
- * gui/e-day-view.c (e_day_view_find_work_week_start): Likewise.
-
- * gui/e-week-view.c (e_week_view_set_selected_time_range): Likewise.
-
-2001-07-17 Jon Trowbridge <trow@ximian.com>
-
- * gui/dialogs/meeting-page.c (invite_entry_changed): Print
- a g_message when the list of invited people changes
- in the SelectNames control.
- (add_section): #if 0/#endif out some (broken?) code.
- (get_select_name_dialog): Listen for changes in the
- SelectNames control.
-
-2001-07-17 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/e-timezone-dialog.c (e_timezone_dialog_destroy): destroy
- the dialog widget here. Fixes bug #4198.
-
-2001-07-16 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/task-page.c (task_page_fill_widgets):
- * gui/dialogs/event-page.c (event_page_fill_widgets): try to use
- builtin timezones before getting them from the server. When creating
- new events/tasks the timezones may not be on the server.
-
- * gui/dialogs/event-page.c (event_page_fill_widgets): for all-day
- events we subtract a day from the end date rather than add it.
-
- * gui/dialogs/e-timezone-dialog.c (on_map_leave): ignore the event
- if it isn't a GDK_CROSSING_NORMAL event. For some reason we are getting
- leave events when the button is pressed, which meant that selecting
- timezones in the map didn't work.
-
- * gui/dialogs/comp-editor-util.c (comp_editor_dates):
- * gui/print.c (print_date_label): only free icaltimetype if not NULL.
-
-2001-07-12 Taylor Hayward <taylorhayward@yahoo.com>
-
- * gui/goto-dialog.glade:
- * gui/meeting-mockup.glade:
- * gui/alarm-notifyålarm-notify.glade:
- * gui/dialogs/alarm-page.glade:
- * gui/dialogs/meeting-page.glade:
- * gui/dialogs/recurrence-page.glade: Added missing underlined
- shortcuts.
-
-2001-07-12 JP Rosevear <jpr@ximian.com>
-
- * cal-util/cal-util.h: new proto
-
- * cal-util/cal-util.c (cal_util_new_top_level): standard place to
- get your top level calendar component
-
- * pcs/cal-backend-file.c (create_cal): use it
-
- * gui/itip-utils.c (itip_send_comp): ditto
-
- * gui/e-calendar-table.c (e_calendar_table_copy_clipboard): ditto
-
-2001-07-12 JP Rosevear <jpr@ximian.com>
-
- * gui/e-calendar-table.c (e_calendar_table_copy_clipboard): fix
- typo breaking compilation
-
- * gui/dialogs/meeting-page.c: fix include
-
- * gui/dialogs/Makefile.am: build select names idl here
-
- * gui/Makefile.am: remove select names compilation from here
-
-2001-07-12 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/task-details-page.c (task_details_page_set_dates):
- guard against infinite loops with the updating boolean, fixes 4270
-
-2001-07-12 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-calendar-table.c: added support for multiple selections in
- cut/copy/paste. Also, it's now ready for the
- s/update_object/update_objects change (I think)
-
-2001-07-11 Damon Chaplin <damon@ximian.com>
-
- * idl/evolution-calendar.idl: renamed updateObject to updateObjects
- and removed the UID argument, since it can add/update multiple objects
- at once. (It can't yet, but it will!)
-
- * pcs/cal.c:
- * pcs/cal-backend.[hc]:
- * pcs/cal-backend-file.c: renamed update_object to update_objects and
- got rid of the UID arg.
-
- * cal-client/cal-client.c (cal_client_update_objects): new function to
- add/update multiple objects in one go, i.e for iTIP and for importing
- calendars.
-
- * gui/print.c (print_date_label): fixed type bug.
-
- * gui/e-week-view.[hc]:
- * gui/e-week-view-event-item.c: draw the timezone icons if the event's
- DTSTART or DTEND is in a different timezone to the current one.
- Note that we may want to change this so it compares the UTC offsets
- rather than the TZIDs, since currently it will draw the icons for all
- events coming from iTIP requests from other clients.
-
-2001-07-11 Federico Mena Quintero <federico@ximian.com>
-
- Fixes bug #4380 as well as some leftovers from the days of struct
- tm and some uninitialized values.
-
- * gui/gnome-cal.c
- (gnome_calendar_on_date_navigator_selection_changed): Initialize
- the icaltimetype structures completely.
- (gnome_calendar_init): Do not reset priv->zone to NULL here, since
- it was set by gnome_calendar_update_config_settings() from
- setup_widgets().
-
- * gui/calendar-model.c (set_completed): Do not set is_daylight.
-
- * gui/e-day-view.c (e_day_view_convert_grid_position_to_time):
- Likewise.
-
- * gui/e-week-view.c (e_week_view_set_timezone): Likewise.
-
- * cal-util/cal-recur.c (generate_instances_for_chunk): Likewise,
- and initialize start_tt and end_tt completely.
-
- * cal-util/timeutil.c (time_year_begin_with_zone): Likewise.
- (time_month_begin_with_zone): Likewise.
- (time_week_begin_with_zone): Likewise.
- (time_day_begin_with_zone): Likewise.
- (time_day_end_with_zone): Likewise.
- (time_from_isodate): Likewise.
-
- * gui/dialogs/task-page.c (task_page_fill_component): Initialize
- icaltime before using it.
-
- * gui/dialogs/event-page.c (event_page_fill_component): Likewise.
-
- * gui/dialogs/recurrence-page.c (simple_recur_to_comp): Removed an
- unused icaltimetype.
-
- * gui/dialogs/task-details-page.c
- (task_details_page_fill_component): Initialize icaltime before
- using it.
-
-2001-07-11 JP Rosevear <jpr@ximian.com>
-
- * gui/component-factory.c: fix the calendar not exiting with a
- gross hack because i don't have time to fix the ref counting right
- now
-
-2001-07-11 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/meeting-page.c: be careful about adding and
- stripping MAILTO:'s properly
-
- * gui/dialogs/meeting-page.etspec: add missing columns
-
- * gui/itip-utils.c (itip_strip_mailto): point to the real start of
- the email address
-
- * gui/itip-utils.h: add proto
-
- * gui/itip-control-factory.c: get rid of the my address property
-
- * gui/e-itip-control.c: use the users real identity to figure out
- which attendee they are
- (find_my_address): figure out who the user is among the attendees
-
- * gui/e-itip-control.h: remove protos
-
- * gui/dialogs/Makefile.am: extra dist etspecs
-
- * gui/Makefile.am: ditto
-
-2001-07-11 Kjartan Maraas <kmaraas@gnome.org>
-
- * gui/e-calendar-table.c: Added a hack to get the last
- string translated since xml-i18n-tools doesn't recognize
- _click-to-add-message="Click here to add a task".
-
-2001-07-10 Peter Williams <peterw@ximian.com>
-
- * gui/Makefile.am (BUILT_SOURCES): Move this higher so that
- Makefile properly depends on us. Fixes distcheck.
-
-2001-07-11 Jason Leach <jleach@ximian.com>
-
- [Fix bug #4389: ETableSpecification still in e-calendar-table.c
- file]
-
- * gui/e-calendar-table.etspec: New file containing the spec that
- was in e-calendar-table.c as a big string.
-
- * gui/e-calendar-table.c (e_calendar_table_init): Use the spec
- file instead of a string.
- (e_calendar_table_get_spec): Removed this function, we don't need
- it anymore.
-
- * gui/e-tasks.c (e_tasks_setup_menus): Don't load from string,
- from file instead.
-
- * gui/Makefile.am: Necessary changes to get the new .etspec file
- installed.
-
-2001-07-10 Jason Leach <jleach@ximian.com>
-
- [Fix bug #4388: ETableSpecification still in meeting-page.c file]
-
- * gui/dialogs/meeting-page.etspec: New file containing the spec
- that was previously in meeting-page.c as a string.
-
- * gui/dialogs/meeting-page.c: One line change to get it to use
- this spec file instead of a string.
-
- * gui/dialogs/Makefile.am: Necessary changes to get the new
- meeting-page.etspec installed.
-
-2001-07-10 Damon Chaplin <damon@ximian.com>
-
- * gui/calendar-model.c:
- * gui/e-calendar-table.c:
- * gui/e-day-view-main-item.c:
- * gui/e-day-view-top-item.c:
- * gui/e-day-view.[hc]:
- * gui/e-week-view.c:
- * gui/gnome-cal.c:
- * gui/print.c:
- * gui/dialogs/cal-prefs-dialog.c:
- * gui/dialogs/comp-editor-util.c:
- * gui/dialogs/event-page.c:
- * pcs/cal-backend-file.c:
- * pcs/query.c:
- * cal-util/cal-component.[hc]:
- * cal-util/cal-recur.c:
- * cal-util/timeutil.[hc]:
- * cal-client/cal-client.[hc]: more timezone updates. I'm pretty much
- done with the calendar code now, except for alarms and conduits,
- which Federico and JP know more about. And there are a couple of
- other minor things to fix. But it is still pretty buggy.
-
-2001-07-10 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/meeting-page.c: Add popup support so you can delete
- users from the list
-
- * gui/dialogs/comp-editor.c (setup_widgets): fix typo
-
-2001-07-10 Federico Mena Quintero <federico@ximian.com>
-
- * gui/alarm-notify/alarm-queue.c (alarm_trigger_cb): Handle the
- different alarm actions.
- (display_notification): Do the alarm notification dialog here.
-
- * gui/alarm-notify/alarm-notify-dialog.c (make_heading): Take in a
- CalComponentVType, not a whole component.
- (alarm_notify_dialog): Take in a CalComponentVType and the final
- message instead of generating it ourselves.
-
-2001-07-09 Federico Mena Quintero <federico@ximian.com>
-
- * pcs/cal-backend-file.c (generate_alarms_for_comp): Pass the
- parent vCalendar component as the timezone closure of
- cal_recur_generate_instances().
-
- * gui/dialogs/alarm-page.c (get_alarm_string): Make the string
- consistent with the option menu text.
- (get_alarm_string): Removed extra spaces from the last part of the
- alarm string.
-
-2001-07-09 Federico Mena Quintero <federico@ximian.com>
-
- * gui/e-day-view.c (e_day_view_key_press): Use
- e_utf8_from_gtk_event_key() so that we can input utf8 text
- properly.
- (e_day_view_cut_clipboard): Constify.
- (e_day_view_on_cut): Constify.
- (e_day_view_reshape_long_event): Remove unused variable.
-
- * gui/e-week-view.c (e_week_view_key_press): Use
- e_utf8_from_gtk_event_key() so that we can input utf8 text
- properly.
- (e_week_view_cut_clipboard): Constify.
- (e_week_view_on_cut): Constify.
-
- * cal-client/cal-client.c (cal_client_resolve_tzid_cb): Fix the
- prototype so that this matches CalRecurResolveTimezoneFn. Also
- renamed it so that it is clear that it is supposed to be a
- callback.
-
-2001-07-06 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/meeting-page.c (init_widgets): connect to the entry
- not the combo
-
- * gui/dialogs/event-editor.c (set_menu_sens): set menu
- sensitivities based on whether or not the meeting page is shown
- (event_editor_init): call above
- (event_editor_edit_comp): ditto
- (schedule_meeting_cmd): ditto
-
- * gui/dialogs/comp-editor.h: new proto
-
- * gui/dialogs/comp-editor.c (comp_editor_set_ui_prop): new
- function to allow for set of ui props (esp. "sensitive")
-
-2001-07-06 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/meeting-page.c (clear_widgets): actually clear some
- widgets and hide/show widgets in the default setup
- (meeting_page_destroy): destroy the address lists
- (meeting_page_fill_widgets): allow the user to select among their
- identities as a new organizer, or show the existing organizer as
- label
- (meeting_page_fill_component): set the "MAILTO:" bit of the
- organizer to match spec, set CN properly if we know it
- (get_widgets): load new widgets
- (other_clicked_cb): handle "Other Organizer" click
- (change_clicked_cb): handle "Change Organizer" click
- (init_widgets): listen for clicks on new buttons
-
- * gui/dialogs/comp-editor.c (comp_editor_remove_page): remove the
- page from our internal list and unref it
-
- * gui/itip-utils.c (itip_addresses_get): get the configure mail
- identities
- (itip_addresses_free): free a list of identities returned by
- itip_addresses_get
-
- * gui/itip-utils.h: remove obsolete protos, and new protos
-
- * gui/gnome-cal.html: Remove ancient file
-
-2001-07-04 Federico Mena Quintero <federico@ximian.com>
-
- Fixes bug #4018 and what would be the analogous bugs for the other
- component editors.
-
- * gui/dialogs/comp-editor-page.h (CompEditorPageClass): New
- virtual method "::focus_main_widget()".
-
- * gui/dialogs/comp-editor-page.c
- (comp_editor_page_focus_main_widget): New function.
-
- * gui/dialogs/comp-editor.c (comp_editor_append_page): If we are
- inserting the main page, ask it to focus its main widget.
-
- * gui/dialogs/alarm-page.c (alarm_page_focus_main_widget):
- Implemented.
-
- * gui/dialogs/event-page.c (event_page_focus_main_widget):
- Implemented.
- #include "e-util/e-categories-config.h".
-
- * gui/dialogs/meeting-page.c (meeting_page_focus_main_widget):
- Implemented.
-
- * gui/dialogs/recurrence-page.c
- (recurrence_page_focus_main_widget): Implemented.
-
- * gui/dialogs/task-details-page.c
- (task_details_page_focus_main_widget): Implemented.
-
- * gui/dialogs/task-page.c (task_page_focus_main_widget):
- Implemented.
-
-2001-07-04 Federico Mena Quintero <federico@ximian.com>
-
- * gui/calendar-commands.c (clear_folder_bar_label): New function.
- (calendar_control_activate): Clear the folder bar label; we really
- don't have anything interesting to display.
-
-2001-07-03 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/meeting-page.c: Add new columns for information
- specification
- (meeting_page_destroy): save the table state
- (build_etable): load new table state
-
- * gui/dialogs/task-editor.c (task_editor_destroy): unref pages
-
- * gui/dialogs/event-editor.c (event_editor_destroy): unref pages
-
- * gui/dialogs/comp-editor.c (setup_widgets): kill warning
- (comp_editor_append_page): ref page passed in
- (close_dialog): unref pages
-
-2001-07-03 Damon Chaplin <damon@ximian.com>
-
- * gui/e-day-view.c (query_obj_updated_cb): fix warning, and added
- some debug messages.
-
- * gui/dialogs/comp-editor-util.c (write_label_piece):
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw): call mktime()
- to set the weekday, though this is a temporary fix.
-
-2001-07-03 Damon Chaplin <damon@ximian.com>
-
- * pcs/cal-backend.[hc]: added virtual method to get a VTIMEZONE
- component given a TZID. We need this to resolve TZIDs when expanding
- an event using cal_recur_generate_instances() in query.c.
-
- * pcs/cal-backend-file.c (cal_backend_file_get_timezone): implemented
- virtual method.
- (cal_backend_file_update_object): fixed bug, kind -> child_kind.
-
- * pcs/query.c (func_occur_in_time_range): use the virtual method for
- resolving TZIDs. The other way didn't work anyway, as we didn't have
- the entire VCALENDAR with VTIMEZONEs in it.
-
- * gui/dialogs/recurrence-page.c (init_widgets):
- (make_ending_until_special): moved the call to
- e_date_edit_set_get_time_callback() from init_widgets to
- make_ending_until_special(), since that is where the widget gets
- created.
-
- * gui/e-timezone-entry.c (e_timezone_entry_set_timezone): handle zone
- being NULL.
-
-2001-07-02 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/alarm-options.[ch]: New files with the alarm options
- dialog; this configures the repeat/duration properties and the
- options specific to each alarm action type.
-
- * gui/dialogs/alarm-page.c (AlarmPagePrivate): Added the alarm
- options button. Also, keep an alarm structure which we are
- editing and an alarm options dialog.
- (init_widgets): Connect to the options button.
- (add_clicked_cb): Clone the component we are editing instead of
- creating a new one so that we preserve the data from the alarm
- options dialog.
- (button_options_clicked_cb): Pop up the alarm options dialog.
-
- * cal-util/cal-component.c (cal_component_alarm_new): Doh,
- initialize the other fields in the new alarm.
-
-2001-07-03 Damon Chaplin <damon@ximian.com>
-
- * cal-client/cal-client.[hc]
- * cal-util/cal-component.c
- * cal-util/cal-recur.[hc]
- * cal-util/test-recur.c
- * cal-util/timeutil.c
- * gui/calendar-config.c
- * gui/calendar-model.[hc]
- * gui/comp-util.[hc]
- * gui/e-calendar-table.c
- * gui/e-day-view-main-item.c
- * gui/e-day-view-top-item.c
- * gui/e-day-view.[hc]
- * gui/e-itip-control.c
- * gui/e-timezone-entry.[hc]
- * gui/e-week-view.[hc]
- * gui/gnome-cal.[hc]
- * gui/goto.c
- * gui/tag-calendar.[hc]
- * gui/dialogs/cal-prefs-dialog.c
- * gui/dialogs/comp-editor-page.[hc]
- * gui/dialogs/comp-editor-util.[hc]
- * gui/dialogs/comp-editor.c
- * gui/dialogs/e-timezone-dialog.[hc]
- * gui/dialogs/event-page.c
- * gui/dialogs/meeting-page.c
- * gui/dialogs/recurrence-page.c
- * gui/dialogs/task-details-page.c
- * gui/dialogs/task-details-page.glade
- * gui/dialogs/task-page.c
- * idl/evolution-calendar.idl
- * pcs/cal-backend-file.c
- * pcs/cal-backend.c
- * pcs/cal-backend.h
- * pcs/cal.c
- * pcs/query.c: timezone changes everywhere. There's still quite a
- few things to update, and its not working well at present.
-
-2001-07-02 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-commands.c (publish_freebusy_cmd): publish
- free/busy information for the currently viewed time range
-
-2001-07-02 Christopher James Lahey <clahey@ximian.com>
-
- * gui/Makefile.am (INCLUDES): Added $(BONOBO_CONF_CFLAGS).
- (evolution_calendar_LDADD): Added $(BONOBO_CONF_LIBS).
-
-2001-07-02 Federico Mena Quintero <federico@ximian.com>
-
- Support for ATTACH, DESCRIPTION properties in alarm components.
-
- * cal-util/cal-component.c (scan_alarm_property): Deal with
- ATTACH, DESCRIPTION properties.
- (cal_component_alarm_get_attach): New function. Libical is
- actually bogus; supposedly icalattachtype structures are
- refcounted but the property functions return them by value.
- (cal_copmonent_alarm_set_attach): New function.
- (cal_component_alarm_get_description): New function.
- (cal_component_alarm_set_description): New function.
-
-2001-07-02 Federico Mena Quintero <federico@ximian.com>
-
- Support for repeat/duration properties in alarm components.
-
- * cal-util/cal-component.h (CalAlarmRepeat): New structure that
- pairs the repeat/duration values of an alarm component, which must
- be set both together or not set at all.
-
- * cal-util/cal-component.c (CalComponentAlarm): Added fields for
- the repeat and duration properties.
- (scan_alarm_property): Scan the DURATION and REPEAT properties.
- (make_alarm): Nullify/initialize all the fields in the alarm.
- (cal_component_alarm_get_repeat): New function.
- (cal_component_alarm_set_repeat): New function.
-
- * gui/dialogs/alarm-page.glade: Changed the label of display
- alarms from "Show a dialog" to "Display a message".
-
-2001-07-02 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/task-details-page.c
- (task_details_page_fill_widgets): fill in delegated from field
-
-2001-07-02 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/dialogs/task-page.c (categories_clicked_cb):
- * gui/dialogs/event-page.c (categories_clicked_cb): use the new
- self-contained e_categories_config_open_dialog_for_entry() function
-
- * gui/e-week-view-event-item.c (e_week_view_item_draw_icons):
- * gui/e-day-view-top-item.c (e_day_view_reshape_long_event):
- (e_day_view_reshape_day_event): ditto
- * gui/e-day-view-main-item.c (e_day_view_main_item_draw_day_event):
- use e_categories_config_get_icon_for() to retrieve the icon
- associated with each category
-
-2001-07-02 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (send_freebusy): implement
-
- * cal-util/cal-component.c (set_attendee_list): add the delto
- property rather than the delfrom property twice
-
- * gui/dialogs/task-editor.c (task_editor_edit_comp): show
- delegation info if appropriate
- (delegate_task_cmd): delegate command
- (cancel_task_cmd): cancel command
- (refresh_task_cmd): refresh command
-
- * gui/dialogs/task-details-page.c: Load new widgets
- (task_details_page_show_delegation): show/hide delegation info widgets
-
- * gui/dialogs/task-details-page.h: new proto
-
- * gui/dialogs/event-editor.c (event_editor_edit_comp): free
- attendee list when finished
-
- * gui/dialogs/comp-editor.c (setup_widgets): explicitly show the
- widgets, update pixmaps after the verbs have been added
- (comp_editor_focus): don't do a show all
-
-2001-07-02 Federico Mena Quintero <federico@ximian.com>
-
- Fixes bug #1406.
-
- * gui/calendar-config.c (config_read): Handle the options for the
- task list colors.
- (calendar_config_write): Ditto.
- (calendar_config_get_tasks_due_today_color): New function.
- (calendar_config_set_tasks_due_today_color): New function.
- (calendar_config_get_tasks_overdue_color): New function.
- (calendar_config_set_tasks_overdue_color): New function.
- (calendar_config_configure_e_calendar_table): Use
- e_table_model_changed() for the colors.
-
- * gui/dialogs/cal-prefs-dialog.glade: Updated the options for the
- task list and alarms.
-
- * gui/dialogs/cal-prefs-dialog.c (cal_prefs_dialog_show_config):
- Update the task list settings.
- (cal_prefs_dialog_update_config): Ditto.
-
- * gui/calendar-model.c (get_color): Deal with tasks for today as
- well as overdue tasks. Make it cleaner, even though we have to
- duplicate a chunk of is_overdue().
-
- * gui/calendar-commands.c (preferences_cmd): Renamed from
- properties_cmd().
-
-2001-07-01 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view-main-item.c
- (e_day_view_main_item_draw_day_event): draw icons per category
-
- * gui/e-day-view-top-item.c
- (e_day_view_top_item_draw_long_event): draw icons per category
-
- * gui/e-day-view.c
- (e_day_view_reshape_long_event):
- (e_day_view_reshape_day_event): calculate space for category icons
-
- * gui/e-week-view-event-item.c
- (e_week_view_event_item_draw_icons): draw icons per category
-
- * gui/e-week-view.c
- (e_week_view_reshape_event_span): calculate space for category icons
-
-2001-07-01 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view.c (e_day_view_*_clipboard): fixed clibpoard
- command activation from the menu entries. CTRL-C and CTRL-X don't
- work though, since it seems the key presses are being captured by
- the text item
-
- gui/e-week-view.c (e_week_view_*_clipboard): ditto
-
-2001-06-30 Federico Mena Quintero <federico@ximian.com>
-
- * gui/e-week-view-event-item.c
- (e_week_view_event_item_button_press): Only set the
- pressed_event_num and pressed_span_num if button 1 was pressed.
- Fix up return values a bit. This fixes bug #3780.
-
- * gui/gnome-cal.c
- (gnome_calendar_on_date_navigator_selection_changed): Doh, the
- call for the day view was supposed to be
- gnome_calendar_set_view(), not set_view(). Fixes bug #3779.
-
-2001-06-30 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/tasks-control.c (tasks_control_cut_cmd): call
- e_calendar_table_cut_clipboard with the correct object
-
- (tasks_control_copy_cmd): ditto
-
- (sensitize_commands): sensitize clipboard commands based on the
- number of selected tasks
-
-2001-06-28 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-calendar-table.[ch] (e_calendar_table_cut_clipboard),
- (e_calendar_table_copy_clipboard),
- (e_calendar_table_paste_clipboard): new functions for allowing the
- execution of clipboard-related commands
-
- * gui/tasks-control.c (tasks_control_cut_cmd),
- (tasks_control_copy_cmd), (tasks_control_paste_cmd): added
- callbacks for the new clipboard-related menu entries
-
-2001-06-28 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/component-factory.c: removed not-uses-anymore parameter in
- call to evolution_shell_component_new
-
- * gui/gnome-cal.[ch] (gnome_calendar_cut_clipboard),
- (gnome_calendar_copy_clipboard), (gnome_calendar_paste_clipboard):
- new functions for allowing execution of clipboard-related commands
-
- * gui/e-day-view.[ch] (e_day_view_cut_clipboard),
- (e_day_view_copy_clipboard), (e_day_view_paste_clipboard): ditto
-
- * gui/e-week-view.[ch] (e_week_view_cut_clipboard),
- (e_week_view_copy_clipboard), (e_week_view_paste_clipboard): ditto
-
-2001-06-27 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/calendar-commands.c (cut_event_cmd),
- (copy_event_cmd), (paste_event_cmd): added callbacks for the new
- clipboard-related menu entries
-
-2001-06-27 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component-factory.c (factory_fn): Pass NULL as the
- @external_uri_schemas argument to
- `evolution_shell_component_new()'.
-
-2001-06-27 Peter Williams <peterw@ximian.com>
-
- * conduits/*/Makefile.am (INCLUDES): More srcdir != builddir
- fixes.
-
-2001-06-27 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-calendar-table.c (selection_received): fixed
- (e_calendar_table_on_copy): fixed
-
-2001-06-26 Federico Mena Quintero <federico@ximian.com>
-
- * idl/evolution-calendar.idl (CalAlarmInstance): Renamed the occur
- field to occur_start; added an occur_end field. This way we can
- present the complete times for the occurrence from the server.
-
- * cal-util/cal-component.h (CalAlarmInstance): Likewise.
-
- * pcs/cal-backend-file.c (add_alarm_occurrences_cb): Fill the new
- fields appropriately.
- (generate_absolute_triggers): Likewise; we use -1 in case the
- component has no DTSTART or DTEND because there are no meaningful
- occurrence dates here.
- (fill_alarm_instances_seq): Fill in the new fields.
-
- * cal-client/cal-client.c (build_alarm_instance_list): Likewise.
-
- * gui/alarm-notify/alarm-notify-dialog.c (alarm_notify_dialog):
- Take in both the occur_start and occur_end times.
-
- * gui/goto.c (goto_dialog): Free the dlg structure on the bail-out
- cases.
-
- * gui/dialogs/event-page.c (get_widgets): Do not assert if we
- cannot find the main widget; just return FALSE.
-
- * gui/dialogs/alarm-page.c (get_widgets): Likewise.
-
- * gui/dialogs/task-page.c (get_widgets): Likewise.
-
- * gui/dialogs/task-details-page.c (get_widgets): Likewise.
-
- * gui/dialogs/meeting-page.c (get_widgets): Likewise.
-
-2001-06-25 Peter Williams <peterw@ximian.com>
-
- * conduits/calendar/Makefile.am (INCLUDES): Fixes for
- srcdir != builddir. Link to the static libwombat.
-
- * conduits/todo/Makefile.am (INCLUDES): Here too.
-
-2001-06-24 Federico Mena Quintero <federico@ximian.com>
-
- * gui/alarm-notify/notify-main.c (main): Initialize libglade.
-
- * pcs/cal-backend-file.c (compute_alarm_range):
- icaldurationtype_as_int() will now return a negative value if
- dur->is_neg is true, so we need to flip the sign of some
- operations here.
- (add_alarm_occurrences_cb): Likewise.
-
- * pcs/cal-backend-db.c (compute_alarm_range): Likewise.
- (add_alarm_occurrences_cb): Likewise.
-
-2001-06-24 Federico Mena Quintero <federico@ximian.com>
-
- * gui/alarm-notify/alarm-notify.c: Converted to use BonoboXObject.
-
- * gui/gnome-cal.c (gnome_calendar_open): Ask the alarm
- notification service to add the calendar and tasks URIs.
- (add_alarms): New function.
-
- * gui/alarm-notify/notify-main.c (main): Doh, fixed typo in the
- OAFIID.
- (main): Initialize and shut down gnome-vfs.
-
- * gui/Makefile.am (IDLS): Added evolution-calendar.idl, sigh.
- (evolution_calendar_SOURCES): Added the files generated from the IDL.
-
- * gui/alarm-notify/alarm-queue.c (alarm_trigger_cb): New function
- used when an alarm is triggered.
-
- * gui/dialogs/Makefile.am: Removed the alarm-notify-dialog files;
- they are now in gui/alarm-notify.
-
- * gui/alarm-notify/Makefile.am: Added the alarm-notify-dialog
- files.
-
- * pcs/cal.c (cal_forget_password): This was incorrectly named
- cal_client_forget_password(); renamed it.
-
- * gui/main.c (main): Initialize and shut down gnome-vfs.
-
-2001-06-23 Federico Mena Quintero <federico@ximian.com>
-
- * gui/e-calendar-table.c (task_compare_cb): New function to
- compare tasks like the Pilot task list.
-
- * cal-util/cal-component.h (CalComponentField): Added a
- semi-hackish CAL_COMPONENT_FIELD_COMPONENT. In the ETable model,
- it is intended to return a pointer to the component itself.
-
- * gui/calendar-model.c (calendar_model_value_at): Return the
- component itself for CAL_COMPONENT_FIELD_COMPONENT. Be more
- paranoid about invalid columns.
- (calendar_model_set_value_at): Be more paranoid about invalid
- columns.
- (calendar_model_duplicate_value): Ref the component field.
- (calendar_model_initialize_value): Deal with the component field.
- (calendar_model_value_is_empty): Likewise.
- (calendar_model_value_to_string): Likewise.
-
-2001-06-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * gui/Makefile.am: Added itip-control-factory.* to the build.
-
-2001-06-22 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal.[ch] (cal_get_password): new function for the backends to
- be able to call the getPassword method on the associated
- WombatClient
- (cal_forget_password): ditto for the forgetPassword method
-
-2001-06-22 Rodrigo Moya <rodrigo@ximian.com>
-
- * idl/evolution-calendar.idl: changed getFreeBusy method to return
- a CalObj instead of a sequence
-
- * cal-client/cal-client.[ch] (cal_client_get_free_busy): changed it to
- work like the cal_client_get_object function, that is, it does not
- return anymore a list of UIDs, but a CalClientGetStatus code, and
- added a new parameter for the caller to get the component back when
- this function returns
- (cal_client_open): aggregate WombatClient interface to the CalListener
- being used
-
- * pcs/cal-backend-db.c, pcs/cal-backend-file.c (..get_free_busy): set
- return value to "char *" as it will be returning a FreeBusy object,
- and not a list of UIDs
-
- * pcs/cal-backend.[ch] (cal_backend_get_free_busy): ditto
-
- * pcs/cal.c (cal_construct): queryInterface on the listener to obtain
- the WombatClient interface
-
-2001-06-21 JP Rosevear <jpr@ximian.com>
-
- * gui/main.c (main): update to new call
-
- * gui/e-itip-control.[hc]: break the widget bits out on their own
- into a proper object, basic stuff seems to be working again
-
- * gui/itip-control-factory.c: put the control specific bits here
- from e-itip-control.c
-
- * gui/itip-control-factory.h: new header
-
-2001-06-21 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/Makefile.am (gladedir): add include path
-
- * gui/dialogs/comp-editor.c (setup_widgets): remove buttons and
- use evolution's standard ui config
-
- * gui/print.c (print_comp_item): print description text
-
-2001-06-21 Rodrigo Moya <rodrigo@ximian.com>
-
- * cal-client/cal-client.[ch]:
- (cal_client_init): create a WombatClient when creating a CalClient
- object, so that we can receive authentication notifications from
- the wombat
- (cal_client_destroy): destroy the WombatClient object when dying
- (cal_client_set_auth_func): new function to set the authentication
- function to be called when a password is required by the calendar
- server (through the WombatClient object)
- (cal_client_get_free_busy): new function for calling the new IDL
- method Cal::getFreeBusy
-
- * gui/alarm-notify/Makefile.am: add libwombat to LDADD
-
- * gui/Makefile.am: add libwombat to LDADD
-
-2001-06-20 Dave Camp <dave@ximian.com>
-
- * gui/itip-utils.c (itip_send_comp): Changed attach_data
- to be a GNOME_Evolution_Composer_AttachmentData rather than a
- CORBA_char*.
-
-2001-06-20 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor.c (print_cmd): print menu command
- (print_preview_cmd): ditto for print preview
- (print_setup_cmd): ditto for print setup
- (comp_editor_set_cal_client): listen for updated and removed
- signals
- (obj_updated_cb): if the item changes else where, query the user
- for the course of action
- (obj_removed_cb): ditto for removal
-
- * gui/print.c (print_setup): rudimentary page setup support
- (print_comp): rudimentary individual event/task printing support
-
- * gui/print.h: new protos
-
- * gui/dialogs/changed-comp.[hc]: dialog to query the user about
- what to do when a item is changed elsewhere
-
- * gui/dialogs/Makefile.am: build new files
-
- * gui/dialogs/send-comp.c (send_component_dialog): remove useless
- assignment
-
-2001-06-20 Rodrigo Moya <rodrigo@ximian.com>
-
- * idl/evolution-calendar.idl: added getFreeBusy method
-
- * pcs/cal.c (impl_Cal_get_free_busy): implementation of the new
- getFreeBusy added method
-
- * pcs/cal-backend.[ch]: added new virtual method to the CalBackend
- class (get_free_busy)
-
- * pcs/cal-backend-db.c (cal_backend_db_get_free_busy): new function,
- not implemented yet
-
- * pcs/cal-backend-file.c (cal_backend_file_get_free_busy): new funtion,
- not implemented yet
-
-2001-06-20 Damon Chaplin <damon@ximian.com>
-
- * gui/calendar-config.[hc]:
- * gui/gnome-cal.[hc]:
- * gui/tasks-control.c (tasks_control_activate):
- * gui/calendar-commands.c (calendar_control_activate): moved the
- function to check for a default timezone to calendar-config.c, and
- also used it in the tasks control.
-
- * gui/dialogs/e-timezone-dialog.h: #include <gtk/gtkwidget.h> fix.
-
-2001-06-20 Damon Chaplin <damon@ximian.com>
-
- * gui/calendar-commands.c (calendar_control_activate):
- * gui/gnome-cal.[hc]: added code to show the timezone dialog if the
- user hasn't set a default timezone yet.
-
- * gui/dialogs/e-timezone-dialog.c (e_timezone_dialog_add_timezones):
- set the "None" item string before adding it to the combo, to stop the
- combo putting "None" in the entry initially.
-
-2001-06-19 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-calendar-table.[ch]: added cut/copy/paste support. It works
- with single selections (a single component selected) and with
- multiple ones (several components selected)
-
-2001-06-19 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/event-page.c: if the timezones of the start and end of
- the event are the same, then if the start timezone is changed we
- change the end timezone as well, since that is what most users will
- want.
-
-2001-06-19 Damon Chaplin <damon@ximian.com>
-
- * pcs/cal.c:
- * idl/evolution-calendar.idl:
- * cal-client/cal-client.[hc]: removed stuff to get builtin timezone
- info from the server.
-
-2001-06-19 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/cal-prefs-dialog.c: added a 'Time zone' setting. Also
- rearranged a little, adding a new 'General' page, since we had too
- many settings on the 'Calendar' page.
-
- * gui/e-timezone-entry.[hc]:
- * gui/dialogs/e-timezone-dialog.[hc]:
- * gui/dialogs/comp-editor.c:
- * gui/dialogs/comp-editor-page.[hc]:
- * gui/dialogs/event-page.c:
- * gui/dialogs/task-details-page.c:
- * gui/dialogs/task-page.c: removed CalClient stuff. The timezone dialog
- now uses the timezone data directly from the client's libical library.
-
-2001-06-19 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/task-editor.c (task_editor_init): add ui
- (forward_cmd): implement forward command
-
- * gui/dialogs/comp-editor.c (save_as_ok): bug fix, seems to work
- now
-
-2001-06-19 JP Rosevear <jpr@ximian.com>
-
- * gui/control-factory.c (control_factory_init): add auto exit unref
-
- * gui/component-factory.c (destroy_cb): destroy our selves if we
- have no more shells
- (component_factory_init): add auto exit unref
-
-2001-06-19 JP Rosevear <jpr@ximian.com>
-
- * gui/Makefile.am: don't compile or install the old meeting edit
- stuff
-
- * gui/e-week-view.c: ditto
-
- * gui/e-day-view.c: Remove scheduling menu option
-
-2001-06-19 JP Rosevear <jpr@ximian.com>
-
- * gui/itip-utils.c: add some needed commas
- (itip_send_comp): if publishing, don't set the to list and show
- the message. unless publishing, just send the email
-
- * gui/Makefile.am: remove typo
-
-2001-06-19 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/send-comp.c: itip/imip send dialog
-
- * gui/dialogs/send-comp.h: new proto
-
- * gui/dialogs/recurrence-page.c (recurrence_page_set_dates): only
- use the weekday picker if visible
-
- * gui/dialogs/meeting-page.c: just show the meeting list
-
- * gui/dialogs/event-editor.c (event_editor_edit_comp): remove the
- meeting page if no attendees
- (schedule_meeting_cmd): schedule a meeting menu item
- (refresh_meeting_cmd): refresh meeting request menu item
- (cancel_meeting_cmd): ditto for cancel
- (forward_cmd): send as attachment
-
- * gui/dialogs/comp-editor.c (comp_editor_remove_page): remove page
- from dialog
- (comp_editor_show_page): show a given page
- (comp_editor_get_current_comp): return a cal component
- representing the current widget state
- (comp_editor_save_comp): save the cal component
- (comp_editor_delete_comp): delete the cal component
- (comp_editor_send_comp): send the cal component
- (comp_editor_merge_ui): merge xml in to the bonobo gui
- (setup_widgets): use a bonobo window instead of a gtk window, add menus again
- (save_as_cmd): save to file on disk - still broken
- (save_close_cmd): close menu command
- (save_close_cmd): save and close menu command
-
- * gui/dialogs/comp-editor.h: new protos
-
- * gui/dialogs/cancel-comp.c (cancel_component_dialog): itip/imip
- cancellation dialog
-
- * gui/dialogs/cancel-comp.h: new proto
-
- * gui/dialogs/Makefile.am: build new files
-
- * gui/dialogs/comp-editor-page.c
- (comp_editor_page_notify_needs_send): emit needs_send signal
-
- * gui/dialogs/comp-editor-page.h: new signal protos
-
- * gui/itip-utils.c (itip_send_comp): new function to send cal
- components
-
- * gui/itip-utils.h: new proto
-
- * gui/e-itip-control.c (pstream_load): trim using cal-component
- wrapper stuff
- (accept_button_clicked_cb): use itip_send_comp
- (tentative_button_clicked_cb): ditto
- (decline_button_clicked_cb): ditto
-
- * gui/Makefile.am: compile select name idl stuff
-
- * cal-util/cal-component.c (cal_component_get_organizer): get the organizer
- (cal_component_set_organizer): set the organizer
- (cal_component_get_recurid): get the recurrence id
- (cal_component_set_recurid): set the recurrence id
- (set_attendee_list): actually set the attendee list
- (get_attendee_list): build the attendee list
-
- * cal-util/cal-component.h: new protos
-
-2001-06-19 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/task-details-page.glade:
- * gui/dialogs/task-page.glade:
- * gui/dialogs/event-page.glade: added timezone fields. Also moved the
- 'All Day' flag into an alignment so it doesn't mess up the height of
- the other widgets.
-
- * gui/dialogs/task-details-page.c:
- * gui/dialogs/task-page.c:
- * gui/dialogs/event-page.c: added code to handle the timezone fields.
- This still needs to be hooked up when the libical code is finished.
-
- * gui/dialogs/e-timezone-dialog.c (on_map_leave): new function to
- clear the preview label and turn off the highlighted point on the
- map when you move the mouse outside it.
- (find_selected_point): new function to try to find the point
- corresponding to the text in the combo.
- (on_combo_changed): call the above function to update the selected
- point.
- (on_map_leave): turn off the preview point & label when the mouse
- leaves the map.
- (e_timezone_dialog_set_cal_client): changed it so that selecting "None"
- clears the entry.
-
- * gui/dialogs/comp-editor-page.[hc]: added set_cal_client() virtual
- method since some pages need to access the CalClient to get timezone
- information. Also added comp_editor_page_set_cal_client() to call
- the virtual method.
-
- * gui/dialogs/comp-editor.c (comp_editor_set_cal_client): called
- comp_editor_page_set_cal_client() on each page.
-
- * gui/calendar-config.c: added functions to get & set the timezone.
-
-2001-06-18 Eskil Heyn Olsen <eskil@eskil.dk>
-
- * conduits/calendar/calendar-conduit.c: (comp_from_remote_record),
- (check_for_slow_setting), (conduit_get_gpilot_conduit):
- * conduits/todo/todo-conduit.c: (check_for_slow_setting),
- (conduit_get_gpilot_conduit):
- Tweaked for some gnome-pilot api changes
-
-2001-06-15 Federico Mena Quintero <federico@ximian.com>
-
- * gui/calendar-view.[ch]: New files with the generic calendar view
- object. It sucks that we have to implement at least two classes
- to define a GalView and its factory.
-
- * gui/calendar-view-factory.[ch]: New files; factory for calendar
- views.
-
- * gui/gnome-cal.h (GnomeCalendarViewType): Moved from gnome-cal.c
- and renamed from ViewType. We no longer use strings to identify
- the view types.
-
- * gui/gnome-cal.c (gnome_calendar_get_view_type): New function.
- (set_view): Renamed from gnome_calendar_set_view_internal().
- (gnome_calendar_set_query): Made public; renamed from set_query().
- (gnome_calendar_setup_view_menus): New function to set up the view
- collection and the GalViewMenus.
- (gnome_calendar_discard_view_menus): New function to discard them.
-
- * gui/calendar-commands.c (calendar_control_activate): Set up the
- GalView menus.
- (calendar_control_deactivate): Discard the GalView menus.
-
- * gui/e-day-view.c: #include <gtk/gtkinvisible.h>
-
- * gui/dialogs/comp-editor.c (comp_editor_get_type): The type info
- structure should be static.
-
-2001-06-15 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view.c (selection_received): generate a new UID
- when pasting
-
- * gui/e-week-view.c (selection_received): ditto
-
-2001-06-15 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view.c (selection_received): finished implementation
- of Paste stuff
-
- * gui/e-week-view.c (selection_received): ditto
-
-2001-06-14 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view.[ch]: added popup menu items for cut/copy/paste
-
- * gui/e-week-view.[ch]: ditto
-
-2001-06-14 Damon Chaplin <damon@ximian.com>
-
- * gui/e-timezone-entry.[hc]: new widget to enter a timezone.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): added the above.
- * gui/Makefile.am (evolution_calendar_LDADD): had to move
- libcal-dialogs.a above libmiscwidgets.a to get it to compile.
-
-2001-06-14 Damon Chaplin <damon@ximian.com>
-
- * gui/dialogs/e-timezone-dialog.[hc]:
- * gui/dialogs/e-timezone-dialog.glade: new dialog for setting the
- time zone.
-
- * gui/dialogs/Makefile.am: added timezone dialog files.
-
- * idl/evolution-calendar.idl: added CalTimezoneInfo struct and seq,
- and getBuiltinTimezoneInfo method.
-
- * pcs/cal.c (impl_Cal_get_builtin_timezone_info): implemented method.
- (cal_class_init): added method to epv.
-
- * cal-client/cal-client.c (struct CalClientPrivate): added
- timezone_info array to contain cached info on builtin timezone city
- names and coordinates.
- (cal_client_get_builtin_timezone_info): new function to get the info
- about builtin timezones.
-
- * cal-client/cal-client.h: added CalTimezoneInfo struct, to contain
- the city names and coords of the builtin timezones.
-
-2001-06-13 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor-util.c (comp_editor_date_label): remove
- unnecessary space
-
- * gui/dialogs/task-page.c (task_page_set_summary): indicate we are
- updating, Fixes #3307
-
-2001-06-13 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/task-details-page.c (task_details_page_set_dates):
- set the completed time in the date editor if appropriate
-
- * gui/dialogs/task-page.c (task_page_set_dates): if we are
- updating, return
- (complete_date_changed): don't returns if we are updating - the
- guards are done in the calling function
- (status_changed): indicate when we are updating and when we are
- finished, round the completion time to the nearest minute
- (percent_complete_changed): indicate when are updating and when we
- are finished
- (percent_complete_changed): notify of the date change after the
- option menu is updated
-
-2001-06-11 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/e-day-view.[ch]: added cut&paste support, by using a GtkInvisible
- widget to manage the clipboard selections.
-
- * gui/e-week-view.[ch]: ditto
-
-2001-06-08 Iain Holmes <iain@ximian.com>
-
- * gui/component-factory.c: Removed the executive-summary includes.
- (component_factory_init): Don't init the summary factory.
-
- * gui/calendar-summary.[ch]: Removed.
-
- * gui/Makefile.am: Remove executive-summary stuff, move some libs
- around a bit.
-
-2001-06-04 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/recurrence-page.c (recurrence_page_set_dates):
- update the blocked/selected days if the starting day of the
- appointment changes, fixes #2188
-
- * gui/dialogs/task-details-page.h: tidy proto
-
-2001-06-03 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/e-itip-control.c: #include <bonobo/bonobo-context.h> instead
- of <bonobo/bonobo-running-context.h>.
- * gui/tasks-control-factory.c: Likewise.
-
- * gui/Makefile.am (evolution_calendar_LDADD): Move `$(DB3_LDADD)'
- before libeutil.
-
-2001-06-01 JP Rosevear <jpr@ximian.com>
-
- * gui/Makefile.am: no longer build widget-util.*, the code has
- been moved
-
-2001-06-01 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/event-page.c (make_date_edit): use new func
-
- * gui/dialogs/task-details-page.c
- (task_details_page_create_date_edit): ditto
-
- * gui/dialogs/recurrence-page.c (make_ending_until_special): ditto
-
- * gui/dialogs/comp-editor-util.c (comp_editor_new_date_edit):
- rename date_edit_new function
-
- * gui/dialogs/comp-editor-util.h: new proto
-
- * gui/dialogs/task-page.c (task_page_set_summary): no longer any
- need to block/unblock the handler
- (task_page_create_date_edit): use new func
-
-2001-06-01 JP Rosevear <jpr@ximian.com>
-
- * gui/.cvsignore: Update
-
- * gui/evolution-calendar-control.c: Remove dead file
-
- * gui/*.vcf: Remove dead files
-
-2001-06-01 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/comp-editor-page.[hc]: renamed from editor-page for
- consistency, more complete implementation
-
- * gui/dialogs/comp-editor.[hc]: More complete implementation
-
- * gui/dialogs/*-page.*: The various pages needed to construct the
- event and task dialogs
-
- * gui/dialogs/comp-editor-util.[hc]: useful utility functions for the
- component editor pages to use
-
- * gui/dialogs/Makefile.am: Build and install new files
-
- * gui/event-editor*: Remove, obsoleted by the new comp-editor
- stuff
-
- * gui/dialogs/task-editor-dialog.glade: ditto
-
- * gui/e-calendar-table.c (open_task): update to use comp editor
- stuff
-
- * gui/e-tasks.c (e_tasks_new_task): ditto
-
- * gui/gnome-cal.c (gnome_calendar_edit_object): ditto
-
- * gui/Makefile.am: don't build non-existent files nor try to
- install them
-
-2001-06-01 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (e_itip_control_factory_init): ditto
-
- * gui/tasks-control-factory.c (tasks_control_factory_init):
- auto_exit_unref the factory
-
-2001-06-01 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/Makefile.am (evolution_calendar_LDADD): Add `$(DB3_LDADD)'.
-
-2001-05-29 Federico Mena Quintero <federico@ximian.com>
-
- * gui/e-tasks.c (e_tasks_get_calendar_table): New function.
-
- * gui/tasks-control.c (tasks_control_activate): Connect to the
- "selection_changed" signal of the tasks widget here, not in
- tasks_control_new(). Also, update the sensitivity of the commands
- here for the first time.
- (tasks_control_deactivate): Disconnect from the signal here since
- it only makes sense to monitor selection changes while the control
- is active.
- (selection_changed_cb): Removed hack that tested the presence of
- the remote UI container.
- (sensitize_commands): New function.
-
-2001-05-28 Damon Chaplin <damon@ximian.com>
-
- * gui/e-week-view-layout.[hc]:
- * gui/e-day-view-layout.[hc]: new files to contain layout code split
- off from EDayView an EWeekView, so we can use it for printing.
-
- * gui/print.c: rewritten to use the same layout code as the EDayView
- and EWeekView widgets.
-
- * gui/gnome-cal.c (gnome_calendar_get_task_pad_cal_client): added
- function so we can get the CalClient used for the TaskPad for printing.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): added
- e-day-view-layout.[hc] amd e-week-view-layout.[hc].
-
- * cal-util/timeutil.c (time_week_begin):
- (time_week_end): added week_start_day argument.
-
- * cal-util/cal-recur.c: added comments describing problems in it.
-
-2001-05-27 Rodrigo Moya <rodrigo@ximian.com>
-
- * gui/component-factory.c (remove_folder): implemented the
- 'remove_folder' function for the calendar shell component
- (xfer_folder): ditto for 'xfer_folder'
-
-2001-05-27 Dan Winship <danw@ximian.com>
-
- * gui/calendar-commands.c: #include
- "evolution-shell-component-utils.h" rather than "e-gui-utils.h"
- for e_pixmaps_update.
-
- * gui/tasks-control.c: Likewise.
-
-2001-05-25 Peter Williams <peterw@ximian.com>
-
- * gui/Makefile.am: Reference libeshell.la instead of libeshell.a.
-
-2001-05-23 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/recurrence-page.c: Finished porting from the old
- event-editor.c. Made it store a clone of the component for when
- we need to expand the recurrence set.
-
- * gui/dialogs/event-page.c (event_page_get_dates): New function.
-
- * gui/dialogs/editor-page.c (editor_page_set_dates): Renamed from
- editor_page_set_dtstart(); now sets both DTSTART and DTEND.
-
- * gui/dialogs/alarm-page.c (alarm_page_set_dates): Ahem, it is a
- label, not an entry.
-
-2001-05-21 Federico Mena Quintero <federico@ximian.com>
-
- Fix bug #2831; the tasks toolbar and menu now have a button to
- delete the selected tasks.
-
- * gui/e-calendar-table.c (e_calendar_table_delete_selected): New
- function.
- (delete_cb): Use e_calendar_table_delete_selected().
- (e_calendar_table_get_table): New function.
-
- * gui/tasks-control.c (tasks_control_new_task_cmd): Handle the
- delete command.
- (selection_changed_cb): Change the sensitivity of the TasksDelete
- command when the selection in the table changes.
-
- * gui/e-tasks.c (table_selection_change_cb): Notify upstream when
- the ETable selection changes.
-
-2001-05-18 Federico Mena Quintero <federico@ximian.com>
-
- Fix bug #2829.
-
- * gui/dialogs/delete-comp.c (delete_component_dialog): Allow the
- caller to specify whether just one or many components are to be
- deleted.
-
- * gui/e-calendar-table.c (tasks_popup_one): Popup menu definition
- for when one and only one task is selected.
- (tasks_popup_many): Likewise, for more than one task.
- (e_calendar_table_on_right_click): Do not create a structure for
- the closure data; we can simply pass the cal_table. Use a
- different menu depending on the number of selected tasks.
- (mark_as_complete_cb): Renamed; now iterates over the selected
- rows.
- (delete_selected_components): New function to delete all the
- selected components.
- (delete_cb): Adjusted for delete_component_dialog().
- (open_task): New function, simply open a CalComponent in the task
- editor.
- (open_task_by_row): Renamed; use open_task().
-
- * gui/e-week-view.c (e_week_view_on_delete_appointment): Updated
- for delete_component_dialog().
-
- * gui/e-day-view.c (e_day_view_on_delete_appointment): Likewise.
-
-2001-05-16 Duncan Mak <duncan@ximian.com>
-
- * gui/Makefile.am (evolution_calendar_SOURCES): removed
- editor-page.[ch] because they've now moved dialogs.
-
-2001-05-16 Federico Mena Quintero <federico@ximian.com>
-
- Split the event and task editors into different objects for the
- separate pages; this way they can be shared by both editors.
-
- * gui/dialogs/editor-page.[ch]: New abstract class for a page in a
- calendar component editor.
-
- * gui/dialogs/event-page.[ch]: Main page of an event editor.
-
- * gui/dialogs/alarm-page.[ch]: Alarm page of a calendar component
- editor.
-
- * gui/dialogs/recurrence-page.[ch]: Recurrence page of a calendar
- component editor.
-
- * gui/dialogs/event-page.c (event_page_fill_widgets): Eeek, this
- was missing a bunch of break statements.
- (event_page_fill_component): Use a temporary variable rather than
- allocating a struct icaltimetype.
-
- * gui/dialogs/alarm-page.c (get_alarm_string): Do not use
- fixed-size buffers.
- (alarm_page_fill_widgets): Use cal_obj_uid_list_free().
- (append_reminder): Now the list stores the plain CalComponentAlarm
- structures in the row data. We do *NOT* want to be frobbing the
- component's data directly. Rather, we clone the alarms from the
- component and maintain them on our own.
- (alarm_page_fill_component): Clone the alarms before adding them
- to the component so that we maintain the invariant that the alarm
- structures in the list did *not* come from the component.
-
- * cal-util/cal-component.c (cal_component_add_alarm): Added
- documentation.
- (cal_component_remove_alarm): Added documentation.
- (cal_component_remove_alarm): Do a lookup in our hash table of
- alarms instead of scanning the whole component.
- (CalComponentAlarm): Removed the `parent' field, since it was
- unused.
- (cal_component_free_alarm_uids): Removed function, since
- cal_component_get_alarm_uids() is documented so that the user will
- know that he must use cal_obj_uid_list_free().
- (cal_component_alarm_clone): New function.
-
-2001-05-09 Federico Mena Quintero <federico@ximian.com>
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Added
- editor-page.[ch] to the list of sources.
-
-2001-05-09 JP Rosevear <jpr@ximian.com>
-
- * gui/event-editor.c (reminder_add_cb): switch on the correct
- widget and map
-
-2001-05-08 JP Rosevear <jpr@ximian.com>
-
- * gui/e-itip-control.c (e_itip_control_factory): unref the
- property bag when we finish with it
-
- * gui/evolution-calendar-control.c (calendar_properties_init): ditto
-
- * gui/control-factory.c (calendar_properties_init): ditto
-
- * gui/calendar-summary.c (create_summary_view): ditto
-
-2001-05-08 JP Rosevear <jpr@ximian.com>
-
- * cal-util/cal-component.c (cal_component_alarm_free):
- (cal_component_alarm_free): free the alarm component if it doesn't
- have a parent, rather than if it does
-
- * gui/Makefile.am: sanitize LD_ADDS and CFLAGS so the libtool
- lines are shorter (fixes problem on solaries due to sed)
-
-2001-05-07 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal-factory.[hc]: Convert to bonobo xobject
-
- * pcs/cal.[hc]: Convert to bonobo xobject
-
-2001-05-07 Gediminas Paulauskas <menesis@delfi.lt>
-
- * gui/event-editor.c (make_title_from_comp): conversion summary
- from utf8 here, use translated strings as is.
- (set_title_from_comp): reflect this, simplify.
-
- * gui/dialogs/task-editor.c: updated copies of above functions here.
-
- * gui/gnome-cal.c: use defines from widgets/misc/e-filter-bar.h for
- consistency in "Show all".
-
-2001-05-04 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-model.c (calendar_model_append_row): unref the
- calcomponent when we're done with it
-
- * cal-util/cal-component.c (cal_component_gen_uid): free the iso
- date string when we finish with it
-
-2001-04-27 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-edit.c (put_property_in_list): remove hardcoded
- values
- (edit_attendee): ditto, and there are only 4 roles now
-
- * gui/e-meeting-dialog.glade: tweak
-
- * gui/itip-utils.c: There shouldn't be an "other" role
-
-2001-04-26 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-edit.c (edit_attendee): use enums not hard code
- values
-
-2001-04-26 JP Rosevear <jpr@ximian.com>
-
- * gui/e-meeting-edit.c (add_button_clicked_cb):
- icalparameter_new_rsvp now takes an enum
-
-2001-04-26 JP Rosevear <jpr@ximian.com>
-
- * cal-util/cal-component.c (cal_component_alarm_set_trigger): the
- value type should be inited with ICAL_VALUE_* rather than
- ICAL_*_VALUE because it is a param argument.
-
-2001-04-26 Federico Mena Quintero <federico@ximian.com>
-
- * gui/calendar-model.c (get_is_overdue): Replace "<" by "<=" in
- the comparison for due dates against the current time. This makes
- tasks appear immediately as red when you click Now in the due date
- popup field.
-
- This is not a complete solution to the more general problem of
- tasks staying the same color even if they become overdue while the
- task list remains the same on the screen. This has been logged as
- bug #2399.
-
-2001-04-26 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/dialogs/Makefile.am (INCLUDES): Add `$(EXTRA_GNOME_CFLAGS)'.
-
-2001-04-26 Dan Winship <danw@ximian.com>
-
- * conduits/todo/Makefile.am (libetodo_conduit_la_LIBADD): Remove
- UNICODE_LIBS
-
- * cal-client/Makefile.am (client_test_LDADD): Remove -lunicode
-
-2001-04-24 Duncan Mak <duncan@ximian.com>
-
- * gui/alarm-notify/notify-main.c (funny_trigger_cb): Fixed
- Strftime so it uses the locale prefered way to display date/time.
- ("%x %X" instead of "%Y/%m/%d %H:%M:%S")
-
-2001-04-21 Gediminas Paulauskas <menesis@delfi.lt>
-
- * gui/calendar-summary.c: translate "Things to do" etc. and convert them
- to utf8. Changed some link from helixcode to ximian.
-
-2001-04-18 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/dialogs/Makefile.am (INCLUDES): Add
- `-I$(top_srcdir)/calendar/cal-client',
- `-I$(top_builddir)/calendar/cal-client'.
- * gui/Makefile.am (INCLUDES): Likewise.
-
- * cal-client/cal-query.h: #include "evolution-calendar.h".
-
-2001-04-17 Federico Mena Quintero <federico@ximian.com>
-
- * gui/event-editor.c (init_widgets): Connect to the "changed"
- signal of the categories entry so that they will be applied
- correctly.
- (EventEditorPrivate): Added fields for the contacts button and
- entry.
- (init_widgets): Disable the contacts widgets as we do not support
- them yet.
- (get_widgets): Get the contacts widgets.
-
- * gui/dialogs/task-editor.c (get_widgets): Get the contacts
- button, which was missing.
- (init_widgets): Disable the contacts widgets as we do not support
- them yet.
-
- * pcs/query.c (matches_text_list): Use e_utf8_strstrcasedecomp()
- instead of plain e_utf8_strstrcase().
- (matches_summary): Likewise.
-
-2001-04-17 JP Rosevear <jpr@ximian.com>
-
- * cal-util/cal-component.c (cal_component_alarm_set_action): the
- libical action stuff uses enums rather than strings to enumerate
- the various actions now
- (cal_component_alarm_get_action): ditto
-
-2001-04-17 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/alarm-notify/Makefile.am (evolution_alarm_notify_SOURCES):
- Add `$(CORBA_GENERATED)'.
-
-2001-04-16 Dan Winship <danw@ximian.com>
-
- * pcs/Makefile.am (INCLUDES): Add EXTRA_GNOME_CFLAGS, for gal.
-
-2001-04-15 Federico Mena Quintero <federico@ximian.com>
-
- * gui/gnome-cal.c (setup_widgets): Create the ESearchBar thingy.
- (search_bar_query_changed_cb): Build the different queries based
- on the type and string.
-
- * pcs/query.c (backend_obj_updated_cb): Ref the query while we are
- notifying the listener so that it will not disappear from under us.
- (backend_obj_removed_cb): Likewise.
- (process_component_cb): Likewise.
- (func_contains): New function to match text fields.
- (matches_comment): New function to match comment lists.
- (matches_description): New function to match description lists.
- (matches_summary): New function to match summaries.
- (matches_any): New function to match any text field.
- (func_has_categories): New function to match categories.
-
-2001-04-14 Federico Mena Quintero <federico@ximian.com>
-
- * gui/alarm-notify/notify-main.c (main): Initialize the trigger
- and queue systems.
-
-2001-04-13 Dan Winship <danw@ximian.com>
-
- * cal-util/timeutil.c (time_from_isodate): Fix the syntactic bogon
- here, and attempt to fix the logical bogon too. (tm_gmtoff and
- timezone have opposite signs... I'm assuming Federico tested the
- Linux case, so I'm flipping the sign of the BSD case. But maybe he
- didn't and it's supposed to be the other way...)
-
-2001-04-12 Federico Mena Quintero <federico@ximian.com>
-
- * gui/e-day-view.c (update_query): New function to restart a query
- for the day view.
- (query_obj_updated_cb): Renamed from obj_updated_cb(); updated for
- queries instead of calendar clients.
- (query_obj_removed_cb): Likewise.
- (cal_opened_cb): Just update_query() instead of queueing reloading
- all the events.
- (e_day_view_set_cal_client): Likewise.
- (e_day_view_set_query): Likewise.
- (e_day_view_set_selected_time_range): Likewise.
- (e_day_view_set_days_shown): Likewise.
- (e_day_view_recalc_work_week): Likewise.
- (e_day_view_queue_reload_events): Removed function now that events
- are updated entirely by the query.
- (e_day_view_reload_events_idle_cb): Likewise.
- (e_day_view_reload_events): Likewise.
- (e_day_view_init): Use a pretty arrow instead of GDK_TOP_LEFT_ARROW.
-
- * gui/e-week-view.c: Analogous changes to the ones in e-day-view.c.
- (e_week_view_init): Use a pretty arrow instead of GDK_TOP_LEFT_ARROW.
-
- * cal-util/timeutil.c (isodate_from_time_t): Return a g_strdup()ed
- version of the string instead of a pointer to a static buffer.
- (time_from_isodate): Resurrected function. Polished up to our
- current standards of paranoia.
-
- * pcs/query.c (func_time_now): New function (time-now).
- (func_make_time): New function (make-time ISODATE).
- (func_time_add_day): New function (time-add-day TIME N).
- (func_time_day_begin): New function (time-day-begin TIME).
- (func_time_day_end): New function (time-day-end TIME).
- (func_occur_in_time_range): Use time_t values instead of ints.
- (match_component): Free the stringized component. Free the ESexp
- result value.
-
- * gui/e-day-view.h: Removed a couple of unused prototypes.
-
- * pcs/query.c (query_destroy): Oops, disconnect from the backend.
-
- * pcs/cal.c (Cal_get_query): Duplicate the query reference before
- we return it.
-
- * gui/calendar-commands.c (pixmaps): Fixed paths to image files.
-
-2001-04-11 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal-backend-file.c (cal_backend_file_compute_changes):
- prepend to both changes and change_ids when different and mark as
- modified, not added
-
-2001-04-11 Christopher James Lahey <clahey@ximian.com>
-
- * gui/calendar-model.c (calendar_model_append_row): Fix this to
- just send the data to the wombat instead of inserting it
- ourselves.
-
-2001-04-11 Gediminas Paulauskas <menesis@delfi.lt>
-
- Display fixes, thanks to Kjartan for finding these.
-
- * gui/event-editor.c: use simple (not e_utf8_) gtk_clist_append for
- strings which are never in utf-8.
- * dialogs/delete-comp.c (delete_component_dialog): convert only
- summary from utf-8 to gtk charset. Translated values are in correct
- craset already.
-
-2001-04-04 Kjartan Maraas <kmaraas@gnome.org>
-
- * gui/calendar-commands.c: Fix headers.
- * gui/calendar-config.c: Same here.
- * gui/calendar-model.c: Same here.
- * gui/e-day-view-time-item.c: Same here.
- * gui/e-day-view-top-item.c: Same here.
- * gui/e-day-view.c: Same here.
- * gui/e-meeting-edit.c: Same here.
- * gui/e-week-view-main-item.c: Same here.
- * gui/e-week-view.c: Same here.
- * gui/event-editor.c: Same here.
- * gui/gnome-cal.c: Same here.
- * gui/goto.c: Same here.
- * gui/main.c: Same her.
- * gui/print.c: Same here.
-
-2001-04-02 Federico Mena Quintero <federico@ximian.com>
-
- * gui/e-tasks.c (e_tasks_setup_menus): Plug leak.
-
- * gui/event-editor.c (obj_updated_cb): Do nothing for now until we
- think of something sensible to do.
- (obj_removed_cb): Likewise.
-
- * gui/dialogs/task-editor.c (obj_updated_cb): Likewise.
- (obj_removed_cb): Likewise.
-
- * gui/event-editor.c (dialog_to_comp_object): Plug leak.
-
-2001-04-01 Federico Mena Quintero <federico@ximian.com>
-
- Client-side glue for the live query engine.
-
- * cal-client/query-listener.[ch]: New files with the
- implementation fo the QueryListener interface.
-
- * cal-client/cal-query.[ch]: New files with the client-side
- convenience object for live queries.
-
- * cal-client/cal-listener.h (CalListenerClass): Removed unused
- slots for signal handlers.
-
- * cal-client/Makefile.am (libcal_clientinclude_HEADERS): Now we
- install the evolution-calendar.h header. This sucks a bit.
-
-2001-04-01 Gediminas Paulauskas <menesis@delfi.lt>
-
- * gui/calendar-commands.c: use new pixmap cache. Added some menu icons
- and changed filenames of renamed icons.
- * gui/tasks-control.c: added icons for new task and print in menu.
-
-2001-03-29 Federico Mena Quintero <federico@ximian.com>
-
- Engine for live queries to calendars. A query object watches a
- CalBackend in the PCS and is otherwise completely separate from
- it; backends need to do nothing to support live queries. Right
- now we have the following functions:
-
- (get-vtype)
-
- Returns a string indicating the type of component
- (VEVENT, VTODO, VJOURNAL, VFREEBUSY, VTIMEZONE,
- UNKNOWN).
-
- (occur-in-time-range? START END)
-
- START - int, time_t start of the time range
- END - int, time_t end of the time range
-
- Returns a boolean indicating whether the component
- has any occurrences in the specified time range.
-
- * idl/evolution-calendar.idl (Cal::getQuery): New method that
- initiates a live query.
- (Query): New interface for a handle to a live query.
- (QueryListener): New interface for a listener to changes in a live
- query.
-
- * pcs/query.[ch]: New files with the live query engine.
-
- * pcs/cal-backend.h (CalBackendClass): Added notification signals
- so that the query system can catch them.
- (CalBackendClass): New virtual method ::get_load_state().
-
- * pcs/cal-backend.c (cal_backend_opened):
- (cal_backend_obj_updated):
- (cal_backend_obj_updated): New functions to emit the notification
- signals; to be used only by backend implementations.
- (cal_backend_get_load_state): New function.
-
- * pcs/cal-backend-file.c (notify_update): Call
- cal_backend_obj_updated().
- (notify_remove): Call call_backend_obj_removed().
- (open_cal): Free the icalcomp if it is not of the correct type.
- (cal_backend_file_get_load_state): Implemented new method.
-
- * pcs/cal-backend-db.c (cal_backend_db_update_object): Call
- cal_backend_obj_updated().
- (cal_backend_db_remove_object): Call cal_backend_obj_removed().
- (cal_backend_db_get_load_state): Implemented new method.
-
- * pcs/cal.c (Cal_get_query): Implementation of the ::getQuery()
- method.
-
-2001-03-27 Anna Marie Dirks <anna@ximian.com>
-
- * gui/e-itip-control.c: fixed button placement to comply
- with gnome standards.
-
-2001-03-27 Anna Marie Dirks <anna@ximian.com>
-
- * gui/e-itip-control.glade: fixed spacing and label alignment to
- comply with gnome standards. Also removed shadows from extraneous
- scrolled windows to avoid bevelitous. There are many more changes
- that need to happen to this viewer, but they all require a hacker
- to do some c-coding, so I will avoid committing them until after the
- .10 release.
-
-2001-03-26 Kjartan Maraas <kmaraas@gnome.org>
-
- * cal-client/client-test.c: Replace includes of <gnome.h>, <bonobo.h>
- and <gtk/gtk.h> with the needed headers to speed up compile.
- * cal-util/test-recur.c: Same here for <gtk/gtk.h>
- * gui/calendar-commands.c: Replace <bonobo.h> and remove
- <libgnorba/gnorba.h>
- * gui/calendar-summary.c: Replace <gnome.h> and <bonobo.h>
- * gui/calendar-summary.h: Added <bonobo/bonobo-generic-factory.h>
- * gui/component-factory.c: Remove <bonobo.h>
- * gui/control-factory.c: Replace <bonobo.h>
- * gui/e-calendar-table.c: Remove <gnome.h>
- * gui/e-itip-control.c: Replace <gnome.h> and <bonobo.h>
- * gui/e-meeting-edit.c: Replace <bonobo.h>
- * gui/e-tasks.c: Replace <gnome.h>
- * gui/e-tasks.h: Replace <bonobo.h>
- * gui/gnome-cal.h: Remove <bonobo.h>
- * gui/main.c: Replace <bonobo.h> and <glade/glade.h>
- * gui/tasks-control-factory.c: Replace <bonobo.h>
- * gui/tasks-control.c: Replace <gnome.h> and <bonobo.h>
- * gui/weekday-picker.c: Add <string.h> and <libgnome/gnome-defs.h>
- * gui/alarm-notify/client-main.c: Remove <gnome.h> and <bonobo.h>
- * gui/alarm-notify/notify-main.c: Replace <gnome.h> and <bonobo.h>
- * gui/dialogs/alarm-notify-dialog.c: Replace <gnome.h>
- * pcs/cal-backend.c: Replace <gtk/gtk.h>
-
-2001-03-25 Federico Mena Quintero <federico@ximian.com>
-
- * gui/e-calendar-table.c (e_calendar_table_init): The
- model_rows_{inserted,deleted} signals changed names; deal with it.
- (e_calendar_table_on_rows_inserted): Updated for new ETable API.
- (e_calendar_table_on_rows_deleted): Likewise.
-
- * gui/gnome-cal.h (GnomeCalendarOpenMode): Removed unused enum.
-
- * gui/gnome-cal.c (gnome_calendar_open): Constify.
-
- * gui/calendar-commands.c (calendar_set_uri): Removed function,
- since it was just calling gnome_calendar_open().
-
- * gui/control-factory.c (set_prop): Replace usage of
- calendar_set_uri() with gnome_calendar_open().
- (load_calendar): Likewise.
- (calendar_persist_init): Made static.
-
- * gui/e-tasks.c: #include "calendar-config.h"
- (e_tasks_update_all_config_settings): We are configuring a table,
- not a calendar! Use the appropriate function.
-
-2001-03-17 Miguel de Icaza <miguel@ximian.com>
-
- * gui/e-day-view.c (e_day_view_on_new_event,
- e_day_view_on_new_appointment): Simplifed this function to use the
- shared code.
-
- * gui/e-week-view.c (e_week_view_on_new_event,
- e_week_view_on_new_appointment): ditto.
-
- * gui/gnome-cal.c (gnome_calendar_new_appointment_for): New
- function used to launch editor components with a time range. A
- bunch of functions use this code now instead of duplicating code
- all over the place
-
- * gui/e-week-view.c (e_week_view_new_event): Moved functionality
- here from e_day_view_on_new_appointment. Allows setting for "full
- day" event.
- (e_week_view_on_new_full_day): New function for making a full day
- event.
- (e_week_view_on_goto_date): Go To support.
- (e_week_view_on_goto_today): Goto today support.
-
- * gui/e-day-view.c (e_day_view_new_event): Moved functionality
- here from e_day_view_on_new_appointment. Allows setting for "full
- day" event.
- (e_day_view_on_new_full_day): New function for making a full day
- event.
- (e_day_view_on_goto_date): Go To support.
- (e_day_view_on_goto_today): Goto today support.
-
- * main_items: Add New All Day Event; Go to Today; Go to Date.
-
-2001-03-07 Miguel de Icaza <miguel@ximian.com>
-
- * gui/control-factory.c (calendar_persist_init): New function:
- inits the BonoboPersistFile server.
-
- * gui/GNOME_Evolution_Calendar.oaf.in: Added BonoboPropertyBag to
- the list of supported interfaces that were supported but not
- reported. Add the new PersistFile.
-
- Add text/calendar mime type attribute.
-
-2001-03-15 Dan Winship <danw@ximian.com>
-
- * gui/e-week-view.c (e_week_view_start_editing_event):
- * gui/e-day-view.c (e_day_view_start_editing_event): Update
- arguments to e_canvas_item_grab_focus.
-
-2001-03-15 Gediminas Paulauskas <menesis@delfi.lt>
-
- * gui/*.xpm: moved to ../art.
- * gui/Makefile.am: removed *.xpm and oaf_DATA from EXTRA_DIST.
- * gui/e-calendar-table.c, gui/e-day-view.c, gui/e-week-view.c:
- #include "art/*.xpm".
-
-2001-03-09 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/Makefile.am: PISOCK_INCLUDEDIR has become
- PISOCK_CFLAGS in gnome-pilot.m4 and remove capplet foo
-
- * conduits/calendar/Makefile.am: ditto
-
-2001-03-08 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/component-factory.c (factory_fn): Specify a NULL
- `EvolutionShellComponentGetDndSelectionFn'.
-
-2001-02-27 Miguel de Icaza <miguel@ximian.com>
-
- * gui/e-day-view.c (e_day_view_on_event_right_click): Reorganize
- the menus to have entries always in a consistent fashion, as
- reported to the genepool mailing list.
- (e_day_view_on_event_right_click): Added a FIXME comment to the
- FIXME comment without a FIXME.
-
- Now we use e_popup_menu. This allows us to hide/show items on
- demand, and to sensitize/de-sensitize items depending on their
- state.
-
- This will also let us add icon support (when we get nice icons for
- this)
-
- * gui/e-week-view.c (e_week_view_show_popup_menu): Ditto.
-
- The files popup-menu.c and popup-menu.h can now be removed.
-
-2001-03-05 Damon Chaplin <damon@ximian.com>
-
- * gui/e-tasks.c: keep list of all Tasks folders so we can update the
- preference settings when necessary.
-
- * gui/gnome-cal.c: configure the TaskPad according to the settings.
-
- * gui/e-calendar-table.c: use ECellCombo and ECellDateEdit for fields,
- so the tasks folders is almost usable now.
-
- * gui/calendar-model.c: added support for the Status property.
-
- * gui/calendar-config.[hc]: added convenience functions to setup
- ECalendarTable and ECellDateEdit objects.
-
- * gui/calendar-commands.c: connected to "destroy" signal of calendars
- so we can remove them from all_calendars list.
-
- * gui/dialogs/cal-prefs-dialog.c (cal_prefs_dialog_update_config):
- call e_tasks_update_all_config_settings() to update all the settings
- in the Tasks folders as well.
-
- * cal-util/cal-component.h: added CAL_COMPONENT_FIELD_STATUS.
-
- * cal-util/cal-component.c (cal_component_get_transparency): fixed
- calls to strcasecmp so they check for '== 0'.
-
- Applied patch from Miguel...
-
-2001-02-27 Miguel de Icaza <miguel@ximian.com>
-
- * gui/e-day-view.c (e_day_view_on_event_right_click): Reorganize
- the menus to have entries always in a consistent fashion, as
- reported to the genepool mailing list.
- (e_day_view_on_event_right_click): Added a FIXME comment to the
- FIXME comment without a FIXME.
-
- Now we use e_popup_menu. This allows us to hide/show items on
- demand, and to sensitize/de-sensitize items depending on their
- state.
-
- This will also let us add icon support (when we get nice icons for
- this)
-
- * gui/e-week-view.c (e_week_view_show_popup_menu): Ditto.
-
- The files popup-menu.c and popup-menu.h can now be removed.
-
-2001-03-02 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/e-todo.conduit.in: update for new pilot foo
-
- * conduits/calendar/e-calendar.conduit.in: ditto
-
- * conduits/todo/Makefile.am: update sed script
-
- * conduits/calendar/Makefile.am: ditto
-
-2001-02-28 Federico Mena Quintero <federico@ximian.com>
-
- * gui/event-editor.c (recurrence_exception_select_row_cb): New
- function to set the EDateEdit's value when a row is selected in
- the exception date list. Fixes bug #1638.
- (append_exception): Set the value as well. Block/unblock signals
- from the clist as appropriate. Gotta love non-model/view widgets.
- (recurrence_exception_delete_cb): Be more paranoid about the
- contents of the list row's data.
- (recur_to_comp_object): Likewise.
- (fill_exception_widgets): Select the first row after we are done
- appending the exception dates.
-
-2001-02-26 Federico Mena Quintero <federico@ximian.com>
-
- * gui/alarm-notify/Makefile.am (libalarm_a_SOURCES): Create a
- little stand-alone library for the low-level alarm trigger
- mechanism. This is so that the GUI parts of the calendar can use
- it in addition to the alarm daemon.
-
- * gui/main.c: #include "alarm-notify/alarm.h".
-
- * gui/calendar-summary.c: Likewise.
- (alarm_fn): Do not remove the previous alarm; it is removed
- automatically when it is triggered.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Removed alarm.[ch]
- from the sources.
-
- * gui/alarm.[ch]: Removed obsolete files.
-
-2001-02-23 Federico Mena Quintero <federico@ximian.com>
-
- * gui/alarm-notify/alarm-notify.c (AlarmNotify_addCalendar):
- Switched to using our own refcounted structure for loaded clients.
- (AlarmNotify_removeCalendar): Ditto. Also, do the full
- destruction of the client.
- (alarm_notify_destroy): Destroy each element in the hash table.
-
- * cal-client/cal-client.c (cal_client_construct): Test for
- exceptions from OAF when activating the Wombat calendar factory.
-
- * gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.oaf.in:
- New .oaf.in file.
-
- * gui/alarm-notify/Makefile.am (oaf_in_files): Updated.
-
- * gui/GNOME_Evolution_Calendar.oaf.in: Put all the servers here
- instead of in a million files.
-
- * gui/GNOME_Evolution_Calendar_Control.oaf.in: Removed file.
-
- * gui/GNOME_Evolution_Calendar_gnomecal.oaf.in: Removed *REALLY*
- obsolete file.
-
- * gui/Makefile.am (oaf_in_files): Updated.
-
-2001-02-23 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-db.c (add_history): fixed generation of history records
-
-2001-02-16 Federico Mena Quintero <federico@ximian.com>
-
- * pcs/cal-factory.c (CalFactoryPrivate): Added a `registered'
- field.
- (cal_factory_oaf_register): New function; now the factory performs
- its own registration with OAF.
- (cal_factory_destroy): Unregister from OAF if appropriate.
-
-2001-02-19 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/Makefile.am: Remove PISOCK_LIBDIR
-
- * conduits/calendar/Makefile.am: ditto
-
-2001-02-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/calbackend-db.c (cal_backend_db_destroy): close DB environment.
- Some compilation warnings removed
-
-2001-02-13 Christopher James Lahey <clahey@ximian.com>
-
- * gui/Makefile.am (evolution_calendar_LDADD): Added libmenus.la.
-
- * gui/e-calendar-table.c, gui/e-calendar-table.h
- (e_calendar_table_get_spec): Added this function.
-
- * gui/e-tasks.c, gui/e-tasks.h (e_tasks_setup_menus): Added this
- function.
-
- * gui/tasks-control.c (tasks_control_activate): Call
- e_tasks_setup_menus.
-
-2001-02-13 JP Rosevear <jpr@ximian.com>
-
- * gui/e-tasks.c (e_tasks_new_task): call task_editor_focus
-
-2001-02-13 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-commands.c (update_pixmaps): Set toolbar new
- appointment icon
- (set_pixmap): load files rather than create from xpm file
-
- * gui/*view.xpm: move to the art directory
-
-2001-02-13 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-db.c (cal_backend_db_get_alarms_for_object):
- implemented
-
-2001-02-13 JP Rosevear <jpr@ximian.com>
-
- * gui/calendar-commands.c (update_pixmaps): Set toolbar new command
-
- * gui/e-calendar-table.c: Add titles to pixbuf column for grouping
-
- * gui/calendar-model.c (calendar_model_class_init): override value
- to string virtual method
- (calendar_model_value_to_string): implement value to string for
- etable (necessary for group by)
-
-2001-02-12 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-file.c:
- cal_backend_db_update_object(): manage both updates and additions/add notification
- cal_backend_db_get_object(): don't use DB cursors
- cal_backend_db_get_type_by_uid(): don't use DB cursors
- cal_backend_db_remove_object(): don't use DB cursors/add notification
- cal_backend_db_get_alarms_in_range(): implemented
-
-2001-02-12 Kjartan Maraas <kmaraas@gnome.org>
-
- * gui/Makefile.am: Hook up the xml-i18n-tools + .oaf.in stuff.
- * gui/GNOME_Evolution_Calendar*.oaf.in: Marked strings for translation.
-
-2001-02-11 Rodrigo Moya <rodrigo@ximian.com>
-
- * pcs/cal-backend-db.c: added DB3 transactions support
- * pcs/cal-backend-db.[ch]: added the new DB3-based backend. This is just
- the beginning, there are some missing things still.
-
-2001-02-11 Gediminas Paulauskas <menesis@delfi.lt>
-
- Really use xml-i18n-tools.
-
- * conduits/calendar/e-calendar-conduit-control-applet.desktop,
- conduits/todo/e-todo-conduit-control-applet.desktop: removed.
-
- * conduits/calendar/e-calendar-conduit-control-applet.desktop.in,
- conduits/todo/e-todo-conduit-control-applet.desktop.in: added empty.
-
- * conduits/calendar/Makefile.am, conduits/todo/Makefile.am:
- reflect above changes, merge translations.
-
- * gui/*.glade.h, gui/dialogs/*.glade.h: removed, xml-i18n-extract
- takes care of strings itself.
-
- * gui/*.glade, gui/dialogs/*.glade: do not output_translatable_strings
-
- * gui/Makefile.am, gui/dialogs/Makefile.am: do not include removed
- files in EXTRA_DIST.
-
-2001-02-08 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/task-editor-dialog.glade: Oops, remove old widget
-
-2001-02-08 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/task-editor.c (fill_widgets): fill in new
- classification stuff properly
- (get_widgets): load new class. widgets
- (init_widgets): if the class. widgets change, mark the dialog
- dirty
- (dialog_to_comp_object): set the comp class. from the new widgets
-
- * gui/dialogs/task-editor-dialog.glade: Make more consistent,
- fixing bugs 1247 and 1249
-
- * gui/dialogs/task-editor.c (fill_widgets):
-
- * gui/event-editor-dialog.glade: Gui tidying
-
- * gui/event-editor.c: Remove old alarm cruft
-
- * cal-util/cal-component.c (cal_component_set_url): Don't try and
- write an empty string as a property
-
-
-2001-02-08 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal-backend-file.c: Move the get_change code here
-
- * pcs/cal-backend.c: Remove get_changes related stuff and
- implement by calling the virtual method instead
-
- * pcs/cal-backend.h: New virtual method.
-
- * pcs/cal-backend-file.c (compute_alarm_range): Use
- icaldurationtype_as_int (replace _as_timet)
- (add_alarm_occurrences_cb): ditto
-
-2001-02-08 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal-backend-file.c (compute_alarm_range): Use
- icaldurationtype_as_int (replace _as_timet)
- (add_alarm_occurrences_cb): ditto
-
- * gui/e-week-view.c (e_week_view_on_schedule_meet): new routine to
- throw up the meeting schedule dialog
- (e_week_view_show_popup_menu): add schedule meeting to the
- contextual menu where appropriate
-
-2001-02-08 JP Rosevear <jpr@ximian.com>
-
- * gui/event-editor.c: Remove assorted menu/bonobo stuff
-
- * gui/dialogs/task-editor.c: Remove assorted menu/bonobo stuff
- (task_editor_construct): no longer suck out the glade contents
- into a bonobo win, listen for apply and close signals
- (tedit_apply_event_cb): listen for apply signal and save object
- (tedit_close_event_cb): listen for close signal and prompt to save
- if need be
- (task_editor_focus): new function to bring the dialog to the front
-
- * gui/dialogs/task-editor.h: new prototype
-
- * gui/e-meeting-edit.c (schedule_button_clicked_cb): no need to
- update widgets in the event editor since the event editor won't be
- open
- (e_meeting_editor_new): don't need the event editor reference any
- more
-
- * gui/e-meeting-edit.h: Change prototype
-
- * gui/e-day-view.c (e_day_view_on_event_right_click): Make
- schedule meeting a new contextual menu item
- (e_day_view_on_schedule_meet): new routine to schedule a meeting
- from the contextual menu
-
- * gui/e-calendar-table.c (e_calendar_table_open_task): Call
- task_editor_focus
-
- * gui/event-editor-dialog.glade: Update to be a property box
-
- * gui/dialogs/task-editor-dialog.glade: Update to be a property
- box
-
-2001-02-07 Iain Holmes <iain@ximian.com>
-
- * gui/calendar-summary.c (create_summary_view): Add a setter to the
- property bag.
- (set_property): The setter.
- (generate_html_summary): Sort the UIDs accodring to time.
-
-2001-02-06 JP Rosevear <jpr@ximian.com>
-
- * gui/event-editor.c (fill_reminder_widgets): Match new
- append_alarm signature
- (reminder_to_comp_object): only add alarms tagged as new, no
- longer delete all alarms first
- (append_reminder): the row data is now of type ReminderData,
- rename from append_alarm
- (reminder_add_cb): math new append_alarm signature
- (reminder_delete_cb): if the alarm existed before the dialog was
- loaded, delete it immediately from the cal component
-
-2001-02-06 JP Rosevear <jpr@ximian.com>
-
- * gui/event-editor-dialog.glade: Gui tweaks for bugs 1248 and 1246
-
- * gui/dialogs/task-editor-dialog.glade: ditto
-
-2001-02-07 JP Rosevear <jpr@ximian.com>
-
- * gui/event-editor-dialog.glade: Fix spacing
-
-2001-02-06 JP Rosevear <jpr@ximian.com>
-
- * gui/event-editor-dialog.glade: Gui tweaks for bugs 1248 and 1246
-
- * gui/dialogs/task-editor-dialog.glade: ditto
-
-2001-02-06 JP Rosevear <jpr@ximian.com>
-
- * gui/e-week-view.c (e_week_view_show_popup_menu): Make the menus more
- consistent
-
- * gui/e-day-view.c (e_day_view_on_event_right_click): ditto
-
- * gui/e-calendar-table.c: ditto
-
-2001-02-06 JP Rosevear <jpr@ximian.com>
-
- * cal-util/cal-component.c (cal_component_set_categories): If the
- categories string is empty, remove the property
- (get_period_list): Fixes from clahey to handle the new rdate
- format in libical
- (set_period_list): ditto
-
-2001-02-05 JP Rosevear <jpr@ximian.com>
-
- * cal-util/cal-component.c (cal_component_alarm_set_trigger): Set
- the time and duration values in the trigger to null by default
- (cal_component_free_alarm_uids): properly free the list of alarm
- uids
-
-2001-02-05 JP Rosevear <jpr@ximian.com>
-
- * gui/event-editor.c (get_widgets): get the new reminder widgets
- (sync_entries): different callback data
- (summary_changed_cb): take different data and handle various cases
- (init_widgets): connect signals for the new widgets
- (get_alarm_duration_string): give a text string of the alarm
- duration
- (get_alarm_string): give a string representing the alarm
- (fill_widgets): make sure we don't loop infinitely and remove old
- alarm cruft
- (reminder_to_comp_object): dump alarm info in the gui into the cal
- component
- (append_alarm): add alarm to the clist
- (reminder_add_cb): create new alarm
- (reminder_delete_cb): remove the alarm from the list
-
- * gui/event-editor-dialog.glade: Update gui
-
- * gui/e-calendar-table.c: include gnome.h for all the menu stuff
-
- * gui/calendar-summary.c: for internationalization
-
- * gui/tasks-control.c: include gnome.h
-
- * gui/e-tasks.c: ditto
-
- * gui/e-itip-control.c: ditto
-
- * cal-util/cal-recur.c (cal_recur_set_rule_end_date): Update for
- libical changes
-
-2001-02-05 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/calendar-model.c: Fixed up these #includes.
-
-2001-02-03 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/save-comp.c (save_component_dialog):
- gnome_dialog_grab_focus() on the Yes button. Fixes bug #1242.
-
-2001-01-30 Kjartan Maraas <kmaraas@gnome.org>
-
- * gui/e-calendar-table.c: Mark a string for translation.
- * gui/e-itip-control.c: Mark a bunch of strings for translation.
-
-2001-01-30 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/print.c: #include <sys/time.h>.
-
-2001-01-29 Federico Mena Quintero <federico@ximian.com>
-
- * gui/calendar-config.c: <gnome.h> trimming to reduce compilation
- time.
- * gui/calendar-summary.c: Likewise.
- * gui/e-calendar-table.c: Likewise.
- * gui/e-day-view-time-item.c: Likewise.
- * gui/e-day-view.c: Likewise.
- * gui/e-itip-control.c: Likewise.
- * gui/e-meeting-edit.c: Likewise.
- * gui/e-meeting-edit.h: Likewise.
- * gui/e-tasks.c: Likewise.
- * gui/e-week-view.c: Likewise.
- * gui/event-editor.c: Likewise.
- * gui/gnome-cal.c: Likewise.
- * gui/goto.c: Likewise.
- * gui/itip-utils.h: Likewise.
- * gui/main.c: Likewise.
- * gui/popup-menu.c: Likewise.
- * gui/print.c: Likewise.
- * gui/tasks-control-factory.c: Likewise.
- * gui/tasks-control.c: Likewise.
- * gui/tasks-migrate.c: Likewise.
-
-2001-01-25 Federico Mena Quintero <federico@ximian.com>
-
- * cal-util/timeutil.c: <gnome.h> trimming to reduce compilation time.
- * gui/dialogs/task-editor.c: Ditto.
- * gui/dialogs/cal-prefs-dialog.c: Ditto.
- * gui/dialogs/save-comp.c: Ditto.
- * gui/dialogs/delete-comp.c: Ditto.
- * gui/calendar-commands.c: Ditto.
- * gui/calendar-model.c: Ditto.
-
-2001-01-26 Ettore Perazzoli <ettore@ximian.com>
-
- * gui/e-itip-control.c (itip_control_destroy_cb): Don't attempt to
- call `icalcomponent_remove_component()' on a NULL component or a
- NULL subcomponent.
-
-2001-01-25 Damon Chaplin <damon@ximian.com>
-
- * gui/tag-calendar.c: don't tag the calendar if no dates are shown.
- (e_calendar_item_get_date_range() now returns FALSE in this case.)
-
-2001-01-23 Damon Chaplin <damon@helixcode.com>
-
- * gui/calendar-model.c (ensure_task_complete): make sure the status
- is set to "Completed". Fixes bug #1253.
-
- * gui/e-tasks.c (e_tasks_open): load the ETable state after opening
- the tasks folder, since it relies on the folder uri, which isn't set
- now until you open the folder.
-
- * gui/calendar-model.c (obj_updated_cb): add the categories from the
- updated object to our tree, and emit the "categories-changed" signal
- if they have changed. Fixes bug #1255.
-
- * gui/e-tasks.c: removed debug messages.
-
-2001-01-23 JP Rosevear <jpr@ximian.com>
-
- * libical import cleanup
-
-2001-01-23 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/todo-conduit.c (local_record_from_comp): properly ref
- the cal component when we use it, prevents double free
-
- * conduits/calendar/calendar-conduit.c (local_record_from_comp): ditto
-
-2001-01-22 JP Rosevear <jpr@ximian.com>
-
- * gui/dialogs/Makefile.am: compile new stuff
-
- * gui/dialogs/task-editor.c (prompt_to_save_changes): use new
- standard dialog
-
- * gui/event-editor.c (prompt_to_save_changes): ditto
-
- * gui/dialogs/save-comp.h: new header
-
- * gui/dialogs/save-comp.c (save_component_dialog): shows the save
- dialog
-
-2001-01-22 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/todo-conduit.c (for_each_modified): remove duplicate
- message
-
- * conduits/calendar/Makefile.am: Remove vfs lib dependency
-
- * conduits/todo/Makefile.am: ditto
-
- * conduits/calendar/calendar-conduit.c: Remove alarm foo for now
- (for_each_modified): remove duplicate message
-
-2001-01-21 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (delete_record): Remove
- deleted records from the pilot map so we don't have dupes in the future
-
- * conduits/todo/todo-conduit.c (delete_record): ditto
-
-2001-01-21 Federico Mena Quintero <federico@ximian.com>
-
- * gui/dialogs/task-editor.c (file_delete_cb): Fix bug #1250; now
- we present a confirmation dialog before deleting the component.
-
-2001-01-20 Federico Mena Quintero <federico@ximian.com>
-
- * gui/event-editor-dialog.glade: Fix bug #1243. Turn on the Y
- expand/fill options for the date widgets in the General page.
- This makes them be vertically aligned with the "All day event"
- toggle so that they will get the focus in the proper order; the
- toggle would get the focus before them because it was a pixel or
- two above them.
-
-2001-01-19 Federico Mena Quintero <federico@ximian.com>
-
- * gui/weekday-picker.c (weekday_picker_init): Unset the
- GTK_CAN_FOCUS flag on the weekday picker. This will do until it
- supports being used with the keyboard.
-
-2001-01-19 JP Rosevear <jpr@ximian.com>
-
- * cal-util/cal-component.c (cal_component_alarm_new): create a new
- cal component alarm
- (cal_component_add_alarm): add alarm to the cal component
- (cal_component_remove_alarm): remove alarm from the cal component
- (remove_alarm): remove alarm from hash
-
- * cal-util/cal-component.h: new protos
-
- * conduits/calendar/calendar-conduit.c (comp_from_remote_record):
- add alarm information, still needs to be hacked to replace an already
- existing alarm. questions abound about the heuristic for doing this.
-
-2001-01-17 JP Rosevear <jpr@ximian.com>
-
- * gui/event-editor.c (dialog_to_comp_object): Properly set categories
- to NULL if there are none
-
-2001-01-18 Federico Mena Quintero <federico@ximian.com>
-
- * gui/tasks-migrate.[ch]: New files with a simple sequence to
- migrate the task components from the old calendar folder into the
- new tasks folder.
-
- * gui/component-factory.c (owner_set_cb): Call tasks_migrate()
- once evolution_dir is set. It sucks to have to do this here.
-
- * cal-client/cal-client.c (cal_client_get_uids): In the inline
- docs, indicate how to free the return value.
- (cal_opened_cb): Ahem, moved assertion to the right place. Also,
- ref() and unref() around our own signal emission because we are
- not inside a signal handler, rather a simple callback from the
- listener object; we want to have a chance to clean up even if the
- client is unrefed during the emission.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Added
- tasks-migrate.[ch] to the list of sources.
-
-2001-01-17 Federico Mena Quintero <federico@ximian.com>
-
- * gui/event-editor.c (init_widgets): Use
- e_calendar_item_set_max_days_sel() instead of setting GTK+ object
- arguments.
-
- * gui/e-day-view.c (e_day_view_set_cal_client): Oops, we had a
- reversed test for the client being loaded.
-
- * gui/tag-calendar.c (tag_calendar_by_client): Fixed similarly
- reversed test.
-
-2001-01-17 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-week-view*.c
- * gui/e-day-view*.c: don't use the theme colors at all within
- the graphical parts of the widgets, since they may clash with
- our colors. May make them configurable in future so people can tweak
- them to go with their theme. At least the calendars are usable in any
- theme now, even though the colors may not go well with the theme.
- Also set the font of all the EText items in style_set.
-
- * gui/e-week-view-event-item.c (e_week_view_event_item_draw): don't
- draw the icons if we are editing the event.
-
- * gui/e-day-view.c:
- * gui/e-week-view.c: reinstated the optimizations so we don't do a
- complete relayout if the event's dates haven't been changed.
- (Though we still do a re-layout when recurring events change, since
- comparing all the RDATES/RRULES/EXDATES/EXRULES is too much hassle.)
- A side-effect of this change is that the EWeekView won't crash so
- often - only recurring events will be a problem.
-
- * cal-util/cal-component.[hc]: added function to check if the start
- and end dates of a component match. Used for optimizing the updating
- of the EDayView & EWeekView.
-
-2001-01-17 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (start_calendar_server): Check
- for open error and handled
-
- * conduits/todo/todo-conduit.c (start_calendar_server): ditto
-
-2001-01-17 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/calendar-conduit.c (start_calendar_server): Check
- for open error and handled
-
- * pcs/cal-backend.c (cal_backend_compute_changes): Fix transposition
- of sync db location
-
-2001-01-17 Federico Mena Quintero <federico@ximian.com>
-
- * */*: Ximianified email addresses and copyrights.
-
- * idl/evolution-calendar.idl (CalFactory::open): Renamed from
- ::load(), and added an only_if_exists argument.
- (CalFactory::create): Removed method.
- (Listener::OpenStatus): Removed the IN_USE error and replaced it
- with a NOT_FOUND one; renamed the enum from LoadStatus.
- (Listener::notifyCalOpened): Renamed from notifyCalLoaded().
-
- * pcs/cal-backend.h (CalBackend): Removed the uri field.
- (CalBackendOpenStatus): Renamed from CalBackendLoadStatus and
- added a NOT_FOUND value.
- (CalBackendClass::open): Put in a slot for the open method.
-
- * pcs/cal-backend.c (cal_backend_create): Removed function.
-
- * pcs/cal-backend-file.c (cal_backend_file_open): Return the
- appropriate value when only_if_exists is TRUE.
- (create_cal): We are Ximian now, so set the PRODID property to
- the appropriate foo.
-
- * pcs/cal-factory.c (CalFactory_open): implemented, replacing
- CalFactory_load() and CalFactory_create().
- (CalFactory_open): Moved the queue_load_create_job() stuff to
- here, since we now only need to contemplate the open case instead
- of load/create ones.
- (open_backend): Do everything here; replaces load_backend() and
- create_backend().
-
- * cal-client/cal-listener.h (CalListenerClass::cal_opened):
- Renamed from cal_loaded.
- (CalListenerClass): Replaced the silly signals, which are
- gratuitous abstraction, by a set of function pointers in the
- instance structure.
-
- * cal-client/cal-listener.c (cal_listener_get_calendar): Removed
- unused function.
- (cal_listener_construct): Added the listener notification functions.
- (cal_listener_new): Ditto.
- (Listener_notifyCalOpened): Renamed to our new naming convention
- for servant implementations.
- (Listener_notifyObjUpdated): Ditto.
- (Listener_notifyObjRemoved): Ditto.
-
- * cal-client/cal-client.h (CalClientOpenStatus): Renamed from
- CalClientLoadStatus.
- (CalClientClass::cal_opened): Renamed from ::cal_loaded().
- (CalClientLoadState): New enum; basically make LoadState public so
- that users of this code do not have to maintain their own states.
-
- * cal-client/cal-client.c (cal_client_create_calendar): Removed
- function.
- (cal_client_open_calendar): Moved the functionality over from
- load_or_create(); now we do everything here.
- (*): Use the CalClientLoadState enum values instead of the old
- LoadState values.
- (cal_client_get_load_state): Renamed from cal_client_is_loaded(),
- and return the appropriate value.
- (CalClientPrivate): Added an uri field.
- (cal_client_init): Initialize priv->uri.
- (cal_client_destroy): Free the priv->uri.
- (cal_opened_cb): Maintain the priv->uri.
- (cal_client_open_calendar): Fill in the priv->uri.
- (cal_client_get_uri): New function.
-
- * gui/calendar-model.c (calendar_model_set_new_comp_vtype): New
- function to configure the type of calendar components to create
- when doing click-to-add. This makes the model usable for
- something other than task lists.
- (calendar_model_get_new_comp_vtype): New function.
-
- * gui/e-calendar-table.c (e_calendar_table_get_model): New function.
- (e_calendar_table_destroy): Unref the subset_model.
-
- * gui/gnome-cal.h (GnomeCalendarOpenMode): Removed enum.
-
- * gui/gnome-cal.c (LoadState): Removed enum; we now use the
- CalClientLoadState from the client objects.
- (GnomeCalendarPrivate): Removed the loading_uri and
- task_pad_loading_uri fields as well as the load_state and
- task_pad_load_state fields, as we can now query them directly from
- the CalClient.
- (open_error): Renamed from load_error().
- (create_error): Removed function.
- (gnome_calendar_open): Do not take in the mode parameter.
- (cal_opened_cb): Get rid of our beautifully-crafted state machine
- and replace it with simple code; all the loading smarts are in the
- Wombat now.
- (setup_widgets): Set the new component vtype of the table model to
- CAL_COMPONENT_TODO.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Removed
- gnome-month-item.[ch] from the list of sources.
-
- * gui/calendar-summary.c (CalSummary): Removed unused cal_loaded
- field.
- (create_summary_view): Do not check if the file exists; this is
- the job of the Wombat.
- (generate_html_summary): Fixed prototype.
- (alarm_fn): Fixed prototype.
- (property_dialog): Fixed prototype. Wonder if/how this ever
- worked.
- (create_summary_view): Cast the component and view as
- appropriate. Removed unused html variable.
-
- [Iain dude, are you compiling with -Wall?]
-
- * gui/e-itip-control.c (cal_opened_cb): Sigh, this function
- signature was *very* wrong. It was using CalClientGetStatus
- instead of CalClientOpenStatus.
-
- * gui/e-tasks.h (ETasksOpenMode): Removed enum.
-
- * gui/e-tasks.c (setup_widgets): Set the new component vtype of
- the table model to CAL_COMPONENT_TODO.
- (LoadState): Removed the state machine foo.
- (e_tasks_open): Removed the mode parameter.
- (initial_load): Removed function.
- (create_error): Removed function.
- (ETasksPrivate): Removed folder_uri field.
- (cal_opened_cb): Remove the state machine.
-
- * gui/component-factory.c: #include "tasks-control.h"
-
- * conduits/calendar/calendar-conduit.h (ECalConduitContext):
- Removed calendar_load_tried field.
-
- * conduits/calendar/calendar-conduit.c (start_calendar_server_cb):
- Sigh, fixed function prototype.
-
- * conduits/todo/todo-conduit.h (EToDoConduitContext): Removed
- calendar_load_tried field.
-
- * conduits/todo/todo-conduit.c (start_calendar_server_cb): Fixed
- function prototype.
-
-2001-01-16 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/todo-conduit.c (print_local): fix debug output
- (print_remote): ditto
-
-2001-01-15 JP Rosevear <jpr@ximian.com>
-
- * pcs/cal-backend.c (cal_backend_compute_changes): accomadate tasks
- in their new dir
-
- * conduits/todo/todo-conduit.c (start_calendar_server): ditto
-
-2001-01-15 JP Rosevear <jpr@ximian.com>
-
- * conduits/todo/todo-conduit.c (print_local): prevent segfaults and
- buffer overflows.
- (print_remote): ditto
-
- * conduits/calendar/calendar-conduit.c: as above
-
-2001-01-14 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-calendar-table.c (E_CALENDAR_TABLE_SPEC): changed the expansion
- values so that small text fields are 1.0, all the date fields and the
- URL field are 2.0, and the Summary is 3.0. Hopefully the user will
- resize the fields as desired, but at least this is a better start.
-
-2001-01-14 JP Rosevear <jpr@ximian.com>
-
- * conduits/calendar/Makefile.am: pass -module and -avoid-version to
- conduit linker
-
- * conduits/todo/Makefile.am: ditto
-
-2001-01-14 Damon Chaplin <damon@helixcode.com>
-
- * gui/dialogs/task-editor.[hc]: moved #include
- <cal-client/cal-client.h> to the .h file.
-
- * gui/e-tasks.c: load & save the Tasks folders' ETable layout.
- Added an option menu to filter tasks by category.
-
- * gui/gnome-cal.c: use the "Tasks" folder for the TaskPad.
- (We may make the actual tasks folder shown a per-calendar option.)
-
- * gui/tasks-control.c (tasks_control_new_task_cmd): added support for
- the New Task icon on the toolbar.
-
- * gui/e-calendar-table.[hc]: we now use an ETableSubsetVariable model
- to filter the tasks by a category. And tidied up a little.
-
- * gui/calendar-model.[hc]: added way to get all the categories used by
- the tasks, so we can show an option menu of them. Also a signal which
- is emitted when they are changed.
- Also allows a default category to be set, which is used to initialize
- the 'click-to-add' row.
- Also made sure the initialize_value()/get_value() functions don't
- return NULL since that can cause a SEGV.
-
- * gui/e-week-view.c:
- * gui/e-day-view.c: set the "fill_color_rgba" arg of the EText items
- to black since it doesn't seem to set up a default color properly.
- Hopefully this fixes the bug on Solaris where the items appear with
- strange colors.
-
- * gui/widget-util.c (date_edit_new): use the calendar_config function
- to set most of the options. It wasn't setting the 12/24 hour option
- before.
-
- * gui/dialogs/task-editor-dialog.glade: added "Undefined" priority.
-
-2001-01-12 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component-factory.c (factory_fn): Pass NULL as the
- @copy_folder_fn arg to `evolution_shell_component_new()'.
-
-2001-01-12 Miguel de Icaza <miguel@ximian.com>
-
- * gui/e-calendar-table.c: Add translation strings.
-
-2001-01-08 Iain Holmes <iain@helixcode.com>
-
- * gui/calendar-summary.c (create_summary_view): Add a PropertyControl
- interface to set whether or not to show tasks and appointments. Add
- a PersistStream to remember this.
-
-2001-01-09 Dave Camp <dave@helixcode.com>
-
- * gui/Makefile.am: Replaced e-meet-dialog.glade.h with
- e-meeting-dialog.glade in glade_messages.
-
- * gui/e-meeting-dialog.glade: Enabled the translatable string option.
-
- * gui/e-itip-control.glade: Likewise.
-
-2001-01-09 Federico Mena Quintero <federico@helixcode.com>
-
- * idl/evolution-calendar.idl (AlarmNotify): New interface for the
- alarm notification system.
-
- * gui/alarm-notify: New directory for the alarm notification
- daemon and its auxiliary stuff.
-
- * gui/alarm-notify/alarm.[ch]: Moved over from gui/alarm.[ch].
-
- * gui/alarm-notify/alarm-queue.[ch]: Moved over from
- gui/alarm-notify.[ch]. Renamed functions from alarm_notify_*() to
- alarm_queue_*().
-
- * gui/alarm-notify/alarm-notify.[ch]: Implementation of the
- GNOME::Evolution::Calendar::AlarmNotify interface.
-
- * gui/Makefile.am (evolution_calendar_LDADD): Removed the
- LINK_FLAGS variable and reordered the libraries to remove some
- duplicated ones.
- (SUBDIRS): Added the alarm-notify directory.
-
-2001-01-08 Iain Holmes <iain@helixcode.com>
-
- * gui/calendar-summary.c (generate_html_summary): Get the tasks
- correctly.
- (generate_html_summary): Mark the tasks as completed if so.
-
-2001-01-08 Damon Chaplin <damon@helixcode.com>
-
- * gui/Makefile.am: added new source files for the Tasks folders.
-
- * gui/e-tasks.[hc]: new widget to encapsulate the Tasks view.
-
- * gui/tasks-control.[hc]: new files to implement the Tasks control.
-
- * gui/tasks-control-factory.[hc]: new files to implement the factory
- for the Tasks controls. (I think the way I've split the code up is a
- lot cleaner than the GnomeCal implementation - the factory file just
- contains the factory functions and the control file contains all the
- control functions. Maybe we should make GnomeCal like this.)
-
- * gui/main.c: initialize the Tasks control factory.
-
- * gui/component-factory.c: added support for the Tasks control.
- Also added a "create_folder" function so we can now create new Tasks
- and Calendar folders within Evolution.
- I'm not a Bonobo expert so someone might want to check these over.
-
- * gui/calendar-config.[hc]: added convenience functions to configure
- the common settings of ECalendar and EDateEdit widgets.
-
- * gui/dialogs/task-editor.c (task_editor_create_date_edit):
- * gui/gnome-cal.c (gnome_calendar_update_config_settings):
- * gui/event-editor.c: used function to configure the ECalendars
- and EDateEdits.
-
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw_long_event):
- fixed minor bug in format strings.
-
-2001-01-06 Iain Holmes <iain@helixcode.com>
-
- * gui/calendar-summary.c (generate_html_summary): Neaten the HTML,
- and fix the time printing stuff. Add stuff the get Tasks.
- (alarm_fn): Set up an alarm for midnight everynight and regenerate
- the HTML for the new day.
-
-2001-01-05 JP Rosevear <jpr@helixcode.com>
-
- * gui/event-editor.c (get_widgets): get categories button
- (init_widgets): listen for button click
- (fill_widgets): fill in the categories area
- (dialog_to_comp_object): set the cal component categories
- (categories_clicked): throw up the categories dialog and update
- when ok is clicked
-
- * gui/event-editor-dialog.glade: Add categories and contacts buttons
- and fields
-
- * gui/dialogs/task-editor-dialog.glade: Rename button
-
-2001-01-05 JP Rosevear <jpr@helixcode.com>
-
- * gui/dialogs/task-editor.c (get_widgets): get categories button
- (init_widgets): listen for button click
- (fill_widgets): fill in the categories area
- (dialog_to_comp_object): set the cal component categories
- (categories_clicked): throw up the categories dialog and update
- when ok is clicked
-
- * gui/dialogs/task-editor-dialog.glade: Tweak to name the categories
- button and make it active
-
- * gui/calendar-model.c (get_categories): We can get the string list of
- categories directly now
-
- * cal-util/cal-component.c (cal_component_get_categories): new function
- to get the categories list as a string
- (cal_component_set_categories): same but for setting
- (free_icalcomponent): init the categories var
- (scan_categories): kill
- (scan_property): assign the prop to the categories var
- (cal_component_get_categories_list): deal with renaming var to categories
- (cal_component_set_categories_list): fix brokeness
-
-2001-01-03 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/calendar-commands.c (new_calendar): Handle the case where
- the calendar view cannot be created; present a warning dialog box.
- (new_calendar): Do not show the widget here, since we already show
- it in control-factory.c.
-
- * gui/control-factory.c (control_factory_new_control): Handle the
- case where the calendar view cannot be created.
-
- * gui/component-factory.c (create_view): Ditto.
-
- * gui/calendar-summary.h: Added prototype for
- calendar_summary_factory_init().
-
-2001-01-02 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/alarm-notify.c (add_component_alarms): If the component has
- no alarms, do not try to queue them.
- (remove_client_alarms): New function to remove all the queued
- alarms for a calendar client.
- (alarm_notify_remove_client): Remove the client's alarms.
-
-2001-01-02 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/dialogs/delete-comp.c (delete_component_dialog): Do not
- compose strings so that they can be localized correctly. Also,
- convert from UTF8 into the font's encoding. Fixes bug #1030.
-
- * gui/e-calendar-table.c (delete_component): Pass the widget
- argument to delete_component_dialog().
-
- * gui/e-day-view.c (e_day_view_on_delete_appointment): Likewise.
-
- * gui/e-week-view.c (e_week_view_on_delete_appointment): Likewise.
-
- * gui/event-editor.c (file_delete_cb): Likewise.
-
- * gui/calendar-commands.c: Use BONOBO_UI_VERB() instead of
- BONOBO_UI_UNSAFE_VERB(). Guess what, all of our handler
- signatures were wrong.
-
- * gui/event-editor.c: Likewise.
-
- * gui/dialogs/task-editor.c: Likewise.
-
- * gui/goto-dialog.glade: Added some spacing between the month/year
- widgets and the calendar widget.
-
-2001-01-01 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/gnome-cal.c (gnome_calendar_destroy): Unconditionally remove
- the client from the alarm notification system.
- Removed all the obsolete alarm code.
-
- * gui/event-editor.c: Removed some crufty externs left over from
- Gnomecal.
-
- * gui/calendar-commands.c: #include "goto.h"
- Removed crufty variables left over from Gnomecal.
- (new_calendar): Do not take a full_name parameter.
- (init_username): Removed function.
- (init_calendar): Wheeeeeeee! Removed crufty function.
- (quit_cmd): Removed function.
-
- * gui/print.c (WEEK_STARTS_ON_MONDAY): Made it unconditionally
- FALSE because we do not use the configuration setting anyways.
- Sigh, all the printing code needs to be revamped.
-
-2000-12-26 Iain Holmes <iain@helixcode.com>
-
- * gui/calendar-summary.c (create_summary_view): Create a shared
- BonoboEventSource object.
-
-2000-12-25 Miguel de Icaza <miguel@helixcode.com>
-
- * gui/e-day-view.c (e_day_view_init): Set draw background to FALSE.
- (e_day_view_reshape_long_event): ditto.
- (e_day_view_reshape_day_event): ditto.
-
-2000-12-22 JP Rosevear <jpr@helixcode.com>
-
- * gui/dialogs/delete-comp.c (delete_component_dialog): Clean up
- translatable strings for translators, fixes bug 993
-
-2000-12-22 JP Rosevear <jpr@helixcode.com>
-
- * gui/goto.c (create_ecal): Make sure the current month is shown
- when the dialog pops up.
-
- * gui/goto-dialog.glade: Remove flicker
-
-2000-12-22 JP Rosevear <jpr@helixcode.com>
-
- * pcs/cal-backend-file.c (cal_backend_file_get_alarms_for_object):
- account for the case where there are no alarms, fixes crash
-
-2000-12-22 JP Rosevear <jpr@helixcode.com>
-
- * gui/goto.c (ecal_date_range_changed): New function to keep the
- ecal marked properly
- (create_ecal): move more creation code here, update marks
- (goto_dialog_init_widgets): listen for date_range_changed signal
- in the ecal
-
- * gui/calendar-commands.c (init_calendar): Remove ancient gnomecal
- cruft
-
- * gui/mark.[hc], gui/prop.c: Remove ancient gnomecal code that is
- no longer needed, last bit of bug 904
-
-2000-12-22 JP Rosevear <jpr@helixcode.com>
-
- * gui/goto-dialog.glade.h: translations
-
- * gui/goto-dialog.glade: new glade file for goto dialog
-
- * gui/gnome-cal.c (setup_widgets): Set date navigator attributes
-
- * gui/calendar-commands.h: remove prototype
-
- * gui/goto.h: Add prototype
-
- * gui/Makefile.am: Add glade file stuff
-
- * gui/gnome-cal.c (setup_widgets): Use accessors to configure the
- calendar item properly
-
-2000-12-21 Federico Mena Quintero <federico@helixcode.com>
-
- Alarm trigger queueing for the GUI part.
-
- * gui/alarm-notify.[ch]: New files with the high-level alarm
- notification system; mostly moved over from gnome-cal.c. The
- low-level timer stuff is still in alarm.[ch].
-
- * gui/alarm-notify.c (alarm_notify_init): New function to
- initialize the alarm notification system.
- (alarm_notify_done): New function to shut down the alarm
- notification system.
- (alarm_notify_add_client): New function to start monitoring a
- calendar client for alarm notification.
- (alarm_notify_remove_client): New function to stop monitoring a
- client.
-
- * gui/alarm.h (AlarmDestroyNotify): Also pass in the alarm ID so
- the callback may know which ID is being destroyed.
-
- * gui/alarm.c (clear_itimer): New function.
- (pop_alarm): Use clear_itimer().
- (alarm_done): New function to shut down the timer system.
- (alarm_add): Add some preconditions. Do not call the destroy
- notification function if we could not create the alarm.
- (alarm_ready): Pass the alarm ID to the destroy notify function.
- (alarm_remove): Likewise. Also, add some preconditions.
-
- * gui/gnome-cal.c: Removed the alarm notification functions from
- here since they are now in alarm-notify.c.
- (gnome_calendar_construct): Register the client with
- alarm_notify_add_client().
- (gnome_calendar_destroy): Use alarm_notify_remove_client() to
- unregister the client.
- (obj_updated_cb): Do not do any alarm-related stuff.
- (obj_removed_cb): Likewise.
-
- * gui/main.c (main): Shut down the alarm timer system.
- (main): Initialize and shut down the alarm notification system.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Added
- alarm-notify.[ch] to the list of sources.
-
- * gui/calendar-model.c (calendar_model_set_cal_client): Only
- connect to the "cal_loaded" signal if the client is not already
- loaded.
-
- * gui/e-day-view.c (e_day_view_set_cal_client): Likewise.
-
- * gui/e-week-view.c (e_week_view_set_cal_client): Likewise.
-
- * gui/e-itip-control.c (update_calendar): Connect to "cal_loaded"
- before issuing the load request.
-
-2000-12-21 Iain Holmes <iain@helixcode.com>
-
- * gui/calendar-summary.c: Updated for new executive summary.
-
- * gui/component-factory.c: Reenabled the summary.
-
- * gui/GNOME_Evolution_Calendar.oafinfo: Added the summary.
-
-2000-12-20 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.h: Fix erroneous documentation
-
- * conduits/todo/todo-conduit.c (comp_from_remote_record): if
- !is_empty_time rather than is_empty_time
- (e_todo_context_new): Return a pointer rather than fill in
- a parameter
- (e_todo_context_foreach_change): Free just the key
- (e_todo_context_destroy): Plug this enormous leakage. I had assumed
- i had done this earlier, which isn't too bright when anything beyond
- 2 minutes ago is fuzzy.
- (comp_from_remote_record): Kill warnings
- (post_sync): Destroy the map later
- (conduit_get_gpilot_conduit): Fix e_todo_context_new params
-
- * conduits/calendar/calendar-conduit.[hc]: Similar to above
-
-2000-12-19 JP Rosevear <jpr@helixcode.com>
-
- * conduits/calendar/calendar-conduit.c: Remove pointless comment
-
- * conduits/todo/todo-conduit.c (is_empty_time): add utility function
- (comp_from_remote_record): use it
-
-2000-12-19 JP Rosevear <jpr@helixcode.com>
-
- * conduits/calendar/calendar-conduit.c (local_record_from_comp):
- Convert cal component strings to pilot character set
- (comp_from_remote_record): vice versa
-
- * conduits/todo/todo-conduit.c: Same as above
-
-2000-12-19 Federico Mena Quintero <federico@helixcode.com>
-
- * pcs/cal-backend-file.c (compute_alarm_range): Fix confusion in
- the way the range is expanded.
-
- * cal-util/cal-component.c (cal_component_alarms_free): Doh,
- alarms->alarms is a list, not a generic pointer. Free it properly.
- (cal_component_free_pilot_id): Removed unused function.
- (cal_component_free_pilot_status): Likewise.
-
- * gui/main.c (init_bonobo): Use VERSION instead of a hardcoded
- string. Pass argc by value, not by reference. Test the return
- value of gnome_init_with_popt_table().
-
- * cal-client/cal-client.c (cal_client_free_alarms): Oops, missed
- implementing this function.
-
- * cal-util/timeutil.c (print_time_t): Better printing format.
- (isodiff_to_secs): Removed unused function.
- (isodiff_from_secs): Removed unused function.
- (time_day_end): Removed crufty part.
- (time_day_begin): Removed crufty part.
- (time_day_hour): Removed unused function.
- (format_simple_hour): Removed unused function.
- (get_time_t_hour): Removed unused function.
- (time_from_start_duration): Removed unused function.
-
- * cal-util/timeutil.h (parse_date): Removed unimplemented, unused
- function prototype.
-
-2000-12-19 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/gnome-cal.c: Removed prototype for setup_alarm to fix a
- warning.
-
-2000-12-18 Federico Mena Quintero <federico@helixcode.com>
-
- Alarm instance generation support for the Wombat.
-
- * idl/evolution-calendar.idl (Cal::CalAlarmInstance): Changed to
- have an alarm UID, the trigger time, and the actual occurrence
- time.
- (Cal::CalComponentAlarms): New structure to hold a pair of a
- component and its alarms that trigger in a particular range of
- time.
- (Cal::getAlarmsInRange): Changed to return a CalComponentAlarmsSeq.
-
- * cal-util/cal-component.h (CalAlarmInstance): New C-side
- structure to match the one on the IDL.
- (CalComponentAlarms): Ditto.
- (CalAlarmAction): Renamed from CalComponentAlarmAction.
- (CalAlarmTriggerType): Renamed from CalComponentAlarmTriggerType.
- Encoded the START and END parameters for the RELATED parameter in
- this enum, too. Added a NONE value for invalid or missing trigger
- specifications.
- (CalComponentAlarmTriggerRelated): Removed.
- (CalAlarmTrigger): Renamed from CalComponentAlarmTrigger. Renamed
- the duration/time fields to rel_duration/abs_time, respectively.
-
- * cal-util/cal-component.c (cal_component_alarm_get_trigger):
- Changed to use the new trigger structure.
- (cal_component_alarm_set_trigger): Likewise.
- (cal_component_alarm_free_trigger): Removed function.
- (cal_component_has_alarms): Count the elements in the
- alarm_uid_hash instead of trying to fetch the first alarm subcomponent.
- (cal_component_alarms_free): New function to free a
- CalComponentAlarms structure.
- (CalComponentAlarmPrivate): Added an uid property pointer.
- (scan_alarm_property): Scan for the our extension UID property.
- (cal_component_alarm_get_uid): New function.
-
- * pcs/cal-backend.h (CalBackendClass): Changed the signatures of
- the ::get_alarms_in_range() and ::get_alarms_for_object() methods.
-
- * pcs/cal-backend.c (cal_backend_get_alarms_in_range): Changed
- signature; use the new method.
- (cal_backend_get_alarms_for_object): Likewise.
-
- * pcs/cal-backend-file.c (compute_alarm_range): New spiffy
- function to compute a range of time for alarm occurrences.
- (add_alarm_occurrences_cb): New function to add alarms for a
- particular occurrence of the component.
- (generate_absolute_triggers): New function to add the absolute
- alarm triggers.
- (generate_alarms_for_comp): New function to generate all the alarm
- instances for a component.
- (cal_backend_file_get_alarms_in_range): Implemented.
-
- * pcs/cal.c (Cal_get_alarms_in_range): Use the new CalBackend API.
- (Cal_get_alarms_for_object): Likewise.
- (build_alarm_instance_seq): Removed old function.
-
- * cal-util/cal-util.c (cal_alarm_instance_list_free): Removed
- function.
-
- * cal-client/cal-client.c (build_component_alarms_list): New
- function to demarshal the component alarms sequence.
- (build_alarm_instance_list): New function to demarshal the alarm
- instances sequence.
- (cal_client_get_alarms_in_range): Updated for the new API.
- (cal_client_get_alarms_for_object): Updated for the new API.
-
- * gui/gnome-cal.c: Temporary #ifdef-ing out of alarm-related stuff
- to make it build.
-
-2000-12-15 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/timeutil.[ch] (time_from_isodate): Removed unused
- function, a relic from Gnomecal.
-
-2000-12-15 Dan Winship <danw@helixcode.com>
-
- * cal-util/timeutil.c (time_from_isodate): Fix the sign in the
- HAVE_TM_GMTOFF case
-
-2000-12-15 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Removed getdate.y.
- We no longer use it; it is a relic from Gnomecal.
-
- * gui/getdate.y: Removed file.
-
-2000-12-14 Federico Mena Quintero <federico@helixcode.com>
-
- Fixes bug #955.
-
- * gui/weekday-picker.c (WeekdayPickerPrivate): Added a field for
- the week_start_day, to be used in the same way as
- calendar-config.h defines it. Removed the week_starts_on_monday
- flag.
- (day_event_cb): Use the week_start_day.
- (colorize_items): Likewise.
- (configure_items): Likewise.
- (weekday_picker_set_week_start_day): New function.
- (weekday_picker_get_week_start_day): New function.
- (weekday_picker_set_week_starts_on_monday): Removed function.
- (weekday_picker_get_week_starts_on_monday): Removed function.
-
- * gui/widget-util.[ch]: New files with utilities for creating or
- configuring widgets.
-
- * gui/widget-util.c (date_edit_new): New function to create an
- EDateEdit configured with the calendar's preferences; moved over
- from event-editor.c.
-
- * gui/event-editor.c (make_recur_weekly_special): Use
- weekday_picker_set_week_start_day() and the corresponding function
- from calendar-config.h.
- (init_widgets): Likewise.
- (make_date_edit_with_time): Removed function.
- (make_recur_ending_until_special): Use date_edit_new().
- (make_date_edit): Likewise.
-
- * gui/dialogs/task-editor.c (task_editor_create_date_edit): Likewise.
-
- * gui/event-editor-dialog.glade: Removed references to
- make_date_edit_with_time(); replace them with make_date_edit().
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Added
- widget-util.[ch] to the list of sources.
-
-2000-12-14 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/e-calendar-table.c (E_CALENDAR_TABLE_SPEC): Reset the widths
- of the columns with pixbufs to the actual pixbufs' sizes; now
- ETable properly computes its column widths so we do not need to
- add extra padding here.
-
-2000-12-14 Dan Winship <danw@helixcode.com>
-
- * gui/calendar-model.c (_XOPEN_SOURCE): #define this to 500, not
- nothing. Also, move this bit after the other #includes to
- prevent potential messiness.
-
-2000-12-13 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (ensure_mandatory_properties): Even
- though icaltime_from_timet() now properly ignores the is_utc
- argument since time_t values *are* in UTC by definition, we were
- passing FALSE for that argument's value in a bunch of places. So
- although it is ignored, changed them to TRUE for consistency.
- Hopefully newer versions of libical will remove that argument
- entirely since it does not make sense to speak of non-absolute
- time_t values.
-
- * cal-util/cal-recur.c (cal_recur_set_rule_end_date): Likewise.
-
- * conduits/calendar/calendar-conduit.c (comp_from_remote_record): Likewise.
-
- * conduits/todo/todo-conduit.c (comp_from_remote_record): Likewise.
-
- * gui/dialogs/task-editor.c (dialog_to_comp_object): Likewise.
-
- * gui/e-day-view.c (e_day_view_on_new_appointment): Likewise.
- (e_day_view_on_delete_occurrence): Likewise.
- (e_day_view_on_unrecur_appointment): Likewise.
- (e_day_view_on_unrecur_appointment): Likewise.
- (e_day_view_finish_long_event_resize): Likewise.
- (e_day_view_finish_resize): Likewise.
- (e_day_view_key_press): Likewise.
- (e_day_view_on_top_canvas_drag_data_received): Likewise.
- (e_day_view_on_main_canvas_drag_data_received): Likewise.
-
- * gui/e-week-view.c (e_week_view_key_press): Likewise.
- (e_week_view_on_new_appointment): Likewise.
- (e_week_view_on_delete_occurrence): Likewise.
- (e_week_view_on_unrecur_appointment): Likewise.
-
- * gui/event-editor.c (simple_recur_to_comp_object): Likewise.
- (recur_to_comp_object): Likewise.
- (dialog_to_comp_object): Likewise.
-
- * gui/gnome-cal.c (gnome_calendar_new_appointment): Likewise.
-
-2000-12-13 Christopher James Lahey <clahey@helixcode.com>
-
- * cal-util/cal-recur.c: #if 0ed cal_obj_date_only_compare_func.
- (cal_object_get_rdate_end): Changed this function to get rid of a
- possible uninitialized error on the rdate function.
-
- * gui/calendar-model.c: Fixed some warnings involving the #define
- _XOPEN_SOURCE lines here.
-
- * gui/component-factory.c: #ifdef WANT_THE_EXECUTIVE_SUMMARYed out
- the summary_factory object since it's unused if
- WANT_THE_EXCUTIVE_SUMMARY is not defined.
-
- * gui/e-day-view.c: #if 0ed out e_day_view_remove_event_cb.
- (obj_updated_cb): #ifndef NO_WARNINGSed out a #warning.
-
- * gui/e-week-view-event-item.c (e_week_view_event_item_draw): Made
- it so that
-
- * gui/e-week-view.c (obj_updated_cb): #ifndef NO_WARNINGSed out a
- #warning.
-
-2000-12-13 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/Makefile.am: Revert federico's change for now
- because of libtool limitations with ldadding shared libtool
- libs
-
- * conduits/calendar/Makefile.am: ditto
-
-2000-12-12 JP Rosevear <jpr@helixcode.com>
-
- * gui/dialogs/task-editor.c (task_editor_set_todo_object): Use
- set_title_from_comp
- (save_todo_object): ditto
- (set_title_from_comp): Make sure the title is encoded properly (as in
- event-editor)
-
-2000-12-12 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (get_text_list): Constify for new
- libical API.
- (set_text_list): Likewise.
-
- * cal-util/cal-recur.c (cal_recur_get_rule_end_date): Likewise.
- (cal_recur_set_rule_end_date): Likewise.
-
- * gui/e-itip-control.c (find_attendee): Likewise.
- (pstream_load): Likewise.
-
- * gui/gnome-cal.c (released_event_object_cb): Removed unused function.
-
- * gui/dialogs/task-editor.c (status_string_map): Removed unused
- variable.
-
-2000-12-11 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/Makefile.am (test_recur_LDADD): Link to the libical
- shared library.
-
- * cal-client/Makefile.am (client_test_LDADD): Likewise.
-
- * conduits/calendar/Makefile.am (libecalendar_conduit_la_LIBADD):
- Likewise.
-
- * gui/Makefile.am (LINK_FLAGS): Likewise.
-
-2000-12-11 Federico Mena Quintero <federico@helixcode.com>
-
- This is to make things work with libical 0.21helix1 and later.
- Warnings remain because at last libical was constified; will take
- care of those tomorrow.
-
- * cal-util/timeutil.h: #include <ical.h> instead of <icaltypes.h>
-
- * gui/e-itip-control.c: Likewise.
-
- * gui/e-meeting-edit.c: Likewise.
-
- * gui/itip-utils.h: Likewise.
-
- * cal-util/cal-component.c (alarm_uid_from_prop): constify.
- (cal_component_get_status): Updated for new libical API.
- (cal_component_set_status): Likewise.
-
- * gui/calendar-model.c (ensure_task_complete): Removed unused
- status code.
- (ensure_task_not_complete): Update for new status API.
-
- * gui/dialogs/task-editor.c (status_string_to_value): Removed
- function.
- (status_value_to_string): Removed function.
- (status_string_map): Removed variable.
- (fill_widgets): Update for new status API.
- (dialog_to_comp_object): Likewise.
-
-2000-12-11 Damon Chaplin <damon@helixcode.com>
-
- * cal-util/cal-recur.c (generate_instances_for_chunk): updated the
- tests on the start & end time just before calling the callback. It
- was skipping occurrences that started before the required interval's
- start time, which was wrong. We want all occurrences that intersect
- the interval.
- (cal_obj_time_weekday): removed the CalRecurrence* argument, since it
- isn't needed.
-
-2000-12-11 Damon Chaplin <damon@helixcode.com>
-
- * gui/event-editor.c: added changed flags and added calls to a new
- function event_editor_set_changed() to set & reset this flag.
- Added prompt_to_save_changed() which is called when the user
- selects File/Close or the window's close button.
- Fixed the 'All day event' toggle button.
- Made the 'Alarm' page sensitive as appropriate when filling widgets.
- (Though note that the alarm widgets are not being set yet.)
-
- * gui/dialogs/task-editor.c: added changed flag as above.
-
- * gui/event-editor-dialog.glade: used good names for all the
- classification radio buttons so we can access them in the code.
-
- * gui/event-editor.c (init_widgets): use the "show week numbers" config
- option in the recurrence preview calendar.
-
- * gui/e-day-view.c (e_day_view_update_event_label): use 9:00 instead
- of 09:00 in the main view, as we do everywhere else now. It means the
- times won't line up, but they are easier to read which I think is
- better.
- Added support for Page Up/Down, though I think it should move the
- selection rather than just scroll the canvas.
-
- * cal-util/cal-recur.c (generate_instances_for_chunk): removed the
- end parameter since we should be using the chunk end time now.
- Added single_rule parameter for when we are generating the
- occurrences of a single RRULE, in which case the event's start date is
- not included in the occurrences output (unless it results from the
- RRULE expansion). Both of these fix problems when using COUNT.
-
- * gui/gnome-cal.c (gnome_calendar_on_date_navigator_selection_changed):
- fixed bug when checking if the new start day starts on the week start
- day. If you select a complete week it should now show the Week view.
-
-2000-12-08 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (dialog_to_comp_object): Free the strings we
- get from the editables.
-
- * gui/dialogs/task-editor.c (dialog_to_comp_object): Likewise.
- This sucks; this code should be shared between the two dialogs.
-
-2000-12-08 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (fill_widgets): Free the dates we get from
- the component.
-
-2000-12-08 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-calendar-table.c (e_calendar_table_init): Attach signal
- handlers to the e_scrolled_table's etable rather than to the
- e_scrolled_table directly
- (e_calendar_table_on_double_click): This signal provides more
- params now
-
-2000-12-07 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/e-calendar-table.c: Got rid of code referencing the
- ETableScrolled proxy functions.
-
-2000-12-07 JP Rosevear <jpr@helixcode.com>
-
- * conduits/calendar/calendar-conduit.c (post_sync): Ugly hack for syncing
- until pcs can be altered (longer term)
-
- * conduits/todo/todo-conduit.c (post_sync): ditto
-
-2000-12-07 Chris Toshok <toshok@helixcode.com>
-
- * cal-client/Makefile.am (client_test_LDADD): add
- EXTRA_GNOME_LIBS.
-
-2000-12-07 JP Rosevear <jpr@helixcode.com>
-
- * pcs/cal-backend.c (cal_backend_compute_changes_foreach_key): Create
- an empty cal component if the object has been deleted.
-
- * idl/evolution-calendar.idl: Bit shift the change type constants
- properly
-
-2000-12-07 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-client/cal-client.c (cal_client_generate_instances): Unref
- the component from the objects list; it got referenced as many
- times as appropriate for the instances list.
-
-2000-12-06 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (file_delete_cb): Confirm before deleting the
- event.
-
-2000-12-06 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-week-view.c (e_week_view_init): unref the pixbuf when
- finished with it
-
-2000-12-06 Federico Mena Quintero <federico@helixcode.com>
-
- Fixes bug #920.
-
- * gui/e-calendar-table.c (delete_component): New function.
- (e_calendar_table_on_delete_task): Use delete_component().
- (e_calendar_table_on_key_press): Likewise. Also, mark the event
- as handled.
-
- * gui/calendar-model.c (calendar_model_get_component): Renamed
- function from calendar_model_get_cal_object().
- (calendar_model_delete_task): Removed function.
-
- * gui/dialogs/delete-comp.[ch]: New files with the dialog for
- deleting a calendar component.
-
- * gui/e-day-view.c (e_day_view_on_delete_appointment): Confirm
- before actually deleting the appointment.
-
- * gui/e-week-view.c (e_week_view_on_delete_appointment): Likewise.
-
- * gui/dialogs/Makefile.am (libcal_dialogs_a_SOURCES): Added
- delete-comp.[ch] to the list of sources.
-
- * cal-util/cal-component.c (cal_component_destroy): Free the alarm
- UID hash.
-
-2000-12-06 JP Rosevear <jpr@helixcode.com>
-
- * pcs/cal.c (build_change_seq): kill
- (Cal_get_changes): return the corba sequence directly
-
- * pcs/cal-backend.h: update prototype
-
- * pcs/cal-backend.c (cal_backend_compute_changes_foreach_key): Build
- the corba struct rather than the old calobjchange thing
- (cal_backend_compute_changes): ditto. build and return the actual
- corba sequence rather than the list of calobjchanges
- (cal_backend_get_changes): return the corba sequence
-
- * cal-util/cal-util.h: Remove CalObjChange cruft
-
- * cal-util/cal-util.c (cal_obj_change_list_free): Kill
-
-2000-12-06 JP Rosevear <jpr@helixcode.com>
-
- * cal-util/cal-util.c:
-
- * conduits/calendar/calendar-conduit.c (map_name): Update so as not to conflict
- with calendar
- (next_changed_item): update to use CalClientChange instead of CalObjChange
- (compute_status): ditto
- (pre_sync): ditto
- (for_each_modified): since we now have the cal component we can call
- local_record_from_comp directly
-
- * conduits/todo/todo-conduit.c: same as above
-
- * pcs/cal-backend.c: Remove much logging cruft
- (cal_backend_compute_changes): Calculate the changes based on the
- hashed database
- (cal_backend_get_changes): call cal_backend_compute_changes
- (cal_backend_compute_changes_foreach_key): hash callback for
- calculating deletions
-
- * pcs/cal-backend.h: update protype, remove logging cruft from
- object
-
- * pcs/cal.c (build_change_seq): dup the calobj rather than the uid
- now
- (Cal_get_changes): rename from Cal_get_changed_uids
- (cal_get_epv): reflect name change in epv
-
- * cal-util/cal-util.c (cal_obj_change_list_free): update assertion
-
- * cal-util/cal-util.h: CalObjChange now returns the entire ical
- component, update the change types. This should all go away shortly
-
- * idl/evolution-calendar.idl: getChangedUIds -> getChanges.
- CalObjChange now contains the calobj rather than the uid, update
- the change types
-
- * cal-client/cal-client.c (cal_client_get_changes): rename from
- cal_client_get_changed_uids to make idl and addressbook
-
- * cal-client/cal-client.h: Update prototype
-
- * cal-client/cal-client.c (build_change_list): Build a list of
- CalClientChange instead of CalObjChange
-
- * cal-client/cal-client-types.c (cal_client_change_list_free): Free
- a glist of CalClientChanges
-
- * cal-client/cal-client-types.h: New file. Declarations for
- CalClientChange.
-
- * cal-client/Makefile.am: Build new files
-
-2000-12-06 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/Makefile.am: Fix my build stupidty READ THE MACRO
-
- * conduits/calendar/Makefile.am: ditto
-
-2000-12-04 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-day-view-time-item.c (e_day_view_time_item_get_column_width):
- Initialize max_large_digit_width to 0 to prevent crazy sizing issues.
-
-2000-12-04 Dan Winship <danw@helixcode.com>
-
- * gui/e-itip-control.c: Remove mysterious #include inserted by
- mmeeks to break the build.
-
-2000-12-01 Federico Mena Quintero <federico@helixcode.com>
-
- Fixes bug #918.
-
- * gui/weekday-picker.c (WeekdayPickerPrivate): Added a field for a
- set of blocked days.
- (weekday_picker_set_blocked_days): New function to configure a set
- of days that cannot be modified by the user.
- (weekday_picker_get_blocked_days): Query function for the above.
- (day_event_cb): Block the appropriate days from being modified.
-
- * gui/event-editor.c (get_start_weekday_mask): New function to
- compute a day mask for the start day of a calendar component.
- (set_recur_special_defaults): New function to set sane defaults
- for the recurrence special widgets.
- (fill_recurrence_widgets): Use set_recur_special_defaults().
- (make_recur_weekly_special): Block the appropriate days.
-
-2000-12-01 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/control-factory.c (set_prop): Removed debugging message.
- (control_factory_init): Ditto.
-
- * gui/calendar-commands.c (calendar_set_uri): Ditto.
-
- * gui/main.c (main): Ditto.
-
- * gui/event-editor.c (set_title_from_comp): New function to
- generate a title and convert it from UTF8 before setting it on the
- window.
- (save_event_object): Uset set_title_from_comp().
- (event_editor_set_event_object): Likewise.
-
-2000-11-30 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.c: Debug message cleanups
- (comp_from_remote_record): Properly set the ical description field
-
- * conduits/calendar/calendar-conduit.c (is_empty_time): New utility
- functions that look for all 0's in a struct tm
- (comp_from_remote_record): use above
- (local_record_from_comp): Correctly set the repeatForever value so
- that we repeat forever instead of a really long time
- (comp_from_remote_record): Only set the cal component recurrence
- until field when repeatForever is 0
-
-2000-11-30 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-itip-control.c: fixed a bug that caused the calendar to
- segfault when the iTip control was destroyed.
-
-2000-11-30 JP Rosevear <jpr@helixcode.com>
-
- * conduits/calendar/calendar-conduit.c (local_record_from_comp): Empty
- by_day entries are no longer indicated by ICAL_RECURRENCE_ARRAY_MAX not
- SHRT_MAX. Calculate weekly and monthly by date recurrences properly
- (get_pilot_day): Convert ical day to corresponding integer for pilot day
-
-2000-11-30 JP Rosevear <jpr@helixcode.com>
-
- * conduits/calendar/calendar-conduit.c: Debug message cleanups
- (get_ical_day): Fix off-by-one error which affected weekly occurences.
- (comp_from_remote_record): Monthly by day and by date were reversed
- (nth_weekday): function taken from event-editor.c that encodes BYDAY
- values - this needs to be in libical really.
- (comp_from_remote_record): Don't set the description if the pilot note
- is null. Rejig so that we don't have to free objects.
-
-2000-11-28 Federico Mena Quintero <federico@helixcode.com>
-
- Upgrade of the alarm framework. We now access alarms by a unique
- identifier. This UID is added as an extension property to alarm
- subcomponents when their parent components are scanned by
- CalComponent.
-
- * cal-util/cal-component.c (CalComponentPrivate): Added a hash
- table of alarm UIDs -> alarm properties.
- (cal_component_init): Initialize priv->alarm_uid_hash.
- (free_icalcomponent): Free the elements in the
- priv->alarm_uid_hash.
- (scan_alarm): New function to add scan an alarm subcomponent and
- ensure that it has an alarm UID extension property so that we can
- add it to our mapping table.
- (cal_component_get_first_alarm): Removed function.
- (cal_component_get_next_alarm): Removed function.
- (cal_component_get_alarm_uids): New function.
- (cal_component_get_alarm): New function.
-
-2000-11-28 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.c (local_record_to_pilot_record): Return
- a struct rather than a pointer to a struct
- (compare): local_record_to_pilot_record now returns a struct
- (prepare): ditto
- (free_prepare): remove as per gnome-pilot changes
- (conduit_get_gpilot_conduit): don't listen for free_prepare signal
-
- * conduits/calendar/calendar-conduit.c: Same as above
-
-2000-11-28 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/e-calendar-table.c (E_CALENDAR_TABLE_SPEC): Reformatted the
- table spec to make it easier to read.
-
- * gui/tag-calendar.c: Oops, Damon wrote this, not me. Fixed the
- Authors line.
-
-2000-11-28 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-day-view*.[hc]:
- * gui/e-week-view*.[hc]: finished 12-hour support and tried to tidy
- up & comment the drawing code in places. Also fixed a couple of bugs I
- spotted. All the options on the 'Calendar' page should now work.
-
-2000-11-28 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-meeting-edit.c: removed some debugging code that I had,
- which might have caused problems.
-
-2000-11-27 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/calendar-model.c: added a preliminary change to have
- Assigned To-Do items have a corresponding icon.
-
-2000-11-27 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.c (free_prepare): Ditto
-
- * conduits/calendar/calendar-conduit.c (free_prepare): Adjust
- free_prepare to the correct signal parameters. Don't actually
- do anything - there is a semantic discrepancy that needs to be
- resolved.
-
-2000-11-26 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-day-view.c (e_day_view_set_days_shown): == instead of =.
-
-2000-11-26 Damon Chaplin <damon@helixcode.com>
-
- * gui/gnome-cal.c: added more support for config settings.
-
- * gui/e-week-view.[hc]:
- * gui/e-day-view.[hc]: added support for setting - show event end
- times, week start day and 12-hour format (unfinished).
-
- * gui/e-day-view-time-item.c: started 12-hour support.
-
- * gui/tag-calendar.c (prepare_tag): use end_day + 1 since we want to
- include the last day.
-
- * gui/event-editor.c (set_all_day): minor change when turning all_day
- off - set the event end to one hour after the event start if it is on
- or before the start time. Also added more comments to make it a bit
- clearer.
-
- * cal-util/cal-recur.c (cal_obj_time_add_days): use a gint for day
- rather than a guint since we now support -ve days.
- Also fixed bug with weekly recurrences.
-
- * gui/dialogs/task-editor.c (task_editor_create_date_edit): use
- config settings.
-
- * gui/dialogs/cal-prefs-dialog.c (cal_prefs_dialog_update_config):
- updated EDateEdit calls.
-
-2000-11-24 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/e-calendar-table.c (e_calendar_table_init): Unref the ETable
- extras.
-
-2000-11-24 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (free_icalcomponent): DOH, fixed
- reversed test for the presence of the icalcomp's parent. This was
- causing memory leaks in the Wombat and elsewhere.
-
- * pcs/cal-backend.c (cal_backend_set_node_timet): Plug leak.
-
-2000-11-24 Federico Mena Quintero <federico@helixcode.com>
-
- * pcs/cal-backend-file.c (scan_vcalendar): Use the new libical
- external iterators (icalcomponent_begin_component() and friends);
- the internal iterators are deprecated.
-
- * cal-util/test-recur.c (generate_occurrences): Likewise.
-
- * gui/e-itip-control.c (pstream_load): Likewise.
-
- * gui/e-meeting-edit.c (e_meeting_edit): Likewise.
-
- * pcs/cal-backend.c (cal_backend_log_entry): Plug leak.
- (cal_backend_log_sync): Free the entry->uid.
-
- * util/icalendar-save.[ch]:
- * util/icalendar-test.c:
- * util/icalendar.[ch]: Removed obsolete files.
-
-2000-11-21 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/task.xpm: Remove the check because it makes it look like the
- task is already completed. This fixes bug #819.
-
- * gui/task-recurring.xpm: Make it use a prettier overlaid icon.
-
- * gui/task-*.xpm: Made the things look like little spiral-bound
- notebooks.
-
- * gui/e-calendar-table.c (E_CALENDAR_TABLE_SPEC): Make the default
- column order be icon/completed/summary. You may need to erase
- your ~/evolution/config/TaskPad for this to appear.
-
-2000-11-21 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/calendar-model.c (calendar_model_is_cell_editable): The icon
- column is not editable!
-
- * gui/calendar-commands.c (todo_properties_changed): Removed.
- (time_format_changed): Removed.
- (colors_changed): Removed.
-
- * gui/calendar-commands.h:
- * gui/prop.c (prop_apply):
- * gui/calendar-commands.c (init_calendar): Removed the old to-do
- list crap.
-
- * gui/gncal-todo.[ch]: Removed obsolete files.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Removed gncal-todo.[ch].
-
- * gui/gnome-cal.c (gnome_calendar_todo_properties_changed): Removed.
- (gnome_calendar_time_format_changed): Removed.
- (gnome_calendar_colors_changed): Removed.
-
-2000-11-21 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-itip-control.c: fixed the stupid Bonobo widget size
- allocation bug that had been vexing me.
-
- * gui/e-itip-control.glade: I removed some hacks that were
- necessary for said size bug.
-
-2000-11-16 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-itip-control.c, gui/e-meeting-edit.c: added cancellation
- code to our program; people can cancel meetings, which is the best
- thing to do for most meetings.
-
-2000-11-13 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-itip-control.c: made the REPLY code actually work.
-
-2000-11-13 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/itip-utils.[ch]: I created this file to store some commonly used enumeration to
- string mappings and functions.
-
- * gui/Makefile.am: this was changed to reflect the addition of the above file.
-
- * gui/e-itip-control.c: added code to take action on a REPLY message.
-
- * gui/e-meeting-edit.c: bug fixes.
-
-2000-11-12 Federico Mena Quintero <federico@helixcode.com>
-
- OK, bugzilla bug #829 is fixed and that does not redeem me from
- extreme procrastination. Wheeeeeeeeeeeeeeee!
-
- * gui/event-editor-dialog.c: Changed the "Rule view" label to
- "Preview"
-
-2000-11-12 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (make_recur_ending_count_special): Misspelled
- "occurrences".
- (fill_recurrence_widgets): Sensitize the "Custom recurrence" radio
- button as appropriate.
- (sensitize_recur_widgets): Resurrected the recurrence custom
- warning label.
- (get_widgets): Load the recurrence custom warning bin.
-
- * gui/event-editor-dialog.glade: Add an empty alignment for the
- recurrence custom warning label.
-
-2000-11-12 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (recur_preview_date_range_changed_cb): New
- function; re-tag the calendar when its date range changes.
- (init_widgets): Connect to "date_range_changed" on the recurrence
- preview calendar.
- (make_recur_weekly_special): Connect to "changed" on the weekday
- picker.
- (recur_weekday_picker_changed_cb): New function; re-tag the calendar.
- (month_day_menu_selection_done_cb): Re-tag the calendar.
- (recur_month_index_value_changed_cb): Likewise.
- (recur_ending_until_changed_cb): Likewise.
- (recur_ending_count_value_changed_cb): Likewise.
- (make_recur_monthly_special): Connect to "value_changed" on the
- adjustment of the month index.
- (make_recur_ending_until_special): Connect to "changed" on the
- ending-until date picker.
- (make_recur_ending_count_special): Connect to "value_changed" on
- the ending-count adjustment.
- (init_widgets): Set to zero the maximum number of selectable days
- in the recurrence preview calendar. Set the week_start_day from
- the calendar's configuration.
-
-2000-11-12 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (clear_widgets): Block the signals as appropriate.
- (fill_ending_date): Ditto.
- (fill_recurrence_widgets): Ditto.
- (recurrence_type_toggled_cb): Only sensitize the widgets and
- preview the recurrence if the toggle button is active.
-
-2000-11-12 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (recur_to_comp_object): Clear the rdate and
- exrule lists from the component if we are setting a simple
- recurrence.
- (recur_to_comp_object): Set the exdate list here instead of in
- dialog_to_comp_object().
- (preview_recur): New function to tag the recurrence preview
- calendar based on the information from the dialog box.
- (fill_exception_widgets): Fill the exception widgets here; moved
- over from fill_widgets().
- (fill_recurrence_widgets): Call preview_recur(). Also, call
- fill_exception_widgets() first of all.
- (recurrence_type_toggled_cb): Call preview_recur().
- (recur_interval_selection_done_cb): Likewise.
- (recur_ending_selection_done_cb): Likewise.
- (recurrence_exception_add_cb): Likewise.
- (recurrence_exception_modify_cb): Likewise.
- (recurrence_exception_delete_cb): Likewise.
- (date_changed_cb): Likewise.
- (recur_interval_value_changed_cb): Likewise, new function.
-
- * gui/tag-calendar.[ch]: New files with utilities for tagging
- calendars. mark.[ch] should go away some day.
-
- * gui/tag-calendar.c (tag_calendar): Moved over from
- gnome_calendar_tag_calendar(). Take in a CalClient instead of a
- GnomeCalendar. Added API docs.
- (tag_calendar_by_comp): New function to tag a calendar based on a
- single calendar component instead of a whole client.
-
- * gui/gnome-cal.c (initial_load): Use tag_calendar_by_client().
- (obj_updated_cb): Likewise.
- (obj_removed_cb): Likewise.
- (gnome_calendar_on_date_navigator_date_range_changed): Likewise.
- (editor_closed_cb): Free the closure.
- (destroy_editor_cb): Renamed from free_uid(). Do not free the
- UID; just unref the event editor. Our destroy handler to it will
- free things properly. This will also cause the corresponding
- calendar client to be unrefed.
- (editor_closed_cb): Use a flag on the GnomeCalendar to decide
- whether to remove the editor from the hash table. This is sort of
- icky.
-
- * gui/calendar-model.c (obj_updated_cb): If the object is new, we
- have to use e_table_model_row_inserted(), not row_changed().
- Thanks to JP Rosevear for reporting this.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Added
- tag-calendar.[ch] to the list of sources.
-
-2000-11-11 Matt Bissiri <bissiri@eecs.umich.edu>
-
- * gui/evolution-calendar.oafinfo:
- Update the remaining "IDL:Evolution*" to "IDL:GNOME/Evolution*"
- to sync up with yesterday's IDL re-scoping.
-
-2000-11-10 Michael Meeks <michael@helixcode.com>
-
- * gui/Makefile.am ($(IDL_GENERATED)): sort include order.
-
- * pcs/Makefile.am (idl_flags): ditto.
-
-2000-11-10 JP Rosevear <jpr@helixcode.com>
-
- * conduits/calendar/calendar-conduit.c (for_each_modified): Inc the
- iterator before finding the next changed item.
-
- * conduits/todo/todo-conduit.c (for_each_modified): ditto
-
-2000-11-09 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-itip-control.c: I wrote the code so that recipients of meeting requests
- can reply appropriately.
-
-2000-11-09 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-meeting-edit.c: fixed a bug that would make the calendar segfault
- if the meeting editor were called up twice without first saving the
- component.
-
-2000-11-08 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-itip-control.c, gui/e-itip-control.glade: updated the GUI
- to allow the user to add PUBLISHed events to his calendar, and created
- unworking buttons for meeting requests.
-
-2000-11-08 Federico Mena Quintero <federico@helixcode.com>
-
- These changes fix bugzilla bugs #874 and #875.
-
- * cal-util/cal-component.c (cal_component_get_exdate_list): Return
- a list of CalComponentDateTime instead of simple struct
- icaltimetype objects. Exception date properties *can* contain a
- timezone parameter, so we need to include those if they are
- present.
- (cal_component_set_exdate_list): On the input, handle a list of
- CalComponentDateTime structures. On the internals, handle a list
- of struct datetime instead of plain properties.
- (cal_component_free_exdate_list): Handle a list of
- CalComponentDateTime structures.
- (scan_exdate): Create a list of struct datetime structures.
- (free_icalcomponent): Free the exdate_list properly.
-
- * cal-util/cal-recur.c (generate_instances_for_chunk): Use the
- proper types for exception dates.
-
- * gui/comp-util.h:
- * gui/comp-util.c: New files with utilities for manipulating
- calendar component objects.
- (cal_comp_util_add_exdate): New function.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Added
- comp-util.[ch] to the list of sources.
-
- * gui/e-day-view.c (add_exdate): New convenience function to add
- an exception date to a calendar component.
- (e_day_view_on_unrecur_appointment): Use cal_comp_util_add_exdate().
- (e_day_view_on_delete_occurrence): Likewise.
-
- * gui/e-week-view.c (e_week_view_on_delete_occurrence): Likewise.
- (e_week_view_on_unrecur_appointment): Likewise.
-
- * gui/event-editor.c (nth_weekday): Be paranoid about valid
- position values.
- (fill_widgets): Use the proper types for exdates.
- (dialog_to_comp_object): Likewise.
-
-2000-11-08 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (adjust_day_index_spin): Adjust the valid
- range of the month index spin button depending on the selection of
- the day/weekday menu.
-
-2000-11-07 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-itip-control.c, gui/e-itip-control.glade: changed the GUI,
- and added some extra feedback for the user.
-
-2000-11-07 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/weekday-picker.h (WeekdayPickerClass): Added a "changed"
- signal to notify of changes to the set of selected days.
-
- * gui/weekday-picker.c (weekday_picker_class_init): Create the
- "changed" signal.
- (weekday_picker_set_days): Emit the "changed" signal.
-
-2000-11-06 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-itip-control.c, gui/e-itip-control.glade: changed to GUI to
- accomodate dynamically generated buttons, which will be tailored to
- the type of iTip message that is incoming.
-
- * gui/e-meeting-dialog.glade gui/e-meeting-edit.c: added a new button
- to publish events, in addition to requesting meetings.
-
-2000-11-05 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor-dialog.glade: Removed the old recurrence page.
- Wheeeeeeeeee!
-
- * gui/event-editor.c (make_recurrence_special): Clear the monthly
- widgets.
- (make_recur_monthly_special): Create the monthly widgets.
- (clear_widgets): Clear the monthly values.
- (simple_recur_to_comp_object): Fill in the monthly values.
- (fill_recurrence_widgets): Fill in the monthly and yearly source
- values.
- (dialog_to_comp_object): Take in a CalComponent instead of using
- the event editor's directly.
- (recur_to_comp_object): Likewise.
- (simple_recur_to_comp_object): Likewise.
- (EventEditorPrivate): Removed the widgets from the old recurrence
- page.
- (get_widgets): Likewise.
- (clear_widgets): Likewise.
- (dialog_to_comp_object): If the description or summary are empty,
- just clear the description list or summary property, respectively,
- instead of saving empty ones.
- (simple_recur_to_comp_object): Set the week_start field.
-
- * gui/main.c: Fix includes, and add calendar-config.h.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): The glade messages
- file should not be in SOURCES.
-
-2000-11-05 Christopher James Lahey <clahey@helixcode.com>
-
- * doc/.cvsignore, doc/C/.cvsignore: Removed unnecessary .cvsignore
- files.
-
-2000-11-03 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (check_all_day): Block signals from the
- toggle button.
- (date_changed_cb): Merged check_dates() and check_times() into
- this function; provide better behavior as well.
- (check_dates): Removed function.
- (check_times): Removed function.
- (init_widgets): Connect to the "changed" signal on the start_time
- and end_time widgets.
- (check_all_day): Use a better test.
-
- * gui/Makefile.am: Clean the idl-generated sources properly.
- * cal-client/Makefile.am: Likewise.
-
-2000-11-03 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-itip-control.c: added some checks for the type of an
- incoming iCal component before passing it off to the CalComponent
- routines.
-
-2000-11-02 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/dialogs/task-editor.c (init_widgets): The date editor's
- signal is now "changed".
- (completed_changed): Renamed callback to reflect the name of the
- signal.
-
-2000-11-01 Gediminas Paulauskas <menesis@delfi.lt>
-
- * gui/main.c: (main): added call to bindtextdomain and textdomain, so
- all calendar gui shows up localized.
-
-2000-10-31 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (count_by_xxx): Hmmm. SHRT_MAX changed to
- ICAL_RECURRENCE_ARRAY_MAX in libical. Deal with it.
- (fill_recurrence_widgets): Likewise.
- (simple_recur_to_comp_object): Fixed incorrect assertion. The
- weekday picker is not the immediate child of the recurrence
- special container.
- (fill_recurrence_widgets): Call make_recurrence_special() after
- setting the recurrence period type.
- (fill_ending_date): Call make_recurrence_ending_special(). This
- would be so much nicer if GTK+ were model/view all over.
-
-2000-10-31 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.h: Remove add/del/mod hashes and
- add changed_hash.
-
- * conduits/calendar/calendar-conduit.h: ditto
-
- * conduits/todo/todo-conduit.c (next_changed_item): Utility function
- to get the next "really" changed item (changed status can be cleared now)
- (compute_status): Compute status based on changed_hash
- (pre_sync): Fill changed_hash and counts adds/mods/dels
- (set_status_cleared): New callback handler - avoid double syncing
- (for_each_modified): Use next_changed_item to iterate
- (add_archive_record): kill
- (delete_archive_record): kill
- (archive_record): New callback handler - mark/unmark archive status
- (conduit_get_gpilot_conduit): Adjust signal connects
-
- * conduits/calendar/calendar-conduit.c: ditto
-
-2000-10-30 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (sensitize_recur_widgets): New function. We
- split it from the radio callback so that we can call it explicitly
- from fill_recurrence_widgets().
- (fill_recurrence_widgets): Call sensitize_recur_widgets() as
- appropriate.
-
-2000-10-30 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/calendar-commands.c (new_calendar): Removed the geometry and
- hidden arguments. This code is ancient.
- (all_calendars): Made static. This sucks; configuration should be
- notification-based instead of "let's iterate through all open
- calendars".
- (active_calendars): Removed. Functions can check the length of
- the all_calendars list if they are interested.
-
- * gui/event-editor.c (sync_entries): Do not take in an extra data
- pointer.
- (summary_changed_cb): Use a single call back to sync both entries.
- (sync_date_edits): New function to sync two EDateEdit widgets.
- (init_widgets): Connect the general and recurrence starting date
- widgets.
-
-2000-10-27 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (sync_entries): New function.
- (general_summary_changed_cb): Sync the general summary to the
- recurrence summary widget.
- (recurrence_summary_changed_cb): Vice-versa.
- (init_widgets): Hook to the summaries.
-
- * event-editor-dialog.glade: Do not expand/fill the start and end
- date so that the "all day event" button is not pushed all the way
- to the right.
- Decrease the spacing between the recurrence sentence widgets.
- Remove a spurious empty label that was lurking around the
- recurrence widgets.
- Make the alarm widgets expand the right way.
- Delete old recurrence widgets.
-
-2000-10-27 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (init_widgets): Connect to the recurrence
- ending menu.
- (recur_ending_selection_done_cb): Implemented.
- (make_recurrence_ending_special): Implemented.
- (make_recur_ending_until_special): Implemented.
- (fill_ending_date): Implemented.
- (make_recur_ending_count_special): Implemented.
- (simple_recur_to_comp_object): Fill in the ending date.
- (clear_widgets): Clear the recurrence ending widgets.
-
- * gui/event-editor-dialog.glade: Moved the recurrence type radio
- buttons to a single hbox to save space.
- Fixed the lower value of the recurrence interval spin button.
- Removed the stale widgets from the recurrence ending date part.
-
-2000-10-27 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-meeting-edit.c: fixed problems in which I allocated CORBA
- strings of 0 length, but then didn't NULL terminate them.
-
-2000-10-27 <jpr@helixcode.com>
-
- * conduits/calendar/calendar-conduit.c (check_for_slow_setting):
- Check boundary case of fast sync
-
- * conduits/todo/todo-conduit.c (check_for_slow_setting): ditto
-
-2000-10-27 <jpr@helixcode.com>
-
- * conduits/calendar/calendar-conduit.c (add_archive_record): Remove
- invalid test.
- (local_record_from_comp): If the event is all day, mark it as timeless
- (comp_from_remote_record): Timeless events take up all day
-
- * conduits/todo/todo-conduit.c (add_archive_record): ditto
-
-2000-10-27 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.c (add_archive_record): Take proper
- number of parameters
-
- * conduits/calendar/calendar-conduit.c (add_archive_record): ditto
-
-2000-10-26 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (EventEditorPrivate): Integrate Anna's new
- recurrence page. Replace the old widget pointers with the new
- ones. Modified the relevant functions accordingly and added
- plenty of new ones.
- (event_editor_get_cal_client): New function.
- (fill_recurrence_widgets): This is *THE* tricky function for you.
- It has to discriminate whether we get a recurrence we support for
- editing or not. And this is not trivial. Sigh.
- (event_editor_update_widgets): Added preconditions and API docs.
-
- * event-editor-dialog.glade: Fixed all the spacings/
- paddings/packing options so that the widgets will look right if
- the dialog box is resized. Also fixes some misaligned widgets.
-
- * cal-util/cal-component.c (cal_component_set_rdate_list): Removed
- incorrect assertion.
-
-2000-10-26 Michael Meeks <michael@helixcode.com>
-
- * pcs/cal-factory.c (str_tolower): unsigned chars to isalpha
-
- * cal-util/calobj.c (weekdaylist, weekdaynum): ditto.
-
-2000-10-25 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-meeting-edit.c: brushed up some code to deal with
- the organizer entry, and solidified the CORBA memory-freeing
- issues.
-
-2000-10-25 Jesse Pavel <jpavel@helixcode.com>
-
- * removed the Evolution-Composer generated files, due
- to a tip on how we do things.
-
-2000-10-25 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-meeting-edit.c: I fixed a bunch of memory-deallocation
- bugs, and finished the initial integration with the mailer.
-
- * gui/Makefile.am: made the build us the Evolution-Composer.idl
- from the composer directory.
-
-2000-10-25 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/Evolution-Composer.idl: added this from the composer IDL sources
-
- * gui/Makefile.am: changed to reflect the above IDL and the associated
- orbit-idl generated files.
-
- * gui/Evolution-Composer.h,
- gui/Evolution-Composer-common.c,
- gui/Evolution-Composer-stubs.c,
- gui/Evolution-Composer-skels.c:
- the generated files, as per the above description.
-
- * gui/e-meeting-edit.c: more work towards mailer integration.
-
-2000-10-24 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-meeting-edit.c: I've added code to interact with the mailer's
- CORBA interfaces, though it's not yet working.
-
-2000-10-23 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.c (local_record_from_comp): Use
- new e-pilot-map lookup function
- (match): ditto
-
- * conduits/calendar/calendar-conduit.c (local_record_from_comp): Use
- new e-pilot-map lookup function
- (match): ditto
-
-2000-10-23 Dan Winship <danw@helixcode.com>
-
- * pcs/Makefile.am (INCLUDES):
- * gui/dialogs/Makefile.am (INCLUDES):
- * gui/Makefile.am (INCLUDES):
- * cal-util/Makefile.am (INCLUDES):
- * cal-client/Makefile.am (INCLUDES): Update GNOMELOCALEDIR.
-
-2000-10-23 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.h: Use new libeconduit calls and
- abstraction
-
- * conduits/calendar/calendar-conduit.c: ditto
-
- * conduits/calendar/calendar-conduit.h: ditto
-
- * conduits/todo/todo-conduit.c: ditto
-
- * conduits/calendar/Makefile.am: Add libeconduit-static.la
-
- * conduits/calendar/calendar-conduit.c (post_sync): Use e_pilot_map_write
- (pre_sync): Use e_pilot_map_read
-
-2000-10-23 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/Makefile.am: Add libeconduit-static.la
-
- * conduits/todo/todo-conduit.c (post_sync): Use e_pilot_map_write
- (pre_sync): Use e_pilot_map_read
-
-2000-10-21 Damon Chaplin <damon@helixcode.com>
-
- * gui/dialogs/cal-prefs-dialog.c
- (cal_prefs_dialog_use_24_hour_toggled): removed debug message.
-
- * gui/e-calendar-table.c (e_calendar_table_save_state): new function
- to save the state of the table to a given file.
-
- * gui/e-calendar-table.h (struct _ECalendarTable): added etable field
- so we can access it to save the state.
-
- * gui/gnome-cal.c (gnome_calendar_destroy): call
- e_calendar_table_save_state() to save the state of the TaskPad.
- (setup_widgets): load the state of the TaskPad.
-
- * gui/calendar-config.c: added support for the default view.
-
- * gui/gnome-cal.c (gnome_calendar_construct):
- (gnome_calendar_set_view_internal): use/set the default view setting.
-
-2000-10-20 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-meeting-editor.c: added more (working) integration with the
- meeting schedular.
-
-2000-10-20 Jesse Pavel <jpavel@helixcode.com>
-
- * cal-utils/cal-component.c: in set_datetime(), I put an #if 0'd portion
- of the code back into operation, because the icalproperty_remove_parameter()
- function is now implemented.
-
- * gui/e-meeting-editor.c: added more (unworking) integration with the
- meeting schedular.
-
-2000-10-20 JP Rosevear <jpr@helixcode.com>
-
- * pcs/cal-backend.c (cal_backend_destroy): New destroy
- handler to properly stop the timer, sync the log and unref
- the URI.
- (cal_backend_last_client_gone): Just emit the signal,
- clean up work is done in cal_backend_destroy now.
-
- * pcs/cal-backend-file.c (cal_backend_file_load): Unref the
- uri we are replacing NOT the new uri.
-
-2000-10-20 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/Makefile.am: Fix build
-
- * conduits/calendar/Makefile.am: Fix build
-
-2000-10-20 JP Rosevear <jpr@helixcode.com>
-
- * conduits/calendar/calendar-conduit.c (delete_archive_record):
- Don't throw an error
-
- * conduits/todo/todo-conduit.c (delete_archive_record): ditto
-
-2000-10-20 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit-control-applet.c: Add defines
-
- * conduits/todo/todo-conduit-config.h: put #ifdefs around functions
- can't make this a public interface in the usual way as then the
- symbols would be exported
-
- * conduits/todo/todo-conduit.c: Kill warnings. clahey will be
- happy! Add some defines to include only the necessary config functions.
- (conduit_get_gpilot_conduit): Hook up archive signals
-
- * conduits/calendar/calendar-conduit.c: Same as above
-
- * conduits/calendar/calendar-conduit-control-applet.c: ditto
-
- * conduits/calendar/calendar-conduit-config.h: ditto
-
-2000-10-20 Michael Meeks <michael@helixcode.com>
-
- * gui/calendar-commands.h: s/BonoboUIHandler/BonoboUIComponent/
-
- * gui/calendar-commands.c (properties_cmd): ditto.
-
-2000-10-20 Damon Chaplin <damon@helixcode.com>
-
- * gui/calendar-model.c (calendar_model_value_at): use
- cal_component_has_alarms().
-
-2000-10-20 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-calendar-table.c (E_CALENDAR_TABLE_SPEC): added
- _click-to-add-message, though I'm not sure if i18n will work.
-
- * cal-util/cal-recur.c (cal_obj_time_add_hours):
- (cal_obj_time_add_minutes):
- (cal_obj_time_add_seconds): updated to handle -ve args.
-
- * cal-util/timeutil.c (time_add_day): set tm_isdst to -1 before calling
- mktime().
-
- * cal-util/cal-recur.c (generate_instances_for_chunk): don't call the
- callback if the event ends exactly on the interval start time.
-
- * gui/e-week-view.c (e_week_view_reshape_event_span):
- * gui/e-week-view-event-item.c (e_week_view_event_item_draw_icons):
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw_long_event):
- * gui/e-day-view-main-item.c (e_day_view_main_item_draw_day_event):
- * gui/e-day-view.c (e_day_view_reshape_long_event):
- (e_day_view_reshape_day_event): use cal_component_has_alarms().
-
- * cal-util/cal-component.[hc]: added cal_component_has_alarms().
-
-2000-10-16 Damon Chaplin <damon@helixcode.com>
-
- * gui/calendar-config.c (config_read): set default MonthVPanePosition
- to 1 rather than 0, so if you move the hpane you'll see the date
- navigator.
-
-2000-10-19 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/event-editor.[ch]: added a public function which causes the
- event editor to reload its widgets to the associated CalComponent.
-
- * gui/e-meeting-edit.c: added rudimentary support for the phat
- e-meeting-time-selector widget, though it has no effect on the
- component yet.
-
- * gui/Makefile.am: the meeting editor depends on the meeting widget
- library, now.
-
- * gui/e-itip-control.glade: I added another toolbar button that summons
- from the hoary deep the meeting time widget.
-
-2000-10-19 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/Makefile.am: Add `event-editor-dialog.glade.h'.
- (EXTRA_DIST): Add `$(glade_messages)'.
-
-2000-10-19 Michael Meeks <michael@helixcode.com>
-
- * gui/calendar-commands.c (tb_print_cb): remove; redundant.
-
- * gui/event-editor.c (create_menu, create_toolbar): kill.
- (event_editor_destroy): upd.
- (event_editor_construct): update to new UI handler, cast
- priv->general_summary to a widget not an object.
-
-2000-10-18 Michael Meeks <michael@helixcode.com>
-
- * gui/dialogs/task-editor.c (create_menu, create_toolbar): die.
- (debug_xml_cb): add debugging hook.
-
- * gui/dialogs/Makefile.am: add EVOLUTION_DATADIR
-
- * gui/dialogs/task-editor.c (task_editor_construct): upd for new UI.
-
-2000-10-17 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit-control-applet.c: Add defines
-
- * conduits/todo/todo-conduit-config.h: put #ifdefs around functions
- can't make this a public interface in the usual way as then the
- symbols would be exported
-
- * conduits/todo/todo-conduit.c: Kill warnings. clahey will be
- happy! Add some defines to include only the necessary config functions.
- (conduit_get_gpilot_conduit): Hook up archive signals
-
- * conduits/calendar/calendar-conduit.c: Same as above
-
- * conduits/calendar/calendar-conduit-control-applet.c: ditto
-
- * conduits/calendar/calendar-conduit-config.h: ditto
-
-2000-10-16 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-itip-control.c: You can now add incoming iTip
- messages to your calendar store.
-
- * gui/e-itip-control.glade: added a progress bar dialog
- in case the calendar loading takes a long time.
-
-2000-10-16 JP Rosevear <jpr@helixcode.com>
-
- * cal-client/cal-client.h: Remove pilot cruft. All pilot stuff
- is in the conduits now and uses the logging facility.
-
- * pcs/cal-backend-file.c: ditto
-
- * pcs/cal-backend.h: ditto
-
- * pcs/cal-backend.c: ditto
-
- * pcs/cal.c: ditto
-
- * pcs/cal.h: ditto
-
- * idl/evolution-calendar.idl: ditto
-
- * cal-util/cal-component.h: ditto
-
- * cal-util/cal-component.c: ditto
-
- * cal-client/cal-client.c: ditto
-
- * conduits/calendar/calendar-conduit.c (local_record_from_comp):
- Take a stab at storing recurrence stuff on the pilot properly
-
- * pcs/cal-backend.c (cal_backend_update_object): Don't log the
- event until after the update in case its a new item
-
-2000-10-16 Tuomas Kuosmanen <tigert@helixcode.com>
-
- * gui/dayview.xpm, gui/workweekview.xpm, gui/weekview.xpm
- gui/monthview.xpm gui/yearview.xpm: Updated icons, let me know
- if you like these or not, I might work on these some more but
- I wanted to put these versions up anyway to get feedback..
-
-2000-10-15 Dan Winship <danw@helixcode.com>
-
- * gui/Makefile.am: Remove CPPFLAGS def since the -D there was
- already in INCLUDES
-
-2000-10-14 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/evolution-calendar.oafinfo: Added an
- "evolution:shell-component-icon" attribute.
-
-2000-10-12 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-itip-control.{c,glade}: Made the control much more
- relavent to the function at hand.
-
-2000-10-12 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-calendar-table.c (E_CALENDAR_TABLE_SPEC): set the 2 icon
- columns to a min width of 18 and resizable to FALSE.
-
-2000-10-12 Damon Chaplin <damon@helixcode.com>
-
- * gui/calendar-commands.c (calendar_control_activate):
- (update_pixmaps):
- (set_pixmap): set the pixmaps of the toolbar buttons for the views,
- and removed a lot of old unused stuff. We'll use plain buttons for
- the view buttons for now, until Bonobo toolbars support radio buttons.
-
- * gui/gnome-cal.c (gnome_calendar_dayjump): check day_button is not
- NULL before using it.
- (gnome_calendar_update_view_buttons): check button is not NULL.
-
-2000-10-11 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-day-view-time-item.c (e_day_view_time_item_draw): got 12/24
- hour format the wrong way round.
-
-2000-10-12 JP Rosevear <jpr@helixcode.com>
-
- * conduits/calendar/calendar-conduit.c (comp_from_remote_record):
- Store recurrence stuff on the desktop properly
- (get_ical_day): Utility function
-
-2000-10-12 Iain Holmes <iain@helixcode.com>
-
- * gui/component-factory.c: Disable the executive summary.
-
-2000-10-11 JP Rosevear <jpr@helixcode.com>
-
- * pcs/cal-backend.c (cal_backend_log_entry): Take CalObjType
- as a param because its impossible to determine after a delete.
- (cal_backend_remove_object): Calculate CalObjType and pass
- it to cal_backend_log_entry
- (cal_backend_update_object): ditto
-
- * conduits/todo/todo-conduit.c (local_record_from_comp): Kill
- unused variables.
- (add_archive_record): Don't kill the sync if this happens
- (update_record): Kill old function
- (replace_record): New function to handle replace_record signal
- (conduit_get_gpilot_conduit): Listen for replace record signal
- (add_record): Always add a new record, never replace
- (replace_record): Always replace an existing record
-
- * conduits/calendar/calendar-conduit.c: Same as above
-
-2000-10-10 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-itip-control.c: set a default size for the control.
-
-2000-10-10 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/evolution-calendar.oafinfo: Added information about the
- text/calendar MIME type, so that the evolution-calendar is called
- to deal with iMIP attachments.
-
- * gui/e-itip-control.[ch]: These files implement a Bonobo
- control that will eventually deal with iMIP/iTIP messages from
- the mailer. Right now, it's not working.
-
- * gui/e-itip-control.glade: The Glade GUI for the above-mentioned
- control.
-
- * gui/Makefile.am: added references to the files I created.
-
- * gui/main.c: called the initialization function of the Bonobo
- control factory.
-
-2000-10-11 Tuomas Kuosmanen <tigert@helixcode.com>
-
- * gui/task-assigned-to.xpm gui/task-assigned.xpm
- gui/recur.xpm gui/task-recurring.xpm gui/task.xpm:
- New versions of the icons for the tasklist/pad.
-
-2000-10-11 Damon Chaplin <damon@helixcode.com>
-
- * gui/component-factory.c (owner_unset_cb): don't free evolution_dir
- as we need it to save the config settings.
-
-2000-10-11 Damon Chaplin <damon@helixcode.com>
-
- * gui/main.c (main): call calendar_config_write_on_exit() to write
- out some special config settings (as the mail component does).
-
- * gui/calendar-commands.c (properties_cmd): changed to use the new
- preferences dialog.
- (update_all_config_settings): new function to iterate over all the
- calendars and update the config settings.
-
- * gui/dialogs/cal-prefs-dialog.glade: preferences dialog.
-
- * gui/dialogs/cal-prefs-dialog.[hc]: new files for the preferences
- dialog.
-
- * gui/calendar-config.[hc]: new files to handle loading/saving config
- settings.
-
- * cal-util/cal-recur.c: fixed bug in YEARLY when no filters were set,
- plus minor changes.
-
- * cal-util/test-recur.c: updated.
-
- * gui/e-day-view-time-item.c:
- * gui/popup-menu.c: update to #include <gal/widgets/e-gui-utils.h>
-
- * gui/component-factory.c (owner_set_cb): called calendar_config_init.
- (owner_set_cb):
- (owner_unset_cb): updated the prototypes.
-
- * gui/main.c (main): added call to calendar_config_write_on_exit().
-
- * gui/component-factory.h:
- * gui/component-factory.c (owner_set_cb): added global evolution_dir
- just like the mail component, so we know we to store config stuff.
-
-2000-10-11 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/e-calendar-table.c: Fixed the column elements here.
-
-2000-10-11 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/e-calendar-table.c: Updated to use the new ETable
- specification stuff.
-
-2000-10-11 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.c (map_sax_start_element): The
- element is "pilot_id" not "pilotid". Update both maps
- (compute_pid): Utility function to set a local records pid
- (local_record_from_comp): Compute the pid and status here,
- no longer use the old cal_component pilot interfaces
- (free_match): Its a *local not a **local
-
- * conduits/calendar/calendar-conduit.c: same as above
-
- * conduits/todo/todo-conduit.h: Have both a uid and pid map
-
- * conduits/todo/calendar-conduit.h: same as above
-
-2000-10-09 JP Rosevear <jpr@helixcode.com>
-
- * conduits/*: Adjust to using gnome-pilot-sync-abs conduit which
- is based on the latest pilot link changes.
-
-2000-10-09 Iain Holmes <iain@helixcode.com>
-
- * Makefile.am: Added the executive-summary library and cflags
-
- * gui/evolution-calendar.oafinfo: Added oaf servers for the
- executive summary and executive summary factory.
-
- * gui/calendar-summary.[ch]: New files to create the summary.
-
- * gui/component-factory.c (summary_fn): Create the executive
- summary component.
- (component_factory_init): Start the summary factory as well.
-
-2000-10-06 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/weekday-picker.[ch]: New widget to pick weekdays.
-
-2000-10-05 Michael Meeks <michael@helixcode.com>
-
- * gui/calendar-commands.c: upd.
- (calendar_control_activate): upd.
- (calendar_control_deactivate): upd.
-
-2000-10-05 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-day-view.c:
- * gui/e-week-view.c: when the user types in a new event, don't create
- it until the user hits Return or switches focus. Removed the
- editing_new_event flags.
-
- * cal-util/test-recur.c: rewritten to work on ics files. Now I can
- start testing the recurrence code.
-
- * cal-util/cal-recur.c: a few fixes.
-
- * gui/e-day-view.c (e_day_view_check_if_new_event_fits): fixed to
- return TRUE for long events, not FALSE.
-
-2000-10-04 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/print.c (print_todo_details): As a temporary solution to the
- to-do printing, just print the summaries. We'll use the ETable
- printing stuff later.
-
- * gui/print.c (print_day_summary_cb): Use g_list_append() correctly.
- (print_todo_details_cb): Likewise.
- (print_day_summary): Initialize psi.events. This code was
- obviously never tested.
- (print_todo_details): Likewise.
- (print_day_details): Initialize pdi.slots.
-
- * gui/print.c (range_selector_new): Fix strftime() %a versus %b
- confusion. Fixes bugzilla #644.
- (range_selector_new): Fix the whole localization mess by making
- better use of strftime(). Now we generate whole date strings at a
- time and compose them later. Fixes bugzilla #643.
-
-2000-10-02 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-meeting-edit.c: added support for the ROLE and RSVP parameters
- in both the GUI and underlying iCal.
-
-2000-09-29 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-meeting-edit.c: added support for organizers in the meeting
- scheduler.
-
-2000-09-29 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/e-meeting-edit.c: added code that makes changes to the underlying
- iCAL structure of an event, when the user changes meeting information.
-
- * gui/e-meeting-dialog.glade: this is the Glade UI for the meeting dialog
- and accoutrements.
-
-2000-09-29 Damon Chaplin <damon@helixcode.com>
-
- * cal-util/cal-recur.c: updated to support RDATE end times or
- durations. Note that if you have two RDATEs with the same start times,
- but with different end dates/durations set, the results are
- unpredictable. So the event editor dialog should check for this.
-
- * gui/e-week-view-main-item.c (e_week_view_main_item_draw_day):
- make strftime() strings translatable, and changed the formats a bit.
-
- * NOTE: someone needs to check print.c to make sure strftime strings
- are OK for i18n.
-
- * gui/e-day-view.h: Changed EDayViewDateFormat enum. We now try to
- include the weekday if possible. Also changed EDayView struct so we
- store the month & weekdays with the longest names rather than the
- actual widths. This helps i18n.
-
- * gui/e-day-view.c (e_day_view_recalc_cell_sizes): used _() for
- strftime strings, tried to see if weekday fits, and rearranged a
- bit to make i18n easier.
-
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw): used _() for
- strftime strings, and updated to use new formats.
-
- * gui/calendar-model.c: added use_24_hour_format boolean to
- CalendarModelPrivate so we can display dates in 12-hour format if
- requested. This meant adding a CalendarModel argument to a few
- functions. Also added get/set functions to set use_24_hour_format.
- I suppose ideally we should have an ECellDate renderer and this option
- should go there.
-
-2000-09-27 Jesse Pavel <jpavel@helixcode.com>
-
- * gui/event-editor.c: changed a menu entry so that it will invoke
- my meeting editor.
-
- * gui/e-meeting-edit.[ch]: added these files to provide preliminary
- support for iTIP meeting scheduling. Currently, only the GUI works;
- there is not yet any backend support.
-
- * gui/Makefile.am: added entries for e-meeting-edit.[ch]
-
-2000-09-24 Damon Chaplin <damon@helixcode.com>
-
- * gui/dialogs/task-editor-dialog.glade: set the height of the scrolled
- window for the description field, since the default window height
- doesn't seem to be working.
-
- * cal-util/cal-component.h: added functions to get the actual
- icalproperty lists for RRULE and EXRULE properties.
-
- * cal-util/cal-recur.[hc]: added support for COUNT, though I need to
- test it a bit. Also fixed the call to generate_instances_for_year() so
- it uses the chunk dates.
-
-2000-09-20 Damon Chaplin <damon@helixcode.com>
-
- * gui/event-editor.c: got rid of 1 '_' in '__Formatting'.
-
-2000-09-22 Michael Meeks <michael@helixcode.com>
-
- * gui/calendar-commands.c (calendar_control_activate): upd.
-
-2000-09-21 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/calendar-commands.c (verbs): Removed the "about calendar"
- command, since we don't want to have both "About Evolution" and
- "About Calendar".
-
-2000-09-21 Michael Meeks <michael@helixcode.com>
-
- * gui/calendar-commands.c (calendar_control_activate): _UIHandler
- update.
-
-2000-09-20 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.c (pre_sync): Don't fail if there
- is no map file.
-
-2000-09-20 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.h: Add since field to context
-
- * conduits/todo/todo-conduit.c (map_set_node_timet): New utility
- function
- (map_sax_start_element): Look for the map timestamp as well
- (map_write): Write the map timestamp
- (pre_sync): Use the map time stamp when looking for changed entries
-
- * pcs/cal-backend.c (cal_backend_log_sax_start_element): Make sure
- we are in a valid timestamp
-
-2000-09-20 JP Rosevear <jpr@helixcode.com>
-
- * pcs/cal-backend.c (cal_backend_log_name): Make the log file
- name relevant to the actual calendar file, rather than just the
- directory.
-
-2000-09-20 JP Rosevear <jpr@helixcode.com>
-
- * pcs/cal-backend.c (cal_backend_get_log_entries): Oops
-
-2000-09-20 JP Rosevear <jpr@helixcode.com>
-
- * pcs/cal-backend.c (cal_backend_get_log_entries): Use a local
- sax handler.
-
- * conduits/todo/todo-conduit.c (pre_sync): Use xmlSAXParseFile
- (map_sax_parse): Delete
-
-2000-09-20 JP Rosevear <jpr@helixcode.com>
-
- * pcs/cal-backend.c (cal_backend_log_sax_start_element): Properly
- assign the CalObjChange type.
- (cal_backend_log_sax_parse): Delete
- (cal_backend_get_log_entries): Use xmlSAXUserParseFile
-
-2000-09-19 JP Rosevear <jpr@helixcode.com>
-
- * pcs/cal-backend.c (cal_backend_set_uri): New utility function
- (cal_backend_load): use above
- (cal_backend_create): use above
- (cal_backend_log_name): Take a uri instead of a backend param
-
- * pcs/cal-backend-file.c: Get rid of useless hash functions
- (cal_backend_file_load): Check to make sure path exists and is
- local
- (cal_backend_file_load): Unref the current uri if there is one
- (cal_backend_file_create): ditto
-
- * pcs/cal-backend.c (cal_backend_last_client_gone): Sync before
- shooting ourselves in the foot
-
- * pcs/cal-backend-file.c (save): Fully implement backing up the
- calendar before writing out the new entry.
-
-2000-09-19 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.c (check_for_slow_setting): Add some
- other cases where a slow sync is in order
- (pre_sync): Pre load the uids, the map and the add/mod/del lists
- (match_record): Use the map hash to match records
- (iterate): Iterate using the pre-loaded uid list
- (iterate_specific): Iterate using the add/mod/del lists
- (purge): Delete all entries in the del list
- (set_status): Set status by adding to an appropriate list
- (set_pilot_id): Set pilot_id by updating map hash
-
- * conduits/todo/todo-conduit.h: Add lists for added, modified and
- deleted objects
-
- * conduits/todo/todo-conduit.c (map_name): Get the pilot_id->uid map
- file name
- (map_sax_start_element): SAX handler to extract a pilot_id->uid
- mapping
- (map_sax_parse): Parse the given file and build a pilot_id->uid hash
- (map_write_foreach): Write out individual mapping elements
- (map_write): Write out the pilot_id->uid mapping
- (start_calendar_server_cb): Rename from gnome_calendar_load_cb
-
- * conduits/todo/todo-conduit-config.h: Rename pilotID to pilot_id
-
- * conduits/todo/e-todo.conduit.in: A little renaming
-
- * conduits/todo/Makefile.am: Fix build slightly
-
- * pcs/cal.c (build_change_seq): Build a corba sequence out of a list
- of CalObjChanges
- (Cal_get_objects_in_range): Implement new corba function
-
- * pcs/cal-backend.c (cal_backend_init): Intiliaze to NULL
- (cal_backend_load): Track the uri so we can write the log file
- to the same place
- (cal_backend_log_name): Figure out the log filename/path based on
- the calendar uri
- (cal_backend_set_node_timet): Set an xml node property value from
- a time_t
- (cal_backend_log_entry): Adds a log entry to list waiting to be written
- out
- (cal_backend_log_sync): Syncs the log entries to disk
- (cal_backend_log_sax_start_element): SAX callback for reading in
- log entries
- (cal_backend_log_sax_end_element): ditto
- (cal_backend_log_sax_parse): Main SAX parser call to parse the log
- file looking for particular log entries and creating a CalObjChange
- hash with the last change for each object
- (cal_backend_get_log_entries): Returns a hash of objects of a given
- type changed since the given time
- (cal_backend_update_object): Add appropriate log entries
- (cal_backend_remove_object): ditto
- (cal_backend_get_changed_uids): Implement new idl interface call
- (cal_backend_foreach_changed): Convert CalObjChange hash into a list
-
- * pcs/cal-backend-imc.[hc]: Remove crufty files
-
- * pcs/cal-backend-file.c (cal_backend_file_get_type_by_uid): New
- function that returns the CalObjType for a uid.
-
- * cal-client/cal-client.h: Update prototypes.
-
- * cal-client/cal-client.c (build_change_list): Build a list
- of CalObjChange items from a corba sequence.
- (cal_client_get_changed_uids): New accessor method for the
- similarly named addition to the idl file.
-
- * cal-util/cal-util.h: Update prototypes and add CalObjChangeType
- enum.
-
- * cal-util/cal-util.c (cal_obj_change_list_free): New utility
- method to free a list of CalObjChange objects.
-
- * idl/evolution-calendar.idl: Add get_changed_uids method
- and associated types.
-
-2000-09-18 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/Makefile.am: Added $(EXTRA_GNOME_CFLAGS) and
- $(EXTRA_GNOME_LIBS). Removed unneeded libraries.
-
- * gui/calendar-model.h, gui/e-calendar-table.c, gui/e-day-view.c,
- gui/e-week-view-event-item.c, gui/e-week-view.c,
- gui/event-editor.c, gui/gncal-todo.c, gui/gnome-cal.c, gui/main.c,
- gui/print.c, gui/dialogs/task-editor.c: Fixed the #include lines
- to deal properly with gal.
-
- * gui/check-filled.xpm: New file since we can't include it from
- e-table anymore.
-
-2000-09-16 Michael Meeks <michael@helixcode.com>
-
- * gui/Makefile.am (INCLUDES): add datadir
-
- * gui/calendar-commands.c (calendar_control_activate): use it.
-
-2000-09-14 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/.cvsignore: Shush
-
-2000-09-14 JP Rosevear <jpr@helixcode.com>
-
- * Add headers with GPL notice and credit copyright to those appropriate
-
- * conduits/todo/todo-conduit-control-applet.c (doHelp): Update name,
- authors, copyright for about dialog.
- (activate_sync_type): Tidy
-
- * conduits/todo/Makefile.am: Rename binaries and libs to e-todo*
- to avoid conflicts.
-
- * conduits/todo/e-todo.conduit.in: Reflect binary/lib name changes
-
- * conduits/todo/e-todo-conduit-control-applet.desktop: ditto
-
- * conduits/todo/todo.conduit.in: Removed
-
- * conduits/todo/todo-conduit-control-applet.desktop: Removed
-
- * conduits/todo/todo-conduit-config.h (todoconduit_load_configuration):
- The config file will now be called e-todo-conduit
- (todoconduit_save_configuration): ditto
-
- * conduits/todo/todo-conduit.c: Some renaming to keep consistent.
- (pre_sync): Remove commented out function that does not exist.
-
- * conduits/todo/todo-conduit-control-applet.c: ditto
-
- * conduits/todo/todo-conduit-config.h: ditto
-
- * conduits/todo/todo-conduit.h: ditto
-
-
-2000-09-07 Michael Meeks <michael@helixcode.com>
-
- * gui/calendar-commands.c: Re-write most UI handler code.
-
-2000-09-13 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/calendar-model.c (obj_updated_cb): Removed an unused
- variable.
-
- * gui/calendar-model.c (obj_updated_cb): See if the new object
- matches the type of objects we were told to deal with.
- (load_objects): Likewise.
-
-2000-09-13 JP Rosevear <jpr@helixcode.com>
-
- * pcs/cal-backend-file.c (remove_component): Only remove the pilot
- item from the hash if it exists in the first place.
-
-2000-09-12 JP Rosevear <jpr@helixcode.com>
-
- * pcs/cal-backend-file.c (add_component): plug leakage
-
-2000-09-12 JP Rosevear <jpr@helixcode.com>
-
- * conduits/calendar/calendar-conduit.c: Hack to compile for distcheck.
-
- * conduits/calendar/calendar-conduit.h: Remove calobj.h dependency
-
-2000-09-12 JP Rosevear <jpr@helixcode.com>
-
- * pcs/cal-backend-file.c (cal_backend_file_load): Use g_int_*
- for now
- (cal_backend_file_create): ditto
-
- * conduits/todo/todo-conduit.c (local_record_from_compobject): Make
- this actually fill in the todo record.
- (find_record_in_repository): Add debug stuff
- (iterate_specific): Use the already exisiting utility function
-
- * pcs/cal-backend-file.c (cal_backend_file_update_pilot_id): correct
- the status and id types. g_strdup the uid since this is not a
- constified return
- (cal_backend_file_get_uid_by_pilot_id): correct the id type
-
-2000-09-12 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/Makefile.am: Remove `ui.xml' stuff.
-
- * pcs/cal-backend.c: Dont' #include calobj.h anymore as it's gone.
-
-2000-09-12 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/gnome-cal.c (gnome_calendar_construct): Connect to the
- "cal_loaded" signal of the client here.
- (connect_load): Removed function.
- (disconnect_load): Removed function.
- (cal_loaded_cb): Store the URI we are loading in the GnomeCal
- structure instead of in a weird closure. This gets rid of the
- connect/disconnect mess as well.
- (gnome_calendar_open): Store the URI in the GnomeCal.
-
-2000-09-11 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/e-day-view.c: Fixed a warning (removed unused variable
- gfloat width from e_day_view_get_event_position.)
-
-2000-09-11 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.c: Handle renaming, header cleanup
-
- * conduits/todo/todo-conduit.h: Rename GCalLocalRecord to
- EToDoLocalRecord, header cleanup
-
-2000-09-11 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.c (comp_from_remote_record): Use
- description list instead of comment list for pilot todo note
- (transmit): Check for null cal component properties, set priority
- correctly, use description list instead of comment list. Make
- pilot record private when appropriate.
-
-2000-09-10 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.c (comp_from_remote_record): Only
- set the due date only if it exists
-
-2000-09-10 JP Rosevear <jpr@helixcode.com>
-
- * gui/calendar-model.c (get_is_complete): Relying on the status
- field is somewhat faulty since it is related to group scheduling
-
-2000-09-10 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.c (update_calendar_entry_in_repository):
- Make log output a little more sensible
- (comp_from_remote_record): Minor correction when making a CalComponent
- from scratch.
- (update_record): Use comp_from_remote_record for new items, rather
- than repeating the code here.
-
-2000-09-10 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.c: Remove catch_ret_val function
- since its no longer useful. Fix naming of various fields from
- the header changes. Use GnomePilotRecord* stuff instead of
- ICAL_PILOT_SYNC_*
- (e_todo_context_new): Rename from gcalconduit_new_context. Now takes
- a pilot id and loads the configuration here
- (e_todo_context_destroy): Rename from gcalconduit_destroy_context.
- Unref the client and destroy the configuration if they exist here
- (start_calendar_server): Change the default calendar name
- (local_record_from_comp_uid): Rename from local_record_from_ical_uid
- (local_record_from_compobject): Rename from
- local_record_from_icalobject. Properly do the pilot id and status.
- (comp_from_remote_record): Rename from ical_from_remote_record.
- Handle due, complete, classification and pilot stuff properly
- (pre_sync): Remove some old stuff. We need to figure out how to
- set some of the field values.
- (set_status): Reflect pilot status changes from above
- (conduit_destroy_gpilot_conduit): Remove cleanup stuff that is
- now done by e_todo_context_destroy
- (conduit_get_gpilot_conduit): Only set the context as object
- data of the conduit.
-
- * conduits/todo/todo-conduit.h: Rename GCalConduitContext to
- EToDoConduitContext. Remove some unused struct fields.
- For GCalLocalRecord, rename ical to comp.
-
-2000-09-11 Damon Chaplin <damon@helixcode.com>
-
- * gui/dialogs/task-editor.c: changed to use EDateEdit.
-
- * gui/dialogs/task-editor-dialog.glade: added "None" option to
- Classification option menu, and used custom widgets for the date
- entries so we can use EDateEdit widgets.
-
- * gui/event-editor.c: changed to use EDateEdit. Note that this needs
- to be fixed at some point to handle invalid dates, i.e. when
- e_date_edit_get_time returns -1.
-
- * gui/calendar-model.c (ensure_task_complete):
- (ensure_task_not_complete): new functions to set the related properties
- to make sure a task is marked as complete on not, i.e. "Date Completed"
- "Status" and "Percent" properties.
-
-2000-09-08 Damon Chaplin <damon@helixcode.com>
-
- * gui/calendar-model.c (get_is_complete): use the status field rather
- than the completed date, as it is more reliable.
- (get_is_overdue): use get_is_complete().
- (calendar_model_mark_task_complete): check if it is already complete,
- and if so don't update it.
-
- * cal-util/cal-component.c (cal_component_get_status):
- (cal_component_set_status): added functions to support the STATUS
- property. Also added the property to CalComponentPrivate and set it
- to NULL in free_icalcomponent(). Someone should check my code as I've
- mainly done a Cut & Paste job.
-
-2000-09-10 JP Rosevear <jpr@helixcode.com>
- * conduits/todo/todo-conduit.c: Convert "//" style comments
- (local_record_from_ical_uid): Remove iCalObject cruft
- (ical_from_remote_record): ditto
- (free_match): Properly unref the CalComponent
-
-2000-09-10 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.c (local_record_from_icalobject): Use
- cal component pilot stuff properly
- (find_record_in_repository): Remove cruft
- (ical_from_remote_record): Remove cruft
- (update_record): Set the vtype immediately after creation. Remove cruft
-
- * conduits/todo/todo-conduit.h: Remove iCalObject stuff
-
- * conduits/todo/todo-conduit-config.h: Move all the config stuff
- here, I need to kill the warnings at some point
-
- * conduits/todo/todo-conduit-control-applet.c (doRevertSettings):
- Set all the state variables correctly on a revert
- (doSaveSettings): Update original state
- (doHelp): Rename from about_cb
- (main): Destroy configurations when done
-
- * conduits/todo/Makefile.am: Tidy
-
- * pcs/cal-backend-file.c (cbf_pilot_hash): Function for hashing
- pilot ids
- (cbf_pilot_equal): For hash table of pilot ids
- (cal_backend_file_destroy): Destroy pilot id hash
- (add_component): Insert the uid into the pilot hash
- (remove_component): Remove the uid from the pilot hash
- (cal_backend_file_load): Create the pilot hash
- (cal_backend_file_create): ditto
- (cal_backend_file_get_uid_by_pilot_id): Implement using the pilot hash
- (cal_backend_file_update_pilot_id): ditto
-
- * cal-util/cal-component.h: Update prototypes
-
- * cal-util/cal-component.c (cal_component_get_pilot_id): Implement
- using ical X properties
- (cal_component_set_pilot_id): ditto
- (cal_component_get_pilot_status): ditto
- (cal_component_set_pilot_status): ditto
- (cal_component_free_pilot_id): Free a pilot id
- (cal_component_free_pilot_status): Free a pilot status
-
-2000-09-09 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/dialogs/Makefile.am (INCLUDES): Add
- `-I$(top_builddir)/libical/src/libical' so that we get
- `icalversion.h' from the build directory instead of taking it from
- the installation directory, which is of course Wrong (tm).
- * gui/Makefile.am (INCLUDES): Likewise.
-
-2000-09-08 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/gnome-cal.c (cal_loaded_cb): New function with the
- loading/creation state machine. It is carefully modelled after
- the state machine that started the Universe, so bow before it.
- (gnome_calendar_construct): Do not connect to cal_loaded here.
- (connect_load): The closure for the cal_loaded callback is a bit
- tricky, so provide a function to create it and connect to the
- signal.
- (disconnect_load): Disconnect from the signal and free the
- closure.
- (gnome_calendar_load_cb): Removed obsolete buggy function.
- (gnome_calendar_open): Use the new mechanism.
-
- * gui/control-factory.c (set_prop): The default filename is now
- calendar.ics.
-
-2000-09-08 JP Rosevear <jpr@helixcode.com>
-
- * conduits/calendar/calendar-conduit.c (transmit): Use
- icaltime_as_timet
-
-2000-09-08 Christopher James Lahey <clahey@helixcode.com>
-
- * cal-util/cal-recur.c, gui/e-day-view.c, gui/e-week-view.c,
- gui/event-editor.c, gui/getdate.y, gui/gncal-todo.c,
- gui/gnome-cal.c, gui/dialogs/task-editor.c: Fixed some warnings.
-
-2000-09-08 JP Rosevear <jpr@helixcode.com>
-
- * conduits/calendar/Makefile.am: Tidy
-
- * conduits/todo/Makefile.am: Tidy
-
-2000-09-08 Federico Mena Quintero <federico@helixcode.com>
-
- Fall equinox cleanup!
-
- OK, I know the equinox is not here yet, but weather has changed
- enough to warrant it.
-
- Sigh. This place is definitely not the tropics.
-
- * gui/gnome-cal.c (obj_updated_cb): Renamed from
- gnome_calendar_object_updated_cb(); fixed prototype.
- (obj_removed_cb): Renamed from gnome_calendar_object_removed_cb();
- fixed prototype.
- (GnomeCalendarPrivate): Moved all the GnomeCalendar fields to a
- private structure so I don't have to rebuild the whole calendar
- GUI directory every time something changes in the object.
- (GnomeCalendarPrivate): Removed the property bag and the control
- fields; they are local to the control-factory now.
- (gnome_calendar_update_view_buttons): Remove the
- ignore_view_button_clicks mess and just block the signal.
- (gnome_calendar_set_view): Added a "focus" argument to indicate
- whether we want the main widget in the specified view to grab the
- focus.
- (gnome_calendar_set_view_internal): Handle the focus argument here.
- (gnome_calendar_set_view_buttons): Temporary hack to notify the
- calendar about its buttons.
- (gnome_calendar_get_selected_time_range): New function.
- (gnome_calendar_get_cal_client): New function.
-
- * gui/control-factory.c (calendar_properties_init): Keep the
- property bag local to here; it does not need to be in the calendar
- object yet.
- (control_factory_fn): Renamed from control_factory(). Just use
- control_factory_new_control().
- (control_factory_new_control): Moved the stuff over from
- create_control(), and keep the control local to here. Check the
- return value of bonobo_control_new().
-
- * gui/calendar-commands.c (show_day_view_clicked): Remove the
- ignore_view_button_clicks mess.
- (new_calendar): Removed the useless "page" argument.
- (calendar_control_activate): Use gnome_calendar_set_view_buttons()
- for now.
-
-2000-09-07 Lauris Kaplinski <lauris@helixcode.com>
-
- * cal-client/Makefile.am: Added -lunicode
-
- * gui/dialogs/task-editor.c: More UTF-8 wrappers
- (priority_index_to_value): Kill warning, add assertion
-
-2000-09-06 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-day-view-main-item.c (e_day_view_main_item_draw_day_event):
- Use new cal_component_has_recurrences convenience function
-
- * gui/e-week-view.c (e_week_view_show_popup_menu): ditto
-
- * gui/e-week-view-event-item.c (e_week_view_event_item_draw_icons):
- ditto
-
- * gui/calendar-model.c (calendar_model_value_at): ditto
- (calendar_model_value_at): ditto
-
- * gui/e-day-view.c (e_day_view_on_event_click): ditto
- (e_day_view_on_event_right_click): ditto
- (e_day_view_on_top_canvas_motion): ditto
- (e_day_view_on_top_canvas_motion): ditto
- (e_day_view_on_main_canvas_motion): ditto
- (e_day_view_on_main_canvas_motion): ditto
- (e_day_view_reshape_day_event): ditto
-
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw_long_event):
- ditto
-
- * gui/e-day-view.c (e_day_view_on_long_event_click): ditto
-
-2000-09-06 JP Rosevear <jpr@helixcode.com>
-
- * cal-util/cal-recur.c (cal_recur_generate_instances): Use
- new convenience functions and only get the recurrence
- stuff if needed. Free the recurrence stuff if used.
-
-2000-09-05 JP Rosevear <jpr@helixcode.com>
-
- * cal-util/cal-component.h: Add new prototypes
-
- * cal-util/cal-component.c (cal_component_has_exrules): Utility
- function to determine whether a cal component has any exrules
- (cal_component_has_exdates): Ditto for exdates
- (cal_component_has_exceptions): Utility function to determine
- whether a cal component has any exception rules
- (cal_component_has_recurrences):Utility function to determine
- whether a cal component has any recurrence rules
-
-2000-09-05 JP Rosevear <jpr@helixcode.com>
-
- * gui/event-editor.c (dialog_to_comp_object): Kill all exdates if
- there are no dates in the box
-
- * cal-util/cal-recur.c (generate_instances_for_year): Add a special
- case for when there are exceptions but no rrules or rdates.
- (cal_obj_remove_exceptions): Use date only compare func
- (cal_obj_date_only_compare_func): New compare function that
- compares the date only, not the time.
-
- * gui/event-editor.c (dialog_to_comp_object): Need a break for the
- yearly recurrence type
- (dialog_to_comp_object): We need to allocate icaltimetypes for the
- exdate list
- (fill_widgets): Handle a weekly recurrence with no particular day set
- (dialog_to_comp_object): Kill all rrules if "None" is selected as
- the recurrence type by the user
-
-2000-09-06 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-calendar-table.c (e_calendar_table_open_task): uses the new
- TaskEditor dialog.
-
- * gui/dialogs/task-editor.[hc]:
- * gui/dialogs/task-editor-dialog.glade: updated. Still need to fix the
- 'Status' property (CalComponent doesn't support it yet), and use a
- replacement for GnomeDateEdit, since we need to support setting 'None'
- as the date.
-
-2000-09-04 Damon Chaplin <damon@helixcode.com>
-
- * gui/event-editor.c (obj_updated_cb):
- (obj_removed_cb): compare the updated object's uid with the one we
- are editing, and just return if it doesn't match.
-
-2000-09-01 Damon Chaplin <damon@helixcode.com>
-
- * gui/gnome-cal.c (gnome_calendar_tag_calendar): added check to see
- if the client has loaded successfully. Gets rid of a few warnings.
-
-2000-09-05 JP Rosevear <jpr@helixcode.com>
-
- * cal-util/cal-recur.c (generate_instances_for_year): The exdate
- and rdate lists are a list of icaltimetypes, not CalComponentPeriods
-
- * gui/e-day-view.c (e_day_view_on_delete_occurrence): The exdate list
- is a list of icaltimetypes, not CalComponentDateTimes
-
-2000-09-05 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-day-view.c (e_day_view_on_delete_occurrence): Append
- the exdate to the list AFTER we create the date value.
-
-2000-09-05 JP Rosevear <jpr@helixcode.com>
-
- * cal-util/cal-component.c (cal_component_free_recur_list): Free
- the data, not the list element.
-
-2000-09-05 JP Rosevear <jpr@helixcode.com>
-
- * cal-util/cal-recur.c (cal_recur_generate_instances): Compute
- the event duration using the event start/end times, not the
- interval times.
-
-2000-09-05 JP Rosevear <jpr@helixcode.com>
-
- * cal-util/cal-recur.c (cal_recur_from_icalrecurrencetype): Check
- to see if r->enddate is (time_t)-1 and set to 0 if so
-
-2000-09-02 Ettore Perazzoli <ettore@helixcode.com>
-
- * conduits/calendar/Makefile.am (INCLUDES): Add libical include
- directories and `$(BONOBO_GNOME_CFLAGS)'.
- * conduits/todo/Makefile.am (INCLUDES): Likewise.
-
-2000-09-02 Lauris Kaplinski <lauris@helixcode.com>
-
- * gui/event-editor.c: e_utf8 wrappers
-
- * gui/gncal-todo.c: e_utf8_wrappers
-
-2000-09-02 Christopher James Lahey <clahey@helixcode.com>
-
- * conduits/calendar/calendar-conduit.c,
- conduits/todo/todo-conduit.c, gui/e-week-view.c, gui/gnome-cal.c:
- Fixed some warnings.
-
-2000-09-01 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/gnome-cal.c (gnome_calendar_new): Use
- gnome_calendar_construct() so that we can check for proper
- creation of the client.
- (gnome_calendar_destroy): Check that the client exists before we
- unref it.
- (gnome_calendar_construct): Do the CalClient creation here. Bind
- the views to it here as well instead of in setup_widgets().
- (gnome_calendar_init): Call setup_widgets() here.
-
- * gui/e-calendar-table.c (e_calendar_table_destroy): Unref the
- model.
-
-2000-09-01 JP Rosevear <jpr@helixcode.com>
-
- * conduits/todo/todo-conduit.c: Update for new libical.
- Conduits should atleast compile now.
-
- * conduits/calendar/calendar-conduit.c: ditto
-
- * Makefile.am: Build the conduits only when they've been
- enabled.
-
-2000-09-01 JP Rosevear <jpr@helixcode.com>
-
- * gui/event-editor.c: Make toolbar save and close button.
- We should put a similar menu option in sometime.
-
-2000-08-31 JP Rosevear <jpr@helixcode.com>
-
- * cal-util/cal-recur.c (array_to_list): Use
- ICAL_RECURRENCE_ARRAY_MAX instead of MAX_SHORT
-
-2000-08-31 JP Rosevear <jpr@helixcode.com>
-
- * gui/event-editor.c (file_delete_cb): Implement delete option
- (dialog_to_comp_object): Set the weekday start value and use
- local not UTC time
-
-2000-08-31 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (file_delete_cb): No need to spit a warning
- if removal fails.
- (event_editor_destroy): Free the exception clist data. Unref the
- calendar client here.
- (close_dialog): Just call gtk_object_destroy() on the event
- editor; the destroy handler will free everything else.
-
- * cal-client/cal-client.c (cal_client_object_exists): Removed
- function; this is not useful because we operate asynchronously.
-
- * gui/e-day-view.c (e_day_view_on_delete_appointment): No need to
- spit a warning if removal fails.
-
- * gui/e-week-view.c (e_week_view_on_delete_appointment): Likewise.
-
- * gui/calendar-model.c (calendar_model_delete_task): Likewise.
-
-2000-08-31 JP Rosevear <jpr@helixcode.com>
-
- * gui/event-editor.c (file_delete_cb): Implement delete option
- (recurrence_toggled): Make an ugly hack to get the recurrence
- pages showing properly since we don't yet implement all of the
- recurrence rule stuff.
-
- * cal-client/cal-client.c (cal_client_object_exists): New function
- to see if an object exists and is obtainable from the backend
-
- * cal-client/cal-client.h: Add prototype
-
-2000-08-31 JP Rosevear <jpr@helixcode.com>
-
- * gui/gnome-cal.c (editor_closed_cb): Event editor destroyed
- callback to do hash cleanup
- (gnome_calendar_edit_object): Set event editor calendar client.
-
- * gui/event-editor.h: Add new prototype
-
- * gui/event-editor.c: Trash signal stuff. We will manipulate
- the client directly. Make the toolbar save and menu save items
- work identically. Add icons to the toolbar.
- (save_event_object): Call cal_client_update_object
- (close_dialog): Unref the client and disconnect signals
- Actually destroy the event editor object.
- (obj_updated_cb): New function. Doesn't really do anything
- yet but it will inform the user the event has changed elsewhere
- in the future.
- (obj_removed_cb): ditto
- (event_editor_set_cal_client): New function to set the calendar
- client
-
- * gui/gnome-cal.c (gnome_calendar_new_appointment): Commit
- the sequence to the cal component and use non UTC times.
-
-2000-08-30 Lauris Kaplinski <lauris@helixcode.com>
-
- * gui/print.c: Countless small changes for gnome-print 0.21+
-
-2000-08-30 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-day-view.[hc]:
- * gui/e-day-view-main-item.c:
- * gui/e-week-view.[hc]:
- * gui/e-week-view-main-item.c:
- * gui/calendar-commands.c:
- * gui/gnome-cal.[hc]: switched to using new ECalendar widget,
- and a few other fixes.
-
-2000-08-30 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/gnome-cal.h (GnomeCal): Removed unused field event_editor.
-
- * gui/e-day-view.c (e_day_view_key_press): Oops, set the
- dtstart/dtend on the component before adding it.
- (e_day_view_on_editing_stopped): No need to check for an UID.
- Update the summary properly.
-
-2000-08-30 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-week-view.c: Make sure the is_utc flag is always
- FALSE for icaltime_from_timet
- (e_week_view_on_unrecur_appointment): Use icaltimetype struct
- from the stack and make sure tzid is always NULL
- (e_week_view_key_press): ditto
-
-2000-08-30 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-day-view.c: Make sure the is_utc flag is always
- FALSE for icaltime_from_timet
- (e_day_view_on_unrecur_appointment): Use icaltimetype struct
- from the stack and make sure tzid is always NULL
- (e_day_view_finish_long_event_resize): ditto
- (e_day_view_finish_resize): ditto
- (e_day_view_on_top_canvas_drag_data_received): ditto
- (e_day_view_on_main_canvas_drag_data_received): ditto
-
-2000-08-30 JP Rosevear <jpr@helixcode.com>
-
- * cal-client/cal-client.c (add_instance): Actually add the
- comp_instance struct to the instances list. We now appear
- to able to keep events and todos between sessions. Yay!
-
-2000-08-29 Federico Mena Quintero <federico@helixcode.com>
-
- Now the views monitor the client by themselves; it does not make
- sense to proxy all notifications through the GnomeCal. The
- GnomeCal should just be a meta-widget that holds all the views.
-
- At some later point we'll want to decouple the views from the
- GnomeCal so that they can be embedded anywhere; they should emit
- signals to request appropriate actions from the toplevel GUI
- instead of calling the GnomeCal directly.
-
- * gui/e-day-view.c (e_day_view_set_cal_client): New function; now
- the day view monitors the client by itself.
- (cal_loaded_cb): New callback; moved over from
- e_day_view_update_all_events().
- (obj_updated_cb): New callback; moved over from
- e_day_view_update_event().
- (obj_removed_cb): New callback; moved over from
- e_day_view_remove_event().
- (e_day_view_update_all_events): Removed function.
- (e_day_view_update_event): Removed function.
- (e_day_view_remove_event): Removed function.
- (*): Use the day_view->client directly instead of fetching it from
- the GnomeCal.
- (e_day_view_destroy): Unref the client.
- (e_day_view_reload_events): Check if the client is loaded.
- (e_day_view_key_press): Set the vtype of the new component.
-
- * gui/e-week-view.c (e_week_view_set_cal_client): New function.
- (cal_loaded_cb): New callback.
- (obj_updated_cb): New callback.
- (obj_removed_cb): New callback.
- (e_week_view_update_all_events): Removed function.
- (e_week_view_update_event): Removed function.
- (e_week_view_remove_event): Removed function.
- (*): Use the week_view->client directly.
- (e_week_view_destroy): Unref the client.
- (e_week_view_reload_events): Check if the client is loaded.
-
- * gui/gnome-cal.c (setup_widgets): Set the cal_client on all the
- views.
- (gnome_calendar_update_all): Do not update the views, since now
- they do it themselves.
- (gnome_calendar_object_updated_cb): Likewise.
- (gnome_calendar_object_removed_cb): Likewise.
- (setup_widgets): Remove all to-do list cruft.
- (gnome_calendar_colors_changed): Likewise.
- (gnome_calendar_todo_properties_changed): Likewise.
-
- * gui/calendar-commands.h (todo_style_changed): Removed variable.
-
- * gui/gncal-todo.c: Removed old clist cruft; just left in the
- temporary dialog box for now.
-
-2000-08-29 Dan Winship <danw@helixcode.com>
-
- * cal-client/client-test.c:
- * cal-client/cal-client.c:
- * conduits/todo/todo-conduit.h:
- * conduits/calendar/calendar-conduit.h: remove USING_OAF checks.
-
-2000-08-29 JP Rosevear <jpr@helixcode.com>
-
- * gui/gnome-cal.c (gnome_calendar_edit_object): Use
- event_editor_set_event_object
-
- * gui/event-editor.c (event_editor_set_event_object): Rename
- from event_editor_set_ical_object
-
- * gui/event-editor.h: Update prototype
-
- * gui/e-week-view.c (e_week_view_on_new_appointment):
- Call cal_component_commit_sequence after event changes. Default
- to these being all day events.
-
-2000-08-29 JP Rosevear <jpr@helixcode.com>
-
- * gui/event-editor.c (dialog_to_comp_object): These are not UTC
- times
-
-2000-08-28 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-client/cal-client.c (cal_client_is_loaded): New function.
- We need this from code that dynamically updates from a client and
- could not have connected to the "cal_loaded" signal right after
- the client was created.
-
- * gui/calendar-model.c (load_objects): Do not try to load the
- objects if the client has not been loaded yet.
- (cal_loaded_cb): Check the status value.
-
- * gui/calendar-model.h (CalendarModel): Declare the private
- structure here so that gdb will give me love.
-
- * pcs/cal-factory.h (CalFactory): Likewise.
-
- * pcs/cal.h (Cal): Likewise.
-
- * cal-client/cal-listener.h (CalListener): Likewise.
-
- * cal-client/cal-client.h (CalClient): Likewise.
-
- * pcs/cal-backend.h (CalBackend): This no longer has a private
- structure, so remove it.
-
- * cal-util/Makefile.am (libcal_util_la_SOURCES): Removed the
- vCalendar and old iCalendar cruft.
- (libcal_utilinclude_HEADERS): Likewise.
- Removed the obsolete iCalendar test program.
-
-2000-08-28 JP Rosevear <jpr@helixcode.com>
-
- * cal-util/timeutil.h: We no longer need time_from_icaltimetype
- as libical has the API for this
-
- * cal-util/timeutil.c: ditto
-
- * cal-util/cal-recur.c: Replace time_from_icaltimetype with
- icaltime_as_timet
-
- * gui/calendar-model.c: ditto
-
- * gui/event-editor.c: ditto
-
- * gui/gnome-cal.c: ditto
-
-2000-08-28 Federico Mena Quintero <federico@helixcode.com>
-
- * pcs/cal-backend-file.c (remove_component): Remove the
- icalcomponent from the toplevel calendar here.
- (cal_backend_file_update_object): Do not remove it here.
- (cal_backend_file_remove_object): Do not remove it here.
- (add_component): Add the icalcomponent to the toplevel calendar if
- asked to.
- (cal_backend_file_update_object): Do not add it here.
-
-2000-08-28 JP Rosevear <jpr@helixcode.com>
-
- * gui/event-editor.c (dialog_to_comp_object): Initiliaze tzid to
- null, only set recurrence rules and exception dates if there
- are any
-
-2000-08-27 JP Rosevear <jpr@helixcode.com>
-
- * pcs/cal-backend-file.c (save): Write out the calendar object
- (cal_backend_file_update_object): Remove/add the icalcomponent
- from our master icalcomponent (the calendar)
- (cal_backend_file_remove_object): Remove the icalcomponent
- from our master icalcomponent
-
-2000-08-26 JP Rosevear <jpr@helixcode.com>
-
- * gui/Makefile.am: Remove gnorba stuff
-
- * gui/main.c: ditto
-
- * gui/component-factory.c: ditto
-
- * gui/control-factory.c: ditto
-
- * gui/*.gnorba: ditto
-
-2000-08-25 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-calendar-table.c (e_calendar_table_init): Uncomment
- debug code.
-
- * gui/calendar-model.c (set_complete): Set the completed
- date to the current date
- (calendar_model_set_value_at): Handle complete field
-
-2000-08-25 JP Rosevear <jpr@helixcode.com>
-
- * gui/calendar-model.c (get_is_complete): Don't attempt to
- free this if its null
- (calendar_model_duplicate_value): Implement for summary field
- value
- (calendar_model_initialize_value): Remove debug code
-
- * gui/e-calendar-table.c: Correct etable init xml
- (create_column): Pass the id to e_table_header_add_column
- rather than a hard coded one
- (e_calendar_table_init): Make sure summary column isn't
- added twice. Add an alarms column, else etable won't
- work with columns who have an ID higher than that
-
-2000-08-24 JP Rosevear <jpr@helixcode.com>
-
- * gui/gncal-todo.c (ok_button): Properly append to list
-
- * gui/event-editor.c (dialog_to_comp_object): ditto
-
- * gui/e-day-view.c (e_day_view_on_new_appointment): The base
- times are not UTC
-
- * gui/e-week-view.c (e_week_view_on_new_appointment): ditto
-
-2000-08-24 JP Rosevear <jpr@helixcode.com>
-
- * Update for libical 0.19
-
-2000-08-24 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/calendar-commands.c, gui/e-day-view.c, gui/e-week-view.c,
- gui/event-editor.c, gui/gncal-todo.c, gui/gnome-cal.c, gui/prop.c:
- Fixed some warnings.
-
-2000-08-24 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-week-view.c (e_week_view_on_new_appointment): Do not alloc
- the struct icaltimetype but point to one on the stack. More
- importantly, set the date.tzid to NULL.
-
-2000-08-24 JP Rosevear <jpr@helixcode.com>
-
- * gui/gnome-cal.c (save_event_object_cb): Make signal
- names saner
- (released_event_object_cb): ditto
- (gnome_calendar_edit_object): ditto
-
- * gui/event-editor.h: Make signal names saner
-
- * gui/event-editor.c (event_editor_class_init): Make signal
- names saner now that we don't use ical object
- (save_event_object): ditto with callback names
- (file_save_cb): ditto
- (tb_save_and_close_cb): ditto
- (event_editor_set_ical_object): ditto
-
- * gui/e-day-view.c (e_day_view_update_event): Umm,
- != CAL_COMPONENT_EVENT (I hope that wasn't me!)
-
-2000-08-24 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/e-day-view.c (e_day_view_on_new_appointment): Do not alloc
- the struct icaltimetype but point to one on the stack. More
- importantly, set the date.tzid to NULL.
-
-2000-08-24 JP Rosevear <jpr@helixcode.com>
-
- * gui/event-editor-dialog.glade: Remove owner field
-
- * gui/event-editor.c (clear_widgets): Forget about owner field
- (get_widgets): ditto
- (fill_widgets): ditto
-
-2000-08-24 JP Rosevear <jpr@helixcode.com>
-
- * gui/calendar-model.c (calendar_model_initialize_value): Handle
- summary field
- (calendar_model_value_is_empty): ditto
- (calendar_model_free_value): ditto
-
-2000-08-23 JP Rosevear <jpr@helixcode.com>
-
- * gui/event-editor-dialog.glade: Remove status bar
-
- * cal-util/cal-component.c (cal_component_set_rrule_list): Allow
- a null list
- (cal_component_set_rdate_list): Allow a null list
-
- * gui/e-day-view.c (e_day_view_on_new_appointment): Commit
- the CalComponent sequence
-
-2000-08-23 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/main.c: #include <e-util/e-cursors.h>
-
- * gui/e-day-view-time-item.c (e_day_view_time_item_draw):
- Initialize time_min_x1 and hour_r to keep gcc happy.
-
- * gui/e-day-view.c (e_day_view_update_event_label): Warning fix.
- (e_day_view_update_main_canvas_drag): Initialize start_row.
-
- * gui/e-week-view-event-item.c (e_week_view_event_item_draw):
- Initialize time_y_small_min, icon_x.
-
- * Makefile.am (SUBDIRS): Re-enable the gui directory.
-
- * gui/prop.c (prop_store_alarm_default_values): Temporarily #if 0
- out.
-
-2000-08-23 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-week-view.c (e_week_view_key_press): Set vtype of new
- CalComponent
- (e_week_view_on_new_appointment): ditto
-
- * gui/e-day-view.c (e_day_view_on_new_appointment): ditto
-
-2000-08-23 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-day-view-time-item.c: Include gnome.h for gettext purposes
-
- * gui/gnome-cal.c: ditto
-
- * gui/prop.c: #if out some alarm stuff
-
-2000-08-23 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/e-calendar-table.c (e_calendar_table_init): Updated
- function.
- (e_calendar_table_open_task): Updated function.
-
-2000-08-21 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/calendar-model.c (calendar_model_duplicate_value): Updated
- function.
- (calendar_model_free_value): Updated function.
- (calendar_model_initialize_value): Updated function.
- (calendar_model_value_is_empty): Updated function.
- (remove_object): Updated function.
- (obj_updated_cb): Updated function.
- (calendar_model_get_cal_client): Added inline docs.
- (calendar_model_delete_task): Updated.
- (calendar_model_mark_task_complete): Updated.
- (calendar_model_get_cal_object): Updated.
-
-2000-08-21 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/calendar-model.c (set_categories): New function.
- (parse_time): Moved over from the old set_time_t(). This just
- parses the time and leaves the warning dialog for the caller.
- (set_datetime): New function.
- (set_geo): Updated old function.
- (set_percent): Updated old function.
- (set_priority): Updated old function.
- (set_summary): New function.
- (set_url): New function.
- (calendar_model_set_value_at): Updated function.
- (calendar_model_is_cell_editable): Updated function.
- (calendar_model_append_row): Updated. Added an ugly hack to
- accomodate ETable's lack of a real API for adding new items.
- Also, don't try to set columns that are not editable.
-
-2000-08-21 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-week-view.c (e_week_view_reload_events):
- Use CalObjType
-
- * gui/e-day-view.c (e_day_view_reload_events): ditto
-
-2000-08-21 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-day-view-main-item.c (e_day_view_main_item_draw_day_event):
- Use CalComponent instead of iCalObject. #if some alarm stuff
-
-2000-08-21 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-day-view-top-item.c (e_day_view_top_draw_long_event):
- Use CalComponent instead of iCalObject. #if some alarm stuff
-
-2000-08-21 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-day-view.h: Update prototypes
-
- * gui/e-day-view.c (e_day_view_on_unrecur_appointment):
- Remove commented out portions.
-
- * gui/e-week-view.c (e_week_view_on_unrecur_appointment):
- Tidy.
-
-2000-08-21 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-day-view.c
- (e_day_view_update_event): Use CalComponent
- instead of iCalObject. Work around not having a compare
- dates routine for two CalComponents.
- (e_day_view_reshape_long_event): Use CalComponent instead
- of iCalObject, #if some alarm stuff
- (e_day_view_reshape_day_event): ditto
- (e_day_view_reload_events): Use revamped CalClient
- (e_day_view_update_event_cb): Use CalComponent
- instead of iCalObject
- (e_day_view_foreach_event_with_uid): ditto
- (e_day_view_remove_event_cb): ditto
- (e_day_view_update_event_label): ditto
- (e_day_view_find_event_from_uid): ditto
- (e_day_view_on_event_click): ditto
- (e_day_view_on_event_right_click): ditto
- (e_day_view_on_new_appointment): ditto
- (e_day_view_on_edit_appointment): ditto
- (e_day_view_on_delete_occurrence): ditto
- (e_day_view_on_delete_appointment): ditto
- (e_day_view_on_unrecur_appointment): ditto
- (e_day_view_on_top_canvas_motion): ditto
- (e_day_view_on_main_canvas_motion): ditto
- (e_day_view_finish_long_event_resize): ditto
- (e_day_view_finish_resize): ditto
- (e_day_view_free_event_array): ditto
- (e_day_view_add_event): ditto
- (e_day_view_key_press): ditto
- (e_day_view_on_editing_stopped): ditto
- (e_day_view_update_top_canvas_drag): ditto
- (e_day_view_update_main_canvas_drag): ditto
- (e_day_view_on_drag_data_get): ditto
- (e_day_view_on_top_canvas_drag_data_received): ditto
- (e_day_view_on_main_canvas_drag_data_received): ditto
-
-2000-08-20 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-week-view-event-item.c (e_week_view_event_item_draw_icons):
- Use CalComponent instead of iCalObject. #if some alarm stuff
-
-2000-08-20 JP Rosevear <jpr@helixcode.com>
-
- * gui/e-week-view.c (e_week_view_update_event): Use CalComponent
- instead of iCalObject. Work around not having a compare
- dates routine for two CalComponents.
- (e_week_view_reload_events): Use revamped CalClient
- (e_week_view_reshape_event_span): Use CalComponent instead
- of iCalObject, #if some alarm stuff
- (e_week_view_update_event_cb): Use CalComponent instead of
- iCalObject
- (e_week_view_foreach_event_with_uid): ditto
- (e_week_view_remove_event_cb): ditto
- (e_week_view_free_events): ditto
- (e_week_view_add_event): ditto
- (e_week_view_on_editing_stopped): ditto
- (e_week_view_find_event_from_uid): ditto
- (e_week_view_key_press): ditto
- (e_week_view_show_popup_menu): ditto
- (e_week_view_on_new_appointment): ditto
- (e_week_view_on_edit_appointment): ditto
- (e_week_view_on_delete_occurrence): ditto
- (e_week_view_on_delete_appointment): ditto
- (e_week_view_on_unrecur_appointment): ditto
-
- * gui/e-week-view.h: Update prototypes.
-
-2000-08-18 JP Rosevear <jpr@helixcode.com>
-
- * gui/event-editor.h: Update prototypes.
-
- * gui/event-editor.c: Need to come back here later to fix the
- alarm stuff. The gui also needs to be completely redone to
- support the fancier CalComponent settings (exrules, rdates, etc)
- There are some warnings that I put in to mark some of these
- spots
- (event_editor_destroy): Use Calcomponent instead
- of iCalObject
- (make_title_from_comp): ditto
- (clear_widgets): ditto
- (fill_widgets): ditto
- (classification_get): ditto
- (dialog_to_comp_object): ditto
- (save_ical_object): ditto
- (close_dialog): ditto
- (event_editor_set_ical_object): ditto
-
-2000-08-17 JP Rosevear <jpr@helixcode.com>
-
- * gui/gncal-todo.c (ok_button): Use CalComponent instead of
- iCalObject
- (cancel_button): ditto
- (gncal_todo_edit): ditto
- (add_todo): ditto
- (edit_todo): ditto
- (delete_todo): ditto
- (insert_in_clist): ditto
- (gncal_todo_update): ditto
-
- * gui/gncal-todo.h: Update prototypes
-
-2000-08-16 JP Rosevear <jpr@helixcode.com>
-
- Rework gnome-cal.c - alarms are a tad broken ATM so this
- will need more cleaning later.
-
- * gui/gnome-cal.c (snooze): Use CalComponent instead of
- iCalObject
- (edit): ditto
- (audio_notification): ditto
- (display_notification_cb): Use CalComponent member of
- alarm_notify_closure rather than iCalObject
- (display_notification): ditto
- (trigger_alarm_cb): ditto. Use CalComponent alarm types
- (gnome_calendar_tag_calendar_cb): New
- cal_client_generate_instances callback to
- mark_gtk_calendar_day's
- (gnome_calendar_tag_calendar): Use above callback
- (save_ical_object_cb): Use CalComponent instead of
- iCalObject
- (gnome_calendar_edit_object): ditto
- (gnome_calendar_new_appointment): ditto
-
-2000-08-15 JP Rosevear <jpr@helixcode.com>
-
- * gui/mark.c (mark_month_item_cb): Callback used to mark every
- event in a month.
- (mark_month_item): Use cal_client_generate_instances with
- above callback
-
-2000-08-15 JP Rosevear <jpr@helixcode.com>
-
- * gui/print.c (print_month_small): Use
- cal_client_get_objects_in_range
- (print_day_details_cb): Callback used to create columns and fill
- events into a day view. Code should be shared with e-day-view
- in reality. Maybe need to go back to layout.[hc] a bit later
- (print_day_details): Use cal_client_generate_instances with
- above callback. Iterate over results to expand events to fit.
- (print_day_summary_cb): Callback to build list of event info
- for a day
- (print_day_summary): Use cal_client_generate_instances with
- above callback to generate the required event info for printing
- (print_todo_details_cb): Callback used create list of todo info
- (print_todo_details): Use cal_client_generate_instances with
- above callback to generate required todo info for printing.
-
- * gui/layout.[hc]: No longer used.
-
-2000-08-12 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/calendar-model.c (get_is_overdue): Finished implementing.
- (calendar_model_value_at): Handle the color field.
-
-2000-08-11 Seth Alves <alves@hungry.com>
-
- * cal-util/cal-component.c (cal_component_get_pilot_id):
- (cal_component_set_pilot_id): stubs for pilot id accessors
- (cal_component_get_pilot_status):
- (cal_component_set_pilot_status): stubs for pilot status accessors
-
- * conduits/calendar/calendar-conduit.c (transmit): start to
- convert to cal-component interface
-
- * conduits/todo/todo-conduit.c (transmit): same
-
-2000-08-11 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/calendar-model.c (get_geo): Generate a prettier string for
- the geographical position.
- (get_classification): New function.
- (get_categories): New function.
- (get_completed): New function.
- (get_dtend): New function.
- (get_dtstart): New function.
- (get_due): New function.
- (get_percent): New function.
- (get_priority): New function.
- (get_summary): New function.
- (get_transparency): New function.
- (get_url): New function.
- (get_has_alarms): New function.
- (get_has_recurrences): New function.
- (get_is_complete): New function.
- (get_is_overdue): New function.
-
- * cal-util/cal-component.c (scan_property): Handle the GEO
- property.
- (free_icalcomponent): Likewise.
- (cal_component_get_geo): Likewise.
- (cal_component_set_geo): Likewise.
- (cal_component_free_geo): Likewise.
- (cal_component_set_exdate_list): Removed incorrect assertion.
- (cal_component_set_exrule_list): Removed incorrect assertion.
- (cal_component_get_next_alarm): Oops, this had not been
- implemented at all.
- (cal_component_has_rdates): New function.
- (cal_component_has_rrules): New function.
-
- * cal-util/cal-component.h (CalComponentField): Added the GEO
- property.
-
-2000-08-11 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (scan_property): Handle the
- PERCENT-COMPLETE property.
- (free_icalcomponent): Likewise.
- (cal_component_get_percent): Likewise.
- (cal_component_set_percent): Likewise.
- (cal_component_free_percent): Likewise.
- (scan_property): Handle the PRIORITY property.
- (free_icalcomponent): Likewise.
- (cal_component_get_priority): Likewise.
- (cal_component_set_priority): Likewise.
- (cal_component_free_priority): Likewise.
-
- * cal-util/cal-component.h (CalComponentField): New enumeration
- with the list of fields we support for ETable.
-
-2000-08-10 Dan Winship <danw@helixcode.com>
-
- * gui/component-factory.c (owner_set_cb): Update prototype.
-
-2000-08-10 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/gnome-cal.c (gnome_calendar_new_appointment): New function.
- Mostly moved over from calendar-commands.c:display_objedit().
-
- * gui/calendar-commands.c (calendar_iterate): Removed. Wheee!
- (display_objedit): Removed.
- (new_appointment_cb): New function. Just call
- gnome_calendar_new_appointment().
- (display_objedit_today): Removed.
- (calendar_control_activate): Removed the "New appointment for
- today" option, since it is pretty useless.
-
-2000-08-10 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-client/cal-client.c (cal_client_generate_instances): There.
- A pretty function to generate recurrence instances atomically so
- that clients don't have to jump through hoops. Now we can get rid
- of the ugly calendar_iterate() function.
-
-2000-08-09 Cody Russell <bratsche@gnome.org>
-
- * gui/calendar-commands.c: Make the toolbar honor the user's
- gnomecc settings for detachable toolbars.
-
-2000-08-09 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/alarm.c (pop_alarm): Oops, subtract the new alarm's trigger
- time from the current time.
-
-2000-08-09 Christopher James Lahey <clahey@helixcode.com>
-
- * cal-client/cal-client.c: Fixed a warning.
-
-2000-08-09 Christopher James Lahey <clahey@helixcode.com>
-
- * cal-client/cal-client.c, gui/e-calendar-table.c, pcs/cal.c:
- Fixed some warnings.
-
-2000-08-08 Federico Mena Quintero <federico@helixcode.com>
-
- * idl/evolution-calendar.idl (Cal): Added a get_objects_in_range()
- method. Takes in a time range and the type of component we are
- interested in; returns a list of UIDs. The idea is that
- ocurrences get computed in the client; we can have multiple
- recurrences in iCalendar and we cannot identify them trivially
- across the wire.
- (Cal): Removed the get_events_in_range() method.
-
- * pcs/cal-backend.c (cal_backend_free_uid_list): New function.
- (cal_backend_get_objects_in_range): New function.
- (cal_backend_get_events_in_range): Removed.
-
- * pcs/cal-backend-file.c (cal_backend_file_get_objects_in_range):
- Implemented new method.
- (cal_backend_file_get_events_in_range): Removed.
-
- * pcs/cal.c (Cal_get_events_in_range): Removed.
- (uncorba_obj_type): New function.
- (Cal_get_uids): Use uncorba_obj_type().
- (Cal_get_n_objects): Likewise.
- (Cal_get_objects_in_range): Implemented new method.
-
- * cal-client/cal-client.c (cal_client_get_events_in_range): Removed.
- (cal_client_get_objects_in_range): Implemented.
- (corba_obj_type): New function.
- (cal_client_get_n_objects): Use corba_obj_type().
- (cal_client_get_uids): Likewise.
-
-2000-08-07 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (cal_component_clone): New function.
- (cal_component_get_icalcomponent): Ensure that the SEQUENCE
- property does not need incrementing.
-
- * gui/dialogs/alarm-notify-dialog.c (alarm_notify_dialog): Use
- CalComponent. Deal with an empty summary property.
-
-2000-08-07 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (cal_component_get_as_string): Doh,
- libical owns the string's memory, so do not free it.
-
- * cal-client/client-test.c (create_client): Connect to the destroy
- signal of the client here.
-
- * cal-client/test.ics: New test file, modified from Eric Busboom's
- test file from RFC 2445.
-
-2000-08-05 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-client/client-test.c (dump_component): This was gone for
- some reason.
- (main): Load a new test file.
-
-2000-08-04 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (cal_component_commit_sequence): New
- function to commit changes to the SEQUENCE property.
- (cal_component_get_as_string): Ensure that the sequence has been
- committed.
-
- * cal-client/cal-client.c (cal_client_get_object): Use
- CalComponent instead of the old iCalObject.
- (cal_client_update_object): Use iCalObject. Commit the SEQUENCE
- property before stringifying the object and piping it over to the
- Wombat.
-
-2000-08-04 Seth Alves <alves@hungry.com>
-
- * conduits/todo/todo-conduit.c (conduit_get_gpilot_conduit): if
- oaf isn't initialized by the time the conduit starts, start it
- up. we do this because we need to start wombat with oaf, and
- gpilotd doesn't currently start oaf.
-
-2000-08-04 Michael Meeks <michael@helixcode.com>
-
- * gui/calendar-commands.c (calendar_control_activate): unref.
-
-2000-08-02 Federico Mena Quintero <federico@helixcode.com>
-
- * pcs/cal-backend-file.c (cal_backend_file_get_uid_by_pilot_id):
- Added stub for now.
- (cal_backend_file_update_pilot_id): Likewise.
-
- * pcs/Makefile.am (libpcs_a_SOURCES): Removed cal-backend-imc.[ch]
- from the list of sources. The idea is to move vCalendar importing
- to the GUI as a convenience function.
-
-2000-08-02 Seth Alves <alves@hungry.com>
-
- * pcs/cal-backend-imc.c (cal_backend_imc_update_pilot_id): call
- save (cbimc) after setting the pilot id and status.
-
-2000-08-02 Joe Shaw <joe@helixcode.com>
-
- * pcs/cal-backend-file.c (cal_backend_file_update_pilot_id):
- Fixed a g_return_if_fail that had two parameters and thus
- wouldn't build.
-
-2000-08-03 Damon Chaplin <damon@helixcode.com>
-
- * gui/calendar-model.c (calendar_model_append_row): updated to match
- the new ETableModel append_row. This meant we could also get rid of
- the row_being_added and idle_id hack.
-
-2000-08-02 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/calendar-model.c: Emit "model_pre_change" signals as
- appropriate.
-
-2000-08-02 Federico Mena Quintero <federico@helixcode.com>
-
- * pcs/cal-backend-file.[ch]: New files for the iCalendar file
- backend.
-
- * pcs/Makefile.am (libpcs_a_SOURCES): Added cal-backend-file.[ch].
-
- * cal-util/cal-component.c (cal_component_set_icalcomponent):
- Return an operation success code for if we are passed a component
- of a type we don't support.
-
-2000-07-31 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-recur.c (*): Use CalComponent and the new property
- types instead of the old iCalObject stuff.
- (cal_recur_generate_instances): Renamed from
- cal_object_generate_events(). Ensure that the component has the
- DTSTART property.
- (generate_instances_for_year): Renamed from
- cal_object_generate_events_for_year().
- (cal_obj_expand_recurrence): Made static.
- (cal_recur_from_icalrecurrencetype): New function. We should
- really convert this whole file to use struct icalrecurrencetype
- instead.
- (cal_recur_free): New function.
-
- * cal-util/cal-recur.h (CalRecurType): Renamed from CalObjRecurType.
- (CalRecurrence): Renamed from CalObjRecurrence.
-
- * cal-util/timeutil.c (time_from_icaltimetype): New function.
-
- * cal-util/Makefile.am: Commented out the test-recur program.
-
-2000-08-01 Damon Chaplin <damon@helixcode.com>
-
- * Removed doc directory, since it is the old gnome-pim docs which
- aren't used any more.
-
- * Makefile.am (SUBDIRS): removed doc.
-
-2000-07-26 Peter Williams <peterw@helixcode.com>
-
- * gui/calendar-model.c: compile fix for Solaris
- (works under Linux, too; don't know about others)
-
- * this is a test of whether CVS merge does what I
- think it will do.
-
-2000-07-26 Federico Mena Quintero <federico@helixcode.com>
-
- OK, it seems that we have all the interesting properties for
- single-user calendars now. RFC 2445 can bite me.
-
- * cal-util/cal-component.c (scan_property): Handle the RRULE
- property. Yay!.
- (scan_recur): Likewise, yow!
- (get_recur_list): Likewise, yeehaw!
- (get_recur_list): Likewise, honk honk!
- (set_recur_list): Likewise, booooga booooga!
- (cal_component_get_rrule_list): Likewise, squeek squeek!
- (cal_component_set_rrule_list): That's it, I ran out of sounds.
- (cal_component_free_recur_list): Likewise.
- (scan_property): Handle the EXRULE property.
- (free_icalcomponent): Likewise.
- (cal_component_get_exrule_list): Likewise.
- (cal_component_set_exrule_list): Likewise.
- (set_period_list): Oops, free the old properties as well as
- removing them.
- (set_text_list): Ditto.
- (cal_component_set_exdate_list): Ditto.
-
- * cal-util/cal-component.c: Put all the functions used to free
- returned values all together.
- (cal_component_set_rdate_list): Oops, mark SEQUENCE property to be
- incremented since the RFC requires it.
- (scan_property): Handle the EXDATE property.
- (scan_exdate): Likewise.
- (free_icalcomponent): Likewise.
- (cal_component_get_exdate_list): Likewise.
- (cal_component_set_exdate_list): Likewise.
- (cal_component_free_exdate_list): Likewise.
-
-2000-07-26 Jeffrey Stedfast <fejj@helixcode.com>
-
- * gui/Makefile.am: Fixed a typo
-
-2000-07-26 Jeffrey Stedfast <fejj@helixcode.com>
-
- * gui/Makefile.am: Added a few xpm files to the EXTRA DIST section
-
-2000-07-25 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (cal_component_free_period_list): New function.
- (scan_property): Handle the RDATE property.
- (scan_period): Likewise.
- (free_icalcomponent): Likewise.
- (get_period_list): Likewise.
- (set_period_list): Likewise.
- (cal_component_get_rdate_list): Likewise.
- (cal_component_set_rdate_list): Likewise.
- (scan_text): Simplify a bit since we only handle the ALTREP
- parameter; there is no need to iterate over all parameters.
- (scan_datetime): Simplify; just handle the TZID parameter.
- (scan_summary): Simplify; just handle the ALTREP parameter.
- (cal_component_get_as_string): New function.
-
- * idl/evolution-calendar.idl (CalObjType): Removed the TYPE_OTHER;
- now we only expose the types of objects we know about.
-
- * cal-util/cal-util.h (CalObjType): Likewise.
-
- * cal-client/cal-client.c (cal_client_get_n_objects): Likewise.
- (cal_client_get_uids): Likewise.
-
- * conduits/calendar/calendar-conduit.c (get_calendar_objects): Likewise.
- (check_for_slow_setting): Likewise.
-
- * pcs/cal-backend-imc.c (count_objects): Likewise.
- (build_uids_list): Likewise.
-
- * pcs/cal.c (Cal_get_uids): Likewise.
- (Cal_get_n_objects): Likewise.
-
-2000-07-25 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-calendar-table.[hc]: new ECalendarTable to show an ETable view
- for Todo/Event items.
-
- * gui/task-assigned-to.xpm:
- * gui/task-recurring.xpm:
- * gui/task-assigned.xpm:
- * gui/task.xpm: new pixmaps (all the same at present) to go in the
- icon column of the ETable.
-
- * gui/event-editor.c: hid the silly 'Calendar' labels on the
- GnomeDateEdits and hid the times when you select 'All day event'.
- Also adjusted the time_t's so that when an all day event finishes on
- say midnight 13th May, we show 12th May in the dialog, since it
- implicitly includes all of that day up to midnight.
-
- * gui/dialogs/task-editor-dialog.glade:
- * gui/dialogs/task-editor.[hc]: unfinished dialog to edit tasks.
-
- * gui/gncal-todo.c: temporary hack so that we can use the simple dialog
- with our new ETable.
-
-2000-07-23 Damon Chaplin <damon@helixcode.com>
-
- * cal-util/calobj.h: added a few more fields.
-
- * cal-util/calobj.c (ical_object_create_from_vobject): check for a
- NULL return from vObjectUStringZValue for URL property to avoid SEGV.
- For some reason an empty 'URL:' property appears and causes trouble.
-
-2000-07-20 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component-factory.c (factory_fn): Update for the new
- `evolution_shell_component_new()' arg.
-
-2000-07-19 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (cal_component_alarm_set_trigger):
- Finish filling the trigger. What a pain, again.
- (cal_component_alarm_free_trigger): Implemented.
-
-2000-07-19 Fatih Demir <kabalak@gmx.net>
-
- * conduits/calendar/calendar-conduit-control-applet.desktop:
-
- * conduits/todo/todo-conduit-control-applet.desktop:
- Added the Turkish desktop entries.
-
-2000-07-18 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (cal_component_alarm_free): Free the
- icalcomponent if this is an unattached alarm.
- (scan_alarm_property): Handle the TRIGGER property.
- (cal_component_alarm_get_trigger): Ditto. Royal pain.
- (cal_component_alarm_set_trigger): Ditto. Less pain.
-
-2000-07-17 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-client/cal-client.c (cal_client_get_object): Fixed inline
- docs.
- (cal_client_new): Ditto.
- (cal_client_get_n_objects): Added inline docs.
-
-2000-07-14 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (CalComponentAlarm): New internal
- represntation for alarm components. We really don't map them to a
- CalComponent because it is more convenient to handle them as
- "child" structures.
- (make_alarm): New function to create a CalComponentAlarm from an
- icalcomponent representing a VALARM.
- (scan_alarm_property): New function to scan a property from an
- alarm component. We support ACTION.
- (cal_component_get_first_alarm): New function to start an iterator
- over the alarms in a calendar component.
- (cal_component_alarm_get_action): New function.
- (cal_component_alarm_set_action): New function.
-
-2000-07-13 Seth Alves <alves@hungry.com>
-
- * conduits/todo/todo-conduit.c: conduit based on the calendar conduit.
- this conduit syncs a pilot's ToDoDB database to wombat's list of "todo"
- events.
-
- * gui/gncal-todo.c (simple_todo_editor): set todo's priority control
- based on value from ical object during edit.
-
-2000-07-12 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/print.c: Revert Michael's GnomeFont patch until the
- gnome-print API stabilizes.
-
-2000-07-12 Michael Meeks <michael@helixcode.com>
-
- * gui/print.c (titled_box, print_text, print_month_small),
- (bound_text): GnomeFont update.
-
-2000-07-12 Seth Alves <alves@hungry.com>
-
- * conduits/calendar/calendar-conduit.c: fixed various problems
-
- * cal-client/Makefile.am: build a static version of the library
- to link with the conduits
-
- * cal-util/Makefile.am: same
-
-2000-07-11 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (scan_property): Handle the COMPLETED
- property.
- (free_icalcomponent): Ditto.
- (cal_component_get_completed): Ditto.
- (cal_component_set_completed): Ditto.
- (scan_property): Handle the TRANSPARENCY property.
- (free_icalcomponent): Ditto.
- (cal_component_get_transparency): Ditto.
- (cal_component_set_transparency): Ditto.
- (scan_property): Handle the URL property.
- (free_icalcomponent): Ditto.
- (cal_component_get_url): Ditto.
- (cal_component_set_url): Ditto.
-
- * pcs/cal-factory.c (queue_load_create_job): Removed unneeded
- check for the URI.
- (load_fn): Be more paranoid about the URI and notify the listener
- if we got passed a bad URI. Simplify the termination code a bit.
- (create_fn): Likewise.
- (queue_load_create_job): Be more paranoid about the URI.
-
-2000-07-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/Makefile.am: Remove pilot stuff for now.
-
- * Makefile.am (SUBDIRS): Remove `conduits'.
-
-2000-07-10 Dan Winship <danw@helixcode.com>
-
- * gui/Makefile.am (EXTRA_DIST): remove gnomecal.conduit
-
- * conduits/calendar/Makefile.am (EXTRA_DIST): We want
- calendar.conduit.in, not calendar.conduit.
-
-2000-07-10 Seth Alves <alves@hungry.com>
-
- * gui/Makefile.am (SUBDIRS):
- * conduits/calendar/Makefile.am: moved calendar-conduit stuff from
- the gui directory to here.
-
- * Makefile.am (SUBDIRS): added conduits to SIBDIRS
-
-2000-07-08 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/calendar-commands.c (calendar_control_activate): Remove
- "close calendar" command.
-
-2000-07-08 Anders Carlsson <andersca@gnu.org>
-
- * gui/e-week-view.c (e_week_view_on_button_press): Handle mouse wheel scrolling.
-
- * gui/e-day-view.c (e_day_view_on_time_canvas_button_press): New function to handle
- mouse wheel scrolling.
- (e_day_view_on_main_canvas_button_press): Handle mouse wheel scrolling.
-
-2000-07-07 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (scan_property): Handle the SEQUENCE
- property.
- (free_icalcomponent): Ditto.
- (cal_component_get_sequence): Ditto.
- (cal_component_set_sequence): Ditto.
- (cal_component_free_sequence): Ditto.
- (cal_component_set_last_modified): Removed incorrect assertion.
- (CalComponentPrivate): New need_sequence_inc flag. The sequence
- number must be incremented when certain properties change, so we
- store a flag that says if we need to bump it when piping the
- object over the wire.
- (free_icalcomponent): Reset need_sequence_inc.
- (cal_component_set_dtstart): Set need_sequence_inc.
- (cal_component_set_dtend): Ditto.
- (cal_component_set_due): Ditto.
-
-2000-07-06 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (scan_property): Handle the
- LAST-MODIFIED property.
- (free_icalcomponent): Ditto.
- (cal_component_get_last_modified): Ditto.
- (cal_component_set_last_modified): Ditto.
- (get_icaltimetype): New function to get struct icaltimetype
- values.
- (cal_component_get_created): Use get_icaltimetype().
- (set_icaltimetype): New function to set struct icaltimetype
- values.
- (cal_component_set_created): Use set_icaltimetype().
-
- * cal-util/cal-component.c (scan_property): Handle the CREATED
- property.
- (free_icalcomponent): Ditto.
- (cal_component_free_icaltimetype): Ditto.
- (cal_component_get_created): Ditto.
- (cal_component_set_created): Ditto.
- (cal_component_init): Do not create an UID here.
- (ensure_mandatory_properties): New function to ensure that the
- mandatory RFC properties are indeed in the component. If they are
- not, we create them on the fly.
- (cal_component_set_new_vtype): Use ensure_mandatory_properties().
- (cal_component_set_icalcomponent): Ditto.
- (cal_component_get_uid): Return the UID in a parameter, not as a
- function return value, for consistency's sake.
- (scan_property): Handle the DTSTAMP property.
- (free_icalcomponent): Ditto.
- (cal_component_get_dtstamp): Ditto.
- (cal_component_set_dtstamp): Ditto.
-
-2000-07-04 Damon Chaplin <damon@helixcode.com>
-
- * gui/gncal-todo.c (gncal_todo_update): Use &obj instead of &ico in
- the call to cal_client_get_object(). The ToDo list should work now.
-
- * gui/event-editor-dialog.glade: set the toplevel GnomeApp to invisible
- so it doesn't appear and then resize.
-
-2000-07-03 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (cal_component_get_summary): Use
- CalComponentText instead of CalComponentPropSummary. Removed the
- latter typedef.
- (cal_component_set_summary): Likewise.
- (scan_property): Handle the CLASSIFICATION property.
- (cal_component_get_classification): Ditto.
- (cal_component_set_classification): Ditto.
-
- * cal-util/cal-component.c (cal_component_free_text_list): Renamed
- from cal_component_free_description_list(). We can share this
- function since both comments and descriptions have the same form.
- (scan_text): Ditto.
- (get_text_list): New function.
- (set_text_list): New function.
- (cal_component_get_description_list): Use get_text_list().
- (cal_component_set_description_list): Use set_text_list().
- (cal_component_set_uid): Add sanity check.
- (cal_component_get_summary): Ditto.
- (cal_component_get_description_list): Ditto.
- (cal_component_get_dtstart): Ditto.
- (cal_component_get_dtend): Ditto.
- (cal_component_get_due): Ditto.
- (scan_property): Handle the COMMENT property.
- (cal_component_get_comment_list): Ditto.
- (cal_component_set_comment_list): Ditto.
-
-2000-07-02 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (scan_categories): Handle CATEGORIES.
- This can appear multiple times, so we maintain a list. We
- compress them later to a single property with multiple values.
- (cal_component_get_categories_list): Ditto.
- (cal_component_set_categories_list): Ditto.
- (cal_component_free_categories_list): Ditto.
- (free_icalcomponent): Properly free the mappings.
-
-2000-07-02 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (scan_datetime): Handle date/time and
- timezone pairs.
- (scan_property): Handle DTSTART and DTEND.
- (cal_component_free_datetime): Ditto.
- (get_datetime): Ditto.
- (cal_component_get_dtstart): Ditto.
- (set_datetime): Ditto.
- (cal_component_set_dtstart): Ditto.
- (cal_component_get_dtend): Ditto.
- (cal_component_set_dtend): Ditto.
- (scan_property): Handle DUE date.
- (cal_component_get_due): Ditto.
- (cal_component_set_due): Ditto.
-
-2000-07-01 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (cal_component_get_description_list):
- Handle the DESCRIPTION property. There can be multiple
- descriptions with parameters each, so we deal with a list instead
- of a single structure.
- (cal_component_set_description_list): Ditto.
- (cal_component_free_description_list): Ditto.
- (scan_property): Ditto.
- (scan_description): Ditto.
-
-2000-06-30 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c (cal_component_get_summary): To avoid
- passing a million parameters to setters/getters for properties
- that support parameters, we now pass client-side structures
- instead. Here we use CalComponentPropSummary.
- (cal_component_set_summary): Ditto.
-
-2000-06-29 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/component-factory.c: Make calendar die when evolution quits.
-
-2000-06-30 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.c: Change of plans. We use an
- icalcomponent from libical as our core representation so that we
- can preserve extension fields and fields that we don't (yet)
- support. CalComponent is just a wrapper with a nice API that
- provides non-iterative, random access to the ical's fields.
- (cal_component_destroy): Free the thing correctly.
- (cal_component_get_vtype): Re-implement in terms of icalcomponent.
- (cal_component_set_icalcomponent): New function to set the
- CalComponent's data from an existing icalcomponent.
- (cal_component_get_icalcomponent): New function.
- (cal_component_set_new_vtype): New convenience function to create
- an empty component.
- (scan_icalcomponent): Core scanning function.
- (scan_property): Another core scanning function.
- (cal_component_get_uid): Use the property directly.
- (cal_component_get_summary): Ditto. Handle the altrep parameter
- as well.
- (cal_component_set_summary): Ditto. Feel the pain, motherfucker.
- It is ridiculous how much code this involves.
- (scan_summary): Ditto.
-
-2000-06-29 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component-factory.c (owner_set_cb): Get an
- EvolutionShellClient instead of an Evolution_Shell to match the
- changes in libeshell.
-
-2000-06-29 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/Makefile.am: Do not link and include the pilot stuff for the
- calendar component, just for the Pilot conduit. Commented out the
- Pilot part so that Evolution can build. Sigh, we'll have to
- modify gnome-pilot to use OAF.
-
-2000-06-29 Peter Williams <peterw@helixcode.com>
-
- * gui/Makefile.am (LINK_FLAGS): Make the calendar-pilot-sync
- program conditional on HAVE_GNOME_PILOT, and add
- GNOME_PILOT_CFLAGS, GNOME_PILOT_LIBS, and PISOCK_LIBS in the
- appropriate places.
-
-2000-06-29 Seth Alves <alves@hungry.com>
-
- * pcs/cal.c (Cal_get_uid_by_pilot_id):
- (Cal_update_pilot_id):
- * pcs/cal-backend-imc.c (cal_backend_imc_update_pilot_id):
- (cal_backend_imc_get_uid_by_pilot_id):
- * pcs/cal-backend.c (cal_backend_get_uid_by_pilot_id):
- (cal_backend_update_pilot_id): server code to service these:
-
- * gui/calendar-pilot-sync.c: updated to make use of cal-client.
- also uses dirty bits on both sides to aid in syncing.
-
- * cal-client/cal-client.c (cal_client_get_uid_by_pilot_id): new
- function -- ask the cal server to return uid given an object's
- pilot id.
- (cal_client_update_pilot_id): new function -- inform the
- cal server of an objects pilot id and pilot dirty-flag.
-
-2000-06-28 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/cal-component.[ch]: New files for the new iCalendar
- component object. Today's properties: basic component type, UID,
- SUMMARY.
-
- * cal-util/Makefile.am: Added cal-component.[ch] to the list of
- sources.
-
-2000-06-27 Michael Meeks <michael@helixcode.com>
-
- * pcs/Makefile.am (INCLUDES): use BONOBO_VFS_GNOME_CFLAGS.
-
-2000-06-26 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/calendar-model.c: Added an #ifdefed value_to_string handler
- assignment.
-
-2000-06-26 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/calendar-model.c (calendar_model_duplicate_value):
- Implement.
- (calendar_model_initialize_value): Implement.
- (calendar_model_value_is_empty): Implement.
-
-2000-06-21 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-day-view.c (e_day_view_reshape_long_event): set event before
- using it!
- (e_day_view_init): used new colors from tigert.
-
-2000-06-21 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/e-day-view.c, gui/e-week-view.c: Remove the usage of the "x"
- and "y" arguments.
-
-2000-06-21 Damon Chaplin <damon@helixcode.com>
-
- * gui/gnome-cal.c (gnome_calendar_direction): changed so it keeps the
- selection range. It just moves it on one day/week etc. This makes
- it very handy for the keyboard shortcut code.
-
- * gui/calendar-commands.c (calendar_control_activate): fixed bug
- setting the radio button active.
-
- * gui/e-day-view.[hc]: added support for keyboard navigation and
- selection of the time range.
-
-2000-06-20 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/calendar-model.c (calendar_model_set_value_at): Implemented.
- (calendar_model_is_cell_editable): Implemented.
-
- * cal-client/cal-client.c (cal_client_update_object): Take in an
- iCalObject instead of a stringified version.
-
- * gui/gnome-cal.c (gnome_calendar_update_object): Removed.
- (gnome_calendar_remove_object): Removed.
- (save_ical_object_cb): Use the CalClient function.
-
- * gui/e-day-view.c (e_day_view_on_delete_occurrence): Likewise.
- (e_day_view_on_unrecur_appointment): Likewise.
- (e_day_view_finish_long_event_resize): Likewise.
- (e_day_view_finish_resize): Likewise.
- (e_day_view_key_press): Likewise.
- (e_day_view_on_editing_stopped): Likewise.
- (e_day_view_on_top_canvas_drag_data_received): Likewise.
- (e_day_view_on_main_canvas_drag_data_received): Likewise.
- (e_day_view_on_delete_appointment): Likewise.
-
- * gui/e-week-view.c (e_week_view_on_editing_stopped): Likewise.
- (e_week_view_key_press): Likewise.
- (e_week_view_on_delete_occurrence): Likewise.
- (e_week_view_on_unrecur_appointment): Likewise.
- (e_week_view_on_delete_appointment): Likewise.
-
- * gui/gncal-todo.c (ok_button): Likewise.
- (delete_todo): Likewise.
-
-2000-06-19 Damon Chaplin <damon@helixcode.com>
-
- * gui/event-editor-dialog.glade: tidied up dialog a bit, adding
- space etc.
-
- * gui/e-week-view.c (e_week_view_reshape_events): removed debug msg.
-
-2000-06-18 Ettore Perazzoli <ettore@helixcode.com>
-
- * cal-util/Makefile.am (INCLUDES): Include from
- `$(top_builddir)/libical/src/libical' too. [For the generated
- libical `icalversion.h' header.]
- * cal-client/Makefile.am (INCLUDES): Likewise.
-
-2000-06-18 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-day-view.c (e_day_view_on_top_canvas_drag_data_received):
- fixed a DnD bug.
-
-2000-06-17 Dan Winship <danw@helixcode.com>
-
- * cal-client/Makefile.am (INCLUDES): Fix to not depend on
- installed ical.h
-
-2000-06-17 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-week-view.c: added little buttons which are shown when there
- are more events than will fit in a day. Clicking on the button takes
- the user to the 1-Day view and shows the full day.
-
- * gui/e-day-view.c:
- * gui/e-week-view.c: set the "use_ellipsis" arg to TRUE for the EText
- items so we get tooltips automatically. Though we may want to use our
- own code to show tooltips so we can show the tips when the mouse is
- around the edges of the event box, and we may want to show the start
- and end times of the event in full.
-
- * gui/calendar-commands.c (calendar_control_activate):
- * gui/gnome-cal.h: added view_toolbar_buttons[] so we can access the
- radio buttons in the code easily. We need this if we want to jump to
- another view programmatically.
-
-2000-06-16 Damon Chaplin <damon@helixcode.com>
-
- * gui/jump.xpm: new icon for the EWeekView to jump to the day.
-
- * gui/Makefile.am (EXTRA_DIST): added jump.xpm
-
-2000-06-16 Damon Chaplin <damon@helixcode.com>
-
- * gui/calendar-model.c (calendar_model_class_init): #ifdef'ed out
- references to functions which don't exist yet, so evolution still
- compiles.
-
-2000-06-16 Damon Chaplin <damon@helixcode.com>
-
- * cal-util/test-recur.c: updated.
-
- * cal-util/cal-recur.[hc]: mostly finished, though it depends on the
- iCalObject struct being updated to support more of iCalendar.
-
-2000-06-16 Damon Chaplin <damon@helixcode.com>
-
- * pcs/.cvsignore: added icalendar-test.
-
-2000-06-15 Damon Chaplin <damon@helixcode.com>
-
- * cal-util/Makefile.am (test_recur_LDADD): use libical.a
-
-2000-06-15 Dan Winship <danw@helixcode.com>
-
- * cal-util/Makefile.am (noinst_PROGRAMS): merge the two separate
- noinst_PROGRAMS declarations into one so automake accepts it.
- (INCLUDES): include libical src dir so we don't depend on having
- ical.h already installed
-
-2000-06-14 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/calendar-model.c: GPtrArray cannot insert stuff in the
- middle of the array (!), so use plain GArray everywhere. Sigh.
-
-2000-06-13 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-client/cal-client.c (cal_client_get_object): Use vCalendar
- again.
-
- * cal-util/calobj.c (ical_object_find_in_string): From Seth, make
- it use vCalendar again.
-
-2000-06-13 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/calendar-model.c (obj_updated_cb): Juggle some eggs in
- asynchronous fashion. Finished implementing.
- (obj_removed_cb): Implemented. This one needs no juggling.
- (calendar_model_set_cal_client): Only load the objects if we have
- a client.
- (calendar_model_destroy): Disconnect from the client's signals.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Added
- calendar-model.[ch] to the list of sources.
-
- * pcs/cal-backend-imc.c (cal_backend_imc_get_n_objects): Doh,
- return the computed value.
-
-2000-06-13 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/calendar-model.c (CalendarModelPrivate): Added the array of
- objects and the hash table of UID->array index.
- (calendar_model_row_count): Return the length directly from the
- array instead of asking the Wombat.
- (calendar_model_value_at): Implemented.
- (calendar_model_new): Create an empty model. We provide a new
- setter function now.
- (calendar_model_construct): Removed function.
- (calendar_model_set_cal_client): New function to set the calendar
- client and object type at any time. This lets us reuse a calendar
- model object.
-
- * cal-util/calobj.h (iCalObjectField): Just report whether the
- object has alarms; not every single alarm.
-
-2000-06-13 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/Makefile.am (SHELL_OBJS): Removed.
- (evolution_calendar_LDADD): Link with
- `$(top_builddir)/shell/libeshell.a'.
-
-2000-06-09 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/component-factory.c (factory_fn): Pass NULL for the new args
- @create_folder_fn and @remove_folder_fn.
- (create_view): Updated to match the new
- `EvolutionShellComponentCreateViewFn'. Return
- `EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE' if type is not
- "calendar".
-
-2000-06-09 Federico Mena Quintero <federico@helixcode.com>
-
- * idl/evolution-calendar.idl (Cal): Added a get_n_objects()
- method.
-
- * pcs/cal-backend.c (cal_backend_get_n_objects): New function.
-
- * pcs/cal-backend-imc.c (cal_backend_imc_get_n_objects):
- Implemented.
-
- * pcs/cal.c (Cal_get_n_objects): Implemented.
-
- * cal-client/cal-client.c (cal_client_get_uids): Free the ev.
- (cal_client_get_n_objects): Implemented.
-
- * cal-util/calobj.h (iCalObjectField): New enumeration to identify
- the fields in an iCalObject.
-
-2000-06-08 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (event_editor_destroy): Free the private
- structure.
-
-2000-06-08 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/calobj.c (ical_object_to_vobject): Allow for NULL
- summaries.
-
-2000-06-07 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (toolbar): Added missing tooltips. We still
- need icons, though.
-
-2000-06-07 Seth Alves <alves@hungry.com>
-
- * cal-util/calobj.c (ical_object_find_in_string): put this back in,
- it's still used in cal-backend-imc.c:cal_backend_imc_update_object
-
- * cal-client/cal-client.c (cal_client_get_object): instead of
- returning a text representation, decode the text and return an
- iCalObject. Also added CalClientGetStatus which indicates
- success or type of failure.
-
- * cal-util/calobj.c (ical_object_find_in_string): #ifed out
- ical_object_find_in_string since it is unused now.
-
- * cal-client/client-test.c (list_uids): track get_object change
- * gui/calendar-commands.c (calendar_iterate): same
- * gui/e-day-view.c (e_day_view_update_event): same
- * gui/e-week-view.c (e_week_view_update_event): same
- * gui/print.c (print_day_details): same
- (print_day_summary): same
- (print_todo_details): same
- * gui/gnome-cal.c (trigger_alarm_cb): same
- * gui/gncal-todo.c (gncal_todo_update): same
-
-2000-06-06 Seth Alves <alves@hungry.com>
-
- * cal-util/icalendar.c, icalendar-save.c: fixed a bunch of problems
- * cal-util/calobj.c (ical_object_find_in_string): use libical
- instead of libversit
- (ical_object_to_string): same
- (dump_icalobject): prints the contents of an icalobject for debugging
-
- * gui/Makefile.am (LINK_FLAGS): link libical.a instead of libical.la
- so we don't have to modify the build system of the released libical
- * cal-client/Makefile.am (client_test_LDADD): same
- * cal-util/Makefile.am (icalendar_test_LDADD): same
-
-2000-06-06 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/calobj.c (ical_object_destroy): Removed from the public
- header; made static. Now everyone should use refcounting.
-
- * pcs/cal-backend-imc.c (free_ical_object): Use
- ical_object_unref().
- (remove_object): Likewise.
-
-2000-06-02 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/calendar-commands.c (print): New function to call the print
- engine.
- (calendar_toolbar): Added the Print button.
- (calendar_control_activate): Added the File/Print item.
-
- * gui/e-day-view.c (e_day_view_get_selected_time_range): Allow
- start_time and end_time to be NULL.
-
- * gui/e-week-view.c (e_week_view_get_selected_time_range):
- Likewise.
-
- * gui/print.c (range_selector_new): Show the range selector
- widgets. Use the correct radio group for all of them!
- (print_calendar): Do the dialog box here. We may want to split
- this function later into smaller chunks.
-
-2000-06-05 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-week-view-event-item.c (e_week_view_event_item_button_press):
- allow the right button to popup the menu, even when the event is
- being edited.
-
- * gui/e-week-view.c:
- * gui/e-day-view.c: Set the keyboard focus to the EDayView/EWeekView
- when the right button is clicked, so that any event being edited is
- saved before any action (e.g. opening the Event Editor dialog) is
- started. Note that this won't work if we switch to asynchronous
- notification.
-
-2000-06-02 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (tb_save_and_close_cb): Implemented.
- (toolbar): Added an icon for the Save and Close command.
- (save_ical_object): Recompute the title of the window here. Maybe
- it would be better to do it when we actually get the
- "object_changed" signal from the CalClient.
- (file_close_cb): Implemented.
-
-2000-06-02 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/gnome-cal.c (save_ical_object_cb): Implemented.
- (gnome_calendar_add_object): Removed function, since it was
- identical to gnome_calendar_update_object(). Modified the rest
- of the code to use only the latter.
- (gnome_calendar_remove_object): Be more paranoid about the UID.
- (gnome_calendar_update_object): Ditto. Also, renamed this
- function from gnome_calendar_object_changed(), for consistency
- with the lower-level CalClient interface.
-
- * gui/event-editor.c (event_editor_class_init): New
- "save_ical_object" signal to ask that our parent store the
- calendar object to the backend.
- (save_ical_object): New function to save the calendar object,
- actually if just emits the signal.
- (file_save_cb): Implemented.
- (dialog_to_ical_object): We want priv->
- alarm_program_run_program_entry (i.e. the entry inside the
- GnomeFileEntry), not the file entry itself.
- (dialog_to_ical_object): Only insert the recurrence ending date if
- the event is recurrent!
-
-2000-06-02 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/Makefile.am: Fixed EXTRA_DIST.
-
-2000-06-01 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/gnome-cal.c (editor_closed_cb): Handler for the
- "editor_closed" signal of the event editor; we just destroy it
- then.
-
- * gui/event-editor.c (app_delete_event_cb): Callback used when the
- dialog is closed. Release the iCalObject here instead of the
- event editor's destroy handler, and emit the new "editor_closed"
- signal.
-
-2000-06-01 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor-dialog.glade: Change of plans. The toplevel
- GnomeApp is now generated with Glade instead of being created in
- the program code. Otherwise we can't migrate the accelerators to
- the new toplevel and they won't work.
-
- * gui/event-editor.[ch]: EventEditor now derives from GtkObject.
- This lets us use the GnomeApp created by libglade and still have
- signals and stuff.
-
- * gui/event-editor.c (create_menu): Tell the UI handler that the
- menubar is the GnomeApp's existing one, not to create a new one.
- (create_toolbar): Tell the UI handler to use the GnomeApp's
- existing toolbar.
- (event_editor_focus): New function to raise/focus an event editor.
-
- * gui/gnome-cal.c (gnome_calendar_edit_object): Use
- event_editor_focus().
-
-2000-06-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/calendar-commands.c (calendar_control_activate): Put the
- toolbar into a frame to make it look like standard GNOME toolbars.
- Also, set `GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL' so that it does not
- do evil things when its moved to the left or the right of the
- window.
-
-2000-05-31 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/gnome-cal.h (GnomeCalendar): Added a hash table to map
- calendar objects to their respective event editors.
-
- * gui/gnome-cal.c (gnome_calendar_init): Create the
- object_editor_hash.
- (gnome_calendar_destroy): Free the object_editor_hash.
- (gnome_calendar_edit_object): New function to centralize the
- launching of event editors; if one already exists for a particular
- calendar object, we just raise its window.
- (edit): Use gnome_calendar_edit_object().
-
- * gui/calendar-commands.c (display_objedit): Use
- gnome_calendar_edit_object().
- (display_objedit_today): Likewise.
-
- * gui/e-day-view.c (e_day_view_on_new_appointment): Likewise.
- (e_day_view_on_edit_appointment): Likewise.
-
- * gui/e-week-view.c (e_week_view_on_new_appointment): Likewise.
- (e_week_view_on_edit_appointment): Likewise.
-
- * gui/event-editor.c (event_editor_new): Do not take in an
- iCalObject; rather provide an event_editor_set_ical_object()
- function. We need this because a single editor may be switched
- between different calendar objects. Also, do not show the event
- editor; leave it up to the client code.
- (event_editor_construct): Likewise.
- (clear_widgets): New function to clear the widgets to default
- values.
- (fill_widgets): New function to fill in the widgets from the
- iCalObject. We don't do this in init_widgets() anymore.
- (free_exception_clist_data): New function to free the exceptions
- clist data. We were leaking the row data.
- (init_widgets): Hook to the destroy signal of the exceptions
- clist.
- (event_editor_set_ical_object): New function. Now it also makes a
- copy of the calendar object for the event editor; clients do not
- need to copy it anymore.
- (event_editor_destroy): Unref the UI handler as well.
- (event_editor_class_init): New "ical_object_released" signal to
- notify the parent that we are no longer editing the calendar
- object.
- (make_title_from_ico): Handle NULL objects.
-
- * gui/event-editor.h (EventEditor): Removed fields that are no
- longer used.
-
-2000-05-31 Damon Chaplin <damon@helixcode.com>
-
- * cal-util/Makefile.am: added test-recur test program.
-
- * cal-util/test-recur.c: new file to test the recurrence code.
-
- * cal-util/.cvsignore: added test-recur.
-
- * cal-util/cal-recur.c: updated.
-
-2000-05-30 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor.c (event_editor_construct): Create the UI
- handler after we have constructed the parent GnomeApp.
- (main_menu): Menu template is now in place.
- (toolbar): Tollbar template is now in place.
- (create_toolbar): Turn off labels in the toolbar since it sucks;
- it should support non-homogeneous buttons with horizontal icons
- and text.
-
-2000-05-29 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/gnome-cal.c (gnome_calendar_object_changed): Removed the
- flags argument, since now we just proxy the calendar object to the
- calendar client.
-
- * gui/event-editor.c (alarm_unit_get): Moved over from
- event-editor-utils.c.
-
- * gui/event-editor-utils.[ch]: Removed files, since the two
- functions that were left there (i.e. the ones not present in
- e-dialog-widgets) can simply be moved to event-editor.c.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Removed
- event-editor-utils.[ch] from the list of sources.
-
-2000-05-27 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor-utils.c: Moved many functions to
- e-util/e-dialog-widgets.c.
-
-2000-05-25 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/event-editor-dialog.glade: Put the main notebook directly
- under a simple GtkWindow. We are going to pull out the notebook
- and slap it into our custom-built GnomeApp, anwyays.
-
- * gui/event-editor.c: Made the EventEditor derive from GnomeApp.
- Added a BonoboUIHandler for its menu and toolbar.
- (make_title_from_ico): Create a nice title for the window.
- (get_widgets): Fetch the Glade widgets here instead of all over
- the place.
- (event_editor_new): Temporary hack to show the dialog here, just
- so that I can test it.
-
- * gui/Makefile.am (EXTRA_DIST): Added the Glade messages file.
-
-2000-05-25 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/main.c (init_bonobo): Do not initialize libglade twice.
-
- * gui/component-factory.c (create_view): Set the folder_uri
- property, otherwise the calendar will not get loaded into the
- view.
-
-2000-05-25 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/main.c: Make it so that warnings don't crash calendar.
-
-2000-05-25 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/evolution-calendar-control.c: Removed.
-
- * gui/main.c: New.
-
- * gui/control-factory.c: New.
- * gui/control-factory.h: New.
-
- * gui/calendar-component-factory.c: New.
- * gui/calendar-component-factory.c: New.
-
- * gui/evolution-calendar-control.c (calendar_control_factory):
- Renamed from `calendar_factory'.
- (calendar_control_factory_init): Renamed from
- `calendar_factory_init'.
-
- * gui/Makefile.am: Link with the files from `$(builddir)/shell'.
-
- * gui/evolution-calendar.gnorba: New.
- * gui/evolution-calendar.oafinfo: New.
-
-2000-05-24 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/print.c (range_selector_new): New function to create the
- custom range selector.
- (print_dialog): New function to show the print dialog.
- (print_calendar): Use the print dialog.
-
-2000-05-24 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/Makefile.am: Added libepaned.a.
-
- * gui/gnome-cal.c: Switched from GtkPaned to EPaned.
-
-2000-05-22 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/calendar-commands.c (calendar_get_events_in_range): Removed
- function.
-
- * gui/mark.c (mark_month_item): Use
- cal_client_get_events_in_range().
-
- * gui/calendar-commands.c (show_year_view_clicked): Comment out,
- since we don't have a year view.
-
- * gui/gnome-cal.c (setup_widgets): Removed the year view stuff.
- (gnome_calendar_get_current_view_name): Likewise.
- (gnome_calendar_update_view_times): Likewise.
- (gnome_calendar_direction): Likewise.
- (gnome_calendar_set_view): Likewise.
- (gnome_calendar_update_all): Likewise.
- (gnome_calendar_object_updated_cb): Likewise.
- (gnome_calendar_object_removed_cb): Likewise.
- (gnome_calendar_time_format_changed): Likewise.
- (gnome_calendar_get_current_time_range): Likewise.
-
- * gui/gnome-cal.h (GnomeCalendar): Removed the year view stuff.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Added layout.[ch],
- print.[ch]. Removed quick-view.[ch], year-view.[ch] since they
- are no longer used. Removed all the old Pilot crap.
-
-2000-05-20 Damon Chaplin <damon@helixcode.com>
-
- * cal-util/cal-recur.[hc]: new files to implement iCalendar recurrence
- rules. These are only part finished, but people may like to check that
- the architecture seems OK.
-
-2000-05-17 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-day-view.c (e_day_view_on_delete_occurrence):
- * gui/e-week-view.c (e_week_view_on_delete_occurrence): use a copy of
- the iCalObject so we detect the change in the "update_event" callback.
- Maybe we should just update the view ourselves and then we wouldn't
- need to detect any change in the callback.
-
- * cal-util/calobj.c (ical_object_reset_recurrence): new function to
- get rid of any recurrence rules. Used when we 'unrecur' an event.
-
- * gui/e-day-view.c (e_day_view_key_press): don't add a new event if it
- won't fit, or we end up adding a new event for each key press.
- (e_day_view_update_event_label): don't update it if it doesn't have
- an EText item (i.e. it isn't visible).
-
- * gui/e-day-view-time-item.c: allow selection of times using this
- column.
-
-2000-05-19 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/timeutil.c (time_add_minutes): Fixed warning message.
- (time_add_day): Likewise.
- (time_add_month): Likewise.
- (time_add_year): Likewise.
- (time_from_day): Of all functions, *this* one had to have a bug.
- Set the tm.tm_isdst to -1 to specify that we don't know whether
- the time is in DST or not. This fixes *many* bugs upstream.
- (time_week_begin): Likewise. We never noticed this since the week
- functions are never used.
- (time_week_end): Likewise.
-
-2000-05-17 Seth Alves <alves@hungry.com>
-
- * gui/event-editor.c: hooked up more widget signals to callbacks
- to the gladified dialog acts more like the original one.
-
-2000-05-16 Seth Alves <alves@hungry.com>
-
- * gui/event-editor.c (recurrence_toggled): hook the radio buttons
- to the pages of the notebook.
- (append_exception):
- (recurrence_exception_added):
- (recurrence_exception_deleted):
- (recurrence_exception_changed): code to deal with the recurrence
- exception list.
-
-2000-05-15 Seth Alves <alves@hungry.com>
-
- * gui/event-editor.[ch]: gladeified replacement for eventedit.c
-
- * gui/event-editor-utils.[ch]: utilities used by event-editor.c
-
- * gui/event-editor-dialog.glade: glade file used by event-editor.c
-
-2000-05-14 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/gnome-cal.c (display_notification): Use the alarm
- notification dialog.
- (display_notification_cb): New callback for the result of the
- alarm notification dialog.
-
- * gui/dialogs/alarm-notify.glade: New file with the alarm
- notification dialog.
-
- * gui/dialogs/alarm-notify-dialog.[ch]: New file.
-
- * gui/dialogs/Makefile.am: New file.
-
- * gui/Makefile.am (SUBDIRS): Added the dialogs directory.
-
-2000-05-13 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/gnome-cal.c (trigger_alarm_cb): Better error checking, and
- plug leaks of str_ico and ico.
-
- * gui/evolution-calendar-control.c (main): Initialize libglade.
-
-2000-05-13 Ettore Perazzoli <ettore@helixcode.com>
-
- * pcs/Makefile.am (INCLUDES): Add
- `-I$(top_builddir)/libical/src/libical'.
-
-2000-05-12 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/calobj.c (generate): Use a (dtend - dtstart) offset to
- compute the ending time of the occurrence. This takes care of
- recurring events that span multiple days. Also, removed the DST
- condition since it did not look right at all: if you have a daily
- appointment at 18:00, it still should happen at 18:00 even during
- daylight savings.
-
- * gui/gnome-cal.c (gnome_calendar_tag_calendar): Use the timeutil
- functions instead of calculating the month's times by hand. Use
- cal_obj_instance_list_free() instead of freeing the list by hand.
- Clip the range we pass to mark_gtk_calendar_day().
- (mark_gtk_calendar_day): Fixed off-by-one error at the end of the
- month by adding real day offsets.
-
-2000-05-11 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/gnome-cal.c (add_alarms_for_object): New function to add
- today's alarms for a single object.
- (gnome_calendar_object_updated_cb): Update the object's alarms.
-
- * idl/evolution-calendar.idl (Cal): Added a
- get_alarms_for_object() method.
-
- * pcs/cal.c (Cal_get_alarms_for_object): Implemented method.
-
- * pcs/cal-backend.c (cal_backend_get_alarms_for_object): New
- function.
-
- * pcs/cal-backend-imc.c (cal_backend_imc_get_alarms_for_object):
- Implemented.
-
- * cal-client/cal-client.c (cal_client_get_alarms_for_object): New
- function.
-
-2000-05-11 Dan Winship <danw@helixcode.com>
-
- * gui/calendar-commands.c (calendar_control_activate): Now that we
- depend on current gnome-libs we can make the toolbar detachable
- again.
-
- * pcs/icalendar-save.c (timet_to_icaltime): remove unused timezone
- variable to make this compile on BSD systems (where timezone is
- the name of a function)
-
-2000-05-11 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/gnome-cal.c (gnome_calendar_update_all): Removed unused
- arguments. Load the initial alarms here.
- (load_alarms): New function to load a day's worth of alarms.
- (gnome_calendar_class_init): Eeeek! This was taking in an
- incorrect argument type.
- (gnome_calendar_init): Now the calendar keeps a hash table of
- UIDs->queued alarms. Create the hash table here.
- (gnome_calendar_destroy): Destroy the alarms hash table.
- (gnome_calendar_object_updated_cb): Remove the alarms for the
- object and regenerate them.
- (gnome_calendar_object_removed_cb): Remove the alarms for the
- object.
-
- * gui/alarm.c (alarm_add): Do not take in a CalendarAlarm, just
- the trigger time, the callback and the closure data. Return an
- opaque identifier for the alarm so that it can be removed by the
- client code if needed. Use the queue_alarm() helper function.
- (queue_alarm): Helper function to actually queue the alarm and set
- up the itimer. Deal with a nonzero return value from
- setitimer().
- (alarm_remove): New function to remove an alarm based on its ID.
- (pop_alarm): New helper function; pops the first alarm of the
- queue and resets the timer as appropriate.
- (alarm_ready): Simplified a lot by using pop_alarm().
-
- * idl/evolution-calendar.idl (Cal): Added get_alarms_in_range().
-
- * pcs/cal.c (build_instance_seq): New function to build a CORBA
- sequence from the internal list of instances.
- (Cal_get_events_in_range): Use build_instance_seq().
- (Cal_get_alarms_in_range): Implemented new method.
-
- * pcs/cal-backend.c (cal_backend_get_alarms_in_range): New
- function with the get_alarms_in_range() engine.
-
- * pcs/cal-backend-imc.c (cal_backend_imc_get_alarms_in_range):
- Implemented the get_alarms_in_range() method.
-
- * cal-client/cal-client.c (cal_client_get_alarms_in_range): New
- client-side function for getting the alarms.
- (build_instance_list): New helper function to build the
- CalObjInstance list from the CORBA sequence.
- (cal_client_get_events_in_range): Use build_instance_list().
-
- * gui/calendar-commands.h: #include <cal-util/calobj.h>. #include
- "gnome-cal.h".
-
- * gui/e-week-view.c: #include "calendar-commands.h" instead of
- main.h; the latter is an obsolete file and will be killed.
-
- * gui/evolution-calendar-control.c (main): Call init_bonobo()
- before anything else. We need the GTK+ object system initialized.
-
- * gui/Makefile.am (evolution_calendar_SOURCES): Do not use main.h.
-
- * cal-util/cal-util.c (cal_alarm_instance_list_free): New function.
-
-2000-05-10 Matt Loper <matt@helixcode.com>
-
- * gui/calendar-commands.c (calendar_control_activate): Move
- "about" menuitem to the help menu.
-
-2000-05-10 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/Makefile.am: Added main.h. Combined the two EXTRA_DIST
- sections.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * pcs/cal-backend-imc.c: Set the format when creating a new
- calendar.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * pcs/cal-factory.c: Removed double free of method_string in
- uri->method_string.
-
-2000-05-08 Ettore Perazzoli <ettore@helixcode.com>
-
- * pcs/cal.h: Include "calendar/pcs/evolution-calendar.h" instead
- of "evolution-calendar.h".
-
- * pcs/cal-backend.h: Include "calendar/pcs/evolution-calendar.h"
- instead of "evolution-calendar.h".
-
-2000-05-08 Seth Alves <alves@hungry.com>
-
- * gui/e-day-view.c (e_day_view_on_delete_appointment): call
- e_day_view_stop_editing_event here to avoid a divide by zero
- a bit further on. i'm not sure if this is the best fix for this.
-
-2000-05-08 Federico Mena Quintero <federico@helixcode.com>
-
- * pcs/cal-backend.h (CalBackendClass): CalBackendClass now is just
- an interface for calendar backends; this is an abstract class.
- Put in the vtable for the backend methods.
-
- * pcs/cal-backend.c (cal_backend_new): Removed function, since
- CalBackend is not just an abstract class.
- Removed implementation-specific functions and made public
- functions call the virtual methods instead.
-
- * pcs/cal-backend-imc.[ch]: New files with the CalBackendIMC
- implementation; this implements a backend for iCalendar and
- vCalendar files. Moved the implementation-specific stuff from
- cal-backend.[ch] to here.
-
- * pcs/cal-backend-imc.c (CalendarFormat): Moved enumeration to
- here. Added a CAL_UNKNOWN value for when the backend is not
- loaded yet.
- (cal_backend_imc_init): Initialize priv->format as CAL_UNKNOWN.
- (save_to_vcal): Use the same VCProdIdProp value as in
- cal-util/calobj.c. Use "1.0" as the VCVersionProp as per the
- vCalendar spec.
- (ensure_uid): Return nothing, since the result value need not be
- used anymore.
- (add_object): Since we mark the calendar as dirty anyways, we do
- not need to check the result value of ensure_uid() anymore.
- (remove_object): Asssert that we know how to handle the object's
- type. We do this in add_object() anyways.
-
- * pcs/Makefile.am (libpcs_a_SOURCES): Added cal-backend-imc.[ch].
-
- * gui/gnome-cal.c: Replaced debugging printf()s with g_message()
- so that we can see the line number where they occur.
-
- * gui/gnome-cal.c (gnome_calendar_load_cb): Sort of handle the
- LOAD_METHOD_NOT_SUPPORTED result code, and added a default for the
- switch.
-
- * cal-client/cal-listener.h (CalListenerLoadStatus): Removed
- enumeration; it is stupid to translate all values for the
- CalClient when it is going to translate them again.
- (CalListenerClass::cal_loaded): This signal now passes the
- LoadStatus directly from the CORBA side.
-
- * cal-client/cal-listener.c (Listener_cal_loaded): Do not
- translate the status value.
-
- * cal-client/cal-client.h (CalClientLoadStatus): Added the
- CAL_CLIENT_LOAD_METHOD_NOT_SUPPORTED error code.
-
- * cal-client/cal-client.c (cal_loaded_cb): Translate the CORBA
- version of the LoadStatus result code.
-
- * pcs/cal-factory.c (CalFactoryPrivate): New methods field for the
- hash table from method strings to the GtkTypes for backend class
- types.
- (cal_factory_init): Create the priv->methods hash table.
- (cal_factory_destroy): Free the priv->methods hash table.
- (cal_factory_register_method): New function to register a backend
- class for a particular URI method.
- (launch_backend_for_uri): New function to launch a backend for a
- particular URI's method.
- (load_backend): Use launch_backend_for_uri(). Move the error
- notification code from load_fn() to here.
- (create_backend): Use launch_backend_for_uri(). Move the error
- notification code form create_fn() to here; it is #ifdefed out
- since currently cal_backend_create() does not have any error
- reporting capabilities.
-
- * idl/evolution-calendar.idl (Listener::LoadStatus): Added a
- PROTOCOL_NOT_SUPPORTED error code.
-
- * pcs/cal-factory.c (cal_factory_load cal_factory_create): Removed
- functions, since they were supposed to be internal only.
- (CalFactory_load): Call queue_load_create_job() directly.
- (CalFactory_create): Likewise.
-
-2000-05-08 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-week-view.c (e_week_view_remove_event_cb):
- * gui/e-day-view.c (e_day_view_remove_event_cb): don't set the ico->uid
- to NULL or we won't find any other occurrences of the event. Set the
- editing_event_day/num to -1 instead.
-
- * gui/e-week-view-event-item.c (e_week_view_event_item_draw): fixed the
- positioning of the icons for long events.
-
- * cal-util/calobj.c (ical_object_normalize_summary): forgot to
- terminate the string.
-
-2000-05-07 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-day-view.c (e_day_view_on_main_canvas_drag_data_received):
- (e_day_view_on_top_canvas_drag_data_received): show the EText item,
- just in case it hasn't moved, otherwise it won't appear.
-
- * gui/e-day-view.h (E_DAY_VIEW_BAR_WIDTH): increased from 6 to 8 to
- make it easier to drag an event. Also increased E_DAY_VIEW_GAP_WIDTH
- since it must be >= the BAR_WIDTH.
-
-2000-05-07 Matt Loper <matt@helixcode.com>
-
- * gui/evolution-calendar-control.c (PROPERTY_CALENDAR_URI):
- Changed to "folder_uri" from "calendar_uri".
- (set_prop): The uri given to us is a directory, so we append a
- filename onto the end before we use it.
-
-2000-05-06 Damon Chaplin <damon@helixcode.com>
-
- * cal-util/timeutil.c (time_day_begin):
- (time_day_end): changed these so they just do a simple localtime(),
- update the struct tm, then do a mktime(). I don't know why it used to
- look at the tm_isdst flags etc. From a little test program I wrote
- which steps through testing every hour for a year it wasn't working
- correctly, and the new code does.
- (time_add_day): also got rid of the stuff that looked at tm_isdst here.
- My test program now works better.
-
-2000-05-06 Chris Toshok <toshok@helixcode.com>
- * gui/.cvsignore: ignore evolution-calendar.pure
-
- * gui/Makefile.am: add support for building evolution-calendar.pure
-
-2000-05-06 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-day-view.c:
- * gui/e-week-view.c: finish editing event when user hits Return key.
- (e_week_view_on_text_item_event): stop event signals after doing any
- other calls, since otherwise it will also stop any other resulting
- event signals.
-
- * gui/e-week-view-event-item.c (e_week_view_event_item_draw): don't
- draw the start/end times while editing.
-
- * gui/eventedit.c: changed the Summary field to a GtkEntry, since we
- now only want a single line of text.
-
- * cal-util/calobj.c (ical_object_normalize_summary): new function to
- convert the summary field to a single line of text, by converting any
- sequence of CR & LF characters to a single space.
- (ical_object_create_from_vobject): call the above function. I think
- all functions that load iCalObjects go through this.
- (ical_new): called it here as well just in case.
-
-2000-05-06 Damon Chaplin <damon@helixcode.com>
-
- * gui/week-view.[hc]: removed.
-
-2000-05-06 Damon Chaplin <damon@helixcode.com>
-
- * gui/gncal-day-panel.[hc]:
- * gui/gncal-day-view.[hc]:
- * gui/gncal-full-day.[hc]:
- * gui/gncal-week-view.[hc]:
- * gui/layout.[hc]:
- * gui/view-utils.[hc]: removed old calendar view files.
-
-2000-05-06 Damon Chaplin <damon@helixcode.com>
-
- * cal-util/calobj.[hc]: added guint ref_count to iCalObject struct,
- and ical_object_ref/unref() functions. I've updated all the gui/
- stuff to use ref_counts but I haven't touched the pcs/ stuff. Maybe
- just using ical_object_destroy() is OK there.
-
- * gui/gncal-todo.c:
- * gui/calendar-commands.c:
- * gui/eventedit.c:
- * gui/e-week-view.c:
- * gui/e-day-view.c: use refcounting for iCalObjects.
-
- * gui/e-day-view-main-item.c:
- * gui/e-day-view-top-item.c:
- * gui/e-day-view.c: try not to ever draw outside the event, even when
- the event is very small.
-
-2000-05-05 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-day-view.c: don't allow recurring events to be resized or
- dragged, and don't show the resize/drag cursors. Actually it may be
- better to let the user do the resize/drag and then ask them what they
- want to do - change the single occurrence or the entire series.
-
- * gui/e-day-view-time-item.c (e_day_view_time_item_show_popup_menu):
- use e_auto_kill_popup_menu_on_hide() to destroy the popup menu.
-
- * gui/popup-menu.c: include e-gui-utils.h
-
-2000-05-04 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-day-view.c (e_day_view_foreach_event_with_uid): for the long
- events pass E_DAY_VIEW_LONG_EVENT as the day. Fixes SEGV.
-
- * gui/calendar-commands.c: when we switch views, grab the focus.
-
- * gui/gnome-cal.c (gnome_calendar_tag_calendar):
- (gnome_calendar_mark_gtk_calendar_day): changed this so it uses
- cal_client_get_events_in_range(), and doesn't load any objects.
- Also just return if it isn't visible.
-
- * gui/calendar-commands.c (calendar_get_events_in_range): call
- g_list_sort() to sort the list rather than g_list_insert_sorted() for
- each element. It is much more efficient.
- Also changed it so that the co->ev_start/end fields are copied from
- the CalObjInstance rather than the parameters to the function
- (that is right, isn't it?)
- Also freed the list elements, and finally the list.
- (calendar_iterate): changed this to use cal_client_get_events_in_range
- since that is more efficient than getting all the uids and then loading
- and parsing all the events.
-
- * pcs/cal-backend.c (save): output the '... saved' message before
- freeing the string!
-
- * gui/gncal-todo.c (gncal_todo_update):
- * gui/e-week-view.c (e_week_view_update_event):
- * gui/e-day-view.c (e_day_view_update_event):
- * gui/calendar-commands.c (calendar_get_events_in_range):
- (calendar_iterate): free obj_string after it is parsed.
-
-2000-05-02 Damon Chaplin <damon@helixcode.com>
-
- * gui/calendar-commands.c (calendar_control_activate): set the active
- radio button here. Oops - it wasn't a Bonobo problem after all.
-
- * gui/popup-menu.c (popup_menu): added call to
- e_auto_kill_popup_menu_on_hide() to destroy the menu.
-
- * gui/e-week-view.c (e_week_view_show_popup_menu):
- * gui/e-day-view.c (e_day_view_on_event_right_click): ico->user_data
- isn't useful any more, since the event editor keeps its own iCalObject.
- So for now we make the menu commands available even when the event is
- being edited in the event editor.
- Also corrected misspellings of 'occurance' -> 'occurrence'.
-
- * gui/eventedit.c (event_editor_destroy): destroy the iCalObject.
- The event editor now uses its own independent iCalObject.
-
- * gui/e-week-view.c (e_week_view_on_unrecur_appointment):
- * gui/e-day-view.c (e_day_view_on_unrecur_appointment): create a new
- uid for the new single instance. I'm not sure what we should do about
- the creation/last modification times of the objects.
-
- * gui/e-week-view.c (e_week_view_on_edit_appointment):
- * gui/e-day-view.c (e_day_view_on_edit_appointment): duplicate the
- iCalObject before passing it to the event editor, since it will change
- the fields. If we don't duplicate it we won't know what has changed
- when we get the "update_event" callback.
-
- * gui/e-week-view.c (e_week_view_key_press):
- * gui/e-day-view.c (e_day_view_key_press): set the created and last_mod
- times of the new iCalObject. We may want to set the default alarm as
- well.
-
- * cal-util/calobj.c (ical_gen_uid): made this function public so we
- can generate new uids if necessary.
-
-2000-05-01 Damon Chaplin <damon@helixcode.com>
-
- * gui/gnome-cal.[hc] (gnome_calendar_get_current_time_range): new
- function to get the currently seleted time range form the current view.
-
- * gui/calendar-commands.c (display_objedit): use the above function
- to get the time for the new appointment.
-
- * gui/e-week-view.c:
- * gui/e-day-view.c: use a shallow copy of the ico when we update the
- times (when resizing/dragging). Otherwise we won't detect that the
- time has changed in the "update_event" callback.
-
- Also added functions to get the currently selected time range.
-
-2000-04-30 Seth Alves <alves@hungry.com>
-
- * pcs/icalendar-save.c (icalcomponent_create_from_ical_object): set
- attendee and contact address correctly.
-
- * pcs/cal-backend.c (icalendar_calendar_load): init priv->object_hash
- when loading.
- (cal_get_type_from_filename): if file extension is .ical, consider
- the file an ical file.
-
-2000-05-01 Damon Chaplin <damon@helixcode.com>
-
- * cal-util/calobj.c (ical_object_compare_dates): new function to see
- if the event dates have changed (including any recurrence rules).
- It is used for optimization when we get the "object_changed" signal.
- We have to do far less work if the dates are unchanged.
-
- * gui/e-week-view.c:
- * gui/e-day-view.c: only draw the selection when we have the keyboard
- focus, since the user expects to be able to type in a new event when
- the selection is shown. Also keep the selection when we lose focus,
- but just don't show it.
-
- Also quite a few changes to cope with the new client/server
- architecture.
-
- * gui/e-day-view-top-item.c (e_day_view_top_item_draw):
- * gui/e-day-view-main-item.c (e_day_view_main_item_draw):
- * gui/e-week-view-main-item.c (e_week_view_main_item_draw_day):
- only draw the selection if the widget has the keyboard focus.
-
- * gui/gnome-cal.c (mark_gtk_calendar_day): fixed so it works with
- events longer than one day. And changed the code for updating events
- in the new views.
-
-2000-04-27 Ettore Perazzoli <ettore@helixcode.com>
-
- * gui/evolution-calendar-control.c
- (init_bonobo): OAFized.
-
- * gui/main.c (main): Initialize with OAF if `USING_OAF'.
-
- * gui/evolution-calendar-control.c: New #define
- `CONTROL_FACTORY_ID', varying according to whether we are
- `USING_OAF'.
- (calendar_factory_init): Use `CONTROL_FACTORY_ID'.
-
- * gui/Makefile.am: Updated for OAF.
-
- * pcs/cal-factory.h: Explicitly #include
- "calendar/pcs/evolution-calendar.h" instead of just
- "evolution-calendar.h".
-
- * cal-client/cal-client.c (cal_client_construct) [USING_OAF]: Use
- OAF.
-
- * cal-client/client-test.c (init_corba): New function, implemented
- differently depending on `USING_OAF'.
-
-2000-04-27 <alves@hungry.com>
-
- * pcs/cal-backend.c (cal_backend_load): fix memory leak
- (save_to_vcal): same
- (save): same
- (cal_backend_load): same
-
-2000-04-26 Christopher James Lahey <clahey@helixcode.com>
-
- * cal-util/.cvsignore: Replaced libcal-util.la with *.la
-
- * pcs/.cvsignore: Added *.la and *.lo.
-
-2000-04-25 Federico Mena Quintero <federico@helixcode.com>
-
- * pcs/cal-factory.c (backend_last_client_gone_cb): Renamed from
- backend_destroy_cb. Now we use it for the "last_client_gone"
- signal from the backend. Also, unref the backend to destroy it.
- (add_backend): Connect to the "last_client_gone" signal of the
- backend.
- (cal_factory_get_n_backends): New function to query the number of
- running backends.
-
- * pcs/cal-backend.c (cal_backend_class_init): Register the new
- "last_client_gone" signal. It is emitted when the last Cal client
- goes away. It is used to notify the factory when a backend may be
- safely destroyed.
- (cal_destroy_cb): Emit the "last_client_gone" signal when the last
- client disconnects from the backend.
-
-2000-04-25 Seth Alves <alves@hungry.com>
-
- * gui/e-day-view.c (e_day_view_find_event_from_ico): compare
- iCalObjects by their UIDs instead of by their pointers.
-
- * pcs/cal-backend.c (cal_backend_destroy): don't save on destroy.
-
-2000-04-25 Ettore Perazzoli <ettore@helixcode.com>
-
- * cal-client/Makefile.am: Add `$(datadir)/idl'.
-
- * pcs/Makefile.am (idl_flags): Add `$(datadir)/idl'.
- (INCLUDES): Use `$(BONOBO_GNOME_CFLAGS)'.
-
-2000-04-25 Seth Alves <alves@hungry.com>
-
- * gui/gnome-cal.c (gnome_calendar_destroy): hook for widget
- destroy -- used to unref the CalClient so wombat knows we are gone.
- (gnome_calendar_class_init): added a class init for this widget.
-
- * gui/e-day-view.c (e_day_view_update_event): allow for null ico
-
- * gui/e-week-view.c (e_week_view_update_event): allow for null ico
-
-2000-04-24 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-client/client-test.c (main): The path to the test calendar
- changed when we moved stuff around. Users will have to tweak this
- for their CVS setup, anyways.
- (create_client): Create or load the calendar as appropriate.
- (client_destroy_cb): Exit the main loop if both clients are gone.
- (main): Connect to the "destroy" signal of the clients so that we
- can terminate the test program.
-
-2000-04-24 Seth Alves <alves@hungry.com>
-
- * pcs/icalendar.c (parse_person): allow for null CN
- (parse_person): allow for null sent_by
-
- * pcs/Makefile.am: build icalendar-test
-
- * pcs/icalendar-test.c: a test which loads an ical file and
- converts it to our internal format, and then saves it back out.
-
-2000-04-24 Damon Chaplin <damon@helixcode.com>
-
- * gui/Makefile.am: added new source files and pixmaps, and removed
- old source files, which can be deleted.
-
- * gui/e-week-view-titles-item.[hc]:
- * gui/e-week-view-main-item.[hc]:
- * gui/e-week-view-event-item.[hc]:
- * gui/e-week-view.[hc]: new files implementing the week/month views.
-
- * gui/yearview.xpm:
- * gui/monthview.xpm:
- * gui/weekview.xpm:
- * gui/workweekview.xpm:
- * gui/dayview.xpm: new pixmaps for the toolbar buttons. These aren't
- intended to be the final pixmaps.
-
- * gui/calendar-commands.c: added radio buttons to the toolbar to
- switch between the calendar views, and moved the am_pm_flag here so we
- can get rid of view-utils.c.
-
- * gui/gnome-cal.[hc]: made it a subclass of GtkVBox, rearranged the
- widgets into 2 notebooks, and added the selection_start_time and
- selection_end_time fields.
-
- * gui/goto.c: updated to use new selection time range.
-
- * gui/quick-view.c: added '#include <gtk/gtkwindow.h>' so it compiles.
-
- * gui/e-day-view.[hc]: changed the interface to support the new
- selection time range, got rid of a few debugging messages and changed
- a few bits.
-
-2000-04-21 Seth Alves <alves@hungry.com>
-
- * pcs/icalendar-save.c: start on code to do the opposite of
- icalendar.c (convert from iCalObjects to libical's icalcomponents).
-
- * gui/calendar-commands.c (calendar_control_activate): moved
- "About Calendar" into the View menu so it shows up.
-
-2000-04-20 Seth Alves <alves@hungry.com>
-
- * gui/gnome-cal.c (gnome_calendar_changed_cb): new function: callback
- for listener's object updated signal.
- (gnome_calendar_object_removed_cb): new function: callback for
- listener's object removed signal.
- (gnome_calendar_new): hook up listener's "obj_updated" and
- "obj_removed" signals so if evolution is running twice,
- they will both see changes right away.
- (gnome_calendar_object_changed): don't call update_all, since
- it will be called by the listener.
- (gnome_calendar_remove_object): don't call update_all
- (gnome_calendar_add_object): don't call update_all
-
- * gui/gncal-full-day.c (child_realize): create fullday's gcs
- even if pixmap_bell has already been created. this was
- causing crashes if the calendar was run twice.
-
-2000-04-19 Seth Alves <alves@hungry.com>
-
- * gui/eventedit.c (ee_rp_init_rule): changed the order around
- a bit to avoid a Gtk-CRITICAL crash
-
- * gui/gncal-todo.c (gncal_todo_update): fixed code to populate
- the todo clist
-
- * cal-client/cal-client.c (cal_client_get_uids): don't check
- type against CALOBJ_TYPE_ANY since it will always match.
- (cal_client_get_uids): same (re: CALOBJ_TYPE_ANY)
-
- * pcs/cal-backend.c (build_uids_list): same (re: CALOBJ_TYPE_ANY)
-
- * pcs/cal.c (Cal_get_uids): same (re: CALOBJ_TYPE_ANY)
-
- * pcs/cal-backend.c (remove_object): don't call save from here
- because in all cases the caller of remove_object calls save
-
- * gui/calendar-commands.c (calendar_set_uri): calls gnome_calendar_open
- instead of checking on disk and calling load or create.
-
- * gui/gnome-cal.c (gnome_calendar_object_changed): fixed to use
- cal_client_update_object -- editing and dragging events works again
- (gnome_calendar_open): collapsed gnome_calendar_load and
- gnome_calendar_create into this function. added new type
- GnomeCalendarOpenMode which has the value CALENDAR_OPEN or
- CALENDAR_OPEN_OR_CREATE.
-
- * gui/evolution-calendar-control.c (calendar_properties_init): create
- a property bag for this control
- (set_prop): callback for property sets
- (get_prop): callback for proprety gets
-
- * gui/calendar-commands.c (calendar_set_uri): new function,
- called when the "calendar_uri" property is set on the calendar-
- control's property bag.
-
-2000-04-18 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/Makefile.am (INCLUDES): Fix include path.
-
-2000-04-16 Federico Mena Quintero <federico@helixcode.com>
-
- * pcs/cal-factory.h (CalFactoryClass): We have a new
- "last_calendar_gone" signal that Wombat can use to terminate
- itself properly.
-
- * pcs/cal-factory.c (cal_factory_class_init): Register the
- "last_calendar_gone" signal.
- (backend_destroy_cb): Emit the "last_calendar_gone" signal instead
- of killing the factory.
-
- * pcs/Makefile.am: Added $(CORBA_GENERATED) to BUILT_SOURCES.
- (INCLUDES): Make the log domain be "wombat-pcs".
-
-2000-04-17 Seth Alves <alves@hungry.com>
-
- * pcs/cal-backend.c (add_object): removed implicit save, since
- we don't want to save as we load from disk.
- (cal_backend_update_object): added a call to save, since it
- isn't done by add_object now.
-
-2000-04-16 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-util/Makefile.am: Renamed library from libcalutil to
- libcal-util, to be consistent with libcal-client. Install header
- files in $(includedir)/evolution/cal-util.
- (INCLUDES): Add "cal-util" log domain for glib.
- (libcal_clientincludedir): The header files are now installed in
- $(includedir)/evolution/cal-client.
-
- * cal-util/cal-util.h: Fix includes.
-
- * cal-client/client-test.c: Fix includes.
-
- * pcs/Makefile.am: Create libpcs.a, not a shared library, because
- it is for internal use by Wombat only. The header files should
- not be installed, either. Removed all the old Tlacuache stuff.
-
- * gui/Makefile.am (EXTRA_DIST): We no longer distribute
- gncal.desktop.
- (evolution_calendar_INCLUDES): Add "calendar-gui" for the glib log
- domain.
-
- * gui/*.[ch]: Fix cal-util and cal-client includes.
-
- * pcs/Makefile.am (INCLUDES): Added "pcs" log domain for glib.
-
- * pcs/*.[ch]: Fix cal-util includes.
-
-2000-04-11 Chris Toshok <toshok@helixcode.com>
-
- * pcs/icalendar.c (icaltime_to_timet): use HAVE_TIMEZONE to switch
- between linux's timezone variable and *bsd's method of getting the
- gmt offset.
-
-2000-04-10 Seth Alves <alves@hungry.com>
-
- * pcs/cal-backend.c (save_to_vcal): create and save an actual
- vcalendar instead of a list of vcal objects.
-
-2000-04-10 Damon Chaplin <damon@helixcode.com>
-
- * gui/Makefile.am (INCLUDES): moved srcdir directories to the top so
- we search headers in the evolution tree before installed headers.
- (Otherwise when you do 'make install' lots of files in gui/ get
- rebuilt, since they depend on the installed cal-client.h which has just
- been updated.)
-
-2000-04-09 Seth Alves <alves@hungry.com>
-
- * gui/gnome-cal.c (gnome_calendar_load): catch cal_loaded signal
- on the cal client.
- (gnome_calendar_load_cb): callback for cal_loaded signal. moved
- gnome_calendar_update_all from gnome_calendar_load to here.
-
- * gui/calendar-commands.c: minor cleanups
-
- * pcs/cal-backend.c (save_to_vcal): copied code from gnome-pim
- to write vcal to a file
- (save): filled it with more gnome-pim code
- (add_object): call save () after changing
- (remove_object): same
- (cal_backend_create): same
- (cal_backend_remove_object): same
-
-2000-04-08 Christopher James Lahey <clahey@helixcode.com>
-
- * gui/Makefile.am: Removed linking with libetable and libeminicard
- since they weren't being used.
-
-2000-04-08 Seth Alves <alves@hungry.com>
-
- * gui/gnome-cal.c (gnome_calendar_create): new function:
- friendly wrapper for cal_client_create_calendar
-
- * gui/calendar-commands.c (new_calendar): call gnome_calendar_create
- if no filename is provided
-
- * gui/prop.c (properties): calendar is a frame
-
- * gui/calendar-commands.c (calendar_control_activate): sort out the
- menus a bit, more of them show up now.
-
- * gui/Makefile.am: don't build library or test, just the bonobo control
-
- * gui/gncal-todo.c (simple_todo_editor): calendar is a frame instead
- of a window, now.
-
- * gui/gnome-cal.c (gnome_calendar_new): same
-
- * gui/goto.c (goto_dialog): same
-
-2000-04-06 Seth Alves <alves@hungry.com>
-
- * gui/calendar-commands.c (calendar_control_activate): removed
- uih from the argument list, added cal. use cal as user_data
- in callbacks rather than the control.
- (calendar_control_deactivate): removed uih from argument list
-
-2000-04-05 Seth Alves <alves@hungry.com>
-
- * gui/calendar-commands.c (setup_menu): removed
- (setup_appbar): removed
- (calendar_control_activate): new function -- does the work
- that setup_appbar and setup_menu used to do.
- (calendar_control_deactivate): undoes what calendar_control_activate
- does by removing the toolbar items and menu items.
-
- * gui/Makefile.am: build test-calendar-widget and evolution-calendar,
- common stuff is in a library
-
- * gui/gnome-cal.c (gnome_calendar_get_type): made the calendar widget
- based on a gtk_frame rather than a gnome_app
-
- * gui/calendar-commands.c: split out some of main.c
-
- * gui/evolution-calendar-control.c: bonobo bung so evolution
- can use the calendar widget
-
-2000-04-01 Matt Loper <matt@helixcode.com>
-
- * pcs/.cvsignore: Added *.lo.
-
-2000-03-30 Seth Alves <alves@hungry.com>
-
- * gui/main.c (calendar_get_events_in_range):
- cal_client_get_events_in_range returns a list of CalObjInstance *, not
- a list of (char *) uid.
-
- * Makefile.am (SUBDIRS): readded the gui directory
-
- * gui/main.c: temporarily added alarm_defaults back in,
- since the calendar doesn't link without it
-
-2000-03-29 Matt Loper <matt@helixcode.com>
-
- * Makefile.am: remove the gui directory, which doesn't compile.
-
-2000-03-28 Matt Loper <matt@helixcode.com>
-
- * pcs/Makefile.am: create a libpcs.la library, for use in the
- wombat.
-
-2000-03-28 Seth Alves <alves@hungry.com>
-
- * gui/Makefile.am (LINK_FLAGS): added libeutil.la and libetext.a
-
- * gui/main.c (calendar_iterate): switch from string_to_ical_object to
- ical_object_find_in_string
- (calendar_get_events_in_range): same
- (session_save_state): commented out references
- to gcal->client->filename
-
-2000-03-27 Federico Mena Quintero <federico@helixcode.com>
-
- * pcs/cal-backend.c (cal_backend_get_object): Use
- ical_object_to_string().
-
- * cal-util/calobj.c (ical_object_to_string): Moved over from
- pcs/cal-backend.c (was string_from_ical_object).
- (get_calendar_base_vobject): Likewise, moved over from
- pcs/cal-backend.c.
-
- * cal-util/cal-util.c: Removed string_to_ical_object(); the
- correct function is in calobj.[ch], called
- ical_object_find_in_string(). Removed ical_object_to_string,
- since we now implement it in calobj.c.
-
- * cal-util/calobj.c: Removed ical_object_new_from_string(); see
- above.
-
- * idl/evolution-calendar.idl (CalObjInstance): Calendar object
- instances now contain only the UID for the object, not the whole
- string representation of the object. This allows clients to
- implement caching of objects if they wish.
-
- * pcs/cal.c (Cal_get_events_in_range): Likewise.
-
- * pcs/cal-backend.c (build_event_list): Likewise.
-
- * cal-client/cal-client.c (cal_client_get_events_in_range):
- Likewise.
-
- * cal-util/cal-util.h (CalObjInstance): Likewise.
-
- * cal-util/cal-util.c (cal_obj_instance_list_free): Likewise.
- (cal_obj_uid_list_free): Assert that the UIDs in the list are not
- NULL.
-
- * pcs/tlacuache.gnorba (repo_id): The calendar factory also
- supports the Unknown interface.
-
-2000-03-17 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/e-day-view.c: Fix includes.
- (e_day_view_on_delete_occurance): Do not call save_default_calendar().
- (e_day_view_on_delete_appointment): Likewise.
- (e_day_view_on_unrecur_appointment): Likewise.
- (e_day_view_finish_long_event_resize): Likewise.
- (e_day_view_finish_resize): Likewise.
- (e_day_view_key_press): Likewise.
- (e_day_view_on_editing_stopped): Likewise.
- (e_day_view_on_top_canvas_drag_data_received): Likewise.
- (e_day_view_on_main_canvas_drag_data_received): Likewise.
-
-2000-03-13 Damon Chaplin <damon@helixcode.com>
-
- * gui/e-day-view*.[hc]: new files for the Day/Work-Week views.
-
-2000-03-12 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/main.c (gnome_calendar_locate): Removed function now that it
- is no CORBA server in the GUI.
- (save_default_calendar): Removed function. Now the personal
- calendar server will take care of saving modified calendars when
- appropriate.
- (close_cmd): Do not call unregister_calendar_services().
-
- * gui/eventedit.c (ee_ok): Do not save the calendar.
-
- * gui/gncal-day-panel.c (day_view_range_activated): Likewise.
-
- * gui/gncal-todo.c (ok_button): Likewise.
- (delete_todo): Likewise.
-
- * gui/gncal-full-day.c (delete_occurance): Likewise.
- (delete_appointment): Likewise.
- (unrecur_appointment): Likewise.
- (child_focus_out): Likewise.
- (update_from_drag_info): Likewise.
-
- * gui/gnome-cal.c (gnome_calendar_new): Removed obsolete call to
- create the CORBA server.
-
- * gui/gnome-cal.h (GnomeCalendar): Renamed `calc' field to
- `client'.
-
- * cal-client/cal-client.h (CalClient): Removed filename and
- corba_server fields.
-
-2000-03-10 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/main.c (main): Do not pass the INIT_SERVER flag to
- gnome_CORBA_init_with_popt_table(). Check for exceptions
- properly.
- (main): Initialize Bonobo.
- (main): Call process_dates() to parse the dates from the command
- line before we dump the events or the TODOs.
- (main): Use bonobo_main() instead of gtk_main().
-
- * cal-util/calobj.c (ical_new): Initialize the alarm types here.
- Do not call default_alarm() anymore, since that is a GUI issue.
- (default_alarm): Removed function.
- (alarm_defaults): Removed defaults data.
-
- * pcs/tlacuache.c (calendar_notify): Removed stubs for
- alarm_defaults, calendar_notify(), debug_alarms.
-
-2000-03-09 Federico Mena Quintero <federico@helixcode.com>
-
- * gui/Makefile.am: Removed the corba-cal stuff. Commented out the
- Pilot conduit stuff for now.
-
- * gui/calendar.c: Random #ifdefs to make it build, although this
- file is going away.
-
- * gui/Makefile.am: Removed referenes to calobj.[ch] and timeutil.[ch].
-
- * gui/calendar-conduit.c: Fixup includes.
-
- * gui/calendar-conduit.h: Fixup includes.
-
-2000-03-09 Seth Alves <alves@hungry.com>
-
- * gui/gnome-cal.h: replaced "Calendar *cal" with "CalClient *calc"
- in the GnomeCalendar struct.
-
- * gui/*.c: tracked change from Calendar * to CalClient
-
- * gui/main.c: moved alarm_defaults from here to cal-util/calobj.c
- (calendar_get_events_in_range): pulled this out of calendar.c and
- fixed it up to use cal-client stuff. i'm not sure where to put it yet.
-
- * gui/main.c (calendar_iterate): pulled this one out of calendar.c also
-
-2000-03-07 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-client/Makefile.am: Removed cal-client-alarm.[ch] from the
- list of sources. This was a miscommunication on our part.
-
-2000-03-05 Seth Alves <alves@hungry.com>
-
- * cal-client/cal-client-alarm.c: stubs for client side
- access to alarm structures. this will probably change,
- since i don't know what i'm doing.
-
- * cal-util/alarm-enums.h: enums for alarms needed by
- both the client and the server
-
- * remaining source files in calendar/... have been moved
- to calendar/gui.
-
- * gui/alarm.c: start to decouple the view from the model
- in the alarm editing code
-
-2000-03-03 Seth Alves <alves@hungry.com>
-
- * cal-util/Makefile.am: new file -- things shared between
- the client and server go in this directory
-
- * calobj.c calobj.h icalendar.c icalendar.h
- timeutil.c timeutil.h cal-util.c cal-util.h where moved
- backend stuff went into pcs. shared stuff went into
- cal-util.
-
-2000-03-02 Federico Mena Quintero <federico@helixcode.com>
-
- At this point the calendar client and personal calendar server
- files were moved to the idl/, cal-client/, and pcs/ directories.
-
- * idl/Makefile.am: New file.
-
- * cal-client/Makefile.am: New file. Moved the libcal-client stuff
- from calendar/Makefile.am to here.
-
- * pcs/Makefile.am: New file. Moved the tlacuache stuff from
- calendar/Makefile.am to here.
-
- * Makefile.am (SUBDIRS): Added the idl and cal-client directories.
-
- * calendar.h: Removed the references to cal-backend.h and its
- stuff. This file is going away soon!
-
- * icalendar.c: #include <config.h>. Also, we don't need to
- include cal-backend.h or gnome.h.
-
- * icalendar.h: Protect from multiple inclusions.
-
-2000-03-01 Federico Mena Quintero <federico@helixcode.com>
-
- * Makefile.am: Use the gnome-config flags for orbit-idl.
- Create a libcal-client library with the calendar client object.
-
-2000-02-29 Federico Mena Quintero <federico@helixcode.com>
-
- * Makefile.am: Removed stale rule for the conduit.
-
-2000-02-21 Matt Loper <matt@helixcode.com>
-
- * .cvsignore: Added *.lo.
-
-2000-02-19 Matt Loper <matt@helixcode.com>
-
- * .cvsignore: Added tlacuache and tl-test.
-
-2000-02-18 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * Makefile.am (INCLUDES): Use BONOBO_VFS_GNOME_CFLAGS instead of
- GNOMEUI_INCLUDES, as we use Bonobo and VFS.
-
-2000-02-17 Seth Alves <alves@hungry.com>
-
- * cal-backend.h: moved CalendarFormat type def here
-
- * cal-backend.c (cal_backend_load): if extension suggests
- an ical file, attempt to load an iCal file.
- (cal_get_type_from_filename): returns CAL_ICAL if file
- extension is 'ics' or 'ifb', else returns CAL_VCAL
- (icalendar_calendar_load): moved this here from
- icalendar.c because it needs to call the static function
- add_object.
-
-2000-02-17 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-client.c (cal_client_remove_object): Implemented.
-
- * cal.c (cal_notify_remove): Implemented.
- (Cal_remove_object): Implemented.
- (cal_get_epv): Fill in the remove_object field in the epv.
-
- * cal-backend.c (cal_backend_remove_object): Implemented.
- (notify_remove): New function to notify clients that an object was
- removed.
-
-2000-02-16 Russell Steinthal <rms39@columbia.edu>
-
- * calobj.[ch], eventedit.c, main.c: Change iCalObject.organizer
- from char* to iCalPerson*
-
- * calobj.[ch]: Change iCalObject.related from list of char* to
- list of iCalRelation*; assorted related fixes
-
- * icalendar.c: interface between libical and the gnomecal
- internal representation
-
-2000-02-11 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-client.c (cal_client_update_object): Implemented.
-
- * cal.c (cal_notify_update): New function to notify the listener
- about an updated object.
- (Cal_update_object): Implemented.
- (Cal_get_uids): set_release() the sequence to TRUE.
- (Cal_get_events_in_range): Likewise.
-
- * cal-backend.c (remove_object): New function to remove objects
- from a calendar backend.
- (cal_backend_update_object): New public function to update an
- object and notify clients about it.
-
- * evolution-calendar.idl (Cal): Added update_object() and
- delete_object() methods.
- (Listener): Removed the obj_changed method and renamed obj_added
- to obj_updated. We now only have updated and removed notifiers.
-
- * cal-listener.[ch]: Removed the "changed" notification code.
- Changed the "added" notification code to the "updated"
- notification.
-
- * cal-client.c: Likewise.
-
- * tlacuache.c (create_cal_factory): Connect to "destroy" on the
- factory and exit the main loop when the factory is destroyed.
-
- * cal-factory.c (backend_destroy_cb): New callback used when a
- backend is destroyed. Removes the backend from the factory's hash
- table and unrefs the factory if all backends go away.
- (add_calendar_client): Free the environment.
-
- * cal.c (cal_new): Use bonobo_object_unref() if we fail to
- initialize.
-
- * cal-listener.c (cal_listener_new): Likewise.
-
- * layout.c (layout_events): Plug li.partition memory leak.
-
-2000-02-10 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-backend.c (cal_backend_add_cal): Connect to the Cal's
- destroy signal.
- (cal_backend_remove_cal): Killed function now that removal of Cal
- objects is done in their destroy callback.
- (cal_destroy_cb): New callback to remove a Cal from the backend's
- list of clients. Also, the backend destroys itself when there are
- no more clients connected to it.
- (save): New placeholder function to save a backend.
- (destroy): New function to destroy a backend's data.
- (cal_backend_destroy): Save the calendar and destroy it.
-
- * cal.c (cal_destroy): Reset the priv->backend to NULL.
-
- * cal-factory.c (add_calendar_client): There is no need to call
- cal_backend_remove_cal(); we can now just destroy the Cal object.
- (create_fn): Make sure we always unref the URI.
- (load_fn): Move the URI unref to the end of the function for
- safety.
-
- * cal-factory.c (add_calendar_client): Unref the Cal only if
- notification of the listener was unsuccessful. Otherwise, the
- calendar user agent (Listener side) keeps the reference.
-
- * tl-test.c (list_uids): Free the calobj.
-
- * cal-client.c (cal_loaded_cb): Use bonobo_object_unref() to get
- rid of the listener.
- (load_or_create): Likewise.
- (destroy_factory): New function to get rid of the factory.
- (destroy_listener): New function to get rid of the listener.
- (destroy_cal): New function to get rid of the calendar client
- interface object.
- (cal_client_destroy): Free all resources.
- (cal_client_get_object): CORBA_free() the calobj string. Boy, I
- love memprof.
-
- * cal-listener.c (cal_listener_destroy): Reset the priv->cal to
- CORBA_OBJECT_NIL.
-
- * cal-backend.c (cal_backend_remove_cal): Do not unref the Cal,
- since the calendar user agent owns it.
- (cal_backend_add_cal): Do not ref the Cal, since the calendar user
- agent owns it.
-
- * cal-factory.c (add_calendar_client): Use bonobo_object_unref()
- to get rid of the calendar client interface object.
-
- * calobj.c (ical_object_create_from_vobject): Duplicate the
- default "PUBLIC" string.
-
-2000-02-09 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-factory.c (cal_factory_load): Added documentation comment.
- (load_fn): Do not print a message if the backend could not be
- loaded due to a non-fatal error.
- (queue_load_create_job): Moved the stuff from cal_factory_load()
- to here. Now this function serves to queue load or create
- requests.
- (cal_factory_load): Use queue_load_create_job().
- (cal_factory_create): Implemented; use queue_load_create_job().
- (create_fn): New job handler for creating new calendars.
- (create_backend): New function to create a new backend with a new
- calendar.
- (add_backend): New helper function to add backends to the
- factory's hash table.
- (load_backend): Use add_backend() instead of adding the backend by
- ourselves.
-
- * cal-client.c (load_or_create): Moved the functionality from
- cal_client_load_calendar() to here, and added an option to create
- a new calendar instead of loading an existing one.
- (cal_client_load_calendar): Use load_or_create().
- (cal_client_create_calendar): Implemented.
-
- * cal-backend.c (cal_backend_create): Implemented.
-
- * evolution-calendar.idl (LoadStatus): Added an IN_USE error for
- create requests.
-
- * cal-listener.h (CalListenerLoadStatus): Added CAL_LISTENER_LOAD_IN_USE.
-
- * cal-listener.c (Listener_cal_loaded): Convert the IN_USE error.
-
- * cal-client.h (CalClientLoadStatus): Added CAL_CLIENT_LOAD_IN_USE.
-
- * cal-client.c (cal_loaded_cb): Handle CAL_LISTENER_LOAD_IN_USE.
-
- * tl-test.c: New test program for the calendar client side; it
- also exercises the server side by sending commands to it.
-
- * Makefile.am: Added the tl-test program.
-
- * tlacuache.gnorba: Updated.
-
- * tlacuache.c (create_cal_factory): Use the right GOAD id.
-
- * cal-client.c (cal_client_construct): Use the right GOAD id.
-
-2000-02-08 Federico Mena Quintero <federico@helixcode.com>
-
- * evolution-calendar.idl (Cal): Added get_uids() method to get a
- list of UIDs based on object types.
-
- * cal-backend.c (cal_backend_get_uids): Implemented get_uids() in
- the backend.
-
- * cal.c (Cal_get_uids): Implemented get_uids() method.
-
- * cal-client.c (cal_client_get_uids): Implemented client-side
- function.
-
- * cal-util.c (cal_obj_instance_list_free): Doh. Free the list,
- not the last link.
- (cal_obj_uid_list_free): New function to free a list of UIDs.
-
- * GnomeCal.idl (Repository): Removed unused method
- get_object_by_id_list(). This is just for cleanup purposes and to
- remind me exactly of what needs to be moved over to
- evolution-calendar.idl.
- (Repository): Removed unused get_objects() method.
-
- * corba-cal.c (init_calendar_repo_class): Removed the unused
- get_objects method.
-
- * calobj.h (CalObjFindStatus): New status value enumeration for
- the find function.
-
- * calobj.c (ical_object_find_in_string): New function to parse a
- complete calendar and find a calendar object in it. This should
- be used instead ical_object_new_from_string() in the future.
-
- * evolution-calendar.idl (CalObjInstance): Added an uid field.
- Now the idea is that whenever calendar object strings are passed
- around, their UIDs are passed along with them so that the actual
- object can be pulled from the whole VCAL object using its UID to
- identify it.
-
- * cal-util.h (CalObjInstance): Added uid field.
-
- * cal-util.c (cal_obj_instance_list_free): Free the UIDs.
-
- * cal-backend.c (build_event_list): Store the object's UID in the
- instance structure.
-
- * cal.c (Cal_get_events_in_range): Copy the UID field to the CORBA
- structure.
-
- * cal-client.c (cal_client_get_events_in_range): Copy the UID
- field from the CORBA structure.
-
- * main.c (gnome_cal_file_menu): Removed unfinished html-month stuff.
-
- * Makefile.am (gnomecal_SOURCES): Removed html-month.c.
-
- * gnome-cal.c: #include "alarm.h"
- (mail_notify): Made static.
-
- * alarm.h: #include "calobj.h"
-
- * corba-cal-factory.h (init_corba_server): Fixed prototype.
-
- * quick-view.c (create_items_for_event): Made static.
-
- * gncal-todo.c (column_resized): Made static.
-
- * layout.c (find_index): Made static.
-
-2000-02-08 Federico Mena Quintero <federico@helixcode.com>
-
- * evolution-calendar.idl (CalObjInstance): New struct to wrap
- instances of calendar objects for recurrencies and alarms.
- (Cal::get_events_in_range): New method to get ocurring and
- recurring events by time range.
-
- * cal-backend.c (cal_backend_get_events_in_range): New function to
- get a list of event instances in a time range.
- (string_from_ical_object): New internal function.
- (cal_backend_get_object): Use string_from_ical_object() instead of
- doing everything ourselves.
- (cal_backend_get_events_in_range): New function to get a list of
- the events that occur or recur in a specified time range.
-
- * cal-client.c (cal_client_get_events_in_range): Implemented
- client-side function.
-
- * cal-util.h:
- * cal-util.c: New files with utilities and types common to the
- client and server parts.
- (CalObjInstance): New structure to hold an instance of an actual
- occurrence, recurrence, or alarm trigger of a calendar object.
- (cal_obj_instance_list_free): New function to free a list of
- calendar object instances.
-
- * cal.c (Cal_get_events_in_range): Implemented new method.
-
- * corba-cal.c (cal_repo_get_updated_objects): Free `str' with
- free(), not g_free(), since calendar_get_as_vcal_string() uses
- writeMemVObject(), which uses realloc(). Fixed in gnome-pim as
- well.
-
-2000-02-04 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-backend.c (get_calendar_base_vobject): New function to
- create the base VObject for a calendar.
- (cal_backend_get_object): Create the base calendar and add the
- sought object to it, then stringify it.
-
- * evolution-calendar.idl (Listener::obj_added
- Listener::obj_changed): Now these pass in just the UIDs, not the
- complete objects.
-
- * cal-listener.c (Listener_obj_added): Changed to pass in the uid,
- not the object.
- (Listener_obj_changed): Likewise.
-
- * cal-client.h (CalClientClass): Made the obj_added and
- obj_changed signals take in the UIDs, not the full objects.
-
- * cal-client.c (obj_added_cb): Likewise.
- (obj_changed_cb): Likewise.
-
-2000-02-04 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-backend.c (CalBackendPrivate): Renamed the event_hash field
- to object_hash. Now we hash all the calendar's objects here based
- on their UIDs.
- (ensure_uid): New function to create UIDs for calendar objects
- that don't have them.
- (add_object): Ensure the object has an UID before inserting it in
- the calendar.
- (cal_backend_get_object): New function.
-
-2000-02-03 Federico Mena Quintero <federico@helixcode.com>
-
- * evolution-calendar.idl (Cal): Added the get_object() method.
-
- * cal-client.c (cal_client_get_object): New function to get a
- calendar object by its UID.
-
- * cal.c (Cal_get_object): Implemented.
-
- * cal-backend.c (cal_backend_get_object): New unfinished backend
- function. We need some reorganizing of how the calendar objects
- are stored.
-
-2000-02-02 Federico Mena Quintero <federico@helixcode.com>
-
- * Makefile.am (gnomecal_SOURCES): Added the CORBA generated
- sources.
-
-2000-02-01 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-client.c (cal_loaded): Handle the cal_loaded signal from the
- listener. Store the calendar client interface object, and emit
- our own cal_loaded signal.
- (cal_client_load_calendar): Connect to the listener's signals.
- (cal_client_class_init): Added the "obj_added", "obj_removed",
- öbj_changed" signals.
- (obj_added_cb): Handle the signal from the listener.
- (obj_removed_cb): Likewise.
- (obj_changed_cb): Likewise.
-
-2000-01-30 Federico Mena Quintero <federico@helixcode.com>
-
- * Makefile.am (gnomecal_SOURCES): Added cal-client.[ch] and
- cal-listener.[ch].
-
-2000-01-30 Federico Mena Quintero <federico@helixcode.com>
-
- * evolution-calendar.idl: Changed the namespace from
- GNOME::Calendar to Evolution::Calendar.
- (Listener::LoadStatus): Fixed SUCESSS -> SUCCESS typo. And I
- never noticed it in the implementation. Ain't M-/ grand?
-
- * Makefile.am: Changed ocurrences of gnome-calendar.idl to
- evolution-calendar.idl.
-
- * *.[ch]: Changed GNOME_Calendar_foo identifiers to
- Evolution_Calendar_foo.
-
-2000-01-25 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-client.c cal-client.h: New files with the calendar client
- object.
-
-2000-01-25 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-factory.c (CalFactory_load): Check that the listener is not
- nil and emit and exception if it is.
-
- * gnome-calendar.idl (CalFactory::load CalFactory::create): Now
- these raise the NilListener exception.
-
- * tlacuache.c (calendar_notify): Error stub for alarms.
- (alarm_defaults): Stub array.
- (debug_alarms): Stub variable.
- (main): Initialize gnome-vfs.
-
-2000-01-24 Federico Mena Quintero <federico@helixcode.com>
-
- * tlacuache.c: New main module for the Tlacuache personal calendar
- server.
-
- * tlacuache.gnorba: New gnorba file for Tlacuache, the GNOME
- personal calendar server.
-
- * Makefile.am: Added the stuff necessary to build Tlacuache.
-
- * cal.c (Cal_get_uri): Convert the URI to a string before
- returning it.
-
- * cal-factory.c (CalFactory_create): Doh, this function is void.
-
- * job.c (job_add): Use g_idle_add(), not gtk_idle_add().
-
-2000-01-24 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-backend.c (cal_backend_remove_cal): New function to remove a
- calendar client interface object from a backend.
- (cal_backend_load): Convert the URI to string and use
- Parse_MIME_FromFileName(). The conversion is not very smart,
- though.
-
- * cal-factory.c (load_backend): Moved most of the error handling
- upstream to load_fn().
- (load_fn): Handle failure in case the backend could not be loaded.
- (cal_factory_destroy): Free the backends and the backend hash
- table.
- (add_calendar_client): Implemented. We create a Cal client
- interface object and attach it to the backend, and we notify the
- listener.
-
-2000-01-22 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-factory.c (lookup_backend): Renamed from lookup_calendar().
- Also, return a backend instead of a Cal client object.
-
- * cal-backend.c (cal_backend_load): Take in a GnomeVFSURI, not a
- string.
-
- * cal-listener.c (Listener_cal_loaded): Pass the load status to
- the signal.
- (cal_listener_destroy): Better error checking.
- (cal_listener_new): Better error checking.
-
- * cal-listener.h (CalListenerLoadStatus): New enum for the load
- status of a calendar.
- (CalListenerClass): Added the status argument to the cal_loaded
- signal.
-
- * gnome-calendar.idl (cal_loaded): Added a load status code.
-
- * cal-backend.h (CalBackendLoadStatus): Renamed from
- CalBackendLoadResult.
-
-2000-01-18 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-backend.c cal-backend.h: Moved the calendar backend here.
- This is the actual calendar-handling object.
- (load_from_vobject): Moved over from calendar.c. Modified to use
- a CalBackend instead of the old Calendar structure.
- (add_object): Likewise.
-
- * cal.c: Now the Cal object is just a calendar client interface
- object; we use it as a "viewport" onto a CalBackend. This also
- lets us do correct resource management.
-
- * cal-common.h: New file with common forward declarations; we
- can't have circular dependencies between headers.
-
-2000-01-18 Federico Mena Quintero <federico@helixcode.com>
-
- * cal-factory.c (cal_factory_load): Queue a load job.
- (load_fn): Load job handler. Lookup the calendar by URI, load it
- if it is not loaded, or just report it to the new listener if it is.
-
- * job.c job.h: New files with a simple job queue manager.
-
- * gnome-calendar.idl (Listener::cal_loaded): Do not return the
- whole calendar object string. The client will be able to query
- the calendar for the events it needs.
-
- * cal-listener.c (Listener_cal_loaded): Ref the calendar GNOME
- object. We unref it when the listener is destroyed.
-
-2000-01-17 Federico Mena Quintero <federico@helixcode.com>
-
- The files from the gncal directory of the gnome-pim module on CVS
- were moved here, to evolution/calendar, in preparation for the
- Evolution work. The calendar is being split into a model/view
- architecture. The model is a personal calendar server (PAS): it
- provides storage, notification, and event generation; the
- views/controllers are the calendar user agents and things like
- Pilot synchronizers.
-
-2000-01-11 Federico Mena Quintero <federico@helixcode.com>
-
- * cal.c: Removed the CORBA listener methods, adjusted for the new
- IDL.
-
- * cal-listener.c (cal_listener_init): Create the private
- structure. In it we hold a reference to the calendar the listener
- is watching.
- (cal_listener_destroy): Destroy the private structure and unref
- the calendar.
- (Listener_cal_loaded): Stuff the calendar into our private data.
- (Listener_obj_added): Adjusted for new IDL.
- (Listener_obj_removed): Likewise.
-
- * gnome-calendar.idl: New IDL for the personal calendar server.
-
- * cal.h cal.c: New files with the calendar object.
-
- * cal-listener.h cal-listener.c: New files with the calendar
- listener object.
-
- * cal-factory.h cal-factory.c: New files with the calendar factory
- object.
-
-2000-01-09 Eskil Heyn Olsen <deity@eskil.dk>
-
- * Makefile.am: Changes to remove todo capplet stuff from distro.
-
-2000-01-08 Vadim Strizhevsky <vadim@optonline.net>
-
- * calendar-conduit-control-applet.c: Added pilotID argument to
- gpilotd_conduit_mgmt_new.
-
-
-2000-01-05 Eskil Heyn Olsen <deity@eskil.dk>
-
- * GnomeCal.idl: Added an argument to get_number_of_objects, so you
- can choose which state the object should have
- (any/new/modified/...). Will also add one to choose type
- (event/journal etc).
-
- * corba-cal.c (cal_repo_get_number_of_objects): Implemented the
- new version of get_number_of_objects.
-
- * calendar-conduit.c (pre_sync): Calls various
- gnome_pilot_conduit_standard_abs_set_num_yadayda to get progress bars.
-
-2000-01-04 Eskil Heyn Olsen <deity@eskil.dk>
-
- * calendar-conduit.c (start_calendar_server): Let's not call
- g_error, but g_warning instead.
- (pre_sync): Get record numbers info, total, new, deleted etc, and
- tell gpilotd.
-
-1999-12-31 Eskil Heyn Olsen <deity@eskil.dk>
-
- * eventedit.c (ee_store_recur_end_to_ical): Adds 86400 secs (1
- day) to the date chooses by the user. This ensures the recurrence
- also occurs on that date.
- (ee_rp_init_ending_date): And subtracts 86400 secs when about to
- redisplay the box.
-
- * calendar.h: Added an argument to calendar_new, to enable certain
- features, such as initing alarms or nor.
-
- * calendar.c (calendar_new): Implemented support for the
- CALENDAR_INIT_ALARMS option to calendar_new.
-
- * corba-cal.c (cal_repo_get_updated_objects): Added
- CALENDAR_INIT_ALARMS to calendar_new calls.
-
- * main.c: Added CALENDAR_INIT_ALARMS to calendar_new calls. This
- should probably be CALENDAR_INIT_NIL, but I'm not sure, guess
- steintr should check it.
-
- * gnome-cal.c: Added CALENDAR_INIT_ALARMS to calendar_new calls.
-
- * calendar-pilot-sync.c: Added CALENDAR_INIT_NIL to calendar_new calls.
-
-1999-12-10 Russell Steinthal <rms39@columbia.edu>
-
- * eventedit.c (ee_create_ae): Fix sensitivity bug when used to
- create default alarm box (widgets in that box should always be
- sensitive, even if the enabled checkbutton is not set)
-
-1999-12-08 Eskil Heyn Olsen <deity@eskil.dk>
-
- * calendar-conduit-control-applet.c (setSettings): Capplets now
- sets first_sync on enable, this should make the conduit copy old
- entries from the pilot to gnomecal.
-
-1999-12-07 Eskil Heyn Olsen <deity@eskil.dk>
-
- * calendar-conduit.c (pre_sync): Check if local store is
- empty. If, force slow sync.
-
- * GnomeCal.idl (GNOME): Added get_number_of_objects.
-
- * corba-cal.c (cal_repo_get_number_of_objects): implemented the
- get_number_of_objects.
-
- * calendar-conduit-control-applet.c (setStateCfg): Fixed bug that
- caused the capplet to always set the sync action to Disable upon start.
-
-1999-12-05 Eskil Heyn Olsen <deity@eskil.dk>
-
- * Makefile.am (Conduits_second_DATA): Also install .desktop files
- for conduit capplets in the gnome/apps menu dir.
-
-1999-12-04 Eskil Heyn Olsen <deity@eskil.dk>
-
- * Makefile.am (EXTRA_DIST): Added .desktop files to EXTRA_DIST.
-
-1999-10-12 Clifford R. Conover <rusty@zootweb.com>
-
- * gncal-todo.c Todo List improvements.
-
- Cleaned up todo item highlighting, added support for highlighting
- events due today, and events not due yet. Colors are configurable
- on the Colors Tab of the properties window.
-
- Renamed Frame in Properties window to Colors rather then Month
- Colors since we are now asking for Todo item colors.
-
- Added ability to display time until todo item is due in list, it
- automatically selects the best denomination of time (up to weeks)
- and down to seconds to display. This should be made configurable
- in a future version.
-
- Changed Todo dialog to ask for time that event is due. This
- allows more accurate tracking of then the item is due, before the
- dialog was only asking for the date of the todo item.
-
-1999-12-03 Eskil Heyn Olsen <deity@eskil.dk>
-
- * calendar-conduit.c: undef DEBUG_CALCONDUT, suppresses debug output.
-
-1999-12-02 Russell Steinthal <rms39@columbia.edu>
-
- * alarm.c: Enhanced debug support: can be toggled on and off by
- SIGUSR1, reports alarms which could not be added
-
- * gnome-cal.c, main.[ch], prop.c: Add snooze capability for audio
- and display alarms. Snooze interval can be configured in the
- Properties box.
-
-1999-11-30 Eskil Heyn Olsen <deity@eskil.dk>
-
- * calendar-conduit.c (compare): Fixed compare bug. Also neated up
- some of the if's in set_status.
-
-1999-11-22 Russell Steinthal <rms39@columbia.edu>
-
- * Merged todo list coloring patch from stable
- * Added myself to AUTHORS, about box (per Miguel)
-
-1999-11-22 Eskil Heyn Olsen <deity@eskil.dk>
-
- * calendar-conduit.c (pre_sync): Writes some warning
- messages when pre_sync fails.
-
-1999-11-14 Eskil Heyn Olsen <deity@eskil.dk>
-
- * Makefile.am: Stupid misplaced endif cause gncal to depend on an
- install gnome-pilot... fixed... sorry.
-
-1999-11-12 Eskil Heyn Olsen <deity@eskil.dk>
-
- * Makefile.am (extra_pilot_bins): Fixed the if then else problem,
- using solution suggested by James Henstridge, appears to be caused
- by a (by now fixed) bug in my automake.
-
-1999-11-12 Russell Steinthal <rms39@columbia.edu>
-
- * prop.c: Config code for timeout, make Alarms property page use a
- vbox instead of an hbox so that the propbox stays a reasonable width.
-
- * gnome-cal.c, main.[ch]: Add timeout for audio alarms, code to load
- from config file
-
- * eventedit.c: Give some static functions external linkage so they
- can be used elsewhere (make_spin_button); add some prototypes to
- appease gcc.
-
-1999-11-11 Russell Steinthal <rms39@columbia.edu>
-
- * calendar.c (calendar_day_change): Add call to
- calendar_init_alarms() to schedule another day change alarm.
-
-1999-11-09 Eskil Heyn Olsen <deity@eskil.dk>
-
- * calendar-conduit.c: Enabled debug output. Sets a g_log_domain,
- now version 0.8.5. Consistent use of GSList/GList. Implemented
- compare, default uses one that compares the contents of a struct
- Appointment, but also has #ifdeffed code that does a field level
- comparison, not complete, but perhaps educational.
-
- * Makefile.am (#todo_conduit_control_applet_SOURCES): Fixed an
- unwanted conditional on libcalendar_conduit_la_LDFLAGS
-
-1999-11-05 Eskil Heyn Olsen <deity@eskil.dk>
-
- * calendar-conduit-control-applet.c (readStateCfg): Commented the
- code out, thus the capplet works again.
-
-1999-11-04 Eskil Olsen <deity@eskil.dk>
-
- * Makefile.am: Uses the PISOCK_LIBDIR, for people with odd install
- dirs for their pilot-link. Also install a pretty icon for the
- calendar-conduit.
-
- * calendar-conduit-control-applet.c: Modfied the
- try/revert/ok/cancel scheme to be more intuitive, also uses a
- GtkOptionMenu for the possible sync methods.
-
- * calendar-conduit-control-applet.desktop: use the nice icon...
-
- * calendar-conduit.c: Ack, had to define debug_alarms and
- alarm_default, otherwise they are undefined. Is gncal code messy
- or is this considered a way of configuring the cal engine ?
- Implemented delete_all syncabs methods.
-
- * calendar-pilot-sync.c: also had to declare debug_alarms and
- alarm_defaults, just as ugly.
-
-1999-11-02 Russell Steinthal <rms39@columbia.edu>
-
- * prop.c: Add new alarm page to properties box
-
- * prop.c, calobj.c, main.[ch] eventedit.c: New support for default
- alarms, configurable in the properties box.
-
- * gnome-cal.c, prop.c, main.[ch]: add option to beep on Display
- alarms
-
-1999-10-23 Russell Steinthal <rms39@columbia.edu>
-
- * calendar.c (calendar_new): Correctly initialize calendar_day_end
- and calendar_day_begin *before* installing day-change alarm.
-
-1999-10-21 Russell Steinthal <rms39@columbia.edu>
-
- * alarm.c, main.c: Added alarm debugging code
-
- * main.c (open_ok): Show an error box if the user tries to open a
- non-existent file; fixes bug #1818
-
-1999-10-19 Russell Steinthal <rms39@columbia.edu>
-
- * gnome-cal.c (calendar_notify): Fix typos which were causing
- invalid times in audio notification dialogs; fixes Bug #2561
-
-1999-10-18 Russell Steinthal <rms39@columbia.edu>
-
- * gncal-day-panel.c (gncal_day_panel_new): Placed the various
- elements of the day view in paned windows so that the user can
- adjust the relative sizes of the daily schedule, monthly calendar,
- and to-do list.
-
-1999-10-18 Martin Norbäck <norpan@bigfoot.com>
-
- * gncal.desktop: Added swedish translation
-
-1999-10-13 Eskil Olsen <deity@eskil.dk>
-
- * Makefile.am: Hopefully the fixes the much-hated
- gnome-pilot dependency.
-
-1999-10-07 Eskil Olsen <deity@eskil.dk>
-
- * calendar.c (calendar_object_changed): moved the pilot_status =
- MOD up, so even a CHANGE_SUMMARY will set the modified flag.
-
- * calendar-conduit.c: more _free calls, vamped the noise on output.
-
-1999-10-06 Eskil Olsen <deity@eskil.dk>
-
- * *conduit*[ch]: checks return values from gpilotd_init/connect.
-
- * calender.c (vcalendar_create_from_calendar): removed a set
- of cleanVObject cleanStrTbl, since the freed memory that the
- function returned.
-
-1999-09-27 Timur Bakeyev <mc@bat.ru>
-
- * timeutil.c (time_from_isodate): Use tm.gmtoff or timezone to get
- correct offset from UTC, according to HAVE_TM_GMTOFF or HAVE_TIMEZONE.
- See also 1999-07-19 Matt Martin <matt@abacusnet.net>
-
-1999-09-27 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * month-view.c (add_event): ditto
- (mark_current_day): ditto
- (month_view_set): ditto
-
- * goto.c (goto_dialog): ditto.
-
- * gnome-month-item.c (gnome_month_item_init): ditto.
-
- * gncal-day-panel.c (gncal_day_panel_new): ditto.
-
- * getdate.c (RelativeDate): ditto.
-
- * eventedit.c (set_all_day): ditto.
- (ee_rp_init_rule): ditto.
-
- * calendar.c (vcalendar_create_from_calendar): ditto.
-
- * calendar-conduit.c (update_record): ditto.
-
- * calobj.c (ical_object_generate_events): Get rid of pointers to
- values returned from localtime, as it uses a static buffer.
-
-1999-09-26 Eskil Olsen <deity@eskil.dk>
-
- * corba-cal.c: the g_free that was commented out since glib said
- was a duplicate free, was supposed to be a free.
-
- * GnomeCal.idl/corba-cal.c: added a get_object_id_list and a
- get_objects_by_id_list. Latter is not done.
-
- * calendar-conduit.c: rewrote the way the conduit iterates over
- records. It no longers fetches all entries (since that didn't work
- with more then 285 entries. It now fetches the id list, and gets
- each record. (will be using get_objects_by_id_list to get records
- in amounts of 10 or so later, to reduce amount of corba calls).
-
- * calendar-conduit.c: now sets alarm parameters when transferring
- from gnomecal to pilot.
-
-1999-09-23 Eskil Olsen <deity@eskil.dk>
-
- * calendar-conduit.c: better merge of summary/description
- when doing ical_from_remote (update_record), also handles
- import from gnomecal to pilot better, and on both ways, repeat
- events are much better now.
-
-1999-09-22 Eskil Olsen <deity@eskil.dk>
-
- * corba-cal.c: commented out a g_free that glib reported
- as being a duplicate free.
- * calendar-conduit.c: got gnomecal->pilot up and runnning.
-
-1999-02-06 Lauris Kaplinski <lauris@ariman.ee>
-
- * gncal.desktop: Added Estonian translations.
-
-1999-09-14 Federico Mena Quintero <federico@redhat.com>
-
- * gncal-full-day.c (child_popup_menu): Set the data pointers for
- all the items.
-
-1999-09-14 Kjartan Maraas <kmaraas@online.no>
-
- * doc/C/gnomecal.sgml: Merge from gnome-pim-1-0. Synced with newest
- user-guide.
-
-1999-09-01 Miguel de Icaza <miguel@gnu.org>
-
- * eventedit.c (ee_create_buttons): Make the OK button the default
- button per Russell's suggestion.
-
-1999-08-30 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * calendar.c (calendar_object_changed): Modify the
- object->last_mod field.
- (calendar_add_object): Ditto.
-
- Closes bug #676
-
- * main.c (save_calendar_cmd): Fix problem in which we warned the
- user about the calendar being modified the first time the calendar
- was used.
-
-1999-08-22 Tomas Ogren <stric@ing.umu.se>
-
- * gnomecal.gnorba: "GenericFactoy" is wrong...
-
-1999-08-15 Miguel de Icaza <miguel@gnu.org>
-
- * calobj.c (ical_gen_uid): Fix the hostname part.
-
-1999-08-07 Peter Teichman <pat4@acpub.duke.edu>
-
- * calendar-pilot-sync.c (sync_pilot): sync correctly for objects
- created on the pilot, but not dirty (because they have been synced
- with some other program in the past)
-
-1999-07-30 Miguel de Icaza <miguel@gnu.org>
-
- * month-view.c (month_view_init): Release points here.
-
-1999-08-02 Peter Teichman <pat4@acpub.duke.edu>
-
- * Makefile.am (libcalendar_conduit_la_LDFLAGS):
- libcalendar_conduit now installs
-
- * calendar-pilot-sync.c (sync_pilot): do deletion of appointments
- correctly, when they are deleted on the pilot
- (conduit_free_Appointment): protect against double-freeing parts
- of the Appointment structure
- (update_record): all-day events from the pilot are handled a bit
- more reasonably
-
-1999-08-01 Peter Teichman <pat4@acpub.duke.edu>
-
- * calendar-pilot-sync.c (sync_object_to_pilot): The multi-day
- appointment corruption bug is dead. Whoo!
-
-1999-07-31 Peter Teichman <pat4@acpub.duke.edu>
-
- * Makefile.am: fixed this up slightly with respect to pilot conduits
-
-1999-07-30 Jonathan Blandford <jrb@redhat.com>
-
- * Makefile.am (libcalendar_conduit_la_LIBADD): More autoconf-stuff
-
-1999-07-29 Jonathan Blandford <jrb@redhat.com>
-
- * gnome-cal.c (setup_widgets): Add scrolling to the yearview.
-
-1999-07-28 Miguel de Icaza <miguel@gnu.org>
-
- * calendar-pilot-sync.c: (sync_object_to_pilot): If the enddate is
- not set, set the repeatForever to 1. This fixes all of the
- birthdays problems I had.
-
- Make the code not take arguments
- (sync_cal_to_pilot): Nice event update information
-
- * calendar.c (calendar_new): Add Event UID hash table.
- (calendar_add_object): Add events to the hash table here.
- (calendar_remove_object): Remove events here.
- (calendar_object_find_event): Use the hash table here.
-
- * main.c (save_calendar_cmd): The object is already destroyed by
- gnome_dialog_run.
-
- * calendar-pilot-sync.c (sync_object_to_pilot): Do not turn
- archived bit on.
-
- * calobj.c (ical_gen_uid): Use the hostname, not the domain name.
- (ical_gen_uid): Add a serial number. Isodates can be small.
-
- * corba-cal.c (cal_repo_update_pilot_id): New method to update the
- pilot status.
- (cal_repo_get_updated_objects): New method. Returns a list of
- modified and not-sycned objects
-
- * calendar-pilot-sync.c (sync_cal_to_pilot): New function to sync
- from the GnomeCalendar to the pilot.
- (sync_object_to_pilot): Sync a single event to the pilot.
- (try_alarm): Alarm syncing code.
-
-1999-07-27 Miguel de Icaza <miguel@gnu.org>
-
- * calendar-pilot-sync.c: New file. Implements PalmPilot
- syncronization with the Gnome Calendar.
-
- * calobj.c (ical_object_new_from_string): New function. Creates
- an iCalObject from a vCalendar string that is supposed to contain
- only one vEvent.
-
- * calendar.c:
- (calendar_save): Split this routine in two.
-
- * gnome-cal.c (gnome_calendar_new): Create the corba server here.
-
- * main.c: Include gnorba.h, and corba-cal-factory.h here
- (close_cmd): Kill the calendar server on shutdown.
-
- * calobj.c (load_recur_yearly_day): Added a fixme comment. WE
- need to handle intervals in the years.
-
- * calendar.c (calendar_object_find_in_list, calendar_object_find,
- calendar_object_find_todo, calendar_object_find_event): New
- functions for looking up information.
-
- * main.c (gnome_calendar_locate): New function.
-
- * corba-cal.c (calendar_create_object): New file. Implements the
- corba server.
-
- * calendar.c (calendar_object_changed): Flag pilot-status as changed.
-
- * calobj.c (ical_object_to_vobject): Save pilot information for syncing.
- (ical_object_create_from_vobject): Load syncing information for
- pilot. Do it in a way compatible with KOrganizer.
-
-1999-07-26 Miguel de Icaza <miguel@gnu.org>
-
- * calobj.c (ical_object_create_from_vobject): Generate unique IDs
- on Vevents we load that lack it. WE need this for the old
- gnome calendar generated files (ie, before now :-).
-
- Required to sync with the Palm
-
-1999-07-26 Miguel de Icaza <miguel@gnu.org>
-
- * calobj.c (ical_object_create_from_vobject): Generate unique IDs
- on Vevents we load that lack it. WE need this for the old
- gnome calendar generated files (ie, before now :-).
-
- Required to sync with the Palm
-
-1999-07-19 Matt Martin <matt@abacusnet.net>
-
- * timeutil.c (time_from_isodate): Handle the 'Z' parameter to the
- ISO date format to convert from GMT time.
-
-1999-07-17 Nat Friedman <nat@gnome-support.com>
-
- * calendar.c (calendar_add_object): Copy the new UID into the
- iCalObject structure.
-
-1999-07-16 Miguel de Icaza <miguel@gnu.org>
-
- * gnome-month-item.c (gnome_month_item_set_arg): Merge fix from
- gnome-pim-1-0: Fixed cut&paste bug for day fontsets.
-
-1999-07-14 Miguel de Icaza <miguel@gnu.org>
-
- * calobj.c (ical_gen_uid): Returns a UID.
- (ical_object_new): Use a UID when creating an event. Should get
- syncing done easier.
-
-1999-07-14 Nicholas J Kreucher <nick@poetic.com>
-
- * calobj.c (skip_numbers): Actually skip over the numbers.
- (ical_object_to_vobject): Test the proper variable for storing the
- proper information.
-
-1999-07-14 Jean-Noel Guiheneuf <jean-noel.guiheneuf@wanadoo.fr>
-
- * timeutil.c (time_add_month): Fixed the problem with next month
- going from a 31-day to a 30-day by adjusting the date to the
- closest day at the end of the month.
-
-1999-06-07 Mike McEwan <mike@lotusland.demon.co.uk>
-
- * timeutil.c (time_add_month): Tell ktime' that we don't know
- about daylight saving time so that it does *not* make adjustments
- when we traverse a DST boundary.
- (time_year_begin): ditto.
- (time_year_end): ditto.
- (time_month_begin): ditto.
- (time_month_end): ditto.
-
-1999-06-16 Anders Carlsson <anders.carlsson@tordata.se>
-
- * main.c (new_calendar): Realize the toplevel widget when
- --hidden is passed to gnomecal. This fixes a segfault.
-
-1999-06-04 Robert Brady <rwb197@ecs.soton.ac.uk>
-
- * gnome-cal.h, gnome-cal.c: Fix abort() problem with the year view.
- (Bug #1367). Thanks to Owen Cliffe <oc197@ecs.soton.ac.uk> for
- helping track it down.
-
-1999-06-03 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * calobj.c (daynumberlist): One line bug fix from Sergey I Panov.
-
-1999-06-02 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * view-utils.c (nicetime): Use %H instead of %k, as %k is a GNU
- extension, not available in other systems.
-
-1999-06-01 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * calobj.c (daynumberlist): Work around broken software that
- writes a broken month-of-day as "zero". Use the dtstart date for
- this on this event.
-
-1999-05-28 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * Makefile.am (install-data-local): help files be gone. They are
- now installed from the Docbook stuff.
-
-1999-05-26 Russell Steinthal <steintr@condor.penguinpowered.com>
-
- * gncal-todo.c main.c main.h prop.c: Added support for priorities
- for todo items. Doesn't do much, but you can set them and sort by
- them. (Use the properties box to enable them; should they be on
- by default?)
-
-1999-05-25 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * main.c (parse_an_arg): Added missing break here. It was causing
- core dumps when invoked with --userfile.
-
- * gnome-cal.c (gnome_calendar_set_view): Add some assertions here,
- to pin point the bug reported on gnome-list.
-
- * calobj.c (load_recurrence): Make intervals always exist. a 0
- interval is wrong.
-
-1999-05-25 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * year-view.c: Removed unused macro CALENDAR_HEIGHT.
-
-1999-05-25 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * year-view.c (idle_handler): Set the canvas scroll region here,
- not in size_allocate(). Also, use the correct width and height
- based on the allocation and the precomputed minimum width/height
- values.
-
- * gnome-cal.c (setup_widgets): Set the scrollbar policy of the
- scrolled window.
-
- * main.c (setup_appbar): Use the correct type for the appbar.
-
- * gncal-day-view.c: Removed unused function switch_to_day().
-
- * gncal-day-panel.c (calendar_day_selected): Removed unused variable.
-
-1999-05-25 Nat Friedman <nat@nat.org>
-
- * doc/C/gnomecal.sgml: Fixed a typo.
-
- * gnome-cal.c (setup_widgets): Added a scrolled window widget into
- which the year view is placed.
-
- * year-view.c (CALENDAR_HEIGHT): The height of the total year view
- inside the scrolled window.
- (idle_handler): Set the height of the year view to
- CALENDAR_HEIGHT.
- (year_view_size_allocate): Set the scroll region of the year view
- canvas to allocation->width, CALENDAR_HEIGHT.
-
-1999-04-25 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * main.c (dump_todo): Add --todo flag to dump the todo contents.
-
-1999-04-19 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * gncal-todo.c (add_activated): Use same hack used in edit_activated
-
-1999-04-16 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * gncal-todo.c (edit_activated): Kill all grabs from the CList
- before running the new dialog box.
-
- This fixes the problem of button-3/Edit on the todo item blocking
- the GUI (actually, the main window responds, but not the todo
- window).
-
-1999-04-08 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * gncal-todo.c (gncal_todo_init): Make sure we can get events for
- button3. The code for the nice popup menu was there but was not
- getting invoked.
-
-1999-04-01 Steve Murphy <murf@e-tools.com>
-
- * calobj.c (weekdaynum): Added this routine so Monthly recurrences
- use the weekday field as a simple integer for a single weekday.
-
- * calobj.c (load_recur_monthly_pos): Call weekdaynum instead of
- weekdaylist. The interface only lets the user input a single value
- anyway.
-
- * calobj.c (ical_object_to_vobject): instead of code to output day
- names from a bit array, use instead the value as an int and output
- a single dayname.
-
- * calobj.c (ical_object_generate_events): first_week_day gets the
- day int instead of the first entry in the bit field. I inserted a
- fair chunk of code to avoid calling generate if the day is out of
- range for a month. It may be unneccessary, because mktime will
- turn the extra days into a valid date the next month. But not all
- mktimes are equal, I fear.
-
- * eventedit.c (ee_store_recur_rule_to_ical): For case 3,
- (Monthly), I added code to set the interval slot of the recur
- struct; without this value, selecting a monthly recursing, by
- date, would lead to an infinite loop broken only by a failure to
- alloc more memory. Also, in the "by position" case, both
- u.month_pos and u.month_day were being assigned values. This is a
- mistake, as they are both part of an union, and the same
- thing. The weekday field should get the recur_rr_month_weekday
- value.
-
- * eventedit.c (ee_rp_init_rule): set default day from the weekday
- field instead of the u.month_day field, which is really the
- month_pos value.
-
- * gnome-cal.c (gnome_calendar_tag_calendar): Month days start with
- 1, not 0; thus, setting tm.tm_mday = 0, and then calling mktime
- will generate a time corresponding to the end of the previous
- month, which may have a mday anywhere from 28 to 31. The end time
- just adds 1 to the month, so your end time may not cover the last
- few days of this month, depending on what the biggest mday of last
- month was. I changed it so tm_mday is set to 1 instead.
-
-1999-03-30 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-todo.c (convert_time_t_to_char): Made static. Make it use
- the full year format for strftime().
-
-1999-03-27 Nuno Ferreira <nmrf@rnl.ist.utl.pt>
-
- * calobj.c: Include <config.h> So that strings get translated.
-
-1999-03-26 Tomas Ogren <stric@ing.umu.se>
-
- * prop.c (build_hours_menu): Made it respect 12/24h settings..
- Doesn't show until next time you open the dialog.. yet..
-
-1999-03-24 Tomas Ogren <stric@ing.umu.se>
-
- * gncal-week-view.c (gncal_week_view_set): Did some i18n work
- * eventedit.c (get_exception_string): Did some i18n work
-
-1999-03-24 Tomas Ogren <stric@ing.umu.se>
-
- * gncal-todo.c (gncal_todo_init): Made clist titles i18n:able
- * main.c (poptOption): Added which views that are possible for
- --view in the --help text (closes #367)
- * main.c (dump_events): Added (short) month to the strftime and made
- the strings i18n:able
-
-1999-03-23 Tomas Ogren <stric@ing.umu.se>
-
- * gncal/calobj.c: Added 2 paranthesis..
- "foobar = d / 60*60" is _NOT_ the same as "foobar = d / (60*60)"
- which caused heavy alarm-corruption with alarms between 2 hrs and
- 2 days.
-
-1999-03-23 Nat Friedman <nat@nat.org>
-
- * eventedit.c (ee_store_recur_rule_to_ical): Set the
- recur->interval to the value of the recur_rr_month_period spin
- button if the event is being set "by day." This closes bug #675
- as reported by bagfors@hpc2n.umu.se. Thanks for the report!
-
-1999-03-10 Clifford R. Conover <rconover@montana.edu>
-
- * gncal-todo.c (simple_todo_editor): Add support for Due Date when
- adding a TODO item here.
- (column_resized): New function
- (init_column_sorting): New function.
- (todo_click_column): New function.
- (convert_time_t_to_char, make_overdue_todo_style): New functions.
-
- * gnome-cal.c (gnome_calendar_todo_properties_changed): New
- function used to update the TODO when the properties have been
- chagned for it.
-
- * prop.c (prop_apply_todo): Apply TODO properties.
-
- * gncal-day-panel.c (todo_list_properties_changed): Update the
- TODO display here.
-
- * eventedit.c (date_edit_new): Made public
-
-1999-03-10 Craig A Soules (soules+@andrew.cmu.edu)
-
- * timeutil.c, calendar.c, calobj.c, gncal-day-panel.c: Add support
- for daylight time savings.
-
-1999-02-28 Martin Baulig <martin@home-of-linux.org>
-
- * gncal-full-day.c (recompute_motion): For DRAG_MOVE, DRAG_SIZE_TOP
- and DRAG_SIZE_BOTTOM: call child_focus_out () if the child currently
- has the focus.
-
-1999-02-27 Changwoo Ryu <cwryu@adam.kaist.ac.kr>
-
- * quick-view.c (QUICK_VIEW_FONTSET): Added Korean font to the
- fontset string.
- * mark.h (*_FONTSET): Likewise.
-
-1999-02-23 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * calobj.c (ical_object_to_vobject): Save the owner/organizer of
- the event.
- (ical_object_create_from_vobject): Load the owner/organizer of the event.
-
- * gncal-full-day.c (delete_occurance): Assign child to data (fixes
- crash on "delete this occurrance").
-
-1999-02-22 Timur Bakeyev <mc@bat.ru>
-
- * calendar.c: According to configured values, use either tm.tm_zone
- or tzname. In last case, also declare it extern.
-
- * prop.c: langinfo.h not available everywhere. Wrapped. BTW, works
- fine without it.
-
-1999-02-20 Tomas Ogren <stric@ing.umu.se>
-
- * main.c (init_username): Made use of g_get_{user,real}_name() instead
- of our own home-brew...
-
-1999-02-17 Sergey Panov <sipan@mit.edu>
-
- * gnome-month-item.c,gnome-month-item.h,goto.c,mark.h,
- month-view.c,prop.c,quick-view.c,year-view.c: will define
- fonts via fontset. Friendlier to locales that use iso8859-[^1]
- and koi8-r encodings. Does not solve problem for Asian languiges
- --- better solution is needed (e.g. standart GNOME fontstyles
- defined in gtkrc).
-
-1999-02-16 Sergey Panov <sipan@mit.edu>
-
- * main.c: Use N_() macro for color settings labels in
- color_props structure.
-
-1999-02-15 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * goto.c (goto_dialog): Indentation fixes.
-
-1999-02-15 Tomas Ogren <stric@ing.umu.se>
-
- * goto.c: Made a private copy of what localtime() returns, to be able
- to keep the data after more calls to localtime().
-
-1999-02-11 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * main.c (save_default_calendar): New function. Saves the
- calendar if it is the user's default calendar
-
- * gncal-full-day.c (unrecur_appointment):
- * gncal-day-panel.c (day_view_range_activated):
- * eventedit.c (ee_ok):
- * gncal-todo.c (ok_button): Added autosave for the default
- calendar.
-
-1999-02-09 Tomas Ogren <stric@ing.umu.se>
-
- * main.c: Removed the gtk_widget_realize call.
-
-1999-02-06 Changwoo Ryu <cwryu@adam.kaist.ac.kr>
-
- * gncal.desktop: Added Korean translations.
-
-1999-02-04 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * eventedit.c (date_edit_new): New convenience function to create
- a properly-configured date editor widget.
-
-1999-02-03 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-week-view.c (gncal_week_view_new): Make the calendar start
- weeks on Monday if appropriate.
- (gncal_week_view_time_format_changed): New function to notify the
- week view that the time format has changed.
-
- * gncal-day-panel.c (gncal_day_panel_new): Make the calendar start
- weeks on Monday if appropriate.
- (gncal_day_panel_time_format_changed): New function to notify the
- day panel that the time format has changed.
-
- * gnome-cal.c (gnome_calendar_time_format_changed): Tell the day
- and week views that the time format has changed.
-
-1999-02-01 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * eventedit.c (event_editor_init): Set the title of the event
- editor window.
-
-1999-01-31 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-day-view.c (gncal_day_view_expose): Do not remove the
- clipping rectangle here.
-
- * view-utils.c (view_utils_draw_events): Remove the clipping
- rectangle here, since the user of this function should not know
- about it.
-
-1999-01-30 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * view-utils.c (view_utils_draw_events): Improve this draw
- routine. Now it can split the text in lines and fit as many
- events as possible.
- (nicetime): Return strings without spaces at the beginning.
-
- * gncal-day-view.c (gncal_day_view_expose): Move clip-clear
- operation here.
-
-1999-01-29 Jason Tackaberry <tack@dok.org>
-
- * gncal-full-day.c (child_popup_menu): if the user clicks on an
- event that is an occurance, the menu will allow the user to delete
- all occurances of this event, or just the selected occurance.
- (delete_occurance): added.
-
- * eventedit.c (append_exception): force the clist to select the
- new exception. (fixes segfault)
- (delete_exception): if the last exception in the clist is deleted,
- move the selection index up. (fixes segfault)
-
-1999-01-28 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * main.c (parse_an_arg): Add --hidden key to hide the calendar at
- startup. Only works with GNOME window managers though :-(
-
- * calendar.c (calendar_day_change): Reschedule alarms for the new day.
-
- (calendar_init_alarms): Schedule an alarm for midnight to change
- the calendar_day_begin/calendar_day_end.
-
- * alarm.c (alarm_ready): If we reschedule, there is no need to
- activate any pending alarms.
-
-1999-01-28 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-full-day.c (child_new): Insert the summary text here.
- (child_focus_in): No need to raise the window, since we have
- Spiffo(tm) layout code. Boy, this is old code.
- (gncal_full_day_focus_child): Now that GtkText works better, we
- can avoid synthesizing a click which was causing grief, anyway.
- (child_button_press): Grab the focus before popping up the menu.
-
- * layout.c (find_index): Added a sanity check.
-
- * gncal-full-day.c (child_destroy): Unmap and unrealize the child
- before unparenting/destroying it.
- (child_unrealize): Unrealize the widget. What was I thinking?
- (child_new): Save the focus_out_event signal connection id in
- Child structure (in a new field).
- (child_destroy): Disconnect from the focus_out_event signal, since
- we don't want to get such an event when the widget is destroyed.
- (gncal_full_day_destroy): Destroy the children properly; it was
- leaking memory.
-
-1999-01-27 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * main.c (save_calendar_cmd): Warn if the calendar file has
- changed.
-
- * calendar.c (calendar_load, calendar_save): Keep track of the
- modification time for the calendar file.
-
-1999-01-20 Nat Friedman <nat@nat.org>
-
- * gncal-full-day.c (gncal_full_day_key_press): Only trap printable
- characters such that hotkeys work.
- (UNSELECT_TIMEOUT): Changed to 0. Much saner behavior.
-
- * prop.c (properties): Connect gnome_help_pbox_display to the
- GnomePropertyBox help button.
-
-1999-01-19 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * quick-view.c (quick_view_do_popup): Do not grab the mouse here
- (it was being grabbed incorrectly, anyways).
- (quick_view_map_event): Grab the mouse when the window is mapped.
- This avoids the ugly "while (xGrabPointer () != Success)" hack.
- (quick_view_button_release): Handle button releases here.
-
-1999-01-19 Tomas Ogren <stric@ing.umu.se>
-
- * main.c: do gtk_widget_realize on the toplevel window..
-
-1999-01-13 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-day-panel.c (gncal_day_panel_new): Make the little
- calendar start up with the correct date.
-
- * gncal-week-view.c (gncal_week_view_set): Add the month to the
- date range display label.
-
-1999-01-08 Nat Friedman <nat@nat.org>
-
- * main.c: Converted some more stuff to use the standards.
-
-1999-01-08 Nat Friedman <nat@nat.org>
-
- * main.c (setup_appbar): New function to create the status bar.
- (setup_menu): Install menu hints.
-
- Menu items updated to match the standards. New Settings menu
- created.
-
-1998-12-30 Jeff Garzik <jgarzik@pobox.com>
-
- * gncal/calendar.c, gncal/gnome-cal.c, gncal/main.c,
- gncal/quick-view.c:
- s/g_copy_strings/g_strconcat/
-
-1998-12-16 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- Rewrote the old and broken alarm system. It never actually
- worked properly. Now it works properly, and I figured a nice way
- to get the Audio alarm do something nicer (it is now like an alarm
- clock :-).
-
- * gnome-cal.c (calendar_notify): Now we take a CalendarAlarm to
- actually distinguish which alarm was triggered.
-
- * alarm.c (alarm_ready): The code was only activating the first
- alarm. Reschedule the timer upon delivery of an alarm.
-
-1998-12-14 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * year-view.c (idle_handler): Use the allocation size instead of
- the old fields in the canvas structure.
-
- * goto.c (create_days): Use gtk_widget_set_usize() instead of
- gnome_canvas_set_size().
- * quick-view.c (setup_event_list): Likewise.
-
-1998-12-09 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * gncal-todo.c (simple_todo_editor): Use gnome_dialog_set_parent.
- * goto.c (goto_dialog): ditto
- * prop.c (properties): ditto.
-
-1998-11-23 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * eventedit.c (ee_rp_init_exceptions): Update GtkClist usage.
-
-1998-11-23 Andrew T. Veliath <andrewtv@usa.net>
-
- * gncal-day-panel.c (gncal_day_panel_new): Use
- gtk_scrolled_window_add_with_viewport instead of
- gtk_container_add (gtk changes).
-
-1998-11-23 Herbert V. Riedel <hvr@hvrlab.ml.org>
-
- * eventedit.c: use GPOINTER_TO_INT
-
- * gncal-todo.c: same.
-
-1998-11-22 Matthew Wilson <msw@redhat.com>
-
- * main.c: Fixed the popt event parsing callback to have the
- correct number of arguments. This stops it from segfaulting.
-
-1998-11-16 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * eventedit.c (ee_classification_widgets): Doh. Fixed stupid bug
- where the classification buttons were not being set correctly.
- (ee_store_general_values_to_ical): Take into account the fact that
- radio group lists are stored in reverse order of insertion.
-
- * gncal-todo.c (gncal_todo_init): Use a scrolled window to put the
- clist into.
-
-1998-11-11 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * calendar.c (calendar_save): Backup the old file before saving
- the caledar.
-
-1998-11-06 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * calobj.c: Add ctype.h
-
-1998-10-31 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gnome-cal.c (gnome_calendar_direction): Add the offset from the
- beginning of the current time unit (day/month/etc), otherwise it
- does not work right, for example, you are on the 31st day of a
- month and the next month is a 30-day one and you jump to the next
- month.
-
-1998-10-16 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * month-view.c: Changed a lot of stuff not to use the layout code
- -- the month view's days are too small to display layout
- usefully. Now they display a little list of the events in each
- day. We also have a popup menu for the days in the month view.
-
- * calendar.c (calendar_get_objects_in_range): Reverse the list so
- that it is returned in increasing order.
-
- * eventedit.c (event_editor_new_whole_day): New public function to
- create an event for the complete span of day_begin to day_end.
-
- * year-view.c (new_appointment): Use event_editor_new_whole_day().
-
- * year-view.c (yv_popup_menu): Mark strings for i18n.
-
-1998-10-12 Ji Lee <g@ucsd.edu>
-
- * eventedit.c (ee_store_recur_rule_to_ical): The interval was
- never being loaded from the spin button.
-
-1998-10-09 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * month-view.c (month_view_update): Create a list of children and
- lay them out nicely. Lots of functions added for this purpose.
- (adjust_segment): Main event segment adjustment routine.
- (adjust_children): Adjusts all the children in the month view.
- (child_create_segments): Creates the segments for a particular event.
- (layout_children): Uses the generic layout engine to organize the children.
-
-1998-10-08 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-todo.c (clist_row_selected): Set the sensitivity of the
- edit/delete buttons.
- (gncal_todo_update): Likewise. Thanks to Dirk Luetjens for the
- bug report.
-
- * layout.c: Do some cleanup; now we pass a struct with the layout
- algorithm's state instead of passing a trillion parameters around.
-
- * gncal-full-day.c (layout_children): Use the new generic layout
- engine.
- (child_compare): Sort keys are start time then end time, not just
- start time. This produces somewhat nicer results for the layout
- algorithm.
-
- The new layout code uses a partition of the time range occupied by
- the events, rather than using a fixed time granularity. This is
- better since the different parts of the program that use the
- layout module will have different semantics regarding snapping the
- event bounds to a fixed "time grid".
-
-1998-10-07 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * layout.[ch]: New files that abstract the event layout code from
- gncal-full-day.c into something useful for other parts of the
- program. Now all event layout is done here.
-
- * Makefile.am (gnomecal_SOURCES): Added layout.[ch] to the list of
- sources.
-
-1998-10-07 Carsten Schaar <nhadcasc@fs-maphy.uni-hannover.de>
-
- * main.c (main): Replaced the 'gnome_client_new_default' call with
- 'gnome_master_client'.
-
-1998-10-02 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * timeutil.c (time_day_begin): Changed name from
- time_start_of_day() to be consistent with the other begin/end functions.
- (time_day_end): Likewise.
-
- * calobj.c (ical_object_get_first_weekday): New public function to
- get the first toggled day in a weekday mask. Since we do not
- support multiple weekdays in a monthly-by-pos rule, we just fetch
- the first toggled one.
- (ical_object_generate_events): Added a missing break statement.
-
- * timeutil.c (time_month_end): Made it consistent with the rest of
- the time begin/end functions -- now it returns the first second of
- the *next* month.
- (time_week_end): Actually implemented this function. It will be
- used when the week view is rewritten.
-
- * calobj.c (time_in_range): Fix off-by-one in the comparison of
- the time against the end time.
-
- * gncal-full-day.c (expand_space): Fixed bug where the columns not
- were being expanded due to a missing "slot + j".
-
-1998-10-01 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * month-view.c (month_view_init): Use the font #defines.
- (month_view_new): Set the colors of the month view upon creation.
- (mark_current_day): New function to mark the current day in the
- month view.
- (month_view_set): Mark the current day.
- (month_view_colors_changed): Mark the current day and colorify the
- month item appropriately.
-
- * month-view.h: Added year and month fields to the MonthView
- structure.
-
- * main.c: Renamed the Appointments color property, since it will
- be used by the month view as well.
-
- * goto.c (update): Set the current day's font and color.
-
- * year-view.c (year_view_init): Set the fonts of the month items
- when creating them.
-
- * mark.h: Added new #defines for HEADING_FONT and TITLE_FONT.
-
- * year-view.c (year_view_init): Use the new font #defines.
-
- * prop.c (prop_apply_colors): Fixed to work with the
- I-am-paranoid-and-I-need-to-size-my-ints changes to
- GnomeColorPicker.
- (color_spec_from_picker): Likewise.
-
-1998-09-30 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * goto.c (create_days): Colorify the month item and prepare it for
- prelighting here.
-
- * main.c (color_props): Changed the default colors to something
- not dull.
-
- * year-view.c (compute_min_size): New function to compute the
- minimum size of the year view properly.
- (year_view_size_request): Added two new fields to the year view
- structure that contain the minimum size. Return this in the
- size_request method.
- (year_view_new): Call compute_min_size to save the minimum size
- for later use.
- (idle_handler): Make it resize the items correctly.
-
- * gnome-month-item.c (gnome_month_item_set_arg): Reshape when
- necessary. This is needed becaues we now actually calculate a
- minimum size for the month item based on the font sizes and paddings.
- (check_heading_sizes): New function to calculate a minimum size
- based on the headings' dimensions.
- (check_day_sizes): New function to calculate a minimum size based
- on the day number labels' dimensions.
- (check_sizes): New function that computes a minimum size for the
- month item.
- (reshape): Now calls check_sizes() to ensure a minimum size for
- the month item.
-
- * year-view.c (mark_current_day): New function to mark the current
- day in the year view.
-
- * mark.c: Removed mark_current_day from here.
-
-1998-09-29 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * prop.c (fetch_color_spec): Changed name from fetch_prelight_spec
- and made it conform to the new prelighting mechanism.
- (fake_mark_days): Set the proper day attributes.
- (reconfigure_month): Use colorify_month_item().
- (fake_mark_days): Use mark_month_item_index().
-
- * mark.c (colorify_month_item): New public function to reset the
- colors in a month item.
- (get_attributes): New internal function that creates an array of
- attributes for the days in a month item. This is the basis of all
- the new optimizations to month item marking.
- (unmark_month_item): Now it uses the attributes array to unmark
- only the days that need unmarking.
- (mark_event_in_month): Update the day attributes array.
- (month_item_prepare_prelight): Changed the definition of the
- prelight color query function. Use the new function.
- (day_event): Do color changes based on the day attributes array.
- (mark_month_item_index): New public function to mark a single day
- by index.
- (mark_event_in_month): Use mark_month_item_index().
-
- * gnome-month-item.c (gnome_month_item_num2child): Now takes an
- int, not a GnomeMonthItemChild.
- (gnome_month_item_child2num): Now returns an int, not a
- GnomeMonthItemChild.
- (gnome_month_item_num2day): Now takes an int, not a
- GnomeMonthItemChild.
-
- * goto.c (goto_dialog): Create the days before the year spin
- button, because the year_changed callback expects the month item
- to be created. The new semantics of the spin button cause it to
- emit a value_changed signal on the adjustment upon creation -- is
- this the behavior we want from it?
- (goto_dialog): Use gtk_window_set_modal() instead of the
- deprectaed gnome_dialog_set_modal().
-
- * quick-view.c (quick_view_new): Make it look not as crappy by
- putting the title inside the frame.
- (quick_view_do_popup): Fixed the pointer grab and added a cursor.
- (create_items_for_event): Query the text width/height from the
- text item using the new object arguments, so that the size of the
- popup window can be set properly.
-
- * year-view.c (do_quick_view_popup): Calculate a nice date string
- for the popup window.
-
-1998-09-28 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * quick-view.[ch]: New file that presents a quick view of the
- events in a particular day when the mouse is clicked on the year
- view. Work in progress.
-
- * year-view.c (do_quick_view_popup): New function that creates a
- quick view for the events in a day.
-
- * Makefile.am (gnomecal_SOURCES): Added quick-view.[ch] to the
- list of sources.
-
-1998-09-27 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * main.c: Hotkey for File/Exit should be C-q, not C-x.
-
-1998-09-24 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * year-view.c (do_popup_menu): New function to execute the popup
- menu in the year view.
- (day_event): Invoke the popup menu with the context set to days.
- (new_appointment): New function to create a new appointment from
- the year view.
- (do_jump): New function to do the appropriate view/date jumping
- from the popup menu.
-
- * main.c: Fixed two icons in the File menu.
-
-1998-09-21 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * main.c: Added underlined shortcuts and accelerators to the main menu.
-
-1998-09-16 Raja R Harinath <harinath@cs.umn.edu>
-
- * gncal-week-view.c (<gtk/gtklabel.h>): Include.
- * gncal-week-view.h (<gtk/gtkvbox.h>): Include.
-
-1998-09-06 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * gnome-cal.c (mail_notify): Fixed the bug reported about the mail
- notification not beint sent until the program was terminated.
-
-1998-09-03 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-full-day.c (gncal_full_day_forall): Updated foreach ->
- forall from Gtk changes, bleah.
-
- * year-view.c (day_event): New function to handle events from
- days. Jumps to the day that is clicked.
-
- * main.c: Use a watch cursor while the previous/today/next
- functions are doing their job.
-
- * mark.c (month_item_prepare_prelight): New public utility
- function to prepare a month item for prelighting. It will store
- the proper prelight information and attach the appropriate signals.
- (mark_current_day): Make the current day bold as well (useful for
- color-blind people, I guess).
-
- * prop.c (set_current_day): Reset the date in the sample calendar
- and mark the current day.
- (fake_mark_days): Mark fake events in the sample calendar.
-
- * year-view.c (year_view_set): Use the general prelighting engine.
-
- * goto.c (day_event): Just process button presses, as prelighting
- is done behind the scenes now.
- (update): Use the general prelighting engine.
-
- * prop.c (create_colors_page): We can now configure the colors of
- the monthly calendars! Wheeeeee! There are still some nits to be
- fixed, which are listed in the TODO file.
- (build_color_spec): New function to build color specifications.
- (parse_color_spec): New function to parse color specifications.
-
- * mark.c: Modified all functions to use the configured colors.
- * goto.c: Likewise.
-
- * main.c (colors_changed): New function that notifies all
- calendars that colors have changed.
-
- * gnome-cal.c (gnome_calendar_colors_changed): New function that
- notifies all the views that the colors have changed.
-
- * month-view.c (month_view_colors_changed): New function that
- notifies the month view that colors have changed.
-
- * year-view.c (year_view_colors_changed): New function that
- notifies the year view that colors have changed.
-
- * gnome-month-item.h (struct _GnomeMonthItem): Added fields for
- outline and day box colors.
-
- * gnome-month-item.c (gnome_month_item_set_arg): Added
- outline_color, outline_color_gdk, day_box_color, and
- day_box_color_gdk arguments to month items. These are convenient
- to quickly set the colors of the month item.
- (gnome_month_item_get_arg): Likewise.
-
- * main.[ch]: Added a global array of structures for color preferences.
-
-1998-08-31 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * goto.c: Small code cleanup.
- (day_event): Upon receiving a LeaveNotify event, Reset the day's
- background to the correct color.
-
-1998-08-29 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * mark.[ch]: New files with utility functions to mark calendars
- with their events.
-
- * mark.c (mark_month_item): New public function to mark a month
- item with events.
- (unmark_month_item): New public function to unmark all the days in
- a month item to their default appearance.
-
- * year-view.c (year_view_set): Use the new unmark_month_item() and
- mark_month_item() to mark the months with events.
-
- * goto.c (update): New function that updates the calendar in the
- Go-to dialog by marking the days.
-
- * timeutil.c (time_year_begin): Modified to take a time_t value.
- (time_year_end): Likewise.
- (time_month_begin): Actually implemented this function, which was
- in the header file but not here.
- (time_days_in_month): New public function that returns the number
- of days in a month.
-
- * Makefile.am (gnomecal_SOURCES): Added mark.[ch] to the sources.
-
- * year-view.c (unmark_days): Use unmark_month_item().
-
- * gncal-full-day.c (gncal_full_day_destroy): Fixed crash when
- destroying the full day view. The full day's destroy method is
- unusual in that it destroys the list of child widgets itself, as
- it does not have a remove method, so it needs to reset the list to
- NULL.
-
-1998-08-27 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gnome-month-item.c (build_month): Now does the correct thing
- when the user wants weeks to start on Monday. Now all the Monday
- special casing, as far as day numbering is concerned, is only in
- this function.
-
- * year-view.c (mark_days): This function marks the days that have
- events in them. It also fixes a memory leak in the old
- implementation (it was leaking the whole list).
- (unmark_days): New function used to unmark all the days in the
- year view.
- (mark_event): New function that marks all the days that are
- spanned by a time range. It also fixes the bug in the old
- implementation where it could possibly mark days past the ends of
- the year (if the event crosses year boundaries, for example).
-
- * timeutil.c (time_year_begin): Take the year parameter since year
- 1, not 1900.
- (time_year_end): Likewise.
-
- * year-view.c (year_view_size_allocate): Now changing the size of
- the calendars is done in the idle loop.
- (idle_handler): This function actually does the resizing of the items.
-
- * year-view.h (struct _YearView): Added idle_id and need_resize
- fields.
-
-1998-08-26 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * year-view.c: Beginning of the new year view. Sizing and event
- marking needs to be finished.
-
- * gnome-cal.c: Updated for year-view.
- (gnome_calendar_time_format_changed): Use year_view_time_format_changed().
-
- * year-view.[ch]: Renamed the gncal-year-view.[ch] files to
- year-view.[ch].
-
- * Makefile.am (gnomecal_SOURCES): Updated year-view.[ch] in the
- list of source files.
-
-1998-08-25 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * goto.c (create_days): Set the heading color of the month item.
-
- * main.c: Use GNOME_STOCK_PIXMAP_JUMP_TO, now that it exists,
- instead of goto.xpm. Also, removed goto.xpm from cvs.
-
- * gnome-month-item.h (struct _GnomeMonthItem): Added fields for
- the heading and day number fonts. Added fields for heading and
- day number label colors.
-
- * gnome-month-item.c (gnome_month_item_class_init): ARG_DAY_NAMES
- should be write-only. Also, added arguments for heading and day
- number fonts. Added arguments for heading and day number colors.
-
-1998-08-24 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * prop.c (build_two_radio_group): Doh. Set the state of the radio
- buttons properly.
-
- * month-view.c (month_view_time_format_changed): New public
- function that notifies the month view of a time format change.
-
- * gnome-cal.c (gnome_calendar_time_format_changed): New public
- function that notifies the calendar of a time format change.
-
- * main.c (time_format_changed): Use gnome_calendar_time_format_changed().
-
- * month-view.c (month_view_update): New public function to update
- the month view when an event changes. This is still unfinished.
- (month_view_set): New public function to set the month in the
- month view.
-
- * gnome-cal.c (gnome_calendar_direction): Add case for month view.
- (gnome_calendar_set_view): Likewise.
- (gnome_calendar_update_all): Likewise.
-
- * timeutil.c (time_add_week): Implemented the time_add_week()
- function, which was on the header file.
- (time_add_month): Added public month-adding routine.
-
- * gnome-cal.c (gnome_calendar_get_current_view_name): Add case for
- month view.
- (gnome_calendar_goto): Likewise, and set the time on the month view.
-
- * month-view.c (month_view_new): Now it takes the calendar plus
- the time_t representing the month.
-
- * gnome-month-item.h: Added documentation on the object arguments
- for the month item.
-
- * month-view.c (month_view_init): Added a month/year heading to
- the month view.
-
- * TODO: Updated the TODO list a bit.
-
- * main.c (gnome_cal_file_menu): The preferences menu option should
- go in the File menu.
- (gnome_cal_edit_menu): Added stock pixmaps to the menu items.
- (gnome_cal_menu): Renamed the Calendar menu to Edit.
- (gnome_cal_help_menu): Use "About Gnomecal", not just "About".
-
- * prop.c (hour_activated): Notify the property box that it has changed.
-
- * main.c: Changed the Properties menu item to Preferences. These
- are global application preferences, not a single calendar's
- properties.
-
- * prop.c (prop_apply): Save the week_starts_on_monday flag to the
- configuration file.
- (properties): Added a check button for weeks starting on Monday.
- (properties): Beautified the Preferences dialog.
-
- * month-view.c (month_view_init):
- * goto.c (create_days): Set the month item to start weeks on
- Monday if appropriate.
-
- * main.c (init_calendar): A boolean is not an hour, so don't
- range_check_hour() on it.
- (init_calendar): Added a global week_starts_on_monday flag.
-
- * main.h: Added global week_starts_on_monday flag.
-
-1998-08-21 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * calobj.c (ical_object_create_from_vobject): If mail alarm or
- program alarm are missing the action, then set an empty default.
-
-1998-08-18 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gnome-month-item.c (gnome_month_item_day2index): New public
- function to get the displayed day index of the specified date.
-
- * gnome-cal.c (gnome_calendar_goto_today): New public function to
- jump to the current day.
-
- * goto.c (day_event): Jump to the selected day when the user
- clicks the mouse, and prelight days as appropriate.
-
- * timeutil.c (time_from_day): New public function to build a
- time_t from a year/month/day triplet.
-
- * gnome-month-item.c (gnome_month_item_num2child):
- (gnome_month_item_child2num): New public functions to convert an
- index into a child and vice-versa, respectively.
- (gnome_month_item_num2day): New public function to convert a child
- number into a displayed day number.
-
- * goto.c (goto_dialog): Doh, use gnome-dialog properly :-)
-
- * gnome-month-item.c (create_items): Use g_strdup()ed day names
- from the start.
-
-1998-08-17 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * main.c (gnome_toolbar): Made it use goto.xpm.
-
- * Makefile.am (EXTRA_DIST): Added goto.xpm to the list of files.
-
-1998-08-13 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gnome-month-item.c (gnome_month_item_set_arg): Doh. Actually
- recalculate the days using the month and year.
-
- * main.c: Added "Go to" button to quickly jump to a specific date.
-
- * goto.c: New file that defines the quick go-to date dialog.
-
- * Makefile.am (gnomecal_SOURCES): Added goto.c to the sources.
-
-1998-08-11 Nuno Ferreira <nmrf@rnl.ist.utl.pt>
-
- * main.c (new_calendar): Made title i18n friendly. This was bug
- #215.
-
- * eventedit.c (ee_store_recur_end_to_ical): Set recur->enddate to
- recur->_enddate, not to itself, when adding recurring event and
- supplying an end date. This fixes (at least part of) bug #99.
-
-1998-08-10 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * month-view.[ch]: Start of the month view widget. This will use
- the generic month item and extend it to have the semantics desired
- for the gnomecal month view.
-
- * gnome-month-item.[ch]: New generic canvas item for the month
- view and the "small calendars". This is intended to be a
- high-level display engine for monthly calendars. This is a work
- in progress.
-
- * gnome-cal.h (GnomeCalendar): Added a month_view field.
-
- * gnome-cal.c (setup_widgets): Create the month view and insert it
- into the notebook.
-
- * Makefile.am: Added month-view.[ch] and gnome-month-item.[ch] to
- the sources.
-
-1998-08-03 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * main.c (about_calendar_cmd): Use an array of const strings to
- keep gcc happy.
-
- * alarm.c (alarm_compare_by_time): Use gconstpointer to keep gcc happy.
- * calendar.c (calendar_object_compare_by_start): Likewise.
- * gncal-full-day.c (child_compare_by_start): Likewise.
-
-1998-07-07 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * main.c: Add support for --view flag.
- (session_save_state): Save the view mode;
- (new_calendar): Now takes a view mode flag.
-
- * gnome-cal.c (gnome_calendar_get_current_view_name): New
- function for enhancing the session management support for
- gnomecal.
- (gnome_calendar_set_view): New function that makes a given page
- active.
-
-1998-07-01 Nuno Ferreira <nmrf@rnl.ist.utl.pt>
-
- * gncal.desktop: Added Portuguese translation.
-
-Mon Jun 22 13:01:16 1998 Havoc Pennington <hp@pobox.com>
-
- * main.c (session_save_state): Use gnome_geometry_string to get
- the geometry string.
-
-1998-06-04 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * eventedit.c (ee_rp_init_rule): Do not subtract 1 from
- tm->tm_mday for the default_day.
-
- * gnome-cal.c (gnome_calendar_new):
- (gnome_calendar_goto): Use the start of the day -- things expect
- it to be that way.
-
-1998-05-27 Nuno Ferreira <nmrf@rnl.ist.utl.pt>
-
- * eventedit.c (ee_store_recur_rule_to_ical): Fill in
- ical->recur->interval from value in spin_button. This ixed an
- infinnite loop.
-
-1998-05-30 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-full-day.c (child_draw): Paint the decorations correctly.
- (child_draw_decor): Paint the recurrence/bell icons correctly.
-
-1998-05-25 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * eventedit.c (ee_rp_init_rule): Use the contents of
- ee->ical->dtstart for computing the predefined values of the recurrence.
-
- * gncal-full-day.c (gncal_full_day_unrealize): Fix the gc
- destruction in the unrealization code and fix the pixmap unrefing.
-
- * main.c (close_cmd): Remove a bad hack that disabled calendar
- widget destruction.
-
- * calobj.c (ical_object_generate_events): Fix for the weekly event
- generation. Was reported on the bug tracking system.
-
-1998-05-18 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * gncal-full-day.c (layout_children): Implemented ultra-cool
- layout for the events that share the same time range. Gals and
- guys you can now drop Outlook on the recycle bin.
-
- Which reminds me. We do not have a recycle bin. How could that
- happen in a project as cool as this one? Someone explain this to
- me.
-
-1998-05-18 Federico Mena <federico@nuclecu.unam.mx>
-
- * gncal-full-day.c (paint_back): Eliminated unnecessary border repainting.
-
-Sun May 17 17:55:03 1998 Havoc Pennington <hp@pobox.com>
-
- * gncal-todo.c (simple_todo_editor): Close dialog when return is pressed.
-
-1998-05-15 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * gnome-cal.c (mark_gtk_calendar_day): Bug free version of the
- range computation in place.
-
- * gncal-year-view.c (year_view_mark_day): Use the same new version
- of the range computation here.
-
- * calobj.c (ical_object_generate_events): Fix the begin/end
- condition.
-
-1998-05-14 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * timeutil.c (isodate_from_time_t): Do not add the spurious
- padding.
-
- * calobj.c (store_date_list): Bug fix: I was using the wrong
- pointer when saving the exception date list.
- (set_date_list): Bug fix: load correctly the complete exception
- date list.
- (set_date_list): Use ',' for the exception date separator as the
- versit people can not get their standard right.
-
- * gncal-full-day.c (unrecur_appointment): Support for making an
- existing recurrent event `movable' for a day.
-
- * calobj.c (ical_object_add_exdate): New routine, used to add
- exception dates.
- (ical_object_duplicate): New routine: used to do the magic
- recur->no-recur event.
-
-1998-05-08 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * gncal-full-day.c (new_appointment): Use gtk_calendar freeze/thaw
-
- * gncal-year-view.c (gncal_year_view_set_year): Use gtkcalendar freeze/thaw.
-
- * eventedit.c (event_editor_init): Use gnome_dialog_set_close to
- avoid the ugly warning.
-
- * main.c (display_objedit): Default to the day the user is looking
- at.
-
-1998-05-05 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * gncal-day-panel.c (full_day_size_allocated): Do not emit a value
- changed signal if the value is the same.
-
-1998-05-04 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * prop.c (prop_apply): Only run the apply code once.
-
-1998-05-03 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * gncal-day-panel.c (update): Draw the day at startup.
- (gncal_day_panel_set): Fix selected-day display.
- (gncal_day_panel_new): Switch day on double clicks, not on single
- clicks.
-
- * calobj.c (ical_object_compute_end): Removed debug messages.
-
-1998-04-30 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * prop.c (prop_apply): Do not call prop_cancel, ths is now using
- GnomePropertyDialog.
-
-1998-04-29 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * gncal-week-view.c (sync_week): Use gnome_calendar_tag_calendar.
-
- * gnome-cal.c (gnome_calendar_tag_calendar): New routine used to
- fill a gtk_calendar with the events on a GnomeCalendar object.
-
- * gncal-week-view.c (gncal_week_view_new): Set the week to the day
- we double clicked.
-
-1998-04-28 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * gnome-cal.c (calendar_notify): Apply black magic to get mail
- notifications to work.
-
- * gncal-full-day.c (child_focus_out): Temporary optimization, the
- child_focus_out is constantly calling the
- gnome_calendar_object_changed when the property editor has been
- invoked. This happens every time the mouse moves crosses the main
- window.
-
- * calendar.c (calendar_object_changed): Reschedule alarms when a
- calendar object has changed its times.
-
-Sat Apr 25 22:20:45 1998 Havoc Pennington <hp@pobox.com>
-
- * eventedit.c, eventedit.h: Descend from GnomeDialog. Took vbox
- out of class structure; use GnomeDialog vbox
- instead. gnome_dialog_set_destroy instead of destroying in button
- callbacks. Don't create buttons, separator, or vbox manually.
- #include <libgnomeui/gnome-dialog.h>.
-
-1998-04-24 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * calobj.c (ical_object_create_from_vobject): Fixed alarm loading;
- Load snooze time and snooze count
-
-1998-04-23 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * calendar.c (calendar_save): Actually save the to-do entries.
-
- * gncal-todo.c (simple_todo_editor): Now you can add and edit
- to-do entries.
-
-1998-04-22 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-full-day.c: Made it use popup_menu().
-
- * popup-menu.c: New file with utility functions for creating popup
- menus. Maybe such a thing would be useful in libgnomeui, a la
- gnome-app-helper?
-
- * Makefile.am (gnomecal_SOURCES): Added popup-menu.[ch] to the sources.
-
-1998-04-22 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * prop.c (properties): Added Calendar properties editor.
- (properties): Make the code use a propery box.
-
- * main.c: Save/load properties (fix to old commit).
-
-1998-04-21 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-todo.c: New widget for editing TODO lists. This will be
- worked on a lot.
-
- * Makefile.am (gnomecal_SOURCES): Added gncal-todo.[ch] to the sources.
-
- * gncal-day-panel.c: Make it use the new TODO widget.
-
-1998-04-21 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * timeutil.c (isodate_from_time_t): Do not save with the global
- time flag (Z at the end of the isodate). When we figure out a way
- to load times in GMT time, we will add this back
-
- * view-utils.c (popup_menu): Moved this routine here as there are
- more users of this code.
-
- * gncal-day-view.c (gncal_day_view_class_init): Add button press
- handler.
- (new_appointment): New routine for creating appointments on a day.
-
-
-
- * main.c (save_ok): Added call to gtk_window_set_wmclass.
-
- * gncal-day-panel.c (calendar_day_selected): Fix, years for mktime
- should substract 1900 and gtk_calendar stores years relative to
- year 0.
-
- * gncal-week-view.c (gncal_week_view_new): Make the week view
- descend from VBox so that we can add a label to it.
- (gncal_week_view_set): Display the ending day of the week
- correctly.
-
- Added a label that displays the week range.
-
-1998-04-21 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gnome-cal.c: Made it use GncalDayPanel.
-
- * gncal-day-panel.c: New widget for the day view in the main
- calendar toplevel. It basically takes care of everything
- gnome-cal did by hand with respect to the day view.
-
- * Makefile.am (gnomecal_SOURCES): Added gncal-day-panel.[ch] to
- the rules.
-
- * main.c: Added a separator between the About menu item and the
- help topics.
-
-1998-04-20 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * eventedit.c (ee_ok): Mark the event as non-new after accepting changes.
-
-1998-04-20 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-full-day.c (gncal_full_day_get_day_start_yoffset): New
- public function that returns the y offset for the row
- corresponding to the "day begin" time.
-
- * gncal-full-day.c (gncal_full_day_key_press): Now any printable
- keystroke (not just Return) will activate the selected range.
-
- * gncal-full-day.c (paint_back): Made it use the new paint_row
- function instead of painting everything directly. We calculate
- areas in a smarter way so there is even less flicker than before,
- especially when selecting regions.
-
- * eventedit.c: Sensitize recurrence widgets properly.
-
- * calobj.c (duration_callback): Pass the correct pointer type to
- is_date_in_list().
-
-1998-04-20 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * calobj.c (duration_callback): Take exception dates into
- account.
-
- * gncal-full-day.c (new_appointment): Setup the event editor dates
- to those of the currently displayed day.
- (gncal_full_day_selection_range): Use sensible values in the case
- no range is selected.
- (new_appointment): Events now use the current day for event creation.
-
- * view-utils.c: Pretty up the time display.
-
- * calobj.c (ical_object_compute_end): Initialize
- ico->recur->enddate, otherwise we loop forever during final date computation.
-
- * eventedit.c: Now recurrence is toggled by a radio button in the
- recurrence page, as the checkbox is confusing.
-
- * calobj.c (is_date_in_list): Add support for the exclussion
- dates.
-
-1998-04-18 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * gncal-year-view.c (double_click): Fix this routine as well.
-
- * gncal-week-view.c (jump_to_day): Bind the gtkcalendar signals to
- the week.
-
- * gncal-year-view.c (gncal_year_view_set_year): Put things in the
- proper range. Now the year view actually matches this year.
-
- * gnome-cal.html: Added small documentation.
-
- * main.c: Add more icons to the menus; Rename some menubar
- entries; Add `new' icon to the toolbar.
- (dump_events): Added argument handling and dumping of events from
- the command line. Extremely cool.
-
- * getdate.y: Taken from the CVS source code. Used for date
- parsing in the command line.
-
- Internationalized getdate.y. Wee! It even works with spanish.
-
- * calobj.c (ical_object_to_vobject): Add Quoted printable property
- to items containing new lines.
- (duration): Use unsigned integers, to work around buggy calendar
- files generated by korganizer.
-
- * main.c (save_calendar_cmd): Do not ask for file name if we are
- saving.
- (save_as_calendar_cmd): New command.
-
-
-1998-04-17 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * alarm.c (alarm_kill, alarm_init, alarm_add): Implement the alarm
- management framework.
-
-1998-04-17 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * calobj.c (ical_new): Added mandatory status property.
- (ical_object_to_vobject): Only store "related" list if it exists.
- (store_list): Add terminating null char and free the correct data.
-
- * main.c (save_calendar_cmd): Implemented calendar saving.
- (open_calendar_cmd): Implemented calendar loading.
- (new_calendar_cmd): Implemented calendar creation.
- (new_calendar): Don't load our test calendar by default.
-
- * gncal-full-day.c (delete_appointment): Delete appointment implemented.
-
- * eventedit.c (ee_store_recur_values_to_ical): Free/create
- ical's recurrence appropriately.
- (ee_rp_init_rule): Initialize all missing parameters from ical.
- (ee_rp_init_ending_date): Initialize missing fields from ical.
-
-1998-04-17 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * gnome-cal.c (gnome_calendar_remove_object): Add support for
- removing objects.
-
-1998-04-17 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * eventedit.c (ee_init_recurrence_page): New function that creates
- the recurrence page in the toplevel notebook.
- (ee_store_recur_values_to_ical): Now we can also store the recurrences.
-
-1998-04-17 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * calobj.c (ical_object_generate_events): Implement
- RECUR_MONTHLY_BY_POS implemented.
- (ical_object_create_from_vobject): Fix the alarm
- initialization code.
- (save_alarm): Save alarms.
- (ical_object_generate_events): Fixed the recurrent code to take
- into account the recur->endate field (if at all specified).
-
- (ical_object_to_vobject): Implement recurrence rule saving.
-
-1998-04-16 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * eventedit.c (ee_store_alarm): Use menu_shell->children, not
- menu->children. Why does GtkMenu have a children field in the
- object structure?
- (check_dates): New function that insures that start_date < end_date.
- (check_times): In addition to checking whether the event spans the
- whole day, now it insures that start_time < end_time.
-
- * gncal-full-day.c (child_set_size): Now children get bigger
- temporarily while they are focused. This allows the handles not
- to "overlap" the rows used by the child and thus allow editing of
- very thin events.
- (recompute_motion): Fix for new child coordinates.
- (gncal_full_day_expose): Make it use find_child_by_window()
- instead of looking for it by hand.
-
- * bell.xpm recur.xpm: XPM files for events with alarm and
- recurrence, respectively.
-
-1998-04-15 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-full-day.c (button_1): Preserve the up/down cursor while dragging.
-
- * gncal-full-day.c (child_draw): Now children have a vertical
- handle as well. This can be used to move the child anytime, not
- only when it is focused.
- (recompute_motion): Modified for new drag behavior.
-
- * eventedit.c (ee_init_general_page): The general_owner may be
- null. Do the proper thing when creating the label.
- (ee_ok): Update the gnome calendar appropriately.
-
- * timeutil.h:
- * gncal-year-view.h: Add some missing prototypes.
-
- * gncal-full-day.c (child_popup_menu): Set the sensitivity of menu
- items according to whether the ical object is being edited or not.
-
- * eventedit.c (event_editor_new): Set the "being edited" flag on
- the ical object (stored as the ical object's user data).
- (event_editor_destroy): Release the flag.
-
- * calobj.h: The iCalObject structure now has a generic user_data pointer.
- * calobj.c (ical_object_set_user_data ical_object_get_user_data):
- Functions to set this data.
-
- * gncal-full-day.c (child_button_press): Do child popup menu correctly.
-
- * main.c (about_calendar_cmd): Fixed my address and added Arturo
- to the authors in the about box.
-
- * gncal-full-day.c (find_child_by_window): Compare child's widget
- windows by user_data (which will be the parent widget, that is,
- the text widget). We cannot assume that child->widget->window
- will be *the* window we are interested on because there may be
- child widgets with multiple windows.
-
-1998-04-15 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * calobj.c (ical_foreach): Define iterator routine.
-
-1998-04-15 Arturo Espinosa Aldama <arturo@nuclecu.unam.mx>
-
- * gncal-year-view.[hc]: Now using time_t for new and set.
- Random fixes, as well.
-
-1998-04-15 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-full-day.c (button_3): New popup menus activated with
- mouse button 3.
- (create_appointment): Create a new appointment from the popup
- menus. See the FIXME.
-
-1998-04-15 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * gncal-full-day.c (layout_kill_rows): Routine to destory rows
- array properly.
-
- * gncal-year-view.c (gncal_year_view_new): Add missing year in
- call to strftime.
-
- * calobj.c (ical_object_create_from_vobject): Fixed memory leaks
- from the return values of versit's fakeCString.
-
-1998-04-14 Arturo Espinosa Aldama <arturo@nuclecu.unam.mx>
-
- * gncal-year-view.[hc]: New widget for the year view.
- * Makefile.am: added required compilation of the new files.
-
-1998-04-14 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * eventedit.c (event_editor_setup_time_frame): Fixed some table
- expansions to make the dialog look nicer when resized.
-
- * calobj.c (ignore_space): Fixed compiler warning about unused
- computed value.
- (ocurrencelist): Replace str by p confusion. Removed unused
- variables value and q.
- (daynumber): Fixed a couple of warnings about unused values.
- (load_recurrence): Removed unused variable c. Added a default
- clause to the switch(type).
-
- * eventedit.c (ee_rp_init_frequency): Removed unused variable content.
- Fixed a compiler warning by adding a missing cast.
-
- * calobj.c (ical_object_create_from_vobject): Make the
- load_recurrence() part work correctly. Eliminated use of
- syntax_error variable.
-
-1998-04-13 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-full-day.c (child_key_press): Unfocus the child and focus
- the parent fullday widget when the user presses Esc.
-
- * gncal-week-view.c (gncal_week_view_update): Now takes object and
- flags parameters.
- * gncal-day-view.c (gncal_day_view_update): Likewise.
- * gncal-full-day.c (gncal_full_day_update): Likewise.
- (child_focus_in): New function. In conjunction with
- child_focus_out(), these only display the handles in the child
- when it is focused. The result is that the user can see more of
- the child's text when nothing is focused, and we can also display
- fatter and nicer drag handles.
-
- * gnome-cal.c (gnome_calendar_object_changed): Now takes an
- additional flags parameter
- (gnome_calendar_update_all): Made function static. Now takes
- changed object and flags parameters as well.
- (gnome_calendar_object_changed): Now takes additional flags
- parameter to indicate what changed in the specified object.
-
- * calobj.h (CalObjectChange): New enum with flags to describe what
- has been changed in an object.
-
- * gncal-full-day.h:
- * gncal-full-day.c (gncal_full_day_focus_child): New function to
- let the outside world decide which child to focus.
- (gncal_full_day_focus_child): Bleah. We have to synthesize a
- click because GtkText will not set the cursor when you focus it.
-
- * gnome-cal.c (day_view_range_activated): Focus the new child in
- the full day widget.
-
- * eventedit.c (event_editor_setup_time_frame): Re-aligned some
- widgets to make it look prettier.
- (ee_alarm_widgets): Likewise.
- (ee_init_general_page): Likewise.
- (ee_classification_widgets): Likewise.
- (event_editor_init_widgets): Likewise.
-
- * gnome-cal.c (day_view_range_activated): Create new object and
- add it to the calendar. You can now select a range in the
- full-day view, hit Return, and a new event will be added at the
- selected range. I still have to figure out how to focus this new child.
-
- * gncal-full-day.c (paint_back): Rewrote function to avoid
- painting an area more than once -- eliminate flicker.
- (paint_back_rows): New function that calls paint_back() only for
- the area of the specified rows.
- (gncal_full_day_button_press):
- (gncal_full_day_button_release):
- (gncal_full_day_motion): Made these functions use
- paint_back_rows() instead of paint_back(), to eliminate flicker. Wheee!
-
-1998-04-12 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gnome-cal.c (setup_day_view): We now connect to the
- range_activated signal of the fullday widget instead of catching
- key presses ourselves.
- (day_view_range_activated): New function that creates a new
- iCalObject and inserts it into the calendar, not finished yet.
-
-1998-04-11 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-full-day.c (get_time_from_rows): New function, calculates
- a pair of time_t values from the specified start and number of rows.
-
- * gncal-full-day.h (GncalFullDayClass): New signal
- "range_activated". It is emitted when a range is selected and the
- user hits Return.
- (gncal_full_day_selection_range): New function, returns the
- selected range.
-
- * gncal-full-day.c (struct drag_info): Moved selection information
- to their own fields instead of sharing the child's drag fields.
- This allows us to keep the selection when a child is moved.
- (recompute_motion): Made the case when (row < di->sel_click_row)
- work correctly.
-
-1998-04-11 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * gnome-cal.c (gnome_calendar_goto): Add support for navigating
- on the day view.
-
- * timeutil.c (time_start_of_day, time_end_of_day, time_day_hour):
- New time manipulation functions.
-
- * eventedit.c (ee_rp_init_frequency): Add the different frequency
- editors to a notebook. Make the notebook startup on the entry
- selected recurrence type;
-
-1998-04-11 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-full-day.c (recompute_motion): Now we support selecting a
- range in the main window (by clicking+dragging). It flickers
- horribly and is not perfect, but it is a start.
-
-1998-04-09 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-full-day.c: #include <string.h>
-
- * gncal-full-day.c (child_map): Show instead of just map the child
- widget (otherwise the text widget gets confused and will not focus).
-
- * calobj.c (ical_object_to_vobject): Quote chars as 'x', not "x".
-
- * calobj.h: Added prototype for ical_object_to_vobject().
-
- * gnome-cal.c (gnome_calendar_object_changed): New function. This
- should be called when a calendar object is changed.
-
- * gncal-full-day.c (update_from_drag_info): Call
- gnome_calendar_object_changed() instead of updating manually.
-
- * calendar.c (calendar_add_object):
- (calendar_remove_object): Set the modified flag to true.
-
- * gncal-full-day.c (gncal_full_day_draw): Finished implementing
- this function.
-
-1998-04-08 Raja R Harinath <harinath@cs.umn.edu>
-
- * gncal.c (update_calendar): Say `#if 0', not `#ifdef 0'.
-
-1998-04-07 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * eventedit.c: Removed unused global variable parent_class.
-
- * eventedit.h: Renamed gtk_window field to window.
- Made the parent_class field in the EventEditorClass structure be a
- GtkWindowClass, not a gnome property box class.
- Added prototype for event_editor_get_type().
-
-1998-04-06 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-week-view.c (gncal_week_view_new): Use the new
- gtk_table_set_homogeneous() instead of setting the variable directly.
-
-1998-04-03 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * eventedit.c (ee_create_ae): Make it return void.
- (ee_alarm_widgets): Remove some unused variables.
- (ee_store_alarm): Make it return void.
- #include <string.h>
-
- * eventedit.h: #include "gnome-cal.h"
-
- * calobj.c (list_free): Don't use g_free in the g_list_foreach.
-
- * calendar.h: Add prototype for calendar_load().
-
- * timeutil.h: Add prototypes for time_add_*().
-
- * calendar.c:
- * calobj.c:
- * eventedit.c:
- * gnome-cal.c: #include "timeutil.h"
-
- * gncal-day-view.c (gncal_day_view_size_request): Make the minimum
- width equal or larger to the title width.
-
- * main.c: #include "eventedit.h"
- (main): Add a return statement.
- (new_calendar): Show stuff *after* the calendar has been loaded.
-
- * gnome-cal.c (gnome_calendar_load): Update the day view.
- (setup_widgets): Hackish setup of a day view widget - will fix later.
- (gnome_calendar_init): Initialize all fields.
-
- * gnome-cal.h: Added day_view field. Maybe this should be changed
- when the a complete day view panel is complete.
-
- * gncal-day-view.c (gncal_day_view_update): Draw after update, not
- before.
-
-1998-04-06 Carsten Schaar <nhadcasc@fs-maphy.uni-hannover.de>
-
- * versit/.cvsignore: New file.
-
-Fri Apr 3 22:31:54 1998 Tom Tromey <tromey@cygnus.com>
-
- * calendar.c: Include <config.h>.
-
-1998-04-03 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * timeutil.c (time_add_year, time_add_year, time_add_week):
- Routines for time manipulation.
-
- * calobj.c (ical_object_destroy): Full destruction of the object.
-
- * eventedit.c: Finished the main event editor form; It still
- lacks the details and the recurrence bits. It now adds events
- and cancels.
-
-1998-04-03 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * view-utils.c (view_utils_draw_events): The "better" format
- string for strftime() wasn't better, after all :-(
-
-1998-04-02 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-full-day.c: New full-day widget. It is still a work in
- progress. It will be similar to M$ Schedule's nifty full day view
- widget, but with Gtk's elegance :-)
-
- * Makefile.am (gnomecal_SOURCES): Added gncal-full-day.[ch] to the sources.
-
-1998-04-02 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * eventedit.c: Object editor widget. We dropped ObjEdit.
-
- * timeutil.c (time_from_isodate): Fix.
-
- * view-utils.c (view_utils_draw_events): Changed the display
- formats.
-
-1998-04-02 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * view-utils.c (view_utils_draw_events): Use better format
- specifier for strftime().
- (view_utils_draw_textured_frame): Ultra-nifty function to draw
- textured "metal" frames, like Netscape's handles.
-
-1998-04-02 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * gncal-day-view.c (gncal_day_view_update): Day events are now
- cached inside the widget. They get initialized at this time.
-
- * view-utils.c (view_utils_draw_events): Use the list of events.
-
-1998-04-02 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-day-view.c (gncal_day_view_set_shadow): New customization
- function. We can't decide on a stupid border type :-)
- (gncal_day_view_init): Made GTK_SHADOW_ETCHED_IN be the default
- shadow type. Looks good.
-
-1998-04-02 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * main.c: New main program that uses our new datatypes and
- objects.
-
- * calendar.c (calendar_load_from_vobject, calendar_load):
- Implement loading of vCalendar objects and vCalendar files.
-
- * calobj.c (ical_object_create_from_vobject): Implement loading of
- vCalendar event and todo objects.
-
- * timeutil.c (isodate_from_time_t): New function.
-
- * gnome-cal.c, gnome-cal.h: Implement a toplevel widget, derived
- from GnomeApp. It holds all of the day views and arbitrates the
- display.
-
-1998-04-02 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-week-view.[ch]: New week view composite widget. This
- provides a full week view (7 day views plus busy time display --
- the latter is currently unimplemented).
-
-1998-04-01 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal-day-view.c: New day view widget. It is intended to be a
- child widget of the week view composite widget.
-
- * calendar.c (calendar_get_objects_in_range):
- (calendar_get_events_in_range):
- (calendar_get_journal_in_range):
- (calendar_get_journal_in_range): These functions now take a
- sort_func parameter, which is of type GCompareFunc. If the
- specified value is non-NULL, it will return a sorted list.
- Otherwise, it will return an unordered list.
- (calendar_compare_by_dtstart): Provide a generic sorting routine
- for calendar objects.
-
-1998-04-01 Miguel de Icaza <miguel@kernel.org>
-
- * Start from scratch
-
-Tue Mar 31 23:46:50 1998 Tom Tromey <tromey@cygnus.com>
-
- * timeutil.c (format_simple_hour): `buf' now static.
-
-1998-03-31 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal.c: Removed #include "gtkcalendar.h", because it now comes
- from libgnomeui.
-
- * Makefile.am (gncal_SOURCES): Added new source files to the rules.
-
- * timeutil.c (format_simple_hour): New function, formats an
- hour/am_pm pair into a string of the form "3am", "12pm", "05h",
- "19h", etc. It is used by the day view widget for its labels.
-
-1998-03-31 Craig Small <csmall@small.dropbear.id.au>
-
- * Now has (non working) session maangement
- * Uses a clist for the dailylist like gtt
-
-Sat Mar 21 15:43:20 1998 Tom Tromey <tromey@cygnus.com>
-
- * gncal.c: Use gnome_message_box_*, not gnome_messagebox_*.
-
-1998-03-12 Craig Small <csmall@small.dropbear.id.au>
-
- * Now linked (in some horrible way) to the gtkcalendar widget.
-
-Sun Mar 8 16:38:10 1998 Tom Tromey <tromey@cygnus.com>
-
- * Makefile.am (INCLUDES): Added GNOME_INCLUDEDIR.
- (gncal_LDADD): Don't include libsupport.a.
-
- * gncal.c (main): Use new gnome_init.
-
-1998-02-19 Federico Mena Quintero <federico@nuclecu.unam.mx>
-
- * gncal.c (main): Added app_id "gncal".
-
-1998-02-19 Carsten Schaar <nhadcasc@fs-maphy.uni-hannover.de>
-
- * Makefile.am (gncal_LDADD): Added '$(INTLLIBS)'
-
-1998-02-18 Raja R Harinath <harinath@cs.umn.edu>
-
- * Makefile.am (gncal_LDADD): Include `libsupport.a'.
-
- * calcs.c (month_atoi): Replace buggy explicit loop string compare
- with strcasecmp.
- (day_atoi): Likewise.
-
-Sun Jan 25 23:38:30 1998 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * menus.c: Replace "Quit" with "Exit".
diff --git a/calendar/Makefile.am b/calendar/Makefile.am
deleted file mode 100644
index 56acae59c8..0000000000
--- a/calendar/Makefile.am
+++ /dev/null
@@ -1,25 +0,0 @@
-if ENABLE_PILOT_CONDUITS
-CONDUIT_DIR = conduits
-else
-CONDUIT_DIR =
-endif
-
-SUBDIRS = idl common gui importers $(CONDUIT_DIR)
-
-error_DATA = calendar-errors.xml
-error_i18n = $(error_DATA:.xml=.xml.h)
-errordir = $(privdatadir)/errors
-%.xml.h: %.xml
- $(top_builddir)/e-util/e-error-tool $^
-
-EXTRA_DIST = \
- ChangeLog.pre-1-4 \
- $(error_DATA) \
- zones.h
-
-dist-hook:
- cd $(distdir); rm -f $(BUILT_SOURCES)
-
-BUILT_SOURCES = $(error_i18n)
-
-CLEANFILES = $(BUILT_SOURCES)
diff --git a/calendar/calendar-errors.xml b/calendar/calendar-errors.xml
deleted file mode 100644
index 5b5076d450..0000000000
--- a/calendar/calendar-errors.xml
+++ /dev/null
@@ -1,200 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<error-list domain="calendar">
-
- <error id="prompt-cancel-meeting" type="question" defult="GTK_RESPONSE_YES">
- <primary>Would you like to send all the participants a cancellation notice?</primary>
- <secondary>If you don't send a cancellation notice, the other participants may not know the meeting is canceled.</secondary>
- <button label="Don't Send" response="GTK_RESPONSE_NO"/>
- <button label="Send Notice" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-delete-meeting" type="question" defult="GTK_RESPONSE_NO">
- <primary>Are you sure you want to delete this meeting?</primary>
- <secondary>All information on this meeting will be deleted and can not be restored.</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_NO"/>
- <button stock="gtk-delete" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-cancel-task" type="question" defult="GTK_RESPONSE_YES">
- <primary>Would you like to send all the participants a cancellation notice?</primary>
- <secondary>If you don't send a cancellation notice, the other participants may not know the task has been deleted.</secondary>
- <button label="Don't Send" response="GTK_RESPONSE_NO"/>
- <button label="Send Notice" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-delete-task" type="question" defult="GTK_RESPONSE_NO">
- <primary>Are you sure you want to delete this task?</primary>
- <secondary>All information on this task will be deleted and can not be restored.</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_NO"/>
- <button stock="gtk-delete" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-cancel-journal" type="question" defult="GTK_RESPONSE_YES">
- <primary>Would you like to send a cancellation notice for this journal entry?</primary>
- <secondary>If you don't send a cancellation notice, the other participants may not know the journal has been deleted.</secondary>
- <button label="Don't Send" response="GTK_RESPONSE_NO"/>
- <button label="Send Notice" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-delete-journal" type="question" defult="GTK_RESPONSE_NO">
- <primary>Are you sure you want to delete this journal entry?</primary>
- <secondary>All information on this journal entry will be deleted and can not be restored.</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_NO"/>
- <button stock="gtk-delete" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-delete-titled-appointment" type="question" default="GTK_RESPONSE_NO">
- <primary>Are you sure you want to delete the appointment titled '{0}'?</primary>
- <secondary>All information on this appointment will be deleted and can not be restored.</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_NO"/>
- <button stock="gtk-delete" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-delete-appointment" type="question" default="GTK_RESPONSE_NO">
- <primary>Are you sure you want to delete this appointment?</primary>
- <secondary>All information on this appointment will be deleted and can not be restored.</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_NO"/>
- <button stock="gtk-delete" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-delete-named-task" type="question" default="GTK_RESPONSE_NO">
- <primary>Are you sure you want to delete the '{0}' task?</primary>
- <secondary>All information on this task will be deleted and can not be restored.</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_NO"/>
- <button stock="gtk-delete" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-delete-task" type="question" default="GTK_RESPONSE_NO">
- <primary>Are you sure you want to delete this task?</primary>
- <secondary>All information on this task will be deleted and can not be restored.</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_NO"/>
- <button stock="gtk-delete" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-delete-named-journal" type="question" default="GTK_RESPONSE_NO">
- <primary>Are you sure you want to delete the journal entry '{0}'?</primary>
- <secondary>All information in this journal will be deleted and can not be restored.</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_NO"/>
- <button stock="gtk-delete" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-delete-journal" type="question" default="GTK_RESPONSE_NO">
- <primary>Are you sure you want to delete this journal entry?</primary>
- <secondary>All information in this journal will be deleted and can not be restored.</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_NO"/>
- <button stock="gtk-delete" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-delete-appointments" type="question" default="GTK_RESPONSE_NO">
- <primary>Are you sure you want to delete these {0} appointments?</primary>
- <secondary>All information on these appointments will be deleted and can not be restored.</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_NO"/>
- <button stock="gtk-delete" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-delete-tasks" type="question" default="GTK_RESPONSE_NO">
- <primary>Are you sure you want to delete these {0} tasks?</primary>
- <secondary>All information on these tasks will be deleted and can not be restored.</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_NO"/>
- <button stock="gtk-delete" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-delete-journals" type="question" default="GTK_RESPONSE_NO">
- <primary>Are you sure you want to delete these {0} journal entries?</primary>
- <secondary>All information in these journal entries will be deleted and can not be restored.</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_NO"/>
- <button stock="gtk-delete" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-save-appointment" type="question" default="GTK_RESPONSE_YES">
- <title>Save Appointment</title>
- <primary>Would you like to save your changes to this appointment?</primary>
- <secondary>You have made changes to this appointment, but not yet saved them.</secondary>
- <button label="Discard Changes" response="GTK_RESPONSE_NO"/>
- <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/>
- <button label="Save Changes" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-save-task" type="question" default="GTK_RESPONSE_YES">
- <title>Save Task</title>
- <primary>Would you like to save your changes to this task?</primary>
- <secondary>You have made changes to this task, but not yet saved them.</secondary>
- <button label="Discard Changes" response="GTK_RESPONSE_NO"/>
- <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/>
- <button label="Save Changes" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-meeting-invite" type="question" default="GTK_RESPONSE_YES">
- <primary>Would you like to send meeting invitations to participants?</primary>
- <secondary>Email invitations will be sent to all participants and allow them to RSVP.</secondary>
- <button label="Don't Send" response="GTK_RESPONSE_NO"/>
- <button label="Send" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-send-updated-meeting-info" type="question" default="GTK_RESPONSE_YES">
- <primary>Would you like to send updated meeting information to participants?</primary>
- <secondary>Sending updated information allows other participants to keep their calendars up to date.</secondary>
- <button label="Don't Send" response="GTK_RESPONSE_NO"/>
- <button label="Send" response="GTK_RESPONSE_YES"/>
- </error>
-
-
- <error id="prompt-send-task" type="question" default="GTK_RESPONSE_YES">
- <primary>Would you like to send this task to participants?</primary>
- <secondary>Email invitations will be sent to all participants and allow them to accept this task.</secondary>
- <button label="Don't Send" response="GTK_RESPONSE_NO"/>
- <button label="Send" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-send-updated-task-info" type="question" default="GTK_RESPONSE_YES">
- <primary>Would you like to send updated task information to participants?</primary>
- <secondary>Sending updated information allows other participants to keep their task lists up to date.</secondary>
- <button label="Don't Send" response="GTK_RESPONSE_NO"/>
- <button label="Send" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="tasks-crashed" type="error">
- <primary>The Evolution tasks have quit unexpectedly.</primary>
- <secondary>Your tasks will not be available until Evolution is restarted.</secondary>
- </error>
-
- <error id="calendar-crashed" type="error">
- <primary>The Evolution calendar has quit unexpectedly.</primary>
- <secondary>Your calendars will not be available until Evolution is restarted.</secondary>
- </error>
-
- <error id="prompt-delete-calendar" type="question" modal="true" default="GTK_RESPONSE_CANCEL">
- <primary>Delete calendar '{0}'?</primary>
- <secondary>This calendar will be removed permanently.</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/>
- <button stock="gtk-delete" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-delete-task-list" type="question" modal="true" default="GTK_RESPONSE_CANCEL">
- <primary>Delete task list '{0}'?</primary>
- <secondary>This task list will be removed permanently.</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/>
- <button stock="gtk-delete" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-send-no-subject-calendar" type="question" default="GTK_RESPONSE_YES">
- <primary>Are you sure you want to send the appointment without a summary?</primary>
- <secondary>Adding a meaningful Summary to your appointment will give your recipients an idea of what your appointment is about.</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/>
- <button label="_Send" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="prompt-send-no-subject-task" type="question" default="GTK_RESPONSE_YES">
- <primary>Are you sure you want to send the task without a summary?</primary>
- <secondary>Adding a meaningful Summary to your task will give your recipients an idea of what your task is about.</secondary>
- <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/>
- <button label="_Send" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="server-version" type="warning">
- <title>Server Version</title>
- <primary>Your server needs to be updated</primary>
- <secondary> Some features may not work properly with the current server version</secondary>
- </error>
-
-</error-list>
diff --git a/calendar/calendar-errors.xml.h b/calendar/calendar-errors.xml.h
deleted file mode 100644
index 54792e87c9..0000000000
--- a/calendar/calendar-errors.xml.h
+++ /dev/null
@@ -1,138 +0,0 @@
-/* calendar:prompt-cancel-meeting primary */
-char *s = N_("Would you like to send all the participants a cancellation notice?");
-/* calendar:prompt-cancel-meeting secondary */
-char *s = N_("If you don't send a cancellation notice, the other participants may not know the meeting is canceled.");
-char *s = N_("Don't Send");
-char *s = N_("Send Notice");
-/* calendar:prompt-delete-meeting primary */
-char *s = N_("Are you sure you want to delete this meeting?");
-/* calendar:prompt-delete-meeting secondary */
-char *s = N_("All information on this meeting will be deleted and can not be restored.");
-/* calendar:prompt-cancel-task primary */
-char *s = N_("Would you like to send all the participants a cancellation notice?");
-/* calendar:prompt-cancel-task secondary */
-char *s = N_("If you don't send a cancellation notice, the other participants may not know the task has been deleted.");
-char *s = N_("Don't Send");
-char *s = N_("Send Notice");
-/* calendar:prompt-delete-task primary */
-char *s = N_("Are you sure you want to delete this task?");
-/* calendar:prompt-delete-task secondary */
-char *s = N_("All information on this task will be deleted and can not be restored.");
-/* calendar:prompt-cancel-journal primary */
-char *s = N_("Would you like to send a cancellation notice for this journal entry?");
-/* calendar:prompt-cancel-journal secondary */
-char *s = N_("If you don't send a cancellation notice, the other participants may not know the journal has been deleted.");
-char *s = N_("Don't Send");
-char *s = N_("Send Notice");
-/* calendar:prompt-delete-journal primary */
-char *s = N_("Are you sure you want to delete this journal entry?");
-/* calendar:prompt-delete-journal secondary */
-char *s = N_("All information on this journal entry will be deleted and can not be restored.");
-/* calendar:prompt-delete-titled-appointment primary */
-char *s = N_("Are you sure you want to delete the appointment titled '{0}'?");
-/* calendar:prompt-delete-titled-appointment secondary */
-char *s = N_("All information on this appointment will be deleted and can not be restored.");
-/* calendar:prompt-delete-appointment primary */
-char *s = N_("Are you sure you want to delete this appointment?");
-/* calendar:prompt-delete-appointment secondary */
-char *s = N_("All information on this appointment will be deleted and can not be restored.");
-/* calendar:prompt-delete-named-task primary */
-char *s = N_("Are you sure you want to delete the '{0}' task?");
-/* calendar:prompt-delete-named-task secondary */
-char *s = N_("All information on this task will be deleted and can not be restored.");
-/* calendar:prompt-delete-task primary */
-char *s = N_("Are you sure you want to delete this task?");
-/* calendar:prompt-delete-task secondary */
-char *s = N_("All information on this task will be deleted and can not be restored.");
-/* calendar:prompt-delete-named-journal primary */
-char *s = N_("Are you sure you want to delete the journal entry '{0}'?");
-/* calendar:prompt-delete-named-journal secondary */
-char *s = N_("All information in this journal will be deleted and can not be restored.");
-/* calendar:prompt-delete-journal primary */
-char *s = N_("Are you sure you want to delete this journal entry?");
-/* calendar:prompt-delete-journal secondary */
-char *s = N_("All information in this journal will be deleted and can not be restored.");
-/* calendar:prompt-delete-appointments primary */
-char *s = N_("Are you sure you want to delete these {0} appointments?");
-/* calendar:prompt-delete-appointments secondary */
-char *s = N_("All information on these appointments will be deleted and can not be restored.");
-/* calendar:prompt-delete-tasks primary */
-char *s = N_("Are you sure you want to delete these {0} tasks?");
-/* calendar:prompt-delete-tasks secondary */
-char *s = N_("All information on these tasks will be deleted and can not be restored.");
-/* calendar:prompt-delete-journals primary */
-char *s = N_("Are you sure you want to delete these {0} journal entries?");
-/* calendar:prompt-delete-journals secondary */
-char *s = N_("All information in these journal entries will be deleted and can not be restored.");
-/* calendar:prompt-save-appointment title */
-char *s = N_("Save Appointment");
-/* calendar:prompt-save-appointment primary */
-char *s = N_("Would you like to save your changes to this appointment?");
-/* calendar:prompt-save-appointment secondary */
-char *s = N_("You have made changes to this appointment, but not yet saved them.");
-char *s = N_("Discard Changes");
-char *s = N_("Save Changes");
-/* calendar:prompt-save-task title */
-char *s = N_("Save Task");
-/* calendar:prompt-save-task primary */
-char *s = N_("Would you like to save your changes to this task?");
-/* calendar:prompt-save-task secondary */
-char *s = N_("You have made changes to this task, but not yet saved them.");
-char *s = N_("Discard Changes");
-char *s = N_("Save Changes");
-/* calendar:prompt-meeting-invite primary */
-char *s = N_("Would you like to send meeting invitations to participants?");
-/* calendar:prompt-meeting-invite secondary */
-char *s = N_("Email invitations will be sent to all participants and allow them to RSVP.");
-char *s = N_("Don't Send");
-char *s = N_("Send");
-/* calendar:prompt-send-updated-meeting-info primary */
-char *s = N_("Would you like to send updated meeting information to participants?");
-/* calendar:prompt-send-updated-meeting-info secondary */
-char *s = N_("Sending updated information allows other participants to keep their calendars up to date.");
-char *s = N_("Don't Send");
-char *s = N_("Send");
-/* calendar:prompt-send-task primary */
-char *s = N_("Would you like to send this task to participants?");
-/* calendar:prompt-send-task secondary */
-char *s = N_("Email invitations will be sent to all participants and allow them to accept this task.");
-char *s = N_("Don't Send");
-char *s = N_("Send");
-/* calendar:prompt-send-updated-task-info primary */
-char *s = N_("Would you like to send updated task information to participants?");
-/* calendar:prompt-send-updated-task-info secondary */
-char *s = N_("Sending updated information allows other participants to keep their task lists up to date.");
-char *s = N_("Don't Send");
-char *s = N_("Send");
-/* calendar:tasks-crashed primary */
-char *s = N_("The Evolution tasks have quit unexpectedly.");
-/* calendar:tasks-crashed secondary */
-char *s = N_("Your tasks will not be available until Evolution is restarted.");
-/* calendar:calendar-crashed primary */
-char *s = N_("The Evolution calendar has quit unexpectedly.");
-/* calendar:calendar-crashed secondary */
-char *s = N_("Your calendars will not be available until Evolution is restarted.");
-/* calendar:prompt-delete-calendar primary */
-char *s = N_("Delete calendar '{0}'?");
-/* calendar:prompt-delete-calendar secondary */
-char *s = N_("This calendar will be removed permanently.");
-/* calendar:prompt-delete-task-list primary */
-char *s = N_("Delete task list '{0}'?");
-/* calendar:prompt-delete-task-list secondary */
-char *s = N_("This task list will be removed permanently.");
-/* calendar:prompt-send-no-subject-calendar primary */
-char *s = N_("Are you sure you want to send the appointment without a summary?");
-/* calendar:prompt-send-no-subject-calendar secondary */
-char *s = N_("Adding a meaningful Summary to your appointment will give your recipients an idea of what your appointment is about.");
-char *s = N_("_Send");
-/* calendar:prompt-send-no-subject-task primary */
-char *s = N_("Are you sure you want to send the task without a summary?");
-/* calendar:prompt-send-no-subject-task secondary */
-char *s = N_("Adding a meaningful Summary to your task will give your recipients an idea of what your task is about.");
-char *s = N_("_Send");
-/* calendar:server-version title */
-char *s = N_("Server Version");
-/* calendar:server-version primary */
-char *s = N_("Your server needs to be updated");
-/* calendar:server-version secondary */
-char *s = N_(" Some features may not work properly with the current server version");
diff --git a/calendar/common/.cvsignore b/calendar/common/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/calendar/common/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/calendar/common/Makefile.am b/calendar/common/Makefile.am
deleted file mode 100644
index 2a9e84ab84..0000000000
--- a/calendar/common/Makefile.am
+++ /dev/null
@@ -1,28 +0,0 @@
-noinst_LTLIBRARIES = libevolution-calendarprivate.la
-
-INCLUDES = \
- -DG_LOG_DOMAIN=\"calendar-gui\" \
- -I$(top_builddir)/shell \
- -I$(top_srcdir)/shell \
- -I$(top_srcdir) \
- -I$(top_srcdir)/calendar \
- -I$(top_srcdir)/widgets \
- -I$(top_srcdir)/a11y/calendar \
- -DEVOLUTION_DATADIR=\""$(datadir)"\" \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_ETSPECDIR=\""$(etspecdir)"\" \
- -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \
- -DEVOLUTION_GALVIEWSDIR=\""$(viewsdir)"\" \
- -DEVOLUTION_UIDIR=\""$(evolutionuidir)"\" \
- -DPREFIX=\""$(prefix)"\" \
- $(EVOLUTION_CALENDAR_CFLAGS)
-
-libevolution_calendarprivate_la_SOURCES = \
- authentication.c \
- authentication.h
-
-libevolution_calendarprivate_la_LIBADD = \
- $(top_builddir)/e-util/libeutil.la \
- $(EVOLUTION_CALENDAR_LIBS)
-
-libevolution_calendarprivate_la_LDFLAGS = -avoid-version
diff --git a/calendar/common/authentication.c b/calendar/common/authentication.c
deleted file mode 100644
index 4849169e56..0000000000
--- a/calendar/common/authentication.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Authors :
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 2003, Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <bonobo/bonobo-i18n.h>
-#include "e-util/e-passwords.h"
-#include "authentication.h"
-
-static GHashTable *source_lists_hash = NULL;
-
-static char *
-auth_func_cb (ECal *ecal, const char *prompt, const char *key, gpointer user_data)
-{
- gboolean remember;
- char *password;
- ESource *source;
- const gchar *auth_domain, *component_name;
-
- source = e_cal_get_source (ecal);
- auth_domain = e_source_get_property (source, "auth-domain");
- component_name = auth_domain ? auth_domain : "Calendar";
- password = e_passwords_get_password (component_name, key);
-
- if (!password)
- password = e_passwords_ask_password (_("Enter password"), component_name, key, prompt,
- E_PASSWORDS_REMEMBER_FOREVER|E_PASSWORDS_SECRET|E_PASSWORDS_ONLINE,
- &remember,
- NULL);
-
- return password;
-}
-
-ECal *
-auth_new_cal_from_default (ECalSourceType type)
-{
- ECal *ecal = NULL;
-
- if (!e_cal_open_default (&ecal, type, auth_func_cb, NULL, NULL))
- return NULL;
-
-
- return ecal;
-}
-
-ECal *
-auth_new_cal_from_source (ESource *source, ECalSourceType type)
-{
- ECal *cal;
-
- cal = e_cal_new (source, type);
- if (cal)
- e_cal_set_auth_func (cal, (ECalAuthFunc) auth_func_cb, NULL);
-
- return cal;
-}
-
-ECal *
-auth_new_cal_from_uri (const char *uri, ECalSourceType type)
-{
- ESourceGroup *group = NULL;
- ESource *source = NULL;
- ECal *cal;
- ESourceList *source_list = NULL;
-
- /* try to find the source in the source list in GConf */
- source_list = g_hash_table_lookup (source_lists_hash, &type);
- if (!source_list) {
- if (e_cal_get_sources (&source_list, type, NULL)) {
- if (!source_lists_hash)
- source_lists_hash = g_hash_table_new (g_int_hash, g_int_equal);
-
- g_hash_table_insert (source_lists_hash, &type, source_list);
- }
- }
-
- if (source_list) {
- GSList *gl;
-
- for (gl = e_source_list_peek_groups (source_list); gl != NULL && source == NULL; gl = gl->next) {
- GSList *sl;
-
- for (sl = e_source_group_peek_sources (gl->data); sl != NULL; sl = sl->next) {
- char *source_uri;
-
- source_uri = e_source_get_uri (sl->data);
- if (source_uri) {
- if (!strcmp (source_uri, uri)) {
- g_free (source_uri);
- source = g_object_ref (sl->data);
- break;
- }
-
- g_free (source_uri);
- }
- }
- }
- }
-
- if (!source) {
- group = e_source_group_new ("", uri);
- source = e_source_new ("", "");
- e_source_set_group (source, group);
-
- /* we explicitly check for groupwise:// uris, to force authentication on them */
- if (!strncmp (uri, "groupwise://", strlen ("groupwise://"))) {
- e_source_set_property (source, "auth", "1");
- e_source_set_property (source, "auth-domain", "Groupwise");
- /* FIXME: need to retrieve the username */
- }
- }
-
- cal = auth_new_cal_from_source (source, type);
-
- g_object_unref (source);
- if (group)
- g_object_unref (group);
-
- return cal;
-}
diff --git a/calendar/common/authentication.h b/calendar/common/authentication.h
deleted file mode 100644
index 2f8af70ace..0000000000
--- a/calendar/common/authentication.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Authors :
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 2003, Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#ifndef _AUTHENTICATION_H_
-#define _AUTHENTICATION_H_
-
-#include <libedataserver/e-source.h>
-#include <libecal/e-cal.h>
-
-ECal *auth_new_cal_from_default (ECalSourceType type);
-ECal *auth_new_cal_from_source (ESource *source, ECalSourceType type);
-ECal *auth_new_cal_from_uri (const char *uri, ECalSourceType type);
-
-#endif
diff --git a/calendar/conduits/.cvsignore b/calendar/conduits/.cvsignore
deleted file mode 100644
index b840c21800..0000000000
--- a/calendar/conduits/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile.in
-Makefile \ No newline at end of file
diff --git a/calendar/conduits/Makefile.am b/calendar/conduits/Makefile.am
deleted file mode 100644
index 906ea61971..0000000000
--- a/calendar/conduits/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-SUBDIRS = calendar todo
diff --git a/calendar/conduits/calendar/.cvsignore b/calendar/conduits/calendar/.cvsignore
deleted file mode 100644
index e44e5d1bda..0000000000
--- a/calendar/conduits/calendar/.cvsignore
+++ /dev/null
@@ -1,9 +0,0 @@
-Makefile.in
-Makefile
-.deps
-*.conduit
-*.lo
-.libs
-libecalendar_conduit.la
-e-calendar-conduit-control-applet
-e-calendar-conduit-control-applet.desktop
diff --git a/calendar/conduits/calendar/Makefile.am b/calendar/conduits/calendar/Makefile.am
deleted file mode 100644
index 0b6f78655f..0000000000
--- a/calendar/conduits/calendar/Makefile.am
+++ /dev/null
@@ -1,37 +0,0 @@
-INCLUDES = \
- -I$(top_srcdir)/e-util \
- -I$(top_builddir)/e-util \
- -I$(top_srcdir)/widgets/misc \
- -I$(top_builddir)/widgets/misc \
- $(EVOLUTION_CALENDAR_CONDUIT_CFLAGS)
-
-# Calendar Conduit
-privconduit_LTLIBRARIES = libecalendar_conduit.la
-
-libecalendar_conduit_la_SOURCES = \
- calendar-conduit.c
-
-libecalendar_conduit_la_LDFLAGS = -module -avoid-version
-libecalendar_conduit_la_LIBADD = \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/e-util/libeconduit.la \
- $(top_builddir)/widgets/misc/libemiscwidgets.la \
- $(EVOLUTION_CALENDAR_CONDUIT_LIBS)
-
-e-calendar-$(BASE_VERSION).conduit: e-calendar.conduit.in
- sed -e 's^\@privconduitdir\@^$(privconduitdir)^g' \
- -e 's^\@datadir\@^$(datadir)^g' \
- -e 's^\@BASE_VERSION\@^$(BASE_VERSION)^g' \
- $< > $@
-
-conduitdir = $(datadir)/gnome-pilot/conduits/
-conduit_DATA = e-calendar-$(BASE_VERSION).conduit
-
-BUILT_SOURCES = $(conduit_DATA)
-CLEANFILES = $(BUILT_SOURCES)
-
-EXTRA_DIST = \
- e-calendar.conduit.in
-
-dist-hook:
- cd $(distdir); rm -f $(BUILT_SOURCES) \ No newline at end of file
diff --git a/calendar/conduits/calendar/calendar-conduit.c b/calendar/conduits/calendar/calendar-conduit.c
deleted file mode 100644
index b3c1b5e553..0000000000
--- a/calendar/conduits/calendar/calendar-conduit.c
+++ /dev/null
@@ -1,1950 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution calendar - Calendar Conduit
- *
- * Copyright (C) 1998 Free Software Foundation
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: Eskil Heyn Olsen <deity@eskil.dk>
- * JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-
-#define G_LOG_DOMAIN "ecalconduit"
-
-#include <libecal/e-cal-types.h>
-#include <libecal/e-cal.h>
-#include <libecal/e-cal-time-util.h>
-#include <pi-source.h>
-#include <pi-socket.h>
-#include <pi-dlp.h>
-#include <pi-datebook.h>
-#include <gpilotd/gnome-pilot-conduit.h>
-#include <gpilotd/gnome-pilot-conduit-sync-abs.h>
-#include <libgpilotdCM/gnome-pilot-conduit-management.h>
-#include <libgpilotdCM/gnome-pilot-conduit-config.h>
-#include <e-pilot-map.h>
-#include <e-pilot-settings.h>
-#include <e-pilot-util.h>
-#include <e-config-listener.h>
-
-GnomePilotConduit * conduit_get_gpilot_conduit (guint32);
-void conduit_destroy_gpilot_conduit (GnomePilotConduit*);
-
-#define CONDUIT_VERSION "0.1.6"
-
-#define DEBUG_CALCONDUIT 1
-/* #undef DEBUG_CALCONDUIT */
-
-#ifdef DEBUG_CALCONDUIT
-#define LOG(x) x
-#else
-#define LOG(x)
-#endif
-
-#define WARN g_warning
-#define INFO g_message
-
-#define PILOT_MAX_ADVANCE 99
-
-typedef struct _ECalLocalRecord ECalLocalRecord;
-typedef struct _ECalConduitCfg ECalConduitCfg;
-typedef struct _ECalConduitGui ECalConduitGui;
-typedef struct _ECalConduitContext ECalConduitContext;
-
-/* Local Record */
-struct _ECalLocalRecord {
- /* The stuff from gnome-pilot-conduit-standard-abs.h
- Must be first in the structure, or instances of this
- structure cannot be used by gnome-pilot-conduit-standard-abs.
- */
- GnomePilotDesktopRecord local;
-
- /* The corresponding Comp object */
- ECalComponent *comp;
-
- /* pilot-link appointment structure */
- struct Appointment *appt;
-};
-
-static void
-calconduit_destroy_record (ECalLocalRecord *local)
-{
- g_object_unref (local->comp);
- free_Appointment (local->appt);
- g_free (local->appt);
- g_free (local);
-}
-
-/* Configuration */
-struct _ECalConduitCfg {
- guint32 pilot_id;
- GnomePilotConduitSyncType sync_type;
-
- ESourceList *source_list;
- ESource *source;
- gboolean secret;
- gboolean multi_day_split;
-
- gchar *last_uri;
-};
-
-static ECalConduitCfg *
-calconduit_load_configuration (guint32 pilot_id)
-{
- ECalConduitCfg *c;
- GnomePilotConduitManagement *management;
- GnomePilotConduitConfig *config;
- gchar prefix[256];
-
- c = g_new0 (ECalConduitCfg, 1);
- g_assert (c != NULL);
-
- /* Pilot ID */
- c->pilot_id = pilot_id;
-
- /* Sync Type */
- management = gnome_pilot_conduit_management_new ("e_calendar_conduit", GNOME_PILOT_CONDUIT_MGMT_ID);
- gtk_object_ref (GTK_OBJECT (management));
- gtk_object_sink (GTK_OBJECT (management));
- config = gnome_pilot_conduit_config_new (management, pilot_id);
- gtk_object_ref (GTK_OBJECT (config));
- gtk_object_sink (GTK_OBJECT (config));
- if (!gnome_pilot_conduit_config_is_enabled (config, &c->sync_type))
- c->sync_type = GnomePilotConduitSyncTypeNotSet;
- gtk_object_unref (GTK_OBJECT (config));
- gtk_object_unref (GTK_OBJECT (management));
-
- /* Custom settings */
- g_snprintf (prefix, 255, "/gnome-pilot.d/e-calendar-conduit/Pilot_%u/", pilot_id);
- gnome_config_push_prefix (prefix);
-
- if (!e_cal_get_sources (&c->source_list, E_CAL_SOURCE_TYPE_EVENT, NULL))
- c->source_list = NULL;
- if (c->source_list) {
- c->source = e_pilot_get_sync_source (c->source_list);
- if (!c->source)
- c->source = e_source_list_peek_source_any (c->source_list);
- if (c->source) {
- g_object_ref (c->source);
- } else {
- g_object_unref (c->source_list);
- c->source_list = NULL;
- }
- }
- c->secret = gnome_config_get_bool ("secret=FALSE");
- c->multi_day_split = gnome_config_get_bool ("multi_day_split=TRUE");
- if ((c->last_uri = gnome_config_get_string ("last_uri")) && !strncmp (c->last_uri, "file://", 7)) {
- const char *path = c->last_uri + 7;
- const char *home;
-
- home = g_get_home_dir ();
-
- if (!strncmp (path, home, strlen (home))) {
- path += strlen (home);
- if (*path == '/')
- path++;
-
- if (!strcmp (path, "evolution/local/Calendar/calendar.ics")) {
- /* need to upgrade the last_uri. yay. */
- g_free (c->last_uri);
- c->last_uri = g_strdup_printf ("file://%s/.evolution/calendar/local/system/calendar.ics", home);
- }
- }
- }
-
- gnome_config_pop_prefix ();
-
- return c;
-}
-
-static void
-calconduit_save_configuration (ECalConduitCfg *c)
-{
- gchar prefix[256];
-
- g_snprintf (prefix, 255, "/gnome-pilot.d/e-calendar-conduit/Pilot_%u/", c->pilot_id);
- gnome_config_push_prefix (prefix);
-
- e_pilot_set_sync_source (c->source_list, c->source);
- gnome_config_set_bool ("secret", c->secret);
- gnome_config_set_bool ("multi_day_split", c->multi_day_split);
- gnome_config_set_string ("last_uri", c->last_uri);
-
- gnome_config_pop_prefix ();
-
- gnome_config_sync ();
- gnome_config_drop_all ();
-}
-
-static ECalConduitCfg*
-calconduit_dupe_configuration (ECalConduitCfg *c)
-{
- ECalConduitCfg *retval;
-
- g_return_val_if_fail (c != NULL, NULL);
-
- retval = g_new0 (ECalConduitCfg, 1);
- retval->pilot_id = c->pilot_id;
- retval->sync_type = c->sync_type;
-
- if (c->source_list)
- retval->source_list = g_object_ref (c->source_list);
- if (c->source)
- retval->source = g_object_ref (c->source);
- retval->secret = c->secret;
- retval->multi_day_split = c->multi_day_split;
- retval->last_uri = g_strdup (c->last_uri);
-
- return retval;
-}
-
-static void
-calconduit_destroy_configuration (ECalConduitCfg *c)
-{
- g_return_if_fail (c != NULL);
-
- g_object_unref (c->source_list);
- g_object_unref (c->source);
- g_free (c->last_uri);
- g_free (c);
-}
-
-/* Gui */
-struct _ECalConduitGui {
- GtkWidget *multi_day_split;
-};
-
-static ECalConduitGui *
-e_cal_gui_new (EPilotSettings *ps)
-{
- ECalConduitGui *gui;
- GtkWidget *lbl;
- gint rows;
-
- g_return_val_if_fail (ps != NULL, NULL);
- g_return_val_if_fail (E_IS_PILOT_SETTINGS (ps), NULL);
-
- gtk_table_resize (GTK_TABLE (ps), E_PILOT_SETTINGS_TABLE_ROWS + 1, E_PILOT_SETTINGS_TABLE_COLS);
-
- gui = g_new0 (ECalConduitGui, 1);
-
- rows = E_PILOT_SETTINGS_TABLE_ROWS;
- lbl = gtk_label_new (_("Split Multi-Day Events:"));
- gui->multi_day_split = gtk_check_button_new ();
- gtk_table_attach_defaults (GTK_TABLE (ps), lbl, 0, 1, rows, rows + 1);
- gtk_table_attach_defaults (GTK_TABLE (ps), gui->multi_day_split, 1, 2, rows, rows + 1);
- gtk_widget_show (lbl);
- gtk_widget_show (gui->multi_day_split);
-
- return gui;
-}
-
-static void
-e_cal_gui_fill_widgets (ECalConduitGui *gui, ECalConduitCfg *cfg)
-{
- g_return_if_fail (gui != NULL);
- g_return_if_fail (cfg != NULL);
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gui->multi_day_split),
- cfg->multi_day_split);
-}
-
-static void
-e_cal_gui_fill_config (ECalConduitGui *gui, ECalConduitCfg *cfg)
-{
- g_return_if_fail (gui != NULL);
- g_return_if_fail (cfg != NULL);
-
- cfg->multi_day_split = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gui->multi_day_split));
-}
-
-static void
-e_cal_gui_destroy (ECalConduitGui *gui)
-{
- g_free (gui);
-}
-
-/* Context */
-struct _ECalConduitContext {
- GnomePilotDBInfo *dbi;
-
- ECalConduitCfg *cfg;
- ECalConduitCfg *new_cfg;
- ECalConduitGui *gui;
- GtkWidget *ps;
-
- struct AppointmentAppInfo ai;
-
- ECal *client;
-
- icaltimezone *timezone;
- ECalComponent *default_comp;
- GList *comps;
- GList *changed;
- GHashTable *changed_hash;
- GList *locals;
-
- EPilotMap *map;
-};
-
-static ECalConduitContext *
-e_calendar_context_new (guint32 pilot_id)
-{
- ECalConduitContext *ctxt;
-
- ctxt = g_new0 (ECalConduitContext, 1);
- g_assert (ctxt != NULL);
-
- ctxt->cfg = calconduit_load_configuration (pilot_id);
- ctxt->new_cfg = calconduit_dupe_configuration (ctxt->cfg);
- ctxt->ps = NULL;
- ctxt->dbi = NULL;
- ctxt->client = NULL;
- ctxt->timezone = NULL;
- ctxt->default_comp = NULL;
- ctxt->comps = NULL;
- ctxt->changed = NULL;
- ctxt->changed_hash = NULL;
- ctxt->locals = NULL;
- ctxt->map = NULL;
-
- return ctxt;
-}
-
-static gboolean
-e_calendar_context_foreach_change (gpointer key, gpointer value, gpointer data)
-{
- g_free (key);
-
- return TRUE;
-}
-
-static void
-e_calendar_context_destroy (ECalConduitContext *ctxt)
-{
- GList *l;
-
- g_return_if_fail (ctxt != NULL);
-
- if (ctxt->cfg != NULL)
- calconduit_destroy_configuration (ctxt->cfg);
- if (ctxt->new_cfg != NULL)
- calconduit_destroy_configuration (ctxt->new_cfg);
- if (ctxt->gui != NULL)
- e_cal_gui_destroy (ctxt->gui);
-
- if (ctxt->client != NULL)
- g_object_unref (ctxt->client);
- if (ctxt->default_comp != NULL)
- g_object_unref (ctxt->default_comp);
- if (ctxt->comps != NULL) {
- for (l = ctxt->comps; l; l = l->next)
- g_object_unref (l->data);
- g_list_free (ctxt->comps);
- }
-
- if (ctxt->changed != NULL)
- e_cal_free_change_list (ctxt->changed);
-
- if (ctxt->changed_hash != NULL) {
- g_hash_table_foreach_remove (ctxt->changed_hash, e_calendar_context_foreach_change, NULL);
- g_hash_table_destroy (ctxt->changed_hash);
- }
-
- if (ctxt->locals != NULL) {
- for (l = ctxt->locals; l != NULL; l = l->next)
- calconduit_destroy_record (l->data);
- g_list_free (ctxt->locals);
- }
-
- if (ctxt->map != NULL)
- e_pilot_map_destroy (ctxt->map);
-}
-
-/* Debug routines */
-static char *
-print_local (ECalLocalRecord *local)
-{
- static char buff[ 4096 ];
-
- if (local == NULL) {
- sprintf (buff, "[NULL]");
- return buff;
- }
-
- if (local->appt && local->appt->description) {
- g_snprintf (buff, 4096, "[%ld %ld '%s' '%s']",
- mktime (&local->appt->begin),
- mktime (&local->appt->end),
- local->appt->description ?
- local->appt->description : "",
- local->appt->note ?
- local->appt->note : "");
- return buff;
- }
-
- return "";
-}
-
-static char *print_remote (GnomePilotRecord *remote)
-{
- static char buff[ 4096 ];
- struct Appointment appt;
-
- if (remote == NULL) {
- sprintf (buff, "[NULL]");
- return buff;
- }
-
- memset (&appt, 0, sizeof (struct Appointment));
- unpack_Appointment (&appt, remote->record, remote->length);
-
- g_snprintf (buff, 4096, "[%ld %ld '%s' '%s']",
- mktime (&appt.begin),
- mktime (&appt.end),
- appt.description ?
- appt.description : "",
- appt.note ?
- appt.note : "");
-
- free_Appointment (&appt);
-
- return buff;
-}
-
-static int
-start_calendar_server (ECalConduitContext *ctxt)
-{
- g_return_val_if_fail (ctxt != NULL, -2);
-
- if (ctxt->cfg->source) {
- ctxt->client = e_cal_new (ctxt->cfg->source, E_CAL_SOURCE_TYPE_EVENT);
- if (!e_cal_open (ctxt->client, TRUE, NULL))
- return -1;
- } else if (!e_cal_open_default (&ctxt->client, E_CAL_SOURCE_TYPE_EVENT, NULL, NULL, NULL)) {
- return -1;
- }
-
- return 0;
-
-}
-
-/* Utility routines */
-static icaltimezone *
-get_timezone (ECal *client, const char *tzid)
-{
- icaltimezone *timezone = NULL;
-
- timezone = icaltimezone_get_builtin_timezone_from_tzid (tzid);
- if (timezone == NULL)
- e_cal_get_timezone (client, tzid, &timezone, NULL);
-
- return timezone;
-}
-
-static icaltimezone *
-get_default_timezone (void)
-{
- EConfigListener *listener;
- icaltimezone *timezone = NULL;
- char *location;
-
- listener = e_config_listener_new ();
-
- location = e_config_listener_get_string_with_default (listener,
- "/apps/evolution/calendar/display/timezone", "UTC", NULL);
- if (!location || !location[0]) {
- g_free (location);
- location = g_strdup ("UTC");
- }
-
- timezone = icaltimezone_get_builtin_timezone (location);
- g_free (location);
-
- g_object_unref (listener);
-
- return timezone;
-}
-
-
-static char *
-map_name (ECalConduitContext *ctxt)
-{
- char *filename;
-
- filename = g_strdup_printf ("%s/.evolution/calendar/local/system/pilot-map-calendar-%d.xml",
- g_get_home_dir (), ctxt->cfg->pilot_id);
-
- return filename;
-}
-
-static icalrecurrencetype_weekday
-get_ical_day (int day)
-{
- switch (day) {
- case 0:
- return ICAL_SUNDAY_WEEKDAY;
- case 1:
- return ICAL_MONDAY_WEEKDAY;
- case 2:
- return ICAL_TUESDAY_WEEKDAY;
- case 3:
- return ICAL_WEDNESDAY_WEEKDAY;
- case 4:
- return ICAL_THURSDAY_WEEKDAY;
- case 5:
- return ICAL_FRIDAY_WEEKDAY;
- case 6:
- return ICAL_SATURDAY_WEEKDAY;
- }
-
- return ICAL_NO_WEEKDAY;
-}
-
-static int
-get_pilot_day (icalrecurrencetype_weekday wd)
-{
- switch (wd) {
- case ICAL_SUNDAY_WEEKDAY:
- return 0;
- case ICAL_MONDAY_WEEKDAY:
- return 1;
- case ICAL_TUESDAY_WEEKDAY:
- return 2;
- case ICAL_WEDNESDAY_WEEKDAY:
- return 3;
- case ICAL_THURSDAY_WEEKDAY:
- return 4;
- case ICAL_FRIDAY_WEEKDAY:
- return 5;
- case ICAL_SATURDAY_WEEKDAY:
- return 6;
- default:
- return -1;
- }
-}
-
-static gboolean
-is_empty_time (struct tm time)
-{
- if (time.tm_sec || time.tm_min || time.tm_hour
- || time.tm_mday || time.tm_mon || time.tm_year)
- return FALSE;
-
- return TRUE;
-}
-
-static gboolean
-is_all_day (ECal *client, ECalComponentDateTime *dt_start, ECalComponentDateTime *dt_end)
-{
- time_t dt_start_time, dt_end_time;
- icaltimezone *timezone;
-
- if (dt_start->value->is_date && dt_end->value->is_date)
- return TRUE;
-
- timezone = get_timezone (client, dt_start->tzid);
- dt_start_time = icaltime_as_timet_with_zone (*dt_start->value, timezone);
- dt_end_time = icaltime_as_timet_with_zone (*dt_end->value, get_timezone (client, dt_end->tzid));
-
- if (dt_end_time == time_add_day_with_zone (dt_start_time, 1, timezone))
- return TRUE;
-
- return FALSE;
-}
-
-static gboolean
-process_multi_day (ECalConduitContext *ctxt, ECalChange *ccc, GList **multi_comp, GList **multi_ccc)
-{
- ECalComponentDateTime dt_start, dt_end;
- icaltimezone *tz_start, *tz_end;
- time_t event_start, event_end, day_end;
- struct icaltimetype *old_start_value, *old_end_value;
- const char *uid;
- gboolean is_date = FALSE;
- gboolean last = FALSE;
- gboolean ret = TRUE;
-
- *multi_ccc = NULL;
- *multi_comp = NULL;
-
- if (ccc->type == E_CAL_CHANGE_DELETED)
- return FALSE;
-
- /* Start time */
- e_cal_component_get_dtstart (ccc->comp, &dt_start);
- if (dt_start.value->is_date)
- tz_start = ctxt->timezone;
- else
- tz_start = get_timezone (ctxt->client, dt_start.tzid);
- event_start = icaltime_as_timet_with_zone (*dt_start.value, tz_start);
-
- e_cal_component_get_dtend (ccc->comp, &dt_end);
- if (dt_end.value->is_date)
- tz_end = ctxt->timezone;
- else
- tz_end = get_timezone (ctxt->client, dt_end.tzid);
- event_end = icaltime_as_timet_with_zone (*dt_end.value, tz_end);
-
- day_end = time_day_end_with_zone (event_start, ctxt->timezone);
- if (day_end >= event_end) {
- ret = FALSE;
- goto cleanup;
- } else if (e_cal_component_has_recurrences (ccc->comp) || !ctxt->cfg->multi_day_split) {
- ret = TRUE;
- goto cleanup;
- }
-
- if (dt_start.value->is_date && dt_end.value->is_date)
- is_date = TRUE;
-
- old_start_value = dt_start.value;
- old_end_value = dt_end.value;
- while (!last) {
- ECalComponent *clone = e_cal_component_clone (ccc->comp);
- char *new_uid = e_cal_component_gen_uid ();
- struct icaltimetype start_value, end_value;
- ECalChange *c = g_new0 (ECalChange, 1);
-
- if (day_end >= event_end) {
- day_end = event_end;
- last = TRUE;
- }
-
- e_cal_component_set_uid (clone, new_uid);
-
- start_value = icaltime_from_timet_with_zone (event_start, is_date, tz_start);
- dt_start.value = &start_value;
- e_cal_component_set_dtstart (clone, &dt_start);
-
- end_value = icaltime_from_timet_with_zone (day_end, is_date, tz_end);
- dt_end.value = &end_value;
- e_cal_component_set_dtend (clone, &dt_end);
-
- /* FIXME Error handling */
- e_cal_create_object (ctxt->client, e_cal_component_get_icalcomponent (clone), NULL, NULL);
-
- c->comp = clone;
- c->type = E_CAL_CHANGE_ADDED;
-
- *multi_ccc = g_list_prepend (*multi_ccc, c);
- *multi_comp = g_list_prepend (*multi_comp, g_object_ref (c->comp));
-
- event_start = day_end;
- day_end = time_day_end_with_zone (event_start, ctxt->timezone);
- }
- dt_start.value = old_start_value;
- dt_end.value = old_end_value;
-
- e_cal_component_get_uid (ccc->comp, &uid);
- /* FIXME Error handling */
- e_cal_remove_object (ctxt->client, uid, NULL);
- ccc->type = E_CAL_CHANGE_DELETED;
-
- cleanup:
- e_cal_component_free_datetime (&dt_start);
- e_cal_component_free_datetime (&dt_end);
-
- return ret;
-}
-
-static short
-nth_weekday (int pos, icalrecurrencetype_weekday weekday)
-{
- g_assert ((pos > 0 && pos <= 5) || (pos == -1));
-
- return ((abs (pos) * 8) + weekday) * (pos < 0 ? -1 : 1);
-}
-
-static GList *
-next_changed_item (ECalConduitContext *ctxt, GList *changes)
-{
- ECalChange *ccc;
- GList *l;
-
- for (l = changes; l != NULL; l = l->next) {
- const char *uid;
-
- ccc = l->data;
-
- e_cal_component_get_uid (ccc->comp, &uid);
- if (g_hash_table_lookup (ctxt->changed_hash, uid))
- return l;
- }
-
- return NULL;
-}
-
-static void
-compute_status (ECalConduitContext *ctxt, ECalLocalRecord *local, const char *uid)
-{
- ECalChange *ccc;
-
- local->local.archived = FALSE;
- local->local.secret = FALSE;
-
- ccc = g_hash_table_lookup (ctxt->changed_hash, uid);
-
- if (ccc == NULL) {
- local->local.attr = GnomePilotRecordNothing;
- return;
- }
-
- switch (ccc->type) {
- case E_CAL_CHANGE_ADDED:
- local->local.attr = GnomePilotRecordNew;
- break;
-
- case E_CAL_CHANGE_MODIFIED:
- local->local.attr = GnomePilotRecordModified;
- break;
-
- case E_CAL_CHANGE_DELETED:
- local->local.attr = GnomePilotRecordDeleted;
- break;
- }
-}
-
-static gboolean
-rrules_mostly_equal (struct icalrecurrencetype *a, struct icalrecurrencetype *b)
-{
- struct icalrecurrencetype acopy, bcopy;
-
- acopy = *a;
- bcopy = *b;
-
- acopy.until = bcopy.until = icaltime_null_time ();
- acopy.count = bcopy.count = 0;
-
- if (!memcmp (&acopy, &bcopy, sizeof (struct icalrecurrencetype)))
- return TRUE;
-
- return FALSE;
-}
-
-static gboolean
-find_last_cb (ECalComponent *comp, time_t start, time_t end, gpointer data)
-{
- time_t *last = data;
-
- *last = start;
-
- return TRUE;
-}
-
-static GnomePilotRecord
-local_record_to_pilot_record (ECalLocalRecord *local,
- ECalConduitContext *ctxt)
-{
- GnomePilotRecord p;
- static char record[0xffff];
-
- g_assert (local->comp != NULL);
- g_assert (local->appt != NULL );
-
- p.ID = local->local.ID;
- p.category = local->local.category;
- p.attr = local->local.attr;
- p.archived = local->local.archived;
- p.secret = local->local.secret;
-
- /* Generate pilot record structure */
- p.record = record;
- p.length = pack_Appointment (local->appt, p.record, 0xffff);
-
- return p;
-}
-
-/*
- * converts a ECalComponent object to a ECalLocalRecord
- */
-static void
-local_record_from_comp (ECalLocalRecord *local, ECalComponent *comp, ECalConduitContext *ctxt)
-{
- const char *uid;
- ECalComponentText summary;
- GSList *d_list = NULL, *edl = NULL, *l;
- ECalComponentText *description;
- ECalComponentDateTime dt_start, dt_end;
- ECalComponentClassification classif;
- icaltimezone *default_tz = ctxt->timezone;
- int i;
-
- g_return_if_fail (local != NULL);
- g_return_if_fail (comp != NULL);
-
- local->comp = comp;
- g_object_ref (comp);
-
- e_cal_component_get_uid (local->comp, &uid);
- local->local.ID = e_pilot_map_lookup_pid (ctxt->map, uid, TRUE);
- compute_status (ctxt, local, uid);
-
- local->appt = g_new0 (struct Appointment, 1);
-
- /* Handle the fields and category we don't sync by making sure
- * we don't overwrite them
- */
- if (local->local.ID != 0) {
- struct Appointment appt;
- char record[0xffff];
- int cat = 0;
-
- if (dlp_ReadRecordById (ctxt->dbi->pilot_socket,
- ctxt->dbi->db_handle,
- local->local.ID, &record,
- NULL, NULL, NULL, &cat) > 0) {
- local->local.category = cat;
- memset (&appt, 0, sizeof (struct Appointment));
- unpack_Appointment (&appt, record, 0xffff);
- local->appt->alarm = appt.alarm;
- local->appt->advance = appt.advance;
- local->appt->advanceUnits = appt.advanceUnits;
- free_Appointment (&appt);
- }
- }
-
- /* STOP: don't replace these with g_strdup, since free_Appointment
- uses free to deallocate */
- e_cal_component_get_summary (comp, &summary);
- if (summary.value)
- local->appt->description = e_pilot_utf8_to_pchar (summary.value);
-
- e_cal_component_get_description_list (comp, &d_list);
- if (d_list) {
- description = (ECalComponentText *) d_list->data;
- if (description && description->value)
- local->appt->note = e_pilot_utf8_to_pchar (description->value);
- else
- local->appt->note = NULL;
- } else {
- local->appt->note = NULL;
- }
-
- /* Start/End */
- e_cal_component_get_dtstart (comp, &dt_start);
- e_cal_component_get_dtend (comp, &dt_end);
- if (dt_start.value) {
- icaltimezone_convert_time (dt_start.value,
- get_timezone (ctxt->client, dt_start.tzid),
- default_tz);
- local->appt->begin = icaltimetype_to_tm (dt_start.value);
- }
-
- if (dt_start.value && dt_end.value) {
- if (is_all_day (ctxt->client, &dt_start, &dt_end)) {
- local->appt->event = 1;
- } else {
- icaltimezone_convert_time (dt_end.value,
- get_timezone (ctxt->client, dt_end.tzid),
- default_tz);
- local->appt->end = icaltimetype_to_tm (dt_end.value);
- local->appt->event = 0;
- }
- } else {
- local->appt->event = 1;
- }
- e_cal_component_free_datetime (&dt_start);
- e_cal_component_free_datetime (&dt_end);
-
- /* Recurrence Rules */
- local->appt->repeatType = repeatNone;
-
- if (!e_cal_component_is_instance (comp)) {
- if (e_cal_component_has_rrules (comp)) {
- GSList *list;
- struct icalrecurrencetype *recur;
-
- e_cal_component_get_rrule_list (comp, &list);
- recur = list->data;
-
- switch (recur->freq) {
- case ICAL_DAILY_RECURRENCE:
- local->appt->repeatType = repeatDaily;
- break;
- case ICAL_WEEKLY_RECURRENCE:
- local->appt->repeatType = repeatWeekly;
- for (i = 0; i <= 7 && recur->by_day[i] != ICAL_RECURRENCE_ARRAY_MAX; i++) {
- icalrecurrencetype_weekday wd;
-
- wd = icalrecurrencetype_day_day_of_week (recur->by_day[i]);
- local->appt->repeatDays[get_pilot_day (wd)] = 1;
- }
-
- break;
- case ICAL_MONTHLY_RECURRENCE:
- if (recur->by_month_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
- local->appt->repeatType = repeatMonthlyByDate;
- break;
- }
-
- /* Not going to work with -ve by_day/by_set_pos other than -1,
- * pilot doesn't support that anyhow */
- local->appt->repeatType = repeatMonthlyByDay;
- switch (recur->by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX ? recur->by_set_pos[0]
- : icalrecurrencetype_day_position (recur->by_day[0])) {
- case 1:
- local->appt->repeatDay = dom1stSun;
- break;
- case 2:
- local->appt->repeatDay = dom2ndSun;
- break;
- case 3:
- local->appt->repeatDay = dom3rdSun;
- break;
- case 4:
- local->appt->repeatDay = dom4thSun;
- break;
- case -1:
- case 5:
- local->appt->repeatDay = domLastSun;
- break;
- }
- local->appt->repeatDay += get_pilot_day (icalrecurrencetype_day_day_of_week (recur->by_day[0]));
- break;
- case ICAL_YEARLY_RECURRENCE:
- local->appt->repeatType = repeatYearly;
- break;
- default:
- break;
- }
-
- if (local->appt->repeatType != repeatNone) {
- local->appt->repeatFrequency = recur->interval;
- }
-
- if (!icaltime_is_null_time (recur->until)) {
- local->appt->repeatForever = 0;
- local->appt->repeatEnd = icaltimetype_to_tm_with_zone (&recur->until,
- icaltimezone_get_utc_timezone (),
- default_tz);
- } else if (recur->count > 0) {
- time_t last = -1;
- struct icaltimetype itt;
-
- /* The palm does not support count recurrences */
- local->appt->repeatForever = 0;
- e_cal_recur_generate_instances (comp, -1, -1, find_last_cb, &last,
- e_cal_resolve_tzid_cb, ctxt->client,
- default_tz);
- itt = icaltime_from_timet_with_zone (last, TRUE, default_tz);
- local->appt->repeatEnd = icaltimetype_to_tm (&itt);
- } else {
- local->appt->repeatForever = 1;
- }
-
- e_cal_component_free_recur_list (list);
- }
-
- /* Exceptions */
- e_cal_component_get_exdate_list (comp, &edl);
- local->appt->exceptions = g_slist_length (edl);
- local->appt->exception = g_new0 (struct tm, local->appt->exceptions);
- for (l = edl, i = 0; l != NULL; l = l->next, i++) {
- ECalComponentDateTime *dt = l->data;
-
- icaltimezone_convert_time (dt->value,
- icaltimezone_get_utc_timezone (),
- default_tz);
- local->appt->exception[i] = icaltimetype_to_tm (dt->value);
- }
- e_cal_component_free_exdate_list (edl);
- }
-
- /* Alarm */
- local->appt->alarm = 0;
- if (e_cal_component_has_alarms (comp)) {
- GList *uids, *l;
- ECalComponentAlarm *alarm;
- ECalComponentAlarmTrigger trigger;
-
- uids = e_cal_component_get_alarm_uids (comp);
- for (l = uids; l != NULL; l = l->next) {
- alarm = e_cal_component_get_alarm (comp, l->data);
- e_cal_component_alarm_get_trigger (alarm, &trigger);
-
- if ((trigger.type == E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START
- && trigger.u.rel_duration.is_neg)) {
- local->appt->advanceUnits = advMinutes;
- local->appt->advance =
- trigger.u.rel_duration.minutes
- + trigger.u.rel_duration.hours * 60
- + trigger.u.rel_duration.days * 60 * 24
- + trigger.u.rel_duration.weeks * 7 * 60 * 24;
-
- if (local->appt->advance > PILOT_MAX_ADVANCE) {
- local->appt->advanceUnits = advHours;
- local->appt->advance =
- trigger.u.rel_duration.minutes / 60
- + trigger.u.rel_duration.hours
- + trigger.u.rel_duration.days * 24
- + trigger.u.rel_duration.weeks * 7 * 24;
- }
- if (local->appt->advance > PILOT_MAX_ADVANCE) {
- local->appt->advanceUnits = advDays;
- local->appt->advance =
- trigger.u.rel_duration.minutes / (60 * 24)
- + trigger.u.rel_duration.hours / 24
- + trigger.u.rel_duration.days
- + trigger.u.rel_duration.weeks * 7;
- }
- if (local->appt->advance > PILOT_MAX_ADVANCE)
- local->appt->advance = PILOT_MAX_ADVANCE;
-
- local->appt->alarm = 1;
- break;
- }
- e_cal_component_alarm_free (alarm);
- }
- cal_obj_uid_list_free (uids);
- }
-
- e_cal_component_get_classification (comp, &classif);
-
- if (classif == E_CAL_COMPONENT_CLASS_PRIVATE)
- local->local.secret = 1;
- else
- local->local.secret = 0;
-
- local->local.archived = 0;
-}
-
-static void
-local_record_from_uid (ECalLocalRecord *local,
- const char *uid,
- ECalConduitContext *ctxt)
-{
- ECalComponent *comp;
- icalcomponent *icalcomp;
- GError *error = NULL;
-
- g_assert(local!=NULL);
-
- if (e_cal_get_object (ctxt->client, uid, NULL, &icalcomp, &error)) {
- comp = e_cal_component_new ();
- if (!e_cal_component_set_icalcomponent (comp, icalcomp)) {
- g_object_unref (comp);
- icalcomponent_free (icalcomp);
- return;
- }
-
- local_record_from_comp (local, comp, ctxt);
- g_object_unref (comp);
- } else if (error->code == E_CALENDAR_STATUS_OBJECT_NOT_FOUND) {
- comp = e_cal_component_new ();
- e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_EVENT);
- e_cal_component_set_uid (comp, uid);
- local_record_from_comp (local, comp, ctxt);
- g_object_unref (comp);
- } else {
- INFO ("Object did not exist");
- }
-
- g_clear_error (&error);
-}
-
-static ECalComponent *
-comp_from_remote_record (GnomePilotConduitSyncAbs *conduit,
- GnomePilotRecord *remote,
- ECalComponent *in_comp,
- ECal *client,
- icaltimezone *timezone)
-{
- ECalComponent *comp;
- struct Appointment appt;
- struct icaltimetype now = icaltime_from_timet_with_zone (time (NULL), FALSE, timezone), it;
- struct icalrecurrencetype recur;
- ECalComponentText summary = {NULL, NULL};
- ECalComponentDateTime dt = {NULL, NULL};
- GSList *edl = NULL;
- char *txt;
- int pos, i;
-
- g_return_val_if_fail (remote != NULL, NULL);
-
- memset (&appt, 0, sizeof (struct Appointment));
- unpack_Appointment (&appt, remote->record, remote->length);
-
- if (in_comp == NULL) {
- comp = e_cal_component_new ();
- e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_EVENT);
- e_cal_component_set_created (comp, &now);
- } else {
- comp = e_cal_component_clone (in_comp);
- }
-
- e_cal_component_set_last_modified (comp, &now);
-
- summary.value = txt = e_pilot_utf8_from_pchar (appt.description);
- e_cal_component_set_summary (comp, &summary);
- free (txt);
-
- /* The iCal description field */
- if (!appt.note) {
- e_cal_component_set_description_list (comp, NULL);
- } else {
- GSList l;
- ECalComponentText text;
-
- text.value = txt = e_pilot_utf8_from_pchar (appt.note);
- text.altrep = NULL;
- l.data = &text;
- l.next = NULL;
-
- e_cal_component_set_description_list (comp, &l);
- free (txt);
- }
-
- if (appt.event && !is_empty_time (appt.begin)) {
- it = tm_to_icaltimetype (&appt.begin, TRUE);
- dt.value = &it;
- dt.tzid = NULL;
- e_cal_component_set_dtstart (comp, &dt);
- e_cal_component_set_dtend (comp, &dt);
- } else {
- dt.tzid = icaltimezone_get_tzid (timezone);
-
- if (!is_empty_time (appt.begin)) {
- it = tm_to_icaltimetype (&appt.begin, FALSE);
- dt.value = &it;
- e_cal_component_set_dtstart (comp, &dt);
- }
-
- if (!is_empty_time (appt.end)) {
- it = tm_to_icaltimetype (&appt.end, FALSE);
- dt.value = &it;
- e_cal_component_set_dtend (comp, &dt);
- }
- }
-
- /* Recurrence information */
- icalrecurrencetype_clear (&recur);
-
- switch (appt.repeatType) {
- case repeatNone:
- recur.freq = ICAL_NO_RECURRENCE;
- break;
-
- case repeatDaily:
- recur.freq = ICAL_DAILY_RECURRENCE;
- recur.interval = appt.repeatFrequency;
- break;
-
- case repeatWeekly:
- recur.freq = ICAL_WEEKLY_RECURRENCE;
- recur.interval = appt.repeatFrequency;
-
- pos = 0;
- for (i = 0; i < 7; i++) {
- if (appt.repeatDays[i])
- recur.by_day[pos++] = get_ical_day (i);
- }
-
- break;
-
- case repeatMonthlyByDay:
- recur.freq = ICAL_MONTHLY_RECURRENCE;
- recur.interval = appt.repeatFrequency;
- if (appt.repeatDay < domLastSun)
- recur.by_day[0] = nth_weekday ((appt.repeatDay / 7) + 1,
- get_ical_day (appt.repeatDay % 7));
- else
- recur.by_day[0] = nth_weekday (-1, get_ical_day (appt.repeatDay % 7));
- break;
-
- case repeatMonthlyByDate:
- recur.freq = ICAL_MONTHLY_RECURRENCE;
- recur.interval = appt.repeatFrequency;
- recur.by_month_day[0] = appt.begin.tm_mday;
- break;
-
- case repeatYearly:
- recur.freq = ICAL_YEARLY_RECURRENCE;
- recur.interval = appt.repeatFrequency;
- break;
-
- default:
- g_assert_not_reached ();
- }
-
- if (recur.freq != ICAL_NO_RECURRENCE) {
- GSList *list = NULL, *existing;
- struct icalrecurrencetype *erecur;
-
- /* recurrence start of week */
- recur.week_start = get_ical_day (appt.repeatWeekstart);
-
- if (!appt.repeatForever) {
- recur.until = tm_to_icaltimetype (&appt.repeatEnd, TRUE);
- }
-
- list = g_slist_append (list, &recur);
- e_cal_component_set_rrule_list (comp, list);
-
- /* If the desktop uses count and rrules are
- * equivalent, use count still on the desktop */
- if (!appt.repeatForever && e_cal_component_has_rrules (in_comp)) {
- e_cal_component_get_rrule_list (in_comp, &existing);
- erecur = existing->data;
-
- /* If the rules are otherwise the same and the existing uses count,
- see if they end at the same point */
- if (rrules_mostly_equal (&recur, erecur) &&
- icaltime_is_null_time (erecur->until) && erecur->count > 0) {
- time_t last, elast;
-
- e_cal_recur_generate_instances (comp, -1, -1, find_last_cb, &last,
- e_cal_resolve_tzid_cb, client,
- timezone);
- e_cal_recur_generate_instances (in_comp, -1, -1, find_last_cb, &elast,
- e_cal_resolve_tzid_cb, client,
- timezone);
-
-
- if (last == elast) {
- recur.until = icaltime_null_time ();
- recur.count = erecur->count;
- e_cal_component_set_rrule_list (comp, list);
- }
- }
- }
-
- g_slist_free (list);
- } else {
- e_cal_component_set_rrule_list (comp, NULL);
- }
-
- /* Exceptions */
- for (i = 0; i < appt.exceptions; i++) {
- struct tm ex;
- ECalComponentDateTime *dt = g_new0 (ECalComponentDateTime, 1);
-
- dt->value = g_new0 (struct icaltimetype, 1);
- dt->tzid = NULL;
-
- ex = appt.exception[i];
- *dt->value = tm_to_icaltimetype (&ex, TRUE);
-
- edl = g_slist_prepend (edl, dt);
- }
- e_cal_component_set_exdate_list (comp, edl);
- e_cal_component_free_exdate_list (edl);
-
- /* Alarm */
- if (appt.alarm) {
- ECalComponentAlarm *alarm = NULL;
- ECalComponentAlarmTrigger trigger;
- gboolean found = FALSE;
-
- if (e_cal_component_has_alarms (comp)) {
- GList *uids, *l;
-
- uids = e_cal_component_get_alarm_uids (comp);
- for (l = uids; l != NULL; l = l->next) {
- alarm = e_cal_component_get_alarm (comp, l->data);
- e_cal_component_alarm_get_trigger (alarm, &trigger);
- if ((trigger.type == E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START
- && trigger.u.rel_duration.is_neg)) {
- found = TRUE;
- break;
- }
- e_cal_component_alarm_free (alarm);
- }
- cal_obj_uid_list_free (uids);
- }
- if (!found)
- alarm = e_cal_component_alarm_new ();
-
- memset (&trigger, 0, sizeof (ECalComponentAlarmTrigger));
- trigger.type = E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START;
- trigger.u.rel_duration.is_neg = 1;
- switch (appt.advanceUnits) {
- case advMinutes:
- trigger.u.rel_duration.minutes = appt.advance;
- break;
- case advHours:
- trigger.u.rel_duration.hours = appt.advance;
- break;
- case advDays:
- trigger.u.rel_duration.days = appt.advance;
- break;
- }
- e_cal_component_alarm_set_trigger (alarm, trigger);
- e_cal_component_alarm_set_action (alarm, E_CAL_COMPONENT_ALARM_DISPLAY);
-
- if (!found)
- e_cal_component_add_alarm (comp, alarm);
- e_cal_component_alarm_free (alarm);
- }
-
- e_cal_component_set_transparency (comp, E_CAL_COMPONENT_TRANSP_NONE);
-
- if (remote->secret)
- e_cal_component_set_classification (comp, E_CAL_COMPONENT_CLASS_PRIVATE);
- else
- e_cal_component_set_classification (comp, E_CAL_COMPONENT_CLASS_PUBLIC);
-
- e_cal_component_commit_sequence (comp);
-
- free_Appointment (&appt);
-
- return comp;
-}
-
-static void
-check_for_slow_setting (GnomePilotConduit *c, ECalConduitContext *ctxt)
-{
- GnomePilotConduitStandard *conduit = GNOME_PILOT_CONDUIT_STANDARD (c);
- int map_count;
- const char *uri;
-
- /* If there are objects but no log */
- map_count = g_hash_table_size (ctxt->map->pid_map);
- if (map_count == 0)
- gnome_pilot_conduit_standard_set_slow (conduit, TRUE);
-
- /* Or if the URI's don't match */
- uri = e_cal_get_uri (ctxt->client);
- LOG (g_message ( " Current URI %s (%s)\n", uri, ctxt->cfg->last_uri ? ctxt->cfg->last_uri : "<NONE>" ));
- if (ctxt->cfg->last_uri != NULL && strcmp (ctxt->cfg->last_uri, uri)) {
- gnome_pilot_conduit_standard_set_slow (conduit, TRUE);
- e_pilot_map_clear (ctxt->map);
- }
-
- if (gnome_pilot_conduit_standard_get_slow (conduit)) {
- ctxt->map->write_touched_only = TRUE;
- LOG (g_message ( " doing slow sync\n" ));
- } else {
- LOG (g_message ( " doing fast sync\n" ));
- }
-}
-
-/* Pilot syncing callbacks */
-static gint
-pre_sync (GnomePilotConduit *conduit,
- GnomePilotDBInfo *dbi,
- ECalConduitContext *ctxt)
-{
- GnomePilotConduitSyncAbs *abs_conduit;
- GList *removed = NULL, *added = NULL, *l;
- int len;
- unsigned char *buf;
- char *filename, *change_id;
- icalcomponent *icalcomp;
- gint num_records, add_records = 0, mod_records = 0, del_records = 0;
-
- abs_conduit = GNOME_PILOT_CONDUIT_SYNC_ABS (conduit);
-
- LOG (g_message ( "---------------------------------------------------------\n" ));
- LOG (g_message ( "pre_sync: Calendar Conduit v.%s", CONDUIT_VERSION ));
-
- ctxt->dbi = dbi;
- ctxt->client = NULL;
-
- if (start_calendar_server (ctxt) != 0) {
- WARN(_("Could not start evolution-data-server"));
- gnome_pilot_conduit_error (conduit, _("Could not start evolution-data-server"));
- return -1;
- }
-
- /* Get the timezone */
- ctxt->timezone = get_default_timezone ();
- if (ctxt->timezone == NULL)
- return -1;
- LOG (g_message ( " Using timezone: %s", icaltimezone_get_tzid (ctxt->timezone) ));
-
- /* Set the default timezone on the backend. */
- if (ctxt->timezone) {
- if (!e_cal_set_default_timezone (ctxt->client, ctxt->timezone, NULL))
- return -1;
- }
-
- /* Get the default component */
- if (!e_cal_get_default_object (ctxt->client, &icalcomp, NULL))
- return -1;
-
- ctxt->default_comp = e_cal_component_new ();
- if (!e_cal_component_set_icalcomponent (ctxt->default_comp, icalcomp)) {
- g_object_unref (ctxt->default_comp);
- icalcomponent_free (icalcomp);
- return -1;
- }
-
- /* Load the uid <--> pilot id mapping */
- filename = map_name (ctxt);
- e_pilot_map_read (filename, &ctxt->map);
- g_free (filename);
-
- /* Get the local database */
- if (!e_cal_get_object_list_as_comp (ctxt->client, "#t", &ctxt->comps, NULL))
- return -1;
-
- /* Find the added, modified and deleted items */
- change_id = g_strdup_printf ("pilot-sync-evolution-calendar-%d", ctxt->cfg->pilot_id);
- if (!e_cal_get_changes (ctxt->client, change_id, &ctxt->changed, NULL))
- return -1;
- ctxt->changed_hash = g_hash_table_new (g_str_hash, g_str_equal);
- g_free (change_id);
-
- /* See if we need to split up any events */
- for (l = ctxt->changed; l != NULL; l = l->next) {
- ECalChange *ccc = l->data;
- GList *multi_comp = NULL, *multi_ccc = NULL;
-
- if (process_multi_day (ctxt, ccc, &multi_comp, &multi_ccc)) {
- ctxt->comps = g_list_concat (ctxt->comps, multi_comp);
-
- added = g_list_concat (added, multi_ccc);
- removed = g_list_prepend (removed, ccc);
- }
- }
-
- /* Remove the events that were split up */
- g_list_concat (ctxt->changed, added);
- for (l = removed; l != NULL; l = l->next) {
- ECalChange *ccc = l->data;
- const char *uid;
-
- e_cal_component_get_uid (ccc->comp, &uid);
- if (e_pilot_map_lookup_pid (ctxt->map, uid, FALSE) == 0) {
- ctxt->changed = g_list_remove (ctxt->changed, ccc);
- g_object_unref (ccc->comp);
- g_free (ccc);
- }
- }
- g_list_free (removed);
-
- for (l = ctxt->changed; l != NULL; l = l->next) {
- ECalChange *ccc = l->data;
- const char *uid;
-
- e_cal_component_get_uid (ccc->comp, &uid);
- if (!e_pilot_map_uid_is_archived (ctxt->map, uid)) {
-
- g_hash_table_insert (ctxt->changed_hash, g_strdup (uid), ccc);
-
- switch (ccc->type) {
- case E_CAL_CHANGE_ADDED:
- add_records++;
- break;
- case E_CAL_CHANGE_MODIFIED:
- mod_records++;
- break;
- case E_CAL_CHANGE_DELETED:
- del_records++;
- break;
- }
- } else if (ccc->type == E_CAL_CHANGE_DELETED) {
- e_pilot_map_remove_by_uid (ctxt->map, uid);
- }
- }
-
- /* Set the count information */
- num_records = g_list_length (ctxt->comps);
- gnome_pilot_conduit_sync_abs_set_num_local_records(abs_conduit, num_records);
- gnome_pilot_conduit_sync_abs_set_num_new_local_records (abs_conduit, add_records);
- gnome_pilot_conduit_sync_abs_set_num_updated_local_records (abs_conduit, mod_records);
- gnome_pilot_conduit_sync_abs_set_num_deleted_local_records(abs_conduit, del_records);
-
- buf = (unsigned char*)g_malloc (0xffff);
- len = dlp_ReadAppBlock (dbi->pilot_socket, dbi->db_handle, 0,
- (unsigned char *)buf, 0xffff);
-
- if (len < 0) {
- WARN (_("Could not read pilot's Calendar application block"));
- WARN ("dlp_ReadAppBlock(...) = %d", len);
- gnome_pilot_conduit_error (conduit,
- _("Could not read pilot's Calendar application block"));
- return -1;
- }
- unpack_AppointmentAppInfo (&(ctxt->ai), buf, len);
- g_free (buf);
-
- check_for_slow_setting (conduit, ctxt);
- if (ctxt->cfg->sync_type == GnomePilotConduitSyncTypeCopyToPilot
- || ctxt->cfg->sync_type == GnomePilotConduitSyncTypeCopyFromPilot)
- ctxt->map->write_touched_only = TRUE;
-
- return 0;
-}
-
-static gint
-post_sync (GnomePilotConduit *conduit,
- GnomePilotDBInfo *dbi,
- ECalConduitContext *ctxt)
-{
- GList *changed;
- gchar *filename, *change_id;
-
- LOG (g_message ( "post_sync: Calendar Conduit v.%s", CONDUIT_VERSION ));
-
- g_free (ctxt->cfg->last_uri);
- ctxt->cfg->last_uri = g_strdup (e_cal_get_uri (ctxt->client));
- calconduit_save_configuration (ctxt->cfg);
-
- filename = map_name (ctxt);
- e_pilot_map_write (filename, ctxt->map);
- g_free (filename);
-
- /* FIX ME ugly hack - our changes musn't count, this does introduce
- * a race condition if anyone changes a record elsewhere during sycnc
- */
- change_id = g_strdup_printf ("pilot-sync-evolution-calendar-%d", ctxt->cfg->pilot_id);
- if (e_cal_get_changes (ctxt->client, change_id, &changed, NULL))
- e_cal_free_change_list (changed);
- g_free (change_id);
-
- LOG (g_message ( "---------------------------------------------------------\n" ));
-
- return 0;
-}
-
-static gint
-set_pilot_id (GnomePilotConduitSyncAbs *conduit,
- ECalLocalRecord *local,
- guint32 ID,
- ECalConduitContext *ctxt)
-{
- const char *uid;
-
- LOG (g_message ( "set_pilot_id: setting to %d\n", ID ));
-
- e_cal_component_get_uid (local->comp, &uid);
- e_pilot_map_insert (ctxt->map, ID, uid, FALSE);
-
- return 0;
-}
-
-static gint
-set_status_cleared (GnomePilotConduitSyncAbs *conduit,
- ECalLocalRecord *local,
- ECalConduitContext *ctxt)
-{
- const char *uid;
-
- LOG (g_message ( "set_status_cleared: clearing status\n" ));
-
- e_cal_component_get_uid (local->comp, &uid);
- g_hash_table_remove (ctxt->changed_hash, uid);
-
- return 0;
-}
-
-static gint
-for_each (GnomePilotConduitSyncAbs *conduit,
- ECalLocalRecord **local,
- ECalConduitContext *ctxt)
-{
- static GList *comps, *iterator;
- static int count;
-
- g_return_val_if_fail (local != NULL, -1);
-
- if (*local == NULL) {
- LOG (g_message ( "beginning for_each" ));
-
- comps = ctxt->comps;
- count = 0;
-
- if (comps != NULL) {
- LOG (g_message ( "iterating over %d records", g_list_length (comps)));
-
- *local = g_new0 (ECalLocalRecord, 1);
- local_record_from_comp (*local, comps->data, ctxt);
- g_list_prepend (ctxt->locals, *local);
-
- iterator = comps;
- } else {
- LOG (g_message ( "no events" ));
- (*local) = NULL;
- return 0;
- }
- } else {
- count++;
- if (g_list_next (iterator)) {
- iterator = g_list_next (iterator);
-
- *local = g_new0 (ECalLocalRecord, 1);
- local_record_from_comp (*local, iterator->data, ctxt);
- g_list_prepend (ctxt->locals, *local);
- } else {
- LOG (g_message ( "for_each ending" ));
-
- /* Tell the pilot the iteration is over */
- *local = NULL;
-
- return 0;
- }
- }
-
- return 0;
-}
-
-static gint
-for_each_modified (GnomePilotConduitSyncAbs *conduit,
- ECalLocalRecord **local,
- ECalConduitContext *ctxt)
-{
- static GList *iterator;
- static int count;
-
- g_return_val_if_fail (local != NULL, -1);
-
- if (*local == NULL) {
- LOG (g_message ( "for_each_modified beginning\n" ));
-
- iterator = ctxt->changed;
-
- count = 0;
-
- LOG (g_message ( "iterating over %d records", g_hash_table_size (ctxt->changed_hash) ));
-
- iterator = next_changed_item (ctxt, iterator);
- if (iterator != NULL) {
- ECalChange *ccc = iterator->data;
-
- *local = g_new0 (ECalLocalRecord, 1);
- local_record_from_comp (*local, ccc->comp, ctxt);
- g_list_prepend (ctxt->locals, *local);
- } else {
- LOG (g_message ( "no events" ));
-
- *local = NULL;
- }
- } else {
- count++;
- iterator = g_list_next (iterator);
- if (iterator && (iterator = next_changed_item (ctxt, iterator))) {
- ECalChange *ccc = iterator->data;
-
- *local = g_new0 (ECalLocalRecord, 1);
- local_record_from_comp (*local, ccc->comp, ctxt);
- g_list_prepend (ctxt->locals, *local);
- } else {
- LOG (g_message ( "for_each_modified ending" ));
-
- /* Signal the iteration is over */
- *local = NULL;
- }
- }
-
- return 0;
-}
-
-static gint
-compare (GnomePilotConduitSyncAbs *conduit,
- ECalLocalRecord *local,
- GnomePilotRecord *remote,
- ECalConduitContext *ctxt)
-{
- /* used by the quick compare */
- GnomePilotRecord local_pilot;
- int retval = 0;
-
- LOG (g_message ("compare: local=%s remote=%s...\n",
- print_local (local), print_remote (remote)));
-
- g_return_val_if_fail (local!=NULL,-1);
- g_return_val_if_fail (remote!=NULL,-1);
-
- local_pilot = local_record_to_pilot_record (local, ctxt);
-
- if (remote->length != local_pilot.length
- || memcmp (local_pilot.record, remote->record, remote->length))
- retval = 1;
-
- if (retval == 0)
- LOG (g_message ( " equal" ));
- else
- LOG (g_message ( " not equal" ));
-
- return retval;
-}
-
-static gint
-add_record (GnomePilotConduitSyncAbs *conduit,
- GnomePilotRecord *remote,
- ECalConduitContext *ctxt)
-{
- ECalComponent *comp;
- char *uid;
- int retval = 0;
-
- g_return_val_if_fail (remote != NULL, -1);
-
- LOG (g_message ( "add_record: adding %s to desktop\n", print_remote (remote) ));
-
- comp = comp_from_remote_record (conduit, remote, ctxt->default_comp, ctxt->client, ctxt->timezone);
-
- /* Give it a new UID otherwise it will be the uid of the default comp */
- uid = e_cal_component_gen_uid ();
- e_cal_component_set_uid (comp, uid);
-
- if (!e_cal_create_object (ctxt->client, e_cal_component_get_icalcomponent (comp), NULL, NULL))
- return -1;
-
- e_pilot_map_insert (ctxt->map, remote->ID, uid, FALSE);
-
- g_free (uid);
-
- g_object_unref (comp);
-
- return retval;
-}
-
-static gint
-replace_record (GnomePilotConduitSyncAbs *conduit,
- ECalLocalRecord *local,
- GnomePilotRecord *remote,
- ECalConduitContext *ctxt)
-{
- ECalComponent *new_comp;
- int retval = 0;
-
- g_return_val_if_fail (remote != NULL, -1);
-
- LOG (g_message ("replace_record: replace %s with %s\n",
- print_local (local), print_remote (remote)));
-
- new_comp = comp_from_remote_record (conduit, remote, local->comp, ctxt->client, ctxt->timezone);
- g_object_unref (local->comp);
- local->comp = new_comp;
-
- if (!e_cal_modify_object (ctxt->client, e_cal_component_get_icalcomponent (new_comp),
- CALOBJ_MOD_ALL, NULL))
- return -1;
-
- return retval;
-}
-
-static gint
-delete_record (GnomePilotConduitSyncAbs *conduit,
- ECalLocalRecord *local,
- ECalConduitContext *ctxt)
-{
- const char *uid;
-
- g_return_val_if_fail (local != NULL, -1);
- g_assert (local->comp != NULL);
-
- e_cal_component_get_uid (local->comp, &uid);
-
- LOG (g_message ( "delete_record: deleting %s\n", uid ));
-
- e_pilot_map_remove_by_uid (ctxt->map, uid);
- /* FIXME Error handling */
- e_cal_remove_object (ctxt->client, uid, NULL);
-
- return 0;
-}
-
-static gint
-archive_record (GnomePilotConduitSyncAbs *conduit,
- ECalLocalRecord *local,
- gboolean archive,
- ECalConduitContext *ctxt)
-{
- const char *uid;
- int retval = 0;
-
- g_return_val_if_fail (local != NULL, -1);
-
- LOG (g_message ( "archive_record: %s\n", archive ? "yes" : "no" ));
-
- e_cal_component_get_uid (local->comp, &uid);
- e_pilot_map_insert (ctxt->map, local->local.ID, uid, archive);
-
- return retval;
-}
-
-static gint
-match (GnomePilotConduitSyncAbs *conduit,
- GnomePilotRecord *remote,
- ECalLocalRecord **local,
- ECalConduitContext *ctxt)
-{
- const char *uid;
-
- LOG (g_message ("match: looking for local copy of %s\n",
- print_remote (remote)));
-
- g_return_val_if_fail (local != NULL, -1);
- g_return_val_if_fail (remote != NULL, -1);
-
- *local = NULL;
- uid = e_pilot_map_lookup_uid (ctxt->map, remote->ID, TRUE);
-
- if (!uid)
- return 0;
-
- LOG (g_message ( " matched\n" ));
-
- *local = g_new0 (ECalLocalRecord, 1);
- local_record_from_uid (*local, uid, ctxt);
-
- return 0;
-}
-
-static gint
-free_match (GnomePilotConduitSyncAbs *conduit,
- ECalLocalRecord *local,
- ECalConduitContext *ctxt)
-{
- LOG (g_message ( "free_match: freeing\n" ));
-
- g_return_val_if_fail (local != NULL, -1);
-
- calconduit_destroy_record (local);
-
- return 0;
-}
-
-static gint
-prepare (GnomePilotConduitSyncAbs *conduit,
- ECalLocalRecord *local,
- GnomePilotRecord *remote,
- ECalConduitContext *ctxt)
-{
- LOG (g_message ( "prepare: encoding local %s\n", print_local (local) ));
-
- *remote = local_record_to_pilot_record (local, ctxt);
-
- return 0;
-}
-
-/* Pilot Settings Callbacks */
-static void
-fill_widgets (ECalConduitContext *ctxt)
-{
- if (ctxt->cfg->source)
- e_pilot_settings_set_source (E_PILOT_SETTINGS (ctxt->ps),
- ctxt->cfg->source);
- e_pilot_settings_set_secret (E_PILOT_SETTINGS (ctxt->ps),
- ctxt->cfg->secret);
-
- e_cal_gui_fill_widgets (ctxt->gui, ctxt->cfg);
-}
-
-static gint
-create_settings_window (GnomePilotConduit *conduit,
- GtkWidget *parent,
- ECalConduitContext *ctxt)
-{
- LOG (g_message ( "create_settings_window" ));
-
- if (!ctxt->cfg->source_list)
- return -1;
-
- ctxt->ps = e_pilot_settings_new (ctxt->cfg->source_list);
- ctxt->gui = e_cal_gui_new (E_PILOT_SETTINGS (ctxt->ps));
-
- gtk_container_add (GTK_CONTAINER (parent), ctxt->ps);
- gtk_widget_show (ctxt->ps);
-
- fill_widgets (ctxt);
-
- return 0;
-}
-static void
-display_settings (GnomePilotConduit *conduit, ECalConduitContext *ctxt)
-{
- LOG (g_message ( "display_settings" ));
-
- fill_widgets (ctxt);
-}
-
-static void
-save_settings (GnomePilotConduit *conduit, ECalConduitContext *ctxt)
-{
- LOG (g_message ( "save_settings" ));
-
- if (ctxt->new_cfg->source)
- g_object_unref (ctxt->new_cfg->source);
- ctxt->new_cfg->source = g_object_ref (e_pilot_settings_get_source (E_PILOT_SETTINGS (ctxt->ps)));
- g_object_ref (ctxt->new_cfg->source);
- ctxt->new_cfg->secret =
- e_pilot_settings_get_secret (E_PILOT_SETTINGS (ctxt->ps));
- e_cal_gui_fill_config (ctxt->gui, ctxt->new_cfg);
-
- calconduit_save_configuration (ctxt->new_cfg);
-}
-
-static void
-revert_settings (GnomePilotConduit *conduit, ECalConduitContext *ctxt)
-{
- LOG (g_message ( "revert_settings" ));
-
- calconduit_save_configuration (ctxt->cfg);
- calconduit_destroy_configuration (ctxt->new_cfg);
- ctxt->new_cfg = calconduit_dupe_configuration (ctxt->cfg);
-}
-
-GnomePilotConduit *
-conduit_get_gpilot_conduit (guint32 pilot_id)
-{
- GtkObject *retval;
- ECalConduitContext *ctxt;
-
- LOG (g_message ( "in calendar's conduit_get_gpilot_conduit\n" ));
-
- retval = gnome_pilot_conduit_sync_abs_new ("DatebookDB", 0x64617465);
- g_assert (retval != NULL);
-
- ctxt = e_calendar_context_new (pilot_id);
- gtk_object_set_data (GTK_OBJECT (retval), "calconduit_context", ctxt);
-
- /* Sync signals */
- gtk_signal_connect (retval, "pre_sync", (GtkSignalFunc) pre_sync, ctxt);
- gtk_signal_connect (retval, "post_sync", (GtkSignalFunc) post_sync, ctxt);
-
- gtk_signal_connect (retval, "set_pilot_id", (GtkSignalFunc) set_pilot_id, ctxt);
- gtk_signal_connect (retval, "set_status_cleared", (GtkSignalFunc) set_status_cleared, ctxt);
-
- gtk_signal_connect (retval, "for_each", (GtkSignalFunc) for_each, ctxt);
- gtk_signal_connect (retval, "for_each_modified", (GtkSignalFunc) for_each_modified, ctxt);
- gtk_signal_connect (retval, "compare", (GtkSignalFunc) compare, ctxt);
-
- gtk_signal_connect (retval, "add_record", (GtkSignalFunc) add_record, ctxt);
- gtk_signal_connect (retval, "replace_record", (GtkSignalFunc) replace_record, ctxt);
- gtk_signal_connect (retval, "delete_record", (GtkSignalFunc) delete_record, ctxt);
- gtk_signal_connect (retval, "archive_record", (GtkSignalFunc) archive_record, ctxt);
-
- gtk_signal_connect (retval, "match", (GtkSignalFunc) match, ctxt);
- gtk_signal_connect (retval, "free_match", (GtkSignalFunc) free_match, ctxt);
-
- gtk_signal_connect (retval, "prepare", (GtkSignalFunc) prepare, ctxt);
-
- /* Gui Settings */
- gtk_signal_connect (retval, "create_settings_window", (GtkSignalFunc) create_settings_window, ctxt);
- gtk_signal_connect (retval, "display_settings", (GtkSignalFunc) display_settings, ctxt);
- gtk_signal_connect (retval, "save_settings", (GtkSignalFunc) save_settings, ctxt);
- gtk_signal_connect (retval, "revert_settings", (GtkSignalFunc) revert_settings, ctxt);
-
- return GNOME_PILOT_CONDUIT (retval);
-}
-
-void
-conduit_destroy_gpilot_conduit (GnomePilotConduit *conduit)
-{
- GtkObject *obj = GTK_OBJECT (conduit);
- ECalConduitContext *ctxt;
-
- ctxt = gtk_object_get_data (obj, "calconduit_context");
- e_calendar_context_destroy (ctxt);
-
- gtk_object_destroy (obj);
-}
diff --git a/calendar/conduits/calendar/e-calendar.conduit.in b/calendar/conduits/calendar/e-calendar.conduit.in
deleted file mode 100644
index 6ddcf5761a..0000000000
--- a/calendar/conduits/calendar/e-calendar.conduit.in
+++ /dev/null
@@ -1,9 +0,0 @@
-<gnome-pilot-conduit version="1.0">
- <conduit id="e_calendar_conduit" type="shlib" location="@privconduitdir@/libecalendar_conduit.so"/>
- <name value="ECalendar"/>
- <conduit-attribute name="description" value="Synchronizes Calendar with Evolution @BASE_VERSION@"/>
- <conduit-attribute name="default-synctype" value="synchronize"/>
- <conduit-attribute name="valid-synctypes" value="synchronize copy_from_pilot copy_to_pilot"/>
- <conduit-attribute name="settings" value="TRUE"/>
- <conduit-attribute name="icon" value="@datadir@/images/evolution/conduits/48_evo-calendar-conduit.png"/>
-</gnome-pilot-conduit>
diff --git a/calendar/conduits/todo/.cvsignore b/calendar/conduits/todo/.cvsignore
deleted file mode 100644
index 84e47b82ae..0000000000
--- a/calendar/conduits/todo/.cvsignore
+++ /dev/null
@@ -1,9 +0,0 @@
-Makefile.in
-Makefile
-.deps
-.libs
-*.lo
-*.la
-e-todo-conduit-control-applet
-e-todo-conduit-control-applet.desktop
-*.conduit
diff --git a/calendar/conduits/todo/Makefile.am b/calendar/conduits/todo/Makefile.am
deleted file mode 100644
index 8753a50395..0000000000
--- a/calendar/conduits/todo/Makefile.am
+++ /dev/null
@@ -1,37 +0,0 @@
-INCLUDES = \
- -I$(top_srcdir)/e-util \
- -I$(top_builddir)/e-util \
- -I$(top_srcdir)/widgets/misc \
- -I$(top_builddir)/widgets/misc \
- $(EVOLUTION_CALENDAR_CONDUIT_CFLAGS)
-
-# ToDo Conduit
-privconduit_LTLIBRARIES = libetodo_conduit.la
-
-libetodo_conduit_la_SOURCES = \
- todo-conduit.c
-
-libetodo_conduit_la_LDFLAGS = -module -avoid-version
-libetodo_conduit_la_LIBADD = \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/e-util/libeconduit.la \
- $(top_builddir)/widgets/misc/libemiscwidgets.la \
- $(EVOLUTION_CALENDAR_CONDUIT_LIBS)
-
-e-todo-$(BASE_VERSION).conduit: e-todo.conduit.in
- sed -e 's^\@privconduitdir\@^$(privconduitdir)^g' \
- -e 's^\@datadir\@^$(datadir)^g' \
- -e 's^\@BASE_VERSION\@^$(BASE_VERSION)^g' \
- $< > $@
-
-conduitdir = $(datadir)/gnome-pilot/conduits/
-conduit_DATA = e-todo-$(BASE_VERSION).conduit
-
-BUILT_SOURCES = $(conduit_DATA)
-CLEANFILES = $(BUILT_SOURCES)
-
-EXTRA_DIST = \
- e-todo.conduit.in
-
-dist-hook:
- cd $(distdir); rm -f $(BUILT_SOURCES) \ No newline at end of file
diff --git a/calendar/conduits/todo/e-todo.conduit.in b/calendar/conduits/todo/e-todo.conduit.in
deleted file mode 100644
index 3b02058c91..0000000000
--- a/calendar/conduits/todo/e-todo.conduit.in
+++ /dev/null
@@ -1,9 +0,0 @@
-<gnome-pilot-conduit version="1.0">
- <conduit id="e_todo_conduit" type="shlib" location="@privconduitdir@/libetodo_conduit.so"/>
- <name value="EToDo"/>
- <conduit-attribute name="description" value="Synchronizes ToDo List with Evolution @BASE_VERSION@"/>
- <conduit-attribute name="default-synctype" value="synchronize"/>
- <conduit-attribute name="valid-synctypes" value="synchronize copy_from_pilot copy_to_pilot"/>
- <conduit-attribute name="settings" value="TRUE"/>
- <conduit-attribute name="icon" value="@datadir@/images/evolution/conduits/48_evo-todo-conduit.png"/>
-</gnome-pilot-conduit>
diff --git a/calendar/conduits/todo/todo-conduit.c b/calendar/conduits/todo/todo-conduit.c
deleted file mode 100644
index 1767741270..0000000000
--- a/calendar/conduits/todo/todo-conduit.c
+++ /dev/null
@@ -1,1438 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution calendar - ToDo Conduit
- *
- * Copyright (C) 1998 Free Software Foundation
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: Eskil Heyn Olsen <deity@eskil.dk>
- * JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#define G_LOG_DOMAIN "etodoconduit"
-
-#include <libecal/e-cal-types.h>
-#include <libecal/e-cal.h>
-#include <libecal/e-cal-time-util.h>
-#include <pi-source.h>
-#include <pi-socket.h>
-#include <pi-dlp.h>
-#include <pi-todo.h>
-#include <libical/icaltypes.h>
-#include <gpilotd/gnome-pilot-conduit.h>
-#include <gpilotd/gnome-pilot-conduit-sync-abs.h>
-#include <libgpilotdCM/gnome-pilot-conduit-management.h>
-#include <libgpilotdCM/gnome-pilot-conduit-config.h>
-#include <e-pilot-map.h>
-#include <e-pilot-settings.h>
-#include <e-pilot-util.h>
-#include <e-config-listener.h>
-
-GnomePilotConduit * conduit_get_gpilot_conduit (guint32);
-void conduit_destroy_gpilot_conduit (GnomePilotConduit*);
-
-#define CONDUIT_VERSION "0.1.6"
-
-#define DEBUG_TODOCONDUIT 1
-/* #undef DEBUG_TODOCONDUIT */
-
-#ifdef DEBUG_TODOCONDUIT
-#define LOG(x) x
-#else
-#define LOG(x)
-#endif
-
-#define WARN g_warning
-#define INFO g_message
-
-typedef struct _EToDoLocalRecord EToDoLocalRecord;
-typedef struct _EToDoConduitCfg EToDoConduitCfg;
-typedef struct _EToDoConduitGui EToDoConduitGui;
-typedef struct _EToDoConduitContext EToDoConduitContext;
-
-/* Local Record */
-struct _EToDoLocalRecord {
- /* The stuff from gnome-pilot-conduit-standard-abs.h
- Must be first in the structure, or instances of this
- structure cannot be used by gnome-pilot-conduit-standard-abs.
- */
- GnomePilotDesktopRecord local;
-
- /* The corresponding Comp object */
- ECalComponent *comp;
-
- /* pilot-link todo structure */
- struct ToDo *todo;
-};
-
-static void
-todoconduit_destroy_record (EToDoLocalRecord *local)
-{
- g_object_unref (local->comp);
- free_ToDo (local->todo);
- g_free (local->todo);
- g_free (local);
-}
-
-/* Configuration */
-struct _EToDoConduitCfg {
- guint32 pilot_id;
- GnomePilotConduitSyncType sync_type;
-
- ESourceList *source_list;
- ESource *source;
- gboolean secret;
- gint priority;
-
- gchar *last_uri;
-};
-
-static EToDoConduitCfg *
-todoconduit_load_configuration (guint32 pilot_id)
-{
- EToDoConduitCfg *c;
- GnomePilotConduitManagement *management;
- GnomePilotConduitConfig *config;
- gchar prefix[256];
-
-
- g_snprintf (prefix, 255, "/gnome-pilot.d/e-todo-conduit/Pilot_%u/",
- pilot_id);
-
- c = g_new0 (EToDoConduitCfg,1);
- g_assert (c != NULL);
-
- c->pilot_id = pilot_id;
-
- management = gnome_pilot_conduit_management_new ("e_todo_conduit", GNOME_PILOT_CONDUIT_MGMT_ID);
- gtk_object_ref (GTK_OBJECT (management));
- gtk_object_sink (GTK_OBJECT (management));
- config = gnome_pilot_conduit_config_new (management, pilot_id);
- gtk_object_ref (GTK_OBJECT (config));
- gtk_object_sink (GTK_OBJECT (config));
- if (!gnome_pilot_conduit_config_is_enabled (config, &c->sync_type))
- c->sync_type = GnomePilotConduitSyncTypeNotSet;
- gtk_object_unref (GTK_OBJECT (config));
- gtk_object_unref (GTK_OBJECT (management));
-
- /* Custom settings */
- gnome_config_push_prefix (prefix);
-
- if (!e_cal_get_sources (&c->source_list, E_CAL_SOURCE_TYPE_TODO, NULL))
- c->source_list = NULL;
- if (c->source_list) {
- c->source = e_pilot_get_sync_source (c->source_list);
- if (!c->source)
- c->source = e_source_list_peek_source_any (c->source_list);
- if (c->source) {
- g_object_ref (c->source);
- } else {
- g_object_unref (c->source_list);
- c->source_list = NULL;
- }
- }
-
- c->secret = gnome_config_get_bool ("secret=FALSE");
- c->priority = gnome_config_get_int ("priority=3");
- c->last_uri = gnome_config_get_string ("last_uri");
-
- gnome_config_pop_prefix ();
-
- return c;
-}
-
-static void
-todoconduit_save_configuration (EToDoConduitCfg *c)
-{
- gchar prefix[256];
-
- g_snprintf (prefix, 255, "/gnome-pilot.d/e-todo-conduit/Pilot_%u/",
- c->pilot_id);
-
- gnome_config_push_prefix (prefix);
- e_pilot_set_sync_source (c->source_list, c->source);
- gnome_config_set_bool ("secret", c->secret);
- gnome_config_set_int ("priority", c->priority);
- gnome_config_set_string ("last_uri", c->last_uri);
- gnome_config_pop_prefix ();
-
- gnome_config_sync ();
- gnome_config_drop_all ();
-}
-
-static EToDoConduitCfg*
-todoconduit_dupe_configuration (EToDoConduitCfg *c)
-{
- EToDoConduitCfg *retval;
-
- g_return_val_if_fail (c != NULL, NULL);
-
- retval = g_new0 (EToDoConduitCfg, 1);
- retval->sync_type = c->sync_type;
- retval->pilot_id = c->pilot_id;
-
- if (c->source_list)
- retval->source_list = g_object_ref (c->source_list);
- if (c->source)
- retval->source = g_object_ref (c->source);
- retval->secret = c->secret;
- retval->priority = c->priority;
- retval->last_uri = g_strdup (c->last_uri);
-
- return retval;
-}
-
-static void
-todoconduit_destroy_configuration (EToDoConduitCfg *c)
-{
- g_return_if_fail (c != NULL);
-
- g_object_unref (c->source_list);
- g_object_unref (c->source);
- g_free (c->last_uri);
- g_free (c);
-}
-
-/* Gui */
-struct _EToDoConduitGui {
- GtkWidget *priority;
-};
-
-static EToDoConduitGui *
-e_todo_gui_new (EPilotSettings *ps)
-{
- EToDoConduitGui *gui;
- GtkWidget *lbl;
- GtkObject *adj;
- gint rows;
-
- g_return_val_if_fail (ps != NULL, NULL);
- g_return_val_if_fail (E_IS_PILOT_SETTINGS (ps), NULL);
-
- gtk_table_resize (GTK_TABLE (ps), E_PILOT_SETTINGS_TABLE_ROWS + 1, E_PILOT_SETTINGS_TABLE_COLS);
-
- gui = g_new0 (EToDoConduitGui, 1);
-
- rows = E_PILOT_SETTINGS_TABLE_ROWS;
- lbl = gtk_label_new (_("Default Priority:"));
- gtk_misc_set_alignment (GTK_MISC (lbl), 0.0, 0.5);
- adj = gtk_adjustment_new (1, 1, 5, 1, 5, 5);
- gui->priority = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1.0, 0);
- gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (gui->priority), TRUE);
- gtk_table_attach_defaults (GTK_TABLE (ps), lbl, 0, 1, rows, rows + 1);
- gtk_table_attach_defaults (GTK_TABLE (ps), gui->priority, 1, 2, rows, rows + 1);
- gtk_widget_show (lbl);
- gtk_widget_show (gui->priority);
-
- return gui;
-}
-
-static void
-e_todo_gui_fill_widgets (EToDoConduitGui *gui, EToDoConduitCfg *cfg)
-{
- g_return_if_fail (gui != NULL);
- g_return_if_fail (cfg != NULL);
-
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (gui->priority), cfg->priority);
-}
-
-static void
-e_todo_gui_fill_config (EToDoConduitGui *gui, EToDoConduitCfg *cfg)
-{
- g_return_if_fail (gui != NULL);
- g_return_if_fail (cfg != NULL);
-
- cfg->priority = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (gui->priority));
-}
-
-static void
-e_todo_gui_destroy (EToDoConduitGui *gui)
-{
- g_free (gui);
-}
-
-/* Context */
-struct _EToDoConduitContext {
- GnomePilotDBInfo *dbi;
-
- EToDoConduitCfg *cfg;
- EToDoConduitCfg *new_cfg;
- EToDoConduitGui *gui;
- GtkWidget *ps;
-
- struct ToDoAppInfo ai;
-
- ECal *client;
-
- icaltimezone *timezone;
- ECalComponent *default_comp;
- GList *comps;
- GList *changed;
- GHashTable *changed_hash;
- GList *locals;
-
- EPilotMap *map;
-};
-
-static EToDoConduitContext *
-e_todo_context_new (guint32 pilot_id)
-{
- EToDoConduitContext *ctxt = g_new0 (EToDoConduitContext, 1);
-
- ctxt->cfg = todoconduit_load_configuration (pilot_id);
- ctxt->new_cfg = todoconduit_dupe_configuration (ctxt->cfg);
- ctxt->gui = NULL;
- ctxt->ps = NULL;
- ctxt->client = NULL;
- ctxt->timezone = NULL;
- ctxt->default_comp = NULL;
- ctxt->comps = NULL;
- ctxt->changed_hash = NULL;
- ctxt->changed = NULL;
- ctxt->locals = NULL;
- ctxt->map = NULL;
-
- return ctxt;
-}
-
-static gboolean
-e_todo_context_foreach_change (gpointer key, gpointer value, gpointer data)
-{
- g_free (key);
-
- return TRUE;
-}
-
-static void
-e_todo_context_destroy (EToDoConduitContext *ctxt)
-{
- GList *l;
-
- g_return_if_fail (ctxt != NULL);
-
- if (ctxt->cfg != NULL)
- todoconduit_destroy_configuration (ctxt->cfg);
- if (ctxt->new_cfg != NULL)
- todoconduit_destroy_configuration (ctxt->new_cfg);
- if (ctxt->gui != NULL)
- e_todo_gui_destroy (ctxt->gui);
-
- if (ctxt->client != NULL)
- g_object_unref (ctxt->client);
-
- if (ctxt->default_comp != NULL)
- g_object_unref (ctxt->default_comp);
- if (ctxt->comps != NULL) {
- for (l = ctxt->comps; l; l = l->next)
- g_object_unref (l->data);
- g_list_free (ctxt->comps);
- }
-
- if (ctxt->changed_hash != NULL) {
- g_hash_table_foreach_remove (ctxt->changed_hash, e_todo_context_foreach_change, NULL);
- g_hash_table_destroy (ctxt->changed_hash);
- }
-
- if (ctxt->locals != NULL) {
- for (l = ctxt->locals; l != NULL; l = l->next)
- todoconduit_destroy_record (l->data);
- g_list_free (ctxt->locals);
- }
-
- if (ctxt->changed != NULL)
- e_cal_free_change_list (ctxt->changed);
-
- if (ctxt->map != NULL)
- e_pilot_map_destroy (ctxt->map);
-
- g_free (ctxt);
-}
-
-/* Debug routines */
-static char *
-print_local (EToDoLocalRecord *local)
-{
- static char buff[ 4096 ];
-
- if (local == NULL) {
- sprintf (buff, "[NULL]");
- return buff;
- }
-
- if (local->todo && local->todo->description) {
- g_snprintf (buff, 4096, "[%d %ld %d %d '%s' '%s']",
- local->todo->indefinite,
- mktime (& local->todo->due),
- local->todo->priority,
- local->todo->complete,
- local->todo->description ?
- local->todo->description : "",
- local->todo->note ?
- local->todo->note : "");
- return buff;
- }
-
- return "";
-}
-
-static char *print_remote (GnomePilotRecord *remote)
-{
- static char buff[ 4096 ];
- struct ToDo todo;
-
- if (remote == NULL) {
- sprintf (buff, "[NULL]");
- return buff;
- }
-
- memset (&todo, 0, sizeof (struct ToDo));
- unpack_ToDo (&todo, remote->record, remote->length);
-
- g_snprintf (buff, 4096, "[%d %ld %d %d '%s' '%s']",
- todo.indefinite,
- mktime (&todo.due),
- todo.priority,
- todo.complete,
- todo.description ?
- todo.description : "",
- todo.note ?
- todo.note : "");
-
- free_ToDo (&todo);
-
- return buff;
-}
-
-static int
-start_calendar_server (EToDoConduitContext *ctxt)
-{
- g_return_val_if_fail (ctxt != NULL, -2);
-
- if (ctxt->cfg->source) {
- ctxt->client = e_cal_new (ctxt->cfg->source, E_CAL_SOURCE_TYPE_TODO);
- if (!e_cal_open (ctxt->client, TRUE, NULL))
- return -1;
- } else if (!e_cal_open_default (&ctxt->client, E_CAL_SOURCE_TYPE_TODO, NULL, NULL, NULL)) {
- return -1;
- }
-
- return 0;
-}
-
-/* Utility routines */
-static icaltimezone *
-get_timezone (ECal *client, const char *tzid)
-{
- icaltimezone *timezone = NULL;
-
- timezone = icaltimezone_get_builtin_timezone_from_tzid (tzid);
- if (timezone == NULL)
- e_cal_get_timezone (client, tzid, &timezone, NULL);
-
- return timezone;
-}
-
-static icaltimezone *
-get_default_timezone (void)
-{
- EConfigListener *listener;
- icaltimezone *timezone = NULL;
- char *location;
-
- listener = e_config_listener_new ();
-
- location = e_config_listener_get_string_with_default (listener,
- "/apps/evolution/calendar/display/timezone", "UTC", NULL);
- if (!location || !location[0]) {
- g_free (location);
- location = g_strdup ("UTC");
- }
-
- timezone = icaltimezone_get_builtin_timezone (location);
- g_free (location);
-
- g_object_unref (listener);
-
- return timezone;
-}
-
-static char *
-map_name (EToDoConduitContext *ctxt)
-{
- char *filename;
-
- filename = g_strdup_printf ("%s/.evolution/tasks/local/system/pilot-map-todo-%d.xml", g_get_home_dir (), ctxt->cfg->pilot_id);
-
- return filename;
-}
-
-static gboolean
-is_empty_time (struct tm time)
-{
- if (time.tm_sec || time.tm_min || time.tm_hour
- || time.tm_mday || time.tm_mon || time.tm_year)
- return FALSE;
-
- return TRUE;
-}
-
-static GList *
-next_changed_item (EToDoConduitContext *ctxt, GList *changes)
-{
- ECalChange *ccc;
- GList *l;
-
- for (l = changes; l != NULL; l = l->next) {
- const char *uid;
-
- ccc = l->data;
-
- e_cal_component_get_uid (ccc->comp, &uid);
- if (g_hash_table_lookup (ctxt->changed_hash, uid))
- return l;
- }
-
- return NULL;
-}
-
-static void
-compute_status (EToDoConduitContext *ctxt, EToDoLocalRecord *local, const char *uid)
-{
- ECalChange *ccc;
-
- local->local.archived = FALSE;
- local->local.secret = FALSE;
-
- ccc = g_hash_table_lookup (ctxt->changed_hash, uid);
-
- if (ccc == NULL) {
- local->local.attr = GnomePilotRecordNothing;
- return;
- }
-
- switch (ccc->type) {
- case E_CAL_CHANGE_ADDED:
- local->local.attr = GnomePilotRecordNew;
- break;
- case E_CAL_CHANGE_MODIFIED:
- local->local.attr = GnomePilotRecordModified;
- break;
- case E_CAL_CHANGE_DELETED:
- local->local.attr = GnomePilotRecordDeleted;
- break;
- }
-}
-
-static GnomePilotRecord
-local_record_to_pilot_record (EToDoLocalRecord *local,
- EToDoConduitContext *ctxt)
-{
- GnomePilotRecord p;
- static char record[0xffff];
-
- g_assert (local->comp != NULL);
- g_assert (local->todo != NULL );
-
- LOG (g_message ( "local_record_to_pilot_record\n" ));
-
- p.ID = local->local.ID;
- p.category = local->local.category;
- p.attr = local->local.attr;
- p.archived = local->local.archived;
- p.secret = local->local.secret;
-
- /* Generate pilot record structure */
- p.record = record;
- p.length = pack_ToDo (local->todo, p.record, 0xffff);
-
- return p;
-}
-
-/*
- * converts a ECalComponent object to a EToDoLocalRecord
- */
-static void
-local_record_from_comp (EToDoLocalRecord *local, ECalComponent *comp, EToDoConduitContext *ctxt)
-{
- const char *uid;
- int *priority;
- icalproperty_status status;
- ECalComponentText summary;
- GSList *d_list = NULL;
- ECalComponentText *description;
- ECalComponentDateTime due;
- ECalComponentClassification classif;
- icaltimezone *default_tz = get_default_timezone ();
-
- LOG (g_message ( "local_record_from_comp\n" ));
-
- g_return_if_fail (local != NULL);
- g_return_if_fail (comp != NULL);
-
- local->comp = comp;
- g_object_ref (comp);
-
- e_cal_component_get_uid (local->comp, &uid);
- local->local.ID = e_pilot_map_lookup_pid (ctxt->map, uid, TRUE);
-
- compute_status (ctxt, local, uid);
-
- local->todo = g_new0 (struct ToDo,1);
-
- /* Don't overwrite the category */
- if (local->local.ID != 0) {
- char record[0xffff];
- int cat = 0;
-
- if (dlp_ReadRecordById (ctxt->dbi->pilot_socket,
- ctxt->dbi->db_handle,
- local->local.ID, &record,
- NULL, NULL, NULL, &cat) > 0) {
- local->local.category = cat;
- }
- }
-
- /* STOP: don't replace these with g_strdup, since free_ToDo
- uses free to deallocate */
- e_cal_component_get_summary (comp, &summary);
- if (summary.value)
- local->todo->description = e_pilot_utf8_to_pchar (summary.value);
-
- e_cal_component_get_description_list (comp, &d_list);
- if (d_list) {
- description = (ECalComponentText *) d_list->data;
- if (description && description->value)
- local->todo->note = e_pilot_utf8_to_pchar (description->value);
- else
- local->todo->note = NULL;
- } else {
- local->todo->note = NULL;
- }
-
- e_cal_component_get_due (comp, &due);
- if (due.value) {
- icaltimezone_convert_time (due.value,
- get_timezone (ctxt->client, due.tzid),
- default_tz);
- local->todo->due = icaltimetype_to_tm (due.value);
- local->todo->indefinite = 0;
- } else {
- local->todo->indefinite = 1;
- }
- e_cal_component_free_datetime (&due);
-
- e_cal_component_get_status (comp, &status);
- if (status == ICAL_STATUS_COMPLETED)
- local->todo->complete = 1;
- else
- local->todo->complete = 0;
-
- e_cal_component_get_priority (comp, &priority);
- if (priority && *priority != 0) {
- if (*priority <= 3)
- local->todo->priority = 1;
- else if (*priority == 4)
- local->todo->priority = 2;
- else if (*priority == 5)
- local->todo->priority = 3;
- else if (*priority <= 7)
- local->todo->priority = 4;
- else
- local->todo->priority = 5;
-
- e_cal_component_free_priority (priority);
- } else {
- local->todo->priority = ctxt->cfg->priority;
- }
-
- e_cal_component_get_classification (comp, &classif);
-
- if (classif == E_CAL_COMPONENT_CLASS_PRIVATE)
- local->local.secret = 1;
- else
- local->local.secret = 0;
-
- local->local.archived = 0;
-}
-
-static void
-local_record_from_uid (EToDoLocalRecord *local,
- const char *uid,
- EToDoConduitContext *ctxt)
-{
- ECalComponent *comp;
- icalcomponent *icalcomp;
- GError *error = NULL;
-
- g_assert(local!=NULL);
-
- if (e_cal_get_object (ctxt->client, uid, NULL, &icalcomp, &error)) {
- comp = e_cal_component_new ();
- if (!e_cal_component_set_icalcomponent (comp, icalcomp)) {
- g_object_unref (comp);
- icalcomponent_free (icalcomp);
- return;
- }
-
- local_record_from_comp (local, comp, ctxt);
- g_object_unref (comp);
- } else if (error->code == E_CALENDAR_STATUS_OBJECT_NOT_FOUND) {
- comp = e_cal_component_new ();
- e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_TODO);
- e_cal_component_set_uid (comp, uid);
- local_record_from_comp (local, comp, ctxt);
- g_object_unref (comp);
- } else {
- INFO ("Object did not exist");
- }
-
- g_clear_error (&error);
-}
-
-
-static ECalComponent *
-comp_from_remote_record (GnomePilotConduitSyncAbs *conduit,
- GnomePilotRecord *remote,
- ECalComponent *in_comp,
- icaltimezone *timezone)
-{
- ECalComponent *comp;
- struct ToDo todo;
- ECalComponentText summary = {NULL, NULL};
- ECalComponentDateTime dt = {NULL, icaltimezone_get_tzid (timezone)};
- struct icaltimetype due, now;
- icaltimezone *utc_zone;
- int priority;
- char *txt;
-
- g_return_val_if_fail (remote != NULL, NULL);
-
- memset (&todo, 0, sizeof (struct ToDo));
- unpack_ToDo (&todo, remote->record, remote->length);
-
- utc_zone = icaltimezone_get_utc_timezone ();
- now = icaltime_from_timet_with_zone (time (NULL), FALSE,
- utc_zone);
-
- if (in_comp == NULL) {
- comp = e_cal_component_new ();
- e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_TODO);
- e_cal_component_set_created (comp, &now);
- } else {
- comp = e_cal_component_clone (in_comp);
- }
-
- e_cal_component_set_last_modified (comp, &now);
-
- summary.value = txt = e_pilot_utf8_from_pchar (todo.description);
- e_cal_component_set_summary (comp, &summary);
- free (txt);
-
- /* The iCal description field */
- if (!todo.note) {
- e_cal_component_set_comment_list (comp, NULL);
- } else {
- GSList l;
- ECalComponentText text;
-
- text.value = txt = e_pilot_utf8_from_pchar (todo.note);
- text.altrep = NULL;
- l.data = &text;
- l.next = NULL;
-
- e_cal_component_set_description_list (comp, &l);
- free (txt);
- }
-
- if (todo.complete) {
- int percent = 100;
-
- e_cal_component_set_completed (comp, &now);
- e_cal_component_set_percent (comp, &percent);
- e_cal_component_set_status (comp, ICAL_STATUS_COMPLETED);
- } else {
- int *percent = NULL;
- icalproperty_status status;
-
- e_cal_component_set_completed (comp, NULL);
-
- e_cal_component_get_percent (comp, &percent);
- if (percent == NULL || *percent == 100) {
- int p = 0;
- e_cal_component_set_percent (comp, &p);
- }
- if (percent != NULL)
- e_cal_component_free_percent (percent);
-
- e_cal_component_get_status (comp, &status);
- if (status == ICAL_STATUS_COMPLETED)
- e_cal_component_set_status (comp, ICAL_STATUS_NEEDSACTION);
- }
-
- if (!is_empty_time (todo.due)) {
- due = tm_to_icaltimetype (&todo.due, TRUE);
- dt.value = &due;
- e_cal_component_set_due (comp, &dt);
- }
-
- switch (todo.priority) {
- case 1:
- priority = 3;
- break;
- case 2:
- priority = 4;
- break;
- case 3:
- priority = 5;
- break;
- case 4:
- priority = 7;
- break;
- default:
- priority = 9;
- }
-
- e_cal_component_set_priority (comp, &priority);
- e_cal_component_set_transparency (comp, E_CAL_COMPONENT_TRANSP_NONE);
-
- if (remote->secret)
- e_cal_component_set_classification (comp, E_CAL_COMPONENT_CLASS_PRIVATE);
- else
- e_cal_component_set_classification (comp, E_CAL_COMPONENT_CLASS_PUBLIC);
-
- e_cal_component_commit_sequence (comp);
-
- free_ToDo(&todo);
-
- return comp;
-}
-
-static void
-check_for_slow_setting (GnomePilotConduit *c, EToDoConduitContext *ctxt)
-{
- GnomePilotConduitStandard *conduit = GNOME_PILOT_CONDUIT_STANDARD (c);
- int map_count;
- const char *uri;
-
- /* If there are no objects or objects but no log */
- map_count = g_hash_table_size (ctxt->map->pid_map);
- if (map_count == 0)
- gnome_pilot_conduit_standard_set_slow (conduit, TRUE);
-
- /* Or if the URI's don't match */
- uri = e_cal_get_uri (ctxt->client);
- LOG (g_message ( " Current URI %s (%s)\n", uri, ctxt->cfg->last_uri ? ctxt->cfg->last_uri : "<NONE>" ));
- if (ctxt->cfg->last_uri != NULL && strcmp (ctxt->cfg->last_uri, uri)) {
- gnome_pilot_conduit_standard_set_slow (conduit, TRUE);
- e_pilot_map_clear (ctxt->map);
- }
-
- if (gnome_pilot_conduit_standard_get_slow (conduit)) {
- ctxt->map->write_touched_only = TRUE;
- LOG (g_message ( " doing slow sync\n" ));
- } else {
- LOG (g_message ( " doing fast sync\n" ));
- }
-}
-
-/* Pilot syncing callbacks */
-static gint
-pre_sync (GnomePilotConduit *conduit,
- GnomePilotDBInfo *dbi,
- EToDoConduitContext *ctxt)
-{
- GnomePilotConduitSyncAbs *abs_conduit;
- GList *l;
- int len;
- unsigned char *buf;
- char *filename, *change_id;
- icalcomponent *icalcomp;
- gint num_records, add_records = 0, mod_records = 0, del_records = 0;
-
- abs_conduit = GNOME_PILOT_CONDUIT_SYNC_ABS (conduit);
-
- LOG (g_message ( "---------------------------------------------------------\n" ));
- LOG (g_message ( "pre_sync: ToDo Conduit v.%s", CONDUIT_VERSION ));
- g_message ("ToDo Conduit v.%s", CONDUIT_VERSION);
-
- ctxt->dbi = dbi;
- ctxt->client = NULL;
-
- if (start_calendar_server (ctxt) != 0) {
- WARN(_("Could not start evolution-data-server"));
- gnome_pilot_conduit_error (conduit, _("Could not start evolution-data-server"));
- return -1;
- }
-
- /* Get the timezone */
- ctxt->timezone = get_default_timezone ();
- if (ctxt->timezone == NULL)
- return -1;
- LOG (g_message ( " Using timezone: %s", icaltimezone_get_tzid (ctxt->timezone) ));
-
- /* Set the default timezone on the backend. */
- if (ctxt->timezone && !e_cal_set_default_timezone (ctxt->client, ctxt->timezone, NULL))
- return -1;
-
- /* Get the default component */
- if (!e_cal_get_default_object (ctxt->client, &icalcomp, NULL))
- return -1;
-
- ctxt->default_comp = e_cal_component_new ();
- if (!e_cal_component_set_icalcomponent (ctxt->default_comp, icalcomp)) {
- g_object_unref (ctxt->default_comp);
- icalcomponent_free (icalcomp);
- return -1;
- }
-
- /* Load the uid <--> pilot id map */
- filename = map_name (ctxt);
- e_pilot_map_read (filename, &ctxt->map);
- g_free (filename);
-
- /* Get the local database */
- if (!e_cal_get_object_list_as_comp (ctxt->client, "#t", &ctxt->comps, NULL))
- return -1;
-
- /* Count and hash the changes */
- change_id = g_strdup_printf ("pilot-sync-evolution-todo-%d", ctxt->cfg->pilot_id);
- if (!e_cal_get_changes (ctxt->client, change_id, &ctxt->changed, NULL))
- return -1;
-
- ctxt->changed_hash = g_hash_table_new (g_str_hash, g_str_equal);
- g_free (change_id);
-
- for (l = ctxt->changed; l != NULL; l = l->next) {
- ECalChange *ccc = l->data;
- const char *uid;
-
- e_cal_component_get_uid (ccc->comp, &uid);
- if (!e_pilot_map_uid_is_archived (ctxt->map, uid)) {
-
- g_hash_table_insert (ctxt->changed_hash, g_strdup (uid), ccc);
-
- switch (ccc->type) {
- case E_CAL_CHANGE_ADDED:
- add_records++;
- break;
- case E_CAL_CHANGE_MODIFIED:
- mod_records++;
- break;
- case E_CAL_CHANGE_DELETED:
- del_records++;
- break;
- }
- } else if (ccc->type == E_CAL_CHANGE_DELETED) {
- e_pilot_map_remove_by_uid (ctxt->map, uid);
- }
- }
-
- /* Set the count information */
- num_records = g_list_length (ctxt->comps);
- gnome_pilot_conduit_sync_abs_set_num_local_records(abs_conduit, num_records);
- gnome_pilot_conduit_sync_abs_set_num_new_local_records (abs_conduit, add_records);
- gnome_pilot_conduit_sync_abs_set_num_updated_local_records (abs_conduit, mod_records);
- gnome_pilot_conduit_sync_abs_set_num_deleted_local_records(abs_conduit, del_records);
-
- buf = (unsigned char*)g_malloc (0xffff);
- len = dlp_ReadAppBlock (dbi->pilot_socket, dbi->db_handle, 0,
- (unsigned char *)buf, 0xffff);
-
- if (len < 0) {
- WARN (_("Could not read pilot's ToDo application block"));
- WARN ("dlp_ReadAppBlock(...) = %d", len);
- gnome_pilot_conduit_error (conduit,
- _("Could not read pilot's ToDo application block"));
- return -1;
- }
- unpack_ToDoAppInfo (&(ctxt->ai), buf, len);
- g_free (buf);
-
- check_for_slow_setting (conduit, ctxt);
- if (ctxt->cfg->sync_type == GnomePilotConduitSyncTypeCopyToPilot
- || ctxt->cfg->sync_type == GnomePilotConduitSyncTypeCopyFromPilot)
- ctxt->map->write_touched_only = TRUE;
-
- return 0;
-}
-
-static gint
-post_sync (GnomePilotConduit *conduit,
- GnomePilotDBInfo *dbi,
- EToDoConduitContext *ctxt)
-{
- GList *changed;
- gchar *filename, *change_id;
-
- LOG (g_message ( "post_sync: ToDo Conduit v.%s", CONDUIT_VERSION ));
-
- g_free (ctxt->cfg->last_uri);
- ctxt->cfg->last_uri = g_strdup (e_cal_get_uri (ctxt->client));
- todoconduit_save_configuration (ctxt->cfg);
-
- filename = map_name (ctxt);
- e_pilot_map_write (filename, ctxt->map);
- g_free (filename);
-
- /* FIX ME ugly hack - our changes musn't count, this does introduce
- * a race condition if anyone changes a record elsewhere during sycnc
- */
- change_id = g_strdup_printf ("pilot-sync-evolution-todo-%d", ctxt->cfg->pilot_id);
- if (e_cal_get_changes (ctxt->client, change_id, &changed, NULL))
- e_cal_free_change_list (changed);
- g_free (change_id);
-
- LOG (g_message ( "---------------------------------------------------------\n" ));
-
- return 0;
-}
-
-static gint
-set_pilot_id (GnomePilotConduitSyncAbs *conduit,
- EToDoLocalRecord *local,
- guint32 ID,
- EToDoConduitContext *ctxt)
-{
- const char *uid;
-
- LOG (g_message ( "set_pilot_id: setting to %d\n", ID ));
-
- e_cal_component_get_uid (local->comp, &uid);
- e_pilot_map_insert (ctxt->map, ID, uid, FALSE);
-
- return 0;
-}
-
-static gint
-set_status_cleared (GnomePilotConduitSyncAbs *conduit,
- EToDoLocalRecord *local,
- EToDoConduitContext *ctxt)
-{
- const char *uid;
-
- LOG (g_message ( "set_status_cleared: clearing status\n" ));
-
- e_cal_component_get_uid (local->comp, &uid);
- g_hash_table_remove (ctxt->changed_hash, uid);
-
- return 0;
-}
-
-static gint
-for_each (GnomePilotConduitSyncAbs *conduit,
- EToDoLocalRecord **local,
- EToDoConduitContext *ctxt)
-{
- static GList *comps, *iterator;
- static int count;
-
- g_return_val_if_fail (local != NULL, -1);
-
- if (*local == NULL) {
- LOG (g_message ( "beginning for_each" ));
-
- comps = ctxt->comps;
- count = 0;
-
- if (comps != NULL) {
- LOG (g_message ( "iterating over %d records", g_list_length (comps)));
-
- *local = g_new0 (EToDoLocalRecord, 1);
- local_record_from_comp (*local, comps->data, ctxt);
- g_list_prepend (ctxt->locals, *local);
-
- iterator = comps;
- } else {
- LOG (g_message ( "no events" ));
- (*local) = NULL;
- return 0;
- }
- } else {
- count++;
- if (g_list_next (iterator)) {
- iterator = g_list_next (iterator);
-
- *local = g_new0 (EToDoLocalRecord, 1);
- local_record_from_comp (*local, iterator->data, ctxt);
- g_list_prepend (ctxt->locals, *local);
- } else {
- LOG (g_message ( "for_each ending" ));
-
- /* Tell the pilot the iteration is over */
- *local = NULL;
-
- return 0;
- }
- }
-
- return 0;
-}
-
-static gint
-for_each_modified (GnomePilotConduitSyncAbs *conduit,
- EToDoLocalRecord **local,
- EToDoConduitContext *ctxt)
-{
- static GList *iterator;
- static int count;
-
- g_return_val_if_fail (local != NULL, 0);
-
- if (*local == NULL) {
- LOG (g_message ( "for_each_modified beginning\n" ));
-
- iterator = ctxt->changed;
-
- count = 0;
-
- LOG (g_message ( "iterating over %d records", g_hash_table_size (ctxt->changed_hash) ));
-
- iterator = next_changed_item (ctxt, iterator);
- if (iterator != NULL) {
- ECalChange *ccc = iterator->data;
-
- *local = g_new0 (EToDoLocalRecord, 1);
- local_record_from_comp (*local, ccc->comp, ctxt);
- g_list_prepend (ctxt->locals, *local);
- } else {
- LOG (g_message ( "no events" ));
-
- *local = NULL;
- }
- } else {
- count++;
- iterator = g_list_next (iterator);
- if (iterator && (iterator = next_changed_item (ctxt, iterator))) {
- ECalChange *ccc = iterator->data;
-
- *local = g_new0 (EToDoLocalRecord, 1);
- local_record_from_comp (*local, ccc->comp, ctxt);
- g_list_prepend (ctxt->locals, *local);
- } else {
- LOG (g_message ( "for_each_modified ending" ));
-
- /* Signal the iteration is over */
- *local = NULL;
- }
- }
-
- return 0;
-}
-
-static gint
-compare (GnomePilotConduitSyncAbs *conduit,
- EToDoLocalRecord *local,
- GnomePilotRecord *remote,
- EToDoConduitContext *ctxt)
-{
- /* used by the quick compare */
- GnomePilotRecord local_pilot;
- int retval = 0;
-
- LOG (g_message ("compare: local=%s remote=%s...\n",
- print_local (local), print_remote (remote)));
-
- g_return_val_if_fail (local!=NULL,-1);
- g_return_val_if_fail (remote!=NULL,-1);
-
- local_pilot = local_record_to_pilot_record (local, ctxt);
-
- if (remote->length != local_pilot.length
- || memcmp (local_pilot.record, remote->record, remote->length))
- retval = 1;
-
- if (retval == 0)
- LOG (g_message ( " equal" ));
- else
- LOG (g_message ( " not equal" ));
-
- return retval;
-}
-
-static gint
-add_record (GnomePilotConduitSyncAbs *conduit,
- GnomePilotRecord *remote,
- EToDoConduitContext *ctxt)
-{
- ECalComponent *comp;
- char *uid;
- int retval = 0;
-
- g_return_val_if_fail (remote != NULL, -1);
-
- LOG (g_message ( "add_record: adding %s to desktop\n", print_remote (remote) ));
-
- comp = comp_from_remote_record (conduit, remote, ctxt->default_comp, ctxt->timezone);
-
- /* Give it a new UID otherwise it will be the uid of the default comp */
- uid = e_cal_component_gen_uid ();
- e_cal_component_set_uid (comp, uid);
-
- if (!e_cal_create_object (ctxt->client, e_cal_component_get_icalcomponent (comp), NULL, NULL))
- return -1;
-
- e_pilot_map_insert (ctxt->map, remote->ID, uid, FALSE);
-
- g_object_unref (comp);
-
- return retval;
-}
-
-static gint
-replace_record (GnomePilotConduitSyncAbs *conduit,
- EToDoLocalRecord *local,
- GnomePilotRecord *remote,
- EToDoConduitContext *ctxt)
-{
- ECalComponent *new_comp;
- int retval = 0;
-
- g_return_val_if_fail (remote != NULL, -1);
-
- LOG (g_message ("replace_record: replace %s with %s\n",
- print_local (local), print_remote (remote)));
-
- new_comp = comp_from_remote_record (conduit, remote, local->comp, ctxt->timezone);
- g_object_unref (local->comp);
- local->comp = new_comp;
-
- if (!e_cal_modify_object (ctxt->client, e_cal_component_get_icalcomponent (new_comp),
- CALOBJ_MOD_ALL, NULL))
- return -1;
-
- return retval;
-}
-
-static gint
-delete_record (GnomePilotConduitSyncAbs *conduit,
- EToDoLocalRecord *local,
- EToDoConduitContext *ctxt)
-{
- const char *uid;
-
- g_return_val_if_fail (local != NULL, -1);
- g_return_val_if_fail (local->comp != NULL, -1);
-
- e_cal_component_get_uid (local->comp, &uid);
-
- LOG (g_message ( "delete_record: deleting %s\n", uid ));
-
- e_pilot_map_remove_by_uid (ctxt->map, uid);
- /* FIXME Error handling */
- e_cal_remove_object (ctxt->client, uid, NULL);
-
- return 0;
-}
-
-static gint
-archive_record (GnomePilotConduitSyncAbs *conduit,
- EToDoLocalRecord *local,
- gboolean archive,
- EToDoConduitContext *ctxt)
-{
- const char *uid;
- int retval = 0;
-
- g_return_val_if_fail (local != NULL, -1);
-
- LOG (g_message ( "archive_record: %s\n", archive ? "yes" : "no" ));
-
- e_cal_component_get_uid (local->comp, &uid);
- e_pilot_map_insert (ctxt->map, local->local.ID, uid, archive);
-
- return retval;
-}
-
-static gint
-match (GnomePilotConduitSyncAbs *conduit,
- GnomePilotRecord *remote,
- EToDoLocalRecord **local,
- EToDoConduitContext *ctxt)
-{
- const char *uid;
-
- LOG (g_message ("match: looking for local copy of %s\n",
- print_remote (remote)));
-
- g_return_val_if_fail (local != NULL, -1);
- g_return_val_if_fail (remote != NULL, -1);
-
- *local = NULL;
- uid = e_pilot_map_lookup_uid (ctxt->map, remote->ID, TRUE);
-
- if (!uid)
- return 0;
-
- LOG (g_message ( " matched\n" ));
-
- *local = g_new0 (EToDoLocalRecord, 1);
- local_record_from_uid (*local, uid, ctxt);
-
- return 0;
-}
-
-static gint
-free_match (GnomePilotConduitSyncAbs *conduit,
- EToDoLocalRecord *local,
- EToDoConduitContext *ctxt)
-{
- LOG (g_message ( "free_match: freeing\n" ));
-
- g_return_val_if_fail (local != NULL, -1);
-
- todoconduit_destroy_record (local);
-
- return 0;
-}
-
-static gint
-prepare (GnomePilotConduitSyncAbs *conduit,
- EToDoLocalRecord *local,
- GnomePilotRecord *remote,
- EToDoConduitContext *ctxt)
-{
- LOG (g_message ( "prepare: encoding local %s\n", print_local (local) ));
-
- *remote = local_record_to_pilot_record (local, ctxt);
-
- return 0;
-}
-
-/* Pilot Settings Callbacks */
-static void
-fill_widgets (EToDoConduitContext *ctxt)
-{
- if (ctxt->cfg->source)
- e_pilot_settings_set_source (E_PILOT_SETTINGS (ctxt->ps),
- ctxt->cfg->source);
- e_pilot_settings_set_secret (E_PILOT_SETTINGS (ctxt->ps),
- ctxt->cfg->secret);
-
- e_todo_gui_fill_widgets (ctxt->gui, ctxt->cfg);
-}
-
-static gint
-create_settings_window (GnomePilotConduit *conduit,
- GtkWidget *parent,
- EToDoConduitContext *ctxt)
-{
- LOG (g_message ( "create_settings_window" ));
-
- if (!ctxt->cfg->source_list)
- return -1;
-
- ctxt->ps = e_pilot_settings_new (ctxt->cfg->source_list);
- ctxt->gui = e_todo_gui_new (E_PILOT_SETTINGS (ctxt->ps));
-
- gtk_container_add (GTK_CONTAINER (parent), ctxt->ps);
- gtk_widget_show (ctxt->ps);
-
- fill_widgets (ctxt);
-
- return 0;
-}
-
-static void
-display_settings (GnomePilotConduit *conduit, EToDoConduitContext *ctxt)
-{
- LOG (g_message ( "display_settings" ));
-
- fill_widgets (ctxt);
-}
-
-static void
-save_settings (GnomePilotConduit *conduit, EToDoConduitContext *ctxt)
-{
- LOG (g_message ( "save_settings" ));
-
- if (ctxt->new_cfg->source)
- g_object_unref (ctxt->new_cfg->source);
- ctxt->new_cfg->source = e_pilot_settings_get_source (E_PILOT_SETTINGS (ctxt->ps));
- g_object_ref (ctxt->new_cfg->source);
- ctxt->new_cfg->secret = e_pilot_settings_get_secret (E_PILOT_SETTINGS (ctxt->ps));
- e_todo_gui_fill_config (ctxt->gui, ctxt->new_cfg);
-
- todoconduit_save_configuration (ctxt->new_cfg);
-}
-
-static void
-revert_settings (GnomePilotConduit *conduit, EToDoConduitContext *ctxt)
-{
- LOG (g_message ( "revert_settings" ));
-
- todoconduit_save_configuration (ctxt->cfg);
- todoconduit_destroy_configuration (ctxt->new_cfg);
- ctxt->new_cfg = todoconduit_dupe_configuration (ctxt->cfg);
-}
-
-GnomePilotConduit *
-conduit_get_gpilot_conduit (guint32 pilot_id)
-{
- GtkObject *retval;
- EToDoConduitContext *ctxt;
-
- LOG (g_message ( "in todo's conduit_get_gpilot_conduit\n" ));
-
- retval = gnome_pilot_conduit_sync_abs_new ("ToDoDB", 0x746F646F);
- g_assert (retval != NULL);
-
- ctxt = e_todo_context_new (pilot_id);
- gtk_object_set_data (GTK_OBJECT (retval), "todoconduit_context", ctxt);
-
- gtk_signal_connect (retval, "pre_sync", (GtkSignalFunc) pre_sync, ctxt);
- gtk_signal_connect (retval, "post_sync", (GtkSignalFunc) post_sync, ctxt);
-
- gtk_signal_connect (retval, "set_pilot_id", (GtkSignalFunc) set_pilot_id, ctxt);
- gtk_signal_connect (retval, "set_status_cleared", (GtkSignalFunc) set_status_cleared, ctxt);
-
- gtk_signal_connect (retval, "for_each", (GtkSignalFunc) for_each, ctxt);
- gtk_signal_connect (retval, "for_each_modified", (GtkSignalFunc) for_each_modified, ctxt);
- gtk_signal_connect (retval, "compare", (GtkSignalFunc) compare, ctxt);
-
- gtk_signal_connect (retval, "add_record", (GtkSignalFunc) add_record, ctxt);
- gtk_signal_connect (retval, "replace_record", (GtkSignalFunc) replace_record, ctxt);
- gtk_signal_connect (retval, "delete_record", (GtkSignalFunc) delete_record, ctxt);
- gtk_signal_connect (retval, "archive_record", (GtkSignalFunc) archive_record, ctxt);
-
- gtk_signal_connect (retval, "match", (GtkSignalFunc) match, ctxt);
- gtk_signal_connect (retval, "free_match", (GtkSignalFunc) free_match, ctxt);
-
- gtk_signal_connect (retval, "prepare", (GtkSignalFunc) prepare, ctxt);
-
- /* Gui Settings */
- gtk_signal_connect (retval, "create_settings_window", (GtkSignalFunc) create_settings_window, ctxt);
- gtk_signal_connect (retval, "display_settings", (GtkSignalFunc) display_settings, ctxt);
- gtk_signal_connect (retval, "save_settings", (GtkSignalFunc) save_settings, ctxt);
- gtk_signal_connect (retval, "revert_settings", (GtkSignalFunc) revert_settings, ctxt);
-
- return GNOME_PILOT_CONDUIT (retval);
-}
-
-void
-conduit_destroy_gpilot_conduit (GnomePilotConduit *conduit)
-{
- GtkObject *obj = GTK_OBJECT (conduit);
- EToDoConduitContext *ctxt;
-
- ctxt = gtk_object_get_data (obj, "todoconduit_context");
- e_todo_context_destroy (ctxt);
-
- gtk_object_destroy (obj);
-}
diff --git a/calendar/gui/.cvsignore b/calendar/gui/.cvsignore
deleted file mode 100644
index 328884758a..0000000000
--- a/calendar/gui/.cvsignore
+++ /dev/null
@@ -1,28 +0,0 @@
-Makefile.in
-Makefile
-.deps
-_libs
-.libs
-.pure
-apps_evolution_calendar-1.5.schemas
-apps_evolution_calendar-1.5.schemas.in
-apps_evolution_calendar-2.2.schemas
-evolution-calendar
-evolution-calendar.pure
-evolution-calendar.h
-evolution-calendar-common.c
-evolution-calendar-skels.c
-evolution-calendar-stubs.c
-e-calendar-marshal.h
-e-calendar-marshal.c
-*.lo
-Evolution-Addressbook-SelectNames-common.c
-Evolution-Addressbook-SelectNames-skels.c
-Evolution-Addressbook-SelectNames-stubs.c
-Evolution-Addressbook-SelectNames.h
-Evolution-Composer-common.c
-Evolution-Composer-skels.c
-Evolution-Composer-stubs.c
-Evolution-Composer.h
-GNOME_Evolution_Calendar*.server
-GNOME_Evolution_Calendar*.server.in
diff --git a/calendar/gui/GNOME_Evolution_Calendar.server.in.in b/calendar/gui/GNOME_Evolution_Calendar.server.in.in
deleted file mode 100644
index 21690f8f71..0000000000
--- a/calendar/gui/GNOME_Evolution_Calendar.server.in.in
+++ /dev/null
@@ -1,114 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Calendar_Factory:@VERSION@"
- type="shlib"
- location="@COMPONENTDIR@/libevolution-calendar.so">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/ObjectFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution Calendar and Tasks"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Calendar_iTip_Control:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Calendar_Factory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Bonobo/Control:1.0"/>
- <item value="IDL:Bonobo/PersistStream:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="bonobo:supported_mime_types" type="stringv">
- <item value="text/calendar"/>
- <item value="text/x-calendar"/>
- </oaf_attribute>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution Calendar scheduling message viewer"/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Calendar_Component:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Calendar_Factory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution/Component:@VERSION@"/>
- </oaf_attribute>
-
- <oaf_attribute name="evolution:component_alias" type="string" value="calendar"/>
-
- <oaf_attribute name="name" type="string" _value="Evolution's Calendar component"/>
-
- <oaf_attribute name="evolution:menu_label" type="string" _value="_Calendars"/>
- <oaf_attribute name="evolution:menu_accelerator" type="string" value="*Control*F3"/>
- <oaf_attribute name="evolution:button_label" type="string" _value="Calendars"/>
- <oaf_attribute name="evolution:button_icon" type="string" value="stock_calendar"/>
- <oaf_attribute name="evolution:button_sort_order" type="string" value="-8"/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Tasks_Component:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Calendar_Factory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution/Component:@VERSION@"/>
- </oaf_attribute>
-
- <oaf_attribute name="evolution:component_alias" type="string" value="tasks"/>
-
- <oaf_attribute name="name" type="string" _value="Evolution's Tasks component"/>
-
- <oaf_attribute name="evolution:menu_label" type="string" _value="_Tasks"/>
- <oaf_attribute name="evolution:menu_accelerator" type="string" value="*Control*F4"/>
- <oaf_attribute name="evolution:button_label" type="string" _value="Tasks"/>
- <oaf_attribute name="evolution:button_icon" type="string" value="stock_todo"/>
- <oaf_attribute name="evolution:button_sort_order" type="string" value="-8"/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Calendar_CompEditorFactory:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Calendar_Factory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution/Calendar/CompEditorFactory:@VERSION@"/>
- <item value="IDL:Bonobo/Unknown:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution Calendar/Task editor"/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Calendar_ConfigControl:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Calendar_Factory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution/ConfigControl:@VERSION@"/>
- </oaf_attribute>
-
- <oaf_attribute name="evolution2:config_item:title" type="string"
- _value="Calendar and Tasks"/>
-
- <oaf_attribute name="evolution2:config_item:description" type="string"
- _value="Configure your timezone, Calendar and Task List here "/>
-
- <oaf_attribute name="evolution2:config_item:icon_name" type="string"
- value="stock_calendar-and-tasks"/>
-
- <oaf_attribute name="evolution2:config_item:type" type="stringv">
- <item value="calendar"/>
- <item value="tasks"/>
- </oaf_attribute>
-
- <oaf_attribute name="evolution2:config_item:priority" type="string" value="-7"/>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution Calendar configuration control"/>
-
-</oaf_server>
-
-</oaf_info>
diff --git a/calendar/gui/Makefile.am b/calendar/gui/Makefile.am
deleted file mode 100644
index f1463147ba..0000000000
--- a/calendar/gui/Makefile.am
+++ /dev/null
@@ -1,263 +0,0 @@
-## CORBA stuff
-
-IDLS = \
- $(top_srcdir)/composer/Evolution-Composer.idl \
- $(top_srcdir)/calendar/idl/evolution-calendar.idl
-
-CALENDAR_IDL_GENERATED_H = \
- evolution-calendar.h
-CALENDAR_IDL_GENERATED_C = \
- evolution-calendar-common.c \
- evolution-calendar-skels.c \
- evolution-calendar-stubs.c
-CALENDAR_IDL_GENERATED = $(CALENDAR_IDL_GENERATED_C) $(CALENDAR_IDL_GENERATED_H)
-
-$(CALENDAR_IDL_GENERATED_H): $(IDLS)
- $(ORBIT_IDL) -I $(srcdir) $(IDL_INCLUDES) \
- $(top_srcdir)/calendar/idl/evolution-calendar.idl
-$(CALENDAR_IDL_GENERATED_C): $(CALENDAR_IDL_GENERATED_H)
-
-# Message composer IDL files
-
-COMPOSER_IDL_GENERATED_H = \
- Evolution-Composer.h
-COMPOSER_IDL_GENERATED_C = \
- Evolution-Composer-common.c \
- Evolution-Composer-skels.c \
- Evolution-Composer-stubs.c
-COMPOSER_IDL_GENERATED = $(COMPOSER_IDL_GENERATED_C) $(COMPOSER_IDL_GENERATED_H)
-
-$(COMPOSER_IDL_GENERATED_H): $(IDLS)
- $(ORBIT_IDL) -I $(srcdir) $(IDL_INCLUDES) \
- $(srcdir)/../../composer/Evolution-Composer.idl
-$(COMPOSER_IDL_GENERATED_C): $(COMPOSER_IDL_GENERATED_H)
-
-IDL_GENERATED = $(CALENDAR_IDL_GENERATED) $(COMPOSER_IDL_GENERATED)
-
-# The marshallers
-MARSHAL_GENERATED = e-calendar-marshal.c e-calendar-marshal.h
-@EVO_MARSHAL_RULE@
-
-SUBDIRS = alarm-notify dialogs
-
-component_LTLIBRARIES = libevolution-calendar.la
-
-ecalendarincludedir = $(privincludedir)/calendar/gui
-
-ecalendarinclude_HEADERS = \
- e-cal-config.h
-
-INCLUDES = \
- -DG_LOG_DOMAIN=\"calendar-gui\" \
- -I$(top_builddir)/shell \
- -I$(top_srcdir)/shell \
- -I$(top_srcdir) \
- -I$(top_srcdir)/calendar \
- -I$(top_srcdir)/widgets \
- -I$(top_srcdir)/widgets/misc \
- -I$(top_srcdir)/a11y/calendar \
- -DEVOLUTION_DATADIR=\""$(datadir)"\" \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_ETSPECDIR=\""$(etspecdir)"\" \
- -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \
- -DEVOLUTION_GALVIEWSDIR=\""$(viewsdir)"\" \
- -DEVOLUTION_UIDIR=\""$(evolutionuidir)"\" \
- -DPREFIX=\""$(prefix)"\" \
- $(LIBSOUP_CFLAGS) \
- $(EVOLUTION_CALENDAR_CFLAGS)
-
-glade_DATA = \
- e-itip-control.glade \
- goto-dialog.glade
-
-etspec_DATA = \
- e-calendar-table.etspec \
- e-meeting-time-sel.etspec \
- e-cal-list-view.etspec
-
-libevolution_calendar_la_SOURCES = \
- $(IDL_GENERATED) \
- $(MARSHAL_GENERATED) \
- cal-search-bar.c \
- cal-search-bar.h \
- calendar-config.c \
- calendar-config.h \
- calendar-config-keys.h \
- calendar-commands.c \
- calendar-commands.h \
- calendar-component.c \
- calendar-component.h \
- calendar-offline-handler.c \
- calendar-offline-handler.h \
- calendar-view.c \
- calendar-view.h \
- calendar-view-factory.c \
- calendar-view-factory.h \
- comp-editor-factory.c \
- comp-editor-factory.h \
- comp-util.c \
- comp-util.h \
- control-factory.c \
- control-factory.h \
- e-alarm-list.c \
- e-alarm-list.h \
- e-cal-component-preview.c \
- e-cal-component-preview.h \
- e-cal-config.c \
- e-cal-config.h \
- e-cal-event.c \
- e-cal-event.h \
- e-cal-menu.c \
- e-cal-menu.h \
- e-cal-model-calendar.h \
- e-cal-model-calendar.c \
- e-cal-model-calendar.h \
- e-cal-model-tasks.c \
- e-cal-model-tasks.h \
- e-cal-model.c \
- e-cal-model.h \
- e-cal-popup.h \
- e-cal-popup.c \
- e-calendar-view.c \
- e-calendar-view.h \
- e-cal-list-view.c \
- e-cal-list-view.h \
- e-cal-list-view-config.c \
- e-cal-list-view-config.h \
- e-calendar-table.c \
- e-calendar-table.h \
- e-calendar-table-config.c \
- e-calendar-table-config.h \
- e-cell-date-edit-config.c \
- e-cell-date-edit-config.h \
- e-cell-date-edit-text.h \
- e-cell-date-edit-text.c \
- e-comp-editor-registry.c \
- e-comp-editor-registry.h \
- e-date-edit-config.c \
- e-date-edit-config.h \
- e-date-time-list.c \
- e-date-time-list.h \
- e-day-view-config.c \
- e-day-view-config.h \
- e-day-view-layout.c \
- e-day-view-layout.h \
- e-day-view-main-item.c \
- e-day-view-main-item.h \
- e-day-view-time-item.c \
- e-day-view-time-item.h \
- e-day-view-top-item.c \
- e-day-view-top-item.h \
- e-day-view.c \
- e-day-view.h \
- e-itip-control.h \
- e-itip-control.c \
- e-meeting-attendee.c \
- e-meeting-attendee.h \
- e-meeting-list-view.c \
- e-meeting-list-view.h \
- e-meeting-store.c \
- e-meeting-store.h \
- e-meeting-time-sel.c \
- e-meeting-time-sel.h \
- e-meeting-time-sel-item.c \
- e-meeting-time-sel-item.h \
- e-meeting-types.h \
- e-meeting-utils.c \
- e-meeting-utils.h \
- e-mini-calendar-config.c \
- e-mini-calendar-config.h \
- e-pub-utils.c \
- e-pub-utils.h \
- e-select-names-editable.c \
- e-select-names-editable.h \
- e-select-names-renderer.c \
- e-select-names-renderer.h \
- e-week-view-config.c \
- e-week-view-config.h \
- e-week-view-event-item.c \
- e-week-view-event-item.h \
- e-week-view-layout.c \
- e-week-view-layout.h \
- e-week-view-main-item.c \
- e-week-view-main-item.h \
- e-week-view-titles-item.c \
- e-week-view-titles-item.h \
- e-week-view.c \
- e-week-view.h \
- e-tasks.c \
- e-tasks.h \
- e-timezone-entry.c \
- e-timezone-entry.h \
- gnome-cal.c \
- gnome-cal.h \
- goto.c \
- goto.h \
- itip-bonobo-control.c \
- itip-bonobo-control.h \
- itip-utils.c \
- itip-utils.h \
- main.c \
- migration.c \
- migration.h \
- misc.c \
- misc.h \
- print.c \
- print.h \
- tag-calendar.c \
- tag-calendar.h \
- tasks-component.c \
- tasks-component.h \
- tasks-control.c \
- tasks-control.h \
- weekday-picker.c \
- weekday-picker.h
-
-libevolution_calendar_la_LIBADD = \
- $(top_builddir)/widgets/menus/libmenus.la \
- $(top_builddir)/shell/libeshell.la \
- $(top_builddir)/calendar/common/libevolution-calendarprivate.la \
- $(top_builddir)/calendar/gui/dialogs/libcal-dialogs.la \
- $(top_builddir)/widgets/e-timezone-dialog/libetimezonedialog.la \
- $(top_builddir)/widgets/misc/libemiscwidgets.la \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/a11y/calendar/libevolution-calendar-a11y.la \
- $(LIBSOUP_LIBS) \
- $(EVOLUTION_CALENDAR_LIBS)
-
-libevolution_calendar_la_LDFLAGS = -avoid-version -module
-
-server_in_files = GNOME_Evolution_Calendar.server.in.in
-server_DATA = $(server_in_files:.server.in.in=_$(BASE_VERSION).server)
-@EVO_SERVER_RULE@
-@INTLTOOL_SERVER_RULE@
-
-# GConf schemas
-
-schemadir = $(GCONF_SCHEMA_FILE_DIR)
-schema_in_files = apps_evolution_calendar.schemas.in.in
-schema_DATA = $(schema_in_files:.schemas.in.in=-$(BASE_VERSION).schemas)
-%-$(BASE_VERSION).schemas.in: %.schemas.in.in
- cp $< $@
-
-@INTLTOOL_SCHEMAS_RULE@
-
-EXTRA_DIST = \
- e-calendar-marshal.list \
- $(glade_DATA) \
- $(schema_in_files) \
- $(etspec_DATA) \
- $(server_in_files)
-
-BUILT_SOURCES = $(IDL_GENERATED) $(server_DATA)
-CLEANFILES = $(BUILT_SOURCES)
-
-install-data-local:
- if test -z "$(DESTDIR)"; then \
- for p in $(schema_DATA); do \
- GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $$p; \
- done; \
- fi
-
-dist-hook:
- cd $(distdir); rm -f $(BUILT_SOURCES)
diff --git a/calendar/gui/alarm-notify/.cvsignore b/calendar/gui/alarm-notify/.cvsignore
deleted file mode 100644
index d940a07146..0000000000
--- a/calendar/gui/alarm-notify/.cvsignore
+++ /dev/null
@@ -1,12 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-evolution-calendar-stubs.c
-evolution-calendar-skels.c
-evolution-calendar-common.c
-evolution-calendar.h
-evolution-alarm-notify
-GNOME_Evolution_Calendar_AlarmNotify*.server
-GNOME_Evolution_Calendar_AlarmNotify*.server.in
diff --git a/calendar/gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.server.in.in b/calendar/gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.server.in.in
deleted file mode 100644
index 91007dece2..0000000000
--- a/calendar/gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.server.in.in
+++ /dev/null
@@ -1,27 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Calendar_AlarmNotify_Factory:@VERSION@"
- type="exe"
- location="@LIBEXECDIR@/evolution-alarm-notify">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/ObjectFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution Calendar alarm notification service"/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Calendar_AlarmNotify:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Calendar_AlarmNotify_Factory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:Bonobo/Unknown:1.0"/>
- <item value="IDL:GNOME/Evolution/Calendar/AlarmNotify:@VERSION@"/>
- </oaf_attribute>
-
- <oaf_attribute name="name" type="string" _value="Evolution Calendar alarm notification service"/>
-</oaf_server>
-
-</oaf_info>
diff --git a/calendar/gui/alarm-notify/Makefile.am b/calendar/gui/alarm-notify/Makefile.am
deleted file mode 100644
index ffe95557ec..0000000000
--- a/calendar/gui/alarm-notify/Makefile.am
+++ /dev/null
@@ -1,68 +0,0 @@
-CORBA_GENERATED_H = \
- evolution-calendar.h
-CORBA_GENERATED_C = \
- evolution-calendar-common.c \
- evolution-calendar-skels.c \
- evolution-calendar-stubs.c
-CORBA_GENERATED = $(CORBA_GENERATED_C) $(CORBA_GENERATED_H)
-
-idls = $(top_srcdir)/calendar/idl/evolution-calendar.idl
-idl_flags = $(IDL_INCLUDES)
-
-$(CORBA_GENERATED_H): $(idls)
- $(ORBIT_IDL) $(idl_flags) $(top_srcdir)/calendar/idl/evolution-calendar.idl
-$(CORBA_GENERATED_C): $(CORBA_GENERATED_H)
-
-
-privlibexec_PROGRAMS = evolution-alarm-notify
-
-
-INCLUDES = \
- -DG_LOG_DOMAIN=\"evolution-alarm-notify\" \
- -I$(top_srcdir) \
- -I$(top_srcdir)/widgets \
- -I$(top_srcdir)/calendar \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \
- -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \
- -DEVOLUTION_LIBEXECDIR=\""$(privlibexecdir)"\" \
- $(EVOLUTION_CALENDAR_CFLAGS)
-
-glade_DATA = \
- alarm-notify.glade
-
-evolution_alarm_notify_SOURCES = \
- $(CORBA_GENERATED) \
- alarm.c \
- alarm.h \
- alarm-notify.c \
- alarm-notify.h \
- alarm-notify-dialog.c \
- alarm-notify-dialog.h \
- alarm-queue.c \
- alarm-queue.h \
- config-data.c \
- config-data.h \
- notify-main.c \
- util.c \
- util.h
-
-evolution_alarm_notify_LDADD = \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/calendar/common/libevolution-calendarprivate.la \
- $(EVOLUTION_CALENDAR_LIBS)
-
-server_in_files = GNOME_Evolution_Calendar_AlarmNotify.server.in.in
-server_DATA = $(server_in_files:.server.in.in=_$(BASE_VERSION).server)
-@EVO_SERVER_RULE@
-@INTLTOOL_SERVER_RULE@
-
-EXTRA_DIST = \
- $(server_in_files) \
- $(glade_DATA)
-
-BUILT_SOURCES = $(CORBA_GENERATED) $(server_DATA)
-CLEANFILES = $(BUILT_SOURCES)
-
-dist-hook:
- cd $(distdir); rm -f $(BUILT_SOURCES)
diff --git a/calendar/gui/alarm-notify/alarm-notify-dialog.c b/calendar/gui/alarm-notify/alarm-notify-dialog.c
deleted file mode 100644
index 8d60fb7c70..0000000000
--- a/calendar/gui/alarm-notify/alarm-notify-dialog.c
+++ /dev/null
@@ -1,218 +0,0 @@
-/* Evolution calendar - alarm notification dialog
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdio.h>
-#include <string.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtkimage.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkspinbutton.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkscrolledwindow.h>
-#include <gtk/gtkwindow.h>
-#include <libgnome/gnome-i18n.h>
-#if 0
-# include <libgnomeui/gnome-winhints.h>
-#endif
-#include <glade/glade.h>
-#include <e-util/e-time-utils.h>
-#include <libecal/e-cal-time-util.h>
-#include "alarm-notify-dialog.h"
-#include "config-data.h"
-#include "util.h"
-#include <e-util/e-icon-factory.h>
-
-
-/* The useful contents of the alarm notify dialog */
-typedef struct {
- GladeXML *xml;
-
- GtkWidget *dialog;
- GtkWidget *title;
- GtkWidget *snooze_time;
- GtkWidget *minutes_label;
- GtkWidget *description;
- GtkWidget *location;
- GtkWidget *start;
- GtkWidget *end;
-
- AlarmNotifyFunc func;
- gpointer func_data;
-} AlarmNotify;
-
-enum {
- AN_RESPONSE_EDIT = 0,
- AN_RESPONSE_SNOOZE = 1
-};
-
-
-
-static void
-an_update_minutes_label (GtkSpinButton *sb, gpointer data)
-{
- AlarmNotify *an;
- char *new_label;
- int snooze_timeout;
-
- an = (AlarmNotify *) data;
-
- snooze_timeout = gtk_spin_button_get_value_as_int (sb);
- new_label = g_strdup (ngettext ("minute", "minutes", snooze_timeout));
- gtk_label_set_text (GTK_LABEL (an->minutes_label), new_label);
- g_free (new_label);
-}
-
-/**
- * alarm_notify_dialog:
- * @trigger: Trigger time for the alarm.
- * @occur_start: Start of occurrence time for the event.
- * @occur_end: End of occurrence time for the event.
- * @vtype: Type of the component which corresponds to the alarm.
- * @summary: Short summary of the appointment
- * @description: Long description of the appointment
- * @location: Location of the appointment
- * @func: Function to be called when a dialog action is invoked.
- * @func_data: Closure data for @func.
- *
- * Runs the alarm notification dialog. The specified @func will be used to
- * notify the client about result of the actions in the dialog.
- *
- * Return value: a pointer to the dialog structure if successful or NULL if an error occurs.
- **/
-void
-alarm_notify_dialog (time_t trigger, time_t occur_start, time_t occur_end,
- ECalComponentVType vtype, const char *summary,
- const char *description, const char *location,
- AlarmNotifyFunc func, gpointer func_data)
-{
- AlarmNotify *an;
- GtkWidget *image;
- icaltimezone *current_zone;
- char *title;
- char *start, *end;
- char *icon_path;
- GList *icon_list;
- int snooze_timeout;
-
- g_return_if_fail (trigger != -1);
-
- /* Only VEVENTs or VTODOs can have alarms */
- g_return_if_fail (vtype == E_CAL_COMPONENT_EVENT
- || vtype == E_CAL_COMPONENT_TODO);
- g_return_if_fail (summary != NULL);
- g_return_if_fail (description != NULL);
- g_return_if_fail (location != NULL);
- g_return_if_fail (func != NULL);
-
- an = g_new0 (AlarmNotify, 1);
-
- an->func = func;
- an->func_data = func_data;
-
- an->xml = glade_xml_new (EVOLUTION_GLADEDIR "/alarm-notify.glade", NULL, NULL);
- if (!an->xml) {
- g_message ("alarm_notify_dialog(): Could not load the Glade XML file!");
- g_free (an);
- return;
- }
-
- an->dialog = glade_xml_get_widget (an->xml, "alarm-notify");
- an->title = glade_xml_get_widget (an->xml, "title-label");
- an->snooze_time = glade_xml_get_widget (an->xml, "snooze-time");
- an->minutes_label = glade_xml_get_widget (an->xml, "minutes-label");
- an->description = glade_xml_get_widget (an->xml, "description-label");
- an->location = glade_xml_get_widget (an->xml, "location-label");
- an->start = glade_xml_get_widget (an->xml, "start-label");
- an->end = glade_xml_get_widget (an->xml, "end-label");
-
- if (!(an->dialog && an->title && an->snooze_time
- && an->description && an->location && an->start && an->end)) {
- g_message ("alarm_notify_dialog(): Could not find all widgets in Glade file!");
- g_object_unref (an->xml);
- g_free (an);
- return;
- }
-
- gtk_widget_realize (an->dialog);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (an->dialog)->vbox), 0);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (an->dialog)->action_area), 12);
-
- image = glade_xml_get_widget (an->xml, "alarm-image");
- icon_path = e_icon_factory_get_icon_filename ("stock_alarm", E_ICON_SIZE_DIALOG);
- gtk_image_set_from_file (GTK_IMAGE (image), icon_path);
- g_free (icon_path);
-
- /* Title */
-
- gtk_window_set_title (GTK_WINDOW (an->dialog), summary);
-
- /* Set the widget contents */
-
- title = g_strdup_printf ("<big><b>%s</b></big>", summary);
- gtk_label_set_markup (GTK_LABEL (an->title), title);
- g_free (title);
-
- gtk_label_set_text (GTK_LABEL (an->description), description);
- gtk_label_set_text (GTK_LABEL (an->location), location);
-
- /* Stringize the times */
-
- current_zone = config_data_get_timezone ();
-
- start = timet_to_str_with_zone (occur_start, current_zone);
- gtk_label_set_text (GTK_LABEL (an->start), start);
-
- end = timet_to_str_with_zone (occur_end, current_zone);
- gtk_label_set_text (GTK_LABEL (an->end), end);
-
- /* Set callback for updating the snooze "minutes" label */
- g_signal_connect (G_OBJECT (an->snooze_time), "value_changed",
- G_CALLBACK (an_update_minutes_label), an);
- /* Run! */
-
- if (!GTK_WIDGET_REALIZED (an->dialog))
- gtk_widget_realize (an->dialog);
-
- icon_list = e_icon_factory_get_icon_list ("stock_alarm");
- if (icon_list) {
- gtk_window_set_icon_list (GTK_WINDOW (an->dialog), icon_list);
- g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
- g_list_free (icon_list);
- }
-
- switch (gtk_dialog_run (GTK_DIALOG (an->dialog))) {
- case AN_RESPONSE_EDIT:
- (* an->func) (ALARM_NOTIFY_EDIT, -1, an->func_data);
- break;
- case AN_RESPONSE_SNOOZE:
- snooze_timeout = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (an->snooze_time));
- (* an->func) (ALARM_NOTIFY_SNOOZE, snooze_timeout, an->func_data);
- break;
- case GTK_RESPONSE_CLOSE:
- case GTK_RESPONSE_DELETE_EVENT:
- break;
- }
- gtk_widget_destroy (an->dialog);
-
- g_object_unref (an->xml);
- g_free (an);
-}
diff --git a/calendar/gui/alarm-notify/alarm-notify-dialog.h b/calendar/gui/alarm-notify/alarm-notify-dialog.h
deleted file mode 100644
index 91861aaa99..0000000000
--- a/calendar/gui/alarm-notify/alarm-notify-dialog.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Evolution calendar - alarm notification dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef ALARM_NOTIFY_DIALOG_H
-#define ALARM_NOTIFY_DIALOG_H
-
-#include <time.h>
-#include <glib.h>
-#include <libecal/e-cal-component.h>
-
-
-
-typedef enum {
- ALARM_NOTIFY_CLOSE,
- ALARM_NOTIFY_SNOOZE,
- ALARM_NOTIFY_EDIT
-} AlarmNotifyResult;
-
-typedef void (* AlarmNotifyFunc) (AlarmNotifyResult result, int snooze_mins, gpointer data);
-
-void alarm_notify_dialog (time_t trigger, time_t occur_start, time_t occur_end,
- ECalComponentVType vtype, const char *summary,
- const char *description, const char *location,
- AlarmNotifyFunc func, gpointer func_data);
-
-
-#endif
diff --git a/calendar/gui/alarm-notify/alarm-notify.c b/calendar/gui/alarm-notify/alarm-notify.c
deleted file mode 100644
index 3196599362..0000000000
--- a/calendar/gui/alarm-notify/alarm-notify.c
+++ /dev/null
@@ -1,370 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- *
- * Evolution calendar - Alarm notification service object
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <string.h>
-#include <bonobo/bonobo-main.h>
-#include <libedataserver/e-url.h>
-#include <libecal/e-cal.h>
-#include "alarm-notify.h"
-#include "alarm-queue.h"
-#include "config-data.h"
-#include "common/authentication.h"
-#include "e-util/e-passwords.h"
-
-
-/* Private part of the AlarmNotify structure */
-struct _AlarmNotifyPrivate {
- /* Mapping from EUri's to LoadedClient structures */
- /* FIXME do we need per source type uri hashes? or perhaps we
- just need to hash based on source */
- GHashTable *uri_client_hash [E_CAL_SOURCE_TYPE_LAST];
- ESourceList *source_lists [E_CAL_SOURCE_TYPE_LAST];
- GMutex *mutex;
-};
-
-
-
-static void alarm_notify_class_init (AlarmNotifyClass *klass);
-static void alarm_notify_init (AlarmNotify *an, AlarmNotifyClass *klass);
-static void alarm_notify_finalize (GObject *object);
-
-
-static BonoboObjectClass *parent_class;
-
-
-
-BONOBO_TYPE_FUNC_FULL(AlarmNotify, GNOME_Evolution_Calendar_AlarmNotify, BONOBO_TYPE_OBJECT, alarm_notify)
-
- /* Class initialization function for the alarm notify service */
- static void
-alarm_notify_class_init (AlarmNotifyClass *klass)
-{
- GObjectClass *object_class;
-
- object_class = (GObjectClass *) klass;
-
- parent_class = g_type_class_peek_parent (klass);
-
- object_class->finalize = alarm_notify_finalize;
-}
-
-typedef struct {
- AlarmNotify *an;
- ESourceList *source_list;
- GList *removals;
-} ProcessRemovalsData;
-
-static void
-process_removal_in_hash (gpointer key, gpointer value, gpointer data)
-{
- char *uri = key;
- ProcessRemovalsData *prd = data;
- GSList *groups, *sources, *p, *q;
- gboolean found = FALSE;
-
- /* search the list of selected calendars */
- groups = e_source_list_peek_groups (prd->source_list);
- for (p = groups; p != NULL; p = p->next) {
- ESourceGroup *group = E_SOURCE_GROUP (p->data);
-
- sources = e_source_group_peek_sources (group);
- for (q = sources; q != NULL; q = q->next) {
- ESource *source = E_SOURCE (q->data);
- char *source_uri;
-
- source_uri = e_source_get_uri (source);
- if (strcmp (source_uri, uri) == 0)
- found = TRUE;
- g_free (source_uri);
-
- if (found)
- return;
- }
- }
-
- /* not found, so list it for removal */
- prd->removals = g_list_prepend (prd->removals, uri);
-}
-
-static void
-list_changed_cb (ESourceList *source_list, gpointer data)
-{
- AlarmNotify *an = data;
- AlarmNotifyPrivate *priv;
- GSList *groups, *sources, *p, *q;
- ECalSourceType source_type = E_CAL_SOURCE_TYPE_LAST;
- ProcessRemovalsData prd;
- GList *l;
- int i;
-
- priv = an->priv;
-
- /* Figure out the source type */
- for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) {
- if (source_list == priv->source_lists[i]) {
- source_type = i;
- break;
- }
- }
- if (source_type == E_CAL_SOURCE_TYPE_LAST)
- return;
-
- /* process the additions */
- groups = e_source_list_peek_groups (source_list);
- for (p = groups; p != NULL; p = p->next) {
- ESourceGroup *group = E_SOURCE_GROUP (p->data);
-
- sources = e_source_group_peek_sources (group);
- for (q = sources; q != NULL; q = q->next) {
- ESource *source = E_SOURCE (q->data);
- char *uri;
-
- uri = e_source_get_uri (source);
- if (!g_hash_table_lookup (priv->uri_client_hash[source_type], uri)) {
- g_message ("Adding %s", uri);
- alarm_notify_add_calendar (an, source_type, source, FALSE);
- }
- g_free (uri);
- }
- }
-
- /* process the removals */
- prd.an = an;
- prd.source_list = priv->source_lists[source_type];
- prd.removals = NULL;
- g_hash_table_foreach (priv->uri_client_hash[source_type], (GHFunc) process_removal_in_hash, &prd);
-
- for (l = prd.removals; l; l = l->next) {
- g_message ("Removing %s", (char *)l->data);
- alarm_notify_remove_calendar (an, source_type, l->data);
- }
- g_list_free (prd.removals);
-}
-
-static void
-load_calendars (AlarmNotify *an, ECalSourceType source_type)
-{
- AlarmNotifyPrivate *priv;
- ESourceList *source_list;
- GSList *groups, *sources, *p, *q;
-
- priv = an->priv;
-
- if (!e_cal_get_sources (&source_list, source_type, NULL)) {
- g_message (G_STRLOC ": Could not get the list of sources to load");
- priv->source_lists[source_type] = NULL;
-
- return;
- }
-
- groups = e_source_list_peek_groups (source_list);
- for (p = groups; p != NULL; p = p->next) {
- ESourceGroup *group = E_SOURCE_GROUP (p->data);
-
- sources = e_source_group_peek_sources (group);
- for (q = sources; q != NULL; q = q->next) {
- ESource *source = E_SOURCE (q->data);
- char *uri;
-
- uri = e_source_get_uri (source);
- g_message ("Loading %s", uri);
- alarm_notify_add_calendar (an, source_type, source, FALSE);
- g_free (uri);
-
- }
- }
-
- g_signal_connect_object (source_list, "changed", G_CALLBACK (list_changed_cb), an, 0);
- priv->source_lists[source_type] = source_list;
-}
-
-static gboolean
-load_calendars_cb (gpointer data)
-{
- int i;
- AlarmNotify *an = ALARM_NOTIFY (data);
-
- for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) {
- if (an->priv->source_lists[i])
- list_changed_cb (an->priv->source_lists[i], an);
- }
-
- return FALSE;
-
-}
-/* Object initialization function for the alarm notify system */
-static void
-alarm_notify_init (AlarmNotify *an, AlarmNotifyClass *klass)
-{
- AlarmNotifyPrivate *priv;
- int i;
-
- priv = g_new0 (AlarmNotifyPrivate, 1);
- an->priv = priv;
- priv->mutex = g_mutex_new ();
-
- for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++)
- priv->uri_client_hash[i] = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
-
- alarm_queue_init ();
-
- for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++)
- load_calendars (an, i);
- g_timeout_add (60000, (GSourceFunc)load_calendars_cb, an);
-}
-
-static void
-dequeue_client (gpointer key, gpointer value, gpointer user_data)
-{
- ECal *client = value;
-
- alarm_queue_remove_client (client);
-}
-
-/* Finalize handler for the alarm notify system */
-static void
-alarm_notify_finalize (GObject *object)
-{
- AlarmNotify *an;
- AlarmNotifyPrivate *priv;
- int i;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_ALARM_NOTIFY (object));
-
- an = ALARM_NOTIFY (object);
- priv = an->priv;
-
- for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) {
- g_hash_table_foreach (priv->uri_client_hash[i], dequeue_client, NULL);
- g_hash_table_destroy (priv->uri_client_hash[i]);
- }
-
- g_mutex_free (priv->mutex);
- g_free (priv);
-
- if (G_OBJECT_CLASS (parent_class)->finalize)
- (* G_OBJECT_CLASS (parent_class)->finalize) (object);
-}
-
-
-
-/**
- * alarm_notify_new:
- *
- * Creates a new #AlarmNotify object.
- *
- * Return value: A newly-created #AlarmNotify, or NULL if its corresponding
- * CORBA object could not be created.
- **/
-AlarmNotify *
-alarm_notify_new (void)
-{
- AlarmNotify *an;
-
- an = g_object_new (TYPE_ALARM_NOTIFY,
- "poa", bonobo_poa_get_threaded (ORBIT_THREAD_HINT_PER_REQUEST, NULL),
- NULL);
- return an;
-}
-
-static void
-cal_opened_cb (ECal *client, ECalendarStatus status, gpointer user_data)
-{
- AlarmNotifyPrivate *priv;
- AlarmNotify *an = ALARM_NOTIFY (user_data);
-
- priv = an->priv;
-
- if (status == E_CALENDAR_STATUS_OK)
- alarm_queue_add_client (client);
- else {
- g_hash_table_remove (priv->uri_client_hash[e_cal_get_source_type (client)],
- e_cal_get_uri (client));
- }
-}
-
-/**
- * alarm_notify_add_calendar:
- * @an: An alarm notification service.
- * @uri: URI of the calendar to load.
- * @load_afterwards: Whether this calendar should be loaded in the future
- * when the alarm daemon starts up.
- *
- * Tells the alarm notification service to load a calendar and start monitoring
- * its alarms. It can optionally be made to save the URI of this calendar so
- * that it can be loaded in the future when the alarm daemon starts up.
- **/
-void
-alarm_notify_add_calendar (AlarmNotify *an, ECalSourceType source_type, ESource *source, gboolean load_afterwards)
-{
- AlarmNotifyPrivate *priv;
- ECal *client;
- char *str_uri;
- g_return_if_fail (an != NULL);
- g_return_if_fail (IS_ALARM_NOTIFY (an));
-
-
- priv = an->priv;
- str_uri = e_source_get_uri (source);
-
- g_mutex_lock (an->priv->mutex);
- /* See if we already know about this uri */
- if (g_hash_table_lookup (priv->uri_client_hash[source_type], str_uri)) {
- g_mutex_unlock (an->priv->mutex);
- return;
- }
- /* if loading of this requires password and password is not currently availble in e-password
- session skip this source loading. we do not really want to prompt for auth from alarm dameon*/
-
- if ((e_source_get_property (source, "auth") &&
- (!e_passwords_get_password (e_source_get_property(source, "auth-domain"), str_uri)))) {
- g_mutex_unlock (an->priv->mutex);
- return;
- }
- client = auth_new_cal_from_source (source, source_type);
-
- if (client) {
- g_hash_table_insert (priv->uri_client_hash[source_type], g_strdup (str_uri), client);
- g_signal_connect (G_OBJECT (client), "cal_opened", G_CALLBACK (cal_opened_cb), an);
- e_cal_open_async (client, FALSE);
- }
- g_mutex_unlock (an->priv->mutex);
-}
-
-void
-alarm_notify_remove_calendar (AlarmNotify *an, ECalSourceType source_type, const char *str_uri)
-{
- AlarmNotifyPrivate *priv;
- ECal *client;
-
- priv = an->priv;
-
- client = g_hash_table_lookup (priv->uri_client_hash[source_type], str_uri);
- if (client) {
- alarm_queue_remove_client (client);
- g_hash_table_remove (priv->uri_client_hash[source_type], str_uri);
- }
-}
diff --git a/calendar/gui/alarm-notify/alarm-notify.glade b/calendar/gui/alarm-notify/alarm-notify.glade
deleted file mode 100644
index 0302458aa3..0000000000
--- a/calendar/gui/alarm-notify/alarm-notify.glade
+++ /dev/null
@@ -1,543 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkDialog" id="alarm-notify">
- <property name="visible">True</property>
- <property name="title" translatable="yes">Appointment</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="default_width">384</property>
- <property name="default_height">200</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="has_separator">False</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox3">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area3">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="button3">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">0</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment2">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox6">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child>
- <widget class="GtkImage" id="image4">
- <property name="visible">True</property>
- <property name="stock">gtk-properties</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label16">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Edit</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="button4">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">1</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment3">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox7">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child>
- <widget class="GtkImage" id="image5">
- <property name="visible">True</property>
- <property name="stock">gtk-refresh</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label17">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Snooze</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="button5">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-close</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-7</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox2">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkImage" id="alarm-image">
- <property name="visible">True</property>
- <property name="stock">gtk-dialog-info</property>
- <property name="icon_size">6</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="title-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Appointment Title</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox2">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="description-label">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">description of appointment</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">True</property>
- <property name="selectable">True</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table1">
- <property name="visible">True</property>
- <property name="n_rows">4</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label5">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Location:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label6">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Start time:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label7">
- <property name="visible">True</property>
- <property name="label" translatable="yes">End time:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="location-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">location</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="start-label">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">start-time</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">True</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="end-label">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">end-time</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">True</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox5">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkSpinButton" id="snooze-time">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">False</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">5 1 60 1 10 10</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="minutes-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label11">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Snooze _time:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">snooze-time</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/calendar/gui/alarm-notify/alarm-notify.h b/calendar/gui/alarm-notify/alarm-notify.h
deleted file mode 100644
index 4d8b5f194f..0000000000
--- a/calendar/gui/alarm-notify/alarm-notify.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Evolution calendar - Alarm notification service object
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef ALARM_NOTIFY_H
-#define ALARM_NOTIFY_H
-
-#include <bonobo/bonobo-object.h>
-#include "evolution-calendar.h"
-
-
-
-#define TYPE_ALARM_NOTIFY (alarm_notify_get_type ())
-#define ALARM_NOTIFY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_ALARM_NOTIFY, AlarmNotify))
-#define ALARM_NOTIFY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_ALARM_NOTIFY, \
- AlarmNotifyClass))
-#define IS_ALARM_NOTIFY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_ALARM_NOTIFY))
-#define IS_ALARM_NOTIFY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_ALARM_NOTIFY))
-
-typedef struct _AlarmNotify AlarmNotify;
-typedef struct _AlarmNotifyClass AlarmNotifyClass;
-
-typedef struct _AlarmNotifyPrivate AlarmNotifyPrivate;
-
-struct _AlarmNotify {
- BonoboObject object;
-
- /* Private data */
- AlarmNotifyPrivate *priv;
-};
-
-struct _AlarmNotifyClass {
- BonoboObjectClass parent_class;
- POA_GNOME_Evolution_Calendar_AlarmNotify__epv epv;
-};
-
-GType alarm_notify_get_type (void);
-
-AlarmNotify *alarm_notify_new (void);
-
-void alarm_notify_add_calendar (AlarmNotify *an, ECalSourceType source_type, ESource *source, gboolean load_afterwards);
-void alarm_notify_remove_calendar (AlarmNotify *an, ECalSourceType source_type, const char *str_uri);
-
-
-
-
-#endif
diff --git a/calendar/gui/alarm-notify/alarm-queue.c b/calendar/gui/alarm-notify/alarm-queue.c
deleted file mode 100644
index 9e1519d1a6..0000000000
--- a/calendar/gui/alarm-notify/alarm-queue.c
+++ /dev/null
@@ -1,1390 +0,0 @@
-/* Evolution calendar - Alarm queueing engine
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <glib.h>
-#include <bonobo-activation/bonobo-activation.h>
-#include <bonobo/bonobo-object.h>
-#include <bonobo/bonobo-exception.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkbox.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtkeventbox.h>
-#include <gtk/gtkimage.h>
-#include <gtk/gtkimagemenuitem.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkcheckbutton.h>
-#include <gtk/gtkstock.h>
-#include <gtk/gtktooltips.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnome/gnome-exec.h>
-#include <libgnome/gnome-sound.h>
-#include <libgnomeui/gnome-dialog-util.h>
-#include <libgnomeui/gnome-uidefs.h>
-#include <e-util/eggtrayicon.h>
-#include <e-util/e-icon-factory.h>
-#include <libecal/e-cal-time-util.h>
-#include "evolution-calendar.h"
-#include "alarm.h"
-#include "alarm-notify-dialog.h"
-#include "alarm-queue.h"
-#include "config-data.h"
-#include "util.h"
-#include "e-util/e-popup.h"
-
-
-
-/* Whether the queueing system has been initialized */
-static gboolean alarm_queue_inited;
-
-/* When the alarm queue system is inited, this gets set to the last time an
- * alarm notification was issued. This lets us present any notifications that
- * should have happened while the alarm daemon was not running.
- */
-static time_t saved_notification_time;
-
-/* Clients we are monitoring for alarms */
-static GHashTable *client_alarms_hash = NULL;
-
-/* List of tray icons being displayed */
-static GList *tray_icons_list = NULL;
-
-/* Structure that stores a client we are monitoring */
-typedef struct {
- /* Monitored client */
- ECal *client;
-
- /* The live query to the calendar */
- ECalView *query;
-
- /* Hash table of component UID -> CompQueuedAlarms. If an element is
- * present here, then it means its cqa->queued_alarms contains at least
- * one queued alarm. When all the alarms for a component have been
- * dequeued, the CompQueuedAlarms structure is removed from the hash
- * table. Thus a CQA exists <=> it has queued alarms.
- */
- GHashTable *uid_alarms_hash;
-} ClientAlarms;
-
-/* Pair of a ECalComponentAlarms and the mapping from queued alarm IDs to the
- * actual alarm instance structures.
- */
-typedef struct {
- /* The parent client alarms structure */
- ClientAlarms *parent_client;
-
- /* The component's UID */
- char *uid;
-
- /* The actual component and its alarm instances */
- ECalComponentAlarms *alarms;
-
- /* List of QueuedAlarm structures */
- GSList *queued_alarms;
-
- /* Flags */
- gboolean expecting_update;
-} CompQueuedAlarms;
-
-/* Pair of a queued alarm ID and the alarm trigger instance it refers to */
-typedef struct {
- /* Alarm ID from alarm.h */
- gpointer alarm_id;
-
- /* Instance from our parent CompQueuedAlarms->alarms->alarms list */
- ECalComponentAlarmInstance *instance;
-
- /* Whether this is a snoozed queued alarm or a normal one */
- guint snooze : 1;
-} QueuedAlarm;
-
-/* Alarm ID for the midnight refresh function */
-static gpointer midnight_refresh_id = NULL;
-
-static void display_notification (time_t trigger, CompQueuedAlarms *cqa,
- gpointer alarm_id, gboolean use_description);
-static void audio_notification (time_t trigger, CompQueuedAlarms *cqa, gpointer alarm_id);
-static void mail_notification (time_t trigger, CompQueuedAlarms *cqa, gpointer alarm_id);
-static void procedure_notification (time_t trigger, CompQueuedAlarms *cqa, gpointer alarm_id);
-
-static void query_objects_changed_cb (ECal *client, GList *objects, gpointer data);
-static void query_objects_removed_cb (ECal *client, GList *objects, gpointer data);
-
-
-
-/* Alarm queue engine */
-
-static void load_alarms_for_today (ClientAlarms *ca);
-static void midnight_refresh_cb (gpointer alarm_id, time_t trigger, gpointer data);
-
-/* Queues an alarm trigger for midnight so that we can load the next day's worth
- * of alarms.
- */
-static void
-queue_midnight_refresh (void)
-{
- time_t midnight;
- icaltimezone *zone;
-
- g_assert (midnight_refresh_id == NULL);
-
- zone = config_data_get_timezone ();
-
- midnight = time_day_end_with_zone (time (NULL), zone);
-
- midnight_refresh_id = alarm_add (midnight, midnight_refresh_cb, NULL, NULL);
- if (!midnight_refresh_id) {
- g_message ("queue_midnight_refresh(): Could not set up the midnight refresh alarm!");
- /* FIXME: what to do? */
- }
-}
-
-/* Loads a client's alarms; called from g_hash_table_foreach() */
-static void
-add_client_alarms_cb (gpointer key, gpointer value, gpointer data)
-{
- ClientAlarms *ca;
-
- ca = value;
- load_alarms_for_today (ca);
-}
-
-/* Loads the alarms for the new day every midnight */
-static void
-midnight_refresh_cb (gpointer alarm_id, time_t trigger, gpointer data)
-{
- /* Re-load the alarms for all clients */
-
- g_hash_table_foreach (client_alarms_hash, add_client_alarms_cb, NULL);
-
- /* Re-schedule the midnight update */
-
- midnight_refresh_id = NULL;
- queue_midnight_refresh ();
-}
-
-/* Looks up a client in the client alarms hash table */
-static ClientAlarms *
-lookup_client (ECal *client)
-{
- return g_hash_table_lookup (client_alarms_hash, client);
-}
-
-/* Looks up a queued alarm based on its alarm ID */
-static QueuedAlarm *
-lookup_queued_alarm (CompQueuedAlarms *cqa, gpointer alarm_id)
-{
- GSList *l;
- QueuedAlarm *qa;
-
- qa = NULL;
-
- for (l = cqa->queued_alarms; l; l = l->next) {
- qa = l->data;
- if (qa->alarm_id == alarm_id)
- return qa;
- }
-
- /* not found, might have been updated/removed */
- return NULL;
-}
-
-/* Removes an alarm from the list of alarms of a component. If the alarm was
- * the last one listed for the component, it removes the component itself.
- */
-static void
-remove_queued_alarm (CompQueuedAlarms *cqa, gpointer alarm_id,
- gboolean free_object, gboolean remove_alarm)
-{
- QueuedAlarm *qa;
- GSList *l;
-
- qa = NULL;
-
- for (l = cqa->queued_alarms; l; l = l->next) {
- qa = l->data;
- if (qa->alarm_id == alarm_id)
- break;
- }
-
- if (!l)
- return;
-
- cqa->queued_alarms = g_slist_remove_link (cqa->queued_alarms, l);
- g_slist_free_1 (l);
-
- if (remove_alarm) {
- cqa->expecting_update = TRUE;
- e_cal_discard_alarm (cqa->parent_client->client, cqa->alarms->comp,
- qa->instance->auid, NULL);
- cqa->expecting_update = FALSE;
- }
-
- g_free (qa);
-
- /* If this was the last queued alarm for this component, remove the
- * component itself.
- */
-
- if (cqa->queued_alarms != NULL)
- return;
-
- if (free_object) {
- g_hash_table_remove (cqa->parent_client->uid_alarms_hash, cqa->uid);
- g_free (cqa->uid);
- cqa->uid = NULL;
- cqa->parent_client = NULL;
- e_cal_component_alarms_free (cqa->alarms);
- g_free (cqa);
- } else {
- e_cal_component_alarms_free (cqa->alarms);
- cqa->alarms = NULL;
- }
-}
-
-/* Callback used when an alarm triggers */
-static void
-alarm_trigger_cb (gpointer alarm_id, time_t trigger, gpointer data)
-{
- CompQueuedAlarms *cqa;
- ECalComponent *comp;
- QueuedAlarm *qa;
- ECalComponentAlarm *alarm;
- ECalComponentAlarmAction action;
-
- cqa = data;
- comp = cqa->alarms->comp;
-
- config_data_set_last_notification_time (trigger);
- saved_notification_time = trigger;
-
- qa = lookup_queued_alarm (cqa, alarm_id);
- if (!qa)
- return;
-
- /* Decide what to do based on the alarm action. We use the trigger that
- * is passed to us instead of the one from the instance structure
- * because this may be a snoozed alarm instead of an original
- * occurrence.
- */
-
- alarm = e_cal_component_get_alarm (comp, qa->instance->auid);
- g_assert (alarm != NULL);
-
- e_cal_component_alarm_get_action (alarm, &action);
- e_cal_component_alarm_free (alarm);
-
- switch (action) {
- case E_CAL_COMPONENT_ALARM_AUDIO:
- audio_notification (trigger, cqa, alarm_id);
- break;
-
- case E_CAL_COMPONENT_ALARM_DISPLAY:
- display_notification (trigger, cqa, alarm_id, TRUE);
- break;
-
- case E_CAL_COMPONENT_ALARM_EMAIL:
- mail_notification (trigger, cqa, alarm_id);
- break;
-
- case E_CAL_COMPONENT_ALARM_PROCEDURE:
- procedure_notification (trigger, cqa, alarm_id);
- break;
-
- default:
- g_assert_not_reached ();
- break;
- }
-}
-
-/* Adds the alarms in a ECalComponentAlarms structure to the alarms queued for a
- * particular client. Also puts the triggers in the alarm timer queue.
- */
-static void
-add_component_alarms (ClientAlarms *ca, ECalComponentAlarms *alarms)
-{
- const char *uid;
- CompQueuedAlarms *cqa;
- GSList *l;
-
- /* No alarms? */
- if (alarms == NULL || alarms->alarms == NULL) {
- g_message ("No alarms to add");
- if (alarms)
- e_cal_component_alarms_free (alarms);
- return;
- }
-
- cqa = g_new (CompQueuedAlarms, 1);
- cqa->parent_client = ca;
- cqa->alarms = alarms;
- cqa->expecting_update = FALSE;
-
- cqa->queued_alarms = NULL;
-
- for (l = alarms->alarms; l; l = l->next) {
- ECalComponentAlarmInstance *instance;
- gpointer alarm_id;
- QueuedAlarm *qa;
-
- instance = l->data;
-
- g_message ("Adding alarm at %lu (%lu)", instance->trigger, time (NULL));
- alarm_id = alarm_add (instance->trigger, alarm_trigger_cb, cqa, NULL);
- if (!alarm_id) {
- g_message ("add_component_alarms(): Could not schedule a trigger for "
- "%ld, discarding...", (long) instance->trigger);
- continue;
- }
-
- qa = g_new (QueuedAlarm, 1);
- qa->alarm_id = alarm_id;
- qa->instance = instance;
- qa->snooze = FALSE;
-
- cqa->queued_alarms = g_slist_prepend (cqa->queued_alarms, qa);
- }
-
- e_cal_component_get_uid (alarms->comp, &uid);
-
- /* If we failed to add all the alarms, then we should get rid of the cqa */
- if (cqa->queued_alarms == NULL) {
- g_message ("add_component_alarms(): Could not add any of the alarms "
- "for the component `%s'; discarding it...", uid);
-
- e_cal_component_alarms_free (cqa->alarms);
- cqa->alarms = NULL;
-
- g_free (cqa);
- return;
- }
-
- cqa->queued_alarms = g_slist_reverse (cqa->queued_alarms);
- cqa->uid = g_strdup (uid);
- g_hash_table_insert (ca->uid_alarms_hash, cqa->uid, cqa);
-}
-
-/* Loads the alarms of a client for a given range of time */
-static void
-load_alarms (ClientAlarms *ca, time_t start, time_t end)
-{
- char *str_query, *iso_start, *iso_end;
-
- iso_start = isodate_from_time_t (start);
- if (!iso_start)
- return;
-
- iso_end = isodate_from_time_t (end);
- if (!iso_end) {
- g_free (iso_start);
- return;
- }
-
- str_query = g_strdup_printf ("(has-alarms-in-range? (make-time \"%s\") (make-time \"%s\"))",
- iso_start, iso_end);
- g_free (iso_start);
- g_free (iso_end);
-
- /* create the live query */
- if (ca->query) {
- g_object_unref (ca->query);
- ca->query = NULL;
- }
-
- /* FIXME: handle errors */
- if (!e_cal_get_query (ca->client, str_query, &ca->query, NULL)) {
- g_warning (G_STRLOC ": Could not get query for client");
- } else {
- g_signal_connect (G_OBJECT (ca->query), "objects_added",
- G_CALLBACK (query_objects_changed_cb), ca);
- g_signal_connect (G_OBJECT (ca->query), "objects_modified",
- G_CALLBACK (query_objects_changed_cb), ca);
- g_signal_connect (G_OBJECT (ca->query), "objects_removed",
- G_CALLBACK (query_objects_removed_cb), ca);
-
- e_cal_view_start (ca->query);
- }
-
- g_free (str_query);
-}
-
-/* Loads today's remaining alarms for a client */
-static void
-load_alarms_for_today (ClientAlarms *ca)
-{
- time_t now, from, day_end;
- icaltimezone *zone;
-
- now = time (NULL);
-
- /* Make sure we don't miss some events from the last notification.
- * We add 1 to the saved_notification_time to make the time ranges
- * half-open; we do not want to display the "last" displayed alarm
- * twice, once when it occurs and once when the alarm daemon restarts.
- */
- from = MIN (config_data_get_last_notification_time () + 1, now);
- zone = config_data_get_timezone ();
-
- g_message ("Loading alarms for today");
- day_end = time_day_end_with_zone (now, zone);
- load_alarms (ca, from, day_end);
-}
-
-/* Called when a calendar client finished loading; we load its alarms */
-static void
-cal_opened_cb (ECal *client, ECalendarStatus status, gpointer data)
-{
- ClientAlarms *ca;
-
- ca = data;
-
- if (status != E_CALENDAR_STATUS_OK)
- return;
-
- load_alarms_for_today (ca);
-}
-
-/* Looks up a component's queued alarm structure in a client alarms structure */
-static CompQueuedAlarms *
-lookup_comp_queued_alarms (ClientAlarms *ca, const char *uid)
-{
- return g_hash_table_lookup (ca->uid_alarms_hash, uid);
-}
-
-static void
-remove_alarms (CompQueuedAlarms *cqa, gboolean free_object)
-{
- GSList *l;
-
- for (l = cqa->queued_alarms; l;) {
- QueuedAlarm *qa;
-
- qa = l->data;
-
- /* Get the next element here because the list element will go
- * away in remove_queued_alarm(). The qa will be freed there as
- * well.
- */
- l = l->next;
-
- alarm_remove (qa->alarm_id);
- remove_queued_alarm (cqa, qa->alarm_id, free_object, FALSE);
- }
-
-}
-
-/* Removes a component an its alarms */
-static void
-remove_comp (ClientAlarms *ca, const char *uid)
-{
- CompQueuedAlarms *cqa;
-
- cqa = lookup_comp_queued_alarms (ca, uid);
- if (!cqa)
- return;
-
- /* If a component is present, then it means we must have alarms queued
- * for it.
- */
- g_assert (cqa->queued_alarms != NULL);
-
- remove_alarms (cqa, TRUE);
-
- /* The list should be empty now, and thus the queued component alarms
- * structure should have been freed and removed from the hash table.
- */
- g_assert (lookup_comp_queued_alarms (ca, uid) == NULL);
-}
-
-/* Called when a calendar component changes; we must reload its corresponding
- * alarms.
- */
-static void
-query_objects_changed_cb (ECal *client, GList *objects, gpointer data)
-{
- ClientAlarms *ca;
- time_t from, day_end;
- ECalComponentAlarms *alarms;
- gboolean found;
- icaltimezone *zone;
- CompQueuedAlarms *cqa;
- GList *l;
-
- ca = data;
-
- from = config_data_get_last_notification_time ();
- if (from == -1)
- from = time (NULL);
- else
- from += 1; /* we add 1 to make sure the alarm is not displayed twice */
-
- zone = config_data_get_timezone ();
-
- day_end = time_day_end_with_zone (time (NULL), zone);
- g_message ("Query response for alarms");
- for (l = objects; l != NULL; l = l->next) {
- const char *uid;
- GSList *sl;
-
- uid = icalcomponent_get_uid (l->data);
- found = e_cal_get_alarms_for_object (ca->client, uid, from, day_end, &alarms);
-
- if (!found) {
- g_message ("No alarms found on object");
- remove_comp (ca, uid);
- continue;
- }
-
- cqa = lookup_comp_queued_alarms (ca, uid);
- if (!cqa) {
- g_message ("No currently queue alarms");
- add_component_alarms (ca, alarms);
- continue;
- }
-
- g_message ("Already existing alarms");
- /* if the alarms or the alarms list is empty, just remove it */
- if (alarms == NULL || alarms->alarms == NULL) {
- if (alarms)
- e_cal_component_alarms_free (alarms);
- continue;
- }
-
- /* if already in the list, just update it */
- remove_alarms (cqa, FALSE);
- cqa->alarms = alarms;
- cqa->queued_alarms = NULL;
-
- /* add the new alarms */
- for (sl = cqa->alarms->alarms; sl; sl = sl->next) {
- ECalComponentAlarmInstance *instance;
- gpointer alarm_id;
- QueuedAlarm *qa;
-
- instance = sl->data;
-
- alarm_id = alarm_add (instance->trigger, alarm_trigger_cb, cqa, NULL);
- if (!alarm_id) {
- g_message (G_STRLOC ": Could not schedule a trigger for "
- "%ld, discarding...", (long) instance->trigger);
- continue;
- }
-
- qa = g_new (QueuedAlarm, 1);
- qa->alarm_id = alarm_id;
- qa->instance = instance;
- qa->snooze = FALSE;
-
- cqa->queued_alarms = g_slist_prepend (cqa->queued_alarms, qa);
- }
-
- cqa->queued_alarms = g_slist_reverse (cqa->queued_alarms);
- }
-}
-
-/* Called when a calendar component is removed; we must delete its corresponding
- * alarms.
- */
-static void
-query_objects_removed_cb (ECal *client, GList *objects, gpointer data)
-{
- ClientAlarms *ca;
- GList *l;
-
- ca = data;
-
- for (l = objects; l != NULL; l = l->next)
- remove_comp (ca, l->data);
-}
-
-
-
-/* Notification functions */
-
-/* Creates a snooze alarm based on an existing one. The snooze offset is
- * compued with respect to the current time.
- */
-static void
-create_snooze (CompQueuedAlarms *cqa, gpointer alarm_id, int snooze_mins)
-{
- QueuedAlarm *orig_qa;
- time_t t;
- gpointer new_id;
-
- orig_qa = lookup_queued_alarm (cqa, alarm_id);
- if (!orig_qa)
- return;
-
- t = time (NULL);
- t += snooze_mins * 60;
-
- new_id = alarm_add (t, alarm_trigger_cb, cqa, NULL);
- if (!new_id) {
- g_message ("create_snooze(): Could not schedule a trigger for "
- "%ld, discarding...", (long) t);
- return;
- }
-
- orig_qa->instance->trigger = t;
- orig_qa->alarm_id = new_id;
- orig_qa->snooze = TRUE;
-}
-
-/* Launches a component editor for a component */
-static void
-edit_component (ECal *client, ECalComponent *comp)
-{
- const char *uid;
- const char *uri;
- ECalSourceType source_type;
- CORBA_Environment ev;
- GNOME_Evolution_Calendar_CompEditorFactory factory;
- GNOME_Evolution_Calendar_CompEditorFactory_CompEditorMode corba_type;
-
- e_cal_component_get_uid (comp, &uid);
-
- uri = e_cal_get_uri (client);
- source_type = e_cal_get_source_type (client);
-
- /* Get the factory */
- CORBA_exception_init (&ev);
- factory = bonobo_activation_activate_from_id ("OAFIID:GNOME_Evolution_Calendar_CompEditorFactory:" BASE_VERSION,
- 0, NULL, &ev);
-
- if (BONOBO_EX (&ev)) {
- g_message (G_STRLOC ": Could not activate the component editor factory");
- CORBA_exception_free (&ev);
- return;
- }
-
- /* Edit the component */
- switch (source_type) {
- case E_CAL_SOURCE_TYPE_TODO:
- corba_type = GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_TODO;
- break;
- default:
- corba_type = GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_EVENT;
- }
-
- GNOME_Evolution_Calendar_CompEditorFactory_editExisting (factory, uri, (char *) uid, corba_type, &ev);
-
- if (BONOBO_EX (&ev))
- g_message (G_STRLOC ": Exception while editing the component");
-
- CORBA_exception_free (&ev);
-
- /* Get rid of the factory */
- bonobo_object_release_unref (factory, NULL);
-}
-
-typedef struct {
- char *summary;
- char *description;
- char *location;
- gboolean blink_state;
- gint blink_id;
- time_t trigger;
- CompQueuedAlarms *cqa;
- gpointer alarm_id;
- ECalComponent *comp;
- ECal *client;
- ECalView *query;
- GtkWidget *tray_icon;
- GtkWidget *image;
- GtkWidget *alarm_dialog;
-} TrayIconData;
-
-static void
-on_dialog_objs_removed_cb (ECal *client, GList *objects, gpointer data)
-{
- const char *our_uid;
- GList *l;
- TrayIconData *tray_data = data;
-
- e_cal_component_get_uid (tray_data->comp, &our_uid);
- g_return_if_fail (our_uid && *our_uid);
-
- for (l = objects; l != NULL; l = l->next) {
- const char *uid = l->data;
-
- if (!uid)
- continue;
-
- if (!strcmp (uid, our_uid)) {
- tray_data->cqa = NULL;
- tray_data->alarm_id = NULL;
-
- gtk_widget_destroy (tray_data->tray_icon);
- }
- }
-}
-
-/* Callback used from the alarm notify dialog */
-static void
-notify_dialog_cb (AlarmNotifyResult result, int snooze_mins, gpointer data)
-{
- TrayIconData *tray_data = data;
-
- g_signal_handlers_disconnect_matched (tray_data->query, G_SIGNAL_MATCH_FUNC,
- 0, 0, NULL, on_dialog_objs_removed_cb, NULL);
-
- switch (result) {
- case ALARM_NOTIFY_SNOOZE:
- create_snooze (tray_data->cqa, tray_data->alarm_id, snooze_mins);
- tray_data->cqa = NULL;
- return;
-
- case ALARM_NOTIFY_EDIT:
- edit_component (tray_data->client, tray_data->comp);
- break;
-
- case ALARM_NOTIFY_CLOSE:
- /* Do nothing */
- break;
-
- default:
- g_assert_not_reached ();
- }
-
- gtk_widget_destroy (tray_data->tray_icon);
-}
-
-static gint
-tray_icon_destroyed_cb (GtkWidget *tray, gpointer user_data)
-{
- TrayIconData *tray_data = user_data;
-
- g_signal_handlers_disconnect_matched (tray_data->query, G_SIGNAL_MATCH_FUNC,
- 0, 0, NULL, on_dialog_objs_removed_cb, NULL);
-
- if (tray_data->cqa != NULL)
- remove_queued_alarm (tray_data->cqa, tray_data->alarm_id, TRUE, TRUE);
-
- if (tray_data->summary != NULL) {
- g_free (tray_data->summary);
- tray_data->summary = NULL;
- }
-
- if (tray_data->description != NULL) {
- g_free (tray_data->description);
- tray_data->description = NULL;
- }
-
- if (tray_data->location != NULL) {
- g_free (tray_data->location);
- tray_data->location = NULL;
- }
-
- if (tray_data->blink_id)
- g_source_remove (tray_data->blink_id);
-
- g_object_unref (tray_data->comp);
- g_object_unref (tray_data->client);
- g_object_unref (tray_data->query);
-
- tray_icons_list = g_list_remove (tray_icons_list, tray_data);
- g_free (tray_data);
-
- return TRUE;
-}
-
-/* Callbacks. */
-static gboolean
-open_alarm_dialog (TrayIconData *tray_data)
-{
- QueuedAlarm *qa;
-
- qa = lookup_queued_alarm (tray_data->cqa, tray_data->alarm_id);
- if (qa) {
- gtk_widget_hide (tray_data->tray_icon);
- alarm_notify_dialog (tray_data->trigger,
- qa->instance->occur_start,
- qa->instance->occur_end,
- e_cal_component_get_vtype (tray_data->comp),
- tray_data->summary,
- tray_data->description,
- tray_data->location,
- notify_dialog_cb, tray_data);
- }
-
- return TRUE;
-}
-
-static void
-popup_dismiss_cb (EPopup *ep, EPopupItem *pitem, void *data)
-{
- TrayIconData *tray_data = data;
-
- gtk_widget_destroy (tray_data->tray_icon);
-}
-
-static void
-popup_dismiss_all_cb (EPopup *ep, EPopupItem *pitem, void *data)
-{
- while (tray_icons_list != NULL) {
- TrayIconData *tray_data = tray_icons_list->data;
-
- gtk_widget_destroy (tray_data->tray_icon);
-
- tray_icons_list = g_list_remove (tray_icons_list, tray_icons_list);
- }
-}
-
-static void
-popup_open_cb (EPopup *ep, EPopupItem *pitem, void *data)
-{
- TrayIconData *tray_data = data;
-
- open_alarm_dialog (tray_data);
-}
-
-static EPopupItem tray_items[] = {
- { E_POPUP_ITEM, "00.open", N_("Open"), popup_open_cb, NULL, GTK_STOCK_OPEN },
- { E_POPUP_ITEM, "10.dismiss", N_("Dismiss"), popup_dismiss_cb, NULL, NULL },
- { E_POPUP_ITEM, "20.dismissall", N_("Dismiss All"), popup_dismiss_all_cb, NULL, NULL },
-};
-
-static void
-tray_popup_free(EPopup *ep, GSList *items, void *data)
-{
- g_slist_free(items);
-}
-
-static gint
-tray_icon_clicked_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
-{
- TrayIconData *tray_data = user_data;
-
- if (event->type == GDK_BUTTON_PRESS) {
- if (event->button == 1) {
- return open_alarm_dialog (tray_data);
- } else if (event->button == 3) {
- GtkMenu *menu;
- GSList *menus = NULL;
- EPopup *ep;
- int i;
-
- ep = e_popup_new("org.gnome.evolution.alarmNotify.popup");
- for (i=0;i<sizeof(tray_items)/sizeof(tray_items[0]);i++)
- menus = g_slist_prepend(menus, &tray_items[i]);
- e_popup_add_items(ep, menus, NULL, tray_popup_free, tray_data);
- menu = e_popup_create_menu_once(ep, NULL, 0);
- gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event->button, event->time);
-
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static gboolean
-tray_icon_blink_cb (gpointer data)
-{
- TrayIconData *tray_data = data;
- GdkPixbuf *pixbuf;
-
- tray_data->blink_state = tray_data->blink_state == TRUE ? FALSE : TRUE;
- pixbuf = e_icon_factory_get_icon (tray_data->blink_state == TRUE ?
- "stock_appointment-reminder-excl" :
- "stock_appointment-reminder",
- E_ICON_SIZE_LARGE_TOOLBAR);
-
- gtk_image_set_from_pixbuf (GTK_IMAGE (tray_data->image), pixbuf);
- g_object_unref (pixbuf);
-
- return TRUE;
-}
-
-/* Performs notification of a display alarm */
-static void
-display_notification (time_t trigger, CompQueuedAlarms *cqa,
- gpointer alarm_id, gboolean use_description)
-{
- QueuedAlarm *qa;
- ECalComponent *comp;
- const char *summary, *description, *location;
- GtkWidget *tray_icon, *image, *ebox;
- GtkTooltips *tooltips;
- TrayIconData *tray_data;
- ECalComponentText text;
- GSList *text_list;
- char *str, *start_str, *end_str, *alarm_str;
- icaltimezone *current_zone;
-
- comp = cqa->alarms->comp;
- qa = lookup_queued_alarm (cqa, alarm_id);
- if (!qa)
- return;
-
- /* get a sensible description for the event */
- e_cal_component_get_summary (comp, &text);
-
- if (text.value)
- summary = text.value;
- else
- summary = _("No summary available.");
-
- e_cal_component_get_description_list (comp, &text_list);
-
- if (text_list) {
- text = *((ECalComponentText *)text_list->data);
- if (text.value)
- description = text.value;
- else
- description = _("No description available.");
- } else {
- description = _("No description available.");
- }
-
- e_cal_component_free_text_list (text_list);
-
- e_cal_component_get_location (comp, &location);
-
- if (!location)
- location = _("No location information available.");
-
- /* create the tray icon */
- tooltips = gtk_tooltips_new ();
-
- tray_icon = GTK_WIDGET (egg_tray_icon_new (qa->instance->auid));
- image = e_icon_factory_get_image ("stock_appointment-reminder", E_ICON_SIZE_LARGE_TOOLBAR);
- ebox = gtk_event_box_new ();
-
- gtk_widget_show (image);
- gtk_widget_show (ebox);
-
- current_zone = config_data_get_timezone ();
- alarm_str = timet_to_str_with_zone (trigger, current_zone);
- start_str = timet_to_str_with_zone (qa->instance->occur_start, current_zone);
- end_str = timet_to_str_with_zone (qa->instance->occur_end, current_zone);
- str = g_strdup_printf (_("Alarm on %s\n%s\nStarting at %s\nEnding at %s"),
- alarm_str, summary, start_str, end_str);
- gtk_tooltips_set_tip (GTK_TOOLTIPS (tooltips), ebox, str, str);
- g_free (start_str);
- g_free (end_str);
- g_free (alarm_str);
- g_free (str);
-
- g_object_set_data (G_OBJECT (tray_icon), "image", image);
- g_object_set_data (G_OBJECT (tray_icon), "available", GINT_TO_POINTER (1));
-
- gtk_container_add (GTK_CONTAINER (ebox), image);
- gtk_container_add (GTK_CONTAINER (tray_icon), ebox);
-
- /* create the private structure */
- tray_data = g_new0 (TrayIconData, 1);
- tray_data->summary = g_strdup (summary);
- tray_data->description = g_strdup (description);
- tray_data->location = g_strdup (location);
- tray_data->trigger = trigger;
- tray_data->cqa = cqa;
- tray_data->alarm_id = alarm_id;
- tray_data->comp = e_cal_component_clone (comp);
- tray_data->client = cqa->parent_client->client;
- tray_data->query = g_object_ref (cqa->parent_client->query);
- tray_data->image = image;
- tray_data->blink_state = FALSE;
- g_object_ref (tray_data->client);
- tray_data->tray_icon = tray_icon;
-
- tray_icons_list = g_list_prepend (tray_icons_list, tray_data);
-
- g_signal_connect (G_OBJECT (tray_icon), "destroy",
- G_CALLBACK (tray_icon_destroyed_cb), tray_data);
- g_signal_connect (G_OBJECT (ebox), "button_press_event",
- G_CALLBACK (tray_icon_clicked_cb), tray_data);
- g_signal_connect (G_OBJECT (tray_data->query), "objects_removed",
- G_CALLBACK (on_dialog_objs_removed_cb), tray_data);
-
- if (!config_data_get_notify_with_tray ()) {
- tray_data->blink_id = -1;
- open_alarm_dialog (tray_data);
- } else {
- tray_data->blink_id = g_timeout_add (500, tray_icon_blink_cb, tray_data);
- gtk_widget_show (tray_icon);
- }
-}
-
-/* Performs notification of an audio alarm */
-static void
-audio_notification (time_t trigger, CompQueuedAlarms *cqa,
- gpointer alarm_id)
-{
- QueuedAlarm *qa;
- ECalComponent *comp;
- ECalComponentAlarm *alarm;
- icalattach *attach;
- int flag = 0;
-
- comp = cqa->alarms->comp;
- qa = lookup_queued_alarm (cqa, alarm_id);
- if (!qa)
- return;
-
- alarm = e_cal_component_get_alarm (comp, qa->instance->auid);
- g_assert (alarm != NULL);
-
- e_cal_component_alarm_get_attach (alarm, &attach);
- e_cal_component_alarm_free (alarm);
-
- if (attach && icalattach_get_is_url (attach)) {
- const char *url;
-
- url = icalattach_get_url (attach);
-
- if (url && *url && g_file_test (url, G_FILE_TEST_EXISTS)) {
- flag = 1;
- gnome_sound_play (url); /* this sucks */
- }
- }
-
- if (!flag)
- gdk_beep ();
-
- if (attach)
- icalattach_unref (attach);
-
- /* We present a notification message in addition to playing the sound */
- display_notification (trigger, cqa, alarm_id, FALSE);
-}
-
-/* Performs notification of a mail alarm */
-static void
-mail_notification (time_t trigger, CompQueuedAlarms *cqa, gpointer alarm_id)
-{
- GtkWidget *dialog;
- GtkWidget *label;
-
- /* FIXME */
-
- display_notification (trigger, cqa, alarm_id, FALSE);
-
- dialog = gtk_dialog_new_with_buttons (_("Warning"),
- NULL, 0,
- GTK_STOCK_OK, GTK_RESPONSE_CANCEL,
- NULL);
- label = gtk_label_new (_("Evolution does not support calendar reminders with\n"
- "email notifications yet, but this reminder was\n"
- "configured to send an email. Evolution will display\n"
- "a normal reminder dialog box instead."));
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), label, TRUE, TRUE, 4);
-
- gtk_dialog_run (GTK_DIALOG (dialog));
-}
-
-/* Performs notification of a procedure alarm */
-static gboolean
-procedure_notification_dialog (const char *cmd, const char *url)
-{
- GtkWidget *dialog, *label, *checkbox;
- char *str;
- int btn;
-
- if (config_data_is_blessed_program (url))
- return TRUE;
-
- dialog = gtk_dialog_new_with_buttons (_("Warning"),
- NULL, 0,
- GTK_STOCK_NO, GTK_RESPONSE_CANCEL,
- GTK_STOCK_YES, GTK_RESPONSE_OK,
- NULL);
-
- str = g_strdup_printf (_("An Evolution Calendar reminder is about to trigger. "
- "This reminder is configured to run the following program:\n\n"
- " %s\n\n"
- "Are you sure you want to run this program?"),
- cmd);
- label = gtk_label_new (str);
- gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
- gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
- gtk_widget_show (label);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
- label, TRUE, TRUE, 4);
- g_free (str);
-
- checkbox = gtk_check_button_new_with_label
- (_("Do not ask me about this program again."));
- gtk_widget_show (checkbox);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
- checkbox, TRUE, TRUE, 4);
-
- /* Run the dialog */
- btn = gtk_dialog_run (GTK_DIALOG (dialog));
- if (btn == GTK_RESPONSE_OK && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbox)))
- config_data_save_blessed_program (url);
- gtk_widget_destroy (dialog);
-
- return (btn == GTK_RESPONSE_OK);
-}
-
-static void
-procedure_notification (time_t trigger, CompQueuedAlarms *cqa, gpointer alarm_id)
-{
- QueuedAlarm *qa;
- ECalComponent *comp;
- ECalComponentAlarm *alarm;
- ECalComponentText description;
- icalattach *attach;
- const char *url;
- char *cmd;
- int result;
-
- comp = cqa->alarms->comp;
- qa = lookup_queued_alarm (cqa, alarm_id);
- if (!qa)
- return;
-
- alarm = e_cal_component_get_alarm (comp, qa->instance->auid);
- g_assert (alarm != NULL);
-
- e_cal_component_alarm_get_attach (alarm, &attach);
- e_cal_component_alarm_get_description (alarm, &description);
- e_cal_component_alarm_free (alarm);
-
- /* If the alarm has no attachment, simply display a notification dialog. */
- if (!attach)
- goto fallback;
-
- if (!icalattach_get_is_url (attach)) {
- icalattach_unref (attach);
- goto fallback;
- }
-
- url = icalattach_get_url (attach);
- g_assert (url != NULL);
-
- /* Ask for confirmation before executing the stuff */
- if (description.value)
- cmd = g_strconcat (url, " ", description.value, NULL);
- else
- cmd = (char *) url;
-
- result = 0;
- if (procedure_notification_dialog (cmd, url))
- result = gnome_execute_shell (NULL, cmd);
-
- if (cmd != (char *) url)
- g_free (cmd);
-
- icalattach_unref (attach);
-
- /* Fall back to display notification if we got an error */
- if (result < 0)
- goto fallback;
-
- remove_queued_alarm (cqa, alarm_id, TRUE, TRUE);
- return;
-
- fallback:
-
- display_notification (trigger, cqa, alarm_id, FALSE);
-}
-
-
-
-/**
- * alarm_queue_init:
- *
- * Initializes the alarm queueing system. This should be called near the
- * beginning of the program.
- **/
-void
-alarm_queue_init (void)
-{
- g_return_if_fail (alarm_queue_inited == FALSE);
-
- client_alarms_hash = g_hash_table_new (g_direct_hash, g_direct_equal);
- queue_midnight_refresh ();
-
- saved_notification_time = config_data_get_last_notification_time ();
- if (saved_notification_time == -1) {
- saved_notification_time = time (NULL);
- config_data_set_last_notification_time (saved_notification_time);
- }
-
- alarm_queue_inited = TRUE;
-}
-
-static void
-free_client_alarms_cb (gpointer key, gpointer value, gpointer user_data)
-{
- ClientAlarms *ca = value;
-
- if (ca) {
- g_object_unref (ca->client);
- g_free (ca);
- }
-}
-
-/**
- * alarm_queue_done:
- *
- * Shuts down the alarm queueing system. This should be called near the end
- * of the program. All the monitored calendar clients should already have been
- * unregistered with alarm_queue_remove_client().
- **/
-void
-alarm_queue_done (void)
-{
- g_return_if_fail (alarm_queue_inited);
-
- /* All clients must be unregistered by now */
- g_return_if_fail (g_hash_table_size (client_alarms_hash) == 0);
-
- g_hash_table_foreach (client_alarms_hash, (GHFunc) free_client_alarms_cb, NULL);
- g_hash_table_destroy (client_alarms_hash);
- client_alarms_hash = NULL;
-
- g_assert (midnight_refresh_id != NULL);
- alarm_remove (midnight_refresh_id);
- midnight_refresh_id = NULL;
-
- alarm_queue_inited = FALSE;
-}
-
-/**
- * alarm_queue_add_client:
- * @client: A calendar client.
- *
- * Adds a calendar client to the alarm queueing system. Alarm trigger
- * notifications will be presented at the appropriate times. The client should
- * be removed with alarm_queue_remove_client() when receiving notifications
- * from it is no longer desired.
- *
- * A client can be added any number of times to the alarm queueing system,
- * but any single alarm trigger will only be presented once for a particular
- * client. The client must still be removed the same number of times from the
- * queueing system when it is no longer wanted.
- **/
-void
-alarm_queue_add_client (ECal *client)
-{
- ClientAlarms *ca;
-
- g_return_if_fail (alarm_queue_inited);
- g_return_if_fail (client != NULL);
- g_return_if_fail (E_IS_CAL (client));
-
- ca = lookup_client (client);
- if (ca) {
- return;
- }
-
- ca = g_new (ClientAlarms, 1);
-
- ca->client = client;
- ca->query = NULL;
- g_object_ref (ca->client);
-
- g_hash_table_insert (client_alarms_hash, client, ca);
-
- ca->uid_alarms_hash = g_hash_table_new (g_str_hash, g_str_equal);
-
- if (e_cal_get_load_state (client) == E_CAL_LOAD_LOADED) {
- load_alarms_for_today (ca);
- } else {
- g_signal_connect (client, "cal_opened",
- G_CALLBACK (cal_opened_cb),
- ca);
- }
-}
-
-/* Called from g_hash_table_foreach(); adds a component UID to a list */
-static void
-add_uid_cb (gpointer key, gpointer value, gpointer data)
-{
- GSList **uids;
- const char *uid;
-
- uids = data;
- uid = key;
-
- *uids = g_slist_prepend (*uids, (char *) uid);
-}
-
-/* Removes all the alarms queued for a particular calendar client */
-static void
-remove_client_alarms (ClientAlarms *ca)
-{
- GSList *uids;
- GSList *l;
-
- /* First we build a list of UIDs so that we can remove them one by one */
-
- uids = NULL;
- g_hash_table_foreach (ca->uid_alarms_hash, add_uid_cb, &uids);
-
- for (l = uids; l; l = l->next) {
- const char *uid;
-
- uid = l->data;
-
- remove_comp (ca, uid);
- }
-
- g_slist_free (uids);
-
- /* The hash table should be empty now */
-
- g_assert (g_hash_table_size (ca->uid_alarms_hash) == 0);
-}
-
-/**
- * alarm_queue_remove_client:
- * @client: A calendar client.
- *
- * Removes a calendar client from the alarm queueing system.
- **/
-void
-alarm_queue_remove_client (ECal *client)
-{
- ClientAlarms *ca;
-
- g_return_if_fail (alarm_queue_inited);
- g_return_if_fail (client != NULL);
- g_return_if_fail (E_IS_CAL (client));
-
- ca = lookup_client (client);
- g_return_if_fail (ca != NULL);
-
- remove_client_alarms (ca);
-
- /* Clean up */
-
- g_signal_handlers_disconnect_matched (ca->client, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, ca);
-
- g_object_unref (ca->query);
- ca->query = NULL;
- g_object_unref (ca->client);
- ca->client = NULL;
-
- g_hash_table_destroy (ca->uid_alarms_hash);
- ca->uid_alarms_hash = NULL;
-
- g_free (ca);
-
- g_hash_table_remove (client_alarms_hash, client);
-}
diff --git a/calendar/gui/alarm-notify/alarm-queue.h b/calendar/gui/alarm-notify/alarm-queue.h
deleted file mode 100644
index 12802750ec..0000000000
--- a/calendar/gui/alarm-notify/alarm-queue.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Evolution calendar - Alarm queueing engine
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef ALARM_QUEUE_H
-#define ALARM_QUEUE_H
-
-#include <libecal/e-cal.h>
-
-
-void alarm_queue_init (void);
-void alarm_queue_done (void);
-
-void alarm_queue_add_client (ECal *client);
-void alarm_queue_remove_client (ECal *client);
-
-
-#endif
diff --git a/calendar/gui/alarm-notify/alarm.c b/calendar/gui/alarm-notify/alarm.c
deleted file mode 100644
index 6c57311c12..0000000000
--- a/calendar/gui/alarm-notify/alarm.c
+++ /dev/null
@@ -1,301 +0,0 @@
-/* Evolution calendar - Low-level alarm timer mechanism
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: Miguel de Icaza <miguel@ximian.com>
- * Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-#include <unistd.h>
-#include <time.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <sys/time.h>
-#include <gdk/gdk.h>
-#include "alarm.h"
-
-
-
-/* Our glib timeout */
-static guint timeout_id;
-
-/* The list of pending alarms */
-static GList *alarms = NULL;
-
-/* A queued alarm structure */
-typedef struct {
- time_t trigger;
- AlarmFunction alarm_fn;
- gpointer data;
- AlarmDestroyNotify destroy_notify_fn;
-} AlarmRecord;
-
-static void setup_timeout (void);
-
-
-
-/* Removes the head alarm from the queue. Does not touch the timeout_id. */
-static void
-pop_alarm (void)
-{
- AlarmRecord *ar;
- GList *l;
-
- g_assert (alarms != NULL);
-
- ar = alarms->data;
-
- l = alarms;
- alarms = g_list_remove_link (alarms, l);
- g_list_free_1 (l);
-
- g_free (ar);
-}
-
-/* Callback from the alarm timeout */
-static gboolean
-alarm_ready_cb (gpointer data)
-{
- time_t now;
-
- g_assert (alarms != NULL);
- timeout_id = 0;
-
- now = time (NULL);
-
- g_message ("Alarm callback!");
- while (alarms) {
- AlarmRecord *notify_id, *ar;
- AlarmRecord ar_copy;
-
- ar = alarms->data;
-
- if (ar->trigger > now)
- break;
-
- g_message ("Process alarm with trigger %lu", ar->trigger);
- notify_id = ar;
-
- ar_copy = *ar;
- ar = &ar_copy;
-
- pop_alarm (); /* This will free the original AlarmRecord; that's why we copy it */
-
- (* ar->alarm_fn) (notify_id, ar->trigger, ar->data);
-
- if (ar->destroy_notify_fn)
- (* ar->destroy_notify_fn) (notify_id, ar->data);
- }
-
- /* We need this check because one of the alarm_fn above may have
- * re-entered and added an alarm of its own, so the timer will
- * already be set up.
- */
- if (alarms)
- setup_timeout ();
-
- return FALSE;
-}
-
-/* Sets up a timeout for the next minute. We do not need to be concerned with
- * timezones here, as this is just a periodic check on the alarm queue.
- */
-static void
-setup_timeout (void)
-{
- const AlarmRecord *ar;
- guint diff;
- time_t now;
- g_assert (alarms != NULL);
-
- ar = alarms->data;
-
- /* Remove the existing time out */
- if (timeout_id != 0) {
- g_source_remove (timeout_id);
- timeout_id = 0;
- }
-
- /* Ensure that if the trigger managed to get behind the
- * current time we timeout immediately */
- diff = MAX (0, ar->trigger - time (NULL));
- now = time (NULL);
-
- /* Add the time out */
- g_message ("Setting timeout for %d %lu %lu", diff, ar->trigger, now);
- g_message (" %s", ctime (&ar->trigger));
- g_message (" %s", ctime (&now));
- timeout_id = g_timeout_add (diff * 1000, alarm_ready_cb, NULL);
-}
-
-/* Used from g_list_insert_sorted(); compares the trigger times of two AlarmRecord structures. */
-static int
-compare_alarm_by_time (gconstpointer a, gconstpointer b)
-{
- const AlarmRecord *ara = a;
- const AlarmRecord *arb = b;
- time_t diff;
-
- diff = ara->trigger - arb->trigger;
- return (diff < 0) ? -1 : (diff > 0) ? 1 : 0;
-}
-
-/* Adds an alarm to the queue and sets up the timer */
-static void
-queue_alarm (AlarmRecord *ar)
-{
- GList *old_head;
-
- /* Track the current head of the list in case there are changes */
- old_head = alarms;
-
- /* Insert the new alarm in order */
- alarms = g_list_insert_sorted (alarms, ar, compare_alarm_by_time);
-
- /* If there first item on the list didn't change, the time out is fine */
- if (old_head == alarms)
- return;
-
- /* Set the timer for removal upon activation */
- setup_timeout ();
-}
-
-
-
-/**
- * alarm_add:
- * @trigger: Time at which alarm will trigger.
- * @alarm_fn: Callback for trigger.
- * @data: Closure data for callback.
- * @destroy_notify_fn: destroy notification callback.
- *
- * Adds an alarm to trigger at the specified time. The @alarm_fn will be called
- * with the provided data and the alarm will be removed from the trigger list.
- *
- * Return value: An identifier for this alarm; it can be used to remove the
- * alarm later with alarm_remove(). If the trigger time occurs in the past, then
- * the alarm will not be queued and the function will return NULL.
- **/
-gpointer
-alarm_add (time_t trigger, AlarmFunction alarm_fn, gpointer data,
- AlarmDestroyNotify destroy_notify_fn)
-{
- AlarmRecord *ar;
-
- g_return_val_if_fail (trigger != -1, NULL);
- g_return_val_if_fail (alarm_fn != NULL, NULL);
-
- ar = g_new (AlarmRecord, 1);
- ar->trigger = trigger;
- ar->alarm_fn = alarm_fn;
- ar->data = data;
- ar->destroy_notify_fn = destroy_notify_fn;
-
- queue_alarm (ar);
-
- return ar;
-}
-
-/**
- * alarm_remove:
- * @alarm: A queued alarm identifier.
- *
- * Removes an alarm from the alarm queue.
- **/
-void
-alarm_remove (gpointer alarm)
-{
- AlarmRecord *notify_id, *ar;
- AlarmRecord ar_copy;
- AlarmRecord *old_head;
- GList *l;
-
- g_return_if_fail (alarm != NULL);
-
- ar = alarm;
-
- l = g_list_find (alarms, ar);
- if (!l) {
- g_message (G_STRLOC ": Requested removal of nonexistent alarm!");
- return;
- }
-
- old_head = alarms->data;
-
- notify_id = ar;
-
- if (old_head == ar) {
- ar_copy = *ar;
- ar = &ar_copy;
- pop_alarm (); /* This will free the original AlarmRecord; that's why we copy it */
- } else {
- alarms = g_list_remove_link (alarms, l);
- g_list_free_1 (l);
- }
-
- /* Reset the timeout */
-
- g_assert (timeout_id != 0);
-
- if (!alarms) {
- g_source_remove (timeout_id);
- timeout_id = 0;
- }
-
- /* Notify about destructiono of the alarm */
-
- if (ar->destroy_notify_fn)
- (* ar->destroy_notify_fn) (notify_id, ar->data);
-
-}
-
-/**
- * alarm_done:
- *
- * Terminates the alarm timer mechanism. This should be called at the end of
- * the program.
- **/
-void
-alarm_done (void)
-{
- GList *l;
-
- if (timeout_id == 0) {
- g_assert (alarms == NULL);
- return;
- }
-
- g_assert (alarms != NULL);
-
- g_source_remove (timeout_id);
- timeout_id = 0;
-
- for (l = alarms; l; l = l->next) {
- AlarmRecord *ar;
-
- ar = l->data;
-
- if (ar->destroy_notify_fn)
- (* ar->destroy_notify_fn) (ar, ar->data);
-
- g_free (ar);
- }
-
- g_list_free (alarms);
- alarms = NULL;
-}
diff --git a/calendar/gui/alarm-notify/alarm.h b/calendar/gui/alarm-notify/alarm.h
deleted file mode 100644
index 23fde886c9..0000000000
--- a/calendar/gui/alarm-notify/alarm.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Evolution calendar - Low-level alarm timer mechanism
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: Miguel de Icaza <miguel@ximian.com>
- * Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef ALARM_H
-#define ALARM_H
-
-#include <time.h>
-#include <glib.h>
-
-
-
-typedef void (* AlarmFunction) (gpointer alarm_id, time_t trigger, gpointer data);
-typedef void (* AlarmDestroyNotify) (gpointer alarm_id, gpointer data);
-
-void alarm_done (void);
-
-gpointer alarm_add (time_t trigger, AlarmFunction alarm_fn, gpointer data,
- AlarmDestroyNotify destroy_notify_fn);
-void alarm_remove (gpointer alarm);
-
-
-
-#endif
diff --git a/calendar/gui/alarm-notify/config-data.c b/calendar/gui/alarm-notify/config-data.c
deleted file mode 100644
index cd3f7ed885..0000000000
--- a/calendar/gui/alarm-notify/config-data.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/* Evolution calendar - Configuration values for the alarm notification daemon
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIOH
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <libedataserver/e-source-list.h>
-#include "config-data.h"
-
-
-
-#define KEY_LAST_NOTIFICATION_TIME "/apps/evolution/calendar/notify/last_notification_time"
-#define KEY_PROGRAMS "/apps/evolution/calendar/notify/programs"
-
-/* Whether we have initied ourselves by reading the data from the configuration engine */
-static gboolean inited = FALSE;
-static GConfClient *conf_client = NULL;
-static ESourceList *calendar_source_list = NULL, *tasks_source_list = NULL;
-
-
-
-/* Copied from ../calendar-config.c; returns whether the locale has 'am' and
- * 'pm' strings defined.
- */
-static gboolean
-locale_supports_12_hour_format (void)
-{
- char s[16];
- time_t t = 0;
-
- strftime (s, sizeof s, "%p", gmtime (&t));
- return s[0] != '\0';
-}
-
-static void
-do_cleanup (void)
-{
- if (calendar_source_list) {
- g_object_unref (calendar_source_list);
- calendar_source_list = NULL;
- }
-
- if (tasks_source_list) {
- g_object_unref (tasks_source_list);
- tasks_source_list = NULL;
- }
-
- g_object_unref (conf_client);
- conf_client = NULL;
-
- inited = FALSE;
-}
-
-/* Ensures that the configuration values have been read */
-static void
-ensure_inited (void)
-{
- if (inited)
- return;
-
- inited = TRUE;
-
- conf_client = gconf_client_get_default ();
- if (!GCONF_IS_CLIENT (conf_client)) {
- inited = FALSE;
- return;
- }
-
- g_atexit ((GVoidFunc) do_cleanup);
-
- /* load the sources for calendars and tasks */
- calendar_source_list = e_source_list_new_for_gconf (conf_client,
- "/apps/evolution/calendar/sources");
- tasks_source_list = e_source_list_new_for_gconf (conf_client,
- "/apps/evolution/tasks/sources");
-
-}
-
-GConfClient *
-config_data_get_conf_client (void)
-{
- ensure_inited ();
- return conf_client;
-}
-
-icaltimezone *
-config_data_get_timezone (void)
-{
- char *location;
- icaltimezone *local_timezone;
-
- ensure_inited ();
-
- location = gconf_client_get_string (conf_client,
- "/apps/evolution/calendar/display/timezone",
- NULL);
- if (location && location[0]) {
- local_timezone = icaltimezone_get_builtin_timezone (location);
- } else {
- local_timezone = icaltimezone_get_utc_timezone ();
- }
-
- g_free (location);
-
- return local_timezone;
-}
-
-gboolean
-config_data_get_24_hour_format (void)
-{
- ensure_inited ();
-
- if (locale_supports_12_hour_format ()) {
- return gconf_client_get_bool (conf_client,
- "/apps/evolution/calendar/display/use_24hour_format",
- NULL);
- }
-
- return TRUE;
-}
-
-gboolean
-config_data_get_notify_with_tray (void)
-{
- ensure_inited ();
-
- return gconf_client_get_bool (conf_client,
- "/apps/evolution/calendar/notify/notify_with_tray",
- NULL);
-}
-
-/**
- * config_data_set_last_notification_time:
- * @t: A time value.
- *
- * Saves the last notification time so that it can be fetched the next time the
- * alarm daemon is run. This way the daemon can show alarms that should have
- * triggered while it was not running.
- **/
-void
-config_data_set_last_notification_time (time_t t)
-{
- GConfClient *conf_client;
- time_t current_t;
-
- g_return_if_fail (t != -1);
-
- if (!(conf_client = config_data_get_conf_client ()))
- return;
-
- /* we only store the new notification time if it is bigger
- than the already stored one */
- current_t = gconf_client_get_int (conf_client, KEY_LAST_NOTIFICATION_TIME, NULL);
- if (t > current_t)
- gconf_client_set_int (conf_client, KEY_LAST_NOTIFICATION_TIME, t, NULL);
-}
-
-/**
- * config_data_get_last_notification_time:
- *
- * Queries the last saved value for alarm notification times.
- *
- * Return value: The last saved value, or -1 if no value had been saved before.
- **/
-time_t
-config_data_get_last_notification_time (void)
-{
- GConfClient *conf_client;
- GConfValue *value;
-
- if (!(conf_client = config_data_get_conf_client ()))
- return -1;
-
- value = gconf_client_get_without_default (conf_client, KEY_LAST_NOTIFICATION_TIME, NULL);
- if (value)
- return (time_t) gconf_value_get_int (value);
-
- return time (NULL);
-}
-
-/**
- * config_data_save_blessed_program:
- * @program: a program name
- *
- * Saves a program name as "blessed"
- **/
-void
-config_data_save_blessed_program (const char *program)
-{
- GConfClient *conf_client;
- GSList *l;
-
- if (!(conf_client = config_data_get_conf_client ()))
- return;
-
- l = gconf_client_get_list (conf_client, KEY_PROGRAMS, GCONF_VALUE_STRING, NULL);
- l = g_slist_append (l, g_strdup (program));
- gconf_client_set_list (conf_client, KEY_PROGRAMS, GCONF_VALUE_STRING, l, NULL);
- g_slist_foreach (l, (GFunc) g_free, NULL);
- g_slist_free (l);
-}
-
-/**
- * config_data_is_blessed_program:
- * @program: a program name
- *
- * Checks to see if a program is blessed
- *
- * Return value: TRUE if program is blessed, FALSE otherwise
- **/
-gboolean
-config_data_is_blessed_program (const char *program)
-{
- GConfClient *conf_client;
- GSList *l, *n;
- gboolean found = FALSE;
-
- if (!(conf_client = config_data_get_conf_client ()))
- return FALSE;
-
- l = gconf_client_get_list (conf_client, KEY_PROGRAMS, GCONF_VALUE_STRING, NULL);
- while (l) {
- n = l->next;
- if (!found)
- found = strcmp ((char *) l->data, program) == 0;
- g_free (l->data);
- g_slist_free_1 (l);
- l = n;
- }
-
- return found;
-}
diff --git a/calendar/gui/alarm-notify/config-data.h b/calendar/gui/alarm-notify/config-data.h
deleted file mode 100644
index e5b2c3d689..0000000000
--- a/calendar/gui/alarm-notify/config-data.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Evolution calendar - Configuration values for the alarm notification daemon
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef CONFIG_DATA_H
-#define CONFIG_DATA_H
-
-#include <glib.h>
-#include <libical/ical.h>
-#include <gconf/gconf-client.h>
-
-GConfClient *config_data_get_conf_client (void);
-
-icaltimezone *config_data_get_timezone (void);
-gboolean config_data_get_24_hour_format (void);
-gboolean config_data_get_notify_with_tray (void);
-void config_data_set_last_notification_time (time_t t);
-time_t config_data_get_last_notification_time (void);
-void config_data_save_blessed_program (const char *program);
-gboolean config_data_is_blessed_program (const char *program);
-
-#endif
diff --git a/calendar/gui/alarm-notify/notify-main.c b/calendar/gui/alarm-notify/notify-main.c
deleted file mode 100644
index 91fc0c0bfe..0000000000
--- a/calendar/gui/alarm-notify/notify-main.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/* Evolution calendar - Alarm notification service main file
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2003 Novell, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <string.h>
-#include <glib.h>
-#include <gtk/gtkmain.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnome/gnome-init.h>
-#include <libgnome/gnome-sound.h>
-#include <libgnomeui/gnome-client.h>
-#include <libgnomeui/gnome-ui-init.h>
-#include <libgnomevfs/gnome-vfs-init.h>
-#include <glade/glade.h>
-#include <bonobo/bonobo-main.h>
-#include <bonobo/bonobo-generic-factory.h>
-#include <bonobo-activation/bonobo-activation.h>
-#include <libedataserver/e-source.h>
-#include "e-util/e-passwords.h"
-#include "e-util/e-icon-factory.h"
-#include "alarm.h"
-#include "alarm-queue.h"
-#include "alarm-notify.h"
-#include "config-data.h"
-
-
-
-static BonoboGenericFactory *factory;
-
-static AlarmNotify *alarm_notify_service = NULL;
-
-
-/* Callback for the master client's "die" signal. We must terminate the daemon
- * since the session is ending.
- */
-static void
-client_die_cb (GnomeClient *client)
-{
- bonobo_main_quit ();
-}
-
-static gint
-save_session_cb (GnomeClient *client, GnomeSaveStyle save_style, gint shutdown,
- GnomeInteractStyle interact_style, gint fast, gpointer user_data)
-{
- char *args[2];
-
- args[0] = EVOLUTION_LIBEXECDIR "/evolution-alarm-notify";
- args[1] = NULL;
- gnome_client_set_restart_command (client, 1, args);
-
- return TRUE;
-}
-
-/* Sees if a session manager is present. If so, it tells the SM how to restart
- * the daemon when the session starts. It also sets the die callback so that
- * the daemon can terminate properly when the session ends.
- */
-static void
-init_session (void)
-{
- GnomeClient *master_client;
-
- master_client = gnome_master_client ();
-
- g_signal_connect (G_OBJECT (master_client), "die",
- G_CALLBACK (client_die_cb), NULL);
- g_signal_connect (G_OBJECT (master_client), "save_yourself",
- G_CALLBACK (save_session_cb), NULL);
-
- /* The daemon should always be started up by the session manager when
- * the session starts. The daemon will take care of loading whatever
- * calendars it was told to load.
- */
- gnome_client_set_restart_style (master_client, GNOME_RESTART_IF_RUNNING);
-}
-
-/* Factory function for the alarm notify service; just creates and references a
- * singleton service object.
- */
-static BonoboObject *
-alarm_notify_factory_fn (BonoboGenericFactory *factory, const char *component_id, void *data)
-{
- if (!alarm_notify_service) {
- alarm_notify_service = alarm_notify_new ();
- g_assert (alarm_notify_service != NULL);
- }
-
- bonobo_object_ref (BONOBO_OBJECT (alarm_notify_service));
-
- return BONOBO_OBJECT (alarm_notify_service);
-}
-
-/* Creates the alarm notifier */
-static gboolean
-init_alarm_service (gpointer user_data)
-{
- if (!alarm_notify_service) {
- alarm_notify_service = alarm_notify_new ();
- g_assert (alarm_notify_service != NULL);
- }
-
- return FALSE;
-}
-
-int
-main (int argc, char **argv)
-{
- bindtextdomain (GETTEXT_PACKAGE, EVOLUTION_LOCALEDIR);
- bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
- textdomain (GETTEXT_PACKAGE);
-
- gnome_program_init ("evolution-alarm-notify", VERSION, LIBGNOMEUI_MODULE, argc, argv, NULL);
-
- if (bonobo_init_full (&argc, argv, bonobo_activation_orb_get (),
- CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE)
- g_error (_("Could not initialize Bonobo"));
-
- glade_init ();
-
- gnome_sound_init ("localhost");
-
- e_icon_factory_init ();
-
- factory = bonobo_generic_factory_new ("OAFIID:GNOME_Evolution_Calendar_AlarmNotify_Factory:" BASE_VERSION,
- (BonoboFactoryCallback) alarm_notify_factory_fn, NULL);
- if (!factory)
- g_error (_("Could not create the alarm notify service factory"));
-
- init_session ();
-
- g_idle_add ((GSourceFunc) init_alarm_service, NULL);
-
- bonobo_main ();
-
- bonobo_object_unref (BONOBO_OBJECT (factory));
- factory = NULL;
-
- alarm_queue_done ();
- alarm_done ();
-
- if (alarm_notify_service)
- bonobo_object_unref (BONOBO_OBJECT (alarm_notify_service));
-
- e_passwords_shutdown ();
- gnome_sound_shutdown ();
-
- return 0;
-}
diff --git a/calendar/gui/alarm-notify/util.c b/calendar/gui/alarm-notify/util.c
deleted file mode 100644
index 3749e5f300..0000000000
--- a/calendar/gui/alarm-notify/util.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Evolution calendar - utility functions
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <libgnome/gnome-i18n.h>
-#include <e-util/e-time-utils.h>
-#include <libecal/e-cal-time-util.h>
-#include "config-data.h"
-#include "util.h"
-
-/* Converts a time_t to a string, relative to the specified timezone */
-char *
-timet_to_str_with_zone (time_t t, icaltimezone *zone)
-{
- struct icaltimetype itt;
- struct tm tm;
- char buf[256];
-
- if (t == -1)
- return g_strdup (_("invalid time"));
-
- itt = icaltime_from_timet_with_zone (t, FALSE, zone);
- tm = icaltimetype_to_tm (&itt);
-
- e_time_format_date_and_time (&tm, config_data_get_24_hour_format (),
- FALSE, FALSE, buf, sizeof (buf));
- return g_strdup (buf);
-}
diff --git a/calendar/gui/alarm-notify/util.h b/calendar/gui/alarm-notify/util.h
deleted file mode 100644
index 7dae3dd7fe..0000000000
--- a/calendar/gui/alarm-notify/util.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Evolution calendar - utility functions
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef UTIL_H
-#define UTIL_H
-
-#include <libecal/e-cal-component.h>
-
-char *timet_to_str_with_zone (time_t t, icaltimezone *zone);
-
-#endif
diff --git a/calendar/gui/apps_evolution_calendar.schemas.in.in b/calendar/gui/apps_evolution_calendar.schemas.in.in
deleted file mode 100644
index 6be74dc8c1..0000000000
--- a/calendar/gui/apps_evolution_calendar.schemas.in.in
+++ /dev/null
@@ -1,381 +0,0 @@
-<gconfschemafile>
- <schemalist>
-
- <!-- Display -->
-
- <schema>
- <key>/schemas/apps/evolution/calendar/display/timezone</key>
- <applyto>/apps/evolution/calendar/display/timezone</applyto>
- <owner>evolution-calendar</owner>
- <type>string</type>
- <default>UTC</default>
- <locale name="C">
- <short>Default timezone for meetings</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/display/use_24hour_format</key>
- <applyto>/apps/evolution/calendar/display/use_24hour_format</applyto>
- <owner>evolution-calendar</owner>
- <type>bool</type>
- <default>false</default>
- <locale name="C">
- <short>Whether to show times in 24h format instead of using am/pm</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/display/week_start_day</key>
- <applyto>/apps/evolution/calendar/display/week_start_day</applyto>
- <owner>evolution-calendar</owner>
- <type>int</type>
- <default>1</default>
- <locale name="C">
- <short>Weekday the week starts on</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/display/day_start_hour</key>
- <applyto>/apps/evolution/calendar/display/day_start_hour</applyto>
- <owner>evolution-calendar</owner>
- <type>int</type>
- <default>9</default>
- <locale name="C">
- <short>Hour the workday starts on</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/display/day_start_minute</key>
- <applyto>/apps/evolution/calendar/display/day_start_minute</applyto>
- <owner>evolution-calendar</owner>
- <type>int</type>
- <default>0</default>
- <locale name="C">
- <short>Minute the workday starts on</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/display/day_end_hour</key>
- <applyto>/apps/evolution/calendar/display/day_end_hour</applyto>
- <owner>evolution-calendar</owner>
- <type>int</type>
- <default>17</default>
- <locale name="C">
- <short>Hour the workday ends on</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/display/day_end_minute</key>
- <applyto>/apps/evolution/calendar/display/day_end_minute</applyto>
- <owner>evolution-calendar</owner>
- <type>int</type>
- <default>0</default>
- <locale name="C">
- <short>Minute the workday ends on</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/display/time_divisions</key>
- <applyto>/apps/evolution/calendar/display/time_divisions</applyto>
- <owner>evolution-calendar</owner>
- <type>int</type>
- <default>30</default>
- <locale name="C">
- <short>Intervals shown in Day and Work Week views</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/display/hpane_position</key>
- <applyto>/apps/evolution/calendar/display/hpane_position</applyto>
- <owner>evolution-calendar</owner>
- <type>int</type>
- <default>400</default>
- <locale name="C">
- <short>Position of the horizontal pane</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/display/vpane_position</key>
- <applyto>/apps/evolution/calendar/display/vpane_position</applyto>
- <owner>evolution-calendar</owner>
- <type>int</type>
- <default>150</default>
- <locale name="C">
- <short>Position of the vertical pane</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/display/month_hpane_position</key>
- <applyto>/apps/evolution/calendar/display/month_hpane_position</applyto>
- <owner>evolution-calendar</owner>
- <type>int</type>
- <default>32000</default>
- <locale name="C">
- <short>Position of the horizontal pane in the month view</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/display/month_vpane_position</key>
- <applyto>/apps/evolution/calendar/display/month_vpane_position</applyto>
- <owner>evolution-calendar</owner>
- <type>int</type>
- <default>150</default>
- <locale name="C">
- <short>Position of the vertical pane in the month view</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/display/task_vpane_position</key>
- <applyto>/apps/evolution/calendar/display/task_vpane_position</applyto>
- <owner>evolution-calendar</owner>
- <type>int</type>
- <default>400</default>
- <locale name="C">
- <short>Position of the vertical pane in the task view</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/display/compress_weekend</key>
- <applyto>/apps/evolution/calendar/display/compress_weekend</applyto>
- <owner>evolution-calendar</owner>
- <type>bool</type>
- <default>true</default>
- <locale name="C">
- <short>Allocate less space to weekend appointments</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/display/show_event_end</key>
- <applyto>/apps/evolution/calendar/display/show_event_end</applyto>
- <owner>evolution-calendar</owner>
- <type>bool</type>
- <default>true</default>
- <locale name="C">
- <short>Show where events end in week and month views</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/display/working_days</key>
- <applyto>/apps/evolution/calendar/display/working_days</applyto>
- <owner>evolution-calendar</owner>
- <type>int</type>
- <default>62</default>
- <locale name="C">
- <short>Days that are work days</short>
- </locale>
- </schema>
-
- <!-- Tasks -->
-
- <schema>
- <key>/schemas/apps/evolution/calendar/tasks/hide_completed</key>
- <applyto>/apps/evolution/calendar/tasks/hide_completed</applyto>
- <owner>evolution-calendar</owner>
- <type>bool</type>
- <default>false</default>
- <locale name="C">
- <short>Whether to hide completed tasks</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/tasks/hide_completed_units</key>
- <applyto>/apps/evolution/calendar/tasks/hide_completed_units</applyto>
- <owner>evolution-calendar</owner>
- <type>string</type>
- <default>days</default>
- <locale name="C">
- <short>Units for determining when to hide tasks</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/tasks/hide_completed_value</key>
- <applyto>/apps/evolution/calendar/tasks/hide_completed_value</applyto>
- <owner>evolution-calendar</owner>
- <type>int</type>
- <default>1</default>
- <locale name="C">
- <short>Number of units for determining when to hide tasks</short>
- </locale>
- </schema>
-
- <!-- Tasks: Colors -->
-
- <schema>
- <key>/schemas/apps/evolution/calendar/tasks/colors/due_today</key>
- <applyto>/apps/evolution/calendar/tasks/colors/due_today</applyto>
- <owner>evolution-calendar</owner>
- <type>string</type>
- <default>#1e90ff</default>
- <locale name="C">
- <short>Color of tasks that are due today</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/tasks/colors/overdue</key>
- <applyto>/apps/evolution/calendar/tasks/colors/overdue</applyto>
- <owner>evolution-calendar</owner>
- <type>string</type>
- <default>#ff0000</default>
- <locale name="C">
- <short>Color of tasks that are overdue</short>
- </locale>
- </schema>
-
- <!-- Miscellaneous -->
-
- <schema>
- <key>/schemas/apps/evolution/calendar/prompts/confirm_delete</key>
- <applyto>/apps/evolution/calendar/prompts/confirm_delete</applyto>
- <owner>evolution-calendar</owner>
- <type>bool</type>
- <default>true</default>
- <locale name="C">
- <short>Whether to ask for confirmation on appointment deletion</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/prompts/confirm_expunge</key>
- <applyto>/apps/evolution/calendar/prompts/confirm_expunge</applyto>
- <owner>evolution-calendar</owner>
- <type>bool</type>
- <default>true</default>
- <locale name="C">
- <short>Whether to ask for confirmation when folder is expunged</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/other/use_default_reminder</key>
- <applyto>/apps/evolution/calendar/other/use_default_reminder</applyto>
- <owner>evolution-calendar</owner>
- <type>bool</type>
- <default>false</default>
- <locale name="C">
- <short>Whether to set a default reminder for events</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/other/default_reminder_interval</key>
- <applyto>/apps/evolution/calendar/other/default_reminder_interval</applyto>
- <owner>evolution-calendar</owner>
- <type>int</type>
- <default>15</default>
- <locale name="C">
- <short>Number of units for default reminder</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/other/default_reminder_units</key>
- <applyto>/apps/evolution/calendar/other/default_reminder_units</applyto>
- <owner>evolution-calendar</owner>
- <type>string</type>
- <default></default>
- <locale name="C">
- <short>Units of default reminder</short>
- </locale>
- </schema>
-
- <!-- Date navigator -->
-
- <schema>
- <key>/schemas/apps/evolution/calendar/date_navigator/show_week_numbers</key>
- <applyto>/apps/evolution/calendar/date_navigator/show_week_numbers</applyto>
- <owner>evolution-calendar</owner>
- <type>bool</type>
- <default>false</default>
- <locale name="C">
- <short>Whether to show week numbers in date navigator</short>
- </locale>
- </schema>
-
- <!-- Alarm notification -->
-
- <schema>
- <key>/schemas/apps/evolution/calendar/notify/last_notification_time</key>
- <applyto>/apps/evolution/calendar/notify/last_notification_time</applyto>
- <owner>evolution-calendar</owner>
- <type>int</type>
- <default>-1</default>
- <locale name="C">
- <short>Time last alarm ran</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/notify/calendars</key>
- <applyto>/apps/evolution/calendar/notify/calendars</applyto>
- <owner>evolution-calendar</owner>
- <type>list</type>
- <list_type>string</list_type>
- <default>[]</default>
- <locale name="C">
- <short>Calendars to run alarms for</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/notify/programs</key>
- <applyto>/apps/evolution/calendar/notify/programs</applyto>
- <owner>evolution-calendar</owner>
- <type>list</type>
- <list_type>string</list_type>
- <default>[]</default>
- <locale name="C">
- <short>Programs that can run as part of alarms</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/notify/notify_with_tray</key>
- <applyto>/apps/evolution/calendar/notify/notify_with_tray</applyto>
- <owner>evolution-calendar</owner>
- <type>bool</type>
- <default>false</default>
- <locale name="C">
- <short>Whether or not to use the notification tray for display alarms</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/publish/uris</key>
- <applyto>/apps/evolution/calendar/publish/uris</applyto>
- <owner>evolution-calendar</owner>
- <type>list</type>
- <list_type>string</list_type>
- <default>[]</default>
- <locale name="C">
- <short>List of urls for free/busy publishing</short>
- </locale>
- </schema>
-
- <schema>
- <key>/schemas/apps/evolution/calendar/publish/template</key>
- <applyto>/apps/evolution/calendar/publish/template</applyto>
- <owner>evolution-calendar</owner>
- <type>string</type>
- <locale name="C">
- <short>The url template to use as a free/busy data fallback</short>
- </locale>
- </schema>
- </schemalist>
-</gconfschemafile>
diff --git a/calendar/gui/cal-search-bar.c b/calendar/gui/cal-search-bar.c
deleted file mode 100644
index 962b7e5eca..0000000000
--- a/calendar/gui/cal-search-bar.c
+++ /dev/null
@@ -1,524 +0,0 @@
-/* Evolution calendar - Search bar widget for calendar views
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <glib.h>
-#include <gtk/gtkmenu.h>
-#include <gtk/gtkmenuitem.h>
-#include <gtk/gtkoptionmenu.h>
-#include <gtk/gtksignal.h>
-#include <libgnome/gnome-i18n.h>
-#include "cal-search-bar.h"
-
-
-/* IDs and option items for the ESearchBar */
-enum {
- SEARCH_ANY_FIELD_CONTAINS,
- SEARCH_SUMMARY_CONTAINS,
- SEARCH_DESCRIPTION_CONTAINS,
- SEARCH_COMMENT_CONTAINS,
- SEARCH_LOCATION_CONTAINS,
- SEARCH_CATEGORY_IS
-};
-
-/* Comments are disabled because they are kind of useless right now, see bug 33247 */
-static ESearchBarItem search_option_items[] = {
- { N_("Any field contains"), SEARCH_ANY_FIELD_CONTAINS, NULL },
- { N_("Summary contains"), SEARCH_SUMMARY_CONTAINS, NULL },
- { N_("Description contains"), SEARCH_DESCRIPTION_CONTAINS, NULL },
- { N_("Comment contains"), SEARCH_COMMENT_CONTAINS, NULL },
- { N_("Location contains"), SEARCH_LOCATION_CONTAINS, NULL },
- { N_("Category is"), SEARCH_CATEGORY_IS, NULL },
-};
-
-/* IDs for the categories suboptions */
-#define CATEGORIES_ALL 0
-#define CATEGORIES_UNMATCHED 1
-#define CATEGORIES_OFFSET 3
-
-/* Private part of the CalSearchBar structure */
-struct CalSearchBarPrivate {
- /* Array of categories */
- GPtrArray *categories;
-};
-
-static void cal_search_bar_destroy (GtkObject *object);
-
-static void cal_search_bar_search_activated (ESearchBar *search);
-
-/* Signal IDs */
-enum {
- SEXP_CHANGED,
- CATEGORY_CHANGED,
- LAST_SIGNAL
-};
-
-static guint cal_search_bar_signals[LAST_SIGNAL] = { 0 };
-
-G_DEFINE_TYPE (CalSearchBar, cal_search_bar, E_SEARCH_BAR_TYPE);
-
-/* Class initialization function for the calendar search bar */
-static void
-cal_search_bar_class_init (CalSearchBarClass *class)
-{
- ESearchBarClass *e_search_bar_class;
- GtkObjectClass *object_class;
-
- e_search_bar_class = (ESearchBarClass *) class;
- object_class = (GtkObjectClass *) class;
-
- cal_search_bar_signals[SEXP_CHANGED] =
- gtk_signal_new ("sexp_changed",
- GTK_RUN_FIRST,
- G_TYPE_FROM_CLASS (object_class),
- GTK_SIGNAL_OFFSET (CalSearchBarClass, sexp_changed),
- gtk_marshal_NONE__STRING,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_STRING);
-
- cal_search_bar_signals[CATEGORY_CHANGED] =
- gtk_signal_new ("category_changed",
- GTK_RUN_FIRST,
- G_TYPE_FROM_CLASS (object_class),
- GTK_SIGNAL_OFFSET (CalSearchBarClass, category_changed),
- gtk_marshal_NONE__STRING,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_STRING);
-
- class->sexp_changed = NULL;
- class->category_changed = NULL;
-
- e_search_bar_class->search_activated = cal_search_bar_search_activated;
-
- object_class->destroy = cal_search_bar_destroy;
-}
-
-/* Object initialization function for the calendar search bar */
-static void
-cal_search_bar_init (CalSearchBar *cal_search)
-{
- CalSearchBarPrivate *priv;
-
- priv = g_new (CalSearchBarPrivate, 1);
- cal_search->priv = priv;
-
- priv->categories = g_ptr_array_new ();
- g_ptr_array_set_size (priv->categories, 0);
-}
-
-/* Frees an array of categories */
-static void
-free_categories (GPtrArray *categories)
-{
- int i;
-
- for (i = 0; i < categories->len; i++) {
- g_assert (categories->pdata[i] != NULL);
- g_free (categories->pdata[i]);
- }
-
- g_ptr_array_free (categories, TRUE);
-}
-
-/* Destroy handler for the calendar search bar */
-static void
-cal_search_bar_destroy (GtkObject *object)
-{
- CalSearchBar *cal_search;
- CalSearchBarPrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_CAL_SEARCH_BAR (object));
-
- cal_search = CAL_SEARCH_BAR (object);
- priv = cal_search->priv;
-
- if (priv) {
- if (priv->categories) {
- free_categories (priv->categories);
- priv->categories = NULL;
- }
-
- g_free (priv);
- cal_search->priv = NULL;
- }
-
- if (GTK_OBJECT_CLASS (cal_search_bar_parent_class)->destroy)
- (* GTK_OBJECT_CLASS (cal_search_bar_parent_class)->destroy) (object);
-}
-
-
-
-/* Emits the "sexp_changed" signal for the calendar search bar */
-static void
-notify_sexp_changed (CalSearchBar *cal_search, const char *sexp)
-{
- gtk_signal_emit (GTK_OBJECT (cal_search), cal_search_bar_signals[SEXP_CHANGED],
- sexp);
-}
-
-/* Returns the string of the currently selected category, NULL for "Unmatched",
- * or (const char *) 1 for "All".
- */
-static const char *
-get_current_category (CalSearchBar *cal_search)
-{
- CalSearchBarPrivate *priv;
- int id, subid;
-
- priv = cal_search->priv;
-
- g_assert (priv->categories != NULL);
-
- id = e_search_bar_get_item_id (E_SEARCH_BAR (cal_search));
- if (id != SEARCH_CATEGORY_IS)
- return NULL;
-
- subid = e_search_bar_get_subitem_id (E_SEARCH_BAR (cal_search));
- if (subid == CATEGORIES_ALL)
- return (const char *) 1;
- else if (subid == CATEGORIES_UNMATCHED)
- return NULL;
- else {
- int i;
-
- i = subid - CATEGORIES_OFFSET;
- g_assert (i >= 0 && i < priv->categories->len);
-
- return priv->categories->pdata[i];
- }
-}
-
-/* Sets the query string to be (contains? "field" "text") */
-static void
-notify_e_cal_view_contains (CalSearchBar *cal_search, const char *field)
-{
- char *text;
- char *sexp;
-
- text = e_search_bar_get_text (E_SEARCH_BAR (cal_search));
- if (!text)
- return; /* This is an error in the UTF8 conversion, not an empty string! */
-
- sexp = g_strdup_printf ("(contains? \"%s\" \"%s\")", field, text);
- g_free (text);
-
- notify_sexp_changed (cal_search, sexp);
- g_free (sexp);
-}
-
-/* Returns a sexp for the selected category in the drop-down menu. The "All"
- * option is returned as (const char *) 1, and the "Unfiled" option is returned
- * as NULL.
- */
-static char *
-get_category_sexp (CalSearchBar *cal_search)
-{
- const char *category;
-
- category = get_current_category (cal_search);
-
- if (category == NULL)
- return g_strdup ("(has-categories? #f)"); /* Unfiled items */
- else if (category == (const char *) 1)
- return NULL; /* All items */
- else
- return g_strdup_printf ("(has-categories? \"%s\")", category); /* Specific category */
-}
-
-/* Sets the query string to the appropriate match for categories */
-static void
-notify_category_is (CalSearchBar *cal_search)
-{
- char *sexp;
-
- sexp = get_category_sexp (cal_search);
- if (!sexp)
- notify_sexp_changed (cal_search, "#t"); /* Match all */
- else
- notify_sexp_changed (cal_search, sexp);
-
- if (sexp)
- g_free (sexp);
-}
-
-/* Creates a new query from the values in the widgets and notifies upstream */
-static void
-regen_query (CalSearchBar *cal_search)
-{
- CalSearchBarPrivate *priv;
- int id;
- const char *category;
-
- priv = cal_search->priv;
-
- /* Fetch the data from the ESearchBar's entry widgets */
-
- id = e_search_bar_get_item_id (E_SEARCH_BAR (cal_search));
-
- /* Generate the different types of queries */
-
- switch (id) {
- case SEARCH_ANY_FIELD_CONTAINS:
- notify_e_cal_view_contains (cal_search, "any");
- break;
-
- case SEARCH_SUMMARY_CONTAINS:
- notify_e_cal_view_contains (cal_search, "summary");
- break;
-
- case SEARCH_DESCRIPTION_CONTAINS:
- notify_e_cal_view_contains (cal_search, "description");
- break;
-
- case SEARCH_COMMENT_CONTAINS:
- notify_e_cal_view_contains (cal_search, "comment");
- break;
-
- case SEARCH_LOCATION_CONTAINS:
- notify_e_cal_view_contains (cal_search, "location");
- break;
-
- case SEARCH_CATEGORY_IS:
- notify_category_is (cal_search);
-
- category = cal_search_bar_get_category (cal_search);
- gtk_signal_emit (GTK_OBJECT (cal_search), cal_search_bar_signals[CATEGORY_CHANGED],
- category);
- break;
-
- default:
- g_assert_not_reached ();
- }
-}
-
-/* search_activated handler for the calendar search bar */
-static void
-cal_search_bar_search_activated (ESearchBar *search)
-{
- CalSearchBar *cal_search;
-
- cal_search = CAL_SEARCH_BAR (search);
- regen_query (cal_search);
-}
-
-
-
-/* Creates the suboptions menu for the ESearchBar with the list of categories */
-static void
-make_suboptions (CalSearchBar *cal_search)
-{
- CalSearchBarPrivate *priv;
- ESearchBarSubitem *subitems;
- int i;
-
- priv = cal_search->priv;
-
- g_assert (priv->categories != NULL);
-
- /* Categories plus "all", "unmatched", separator, terminator */
- subitems = g_new (ESearchBarSubitem, priv->categories->len + 3 + 1);
-
- /* All, unmatched, separator */
-
- subitems[0].text = _("Any Category");
- subitems[0].id = CATEGORIES_ALL;
- subitems[0].translate = FALSE;
-
- subitems[1].text = _("Unmatched");
- subitems[1].id = CATEGORIES_UNMATCHED;
- subitems[1].translate = FALSE;
-
- /* All the other items */
-
- if (priv->categories->len > 0) {
- subitems[2].text = NULL; /* separator */
- subitems[2].id = 0;
-
- for (i = 0; i < priv->categories->len; i++) {
- const char *category;
- char *str;
-
- category = priv->categories->pdata[i];
- str = g_strdup (category ? category : "");
-
- subitems[i + CATEGORIES_OFFSET].text = str;
- subitems[i + CATEGORIES_OFFSET].id = i + CATEGORIES_OFFSET;
- subitems[i + CATEGORIES_OFFSET].translate = FALSE;
- }
-
- subitems[i + CATEGORIES_OFFSET].id = -1; /* terminator */
- } else
- subitems[2].id = -1; /* terminator */
-
- e_search_bar_set_suboption (E_SEARCH_BAR (cal_search), SEARCH_CATEGORY_IS, subitems);
-
- /* Free the strings */
- for (i = 0; i < priv->categories->len; i++)
- g_free (subitems[i + CATEGORIES_OFFSET].text);
-
- g_free (subitems);
-}
-
-/**
- * cal_search_bar_construct:
- * @cal_search: A calendar search bar.
- * @flags: bitfield of items to appear in the search menu
- *
- * Constructs a calendar search bar by binding its menu and option items.
- *
- * Return value: The same value as @cal_search.
- **/
-CalSearchBar *
-cal_search_bar_construct (CalSearchBar *cal_search, guint32 flags)
-{
- ESearchBarItem *items;
- guint32 bit = 0x1;
- int i, j;
-
- g_return_val_if_fail (IS_CAL_SEARCH_BAR (cal_search), NULL);
-
- items = g_alloca ((G_N_ELEMENTS (search_option_items) + 1) * sizeof (ESearchBarItem));
- for (i = 0, j = 0; i < G_N_ELEMENTS (search_option_items); i++, bit <<= 1) {
- if ((flags & bit) != 0) {
- items[j].text = search_option_items[i].text;
- items[j].id = search_option_items[i].id;
- items[j].subitems = search_option_items[i].subitems;
- j++;
- }
- }
-
- items[j].text = NULL;
- items[j].id = -1;
- items[j].subitems = NULL;
-
- e_search_bar_construct (E_SEARCH_BAR (cal_search), NULL, items);
- make_suboptions (cal_search);
-
- e_search_bar_set_ids (E_SEARCH_BAR (cal_search), SEARCH_CATEGORY_IS, CATEGORIES_ALL);
-
- return cal_search;
-}
-
-/**
- * cal_search_bar_new:
- * flags: bitfield of items to appear in the search menu
- *
- * Creates a new calendar search bar.
- *
- * Return value: A newly-created calendar search bar. You should connect to the
- * "sexp_changed" signal to monitor changes in the generated sexps.
- **/
-GtkWidget *
-cal_search_bar_new (guint32 flags)
-{
- CalSearchBar *cal_search;
-
- cal_search = g_object_new (TYPE_CAL_SEARCH_BAR, NULL);
- return GTK_WIDGET (cal_search_bar_construct (cal_search, flags));
-}
-
-/* Used from qsort() */
-static int
-compare_categories_cb (const void *a, const void *b)
-{
- const char **ca, **cb;
-
- ca = (const char **) a;
- cb = (const char **) b;
-
- /* FIXME: should use some utf8 strcoll() thingy */
- return strcmp (*ca, *cb);
-}
-
-/* Creates a sorted array of categories based on the original one; copies the
- * string values.
- */
-static GPtrArray *
-sort_categories (GPtrArray *categories)
-{
- GPtrArray *c;
- int i;
-
- c = g_ptr_array_new ();
- g_ptr_array_set_size (c, categories->len);
-
- for (i = 0; i < categories->len; i++)
- c->pdata[i] = g_strdup (categories->pdata[i]);
-
- qsort (c->pdata, c->len, sizeof (gpointer), compare_categories_cb);
-
- return c;
-}
-
-/**
- * cal_search_bar_set_categories:
- * @cal_search: A calendar search bar.
- * @categories: Array of pointers to strings for the category names.
- *
- * Sets the list of categories that are to be shown in the drop-down list
- * of a calendar search bar. The search bar will automatically add an item
- * for "unfiled" components, that is, those that have no categories assigned
- * to them.
- **/
-void
-cal_search_bar_set_categories (CalSearchBar *cal_search, GPtrArray *categories)
-{
- CalSearchBarPrivate *priv;
-
- g_return_if_fail (IS_CAL_SEARCH_BAR (cal_search));
- g_return_if_fail (categories != NULL);
-
- priv = cal_search->priv;
-
- g_assert (priv->categories != NULL);
- free_categories (priv->categories);
-
- priv->categories = sort_categories (categories);
- make_suboptions (cal_search);
-}
-
-/**
- * cal_search_bar_get_category:
- * @cal_search: A calendar search bar.
- *
- * Queries the currently selected category name in a calendar search bar.
- * If "All" or "Unfiled" are selected, this function will return NULL.
- *
- * Return value: Name of the selected category, or NULL if there is no
- * selected category.
- **/
-const char *
-cal_search_bar_get_category (CalSearchBar *cal_search)
-{
- const char *category;
-
- category = get_current_category (cal_search);
-
- if (!category || category == (const char *) 1)
- return NULL;
- else
- return category;
-}
diff --git a/calendar/gui/cal-search-bar.h b/calendar/gui/cal-search-bar.h
deleted file mode 100644
index 311dacd606..0000000000
--- a/calendar/gui/cal-search-bar.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Evolution calendar - Search bar widget for calendar views
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef CAL_SEARCH_BAR_H
-#define CAL_SEARCH_BAR_H
-
-#include "widgets/misc/e-search-bar.h"
-#include "widgets/misc/e-filter-bar.h"
-
-G_BEGIN_DECLS
-
-
-
-#define TYPE_CAL_SEARCH_BAR (cal_search_bar_get_type ())
-#define CAL_SEARCH_BAR(obj) (GTK_CHECK_CAST ((obj), TYPE_CAL_SEARCH_BAR, CalSearchBar))
-#define CAL_SEARCH_BAR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_CAL_SEARCH_BAR, \
- CalSearchBarClass))
-#define IS_CAL_SEARCH_BAR(obj) (GTK_CHECK_TYPE ((obj), TYPE_CAL_SEARCH_BAR))
-#define IS_CAL_SEARCH_BAR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), TYPE_CAL_SEARCH_BAR))
-
-typedef struct CalSearchBarPrivate CalSearchBarPrivate;
-
-enum {
- CAL_SEARCH_ANY_FIELD_CONTAINS = (1 << 0),
- CAL_SEARCH_SUMMARY_CONTAINS = (1 << 1),
- CAL_SEARCH_DESCRIPTION_CONTAINS = (1 << 2),
- CAL_SEARCH_COMMENT_CONTAINS = (1 << 3),
- CAL_SEARCH_LOCATION_CONTAINS = (1 << 4),
- CAL_SEARCH_CATEGORY_IS = (1 << 5)
-};
-
-#define CAL_SEARCH_ALL (0xff)
-#define CAL_SEARCH_CALENDAR_DEFAULT (0x37)
-#define CAL_SEARCH_TASKS_DEFAULT (0x27)
-
-typedef struct {
- ESearchBar search_bar;
-
- /* Private data */
- CalSearchBarPrivate *priv;
-} CalSearchBar;
-
-typedef struct {
- ESearchBarClass parent_class;
-
- /* Notification signals */
-
- void (* sexp_changed) (CalSearchBar *cal_search, const char *sexp);
- void (* category_changed) (CalSearchBar *cal_search, const char *category);
-} CalSearchBarClass;
-
-GtkType cal_search_bar_get_type (void);
-
-CalSearchBar *cal_search_bar_construct (CalSearchBar *cal_search, guint32 flags);
-
-GtkWidget *cal_search_bar_new (guint32 flags);
-
-void cal_search_bar_set_categories (CalSearchBar *cal_search, GPtrArray *categories);
-
-const char *cal_search_bar_get_category (CalSearchBar *cal_search);
-
-
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/calendar-commands.c b/calendar/gui/calendar-commands.c
deleted file mode 100644
index 8cf9849f7d..0000000000
--- a/calendar/gui/calendar-commands.c
+++ /dev/null
@@ -1,712 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution calendar - Commands for the calendar GUI control
- *
- * Copyright (C) 1998 The Free Software Foundation
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: Miguel de Icaza <miguel@ximian.com>
- * Federico Mena-Quintero <federico@ximian.com>
- * Seth Alves <alves@hungry.com>
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <pwd.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gtk/gtkfilesel.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkmain.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkspinbutton.h>
-#include <gtk/gtkmessagedialog.h>
-#include <libgnome/gnome-util.h>
-#include <libgnomeui/gnome-dialog-util.h>
-#include <libgnomeui/gnome-messagebox.h>
-#include <libgnomeui/gnome-stock-icons.h>
-#include <libgnome/gnome-util.h>
-#include <libgnome/gnome-i18n.h>
-#include <bonobo/bonobo-ui-util.h>
-#include <bonobo/bonobo-exception.h>
-#include <libecal/e-cal-time-util.h>
-#include "shell/Evolution.h"
-#include "calendar-commands.h"
-#include "calendar-config.h"
-#include "e-day-view.h"
-#include "e-week-view.h"
-#include "gnome-cal.h"
-#include "goto.h"
-#include "print.h"
-#include "dialogs/cal-prefs-dialog.h"
-#include "itip-utils.h"
-#include "e-pub-utils.h"
-#include "e-cal-list-view.h"
-#include "evolution-shell-component-utils.h"
-#include "e-util/e-icon-factory.h"
-#include "e-cal-menu.h"
-
-/* Focusing information for the calendar view. We have to keep track of this
- * ourselves because with Bonobo controls, we may get unpaired focus_out events.
- */
-typedef struct {
- guint calendar_focused : 1;
- guint taskpad_focused : 1;
-} FocusData;
-
-static void
-file_open_event_cb (BonoboUIComponent *uic, gpointer data, const char *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- e_calendar_view_open_event (E_CALENDAR_VIEW (gnome_calendar_get_current_view_widget (gcal)));
-}
-
-
-/* Prints the calendar at its current view and time range */
-static void
-print (GnomeCalendar *gcal, gboolean preview)
-{
- time_t start;
- GnomeCalendarViewType view_type;
- PrintView print_view;
- ECalListView *list_view;
- ETable *etable;
-
- gnome_calendar_get_current_time_range (gcal, &start, NULL);
- view_type = gnome_calendar_get_view (gcal);
-
- switch (view_type) {
- case GNOME_CAL_DAY_VIEW:
- print_view = PRINT_VIEW_DAY;
- break;
-
- case GNOME_CAL_WORK_WEEK_VIEW:
- case GNOME_CAL_WEEK_VIEW:
- print_view = PRINT_VIEW_WEEK;
- break;
-
- case GNOME_CAL_MONTH_VIEW:
- print_view = PRINT_VIEW_MONTH;
- break;
-
- case GNOME_CAL_LIST_VIEW:
- list_view = E_CAL_LIST_VIEW (gnome_calendar_get_current_view_widget (gcal));
- etable = e_table_scrolled_get_table (list_view->table_scrolled);
- print_table (etable, _("Print"), _("Calendar"), preview);
- return;
-
- default:
- g_assert_not_reached ();
- return;
- }
-
- print_calendar (gcal, preview, start, print_view);
-}
-
-/* File/Print callback */
-static void
-file_print_cb (BonoboUIComponent *uic, gpointer data, const char *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
- print (gcal, FALSE);
-}
-
-static void
-file_print_preview_cb (BonoboUIComponent *uic, gpointer data, const char *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
- print (gcal, TRUE);
-}
-
-/* Sets a clock cursor for the specified calendar window */
-static void
-set_clock_cursor (GnomeCalendar *gcal)
-{
- GdkCursor *cursor;
-
- cursor = gdk_cursor_new (GDK_WATCH);
- gdk_window_set_cursor (GTK_WIDGET (gcal)->window, cursor);
- gdk_cursor_destroy (cursor);
- gdk_flush ();
-}
-
-/* Resets the normal cursor for the specified calendar window */
-static void
-set_normal_cursor (GnomeCalendar *gcal)
-{
- gdk_window_set_cursor (GTK_WIDGET (gcal)->window, NULL);
- gdk_flush ();
-}
-
-static void
-previous_clicked (BonoboUIComponent *uic, gpointer data, const char *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- set_clock_cursor (gcal);
- gnome_calendar_previous (gcal);
- set_normal_cursor (gcal);
-}
-
-static void
-next_clicked (BonoboUIComponent *uic, gpointer data, const char *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- set_clock_cursor (gcal);
- gnome_calendar_next (gcal);
- set_normal_cursor (gcal);
-}
-
-void
-calendar_goto_today (GnomeCalendar *gcal)
-{
- set_clock_cursor (gcal);
- gnome_calendar_goto_today (gcal);
- set_normal_cursor (gcal);
-}
-
-static void
-today_clicked (BonoboUIComponent *uic, gpointer data, const char *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- calendar_goto_today (gcal);
-}
-
-static void
-goto_clicked (BonoboUIComponent *uic, gpointer data, const char *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- goto_dialog (gcal);
-}
-
-static void
-show_day_view_clicked (BonoboUIComponent *uic, gpointer data, const char *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- gnome_calendar_set_view (gcal, GNOME_CAL_DAY_VIEW);
-}
-
-static void
-show_work_week_view_clicked (BonoboUIComponent *uic, gpointer data, const char *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- gnome_calendar_set_view (gcal, GNOME_CAL_WORK_WEEK_VIEW);
-}
-
-static void
-show_week_view_clicked (BonoboUIComponent *uic, gpointer data, const char *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- gnome_calendar_set_view (gcal, GNOME_CAL_WEEK_VIEW);
-}
-
-static void
-show_month_view_clicked (BonoboUIComponent *uic, gpointer data, const char *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- gnome_calendar_set_view (gcal, GNOME_CAL_MONTH_VIEW);
-}
-
-
-static void
-show_list_view_clicked (BonoboUIComponent *uic, gpointer data, const char *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- gnome_calendar_set_view (gcal, GNOME_CAL_LIST_VIEW);
-}
-
-
-static void
-cut_cmd (BonoboUIComponent *uic, gpointer data, const gchar *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
- set_clock_cursor (gcal);
- gnome_calendar_cut_clipboard (gcal);
- set_normal_cursor (gcal);
-}
-
-static void
-copy_cmd (BonoboUIComponent *uic, gpointer data, const gchar *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- set_clock_cursor (gcal);
- gnome_calendar_copy_clipboard (gcal);
- set_normal_cursor (gcal);
-}
-
-static void
-paste_cmd (BonoboUIComponent *uic, gpointer data, const gchar *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- set_clock_cursor (gcal);
- gnome_calendar_paste_clipboard (gcal);
- set_normal_cursor (gcal);
-}
-
-static void
-delete_cmd (BonoboUIComponent *uic, gpointer data, const gchar *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- set_clock_cursor (gcal);
- gnome_calendar_delete_selection (gcal);
- set_normal_cursor (gcal);
-}
-
-static void
-delete_occurrence_cmd (BonoboUIComponent *uic, gpointer data, const gchar *path)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- set_clock_cursor (gcal);
- gnome_calendar_delete_selected_occurrence (gcal);
- set_normal_cursor (gcal);
-}
-
-static void
-publish_freebusy_cmd (BonoboUIComponent *uic, gpointer data, const gchar *path)
-{
- e_pub_publish (TRUE);
-}
-
-static void
-purge_cmd (BonoboUIComponent *uic, gpointer data, const gchar *path)
-{
- GnomeCalendar *gcal;
- GtkWidget *dialog, *parent, *box, *label, *spin;
- int response;
-
- gcal = GNOME_CALENDAR (data);
-
- /* create the dialog */
- parent = gtk_widget_get_toplevel (GTK_WIDGET (gcal));
- dialog = gtk_message_dialog_new (
- (GtkWindow *)parent,
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_WARNING,
- GTK_BUTTONS_OK_CANCEL,
- _("This operation will permanently erase all events older than the selected amount of time. If you continue, you will not be able to recover these events."));
- gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL);
-
- box = gtk_hbox_new (FALSE, 6);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), box, TRUE, FALSE, 6);
-
- label = gtk_label_new (_("Purge events older than"));
- gtk_box_pack_start (GTK_BOX (box), label, TRUE, FALSE, 6);
- spin = gtk_spin_button_new_with_range (0.0, 1000.0, 1.0);
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 60.0);
- gtk_box_pack_start (GTK_BOX (box), spin, FALSE, FALSE, 6);
- label = gtk_label_new (_("days"));
- gtk_box_pack_start (GTK_BOX (box), label, TRUE, FALSE, 6);
-
- gtk_widget_show_all (box);
-
- /* run the dialog */
- response = gtk_dialog_run (GTK_DIALOG (dialog));
- if (response == GTK_RESPONSE_OK) {
- gint days;
- time_t tt;
-
- days = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
- tt = time (NULL);
- tt -= (days * (24 * 3600));
-
- gnome_calendar_purge (gcal, tt);
- }
-
- gtk_widget_destroy (dialog);
-}
-
-struct _sensitize_item {
- char *command;
- guint32 enable;
-};
-
-static void
-sensitize_items(BonoboUIComponent *uic, struct _sensitize_item *items, guint32 mask)
-{
- while (items->command) {
- char command[32];
-
- g_assert(strlen(items->command)<21);
- sprintf(command, "/commands/%s", items->command);
-
- bonobo_ui_component_set_prop (uic, command, "sensitive",
- (items->enable & mask) == 0 ? "1" : "0",
- NULL);
- items++;
- }
-}
-
-static struct _sensitize_item calendar_sensitize_table[] = {
- { "EventOpen", E_CAL_MENU_SELECT_ONE },
- { "Cut", E_CAL_MENU_SELECT_EDITABLE },
- { "Copy", E_CAL_MENU_SELECT_ANY },
- { "Paste", E_CAL_MENU_SELECT_EDITABLE },
- { "Delete", E_CAL_MENU_SELECT_EDITABLE|E_CAL_MENU_SELECT_NONRECURRING },
- { "DeleteOccurrence", E_CAL_MENU_SELECT_EDITABLE|E_CAL_MENU_SELECT_RECURRING },
- { "DeleteAllOccurrences", E_CAL_MENU_SELECT_EDITABLE|E_CAL_MENU_SELECT_RECURRING },
- { 0 }
-};
-
-/* Sensitizes the UI Component menu/toolbar calendar commands based on the
- * number of selected events. (This will always be 0 or 1 currently.) If enable
- * is FALSE, all will be disabled. Otherwise, the currently-selected number of
- * events will be used.
- */
-void
-calendar_control_sensitize_calendar_commands (BonoboControl *control, GnomeCalendar *gcal, gboolean enable)
-{
- BonoboUIComponent *uic;
- GtkWidget *view;
- ECalMenu *menu;
- ECalModel *model;
- GPtrArray *events;
- GList *selected, *l;
- ECalMenuTargetSelect *t;
-
- uic = bonobo_control_get_ui_component (control);
- g_assert (uic != NULL);
-
- if (bonobo_ui_component_get_container (uic) == CORBA_OBJECT_NIL)
- return;
-
- view = gnome_calendar_get_current_view_widget (gcal);
-
- menu = gnome_calendar_get_calendar_menu (gcal);
- model = e_calendar_view_get_model((ECalendarView *)view);
- events = g_ptr_array_new();
- selected = e_calendar_view_get_selected_events((ECalendarView *)view);
- for (l=selected;l;l=g_list_next(l)) {
- ECalendarViewEvent *event = l->data;
- if (event && event->comp_data)
- g_ptr_array_add (events, e_cal_model_copy_component_data(event->comp_data));
- }
- g_list_free(selected);
-
- t = e_cal_menu_target_new_select(menu, model, events);
- if (!enable)
- t->target.mask = ~0;
-
- sensitize_items(uic, calendar_sensitize_table, t->target.mask);
-#if 0
- /* retrieve read-onlyness of the default client */
- e_cal = e_cal_model_get_default_client (gnome_calendar_get_calendar_model (gcal));
- if (e_cal)
- e_cal_is_read_only (e_cal, &default_read_only, NULL);
- else
- default_read_only = TRUE;
-#endif
-
- e_menu_update_target((EMenu *)menu, (EMenuTarget *)t);
-}
-
-static struct _sensitize_item taskpad_sensitize_table[] = {
- { "Cut", E_CAL_MENU_SELECT_EDITABLE },
- { "Copy", E_CAL_MENU_SELECT_ANY },
- { "Paste", E_CAL_MENU_SELECT_EDITABLE },
- { "Delete", E_CAL_MENU_SELECT_EDITABLE },
- { 0 }
-};
-
-/* Sensitizes the UI Component menu/toolbar tasks commands based on the number
- * of selected tasks. If enable is FALSE, all will be disabled. Otherwise, the
- * currently-selected number of tasks will be used.
- */
-static void
-sensitize_taskpad_commands (GnomeCalendar *gcal, BonoboControl *control, gboolean enable)
-{
- BonoboUIComponent *uic;
- ECalendarTable *task_pad;
- ECalModel *model;
- GSList *selected, *l;
- ECalMenu *menu;
- GPtrArray *events;
- ECalMenuTargetSelect *t;
-
- uic = bonobo_control_get_ui_component (control);
- g_assert (uic != NULL);
-
- menu = gnome_calendar_get_calendar_menu (gcal);
- task_pad = gnome_calendar_get_task_pad(gcal);
- model = e_calendar_table_get_model (task_pad);
- selected = e_calendar_table_get_selected(task_pad);
- events = g_ptr_array_new();
- for (l=selected;l;l=g_slist_next(l))
- g_ptr_array_add(events, e_cal_model_copy_component_data((ECalModelComponent *)l->data));
- g_slist_free(selected);
-
- t = e_cal_menu_target_new_select(menu, model, events);
- if (!enable)
- t->target.mask = ~0;
-
- sensitize_items(uic, taskpad_sensitize_table, t->target.mask);
-}
-
-/* Callback used when the selection in the calendar views changes */
-static void
-gcal_calendar_selection_changed_cb (GnomeCalendar *gcal, gpointer data)
-{
- BonoboControl *control;
-
- control = BONOBO_CONTROL (data);
-
- printf("calendar selection changed\n");
-
- calendar_control_sensitize_calendar_commands (control, gcal, TRUE);
-}
-
-/* Callback used when the selection in the taskpad changes */
-static void
-gcal_taskpad_selection_changed_cb (GnomeCalendar *gcal, gpointer data)
-{
- BonoboControl *control;
-
- control = BONOBO_CONTROL (data);
-
- sensitize_taskpad_commands (gcal, control, TRUE);
-}
-
-/* Callback used when the focus changes for a calendar view */
-static void
-gcal_calendar_focus_change_cb (GnomeCalendar *gcal, gboolean in, gpointer data)
-{
- BonoboControl *control;
- FocusData *focus;
-
- control = BONOBO_CONTROL (data);
-
- focus = g_object_get_data (G_OBJECT (control), "focus_data");
- g_assert (focus != NULL);
-
- if (in) {
- g_signal_connect (gcal, "calendar_selection_changed",
- G_CALLBACK (gcal_calendar_selection_changed_cb), control);
- calendar_control_sensitize_calendar_commands (control, gcal, TRUE);
- focus->calendar_focused = TRUE;
- } else if (focus->calendar_focused) {
- gtk_signal_disconnect_by_func (GTK_OBJECT (gcal),
- G_CALLBACK (gcal_calendar_selection_changed_cb),
- control);
- calendar_control_sensitize_calendar_commands (control, gcal, FALSE);
- focus->calendar_focused = FALSE;
- }
-}
-
-/* Callback used when the taskpad focus changes */
-static void
-gcal_taskpad_focus_change_cb (GnomeCalendar *gcal, gboolean in, gpointer data)
-{
- BonoboControl *control;
- FocusData *focus;
-
- control = BONOBO_CONTROL (data);
-
- focus = g_object_get_data (G_OBJECT (control), "focus_data");
- g_assert (focus != NULL);
-
- if (in) {
- g_signal_connect (gcal, "taskpad_selection_changed",
- G_CALLBACK (gcal_taskpad_selection_changed_cb), control);
- sensitize_taskpad_commands (gcal, control, TRUE);
- focus->taskpad_focused = TRUE;
- } else if (focus->taskpad_focused) {
- /* With Bonobo controls, we may get unpaired focus_out events.
- * That is why we have to keep track of this ourselves instead
- * of blindly assumming that we are getting this event because
- * the taskpad was in fact focused.
- */
- gtk_signal_disconnect_by_func (GTK_OBJECT (gcal),
- G_CALLBACK (gcal_taskpad_selection_changed_cb),
- control);
- sensitize_taskpad_commands (gcal, control, FALSE);
- focus->taskpad_focused = FALSE;
- }
-
-}
-
-
-static BonoboUIVerb verbs [] = {
- BONOBO_UI_VERB ("EventOpen", file_open_event_cb),
- BONOBO_UI_VERB ("CalendarPrint", file_print_cb),
- BONOBO_UI_VERB ("CalendarPrintPreview", file_print_preview_cb),
-
- BONOBO_UI_VERB ("Cut", cut_cmd),
- BONOBO_UI_VERB ("Copy", copy_cmd),
- BONOBO_UI_VERB ("Paste", paste_cmd),
- BONOBO_UI_VERB ("Delete", delete_cmd),
- BONOBO_UI_VERB ("DeleteOccurrence", delete_occurrence_cmd),
- BONOBO_UI_VERB ("DeleteAllOccurrences", delete_cmd),
-
- BONOBO_UI_VERB ("CalendarPrev", previous_clicked),
- BONOBO_UI_VERB ("CalendarToday", today_clicked),
- BONOBO_UI_VERB ("CalendarNext", next_clicked),
- BONOBO_UI_VERB ("CalendarGoto", goto_clicked),
-
- BONOBO_UI_VERB ("ShowDayView", show_day_view_clicked),
- BONOBO_UI_VERB ("ShowWorkWeekView", show_work_week_view_clicked),
- BONOBO_UI_VERB ("ShowWeekView", show_week_view_clicked),
- BONOBO_UI_VERB ("ShowMonthView", show_month_view_clicked),
- BONOBO_UI_VERB ("ShowListView", show_list_view_clicked),
-
- BONOBO_UI_VERB ("PublishFreeBusy", publish_freebusy_cmd),
- BONOBO_UI_VERB ("CalendarPurge", purge_cmd),
-
- BONOBO_UI_VERB_END
-};
-
-static EPixmap pixmaps [] =
-{
- E_PIXMAP ("/Toolbar/DayView", "stock_calendar-view-day", E_ICON_SIZE_LARGE_TOOLBAR),
- E_PIXMAP ("/Toolbar/WorkWeekView", "stock_calendar-view-work-week", E_ICON_SIZE_LARGE_TOOLBAR),
- E_PIXMAP ("/Toolbar/WeekView", "stock_calendar-view-week", E_ICON_SIZE_LARGE_TOOLBAR),
- E_PIXMAP ("/Toolbar/MonthView", "stock_calendar-view-month", E_ICON_SIZE_LARGE_TOOLBAR),
- E_PIXMAP ("/Toolbar/ListView", "stock_calendar-view-list", E_ICON_SIZE_LARGE_TOOLBAR),
-
- E_PIXMAP_END
-};
-
-void
-calendar_control_activate (BonoboControl *control,
- GnomeCalendar *gcal)
-{
- Bonobo_UIContainer remote_uih;
- BonoboUIComponent *uic;
- FocusData *focus;
-
- uic = bonobo_control_get_ui_component (control);
- g_assert (uic != NULL);
-
- remote_uih = bonobo_control_get_remote_ui_container (control, NULL);
- bonobo_ui_component_set_container (uic, remote_uih, NULL);
- bonobo_object_release_unref (remote_uih, NULL);
-
- gnome_calendar_set_ui_component (gcal, uic);
-
- bonobo_ui_component_add_verb_list_with_data (uic, verbs, gcal);
-
- bonobo_ui_component_freeze (uic, NULL);
-
- bonobo_ui_util_set_ui (uic, PREFIX,
- EVOLUTION_UIDIR "/evolution-calendar.xml",
- "evolution-calendar",
- NULL);
-
- e_pixmaps_update (uic, pixmaps);
-
- gnome_calendar_setup_view_menus (gcal, uic);
-
- g_signal_connect (gcal, "calendar_focus_change",
- G_CALLBACK (gcal_calendar_focus_change_cb), control);
- g_signal_connect (gcal, "taskpad_focus_change",
- G_CALLBACK (gcal_taskpad_focus_change_cb), control);
-
- e_menu_activate((EMenu *)gnome_calendar_get_calendar_menu (gcal), uic, 1);
- e_menu_activate((EMenu *)gnome_calendar_get_taskpad_menu (gcal), uic, 1);
-
- calendar_control_sensitize_calendar_commands (control, gcal, TRUE);
- sensitize_taskpad_commands (gcal, control, TRUE);
-
- bonobo_ui_component_thaw (uic, NULL);
-
- focus = g_new (FocusData, 1);
- focus->calendar_focused = FALSE;
- focus->taskpad_focused = FALSE;
-
- g_object_set_data (G_OBJECT (control), "focus_data", focus);
-}
-
-void
-calendar_control_deactivate (BonoboControl *control, GnomeCalendar *gcal)
-{
- FocusData *focus;
- BonoboUIComponent *uic;
-
- uic = bonobo_control_get_ui_component (control);
- g_assert (uic != NULL);
-
- e_menu_activate((EMenu *)gnome_calendar_get_calendar_menu (gcal), uic, 0);
- e_menu_activate((EMenu *)gnome_calendar_get_taskpad_menu (gcal), uic, 0);
-
- gnome_calendar_set_ui_component (gcal, NULL);
-
- focus = g_object_get_data (G_OBJECT (control), "focus_data");
- g_assert (focus != NULL);
-
- g_object_set_data (G_OBJECT (control), "focus_data", NULL);
- g_free (focus);
-
- gnome_calendar_discard_view_menus (gcal);
-
- g_signal_handlers_disconnect_matched (gcal, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, control);
-
- bonobo_ui_component_rm (uic, "/", NULL);
- bonobo_ui_component_unset_container (uic, NULL);
-}
diff --git a/calendar/gui/calendar-commands.h b/calendar/gui/calendar-commands.h
deleted file mode 100644
index 36b06f1ebb..0000000000
--- a/calendar/gui/calendar-commands.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Evolution calendar - Commands for the calendar GUI control
- *
- * Copyright (C) 1998 The Free Software Foundation
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: Miguel de Icaza <miguel@ximian.com>
- * Federico Mena-Quintero <federico@ximian.com>
- * Seth Alves <alves@hungry.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef CALENDAR_COMMANDS_H
-#define CALENDAR_COMMANDS_H
-
-#include "gnome-cal.h"
-
-#include <bonobo/bonobo-control.h>
-#include <bonobo/bonobo-ui-component.h>
-
-void calendar_control_activate (BonoboControl *control, GnomeCalendar *gcal);
-void calendar_control_deactivate (BonoboControl *control, GnomeCalendar *gcal);
-
-void calendar_control_sensitize_calendar_commands (BonoboControl *control, GnomeCalendar *gcal, gboolean enable);
-
-void calendar_goto_today (GnomeCalendar *gcal);
-
-#endif /* CALENDAR_COMMANDS_H */
diff --git a/calendar/gui/calendar-component.c b/calendar/gui/calendar-component.c
deleted file mode 100644
index 2f641bcd4b..0000000000
--- a/calendar/gui/calendar-component.c
+++ /dev/null
@@ -1,1546 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* calendar-component.c
- *
- * Copyright (C) 2003 Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Authors: Ettore Perazzoli <ettore@ximian.com>
- * Rodrigo Moya <rodrigo@ximian.com>
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <errno.h>
-#include <bonobo/bonobo-control.h>
-#include <bonobo/bonobo-i18n.h>
-#include <bonobo/bonobo-exception.h>
-#include <libical/icalvcal.h>
-#include <libedataserver/e-url.h>
-#include <libecal/e-cal-time-util.h>
-#include <libedataserverui/e-source-selector.h>
-#include <shell/e-user-creatable-items-handler.h>
-#include "e-pub-utils.h"
-#include "e-calendar-view.h"
-#include "calendar-config-keys.h"
-#include "calendar-config.h"
-#include "calendar-component.h"
-#include "calendar-commands.h"
-#include "control-factory.h"
-#include "gnome-cal.h"
-#include "migration.h"
-#include "e-comp-editor-registry.h"
-#include "comp-util.h"
-#include "common/authentication.h"
-#include "dialogs/calendar-setup.h"
-#include "dialogs/comp-editor.h"
-#include "dialogs/copy-source-dialog.h"
-#include "dialogs/event-editor.h"
-#include "widgets/misc/e-info-label.h"
-#include "widgets/misc/e-error.h"
-#include "e-util/e-icon-factory.h"
-#include "e-cal-menu.h"
-#include "e-cal-popup.h"
-
-/* IDs for user creatable items */
-#define CREATE_EVENT_ID "event"
-#define CREATE_MEETING_ID "meeting"
-#define CREATE_ALLDAY_EVENT_ID "allday-event"
-#define CREATE_CALENDAR_ID "calendar"
-
-enum DndTargetType {
- DND_TARGET_TYPE_CALENDAR_LIST,
-};
-#define CALENDAR_TYPE "text/calendar"
-#define XCALENDAR_TYPE "text/x-calendar"
-static GtkTargetEntry drag_types[] = {
- { CALENDAR_TYPE, 0, DND_TARGET_TYPE_CALENDAR_LIST },
- { XCALENDAR_TYPE, 0, DND_TARGET_TYPE_CALENDAR_LIST }
-};
-static gint num_drag_types = sizeof(drag_types) / sizeof(drag_types[0]);
-
-#define PARENT_TYPE bonobo_object_get_type ()
-static BonoboObjectClass *parent_class = NULL;
-
-typedef struct
-{
- ESourceList *source_list;
- ESourceList *task_source_list;
-
- GSList *source_selection;
- GSList *task_source_selection;
-
- GnomeCalendar *calendar;
-
- EInfoLabel *info_label;
- GtkWidget *source_selector;
-
- BonoboControl *view_control;
- BonoboControl *sidebar_control;
- BonoboControl *statusbar_control;
-
- GList *notifications;
-
- EUserCreatableItemsHandler *creatable_items_handler;
-
- EActivityHandler *activity_handler;
-} CalendarComponentView;
-
-struct _CalendarComponentPrivate {
- char *base_directory;
- char *config_directory;
-
- GConfClient *gconf_client;
- int gconf_notify_id;
-
- ESourceList *source_list;
- ESourceList *task_source_list;
-
- GList *views;
-
- ECal *create_ecal;
-
- GList *notifications;
-};
-
-/* FIXME This should be gnome cal likely */
-extern ECompEditorRegistry *comp_editor_registry;
-
-/* Utility functions. */
-
-static gboolean
-is_in_selection (GSList *selection, ESource *source)
-{
- GSList *l;
-
- for (l = selection; l; l = l->next) {
- ESource *selected_source = l->data;
-
- if (!strcmp (e_source_peek_uid (selected_source), e_source_peek_uid (source)))
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-is_in_uids (GSList *uids, ESource *source)
-{
- GSList *l;
-
- for (l = uids; l; l = l->next) {
- const char *uid = l->data;
-
- if (!strcmp (uid, e_source_peek_uid (source)))
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-update_uris_for_selection (CalendarComponentView *component_view)
-{
- GSList *selection, *l, *uids_selected = NULL;
-
- selection = e_source_selector_get_selection (E_SOURCE_SELECTOR (component_view->source_selector));
-
- for (l = component_view->source_selection; l; l = l->next) {
- ESource *old_selected_source = l->data;
-
- if (!is_in_selection (selection, old_selected_source))
- gnome_calendar_remove_source (component_view->calendar, E_CAL_SOURCE_TYPE_EVENT, old_selected_source);
- }
-
- for (l = selection; l; l = l->next) {
- ESource *selected_source = l->data;
-
- if (gnome_calendar_add_source (component_view->calendar, E_CAL_SOURCE_TYPE_EVENT, selected_source))
- uids_selected = g_slist_append (uids_selected, (char *) e_source_peek_uid (selected_source));
- }
-
- e_source_selector_free_selection (component_view->source_selection);
- component_view->source_selection = selection;
-
- /* Save the selection for next time we start up */
- calendar_config_set_calendars_selected (uids_selected);
- g_slist_free (uids_selected);
-}
-
-static void
-update_uri_for_primary_selection (CalendarComponentView *component_view)
-{
- ESource *source;
-
- source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (component_view->source_selector));
- if (!source)
- return;
-
- /* Set the default */
- gnome_calendar_set_default_source (component_view->calendar, E_CAL_SOURCE_TYPE_EVENT, source);
-
- /* Make sure we are embedded first */
- calendar_control_sensitize_calendar_commands (component_view->view_control, component_view->calendar, TRUE);
-
- /* Save the selection for next time we start up */
- calendar_config_set_primary_calendar (e_source_peek_uid (source));
-}
-
-static void
-update_selection (CalendarComponentView *component_view)
-{
- GSList *selection, *uids_selected, *l;
-
- /* Get the selection in gconf */
- uids_selected = calendar_config_get_calendars_selected ();
-
- /* Remove any that aren't there any more */
- selection = e_source_selector_get_selection (E_SOURCE_SELECTOR (component_view->source_selector));
-
- for (l = selection; l; l = l->next) {
- ESource *source = l->data;
-
- if (!is_in_uids (uids_selected, source))
- e_source_selector_unselect_source (E_SOURCE_SELECTOR (component_view->source_selector), source);
- }
-
- e_source_selector_free_selection (selection);
-
- /* Make sure the whole selection is there */
- for (l = uids_selected; l; l = l->next) {
- char *uid = l->data;
- ESource *source;
-
- source = e_source_list_peek_source_by_uid (component_view->source_list, uid);
- if (source)
- e_source_selector_select_source (E_SOURCE_SELECTOR (component_view->source_selector), source);
-
- g_free (uid);
- }
- g_slist_free (uids_selected);
-}
-
-static void
-update_task_selection (CalendarComponentView *component_view)
-{
- GSList *uids_selected, *l;
-
- /* Get the selection in gconf */
- uids_selected = calendar_config_get_tasks_selected ();
-
- /* Remove any that aren't there any more */
- for (l = component_view->task_source_selection; l; l = l->next) {
- char *uid = l->data;
- ESource *source;
-
- source = e_source_list_peek_source_by_uid (component_view->task_source_list, uid);
- if (!source)
- gnome_calendar_remove_source_by_uid (component_view->calendar, E_CAL_SOURCE_TYPE_TODO, uid);
- else if (!is_in_uids (uids_selected, source))
- gnome_calendar_remove_source (component_view->calendar, E_CAL_SOURCE_TYPE_TODO, source);
-
- g_free (uid);
- }
- g_slist_free (component_view->task_source_selection);
-
- /* Make sure the whole selection is there */
- for (l = uids_selected; l; l = l->next) {
- char *uid = l->data;
- ESource *source;
-
- source = e_source_list_peek_source_by_uid (component_view->task_source_list, uid);
- if (!gnome_calendar_add_source (component_view->calendar, E_CAL_SOURCE_TYPE_TODO, source))
- /* FIXME do something */;
- }
-
- component_view->task_source_selection = uids_selected;
-}
-
-static void
-update_primary_selection (CalendarComponentView *component_view)
-{
- ESource *source = NULL;
- char *uid;
-
- uid = calendar_config_get_primary_calendar ();
- if (uid) {
- source = e_source_list_peek_source_by_uid (component_view->source_list, uid);
- g_free (uid);
- }
-
- if (source) {
- e_source_selector_set_primary_selection (E_SOURCE_SELECTOR (component_view->source_selector), source);
- } else {
- /* Try to create a default if there isn't one */
- source = e_source_list_peek_source_any (component_view->source_list);
- if (source)
- e_source_selector_set_primary_selection (E_SOURCE_SELECTOR (component_view->source_selector), source);
- }
-}
-
-static void
-update_primary_task_selection (CalendarComponentView *component_view)
-{
- ESource *source = NULL;
- char *uid;
-
- uid = calendar_config_get_primary_tasks ();
- if (uid) {
- source = e_source_list_peek_source_by_uid (component_view->task_source_list, uid);
-
- g_free (uid);
- }
-
- if (source)
- gnome_calendar_set_default_source (component_view->calendar, E_CAL_SOURCE_TYPE_TODO, source);
-}
-
-/* Callbacks. */
-static void
-copy_calendar_cb (EPopup *ep, EPopupItem *pitem, void *data)
-{
- CalendarComponentView *component_view = data;
- ESource *selected_source;
-
- selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (component_view->source_selector));
- if (!selected_source)
- return;
-
- copy_source_dialog (GTK_WINDOW (gtk_widget_get_toplevel (ep->target->widget)), selected_source, E_CAL_SOURCE_TYPE_EVENT);
-}
-
-static void
-delete_calendar_cb (EPopup *ep, EPopupItem *pitem, void *data)
-{
- CalendarComponentView *component_view = data;
- ESource *selected_source;
- ECal *cal;
- char *uri;
-
- selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (component_view->source_selector));
- if (!selected_source)
- return;
-
- if (e_error_run((GtkWindow *)gtk_widget_get_toplevel(ep->target->widget),
- "calendar:prompt-delete-calendar", e_source_peek_name(selected_source)) != GTK_RESPONSE_YES)
- return;
-
- /* first, ask the backend to remove the calendar */
- uri = e_source_get_uri (selected_source);
- cal = e_cal_model_get_client_for_uri (gnome_calendar_get_calendar_model (component_view->calendar), uri);
- if (!cal)
- cal = e_cal_new_from_uri (uri, E_CAL_SOURCE_TYPE_EVENT);
- g_free (uri);
- if (cal) {
- if (e_cal_remove (cal, NULL)) {
- if (e_source_selector_source_is_selected (E_SOURCE_SELECTOR (component_view->source_selector),
- selected_source)) {
- gnome_calendar_remove_source (component_view->calendar, E_CAL_SOURCE_TYPE_EVENT, selected_source);
- e_source_selector_unselect_source (E_SOURCE_SELECTOR (component_view->source_selector),
- selected_source);
- }
-
- e_source_group_remove_source (e_source_peek_group (selected_source), selected_source);
- e_source_list_sync (component_view->source_list, NULL);
- }
- }
-}
-
-static void
-new_calendar_cb (EPopup *ep, EPopupItem *pitem, void *data)
-{
- calendar_setup_edit_calendar (GTK_WINDOW (gtk_widget_get_toplevel(ep->target->widget)), NULL, pitem->user_data);
-}
-
-static void
-edit_calendar_cb (EPopup *ep, EPopupItem *pitem, void *data)
-{
- CalendarComponentView *component_view = data;
- ESource *selected_source;
-
- selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (component_view->source_selector));
- if (!selected_source)
- return;
-
- calendar_setup_edit_calendar (GTK_WINDOW (gtk_widget_get_toplevel(ep->target->widget)), selected_source, NULL);
-}
-
-static EPopupItem ecc_source_popups[] = {
- { E_POPUP_ITEM, "10.new", N_("New Calendar"), new_calendar_cb, NULL, "stock_calendar", 0, 0 },
- { E_POPUP_ITEM, "15.copy", N_("Copy"), copy_calendar_cb, NULL, "stock_folder-copy", 0, E_CAL_POPUP_SOURCE_PRIMARY },
- { E_POPUP_ITEM, "20.delete", N_("Delete"), delete_calendar_cb, NULL, "stock_delete", 0, E_CAL_POPUP_SOURCE_USER|E_CAL_POPUP_SOURCE_PRIMARY },
- { E_POPUP_ITEM, "30.properties", N_("Properties..."), edit_calendar_cb, NULL, "stock_folder-properties", 0, E_CAL_POPUP_SOURCE_PRIMARY },
-};
-
-static void
-ecc_source_popup_free(EPopup *ep, GSList *list, void *data)
-{
- g_slist_free(list);
-}
-
-static gboolean
-popup_event_cb(ESourceSelector *selector, ESource *insource, GdkEventButton *event, CalendarComponentView *component_view)
-{
- ECalPopup *ep;
- ECalPopupTargetSource *t;
- GSList *menus = NULL;
- int i;
- GtkMenu *menu;
-
- /** @HookPoint-ECalPopup: Calendar Source Selector Context Menu
- * @Id: org.gnome.evolution.calendar.source.popup
- * @Class: org.gnome.evolution.calendar.popup:1.0
- * @Target: ECalPopupTargetSource
- *
- * The context menu on the source selector in the calendar window.
- */
- ep = e_cal_popup_new("org.gnome.evolution.calendar.source.popup");
- t = e_cal_popup_target_new_source(ep, selector);
- t->target.widget = (GtkWidget *)component_view->calendar;
-
- if (!insource) {
-
- ESourceGroup *group;
-
- group = e_source_selector_get_primary_source_group (selector);
- g_object_ref (group);
- ((EPopupItem) ecc_source_popups [0]).user_data = group;
- menus = g_slist_prepend (menus, &ecc_source_popups [0]);
- }
- else {
- for (i=1;i<sizeof(ecc_source_popups)/sizeof(ecc_source_popups[0]);i++)
- menus = g_slist_prepend(menus, &ecc_source_popups[i]);
- }
-
- e_popup_add_items((EPopup *)ep, menus, NULL, ecc_source_popup_free, component_view);
-
- menu = e_popup_create_menu_once((EPopup *)ep, (EPopupTarget *)t, 0);
- gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event?event->button:0, event?event->time:gtk_get_current_event_time());
-
- return TRUE;
-}
-
-static void
-source_selection_changed_cb (ESourceSelector *selector, CalendarComponentView *component_view)
-{
- update_uris_for_selection (component_view);
-}
-
-static void
-primary_source_selection_changed_cb (ESourceSelector *selector, CalendarComponentView *component_view)
-{
- update_uri_for_primary_selection (component_view);
-}
-
-static void
-source_added_cb (GnomeCalendar *calendar, ECalSourceType source_type, ESource *source, CalendarComponentView *component_view)
-{
- switch (source_type) {
- case E_CAL_SOURCE_TYPE_EVENT:
- e_source_selector_select_source (E_SOURCE_SELECTOR (component_view->source_selector), source);
- break;
- default:
- break;
- }
-}
-
-static void
-source_removed_cb (GnomeCalendar *calendar, ECalSourceType source_type, ESource *source, CalendarComponentView *component_view)
-{
- switch (source_type) {
- case E_CAL_SOURCE_TYPE_EVENT:
- e_source_selector_unselect_source (E_SOURCE_SELECTOR (component_view->source_selector), source);
- break;
- default:
- break;
- }
-}
-
-static void
-set_info (CalendarComponentView *component_view)
-{
- icaltimezone *zone;
- struct icaltimetype start_tt, end_tt;
- time_t start_time, end_time;
- struct tm start_tm, end_tm;
- char buffer[512], end_buffer[256];
- GnomeCalendarViewType view;
-
- gnome_calendar_get_visible_time_range (component_view->calendar, &start_time, &end_time);
- zone = gnome_calendar_get_timezone (component_view->calendar);
-
- start_tt = icaltime_from_timet_with_zone (start_time, FALSE, zone);
- start_tm.tm_year = start_tt.year - 1900;
- start_tm.tm_mon = start_tt.month - 1;
- start_tm.tm_mday = start_tt.day;
- start_tm.tm_hour = start_tt.hour;
- start_tm.tm_min = start_tt.minute;
- start_tm.tm_sec = start_tt.second;
- start_tm.tm_isdst = -1;
- start_tm.tm_wday = time_day_of_week (start_tt.day, start_tt.month - 1,
- start_tt.year);
-
- /* Take one off end_time so we don't get an extra day. */
- end_tt = icaltime_from_timet_with_zone (end_time - 1, FALSE, zone);
- end_tm.tm_year = end_tt.year - 1900;
- end_tm.tm_mon = end_tt.month - 1;
- end_tm.tm_mday = end_tt.day;
- end_tm.tm_hour = end_tt.hour;
- end_tm.tm_min = end_tt.minute;
- end_tm.tm_sec = end_tt.second;
- end_tm.tm_isdst = -1;
- end_tm.tm_wday = time_day_of_week (end_tt.day, end_tt.month - 1,
- end_tt.year);
-
- view = gnome_calendar_get_view (component_view->calendar);
-
- switch (view) {
- case GNOME_CAL_DAY_VIEW:
- case GNOME_CAL_WORK_WEEK_VIEW:
- case GNOME_CAL_WEEK_VIEW:
- if (start_tm.tm_year == end_tm.tm_year
- && start_tm.tm_mon == end_tm.tm_mon
- && start_tm.tm_mday == end_tm.tm_mday) {
- e_utf8_strftime (buffer, sizeof (buffer),
- _("%A %d %b %Y"), &start_tm);
- } else if (start_tm.tm_year == end_tm.tm_year) {
- e_utf8_strftime (buffer, sizeof (buffer),
- _("%a %d %b"), &start_tm);
- e_utf8_strftime (end_buffer, sizeof (end_buffer),
- _("%a %d %b %Y"), &end_tm);
- strcat (buffer, " - ");
- strcat (buffer, end_buffer);
- } else {
- e_utf8_strftime (buffer, sizeof (buffer),
- _("%a %d %b %Y"), &start_tm);
- e_utf8_strftime (end_buffer, sizeof (end_buffer),
- _("%a %d %b %Y"), &end_tm);
- strcat (buffer, " - ");
- strcat (buffer, end_buffer);
- }
- break;
- case GNOME_CAL_MONTH_VIEW:
- case GNOME_CAL_LIST_VIEW:
- if (start_tm.tm_year == end_tm.tm_year) {
- if (start_tm.tm_mon == end_tm.tm_mon) {
- e_utf8_strftime (buffer, sizeof (buffer),
- "%d", &start_tm);
- e_utf8_strftime (end_buffer, sizeof (end_buffer),
- _("%d %b %Y"), &end_tm);
- strcat (buffer, " - ");
- strcat (buffer, end_buffer);
- } else {
- e_utf8_strftime (buffer, sizeof (buffer),
- _("%d %b"), &start_tm);
- e_utf8_strftime (end_buffer, sizeof (end_buffer),
- _("%d %b %Y"), &end_tm);
- strcat (buffer, " - ");
- strcat (buffer, end_buffer);
- }
- } else {
- e_utf8_strftime (buffer, sizeof (buffer),
- _("%d %b %Y"), &start_tm);
- e_utf8_strftime (end_buffer, sizeof (end_buffer),
- _("%d %b %Y"), &end_tm);
- strcat (buffer, " - ");
- strcat (buffer, end_buffer);
- }
- break;
- default:
- g_assert_not_reached ();
- }
-
- e_info_label_set_info (component_view->info_label, _("Calendar"), buffer);
-}
-
-static void
-calendar_dates_changed_cb (GnomeCalendar *calendar, CalendarComponentView *component_view)
-{
- set_info (component_view);
-}
-
-static void
-config_primary_selection_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- CalendarComponent *calendar_component = data;
- CalendarComponentPrivate *priv = calendar_component->priv;
-
- if (priv->create_ecal) {
- g_object_unref (priv->create_ecal);
- priv->create_ecal = NULL;
- }
-}
-
-static void
-config_tasks_selection_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- update_task_selection (data);
-}
-
-
-static void
-config_primary_tasks_selection_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- update_primary_task_selection (data);
-}
-
-static gboolean
-init_calendar_publishing_cb (gpointer data)
-{
- /* Publish if it is time to publish again */
- e_pub_publish (FALSE);
-
- return FALSE;
-}
-
-static void
-conf_changed_callback (GConfClient *client,
- unsigned int connection_id,
- GConfEntry *entry,
- void *user_data)
-{
- /* publish config changed, so publish */
- e_pub_publish (TRUE);
-}
-
-/* Evolution::Component CORBA methods. */
-static void
-impl_handleURI (PortableServer_Servant servant, const char *uri, CORBA_Environment *ev)
-{
- CalendarComponent *calendar_component = CALENDAR_COMPONENT (bonobo_object_from_servant (servant));
- CalendarComponentPrivate *priv;
-
- priv = calendar_component->priv;
-
- if (!strncmp (uri, "calendar:", 9)) {
- EUri *euri = e_uri_new (uri);
- const char *p;
- char *header, *content;
- size_t len, clen;
- time_t start = -1, end = -1;
-
- p = euri->query;
- if (p) {
- while (*p) {
- len = strcspn (p, "=&");
-
- /* If it's malformed, give up. */
- if (p[len] != '=')
- break;
-
- header = (char *) p;
- header[len] = '\0';
- p += len + 1;
-
- clen = strcspn (p, "&");
-
- content = g_strndup (p, clen);
-
- if (!g_ascii_strcasecmp (header, "startdate")) {
- start = time_from_isodate (content);
- } else if (!g_ascii_strcasecmp (header, "enddate")) {
- end = time_from_isodate (content);
- }
-
- g_free (content);
-
- p += clen;
- if (*p == '&') {
- p++;
- if (!strcmp (p, "amp;"))
- p += 4;
- }
- }
-
- if (start != -1) {
- GList *l;
-
- if (end == -1)
- end = start;
-
- l = g_list_last (priv->views);
- if (l) {
- CalendarComponentView *view = l->data;
-
- gnome_calendar_set_selected_time_range (view->calendar, start, end);
- }
- }
- }
-
- e_uri_free (euri);
- }
-}
-
-static void
-impl_upgradeFromVersion (PortableServer_Servant servant,
- CORBA_short major,
- CORBA_short minor,
- CORBA_short revision,
- CORBA_Environment *ev)
-{
- GError *err = NULL;
- CalendarComponent *calendar_component = CALENDAR_COMPONENT (bonobo_object_from_servant (servant));
-
- if (!migrate_calendars (calendar_component, major, minor, revision, &err)) {
- GNOME_Evolution_Component_UpgradeFailed *failedex;
-
- failedex = GNOME_Evolution_Component_UpgradeFailed__alloc();
- failedex->what = CORBA_string_dup(_("Failed upgrading calendars."));
- failedex->why = CORBA_string_dup(err->message);
- CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Component_UpgradeFailed, failedex);
- }
-
- if (err)
- g_error_free(err);
-}
-
-static gboolean
-selector_tree_drag_drop (GtkWidget *widget,
- GdkDragContext *context,
- int x,
- int y,
- guint time,
- CalendarComponent *component)
-{
- GtkTreeViewColumn *column;
- int cell_x;
- int cell_y;
- GtkTreePath *path;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gpointer data;
-
- if (!gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), x, y, &path,
- &column, &cell_x, &cell_y))
- return FALSE;
-
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
-
- if (!gtk_tree_model_get_iter (model, &iter, path)) {
- gtk_tree_path_free (path);
- return FALSE;
- }
-
- gtk_tree_model_get (model, &iter, 0, &data, -1);
-
- if (E_IS_SOURCE_GROUP (data)) {
- g_object_unref (data);
- gtk_tree_path_free (path);
- return FALSE;
- }
-
- gtk_tree_path_free (path);
- return TRUE;
-}
-
-static gboolean
-selector_tree_drag_motion (GtkWidget *widget,
- GdkDragContext *context,
- int x,
- int y,
- guint time,
- gpointer user_data)
-{
- GtkTreePath *path = NULL;
- gpointer data = NULL;
- GtkTreeViewDropPosition pos;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GdkDragAction action = GDK_ACTION_DEFAULT;
-
- if (!gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW (widget),
- x, y, &path, &pos))
- goto finish;
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
-
- if (!gtk_tree_model_get_iter (model, &iter, path))
- goto finish;
-
- gtk_tree_model_get (model, &iter, 0, &data, -1);
-
- if (E_IS_SOURCE_GROUP (data) || e_source_get_readonly (data))
- goto finish;
-
- gtk_tree_view_set_drag_dest_row(GTK_TREE_VIEW (widget), path, GTK_TREE_VIEW_DROP_INTO_OR_BEFORE);
- action = context->suggested_action;
-
- finish:
- if (path)
- gtk_tree_path_free (path);
- if (data)
- g_object_unref (data);
-
- gdk_drag_status (context, action, time);
- return TRUE;
-}
-
-static gboolean
-update_single_object (ECal *client, icalcomponent *icalcomp)
-{
- char *uid;
- icalcomponent *tmp_icalcomp;
-
- uid = (char *) icalcomponent_get_uid (icalcomp);
-
- if (e_cal_get_object (client, uid, NULL, &tmp_icalcomp, NULL))
- return e_cal_modify_object (client, icalcomp, CALOBJ_MOD_ALL, NULL);
-
- return e_cal_create_object (client, icalcomp, &uid, NULL);
-}
-
-static gboolean
-update_objects (ECal *client, icalcomponent *icalcomp)
-{
- icalcomponent *subcomp;
- icalcomponent_kind kind;
-
- kind = icalcomponent_isa (icalcomp);
- if (kind == ICAL_VTODO_COMPONENT || kind == ICAL_VEVENT_COMPONENT)
- return update_single_object (client, icalcomp);
- else if (kind != ICAL_VCALENDAR_COMPONENT)
- return FALSE;
-
- subcomp = icalcomponent_get_first_component (icalcomp, ICAL_ANY_COMPONENT);
- while (subcomp) {
- gboolean success;
-
- kind = icalcomponent_isa (subcomp);
- if (kind == ICAL_VTIMEZONE_COMPONENT) {
- icaltimezone *zone;
-
- zone = icaltimezone_new ();
- icaltimezone_set_component (zone, subcomp);
-
- success = e_cal_add_timezone (client, zone, NULL);
- icaltimezone_free (zone, 1);
- if (!success)
- return success;
- } else if (kind == ICAL_VTODO_COMPONENT ||
- kind == ICAL_VEVENT_COMPONENT) {
- success = update_single_object (client, subcomp);
- if (!success)
- return success;
- }
-
- subcomp = icalcomponent_get_next_component (icalcomp, ICAL_ANY_COMPONENT);
- }
-
- return TRUE;
-}
-
-static void
-selector_tree_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- GtkSelectionData *data,
- guint info,
- guint time,
- gpointer user_data)
-{
- GtkTreePath *path = NULL;
- GtkTreeViewDropPosition pos;
- gpointer source = NULL;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gboolean success = FALSE;
- icalcomponent *icalcomp = NULL;
- ECal *client = NULL;
-
- if (!gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW (widget),
- x, y, &path, &pos))
- goto finish;
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
-
- if (!gtk_tree_model_get_iter (model, &iter, path))
- goto finish;
-
-
- gtk_tree_model_get (model, &iter, 0, &source, -1);
-
- if (E_IS_SOURCE_GROUP (source) || e_source_get_readonly (source))
- goto finish;
-
- icalcomp = icalparser_parse_string (data->data);
-
- if (icalcomp) {
- char * uid;
-
- /* FIXME deal with GDK_ACTION_ASK */
- if (context->action == GDK_ACTION_COPY) {
- uid = e_cal_component_gen_uid ();
- icalcomponent_set_uid (icalcomp, uid);
- }
-
- client = auth_new_cal_from_source (source,
- E_CAL_SOURCE_TYPE_EVENT);
-
- if (client) {
- if (e_cal_open (client, TRUE, NULL)) {
- success = TRUE;
- update_objects (client, icalcomp);
- }
-
- g_object_unref (client);
- }
-
- icalcomponent_free (icalcomp);
- }
-
- finish:
- if (source)
- g_object_unref (source);
- if (path)
- gtk_tree_path_free (path);
-
- gtk_drag_finish (context, success, context->action == GDK_ACTION_MOVE, time);
-}
-
-static void
-selector_tree_drag_leave (GtkWidget *widget, GdkDragContext *context, guint time, gpointer data)
-{
- gtk_tree_view_set_drag_dest_row(GTK_TREE_VIEW (widget),
- NULL, GTK_TREE_VIEW_DROP_BEFORE);
-}
-
-static void
-control_activate_cb (BonoboControl *control, gboolean activate, gpointer data)
-{
- CalendarComponentView *component_view = data;
-
- if (activate) {
- BonoboUIComponent *uic;
- uic = bonobo_control_get_ui_component (component_view->view_control);
-
- e_user_creatable_items_handler_activate (component_view->creatable_items_handler, uic);
- }
-}
-
-
-static void
-config_create_ecal_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- CalendarComponent *calendar_component = data;
- CalendarComponentPrivate *priv;
-
- priv = calendar_component->priv;
-
- g_object_unref (priv->create_ecal);
- priv->create_ecal = NULL;
-
- priv->notifications = g_list_remove (priv->notifications, GUINT_TO_POINTER (id));
-}
-
-static ECal *
-setup_create_ecal (CalendarComponent *calendar_component, CalendarComponentView *component_view)
-{
- CalendarComponentPrivate *priv;
- ESource *source = NULL;
- char *uid;
- guint not;
-
- priv = calendar_component->priv;
-
- /* Try to use the client from the calendar first to avoid re-opening things */
- if (component_view) {
- ECal *default_ecal;
-
- default_ecal = gnome_calendar_get_default_client (component_view->calendar);
- if (default_ecal)
- return default_ecal;
- }
-
- /* If there is an existing fall back, use that */
- if (priv->create_ecal)
- return priv->create_ecal;
-
- /* Get the current primary calendar, or try to set one if it doesn't already exist */
- uid = calendar_config_get_primary_calendar ();
- if (uid) {
- source = e_source_list_peek_source_by_uid (priv->source_list, uid);
- g_free (uid);
-
- priv->create_ecal = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_EVENT);
- }
-
- if (!priv->create_ecal) {
- /* Try to create a default if there isn't one */
- source = e_source_list_peek_source_any (priv->source_list);
- if (source)
- priv->create_ecal = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_EVENT);
- }
-
- if (priv->create_ecal) {
- icaltimezone *zone;
-
- if (!e_cal_open (priv->create_ecal, FALSE, NULL)) {
- GtkWidget *dialog;
-
- dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
- GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
- _("Unable to open the calendar '%s' for creating events and meetings"),
- e_source_peek_name (source));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
-
- return NULL;
- }
-
- zone = calendar_config_get_icaltimezone ();
- e_cal_set_default_timezone (priv->create_ecal, zone, NULL);
-
- } else {
- GtkWidget *dialog;
-
- dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
- GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
- _("There is no calendar available for creating events and meetings"));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
-
- return NULL;
- }
-
- /* Handle the fact it may change on us */
- not = calendar_config_add_notification_primary_calendar (config_create_ecal_changed_cb,
- calendar_component);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Save the primary source for use elsewhere */
- calendar_config_set_primary_calendar (e_source_peek_uid (source));
-
- return priv->create_ecal;
-}
-
-static gboolean
-create_new_event (CalendarComponent *calendar_component, CalendarComponentView *component_view, gboolean is_allday, gboolean is_meeting)
-{
- ECal *ecal;
- ECalendarView *view;
-
- ecal = setup_create_ecal (calendar_component, component_view);
- if (!ecal)
- return FALSE;
-
- if (component_view && (view = E_CALENDAR_VIEW (gnome_calendar_get_current_view_widget (component_view->calendar)))) {
- GnomeCalendarViewType view_type;
-
- /* Force all for these view types because thats what's selected and it mimics a double click */
- view_type = gnome_calendar_get_view (component_view->calendar);
- if (view_type == GNOME_CAL_WEEK_VIEW
- || view_type == GNOME_CAL_MONTH_VIEW
- || view_type == GNOME_CAL_LIST_VIEW)
- is_allday = TRUE;
-
- e_calendar_view_new_appointment_full (view, is_allday, is_meeting);
- } else {
- ECalComponent *comp;
- EventEditor *editor;
-
- editor = event_editor_new (ecal, is_meeting);
- comp = cal_comp_event_new_with_current_time (ecal, is_allday);
- e_cal_component_commit_sequence (comp);
-
- comp_editor_edit_comp (COMP_EDITOR (editor), comp);
- if (is_meeting)
- event_editor_show_meeting (editor);
- comp_editor_focus (COMP_EDITOR (editor));
-
- e_comp_editor_registry_add (comp_editor_registry, COMP_EDITOR (editor), TRUE);
- }
-
- return TRUE;
-}
-
-static void
-create_local_item_cb (EUserCreatableItemsHandler *handler, const char *item_type_name, void *data)
-{
- CalendarComponent *calendar_component = data;
- CalendarComponentPrivate *priv;
- CalendarComponentView *component_view = NULL;
- GList *l;
-
- priv = calendar_component->priv;
-
- for (l = priv->views; l; l = l->next) {
- component_view = l->data;
-
- if (component_view->creatable_items_handler == handler)
- break;
-
- component_view = NULL;
- }
-
- if (strcmp (item_type_name, CREATE_EVENT_ID) == 0)
- create_new_event (calendar_component, component_view, FALSE, FALSE);
- else if (strcmp (item_type_name, CREATE_ALLDAY_EVENT_ID) == 0)
- create_new_event (calendar_component, component_view, TRUE, FALSE);
- else if (strcmp (item_type_name, CREATE_MEETING_ID) == 0)
- create_new_event (calendar_component, component_view, FALSE, TRUE);
- else if (strcmp (item_type_name, CREATE_CALENDAR_ID) == 0)
- calendar_setup_new_calendar (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (component_view->calendar))));
-}
-
-static CalendarComponentView *
-create_component_view (CalendarComponent *calendar_component)
-{
- CalendarComponentPrivate *priv;
- CalendarComponentView *component_view;
- GtkWidget *selector_scrolled_window, *vbox;
- GtkWidget *statusbar_widget;
- guint not;
- AtkObject *a11y;
-
- priv = calendar_component->priv;
-
- /* Create the calendar component view */
- component_view = g_new0 (CalendarComponentView, 1);
-
- /* Add the source lists */
- component_view->source_list = g_object_ref (priv->source_list);
- component_view->task_source_list = g_object_ref (priv->task_source_list);
-
- /* Create sidebar selector */
- component_view->source_selector = e_source_selector_new (calendar_component->priv->source_list);
- e_source_selector_set_select_new ((ESourceSelector *)component_view->source_selector, TRUE);
- a11y = gtk_widget_get_accessible (GTK_WIDGET (component_view->source_selector));
- atk_object_set_name (a11y, _("Calendar Source Selector"));
-
- g_signal_connect (component_view->source_selector, "drag-motion", G_CALLBACK (selector_tree_drag_motion),
- calendar_component);
- g_signal_connect (component_view->source_selector, "drag-leave", G_CALLBACK (selector_tree_drag_leave),
- calendar_component);
- g_signal_connect (component_view->source_selector, "drag-drop", G_CALLBACK (selector_tree_drag_drop),
- calendar_component);
- g_signal_connect (component_view->source_selector, "drag-data-received",
- G_CALLBACK (selector_tree_drag_data_received), calendar_component);
-
- gtk_drag_dest_set(component_view->source_selector, GTK_DEST_DEFAULT_ALL, drag_types,
- num_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE);
-
- gtk_widget_show (component_view->source_selector);
-
- selector_scrolled_window = gtk_scrolled_window_new (NULL, NULL);
- gtk_container_add (GTK_CONTAINER (selector_scrolled_window), component_view->source_selector);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (selector_scrolled_window),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (selector_scrolled_window),
- GTK_SHADOW_IN);
- gtk_widget_show (selector_scrolled_window);
-
- component_view->info_label = (EInfoLabel *)e_info_label_new("stock_calendar");
- e_info_label_set_info (component_view->info_label, _("Calendars"), "");
- gtk_widget_show (GTK_WIDGET (component_view->info_label));
-
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX (vbox), GTK_WIDGET (component_view->info_label), FALSE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX (vbox), selector_scrolled_window, TRUE, TRUE, 0);
- gtk_widget_show (vbox);
-
- component_view->sidebar_control = bonobo_control_new (vbox);
-
- /* Create main view */
- component_view->view_control = control_factory_new_control ();
- if (!component_view->view_control) {
- /* FIXME free memory */
-
- return NULL;
- }
-
- component_view->calendar = (GnomeCalendar *) bonobo_control_get_widget (component_view->view_control);
-
- /* This signal is thrown if backends die - we update the selector */
- g_signal_connect (component_view->calendar, "source_added",
- G_CALLBACK (source_added_cb), component_view);
- g_signal_connect (component_view->calendar, "source_removed",
- G_CALLBACK (source_removed_cb), component_view);
-
- /* Create status bar */
- statusbar_widget = e_task_bar_new ();
- component_view->activity_handler = e_activity_handler_new ();
- e_activity_handler_attach_task_bar (component_view->activity_handler, E_TASK_BAR (statusbar_widget));
- gtk_widget_show (statusbar_widget);
-
- component_view->statusbar_control = bonobo_control_new (statusbar_widget);
-
- gnome_calendar_set_activity_handler (component_view->calendar, component_view->activity_handler);
-
- /* connect after setting the initial selections, or we'll get unwanted calls
- to calendar_control_sensitize_calendar_commands */
- g_signal_connect (component_view->source_selector, "selection_changed",
- G_CALLBACK (source_selection_changed_cb), component_view);
- g_signal_connect (component_view->source_selector, "primary_selection_changed",
- G_CALLBACK (primary_source_selection_changed_cb), component_view);
- g_signal_connect (component_view->source_selector, "popup_event",
- G_CALLBACK (popup_event_cb), component_view);
-
- /* Set up the "new" item handler */
- component_view->creatable_items_handler = e_user_creatable_items_handler_new ("calendar", create_local_item_cb, calendar_component);
- g_signal_connect (component_view->view_control, "activate", G_CALLBACK (control_activate_cb), component_view);
-
- /* We use this to update the component information */
- set_info (component_view);
- g_signal_connect (component_view->calendar, "dates_shown_changed",
- G_CALLBACK (calendar_dates_changed_cb), component_view);
-
- /* Load the selection from the last run */
- update_selection (component_view);
- update_primary_selection (component_view);
- update_task_selection (component_view);
- update_primary_task_selection (component_view);
-
- /* If the tasks selection changes elsewhere, update it for the mini
- mini tasks view sidebar */
- not = calendar_config_add_notification_tasks_selected (config_tasks_selection_changed_cb,
- component_view);
- component_view->notifications = g_list_prepend (component_view->notifications, GUINT_TO_POINTER (not));
-
- not = calendar_config_add_notification_primary_tasks (config_primary_tasks_selection_changed_cb,
- component_view);
- component_view->notifications = g_list_prepend (component_view->notifications, GUINT_TO_POINTER (not));
-
- return component_view;
-}
-
-static void
-destroy_component_view (CalendarComponentView *component_view)
-{
- GList *l;
-
- if (component_view->source_list)
- g_object_unref (component_view->source_list);
-
- if (component_view->task_source_list)
- g_object_unref (component_view->task_source_list);
-
- if (component_view->source_selection)
- e_source_selector_free_selection (component_view->source_selection);
-
- for (l = component_view->notifications; l; l = l->next)
- calendar_config_remove_notification (GPOINTER_TO_UINT (l->data));
- g_list_free (component_view->notifications);
-
- if (component_view->creatable_items_handler)
- g_object_unref (component_view->creatable_items_handler);
-
- if (component_view->activity_handler)
- g_object_unref (component_view->activity_handler);
-
- g_free (component_view);
-}
-
-static void
-view_destroyed_cb (gpointer data, GObject *where_the_object_was)
-{
- CalendarComponent *calendar_component = data;
- CalendarComponentPrivate *priv;
- GList *l;
-
- priv = calendar_component->priv;
-
- for (l = priv->views; l; l = l->next) {
- CalendarComponentView *component_view = l->data;
-
- if (G_OBJECT (component_view->view_control) == where_the_object_was) {
- priv->views = g_list_remove (priv->views, component_view);
- destroy_component_view (component_view);
-
- break;
- }
- }
-}
-
-static void
-impl_createControls (PortableServer_Servant servant,
- Bonobo_Control *corba_sidebar_control,
- Bonobo_Control *corba_view_control,
- Bonobo_Control *corba_statusbar_control,
- CORBA_Environment *ev)
-{
- CalendarComponent *calendar_component = CALENDAR_COMPONENT (bonobo_object_from_servant (servant));
- CalendarComponentPrivate *priv;
- CalendarComponentView *component_view;
-
- priv = calendar_component->priv;
-
- /* Create the calendar component view */
- component_view = create_component_view (calendar_component);
- if (!component_view) {
- /* FIXME Should we describe the problem in a control? */
- bonobo_exception_set (ev, ex_GNOME_Evolution_Component_Failed);
-
- return;
- }
-
- g_object_weak_ref (G_OBJECT (component_view->view_control), view_destroyed_cb, calendar_component);
- priv->views = g_list_append (priv->views, component_view);
-
- /* Return the controls */
- *corba_sidebar_control = CORBA_Object_duplicate (BONOBO_OBJREF (component_view->sidebar_control), ev);
- *corba_view_control = CORBA_Object_duplicate (BONOBO_OBJREF (component_view->view_control), ev);
- *corba_statusbar_control = CORBA_Object_duplicate (BONOBO_OBJREF (component_view->statusbar_control), ev);
-}
-
-
-static GNOME_Evolution_CreatableItemTypeList *
-impl__get_userCreatableItems (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- GNOME_Evolution_CreatableItemTypeList *list = GNOME_Evolution_CreatableItemTypeList__alloc ();
-
- list->_length = 4;
- list->_maximum = list->_length;
- list->_buffer = GNOME_Evolution_CreatableItemTypeList_allocbuf (list->_length);
-
- CORBA_sequence_set_release (list, FALSE);
-
- list->_buffer[0].id = CREATE_EVENT_ID;
- list->_buffer[0].description = _("New appointment");
- list->_buffer[0].menuDescription = _("_Appointment");
- list->_buffer[0].tooltip = _("Create a new appointment");
- list->_buffer[0].menuShortcut = 'a';
- list->_buffer[0].iconName = "stock_new-appointment";
- list->_buffer[0].type = GNOME_Evolution_CREATABLE_OBJECT;
-
- list->_buffer[1].id = CREATE_MEETING_ID;
- list->_buffer[1].description = _("New meeting");
- list->_buffer[1].menuDescription = _("M_eeting");
- list->_buffer[1].tooltip = _("Create a new meeting request");
- list->_buffer[1].menuShortcut = 'e';
- list->_buffer[1].iconName = "stock_new-meeting";
- list->_buffer[1].type = GNOME_Evolution_CREATABLE_OBJECT;
-
- list->_buffer[2].id = CREATE_ALLDAY_EVENT_ID;
- list->_buffer[2].description = _("New all day appointment");
- list->_buffer[2].menuDescription = _("All Day A_ppointment");
- list->_buffer[2].tooltip = _("Create a new all-day appointment");
- list->_buffer[2].menuShortcut = 'p';
- list->_buffer[2].iconName = "stock_new-24h-appointment";
- list->_buffer[2].type = GNOME_Evolution_CREATABLE_OBJECT;
-
- list->_buffer[3].id = CREATE_CALENDAR_ID;
- list->_buffer[3].description = _("New calendar");
- list->_buffer[3].menuDescription = _("Cale_ndar");
- list->_buffer[3].tooltip = _("Create a new calendar");
- list->_buffer[3].menuShortcut = 'n';
- list->_buffer[3].iconName = "stock_calendar";
- list->_buffer[3].type = GNOME_Evolution_CREATABLE_FOLDER;
-
- return list;
-}
-
-static void
-impl_requestCreateItem (PortableServer_Servant servant,
- const CORBA_char *item_type_name,
- CORBA_Environment *ev)
-{
- CalendarComponent *calendar_component = CALENDAR_COMPONENT (bonobo_object_from_servant (servant));
- gboolean result = FALSE;
-
- if (strcmp (item_type_name, CREATE_EVENT_ID) == 0)
- result = create_new_event (calendar_component, NULL, FALSE, FALSE);
- else if (strcmp (item_type_name, CREATE_ALLDAY_EVENT_ID) == 0)
- result = create_new_event (calendar_component, NULL, TRUE, FALSE);
- else if (strcmp (item_type_name, CREATE_MEETING_ID) == 0)
- result = create_new_event (calendar_component, NULL, FALSE, TRUE);
- else if (strcmp (item_type_name, CREATE_CALENDAR_ID) == 0)
- /* FIXME Should we use the last opened window? */
- calendar_setup_new_calendar (NULL);
- else
- bonobo_exception_set (ev, ex_GNOME_Evolution_Component_UnknownType);
-
- if (!result)
- bonobo_exception_set (ev, ex_GNOME_Evolution_Component_Failed);
-}
-
-/* GObject methods. */
-
-static void
-impl_dispose (GObject *object)
-{
- CalendarComponent *calendar_component = CALENDAR_COMPONENT (object);
- CalendarComponentPrivate *priv = calendar_component->priv;
- GList *l;
-
- if (priv->source_list != NULL) {
- g_object_unref (priv->source_list);
- priv->source_list = NULL;
- }
-
- if (priv->gconf_client != NULL) {
- g_object_unref (priv->gconf_client);
- priv->gconf_client = NULL;
- }
-
- if (priv->create_ecal) {
- g_object_unref (priv->create_ecal);
- priv->create_ecal = NULL;
- }
-
- for (l = priv->views; l; l = l->next) {
- CalendarComponentView *component_view = l->data;
-
- g_object_weak_unref (G_OBJECT (component_view->view_control), view_destroyed_cb, calendar_component);
- }
- g_list_free (priv->views);
- priv->views = NULL;
-
- for (l = priv->notifications; l; l = l->next)
- calendar_config_remove_notification (GPOINTER_TO_UINT (l->data));
- g_list_free (priv->notifications);
- priv->notifications = NULL;
-
- (* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-static void
-impl_finalize (GObject *object)
-{
- CalendarComponentPrivate *priv = CALENDAR_COMPONENT (object)->priv;
- GList *l;
-
- for (l = priv->views; l; l = l->next) {
- CalendarComponentView *component_view = l->data;
-
- destroy_component_view (component_view);
- }
- g_list_free (priv->views);
-
- g_free (priv->base_directory);
- g_free (priv->config_directory);
- g_free (priv);
-
- (* G_OBJECT_CLASS (parent_class)->finalize) (object);
-}
-
-static void
-calendar_component_class_init (CalendarComponentClass *class)
-{
- POA_GNOME_Evolution_Component__epv *epv = &class->epv;
- GObjectClass *object_class = G_OBJECT_CLASS (class);
-
- parent_class = g_type_class_peek_parent (class);
-
- epv->upgradeFromVersion = impl_upgradeFromVersion;
- epv->createControls = impl_createControls;
- epv->_get_userCreatableItems = impl__get_userCreatableItems;
- epv->requestCreateItem = impl_requestCreateItem;
- epv->handleURI = impl_handleURI;
-
- object_class->dispose = impl_dispose;
- object_class->finalize = impl_finalize;
-}
-
-static void
-calendar_component_init (CalendarComponent *component)
-{
- CalendarComponentPrivate *priv;
- guint not;
-
- priv = g_new0 (CalendarComponentPrivate, 1);
-
- priv->base_directory = g_build_filename (g_get_home_dir (), ".evolution", NULL);
- priv->config_directory = g_build_filename (g_get_home_dir (),
- ".evolution", "calendar", "config",
- NULL);
-
- /* EPFIXME: Should use a custom one instead? Also we should add
- * calendar_component_peek_gconf_client(). */
- priv->gconf_client = gconf_client_get_default ();
-
-
- if (!e_cal_get_sources (&priv->source_list, E_CAL_SOURCE_TYPE_EVENT, NULL))
- ;
-
- if (!e_cal_get_sources (&priv->task_source_list, E_CAL_SOURCE_TYPE_TODO, NULL))
- ;
-
- not = calendar_config_add_notification_primary_calendar (config_primary_selection_changed_cb,
- component);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
-
- component->priv = priv;
-}
-
-
-/* Public API. */
-
-CalendarComponent *
-calendar_component_peek (void)
-{
- static CalendarComponent *component = NULL;
-
- if (component == NULL) {
- component = g_object_new (calendar_component_get_type (), NULL);
-
- if (e_mkdir_hier (calendar_component_peek_config_directory (component), 0777) != 0) {
- g_warning (G_STRLOC ": Cannot create directory %s: %s",
- calendar_component_peek_config_directory (component),
- g_strerror (errno));
- g_object_unref (component);
- component = NULL;
- }
- }
-
- return component;
-}
-
-const char *
-calendar_component_peek_base_directory (CalendarComponent *component)
-{
- return component->priv->base_directory;
-}
-
-const char *
-calendar_component_peek_config_directory (CalendarComponent *component)
-{
- return component->priv->config_directory;
-}
-
-ESourceList *
-calendar_component_peek_source_list (CalendarComponent *component)
-{
- return component->priv->source_list;
-}
-
-void
-calendar_component_init_publishing (void)
-{
- guint idle_id = 0;
- CalendarComponent *calendar_component;
- CalendarComponentPrivate *priv;
-
- calendar_component = calendar_component_peek ();
-
- priv = calendar_component->priv;
-
- gconf_client_add_dir (priv->gconf_client, CALENDAR_CONFIG_PUBLISH, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
-
- priv->gconf_notify_id
- = gconf_client_notify_add (priv->gconf_client, CALENDAR_CONFIG_PUBLISH,
- (GConfClientNotifyFunc) conf_changed_callback, NULL,
- NULL, NULL);
-
- idle_id = g_idle_add ((GSourceFunc) init_calendar_publishing_cb, GINT_TO_POINTER (idle_id));
-}
-
-BONOBO_TYPE_FUNC_FULL (CalendarComponent, GNOME_Evolution_Component, PARENT_TYPE, calendar_component)
diff --git a/calendar/gui/calendar-component.h b/calendar/gui/calendar-component.h
deleted file mode 100644
index 58c808b8ec..0000000000
--- a/calendar/gui/calendar-component.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* calendar-component.h
- *
- * Copyright (C) 2003 Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli <ettore@ximian.com>
- */
-
-#ifndef _CALENDAR_COMPONENT_H_
-#define _CALENDAR_COMPONENT_H_
-
-
-#include <bonobo/bonobo-object.h>
-#include <libedataserver/e-source-list.h>
-#include "Evolution.h"
-
-
-#define CALENDAR_TYPE_COMPONENT (calendar_component_get_type ())
-#define CALENDAR_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CALENDAR_TYPE_COMPONENT, CalendarComponent))
-#define CALENDAR_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CALENDAR_TYPE_COMPONENT, CalendarComponentClass))
-#define CALENDAR_IS_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CALENDAR_TYPE_COMPONENT))
-#define CALENDAR_IS_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), CALENDAR_TYPE_COMPONENT))
-
-
-typedef struct _CalendarComponent CalendarComponent;
-typedef struct _CalendarComponentPrivate CalendarComponentPrivate;
-typedef struct _CalendarComponentClass CalendarComponentClass;
-
-struct _CalendarComponent {
- BonoboObject parent;
-
- CalendarComponentPrivate *priv;
-};
-
-struct _CalendarComponentClass {
- BonoboObjectClass parent_class;
-
- POA_GNOME_Evolution_Component__epv epv;
-};
-
-
-GType calendar_component_get_type (void);
-
-CalendarComponent *calendar_component_peek (void);
-
-const char *calendar_component_peek_base_directory (CalendarComponent *component);
-const char *calendar_component_peek_config_directory (CalendarComponent *component);
-ESourceList *calendar_component_peek_source_list (CalendarComponent *component);
-
-void calendar_component_init_publishing (void);
-
-
-#endif /* _CALENDAR_COMPONENT_H_ */
diff --git a/calendar/gui/calendar-config-keys.h b/calendar/gui/calendar-config-keys.h
deleted file mode 100644
index d3be9673e5..0000000000
--- a/calendar/gui/calendar-config-keys.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors :
- * JP Rosevear <jpr@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#ifndef _CALENDAR_CONFIG_KEYS_H_
-#define _CALENDAR_CONFIG_KEYS_H_
-
-G_BEGIN_DECLS
-
-#define CALENDAR_CONFIG_PREFIX "/apps/evolution/calendar"
-
-/* Display settings */
-#define CALENDAR_CONFIG_TIMEZONE CALENDAR_CONFIG_PREFIX "/display/timezone"
-#define CALENDAR_CONFIG_SELECTED_CALENDARS CALENDAR_CONFIG_PREFIX "/display/selected_calendars"
-#define CALENDAR_CONFIG_PRIMARY_CALENDAR CALENDAR_CONFIG_PREFIX "/display/primary_calendar"
-#define CALENDAR_CONFIG_24HOUR CALENDAR_CONFIG_PREFIX "/display/use_24hour_format"
-#define CALENDAR_CONFIG_WEEK_START CALENDAR_CONFIG_PREFIX "/display/week_start_day"
-#define CALENDAR_CONFIG_DAY_START_HOUR CALENDAR_CONFIG_PREFIX "/display/day_start_hour"
-#define CALENDAR_CONFIG_DAY_START_MINUTE CALENDAR_CONFIG_PREFIX "/display/day_start_minute"
-#define CALENDAR_CONFIG_DAY_END_HOUR CALENDAR_CONFIG_PREFIX "/display/day_end_hour"
-#define CALENDAR_CONFIG_DAY_END_MINUTE CALENDAR_CONFIG_PREFIX "/display/day_end_minute"
-#define CALENDAR_CONFIG_TIME_DIVISIONS CALENDAR_CONFIG_PREFIX "/display/time_divisions"
-#define CALENDAR_CONFIG_TIME_DIVISIONS CALENDAR_CONFIG_PREFIX "/display/time_divisions"
-#define CALENDAR_CONFIG_DEFAULT_VIEW CALENDAR_CONFIG_PREFIX "/display/default_view"
-#define CALENDAR_CONFIG_HPANE_POS CALENDAR_CONFIG_PREFIX "/display/hpane_position"
-#define CALENDAR_CONFIG_VPANE_POS CALENDAR_CONFIG_PREFIX "/display/vpane_position"
-#define CALENDAR_CONFIG_MONTH_HPANE_POS CALENDAR_CONFIG_PREFIX "/display/month_hpane_position"
-#define CALENDAR_CONFIG_MONTH_VPANE_POS CALENDAR_CONFIG_PREFIX "/display/month_vpane_position"
-#define CALENDAR_CONFIG_TASK_VPANE_POS CALENDAR_CONFIG_PREFIX "/display/task_vpane_position"
-#define CALENDAR_CONFIG_COMPRESS_WEEKEND CALENDAR_CONFIG_PREFIX "/display/compress_weekend"
-#define CALENDAR_CONFIG_SHOW_EVENT_END CALENDAR_CONFIG_PREFIX "/display/show_event_end"
-#define CALENDAR_CONFIG_WORKING_DAYS CALENDAR_CONFIG_PREFIX "/display/working_days"
-
-/* Date navigator settings */
-#define CALENDAR_CONFIG_DN_SHOW_WEEK_NUMBERS CALENDAR_CONFIG_PREFIX "/date_navigator/show_week_numbers"
-
-/* Task display settings */
-#define CALENDAR_CONFIG_TASKS_SELECTED_TASKS CALENDAR_CONFIG_PREFIX "/tasks/selected_tasks"
-#define CALENDAR_CONFIG_PRIMARY_TASKS CALENDAR_CONFIG_PREFIX "/tasks/primary_tasks"
-#define CALENDAR_CONFIG_TASKS_HIDE_COMPLETED CALENDAR_CONFIG_PREFIX "/tasks/hide_completed"
-#define CALENDAR_CONFIG_TASKS_HIDE_COMPLETED_UNITS CALENDAR_CONFIG_PREFIX "/tasks/hide_completed_units"
-#define CALENDAR_CONFIG_TASKS_HIDE_COMPLETED_VALUE CALENDAR_CONFIG_PREFIX "/tasks/hide_completed_value"
-#define CALENDAR_CONFIG_TASKS_DUE_TODAY_COLOR CALENDAR_CONFIG_PREFIX "/tasks/colors/due_today"
-#define CALENDAR_CONFIG_TASKS_OVERDUE_COLOR CALENDAR_CONFIG_PREFIX "/tasks/colors/overdue"
-
-/* Prompt settings */
-#define CALENDAR_CONFIG_PROMPT_DELETE CALENDAR_CONFIG_PREFIX "/prompts/confirm_delete"
-#define CALENDAR_CONFIG_PROMPT_PURGE CALENDAR_CONFIG_PREFIX "/prompts/confirm_purge"
-
-/* Default reminder */
-#define CALENDAR_CONFIG_DEFAULT_REMINDER CALENDAR_CONFIG_PREFIX "/other/use_default_reminder"
-#define CALENDAR_CONFIG_DEFAULT_REMINDER_INTERVAL CALENDAR_CONFIG_PREFIX "/other/default_reminder_interval"
-#define CALENDAR_CONFIG_DEFAULT_REMINDER_UNITS CALENDAR_CONFIG_PREFIX "/other/default_reminder_units"
-
-/* Free/Busy settings */
-#define CALENDAR_CONFIG_PUBLISH CALENDAR_CONFIG_PREFIX"/publish/uris"
-#define CALENDAR_CONFIG_TEMPLATE CALENDAR_CONFIG_PREFIX"/publish/template"
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/calendar-config.c b/calendar/gui/calendar-config.c
deleted file mode 100644
index c31bdca261..0000000000
--- a/calendar/gui/calendar-config.c
+++ /dev/null
@@ -1,1143 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors :
- * Damon Chaplin <damon@ximian.com>
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 2000-2004, Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * calendar-config.c - functions to load/save/get/set user settings.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <time.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <gal/util/e-util.h>
-#include <widgets/e-timezone-dialog/e-timezone-dialog.h>
-#include <libecal/e-cal-time-util.h>
-
-#include "calendar-config-keys.h"
-#include "calendar-config.h"
-
-
-
-static GConfClient *config = NULL;
-
-static void on_timezone_set (GnomeDialog *dialog,
- int button,
- ETimezoneDialog *etd);
-static gboolean on_timezone_dialog_delete_event (GnomeDialog *dialog,
- GdkEvent *event,
- ETimezoneDialog *etd);
-
-static void
-do_cleanup (void)
-{
- g_object_unref (config);
- config = NULL;
-}
-
-static void
-calendar_config_init (void)
-{
- if (config)
- return;
-
- config = gconf_client_get_default ();
- g_atexit ((GVoidFunc) do_cleanup);
-
- gconf_client_add_dir (config, CALENDAR_CONFIG_PREFIX, GCONF_CLIENT_PRELOAD_RECURSIVE, NULL);
-}
-
-void
-calendar_config_remove_notification (guint id)
-{
- calendar_config_init ();
-
- gconf_client_notify_remove (config, id);
-}
-
-/* Returns TRUE if the locale has 'am' and 'pm' strings defined, in which
- case the user can choose between 12 and 24-hour time formats. */
-gboolean
-calendar_config_locale_supports_12_hour_format (void)
-{
- char s[16];
- time_t t = 0;
-
- calendar_config_init ();
-
- e_utf8_strftime (s, sizeof s, "%p", gmtime (&t));
- return s[0] != '\0';
-}
-
-/* Returns the string representation of a units value */
-static const char *
-units_to_string (CalUnits units)
-{
- switch (units) {
- case CAL_DAYS:
- return "days";
-
- case CAL_HOURS:
- return "hours";
-
- case CAL_MINUTES:
- return "minutes";
-
- default:
- g_assert_not_reached ();
- return NULL;
- }
-}
-
-/*
- * Calendar Settings.
- */
-
-/* The current list of calendars selected */
-GSList *
-calendar_config_get_calendars_selected (void)
-{
- calendar_config_init ();
-
- return gconf_client_get_list (config, CALENDAR_CONFIG_SELECTED_CALENDARS, GCONF_VALUE_STRING, NULL);
-}
-
-void
-calendar_config_set_calendars_selected (GSList *selected)
-{
- calendar_config_init ();
-
- gconf_client_set_list (config, CALENDAR_CONFIG_SELECTED_CALENDARS, GCONF_VALUE_STRING, selected, NULL);
-}
-
-guint
-calendar_config_add_notification_calendars_selected (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- calendar_config_init ();
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_SELECTED_CALENDARS, func, data, NULL, NULL);
-
- return id;
-}
-
-/* The primary calendar */
-char *
-calendar_config_get_primary_calendar (void)
-{
- calendar_config_init ();
-
- return gconf_client_get_string (config, CALENDAR_CONFIG_PRIMARY_CALENDAR, NULL);
-}
-
-void
-calendar_config_set_primary_calendar (const char *primary_uid)
-{
- calendar_config_init ();
-
- gconf_client_set_string (config, CALENDAR_CONFIG_PRIMARY_CALENDAR, primary_uid, NULL);
-}
-
-
-guint
-calendar_config_add_notification_primary_calendar (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- calendar_config_init ();
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_PRIMARY_CALENDAR, func, data, NULL, NULL);
-
- return id;
-}
-
-
-/* The current timezone, e.g. "Europe/London". It may be NULL, in which case
- you should assume UTC (though Evolution will show the timezone-setting
- dialog the next time a calendar or task folder is selected). */
-gchar *
-calendar_config_get_timezone (void)
-{
- calendar_config_init ();
-
- return gconf_client_get_string (config, CALENDAR_CONFIG_TIMEZONE, NULL);
-}
-
-icaltimezone *
-calendar_config_get_icaltimezone (void)
-{
- char *location;
- icaltimezone *zone = NULL;
-
- calendar_config_init ();
-
- location = calendar_config_get_timezone ();
- if (location)
- zone = icaltimezone_get_builtin_timezone (location);
-
- if (!zone)
- zone = icaltimezone_get_utc_timezone ();
-
- return zone;
-}
-
-
-/* Sets the timezone. If set to NULL it defaults to UTC.
- FIXME: Should check it is being set to a valid timezone. */
-void
-calendar_config_set_timezone (gchar *timezone)
-{
- calendar_config_init ();
-
- if (timezone && timezone[0])
- gconf_client_set_string (config, CALENDAR_CONFIG_TIMEZONE, timezone, NULL);
- else
- gconf_client_set_string (config, CALENDAR_CONFIG_TIMEZONE, "UTC", NULL);
-}
-
-guint
-calendar_config_add_notification_timezone (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- calendar_config_init ();
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_TIMEZONE, func, data, NULL, NULL);
-
- return id;
-}
-
-/* Whether we use 24-hour format or 12-hour format (AM/PM). */
-gboolean
-calendar_config_get_24_hour_format (void)
-{
- calendar_config_init ();
-
- /* If the locale defines 'am' and 'pm' strings then the user has the
- choice of 12-hour or 24-hour time format, with 12-hour as the
- default. If the locale doesn't have 'am' and 'pm' strings we have
- to use 24-hour format, or strftime()/strptime() won't work. */
- if (calendar_config_locale_supports_12_hour_format ())
- return gconf_client_get_bool (config, CALENDAR_CONFIG_24HOUR, NULL);
-
- return TRUE;
-}
-
-
-void
-calendar_config_set_24_hour_format (gboolean use_24_hour)
-{
- calendar_config_init ();
-
- gconf_client_set_bool (config, CALENDAR_CONFIG_24HOUR, use_24_hour, NULL);
-}
-
-guint
-calendar_config_add_notification_24_hour_format (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- calendar_config_init ();
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_24HOUR, func, data, NULL, NULL);
-
- return id;
-}
-
-/* The start day of the week (0 = Sun to 6 = Mon). */
-gint
-calendar_config_get_week_start_day (void)
-{
- calendar_config_init ();
-
- return gconf_client_get_int (config, CALENDAR_CONFIG_WEEK_START, NULL);
-}
-
-
-void
-calendar_config_set_week_start_day (gint week_start_day)
-{
- calendar_config_init ();
-
- gconf_client_set_int (config, CALENDAR_CONFIG_WEEK_START, week_start_day, NULL);
-}
-
-guint
-calendar_config_add_notification_week_start_day (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- calendar_config_init ();
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_WEEK_START, func, data, NULL, NULL);
-
- return id;
-}
-
-/* The start and end times of the work-day. */
-gint
-calendar_config_get_day_start_hour (void)
-{
- calendar_config_init ();
-
- return gconf_client_get_int (config, CALENDAR_CONFIG_DAY_START_HOUR, NULL);
-}
-
-
-void
-calendar_config_set_day_start_hour (gint day_start_hour)
-{
- calendar_config_init ();
-
- gconf_client_set_int (config, CALENDAR_CONFIG_DAY_START_HOUR, day_start_hour, NULL);
-}
-
-guint
-calendar_config_add_notification_day_start_hour (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- calendar_config_init ();
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_DAY_START_HOUR, func, data, NULL, NULL);
-
- return id;
-}
-
-gint
-calendar_config_get_day_start_minute (void)
-{
- calendar_config_init ();
-
- return gconf_client_get_int (config, CALENDAR_CONFIG_DAY_START_MINUTE, NULL);
-}
-
-
-void
-calendar_config_set_day_start_minute (gint day_start_min)
-{
- calendar_config_init ();
-
- gconf_client_set_int (config, CALENDAR_CONFIG_DAY_START_MINUTE, day_start_min, NULL);
-}
-
-guint
-calendar_config_add_notification_day_start_minute (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- calendar_config_init ();
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_DAY_START_MINUTE, func, data, NULL, NULL);
-
- return id;
-}
-
-gint
-calendar_config_get_day_end_hour (void)
-{
- calendar_config_init ();
-
- return gconf_client_get_int (config, CALENDAR_CONFIG_DAY_END_HOUR, NULL);
-}
-
-
-void
-calendar_config_set_day_end_hour (gint day_end_hour)
-{
- calendar_config_init ();
-
- gconf_client_set_int (config, CALENDAR_CONFIG_DAY_END_HOUR, day_end_hour, NULL);
-}
-
-guint
-calendar_config_add_notification_day_end_hour (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- calendar_config_init ();
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_DAY_END_HOUR, func, data, NULL, NULL);
-
- return id;
-}
-
-gint
-calendar_config_get_day_end_minute (void)
-{
- calendar_config_init ();
-
- return gconf_client_get_int (config, CALENDAR_CONFIG_DAY_END_MINUTE, NULL);
-}
-
-
-void
-calendar_config_set_day_end_minute (gint day_end_min)
-{
- calendar_config_init ();
-
- gconf_client_set_int (config, CALENDAR_CONFIG_DAY_END_MINUTE, day_end_min, NULL);
-}
-
-guint
-calendar_config_add_notification_day_end_minute (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- calendar_config_init ();
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_DAY_END_MINUTE, func, data, NULL, NULL);
-
- return id;
-}
-
-/* The time divisions in the Day/Work-Week view in minutes (5/10/15/30/60). */
-gint
-calendar_config_get_time_divisions (void)
-{
- calendar_config_init ();
-
- return gconf_client_get_int (config, CALENDAR_CONFIG_TIME_DIVISIONS, NULL);
-}
-
-
-void
-calendar_config_set_time_divisions (gint divisions)
-{
- calendar_config_init ();
-
- gconf_client_set_int (config, CALENDAR_CONFIG_TIME_DIVISIONS, divisions, NULL);
-}
-
-guint
-calendar_config_add_notification_time_divisions (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- calendar_config_init ();
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_TIME_DIVISIONS, func, data, NULL, NULL);
-
- return id;
-}
-
-/* Whether we show week numbers in the Date Navigator. */
-gboolean
-calendar_config_get_dnav_show_week_no (void)
-{
- calendar_config_init ();
-
- return gconf_client_get_bool (config, CALENDAR_CONFIG_DN_SHOW_WEEK_NUMBERS, NULL);
-}
-
-
-void
-calendar_config_set_dnav_show_week_no (gboolean show_week_no)
-{
- calendar_config_init ();
-
- gconf_client_set_bool (config, CALENDAR_CONFIG_DN_SHOW_WEEK_NUMBERS, show_week_no, NULL);
-}
-
-guint
-calendar_config_add_notification_dnav_show_week_no (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- calendar_config_init ();
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_DN_SHOW_WEEK_NUMBERS, func, data, NULL, NULL);
-
- return id;
-}
-
-/* The positions of the panes in the normal and month views. */
-gint
-calendar_config_get_hpane_pos (void)
-{
- calendar_config_init ();
-
- return gconf_client_get_int (config, CALENDAR_CONFIG_HPANE_POS, NULL);
-}
-
-
-void
-calendar_config_set_hpane_pos (gint hpane_pos)
-{
- calendar_config_init ();
-
- gconf_client_set_int (config, CALENDAR_CONFIG_HPANE_POS, hpane_pos, NULL);
-}
-
-
-gint
-calendar_config_get_vpane_pos (void)
-{
- calendar_config_init ();
-
- return gconf_client_get_int (config, CALENDAR_CONFIG_VPANE_POS, NULL);
-}
-
-
-void
-calendar_config_set_vpane_pos (gint vpane_pos)
-{
- calendar_config_init ();
-
- gconf_client_set_int (config, CALENDAR_CONFIG_VPANE_POS, vpane_pos, NULL);
-}
-
-
-gint
-calendar_config_get_month_hpane_pos (void)
-{
- calendar_config_init ();
-
- return gconf_client_get_int (config, CALENDAR_CONFIG_MONTH_HPANE_POS, NULL);
-}
-
-
-void
-calendar_config_set_month_hpane_pos (gint hpane_pos)
-{
- calendar_config_init ();
-
- gconf_client_set_int (config, CALENDAR_CONFIG_MONTH_HPANE_POS, hpane_pos, NULL);
-}
-
-
-gint
-calendar_config_get_month_vpane_pos (void)
-{
- calendar_config_init ();
-
- return gconf_client_get_int (config, CALENDAR_CONFIG_MONTH_VPANE_POS, NULL);
-}
-
-
-void
-calendar_config_set_month_vpane_pos (gint vpane_pos)
-{
- gconf_client_set_int (config, CALENDAR_CONFIG_MONTH_VPANE_POS, vpane_pos, NULL);
-}
-
-/* The current list of task lists selected */
-GSList *
-calendar_config_get_tasks_selected (void)
-{
- return gconf_client_get_list (config, CALENDAR_CONFIG_TASKS_SELECTED_TASKS, GCONF_VALUE_STRING, NULL);
-}
-
-void
-calendar_config_set_tasks_selected (GSList *selected)
-{
- gconf_client_set_list (config, CALENDAR_CONFIG_TASKS_SELECTED_TASKS, GCONF_VALUE_STRING, selected, NULL);
-}
-
-guint
-calendar_config_add_notification_tasks_selected (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_TASKS_SELECTED_TASKS, func, data, NULL, NULL);
-
- return id;
-}
-
-/* The primary task list */
-char *
-calendar_config_get_primary_tasks (void)
-{
- return gconf_client_get_string (config, CALENDAR_CONFIG_PRIMARY_TASKS, NULL);
-}
-
-void
-calendar_config_set_primary_tasks (const char *primary_uid)
-{
- gconf_client_set_string (config, CALENDAR_CONFIG_PRIMARY_TASKS, primary_uid, NULL);
-}
-
-
-guint
-calendar_config_add_notification_primary_tasks (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_PRIMARY_TASKS, func, data, NULL, NULL);
-
- return id;
-}
-
-gint
-calendar_config_get_task_vpane_pos (void)
-{
- return gconf_client_get_int (config, CALENDAR_CONFIG_TASK_VPANE_POS, NULL);
-}
-
-
-void
-calendar_config_set_task_vpane_pos (gint vpane_pos)
-{
- gconf_client_set_int (config, CALENDAR_CONFIG_TASK_VPANE_POS, vpane_pos, NULL);
-}
-
-
-/* Whether we compress the weekend in the week/month views. */
-gboolean
-calendar_config_get_compress_weekend (void)
-{
- return gconf_client_get_bool (config, CALENDAR_CONFIG_COMPRESS_WEEKEND, NULL);
-}
-
-
-void
-calendar_config_set_compress_weekend (gboolean compress)
-{
- gconf_client_set_bool (config, CALENDAR_CONFIG_COMPRESS_WEEKEND, compress, NULL);
-}
-
-guint
-calendar_config_add_notification_compress_weekend (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_COMPRESS_WEEKEND, func, data, NULL, NULL);
-
- return id;
-}
-
-/* Whether we show event end times. */
-gboolean
-calendar_config_get_show_event_end (void)
-{
- return gconf_client_get_bool (config, CALENDAR_CONFIG_SHOW_EVENT_END, NULL);
-}
-
-
-void
-calendar_config_set_show_event_end (gboolean show_end)
-{
- gconf_client_set_bool (config, CALENDAR_CONFIG_SHOW_EVENT_END, show_end, NULL);
-}
-
-guint
-calendar_config_add_notification_show_event_end (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_SHOW_EVENT_END, func, data, NULL, NULL);
-
- return id;
-}
-
-/* The working days of the week, a bit-wise combination of flags. */
-CalWeekdays
-calendar_config_get_working_days (void)
-{
- return gconf_client_get_int (config, CALENDAR_CONFIG_WORKING_DAYS, NULL);
-}
-
-
-void
-calendar_config_set_working_days (CalWeekdays days)
-{
- gconf_client_set_int (config, CALENDAR_CONFIG_WORKING_DAYS, days, NULL);
-}
-
-guint
-calendar_config_add_notification_working_days (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_WORKING_DAYS , func, data, NULL, NULL);
-
- return id;
-}
-
-/* Settings to hide completed tasks. */
-gboolean
-calendar_config_get_hide_completed_tasks (void)
-{
- return gconf_client_get_bool (config, CALENDAR_CONFIG_TASKS_HIDE_COMPLETED, NULL);
-}
-
-
-void
-calendar_config_set_hide_completed_tasks (gboolean hide)
-{
- gconf_client_set_bool (config, CALENDAR_CONFIG_TASKS_HIDE_COMPLETED, hide, NULL);
-}
-
-guint
-calendar_config_add_notification_hide_completed_tasks (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_TASKS_HIDE_COMPLETED , func, data, NULL, NULL);
-
- return id;
-}
-
-CalUnits
-calendar_config_get_hide_completed_tasks_units (void)
-{
- char *units;
- CalUnits cu;
-
- units = gconf_client_get_string (config, CALENDAR_CONFIG_TASKS_HIDE_COMPLETED_UNITS, NULL);
-
- if (units && !strcmp (units, "minutes"))
- cu = CAL_MINUTES;
- else if (units && !strcmp (units, "hours"))
- cu = CAL_HOURS;
- else
- cu = CAL_DAYS;
-
- g_free (units);
-
- return cu;
-}
-
-
-void
-calendar_config_set_hide_completed_tasks_units (CalUnits cu)
-{
- char *units;
-
- switch (cu) {
- case CAL_MINUTES :
- units = g_strdup ("minutes");
- break;
- case CAL_HOURS :
- units = g_strdup ("hours");
- break;
- default :
- units = g_strdup ("days");
- }
-
- gconf_client_set_string (config, CALENDAR_CONFIG_TASKS_HIDE_COMPLETED_UNITS, units, NULL);
-
- g_free (units);
-}
-
-guint
-calendar_config_add_notification_hide_completed_tasks_units (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_TASKS_HIDE_COMPLETED_UNITS , func, data, NULL, NULL);
-
- return id;
-}
-
-gint
-calendar_config_get_hide_completed_tasks_value (void)
-{
- return gconf_client_get_int (config, CALENDAR_CONFIG_TASKS_HIDE_COMPLETED_VALUE, NULL);
-}
-
-
-void
-calendar_config_set_hide_completed_tasks_value (gint value)
-{
- gconf_client_set_int (config, CALENDAR_CONFIG_TASKS_HIDE_COMPLETED_VALUE, value, NULL);
-}
-
-guint
-calendar_config_add_notification_hide_completed_tasks_value (GConfClientNotifyFunc func, gpointer data)
-{
- guint id;
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_TASKS_HIDE_COMPLETED_VALUE , func, data, NULL, NULL);
-
- return id;
-}
-
-/**
- * calendar_config_get_confirm_delete:
- *
- * Queries the configuration value for whether a confirmation dialog is
- * presented when deleting calendar/tasks items.
- *
- * Return value: Whether confirmation is required when deleting items.
- **/
-gboolean
-calendar_config_get_confirm_delete (void)
-{
- return gconf_client_get_bool (config, CALENDAR_CONFIG_PROMPT_DELETE, NULL);
-}
-
-/**
- * calendar_config_set_confirm_delete:
- * @confirm: Whether confirmation is required when deleting items.
- *
- * Sets the configuration value for whether a confirmation dialog is presented
- * when deleting calendar/tasks items.
- **/
-void
-calendar_config_set_confirm_delete (gboolean confirm)
-{
- gconf_client_set_bool (config, CALENDAR_CONFIG_PROMPT_DELETE, confirm, NULL);
-}
-
-/**
- * calendar_config_get_confirm_purge:
- *
- * Queries the configuration value for whether a confirmation dialog is
- * presented when purging calendar/tasks items.
- *
- * Return value: Whether confirmation is required when purging items.
- **/
-gboolean
-calendar_config_get_confirm_purge (void)
-{
- return gconf_client_get_bool (config, CALENDAR_CONFIG_PROMPT_PURGE, NULL);
-}
-
-/**
- * calendar_config_set_confirm_purge:
- * @confirm: Whether confirmation is required when purging items.
- *
- * Sets the configuration value for whether a confirmation dialog is presented
- * when purging calendar/tasks items.
- **/
-void
-calendar_config_set_confirm_purge (gboolean confirm)
-{
- gconf_client_set_bool (config, CALENDAR_CONFIG_PROMPT_PURGE, confirm, NULL);
-}
-
-void
-calendar_config_check_timezone_set ()
-{
- ETimezoneDialog *timezone_dialog;
- GtkWidget *dialog;
- GList *elem;
- char *zone;
-
- zone = calendar_config_get_timezone ();
- if (zone && zone[0])
- return;
-
- /* Show timezone dialog. */
- timezone_dialog = e_timezone_dialog_new ();
- dialog = e_timezone_dialog_get_toplevel (timezone_dialog);
-
- /* Hide the cancel button, which is the 2nd button. */
- elem = g_list_nth (GNOME_DIALOG (dialog)->buttons, 1);
- gtk_widget_hide (elem->data);
-
- g_signal_connect (dialog, "clicked",
- G_CALLBACK (on_timezone_set), timezone_dialog);
- g_signal_connect (dialog, "delete-event",
- G_CALLBACK (on_timezone_dialog_delete_event), timezone_dialog);
-
- gtk_widget_show (dialog);
-}
-
-
-static void
-on_timezone_set (GnomeDialog *dialog,
- int button,
- ETimezoneDialog *etd)
-{
- icaltimezone *zone;
-
- zone = e_timezone_dialog_get_timezone (etd);
- if (zone)
- calendar_config_set_timezone (icaltimezone_get_location (zone));
-
- g_object_unref (etd);
-}
-
-
-static gboolean
-on_timezone_dialog_delete_event (GnomeDialog *dialog,
- GdkEvent *event,
- ETimezoneDialog *etd)
-{
- g_object_unref (etd);
- return TRUE;
-}
-
-
-/**
- * calendar_config_get_tasks_due_today_color:
- *
- * Queries the color to be used to display tasks that are due today.
- *
- * Return value: An X color specification.
- **/
-const char *
-calendar_config_get_tasks_due_today_color (void)
-{
- static char *color = NULL;
-
- if (color)
- g_free (color);
-
- color = gconf_client_get_string (config, CALENDAR_CONFIG_TASKS_DUE_TODAY_COLOR, NULL);
- return color;
-}
-
-/**
- * calendar_config_set_tasks_due_today_color:
- * @color: X color specification
- *
- * Sets the color to be used to display tasks that are due today.
- **/
-void
-calendar_config_set_tasks_due_today_color (const char *color)
-{
- g_return_if_fail (color != NULL);
-
- gconf_client_set_string (config, CALENDAR_CONFIG_TASKS_DUE_TODAY_COLOR, color, NULL);
-}
-
-/**
- * calendar_config_get_tasks_overdue_color:
- *
- * Queries the color to be used to display overdue tasks.
- *
- * Return value: An X color specification.
- **/
-const char *
-calendar_config_get_tasks_overdue_color (void)
-{
- static char *color = NULL;
-
- if (color)
- g_free (color);
-
- color = gconf_client_get_string (config, CALENDAR_CONFIG_TASKS_OVERDUE_COLOR, NULL);
- return color;
-}
-
-/**
- * calendar_config_set_tasks_overdue_color:
- * @color: X color specification
- *
- * Sets the color to be used to display overdue tasks.
- **/
-void
-calendar_config_set_tasks_overdue_color (const char *color)
-{
- g_return_if_fail (color != NULL);
-
- gconf_client_set_string (config, CALENDAR_CONFIG_TASKS_OVERDUE_COLOR, color, NULL);
-}
-
-/**
- * calendar_config_get_use_default_reminder:
- *
- * Queries whether new appointments should be created with a default reminder.
- *
- * Return value: Boolean value indicating whether new appointments should be
- * created with a default reminder from the values of
- * calendar_config_get_default_reminder_interval() and
- * calendar_config_get_default_reminder_units().
- **/
-gboolean
-calendar_config_get_use_default_reminder (void)
-{
- return gconf_client_get_bool (config, CALENDAR_CONFIG_DEFAULT_REMINDER, NULL);
-}
-
-/**
- * calendar_config_set_use_default_reminder:
- * @value: Whether to create new appointments with a default reminder.
- *
- * Sets whether newly-created appointments should get a default reminder set
- * them.
- **/
-void
-calendar_config_set_use_default_reminder (gboolean value)
-{
- gconf_client_set_bool (config, CALENDAR_CONFIG_DEFAULT_REMINDER, value, NULL);
-}
-
-/**
- * calendar_config_get_default_reminder_interval:
- *
- * Queries the interval for the default reminder of newly-created
- * appointments, i.e. 5 in "5 minutes".
- *
- * Return value: Interval for default reminders.
- **/
-int
-calendar_config_get_default_reminder_interval (void)
-{
- return gconf_client_get_int (config, CALENDAR_CONFIG_DEFAULT_REMINDER_INTERVAL, NULL);
-}
-
-/**
- * calendar_config_set_default_reminder_interval:
- * @interval: Interval value, e.g. 5 for "5 minutes".
- *
- * Sets the interval that should be used for the default reminder in new
- * appointments.
- **/
-void
-calendar_config_set_default_reminder_interval (int interval)
-{
- gconf_client_set_int (config, CALENDAR_CONFIG_DEFAULT_REMINDER_INTERVAL, interval, NULL);
-}
-
-/**
- * calendar_config_get_default_reminder_units:
- *
- * Queries the units of time in which default reminders should be created for
- * new appointments, e.g. CAL_MINUTES for "5 minutes".
- *
- * Return value: Time units for default reminders.
- **/
-CalUnits
-calendar_config_get_default_reminder_units (void)
-{
- char *units;
- CalUnits cu;
-
- units = gconf_client_get_string (config, CALENDAR_CONFIG_DEFAULT_REMINDER_UNITS, NULL);
-
- if (units && !strcmp (units, "days"))
- cu = CAL_DAYS;
- else if (units && !strcmp (units, "hours"))
- cu = CAL_HOURS;
- else
- cu = CAL_MINUTES;
- g_free (units);
-
- return cu;
-}
-
-/**
- * calendar_config_set_default_reminder_units:
- * @units: Time units, e.g. CAL_MINUTES for "5 minutes".
- *
- * Sets the units to be used for default reminders in new appointments.
- **/
-void
-calendar_config_set_default_reminder_units (CalUnits units)
-{
- gconf_client_set_string (config, CALENDAR_CONFIG_DEFAULT_REMINDER_UNITS, units_to_string(units), NULL);
-}
-
-/**
- * calendar_config_get_hide_completed_tasks_sexp:
- *
- * Returns the subexpression to use to filter out completed tasks according
- * to the config settings. The returned sexp should be freed.
- **/
-char*
-calendar_config_get_hide_completed_tasks_sexp (void)
-{
- char *sexp = NULL;
-
- if (calendar_config_get_hide_completed_tasks ()) {
- CalUnits units;
- gint value;
-
- units = calendar_config_get_hide_completed_tasks_units ();
- value = calendar_config_get_hide_completed_tasks_value ();
-
- if (value == 0) {
- /* If the value is 0, we want to hide completed tasks
- immediately, so we filter out all completed tasks.*/
- sexp = g_strdup ("(not is-completed?)");
- } else {
- char *isodate;
- icaltimezone *zone;
- struct icaltimetype tt;
- time_t t;
-
- /* Get the current time, and subtract the appropriate
- number of days/hours/minutes. */
- zone = calendar_config_get_icaltimezone ();
- tt = icaltime_current_time_with_zone (zone);
-
- switch (units) {
- case CAL_DAYS:
- icaltime_adjust (&tt, -value, 0, 0, 0);
- break;
- case CAL_HOURS:
- icaltime_adjust (&tt, 0, -value, 0, 0);
- break;
- case CAL_MINUTES:
- icaltime_adjust (&tt, 0, 0, -value, 0);
- break;
- default:
- g_assert_not_reached ();
- }
-
- t = icaltime_as_timet_with_zone (tt, zone);
-
- /* Convert the time to an ISO date string, and build
- the query sub-expression. */
- isodate = isodate_from_time_t (t);
- sexp = g_strdup_printf ("(not (completed-before? (make-time \"%s\")))", isodate);
- }
- }
-
- return sexp;
-}
-
-GSList *
-calendar_config_get_free_busy (void)
-{
- return gconf_client_get_list (config, CALENDAR_CONFIG_PUBLISH,
- GCONF_VALUE_STRING, NULL);
-}
-
-void
-calendar_config_set_free_busy (GSList *url_list)
-{
- gconf_client_set_list (config, CALENDAR_CONFIG_PUBLISH,
- GCONF_VALUE_STRING, url_list, NULL);
-}
-
-gchar *
-calendar_config_get_free_busy_template (void)
-{
- return gconf_client_get_string (config, CALENDAR_CONFIG_TEMPLATE, NULL);
-}
-
-void
-calendar_config_set_free_busy_template (const gchar *template)
-{
- gconf_client_set_string (config, CALENDAR_CONFIG_TEMPLATE, template, NULL);
-}
-
-guint
-calendar_config_add_notification_free_busy_template (GConfClientNotifyFunc func,
- gpointer data)
-{
- guint id;
-
- id = gconf_client_notify_add (config, CALENDAR_CONFIG_TEMPLATE, func, data,
- NULL, NULL);
-
- return id;
-}
diff --git a/calendar/gui/calendar-config.h b/calendar/gui/calendar-config.h
deleted file mode 100644
index 414e52b14f..0000000000
--- a/calendar/gui/calendar-config.h
+++ /dev/null
@@ -1,217 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Authors :
- * Damon Chaplin <damon@ximian.com>
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 2000, Ximian, Inc.
- * Copyright 2000, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * calendar-config.h - functions to load/save/get/set user settings.
- */
-
-#ifndef _CALENDAR_CONFIG_H_
-#define _CALENDAR_CONFIG_H_
-
-#include <glib.h>
-#include <libecal/e-cal.h>
-#include <gconf/gconf-client.h>
-
-/* These are used to get/set the working days in the week. The bit-flags are
- combined together. The bits must be from 0 (Sun) to 6 (Sat) to match the
- day values used by localtime etc. */
-typedef enum
-{
- CAL_SUNDAY = 1 << 0,
- CAL_MONDAY = 1 << 1,
- CAL_TUESDAY = 1 << 2,
- CAL_WEDNESDAY = 1 << 3,
- CAL_THURSDAY = 1 << 4,
- CAL_FRIDAY = 1 << 5,
- CAL_SATURDAY = 1 << 6
-} CalWeekdays;
-
-
-/* Units for settings. */
-typedef enum
-{
- CAL_DAYS,
- CAL_HOURS,
- CAL_MINUTES
-} CalUnits;
-
-
-void calendar_config_remove_notification (guint id);
-
-/*
- * Calendar Settings.
- */
-
-/* The current list of calendars selected */
-GSList *calendar_config_get_calendars_selected (void);
-void calendar_config_set_calendars_selected (GSList *selected);
-guint calendar_config_add_notification_calendars_selected (GConfClientNotifyFunc func, gpointer data);
-
-/* The primary calendar */
-char *calendar_config_get_primary_calendar (void);
-void calendar_config_set_primary_calendar (const char *primary_uid);
-guint calendar_config_add_notification_primary_calendar (GConfClientNotifyFunc func, gpointer data);
-
-/* The current timezone, e.g. "Europe/London". */
-gchar* calendar_config_get_timezone (void);
-icaltimezone *calendar_config_get_icaltimezone (void);
-void calendar_config_set_timezone (gchar *timezone);
-guint calendar_config_add_notification_timezone (GConfClientNotifyFunc func, gpointer data);
-
-/* The working days of the week, a bit-wise combination of flags. */
-CalWeekdays calendar_config_get_working_days (void);
-void calendar_config_set_working_days (CalWeekdays days);
-guint calendar_config_add_notification_working_days (GConfClientNotifyFunc func, gpointer data);
-
-/* The start day of the week (0 = Sun to 6 = Sat). */
-gint calendar_config_get_week_start_day (void);
-void calendar_config_set_week_start_day (gint week_start_day);
-guint calendar_config_add_notification_week_start_day (GConfClientNotifyFunc func, gpointer data);
-
-/* The start and end times of the work-day. */
-gint calendar_config_get_day_start_hour (void);
-void calendar_config_set_day_start_hour (gint day_start_hour);
-guint calendar_config_add_notification_day_start_hour (GConfClientNotifyFunc func, gpointer data);
-
-gint calendar_config_get_day_start_minute (void);
-void calendar_config_set_day_start_minute (gint day_start_min);
-guint calendar_config_add_notification_day_start_minute (GConfClientNotifyFunc func, gpointer data);
-
-gint calendar_config_get_day_end_hour (void);
-void calendar_config_set_day_end_hour (gint day_end_hour);
-guint calendar_config_add_notification_day_end_hour (GConfClientNotifyFunc func, gpointer data);
-
-gint calendar_config_get_day_end_minute (void);
-void calendar_config_set_day_end_minute (gint day_end_min);
-guint calendar_config_add_notification_day_end_minute (GConfClientNotifyFunc func, gpointer data);
-
-/* Whether we use 24-hour format or 12-hour format (AM/PM). */
-gboolean calendar_config_get_24_hour_format (void);
-void calendar_config_set_24_hour_format (gboolean use_24_hour);
-guint calendar_config_add_notification_24_hour_format (GConfClientNotifyFunc func, gpointer data);
-
-/* The time divisions in the Day/Work-Week view in minutes (5/10/15/30/60). */
-gint calendar_config_get_time_divisions (void);
-void calendar_config_set_time_divisions (gint divisions);
-guint calendar_config_add_notification_time_divisions (GConfClientNotifyFunc func, gpointer data);
-
-/* Whether we show event end times. */
-gboolean calendar_config_get_show_event_end (void);
-void calendar_config_set_show_event_end (gboolean show_end);
-guint calendar_config_add_notification_show_event_end (GConfClientNotifyFunc func, gpointer data);
-
-/* Whether we compress the weekend in the week/month views. */
-gboolean calendar_config_get_compress_weekend (void);
-void calendar_config_set_compress_weekend (gboolean compress);
-guint calendar_config_add_notification_compress_weekend (GConfClientNotifyFunc func, gpointer data);
-
-/* Whether we show week numbers in the Date Navigator. */
-gboolean calendar_config_get_dnav_show_week_no (void);
-void calendar_config_set_dnav_show_week_no (gboolean show_week_no);
-guint calendar_config_add_notification_dnav_show_week_no (GConfClientNotifyFunc func, gpointer data);
-
-/* The positions of the panes in the normal and month views. */
-gint calendar_config_get_hpane_pos (void);
-void calendar_config_set_hpane_pos (gint hpane_pos);
-
-gint calendar_config_get_vpane_pos (void);
-void calendar_config_set_vpane_pos (gint vpane_pos);
-
-gint calendar_config_get_month_hpane_pos (void);
-void calendar_config_set_month_hpane_pos (gint hpane_pos);
-
-gint calendar_config_get_month_vpane_pos (void);
-void calendar_config_set_month_vpane_pos (gint vpane_pos);
-
-/* The current list of task lists selected */
-GSList *calendar_config_get_tasks_selected (void);
-void calendar_config_set_tasks_selected (GSList *selected);
-guint calendar_config_add_notification_tasks_selected (GConfClientNotifyFunc func, gpointer data);
-
-/* The primary calendar */
-char *calendar_config_get_primary_tasks (void);
-void calendar_config_set_primary_tasks (const char *primary_uid);
-guint calendar_config_add_notification_primary_tasks (GConfClientNotifyFunc func, gpointer data);
-
-/* The pane position */
-gint calendar_config_get_task_vpane_pos (void);
-void calendar_config_set_task_vpane_pos (gint vpane_pos);
-
-/* Colors for the task list */
-const char *calendar_config_get_tasks_due_today_color (void);
-void calendar_config_set_tasks_due_today_color (const char *color);
-
-const char *calendar_config_get_tasks_overdue_color (void);
-void calendar_config_set_tasks_overdue_color (const char *color);
-
-/* Settings to hide completed tasks. */
-gboolean calendar_config_get_hide_completed_tasks (void);
-void calendar_config_set_hide_completed_tasks (gboolean hide);
-guint calendar_config_add_notification_hide_completed_tasks (GConfClientNotifyFunc func, gpointer data);
-
-CalUnits calendar_config_get_hide_completed_tasks_units(void);
-void calendar_config_set_hide_completed_tasks_units(CalUnits units);
-guint calendar_config_add_notification_hide_completed_tasks_units (GConfClientNotifyFunc func, gpointer data);
-
-gint calendar_config_get_hide_completed_tasks_value(void);
-void calendar_config_set_hide_completed_tasks_value(gint value);
-guint calendar_config_add_notification_hide_completed_tasks_value (GConfClientNotifyFunc func, gpointer data);
-
-char* calendar_config_get_hide_completed_tasks_sexp (void);
-
-/* Confirmation options */
-gboolean calendar_config_get_confirm_delete (void);
-void calendar_config_set_confirm_delete (gboolean confirm);
-
-gboolean calendar_config_get_confirm_purge (void);
-void calendar_config_set_confirm_purge (gboolean confirm);
-
-/* Default reminder options */
-gboolean calendar_config_get_use_default_reminder (void);
-void calendar_config_set_use_default_reminder (gboolean value);
-
-int calendar_config_get_default_reminder_interval (void);
-void calendar_config_set_default_reminder_interval (int interval);
-
-CalUnits calendar_config_get_default_reminder_units (void);
-void calendar_config_set_default_reminder_units (CalUnits units);
-
-/* Free/Busy Settings */
-GSList * calendar_config_get_free_busy (void);
-void calendar_config_set_free_busy (GSList * url_list);
-
-gchar *calendar_config_get_free_busy_template (void);
-void calendar_config_set_free_busy_template (const gchar *template);
-guint calendar_config_add_notification_free_busy_template (GConfClientNotifyFunc func,
- gpointer data);
-
-/* Shows the timezone dialog if the user hasn't set a default timezone. */
-void calendar_config_check_timezone_set (void);
-
-/* Returns TRUE if the locale has 'am' and 'pm' strings defined, i.e. it
- supports 12-hour time format. */
-gboolean calendar_config_locale_supports_12_hour_format(void);
-
-#endif /* _CALENDAR_CONFIG_H_ */
diff --git a/calendar/gui/calendar-offline-handler.c b/calendar/gui/calendar-offline-handler.c
deleted file mode 100644
index 9126d49337..0000000000
--- a/calendar/gui/calendar-offline-handler.c
+++ /dev/null
@@ -1,348 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* calendar-offline-handler.c
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Authors:
- * Ettore Perazzoli <ettore@ximian.com>
- * Dan Winship <danw@ximian.com>
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkmain.h>
-#include <gtk/gtksignal.h>
-#include <bonobo/bonobo-exception.h>
-#include <bonobo/bonobo-i18n.h>
-#include <libedataserver/e-url.h>
-#include <libecal/e-cal.h>
-#include "calendar-offline-handler.h"
-#include "common/authentication.h"
-
-#define PARENT_TYPE bonobo_object_get_type ()
-static BonoboObjectClass *parent_class = NULL;
-
-struct _CalendarOfflineHandlerPrivate {
- ECal *client;
-
- GNOME_Evolution_OfflineProgressListener listener_interface;
-
- gboolean is_offline;
-};
-
-static void
-add_connection (gpointer data, gpointer user_data)
-{
- EUri *uri = e_uri_new (data);
- GNOME_Evolution_ConnectionList *list = user_data;
-
- g_return_if_fail (uri != NULL);
-
- if (uri->host != NULL)
- list->_buffer[list->_length].hostName = CORBA_string_dup (uri->host);
- else
- list->_buffer[list->_length].hostName = CORBA_string_dup ("Unknown");
- if (uri->protocol != NULL)
- list->_buffer[list->_length].type = CORBA_string_dup (uri->protocol);
- else
- list->_buffer[list->_length].type = CORBA_string_dup ("Unknown");
- list->_length++;
-
- e_uri_free (uri);
-}
-
-static GNOME_Evolution_ConnectionList *
-create_connection_list (CalendarOfflineHandler *offline_handler)
-{
- CalendarOfflineHandlerPrivate *priv;
- GNOME_Evolution_ConnectionList *list;
- GList *uris;
-
- priv = offline_handler->priv;
-
- uris = e_cal_uri_list (priv->client, CAL_MODE_REMOTE);
-
- list = GNOME_Evolution_ConnectionList__alloc ();
- list->_length = 0;
- list->_maximum = g_list_length (uris);
- list->_buffer = CORBA_sequence_GNOME_Evolution_Connection_allocbuf (list->_maximum);
-
- g_list_foreach (uris, add_connection, list);
-
- return list;
-}
-
-/* GNOME::Evolution::Offline methods. */
-static CORBA_boolean
-impl__get_isOffline (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- CalendarOfflineHandler *offline_handler;
- CalendarOfflineHandlerPrivate *priv;
-
- offline_handler = CALENDAR_OFFLINE_HANDLER (bonobo_object_from_servant (servant));
- priv = offline_handler->priv;
-
- return priv->is_offline;
-}
-
-static void
-impl_prepareForOffline (PortableServer_Servant servant,
- GNOME_Evolution_ConnectionList **active_connection_list,
- CORBA_Environment *ev)
-{
- CalendarOfflineHandler *offline_handler;
- CalendarOfflineHandlerPrivate *priv;
-
- offline_handler = CALENDAR_OFFLINE_HANDLER (bonobo_object_from_servant (servant));
- priv = offline_handler->priv;
-
- *active_connection_list = create_connection_list (offline_handler);
-}
-
-static void
-update_offline (CalendarOfflineHandler *offline_handler)
-{
- CalendarOfflineHandlerPrivate *priv;
- GNOME_Evolution_ConnectionList *connection_list;
- CORBA_Environment ev;
-
- priv = offline_handler->priv;
-
- connection_list = create_connection_list (offline_handler);
-
- CORBA_exception_init (&ev);
-
- GNOME_Evolution_OfflineProgressListener_updateProgress (priv->listener_interface,
- connection_list, &ev);
-
- if (BONOBO_EX (&ev))
- g_warning ("Error updating offline progress");
-
- CORBA_exception_free (&ev);
-}
-
-static void
-backend_cal_set_mode (ECal *client, ECalSetModeStatus status, CalMode mode, gpointer data)
-{
- CalendarOfflineHandler *offline_handler = data;
-
- update_offline (offline_handler);
- g_object_unref (client);
-}
-
-static void
-backend_cal_opened_offline (ECal *client, ECalendarStatus status, gpointer data)
-{
- CalendarOfflineHandler *offline_handler = data;
-
- if (status != E_CALENDAR_STATUS_OK) {
- update_offline (offline_handler);
- g_object_unref (client);
- return;
- }
-
- g_signal_connect (client, "cal_set_mode", G_CALLBACK (backend_cal_set_mode), offline_handler);
- e_cal_set_mode (client, CAL_MODE_LOCAL);
-}
-
-static void
-backend_cal_opened_online (ECal *client, ECalendarStatus status, gpointer data)
-{
- if (status != E_CALENDAR_STATUS_OK) {
- g_object_unref (client);
- return;
- }
-
- e_cal_set_mode (client, CAL_MODE_REMOTE);
- g_object_unref (client);
-}
-
-static void
-backend_go_offline (gpointer data, gpointer user_data)
-{
- CalendarOfflineHandler *offline_handler = user_data;
- char *uri = data;
- ECal *client;
- gboolean success;
- GError *error = NULL;
-
- /* FIXME This should not use LAST */
- client = auth_new_cal_from_uri (uri, E_CAL_SOURCE_TYPE_LAST);
- g_signal_connect (client, "cal_opened", G_CALLBACK (backend_cal_opened_offline), offline_handler);
- success = e_cal_open (client, TRUE, &error);
- if (!success) {
- g_warning (G_STRLOC ": %s", error->message);
- update_offline (offline_handler);
- g_object_unref (client);
- g_error_free (error);
- return;
- }
-}
-
-static void
-backend_go_online (gpointer data, gpointer user_data)
-{
- CalendarOfflineHandler *offline_handler = user_data;
- char *uri = data;
- ECal *client;
- gboolean success;
- GError *error = NULL;
-
- /* FIXME This should not use LAST */
- client = auth_new_cal_from_uri (uri, E_CAL_SOURCE_TYPE_LAST);
- g_signal_connect (G_OBJECT (client), "cal_opened",
- G_CALLBACK (backend_cal_opened_online), offline_handler);
- success = e_cal_open (client, TRUE, &error);
- if (!success) {
- g_warning (G_STRLOC ": %s", error->message);
- g_object_unref (client);
- g_error_free (error);
- return;
- }
-}
-
-static void
-impl_goOffline (PortableServer_Servant servant,
- const GNOME_Evolution_OfflineProgressListener progress_listener,
- CORBA_Environment *ev)
-{
- CalendarOfflineHandler *offline_handler;
- CalendarOfflineHandlerPrivate *priv;
- GList *uris;
-
- offline_handler = CALENDAR_OFFLINE_HANDLER (bonobo_object_from_servant (servant));
- priv = offline_handler->priv;
-
- /* To update the status */
- priv->listener_interface = CORBA_Object_duplicate (progress_listener, ev);
-
- uris = e_cal_uri_list (priv->client, CAL_MODE_REMOTE);
-
- g_list_foreach (uris, backend_go_offline, offline_handler);
-}
-
-static void
-impl_goOnline (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- CalendarOfflineHandler *offline_handler;
- CalendarOfflineHandlerPrivate *priv;
- GList *uris;
-
- offline_handler = CALENDAR_OFFLINE_HANDLER (bonobo_object_from_servant (servant));
- priv = offline_handler->priv;
-
- uris = e_cal_uri_list (priv->client, CAL_MODE_LOCAL);
-
- g_list_foreach (uris, backend_go_online, offline_handler);
-}
-
-/* GObject methods. */
-
-static void
-impl_dispose (GObject *object)
-{
- CalendarOfflineHandler *offline_handler;
- CalendarOfflineHandlerPrivate *priv;
-
- offline_handler = CALENDAR_OFFLINE_HANDLER (object);
- priv = offline_handler->priv;
-
- if (priv->client) {
- g_object_unref (priv->client);
- priv->client = NULL;
- }
-
- if (priv->listener_interface != CORBA_OBJECT_NIL) {
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
- CORBA_Object_release (priv->listener_interface, &ev);
- CORBA_exception_free (&ev);
-
- priv->listener_interface = CORBA_OBJECT_NIL;
- }
-
- if (G_OBJECT_CLASS (parent_class)->dispose)
- (* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-static void
-impl_finalize (GObject *object)
-{
- CalendarOfflineHandler *offline_handler;
- CalendarOfflineHandlerPrivate *priv;
-
- offline_handler = CALENDAR_OFFLINE_HANDLER (object);
- priv = offline_handler->priv;
-
- g_free (priv);
-
- if (G_OBJECT_CLASS (parent_class)->finalize)
- (* G_OBJECT_CLASS (parent_class)->finalize) (object);
-}
-
-/* GTK+ type initialization. */
-
-static void
-calendar_offline_handler_class_init (CalendarOfflineHandlerClass *klass)
-{
- GObjectClass *object_class;
- POA_GNOME_Evolution_Offline__epv *epv;
-
- object_class = G_OBJECT_CLASS (klass);
- object_class->dispose = impl_dispose;
- object_class->finalize = impl_finalize;
-
- epv = & klass->epv;
- epv->_get_isOffline = impl__get_isOffline;
- epv->prepareForOffline = impl_prepareForOffline;
- epv->goOffline = impl_goOffline;
- epv->goOnline = impl_goOnline;
-
- parent_class = gtk_type_class (PARENT_TYPE);
-}
-
-static void
-calendar_offline_handler_init (CalendarOfflineHandler *offline_handler)
-{
- CalendarOfflineHandlerPrivate *priv;
-
- priv = g_new (CalendarOfflineHandlerPrivate, 1);
- offline_handler->priv = priv;
-
- /* FIXME This should not use LAST */
- /* FIXME: what URI to use? */
- priv->client = auth_new_cal_from_uri ("", E_CAL_SOURCE_TYPE_LAST);
- priv->listener_interface = CORBA_OBJECT_NIL;
- priv->is_offline = FALSE;
-}
-
-CalendarOfflineHandler *
-calendar_offline_handler_new (void)
-{
- CalendarOfflineHandler *new;
-
- new = g_object_new (calendar_offline_handler_get_type (), NULL);
-
- return new;
-}
-
-BONOBO_TYPE_FUNC_FULL (CalendarOfflineHandler, GNOME_Evolution_Offline, PARENT_TYPE, calendar_offline_handler);
diff --git a/calendar/gui/calendar-offline-handler.h b/calendar/gui/calendar-offline-handler.h
deleted file mode 100644
index 3cc61b4f25..0000000000
--- a/calendar/gui/calendar-offline-handler.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* calendar-offline-handler.h
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli <ettore@ximian.com>
- */
-
-#ifndef _CALENDAR_OFFLINE_HANDLER_H_
-#define _CALENDAR_OFFLINE_HANDLER_H_
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <bonobo/bonobo-object.h>
-#include "Evolution.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define CALENDAR_TYPE_OFFLINE_HANDLER (calendar_offline_handler_get_type ())
-#define CALENDAR_OFFLINE_HANDLER(obj) (GTK_CHECK_CAST ((obj), CALENDAR_TYPE_OFFLINE_HANDLER, CalendarOfflineHandler))
-#define CALENDAR_OFFLINE_HANDLER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), CALENDAR_TYPE_OFFLINE_HANDLER, CalendarOfflineHandlerClass))
-#define CALENDAR_IS_OFFLINE_HANDLER(obj) (GTK_CHECK_TYPE ((obj), CALENDAR_TYPE_OFFLINE_HANDLER))
-#define CALENDAR_IS_OFFLINE_HANDLER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), CALENDAR_TYPE_OFFLINE_HANDLER))
-
-
-typedef struct _CalendarOfflineHandler CalendarOfflineHandler;
-typedef struct _CalendarOfflineHandlerPrivate CalendarOfflineHandlerPrivate;
-typedef struct _CalendarOfflineHandlerClass CalendarOfflineHandlerClass;
-
-struct _CalendarOfflineHandler {
- BonoboObject parent;
-
- CalendarOfflineHandlerPrivate *priv;
-};
-
-struct _CalendarOfflineHandlerClass {
- BonoboObjectClass parent_class;
-
- POA_GNOME_Evolution_Offline__epv epv;
-};
-
-
-GtkType calendar_offline_handler_get_type (void);
-CalendarOfflineHandler *calendar_offline_handler_new (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _CALENDAR_OFFLINE_HANDLER_H_ */
diff --git a/calendar/gui/calendar-view-factory.c b/calendar/gui/calendar-view-factory.c
deleted file mode 100644
index 2fced5476c..0000000000
--- a/calendar/gui/calendar-view-factory.c
+++ /dev/null
@@ -1,213 +0,0 @@
-/* Evolution calendar - Generic view factory for calendar views
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include <libgnome/gnome-i18n.h>
-#include "calendar-view-factory.h"
-#include "calendar-view.h"
-
-
-
-/* Private part of the CalendarViewFactory structure */
-struct _CalendarViewFactoryPrivate {
- /* Type of views created by this factory */
- GnomeCalendarViewType view_type;
-};
-
-
-
-static void calendar_view_factory_finalize (GObject *object);
-
-static const char *calendar_view_factory_get_title (GalViewFactory *factory);
-static const char *calendar_view_factory_get_type_code (GalViewFactory *factory);
-static GalView *calendar_view_factory_new_view (GalViewFactory *factory, const char *name);
-
-G_DEFINE_TYPE (CalendarViewFactory, calendar_view_factory, GAL_VIEW_FACTORY_TYPE);
-
-/* Class initialization function for the calendar view factory */
-static void
-calendar_view_factory_class_init (CalendarViewFactoryClass *class)
-{
- GalViewFactoryClass *gal_view_factory_class;
- GObjectClass *gobject_class;
-
- gal_view_factory_class = (GalViewFactoryClass *) class;
- gobject_class = (GObjectClass *) class;
-
- gal_view_factory_class->get_title = calendar_view_factory_get_title;
- gal_view_factory_class->get_type_code = calendar_view_factory_get_type_code;
- gal_view_factory_class->new_view = calendar_view_factory_new_view;
-
- gobject_class->finalize = calendar_view_factory_finalize;
-}
-
-/* Object initialization class for the calendar view factory */
-static void
-calendar_view_factory_init (CalendarViewFactory *cal_view_factory)
-{
- CalendarViewFactoryPrivate *priv;
-
- priv = g_new0 (CalendarViewFactoryPrivate, 1);
- cal_view_factory->priv = priv;
-}
-
-/* Finalize method for the calendar view factory */
-static void
-calendar_view_factory_finalize (GObject *object)
-{
- CalendarViewFactory *cal_view_factory;
- CalendarViewFactoryPrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_CALENDAR_VIEW_FACTORY (object));
-
- cal_view_factory = CALENDAR_VIEW_FACTORY (object);
- priv = cal_view_factory->priv;
-
- g_free (priv);
- cal_view_factory->priv = NULL;
-
- if (G_OBJECT_CLASS (calendar_view_factory_parent_class)->finalize)
- (* G_OBJECT_CLASS (calendar_view_factory_parent_class)->finalize) (object);
-}
-
-
-
-/* get_title method for the calendar view factory */
-static const char *
-calendar_view_factory_get_title (GalViewFactory *factory)
-{
- CalendarViewFactory *cal_view_factory;
- CalendarViewFactoryPrivate *priv;
-
- cal_view_factory = CALENDAR_VIEW_FACTORY (factory);
- priv = cal_view_factory->priv;
-
- switch (priv->view_type) {
- case GNOME_CAL_DAY_VIEW:
- return _("Day View");
-
- case GNOME_CAL_WORK_WEEK_VIEW:
- return _("Work Week View");
-
- case GNOME_CAL_WEEK_VIEW:
- return _("Week View");
-
- case GNOME_CAL_MONTH_VIEW:
- return _("Month View");
-
- default:
- g_assert_not_reached ();
- return NULL;
- }
-}
-
-/* get_type_code method for the calendar view factory */
-static const char *
-calendar_view_factory_get_type_code (GalViewFactory *factory)
-{
- CalendarViewFactory *cal_view_factory;
- CalendarViewFactoryPrivate *priv;
-
- cal_view_factory = CALENDAR_VIEW_FACTORY (factory);
- priv = cal_view_factory->priv;
-
- switch (priv->view_type) {
- case GNOME_CAL_DAY_VIEW:
- return "day_view";
-
- case GNOME_CAL_WORK_WEEK_VIEW:
- return "work_week_view";
-
- case GNOME_CAL_WEEK_VIEW:
- return "week_view";
-
- case GNOME_CAL_MONTH_VIEW:
- return "month_view";
-
- default:
- g_assert_not_reached ();
- return NULL;
- }
-}
-
-/* new_view method for the calendar view factory */
-static GalView *
-calendar_view_factory_new_view (GalViewFactory *factory, const char *name)
-{
- CalendarViewFactory *cal_view_factory;
- CalendarViewFactoryPrivate *priv;
- CalendarView *cal_view;
-
- cal_view_factory = CALENDAR_VIEW_FACTORY (factory);
- priv = cal_view_factory->priv;
-
- cal_view = calendar_view_new (priv->view_type, name);
- return GAL_VIEW (cal_view);
-}
-
-
-
-/**
- * calendar_view_factory_construct:
- * @cal_view_factory: A calendar view factory.
- * @view_type: Type of calendar views that the factory will create.
- *
- * Constructs a calendar view factory by setting the type of views it will
- * create.
- *
- * Return value: The same value as @cal_view_factory.
- **/
-CalendarViewFactory *
-calendar_view_factory_construct (CalendarViewFactory *cal_view_factory,
- GnomeCalendarViewType view_type)
-{
- CalendarViewFactoryPrivate *priv;
-
- g_return_val_if_fail (cal_view_factory != NULL, NULL);
- g_return_val_if_fail (IS_CALENDAR_VIEW_FACTORY (cal_view_factory), NULL);
-
- priv = cal_view_factory->priv;
-
- priv->view_type = view_type;
-
- return cal_view_factory;
-}
-
-/**
- * calendar_view_factory_new:
- * @view_type: Type of calendar views that the factory will create.
- *
- * Creates a new factory for calendar views.
- *
- * Return value: A newly-created calendar view factory.
- **/
-CalendarViewFactory *
-calendar_view_factory_new (GnomeCalendarViewType view_type)
-{
- CalendarViewFactory *cal_view_factory;
-
- cal_view_factory = g_object_new (TYPE_CALENDAR_VIEW_FACTORY, NULL);
- return calendar_view_factory_construct (cal_view_factory, view_type);
-}
diff --git a/calendar/gui/calendar-view-factory.h b/calendar/gui/calendar-view-factory.h
deleted file mode 100644
index 6d1de25590..0000000000
--- a/calendar/gui/calendar-view-factory.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Evolution calendar - Generic view factory for calendar views
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef CALENDAR_VIEW_FACTORY_H
-#define CALENDAR_VIEW_FACTORY_H
-
-#include <gal/menus/gal-view-factory.h>
-#include "gnome-cal.h"
-
-G_BEGIN_DECLS
-
-
-
-#define TYPE_CALENDAR_VIEW_FACTORY (calendar_view_factory_get_type ())
-#define CALENDAR_VIEW_FACTORY(obj) (GTK_CHECK_CAST ((obj), TYPE_CALENDAR_VIEW_FACTORY, \
- CalendarViewFactory))
-#define CALENDAR_VIEW_FACTORY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), \
- TYPE_CALENDAR_VIEW_FACTORY, CalendarViewClass))
-#define IS_CALENDAR_VIEW_FACTORY(obj) (GTK_CHECK_TYPE ((obj), TYPE_CALENDAR_VIEW_FACTORY))
-#define IS_CALENDAR_VIEW_FACTORY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), \
- TYPE_CALENDAR_VIEW_FACTORY))
-
-typedef struct _CalendarViewFactoryPrivate CalendarViewFactoryPrivate;
-
-typedef struct {
- GalViewFactory factory;
-
- /* Private data */
- CalendarViewFactoryPrivate *priv;
-} CalendarViewFactory;
-
-typedef struct {
- GalViewFactoryClass parent_class;
-} CalendarViewFactoryClass;
-
-GtkType calendar_view_factory_get_type (void);
-
-CalendarViewFactory *calendar_view_factory_construct (CalendarViewFactory *cal_view_factory,
- GnomeCalendarViewType view_type);
-
-CalendarViewFactory *calendar_view_factory_new (GnomeCalendarViewType view_type);
-
-
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/calendar-view.c b/calendar/gui/calendar-view.c
deleted file mode 100644
index bf199c49a0..0000000000
--- a/calendar/gui/calendar-view.c
+++ /dev/null
@@ -1,279 +0,0 @@
-/* Evolution calendar - Generic view object for calendar views
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "calendar-view.h"
-
-
-
-/* Private part of the CalendarView structure */
-struct _CalendarViewPrivate {
- /* Type of the view */
- GnomeCalendarViewType view_type;
-
- /* Title of the view */
- char *title;
-};
-
-
-
-static void calendar_view_finalize (GObject *object);
-
-static void calendar_view_edit (GalView *view, GtkWindow *parent_window);
-static void calendar_view_load (GalView *view, const char *filename);
-static void calendar_view_save (GalView *view, const char *filename);
-static const char *calendar_view_get_title (GalView *view);
-static void calendar_view_set_title (GalView *view, const char *title);
-static const char *calendar_view_get_type_code (GalView *view);
-static GalView *calendar_view_clone (GalView *view);
-
-G_DEFINE_TYPE (CalendarView, calendar_view, GAL_VIEW_TYPE);
-
-/* Class initialization function for the calendar view */
-static void
-calendar_view_class_init (CalendarViewClass *class)
-{
- GalViewClass *gal_view_class;
- GObjectClass *object_class;
-
- gal_view_class = (GalViewClass *) class;
- object_class = (GObjectClass *) class;
-
- gal_view_class->edit = calendar_view_edit;
- gal_view_class->load = calendar_view_load;
- gal_view_class->save = calendar_view_save;
- gal_view_class->get_title = calendar_view_get_title;
- gal_view_class->set_title = calendar_view_set_title;
- gal_view_class->get_type_code = calendar_view_get_type_code;
- gal_view_class->clone = calendar_view_clone;
-
- object_class->finalize = calendar_view_finalize;
-}
-
-/* Object initialization function for the calendar view */
-static void
-calendar_view_init (CalendarView *cal_view)
-{
- CalendarViewPrivate *priv;
-
- priv = g_new0 (CalendarViewPrivate, 1);
- cal_view->priv = priv;
-
- priv->title = NULL;
-}
-
-/* Destroy method for the calendar view */
-static void
-calendar_view_finalize (GObject *object)
-{
- CalendarView *cal_view;
- CalendarViewPrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_CALENDAR_VIEW (object));
-
- cal_view = CALENDAR_VIEW (object);
- priv = cal_view->priv;
-
- if (priv->title) {
- g_free (priv->title);
- priv->title = NULL;
- }
-
- g_free (priv);
- cal_view->priv = NULL;
-
- if (G_OBJECT_CLASS (calendar_view_parent_class)->finalize)
- (* G_OBJECT_CLASS (calendar_view_parent_class)->finalize) (object);
-}
-
-
-
-/* edit method of the calendar view */
-static void
-calendar_view_edit (GalView *view, GtkWindow *parent_window)
-{
- /* nothing */
-}
-
-/* load method of the calendar view */
-static void
-calendar_view_load (GalView *view, const char *filename)
-{
- /* nothing */
-}
-
-/* save method of the calendar view */
-static void
-calendar_view_save (GalView *view, const char *filename)
-{
- /* nothing */
-}
-
-/* get_title method of the calendar view */
-static const char *
-calendar_view_get_title (GalView *view)
-{
- CalendarView *cal_view;
- CalendarViewPrivate *priv;
-
- cal_view = CALENDAR_VIEW (view);
- priv = cal_view->priv;
-
- return (const char *) priv->title;
-}
-
-/* set_title method of the calendar view */
-static void
-calendar_view_set_title (GalView *view, const char *title)
-{
- CalendarView *cal_view;
- CalendarViewPrivate *priv;
-
- cal_view = CALENDAR_VIEW (view);
- priv = cal_view->priv;
-
- if (priv->title)
- g_free (priv->title);
-
- priv->title = g_strdup (title);
-}
-
-/* get_type_code method for the calendar view */
-static const char *
-calendar_view_get_type_code (GalView *view)
-{
- CalendarView *cal_view;
- CalendarViewPrivate *priv;
-
- cal_view = CALENDAR_VIEW (view);
- priv = cal_view->priv;
-
- switch (priv->view_type) {
- case GNOME_CAL_DAY_VIEW:
- return "day_view";
-
- case GNOME_CAL_WORK_WEEK_VIEW:
- return "work_week_view";
-
- case GNOME_CAL_WEEK_VIEW:
- return "week_view";
-
- case GNOME_CAL_MONTH_VIEW:
- return "month_view";
-
- default:
- g_assert_not_reached ();
- return NULL;
- }
-}
-
-/* clone method for the calendar view */
-static GalView *
-calendar_view_clone (GalView *view)
-{
- CalendarView *cal_view;
- CalendarViewPrivate *priv;
- CalendarView *new_view;
- CalendarViewPrivate *new_priv;
-
- cal_view = CALENDAR_VIEW (view);
- priv = cal_view->priv;
-
- new_view = g_object_new (TYPE_CALENDAR_VIEW, NULL);
- new_priv = new_view->priv;
-
- new_priv->view_type = priv->view_type;
- new_priv->title = g_strdup (priv->title);
-
- return GAL_VIEW (new_view);
-}
-
-
-
-/**
- * calendar_view_construct:
- * @cal_view: A calendar view.
- * @view_type: The type of calendar view that this object will represent.
- * @title: Title for the view.
- *
- * Constructs a calendar view by setting its view type and title.
- *
- * Return value: The same value as @cal_view.
- **/
-CalendarView *
-calendar_view_construct (CalendarView *cal_view,
- GnomeCalendarViewType view_type,
- const char *title)
-{
- CalendarViewPrivate *priv;
-
- g_return_val_if_fail (cal_view != NULL, NULL);
- g_return_val_if_fail (IS_CALENDAR_VIEW (cal_view), NULL);
- g_return_val_if_fail (title != NULL, NULL);
-
- priv = cal_view->priv;
-
- priv->view_type = view_type;
- priv->title = g_strdup (title);
-
- return cal_view;
-}
-
-/**
- * calendar_view_new:
- * @view_type: The type of calendar view that this object will represent.
- * @title: Title for the view.
- *
- * Creates a new calendar view object.
- *
- * Return value: A newly-created calendar view.
- **/
-CalendarView *
-calendar_view_new (GnomeCalendarViewType view_type, const char *title)
-{
- CalendarView *cal_view;
-
- cal_view = g_object_new (TYPE_CALENDAR_VIEW, NULL);
- return calendar_view_construct (cal_view, view_type, title);
-}
-
-/**
- * calendar_view_get_view_type:
- * @cal_view: A calendar view.
- *
- * Queries the calendar view type of a calendar view.
- *
- * Return value: Type of calendar view.
- **/
-GnomeCalendarViewType
-calendar_view_get_view_type (CalendarView *cal_view)
-{
- CalendarViewPrivate *priv;
-
- g_return_val_if_fail (cal_view != NULL, GNOME_CAL_DAY_VIEW);
- g_return_val_if_fail (IS_CALENDAR_VIEW (cal_view), GNOME_CAL_DAY_VIEW);
-
- priv = cal_view->priv;
- return priv->view_type;
-}
diff --git a/calendar/gui/calendar-view.h b/calendar/gui/calendar-view.h
deleted file mode 100644
index 8b85966a90..0000000000
--- a/calendar/gui/calendar-view.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Evolution calendar - Generic view object for calendar views
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef CALENDAR_VIEW_H
-#define CALENDAR_VIEW_H
-
-#include <gal/menus/gal-view.h>
-#include "gnome-cal.h"
-
-G_BEGIN_DECLS
-
-
-
-#define TYPE_CALENDAR_VIEW (calendar_view_get_type ())
-#define CALENDAR_VIEW(obj) (GTK_CHECK_CAST ((obj), TYPE_CALENDAR_VIEW, CalendarView))
-#define CALENDAR_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_CALENDAR_VIEW, \
- CalendarViewClass))
-#define IS_CALENDAR_VIEW(obj) (GTK_CHECK_TYPE ((obj), TYPE_CALENDAR_VIEW))
-#define IS_CALENDAR_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), TYPE_CALENDAR_VIEW))
-
-typedef struct _CalendarViewPrivate CalendarViewPrivate;
-
-typedef struct {
- GalView view;
-
- /* Private data */
- CalendarViewPrivate *priv;
-} CalendarView;
-
-typedef struct {
- GalViewClass parent_class;
-} CalendarViewClass;
-
-GtkType calendar_view_get_type (void);
-
-CalendarView *calendar_view_construct (CalendarView *cal_view,
- GnomeCalendarViewType view_type,
- const char *title);
-
-CalendarView *calendar_view_new (GnomeCalendarViewType view_type,
- const char *title);
-
-GnomeCalendarViewType calendar_view_get_view_type (CalendarView *cal_view);
-
-
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/comp-editor-factory.c b/calendar/gui/comp-editor-factory.c
deleted file mode 100644
index 62d24f4467..0000000000
--- a/calendar/gui/comp-editor-factory.c
+++ /dev/null
@@ -1,647 +0,0 @@
-/* Evolution calendar - Component editor factory object
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkmessagedialog.h>
-#include <bonobo/bonobo-exception.h>
-#include <bonobo/bonobo-i18n.h>
-#include <evolution-calendar.h>
-#include <libedataserver/e-url.h>
-#include <libecal/e-cal.h>
-#include "calendar-config.h"
-#include "e-comp-editor-registry.h"
-#include "comp-editor-factory.h"
-#include "comp-util.h"
-#include "common/authentication.h"
-#include "dialogs/event-editor.h"
-#include "dialogs/task-editor.h"
-
-extern ECompEditorRegistry *comp_editor_registry;
-
-
-
-/* A pending request */
-
-typedef enum {
- REQUEST_EXISTING,
- REQUEST_NEW
-} RequestType;
-
-typedef struct {
- RequestType type;
-
- union {
- struct {
- char *uid;
- } existing;
-
- struct {
- GNOME_Evolution_Calendar_CompEditorFactory_CompEditorMode type;
- } new;
- } u;
-} Request;
-
-/* A client we have open */
-typedef struct {
- /* Our parent CompEditorFactory */
- CompEditorFactory *factory;
-
- /* Uri of the calendar, used as key in the clients hash table */
- char *uri;
-
- /* Client of the calendar */
- ECal *client;
-
- /* Count editors using this client */
- int editor_count;
-
- /* Pending requests; they are pending if the client is still being opened */
- GSList *pending;
-
- /* Whether this is open or still waiting */
- guint open : 1;
-} OpenClient;
-
-/* Private part of the CompEditorFactory structure */
-struct CompEditorFactoryPrivate {
- /* Hash table of URI->OpenClient */
- GHashTable *uri_client_hash;
-};
-
-
-
-static void comp_editor_factory_class_init (CompEditorFactoryClass *class);
-static void comp_editor_factory_init (CompEditorFactory *factory);
-static void comp_editor_factory_finalize (GObject *object);
-
-static void impl_editExisting (PortableServer_Servant servant,
- const CORBA_char *str_uri,
- const CORBA_char *uid,
- const GNOME_Evolution_Calendar_CompEditorFactory_CompEditorMode corba_type,
- CORBA_Environment *ev);
-static void impl_editNew (PortableServer_Servant servant,
- const CORBA_char *str_uri,
- const GNOME_Evolution_Calendar_CalObjType type,
- CORBA_Environment *ev);
-
-static BonoboObjectClass *parent_class = NULL;
-
-
-
-BONOBO_TYPE_FUNC_FULL (CompEditorFactory,
- GNOME_Evolution_Calendar_CompEditorFactory,
- BONOBO_OBJECT_TYPE,
- comp_editor_factory);
-
-/* Class initialization function for the component editor factory */
-static void
-comp_editor_factory_class_init (CompEditorFactoryClass *class)
-{
- GObjectClass *object_class;
-
- object_class = (GObjectClass *) class;
-
- parent_class = g_type_class_peek_parent (class);
-
- class->epv.editExisting = impl_editExisting;
- class->epv.editNew = impl_editNew;
-
- object_class->finalize = comp_editor_factory_finalize;
-}
-
-/* Object initialization function for the component editor factory */
-static void
-comp_editor_factory_init (CompEditorFactory *factory)
-{
- CompEditorFactoryPrivate *priv;
-
- priv = g_new (CompEditorFactoryPrivate, 1);
- factory->priv = priv;
-
- priv->uri_client_hash = g_hash_table_new (g_str_hash, g_str_equal);
-}
-
-/* Frees a Request structure */
-static void
-free_request (Request *r)
-{
- if (r->type == REQUEST_EXISTING) {
- g_assert (r->u.existing.uid != NULL);
- g_free (r->u.existing.uid);
- }
-
- g_free (r);
-}
-
-/* Frees an OpenClient structure */
-static void
-free_client (OpenClient *oc)
-{
- GSList *l;
-
- g_free (oc->uri);
- oc->uri = NULL;
-
- g_object_unref (oc->client);
- oc->client = NULL;
-
- for (l = oc->pending; l; l = l->next) {
- Request *r;
-
- r = l->data;
- free_request (r);
- }
- g_slist_free (oc->pending);
- oc->pending = NULL;
-
- g_free (oc);
-}
-
-/* Used from g_hash_table_foreach(); frees a client structure */
-static void
-free_client_cb (gpointer key, gpointer value, gpointer data)
-{
- OpenClient *oc;
-
- oc = value;
- free_client (oc);
-}
-
-/* Destroy handler for the component editor factory */
-static void
-comp_editor_factory_finalize (GObject *object)
-{
- CompEditorFactory *factory;
- CompEditorFactoryPrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_COMP_EDITOR_FACTORY (object));
-
- factory = COMP_EDITOR_FACTORY (object);
- priv = factory->priv;
-
- g_hash_table_foreach (priv->uri_client_hash, free_client_cb, NULL);
- g_hash_table_destroy (priv->uri_client_hash);
- priv->uri_client_hash = NULL;
-
- g_free (priv);
- factory->priv = NULL;
-
- if (G_OBJECT_CLASS (parent_class)->finalize)
- (* G_OBJECT_CLASS (parent_class)->finalize) (object);
-}
-
-
-
-/* Callback used when a component editor gets destroyed */
-static void
-editor_destroy_cb (GtkObject *object, gpointer data)
-{
- OpenClient *oc;
- CompEditorFactory *factory;
- CompEditorFactoryPrivate *priv;
-
- oc = data;
- factory = oc->factory;
- priv = factory->priv;
-
- oc->editor_count--;
-
- /* See if we need to free the client */
- g_assert (oc->pending == NULL);
-
- if (oc->editor_count != 0)
- return;
-
- g_hash_table_remove (priv->uri_client_hash, oc->uri);
- free_client (oc);
-}
-
-/* Starts editing an existing component on a client that is already open */
-static void
-edit_existing (OpenClient *oc, const char *uid)
-{
- ECalComponent *comp;
- icalcomponent *icalcomp;
- CompEditor *editor;
- ECalComponentVType vtype;
-
- g_assert (oc->open);
-
- /* Get the object */
- if (!e_cal_get_object (oc->client, uid, NULL, &icalcomp, NULL)) {
- /* FIXME Better error handling */
- g_warning (G_STRLOC ": Syntax error while getting component `%s'", uid);
-
- return;
- }
-
- comp = e_cal_component_new ();
- if (!e_cal_component_set_icalcomponent (comp, icalcomp)) {
- g_object_unref (comp);
- icalcomponent_free (icalcomp);
- return;
- }
-
- /* Create the appropriate type of editor */
-
- vtype = e_cal_component_get_vtype (comp);
-
- switch (vtype) {
- case E_CAL_COMPONENT_EVENT:
- editor = COMP_EDITOR (event_editor_new (oc->client, e_cal_component_has_attendees (comp)));
- break;
-
- case E_CAL_COMPONENT_TODO:
- editor = COMP_EDITOR (task_editor_new (oc->client, e_cal_component_has_attendees (comp)));
- break;
-
- default:
- g_message ("edit_exiting(): Unsupported object type %d", (int) vtype);
- g_object_unref (comp);
- return;
- }
-
- /* Set the object on the editor */
- comp_editor_edit_comp (editor, comp);
- comp_editor_focus (editor);
-
- oc->editor_count++;
- g_signal_connect (editor, "destroy", G_CALLBACK (editor_destroy_cb), oc);
-
- e_comp_editor_registry_add (comp_editor_registry, editor, TRUE);
-}
-
-static ECalComponent *
-get_default_task (ECal *client)
-{
- ECalComponent *comp;
-
- comp = cal_comp_task_new_with_defaults (client);
-
- return comp;
-}
-
-/* Edits a new object in the context of a client */
-static void
-edit_new (OpenClient *oc, const GNOME_Evolution_Calendar_CompEditorFactory_CompEditorMode type)
-{
- ECalComponent *comp;
- CompEditor *editor;
-
- switch (type) {
- case GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_EVENT:
- editor = COMP_EDITOR (event_editor_new (oc->client, FALSE));
- comp = cal_comp_event_new_with_current_time (oc->client, FALSE);
- break;
- case GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_MEETING:
- editor = COMP_EDITOR (event_editor_new (oc->client, TRUE));
- comp = cal_comp_event_new_with_current_time (oc->client, FALSE);
- break;
- case GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_ALLDAY_EVENT:
- editor = COMP_EDITOR (event_editor_new (oc->client, FALSE));
- comp = cal_comp_event_new_with_current_time (oc->client, TRUE);
- break;
- case GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_TODO:
- editor = COMP_EDITOR (task_editor_new (oc->client, FALSE));
- comp = get_default_task (oc->client);
- break;
- default:
- g_assert_not_reached ();
- return;
- }
-
- comp_editor_edit_comp (editor, comp);
- if (type == GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_MEETING)
- event_editor_show_meeting (EVENT_EDITOR (editor));
- comp_editor_focus (editor);
-
- oc->editor_count++;
- g_signal_connect (editor, "destroy", G_CALLBACK (editor_destroy_cb), oc);
-
- e_comp_editor_registry_add (comp_editor_registry, editor, TRUE);
-}
-
-/* Resolves all the pending requests for a client */
-static void
-resolve_pending_requests (OpenClient *oc)
-{
- CompEditorFactory *factory;
- CompEditorFactoryPrivate *priv;
- GSList *l;
- icaltimezone *zone;
-
- factory = oc->factory;
- priv = factory->priv;
-
- if (!oc->pending)
- return;
-
- /* Set the default timezone in the backend. */
- zone = calendar_config_get_icaltimezone ();
-
- /* FIXME Error handling? */
- e_cal_set_default_timezone (oc->client, zone, NULL);
-
- for (l = oc->pending; l; l = l->next) {
- Request *request;
-
- request = l->data;
-
- switch (request->type) {
- case REQUEST_EXISTING:
- edit_existing (oc, request->u.existing.uid);
- break;
-
- case REQUEST_NEW:
- edit_new (oc, request->u.new.type);
- break;
- }
-
- free_request (request);
- }
-
- g_slist_free (oc->pending);
- oc->pending = NULL;
-}
-
-/* Callback used when a client is finished opening. We resolve all the pending
- * requests.
- */
-static void
-cal_opened_cb (ECal *client, ECalendarStatus status, gpointer data)
-{
- OpenClient *oc;
- CompEditorFactory *factory;
- CompEditorFactoryPrivate *priv;
- GtkWidget *dialog = NULL;
-
- oc = data;
- factory = oc->factory;
- priv = factory->priv;
-
- switch (status) {
- case E_CALENDAR_STATUS_OK:
- oc->open = TRUE;
- resolve_pending_requests (oc);
- return;
-
- case E_CALENDAR_STATUS_OTHER_ERROR:
- case E_CALENDAR_STATUS_NO_SUCH_CALENDAR:
- dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- _("Error while opening the calendar"));
- break;
-
- case E_CALENDAR_STATUS_PROTOCOL_NOT_SUPPORTED:
- dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- _("Method not supported when opening the calendar"));
- break;
-
- case E_CALENDAR_STATUS_PERMISSION_DENIED :
- dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- _("Permission denied to open the calendar"));
- break;
-
- case E_CALENDAR_STATUS_AUTHENTICATION_FAILED :
- dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- _("Authentication Failed"));
- break;
-
- default:
- dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- _("Unknown error"));
- return;
- }
-
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
-
- g_hash_table_remove (priv->uri_client_hash, oc->uri);
- free_client (oc);
-}
-
-/* Creates a new OpenClient structure and queues the component editing/creation
- * process until the client is open. Returns NULL if it could not issue the
- * open request.
- */
-static OpenClient *
-open_client (CompEditorFactory *factory, ECalSourceType source_type, const char *uristr)
-{
- CompEditorFactoryPrivate *priv;
- ECal *client;
- OpenClient *oc;
- GError *error = NULL;
-
- priv = factory->priv;
-
- client = auth_new_cal_from_uri (uristr, source_type);
- if (!client)
- return NULL;
-
- oc = g_new (OpenClient, 1);
- oc->factory = factory;
-
- oc->uri = g_strdup (uristr);
-
- oc->client = client;
- oc->editor_count = 0;
- oc->pending = NULL;
- oc->open = FALSE;
-
- g_signal_connect (oc->client, "cal_opened", G_CALLBACK (cal_opened_cb), oc);
-
- g_hash_table_insert (priv->uri_client_hash, oc->uri, oc);
-
- if (!e_cal_open (oc->client, FALSE, &error)) {
- g_warning (G_STRLOC ": %s", error->message);
- g_free (oc->uri);
- g_object_unref (oc->client);
- g_free (oc);
- g_error_free (error);
-
- return NULL;
- }
-
- return oc;
-}
-
-/* Looks up an open client or queues it for being opened. Returns the client or
- * NULL on failure; in the latter case it sets the ev exception.
- */
-static OpenClient *
-lookup_open_client (CompEditorFactory *factory, ECalSourceType source_type, const char *str_uri, CORBA_Environment *ev)
-{
- CompEditorFactoryPrivate *priv;
- OpenClient *oc;
- EUri *uri;
-
- priv = factory->priv;
-
- /* Look up the client */
-
- uri = e_uri_new (str_uri);
- if (!uri) {
- bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_CompEditorFactory_InvalidURI);
- return NULL;
- }
- e_uri_free (uri);
-
- oc = g_hash_table_lookup (priv->uri_client_hash, str_uri);
- if (!oc) {
- oc = open_client (factory, source_type, str_uri);
- if (!oc) {
- bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_CompEditorFactory_BackendContactError);
- return NULL;
- }
- }
-
- return oc;
-}
-
-/* Queues a request for editing an existing object */
-static void
-queue_edit_existing (OpenClient *oc, const char *uid)
-{
- Request *request;
-
- g_assert (!oc->open);
-
- request = g_new (Request, 1);
- request->type = REQUEST_EXISTING;
- request->u.existing.uid = g_strdup (uid);
-
- oc->pending = g_slist_append (oc->pending, request);
-}
-
-/* ::editExisting() method implementation */
-static void
-impl_editExisting (PortableServer_Servant servant,
- const CORBA_char *str_uri,
- const CORBA_char *uid,
- const GNOME_Evolution_Calendar_CompEditorFactory_CompEditorMode corba_type,
- CORBA_Environment *ev)
-{
- CompEditorFactory *factory;
- CompEditorFactoryPrivate *priv;
- OpenClient *oc;
- CompEditor *editor;
- ECalSourceType source_type;
-
- factory = COMP_EDITOR_FACTORY (bonobo_object_from_servant (servant));
- priv = factory->priv;
-
- switch (corba_type) {
- case GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_TODO:
- source_type = E_CAL_SOURCE_TYPE_TODO;
- break;
- default:
- source_type = E_CAL_SOURCE_TYPE_EVENT;
- }
-
- oc = lookup_open_client (factory, source_type, str_uri, ev);
- if (!oc)
- return;
-
- if (!oc->open) {
- queue_edit_existing (oc, uid);
- return;
- }
-
- /* Look up the component */
- editor = e_comp_editor_registry_find (comp_editor_registry, uid);
- if (editor == NULL) {
- edit_existing (oc, uid);
- } else {
- comp_editor_focus (editor);
- }
-}
-
-/* Queues a request for creating a new object */
-static void
-queue_edit_new (OpenClient *oc, const GNOME_Evolution_Calendar_CompEditorFactory_CompEditorMode type)
-{
- Request *request;
-
- g_assert (!oc->open);
-
- request = g_new (Request, 1);
- request->type = REQUEST_NEW;
- request->u.new.type = type;
-
- oc->pending = g_slist_append (oc->pending, request);
-}
-
-/* ::editNew() method implementation */
-static void
-impl_editNew (PortableServer_Servant servant,
- const CORBA_char *str_uri,
- const GNOME_Evolution_Calendar_CompEditorFactory_CompEditorMode corba_type,
- CORBA_Environment *ev)
-{
- CompEditorFactory *factory;
- CompEditorFactoryPrivate *priv;
- OpenClient *oc;
- ECalSourceType source_type;
-
- factory = COMP_EDITOR_FACTORY (bonobo_object_from_servant (servant));
- priv = factory->priv;
-
- switch (corba_type) {
- case GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_TODO:
- source_type = E_CAL_SOURCE_TYPE_TODO;
- break;
- default:
- source_type = E_CAL_SOURCE_TYPE_EVENT;
- }
-
- oc = lookup_open_client (factory, source_type, str_uri, ev);
- if (!oc)
- return;
-
- if (!oc->open)
- queue_edit_new (oc, corba_type);
- else
- edit_new (oc, corba_type);
-}
-
-
-
-/**
- * comp_editor_factory_new:
- *
- * Creates a new calendar component editor factory.
- *
- * Return value: A newly-created component editor factory.
- **/
-CompEditorFactory *
-comp_editor_factory_new (void)
-{
- return g_object_new (TYPE_COMP_EDITOR_FACTORY, NULL);
-}
-
-
diff --git a/calendar/gui/comp-editor-factory.h b/calendar/gui/comp-editor-factory.h
deleted file mode 100644
index fca4573497..0000000000
--- a/calendar/gui/comp-editor-factory.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Evolution calendar - Component editor factory object
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef COMP_EDITOR_FACTORY_H
-#define COMP_EDITOR_FACTORY_H
-
-#include <bonobo/bonobo-object.h>
-#include "evolution-calendar.h"
-
-
-
-#define TYPE_COMP_EDITOR_FACTORY (comp_editor_factory_get_type ())
-#define COMP_EDITOR_FACTORY(obj) (GTK_CHECK_CAST ((obj), TYPE_COMP_EDITOR_FACTORY, \
- CompEditorFactory))
-#define COMP_EDITOR_FACTORY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), \
- TYPE_COMP_EDITOR_FACTORY, CompEditorFactoryClass))
-#define IS_COMP_EDITOR_FACTORY(obj) (GTK_CHECK_TYPE ((obj), TYPE_COMP_EDITOR_FACTORY))
-#define IS_COMP_EDITOR_FACTORY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), TYPE_COMP_EDITOR_FACTORY))
-
-typedef struct CompEditorFactoryPrivate CompEditorFactoryPrivate;
-
-typedef struct {
- BonoboObject object;
-
- /* Private data */
- CompEditorFactoryPrivate *priv;
-} CompEditorFactory;
-
-typedef struct {
- BonoboObjectClass parent_class;
-
- POA_GNOME_Evolution_Calendar_CompEditorFactory__epv epv;
-} CompEditorFactoryClass;
-
-GtkType comp_editor_factory_get_type (void);
-
-CompEditorFactory *comp_editor_factory_new (void);
-
-
-
-#endif
diff --git a/calendar/gui/comp-util.c b/calendar/gui/comp-util.c
deleted file mode 100644
index 0ee3e696bb..0000000000
--- a/calendar/gui/comp-util.c
+++ /dev/null
@@ -1,379 +0,0 @@
-/* Evolution calendar - Utilities for manipulating ECalComponent objects
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <time.h>
-#include "calendar-config.h"
-#include "comp-util.h"
-#include "dialogs/delete-comp.h"
-
-
-
-/**
- * cal_comp_util_add_exdate:
- * @comp: A calendar component object.
- * @itt: Time for the exception.
- *
- * Adds an exception date to the current list of EXDATE properties in a calendar
- * component object.
- **/
-void
-cal_comp_util_add_exdate (ECalComponent *comp, time_t t, icaltimezone *zone)
-{
- GSList *list;
- ECalComponentDateTime *cdt;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (E_IS_CAL_COMPONENT (comp));
-
- e_cal_component_get_exdate_list (comp, &list);
-
- cdt = g_new (ECalComponentDateTime, 1);
- cdt->value = g_new (struct icaltimetype, 1);
- *cdt->value = icaltime_from_timet_with_zone (t, FALSE, zone);
- cdt->tzid = g_strdup (icaltimezone_get_tzid (zone));
-
- list = g_slist_append (list, cdt);
- e_cal_component_set_exdate_list (comp, list);
- e_cal_component_free_exdate_list (list);
-}
-
-
-
-/* Returns TRUE if the TZIDs are equivalent, i.e. both NULL or the same. */
-static gboolean
-e_cal_component_compare_tzid (const char *tzid1, const char *tzid2)
-{
- gboolean retval = TRUE;
-
- if (tzid1) {
- if (!tzid2 || strcmp (tzid1, tzid2))
- retval = FALSE;
- } else {
- if (tzid2)
- retval = FALSE;
- }
-
- return retval;
-}
-
-/**
- * cal_comp_util_compare_event_timezones:
- * @comp: A calendar component object.
- * @client: A #ECal.
- *
- * Checks if the component uses the given timezone for both the start and
- * the end time, or if the UTC offsets of the start and end times are the same
- * as in the given zone.
- *
- * Returns: TRUE if the component's start and end time are at the same UTC
- * offset in the given timezone.
- **/
-gboolean
-cal_comp_util_compare_event_timezones (ECalComponent *comp,
- ECal *client,
- icaltimezone *zone)
-{
- ECalComponentDateTime start_datetime, end_datetime;
- const char *tzid;
- gboolean retval = FALSE;
- icaltimezone *start_zone, *end_zone;
- int offset1, offset2;
-
- tzid = icaltimezone_get_tzid (zone);
-
- e_cal_component_get_dtstart (comp, &start_datetime);
- e_cal_component_get_dtend (comp, &end_datetime);
-
- /* If either the DTSTART or the DTEND is a DATE value, we return TRUE.
- Maybe if one was a DATE-TIME we should check that, but that should
- not happen often. */
- if ((start_datetime.value && start_datetime.value->is_date)
- || (end_datetime.value && end_datetime.value->is_date)) {
- retval = TRUE;
- goto out;
- }
-
- /* If the event uses UTC for DTSTART & DTEND, return TRUE. Outlook
- will send single events as UTC, so we don't want to mark all of
- these. */
- if ((!start_datetime.value || start_datetime.value->is_utc)
- && (!end_datetime.value || end_datetime.value->is_utc)) {
- retval = TRUE;
- goto out;
- }
-
- /* If the event uses floating time for DTSTART & DTEND, return TRUE.
- Imported vCalendar files will use floating times, so we don't want
- to mark all of these. */
- if (!start_datetime.tzid && !end_datetime.tzid) {
- retval = TRUE;
- goto out;
- }
-
- /* FIXME: DURATION may be used instead. */
- if (e_cal_component_compare_tzid (tzid, start_datetime.tzid)
- && e_cal_component_compare_tzid (tzid, end_datetime.tzid)) {
- /* If both TZIDs are the same as the given zone's TZID, then
- we know the timezones are the same so we return TRUE. */
- retval = TRUE;
- } else {
- /* If the TZIDs differ, we have to compare the UTC offsets
- of the start and end times, using their own timezones and
- the given timezone. */
- if (!e_cal_get_timezone (client, start_datetime.tzid,
- &start_zone, NULL))
- goto out;
-
- if (start_datetime.value) {
- offset1 = icaltimezone_get_utc_offset (start_zone,
- start_datetime.value,
- NULL);
- offset2 = icaltimezone_get_utc_offset (zone,
- start_datetime.value,
- NULL);
- if (offset1 != offset2)
- goto out;
- }
-
- if (!e_cal_get_timezone (client, end_datetime.tzid,
- &end_zone, NULL))
- goto out;
-
- if (end_datetime.value) {
- offset1 = icaltimezone_get_utc_offset (end_zone,
- end_datetime.value,
- NULL);
- offset2 = icaltimezone_get_utc_offset (zone,
- end_datetime.value,
- NULL);
- if (offset1 != offset2)
- goto out;
- }
-
- retval = TRUE;
- }
-
- out:
-
- e_cal_component_free_datetime (&start_datetime);
- e_cal_component_free_datetime (&end_datetime);
-
- return retval;
-}
-
-/**
- * cal_comp_confirm_delete_empty_comp:
- * @comp: A calendar component.
- * @client: Calendar client where the component purportedly lives.
- * @widget: Widget to be used as the basis for UTF8 conversion.
- *
- * Assumming a calendar component with an empty SUMMARY property (as per
- * string_is_empty()), asks whether the user wants to delete it based on
- * whether the appointment is on the calendar server or not. If the
- * component is on the server, this function will present a confirmation
- * dialog and delete the component if the user tells it to. If the component
- * is not on the server it will just return TRUE.
- *
- * Return value: A result code indicating whether the component
- * was not on the server and is to be deleted locally, whether it
- * was on the server and the user deleted it, or whether the
- * user cancelled the deletion.
- **/
-gboolean
-cal_comp_is_on_server (ECalComponent *comp, ECal *client)
-{
- const char *uid;
- icalcomponent *icalcomp;
- GError *error = NULL;
-
- g_return_val_if_fail (comp != NULL, FALSE);
- g_return_val_if_fail (E_IS_CAL_COMPONENT (comp), FALSE);
- g_return_val_if_fail (client != NULL, FALSE);
- g_return_val_if_fail (E_IS_CAL (client), FALSE);
-
- /* See if the component is on the server. If it is not, then it likely
- * means that the appointment is new, only in the day view, and we
- * haven't added it yet to the server. In that case, we don't need to
- * confirm and we can just delete the event. Otherwise, we ask
- * the user.
- */
- e_cal_component_get_uid (comp, &uid);
-
- if (e_cal_get_object (client, uid, NULL, &icalcomp, &error)) {
- icalcomponent_free (icalcomp);
-
- return TRUE;
- }
-
- if (error->code != E_CALENDAR_STATUS_OBJECT_NOT_FOUND)
- g_warning (G_STRLOC ": %s", error->message);
-
- g_clear_error (&error);
-
- return FALSE;
-}
-
-/**
- * cal_comp_event_new_with_defaults:
- *
- * Creates a new VEVENT component and adds any default alarms to it as set in
- * the program's configuration values.
- *
- * Return value: A newly-created calendar component.
- **/
-ECalComponent *
-cal_comp_event_new_with_defaults (ECal *client)
-{
- icalcomponent *icalcomp;
- ECalComponent *comp;
- int interval;
- CalUnits units;
- ECalComponentAlarm *alarm;
- icalproperty *icalprop;
- ECalComponentAlarmTrigger trigger;
-
- if (!e_cal_get_default_object (client, &icalcomp, NULL))
- return NULL;
-
- comp = e_cal_component_new ();
- if (!e_cal_component_set_icalcomponent (comp, icalcomp)) {
- g_object_unref (comp);
- icalcomponent_free (icalcomp);
- return NULL;
- }
-
- if (!calendar_config_get_use_default_reminder ())
- return comp;
-
- interval = calendar_config_get_default_reminder_interval ();
- units = calendar_config_get_default_reminder_units ();
-
- alarm = e_cal_component_alarm_new ();
-
- /* We don't set the description of the alarm; we'll copy it from the
- * summary when it gets committed to the server. For that, we add a
- * X-EVOLUTION-NEEDS-DESCRIPTION property to the alarm's component.
- */
- icalcomp = e_cal_component_alarm_get_icalcomponent (alarm);
- icalprop = icalproperty_new_x ("1");
- icalproperty_set_x_name (icalprop, "X-EVOLUTION-NEEDS-DESCRIPTION");
- icalcomponent_add_property (icalcomp, icalprop);
-
- e_cal_component_alarm_set_action (alarm, E_CAL_COMPONENT_ALARM_DISPLAY);
-
- trigger.type = E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START;
-
- memset (&trigger.u.rel_duration, 0, sizeof (trigger.u.rel_duration));
-
- trigger.u.rel_duration.is_neg = TRUE;
-
- switch (units) {
- case CAL_MINUTES:
- trigger.u.rel_duration.minutes = interval;
- break;
-
- case CAL_HOURS:
- trigger.u.rel_duration.hours = interval;
- break;
-
- case CAL_DAYS:
- trigger.u.rel_duration.days = interval;
- break;
-
- default:
- g_assert_not_reached ();
- }
-
- e_cal_component_alarm_set_trigger (alarm, trigger);
-
- e_cal_component_add_alarm (comp, alarm);
- e_cal_component_alarm_free (alarm);
-
- return comp;
-}
-
-ECalComponent *
-cal_comp_event_new_with_current_time (ECal *client, gboolean all_day)
-{
- ECalComponent *comp;
- struct icaltimetype itt;
- ECalComponentDateTime dt;
- icaltimezone *zone;
-
- comp = cal_comp_event_new_with_defaults (client);
-
- g_return_val_if_fail (comp, NULL);
-
- zone = calendar_config_get_icaltimezone ();
- if (all_day) {
- itt = icaltime_from_timet_with_zone (time (NULL), 1, zone);
-
- dt.value = &itt;
- dt.tzid = icaltimezone_get_tzid (zone);
-
- e_cal_component_set_dtstart (comp, &dt);
- e_cal_component_set_dtend (comp, &dt);
- } else {
- itt = icaltime_current_time_with_zone (zone);
- icaltime_adjust (&itt, 0, 1, -itt.minute, -itt.second);
-
- dt.value = &itt;
- dt.tzid = icaltimezone_get_tzid (zone);
-
- e_cal_component_set_dtstart (comp, &dt);
- icaltime_adjust (&itt, 0, 1, 0, 0);
- e_cal_component_set_dtend (comp, &dt);
- }
-
- return comp;
-}
-
-ECalComponent *
-cal_comp_task_new_with_defaults (ECal *client)
-{
- ECalComponent *comp;
- icalcomponent *icalcomp;
-
- if (!e_cal_get_default_object (client, &icalcomp, NULL))
- return NULL;
-
- comp = e_cal_component_new ();
- if (!e_cal_component_set_icalcomponent (comp, icalcomp)) {
- g_object_unref (comp);
- icalcomponent_free (icalcomp);
-
- return NULL;
- }
-
- comp = e_cal_component_new ();
- if (!e_cal_component_set_icalcomponent (comp, icalcomp)) {
- g_object_unref (comp);
- icalcomponent_free (icalcomp);
- return NULL;
- }
-
- return comp;
-}
diff --git a/calendar/gui/comp-util.h b/calendar/gui/comp-util.h
deleted file mode 100644
index 26c7881e99..0000000000
--- a/calendar/gui/comp-util.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Evolution calendar - Utilities for manipulating ECalComponent objects
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef COMP_UTIL_H
-#define COMP_UTIL_H
-
-#include <gtk/gtkwidget.h>
-#include <libecal/e-cal-component.h>
-#include <libecal/e-cal.h>
-
-void cal_comp_util_add_exdate (ECalComponent *comp, time_t t, icaltimezone *zone);
-
-
-/* Returns TRUE if the component uses the given timezone for both DTSTART
- and DTEND, or if the UTC offsets of the start and end times are the same
- as in the given zone. */
-gboolean cal_comp_util_compare_event_timezones (ECalComponent *comp,
- ECal *client,
- icaltimezone *zone);
-
-gboolean cal_comp_is_on_server (ECalComponent *comp,
- ECal *client);
-
-ECalComponent *cal_comp_event_new_with_defaults (ECal *client);
-ECalComponent *cal_comp_event_new_with_current_time (ECal *client, gboolean all_day);
-ECalComponent *cal_comp_task_new_with_defaults (ECal *client);
-
-#endif
diff --git a/calendar/gui/control-factory.c b/calendar/gui/control-factory.c
deleted file mode 100644
index c6aab4b258..0000000000
--- a/calendar/gui/control-factory.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* control-factory.c
- *
- * Copyright (C) 2000, 2001, 2002, 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli <ettore@ximian.com>
- */
-
-#include <config.h>
-#include <string.h>
-#include <gtk/gtksignal.h>
-#include <glade/glade.h>
-#include <bonobo/bonobo-control.h>
-#include <bonobo/bonobo-generic-factory.h>
-#include <bonobo/bonobo-persist-file.h>
-#include <bonobo/bonobo-context.h>
-#include <glade/glade.h>
-#include <libgnomeui/gnome-dialog-util.h>
-
-#include <libecal/e-cal-time-util.h>
-#include <gui/gnome-cal.h>
-#include <gui/calendar-commands.h>
-#include <gui/calendar-config.h>
-
-#include "control-factory.h"
-
-CORBA_Environment ev;
-CORBA_ORB orb;
-
-static void
-control_activate_cb (BonoboControl *control, gboolean activate, gpointer data)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- if (activate)
- calendar_control_activate (control, gcal);
- else
- calendar_control_deactivate (control, gcal);
-}
-
-BonoboControl *
-control_factory_new_control (void)
-{
- BonoboControl *control;
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (gnome_calendar_new ());
- if (!gcal)
- return NULL;
-
- gtk_widget_show (GTK_WIDGET (gcal));
-
- control = bonobo_control_new (GTK_WIDGET (gcal));
- if (!control) {
- g_message ("control_factory_fn(): could not create the control!");
- return NULL;
- }
- g_object_set_data (G_OBJECT (gcal), "control", control);
-
- g_signal_connect (control, "activate", G_CALLBACK (control_activate_cb), gcal);
-
- return control;
-}
diff --git a/calendar/gui/control-factory.h b/calendar/gui/control-factory.h
deleted file mode 100644
index bab1611c03..0000000000
--- a/calendar/gui/control-factory.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* control-factory.c
- *
- * Copyright (C) 2000, 2001, 2002, 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli <ettore@ximian.com>
- */
-
-#ifndef _CONTROL_FACTORY_H_
-#define _CONTROL_FACTORY_H_
-
-#include <bonobo/bonobo-control.h>
-
-BonoboControl *control_factory_new_control (void);
-
-#endif /* _CONTROL_FACTORY_H_ */
diff --git a/calendar/gui/dialogs/.cvsignore b/calendar/gui/dialogs/.cvsignore
deleted file mode 100644
index 182657d5ac..0000000000
--- a/calendar/gui/dialogs/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.deps
-.pure
-Makefile
-Makefile.in
-Evolution-Addressbook-SelectNames-common.c
-Evolution-Addressbook-SelectNames-skels.c
-Evolution-Addressbook-SelectNames-stubs.c
-Evolution-Addressbook-SelectNames.h
diff --git a/calendar/gui/dialogs/Makefile.am b/calendar/gui/dialogs/Makefile.am
deleted file mode 100644
index 11cdf3bd6d..0000000000
--- a/calendar/gui/dialogs/Makefile.am
+++ /dev/null
@@ -1,106 +0,0 @@
-INCLUDES = \
- -DG_LOG_DOMAIN=\"calendar-gui\" \
- -I$(top_srcdir) \
- -I$(top_builddir) \
- -I$(top_srcdir)/calendar \
- -I$(top_srcdir)/calendar/cal-client \
- -I$(top_builddir)/calendar/cal-client \
- -I$(top_builddir)/shell \
- -I$(top_srcdir)/shell \
- -I$(top_srcdir)/widgets/misc \
- -DEVOLUTION_DATADIR=\""$(datadir)"\" \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \
- -DEVOLUTION_UIDIR=\""$(evolutionuidir)"\" \
- -DPREFIX=\""$(prefix)"\" \
- $(EVOLUTION_CALENDAR_CFLAGS)
-
-noinst_LTLIBRARIES = libcal-dialogs.la
-
-libcal_dialogs_la_LIBADD = \
- $(top_builddir)/addressbook/util/libeabutil.la
-
-libcal_dialogs_la_SOURCES = \
- $(IDL_GENERATED) \
- alarm-dialog.c \
- alarm-dialog.h \
- alarm-list-dialog.c \
- alarm-list-dialog.h \
- cal-attachment-bar.c \
- cal-attachment-bar.h \
- cal-attachment-select-file.c \
- cal-attachment-select-file.h \
- cal-attachment.c \
- cal-attachment.h \
- cal-prefs-dialog.c \
- cal-prefs-dialog.h \
- calendar-setup.c \
- calendar-setup.h \
- cancel-comp.c \
- cancel-comp.h \
- changed-comp.c \
- changed-comp.h \
- comp-editor.c \
- comp-editor.h \
- comp-editor-page.c \
- comp-editor-page.h \
- comp-editor-util.c \
- comp-editor-util.h \
- copy-source-dialog.c \
- copy-source-dialog.h \
- delete-comp.c \
- delete-comp.h \
- delete-error.c \
- delete-error.h \
- e-delegate-dialog.c \
- e-delegate-dialog.h \
- e-send-options-utils.c \
- e-send-options-utils.h \
- event-editor.c \
- event-editor.h \
- event-page.c \
- event-page.h \
- meeting-page.c \
- meeting-page.h \
- recurrence-page.c \
- recurrence-page.h \
- recur-comp.c \
- recur-comp.h \
- save-comp.c \
- save-comp.h \
- schedule-page.c \
- schedule-page.h \
- select-source-dialog.c \
- select-source-dialog.h \
- send-comp.c \
- send-comp.h \
- task-editor.c \
- task-editor.h \
- task-details-page.c \
- task-details-page.h \
- task-page.c \
- task-page.h \
- url-editor-dialog.c \
- url-editor-dialog.h
-
-glade_DATA = \
- alarm-dialog.glade \
- alarm-list-dialog.glade \
- cal-attachment.glade \
- cal-prefs-dialog.glade \
- e-delegate-dialog.glade \
- event-page.glade \
- meeting-page.glade \
- recurrence-page.glade \
- schedule-page.glade \
- task-details-page.glade \
- task-page.glade \
- url-editor-dialog.glade
-
-CLEANFILES = $(BUILT_SOURCES)
-
-dist-hook:
- cd $(distdir); rm -f $(BUILT_SOURCES)
-
-EXTRA_DIST = \
- $(glade_DATA)
diff --git a/calendar/gui/dialogs/alarm-dialog.c b/calendar/gui/dialogs/alarm-dialog.c
deleted file mode 100644
index d0db059b62..0000000000
--- a/calendar/gui/dialogs/alarm-dialog.c
+++ /dev/null
@@ -1,962 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/* Evolution calendar - Alarm page of the calendar component dialogs
- *
- * Copyright (C) 2001-2003 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- * Miguel de Icaza <miguel@ximian.com>
- * Seth Alves <alves@hungry.com>
- * JP Rosevear <jpr@ximian.com>
- * Hans Petter Jansson <hpj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkcellrenderertext.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtknotebook.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtktreeview.h>
-#include <gtk/gtktreeselection.h>
-#include <gtk/gtkoptionmenu.h>
-#include <gtk/gtktextbuffer.h>
-#include <gtk/gtktextview.h>
-#include <gtk/gtktogglebutton.h>
-#include <libgnome/gnome-i18n.h>
-#include <bonobo/bonobo-control.h>
-#include <bonobo/bonobo-exception.h>
-#include <bonobo/bonobo-widget.h>
-#include <glade/glade.h>
-#include "e-util/e-dialog-widgets.h"
-#include "e-util/e-time-utils.h"
-#include <libecal/e-cal-util.h>
-#include <libecal/e-cal-time-util.h>
-#include "e-util/e-dialog-widgets.h"
-#include "e-util/e-icon-factory.h"
-#include <libebook/e-destination.h>
-#include <libedataserverui/e-name-selector.h>
-#include "../calendar-config.h"
-#include "comp-editor-util.h"
-#include "alarm-dialog.h"
-
-
-
-typedef struct {
- /* Glade XML data */
- GladeXML *xml;
-
- /* The alarm */
- ECalComponentAlarm *alarm;
-
- /* The client */
- ECal *ecal;
-
- /* Toplevel */
- GtkWidget *toplevel;
-
- GtkWidget *action;
- GtkWidget *interval_value;
- GtkWidget *value_units;
- GtkWidget *relative;
- GtkWidget *time;
-
- /* Alarm repeat widgets */
- GtkWidget *repeat_toggle;
- GtkWidget *repeat_group;
- GtkWidget *repeat_quantity;
- GtkWidget *repeat_value;
- GtkWidget *repeat_unit;
-
- GtkWidget *option_notebook;
-
- /* Display alarm widgets */
- GtkWidget *dalarm_group;
- GtkWidget *dalarm_message;
- GtkWidget *dalarm_description;
-
- /* Audio alarm widgets */
- GtkWidget *aalarm_group;
- GtkWidget *aalarm_sound;
- GtkWidget *aalarm_attach;
-
- /* Mail alarm widgets */
- const char *email;
- GtkWidget *malarm_group;
- GtkWidget *malarm_address_group;
- GtkWidget *malarm_addresses;
- GtkWidget *malarm_addressbook;
- GtkWidget *malarm_message;
- GtkWidget *malarm_description;
-
- /* Procedure alarm widgets */
- GtkWidget *palarm_group;
- GtkWidget *palarm_program;
- GtkWidget *palarm_args;
-
- /* Addressbook name selector */
- ENameSelector *name_selector;
-} Dialog;
-
-static const char *section_name = "Send To";
-
-/* "relative" types */
-enum {
- BEFORE,
- AFTER
-};
-
-/* Time units */
-enum {
- MINUTES,
- HOURS,
- DAYS
-};
-
-/* Option menu maps */
-static const int action_map[] = {
- E_CAL_COMPONENT_ALARM_DISPLAY,
- E_CAL_COMPONENT_ALARM_AUDIO,
- E_CAL_COMPONENT_ALARM_PROCEDURE,
- E_CAL_COMPONENT_ALARM_EMAIL,
- -1
-};
-
-static const char *action_map_cap[] = {
- CAL_STATIC_CAPABILITY_NO_DISPLAY_ALARMS,
- CAL_STATIC_CAPABILITY_NO_AUDIO_ALARMS,
- CAL_STATIC_CAPABILITY_NO_PROCEDURE_ALARMS,
- CAL_STATIC_CAPABILITY_NO_EMAIL_ALARMS
-};
-
-static const int value_map[] = {
- MINUTES,
- HOURS,
- DAYS,
- -1
-};
-
-static const int relative_map[] = {
- BEFORE,
- AFTER,
- -1
-};
-
-static const int time_map[] = {
- E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START,
- E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_END,
- -1
-};
-
-enum duration_units {
- DUR_MINUTES,
- DUR_HOURS,
- DUR_DAYS
-};
-
-static const int duration_units_map[] = {
- DUR_MINUTES,
- DUR_HOURS,
- DUR_DAYS,
- -1
-};
-
-/* Fills the widgets with default values */
-static void
-clear_widgets (Dialog *dialog)
-{
- /* Sane defaults */
- e_dialog_option_menu_set (dialog->action, E_CAL_COMPONENT_ALARM_DISPLAY, action_map);
- e_dialog_spin_set (dialog->interval_value, 15);
- e_dialog_option_menu_set (dialog->value_units, MINUTES, value_map);
- e_dialog_option_menu_set (dialog->relative, BEFORE, relative_map);
- e_dialog_option_menu_set (dialog->time, E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START, time_map);
-
- gtk_widget_set_sensitive (dialog->repeat_group, FALSE);
- gtk_widget_set_sensitive (dialog->dalarm_group, FALSE);
- gtk_widget_set_sensitive (dialog->aalarm_group, FALSE);
- gtk_widget_set_sensitive (dialog->malarm_group, FALSE);
-
- gtk_notebook_set_current_page (GTK_NOTEBOOK (dialog->option_notebook), 0);
-}
-
-/* fill_widgets handler for the alarm page */
-static void
-alarm_to_dialog (Dialog *dialog)
-{
- GtkWidget *menu;
- GList *l;
- gboolean repeat;
- char *email;
- int i;
-
- /* Clean the page */
- clear_widgets (dialog);
-
- /* Alarm types */
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (dialog->action));
- for (i = 0, l = GTK_MENU_SHELL (menu)->children; action_map[i] != -1; i++, l = l->next) {
- if (e_cal_get_static_capability (dialog->ecal, action_map_cap[i]))
- gtk_widget_set_sensitive (l->data, FALSE);
- else
- gtk_widget_set_sensitive (l->data, TRUE);
- }
-
- /* Set a default address if possible */
- if (!e_cal_get_static_capability (dialog->ecal, CAL_STATIC_CAPABILITY_NO_EMAIL_ALARMS)
- && e_cal_get_alarm_email_address (dialog->ecal, &email, NULL)) {
- ECalComponentAttendee *a;
- GSList attendee_list;
-
- a = g_new0 (ECalComponentAttendee, 1);
- a->value = email;
- attendee_list.data = a;
- attendee_list.next = NULL;
- e_cal_component_alarm_set_attendee_list (dialog->alarm, &attendee_list);
- g_free (email);
- g_free (a);
- }
-
- /* If we can repeat */
- repeat = !e_cal_get_static_capability (dialog->ecal, CAL_STATIC_CAPABILITY_NO_ALARM_REPEAT);
- gtk_widget_set_sensitive (dialog->repeat_toggle, repeat);
-}
-
-static void
-repeat_widgets_to_alarm (Dialog *dialog, ECalComponentAlarm *alarm)
-{
- ECalComponentAlarmRepeat repeat;
-
- if (!e_dialog_toggle_get (dialog->repeat_toggle)) {
- repeat.repetitions = 0;
-
- e_cal_component_alarm_set_repeat (alarm, repeat);
- return;
- }
-
- repeat.repetitions = e_dialog_spin_get_int (dialog->repeat_quantity);
-
- memset (&repeat.duration, 0, sizeof (repeat.duration));
- switch (e_dialog_option_menu_get (dialog->repeat_unit, duration_units_map)) {
- case DUR_MINUTES:
- repeat.duration.minutes = e_dialog_spin_get_int (dialog->repeat_value);
- break;
-
- case DUR_HOURS:
- repeat.duration.hours = e_dialog_spin_get_int (dialog->repeat_value);
- break;
-
- case DUR_DAYS:
- repeat.duration.days = e_dialog_spin_get_int (dialog->repeat_value);
- break;
-
- default:
- g_assert_not_reached ();
- }
-
- e_cal_component_alarm_set_repeat (alarm, repeat);
-
-}
-
-/* Fills the audio alarm data with the values from the widgets */
-static void
-aalarm_widgets_to_alarm (Dialog *dialog, ECalComponentAlarm *alarm)
-{
- char *url;
- icalattach *attach;
-
- if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->aalarm_sound)))
- return;
-
- url = e_dialog_editable_get (dialog->aalarm_attach);
- attach = icalattach_new_from_url (url ? url : "");
- g_free (url);
-
- e_cal_component_alarm_set_attach (alarm, attach);
- icalattach_unref (attach);
-}
-
-/* Fills the display alarm data with the values from the widgets */
-static void
-dalarm_widgets_to_alarm (Dialog *dialog, ECalComponentAlarm *alarm)
-{
- char *str;
- ECalComponentText description;
- GtkTextBuffer *text_buffer;
- GtkTextIter text_iter_start, text_iter_end;
- icalcomponent *icalcomp;
- icalproperty *icalprop;
-
- if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->dalarm_message)))
- return;
-
- text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dialog->dalarm_description));
- gtk_text_buffer_get_start_iter (text_buffer, &text_iter_start);
- gtk_text_buffer_get_end_iter (text_buffer, &text_iter_end);
- str = gtk_text_buffer_get_text (text_buffer, &text_iter_start, &text_iter_end, FALSE);
-
- description.value = str;
- description.altrep = NULL;
-
- e_cal_component_alarm_set_description (alarm, &description);
- g_free (str);
-
- /* remove the X-EVOLUTION-NEEDS-DESCRIPTION property, so that
- * we don't re-set the alarm's description */
- icalcomp = e_cal_component_alarm_get_icalcomponent (alarm);
- icalprop = icalcomponent_get_first_property (icalcomp, ICAL_X_PROPERTY);
- while (icalprop) {
- const char *x_name;
-
- x_name = icalproperty_get_x_name (icalprop);
- if (!strcmp (x_name, "X-EVOLUTION-NEEDS-DESCRIPTION")) {
- icalcomponent_remove_property (icalcomp, icalprop);
- break;
- }
-
- icalprop = icalcomponent_get_next_property (icalcomp, ICAL_X_PROPERTY);
- }
-}
-
-/* Fills the mail alarm data with the values from the widgets */
-static void
-malarm_widgets_to_alarm (Dialog *dialog, ECalComponentAlarm *alarm)
-{
- char *str;
- ECalComponentText description;
- GSList *attendee_list = NULL;
- GtkTextBuffer *text_buffer;
- GtkTextIter text_iter_start, text_iter_end;
- ENameSelectorModel *name_selector_model;
- EDestinationStore *destination_store;
- GList *destinations;
- icalcomponent *icalcomp;
- icalproperty *icalprop;
- GList *l;
-
- /* Attendees */
- name_selector_model = e_name_selector_peek_model (dialog->name_selector);
- e_name_selector_model_peek_section (name_selector_model, section_name, NULL, &destination_store);
- destinations = e_destination_store_list_destinations (destination_store);
-
- for (l = destinations; l; l = g_list_next (l)) {
- EDestination *dest;
- ECalComponentAttendee *a;
-
- dest = l->data;
-
- a = g_new0 (ECalComponentAttendee, 1);
- a->value = e_destination_get_email (dest);
- a->cn = e_destination_get_name (dest);
-
- attendee_list = g_slist_append (attendee_list, a);
- }
-
- e_cal_component_alarm_set_attendee_list (alarm, attendee_list);
-
- e_cal_component_free_attendee_list (attendee_list);
- g_list_free (destinations);
-
- if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->malarm_message)))
- return;
-
- /* Description */
- text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dialog->malarm_description));
- gtk_text_buffer_get_start_iter (text_buffer, &text_iter_start);
- gtk_text_buffer_get_end_iter (text_buffer, &text_iter_end);
- str = gtk_text_buffer_get_text (text_buffer, &text_iter_start, &text_iter_end, FALSE);
-
- description.value = str;
- description.altrep = NULL;
-
- e_cal_component_alarm_set_description (alarm, &description);
- g_free (str);
-
- /* remove the X-EVOLUTION-NEEDS-DESCRIPTION property, so that
- * we don't re-set the alarm's description */
- icalcomp = e_cal_component_alarm_get_icalcomponent (alarm);
- icalprop = icalcomponent_get_first_property(icalcomp, ICAL_X_PROPERTY);
- while (icalprop) {
- const char *x_name;
-
- x_name = icalproperty_get_x_name (icalprop);
- if (!strcmp (x_name, "X-EVOLUTION-NEEDS-DESCRIPTION")) {
- icalcomponent_remove_property (icalcomp, icalprop);
- break;
- }
-
- icalprop = icalcomponent_get_next_property (icalcomp, ICAL_X_PROPERTY);
- }
-}
-
-/* Fills the procedure alarm data with the values from the widgets */
-static void
-palarm_widgets_to_alarm (Dialog *dialog, ECalComponentAlarm *alarm)
-{
- char *program;
- icalattach *attach;
- char *str;
- ECalComponentText description;
- icalcomponent *icalcomp;
- icalproperty *icalprop;
-
- program = e_dialog_editable_get (dialog->palarm_program);
- attach = icalattach_new_from_url (program ? program : "");
- g_free (program);
-
- e_cal_component_alarm_set_attach (alarm, attach);
- icalattach_unref (attach);
-
- str = e_dialog_editable_get (dialog->palarm_args);
- if (str && *str) {
- description.value = str;
- description.altrep = NULL;
-
- e_cal_component_alarm_set_description (alarm, &description);
- }
- g_free (str);
-
- /* remove the X-EVOLUTION-NEEDS-DESCRIPTION property, so that
- * we don't re-set the alarm's description */
- icalcomp = e_cal_component_alarm_get_icalcomponent (alarm);
- icalprop = icalcomponent_get_first_property (icalcomp, ICAL_X_PROPERTY);
- while (icalprop) {
- const char *x_name;
-
- x_name = icalproperty_get_x_name (icalprop);
- if (!strcmp (x_name, "X-EVOLUTION-NEEDS-DESCRIPTION")) {
- icalcomponent_remove_property (icalcomp, icalprop);
- break;
- }
-
- icalprop = icalcomponent_get_next_property (icalcomp, ICAL_X_PROPERTY);
- }
-}
-
-/* fill_component handler for the alarm page */
-static void
-dialog_to_alarm (Dialog *dialog)
-{
- ECalComponentAlarmTrigger trigger;
- ECalComponentAlarmAction action;
-
- /* Fill out the alarm */
- memset (&trigger, 0, sizeof (ECalComponentAlarmTrigger));
- trigger.type = e_dialog_option_menu_get (dialog->time, time_map);
- if (e_dialog_option_menu_get (dialog->relative, relative_map) == BEFORE)
- trigger.u.rel_duration.is_neg = 1;
- else
- trigger.u.rel_duration.is_neg = 0;
-
- switch (e_dialog_option_menu_get (dialog->value_units, value_map)) {
- case MINUTES:
- trigger.u.rel_duration.minutes =
- e_dialog_spin_get_int (dialog->interval_value);
- break;
-
- case HOURS:
- trigger.u.rel_duration.hours =
- e_dialog_spin_get_int (dialog->interval_value);
- break;
-
- case DAYS:
- trigger.u.rel_duration.days =
- e_dialog_spin_get_int (dialog->interval_value);
- break;
-
- default:
- g_assert_not_reached ();
- }
- e_cal_component_alarm_set_trigger (dialog->alarm, trigger);
-
- action = e_dialog_option_menu_get (dialog->action, action_map);
- e_cal_component_alarm_set_action (dialog->alarm, action);
-
- /* Repeat stuff */
- repeat_widgets_to_alarm (dialog, dialog->alarm);
-
- /* Options */
- switch (action) {
- case E_CAL_COMPONENT_ALARM_NONE:
- g_assert_not_reached ();
- break;
-
- case E_CAL_COMPONENT_ALARM_AUDIO:
- aalarm_widgets_to_alarm (dialog, dialog->alarm);
- break;
-
- case E_CAL_COMPONENT_ALARM_DISPLAY:
- dalarm_widgets_to_alarm (dialog, dialog->alarm);
- break;
-
- case E_CAL_COMPONENT_ALARM_EMAIL:
- malarm_widgets_to_alarm (dialog, dialog->alarm);
- break;
-
- case E_CAL_COMPONENT_ALARM_PROCEDURE:
- palarm_widgets_to_alarm (dialog, dialog->alarm);
- break;
-
- case E_CAL_COMPONENT_ALARM_UNKNOWN:
- break;
-
- default:
- g_assert_not_reached ();
- }
-}
-
-/* Gets the widgets from the XML file and returns TRUE if they are all available. */
-static gboolean
-get_widgets (Dialog *dialog)
-{
-#define GW(name) glade_xml_get_widget (dialog->xml, name)
-
- dialog->toplevel = GW ("alarm-dialog");
- if (!dialog->toplevel)
- return FALSE;
-
- dialog->action = GW ("action");
- dialog->interval_value = GW ("interval-value");
- dialog->value_units = GW ("value-units");
- dialog->relative = GW ("relative");
- dialog->time = GW ("time");
-
- dialog->repeat_toggle = GW ("repeat-toggle");
- dialog->repeat_group = GW ("repeat-group");
- dialog->repeat_quantity = GW ("repeat-quantity");
- dialog->repeat_value = GW ("repeat-value");
- dialog->repeat_unit = GW ("repeat-unit");
-
- dialog->option_notebook = GW ("option-notebook");
-
- dialog->dalarm_group = GW ("dalarm-group");
- dialog->dalarm_message = GW ("dalarm-message");
- dialog->dalarm_description = GW ("dalarm-description");
-
- dialog->aalarm_group = GW ("aalarm-group");
- dialog->aalarm_sound = GW ("aalarm-sound");
- dialog->aalarm_attach = GW ("aalarm-attach");
-
- dialog->malarm_group = GW ("malarm-group");
- dialog->malarm_address_group = GW ("malarm-address-group");
- dialog->malarm_addressbook = GW ("malarm-addressbook");
- dialog->malarm_message = GW ("malarm-message");
- dialog->malarm_description = GW ("malarm-description");
-
- dialog->palarm_group = GW ("palarm-group");
- dialog->palarm_program = GW ("palarm-program");
- dialog->palarm_args = GW ("palarm-args");
-
-#undef GW
-
- return (dialog->action
- && dialog->interval_value
- && dialog->value_units
- && dialog->relative
- && dialog->time
- && dialog->repeat_toggle
- && dialog->repeat_group
- && dialog->repeat_quantity
- && dialog->repeat_value
- && dialog->repeat_unit
- && dialog->option_notebook
- && dialog->dalarm_group
- && dialog->dalarm_message
- && dialog->dalarm_description
- && dialog->aalarm_group
- && dialog->aalarm_sound
- && dialog->aalarm_attach
- && dialog->malarm_group
- && dialog->malarm_address_group
- && dialog->malarm_addressbook
- && dialog->malarm_message
- && dialog->malarm_description
- && dialog->palarm_group
- && dialog->palarm_program
- && dialog->palarm_args);
-}
-
-#if 0
-/* Callback used when the alarm options button is clicked */
-static void
-show_options (Dialog *dialog)
-{
- gboolean repeat;
- char *email;
-
- e_cal_component_alarm_set_action (dialog->alarm,
- e_dialog_option_menu_get (dialog->action, action_map));
-
- repeat = !e_cal_get_static_capability (dialog->ecal, CAL_STATIC_CAPABILITY_NO_ALARM_REPEAT);
-
- if (e_cal_get_static_capability (dialog->ecal, CAL_STATIC_CAPABILITY_NO_EMAIL_ALARMS)
- || e_cal_get_alarm_email_address (dialog->ecal, &email, NULL)) {
- if (!alarm_options_dialog_run (dialog->toplevel, dialog->alarm, email, repeat))
- g_message (G_STRLOC ": not create the alarm options dialog");
- }
-}
-#endif
-
-static void
-addressbook_clicked_cb (GtkWidget *widget, gpointer data)
-{
- Dialog *dialog = data;
- ENameSelectorDialog *name_selector_dialog;
-
- name_selector_dialog = e_name_selector_peek_dialog (dialog->name_selector);
- gtk_widget_show (GTK_WIDGET (name_selector_dialog));
-}
-
-static void
-addressbook_response_cb (GtkWidget *widget, gint response, gpointer data)
-{
- Dialog *dialog = data;
- ENameSelectorDialog *name_selector_dialog;
-
- name_selector_dialog = e_name_selector_peek_dialog (dialog->name_selector);
- gtk_widget_hide (GTK_WIDGET (name_selector_dialog));
-}
-
-static gboolean
-setup_select_names (Dialog *dialog)
-{
- ENameSelectorModel *name_selector_model;
- ENameSelectorDialog *name_selector_dialog;
-
- dialog->name_selector = e_name_selector_new ();
- name_selector_model = e_name_selector_peek_model (dialog->name_selector);
-
- e_name_selector_model_add_section (name_selector_model, section_name, section_name, NULL);
-
- dialog->malarm_addresses =
- GTK_WIDGET (e_name_selector_peek_section_entry (dialog->name_selector, section_name));
- gtk_widget_show (dialog->malarm_addresses);
- gtk_box_pack_end_defaults (GTK_BOX (dialog->malarm_address_group), dialog->malarm_addresses);
-
- gtk_signal_connect (GTK_OBJECT (dialog->malarm_addressbook), "clicked",
- GTK_SIGNAL_FUNC (addressbook_clicked_cb), dialog);
-
- name_selector_dialog = e_name_selector_peek_dialog (dialog->name_selector);
- g_signal_connect (name_selector_dialog, "response",
- G_CALLBACK (addressbook_response_cb), dialog);
-
- return TRUE;
-}
-
-/* Callback used when the repeat toggle button is toggled. We sensitize the
- * repeat group options as appropriate.
- */
-static void
-repeat_toggle_toggled_cb (GtkToggleButton *toggle, gpointer data)
-{
- Dialog *dialog = data;
- gboolean active;
-
- active = gtk_toggle_button_get_active (toggle);
-
- gtk_widget_set_sensitive (dialog->repeat_group, active);
-}
-
-static void
-check_custom_sound (Dialog *dialog)
-{
- char *str;
- gboolean sens;
-
- str = e_dialog_editable_get (dialog->aalarm_attach);
-
- sens = e_dialog_toggle_get (dialog->aalarm_sound) ? str && *str : TRUE;
- gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog->toplevel), GTK_RESPONSE_OK, sens);
-
- g_free (str);
-}
-
-static void
-aalarm_sound_toggled_cb (GtkToggleButton *toggle, gpointer data)
-{
- Dialog *dialog = data;
- gboolean active;
-
- active = gtk_toggle_button_get_active (toggle);
-
- gtk_widget_set_sensitive (dialog->aalarm_group, active);
- check_custom_sound (dialog);
-}
-
-static void
-aalarm_attach_changed_cb (GtkWidget *widget, gpointer data)
-{
- Dialog *dialog = data;
-
- check_custom_sound (dialog);
-}
-
-static void
-check_custom_message (Dialog *dialog)
-{
- char *str;
- GtkTextBuffer *text_buffer;
- GtkTextIter text_iter_start, text_iter_end;
- gboolean sens;
-
- text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dialog->dalarm_description));
- gtk_text_buffer_get_start_iter (text_buffer, &text_iter_start);
- gtk_text_buffer_get_end_iter (text_buffer, &text_iter_end);
- str = gtk_text_buffer_get_text (text_buffer, &text_iter_start, &text_iter_end, FALSE);
-
- sens = e_dialog_toggle_get (dialog->dalarm_message) ? str && *str : TRUE;
- gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog->toplevel), GTK_RESPONSE_OK, sens);
-
- g_free (str);
-}
-
-static void
-dalarm_message_toggled_cb (GtkToggleButton *toggle, gpointer data)
-{
- Dialog *dialog = data;
- gboolean active;
-
- active = gtk_toggle_button_get_active (toggle);
-
- gtk_widget_set_sensitive (dialog->dalarm_group, active);
- check_custom_message (dialog);
-}
-
-static void
-dalarm_description_changed_cb (GtkWidget *widget, gpointer data)
-{
- Dialog *dialog = data;
-
- check_custom_message (dialog);
-}
-
-static void
-check_custom_program (Dialog *dialog)
-{
- char *str;
- gboolean sens;
-
- str = e_dialog_editable_get (dialog->palarm_program);
-
- sens = str && *str;
- gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog->toplevel), GTK_RESPONSE_OK, sens);
-}
-
-static void
-palarm_program_changed_cb (GtkWidget *widget, gpointer data)
-{
- Dialog *dialog = data;
-
- check_custom_program (dialog);
-}
-
-static void
-check_custom_email (Dialog *dialog)
-{
- char *str;
- GtkTextBuffer *text_buffer;
- GtkTextIter text_iter_start, text_iter_end;
- ENameSelectorModel *name_selector_model;
- EDestinationStore *destination_store;
- GList *destinations;
- gboolean sens;
-
- name_selector_model = e_name_selector_peek_model (dialog->name_selector);
- e_name_selector_model_peek_section (name_selector_model, section_name, NULL, &destination_store);
- destinations = e_destination_store_list_destinations (destination_store);
-
- text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dialog->malarm_description));
- gtk_text_buffer_get_start_iter (text_buffer, &text_iter_start);
- gtk_text_buffer_get_end_iter (text_buffer, &text_iter_end);
- str = gtk_text_buffer_get_text (text_buffer, &text_iter_start, &text_iter_end, FALSE);
-
- sens = (destinations != NULL) && (e_dialog_toggle_get (dialog->malarm_message) ? str && *str : TRUE);
- gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog->toplevel), GTK_RESPONSE_OK, sens);
-
- g_list_free (destinations);
-}
-
-static void
-malarm_addresses_changed_cb (GtkWidget *editable,
- gpointer data)
-{
- Dialog *dialog = data;
-
- check_custom_email (dialog);
-}
-
-static void
-malarm_message_toggled_cb (GtkToggleButton *toggle, gpointer data)
-{
- Dialog *dialog = data;
- gboolean active;
-
- active = gtk_toggle_button_get_active (toggle);
-
- gtk_widget_set_sensitive (dialog->malarm_group, active);
- check_custom_email (dialog);
-}
-
-static void
-malarm_description_changed_cb (GtkWidget *widget, gpointer data)
-{
- Dialog *dialog = data;
-
- check_custom_email (dialog);
-}
-
-static void
-action_selection_done_cb (GtkMenuShell *menu_shell, gpointer data)
-{
- Dialog *dialog = data;
- ECalComponentAlarmAction action;
- int page = 0, i;
-
- action = e_dialog_option_menu_get (dialog->action, action_map);
- for (i = 0; action_map[i] != -1 ; i++) {
- if (action == action_map[i]) {
- page = i;
- break;
- }
- }
-
- gtk_notebook_set_page (GTK_NOTEBOOK (dialog->option_notebook), page);
-
- switch (action) {
- case E_CAL_COMPONENT_ALARM_AUDIO:
- check_custom_sound (dialog);
- break;
-
- case E_CAL_COMPONENT_ALARM_DISPLAY:
- check_custom_message (dialog);
- break;
-
- case E_CAL_COMPONENT_ALARM_EMAIL:
- check_custom_email (dialog);
- break;
-
- case E_CAL_COMPONENT_ALARM_PROCEDURE:
- check_custom_program (dialog);
- break;
- default:
- g_assert_not_reached ();
- return;
- }
-}
-
-/* Hooks the widget signals */
-static void
-init_widgets (Dialog *dialog)
-{
- GtkWidget *menu;
- GtkTextBuffer *text_buffer;
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (dialog->action));
- g_signal_connect (menu, "selection_done",
- G_CALLBACK (action_selection_done_cb),
- dialog);
-
- g_signal_connect (G_OBJECT (dialog->repeat_toggle), "toggled",
- G_CALLBACK (repeat_toggle_toggled_cb), dialog);
-
- /* Handle custom sounds */
- g_signal_connect (G_OBJECT (dialog->aalarm_sound), "toggled",
- G_CALLBACK (aalarm_sound_toggled_cb), dialog);
- g_signal_connect (G_OBJECT (dialog->aalarm_attach), "changed",
- G_CALLBACK (aalarm_attach_changed_cb), dialog);
-
- /* Handle custom messages */
- g_signal_connect (G_OBJECT (dialog->dalarm_message), "toggled",
- G_CALLBACK (dalarm_message_toggled_cb), dialog);
- text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dialog->dalarm_description));
- g_signal_connect (G_OBJECT (text_buffer), "changed",
- G_CALLBACK (dalarm_description_changed_cb), dialog);
-
- /* Handle program */
- g_signal_connect (G_OBJECT (dialog->palarm_program), "changed",
- G_CALLBACK (palarm_program_changed_cb), dialog);
-
- /* Handle custom email */
- g_signal_connect (G_OBJECT (dialog->malarm_message), "toggled",
- G_CALLBACK (malarm_message_toggled_cb), dialog);
- text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dialog->malarm_description));
- g_signal_connect (G_OBJECT (text_buffer), "changed",
- G_CALLBACK (malarm_description_changed_cb), dialog);
-
- g_signal_connect (dialog->malarm_addresses, "changed",
- G_CALLBACK (malarm_addresses_changed_cb), dialog);
-}
-
-gboolean
-alarm_dialog_run (GtkWidget *parent, ECal *ecal, ECalComponentAlarm *alarm)
-{
- Dialog dialog;
- int response_id;
- GList *icon_list;
-
- g_return_val_if_fail (alarm != NULL, FALSE);
-
- dialog.alarm = alarm;
- dialog.ecal = ecal;
-
- dialog.xml = glade_xml_new (EVOLUTION_GLADEDIR "/alarm-dialog.glade", NULL, NULL);
- if (!dialog.xml) {
- g_message (G_STRLOC ": Could not load the Glade XML file!");
- return FALSE;
- }
-
- if (!get_widgets (&dialog)) {
- g_object_unref(dialog.xml);
- return FALSE;
- }
-
- if (!setup_select_names (&dialog)) {
- g_object_unref (dialog.xml);
- return FALSE;
- }
-
- init_widgets (&dialog);
-
- alarm_to_dialog (&dialog);
-
- gtk_widget_ensure_style (dialog.toplevel);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog.toplevel)->vbox), 0);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog.toplevel)->action_area), 12);
-
- icon_list = e_icon_factory_get_icon_list ("stock_calendar");
- if (icon_list) {
- gtk_window_set_icon_list (GTK_WINDOW (dialog.toplevel), icon_list);
- g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
- g_list_free (icon_list);
- }
-
- gtk_window_set_transient_for (GTK_WINDOW (dialog.toplevel),
- GTK_WINDOW (parent));
-
- response_id = gtk_dialog_run (GTK_DIALOG (dialog.toplevel));
-
- if (response_id == GTK_RESPONSE_OK)
- dialog_to_alarm (&dialog);
-
- gtk_widget_destroy (dialog.toplevel);
- g_object_unref (dialog.xml);
-
- return response_id == GTK_RESPONSE_OK ? TRUE : FALSE;
-}
diff --git a/calendar/gui/dialogs/alarm-dialog.glade b/calendar/gui/dialogs/alarm-dialog.glade
deleted file mode 100644
index d6ded5f252..0000000000
--- a/calendar/gui/dialogs/alarm-dialog.glade
+++ /dev/null
@@ -1,1178 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-<requires lib="gnome"/>
-
-<widget class="GtkDialog" id="alarm-dialog">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="title" translatable="yes">Add Alarm</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">True</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="has_separator">False</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="cancelbutton">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-6</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="okbutton">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-5</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox28">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Alarm&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox56">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label20">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox54">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkOptionMenu" id="action">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget1">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Pop up an alert</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Play a sound</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget4">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Run a program</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="send_an_email1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Send an email</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="interval-value">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">1 0 999 1 10 10</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="value-units">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget5">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget6">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minute(s)</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget7">
- <property name="visible">True</property>
- <property name="label" translatable="yes">hour(s)</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget8">
- <property name="visible">True</property>
- <property name="label" translatable="yes">day(s)</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="relative">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget9">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget10">
- <property name="visible">True</property>
- <property name="label" translatable="yes">before</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget11">
- <property name="visible">True</property>
- <property name="label" translatable="yes">after</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="time">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget12">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget13">
- <property name="visible">True</property>
- <property name="label" translatable="yes">start of appointment</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget14">
- <property name="visible">True</property>
- <property name="label" translatable="yes">end of appointment</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Repeat&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox57">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label21">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox5">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkCheckButton" id="repeat-toggle">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="has_focus">True</property>
- <property name="label" translatable="yes">_Repeat the alarm</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="repeat-group">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkSpinButton" id="repeat-quantity">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">1 1 999 1 10 10</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">extra times every</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="repeat-value">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">5 0 999 1 10 10</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="repeat-unit">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget1">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">hours</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget4">
- <property name="visible">True</property>
- <property name="label" translatable="yes">days</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Options&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox55">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label22">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkNotebook" id="option-notebook">
- <property name="visible">True</property>
- <property name="show_tabs">False</property>
- <property name="show_border">False</property>
- <property name="tab_pos">GTK_POS_TOP</property>
- <property name="scrollable">False</property>
- <property name="enable_popup">False</property>
-
- <child>
- <widget class="GtkVBox" id="vbox3">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkCheckButton" id="dalarm-message">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Custom _message</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="dalarm-group">
- <property name="visible">True</property>
- <property name="n_rows">1</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Mes_sage:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">option-notebook</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow1">
- <property name="visible">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
- <child>
- <widget class="GtkTextView" id="dalarm-description">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="overwrite">False</property>
- <property name="accepts_tab">True</property>
- <property name="justification">GTK_JUSTIFY_LEFT</property>
- <property name="wrap_mode">GTK_WRAP_WORD</property>
- <property name="cursor_visible">True</property>
- <property name="pixels_above_lines">0</property>
- <property name="pixels_below_lines">0</property>
- <property name="pixels_inside_wrap">0</property>
- <property name="left_margin">0</property>
- <property name="right_margin">0</property>
- <property name="indent">0</property>
- <property name="text" translatable="yes"></property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label15">
- <property name="visible">True</property>
- <property name="label" translatable="yes">label15</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkCheckButton" id="aalarm-sound">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Custom alarm sound</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="aalarm-group">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Sound:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">aalarm-attach</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GnomeFileEntry" id="file-entry1">
- <property name="visible">True</property>
- <property name="max_saved">10</property>
- <property name="directory_entry">False</property>
- <property name="modal">True</property>
- <property name="use_filechooser">True</property>
- <property name="filechooser_action">GTK_FILE_CHOOSER_ACTION_OPEN</property>
-
- <child internal-child="entry">
- <widget class="GtkEntry" id="aalarm-attach">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label16">
- <property name="visible">True</property>
- <property name="label" translatable="yes">label16</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox2">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkTable" id="palarm-group">
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label5">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Program:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">palarm-program</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label6">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Arguments:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">palarm-args</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="palarm-program">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="palarm-args">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label17">
- <property name="visible">True</property>
- <property name="label" translatable="yes">label17</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox4">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkVBox" id="vbox6">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkHBox" id="malarm-address-group">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkButton" id="malarm-addressbook">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Send To:</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <placeholder/>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox27">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkCheckButton" id="malarm-message">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Custom _message</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="malarm-group">
- <property name="visible">True</property>
- <property name="n_rows">1</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow3">
- <property name="visible">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
- <child>
- <widget class="GtkTextView" id="malarm-description">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="overwrite">False</property>
- <property name="accepts_tab">True</property>
- <property name="justification">GTK_JUSTIFY_LEFT</property>
- <property name="wrap_mode">GTK_WRAP_WORD</property>
- <property name="cursor_visible">True</property>
- <property name="pixels_above_lines">0</property>
- <property name="pixels_below_lines">0</property>
- <property name="pixels_inside_wrap">0</property>
- <property name="left_margin">0</property>
- <property name="right_margin">0</property>
- <property name="indent">0</property>
- <property name="text" translatable="yes"></property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label19">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Mes_sage:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">option-notebook</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label18">
- <property name="visible">True</property>
- <property name="label" translatable="yes">label18</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/calendar/gui/dialogs/alarm-dialog.h b/calendar/gui/dialogs/alarm-dialog.h
deleted file mode 100644
index 8e57579d9f..0000000000
--- a/calendar/gui/dialogs/alarm-dialog.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Evolution calendar - Alarm page of the calendar component dialogs
- *
- * Copyright (C) 2001-2003 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- * Miguel de Icaza <miguel@ximian.com>
- * Seth Alves <alves@hungry.com>
- * JP Rosevear <jpr@ximian.com>
- * Hans Petter Jansson <hpj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef ALARM_DIALOG_H
-#define ALARM_DIALOG_H
-
-#include <libecal/e-cal.h>
-#include <libecal/e-cal-component.h>
-
-G_BEGIN_DECLS
-
-gboolean alarm_dialog_run (GtkWidget *parent, ECal *ecal, ECalComponentAlarm *alarm);
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/dialogs/alarm-list-dialog.c b/calendar/gui/dialogs/alarm-list-dialog.c
deleted file mode 100644
index 88460e0935..0000000000
--- a/calendar/gui/dialogs/alarm-list-dialog.c
+++ /dev/null
@@ -1,261 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/* Evolution calendar - Alarm page of the calendar component dialogs
- *
- * Copyright (C) 2001-2003 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- * Miguel de Icaza <miguel@ximian.com>
- * Seth Alves <alves@hungry.com>
- * JP Rosevear <jpr@ximian.com>
- * Hans Petter Jansson <hpj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkcellrenderertext.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtktreeview.h>
-#include <gtk/gtktreeselection.h>
-#include <gtk/gtkoptionmenu.h>
-#include <libgnome/gnome-i18n.h>
-#include <glade/glade.h>
-#include "e-util/e-dialog-widgets.h"
-#include "e-util/e-time-utils.h"
-#include <libecal/e-cal-util.h>
-#include <libecal/e-cal-time-util.h>
-#include "e-util/e-dialog-widgets.h"
-#include "e-util/e-icon-factory.h"
-#include "alarm-dialog.h"
-#include "alarm-list-dialog.h"
-
-
-
-typedef struct {
- /* Glade XML data */
- GladeXML *xml;
-
- /* The client */
- ECal *ecal;
-
- /* The list store */
- EAlarmList *list_store;
-
- /* Toplevel */
- GtkWidget *toplevel;
-
- GtkWidget *list;
- GtkWidget *add;
- GtkWidget *delete;
-} Dialog;
-
-/* Gets the widgets from the XML file and returns TRUE if they are all available. */
-static gboolean
-get_widgets (Dialog *dialog)
-{
-#define GW(name) glade_xml_get_widget (dialog->xml, name)
-
- dialog->toplevel = GW ("alarm-list-dialog");
- if (!dialog->toplevel)
- return FALSE;
-
- dialog->list = GW ("list");
- dialog->add = GW ("add");
- dialog->delete = GW ("delete");
-
-#undef GW
-
- return (dialog->list
- && dialog->add
- && dialog->delete);
-}
-
-static void
-sensitize_buttons (Dialog *dialog)
-{
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- gboolean have_selected, read_only = FALSE;
- GError *error = NULL;
-
- if (!e_cal_is_read_only (dialog->ecal, &read_only, &error)) {
- if (error->code != E_CALENDAR_STATUS_BUSY)
- read_only = TRUE;
- g_error_free (error);
- }
-
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->list));
- have_selected = gtk_tree_selection_get_selected (selection, NULL, &iter);
-
- if ((e_cal_get_one_alarm_only (dialog->ecal) && have_selected) || read_only)
- gtk_widget_set_sensitive (dialog->add, FALSE);
- else
- gtk_widget_set_sensitive (dialog->add, TRUE);
- gtk_widget_set_sensitive (dialog->delete, have_selected && !read_only);
-}
-
-/* Callback used for the "add reminder" button */
-static void
-add_clicked_cb (GtkButton *button, gpointer data)
-{
- Dialog *dialog = data;
- ECalComponentAlarm *alarm;
- GtkTreeView *view;
- GtkTreeIter iter;
- icalcomponent *icalcomp;
- icalproperty *icalprop;
-
- view = GTK_TREE_VIEW (dialog->list);
-
- alarm = e_cal_component_alarm_new ();
-
- icalcomp = e_cal_component_alarm_get_icalcomponent (alarm);
- icalprop = icalproperty_new_x ("1");
- icalproperty_set_x_name (icalprop, "X-EVOLUTION-NEEDS-DESCRIPTION");
- icalcomponent_add_property (icalcomp, icalprop);
-
- if (alarm_dialog_run (dialog->toplevel, dialog->ecal, alarm)) {
- e_alarm_list_append (dialog->list_store, &iter, alarm);
- gtk_tree_selection_select_iter (gtk_tree_view_get_selection (view), &iter);
- } else {
- e_cal_component_alarm_free (alarm);
- }
-
- sensitize_buttons (dialog);
-}
-
-/* Callback used for the "delete reminder" button */
-static void
-delete_clicked_cb (GtkButton *button, gpointer data)
-{
- Dialog *dialog = data;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- GtkTreePath *path;
- gboolean valid_iter;
-
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->list));
- if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
- g_warning ("Could not get a selection to delete.");
- return;
- }
-
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (dialog->list_store), &iter);
- e_alarm_list_remove (dialog->list_store, &iter);
-
- /* Select closest item after removal */
- valid_iter = gtk_tree_model_get_iter (GTK_TREE_MODEL (dialog->list_store), &iter, path);
- if (!valid_iter) {
- gtk_tree_path_prev (path);
- valid_iter = gtk_tree_model_get_iter (GTK_TREE_MODEL (dialog->list_store), &iter, path);
- }
-
- if (valid_iter)
- gtk_tree_selection_select_iter (selection, &iter);
-
- sensitize_buttons (dialog);
-
- gtk_tree_path_free (path);
-}
-
-static void
-selection_changed_cb (GtkTreeSelection *selection, gpointer data)
-{
- Dialog *dialog = data;
-
- sensitize_buttons (dialog);
-}
-
-/* Hooks the widget signals */
-static void
-init_widgets (Dialog *dialog)
-{
- GtkTreeViewColumn *column;
- GtkCellRenderer *cell_renderer;
-
- /* View */
- gtk_tree_view_set_model (GTK_TREE_VIEW (dialog->list),
- GTK_TREE_MODEL (dialog->list_store));
-
- column = gtk_tree_view_column_new ();
- gtk_tree_view_column_set_title (column, _("Action/Trigger"));
- cell_renderer = GTK_CELL_RENDERER (gtk_cell_renderer_text_new ());
- gtk_tree_view_column_pack_start (column, cell_renderer, TRUE);
- gtk_tree_view_column_add_attribute (column, cell_renderer, "text", E_ALARM_LIST_COLUMN_DESCRIPTION);
- gtk_tree_view_append_column (GTK_TREE_VIEW (dialog->list), column);
-
- /* Reminder buttons */
- g_signal_connect (dialog->add, "clicked",
- G_CALLBACK (add_clicked_cb), dialog);
- g_signal_connect (dialog->delete, "clicked",
- G_CALLBACK (delete_clicked_cb), dialog);
-
- g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->list)), "changed",
- G_CALLBACK (selection_changed_cb), dialog);
-}
-
-gboolean
-alarm_list_dialog_run (GtkWidget *parent, ECal *ecal, EAlarmList *list_store)
-{
- Dialog dialog;
- int response_id;
- GList *icon_list;
-
- dialog.ecal = ecal;
- dialog.list_store = list_store;
-
- dialog.xml = glade_xml_new (EVOLUTION_GLADEDIR "/alarm-list-dialog.glade", NULL, NULL);
- if (!dialog.xml) {
- g_message (G_STRLOC ": Could not load the Glade XML file!");
- return FALSE;
- }
-
- if (!get_widgets (&dialog)) {
- g_object_unref(dialog.xml);
- return FALSE;
- }
-
- init_widgets (&dialog);
-
- sensitize_buttons (&dialog);
-
- gtk_widget_ensure_style (dialog.toplevel);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog.toplevel)->vbox), 0);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog.toplevel)->action_area), 12);
-
- icon_list = e_icon_factory_get_icon_list ("stock_calendar");
- if (icon_list) {
- gtk_window_set_icon_list (GTK_WINDOW (dialog.toplevel), icon_list);
- g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
- g_list_free (icon_list);
- }
-
- gtk_window_set_transient_for (GTK_WINDOW (dialog.toplevel),
- GTK_WINDOW (parent));
-
- response_id = gtk_dialog_run (GTK_DIALOG (dialog.toplevel));
- gtk_widget_hide (dialog.toplevel);
-
- gtk_widget_destroy (dialog.toplevel);
- g_object_unref (dialog.xml);
-
- return response_id == GTK_RESPONSE_OK ? TRUE : FALSE;
-}
diff --git a/calendar/gui/dialogs/alarm-list-dialog.glade b/calendar/gui/dialogs/alarm-list-dialog.glade
deleted file mode 100644
index 886b1a47b9..0000000000
--- a/calendar/gui/dialogs/alarm-list-dialog.glade
+++ /dev/null
@@ -1,218 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkDialog" id="alarm-list-dialog">
- <property name="title" translatable="yes">Alarms</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
- <property name="modal">True</property>
- <property name="default_width">320</property>
- <property name="default_height">240</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="has_separator">False</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="cancelbutton1">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-6</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="okbutton1">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-5</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox53">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkHBox" id="hbox55">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow13">
- <property name="visible">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
- <child>
- <widget class="GtkTreeView" id="list">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="headers_visible">True</property>
- <property name="rules_hint">False</property>
- <property name="reorderable">False</property>
- <property name="enable_search">True</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVButtonBox" id="vbuttonbox2">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_START</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkButton" id="add">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment1">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox56">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child>
- <widget class="GtkImage" id="image1">
- <property name="visible">True</property>
- <property name="stock">gtk-add</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label65">
- <property name="visible">True</property>
- <property name="label" translatable="yes">A_dd</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="delete">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-remove</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/calendar/gui/dialogs/alarm-list-dialog.h b/calendar/gui/dialogs/alarm-list-dialog.h
deleted file mode 100644
index a46bcccfa4..0000000000
--- a/calendar/gui/dialogs/alarm-list-dialog.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Evolution calendar - Alarm page of the calendar component dialogs
- *
- * Copyright (C) 2001-2003 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- * Miguel de Icaza <miguel@ximian.com>
- * Seth Alves <alves@hungry.com>
- * JP Rosevear <jpr@ximian.com>
- * Hans Petter Jansson <hpj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef ALARM_LIST_DIALOG_H
-#define ALARM_LIST_DIALOG_H
-
-#include <libecal/e-cal.h>
-#include <libecal/e-cal-component.h>
-#include "../e-alarm-list.h"
-
-G_BEGIN_DECLS
-
-gboolean alarm_list_dialog_run (GtkWidget *parent, ECal *ecal, EAlarmList *list_store);
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/dialogs/cal-attachment-bar.c b/calendar/gui/dialogs/cal-attachment-bar.c
deleted file mode 100644
index 57c0cab5f1..0000000000
--- a/calendar/gui/dialogs/cal-attachment-bar.c
+++ /dev/null
@@ -1,919 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/*
- * Authors: Harish Krishnaswamy <kharish@novell.com>
- *
- * Copyright 2004 Novell, Inc. (www.novell.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-/* Much of this file has been shamelessly copied from the mail attachment
- * handling code, including the fixmes. Modifications/Additions that are
- * specific to the calendar component have been flagged by some comments
- * fwiw */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <gtk/gtk.h>
-#include <glade/glade.h>
-#include <gconf/gconf.h>
-#include <gconf/gconf-client.h>
-#include <gdk/gdkkeysyms.h>
-#include <libgnomevfs/gnome-vfs-mime-handlers.h>
-#include <libgnome/gnome-i18n.h>
-#include "comp-editor.h"
-#include "cal-attachment-select-file.h"
-#include "cal-attachment.h"
-#include "cal-attachment-bar.h"
-
-#include <libedataserver/e-iconv.h>
-
-#include <camel/camel-data-wrapper.h>
-#include <camel/camel-stream-fs.h>
-#include <camel/camel-stream-null.h>
-#include <camel/camel-stream-mem.h>
-#include <camel/camel-stream-filter.h>
-#include <camel/camel-mime-filter-bestenc.h>
-#include <camel/camel-mime-part.h>
-#include <camel/camel-file-utils.h>
-
-#include "e-util/e-gui-utils.h"
-#include "e-util/e-icon-factory.h"
-#include "widgets/misc/e-error.h"
-#include "mail/em-popup.h"
-
-#define ICON_WIDTH 64
-#define ICON_SEPARATORS " /-_"
-#define ICON_SPACING 2
-#define ICON_ROW_SPACING ICON_SPACING
-#define ICON_COL_SPACING ICON_SPACING
-#define ICON_BORDER 2
-#define ICON_TEXT_SPACING 2
-
-static GnomeIconListClass *parent_class = NULL;
-
-struct _CalAttachmentBarPrivate {
- GSList *attachments;
- guint num_attachments;
- /* The persistent copies of the attachments
- * derive their location and name from the
- * local_attachment_store and the comp_uid.
- */
- char *local_attachment_store;
- char *comp_uid;
-};
-
-enum {
- CHANGED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-static void update (CalAttachmentBar *bar);
-
-static char *
-size_to_string (gulong size)
-{
- char *size_string;
-
- /* FIXME: The following should probably go into a separate module, as
- we might have to do the same thing in other places as well. Also,
- I am not sure this will be OK for all the languages. */
-
- if (size < 1e3L) {
- size_string = NULL;
- } else {
- gdouble displayed_size;
-
- if (size < 1e6L) {
- displayed_size = (gdouble) size / 1.0e3;
- size_string = g_strdup_printf (_("%.0fK"), displayed_size);
- } else if (size < 1e9L) {
- displayed_size = (gdouble) size / 1.0e6;
- size_string = g_strdup_printf (_("%.0fM"), displayed_size);
- } else {
- displayed_size = (gdouble) size / 1.0e9;
- size_string = g_strdup_printf (_("%.0fG"), displayed_size);
- }
- }
-
- return size_string;
-}
-
-/* Attachment handling functions. */
-
-static void
-free_attachment_list (CalAttachmentBar *bar)
-{
- CalAttachmentBarPrivate *priv;
- GSList *p;
-
- priv = bar->priv;
-
- for (p = priv->attachments; p != NULL; p = p->next)
- g_object_unref (p->data);
-
- priv->attachments = NULL;
-}
-
-static void
-attachment_changed_cb (CalAttachment *attachment,
- gpointer data)
-{
- update (CAL_ATTACHMENT_BAR (data));
-}
-
-static void
-add_common (CalAttachmentBar *bar,
- CalAttachment *attachment)
-{
- g_return_if_fail (attachment != NULL);
-
- g_signal_connect (attachment, "changed",
- G_CALLBACK (attachment_changed_cb),
- bar);
-
- bar->priv->attachments = g_slist_append (bar->priv->attachments,
- attachment);
- bar->priv->num_attachments++;
-
- update (bar);
-
- g_signal_emit (bar, signals[CHANGED], 0);
-}
-
-static void
-add_from_mime_part (CalAttachmentBar *bar,
- CamelMimePart *part)
-{
- add_common (bar, cal_attachment_new_from_mime_part (part));
-}
-
-static void
-add_from_file (CalAttachmentBar *bar,
- const char *file_name,
- const char *disposition)
-{
- CalAttachment *attachment;
- CamelException ex;
-
- camel_exception_init (&ex);
- attachment = cal_attachment_new (file_name, disposition, &ex);
- if (attachment) {
- add_common (bar, attachment);
- } else {
- e_error_run((GtkWindow *)gtk_widget_get_toplevel((GtkWidget *)bar), "event-editor:no-attach",
- file_name, camel_exception_get_description(&ex), NULL);
- camel_exception_clear (&ex);
- }
-}
-
-static void
-remove_attachment (CalAttachmentBar *bar,
- CalAttachment *attachment)
-{
- g_return_if_fail (E_IS_CAL_ATTACHMENT_BAR (bar));
- g_return_if_fail (g_slist_find (bar->priv->attachments, attachment) != NULL);
-
- bar->priv->attachments = g_slist_remove (bar->priv->attachments,
- attachment);
- bar->priv->num_attachments--;
- if (attachment->editor_gui != NULL) {
- GtkWidget *dialog = glade_xml_get_widget (attachment->editor_gui, "dialog");
- g_signal_emit_by_name (dialog, "response", GTK_RESPONSE_CLOSE);
- }
-
- g_object_unref(attachment);
-
- g_signal_emit (bar, signals[CHANGED], 0);
-}
-
-/* Icon list contents handling. */
-
-static void
-update (CalAttachmentBar *bar)
-{
- CalAttachmentBarPrivate *priv;
- GnomeIconList *icon_list;
- GSList *p;
-
- priv = bar->priv;
- icon_list = GNOME_ICON_LIST (bar);
-
- gnome_icon_list_freeze (icon_list);
-
- gnome_icon_list_clear (icon_list);
-
- for (p = priv->attachments; p != NULL; p = p->next) {
- CalAttachment *attachment;
- CamelContentType *content_type;
- char *size_string, *label;
- GdkPixbuf *pixbuf;
- const char *desc;
-
- attachment = p->data;
- content_type = camel_mime_part_get_content_type (attachment->body);
- /* Get the image out of the attachment
- and create a thumbnail for it */
- pixbuf = attachment->pixbuf_cache;
- if (pixbuf) {
- g_object_ref(pixbuf);
- } else if (camel_content_type_is(content_type, "image", "*")) {
- CamelDataWrapper *wrapper;
- CamelStreamMem *mstream;
- GdkPixbufLoader *loader;
- gboolean error = TRUE;
-
- wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (attachment->body));
- mstream = (CamelStreamMem *) camel_stream_mem_new ();
-
- camel_data_wrapper_decode_to_stream (wrapper, (CamelStream *) mstream);
-
- /* Stream image into pixbuf loader */
- loader = gdk_pixbuf_loader_new ();
- error = !gdk_pixbuf_loader_write (loader, mstream->buffer->data, mstream->buffer->len, NULL);
- gdk_pixbuf_loader_close (loader, NULL);
-
- if (!error) {
- int ratio, width, height;
-
- /* Shrink pixbuf */
- pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
- width = gdk_pixbuf_get_width (pixbuf);
- height = gdk_pixbuf_get_height (pixbuf);
- if (width >= height) {
- if (width > 48) {
- ratio = width / 48;
- width = 48;
- height = height / ratio;
- }
- } else {
- if (height > 48) {
- ratio = height / 48;
- height = 48;
- width = width / ratio;
- }
- }
-
- attachment->pixbuf_cache = gdk_pixbuf_scale_simple
- (pixbuf,
- width,
- height,
- GDK_INTERP_BILINEAR);
- pixbuf = attachment->pixbuf_cache;
- g_object_ref(pixbuf);
- } else {
- pixbuf = NULL;
- g_warning ("GdkPixbufLoader Error");
- }
-
- /* Destroy everything */
- g_object_unref (loader);
- camel_object_unref (mstream);
- }
-
- desc = camel_mime_part_get_description (attachment->body);
- if (!desc || *desc == '\0')
- desc = camel_mime_part_get_filename (attachment->body);
-
- if (!desc)
- desc = _("attachment");
-
- if (attachment->size
- && (size_string = size_to_string (attachment->size))) {
- label = g_strdup_printf ("%s (%s)", desc, size_string);
- g_free (size_string);
- } else
- label = g_strdup (desc);
-
- if (pixbuf == NULL) {
- char *mime_type;
-
- mime_type = camel_content_type_simple (content_type);
- pixbuf = e_icon_for_mime_type (mime_type, 48);
- if (pixbuf == NULL) {
- g_warning("cannot find icon for mime type %s (installation problem?)", mime_type);
- /* stock_attach would be better, but its fugly scaled up */
- pixbuf = e_icon_factory_get_icon("stock_unknown", E_ICON_SIZE_DIALOG);
- }
- g_free (mime_type);
- }
-
- if (pixbuf) {
- gnome_icon_list_append_pixbuf (icon_list, pixbuf, NULL, label);
- g_object_unref(pixbuf);
- }
-
- g_free (label);
- }
- gnome_icon_list_thaw (icon_list);
-}
-
-static void
-remove_selected (CalAttachmentBar *bar)
-{
- GnomeIconList *icon_list;
- CalAttachment *attachment;
- GSList *attachment_list, *l;
- GList *p;
- int num = 0, left, dlen;
-
- icon_list = GNOME_ICON_LIST (bar);
-
- attachment_list = NULL;
- p = gnome_icon_list_get_selection (icon_list);
- dlen = g_list_length (p);
- for ( ; p != NULL; p = p->next) {
- num = GPOINTER_TO_INT (p->data);
- attachment = CAL_ATTACHMENT (g_slist_nth_data (bar->priv->attachments, num));
-
- if (g_slist_find (attachment_list, attachment) == NULL) {
- attachment_list = g_slist_prepend (attachment_list, attachment);
- }
- }
-
- for (l = attachment_list; l != NULL; l = l->next)
- remove_attachment (bar, CAL_ATTACHMENT (l->data));
-
- g_slist_free (attachment_list);
-
- update (bar);
-
- left = gnome_icon_list_get_num_icons (icon_list);
- num = num - dlen + 1;
- if (left > 0)
- gnome_icon_list_focus_icon (icon_list, left > num ? num : left - 1);
-}
-
-static void
-edit_selected (CalAttachmentBar *bar)
-{
- GnomeIconList *icon_list;
- GList *selection;
- GSList *attach;
- int num;
-
- icon_list = GNOME_ICON_LIST (bar);
-
- selection = gnome_icon_list_get_selection (icon_list);
- if (selection) {
- num = GPOINTER_TO_INT (selection->data);
- attach = g_slist_nth (bar->priv->attachments, num);
- if (attach)
- cal_attachment_edit ((CalAttachment *)attach->data, GTK_WIDGET (bar));
- }
-}
-
-/* "Attach" dialog. */
-
-static void
-add_from_user (CalAttachmentBar *bar)
-{
- CompEditor *editor;
- GPtrArray *file_list;
- gboolean is_inline = FALSE;
- int i;
-
- editor = COMP_EDITOR (gtk_widget_get_toplevel (GTK_WIDGET (bar)));
-
-
- file_list = comp_editor_select_file_attachments (editor, &is_inline);
- /*TODO add a good implementation here */
- if (!file_list)
- return;
-
- for (i = 0; i < file_list->len; i++) {
- add_from_file (bar, file_list->pdata[i], is_inline ? "inline" : "attachment");
- g_free (file_list->pdata[i]);
- }
-
- g_ptr_array_free (file_list, TRUE);
-}
-
-/* Callbacks. */
-
-static void
-cab_add(EPopup *ep, EPopupItem *item, void *data)
-{
- CalAttachmentBar *bar = data;
-
- add_from_user(bar);
-}
-
-static void
-cab_properties(EPopup *ep, EPopupItem *item, void *data)
-{
- CalAttachmentBar *bar = data;
-
- edit_selected(bar);
-}
-
-static void
-cab_remove(EPopup *ep, EPopupItem *item, void *data)
-{
- CalAttachmentBar *bar = data;
-
- remove_selected(bar);
-}
-
-/* Popup menu handling. */
-static EPopupItem cab_popups[] = {
- { E_POPUP_ITEM, "10.attach", N_("_Remove"), cab_remove, NULL, GTK_STOCK_REMOVE, EM_POPUP_ATTACHMENTS_MANY },
- { E_POPUP_ITEM, "20.attach", N_("_Properties"), cab_properties, NULL, GTK_STOCK_PROPERTIES, EM_POPUP_ATTACHMENTS_ONE },
- { E_POPUP_BAR, "30.attach.00", NULL, NULL, NULL, NULL, EM_POPUP_ATTACHMENTS_MANY|EM_POPUP_ATTACHMENTS_ONE },
- { E_POPUP_ITEM, "30.attach.01", N_("_Add attachment..."), cab_add, NULL, GTK_STOCK_ADD, 0 },
-};
-
-static void
-cab_popup_position(GtkMenu *menu, int *x, int *y, gboolean *push_in, gpointer user_data)
-{
- CalAttachmentBar *bar = user_data;
- GnomeIconList *icon_list = user_data;
- GList *selection;
- GnomeCanvasPixbuf *image;
-
- gdk_window_get_origin (((GtkWidget*) bar)->window, x, y);
-
- selection = gnome_icon_list_get_selection (icon_list);
- if (selection == NULL)
- return;
-
- image = gnome_icon_list_get_icon_pixbuf_item (icon_list, (gint)selection->data);
- if (image == NULL)
- return;
-
- /* Put menu to the center of icon. */
- *x += (int)(image->item.x1 + image->item.x2) / 2;
- *y += (int)(image->item.y1 + image->item.y2) / 2;
-}
-
-static void
-cab_popups_free(EPopup *ep, GSList *l, void *data)
-{
- g_slist_free(l);
-}
-
-/* if id != -1, then use it as an index for target of the popup */
-static void
-cab_popup(CalAttachmentBar *bar, GdkEventButton *event, int id)
-{
- GList *p;
- GSList *attachments = NULL, *menus = NULL;
- int i;
- EMPopup *emp;
- EMPopupTargetAttachments *t;
- GtkMenu *menu;
- CalAttachment *attachment;
-
- if (id == -1
- || (attachment = g_slist_nth_data(bar->priv->attachments, id)) == NULL) {
- p = gnome_icon_list_get_selection((GnomeIconList *)bar);
- for ( ; p != NULL; p = p->next) {
- int num = GPOINTER_TO_INT(p->data);
- CalAttachment *attachment = g_slist_nth_data(bar->priv->attachments, num);
-
- if (attachment && g_slist_find(attachments, attachment) == NULL) {
- g_object_ref(attachment);
- attachments = g_slist_prepend(attachments, attachment);
- }
- }
- attachments = g_slist_reverse(attachments);
- } else {
- g_object_ref(attachment);
- attachments = g_slist_prepend(attachments, attachment);
- }
-
- for (i=0;i<sizeof(cab_popups)/sizeof(cab_popups[0]);i++)
- menus = g_slist_prepend(menus, &cab_popups[i]);
-
- /** @HookPoint-EMPopup: Composer Attachment Bar Context Menu
- * @Id: org.gnome.evolution.mail.composer.attachmentbar.popup
- * @Class: org.gnome.evolution.mail.popup:1.0
- * @Target: EMPopupTargetAttachments
- *
- * This is the context menu on the composer attachment bar.
- */
- emp = em_popup_new("org.gnome.evolution.mail.composer.attachmentbar.popup");
- e_popup_add_items((EPopup *)emp, menus, NULL, cab_popups_free, bar);
- t = em_popup_target_new_attachments(emp, attachments);
- t->target.widget = (GtkWidget *)bar;
- menu = e_popup_create_menu_once((EPopup *)emp, (EPopupTarget *)t, 0);
-
- if (event == NULL)
- gtk_menu_popup(menu, NULL, NULL, cab_popup_position, bar, 0, gtk_get_current_event_time());
- else
- gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event->button, event->time);
-}
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- CalAttachmentBar *bar;
-
- bar = CAL_ATTACHMENT_BAR (object);
-
- if (bar->priv) {
- free_attachment_list (bar);
- if (bar->priv->local_attachment_store)
- g_free (bar->priv->local_attachment_store);
- if (bar->priv->comp_uid)
- g_free (bar->priv->comp_uid);
- g_free (bar->priv);
- bar->priv = NULL;
- }
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy != NULL)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-/* GtkWidget methods. */
-
-static gboolean
-popup_menu_event (GtkWidget *widget)
-{
- cab_popup((CalAttachmentBar *)widget, NULL, -1);
- return TRUE;
-}
-
-
-static int
-button_press_event (GtkWidget *widget, GdkEventButton *event)
-{
- CalAttachmentBar *bar = (CalAttachmentBar *)widget;
- GnomeIconList *icon_list = GNOME_ICON_LIST(widget);
- int icon_number;
-
- if (event->button != 3)
- return GTK_WIDGET_CLASS (parent_class)->button_press_event (widget, event);
-
- icon_number = gnome_icon_list_get_icon_at (icon_list, event->x, event->y);
- if (icon_number >= 0) {
- gnome_icon_list_unselect_all(icon_list);
- gnome_icon_list_select_icon (icon_list, icon_number);
- }
-
- cab_popup(bar, event, icon_number);
-
- return TRUE;
-}
-
-static gint
-key_press_event(GtkWidget *widget, GdkEventKey *event)
-{
- CalAttachmentBar *bar = CAL_ATTACHMENT_BAR (widget);
-
- if (event->keyval == GDK_Delete) {
- remove_selected (bar);
- return TRUE;
- }
-
- return GTK_WIDGET_CLASS (parent_class)->key_press_event (widget, event);
-}
-
-/* Initialization. */
-
-static void
-class_init (CalAttachmentBarClass *klass)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- GnomeIconListClass *icon_list_class;
-
- object_class = GTK_OBJECT_CLASS (klass);
- widget_class = GTK_WIDGET_CLASS (klass);
- icon_list_class = GNOME_ICON_LIST_CLASS (klass);
-
- parent_class = g_type_class_ref (gnome_icon_list_get_type ());
-
- object_class->destroy = destroy;
-
- widget_class->button_press_event = button_press_event;
- widget_class->popup_menu = popup_menu_event;
- widget_class->key_press_event = key_press_event;
-
- /* Setup signals. */
-
- signals[CHANGED] =
- g_signal_new ("changed",
- E_TYPE_CAL_ATTACHMENT_BAR,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (CalAttachmentBarClass, changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-}
-
-static void
-init (CalAttachmentBar *bar)
-{
- CalAttachmentBarPrivate *priv;
-
- priv = g_new (CalAttachmentBarPrivate, 1);
-
- priv->attachments = NULL;
- priv->num_attachments = 0;
- priv->local_attachment_store = NULL;
- priv->comp_uid = NULL;
-
- bar->priv = priv;
-}
-
-GType
-cal_attachment_bar_get_type (void)
-{
- static GType type = 0;
-
- if (type == 0) {
- static const GTypeInfo info = {
- sizeof (CalAttachmentBarClass),
- NULL, NULL,
- (GClassInitFunc) class_init,
- NULL, NULL,
- sizeof (CalAttachmentBar),
- 0,
- (GInstanceInitFunc) init,
- };
-
- type = g_type_register_static (GNOME_TYPE_ICON_LIST, "CalAttachmentBar", &info, 0);
- }
-
- return type;
-}
-
-GtkWidget *
-cal_attachment_bar_new (GtkAdjustment *adj)
-{
- CalAttachmentBar *new;
- GnomeIconList *icon_list;
- int width, height, icon_width, window_height;
- PangoFontMetrics *metrics;
- PangoContext *context;
-
- new = g_object_new (cal_attachment_bar_get_type (), NULL);
-
- icon_list = GNOME_ICON_LIST (new);
-
- context = gtk_widget_get_pango_context ((GtkWidget *) new);
- metrics = pango_context_get_metrics (context, ((GtkWidget *) new)->style->font_desc, pango_context_get_language (context));
- width = PANGO_PIXELS (pango_font_metrics_get_approximate_char_width (metrics)) * 15;
- /* This should be *2, but the icon list creates too much space above ... */
- height = PANGO_PIXELS (pango_font_metrics_get_ascent (metrics) + pango_font_metrics_get_descent (metrics)) * 3;
- pango_font_metrics_unref (metrics);
-
- icon_width = ICON_WIDTH + ICON_SPACING + ICON_BORDER + ICON_TEXT_SPACING;
- icon_width = MAX (icon_width, width);
-
- gnome_icon_list_construct (icon_list, icon_width, adj, 0);
-
- window_height = ICON_WIDTH + ICON_SPACING + ICON_BORDER + ICON_TEXT_SPACING + height;
- gtk_widget_set_size_request (GTK_WIDGET (new), icon_width * 4, window_height);
-
- gnome_icon_list_set_separators (icon_list, ICON_SEPARATORS);
- gnome_icon_list_set_row_spacing (icon_list, ICON_ROW_SPACING);
- gnome_icon_list_set_col_spacing (icon_list, ICON_COL_SPACING);
- gnome_icon_list_set_icon_border (icon_list, ICON_BORDER);
- gnome_icon_list_set_text_spacing (icon_list, ICON_TEXT_SPACING);
- gnome_icon_list_set_selection_mode (icon_list, GTK_SELECTION_MULTIPLE);
-
- return GTK_WIDGET (new);
-}
-
-static char *
-get_default_charset (void)
-{
- GConfClient *gconf;
- const char *locale;
- char *charset;
-
- gconf = gconf_client_get_default ();
- charset = gconf_client_get_string (gconf, "/apps/evolution/mail/composer/charset", NULL);
-
- if (!charset || charset[0] == '\0') {
- g_free (charset);
- charset = gconf_client_get_string (gconf, "/apps/evolution/mail/format/charset", NULL);
- if (charset && charset[0] == '\0') {
- g_free (charset);
- charset = NULL;
- }
- }
-
- g_object_unref (gconf);
-
- if (!charset && (locale = e_iconv_locale_charset ()))
- charset = g_strdup (locale);
-
- return charset ? charset : g_strdup ("us-ascii");
-}
-
-void
-cal_attachment_bar_set_local_attachment_store (CalAttachmentBar *bar,
- const char *attachment_store)
-{
- if (bar->priv->local_attachment_store)
- g_free (bar->priv->local_attachment_store);
- bar->priv->local_attachment_store =
- g_strconcat (attachment_store, "/", NULL);
-}
-
-void
-cal_attachment_bar_set_comp_uid (CalAttachmentBar *bar, char *comp_uid)
-{
- if (bar->priv->comp_uid)
- g_free (bar->priv->comp_uid);
- bar->priv->comp_uid = comp_uid;
-}
-
-guint
-cal_attachment_bar_get_num_attachments (CalAttachmentBar *bar)
-{
- g_return_val_if_fail (bar != NULL, 0);
- g_return_val_if_fail (E_IS_CAL_ATTACHMENT_BAR (bar), 0);
-
- return bar->priv->num_attachments;
-}
-
-void
-cal_attachment_bar_attach (CalAttachmentBar *bar,
- const gchar *file_name)
-{
- g_return_if_fail (E_IS_CAL_ATTACHMENT_BAR (bar));
-
- if (file_name == NULL)
- add_from_user (bar);
- else
- add_from_file (bar, file_name, "attachment");
-}
-
-/*
- * TODO write a good documentation
- * this method serializes the attached files on the filesystem
- * and sets the urls to the component
- */
-GSList *
-cal_attachment_bar_get_attachment_list (CalAttachmentBar *bar)
-{
- CalAttachmentBarPrivate *priv;
- CalAttachment *attachment;
- GSList *list = NULL, *p;
-
- priv = bar->priv;
- for (p = priv->attachments; p != NULL; p = p->next) {
- CamelDataWrapper *wrapper;
- CamelStreamMem *mstream;
- unsigned char *buffer = NULL;
- int fd;
- char *attach_file_url;
-
- attachment = p->data;
- wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (attachment->body));
- mstream = (CamelStreamMem *) camel_stream_mem_new ();
-
- camel_data_wrapper_decode_to_stream (wrapper, (CamelStream *) mstream);
- buffer = g_memdup (mstream->buffer->data, mstream->buffer->len);
-
-
- /* Extract the content from the stream and write it down
- * as a mime part file into the directory denoting the
- * calendar source */
- attach_file_url = g_strconcat (priv->local_attachment_store,
- priv->comp_uid, "-",
- camel_file_util_safe_filename
- (camel_mime_part_get_filename (attachment->body)), NULL);
-
- fd = open (attach_file_url+7, O_RDWR|O_CREAT|O_TRUNC, 0600);
- if (fd == -1) {
- /* TODO handle error conditions */
- g_message ("DEBUG: could not open the file descriptor\n");
- continue;
- }
-
- /* write the camel mime part (attachment->body) into the file*/
- if (camel_write (fd, buffer, mstream->buffer->len) == -1) {
- /* TODO handle error condition */
- g_message ("DEBUG: camel write failed.\n");
- continue;
- }
- list = g_slist_append (list, g_strdup (attach_file_url));
- /* do i need to close the fd */
- g_free (attach_file_url);
- }
-
- return list;
-}
-
-char *
-cal_attachment_bar_get_nth_attachment_filename (CalAttachmentBar *bar, int n)
-{
- CalAttachment *attach;
-
- g_return_val_if_fail (bar != NULL, 0);
- g_return_val_if_fail (E_IS_CAL_ATTACHMENT_BAR (bar), 0);
-
- attach = g_slist_nth_data (bar->priv->attachments, n);
- return g_strconcat (bar->priv->local_attachment_store, bar->priv->comp_uid, "-", camel_mime_part_get_filename
- (attach->body), NULL);
-}
-
-/* TODO (sigh) this loads the attachments
- * from the file system just for displaying the iconlist
- * need a better approach here.
- */
-void
-cal_attachment_bar_set_attachment_list (CalAttachmentBar *bar, GSList *attach_list)
-{
- CalAttachmentBarPrivate *priv;
- GSList *p;
-
- priv = bar->priv;
-
- if (priv->attachments) {
- /* To prevent repopulating the
- * bar due to redraw functions in fill_widget.
- * Assumes it can be set only once.
- */
- return;
- }
-
- for (p = attach_list; p != NULL; p = p->next) {
- char *attach_filename;
- CalAttachment *attach;
-
- attach_filename = (char *) p->data;
- /* should we assert if g_str_has_prefix (attach_filename, "file://"))
- * here
- */
- /* get url sans protocol and add it to the bar.
- * how to set the filename properly */
- cal_attachment_bar_attach (bar, attach_filename +7);
- /* set file name correctly on the display */
- attach = g_slist_nth_data (priv->attachments,
- priv->num_attachments-1);
- if (attach) {
- camel_mime_part_set_filename (attach->body,
- attach_filename + strlen (priv->local_attachment_store)+
- strlen (priv->comp_uid) + 1);
- update (bar);
- }
- }
-}
-
-GSList *
-cal_attachment_bar_get_mime_attach_list (CalAttachmentBar *bar)
-{
- CalAttachmentBarPrivate *priv;
- struct CalMimeAttach *cal_mime_attach;
- GSList *attach_list = NULL, *l;
-
- /* TODO assert sanity of bar */
- priv = bar->priv;
- for (l = priv->attachments; l ; l = l->next) {
-
- CalAttachment *attach = (CalAttachment *) l->data;
- CamelDataWrapper *wrapper;
- CamelStreamMem *mstream;
- unsigned char *buffer = NULL;
- char *desc;
-
- cal_mime_attach = g_malloc0 (sizeof (struct CalMimeAttach));
- wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (attach->body));
- mstream = (CamelStreamMem *) camel_stream_mem_new ();
-
- camel_data_wrapper_decode_to_stream (wrapper, (CamelStream *) mstream);
- buffer = g_memdup (mstream->buffer->data, mstream->buffer->len);
-
- cal_mime_attach->encoded_data = buffer;
- cal_mime_attach->length = mstream->buffer->len;
- cal_mime_attach->filename = g_strdup (camel_mime_part_get_filename
- ((CamelMimePart *) attach->body));
- desc = camel_mime_part_get_description ((CamelMimePart *) attach->body);
- if (!desc || *desc == '\0')
- desc = _("attachment");
- cal_mime_attach->description = g_strdup (desc);
- cal_mime_attach->content_type = g_strdup (camel_data_wrapper_get_mime_type (wrapper));
-
- attach_list = g_slist_append (attach_list, cal_mime_attach);
-
- }
-
- return attach_list;
-}
diff --git a/calendar/gui/dialogs/cal-attachment-bar.h b/calendar/gui/dialogs/cal-attachment-bar.h
deleted file mode 100644
index 468bae0495..0000000000
--- a/calendar/gui/dialogs/cal-attachment-bar.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* msg-composer-attachment-bar.h
- *
- * Copyright (C) 2004 Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * published by the Free Software Foundation; either version 2 of the
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Harish Krishnaswamy <kharish@novell.com>
- */
-
-#ifndef __CAL_ATTACHMENT_BAR_H__
-#define __CAL_ATTACHMENT_BAR_H__
-
-#include <libgnomeui/gnome-icon-list.h>
-#include <camel/camel-multipart.h>
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_CAL_ATTACHMENT_BAR \
- (cal_attachment_bar_get_type ())
-#define CAL_ATTACHMENT_BAR(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CAL_ATTACHMENT_BAR, CalAttachmentBar))
-#define CAL_ATTACHMENT_BAR_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CAL_ATTACHMENT_BAR, CalAttachmentBarClass))
-#define E_IS_CAL_ATTACHMENT_BAR(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CAL_ATTACHMENT_BAR))
-#define E_IS_CAL_ATTACHMENT_BAR_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_CAL_ATTACHMENT_BAR))
-
-typedef struct _CalAttachmentBar CalAttachmentBar;
-typedef struct _CalAttachmentBarClass CalAttachmentBarClass;
-typedef struct _CalAttachmentBarPrivate CalAttachmentBarPrivate;
-
-struct _CalAttachmentBar {
- GnomeIconList parent;
-
- CalAttachmentBarPrivate *priv;
-};
-
-struct _CalAttachmentBarClass {
- GnomeIconListClass parent_class;
-
- void (* changed) (CalAttachmentBar *bar);
-};
-
-
-GtkType cal_attachment_bar_get_type (void);
-
-GtkWidget *cal_attachment_bar_new (GtkAdjustment *adj);
-void cal_attachment_bar_to_multipart (CalAttachmentBar *bar, CamelMultipart *multipart,
- const char *default_charset);
-guint cal_attachment_bar_get_num_attachments (CalAttachmentBar *bar);
-void cal_attachment_bar_attach (CalAttachmentBar *bar, const char *file_name);
-void cal_attachment_bar_attach_mime_part (CalAttachmentBar *bar, CamelMimePart *part);
-GSList *cal_attachment_bar_get_attachment_list (CalAttachmentBar *bar);
-char * cal_attachment_bar_get_nth_attachment_filename (CalAttachmentBar *bar, int n);
-GSList *cal_attachment_bar_get_mime_attach_list (CalAttachmentBar *bar);
-void cal_attachment_bar_set_attachment_list (CalAttachmentBar *bar, GSList *attach_list);
-void cal_attachment_bar_set_local_attachment_store (CalAttachmentBar *bar,
- const char *attachment_store);
-void cal_attachment_bar_set_comp_uid (CalAttachmentBar *bar, char *comp_uid);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __CAL_ATTACHMENT_BAR_H__ */
diff --git a/calendar/gui/dialogs/cal-attachment-select-file.c b/calendar/gui/dialogs/cal-attachment-select-file.c
deleted file mode 100644
index 6e64ea09c7..0000000000
--- a/calendar/gui/dialogs/cal-attachment-select-file.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/*
- * Authors: Harish Krishnaswamy <kharish@novell.com>
- *
- * Copyright 2004 Novell, Inc. (www.novell.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-/* Much of this file has been shamelessly copied from the mail attachment
- * handling code, including the fixmes. Modifications/Additions that are
- * specific to the calendar component have been flagged by some comments
- * fwiw */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkbox.h>
-#include <gtk/gtkcheckbutton.h>
-#include <gtk/gtkmain.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkversion.h>
-
-#ifdef USE_GTKFILECHOOSER
-#include <gtk/gtkfilechooser.h>
-#include <gtk/gtkfilechooserdialog.h>
-#include <gtk/gtkstock.h>
-#else
-#include <gtk/gtkfilesel.h>
-#endif
-
-#include <libgnomeui/gnome-uidefs.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "cal-attachment-select-file.h"
-#include <e-util/e-icon-factory.h>
-
-enum {
- SELECTOR_MODE_MULTI = (1 << 0),
- SELECTOR_MODE_SAVE = (1 << 1)
-};
-
-static GtkWidget*
-run_selector(CompEditor *editor, const char *title, guint32 flags, gboolean *showinline_p)
-{
- GtkWidget *selection;
- GtkWidget *showinline = NULL;
- char *path;
- GList *icon_list;
-
- path = g_object_get_data ((GObject *) editor, "attach_path");
-
-#ifdef USE_GTKFILECHOOSER
- if (flags & SELECTOR_MODE_SAVE)
- selection = gtk_file_chooser_dialog_new (title,
- NULL,
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_SAVE, GTK_RESPONSE_OK,
- NULL);
- else
- selection = gtk_file_chooser_dialog_new (title,
- NULL,
- GTK_FILE_CHOOSER_ACTION_OPEN,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OPEN, GTK_RESPONSE_OK,
- NULL);
-
- gtk_dialog_set_default_response (GTK_DIALOG (selection), GTK_RESPONSE_OK);
-
- if ((flags & SELECTOR_MODE_SAVE) == 0)
- gtk_file_chooser_set_select_multiple ((GtkFileChooser *) selection, (flags & SELECTOR_MODE_MULTI));
-
- /* restore last path used */
- if (!path)
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (selection), g_get_home_dir ());
- else
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (selection), path);
-
- if (showinline_p) {
- showinline = gtk_check_button_new_with_label (_("Suggest automatic display of attachment"));
- gtk_widget_show (showinline);
- gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (selection), showinline);
- }
-#else
- selection = gtk_file_selection_new (title);
-
- gtk_file_selection_set_select_multiple ((GtkFileSelection *) selection, (flags & SELECTOR_MODE_MULTI));
-
- /* restore last path used */
- if (!path) {
- path = g_strdup_printf ("%s/", g_get_home_dir ());
- gtk_file_selection_set_filename (GTK_FILE_SELECTION (selection), path);
- g_free (path);
- } else {
- gtk_file_selection_set_filename (GTK_FILE_SELECTION (selection), path);
- }
-
- if (showinline_p) {
- showinline = gtk_check_button_new_with_label (_("Suggest automatic display of attachment"));
- gtk_widget_show (showinline);
- gtk_box_pack_end (GTK_BOX (GTK_FILE_SELECTION (selection)->main_vbox), showinline, FALSE, FALSE, 4);
- }
-#endif
-
- gtk_window_set_transient_for ((GtkWindow *) selection, (GtkWindow *) editor);
- gtk_window_set_wmclass ((GtkWindow *) selection, "fileselection", "Evolution:editor");
- gtk_window_set_modal ((GtkWindow *) selection, TRUE);
-
- icon_list = e_icon_factory_get_icon_list ("stock_mail-compose");
- if (icon_list) {
- gtk_window_set_icon_list (GTK_WINDOW (selection), icon_list);
- g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
- g_list_free (icon_list);
- }
-
- if (gtk_dialog_run ((GtkDialog *) selection) == GTK_RESPONSE_OK) {
- if (showinline_p)
- *showinline_p = gtk_toggle_button_get_active ((GtkToggleButton *) showinline);
-
-#ifdef USE_GTKFILECHOOSER
- path = g_path_get_dirname (gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (selection)));
-#else
- path = g_path_get_dirname (gtk_file_selection_get_filename (GTK_FILE_SELECTION (selection)));
-#endif
-
- g_object_set_data_full ((GObject *) editor, "attach_path", g_strdup_printf ("%s/", path), g_free);
- g_free (path);
- } else {
- gtk_widget_destroy (selection);
- selection = NULL;
- }
-
- return selection;
-}
-
-/**
- * comp_editor_select_file:
- * @editor: a editor
- * @title: the title for the file selection dialog box
- * @save_mode: whether the file selection box should be shown in save mode or not
- *
- * This pops up a file selection dialog box with the given title
- * and allows the user to select a file.
- *
- * Return value: the selected filename, or %NULL if the user
- * cancelled.
- **/
-char *
-comp_editor_select_file (CompEditor *editor, const char *title, gboolean save_mode)
-{
- guint32 flags = save_mode ? SELECTOR_MODE_SAVE : SELECTOR_MODE_MULTI;
- GtkWidget *selection;
- char *name = NULL;
-
- selection = run_selector (editor, title, flags, NULL);
- if (selection) {
-#ifdef USE_GTKFILECHOOSER
- name = g_strdup (gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (selection)));
-#else
- name = g_strdup (gtk_file_selection_get_filename (GTK_FILE_SELECTION (selection)));
-#endif
- gtk_widget_destroy (selection);
- }
-
- return name;
-}
-
-GPtrArray *
-comp_editor_select_file_attachments (CompEditor *editor, gboolean *showinline_p)
-{
- GtkWidget *selection;
- GPtrArray *list = NULL;
-
- selection = run_selector (editor, _("Attach file(s)"), SELECTOR_MODE_MULTI, showinline_p);
-
- if (selection) {
-#ifdef USE_GTKFILECHOOSER
- GSList *files, *l, *n;
-
- if ((l = files = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER (selection)))) {
- list = g_ptr_array_new ();
-
- while (l) {
- n = l->next;
- g_ptr_array_add (list, l->data);
- g_slist_free_1 (l);
- l = n;
- }
- }
-#else
- char **files;
- int i;
-
- if ((files = gtk_file_selection_get_selections (GTK_FILE_SELECTION (selection)))) {
- list = g_ptr_array_new ();
- for (i = 0; files[i]; i++)
- g_ptr_array_add (list, files[i]);
-
- g_free (files);
- }
-#endif
-
- gtk_widget_destroy (selection);
- }
-
- return list;
-}
-
diff --git a/calendar/gui/dialogs/cal-attachment-select-file.h b/calendar/gui/dialogs/cal-attachment-select-file.h
deleted file mode 100644
index 99b113783a..0000000000
--- a/calendar/gui/dialogs/cal-attachment-select-file.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* cal-attachment-select-file.c
- *
- * Copyright (C) 2004 Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * published by the Free Software Foundation; either version 2 of the
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Harish K <kharish@novell.com>
- */
-
-#ifndef E_MSG_COMPOSER_SELECT_FILE_H
-#define E_MSG_COMPOSER_SELECT_FILE_H
-
-#include "comp-editor.h"
-
-char *comp_editor_select_file (CompEditor *editor,
- const char *title,
- gboolean save_mode);
-
-GPtrArray *comp_editor_select_file_attachments (CompEditor *editor,
- gboolean *inline_p);
-
-#endif /* CAL_ATTACHMENT_SELECT_FILE_H */
diff --git a/calendar/gui/dialogs/cal-attachment.c b/calendar/gui/dialogs/cal-attachment.c
deleted file mode 100644
index 2f36aaf887..0000000000
--- a/calendar/gui/dialogs/cal-attachment.c
+++ /dev/null
@@ -1,486 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/*
- * Authors: Harish Krishnaswamy <kharish@novell.com>
- * Copyright 2004 Novell Inc. <www.novell.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-/* Much of this file has been shamelessly copied from the mail attachment
- * handling code, including the fixmes. Modifications/Additions that are
- * specific to the calendar component have been flagged by some comments
- * fwiw */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <sys/stat.h>
-#include <string.h>
-#include <errno.h>
-
-#include <gtk/gtknotebook.h>
-#include <gtk/gtktogglebutton.h>
-#include <gtk/gtkdialog.h>
-#include <libgnomevfs/gnome-vfs.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "e-util/e-mktemp.h"
-#include <camel/camel.h>
-
-#include "comp-editor.h"
-#include "cal-attachment.h"
-
-
-enum {
- CHANGED,
- LAST_SIGNAL
-};
-static guint signals[LAST_SIGNAL] = { 0 };
-
-static GObjectClass *parent_class = NULL;
-
-
-static void
-changed (CalAttachment *attachment)
-{
- g_signal_emit (attachment, signals[CHANGED], 0);
-}
-
-
-/* GtkObject methods. */
-
-static void
-finalise(GObject *object)
-{
- CalAttachment *attachment;
-
- attachment = CAL_ATTACHMENT (object);
-
- camel_object_unref (attachment->body);
- if (attachment->pixbuf_cache != NULL)
- g_object_unref (attachment->pixbuf_cache);
-
- G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-
-/* Signals. */
-
-static void
-real_changed (CalAttachment *cal_attachment)
-{
- g_return_if_fail (E_IS_CAL_ATTACHMENT (cal_attachment));
-}
-
-
-static void
-class_init (CalAttachmentClass *klass)
-{
- GObjectClass *object_class;
-
- object_class = (GObjectClass*) klass;
- parent_class = g_type_class_ref (G_TYPE_OBJECT);
-
- object_class->finalize = finalise;
- klass->changed = real_changed;
-
- signals[CHANGED] = g_signal_new ("changed",
- E_TYPE_CAL_ATTACHMENT,
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (CalAttachmentClass, changed),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-}
-
-static void
-init (CalAttachment *cal_attachment)
-{
- cal_attachment->editor_gui = NULL;
- cal_attachment->body = NULL;
- cal_attachment->size = 0;
- cal_attachment->pixbuf_cache = NULL;
-}
-
-GType
-cal_attachment_get_type (void)
-{
- static GType type = 0;
-
- if (type == 0) {
- static const GTypeInfo info = {
- sizeof (CalAttachmentClass),
- NULL,
- NULL,
- (GClassInitFunc) class_init,
- NULL,
- NULL,
- sizeof (CalAttachment),
- 0,
- (GInstanceInitFunc) init,
- };
-
- type = g_type_register_static (G_TYPE_OBJECT, "CalAttachment", &info, 0);
- }
-
- return type;
-}
-
-/**
- * cal_attachment_guess_mime_type:
- * @file_name: filename
- * Returns the guessed mime type of the file given by #file_name
- **/
-
-static char *
-cal_attachment_guess_mime_type (const char *file_name)
-{
- GnomeVFSFileInfo *info;
- GnomeVFSResult result;
- char *type = NULL;
-
- info = gnome_vfs_file_info_new ();
- result = gnome_vfs_get_file_info (file_name, info,
- GNOME_VFS_FILE_INFO_GET_MIME_TYPE |
- GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE |
- GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
- if (result == GNOME_VFS_OK)
- type = g_strdup (gnome_vfs_file_info_get_mime_type (info));
-
- gnome_vfs_file_info_unref (info);
-
- return type;
-}
-
-
-/**
- * cal_attachment_new:
- * @file_name: filename to attach
- * @disposition: Content-Disposition of the attachment
- * @ex: exception
- *
- * Return value: the new attachment, or %NULL on error
- **/
-CalAttachment *
-cal_attachment_new (const char *file_name,
- const char *disposition,
- CamelException *ex)
-{
- CalAttachment *new;
- CamelMimePart *part;
- CamelDataWrapper *wrapper;
- CamelStream *stream;
- struct stat statbuf;
- char *mime_type;
- char *filename;
-
- g_return_val_if_fail (file_name != NULL, NULL);
-
- if (stat (file_name, &statbuf) < 0) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Cannot attach file %s: %s"),
- file_name, g_strerror (errno));
- return NULL;
- }
-
- /* return if it's not a regular file */
- if (!S_ISREG (statbuf.st_mode)) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Cannot attach file %s: not a regular file"),
- file_name);
- return NULL;
- }
-
- stream = camel_stream_fs_new_with_name (file_name, O_RDONLY, 0);
- if (!stream) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Cannot attach file %s: %s"),
- file_name, g_strerror (errno));
- return NULL;
- }
-
- mime_type = cal_attachment_guess_mime_type (file_name);
- if (mime_type) {
- if (!g_ascii_strcasecmp (mime_type, "message/rfc822")) {
- wrapper = (CamelDataWrapper *) camel_mime_message_new ();
- } else {
- wrapper = camel_data_wrapper_new ();
- }
-
- camel_data_wrapper_construct_from_stream (wrapper, stream);
- camel_data_wrapper_set_mime_type (wrapper, mime_type);
- g_free (mime_type);
- } else {
- wrapper = camel_data_wrapper_new ();
- camel_data_wrapper_construct_from_stream (wrapper, stream);
- camel_data_wrapper_set_mime_type (wrapper, "application/octet-stream");
- }
-
- camel_object_unref (stream);
-
- part = camel_mime_part_new ();
- camel_medium_set_content_object (CAMEL_MEDIUM (part), wrapper);
- camel_object_unref (wrapper);
-
- camel_mime_part_set_disposition (part, disposition);
- filename = g_path_get_basename (file_name);
- camel_mime_part_set_filename (part, filename);
- g_free (filename);
-
-#if 0
- /* Note: Outlook 2002 is broken with respect to Content-Ids on
- non-multipart/related parts, so as an interoperability
- workaround, don't set a Content-Id on these parts. Fixes
- bug #10032 */
- /* set the Content-Id */
- content_id = camel_header_msgid_generate ();
- camel_mime_part_set_content_id (part, content_id);
- g_free (content_id);
-#endif
-
- new = g_object_new (E_TYPE_CAL_ATTACHMENT, NULL);
- new->editor_gui = NULL;
- new->body = part;
- new->size = statbuf.st_size;
- new->guessed_type = TRUE;
-
- return new;
-}
-
-
-/**
- * cal_attachment_new_from_mime_part:
- * @part: a CamelMimePart
- *
- * Return value: a new CalAttachment based on the mime part
- **/
-CalAttachment *
-cal_attachment_new_from_mime_part (CamelMimePart *part)
-{
- CalAttachment *new;
- CamelMimePart *mime_part;
- CamelStream *stream;
-
- g_return_val_if_fail (CAMEL_IS_MIME_PART (part), NULL);
-
- stream = camel_stream_mem_new ();
- if (camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (part), stream) == -1) {
- camel_object_unref (stream);
- return NULL;
- }
-
- camel_stream_reset (stream);
- mime_part = camel_mime_part_new ();
-
- if (camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (mime_part), stream) == -1) {
- camel_object_unref (mime_part);
- camel_object_unref (stream);
- return NULL;
- }
-
- camel_object_unref (stream);
-
- new = g_object_new (E_TYPE_CAL_ATTACHMENT, NULL);
- new->editor_gui = NULL;
- new->body = mime_part;
- new->guessed_type = FALSE;
- new->size = 0;
-
- return new;
-}
-
-
-/* The attachment property dialog. */
-
-typedef struct {
- GtkWidget *dialog;
- GtkEntry *file_name_entry;
- GtkEntry *description_entry;
- GtkEntry *mime_type_entry;
- GtkToggleButton *disposition_checkbox;
- CalAttachment *attachment;
-} DialogData;
-
-static void
-destroy_dialog_data (DialogData *data)
-{
- g_free (data);
-}
-
-/*
- * fixme: I am converting EVERYTHING to/from UTF-8, although mime types
- * are in ASCII. This is not strictly necessary, but we want to be
- * consistent and possibly check for errors somewhere.
- */
-
-static void
-set_entry (GladeXML *xml, const char *widget_name, const char *value)
-{
- GtkEntry *entry;
-
- entry = GTK_ENTRY (glade_xml_get_widget (xml, widget_name));
- if (entry == NULL)
- g_warning ("Entry for `%s' not found.", widget_name);
- else
- gtk_entry_set_text (entry, value ? value : "");
-}
-
-static void
-connect_widget (GladeXML *gui, const char *name, const char *signal_name,
- GCallback func, gpointer data)
-{
- GtkWidget *widget;
-
- widget = glade_xml_get_widget (gui, name);
- g_signal_connect (widget, signal_name, func, data);
-}
-
-static void
-close_cb (GtkWidget *widget, gpointer data)
-{
- CalAttachment *attachment;
- DialogData *dialog_data;
-
- dialog_data = (DialogData *) data;
- attachment = dialog_data->attachment;
-
- gtk_widget_destroy (dialog_data->dialog);
- g_object_unref (attachment->editor_gui);
- attachment->editor_gui = NULL;
-
- g_object_unref (attachment);
-
- destroy_dialog_data (dialog_data);
-}
-
-static void
-ok_cb (GtkWidget *widget, gpointer data)
-{
- DialogData *dialog_data;
- CalAttachment *attachment;
- const char *str;
-
- dialog_data = (DialogData *) data;
- attachment = dialog_data->attachment;
-
- str = gtk_entry_get_text (dialog_data->file_name_entry);
- camel_mime_part_set_filename (attachment->body, str);
-
- str = gtk_entry_get_text (dialog_data->description_entry);
- camel_mime_part_set_description (attachment->body, str);
-
- str = gtk_entry_get_text (dialog_data->mime_type_entry);
- camel_mime_part_set_content_type (attachment->body, str);
-
- camel_data_wrapper_set_mime_type(camel_medium_get_content_object(CAMEL_MEDIUM (attachment->body)), str);
-
- switch (gtk_toggle_button_get_active (dialog_data->disposition_checkbox)) {
- case 0:
- camel_mime_part_set_disposition (attachment->body, "attachment");
- break;
- case 1:
- camel_mime_part_set_disposition (attachment->body, "inline");
- break;
- default:
- /* Hmmmm? */
- break;
- }
-
- changed (attachment);
- close_cb (widget, data);
-}
-
-static void
-response_cb (GtkWidget *widget, gint response, gpointer data)
-{
- if (response == GTK_RESPONSE_OK)
- ok_cb (widget, data);
- else
- close_cb (widget, data);
-}
-
-void
-cal_attachment_edit (CalAttachment *attachment, GtkWidget *parent)
-{
- CamelContentType *content_type;
- const char *disposition;
- DialogData *dialog_data;
- GladeXML *editor_gui;
- char *type;
-
- g_return_if_fail (attachment != NULL);
- g_return_if_fail (E_IS_CAL_ATTACHMENT (attachment));
-
- if (attachment->editor_gui != NULL) {
- GtkWidget *window;
-
- window = glade_xml_get_widget (attachment->editor_gui,
- "dialog");
- gdk_window_show (window->window);
- return;
- }
-
- editor_gui = glade_xml_new (EVOLUTION_GLADEDIR "/cal-attachment.glade",
- NULL, NULL);
- if (editor_gui == NULL) {
- g_warning ("Cannot load `cal-attachment.glade'");
- return;
- }
-
- attachment->editor_gui = editor_gui;
-
- gtk_window_set_transient_for
- (GTK_WINDOW (glade_xml_get_widget (editor_gui, "dialog")),
- GTK_WINDOW (gtk_widget_get_toplevel (parent)));
-
- dialog_data = g_new (DialogData, 1);
- g_object_ref (attachment);
- dialog_data->attachment = attachment;
- dialog_data->dialog = glade_xml_get_widget (editor_gui, "dialog");
- dialog_data->file_name_entry = GTK_ENTRY (
- glade_xml_get_widget (editor_gui, "file_name_entry"));
- dialog_data->description_entry = GTK_ENTRY (
- glade_xml_get_widget (editor_gui, "description_entry"));
- dialog_data->mime_type_entry = GTK_ENTRY (
- glade_xml_get_widget (editor_gui, "mime_type_entry"));
- dialog_data->disposition_checkbox = GTK_TOGGLE_BUTTON (
- glade_xml_get_widget (editor_gui, "disposition_checkbox"));
-
- set_entry (editor_gui, "file_name_entry",
- camel_mime_part_get_filename (attachment->body));
- set_entry (editor_gui, "description_entry",
- camel_mime_part_get_description (attachment->body));
- content_type = camel_mime_part_get_content_type (attachment->body);
- type = camel_content_type_simple (content_type);
- set_entry (editor_gui, "mime_type_entry", type);
- g_free (type);
-
- disposition = camel_mime_part_get_disposition (attachment->body);
- gtk_toggle_button_set_active (dialog_data->disposition_checkbox,
- disposition && !g_ascii_strcasecmp (disposition, "inline"));
-
- connect_widget (editor_gui, "dialog", "response", (GCallback)response_cb, dialog_data);
-#warning "signal connect while alive"
- /* make sure that when the composer gets hidden/closed that our windows also close */
- parent = gtk_widget_get_toplevel (parent);
- gtk_signal_connect_while_alive (GTK_OBJECT (parent), "destroy", (GCallback)close_cb, dialog_data,
- GTK_OBJECT (dialog_data->dialog));
- gtk_signal_connect_while_alive (GTK_OBJECT (parent), "hide", (GCallback)close_cb, dialog_data,
- GTK_OBJECT (dialog_data->dialog));
-}
diff --git a/calendar/gui/dialogs/cal-attachment.glade b/calendar/gui/dialogs/cal-attachment.glade
deleted file mode 100644
index dc228eef70..0000000000
--- a/calendar/gui/dialogs/cal-attachment.glade
+++ /dev/null
@@ -1,237 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkDialog" id="dialog">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="title" translatable="yes">Attachment Properties</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="has_separator">True</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="close_button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="has_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">-6</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="ok_button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">-5</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table1">
- <property name="visible">True</property>
- <property name="n_rows">4</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkEntry" id="description_entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="mime_type_entry">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can_focus">True</property>
- <property name="editable">False</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="mime_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">MIME type:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="description_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Description:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="filename_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">File name:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="file_name_entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="disposition_checkbox">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Suggest automatic display of attachment</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/calendar/gui/dialogs/cal-attachment.h b/calendar/gui/dialogs/cal-attachment.h
deleted file mode 100644
index 842ab2ed4d..0000000000
--- a/calendar/gui/dialogs/cal-attachment.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* cal-attachment.h
- *
- * Copyright (C) 2004 Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * published by the Free Software Foundation; either version 2 of the
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Harish Krishnaswamy
- */
-#ifndef __CAL_ATTACHMENT_H__
-#define __CAL_ATTACHMENT_H__
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <glade/glade-xml.h>
-#include <camel/camel-mime-part.h>
-#include <camel/camel-exception.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_CAL_ATTACHMENT (cal_attachment_get_type ())
-#define CAL_ATTACHMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CAL_ATTACHMENT, CalAttachment))
-#define CAL_ATTACHMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CAL_ATTACHMENT, CalAttachmentClass))
-#define E_IS_CAL_ATTACHMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CAL_ATTACHMENT))
-#define E_IS_CAL_ATTACHMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_CAL_ATTACHMENT))
-
-typedef struct _CalAttachment CalAttachment;
-typedef struct _CalAttachmentClass CalAttachmentClass;
-
-struct _CalAttachment {
- GObject parent;
-
- GladeXML *editor_gui;
-
- CamelMimePart *body;
- gboolean guessed_type;
- gulong size;
-
- GdkPixbuf *pixbuf_cache;
-};
-
-struct _CalAttachmentClass {
- GObjectClass parent_class;
-
- void (*changed) (CalAttachment *cal_attachment);
-};
-
-struct CalMimeAttach {
- char *filename;
- char *content_type;
- char *description;
- char *encoded_data;
- guint length;
-};
-
-GType cal_attachment_get_type (void);
-CalAttachment *cal_attachment_new (const char *file_name, const char *disposition, CamelException *ex);
-CalAttachment *cal_attachment_new_from_mime_part (CamelMimePart *part);
-void cal_attachment_edit (CalAttachment *attachment, GtkWidget *parent);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __CAL_ATTACHMENT_H__ */
diff --git a/calendar/gui/dialogs/cal-prefs-dialog.c b/calendar/gui/dialogs/cal-prefs-dialog.c
deleted file mode 100644
index 750319a001..0000000000
--- a/calendar/gui/dialogs/cal-prefs-dialog.c
+++ /dev/null
@@ -1,1041 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Authors :
- * Damon Chaplin <damon@ximian.com>
- * Ettore Perazzoli <ettore@ximian.com>
- *
- * Copyright 2000, 2001, 2002 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * CalPrefsDialog - a GtkObject which handles a libglade-loaded dialog
- * to edit the calendar preference settings.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "../e-timezone-entry.h"
-#include "cal-prefs-dialog.h"
-#include "../calendar-config.h"
-#include "url-editor-dialog.h"
-
-#include <gtk/gtk.h>
-#include <gtk/gtkmain.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkoptionmenu.h>
-#include <gtk/gtktogglebutton.h>
-#include <libxml/tree.h>
-#include <string.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/gnome-color-picker.h>
-#include <glade/glade.h>
-#include <e-util/e-dialog-widgets.h>
-#include <widgets/misc/e-dateedit.h>
-
-
-static const int week_start_day_map[] = {
- 1, 2, 3, 4, 5, 6, 0, -1
-};
-
-static const int time_division_map[] = {
- 60, 30, 15, 10, 5, -1
-};
-
-/* The following two are kept separate in case we need to re-order each menu individually */
-static const int hide_completed_units_map[] = {
- CAL_MINUTES, CAL_HOURS, CAL_DAYS, -1
-};
-
-static const int default_reminder_units_map[] = {
- CAL_MINUTES, CAL_HOURS, CAL_DAYS, -1
-};
-
-static gboolean get_widgets (DialogData *data);
-
-static void setup_changes (DialogData *data);
-
-static void init_widgets (DialogData *data);
-static void show_config (DialogData *data);
-
-static void config_control_destroy_callback (DialogData *dialog_data, GObject *deadbeef);
-
-static void cal_prefs_dialog_url_add_clicked (GtkWidget *button, DialogData *dialog_data);
-static void cal_prefs_dialog_url_edit_clicked (GtkWidget *button, DialogData *dialog_data);
-static void cal_prefs_dialog_url_remove_clicked (GtkWidget *button, DialogData *dialog_data);
-static void cal_prefs_dialog_url_enable_clicked (GtkWidget *button, DialogData *dialog_data);
-static void cal_prefs_dialog_url_list_change (GtkTreeSelection *selection, DialogData *dialog_data);
-static void cal_prefs_dialog_url_list_enable_toggled (GtkCellRendererToggle *renderer, const char *path_string, DialogData *dialog_data);
-static void cal_prefs_dialog_url_list_double_click(GtkTreeView *treeview,
- GtkTreePath *path,
- GtkTreeViewColumn *column,
- DialogData *dialog_data);
-static void show_fb_config (DialogData *dialog_data);
-
-GtkWidget *cal_prefs_dialog_create_time_edit (void);
-
-#define PREFS_WINDOW(dialog_data) GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (dialog_data), GTK_TYPE_WINDOW))
-
-/**
- * cal_prefs_dialog_new:
- *
- * Creates a new #CalPrefsDialog.
- *
- * Return value: a new #CalPrefsDialog.
- **/
-EvolutionConfigControl *
-cal_prefs_dialog_new (void)
-{
- DialogData *dialog_data;
- EvolutionConfigControl *config_control;
-
- dialog_data = g_new0 (DialogData, 1);
-
- /* Load the content widgets */
-
- dialog_data->xml = glade_xml_new (EVOLUTION_GLADEDIR "/cal-prefs-dialog.glade", NULL, NULL);
- if (!dialog_data->xml) {
- g_message ("cal_prefs_dialog_construct(): Could not load the Glade XML file!");
- return NULL;
- }
-
- if (!get_widgets (dialog_data)) {
- g_message ("cal_prefs_dialog_construct(): Could not find all widgets in the XML file!");
- return NULL;
- }
-
- init_widgets (dialog_data);
- show_config (dialog_data);
-
- gtk_widget_ref (dialog_data->page);
- gtk_container_remove (GTK_CONTAINER (dialog_data->page->parent), dialog_data->page);
- config_control = evolution_config_control_new (dialog_data->page);
- gtk_widget_unref (dialog_data->page);
-
- g_object_weak_ref ((GObject *) config_control, (GWeakNotify) config_control_destroy_callback, dialog_data);
-
- setup_changes (dialog_data);
-
- return config_control;
-}
-
-/* Returns a pointer to a static string with an X color spec for the current
- * value of a color picker.
- */
-static const char *
-spec_from_picker (GtkWidget *picker)
-{
- static char spec[8];
- guint8 r, g, b;
-
- gnome_color_picker_get_i8 (GNOME_COLOR_PICKER (picker), &r, &g, &b, NULL);
- g_snprintf (spec, sizeof (spec), "#%02x%02x%02x", r, g, b);
-
- return spec;
-}
-
-static void
-working_days_changed (GtkWidget *widget, DialogData *dialog_data)
-{
- CalWeekdays working_days = 0;
- guint32 mask = 1;
- int day;
-
- for (day = 0; day < 7; day++) {
- if (e_dialog_toggle_get (dialog_data->working_days[day]))
- working_days |= mask;
- mask <<= 1;
- }
-
- calendar_config_set_working_days (working_days);
-}
-
-static void
-timezone_changed (GtkWidget *widget, DialogData *dialog_data)
-{
- icaltimezone *zone;
-
- zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (dialog_data->timezone));
- calendar_config_set_timezone (icaltimezone_get_location (zone));
-}
-
-static void
-start_of_day_changed (GtkWidget *widget, DialogData *dialog_data)
-{
- int start_hour, start_minute, end_hour, end_minute;
- EDateEdit *start, *end;
-
- start = E_DATE_EDIT (dialog_data->start_of_day);
- end = E_DATE_EDIT (dialog_data->end_of_day);
-
- e_date_edit_get_time_of_day (start, &start_hour, &start_minute);
- e_date_edit_get_time_of_day (end, &end_hour, &end_minute);
-
- if ((start_hour > end_hour) || (start_hour == end_hour && start_minute > end_minute)) {
- if (start_hour < 23)
- e_date_edit_set_time_of_day (end, start_hour + 1, start_minute);
- else
- e_date_edit_set_time_of_day (end, 23, 59);
-
- return;
- }
-
- calendar_config_set_day_start_hour (start_hour);
- calendar_config_set_day_start_minute (start_minute);
-}
-
-static void
-end_of_day_changed (GtkWidget *widget, DialogData *dialog_data)
-{
- int start_hour, start_minute, end_hour, end_minute;
- EDateEdit *start, *end;
-
- start = E_DATE_EDIT (dialog_data->start_of_day);
- end = E_DATE_EDIT (dialog_data->end_of_day);
-
- e_date_edit_get_time_of_day (start, &start_hour, &start_minute);
- e_date_edit_get_time_of_day (end, &end_hour, &end_minute);
-
- if ((end_hour < start_hour) || (end_hour == start_hour && end_minute < start_minute)) {
- if (end_hour < 1)
- e_date_edit_set_time_of_day (start, 0, 0);
- else
- e_date_edit_set_time_of_day (start, end_hour - 1, end_minute);
-
- return;
- }
-
- calendar_config_set_day_end_hour (end_hour);
- calendar_config_set_day_end_minute (end_minute);
-}
-
-static void
-week_start_day_changed (GtkWidget *widget, DialogData *dialog_data)
-{
- int week_start_day;
-
- week_start_day = e_dialog_option_menu_get (dialog_data->week_start_day, week_start_day_map);
- calendar_config_set_week_start_day (week_start_day);
-}
-
-static void
-use_24_hour_toggled (GtkToggleButton *toggle, DialogData *dialog_data)
-{
- gboolean use_24_hour;
-
- use_24_hour = gtk_toggle_button_get_active (toggle);
-
- e_date_edit_set_use_24_hour_format (E_DATE_EDIT (dialog_data->start_of_day), use_24_hour);
- e_date_edit_set_use_24_hour_format (E_DATE_EDIT (dialog_data->end_of_day), use_24_hour);
-
- calendar_config_set_24_hour_format (use_24_hour);
-}
-
-static void
-time_divisions_changed (GtkWidget *widget, DialogData *dialog_data)
-{
- int time_divisions;
-
- time_divisions = e_dialog_option_menu_get (dialog_data->time_divisions, time_division_map);
- calendar_config_set_time_divisions (time_divisions);
-}
-
-static void
-show_end_times_toggled (GtkToggleButton *toggle, DialogData *dialog_data)
-{
- calendar_config_set_show_event_end (gtk_toggle_button_get_active (toggle));
-}
-
-static void
-compress_weekend_toggled (GtkToggleButton *toggle, DialogData *dialog_data)
-{
- calendar_config_set_compress_weekend (gtk_toggle_button_get_active (toggle));
-}
-
-static void
-dnav_show_week_no_toggled (GtkToggleButton *toggle, DialogData *dialog_data)
-{
- calendar_config_set_dnav_show_week_no (gtk_toggle_button_get_active (toggle));
-}
-
-static void
-hide_completed_tasks_toggled (GtkToggleButton *toggle, DialogData *dialog_data)
-{
- gboolean hide;
-
- hide = gtk_toggle_button_get_active (toggle);
-
- gtk_widget_set_sensitive (dialog_data->tasks_hide_completed_spinbutton, hide);
- gtk_widget_set_sensitive (dialog_data->tasks_hide_completed_optionmenu, hide);
-
- calendar_config_set_hide_completed_tasks (hide);
-}
-
-static void
-hide_completed_tasks_changed (GtkWidget *widget, DialogData *dialog_data)
-{
- calendar_config_set_hide_completed_tasks_value (e_dialog_spin_get_int (dialog_data->tasks_hide_completed_spinbutton));
-}
-
-static void
-hide_completed_tasks_units_changed (GtkWidget *widget, DialogData *dialog_data)
-{
- calendar_config_set_hide_completed_tasks_units (
- e_dialog_option_menu_get (dialog_data->tasks_hide_completed_optionmenu, hide_completed_units_map));
-}
-
-static void
-tasks_due_today_set_color (GnomeColorPicker *picker, guint r, guint g, guint b, guint a, DialogData *dialog_data)
-{
- calendar_config_set_tasks_due_today_color (spec_from_picker (dialog_data->tasks_due_today_color));
-}
-
-static void
-tasks_overdue_set_color (GnomeColorPicker *picker, guint r, guint g, guint b, guint a, DialogData *dialog_data)
-{
- calendar_config_set_tasks_overdue_color (spec_from_picker (dialog_data->tasks_overdue_color));
-}
-
-static void
-confirm_delete_toggled (GtkToggleButton *toggle, DialogData *dialog_data)
-{
- calendar_config_set_confirm_delete (gtk_toggle_button_get_active (toggle));
-}
-
-static void
-default_reminder_toggled (GtkToggleButton *toggle, DialogData *dialog_data)
-{
- calendar_config_set_use_default_reminder (gtk_toggle_button_get_active (toggle));
-}
-
-static void
-default_reminder_interval_changed (GtkWidget *widget, DialogData *dialog_data)
-{
- calendar_config_set_default_reminder_interval (
- e_dialog_spin_get_int (dialog_data->default_reminder_interval));
-}
-
-static void
-default_reminder_units_changed (GtkWidget *widget, DialogData *dialog_data)
-{
- calendar_config_set_default_reminder_units (
- e_dialog_option_menu_get (dialog_data->default_reminder_units, default_reminder_units_map));
-}
-
-static void
-url_list_changed (DialogData *dialog_data)
-{
- GtkListStore *model = NULL;
- GSList *url_list = NULL;
- GtkTreeIter iter;
- gboolean valid;
-
- url_list = NULL;
-
- model = (GtkListStore *) gtk_tree_view_get_model (dialog_data->url_list);
-
- valid = gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter);
- while (valid) {
- EPublishUri *url;
- char *xml;
-
- gtk_tree_model_get ((GtkTreeModel *) model, &iter,
- URL_LIST_FREE_BUSY_URL_COLUMN, &url,
- -1);
-
- if ((xml = e_pub_uri_to_xml (url)))
- url_list = g_slist_append (url_list, xml);
-
- valid = gtk_tree_model_iter_next ((GtkTreeModel *) model, &iter);
- }
-
- calendar_config_set_free_busy (url_list);
-
- g_slist_free (url_list);
-}
-
-static void
-template_url_changed (GtkEntry *entry, DialogData *dialog_data)
-{
- calendar_config_set_free_busy_template (gtk_entry_get_text (entry));
-}
-
-static void
-setup_changes (DialogData *dialog_data)
-{
- int i;
-
- for (i = 0; i < 7; i ++)
- g_signal_connect (dialog_data->working_days[i], "toggled", G_CALLBACK (working_days_changed), dialog_data);
-
- g_signal_connect (dialog_data->timezone, "changed", G_CALLBACK (timezone_changed), dialog_data);
-
- g_signal_connect (dialog_data->start_of_day, "changed", G_CALLBACK (start_of_day_changed), dialog_data);
- g_signal_connect (dialog_data->end_of_day, "changed", G_CALLBACK (end_of_day_changed), dialog_data);
-
- g_signal_connect (GTK_OPTION_MENU (dialog_data->week_start_day)->menu, "selection-done",
- G_CALLBACK (week_start_day_changed), dialog_data);
-
- g_signal_connect (dialog_data->use_24_hour, "toggled", G_CALLBACK (use_24_hour_toggled), dialog_data);
-
- g_signal_connect (GTK_OPTION_MENU (dialog_data->time_divisions)->menu, "selection-done",
- G_CALLBACK (time_divisions_changed), dialog_data);
-
- g_signal_connect (dialog_data->show_end_times, "toggled", G_CALLBACK (show_end_times_toggled), dialog_data);
- g_signal_connect (dialog_data->compress_weekend, "toggled", G_CALLBACK (compress_weekend_toggled), dialog_data);
- g_signal_connect (dialog_data->dnav_show_week_no, "toggled", G_CALLBACK (dnav_show_week_no_toggled), dialog_data);
-
- g_signal_connect (dialog_data->tasks_hide_completed_checkbutton, "toggled",
- G_CALLBACK (hide_completed_tasks_toggled), dialog_data);
- g_signal_connect (dialog_data->tasks_hide_completed_spinbutton, "value-changed",
- G_CALLBACK (hide_completed_tasks_changed), dialog_data);
- g_signal_connect (GTK_OPTION_MENU (dialog_data->tasks_hide_completed_optionmenu)->menu, "selection-done",
- G_CALLBACK (hide_completed_tasks_units_changed), dialog_data);
- g_signal_connect (dialog_data->tasks_due_today_color, "color-set",
- G_CALLBACK (tasks_due_today_set_color), dialog_data);
- g_signal_connect (dialog_data->tasks_overdue_color, "color-set",
- G_CALLBACK (tasks_overdue_set_color), dialog_data);
-
- g_signal_connect (dialog_data->confirm_delete, "toggled", G_CALLBACK (confirm_delete_toggled), dialog_data);
- g_signal_connect (dialog_data->default_reminder, "toggled", G_CALLBACK (default_reminder_toggled), dialog_data);
- g_signal_connect (dialog_data->default_reminder_interval, "changed",
- G_CALLBACK (default_reminder_interval_changed), dialog_data);
- g_signal_connect (GTK_OPTION_MENU (dialog_data->default_reminder_units)->menu, "selection-done",
- G_CALLBACK (default_reminder_units_changed), dialog_data);
-
- g_signal_connect (dialog_data->template_url, "changed", G_CALLBACK (template_url_changed), dialog_data);
-}
-
-/* Gets the widgets from the XML file and returns if they are all available.
- */
-static gboolean
-get_widgets (DialogData *data)
-{
-#define GW(name) glade_xml_get_widget (data->xml, name)
-
- data->page = GW ("toplevel-notebook");
-
- /* The indices must be 0 (Sun) to 6 (Sat). */
- data->working_days[0] = GW ("sun_button");
- data->working_days[1] = GW ("mon_button");
- data->working_days[2] = GW ("tue_button");
- data->working_days[3] = GW ("wed_button");
- data->working_days[4] = GW ("thu_button");
- data->working_days[5] = GW ("fri_button");
- data->working_days[6] = GW ("sat_button");
-
- data->timezone = GW ("timezone");
- data->week_start_day = GW ("first_day_of_week");
- data->start_of_day = GW ("start_of_day");
- gtk_widget_show (data->start_of_day);
- data->end_of_day = GW ("end_of_day");
- gtk_widget_show (data->end_of_day);
- data->use_12_hour = GW ("use_12_hour");
- data->use_24_hour = GW ("use_24_hour");
- data->time_divisions = GW ("time_divisions");
- data->show_end_times = GW ("show_end_times");
- data->compress_weekend = GW ("compress_weekend");
- data->dnav_show_week_no = GW ("dnav_show_week_no");
-
- data->tasks_due_today_color = GW ("tasks_due_today_color");
- data->tasks_overdue_color = GW ("tasks_overdue_color");
-
- data->tasks_hide_completed_checkbutton = GW ("tasks-hide-completed-checkbutton");
- data->tasks_hide_completed_spinbutton = GW ("tasks-hide-completed-spinbutton");
- data->tasks_hide_completed_optionmenu = GW ("tasks-hide-completed-optionmenu");
-
- data->confirm_delete = GW ("confirm-delete");
- data->default_reminder = GW ("default-reminder");
- data->default_reminder_interval = GW ("default-reminder-interval");
- data->default_reminder_units = GW ("default-reminder-units");
-
- data->url_add = GW ("url_add");
- data->url_edit = GW ("url_edit");
- data->url_remove = GW ("url_remove");
- data->url_enable = GW ("url_enable");
- data->url_list = GTK_TREE_VIEW (GW ("url_list"));
-
- data->template_url = GW("template_url");
-
-#undef GW
-
- return (data->page
- && data->timezone
- && data->working_days[0]
- && data->working_days[1]
- && data->working_days[2]
- && data->working_days[3]
- && data->working_days[4]
- && data->working_days[5]
- && data->working_days[6]
- && data->week_start_day
- && data->start_of_day
- && data->end_of_day
- && data->use_12_hour
- && data->use_24_hour
- && data->time_divisions
- && data->show_end_times
- && data->compress_weekend
- && data->dnav_show_week_no
- && data->tasks_due_today_color
- && data->tasks_overdue_color
- && data->tasks_hide_completed_checkbutton
- && data->tasks_hide_completed_spinbutton
- && data->tasks_hide_completed_optionmenu
- && data->confirm_delete
- && data->default_reminder
- && data->default_reminder_interval
- && data->default_reminder_units
- && data->url_add
- && data->url_edit
- && data->url_remove
- && data->url_enable
- && data->url_list);
-}
-
-
-static void
-config_control_destroy_callback (DialogData *dialog_data, GObject *deadbeef)
-{
- g_object_unref (dialog_data->xml);
-
- g_free (dialog_data);
-}
-
-/* Called by libglade to create our custom EDateEdit widgets. */
-GtkWidget *
-cal_prefs_dialog_create_time_edit (void)
-{
- GtkWidget *dedit;
-
- dedit = e_date_edit_new ();
-
- e_date_edit_set_use_24_hour_format (E_DATE_EDIT (dedit), calendar_config_get_24_hour_format ());
- e_date_edit_set_time_popup_range (E_DATE_EDIT (dedit), 0, 24);
- e_date_edit_set_show_date (E_DATE_EDIT (dedit), FALSE);
-
- return dedit;
-}
-
-
-/* Connects any necessary signal handlers. */
-static void
-init_widgets (DialogData *dialog_data)
-{
- GtkCellRenderer *renderer = NULL;
- GtkTreeSelection *selection;
- GtkListStore *model;
-
- dialog_data->url_editor = FALSE;
- dialog_data->url_editor_dlg =NULL;
-
- /* Free/Busy ... */
- g_signal_connect (dialog_data->url_add, "clicked",
- G_CALLBACK (cal_prefs_dialog_url_add_clicked),
- dialog_data);
-
- g_signal_connect (dialog_data->url_edit, "clicked",
- G_CALLBACK (cal_prefs_dialog_url_edit_clicked),
- dialog_data);
-
- g_signal_connect (dialog_data->url_remove, "clicked",
- G_CALLBACK (cal_prefs_dialog_url_remove_clicked),
- dialog_data);
-
- g_signal_connect (dialog_data->url_enable, "clicked",
- G_CALLBACK (cal_prefs_dialog_url_enable_clicked),
- dialog_data);
-
- /* Free/Busy Listview */
- renderer = gtk_cell_renderer_toggle_new();
- g_object_set ((GObject *) renderer, "activatable", TRUE, NULL);
-
- model = gtk_list_store_new (URL_LIST_N_COLUMNS, G_TYPE_BOOLEAN,
- G_TYPE_STRING, G_TYPE_POINTER);
-
- gtk_tree_view_set_model (dialog_data->url_list,
- (GtkTreeModel *) model);
-
- gtk_tree_view_insert_column_with_attributes (dialog_data->url_list, -1,
- _("Enabled"), renderer,
- "active",
- URL_LIST_ENABLED_COLUMN,
- NULL);
-
- g_signal_connect (renderer, "toggled",
- G_CALLBACK (cal_prefs_dialog_url_list_enable_toggled),
- dialog_data);
-
- renderer = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes (dialog_data->url_list, -1,
- _("Location"), renderer,
- "text",
- URL_LIST_LOCATION_COLUMN,
- NULL);
-
- selection = gtk_tree_view_get_selection ((GtkTreeView *) dialog_data->url_list);
- gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
- gtk_tree_view_set_headers_visible ((GtkTreeView *) dialog_data->url_list, TRUE);
-
- g_signal_connect (dialog_data->url_list, "row-activated",
- G_CALLBACK (cal_prefs_dialog_url_list_double_click),
- dialog_data);
-}
-
-/* Sets the color in a color picker from an X color spec */
-static void
-set_color_picker (GtkWidget *picker, const char *spec)
-{
- GdkColor color;
-
- if (!spec || !gdk_color_parse (spec, &color))
- color.red = color.green = color.blue = 0;
-
- gnome_color_picker_set_i16 (GNOME_COLOR_PICKER (picker),
- color.red,
- color.green,
- color.blue,
- 65535);
-}
-
-static void
-cal_prefs_dialog_url_add_clicked (GtkWidget *button, DialogData *dialog_data)
-{
- EPublishUri *url = NULL;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreeSelection *selection;
-
- model = gtk_tree_view_get_model (dialog_data->url_list);
- url = g_new0 (EPublishUri, 1);
- url->enabled = TRUE;
- url->location = "";
-
- if (!dialog_data->url_editor) {
- dialog_data->url_editor = url_editor_dialog_new (dialog_data,
- url);
-
- if (url->location != "") {
- gtk_list_store_append(GTK_LIST_STORE (model), &iter);
- gtk_list_store_set (GTK_LIST_STORE(model), &iter,
- URL_LIST_ENABLED_COLUMN,
- url->enabled,
- URL_LIST_LOCATION_COLUMN,
- g_strdup (url->location),
- URL_LIST_FREE_BUSY_URL_COLUMN, url,
- -1);
-
- url_list_changed (dialog_data);
-
- if (!GTK_WIDGET_SENSITIVE ((GtkWidget *) dialog_data->url_remove)) {
- selection = gtk_tree_view_get_selection ((GtkTreeView *) dialog_data->url_list);
- gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter);
- gtk_widget_set_sensitive ((GtkWidget*) dialog_data->url_remove, TRUE);
- gtk_tree_selection_select_iter (selection, &iter);
- }
- }
- dialog_data->url_editor = FALSE;
- dialog_data->url_editor_dlg = NULL;
- } else {
- gdk_window_raise (dialog_data->url_editor_dlg->window);
- }
-}
-
-static void
-cal_prefs_dialog_url_edit_clicked (GtkWidget *button, DialogData *dialog_data)
-{
- if (!dialog_data->url_editor) {
- GtkTreeSelection *selection;
- EPublishUri *url = NULL;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- selection = gtk_tree_view_get_selection ((GtkTreeView *) dialog_data->url_list);
- if (gtk_tree_selection_get_selected (selection, &model, &iter)){
- gtk_tree_model_get (model, &iter,
- URL_LIST_FREE_BUSY_URL_COLUMN,
- &url,
- -1);
-
- }
-
- if (url) {
- dialog_data->url_editor = url_editor_dialog_new (dialog_data, url);
-
- gtk_list_store_set ((GtkListStore *) model, &iter,
- URL_LIST_LOCATION_COLUMN,
- g_strdup (url->location),
- URL_LIST_ENABLED_COLUMN,
- url->enabled,
- URL_LIST_FREE_BUSY_URL_COLUMN, url,
- -1);
-
- url_list_changed (dialog_data);
-
- if (!GTK_WIDGET_SENSITIVE ((GtkWidget *) dialog_data->url_remove)) {
- selection = gtk_tree_view_get_selection ((GtkTreeView *) dialog_data->url_list);
- gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter);
- gtk_widget_set_sensitive ((GtkWidget*) dialog_data->url_remove, TRUE);
- gtk_tree_selection_select_iter (selection, &iter);
- }
- dialog_data->url_editor = FALSE;
- dialog_data->url_editor_dlg = NULL;
- }
- } else {
- gdk_window_raise (dialog_data->url_editor_dlg->window);
- }
-}
-
-static void
-cal_prefs_dialog_url_remove_clicked (GtkWidget *button, DialogData *dialog_data)
-{
- EPublishUri *url = NULL;
- GtkTreeSelection * selection;
- GtkTreeModel *model;
- GtkWidget *confirm;
- GtkTreeIter iter;
- int ans;
-
- selection = gtk_tree_view_get_selection (dialog_data->url_list);
- if (gtk_tree_selection_get_selected (selection, &model, &iter))
- gtk_tree_model_get (model, &iter,
- URL_LIST_FREE_BUSY_URL_COLUMN, &url,
- -1);
-
- /* make sure we have a valid account selected and that
- we aren't editing anything... */
- if (url == NULL || dialog_data->url_editor)
- return;
-
- confirm = gtk_message_dialog_new (PREFS_WINDOW (dialog_data),
- GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- _("Are you sure you want to remove this URL?"));
-
- button = gtk_button_new_from_stock (GTK_STOCK_YES);
- gtk_button_set_label ((GtkButton *) button, _("Remove"));
- gtk_dialog_add_action_widget ((GtkDialog *) confirm, (GtkWidget *) button, GTK_RESPONSE_YES);
- gtk_widget_show ((GtkWidget *) button);
-
- button = gtk_button_new_from_stock (GTK_STOCK_NO);
- gtk_button_set_label ((GtkButton *) button, _("Don't Remove"));
- gtk_dialog_add_action_widget ((GtkDialog *) confirm,
- (GtkWidget *) button, GTK_RESPONSE_NO);
-
- gtk_widget_show ((GtkWidget *) button);
-
- ans = gtk_dialog_run ((GtkDialog *) confirm);
- gtk_widget_destroy (confirm);
-
- if (ans == GTK_RESPONSE_YES) {
- int len;
-
- gtk_list_store_remove ((GtkListStore *) model, &iter);
-
- len = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (model), NULL);
- if (len > 0) {
- gtk_tree_selection_select_iter (selection, &iter);
- } else {
- gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_edit), FALSE);
- gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_remove), FALSE);
- gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_enable), FALSE);
- }
- g_free (url);
- url_list_changed (dialog_data);
- }
-}
-
-static void
-cal_prefs_dialog_url_enable_clicked (GtkWidget *button, DialogData *dialog_data)
-{
- EPublishUri *url = NULL;
- GtkTreeSelection * selection;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- selection = gtk_tree_view_get_selection (dialog_data->url_list);
- if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
- gtk_tree_model_get (model, &iter,
- URL_LIST_FREE_BUSY_URL_COLUMN, &url,
- -1);
- url->enabled = !url->enabled;
-
- gtk_tree_selection_select_iter (selection, &iter);
-
- gtk_list_store_set ((GtkListStore *) model, &iter,
- URL_LIST_ENABLED_COLUMN, url->enabled,
- -1);
-
- gtk_button_set_label ((GtkButton *) dialog_data->url_enable,
- url->enabled ? _("Disable") : _("Enable"));
-
- url_list_changed (dialog_data);
- }
-}
-
-static void
-cal_prefs_dialog_url_list_enable_toggled (GtkCellRendererToggle *renderer,
- const char *path_string,
- DialogData *dialog_data)
-{
- GtkTreeSelection * selection;
- EPublishUri *url = NULL;
- GtkTreeModel *model;
- GtkTreePath *path;
- GtkTreeIter iter;
-
- path = gtk_tree_path_new_from_string (path_string);
- model = gtk_tree_view_get_model (dialog_data->url_list);
- selection = gtk_tree_view_get_selection (dialog_data->url_list);
-
- if (gtk_tree_model_get_iter (model, &iter, path)) {
- gtk_tree_model_get (model, &iter,
- URL_LIST_FREE_BUSY_URL_COLUMN, &url,
- -1);
-
- url->enabled = !url->enabled;
- gtk_list_store_set((GtkListStore *) model, &iter,
- URL_LIST_ENABLED_COLUMN,
- url->enabled, -1);
-
- if (gtk_tree_selection_iter_is_selected (selection, &iter))
- gtk_button_set_label ((GtkButton *) dialog_data->url_enable,
- url->enabled ? _("Disable") : _("Enable"));
-
- url_list_changed (dialog_data);
- }
-
- gtk_tree_path_free (path);
-}
-
-static void
-cal_prefs_dialog_url_list_double_click (GtkTreeView *treeview,
- GtkTreePath *path,
- GtkTreeViewColumn *column,
- DialogData *dialog_data)
-{
- cal_prefs_dialog_url_edit_clicked (NULL, dialog_data);
-}
-
-static void
-cal_prefs_dialog_url_list_change (GtkTreeSelection *selection,
- DialogData *dialog_data)
-{
- EPublishUri *url = NULL;
- GtkTreeModel *model;
- GtkTreeIter iter;
- int state;
-
- state = gtk_tree_selection_get_selected (selection, &model, &iter);
- if (state) {
- gtk_tree_model_get (model, &iter,
- URL_LIST_FREE_BUSY_URL_COLUMN, &url,
- -1);
-
- if (url->location && url->enabled)
- gtk_button_set_label ((GtkButton *) dialog_data->url_enable, _("Disable"));
- else
- gtk_button_set_label ((GtkButton *) dialog_data->url_enable, _("Enable"));
- } else {
- gtk_widget_grab_focus (GTK_WIDGET (dialog_data->url_add));
- }
-
- gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_edit), state);
- gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_remove), state);
- gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_enable), state);
-}
-
-/* Shows the current Free/Busy settings in the dialog */
-static void
-show_fb_config (DialogData *dialog_data)
-{
- GSList *url_config_list = NULL;
- GtkListStore *model;
- GtkTreeIter iter;
- gchar *template_url;
-
- model = (GtkListStore *) gtk_tree_view_get_model (dialog_data->url_list);
- gtk_list_store_clear (model);
-
- /* restore urls from gconf */
- url_config_list = calendar_config_get_free_busy();
-
- if (!url_config_list) {
- /* list is empty-disable edit, remove, and enable buttons */
- gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_edit),
- FALSE);
-
- gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_remove),
- FALSE);
-
- gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_enable),
- FALSE);
- } else {
- gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_edit),
- TRUE);
-
- gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_remove),
- TRUE);
-
- gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_enable),
- TRUE);
- }
-
- while (url_config_list) {
- gchar *xml = (gchar *)url_config_list->data;
- EPublishUri *url;
- url = g_new0 (EPublishUri, 1);
-
- e_pub_uri_from_xml (url, xml);
- if (url->location) {
- gtk_list_store_append (model, &iter);
- gtk_list_store_set (model, &iter,
- URL_LIST_ENABLED_COLUMN,
- url->enabled,
- URL_LIST_LOCATION_COLUMN,
- url->location,
- URL_LIST_FREE_BUSY_URL_COLUMN, url,
- -1);
- }
-
- url_config_list = g_slist_next (url_config_list);
- g_free (xml);
- }
-
- g_slist_foreach (url_config_list, (GFunc) g_free, NULL);
- g_slist_free (url_config_list);
-
- template_url = calendar_config_get_free_busy_template ();
- gtk_entry_set_text (GTK_ENTRY (dialog_data->template_url), template_url);
-
- g_free (template_url);
-}
-
-/* Shows the current task list settings in the dialog */
-static void
-show_task_list_config (DialogData *dialog_data)
-{
- CalUnits units;
- gboolean hide_completed_tasks;
-
- set_color_picker (dialog_data->tasks_due_today_color, calendar_config_get_tasks_due_today_color ());
- set_color_picker (dialog_data->tasks_overdue_color, calendar_config_get_tasks_overdue_color ());
-
- /* Hide Completed Tasks. */
- hide_completed_tasks = calendar_config_get_hide_completed_tasks ();
- e_dialog_toggle_set (dialog_data->tasks_hide_completed_checkbutton,
- hide_completed_tasks);
-
- /* Hide Completed Tasks Units. */
- units = calendar_config_get_hide_completed_tasks_units ();
- e_dialog_option_menu_set (dialog_data->tasks_hide_completed_optionmenu,
- units, hide_completed_units_map);
-
- /* Hide Completed Tasks Value. */
- e_dialog_spin_set (dialog_data->tasks_hide_completed_spinbutton,
- calendar_config_get_hide_completed_tasks_value ());
-
- gtk_widget_set_sensitive (dialog_data->tasks_hide_completed_spinbutton,
- hide_completed_tasks);
- gtk_widget_set_sensitive (dialog_data->tasks_hide_completed_optionmenu,
- hide_completed_tasks);
-}
-
-/* Shows the current config settings in the dialog. */
-static void
-show_config (DialogData *dialog_data)
-{
- CalWeekdays working_days;
- gint mask, day, week_start_day, time_divisions;
- icaltimezone *zone;
- gboolean sensitive;
-
- /* Timezone. */
- zone = calendar_config_get_icaltimezone ();
- e_timezone_entry_set_timezone (E_TIMEZONE_ENTRY (dialog_data->timezone),
- zone);
-
- /* Working Days. */
- working_days = calendar_config_get_working_days ();
- mask = 1 << 0;
- for (day = 0; day < 7; day++) {
- e_dialog_toggle_set (dialog_data->working_days[day], (working_days & mask) ? TRUE : FALSE);
- mask <<= 1;
- }
-
- /* Week Start Day. */
- week_start_day = calendar_config_get_week_start_day ();
- e_dialog_option_menu_set (dialog_data->week_start_day, week_start_day,
- week_start_day_map);
-
- /* Start of Day. */
- e_date_edit_set_time_of_day (E_DATE_EDIT (dialog_data->start_of_day),
- calendar_config_get_day_start_hour (),
- calendar_config_get_day_start_minute ());
-
- /* End of Day. */
- e_date_edit_set_time_of_day (E_DATE_EDIT (dialog_data->end_of_day),
- calendar_config_get_day_end_hour (),
- calendar_config_get_day_end_minute ());
-
- /* 12/24 Hour Format. */
- if (calendar_config_get_24_hour_format ())
- e_dialog_toggle_set (dialog_data->use_24_hour, TRUE);
- else
- e_dialog_toggle_set (dialog_data->use_12_hour, TRUE);
-
- sensitive = calendar_config_locale_supports_12_hour_format ();
- gtk_widget_set_sensitive (dialog_data->use_12_hour, sensitive);
- gtk_widget_set_sensitive (dialog_data->use_24_hour, sensitive);
-
-
- /* Time Divisions. */
- time_divisions = calendar_config_get_time_divisions ();
- e_dialog_option_menu_set (dialog_data->time_divisions, time_divisions,
- time_division_map);
-
- /* Show Appointment End Times. */
- e_dialog_toggle_set (dialog_data->show_end_times, calendar_config_get_show_event_end ());
-
- /* Compress Weekend. */
- e_dialog_toggle_set (dialog_data->compress_weekend, calendar_config_get_compress_weekend ());
-
- /* Date Navigator - Show Week Numbers. */
- e_dialog_toggle_set (dialog_data->dnav_show_week_no, calendar_config_get_dnav_show_week_no ());
-
- /* Task list */
-
- show_task_list_config (dialog_data);
-
- /* Free/Busy */
- show_fb_config (dialog_data);
-
- /* Other page */
-
- e_dialog_toggle_set (dialog_data->confirm_delete, calendar_config_get_confirm_delete ());
-
- e_dialog_toggle_set (dialog_data->default_reminder,
- calendar_config_get_use_default_reminder ());
- e_dialog_spin_set (dialog_data->default_reminder_interval,
- calendar_config_get_default_reminder_interval ());
- e_dialog_option_menu_set (dialog_data->default_reminder_units,
- calendar_config_get_default_reminder_units (),
- default_reminder_units_map);
-}
diff --git a/calendar/gui/dialogs/cal-prefs-dialog.glade b/calendar/gui/dialogs/cal-prefs-dialog.glade
deleted file mode 100644
index c950ed44be..0000000000
--- a/calendar/gui/dialogs/cal-prefs-dialog.glade
+++ /dev/null
@@ -1,2026 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-<requires lib="gnome"/>
-
-<widget class="GtkDialog" id="cal-prefs-dialog">
- <property name="title" translatable="yes">Calendar and Tasks Settings</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="has_separator">False</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="hbuttonbox1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="button1">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">0</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="button2">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-apply</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">0</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="button3">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-close</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">0</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkNotebook" id="toplevel-notebook">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="show_tabs">True</property>
- <property name="show_border">True</property>
- <property name="tab_pos">GTK_POS_TOP</property>
- <property name="scrollable">False</property>
- <property name="enable_popup">False</property>
-
- <child>
- <widget class="GtkVBox" id="vbox10">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label51">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Time&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox26">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label52">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table5">
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">3</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label22">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Time _zone:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">timezone</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label20">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Time format:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox10">
- <property name="visible">True</property>
- <property name="homogeneous">True</property>
- <property name="spacing">4</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment2">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xscale">3.35276e-08</property>
- <property name="yscale">1</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkRadioButton" id="use_12_hour">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_12 hour (AM/PM)</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkRadioButton" id="use_24_hour">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_24 hour</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">use_12_hour</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="timezone">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="creation_function">make_timezone_entry</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Wed, 20 Jun 2001 02:22:46 GMT</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label49">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Work Week&lt;/b&gt;</property>
- <property name="use_underline">True</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox25">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label50">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table8">
- <property name="visible">True</property>
- <property name="n_rows">4</property>
- <property name="n_columns">4</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkHBox" id="hbox17">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkCheckButton" id="mon_button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Mon</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <atkproperty name="AtkObject::accessible_name" translatable="yes">Monday</atkproperty>
- </accessibility>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="tue_button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Tue</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <atkproperty name="AtkObject::accessible_name" translatable="yes">Tuesday</atkproperty>
- </accessibility>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="wed_button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Wed</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <atkproperty name="AtkObject::accessible_name" translatable="yes">Wednesday</atkproperty>
- </accessibility>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="thu_button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">T_hu</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <atkproperty name="AtkObject::accessible_name" translatable="yes">Thursday</atkproperty>
- </accessibility>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="fri_button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Fri</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <atkproperty name="AtkObject::accessible_name" translatable="yes">Friday</atkproperty>
- </accessibility>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="sat_button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Sat</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <atkproperty name="AtkObject::accessible_name" translatable="yes">Saturday</atkproperty>
- </accessibility>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="sun_button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">S_un</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <atkproperty name="AtkObject::accessible_name" translatable="yes">Sunday</atkproperty>
- </accessibility>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">4</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="alignment3">
- <property name="visible">True</property>
- <property name="xalign">7.45058e-09</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">1</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkOptionMenu" id="first_day_of_week">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget1">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Monday</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Tuesday</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget4">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Wednesday</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget5">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Thursday</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget6">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Friday</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget7">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Saturday</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget8">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Sunday</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label32">
- <property name="visible">True</property>
- <property name="label" translatable="yes">W_eek starts:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">first_day_of_week</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label31">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Work days:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="end_of_day_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Day _ends:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_RIGHT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">end_of_day</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="start_of_day_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Day begins:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">start_of_day</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="start_of_day">
- <property name="visible">True</property>
- <property name="creation_function">cal_prefs_dialog_create_time_edit</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Thu, 30 May 2002 19:26:53 GMT</property>
- <accessibility>
- <atkrelation target="start_of_day_label" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">4</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="end_of_day">
- <property name="visible">True</property>
- <property name="creation_function">cal_prefs_dialog_create_time_edit</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Thu, 30 May 2002 19:27:35 GMT</property>
- <accessibility>
- <atkrelation target="end_of_day_label" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">4</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label53">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Alerts&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox27">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label54">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox13">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkCheckButton" id="confirm-delete">
- <property name="border_width">3</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Ask for confirmation when deleting items</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox19">
- <property name="border_width">3</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">3</property>
-
- <child>
- <widget class="GtkCheckButton" id="default-reminder">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Sh_ow a reminder</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="default-reminder-interval">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">False</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">0 0 9999 1 10 10</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="alignment4">
- <property name="visible">True</property>
- <property name="xalign">7.45058e-09</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkOptionMenu" id="default-reminder-units">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
- <accessibility>
- <atkproperty name="AtkObject::accessible_name" translatable="yes">option menu to choose reminder units</atkproperty>
- </accessibility>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget9">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget10">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Minutes</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget11">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Hours</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget12">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Days</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label35">
- <property name="visible">True</property>
- <property name="label" translatable="yes">before every appointment</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label21">
- <property name="visible">True</property>
- <property name="label" translatable="yes">General</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox8">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label55">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;General&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox28">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label56">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox16">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkHBox" id="hbox12">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label25">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Time divisions:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">time_divisions</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="time_divisions">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget13">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget14">
- <property name="visible">True</property>
- <property name="label" translatable="yes">60 minutes</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget15">
- <property name="visible">True</property>
- <property name="label" translatable="yes">30 minutes</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget16">
- <property name="visible">True</property>
- <property name="label" translatable="yes">15 minutes</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget17">
- <property name="visible">True</property>
- <property name="label" translatable="yes">10 minutes</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget18">
- <property name="visible">True</property>
- <property name="label" translatable="yes">05 minutes</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="show_end_times">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Show appointment end times in week and month views</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="compress_weekend">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Compress weekends in month view</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="dnav_show_week_no">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Show week _numbers in date navigator</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label57">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Task List&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox29">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label58">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox12">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkTable" id="table7">
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label28">
- <property name="visible">True</property>
- <property name="label" translatable="yes">T_asks due today:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">tasks_due_today_color</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label29">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Overdue tasks:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">tasks_overdue_color</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GnomeColorPicker" id="tasks_overdue_color">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="dither">True</property>
- <property name="use_alpha">False</property>
- <property name="title" translatable="yes">Color for overdue tasks</property>
- <property name="focus_on_click">True</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GnomeColorPicker" id="tasks_due_today_color">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="dither">True</property>
- <property name="use_alpha">False</property>
- <property name="title" translatable="yes">Color for tasks due today</property>
- <property name="focus_on_click">True</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox15">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkCheckButton" id="tasks-hide-completed-checkbutton">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Hide completed tasks after</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="tasks-hide-completed-spinbutton">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">False</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">1 0 9999 1 10 10</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="tasks-hide-completed-optionmenu">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
- <accessibility>
- <atkproperty name="AtkObject::accessible_name" translatable="yes">option menu to choose time units</atkproperty>
- </accessibility>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget19">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget20">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Minutes</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget21">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Hours</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget22">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Days</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label7">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Display</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox17">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkFrame" id="frame2">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment8">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">1</property>
- <property name="yscale">1</property>
- <property name="top_padding">12</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">12</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox20">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow1">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
- <child>
- <widget class="GtkTreeView" id="url_list">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="headers_visible">True</property>
- <property name="rules_hint">False</property>
- <property name="reorderable">False</property>
- <property name="enable_search">True</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox15">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkVButtonBox" id="vbuttonbox3">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_START</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkButton" id="url_add">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment5">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox22">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child>
- <widget class="GtkImage" id="image1">
- <property name="visible">True</property>
- <property name="stock">gtk-add</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="labeladd">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Add URL</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="url_edit">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment6">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox23">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child>
- <widget class="GtkImage" id="image2">
- <property name="visible">True</property>
- <property name="stock">gtk-properties</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label47">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Edit</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="url_remove">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-remove</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="url_enable">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">E_nable</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVButtonBox" id="vbuttonbox4">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_START</property>
- <property name="spacing">3</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label46">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label60">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Publishing&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="frame1">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment7">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">1</property>
- <property name="yscale">1</property>
- <property name="top_padding">12</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">12</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkVBox" id="vbox18">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkHBox" id="hbox30">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label61">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Template:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="template_url">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label62">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;i&gt;%u and %d will be replaced by user and domain from the email address.&lt;/i&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">True</property>
- <property name="selectable">False</property>
- <property name="xalign">0.49</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label59">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Default Free/Busy Server&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label42">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Free/Busy</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/calendar/gui/dialogs/cal-prefs-dialog.h b/calendar/gui/dialogs/cal-prefs-dialog.h
deleted file mode 100644
index 5c92570d37..0000000000
--- a/calendar/gui/dialogs/cal-prefs-dialog.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 2000, Ximian, Inc.
- * Copyright 2000, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * CalPrefsDialog - a GtkObject which handles a libglade-loaded dialog
- * to edit the calendar preference settings.
- */
-
-#ifndef _CAL_PREFS_DIALOG_H_
-#define _CAL_PREFS_DIALOG_H_
-
-#include <gtk/gtk.h>
-#include <glade/glade.h>
-#include <gconf/gconf.h>
-#include <gconf/gconf-client.h>
-#include "../e-pub-utils.h"
-#include "evolution-config-control.h"
-
-G_BEGIN_DECLS
-
-enum {
- URL_LIST_ENABLED_COLUMN,
- URL_LIST_LOCATION_COLUMN,
- URL_LIST_FREE_BUSY_URL_COLUMN,
- URL_LIST_N_COLUMNS
-};
-
-struct _DialogData {
- /* Glade XML data */
- GladeXML *xml;
-
- GConfClient *gconf;
-
- GtkWidget *page;
-
- GtkWidget *timezone;
- GtkWidget *working_days[7];
- GtkWidget *week_start_day;
- GtkWidget *start_of_day;
- GtkWidget *end_of_day;
- GtkWidget *use_12_hour;
- GtkWidget *use_24_hour;
- GtkWidget *time_divisions;
- GtkWidget *show_end_times;
- GtkWidget *compress_weekend;
- GtkWidget *dnav_show_week_no;
-
- /* Widgets for the task list options */
- GtkWidget *tasks_due_today_color;
- GtkWidget *tasks_overdue_color;
-
- GtkWidget *tasks_hide_completed_checkbutton;
- GtkWidget *tasks_hide_completed_spinbutton;
- GtkWidget *tasks_hide_completed_optionmenu;
-
- /* Widgets for the Free/Busy options */
- GtkWidget *url_add;
- GtkWidget *url_edit;
- GtkWidget *url_remove;
- GtkWidget *url_enable;
- GtkTreeView *url_list;
- gboolean url_editor;
- GtkWidget* url_editor_dlg;
- guint destroyed : 1;
-
- /* widgets for the Free/Busy template */
- GtkWidget *template_url;
-
- /* Other page options */
- GtkWidget *confirm_delete;
- GtkWidget *default_reminder;
- GtkWidget *default_reminder_interval;
- GtkWidget *default_reminder_units;
-};
-typedef struct _DialogData DialogData;
-
-EvolutionConfigControl *cal_prefs_dialog_new (void);
-
-G_END_DECLS
-
-#endif /* _CAL_PREFS_DIALOG_H_ */
diff --git a/calendar/gui/dialogs/calendar-setup.c b/calendar/gui/dialogs/calendar-setup.c
deleted file mode 100644
index 5c921a8c3f..0000000000
--- a/calendar/gui/dialogs/calendar-setup.c
+++ /dev/null
@@ -1,519 +0,0 @@
-/*
- * Authors: David Trowbridge <trowbrds@cs.colorado.edu>
- *
- * Copyright (C) 2004 Novell, Inc (www.novell.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkbox.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtkstock.h>
-#include <gtk/gtkvbox.h>
-
-#include <libedataserver/e-source.h>
-#include <libedataserver/e-source-list.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/libgnomeui.h>
-
-#include "calendar-setup.h"
-#include "../e-cal-config.h"
-
-typedef struct _CalendarSourceDialog CalendarSourceDialog;
-
-struct _CalendarSourceDialog {
- ECalConfig *config; /* the config manager */
-
- GtkWidget *window;
-
- /* Source selection (creation only) */
- ESourceList *source_list;
- GSList *menu_source_groups;
- GtkWidget *group_optionmenu;
-
- /* ESource we're currently editing */
- ESource *source;
- /* The original source in edit mode. Also used to flag when we are in edit mode. */
- ESource *original_source;
-
- /* Source group we're creating/editing a source in */
- ESourceGroup *source_group;
-};
-
-static gboolean
-eccp_check_complete (EConfig *ec, const char *pageid, void *data)
-{
- CalendarSourceDialog *sdialog = data;
- gboolean valid = TRUE;
- const char *tmp;
- ESource *source;
-
- tmp = e_source_peek_name (sdialog->source);
- valid = tmp && tmp[0] && ((source = e_source_group_peek_source_by_name (sdialog->source_group, tmp)) == NULL || source == sdialog->original_source);
-
- return valid;
-}
-
-static void
-colorpicker_set_color (GnomeColorPicker *color, guint32 rgb)
-{
- gnome_color_picker_set_i8 (color, (rgb & 0xff0000) >> 16, (rgb & 0xff00) >> 8, rgb & 0xff, 0xff);
-}
-
-static guint32
-colorpicker_get_color (GnomeColorPicker *color)
-{
- guint8 r, g, b, a;
- guint32 rgb = 0;
-
- gnome_color_picker_get_i8 (color, &r, &g, &b, &a);
-
- rgb = r;
- rgb <<= 8;
- rgb |= g;
- rgb <<= 8;
- rgb |= b;
-
- return rgb;
-}
-
-static void
-eccp_commit (EConfig *ec, GSList *items, void *data)
-{
- CalendarSourceDialog *sdialog = data;
- xmlNodePtr xml;
-
- if (sdialog->original_source) {
- guint32 color;
-
- xml = xmlNewNode (NULL, "dummy");
- e_source_dump_to_xml_node (sdialog->source, xml);
- e_source_update_from_xml_node (sdialog->original_source, xml->children, NULL);
- xmlFreeNode (xml);
-
- e_source_get_color (sdialog->source, &color);
- e_source_set_color (sdialog->original_source, color);
- } else {
- e_source_group_add_source (sdialog->source_group, sdialog->source, -1);
- e_source_list_sync (sdialog->source_list, NULL);
- }
-}
-
-static void
-eccp_free (EConfig *ec, GSList *items, void *data)
-{
- CalendarSourceDialog *sdialog = data;
-
- g_slist_free (items);
-
- g_object_unref (sdialog->source);
- if (sdialog->original_source)
- g_object_unref (sdialog->original_source);
- if (sdialog->source_list)
- g_object_unref (sdialog->source_list);
- g_slist_free (sdialog->menu_source_groups);
- g_free (sdialog);
-}
-
-static void
-eccp_type_changed (GtkComboBox *dropdown, CalendarSourceDialog *sdialog)
-{
- int id = gtk_combo_box_get_active (dropdown);
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- model = gtk_combo_box_get_model (dropdown);
- if (id == -1 || !gtk_tree_model_iter_nth_child (model, &iter, NULL, id))
- return;
-
- /* TODO: when we change the group type, we lose all of the pre-filled dialog info */
-
- gtk_tree_model_get (model, &iter, 1, &sdialog->source_group, -1);
- /* HACK: doesn't work if you don't do this */
- e_source_set_absolute_uri (sdialog->source, NULL);
- e_source_set_group (sdialog->source, sdialog->source_group);
-
- e_source_set_relative_uri (sdialog->source, "");
-
- e_config_target_changed ((EConfig *) sdialog->config, E_CONFIG_TARGET_CHANGED_REBUILD);
-}
-
-static GtkWidget *
-eccp_get_source_type (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, void *data)
-{
- static GtkWidget *label, *type;
- int row;
- CalendarSourceDialog *sdialog = data;
- ECalConfigTargetSource *t = (ECalConfigTargetSource *) ec->target;
- ESource *source = t->source;
- ESourceGroup *group = e_source_peek_group (source);
- char *markup;
-
- if (old)
- gtk_widget_destroy (label);
-
- row = ((GtkTable *)parent)->nrows;
-
- if (sdialog->original_source) {
- label = gtk_label_new (_("Type:"));
-
- type = gtk_label_new ("");
- gtk_widget_show (type);
- markup = g_strdup_printf ("<span weight=\"bold\">%s</span>", e_source_group_peek_name (group));
- gtk_label_set_markup (GTK_LABEL (type), markup);
- gtk_misc_set_alignment (GTK_MISC (type), 0.0, 0.5);
- g_free (markup);
- gtk_table_attach (GTK_TABLE (parent), type, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
- } else {
- GtkCellRenderer *cell;
- GtkListStore *store;
- GtkTreeIter iter;
- GSList *l;
- int active = 0, i = 0;
-
- label = gtk_label_new_with_mnemonic(_("_Type:"));
-
- type = gtk_combo_box_new ();
- cell = gtk_cell_renderer_text_new ();
- store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER);
- for (l = sdialog->menu_source_groups; l; l = g_slist_next (l)) {
- ESourceGroup *group = l->data;
-
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter, 0, e_source_group_peek_name (group), 1, group, -1);
- if (!strcmp (e_source_group_peek_uid (sdialog->source_group), e_source_group_peek_uid (group)))
- active = i;
- i++;
- }
-
- gtk_cell_layout_pack_start ((GtkCellLayout *) type, cell, TRUE);
- gtk_cell_layout_set_attributes ((GtkCellLayout *) type, cell, "text", 0, NULL);
- gtk_combo_box_set_model ((GtkComboBox *) type, (GtkTreeModel *) store);
- gtk_combo_box_set_active ((GtkComboBox *) type, active);
- g_signal_connect (type, "changed", G_CALLBACK (eccp_type_changed), sdialog);
- gtk_widget_show (type);
- gtk_table_attach (GTK_TABLE (parent), type, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
- gtk_label_set_mnemonic_widget (GTK_LABEL (label), type);
- }
-
- gtk_widget_show (label);
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
- gtk_table_attach (GTK_TABLE (parent), label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
- return type;
-}
-
-static void
-name_changed (GtkEntry *entry, ECalConfigTargetSource *t)
-{
- ESource *source = t->source;
- e_source_set_name (source, gtk_entry_get_text (GTK_ENTRY (entry)));
-}
-
-static GtkWidget *
-eccp_get_source_name (EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data)
-{
- static GtkWidget *label, *entry;
- int row;
- ECalConfigTargetSource *t = (ECalConfigTargetSource *) ec->target;
- ESource *source = t->source;
-
- if (old)
- gtk_widget_destroy (label);
-
- row = ((GtkTable*)parent)->nrows;
-
- label = gtk_label_new_with_mnemonic (_("_Name:"));
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
- gtk_widget_show (label);
- gtk_table_attach (GTK_TABLE (parent), label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
- entry = gtk_entry_new ();
- gtk_widget_show (entry);
- gtk_table_attach (GTK_TABLE (parent), entry, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
- gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry);
- g_signal_connect (G_OBJECT (entry), "changed", G_CALLBACK (name_changed), (gpointer) t);
-
- if (source)
- gtk_entry_set_text (GTK_ENTRY (entry), e_source_peek_name (source));
-
- return entry;
-}
-
-static void
-offline_status_changed_cb (GtkWidget *widget, CalendarSourceDialog *sdialog)
-{
-
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
- e_source_set_property (sdialog->source, "offline_sync", "1");
- else
- e_source_set_property (sdialog->source, "offline_sync", "0");
-
-}
-
-static GtkWidget *
-eccp_general_offline (EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data)
-{
- CalendarSourceDialog *sdialog = data;
- GtkWidget *offline_setting;
- const char *offline_sync;
- int row;
- gboolean is_local = g_str_has_prefix (e_source_group_peek_base_uri (sdialog->source_group), "file:");
- offline_sync = e_source_get_property (sdialog->source, "offline_sync");
- if (old)
- return old;
- else {
- row = ((GtkTable*)parent)->nrows;
- offline_setting = gtk_check_button_new_with_label (N_("Copy calendar contents locally for offline operation"));
- gtk_widget_show (offline_setting);
- g_signal_connect (offline_setting, "toggled", G_CALLBACK (offline_status_changed_cb), sdialog);
- gtk_table_attach (GTK_TABLE (parent), offline_setting, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
- }
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (offline_setting), (offline_sync && g_str_equal (offline_sync, "1")) ? TRUE : FALSE);
- if (is_local)
- gtk_widget_hide (offline_setting);
- return offline_setting;
-}
-
-static void
-color_changed (GnomeColorPicker *picker, guint r, guint g, guint b, guint a, ECalConfigTargetSource *t)
-{
- ESource *source = t->source;
- e_source_set_color (source, colorpicker_get_color (picker));
-}
-
-static GtkWidget *
-eccp_get_source_color (EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data)
-{
- CalendarSourceDialog *sdialog = data;
- static GtkWidget *label, *picker;
- int row;
- ECalConfigTargetSource *t = (ECalConfigTargetSource *) ec->target;
- ESource *source = t->source;
-
- static guint32 assigned_colors[] = {
- 0xBECEDD, /* 190 206 221 Blue */
- 0xE2F0EF, /* 226 240 239 Light Blue */
- 0xC6E2B7, /* 198 226 183 Green */
- 0xE2F0D3, /* 226 240 211 Light Green */
- 0xE2D4B7, /* 226 212 183 Khaki */
- 0xEAEAC1, /* 234 234 193 Light Khaki */
- 0xF0B8B7, /* 240 184 183 Pink */
- 0xFED4D3, /* 254 212 211 Light Pink */
- 0xE2C6E1, /* 226 198 225 Purple */
- 0xF0E2EF /* 240 226 239 Light Purple */
- };
- GRand *rand = g_rand_new ();
- guint32 color;
-
- if (old)
- gtk_widget_destroy (label);
-
- row = ((GtkTable*)parent)->nrows;
-
- color = assigned_colors[g_rand_int_range (rand, 0, 9)];
- g_rand_free (rand);
-
- label = gtk_label_new_with_mnemonic (_("C_olor:"));
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
- gtk_widget_show (label);
- gtk_table_attach (GTK_TABLE (parent), label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
- picker = gnome_color_picker_new ();
- gtk_widget_show (picker);
- gtk_label_set_mnemonic_widget (GTK_LABEL (label), picker);
- gtk_table_attach (GTK_TABLE (parent), picker, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
- g_signal_connect (G_OBJECT (picker), "color-set", G_CALLBACK (color_changed), t);
-
- if (sdialog->original_source)
- e_source_get_color (sdialog->original_source, &color);
- else
- /* since we don't have an original source here, we want to set
- * the initial color */
- e_source_set_color (sdialog->source, color);
-
- colorpicker_set_color (GNOME_COLOR_PICKER (picker), color);
-
- return picker;
-}
-
-static ECalConfigItem eccp_items[] = {
- { E_CONFIG_BOOK, "", NULL },
- { E_CONFIG_PAGE, "00.general", N_("General") },
- { E_CONFIG_SECTION_TABLE, "00.general/00.source", N_("Calendar") },
- { E_CONFIG_ITEM_TABLE, "00.general/00.source/00.type", NULL, eccp_get_source_type },
- { E_CONFIG_ITEM_TABLE, "00.general/00.source/10.name", NULL, eccp_get_source_name },
- { E_CONFIG_ITEM_TABLE, "00.general/00.source/20.color", NULL, eccp_get_source_color },
- { E_CONFIG_ITEM_TABLE, "00.general/00.source/30.offline", NULL, eccp_general_offline },
- { 0 },
-};
-
-static ECalConfigItem ectp_items[] = {
- { E_CONFIG_BOOK, "", NULL },
- { E_CONFIG_PAGE, "00.general", N_("General") },
- { E_CONFIG_SECTION_TABLE, "00.general/00.source", N_("Tasks List") },
- { E_CONFIG_ITEM_TABLE, "00.general/00.source/00.type", NULL, eccp_get_source_type },
- { E_CONFIG_ITEM_TABLE, "00.general/00.source/10.name", NULL, eccp_get_source_name },
- { E_CONFIG_ITEM_TABLE, "00.general/00.source/20.color", NULL, eccp_get_source_color },
- { E_CONFIG_ITEM_TABLE, "00.general/00.source/30.offline", NULL, eccp_general_offline },
- { 0 },
-};
-
-/**
- * calendar_setup_edit_calendar:
- * @parent: parent window for dialog (current unused)
- * @source: the ESource corresponding to the calendar
- *
- * Show calendar properties for @source.
- **/
-void
-calendar_setup_edit_calendar (struct _GtkWindow *parent, ESource *source, ESourceGroup *group)
-{
- CalendarSourceDialog *sdialog = g_new0 (CalendarSourceDialog, 1);
- char *xml;
- ECalConfig *ec;
- int i;
- GSList *items = NULL;
- ECalConfigTargetSource *target;
-
- if (source) {
- guint32 color;
-
- sdialog->original_source = source;
- g_object_ref (source);
- sdialog->source_group = e_source_peek_group (source);
- xml = e_source_to_standalone_xml (source);
- sdialog->source = e_source_new_from_standalone_xml (xml);
- g_free (xml);
-
- e_source_get_color (source, &color);
- e_source_set_color (sdialog->source, color);
- } else {
- GConfClient *gconf;
- GSList *l;
-
- sdialog->source = e_source_new ("", "");
- gconf = gconf_client_get_default ();
- sdialog->source_list = e_source_list_new_for_gconf (gconf, "/apps/evolution/calendar/sources");
- l = e_source_list_peek_groups (sdialog->source_list);
- sdialog->menu_source_groups = g_slist_copy(l);
-
- sdialog->source_group = (ESourceGroup *)sdialog->menu_source_groups->data;
- g_object_unref (gconf);
- if (group)
- sdialog->source_group = (ESourceGroup *)group;
- }
-
- /* HACK: doesn't work if you don't do this */
- e_source_set_absolute_uri (sdialog->source, NULL);
- e_source_set_group (sdialog->source, sdialog->source_group);
-
- sdialog->config = ec = e_cal_config_new (E_CONFIG_BOOK, "org.gnome.evolution.calendar.calendarProperties");
- for (i = 0; eccp_items[i].path; i++)
- items = g_slist_prepend (items, &eccp_items[i]);
- e_config_add_items ((EConfig *) ec, items, eccp_commit, NULL, eccp_free, sdialog);
- e_config_add_page_check ((EConfig *) ec, NULL, eccp_check_complete, sdialog);
-
- target = e_cal_config_target_new_source (ec, sdialog->source);
- e_config_set_target ((EConfig *) ec, (EConfigTarget *) target);
-
- if (source)
- sdialog->window = e_config_create_window ((EConfig *)ec, NULL, _("Calendar Properties"));
- else
- sdialog->window = e_config_create_window ((EConfig *)ec, NULL, _("New Calendar"));
-
- /* forces initial validation */
- if (!sdialog->original_source)
- e_config_target_changed ((EConfig *)ec, E_CONFIG_TARGET_CHANGED_STATE);
-
- return;
-}
-
-void
-calendar_setup_new_calendar (struct _GtkWindow *parent)
-{
- calendar_setup_edit_calendar (parent, NULL, NULL);
-}
-
-void
-calendar_setup_edit_task_list (struct _GtkWindow *parent, ESource *source)
-{
- CalendarSourceDialog *sdialog = g_new0 (CalendarSourceDialog, 1);
- char *xml;
- ECalConfig *ec;
- int i;
- GSList *items = NULL;
- ECalConfigTargetSource *target;
-
- if (source) {
- guint32 color;
-
- sdialog->original_source = source;
- g_object_ref (source);
- sdialog->source_group = e_source_peek_group (source);
- xml = e_source_to_standalone_xml (source);
- sdialog->source = e_source_new_from_standalone_xml (xml);
- g_free (xml);
-
- e_source_get_color (source, &color);
- e_source_set_color (sdialog->source, color);
- } else {
- GConfClient *gconf;
- GSList *l;
-
- sdialog->source = e_source_new ("", "");
- gconf = gconf_client_get_default ();
- sdialog->source_list = e_source_list_new_for_gconf (gconf, "/apps/evolution/tasks/sources");
- l = e_source_list_peek_groups (sdialog->source_list);
- sdialog->menu_source_groups = g_slist_copy(l);
-
- sdialog->source_group = (ESourceGroup *)sdialog->menu_source_groups->data;
- g_object_unref (gconf);
- }
-
- /* HACK: doesn't work if you don't do this */
- e_source_set_absolute_uri (sdialog->source, NULL);
- e_source_set_group (sdialog->source, sdialog->source_group);
-
- sdialog->config = ec = e_cal_config_new (E_CONFIG_BOOK, "org.gnome.evolution.calendar.calendarProperties");
- for (i = 0; ectp_items[i].path; i++)
- items = g_slist_prepend (items, &ectp_items[i]);
- e_config_add_items ((EConfig *) ec, items, eccp_commit, NULL, eccp_free, sdialog);
- e_config_add_page_check ((EConfig *) ec, NULL, eccp_check_complete, sdialog);
-
- target = e_cal_config_target_new_source (ec, sdialog->source);
- e_config_set_target ((EConfig *) ec, (EConfigTarget *) target);
-
- sdialog->window = e_config_create_window ((EConfig *)ec, NULL, _("Task List Properties"));
-
- /* forces initial validation */
- if (!sdialog->original_source)
- e_config_target_changed ((EConfig *)ec, E_CONFIG_TARGET_CHANGED_STATE);
-
- return;
-}
-
-void
-calendar_setup_new_task_list (struct _GtkWindow *parent)
-{
- calendar_setup_edit_task_list (parent, NULL);
-}
diff --git a/calendar/gui/dialogs/calendar-setup.glade b/calendar/gui/dialogs/calendar-setup.glade
deleted file mode 100644
index be736d5366..0000000000
--- a/calendar/gui/dialogs/calendar-setup.glade
+++ /dev/null
@@ -1,922 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-<requires lib="gnome"/>
-
-<widget class="GtkWindow" id="add-calendar-window">
- <property name="title" translatable="yes">Add Calendar</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="default_width">320</property>
- <property name="default_height">240</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-
- <child>
- <widget class="GtkVBox" id="vbox1">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkTable" id="settings-table">
- <property name="visible">True</property>
- <property name="n_rows">5</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkEntry" id="name-entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">True</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="uri-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_URL:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="refresh-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Refresh:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="refresh-hbox">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">1</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox2">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkSpinButton" id="refresh-spin">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">False</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">30 0 100 1 10 10</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="refresh-optionmenu">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu3">
-
- <child>
- <widget class="GtkMenuItem" id="minutes1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_minutes1_activate" last_modification_time="Tue, 17 Feb 2004 17:39:35 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="hours1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">hours</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_hours1_activate" last_modification_time="Tue, 17 Feb 2004 17:39:35 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="days1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">days</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_days1_activate" last_modification_time="Tue, 17 Feb 2004 17:39:35 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="weeks1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">weeks</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_weeks1_activate" last_modification_time="Tue, 17 Feb 2004 17:39:35 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label35">
- <property name="visible">True</property>
- <property name="label" translatable="yes">C_olor:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">source-color</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="uri-hbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkEntry" id="uri-entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="group-optionmenu">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">-1</property>
-
- <child>
- <widget class="GtkMenu" id="menu1">
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="group-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Type:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">group-optionmenu</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="name-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Name:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">name-entry</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GnomeColorPicker" id="source-color">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="dither">True</property>
- <property name="use_alpha">False</property>
- <property name="title" translatable="yes">Pick a color</property>
- <property name="focus_on_click">True</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHButtonBox" id="hbuttonbox1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
- <property name="spacing">10</property>
-
- <child>
- <widget class="GtkButton" id="cancel-button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="add-button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment1">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child>
- <widget class="GtkImage" id="image1">
- <property name="visible">True</property>
- <property name="stock">gtk-add</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Add Calendar</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-<widget class="GtkWindow" id="add-task-list-window">
- <property name="title" translatable="yes">Add Task List</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="default_width">320</property>
- <property name="default_height">240</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-
- <child>
- <widget class="GtkVBox" id="vbox87">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkTable" id="settings-table">
- <property name="visible">True</property>
- <property name="n_rows">5</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkEntry" id="name-entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="uri-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_URL:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="refresh-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Refresh:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label593">
- <property name="visible">True</property>
- <property name="label" translatable="yes">C_olor:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">source-color</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GnomeColorPicker" id="source-color">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="dither">True</property>
- <property name="use_alpha">False</property>
- <property name="title" translatable="yes">Pick a color</property>
- <property name="focus_on_click">True</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="uri-hbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkEntry" id="uri-entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="group-optionmenu">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">-1</property>
-
- <child>
- <widget class="GtkMenu" id="menu5">
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label594">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Type:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">group-optionmenu</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label595">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Name:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">name-entry</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="refresh-hbox">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">1</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox130">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkSpinButton" id="refresh-spin">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">False</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">30 0 100 1 10 10</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="refresh-optionmenu">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu6">
-
- <child>
- <widget class="GtkMenuItem" id="menuitem7">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_minutes1_activate" last_modification_time="Tue, 17 Feb 2004 17:39:35 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem8">
- <property name="visible">True</property>
- <property name="label" translatable="yes">hours</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_hours1_activate" last_modification_time="Tue, 17 Feb 2004 17:39:35 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem9">
- <property name="visible">True</property>
- <property name="label" translatable="yes">days</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_days1_activate" last_modification_time="Tue, 17 Feb 2004 17:39:35 GMT"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="menuitem10">
- <property name="visible">True</property>
- <property name="label" translatable="yes">weeks</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_weeks1_activate" last_modification_time="Tue, 17 Feb 2004 17:39:35 GMT"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHButtonBox" id="hbuttonbox22">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
- <property name="spacing">10</property>
-
- <child>
- <widget class="GtkButton" id="cancel-button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="add-button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment48">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox129">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child>
- <widget class="GtkImage" id="image12">
- <property name="visible">True</property>
- <property name="stock">gtk-add</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="add-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Add Task List</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/calendar/gui/dialogs/calendar-setup.h b/calendar/gui/dialogs/calendar-setup.h
deleted file mode 100644
index 3e266df93c..0000000000
--- a/calendar/gui/dialogs/calendar-setup.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Authors: David Trowbridge <trowbrds@cs.colorado.edu>
- *
- * Copyright (C) 2004 Novell, Inc (www.novell.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifndef __CALENDAR_SETUP_H__
-#define __CALENDAR_SETUP_H__
-
-struct _GtkWindow;
-struct _ESource;
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif
-
-void calendar_setup_edit_calendar (struct _GtkWindow *parent, struct _ESource *source, struct _ESourceGroup *group);
-void calendar_setup_new_calendar (struct _GtkWindow *parent);
-
-void calendar_setup_edit_task_list (struct _GtkWindow *parent, struct _ESource *source);
-void calendar_setup_new_task_list (struct _GtkWindow *parent);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CALENDAR_SETUP_H__ */
diff --git a/calendar/gui/dialogs/cancel-comp.c b/calendar/gui/dialogs/cancel-comp.c
deleted file mode 100644
index eedd7ce49c..0000000000
--- a/calendar/gui/dialogs/cancel-comp.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/* Evolution calendar - Send calendar component dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include <gtk/gtkmessagedialog.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/gnome-uidefs.h>
-#include <e-util/e-icon-factory.h>
-#include "widgets/misc/e-error.h"
-#include "cancel-comp.h"
-
-
-
-/**
- * cancel_component_dialog:
- *
- * Pops up a dialog box asking the user whether he wants to send a
- * cancel and delete an iTip/iMip message
- *
- * Return value: TRUE if the user clicked Yes, FALSE otherwise.
- **/
-gboolean
-cancel_component_dialog (GtkWindow *parent, ECal *client, ECalComponent *comp, gboolean deleting)
-{
- ECalComponentVType vtype;
- const char *id;
-
- if (deleting && e_cal_get_save_schedules (client))
- return TRUE;
-
- vtype = e_cal_component_get_vtype (comp);
-
- switch (vtype) {
- case E_CAL_COMPONENT_EVENT:
- if (deleting)
- id = "calendar:prompt-cancel-meeting";
- else
- id = "calendar:prompt-delete-meeting";
- break;
-
- case E_CAL_COMPONENT_TODO:
- if (deleting)
- id = "calendar:prompt-cancel-task";
- else
- id = "calendar:prompt-delete-task";
- break;
-
- case E_CAL_COMPONENT_JOURNAL:
- if (deleting)
- id = "calendar:prompt-cancel-journal";
- else
- id = "calendar:prompt-delete-journal";
- break;
-
- default:
- g_message (G_STRLOC ": Cannot handle object of type %d", vtype);
- return FALSE;
- }
-
- if (e_error_run (parent, id, NULL) == GTK_RESPONSE_YES)
- return TRUE;
- else
- return FALSE;
-}
diff --git a/calendar/gui/dialogs/cancel-comp.h b/calendar/gui/dialogs/cancel-comp.h
deleted file mode 100644
index a43f24f2fe..0000000000
--- a/calendar/gui/dialogs/cancel-comp.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Evolution calendar - Send calendar component dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef CANCEL_COMP_H
-#define CANCEL_COMP_H
-
-#include <glib.h>
-#include <libecal/e-cal.h>
-#include <libecal/e-cal-component.h>
-
-gboolean cancel_component_dialog (GtkWindow *parent, ECal *client, ECalComponent *comp, gboolean deleting);
-
-#endif
diff --git a/calendar/gui/dialogs/changed-comp.c b/calendar/gui/dialogs/changed-comp.c
deleted file mode 100644
index a76b123b36..0000000000
--- a/calendar/gui/dialogs/changed-comp.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/* Evolution calendar - Send calendar component dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include <gtk/gtkmessagedialog.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/gnome-uidefs.h>
-#include <e-util/e-icon-factory.h>
-#include "changed-comp.h"
-
-
-
-/**
- * changed_component_dialog:
- * @parent: Parent window for the dialog.
- * @comp: A calendar component
- * @deleted: Whether the object is being deleted or updated
- * @changed: Whether or not the user has made changes
- *
- * Pops up a dialog box asking the user whether changes made (if any)
- * should be thrown away because the item has been updated elsewhere
- *
- * Return value: TRUE if the user clicked Yes, FALSE otherwise.
- **/
-gboolean
-changed_component_dialog (GtkWindow *parent, ECalComponent *comp, gboolean deleted, gboolean changed)
-{
- GtkWidget *dialog;
- ECalComponentVType vtype;
- char *str;
- gint response;
- GList *icon_list;
-
- vtype = e_cal_component_get_vtype (comp);
-
- if (deleted) {
- switch (vtype) {
- case E_CAL_COMPONENT_EVENT:
- str = _("This event has been deleted.");
- break;
-
- case E_CAL_COMPONENT_TODO:
- str = _("This task has been deleted.");
- break;
-
- case E_CAL_COMPONENT_JOURNAL:
- str = _("This journal entry has been deleted.");
- break;
-
- default:
- g_message ("changed_component_dialog(): "
- "Cannot handle object of type %d", vtype);
- return FALSE;
- }
- if (changed)
- str = g_strdup_printf (_("%s You have made changes. Forget those changes and close the editor?"), str);
- else
- str = g_strdup_printf (_("%s You have made no changes, close the editor?"), str);
-
- } else {
- switch (vtype) {
- case E_CAL_COMPONENT_EVENT:
- str = _("This event has been changed.");
- break;
-
- case E_CAL_COMPONENT_TODO:
- str = _("This task has been changed.");
- break;
-
- case E_CAL_COMPONENT_JOURNAL:
- str = _("This journal entry has been changed.");
- break;
-
- default:
- g_message ("changed_component_dialog(): "
- "Cannot handle object of type %d", vtype);
- return FALSE;
- }
- if (changed)
- str = g_strdup_printf (_("%s You have made changes. Forget those changes and update the editor?"), str);
- else
- str = g_strdup_printf (_("%s You have made no changes, update the editor?"), str);
- }
-
- dialog = gtk_message_dialog_new (parent, GTK_DIALOG_MODAL,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_YES_NO, str);
-
- icon_list = e_icon_factory_get_icon_list ("stock_calendar");
- if (icon_list) {
- gtk_window_set_icon_list (GTK_WINDOW (dialog), icon_list);
- g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
- g_list_free (icon_list);
- }
-
- response = gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
-
- if (response == GTK_RESPONSE_YES)
- return TRUE;
- else
- return FALSE;
-}
diff --git a/calendar/gui/dialogs/changed-comp.h b/calendar/gui/dialogs/changed-comp.h
deleted file mode 100644
index f029f3388e..0000000000
--- a/calendar/gui/dialogs/changed-comp.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Evolution calendar - Changed calendar component dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef CHANGED_COMP_H
-#define CHANGED_COMP_H
-
-#include <glib.h>
-#include <gtk/gtkwindow.h>
-#include <libecal/e-cal-component.h>
-
-gboolean changed_component_dialog (GtkWindow *window, ECalComponent *comp, gboolean deleted, gboolean changed);
-
-#endif
diff --git a/calendar/gui/dialogs/comp-editor-page.c b/calendar/gui/dialogs/comp-editor-page.c
deleted file mode 100644
index 2d656060e7..0000000000
--- a/calendar/gui/dialogs/comp-editor-page.c
+++ /dev/null
@@ -1,471 +0,0 @@
-/* Evolution calendar - Base class for calendar component editor pages
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtksignal.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <libgnomeui/gnome-dialog-util.h>
-#include "comp-editor-page.h"
-
-
-
-static void comp_editor_page_class_init (CompEditorPageClass *class);
-static void comp_editor_page_init (CompEditorPage *page);
-static void comp_editor_page_destroy (GtkObject *object);
-
-static GtkObjectClass *parent_class = NULL;
-
-/* Signal IDs */
-
-enum {
- CHANGED,
- NEEDS_SEND,
- SUMMARY_CHANGED,
- DATES_CHANGED,
- CLIENT_CHANGED,
- LAST_SIGNAL
-};
-
-static guint comp_editor_page_signals[LAST_SIGNAL];
-
-#define CLASS(page) (COMP_EDITOR_PAGE_CLASS (G_OBJECT_GET_CLASS (page)))
-
-
-
-/**
- * comp_editor_page_get_type:
- *
- * Registers the #CompEditorPage class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the #CompEditorPage class.
- **/
-GtkType
-comp_editor_page_get_type (void)
-{
- static GtkType comp_editor_page_type = 0;
-
- if (!comp_editor_page_type) {
- static const GtkTypeInfo comp_editor_page_info = {
- "CompEditorPage",
- sizeof (CompEditorPage),
- sizeof (CompEditorPageClass),
- (GtkClassInitFunc) comp_editor_page_class_init,
- (GtkObjectInitFunc) comp_editor_page_init,
- NULL, /* reserved_1 */
- NULL, /* reserved_2 */
- (GtkClassInitFunc) NULL
- };
-
- comp_editor_page_type =
- gtk_type_unique (GTK_TYPE_OBJECT,
- &comp_editor_page_info);
- }
-
- return comp_editor_page_type;
-}
-
-/* Class initialization function for the abstract editor page */
-static void
-comp_editor_page_class_init (CompEditorPageClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *) class;
-
- parent_class = g_type_class_ref(GTK_TYPE_OBJECT);
-
- comp_editor_page_signals[CHANGED] =
- g_signal_new ("changed",
- G_TYPE_FROM_CLASS (class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (CompEditorPageClass, changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
- comp_editor_page_signals[NEEDS_SEND] =
- g_signal_new ("needs_send",
- G_TYPE_FROM_CLASS (class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (CompEditorPageClass, needs_send),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
- comp_editor_page_signals[SUMMARY_CHANGED] =
- g_signal_new ("summary_changed",
- G_TYPE_FROM_CLASS (class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (CompEditorPageClass, summary_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
-
- comp_editor_page_signals[DATES_CHANGED] =
- g_signal_new ("dates_changed",
- G_TYPE_FROM_CLASS (class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (CompEditorPageClass, dates_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
-
- comp_editor_page_signals[CLIENT_CHANGED] =
- g_signal_new ("client_changed",
- G_TYPE_FROM_CLASS (class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (CompEditorPageClass, client_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1, G_TYPE_OBJECT);
-
- class->changed = NULL;
- class->summary_changed = NULL;
- class->dates_changed = NULL;
-
- class->get_widget = NULL;
- class->focus_main_widget = NULL;
- class->fill_widgets = NULL;
- class->fill_component = NULL;
- class->fill_timezones = NULL;
- class->set_summary = NULL;
- class->set_dates = NULL;
-
- object_class->destroy = comp_editor_page_destroy;
-}
-
-
-
-static void
-comp_editor_page_init (CompEditorPage *page)
-{
- page->client = NULL;
- page->accel_group = NULL;
-}
-
-
-static void
-comp_editor_page_destroy (GtkObject *object)
-{
- CompEditorPage *page;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (object));
-
- page = COMP_EDITOR_PAGE (object);
-
- if (page->client) {
- g_object_unref (page->client);
- page->client = NULL;
- }
-
- if (page->accel_group) {
- gtk_accel_group_unref (page->accel_group);
- page->accel_group = NULL;
- }
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-/**
- * comp_editor_page_get_widget:
- * @page: An editor page.
- *
- * Queries the main widget of an editor page.
- *
- * Return value: The widget that is the page's upper container. It should
- * normally be inserted in a notebook widget.
- **/
-GtkWidget *
-comp_editor_page_get_widget (CompEditorPage *page)
-{
- g_return_val_if_fail (page != NULL, NULL);
- g_return_val_if_fail (IS_COMP_EDITOR_PAGE (page), NULL);
-
- g_assert (CLASS (page)->get_widget != NULL);
- return (* CLASS (page)->get_widget) (page);
-}
-
-/**
- * comp_editor_page_focus_main_widget:
- * @page: An editor page.
- *
- * Makes an editor page focus its main widget. This is used by the component
- * editor when it first pops up so that it can focus the main widget in the
- * first page.
- **/
-void
-comp_editor_page_focus_main_widget (CompEditorPage *page)
-{
- g_return_if_fail (page != NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
- g_assert (CLASS (page)->focus_main_widget != NULL);
- (* CLASS (page)->focus_main_widget) (page);
-}
-
-/**
- * comp_editor_page_fill_widgets:
- * @page: An editor page.
- * @comp: A calendar component.
- *
- * Fills the widgets of an editor page with the data from a calendar component.
- **/
-gboolean
-comp_editor_page_fill_widgets (CompEditorPage *page, ECalComponent *comp)
-{
- g_return_val_if_fail (IS_COMP_EDITOR_PAGE (page), FALSE);
- g_return_val_if_fail (E_IS_CAL_COMPONENT (comp), FALSE);
-
- g_assert (CLASS (page)->fill_widgets != NULL);
- return (* CLASS (page)->fill_widgets) (page, comp);
-}
-
-/**
- * comp_editor_page_fill_component:
- * @page: An editor page.
- * @comp: A calendar component.
- *
- * Takes the data from the widgets of an editor page and sets it on a calendar
- * component, replacing the contents of the properties that the editor page
- * knows how to manipulate.
- *
- * Returns: TRUE if the component could be filled, FALSE otherwise
- **/
-gboolean
-comp_editor_page_fill_component (CompEditorPage *page, ECalComponent *comp)
-{
- g_return_val_if_fail (page != NULL, FALSE);
- g_return_val_if_fail (IS_COMP_EDITOR_PAGE (page), FALSE);
- g_return_val_if_fail (comp != NULL, FALSE);
-
- if (CLASS (page)->fill_component != NULL)
- return (* CLASS (page)->fill_component) (page, comp);
-
- return TRUE;
-}
-
-/**
- * comp_editor_page_fill_timezones:
- * @page: An editor page.
- * @timezones: Hash table to which timezones will be added.
- *
- * Fills the given hash table with all the timezones used by the dates in the
- * specific editor page.
- *
- * Returns: TRUE if the timezones were added, FALSE otherwise.
- */
-gboolean
-comp_editor_page_fill_timezones (CompEditorPage *page, GHashTable *timezones)
-{
- g_return_val_if_fail (IS_COMP_EDITOR_PAGE (page), FALSE);
- g_return_val_if_fail (timezones != NULL, FALSE);
-
- if (CLASS (page)->fill_timezones != NULL)
- return (* CLASS (page)->fill_timezones) (page, timezones);
-
- return TRUE;
-}
-
-/**
- * comp_editor_page_set_e_cal:
- * @page: An editor page
- * @client: A #ECal object
- *
- * Sets the #ECal for the dialog page to use.
- **/
-void
-comp_editor_page_set_e_cal (CompEditorPage *page, ECal *client)
-{
- g_return_if_fail (page != NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
- if (client == page->client)
- return;
-
- if (page->client)
- g_object_unref (page->client);
-
- page->client = client;
- if (page->client)
- g_object_ref (client);
-}
-
-/**
- * comp_editor_page_set_summary:
- * @page: An editor page
- * @summary: The text of the new summary value
- *
- * Sets the summary value for this group of widgets
- **/
-void
-comp_editor_page_set_summary (CompEditorPage *page, const char *summary)
-{
- g_return_if_fail (page != NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
- if (CLASS (page)->set_summary != NULL)
- (* CLASS (page)->set_summary) (page, summary);
-}
-
-/**
- * comp_editor_page_set_dates:
- * @page: An editor page
- * @dates: A collection of various dates in time_t format
- *
- * Sets the date values for this group of widgets
- **/
-void
-comp_editor_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates)
-{
- g_return_if_fail (page != NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
- if (CLASS (page)->set_dates != NULL)
- (* CLASS (page)->set_dates) (page, dates);
-}
-
-/**
- * comp_editor_page_notify_changed:
- * @page: An editor page.
- *
- * Makes an editor page emit the "changed" signal. This is meant to be
- * used only by page implementations.
- **/
-void
-comp_editor_page_notify_changed (CompEditorPage *page)
-{
- g_return_if_fail (page != NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
- gtk_signal_emit (GTK_OBJECT (page), comp_editor_page_signals[CHANGED]);
-}
-
-/**
- * comp_editor_page_notify_needs_send:
- * @page:
- *
- *
- **/
-void
-comp_editor_page_notify_needs_send (CompEditorPage *page)
-{
- g_return_if_fail (page != NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
- gtk_signal_emit (GTK_OBJECT (page), comp_editor_page_signals[NEEDS_SEND]);
-}
-
-/**
- * comp_editor_page_notify_summary_changed:
- * @page: An editor page.
- *
- * Makes an editor page emit the "summary_changed" signal. This is meant to be
- * used only by page implementations.
- **/
-void
-comp_editor_page_notify_summary_changed (CompEditorPage *page,
- const char *summary)
-{
- g_return_if_fail (page != NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
-
- gtk_signal_emit (GTK_OBJECT (page),
- comp_editor_page_signals[SUMMARY_CHANGED],
- summary);
-}
-
-/**
- * comp_editor_page_notify_dates_changed:
- * @page: An editor page.
- *
- * Makes an editor page emit the "dates_changed" signal. This is meant to be
- * used only by page implementations.
- **/
-void
-comp_editor_page_notify_dates_changed (CompEditorPage *page,
- CompEditorPageDates *dates)
-{
- g_return_if_fail (page != NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
- gtk_signal_emit (GTK_OBJECT (page),
- comp_editor_page_signals[DATES_CHANGED],
- dates);
-}
-
-/**
- * comp_editor_page_notify_client_changed:
- * @page: An editor page.
- *
- * Makes an editor page emit the "client_changed" signal. This is meant to be
- * used only by page implementations.
- **/
-void
-comp_editor_page_notify_client_changed (CompEditorPage *page,
- ECal *client)
-{
- g_return_if_fail (page != NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
- comp_editor_page_set_e_cal (page, client);
- gtk_signal_emit (GTK_OBJECT (page),
- comp_editor_page_signals[CLIENT_CHANGED],
- client);
-}
-
-/**
- * comp_editor_page_display_validation_error:
- * @page: An editor page.
- * @msg: Error message to display.
- * @field: Widget that caused the validation error.
- *
- * Displays an error message about a validation problem in the
- * given field. Once the error message has been displayed, the
- * focus is set to the widget that caused the validation error.
- */
-void
-comp_editor_page_display_validation_error (CompEditorPage *page,
- const char *msg,
- GtkWidget *field)
-{
- GtkWidget *dialog;
- char *real_msg;
-
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
- g_return_if_fail (msg != NULL);
- g_return_if_fail (GTK_IS_WIDGET (field));
-
- real_msg = g_strdup_printf (_("Validation error: %s"), msg);
- dialog = gnome_error_dialog (real_msg);
- gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
-
- gtk_widget_grab_focus (field);
-
- g_free (real_msg);
-}
diff --git a/calendar/gui/dialogs/comp-editor-page.h b/calendar/gui/dialogs/comp-editor-page.h
deleted file mode 100644
index 2b3c6c60ab..0000000000
--- a/calendar/gui/dialogs/comp-editor-page.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/* Evolution calendar - Base class for calendar component editor pages
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef COMP_EDITOR_PAGE_H
-#define COMP_EDITOR_PAGE_H
-
-#include <time.h>
-#include <gtk/gtkwidget.h>
-#include <libecal/e-cal-component.h>
-#include <libecal/e-cal.h>
-
-G_BEGIN_DECLS
-
-
-
-#define TYPE_COMP_EDITOR_PAGE (comp_editor_page_get_type ())
-#define COMP_EDITOR_PAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_COMP_EDITOR_PAGE, CompEditorPage))
-#define COMP_EDITOR_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_COMP_EDITOR_PAGE, CompEditorPageClass))
-#define IS_COMP_EDITOR_PAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_COMP_EDITOR_PAGE))
-#define IS_COMP_EDITOR_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TYPE_COMP_EDITOR_PAGE))
-
-typedef struct {
- ECalComponentDateTime *start;
- ECalComponentDateTime *end;
- ECalComponentDateTime *due;
- struct icaltimetype *complete;
-} CompEditorPageDates;
-
-typedef struct {
- GtkObject object;
-
- /* Some of the pages need the ECal to access timezone data. Also,
- * the event page needs to know it to fill the source option menu. */
- ECal *client;
-
- /* The GtkAccelGroup for the page. We install this when the page is
- mapped, and uninstall when it is unmapped. libglade would do this
- normally, but we create our pages individually so have to do it
- ourselves. */
- GtkAccelGroup *accel_group;
-} CompEditorPage;
-
-typedef struct {
- GtkObjectClass parent_class;
-
- /* Notification signals */
-
- void (* changed) (CompEditorPage *page);
- void (* needs_send) (CompEditorPage *page);
-
- void (* summary_changed) (CompEditorPage *page, const char *summary);
- void (* dates_changed) (CompEditorPage *page, const char *dates);
- void (* client_changed) (CompEditorPage *page, ECal *client);
-
- /* Virtual methods */
-
- GtkWidget *(* get_widget) (CompEditorPage *page);
- void (* focus_main_widget) (CompEditorPage *page);
-
- gboolean (* fill_widgets) (CompEditorPage *page, ECalComponent *comp);
- gboolean (* fill_component) (CompEditorPage *page, ECalComponent *comp);
- gboolean (* fill_timezones) (CompEditorPage *page, GHashTable *timezones);
-
- void (* set_summary) (CompEditorPage *page, const char *summary);
- void (* set_dates) (CompEditorPage *page, CompEditorPageDates *dates);
-} CompEditorPageClass;
-
-
-GtkType comp_editor_page_get_type (void);
-GtkWidget *comp_editor_page_get_widget (CompEditorPage *page);
-void comp_editor_page_focus_main_widget (CompEditorPage *page);
-gboolean comp_editor_page_fill_widgets (CompEditorPage *page,
- ECalComponent *comp);
-gboolean comp_editor_page_fill_component (CompEditorPage *page,
- ECalComponent *comp);
-gboolean comp_editor_page_fill_timezones (CompEditorPage *page,
- GHashTable *timezones);
-void comp_editor_page_set_e_cal (CompEditorPage *page,
- ECal *client);
-void comp_editor_page_set_summary (CompEditorPage *page,
- const char *summary);
-void comp_editor_page_set_dates (CompEditorPage *page,
- CompEditorPageDates *dates);
-void comp_editor_page_notify_changed (CompEditorPage *page);
-void comp_editor_page_notify_needs_send (CompEditorPage *page);
-void comp_editor_page_notify_summary_changed (CompEditorPage *page,
- const char *summary);
-void comp_editor_page_notify_dates_changed (CompEditorPage *page,
- CompEditorPageDates *dates);
-void comp_editor_page_notify_client_changed (CompEditorPage *page,
- ECal *client);
-void comp_editor_page_display_validation_error (CompEditorPage *page,
- const char *msg,
- GtkWidget *field);
-
-
-
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/dialogs/comp-editor-util.c b/calendar/gui/dialogs/comp-editor-util.c
deleted file mode 100644
index 2383f760e0..0000000000
--- a/calendar/gui/dialogs/comp-editor-util.c
+++ /dev/null
@@ -1,349 +0,0 @@
-/* Evolution calendar - Widget utilities
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <ctype.h>
-#include <string.h>
-#include <libical/ical.h>
-#include <glib.h>
-#include <gtk/gtklabel.h>
-#include <libgnome/gnome-i18n.h>
-#include <bonobo-activation/bonobo-activation.h>
-#include <bonobo/bonobo-control.h>
-#include <bonobo/bonobo-widget.h>
-#include <e-util/e-time-utils.h>
-#include <libecal/e-cal-time-util.h>
-#include "../calendar-config.h"
-#include "../e-date-edit-config.h"
-#include "comp-editor-util.h"
-
-
-
-/**
- * comp_editor_dates:
- * @dates: A structure to be filled out with dates of a component
- * @comp: The component to extract the dates from
- *
- * Extracts the dates from the calendar component into the
- * CompEditorPageDates structure. Call comp_editor_free_dates() to free the
- * results.
- **/
-void
-comp_editor_dates (CompEditorPageDates *dates, ECalComponent *comp)
-{
- ECalComponentDateTime dt;
-
- dates->start = NULL;
- dates->end = NULL;
- dates->due = NULL;
- dates->complete = NULL;
-
- /* Note that the ECalComponentDateTime's returned contain allocated
- icaltimetype and tzid values, so we just take over ownership of
- those. */
- e_cal_component_get_dtstart (comp, &dt);
- if (dt.value) {
- dates->start = g_new (ECalComponentDateTime, 1);
- *dates->start = dt;
- }
-
- e_cal_component_get_dtend (comp, &dt);
- if (dt.value) {
- dates->end = g_new (ECalComponentDateTime, 1);
- *dates->end = dt;
- }
-
- e_cal_component_get_due (comp, &dt);
- if (dt.value) {
- dates->due = g_new (ECalComponentDateTime, 1);
- *dates->due = dt;
- }
-
- e_cal_component_get_completed (comp, &dates->complete);
-}
-
-
-/* This frees the dates in the CompEditorPageDates struct. But it doesn't free
- * the struct (as that is usually static).
- */
-void
-comp_editor_free_dates (CompEditorPageDates *dates)
-{
- /* Note that e_cal_component_free_datetime() only frees the fields in
- the struct. It doesn't free the struct itself, so we do that. */
- if (dates->start) {
- e_cal_component_free_datetime (dates->start);
- g_free (dates->start);
- }
-
- if (dates->end) {
- e_cal_component_free_datetime (dates->end);
- g_free (dates->end);
- }
-
- if (dates->due) {
- e_cal_component_free_datetime (dates->due);
- g_free (dates->due);
- }
-
- if (dates->complete)
- e_cal_component_free_icaltimetype (dates->complete);
-}
-
-
-/* dtstart is only passed in if tt is the dtend. */
-static void
-write_label_piece (struct icaltimetype *tt, char *buffer, int size,
- char *stext, char *etext, struct icaltimetype *dtstart)
-{
- struct tm tmp_tm = { 0 };
- struct icaltimetype tt_copy = *tt;
- int len;
-
- /* FIXME: May want to convert the time to an appropriate zone. */
-
- if (stext != NULL)
- strcat (buffer, stext);
-
- /* If we are writing the DTEND (i.e. DTSTART is set), and
- DTEND > DTSTART, subtract 1 day. The DTEND date is not inclusive. */
- if (tt_copy.is_date && dtstart
- && icaltime_compare_date_only (tt_copy, *dtstart) > 0) {
- icaltime_adjust (&tt_copy, -1, 0, 0, 0);
- }
-
- tmp_tm.tm_year = tt_copy.year - 1900;
- tmp_tm.tm_mon = tt_copy.month - 1;
- tmp_tm.tm_mday = tt_copy.day;
- tmp_tm.tm_hour = tt_copy.hour;
- tmp_tm.tm_min = tt_copy.minute;
- tmp_tm.tm_sec = tt_copy.second;
- tmp_tm.tm_isdst = -1;
-
- tmp_tm.tm_wday = time_day_of_week (tt_copy.day, tt_copy.month - 1,
- tt_copy.year);
-
- len = strlen (buffer);
- e_time_format_date_and_time (&tmp_tm,
- calendar_config_get_24_hour_format (),
- !tt_copy.is_date, FALSE,
- &buffer[len], size - len);
- if (etext != NULL)
- strcat (buffer, etext);
-}
-
-/**
- * comp_editor_date_label:
- * @dates: The dates to use in constructing a label
- * @label: The label whose text is to be set
- *
- * Set the text of a label based on the dates available and the user's
- * formatting preferences
- **/
-void
-comp_editor_date_label (CompEditorPageDates *dates, GtkWidget *label)
-{
- char buffer[1024];
- gboolean start_set = FALSE, end_set = FALSE;
- gboolean complete_set = FALSE, due_set = FALSE;
-
- buffer[0] = '\0';
-
- if (dates->start && !icaltime_is_null_time (*dates->start->value))
- start_set = TRUE;
- if (dates->end && !icaltime_is_null_time (*dates->end->value))
- end_set = TRUE;
- if (dates->complete && !icaltime_is_null_time (*dates->complete))
- complete_set = TRUE;
- if (dates->due && !icaltime_is_null_time (*dates->due->value))
- due_set = TRUE;
-
- if (start_set)
- write_label_piece (dates->start->value, buffer, 1024,
- NULL, NULL, NULL);
-
- if (start_set && end_set)
- write_label_piece (dates->end->value, buffer, 1024,
- _(" to "), NULL, dates->start->value);
-
- if (complete_set) {
- if (start_set)
- write_label_piece (dates->complete, buffer, 1024, _(" (Completed "), ")", NULL);
- else
- write_label_piece (dates->complete, buffer, 1024, _("Completed "), NULL, NULL);
- }
-
- if (due_set && dates->complete == NULL) {
- if (start_set)
- write_label_piece (dates->due->value, buffer, 1024, _(" (Due "), ")", NULL);
- else
- write_label_piece (dates->due->value, buffer, 1024, _("Due "), NULL, NULL);
- }
-
- gtk_label_set_text (GTK_LABEL (label), buffer);
-}
-
-static void
-date_edit_destroy_cb (EDateEdit *date_edit, gpointer data)
-{
- EDateEditConfig *config = data;
-
- g_object_unref (config);
-}
-
-/**
- * comp_editor_new_date_edit:
- * @show_date: Whether to show a date picker in the widget.
- * @show_time: Whether to show a time picker in the widget.
- * @make_time_insensitive: Whether the time field is made insensitive rather
- * than hiding it. This is useful if you want to preserve the layout of the
- * widgets.
- *
- * Creates a new #EDateEdit widget, configured using the calendar's preferences.
- *
- * Return value: A newly-created #EDateEdit widget.
- **/
-GtkWidget *
-comp_editor_new_date_edit (gboolean show_date, gboolean show_time,
- gboolean make_time_insensitive)
-{
- EDateEdit *dedit;
- EDateEditConfig *config;
-
- dedit = E_DATE_EDIT (e_date_edit_new ());
-
- e_date_edit_set_show_date (dedit, show_date);
- e_date_edit_set_show_time (dedit, show_time);
-#if 0
- e_date_edit_set_make_time_insensitive (dedit, make_time_insensitive);
-#else
- e_date_edit_set_make_time_insensitive (dedit, FALSE);
-#endif
-
- config = e_date_edit_config_new (dedit);
- g_signal_connect (G_OBJECT (dedit), "destroy", G_CALLBACK (date_edit_destroy_cb), config);
-
- return GTK_WIDGET (dedit);
-}
-
-
-/* Returns the current time, for EDateEdit widgets and ECalendar items in the
- dialogs.
- FIXME: Should probably use the timezone from somewhere in the component
- rather than the current timezone. */
-struct tm
-comp_editor_get_current_time (GtkObject *object, gpointer data)
-{
- icaltimezone *zone;
- struct icaltimetype tt;
- struct tm tmp_tm = { 0 };
-
- /* Get the current timezone. */
- zone = calendar_config_get_icaltimezone ();
-
- tt = icaltime_from_timet_with_zone (time (NULL), FALSE, zone);
-
- /* Now copy it to the struct tm and return it. */
- tmp_tm.tm_year = tt.year - 1900;
- tmp_tm.tm_mon = tt.month - 1;
- tmp_tm.tm_mday = tt.day;
- tmp_tm.tm_hour = tt.hour;
- tmp_tm.tm_min = tt.minute;
- tmp_tm.tm_sec = tt.second;
- tmp_tm.tm_isdst = -1;
-
- return tmp_tm;
-}
-
-
-
-/**
- * comp_editor_strip_categories:
- * @categories: A string of category names entered by the user.
- *
- * Takes a string of the form "categ, categ, categ, ..." and removes the
- * whitespace between categories to result in "categ,categ,categ,..."
- *
- * Return value: The category names stripped of surrounding whitespace
- * and separated with commas.
- **/
-char *
-comp_editor_strip_categories (const char *categories)
-{
- char *new_categories;
- const char *start, *end;
- const char *p;
- char *new_p;
-
- if (!categories)
- return NULL;
-
- new_categories = g_new (char, strlen (categories) + 1);
-
- start = end = NULL;
- new_p = new_categories;
-
- for (p = categories; *p; p++) {
- int c;
-
- c = *p;
-
- if (isspace (c))
- continue;
- else if (c == ',') {
- int len;
-
- if (!start)
- continue;
-
- g_assert (start <= end);
-
- len = end - start + 1;
- strncpy (new_p, start, len);
- new_p[len] = ',';
- new_p += len + 1;
-
- start = end = NULL;
- } else {
- if (!start) {
- start = p;
- end = p;
- } else
- end = p;
- }
- }
-
- if (start) {
- int len;
-
- g_assert (start <= end);
-
- len = end - start + 1;
- strncpy (new_p, start, len);
- new_p += len;
- }
-
- *new_p = '\0';
-
- return new_categories;
-}
diff --git a/calendar/gui/dialogs/comp-editor-util.h b/calendar/gui/dialogs/comp-editor-util.h
deleted file mode 100644
index 078cd6508c..0000000000
--- a/calendar/gui/dialogs/comp-editor-util.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Evolution calendar - Widget utilities
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Author: JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef _COMP_EDITOR_UTIL_H_
-#define _COMP_EDITOR_UTIL_H_
-
-#include <gtk/gtkwidget.h>
-#include "comp-editor-page.h"
-
-void comp_editor_dates (CompEditorPageDates *date, ECalComponent *comp);
-void comp_editor_free_dates (CompEditorPageDates *dates);
-
-void comp_editor_date_label (CompEditorPageDates *dates, GtkWidget *label);
-
-GtkWidget *comp_editor_new_date_edit (gboolean show_date, gboolean show_time,
- gboolean make_time_insensitive);
-
-struct tm comp_editor_get_current_time (GtkObject *object, gpointer data);
-
-
-char *comp_editor_strip_categories (const char *categories);
-
-#endif
diff --git a/calendar/gui/dialogs/comp-editor.c b/calendar/gui/dialogs/comp-editor.c
deleted file mode 100644
index 6a2be0a6c5..0000000000
--- a/calendar/gui/dialogs/comp-editor.c
+++ /dev/null
@@ -1,1679 +0,0 @@
-/* Evolution calendar - Framework for a calendar component editor dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <glib.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtkstock.h>
-#include <libgnome/libgnome.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/gnome-uidefs.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <libgnomeui/gnome-dialog-util.h>
-#include <libgnomeui/gnome-messagebox.h>
-#include <e-util/e-dialog-utils.h>
-#include <e-util/e-icon-factory.h>
-#include <evolution-shell-component-utils.h>
-#include "../print.h"
-#include "../comp-util.h"
-#include "save-comp.h"
-#include "delete-comp.h"
-#include "send-comp.h"
-#include "changed-comp.h"
-#include "cancel-comp.h"
-#include "recur-comp.h"
-#include "comp-editor.h"
-
-#include "cal-attachment-bar.h"
-#include "widgets/misc/e-expander.h"
-
-
-
-
-
-/* Private part of the CompEditor structure */
-struct _CompEditorPrivate {
- /* Client to use */
- ECal *client;
-
- /* Source client (where comp lives currently) */
- ECal *source_client;
-
- /* View to listen for changes */
- ECalView *view;
-
- /* Calendar object/uid we are editing; this is an internal copy */
- ECalComponent *comp;
-
- /* The pages we have */
- GList *pages;
-
- /* Notebook to hold the pages */
- GtkNotebook *notebook;
-
- /* Attachment handling */
- GtkWidget *attachment_bar;
- GtkWidget *attachment_scrolled_window;
- GtkWidget *attachment_expander;
- GtkWidget *attachment_expander_label;
- GtkWidget *attachment_expander_icon;
- GtkWidget *attachment_expander_num;
-
- guint32 attachment_bar_visible : 1;
-
-
- gboolean changed;
- gboolean needs_send;
-
- CalObjModType mod;
-
- gboolean existing_org;
- gboolean user_org;
- gboolean is_group_item;
-
- gboolean warned;
-};
-
-
-
-static gint comp_editor_key_press_event (GtkWidget *d, GdkEventKey *e);
-static void comp_editor_finalize (GObject *object);
-
-static void real_set_e_cal (CompEditor *editor, ECal *client);
-static void real_edit_comp (CompEditor *editor, ECalComponent *comp);
-static gboolean real_send_comp (CompEditor *editor, ECalComponentItipMethod method);
-static gboolean prompt_to_save_changes (CompEditor *editor, gboolean send);
-static void delete_comp (CompEditor *editor);
-static void close_dialog (CompEditor *editor);
-
-static void page_changed_cb (GtkObject *obj, gpointer data);
-static void needs_send_cb (GtkObject *obj, gpointer data);
-static void page_summary_changed_cb (GtkObject *obj, const char *summary, gpointer data);
-static void page_dates_changed_cb (GtkObject *obj, CompEditorPageDates *dates, gpointer data);
-
-static void obj_modified_cb (ECal *client, GList *objs, gpointer data);
-static void obj_removed_cb (ECal *client, GList *uids, gpointer data);
-
-G_DEFINE_TYPE (CompEditor, comp_editor, GTK_TYPE_DIALOG);
-
-/* Class initialization function for the calendar component editor */
-static void
-comp_editor_class_init (CompEditorClass *klass)
-{
- GObjectClass *object_class;
- GtkWidgetClass *widget_class;
-
- object_class = G_OBJECT_CLASS (klass);
- widget_class = GTK_WIDGET_CLASS (klass);
-
- klass->set_e_cal = real_set_e_cal;
- klass->edit_comp = real_edit_comp;
- klass->send_comp = real_send_comp;
-
- widget_class->key_press_event = comp_editor_key_press_event;
- object_class->finalize = comp_editor_finalize;
-}
-
-static void
-listen_for_changes (CompEditor *editor)
-{
- CompEditorPrivate *priv;
- const char *uid = NULL;
-
- priv = editor->priv;
-
- /* Discard change listener */
- if (priv->view) {
- g_signal_handlers_disconnect_matched (G_OBJECT (priv->view),
- G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL,
- editor);
-
- g_object_unref (priv->view);
- priv->view = NULL;
- }
-
- /* Listen for changes */
- if (priv->comp)
- e_cal_component_get_uid (priv->comp, &uid);
-
- if (uid) {
- char *query;
-
- query = g_strdup_printf ("(uid? \"%s\")", uid);
- e_cal_get_query (priv->source_client, query, &priv->view, NULL);
- g_free (query);
- }
-
- if (priv->view) {
- g_signal_connect (priv->view, "objects_modified",
- G_CALLBACK (obj_modified_cb), editor);
-
- g_signal_connect((priv->view), "objects_removed",
- G_CALLBACK (obj_removed_cb), editor);
-
- e_cal_view_start (priv->view);
- }
-}
-
-/* This sets the focus to the toplevel, so any field being edited is committed.
- FIXME: In future we may also want to check some of the fields are valid,
- e.g. the EDateEdit fields. */
-static void
-commit_all_fields (CompEditor *editor)
-{
- CompEditorPrivate *priv;
-
- priv = editor->priv;
-
- gtk_window_set_focus (GTK_WINDOW (editor), NULL);
-}
-
-static void
-send_timezone (gpointer key, gpointer value, gpointer user_data)
-{
- icaltimezone *zone = value;
- CompEditor *editor = user_data;
-
- e_cal_add_timezone (editor->priv->client, zone, NULL);
-}
-
-static gboolean
-save_comp (CompEditor *editor)
-{
- CompEditorPrivate *priv;
- ECalComponent *clone;
- GList *l;
- gboolean result;
- GError *error = NULL;
- GHashTable *timezones;
- const char *orig_uid;
-
- priv = editor->priv;
-
- if (!priv->changed)
- return TRUE;
-
- /* Stop listening because we are about to change things */
- if (priv->view) {
- g_signal_handlers_disconnect_matched (G_OBJECT (priv->view),
- G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL,
- editor);
-
- g_object_unref (priv->view);
- priv->view = NULL;
- }
-
- /* Update on the server */
- timezones = g_hash_table_new (g_str_hash, g_str_equal);
-
- clone = e_cal_component_clone (priv->comp);
- for (l = priv->pages; l != NULL; l = l->next) {
- if (!comp_editor_page_fill_component (l->data, clone)) {
- g_object_unref (clone);
- g_hash_table_destroy (timezones);
- comp_editor_show_page (editor, COMP_EDITOR_PAGE (l->data));
- return FALSE;
- }
-
- /* retrieve all timezones */
- comp_editor_page_fill_timezones (l->data, timezones);
- }
-
- /* If we are not the organizer, we don't update the sequence number */
- if (!e_cal_component_has_organizer (clone) || itip_organizer_is_user (clone, priv->client))
- e_cal_component_commit_sequence (clone);
- else
- e_cal_component_abort_sequence (clone);
-
- g_object_unref (priv->comp);
- priv->comp = clone;
-
- e_cal_component_get_uid (priv->comp, &orig_uid);
-
- /* send timezones */
- g_hash_table_foreach (timezones, (GHFunc) send_timezone, editor);
- g_hash_table_destroy (timezones);
-
- /* Attachments*/
-
- e_cal_component_set_attachment_list (priv->comp,
- cal_attachment_bar_get_attachment_list ((CalAttachmentBar *) priv->attachment_bar));
-
- /* send the component to the server */
- if (!cal_comp_is_on_server (priv->comp, priv->client)) {
- result = e_cal_create_object (priv->client, e_cal_component_get_icalcomponent (priv->comp), NULL, &error);
- } else {
- result = e_cal_modify_object (priv->client, e_cal_component_get_icalcomponent (priv->comp), priv->mod, &error);
- }
-
- if (!result) {
- GtkWidget *dlg;
- char *msg;
-
- msg = g_strdup (error ? error->message : _("Could not update object"));
-
- dlg = gnome_error_dialog (msg);
- gnome_dialog_run_and_close (GNOME_DIALOG (dlg));
-
- g_free (msg);
- if (error)
- g_error_free (error);
-
- return FALSE;
- } else {
- if (priv->source_client &&
- !e_source_equal (e_cal_get_source (priv->client),
- e_cal_get_source (priv->source_client)) &&
- cal_comp_is_on_server (priv->comp, priv->source_client)) {
- /* Comp found a new home. Remove it from old one. */
- e_cal_remove_object (priv->source_client, orig_uid, NULL);
-
- /* Let priv->source_client point to new home, so we can move it
- * again this session. */
- g_object_unref (priv->source_client);
- priv->source_client = g_object_ref (priv->client);
-
- listen_for_changes (editor);
- }
-
- priv->changed = FALSE;
- }
-
- return TRUE;
-}
-
-static gboolean
-save_comp_with_send (CompEditor *editor)
-{
- CompEditorPrivate *priv;
- gboolean send;
-
- priv = editor->priv;
-
- send = priv->changed && priv->needs_send;
-
- if (!save_comp (editor))
- return FALSE;
-
- if (send && send_component_dialog ((GtkWindow *) editor, priv->client, priv->comp, !priv->existing_org)) {
- if (itip_organizer_is_user (priv->comp, priv->client))
- return comp_editor_send_comp (editor, E_CAL_COMPONENT_METHOD_REQUEST);
- else
- return comp_editor_send_comp (editor, E_CAL_COMPONENT_METHOD_REPLY);
- }
-
- return TRUE;
-}
-
-static gboolean
-prompt_to_save_changes (CompEditor *editor, gboolean send)
-{
- CompEditorPrivate *priv;
- gboolean read_only;
-
- priv = editor->priv;
-
- if (!priv->changed)
- return TRUE;
-
- if (!e_cal_is_read_only (priv->client, &read_only, NULL) || read_only)
- return TRUE;
-
- switch (save_component_dialog (GTK_WINDOW(editor), priv->comp)) {
- case GTK_RESPONSE_YES: /* Save */
- if (e_cal_component_is_instance (priv->comp))
- if (!recur_component_dialog (priv->client, priv->comp, &priv->mod, GTK_WINDOW (editor)))
- return FALSE;
-
- if (send && save_comp_with_send (editor))
- return TRUE;
- else if (!send && save_comp (editor))
- return TRUE;
- else
- return FALSE;
- case GTK_RESPONSE_NO: /* Discard */
- return TRUE;
- case GTK_RESPONSE_CANCEL: /* Cancel */
- default:
- return FALSE;
- }
-}
-
-static void
-response_cb (GtkWidget *widget, int response, gpointer data)
-{
- CompEditor *editor = COMP_EDITOR (data);
- CompEditorPrivate *priv;
- ECalComponentText text;
-
- priv = editor->priv;
-
- switch (response) {
- case GTK_RESPONSE_OK:
- commit_all_fields (editor);
-
- if (e_cal_component_is_instance (priv->comp))
- if (!recur_component_dialog (priv->client, priv->comp, &priv->mod, GTK_WINDOW (editor)))
- return;
-
- if (save_comp_with_send (editor)) {
-
- e_cal_component_get_summary (priv->comp, &text);
-
- if (!text.value) {
- if (!send_component_prompt_subject ((GtkWindow *) editor, priv->client, priv->comp))
- return;
- }
- close_dialog (editor);
- }
-
- break;
- case GTK_RESPONSE_CANCEL:
- commit_all_fields (editor);
-
- if (prompt_to_save_changes (editor, TRUE))
- close_dialog (editor);
- break;
- default:
- /* We handle delete event below */
- break;
- }
-}
-
-static int
-delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
-{
- CompEditor *editor = COMP_EDITOR (data);
- CompEditorPrivate *priv;
- ECalComponentText text;
-
- priv = editor->priv;
-
- commit_all_fields (editor);
-
- if (prompt_to_save_changes (editor, TRUE))
- close_dialog (editor);
-
- return TRUE;
-}
-
-static void
-attachment_bar_changed_cb (CalAttachmentBar *bar,
- void *data)
-{
- CompEditor *editor = COMP_EDITOR (data);
-
- guint attachment_num = cal_attachment_bar_get_num_attachments (
- CAL_ATTACHMENT_BAR (editor->priv->attachment_bar));
- if (attachment_num) {
- gchar *num_text = g_strdup_printf (
- ngettext ("<b>%d</b> File Attached", "<b>%d</b> Files Attached", attachment_num),
- attachment_num);
- gtk_label_set_markup (GTK_LABEL (editor->priv->attachment_expander_num),
- num_text);
- g_free (num_text);
-
- gtk_widget_show (editor->priv->attachment_expander_icon);
-
- } else {
- gtk_label_set_text (GTK_LABEL (editor->priv->attachment_expander_num), "");
- gtk_widget_hide (editor->priv->attachment_expander_icon);
- }
-
-
- /* Mark the editor as changed so it prompts about unsaved
- changes on close */
- comp_editor_set_changed (editor, TRUE);
-
-}
-
-static void
-attachment_bar_icon_clicked_cb (CalAttachmentBar *bar, void *data)
-{
- GnomeIconList *icon_list;
- GList *p;
- int num;
- char *attach_file_url;
- GError *error = NULL;
-
- icon_list = GNOME_ICON_LIST (bar);
- p = gnome_icon_list_get_selection (icon_list);
- if (p) {
- num = GPOINTER_TO_INT (p->data);
- attach_file_url = cal_attachment_bar_get_nth_attachment_filename (bar, num);
- /* launch the url now */
- /* TODO should send GError and handle error conditions
- * here */
- gnome_url_show (attach_file_url, &error);
- if (error)
- g_message ("DEBUG: Launch failed :(\n");
- g_free (attach_file_url); }
-}
-
-static void
-attachment_expander_activate_cb (EExpander *expander,
- void *data)
-{
- CompEditor *editor = COMP_EDITOR (data);
- gboolean show = e_expander_get_expanded (expander);
-
- /* Update the expander label */
- if (show)
- gtk_label_set_text_with_mnemonic (GTK_LABEL (editor->priv->attachment_expander_label),
- _("Hide _Attachment Bar (drop attachments here)"));
- else
- gtk_label_set_text_with_mnemonic (GTK_LABEL (editor->priv->attachment_expander_label),
- _("Show _Attachment Bar (drop attachments here)"));
-
-}
-
-/* Creates the basic in the editor */
-static void
-setup_widgets (CompEditor *editor)
-{
- CompEditorPrivate *priv;
- GtkWidget *expander_hbox, *vbox;
- GdkPixbuf *attachment_pixbuf;
-
- priv = editor->priv;
-
- /* Useful vbox */
- vbox = gtk_vbox_new (FALSE, 12);
- gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editor)->vbox), vbox, TRUE, TRUE, 0);
- gtk_widget_show (vbox);
-
- /* Notebook */
- priv->notebook = GTK_NOTEBOOK (gtk_notebook_new ());
- gtk_widget_show (GTK_WIDGET (priv->notebook));
- gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (priv->notebook),
- TRUE, TRUE, 0);
-
- /* Buttons */
- gtk_dialog_add_button (GTK_DIALOG (editor), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
- gtk_dialog_add_button (GTK_DIALOG (editor), GTK_STOCK_OK, GTK_RESPONSE_OK);
- gtk_dialog_set_response_sensitive (GTK_DIALOG (editor), GTK_RESPONSE_OK, FALSE);
-
- g_signal_connect (editor, "response", G_CALLBACK (response_cb), editor);
- g_signal_connect (editor, "delete_event", G_CALLBACK (delete_event_cb), editor);
-
- /*Attachments */
- priv->attachment_scrolled_window = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (priv->attachment_scrolled_window),
- GTK_SHADOW_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->attachment_scrolled_window),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-
- priv->attachment_bar = cal_attachment_bar_new (NULL);
- GTK_WIDGET_SET_FLAGS (priv->attachment_bar, GTK_CAN_FOCUS);
- gtk_container_add (GTK_CONTAINER (priv->attachment_scrolled_window),
- priv->attachment_bar);
- gtk_widget_show (priv->attachment_bar);
- g_signal_connect (priv->attachment_bar, "changed",
- G_CALLBACK (attachment_bar_changed_cb), editor);
- g_signal_connect (GNOME_ICON_LIST (priv->attachment_bar), "button-release-event",
- G_CALLBACK (attachment_bar_icon_clicked_cb), NULL);
- priv->attachment_expander_label =
- gtk_label_new_with_mnemonic (_("Show _Attachment Bar (drop attachments here)"));
- priv->attachment_expander_num = gtk_label_new ("");
- gtk_label_set_use_markup (GTK_LABEL (priv->attachment_expander_num), TRUE);
- gtk_misc_set_alignment (GTK_MISC (priv->attachment_expander_label), 0.0, 0.5);
- gtk_misc_set_alignment (GTK_MISC (priv->attachment_expander_num), 1.0, 0.5);
- expander_hbox = gtk_hbox_new (FALSE, 0);
-
- attachment_pixbuf = e_icon_factory_get_icon ("stock_attach", E_ICON_SIZE_MENU);
- priv->attachment_expander_icon = gtk_image_new_from_pixbuf (attachment_pixbuf);
- gtk_misc_set_alignment (GTK_MISC (priv->attachment_expander_icon), 1, 0.5);
- gtk_widget_set_size_request (priv->attachment_expander_icon, 100, -1);
- g_object_unref (attachment_pixbuf);
-
- gtk_box_pack_start (GTK_BOX (expander_hbox), priv->attachment_expander_label,
- TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (expander_hbox), priv->attachment_expander_icon,
- TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (expander_hbox), priv->attachment_expander_num,
- TRUE, TRUE, 0);
- gtk_widget_show_all (expander_hbox);
- gtk_widget_hide (priv->attachment_expander_icon);
-
- priv->attachment_expander = e_expander_new ("");
- e_expander_set_label_widget (E_EXPANDER (priv->attachment_expander), expander_hbox);
-
- gtk_container_add (GTK_CONTAINER (priv->attachment_expander),
- priv->attachment_scrolled_window);
- gtk_box_pack_start (GTK_BOX (vbox), priv->attachment_expander,
- FALSE, FALSE, GNOME_PAD_SMALL);
- gtk_widget_show (priv->attachment_expander);
- e_expander_set_expanded (E_EXPANDER (priv->attachment_expander), FALSE);
- g_signal_connect_after (priv->attachment_expander, "activate",
- G_CALLBACK (attachment_expander_activate_cb), editor);
-
-
-}
-
-/* Object initialization function for the calendar component editor */
-static void
-comp_editor_init (CompEditor *editor)
-{
- CompEditorPrivate *priv;
-
- priv = g_new0 (CompEditorPrivate, 1);
- editor->priv = priv;
-
- setup_widgets (editor);
-
- priv->pages = NULL;
- priv->changed = FALSE;
- priv->needs_send = FALSE;
- priv->mod = CALOBJ_MOD_ALL;
- priv->existing_org = FALSE;
- priv->user_org = FALSE;
- priv->warned = FALSE;
- priv->is_group_item = FALSE;
-
- gtk_window_set_type_hint (GTK_WINDOW (editor), GDK_WINDOW_TYPE_HINT_NORMAL);
- gtk_dialog_set_has_separator (GTK_DIALOG (editor), FALSE);
-
- gtk_widget_ensure_style (GTK_WIDGET (editor));
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (editor)->vbox), 0);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (editor)->action_area), 12);
-}
-
-
-static gint
-comp_editor_key_press_event (GtkWidget *d, GdkEventKey *e)
-{
-#if 0
- if (e->keyval == GDK_Escape) {
- if (prompt_to_save_changes (COMP_EDITOR (d), TRUE))
- close_dialog (COMP_EDITOR (d));
- return TRUE;
- }
-#endif
-
- if (GTK_WIDGET_CLASS (comp_editor_parent_class)->key_press_event)
- return (* GTK_WIDGET_CLASS (comp_editor_parent_class)->key_press_event) (d, e);
-
- return FALSE;
-}
-
-/* Destroy handler for the calendar component editor */
-static void
-comp_editor_finalize (GObject *object)
-{
- CompEditor *editor;
- CompEditorPrivate *priv;
- GList *l;
-
- editor = COMP_EDITOR (object);
- priv = editor->priv;
-
- if (priv->client) {
- g_object_unref (priv->client);
- priv->client = NULL;
- }
-
- if (priv->source_client) {
- g_object_unref (priv->source_client);
- priv->source_client = NULL;
- }
-
- if (priv->view) {
- g_signal_handlers_disconnect_matched (G_OBJECT (priv->view),
- G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL,
- editor);
-
- g_object_unref (priv->view);
- priv->view = NULL;
- }
-
- /* We want to destroy the pages after the widgets get destroyed,
- since they have lots of signal handlers connected to the widgets
- with the pages as the data. */
- for (l = priv->pages; l != NULL; l = l->next)
- g_object_unref (l->data);
-
- if (priv->comp) {
- g_object_unref (priv->comp);
- priv->comp = NULL;
- }
-
- g_free (priv);
- editor->priv = NULL;
-
- if (G_OBJECT_CLASS (comp_editor_parent_class)->finalize)
- (* G_OBJECT_CLASS (comp_editor_parent_class)->finalize) (object);
-}
-
-
-static void
-delete_comp (CompEditor *editor)
-{
- CompEditorPrivate *priv;
- const char *uid;
-
- priv = editor->priv;
-
- e_cal_component_get_uid (priv->comp, &uid);
- e_cal_remove_object (priv->client, uid, NULL);
- close_dialog (editor);
-}
-
-/* Closes the dialog box and emits the appropriate signals */
-static void
-close_dialog (CompEditor *editor)
-{
- CompEditorPrivate *priv;
-
- priv = editor->priv;
-
- /* FIXME Unfortunately we do this here because otherwise corba
- calls happen during destruction and we might get a change
- notification back when we are in an inconsistent state */
- if (priv->view)
- g_signal_handlers_disconnect_matched (G_OBJECT (priv->view),
- G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, editor);
-
- gtk_widget_destroy (GTK_WIDGET (editor));
-}
-
-
-
-void
-comp_editor_set_existing_org (CompEditor *editor, gboolean existing_org)
-{
- CompEditorPrivate *priv;
-
- g_return_if_fail (editor != NULL);
- g_return_if_fail (IS_COMP_EDITOR (editor));
-
- priv = editor->priv;
-
- priv->existing_org = existing_org;
-}
-
-gboolean
-comp_editor_get_existing_org (CompEditor *editor)
-{
- CompEditorPrivate *priv;
-
- g_return_val_if_fail (editor != NULL, FALSE);
- g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE);
-
- priv = editor->priv;
-
- return priv->existing_org;
-}
-
-void
-comp_editor_set_user_org (CompEditor *editor, gboolean user_org)
-{
- CompEditorPrivate *priv;
-
- g_return_if_fail (editor != NULL);
- g_return_if_fail (IS_COMP_EDITOR (editor));
-
- priv = editor->priv;
-
- priv->user_org = user_org;
-}
-
-gboolean
-comp_editor_get_user_org (CompEditor *editor)
-{
- CompEditorPrivate *priv;
-
- g_return_val_if_fail (editor != NULL, FALSE);
- g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE);
-
- priv = editor->priv;
-
- return priv->user_org;
-}
-
-void
-comp_editor_set_group_item (CompEditor *editor, gboolean group_item)
-{
- CompEditorPrivate *priv;
-
- g_return_if_fail (editor != NULL);
- g_return_if_fail (IS_COMP_EDITOR (editor));
-
- priv = editor->priv;
-
- priv->is_group_item = group_item;
-}
-
-gboolean
-comp_editor_get_is_group_item (CompEditor *editor)
-{
- CompEditorPrivate *priv;
-
- g_return_val_if_fail (editor != NULL, FALSE);
- g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE);
-
- priv = editor->priv;
-
- return priv->is_group_item;
-}
-
-/**
- * comp_editor_set_changed:
- * @editor: A component editor
- * @changed: Value to set the changed state to
- *
- * Set the dialog changed state to the given value
- **/
-void
-comp_editor_set_changed (CompEditor *editor, gboolean changed)
-{
- CompEditorPrivate *priv;
-
- priv = editor->priv;
-
- priv->changed = changed;
-
- gtk_dialog_set_response_sensitive (GTK_DIALOG (editor), GTK_RESPONSE_OK, changed);
- gtk_dialog_set_default_response (GTK_DIALOG (editor), GTK_RESPONSE_OK);
-}
-
-/**
- * comp_editor_get_changed:
- * @editor: A component editor
- *
- * Gets the changed state of the dialog
- *
- * Return value: A boolean indicating if the dialog is in a changed
- * state
- **/
-gboolean
-comp_editor_get_changed (CompEditor *editor)
-{
- CompEditorPrivate *priv;
-
- priv = editor->priv;
-
- return priv->changed;
-}
-
-/**
- * comp_editor_set_needs_send:
- * @editor: A component editor
- * @needs_send: Value to set the needs send state to
- *
- * Set the dialog needs send state to the given value
- **/
-void
-comp_editor_set_needs_send (CompEditor *editor, gboolean needs_send)
-{
- CompEditorPrivate *priv;
-
- priv = editor->priv;
-
- priv->needs_send = needs_send;
-}
-
-/**
- * comp_editor_get_needs_send:
- * @editor: A component editor
- *
- * Gets the needs send state of the dialog
- *
- * Return value: A boolean indicating if the dialog is in a needs send
- * state
- **/
-gboolean
-comp_editor_get_needs_send (CompEditor *editor)
-{
- CompEditorPrivate *priv;
-
- priv = editor->priv;
-
- return priv->needs_send;
-}
-
-static void page_mapped_cb (GtkWidget *page_widget,
- CompEditorPage *page)
-{
- GtkWidget *toplevel;
-
- toplevel = gtk_widget_get_toplevel (page_widget);
- if (!GTK_IS_WINDOW (toplevel))
- return;
-
- if (page->accel_group) {
- gtk_window_add_accel_group (GTK_WINDOW (toplevel),
- page->accel_group);
- }
-}
-
-static void page_unmapped_cb (GtkWidget *page_widget,
- CompEditorPage *page)
-{
- GtkWidget *toplevel;
-
- toplevel = gtk_widget_get_toplevel (page_widget);
- if (!GTK_IS_WINDOW (toplevel))
- return;
-
- if (page->accel_group) {
- gtk_window_remove_accel_group (GTK_WINDOW (toplevel),
- page->accel_group);
- }
-}
-
-/**
- * comp_editor_append_page:
- * @editor: A component editor
- * @page: A component editor page
- * @label: Label of the page
- *
- * Appends a page to the editor notebook with the given label
- **/
-void
-comp_editor_append_page (CompEditor *editor,
- CompEditorPage *page,
- const char *label)
-{
- CompEditorPrivate *priv;
- GtkWidget *page_widget;
- GtkWidget *label_widget;
- gboolean is_first_page;
-
- g_return_if_fail (editor != NULL);
- g_return_if_fail (IS_COMP_EDITOR (editor));
- g_return_if_fail (page != NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
- g_return_if_fail (label != NULL);
-
- priv = editor->priv;
-
- g_object_ref (page);
-
- /* If we are editing something, fill the widgets with current info */
- if (priv->comp != NULL) {
- ECalComponent *comp;
-
- comp = comp_editor_get_current_comp (editor);
- comp_editor_page_fill_widgets (page, comp);
- g_object_unref (comp);
- }
-
- page_widget = comp_editor_page_get_widget (page);
- g_assert (page_widget != NULL);
-
- label_widget = gtk_label_new (label);
-
- is_first_page = (priv->pages == NULL);
-
- priv->pages = g_list_append (priv->pages, page);
- gtk_notebook_append_page (priv->notebook, page_widget, label_widget);
-
- /* Listen for things happening on the page */
- g_signal_connect(page, "changed",
- G_CALLBACK (page_changed_cb), editor);
- g_signal_connect(page, "needs_send",
- G_CALLBACK (needs_send_cb), editor);
- g_signal_connect(page, "summary_changed",
- G_CALLBACK (page_summary_changed_cb), editor);
- g_signal_connect(page, "dates_changed",
- G_CALLBACK (page_dates_changed_cb), editor);
-
- /* Listen for when the page is mapped/unmapped so we can
- install/uninstall the appropriate GtkAccelGroup. */
- g_signal_connect((page_widget), "map",
- G_CALLBACK (page_mapped_cb), page);
- g_signal_connect((page_widget), "unmap",
- G_CALLBACK (page_unmapped_cb), page);
-
- /* The first page is the main page of the editor, so we ask it to focus
- * its main widget.
- */
- if (is_first_page)
- comp_editor_page_focus_main_widget (page);
-}
-
-/**
- * comp_editor_remove_page:
- * @editor: A component editor
- * @page: A component editor page
- *
- * Removes the page from the component editor
- **/
-void
-comp_editor_remove_page (CompEditor *editor, CompEditorPage *page)
-{
- CompEditorPrivate *priv;
- GtkWidget *page_widget;
- gint page_num;
-
- g_return_if_fail (editor != NULL);
- g_return_if_fail (IS_COMP_EDITOR (editor));
- g_return_if_fail (page != NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
- priv = editor->priv;
-
- page_widget = comp_editor_page_get_widget (page);
- page_num = gtk_notebook_page_num (priv->notebook, page_widget);
- if (page_num == -1)
- return;
-
- /* Disconnect all the signals added in append_page(). */
- g_signal_handlers_disconnect_matched (page, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, editor);
- g_signal_handlers_disconnect_matched (page_widget, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, page);
-
- gtk_notebook_remove_page (priv->notebook, page_num);
-
- priv->pages = g_list_remove (priv->pages, page);
- g_object_unref (page);
-}
-
-/**
- * comp_editor_show_page:
- * @editor:
- * @page:
- *
- *
- **/
-void
-comp_editor_show_page (CompEditor *editor, CompEditorPage *page)
-{
- CompEditorPrivate *priv;
- GtkWidget *page_widget;
- gint page_num;
-
- g_return_if_fail (editor != NULL);
- g_return_if_fail (IS_COMP_EDITOR (editor));
- g_return_if_fail (page != NULL);
- g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
- priv = editor->priv;
-
- page_widget = comp_editor_page_get_widget (page);
- page_num = gtk_notebook_page_num (priv->notebook, page_widget);
- gtk_notebook_set_page (priv->notebook, page_num);
-}
-
-/**
- * comp_editor_set_e_cal:
- * @editor: A component editor
- * @client: The calendar client to use
- *
- * Sets the calendar client used by the editor to update components
- **/
-void
-comp_editor_set_e_cal (CompEditor *editor, ECal *client)
-{
- CompEditorClass *klass;
-
- g_return_if_fail (editor != NULL);
- g_return_if_fail (IS_COMP_EDITOR (editor));
-
- klass = COMP_EDITOR_CLASS (G_OBJECT_GET_CLASS (editor));
-
- if (klass->set_e_cal)
- klass->set_e_cal (editor, client);
-}
-
-/**
- * comp_editor_get_e_cal:
- * @editor: A component editor
- *
- * Returns the calendar client of the editor
- *
- * Return value: The calendar client of the editor
- **/
-ECal *
-comp_editor_get_e_cal (CompEditor *editor)
-{
- CompEditorPrivate *priv;
-
- g_return_val_if_fail (editor != NULL, NULL);
- g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL);
-
- priv = editor->priv;
-
- return priv->client;
-}
-
-/* Creates an appropriate title for the event editor dialog */
-static char *
-make_title_from_comp (ECalComponent *comp, gboolean is_group_item)
-{
- char *title;
- const char *type_string;
- ECalComponentVType type;
- ECalComponentText text;
-
- if (!comp)
- return g_strdup (_("Edit Appointment"));
-
- type = e_cal_component_get_vtype (comp);
- switch (type) {
- case E_CAL_COMPONENT_EVENT:
- if (is_group_item)
- type_string = _("Meeting - %s");
- else
- type_string = _("Appointment - %s");
- break;
- case E_CAL_COMPONENT_TODO:
- if (is_group_item)
- type_string = _("Assigned Task - %s");
- else
- type_string = _("Task - %s");
- break;
- case E_CAL_COMPONENT_JOURNAL:
- type_string = _("Journal entry - %s");
- break;
- default:
- g_message ("make_title_from_comp(): Cannot handle object of type %d", type);
- return NULL;
- }
-
- e_cal_component_get_summary (comp, &text);
- if (text.value) {
- title = g_strdup_printf (type_string, text.value);
- } else {
- title = g_strdup_printf (type_string, _("No summary"));
- }
-
- return title;
-}
-
-/* Creates an appropriate title for the event editor dialog */
-static char *
-make_title_from_string (ECalComponent *comp, const char *str, gboolean is_group_item)
-{
- char *title;
- const char *type_string;
- ECalComponentVType type;
-
- if (!comp)
- return g_strdup (_("Edit Appointment"));
-
- type = e_cal_component_get_vtype (comp);
- switch (type) {
- case E_CAL_COMPONENT_EVENT:
- if (is_group_item)
- type_string = _("Meeting - %s");
- else
- type_string = _("Appointment - %s");
- break;
- case E_CAL_COMPONENT_TODO:
- if (is_group_item)
- type_string = _("Assigned Task - %s");
- else
- type_string = _("Task - %s");
- break;
- case E_CAL_COMPONENT_JOURNAL:
- type_string = _("Journal entry - %s");
- break;
- default:
- g_message ("make_title_from_string(): Cannot handle object of type %d", type);
- return NULL;
- }
-
- if (str) {
- title = g_strdup_printf (type_string, str);
- } else {
- title = g_strdup_printf (type_string, _("No summary"));
- }
-
- return title;
-}
-
-static const char *
-make_icon_from_comp (ECalComponent *comp)
-{
- ECalComponentVType type;
-
- if (!comp)
- return "stock_calendar";
-
- type = e_cal_component_get_vtype (comp);
- switch (type) {
- case E_CAL_COMPONENT_EVENT:
- return "stock_new-appointment";
- break;
- case E_CAL_COMPONENT_TODO:
- return "stock_task";
- break;
- default:
- return "stock_calendar";
- }
-}
-
-/* Sets the event editor's window title from a calendar component */
-static void
-set_title_from_comp (CompEditor *editor)
-{
- CompEditorPrivate *priv;
- char *title;
-
- priv = editor->priv;
- title = make_title_from_comp (priv->comp, priv->is_group_item);
- gtk_window_set_title (GTK_WINDOW (editor), title);
- g_free (title);
-}
-
-static void
-set_title_from_string (CompEditor *editor, const char *str)
-{
- CompEditorPrivate *priv;
- char *title;
-
- priv = editor->priv;
- title = make_title_from_string (priv->comp, str, priv->is_group_item);
- gtk_window_set_title (GTK_WINDOW (editor), title);
- g_free (title);
-}
-
-static void
-set_icon_from_comp (CompEditor *editor)
-{
- CompEditorPrivate *priv;
- const char *icon_name;
- GList *icon_list;
-
- priv = editor->priv;
- icon_name = make_icon_from_comp (priv->comp);
-
- icon_list = e_icon_factory_get_icon_list (icon_name);
- if (icon_list) {
- gtk_window_set_icon_list (GTK_WINDOW (editor), icon_list);
- g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
- g_list_free (icon_list);
- }
-}
-
-static void
-fill_widgets (CompEditor *editor)
-{
- CompEditorPrivate *priv;
- GList *l;
-
- priv = editor->priv;
-
- /*Check if attachments are available here and set them*/
- if (e_cal_component_has_attachments (priv->comp)) {
- GSList *attachment_list = NULL;
- e_cal_component_get_attachment_list (priv->comp, &attachment_list);
- cal_attachment_bar_set_attachment_list
- ((CalAttachmentBar *)priv->attachment_bar, attachment_list);
- e_expander_set_expanded (E_EXPANDER (priv->attachment_expander), TRUE);
- }
-
- for (l = priv->pages; l != NULL; l = l->next)
- comp_editor_page_fill_widgets (l->data, priv->comp);
-}
-
-static void
-real_set_e_cal (CompEditor *editor, ECal *client)
-{
- CompEditorPrivate *priv;
- GList *elem;
-
- g_return_if_fail (editor != NULL);
- g_return_if_fail (IS_COMP_EDITOR (editor));
-
- priv = editor->priv;
-
- if (client == priv->client)
- return;
-
- if (client) {
- g_return_if_fail (E_IS_CAL (client));
- g_return_if_fail (e_cal_get_load_state (client) ==
- E_CAL_LOAD_LOADED);
- g_object_ref (client);
- }
-
- if (priv->client)
- g_object_unref (priv->client);
-
- priv->client = client;
- if (!priv->source_client)
- priv->source_client = g_object_ref (client);
-
- /* Pass the client to any pages that need it. */
- for (elem = priv->pages; elem; elem = elem->next)
- comp_editor_page_set_e_cal (elem->data, client);
-}
-
-static void
-real_edit_comp (CompEditor *editor, ECalComponent *comp)
-{
- CompEditorPrivate *priv;
- const char *uid;
-
- g_return_if_fail (editor != NULL);
- g_return_if_fail (IS_COMP_EDITOR (editor));
-
- priv = editor->priv;
-
- if (priv->comp) {
- g_object_unref (priv->comp);
- priv->comp = NULL;
- }
-
- if (comp)
- priv->comp = e_cal_component_clone (comp);
-
- priv->existing_org = e_cal_component_has_organizer (comp);
- priv->user_org = itip_organizer_is_user (comp, priv->client);
- priv->warned = FALSE;
-
- set_title_from_comp (editor);
- set_icon_from_comp (editor);
- e_cal_component_get_uid (comp, &uid);
- cal_attachment_bar_set_local_attachment_store (priv->attachment_bar,
- e_cal_get_local_attachment_store (priv->client));
- cal_attachment_bar_set_comp_uid (priv->attachment_bar, g_strdup (uid));
-
- fill_widgets (editor);
-
- listen_for_changes (editor);
-}
-
-
-static gboolean
-real_send_comp (CompEditor *editor, ECalComponentItipMethod method)
-{
- CompEditorPrivate *priv;
- ECalComponent *tmp_comp;
-
- g_return_val_if_fail (editor != NULL, FALSE);
- g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE);
-
- priv = editor->priv;
-
- if (!e_cal_component_has_attachments (priv->comp)) {
- if (itip_send_comp (method, priv->comp, priv->client,
- NULL, NULL)) {
- tmp_comp = priv->comp;
- g_object_ref (tmp_comp);
- comp_editor_edit_comp (editor, tmp_comp);
- g_object_unref (tmp_comp);
-
- comp_editor_set_changed (editor, TRUE);
- save_comp (editor);
-
- return TRUE;
- }
-
- } else {
- /* Clone the component with attachments set to CID:... */
- ECalComponent *send_comp;
- int num_attachments, i;
- GSList *attach_list = NULL;
- GSList *mime_attach_list;
-
- send_comp = e_cal_component_clone (priv->comp);
- num_attachments = e_cal_component_get_num_attachments (send_comp);
-
- for (i = 0; i < num_attachments ; i++) {
- attach_list = g_slist_append (attach_list, g_strdup ("CID:..."));
- }
- e_cal_component_set_attachment_list (send_comp, attach_list);
-
- /* mime_attach_list is freed by itip_send_comp */
- mime_attach_list = comp_editor_get_mime_attach_list (editor);
- if (itip_send_comp (method, send_comp, priv->client,
- NULL, mime_attach_list)) {
- tmp_comp = priv->comp;
- g_object_ref (tmp_comp);
- comp_editor_edit_comp (editor, tmp_comp);
- g_object_unref (tmp_comp);
-
- comp_editor_set_changed (editor, TRUE);
- save_comp (editor);
- g_object_unref (send_comp);
- return TRUE;
- }
- g_object_unref (send_comp);
- }
-
- comp_editor_set_changed (editor, TRUE);
-
- return FALSE;
-
-}
-
-
-/**
- * comp_editor_edit_comp:
- * @editor: A component editor
- * @comp: A calendar component
- *
- * Starts the editor editing the given component
- **/
-void
-comp_editor_edit_comp (CompEditor *editor, ECalComponent *comp)
-{
- CompEditorClass *klass;
-
- g_return_if_fail (editor != NULL);
- g_return_if_fail (IS_COMP_EDITOR (editor));
- g_return_if_fail (comp != NULL);
- g_return_if_fail (E_IS_CAL_COMPONENT (comp));
-
- klass = COMP_EDITOR_CLASS (G_OBJECT_GET_CLASS (editor));
-
- if (klass->edit_comp)
- klass->edit_comp (editor, comp);
-}
-
-ECalComponent *
-comp_editor_get_comp (CompEditor *editor)
-{
- CompEditorPrivate *priv;
-
- g_return_val_if_fail (editor != NULL, NULL);
- g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL);
-
- priv = editor->priv;
-
- return priv->comp;
-}
-
-ECalComponent *
-comp_editor_get_current_comp (CompEditor *editor)
-{
- CompEditorPrivate *priv;
- ECalComponent *comp;
- GList *l;
-
- g_return_val_if_fail (editor != NULL, NULL);
- g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL);
-
- priv = editor->priv;
-
- comp = e_cal_component_clone (priv->comp);
- if (priv->changed) {
- for (l = priv->pages; l != NULL; l = l->next)
- comp_editor_page_fill_component (l->data, comp);
- }
-
- return comp;
-}
-
-/**
- * comp_editor_save_comp:
- * @editor:
- *
- *
- **/
-gboolean
-comp_editor_save_comp (CompEditor *editor, gboolean send)
-{
- return prompt_to_save_changes (editor, send);
-}
-
-/**
- * comp_editor_delete_comp:
- * @editor:
- *
- *
- **/
-void
-comp_editor_delete_comp (CompEditor *editor)
-{
- delete_comp (editor);
-}
-
-/**
- * comp_editor_send_comp:
- * @editor:
- * @method:
- *
- *
- **/
-gboolean
-comp_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method)
-{
- CompEditorClass *klass;
-
- g_return_val_if_fail (editor != NULL, FALSE);
- g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE);
-
- klass = COMP_EDITOR_CLASS (G_OBJECT_GET_CLASS (editor));
-
- if (klass->send_comp)
- return klass->send_comp (editor, method);
-
- return FALSE;
-}
-
-gboolean
-comp_editor_close (CompEditor *editor)
-{
- gboolean close;
-
- g_return_val_if_fail (editor != NULL, FALSE);
- g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE);
-
- commit_all_fields (editor);
-
- close = prompt_to_save_changes (editor, TRUE);
- if (close)
- close_dialog (editor);
-
- return close;
-}
-
-
-/* Utility function to get the mime-attachment list from the attachment
- * bar for sending the comp via itip. The list and its contents must
- * be freed by the caller.
- */
-GSList *
-comp_editor_get_mime_attach_list (CompEditor *editor)
-{
- GSList *mime_attach_list;
-
- mime_attach_list = cal_attachment_bar_get_mime_attach_list
- ((CalAttachmentBar *)editor->priv->attachment_bar);
-
- return mime_attach_list;
-}
-
-/* Brings attention to a window by raising it and giving it focus */
-static void
-raise_and_focus (GtkWidget *widget)
-{
- g_assert (GTK_WIDGET_REALIZED (widget));
- gdk_window_show (widget->window);
- gtk_widget_grab_focus (widget);
-}
-
-/**
- * comp_editor_focus:
- * @editor: A component editor
- *
- * Brings the editor window to the front and gives it focus
- **/
-void
-comp_editor_focus (CompEditor *editor)
-{
- CompEditorPrivate *priv;
-
- g_return_if_fail (editor != NULL);
- g_return_if_fail (IS_COMP_EDITOR (editor));
-
- priv = editor->priv;
-
- gtk_widget_show (GTK_WIDGET (editor));
- raise_and_focus (GTK_WIDGET (editor));
-}
-
-/**
- * comp_editor_notify_client_changed:
- * @editor: A component editor.
- *
- * Makes an editor emit the "client_changed" signal.
- **/
-void
-comp_editor_notify_client_changed (CompEditor *editor, ECal *client)
-{
- GList *l;
- CompEditorPrivate *priv;
- gboolean read_only;
-
- g_return_if_fail (editor != NULL);
- g_return_if_fail (IS_COMP_EDITOR (editor));
-
- priv = editor->priv;
-
- priv->changed = TRUE;
-
- comp_editor_set_e_cal (editor, client);
- for (l = priv->pages; l != NULL; l = l->next)
- comp_editor_page_notify_client_changed (COMP_EDITOR_PAGE (l->data), client);
-
- if (!e_cal_is_read_only (client, &read_only, NULL))
- read_only = TRUE;
-
- gtk_dialog_set_response_sensitive (GTK_DIALOG (editor), GTK_RESPONSE_OK, !read_only);
-}
-
-static void
-page_changed_cb (GtkObject *obj, gpointer data)
-{
- CompEditor *editor = COMP_EDITOR (data);
- CompEditorPrivate *priv;
-
- priv = editor->priv;
-
- comp_editor_set_changed (editor, TRUE);
-
- if (!priv->warned && priv->existing_org && !priv->user_org) {
- e_notice (editor, GTK_MESSAGE_INFO,
- _("Changes made to this item may be discarded if an update arrives"));
- priv->warned = TRUE;
- }
-
-}
-
-static void
-needs_send_cb (GtkObject *obj, gpointer data)
-{
- CompEditor *editor = COMP_EDITOR (data);
- CompEditorPrivate *priv;
-
- priv = editor->priv;
-
- comp_editor_set_needs_send (editor, TRUE);
-}
-
-/* Page signal callbacks */
-static void
-page_summary_changed_cb (GtkObject *obj, const char *summary, gpointer data)
-{
- CompEditor *editor = COMP_EDITOR (data);
- CompEditorPrivate *priv;
- GList *l;
-
- priv = editor->priv;
-
- for (l = priv->pages; l != NULL; l = l->next)
- if (obj != l->data)
- comp_editor_page_set_summary (l->data, summary);
-
- if (!priv->warned && priv->existing_org && !priv->user_org) {
- e_notice (editor, GTK_MESSAGE_INFO,
- _("Changes made to this item may be discarded if an update arrives"));
- priv->warned = TRUE;
- }
-
- set_title_from_string (editor, summary);
-}
-
-static void
-page_dates_changed_cb (GtkObject *obj,
- CompEditorPageDates *dates,
- gpointer data)
-{
- CompEditor *editor = COMP_EDITOR (data);
- CompEditorPrivate *priv;
- GList *l;
-
- priv = editor->priv;
-
- for (l = priv->pages; l != NULL; l = l->next)
- if (obj != l->data)
- comp_editor_page_set_dates (l->data, dates);
-
- if (!priv->warned && priv->existing_org && !priv->user_org) {
- e_notice (editor, GTK_MESSAGE_INFO,
- _("Changes made to this item may be discarded if an update arrives"));
- priv->warned = TRUE;
- }
-}
-
-static void
-obj_modified_cb (ECal *client, GList *objects, gpointer data)
-{
- CompEditor *editor = COMP_EDITOR (data);
- CompEditorPrivate *priv;
- ECalComponent *comp = NULL;
-
- priv = editor->priv;
-
- /* We queried based on a specific UID so we definitely changed */
- if (changed_component_dialog ((GtkWindow *) editor, priv->comp, FALSE, priv->changed)) {
- icalcomponent *icalcomp = icalcomponent_new_clone (objects->data);
-
- comp = e_cal_component_new ();
- if (e_cal_component_set_icalcomponent (comp, icalcomp)) {
- comp_editor_edit_comp (editor, comp);
- } else {
- GtkWidget *dlg;
-
- dlg = gnome_error_dialog (_("Unable to use current version!"));
- gnome_dialog_run_and_close (GNOME_DIALOG (dlg));
- icalcomponent_free (icalcomp);
- }
-
- g_object_unref (comp);
- }
-}
-
-static void
-obj_removed_cb (ECal *client, GList *uids, gpointer data)
-{
- CompEditor *editor = COMP_EDITOR (data);
- CompEditorPrivate *priv;
-
- priv = editor->priv;
-
- if (changed_component_dialog ((GtkWindow *) editor, priv->comp, TRUE, priv->changed))
- close_dialog (editor);
-}
diff --git a/calendar/gui/dialogs/comp-editor.h b/calendar/gui/dialogs/comp-editor.h
deleted file mode 100644
index ea6811e5a3..0000000000
--- a/calendar/gui/dialogs/comp-editor.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/* Evolution calendar - Framework for a calendar component editor dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef COMP_EDITOR_H
-#define COMP_EDITOR_H
-
-#include <gtk/gtk.h>
-#include <libecal/e-cal.h>
-#include "../itip-utils.h"
-#include "comp-editor-page.h"
-#include "evolution-shell-component-utils.h"
-#include "cal-attachment-bar.h"
-
-G_BEGIN_DECLS
-
-
-
-#define TYPE_COMP_EDITOR (comp_editor_get_type ())
-#define COMP_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_COMP_EDITOR, CompEditor))
-#define COMP_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_COMP_EDITOR, CompEditorClass))
-#define IS_COMP_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_COMP_EDITOR))
-#define IS_COMP_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_COMP_EDITOR))
-
-typedef struct _CompEditorPrivate CompEditorPrivate;
-
-typedef struct {
- GtkDialog object;
-
- /* Private data */
- CompEditorPrivate *priv;
-} CompEditor;
-
-typedef struct {
- GtkDialogClass parent_class;
-
- /* Virtual functions */
- void (* set_e_cal) (CompEditor *page, ECal *client);
- void (* edit_comp) (CompEditor *page, ECalComponent *comp);
- gboolean (* send_comp) (CompEditor *page, ECalComponentItipMethod method);
-} CompEditorClass;
-
-GtkType comp_editor_get_type (void);
-void comp_editor_set_changed (CompEditor *editor,
- gboolean changed);
-gboolean comp_editor_get_changed (CompEditor *editor);
-void comp_editor_set_needs_send (CompEditor *editor,
- gboolean needs_send);
-gboolean comp_editor_get_needs_send (CompEditor *editor);
-void comp_editor_set_existing_org (CompEditor *editor,
- gboolean existing_org);
-gboolean comp_editor_get_existing_org (CompEditor *editor);
-void comp_editor_set_user_org (CompEditor *editor,
- gboolean user_org);
-gboolean comp_editor_get_user_org (CompEditor *editor);
-void comp_editor_set_group_item (CompEditor *editor,
- gboolean is_group_item);
-gboolean comp_editor_get_group_item (CompEditor *editor);
-void comp_editor_append_page (CompEditor *editor,
- CompEditorPage *page,
- const char *label);
-void comp_editor_remove_page (CompEditor *editor,
- CompEditorPage *page);
-void comp_editor_show_page (CompEditor *editor,
- CompEditorPage *page);
-void comp_editor_set_e_cal (CompEditor *editor,
- ECal *client);
-ECal *comp_editor_get_e_cal (CompEditor *editor);
-void comp_editor_edit_comp (CompEditor *ee,
- ECalComponent *comp);
-ECalComponent *comp_editor_get_comp (CompEditor *editor);
-ECalComponent *comp_editor_get_current_comp (CompEditor *editor);
-gboolean comp_editor_save_comp (CompEditor *editor,
- gboolean send);
-void comp_editor_delete_comp (CompEditor *editor);
-gboolean comp_editor_send_comp (CompEditor *editor,
- ECalComponentItipMethod method);
-GSList *comp_editor_get_mime_attach_list (CompEditor *editor);
-gboolean comp_editor_close (CompEditor *editor);
-void comp_editor_focus (CompEditor *editor);
-
-void comp_editor_notify_client_changed (CompEditor *editor, ECal *client);
-
-
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/dialogs/copy-source-dialog.c b/calendar/gui/dialogs/copy-source-dialog.c
deleted file mode 100644
index 9fdfee16b2..0000000000
--- a/calendar/gui/dialogs/copy-source-dialog.c
+++ /dev/null
@@ -1,136 +0,0 @@
-/* Evolution calendar - Copy source dialog
- *
- * Copyright (C) 2003 Novell, Inc.
- *
- * Author: Rodrigo Moya <rodrigo@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkmessagedialog.h>
-#include <bonobo/bonobo-i18n.h>
-#include "copy-source-dialog.h"
-#include "select-source-dialog.h"
-#include "common/authentication.h"
-
-typedef struct {
- ESource *orig_source;
- ECalSourceType obj_type;
- ESource *selected_source;
-} CopySourceDialogData;
-
-static void
-show_error (GtkWindow *parent, const char *msg)
-{
- GtkWidget *dialog;
-
- dialog = gtk_message_dialog_new (parent, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, msg);
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
-}
-
-static gboolean
-copy_source (CopySourceDialogData *csdd)
-{
- ECal *source_client, *dest_client;
- gboolean read_only = TRUE;
- GList *obj_list = NULL;
- gboolean result = FALSE;
-
- if (!csdd->selected_source)
- return FALSE;
-
- /* open the source */
- source_client = auth_new_cal_from_source (csdd->orig_source, csdd->obj_type);
- if (!e_cal_open (source_client, TRUE, NULL)) {
- show_error (NULL, _("Could not open source"));
- g_object_unref (source_client);
- return FALSE;
- }
-
- /* open the destination */
- dest_client = auth_new_cal_from_source (csdd->selected_source, csdd->obj_type);
- if (!e_cal_open (dest_client, FALSE, NULL)) {
- show_error (NULL, _("Could not open destination"));
- g_object_unref (dest_client);
- g_object_unref (source_client);
- return FALSE;
- }
-
- /* check if the destination is read only */
- e_cal_is_read_only (dest_client, &read_only, NULL);
- if (read_only) {
- show_error (NULL, _("Destination is read only"));
- } else {
- if (e_cal_get_object_list (source_client, "#t", &obj_list, NULL)) {
- GList *l;
- const char *uid;
- icalcomponent *icalcomp;
-
- for (l = obj_list; l != NULL; l = l->next) {
- /* FIXME: process recurrences */
- /* FIXME: process errors */
- if (e_cal_get_object (dest_client, icalcomponent_get_uid (l->data), NULL,
- &icalcomp, NULL)) {
- e_cal_modify_object (dest_client, l->data, CALOBJ_MOD_ALL, NULL);
- icalcomponent_free (icalcomp);
- } else {
- e_cal_create_object (dest_client, l->data, (char **) &uid, NULL);
- g_free ((gpointer) uid);
- }
- }
-
- e_cal_free_object_list (obj_list);
- }
- }
-
- /* free memory */
- g_object_unref (dest_client);
- g_object_unref (source_client);
-
- return result;
-}
-
-/**
- * copy_source_dialog
- *
- * Implements the Copy command for sources, allowing the user to select a target
- * source to copy to.
- */
-gboolean
-copy_source_dialog (GtkWindow *parent, ESource *source, ECalSourceType obj_type)
-{
- CopySourceDialogData csdd;
- gboolean result = FALSE;
-
- g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
-
- csdd.orig_source = source;
- csdd.selected_source = NULL;
- csdd.obj_type = obj_type;
-
- csdd.selected_source = select_source_dialog (parent, obj_type);
- if (csdd.selected_source) {
- result = copy_source (&csdd);
-
- /* free memory */
- g_object_unref (csdd.selected_source);
- }
-
- return result;
-}
diff --git a/calendar/gui/dialogs/copy-source-dialog.h b/calendar/gui/dialogs/copy-source-dialog.h
deleted file mode 100644
index 597b1f25fc..0000000000
--- a/calendar/gui/dialogs/copy-source-dialog.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Evolution calendar - Copy source dialog
- *
- * Copyright (C) 2003 Novell, Inc.
- *
- * Author: Rodrigo Moya <rodrigo@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef COPY_SOURCE_DIALOG_H
-#define COPY_SOURCE_DIALOG_H
-
-#include <gtk/gtkwindow.h>
-#include <libedataserver/e-source.h>
-#include <libecal/e-cal.h>
-#include <libecal/e-cal-util.h>
-
-gboolean copy_source_dialog (GtkWindow *parent, ESource *source, ECalSourceType type);
-
-#endif
diff --git a/calendar/gui/dialogs/delete-comp.c b/calendar/gui/dialogs/delete-comp.c
deleted file mode 100644
index ed60def95e..0000000000
--- a/calendar/gui/dialogs/delete-comp.c
+++ /dev/null
@@ -1,160 +0,0 @@
-/* Evolution calendar - Delete calendar component dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include <gtk/gtkstock.h>
-#include <gtk/gtkmessagedialog.h>
-#include <libgnome/gnome-i18n.h>
-#include <e-util/e-icon-factory.h>
-#include "widgets/misc/e-error.h"
-#include "../calendar-config.h"
-#include "delete-comp.h"
-
-
-
-/**
- * delete_component_dialog:
- * @comp: A calendar component if a single component is to be deleted, or NULL
- * if more that one component is to be deleted.
- * @consider_as_untitled: If deleting more than one component, this is ignored.
- * Otherwise, whether to consider the component as not having a summary; if
- * FALSE then the component's summary string will be used.
- * @n_comps: Number of components that are to be deleted.
- * @vtype: Type of the components that are to be deleted. This is ignored
- * if only one component is to be deleted, and the vtype is extracted from
- * the component instead.
- * @widget: A widget to use as a basis for conversion from UTF8 into font
- * encoding.
- *
- * Pops up a dialog box asking the user whether he wants to delete a number of
- * calendar components. The dialog will not appear, however, if the
- * configuration option for confirmation is turned off.
- *
- * Return value: TRUE if the user clicked Yes, FALSE otherwise. If the
- * configuration option for confirmation is turned off, this function will
- * unconditionally return TRUE.
- **/
-gboolean
-delete_component_dialog (ECalComponent *comp,
- gboolean consider_as_untitled,
- int n_comps, ECalComponentVType vtype,
- GtkWidget *widget)
-{
- const char *stock_icon, *id;
- char *arg0 = NULL;
- int response;
-
- if (comp) {
- g_return_val_if_fail (E_IS_CAL_COMPONENT (comp), FALSE);
- g_return_val_if_fail (n_comps == 1, FALSE);
- } else {
- g_return_val_if_fail (n_comps > 1, FALSE);
- g_return_val_if_fail (vtype != E_CAL_COMPONENT_NO_TYPE, FALSE);
- }
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
-
- if (!calendar_config_get_confirm_delete ())
- return TRUE;
-
- if (comp) {
- ECalComponentText summary;
-
- vtype = e_cal_component_get_vtype (comp);
-
- if (!consider_as_untitled) {
- e_cal_component_get_summary (comp, &summary);
- arg0 = g_strdup (summary.value);
- }
-
- switch (vtype) {
- case E_CAL_COMPONENT_EVENT:
- stock_icon = "stock_calendar";
- if (arg0)
- id = "calendar:prompt-delete-titled-appointment";
- else
- id = "calendar:prompt-delete-appointment";
- break;
-
- case E_CAL_COMPONENT_TODO:
- stock_icon = "stock_todo";
- if (arg0)
- id = "calendar:prompt-delete-named-task";
- else
- id = "calendar:prompt-delete-task";
- break;
-
- case E_CAL_COMPONENT_JOURNAL:
- stock_icon = "stock_calendar";
- if (arg0)
- id = "calendar:prompt-delete-named-journal";
- else
- id = "calendar:prompt-delete-journal";
- break;
-
- default:
- g_message ("delete_component_dialog(): Cannot handle object of type %d",
- vtype);
- g_free (arg0);
- return FALSE;
- }
- } else {
- switch (vtype) {
- case E_CAL_COMPONENT_EVENT:
- if (n_comps == 1)
- id = "calendar:prompt-delete-appointment";
- else
- id = "calendar:prompt-delete-appointments";
- break;
-
- case E_CAL_COMPONENT_TODO:
- if (n_comps == 1)
- id = "calendar:prompt-delete-task";
- else
- id = "calendar:prompt-delete-tasks";
- break;
-
- case E_CAL_COMPONENT_JOURNAL:
- if (n_comps == 1)
- id = "calendar:prompt-delete-journal";
- else
- id = "calendar:prompt-delete-journals";
- break;
-
- default:
- g_message ("delete_component_dialog(): Cannot handle objects of type %d",
- vtype);
- return FALSE;
- }
-
- if (n_comps > 1)
- arg0 = g_strdup_printf ("%d", n_comps);
- }
-
- response = e_error_run ((GtkWindow *) gtk_widget_get_toplevel (widget), id, arg0, NULL);
- g_free (arg0);
-
- return response == GTK_RESPONSE_YES;
-}
diff --git a/calendar/gui/dialogs/delete-comp.h b/calendar/gui/dialogs/delete-comp.h
deleted file mode 100644
index f8773c25d0..0000000000
--- a/calendar/gui/dialogs/delete-comp.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Evolution calendar - Delete calendar component dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef DELETE_COMP_H
-#define DELETE_COMP_H
-
-#include <gtk/gtkwidget.h>
-#include <libecal/e-cal-component.h>
-
-gboolean delete_component_dialog (ECalComponent *comp,
- gboolean consider_as_untitled,
- int n_comps, ECalComponentVType vtype,
- GtkWidget *widget);
-
-#endif
diff --git a/calendar/gui/dialogs/delete-error.c b/calendar/gui/dialogs/delete-error.c
deleted file mode 100644
index 5932abeab8..0000000000
--- a/calendar/gui/dialogs/delete-error.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/* Evolution calendar - Send calendar component dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include <gtk/gtkmessagedialog.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/gnome-uidefs.h>
-#include <e-util/e-icon-factory.h>
-#include "delete-error.h"
-
-
-
-/**
- * delete_error_dialog:
- *
- * Shows any applicable error messages as the result of deleting and object
- *
- **/
-void
-delete_error_dialog (GError *error, ECalComponentVType vtype)
-{
- GList *icon_list = NULL;
- GtkWidget *dialog;
- const char *str;
-
- if (!error)
- return;
-
- switch (error->code) {
- case E_CALENDAR_STATUS_CORBA_EXCEPTION:
- switch (vtype) {
- case E_CAL_COMPONENT_EVENT:
- str = _("The event could not be deleted due to a corba error");
- break;
- case E_CAL_COMPONENT_TODO:
- str = _("The task could not be deleted due to a corba error");
- break;
- case E_CAL_COMPONENT_JOURNAL:
- str = _("The journal entry could not be deleted due to a corba error");
- break;
- default:
- str = _("The item could not be deleted due to a corba error");
- break;
- }
- break;
- case E_CALENDAR_STATUS_PERMISSION_DENIED:
- switch (vtype) {
- case E_CAL_COMPONENT_EVENT:
- str = _("The event could not be deleted because permission was denied");
- break;
- case E_CAL_COMPONENT_TODO:
- str = _("The task could not be deleted because permission was denied");
- break;
- case E_CAL_COMPONENT_JOURNAL:
- str = _("The journal entry could not be deleted because permission was denied");
- break;
- default:
- str = _("The item could not be deleted because permission was denied");
- break;
- }
- break;
- case E_CALENDAR_STATUS_OTHER_ERROR:
- switch (vtype) {
- case E_CAL_COMPONENT_EVENT:
- str = _("The event could not be deleted due to an error");
- break;
- case E_CAL_COMPONENT_TODO:
- str = _("The task could not be deleted due to an error");
- break;
- case E_CAL_COMPONENT_JOURNAL:
- str = _("The journal entry could not be deleted due to an error");
- break;
- default:
- str = _("The item could not be deleted due to an error");
- break;
- }
- break;
- case E_CALENDAR_STATUS_OK:
- case E_CALENDAR_STATUS_OBJECT_NOT_FOUND:
- default:
- /* If not found, we don't care - its gone anyhow */
- return;
- }
-
- dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_OK, str);
- if (vtype == E_CAL_COMPONENT_EVENT)
- icon_list = e_icon_factory_get_icon_list ("stock_calendar");
- else if (vtype == E_CAL_COMPONENT_TODO)
- icon_list = e_icon_factory_get_icon_list ("stock_todo");
-
- if (icon_list) {
- gtk_window_set_icon_list (GTK_WINDOW (dialog), icon_list);
- g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
- g_list_free (icon_list);
- }
-
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
-}
diff --git a/calendar/gui/dialogs/delete-error.h b/calendar/gui/dialogs/delete-error.h
deleted file mode 100644
index 68c132e479..0000000000
--- a/calendar/gui/dialogs/delete-error.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Evolution calendar - Send calendar component dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef DELETE_ERROR_H
-#define DELETE_ERROR_H
-
-#include <glib.h>
-#include <libecal/e-cal.h>
-#include <libecal/e-cal-component.h>
-
-void delete_error_dialog (GError *error, ECalComponentVType vtype);
-
-#endif
diff --git a/calendar/gui/dialogs/e-delegate-dialog.c b/calendar/gui/dialogs/e-delegate-dialog.c
deleted file mode 100644
index cd0c768c63..0000000000
--- a/calendar/gui/dialogs/e-delegate-dialog.c
+++ /dev/null
@@ -1,316 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution calendar - Delegate selector dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Damon Chaplin <damon@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtksignal.h>
-#include <gtk/gtkcombo.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtklabel.h>
-#include <gnome.h>
-#include <libical/ical.h>
-#include <glade/glade.h>
-#include <widgets/misc/e-map.h>
-#include <libebook/e-destination.h>
-#include <libedataserverui/e-name-selector.h>
-#include "e-delegate-dialog.h"
-
-struct _EDelegateDialogPrivate {
- char *name;
- char *address;
-
- /* Glade XML data */
- GladeXML *xml;
-
- /* Widgets from the Glade file */
- GtkWidget *app;
- GtkWidget *hbox;
- GtkWidget *addressbook;
-
- ENameSelector *name_selector;
- GtkWidget *entry;
-};
-
-static const char *section_name = "Delegate To";
-
-static void e_delegate_dialog_finalize (GObject *object);
-
-static gboolean get_widgets (EDelegateDialog *edd);
-static void addressbook_clicked_cb (GtkWidget *widget, gpointer data);
-static void addressbook_response_cb (GtkWidget *widget, gint response, gpointer data);
-
-G_DEFINE_TYPE (EDelegateDialog, e_delegate_dialog, G_TYPE_OBJECT);
-
-/* Class initialization function for the event editor */
-static void
-e_delegate_dialog_class_init (EDelegateDialogClass *class)
-{
- GObjectClass *gobject_class;
-
- gobject_class = (GObjectClass *) class;
-
- gobject_class->finalize = e_delegate_dialog_finalize;
-}
-
-/* Object initialization function for the event editor */
-static void
-e_delegate_dialog_init (EDelegateDialog *edd)
-{
- EDelegateDialogPrivate *priv;
-
- priv = g_new0 (EDelegateDialogPrivate, 1);
- edd->priv = priv;
-
- priv->address = NULL;
-}
-
-/* Destroy handler for the event editor */
-static void
-e_delegate_dialog_finalize (GObject *object)
-{
- EDelegateDialog *edd;
- EDelegateDialogPrivate *priv;
- GtkWidget *dialog;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (E_IS_DELEGATE_DIALOG (object));
-
- edd = E_DELEGATE_DIALOG (object);
- priv = edd->priv;
-
- g_object_unref (priv->name_selector);
-
- /* Destroy the actual dialog. */
- dialog = e_delegate_dialog_get_toplevel (edd);
- gtk_widget_destroy (dialog);
-
- g_free (priv->address);
- priv->address = NULL;
-
- g_free (priv);
- edd->priv = NULL;
-
- if (G_OBJECT_CLASS (e_delegate_dialog_parent_class)->finalize)
- (* G_OBJECT_CLASS (e_delegate_dialog_parent_class)->finalize) (object);
-}
-
-
-EDelegateDialog *
-e_delegate_dialog_construct (EDelegateDialog *edd, const char *name, const char *address)
-{
- EDelegateDialogPrivate *priv;
- EDestinationStore *destination_store;
- EDestination *dest;
- ENameSelectorModel *name_selector_model;
- ENameSelectorDialog *name_selector_dialog;
- char *str;
-
- g_return_val_if_fail (edd != NULL, NULL);
- g_return_val_if_fail (E_IS_DELEGATE_DIALOG (edd), NULL);
-
- priv = edd->priv;
-
- /* Load the content widgets */
-
- priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/e-delegate-dialog.glade",
- NULL, NULL);
- if (!priv->xml) {
- g_message ("e_delegate_dialog_construct(): Could not load the Glade XML file!");
- goto error;
- }
-
- if (!get_widgets (edd)) {
- g_message ("e_delegate_dialog_construct(): Could not find all widgets in the XML file!");
- goto error;
- }
-
- priv->name_selector = e_name_selector_new ();
- name_selector_model = e_name_selector_peek_model (priv->name_selector);
- e_name_selector_model_add_section (name_selector_model, section_name, section_name, NULL);
-
- priv->entry = GTK_WIDGET (e_name_selector_peek_section_entry (priv->name_selector, section_name));
- gtk_widget_show (priv->entry);
- gtk_box_pack_start (GTK_BOX (priv->hbox), priv->entry, TRUE, TRUE, 6);
-
- dest = e_destination_new ();
-
- if (name != NULL && *name)
- e_destination_set_name (dest, name);
- if (address != NULL && *address)
- e_destination_set_email (dest, address);
-
- e_name_selector_model_peek_section (name_selector_model, section_name, NULL, &destination_store);
- e_destination_store_append_destination (destination_store, dest);
- g_object_unref (dest);
-
- g_signal_connect((priv->addressbook), "clicked",
- G_CALLBACK (addressbook_clicked_cb), edd);
-
- name_selector_dialog = e_name_selector_peek_dialog (priv->name_selector);
- g_signal_connect (name_selector_dialog, "response", G_CALLBACK (addressbook_response_cb), edd);
-
- return edd;
-
- error:
-
- g_object_unref (edd);
- return NULL;
-}
-
-static gboolean
-get_widgets (EDelegateDialog *edd)
-{
- EDelegateDialogPrivate *priv;
-
- priv = edd->priv;
-
-#define GW(name) glade_xml_get_widget (priv->xml, name)
-
- priv->app = GW ("delegate-dialog");
- priv->hbox = GW ("delegate-hbox");
- priv->addressbook = GW ("addressbook");
-
- return (priv->app
- && priv->hbox
- && priv->addressbook);
-}
-
-static void
-addressbook_clicked_cb (GtkWidget *widget, gpointer data)
-{
- EDelegateDialog *edd = data;
- EDelegateDialogPrivate *priv;
- ENameSelectorDialog *name_selector_dialog;
-
- priv = edd->priv;
-
- name_selector_dialog = e_name_selector_peek_dialog (priv->name_selector);
- gtk_widget_show (GTK_WIDGET (name_selector_dialog));
-}
-
-static void
-addressbook_response_cb (GtkWidget *widget, gint response, gpointer data)
-{
- EDelegateDialog *edd = data;
- EDelegateDialogPrivate *priv;
- ENameSelectorDialog *name_selector_dialog;
-
- priv = edd->priv;
-
- name_selector_dialog = e_name_selector_peek_dialog (priv->name_selector);
- gtk_widget_hide (GTK_WIDGET (name_selector_dialog));
-}
-
-/**
- * e_delegate_dialog_new:
- *
- * Creates a new event editor dialog.
- *
- * Return value: A newly-created event editor dialog, or NULL if the event
- * editor could not be created.
- **/
-EDelegateDialog *
-e_delegate_dialog_new (const char *name, const char *address)
-{
- EDelegateDialog *edd;
-
- edd = E_DELEGATE_DIALOG (g_object_new (E_TYPE_DELEGATE_DIALOG, NULL));
- return e_delegate_dialog_construct (E_DELEGATE_DIALOG (edd), name, address);
-}
-
-char *
-e_delegate_dialog_get_delegate (EDelegateDialog *edd)
-{
- EDelegateDialogPrivate *priv;
- ENameSelectorModel *name_selector_model;
- EDestinationStore *destination_store;
- GList *destinations;
- EDestination *destination;
-
- g_return_val_if_fail (edd != NULL, NULL);
- g_return_val_if_fail (E_IS_DELEGATE_DIALOG (edd), NULL);
-
- priv = edd->priv;
-
- name_selector_model = e_name_selector_peek_model (priv->name_selector);
- e_name_selector_model_peek_section (name_selector_model, section_name, NULL, &destination_store);
- destinations = e_destination_store_list_destinations (destination_store);
- if (!destinations)
- return NULL;
-
- destination = destinations->data;
-
- if (destination) {
- g_free (priv->address);
- priv->address = g_strdup (e_destination_get_email (destination));
- }
-
- g_list_free (destinations);
- return g_strdup (priv->address);
-}
-
-
-char *
-e_delegate_dialog_get_delegate_name (EDelegateDialog *edd)
-{
- EDelegateDialogPrivate *priv;
- ENameSelectorModel *name_selector_model;
- EDestinationStore *destination_store;
- GList *destinations;
- EDestination *destination;
-
- g_return_val_if_fail (edd != NULL, NULL);
- g_return_val_if_fail (E_IS_DELEGATE_DIALOG (edd), NULL);
-
- priv = edd->priv;
-
- name_selector_model = e_name_selector_peek_model (priv->name_selector);
- e_name_selector_model_peek_section (name_selector_model, section_name, NULL, &destination_store);
- destinations = e_destination_store_list_destinations (destination_store);
- if (!destinations)
- return NULL;
-
- destination = destinations->data;
-
- if (destination) {
- g_free (priv->name);
- priv->name = g_strdup (e_destination_get_name (destination));
- }
-
- g_list_free (destinations);
- return g_strdup (priv->name);
-}
-
-GtkWidget*
-e_delegate_dialog_get_toplevel (EDelegateDialog *edd)
-{
- EDelegateDialogPrivate *priv;
-
- g_return_val_if_fail (edd != NULL, NULL);
- g_return_val_if_fail (E_IS_DELEGATE_DIALOG (edd), NULL);
-
- priv = edd->priv;
-
- return priv->app;
-}
-
diff --git a/calendar/gui/dialogs/e-delegate-dialog.glade b/calendar/gui/dialogs/e-delegate-dialog.glade
deleted file mode 100644
index af24ca2b63..0000000000
--- a/calendar/gui/dialogs/e-delegate-dialog.glade
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-<requires lib="gnome"/>
-
-<widget class="GtkDialog" id="delegate-dialog">
- <property name="title" translatable="yes">Enter Delegate</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="has_separator">True</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">8</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="cancel-button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">-6</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="ok-button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="has_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">-5</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="delegate-hbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Delegate To:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkButton" id="addressbook">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Contacts...</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/calendar/gui/dialogs/e-delegate-dialog.h b/calendar/gui/dialogs/e-delegate-dialog.h
deleted file mode 100644
index 2acc853e0a..0000000000
--- a/calendar/gui/dialogs/e-delegate-dialog.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* Evolution calendar - Delegate selector dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef __E_DELEGATE_DIALOG_H__
-#define __E_DELEGATE_DIALOG_H__
-
-#include <gtk/gtkwidget.h>
-
-
-
-#define E_TYPE_DELEGATE_DIALOG (e_delegate_dialog_get_type ())
-#define E_DELEGATE_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_DELEGATE_DIALOG, EDelegateDialog))
-#define E_DELEGATE_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_DELEGATE_DIALOG, \
- EDelegateDialogClass))
-#define E_IS_DELEGATE_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_DELEGATE_DIALOG))
-#define E_IS_DELEGATE_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_DELEGATE_DIALOG))
-
-
-typedef struct _EDelegateDialog EDelegateDialog;
-typedef struct _EDelegateDialogClass EDelegateDialogClass;
-typedef struct _EDelegateDialogPrivate EDelegateDialogPrivate;
-
-struct _EDelegateDialog {
- GtkObject object;
-
- /* Private data */
- EDelegateDialogPrivate *priv;
-};
-
-struct _EDelegateDialogClass {
- GtkObjectClass parent_class;
-};
-
-GtkType e_delegate_dialog_get_type (void);
-
-EDelegateDialog* e_delegate_dialog_construct (EDelegateDialog *etd,
- const char *name,
- const char *address);
-
-EDelegateDialog* e_delegate_dialog_new (const char *name,
- const char *address);
-
-char* e_delegate_dialog_get_delegate (EDelegateDialog *etd);
-
-char* e_delegate_dialog_get_delegate_name (EDelegateDialog *etd);
-
-void e_delegate_dialog_set_delegate (EDelegateDialog *etd,
- const char *address);
-
-GtkWidget* e_delegate_dialog_get_toplevel (EDelegateDialog *etd);
-
-
-
-
-#endif /* __E_DELEGATE_DIALOG_H__ */
diff --git a/calendar/gui/dialogs/e-send-options-utils.c b/calendar/gui/dialogs/e-send-options-utils.c
deleted file mode 100644
index ff70a2ccd7..0000000000
--- a/calendar/gui/dialogs/e-send-options-utils.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/* Evolution calendar - Timezone selector dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Damon Chaplin <damon@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-#include "e-send-options-utils.h"
-#include "../calendar-config.h"
-#include <glib.h>
-
-ESendOptionsDialog *sod = NULL;
-
-void
-e_sendoptions_utils_set_default_data (ESendOptionsDialog *sod, ESource *source, char * type)
-{
- ESendOptionsGeneral *gopts = NULL;
- ESendOptionsStatusTracking *sopts;
- GConfClient *gconf = gconf_client_get_default ();
- ESourceList *source_list;
- const char *uid;
- const char *value;
-
- gopts = sod->data->gopts;
- sopts = sod->data->sopts;
-
- if (!strcmp (type, "calendar"))
- source_list = e_source_list_new_for_gconf (gconf, "/apps/evolution/calendar/sources");
- else
- source_list = e_source_list_new_for_gconf (gconf, "/apps/evolution/tasks/sources");
-
- uid = e_source_peek_uid (source);
- source = e_source_list_peek_source_by_uid (source_list, uid);
-
- /* priority */
- value = e_source_get_property (source, "priority");
- if (value) {
- if (!strcmp (value, "high"))
- gopts->priority = E_PRIORITY_HIGH;
- else if (!strcmp (value, "standard"))
- gopts->priority = E_PRIORITY_STANDARD;
- else if (!strcmp (value, "low"))
- gopts->priority = E_PRIORITY_LOW;
- else
- gopts->priority = E_PRIORITY_UNDEFINED;
- }
- /* Reply requested */
- value = e_source_get_property (source, "reply-requested");
- if (value) {
- if (!strcmp (value, "none"))
- gopts->reply_enabled = FALSE;
- else if (!strcmp (value, "convinient")) {
- gopts->reply_enabled = TRUE;
- gopts->reply_convenient = TRUE;
- } else {
- gint i = atoi (value);
- gopts->reply_within = i;
- }
- }
- /* Delay delivery */
- value = e_source_get_property (source, "delay-delivery");
- if (value) {
- if (!strcmp (value, "none"))
- gopts->delay_enabled = FALSE;
- else {
- gopts->delay_enabled = TRUE;
- gopts->delay_until = icaltime_as_timet (icaltime_from_string (value));
- }
- }
- /* Expiration Date */
- value = e_source_get_property (source, "expiration");
- if (value) {
- if (!strcmp (value, "none"))
- gopts->expiration_enabled = FALSE;
- else {
- gint i = atoi (value);
- if (i == 0)
- gopts->expiration_enabled = FALSE;
- else
- gopts->expiration_enabled = TRUE;
- gopts->expire_after = i;
- }
- }
- /* status tracking */
- value = e_source_get_property (source, "status-tracking");
- if (value) {
- if (!strcmp (value, "none"))
- sopts->tracking_enabled = FALSE;
- else {
- sopts->tracking_enabled = TRUE;
- if (!strcmp (value, "delivered"))
- sopts->track_when = E_DELIVERED;
- else if (!strcmp (value, "delivered-opened"))
- sopts->track_when = E_DELIVERED_OPENED;
- else
- sopts->track_when = E_ALL;
- }
- }
-
- /* Return Notifications */
-
- value = e_source_get_property (source, "return-open");
- if (value) {
- if (!strcmp (value, "none"))
- sopts->opened = E_RETURN_NOTIFY_NONE;
- else
- sopts->opened = E_RETURN_NOTIFY_MAIL;
- }
-
- value = e_source_get_property (source, "return-accept");
- if (value) {
- if (!strcmp (value, "none"))
- sopts->accepted = E_RETURN_NOTIFY_NONE;
- else
- sopts->accepted = E_RETURN_NOTIFY_MAIL;
- }
-
- value = e_source_get_property (source, "return-decline");
- if (value) {
- if (!strcmp (value, "none"))
- sopts->declined = E_RETURN_NOTIFY_NONE;
- else
- sopts->declined = E_RETURN_NOTIFY_MAIL;
- }
-
- value = e_source_get_property (source, "return-complete");
- if (value) {
- if (!strcmp (value, "none"))
- sopts->completed = E_RETURN_NOTIFY_NONE;
- else
- sopts->completed = E_RETURN_NOTIFY_MAIL;
- }
-
-}
-
-void
-e_sendoptions_utils_fill_component (ESendOptionsDialog *sod, ECalComponent *comp)
-{
- int i = 1;
- icalproperty *prop;
- icalcomponent *icalcomp;
- ESendOptionsGeneral *gopts;
- ESendOptionsStatusTracking *sopts;
-
- gopts = sod->data->gopts;
- sopts = sod->data->sopts;
-
- e_cal_component_set_sequence (comp, &i);
- icalcomp = e_cal_component_get_icalcomponent (comp);
-
- if (e_sendoptions_get_need_general_options (sod)) {
- prop = icalproperty_new_x ((const char *) g_strdup_printf ("%d", gopts->priority));
- icalproperty_set_x_name (prop, "X-EVOLUTION-OPTIONS-PRIORITY");
- icalcomponent_add_property (icalcomp, prop);
-
- if (gopts->reply_enabled) {
- if (gopts->reply_convenient)
- prop = icalproperty_new_x ("convenient");
- else
- prop = icalproperty_new_x ((const char *) g_strdup_printf ( "%d", gopts->reply_within));
- icalproperty_set_x_name (prop, "X-EVOLUTION-OPTIONS-REPLY");
- icalcomponent_add_property (icalcomp, prop);
- }
-
- if (gopts->expiration_enabled && gopts->expire_after) {
- prop = icalproperty_new_x ((const char *) g_strdup_printf ( "%d", gopts->expire_after));
- icalproperty_set_x_name (prop, "X-EVOLUTION-OPTIONS-EXPIRE");
- icalcomponent_add_property (icalcomp, prop);
- }
-
- if (gopts->delay_enabled) {
- struct icaltimetype temp;
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- temp = icaltime_from_timet_with_zone (gopts->delay_until, FALSE, zone);
- prop = icalproperty_new_x (icaltime_as_ical_string (temp));
- icalproperty_set_x_name (prop, "X-EVOLUTION-OPTIONS-DELAY");
- icalcomponent_add_property (icalcomp, prop);
- }
- }
-
- if (sopts->tracking_enabled)
- prop = icalproperty_new_x ((const char *) g_strdup_printf ( "%d", sopts->track_when));
- else
- prop = icalproperty_new_x ("0");
-
- icalproperty_set_x_name (prop, "X-EVOLUTION-OPTIONS-TRACKINFO");
- icalcomponent_add_property (icalcomp, prop);
-
-
- prop = icalproperty_new_x ((const char *) g_strdup_printf ("%d", sopts->opened));
- icalproperty_set_x_name (prop, "X-EVOLUTION-OPTIONS-OPENED");
- icalcomponent_add_property (icalcomp, prop);
-
- prop = icalproperty_new_x ((const char *) g_strdup_printf ("%d", sopts->accepted));
- icalproperty_set_x_name (prop, "X-EVOLUTION-OPTIONS-ACCEPTED");
- icalcomponent_add_property (icalcomp, prop);
-
- prop = icalproperty_new_x ((const char *) g_strdup_printf ("%d", sopts->declined));
- icalproperty_set_x_name (prop, "X-EVOLUTION-OPTIONS-DECLINED");
- icalcomponent_add_property (icalcomp, prop);
-
- prop = icalproperty_new_x ((const char *) g_strdup_printf ("%d", sopts->completed));
- icalproperty_set_x_name (prop, "X-EVOLUTION-OPTIONS-COMPLETED");
- icalcomponent_add_property (icalcomp, prop);
-}
-
diff --git a/calendar/gui/dialogs/e-send-options-utils.h b/calendar/gui/dialogs/e-send-options-utils.h
deleted file mode 100644
index ef35d66d95..0000000000
--- a/calendar/gui/dialogs/e-send-options-utils.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Evolution calendar - Timezone selector dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Damon Chaplin <damon@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef __E_SENDOPTIONS_UTILS_H__
-#define __E_SENDOPTIONS_UTILS_H__
-
-#include "widgets/misc/e-send-options.h"
-#include <libecal/e-cal-component.h>
-#include <libedataserver/e-source-list.h>
-
-void e_sendoptions_utils_set_default_data (ESendOptionsDialog *sod, ESource *source, char* type);
-void e_sendoptions_utils_fill_component (ESendOptionsDialog *sod, ECalComponent *comp);
-#endif
diff --git a/calendar/gui/dialogs/event-editor.c b/calendar/gui/dialogs/event-editor.c
deleted file mode 100644
index 1f266325bf..0000000000
--- a/calendar/gui/dialogs/event-editor.c
+++ /dev/null
@@ -1,456 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/* Evolution calendar - Event editor dialog
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Miguel de Icaza <miguel@ximian.com>
- * Federico Mena-Quintero <federico@ximian.com>
- * Seth Alves <alves@hungry.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <glade/glade.h>
-#include <libgnome/gnome-i18n.h>
-#include <widgets/misc/e-dateedit.h>
-#include <e-util/e-icon-factory.h>
-
-#include "event-page.h"
-#include "recurrence-page.h"
-#include "meeting-page.h"
-#include "schedule-page.h"
-#include "cancel-comp.h"
-#include "event-editor.h"
-
-struct _EventEditorPrivate {
- EventPage *event_page;
- RecurrencePage *recur_page;
- MeetingPage *meet_page;
- SchedulePage *sched_page;
-
- EMeetingStore *model;
- gboolean is_meeting;
- gboolean meeting_shown;
- gboolean updating;
-};
-
-
-
-static void event_editor_set_e_cal (CompEditor *editor, ECal *client);
-static void event_editor_edit_comp (CompEditor *editor, ECalComponent *comp);
-static gboolean event_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method);
-static void event_editor_finalize (GObject *object);
-
-static void schedule_meeting_cmd (GtkWidget *widget, gpointer data);
-static void refresh_meeting_cmd (GtkWidget *widget, gpointer data);
-static void cancel_meeting_cmd (GtkWidget *widget, gpointer data);
-static void forward_cmd (GtkWidget *widget, gpointer data);
-
-static void model_row_change_insert_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data);
-static void model_row_delete_cb (GtkTreeModel *model, GtkTreePath *path, gpointer data);
-
-
-G_DEFINE_TYPE (EventEditor, event_editor, TYPE_COMP_EDITOR);
-
-/* Class initialization function for the event editor */
-static void
-event_editor_class_init (EventEditorClass *klass)
-{
- GObjectClass *gobject_class;
- CompEditorClass *editor_class;
-
- gobject_class = (GObjectClass *) klass;
- editor_class = (CompEditorClass *) klass;
-
- editor_class->set_e_cal = event_editor_set_e_cal;
- editor_class->edit_comp = event_editor_edit_comp;
- editor_class->send_comp = event_editor_send_comp;
-
- gobject_class->finalize = event_editor_finalize;
-}
-
-static void
-init_widgets (EventEditor *ee)
-{
- EventEditorPrivate *priv;
-
- priv = ee->priv;
-
- g_signal_connect((priv->model), "row_changed",
- G_CALLBACK (model_row_change_insert_cb), ee);
- g_signal_connect((priv->model), "row_inserted",
- G_CALLBACK (model_row_change_insert_cb), ee);
- g_signal_connect((priv->model), "row_deleted",
- G_CALLBACK (model_row_delete_cb), ee);
-}
-
-static void
-client_changed_cb (CompEditorPage *page, ECal *client, gpointer user_data)
-{
- //set_menu_sens (EVENT_EDITOR (user_data));
-}
-
-/* Object initialization function for the event editor */
-static void
-event_editor_init (EventEditor *ee)
-{
- EventEditorPrivate *priv;
-
- priv = g_new0 (EventEditorPrivate, 1);
- ee->priv = priv;
-
- priv->model = E_MEETING_STORE (e_meeting_store_new ());
- priv->meeting_shown = TRUE;
- priv->updating = FALSE;
- priv->is_meeting = FALSE;
-}
-
-EventEditor *
-event_editor_construct (EventEditor *ee, ECal *client)
-{
- EventEditorPrivate *priv;
-
- priv = ee->priv;
-
- priv->event_page = event_page_new ();
- g_object_ref (priv->event_page);
- gtk_object_sink (GTK_OBJECT (priv->event_page));
- comp_editor_append_page (COMP_EDITOR (ee),
- COMP_EDITOR_PAGE (priv->event_page),
- _("Appointment"));
- g_signal_connect (G_OBJECT (priv->event_page), "client_changed",
- G_CALLBACK (client_changed_cb), ee);
-
- priv->recur_page = recurrence_page_new ();
- g_object_ref (priv->recur_page);
- gtk_object_sink (GTK_OBJECT (priv->recur_page));
- comp_editor_append_page (COMP_EDITOR (ee),
- COMP_EDITOR_PAGE (priv->recur_page),
- _("Recurrence"));
-
- if (priv->is_meeting) {
- if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS))
- event_page_show_options (priv->event_page);
-
- comp_editor_set_group_item (COMP_EDITOR (ee), TRUE);
- priv->sched_page = schedule_page_new (priv->model);
- g_object_ref (priv->sched_page);
- gtk_object_sink (GTK_OBJECT (priv->sched_page));
- comp_editor_append_page (COMP_EDITOR (ee),
- COMP_EDITOR_PAGE (priv->sched_page),
- _("Scheduling"));
-
- priv->meet_page = meeting_page_new (priv->model, client);
- g_object_ref (priv->meet_page);
- gtk_object_sink (GTK_OBJECT (priv->meet_page));
- comp_editor_append_page (COMP_EDITOR (ee),
- COMP_EDITOR_PAGE (priv->meet_page),
- _("Invitations"));
- }
- comp_editor_set_e_cal (COMP_EDITOR (ee), client);
-
- init_widgets (ee);
- gtk_window_set_default_size (GTK_WINDOW (ee), 300, 225);
-
- return ee;
-}
-
-static void
-event_editor_set_e_cal (CompEditor *editor, ECal *client)
-{
- EventEditor *ee;
- EventEditorPrivate *priv;
-
- ee = EVENT_EDITOR (editor);
- priv = ee->priv;
-
- e_meeting_store_set_e_cal (priv->model, client);
-
- if (COMP_EDITOR_CLASS (event_editor_parent_class)->set_e_cal)
- COMP_EDITOR_CLASS (event_editor_parent_class)->set_e_cal (editor, client);
-}
-
-static void
-event_editor_edit_comp (CompEditor *editor, ECalComponent *comp)
-{
- EventEditor *ee;
- EventEditorPrivate *priv;
- ECalComponentOrganizer organizer;
- ECal *client;
- GSList *attendees = NULL;
-
- ee = EVENT_EDITOR (editor);
- priv = ee->priv;
-
- priv->updating = TRUE;
-
- if (COMP_EDITOR_CLASS (event_editor_parent_class)->edit_comp)
- COMP_EDITOR_CLASS (event_editor_parent_class)->edit_comp (editor, comp);
-
- client = comp_editor_get_e_cal (COMP_EDITOR (editor));
-
- /* Get meeting related stuff */
- e_cal_component_get_organizer (comp, &organizer);
- e_cal_component_get_attendee_list (comp, &attendees);
-
- /* Clear things up */
- e_meeting_store_remove_all_attendees (priv->model);
-
- /* Set up the attendees */
- if (attendees == NULL && !priv->is_meeting) {
- if (priv->meet_page)
- comp_editor_remove_page (editor, COMP_EDITOR_PAGE (priv->meet_page));
- if (priv->sched_page)
- comp_editor_remove_page (editor, COMP_EDITOR_PAGE (priv->sched_page));
- priv->meeting_shown = FALSE;
- } else {
- GSList *l;
- int row;
-
- if (!priv->meeting_shown) {
- comp_editor_append_page (COMP_EDITOR (ee),
- COMP_EDITOR_PAGE (priv->sched_page),
- _("Scheduling"));
- comp_editor_append_page (COMP_EDITOR (ee),
- COMP_EDITOR_PAGE (priv->meet_page),
- _("Invitations"));
- }
-
- for (l = attendees; l != NULL; l = l->next) {
- ECalComponentAttendee *ca = l->data;
- EMeetingAttendee *ia;
-
- ia = E_MEETING_ATTENDEE (e_meeting_attendee_new_from_e_cal_component_attendee (ca));
-
- /* If we aren't the organizer or the attendee is just delegating, don't allow editing */
- if (!comp_editor_get_user_org (editor) || e_meeting_attendee_is_set_delto (ia))
- e_meeting_attendee_set_edit_level (ia, E_MEETING_ATTENDEE_EDIT_NONE);
- e_meeting_store_add_attendee (priv->model, ia);
-
- g_object_unref(ia);
- }
-
- /* If we aren't the organizer we can still change our own status */
- if (!comp_editor_get_user_org (editor)) {
- EAccountList *accounts;
- EAccount *account;
- EIterator *it;
-
- accounts = itip_addresses_get ();
- for (it = e_list_get_iterator((EList *)accounts);e_iterator_is_valid(it);e_iterator_next(it)) {
- EMeetingAttendee *ia;
-
- account = (EAccount*)e_iterator_get(it);
-
- ia = e_meeting_store_find_attendee (priv->model, account->id->address, &row);
- if (ia != NULL)
- e_meeting_attendee_set_edit_level (ia, E_MEETING_ATTENDEE_EDIT_STATUS);
- }
- g_object_unref(it);
- } else if (e_cal_get_organizer_must_attend (client)) {
- EMeetingAttendee *ia;
-
- ia = e_meeting_store_find_attendee (priv->model, organizer.value, &row);
- if (ia != NULL)
- e_meeting_attendee_set_edit_level (ia, E_MEETING_ATTENDEE_EDIT_NONE);
- }
-
- priv->meeting_shown = TRUE;
- }
- e_cal_component_free_attendee_list (attendees);
-
- comp_editor_set_needs_send (COMP_EDITOR (ee), priv->meeting_shown && itip_organizer_is_user (comp, client));
-
- priv->updating = FALSE;
-}
-
-static gboolean
-event_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method)
-{
- EventEditor *ee = EVENT_EDITOR (editor);
- EventEditorPrivate *priv;
- ECalComponent *comp = NULL;
-
- priv = ee->priv;
-
- /* Don't cancel more than once or when just publishing */
- if (method == E_CAL_COMPONENT_METHOD_PUBLISH ||
- method == E_CAL_COMPONENT_METHOD_CANCEL)
- goto parent;
-
- comp = meeting_page_get_cancel_comp (priv->meet_page);
- if (comp != NULL) {
- ECal *client;
- gboolean result;
-
- client = e_meeting_store_get_e_cal (priv->model);
- result = itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp,
- client, NULL, NULL);
- g_object_unref (comp);
-
- if (!result)
- return FALSE;
- }
-
- parent:
- if (COMP_EDITOR_CLASS (event_editor_parent_class)->send_comp)
- return COMP_EDITOR_CLASS (event_editor_parent_class)->send_comp (editor, method);
-
- return FALSE;
-}
-
-/* Destroy handler for the event editor */
-static void
-event_editor_finalize (GObject *object)
-{
- EventEditor *ee;
- EventEditorPrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_EVENT_EDITOR (object));
-
- ee = EVENT_EDITOR (object);
- priv = ee->priv;
-
- g_object_unref (priv->event_page);
- g_object_unref (priv->recur_page);
- g_object_unref (priv->meet_page);
- g_object_unref (priv->sched_page);
-
- g_object_unref (priv->model);
-
- g_free (priv);
-
- if (G_OBJECT_CLASS (event_editor_parent_class)->finalize)
- (* G_OBJECT_CLASS (event_editor_parent_class)->finalize) (object);
-}
-
-/**
- * event_editor_new:
- * @client: a ECal
- *
- * Creates a new event editor dialog.
- *
- * Return value: A newly-created event editor dialog, or NULL if the event
- * editor could not be created.
- **/
-EventEditor *
-event_editor_new (ECal *client, gboolean is_meeting)
-{
- EventEditor *ee;
-
- ee = EVENT_EDITOR (g_object_new (TYPE_EVENT_EDITOR, NULL));
- ee->priv->is_meeting = is_meeting;
- return event_editor_construct (ee, client);
-}
-
-static void
-show_meeting (EventEditor *ee)
-{
- EventEditorPrivate *priv;
-
- priv = ee->priv;
-
-
- if (!priv->meeting_shown) {
- comp_editor_append_page (COMP_EDITOR (ee),
- COMP_EDITOR_PAGE (priv->sched_page),
- _("Scheduling"));
- comp_editor_append_page (COMP_EDITOR (ee),
- COMP_EDITOR_PAGE (priv->meet_page),
- _("Invitations"));
- priv->meeting_shown = TRUE;
-
- comp_editor_set_changed (COMP_EDITOR (ee), priv->meeting_shown);
- comp_editor_set_needs_send (COMP_EDITOR (ee), priv->meeting_shown);
- }
-
-}
-
-void
-event_editor_show_meeting (EventEditor *ee)
-{
- g_return_if_fail (ee != NULL);
- g_return_if_fail (IS_EVENT_EDITOR (ee));
-
- show_meeting (ee);
-}
-
-static void
-schedule_meeting_cmd (GtkWidget *widget, gpointer data)
-{
- EventEditor *ee = EVENT_EDITOR (data);
-
- show_meeting (ee);
-}
-
-static void
-refresh_meeting_cmd (GtkWidget *widget, gpointer data)
-{
- EventEditor *ee = EVENT_EDITOR (data);
-
- comp_editor_send_comp (COMP_EDITOR (ee), E_CAL_COMPONENT_METHOD_REFRESH);
-}
-
-static void
-cancel_meeting_cmd (GtkWidget *widget, gpointer data)
-{
- EventEditor *ee = EVENT_EDITOR (data);
- ECalComponent *comp;
-
- comp = comp_editor_get_current_comp (COMP_EDITOR (ee));
- if (cancel_component_dialog ((GtkWindow *) ee,
- comp_editor_get_e_cal (COMP_EDITOR (ee)), comp, FALSE)) {
- comp_editor_send_comp (COMP_EDITOR (ee), E_CAL_COMPONENT_METHOD_CANCEL);
- comp_editor_delete_comp (COMP_EDITOR (ee));
- }
-}
-
-static void
-forward_cmd (GtkWidget *widget, gpointer data)
-{
- EventEditor *ee = EVENT_EDITOR (data);
-
- if (comp_editor_save_comp (COMP_EDITOR (ee), TRUE))
- comp_editor_send_comp (COMP_EDITOR (ee), E_CAL_COMPONENT_METHOD_PUBLISH);
-}
-
-static void
-model_changed (EventEditor *ee)
-{
- if (!ee->priv->updating) {
- comp_editor_set_changed (COMP_EDITOR (ee), TRUE);
- comp_editor_set_needs_send (COMP_EDITOR (ee), TRUE);
- }
-}
-
-static void
-model_row_change_insert_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
-{
- model_changed (EVENT_EDITOR (data));
-}
-
-static void
-model_row_delete_cb (GtkTreeModel *model, GtkTreePath *path, gpointer data)
-{
- model_changed (EVENT_EDITOR (data));
-}
-
diff --git a/calendar/gui/dialogs/event-editor.h b/calendar/gui/dialogs/event-editor.h
deleted file mode 100644
index 0f934c28f2..0000000000
--- a/calendar/gui/dialogs/event-editor.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Evolution calendar - Event editor dialog
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Miguel de Icaza <miguel@ximian.com>
- * Federico Mena-Quintero <federico@ximian.com>
- * Seth Alves <alves@hungry.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef __EVENT_EDITOR_H__
-#define __EVENT_EDITOR_H__
-
-#include <gtk/gtkobject.h>
-#include "comp-editor.h"
-
-
-
-#define TYPE_EVENT_EDITOR (event_editor_get_type ())
-#define EVENT_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_EVENT_EDITOR, EventEditor))
-#define EVENT_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_EVENT_EDITOR, EventEditorClass))
-#define IS_EVENT_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_EVENT_EDITOR))
-#define IS_EVENT_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_EVENT_EDITOR))
-
-typedef struct _EventEditor EventEditor;
-typedef struct _EventEditorClass EventEditorClass;
-typedef struct _EventEditorPrivate EventEditorPrivate;
-
-struct _EventEditor {
- CompEditor parent;
-
- /* Private data */
- EventEditorPrivate *priv;
-};
-
-struct _EventEditorClass {
- CompEditorClass parent_class;
-};
-
-GtkType event_editor_get_type (void);
-EventEditor *event_editor_construct (EventEditor *ee,
- ECal *client);
-EventEditor *event_editor_new (ECal *client, gboolean is_meeting);
-void event_editor_show_meeting (EventEditor *ee);
-
-
-
-#endif /* __EVENT_EDITOR_H__ */
diff --git a/calendar/gui/dialogs/event-page.c b/calendar/gui/dialogs/event-page.c
deleted file mode 100644
index b421d6ee95..0000000000
--- a/calendar/gui/dialogs/event-page.c
+++ /dev/null
@@ -1,2055 +0,0 @@
-/* Evolution calendar - Main page of the event editor dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- * Miguel de Icaza <miguel@ximian.com>
- * Seth Alves <alves@hungry.com>
- * JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtktextview.h>
-#include <gtk/gtktogglebutton.h>
-#include <gtk/gtkmessagedialog.h>
-#include <libgnome/gnome-i18n.h>
-#include <glade/glade.h>
-#include <gal/widgets/e-categories.h>
-#include <libedataserverui/e-source-option-menu.h>
-#include "common/authentication.h"
-#include "e-util/e-categories-config.h"
-#include "e-util/e-dialog-widgets.h"
-#include "widgets/misc/e-dateedit.h"
-#include "widgets/misc/e-send-options.h"
-#include <libecal/e-cal-time-util.h>
-#include "../calendar-config.h"
-#include "../e-timezone-entry.h"
-#include "comp-editor.h"
-#include "comp-editor-util.h"
-#include "../e-alarm-list.h"
-#include "alarm-list-dialog.h"
-#include "event-page.h"
-#include "e-send-options-utils.h"
-
-
-
-/* Private part of the EventPage structure */
-struct _EventPagePrivate {
- /* Glade XML data */
- GladeXML *xml;
-
- /* Widgets from the Glade file */
-
- GtkWidget *main;
-
- GtkWidget *summary;
- GtkWidget *summary_label;
- GtkWidget *location;
- GtkWidget *location_label;
-
- GtkWidget *start_time;
- GtkWidget *end_time;
- GtkWidget *start_timezone;
- GtkWidget *end_timezone;
- GtkWidget *all_day_event;
-
- GtkWidget *description;
-
- GtkWidget *classification;
-
- GtkWidget *show_time_as_busy;
-
- GtkWidget *alarm;
- GtkWidget *alarm_time;
- GtkWidget *alarm_warning;
- GtkWidget *alarm_custom;
-
- GtkWidget *categories_btn;
- GtkWidget *categories;
-
- GtkWidget *source_selector;
-
- GtkWidget *sendoptions_frame;
- GtkWidget *sendoptions_button;
-
- EAlarmList *alarm_list_store;
-
- gboolean updating;
- gboolean sendoptions_shown;
-
- ESendOptionsDialog *sod;
- char *old_summary;
- CalUnits alarm_units;
- int alarm_interval;
-
- /* This is TRUE if both the start & end timezone are the same. If the
- start timezone is then changed, we updated the end timezone to the
- same value, since 99% of events start and end in one timezone. */
- gboolean sync_timezones;
-};
-
-
-
-static void event_page_finalize (GObject *object);
-
-static GtkWidget *event_page_get_widget (CompEditorPage *page);
-static void event_page_focus_main_widget (CompEditorPage *page);
-static gboolean event_page_fill_widgets (CompEditorPage *page, ECalComponent *comp);
-static gboolean event_page_fill_component (CompEditorPage *page, ECalComponent *comp);
-static gboolean event_page_fill_timezones (CompEditorPage *page, GHashTable *timezones);
-static void event_page_set_summary (CompEditorPage *page, const char *summary);
-static void event_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates);
-
-G_DEFINE_TYPE (EventPage, event_page, TYPE_COMP_EDITOR_PAGE);
-
-/* Class initialization function for the event page */
-static void
-event_page_class_init (EventPageClass *class)
-{
- CompEditorPageClass *editor_page_class;
- GObjectClass *object_class;
-
- editor_page_class = (CompEditorPageClass *) class;
- object_class = (GObjectClass *) class;
-
- editor_page_class->get_widget = event_page_get_widget;
- editor_page_class->focus_main_widget = event_page_focus_main_widget;
- editor_page_class->fill_widgets = event_page_fill_widgets;
- editor_page_class->fill_component = event_page_fill_component;
- editor_page_class->fill_timezones = event_page_fill_timezones;
- editor_page_class->set_summary = event_page_set_summary;
- editor_page_class->set_dates = event_page_set_dates;
-
- object_class->finalize = event_page_finalize;
-}
-
-/* Object initialization function for the event page */
-static void
-event_page_init (EventPage *epage)
-{
- EventPagePrivate *priv;
-
- priv = g_new0 (EventPagePrivate, 1);
- epage->priv = priv;
-
- priv->xml = NULL;
-
- priv->main = NULL;
- priv->summary = NULL;
- priv->summary_label = NULL;
- priv->location = NULL;
- priv->location_label = NULL;
- priv->start_time = NULL;
- priv->end_time = NULL;
- priv->start_timezone = NULL;
- priv->end_timezone = NULL;
- priv->all_day_event = NULL;
- priv->description = NULL;
- priv->classification = NULL;
- priv->show_time_as_busy = NULL;
- priv->alarm = NULL;
- priv->alarm_time = NULL;
- priv->alarm_custom = NULL;
- priv->categories_btn = NULL;
- priv->categories = NULL;
- priv->sendoptions_frame = NULL;
- priv->sendoptions_button = NULL;
- priv->sod = NULL;
-
- priv->alarm_interval = -1;
-
- priv->updating = FALSE;
- priv->sendoptions_shown = FALSE;
- priv->sync_timezones = FALSE;
-
-}
-
-/* Destroy handler for the event page */
-static void
-event_page_finalize (GObject *object)
-{
- EventPage *epage;
- EventPagePrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_EVENT_PAGE (object));
-
- epage = EVENT_PAGE (object);
- priv = epage->priv;
-
- if (priv->main)
- gtk_widget_unref (priv->main);
-
- if (priv->xml) {
- g_object_unref (priv->xml);
- priv->xml = NULL;
- }
-
- if (priv->alarm_list_store) {
- g_object_unref (priv->alarm_list_store);
- priv->alarm_list_store = NULL;
- }
-
- if (priv->sod) {
- g_object_unref (priv->sod);
- priv->sod = NULL;
- }
- g_free (priv->old_summary);
-
- g_free (priv);
- epage->priv = NULL;
-
- if (G_OBJECT_CLASS (event_page_parent_class)->finalize)
- (* G_OBJECT_CLASS (event_page_parent_class)->finalize) (object);
-}
-
-
-
-static const int classification_map[] = {
- E_CAL_COMPONENT_CLASS_PUBLIC,
- E_CAL_COMPONENT_CLASS_PRIVATE,
- E_CAL_COMPONENT_CLASS_CONFIDENTIAL,
- -1
-};
-
-enum {
- ALARM_15_MINUTES,
- ALARM_1_HOUR,
- ALARM_1_DAY,
- ALARM_USER_TIME
-};
-
-static const int alarm_map[] = {
- ALARM_15_MINUTES,
- ALARM_1_HOUR,
- ALARM_1_DAY,
- ALARM_USER_TIME,
- -1
-};
-
-/* get_widget handler for the event page */
-static GtkWidget *
-event_page_get_widget (CompEditorPage *page)
-{
- EventPage *epage;
- EventPagePrivate *priv;
-
- epage = EVENT_PAGE (page);
- priv = epage->priv;
-
- return priv->main;
-}
-
-/* focus_main_widget handler for the event page */
-static void
-event_page_focus_main_widget (CompEditorPage *page)
-{
- EventPage *epage;
- EventPagePrivate *priv;
-
- epage = EVENT_PAGE (page);
- priv = epage->priv;
-
- gtk_widget_grab_focus (priv->summary);
-}
-
-/* Sets the 'All Day Event' flag to the given value (without emitting signals),
- * and shows or hides the widgets as appropriate. */
-static void
-set_all_day (EventPage *epage, gboolean all_day)
-{
- EventPagePrivate *priv;
-
- priv = epage->priv;
-
- gtk_signal_handler_block_by_data (GTK_OBJECT (priv->all_day_event),
- epage);
- e_dialog_toggle_set (priv->all_day_event, all_day);
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->all_day_event),
- epage);
-
- e_date_edit_set_show_time (E_DATE_EDIT (priv->start_time), !all_day);
- e_date_edit_set_show_time (E_DATE_EDIT (priv->end_time), !all_day);
-
- /* DATE values do not have timezones, so we hide the fields. */
- if (all_day) {
- gtk_widget_hide (priv->start_timezone);
- gtk_widget_hide (priv->end_timezone);
- } else {
- gtk_widget_show (priv->start_timezone);
- gtk_widget_show (priv->end_timezone);
- }
-}
-
-static void
-update_time (EventPage *epage, ECalComponentDateTime *start_date, ECalComponentDateTime *end_date)
-{
- EventPagePrivate *priv;
- struct icaltimetype *start_tt, *end_tt, implied_tt;
- icaltimezone *start_zone = NULL, *end_zone = NULL;
- gboolean all_day_event;
-
- priv = epage->priv;
-
- /* Note that if we are creating a new event, the timezones may not be
- on the server, so we try to get the builtin timezone with the TZID
- first. */
- start_zone = icaltimezone_get_builtin_timezone_from_tzid (start_date->tzid);
- if (!start_zone) {
- /* FIXME: Handle error better. */
- if (!e_cal_get_timezone (COMP_EDITOR_PAGE (epage)->client,
- start_date->tzid, &start_zone, NULL)) {
- g_warning ("Couldn't get timezone from server: %s",
- start_date->tzid ? start_date->tzid : "");
- }
- }
-
- end_zone = icaltimezone_get_builtin_timezone_from_tzid (end_date->tzid);
- if (!end_zone) {
- if (!e_cal_get_timezone (COMP_EDITOR_PAGE (epage)->client,
- end_date->tzid, &end_zone, NULL)) {
- /* FIXME: Handle error better. */
- g_warning ("Couldn't get timezone from server: %s",
- end_date->tzid ? end_date->tzid : "");
- }
- }
-
- /* If both times are DATE values, we set the 'All Day Event' checkbox.
- Also, if DTEND is after DTSTART, we subtract 1 day from it. */
- all_day_event = FALSE;
- start_tt = start_date->value;
- end_tt = end_date->value;
- if (!end_tt && start_tt->is_date) {
- end_tt = &implied_tt;
- *end_tt = *start_tt;
- icaltime_adjust (end_tt, 1, 0, 0, 0);
- }
-
- if (start_tt->is_date && end_tt->is_date) {
- all_day_event = TRUE;
- if (icaltime_compare_date_only (*end_tt, *start_tt) > 0) {
- icaltime_adjust (end_tt, -1, 0, 0, 0);
- }
- }
-
- set_all_day (epage, all_day_event);
-
- /* If it is an all day event, we set both timezones to the current
- timezone, so that if the user toggles the 'All Day Event' checkbox
- the event uses the current timezone rather than none at all. */
- if (all_day_event)
- start_zone = end_zone = calendar_config_get_icaltimezone ();
-
- gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time),
- epage);
- g_signal_handlers_block_matched (priv->end_time, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, epage);
-
- e_date_edit_set_date (E_DATE_EDIT (priv->start_time), start_tt->year,
- start_tt->month, start_tt->day);
- e_date_edit_set_time_of_day (E_DATE_EDIT (priv->start_time),
- start_tt->hour, start_tt->minute);
-
- e_date_edit_set_date (E_DATE_EDIT (priv->end_time), end_tt->year,
- end_tt->month, end_tt->day);
- e_date_edit_set_time_of_day (E_DATE_EDIT (priv->end_time),
- end_tt->hour, end_tt->minute);
-
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time),
- epage);
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time),
- epage);
-
- /* Set the timezones, and set sync_timezones to TRUE if both timezones
- are the same. */
- gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_timezone),
- epage);
- g_signal_handlers_block_matched (priv->end_timezone, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, epage);
-
- e_timezone_entry_set_timezone (E_TIMEZONE_ENTRY (priv->start_timezone),
- start_zone);
- e_timezone_entry_set_timezone (E_TIMEZONE_ENTRY (priv->end_timezone),
- end_zone);
-
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_timezone),
- epage);
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_timezone),
- epage);
-
- priv->sync_timezones = (start_zone == end_zone) ? TRUE : FALSE;
-
-}
-
-/* Fills the widgets with default values */
-static void
-clear_widgets (EventPage *epage)
-{
- EventPagePrivate *priv;
-
- priv = epage->priv;
-
- /* Summary, description */
- e_dialog_editable_set (priv->summary, NULL);
- e_dialog_editable_set (priv->location, NULL);
- gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->description)), "", 0);
-
- /* Start and end times */
- gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time),
- epage);
- g_signal_handlers_block_matched (priv->end_time, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, epage);
-
- e_date_edit_set_time (E_DATE_EDIT (priv->start_time), 0);
- e_date_edit_set_time (E_DATE_EDIT (priv->end_time), 0);
-
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time),
- epage);
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time),
- epage);
-
- set_all_day (epage, FALSE);
-
- /* Classification */
- e_dialog_option_menu_set (priv->classification, E_CAL_COMPONENT_CLASS_PRIVATE, classification_map);
-
- /* Show Time As (Transparency) */
- e_dialog_toggle_set (priv->show_time_as_busy, TRUE);
-
- /* Alarm */
- e_dialog_toggle_set (priv->alarm, FALSE);
- e_dialog_option_menu_set (priv->alarm_time, ALARM_15_MINUTES, alarm_map);
-
- /* Categories */
- e_dialog_editable_set (priv->categories, NULL);
-}
-
-static gboolean
-is_custom_alarm (ECalComponentAlarm *ca, char *old_summary, CalUnits user_units, int user_interval, int *alarm_type)
-{
- ECalComponentAlarmTrigger trigger;
- ECalComponentAlarmRepeat repeat;
- ECalComponentAlarmAction action;
- ECalComponentText desc;
- icalcomponent *icalcomp;
- icalproperty *icalprop;
- icalattach *attach;
- gboolean needs_desc = FALSE;
-
- e_cal_component_alarm_get_action (ca, &action);
- if (action != E_CAL_COMPONENT_ALARM_DISPLAY)
- return TRUE;
-
- e_cal_component_alarm_get_attach (ca, &attach);
- if (attach)
- return TRUE;
-
- icalcomp = e_cal_component_alarm_get_icalcomponent (ca);
- icalprop = icalcomponent_get_first_property (icalcomp, ICAL_X_PROPERTY);
- while (icalprop) {
- const char *x_name;
-
- x_name = icalproperty_get_x_name (icalprop);
- if (!strcmp (x_name, "X-EVOLUTION-NEEDS-DESCRIPTION"))
- needs_desc = TRUE;
-
- icalprop = icalcomponent_get_next_property (icalcomp, ICAL_X_PROPERTY);
- }
-
- if (!needs_desc) {
- e_cal_component_alarm_get_description (ca, &desc);
- if (!desc.value || !old_summary || strcmp (desc.value, old_summary))
- return TRUE;
- }
-
- e_cal_component_alarm_get_repeat (ca, &repeat);
- if (repeat.repetitions != 0)
- return TRUE;
-
- if (e_cal_component_alarm_has_attendees (ca))
- return TRUE;
-
- e_cal_component_alarm_get_trigger (ca, &trigger);
- if (trigger.type != E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START)
- return TRUE;
-
- if (trigger.u.rel_duration.is_neg != 1)
- return TRUE;
-
- if (trigger.u.rel_duration.weeks != 0)
- return TRUE;
-
- if (trigger.u.rel_duration.seconds != 0)
- return TRUE;
-
- if (trigger.u.rel_duration.days == 1
- && trigger.u.rel_duration.hours == 0
- && trigger.u.rel_duration.minutes == 0) {
- if (alarm_type)
- *alarm_type = ALARM_1_DAY;
- return FALSE;
- }
-
- if (trigger.u.rel_duration.days == 0
- && trigger.u.rel_duration.hours == 1
- && trigger.u.rel_duration.minutes == 0) {
- if (alarm_type)
- *alarm_type = ALARM_1_HOUR;
- return FALSE;
- }
-
- if (trigger.u.rel_duration.days == 0
- && trigger.u.rel_duration.hours == 0
- && trigger.u.rel_duration.minutes == 15) {
- if (alarm_type)
- *alarm_type = ALARM_15_MINUTES;
- return FALSE;
- }
-
- if (user_interval != -1) {
- switch (user_units) {
- case CAL_DAYS:
- if (trigger.u.rel_duration.days == user_interval
- && trigger.u.rel_duration.hours == 0
- && trigger.u.rel_duration.minutes == 0) {
- if (alarm_type)
- *alarm_type = ALARM_USER_TIME;
- return FALSE;
- }
- break;
-
- case CAL_HOURS:
- if (trigger.u.rel_duration.days == 0
- && trigger.u.rel_duration.hours == user_interval
- && trigger.u.rel_duration.minutes == 0) {
- if (alarm_type)
- *alarm_type = ALARM_USER_TIME;
- return FALSE;
- }
- break;
-
- case CAL_MINUTES:
- if (trigger.u.rel_duration.days == 0
- && trigger.u.rel_duration.hours == 0
- && trigger.u.rel_duration.minutes == user_interval) {
- if (alarm_type)
- *alarm_type = ALARM_USER_TIME;
- return FALSE;
- }
- break;
- }
- }
-
- return TRUE;
-}
-
-static gboolean
-is_custom_alarm_uid_list (ECalComponent *comp, GList *alarms, char *old_summary, CalUnits user_units, int user_interval, int *alarm_type)
-{
- ECalComponentAlarm *ca;
- gboolean result;
-
- if (g_list_length (alarms) > 1)
- return TRUE;
-
- ca = e_cal_component_get_alarm (comp, alarms->data);
- result = is_custom_alarm (ca, old_summary, user_units, user_interval, alarm_type);
- e_cal_component_alarm_free (ca);
-
- return result;
-}
-
-static gboolean
-is_custom_alarm_store (EAlarmList *alarm_list_store, char *old_summary, CalUnits user_units, int user_interval, int *alarm_type)
-{
- const ECalComponentAlarm *alarm;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gboolean valid_iter;
-
- model = GTK_TREE_MODEL (alarm_list_store);
-
- valid_iter = gtk_tree_model_get_iter_first (model, &iter);
- if (!valid_iter)
- return FALSE;
-
- alarm = e_alarm_list_get_alarm (alarm_list_store, &iter);
- if (is_custom_alarm ((ECalComponentAlarm *)alarm, old_summary, user_units, user_interval, alarm_type))
- return TRUE;
-
- valid_iter = gtk_tree_model_iter_next (model, &iter);
- if (valid_iter)
- return TRUE;
-
- return FALSE;
-}
-
-static void
-sensitize_widgets (EventPage *epage)
-{
- gboolean read_only, custom, alarm;
- EventPagePrivate *priv;
-
- priv = epage->priv;
-
- if (!e_cal_is_read_only (COMP_EDITOR_PAGE (epage)->client, &read_only, NULL))
- read_only = TRUE;
-
- custom = is_custom_alarm_store (priv->alarm_list_store, priv->old_summary, priv->alarm_units, priv->alarm_interval, NULL);
- alarm = e_dialog_toggle_get (priv->alarm);
-
- gtk_widget_set_sensitive (priv->summary_label, !read_only);
- gtk_entry_set_editable (GTK_ENTRY (priv->summary), !read_only);
- gtk_widget_set_sensitive (priv->location_label, !read_only);
- gtk_entry_set_editable (GTK_ENTRY (priv->location), !read_only);
- gtk_widget_set_sensitive (priv->start_time, !read_only);
- gtk_widget_set_sensitive (priv->start_timezone, !read_only);
- gtk_widget_set_sensitive (priv->end_time, !read_only);
- gtk_widget_set_sensitive (priv->end_timezone, !read_only);
- gtk_widget_set_sensitive (priv->all_day_event, !read_only);
- gtk_widget_set_sensitive (priv->description, !read_only);
- gtk_widget_set_sensitive (priv->classification, !read_only);
- gtk_widget_set_sensitive (priv->show_time_as_busy, !read_only);
- gtk_widget_set_sensitive (priv->alarm, !read_only);
- gtk_widget_set_sensitive (priv->alarm_time, !read_only && !custom && alarm);
- gtk_widget_set_sensitive (priv->alarm_custom, alarm);
- if (custom)
- gtk_widget_show (priv->alarm_warning);
- else
- gtk_widget_hide (priv->alarm_warning);
- gtk_widget_set_sensitive (priv->categories_btn, !read_only);
- gtk_widget_set_sensitive (priv->sendoptions_button, !read_only);
- gtk_entry_set_editable (GTK_ENTRY (priv->categories), !read_only);
-}
-
-void
-event_page_hide_options (EventPage *page)
-{
- g_return_if_fail (IS_EVENT_PAGE (page));
-
- gtk_widget_hide (page->priv->sendoptions_frame);
-
- page->priv->sendoptions_shown = FALSE;
-}
-
-void
-event_page_show_options (EventPage *page)
-{
- g_return_if_fail (IS_EVENT_PAGE (page));
-
- gtk_widget_show (page->priv->sendoptions_frame);
-
- if (e_cal_get_static_capability (COMP_EDITOR_PAGE (page)->client, CAL_STATIC_CAPABILITY_NO_GEN_OPTIONS))
- e_sendoptions_set_need_general_options (page->priv->sod, FALSE);
-
- page->priv->sendoptions_shown = TRUE;
-}
-
-
-/* fill_widgets handler for the event page */
-static gboolean
-event_page_fill_widgets (CompEditorPage *page, ECalComponent *comp)
-{
- EventPage *epage;
- EventPagePrivate *priv;
- ECalComponentText text;
- ECalComponentClassification cl;
- ECalComponentTransparency transparency;
- ECalComponentDateTime start_date, end_date;
- icalcomponent *icalcomp;
- const char *location, *uid = NULL;
- const char *categories;
- ESource *source;
- GSList *l;
- gboolean validated = TRUE;
-
- g_return_val_if_fail (page->client != NULL, FALSE);
-
- epage = EVENT_PAGE (page);
- priv = epage->priv;
-
- /* Don't send off changes during this time */
- priv->updating = TRUE;
-
- /* Clean the page */
- clear_widgets (epage);
-
- /* Summary, location, description(s) */
-
- e_cal_component_get_summary (comp, &text);
- e_dialog_editable_set (priv->summary, text.value);
- priv->old_summary = g_strdup (text.value);
-
- e_cal_component_get_location (comp, &location);
- e_dialog_editable_set (priv->location, location);
-
- e_cal_component_get_description_list (comp, &l);
- if (l && l->data) {
- ECalComponentText *dtext;
-
- dtext = l->data;
- gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->description)),
- dtext->value ? dtext->value : "", -1);
- }
- e_cal_component_free_text_list (l);
-
- /* Start and end times */
-
- e_cal_component_get_dtstart (comp, &start_date);
- e_cal_component_get_dtend (comp, &end_date);
- if (!start_date.value) {
- comp_editor_page_display_validation_error (page, _("Event with no start date"), priv->start_time);
- validated = FALSE;
- } else if (!end_date.value) {
- comp_editor_page_display_validation_error (page, _("Event with no end date"), priv->end_time);
- validated = FALSE;
- } else
- update_time (epage, &start_date, &end_date);
-
- e_cal_component_free_datetime (&start_date);
- e_cal_component_free_datetime (&end_date);
-
- /* Classification */
- e_cal_component_get_classification (comp, &cl);
-
- switch (cl) {
- case E_CAL_COMPONENT_CLASS_PUBLIC:
- case E_CAL_COMPONENT_CLASS_PRIVATE:
- case E_CAL_COMPONENT_CLASS_CONFIDENTIAL:
- break;
- default:
- cl = E_CAL_COMPONENT_CLASS_PUBLIC;
- break;
- }
- e_dialog_option_menu_set (priv->classification, cl, classification_map);
-
- /* Show Time As (Transparency) */
- e_cal_component_get_transparency (comp, &transparency);
- switch (transparency) {
- case E_CAL_COMPONENT_TRANSP_TRANSPARENT:
- e_dialog_toggle_set (priv->show_time_as_busy, FALSE);
- break;
-
- default:
- e_dialog_toggle_set (priv->show_time_as_busy, TRUE);
- break;
- }
- if (e_cal_get_static_capability (page->client, CAL_STATIC_CAPABILITY_NO_TRANSPARENCY))
- gtk_widget_hide (priv->show_time_as_busy);
- else
- gtk_widget_show (priv->show_time_as_busy);
-
- /* Alarms */
- g_signal_handlers_block_matched (priv->alarm, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, epage);
- if (e_cal_component_has_alarms (comp)) {
- GList *alarms, *l;
- int alarm_type;
-
- e_dialog_toggle_set (priv->alarm, TRUE);
-
- alarms = e_cal_component_get_alarm_uids (comp);
- if (!is_custom_alarm_uid_list (comp, alarms, priv->old_summary, priv->alarm_units, priv->alarm_interval, &alarm_type))
- e_dialog_option_menu_set (priv->alarm_time, alarm_type, alarm_map);
-
- for (l = alarms; l != NULL; l = l->next) {
- ECalComponentAlarm *ca;
-
- ca = e_cal_component_get_alarm (comp, l->data);
- e_alarm_list_append (priv->alarm_list_store, NULL, ca);
- e_cal_component_alarm_free (ca);
- }
-
- cal_obj_uid_list_free (alarms);
- } else {
- e_dialog_toggle_set (priv->alarm, FALSE);
- e_dialog_option_menu_set (priv->alarm_time, priv->alarm_interval == -1 ? ALARM_15_MINUTES : ALARM_USER_TIME, alarm_map);
- }
- g_signal_handlers_unblock_matched (priv->alarm, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, epage);
-
- /* Categories */
- e_cal_component_get_categories (comp, &categories);
- e_dialog_editable_set (priv->categories, categories);
-
- /* Source */
- source = e_cal_get_source (page->client);
- e_source_option_menu_select (E_SOURCE_OPTION_MENU (priv->source_selector), source);
-
- e_cal_component_get_uid (comp, &uid);
- if (e_cal_get_object (COMP_EDITOR_PAGE (epage)->client, uid, NULL, &icalcomp, NULL)) {
- icalcomponent_free (icalcomp);
- event_page_hide_options (epage);
- }
-
- priv->updating = FALSE;
-
- sensitize_widgets (epage);
-
- return validated;
-}
-
-/* fill_component handler for the event page */
-static gboolean
-event_page_fill_component (CompEditorPage *page, ECalComponent *comp)
-{
- EventPage *epage;
- EventPagePrivate *priv;
- ECalComponentDateTime start_date, end_date;
- struct icaltimetype start_tt, end_tt;
- gboolean all_day_event, start_date_set, end_date_set, busy;
- char *cat, *str;
- ECalComponentClassification classif;
- GtkTextBuffer *text_buffer;
- GtkTextIter text_iter_start, text_iter_end;
-
- epage = EVENT_PAGE (page);
- priv = epage->priv;
- text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->description));
-
- /* Summary */
-
- str = e_dialog_editable_get (priv->summary);
- if (!str || strlen (str) == 0)
- e_cal_component_set_summary (comp, NULL);
- else {
- ECalComponentText text;
-
- text.value = str;
- text.altrep = NULL;
-
- e_cal_component_set_summary (comp, &text);
- }
-
- if (str)
- g_free (str);
-
- /* Location */
-
- str = e_dialog_editable_get (priv->location);
- if (!str || strlen (str) == 0)
- e_cal_component_set_location (comp, NULL);
- else
- e_cal_component_set_location (comp, str);
-
- if (str)
- g_free (str);
-
- /* Description */
-
- gtk_text_buffer_get_start_iter (text_buffer, &text_iter_start);
- gtk_text_buffer_get_end_iter (text_buffer, &text_iter_end);
- str = gtk_text_buffer_get_text (text_buffer, &text_iter_start, &text_iter_end, FALSE);
-
- if (!str || strlen (str) == 0)
- e_cal_component_set_description_list (comp, NULL);
- else {
- GSList l;
- ECalComponentText text;
-
- text.value = str;
- text.altrep = NULL;
- l.data = &text;
- l.next = NULL;
-
- e_cal_component_set_description_list (comp, &l);
- }
-
- if (str)
- g_free (str);
-
- /* Dates */
-
- start_tt = icaltime_null_time ();
- start_date.value = &start_tt;
- start_date.tzid = NULL;
-
- end_tt = icaltime_null_time ();
- end_date.value = &end_tt;
- end_date.tzid = NULL;
-
- if (!e_date_edit_date_is_valid (E_DATE_EDIT (priv->start_time))) {
- comp_editor_page_display_validation_error (page, _("Start date is wrong"), priv->start_time);
- return FALSE;
- }
- start_date_set = e_date_edit_get_date (E_DATE_EDIT (priv->start_time),
- &start_tt.year,
- &start_tt.month,
- &start_tt.day);
- g_assert (start_date_set);
-
- if (!e_date_edit_date_is_valid (E_DATE_EDIT (priv->end_time))) {
- comp_editor_page_display_validation_error (page, _("End date is wrong"), priv->end_time);
- return FALSE;
- }
- end_date_set = e_date_edit_get_date (E_DATE_EDIT (priv->end_time),
- &end_tt.year,
- &end_tt.month,
- &end_tt.day);
- g_assert (end_date_set);
-
- /* If the all_day toggle is set, we use DATE values for DTSTART and
- DTEND. If not, we fetch the hour & minute from the widgets. */
- all_day_event = e_dialog_toggle_get (priv->all_day_event);
-
- if (all_day_event) {
- start_tt.is_date = TRUE;
- end_tt.is_date = TRUE;
-
- /* We have to add 1 day to DTEND, as it is not inclusive. */
- icaltime_adjust (&end_tt, 1, 0, 0, 0);
- } else {
- icaltimezone *start_zone, *end_zone;
-
- if (!e_date_edit_time_is_valid (E_DATE_EDIT (priv->start_time))) {
- comp_editor_page_display_validation_error (page, _("Start time is wrong"), priv->start_time);
- return FALSE;
- }
- e_date_edit_get_time_of_day (E_DATE_EDIT (priv->start_time),
- &start_tt.hour,
- &start_tt.minute);
- if (!e_date_edit_time_is_valid (E_DATE_EDIT (priv->end_time))) {
- comp_editor_page_display_validation_error (page, _("End time is wrong"), priv->end_time);
- return FALSE;
- }
- e_date_edit_get_time_of_day (E_DATE_EDIT (priv->end_time),
- &end_tt.hour,
- &end_tt.minute);
- start_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone));
- start_date.tzid = icaltimezone_get_tzid (start_zone);
- end_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->end_timezone));
- end_date.tzid = icaltimezone_get_tzid (end_zone);
- }
-
- e_cal_component_set_dtstart (comp, &start_date);
- e_cal_component_set_dtend (comp, &end_date);
-
-
- /* Categories */
-
- cat = e_dialog_editable_get (priv->categories);
- str = comp_editor_strip_categories (cat);
- if (cat)
- g_free (cat);
-
- e_cal_component_set_categories (comp, str);
-
- if (str)
- g_free (str);
-
- /* Classification */
- classif = e_dialog_option_menu_get (priv->classification, classification_map);
- e_cal_component_set_classification (comp, classif);
-
- /* Show Time As (Transparency) */
- busy = e_dialog_toggle_get (priv->show_time_as_busy);
- e_cal_component_set_transparency (comp, busy ? E_CAL_COMPONENT_TRANSP_OPAQUE : E_CAL_COMPONENT_TRANSP_TRANSPARENT);
-
- /* send options */
- if (priv->sendoptions_shown && priv->sod)
- e_sendoptions_utils_fill_component (priv->sod, comp);
-
- /* Alarm */
- e_cal_component_remove_all_alarms (comp);
- if (e_dialog_toggle_get (priv->alarm)) {
- if (is_custom_alarm_store (priv->alarm_list_store, priv->old_summary, priv->alarm_units, priv->alarm_interval, NULL)) {
- GtkTreeModel *model;
- GtkTreeIter iter;
- gboolean valid_iter;
-
- model = GTK_TREE_MODEL (priv->alarm_list_store);
-
- for (valid_iter = gtk_tree_model_get_iter_first (model, &iter); valid_iter;
- valid_iter = gtk_tree_model_iter_next (model, &iter)) {
- ECalComponentAlarm *alarm, *alarm_copy;
- icalcomponent *icalcomp;
- icalproperty *icalprop;
-
- alarm = (ECalComponentAlarm *) e_alarm_list_get_alarm (priv->alarm_list_store, &iter);
- g_assert (alarm != NULL);
-
- /* We set the description of the alarm if it's got
- * the X-EVOLUTION-NEEDS-DESCRIPTION property.
- */
- icalcomp = e_cal_component_alarm_get_icalcomponent (alarm);
- icalprop = icalcomponent_get_first_property (icalcomp, ICAL_X_PROPERTY);
- while (icalprop) {
- const char *x_name;
- ECalComponentText summary;
-
- x_name = icalproperty_get_x_name (icalprop);
- if (!strcmp (x_name, "X-EVOLUTION-NEEDS-DESCRIPTION")) {
- e_cal_component_get_summary (comp, &summary);
- e_cal_component_alarm_set_description (alarm, &summary);
-
- icalcomponent_remove_property (icalcomp, icalprop);
- break;
- }
-
- icalprop = icalcomponent_get_next_property (icalcomp, ICAL_X_PROPERTY);
- }
-
- /* We clone the alarm to maintain the invariant that the alarm
- * structures in the list did *not* come from the component.
- */
-
- alarm_copy = e_cal_component_alarm_clone (alarm);
- e_cal_component_add_alarm (comp, alarm_copy);
- e_cal_component_alarm_free (alarm_copy);
- }
- } else {
- ECalComponentAlarm *ca;
- ECalComponentText summary;
- ECalComponentAlarmTrigger trigger;
- int alarm_type;
-
- ca = e_cal_component_alarm_new ();
-
- e_cal_component_get_summary (comp, &summary);
- e_cal_component_alarm_set_description (ca, &summary);
-
- e_cal_component_alarm_set_action (ca, E_CAL_COMPONENT_ALARM_DISPLAY);
-
- memset (&trigger, 0, sizeof (ECalComponentAlarmTrigger));
- trigger.type = E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START;
- trigger.u.rel_duration.is_neg = 1;
-
- alarm_type = e_dialog_option_menu_get (priv->alarm_time, alarm_map);
- switch (alarm_type) {
- case ALARM_15_MINUTES:
- trigger.u.rel_duration.minutes = 15;
- break;
-
- case ALARM_1_HOUR:
- trigger.u.rel_duration.hours = 1;
- break;
-
- case ALARM_1_DAY:
- trigger.u.rel_duration.days = 1;
- break;
-
- case ALARM_USER_TIME:
- switch (calendar_config_get_default_reminder_units ()) {
- case CAL_DAYS:
- trigger.u.rel_duration.days = priv->alarm_interval;
- break;
-
- case CAL_HOURS:
- trigger.u.rel_duration.hours = priv->alarm_interval;
- break;
-
- case CAL_MINUTES:
- trigger.u.rel_duration.minutes = priv->alarm_interval;
- break;
- }
- break;
-
- default:
- break;
- }
- e_cal_component_alarm_set_trigger (ca, trigger);
-
- e_cal_component_add_alarm (comp, ca);
- }
- }
-
- return TRUE;
-}
-
-/* fill_timezones handler for the event page */
-static gboolean
-event_page_fill_timezones (CompEditorPage *page, GHashTable *timezones)
-{
- EventPage *epage;
- EventPagePrivate *priv;
- icaltimezone *zone;
-
- epage = EVENT_PAGE (page);
- priv = epage->priv;
-
- /* add start date timezone */
- zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone));
- if (zone) {
- if (!g_hash_table_lookup (timezones, icaltimezone_get_tzid (zone)))
- g_hash_table_insert (timezones, icaltimezone_get_tzid (zone), zone);
- }
-
- /* add end date timezone */
- zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->end_timezone));
- if (zone) {
- if (!g_hash_table_lookup (timezones, icaltimezone_get_tzid (zone)))
- g_hash_table_insert (timezones, icaltimezone_get_tzid (zone), zone);
- }
-
- return TRUE;
-}
-
-/* set_summary handler for the event page */
-static void
-event_page_set_summary (CompEditorPage *page, const char *summary)
-{
- /* nothing */
-}
-
-static void
-event_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates)
-{
- update_time (EVENT_PAGE (page), dates->start, dates->end);
-}
-
-
-
-/* Gets the widgets from the XML file and returns if they are all available. */
-static gboolean
-get_widgets (EventPage *epage)
-{
- CompEditorPage *page = COMP_EDITOR_PAGE (epage);
- EventPagePrivate *priv;
- GSList *accel_groups;
- GtkWidget *toplevel;
-
- priv = epage->priv;
-
-#define GW(name) glade_xml_get_widget (priv->xml, name)
-
- priv->main = GW ("event-page");
- if (!priv->main)
- return FALSE;
-
- /* Get the GtkAccelGroup from the toplevel window, so we can install
- it when the notebook page is mapped. */
- toplevel = gtk_widget_get_toplevel (priv->main);
- accel_groups = gtk_accel_groups_from_object (G_OBJECT (toplevel));
- if (accel_groups) {
- page->accel_group = accel_groups->data;
- gtk_accel_group_ref (page->accel_group);
- }
-
- gtk_widget_ref (priv->main);
- gtk_container_remove (GTK_CONTAINER (priv->main->parent), priv->main);
-
- priv->summary = GW ("summary");
- priv->summary_label = GW ("summary-label");
- priv->location = GW ("location");
- priv->location_label = GW ("location-label");
-
- /* Glade's visibility flag doesn't seem to work for custom widgets */
- priv->start_time = GW ("start-time");
- gtk_widget_show (priv->start_time);
- priv->end_time = GW ("end-time");
- gtk_widget_show (priv->end_time);
-
- priv->start_timezone = GW ("start-timezone");
- priv->end_timezone = GW ("end-timezone");
- priv->all_day_event = GW ("all-day-event");
-
- priv->description = GW ("description");
-
- priv->classification = GW ("classification");
-
- priv->show_time_as_busy = GW ("show-time-as-busy");
-
- priv->alarm = GW ("alarm");
- priv->alarm_time = GW ("alarm-time");
- priv->alarm_warning = GW ("alarm-warning");
- priv->alarm_custom = GW ("alarm-custom");
-
- priv->categories_btn = GW ("categories-button");
- priv->categories = GW ("categories");
-
- priv->source_selector = GW ("source");
-
- priv->sendoptions_frame = GW ("send-options-frame");
- priv->sendoptions_button = GW ("send-options-button");
-
-#undef GW
-
- return (priv->summary
- && priv->location
- && priv->start_time
- && priv->end_time
- && priv->start_timezone
- && priv->end_timezone
- && priv->all_day_event
- && priv->description
- && priv->classification
- && priv->show_time_as_busy
- && priv->alarm
- && priv->alarm_time
- && priv->alarm_warning
- && priv->alarm_custom
- && priv->categories_btn
- && priv->categories
- && priv->sendoptions_frame
- && priv->sendoptions_button);
-}
-
-/* Callback used when the summary changes; we emit the notification signal. */
-static void
-summary_changed_cb (GtkEditable *editable, gpointer data)
-{
- EventPage *epage;
- EventPagePrivate *priv;
- gchar *summary;
-
- epage = EVENT_PAGE (data);
- priv = epage->priv;
-
- if (priv->updating)
- return;
-
- summary = e_dialog_editable_get (GTK_WIDGET (editable));
- comp_editor_page_notify_summary_changed (COMP_EDITOR_PAGE (epage),
- summary);
- g_free (summary);
-}
-
-
-/* Note that this assumes that the start_tt and end_tt passed to it are the
- dates visible to the user. For DATE values, we have to add 1 day to the
- end_tt before emitting the signal. */
-static void
-notify_dates_changed (EventPage *epage, struct icaltimetype *start_tt,
- struct icaltimetype *end_tt)
-{
- EventPagePrivate *priv;
- CompEditorPageDates dates;
- ECalComponentDateTime start_dt, end_dt;
- gboolean all_day_event;
- icaltimezone *start_zone = NULL, *end_zone = NULL;
-
- priv = epage->priv;
-
- all_day_event = e_dialog_toggle_get (priv->all_day_event);
-
- start_dt.value = start_tt;
- end_dt.value = end_tt;
-
- if (all_day_event) {
- /* The actual DTEND is 1 day after the displayed date for
- DATE values. */
- icaltime_adjust (end_tt, 1, 0, 0, 0);
- } else {
- start_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone));
- end_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->end_timezone));
- }
-
- start_dt.tzid = start_zone ? icaltimezone_get_tzid (start_zone) : NULL;
- end_dt.tzid = end_zone ? icaltimezone_get_tzid (end_zone) : NULL;
-
- dates.start = &start_dt;
- dates.end = &end_dt;
-
- dates.due = NULL;
- dates.complete = NULL;
-
- comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (epage),
- &dates);
-}
-
-
-static gboolean
-check_start_before_end (struct icaltimetype *start_tt,
- icaltimezone *start_zone,
- struct icaltimetype *end_tt,
- icaltimezone *end_zone,
- gboolean adjust_end_time)
-{
- struct icaltimetype end_tt_copy;
- int cmp;
-
- /* Convert the end time to the same timezone as the start time. */
- end_tt_copy = *end_tt;
- icaltimezone_convert_time (&end_tt_copy, end_zone, start_zone);
-
- /* Now check if the start time is after the end time. If it is,
- we need to modify one of the times. */
- cmp = icaltime_compare (*start_tt, end_tt_copy);
- if (cmp > 0) {
- if (adjust_end_time) {
- /* Modify the end time, to be the start + 1 hour. */
- *end_tt = *start_tt;
- icaltime_adjust (end_tt, 0, 1, 0, 0);
- icaltimezone_convert_time (end_tt, start_zone,
- end_zone);
- } else {
- /* Modify the start time, to be the end - 1 hour. */
- *start_tt = *end_tt;
- icaltime_adjust (start_tt, 0, -1, 0, 0);
- icaltimezone_convert_time (start_tt, end_zone,
- start_zone);
- }
- return TRUE;
- }
-
- return FALSE;
-}
-
-
-/*
- * This is called whenever the start or end dates or timezones is changed.
- * It makes sure that the start date < end date. It also emits the notification
- * signals so the other event editor pages update their labels etc.
- *
- * If adjust_end_time is TRUE, if the start time < end time it will adjust
- * the end time. If FALSE it will adjust the start time. If the user sets the
- * start or end time, the other time is adjusted to make it valid.
- */
-static void
-times_updated (EventPage *epage, gboolean adjust_end_time)
-{
- EventPagePrivate *priv;
- struct icaltimetype start_tt = icaltime_null_time();
- struct icaltimetype end_tt = icaltime_null_time();
- gboolean date_set, all_day_event;
- gboolean set_start_date = FALSE, set_end_date = FALSE;
- icaltimezone *start_zone, *end_zone;
-
- priv = epage->priv;
-
- if (priv->updating)
- return;
-
- /* Fetch the start and end times and timezones from the widgets. */
- all_day_event = e_dialog_toggle_get (priv->all_day_event);
-
- date_set = e_date_edit_get_date (E_DATE_EDIT (priv->start_time),
- &start_tt.year,
- &start_tt.month,
- &start_tt.day);
- g_assert (date_set);
-
- date_set = e_date_edit_get_date (E_DATE_EDIT (priv->end_time),
- &end_tt.year,
- &end_tt.month,
- &end_tt.day);
- g_assert (date_set);
-
- if (all_day_event) {
- /* All Day Events are simple. We just compare the dates and if
- start > end we copy one of them to the other. */
- int cmp = icaltime_compare_date_only (start_tt, end_tt);
- if (cmp > 0) {
- if (adjust_end_time) {
- end_tt = start_tt;
- set_end_date = TRUE;
- } else {
- start_tt = end_tt;
- set_start_date = TRUE;
- }
- }
-
- start_tt.is_date = TRUE;
- end_tt.is_date = TRUE;
- } else {
- /* For DATE-TIME events, we have to convert to the same
- timezone before comparing. */
- e_date_edit_get_time_of_day (E_DATE_EDIT (priv->start_time),
- &start_tt.hour,
- &start_tt.minute);
- e_date_edit_get_time_of_day (E_DATE_EDIT (priv->end_time),
- &end_tt.hour,
- &end_tt.minute);
-
- start_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone));
- end_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->end_timezone));
-
- if (check_start_before_end (&start_tt, start_zone,
- &end_tt, end_zone,
- adjust_end_time)) {
- if (adjust_end_time)
- set_end_date = TRUE;
- else
- set_start_date = TRUE;
- }
- }
-
-
- if (set_start_date) {
- g_signal_handlers_block_matched (priv->start_time, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, epage);
- e_date_edit_set_date (E_DATE_EDIT (priv->start_time),
- start_tt.year, start_tt.month,
- start_tt.day);
- e_date_edit_set_time_of_day (E_DATE_EDIT (priv->start_time),
- start_tt.hour, start_tt.minute);
- g_signal_handlers_unblock_matched (priv->start_time, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, epage);
- }
-
- if (set_end_date) {
- g_signal_handlers_block_matched (priv->end_time, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, epage);
- e_date_edit_set_date (E_DATE_EDIT (priv->end_time),
- end_tt.year, end_tt.month, end_tt.day);
- e_date_edit_set_time_of_day (E_DATE_EDIT (priv->end_time),
- end_tt.hour, end_tt.minute);
- g_signal_handlers_unblock_matched (priv->end_time, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, epage);
- }
-
- /* Notify upstream */
- notify_dates_changed (epage, &start_tt, &end_tt);
-}
-
-/* Callback used when the start or end date widgets change. We check that the
- * start date < end date and we set the "all day event" button as appropriate.
- */
-static void
-date_changed_cb (GtkWidget *dedit, gpointer data)
-{
- EventPage *epage;
-
- epage = EVENT_PAGE (data);
-
- times_updated (epage, dedit == epage->priv->start_time);
-}
-
-
-/* Callback used when the start timezone is changed. If sync_timezones is set,
- * we set the end timezone to the same value. It also updates the start time
- * labels on the other notebook pages.
- */
-static void
-start_timezone_changed_cb (GtkWidget *widget, gpointer data)
-{
- EventPage *epage;
- EventPagePrivate *priv;
- icaltimezone *zone;
-
- epage = EVENT_PAGE (data);
- priv = epage->priv;
-
- if (priv->sync_timezones) {
- zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone));
- priv->updating = TRUE;
- e_timezone_entry_set_timezone (E_TIMEZONE_ENTRY (priv->end_timezone), zone);
- priv->updating = FALSE;
- }
-
- times_updated (epage, TRUE);
-}
-
-
-/* Callback used when the end timezone is changed. It checks if the end
- * timezone is the same as the start timezone and sets sync_timezones if so.
- */
-static void
-end_timezone_changed_cb (GtkWidget *widget, gpointer data)
-{
- EventPage *epage;
- EventPagePrivate *priv;
- icaltimezone *start_zone, *end_zone;
-
- epage = EVENT_PAGE (data);
- priv = epage->priv;
-
- start_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone));
- end_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->end_timezone));
-
- priv->sync_timezones = (start_zone == end_zone) ? TRUE : FALSE;
-
- times_updated (epage, TRUE);
-}
-
-/* Callback: all day event button toggled.
- * Note that this should only be called when the user explicitly toggles the
- * button. Be sure to block this handler when the toggle button's state is set
- * within the code.
- */
-static void
-all_day_event_toggled_cb (GtkWidget *toggle, gpointer data)
-{
- EventPage *epage;
- EventPagePrivate *priv;
- gboolean all_day;
- struct icaltimetype start_tt = icaltime_null_time();
- struct icaltimetype end_tt = icaltime_null_time();
- gboolean date_set;
-
- epage = EVENT_PAGE (data);
- priv = epage->priv;
-
- /* When the all_day toggle is turned on, the start date is
- * rounded down to the start of the day, and end date is
- * rounded down to the start of the day on which the event
- * ends. The event is then taken to be inclusive of the days
- * between the start and end days. Note that if the event end
- * is at midnight, we round it down to the previous day, so the
- * event times stay the same.
- *
- * When the all_day_toggle is turned off, then if the event is within
- * one day, we set the event start to the start of the working day,
- * and set the event end to one hour after it. If the event is longer
- * than one day, we set the event end to the end of the day it is on,
- * so that the actual event times remain the same.
- *
- * This may need tweaking to work well with different timezones used
- * in the event start & end.
- */
- all_day = GTK_TOGGLE_BUTTON (toggle)->active;
-
- set_all_day (epage, all_day);
-
- date_set = e_date_edit_get_date (E_DATE_EDIT (priv->start_time),
- &start_tt.year,
- &start_tt.month,
- &start_tt.day);
- e_date_edit_get_time_of_day (E_DATE_EDIT (priv->start_time),
- &start_tt.hour,
- &start_tt.minute);
- g_assert (date_set);
-
- date_set = e_date_edit_get_date (E_DATE_EDIT (priv->end_time),
- &end_tt.year,
- &end_tt.month,
- &end_tt.day);
- e_date_edit_get_time_of_day (E_DATE_EDIT (priv->end_time),
- &end_tt.hour,
- &end_tt.minute);
- g_assert (date_set);
-
- if (all_day) {
- /* Round down to the start of the day. */
- start_tt.hour = 0;
- start_tt.minute = 0;
- start_tt.second = 0;
- start_tt.is_date = TRUE;
-
- /* Round down to the start of the day, or the start of the
- previous day if it is midnight. */
- icaltime_adjust (&end_tt, 0, 0, 0, -1);
- end_tt.hour = 0;
- end_tt.minute = 0;
- end_tt.second = 0;
- end_tt.is_date = TRUE;
- } else {
- icaltimezone *start_zone, *end_zone;
-
- if (end_tt.year == start_tt.year
- && end_tt.month == start_tt.month
- && end_tt.day == start_tt.day) {
- /* The event is within one day, so we set the event
- start to the start of the working day, and the end
- to one hour later. */
- start_tt.hour = calendar_config_get_day_start_hour ();
- start_tt.minute = calendar_config_get_day_start_minute ();
- start_tt.second = 0;
-
- end_tt = start_tt;
- icaltime_adjust (&end_tt, 0, 1, 0, 0);
- } else {
- /* The event is longer than 1 day, so we keep exactly
- the same times, just using DATE-TIME rather than
- DATE. */
- icaltime_adjust (&end_tt, 1, 0, 0, 0);
- }
-
- /* Make sure that end > start using the timezones. */
- start_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone));
- end_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->end_timezone));
- check_start_before_end (&start_tt, start_zone,
- &end_tt, end_zone,
- TRUE);
- }
-
- gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time),
- epage);
- gtk_signal_handler_block_by_data (GTK_OBJECT (priv->end_time),
- epage);
-
- e_date_edit_set_date (E_DATE_EDIT (priv->start_time), start_tt.year,
- start_tt.month, start_tt.day);
- e_date_edit_set_time_of_day (E_DATE_EDIT (priv->start_time),
- start_tt.hour, start_tt.minute);
-
- e_date_edit_set_date (E_DATE_EDIT (priv->end_time), end_tt.year,
- end_tt.month, end_tt.day);
- e_date_edit_set_time_of_day (E_DATE_EDIT (priv->end_time),
- end_tt.hour, end_tt.minute);
-
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time),
- epage);
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time),
- epage);
-
- /* Notify upstream */
- notify_dates_changed (epage, &start_tt, &end_tt);
-}
-
-/* Callback used when the categories button is clicked; we must bring up the
- * category list dialog.
- */
-static void
-categories_clicked_cb (GtkWidget *button, gpointer data)
-{
- EventPage *epage;
- EventPagePrivate *priv;
- GtkWidget *entry;
-
- epage = EVENT_PAGE (data);
- priv = epage->priv;
-
- entry = priv->categories;
- e_categories_config_open_dialog_for_entry (GTK_ENTRY (entry));
-}
-
-static void
-e_sendoptions_clicked_cb (GtkWidget *button, gpointer data)
-{
- EventPage *epage;
- EventPagePrivate *priv;
- GtkWidget *toplevel;
- ESource *source;
-
- epage = EVENT_PAGE (data);
- priv = epage->priv;
-
- if (!priv->sod) {
- priv->sod = e_sendoptions_dialog_new ();
- source = e_source_option_menu_peek_selected (E_SOURCE_OPTION_MENU (priv->source_selector));
- e_sendoptions_utils_set_default_data (priv->sod, source, "calendar");
- priv->sod->data->initialized = TRUE;
- }
-
- toplevel = gtk_widget_get_toplevel (priv->main);
- e_sendoptions_dialog_run (priv->sod, toplevel, E_ITEM_CALENDAR);
-}
-
-/* This is called when any field is changed; it notifies upstream. */
-static void
-field_changed_cb (GtkWidget *widget, gpointer data)
-{
- EventPage *epage;
- EventPagePrivate *priv;
-
- epage = EVENT_PAGE (data);
- priv = epage->priv;
-
- if (!priv->updating)
- comp_editor_page_notify_changed (COMP_EDITOR_PAGE (epage));
-}
-
-static void
-source_changed_cb (GtkWidget *widget, ESource *source, gpointer data)
-{
- EventPage *epage;
- EventPagePrivate *priv;
-
- epage = EVENT_PAGE (data);
- priv = epage->priv;
-
- if (!priv->updating) {
- ECal *client;
-
- client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_EVENT);
- if (!client || !e_cal_open (client, FALSE, NULL)) {
- GtkWidget *dialog;
-
- if (client)
- g_object_unref (client);
-
- e_source_option_menu_select (E_SOURCE_OPTION_MENU (priv->source_selector),
- e_cal_get_source (COMP_EDITOR_PAGE (epage)->client));
-
- dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
- GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
- _("Unable to open the calendar '%s'."),
- e_source_peek_name (source));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- } else {
- icaltimezone *zone;
-
- zone = calendar_config_get_icaltimezone ();
- e_cal_set_default_timezone (client, zone, NULL);
-
- comp_editor_notify_client_changed (
- COMP_EDITOR (gtk_widget_get_toplevel (priv->main)),
- client);
- if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS))
- event_page_show_options (epage);
- else
- event_page_hide_options (epage);
-
- sensitize_widgets (epage);
- }
- }
-}
-
-static void
-alarm_changed_cb (GtkWidget *widget, gpointer data)
-{
- EventPage *epage;
- EventPagePrivate *priv;
-
- epage = EVENT_PAGE (data);
- priv = epage->priv;
-
- if (e_dialog_toggle_get (priv->alarm)) {
- ECalComponentAlarm *ca;
- ECalComponentAlarmTrigger trigger;
- icalcomponent *icalcomp;
- icalproperty *icalprop;
- int alarm_type;
-
- ca = e_cal_component_alarm_new ();
-
- e_cal_component_alarm_set_action (ca, E_CAL_COMPONENT_ALARM_DISPLAY);
-
- memset (&trigger, 0, sizeof (ECalComponentAlarmTrigger));
- trigger.type = E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START;
- trigger.u.rel_duration.is_neg = 1;
-
- alarm_type = e_dialog_option_menu_get (priv->alarm_time, alarm_map);
- switch (alarm_type) {
- case ALARM_15_MINUTES:
- trigger.u.rel_duration.minutes = 15;
- break;
-
- case ALARM_1_HOUR:
- trigger.u.rel_duration.hours = 1;
- break;
-
- case ALARM_1_DAY:
- trigger.u.rel_duration.days = 1;
- break;
-
- case ALARM_USER_TIME:
- switch (calendar_config_get_default_reminder_units ()) {
- case CAL_DAYS:
- trigger.u.rel_duration.days = priv->alarm_interval;
- break;
-
- case CAL_HOURS:
- trigger.u.rel_duration.hours = priv->alarm_interval;
- break;
-
- case CAL_MINUTES:
- trigger.u.rel_duration.minutes = priv->alarm_interval;
- break;
- }
- break;
-
- default:
- break;
- }
- e_cal_component_alarm_set_trigger (ca, trigger);
-
- icalcomp = e_cal_component_alarm_get_icalcomponent (ca);
- icalprop = icalproperty_new_x ("1");
- icalproperty_set_x_name (icalprop, "X-EVOLUTION-NEEDS-DESCRIPTION");
- icalcomponent_add_property (icalcomp, icalprop);
-
- e_alarm_list_append (priv->alarm_list_store, NULL, ca);
- } else {
- e_alarm_list_clear (priv->alarm_list_store);
- }
-
- sensitize_widgets (epage);
-}
-
-static void
-alarm_custom_clicked_cb (GtkWidget *widget, gpointer data)
-{
- EventPage *epage;
- EventPagePrivate *priv;
- EAlarmList *temp_list_store;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gboolean valid_iter;
- GtkWidget *toplevel;
-
- epage = EVENT_PAGE (data);
- priv = epage->priv;
-
- /* Make a copy of the list store in case the user cancels */
- temp_list_store = e_alarm_list_new ();
- model = GTK_TREE_MODEL (priv->alarm_list_store);
-
- for (valid_iter = gtk_tree_model_get_iter_first (model, &iter); valid_iter;
- valid_iter = gtk_tree_model_iter_next (model, &iter)) {
- ECalComponentAlarm *alarm;
-
- alarm = (ECalComponentAlarm *) e_alarm_list_get_alarm (priv->alarm_list_store, &iter);
- g_assert (alarm != NULL);
-
- e_alarm_list_append (temp_list_store, NULL, alarm);
- }
-
- toplevel = gtk_widget_get_toplevel (priv->main);
- if (alarm_list_dialog_run (toplevel, COMP_EDITOR_PAGE (epage)->client, temp_list_store)) {
- g_object_unref (priv->alarm_list_store);
- priv->alarm_list_store = temp_list_store;
-
- comp_editor_page_notify_changed (COMP_EDITOR_PAGE (epage));
- } else {
- g_object_unref (temp_list_store);
- }
-
- /* If the user erases everything, uncheck the alarm toggle */
- valid_iter = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->alarm_list_store), &iter);
- if (!valid_iter)
- e_dialog_toggle_set (priv->alarm, FALSE);
-
- sensitize_widgets (epage);
-}
-
-/* Hooks the widget signals */
-static gboolean
-init_widgets (EventPage *epage)
-{
- EventPagePrivate *priv;
- GtkTextBuffer *text_buffer;
- icaltimezone *zone;
- char *menu_label = NULL;
-
- priv = epage->priv;
-
- /* Make sure the EDateEdit widgets use our timezones to get the
- current time. */
- e_date_edit_set_get_time_callback (E_DATE_EDIT (priv->start_time),
- (EDateEditGetTimeCallback) comp_editor_get_current_time,
- epage, NULL);
- e_date_edit_set_get_time_callback (E_DATE_EDIT (priv->end_time),
- (EDateEditGetTimeCallback) comp_editor_get_current_time,
- epage, NULL);
-
- /* Summary */
- g_signal_connect((priv->summary), "changed",
- G_CALLBACK (summary_changed_cb), epage);
-
- /* Description */
- text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->description));
-
- gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (priv->description), GTK_WRAP_WORD);
-
- /* Start and end times */
- g_signal_connect((priv->start_time), "changed",
- G_CALLBACK (date_changed_cb), epage);
- g_signal_connect((priv->end_time), "changed",
- G_CALLBACK (date_changed_cb), epage);
-
- g_signal_connect((priv->start_timezone), "changed",
- G_CALLBACK (start_timezone_changed_cb), epage);
- g_signal_connect((priv->end_timezone), "changed",
- G_CALLBACK (end_timezone_changed_cb), epage);
-
- g_signal_connect((priv->all_day_event), "toggled",
- G_CALLBACK (all_day_event_toggled_cb), epage);
-
- /* Categories button */
- g_signal_connect((priv->categories_btn), "clicked",
- G_CALLBACK (categories_clicked_cb), epage);
-
- /* send options button */
- g_signal_connect((priv->sendoptions_button), "clicked",
- G_CALLBACK (e_sendoptions_clicked_cb), epage);
-
- /* Source selector */
- g_signal_connect((priv->source_selector), "source_selected",
- G_CALLBACK (source_changed_cb), epage);
-
- /* Alarms */
- priv->alarm_list_store = e_alarm_list_new ();
-
- /* Add the user defined time if necessary */
- priv->alarm_units = calendar_config_get_default_reminder_units ();
- priv->alarm_interval = calendar_config_get_default_reminder_interval ();
-
- switch (priv->alarm_units) {
- case CAL_DAYS:
- if (priv->alarm_interval != 1) {
- menu_label = g_strdup_printf (ngettext("%d day before appointment", "%d days before appointment", priv->alarm_interval), priv->alarm_interval);
- } else {
- priv->alarm_interval = -1;
- }
- break;
-
- case CAL_HOURS:
- if (priv->alarm_interval != 1) {
- menu_label = g_strdup_printf (ngettext("%d hour before appointment", "%d hours before appointment", priv->alarm_interval), priv->alarm_interval);
- } else {
- priv->alarm_interval = -1;
- }
- break;
-
- case CAL_MINUTES:
- if (priv->alarm_interval != 15) {
- menu_label = g_strdup_printf (ngettext("%d minute before appointement", "%d minutes before appointment", priv->alarm_interval), priv->alarm_interval);
- } else {
- priv->alarm_interval = -1;
- }
- break;
- }
-
- if (menu_label) {
- GtkWidget *item, *menu;
-
- item = gtk_menu_item_new_with_label (menu_label);
- gtk_widget_show (item);
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->alarm_time));
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- }
-
- g_signal_connect (priv->alarm,
- "toggled", G_CALLBACK (alarm_changed_cb),
- epage);
- g_signal_connect (priv->alarm_custom, "clicked",
- G_CALLBACK (alarm_custom_clicked_cb), epage);
-
- /* Connect the default signal handler to use to make sure we notify
- * upstream of changes to the widget values.
- */
-
- /* Belongs to priv->description */
- g_signal_connect((text_buffer), "changed",
- G_CALLBACK (field_changed_cb), epage);
-
- g_signal_connect((priv->summary), "changed",
- G_CALLBACK (field_changed_cb), epage);
- g_signal_connect((priv->location), "changed",
- G_CALLBACK (field_changed_cb), epage);
- g_signal_connect((priv->start_time), "changed",
- G_CALLBACK (field_changed_cb), epage);
- g_signal_connect((priv->end_time), "changed",
- G_CALLBACK (field_changed_cb), epage);
- g_signal_connect((priv->start_timezone), "changed",
- G_CALLBACK (field_changed_cb), epage);
- g_signal_connect((priv->end_timezone), "changed",
- G_CALLBACK (field_changed_cb), epage);
- g_signal_connect((priv->all_day_event), "toggled",
- G_CALLBACK (field_changed_cb), epage);
- g_signal_connect((priv->classification),
- "changed", G_CALLBACK (field_changed_cb),
- epage);
- g_signal_connect((priv->show_time_as_busy),
- "toggled", G_CALLBACK (field_changed_cb),
- epage);
- g_signal_connect((priv->alarm),
- "toggled", G_CALLBACK (field_changed_cb),
- epage);
- g_signal_connect((priv->alarm_time),
- "changed", G_CALLBACK (field_changed_cb),
- epage);
- g_signal_connect((priv->categories), "changed",
- G_CALLBACK (field_changed_cb), epage);
-
- /* Set the default timezone, so the timezone entry may be hidden. */
- zone = calendar_config_get_icaltimezone ();
- e_timezone_entry_set_default_timezone (E_TIMEZONE_ENTRY (priv->start_timezone), zone);
- e_timezone_entry_set_default_timezone (E_TIMEZONE_ENTRY (priv->end_timezone), zone);
-
- return TRUE;
-}
-
-
-
-/**
- * event_page_construct:
- * @epage: An event page.
- *
- * Constructs an event page by loading its Glade data.
- *
- * Return value: The same object as @epage, or NULL if the widgets could not be
- * created.
- **/
-EventPage *
-event_page_construct (EventPage *epage)
-{
- EventPagePrivate *priv;
-
- priv = epage->priv;
-
- priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/event-page.glade",
- NULL, NULL);
- if (!priv->xml) {
- g_message ("event_page_construct(): "
- "Could not load the Glade XML file!");
- return NULL;
- }
-
- if (!get_widgets (epage)) {
- g_message ("event_page_construct(): "
- "Could not find all widgets in the XML file!");
- return NULL;
- }
-
- if (!init_widgets (epage)) {
- g_message ("event_page_construct(): "
- "Could not initialize the widgets!");
- return NULL;
- }
-
- return epage;
-}
-
-/**
- * event_page_new:
- *
- * Creates a new event page.
- *
- * Return value: A newly-created event page, or NULL if the page could
- * not be created.
- **/
-EventPage *
-event_page_new (void)
-{
- EventPage *epage;
-
- epage = g_object_new (TYPE_EVENT_PAGE, NULL);
- if (!event_page_construct (epage)) {
- g_object_unref (epage);
- return NULL;
- }
-
- return epage;
-}
-
-GtkWidget *make_date_edit (void);
-
-GtkWidget *
-make_date_edit (void)
-{
- return comp_editor_new_date_edit (TRUE, TRUE, TRUE);
-}
-
-GtkWidget *make_timezone_entry (void);
-
-GtkWidget *
-make_timezone_entry (void)
-{
- GtkWidget *w;
-
- w = e_timezone_entry_new ();
- gtk_widget_show (w);
- return w;
-}
-
-GtkWidget *event_page_create_source_option_menu (void);
-
-GtkWidget *
-event_page_create_source_option_menu (void)
-{
- GtkWidget *menu;
- GConfClient *gconf_client;
- ESourceList *source_list;
-
- gconf_client = gconf_client_get_default ();
- source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/calendar/sources");
-
- menu = e_source_option_menu_new (source_list);
- g_object_unref (source_list);
-
- gtk_widget_show (menu);
- return menu;
-}
diff --git a/calendar/gui/dialogs/event-page.glade b/calendar/gui/dialogs/event-page.glade
deleted file mode 100644
index 38dd6576cc..0000000000
--- a/calendar/gui/dialogs/event-page.glade
+++ /dev/null
@@ -1,896 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkWindow" id="event-toplevel">
- <property name="title" translatable="yes">window1</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-
- <child>
- <widget class="GtkVBox" id="event-page">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label66">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Basics&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox56">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="label67">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">12</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table11">
- <property name="visible">True</property>
- <property name="n_rows">5</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="summary-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Su_mmary:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">7.45058e-09</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">summary</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="summary">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="location-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Locat_ion:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">7.45058e-09</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">location</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="location">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow12">
- <property name="visible">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
- <child>
- <widget class="GtkTextView" id="description">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="overwrite">False</property>
- <property name="accepts_tab">True</property>
- <property name="justification">GTK_JUSTIFY_LEFT</property>
- <property name="wrap_mode">GTK_WRAP_WORD</property>
- <property name="cursor_visible">True</property>
- <property name="pixels_above_lines">0</property>
- <property name="pixels_below_lines">0</property>
- <property name="pixels_inside_wrap">0</property>
- <property name="left_margin">0</property>
- <property name="right_margin">0</property>
- <property name="indent">0</property>
- <property name="text" translatable="yes"></property>
- <accessibility>
- <atkproperty name="AtkObject::accessible_name" translatable="yes">Event Description</atkproperty>
- </accessibility>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="x_options">expand|shrink|fill</property>
- <property name="y_options">expand|shrink|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label69">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Classi_fication:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">7.45058e-09</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">classification</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox57">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkOptionMenu" id="classification">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu1">
-
- <child>
- <widget class="GtkMenuItem" id="public1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Public</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="private1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Private</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="confidential1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Confidential</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label65">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Cale_ndar:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">source</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="source">
- <property name="visible">True</property>
- <property name="creation_function">event_page_create_source_option_menu</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Wed, 17 Dec 2003 18:20:26 GMT</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkButton" id="categories-button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Ca_tegories...</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="categories">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label68">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Description:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">7.45058e-09</property>
- <property name="yalign">0</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">description</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label70">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Date and Time&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox58">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="label71">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">12</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table12">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="n_rows">4</property>
- <property name="n_columns">4</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="Custom" id="start-time">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="creation_function">make_date_edit</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Tue, 16 May 2000 19:11:05 GMT</property>
- <accessibility>
- <atkrelation target="start-time-label" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="end-time">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="creation_function">make_date_edit</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Tue, 16 May 2000 19:11:10 GMT</property>
- <accessibility>
- <atkrelation target="end-time-label" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="end-timezone">
- <property name="visible">True</property>
- <property name="creation_function">make_timezone_entry</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Mon, 18 Jun 2001 23:51:40 GMT</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options"></property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="start-time-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Start time:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">start-time</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="end-time-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_End time:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">end-time</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="all-day-event">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">A_ll day event</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="start-timezone">
- <property name="visible">True</property>
- <property name="creation_function">make_timezone_entry</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Mon, 18 Jun 2001 23:51:34 GMT</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options"></property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="show-time-as-busy">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Show time as _busy</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="alarm">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Alarm</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox50">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkOptionMenu" id="alarm-time">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu2">
-
- <child>
- <widget class="GtkMenuItem" id="15_minutes_before_appointment1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">15 minutes before appointment</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="1_hour_before_appointment1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">1 hour before appointment</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="1_day_before_appointment1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">1 day before appointment</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkButton" id="alarm-custom">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment1">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox59">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child>
- <widget class="GtkImage" id="image1">
- <property name="visible">True</property>
- <property name="stock">gtk-preferences</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label72">
- <property name="visible">True</property>
- <property name="label" translatable="yes">C_ustomize...</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">4</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="alarm-warning">
- <property name="label" translatable="yes">This appointment has customized alarms</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="send-options-frame">
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment2">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0.06</property>
- <property name="yscale">1</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">253</property>
-
- <child>
- <widget class="GtkButton" id="send-options-button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Ad_vanced send options</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="send-options-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Send Options&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/calendar/gui/dialogs/event-page.h b/calendar/gui/dialogs/event-page.h
deleted file mode 100644
index 3659fe5d2d..0000000000
--- a/calendar/gui/dialogs/event-page.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Evolution calendar - Main page of the event editor dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- * Miguel de Icaza <miguel@ximian.com>
- * Seth Alves <alves@hungry.com>
- * JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef EVENT_PAGE_H
-#define EVENT_PAGE_H
-
-#include "comp-editor-page.h"
-
-G_BEGIN_DECLS
-
-
-
-#define TYPE_EVENT_PAGE (event_page_get_type ())
-#define EVENT_PAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_EVENT_PAGE, EventPage))
-#define EVENT_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_EVENT_PAGE, EventPageClass))
-#define IS_EVENT_PAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_EVENT_PAGE))
-#define IS_EVENT_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TYPE_EVENT_PAGE))
-
-typedef struct _EventPagePrivate EventPagePrivate;
-
-typedef struct {
- CompEditorPage page;
-
- /* Private data */
- EventPagePrivate *priv;
-} EventPage;
-
-typedef struct {
- CompEditorPageClass parent_class;
-} EventPageClass;
-
-
-GtkType event_page_get_type (void);
-EventPage *event_page_construct (EventPage *epage);
-EventPage *event_page_new (void);
-void event_page_show_options (EventPage *page);
-void event_page_hide_options (EventPage *page);
-
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/dialogs/meeting-page.c b/calendar/gui/dialogs/meeting-page.c
deleted file mode 100644
index de66095724..0000000000
--- a/calendar/gui/dialogs/meeting-page.c
+++ /dev/null
@@ -1,983 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution calendar - Main page of the task editor dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- * Miguel de Icaza <miguel@ximian.com>
- * Seth Alves <alves@hungry.com>
- * JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include <gtk/gtkcombo.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtktogglebutton.h>
-#include <gtk/gtkvbox.h>
-#include <gtk/gtkwindow.h>
-#include <libgnome/gnome-i18n.h>
-#include <glade/glade.h>
-#include <libgnomeui/gnome-stock-icons.h>
-#include <gal/widgets/e-gui-utils.h>
-#include <widgets/misc/e-dateedit.h>
-#include <e-util/e-dialog-utils.h>
-#include <e-util/e-dialog-widgets.h>
-
-#include "../calendar-component.h"
-#include "../e-meeting-attendee.h"
-#include "../e-meeting-store.h"
-#include "../e-meeting-list-view.h"
-#include "../itip-utils.h"
-#include "comp-editor-util.h"
-#include "e-delegate-dialog.h"
-#include "meeting-page.h"
-#include "../e-cal-popup.h"
-
-/* Private part of the MeetingPage structure */
-struct _MeetingPagePrivate {
- /* Lists of attendees */
- GPtrArray *deleted_attendees;
-
- /* To use in case of cancellation */
- ECalComponent *comp;
-
- /* List of identities */
- EAccountList *accounts;
- EMeetingAttendee *ia;
- char *default_address;
-
- /* Glade XML data */
- GladeXML *xml;
-
- /* Widgets from the Glade file */
- GtkWidget *main;
- GtkWidget *list_box;
- GtkWidget *organizer_table;
- GtkWidget *organizer;
- GtkWidget *existing_organizer_table;
- GtkWidget *existing_organizer;
- GtkWidget *existing_organizer_btn;
- GtkWidget *add;
- GtkWidget *remove;
- GtkWidget *invite;
- GtkWidget *att_label;
-
- /* ListView stuff */
- EMeetingStore *model;
- EMeetingListView *list_view;
- gint row;
-
- /* For handling who the organizer is */
- gboolean user_org;
- gboolean existing;
-
- gboolean updating;
-};
-
-
-
-static void meeting_page_finalize (GObject *object);
-
-static GtkWidget *meeting_page_get_widget (CompEditorPage *page);
-static void meeting_page_focus_main_widget (CompEditorPage *page);
-static gboolean meeting_page_fill_widgets (CompEditorPage *page, ECalComponent *comp);
-static gboolean meeting_page_fill_component (CompEditorPage *page, ECalComponent *comp);
-
-G_DEFINE_TYPE (MeetingPage, meeting_page, TYPE_COMP_EDITOR_PAGE);
-
-/* Class initialization function for the task page */
-static void
-meeting_page_class_init (MeetingPageClass *class)
-{
- CompEditorPageClass *editor_page_class;
- GObjectClass *object_class;
-
- editor_page_class = (CompEditorPageClass *) class;
- object_class = (GObjectClass *) class;
-
- editor_page_class->get_widget = meeting_page_get_widget;
- editor_page_class->focus_main_widget = meeting_page_focus_main_widget;
- editor_page_class->fill_widgets = meeting_page_fill_widgets;
- editor_page_class->fill_component = meeting_page_fill_component;
- editor_page_class->set_summary = NULL;
- editor_page_class->set_dates = NULL;
-
- object_class->finalize = meeting_page_finalize;
-}
-
-/* Object initialization function for the task page */
-static void
-meeting_page_init (MeetingPage *mpage)
-{
- MeetingPagePrivate *priv;
-
- priv = g_new0 (MeetingPagePrivate, 1);
- mpage->priv = priv;
-
- priv->deleted_attendees = g_ptr_array_new ();
-
- priv->comp = NULL;
-
- priv->accounts = NULL;
- priv->ia = NULL;
- priv->default_address = NULL;
-
- priv->xml = NULL;
- priv->main = NULL;
- priv->invite = NULL;
-
- priv->model = NULL;
- priv->list_view = NULL;
-
- priv->updating = FALSE;
-}
-
-static EAccount *
-get_current_account (MeetingPage *mpage)
-{
- MeetingPagePrivate *priv;
- EIterator *it;
- const char *str;
-
- priv = mpage->priv;
-
- str = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (priv->organizer)->entry));
- if (!str)
- return NULL;
-
- for (it = e_list_get_iterator((EList *)priv->accounts); e_iterator_is_valid(it); e_iterator_next(it)) {
- EAccount *a = (EAccount *)e_iterator_get(it);
- char *full = g_strdup_printf("%s <%s>", a->id->name, a->id->address);
-
- if (!strcmp (full, str)) {
- g_free (full);
- g_object_unref (it);
-
- return a;
- }
-
- g_free (full);
- }
- g_object_unref (it);
-
- return NULL;
-}
-
-static void
-set_attendees (ECalComponent *comp, const GPtrArray *attendees)
-{
- GSList *comp_attendees = NULL, *l;
- int i;
-
- for (i = 0; i < attendees->len; i++) {
- EMeetingAttendee *ia = g_ptr_array_index (attendees, i);
- ECalComponentAttendee *ca;
-
- ca = e_meeting_attendee_as_e_cal_component_attendee (ia);
-
- comp_attendees = g_slist_prepend (comp_attendees, ca);
-
- }
- comp_attendees = g_slist_reverse (comp_attendees);
- e_cal_component_set_attendee_list (comp, comp_attendees);
-
- for (l = comp_attendees; l != NULL; l = l->next)
- g_free (l->data);
- g_slist_free (comp_attendees);
-}
-
-static void
-cleanup_attendees (GPtrArray *attendees)
-{
- int i;
-
- for (i = 0; i < attendees->len; i++)
- g_object_unref (g_ptr_array_index (attendees, i));
-}
-
-/* Destroy handler for the task page */
-static void
-meeting_page_finalize (GObject *object)
-{
- MeetingPage *mpage;
- MeetingPagePrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_MEETING_PAGE (object));
-
- mpage = MEETING_PAGE (object);
- priv = mpage->priv;
-
- if (priv->comp != NULL)
- g_object_unref (priv->comp);
-
- cleanup_attendees (priv->deleted_attendees);
- g_ptr_array_free (priv->deleted_attendees, TRUE);
-
- if (priv->ia != NULL)
- g_object_unref (priv->ia);
-
- g_object_unref (priv->model);
-
- if (priv->main)
- gtk_widget_unref (priv->main);
-
- if (priv->xml) {
- g_object_unref (priv->xml);
- priv->xml = NULL;
- }
-
- if (priv->default_address) {
- g_free (priv->default_address);
- priv->default_address = NULL;
- }
-
- g_free (priv);
- mpage->priv = NULL;
-
- if (G_OBJECT_CLASS (meeting_page_parent_class)->finalize)
- (* G_OBJECT_CLASS (meeting_page_parent_class)->finalize) (object);
-}
-
-
-
-/* get_widget handler for the task page */
-static GtkWidget *
-meeting_page_get_widget (CompEditorPage *page)
-{
- MeetingPage *mpage;
- MeetingPagePrivate *priv;
-
- mpage = MEETING_PAGE (page);
- priv = mpage->priv;
-
- return priv->main;
-}
-
-/* focus_main_widget handler for the task page */
-static void
-meeting_page_focus_main_widget (CompEditorPage *page)
-{
- MeetingPage *mpage;
- MeetingPagePrivate *priv;
-
- mpage = MEETING_PAGE (page);
- priv = mpage->priv;
-
- gtk_widget_grab_focus (priv->organizer);
-}
-
-/* Fills the widgets with default values */
-static void
-clear_widgets (MeetingPage *mpage)
-{
- MeetingPagePrivate *priv;
-
- priv = mpage->priv;
-
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (priv->organizer)->entry), priv->default_address);
- gtk_label_set_text (GTK_LABEL (priv->existing_organizer), _("None"));
-
- gtk_widget_show (priv->organizer_table);
- gtk_widget_hide (priv->existing_organizer_table);
-
- priv->existing = FALSE;
- priv->user_org = TRUE;
-}
-
-static void
-sensitize_widgets (MeetingPage *mpage)
-{
- gboolean read_only = FALSE;
- MeetingPagePrivate *priv = mpage->priv;
- GError *error = NULL;
-
- if (!e_cal_is_read_only (COMP_EDITOR_PAGE (mpage)->client, &read_only, &error)) {
- if (error->code != E_CALENDAR_STATUS_BUSY)
- read_only = TRUE;
- g_error_free (error);
- }
- gtk_widget_set_sensitive (priv->organizer, !read_only);
- gtk_widget_set_sensitive (priv->existing_organizer_btn, !read_only);
- gtk_widget_set_sensitive (priv->add, !read_only && priv->user_org);
- gtk_widget_set_sensitive (priv->remove, !read_only && priv->user_org);
- gtk_widget_set_sensitive (priv->invite, !read_only && priv->user_org);
- gtk_widget_set_sensitive (GTK_WIDGET (priv->list_view), !read_only);
-}
-
-/* fill_widgets handler for the meeting page */
-static gboolean
-meeting_page_fill_widgets (CompEditorPage *page, ECalComponent *comp)
-{
- MeetingPage *mpage;
- MeetingPagePrivate *priv;
- ECalComponentOrganizer organizer;
-
- mpage = MEETING_PAGE (page);
- priv = mpage->priv;
-
- priv->updating = TRUE;
-
- /* Clean out old data */
- if (priv->comp != NULL)
- g_object_unref (priv->comp);
- priv->comp = NULL;
-
- cleanup_attendees (priv->deleted_attendees);
- g_ptr_array_set_size (priv->deleted_attendees, 0);
-
- /* Clean the screen */
- clear_widgets (mpage);
-
- /* Component for cancellation */
- priv->comp = e_cal_component_clone (comp);
-
- /* If there is an existing organizer show it properly */
- if (e_cal_component_has_organizer (comp)) {
- e_cal_component_get_organizer (comp, &organizer);
- if (organizer.value != NULL) {
- const gchar *strip = itip_strip_mailto (organizer.value);
- gchar *string;
-
- gtk_widget_hide (priv->organizer_table);
- gtk_widget_show (priv->existing_organizer_table);
- if (itip_organizer_is_user (comp, page->client)) {
- gtk_widget_set_sensitive (priv->invite, TRUE);
- gtk_widget_set_sensitive (priv->add, TRUE);
- gtk_widget_set_sensitive (priv->remove, TRUE);
- if (e_cal_get_static_capability (
- page->client,
- CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS))
- gtk_widget_hide (priv->existing_organizer_btn);
- priv->user_org = TRUE;
- } else {
- if (e_cal_get_static_capability (
- page->client,
- CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS))
- gtk_widget_hide (priv->existing_organizer_btn);
- gtk_widget_set_sensitive (priv->invite, FALSE);
- gtk_widget_set_sensitive (priv->add, FALSE);
- gtk_widget_set_sensitive (priv->remove, FALSE);
- priv->user_org = FALSE;
- }
-
- if (organizer.cn != NULL)
- string = g_strdup_printf ("%s <%s>", organizer.cn, strip);
- else
- string = g_strdup (strip);
- gtk_label_set_text (GTK_LABEL (priv->existing_organizer), string);
- g_free (string);
-
- priv->existing = TRUE;
- }
- } else {
- EAccount *a;
-
- a = get_current_account (mpage);
- if (a != NULL) {
- priv->ia = e_meeting_store_add_attendee_with_defaults (priv->model);
- g_object_ref (priv->ia);
-
- e_meeting_attendee_set_address (priv->ia, g_strdup_printf ("MAILTO:%s", a->id->address));
- e_meeting_attendee_set_cn (priv->ia, g_strdup (a->id->name));
- e_meeting_attendee_set_status (priv->ia, ICAL_PARTSTAT_ACCEPTED);
- }
- }
-
- priv->updating = FALSE;
-
- sensitize_widgets (mpage);
-
- return TRUE;
-}
-
-/* fill_component handler for the meeting page */
-static gboolean
-meeting_page_fill_component (CompEditorPage *page, ECalComponent *comp)
-{
- MeetingPage *mpage;
- MeetingPagePrivate *priv;
- ECalComponentOrganizer organizer = {NULL, NULL, NULL, NULL};
-
- mpage = MEETING_PAGE (page);
- priv = mpage->priv;
-
- if (!priv->existing) {
- EAccount *a;
- gchar *addr = NULL;
-
- /* Find the identity for the organizer or sentby field */
- a = get_current_account (mpage);
-
- /* Sanity Check */
- if (a == NULL) {
- e_notice (page, GTK_MESSAGE_ERROR,
- _("The organizer selected no longer has an account."));
- return FALSE;
- }
-
- if (a->id->address == NULL || strlen (a->id->address) == 0) {
- e_notice (page, GTK_MESSAGE_ERROR,
- _("An organizer is required."));
- return FALSE;
- }
-
- addr = g_strdup_printf ("MAILTO:%s", a->id->address);
-
- organizer.value = addr;
- organizer.cn = a->id->name;
- e_cal_component_set_organizer (comp, &organizer);
-
- g_free (addr);
- }
-
- if (e_meeting_store_count_actual_attendees (priv->model) < 1) {
- e_notice (page, GTK_MESSAGE_ERROR,
- _("At least one attendee is required."));
- return FALSE;
- }
- set_attendees (comp, e_meeting_store_get_attendees (priv->model));
-
- return TRUE;
-}
-
-
-
-/* Gets the widgets from the XML file and returns if they are all available. */
-static gboolean
-get_widgets (MeetingPage *mpage)
-{
- CompEditorPage *page = COMP_EDITOR_PAGE (mpage);
- MeetingPagePrivate *priv;
- GSList *accel_groups;
- GtkWidget *toplevel;
-
- priv = mpage->priv;
-
-#define GW(name) glade_xml_get_widget (priv->xml, name)
-
- priv->main = GW ("meeting-page");
- if (!priv->main)
- return FALSE;
-
- priv->list_box = GW ("list-box");
-
- /* Get the GtkAccelGroup from the toplevel window, so we can install
- it when the notebook page is mapped. */
- toplevel = gtk_widget_get_toplevel (priv->main);
- accel_groups = gtk_accel_groups_from_object (G_OBJECT (toplevel));
- if (accel_groups) {
- page->accel_group = accel_groups->data;
- gtk_accel_group_ref (page->accel_group);
- }
-
- gtk_widget_ref (priv->main);
- gtk_container_remove (GTK_CONTAINER (priv->main->parent), priv->main);
-
- /* For making the user the organizer */
- priv->organizer_table = GW ("organizer-table");
- priv->organizer = GW ("organizer");
- gtk_combo_set_value_in_list (GTK_COMBO (priv->organizer), FALSE, FALSE);
- gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (priv->organizer)->entry), FALSE);
-
- /* For showing existing organizers */
- priv->existing_organizer_table = GW ("existing-organizer-table");
- priv->existing_organizer = GW ("existing-organizer");
- priv->existing_organizer_btn = GW ("existing-organizer-button");
-
- /* Buttons */
- priv->add = GW ("add-attendee");
- priv->remove = GW ("remove-attendee");
- priv->invite = GW ("invite");
-
- /* Attendees Label */
- priv->att_label = GW ("attendees-label");
-
-#undef GW
-
- return (priv->list_box
- && priv->att_label
- && priv->invite
- && priv->add
- && priv->remove
- && priv->organizer_table
- && priv->organizer
- && priv->existing_organizer_table
- && priv->existing_organizer
- && priv->existing_organizer_btn);
-}
-
-static void
-org_changed_cb (GtkWidget *widget, gpointer data)
-{
- MeetingPage *mpage;
- MeetingPagePrivate *priv;
-
- mpage = MEETING_PAGE (data);
- priv = mpage->priv;
-
- if (priv->updating)
- return;
-
- if (!priv->existing && priv->ia != NULL) {
- EAccount *a;
-
- a = get_current_account (mpage);
- if (a != NULL) {
- e_meeting_attendee_set_address (priv->ia, g_strdup_printf ("MAILTO:%s", a->id->address));
- e_meeting_attendee_set_cn (priv->ia, g_strdup (a->id->name));
-
- if (!e_meeting_store_find_attendee (priv->model, e_meeting_attendee_get_address (priv->ia), NULL))
- e_meeting_store_add_attendee (priv->model, priv->ia);
- } else {
- e_meeting_store_remove_attendee (priv->model, priv->ia);
- }
- }
-
- comp_editor_page_notify_changed (COMP_EDITOR_PAGE (mpage));
-}
-
-/* Function called to change the organizer */
-static void
-change_clicked_cb (GtkWidget *widget, gpointer data)
-{
- MeetingPage *mpage;
- MeetingPagePrivate *priv;
-
- mpage = MEETING_PAGE (data);
- priv = mpage->priv;
-
- gtk_widget_show (priv->organizer_table);
- gtk_widget_hide (priv->existing_organizer_table);
- gtk_widget_set_sensitive (priv->invite, TRUE);
- gtk_widget_set_sensitive (priv->add, TRUE);
- gtk_widget_set_sensitive (priv->remove, TRUE);
-
- comp_editor_page_notify_changed (COMP_EDITOR_PAGE (mpage));
-
- priv->existing = FALSE;
- priv->user_org = TRUE;
-}
-
-static void
-add_clicked_cb (GtkButton *btn, MeetingPage *mpage)
-{
- EMeetingAttendee *attendee;
-
- attendee = e_meeting_store_add_attendee_with_defaults (mpage->priv->model);
- e_meeting_list_view_edit (mpage->priv->list_view, attendee);
-}
-
-static gboolean
-existing_attendee (EMeetingAttendee *ia, ECalComponent *comp)
-{
- GSList *attendees, *l;
- const gchar *ia_address;
-
- ia_address = itip_strip_mailto (e_meeting_attendee_get_address (ia));
- if (!ia_address)
- return FALSE;
-
- e_cal_component_get_attendee_list (comp, &attendees);
-
- for (l = attendees; l; l = l->next) {
- ECalComponentAttendee *attendee = l->data;
- const char *address;
-
- address = itip_strip_mailto (attendee->value);
- if (address && !g_strcasecmp (ia_address, address)) {
- e_cal_component_free_attendee_list (attendees);
- return TRUE;
- }
- }
-
- e_cal_component_free_attendee_list (attendees);
-
- return FALSE;
-}
-
-static void
-remove_attendee (MeetingPage *mpage, EMeetingAttendee *ia)
-{
- MeetingPagePrivate *priv;
- int pos = 0;
-
- priv = mpage->priv;
-
- /* If the user deletes the organizer attendee explicitly,
- assume they no longer want the organizer showing up */
- if (ia == priv->ia) {
- g_object_unref (priv->ia);
- priv->ia = NULL;
- }
-
- /* If this was a delegatee, no longer delegate */
- if (e_meeting_attendee_is_set_delfrom (ia)) {
- EMeetingAttendee *ib;
-
- ib = e_meeting_store_find_attendee (priv->model, e_meeting_attendee_get_delfrom (ia), &pos);
- if (ib != NULL) {
- e_meeting_attendee_set_delto (ib, NULL);
- e_meeting_attendee_set_edit_level (ib, E_MEETING_ATTENDEE_EDIT_FULL);
- }
- }
-
- /* Handle deleting all attendees in the delegation chain */
- while (ia != NULL) {
- EMeetingAttendee *ib = NULL;
-
- if (existing_attendee (ia, priv->comp)) {
- g_object_ref (ia);
- g_ptr_array_add (priv->deleted_attendees, ia);
- }
-
- if (e_meeting_attendee_get_delto (ia) != NULL)
- ib = e_meeting_store_find_attendee (priv->model, e_meeting_attendee_get_delto (ia), NULL);
- e_meeting_store_remove_attendee (priv->model, ia);
-
- ia = ib;
- }
-
- sensitize_widgets (mpage);
-}
-
-static void
-remove_attendee_at_row (MeetingPage *mpage, int row)
-{
- MeetingPagePrivate *priv;
- EMeetingAttendee *ia;
-
- priv = mpage->priv;
-
- ia = e_meeting_store_find_attendee_at_row (priv->model, row);
- remove_attendee (mpage, ia);
-}
-
-static void
-remove_clicked_cb (GtkButton *btn, MeetingPage *mpage)
-{
- MeetingPagePrivate *priv;
- EMeetingAttendee *ia;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- GtkTreePath *path;
- gboolean valid_iter;
- char *address;
-
- priv = mpage->priv;
-
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->list_view));
- if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
- g_warning ("Could not get a selection to delete.");
- return;
- }
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->model), &iter);
-
- gtk_tree_model_get (GTK_TREE_MODEL (priv->model), &iter, E_MEETING_STORE_ADDRESS_COL, &address, -1);
- ia = e_meeting_store_find_attendee (priv->model, address, NULL);
- g_free (address);
- if (!ia)
- return;
-
- remove_attendee (mpage, ia);
-
- /* Select closest item after removal */
- valid_iter = gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->model), &iter, path);
- if (!valid_iter) {
- gtk_tree_path_prev (path);
- valid_iter = gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->model), &iter, path);
- }
-
- if (valid_iter)
- gtk_tree_selection_select_iter (selection, &iter);
-
- gtk_tree_path_free (path);
-}
-
-/* Function called to invite more people */
-static void
-invite_cb (GtkWidget *widget, gpointer data)
-{
- MeetingPage *mpage;
- MeetingPagePrivate *priv;
-
- mpage = MEETING_PAGE (data);
- priv = mpage->priv;
-
- e_meeting_list_view_invite_others_dialog (priv->list_view);
-}
-
-/* Hooks the widget signals */
-static void
-init_widgets (MeetingPage *mpage)
-{
- MeetingPagePrivate *priv;
-
- priv = mpage->priv;
-
- /* Organizer */
- g_signal_connect (GTK_COMBO (priv->organizer)->entry, "changed",
- G_CALLBACK (org_changed_cb), mpage);
-
- g_signal_connect (priv->existing_organizer_btn, "clicked",
- G_CALLBACK (change_clicked_cb), mpage);
-
- /* Add attendee button */
- g_signal_connect (priv->add, "clicked", G_CALLBACK (add_clicked_cb), mpage);
-
- /* Remove attendee button */
- g_signal_connect (priv->remove, "clicked", G_CALLBACK (remove_clicked_cb), mpage);
-
- /* Contacts button */
- g_signal_connect(priv->invite, "clicked", G_CALLBACK (invite_cb), mpage);
-}
-
-static void
-client_changed_cb (CompEditorPage *page, ECal *client, gpointer user_data)
-{
- MeetingPage *mpage = MEETING_PAGE (page);
-
- sensitize_widgets (mpage);
-}
-
-static void
-popup_delete_cb (EPopup *ep, EPopupItem *pitem, void *data)
-{
- MeetingPage *mpage = data;
- MeetingPagePrivate *priv;
-
- priv = mpage->priv;
-
- remove_attendee_at_row (mpage, priv->row);
-}
-
-enum {
- CAN_DELEGATE = 2,
- CAN_DELETE = 4
-};
-
-static EPopupItem context_menu_items[] = {
-#if 0
- { E_POPUP_ITEM, "00.delegate", N_("_Delegate To..."), popup_delegate_cb, NULL, NULL, CAN_DELEGATE },
- { E_POPUP_BAR, "05.bar" },
-#endif
- { E_POPUP_ITEM, "10.delete", N_("_Remove"), popup_delete_cb, NULL, GTK_STOCK_REMOVE, CAN_DELETE },
-};
-
-static void
-context_popup_free(EPopup *ep, GSList *items, void *data)
-{
- g_slist_free(items);
-}
-
-static gint
-button_press_event (GtkWidget *widget, GdkEventButton *event, MeetingPage *mpage)
-{
- MeetingPagePrivate *priv;
- GtkMenu *menu;
- EMeetingAttendee *ia;
- GtkTreePath *path;
- GtkTreeIter iter;
- char *address;
- int disable_mask = 0;
- GSList *menus = NULL;
- ECalPopup *ep;
- int i;
-
- priv = mpage->priv;
-
- /* only process right-clicks */
- if (event->button != 3 || event->type != GDK_BUTTON_PRESS)
- return FALSE;
-
- /* only if we right-click on an attendee */
- if (!gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (priv->list_view), event->x, event->y, &path, NULL, NULL, NULL))
- return FALSE;
- if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->model), &iter, path))
- return FALSE;
-
- gtk_tree_model_get (GTK_TREE_MODEL (priv->model), &iter, E_MEETING_STORE_ADDRESS_COL, &address, -1);
- ia = e_meeting_store_find_attendee (priv->model, address, &priv->row);
- g_free (address);
- if (!ia)
- return FALSE;
-
- if (e_meeting_attendee_get_edit_level (ia) != E_MEETING_ATTENDEE_EDIT_FULL)
- disable_mask = CAN_DELETE;
-
- ep = e_cal_popup_new("org.gnome.evolution.calendar.meeting.popup");
- for (i=0;i<sizeof(context_menu_items)/sizeof(context_menu_items[0]);i++)
- menus = g_slist_prepend(menus, &context_menu_items[i]);
-
- e_popup_add_items((EPopup *)ep, menus, NULL, context_popup_free, mpage);
- menu = e_popup_create_menu_once((EPopup *)ep, NULL, disable_mask);
- gtk_menu_popup (menu, NULL, NULL, NULL, NULL, event->button, event->time);
-
- return TRUE;
-}
-
-/**
- * meeting_page_construct:
- * @mpage: An task details page.
- *
- * Constructs an task page by loading its Glade data.
- *
- * Return value: The same object as @mpage, or NULL if the widgets could not
- * be created.
- **/
-MeetingPage *
-meeting_page_construct (MeetingPage *mpage, EMeetingStore *ems,
- ECal *client)
-{
- MeetingPagePrivate *priv;
- char *backend_address;
- EIterator *it;
- EAccount *def_account;
- GList *address_strings = NULL, *l;
- GtkWidget *sw;
-
- priv = mpage->priv;
-
- priv->xml = glade_xml_new (EVOLUTION_GLADEDIR
- "/meeting-page.glade", NULL, NULL);
- if (!priv->xml) {
- g_message (G_STRLOC ": Could not load the Glade XML file!");
- return NULL;
- }
-
- if (!get_widgets (mpage)) {
- g_message (G_STRLOC ": Could not find all widgets in the XML file!");
- return NULL;
- }
-
- /* Address information */
- if (!e_cal_get_cal_address (client, &backend_address, NULL))
- return NULL;
-
- priv->accounts = itip_addresses_get ();
- def_account = itip_addresses_get_default();
- for (it = e_list_get_iterator((EList *)priv->accounts);
- e_iterator_is_valid(it);
- e_iterator_next(it)) {
- EAccount *a = (EAccount *)e_iterator_get(it);
- char *full;
-
- full = g_strdup_printf("%s <%s>", a->id->name, a->id->address);
-
- address_strings = g_list_append(address_strings, full);
-
- /* Note that the address specified by the backend gets
- * precedence over the default mail address.
- */
- if (backend_address && !strcmp (backend_address, a->id->address)) {
- if (priv->default_address)
- g_free (priv->default_address);
-
- priv->default_address = g_strdup (full);
- } else if (a == def_account && !priv->default_address) {
- priv->default_address = g_strdup (full);
- }
- }
- g_object_unref(it);
- g_free (backend_address);
-
- if (address_strings)
- gtk_combo_set_popdown_strings (GTK_COMBO (priv->organizer), address_strings);
- else
- g_warning ("No potential organizers!");
-
- for (l = address_strings; l != NULL; l = l->next)
- g_free (l->data);
- g_list_free (address_strings);
-
- /* The etable displaying attendees and their status */
- g_object_ref (ems);
- priv->model = ems;
-
- priv->list_view = e_meeting_list_view_new (priv->model);
- g_signal_connect (G_OBJECT (priv->list_view), "button_press_event", G_CALLBACK (button_press_event), mpage);
-
- gtk_widget_show (GTK_WIDGET (priv->list_view));
- sw = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
- gtk_widget_show (sw);
- gtk_container_add (GTK_CONTAINER (sw), GTK_WIDGET (priv->list_view));
- gtk_box_pack_start (GTK_BOX (priv->list_box), sw, TRUE, TRUE, 0);
-
- /* Set the mnemonic widget for the Attendees label */
- gtk_label_set_mnemonic_widget (GTK_LABEL (priv->att_label), GTK_WIDGET (priv->list_view));
-
- /* Init the widget signals */
- init_widgets (mpage);
-
- g_signal_connect_after (G_OBJECT (mpage), "client_changed",
- G_CALLBACK (client_changed_cb), NULL);
-
- return mpage;
-}
-
-/**
- * meeting_page_new:
- *
- * Creates a new task details page.
- *
- * Return value: A newly-created task details page, or NULL if the page could
- * not be created.
- **/
-MeetingPage *
-meeting_page_new (EMeetingStore *ems, ECal *client)
-{
- MeetingPage *mpage;
-
- mpage = g_object_new (TYPE_MEETING_PAGE, NULL);
- if (!meeting_page_construct (mpage, ems, client)) {
- g_object_unref (mpage);
- return NULL;
- }
-
- return mpage;
-}
-
-/**
- * meeting_page_get_cancel_comp:
- * @mpage:
- *
- *
- *
- * Return value:
- **/
-ECalComponent *
-meeting_page_get_cancel_comp (MeetingPage *mpage)
-{
- MeetingPagePrivate *priv;
-
- g_return_val_if_fail (mpage != NULL, NULL);
- g_return_val_if_fail (IS_MEETING_PAGE (mpage), NULL);
-
- priv = mpage->priv;
-
- if (priv->deleted_attendees->len == 0)
- return NULL;
-
- set_attendees (priv->comp, priv->deleted_attendees);
-
- return e_cal_component_clone (priv->comp);
-}
diff --git a/calendar/gui/dialogs/meeting-page.etspec b/calendar/gui/dialogs/meeting-page.etspec
deleted file mode 100644
index 96bc480fe9..0000000000
--- a/calendar/gui/dialogs/meeting-page.etspec
+++ /dev/null
@@ -1,21 +0,0 @@
-<ETableSpecification click-to-add="true" click-to-add-end="true" _click-to-add-message="Click here to add an attendee" draw-grid="true">
- <ETableColumn model_col= "0" _title="Attendee" expansion="2.0" minimum_width="10" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "1" _title="Member" expansion="2.0" minimum_width="10" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "2" _title="Type" expansion="1.0" minimum_width="10" resizable="true" cell="typeedit" compare="string"/>
- <ETableColumn model_col= "3" _title="Role" expansion="1.0" minimum_width="10" resizable="true" cell="roleedit" compare="string"/>
- <ETableColumn model_col= "4" _title="RSVP" expansion="1.0" minimum_width="10" resizable="true" cell="rsvpedit" compare="string"/>
- <ETableColumn model_col= "5" _title="Delegated To" expansion="2.0" minimum_width="10" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "6" _title="Delegated From" expansion="2.0" minimum_width="10" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "7" _title="Status" expansion="1.0" minimum_width="10" resizable="true" cell="statusedit" compare="string"/>
- <ETableColumn model_col= "8" _title="Common Name" expansion="2.0" minimum_width="10" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "9" _title="Language" expansion="2.0" minimum_width="10" resizable="true" cell="string" compare="string"/>
-
- <ETableState>
- <column source="0"/>
- <column source="2"/>
- <column source="3"/>
- <column source="4"/>
- <column source="7"/>
- <grouping></grouping>
- </ETableState>
-</ETableSpecification>
diff --git a/calendar/gui/dialogs/meeting-page.glade b/calendar/gui/dialogs/meeting-page.glade
deleted file mode 100644
index 51f7399b5f..0000000000
--- a/calendar/gui/dialogs/meeting-page.glade
+++ /dev/null
@@ -1,378 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkWindow" id="meeting-toplevel">
- <property name="title" translatable="yes">window1</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-
- <child>
- <widget class="GtkVBox" id="meeting-page">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkVBox" id="vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkHBox" id="organizer-table">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label10">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Or_ganizer:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">organizer-entry</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCombo" id="organizer">
- <property name="visible">True</property>
- <property name="value_in_list">True</property>
- <property name="allow_empty">False</property>
- <property name="case_sensitive">False</property>
- <property name="enable_arrow_keys">True</property>
- <property name="enable_arrows_always">False</property>
- <accessibility>
- <atkproperty name="AtkObject::accessible_name" translatable="yes">Organizer</atkproperty>
- </accessibility>
-
- <child internal-child="entry">
- <widget class="GtkEntry" id="organizer-entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- </child>
-
- <child internal-child="list">
- <widget class="GtkList" id="convertwidget1">
- <property name="visible">True</property>
- <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-
- <child>
- <widget class="GtkListItem" id="convertwidget2">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkLabel" id="convertwidget3">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="existing-organizer-table">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label11">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Organizer:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">organizer-entry</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="existing-organizer">
- <property name="visible">True</property>
- <property name="label" translatable="yes">None</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkButton" id="existing-organizer-button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">C_hange Organizer</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="attendees-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Att_endees&lt;/b&gt;</property>
- <property name="use_underline">True</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="list-box">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkVButtonBox" id="vbuttonbox1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_START</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkButton" id="add-attendee">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-add</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="remove-attendee">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-remove</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="invite">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment1">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox3">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child>
- <widget class="GtkImage" id="image1">
- <property name="visible">True</property>
- <property name="stock">gtk-jump-to</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Con_tacts...</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label7">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <placeholder/>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/calendar/gui/dialogs/meeting-page.h b/calendar/gui/dialogs/meeting-page.h
deleted file mode 100644
index 95533cd771..0000000000
--- a/calendar/gui/dialogs/meeting-page.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Evolution calendar - Main page of the task editor dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- * Miguel de Icaza <miguel@ximian.com>
- * Seth Alves <alves@hungry.com>
- * JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef MEETING_PAGE_H
-#define MEETING_PAGE_H
-
-#include "../e-meeting-store.h"
-#include "../itip-utils.h"
-#include "comp-editor-page.h"
-
-G_BEGIN_DECLS
-
-
-
-#define TYPE_MEETING_PAGE (meeting_page_get_type ())
-#define MEETING_PAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_MEETING_PAGE, MeetingPage))
-#define MEETING_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_MEETING_PAGE, MeetingPageClass))
-#define IS_MEETING_PAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_MEETING_PAGE))
-#define IS_MEETING_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TYPE_MEETING_PAGE))
-
-typedef struct _MeetingPagePrivate MeetingPagePrivate;
-
-typedef struct {
- CompEditorPage page;
-
- /* Private data */
- MeetingPagePrivate *priv;
-} MeetingPage;
-
-typedef struct {
- CompEditorPageClass parent_class;
-} MeetingPageClass;
-
-
-GtkType meeting_page_get_type (void);
-MeetingPage *meeting_page_construct (MeetingPage *mpage,
- EMeetingStore *ems,
- ECal *client);
-MeetingPage *meeting_page_new (EMeetingStore *ems,
- ECal *client);
-ECalComponent *meeting_page_get_cancel_comp (MeetingPage *mpage);
-
-
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/dialogs/new-calendar.glade b/calendar/gui/dialogs/new-calendar.glade
deleted file mode 100644
index 0a136ed7c8..0000000000
--- a/calendar/gui/dialogs/new-calendar.glade
+++ /dev/null
@@ -1,239 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkDialog" id="new-calendar-dialog">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="title" translatable="yes">Add New Calendar</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_CENTER</property>
- <property name="modal">False</property>
- <property name="resizable">False</property>
- <property name="destroy_with_parent">False</property>
- <property name="has_separator">True</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="cancelbutton1">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">-6</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="okbutton1">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">-5</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table1">
- <property name="visible">True</property>
- <property name="n_rows">4</property>
- <property name="n_columns">3</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Calendar Group</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_padding">6</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="calendar-group">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">-1</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_padding">6</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="calendar-name">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_padding">6</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Calendar options&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_padding">6</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Calendar Name</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_padding">6</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="calendar-source-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Calendar Location</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_padding">6</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="calendar-location">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_padding">6</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">4</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/calendar/gui/dialogs/new-task-list.glade b/calendar/gui/dialogs/new-task-list.glade
deleted file mode 100644
index ffc38582c8..0000000000
--- a/calendar/gui/dialogs/new-task-list.glade
+++ /dev/null
@@ -1,193 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-<requires lib="gnome"/>
-
-<widget class="GtkDialog" id="new-task-list-dialog">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="title" translatable="yes">Add New Task List</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_CENTER</property>
- <property name="modal">False</property>
- <property name="resizable">False</property>
- <property name="destroy_with_parent">False</property>
- <property name="has_separator">True</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="cancelbutton1">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">-6</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="okbutton1">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">-5</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table1">
- <property name="visible">True</property>
- <property name="n_rows">3</property>
- <property name="n_columns">3</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Task List Group</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_padding">6</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="task-list-group">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">-1</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_padding">6</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="task-list-name">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_padding">6</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Task List Options&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_padding">6</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Task List Name</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_padding">6</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">4</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/calendar/gui/dialogs/recur-comp.c b/calendar/gui/dialogs/recur-comp.c
deleted file mode 100644
index cfffa29c69..0000000000
--- a/calendar/gui/dialogs/recur-comp.c
+++ /dev/null
@@ -1,136 +0,0 @@
-/* Evolution calendar - Recurring calendar component dialog
- *
- * Copyright (C) 2002 Ximian, Inc.
- *
- * Author: JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include <gtk/gtk.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/gnome-uidefs.h>
-#include "recur-comp.h"
-
-
-
-gboolean
-recur_component_dialog (ECal *client,
- ECalComponent *comp,
- CalObjModType *mod,
- GtkWindow *parent)
-{
- char *str;
- GtkWidget *dialog, *rb_this, *rb_prior, *rb_future, *rb_all, *hbox;
- GtkWidget *placeholder, *vbox;
- ECalComponentVType vtype;
- gboolean ret;
-
- g_return_val_if_fail (E_IS_CAL_COMPONENT (comp), FALSE);
-
- vtype = e_cal_component_get_vtype (comp);
-
- switch (vtype) {
- case E_CAL_COMPONENT_EVENT:
- str = g_strdup_printf (_("You are modifying a recurring event, what would you like to modify?"));
- break;
-
- case E_CAL_COMPONENT_TODO:
- str = g_strdup_printf (_("You are modifying a recurring task, what would you like to modify?"));
- break;
-
- case E_CAL_COMPONENT_JOURNAL:
- str = g_strdup_printf (_("You are modifying a recurring journal entry, what would you like to modify?"));
- break;
-
- default:
- g_message ("recur_component_dialog(): Cannot handle object of type %d", vtype);
- return FALSE;
- }
-
-
- dialog = gtk_message_dialog_new (parent, 0, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, "%s", str);
- g_free (str);
-#if !GTK_CHECK_VERSION (2,4,0)
- gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
-#endif
- gtk_window_set_resizable (GTK_WINDOW (dialog), TRUE);
-
- hbox = gtk_hbox_new (FALSE, 12);
- gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox);
-
- placeholder = gtk_label_new ("");
- gtk_widget_set_size_request (placeholder, 48, 48);
- gtk_box_pack_start (GTK_BOX (hbox), placeholder, FALSE, FALSE, 0);
- gtk_widget_show (placeholder);
-
- vbox = gtk_vbox_new (FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
- gtk_widget_show (vbox);
-
- rb_this = gtk_radio_button_new_with_label (NULL, _("This Instance Only"));
- gtk_container_add (GTK_CONTAINER (vbox), rb_this);
-
- if (!e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_THISANDPRIOR)) {
- rb_prior = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (rb_this), _("This and Prior Instances"));
- gtk_container_add (GTK_CONTAINER (vbox), rb_prior);
- } else
- rb_prior = NULL;
-
- if (!e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_THISANDFUTURE)) {
- rb_future = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (rb_this), _("This and Future Instances"));
- gtk_container_add (GTK_CONTAINER (vbox), rb_future);
- } else
- rb_future = NULL;
-
- rb_all = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (rb_this), _("All Instances"));
- gtk_container_add (GTK_CONTAINER (vbox), rb_all);
-
- gtk_widget_show_all (hbox);
-
- placeholder = gtk_label_new ("");
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), placeholder, FALSE, FALSE, 0);
- gtk_widget_show (placeholder);
-
- ret = gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK;
-
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rb_this)))
- *mod = CALOBJ_MOD_THIS;
- else if (rb_prior && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rb_prior)))
- *mod = CALOBJ_MOD_THISANDPRIOR;
- else if (rb_future && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rb_future)))
- *mod = CALOBJ_MOD_THISANDFUTURE;
- else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rb_all))) {
- *mod = CALOBJ_MOD_ALL;
-
- /* remove the RECURRENCE-ID from the object if modifying ALL instances */
- if (ret) {
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (e_cal_component_get_icalcomponent (comp),
- ICAL_RECURRENCEID_PROPERTY);
- if (prop)
- icalcomponent_remove_property (e_cal_component_get_icalcomponent (comp), prop);
- }
- }
-
- gtk_widget_destroy (dialog);
-
- return ret;
-}
diff --git a/calendar/gui/dialogs/recur-comp.h b/calendar/gui/dialogs/recur-comp.h
deleted file mode 100644
index 94ccbdae87..0000000000
--- a/calendar/gui/dialogs/recur-comp.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Evolution calendar - Recurring calendar component dialog
- *
- * Copyright (C) 2002 Ximian, Inc.
- *
- * Author: JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef RECUR_COMP_H
-#define RECUR_COMP_H
-
-#include <gtk/gtkwindow.h>
-#include <libecal/e-cal.h>
-#include <libecal/e-cal-component.h>
-#include <libecal/e-cal-util.h>
-
-gboolean recur_component_dialog (ECal *client,
- ECalComponent *comp,
- CalObjModType *mod,
- GtkWindow *parent);
-
-#endif
diff --git a/calendar/gui/dialogs/recurrence-page.c b/calendar/gui/dialogs/recurrence-page.c
deleted file mode 100644
index 07e3b6164b..0000000000
--- a/calendar/gui/dialogs/recurrence-page.c
+++ /dev/null
@@ -1,2403 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/* Evolution calendar - Recurrence page of the calendar component dialogs
- *
- * Copyright (C) 2001-2003 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- * Miguel de Icaza <miguel@ximian.com>
- * Seth Alves <alves@hungry.com>
- * JP Rosevear <jpr@ximian.com>
- * Hans Petter Jansson <hpj@ximiman.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtklabel.h>
-#include <gtk/gtkcellrenderertext.h>
-#include <gtk/gtkmenuitem.h>
-#include <gtk/gtkoptionmenu.h>
-#include <gtk/gtktogglebutton.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkspinbutton.h>
-#include <gtk/gtktreeview.h>
-#include <gtk/gtktreeselection.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtkstock.h>
-#include <libgnome/gnome-i18n.h>
-#include <glade/glade.h>
-#include <e-util/e-dialog-widgets.h>
-#include <e-util/e-time-utils.h>
-#include <widgets/misc/e-dateedit.h>
-#include <libecal/e-cal-recur.h>
-#include <libecal/e-cal-time-util.h>
-#include "../calendar-config.h"
-#include "../tag-calendar.h"
-#include "../weekday-picker.h"
-#include "comp-editor-util.h"
-#include "../e-date-time-list.h"
-#include "../e-mini-calendar-config.h"
-#include "recurrence-page.h"
-
-
-
-enum month_num_options {
- MONTH_NUM_FIRST,
- MONTH_NUM_SECOND,
- MONTH_NUM_THIRD,
- MONTH_NUM_FOURTH,
- MONTH_NUM_LAST,
- MONTH_NUM_DAY,
- MONTH_NUM_OTHER
-};
-
-static const int month_num_options_map[] = {
- MONTH_NUM_FIRST,
- MONTH_NUM_SECOND,
- MONTH_NUM_THIRD,
- MONTH_NUM_FOURTH,
- MONTH_NUM_LAST,
- MONTH_NUM_DAY,
- MONTH_NUM_OTHER,
- -1
-};
-
-enum month_day_options {
- MONTH_DAY_NTH,
- MONTH_DAY_MON,
- MONTH_DAY_TUE,
- MONTH_DAY_WED,
- MONTH_DAY_THU,
- MONTH_DAY_FRI,
- MONTH_DAY_SAT,
- MONTH_DAY_SUN
-};
-
-static const int month_day_options_map[] = {
- MONTH_DAY_NTH,
- MONTH_DAY_MON,
- MONTH_DAY_TUE,
- MONTH_DAY_WED,
- MONTH_DAY_THU,
- MONTH_DAY_FRI,
- MONTH_DAY_SAT,
- MONTH_DAY_SUN,
- -1
-};
-
-enum recur_type {
- RECUR_NONE,
- RECUR_SIMPLE,
- RECUR_CUSTOM
-};
-
-static const int type_map[] = {
- RECUR_NONE,
- RECUR_SIMPLE,
- RECUR_CUSTOM,
- -1
-};
-
-static const int freq_map[] = {
- ICAL_DAILY_RECURRENCE,
- ICAL_WEEKLY_RECURRENCE,
- ICAL_MONTHLY_RECURRENCE,
- ICAL_YEARLY_RECURRENCE,
- -1
-};
-
-enum ending_type {
- ENDING_FOR,
- ENDING_UNTIL,
- ENDING_FOREVER
-};
-
-static const int ending_types_map[] = {
- ENDING_FOR,
- ENDING_UNTIL,
- ENDING_FOREVER,
- -1
-};
-
-/* Private part of the RecurrencePage structure */
-struct _RecurrencePagePrivate {
- /* Component we use to expand the recurrence rules for the preview */
- ECalComponent *comp;
-
- /* Glade XML data */
- GladeXML *xml;
-
- /* Widgets from the Glade file */
- GtkWidget *main;
-
- GtkWidget *recurs;
- gboolean custom;
-
- GtkWidget *params;
- GtkWidget *interval_value;
- GtkWidget *interval_unit;
- GtkWidget *special;
- GtkWidget *ending_menu;
- GtkWidget *ending_special;
- GtkWidget *custom_warning_bin;
-
- /* For weekly recurrences, created by hand */
- GtkWidget *weekday_picker;
- guint8 weekday_day_mask;
- guint8 weekday_blocked_day_mask;
-
- /* For monthly recurrences, created by hand */
- int month_index;
-
- GtkWidget *month_day_menu;
- enum month_day_options month_day;
-
- GtkWidget *month_num_menu;
- enum month_num_options month_num;
-
- /* For ending date, created by hand */
- GtkWidget *ending_date_edit;
- struct icaltimetype ending_date_tt;
-
- /* For ending count of occurrences, created by hand */
- GtkWidget *ending_count_spin;
- int ending_count;
-
- /* More widgets from the Glade file */
- GtkWidget *exception_list; /* This is a GtkTreeView now */
- GtkWidget *exception_add;
- GtkWidget *exception_modify;
- GtkWidget *exception_delete;
-
- GtkWidget *preview_bin;
-
- /* Store for exception_list */
- EDateTimeList *exception_list_store;
-
- /* For the recurrence preview, the actual widget */
- GtkWidget *preview_calendar;
- EMiniCalendarConfig *preview_calendar_config;
-
- gboolean updating;
-};
-
-
-
-static void recurrence_page_finalize (GObject *object);
-
-static GtkWidget *recurrence_page_get_widget (CompEditorPage *page);
-static void recurrence_page_focus_main_widget (CompEditorPage *page);
-static gboolean recurrence_page_fill_widgets (CompEditorPage *page, ECalComponent *comp);
-static gboolean recurrence_page_fill_component (CompEditorPage *page, ECalComponent *comp);
-static void recurrence_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates);
-
-static void field_changed (RecurrencePage *apage);
-
-G_DEFINE_TYPE (RecurrencePage, recurrence_page, TYPE_COMP_EDITOR_PAGE);
-
-/* Class initialization function for the recurrence page */
-static void
-recurrence_page_class_init (RecurrencePageClass *class)
-{
- CompEditorPageClass *editor_page_class;
- GObjectClass *object_class;
-
- editor_page_class = (CompEditorPageClass *) class;
- object_class = (GObjectClass *) class;
-
- editor_page_class->get_widget = recurrence_page_get_widget;
- editor_page_class->focus_main_widget = recurrence_page_focus_main_widget;
- editor_page_class->fill_widgets = recurrence_page_fill_widgets;
- editor_page_class->fill_component = recurrence_page_fill_component;
- editor_page_class->set_dates = recurrence_page_set_dates;
-
- object_class->finalize = recurrence_page_finalize;
-}
-
-/* Object initialization function for the recurrence page */
-static void
-recurrence_page_init (RecurrencePage *rpage)
-{
- RecurrencePagePrivate *priv;
-
- priv = g_new0 (RecurrencePagePrivate, 1);
- rpage->priv = priv;
-
- priv->xml = NULL;
-
- priv->main = NULL;
- priv->recurs = NULL;
- priv->custom = FALSE;
- priv->params = NULL;
- priv->interval_value = NULL;
- priv->interval_unit = NULL;
- priv->special = NULL;
- priv->ending_menu = NULL;
- priv->ending_special = NULL;
- priv->custom_warning_bin = NULL;
- priv->weekday_picker = NULL;
- priv->month_day_menu = NULL;
- priv->month_num_menu = NULL;
- priv->ending_date_edit = NULL;
- priv->ending_count_spin = NULL;
- priv->exception_list = NULL;
- priv->exception_add = NULL;
- priv->exception_modify = NULL;
- priv->exception_delete = NULL;
- priv->preview_bin = NULL;
- priv->preview_calendar = NULL;
-
- priv->comp = NULL;
-}
-
-/* Destroy handler for the recurrence page */
-static void
-recurrence_page_finalize (GObject *object)
-{
- RecurrencePage *rpage;
- RecurrencePagePrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_RECURRENCE_PAGE (object));
-
- rpage = RECURRENCE_PAGE (object);
- priv = rpage->priv;
-
- if (priv->main)
- gtk_widget_unref (priv->main);
-
- if (priv->xml) {
- g_object_unref (priv->xml);
- priv->xml = NULL;
- }
-
- if (priv->comp) {
- g_object_unref (priv->comp);
- priv->comp = NULL;
- }
-
- if (priv->exception_list_store) {
- g_object_unref (priv->exception_list_store);
- priv->exception_list_store = NULL;
- }
-
- if (priv->preview_calendar_config) {
- g_object_unref (priv->preview_calendar_config);
- priv->preview_calendar_config = NULL;
- }
-
- g_free (priv);
- rpage->priv = NULL;
-
- if (G_OBJECT_CLASS (recurrence_page_parent_class)->finalize)
- (* G_OBJECT_CLASS (recurrence_page_parent_class)->finalize) (object);
-}
-
-
-
-/* get_widget handler for the recurrence page */
-static GtkWidget *
-recurrence_page_get_widget (CompEditorPage *page)
-{
- RecurrencePage *rpage;
- RecurrencePagePrivate *priv;
-
- rpage = RECURRENCE_PAGE (page);
- priv = rpage->priv;
-
- return priv->main;
-}
-
-/* focus_main_widget handler for the recurrence page */
-static void
-recurrence_page_focus_main_widget (CompEditorPage *page)
-{
- RecurrencePage *rpage;
- RecurrencePagePrivate *priv;
-
- rpage = RECURRENCE_PAGE (page);
- priv = rpage->priv;
-
- gtk_widget_grab_focus (priv->recurs);
-}
-
-/* Fills the widgets with default values */
-static void
-clear_widgets (RecurrencePage *rpage)
-{
- RecurrencePagePrivate *priv;
- GtkAdjustment *adj;
- GtkWidget *menu;
-
- priv = rpage->priv;
-
- priv->custom = FALSE;
-
- priv->weekday_day_mask = 0;
-
- priv->month_index = 1;
- priv->month_num = MONTH_NUM_DAY;
- priv->month_day = MONTH_DAY_NTH;
-
- g_signal_handlers_block_matched (priv->recurs, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
- e_dialog_toggle_set (priv->recurs, FALSE);
- g_signal_handlers_unblock_matched (priv->recurs, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
-
- adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (priv->interval_value));
- g_signal_handlers_block_matched (adj, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
- e_dialog_spin_set (priv->interval_value, 1);
- g_signal_handlers_unblock_matched (adj, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->interval_unit));
- g_signal_handlers_block_matched (menu, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
- e_dialog_option_menu_set (priv->interval_unit,
- ICAL_DAILY_RECURRENCE,
- freq_map);
- g_signal_handlers_unblock_matched (menu, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
-
- priv->ending_date_tt = icaltime_today ();
- priv->ending_count = 1;
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->ending_menu));
- g_signal_handlers_block_matched (menu, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
- e_dialog_option_menu_set (priv->ending_menu,
- ENDING_FOREVER,
- ending_types_map);
- g_signal_handlers_unblock_matched (menu, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
-
- /* Exceptions list */
- e_date_time_list_clear (priv->exception_list_store);
-}
-
-/* Appends an exception date to the list */
-static void
-append_exception (RecurrencePage *rpage, ECalComponentDateTime *datetime)
-{
- RecurrencePagePrivate *priv;
- GtkTreeView *view;
- GtkTreeIter iter;
-
- priv = rpage->priv;
- view = GTK_TREE_VIEW (priv->exception_list);
-
- e_date_time_list_append (priv->exception_list_store, &iter, datetime);
- gtk_tree_selection_select_iter (gtk_tree_view_get_selection (view), &iter);
-}
-
-/* Fills in the exception widgets with the data from the calendar component */
-static void
-fill_exception_widgets (RecurrencePage *rpage, ECalComponent *comp)
-{
- RecurrencePagePrivate *priv;
- GSList *list, *l;
- gboolean added = FALSE;
-
- priv = rpage->priv;
- e_cal_component_get_exdate_list (comp, &list);
-
- for (l = list; l; l = l->next) {
- ECalComponentDateTime *cdt;
-
- added = TRUE;
-
- cdt = l->data;
- append_exception (rpage, cdt);
- }
-
- e_cal_component_free_exdate_list (list);
-}
-
-/* Computes a weekday mask for the start day of a calendar component,
- * for use in a WeekdayPicker widget.
- */
-static guint8
-get_start_weekday_mask (ECalComponent *comp)
-{
- ECalComponentDateTime dt;
- guint8 retval;
-
- e_cal_component_get_dtstart (comp, &dt);
-
- if (dt.value) {
- short weekday;
-
- weekday = icaltime_day_of_week (*dt.value);
- retval = 0x1 << (weekday - 1);
- } else
- retval = 0;
-
- e_cal_component_free_datetime (&dt);
-
- return retval;
-}
-
-/* Sets some sane defaults for the data sources for the recurrence special
- * widgets, even if they will not be used immediately.
- */
-static void
-set_special_defaults (RecurrencePage *rpage)
-{
- RecurrencePagePrivate *priv;
- guint8 mask;
-
- priv = rpage->priv;
-
- mask = get_start_weekday_mask (priv->comp);
-
- priv->weekday_day_mask = mask;
- priv->weekday_blocked_day_mask = mask;
-}
-
-/* Sensitizes the recurrence widgets based on the state of the recurrence type
- * radio group.
- */
-static void
-sensitize_recur_widgets (RecurrencePage *rpage)
-{
- RecurrencePagePrivate *priv;
- gboolean recurs;
- GtkWidget *label;
-
- priv = rpage->priv;
-
- recurs = e_dialog_toggle_get (priv->recurs);
-
- /* We can't preview that well for instances right now */
- if (e_cal_component_is_instance (priv->comp))
- gtk_widget_set_sensitive (priv->preview_calendar, FALSE);
- else
- gtk_widget_set_sensitive (priv->preview_calendar, TRUE);
-
- if (GTK_BIN (priv->custom_warning_bin)->child)
- gtk_widget_destroy (GTK_BIN (priv->custom_warning_bin)->child);
-
- if (recurs && priv->custom) {
- gtk_widget_set_sensitive (priv->params, FALSE);
- gtk_widget_hide (priv->params);
-
- label = gtk_label_new (_("This appointment contains "
- "recurrences that Evolution "
- "cannot edit."));
- gtk_container_add (GTK_CONTAINER (priv->custom_warning_bin),
- label);
- gtk_widget_show_all (priv->custom_warning_bin);
- } else if (recurs) {
- gtk_widget_set_sensitive (priv->params, TRUE);
- gtk_widget_show (priv->params);
- gtk_widget_hide (priv->custom_warning_bin);
- } else {
- gtk_widget_set_sensitive (priv->params, FALSE);
- gtk_widget_show (priv->params);
- gtk_widget_hide (priv->custom_warning_bin);
- }
-}
-
-static void
-sensitize_buttons (RecurrencePage *rpage)
-{
- gboolean read_only;
- gint selected_rows;
- RecurrencePagePrivate *priv;
- icalcomponent *icalcomp;
- const char *uid;
-
- priv = rpage->priv;
-
- selected_rows = gtk_tree_selection_count_selected_rows (
- gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->exception_list)));
-
- if (!e_cal_is_read_only (COMP_EDITOR_PAGE (rpage)->client, &read_only, NULL))
- read_only = TRUE;
-
- if (!read_only) {
- e_cal_component_get_uid (priv->comp, &uid);
-
- if (e_cal_get_static_capability (COMP_EDITOR_PAGE (rpage)->client, CAL_STATIC_CAPABILITY_NO_CONV_TO_RECUR) && e_cal_get_object(COMP_EDITOR_PAGE (rpage)->client, uid, NULL, &icalcomp, NULL)) {
- read_only = TRUE;
- icalcomponent_free (icalcomp);
- }
-
- if (!read_only) {
- GList *list;
-
- /* see if we have detached instances */
- if (e_cal_get_objects_for_uid (COMP_EDITOR_PAGE (rpage)->client, uid, &list, NULL)) {
- if (list && g_list_length (list) > 1)
- read_only = TRUE;
-
- g_list_foreach (list, (GFunc) g_object_unref, NULL);
- g_list_free (list);
- }
- }
- }
-
- if (!read_only)
- sensitize_recur_widgets (rpage);
- else
- gtk_widget_set_sensitive (priv->params, FALSE);
-
- gtk_widget_set_sensitive (priv->recurs, !read_only);
- gtk_widget_set_sensitive (priv->exception_add, !read_only && e_cal_component_has_recurrences (priv->comp));
- gtk_widget_set_sensitive (priv->exception_modify, !read_only && selected_rows > 0);
- gtk_widget_set_sensitive (priv->exception_delete, !read_only && selected_rows > 0);
-}
-
-#if 0
-/* Encondes a position/weekday pair into the proper format for
- * icalrecurrencetype.by_day. Not needed at present.
- */
-static short
-nth_weekday (int pos, icalrecurrencetype_weekday weekday)
-{
- g_assert (pos > 0 && pos <= 5);
-
- return (pos << 3) | (int) weekday;
-}
-#endif
-
-/* Gets the simple recurrence data from the recurrence widgets and stores it in
- * the calendar component.
- */
-static void
-simple_recur_to_comp (RecurrencePage *rpage, ECalComponent *comp)
-{
- RecurrencePagePrivate *priv;
- struct icalrecurrencetype r;
- GSList l;
- enum ending_type ending_type;
- gboolean date_set;
-
- priv = rpage->priv;
-
- icalrecurrencetype_clear (&r);
-
- /* Frequency, interval, week start */
-
- r.freq = e_dialog_option_menu_get (priv->interval_unit, freq_map);
- r.interval = e_dialog_spin_get_int (priv->interval_value);
- r.week_start = ICAL_SUNDAY_WEEKDAY
- + calendar_config_get_week_start_day ();
-
- /* Frequency-specific data */
-
- switch (r.freq) {
- case ICAL_DAILY_RECURRENCE:
- /* Nothing else is required */
- break;
-
- case ICAL_WEEKLY_RECURRENCE: {
- guint8 day_mask;
- int i;
-
- g_assert (GTK_BIN (priv->special)->child != NULL);
- g_assert (priv->weekday_picker != NULL);
- g_assert (IS_WEEKDAY_PICKER (priv->weekday_picker));
-
- day_mask = weekday_picker_get_days (WEEKDAY_PICKER (priv->weekday_picker));
-
- i = 0;
-
- if (day_mask & (1 << 0))
- r.by_day[i++] = ICAL_SUNDAY_WEEKDAY;
-
- if (day_mask & (1 << 1))
- r.by_day[i++] = ICAL_MONDAY_WEEKDAY;
-
- if (day_mask & (1 << 2))
- r.by_day[i++] = ICAL_TUESDAY_WEEKDAY;
-
- if (day_mask & (1 << 3))
- r.by_day[i++] = ICAL_WEDNESDAY_WEEKDAY;
-
- if (day_mask & (1 << 4))
- r.by_day[i++] = ICAL_THURSDAY_WEEKDAY;
-
- if (day_mask & (1 << 5))
- r.by_day[i++] = ICAL_FRIDAY_WEEKDAY;
-
- if (day_mask & (1 << 6))
- r.by_day[i++] = ICAL_SATURDAY_WEEKDAY;
-
- break;
- }
-
- case ICAL_MONTHLY_RECURRENCE: {
- enum month_num_options month_num;
- enum month_day_options month_day;
-
- g_assert (GTK_BIN (priv->special)->child != NULL);
- g_assert (priv->month_day_menu != NULL);
- g_assert (GTK_IS_OPTION_MENU (priv->month_day_menu));
- g_assert (priv->month_num_menu != NULL);
- g_assert (GTK_IS_OPTION_MENU (priv->month_num_menu));
-
- month_num = e_dialog_option_menu_get (priv->month_num_menu,
- month_num_options_map );
- month_day = e_dialog_option_menu_get (priv->month_day_menu,
- month_day_options_map);
-
- if (month_num == MONTH_NUM_LAST)
- month_num = -1;
- else
- month_num++;
-
- switch (month_day) {
- case MONTH_DAY_NTH:
- if (month_num == -1)
- r.by_month_day[0] = -1;
- else
- r.by_month_day[0] = priv->month_index;
- break;
-
- /* Outlook 2000 uses BYDAY=TU;BYSETPOS=2, and will not
- accept BYDAY=2TU. So we now use the same as Outlook
- by default. */
- case MONTH_DAY_MON:
- r.by_day[0] = ICAL_MONDAY_WEEKDAY;
- r.by_set_pos[0] = month_num;
- break;
-
- case MONTH_DAY_TUE:
- r.by_day[0] = ICAL_TUESDAY_WEEKDAY;
- r.by_set_pos[0] = month_num;
- break;
-
- case MONTH_DAY_WED:
- r.by_day[0] = ICAL_WEDNESDAY_WEEKDAY;
- r.by_set_pos[0] = month_num;
- break;
-
- case MONTH_DAY_THU:
- r.by_day[0] = ICAL_THURSDAY_WEEKDAY;
- r.by_set_pos[0] = month_num;
- break;
-
- case MONTH_DAY_FRI:
- r.by_day[0] = ICAL_FRIDAY_WEEKDAY;
- r.by_set_pos[0] = month_num;
- break;
-
- case MONTH_DAY_SAT:
- r.by_day[0] = ICAL_SATURDAY_WEEKDAY;
- r.by_set_pos[0] = month_num;
- break;
-
- case MONTH_DAY_SUN:
- r.by_day[0] = ICAL_SUNDAY_WEEKDAY;
- r.by_set_pos[0] = month_num;
- break;
-
- default:
- g_assert_not_reached ();
- }
-
- break;
- }
-
- case ICAL_YEARLY_RECURRENCE:
- /* Nothing else is required */
- break;
-
- default:
- g_assert_not_reached ();
- }
-
- /* Ending date */
-
- ending_type = e_dialog_option_menu_get (priv->ending_menu,
- ending_types_map);
-
- switch (ending_type) {
- case ENDING_FOR:
- g_assert (priv->ending_count_spin != NULL);
- g_assert (GTK_IS_SPIN_BUTTON (priv->ending_count_spin));
-
- r.count = e_dialog_spin_get_int (priv->ending_count_spin);
- break;
-
- case ENDING_UNTIL:
- g_assert (priv->ending_date_edit != NULL);
- g_assert (E_IS_DATE_EDIT (priv->ending_date_edit));
-
- /* We only allow a DATE value to be set for the UNTIL property,
- since we don't support sub-day recurrences. */
- date_set = e_date_edit_get_date (E_DATE_EDIT (priv->ending_date_edit),
- &r.until.year,
- &r.until.month,
- &r.until.day);
- g_assert (date_set);
-
- r.until.is_date = 1;
-
- break;
-
- case ENDING_FOREVER:
- /* Nothing to be done */
- break;
-
- default:
- g_assert_not_reached ();
- }
-
- /* Set the recurrence */
-
- l.data = &r;
- l.next = NULL;
-
- e_cal_component_set_rrule_list (comp, &l);
-}
-
-/* Fills a component with the data from the recurrence page; in the case of a
- * custom recurrence, it leaves it intact.
- */
-static gboolean
-fill_component (RecurrencePage *rpage, ECalComponent *comp)
-{
- RecurrencePagePrivate *priv;
- gboolean recurs;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gboolean valid_iter;
- GSList *list;
-
- priv = rpage->priv;
- model = GTK_TREE_MODEL (priv->exception_list_store);
-
- recurs = e_dialog_toggle_get (priv->recurs);
-
- if (recurs && priv->custom) {
- /* We just keep whatever the component has currently */
- } else if (recurs) {
- e_cal_component_set_rdate_list (comp, NULL);
- e_cal_component_set_exrule_list (comp, NULL);
- simple_recur_to_comp (rpage, comp);
- } else {
- e_cal_component_set_rdate_list (comp, NULL);
- e_cal_component_set_rrule_list (comp, NULL);
- e_cal_component_set_exrule_list (comp, NULL);
- }
-
- /* Set exceptions */
-
- list = NULL;
-
- for (valid_iter = gtk_tree_model_get_iter_first (model, &iter); valid_iter;
- valid_iter = gtk_tree_model_iter_next (model, &iter)) {
- const ECalComponentDateTime *dt;
- ECalComponentDateTime *cdt;
-
- cdt = g_new (ECalComponentDateTime, 1);
- cdt->value = g_new (struct icaltimetype, 1);
-
- dt = e_date_time_list_get_date_time (E_DATE_TIME_LIST (model), &iter);
- g_assert (dt != NULL);
-
- if (!icaltime_is_valid_time (*dt->value)) {
- comp_editor_page_display_validation_error (COMP_EDITOR_PAGE (rpage),
- _("Recurrence date is invalid"),
- priv->exception_list);
- return FALSE;
- }
-
- *cdt->value = *dt->value;
- cdt->tzid = g_strdup (dt->tzid);
-
- list = g_slist_prepend (list, cdt);
- }
-
- e_cal_component_set_exdate_list (comp, list);
- e_cal_component_free_exdate_list (list);
-
- return TRUE;
-}
-
-/* Re-tags the recurrence preview calendar based on the current information of
- * the widgets in the recurrence page.
- */
-static void
-preview_recur (RecurrencePage *rpage)
-{
- RecurrencePagePrivate *priv;
- ECalComponent *comp;
- ECalComponentDateTime cdt;
- GSList *l;
- icaltimezone *zone = NULL;
-
- priv = rpage->priv;
-
- /* If our component has not been set yet through ::fill_widgets(), we
- * cannot preview the recurrence.
- */
- if (!priv->comp || e_cal_component_is_instance (priv->comp))
- return;
-
- /* Create a scratch component with the start/end and
- * recurrence/exception information from the one we are editing.
- */
-
- comp = e_cal_component_new ();
- e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_EVENT);
-
- e_cal_component_get_dtstart (priv->comp, &cdt);
- if (cdt.tzid != NULL) {
- /* FIXME Will e_cal_get_timezone really not return builtin zones? */
- if (!e_cal_get_timezone (COMP_EDITOR_PAGE (rpage)->client, cdt.tzid, &zone, NULL))
- zone = icaltimezone_get_builtin_timezone_from_tzid (cdt.tzid);
- }
- e_cal_component_set_dtstart (comp, &cdt);
- e_cal_component_free_datetime (&cdt);
-
- e_cal_component_get_dtend (priv->comp, &cdt);
- e_cal_component_set_dtend (comp, &cdt);
- e_cal_component_free_datetime (&cdt);
-
- e_cal_component_get_exdate_list (priv->comp, &l);
- e_cal_component_set_exdate_list (comp, l);
- e_cal_component_free_exdate_list (l);
-
- e_cal_component_get_exrule_list (priv->comp, &l);
- e_cal_component_set_exrule_list (comp, l);
- e_cal_component_free_recur_list (l);
-
- e_cal_component_get_rdate_list (priv->comp, &l);
- e_cal_component_set_rdate_list (comp, l);
- e_cal_component_free_period_list (l);
-
- e_cal_component_get_rrule_list (priv->comp, &l);
- e_cal_component_set_rrule_list (comp, l);
- e_cal_component_free_recur_list (l);
-
- fill_component (rpage, comp);
-
- tag_calendar_by_comp (E_CALENDAR (priv->preview_calendar), comp,
- COMP_EDITOR_PAGE (rpage)->client, zone, TRUE, FALSE);
- g_object_unref(comp);
-}
-
-/* Callback used when the recurrence weekday picker changes */
-static void
-weekday_picker_changed_cb (WeekdayPicker *wp, gpointer data)
-{
- RecurrencePage *rpage;
-
- rpage = RECURRENCE_PAGE (data);
-
- field_changed (rpage);
- preview_recur (rpage);
-}
-
-/* Creates the special contents for weekly recurrences */
-static void
-make_weekly_special (RecurrencePage *rpage)
-{
- RecurrencePagePrivate *priv;
- GtkWidget *hbox;
- GtkWidget *label;
- WeekdayPicker *wp;
-
- priv = rpage->priv;
-
- g_assert (GTK_BIN (priv->special)->child == NULL);
- g_assert (priv->weekday_picker == NULL);
-
- /* Create the widgets */
-
- hbox = gtk_hbox_new (FALSE, 2);
- gtk_container_add (GTK_CONTAINER (priv->special), hbox);
-
- label = gtk_label_new (_("on"));
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 6);
-
- wp = WEEKDAY_PICKER (weekday_picker_new ());
-
- priv->weekday_picker = GTK_WIDGET (wp);
- gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (wp), FALSE, FALSE, 6);
-
- gtk_widget_show_all (hbox);
-
- /* Set the weekdays */
-
- weekday_picker_set_week_start_day (wp, calendar_config_get_week_start_day ());
- weekday_picker_set_days (wp, priv->weekday_day_mask);
- weekday_picker_set_blocked_days (wp, priv->weekday_blocked_day_mask);
-
- g_signal_connect((wp), "changed",
- G_CALLBACK (weekday_picker_changed_cb),
- rpage);
-}
-
-
-static void
-month_num_submenu_selection_done_cb (GtkMenuShell *menu_shell, gpointer data)
-{
- GtkWidget *item;
- int month_index;
-
- item = gtk_menu_get_active (GTK_MENU (menu_shell));
- item = gtk_menu_get_active (GTK_MENU (gtk_menu_item_get_submenu (GTK_MENU_ITEM (item))));
-
- month_index = GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (item)));
- gtk_object_set_user_data (GTK_OBJECT (data), GINT_TO_POINTER (month_index));
-}
-
-/* Creates the option menu for the monthly recurrence number */
-static GtkWidget *
-make_recur_month_num_submenu (const char *title, int start, int end)
-{
- GtkWidget *submenu, *item;
- int i;
-
- submenu = gtk_menu_new ();
- for (i = start; i < end; i++) {
- item = gtk_menu_item_new_with_label (_(e_cal_recur_nth[i]));
- gtk_menu_shell_append(GTK_MENU_SHELL(submenu), item);
- gtk_object_set_user_data (GTK_OBJECT (item), GINT_TO_POINTER (i + 1));
- gtk_widget_show (item);
- }
-
- item = gtk_menu_item_new_with_label (_(title));
- gtk_widget_show (item);
- gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), submenu);
-
- return item;
-}
-
-static GtkWidget *
-make_recur_month_num_menu (int month_index)
-{
- static const char *options[] = {
- N_("first"),
- N_("second"),
- N_("third"),
- N_("fourth"),
- N_("last")
- };
-
- GtkWidget *menu, *submenu, *item, *submenu_item;
- GtkWidget *omenu;
- int i;
-
- menu = gtk_menu_new ();
-
- /* Relation */
- for (i = 0; i < sizeof (options) / sizeof (options[0]); i++) {
- item = gtk_menu_item_new_with_label (_(options[i]));
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
- gtk_widget_show (item);
- }
-
- /* Current date */
- item = gtk_menu_item_new_with_label (_(e_cal_recur_nth[month_index - 1]));
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
- gtk_widget_show (item);
-
- /* Other Submenu */
- submenu = gtk_menu_new ();
- submenu_item = gtk_menu_item_new_with_label (_("Other Date"));
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), submenu_item);
- gtk_widget_show (submenu_item);
-
- item = make_recur_month_num_submenu ("1st to 10th", 0, 10);
- gtk_menu_shell_append(GTK_MENU_SHELL(submenu), item);
- item = make_recur_month_num_submenu ("11th to 20th", 10, 20);
- gtk_menu_shell_append(GTK_MENU_SHELL(submenu), item);
- item = make_recur_month_num_submenu ("21st to 31st", 20, 31);
- gtk_menu_shell_append(GTK_MENU_SHELL(submenu), item);
-
- gtk_menu_item_set_submenu (GTK_MENU_ITEM (submenu_item), submenu);
- gtk_object_set_user_data (GTK_OBJECT (submenu_item), GINT_TO_POINTER (month_index));
- g_signal_connect((submenu), "selection_done",
- G_CALLBACK (month_num_submenu_selection_done_cb),
- submenu_item);
-
- omenu = gtk_option_menu_new ();
- gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
-
- return omenu;
-}
-
-/* Creates the option menu for the monthly recurrence days */
-static GtkWidget *
-make_recur_month_menu (void)
-{
- static const char *options[] = {
- N_("day"),
- N_("Monday"),
- N_("Tuesday"),
- N_("Wednesday"),
- N_("Thursday"),
- N_("Friday"),
- N_("Saturday"),
- N_("Sunday")
- };
-
- GtkWidget *menu;
- GtkWidget *omenu;
- int i;
-
- menu = gtk_menu_new ();
-
- for (i = 0; i < sizeof (options) / sizeof (options[0]); i++) {
- GtkWidget *item;
-
- item = gtk_menu_item_new_with_label (_(options[i]));
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
- gtk_widget_show (item);
- }
-
- omenu = gtk_option_menu_new ();
- gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
-
- return omenu;
-}
-
-static void
-month_num_menu_selection_done_cb (GtkMenuShell *menu_shell, gpointer data)
-{
- RecurrencePage *rpage;
- RecurrencePagePrivate *priv;
- enum month_num_options month_num;
- enum month_day_options month_day;
-
- rpage = RECURRENCE_PAGE (data);
- priv = rpage->priv;
-
- month_num = e_dialog_option_menu_get (priv->month_num_menu,
- month_num_options_map);
- month_day = e_dialog_option_menu_get (priv->month_day_menu,
- month_day_options_map);
-
- if (month_num == MONTH_NUM_OTHER) {
- GtkWidget *label, *item;
-
- item = gtk_menu_get_active (GTK_MENU (menu_shell));
- priv->month_index = GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (item)));
-
- month_num = MONTH_NUM_DAY;
- e_dialog_option_menu_set (priv->month_num_menu, month_num, month_num_options_map);
-
- label = GTK_BIN (priv->month_num_menu)->child;
- gtk_label_set_text (GTK_LABEL (label), _(e_cal_recur_nth[priv->month_index - 1]));
-
- e_dialog_option_menu_set (priv->month_num_menu, 0, month_num_options_map);
- e_dialog_option_menu_set (priv->month_num_menu, month_num, month_num_options_map);
- }
-
- if (month_num == MONTH_NUM_DAY && month_day != MONTH_DAY_NTH)
- e_dialog_option_menu_set (priv->month_day_menu,
- MONTH_DAY_NTH,
- month_day_options_map);
- else if (month_num != MONTH_NUM_DAY && month_num != MONTH_NUM_LAST && month_day == MONTH_DAY_NTH)
- e_dialog_option_menu_set (priv->month_day_menu,
- MONTH_DAY_MON,
- month_num_options_map);
- field_changed (rpage);
- preview_recur (rpage);
-}
-
-/* Callback used when the monthly day selection menu changes. We need
- * to change the valid range of the day index spin button; e.g. days
- * are 1-31 while a Sunday is the 1st through 5th.
- */
-static void
-month_day_menu_selection_done_cb (GtkMenuShell *menu_shell, gpointer data)
-{
- RecurrencePage *rpage;
- RecurrencePagePrivate *priv;
- enum month_num_options month_num;
- enum month_day_options month_day;
-
- rpage = RECURRENCE_PAGE (data);
- priv = rpage->priv;
-
- month_num = e_dialog_option_menu_get (priv->month_num_menu,
- month_num_options_map);
- month_day = e_dialog_option_menu_get (priv->month_day_menu,
- month_day_options_map);
- if (month_day == MONTH_DAY_NTH && month_num != MONTH_NUM_LAST && month_num != MONTH_NUM_DAY)
- e_dialog_option_menu_set (priv->month_num_menu,
- MONTH_NUM_DAY,
- month_num_options_map);
- else if (month_day != MONTH_DAY_NTH && month_num == MONTH_NUM_DAY)
- e_dialog_option_menu_set (priv->month_num_menu,
- MONTH_NUM_FIRST,
- month_num_options_map);
- field_changed (rpage);
- preview_recur (rpage);
-}
-
-/* Callback used when the month index value changes. */
-static void
-month_index_value_changed_cb (GtkAdjustment *adj, gpointer data)
-{
- RecurrencePage *rpage;
-
- rpage = RECURRENCE_PAGE (data);
-
- field_changed (rpage);
- preview_recur (rpage);
-}
-
-/* Creates the special contents for monthly recurrences */
-static void
-make_monthly_special (RecurrencePage *rpage)
-{
- RecurrencePagePrivate *priv;
- GtkWidget *hbox;
- GtkWidget *label;
- GtkAdjustment *adj;
- GtkWidget *menu;
-
- priv = rpage->priv;
-
- g_assert (GTK_BIN (priv->special)->child == NULL);
- g_assert (priv->month_day_menu == NULL);
-
- /* Create the widgets */
-
- hbox = gtk_hbox_new (FALSE, 2);
- gtk_container_add (GTK_CONTAINER (priv->special), hbox);
-
- label = gtk_label_new (_("on the"));
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 6);
-
- adj = GTK_ADJUSTMENT (gtk_adjustment_new (1, 1, 31, 1, 10, 10));
-
- priv->month_num_menu = make_recur_month_num_menu (priv->month_index);
- gtk_box_pack_start (GTK_BOX (hbox), priv->month_num_menu,
- FALSE, FALSE, 6);
-
- priv->month_day_menu = make_recur_month_menu ();
- gtk_box_pack_start (GTK_BOX (hbox), priv->month_day_menu,
- FALSE, FALSE, 6);
-
- gtk_widget_show_all (hbox);
-
- /* Set the options */
- e_dialog_option_menu_set (priv->month_num_menu,
- priv->month_num,
- month_num_options_map);
- e_dialog_option_menu_set (priv->month_day_menu,
- priv->month_day,
- month_day_options_map);
-
- g_signal_connect((adj), "value_changed", G_CALLBACK (month_index_value_changed_cb),
- rpage);
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->month_num_menu));
- g_signal_connect((menu), "selection_done",
- G_CALLBACK (month_num_menu_selection_done_cb),
- rpage);
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->month_day_menu));
- g_signal_connect((menu), "selection_done",
- G_CALLBACK (month_day_menu_selection_done_cb),
- rpage);
-}
-
-/* Changes the recurrence-special widget to match the interval units.
- *
- * For daily recurrences: nothing.
- * For weekly recurrences: weekday selector.
- * For monthly recurrences: "on the" <nth> [day, Weekday]
- * For yearly recurrences: nothing.
- */
-static void
-make_recurrence_special (RecurrencePage *rpage)
-{
- RecurrencePagePrivate *priv;
- icalrecurrencetype_frequency frequency;
-
- priv = rpage->priv;
-
- if (priv->month_num_menu != NULL) {
- gtk_widget_destroy (priv->month_num_menu);
- priv->month_num_menu = NULL;
- }
- if (GTK_BIN (priv->special)->child != NULL) {
- gtk_widget_destroy (GTK_BIN (priv->special)->child);
-
- priv->weekday_picker = NULL;
- priv->month_day_menu = NULL;
- }
-
- frequency = e_dialog_option_menu_get (priv->interval_unit, freq_map);
-
- switch (frequency) {
- case ICAL_DAILY_RECURRENCE:
- gtk_widget_hide (priv->special);
- break;
-
- case ICAL_WEEKLY_RECURRENCE:
- make_weekly_special (rpage);
- gtk_widget_show (priv->special);
- break;
-
- case ICAL_MONTHLY_RECURRENCE:
- make_monthly_special (rpage);
- gtk_widget_show (priv->special);
- break;
-
- case ICAL_YEARLY_RECURRENCE:
- gtk_widget_hide (priv->special);
- break;
-
- default:
- g_assert_not_reached ();
- }
-}
-
-/* Counts the elements in the by_xxx fields of an icalrecurrencetype */
-static int
-count_by_xxx (short *field, int max_elements)
-{
- int i;
-
- for (i = 0; i < max_elements; i++)
- if (field[i] == ICAL_RECURRENCE_ARRAY_MAX)
- break;
-
- return i;
-}
-
-/* Callback used when the ending-until date editor changes */
-static void
-ending_until_changed_cb (EDateEdit *de, gpointer data)
-{
- RecurrencePage *rpage;
-
- rpage = RECURRENCE_PAGE (data);
- field_changed (rpage);
- preview_recur (rpage);
-}
-
-/* Creates the special contents for "ending until" (end date) recurrences */
-static void
-make_ending_until_special (RecurrencePage *rpage)
-{
- RecurrencePagePrivate *priv;
- EDateEdit *de;
-
- priv = rpage->priv;
-
- g_assert (GTK_BIN (priv->ending_special)->child == NULL);
- g_assert (priv->ending_date_edit == NULL);
-
- /* Create the widget */
-
- priv->ending_date_edit = comp_editor_new_date_edit (TRUE, FALSE,
- FALSE);
- de = E_DATE_EDIT (priv->ending_date_edit);
-
- gtk_container_add (GTK_CONTAINER (priv->ending_special),
- GTK_WIDGET (de));
- gtk_widget_show_all (GTK_WIDGET (de));
-
- /* Set the value */
-
- e_date_edit_set_date (de, priv->ending_date_tt.year,
- priv->ending_date_tt.month,
- priv->ending_date_tt.day);
-
- g_signal_connect((de), "changed",
- G_CALLBACK (ending_until_changed_cb), rpage);
-
- /* Make sure the EDateEdit widget uses our timezones to get the
- current time. */
- e_date_edit_set_get_time_callback (de,
- (EDateEditGetTimeCallback) comp_editor_get_current_time,
- rpage, NULL);
-}
-
-/* Callback used when the ending-count value changes */
-static void
-ending_count_value_changed_cb (GtkAdjustment *adj, gpointer data)
-{
- RecurrencePage *rpage;
-
- rpage = RECURRENCE_PAGE (data);
- field_changed (rpage);
- preview_recur (rpage);
-}
-
-/* Creates the special contents for the occurrence count case */
-static void
-make_ending_count_special (RecurrencePage *rpage)
-{
- RecurrencePagePrivate *priv;
- GtkWidget *hbox;
- GtkWidget *label;
- GtkAdjustment *adj;
-
- priv = rpage->priv;
-
- g_assert (GTK_BIN (priv->ending_special)->child == NULL);
- g_assert (priv->ending_count_spin == NULL);
-
- /* Create the widgets */
-
- hbox = gtk_hbox_new (FALSE, 2);
- gtk_container_add (GTK_CONTAINER (priv->ending_special), hbox);
-
- adj = GTK_ADJUSTMENT (gtk_adjustment_new (1, 1, 10000, 1, 10, 10));
- priv->ending_count_spin = gtk_spin_button_new (adj, 1, 0);
- gtk_spin_button_set_numeric ((GtkSpinButton *)priv->ending_count_spin, TRUE);
- gtk_box_pack_start (GTK_BOX (hbox), priv->ending_count_spin,
- FALSE, FALSE, 6);
-
- label = gtk_label_new (_("occurrences"));
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 6);
-
- gtk_widget_show_all (hbox);
-
- /* Set the values */
-
- e_dialog_spin_set (priv->ending_count_spin, priv->ending_count);
-
- g_signal_connect((adj), "value_changed",
- G_CALLBACK (ending_count_value_changed_cb),
- rpage);
-}
-
-/* Changes the recurrence-ending-special widget to match the ending date option
- *
- * For: <n> [days, weeks, months, years, occurrences]
- * Until: <date selector>
- * Forever: nothing.
- */
-static void
-make_ending_special (RecurrencePage *rpage)
-{
- RecurrencePagePrivate *priv;
- enum ending_type ending_type;
-
- priv = rpage->priv;
-
- if (GTK_BIN (priv->ending_special)->child != NULL) {
- gtk_widget_destroy (GTK_BIN (priv->ending_special)->child);
-
- priv->ending_date_edit = NULL;
- priv->ending_count_spin = NULL;
- }
-
- ending_type = e_dialog_option_menu_get (priv->ending_menu,
- ending_types_map);
-
- switch (ending_type) {
- case ENDING_FOR:
- make_ending_count_special (rpage);
- gtk_widget_show (priv->ending_special);
- break;
-
- case ENDING_UNTIL:
- make_ending_until_special (rpage);
- gtk_widget_show (priv->ending_special);
- break;
-
- case ENDING_FOREVER:
- gtk_widget_hide (priv->ending_special);
- break;
-
- default:
- g_assert_not_reached ();
- }
-}
-
-/* Fills the recurrence ending date widgets with the values from the calendar
- * component.
- */
-static void
-fill_ending_date (RecurrencePage *rpage, struct icalrecurrencetype *r)
-{
- RecurrencePagePrivate *priv;
- GtkWidget *menu;
-
- priv = rpage->priv;
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->ending_menu));
- g_signal_handlers_block_matched (menu, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
-
- if (r->count == 0) {
- if (r->until.year == 0) {
- /* Forever */
-
- e_dialog_option_menu_set (priv->ending_menu,
- ENDING_FOREVER,
- ending_types_map);
- } else {
- /* Ending date */
-
- if (!r->until.is_date) {
- ECal *client = COMP_EDITOR_PAGE (rpage)->client;
- ECalComponentDateTime dt;
- icaltimezone *from_zone, *to_zone;
-
- e_cal_component_get_dtstart (priv->comp, &dt);
-
- if (dt.value->is_date)
- to_zone = calendar_config_get_icaltimezone ();
- else if (dt.tzid == NULL)
- to_zone = icaltimezone_get_utc_timezone ();
- else
- /* FIXME Error checking? */
- e_cal_get_timezone (client, dt.tzid, &to_zone, NULL);
- from_zone = icaltimezone_get_utc_timezone ();
-
- icaltimezone_convert_time (&r->until, from_zone, to_zone);
-
- r->until.hour = 0;
- r->until.minute = 0;
- r->until.second = 0;
- r->until.is_date = TRUE;
- r->until.is_utc = FALSE;
- }
-
- priv->ending_date_tt = r->until;
- e_dialog_option_menu_set (priv->ending_menu,
- ENDING_UNTIL,
- ending_types_map);
- }
- } else {
- /* Count of occurrences */
-
- priv->ending_count = r->count;
- e_dialog_option_menu_set (priv->ending_menu,
- ENDING_FOR,
- ending_types_map);
- }
-
- g_signal_handlers_unblock_matched (menu, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
-
- make_ending_special (rpage);
-}
-
-/* fill_widgets handler for the recurrence page. This function is particularly
- * tricky because it has to discriminate between recurrences we support for
- * editing and the ones we don't. We only support at most one recurrence rule;
- * no rdates or exrules (exdates are handled just fine elsewhere).
- */
-static gboolean
-recurrence_page_fill_widgets (CompEditorPage *page, ECalComponent *comp)
-{
- RecurrencePage *rpage;
- RecurrencePagePrivate *priv;
- ECalComponentText text;
- CompEditorPageDates dates;
- GSList *rrule_list;
- int len;
- struct icalrecurrencetype *r;
- int n_by_second, n_by_minute, n_by_hour;
- int n_by_day, n_by_month_day, n_by_year_day;
- int n_by_week_no, n_by_month, n_by_set_pos;
- GtkWidget *menu;
- GtkAdjustment *adj;
-
- rpage = RECURRENCE_PAGE (page);
- priv = rpage->priv;
-
- /* Keep a copy of the component so that we can expand the recurrence
- * set for the preview.
- */
-
- if (priv->comp)
- g_object_unref (priv->comp);
-
- priv->comp = e_cal_component_clone (comp);
-
- /* Don't send off changes during this time */
- priv->updating = TRUE;
-
- /* Clean the page */
- clear_widgets (rpage);
-
- /* Summary */
- e_cal_component_get_summary (comp, &text);
-
- /* Dates */
- comp_editor_dates (&dates, comp);
- recurrence_page_set_dates (page, &dates);
- comp_editor_free_dates (&dates);
-
- /* Exceptions */
- fill_exception_widgets (rpage, comp);
-
- /* Set up defaults for the special widgets */
- set_special_defaults (rpage);
-
- /* No recurrences? */
-
- if (!e_cal_component_has_rdates (comp)
- && !e_cal_component_has_rrules (comp)
- && !e_cal_component_has_exrules (comp)) {
- gtk_signal_handler_block_by_data (GTK_OBJECT (priv->recurs), rpage);
- e_dialog_toggle_set (priv->recurs, FALSE);
- gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->recurs), rpage);
-
- sensitize_buttons (rpage);
- preview_recur (rpage);
-
- priv->updating = FALSE;
- return TRUE;
- }
-
- /* See if it is a custom set we don't support */
-
- e_cal_component_get_rrule_list (comp, &rrule_list);
- len = g_slist_length (rrule_list);
- if (len > 1
- || e_cal_component_has_rdates (comp)
- || e_cal_component_has_exrules (comp))
- goto custom;
-
- /* Down to one rule, so test that one */
-
- g_assert (len == 1);
- r = rrule_list->data;
-
- /* Any funky frequency? */
-
- if (r->freq == ICAL_SECONDLY_RECURRENCE
- || r->freq == ICAL_MINUTELY_RECURRENCE
- || r->freq == ICAL_HOURLY_RECURRENCE)
- goto custom;
-
- /* Any funky shit? */
-
-#define N_HAS_BY(field) (count_by_xxx (field, sizeof (field) / sizeof (field[0])))
-
- n_by_second = N_HAS_BY (r->by_second);
- n_by_minute = N_HAS_BY (r->by_minute);
- n_by_hour = N_HAS_BY (r->by_hour);
- n_by_day = N_HAS_BY (r->by_day);
- n_by_month_day = N_HAS_BY (r->by_month_day);
- n_by_year_day = N_HAS_BY (r->by_year_day);
- n_by_week_no = N_HAS_BY (r->by_week_no);
- n_by_month = N_HAS_BY (r->by_month);
- n_by_set_pos = N_HAS_BY (r->by_set_pos);
-
- if (n_by_second != 0
- || n_by_minute != 0
- || n_by_hour != 0)
- goto custom;
-
- /* Filter the funky shit based on the frequency; if there is nothing
- * weird we can actually set the widgets.
- */
-
- switch (r->freq) {
- case ICAL_DAILY_RECURRENCE:
- if (n_by_day != 0
- || n_by_month_day != 0
- || n_by_year_day != 0
- || n_by_week_no != 0
- || n_by_month != 0
- || n_by_set_pos != 0)
- goto custom;
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->interval_unit));
- g_signal_handlers_block_matched (menu, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
- e_dialog_option_menu_set (priv->interval_unit,
- ICAL_DAILY_RECURRENCE,
- freq_map);
- g_signal_handlers_unblock_matched (menu, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
- break;
-
- case ICAL_WEEKLY_RECURRENCE: {
- int i;
- guint8 day_mask;
-
- if (n_by_month_day != 0
- || n_by_year_day != 0
- || n_by_week_no != 0
- || n_by_month != 0
- || n_by_set_pos != 0)
- goto custom;
-
- day_mask = 0;
-
- for (i = 0; i < 8 && r->by_day[i] != ICAL_RECURRENCE_ARRAY_MAX; i++) {
- enum icalrecurrencetype_weekday weekday;
- int pos;
-
- weekday = icalrecurrencetype_day_day_of_week (r->by_day[i]);
- pos = icalrecurrencetype_day_position (r->by_day[i]);
-
- if (pos != 0)
- goto custom;
-
- switch (weekday) {
- case ICAL_SUNDAY_WEEKDAY:
- day_mask |= 1 << 0;
- break;
-
- case ICAL_MONDAY_WEEKDAY:
- day_mask |= 1 << 1;
- break;
-
- case ICAL_TUESDAY_WEEKDAY:
- day_mask |= 1 << 2;
- break;
-
- case ICAL_WEDNESDAY_WEEKDAY:
- day_mask |= 1 << 3;
- break;
-
- case ICAL_THURSDAY_WEEKDAY:
- day_mask |= 1 << 4;
- break;
-
- case ICAL_FRIDAY_WEEKDAY:
- day_mask |= 1 << 5;
- break;
-
- case ICAL_SATURDAY_WEEKDAY:
- day_mask |= 1 << 6;
- break;
-
- default:
- break;
- }
- }
-
- priv->weekday_day_mask = day_mask;
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->interval_unit));
- g_signal_handlers_block_matched (menu, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
- e_dialog_option_menu_set (priv->interval_unit,
- ICAL_WEEKLY_RECURRENCE,
- freq_map);
- g_signal_handlers_unblock_matched (menu, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
- break;
- }
-
- case ICAL_MONTHLY_RECURRENCE:
- if (n_by_year_day != 0
- || n_by_week_no != 0
- || n_by_month != 0
- || n_by_set_pos > 1)
- goto custom;
-
- if (n_by_month_day == 1) {
- int nth;
-
- if (n_by_set_pos != 0)
- goto custom;
-
- nth = r->by_month_day[0];
- if (nth < 1 && nth != -1)
- goto custom;
-
- if (nth == -1) {
- ECalComponentDateTime dt;
-
- e_cal_component_get_dtstart (comp, &dt);
- priv->month_index = dt.value->day;
- priv->month_num = MONTH_NUM_LAST;
- } else {
- priv->month_index = nth;
- priv->month_num = MONTH_NUM_DAY;
- }
- priv->month_day = MONTH_DAY_NTH;
-
- } else if (n_by_day == 1) {
- enum icalrecurrencetype_weekday weekday;
- int pos;
- enum month_day_options month_day;
-
- /* Outlook 2000 uses BYDAY=TU;BYSETPOS=2, and will not
- accept BYDAY=2TU. So we now use the same as Outlook
- by default. */
-
- weekday = icalrecurrencetype_day_day_of_week (r->by_day[0]);
- pos = icalrecurrencetype_day_position (r->by_day[0]);
-
- if (pos == 0) {
- if (n_by_set_pos != 1)
- goto custom;
- pos = r->by_set_pos[0];
- } else if (pos < 0) {
- goto custom;
- }
-
- switch (weekday) {
- case ICAL_MONDAY_WEEKDAY:
- month_day = MONTH_DAY_MON;
- break;
-
- case ICAL_TUESDAY_WEEKDAY:
- month_day = MONTH_DAY_TUE;
- break;
-
- case ICAL_WEDNESDAY_WEEKDAY:
- month_day = MONTH_DAY_WED;
- break;
-
- case ICAL_THURSDAY_WEEKDAY:
- month_day = MONTH_DAY_THU;
- break;
-
- case ICAL_FRIDAY_WEEKDAY:
- month_day = MONTH_DAY_FRI;
- break;
-
- case ICAL_SATURDAY_WEEKDAY:
- month_day = MONTH_DAY_SAT;
- break;
-
- case ICAL_SUNDAY_WEEKDAY:
- month_day = MONTH_DAY_SUN;
- break;
-
- default:
- goto custom;
- }
-
- if (pos == -1)
- priv->month_num = MONTH_NUM_LAST;
- else
- priv->month_num = pos - 1;
- priv->month_day = month_day;
- } else
- goto custom;
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->interval_unit));
- g_signal_handlers_block_matched (menu, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
- e_dialog_option_menu_set (priv->interval_unit,
- ICAL_MONTHLY_RECURRENCE,
- freq_map);
- g_signal_handlers_unblock_matched (menu, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
- break;
-
- case ICAL_YEARLY_RECURRENCE:
- if (n_by_day != 0
- || n_by_month_day != 0
- || n_by_year_day != 0
- || n_by_week_no != 0
- || n_by_month != 0
- || n_by_set_pos != 0)
- goto custom;
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->interval_unit));
- g_signal_handlers_block_matched (menu, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
- e_dialog_option_menu_set (priv->interval_unit,
- ICAL_YEARLY_RECURRENCE,
- freq_map);
- g_signal_handlers_unblock_matched (menu, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
- break;
-
- default:
- goto custom;
- }
-
- /* If we got here it means it is a simple recurrence */
-
- g_signal_handlers_block_matched (priv->recurs, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
- e_dialog_toggle_set (priv->recurs, TRUE);
- g_signal_handlers_unblock_matched (priv->recurs, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
-
- sensitize_buttons (rpage);
- make_recurrence_special (rpage);
-
- adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (priv->interval_value));
- g_signal_handlers_block_matched (adj, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
- e_dialog_spin_set (priv->interval_value, r->interval);
- g_signal_handlers_unblock_matched (adj, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
-
- fill_ending_date (rpage, r);
-
- goto out;
-
- custom:
-
- g_signal_handlers_block_matched (priv->recurs, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
- priv->custom = TRUE;
- e_dialog_toggle_set (priv->recurs, TRUE);
- g_signal_handlers_unblock_matched (priv->recurs, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
- /* FIXME Desensitize recurrence page */
-
- sensitize_buttons (rpage);
-
- out:
- priv->custom = FALSE;
- e_cal_component_free_recur_list (rrule_list);
- preview_recur (rpage);
-
- priv->updating = FALSE;
-
- return TRUE;
-}
-
-/* fill_component handler for the recurrence page */
-static gboolean
-recurrence_page_fill_component (CompEditorPage *page, ECalComponent *comp)
-{
- RecurrencePage *rpage;
-
- rpage = RECURRENCE_PAGE (page);
- return fill_component (rpage, comp);
-}
-
-/* set_dates handler for the recurrence page */
-static void
-recurrence_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates)
-{
- RecurrencePage *rpage;
- RecurrencePagePrivate *priv;
- ECalComponentDateTime dt;
- struct icaltimetype icaltime;
- guint8 mask;
-
- rpage = RECURRENCE_PAGE (page);
- priv = rpage->priv;
-
- /* Copy the dates to our component */
-
- if (!priv->comp)
- return;
-
- dt.value = &icaltime;
-
- if (dates->start) {
- icaltime = *dates->start->value;
- dt.tzid = dates->start->tzid;
- e_cal_component_set_dtstart (priv->comp, &dt);
- }
-
- if (dates->end) {
- icaltime = *dates->end->value;
- dt.tzid = dates->end->tzid;
- e_cal_component_set_dtend (priv->comp, &dt);
- }
-
- /* Update the weekday picker if necessary */
- mask = get_start_weekday_mask (priv->comp);
- if (mask != priv->weekday_blocked_day_mask) {
- priv->weekday_day_mask = priv->weekday_day_mask | mask;
- priv->weekday_blocked_day_mask = mask;
-
- if (priv->weekday_picker != NULL) {
- weekday_picker_set_days (WEEKDAY_PICKER (priv->weekday_picker),
- priv->weekday_day_mask);
- weekday_picker_set_blocked_days (WEEKDAY_PICKER (priv->weekday_picker),
- priv->weekday_blocked_day_mask);
- }
- }
-
- /* Make sure the preview gets updated. */
- preview_recur (rpage);
-}
-
-
-
-/* Gets the widgets from the XML file and returns if they are all available. */
-static gboolean
-get_widgets (RecurrencePage *rpage)
-{
- CompEditorPage *page = COMP_EDITOR_PAGE (rpage);
- RecurrencePagePrivate *priv;
- GSList *accel_groups;
- GtkWidget *toplevel;
-
- priv = rpage->priv;
-
-#define GW(name) glade_xml_get_widget (priv->xml, name)
-
- priv->main = GW ("recurrence-page");
- if (!priv->main)
- return FALSE;
-
- /* Get the GtkAccelGroup from the toplevel window, so we can install
- it when the notebook page is mapped. */
- toplevel = gtk_widget_get_toplevel (priv->main);
- accel_groups = gtk_accel_groups_from_object (G_OBJECT (toplevel));
- if (accel_groups) {
- page->accel_group = accel_groups->data;
- gtk_accel_group_ref (page->accel_group);
- }
-
- gtk_widget_ref (priv->main);
- gtk_container_remove (GTK_CONTAINER (priv->main->parent), priv->main);
-
- priv->recurs = GW ("recurs");
- priv->params = GW ("params");
-
- priv->interval_value = GW ("interval-value");
- priv->interval_unit = GW ("interval-unit");
- priv->special = GW ("special");
- priv->ending_menu = GW ("ending-menu");
- priv->ending_special = GW ("ending-special");
- priv->custom_warning_bin = GW ("custom-warning-bin");
-
- priv->exception_list = GW ("exception-list");
- priv->exception_add = GW ("exception-add");
- priv->exception_modify = GW ("exception-modify");
- priv->exception_delete = GW ("exception-delete");
-
- priv->preview_bin = GW ("preview-bin");
-
-#undef GW
-
- return (priv->recurs
- && priv->params
- && priv->interval_value
- && priv->interval_unit
- && priv->special
- && priv->ending_menu
- && priv->ending_special
- && priv->custom_warning_bin
- && priv->exception_list
- && priv->exception_add
- && priv->exception_modify
- && priv->exception_delete
- && priv->preview_bin);
-}
-
-/* Callback used when the displayed date range in the recurrence preview
- * calendar changes.
- */
-static void
-preview_date_range_changed_cb (ECalendarItem *item, gpointer data)
-{
- RecurrencePage *rpage;
-
- rpage = RECURRENCE_PAGE (data);
- preview_recur (rpage);
-}
-
-/* Callback used when one of the recurrence type radio buttons is toggled. We
- * enable or disable the recurrence parameters.
- */
-static void
-type_toggled_cb (GtkToggleButton *toggle, gpointer data)
-{
- RecurrencePage *rpage;
- RecurrencePagePrivate *priv;
- gboolean read_only;
-
- rpage = RECURRENCE_PAGE (data);
-
- priv = rpage->priv;
-
- field_changed (rpage);
-
- sensitize_buttons (rpage);
- preview_recur (rpage);
-
- /* enable/disable the 'Add' button */
- if (!e_cal_is_read_only (COMP_EDITOR_PAGE (rpage)->client, &read_only, NULL))
- read_only = TRUE;
-
- if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->recurs)) || read_only)
- gtk_widget_set_sensitive (priv->exception_add, FALSE);
- else
- gtk_widget_set_sensitive (priv->exception_add, TRUE);
-}
-
-/* Callback used when the recurrence interval value spin button changes. */
-static void
-interval_value_changed_cb (GtkAdjustment *adj, gpointer data)
-{
- RecurrencePage *rpage;
-
- rpage = RECURRENCE_PAGE (data);
-
- field_changed (rpage);
- preview_recur (rpage);
-}
-
-/* Callback used when the recurrence interval option menu changes. We need to
- * change the contents of the recurrence special widget.
- */
-static void
-interval_selection_done_cb (GtkMenuShell *menu_shell, gpointer data)
-{
- RecurrencePage *rpage;
-
- rpage = RECURRENCE_PAGE (data);
-
- field_changed (rpage);
- make_recurrence_special (rpage);
- preview_recur (rpage);
-}
-
-/* Callback used when the recurrence ending option menu changes. We need to
- * change the contents of the ending special widget.
- */
-static void
-ending_selection_done_cb (GtkMenuShell *menu_shell, gpointer data)
-{
- RecurrencePage *rpage;
-
- rpage = RECURRENCE_PAGE (data);
-
- field_changed (rpage);
- make_ending_special (rpage);
- preview_recur (rpage);
-}
-
-static GtkWidget *
-create_exception_dialog (RecurrencePage *rpage, const char *title, GtkWidget **date_edit)
-{
- RecurrencePagePrivate *priv;
- GtkWidget *dialog, *toplevel;
-
- priv = rpage->priv;
-
- toplevel = gtk_widget_get_toplevel (priv->main);
- dialog = gtk_dialog_new_with_buttons (title, GTK_WINDOW (toplevel),
- GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
- GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
- NULL);
-
- *date_edit = comp_editor_new_date_edit (TRUE, FALSE, TRUE);
- gtk_widget_show (*date_edit);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), *date_edit, FALSE, TRUE, 6);
-
- return dialog;
-}
-
-/* Callback for the "add exception" button */
-static void
-exception_add_cb (GtkWidget *widget, gpointer data)
-{
- RecurrencePage *rpage;
- RecurrencePagePrivate *priv;
- GtkWidget *dialog, *date_edit;
- gboolean date_set;
-
- rpage = RECURRENCE_PAGE (data);
- priv = rpage->priv;
-
- dialog = create_exception_dialog (rpage, "Add exception", &date_edit);
-
- if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
- ECalComponentDateTime dt;
- struct icaltimetype icaltime = icaltime_null_time ();
-
- field_changed (rpage);
-
- dt.value = &icaltime;
-
- /* We use DATE values for exceptions, so we don't need a TZID. */
- dt.tzid = NULL;
- icaltime.is_date = 1;
-
- date_set = e_date_edit_get_date (E_DATE_EDIT (date_edit),
- &icaltime.year,
- &icaltime.month,
- &icaltime.day);
- g_assert (date_set);
-
- append_exception (rpage, &dt);
- preview_recur (rpage);
- }
-
- gtk_widget_destroy (dialog);
-}
-
-/* Callback for the "modify exception" button */
-static void
-exception_modify_cb (GtkWidget *widget, gpointer data)
-{
- RecurrencePage *rpage;
- RecurrencePagePrivate *priv;
- GtkWidget *dialog, *date_edit;
- const ECalComponentDateTime *current_dt;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
-
- rpage = RECURRENCE_PAGE (data);
- priv = rpage->priv;
-
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->exception_list));
- if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
- g_warning ("Could not get a selection to modify.");
- return;
- }
-
- current_dt = e_date_time_list_get_date_time (priv->exception_list_store, &iter);
-
- dialog = create_exception_dialog (rpage, "Modify exception", &date_edit);
- e_date_edit_set_date (E_DATE_EDIT (date_edit),
- current_dt->value->year, current_dt->value->month, current_dt->value->day);
-
- if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
- ECalComponentDateTime dt;
- struct icaltimetype icaltime = icaltime_null_time ();
- struct icaltimetype *tt;
-
- field_changed (rpage);
-
- dt.value = &icaltime;
- tt = dt.value;
- e_date_edit_get_date (E_DATE_EDIT (date_edit),
- &tt->year, &tt->month, &tt->day);
- tt->hour = 0;
- tt->minute = 0;
- tt->second = 0;
- tt->is_date = 1;
-
- /* No TZID, since we are using a DATE value now. */
- dt.tzid = NULL;
-
- e_date_time_list_set_date_time (priv->exception_list_store, &iter, &dt);
- preview_recur (rpage);
- }
-
- gtk_widget_destroy (dialog);
-}
-
-/* Callback for the "delete exception" button */
-static void
-exception_delete_cb (GtkWidget *widget, gpointer data)
-{
- RecurrencePage *rpage;
- RecurrencePagePrivate *priv;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- GtkTreePath *path;
- gboolean valid_iter;
-
- rpage = RECURRENCE_PAGE (data);
- priv = rpage->priv;
-
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->exception_list));
- if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
- g_warning ("Could not get a selection to delete.");
- return;
- }
-
- field_changed (rpage);
-
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->exception_list_store), &iter);
- e_date_time_list_remove (priv->exception_list_store, &iter);
-
- /* Select closest item after removal */
- valid_iter = gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->exception_list_store), &iter, path);
- if (!valid_iter) {
- gtk_tree_path_prev (path);
- valid_iter = gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->exception_list_store), &iter, path);
- }
-
- if (valid_iter)
- gtk_tree_selection_select_iter (selection, &iter);
-
- gtk_tree_path_free (path);
- preview_recur (rpage);
-}
-
-/* Callback used when a row is selected in the list of exception
- * dates. We must update the date/time widgets to reflect the
- * exception's value.
- */
-static void
-exception_selection_changed_cb (GtkTreeSelection *selection, gpointer data)
-{
- RecurrencePage *rpage;
- RecurrencePagePrivate *priv;
- GtkTreeIter iter;
-
- rpage = RECURRENCE_PAGE (data);
- priv = rpage->priv;
-
- if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
- gtk_widget_set_sensitive (priv->exception_modify, FALSE);
- gtk_widget_set_sensitive (priv->exception_delete, FALSE);
- return;
- }
-
- gtk_widget_set_sensitive (priv->exception_modify, TRUE);
- gtk_widget_set_sensitive (priv->exception_delete, TRUE);
-}
-
-/* This is called when any field is changed; it notifies upstream. */
-static void
-field_changed (RecurrencePage *rpage)
-{
- RecurrencePagePrivate *priv;
-
- priv = rpage->priv;
-
- if (!priv->updating)
- comp_editor_page_notify_changed (COMP_EDITOR_PAGE (rpage));
-}
-
-/* Hooks the widget signals */
-static void
-init_widgets (RecurrencePage *rpage)
-{
- RecurrencePagePrivate *priv;
- ECalendar *ecal;
- GtkAdjustment *adj;
- GtkWidget *menu;
- GtkTreeViewColumn *column;
- GtkCellRenderer *cell_renderer;
-
- priv = rpage->priv;
-
- /* Recurrence preview */
-
- priv->preview_calendar = e_calendar_new ();
- ecal = E_CALENDAR (priv->preview_calendar);
- priv->preview_calendar_config = e_mini_calendar_config_new (ecal);
- g_signal_connect((ecal->calitem), "date_range_changed",
- G_CALLBACK (preview_date_range_changed_cb),
- rpage);
- e_calendar_item_set_max_days_sel (ecal->calitem, 0);
- gtk_container_add (GTK_CONTAINER (priv->preview_bin),
- priv->preview_calendar);
- gtk_widget_show (priv->preview_calendar);
-
- e_calendar_item_set_get_time_callback (ecal->calitem,
- (ECalendarItemGetTimeCallback) comp_editor_get_current_time,
- rpage, NULL);
-
- /* Recurrence types */
-
- g_signal_connect(priv->recurs, "toggled", G_CALLBACK (type_toggled_cb), rpage);
-
- /* Recurrence interval */
-
- adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (priv->interval_value));
- g_signal_connect((adj), "value_changed",
- G_CALLBACK (interval_value_changed_cb),
- rpage);
-
- /* Recurrence units */
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->interval_unit));
- g_signal_connect((menu), "selection_done",
- G_CALLBACK (interval_selection_done_cb),
- rpage);
-
- /* Recurrence ending */
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->ending_menu));
- g_signal_connect((menu), "selection_done",
- G_CALLBACK (ending_selection_done_cb), rpage);
-
- /* Exception buttons */
-
- g_signal_connect((priv->exception_add), "clicked",
- G_CALLBACK (exception_add_cb), rpage);
- g_signal_connect((priv->exception_modify), "clicked",
- G_CALLBACK (exception_modify_cb), rpage);
- g_signal_connect((priv->exception_delete), "clicked",
- G_CALLBACK (exception_delete_cb), rpage);
-
- gtk_widget_set_sensitive (priv->exception_modify, FALSE);
- gtk_widget_set_sensitive (priv->exception_delete, FALSE);
-
- /* Exception list */
-
- /* Model */
- priv->exception_list_store = e_date_time_list_new ();
- gtk_tree_view_set_model (GTK_TREE_VIEW (priv->exception_list),
- GTK_TREE_MODEL (priv->exception_list_store));
-
- /* View */
- column = gtk_tree_view_column_new ();
- gtk_tree_view_column_set_title (column, _("Date/Time"));
- cell_renderer = GTK_CELL_RENDERER (gtk_cell_renderer_text_new ());
- gtk_tree_view_column_pack_start (column, cell_renderer, TRUE);
- gtk_tree_view_column_add_attribute (column, cell_renderer, "text", E_DATE_TIME_LIST_COLUMN_DESCRIPTION);
- gtk_tree_view_append_column (GTK_TREE_VIEW (priv->exception_list), column);
-
- g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->exception_list)), "changed",
- G_CALLBACK (exception_selection_changed_cb), rpage);
-}
-
-
-
-static void
-client_changed_cb (CompEditorPage *page, ECal *client, gpointer user_data)
-{
- RecurrencePage *rpage = RECURRENCE_PAGE (page);
-
- sensitize_buttons (rpage);
-}
-
-/**
- * recurrence_page_construct:
- * @rpage: A recurrence page.
- *
- * Constructs a recurrence page by loading its Glade data.
- *
- * Return value: The same object as @rpage, or NULL if the widgets could not be
- * created.
- **/
-RecurrencePage *
-recurrence_page_construct (RecurrencePage *rpage)
-{
- RecurrencePagePrivate *priv;
-
- priv = rpage->priv;
-
- priv->xml = glade_xml_new (EVOLUTION_GLADEDIR
- "/recurrence-page.glade", NULL, NULL);
- if (!priv->xml) {
- g_message ("recurrence_page_construct(): "
- "Could not load the Glade XML file!");
- return NULL;
- }
-
- if (!get_widgets (rpage)) {
- g_message ("recurrence_page_construct(): "
- "Could not find all widgets in the XML file!");
- return NULL;
- }
-
- init_widgets (rpage);
-
- g_signal_connect_after (G_OBJECT (rpage), "client_changed",
- G_CALLBACK (client_changed_cb), NULL);
-
- return rpage;
-}
-
-/**
- * recurrence_page_new:
- *
- * Creates a new recurrence page.
- *
- * Return value: A newly-created recurrence page, or NULL if the page could not
- * be created.
- **/
-RecurrencePage *
-recurrence_page_new (void)
-{
- RecurrencePage *rpage;
-
- rpage = g_object_new (TYPE_RECURRENCE_PAGE, NULL);
- if (!recurrence_page_construct (rpage)) {
- g_object_unref (rpage);
- return NULL;
- }
-
- return rpage;
-}
-
-
-GtkWidget *make_exdate_date_edit (void);
-
-GtkWidget *
-make_exdate_date_edit (void)
-{
- return comp_editor_new_date_edit (TRUE, TRUE, FALSE);
-}
-
diff --git a/calendar/gui/dialogs/recurrence-page.glade b/calendar/gui/dialogs/recurrence-page.glade
deleted file mode 100644
index bcbfb7748e..0000000000
--- a/calendar/gui/dialogs/recurrence-page.glade
+++ /dev/null
@@ -1,637 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkWindow" id="recurrence-toplevel">
- <property name="title" translatable="yes">window1</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-
- <child>
- <widget class="GtkVBox" id="recurrence-page">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label71">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Recurrence&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox61">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="label72">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">12</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox59">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkCheckButton" id="recurs">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">This appointment rec_urs</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox57">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkHBox" id="params">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child>
- <widget class="GtkLabel" id="label68">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Every</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="interval-value">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">1 1 10000 1 10 10</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="interval-unit">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget1">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">day(s)</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">week(s)</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget4">
- <property name="visible">True</property>
- <property name="label" translatable="yes">month(s)</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget5">
- <property name="visible">True</property>
- <property name="label" translatable="yes">year(s)</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="special">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <placeholder/>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="ending-menu">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget6">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget7">
- <property name="visible">True</property>
- <property name="label" translatable="yes">for</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget8">
- <property name="visible">True</property>
- <property name="label" translatable="yes">until</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget9">
- <property name="visible">True</property>
- <property name="label" translatable="yes">forever</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="ending-special">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <placeholder/>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="custom-warning-bin">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xscale">1</property>
- <property name="yscale">1</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <placeholder/>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label73">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Exceptions&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox60">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="label75">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">12</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox63">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow14">
- <property name="visible">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
- <child>
- <widget class="GtkTreeView" id="exception-list">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="headers_visible">False</property>
- <property name="rules_hint">False</property>
- <property name="reorderable">False</property>
- <property name="enable_search">True</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVButtonBox" id="vbuttonbox1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_START</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkButton" id="exception-add">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-add</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="exception-modify">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment1">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox64">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child>
- <widget class="GtkImage" id="image1">
- <property name="visible">True</property>
- <property name="stock">gtk-preferences</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label76">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Edit</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="exception-delete">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-remove</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label70">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Preview&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox62">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="label74">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">12</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox60">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkAlignment" id="preview-bin">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="xscale">1</property>
- <property name="yscale">1</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
-
- <child>
- <placeholder/>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/calendar/gui/dialogs/recurrence-page.h b/calendar/gui/dialogs/recurrence-page.h
deleted file mode 100644
index 7a10eff069..0000000000
--- a/calendar/gui/dialogs/recurrence-page.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Evolution calendar - Recurrence page of the calendar component dialogs
- *
- * Copyright (C) 2001-2003 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- * Miguel de Icaza <miguel@ximian.com>
- * Seth Alves <alves@hungry.com>
- * JP Rosevear <jpr@ximian.com>
- * Hans Petter Jansson <hpj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef RECURRENCE_PAGE_H
-#define RECURRENCE_PAGE_H
-
-#include "comp-editor-page.h"
-
-G_BEGIN_DECLS
-
-
-
-#define TYPE_RECURRENCE_PAGE (recurrence_page_get_type ())
-#define RECURRENCE_PAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_RECURRENCE_PAGE, RecurrencePage))
-#define RECURRENCE_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_RECURRENCE_PAGE, RecurrencePageClass))
-#define IS_RECURRENCE_PAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_RECURRENCE_PAGE))
-#define IS_RECURRENCE_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TYPE_RECURRENCE_PAGE))
-
-typedef struct _RecurrencePagePrivate RecurrencePagePrivate;
-
-typedef struct {
- CompEditorPage page;
-
- /* Private data */
- RecurrencePagePrivate *priv;
-} RecurrencePage;
-
-typedef struct {
- CompEditorPageClass parent_class;
-} RecurrencePageClass;
-
-
-GtkType recurrence_page_get_type (void);
-RecurrencePage *recurrence_page_construct (RecurrencePage *rpage);
-RecurrencePage *recurrence_page_new (void);
-
-
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/dialogs/save-comp.c b/calendar/gui/dialogs/save-comp.c
deleted file mode 100644
index fa5eae8659..0000000000
--- a/calendar/gui/dialogs/save-comp.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Evolution calendar - Delete calendar component dialog
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "widgets/misc/e-error.h"
-#include "save-comp.h"
-#include "comp-editor.h"
-
-/**
- * save_component_dialog:
- * @parent: Window to use as the transient dialog's parent.
- * @comp: Pointer to the EcalComponent
- *
- * Pops up a dialog box asking the user whether he wants to save changes for
- * a calendar component.
- *
- * Return value: the response_id of the button selected.
- **/
-
-GtkResponseType
-save_component_dialog (GtkWindow *parent, ECalComponent *comp)
-{
- ECalComponentVType vtype = e_cal_component_get_vtype(comp);
-
- switch(vtype) {
- case E_CAL_COMPONENT_EVENT:
- return e_error_run (parent, "calendar:prompt-save-appointment", NULL);
- case E_CAL_COMPONENT_TODO:
- return e_error_run (parent, "calendar:prompt-save-task", NULL);
- default:
- return GTK_RESPONSE_NO;
- }
-}
diff --git a/calendar/gui/dialogs/save-comp.h b/calendar/gui/dialogs/save-comp.h
deleted file mode 100644
index 79abe30453..0000000000
--- a/calendar/gui/dialogs/save-comp.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Evolution calendar - Delete calendar component dialog
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef SAVE_COMP_H
-#define SAVE_COMP_H
-
-#include <gtk/gtkdialog.h>
-#include <libecal/e-cal-component.h>
-
-GtkResponseType save_component_dialog (GtkWindow *parent, ECalComponent *comp);
-
-#endif
diff --git a/calendar/gui/dialogs/schedule-page.c b/calendar/gui/dialogs/schedule-page.c
deleted file mode 100644
index 327770cecb..0000000000
--- a/calendar/gui/dialogs/schedule-page.c
+++ /dev/null
@@ -1,529 +0,0 @@
-/* Evolution calendar - Scheduling page
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- * Miguel de Icaza <miguel@ximian.com>
- * Seth Alves <alves@hungry.com>
- * JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtktogglebutton.h>
-#include <gtk/gtkvbox.h>
-#include <gtk/gtkwindow.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/gnome-dialog-util.h>
-#include <glade/glade.h>
-#include <e-util/e-dialog-widgets.h>
-#include <widgets/misc/e-dateedit.h>
-#include "../calendar-config.h"
-#include "../e-meeting-time-sel.h"
-#include "../itip-utils.h"
-#include "comp-editor-util.h"
-#include "e-delegate-dialog.h"
-#include "schedule-page.h"
-
-
-
-/* Private part of the SchedulePage structure */
-struct _SchedulePagePrivate {
- /* Glade XML data */
- GladeXML *xml;
-
- /* Widgets from the Glade file */
- GtkWidget *main;
-
- /* Model */
- EMeetingStore *model;
-
- /* Selector */
- EMeetingTimeSelector *sel;
-
- /* The timezone we use. Note that we use the same timezone for the
- start and end date. We convert the end date if it is passed in in
- another timezone. */
- icaltimezone *zone;
-
- gboolean updating;
-};
-
-
-
-static void schedule_page_finalize (GObject *object);
-
-static GtkWidget *schedule_page_get_widget (CompEditorPage *page);
-static void schedule_page_focus_main_widget (CompEditorPage *page);
-static gboolean schedule_page_fill_widgets (CompEditorPage *page, ECalComponent *comp);
-static gboolean schedule_page_fill_component (CompEditorPage *page, ECalComponent *comp);
-static void schedule_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates);
-
-static void times_changed_cb (GtkWidget *widget, gpointer data);
-
-G_DEFINE_TYPE (SchedulePage, schedule_page, TYPE_COMP_EDITOR_PAGE);
-
-/* Class initialization function for the schedule page */
-static void
-schedule_page_class_init (SchedulePageClass *class)
-{
- CompEditorPageClass *editor_page_class;
- GObjectClass *object_class;
-
- editor_page_class = (CompEditorPageClass *) class;
- object_class = (GObjectClass *) class;
-
- editor_page_class->get_widget = schedule_page_get_widget;
- editor_page_class->focus_main_widget = schedule_page_focus_main_widget;
- editor_page_class->fill_widgets = schedule_page_fill_widgets;
- editor_page_class->fill_component = schedule_page_fill_component;
- editor_page_class->set_summary = NULL;
- editor_page_class->set_dates = schedule_page_set_dates;
-
- object_class->finalize = schedule_page_finalize;
-}
-
-/* Object initialization function for the schedule page */
-static void
-schedule_page_init (SchedulePage *spage)
-{
- SchedulePagePrivate *priv;
-
- priv = g_new0 (SchedulePagePrivate, 1);
- spage->priv = priv;
-
- priv->xml = NULL;
-
- priv->main = NULL;
-
- priv->zone = NULL;
-
- priv->updating = FALSE;
-}
-
-/* Destroy handler for the schedule page */
-static void
-schedule_page_finalize (GObject *object)
-{
- SchedulePage *spage;
- SchedulePagePrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_SCHEDULE_PAGE (object));
-
- spage = SCHEDULE_PAGE (object);
- priv = spage->priv;
-
- if (priv->main)
- gtk_widget_unref (priv->main);
-
- if (priv->xml) {
- g_object_unref (priv->xml);
- priv->xml = NULL;
- }
-
- g_object_unref(priv->model);
-
- g_free (priv);
- spage->priv = NULL;
-
- if (G_OBJECT_CLASS (schedule_page_parent_class)->finalize)
- (* G_OBJECT_CLASS (schedule_page_parent_class)->finalize) (object);
-}
-
-
-
-/* get_widget handler for the schedule page */
-static GtkWidget *
-schedule_page_get_widget (CompEditorPage *page)
-{
- SchedulePage *spage;
- SchedulePagePrivate *priv;
-
- spage = SCHEDULE_PAGE (page);
- priv = spage->priv;
-
- return priv->main;
-}
-
-/* focus_main_widget handler for the schedule page */
-static void
-schedule_page_focus_main_widget (CompEditorPage *page)
-{
- SchedulePage *spage;
- SchedulePagePrivate *priv;
-
- spage = SCHEDULE_PAGE (page);
- priv = spage->priv;
-
- gtk_widget_grab_focus (GTK_WIDGET (priv->sel));
-}
-
-static void
-sensitize_widgets (SchedulePage *spage)
-{
- gboolean read_only;
- SchedulePagePrivate *priv = spage->priv;
-
- if (!e_cal_is_read_only (COMP_EDITOR_PAGE (spage)->client, &read_only, NULL))
- read_only = TRUE;
-
- e_meeting_time_selector_set_read_only (priv->sel, read_only);
-}
-
-static void
-client_changed_cb (CompEditorPage *page, ECal *client, gpointer user_data)
-{
- SchedulePage *spage = SCHEDULE_PAGE (page);
-
- sensitize_widgets (spage);
-}
-
-/* Set date/time */
-static void
-update_time (SchedulePage *spage, ECalComponentDateTime *start_date, ECalComponentDateTime *end_date)
-{
- SchedulePagePrivate *priv;
- struct icaltimetype start_tt, end_tt;
- icaltimezone *start_zone = NULL, *end_zone = NULL;
- gboolean all_day;
-
- priv = spage->priv;
-
- /* Note that if we are creating a new event, the timezones may not be
- on the server, so we try to get the builtin timezone with the TZID
- first. */
- start_zone = icaltimezone_get_builtin_timezone_from_tzid (start_date->tzid);
- if (!start_zone) {
- if (!e_cal_get_timezone (COMP_EDITOR_PAGE (spage)->client,
- start_date->tzid, &start_zone, NULL)) {
- /* FIXME: Handle error better. */
- g_warning ("Couldn't get timezone from server: %s",
- start_date->tzid ? start_date->tzid : "");
- }
- }
-
- end_zone = icaltimezone_get_builtin_timezone_from_tzid (end_date->tzid);
- if (!end_zone) {
- if (!e_cal_get_timezone (COMP_EDITOR_PAGE (spage)->client,
- end_date->tzid, &end_zone, NULL)) {
- /* FIXME: Handle error better. */
- g_warning ("Couldn't get timezone from server: %s",
- end_date->tzid ? end_date->tzid : "");
- }
- }
-
- start_tt = *start_date->value;
- if (!end_date->value && start_tt.is_date) {
- end_tt = start_tt;
- icaltime_adjust (&end_tt, 1, 0, 0, 0);
- } else {
- end_tt = *end_date->value;
- }
-
- /* If the end zone is not the same as the start zone, we convert it. */
- priv->zone = start_zone;
- if (start_zone != end_zone) {
- icaltimezone_convert_time (&end_tt, end_zone, start_zone);
- }
- e_meeting_store_set_zone (priv->model, priv->zone);
-
- all_day = (start_tt.is_date && end_tt.is_date) ? TRUE : FALSE;
-
- /* For All Day Events, if DTEND is after DTSTART, we subtract 1 day
- from it. */
- if (all_day) {
- if (icaltime_compare_date_only (end_tt, start_tt) > 0) {
- icaltime_adjust (&end_tt, -1, 0, 0, 0);
- }
- }
-
- e_meeting_time_selector_set_all_day (priv->sel, all_day);
-
- e_date_edit_set_date (E_DATE_EDIT (priv->sel->start_date_edit), start_tt.year,
- start_tt.month, start_tt.day);
- e_date_edit_set_time_of_day (E_DATE_EDIT (priv->sel->start_date_edit),
- start_tt.hour, start_tt.minute);
-
- e_date_edit_set_date (E_DATE_EDIT (priv->sel->end_date_edit), end_tt.year,
- end_tt.month, end_tt.day);
- e_date_edit_set_time_of_day (E_DATE_EDIT (priv->sel->end_date_edit),
- end_tt.hour, end_tt.minute);
-
-}
-
-
-/* Fills the widgets with default values */
-static void
-clear_widgets (SchedulePage *spage)
-{
- SchedulePagePrivate *priv;
-
- priv = spage->priv;
-}
-
-/* fill_widgets handler for the schedule page */
-static gboolean
-schedule_page_fill_widgets (CompEditorPage *page, ECalComponent *comp)
-{
- SchedulePage *spage;
- SchedulePagePrivate *priv;
- ECalComponentDateTime start_date, end_date;
- gboolean validated = TRUE;
-
- spage = SCHEDULE_PAGE (page);
- priv = spage->priv;
-
- priv->updating = TRUE;
-
- /* Clean the screen */
- clear_widgets (spage);
-
- /* Start and end times */
- e_cal_component_get_dtstart (comp, &start_date);
- e_cal_component_get_dtend (comp, &end_date);
- if (!start_date.value)
- validated = FALSE;
- else if (!end_date.value)
- validated = FALSE;
- else
- update_time (spage, &start_date, &end_date);
-
- e_cal_component_free_datetime (&start_date);
- e_cal_component_free_datetime (&end_date);
-
- priv->updating = FALSE;
-
- sensitize_widgets (spage);
-
- return validated;
-}
-
-/* fill_component handler for the schedule page */
-static gboolean
-schedule_page_fill_component (CompEditorPage *page, ECalComponent *comp)
-{
- SchedulePage *spage;
- SchedulePagePrivate *priv;
-
- spage = SCHEDULE_PAGE (page);
- priv = spage->priv;
-
- return TRUE;
-}
-
-static void
-schedule_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates)
-{
- SchedulePage *spage;
- SchedulePagePrivate *priv;
-
- spage = SCHEDULE_PAGE (page);
- priv = spage->priv;
-
- priv->updating = TRUE;
-
- update_time (spage, dates->start, dates->end);
-
- priv->updating = FALSE;
-}
-
-
-
-/* Gets the widgets from the XML file and returns if they are all available. */
-static gboolean
-get_widgets (SchedulePage *spage)
-{
- CompEditorPage *page = COMP_EDITOR_PAGE (spage);
- SchedulePagePrivate *priv;
- GSList *accel_groups;
- GtkWidget *toplevel;
-
- priv = spage->priv;
-
-#define GW(name) glade_xml_get_widget (priv->xml, name)
-
- priv->main = GW ("schedule-page");
- if (!priv->main)
- return FALSE;
-
- /* Get the GtkAccelGroup from the toplevel window, so we can install
- it when the notebook page is mapped. */
- toplevel = gtk_widget_get_toplevel (priv->main);
- accel_groups = gtk_accel_groups_from_object (G_OBJECT (toplevel));
- if (accel_groups) {
- page->accel_group = accel_groups->data;
- gtk_accel_group_ref (page->accel_group);
- }
-
- gtk_widget_ref (priv->main);
- gtk_container_remove (GTK_CONTAINER (priv->main->parent), priv->main);
-
-#undef GW
-
- return TRUE;
-}
-
-static gboolean
-init_widgets (SchedulePage *spage)
-{
- SchedulePagePrivate *priv;
-
- priv = spage->priv;
-
- g_signal_connect (priv->sel, "changed", G_CALLBACK (times_changed_cb), spage);
-
- return TRUE;
-}
-
-
-
-/**
- * schedule_page_construct:
- * @spage: An schedule page.
- *
- * Constructs an schedule page by loading its Glade data.
- *
- * Return value: The same object as @spage, or NULL if the widgets could not
- * be created.
- **/
-SchedulePage *
-schedule_page_construct (SchedulePage *spage, EMeetingStore *ems)
-{
- SchedulePagePrivate *priv;
-
- priv = spage->priv;
-
- priv->xml = glade_xml_new (EVOLUTION_GLADEDIR
- "/schedule-page.glade", NULL, NULL);
- if (!priv->xml) {
- g_message ("schedule_page_construct(): "
- "Could not load the Glade XML file!");
- return NULL;
- }
-
- if (!get_widgets (spage)) {
- g_message ("schedule_page_construct(): "
- "Could not find all widgets in the XML file!");
- return NULL;
- }
-
- /* Model */
- g_object_ref (ems);
- priv->model = ems;
-
- /* Selector */
- priv->sel = E_MEETING_TIME_SELECTOR (e_meeting_time_selector_new (ems));
- e_meeting_time_selector_set_working_hours (priv->sel,
- calendar_config_get_day_start_hour (),
- calendar_config_get_day_start_minute (),
- calendar_config_get_day_end_hour (),
- calendar_config_get_day_end_minute ());
- gtk_widget_show (GTK_WIDGET (priv->sel));
- gtk_box_pack_start (GTK_BOX (priv->main), GTK_WIDGET (priv->sel), TRUE, TRUE, 6);
-
- if (!init_widgets (spage)) {
- g_message ("schedule_page_construct(): "
- "Could not initialize the widgets!");
- return NULL;
- }
-
- g_signal_connect_after (G_OBJECT (spage), "client_changed",
- G_CALLBACK (client_changed_cb), NULL);
- return spage;
-}
-
-/**
- * schedule_page_new:
- *
- * Creates a new schedule page.
- *
- * Return value: A newly-created schedule page, or NULL if the page could
- * not be created.
- **/
-SchedulePage *
-schedule_page_new (EMeetingStore *ems)
-{
- SchedulePage *spage;
-
- spage = g_object_new (TYPE_SCHEDULE_PAGE, NULL);
- if (!schedule_page_construct (spage, ems)) {
- g_object_unref (spage);
- return NULL;
- }
-
- return spage;
-}
-
-static void
-times_changed_cb (GtkWidget *widget, gpointer data)
-{
- SchedulePage *spage = data;
- SchedulePagePrivate *priv;
- CompEditorPageDates dates;
- ECalComponentDateTime start_dt, end_dt;
- struct icaltimetype start_tt = icaltime_null_time ();
- struct icaltimetype end_tt = icaltime_null_time ();
-
- priv = spage->priv;
-
- if (priv->updating)
- return;
-
- e_date_edit_get_date (E_DATE_EDIT (priv->sel->start_date_edit),
- &start_tt.year,
- &start_tt.month,
- &start_tt.day);
- e_date_edit_get_time_of_day (E_DATE_EDIT (priv->sel->start_date_edit),
- &start_tt.hour,
- &start_tt.minute);
- e_date_edit_get_date (E_DATE_EDIT (priv->sel->end_date_edit),
- &end_tt.year,
- &end_tt.month,
- &end_tt.day);
- e_date_edit_get_time_of_day (E_DATE_EDIT (priv->sel->end_date_edit),
- &end_tt.hour,
- &end_tt.minute);
-
- start_dt.value = &start_tt;
- end_dt.value = &end_tt;
-
- if (e_date_edit_get_show_time (E_DATE_EDIT (priv->sel->start_date_edit))) {
- /* We set the start and end to the same timezone. */
- start_dt.tzid = icaltimezone_get_tzid (priv->zone);
- end_dt.tzid = start_dt.tzid;
- } else {
- /* For All-Day Events, we set the timezone to NULL, and add
- 1 day to DTEND. */
- start_dt.value->is_date = TRUE;
- start_dt.tzid = NULL;
- end_dt.value->is_date = TRUE;
- icaltime_adjust (&end_tt, 1, 0, 0, 0);
- end_dt.tzid = NULL;
- }
-
- dates.start = &start_dt;
- dates.end = &end_dt;
- dates.due = NULL;
- dates.complete = NULL;
-
- comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (spage), &dates);
- comp_editor_page_notify_changed (COMP_EDITOR_PAGE (spage));
-}
diff --git a/calendar/gui/dialogs/schedule-page.glade b/calendar/gui/dialogs/schedule-page.glade
deleted file mode 100644
index 2ef8a1d9f5..0000000000
--- a/calendar/gui/dialogs/schedule-page.glade
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkWindow" id="schedule-toplevel">
- <property name="title" translatable="yes">window1</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
-
- <child>
- <widget class="GtkVBox" id="schedule-page">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/calendar/gui/dialogs/schedule-page.h b/calendar/gui/dialogs/schedule-page.h
deleted file mode 100644
index d4c7eafbdd..0000000000
--- a/calendar/gui/dialogs/schedule-page.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Evolution calendar - Scheduling page
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef SCHEDULE_PAGE_H
-#define SCHEDULE_PAGE_H
-
-#include "../e-meeting-store.h"
-#include "comp-editor-page.h"
-
-G_BEGIN_DECLS
-
-
-
-#define TYPE_SCHEDULE_PAGE (schedule_page_get_type ())
-#define SCHEDULE_PAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SCHEDULE_PAGE, SchedulePage))
-#define SCHEDULE_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SCHEDULE_PAGE, SchedulePageClass))
-#define IS_SCHEDULE_PAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SCHEDULE_PAGE))
-#define IS_SCHEDULE_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TYPE_SCHEDULE_PAGE))
-
-typedef struct _SchedulePagePrivate SchedulePagePrivate;
-
-typedef struct {
- CompEditorPage page;
-
- /* Private data */
- SchedulePagePrivate *priv;
-} SchedulePage;
-
-typedef struct {
- CompEditorPageClass parent_class;
-} SchedulePageClass;
-
-
-GtkType schedule_page_get_type (void);
-SchedulePage *schedule_page_construct (SchedulePage *mpage, EMeetingStore *ems);
-SchedulePage *schedule_page_new (EMeetingStore *ems);
-
-
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/dialogs/select-source-dialog.c b/calendar/gui/dialogs/select-source-dialog.c
deleted file mode 100644
index 408cb73b29..0000000000
--- a/calendar/gui/dialogs/select-source-dialog.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Evolution calendar - Select source dialog
- *
- * Copyright (C) 2004 Novell, Inc.
- *
- * Author: Rodrigo Moya <rodrigo@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <bonobo/bonobo-i18n.h>
-#include <gtk/gtkstock.h>
-#include <e-util/e-icon-factory.h>
-#include <libedataserverui/e-source-selector-dialog.h>
-#include "select-source-dialog.h"
-
-/**
- * select_source_dialog
- *
- * Implements dialog for allowing user to select a destination source.
- */
-ESource *
-select_source_dialog (GtkWindow *parent, ECalSourceType obj_type)
-{
- GtkWidget *dialog;
- ESourceList *source_list;
- ESource *selected_source = NULL;
- const char *gconf_key;
- GConfClient *conf_client;
- GList *icon_list = NULL;
-
- if (obj_type == E_CAL_SOURCE_TYPE_EVENT)
- gconf_key = "/apps/evolution/calendar/sources";
- else if (obj_type == E_CAL_SOURCE_TYPE_TODO)
- gconf_key = "/apps/evolution/tasks/sources";
- else
- return NULL;
-
- conf_client = gconf_client_get_default ();
- source_list = e_source_list_new_for_gconf (conf_client, gconf_key);
-
- /* create the dialog */
- dialog = e_source_selector_dialog_new (parent, source_list);
-
- if (obj_type == E_CAL_SOURCE_TYPE_EVENT)
- icon_list = e_icon_factory_get_icon_list ("stock_calendar");
- else if (obj_type == E_CAL_SOURCE_TYPE_TODO)
- icon_list = e_icon_factory_get_icon_list ("stock_todo");
-
- if (icon_list) {
- gtk_window_set_icon_list (GTK_WINDOW (dialog), icon_list);
- g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
- g_list_free (icon_list);
- }
-
- if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) {
- selected_source = e_source_selector_dialog_peek_primary_selection (E_SOURCE_SELECTOR_DIALOG (dialog));
- if (selected_source) {
- char *absolute_uri;
-
- /* set the absolute URI on the source we keep around, since the group
- will be unrefed */
- absolute_uri = e_source_build_absolute_uri (selected_source);
- e_source_set_absolute_uri (selected_source, (const char *) absolute_uri);
-
- g_object_ref (selected_source);
- g_free (absolute_uri);
- }
- } else
- selected_source = NULL;
-
- g_object_unref (conf_client);
- g_object_unref (source_list);
- gtk_widget_destroy (dialog);
-
- return selected_source;
-}
diff --git a/calendar/gui/dialogs/select-source-dialog.h b/calendar/gui/dialogs/select-source-dialog.h
deleted file mode 100644
index d0656395bb..0000000000
--- a/calendar/gui/dialogs/select-source-dialog.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Evolution calendar - Select source dialog
- *
- * Copyright (C) 2004 Novell, Inc.
- *
- * Author: Rodrigo Moya <rodrigo@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef SELECT_SOURCE_DIALOG_H
-#define SELECT_SOURCE_DIALOG_H
-
-#include <gtk/gtkwindow.h>
-#include <libedataserver/e-source.h>
-#include <libecal/e-cal.h>
-
-ESource *select_source_dialog (GtkWindow *parent, ECalSourceType type);
-
-#endif
diff --git a/calendar/gui/dialogs/send-comp.c b/calendar/gui/dialogs/send-comp.c
deleted file mode 100644
index bc5ce3a35e..0000000000
--- a/calendar/gui/dialogs/send-comp.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/* Evolution calendar - Send calendar component dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkmessagedialog.h>
-#include "widgets/misc/e-error.h"
-#include "send-comp.h"
-
-
-
-/**
- * send_component_dialog:
- *
- * Pops up a dialog box asking the user whether he wants to send a
- * iTip/iMip message
- *
- * Return value: TRUE if the user clicked Yes, FALSE otherwise.
- **/
-gboolean
-send_component_dialog (GtkWindow *parent, ECal *client, ECalComponent *comp, gboolean new)
-{
- ECalComponentVType vtype;
- const char *id;
-
- if (e_cal_get_save_schedules (client))
- return FALSE;
-
- vtype = e_cal_component_get_vtype (comp);
-
- switch (vtype) {
- case E_CAL_COMPONENT_EVENT:
- if (new)
- id = "calendar:prompt-meeting-invite";
- else
- id = "calendar:prompt-send-updated-meeting-info";
- break;
-
- case E_CAL_COMPONENT_TODO:
- if (new)
- id = "calendar:prompt-send-task";
- else
- id = "calendar:prompt-send-updated-task-info";
- break;
-
- default:
- g_message ("send_component_dialog(): "
- "Cannot handle object of type %d", vtype);
- return FALSE;
- }
-
- if (e_error_run (parent, id, NULL) == GTK_RESPONSE_YES)
- return TRUE;
- else
- return FALSE;
-}
-
-gboolean
-send_component_prompt_subject (GtkWindow *parent, ECal *client, ECalComponent *comp)
-{
- ECalComponentVType vtype;
- const char *id;
-
- vtype = e_cal_component_get_vtype (comp);
-
- switch (vtype) {
- case E_CAL_COMPONENT_EVENT:
- id = "calendar:prompt-send-no-subject-calendar";
- break;
-
- case E_CAL_COMPONENT_TODO:
- id = "calendar:prompt-send-no-subject-task";
- break;
-
- default:
- g_message ("send_component_prompt_subject(): "
- "Cannot handle object of type %d", vtype);
- return FALSE;
- }
-
- if (e_error_run (parent, id, NULL) == GTK_RESPONSE_YES)
- return TRUE;
- else
- return FALSE;
-}
-
-
diff --git a/calendar/gui/dialogs/send-comp.h b/calendar/gui/dialogs/send-comp.h
deleted file mode 100644
index 7e007f9edb..0000000000
--- a/calendar/gui/dialogs/send-comp.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Evolution calendar - Send calendar component dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Author: JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef SEND_COMP_H
-#define SEND_COMP_H
-
-#include <glib.h>
-#include <gtk/gtkwindow.h>
-#include <libecal/e-cal.h>
-#include <libecal/e-cal-component.h>
-
-gboolean send_component_dialog (GtkWindow *parent, ECal *client, ECalComponent *comp, gboolean new);
-gboolean send_component_prompt_subject (GtkWindow *parent, ECal *client, ECalComponent *comp);
-
-#endif
diff --git a/calendar/gui/dialogs/task-details-page.c b/calendar/gui/dialogs/task-details-page.c
deleted file mode 100644
index c030c97f31..0000000000
--- a/calendar/gui/dialogs/task-details-page.c
+++ /dev/null
@@ -1,830 +0,0 @@
-/* Evolution calendar - task details page
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- * Miguel de Icaza <miguel@ximian.com>
- * Seth Alves <alves@hungry.com>
- * JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtksignal.h>
-#include <gtk/gtktogglebutton.h>
-#include <libgnome/gnome-i18n.h>
-#include <glade/glade.h>
-#include <widgets/misc/e-dateedit.h>
-#include <widgets/misc/e-url-entry.h>
-#include "e-util/e-dialog-widgets.h"
-#include "../calendar-config.h"
-#include "../e-timezone-entry.h"
-#include "comp-editor-util.h"
-#include "task-details-page.h"
-
-
-
-/* Private part of the TaskDetailsPage structure */
-struct _TaskDetailsPagePrivate {
- /* Glade XML data */
- GladeXML *xml;
-
- /* Widgets from the Glade file */
- GtkWidget *main;
-
- GtkWidget *status;
- GtkWidget *priority;
- GtkWidget *percent_complete;
-
- GtkWidget *date_completed_label;
- GtkWidget *completed_date;
-
- GtkWidget *url_label;
- GtkWidget *url_entry;
- GtkWidget *url;
-
- gboolean updating;
-};
-
-/* Note that these two arrays must match. */
-static const int status_map[] = {
- ICAL_STATUS_NONE,
- ICAL_STATUS_INPROCESS,
- ICAL_STATUS_COMPLETED,
- ICAL_STATUS_CANCELLED,
- -1
-};
-
-typedef enum {
- PRIORITY_HIGH,
- PRIORITY_NORMAL,
- PRIORITY_LOW,
- PRIORITY_UNDEFINED,
-} TaskEditorPriority;
-
-static const int priority_map[] = {
- PRIORITY_HIGH,
- PRIORITY_NORMAL,
- PRIORITY_LOW,
- PRIORITY_UNDEFINED,
- -1
-};
-
-
-
-static void task_details_page_finalize (GObject *object);
-
-static GtkWidget *task_details_page_get_widget (CompEditorPage *page);
-static void task_details_page_focus_main_widget (CompEditorPage *page);
-static gboolean task_details_page_fill_widgets (CompEditorPage *page, ECalComponent *comp);
-static gboolean task_details_page_fill_component (CompEditorPage *page, ECalComponent *comp);
-static gboolean task_details_page_fill_timezones (CompEditorPage *page, GHashTable *timezones);
-
-G_DEFINE_TYPE (TaskDetailsPage, task_details_page, TYPE_COMP_EDITOR_PAGE);
-
-/* Class initialization function for the task page */
-static void
-task_details_page_class_init (TaskDetailsPageClass *class)
-{
- CompEditorPageClass *editor_page_class;
- GObjectClass *object_class;
-
- editor_page_class = (CompEditorPageClass *) class;
- object_class = (GObjectClass *) class;
-
- editor_page_class->get_widget = task_details_page_get_widget;
- editor_page_class->focus_main_widget = task_details_page_focus_main_widget;
- editor_page_class->fill_widgets = task_details_page_fill_widgets;
- editor_page_class->fill_component = task_details_page_fill_component;
- editor_page_class->fill_timezones = task_details_page_fill_timezones;
-
- object_class->finalize = task_details_page_finalize;
-}
-
-/* Object initialization function for the task page */
-static void
-task_details_page_init (TaskDetailsPage *tdpage)
-{
- TaskDetailsPagePrivate *priv;
-
- priv = g_new0 (TaskDetailsPagePrivate, 1);
- tdpage->priv = priv;
-
- priv->xml = NULL;
-
- priv->main = NULL;
-
- priv->status = NULL;
- priv->priority = NULL;
- priv->percent_complete = NULL;
-
- priv->date_completed_label = NULL;
- priv->completed_date = NULL;
-
- priv->url_label = NULL;
- priv->url_entry = NULL;
- priv->url = NULL;
-
- priv->updating = FALSE;
-}
-
-/* Destroy handler for the task page */
-static void
-task_details_page_finalize (GObject *object)
-{
- TaskDetailsPage *tdpage;
- TaskDetailsPagePrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_TASK_DETAILS_PAGE (object));
-
- tdpage = TASK_DETAILS_PAGE (object);
- priv = tdpage->priv;
-
- if (priv->main)
- gtk_widget_unref (priv->main);
-
- if (priv->xml) {
- g_object_unref (priv->xml);
- priv->xml = NULL;
- }
-
- g_free (priv);
- tdpage->priv = NULL;
-
- if (G_OBJECT_CLASS (task_details_page_parent_class)->finalize)
- (* G_OBJECT_CLASS (task_details_page_parent_class)->finalize) (object);
-}
-
-
-
-/* get_widget handler for the task page */
-static GtkWidget *
-task_details_page_get_widget (CompEditorPage *page)
-{
- TaskDetailsPage *tdpage;
- TaskDetailsPagePrivate *priv;
-
- tdpage = TASK_DETAILS_PAGE (page);
- priv = tdpage->priv;
-
- return priv->main;
-}
-
-/* focus_main_widget handler for the task page */
-static void
-task_details_page_focus_main_widget (CompEditorPage *page)
-{
- TaskDetailsPage *tdpage;
- TaskDetailsPagePrivate *priv;
-
- tdpage = TASK_DETAILS_PAGE (page);
- priv = tdpage->priv;
-
- gtk_widget_grab_focus (priv->status);
-}
-
-
-static TaskEditorPriority
-priority_value_to_index (int priority_value)
-{
- TaskEditorPriority retval;
-
- if (priority_value == 0)
- retval = PRIORITY_UNDEFINED;
- else if (priority_value <= 4)
- retval = PRIORITY_HIGH;
- else if (priority_value == 5)
- retval = PRIORITY_NORMAL;
- else
- retval = PRIORITY_LOW;
-
- return retval;
-}
-
-static int
-priority_index_to_value (TaskEditorPriority priority)
-{
- int retval;
-
- switch (priority) {
- case PRIORITY_UNDEFINED:
- retval = 0;
- break;
- case PRIORITY_HIGH:
- retval = 3;
- break;
- case PRIORITY_NORMAL:
- retval = 5;
- break;
- case PRIORITY_LOW:
- retval = 7;
- break;
- default:
- retval = -1;
- g_assert_not_reached ();
- break;
- }
-
- return retval;
-}
-
-/* Fills the widgets with default values */
-static void
-clear_widgets (TaskDetailsPage *tdpage)
-{
- TaskDetailsPagePrivate *priv;
-
- priv = tdpage->priv;
-
- /* Date completed */
- e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), -1);
-
- /* URL */
- e_dialog_editable_set (priv->url, NULL);
-}
-
-static void
-sensitize_widgets (TaskDetailsPage *tdpage)
-{
- gboolean read_only;
- TaskDetailsPagePrivate *priv;
-
- priv = tdpage->priv;
-
- if (!e_cal_is_read_only (COMP_EDITOR_PAGE (tdpage)->client, &read_only, NULL))
- read_only = TRUE;
-
- gtk_widget_set_sensitive (priv->status, !read_only);
- gtk_widget_set_sensitive (priv->priority, !read_only);
- gtk_widget_set_sensitive (priv->percent_complete, !read_only);
- gtk_widget_set_sensitive (priv->completed_date, !read_only);
- gtk_widget_set_sensitive (priv->url_label, !read_only);
- gtk_entry_set_editable (GTK_ENTRY (e_url_entry_get_entry (E_URL_ENTRY (priv->url_entry))), !read_only);
-}
-
-/* fill_widgets handler for the task page */
-static gboolean
-task_details_page_fill_widgets (CompEditorPage *page, ECalComponent *comp)
-{
- TaskDetailsPage *tdpage;
- TaskDetailsPagePrivate *priv;
- int *priority_value, *percent = NULL;
- TaskEditorPriority priority;
- icalproperty_status status;
- const char *url;
- struct icaltimetype *completed = NULL;
-
- tdpage = TASK_DETAILS_PAGE (page);
- priv = tdpage->priv;
-
- priv->updating = TRUE;
-
- /* Clean the screen */
- clear_widgets (tdpage);
-
- /* Percent Complete. */
- e_cal_component_get_percent (comp, &percent);
- if (percent) {
- e_dialog_spin_set (priv->percent_complete, *percent);
- } else {
- /* FIXME: Could check if task is completed and set 100%. */
- e_dialog_spin_set (priv->percent_complete, 0);
- }
-
- /* Status. */
- e_cal_component_get_status (comp, &status);
- if (status == ICAL_STATUS_NONE || status == ICAL_STATUS_NEEDSACTION) {
- /* Try to use the percent value. */
- if (percent) {
- if (*percent == 100)
- status = ICAL_STATUS_COMPLETED;
- else if (*percent > 0)
- status = ICAL_STATUS_INPROCESS;
- else
- status = ICAL_STATUS_NONE;
- } else
- status = ICAL_STATUS_NONE;
- }
- e_dialog_option_menu_set (priv->status, status, status_map);
-
- if (percent)
- e_cal_component_free_percent (percent);
-
- /* Completed Date. */
- e_cal_component_get_completed (comp, &completed);
- if (completed) {
- icaltimezone *utc_zone, *zone;
-
- /* Completed is in UTC, but that would confuse the user, so
- we convert it to local time. */
- utc_zone = icaltimezone_get_utc_timezone ();
- zone = calendar_config_get_icaltimezone ();
-
- icaltimezone_convert_time (completed, utc_zone, zone);
-
- e_date_edit_set_date (E_DATE_EDIT (priv->completed_date),
- completed->year, completed->month,
- completed->day);
- e_date_edit_set_time_of_day (E_DATE_EDIT (priv->completed_date),
- completed->hour,
- completed->minute);
-
- e_cal_component_free_icaltimetype (completed);
- }
-
- /* Priority. */
- e_cal_component_get_priority (comp, &priority_value);
- if (priority_value) {
- priority = priority_value_to_index (*priority_value);
- e_cal_component_free_priority (priority_value);
- } else {
- priority = PRIORITY_UNDEFINED;
- }
- e_dialog_option_menu_set (priv->priority, priority, priority_map);
-
- /* URL */
- e_cal_component_get_url (comp, &url);
- e_dialog_editable_set (priv->url, url);
-
- priv->updating = FALSE;
-
- sensitize_widgets (tdpage);
-
- return TRUE;
-}
-
-/* fill_component handler for the task page */
-static gboolean
-task_details_page_fill_component (CompEditorPage *page, ECalComponent *comp)
-{
- TaskDetailsPage *tdpage;
- TaskDetailsPagePrivate *priv;
- struct icaltimetype icalcomplete, icaltoday;
- icalproperty_status status;
- TaskEditorPriority priority;
- int priority_value, percent;
- char *url;
- gboolean date_set;
- icaltimezone *zone = calendar_config_get_icaltimezone ();
-
- tdpage = TASK_DETAILS_PAGE (page);
- priv = tdpage->priv;
-
- /* Percent Complete. */
- percent = e_dialog_spin_get_int (priv->percent_complete);
- e_cal_component_set_percent (comp, &percent);
-
- /* Status. */
- status = e_dialog_option_menu_get (priv->status, status_map);
- e_cal_component_set_status (comp, status);
-
- /* Priority. */
- priority = e_dialog_option_menu_get (priv->priority, priority_map);
- priority_value = priority_index_to_value (priority);
- e_cal_component_set_priority (comp, &priority_value);
-
- icalcomplete = icaltime_null_time ();
-
- /* COMPLETED must be in UTC. */
- icalcomplete.is_utc = 1;
-
- /* Completed Date. */
- if (!e_date_edit_date_is_valid (E_DATE_EDIT (priv->completed_date)) ||
- !e_date_edit_time_is_valid (E_DATE_EDIT (priv->completed_date))) {
- comp_editor_page_display_validation_error (page, _("Completed date is wrong"), priv->completed_date);
- return FALSE;
- }
-
- date_set = e_date_edit_get_date (E_DATE_EDIT (priv->completed_date),
- &icalcomplete.year,
- &icalcomplete.month,
- &icalcomplete.day);
-
- e_date_edit_get_time_of_day (E_DATE_EDIT (priv->completed_date),
- &icalcomplete.hour,
- &icalcomplete.minute);
-
- /* COMPLETED today or before */
- icaltoday = icaltime_current_time_with_zone (zone);
- icaltimezone_convert_time (&icaltoday, zone,
- icaltimezone_get_utc_timezone());
-
- if (icaltime_compare_date_only (icalcomplete, icaltoday) > 0) {
- comp_editor_page_display_validation_error (page, _("Completed date is wrong"), priv->completed_date);
- return FALSE;
- }
-
- if (date_set) {
- /* COMPLETED must be in UTC, so we assume that the date in the
- dialog is in the current timezone, and we now convert it
- to UTC. FIXME: We should really use one timezone for the
- entire time the dialog is shown. Otherwise if the user
- changes the timezone, the COMPLETED date may get changed
- as well. */
- icaltimezone_convert_time (&icalcomplete, zone,
- icaltimezone_get_utc_timezone ());
- e_cal_component_set_completed (comp, &icalcomplete);
- } else {
- e_cal_component_set_completed (comp, NULL);
- }
-
- /* URL. */
- url = e_dialog_editable_get (priv->url);
- e_cal_component_set_url (comp, url);
- if (url)
- g_free (url);
-
- return TRUE;
-}
-
-/* fill_timezones handler for the event page */
-static gboolean
-task_details_page_fill_timezones (CompEditorPage *page, GHashTable *timezones)
-{
- TaskDetailsPage *tdpage;
- TaskDetailsPagePrivate *priv;
- icaltimezone *zone;
-
- tdpage = TASK_DETAILS_PAGE (page);
- priv = tdpage->priv;
-
- /* add UTC timezone, which is the one used for the DATE-COMPLETED property */
- zone = icaltimezone_get_utc_timezone ();
- if (zone) {
- if (!g_hash_table_lookup (timezones, icaltimezone_get_tzid (zone)))
- g_hash_table_insert (timezones, icaltimezone_get_tzid (zone), zone);
- }
-
- return TRUE;
-}
-
-
-
-/* Gets the widgets from the XML file and returns if they are all available. */
-static gboolean
-get_widgets (TaskDetailsPage *tdpage)
-{
- CompEditorPage *page = COMP_EDITOR_PAGE (tdpage);
- TaskDetailsPagePrivate *priv;
- GSList *accel_groups;
- GtkWidget *toplevel;
-
- priv = tdpage->priv;
-
-#define GW(name) glade_xml_get_widget (priv->xml, name)
-
- priv->main = GW ("task-details-page");
- if (!priv->main)
- return FALSE;
-
- /* Get the GtkAccelGroup from the toplevel window, so we can install
- it when the notebook page is mapped. */
- toplevel = gtk_widget_get_toplevel (priv->main);
- accel_groups = gtk_accel_groups_from_object (G_OBJECT (toplevel));
- if (accel_groups) {
- page->accel_group = accel_groups->data;
- gtk_accel_group_ref (page->accel_group);
- }
-
- gtk_widget_ref (priv->main);
- gtk_container_remove (GTK_CONTAINER (priv->main->parent), priv->main);
-
- priv->status = GW ("status");
- priv->priority = GW ("priority");
- priv->percent_complete = GW ("percent-complete");
-
- priv->date_completed_label = GW ("date_completed_label");
-
- priv->completed_date = GW ("completed-date");
- gtk_widget_show (priv->completed_date);
-
- priv->url_label = GW ("url_label");
-
- priv->url_entry = GW ("url_entry");
- gtk_widget_show (priv->url_entry);
- priv->url = e_url_entry_get_entry (E_URL_ENTRY (priv->url_entry));
- atk_object_set_name (gtk_widget_get_accessible (priv->url), _("Web Page"));
-
-#undef GW
-
- return (priv->status
- && priv->priority
- && priv->percent_complete
- && priv->date_completed_label
- && priv->completed_date
- && priv->url_label
- && priv->url);
-}
-
-
-static void
-complete_date_changed (TaskDetailsPage *tdpage, time_t ctime, gboolean complete)
-{
- TaskDetailsPagePrivate *priv;
- CompEditorPageDates dates = {NULL, NULL, NULL, NULL};
- icaltimezone *zone;
- struct icaltimetype completed_tt = icaltime_null_time();
-
- priv = tdpage->priv;
-
- /* Get the current time in UTC. */
- zone = icaltimezone_get_utc_timezone ();
- completed_tt = icaltime_from_timet_with_zone (ctime, FALSE, zone);
- completed_tt.is_utc = TRUE;
-
- dates.start = NULL;
- dates.end = NULL;
- dates.due = NULL;
- if (complete)
- dates.complete = &completed_tt;
-
- /* Notify upstream */
- comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (tdpage),
- &dates);
-}
-
-static void
-date_changed_cb (EDateEdit *dedit, gpointer data)
-{
- TaskDetailsPage *tdpage;
- TaskDetailsPagePrivate *priv;
- CompEditorPageDates dates = {NULL, NULL, NULL, NULL};
- struct icaltimetype completed_tt = icaltime_null_time ();
- icalproperty_status status;
- gboolean date_set;
-
- tdpage = TASK_DETAILS_PAGE (data);
- priv = tdpage->priv;
-
- if (priv->updating)
- return;
-
- priv->updating = TRUE;
-
- date_set = e_date_edit_get_date (E_DATE_EDIT (priv->completed_date),
- &completed_tt.year,
- &completed_tt.month,
- &completed_tt.day);
- e_date_edit_get_time_of_day (E_DATE_EDIT (priv->completed_date),
- &completed_tt.hour,
- &completed_tt.minute);
-
- status = e_dialog_option_menu_get (priv->status, status_map);
-
- if (!date_set) {
- completed_tt = icaltime_null_time ();
- if (status == ICAL_STATUS_COMPLETED) {
- e_dialog_option_menu_set (priv->status,
- ICAL_STATUS_NONE,
- status_map);
- e_dialog_spin_set (priv->percent_complete, 0);
- }
- } else {
- if (status != ICAL_STATUS_COMPLETED) {
- e_dialog_option_menu_set (priv->status,
- ICAL_STATUS_COMPLETED,
- status_map);
- }
- e_dialog_spin_set (priv->percent_complete, 100);
- }
-
- priv->updating = FALSE;
-
- /* Notify upstream */
- dates.complete = &completed_tt;
- comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (tdpage), &dates);
-}
-
-static void
-status_changed (GtkMenu *menu, TaskDetailsPage *tdpage)
-{
- TaskDetailsPagePrivate *priv;
- icalproperty_status status;
- time_t ctime = -1;
-
- priv = tdpage->priv;
-
- if (priv->updating)
- return;
-
- priv->updating = TRUE;
-
- status = e_dialog_option_menu_get (priv->status, status_map);
- if (status == ICAL_STATUS_NONE) {
- e_dialog_spin_set (priv->percent_complete, 0);
- e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), ctime);
- complete_date_changed (tdpage, 0, FALSE);
- } else if (status == ICAL_STATUS_INPROCESS) {
- gint percent_complete = e_dialog_spin_get_int (priv->percent_complete);
- if (percent_complete <= 0 || percent_complete >= 100)
- e_dialog_spin_set (priv->percent_complete, 50);
-
- e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), ctime);
- complete_date_changed (tdpage, 0, FALSE);
- } else if (status == ICAL_STATUS_COMPLETED) {
- e_dialog_spin_set (priv->percent_complete, 100);
- ctime = time (NULL);
- e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), ctime);
- complete_date_changed (tdpage, ctime, TRUE);
- }
-
- priv->updating = FALSE;
-
- comp_editor_page_notify_changed (COMP_EDITOR_PAGE (tdpage));
-}
-
-static void
-percent_complete_changed (GtkAdjustment *adj, TaskDetailsPage *tdpage)
-{
- TaskDetailsPagePrivate *priv;
- gint percent;
- icalproperty_status status;
- gboolean complete;
- time_t ctime = -1;
-
- priv = tdpage->priv;
-
- if (priv->updating)
- return;
-
- priv->updating = TRUE;
-
- percent = e_dialog_spin_get_int (priv->percent_complete);
- if (percent == 100) {
- complete = TRUE;
- ctime = time (NULL);
- status = ICAL_STATUS_COMPLETED;
- } else {
- complete = FALSE;
-
- if (percent == 0)
- status = ICAL_STATUS_NONE;
- else
- status = ICAL_STATUS_INPROCESS;
- }
-
- e_dialog_option_menu_set (priv->status, status, status_map);
- e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), ctime);
- complete_date_changed (tdpage, ctime, complete);
-
- priv->updating = FALSE;
-
- comp_editor_page_notify_changed (COMP_EDITOR_PAGE (tdpage));
-}
-
-/* This is called when any field is changed; it notifies upstream. */
-static void
-field_changed_cb (GtkWidget *widget, gpointer data)
-{
- TaskDetailsPage *tdpage;
- TaskDetailsPagePrivate *priv;
-
- tdpage = TASK_DETAILS_PAGE (data);
- priv = tdpage->priv;
-
- if (!priv->updating)
- comp_editor_page_notify_changed (COMP_EDITOR_PAGE (tdpage));
-}
-
-/* Hooks the widget signals */
-static void
-init_widgets (TaskDetailsPage *tdpage)
-{
- TaskDetailsPagePrivate *priv;
-
- priv = tdpage->priv;
-
- /* Make sure the EDateEdit widgets use our timezones to get the
- current time. */
- e_date_edit_set_get_time_callback (E_DATE_EDIT (priv->completed_date),
- (EDateEditGetTimeCallback) comp_editor_get_current_time,
- tdpage, NULL);
-
- /* These are created by hand, so hook the mnemonics manually */
- gtk_label_set_mnemonic_widget (GTK_LABEL (priv->date_completed_label), priv->completed_date);
- gtk_label_set_mnemonic_widget (GTK_LABEL (priv->url_label), priv->url_entry);
-
- /* Connect signals. The Status, Percent Complete & Date Completed
- properties are closely related so whenever one changes we may need
- to update the other 2. */
- g_signal_connect((GTK_OPTION_MENU (priv->status)->menu),
- "deactivate",
- G_CALLBACK (status_changed), tdpage);
-
- g_signal_connect((GTK_SPIN_BUTTON (priv->percent_complete)->adjustment),
- "value_changed",
- G_CALLBACK (percent_complete_changed), tdpage);
-
- /* Priority */
- g_signal_connect((GTK_OPTION_MENU (priv->priority)->menu),
- "deactivate",
- G_CALLBACK (field_changed_cb), tdpage);
-
- /* Completed Date */
- g_signal_connect((priv->completed_date), "changed",
- G_CALLBACK (date_changed_cb), tdpage);
- g_signal_connect (priv->completed_date, "changed",
- G_CALLBACK (field_changed_cb), tdpage);
-
- /* URL */
- g_signal_connect((priv->url), "changed",
- G_CALLBACK (field_changed_cb), tdpage);
-}
-
-static void
-client_changed_cb (CompEditorPage *page, ECal *client, gpointer user_data)
-{
- TaskDetailsPage *tdpage = TASK_DETAILS_PAGE (page);
-
- sensitize_widgets (tdpage);
-}
-
-/**
- * task_details_page_construct:
- * @tdpage: An task details page.
- *
- * Constructs an task page by loading its Glade data.
- *
- * Return value: The same object as @tdpage, or NULL if the widgets could not
- * be created.
- **/
-TaskDetailsPage *
-task_details_page_construct (TaskDetailsPage *tdpage)
-{
- TaskDetailsPagePrivate *priv;
-
- priv = tdpage->priv;
-
- priv->xml = glade_xml_new (EVOLUTION_GLADEDIR
- "/task-details-page.glade", NULL, NULL);
- if (!priv->xml) {
- g_message ("task_details_page_construct(): "
- "Could not load the Glade XML file!");
- return NULL;
- }
-
- if (!get_widgets (tdpage)) {
- g_message ("task_details_page_construct(): "
- "Could not find all widgets in the XML file!");
- return NULL;
- }
-
- init_widgets (tdpage);
-
- g_signal_connect_after (G_OBJECT (tdpage), "client_changed",
- G_CALLBACK (client_changed_cb), NULL);
-
- return tdpage;
-}
-
-/**
- * task_details_page_new:
- *
- * Creates a new task details page.
- *
- * Return value: A newly-created task details page, or NULL if the page could
- * not be created.
- **/
-TaskDetailsPage *
-task_details_page_new (void)
-{
- TaskDetailsPage *tdpage;
-
- tdpage = g_object_new (TYPE_TASK_DETAILS_PAGE, NULL);
- if (!task_details_page_construct (tdpage)) {
- g_object_unref (tdpage);
- return NULL;
- }
-
- return tdpage;
-}
-
-GtkWidget *task_details_page_create_date_edit (void);
-
-GtkWidget *
-task_details_page_create_date_edit (void)
-{
- GtkWidget *dedit;
-
- dedit = comp_editor_new_date_edit (TRUE, TRUE, FALSE);
- e_date_edit_set_allow_no_date_set (E_DATE_EDIT (dedit), TRUE);
-
- return dedit;
-}
-
diff --git a/calendar/gui/dialogs/task-details-page.glade b/calendar/gui/dialogs/task-details-page.glade
deleted file mode 100644
index 7078f74d92..0000000000
--- a/calendar/gui/dialogs/task-details-page.glade
+++ /dev/null
@@ -1,463 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkWindow" id="task-details-toplevel">
- <property name="title" translatable="yes">window1</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-
- <child>
- <widget class="GtkVBox" id="task-details-page">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label20">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;span weight=&quot;bold&quot;&gt;Status&lt;/span&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox2">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="label21">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">12</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table3">
- <property name="visible">True</property>
- <property name="n_rows">4</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label17">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Status:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">status</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label19">
- <property name="visible">True</property>
- <property name="label" translatable="yes">P_ercent complete:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">percent-complete</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label18">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Priority:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">priority</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="date_completed_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Date completed:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="priority">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget7">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget8">
- <property name="visible">True</property>
- <property name="label" translatable="yes">High</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget9">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Normal</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget10">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Low</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget11">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Undefined</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="status">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget1">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Not Started</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">In Progress</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget5">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Completed</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget6">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Cancelled</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="percent-complete">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">0 0 100 1 10 10</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="completed-date">
- <property name="visible">True</property>
- <property name="creation_function">task_details_page_create_date_edit</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Fri, 01 Jun 2001 18:58:51 GMT</property>
- <accessibility>
- <atkrelation target="date_completed_label" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label22">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;span weight=&quot;bold&quot;&gt;Miscellaneous&lt;/span&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox3">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="label23">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">12</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table2">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="n_rows">1</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="url_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Web Page:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="url_entry">
- <property name="visible">True</property>
- <property name="creation_function">e_url_entry_new</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Fri, 08 Feb 2002 21:02:37 GMT</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/calendar/gui/dialogs/task-details-page.h b/calendar/gui/dialogs/task-details-page.h
deleted file mode 100644
index 98b6832bbf..0000000000
--- a/calendar/gui/dialogs/task-details-page.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Evolution calendar - Main page of the task editor dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- * Miguel de Icaza <miguel@ximian.com>
- * Seth Alves <alves@hungry.com>
- * JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef TASK_DETAILS_PAGE_H
-#define TASK_DETAILS_PAGE_H
-
-#include "comp-editor-page.h"
-
-G_BEGIN_DECLS
-
-
-
-#define TYPE_TASK_DETAILS_PAGE (task_details_page_get_type ())
-#define TASK_DETAILS_PAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_TASK_DETAILS_PAGE, TaskDetailsPage))
-#define TASK_DETAILS_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_TASK_DETAILS_PAGE, TaskDetailsPageClass))
-#define IS_TASK_DETAILS_PAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_TASK_DETAILS_PAGE))
-#define IS_TASK_DETAILS_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TYPE_TASK_DETAILS_PAGE))
-
-typedef struct _TaskDetailsPagePrivate TaskDetailsPagePrivate;
-
-typedef struct {
- CompEditorPage page;
-
- /* Private data */
- TaskDetailsPagePrivate *priv;
-} TaskDetailsPage;
-
-typedef struct {
- CompEditorPageClass parent_class;
-} TaskDetailsPageClass;
-
-
-GtkType task_details_page_get_type (void);
-TaskDetailsPage *task_details_page_construct (TaskDetailsPage *tdpage);
-TaskDetailsPage *task_details_page_new (void);
-
-
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/dialogs/task-editor.c b/calendar/gui/dialogs/task-editor.c
deleted file mode 100644
index a513bc25cf..0000000000
--- a/calendar/gui/dialogs/task-editor.c
+++ /dev/null
@@ -1,433 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution calendar - Task editor dialog
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Miguel de Icaza <miguel@ximian.com>
- * Federico Mena-Quintero <federico@ximian.com>
- * Seth Alves <alves@hungry.com>
- * JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <glade/glade.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "task-page.h"
-#include "task-details-page.h"
-#include "meeting-page.h"
-#include "cancel-comp.h"
-#include "task-editor.h"
-
-struct _TaskEditorPrivate {
- TaskPage *task_page;
- TaskDetailsPage *task_details_page;
- MeetingPage *meet_page;
-
- EMeetingStore *model;
-
- gboolean assignment_shown;
- gboolean is_assigned;
- gboolean updating;
-};
-
-
-
-static void task_editor_set_e_cal (CompEditor *editor, ECal *client);
-static void task_editor_edit_comp (CompEditor *editor, ECalComponent *comp);
-static gboolean task_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method);
-static void task_editor_finalize (GObject *object);
-
-static void assign_task_cmd (GtkWidget *widget, gpointer data);
-static void refresh_task_cmd (GtkWidget *widget, gpointer data);
-static void cancel_task_cmd (GtkWidget *widget, gpointer data);
-static void forward_cmd (GtkWidget *widget, gpointer data);
-
-static void model_row_change_insert_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data);
-static void model_row_delete_cb (GtkTreeModel *model, GtkTreePath *path, gpointer data);
-
-G_DEFINE_TYPE (TaskEditor, task_editor, TYPE_COMP_EDITOR);
-
-/* Class initialization function for the event editor */
-static void
-task_editor_class_init (TaskEditorClass *klass)
-{
- GObjectClass *object_class;
- CompEditorClass *editor_class;
-
- object_class = (GObjectClass *) klass;
- editor_class = (CompEditorClass *) klass;
-
- editor_class->set_e_cal = task_editor_set_e_cal;
- editor_class->edit_comp = task_editor_edit_comp;
- editor_class->send_comp = task_editor_send_comp;
-
- object_class->finalize = task_editor_finalize;
-}
-
-static void
-init_widgets (TaskEditor *te)
-{
- TaskEditorPrivate *priv;
-
- priv = te->priv;
-
- g_signal_connect((priv->model), "row_changed",
- G_CALLBACK (model_row_change_insert_cb), te);
- g_signal_connect((priv->model), "row_inserted",
- G_CALLBACK (model_row_change_insert_cb), te);
- g_signal_connect((priv->model), "row_deleted",
- G_CALLBACK (model_row_delete_cb), te);
-}
-
-static void
-client_changed_cb (CompEditorPage *page, ECal *client, gpointer user_data)
-{
-// set_menu_sens (TASK_EDITOR (user_data));
-}
-
-/* Object initialization function for the task editor */
-static void
-task_editor_init (TaskEditor *te)
-{
- TaskEditorPrivate *priv;
-
- priv = g_new0 (TaskEditorPrivate, 1);
- te->priv = priv;
-
- priv->model = E_MEETING_STORE (e_meeting_store_new ());
- priv->assignment_shown = TRUE;
- priv->updating = FALSE;
- priv->is_assigned = FALSE;
-
-}
-
-TaskEditor *
-task_editor_construct (TaskEditor *te, ECal *client, gboolean is_assigned)
-{
- TaskEditorPrivate *priv;
-
- priv = te->priv;
-
- priv->is_assigned = is_assigned;
- priv->task_page = task_page_new ();
- g_object_ref (priv->task_page);
- gtk_object_sink (GTK_OBJECT (priv->task_page));
- comp_editor_append_page (COMP_EDITOR (te),
- COMP_EDITOR_PAGE (priv->task_page),
- _("Task"));
- g_signal_connect (G_OBJECT (priv->task_page), "client_changed",
- G_CALLBACK (client_changed_cb), te);
-
- priv->task_details_page = task_details_page_new ();
- g_object_ref (priv->task_details_page);
- gtk_object_sink (GTK_OBJECT (priv->task_details_page));
- comp_editor_append_page (COMP_EDITOR (te),
- COMP_EDITOR_PAGE (priv->task_details_page),
- _("Status"));
- if (priv->is_assigned) {
- if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS))
- task_page_show_options (priv->task_page);
-
- comp_editor_set_group_item (COMP_EDITOR (te), TRUE);
- priv->meet_page = meeting_page_new (priv->model, client);
- g_object_ref (priv->meet_page);
- gtk_object_sink (GTK_OBJECT (priv->meet_page));
- comp_editor_append_page (COMP_EDITOR (te),
- COMP_EDITOR_PAGE (priv->meet_page),
- _("Assignment"));
- }
-
- comp_editor_set_e_cal (COMP_EDITOR (te), client);
-
- init_widgets (te);
-
- return te;
-}
-
-static void
-task_editor_set_e_cal (CompEditor *editor, ECal *client)
-{
- TaskEditor *te;
- TaskEditorPrivate *priv;
-
- te = TASK_EDITOR (editor);
- priv = te->priv;
-
- e_meeting_store_set_e_cal (priv->model, client);
-
- if (COMP_EDITOR_CLASS (task_editor_parent_class)->set_e_cal)
- COMP_EDITOR_CLASS (task_editor_parent_class)->set_e_cal (editor, client);
-}
-
-static void
-task_editor_edit_comp (CompEditor *editor, ECalComponent *comp)
-{
- TaskEditor *te;
- TaskEditorPrivate *priv;
- ECalComponentOrganizer organizer;
- ECal *client;
- GSList *attendees = NULL;
-
- te = TASK_EDITOR (editor);
- priv = te->priv;
-
- priv->updating = TRUE;
-
- if (COMP_EDITOR_CLASS (task_editor_parent_class)->edit_comp)
- COMP_EDITOR_CLASS (task_editor_parent_class)->edit_comp (editor, comp);
-
- client = comp_editor_get_e_cal (COMP_EDITOR (editor));
-
- /* Get meeting related stuff */
- e_cal_component_get_organizer (comp, &organizer);
- e_cal_component_get_attendee_list (comp, &attendees);
-
- /* Clear things up */
- e_meeting_store_remove_all_attendees (priv->model);
-
- if (attendees == NULL) {
- comp_editor_remove_page (editor, COMP_EDITOR_PAGE (priv->meet_page));
- priv->assignment_shown = FALSE;
- } else {
- GSList *l;
- int row;
-
- task_page_hide_options (priv->task_page);
- if (!priv->assignment_shown)
- comp_editor_append_page (COMP_EDITOR (te),
- COMP_EDITOR_PAGE (priv->meet_page),
- _("Assignment"));
-
- for (l = attendees; l != NULL; l = l->next) {
- ECalComponentAttendee *ca = l->data;
- EMeetingAttendee *ia;
-
- ia = E_MEETING_ATTENDEE (e_meeting_attendee_new_from_e_cal_component_attendee (ca));
- /* If we aren't the organizer or the attendee is just delegating, don't allow editing */
- if (!comp_editor_get_user_org (editor) || e_meeting_attendee_is_set_delto (ia))
- e_meeting_attendee_set_edit_level (ia, E_MEETING_ATTENDEE_EDIT_NONE);
- e_meeting_store_add_attendee (priv->model, ia);
-
- g_object_unref(ia);
- }
-
- /* If we aren't the organizer we can still change our own status */
- if (!comp_editor_get_user_org (editor)) {
- EAccountList *accounts;
- EAccount *account;
- EIterator *it;
-
- accounts = itip_addresses_get ();
- for (it = e_list_get_iterator((EList *)accounts);e_iterator_is_valid(it);e_iterator_next(it)) {
- EMeetingAttendee *ia;
-
- account = (EAccount*)e_iterator_get(it);
-
- ia = e_meeting_store_find_attendee (priv->model, account->id->address, &row);
- if (ia != NULL)
- e_meeting_attendee_set_edit_level (ia, E_MEETING_ATTENDEE_EDIT_STATUS);
- }
- g_object_unref(it);
- } else if (e_cal_get_organizer_must_attend (client)) {
- EMeetingAttendee *ia;
-
- ia = e_meeting_store_find_attendee (priv->model, organizer.value, &row);
- if (ia != NULL)
- e_meeting_attendee_set_edit_level (ia, E_MEETING_ATTENDEE_EDIT_NONE);
- }
-
-
- comp_editor_set_group_item (COMP_EDITOR (te), TRUE);
- priv->assignment_shown = TRUE;
- }
- e_cal_component_free_attendee_list (attendees);
-
- comp_editor_set_needs_send (COMP_EDITOR (te), priv->assignment_shown && itip_organizer_is_user (comp, client));
-
- priv->updating = FALSE;
-}
-
-static gboolean
-task_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method)
-{
- TaskEditor *te = TASK_EDITOR (editor);
- TaskEditorPrivate *priv;
- ECalComponent *comp = NULL;
-
- priv = te->priv;
-
- /* Don't cancel more than once or when just publishing */
- if (method == E_CAL_COMPONENT_METHOD_PUBLISH ||
- method == E_CAL_COMPONENT_METHOD_CANCEL)
- goto parent;
-
- comp = meeting_page_get_cancel_comp (priv->meet_page);
- if (comp != NULL) {
- ECal *client;
- gboolean result;
-
- client = e_meeting_store_get_e_cal (priv->model);
- result = itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp,
- client, NULL, NULL);
- g_object_unref (comp);
-
- if (!result)
- return FALSE;
- }
-
- parent:
- if (COMP_EDITOR_CLASS (task_editor_parent_class)->send_comp)
- return COMP_EDITOR_CLASS (task_editor_parent_class)->send_comp (editor, method);
-
- return FALSE;
-}
-
-/* Destroy handler for the event editor */
-static void
-task_editor_finalize (GObject *object)
-{
- TaskEditor *te;
- TaskEditorPrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_TASK_EDITOR (object));
-
- te = TASK_EDITOR (object);
- priv = te->priv;
-
- g_object_unref (priv->task_page);
- g_object_unref (priv->task_details_page);
- g_object_unref (priv->meet_page);
-
- g_object_unref (priv->model);
-
- g_free (priv);
-
- if (G_OBJECT_CLASS (task_editor_parent_class)->finalize)
- (* G_OBJECT_CLASS (task_editor_parent_class)->finalize) (object);
-}
-
-/**
- * task_editor_new:
- * @client: a ECal
- *
- * Creates a new event editor dialog.
- *
- * Return value: A newly-created event editor dialog, or NULL if the event
- * editor could not be created.
- **/
-TaskEditor *
-task_editor_new (ECal *client, gboolean is_assigned)
-{
- TaskEditor *te;
-
- te = g_object_new (TYPE_TASK_EDITOR, NULL);
- return task_editor_construct (te, client, is_assigned);
-}
-
-static void
-show_assignment (TaskEditor *te)
-{
- TaskEditorPrivate *priv;
-
- priv = te->priv;
-
- if (!priv->assignment_shown) {
- comp_editor_append_page (COMP_EDITOR (te),
- COMP_EDITOR_PAGE (priv->meet_page),
- _("Assignment"));
- priv->assignment_shown = TRUE;
-
- comp_editor_set_needs_send (COMP_EDITOR (te), priv->assignment_shown);
- comp_editor_set_changed (COMP_EDITOR (te), TRUE);
- }
-
-}
-
-void
-task_editor_show_assignment (TaskEditor *te)
-{
- g_return_if_fail (te != NULL);
- g_return_if_fail (IS_TASK_EDITOR (te));
-
- show_assignment (te);
-}
-
-static void
-assign_task_cmd (GtkWidget *widget, gpointer data)
-{
- TaskEditor *te = TASK_EDITOR (data);
-
- show_assignment (te);
-}
-
-static void
-refresh_task_cmd (GtkWidget *widget, gpointer data)
-{
- TaskEditor *te = TASK_EDITOR (data);
-
- comp_editor_send_comp (COMP_EDITOR (te), E_CAL_COMPONENT_METHOD_REFRESH);
-}
-
-static void
-cancel_task_cmd (GtkWidget *widget, gpointer data)
-{
- TaskEditor *te = TASK_EDITOR (data);
- ECalComponent *comp;
-
- comp = comp_editor_get_current_comp (COMP_EDITOR (te));
- if (cancel_component_dialog ((GtkWindow *) te,
- comp_editor_get_e_cal (COMP_EDITOR (te)), comp, FALSE)) {
- comp_editor_send_comp (COMP_EDITOR (te), E_CAL_COMPONENT_METHOD_CANCEL);
- comp_editor_delete_comp (COMP_EDITOR (te));
- }
-}
-
-static void
-forward_cmd (GtkWidget *widget, gpointer data)
-{
- TaskEditor *te = TASK_EDITOR (data);
-
- if (comp_editor_save_comp (COMP_EDITOR (te), TRUE))
- comp_editor_send_comp (COMP_EDITOR (te), E_CAL_COMPONENT_METHOD_PUBLISH);
-}
-
-static void
-model_changed (TaskEditor *te)
-{
- if (!te->priv->updating) {
- comp_editor_set_changed (COMP_EDITOR (te), TRUE);
- comp_editor_set_needs_send (COMP_EDITOR (te), TRUE);
- }
-}
-
-static void
-model_row_change_insert_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
-{
- model_changed (TASK_EDITOR (data));
-}
-
-static void
-model_row_delete_cb (GtkTreeModel *model, GtkTreePath *path, gpointer data)
-{
- model_changed (TASK_EDITOR (data));
-}
diff --git a/calendar/gui/dialogs/task-editor.h b/calendar/gui/dialogs/task-editor.h
deleted file mode 100644
index d1b8b327d5..0000000000
--- a/calendar/gui/dialogs/task-editor.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Evolution calendar - Task editor dialog
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Miguel de Icaza <miguel@ximian.com>
- * Federico Mena-Quintero <federico@ximian.com>
- * Seth Alves <alves@hungry.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef __TASK_EDITOR_H__
-#define __TASK_EDITOR_H__
-
-#include <gtk/gtkobject.h>
-#include "comp-editor.h"
-
-
-
-#define TYPE_TASK_EDITOR (task_editor_get_type ())
-#define TASK_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_TASK_EDITOR, TaskEditor))
-#define TASK_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_TASK_EDITOR, \
- TaskEditorClass))
-#define IS_TASK_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_TASK_EDITOR))
-#define IS_TASK_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_TASK_EDITOR))
-
-typedef struct _TaskEditor TaskEditor;
-typedef struct _TaskEditorClass TaskEditorClass;
-typedef struct _TaskEditorPrivate TaskEditorPrivate;
-
-struct _TaskEditor {
- CompEditor parent;
-
- /* Private data */
- TaskEditorPrivate *priv;
-};
-
-struct _TaskEditorClass {
- CompEditorClass parent_class;
-};
-
-GtkType task_editor_get_type (void);
-TaskEditor *task_editor_construct (TaskEditor *te,
- ECal *client, gboolean is_assigned);
-TaskEditor *task_editor_new (ECal *client, gboolean is_assigned);
-void task_editor_show_assignment(TaskEditor *te);
-
-
-#endif /* __TASK_EDITOR_H__ */
diff --git a/calendar/gui/dialogs/task-page.c b/calendar/gui/dialogs/task-page.c
deleted file mode 100644
index f1fd4fea1b..0000000000
--- a/calendar/gui/dialogs/task-page.c
+++ /dev/null
@@ -1,1078 +0,0 @@
-/* Evolution calendar - Main page of the task editor dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- * Miguel de Icaza <miguel@ximian.com>
- * Seth Alves <alves@hungry.com>
- * JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtktextview.h>
-#include <gtk/gtktogglebutton.h>
-#include <gtk/gtkspinbutton.h>
-#include <gtk/gtkoptionmenu.h>
-#include <gtk/gtkmessagedialog.h>
-#include <libgnome/gnome-i18n.h>
-#include <glade/glade.h>
-#include <gal/widgets/e-categories.h>
-#include <libedataserverui/e-source-option-menu.h>
-#include <widgets/misc/e-dateedit.h>
-#include "common/authentication.h"
-#include "e-util/e-dialog-widgets.h"
-#include "e-util/e-categories-config.h"
-#include "../e-timezone-entry.h"
-#include "../calendar-config.h"
-#include "comp-editor.h"
-#include "comp-editor-util.h"
-#include "e-send-options-utils.h"
-#include "task-page.h"
-
-
-
-/* Private part of the TaskPage structure */
-struct _TaskPagePrivate {
- /* Glade XML data */
- GladeXML *xml;
-
- /* Widgets from the Glade file */
- GtkWidget *main;
-
- GtkWidget *summary;
- GtkWidget *summary_label;
-
- GtkWidget *due_date;
- GtkWidget *start_date;
- GtkWidget *due_timezone;
- GtkWidget *start_timezone;
-
- GtkWidget *description;
-
- GtkWidget *classification;
-
- GtkWidget *categories_btn;
- GtkWidget *categories;
-
- GtkWidget *source_selector;
- GtkWidget *sendoptions_frame;
- GtkWidget *sendoptions_button;
-
- gboolean updating;
- gboolean sendoptions_shown;
-
- ESendOptionsDialog *sod;
-};
-
-static const int classification_map[] = {
- E_CAL_COMPONENT_CLASS_PUBLIC,
- E_CAL_COMPONENT_CLASS_PRIVATE,
- E_CAL_COMPONENT_CLASS_CONFIDENTIAL,
- -1
-};
-
-
-
-static void task_page_finalize (GObject *object);
-
-static GtkWidget *task_page_get_widget (CompEditorPage *page);
-static void task_page_focus_main_widget (CompEditorPage *page);
-static gboolean task_page_fill_widgets (CompEditorPage *page, ECalComponent *comp);
-static gboolean task_page_fill_component (CompEditorPage *page, ECalComponent *comp);
-static gboolean task_page_fill_timezones (CompEditorPage *page, GHashTable *timezones);
-static void task_page_set_summary (CompEditorPage *page, const char *summary);
-static void task_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates);
-
-G_DEFINE_TYPE (TaskPage, task_page, TYPE_COMP_EDITOR_PAGE);
-
-/* Class initialization function for the task page */
-static void
-task_page_class_init (TaskPageClass *class)
-{
- CompEditorPageClass *editor_page_class;
- GObjectClass *object_class;
-
- editor_page_class = (CompEditorPageClass *) class;
- object_class = (GObjectClass *) class;
-
- editor_page_class->get_widget = task_page_get_widget;
- editor_page_class->focus_main_widget = task_page_focus_main_widget;
- editor_page_class->fill_widgets = task_page_fill_widgets;
- editor_page_class->fill_component = task_page_fill_component;
- editor_page_class->fill_timezones = task_page_fill_timezones;
- editor_page_class->set_summary = task_page_set_summary;
- editor_page_class->set_dates = task_page_set_dates;
-
- object_class->finalize = task_page_finalize;
-}
-
-/* Object initialization function for the task page */
-static void
-task_page_init (TaskPage *tpage)
-{
- TaskPagePrivate *priv;
-
- priv = g_new0 (TaskPagePrivate, 1);
- tpage->priv = priv;
-
- priv->xml = NULL;
-
- priv->main = NULL;
- priv->summary = NULL;
- priv->summary_label = NULL;
- priv->due_date = NULL;
- priv->start_date = NULL;
- priv->due_timezone = NULL;
- priv->start_timezone = NULL;
- priv->description = NULL;
- priv->classification = NULL;
- priv->categories_btn = NULL;
- priv->categories = NULL;
- priv->sendoptions_frame = NULL;
- priv->sendoptions_button = NULL;
- priv->sendoptions_shown = FALSE;
- priv->sod = NULL;
-
- priv->updating = FALSE;
- priv->sendoptions_shown = FALSE;
-}
-
-/* Destroy handler for the task page */
-static void
-task_page_finalize (GObject *object)
-{
- TaskPage *tpage;
- TaskPagePrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_TASK_PAGE (object));
-
- tpage = TASK_PAGE (object);
- priv = tpage->priv;
-
- if (priv->main)
- gtk_widget_unref (priv->main);
-
- if (priv->xml) {
- g_object_unref (priv->xml);
- priv->xml = NULL;
- }
-
- if (priv->sod) {
- g_object_unref (priv->sod);
- priv->sod = NULL;
- }
-
- g_free (priv);
- tpage->priv = NULL;
-
- if (G_OBJECT_CLASS (task_page_parent_class)->finalize)
- (* G_OBJECT_CLASS (task_page_parent_class)->finalize) (object);
-}
-
-
-
-/* get_widget handler for the task page */
-static GtkWidget *
-task_page_get_widget (CompEditorPage *page)
-{
- TaskPage *tpage;
- TaskPagePrivate *priv;
-
- tpage = TASK_PAGE (page);
- priv = tpage->priv;
-
- return priv->main;
-}
-
-/* focus_main_widget handler for the task page */
-static void
-task_page_focus_main_widget (CompEditorPage *page)
-{
- TaskPage *tpage;
- TaskPagePrivate *priv;
-
- tpage = TASK_PAGE (page);
- priv = tpage->priv;
-
- gtk_widget_grab_focus (priv->summary);
-}
-
-/* Fills the widgets with default values */
-static void
-clear_widgets (TaskPage *tpage)
-{
- TaskPagePrivate *priv;
-
- priv = tpage->priv;
-
- /* Summary, description */
- e_dialog_editable_set (priv->summary, NULL);
- gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->description)), "", 0);
-
- /* Start, due times */
- e_date_edit_set_time (E_DATE_EDIT (priv->start_date), 0);
- e_date_edit_set_time (E_DATE_EDIT (priv->due_date), 0);
-
- /* Classification */
- e_dialog_option_menu_set (priv->classification, E_CAL_COMPONENT_CLASS_PRIVATE, classification_map);
-
- /* Categories */
- e_dialog_editable_set (priv->categories, NULL);
-}
-
-/* Decode the radio button group for classifications */
-static ECalComponentClassification
-classification_get (GtkWidget *widget)
-{
- return e_dialog_option_menu_get (widget, classification_map);
-}
-
-static void
-sensitize_widgets (TaskPage *tpage)
-{
- gboolean read_only;
- TaskPagePrivate *priv;
-
- priv = tpage->priv;
-
- if (!e_cal_is_read_only (COMP_EDITOR_PAGE (tpage)->client, &read_only, NULL))
- read_only = TRUE;
-
- gtk_widget_set_sensitive (priv->summary_label, !read_only);
- gtk_entry_set_editable (GTK_ENTRY (priv->summary), !read_only);
- gtk_widget_set_sensitive (priv->due_date, !read_only);
- gtk_widget_set_sensitive (priv->start_date, !read_only);
- gtk_widget_set_sensitive (priv->due_timezone, !read_only);
- gtk_widget_set_sensitive (priv->start_timezone, !read_only);
- gtk_widget_set_sensitive (priv->description, !read_only);
- gtk_widget_set_sensitive (priv->classification, !read_only);
- gtk_widget_set_sensitive (priv->categories_btn, !read_only);
- gtk_widget_set_sensitive (priv->sendoptions_button, !read_only);
- gtk_entry_set_editable (GTK_ENTRY (priv->categories), !read_only);
-}
-void
-task_page_hide_options (TaskPage *page)
-{
- g_return_if_fail (IS_TASK_PAGE (page));
-
- gtk_widget_hide (page->priv->sendoptions_frame);
-
- page->priv->sendoptions_shown = FALSE;
-
-}
-void
-task_page_show_options (TaskPage *page)
-{
- g_return_if_fail (IS_TASK_PAGE (page));
-
- gtk_widget_show (page->priv->sendoptions_frame);
-
- if (e_cal_get_static_capability (COMP_EDITOR_PAGE (page)->client, CAL_STATIC_CAPABILITY_NO_GEN_OPTIONS))
- e_sendoptions_set_need_general_options (page->priv->sod, FALSE);
-
- page->priv->sendoptions_shown = TRUE;
-}
-
-/* fill_widgets handler for the task page */
-static gboolean
-task_page_fill_widgets (CompEditorPage *page, ECalComponent *comp)
-{
- TaskPage *tpage;
- TaskPagePrivate *priv;
- ECalComponentText text;
- ECalComponentDateTime d;
- ECalComponentClassification cl;
- GSList *l;
- icalcomponent *icalcomp;
- const char *categories, *uid;
- icaltimezone *zone, *default_zone;
- ESource *source;
-
- tpage = TASK_PAGE (page);
- priv = tpage->priv;
-
- priv->updating = TRUE;
-
- /* Clean the screen */
- clear_widgets (tpage);
-
- /* Summary, description(s) */
- e_cal_component_get_summary (comp, &text);
- e_dialog_editable_set (priv->summary, text.value);
-
- e_cal_component_get_description_list (comp, &l);
- if (l && l->data) {
- ECalComponentText *dtext;
-
- dtext = l->data;
- gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->description)),
- dtext->value ? dtext->value : "", -1);
- } else {
- gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->description)),
- "", 0);
- }
- e_cal_component_free_text_list (l);
-
- default_zone = calendar_config_get_icaltimezone ();
-
- /* Due Date. */
- e_cal_component_get_due (comp, &d);
- zone = NULL;
- if (d.value) {
- struct icaltimetype *due_tt = d.value;
- e_date_edit_set_date (E_DATE_EDIT (priv->due_date),
- due_tt->year, due_tt->month,
- due_tt->day);
- if (due_tt->is_date) {
- e_date_edit_set_time_of_day (E_DATE_EDIT (priv->due_date),
- -1, -1);
- zone = default_zone;
- } else {
- e_date_edit_set_time_of_day (E_DATE_EDIT (priv->due_date),
- due_tt->hour,
- due_tt->minute);
- }
- } else {
- e_date_edit_set_time (E_DATE_EDIT (priv->due_date), -1);
-
- /* If no time is set, we use the default timezone, so the
- user usually doesn't have to set this when they set the
- date. */
- zone = default_zone;
- }
-
- /* Note that if we are creating a new task, the timezones may not be
- on the server, so we try to get the builtin timezone with the TZID
- first. */
- if (!zone)
- zone = icaltimezone_get_builtin_timezone_from_tzid (d.tzid);
- if (!zone) {
- if (!e_cal_get_timezone (page->client, d.tzid, &zone, NULL))
- /* FIXME: Handle error better. */
- g_warning ("Couldn't get timezone from server: %s",
- d.tzid ? d.tzid : "");
- }
- e_timezone_entry_set_timezone (E_TIMEZONE_ENTRY (priv->due_timezone),
- zone);
-
- e_cal_component_free_datetime (&d);
-
-
- /* Start Date. */
- e_cal_component_get_dtstart (comp, &d);
- zone = NULL;
- if (d.value) {
- struct icaltimetype *start_tt = d.value;
- e_date_edit_set_date (E_DATE_EDIT (priv->start_date),
- start_tt->year, start_tt->month,
- start_tt->day);
- if (start_tt->is_date) {
- e_date_edit_set_time_of_day (E_DATE_EDIT (priv->start_date),
- -1, -1);
- zone = default_zone;
- } else {
- e_date_edit_set_time_of_day (E_DATE_EDIT (priv->start_date),
- start_tt->hour,
- start_tt->minute);
- }
- } else {
- e_date_edit_set_time (E_DATE_EDIT (priv->start_date), -1);
-
- /* If no time is set, we use the default timezone, so the
- user usually doesn't have to set this when they set the
- date. */
- zone = default_zone;
- }
-
- if (!zone)
- zone = icaltimezone_get_builtin_timezone_from_tzid (d.tzid);
- if (!zone) {
- if (!e_cal_get_timezone (page->client, d.tzid, &zone, NULL))
- /* FIXME: Handle error better. */
- g_warning ("Couldn't get timezone from server: %s",
- d.tzid ? d.tzid : "");
- }
- e_timezone_entry_set_timezone (E_TIMEZONE_ENTRY (priv->start_timezone),
- zone);
-
- e_cal_component_free_datetime (&d);
-
- /* Classification. */
- e_cal_component_get_classification (comp, &cl);
-
- switch (cl) {
- case E_CAL_COMPONENT_CLASS_PUBLIC:
- case E_CAL_COMPONENT_CLASS_PRIVATE:
- case E_CAL_COMPONENT_CLASS_CONFIDENTIAL:
- break;
- default:
- /* default to PUBLIC */
- cl = E_CAL_COMPONENT_CLASS_PUBLIC;
- break;
- }
- e_dialog_option_menu_set (priv->classification, cl, classification_map);
-
- e_cal_component_get_uid (comp, &uid);
- if (e_cal_get_object (COMP_EDITOR_PAGE (tpage)->client, uid, NULL, &icalcomp, NULL)) {
- icalcomponent_free (icalcomp);
- task_page_hide_options (tpage);
- }
-
- /* Categories */
- e_cal_component_get_categories (comp, &categories);
- e_dialog_editable_set (priv->categories, categories);
-
- /* Source */
- source = e_cal_get_source (page->client);
- e_source_option_menu_select (E_SOURCE_OPTION_MENU (priv->source_selector), source);
-
- priv->updating = FALSE;
-
- sensitize_widgets (tpage);
-
- return TRUE;
-}
-
-/* fill_component handler for the task page */
-static gboolean
-task_page_fill_component (CompEditorPage *page, ECalComponent *comp)
-{
- TaskPage *tpage;
- TaskPagePrivate *priv;
- ECalComponentDateTime date;
- struct icaltimetype start_tt, due_tt;
- char *cat, *str;
- gboolean start_date_set, due_date_set, time_set;
- GtkTextBuffer *text_buffer;
- GtkTextIter text_iter_start, text_iter_end;
- icaltimezone *start_zone = NULL;
- icaltimezone *due_zone = NULL;
-
- tpage = TASK_PAGE (page);
- priv = tpage->priv;
- text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->description));
-
- /* Summary. */
-
- str = e_dialog_editable_get (priv->summary);
- if (!str || strlen (str) == 0)
- e_cal_component_set_summary (comp, NULL);
- else {
- ECalComponentText text;
-
- text.value = str;
- text.altrep = NULL;
-
- e_cal_component_set_summary (comp, &text);
- }
-
- if (str)
- g_free (str);
-
- /* Description */
-
- gtk_text_buffer_get_start_iter (text_buffer, &text_iter_start);
- gtk_text_buffer_get_end_iter (text_buffer, &text_iter_end);
- str = gtk_text_buffer_get_text (text_buffer, &text_iter_start, &text_iter_end, FALSE);
-
- if (!str || strlen (str) == 0)
- e_cal_component_set_description_list (comp, NULL);
- else {
- GSList l;
- ECalComponentText text;
-
- text.value = str;
- text.altrep = NULL;
- l.data = &text;
- l.next = NULL;
-
- e_cal_component_set_description_list (comp, &l);
- }
-
- if (str)
- g_free (str);
-
- /* Dates */
-
- due_tt = icaltime_null_time ();
-
- date.value = &due_tt;
- date.tzid = NULL;
-
- /* Due Date. */
- if (!e_date_edit_date_is_valid (E_DATE_EDIT (priv->due_date)) ||
- !e_date_edit_time_is_valid (E_DATE_EDIT (priv->due_date))) {
- comp_editor_page_display_validation_error (page, _("Due date is wrong"), priv->due_date);
- return FALSE;
- }
-
- due_date_set = e_date_edit_get_date (E_DATE_EDIT (priv->due_date),
- &due_tt.year,
- &due_tt.month,
- &due_tt.day);
- time_set = e_date_edit_get_time_of_day (E_DATE_EDIT (priv->due_date),
- &due_tt.hour,
- &due_tt.minute);
- if (due_date_set) {
- if (time_set) {
- due_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->due_timezone));
- date.tzid = icaltimezone_get_tzid (due_zone);
- } else {
- due_tt.is_date = TRUE;
- date.tzid = NULL;
- }
- e_cal_component_set_due (comp, &date);
- } else {
- e_cal_component_set_due (comp, NULL);
- }
-
- /* Start Date. */
- if (!e_date_edit_date_is_valid (E_DATE_EDIT (priv->start_date)) ||
- !e_date_edit_time_is_valid (E_DATE_EDIT (priv->start_date))) {
- comp_editor_page_display_validation_error (page, _("Start date is wrong"), priv->start_date);
- return FALSE;
- }
-
- start_tt = icaltime_null_time ();
- date.value = &start_tt;
- start_date_set = e_date_edit_get_date (E_DATE_EDIT (priv->start_date),
- &start_tt.year,
- &start_tt.month,
- &start_tt.day);
- time_set = e_date_edit_get_time_of_day (E_DATE_EDIT (priv->start_date),
- &start_tt.hour,
- &start_tt.minute);
- if (start_date_set) {
- if (time_set) {
- start_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone));
- date.tzid = icaltimezone_get_tzid (start_zone);
- } else {
- start_tt.is_date = TRUE;
- date.tzid = NULL;
- }
- e_cal_component_set_dtstart (comp, &date);
- } else {
- e_cal_component_set_dtstart (comp, NULL);
- }
-
- /* Classification. */
- e_cal_component_set_classification (comp, classification_get (priv->classification));
-
- /* send options */
- if (priv->sendoptions_shown && priv->sod)
- e_sendoptions_utils_fill_component (priv->sod, comp);
-
- /* Categories */
- cat = e_dialog_editable_get (priv->categories);
- str = comp_editor_strip_categories (cat);
- if (cat)
- g_free (cat);
-
- e_cal_component_set_categories (comp, str);
-
- if (str)
- g_free (str);
-
- return TRUE;
-}
-
-/* fill_timezones handler for the event page */
-static gboolean
-task_page_fill_timezones (CompEditorPage *page, GHashTable *timezones)
-{
- TaskPage *tpage;
- TaskPagePrivate *priv;
- icaltimezone *zone;
-
- tpage = TASK_PAGE (page);
- priv = tpage->priv;
-
- /* add due date timezone */
- zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->due_timezone));
- if (zone) {
- if (!g_hash_table_lookup (timezones, icaltimezone_get_tzid (zone)))
- g_hash_table_insert (timezones, icaltimezone_get_tzid (zone), zone);
- }
-
- /* add start date timezone */
- zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone));
- if (zone) {
- if (!g_hash_table_lookup (timezones, icaltimezone_get_tzid (zone)))
- g_hash_table_insert (timezones, icaltimezone_get_tzid (zone), zone);
- }
-
- return TRUE;
-}
-
-/* set_summary handler for the task page */
-static void
-task_page_set_summary (CompEditorPage *page, const char *summary)
-{
- /* nothing */
-}
-
-static void
-task_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates)
-{
- TaskPage *tpage;
- TaskPagePrivate *priv;
-
- tpage = TASK_PAGE (page);
- priv = tpage->priv;
-
- if (priv->updating)
- return;
-
- priv->updating = TRUE;
-
- priv->updating = FALSE;
-}
-
-
-
-/* Gets the widgets from the XML file and returns if they are all available. */
-static gboolean
-get_widgets (TaskPage *tpage)
-{
- CompEditorPage *page = COMP_EDITOR_PAGE (tpage);
- TaskPagePrivate *priv;
- GSList *accel_groups;
- GtkWidget *toplevel;
-
- priv = tpage->priv;
-
-#define GW(name) glade_xml_get_widget (priv->xml, name)
-
- priv->main = GW ("task-page");
- if (!priv->main)
- return FALSE;
-
- /* Get the GtkAccelGroup from the toplevel window, so we can install
- it when the notebook page is mapped. */
- toplevel = gtk_widget_get_toplevel (priv->main);
- accel_groups = gtk_accel_groups_from_object (G_OBJECT (toplevel));
- if (accel_groups) {
- page->accel_group = accel_groups->data;
- gtk_accel_group_ref (page->accel_group);
- }
-
- gtk_widget_ref (priv->main);
- gtk_container_remove (GTK_CONTAINER (priv->main->parent), priv->main);
-
- priv->summary = GW ("summary");
- priv->summary_label = GW ("summary-label");
-
- /* Glade's visibility flag doesn't seem to work for custom widgets */
- priv->due_date = GW ("due-date");
- gtk_widget_show (priv->due_date);
- priv->start_date = GW ("start-date");
- gtk_widget_show (priv->start_date);
-
- priv->due_timezone = GW ("due-timezone");
- priv->start_timezone = GW ("start-timezone");
-
- priv->description = GW ("description");
-
- priv->classification = GW ("classification");
-
- priv->categories_btn = GW ("categories-button");
- priv->categories = GW ("categories");
-
- priv->source_selector = GW ("source");
-
- priv->sendoptions_frame = GW ("send-options-frame");
- priv->sendoptions_button = GW ("send-options-button");
-
-#undef GW
-
- return (priv->summary
- && priv->summary_label
- && priv->due_date
- && priv->start_date
- && priv->due_timezone
- && priv->start_timezone
- && priv->classification
- && priv->description
- && priv->categories_btn
- && priv->categories
- && priv->sendoptions_frame
- && priv->sendoptions_button);
-}
-
-/* Callback used when the summary changes; we emit the notification signal. */
-static void
-summary_changed_cb (GtkEditable *editable, gpointer data)
-{
- TaskPage *tpage;
- TaskPagePrivate *priv;
- gchar *summary;
-
- tpage = TASK_PAGE (data);
- priv = tpage->priv;
-
- if (priv->updating)
- return;
-
- summary = e_dialog_editable_get (GTK_WIDGET (editable));
- comp_editor_page_notify_summary_changed (COMP_EDITOR_PAGE (tpage),
- summary);
- g_free (summary);
-}
-
-/* Callback used when the start or due date widgets change. We notify the
- * other pages in the task editor, so they can update any labels.
- */
-static void
-date_changed_cb (EDateEdit *dedit, gpointer data)
-{
- TaskPage *tpage;
- TaskPagePrivate *priv;
- CompEditorPageDates dates;
- gboolean date_set, time_set;
- ECalComponentDateTime start_dt, due_dt;
- struct icaltimetype start_tt = icaltime_null_time();
- struct icaltimetype due_tt = icaltime_null_time();
-
- tpage = TASK_PAGE (data);
- priv = tpage->priv;
-
- if (priv->updating)
- return;
-
- date_set = e_date_edit_get_date (E_DATE_EDIT (priv->start_date),
- &start_tt.year,
- &start_tt.month,
- &start_tt.day);
- time_set = e_date_edit_get_time_of_day (E_DATE_EDIT (priv->start_date),
- &start_tt.hour,
- &start_tt.minute);
- if (date_set) {
- if (time_set) {
- icaltimezone *zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone));
- start_dt.tzid = icaltimezone_get_tzid (zone);
- } else {
- start_tt.is_date = TRUE;
- start_dt.tzid = NULL;
- }
- } else {
- start_tt = icaltime_null_time ();
- start_dt.tzid = NULL;
- }
-
- date_set = e_date_edit_get_date (E_DATE_EDIT (priv->due_date),
- &due_tt.year,
- &due_tt.month,
- &due_tt.day);
- time_set = e_date_edit_get_time_of_day (E_DATE_EDIT (priv->due_date),
- &due_tt.hour,
- &due_tt.minute);
- if (date_set) {
- if (time_set) {
- icaltimezone *zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->due_timezone));
- due_dt.tzid = icaltimezone_get_tzid (zone);
- } else {
- due_tt.is_date = TRUE;
- due_dt.tzid = NULL;
- }
- } else {
- due_tt = icaltime_null_time ();
- due_dt.tzid = NULL;
- }
-
- start_dt.value = &start_tt;
- dates.start = &start_dt;
- dates.end = NULL;
- due_dt.value = &due_tt;
- dates.due = &due_dt;
- dates.complete = NULL;
-
- /* Notify upstream */
- comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (tpage),
- &dates);
-}
-
-/* Callback used when the categories button is clicked; we must bring up the
- * category list dialog.
- */
-static void
-categories_clicked_cb (GtkWidget *button, gpointer data)
-{
- TaskPage *tpage;
- TaskPagePrivate *priv;
- GtkWidget *entry;
-
- tpage = TASK_PAGE (data);
- priv = tpage->priv;
-
- entry = priv->categories;
- e_categories_config_open_dialog_for_entry (GTK_ENTRY (entry));
-}
-
-/* This is called when any field is changed; it notifies upstream. */
-static void
-field_changed_cb (GtkWidget *widget, gpointer data)
-{
- TaskPage *tpage;
- TaskPagePrivate *priv;
-
- tpage = TASK_PAGE (data);
- priv = tpage->priv;
-
- if (!priv->updating)
- comp_editor_page_notify_changed (COMP_EDITOR_PAGE (tpage));
-}
-
-static void
-source_changed_cb (GtkWidget *widget, ESource *source, gpointer data)
-{
- TaskPage *tpage;
- TaskPagePrivate *priv;
-
- tpage = TASK_PAGE (data);
- priv = tpage->priv;
-
- if (!priv->updating) {
- ECal *client;
-
- client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_TODO);
- if (!client || !e_cal_open (client, FALSE, NULL)) {
- GtkWidget *dialog;
-
- if (client)
- g_object_unref (client);
-
- e_source_option_menu_select (E_SOURCE_OPTION_MENU (priv->source_selector),
- e_cal_get_source (COMP_EDITOR_PAGE (tpage)->client));
-
- dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
- GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
- _("Unable to open tasks in '%s'."),
- e_source_peek_name (source));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- } else {
- comp_editor_notify_client_changed (
- COMP_EDITOR (gtk_widget_get_toplevel (priv->main)),
- client);
- if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS))
- task_page_show_options (tpage);
- else
- task_page_hide_options (tpage);
-
-
- sensitize_widgets (tpage);
- }
- }
-}
-
-static void
-e_sendoptions_clicked_cb (GtkWidget *button, gpointer data)
-{
- TaskPage *tpage;
- TaskPagePrivate *priv;
- GtkWidget *toplevel;
- ESource *source;
-
- tpage = TASK_PAGE (data);
- priv = tpage->priv;
-
- if (!priv->sod) {
- priv->sod = e_sendoptions_dialog_new ();
- priv->sod->data->initialized = TRUE;
- source = e_source_option_menu_peek_selected (E_SOURCE_OPTION_MENU (priv->source_selector));
- e_sendoptions_utils_set_default_data (priv->sod, source, "task");
- }
-
- toplevel = gtk_widget_get_toplevel (priv->main);
- e_sendoptions_dialog_run (priv->sod, toplevel, E_ITEM_TASK);
-}
-
-/* Hooks the widget signals */
-static gboolean
-init_widgets (TaskPage *tpage)
-{
- TaskPagePrivate *priv;
- GtkTextBuffer *text_buffer;
- icaltimezone *zone;
-
- priv = tpage->priv;
-
- /* Make sure the EDateEdit widgets use our timezones to get the
- current time. */
- e_date_edit_set_get_time_callback (E_DATE_EDIT (priv->start_date),
- (EDateEditGetTimeCallback) comp_editor_get_current_time,
- tpage, NULL);
- e_date_edit_set_get_time_callback (E_DATE_EDIT (priv->due_date),
- (EDateEditGetTimeCallback) comp_editor_get_current_time,
- tpage, NULL);
-
- /* Summary */
- g_signal_connect((priv->summary), "changed",
- G_CALLBACK (summary_changed_cb), tpage);
-
- /* Description */
- text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->description));
-
- gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (priv->description), GTK_WRAP_WORD);
-
- /* Dates */
- g_signal_connect((priv->start_date), "changed",
- G_CALLBACK (date_changed_cb), tpage);
- g_signal_connect((priv->due_date), "changed",
- G_CALLBACK (date_changed_cb), tpage);
-
- /* Categories button */
- g_signal_connect((priv->categories_btn), "clicked",
- G_CALLBACK (categories_clicked_cb), tpage);
-
- /* send options button */
- g_signal_connect((priv->sendoptions_button), "clicked",
- G_CALLBACK (e_sendoptions_clicked_cb), tpage);
-
- /* Source selector */
- g_signal_connect((priv->source_selector), "source_selected",
- G_CALLBACK (source_changed_cb), tpage);
-
- /* Connect the default signal handler to use to make sure the "changed"
- field gets set whenever a field is changed. */
-
- /* Belongs to priv->description */
- g_signal_connect ((text_buffer), "changed",
- G_CALLBACK (field_changed_cb), tpage);
-
- g_signal_connect((priv->summary), "changed",
- G_CALLBACK (field_changed_cb), tpage);
- g_signal_connect (priv->start_date, "changed",
- G_CALLBACK (field_changed_cb), tpage);
- g_signal_connect (priv->due_date, "changed",
- G_CALLBACK (field_changed_cb), tpage);
- g_signal_connect((priv->due_timezone), "changed",
- G_CALLBACK (field_changed_cb), tpage);
- g_signal_connect((priv->start_timezone), "changed",
- G_CALLBACK (field_changed_cb), tpage);
- g_signal_connect((priv->classification), "changed",
- G_CALLBACK (field_changed_cb), tpage);
- g_signal_connect((priv->categories), "changed",
- G_CALLBACK (field_changed_cb), tpage);
-
- /* Set the default timezone, so the timezone entry may be hidden. */
- zone = calendar_config_get_icaltimezone ();
- e_timezone_entry_set_default_timezone (E_TIMEZONE_ENTRY (priv->start_timezone), zone);
- e_timezone_entry_set_default_timezone (E_TIMEZONE_ENTRY (priv->due_timezone), zone);
-
- return TRUE;
-}
-
-
-
-/**
- * task_page_construct:
- * @tpage: An task page.
- *
- * Constructs an task page by loading its Glade data.
- *
- * Return value: The same object as @tpage, or NULL if the widgets could not be
- * created.
- **/
-TaskPage *
-task_page_construct (TaskPage *tpage)
-{
- TaskPagePrivate *priv;
-
- priv = tpage->priv;
-
- priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/task-page.glade",
- NULL, NULL);
- if (!priv->xml) {
- g_message ("task_page_construct(): "
- "Could not load the Glade XML file!");
- return NULL;
- }
-
- if (!get_widgets (tpage)) {
- g_message ("task_page_construct(): "
- "Could not find all widgets in the XML file!");
- return NULL;
- }
-
- if (!init_widgets (tpage)) {
- g_message ("task_page_construct(): "
- "Could not initialize the widgets!");
- return NULL;
- }
-
- return tpage;
-}
-
-/**
- * task_page_new:
- *
- * Creates a new task page.
- *
- * Return value: A newly-created task page, or NULL if the page could
- * not be created.
- **/
-TaskPage *
-task_page_new (void)
-{
- TaskPage *tpage;
-
- tpage = gtk_type_new (TYPE_TASK_PAGE);
- if (!task_page_construct (tpage)) {
- g_object_unref (tpage);
- return NULL;
- }
-
- return tpage;
-}
-
-GtkWidget *task_page_create_date_edit (void);
-
-GtkWidget *
-task_page_create_date_edit (void)
-{
- GtkWidget *dedit;
-
- dedit = comp_editor_new_date_edit (TRUE, TRUE, TRUE);
- e_date_edit_set_allow_no_date_set (E_DATE_EDIT (dedit), TRUE);
-
- return dedit;
-}
-
-GtkWidget *task_page_create_source_option_menu (void);
-
-GtkWidget *
-task_page_create_source_option_menu (void)
-{
- GtkWidget *menu;
- GConfClient *gconf_client;
- ESourceList *source_list;
-
- gconf_client = gconf_client_get_default ();
- source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/tasks/sources");
-
- menu = e_source_option_menu_new (source_list);
- g_object_unref (source_list);
-
- gtk_widget_show (menu);
- return menu;
-}
diff --git a/calendar/gui/dialogs/task-page.glade b/calendar/gui/dialogs/task-page.glade
deleted file mode 100644
index 3415672ec2..0000000000
--- a/calendar/gui/dialogs/task-page.glade
+++ /dev/null
@@ -1,652 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkWindow" id="task-toplevel">
- <property name="title" translatable="yes">window1</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-
- <child>
- <widget class="GtkVBox" id="task-page">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label21">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Basics&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox7">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="label22">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">12</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table3">
- <property name="visible">True</property>
- <property name="n_rows">4</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">12</property>
-
- <child>
- <widget class="GtkEntry" id="summary">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="summary-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Su_mmary:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">summary</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label100">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Classi_fication:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">classification</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox10">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkOptionMenu" id="classification">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child>
- <widget class="GtkMenu" id="menu1">
-
- <child>
- <widget class="GtkMenuItem" id="public1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Public</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="private1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Private</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="confidential1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Confidential</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label23">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Group:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">12</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">source</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="source">
- <property name="visible">True</property>
- <property name="creation_function">task_page_create_source_option_menu</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Thu, 18 Dec 2003 01:58:48 GMT</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkButton" id="categories-button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Ca_tegories...</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="categories">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkproperty name="AtkObject::accessible_name" translatable="yes">Categories</atkproperty>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow1">
- <property name="visible">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
- <child>
- <widget class="GtkTextView" id="description">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="overwrite">False</property>
- <property name="accepts_tab">True</property>
- <property name="justification">GTK_JUSTIFY_LEFT</property>
- <property name="wrap_mode">GTK_WRAP_WORD</property>
- <property name="cursor_visible">True</property>
- <property name="pixels_above_lines">0</property>
- <property name="pixels_below_lines">0</property>
- <property name="pixels_inside_wrap">0</property>
- <property name="left_margin">0</property>
- <property name="right_margin">0</property>
- <property name="indent">0</property>
- <property name="text" translatable="yes"></property>
- <accessibility>
- <atkproperty name="AtkObject::accessible_name" translatable="yes">Task Description</atkproperty>
- </accessibility>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">expand|shrink|fill</property>
- <property name="y_options">expand|shrink|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label18">
- <property name="visible">True</property>
- <property name="label" translatable="yes">D_escription:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">description</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label24">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Date and Time&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox11">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="label25">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">12</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table4">
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="due-date-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Due date:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">due-date</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="start-date-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Sta_rt date:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">start-date</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox8">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="Custom" id="due-date">
- <property name="visible">True</property>
- <property name="creation_function">task_page_create_date_edit</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Mon, 14 Jun 2004 18:16:07 GMT</property>
- <accessibility>
- <atkrelation target="due-date-label" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="due-timezone">
- <property name="visible">True</property>
- <property name="creation_function">make_timezone_entry</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Tue, 19 Jun 2001 04:43:54 GMT</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox9">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="Custom" id="start-date">
- <property name="visible">True</property>
- <property name="creation_function">task_page_create_date_edit</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Mon, 14 Jun 2004 18:16:13 GMT</property>
- <accessibility>
- <atkrelation target="start-date-label" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="Custom" id="start-timezone">
- <property name="visible">True</property>
- <property name="creation_function">make_timezone_entry</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Tue, 19 Jun 2001 04:43:46 GMT</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="send-options-frame">
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment1">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0.11</property>
- <property name="yscale">1</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">12</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkButton" id="send-options-button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Ad_vanced send options</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="send-options-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Send Options&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/calendar/gui/dialogs/task-page.h b/calendar/gui/dialogs/task-page.h
deleted file mode 100644
index 0b2a98a950..0000000000
--- a/calendar/gui/dialogs/task-page.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Evolution calendar - Main page of the task editor dialog
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- * Miguel de Icaza <miguel@ximian.com>
- * Seth Alves <alves@hungry.com>
- * JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef TASK_PAGE_H
-#define TASK_PAGE_H
-
-#include "comp-editor-page.h"
-
-G_BEGIN_DECLS
-
-
-
-#define TYPE_TASK_PAGE (task_page_get_type ())
-#define TASK_PAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_TASK_PAGE, TaskPage))
-#define TASK_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_TASK_PAGE, TaskPageClass))
-#define IS_TASK_PAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_TASK_PAGE))
-#define IS_TASK_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TYPE_TASK_PAGE))
-
-typedef struct _TaskPagePrivate TaskPagePrivate;
-
-typedef struct {
- CompEditorPage page;
-
- /* Private data */
- TaskPagePrivate *priv;
-} TaskPage;
-
-typedef struct {
- CompEditorPageClass parent_class;
-} TaskPageClass;
-
-GtkType task_page_get_type (void);
-TaskPage *task_page_construct (TaskPage *epage);
-TaskPage *task_page_new (void);
-void task_page_show_options (TaskPage *page);
-void task_page_hide_options (TaskPage *page);
-
-
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/dialogs/url-editor-dialog.c b/calendar/gui/dialogs/url-editor-dialog.c
deleted file mode 100644
index b6402fd414..0000000000
--- a/calendar/gui/dialogs/url-editor-dialog.c
+++ /dev/null
@@ -1,385 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Gary Ekker <gekker@novell.com>
- *
- * Copyright 2004 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * UrlEditorDialog - a GtkObject which handles a libglade-loaded dialog
- * to edit the calendar preference settings.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
-#include "cal-prefs-dialog.h"
-#include "url-editor-dialog.h"
-
-#include "e-util/e-passwords.h"
-#include <gtk/gtk.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkoptionmenu.h>
-#include <gtk/gtktogglebutton.h>
-#include <libgnomeui/gnome-color-picker.h>
-#include <glade/glade.h>
-#include <e-util/e-dialog-widgets.h>
-#include <e-util/e-icon-factory.h>
-#include <widgets/misc/e-dateedit.h>
-#include <stdlib.h>
-#include <string.h>
-
-static gboolean get_widgets (UrlDialogData *data);
-static void init_widgets (UrlDialogData *data);
-
-static void url_editor_dialog_fb_url_changed (GtkEntry *url_entry, void *data);
-static void url_editor_dialog_fb_daily_toggled (GtkWidget *button, void *data);
-static void url_editor_dialog_fb_url_activated (GtkEntry *url_entry, void *data);
-static void url_editor_dialog_fb_ok_enable (GtkWidget *widget, void *data);
-
-/**
- * url_editor_dialog_new:
- *
- * Creates a new #UrlEditorDialog.
- *
- * Return value: a new #UrlEditorDialog.
- **/
-gboolean
-url_editor_dialog_new (DialogData *dialog_data, EPublishUri *uri)
-{
- int b;
-
- UrlDialogData *url_dlg_data = g_new0 (UrlDialogData, 1);
- url_dlg_data->xml = glade_xml_new (EVOLUTION_GLADEDIR "/url-editor-dialog.glade", NULL, NULL);
- if (!url_dlg_data->xml) {
- g_message ("url_editor_dialog_construct(): Could not load the Glade XML file!");
- return FALSE;
- }
-
- if (!get_widgets (url_dlg_data)) {
- g_message ("url_editor_dialog_construct(): Could not find all widgets in the XML file!");
- return FALSE;
- }
-
- url_dlg_data->url_dialog = (GtkWidget *) dialog_data;
- url_dlg_data->url_data = uri;
-
- init_widgets (url_dlg_data);
-
- if (uri->location && uri->username) {
- if (strlen(uri->location) != 0) {
- gtk_entry_set_text (url_dlg_data->url_entry,
- uri->location);
- }
- if (strlen(uri->username) != 0) {
- gtk_entry_set_text (url_dlg_data->username_entry,
- uri->username);
- }
- }
-
- uri->password = e_passwords_get_password ("Calendar", url_dlg_data->url_data->location);
-
- if (uri->password) {
- if (strlen(uri->password) != 0) {
- gtk_entry_set_text (url_dlg_data->password_entry,
- uri->password);
-
- e_dialog_toggle_set (url_dlg_data->remember_pw, TRUE);
- } else {
- e_dialog_toggle_set (url_dlg_data->remember_pw, FALSE);
- }
- }
-
- switch (uri->publish_freq) {
- case URI_PUBLISH_DAILY:
- e_dialog_radio_set (url_dlg_data->daily,
- URI_PUBLISH_DAILY,
- pub_frequency_type_map);
- break;
- case URI_PUBLISH_WEEKLY:
- e_dialog_radio_set (url_dlg_data->daily,
- URI_PUBLISH_WEEKLY,
- pub_frequency_type_map);
- break;
- case URI_PUBLISH_USER:
- default:
- e_dialog_radio_set (url_dlg_data->daily,
- URI_PUBLISH_USER,
- pub_frequency_type_map);
- }
-
- dialog_data->url_editor=TRUE;
- dialog_data->url_editor_dlg = (GtkWidget *) url_dlg_data;
- gtk_widget_set_sensitive ((GtkWidget *) url_dlg_data->ok, FALSE);
-
- b = gtk_dialog_run ((GtkDialog *) url_dlg_data->url_editor);
-
- if (b == GTK_RESPONSE_OK) {
- if ((GtkEntry *) url_dlg_data->url_entry) {
- url_editor_dialog_fb_url_activated (url_dlg_data->url_entry, url_dlg_data);
- url_dlg_data->url_data->username = g_strdup (gtk_entry_get_text ((GtkEntry *) url_dlg_data->username_entry));
- url_dlg_data->url_data->password = g_strdup (gtk_entry_get_text ((GtkEntry *) url_dlg_data->password_entry));
- if (e_dialog_toggle_get (url_dlg_data->remember_pw)) {
- e_passwords_add_password (url_dlg_data->url_data->location, url_dlg_data->url_data->password);
- e_passwords_remember_password ("Calendar", url_dlg_data->url_data->location);
- } else {
- e_passwords_forget_password ("Calendar", url_dlg_data->url_data->location);
- }
- }
- }
-
- gtk_widget_destroy (url_dlg_data->url_editor);
- g_object_unref (url_dlg_data->xml);
- g_free (url_dlg_data);
- url_dlg_data = NULL;
-
- return FALSE;
-}
-
-static gboolean
-get_widgets (UrlDialogData *data)
-{
-#define GW(name) glade_xml_get_widget (data->xml, name)
-
- data->url_editor = GW ("url_editor");
- data->calendar_list_label = GW ("calendar_list_label");
- data->url_dialog = GW ("fb_dialog");
- data->url_entry = GTK_ENTRY (GW ("url_entry"));
- data->daily = GW ("daily");
- data->weekly = GW ("weekly");
- data->user_publish = GW ("user_publish");
- data->scrolled_window = GW ("scrolled_window");
- data->username_entry = GTK_ENTRY (GW ("username_entry"));
- data->password_entry = GTK_ENTRY (GW ("password_entry"));
- data->remember_pw = GW ("remember_pw");
- data->cancel = GW ("cancel");
- data->ok = GW ("ok");
-
-#undef GW
-
- return (data ->url_editor
- && data->calendar_list_label
- && data->url_entry
- && data->daily
- && data->weekly
- && data->user_publish
- && data->scrolled_window
- && data->username_entry
- && data->password_entry
- && data->remember_pw
- && data->cancel
- && data->ok);
-}
-
-static void
-selection_changed_callback (ESourceSelector *selector,
- void *data)
-{
- UrlDialogData *url_dlg_data = (UrlDialogData *) data;
- GSList *selection = e_source_selector_get_selection (selector);
-
- if (selection != NULL) {
- GSList *p, *l = NULL;
-
- for (p = selection; p != NULL; p = p->next) {
- ESource *source = E_SOURCE(p->data);
- gchar* source_uid = g_strdup(e_source_peek_uid(source));
-
- l = g_slist_append (l, source_uid);
- }
- url_dlg_data->url_data->calendars = l;
- }
-
- e_source_selector_free_selection (selection);
- gtk_widget_set_sensitive ((GtkWidget *) url_dlg_data->ok, TRUE);
-}
-
-/* Connects any necessary signal handlers. */
-static void
-init_widgets (UrlDialogData *url_dlg_data)
-{
- GtkWidget *selector;
- ESourceList *source_list;
- GConfClient *gconf_client;
- GList *icon_list;
- GSList *p;
-
- gtk_widget_ensure_style (url_dlg_data->url_editor);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (url_dlg_data->url_editor)->vbox), 0);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (url_dlg_data->url_editor)->action_area), 12);
-
- g_signal_connect (url_dlg_data->url_entry, "changed",
- G_CALLBACK (url_editor_dialog_fb_url_changed),
- url_dlg_data);
-
- g_signal_connect (url_dlg_data->username_entry, "changed",
- G_CALLBACK (url_editor_dialog_fb_ok_enable),
- url_dlg_data);
-
- g_signal_connect (url_dlg_data->password_entry, "changed",
- G_CALLBACK (url_editor_dialog_fb_ok_enable),
- url_dlg_data);
-
- g_signal_connect (url_dlg_data->remember_pw, "toggled",
- G_CALLBACK (url_editor_dialog_fb_ok_enable),
- url_dlg_data);
-
- g_signal_connect (url_dlg_data->url_entry, "activate",
- G_CALLBACK (url_editor_dialog_fb_url_activated),
- url_dlg_data);
-
- g_signal_connect (url_dlg_data->daily, "toggled",
- G_CALLBACK (url_editor_dialog_fb_daily_toggled),
- url_dlg_data);
-
- g_signal_connect (url_dlg_data->weekly, "toggled",
- G_CALLBACK (url_editor_dialog_fb_daily_toggled),
- url_dlg_data);
-
- g_signal_connect (url_dlg_data->user_publish, "toggled",
- G_CALLBACK (url_editor_dialog_fb_daily_toggled),
- url_dlg_data);
-
-
- if (url_dlg_data->url_data->calendars) {
- ESource *source;
-
- gconf_client = gconf_client_get_default ();
- source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/calendar/sources");
- selector = e_source_selector_new (source_list);
-
- p = url_dlg_data->url_data->calendars;
- for (; p != NULL; p = p->next) {
- gchar *source_uid;
-
- source_uid = g_strdup (p->data);
- source = e_source_list_peek_source_by_uid (source_list, source_uid);
- e_source_selector_select_source ((ESourceSelector *)selector, source);
- g_free (source_uid);
- }
- } else {
- gconf_client = gconf_client_get_default ();
- source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/calendar/sources");
- selector = e_source_selector_new (source_list);
- }
- e_source_selector_show_selection ((ESourceSelector *) selector, TRUE);
- g_signal_connect (selector, "selection_changed",
- G_CALLBACK (selection_changed_callback),
- url_dlg_data);
-
- gtk_label_set_mnemonic_widget (GTK_LABEL (url_dlg_data->calendar_list_label),
- selector);
- gtk_widget_show (selector);
- gtk_container_add (GTK_CONTAINER (url_dlg_data->scrolled_window),
- selector);
-
- icon_list = e_icon_factory_get_icon_list ("stock_calendar");
- if (icon_list) {
- gtk_window_set_icon_list (GTK_WINDOW (url_dlg_data->url_editor), icon_list);
- g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
- g_list_free (icon_list);
- }
-
- gtk_widget_show (url_dlg_data->scrolled_window);
-}
-
-static void
-url_editor_dialog_fb_daily_toggled (GtkWidget *button,
- void *data)
-{
- UrlDialogData *url_dlg_data = (UrlDialogData *) data;
- enum publish_frequency frequency;
-
- frequency = e_dialog_radio_get (url_dlg_data->daily,
- pub_frequency_type_map);
- url_dlg_data->url_data->publish_freq = frequency;
- gtk_widget_set_sensitive ((GtkWidget *) url_dlg_data->ok, TRUE);
-}
-
-static gboolean
-is_valid_url (const gchar *url)
-{
- const gchar *p = url;
-
- if (strlen (url) == 0) {
- return FALSE;
- }
- while (*p) {
- if ((*p == '\\') || (*p == ' ')) {
- return FALSE;
- }
- p++;
- }
- return TRUE;
-}
-
-static void
-url_editor_dialog_fb_url_activated (GtkEntry *url_entry, void *data)
-{
- UrlDialogData *url_dlg_data = (UrlDialogData *) data;
-
- url_dlg_data->url_data->location = g_strdup (gtk_entry_get_text ((GtkEntry *) url_entry));
-}
-
-static void
-url_editor_dialog_fb_url_changed (GtkEntry *url_entry, void *data)
-{
- UrlDialogData *url_dlg_data = (UrlDialogData *) data;
- DialogData *url_dialog = (DialogData *) url_dlg_data->url_dialog;
-
- const gchar *entry_contents;
- GtkListStore *model;
- GtkTreeIter iter;
- gboolean valid;
-
- model = (GtkListStore *) gtk_tree_view_get_model (url_dialog->url_list);
-
- entry_contents = gtk_entry_get_text ((GtkEntry *) url_entry);
- if (!is_valid_url (entry_contents)) {
- gtk_widget_set_sensitive ((GtkWidget *) url_dlg_data->ok, FALSE);
- return;
- }
- /* duplicate check */
- valid = gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter);
- while (valid) {
- gchar *url_name;
- gtk_tree_model_get ((GtkTreeModel *) model, &iter,
- URL_LIST_LOCATION_COLUMN, &url_name,
- -1);
-
- if (!strcasecmp (url_name, entry_contents)) {
- gtk_widget_set_sensitive ((GtkWidget *) url_dlg_data->ok, FALSE);
- return;
- }
- valid = gtk_tree_model_iter_next ((GtkTreeModel *) model, &iter);
- }
- /* valid and unique */
- gtk_widget_set_sensitive (GTK_WIDGET (url_dlg_data->ok), TRUE);
- gtk_widget_grab_default (GTK_WIDGET (url_dlg_data->ok));
- gtk_entry_set_activates_default ((GtkEntry*) url_dlg_data->url_entry,
- TRUE);
-}
-
-static void url_editor_dialog_fb_ok_enable (GtkWidget *widget, void *data) {
- UrlDialogData *url_dlg_data = (UrlDialogData *) data;
-
- gtk_widget_set_sensitive (GTK_WIDGET (url_dlg_data->ok), TRUE);
-}
diff --git a/calendar/gui/dialogs/url-editor-dialog.glade b/calendar/gui/dialogs/url-editor-dialog.glade
deleted file mode 100644
index 27ddf1bd08..0000000000
--- a/calendar/gui/dialogs/url-editor-dialog.glade
+++ /dev/null
@@ -1,551 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-<requires lib="gnome"/>
-
-<widget class="GtkDialog" id="url_editor">
- <property name="visible">True</property>
- <property name="title" translatable="yes">Free/Busy Publishing Settings</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
- <property name="modal">False</property>
- <property name="default_width">380</property>
- <property name="default_height">508</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="has_separator">False</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="cancel">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="has_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-6</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="ok">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-5</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox13">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label26">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Publishing _Location&lt;/b&gt;</property>
- <property name="use_underline">True</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">url_entry</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox9">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label18">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="url_entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label25">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Publishing Frequency&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox10">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label29">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox12">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkRadioButton" id="daily">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Daily</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkRadioButton" id="weekly">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Weekly</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">daily</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkRadioButton" id="user_publish">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Manual</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">daily</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="calendar_list_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Free/Busy C_alendars&lt;/b&gt;</property>
- <property name="use_underline">True</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox11">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label30">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolled_window">
- <property name="height_request">150</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
- <child>
- <placeholder/>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label27">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Authentication&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox12">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label31">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table1">
- <property name="visible">True</property>
- <property name="n_rows">3</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label13">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Username:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">username_entry</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label14">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Password:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">password_entry</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="username_entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="password_entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">False</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="remember_pw">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Remember password</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/calendar/gui/dialogs/url-editor-dialog.h b/calendar/gui/dialogs/url-editor-dialog.h
deleted file mode 100644
index 877dc8a748..0000000000
--- a/calendar/gui/dialogs/url-editor-dialog.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Gary Ekker <gekker@novell.com>
- *
- * Copyright 2004, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * UrlEditorDialog - a GtkObject which handles a libglade-loaded dialog
- * to edit the calendar preference settings.
- */
-
-#ifndef _URL_EDITOR_DIALOG_H_
-#define _URL_EDITOR_DIALOG_H_
-
-G_BEGIN_DECLS
-
-#include <gtk/gtk.h>
-#include <glade/glade.h>
-
-#include "cal-prefs-dialog.h"
-#include <libedataserverui/e-source-selector.h>
-
-struct _UrlDialogData {
- /* Glade XML data */
- GladeXML *xml;
- GtkWidget *url_editor;
- GtkWidget *url_dialog;
-
- GtkEntry *url_entry;
- GtkWidget *daily;
- GtkWidget *weekly;
- GtkWidget *user_publish;
-
- GtkWidget *calendar_list_label;
- GtkWidget *scrolled_window;
-
- GtkEntry *username_entry;
- GtkEntry *password_entry;
- GtkWidget *remember_pw;
-
- GtkWidget *cancel;
- GtkWidget *ok;
- EPublishUri *url_data;
-};
-typedef struct _UrlDialogData UrlDialogData;
-
-gboolean
-url_editor_dialog_new (DialogData *dialog_data, EPublishUri *pub_uri);
-
-G_END_DECLS
-
-#endif /* _URL_EDITOR_DIALOG_H_ */
diff --git a/calendar/gui/e-alarm-list.c b/calendar/gui/e-alarm-list.c
deleted file mode 100644
index ff23cbeb2d..0000000000
--- a/calendar/gui/e-alarm-list.c
+++ /dev/null
@@ -1,670 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/* EAlarmList - list of calendar alarms with GtkTreeModel interface.
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- *
- * Authors: Hans Petter Jansson <hpj@ximian.com>
- */
-
-#include <config.h>
-#include <string.h>
-#include <gtk/gtktreemodel.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtktreednd.h>
-#include <libgnome/gnome-i18n.h>
-#include <glib.h>
-#include <libecal/e-cal-time-util.h>
-#include <e-util/e-time-utils.h>
-#include "calendar-config.h"
-#include "e-alarm-list.h"
-
-#define G_LIST(x) ((GList *) x)
-#define E_ALARM_LIST_IS_SORTED(list) (E_ALARM_LIST (list)->sort_column_id != -2)
-#define IS_VALID_ITER(dt_list, iter) (iter!= NULL && iter->user_data != NULL && \
- dt_list->stamp == iter->stamp)
-
-static GType column_types [E_ALARM_LIST_NUM_COLUMNS];
-
-static void e_alarm_list_init (EAlarmList *file_list);
-static void e_alarm_list_class_init (EAlarmListClass *class);
-static void e_alarm_list_tree_model_init (GtkTreeModelIface *iface);
-static void e_alarm_list_finalize (GObject *object);
-static guint e_alarm_list_get_flags (GtkTreeModel *tree_model);
-static gint e_alarm_list_get_n_columns (GtkTreeModel *tree_model);
-static GType e_alarm_list_get_column_type (GtkTreeModel *tree_model,
- gint index);
-static gboolean e_alarm_list_get_iter (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreePath *path);
-static GtkTreePath *e_alarm_list_get_path (GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-static void e_alarm_list_get_value (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- gint column,
- GValue *value);
-static gboolean e_alarm_list_iter_next (GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-static gboolean e_alarm_list_iter_children (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *parent);
-static gboolean e_alarm_list_iter_has_child (GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-static gint e_alarm_list_iter_n_children (GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-static gboolean e_alarm_list_iter_nth_child (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *parent,
- gint n);
-static gboolean e_alarm_list_iter_parent (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *child);
-
-static GObjectClass *parent_class = NULL;
-
-GtkType
-e_alarm_list_get_type (void)
-{
- static GType alarm_list_type = 0;
-
- if (!alarm_list_type) {
- static const GTypeInfo alarm_list_info =
- {
- sizeof (EAlarmListClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) e_alarm_list_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EAlarmList),
- 0,
- (GInstanceInitFunc) e_alarm_list_init,
- };
-
- static const GInterfaceInfo tree_model_info =
- {
- (GInterfaceInitFunc) e_alarm_list_tree_model_init,
- NULL,
- NULL
- };
-
- column_types [E_ALARM_LIST_COLUMN_DESCRIPTION] = G_TYPE_STRING;
-
- alarm_list_type = g_type_register_static (G_TYPE_OBJECT, "EAlarmList",
- &alarm_list_info, 0);
- g_type_add_interface_static (alarm_list_type,
- GTK_TYPE_TREE_MODEL,
- &tree_model_info);
- }
-
- return alarm_list_type;
-}
-
-static void
-e_alarm_list_class_init (EAlarmListClass *class)
-{
- GObjectClass *object_class;
-
- parent_class = g_type_class_peek_parent (class);
- object_class = (GObjectClass *) class;
-
- object_class->finalize = e_alarm_list_finalize;
-}
-
-static void
-e_alarm_list_tree_model_init (GtkTreeModelIface *iface)
-{
- iface->get_flags = e_alarm_list_get_flags;
- iface->get_n_columns = e_alarm_list_get_n_columns;
- iface->get_column_type = e_alarm_list_get_column_type;
- iface->get_iter = e_alarm_list_get_iter;
- iface->get_path = e_alarm_list_get_path;
- iface->get_value = e_alarm_list_get_value;
- iface->iter_next = e_alarm_list_iter_next;
- iface->iter_children = e_alarm_list_iter_children;
- iface->iter_has_child = e_alarm_list_iter_has_child;
- iface->iter_n_children = e_alarm_list_iter_n_children;
- iface->iter_nth_child = e_alarm_list_iter_nth_child;
- iface->iter_parent = e_alarm_list_iter_parent;
-}
-
-static void
-e_alarm_list_init (EAlarmList *alarm_list)
-{
- alarm_list->stamp = g_random_int ();
- alarm_list->columns_dirty = FALSE;
- alarm_list->list = NULL;
-}
-
-EAlarmList *
-e_alarm_list_new (void)
-{
- EAlarmList *alarm_list;
-
- alarm_list = E_ALARM_LIST (g_object_new (e_alarm_list_get_type (), NULL));
-
- return alarm_list;
-}
-
-static void
-all_rows_deleted (EAlarmList *alarm_list)
-{
- GtkTreePath *path;
- gint i;
-
- if (!alarm_list->list)
- return;
-
- path = gtk_tree_path_new ();
- i = g_list_length (alarm_list->list);
- gtk_tree_path_append_index (path, i);
-
- for ( ; i >= 0; i--) {
- gtk_tree_model_row_deleted (GTK_TREE_MODEL (alarm_list), path);
- gtk_tree_path_prev (path);
- }
-
- gtk_tree_path_free (path);
-}
-
-static void
-row_deleted (EAlarmList *alarm_list, gint n)
-{
- GtkTreePath *path;
-
- path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, n);
- gtk_tree_model_row_deleted (GTK_TREE_MODEL (alarm_list), path);
- gtk_tree_path_free (path);
-}
-
-static void
-row_added (EAlarmList *alarm_list, gint n)
-{
- GtkTreePath *path;
- GtkTreeIter iter;
-
- path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, n);
-
- if (gtk_tree_model_get_iter (GTK_TREE_MODEL (alarm_list), &iter, path))
- gtk_tree_model_row_inserted (GTK_TREE_MODEL (alarm_list), path, &iter);
-
- gtk_tree_path_free (path);
-}
-
-static void
-row_updated (EAlarmList *alarm_list, gint n)
-{
- GtkTreePath *path;
- GtkTreeIter iter;
-
- path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, n);
-
- if (gtk_tree_model_get_iter (GTK_TREE_MODEL (alarm_list), &iter, path))
- gtk_tree_model_row_changed (GTK_TREE_MODEL (alarm_list), path, &iter);
-
- gtk_tree_path_free (path);
-}
-
-static void
-e_alarm_list_finalize (GObject *object)
-{
- if (G_OBJECT_CLASS (parent_class)->finalize)
- (* G_OBJECT_CLASS (parent_class)->finalize) (object);
-}
-
-/* Fulfill the GtkTreeModel requirements */
-static guint
-e_alarm_list_get_flags (GtkTreeModel *tree_model)
-{
- g_return_val_if_fail (E_IS_ALARM_LIST (tree_model), 0);
-
- return GTK_TREE_MODEL_LIST_ONLY;
-}
-
-static gint
-e_alarm_list_get_n_columns (GtkTreeModel *tree_model)
-{
- EAlarmList *alarm_list = (EAlarmList *) tree_model;
-
- g_return_val_if_fail (E_IS_ALARM_LIST (tree_model), 0);
-
- alarm_list->columns_dirty = TRUE;
- return E_ALARM_LIST_NUM_COLUMNS;
-}
-
-static GType
-e_alarm_list_get_column_type (GtkTreeModel *tree_model,
- gint index)
-{
- EAlarmList *alarm_list = (EAlarmList *) tree_model;
-
- g_return_val_if_fail (E_IS_ALARM_LIST (tree_model), G_TYPE_INVALID);
- g_return_val_if_fail (index < E_ALARM_LIST_NUM_COLUMNS &&
- index >= 0, G_TYPE_INVALID);
-
- alarm_list->columns_dirty = TRUE;
- return column_types [index];
-}
-
-const ECalComponentAlarm *
-e_alarm_list_get_alarm (EAlarmList *alarm_list, GtkTreeIter *iter)
-{
- g_return_val_if_fail (IS_VALID_ITER (alarm_list, iter), NULL);
-
- return G_LIST (iter->user_data)->data;
-}
-
-static void
-free_alarm (ECalComponentAlarm *alarm)
-{
- e_cal_component_alarm_free (alarm);
-}
-
-static ECalComponentAlarm *
-copy_alarm (const ECalComponentAlarm *alarm)
-{
- return e_cal_component_alarm_clone ((ECalComponentAlarm *) alarm);
-}
-
-void
-e_alarm_list_set_alarm (EAlarmList *alarm_list, GtkTreeIter *iter,
- const ECalComponentAlarm *alarm)
-{
- ECalComponentAlarm *alarm_old;
-
- g_return_if_fail (IS_VALID_ITER (alarm_list, iter));
-
- alarm_old = G_LIST (iter->user_data)->data;
- free_alarm (alarm_old);
- G_LIST (iter->user_data)->data = copy_alarm (alarm);
- row_updated (alarm_list, g_list_position (alarm_list->list, G_LIST (iter->user_data)));
-}
-
-void
-e_alarm_list_append (EAlarmList *alarm_list, GtkTreeIter *iter,
- const ECalComponentAlarm *alarm)
-{
- g_return_if_fail (alarm != NULL);
-
- alarm_list->list = g_list_append (alarm_list->list, copy_alarm (alarm));
- row_added (alarm_list, g_list_length (alarm_list->list) - 1);
-
- if (iter) {
- iter->user_data = g_list_last (alarm_list->list);
- iter->stamp = alarm_list->stamp;
- }
-}
-
-void
-e_alarm_list_remove (EAlarmList *alarm_list, GtkTreeIter *iter)
-{
- gint n;
-
- g_return_if_fail (IS_VALID_ITER (alarm_list, iter));
-
- n = g_list_position (alarm_list->list, G_LIST (iter->user_data));
- free_alarm ((ECalComponentAlarm *) G_LIST (iter->user_data)->data);
- alarm_list->list = g_list_delete_link (alarm_list->list, G_LIST (iter->user_data));
- row_deleted (alarm_list, n);
-}
-
-void
-e_alarm_list_clear (EAlarmList *alarm_list)
-{
- GList *l;
-
- all_rows_deleted (alarm_list);
-
- for (l = alarm_list->list; l; l = g_list_next (l)) {
- free_alarm ((ECalComponentAlarm *) l->data);
- }
-
- g_list_free (alarm_list->list);
- alarm_list->list = NULL;
-}
-
-static gboolean
-e_alarm_list_get_iter (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path)
-{
- EAlarmList *alarm_list = (EAlarmList *) tree_model;
- GList *l;
- gint i;
-
- g_return_val_if_fail (E_IS_ALARM_LIST (tree_model), FALSE);
- g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE);
-
- if (!alarm_list->list)
- return FALSE;
-
- alarm_list->columns_dirty = TRUE;
-
- i = gtk_tree_path_get_indices (path)[0];
- l = g_list_nth (alarm_list->list, i);
- if (!l)
- return FALSE;
-
- iter->user_data = l;
- iter->stamp = alarm_list->stamp;
- return TRUE;
-}
-
-static GtkTreePath *
-e_alarm_list_get_path (GtkTreeModel *tree_model,
- GtkTreeIter *iter)
-{
- EAlarmList *alarm_list = (EAlarmList *) tree_model;
- GtkTreePath *retval;
- GList *l;
-
- g_return_val_if_fail (E_IS_ALARM_LIST (tree_model), NULL);
- g_return_val_if_fail (iter->stamp == E_ALARM_LIST (tree_model)->stamp, NULL);
-
- l = iter->user_data;
- retval = gtk_tree_path_new ();
- gtk_tree_path_append_index (retval, g_list_position (alarm_list->list, l));
- return retval;
-}
-
-/* Builds a string for the duration of the alarm. If the duration is zero, returns NULL. */
-static char *
-get_alarm_duration_string (struct icaldurationtype *duration)
-{
- GString *string = g_string_new (NULL);
- char *ret;
- gboolean have_something;
-
- have_something = FALSE;
-
- if (duration->days >= 1) {
- g_string_sprintf (string, ngettext("%d day", "%d days", duration->days), duration->days);
- have_something = TRUE;
- }
-
- if (duration->weeks >= 1) {
- g_string_sprintf (string, ngettext("%d week","%d weeks", duration->weeks), duration->weeks);
- have_something = TRUE;
- }
-
- if (duration->hours >= 1) {
- g_string_sprintf (string, ngettext("%d hour", "%d hours", duration->hours), duration->hours);
- have_something = TRUE;
- }
-
- if (duration->minutes >= 1) {
- g_string_sprintf (string, ngettext("%d minute", "%d minutes", duration->minutes), duration->minutes);
- have_something = TRUE;
- }
-
- if (duration->seconds >= 1) {
- g_string_sprintf (string, ngettext("%d second", "%d seconds", duration->seconds), duration->seconds);
- have_something = TRUE;
- }
-
- if (have_something) {
- ret = string->str;
- g_string_free (string, FALSE);
- return ret;
- } else {
- g_string_free (string, TRUE);
- return NULL;
- }
-}
-
-static char *
-get_alarm_string (ECalComponentAlarm *alarm)
-{
- ECalComponentAlarmAction action;
- ECalComponentAlarmTrigger trigger;
- char string[256];
- char *base, *str = NULL, *dur;
-
- string [0] = '\0';
-
- e_cal_component_alarm_get_action (alarm, &action);
- e_cal_component_alarm_get_trigger (alarm, &trigger);
-
- switch (action) {
- case E_CAL_COMPONENT_ALARM_AUDIO:
- base = _("Play a sound");
- break;
-
- case E_CAL_COMPONENT_ALARM_DISPLAY:
- base = _("Pop up an alert");
- break;
-
- case E_CAL_COMPONENT_ALARM_EMAIL:
- base = _("Send an email");
- break;
-
- case E_CAL_COMPONENT_ALARM_PROCEDURE:
- base = _("Run a program");
- break;
-
- case E_CAL_COMPONENT_ALARM_NONE:
- case E_CAL_COMPONENT_ALARM_UNKNOWN:
- default:
- base = _("Unknown action to be performed");
- break;
- }
-
- /* FIXME: This does not look like it will localize correctly. */
-
- switch (trigger.type) {
- case E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START:
- dur = get_alarm_duration_string (&trigger.u.rel_duration);
-
- if (dur) {
- if (trigger.u.rel_duration.is_neg)
- str = g_strdup_printf (_("%s %s before the start of the appointment"),
- base, dur);
- else
- str = g_strdup_printf (_("%s %s after the start of the appointment"),
- base, dur);
-
- g_free (dur);
- } else
- str = g_strdup_printf (_("%s at the start of the appointment"), base);
-
- break;
-
- case E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_END:
- dur = get_alarm_duration_string (&trigger.u.rel_duration);
-
- if (dur) {
- if (trigger.u.rel_duration.is_neg)
- str = g_strdup_printf (_("%s %s before the end of the appointment"),
- base, dur);
- else
- str = g_strdup_printf (_("%s %s after the end of the appointment"),
- base, dur);
-
- g_free (dur);
- } else
- str = g_strdup_printf (_("%s at the end of the appointment"), base);
-
- break;
-
- case E_CAL_COMPONENT_ALARM_TRIGGER_ABSOLUTE: {
- struct icaltimetype itt;
- icaltimezone *utc_zone, *current_zone;
- struct tm tm;
- char buf[256];
-
- /* Absolute triggers come in UTC, so convert them to the local timezone */
-
- itt = trigger.u.abs_time;
-
- utc_zone = icaltimezone_get_utc_timezone ();
- current_zone = calendar_config_get_icaltimezone ();
-
- tm = icaltimetype_to_tm_with_zone (&itt, utc_zone, current_zone);
-
- e_time_format_date_and_time (&tm, calendar_config_get_24_hour_format (),
- FALSE, FALSE, buf, sizeof (buf));
-
- str = g_strdup_printf (_("%s at %s"), base, buf);
-
- break; }
-
- case E_CAL_COMPONENT_ALARM_TRIGGER_NONE:
- default:
- str = g_strdup_printf (_("%s for an unknown trigger type"), base);
- break;
- }
-
- return str;
-}
-
-static void
-e_alarm_list_get_value (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- gint column,
- GValue *value)
-{
- EAlarmList *alarm_list = E_ALARM_LIST (tree_model);
- ECalComponentAlarm *alarm;
- GList *l;
- const gchar *str;
-
- g_return_if_fail (E_IS_ALARM_LIST (tree_model));
- g_return_if_fail (column < E_ALARM_LIST_NUM_COLUMNS);
- g_return_if_fail (E_ALARM_LIST (tree_model)->stamp == iter->stamp);
- g_return_if_fail (IS_VALID_ITER (alarm_list, iter));
-
- g_value_init (value, column_types [column]);
-
- if (!alarm_list->list)
- return;
-
- l = iter->user_data;
- alarm = l->data;
-
- if (!alarm)
- return;
-
- switch (column) {
- case E_ALARM_LIST_COLUMN_DESCRIPTION:
- str = get_alarm_string (alarm);
- g_value_set_string (value, str);
- break;
- }
-}
-
-static gboolean
-e_alarm_list_iter_next (GtkTreeModel *tree_model,
- GtkTreeIter *iter)
-{
- GList *l;
-
- g_return_val_if_fail (E_IS_ALARM_LIST (tree_model), FALSE);
- g_return_val_if_fail (IS_VALID_ITER (E_ALARM_LIST (tree_model), iter), FALSE);
-
- if (!E_ALARM_LIST (tree_model)->list)
- return FALSE;
-
- l = iter->user_data;
- l = g_list_next (l);
- if (l) {
- iter->user_data = l;
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-e_alarm_list_iter_children (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *parent)
-{
- EAlarmList *alarm_list = E_ALARM_LIST (tree_model);
-
- /* this is a list, nodes have no children */
- if (parent)
- return FALSE;
-
- /* but if parent == NULL we return the list itself as children of the
- * "root" */
-
- if (!alarm_list->list)
- return FALSE;
-
- iter->stamp = E_ALARM_LIST (tree_model)->stamp;
- iter->user_data = alarm_list->list;
- return TRUE;
-}
-
-static gboolean
-e_alarm_list_iter_has_child (GtkTreeModel *tree_model,
- GtkTreeIter *iter)
-{
- g_return_val_if_fail (IS_VALID_ITER (E_ALARM_LIST (tree_model), iter), FALSE);
- return FALSE;
-}
-
-static gint
-e_alarm_list_iter_n_children (GtkTreeModel *tree_model,
- GtkTreeIter *iter)
-{
- EAlarmList *alarm_list = E_ALARM_LIST (tree_model);
-
- g_return_val_if_fail (E_IS_ALARM_LIST (tree_model), -1);
-
- if (iter == NULL)
- return g_list_length (alarm_list->list);
-
- g_return_val_if_fail (E_ALARM_LIST (tree_model)->stamp == iter->stamp, -1);
- return 0;
-}
-
-static gboolean
-e_alarm_list_iter_nth_child (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *parent,
- gint n)
-{
- EAlarmList *alarm_list = E_ALARM_LIST (tree_model);
-
- g_return_val_if_fail (E_IS_ALARM_LIST (tree_model), FALSE);
-
- if (parent)
- return FALSE;
-
- if (alarm_list->list) {
- GList *l;
-
- l = g_list_nth (alarm_list->list, n);
- if (!l)
- return FALSE;
-
- iter->stamp = alarm_list->stamp;
- iter->user_data = l;
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-e_alarm_list_iter_parent (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *child)
-{
- return FALSE;
-}
diff --git a/calendar/gui/e-alarm-list.h b/calendar/gui/e-alarm-list.h
deleted file mode 100644
index 93cc8ac58a..0000000000
--- a/calendar/gui/e-alarm-list.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/* EAlarmList - list of calendar alarms with GtkTreeModel interface.
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- *
- * Authors: Hans Petter Jansson <hpj@ximian.com>
- */
-
-#ifndef E_ALARM_LIST_H
-#define E_ALARM_LIST_H
-
-#include <gtk/gtktreemodel.h>
-#include <libecal/e-cal-component.h>
-
-G_BEGIN_DECLS
-
-#define E_TYPE_ALARM_LIST (e_alarm_list_get_type ())
-#define E_ALARM_LIST(obj) (GTK_CHECK_CAST ((obj), E_TYPE_ALARM_LIST, EAlarmList))
-#define E_ALARM_LIST_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_ALARM_LIST, EAlarmListClass))
-#define E_IS_ALARM_LIST(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_ALARM_LIST))
-#define E_IS_ALARM_LIST_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_ALARM_LIST))
-#define E_ALARM_LIST_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), E_TYPE_ALARM_LIST, EAlarmListClass))
-
-typedef struct _EAlarmList EAlarmList;
-typedef struct _EAlarmListClass EAlarmListClass;
-
-typedef enum
-{
- E_ALARM_LIST_COLUMN_DESCRIPTION,
-
- E_ALARM_LIST_NUM_COLUMNS
-}
-EAlarmListColumnType;
-
-struct _EAlarmList
-{
- GObject parent;
-
- /* Private */
-
- gint stamp;
- GList *list;
-
- guint columns_dirty : 1;
-};
-
-struct _EAlarmListClass
-{
- GObjectClass parent_class;
-};
-
-GtkType e_alarm_list_get_type (void);
-EAlarmList *e_alarm_list_new (void);
-
-const ECalComponentAlarm *e_alarm_list_get_alarm (EAlarmList *alarm_list, GtkTreeIter *iter);
-void e_alarm_list_set_alarm (EAlarmList *alarm_list, GtkTreeIter *iter,
- const ECalComponentAlarm *datetime);
-void e_alarm_list_append (EAlarmList *alarm_list, GtkTreeIter *iter,
- const ECalComponentAlarm *datetime);
-void e_alarm_list_remove (EAlarmList *alarm_list, GtkTreeIter *iter);
-void e_alarm_list_clear (EAlarmList *alarm_list);
-
-G_END_DECLS
-
-#endif /* E_ALARM_LIST_H */
diff --git a/calendar/gui/e-cal-component-preview.c b/calendar/gui/e-cal-component-preview.c
deleted file mode 100644
index 0a4c777c67..0000000000
--- a/calendar/gui/e-cal-component-preview.c
+++ /dev/null
@@ -1,441 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-tasks.c
- *
- * Copyright (C) 2001-2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Authors: Federico Mena Quintero <federico@ximian.com>
- * Damon Chaplin <damon@ximian.com>
- * Rodrigo Moya <rodrigo@ximian.com>
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-#include <gtk/gtk.h>
-#include <libgnomevfs/gnome-vfs-ops.h>
-#include <libedataserver/e-categories.h>
-#include <libecal/e-cal-time-util.h>
-#include <gtkhtml/gtkhtml.h>
-#include <gtkhtml/gtkhtml-stream.h>
-#include <e-util/e-time-utils.h>
-#include <e-util/e-categories-config.h>
-#include "calendar-config.h"
-#include "e-cal-component-preview.h"
-
-struct _ECalComponentPreviewPrivate {
- GtkWidget *html;
-
- icaltimezone *zone;
-};
-
-G_DEFINE_TYPE (ECalComponentPreview, e_cal_component_preview, GTK_TYPE_TABLE);
-
-static void
-on_link_clicked (GtkHTML *html, const char *url, gpointer data)
-{
- GError *err = NULL;
-
- gnome_url_show (url, &err);
-
- if (err) {
- g_warning ("gnome_url_show: %s", err->message);
- g_error_free (err);
- }
-}
-
-static void
-on_url_cb (GtkHTML *html, const char *url, gpointer data)
-{
-#if 0
- char *msg;
- ECalComponentPreview *preview = data;
-
- if (url && *url) {
- msg = g_strdup_printf (_("Click to open %s"), url);
- e_calendar_table_set_status_message (e_tasks_get_calendar_table (tasks), msg);
- g_free (msg);
- } else
- e_calendar_table_set_status_message (e_tasks_get_calendar_table (tasks), NULL);
-#endif
-}
-
-/* Callback used when the user selects a URL in the HTML widget */
-static void
-url_requested_cb (GtkHTML *html, const char *url, GtkHTMLStream *stream, gpointer data)
-{
- if (!strncmp ("file:///", url, strlen ("file:///"))) {
- GnomeVFSHandle *handle;
- GnomeVFSResult result;
- char buffer[4096];
-
- if (gnome_vfs_open (&handle, url, GNOME_VFS_OPEN_READ) == GNOME_VFS_OK) {
- do {
- GnomeVFSFileSize bread;
-
- result = gnome_vfs_read (handle, buffer, sizeof (buffer), &bread);
- if (result == GNOME_VFS_OK)
- gtk_html_stream_write (stream, buffer, bread);
- } while (result == GNOME_VFS_OK);
-
- gnome_vfs_close (handle);
- }
- }
-}
-
-/* Converts a time_t to a string, relative to the specified timezone */
-static char *
-timet_to_str_with_zone (ECalComponentDateTime *dt, ECal *ecal, icaltimezone *default_zone)
-{
- struct icaltimetype itt;
- icaltimezone *zone;
- struct tm tm;
- char buf[256];
-
- if (dt->tzid) {
- /* If we can't find the zone, we'll guess its "local" */
- if (!e_cal_get_timezone (ecal, dt->tzid, &zone, NULL))
- zone = NULL;
- } else if (dt->value->is_utc) {
- zone = icaltimezone_get_utc_timezone ();
- } else {
- zone = NULL;
- }
-
-
- itt = *dt->value;
- if (zone)
- icaltimezone_convert_time (&itt, zone, default_zone);
- tm = icaltimetype_to_tm (&itt);
-
- e_time_format_date_and_time (&tm, calendar_config_get_24_hour_format (),
- FALSE, FALSE, buf, sizeof (buf));
-
- return g_locale_to_utf8 (buf, -1, NULL, NULL, NULL);
-}
-
-static void
-write_html (GtkHTMLStream *stream, ECal *ecal, ECalComponent *comp, icaltimezone *default_zone)
-{
- ECalComponentText text;
- ECalComponentDateTime dt;
- gchar *str;
- GSList *l;
- icalproperty_status status;
- const char *location;
- int *priority_value;
-
- g_return_if_fail (E_IS_CAL_COMPONENT (comp));
-
- /* write document header */
- e_cal_component_get_summary (comp, &text);
-
- if (text.value)
- gtk_html_stream_printf (stream,
- "<HTML><BODY><H1>%s</H1>",
- text.value);
- else
- gtk_html_stream_printf (stream,
- "<HTML><BODY><H1><I>%s</I></H1>",
- _("Untitled"));
-
-
- /* write icons for the categories */
- e_cal_component_get_categories_list (comp, &l);
- if (l) {
- GSList *node;
-
- for (node = l; node != NULL; node = node->next) {
- const char *icon_file;
-
- icon_file = e_categories_get_icon_file_for ((const char *) node->data);
- if (icon_file) {
- gtk_html_stream_printf (stream, "<IMG ALT=\"%s\" SRC=\"file://%s\">",
- (const char *) node->data, icon_file);
- }
- }
-
- e_cal_component_free_categories_list (l);
-
- gtk_html_stream_printf (stream, "<BR><BR><BR>");
- }
-
- /* Start table */
- gtk_html_stream_printf (stream, "<TABLE BORDER=\"0\" WIDTH=\"80%%\">"
- "<TR><TD VALIGN=\"TOP\" ALIGN=\"RIGHT\" WIDTH=\"15%%\"></TD></TR>");
-
- /* write location */
- e_cal_component_get_location (comp, &location);
- if (location)
- gtk_html_stream_printf (stream, "<TR><TD VALIGN=\"TOP\" ALIGN=\"RIGHT\" WIDTH=\"15%%\"><B>%s</B></TD><TD>%s</TD></TR>",
- _("Summary:"), text.value);
-
- /* write start date */
- e_cal_component_get_dtstart (comp, &dt);
- if (dt.value != NULL) {
- str = timet_to_str_with_zone (&dt, ecal, default_zone);
- gtk_html_stream_printf (stream, "<TR><TD VALIGN=\"TOP\" ALIGN=\"RIGHT\"><B>%s</B></TD><TD>%s</TD></TR>",
- _("Start Date:"), str);
-
- e_cal_component_free_datetime (&dt);
- g_free (str);
- }
-
- /* write end date */
- e_cal_component_get_dtend (comp, &dt);
- if (dt.value != NULL) {
- str = timet_to_str_with_zone (&dt, ecal, default_zone);
- gtk_html_stream_printf (stream, "<TR><TD VALIGN=\"TOP\" ALIGN=\"RIGHT\"><B>%s</B></TD><TD>%s</TD></TR>",
- _("Start Date:"), str);
-
- e_cal_component_free_datetime (&dt);
- g_free (str);
- }
-
- /* write Due Date */
- e_cal_component_get_due (comp, &dt);
- if (dt.value != NULL) {
- str = timet_to_str_with_zone (&dt, ecal, default_zone);
- gtk_html_stream_printf (stream, "<TR><TD VALIGN=\"TOP\" ALIGN=\"RIGHT\"><B>%s</B></TD><TD>%s</TD></TR>",
- _("Due Date:"), str);
-
- e_cal_component_free_datetime (&dt);
- g_free (str);
- }
-
- /* write status */
- gtk_html_stream_printf (stream, "<TR><TD VALIGN=\"TOP\" ALIGN=\"RIGHT\"><B>%s</B></TD>", _("Status:"));
- e_cal_component_get_status (comp, &status);
- switch (status) {
- case ICAL_STATUS_INPROCESS :
- str = g_strdup (_("In Progress"));
- break;
- case ICAL_STATUS_COMPLETED :
- str = g_strdup (_("Completed"));
- break;
- case ICAL_STATUS_CANCELLED :
- str = g_strdup (_("Cancelled"));
- break;
- case ICAL_STATUS_NONE :
- default :
- str = g_strdup (_("Not Started"));
- break;
- }
-
- gtk_html_stream_printf (stream, "<TD>%s</TD></TR>", str);
- g_free (str);
-
- /* write priority */
- e_cal_component_get_priority (comp, &priority_value);
- if (priority_value && *priority_value != 0) {
- gtk_html_stream_printf (stream, "<TR><TD VALIGN=\"TOP\" ALIGN=\"RIGHT\"><B>%s</B></TD>", _("Priority:"));
- if (*priority_value <= 4)
- str = g_strdup (_("High"));
- else if (*priority_value == 5)
- str = g_strdup (_("Normal"));
- else
- str = g_strdup (_("Low"));
-
- gtk_html_stream_printf (stream, "<TD>%s</TD></TR>", str);
-
- g_free (str);
- e_cal_component_free_priority (priority_value);
- }
-
- /* write description and URL */
- gtk_html_stream_printf (stream, "<TR><TD COLSPAN=\"2\"><HR></TD></TR>");
-
- e_cal_component_get_description_list (comp, &l);
- if (l) {
- GSList *node;
-
- gtk_html_stream_printf (stream, "<TR><TD VALIGN=\"TOP\" ALIGN=\"RIGHT\"><B>%s</B></TD>", _("Description:"));
-
- gtk_html_stream_printf (stream, "<TD>");
-
- for (node = l; node != NULL; node = node->next) {
- gint i;
- GString *str = g_string_new ("");;
-
- text = * (ECalComponentText *) node->data;
- for (i = 0; i < strlen (text.value ? text.value : 0); i++) {
- if (text.value[i] == '\n')
- str = g_string_append (str, "<BR>");
- else if (text.value[i] == '<')
- str = g_string_append (str, "&lt;");
- else if (text.value[i] == '>')
- str = g_string_append (str, "&gt;");
- else
- str = g_string_append_c (str, text.value[i]);
- }
-
- gtk_html_stream_printf (stream, str->str);
- g_string_free (str, TRUE);
- }
-
- gtk_html_stream_printf (stream, "</TD></TR>");
-
- e_cal_component_free_text_list (l);
- }
-
- /* URL */
- e_cal_component_get_url (comp, (const char **) &str);
- if (str) {
- gtk_html_stream_printf (stream, "<TR><TD VALIGN=\"TOP\" ALIGN=\"RIGHT\"><B>%s</B></TD>", _("Web Page:"));
- gtk_html_stream_printf (stream, "<TD><A HREF=\"%s\">%s</A></TD></TR>", str, str);
- }
-
- gtk_html_stream_printf (stream, "</TABLE>");
-
- /* close document */
- gtk_html_stream_printf (stream, "</BODY></HTML>");
-}
-
-static void
-e_cal_component_preview_init (ECalComponentPreview *preview)
-{
- ECalComponentPreviewPrivate *priv;
- GtkWidget *scroll;
-
- priv = g_new0 (ECalComponentPreviewPrivate, 1);
- preview->priv = priv;
-
- priv->html = gtk_html_new ();
- gtk_html_set_default_content_type (GTK_HTML (priv->html), "charset=utf-8");
- gtk_html_load_empty (GTK_HTML (priv->html));
-
- g_signal_connect (G_OBJECT (priv->html), "url_requested",
- G_CALLBACK (url_requested_cb), NULL);
- g_signal_connect (G_OBJECT (priv->html), "link_clicked",
- G_CALLBACK (on_link_clicked), preview);
- g_signal_connect (G_OBJECT (priv->html), "on_url",
- G_CALLBACK (on_url_cb), preview);
-
- scroll = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_IN);
-
- gtk_container_add (GTK_CONTAINER (scroll), priv->html);
- gtk_container_add (GTK_CONTAINER (preview), scroll);
- gtk_widget_show_all (scroll);
-
- priv->zone = icaltimezone_get_utc_timezone ();
-}
-
-static void
-e_cal_component_preview_destroy (GtkObject *object)
-{
- ECalComponentPreview *preview;
- ECalComponentPreviewPrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (E_IS_CAL_COMPONENT_PREVIEW (object));
-
- preview = E_CAL_COMPONENT_PREVIEW (object);
- priv = preview->priv;
-
- if (priv) {
-
- g_free (priv);
- preview->priv = NULL;
- }
-
- if (GTK_OBJECT_CLASS (e_cal_component_preview_parent_class)->destroy)
- (* GTK_OBJECT_CLASS (e_cal_component_preview_parent_class)->destroy) (object);
-}
-
-static void
-e_cal_component_preview_class_init (ECalComponentPreviewClass *klass)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *) klass;
-
- object_class->destroy = e_cal_component_preview_destroy;
-}
-
-GtkWidget *
-e_cal_component_preview_new (void)
-{
- ECalComponentPreview *preview;
-
- preview = g_object_new (e_cal_component_preview_get_type (), NULL);
-
- return GTK_WIDGET (preview);
-}
-
-icaltimezone *
-e_cal_component_preview_get_default_timezone (ECalComponentPreview *preview)
-{
- ECalComponentPreviewPrivate *priv;
-
- g_return_val_if_fail (preview != NULL, NULL);
- g_return_val_if_fail (E_IS_CAL_COMPONENT_PREVIEW (preview), NULL);
-
- priv = preview->priv;
-
- return priv->zone;
-}
-
-void
-e_cal_component_preview_set_default_timezone (ECalComponentPreview *preview, icaltimezone *zone)
-{
- ECalComponentPreviewPrivate *priv;
-
- g_return_if_fail (preview != NULL);
- g_return_if_fail (E_IS_CAL_COMPONENT_PREVIEW (preview));
- g_return_if_fail (zone != NULL);
-
- priv = preview->priv;
-
- priv->zone = zone;
-}
-
-void
-e_cal_component_preview_display (ECalComponentPreview *preview, ECal *ecal, ECalComponent *comp)
-{
- ECalComponentPreviewPrivate *priv;
- GtkHTMLStream *stream;
-
- g_return_if_fail (preview != NULL);
- g_return_if_fail (E_IS_CAL_COMPONENT_PREVIEW (preview));
- g_return_if_fail (comp != NULL);
- g_return_if_fail (E_IS_CAL_COMPONENT (comp));
-
- priv = preview->priv;
-
- stream = gtk_html_begin (GTK_HTML (priv->html));
- write_html (stream, ecal, comp, priv->zone);
- gtk_html_stream_close (stream, GTK_HTML_STREAM_OK);
-}
-
-void
-e_cal_component_preview_clear (ECalComponentPreview *preview)
-{
- ECalComponentPreviewPrivate *priv;
-
- g_return_if_fail (preview != NULL);
- g_return_if_fail (E_IS_CAL_COMPONENT_PREVIEW (preview));
-
- priv = preview->priv;
-
- gtk_html_load_empty (GTK_HTML (priv->html));
-}
-
diff --git a/calendar/gui/e-cal-component-preview.h b/calendar/gui/e-cal-component-preview.h
deleted file mode 100644
index b2f02f813c..0000000000
--- a/calendar/gui/e-cal-component-preview.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-cal-component-preview.h
- *
- * Copyright (C) 2004 Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Authors: Federico Mena Quintero <federico@ximian.com>
- * Damon Chaplin <damon@ximian.com>
- */
-
-#ifndef _E_CAL_COMPONENT_PREVIEW_H_
-#define _E_CAL_COMPONENT_PREVIEW_H_
-
-#include <gtk/gtktable.h>
-#include <libecal/e-cal.h>
-
-#define E_TYPE_CAL_COMPONENT_PREVIEW (e_cal_component_preview_get_type ())
-#define E_CAL_COMPONENT_PREVIEW(obj) (GTK_CHECK_CAST ((obj), E_TYPE_CAL_COMPONENT_PREVIEW, ECalComponentPreview))
-#define E_CAL_COMPONENT_PREVIEW_CLASS(klass) (GTK_CHECK_CAST_CLASS ((klass), E_TYPE_CAL_COMPONENT_PREVIEW, \
- ECalComponentPreviewClass))
-#define E_IS_CAL_COMPONENT_PREVIEW(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_CAL_COMPONENT_PREVIEW))
-#define E_IS_CAL_COMPONENT_PREVIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_CAL_COMPONENT_PREVIEW))
-
-typedef struct _ECalComponentPreview ECalComponentPreview;
-typedef struct _ECalComponentPreviewClass ECalComponentPreviewClass;
-typedef struct _ECalComponentPreviewPrivate ECalComponentPreviewPrivate;
-
-struct _ECalComponentPreview {
- GtkTable table;
-
- /* Private data */
- ECalComponentPreviewPrivate *priv;
-};
-
-struct _ECalComponentPreviewClass {
- GtkTableClass parent_class;
-
- /* Notification signals */
- void (* selection_changed) (ECalComponentPreview *preview, int n_selected);
-};
-
-
-GtkType e_cal_component_preview_get_type (void);
-GtkWidget *e_cal_component_preview_new (void);
-
-icaltimezone *e_cal_component_preview_get_default_timezone (ECalComponentPreview *preview);
-void e_cal_component_preview_set_default_timezone (ECalComponentPreview *preview, icaltimezone *zone);
-
-void e_cal_component_preview_display (ECalComponentPreview *preview, ECal *ecal, ECalComponent *comp);
-void e_cal_component_preview_clear (ECalComponentPreview *preview);
-
-#endif /* _E_CAL_COMPONENT_PREVIEW_H_ */
diff --git a/calendar/gui/e-cal-config.c b/calendar/gui/e-cal-config.c
deleted file mode 100644
index 81e818c806..0000000000
--- a/calendar/gui/e-cal-config.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Authors: David Trowbridge <trowbrds@cs.colorado.edu>
- *
- * Copyright (C) 2004 Novell, Inc (www.novell.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkwidget.h>
-#include "e-cal-config.h"
-
-static GObjectClass *ecp_parent_class;
-static GObjectClass *ecph_parent_class;
-
-struct _ECalConfigPrivate {
- guint source_changed_id;
-};
-
-#define _PRIVATE(o) (g_type_instance_get_private ((GTypeInstance *)o, e_cal_config_get_type ()))
-
-static void
-ecp_init (GObject *o)
-{
-}
-
-static void
-ecp_target_free (EConfig *ec, EConfigTarget *t)
-{
- struct _ECalConfigPrivate *p = _PRIVATE (ec);
-
- if (ec->target == t) {
- switch (t->type) {
- case EC_CONFIG_TARGET_SOURCE: {
- ECalConfigTargetSource *s = (ECalConfigTargetSource *)t;
-
- if (p->source_changed_id) {
- g_signal_handler_disconnect (s->source, p->source_changed_id);
- p->source_changed_id = 0;
- }
- break; }
- }
- }
-
- switch (t->type) {
- case EC_CONFIG_TARGET_SOURCE: {
- ECalConfigTargetSource *s = (ECalConfigTargetSource *)t;
- if (s->source)
- g_object_unref (s->source);
- break; }
- }
-
- ((EConfigClass *) ecp_parent_class)->target_free (ec, t);
-}
-
-static void
-ecp_source_changed (struct _ESource *source, EConfig *ec)
-{
- e_config_target_changed (ec, E_CONFIG_TARGET_CHANGED_STATE);
-}
-
-static void
-ecp_set_target (EConfig *ec, EConfigTarget *t)
-{
- struct _ECalConfigPrivate *p = _PRIVATE(ec);
-
- ((EConfigClass *)ecp_parent_class)->set_target(ec, t);
-
- if (t) {
- switch (t->type) {
- case EC_CONFIG_TARGET_SOURCE: {
- ECalConfigTargetSource *s = (ECalConfigTargetSource *)t;
-
- p->source_changed_id = g_signal_connect (s->source, "changed", G_CALLBACK (ecp_source_changed), ec);
- break; }
- }
- }
-}
-
-static void
-ecp_class_init (GObjectClass *klass)
-{
- ((EConfigClass *)klass)->set_target = ecp_set_target;
- ((EConfigClass *)klass)->target_free = ecp_target_free;
-
- g_type_class_add_private (klass, sizeof (struct _ECalConfigPrivate));
-}
-
-GType
-e_cal_config_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (ECalConfigClass),
- NULL, NULL,
- (GClassInitFunc) ecp_class_init,
- NULL, NULL,
- sizeof (ECalConfig), 0,
- (GInstanceInitFunc) ecp_init
- };
-
- ecp_parent_class = g_type_class_ref (e_config_get_type ());
- type = g_type_register_static (e_config_get_type (), "ECalConfig", &info, 0);
- }
-
- return type;
-}
-
-ECalConfig *
-e_cal_config_new (int type, const char *menuid)
-{
- ECalConfig *ecp = g_object_new (e_cal_config_get_type(), 0);
- e_config_construct (&ecp->config, type, menuid);
- return ecp;
-}
-
-ECalConfigTargetSource *
-e_cal_config_target_new_source (ECalConfig *ecp, struct _ESource *source)
-{
- ECalConfigTargetSource *t = e_config_target_new (&ecp->config, EC_CONFIG_TARGET_SOURCE, sizeof (*t));
-
- t->source = source;
- g_object_ref (source);
-
- return t;
-}
-
-static const EConfigHookTargetMask ecph_no_masks[] = {
- { 0 }
-};
-
-static const EConfigHookTargetMap ecph_targets[] = {
- { "source", EC_CONFIG_TARGET_SOURCE, ecph_no_masks },
- { 0 },
-};
-
-static void
-ecph_class_init (EPluginHookClass *klass)
-{
- int i;
-
- klass->id = "org.gnome.evolution.calendar.config:1.0";
-
- for (i = 0; ecph_targets[i].type; i++) {
- g_print ("adding hook target '%s'\n", ecph_targets[i].type);
- e_config_hook_class_add_target_map ((EConfigHookClass *)klass, &ecph_targets[i]);
- }
-
- ((EConfigHookClass *)klass)->config_class = g_type_class_ref (e_cal_config_get_type ());
-}
-
-GType
-e_cal_config_hook_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (ECalConfigHookClass),
- NULL, NULL,
- (GClassInitFunc) ecph_class_init,
- NULL, NULL,
- sizeof (ECalConfigHook), 0,
- (GInstanceInitFunc) NULL
- };
-
- ecph_parent_class = g_type_class_ref (e_config_hook_get_type ());
- type = g_type_register_static (e_config_hook_get_type (), "ECalConfigHook", &info, 0);
- }
-
- return type;
-}
diff --git a/calendar/gui/e-cal-config.h b/calendar/gui/e-cal-config.h
deleted file mode 100644
index 93086dd8ce..0000000000
--- a/calendar/gui/e-cal-config.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Authors: David Trowbridge <trowbrds@cs.colorado.edu>
- *
- * Copyright (C) 2004 Novell, Inc (www.novell.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifndef __E_CAL_CONFIG_H__
-#define __E_CAL_CONFIG_H__
-
-#include <glib-object.h>
-
-#include "e-util/e-config.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif
-
-typedef struct _ECalConfig ECalConfig;
-typedef struct _ECalConfigClass ECalConfigClass;
-
-struct _ECalConfig {
- EConfig config;
-};
-
-struct _ECalConfigClass {
- EConfigClass config_class;
-};
-
-enum _e_cal_config_target_t {
- EC_CONFIG_TARGET_SOURCE,
-};
-
-typedef struct _ECalConfigTargetSource ECalConfigTargetSource;
-
-struct _ECalConfigTargetSource {
- EConfigTarget target;
-
- struct _ESource *source;
-};
-
-typedef struct _EConfigItem ECalConfigItem;
-
-GType e_cal_config_get_type (void);
-ECalConfig *e_cal_config_new (int type, const char *menuid);
-
-ECalConfigTargetSource *e_cal_config_target_new_source (ECalConfig *ecp, struct _ESource *source);
-
-/* ********************************************************************** */
-
-typedef struct _ECalConfigHook ECalConfigHook;
-typedef struct _ECalConfigHookClass ECalConfigHookClass;
-
-struct _ECalConfigHook {
- EConfigHook hook;
-};
-
-struct _ECalConfigHookClass {
- EConfigHookClass hook_class;
-};
-
-GType e_cal_config_hook_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/calendar/gui/e-cal-event.c b/calendar/gui/e-cal-event.c
deleted file mode 100644
index f359f471fd..0000000000
--- a/calendar/gui/e-cal-event.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Authors: David Trowbridge <trowbrds@cs.colorado.edu>
- *
- * Copyright (C) 2005 Novell, Inc. (www.novell.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-cal-event.h"
-
-static GObjectClass *ece_parent;
-
-static void
-ece_init (GObject *o)
-{
-}
-
-static void
-ece_finalize (GObject *o)
-{
- ((GObjectClass *) ece_parent)->finalize (o);
-}
-
-static void
-ece_target_free (EEvent *ev, EEventTarget *t)
-{
- switch (t->type) {
- case E_CAL_EVENT_TARGET_COMPONENT: {
- ECalEventTargetComponent *s = (ECalEventTargetComponent *) t;
- if (s->component)
- g_object_unref (s->component);
- break; }
- }
-
- ((EEventClass *)ece_parent)->target_free (ev, t);
-}
-
-static void
-ece_class_init (GObjectClass *klass)
-{
- klass->finalize = ece_finalize;
- ((EEventClass *)klass)->target_free = ece_target_free;
-}
-
-GType
-e_cal_event_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (ECalEventClass),
- NULL, NULL,
- (GClassInitFunc) ece_class_init,
- NULL, NULL,
- sizeof (ECalEvent), 0,
- (GInstanceInitFunc) ece_init
- };
- ece_parent = g_type_class_ref (e_event_get_type ());
- type = g_type_register_static (e_event_get_type (), "ECalEvent", &info, 0);
- }
-
- return type;
-}
-
-ECalEvent *
-e_cal_event_peek (void)
-{
- static ECalEvent *e_cal_event = NULL;
- if (!e_cal_event) {
- e_cal_event = g_object_new (e_cal_event_get_type (), 0);
- e_event_construct (&e_cal_event->event, "org.gnome.evolution.calendar.events");
- }
- return e_cal_event;
-}
-
-ECalEventTargetComponent *
-e_cal_event_target_new_component (ECalEvent *ece, struct _CalendarComponent *component, guint32 flags)
-{
- ECalEventTargetComponent *t = e_event_target_new (&ece->event, E_CAL_EVENT_TARGET_COMPONENT, sizeof (*t));
-
- t->component = g_object_ref (component);
- t->target.mask = ~flags;
-
- return t;
-}
-
-/* ********************************************************************** */
-
-static void *eceh_parent_class;
-
-static const EEventHookTargetMask eceh_component_masks[] = {
- { "migration", E_CAL_EVENT_COMPONENT_MIGRATION },
- { 0 },
-};
-
-static const EEventHookTargetMap eceh_targets[] = {
- { "component", E_CAL_EVENT_TARGET_COMPONENT, eceh_component_masks },
- { 0 },
-};
-
-static void
-eceh_finalize (GObject *o)
-{
- ((GObjectClass *) eceh_parent_class)->finalize (o);
-}
-
-static void
-eceh_class_init (EPluginHookClass *klass)
-{
- int i;
-
- ((GObjectClass *)klass)->finalize = eceh_finalize;
- ((EPluginHookClass *)klass)->id = "org.gnome.evolution.calendar.events:1.0";
-
- for (i = 0; eceh_targets[i].type; i++)
- e_event_hook_class_add_target_map ((EEventHookClass *)klass, &eceh_targets[i]);
-
- ((EEventHookClass *)klass)->event = (EEvent *) e_cal_event_peek ();
-}
-
-GType
-e_cal_event_hook_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (ECalEventHookClass),
- NULL, NULL,
- (GClassInitFunc) eceh_class_init,
- NULL, NULL,
- sizeof (ECalEventHook), 0,
- (GInstanceInitFunc) NULL,
- };
-
- eceh_parent_class = g_type_class_ref (e_event_hook_get_type ());
- type = g_type_register_static (e_event_hook_get_type (), "ECalEventHook", &info, 0);
- }
-
- return type;
-}
diff --git a/calendar/gui/e-cal-event.h b/calendar/gui/e-cal-event.h
deleted file mode 100644
index 0a07288973..0000000000
--- a/calendar/gui/e-cal-event.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Authors: David Trowbridge <trowbrds@cs.colorado.edu>
- *
- * Copyright (C) 2005 Novell, Inc. (www.novell.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifndef __E_CAL_EVENT_H__
-#define __E_CAL_EVENT_H__
-
-#include <glib-object.h>
-
-#include "e-util/e-event.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif
-
-typedef struct _ECalEvent ECalEvent;
-typedef struct _ECalEventClass ECalEventClass;
-
-enum _e_cal_event_target_t {
- E_CAL_EVENT_TARGET_COMPONENT,
-};
-
-/* Flags that describe TARGET_COMPONENT */
-enum {
- E_CAL_EVENT_COMPONENT_MIGRATION = 1 << 0,
-};
-
-typedef struct _ECalEventTargetComponent ECalEventTargetComponent;
-
-struct _ECalEventTargetComponent {
- EEventTarget target;
-
- struct _CalendarComponent *component;
-};
-
-struct _ECalEvent {
- EEvent event;
-
- struct _ECalEventPrivate *priv;
-};
-
-struct _ECalEventClass {
- EEventClass event_class;
-};
-
-GType e_cal_event_get_type (void);
-ECalEvent* e_cal_event_peek (void);
-ECalEventTargetComponent* e_cal_event_target_new_component (ECalEvent *ece, struct _CalendarComponent *component, guint32 flags);
-
-/* ********************************************************************** */
-
-typedef struct _ECalEventHook ECalEventHook;
-typedef struct _ECalEventHookClass ECalEventHookClass;
-
-struct _ECalEventHook {
- EEventHook hook;
-};
-
-struct _ECalEventHookClass {
- EEventHookClass hook_class;
-};
-
-GType e_cal_event_hook_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __E_CAL_EVENT_H__ */
diff --git a/calendar/gui/e-cal-list-view-config.c b/calendar/gui/e-cal-list-view-config.c
deleted file mode 100644
index 51ebd58ed4..0000000000
--- a/calendar/gui/e-cal-list-view-config.c
+++ /dev/null
@@ -1,235 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#include "calendar-config.h"
-#include "e-cal-list-view-config.h"
-
-struct _ECalListViewConfigPrivate {
- ECalListView *view;
-
- GList *notifications;
-};
-
-/* Property IDs */
-enum props {
- PROP_0,
- PROP_VIEW,
-};
-
-G_DEFINE_TYPE (ECalListViewConfig, e_cal_list_view_config, G_TYPE_OBJECT);
-
-static void
-e_cal_list_view_config_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
-{
- ECalListViewConfig *view_config;
- ECalListViewConfigPrivate *priv;
-
- view_config = E_CAL_LIST_VIEW_CONFIG (object);
- priv = view_config->priv;
-
- switch (property_id) {
- case PROP_VIEW:
- e_cal_list_view_config_set_view (view_config, g_value_get_object (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-e_cal_list_view_config_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
-{
- ECalListViewConfig *view_config;
- ECalListViewConfigPrivate *priv;
-
- view_config = E_CAL_LIST_VIEW_CONFIG (object);
- priv = view_config->priv;
-
- switch (property_id) {
- case PROP_VIEW:
- g_value_set_object (value, e_cal_list_view_config_get_view (view_config));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-e_cal_list_view_config_dispose (GObject *object)
-{
- ECalListViewConfig *view_config = E_CAL_LIST_VIEW_CONFIG (object);
- ECalListViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- e_cal_list_view_config_set_view (view_config, NULL);
-
- if (G_OBJECT_CLASS (e_cal_list_view_config_parent_class)->dispose)
- G_OBJECT_CLASS (e_cal_list_view_config_parent_class)->dispose (object);
-}
-
-static void
-e_cal_list_view_config_finalize (GObject *object)
-{
- ECalListViewConfig *view_config = E_CAL_LIST_VIEW_CONFIG (object);
- ECalListViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- g_free (priv);
-
- if (G_OBJECT_CLASS (e_cal_list_view_config_parent_class)->finalize)
- G_OBJECT_CLASS (e_cal_list_view_config_parent_class)->finalize (object);
-}
-
-static void
-e_cal_list_view_config_class_init (ECalListViewConfigClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GParamSpec *spec;
-
- /* Method override */
- gobject_class->set_property = e_cal_list_view_config_set_property;
- gobject_class->get_property = e_cal_list_view_config_get_property;
- gobject_class->dispose = e_cal_list_view_config_dispose;
- gobject_class->finalize = e_cal_list_view_config_finalize;
-
- spec = g_param_spec_object ("view", NULL, NULL, e_cal_list_view_get_type (),
- G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT);
- g_object_class_install_property (gobject_class, PROP_VIEW, spec);
-}
-
-static void
-e_cal_list_view_config_init (ECalListViewConfig *view_config)
-{
- view_config->priv = g_new0 (ECalListViewConfigPrivate, 1);
-
-}
-
-ECalListViewConfig *
-e_cal_list_view_config_new (ECalListView *list_view)
-{
- ECalListViewConfig *view_config;
-
- view_config = g_object_new (e_cal_list_view_config_get_type (), "view", list_view, NULL);
-
- return view_config;
-}
-
-ECalListView *
-e_cal_list_view_config_get_view (ECalListViewConfig *view_config)
-{
- ECalListViewConfigPrivate *priv;
-
- g_return_val_if_fail (view_config != NULL, NULL);
- g_return_val_if_fail (E_IS_CAL_LIST_VIEW_CONFIG (view_config), NULL);
-
- priv = view_config->priv;
-
- return priv->view;
-}
-
-static void
-set_timezone (ECalListView *list_view)
-{
- icaltimezone *zone;
-
- zone = calendar_config_get_icaltimezone ();
- e_calendar_view_set_timezone (E_CALENDAR_VIEW (list_view), zone);
-}
-
-static void
-timezone_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- ECalListViewConfig *view_config = data;
- ECalListViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_timezone (priv->view);
-}
-
-static void
-set_twentyfour_hour (ECalListView *list_view)
-{
- gboolean use_24_hour;
-
- use_24_hour = calendar_config_get_24_hour_format ();
-
- e_calendar_view_set_use_24_hour_format (E_CALENDAR_VIEW (list_view), use_24_hour);
-}
-
-static void
-twentyfour_hour_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- ECalListViewConfig *view_config = data;
- ECalListViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_twentyfour_hour (priv->view);
-}
-
-void
-e_cal_list_view_config_set_view (ECalListViewConfig *view_config, ECalListView *list_view)
-{
- ECalListViewConfigPrivate *priv;
- guint not;
- GList *l;
-
- g_return_if_fail (view_config != NULL);
- g_return_if_fail (E_IS_CAL_LIST_VIEW_CONFIG (view_config));
-
- priv = view_config->priv;
-
- if (priv->view) {
- g_object_unref (priv->view);
- priv->view = NULL;
- }
-
- for (l = priv->notifications; l; l = l->next)
- calendar_config_remove_notification (GPOINTER_TO_UINT (l->data));
-
- g_list_free (priv->notifications);
- priv->notifications = NULL;
-
- /* If the new view is NULL, return right now */
- if (!list_view)
- return;
-
- priv->view = g_object_ref (list_view);
-
- /* Time zone */
- set_timezone (list_view);
-
- not = calendar_config_add_notification_timezone (timezone_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* 24 Hour format */
- set_twentyfour_hour (list_view);
-
- not = calendar_config_add_notification_24_hour_format (twentyfour_hour_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-}
diff --git a/calendar/gui/e-cal-list-view-config.h b/calendar/gui/e-cal-list-view-config.h
deleted file mode 100644
index d2f87c36b3..0000000000
--- a/calendar/gui/e-cal-list-view-config.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Author :
- * JP Rosevear <jpr@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#ifndef _E_CAL_LIST_VIEW_CONFIG_H_
-#define _E_CAL_LIST_VIEW_CONFIG_H_
-
-#include "e-cal-list-view.h"
-
-G_BEGIN_DECLS
-
-#define E_CAL_LIST_VIEW_CONFIG(obj) GTK_CHECK_CAST (obj, e_cal_list_view_config_get_type (), ECalListViewConfig)
-#define E_CAL_LIST_VIEW_CONFIG_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_cal_list_view_config_get_type (), ECalListViewConfigClass)
-#define E_IS_CAL_LIST_VIEW_CONFIG(obj) GTK_CHECK_TYPE (obj, e_cal_list_view_config_get_type ())
-
-typedef struct _ECalListViewConfig ECalListViewConfig;
-typedef struct _ECalListViewConfigClass ECalListViewConfigClass;
-typedef struct _ECalListViewConfigPrivate ECalListViewConfigPrivate;
-
-struct _ECalListViewConfig {
- GObject parent;
-
- ECalListViewConfigPrivate *priv;
-};
-
-struct _ECalListViewConfigClass {
- GObjectClass parent_class;
-};
-
-GType e_cal_list_view_config_get_type (void);
-ECalListViewConfig *e_cal_list_view_config_new (ECalListView *list_view);
-ECalListView *e_cal_list_view_config_get_view (ECalListViewConfig *view_config);
-void e_cal_list_view_config_set_view (ECalListViewConfig *view_config, ECalListView *list_view);
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/e-cal-list-view.c b/calendar/gui/e-cal-list-view.c
deleted file mode 100644
index d17f26889c..0000000000
--- a/calendar/gui/e-cal-list-view.c
+++ /dev/null
@@ -1,550 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Authors:
- * Hans Petter Jansson <hpj@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * ECalListView - display calendar events in an ETable.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-cal-list-view.h"
-#include "ea-calendar.h"
-
-#include <math.h>
-#include <time.h>
-#include <sys/stat.h>
-#include <gdk/gdkkeysyms.h>
-#include <gdk/gdkx.h>
-#include <gtk/gtkdnd.h>
-#include <gtk/gtkmain.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkvscrollbar.h>
-#include <gtk/gtkwindow.h>
-#include <gal/widgets/e-gui-utils.h>
-#include <gal/e-table/e-table-memory-store.h>
-#include <gal/e-table/e-cell-checkbox.h>
-#include <gal/e-table/e-cell-toggle.h>
-#include <gal/e-table/e-cell-text.h>
-#include <gal/e-table/e-cell-combo.h>
-#include <gal/widgets/e-popup-menu.h>
-#include <widgets/misc/e-cell-date-edit.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnome/gnome-exec.h>
-#include <libgnome/gnome-util.h>
-#include <e-util/e-categories-config.h>
-#include <e-util/e-dialog-utils.h>
-
-#include <libecal/e-cal-time-util.h>
-#include "e-cal-model-calendar.h"
-#include "e-cell-date-edit-text.h"
-#include "dialogs/delete-comp.h"
-#include "dialogs/delete-error.h"
-#include "dialogs/send-comp.h"
-#include "dialogs/cancel-comp.h"
-#include "dialogs/recur-comp.h"
-#include "comp-util.h"
-#include "itip-utils.h"
-#include "calendar-commands.h"
-#include "calendar-config.h"
-#include "goto.h"
-#include "misc.h"
-
-static void e_cal_list_view_destroy (GtkObject *object);
-
-static GList *e_cal_list_view_get_selected_events (ECalendarView *cal_view);
-static gboolean e_cal_list_view_get_selected_time_range (ECalendarView *cal_view, time_t *start_time, time_t *end_time);
-static gboolean e_cal_list_view_get_visible_time_range (ECalendarView *cal_view, time_t *start_time,
- time_t *end_time);
-
-static gboolean e_cal_list_view_popup_menu (GtkWidget *widget);
-
-static void e_cal_list_view_show_popup_menu (ECalListView *cal_list_view, gint row,
- GdkEvent *gdk_event);
-static gboolean e_cal_list_view_on_table_double_click (GtkWidget *table, gint row, gint col,
- GdkEvent *event, gpointer data);
-static gboolean e_cal_list_view_on_table_right_click (GtkWidget *table, gint row, gint col,
- GdkEvent *event, gpointer data);
-static void e_cal_list_view_cursor_change_cb (ETable *etable, gint row, gpointer data);
-
-G_DEFINE_TYPE (ECalListView, e_cal_list_view, E_TYPE_CALENDAR_VIEW);
-
-static void
-e_cal_list_view_class_init (ECalListViewClass *class)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- ECalendarViewClass *view_class;
-
- object_class = (GtkObjectClass *) class;
- widget_class = (GtkWidgetClass *) class;
- view_class = (ECalendarViewClass *) class;
-
- /* Method override */
- object_class->destroy = e_cal_list_view_destroy;
-
- widget_class->popup_menu = e_cal_list_view_popup_menu;
-
- view_class->get_selected_events = e_cal_list_view_get_selected_events;
- view_class->get_selected_time_range = e_cal_list_view_get_selected_time_range;
- view_class->get_visible_time_range = e_cal_list_view_get_visible_time_range;
-}
-
-static gint
-date_compare_cb (gconstpointer a, gconstpointer b)
-{
- ECellDateEditValue *dv1 = (ECellDateEditValue *) a;
- ECellDateEditValue *dv2 = (ECellDateEditValue *) b;
- struct icaltimetype tt;
-
- /* First check if either is NULL. NULL dates sort last. */
- if (!dv1 || !dv2) {
- if (dv1 == dv2)
- return 0;
- else if (dv1)
- return -1;
- else
- return 1;
- }
-
- /* Copy the 2nd value and convert it to the same timezone as the
- first. */
- tt = dv2->tt;
-
- icaltimezone_convert_time (&tt, dv2->zone, dv1->zone);
-
- /* Now we can compare them. */
-
- return icaltime_compare (dv1->tt, tt);
-}
-
-static void
-e_cal_list_view_init (ECalListView *cal_list_view)
-{
- cal_list_view->query = NULL;
- cal_list_view->table_scrolled = NULL;
- cal_list_view->cursor_event = NULL;
- cal_list_view->set_table_id = 0;
-}
-
-/* Returns the current time, for the ECellDateEdit items. */
-static struct tm
-get_current_time_cb (ECellDateEdit *ecde, gpointer data)
-{
- ECalListView *cal_list_view = data;
- icaltimezone *zone;
- struct tm tmp_tm = { 0 };
- struct icaltimetype tt;
-
- zone = e_calendar_view_get_timezone (E_CALENDAR_VIEW (cal_list_view));
- tt = icaltime_from_timet_with_zone (time (NULL), FALSE, zone);
-
- /* Now copy it to the struct tm and return it. */
- tmp_tm.tm_year = tt.year - 1900;
- tmp_tm.tm_mon = tt.month - 1;
- tmp_tm.tm_mday = tt.day;
- tmp_tm.tm_hour = tt.hour;
- tmp_tm.tm_min = tt.minute;
- tmp_tm.tm_sec = tt.second;
- tmp_tm.tm_isdst = -1;
-
- return tmp_tm;
-}
-
-void
-e_cal_list_view_load_state (ECalListView *cal_list_view, gchar *filename)
-{
- struct stat st;
-
- g_return_if_fail (cal_list_view != NULL);
- g_return_if_fail (E_IS_CAL_LIST_VIEW (cal_list_view));
- g_return_if_fail (filename != NULL);
-
- if (stat (filename, &st) == 0 && st.st_size > 0 && S_ISREG (st.st_mode))
- e_table_load_state (e_table_scrolled_get_table (cal_list_view->table_scrolled), filename);
-}
-
-void
-e_cal_list_view_save_state (ECalListView *cal_list_view, gchar *filename)
-{
- g_return_if_fail (cal_list_view != NULL);
- g_return_if_fail (E_IS_CAL_LIST_VIEW (cal_list_view));
- g_return_if_fail (filename != NULL);
-
- e_table_save_state (e_table_scrolled_get_table (cal_list_view->table_scrolled), filename);
-}
-
-static void
-setup_e_table (ECalListView *cal_list_view)
-{
- ECalModelCalendar *model;
- ETableExtras *extras;
- GList *strings;
- ECell *cell, *popup_cell;
- GnomeCanvas *canvas;
- GtkStyle *style;
-
- model = E_CAL_MODEL_CALENDAR (e_calendar_view_get_model (E_CALENDAR_VIEW (cal_list_view)));
-
- /* Create the header columns */
-
- extras = e_table_extras_new();
-
- /* Normal string fields */
-
- cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT);
- g_object_set (G_OBJECT (cell),
- "bg_color_column", E_CAL_MODEL_FIELD_COLOR,
- NULL);
-
- e_table_extras_add_cell (extras, "calstring", cell);
-
- /* Date fields */
-
- cell = e_cell_date_edit_text_new (NULL, GTK_JUSTIFY_LEFT);
- g_object_set (G_OBJECT (cell),
- "bg_color_column", E_CAL_MODEL_FIELD_COLOR,
- NULL);
-
- popup_cell = e_cell_date_edit_new ();
- e_cell_popup_set_child (E_CELL_POPUP (popup_cell), cell);
- g_object_unref (cell);
- e_table_extras_add_cell (extras, "dateedit", popup_cell);
- cal_list_view->dates_cell = E_CELL_DATE_EDIT (popup_cell);
-
- e_cell_date_edit_set_get_time_callback (E_CELL_DATE_EDIT (popup_cell),
- get_current_time_cb,
- cal_list_view, NULL);
-
- /* Combo fields */
-
- cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT);
- g_object_set (G_OBJECT (cell),
- "bg_color_column", E_CAL_MODEL_FIELD_COLOR,
- "editable", FALSE,
- NULL);
-
- popup_cell = e_cell_combo_new ();
- e_cell_popup_set_child (E_CELL_POPUP (popup_cell), cell);
- g_object_unref (cell);
-
- strings = NULL;
- strings = g_list_append (strings, (char*) _("Public"));
- strings = g_list_append (strings, (char*) _("Private"));
- strings = g_list_append (strings, (char*) _("Confidential"));
- e_cell_combo_set_popdown_strings (E_CELL_COMBO (popup_cell),
- strings);
-
- e_table_extras_add_cell (extras, "classification", popup_cell);
-
- /* Sorting */
-
- e_table_extras_add_compare (extras, "date-compare",
- date_compare_cb);
-
- /* Create table view */
-
- cal_list_view->table_scrolled = E_TABLE_SCROLLED (
- e_table_scrolled_new_from_spec_file (E_TABLE_MODEL (model),
- extras,
- EVOLUTION_ETSPECDIR "/e-cal-list-view.etspec",
- NULL));
-
- /* Make sure text is readable on top of our color coding */
-
- canvas = GNOME_CANVAS (e_table_scrolled_get_table (cal_list_view->table_scrolled)->table_canvas);
- style = gtk_widget_get_style (GTK_WIDGET (canvas));
-
- style->fg [GTK_STATE_SELECTED] = style->text [GTK_STATE_NORMAL];
- style->fg [GTK_STATE_ACTIVE] = style->text [GTK_STATE_NORMAL];
- gtk_widget_set_style (GTK_WIDGET (canvas), style);
-
- /* Connect signals */
- g_signal_connect (e_table_scrolled_get_table (cal_list_view->table_scrolled),
- "double_click", G_CALLBACK (e_cal_list_view_on_table_double_click), cal_list_view);
- g_signal_connect (e_table_scrolled_get_table (cal_list_view->table_scrolled),
- "right-click", G_CALLBACK (e_cal_list_view_on_table_right_click), cal_list_view);
- g_signal_connect_after (e_table_scrolled_get_table (cal_list_view->table_scrolled),
- "cursor_change", G_CALLBACK (e_cal_list_view_cursor_change_cb), cal_list_view);
-
- /* Attach and show widget */
-
- gtk_table_attach (GTK_TABLE (cal_list_view), GTK_WIDGET (cal_list_view->table_scrolled),
- 0, 2, 0, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 1, 1);
- gtk_widget_show (GTK_WIDGET (cal_list_view->table_scrolled));
-}
-
-GtkWidget *
-e_cal_list_view_construct (ECalListView *cal_list_view)
-{
- setup_e_table (cal_list_view);
-
- return GTK_WIDGET (cal_list_view);
-}
-
-/**
- * e_cal_list_view_new:
- * @Returns: a new #ECalListView.
- *
- * Creates a new #ECalListView.
- **/
-GtkWidget *
-e_cal_list_view_new (void)
-{
- ECalListView *cal_list_view;
- ECalModel *model;
-
- model = E_CAL_MODEL (e_cal_model_calendar_new ());
-
- cal_list_view = g_object_new (e_cal_list_view_get_type (), "model", model, NULL);
- if (!e_cal_list_view_construct (cal_list_view)) {
- g_message (G_STRLOC ": Could not construct the calendar list GUI");
- g_object_unref (cal_list_view);
- return NULL;
- }
-
- g_object_unref (model);
-
- return GTK_WIDGET (cal_list_view);
-}
-
-static void
-e_cal_list_view_destroy (GtkObject *object)
-{
- ECalListView *cal_list_view;
-
- cal_list_view = E_CAL_LIST_VIEW (object);
-
- if (cal_list_view->query) {
- g_signal_handlers_disconnect_matched (cal_list_view->query, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, cal_list_view);
- g_object_unref (cal_list_view->query);
- cal_list_view->query = NULL;
- }
-
- if (cal_list_view->set_table_id) {
- g_source_remove (cal_list_view->set_table_id);
- cal_list_view->set_table_id = 0;
- }
-
- if (cal_list_view->cursor_event) {
- g_free (cal_list_view->cursor_event);
- cal_list_view->cursor_event = NULL;
- }
-
- if (cal_list_view->table_scrolled) {
- gtk_widget_destroy (GTK_WIDGET (cal_list_view->table_scrolled));
- cal_list_view->table_scrolled = NULL;
- }
-
- GTK_OBJECT_CLASS (e_cal_list_view_parent_class)->destroy (object);
-}
-
-static void
-e_cal_list_view_show_popup_menu (ECalListView *cal_list_view, gint row, GdkEvent *gdk_event)
-{
- GtkMenu *menu;
-
- menu = e_calendar_view_create_popup_menu (E_CALENDAR_VIEW (cal_list_view));
- gtk_menu_popup(menu, NULL, NULL, NULL, NULL, gdk_event?gdk_event->button.button:0, gdk_event?gdk_event->button.time:gtk_get_current_event_time());
-}
-
-static gboolean
-e_cal_list_view_popup_menu (GtkWidget *widget)
-{
- ECalListView *cal_list_view = E_CAL_LIST_VIEW (widget);
-
- e_cal_list_view_show_popup_menu (cal_list_view, -1, NULL);
- return TRUE;
-}
-
-static gboolean
-e_cal_list_view_on_table_double_click (GtkWidget *table, gint row, gint col, GdkEvent *event,
- gpointer data)
-{
- ECalListView *cal_list_view = E_CAL_LIST_VIEW (data);
- ECalModelComponent *comp_data;
-
- comp_data = e_cal_model_get_component_at (e_calendar_view_get_model (E_CALENDAR_VIEW (cal_list_view)), row);
- e_calendar_view_edit_appointment (E_CALENDAR_VIEW (cal_list_view), comp_data->client,
- comp_data->icalcomp, FALSE);
-
- return TRUE;
-}
-
-static gboolean
-e_cal_list_view_on_table_right_click (GtkWidget *table, gint row, gint col, GdkEvent *event,
- gpointer data)
-{
- ECalListView *cal_list_view = E_CAL_LIST_VIEW (data);
-
- e_cal_list_view_show_popup_menu (cal_list_view, row, event);
- return TRUE;
-}
-
-static void
-e_cal_list_view_cursor_change_cb (ETable *etable, gint row, gpointer data)
-{
- ECalListView *cal_list_view = E_CAL_LIST_VIEW (data);
-
- g_signal_emit_by_name (cal_list_view, "selection_changed");
-}
-
-static gboolean
-e_cal_list_view_get_selected_time_range (ECalendarView *cal_view, time_t *start_time, time_t *end_time)
-{
- GList *selected;
- icaltimezone *zone;
-
- selected = e_calendar_view_get_selected_events (cal_view);
- if (selected) {
- ECalendarViewEvent *event = (ECalendarViewEvent *) selected->data;
- ECalComponentDateTime dtstart, dtend;
- ECalComponent *comp;
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
- if (start_time) {
- e_cal_component_get_dtstart (comp, &dtstart);
- if (dtstart.tzid) {
- zone = icalcomponent_get_timezone (e_cal_component_get_icalcomponent (comp), dtstart.tzid);
- } else {
- zone = NULL;
- }
- *start_time = icaltime_as_timet_with_zone (*dtstart.value, zone);
- e_cal_component_free_datetime (&dtstart);
- }
- if (end_time) {
- e_cal_component_get_dtend (comp, &dtend);
- if (dtend.tzid) {
- zone = icalcomponent_get_timezone (e_cal_component_get_icalcomponent (comp), dtend.tzid);
- } else {
- zone = NULL;
- }
- *end_time = icaltime_as_timet_with_zone (*dtend.value, zone);
- e_cal_component_free_datetime (&dtend);
- }
-
- g_object_unref (comp);
- g_list_free (selected);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static GList *
-e_cal_list_view_get_selected_events (ECalendarView *cal_view)
-{
- GList *event_list = NULL;
- gint cursor_row;
-
- if (E_CAL_LIST_VIEW (cal_view)->cursor_event) {
- g_free (E_CAL_LIST_VIEW (cal_view)->cursor_event);
- E_CAL_LIST_VIEW (cal_view)->cursor_event = NULL;
- }
-
- cursor_row = e_table_get_cursor_row (e_table_scrolled_get_table (E_CAL_LIST_VIEW (cal_view)->table_scrolled));
-
- if (cursor_row >= 0) {
- ECalendarViewEvent *event;
-
- event = E_CAL_LIST_VIEW (cal_view)->cursor_event = g_new0 (ECalendarViewEvent, 1);
- event->comp_data =
- e_cal_model_get_component_at (e_calendar_view_get_model (cal_view),
- cursor_row);
- event_list = g_list_prepend (event_list, event);
- }
-
- return event_list;
-}
-
-static void
-adjust_range (icaltimetype icaltime, time_t *earliest, time_t *latest, gboolean *set)
-{
- time_t t;
-
- if (!icaltime_is_valid_time (icaltime))
- return;
-
- t = icaltime_as_timet (icaltime);
- *earliest = MIN (*earliest, t);
- *latest = MAX (*latest, t);
-
- *set = TRUE;
-}
-
-/* NOTE: Time use for this function increases linearly with number of events. This is not
- * ideal, since it's used in a couple of places. We could probably be smarter about it,
- * and use do it less frequently... */
-static gboolean
-e_cal_list_view_get_visible_time_range (ECalendarView *cal_view, time_t *start_time, time_t *end_time)
-{
- time_t earliest = G_MAXINT, latest = 0;
- gboolean set = FALSE;
- gint n_rows, i;
-
- n_rows = e_table_model_row_count (E_TABLE_MODEL (e_calendar_view_get_model (cal_view)));
-
- for (i = 0; i < n_rows; i++) {
- ECalModelComponent *comp;
- icalcomponent *icalcomp;
-
- comp = e_cal_model_get_component_at (e_calendar_view_get_model (cal_view), i);
- if (!comp)
- continue;
-
- icalcomp = comp->icalcomp;
- if (!icalcomp)
- continue;
-
- adjust_range (icalcomponent_get_dtstart (icalcomp), &earliest, &latest, &set);
- adjust_range (icalcomponent_get_dtend (icalcomp), &earliest, &latest, &set);
- }
-
- if (set) {
- *start_time = earliest;
- *end_time = latest;
- return TRUE;
- }
-
- return FALSE;
-}
-
-gboolean
-e_cal_list_view_get_range_shown (ECalListView *cal_list_view, GDate *start_date, gint *days_shown)
-{
- time_t first, last;
- GDate end_date;
-
- if (!e_cal_list_view_get_visible_time_range (E_CALENDAR_VIEW (cal_list_view), &first, &last))
- return FALSE;
-
- time_to_gdate_with_zone (start_date, first, e_calendar_view_get_timezone (E_CALENDAR_VIEW (cal_list_view)));
- time_to_gdate_with_zone (&end_date, last, e_calendar_view_get_timezone (E_CALENDAR_VIEW (cal_list_view)));
-
- *days_shown = g_date_days_between (start_date, &end_date);
- return TRUE;
-}
diff --git a/calendar/gui/e-cal-list-view.etspec b/calendar/gui/e-cal-list-view.etspec
deleted file mode 100644
index 68cfbc9d22..0000000000
--- a/calendar/gui/e-cal-list-view.etspec
+++ /dev/null
@@ -1,14 +0,0 @@
-<ETableSpecification draw-grid="true" alternating-row-colors="true">
- <ETableColumn model_col="5" _title="Start Date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="date-compare" priority="-2"/>
- <ETableColumn model_col="10" _title="End Date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="date-compare" priority="-2"/>
- <ETableColumn model_col="8" _title="Summary" expansion="3.0" minimum_width="10" resizable="true" cell="calstring" compare="string" priority="10"/>
- <ETableColumn model_col="11" _title="Location" expansion="3.0" minimum_width="10" resizable="true" cell="calstring" compare="string" priority="10"/>
- <ETableColumn model_col="0" _title="Categories" cell="calstring" compare="string" expansion="1.0" minimum_width="10" resizable="true" priority="-2"/>
-
- <ETableState>
- <column source="2"/>
- <column source="0"/>
- <column source="1"/>
- <grouping></grouping>
- </ETableState>
-</ETableSpecification>
diff --git a/calendar/gui/e-cal-list-view.h b/calendar/gui/e-cal-list-view.h
deleted file mode 100644
index eb7732625f..0000000000
--- a/calendar/gui/e-cal-list-view.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Authors:
- * Hans Petter Jansson <hpj@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-#ifndef _E_CAL_LIST_VIEW_H_
-#define _E_CAL_LIST_VIEW_H_
-
-#include <time.h>
-#include <gtk/gtktable.h>
-#include <gtk/gtktooltips.h>
-
-#include "e-calendar-view.h"
-#include "gnome-cal.h"
-
-G_BEGIN_DECLS
-
-/*
- * ECalListView - displays calendar events in an ETable.
- */
-
-#define E_CAL_LIST_VIEW(obj) GTK_CHECK_CAST (obj, e_cal_list_view_get_type (), ECalListView)
-#define E_CAL_LIST_VIEW_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_cal_list_view_get_type (), ECalListViewClass)
-#define E_IS_CAL_LIST_VIEW(obj) GTK_CHECK_TYPE (obj, e_cal_list_view_get_type ())
-
-
-typedef struct _ECalListView ECalListView;
-typedef struct _ECalListViewClass ECalListViewClass;
-
-struct _ECalListView
-{
- ECalendarView cal_view;
-
- /* The main display table */
- ETableScrolled *table_scrolled;
-
- /* S-expression for query and the query object */
- ECalView *query;
-
- /* The default category for new events */
- gchar *default_category;
-
- /* Date editing cell */
- ECellDateEdit *dates_cell;
-
- /* The last ECalendarViewEvent we returned from e_cal_list_view_get_selected_events(), to be freed */
- ECalendarViewEvent *cursor_event;
-
- /* Idle handler ID for setting a new ETableModel */
- gint set_table_id;
-};
-
-struct _ECalListViewClass
-{
- ECalendarViewClass parent_class;
-};
-
-
-GtkType e_cal_list_view_get_type (void);
-GtkWidget *e_cal_list_view_construct (ECalListView *cal_list_view);
-
-GtkWidget *e_cal_list_view_new (void);
-void e_cal_list_view_load_state (ECalListView *cal_list_view, gchar *filename);
-void e_cal_list_view_save_state (ECalListView *cal_list_view, gchar *filename);
-
-gboolean e_cal_list_view_get_range_shown (ECalListView *cal_list_view, GDate *start_date,
- gint *days_shown);
-
-
-G_END_DECLS
-
-#endif /* _E_CAL_LIST_VIEW_H_ */
diff --git a/calendar/gui/e-cal-menu.c b/calendar/gui/e-cal-menu.c
deleted file mode 100644
index 499b90d11e..0000000000
--- a/calendar/gui/e-cal-menu.c
+++ /dev/null
@@ -1,288 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Michael Zucchi <notzed@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <stdlib.h>
-
-#include <glib.h>
-
-#include "e-cal-menu.h"
-#include "gui/e-cal-model.h"
-#include "itip-utils.h"
-
-static void ecalm_standard_menu_factory(EMenu *emp, void *data);
-
-static GObjectClass *ecalm_parent;
-
-static void
-ecalm_init(GObject *o)
-{
- /*ECalMenu *emp = (ECalMenu *)o; */
-}
-
-static void
-ecalm_finalise(GObject *o)
-{
- ((GObjectClass *)ecalm_parent)->finalize(o);
-}
-
-static void
-ecalm_target_free(EMenu *ep, EMenuTarget *t)
-{
- switch (t->type) {
- case E_CAL_MENU_TARGET_SELECT: {
- ECalMenuTargetSelect *s = (ECalMenuTargetSelect *)t;
- int i;
-
- for (i=0;i<s->events->len;i++)
- e_cal_model_free_component_data(s->events->pdata[i]);
- g_ptr_array_free(s->events, TRUE);
- g_object_unref(s->model);
- break; }
- }
-
- ((EMenuClass *)ecalm_parent)->target_free(ep, t);
-}
-
-static void
-ecalm_class_init(GObjectClass *klass)
-{
- klass->finalize = ecalm_finalise;
- ((EMenuClass *)klass)->target_free = ecalm_target_free;
-
- e_menu_class_add_factory((EMenuClass *)klass, NULL, (EMenuFactoryFunc)ecalm_standard_menu_factory, NULL);
-}
-
-GType
-e_cal_menu_get_type(void)
-{
- static GType type = 0;
-
- if (type == 0) {
- static const GTypeInfo info = {
- sizeof(ECalMenuClass),
- NULL, NULL,
- (GClassInitFunc)ecalm_class_init,
- NULL, NULL,
- sizeof(ECalMenu), 0,
- (GInstanceInitFunc)ecalm_init
- };
- ecalm_parent = g_type_class_ref(e_menu_get_type());
- type = g_type_register_static(e_menu_get_type(), "ECalMenu", &info, 0);
- }
-
- return type;
-}
-
-ECalMenu *e_cal_menu_new(const char *menuid)
-{
- ECalMenu *emp = g_object_new(e_cal_menu_get_type(), 0);
-
- e_menu_construct(&emp->menu, menuid);
-
- return emp;
-}
-
-/**
- * e_cal_menu_target_new_select:
- * @folder: The selection will ref this for the life of it.
- * @folder_uri:
- * @uids: The selection will free this when done with it.
- *
- * Create a new selection popup target.
- *
- * Return value:
- **/
-ECalMenuTargetSelect *
-e_cal_menu_target_new_select(ECalMenu *eabp, struct _ECalModel *model, GPtrArray *events)
-{
- ECalMenuTargetSelect *t = e_menu_target_new(&eabp->menu, E_CAL_MENU_TARGET_SELECT, sizeof(*t));
- guint32 mask = ~0;
- ECal *client;
- gboolean read_only;
-
- /* FIXME: This is duplicated in e-cal-popup */
-
- t->model = model;
- g_object_ref(t->model);
- t->events = events;
-
- if (t->events->len == 0) {
- client = e_cal_model_get_default_client(t->model);
- } else {
- ECalModelComponent *comp_data = (ECalModelComponent *)t->events->pdata[0];
-
- mask &= ~E_CAL_MENU_SELECT_ANY;
- if (t->events->len == 1)
- mask &= ~E_CAL_MENU_SELECT_ONE;
- else
- mask &= ~E_CAL_MENU_SELECT_MANY;
-
- if (icalcomponent_get_first_property (comp_data->icalcomp, ICAL_URL_PROPERTY))
- mask &= ~E_CAL_MENU_SELECT_HASURL;
-
- if (e_cal_util_component_has_recurrences (comp_data->icalcomp))
- mask &= ~E_CAL_MENU_SELECT_RECURRING;
- else if (e_cal_util_component_is_instance (comp_data->icalcomp))
- mask &= ~E_CAL_MENU_SELECT_RECURRING;
- else
- mask &= ~E_CAL_MENU_SELECT_NONRECURRING;
-
- if (e_cal_util_component_is_instance (comp_data->icalcomp))
- mask &= ~E_CAL_MENU_SELECT_INSTANCE;
-
- if (e_cal_util_component_has_organizer (comp_data->icalcomp)) {
- ECalComponent *comp;
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp));
- if (!itip_organizer_is_user (comp, comp_data->client))
- mask &= ~E_CAL_MENU_SELECT_ORGANIZER;
-
- g_object_unref (comp);
- } else {
- /* organiser is synonym for owner in this case */
- mask &= ~(E_CAL_MENU_SELECT_ORGANIZER|E_CAL_MENU_SELECT_NOTMEETING);
- }
-
- client = comp_data->client;
- }
-
- if (client) {
- e_cal_is_read_only(client, &read_only, NULL);
- if (!read_only)
- mask &= ~E_CAL_MENU_SELECT_EDITABLE;
-
- if (!e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_TASK_ASSIGNMENT)
- && !e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_CONV_TO_ASSIGN_TASK))
- mask &= ~E_CAL_MENU_SELECT_ASSIGNABLE;
- }
-
- /* This bit isn't implemented ... */
- mask &= ~E_CAL_MENU_SELECT_NOTEDITING;
-
- t->target.mask = mask;
-
- return t;
-}
-
-static void
-ecalm_standard_menu_factory(EMenu *emp, void *data)
-{
- /* noop */
-}
-
-/* ********************************************************************** */
-
-/* menu plugin handler */
-
-/*
-<e-plugin
- class="org.gnome.mail.plugin.popup:1.0"
- id="org.gnome.mail.plugin.popup.item:1.0"
- type="shlib"
- location="/opt/gnome2/lib/camel/1.0/libcamelimap.so"
- name="imap"
- description="IMAP4 and IMAP4v1 mail store">
- <hook class="org.gnome.mail.popupMenu:1.0"
- handler="HandlePopup">
- <menu id="any" target="select">
- <item
- type="item|toggle|radio|image|submenu|bar"
- active
- path="foo/bar"
- label="label"
- icon="foo"
- mask="select_one"
- activate="ecalm_view_emacs"/>
- </menu>
- </extension>
-
-*/
-
-static void *ecalph_parent_class;
-#define ecalph ((ECalMenuHook *)eph)
-
-static const EMenuHookTargetMask ecalph_select_masks[] = {
- { "one", E_CAL_MENU_SELECT_ONE },
- { "many", E_CAL_MENU_SELECT_MANY },
- { "editable", E_CAL_MENU_SELECT_EDITABLE },
- { "recurring", E_CAL_MENU_SELECT_RECURRING },
- { "non-recurring", E_CAL_MENU_SELECT_NONRECURRING },
- { "instance", E_CAL_MENU_SELECT_INSTANCE },
- { "organizer", E_CAL_MENU_SELECT_ORGANIZER },
- { "not-editing", E_CAL_MENU_SELECT_NOTEDITING },
- { "not-meeting", E_CAL_MENU_SELECT_NOTMEETING },
- { "assignable", E_CAL_MENU_SELECT_ASSIGNABLE },
- { "hasurl", E_CAL_MENU_SELECT_HASURL },
- { 0 }
-};
-
-static const EMenuHookTargetMap ecalph_targets[] = {
- { "select", E_CAL_MENU_TARGET_SELECT, ecalph_select_masks },
- { 0 }
-};
-
-static void
-ecalph_finalise(GObject *o)
-{
- /*EPluginHook *eph = (EPluginHook *)o;*/
-
- ((GObjectClass *)ecalph_parent_class)->finalize(o);
-}
-
-static void
-ecalph_class_init(EPluginHookClass *klass)
-{
- int i;
-
- ((GObjectClass *)klass)->finalize = ecalph_finalise;
- ((EPluginHookClass *)klass)->id = "org.gnome.evolution.calendar.bonobomenu:1.0";
-
- for (i=0;ecalph_targets[i].type;i++)
- e_menu_hook_class_add_target_map((EMenuHookClass *)klass, &ecalph_targets[i]);
-
- /* FIXME: leaks parent set class? */
- ((EMenuHookClass *)klass)->menu_class = g_type_class_ref(e_cal_menu_get_type());
-}
-
-GType
-e_cal_menu_hook_get_type(void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof(ECalMenuHookClass), NULL, NULL, (GClassInitFunc) ecalph_class_init, NULL, NULL,
- sizeof(ECalMenuHook), 0, (GInstanceInitFunc) NULL,
- };
-
- ecalph_parent_class = g_type_class_ref(e_menu_hook_get_type());
- type = g_type_register_static(e_menu_hook_get_type(), "ECalMenuHook", &info, 0);
- }
-
- return type;
-}
diff --git a/calendar/gui/e-cal-menu.h b/calendar/gui/e-cal-menu.h
deleted file mode 100644
index bb34a07ebd..0000000000
--- a/calendar/gui/e-cal-menu.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Authors: Michel Zucchi <notzed@ximian.com>
- *
- * Copyright 2004 Novell Inc. (www.novell.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifndef __E_CAL_MENU_H__
-#define __E_CAL_MENU_H__
-
-#include <glib-object.h>
-
-#include "e-util/e-menu.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-typedef struct _ECalMenu ECalMenu;
-typedef struct _ECalMenuClass ECalMenuClass;
-
-/* Current target description */
-/* Types of popup tagets */
-enum _e_cal_menu_target_t {
- E_CAL_MENU_TARGET_SELECT,
-};
-
-/**
- * enum _e_cal_menu_target_select_t - ECalPopupTargetSelect qualifiers.
- *
- * @E_CAL_MENU_SELECT_ONE: Only one item is selected.
- * @E_CAL_MENU_SELECT_MANY: More than one item selected.
- * @E_CAL_MENU_SELECT_ANY: One or more items selected.
- * @E_CAL_MENU_SELECT_EDITABLE: The selection is editable.
- * @E_CAL_MENU_SELECT_RECURRING: Is a recurring event.
- * @E_CAL_MENU_SELECT_NONRECURRING: Is not a recurring event.
- * @E_CAL_MENU_SELECT_INSTANCE: This is an instance event.
- * @E_CAL_MENU_SELECT_ORGANIZER: The user is the organiser of the event.
- * @E_CAL_MENU_SELECT_NOTEDITING: The event is not being edited already. Not implemented.
- * @E_CAL_MENU_SELECT_NOTMEETING: The event is not a meeting.
- * @E_CAL_MENU_SELECT_ASSIGNABLE: An assignable task.
- * @E_CAL_MENU_SELECT_HASURL: A task that contains a URL.
- **/
-enum _e_cal_menu_target_select_t {
- E_CAL_MENU_SELECT_ONE = 1<<0,
- E_CAL_MENU_SELECT_MANY = 1<<1,
- E_CAL_MENU_SELECT_ANY = 1<<2,
- E_CAL_MENU_SELECT_EDITABLE = 1<<3,
- E_CAL_MENU_SELECT_RECURRING = 1<<4,
- E_CAL_MENU_SELECT_NONRECURRING = 1<<5,
- E_CAL_MENU_SELECT_INSTANCE = 1<<6,
-
- E_CAL_MENU_SELECT_ORGANIZER = 1<<7,
- E_CAL_MENU_SELECT_NOTEDITING = 1<<8,
- E_CAL_MENU_SELECT_NOTMEETING = 1<<9,
-
- E_CAL_MENU_SELECT_ASSIGNABLE = 1<<10,
- E_CAL_MENU_SELECT_HASURL = 1<<11,
-};
-
-typedef struct _ECalMenuTargetSelect ECalMenuTargetSelect;
-
-struct _ECalMenuTargetSelect {
- EMenuTarget target;
-
- struct _ECalModel *model;
- GPtrArray *events;
-};
-
-typedef struct _EMenuItem ECalMenuItem;
-
-/* The object */
-struct _ECalMenu {
- EMenu menu;
-
- struct _ECalMenuPrivate *priv;
-};
-
-struct _ECalMenuClass {
- EMenuClass menu_class;
-};
-
-GType e_cal_menu_get_type(void);
-
-ECalMenu *e_cal_menu_new(const char *menuid);
-
-ECalMenuTargetSelect *e_cal_menu_target_new_select(ECalMenu *emp, struct _ECalModel *model, GPtrArray *events);
-
-/* ********************************************************************** */
-
-typedef struct _ECalMenuHook ECalMenuHook;
-typedef struct _ECalMenuHookClass ECalMenuHookClass;
-
-struct _ECalMenuHook {
- EMenuHook hook;
-};
-
-struct _ECalMenuHookClass {
- EMenuHookClass hook_class;
-};
-
-GType e_cal_menu_hook_get_type(void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_CAL_MENU_H__ */
diff --git a/calendar/gui/e-cal-model-calendar.c b/calendar/gui/e-cal-model-calendar.c
deleted file mode 100644
index b64dce21c6..0000000000
--- a/calendar/gui/e-cal-model-calendar.c
+++ /dev/null
@@ -1,545 +0,0 @@
-/* Evolution calendar - Data model for ETable
- *
- * Copyright (C) 2004 Ximian, Inc.
- *
- * Authors: Rodrigo Moya <rodrigo@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <libgnome/gnome-i18n.h>
-#include "e-cal-model-calendar.h"
-#include "e-cell-date-edit-text.h"
-#include "itip-utils.h"
-#include "misc.h"
-#include "dialogs/recur-comp.h"
-#include "dialogs/send-comp.h"
-
-struct _ECalModelCalendarPrivate {
-};
-
-static void e_cal_model_calendar_finalize (GObject *object);
-static int ecmc_column_count (ETableModel *etm);
-static void *ecmc_value_at (ETableModel *etm, int col, int row);
-static void ecmc_set_value_at (ETableModel *etm, int col, int row, const void *value);
-static gboolean ecmc_is_cell_editable (ETableModel *etm, int col, int row);
-static void *ecmc_duplicate_value (ETableModel *etm, int col, const void *value);
-static void ecmc_free_value (ETableModel *etm, int col, void *value);
-static void *ecmc_initialize_value (ETableModel *etm, int col);
-static gboolean ecmc_value_is_empty (ETableModel *etm, int col, const void *value);
-static char *ecmc_value_to_string (ETableModel *etm, int col, const void *value);
-
-static void ecmc_fill_component_from_model (ECalModel *model, ECalModelComponent *comp_data,
- ETableModel *source_model, gint row);
-
-G_DEFINE_TYPE (ECalModelCalendar, e_cal_model_calendar, E_TYPE_CAL_MODEL);
-
-static void
-e_cal_model_calendar_class_init (ECalModelCalendarClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- ETableModelClass *etm_class = E_TABLE_MODEL_CLASS (klass);
- ECalModelClass *model_class = E_CAL_MODEL_CLASS (klass);
-
- object_class->finalize = e_cal_model_calendar_finalize;
-
- etm_class->column_count = ecmc_column_count;
- etm_class->value_at = ecmc_value_at;
- etm_class->set_value_at = ecmc_set_value_at;
- etm_class->is_cell_editable = ecmc_is_cell_editable;
- etm_class->duplicate_value = ecmc_duplicate_value;
- etm_class->free_value = ecmc_free_value;
- etm_class->initialize_value = ecmc_initialize_value;
- etm_class->value_is_empty = ecmc_value_is_empty;
- etm_class->value_to_string = ecmc_value_to_string;
-
- model_class->fill_component_from_model = ecmc_fill_component_from_model;
-}
-
-static void
-e_cal_model_calendar_init (ECalModelCalendar *model)
-{
- ECalModelCalendarPrivate *priv;
-
- priv = g_new0 (ECalModelCalendarPrivate, 1);
- model->priv = priv;
-
- e_cal_model_set_component_kind (E_CAL_MODEL (model), ICAL_VEVENT_COMPONENT);
-}
-
-static void
-e_cal_model_calendar_finalize (GObject *object)
-{
- ECalModelCalendarPrivate *priv;
- ECalModelCalendar *model = (ECalModelCalendar *) object;
-
- g_return_if_fail (E_IS_CAL_MODEL_CALENDAR (model));
-
- priv = model->priv;
- if (priv) {
- g_free (priv);
- model->priv = NULL;
- }
-
- if (G_OBJECT_CLASS (e_cal_model_calendar_parent_class)->finalize)
- G_OBJECT_CLASS (e_cal_model_calendar_parent_class)->finalize (object);
-}
-
-/* ETableModel methods */
-static int
-ecmc_column_count (ETableModel *etm)
-{
- return E_CAL_MODEL_CALENDAR_FIELD_LAST;
-}
-
-static ECellDateEditValue *
-get_dtend (ECalModelCalendar *model, ECalModelComponent *comp_data)
-{
- struct icaltimetype tt_end;
-
- if (!comp_data->dtend) {
- icalproperty *prop;
- icaltimezone *zone, *model_zone;
- gboolean got_zone = FALSE;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DTEND_PROPERTY);
- if (!prop)
- return NULL;
-
- tt_end = icalproperty_get_dtend (prop);
-
- if (icaltime_get_tzid (tt_end)
- && e_cal_get_timezone (comp_data->client, icaltime_get_tzid (tt_end), &zone, NULL))
- got_zone = TRUE;
-
- if (e_cal_model_get_flags (E_CAL_MODEL (model)) & E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES) {
- if (got_zone) {
- tt_end = icaltime_from_timet_with_zone (comp_data->instance_end, tt_end.is_date, zone);
- if ((model_zone = e_cal_model_get_timezone (E_CAL_MODEL (model))))
- icaltimezone_convert_time (&tt_end, zone, model_zone);
- } else
- tt_end = icaltime_from_timet (comp_data->instance_end, tt_end.is_date);
- }
-
- if (!icaltime_is_valid_time (tt_end) || icaltime_is_null_time (tt_end))
- return NULL;
-
- comp_data->dtend = g_new0 (ECellDateEditValue, 1);
- comp_data->dtend->tt = tt_end;
-
- if (got_zone)
- comp_data->dtend->zone = zone;
- else
- comp_data->dtend->zone = NULL;
- }
-
- return comp_data->dtend;
-}
-
-static void *
-get_location (ECalModelComponent *comp_data)
-{
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_LOCATION_PROPERTY);
- if (prop)
- return (void *) icalproperty_get_location (prop);
-
- return "";
-}
-
-static void *
-get_transparency (ECalModelComponent *comp_data)
-{
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_TRANSP_PROPERTY);
- if (prop) {
- icalproperty_transp transp;
-
- transp = icalproperty_get_transp (prop);
- if (transp == ICAL_TRANSP_TRANSPARENT ||
- transp == ICAL_TRANSP_TRANSPARENTNOCONFLICT)
- return _("Free");
- else if (transp == ICAL_TRANSP_OPAQUE ||
- transp == ICAL_TRANSP_OPAQUENOCONFLICT)
- return _("Busy");
- }
-
- return NULL;
-}
-
-static void *
-ecmc_value_at (ETableModel *etm, int col, int row)
-{
- ECalModelComponent *comp_data;
- ECalModelCalendarPrivate *priv;
- ECalModelCalendar *model = (ECalModelCalendar *) etm;
-
- g_return_val_if_fail (E_IS_CAL_MODEL_CALENDAR (model), NULL);
-
- priv = model->priv;
-
- g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST, NULL);
- g_return_val_if_fail (row >= 0 && row < e_table_model_row_count (etm), NULL);
-
- if (col < E_CAL_MODEL_FIELD_LAST)
- return E_TABLE_MODEL_CLASS (e_cal_model_calendar_parent_class)->value_at (etm, col, row);
-
- comp_data = e_cal_model_get_component_at (E_CAL_MODEL (model), row);
- if (!comp_data)
- return "";
-
- switch (col) {
- case E_CAL_MODEL_CALENDAR_FIELD_DTEND :
- return get_dtend (model, comp_data);
- case E_CAL_MODEL_CALENDAR_FIELD_LOCATION :
- return get_location (comp_data);
- case E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY :
- return get_transparency (comp_data);
- }
-
- return "";
-}
-
-static void
-set_dtend (ECalModelComponent *comp_data, const void *value)
-{
- ECellDateEditValue *dv = (ECellDateEditValue *) value;
- icalproperty *prop;
- icalparameter *param;
- const char *tzid;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DTEND_PROPERTY);
- if (prop)
- param = icalproperty_get_first_parameter (prop, ICAL_TZID_PARAMETER);
- else
- param = NULL;
-
- /* If we are setting the property to NULL (i.e. removing it), then
- we remove it if it exists. */
- if (!dv) {
- if (prop) {
- icalcomponent_remove_property (comp_data->icalcomp, prop);
- icalproperty_free (prop);
- }
-
- return;
- }
-
- /* If the TZID is set to "UTC", we set the is_utc flag. */
- tzid = dv->zone ? icaltimezone_get_tzid (dv->zone) : "UTC";
- if (tzid && !strcmp (tzid, "UTC"))
- dv->tt.is_utc = 1;
- else
- dv->tt.is_utc = 0;
-
- if (prop) {
- icalproperty_set_dtend (prop, dv->tt);
- } else {
- prop = icalproperty_new_dtend (dv->tt);
- icalcomponent_add_property (comp_data->icalcomp, prop);
- }
-
- /* If the TZID is set to "UTC", we don't want to save the TZID. */
- if (tzid && strcmp (tzid, "UTC")) {
- if (param) {
- icalparameter_set_tzid (param, (char *) tzid);
- } else {
- param = icalparameter_new_tzid ((char *) tzid);
- icalproperty_add_parameter (prop, param);
- }
- } else if (param) {
- icalproperty_remove_parameter (prop, ICAL_TZID_PARAMETER);
- }
-}
-
-static void
-set_location (ECalModelComponent *comp_data, const void *value)
-{
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_LOCATION_PROPERTY);
-
- if (string_is_empty (value)) {
- if (prop) {
- icalcomponent_remove_property (comp_data->icalcomp, prop);
- icalproperty_free (prop);
- }
- } else {
- if (prop)
- icalproperty_set_location (prop, (const char *) value);
- else {
- prop = icalproperty_new_location ((const char *) value);
- icalcomponent_add_property (comp_data->icalcomp, prop);
- }
- }
-}
-
-static void
-set_transparency (ECalModelComponent *comp_data, const void *value)
-{
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_TRANSP_PROPERTY);
-
- if (string_is_empty (value)) {
- if (prop) {
- icalcomponent_remove_property (comp_data->icalcomp, prop);
- icalproperty_free (prop);
- }
- } else {
- icalproperty_transp transp;
-
- if (!strcasecmp (value, "FREE"))
- transp = ICAL_TRANSP_TRANSPARENT;
- else if (!strcasecmp (value, "OPAQUE"))
- transp = ICAL_TRANSP_OPAQUE;
- else {
- if (prop) {
- icalcomponent_remove_property (comp_data->icalcomp, prop);
- icalproperty_free (prop);
- }
-
- return;
- }
-
- if (prop)
- icalproperty_set_transp (prop, transp);
- else {
- prop = icalproperty_new_transp (transp);
- icalcomponent_add_property (comp_data->icalcomp, prop);
- }
- }
-}
-
-static void
-ecmc_set_value_at (ETableModel *etm, int col, int row, const void *value)
-{
- ECalModelComponent *comp_data;
- CalObjModType mod = CALOBJ_MOD_ALL;
- ECalComponent *comp;
- ECalModelCalendar *model = (ECalModelCalendar *) etm;
-
- g_return_if_fail (E_IS_CAL_MODEL_CALENDAR (model));
- g_return_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST);
- g_return_if_fail (row >= 0 && row < e_table_model_row_count (etm));
-
- if (col < E_CAL_MODEL_FIELD_LAST) {
- E_TABLE_MODEL_CLASS (e_cal_model_calendar_parent_class)->set_value_at (etm, col, row, value);
- return;
- }
-
- comp_data = e_cal_model_get_component_at (E_CAL_MODEL (model), row);
- if (!comp_data)
- return;
-
- comp = e_cal_component_new ();
- if (!e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp))) {
- g_object_unref (comp);
- return;
- }
-
- /* ask about mod type */
- if (e_cal_component_is_instance (comp)) {
- if (!recur_component_dialog (comp_data->client, comp, &mod, NULL)) {
- g_object_unref (comp);
- return;
- }
- }
-
- switch (col) {
- case E_CAL_MODEL_CALENDAR_FIELD_DTEND :
- set_dtend (comp_data, value);
- break;
- case E_CAL_MODEL_CALENDAR_FIELD_LOCATION :
- set_location (comp_data, value);
- break;
- case E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY :
- set_transparency (comp_data, value);
- break;
- }
-
- if (e_cal_modify_object (comp_data->client, comp_data->icalcomp, CALOBJ_MOD_ALL, NULL)) {
- if (itip_organizer_is_user (comp, comp_data->client) &&
- send_component_dialog (NULL, comp_data->client, comp, FALSE))
- itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp,
- comp_data->client, NULL, NULL);
- } else {
- g_warning (G_STRLOC ": Could not modify the object!");
-
- /* FIXME Show error dialog */
- }
-
- g_object_unref (comp);
-}
-
-static gboolean
-ecmc_is_cell_editable (ETableModel *etm, int col, int row)
-{
- ECalModelCalendar *model = (ECalModelCalendar *) etm;
-
- g_return_val_if_fail (E_IS_CAL_MODEL_CALENDAR (model), FALSE);
- g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST, FALSE);
- g_return_val_if_fail (row >= -1 || (row >= 0 && row < e_table_model_row_count (etm)), FALSE);
-
- if (col < E_CAL_MODEL_FIELD_LAST)
- return E_TABLE_MODEL_CLASS (e_cal_model_calendar_parent_class)->is_cell_editable (etm, col, row);
-
- switch (col) {
- case E_CAL_MODEL_CALENDAR_FIELD_DTEND :
- case E_CAL_MODEL_CALENDAR_FIELD_LOCATION :
- case E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY :
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void *
-ecmc_duplicate_value (ETableModel *etm, int col, const void *value)
-{
- g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST, NULL);
-
- if (col < E_CAL_MODEL_FIELD_LAST)
- return E_TABLE_MODEL_CLASS (e_cal_model_calendar_parent_class)->duplicate_value (etm, col, value);
-
- switch (col) {
- case E_CAL_MODEL_CALENDAR_FIELD_DTEND :
- if (value) {
- ECellDateEditValue *dv, *orig_dv;
-
- orig_dv = (ECellDateEditValue *) value;
- dv = g_new0 (ECellDateEditValue, 1);
- *dv = *orig_dv;
-
- return dv;
- }
- break;
- case E_CAL_MODEL_CALENDAR_FIELD_LOCATION :
- case E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY :
- return g_strdup (value);
- }
-
- return NULL;
-}
-
-static void
-ecmc_free_value (ETableModel *etm, int col, void *value)
-{
- g_return_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST);
-
- if (col < E_CAL_MODEL_FIELD_LAST) {
- E_TABLE_MODEL_CLASS (e_cal_model_calendar_parent_class)->free_value (etm, col, value);
- return;
- }
-
- switch (col) {
- case E_CAL_MODEL_CALENDAR_FIELD_DTEND :
- case E_CAL_MODEL_CALENDAR_FIELD_LOCATION :
- case E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY :
- if (value)
- g_free (value);
- break;
- }
-}
-
-static void *
-ecmc_initialize_value (ETableModel *etm, int col)
-{
- g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST, NULL);
-
- if (col < E_CAL_MODEL_FIELD_LAST)
- return E_TABLE_MODEL_CLASS (e_cal_model_calendar_parent_class)->initialize_value (etm, col);
-
- switch (col) {
- case E_CAL_MODEL_CALENDAR_FIELD_DTEND :
- return NULL;
- case E_CAL_MODEL_CALENDAR_FIELD_LOCATION :
- case E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY :
- return g_strdup ("");
- }
-
- return NULL;
-}
-
-static gboolean
-ecmc_value_is_empty (ETableModel *etm, int col, const void *value)
-{
- g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST, TRUE);
-
- if (col < E_CAL_MODEL_FIELD_LAST)
- return E_TABLE_MODEL_CLASS (e_cal_model_calendar_parent_class)->value_is_empty (etm, col, value);
-
- switch (col) {
- case E_CAL_MODEL_CALENDAR_FIELD_DTEND :
- return value ? FALSE : TRUE;
- case E_CAL_MODEL_CALENDAR_FIELD_LOCATION :
- case E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY :
- return string_is_empty (value);
- }
-
- return TRUE;
-}
-
-static char *
-ecmc_value_to_string (ETableModel *etm, int col, const void *value)
-{
- g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST, g_strdup (""));
-
- if (col < E_CAL_MODEL_FIELD_LAST)
- return E_TABLE_MODEL_CLASS (e_cal_model_calendar_parent_class)->value_to_string (etm, col, value);
-
- switch (col) {
- case E_CAL_MODEL_CALENDAR_FIELD_DTEND :
- return e_cal_model_date_value_to_string (E_CAL_MODEL (etm), value);
- case E_CAL_MODEL_CALENDAR_FIELD_LOCATION :
- case E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY :
- return g_strdup (value);
- }
-
- return g_strdup ("");
-}
-
-/* ECalModel class methods */
-
-static void
-ecmc_fill_component_from_model (ECalModel *model, ECalModelComponent *comp_data,
- ETableModel *source_model, gint row)
-{
- g_return_if_fail (E_IS_CAL_MODEL_CALENDAR (model));
- g_return_if_fail (comp_data != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (source_model));
-
- set_dtend (comp_data,
- e_table_model_value_at (source_model, E_CAL_MODEL_CALENDAR_FIELD_DTEND, row));
- set_location (comp_data,
- e_table_model_value_at (source_model, E_CAL_MODEL_CALENDAR_FIELD_LOCATION, row));
- set_transparency (comp_data,
- e_table_model_value_at (source_model, E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY, row));
-}
-
-/**
- * e_cal_model_calendar_new
- */
-ECalModelCalendar *
-e_cal_model_calendar_new (void)
-{
- return g_object_new (E_TYPE_CAL_MODEL_CALENDAR, NULL);
-}
diff --git a/calendar/gui/e-cal-model-calendar.h b/calendar/gui/e-cal-model-calendar.h
deleted file mode 100644
index 450871c88f..0000000000
--- a/calendar/gui/e-cal-model-calendar.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Evolution calendar - Data model for ETable
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: Rodrigo Moya <rodrigo@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef E_CAL_MODEL_CALENDAR_H
-#define E_CAL_MODEL_CALENDAR_H
-
-#include "e-cal-model.h"
-
-G_BEGIN_DECLS
-
-#define E_TYPE_CAL_MODEL_CALENDAR (e_cal_model_calendar_get_type ())
-#define E_CAL_MODEL_CALENDAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CAL_MODEL_CALENDAR, ECalModelCalendar))
-#define E_CAL_MODEL_CALENDAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CAL_MODEL_CALENDAR, ECalModelCalendarClass))
-#define E_IS_CAL_MODEL_CALENDAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CAL_MODEL_CALENDAR))
-#define E_IS_CAL_MODEL_CALENDAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_CAL_MODEL_CALENDAR))
-
-typedef struct _ECalModelCalendarPrivate ECalModelCalendarPrivate;
-
-typedef enum {
- /* If you add new items here or reorder them, you have to update the
- .etspec files for the tables using this model */
- E_CAL_MODEL_CALENDAR_FIELD_DTEND = E_CAL_MODEL_FIELD_LAST,
- E_CAL_MODEL_CALENDAR_FIELD_LOCATION,
- E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY,
- E_CAL_MODEL_CALENDAR_FIELD_LAST
-} ECalModelCalendarField;
-
-typedef struct {
- ECalModel model;
- ECalModelCalendarPrivate *priv;
-} ECalModelCalendar;
-
-typedef struct {
- ECalModelClass parent_class;
-} ECalModelCalendarClass;
-
-GType e_cal_model_calendar_get_type (void);
-ECalModelCalendar *e_cal_model_calendar_new (void);
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/e-cal-model-tasks.c b/calendar/gui/e-cal-model-tasks.c
deleted file mode 100644
index 2ef9420788..0000000000
--- a/calendar/gui/e-cal-model-tasks.c
+++ /dev/null
@@ -1,1113 +0,0 @@
-/* Evolution calendar - Data model for ETable
- *
- * Copyright (C) 2004 Ximian, Inc.
- *
- * Authors: Rodrigo Moya <rodrigo@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <math.h>
-#include <string.h>
-#include <gtk/gtkmessagedialog.h>
-#include <libgnome/gnome-i18n.h>
-#include "calendar-config.h"
-#include "e-cal-model-tasks.h"
-#include "e-cell-date-edit-text.h"
-#include "misc.h"
-
-struct _ECalModelTasksPrivate {
-};
-
-static void e_cal_model_tasks_finalize (GObject *object);
-
-static int ecmt_column_count (ETableModel *etm);
-static void *ecmt_value_at (ETableModel *etm, int col, int row);
-static void ecmt_set_value_at (ETableModel *etm, int col, int row, const void *value);
-static gboolean ecmt_is_cell_editable (ETableModel *etm, int col, int row);
-static void *ecmt_duplicate_value (ETableModel *etm, int col, const void *value);
-static void ecmt_free_value (ETableModel *etm, int col, void *value);
-static void *ecmt_initialize_value (ETableModel *etm, int col);
-static gboolean ecmt_value_is_empty (ETableModel *etm, int col, const void *value);
-static char *ecmt_value_to_string (ETableModel *etm, int col, const void *value);
-
-static const char *ecmt_get_color_for_component (ECalModel *model, ECalModelComponent *comp_data);
-static void ecmt_fill_component_from_model (ECalModel *model, ECalModelComponent *comp_data,
- ETableModel *source_model, gint row);
-
-G_DEFINE_TYPE (ECalModelTasks, e_cal_model_tasks, E_TYPE_CAL_MODEL);
-
-static void
-e_cal_model_tasks_class_init (ECalModelTasksClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- ETableModelClass *etm_class = E_TABLE_MODEL_CLASS (klass);
- ECalModelClass *model_class = E_CAL_MODEL_CLASS (klass);
-
- object_class->finalize = e_cal_model_tasks_finalize;
-
- etm_class->column_count = ecmt_column_count;
- etm_class->value_at = ecmt_value_at;
- etm_class->set_value_at = ecmt_set_value_at;
- etm_class->is_cell_editable = ecmt_is_cell_editable;
- etm_class->duplicate_value = ecmt_duplicate_value;
- etm_class->free_value = ecmt_free_value;
- etm_class->initialize_value = ecmt_initialize_value;
- etm_class->value_is_empty = ecmt_value_is_empty;
- etm_class->value_to_string = ecmt_value_to_string;
-
- model_class->get_color_for_component = ecmt_get_color_for_component;
- model_class->fill_component_from_model = ecmt_fill_component_from_model;
-}
-
-static void
-e_cal_model_tasks_init (ECalModelTasks *model)
-{
- ECalModelTasksPrivate *priv;
-
- priv = g_new0 (ECalModelTasksPrivate, 1);
- model->priv = priv;
-
- e_cal_model_set_component_kind (E_CAL_MODEL (model), ICAL_VTODO_COMPONENT);
-}
-
-static void
-e_cal_model_tasks_finalize (GObject *object)
-{
- ECalModelTasksPrivate *priv;
- ECalModelTasks *model = (ECalModelTasks *) object;
-
- g_return_if_fail (E_IS_CAL_MODEL_TASKS (model));
-
- priv = model->priv;
- if (priv) {
- g_free (priv);
- model->priv = NULL;
- }
-
- if (G_OBJECT_CLASS (e_cal_model_tasks_parent_class)->finalize)
- G_OBJECT_CLASS (e_cal_model_tasks_parent_class)->finalize (object);
-}
-
-/* ETableModel methods */
-static int
-ecmt_column_count (ETableModel *etm)
-{
- return E_CAL_MODEL_TASKS_FIELD_LAST;
-}
-
-/* This makes sure a task is marked as complete.
- It makes sure the "Date Completed" property is set. If the completed_date
- is not -1, then that is used, otherwise if the "Date Completed" property
- is not already set it is set to the current time.
- It makes sure the percent is set to 100, and that the status is "Completed".
- Note that this doesn't update the component on the server. */
-static void
-ensure_task_complete (ECalModelComponent *comp_data, time_t completed_date)
-{
- icalproperty *prop;
- gboolean set_completed = TRUE;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_COMPLETED_PROPERTY);
-
- /* Date Completed. */
- if (completed_date == -1) {
- if (prop)
- set_completed = FALSE;
- else
- completed_date = time (NULL);
- }
-
- if (set_completed) {
- icaltimezone *utc_zone;
- struct icaltimetype new_completed;
-
- /* COMPLETED is stored in UTC. */
- utc_zone = icaltimezone_get_utc_timezone ();
- new_completed = icaltime_from_timet_with_zone (completed_date,
- FALSE,
- utc_zone);
- if (prop)
- icalproperty_set_completed (prop, new_completed);
- else {
- prop = icalproperty_new_completed (new_completed);
- icalcomponent_add_property (comp_data->icalcomp, prop);
- }
- }
-
- /* Percent. */
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_PERCENTCOMPLETE_PROPERTY);
- if (!prop)
- icalcomponent_add_property (comp_data->icalcomp, icalproperty_new_percentcomplete (100));
- else
- icalproperty_set_percentcomplete (prop, 100);
-
- /* Status. */
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_STATUS_PROPERTY);
- if (prop)
- icalproperty_set_status (prop, ICAL_STATUS_COMPLETED);
- else
- icalcomponent_add_property (comp_data->icalcomp, icalproperty_new_status (ICAL_STATUS_COMPLETED));
-}
-
-static void
-ensure_task_partially_complete (ECalModelComponent *comp_data)
-{
- icalproperty *prop;
-
- /* Date Completed. */
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_COMPLETED_PROPERTY);
- if (prop) {
- icalcomponent_remove_property (comp_data->icalcomp, prop);
- icalproperty_free (prop);
- }
-
- /* Percent. */
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_PERCENTCOMPLETE_PROPERTY);
- if (!prop)
- icalcomponent_add_property (comp_data->icalcomp, icalproperty_new_percentcomplete (50));
- else if (icalproperty_get_percentcomplete (prop) == 0 || icalproperty_get_percentcomplete (prop) == 100)
- icalproperty_set_percentcomplete (prop, 50);
-
- /* Status. */
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_STATUS_PROPERTY);
- if (prop)
- icalproperty_set_status (prop, ICAL_STATUS_INPROCESS);
- else
- icalcomponent_add_property (comp_data->icalcomp, icalproperty_new_status (ICAL_STATUS_INPROCESS));
-}
-
-
-/* This makes sure a task is marked as incomplete. It clears the
- "Date Completed" property. If the percent is set to 100 it removes it,
- and if the status is "Completed" it sets it to "Needs Action".
- Note that this doesn't update the component on the client. */
-static void
-ensure_task_not_complete (ECalModelComponent *comp_data)
-{
- icalproperty *prop;
-
- /* Date Completed. */
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_COMPLETED_PROPERTY);
- if (prop) {
- icalcomponent_remove_property (comp_data->icalcomp, prop);
- icalproperty_free (prop);
- }
-
- /* Percent. */
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_PERCENTCOMPLETE_PROPERTY);
- if (prop) {
- icalcomponent_remove_property (comp_data->icalcomp, prop);
- icalproperty_free (prop);
- }
-
- /* Status. */
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_STATUS_PROPERTY);
- if (prop)
- icalproperty_set_status (prop, ICAL_STATUS_NEEDSACTION);
-}
-
-static ECellDateEditValue *
-get_completed (ECalModelComponent *comp_data)
-{
- struct icaltimetype tt_completed;
-
- if (!comp_data->completed) {
- icaltimezone *zone;
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_COMPLETED_PROPERTY);
- if (!prop)
- return NULL;
-
- tt_completed = icalproperty_get_completed (prop);
- if (!icaltime_is_valid_time (tt_completed) || icaltime_is_null_time (tt_completed))
- return NULL;
-
- comp_data->completed = g_new0 (ECellDateEditValue, 1);
- comp_data->completed->tt = tt_completed;
-
- if (icaltime_get_tzid (tt_completed)
- && e_cal_get_timezone (comp_data->client, icaltime_get_tzid (tt_completed), &zone, NULL))
- comp_data->completed->zone = zone;
- else
- comp_data->completed->zone = NULL;
- }
-
- return comp_data->completed;
-}
-
-static ECellDateEditValue *
-get_due (ECalModelComponent *comp_data)
-{
- struct icaltimetype tt_due;
-
- if (!comp_data->due) {
- icaltimezone *zone;
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DUE_PROPERTY);
- if (!prop)
- return NULL;
-
- tt_due = icalproperty_get_due (prop);
- if (!icaltime_is_valid_time (tt_due) || icaltime_is_null_time (tt_due))
- return NULL;
-
- comp_data->due = g_new0 (ECellDateEditValue, 1);
- comp_data->due->tt = tt_due;
-
- if (icaltime_get_tzid (tt_due)
- && e_cal_get_timezone (comp_data->client, icaltime_get_tzid (tt_due), &zone, NULL))
- comp_data->due->zone = zone;
- else
- comp_data->due->zone = NULL;
- }
-
- return comp_data->due;
-}
-
-static char *
-get_geo (ECalModelComponent *comp_data)
-{
- icalproperty *prop;
- struct icalgeotype geo;
- static gchar buf[32];
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_GEO_PROPERTY);
- if (prop) {
- geo = icalproperty_get_geo (prop);
- g_snprintf (buf, sizeof (buf), "%g %s, %g %s",
- fabs (geo.lat),
- geo.lat >= 0.0 ? _("N") : _("S"),
- fabs (geo.lon),
- geo.lon >= 0.0 ? _("E") : _("W"));
- return buf;
- }
-
- return "";
-}
-
-static int
-get_percent (ECalModelComponent *comp_data)
-{
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_PERCENTCOMPLETE_PROPERTY);
- if (prop)
- return icalproperty_get_percentcomplete (prop);
-
- return 0;
-}
-
-static char *
-get_priority (ECalModelComponent *comp_data)
-{
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_PRIORITY_PROPERTY);
- if (prop)
- return e_cal_util_priority_to_string (icalproperty_get_priority (prop));
-
- return "";
-}
-
-static char *
-get_status (ECalModelComponent *comp_data)
-{
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_STATUS_PROPERTY);
- if (prop) {
- switch (icalproperty_get_status (prop)) {
- case ICAL_STATUS_NONE:
- return "";
- case ICAL_STATUS_NEEDSACTION:
- return _("Not Started");
- case ICAL_STATUS_INPROCESS:
- return _("In Progress");
- case ICAL_STATUS_COMPLETED:
- return _("Completed");
- case ICAL_STATUS_CANCELLED:
- return _("Cancelled");
- default:
- return "";
- }
- }
-
- return "";
-}
-
-static char *
-get_url (ECalModelComponent *comp_data)
-{
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_URL_PROPERTY);
- if (prop)
- return (char *) icalproperty_get_url (prop);
-
- return "";
-}
-
-static gboolean
-is_complete (ECalModelComponent *comp_data)
-{
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_COMPLETED_PROPERTY);
- if (prop)
- return TRUE;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_PERCENTCOMPLETE_PROPERTY);
- if (prop && icalproperty_get_percentcomplete (prop) == 100)
- return TRUE;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_STATUS_PROPERTY);
- if (prop && icalproperty_get_status (prop) == ICAL_STATUS_COMPLETED)
- return TRUE;
-
- return FALSE;
-}
-
-typedef enum {
- E_CAL_MODEL_TASKS_DUE_NEVER,
- E_CAL_MODEL_TASKS_DUE_FUTURE,
- E_CAL_MODEL_TASKS_DUE_TODAY,
- E_CAL_MODEL_TASKS_DUE_OVERDUE,
- E_CAL_MODEL_TASKS_DUE_COMPLETE
-} ECalModelTasksDueStatus;
-
-
-static ECalModelTasksDueStatus
-get_due_status (ECalModelTasks *model, ECalModelComponent *comp_data)
-{
- icalproperty *prop;
-
- /* First, do we have a due date? */
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DUE_PROPERTY);
- if (!prop)
- return E_CAL_MODEL_TASKS_DUE_NEVER;
- else {
- struct icaltimetype now_tt, due_tt;
- icaltimezone *zone;
-
- /* Second, is it already completed? */
- if (is_complete (comp_data))
- return E_CAL_MODEL_TASKS_DUE_COMPLETE;
-
- /* Third, are we overdue as of right now? */
- due_tt = icalproperty_get_due (prop);
- if (due_tt.is_date) {
- int cmp;
-
- now_tt = icaltime_current_time_with_zone (e_cal_model_get_timezone (E_CAL_MODEL (model)));
- cmp = icaltime_compare_date_only (due_tt, now_tt);
-
- if (cmp < 0)
- return E_CAL_MODEL_TASKS_DUE_OVERDUE;
- else if (cmp == 0)
- return E_CAL_MODEL_TASKS_DUE_TODAY;
- else
- return E_CAL_MODEL_TASKS_DUE_FUTURE;
- } else {
- /* Get the current time in the same timezone as the DUE date.*/
- if (!e_cal_get_timezone (comp_data->client, icaltime_get_tzid (due_tt), &zone, NULL))
- return E_CAL_MODEL_TASKS_DUE_FUTURE;
-
- now_tt = icaltime_current_time_with_zone (zone);
-
- if (icaltime_compare (due_tt, now_tt) <= 0)
- return E_CAL_MODEL_TASKS_DUE_OVERDUE;
- else
- if (icaltime_compare_date_only (due_tt, now_tt) == 0)
- return E_CAL_MODEL_TASKS_DUE_TODAY;
- else
- return E_CAL_MODEL_TASKS_DUE_FUTURE;
- }
- }
-
- return E_CAL_MODEL_TASKS_DUE_NEVER;
-}
-
-static gboolean
-is_overdue (ECalModelTasks *model, ECalModelComponent *comp_data)
-{
- switch (get_due_status (model, comp_data)) {
- case E_CAL_MODEL_TASKS_DUE_NEVER:
- case E_CAL_MODEL_TASKS_DUE_FUTURE:
- case E_CAL_MODEL_TASKS_DUE_COMPLETE:
- return FALSE;
- case E_CAL_MODEL_TASKS_DUE_TODAY:
- case E_CAL_MODEL_TASKS_DUE_OVERDUE:
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void *
-ecmt_value_at (ETableModel *etm, int col, int row)
-{
- ECalModelTasksPrivate *priv;
- ECalModelComponent *comp_data;
- ECalModelTasks *model = (ECalModelTasks *) etm;
-
- g_return_val_if_fail (E_IS_CAL_MODEL_TASKS (model), NULL);
-
- priv = model->priv;
-
- g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_TASKS_FIELD_LAST, NULL);
- g_return_val_if_fail (row >= 0 && row < e_table_model_row_count (etm), NULL);
-
- if (col < E_CAL_MODEL_FIELD_LAST)
- return E_TABLE_MODEL_CLASS (e_cal_model_tasks_parent_class)->value_at (etm, col, row);
-
- comp_data = e_cal_model_get_component_at (E_CAL_MODEL (model), row);
- if (!comp_data)
- return "";
-
- switch (col) {
- case E_CAL_MODEL_TASKS_FIELD_COMPLETED :
- return get_completed (comp_data);
- case E_CAL_MODEL_TASKS_FIELD_COMPLETE :
- return GINT_TO_POINTER (is_complete (comp_data));
- case E_CAL_MODEL_TASKS_FIELD_DUE :
- return get_due (comp_data);
- case E_CAL_MODEL_TASKS_FIELD_GEO :
- return get_geo (comp_data);
- case E_CAL_MODEL_TASKS_FIELD_OVERDUE :
- return GINT_TO_POINTER (is_overdue (model, comp_data));
- case E_CAL_MODEL_TASKS_FIELD_PERCENT :
- return GINT_TO_POINTER (get_percent (comp_data));
- case E_CAL_MODEL_TASKS_FIELD_PRIORITY :
- return get_priority (comp_data);
- case E_CAL_MODEL_TASKS_FIELD_STATUS :
- return get_status (comp_data);
- case E_CAL_MODEL_TASKS_FIELD_URL :
- return get_url (comp_data);
- }
-
- return "";
-}
-
-static void
-set_completed (ECalModelTasks *model, ECalModelComponent *comp_data, const void *value)
-{
- ECellDateEditValue *dv = (ECellDateEditValue *) value;
-
- if (!dv)
- ensure_task_not_complete (comp_data);
- else {
- time_t t;
-
- if (dv->tt.is_date) {
- /* if it's a date, it will be floating,
- but completed needs a date time value */
- dv->tt.is_date = FALSE;
- t = icaltime_as_timet_with_zone (dv->tt, e_cal_model_get_timezone (E_CAL_MODEL (model)));
- } else {
- /* we assume that COMPLETED is entered in the current timezone,
- even though it gets stored in UTC */
- t = icaltime_as_timet_with_zone (dv->tt, dv->zone);
- }
-
- ensure_task_complete (comp_data, t);
- }
-}
-
-static void
-set_complete (ECalModelComponent *comp_data, const void *value)
-{
- gint state = GPOINTER_TO_INT (value);
-
- if (state)
- ensure_task_complete (comp_data, -1);
- else
- ensure_task_not_complete (comp_data);
-}
-
-static void
-set_due (ECalModelComponent *comp_data, const void *value)
-{
- ECellDateEditValue *dv = (ECellDateEditValue *) value;
- icalproperty *prop;
- icalparameter *param;
- const char *tzid;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DUE_PROPERTY);
- if (prop)
- param = icalproperty_get_first_parameter (prop, ICAL_TZID_PARAMETER);
- else
- param = NULL;
-
- /* If we are setting the property to NULL (i.e. removing it), then
- we remove it if it exists. */
- if (!dv) {
- if (prop) {
- icalcomponent_remove_property (comp_data->icalcomp, prop);
- icalproperty_free (prop);
- }
-
- return;
- }
-
- /* If the TZID is set to "UTC", we set the is_utc flag. */
- tzid = dv->zone ? icaltimezone_get_tzid (dv->zone) : "UTC";
- if (tzid && !strcmp (tzid, "UTC"))
- dv->tt.is_utc = 1;
- else
- dv->tt.is_utc = 0;
-
- if (prop) {
- icalproperty_set_due (prop, dv->tt);
- } else {
- prop = icalproperty_new_due (dv->tt);
- icalcomponent_add_property (comp_data->icalcomp, prop);
- }
-
- /* If the TZID is set to "UTC", we don't want to save the TZID. */
- if (tzid && strcmp (tzid, "UTC")) {
- if (param) {
- icalparameter_set_tzid (param, (char *) tzid);
- } else {
- param = icalparameter_new_tzid ((char *) tzid);
- icalproperty_add_parameter (prop, param);
- }
- } else if (param) {
- icalproperty_remove_parameter (prop, ICAL_TZID_PARAMETER);
- }
-}
-
-/* FIXME: We need to set the "transient_for" property for the dialog, but the
- * model doesn't know anything about the windows.
- */
-static void
-show_geo_warning (void)
-{
- GtkWidget *dialog;
-
- dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
- _("The geographical position must be entered "
- "in the format: \n\n45.436845,125.862501"));
- gtk_widget_show (dialog);
-}
-
-static void
-set_geo (ECalModelComponent *comp_data, const char *value)
-{
- double latitude, longitude;
- int matched;
- struct icalgeotype geo;
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_GEO_PROPERTY);
-
- if (string_is_empty (value)) {
- if (prop) {
- icalcomponent_remove_property (comp_data->icalcomp, prop);
- icalproperty_free (prop);
- }
- } else {
- matched = sscanf (value, "%lg , %lg", &latitude, &longitude);
- if (matched != 2)
- show_geo_warning ();
-
- geo.lat = latitude;
- geo.lon = longitude;
- if (prop)
- icalproperty_set_geo (prop, geo);
- else {
- prop = icalproperty_new_geo (geo);
- icalcomponent_add_property (comp_data->icalcomp, prop);
- }
-
- }
-}
-
-static void
-set_status (ECalModelComponent *comp_data, const char *value)
-{
- icalproperty_status status;
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_STATUS_PROPERTY);
-
- /* an empty string is the same as 'None' */
- if (!value[0] || !g_strcasecmp (value, _("None")))
- status = ICAL_STATUS_NONE;
- else if (!g_strcasecmp (value, _("Not Started")))
- status = ICAL_STATUS_NEEDSACTION;
- else if (!g_strcasecmp (value, _("In Progress")))
- status = ICAL_STATUS_INPROCESS;
- else if (!g_strcasecmp (value, _("Completed")))
- status = ICAL_STATUS_COMPLETED;
- else if (!g_strcasecmp (value, _("Cancelled")))
- status = ICAL_STATUS_CANCELLED;
- else {
- g_warning ("Invalid status: %s\n", value);
- return;
- }
-
- if (prop)
- icalproperty_set_status (prop, status);
- else {
- prop = icalproperty_new_status (status);
- icalcomponent_add_property (comp_data->icalcomp, prop);
- }
-
- switch (status) {
- case ICAL_STATUS_NEEDSACTION:
- ensure_task_not_complete (comp_data);
- break;
-
- case ICAL_STATUS_INPROCESS:
- ensure_task_partially_complete (comp_data);
- break;
-
- case ICAL_STATUS_CANCELLED:
- ensure_task_not_complete (comp_data);
- break;
-
- case ICAL_STATUS_COMPLETED:
- ensure_task_complete (comp_data, -1);
- break;
- default:
- break;
- }
-}
-
-static void
-set_percent (ECalModelComponent *comp_data, const void *value)
-{
- icalproperty *prop;
- gint percent = GPOINTER_TO_INT (value);
-
- g_return_if_fail (percent >= -1);
- g_return_if_fail (percent <= 100);
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_PERCENTCOMPLETE_PROPERTY);
-
- /* A value of -1 means it isn't set */
- if (percent == -1) {
- if (prop) {
- icalcomponent_remove_property (comp_data->icalcomp, prop);
- icalproperty_free (prop);
- }
- ensure_task_not_complete (comp_data);
- } else {
- if (prop)
- icalproperty_set_percentcomplete (prop, percent);
- else {
- prop = icalproperty_new_percentcomplete (percent);
- icalcomponent_add_property (comp_data->icalcomp, prop);
- }
-
- if (percent == 100)
- ensure_task_complete (comp_data, -1);
- else {
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_COMPLETED_PROPERTY);
- if (prop) {
- icalcomponent_remove_property (comp_data->icalcomp, prop);
- icalproperty_free (prop);
- }
-
- if (percent > 0)
- set_status (comp_data, _("In Progress"));
- }
- }
-
-}
-
-static void
-set_priority (ECalModelComponent *comp_data, const char *value)
-{
- icalproperty *prop;
- int priority;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_PRIORITY_PROPERTY);
-
- priority = e_cal_util_priority_from_string (value);
- if (priority == -1) {
- g_warning ("Invalid priority");
- priority = 0;
- }
-
- if (prop)
- icalproperty_set_priority (prop, priority);
- else {
- prop = icalproperty_new_priority (priority);
- icalcomponent_add_property (comp_data->icalcomp, prop);
- }
-}
-
-static void
-set_url (ECalModelComponent *comp_data, const char *value)
-{
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_URL_PROPERTY);
-
- if (string_is_empty (value)) {
- if (prop) {
- icalcomponent_remove_property (comp_data->icalcomp, prop);
- icalproperty_free (prop);
- }
- } else {
- if (prop)
- icalproperty_set_url (prop, value);
- else {
- prop = icalproperty_new_url (value);
- icalcomponent_add_property (comp_data->icalcomp, prop);
- }
- }
-}
-
-static void
-ecmt_set_value_at (ETableModel *etm, int col, int row, const void *value)
-{
- ECalModelTasksPrivate *priv;
- ECalModelComponent *comp_data;
- ECalModelTasks *model = (ECalModelTasks *) etm;
-
- g_return_if_fail (E_IS_CAL_MODEL_TASKS (model));
-
- priv = model->priv;
-
- g_return_if_fail (col >= 0 && col < E_CAL_MODEL_TASKS_FIELD_LAST);
- g_return_if_fail (row >= 0 && row < e_table_model_row_count (etm));
-
- if (col < E_CAL_MODEL_FIELD_LAST) {
- E_TABLE_MODEL_CLASS (e_cal_model_tasks_parent_class)->set_value_at (etm, col, row, value);
- return;
- }
-
- comp_data = e_cal_model_get_component_at (E_CAL_MODEL (model), row);
- if (!comp_data)
- return;
-
- switch (col) {
- case E_CAL_MODEL_TASKS_FIELD_COMPLETED :
- set_completed (model, comp_data, value);
- break;
- case E_CAL_MODEL_TASKS_FIELD_COMPLETE :
- set_complete (comp_data, value);
- break;
- case E_CAL_MODEL_TASKS_FIELD_DUE :
- set_due (comp_data, value);
- break;
- case E_CAL_MODEL_TASKS_FIELD_GEO :
- set_geo (comp_data, value);
- break;
- case E_CAL_MODEL_TASKS_FIELD_PERCENT :
- set_percent (comp_data, value);
- break;
- case E_CAL_MODEL_TASKS_FIELD_PRIORITY :
- set_priority (comp_data, value);
- break;
- case E_CAL_MODEL_TASKS_FIELD_STATUS :
- set_status (comp_data, value);
- break;
- case E_CAL_MODEL_TASKS_FIELD_URL :
- set_url (comp_data, value);
- break;
- }
-
- /* FIXME ask about mod type */
- if (!e_cal_modify_object (comp_data->client, comp_data->icalcomp, CALOBJ_MOD_ALL, NULL)) {
- g_warning (G_STRLOC ": Could not modify the object!");
-
- /* FIXME Show error dialog */
- }
-}
-
-static gboolean
-ecmt_is_cell_editable (ETableModel *etm, int col, int row)
-{
- ECalModelTasksPrivate *priv;
- ECalModelTasks *model = (ECalModelTasks *) etm;
-
- g_return_val_if_fail (E_IS_CAL_MODEL_TASKS (model), FALSE);
-
- priv = model->priv;
-
- g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_TASKS_FIELD_LAST, FALSE);
- g_return_val_if_fail (row >= -1 || (row >= 0 && row < e_table_model_row_count (etm)), FALSE);
-
- if (col < E_CAL_MODEL_FIELD_LAST)
- return E_TABLE_MODEL_CLASS (e_cal_model_tasks_parent_class)->is_cell_editable (etm, col, row);
-
- switch (col) {
- case E_CAL_MODEL_TASKS_FIELD_COMPLETED :
- case E_CAL_MODEL_TASKS_FIELD_COMPLETE :
- case E_CAL_MODEL_TASKS_FIELD_DUE :
- case E_CAL_MODEL_TASKS_FIELD_GEO :
- case E_CAL_MODEL_TASKS_FIELD_PERCENT :
- case E_CAL_MODEL_TASKS_FIELD_PRIORITY :
- case E_CAL_MODEL_TASKS_FIELD_STATUS :
- case E_CAL_MODEL_TASKS_FIELD_URL :
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void *
-ecmt_duplicate_value (ETableModel *etm, int col, const void *value)
-{
- g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_TASKS_FIELD_LAST, NULL);
-
- if (col < E_CAL_MODEL_FIELD_LAST)
- return E_TABLE_MODEL_CLASS (e_cal_model_tasks_parent_class)->duplicate_value (etm, col, value);
-
- switch (col) {
- case E_CAL_MODEL_TASKS_FIELD_GEO :
- case E_CAL_MODEL_TASKS_FIELD_PRIORITY :
- case E_CAL_MODEL_TASKS_FIELD_STATUS :
- case E_CAL_MODEL_TASKS_FIELD_URL :
- return g_strdup (value);
- case E_CAL_MODEL_TASKS_FIELD_COMPLETED :
- case E_CAL_MODEL_TASKS_FIELD_DUE :
- if (value) {
- ECellDateEditValue *dv, *orig_dv;
-
- orig_dv = (ECellDateEditValue *) value;
- dv = g_new0 (ECellDateEditValue, 1);
- *dv = *orig_dv;
-
- return dv;
- }
- break;
-
- case E_CAL_MODEL_TASKS_FIELD_COMPLETE :
- case E_CAL_MODEL_TASKS_FIELD_PERCENT :
- case E_CAL_MODEL_TASKS_FIELD_OVERDUE :
- return (void *) value;
- }
-
- return NULL;
-}
-
-static void
-ecmt_free_value (ETableModel *etm, int col, void *value)
-{
- g_return_if_fail (col >= 0 && col < E_CAL_MODEL_TASKS_FIELD_LAST);
-
- if (col < E_CAL_MODEL_FIELD_LAST) {
- E_TABLE_MODEL_CLASS (e_cal_model_tasks_parent_class)->free_value (etm, col, value);
- return;
- }
-
- switch (col) {
- case E_CAL_MODEL_TASKS_FIELD_COMPLETED :
- case E_CAL_MODEL_TASKS_FIELD_DUE :
- case E_CAL_MODEL_TASKS_FIELD_GEO :
- case E_CAL_MODEL_TASKS_FIELD_PRIORITY :
- case E_CAL_MODEL_TASKS_FIELD_STATUS :
- case E_CAL_MODEL_TASKS_FIELD_URL :
- if (value)
- g_free (value);
- break;
- case E_CAL_MODEL_TASKS_FIELD_PERCENT :
- case E_CAL_MODEL_TASKS_FIELD_COMPLETE :
- case E_CAL_MODEL_TASKS_FIELD_OVERDUE :
- break;
- }
-}
-
-static void *
-ecmt_initialize_value (ETableModel *etm, int col)
-{
- ECalModelTasks *model = (ECalModelTasks *) etm;
-
- g_return_val_if_fail (E_IS_CAL_MODEL_TASKS (model), NULL);
- g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_TASKS_FIELD_LAST, NULL);
-
- if (col < E_CAL_MODEL_FIELD_LAST)
- return E_TABLE_MODEL_CLASS (e_cal_model_tasks_parent_class)->initialize_value (etm, col);
-
- switch (col) {
- case E_CAL_MODEL_TASKS_FIELD_GEO :
- case E_CAL_MODEL_TASKS_FIELD_PRIORITY :
- case E_CAL_MODEL_TASKS_FIELD_STATUS :
- case E_CAL_MODEL_TASKS_FIELD_URL :
- return g_strdup ("");
- case E_CAL_MODEL_TASKS_FIELD_COMPLETED :
- case E_CAL_MODEL_TASKS_FIELD_DUE :
- case E_CAL_MODEL_TASKS_FIELD_COMPLETE :
- case E_CAL_MODEL_TASKS_FIELD_OVERDUE :
- return NULL;
- case E_CAL_MODEL_TASKS_FIELD_PERCENT :
- return GINT_TO_POINTER (-1);
- }
-
- return NULL;
-}
-
-static gboolean
-ecmt_value_is_empty (ETableModel *etm, int col, const void *value)
-{
- ECalModelTasksPrivate *priv;
- ECalModelTasks *model = (ECalModelTasks *) etm;
-
- g_return_val_if_fail (E_IS_CAL_MODEL_TASKS (model), TRUE);
- g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_TASKS_FIELD_LAST, TRUE);
-
- priv = model->priv;
-
- if (col < E_CAL_MODEL_FIELD_LAST)
- return E_TABLE_MODEL_CLASS (e_cal_model_tasks_parent_class)->value_is_empty (etm, col, value);
-
- switch (col) {
- case E_CAL_MODEL_TASKS_FIELD_GEO :
- case E_CAL_MODEL_TASKS_FIELD_PRIORITY :
- case E_CAL_MODEL_TASKS_FIELD_STATUS :
- case E_CAL_MODEL_TASKS_FIELD_URL :
- return string_is_empty (value);
- case E_CAL_MODEL_TASKS_FIELD_COMPLETED :
- case E_CAL_MODEL_TASKS_FIELD_DUE :
- return value ? FALSE : TRUE;
- case E_CAL_MODEL_TASKS_FIELD_PERCENT :
- return (GPOINTER_TO_INT (value) < 0) ? TRUE : FALSE;
- case E_CAL_MODEL_TASKS_FIELD_COMPLETE :
- case E_CAL_MODEL_TASKS_FIELD_OVERDUE :
- return TRUE;
- }
-
- return TRUE;
-}
-
-static char *
-ecmt_value_to_string (ETableModel *etm, int col, const void *value)
-{
- ECalModelTasks *model = (ECalModelTasks *) etm;
-
- g_return_val_if_fail (E_IS_CAL_MODEL_TASKS (model), g_strdup (""));
- g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_TASKS_FIELD_LAST, g_strdup (""));
-
- if (col < E_CAL_MODEL_FIELD_LAST)
- return E_TABLE_MODEL_CLASS (e_cal_model_tasks_parent_class)->value_to_string (etm, col, value);
-
- switch (col) {
- case E_CAL_MODEL_TASKS_FIELD_GEO :
- case E_CAL_MODEL_TASKS_FIELD_PRIORITY :
- case E_CAL_MODEL_TASKS_FIELD_STATUS :
- case E_CAL_MODEL_TASKS_FIELD_URL :
- return g_strdup (value);
- case E_CAL_MODEL_TASKS_FIELD_COMPLETED :
- case E_CAL_MODEL_TASKS_FIELD_DUE :
- return e_cal_model_date_value_to_string (E_CAL_MODEL (model), value);
- case E_CAL_MODEL_TASKS_FIELD_COMPLETE :
- case E_CAL_MODEL_TASKS_FIELD_OVERDUE :
- return g_strdup (value ? _("Yes") : _("No"));
- case E_CAL_MODEL_TASKS_FIELD_PERCENT :
- if (GPOINTER_TO_INT (value) < 0)
- return g_strdup ("N/A");
- else
- return g_strdup_printf ("%i%%", GPOINTER_TO_INT (value));
- }
-
- return g_strdup ("");
-}
-
-/* ECalModel class methods */
-
-static const char *
-ecmt_get_color_for_component (ECalModel *model, ECalModelComponent *comp_data)
-{
- g_return_val_if_fail (E_IS_CAL_MODEL_TASKS (model), NULL);
- g_return_val_if_fail (comp_data != NULL, NULL);
-
- switch (get_due_status ((ECalModelTasks *) model, comp_data)) {
- case E_CAL_MODEL_TASKS_DUE_TODAY:
- return calendar_config_get_tasks_due_today_color ();
- case E_CAL_MODEL_TASKS_DUE_OVERDUE:
- return calendar_config_get_tasks_overdue_color ();
- case E_CAL_MODEL_TASKS_DUE_NEVER:
- case E_CAL_MODEL_TASKS_DUE_FUTURE:
- case E_CAL_MODEL_TASKS_DUE_COMPLETE:
- break;
- }
-
- return E_CAL_MODEL_CLASS (e_cal_model_tasks_parent_class)->get_color_for_component (model, comp_data);
-}
-
-static void
-ecmt_fill_component_from_model (ECalModel *model, ECalModelComponent *comp_data,
- ETableModel *source_model, gint row)
-{
- void *value;
-
- g_return_if_fail (E_IS_CAL_MODEL_TASKS (model));
- g_return_if_fail (comp_data != NULL);
- g_return_if_fail (E_IS_TABLE_MODEL (source_model));
-
- /* This just makes sure if anything indicates completion, all
- * three fields do or if percent is 0, status is sane */
-
- value = e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_COMPLETED, row);
- set_completed ((ECalModelTasks *) model, comp_data, value);
- if (!value) {
- value = e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_PERCENT, row);
- set_percent (comp_data, value);
- if (GPOINTER_TO_INT (value) != 100 && GPOINTER_TO_INT (value) != 0)
- set_status (comp_data, e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_STATUS, row));
- }
-
- set_due (comp_data,
- e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_DUE, row));
- set_geo (comp_data,
- e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_GEO, row));
- set_priority (comp_data,
- e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_PRIORITY, row));
- set_url (comp_data,
- e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_URL, row));
-}
-
-/**
- * e_cal_model_tasks_new
- */
-ECalModelTasks *
-e_cal_model_tasks_new (void)
-{
- return g_object_new (E_TYPE_CAL_MODEL_TASKS, NULL);
-}
-
-/**
- * e_cal_model_tasks_mark_task_complete
- */
-void
-e_cal_model_tasks_mark_task_complete (ECalModelTasks *model, gint model_row)
-{
- ECalModelTasksPrivate *priv;
- ECalModelComponent *comp_data;
-
- g_return_if_fail (E_IS_CAL_MODEL_TASKS (model));
- g_return_if_fail (model_row >= 0 && model_row < e_table_model_row_count (E_TABLE_MODEL (model)));
-
- priv = model->priv;
-
- comp_data = e_cal_model_get_component_at (E_CAL_MODEL (model), model_row);
- if (comp_data) {
- e_table_model_pre_change (E_TABLE_MODEL (model));
-
- ensure_task_complete (comp_data, -1);
-
- e_table_model_row_changed (E_TABLE_MODEL (model), model_row);
- }
-}
diff --git a/calendar/gui/e-cal-model-tasks.h b/calendar/gui/e-cal-model-tasks.h
deleted file mode 100644
index b7c5786ab4..0000000000
--- a/calendar/gui/e-cal-model-tasks.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Evolution calendar - Data model for ETable
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: Rodrigo Moya <rodrigo@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef E_CAL_MODEL_TASKS_H
-#define E_CAL_MODEL_TASKS_H
-
-#include "e-cal-model.h"
-
-G_BEGIN_DECLS
-
-#define E_TYPE_CAL_MODEL_TASKS (e_cal_model_tasks_get_type ())
-#define E_CAL_MODEL_TASKS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CAL_MODEL_TASKS, ECalModelTasks))
-#define E_CAL_MODEL_TASKS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CAL_MODEL_TASKS, ECalModelTasksClass))
-#define E_IS_CAL_MODEL_TASKS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CAL_MODEL_TASKS))
-#define E_IS_CAL_MODEL_TASKS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_CAL_MODEL_TASKS))
-
-typedef struct _ECalModelTasksPrivate ECalModelTasksPrivate;
-
-typedef enum {
- /* If you add new items here or reorder them, you have to update the
- .etspec files for the tables using this model */
- E_CAL_MODEL_TASKS_FIELD_COMPLETED = E_CAL_MODEL_FIELD_LAST,
- E_CAL_MODEL_TASKS_FIELD_COMPLETE,
- E_CAL_MODEL_TASKS_FIELD_DUE,
- E_CAL_MODEL_TASKS_FIELD_GEO,
- E_CAL_MODEL_TASKS_FIELD_OVERDUE,
- E_CAL_MODEL_TASKS_FIELD_PERCENT,
- E_CAL_MODEL_TASKS_FIELD_PRIORITY,
- E_CAL_MODEL_TASKS_FIELD_STATUS,
- E_CAL_MODEL_TASKS_FIELD_URL,
- E_CAL_MODEL_TASKS_FIELD_LAST
-} ECalModelTasksField;
-
-typedef struct {
- ECalModel model;
- ECalModelTasksPrivate *priv;
-} ECalModelTasks;
-
-typedef struct {
- ECalModelClass parent_class;
-} ECalModelTasksClass;
-
-GType e_cal_model_tasks_get_type (void);
-ECalModelTasks *e_cal_model_tasks_new (void);
-
-void e_cal_model_tasks_mark_task_complete (ECalModelTasks *model, gint model_row);
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/e-cal-model.c b/calendar/gui/e-cal-model.c
deleted file mode 100644
index 3dd68d2111..0000000000
--- a/calendar/gui/e-cal-model.c
+++ /dev/null
@@ -1,2055 +0,0 @@
-/* Evolution calendar - Data model for ETable
- *
- * Copyright (C) 2004 Novell, Inc.
- *
- * Authors: Rodrigo Moya <rodrigo@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <glib/garray.h>
-#include <libgnome/gnome-i18n.h>
-#include <e-util/e-time-utils.h>
-#include <libecal/e-cal-time-util.h>
-#include "comp-util.h"
-#include "e-cal-model.h"
-#include "itip-utils.h"
-#include "misc.h"
-#include "e-calendar-marshal.h"
-
-typedef struct {
- ECal *client;
- ECalView *query;
-
- gboolean do_query;
-} ECalModelClient;
-
-struct _ECalModelPrivate {
- /* The list of clients we are managing. Each element is of type ECalModelClient */
- GList *clients;
-
- /* The default client in the list */
- ECal *default_client;
-
- /* Array for storing the objects. Each element is of type ECalModelComponent */
- GPtrArray *objects;
-
- icalcomponent_kind kind;
- ECalModelFlags flags;
- icaltimezone *zone;
-
- /* The time range to display */
- time_t start;
- time_t end;
-
- /* The search regular expression */
- gchar *search_sexp;
-
- /* The full regular expression, including time range */
- gchar *full_sexp;
-
- /* The default category */
- gchar *default_category;
-
- /* Addresses for determining icons */
- EAccountList *accounts;
-
- /* Whether we display dates in 24-hour format. */
- gboolean use_24_hour_format;
-};
-
-static void e_cal_model_dispose (GObject *object);
-static void e_cal_model_finalize (GObject *object);
-
-static int ecm_column_count (ETableModel *etm);
-static int ecm_row_count (ETableModel *etm);
-static void *ecm_value_at (ETableModel *etm, int col, int row);
-static void ecm_set_value_at (ETableModel *etm, int col, int row, const void *value);
-static gboolean ecm_is_cell_editable (ETableModel *etm, int col, int row);
-static void ecm_append_row (ETableModel *etm, ETableModel *source, int row);
-static void *ecm_duplicate_value (ETableModel *etm, int col, const void *value);
-static void ecm_free_value (ETableModel *etm, int col, void *value);
-static void *ecm_initialize_value (ETableModel *etm, int col);
-static gboolean ecm_value_is_empty (ETableModel *etm, int col, const void *value);
-static char *ecm_value_to_string (ETableModel *etm, int col, const void *value);
-
-static const char *ecm_get_color_for_component (ECalModel *model, ECalModelComponent *comp_data);
-
-static ECalModelClient *add_new_client (ECalModel *model, ECal *client, gboolean do_query);
-static ECalModelClient *find_client_data (ECalModel *model, ECal *client);
-static void remove_client_objects (ECalModel *model, ECalModelClient *client_data);
-static void remove_client (ECalModel *model, ECalModelClient *client_data);
-
-/* Signal IDs */
-enum {
- TIME_RANGE_CHANGED,
- ROW_APPENDED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-G_DEFINE_TYPE (ECalModel, e_cal_model, E_TABLE_MODEL_TYPE);
-
-static void
-e_cal_model_class_init (ECalModelClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- ETableModelClass *etm_class = E_TABLE_MODEL_CLASS (klass);
-
- object_class->dispose = e_cal_model_dispose;
- object_class->finalize = e_cal_model_finalize;
-
- etm_class->column_count = ecm_column_count;
- etm_class->row_count = ecm_row_count;
- etm_class->value_at = ecm_value_at;
- etm_class->set_value_at = ecm_set_value_at;
- etm_class->is_cell_editable = ecm_is_cell_editable;
- etm_class->append_row = ecm_append_row;
- etm_class->duplicate_value = ecm_duplicate_value;
- etm_class->free_value = ecm_free_value;
- etm_class->initialize_value = ecm_initialize_value;
- etm_class->value_is_empty = ecm_value_is_empty;
- etm_class->value_to_string = ecm_value_to_string;
-
- klass->get_color_for_component = ecm_get_color_for_component;
- klass->fill_component_from_model = NULL;
-
- signals[TIME_RANGE_CHANGED] =
- g_signal_new ("time_range_changed",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (ECalModelClass, time_range_changed),
- NULL, NULL,
- e_calendar_marshal_VOID__LONG_LONG,
- G_TYPE_NONE, 2, G_TYPE_LONG, G_TYPE_LONG);
-
- signals[ROW_APPENDED] =
- g_signal_new ("row_appended",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (ECalModelClass, row_appended),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-}
-
-static void
-e_cal_model_init (ECalModel *model)
-{
- ECalModelPrivate *priv;
-
- priv = g_new0 (ECalModelPrivate, 1);
- model->priv = priv;
-
- /* match none by default */
- priv->start = -1;
- priv->end = -1;
- priv->search_sexp = NULL;
- priv->full_sexp = g_strdup ("#f");
-
- priv->objects = g_ptr_array_new ();
- priv->kind = ICAL_NO_COMPONENT;
- priv->flags = 0;
-
- priv->accounts = itip_addresses_get ();
-
- priv->use_24_hour_format = TRUE;
-}
-
-static void
-clear_objects_array (ECalModelPrivate *priv)
-{
- gint i;
-
- for (i = 0; i < priv->objects->len; i++) {
- ECalModelComponent *comp_data;
-
- comp_data = g_ptr_array_index (priv->objects, i);
- g_assert (comp_data != NULL);
- e_cal_model_free_component_data (comp_data);
- }
-
- g_ptr_array_set_size (priv->objects, 0);
-}
-
-static void
-e_cal_model_dispose (GObject *object)
-{
- ECalModelPrivate *priv;
- ECalModel *model = (ECalModel *) object;
-
- g_return_if_fail (E_IS_CAL_MODEL (model));
-
- priv = model->priv;
-
- if (priv->clients) {
- while (priv->clients != NULL) {
- ECalModelClient *client_data = (ECalModelClient *) priv->clients->data;
-
- g_signal_handlers_disconnect_matched (client_data->client, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, model);
- if (client_data->query)
- g_signal_handlers_disconnect_matched (client_data->query, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, model);
-
- priv->clients = g_list_remove (priv->clients, client_data);
-
-
- g_object_unref (client_data->client);
- if (client_data->query)
- g_object_unref (client_data->query);
- g_free (client_data);
- }
-
- priv->clients = NULL;
- }
-
- if (G_OBJECT_CLASS (e_cal_model_parent_class)->dispose)
- G_OBJECT_CLASS (e_cal_model_parent_class)->dispose (object);
-}
-
-static void
-e_cal_model_finalize (GObject *object)
-{
- ECalModelPrivate *priv;
- ECalModel *model = (ECalModel *) object;
-
- g_return_if_fail (E_IS_CAL_MODEL (model));
-
- priv = model->priv;
-
- g_free (priv->search_sexp);
- g_free (priv->full_sexp);
-
- g_free (priv->default_category);
-
- clear_objects_array (priv);
- g_ptr_array_free (priv->objects, FALSE);
-
- g_free (priv);
-
- if (G_OBJECT_CLASS (e_cal_model_parent_class)->finalize)
- G_OBJECT_CLASS (e_cal_model_parent_class)->finalize (object);
-}
-
-/* ETableModel methods */
-
-static int
-ecm_column_count (ETableModel *etm)
-{
- return E_CAL_MODEL_FIELD_LAST;
-}
-
-static int
-ecm_row_count (ETableModel *etm)
-{
- ECalModelPrivate *priv;
- ECalModel *model = (ECalModel *) etm;
-
- g_return_val_if_fail (E_IS_CAL_MODEL (model), -1);
-
- priv = model->priv;
-
- return priv->objects->len;
-}
-
-static char *
-get_categories (ECalModelComponent *comp_data)
-{
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_CATEGORIES_PROPERTY);
- if (prop)
- return (char *) icalproperty_get_categories (prop);
-
- return "";
-}
-
-static char *
-get_classification (ECalModelComponent *comp_data)
-{
- icalproperty *prop;
- icalproperty_class class;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_CLASS_PROPERTY);
-
- if (!prop)
- return _("Public");
-
- class = icalproperty_get_class (prop);
-
- switch (class)
- {
- case ICAL_CLASS_PUBLIC:
- return _("Public");
- case ICAL_CLASS_PRIVATE:
- return _("Private");
- case ICAL_CLASS_CONFIDENTIAL:
- return _("Confidential");
- default:
- return _("Unknown");
- }
-
- return _("Unknown");
-}
-
-static const char *
-get_color (ECalModel *model, ECalModelComponent *comp_data)
-{
- g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
-
- return e_cal_model_get_color_for_component (model, comp_data);
-}
-
-static char *
-get_description (ECalModelComponent *comp_data)
-{
- icalproperty *prop;
- static GString *str = NULL;
-
- if (str) {
- g_string_free (str, TRUE);
- str = NULL;
- }
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DESCRIPTION_PROPERTY);
- if (prop) {
- str = g_string_new ("");
- do {
- str = g_string_append (str, icalproperty_get_description (prop));
- } while ((prop = icalcomponent_get_next_property (comp_data->icalcomp, ICAL_DESCRIPTION_PROPERTY)));
-
- return str->str;
- }
-
- return "";
-}
-
-static ECellDateEditValue*
-get_dtstart (ECalModel *model, ECalModelComponent *comp_data)
-{
- ECalModelPrivate *priv;
- struct icaltimetype tt_start;
-
- priv = model->priv;
-
- if (!comp_data->dtstart) {
- icalproperty *prop;
- icaltimezone *zone;
- gboolean got_zone = FALSE;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DTSTART_PROPERTY);
- if (!prop)
- return NULL;
-
- tt_start = icalproperty_get_dtstart (prop);
-
- if (icaltime_get_tzid (tt_start)
- && e_cal_get_timezone (comp_data->client, icaltime_get_tzid (tt_start), &zone, NULL))
- got_zone = TRUE;
-
- if (e_cal_model_get_flags (model) & E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES) {
- if (got_zone) {
- tt_start = icaltime_from_timet_with_zone (comp_data->instance_start, tt_start.is_date, zone);
- if (priv->zone)
- icaltimezone_convert_time (&tt_start, zone, priv->zone);
- } else
- tt_start = icaltime_from_timet (comp_data->instance_start, tt_start.is_date);
- }
-
- if (!icaltime_is_valid_time (tt_start) || icaltime_is_null_time (tt_start))
- return NULL;
-
- comp_data->dtstart = g_new0 (ECellDateEditValue, 1);
- comp_data->dtstart->tt = tt_start;
-
- if (got_zone)
- comp_data->dtstart->zone = zone;
- else
- comp_data->dtstart->zone = NULL;
- }
-
- return comp_data->dtstart;
-}
-
-static char *
-get_summary (ECalModelComponent *comp_data)
-{
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_SUMMARY_PROPERTY);
- if (prop)
- return (char *) icalproperty_get_summary (prop);
-
- return "";
-}
-
-static char *
-get_uid (ECalModelComponent *comp_data)
-{
- return (char *) icalcomponent_get_uid (comp_data->icalcomp);
-}
-
-static void *
-ecm_value_at (ETableModel *etm, int col, int row)
-{
- ECalModelPrivate *priv;
- ECalModelComponent *comp_data;
- ECalModel *model = (ECalModel *) etm;
-
- g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
-
- priv = model->priv;
-
- g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST, NULL);
- g_return_val_if_fail (row >= 0 && row < priv->objects->len, NULL);
-
- comp_data = g_ptr_array_index (priv->objects, row);
- g_assert (comp_data != NULL);
-
- switch (col) {
- case E_CAL_MODEL_FIELD_CATEGORIES :
- return get_categories (comp_data);
- case E_CAL_MODEL_FIELD_CLASSIFICATION :
- return get_classification (comp_data);
- case E_CAL_MODEL_FIELD_COLOR :
- return (void *) get_color (model, comp_data);
- case E_CAL_MODEL_FIELD_COMPONENT :
- return comp_data->icalcomp;
- case E_CAL_MODEL_FIELD_DESCRIPTION :
- return get_description (comp_data);
- case E_CAL_MODEL_FIELD_DTSTART :
- return (void *) get_dtstart (model, comp_data);
- case E_CAL_MODEL_FIELD_HAS_ALARMS :
- return GINT_TO_POINTER ((icalcomponent_get_first_component (comp_data->icalcomp,
- ICAL_VALARM_COMPONENT) != NULL));
- case E_CAL_MODEL_FIELD_ICON :
- {
- ECalComponent *comp;
- icalcomponent *icalcomp;
- gint retval = 0;
-
- comp = e_cal_component_new ();
- icalcomp = icalcomponent_new_clone (comp_data->icalcomp);
- if (e_cal_component_set_icalcomponent (comp, icalcomp)) {
- if (e_cal_component_has_recurrences (comp))
- retval = 1;
- else if (itip_organizer_is_user (comp, comp_data->client))
- retval = 3;
- else {
- GSList *attendees = NULL, *sl;
-
- e_cal_component_get_attendee_list (comp, &attendees);
- for (sl = attendees; sl != NULL; sl = sl->next) {
- ECalComponentAttendee *ca = sl->data;
- const char *text;
-
- text = itip_strip_mailto (ca->value);
- if (e_account_list_find (priv->accounts, E_ACCOUNT_FIND_ID_ADDRESS, text) != NULL) {
- if (ca->delto != NULL)
- retval = 3;
- else
- retval = 2;
- break;
- }
- }
-
- e_cal_component_free_attendee_list (attendees);
- }
- } else
- icalcomponent_free (icalcomp);
-
- g_object_unref (comp);
-
- return GINT_TO_POINTER (retval);
- }
- case E_CAL_MODEL_FIELD_SUMMARY :
- return get_summary (comp_data);
- case E_CAL_MODEL_FIELD_UID :
- return get_uid (comp_data);
- }
-
- return "";
-}
-
-static void
-set_categories (ECalModelComponent *comp_data, const char *value)
-{
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_CATEGORIES_PROPERTY);
- if (!value || !(*value)) {
- if (prop) {
- icalcomponent_remove_property (comp_data->icalcomp, prop);
- icalproperty_free (prop);
- }
- } else {
- if (!prop) {
- prop = icalproperty_new_categories (value);
- icalcomponent_add_property (comp_data->icalcomp, prop);
- } else
- icalproperty_set_categories (prop, value);
- }
-}
-
-static void
-set_classification (ECalModelComponent *comp_data, const char *value)
-{
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_CLASS_PROPERTY);
- if (!value || !(*value)) {
- if (prop) {
- icalcomponent_remove_property (comp_data->icalcomp, prop);
- icalproperty_free (prop);
- }
- } else {
- icalproperty_class ical_class;
-
- if (!strcasecmp (value, "PUBLIC"))
- ical_class = ICAL_CLASS_PUBLIC;
- else if (!strcasecmp (value, "PRIVATE"))
- ical_class = ICAL_CLASS_PRIVATE;
- else if (!strcasecmp (value, "CONFIDENTIAL"))
- ical_class = ICAL_CLASS_CONFIDENTIAL;
- else
- ical_class = ICAL_CLASS_NONE;
-
- if (!prop) {
- prop = icalproperty_new_class (ical_class);
- icalcomponent_add_property (comp_data->icalcomp, prop);
- } else
- icalproperty_set_class (prop, ical_class);
- }
-}
-
-static void
-set_description (ECalModelComponent *comp_data, const char *value)
-{
- icalproperty *prop;
-
- /* remove old description(s) */
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DESCRIPTION_PROPERTY);
- while (prop) {
- icalproperty *next;
-
- next = icalcomponent_get_next_property (comp_data->icalcomp, ICAL_DESCRIPTION_PROPERTY);
-
- icalcomponent_remove_property (comp_data->icalcomp, prop);
- icalproperty_free (prop);
-
- prop = next;
- }
-
- /* now add the new description */
- if (!value || !(*value))
- return;
-
- prop = icalproperty_new_description (value);
- icalcomponent_add_property (comp_data->icalcomp, prop);
-}
-
-static void
-set_dtstart (ECalModel *model, ECalModelComponent *comp_data, const void *value)
-{
- ECellDateEditValue *dv = (ECellDateEditValue *) value;
- icalproperty *prop;
- icalparameter *param;
- const char *tzid;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DTSTART_PROPERTY);
- if (prop)
- param = icalproperty_get_first_parameter (prop, ICAL_TZID_PARAMETER);
- else
- param = NULL;
-
- /* If we are setting the property to NULL (i.e. removing it), then
- we remove it if it exists. */
- if (!dv) {
- if (prop) {
- icalcomponent_remove_property (comp_data->icalcomp, prop);
- icalproperty_free (prop);
- }
-
- return;
- }
-
- /* If the TZID is set to "UTC", we set the is_utc flag. */
- tzid = dv->zone ? icaltimezone_get_tzid (dv->zone) : "UTC";
- if (tzid && !strcmp (tzid, "UTC"))
- dv->tt.is_utc = 1;
- else
- dv->tt.is_utc = 0;
-
- if (prop) {
- icalproperty_set_dtstart (prop, dv->tt);
- } else {
- prop = icalproperty_new_dtstart (dv->tt);
- icalcomponent_add_property (comp_data->icalcomp, prop);
- }
-
- /* If the TZID is set to "UTC", we don't want to save the TZID. */
- if (tzid && strcmp (tzid, "UTC")) {
- if (param) {
- icalparameter_set_tzid (param, (char *) tzid);
- } else {
- param = icalparameter_new_tzid ((char *) tzid);
- icalproperty_add_parameter (prop, param);
- }
- } else if (param) {
- icalproperty_remove_parameter (prop, ICAL_TZID_PARAMETER);
- }
-}
-
-static void
-set_summary (ECalModelComponent *comp_data, const char *value)
-{
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_SUMMARY_PROPERTY);
-
- if (string_is_empty (value)) {
- if (prop) {
- icalcomponent_remove_property (comp_data->icalcomp, prop);
- icalproperty_free (prop);
- }
- } else {
- if (prop)
- icalproperty_set_summary (prop, value);
- else {
- prop = icalproperty_new_summary (value);
- icalcomponent_add_property (comp_data->icalcomp, prop);
- }
- }
-}
-
-static void
-ecm_set_value_at (ETableModel *etm, int col, int row, const void *value)
-{
- ECalModelPrivate *priv;
- ECalModelComponent *comp_data;
- ECalModel *model = (ECalModel *) etm;
-
- g_return_if_fail (E_IS_CAL_MODEL (model));
-
- priv = model->priv;
-
- g_return_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST);
- g_return_if_fail (row >= 0 && row < priv->objects->len);
-
- comp_data = g_ptr_array_index (priv->objects, row);
- g_assert (comp_data != NULL);
-
- switch (col) {
- case E_CAL_MODEL_FIELD_CATEGORIES :
- set_categories (comp_data, value);
- break;
- case E_CAL_MODEL_FIELD_CLASSIFICATION :
- set_classification (comp_data, value);
- break;
- case E_CAL_MODEL_FIELD_DESCRIPTION :
- set_description (comp_data, value);
- break;
- case E_CAL_MODEL_FIELD_DTSTART :
- set_dtstart (model, comp_data, value);
- break;
- case E_CAL_MODEL_FIELD_SUMMARY :
- set_summary (comp_data, value);
- break;
- }
-
- /* FIXME ask about mod type */
- if (!e_cal_modify_object (comp_data->client, comp_data->icalcomp, CALOBJ_MOD_ALL, NULL)) {
- g_warning (G_STRLOC ": Could not modify the object!");
-
- /* FIXME Show error dialog */
- }
-}
-
-static gboolean
-ecm_is_cell_editable (ETableModel *etm, int col, int row)
-{
- ECalModelPrivate *priv;
- ECalModel *model = (ECalModel *) etm;
-
- g_return_val_if_fail (E_IS_CAL_MODEL (model), FALSE);
-
- priv = model->priv;
-
- g_return_val_if_fail (col >= 0 && col <= E_CAL_MODEL_FIELD_LAST, FALSE);
- g_return_val_if_fail (row >= -1 || (row >= 0 && row < priv->objects->len), FALSE);
-
- switch (col) {
- case E_CAL_MODEL_FIELD_CATEGORIES :
- case E_CAL_MODEL_FIELD_CLASSIFICATION :
- case E_CAL_MODEL_FIELD_DESCRIPTION :
- case E_CAL_MODEL_FIELD_DTSTART :
- case E_CAL_MODEL_FIELD_SUMMARY :
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-ecm_append_row (ETableModel *etm, ETableModel *source, int row)
-{
- ECalModelClass *model_class;
- ECalModelComponent comp_data;
- ECalModel *model = (ECalModel *) etm;
-
- g_return_if_fail (E_IS_CAL_MODEL (model));
- g_return_if_fail (E_IS_TABLE_MODEL (source));
-
- memset (&comp_data, 0, sizeof (ECalModelComponent));
- comp_data.client = e_cal_model_get_default_client (model);
-
- /* guard against saving before the calendar is open */
- if (!(comp_data.client && e_cal_get_load_state (comp_data.client) == E_CAL_LOAD_LOADED))
- return;
-
- comp_data.icalcomp = e_cal_model_create_component_with_defaults (model);
-
- /* set values for our fields */
- set_categories (&comp_data, e_table_model_value_at (source, E_CAL_MODEL_FIELD_CATEGORIES, row));
- set_classification (&comp_data, e_table_model_value_at (source, E_CAL_MODEL_FIELD_CLASSIFICATION, row));
- set_description (&comp_data, e_table_model_value_at (source, E_CAL_MODEL_FIELD_DESCRIPTION, row));
- set_dtstart (model, &comp_data, e_table_model_value_at (source, E_CAL_MODEL_FIELD_DTSTART, row));
- set_summary (&comp_data, e_table_model_value_at (source, E_CAL_MODEL_FIELD_SUMMARY, row));
-
- /* call the class' method for filling the component */
- model_class = (ECalModelClass *) G_OBJECT_GET_CLASS (model);
- if (model_class->fill_component_from_model != NULL) {
- model_class->fill_component_from_model (model, &comp_data, source, row);
- }
-
- if (!e_cal_create_object (comp_data.client, comp_data.icalcomp, NULL, NULL)) {
- g_warning (G_STRLOC ": Could not create the object!");
-
- /* FIXME: show error dialog */
- icalcomponent_free (comp_data.icalcomp);
- return;
- }
-
- icalcomponent_free (comp_data.icalcomp);
-
- g_signal_emit (G_OBJECT (model), signals[ROW_APPENDED], 0);
-}
-
-static void *
-ecm_duplicate_value (ETableModel *etm, int col, const void *value)
-{
- g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST, NULL);
-
- switch (col) {
- case E_CAL_MODEL_FIELD_CATEGORIES :
- case E_CAL_MODEL_FIELD_CLASSIFICATION :
- case E_CAL_MODEL_FIELD_SUMMARY :
- return g_strdup (value);
- case E_CAL_MODEL_FIELD_HAS_ALARMS :
- case E_CAL_MODEL_FIELD_ICON :
- case E_CAL_MODEL_FIELD_COLOR :
- return (void *) value;
- case E_CAL_MODEL_FIELD_COMPONENT :
- return icalcomponent_new_clone ((icalcomponent *) value);
- case E_CAL_MODEL_FIELD_DTSTART :
- if (value) {
- ECellDateEditValue *dv, *orig_dv;
-
- orig_dv = (ECellDateEditValue *) value;
- dv = g_new0 (ECellDateEditValue, 1);
- *dv = *orig_dv;
-
- return dv;
- }
- break;
- }
-
- return NULL;
-}
-
-static void
-ecm_free_value (ETableModel *etm, int col, void *value)
-{
- g_return_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST);
-
- switch (col) {
- case E_CAL_MODEL_FIELD_CATEGORIES :
- case E_CAL_MODEL_FIELD_DESCRIPTION :
- case E_CAL_MODEL_FIELD_SUMMARY :
- if (value)
- g_free (value);
- break;
- case E_CAL_MODEL_FIELD_CLASSIFICATION :
- case E_CAL_MODEL_FIELD_HAS_ALARMS :
- case E_CAL_MODEL_FIELD_ICON :
- case E_CAL_MODEL_FIELD_COLOR :
- break;
- case E_CAL_MODEL_FIELD_DTSTART :
- if (value)
- g_free (value);
- break;
- case E_CAL_MODEL_FIELD_COMPONENT :
- if (value)
- icalcomponent_free ((icalcomponent *) value);
- break;
- }
-}
-
-static void *
-ecm_initialize_value (ETableModel *etm, int col)
-{
- ECalModelPrivate *priv;
- ECalModel *model = (ECalModel *) etm;
-
- g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
- g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST, NULL);
-
- priv = model->priv;
-
- switch (col) {
- case E_CAL_MODEL_FIELD_CATEGORIES :
- return g_strdup (priv->default_category?priv->default_category:"");
- case E_CAL_MODEL_FIELD_CLASSIFICATION :
- case E_CAL_MODEL_FIELD_DESCRIPTION :
- case E_CAL_MODEL_FIELD_SUMMARY :
- return g_strdup ("");
- case E_CAL_MODEL_FIELD_DTSTART :
- case E_CAL_MODEL_FIELD_HAS_ALARMS :
- case E_CAL_MODEL_FIELD_ICON :
- case E_CAL_MODEL_FIELD_COLOR :
- case E_CAL_MODEL_FIELD_COMPONENT :
- return NULL;
- }
-
- return NULL;
-}
-
-static gboolean
-ecm_value_is_empty (ETableModel *etm, int col, const void *value)
-{
- ECalModelPrivate *priv;
- ECalModel *model = (ECalModel *) etm;
-
- g_return_val_if_fail (E_IS_CAL_MODEL (model), TRUE);
- g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST, TRUE);
-
- priv = model->priv;
-
- switch (col) {
- case E_CAL_MODEL_FIELD_CATEGORIES :
- /* This could be a hack or not. If the categories field only
- * contains the default category, then it possibly means that
- * the user has not entered anything at all in the click-to-add;
- * the category is in the value because we put it there in
- * ecm_initialize_value().
- */
- if (priv->default_category && value && strcmp (priv->default_category, value) == 0)
- return TRUE;
- else
- return string_is_empty (value);
- case E_CAL_MODEL_FIELD_CLASSIFICATION :
- case E_CAL_MODEL_FIELD_DESCRIPTION :
- case E_CAL_MODEL_FIELD_SUMMARY :
- return string_is_empty (value);
- case E_CAL_MODEL_FIELD_DTSTART :
- return value ? FALSE : TRUE;
- case E_CAL_MODEL_FIELD_HAS_ALARMS :
- case E_CAL_MODEL_FIELD_ICON :
- case E_CAL_MODEL_FIELD_COLOR :
- case E_CAL_MODEL_FIELD_COMPONENT :
- return TRUE;
- }
-
- return TRUE;
-}
-
-static char *
-ecm_value_to_string (ETableModel *etm, int col, const void *value)
-{
- g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST, g_strdup (""));
-
- switch (col) {
- case E_CAL_MODEL_FIELD_CATEGORIES :
- case E_CAL_MODEL_FIELD_CLASSIFICATION :
- case E_CAL_MODEL_FIELD_DESCRIPTION :
- case E_CAL_MODEL_FIELD_SUMMARY :
- return g_strdup (value);
- case E_CAL_MODEL_FIELD_DTSTART :
- return e_cal_model_date_value_to_string (E_CAL_MODEL (etm), value);
- case E_CAL_MODEL_FIELD_ICON :
- if (GPOINTER_TO_INT (value) == 0)
- return g_strdup (_("Normal"));
- else if (GPOINTER_TO_INT (value) == 1)
- return g_strdup (_("Recurring"));
- else
- return g_strdup (_("Assigned"));
- case E_CAL_MODEL_FIELD_HAS_ALARMS :
- return g_strdup (value ? _("Yes") : _("No"));
- case E_CAL_MODEL_FIELD_COLOR :
- case E_CAL_MODEL_FIELD_COMPONENT :
- return g_strdup ("");
- }
-
- return g_strdup ("");
-}
-
-/* ECalModel class methods */
-
-typedef struct {
- const gchar *color;
- GList *uris;
-} AssignedColorData;
-
-static const char *
-ecm_get_color_for_component (ECalModel *model, ECalModelComponent *comp_data)
-{
- ESource *source;
- guint32 source_color;
- ECalModelPrivate *priv;
- gint i, first_empty = 0;
- static AssignedColorData assigned_colors[] = {
- { "#BECEDD", NULL }, /* 190 206 221 Blue */
- { "#E2F0EF", NULL }, /* 226 240 239 Light Blue */
- { "#C6E2B7", NULL }, /* 198 226 183 Green */
- { "#E2F0D3", NULL }, /* 226 240 211 Light Green */
- { "#E2D4B7", NULL }, /* 226 212 183 Khaki */
- { "#EAEAC1", NULL }, /* 234 234 193 Light Khaki */
- { "#F0B8B7", NULL }, /* 240 184 183 Pink */
- { "#FED4D3", NULL }, /* 254 212 211 Light Pink */
- { "#E2C6E1", NULL }, /* 226 198 225 Purple */
- { "#F0E2EF", NULL } /* 240 226 239 Light Purple */
- };
-
- g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
-
- priv = model->priv;
-
- source = e_cal_get_source (comp_data->client);
- if (e_source_get_color (source, &source_color)) {
- g_free (comp_data->color);
- comp_data->color = g_strdup_printf ("#%06x", source_color & 0xffffff);
- return comp_data->color;
- }
-
- for (i = 0; i < G_N_ELEMENTS (assigned_colors); i++) {
- GList *l;
-
- if (assigned_colors[i].uris == NULL) {
- first_empty = i;
- continue;
- }
-
- for (l = assigned_colors[i].uris; l != NULL; l = l->next) {
- if (!strcmp ((const char *) l->data,
- e_cal_get_uri (comp_data->client)))
- {
- return assigned_colors[i].color;
- }
- }
- }
-
- /* return the first unused color */
- assigned_colors[first_empty].uris = g_list_append (assigned_colors[first_empty].uris,
- g_strdup (e_cal_get_uri (comp_data->client)));
-
- return assigned_colors[first_empty].color;
-}
-
-/**
- * e_cal_model_get_component_kind
- */
-icalcomponent_kind
-e_cal_model_get_component_kind (ECalModel *model)
-{
- ECalModelPrivate *priv;
-
- g_return_val_if_fail (E_IS_CAL_MODEL (model), ICAL_NO_COMPONENT);
-
- priv = model->priv;
- return priv->kind;
-}
-
-/**
- * e_cal_model_set_component_kind
- */
-void
-e_cal_model_set_component_kind (ECalModel *model, icalcomponent_kind kind)
-{
- ECalModelPrivate *priv;
-
- g_return_if_fail (E_IS_CAL_MODEL (model));
-
- priv = model->priv;
- priv->kind = kind;
-}
-
-/**
- * e_cal_model_get_flags
- */
-ECalModelFlags
-e_cal_model_get_flags (ECalModel *model)
-{
- ECalModelPrivate *priv;
-
- g_return_val_if_fail (E_IS_CAL_MODEL (model), E_CAL_MODEL_FLAGS_INVALID);
-
- priv = model->priv;
- return priv->flags;
-}
-
-/**
- * e_cal_model_set_flags
- */
-void
-e_cal_model_set_flags (ECalModel *model, ECalModelFlags flags)
-{
- ECalModelPrivate *priv;
-
- g_return_if_fail (E_IS_CAL_MODEL (model));
-
- priv = model->priv;
- priv->flags = flags;
-}
-
-/**
- * e_cal_model_get_timezone
- */
-icaltimezone *
-e_cal_model_get_timezone (ECalModel *model)
-{
- g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
- return model->priv->zone;
-}
-
-/**
- * e_cal_model_set_timezone
- */
-void
-e_cal_model_set_timezone (ECalModel *model, icaltimezone *zone)
-{
- ECalModelPrivate *priv;
- GList *l;
-
- g_return_if_fail (E_IS_CAL_MODEL (model));
-
- priv = model->priv;
- if (priv->zone != zone) {
- e_table_model_pre_change (E_TABLE_MODEL (model));
- priv->zone = zone;
-
- for (l = priv->clients; l; l = l->next)
- e_cal_set_default_timezone (((ECalModelClient *)l->data)->client, priv->zone, NULL);
-
- /* the timezone affects the times shown for date fields,
- so we need to redisplay everything */
- e_table_model_changed (E_TABLE_MODEL (model));
- }
-}
-
-/**
- * e_cal_model_set_default_category
- */
-void
-e_cal_model_set_default_category (ECalModel *model, const gchar *default_cat)
-{
- g_return_if_fail (E_IS_CAL_MODEL (model));
-
- if (model->priv->default_category)
- g_free (model->priv->default_category);
-
- model->priv->default_category = g_strdup (default_cat);
-}
-
-/**
- * e_cal_model_get_use_24_hour_format
- */
-gboolean
-e_cal_model_get_use_24_hour_format (ECalModel *model)
-{
- g_return_val_if_fail (E_IS_CAL_MODEL (model), FALSE);
-
- return model->priv->use_24_hour_format;
-}
-
-/**
- * e_cal_model_set_use_24_hour_format
- */
-void
-e_cal_model_set_use_24_hour_format (ECalModel *model, gboolean use24)
-{
- g_return_if_fail (E_IS_CAL_MODEL (model));
-
- if (model->priv->use_24_hour_format != use24) {
- e_table_model_pre_change (E_TABLE_MODEL (model));
- model->priv->use_24_hour_format = use24;
- /* Get the views to redraw themselves. */
- e_table_model_changed (E_TABLE_MODEL (model));
- }
-}
-
-/**
- * e_cal_model_get_default_client
- */
-ECal *
-e_cal_model_get_default_client (ECalModel *model)
-{
- ECalModelPrivate *priv;
- ECalModelClient *client_data;
-
- g_return_val_if_fail (model != NULL, NULL);
- g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
-
- priv = model->priv;
-
- /* FIXME Should we force the client to be open? */
-
- /* we always return a valid ECal, since we rely on it in many places */
- if (priv->default_client)
- return priv->default_client;
-
- if (!priv->clients)
- return NULL;
-
- client_data = (ECalModelClient *) priv->clients->data;
-
- return client_data ? client_data->client : NULL;
-}
-
-void
-e_cal_model_set_default_client (ECalModel *model, ECal *client)
-{
- ECalModelPrivate *priv;
- ECalModelClient *client_data;
-
- g_return_if_fail (model != NULL);
- g_return_if_fail (E_IS_CAL_MODEL (model));
- g_return_if_fail (client != NULL);
- g_return_if_fail (E_IS_CAL (client));
-
- priv = model->priv;
-
- if (priv->default_client) {
- ECalModelClient *client_data;
-
- client_data = find_client_data (model, priv->default_client);
- g_assert (client_data);
-
- if (!client_data->do_query)
- remove_client (model, client_data);
- }
-
- /* Make sure its in the model */
- client_data = add_new_client (model, client, FALSE);
-
- /* Store the default client */
- priv->default_client = client_data->client;
-}
-
-/**
- * e_cal_model_get_client_list
- */
-GList *
-e_cal_model_get_client_list (ECalModel *model)
-{
- GList *list = NULL, *l;
-
- g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
-
- for (l = model->priv->clients; l != NULL; l = l->next) {
- ECalModelClient *client_data = (ECalModelClient *) l->data;
-
- list = g_list_append (list, client_data->client);
- }
-
- return list;
-}
-
-/**
- * e_cal_model_get_client_for_uri
- * @model: A calendar model.
- * @uri: Uri for the client to get.
- */
-ECal *
-e_cal_model_get_client_for_uri (ECalModel *model, const char *uri)
-{
- GList *l;
-
- g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
- g_return_val_if_fail (uri != NULL, NULL);
-
- for (l = model->priv->clients; l != NULL; l = l->next) {
- ECalModelClient *client_data = (ECalModelClient *) l->data;
-
- if (!strcmp (uri, e_cal_get_uri (client_data->client)))
- return client_data->client;
- }
-
- return NULL;
-}
-
-static ECalModelClient *
-find_client_data (ECalModel *model, ECal *client)
-{
- ECalModelPrivate *priv;
- GList *l;
-
- priv = model->priv;
-
- for (l = priv->clients; l != NULL; l = l->next) {
- ECalModelClient *client_data = (ECalModelClient *) l->data;
-
- if (client_data->client == client)
- return client_data;
- }
-
- return NULL;
-}
-
-/* Pass NULL for the client if we just want to find based on uid */
-/* FIXME how do we prevent the same UID is different calendars? */
-static ECalModelComponent *
-search_by_uid_and_client (ECalModelPrivate *priv, ECal *client, const char *uid)
-{
- gint i;
-
- for (i = 0; i < priv->objects->len; i++) {
- ECalModelComponent *comp_data = g_ptr_array_index (priv->objects, i);
-
- if (comp_data) {
- const char *tmp_uid;
-
- tmp_uid = icalcomponent_get_uid (comp_data->icalcomp);
- if (tmp_uid && *tmp_uid) {
- if (comp_data->client == client && !strcmp (uid, tmp_uid))
- return comp_data;
- }
- }
- }
-
- return NULL;
-}
-
-static gint
-get_position_in_array (GPtrArray *objects, gpointer item)
-{
- gint i;
-
- for (i = 0; i < objects->len; i++) {
- if (g_ptr_array_index (objects, i) == item)
- return i;
- }
-
- return -1;
-}
-
-typedef struct {
- ECal *client;
- ECalView *query;
- ECalModel *model;
- icalcomponent *icalcomp;
-} RecurrenceExpansionData;
-
-static gboolean
-add_instance_cb (ECalComponent *comp, time_t instance_start, time_t instance_end, gpointer user_data)
-{
- ECalModelComponent *comp_data;
- ECalModelPrivate *priv;
- RecurrenceExpansionData *rdata = user_data;
-
- priv = rdata->model->priv;
-
- e_table_model_pre_change (E_TABLE_MODEL (rdata->model));
-
- comp_data = g_new0 (ECalModelComponent, 1);
- comp_data->client = g_object_ref (rdata->client);
- comp_data->icalcomp = icalcomponent_new_clone (e_cal_component_get_icalcomponent (comp));
- comp_data->instance_start = instance_start;
- comp_data->instance_end = instance_end;
- comp_data->dtstart = comp_data->dtend = comp_data->due = comp_data->completed = NULL;
- comp_data->color = NULL;
-
- g_ptr_array_add (priv->objects, comp_data);
- e_table_model_row_inserted (E_TABLE_MODEL (rdata->model), priv->objects->len - 1);
-
- return TRUE;
-}
-
-static void
-set_instance_times (ECalModelComponent *comp_data, icaltimezone *zone)
-{
- struct icaltimetype recur_time, start_time, end_time;
-
- recur_time = icalcomponent_get_recurrenceid (comp_data->icalcomp);
- start_time = icalcomponent_get_dtstart (comp_data->icalcomp);
- end_time = icalcomponent_get_dtend (comp_data->icalcomp);
-
- if (zone) {
- if (e_cal_util_component_is_instance (comp_data->icalcomp)) {
- comp_data->instance_start = icaltime_as_timet_with_zone (recur_time, zone);
-
- comp_data->instance_end = comp_data->instance_start +
- (icaltime_as_timet_with_zone (end_time, end_time.zone ? end_time.zone : zone) -
- icaltime_as_timet_with_zone (start_time, start_time.zone ? start_time.zone : zone));
- } else {
- if (start_time.zone) {
- //icaltimezone_convert_time (&start_time, start_time.zone, zone);
- comp_data->instance_start = icaltime_as_timet_with_zone (start_time, start_time.zone);
- } else
- comp_data->instance_start = icaltime_as_timet_with_zone (start_time, zone);
-
- if (end_time.zone) {
- //icaltimezone_convert_time (&end_time, end_time.zone, zone);
- comp_data->instance_end = icaltime_as_timet_with_zone (end_time, end_time.zone);
- } else
- comp_data->instance_end = icaltime_as_timet_with_zone (end_time, zone);
- }
- } else {
- if (e_cal_util_component_is_instance (comp_data->icalcomp)) {
- comp_data->instance_start = icaltime_as_timet (recur_time);
- comp_data->instance_end = comp_data->instance_start +
- (icaltime_as_timet (end_time) -
- icaltime_as_timet (start_time));
- } else {
- comp_data->instance_start = icaltime_as_timet (icalcomponent_get_dtstart (comp_data->icalcomp));
- comp_data->instance_end = icaltime_as_timet (icalcomponent_get_dtend (comp_data->icalcomp));
- }
- }
-}
-
-static void
-e_cal_view_objects_added_cb (ECalView *query, GList *objects, gpointer user_data)
-{
- ECalModel *model = (ECalModel *) user_data;
- ECalModelPrivate *priv;
- GList *l;
-
- priv = model->priv;
-
- for (l = objects; l; l = l->next) {
- if ((priv->flags & E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES)) {
- RecurrenceExpansionData rdata;
-
- rdata.client = e_cal_view_get_client (query);
- rdata.query = query;
- rdata.model = model;
- rdata.icalcomp = l->data;
- e_cal_generate_instances_for_object (rdata.client, l->data,
- priv->start, priv->end,
- (ECalRecurInstanceFn) add_instance_cb,
- &rdata);
- } else {
- ECalModelComponent *comp_data;
-
- e_table_model_pre_change (E_TABLE_MODEL (model));
-
- comp_data = g_new0 (ECalModelComponent, 1);
- comp_data->client = g_object_ref (e_cal_view_get_client (query));
- comp_data->icalcomp = icalcomponent_new_clone (l->data);
- set_instance_times (comp_data, priv->zone);
- comp_data->dtstart = comp_data->dtend = comp_data->due = comp_data->completed = NULL;
- comp_data->color = NULL;
-
- g_ptr_array_add (priv->objects, comp_data);
- e_table_model_row_inserted (E_TABLE_MODEL (model), priv->objects->len - 1);
- }
- }
-}
-
-static void
-e_cal_view_objects_modified_cb (ECalView *query, GList *objects, gpointer user_data)
-{
- ECalModelPrivate *priv;
- ECalModel *model = (ECalModel *) user_data;
- GList *l;
-
- priv = model->priv;
-
- for (l = objects; l; l = l->next) {
- ECalModelComponent *comp_data;
-
- /* remove all recurrences and re-add them after generating them */
- while ((comp_data = search_by_uid_and_client (priv, e_cal_view_get_client (query),
- icalcomponent_get_uid (l->data)))) {
- int pos;
-
- pos = get_position_in_array (priv->objects, comp_data);
- e_table_model_row_deleted (E_TABLE_MODEL (model), pos);
-
- g_ptr_array_remove (priv->objects, comp_data);
- e_cal_model_free_component_data (comp_data);
- }
- }
-
- /* now re-add all objects */
- e_cal_view_objects_added_cb (query, objects, model);
-}
-
-static void
-e_cal_view_objects_removed_cb (ECalView *query, GList *uids, gpointer user_data)
-{
- ECalModelPrivate *priv;
- ECalModel *model = (ECalModel *) user_data;
- GList *l;
-
- priv = model->priv;
-
- for (l = uids; l; l = l->next) {
- ECalModelComponent *comp_data;
- int pos;
-
- e_table_model_pre_change (E_TABLE_MODEL (model));
-
- /* make sure we remove all objects with this UID */
- while ((comp_data = search_by_uid_and_client (priv, e_cal_view_get_client (query), l->data))) {
- pos = get_position_in_array (priv->objects, comp_data);
- e_table_model_row_deleted (E_TABLE_MODEL (model), pos);
-
- g_ptr_array_remove (priv->objects, comp_data);
- e_cal_model_free_component_data (comp_data);
- }
- }
-}
-
-static void
-e_cal_view_progress_cb (ECalView *query, const char *message, int percent, gpointer user_data)
-{
- ECalModel *model = (ECalModel *) user_data;
-
- g_return_if_fail (E_IS_CAL_MODEL (model));
-
- /* FIXME Update status bar */
-}
-
-static void
-e_cal_view_done_cb (ECalView *query, ECalendarStatus status, gpointer user_data)
-{
- ECalModel *model = (ECalModel *) user_data;
-
- g_return_if_fail (E_IS_CAL_MODEL (model));
-
- /* FIXME Clear status bar */
-}
-
-static void
-update_e_cal_view_for_client (ECalModel *model, ECalModelClient *client_data)
-{
- ECalModelPrivate *priv;
-
- priv = model->priv;
-
- /* Skip if this client has not finished loading yet */
- if (e_cal_get_load_state (client_data->client) != E_CAL_LOAD_LOADED)
- return;
-
- /* free the previous query, if any */
- if (client_data->query) {
- g_signal_handlers_disconnect_matched (client_data->query, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, model);
- g_object_unref (client_data->query);
- client_data->query = NULL;
- }
-
- /* prepare the query */
- g_assert (priv->full_sexp != NULL);
-
- /* Don't create the new query if we won't use it */
- if (!client_data->do_query)
- return;
-
- if (!e_cal_get_query (client_data->client, priv->full_sexp, &client_data->query, NULL)) {
- g_warning (G_STRLOC ": Unable to get query");
-
- return;
- }
-
- g_signal_connect (client_data->query, "objects_added", G_CALLBACK (e_cal_view_objects_added_cb), model);
- g_signal_connect (client_data->query, "objects_modified", G_CALLBACK (e_cal_view_objects_modified_cb), model);
- g_signal_connect (client_data->query, "objects_removed", G_CALLBACK (e_cal_view_objects_removed_cb), model);
- g_signal_connect (client_data->query, "view_progress", G_CALLBACK (e_cal_view_progress_cb), model);
- g_signal_connect (client_data->query, "view_done", G_CALLBACK (e_cal_view_done_cb), model);
-
- e_cal_view_start (client_data->query);
-}
-
-static void
-backend_died_cb (ECal *client, gpointer user_data)
-{
- ECalModel *model;
-
- model = E_CAL_MODEL (user_data);
-
- e_cal_model_remove_client (model, client);
-}
-
-static void
-cal_opened_cb (ECal *client, ECalendarStatus status, gpointer user_data)
-{
- ECalModel *model = (ECalModel *) user_data;
- ECalModelClient *client_data;
-
- if (status != E_CALENDAR_STATUS_OK) {
- e_cal_model_remove_client (model, client);
-
- return;
- }
-
- /* Stop listening for this calendar to be opened */
- g_signal_handlers_disconnect_matched (client, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, cal_opened_cb, model);
-
- client_data = find_client_data (model, client);
- g_assert (client_data);
-
- update_e_cal_view_for_client (model, client_data);
-}
-
-
-static ECalModelClient *
-add_new_client (ECalModel *model, ECal *client, gboolean do_query)
-{
- ECalModelPrivate *priv;
- ECalModelClient *client_data;
-
- priv = model->priv;
-
- /* Look to see if we already have this client */
- client_data = find_client_data (model, client);
- if (client_data) {
- if (client_data->do_query)
- return client_data;
- else
- client_data->do_query = do_query;
-
- goto load;
- }
-
- client_data = g_new0 (ECalModelClient, 1);
- client_data->client = g_object_ref (client);
- client_data->query = NULL;
- client_data->do_query = do_query;
-
- priv->clients = g_list_append (priv->clients, client_data);
-
- g_signal_connect (G_OBJECT (client_data->client), "backend_died",
- G_CALLBACK (backend_died_cb), model);
-
- load:
- if (e_cal_get_load_state (client) == E_CAL_LOAD_LOADED) {
- update_e_cal_view_for_client (model, client_data);
- } else {
- g_signal_connect (client, "cal_opened", G_CALLBACK (cal_opened_cb), model);
- e_cal_open_async (client, TRUE);
- }
-
- return client_data;
-}
-
-/**
- * e_cal_model_add_client
- */
-void
-e_cal_model_add_client (ECalModel *model, ECal *client)
-{
- ECalModelPrivate *priv;
- ECalModelClient *client_data;
-
- g_return_if_fail (E_IS_CAL_MODEL (model));
- g_return_if_fail (E_IS_CAL (client));
-
- priv = model->priv;
-
- client_data = add_new_client (model, client, TRUE);
-}
-
-static void
-remove_client_objects (ECalModel *model, ECalModelClient *client_data)
-{
- int i;
-
- /* remove all objects belonging to this client */
- for (i = model->priv->objects->len; i > 0; i--) {
- ECalModelComponent *comp_data = (ECalModelComponent *) g_ptr_array_index (model->priv->objects, i - 1);
-
- g_assert (comp_data != NULL);
-
- if (comp_data->client == client_data->client) {
- e_table_model_pre_change (E_TABLE_MODEL (model));
- e_table_model_row_deleted (E_TABLE_MODEL (model), i - 1);
-
- g_ptr_array_remove (model->priv->objects, comp_data);
- e_cal_model_free_component_data (comp_data);
- }
- }
-}
-
-static void
-remove_client (ECalModel *model, ECalModelClient *client_data)
-{
- /* FIXME We might not want to disconnect the open signal for the default client */
- g_signal_handlers_disconnect_matched (client_data->client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, model);
- if (client_data->query)
- g_signal_handlers_disconnect_matched (client_data->query, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, model);
-
- remove_client_objects (model, client_data);
-
- /* If this is the default client and we were querying (so it
- * was also a source), keep it around but don't query it */
- if (model->priv->default_client == client_data->client && client_data->do_query) {
- client_data->do_query = FALSE;
-
- return;
- }
-
- /* Remove the client from the list */
- model->priv->clients = g_list_remove (model->priv->clients, client_data);
-
- /* free all remaining memory */
- g_object_unref (client_data->client);
- if (client_data->query)
- g_object_unref (client_data->query);
- g_free (client_data);
-}
-
-/**
- * e_cal_model_remove_client
- */
-void
-e_cal_model_remove_client (ECalModel *model, ECal *client)
-{
- ECalModelPrivate *priv;
- ECalModelClient *client_data;
-
- g_return_if_fail (E_IS_CAL_MODEL (model));
- g_return_if_fail (E_IS_CAL (client));
-
- priv = model->priv;
-
- client_data = find_client_data (model, client);
- if (client_data)
- remove_client (model, client_data);
-}
-
-/**
- * e_cal_model_remove_all_clients
- */
-void
-e_cal_model_remove_all_clients (ECalModel *model)
-{
- ECalModelPrivate *priv;
-
- g_return_if_fail (E_IS_CAL_MODEL (model));
-
- priv = model->priv;
- while (priv->clients != NULL) {
- ECalModelClient *client_data = (ECalModelClient *) priv->clients->data;
- remove_client (model, client_data);
- }
-}
-
-static void
-redo_queries (ECalModel *model)
-{
- ECalModelPrivate *priv;
- char *iso_start, *iso_end;
- GList *l;
- int len;
-
- priv = model->priv;
-
- if (priv->full_sexp)
- g_free (priv->full_sexp);
-
- if (priv->start != -1 && priv->end != -1) {
- iso_start = isodate_from_time_t (priv->start);
- iso_end = isodate_from_time_t (priv->end);
-
- priv->full_sexp = g_strdup_printf ("(and (occur-in-time-range? (make-time \"%s\")"
- " (make-time \"%s\"))"
- " %s)",
- iso_start, iso_end,
- priv->search_sexp ? priv->search_sexp : "");
- } else if (priv->search_sexp) {
- priv->full_sexp = g_strdup (priv->search_sexp);
- } else {
- priv->full_sexp = g_strdup ("#f");
- }
-
- /* clean up the current contents */
- e_table_model_pre_change (E_TABLE_MODEL (model));
- len = priv->objects->len;
- e_table_model_rows_deleted (E_TABLE_MODEL (model), 0, len);
- clear_objects_array (priv);
-
- /* update the query for all clients */
- for (l = priv->clients; l != NULL; l = l->next) {
- ECalModelClient *client_data;
-
- client_data = (ECalModelClient *) l->data;
- update_e_cal_view_for_client (model, client_data);
- }
-}
-
-void
-e_cal_model_get_time_range (ECalModel *model, time_t *start, time_t *end)
-{
- ECalModelPrivate *priv;
-
- g_return_if_fail (model != NULL);
- g_return_if_fail (E_IS_CAL_MODEL (model));
-
- priv = model->priv;
-
- if (start)
- *start = priv->start;
-
- if (end)
- *end = priv->end;
-}
-
-void
-e_cal_model_set_time_range (ECalModel *model, time_t start, time_t end)
-{
- ECalModelPrivate *priv;
-
- g_return_if_fail (model != NULL);
- g_return_if_fail (E_IS_CAL_MODEL (model));
- g_return_if_fail (start >= 0 && end >= 0);
- g_return_if_fail (start <= end);
-
- priv = model->priv;
-
- if (priv->start == start && priv->end == end)
- return;
-
- priv->start = start;
- priv->end = end;
-
- g_signal_emit (G_OBJECT (model), signals[TIME_RANGE_CHANGED], 0, start, end);
- redo_queries (model);
-}
-
-const char *
-e_cal_model_get_search_query (ECalModel *model)
-{
- ECalModelPrivate *priv;
-
- g_return_val_if_fail (model != NULL, NULL);
- g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
-
- priv = model->priv;
-
- return priv->search_sexp;
-}
-
-/**
- * e_cal_model_set_query
- */
-void
-e_cal_model_set_search_query (ECalModel *model, const char *sexp)
-{
- ECalModelPrivate *priv;
-
- g_return_if_fail (E_IS_CAL_MODEL (model));
-
- priv = model->priv;
-
- if (!strcmp (sexp ? sexp : "", priv->search_sexp ? priv->search_sexp : ""))
- return;
-
- if (priv->search_sexp)
- g_free (priv->search_sexp);
-
- priv->search_sexp = g_strdup (sexp);
-
- redo_queries (model);
-}
-
-/**
- * e_cal_model_create_component_with_defaults
- */
-icalcomponent *
-e_cal_model_create_component_with_defaults (ECalModel *model)
-{
- ECalModelPrivate *priv;
- ECalComponent *comp;
- icalcomponent *icalcomp;
- ECal *client;
-
- g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
-
- priv = model->priv;
-
- g_return_val_if_fail (priv->clients != NULL, NULL);
-
- client = e_cal_model_get_default_client (model);
- if (!client)
- return icalcomponent_new (priv->kind);
-
- switch (priv->kind) {
- case ICAL_VEVENT_COMPONENT :
- comp = cal_comp_event_new_with_defaults (client);
- break;
- case ICAL_VTODO_COMPONENT :
- comp = cal_comp_task_new_with_defaults (client);
- break;
- default:
- return NULL;
- }
-
- if (!comp)
- return icalcomponent_new (priv->kind);
-
- icalcomp = icalcomponent_new_clone (e_cal_component_get_icalcomponent (comp));
- g_object_unref (comp);
-
- /* make sure the component has an UID */
- if (!icalcomponent_get_uid (icalcomp)) {
- char *uid;
-
- uid = e_cal_component_gen_uid ();
- icalcomponent_set_uid (icalcomp, uid);
-
- g_free (uid);
- }
-
- return icalcomp;
-}
-
-/**
- * e_cal_model_get_color_for_component
- */
-const gchar *
-e_cal_model_get_color_for_component (ECalModel *model, ECalModelComponent *comp_data)
-{
- ECalModelClass *model_class;
- const gchar *color = NULL;
-
- g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
- g_return_val_if_fail (comp_data != NULL, NULL);
-
- model_class = (ECalModelClass *) G_OBJECT_GET_CLASS (model);
- if (model_class->get_color_for_component != NULL)
- color = model_class->get_color_for_component (model, comp_data);
-
- if (!color)
- color = ecm_get_color_for_component (model, comp_data);
-
- return color;
-}
-
-/**
- * e_cal_model_get_rgb_color_for_component
- */
-gboolean
-e_cal_model_get_rgb_color_for_component (ECalModel *model, ECalModelComponent *comp_data, double *red, double *green, double *blue)
-{
- GdkColor gdk_color;
- const gchar *color;
-
- color = e_cal_model_get_color_for_component (model, comp_data);
- if (color && gdk_color_parse (color, &gdk_color)) {
-
- if (red)
- *red = ((double) gdk_color.red)/0xffff;
- if (green)
- *green = ((double) gdk_color.green)/0xffff;
- if (blue)
- *blue = ((double) gdk_color.blue)/0xffff;
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-/**
- * e_cal_model_get_component_at
- */
-ECalModelComponent *
-e_cal_model_get_component_at (ECalModel *model, gint row)
-{
- ECalModelPrivate *priv;
-
- g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
-
- priv = model->priv;
-
- g_return_val_if_fail (row >= 0 && row < priv->objects->len, NULL);
-
- return g_ptr_array_index (priv->objects, row);
-}
-
-ECalModelComponent *
-e_cal_model_get_component_for_uid (ECalModel *model, const char *uid)
-{
- ECalModelPrivate *priv;
-
- g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
-
- priv = model->priv;
-
- return search_by_uid_and_client (priv, NULL, uid);
-}
-
-/**
- * e_cal_model_date_value_to_string
- */
-gchar*
-e_cal_model_date_value_to_string (ECalModel *model, const void *value)
-{
- ECalModelPrivate *priv;
- ECellDateEditValue *dv = (ECellDateEditValue *) value;
- struct icaltimetype tt;
- struct tm tmp_tm;
- char buffer[64];
-
- g_return_val_if_fail (E_IS_CAL_MODEL (model), g_strdup (""));
-
- priv = model->priv;
-
- if (!dv)
- return g_strdup ("");
-
- /* We currently convert all the dates to the current timezone. */
- tt = dv->tt;
- icaltimezone_convert_time (&tt, dv->zone, priv->zone);
-
- tmp_tm.tm_year = tt.year - 1900;
- tmp_tm.tm_mon = tt.month - 1;
- tmp_tm.tm_mday = tt.day;
- tmp_tm.tm_hour = tt.hour;
- tmp_tm.tm_min = tt.minute;
- tmp_tm.tm_sec = tt.second;
- tmp_tm.tm_isdst = -1;
-
- tmp_tm.tm_wday = time_day_of_week (tt.day, tt.month - 1, tt.year);
-
- memset (buffer, 0, sizeof (buffer));
- e_time_format_date_and_time (&tmp_tm, priv->use_24_hour_format,
- TRUE, FALSE,
- buffer, sizeof (buffer));
- return g_strdup (buffer);
-}
-
-static ECellDateEditValue *
-copy_ecdv (ECellDateEditValue *ecdv)
-{
- ECellDateEditValue *new_ecdv;
-
- new_ecdv = g_new0 (ECellDateEditValue, 1);
- new_ecdv->tt = ecdv ? ecdv->tt : icaltime_null_time ();
- new_ecdv->zone = ecdv ? ecdv->zone : NULL;
-
- return new_ecdv;
-}
-
-/**
- * e_cal_model_copy_component_data
- */
-ECalModelComponent *
-e_cal_model_copy_component_data (ECalModelComponent *comp_data)
-{
- ECalModelComponent *new_data;
-
- g_return_val_if_fail (comp_data != NULL, NULL);
-
- new_data = g_new0 (ECalModelComponent, 1);
-
- new_data->instance_start = comp_data->instance_start;
- new_data->instance_end = comp_data->instance_end;
- if (comp_data->icalcomp)
- new_data->icalcomp = icalcomponent_new_clone (comp_data->icalcomp);
- if (comp_data->client)
- new_data->client = g_object_ref (comp_data->client);
- if (comp_data->dtstart)
- new_data->dtstart = copy_ecdv (comp_data->dtstart);
- if (comp_data->dtend)
- new_data->dtend = copy_ecdv (comp_data->dtend);
- if (comp_data->due)
- new_data->due = copy_ecdv (comp_data->due);
- if (comp_data->completed)
- new_data->completed = copy_ecdv (comp_data->completed);
- if (comp_data->color)
- new_data->color = g_strdup (comp_data->color);
-
- return new_data;
-}
-
-/**
- * e_cal_model_free_component_data
- */
-void
-e_cal_model_free_component_data (ECalModelComponent *comp_data)
-{
- g_return_if_fail (comp_data != NULL);
-
- if (comp_data->client) {
- g_object_unref (comp_data->client);
- comp_data->client = NULL;
- }
- if (comp_data->icalcomp) {
- icalcomponent_free (comp_data->icalcomp);
- comp_data->icalcomp = NULL;
- }
- if (comp_data->dtstart) {
- g_free (comp_data->dtstart);
- comp_data->dtstart = NULL;
- }
- if (comp_data->dtend) {
- g_free (comp_data->dtend);
- comp_data->dtend = NULL;
- }
- if (comp_data->due) {
- g_free (comp_data->due);
- comp_data->due = NULL;
- }
- if (comp_data->completed) {
- g_free (comp_data->completed);
- comp_data->completed = NULL;
- }
- if (comp_data->color) {
- g_free (comp_data->color);
- comp_data->color = NULL;
- }
-
- g_free (comp_data);
-}
-
-/**
- * e_cal_model_generate_instances
- *
- * cb function is not called with cb_data, but with ECalModelGenerateInstancesData which contains cb_data
- */
-void
-e_cal_model_generate_instances (ECalModel *model, time_t start, time_t end,
- ECalRecurInstanceFn cb, gpointer cb_data)
-{
- ECalModelGenerateInstancesData mdata;
- gint i, n;
-
- n = e_table_model_row_count (E_TABLE_MODEL (model));
- for (i = 0; i < n; i ++) {
- ECalModelComponent *comp_data = e_cal_model_get_component_at (model, i);
-
- mdata.comp_data = comp_data;
- mdata.cb_data = cb_data;
- e_cal_generate_instances_for_object (comp_data->client, comp_data->icalcomp, start, end, cb, &mdata);
- }
-}
diff --git a/calendar/gui/e-cal-model.h b/calendar/gui/e-cal-model.h
deleted file mode 100644
index d5e2fc4960..0000000000
--- a/calendar/gui/e-cal-model.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/* Evolution calendar - Data model for ETable
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: Rodrigo Moya <rodrigo@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef E_CAL_MODEL_H
-#define E_CAL_MODEL_H
-
-#include <gal/e-table/e-table-model.h>
-#include <libecal/e-cal.h>
-#include "e-cell-date-edit-text.h"
-
-G_BEGIN_DECLS
-
-#define E_TYPE_CAL_MODEL (e_cal_model_get_type ())
-#define E_CAL_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CAL_MODEL, ECalModel))
-#define E_CAL_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CAL_MODEL, ECalModelClass))
-#define E_IS_CAL_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CAL_MODEL))
-#define E_IS_CAL_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_CAL_MODEL))
-
-typedef struct _ECalModelPrivate ECalModelPrivate;
-
-typedef enum {
- /* If you add new items here or reorder them, you have to update the
- .etspec files for the tables using this model */
- E_CAL_MODEL_FIELD_CATEGORIES,
- E_CAL_MODEL_FIELD_CLASSIFICATION,
- E_CAL_MODEL_FIELD_COLOR, /* not a real field */
- E_CAL_MODEL_FIELD_COMPONENT, /* not a real field */
- E_CAL_MODEL_FIELD_DESCRIPTION,
- E_CAL_MODEL_FIELD_DTSTART,
- E_CAL_MODEL_FIELD_HAS_ALARMS, /* not a real field */
- E_CAL_MODEL_FIELD_ICON, /* not a real field */
- E_CAL_MODEL_FIELD_SUMMARY,
- E_CAL_MODEL_FIELD_UID,
- E_CAL_MODEL_FIELD_LAST
-} ECalModelField;
-
-typedef enum {
- E_CAL_MODEL_FLAGS_INVALID = -1,
- E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES = 0x01
-} ECalModelFlags;
-
-typedef struct {
- ECal *client;
- icalcomponent *icalcomp;
- time_t instance_start;
- time_t instance_end;
-
- /* private data */
- ECellDateEditValue *dtstart;
- ECellDateEditValue *dtend;
- ECellDateEditValue *due;
- ECellDateEditValue *completed;
- gchar *color;
-} ECalModelComponent;
-
-typedef struct {
- ECalModelComponent *comp_data;
- gpointer cb_data;
-} ECalModelGenerateInstancesData;
-
-typedef struct _ECalModel {
- ETableModel model;
- ECalModelPrivate *priv;
-} ECalModel;
-
-typedef struct {
- ETableModelClass parent_class;
-
- /* virtual methods */
- const gchar * (* get_color_for_component) (ECalModel *model, ECalModelComponent *comp_data);
- void (* fill_component_from_model) (ECalModel *model, ECalModelComponent *comp_data,
- ETableModel *source_model, gint row);
-
- /* Signals */
- void (* time_range_changed) (ECalModel *model, time_t start, time_t end);
- void (* row_appended) (ECalModel *model);
-} ECalModelClass;
-
-GType e_cal_model_get_type (void);
-icalcomponent_kind e_cal_model_get_component_kind (ECalModel *model);
-void e_cal_model_set_component_kind (ECalModel *model,
- icalcomponent_kind kind);
-ECalModelFlags e_cal_model_get_flags (ECalModel *model);
-void e_cal_model_set_flags (ECalModel *model,
- ECalModelFlags flags);
-icaltimezone *e_cal_model_get_timezone (ECalModel *model);
-void e_cal_model_set_timezone (ECalModel *model,
- icaltimezone *zone);
-void e_cal_model_set_default_category (ECalModel *model,
- const gchar *default_cat);
-gboolean e_cal_model_get_use_24_hour_format (ECalModel *model);
-void e_cal_model_set_use_24_hour_format (ECalModel *model,
- gboolean use24);
-ECal *e_cal_model_get_default_client (ECalModel *model);
-void e_cal_model_set_default_client (ECalModel *model,
- ECal *client);
-GList *e_cal_model_get_client_list (ECalModel *model);
-ECal *e_cal_model_get_client_for_uri (ECalModel *model,
- const char *uri);
-void e_cal_model_add_client (ECalModel *model,
- ECal *client);
-void e_cal_model_remove_client (ECalModel *model,
- ECal *client);
-void e_cal_model_remove_all_clients (ECalModel *model);
-void e_cal_model_get_time_range (ECalModel *model,
- time_t *start,
- time_t *end);
-void e_cal_model_set_time_range (ECalModel *model,
- time_t start,
- time_t end);
-const char *e_cal_model_get_search_query (ECalModel *model);
-void e_cal_model_set_search_query (ECalModel *model,
- const gchar *sexp);
-icalcomponent *e_cal_model_create_component_with_defaults (ECalModel *model);
-const gchar *e_cal_model_get_color_for_component (ECalModel *model,
- ECalModelComponent *comp_data);
-gboolean e_cal_model_get_rgb_color_for_component (ECalModel *model,
- ECalModelComponent *comp_data,
- double *red,
- double *green,
- double *blue);
-ECalModelComponent *e_cal_model_get_component_at (ECalModel *model,
- gint row);
-ECalModelComponent *e_cal_model_get_component_for_uid (ECalModel *model,
- const char *uid);
-gchar *e_cal_model_date_value_to_string (ECalModel *model,
- const void *value);
-ECalModelComponent *e_cal_model_copy_component_data (ECalModelComponent *comp_data);
-void e_cal_model_free_component_data (ECalModelComponent *comp_data);
-void e_cal_model_generate_instances (ECalModel *model,
- time_t start,
- time_t end,
- ECalRecurInstanceFn cb,
- gpointer cb_data);
-
-
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/e-cal-popup.c b/calendar/gui/e-cal-popup.c
deleted file mode 100644
index 00dd097b17..0000000000
--- a/calendar/gui/e-cal-popup.c
+++ /dev/null
@@ -1,337 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Michael Zucchi <notzed@ximian.com>
- *
- * Copyright 2004 Novell, Inc. (www.novell.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <stdlib.h>
-
-#include <glib.h>
-
-#include "e-cal-popup.h"
-#include <libedataserverui/e-source-selector.h>
-
-#include "gui/e-calendar-view.h"
-#include "gui/e-cal-model.h"
-#include "itip-utils.h"
-
-static GObjectClass *ecalp_parent;
-
-static void
-ecalp_init(GObject *o)
-{
- /*ECalPopup *eabp = (ECalPopup *)o; */
-}
-
-static void
-ecalp_finalise(GObject *o)
-{
- ((GObjectClass *)ecalp_parent)->finalize(o);
-}
-
-static void
-ecalp_target_free(EPopup *ep, EPopupTarget *t)
-{
- switch (t->type) {
- case E_CAL_POPUP_TARGET_SELECT: {
- ECalPopupTargetSelect *s = (ECalPopupTargetSelect *)t;
- int i;
-
- for (i=0;i<s->events->len;i++)
- e_cal_model_free_component_data(s->events->pdata[i]);
- g_ptr_array_free(s->events, TRUE);
- g_object_unref(s->model);
- break; }
- case E_CAL_POPUP_TARGET_SOURCE: {
- ECalPopupTargetSource *s = (ECalPopupTargetSource *)t;
-
- g_object_unref(s->selector);
- break; }
- }
-
- ((EPopupClass *)ecalp_parent)->target_free(ep, t);
-}
-
-static void
-ecalp_class_init(GObjectClass *klass)
-{
- klass->finalize = ecalp_finalise;
- ((EPopupClass *)klass)->target_free = ecalp_target_free;
-}
-
-GType
-e_cal_popup_get_type(void)
-{
- static GType type = 0;
-
- if (type == 0) {
- static const GTypeInfo info = {
- sizeof(ECalPopupClass),
- NULL, NULL,
- (GClassInitFunc)ecalp_class_init,
- NULL, NULL,
- sizeof(ECalPopup), 0,
- (GInstanceInitFunc)ecalp_init
- };
- ecalp_parent = g_type_class_ref(e_popup_get_type());
- type = g_type_register_static(e_popup_get_type(), "ECalPopup", &info, 0);
- }
-
- return type;
-}
-
-ECalPopup *e_cal_popup_new(const char *menuid)
-{
- ECalPopup *eabp = g_object_new(e_cal_popup_get_type(), 0);
-
- e_popup_construct(&eabp->popup, menuid);
-
- return eabp;
-}
-
-/**
- * e_cal_popup_target_new_select:
- * @eabp:
- * @model: The calendar model.
- * @events: An array of pointers to ECalModelComponent items. These
- * items must be copied. They, and the @events array will be freed by
- * the popup menu automatically.
- *
- * Create a new selection popup target.
- *
- * Return value:
- **/
-ECalPopupTargetSelect *
-e_cal_popup_target_new_select(ECalPopup *eabp, struct _ECalModel *model, GPtrArray *events)
-{
- ECalPopupTargetSelect *t = e_popup_target_new(&eabp->popup, E_CAL_POPUP_TARGET_SELECT, sizeof(*t));
- guint32 mask = ~0;
- ECal *client;
- gboolean read_only;
-
- /* FIXME: This is duplicated in e-cal-menu */
-
- t->model = model;
- g_object_ref(t->model);
- t->events = events;
-
- if (t->events->len == 0) {
- client = e_cal_model_get_default_client(t->model);
- } else {
- ECalModelComponent *comp_data = (ECalModelComponent *)t->events->pdata[0];
-
- mask &= ~E_CAL_POPUP_SELECT_ANY;
- if (t->events->len == 1)
- mask &= ~E_CAL_POPUP_SELECT_ONE;
- else
- mask &= ~E_CAL_POPUP_SELECT_MANY;
-
- if (icalcomponent_get_first_property (comp_data->icalcomp, ICAL_URL_PROPERTY))
- mask &= ~E_CAL_POPUP_SELECT_HASURL;
-
- if (e_cal_util_component_has_recurrences (comp_data->icalcomp))
- mask &= ~E_CAL_POPUP_SELECT_RECURRING;
- else if (e_cal_util_component_is_instance (comp_data->icalcomp))
- mask &= ~E_CAL_POPUP_SELECT_RECURRING;
- else
- mask &= ~E_CAL_POPUP_SELECT_NONRECURRING;
-
- if (e_cal_util_component_is_instance (comp_data->icalcomp))
- mask &= ~E_CAL_POPUP_SELECT_INSTANCE;
-
- if (e_cal_util_component_has_organizer (comp_data->icalcomp)) {
- ECalComponent *comp;
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp));
- if (!itip_organizer_is_user (comp, comp_data->client))
- mask &= ~E_CAL_POPUP_SELECT_ORGANIZER;
-
- g_object_unref (comp);
- } else {
- /* organiser is synonym for owner in this case */
- mask &= ~(E_CAL_POPUP_SELECT_ORGANIZER|E_CAL_POPUP_SELECT_NOTMEETING);
- }
-
- client = comp_data->client;
- }
-
- e_cal_is_read_only(client, &read_only, NULL);
- if (!read_only)
- mask &= ~E_CAL_POPUP_SELECT_EDITABLE;
-
- if (!e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_TASK_ASSIGNMENT)
- && !e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_CONV_TO_ASSIGN_TASK))
- mask &= ~E_CAL_POPUP_SELECT_ASSIGNABLE;
-
- /* This bit isn't implemented ... */
- mask &= ~E_CAL_POPUP_SELECT_NOTEDITING;
-
- t->target.mask = mask;
-
- return t;
-}
-
-ECalPopupTargetSource *
-e_cal_popup_target_new_source(ECalPopup *eabp, ESourceSelector *selector)
-{
- ECalPopupTargetSource *t = e_popup_target_new(&eabp->popup, E_CAL_POPUP_TARGET_SOURCE, sizeof(*t));
- guint32 mask = ~0;
- const char *source_uri;
- ESource *source;
- const char *offline = NULL;
-
- /* TODO: this is duplicated for addressbook too */
-
- t->selector = selector;
- g_object_ref(selector);
-
- /* TODO: perhaps we need to copy this so it doesn't change during the lifecycle */
- source = e_source_selector_peek_primary_selection(selector);
- if (source)
- mask &= ~E_CAL_POPUP_SOURCE_PRIMARY;
-
- /* FIXME Gross hack, should have a property or something */
- source_uri = e_source_peek_relative_uri(source);
- if (source_uri && !strcmp("system", source_uri))
- mask &= ~E_CAL_POPUP_SOURCE_SYSTEM;
- else
- mask &= ~E_CAL_POPUP_SOURCE_USER;
-
-
- source = e_source_selector_peek_primary_selection (selector);
- /* check for e_target_selector's offline_status property here */
- offline = e_source_get_property (source, "offline");
-
- if (offline && strcmp (offline,"1") == 0) {
- /* set the menu item to Mark Offline - */
- mask &= ~E_CAL_POPUP_SOURCE_NO_OFFLINE;
- }
- else {
- mask &= ~E_CAL_POPUP_SOURCE_OFFLINE;
- }
-
- t->target.mask = mask;
-
- return t;
-}
-
-/* ********************************************************************** */
-/* Popup menu plugin handler */
-
-/*
-<e-plugin
- class="org.gnome.mail.plugin.popup:1.0"
- id="org.gnome.mail.plugin.popup.iteab:1.0"
- type="shlib"
- location="/opt/gnome2/lib/camel/1.0/libcamelimap.so"
- name="imap"
- description="IMAP4 and IMAP4v1 mail store">
- <hook class="org.gnome.mail.popupMenu:1.0"
- handler="HandlePopup">
- <menu id="any" target="select">
- <iteab
- type="iteab|toggle|radio|image|submenu|bar"
- active
- path="foo/bar"
- label="label"
- icon="foo"
- mask="select_one"
- activate="ecalp_view_eabacs"/>
- </menu>
- </extension>
-
-*/
-
-static void *ecalph_parent_class;
-#define ecalph ((ECalPopupHook *)eph)
-
-static const EPopupHookTargetMask ecalph_select_masks[] = {
- { "one", E_CAL_POPUP_SELECT_ONE },
- { "many", E_CAL_POPUP_SELECT_MANY },
- { "editable", E_CAL_POPUP_SELECT_EDITABLE },
- { "recurring", E_CAL_POPUP_SELECT_RECURRING },
- { "non-recurring", E_CAL_POPUP_SELECT_NONRECURRING },
- { "instance", E_CAL_POPUP_SELECT_INSTANCE },
- { "organizer", E_CAL_POPUP_SELECT_ORGANIZER },
- { "not-editing", E_CAL_POPUP_SELECT_NOTEDITING },
- { "not-meeting", E_CAL_POPUP_SELECT_NOTMEETING },
- { "assignable", E_CAL_POPUP_SELECT_ASSIGNABLE },
- { "hasurl", E_CAL_POPUP_SELECT_HASURL },
- { 0 }
-};
-
-static const EPopupHookTargetMask ecalph_source_masks[] = {
- { "primary", E_CAL_POPUP_SOURCE_PRIMARY },
- { "system", E_CAL_POPUP_SOURCE_SYSTEM },
- { "user", E_CAL_POPUP_SOURCE_USER },
- { "offline", E_CAL_POPUP_SOURCE_OFFLINE},
- { "no-offline", E_CAL_POPUP_SOURCE_NO_OFFLINE},
- { 0 }
-};
-
-static const EPopupHookTargetMap ecalph_targets[] = {
- { "select", E_CAL_POPUP_TARGET_SELECT, ecalph_select_masks },
- { "source", E_CAL_POPUP_TARGET_SOURCE, ecalph_source_masks },
- { 0 }
-};
-
-static void
-ecalph_finalise(GObject *o)
-{
- /*EPluginHook *eph = (EPluginHook *)o;*/
-
- ((GObjectClass *)ecalph_parent_class)->finalize(o);
-}
-
-static void
-ecalph_class_init(EPluginHookClass *klass)
-{
- int i;
-
- ((GObjectClass *)klass)->finalize = ecalph_finalise;
- ((EPluginHookClass *)klass)->id = "org.gnome.evolution.calendar.popup:1.0";
-
- for (i=0;ecalph_targets[i].type;i++)
- e_popup_hook_class_add_target_map((EPopupHookClass *)klass, &ecalph_targets[i]);
-
- ((EPopupHookClass *)klass)->popup_class = g_type_class_ref(e_cal_popup_get_type());
-}
-
-GType
-e_cal_popup_hook_get_type(void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof(ECalPopupHookClass), NULL, NULL, (GClassInitFunc) ecalph_class_init, NULL, NULL,
- sizeof(ECalPopupHook), 0, (GInstanceInitFunc) NULL,
- };
-
- ecalph_parent_class = g_type_class_ref(e_popup_hook_get_type());
- type = g_type_register_static(e_popup_hook_get_type(), "ECalPopupHook", &info, 0);
- }
-
- return type;
-}
diff --git a/calendar/gui/e-cal-popup.h b/calendar/gui/e-cal-popup.h
deleted file mode 100644
index a5043b1726..0000000000
--- a/calendar/gui/e-cal-popup.h
+++ /dev/null
@@ -1,176 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Michael Zucchi <notzed@ximian.com>
- *
- * Copyright 2004 Novell, Inc. (www.novell.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifndef __E_CAL_POPUP_H__
-#define __E_CAL_POPUP_H__
-
-#include <glib-object.h>
-
-#include "e-util/e-popup.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-typedef struct _ECalPopup ECalPopup;
-typedef struct _ECalPopupClass ECalPopupClass;
-
-struct _ECalendarView;
-
-/**
- * enum _e_cal_popup_target_t - A list of mail popup target types.
- *
- * @E_CAL_POPUP_TARGET_SELECT: A selection of cards
- * @E_CAL_POPUP_TARGET_SOURCE: A source selection.
- *
- * Defines the value of the targetid for all ECalPopup target types.
- **/
-enum _e_cal_popup_target_t {
- E_CAL_POPUP_TARGET_SELECT,
- E_CAL_POPUP_TARGET_SOURCE,
-};
-
-/**
- * enum _e_cal_popup_target_select_t - ECalPopupTargetSelect qualifiers.
- *
- * @E_CAL_POPUP_SELECT_ONE: Only one item is selected.
- * @E_CAL_POPUP_SELECT_MANY: More than one item selected.
- * @E_CAL_POPUP_SELECT_ANY: One ore more items are selected.
- * @E_CAL_POPUP_SELECT_EDITABLE: The selection is editable.
- * @E_CAL_POPUP_SELECT_RECURRING: Is a recurring event.
- * @E_CAL_POPUP_SELECT_NONRECURRING: Is not a recurring event.
- * @E_CAL_POPUP_SELECT_INSTANCE: This is an instance event.
- * @E_CAL_POPUP_SELECT_ORGANIZER: The user is the organiser of the event.
- * @E_CAL_POPUP_SELECT_NOTEDITING: The event is not being edited already. Not implemented.
- * @E_CAL_POPUP_SELECT_NOTMEETING: The event is not a meeting.
- * @E_CAL_POPUP_SELECT_ASSIGNABLE: An assignable task.
- * @E_CAL_POPUP_SELECT_HASURL: A task that contains a URL.
- **/
-enum _e_cal_popup_target_select_t {
- E_CAL_POPUP_SELECT_ONE = 1<<0,
- E_CAL_POPUP_SELECT_MANY = 1<<1,
- E_CAL_POPUP_SELECT_ANY = 1<<2,
- E_CAL_POPUP_SELECT_EDITABLE = 1<<3,
- E_CAL_POPUP_SELECT_RECURRING = 1<<4,
- E_CAL_POPUP_SELECT_NONRECURRING = 1<<5,
- E_CAL_POPUP_SELECT_INSTANCE = 1<<6,
-
- E_CAL_POPUP_SELECT_ORGANIZER = 1<<7,
- E_CAL_POPUP_SELECT_NOTEDITING = 1<<8,
- E_CAL_POPUP_SELECT_NOTMEETING = 1<<9,
-
- E_CAL_POPUP_SELECT_ASSIGNABLE = 1<<10,
- E_CAL_POPUP_SELECT_HASURL = 1<<11,
-};
-
-/**
- * enum _e_cal_popup_target_source_t - ECalPopupTargetSource qualifiers.
- *
- * @E_CAL_POPUP_SOURCE_PRIMARY: Has a primary selection.
- * @E_CAL_POPUP_SOURCE_SYSTEM: Is a 'system' folder.
- *
- **/
-enum _e_cal_popup_target_source_t {
- E_CAL_POPUP_SOURCE_PRIMARY = 1<<0,
- E_CAL_POPUP_SOURCE_SYSTEM = 1<<1, /* system folder */
- E_CAL_POPUP_SOURCE_USER = 1<<2, /* user folder (!system) */
- E_CAL_POPUP_SOURCE_OFFLINE = 1 <<3,
- E_CAL_POPUP_SOURCE_NO_OFFLINE = 1 <<4
-};
-
-typedef struct _ECalPopupTargetSelect ECalPopupTargetSelect;
-typedef struct _ECalPopupTargetSource ECalPopupTargetSource;
-
-/**
- * struct _ECalPopupTargetSelect - A list of address cards.
- *
- * @target: Superclass. target.widget is an ECalendarView.
- * @model: The ECalModel.
- * @events: The selected events. These are ECalModelComponent's.
- *
- * Used to represent a selection of appointments as context for a popup
- * menu.
- *
- * TODO: For maximum re-usability references to the view could be removed
- * from this structure.
- **/
-struct _ECalPopupTargetSelect {
- EPopupTarget target;
-
- struct _ECalModel *model;
- GPtrArray *events;
-};
-
-/**
- * struct _ECalPopupTargetSource - A source target.
- *
- * @target: Superclass.
- * @selector: Selector holding the source selection.
- *
- * This target is used to represent a source selection.
- **/
-struct _ECalPopupTargetSource {
- EPopupTarget target;
-
- struct _ESourceSelector *selector;
-};
-
-typedef struct _EPopupItem ECalPopupItem;
-
-/* The object */
-struct _ECalPopup {
- EPopup popup;
-
- struct _ECalPopupPrivate *priv;
-};
-
-struct _ECalPopupClass {
- EPopupClass popup_class;
-};
-
-GType e_cal_popup_get_type(void);
-
-ECalPopup *e_cal_popup_new(const char *menuid);
-
-ECalPopupTargetSelect *e_cal_popup_target_new_select(ECalPopup *eabp, struct _ECalModel *model, GPtrArray *events);
-ECalPopupTargetSource *e_cal_popup_target_new_source(ECalPopup *eabp, struct _ESourceSelector *selector);
-
-/* ********************************************************************** */
-
-typedef struct _ECalPopupHook ECalPopupHook;
-typedef struct _ECalPopupHookClass ECalPopupHookClass;
-
-struct _ECalPopupHook {
- EPopupHook hook;
-};
-
-struct _ECalPopupHookClass {
- EPopupHookClass hook_class;
-};
-
-GType e_cal_popup_hook_get_type(void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_CAL_POPUP_H__ */
diff --git a/calendar/gui/e-calendar-marshal.list b/calendar/gui/e-calendar-marshal.list
deleted file mode 100644
index 9e095c4291..0000000000
--- a/calendar/gui/e-calendar-marshal.list
+++ /dev/null
@@ -1,18 +0,0 @@
-NONE:INT
-NONE:POINTER
-NONE:OBJECT
-NONE:INT,STRING
-NONE:INT,BOOL
-NONE:INT,POINTER
-NONE:INT,OBJECT
-NONE:STRING,INT
-NONE:INT,INT
-NONE:ENUM,ENUM
-NONE:ENUM,STRING
-NONE:STRING,BOOL,INT,INT
-NONE:STRING,STRING
-NONE:STRING,STRING,STRING
-NONE:POINTER,ENUM
-NONE:POINTER,STRING
-NONE:POINTER,POINTER
-NONE:LONG,LONG
diff --git a/calendar/gui/e-calendar-table-config.c b/calendar/gui/e-calendar-table-config.c
deleted file mode 100644
index ebe148b4fd..0000000000
--- a/calendar/gui/e-calendar-table-config.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Author :
- * JP Rosevear <jpr@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#include "calendar-config.h"
-#include "e-cell-date-edit-config.h"
-#include "e-calendar-table-config.h"
-
-struct _ECalendarTableConfigPrivate {
- ECalendarTable *table;
-
- ECellDateEditConfig *cell_config;
-
- GList *notifications;
-};
-
-/* Property IDs */
-enum props {
- PROP_0,
- PROP_TABLE
-};
-
-G_DEFINE_TYPE (ECalendarTableConfig, e_calendar_table_config, G_TYPE_OBJECT);
-
-static void
-e_calendar_table_config_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
-{
- ECalendarTableConfig *table_config;
- ECalendarTableConfigPrivate *priv;
-
- table_config = E_CALENDAR_TABLE_CONFIG (object);
- priv = table_config->priv;
-
- switch (property_id) {
- case PROP_TABLE:
- e_calendar_table_config_set_table (table_config, g_value_get_object (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-e_calendar_table_config_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
-{
- ECalendarTableConfig *table_config;
- ECalendarTableConfigPrivate *priv;
-
- table_config = E_CALENDAR_TABLE_CONFIG (object);
- priv = table_config->priv;
-
- switch (property_id) {
- case PROP_TABLE:
- g_value_set_object (value, e_calendar_table_config_get_table (table_config));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-e_calendar_table_config_dispose (GObject *object)
-{
- ECalendarTableConfig *table_config = E_CALENDAR_TABLE_CONFIG (object);
- ECalendarTableConfigPrivate *priv;
-
- priv = table_config->priv;
-
- e_calendar_table_config_set_table (table_config, NULL);
-
- if (G_OBJECT_CLASS (e_calendar_table_config_parent_class)->dispose)
- G_OBJECT_CLASS (e_calendar_table_config_parent_class)->dispose (object);
-}
-
-static void
-e_calendar_table_config_finalize (GObject *object)
-{
- ECalendarTableConfig *table_config = E_CALENDAR_TABLE_CONFIG (object);
- ECalendarTableConfigPrivate *priv;
-
- priv = table_config->priv;
-
- g_free (priv);
-
- if (G_OBJECT_CLASS (e_calendar_table_config_parent_class)->finalize)
- G_OBJECT_CLASS (e_calendar_table_config_parent_class)->finalize (object);
-}
-
-static void
-e_calendar_table_config_class_init (ECalendarTableConfigClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GParamSpec *spec;
-
- /* Method override */
- gobject_class->set_property = e_calendar_table_config_set_property;
- gobject_class->get_property = e_calendar_table_config_get_property;
- gobject_class->dispose = e_calendar_table_config_dispose;
- gobject_class->finalize = e_calendar_table_config_finalize;
-
- spec = g_param_spec_object ("table", NULL, NULL, e_calendar_table_get_type (),
- G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT);
- g_object_class_install_property (gobject_class, PROP_TABLE, spec);
-}
-
-static void
-e_calendar_table_config_init (ECalendarTableConfig *table_config)
-{
- table_config->priv = g_new0 (ECalendarTableConfigPrivate, 1);
-
-}
-
-ECalendarTableConfig *
-e_calendar_table_config_new (ECalendarTable *table)
-{
- ECalendarTableConfig *table_config;
-
- table_config = g_object_new (e_calendar_table_config_get_type (), "table", table, NULL);
-
- return table_config;
-}
-
-ECalendarTable *
-e_calendar_table_config_get_table (ECalendarTableConfig *table_config)
-{
- ECalendarTableConfigPrivate *priv;
-
- g_return_val_if_fail (table_config != NULL, NULL);
- g_return_val_if_fail (E_IS_CALENDAR_TABLE_CONFIG (table_config), NULL);
-
- priv = table_config->priv;
-
- return priv->table;
-}
-
-static void
-set_timezone (ECalendarTable *table)
-{
- ECalModel *model;
- icaltimezone *zone;
-
- zone = calendar_config_get_icaltimezone ();
- model = e_calendar_table_get_model (table);
- if (model)
- e_cal_model_set_timezone (model, zone);
-}
-
-static void
-timezone_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- ECalendarTableConfig *table_config = data;
- ECalendarTableConfigPrivate *priv;
-
- priv = table_config->priv;
-
- set_timezone (priv->table);
-}
-
-static void
-set_twentyfour_hour (ECalendarTable *table)
-{
- ECalModel *model;
- gboolean use_24_hour;
-
- use_24_hour = calendar_config_get_24_hour_format ();
-
- model = e_calendar_table_get_model (table);
- if (model)
- e_cal_model_set_use_24_hour_format (model, use_24_hour);
-}
-
-static void
-twentyfour_hour_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- ECalendarTableConfig *table_config = data;
- ECalendarTableConfigPrivate *priv;
-
- priv = table_config->priv;
-
- set_twentyfour_hour (priv->table);
-}
-
-void
-e_calendar_table_config_set_table (ECalendarTableConfig *table_config, ECalendarTable *table)
-{
- ECalendarTableConfigPrivate *priv;
- guint not;
- GList *l;
-
- g_return_if_fail (table_config != NULL);
- g_return_if_fail (E_IS_CALENDAR_TABLE_CONFIG (table_config));
-
- priv = table_config->priv;
-
- if (priv->table) {
- g_object_unref (priv->table);
- priv->table = NULL;
- }
-
- if (priv->cell_config) {
- g_object_unref (priv->cell_config);
- priv->cell_config = NULL;
- }
-
- for (l = priv->notifications; l; l = l->next)
- calendar_config_remove_notification (GPOINTER_TO_UINT (l->data));
-
- g_list_free (priv->notifications);
- priv->notifications = NULL;
-
- /* If the new view is NULL, return right now */
- if (!table)
- return;
-
- priv->table = g_object_ref (table);
-
- /* Time zone */
- set_timezone (table);
-
- not = calendar_config_add_notification_timezone (timezone_changed_cb, table_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* 24 Hour format */
- set_twentyfour_hour (table);
-
- not = calendar_config_add_notification_24_hour_format (twentyfour_hour_changed_cb, table_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Date cell */
- priv->cell_config = e_cell_date_edit_config_new (table->dates_cell);
-}
diff --git a/calendar/gui/e-calendar-table-config.h b/calendar/gui/e-calendar-table-config.h
deleted file mode 100644
index 399f3254d1..0000000000
--- a/calendar/gui/e-calendar-table-config.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Author :
- * JP Rosevear <jpr@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#ifndef _E_CALENDAR_TABLE_CONFIG_H_
-#define _E_CALENDAR_TABLE_CONFIG_H_
-
-#include "e-calendar-table.h"
-
-G_BEGIN_DECLS
-
-#define E_CALENDAR_TABLE_CONFIG(obj) GTK_CHECK_CAST (obj, e_calendar_table_config_get_type (), ECalendarTableConfig)
-#define E_CALENDAR_TABLE_CONFIG_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_calendar_table_config_get_type (), ECalendarTableConfigClass)
-#define E_IS_CALENDAR_TABLE_CONFIG(obj) GTK_CHECK_TYPE (obj, e_calendar_table_config_get_type ())
-
-typedef struct _ECalendarTableConfig ECalendarTableConfig;
-typedef struct _ECalendarTableConfigClass ECalendarTableConfigClass;
-typedef struct _ECalendarTableConfigPrivate ECalendarTableConfigPrivate;
-
-struct _ECalendarTableConfig {
- GObject parent;
-
- ECalendarTableConfigPrivate *priv;
-};
-
-struct _ECalendarTableConfigClass {
- GObjectClass parent_class;
-};
-
-GType e_calendar_table_config_get_type (void);
-ECalendarTableConfig *e_calendar_table_config_new (ECalendarTable *table);
-ECalendarTable *e_calendar_table_config_get_table (ECalendarTableConfig *view_config);
-void e_calendar_table_config_set_table (ECalendarTableConfig *view_config, ECalendarTable *table);
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/e-calendar-table.c b/calendar/gui/e-calendar-table.c
deleted file mode 100644
index a3d50bb475..0000000000
--- a/calendar/gui/e-calendar-table.c
+++ /dev/null
@@ -1,1371 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Authors :
- * Damon Chaplin <damon@ximian.com>
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 2000, 2001, 2002, 2003 Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * ECalendarTable - displays the ECalComponent objects in a table (an ETable).
- * Used for calendar events and tasks.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <sys/stat.h>
-#include <unistd.h>
-#include <gnome.h>
-#include <gal/widgets/e-gui-utils.h>
-#include <gal/e-table/e-cell-checkbox.h>
-#include <gal/e-table/e-cell-toggle.h>
-#include <gal/e-table/e-cell-text.h>
-#include <gal/e-table/e-cell-combo.h>
-#include <e-util/e-dialog-utils.h>
-#include <widgets/misc/e-cell-date-edit.h>
-#include <widgets/misc/e-cell-percent.h>
-
-#include "calendar-component.h"
-#include "calendar-config.h"
-#include "dialogs/delete-comp.h"
-#include "dialogs/delete-error.h"
-#include "dialogs/task-editor.h"
-#include "e-cal-model-tasks.h"
-#include "e-calendar-table.h"
-#include "e-cell-date-edit-text.h"
-#include "e-comp-editor-registry.h"
-#include "print.h"
-#include <e-util/e-icon-factory.h>
-#include "e-cal-popup.h"
-
-extern ECompEditorRegistry *comp_editor_registry;
-
-static void e_calendar_table_class_init (ECalendarTableClass *class);
-static void e_calendar_table_init (ECalendarTable *cal_table);
-static void e_calendar_table_destroy (GtkObject *object);
-
-static void e_calendar_table_on_double_click (ETable *table,
- gint row,
- gint col,
- GdkEvent *event,
- ECalendarTable *cal_table);
-static gint e_calendar_table_show_popup_menu (ETable *table,
- GdkEvent *gdk_event,
- ECalendarTable *cal_table);
-
-static gint e_calendar_table_on_right_click (ETable *table,
- gint row,
- gint col,
- GdkEvent *event,
- ECalendarTable *cal_table);
-static gboolean e_calendar_table_on_popup_menu (GtkWidget *widget,
- gpointer data);
-
-static gint e_calendar_table_on_key_press (ETable *table,
- gint row,
- gint col,
- GdkEventKey *event,
- ECalendarTable *cal_table);
-
-static struct tm e_calendar_table_get_current_time (ECellDateEdit *ecde,
- gpointer data);
-static void mark_row_complete_cb (int model_row, gpointer data);
-static ECalModelComponent *get_selected_comp (ECalendarTable *cal_table);
-static void open_task (ECalendarTable *cal_table, ECalModelComponent *comp_data, gboolean assign);
-
-/* Signal IDs */
-enum {
- USER_CREATED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-/* The icons to represent the task. */
-#define E_CALENDAR_MODEL_NUM_ICONS 4
-static const char* icon_names[E_CALENDAR_MODEL_NUM_ICONS] = {
- "stock_task", "stock_task-recurring", "stock_task-assigned", "stock_task-assigned-to"
-};
-static GdkPixbuf* icon_pixbufs[E_CALENDAR_MODEL_NUM_ICONS] = { 0 };
-
-static GdkAtom clipboard_atom = GDK_NONE;
-
-G_DEFINE_TYPE (ECalendarTable, e_calendar_table, GTK_TYPE_TABLE);
-
-static void
-e_calendar_table_class_init (ECalendarTableClass *class)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
-
- object_class = (GtkObjectClass *) class;
- widget_class = (GtkWidgetClass *) class;
-
- /* Method override */
- object_class->destroy = e_calendar_table_destroy;
-
- signals[USER_CREATED] =
- g_signal_new ("user_created",
- G_TYPE_FROM_CLASS (class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (ECalendarTableClass, user_created),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
- /* clipboard atom */
- if (!clipboard_atom)
- clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE);
-}
-
-/* Compares two priority values, which may not exist */
-static int
-compare_priorities (int *a, int *b)
-{
- if (a && b) {
- if (*a < *b)
- return -1;
- else if (*a > *b)
- return 1;
- else
- return 0;
- } else if (a)
- return -1;
- else if (b)
- return 1;
- else
- return 0;
-}
-
-/* Comparison function for the task-sort column. Sorts by due date and then by
- * priority.
- *
- * FIXME: Does this ever get called?? It doesn't seem to.
- * I specified that the table should be sorted by this column, but it still
- * never calls this function.
- * Also, this assumes it is passed pointers to ECalComponents, but I think it
- * may just be passed pointers to the 2 cell values.
- */
-static gint
-task_compare_cb (gconstpointer a, gconstpointer b)
-{
- ECalComponent *ca, *cb;
- ECalComponentDateTime due_a, due_b;
- int *prio_a, *prio_b;
- int retval;
-
- ca = E_CAL_COMPONENT (a);
- cb = E_CAL_COMPONENT (b);
-
- e_cal_component_get_due (ca, &due_a);
- e_cal_component_get_due (cb, &due_b);
- e_cal_component_get_priority (ca, &prio_a);
- e_cal_component_get_priority (cb, &prio_b);
-
- if (due_a.value && due_b.value) {
- int v;
-
- /* FIXME: TIMEZONES. But currently we have no way to get the
- ECal, so we can't get the timezone. */
- v = icaltime_compare (*due_a.value, *due_b.value);
-
- if (v == 0)
- retval = compare_priorities (prio_a, prio_b);
- else
- retval = v;
- } else if (due_a.value)
- retval = -1;
- else if (due_b.value)
- retval = 1;
- else
- retval = compare_priorities (prio_a, prio_b);
-
- e_cal_component_free_datetime (&due_a);
- e_cal_component_free_datetime (&due_b);
-
- if (prio_a)
- e_cal_component_free_priority (prio_a);
-
- if (prio_b)
- e_cal_component_free_priority (prio_b);
-
- return retval;
-}
-
-static gint
-date_compare_cb (gconstpointer a, gconstpointer b)
-{
- ECellDateEditValue *dv1 = (ECellDateEditValue *) a;
- ECellDateEditValue *dv2 = (ECellDateEditValue *) b;
- struct icaltimetype tt;
-
- /* First check if either is NULL. NULL dates sort last. */
- if (!dv1 || !dv2) {
- if (dv1 == dv2)
- return 0;
- else if (dv1)
- return -1;
- else
- return 1;
- }
-
- /* Copy the 2nd value and convert it to the same timezone as the
- first. */
- tt = dv2->tt;
-
- icaltimezone_convert_time (&tt, dv2->zone, dv1->zone);
-
- /* Now we can compare them. */
-
- return icaltime_compare (dv1->tt, tt);
-}
-
-static gint
-percent_compare_cb (gconstpointer a, gconstpointer b)
-{
- int percent1 = GPOINTER_TO_INT (a);
- int percent2 = GPOINTER_TO_INT (b);
- int retval;
-
- if (percent1 > percent2)
- retval = 1;
- else if (percent1 < percent2)
- retval = -1;
- else
- retval = 0;
-
- return retval;
-}
-
-static gint
-priority_compare_cb (gconstpointer a, gconstpointer b)
-{
- int priority1, priority2;
-
- priority1 = e_cal_util_priority_from_string ((const char*) a);
- priority2 = e_cal_util_priority_from_string ((const char*) b);
-
- /* We change undefined priorities so they appear after 'Low'. */
- if (priority1 <= 0)
- priority1 = 10;
- if (priority2 <= 0)
- priority2 = 10;
-
- /* We'll just use the ordering of the priority values. */
- if (priority1 < priority2)
- return -1;
- else if (priority1 > priority2)
- return 1;
- else
- return 0;
-}
-
-static void
-row_appended_cb (ECalModel *model, ECalendarTable *cal_table)
-{
- g_signal_emit (cal_table, signals[USER_CREATED], 0);
-}
-
-static void
-e_calendar_table_init (ECalendarTable *cal_table)
-{
- GtkWidget *table;
- ETable *e_table;
- ECell *cell, *popup_cell;
- ETableExtras *extras;
- gint i;
- GdkPixbuf *pixbuf;
- GList *strings;
- AtkObject *a11y;
-
- /* Create the model */
-
- cal_table->model = (ECalModel *) e_cal_model_tasks_new ();
- g_signal_connect (cal_table->model, "row_appended", G_CALLBACK (row_appended_cb), cal_table);
-
- /* Create the header columns */
-
- extras = e_table_extras_new();
-
- /*
- * Normal string fields.
- */
- cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT);
- g_object_set (G_OBJECT (cell),
- "strikeout_column", E_CAL_MODEL_TASKS_FIELD_COMPLETE,
- "bold_column", E_CAL_MODEL_TASKS_FIELD_OVERDUE,
- "bg_color_column", E_CAL_MODEL_FIELD_COLOR,
- NULL);
-
- e_table_extras_add_cell (extras, "calstring", cell);
-
-
- /*
- * Date fields.
- */
- cell = e_cell_date_edit_text_new (NULL, GTK_JUSTIFY_LEFT);
- g_object_set (G_OBJECT (cell),
- "strikeout_column", E_CAL_MODEL_TASKS_FIELD_COMPLETE,
- "bold_column", E_CAL_MODEL_TASKS_FIELD_OVERDUE,
- "bg_color_column", E_CAL_MODEL_FIELD_COLOR,
- NULL);
-
- popup_cell = e_cell_date_edit_new ();
- e_cell_popup_set_child (E_CELL_POPUP (popup_cell), cell);
- g_object_unref (cell);
- e_table_extras_add_cell (extras, "dateedit", popup_cell);
- cal_table->dates_cell = E_CELL_DATE_EDIT (popup_cell);
-
- e_cell_date_edit_set_get_time_callback (E_CELL_DATE_EDIT (popup_cell),
- e_calendar_table_get_current_time,
- cal_table, NULL);
-
-
- /*
- * Combo fields.
- */
-
- /* Classification field. */
- cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT);
- g_object_set (G_OBJECT (cell),
- "strikeout_column", E_CAL_MODEL_TASKS_FIELD_COMPLETE,
- "bold_column", E_CAL_MODEL_TASKS_FIELD_OVERDUE,
- "bg_color_column", E_CAL_MODEL_FIELD_COLOR,
- "editable", FALSE,
- NULL);
-
- popup_cell = e_cell_combo_new ();
- e_cell_popup_set_child (E_CELL_POPUP (popup_cell), cell);
- g_object_unref (cell);
-
- strings = NULL;
- strings = g_list_append (strings, (char*) _("Public"));
- strings = g_list_append (strings, (char*) _("Private"));
- strings = g_list_append (strings, (char*) _("Confidential"));
- e_cell_combo_set_popdown_strings (E_CELL_COMBO (popup_cell),
- strings);
-
- e_table_extras_add_cell (extras, "classification", popup_cell);
-
- /* Priority field. */
- cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT);
- g_object_set (G_OBJECT (cell),
- "strikeout_column", E_CAL_MODEL_TASKS_FIELD_COMPLETE,
- "bold_column", E_CAL_MODEL_TASKS_FIELD_OVERDUE,
- "bg_color_column", E_CAL_MODEL_FIELD_COLOR,
- "editable", FALSE,
- NULL);
-
- popup_cell = e_cell_combo_new ();
- e_cell_popup_set_child (E_CELL_POPUP (popup_cell), cell);
- g_object_unref (cell);
-
- strings = NULL;
- strings = g_list_append (strings, (char*) _("High"));
- strings = g_list_append (strings, (char*) _("Normal"));
- strings = g_list_append (strings, (char*) _("Low"));
- strings = g_list_append (strings, (char*) _("Undefined"));
- e_cell_combo_set_popdown_strings (E_CELL_COMBO (popup_cell),
- strings);
-
- e_table_extras_add_cell (extras, "priority", popup_cell);
-
- /* Percent field. */
- cell = e_cell_percent_new (NULL, GTK_JUSTIFY_LEFT);
- g_object_set (G_OBJECT (cell),
- "strikeout_column", E_CAL_MODEL_TASKS_FIELD_COMPLETE,
- "bold_column", E_CAL_MODEL_TASKS_FIELD_OVERDUE,
- "bg_color_column", E_CAL_MODEL_FIELD_COLOR,
- NULL);
-
- popup_cell = e_cell_combo_new ();
- e_cell_popup_set_child (E_CELL_POPUP (popup_cell), cell);
- g_object_unref (cell);
-
- strings = NULL;
- strings = g_list_append (strings, (char*) _("0%"));
- strings = g_list_append (strings, (char*) _("10%"));
- strings = g_list_append (strings, (char*) _("20%"));
- strings = g_list_append (strings, (char*) _("30%"));
- strings = g_list_append (strings, (char*) _("40%"));
- strings = g_list_append (strings, (char*) _("50%"));
- strings = g_list_append (strings, (char*) _("60%"));
- strings = g_list_append (strings, (char*) _("70%"));
- strings = g_list_append (strings, (char*) _("80%"));
- strings = g_list_append (strings, (char*) _("90%"));
- strings = g_list_append (strings, (char*) _("100%"));
- e_cell_combo_set_popdown_strings (E_CELL_COMBO (popup_cell),
- strings);
-
- e_table_extras_add_cell (extras, "percent", popup_cell);
-
- /* Transparency field. */
- cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT);
- g_object_set (G_OBJECT (cell),
- "strikeout_column", E_CAL_MODEL_TASKS_FIELD_COMPLETE,
- "bold_column", E_CAL_MODEL_TASKS_FIELD_OVERDUE,
- "bg_color_column", E_CAL_MODEL_FIELD_COLOR,
- "editable", FALSE,
- NULL);
-
- popup_cell = e_cell_combo_new ();
- e_cell_popup_set_child (E_CELL_POPUP (popup_cell), cell);
- g_object_unref (cell);
-
- strings = NULL;
- strings = g_list_append (strings, (char*) _("Free"));
- strings = g_list_append (strings, (char*) _("Busy"));
- e_cell_combo_set_popdown_strings (E_CELL_COMBO (popup_cell),
- strings);
-
- e_table_extras_add_cell (extras, "transparency", popup_cell);
-
- /* Status field. */
- cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT);
- g_object_set (G_OBJECT (cell),
- "strikeout_column", E_CAL_MODEL_TASKS_FIELD_COMPLETE,
- "bold_column", E_CAL_MODEL_TASKS_FIELD_OVERDUE,
- "bg_color_column", E_CAL_MODEL_FIELD_COLOR,
- "editable", FALSE,
- NULL);
-
- popup_cell = e_cell_combo_new ();
- e_cell_popup_set_child (E_CELL_POPUP (popup_cell), cell);
- g_object_unref (cell);
-
- strings = NULL;
- strings = g_list_append (strings, (char*) _("Not Started"));
- strings = g_list_append (strings, (char*) _("In Progress"));
- strings = g_list_append (strings, (char*) _("Completed"));
- strings = g_list_append (strings, (char*) _("Cancelled"));
- e_cell_combo_set_popdown_strings (E_CELL_COMBO (popup_cell),
- strings);
-
- e_table_extras_add_cell (extras, "calstatus", popup_cell);
-
- /* Task sorting field */
- /* FIXME: This column should not be displayed, but ETableExtras requires
- * its shit to be visible columns listed in the XML spec.
- */
- e_table_extras_add_compare (extras, "task-sort", task_compare_cb);
-
- e_table_extras_add_compare (extras, "date-compare",
- date_compare_cb);
- e_table_extras_add_compare (extras, "percent-compare",
- percent_compare_cb);
- e_table_extras_add_compare (extras, "priority-compare",
- priority_compare_cb);
-
- /* Create pixmaps */
-
- if (!icon_pixbufs[0])
- for (i = 0; i < E_CALENDAR_MODEL_NUM_ICONS; i++) {
- icon_pixbufs[i] = e_icon_factory_get_icon (icon_names[i], E_ICON_SIZE_LIST);
- }
-
- cell = e_cell_toggle_new (0, E_CALENDAR_MODEL_NUM_ICONS, icon_pixbufs);
- e_table_extras_add_cell(extras, "icon", cell);
- e_table_extras_add_pixbuf(extras, "icon", icon_pixbufs[0]);
-
- pixbuf = e_icon_factory_get_icon ("stock_check-filled", E_ICON_SIZE_LIST);
- e_table_extras_add_pixbuf(extras, "complete", pixbuf);
- gdk_pixbuf_unref(pixbuf);
-
- /* Create the table */
-
- table = e_table_scrolled_new_from_spec_file (E_TABLE_MODEL (cal_table->model),
- extras,
- EVOLUTION_ETSPECDIR "/e-calendar-table.etspec",
- NULL);
- /* FIXME: this causes a message from GLib about 'extras' having only a floating
- reference */
- /* g_object_unref (extras); */
-
- cal_table->etable = table;
- gtk_table_attach (GTK_TABLE (cal_table), table, 0, 1, 0, 1,
- GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
- gtk_widget_show (table);
-
-
- e_table = e_table_scrolled_get_table (E_TABLE_SCROLLED (table));
- g_signal_connect (e_table, "double_click", G_CALLBACK (e_calendar_table_on_double_click), cal_table);
- g_signal_connect (e_table, "right_click", G_CALLBACK (e_calendar_table_on_right_click), cal_table);
- g_signal_connect (e_table, "key_press", G_CALLBACK (e_calendar_table_on_key_press), cal_table);
- g_signal_connect (e_table, "popup_menu", G_CALLBACK (e_calendar_table_on_popup_menu), cal_table);
-
- a11y = gtk_widget_get_accessible (e_table);
- if (a11y)
- atk_object_set_name (a11y, _("Task Table"));
-}
-
-
-/**
- * e_calendar_table_new:
- * @Returns: a new #ECalendarTable.
- *
- * Creates a new #ECalendarTable.
- **/
-GtkWidget *
-e_calendar_table_new (void)
-{
- GtkWidget *cal_table;
-
- cal_table = GTK_WIDGET (g_object_new (e_calendar_table_get_type (), NULL));
-
- return cal_table;
-}
-
-
-/**
- * e_calendar_table_get_model:
- * @cal_table: A calendar table.
- *
- * Queries the calendar data model that a calendar table is using.
- *
- * Return value: A calendar model.
- **/
-ECalModel *
-e_calendar_table_get_model (ECalendarTable *cal_table)
-{
- g_return_val_if_fail (cal_table != NULL, NULL);
- g_return_val_if_fail (E_IS_CALENDAR_TABLE (cal_table), NULL);
-
- return cal_table->model;
-}
-
-
-static void
-e_calendar_table_destroy (GtkObject *object)
-{
- ECalendarTable *cal_table;
-
- cal_table = E_CALENDAR_TABLE (object);
-
- if (cal_table->model) {
- g_object_unref (cal_table->model);
- cal_table->model = NULL;
- }
-
- GTK_OBJECT_CLASS (e_calendar_table_parent_class)->destroy (object);
-}
-
-/**
- * e_calendar_table_get_table:
- * @cal_table: A calendar table.
- *
- * Queries the #ETable widget that the calendar table is using.
- *
- * Return value: The #ETable widget that the calendar table uses to display its
- * data.
- **/
-ETable *
-e_calendar_table_get_table (ECalendarTable *cal_table)
-{
- g_return_val_if_fail (cal_table != NULL, NULL);
- g_return_val_if_fail (E_IS_CALENDAR_TABLE (cal_table), NULL);
-
- return e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable));
-}
-
-void
-e_calendar_table_open_selected (ECalendarTable *cal_table)
-{
- ECalModelComponent *comp_data;
- icalproperty *prop;
-
- comp_data = get_selected_comp (cal_table);
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_ATTENDEE_PROPERTY);
- if (comp_data != NULL)
- open_task (cal_table, comp_data, prop ? TRUE : FALSE);
-}
-
-/**
- * e_calendar_table_complete_selected:
- * @cal_table: A calendar table
- *
- * Marks the selected items as completed
- **/
-void
-e_calendar_table_complete_selected (ECalendarTable *cal_table)
-{
- ETable *etable;
-
- g_return_if_fail (cal_table != NULL);
- g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table));
-
- etable = e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable));
- e_table_selected_row_foreach (etable, mark_row_complete_cb, cal_table);
-}
-
-/* Used from e_table_selected_row_foreach(); puts the selected row number in an
- * int pointed to by the closure data.
- */
-static void
-get_selected_row_cb (int model_row, gpointer data)
-{
- int *row;
-
- row = data;
- *row = model_row;
-}
-
-/* Returns the component that is selected in the table; only works if there is
- * one and only one selected row.
- */
-static ECalModelComponent *
-get_selected_comp (ECalendarTable *cal_table)
-{
- ETable *etable;
- int row;
-
- etable = e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable));
- if (e_table_selected_count (etable) != 1)
- return NULL;
-
- row = -1;
- e_table_selected_row_foreach (etable,
- get_selected_row_cb,
- &row);
- g_assert (row != -1);
-
- return e_cal_model_get_component_at (cal_table->model, row);
-}
-
-struct get_selected_uids_closure {
- ECalendarTable *cal_table;
- GSList *objects;
-};
-
-/* Used from e_table_selected_row_foreach(), builds a list of the selected UIDs */
-static void
-add_uid_cb (int model_row, gpointer data)
-{
- struct get_selected_uids_closure *closure;
- ECalModelComponent *comp_data;
-
- closure = data;
-
- comp_data = e_cal_model_get_component_at (closure->cal_table->model, model_row);
-
- closure->objects = g_slist_prepend (closure->objects, comp_data);
-}
-
-static GSList *
-get_selected_objects (ECalendarTable *cal_table)
-{
- struct get_selected_uids_closure closure;
- ETable *etable;
-
- closure.cal_table = cal_table;
- closure.objects = NULL;
-
- etable = e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable));
- e_table_selected_row_foreach (etable, add_uid_cb, &closure);
-
- return closure.objects;
-}
-
-/* Deletes all of the selected components in the table */
-static void
-delete_selected_components (ECalendarTable *cal_table)
-{
- GSList *objs, *l;
-
- objs = get_selected_objects (cal_table);
-
- e_calendar_table_set_status_message (cal_table, _("Deleting selected objects"));
-
- for (l = objs; l; l = l->next) {
- ECalModelComponent *comp_data = (ECalModelComponent *) l->data;
- GError *error = NULL;
-
- e_cal_remove_object (comp_data->client,
- icalcomponent_get_uid (comp_data->icalcomp), &error);
- delete_error_dialog (error, E_CAL_COMPONENT_TODO);
- g_clear_error (&error);
- }
-
- e_calendar_table_set_status_message (cal_table, NULL);
-
- g_slist_free (objs);
-}
-
-/**
- * e_calendar_table_delete_selected:
- * @cal_table: A calendar table.
- *
- * Deletes the selected components in the table; asks the user first.
- **/
-void
-e_calendar_table_delete_selected (ECalendarTable *cal_table)
-{
- ETable *etable;
- int n_selected;
- ECalModelComponent *comp_data;
- ECalComponent *comp = NULL;
-
- g_return_if_fail (cal_table != NULL);
- g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table));
-
- etable = e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable));
-
- n_selected = e_table_selected_count (etable);
- if (n_selected <= 0)
- return;
-
- if (n_selected == 1)
- comp_data = get_selected_comp (cal_table);
- else
- comp_data = NULL;
-
- /* FIXME: this may be something other than a TODO component */
-
- if (comp_data) {
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp));
- }
-
- if (delete_component_dialog (comp, FALSE, n_selected, E_CAL_COMPONENT_TODO,
- GTK_WIDGET (cal_table)))
- delete_selected_components (cal_table);
-
- /* free memory */
- if (comp)
- g_object_unref (comp);
-}
-
-/**
- * e_calendar_table_get_selected:
- * @cal_table:
- *
- * Get the currently selected ECalModelComponent's on the table.
- *
- * Return value: A GSList of the components, which should be
- * g_slist_free'd when finished with.
- **/
-GSList *
-e_calendar_table_get_selected (ECalendarTable *cal_table)
-{
- return get_selected_objects(cal_table);
-}
-
-/**
- * e_calendar_table_cut_clipboard:
- * @cal_table: A calendar table.
- *
- * Cuts selected tasks in the given calendar table
- */
-void
-e_calendar_table_cut_clipboard (ECalendarTable *cal_table)
-{
- g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table));
-
- e_calendar_table_copy_clipboard (cal_table);
- delete_selected_components (cal_table);
-}
-
-/* callback for e_table_selected_row_foreach */
-static void
-copy_row_cb (int model_row, gpointer data)
-{
- ECalendarTable *cal_table;
- ECalModelComponent *comp_data;
- gchar *comp_str;
- icalcomponent *child;
-
- cal_table = E_CALENDAR_TABLE (data);
-
- g_return_if_fail (cal_table->tmp_vcal != NULL);
-
- comp_data = e_cal_model_get_component_at (cal_table->model, model_row);
- if (!comp_data)
- return;
-
- /* add timezones to the VCALENDAR component */
- e_cal_util_add_timezones_from_component (cal_table->tmp_vcal, comp_data->icalcomp);
-
- /* add the new component to the VCALENDAR component */
- comp_str = icalcomponent_as_ical_string (comp_data->icalcomp);
- child = icalparser_parse_string (comp_str);
- if (child) {
- icalcomponent_add_component (cal_table->tmp_vcal,
- icalcomponent_new_clone (child));
- icalcomponent_free (child);
- }
-}
-
-/**
- * e_calendar_table_copy_clipboard:
- * @cal_table: A calendar table.
- *
- * Copies selected tasks into the clipboard
- */
-void
-e_calendar_table_copy_clipboard (ECalendarTable *cal_table)
-{
- ETable *etable;
- char *comp_str;
-
- g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table));
-
- /* create temporary VCALENDAR object */
- cal_table->tmp_vcal = e_cal_util_new_top_level ();
-
- etable = e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable));
- e_table_selected_row_foreach (etable, copy_row_cb, cal_table);
- comp_str = icalcomponent_as_ical_string (cal_table->tmp_vcal);
- gtk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (cal_table), clipboard_atom),
- (const char *) comp_str,
- g_utf8_strlen (comp_str, -1));
-
- /* free memory */
- icalcomponent_free (cal_table->tmp_vcal);
- cal_table->tmp_vcal = NULL;
-}
-
-static void
-clipboard_get_text_cb (GtkClipboard *clipboard, const gchar *text, ECalendarTable *cal_table)
-{
- icalcomponent *icalcomp;
- char *uid;
- ECalComponent *comp;
- ECal *client;
- icalcomponent_kind kind;
-
- g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table));
-
- if (!text || !*text)
- return;
-
- icalcomp = icalparser_parse_string (text);
- if (!icalcomp)
- return;
-
- /* check the type of the component */
- kind = icalcomponent_isa (icalcomp);
- if (kind != ICAL_VCALENDAR_COMPONENT &&
- kind != ICAL_VEVENT_COMPONENT &&
- kind != ICAL_VTODO_COMPONENT &&
- kind != ICAL_VJOURNAL_COMPONENT) {
- return;
- }
-
- client = e_cal_model_get_default_client (cal_table->model);
-
- e_calendar_table_set_status_message (cal_table, _("Updating objects"));
-
- if (kind == ICAL_VCALENDAR_COMPONENT) {
- icalcomponent_kind child_kind;
- icalcomponent *subcomp;
- icalcomponent *vcal_comp;
-
- vcal_comp = icalcomp;
- subcomp = icalcomponent_get_first_component (
- vcal_comp, ICAL_ANY_COMPONENT);
- while (subcomp) {
- child_kind = icalcomponent_isa (subcomp);
- if (child_kind == ICAL_VEVENT_COMPONENT ||
- child_kind == ICAL_VTODO_COMPONENT ||
- child_kind == ICAL_VJOURNAL_COMPONENT) {
- ECalComponent *tmp_comp;
-
- uid = e_cal_component_gen_uid ();
- tmp_comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (
- tmp_comp, icalcomponent_new_clone (subcomp));
- e_cal_component_set_uid (tmp_comp, uid);
- free (uid);
-
- /* FIXME should we convert start/due/complete times? */
- /* FIXME Error handling */
- e_cal_create_object (client, e_cal_component_get_icalcomponent (tmp_comp), NULL, NULL);
-
- g_object_unref (tmp_comp);
- }
- subcomp = icalcomponent_get_next_component (
- vcal_comp, ICAL_ANY_COMPONENT);
- }
- }
- else {
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomp);
- uid = e_cal_component_gen_uid ();
- e_cal_component_set_uid (comp, (const char *) uid);
- free (uid);
-
- e_cal_create_object (client, e_cal_component_get_icalcomponent (comp), NULL, NULL);
-
- g_object_unref (comp);
- }
-
- e_calendar_table_set_status_message (cal_table, NULL);
-}
-
-/**
- * e_calendar_table_paste_clipboard:
- * @cal_table: A calendar table.
- *
- * Pastes tasks currently in the clipboard into the given calendar table
- */
-void
-e_calendar_table_paste_clipboard (ECalendarTable *cal_table)
-{
- g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table));
-
- gtk_clipboard_request_text (gtk_widget_get_clipboard (GTK_WIDGET (cal_table), clipboard_atom),
- (GtkClipboardTextReceivedFunc) clipboard_get_text_cb, cal_table);
-}
-
-/* Opens a task in the task editor */
-static void
-open_task (ECalendarTable *cal_table, ECalModelComponent *comp_data, gboolean assign)
-{
- CompEditor *tedit;
- const char *uid;
-
- uid = icalcomponent_get_uid (comp_data->icalcomp);
-
- tedit = e_comp_editor_registry_find (comp_editor_registry, uid);
- if (tedit == NULL) {
- ECalComponent *comp;
-
- tedit = COMP_EDITOR (task_editor_new (comp_data->client, assign));
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp));
- comp_editor_edit_comp (tedit, comp);
- if (assign)
- task_editor_show_assignment (TASK_EDITOR (tedit));
-
- e_comp_editor_registry_add (comp_editor_registry, tedit, FALSE);
- }
-
- comp_editor_focus (tedit);
-}
-
-/* Opens the task in the specified row */
-static void
-open_task_by_row (ECalendarTable *cal_table, int row)
-{
- ECalModelComponent *comp_data;
- icalproperty *prop;
-
- comp_data = e_cal_model_get_component_at (cal_table->model, row);
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_ATTENDEE_PROPERTY);
- open_task (cal_table, comp_data, prop ? TRUE : FALSE);
-}
-
-static void
-e_calendar_table_on_double_click (ETable *table,
- gint row,
- gint col,
- GdkEvent *event,
- ECalendarTable *cal_table)
-{
- open_task_by_row (cal_table, row);
-}
-
-/* popup menu callbacks */
-
-static void
-e_calendar_table_on_open_task (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarTable *cal_table = data;
- ECalModelComponent *comp_data;
- icalproperty *prop;
-
- comp_data = get_selected_comp (cal_table);
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_ATTENDEE_PROPERTY);
- if (comp_data)
- open_task (cal_table, comp_data, prop ? TRUE : FALSE);
-}
-
-static void
-e_calendar_table_on_save_as (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarTable *cal_table = data;
- ECalModelComponent *comp_data;
- char *filename;
- char *ical_string;
- FILE *file;
-
- comp_data = get_selected_comp (cal_table);
- if (comp_data == NULL)
- return;
-
- filename = e_file_dialog_save (_("Save as..."));
- if (filename == NULL)
- return;
-
- ical_string = e_cal_get_component_as_string (comp_data->client, comp_data->icalcomp);
- if (ical_string == NULL) {
- g_warning ("Couldn't convert item to a string");
- return;
- }
-
- file = fopen (filename, "w");
- if (file == NULL) {
- g_warning ("Couldn't save item");
- return;
- }
-
- fprintf (file, ical_string);
- g_free (ical_string);
- fclose (file);
-}
-
-static void
-e_calendar_table_on_print_task (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarTable *cal_table = data;
- ECalModelComponent *comp_data;
- ECalComponent *comp;
-
- comp_data = get_selected_comp (cal_table);
- if (comp_data == NULL)
- return;
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp));
- print_comp (comp, comp_data->client, FALSE);
-
- g_object_unref (comp);
-}
-
-static void
-e_calendar_table_on_cut (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarTable *cal_table = data;
-
- e_calendar_table_cut_clipboard (cal_table);
-}
-
-static void
-e_calendar_table_on_copy (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarTable *cal_table = data;
-
- e_calendar_table_copy_clipboard (cal_table);
-}
-
-static void
-e_calendar_table_on_paste (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarTable *cal_table = data;
-
- e_calendar_table_paste_clipboard (cal_table);
-}
-
-static void
-e_calendar_table_on_assign (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarTable *cal_table = data;
- ECalModelComponent *comp_data;
-
- comp_data = get_selected_comp (cal_table);
- if (comp_data)
- open_task (cal_table, comp_data, TRUE);
-}
-
-static void
-e_calendar_table_on_forward (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarTable *cal_table = data;
- ECalModelComponent *comp_data;
-
- comp_data = get_selected_comp (cal_table);
- if (comp_data) {
- ECalComponent *comp;
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp));
- itip_send_comp (E_CAL_COMPONENT_METHOD_PUBLISH, comp, comp_data->client, NULL, NULL);
-
- g_object_unref (comp);
- }
-}
-
-/* Used from e_table_selected_row_foreach() */
-static void
-mark_row_complete_cb (int model_row, gpointer data)
-{
- ECalendarTable *cal_table;
-
- cal_table = E_CALENDAR_TABLE (data);
- e_cal_model_tasks_mark_task_complete (E_CAL_MODEL_TASKS (cal_table->model), model_row);
-}
-
-/* Callback used for the "mark tasks as complete" menu item */
-static void
-mark_as_complete_cb (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarTable *cal_table = data;
- ETable *etable;
-
- etable = e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable));
- e_table_selected_row_foreach (etable, mark_row_complete_cb, cal_table);
-}
-
-/* Opens the URL of the task */
-static void
-open_url_cb (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarTable *cal_table = data;
- ECalModelComponent *comp_data;
- icalproperty *prop;
-
- comp_data = get_selected_comp (cal_table);
- if (!comp_data)
- return;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_URL_PROPERTY);
- if (!prop)
- return;
-
- gnome_url_show (icalproperty_get_url (prop), NULL);
-}
-
-/* Callback for the "delete tasks" menu item */
-static void
-delete_cb (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarTable *cal_table = data;
-
- e_calendar_table_delete_selected (cal_table);
-}
-
-static EPopupItem tasks_popup_items [] = {
- { E_POPUP_ITEM, "00.open", N_("_Open"), e_calendar_table_on_open_task, NULL, GTK_STOCK_OPEN, E_CAL_POPUP_SELECT_ONE },
- { E_POPUP_ITEM, "05.openweb", N_("Open _Web Page"), open_url_cb, NULL, NULL, E_CAL_POPUP_SELECT_ONE, E_CAL_POPUP_SELECT_HASURL },
- { E_POPUP_ITEM, "10.saveas", N_("_Save As..."), e_calendar_table_on_save_as, NULL, GTK_STOCK_SAVE_AS, E_CAL_POPUP_SELECT_ONE },
- { E_POPUP_ITEM, "20.print", N_("_Print..."), e_calendar_table_on_print_task, NULL, GTK_STOCK_PRINT, E_CAL_POPUP_SELECT_ONE },
-
- { E_POPUP_BAR, "30.bar" },
-
- { E_POPUP_ITEM, "40.cut", N_("C_ut"), e_calendar_table_on_cut, NULL, GTK_STOCK_CUT, 0, E_CAL_POPUP_SELECT_EDITABLE },
- { E_POPUP_ITEM, "50.copy", N_("_Copy"), e_calendar_table_on_copy, NULL, GTK_STOCK_COPY, 0, 0 },
- { E_POPUP_ITEM, "60.paste", N_("_Paste"), e_calendar_table_on_paste, NULL, GTK_STOCK_PASTE, 0, E_CAL_POPUP_SELECT_EDITABLE },
-
- { E_POPUP_BAR, "70.bar" },
-
- { E_POPUP_ITEM, "80.assign", N_("_Assign Task"), e_calendar_table_on_assign, NULL, NULL, E_CAL_POPUP_SELECT_ONE, E_CAL_POPUP_SELECT_EDITABLE|E_CAL_POPUP_SELECT_ASSIGNABLE },
- { E_POPUP_ITEM, "90.forward", N_("_Forward as iCalendar"), e_calendar_table_on_forward, NULL, "stock_mail-forward", E_CAL_POPUP_SELECT_ONE },
- { E_POPUP_ITEM, "a0.markonecomplete", N_("_Mark as Complete"), mark_as_complete_cb, NULL, NULL, E_CAL_POPUP_SELECT_ONE, E_CAL_POPUP_SELECT_EDITABLE },
- { E_POPUP_ITEM, "b0.markmanycomplete", N_("_Mark Selected Tasks as Complete"), mark_as_complete_cb, NULL, NULL, E_CAL_POPUP_SELECT_MANY, E_CAL_POPUP_SELECT_EDITABLE },
-
- { E_POPUP_BAR, "c0.bar" },
-
- { E_POPUP_ITEM, "d0.delete", N_("_Delete"), delete_cb, NULL, GTK_STOCK_DELETE, E_CAL_POPUP_SELECT_ONE, E_CAL_POPUP_SELECT_EDITABLE },
- { E_POPUP_ITEM, "e0.deletemany", N_("_Delete Selected Tasks"), delete_cb, NULL, GTK_STOCK_DELETE, E_CAL_POPUP_SELECT_MANY, E_CAL_POPUP_SELECT_EDITABLE },
-};
-
-static void
-ect_popup_free(EPopup *ep, GSList *items, void *data)
-{
- g_slist_free(items);
-}
-
-static gint
-e_calendar_table_show_popup_menu (ETable *table,
- GdkEvent *gdk_event,
- ECalendarTable *cal_table)
-{
- GtkMenu *menu;
- GSList *selection, *l, *menus = NULL;
- GPtrArray *events;
- ECalPopup *ep;
- ECalPopupTargetSelect *t;
- int i;
-
- selection = get_selected_objects (cal_table);
- if (!selection)
- return TRUE;
-
- /** @HookPoint-ECalPopup: Tasks Table Context Menu
- * @Id: org.gnome.evolution.tasks.table.popup
- * @Class: org.gnome.evolution.calendar.popup:1.0
- * @Target: ECalPopupTargetSelect
- *
- * The context menu on the tasks table.
- */
- ep = e_cal_popup_new("org.gnome.evolution.tasks.table.popup");
-
- events = g_ptr_array_new();
- for (l=selection;l;l=g_slist_next(l))
- g_ptr_array_add(events, e_cal_model_copy_component_data((ECalModelComponent *)l->data));
- g_slist_free(selection);
-
- t = e_cal_popup_target_new_select(ep, cal_table->model, events);
- t->target.widget = (GtkWidget *)cal_table;
-
- for (i=0;i<sizeof(tasks_popup_items)/sizeof(tasks_popup_items[0]);i++)
- menus = g_slist_prepend(menus, &tasks_popup_items[i]);
- e_popup_add_items((EPopup *)ep, menus, NULL, ect_popup_free, cal_table);
-
- menu = e_popup_create_menu_once((EPopup *)ep, (EPopupTarget *)t, 0);
-
- gtk_menu_popup(menu, NULL, NULL, NULL, NULL, gdk_event?gdk_event->button.button:0,
- gdk_event?gdk_event->button.time:gtk_get_current_event_time());
-
- return TRUE;
-}
-
-static gint
-e_calendar_table_on_right_click (ETable *table,
- gint row,
- gint col,
- GdkEvent *event,
- ECalendarTable *cal_table)
-{
- return e_calendar_table_show_popup_menu (table, event, cal_table);
-}
-
-static gboolean
-e_calendar_table_on_popup_menu (GtkWidget *widget, gpointer data)
-{
- ETable *table = E_TABLE(widget);
- g_return_val_if_fail(table, FALSE);
-
- return e_calendar_table_show_popup_menu (table, NULL,
- E_CALENDAR_TABLE(data));
-}
-
-static gint
-e_calendar_table_on_key_press (ETable *table,
- gint row,
- gint col,
- GdkEventKey *event,
- ECalendarTable *cal_table)
-{
- if (event->keyval == GDK_Delete) {
- delete_cb (NULL, NULL, cal_table);
- return TRUE;
- } else if ((event->keyval == GDK_o)
- &&(event->state & GDK_CONTROL_MASK)) {
- open_task_by_row (cal_table, row);
- return TRUE;
- }
-
- return FALSE;
-}
-
-/* Loads the state of the table (headers shown etc.) from the given file. */
-void
-e_calendar_table_load_state (ECalendarTable *cal_table,
- gchar *filename)
-{
- struct stat st;
-
- g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table));
-
- if (stat (filename, &st) == 0 && st.st_size > 0
- && S_ISREG (st.st_mode)) {
- e_table_load_state (e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable)), filename);
- }
-}
-
-
-/* Saves the state of the table (headers shown etc.) to the given file. */
-void
-e_calendar_table_save_state (ECalendarTable *cal_table,
- gchar *filename)
-{
- g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table));
-
- e_table_save_state (e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable)),
- filename);
-}
-
-/* Returns the current time, for the ECellDateEdit items.
- FIXME: Should probably use the timezone of the item rather than the
- current timezone, though that may be difficult to get from here. */
-static struct tm
-e_calendar_table_get_current_time (ECellDateEdit *ecde, gpointer data)
-{
- icaltimezone *zone;
- struct tm tmp_tm = { 0 };
- struct icaltimetype tt;
-
- /* Get the current timezone. */
- zone = calendar_config_get_icaltimezone ();
-
- tt = icaltime_from_timet_with_zone (time (NULL), FALSE, zone);
-
- /* Now copy it to the struct tm and return it. */
- tmp_tm.tm_year = tt.year - 1900;
- tmp_tm.tm_mon = tt.month - 1;
- tmp_tm.tm_mday = tt.day;
- tmp_tm.tm_hour = tt.hour;
- tmp_tm.tm_min = tt.minute;
- tmp_tm.tm_sec = tt.second;
- tmp_tm.tm_isdst = -1;
-
- return tmp_tm;
-}
-
-
-#ifdef TRANSLATORS_ONLY
-
-static char *test[] = {
- N_("Click to add a task")
-};
-
-#endif
-
-/* Displays messages on the status bar */
-#define EVOLUTION_TASKS_PROGRESS_IMAGE "stock_todo"
-static GdkPixbuf *progress_icon = NULL;
-
-void
-e_calendar_table_set_activity_handler (ECalendarTable *cal_table, EActivityHandler *activity_handler)
-{
- g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table));
-
- cal_table->activity_handler = activity_handler;
-}
-
-void
-e_calendar_table_set_status_message (ECalendarTable *cal_table, const gchar *message)
-{
- g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table));
-
- if (!cal_table->activity_handler)
- return;
-
- if (!message || !*message) {
- if (cal_table->activity_id != 0) {
- e_activity_handler_operation_finished (cal_table->activity_handler, cal_table->activity_id);
- cal_table->activity_id = 0;
- }
- } else if (cal_table->activity_id == 0) {
- char *client_id = g_strdup_printf ("%p", cal_table);
-
- if (progress_icon == NULL)
- progress_icon = e_icon_factory_get_icon (EVOLUTION_TASKS_PROGRESS_IMAGE, E_ICON_SIZE_STATUS);
-
- cal_table->activity_id = e_activity_handler_operation_started (cal_table->activity_handler, client_id,
- progress_icon, message, TRUE);
-
- g_free (client_id);
- } else {
- e_activity_handler_operation_progressing (cal_table->activity_handler, cal_table->activity_id, message, -1.0);
- }
-}
diff --git a/calendar/gui/e-calendar-table.etspec b/calendar/gui/e-calendar-table.etspec
deleted file mode 100644
index ee8e151b7a..0000000000
--- a/calendar/gui/e-calendar-table.etspec
+++ /dev/null
@@ -1,20 +0,0 @@
-<ETableSpecification click-to-add="true" _click-to-add-message="Click to add a task" draw-grid="true">
- <ETableColumn model_col= "5" _title="Start date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="date-compare" priority="-2"/>
- <ETableColumn model_col="7" pixbuf="icon" _title="Type" expansion="1.0" minimum_width="16" resizable="false" cell="icon" compare="integer" priority="-4"/>
- <ETableColumn model_col= "8" _title="Summary" expansion="3.0" minimum_width="10" resizable="true" cell="calstring" compare="string" priority="10"/>
- <ETableColumn model_col= "10" _title="Completion date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="date-compare" priority="-2"/>
- <ETableColumn model_col="11" pixbuf="complete" _title="Complete" expansion="1.0" minimum_width="16" resizable="false" cell="checkbox" compare="integer" priority="-4"/>
- <ETableColumn model_col= "12" _title="Due date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="date-compare" priority="-2"/>
- <ETableColumn model_col= "15" _title="% Complete" expansion="1.0" minimum_width="10" resizable="true" cell="percent" compare="percent-compare" priority="-3"/>
- <ETableColumn model_col= "16" _title="Priority" expansion="1.0" minimum_width="10" resizable="true" cell="priority" compare="priority-compare" priority="-3"/>
- <ETableColumn model_col="17" _title="Status" expansion="1.0" minimum_width="10" resizable="true" cell="calstatus" compare="string" priority="-1"/>
- <ETableColumn model_col="19" _title="Task sort" cell="task-sort" compare="task-sort" priority="-4"/>
- <ETableColumn model_col="0" _title="Categories" cell="calstring" compare="string" expansion="1.0" minimum_width="10" resizable="true" priority="-2"/>
-
- <ETableState>
- <column source="1"/>
- <column source="4"/>
- <column source= "2"/>
- <grouping></grouping>
- </ETableState>
-</ETableSpecification>
diff --git a/calendar/gui/e-calendar-table.h b/calendar/gui/e-calendar-table.h
deleted file mode 100644
index 48af37831a..0000000000
--- a/calendar/gui/e-calendar-table.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 2000, Ximian, Inc.
- * Copyright 2000, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-#ifndef _E_CALENDAR_TABLE_H_
-#define _E_CALENDAR_TABLE_H_
-
-#include <gtk/gtktable.h>
-#include <gal/e-table/e-table-scrolled.h>
-#include <widgets/misc/e-cell-date-edit.h>
-#include "e-activity-handler.h"
-#include "e-cal-model.h"
-
-G_BEGIN_DECLS
-
-/*
- * ECalendarTable - displays the iCalendar objects in a table (an ETable).
- * Used for calendar events and tasks.
- */
-
-
-#define E_CALENDAR_TABLE(obj) GTK_CHECK_CAST (obj, e_calendar_table_get_type (), ECalendarTable)
-#define E_CALENDAR_TABLE_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_calendar_table_get_type (), ECalendarTableClass)
-#define E_IS_CALENDAR_TABLE(obj) GTK_CHECK_TYPE (obj, e_calendar_table_get_type ())
-
-
-typedef struct _ECalendarTable ECalendarTable;
-typedef struct _ECalendarTableClass ECalendarTableClass;
-
-
-struct _ECalendarTable {
- GtkTable table;
-
- /* The model that we use */
- ECalModel *model;
-
- GtkWidget *etable;
-
- /* The ECell used to view & edit dates. */
- ECellDateEdit *dates_cell;
-
- /* Fields used for cut/copy/paste */
- icalcomponent *tmp_vcal;
-
- /* Activity ID for the EActivityHandler (i.e. the status bar). */
- EActivityHandler *activity_handler;
- guint activity_id;
-};
-
-struct _ECalendarTableClass {
- GtkTableClass parent_class;
-
- /* Notification signals */
- void (* user_created) (ECalendarTable *cal_table);
-};
-
-
-GtkType e_calendar_table_get_type (void);
-GtkWidget* e_calendar_table_new (void);
-
-ECalModel *e_calendar_table_get_model (ECalendarTable *cal_table);
-
-ETable *e_calendar_table_get_table (ECalendarTable *cal_table);
-
-void e_calendar_table_open_selected (ECalendarTable *cal_table);
-void e_calendar_table_complete_selected (ECalendarTable *cal_table);
-void e_calendar_table_delete_selected (ECalendarTable *cal_table);
-
-GSList *e_calendar_table_get_selected (ECalendarTable *cal_table);
-
-/* Clipboard related functions */
-void e_calendar_table_cut_clipboard (ECalendarTable *cal_table);
-void e_calendar_table_copy_clipboard (ECalendarTable *cal_table);
-void e_calendar_table_paste_clipboard (ECalendarTable *cal_table);
-
-/* These load and save the state of the table (headers shown etc.) to/from
- the given file. */
-void e_calendar_table_load_state (ECalendarTable *cal_table,
- gchar *filename);
-void e_calendar_table_save_state (ECalendarTable *cal_table,
- gchar *filename);
-
-void e_calendar_table_set_activity_handler (ECalendarTable *cal_table,
- EActivityHandler *activity_handler);
-void e_calendar_table_set_status_message (ECalendarTable *cal_table,
- const gchar *message);
-
-G_END_DECLS
-
-#endif /* _E_CALENDAR_TABLE_H_ */
diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c
deleted file mode 100644
index 0ca92240d0..0000000000
--- a/calendar/gui/e-calendar-view.c
+++ /dev/null
@@ -1,1674 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <time.h>
-#include <gtk/gtkimage.h>
-#include <gtk/gtkstock.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtkbindings.h>
-#include <libgnome/gnome-i18n.h>
-#include <e-util/e-dialog-utils.h>
-#include <e-util/e-icon-factory.h>
-#include "e-calendar-marshal.h"
-#include <libecal/e-cal-time-util.h>
-#include <libecal/e-cal-component.h>
-
-#include "common/authentication.h"
-#include "calendar-commands.h"
-#include "calendar-component.h"
-#include "calendar-config.h"
-#include "comp-util.h"
-#include "e-cal-model-calendar.h"
-#include "e-calendar-view.h"
-#include "e-comp-editor-registry.h"
-#include "itip-utils.h"
-#include "e-pub-utils.h"
-#include "dialogs/delete-comp.h"
-#include "dialogs/delete-error.h"
-#include "dialogs/event-editor.h"
-#include "dialogs/send-comp.h"
-#include "dialogs/cancel-comp.h"
-#include "dialogs/recur-comp.h"
-#include "dialogs/select-source-dialog.h"
-#include "print.h"
-#include "goto.h"
-#include "ea-calendar.h"
-#include "e-cal-popup.h"
-
-/* Used for the status bar messages */
-#define EVOLUTION_CALENDAR_PROGRESS_IMAGE "stock_calendar"
-static GdkPixbuf *progress_icon = NULL;
-
-struct _ECalendarViewPrivate {
- /* The GnomeCalendar we are associated to */
- GnomeCalendar *calendar;
-
- /* The calendar model we are monitoring */
- ECalModel *model;
-
- /* Current activity (for the EActivityHandler, i.e. the status bar). */
- EActivityHandler *activity_handler;
- guint activity_id;
-
- /* The default category */
- char *default_category;
-};
-
-static void e_calendar_view_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec);
-static void e_calendar_view_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec);
-static void e_calendar_view_destroy (GtkObject *object);
-
-static GdkAtom clipboard_atom = GDK_NONE;
-extern ECompEditorRegistry *comp_editor_registry;
-
-/* Property IDs */
-enum props {
- PROP_0,
- PROP_MODEL,
-};
-
-/* FIXME Why are we emitting these event signals here? Can't the model just be listened to? */
-/* Signal IDs */
-enum {
- SELECTION_CHANGED,
- SELECTED_TIME_CHANGED,
- TIMEZONE_CHANGED,
- EVENT_CHANGED,
- EVENT_ADDED,
- USER_CREATED,
- OPEN_EVENT,
- LAST_SIGNAL
-};
-
-static guint e_calendar_view_signals[LAST_SIGNAL] = { 0 };
-
-G_DEFINE_TYPE (ECalendarView, e_calendar_view, GTK_TYPE_TABLE);
-
-static void
-e_calendar_view_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
-{
- ECalendarView *cal_view;
- ECalendarViewPrivate *priv;
-
- cal_view = E_CALENDAR_VIEW (object);
- priv = cal_view->priv;
-
- switch (property_id) {
- case PROP_MODEL:
- e_calendar_view_set_model (cal_view, E_CAL_MODEL (g_value_get_object (value)));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-e_calendar_view_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
-{
- ECalendarView *cal_view;
- ECalendarViewPrivate *priv;
-
- cal_view = E_CALENDAR_VIEW (object);
- priv = cal_view->priv;
-
- switch (property_id) {
- case PROP_MODEL:
- g_value_set_object (value, e_calendar_view_get_model (cal_view));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-e_calendar_view_class_init (ECalendarViewClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
-
- GtkBindingSet *binding_set;
-
- /* Method override */
- gobject_class->set_property = e_calendar_view_set_property;
- gobject_class->get_property = e_calendar_view_get_property;
- object_class->destroy = e_calendar_view_destroy;
-
- klass->selection_changed = NULL;
- klass->selected_time_changed = NULL;
- klass->event_changed = NULL;
- klass->event_added = NULL;
- klass->user_created = NULL;
-
- klass->get_selected_events = NULL;
- klass->get_selected_time_range = NULL;
- klass->set_selected_time_range = NULL;
- klass->get_visible_time_range = NULL;
- klass->update_query = NULL;
- klass->open_event = e_calendar_view_open_event;
-
- g_object_class_install_property (gobject_class, PROP_MODEL,
- g_param_spec_object ("model", NULL, NULL, E_TYPE_CAL_MODEL,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
-
- /* Create class' signals */
- e_calendar_view_signals[SELECTION_CHANGED] =
- g_signal_new ("selection_changed",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (ECalendarViewClass, selection_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
- e_calendar_view_signals[SELECTED_TIME_CHANGED] =
- g_signal_new ("selected_time_changed",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (ECalendarViewClass, selected_time_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
- e_calendar_view_signals[TIMEZONE_CHANGED] =
- g_signal_new ("timezone_changed",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (ECalendarViewClass, timezone_changed),
- NULL, NULL,
- e_calendar_marshal_VOID__POINTER_POINTER,
- G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER);
-
- e_calendar_view_signals[EVENT_CHANGED] =
- g_signal_new ("event_changed",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
- G_STRUCT_OFFSET (ECalendarViewClass, event_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE, 1,
- G_TYPE_POINTER);
-
- e_calendar_view_signals[EVENT_ADDED] =
- g_signal_new ("event_added",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
- G_STRUCT_OFFSET (ECalendarViewClass, event_added),
- NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE, 1,
- G_TYPE_POINTER);
-
- e_calendar_view_signals[USER_CREATED] =
- g_signal_new ("user_created",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (ECalendarViewClass, user_created),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
- e_calendar_view_signals[OPEN_EVENT] =
- g_signal_new ("open_event",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
- G_STRUCT_OFFSET (ECalendarViewClass, open_event),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
- /* clipboard atom */
- if (!clipboard_atom)
- clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE);
-
-
- /*
- * Key bindings
- */
-
- binding_set = gtk_binding_set_by_class (klass);
-
- gtk_binding_entry_add_signal (binding_set, GDK_o,
- GDK_CONTROL_MASK,
- "open_event", 0);
-
- /* init the accessibility support for e_day_view */
- e_cal_view_a11y_init ();
-}
-
-
-void
-e_calendar_view_add_event (ECalendarView *cal_view, ECal *client, time_t dtstart,
- icaltimezone *default_zone, icalcomponent *icalcomp, gboolean in_top_canvas)
-{
- ECalComponent *comp;
- struct icaltimetype itime, old_dtstart, old_dtend;
- time_t tt_start, tt_end, new_dtstart;
- struct icaldurationtype ic_dur, ic_oneday;
- char *uid;
- gint start_offset, end_offset;
- gboolean all_day_event = FALSE;
- GnomeCalendarViewType view_type;
- ECalComponentDateTime dt;
-
- start_offset = 0;
- end_offset = 0;
-
- old_dtstart = icalcomponent_get_dtstart (icalcomp);
- tt_start = icaltime_as_timet (old_dtstart);
- old_dtend = icalcomponent_get_dtend (icalcomp);
- tt_end = icaltime_as_timet (old_dtend);
- ic_dur = icaldurationtype_from_int (tt_end - tt_start);
-
- if (icaldurationtype_as_int (ic_dur) > 60*60*24) {
- /* This is a long event */
- start_offset = old_dtstart.hour * 60 + old_dtstart.minute;
- end_offset = old_dtstart.hour * 60 + old_dtend.minute;
- }
-
- ic_oneday = icaldurationtype_null_duration ();
- ic_oneday.days = 1;
-
- view_type = gnome_calendar_get_view (cal_view->priv->calendar);
-
- switch (view_type) {
- case GNOME_CAL_DAY_VIEW:
- case GNOME_CAL_WORK_WEEK_VIEW:
- if (start_offset == 0 && end_offset == 0 && in_top_canvas)
- all_day_event = TRUE;
-
- if (all_day_event) {
- ic_dur = ic_oneday;
- } else if (icaldurationtype_as_int (ic_dur) >= 60*60*24
- && !in_top_canvas) {
- /* copy & paste from top canvas to main canvas */
- int time_divisions;
-
- time_divisions = calendar_config_get_time_divisions ();
- ic_dur = icaldurationtype_from_int (time_divisions * 60);
- }
- break;
- case GNOME_CAL_WEEK_VIEW:
- case GNOME_CAL_MONTH_VIEW:
- case GNOME_CAL_LIST_VIEW:
- if (old_dtstart.is_date && old_dtend.is_date
- && memcmp (&ic_dur, &ic_oneday, sizeof(ic_dur)) == 0)
- all_day_event = TRUE;
- break;
- default:
- g_assert_not_reached ();
- return;
- }
-
- if (in_top_canvas)
- new_dtstart = dtstart + start_offset * 60;
- else
- new_dtstart = dtstart;
-
- itime = icaltime_from_timet_with_zone (new_dtstart, FALSE, default_zone);
- if (all_day_event)
- itime.is_date = TRUE;
- icalcomponent_set_dtstart (icalcomp, itime);
-
- itime.is_date = FALSE;
- itime = icaltime_add (itime, ic_dur);
- if (all_day_event)
- itime.is_date = TRUE;
- icalcomponent_set_dtend (icalcomp, itime);
-
- /* FIXME The new uid stuff can go away once we actually set it in the backend */
- uid = e_cal_component_gen_uid ();
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (
- comp, icalcomponent_new_clone (icalcomp));
- e_cal_component_set_uid (comp, uid);
- g_free (uid);
-
- /* set the timezone properly */
- dt.value = &itime;
- e_cal_component_get_dtstart (comp, &dt);
- dt.tzid = icaltimezone_get_tzid (default_zone);
- e_cal_component_set_dtstart (comp, &dt);
- e_cal_component_get_dtend (comp, &dt);
- dt.tzid = icaltimezone_get_tzid (default_zone);
- e_cal_component_set_dtend (comp, &dt);
- e_cal_component_commit_sequence (comp);
-
- /* FIXME Error handling */
- uid = NULL;
- if (e_cal_create_object (client, e_cal_component_get_icalcomponent (comp), &uid, NULL)) {
- if (uid) {
- e_cal_component_set_uid (comp, uid);
- g_free (uid);
- }
-
- if (itip_organizer_is_user (comp, client) &&
- send_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)),
- client, comp, TRUE)) {
- itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp,
- client, NULL, NULL);
- }
- } else {
- g_message (G_STRLOC ": Could not create the object!");
- }
-
- g_object_unref (comp);
-}
-
-static void
-e_calendar_view_init (ECalendarView *cal_view)
-{
- cal_view->priv = g_new0 (ECalendarViewPrivate, 1);
-
- cal_view->priv->model = (ECalModel *) e_cal_model_calendar_new ();
-}
-
-static void
-e_calendar_view_destroy (GtkObject *object)
-{
- ECalendarView *cal_view = (ECalendarView *) object;
-
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- if (cal_view->priv) {
- if (cal_view->priv->model) {
- g_signal_handlers_disconnect_matched (cal_view->priv->model,
- G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, cal_view);
- g_object_unref (cal_view->priv->model);
- cal_view->priv->model = NULL;
- }
-
- if (cal_view->priv->default_category) {
- g_free (cal_view->priv->default_category);
- cal_view->priv->default_category = NULL;
- }
-
- g_free (cal_view->priv);
- cal_view->priv = NULL;
- }
-
- if (GTK_OBJECT_CLASS (e_calendar_view_parent_class)->destroy)
- GTK_OBJECT_CLASS (e_calendar_view_parent_class)->destroy (object);
-}
-
-GnomeCalendar *
-e_calendar_view_get_calendar (ECalendarView *cal_view)
-{
- g_return_val_if_fail (E_IS_CALENDAR_VIEW (cal_view), NULL);
-
- return cal_view->priv->calendar;
-}
-
-void
-e_calendar_view_set_calendar (ECalendarView *cal_view, GnomeCalendar *calendar)
-{
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- cal_view->priv->calendar = calendar;
-}
-
-ECalModel *
-e_calendar_view_get_model (ECalendarView *cal_view)
-{
- g_return_val_if_fail (E_IS_CALENDAR_VIEW (cal_view), NULL);
-
- return cal_view->priv->model;
-}
-
-void
-e_calendar_view_set_model (ECalendarView *cal_view, ECalModel *model)
-{
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
- g_return_if_fail (E_IS_CAL_MODEL (model));
-
- if (cal_view->priv->model) {
- g_signal_handlers_disconnect_matched (cal_view->priv->model, G_SIGNAL_MATCH_DATA,
- 0, 0, 0, NULL, cal_view);
- g_object_unref (cal_view->priv->model);
- }
-
- cal_view->priv->model = g_object_ref (model);
- e_calendar_view_update_query (cal_view);
-}
-
-icaltimezone *
-e_calendar_view_get_timezone (ECalendarView *cal_view)
-{
- g_return_val_if_fail (E_IS_CALENDAR_VIEW (cal_view), NULL);
- return e_cal_model_get_timezone (cal_view->priv->model);
-}
-
-void
-e_calendar_view_set_timezone (ECalendarView *cal_view, icaltimezone *zone)
-{
- icaltimezone *old_zone;
-
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- old_zone = e_cal_model_get_timezone (cal_view->priv->model);
- if (old_zone == zone)
- return;
-
- e_cal_model_set_timezone (cal_view->priv->model, zone);
- g_signal_emit (G_OBJECT (cal_view), e_calendar_view_signals[TIMEZONE_CHANGED], 0,
- old_zone, zone);
-}
-
-const char *
-e_calendar_view_get_default_category (ECalendarView *cal_view)
-{
- g_return_val_if_fail (E_IS_CALENDAR_VIEW (cal_view), NULL);
- return (const char *) cal_view->priv->default_category;
-}
-
-/**
- * e_calendar_view_set_default_category
- * @cal_view: A calendar view.
- * @category: Default category name or NULL for no category.
- *
- * Sets the default category that will be used when creating new calendar
- * components from the given calendar view.
- */
-void
-e_calendar_view_set_default_category (ECalendarView *cal_view, const char *category)
-{
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- if (cal_view->priv->default_category)
- g_free (cal_view->priv->default_category);
-
- cal_view->priv->default_category = g_strdup (category);
-}
-
-/**
- * e_calendar_view_get_use_24_hour_format:
- * @cal_view: A calendar view.
- *
- * Gets whether the view is using 24 hour times or not.
- *
- * Returns: the 24 hour setting.
- */
-gboolean
-e_calendar_view_get_use_24_hour_format (ECalendarView *cal_view)
-{
- g_return_val_if_fail (E_IS_CALENDAR_VIEW (cal_view), FALSE);
-
- return e_cal_model_get_use_24_hour_format (cal_view->priv->model);
-}
-
-/**
- * e_calendar_view_set_use_24_hour_format
- * @cal_view: A calendar view.
- * @use_24_hour: Whether to use 24 hour times or not.
- *
- * Sets the 12/24 hour times setting for the given view.
- */
-void
-e_calendar_view_set_use_24_hour_format (ECalendarView *cal_view, gboolean use_24_hour)
-{
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- e_cal_model_set_use_24_hour_format (cal_view->priv->model, use_24_hour);
-}
-
-void
-e_calendar_view_set_activity_handler (ECalendarView *cal_view, EActivityHandler *activity_handler)
-{
- ECalendarViewPrivate *priv;
-
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- priv = cal_view->priv;
-
- priv->activity_handler = activity_handler;
-}
-
-void
-e_calendar_view_set_status_message (ECalendarView *cal_view, const gchar *message)
-{
- ECalendarViewPrivate *priv;
-
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- priv = cal_view->priv;
-
- if (!priv->activity_handler)
- return;
-
- if (!message || !*message) {
- if (priv->activity_id != 0) {
- e_activity_handler_operation_finished (priv->activity_handler, priv->activity_id);
- priv->activity_id = 0;
- }
- } else if (priv->activity_id == 0) {
- char *client_id = g_strdup_printf ("%p", cal_view);
-
- if (progress_icon == NULL)
- progress_icon = e_icon_factory_get_icon (EVOLUTION_CALENDAR_PROGRESS_IMAGE, E_ICON_SIZE_STATUS);
-
- priv->activity_id = e_activity_handler_operation_started (priv->activity_handler, client_id, progress_icon, message, TRUE);
-
- g_free (client_id);
- } else {
- e_activity_handler_operation_progressing (priv->activity_handler, priv->activity_id, message, -1.0);
- }
-}
-
-GList *
-e_calendar_view_get_selected_events (ECalendarView *cal_view)
-{
- g_return_val_if_fail (E_IS_CALENDAR_VIEW (cal_view), NULL);
-
- if (E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_selected_events)
- return E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_selected_events (cal_view);
-
- return NULL;
-}
-
-gboolean
-e_calendar_view_get_selected_time_range (ECalendarView *cal_view, time_t *start_time, time_t *end_time)
-{
- g_return_val_if_fail (E_IS_CALENDAR_VIEW (cal_view), FALSE);
-
- if (E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_selected_time_range) {
- return E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_selected_time_range (
- cal_view, start_time, end_time);
- }
-
- return FALSE;
-}
-
-void
-e_calendar_view_set_selected_time_range (ECalendarView *cal_view, time_t start_time, time_t end_time)
-{
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- if (E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->set_selected_time_range) {
- E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->set_selected_time_range (
- cal_view, start_time, end_time);
- }
-}
-
-gboolean
-e_calendar_view_get_visible_time_range (ECalendarView *cal_view, time_t *start_time, time_t *end_time)
-{
- g_return_val_if_fail (E_IS_CALENDAR_VIEW (cal_view), FALSE);
-
- if (E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_visible_time_range) {
- return E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_visible_time_range (
- cal_view, start_time, end_time);
- }
-
- return FALSE;
-}
-
-void
-e_calendar_view_update_query (ECalendarView *cal_view)
-{
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- if (E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->update_query) {
- E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->update_query (cal_view);
- }
-}
-
-void
-e_calendar_view_cut_clipboard (ECalendarView *cal_view)
-{
- GList *selected, *l;
- const char *uid;
-
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- selected = e_calendar_view_get_selected_events (cal_view);
- if (!selected)
- return;
-
- e_calendar_view_set_status_message (cal_view, _("Deleting selected objects"));
-
- e_calendar_view_copy_clipboard (cal_view);
- for (l = selected; l != NULL; l = l->next) {
- ECalComponent *comp;
- ECalendarViewEvent *event = (ECalendarViewEvent *) l->data;
- GError *error = NULL;
-
- if (!event)
- continue;
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
- if (itip_organizer_is_user (comp, event->comp_data->client)
- && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)),
- event->comp_data->client, comp, TRUE))
- itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp,
- event->comp_data->client, NULL, NULL);
-
- e_cal_component_get_uid (comp, &uid);
- e_cal_remove_object (event->comp_data->client, uid, &error);
- delete_error_dialog (error, E_CAL_COMPONENT_EVENT);
-
- g_clear_error (&error);
-
- g_object_unref (comp);
- }
-
- e_calendar_view_set_status_message (cal_view, NULL);
-
- g_list_free (selected);
-}
-
-void
-e_calendar_view_copy_clipboard (ECalendarView *cal_view)
-{
- GList *selected, *l;
- gchar *comp_str;
- icalcomponent *vcal_comp;
- icalcomponent *new_icalcomp;
- ECalendarViewEvent *event;
-
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- selected = e_calendar_view_get_selected_events (cal_view);
- if (!selected)
- return;
-
- /* create top-level VCALENDAR component and add VTIMEZONE's */
- vcal_comp = e_cal_util_new_top_level ();
- for (l = selected; l != NULL; l = l->next) {
- event = (ECalendarViewEvent *) l->data;
-
- if (event)
- e_cal_util_add_timezones_from_component (vcal_comp, event->comp_data->icalcomp);
- }
-
- for (l = selected; l != NULL; l = l->next) {
- event = (ECalendarViewEvent *) l->data;
-
- new_icalcomp = icalcomponent_new_clone (event->comp_data->icalcomp);
- icalcomponent_add_component (vcal_comp, new_icalcomp);
- }
-
- /* copy the VCALENDAR to the clipboard */
- comp_str = icalcomponent_as_ical_string (vcal_comp);
- gtk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (cal_view), clipboard_atom),
- (const gchar *) comp_str,
- g_utf8_strlen (comp_str, -1));
-
- /* free memory */
- icalcomponent_free (vcal_comp);
- g_list_free (selected);
-}
-
-static void
-clipboard_get_text_cb (GtkClipboard *clipboard, const gchar *text, ECalendarView *cal_view)
-{
- icalcomponent *icalcomp;
- icalcomponent_kind kind;
- time_t selected_time_start, selected_time_end;
- icaltimezone *default_zone;
- ECal *client;
- gboolean in_top_canvas;
-
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- if (!text || !*text)
- return;
-
- icalcomp = icalparser_parse_string ((const char *) text);
- if (!icalcomp)
- return;
-
- default_zone = calendar_config_get_icaltimezone ();
- client = e_cal_model_get_default_client (cal_view->priv->model);
-
- /* check the type of the component */
- /* FIXME An error dialog if we return? */
- kind = icalcomponent_isa (icalcomp);
- if (kind != ICAL_VCALENDAR_COMPONENT && kind != ICAL_VEVENT_COMPONENT)
- return;
-
- e_calendar_view_set_status_message (cal_view, _("Updating objects"));
- e_calendar_view_get_selected_time_range (cal_view, &selected_time_start, &selected_time_end);
-
- if ((selected_time_end - selected_time_start) == 60 * 60 * 24)
- in_top_canvas = TRUE;
- else
- in_top_canvas = FALSE;
-
- /* FIXME Timezone handling */
- if (kind == ICAL_VCALENDAR_COMPONENT) {
- icalcomponent_kind child_kind;
- icalcomponent *subcomp;
-
- subcomp = icalcomponent_get_first_component (icalcomp, ICAL_ANY_COMPONENT);
- while (subcomp) {
- child_kind = icalcomponent_isa (subcomp);
- if (child_kind == ICAL_VEVENT_COMPONENT)
- e_calendar_view_add_event (cal_view, client, selected_time_start,
- default_zone, subcomp, in_top_canvas);
- else if (child_kind == ICAL_VTIMEZONE_COMPONENT) {
- icaltimezone *zone;
-
- zone = icaltimezone_new ();
- icaltimezone_set_component (zone, subcomp);
- e_cal_add_timezone (client, zone, NULL);
-
- icaltimezone_free (zone, 1);
- }
-
- subcomp = icalcomponent_get_next_component (
- icalcomp, ICAL_ANY_COMPONENT);
- }
-
- icalcomponent_free (icalcomp);
-
- } else {
- e_calendar_view_add_event (cal_view, client, selected_time_start, default_zone, icalcomp, in_top_canvas);
- }
-
- e_calendar_view_set_status_message (cal_view, NULL);
-}
-
-void
-e_calendar_view_paste_clipboard (ECalendarView *cal_view)
-{
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- gtk_clipboard_request_text (gtk_widget_get_clipboard (GTK_WIDGET (cal_view), clipboard_atom),
- (GtkClipboardTextReceivedFunc) clipboard_get_text_cb, cal_view);
-}
-
-static void
-delete_event (ECalendarView *cal_view, ECalendarViewEvent *event)
-{
- ECalComponent *comp;
- ECalComponentVType vtype;
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
- vtype = e_cal_component_get_vtype (comp);
-
- if (delete_component_dialog (comp, FALSE, 1, vtype, GTK_WIDGET (cal_view))) {
- const char *uid;
- GError *error = NULL;
-
- if (itip_organizer_is_user (comp, event->comp_data->client)
- && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)),
- event->comp_data->client,
- comp, TRUE))
- itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp,
- event->comp_data->client, NULL, NULL);
-
- e_cal_component_get_uid (comp, &uid);
- if (!uid || !*uid) {
- g_object_unref (comp);
- return;
- }
-
- e_cal_remove_object (event->comp_data->client, uid, &error);
- delete_error_dialog (error, E_CAL_COMPONENT_EVENT);
- g_clear_error (&error);
- }
-
- g_object_unref (comp);
-}
-
-void
-e_calendar_view_delete_selected_event (ECalendarView *cal_view)
-{
- GList *selected;
- ECalendarViewEvent *event;
-
- selected = e_calendar_view_get_selected_events (cal_view);
- if (!selected)
- return;
-
- event = (ECalendarViewEvent *) selected->data;
- if (event)
- delete_event (cal_view, event);
-
- g_list_free (selected);
-}
-
-void
-e_calendar_view_delete_selected_events (ECalendarView *cal_view)
-{
- GList *selected, *l;
- ECalendarViewEvent *event;
-
- selected = e_calendar_view_get_selected_events (cal_view);
- if (!selected)
- return;
-
- for (l = selected; l != NULL; l = l->next) {
- event = (ECalendarViewEvent *) l->data;
- if (event)
- delete_event (cal_view, event);
- }
-
- g_list_free (selected);
-}
-
-void
-e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view)
-{
- ECalendarViewEvent *event;
- GList *selected;
- const char *uid, *rid = NULL;
- GError *error = NULL;
- ECalComponent *comp;
-
- selected = e_calendar_view_get_selected_events (cal_view);
- if (!selected)
- return;
-
- event = (ECalendarViewEvent *) selected->data;
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
- e_cal_component_get_uid (comp, &uid);
- if (e_cal_component_is_instance (comp))
- rid = e_cal_component_get_recurid_as_string (comp);
- else {
- ECalComponentDateTime dt;
- icaltimezone *zone;
-
- if (!e_cal_component_has_recurrences (comp)) {
- g_object_unref (comp);
- return;
- }
-
- /* get the RECUR-ID from the instance start date */
- e_cal_component_get_dtstart (comp, &dt);
- if (e_cal_get_timezone (event->comp_data->client, dt.tzid, &zone, NULL)) {
- rid = icaltime_as_ical_string (
- icaltime_from_timet_with_zone (event->comp_data->instance_start, TRUE, zone));
- } else
- rid = icaltime_as_ical_string (icaltime_from_timet (event->comp_data->instance_start, TRUE));
-
- e_cal_component_free_datetime (&dt);
- }
-
- if (rid) {
- if (delete_component_dialog (comp, FALSE, 1, e_cal_component_get_vtype (comp), GTK_WIDGET (cal_view))) {
-
- if (itip_organizer_is_user (comp, event->comp_data->client)
- && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)),
- event->comp_data->client,
- comp, TRUE)) {
- if (!e_cal_component_is_instance (comp)) {
- ECalComponentRange range;
-
- /* set the recurrence ID of the object we send */
- range.type = E_CAL_COMPONENT_RANGE_SINGLE;
- e_cal_component_get_dtstart (comp, &range.datetime);
- range.datetime.value->is_date = 1;
- e_cal_component_set_recurid (comp, &range);
-
- e_cal_component_free_datetime (&range.datetime);
- }
- itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp, event->comp_data->client, NULL, NULL);
- }
-
- e_cal_remove_object_with_mod (event->comp_data->client, uid, rid, CALOBJ_MOD_THIS, &error);
- delete_error_dialog (error, E_CAL_COMPONENT_EVENT);
- g_clear_error (&error);
- }
- }
-
- /* free memory */
- g_list_free (selected);
- g_object_unref (comp);
-}
-
-static void
-on_new_appointment (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
-
- e_calendar_view_new_appointment (cal_view);
-}
-
-static void
-on_new_event (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
-
- e_calendar_view_new_appointment_full (cal_view, TRUE, FALSE);
-}
-
-static void
-on_new_meeting (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
-
- e_calendar_view_new_appointment_full (cal_view, FALSE, TRUE);
-}
-
-static void
-on_new_task (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
-
- gnome_calendar_new_task (cal_view->priv->calendar);
-}
-
-static void
-on_goto_date (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
-
- goto_dialog (cal_view->priv->calendar);
-}
-
-static void
-on_goto_today (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
-
- calendar_goto_today (cal_view->priv->calendar);
-}
-
-static void
-on_edit_appointment (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
- GList *selected;
-
- selected = e_calendar_view_get_selected_events (cal_view);
- if (selected) {
- ECalendarViewEvent *event = (ECalendarViewEvent *) selected->data;
-
- if (event)
- e_calendar_view_edit_appointment (cal_view, event->comp_data->client,
- event->comp_data->icalcomp,
- icalcomponent_get_first_property(event->comp_data->icalcomp, ICAL_ATTENDEE_PROPERTY));
-
- g_list_free (selected);
- }
-}
-
-static void
-on_print (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
- time_t start, end;
- GnomeCalendarViewType view_type;
- PrintView print_view;
-
- e_calendar_view_get_visible_time_range (cal_view, &start, &end);
- view_type = gnome_calendar_get_view (cal_view->priv->calendar);
-
- switch (view_type) {
- case GNOME_CAL_DAY_VIEW :
- print_view = PRINT_VIEW_DAY;
- break;
-
- case GNOME_CAL_WORK_WEEK_VIEW :
- case GNOME_CAL_WEEK_VIEW:
- print_view = PRINT_VIEW_WEEK;
- break;
-
- case GNOME_CAL_MONTH_VIEW:
- print_view = PRINT_VIEW_MONTH;
- break;
-
- default:
- g_assert_not_reached ();
- return;
- }
-
- print_calendar (cal_view->priv->calendar, FALSE, start, print_view);
-}
-
-static void
-on_save_as (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
- GList *selected;
- char *filename;
- char *ical_string;
- FILE *file;
- ECalendarViewEvent *event;
-
- selected = e_calendar_view_get_selected_events (cal_view);
- if (!selected)
- return;
-
- filename = e_file_dialog_save (_("Save as..."));
- if (filename == NULL)
- return;
-
- event = (ECalendarViewEvent *) selected->data;
- ical_string = e_cal_get_component_as_string (event->comp_data->client, event->comp_data->icalcomp);
- if (ical_string == NULL) {
- g_warning ("Couldn't convert item to a string");
- return;
- }
-
- file = fopen (filename, "w");
- if (file == NULL) {
- g_warning ("Couldn't save item");
- return;
- }
-
- fprintf (file, ical_string);
- g_free (ical_string);
- fclose (file);
-
- g_list_free (selected);
-}
-
-static void
-on_print_event (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
- GList *selected;
- ECalendarViewEvent *event;
- ECalComponent *comp;
-
- selected = e_calendar_view_get_selected_events (cal_view);
- if (!selected)
- return;
-
- event = (ECalendarViewEvent *) selected->data;
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
- print_comp (comp, event->comp_data->client, FALSE);
-
- g_object_unref (comp);
- g_list_free (selected);
-}
-
-static void
-transfer_item_to (ECalendarViewEvent *event, ECal *dest_client, gboolean remove_item)
-{
- const char *uid;
- char *new_uid;
- icalcomponent *orig_icalcomp;
- icalproperty *icalprop;
-
- uid = icalcomponent_get_uid (event->comp_data->icalcomp);
-
- /* put the new object into the destination calendar */
- if (e_cal_get_object (dest_client, uid, NULL, &orig_icalcomp, NULL)) {
- icalcomponent_free (orig_icalcomp);
-
-
- if (!e_cal_modify_object (dest_client, event->comp_data->icalcomp, CALOBJ_MOD_ALL, NULL))
- return;
- } else {
- orig_icalcomp = icalcomponent_new_clone (event->comp_data->icalcomp);
-
- icalprop = icalproperty_new_x ("1");
- icalproperty_set_x_name (icalprop, "X-EVOLUTION-MOVE-CALENDAR");
- icalcomponent_add_property (orig_icalcomp, icalprop);
-
- if (!remove_item) {
- /* change the UID to avoid problems with duplicated UIDs */
- new_uid = e_cal_component_gen_uid ();
- icalcomponent_set_uid (orig_icalcomp, new_uid);
-
- g_free (new_uid);
- }
-
- new_uid = NULL;
- if (!e_cal_create_object (dest_client, orig_icalcomp, &new_uid, NULL)) {
- icalcomponent_free (orig_icalcomp);
- return;
- }
-
- if (new_uid)
- g_free (new_uid);
- icalcomponent_free (orig_icalcomp);
- }
-
- /* remove the item from the source calendar */
- if (remove_item)
- e_cal_remove_object (event->comp_data->client, uid, NULL);
-}
-
-static void
-transfer_selected_items (ECalendarView *cal_view, gboolean remove_item)
-{
- GList *selected, *l;
- ESource *destination_source;
- ECal *dest_client;
-
- selected = e_calendar_view_get_selected_events (cal_view);
- if (!selected)
- return;
-
- /* prompt the user for destination source */
- destination_source = select_source_dialog ((GtkWindow *) gtk_widget_get_toplevel (cal_view), E_CAL_SOURCE_TYPE_EVENT);
- if (!destination_source)
- return;
-
- /* open the destination calendar */
- dest_client = auth_new_cal_from_source (destination_source, E_CAL_SOURCE_TYPE_EVENT);
- if (!dest_client || !e_cal_open (dest_client, FALSE, NULL)) {
- if (dest_client)
- g_object_unref (dest_client);
- g_object_unref (destination_source);
- return;
- }
-
- /* process all selected events */
- if (remove_item)
- e_calendar_view_set_status_message (cal_view, _("Moving items"));
- else
- e_calendar_view_set_status_message (cal_view, _("Copying items"));
-
- for (l = selected; l != NULL; l = l->next)
- transfer_item_to ((ECalendarViewEvent *) l->data, dest_client, remove_item);
-
- e_calendar_view_set_status_message (cal_view, NULL);
-
- /* free memory */
- g_object_unref (destination_source);
- g_object_unref (dest_client);
- g_list_free (selected);
-}
-
-static void
-on_copy_to (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
-
- transfer_selected_items (cal_view, FALSE);
-}
-
-static void
-on_move_to (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
-
- transfer_selected_items (cal_view, TRUE);
-}
-
-static void
-on_meeting (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
- GList *selected;
-
- selected = e_calendar_view_get_selected_events (cal_view);
- if (selected) {
- ECalendarViewEvent *event = (ECalendarViewEvent *) selected->data;
- e_calendar_view_edit_appointment (cal_view, event->comp_data->client, event->comp_data->icalcomp, TRUE);
-
- g_list_free (selected);
- }
-}
-
-static void
-on_forward (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
- GList *selected;
-
- selected = e_calendar_view_get_selected_events (cal_view);
- if (selected) {
- ECalComponent *comp;
- ECalendarViewEvent *event = (ECalendarViewEvent *) selected->data;
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
- itip_send_comp (E_CAL_COMPONENT_METHOD_PUBLISH, comp, event->comp_data->client, NULL, NULL);
-
- g_list_free (selected);
- g_object_unref (comp);
- }
-}
-
-static void
-on_publish (EPopup *ep, EPopupItem *pitem, void *data)
-{
- e_pub_publish (TRUE);
-}
-
-static void
-on_delete_appointment (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
-
- e_calendar_view_delete_selected_event (cal_view);
-}
-
-static void
-on_unrecur_appointment (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
- ECalendarViewEvent *event;
- ECalComponent *comp, *new_comp;
- ECalComponentDateTime date;
- struct icaltimetype itt;
- GList *selected;
- ECal *client;
- char *new_uid;
-
- selected = e_calendar_view_get_selected_events (cal_view);
- if (!selected)
- return;
-
- event = (ECalendarViewEvent *) selected->data;
- client = g_object_ref (event->comp_data->client);
-
- date.value = &itt;
- date.tzid = NULL;
-
- /* For the recurring object, we add an exception to get rid of the
- instance. */
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
- cal_comp_util_add_exdate (comp, event->comp_data->instance_start, e_calendar_view_get_timezone (cal_view));
- e_cal_component_commit_sequence (comp);
-
- /* For the unrecurred instance we duplicate the original object,
- create a new uid for it, get rid of the recurrence rules, and set
- the start & end times to the instances times. */
- new_comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (new_comp, icalcomponent_new_clone (event->comp_data->icalcomp));
- new_uid = e_cal_component_gen_uid ();
- e_cal_component_set_uid (new_comp, new_uid);
- g_free (new_uid);
- e_cal_component_set_rdate_list (new_comp, NULL);
- e_cal_component_set_rrule_list (new_comp, NULL);
- e_cal_component_set_exdate_list (new_comp, NULL);
- e_cal_component_set_exrule_list (new_comp, NULL);
-
- date.value = &itt;
- date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (cal_view));
-
- *date.value = icaltime_from_timet_with_zone (event->comp_data->instance_start, FALSE,
- e_calendar_view_get_timezone (cal_view));
- e_cal_component_set_dtstart (new_comp, &date);
- *date.value = icaltime_from_timet_with_zone (event->comp_data->instance_end, FALSE,
- e_calendar_view_get_timezone (cal_view));
- e_cal_component_set_dtend (new_comp, &date);
- e_cal_component_commit_sequence (new_comp);
-
- /* Now update both ECalComponents. Note that we do this last since at
- * present the updates happen synchronously so our event may disappear.
- */
- if (!e_cal_modify_object (client, e_cal_component_get_icalcomponent (comp), CALOBJ_MOD_THIS, NULL))
- g_message ("on_unrecur_appointment(): Could not update the object!");
-
- g_object_unref (comp);
-
- if (!e_cal_create_object (client, e_cal_component_get_icalcomponent (new_comp), &new_uid, NULL))
- g_message ("on_unrecur_appointment(): Could not update the object!");
- else
- g_free (new_uid);
-
- g_object_unref (new_comp);
- g_object_unref (client);
- g_list_free (selected);
-}
-
-static void
-on_delete_occurrence (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
-
- e_calendar_view_delete_selected_occurrence (cal_view);
-}
-
-static void
-on_cut (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
-
- e_calendar_view_cut_clipboard (cal_view);
-}
-
-static void
-on_copy (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
-
- e_calendar_view_copy_clipboard (cal_view);
-}
-
-static void
-on_paste (EPopup *ep, EPopupItem *pitem, void *data)
-{
- ECalendarView *cal_view = data;
-
- e_calendar_view_paste_clipboard (cal_view);
-}
-
-static EPopupItem ecv_main_items [] = {
- { E_POPUP_ITEM, "00.new", N_("New _Appointment..."), on_new_appointment, NULL, "stock_new-appointment", 0, 0 },
- { E_POPUP_ITEM, "10.newallday", N_("New All Day _Event"), on_new_event, NULL, "stock_new-24h-appointment", 0, 0},
- { E_POPUP_ITEM, "20.meeting", N_("New Meeting"), on_new_meeting, NULL, "stock_new-meeting", 0, 0},
- { E_POPUP_ITEM, "30.task", N_("New Task"), on_new_task, NULL, "stock_task", 0, 0},
-
- { E_POPUP_BAR, "40."},
- { E_POPUP_ITEM, "40.print", N_("_Print..."), on_print, NULL, GTK_STOCK_PRINT, 0, 0 },
-
- { E_POPUP_BAR, "50." },
- { E_POPUP_ITEM, "50.paste", N_("_Paste"), on_paste, NULL, GTK_STOCK_PASTE, 0, E_CAL_POPUP_SELECT_EDITABLE },
-
- { E_POPUP_BAR, "60." },
- /* FIXME: hook in this somehow */
- { E_POPUP_SUBMENU, "60.view", N_("Current View") },
-
- { E_POPUP_ITEM, "61.today", N_("Select _Today"), on_goto_today, NULL, GTK_STOCK_HOME },
- { E_POPUP_ITEM, "62.todate", N_("_Select Date..."), on_goto_date, NULL, GTK_STOCK_JUMP_TO },
-
- { E_POPUP_BAR, "70." },
-
- /* TODO: Why is this in a context menu when it applies globally? */
- { E_POPUP_ITEM, "70.publish", N_("_Publish Free/Busy Information"), on_publish, },
-};
-
-static EPopupItem ecv_child_items [] = {
- { E_POPUP_ITEM, "00.open", N_("_Open"), on_edit_appointment, NULL, GTK_STOCK_OPEN, 0, E_CAL_POPUP_SELECT_NOTEDITING },
- { E_POPUP_ITEM, "10.saveas", N_("_Save As..."), on_save_as, NULL, GTK_STOCK_SAVE_AS, 0, E_CAL_POPUP_SELECT_NOTEDITING },
- { E_POPUP_ITEM, "20.print", N_("_Print..."), on_print_event, NULL, GTK_STOCK_PRINT, 0, E_CAL_POPUP_SELECT_NOTEDITING },
-
- { E_POPUP_BAR, "30." },
-
- { E_POPUP_ITEM, "31.cut", N_("C_ut"), on_cut, NULL, GTK_STOCK_CUT, 0, E_CAL_POPUP_SELECT_NOTEDITING|E_CAL_POPUP_SELECT_EDITABLE|E_CAL_POPUP_SELECT_ORGANIZER },
- { E_POPUP_ITEM, "32.copy", N_("_Copy"), on_copy, NULL, GTK_STOCK_COPY, 0, E_CAL_POPUP_SELECT_NOTEDITING|E_CAL_POPUP_SELECT_ORGANIZER },
- { E_POPUP_ITEM, "33.paste", N_("_Paste"), on_paste, NULL, GTK_STOCK_PASTE, 0, E_CAL_POPUP_SELECT_EDITABLE },
-
- { E_POPUP_BAR, "40." },
-
- { E_POPUP_ITEM, "41.copyto", N_("Cop_y to Calendar..."), on_copy_to, NULL, NULL, 0, E_CAL_POPUP_SELECT_NOTEDITING },
- { E_POPUP_ITEM, "42.moveto", N_("Mo_ve to Calendar..."), on_move_to, NULL, NULL, 0, E_CAL_POPUP_SELECT_NOTEDITING | E_CAL_POPUP_SELECT_EDITABLE },
- { E_POPUP_ITEM, "43.schedule", N_("_Schedule Meeting..."), on_meeting, NULL, NULL, 0, E_CAL_POPUP_SELECT_NOTEDITING | E_CAL_POPUP_SELECT_EDITABLE | E_CAL_POPUP_SELECT_NOTMEETING },
- { E_POPUP_ITEM, "44.forward", N_("_Forward as iCalendar..."), on_forward, NULL, "stock_mail-forward", 0, E_CAL_POPUP_SELECT_NOTEDITING },
-
- { E_POPUP_BAR, "50." },
-
- { E_POPUP_ITEM, "51.delete", N_("_Delete"), on_delete_appointment, NULL, GTK_STOCK_DELETE, E_CAL_POPUP_SELECT_NONRECURRING, E_CAL_POPUP_SELECT_NOTEDITING | E_CAL_POPUP_SELECT_EDITABLE },
- { E_POPUP_ITEM, "52.move", N_("Make this Occurrence _Movable"), on_unrecur_appointment, NULL, NULL, E_CAL_POPUP_SELECT_RECURRING | E_CAL_POPUP_SELECT_INSTANCE, E_CAL_POPUP_SELECT_NOTEDITING | E_CAL_POPUP_SELECT_EDITABLE },
- { E_POPUP_ITEM, "53.delete", N_("Delete this _Occurrence"), on_delete_occurrence, NULL, GTK_STOCK_DELETE, E_CAL_POPUP_SELECT_RECURRING, E_CAL_POPUP_SELECT_NOTEDITING | E_CAL_POPUP_SELECT_EDITABLE },
- { E_POPUP_ITEM, "54.delete", N_("Delete _All Occurrences"), on_delete_appointment, NULL, GTK_STOCK_DELETE, E_CAL_POPUP_SELECT_RECURRING, E_CAL_POPUP_SELECT_NOTEDITING | E_CAL_POPUP_SELECT_EDITABLE },
-};
-
-static void
-ecv_popup_free (EPopup *ep, GSList *list, void *data)
-{
- g_slist_free(list);
-}
-
-GtkMenu *
-e_calendar_view_create_popup_menu (ECalendarView *cal_view)
-{
- ECalPopup *ep;
- GSList *menus = NULL;
- GList *selected, *l;
- int i;
- ECalPopupTargetSelect *t;
- ECalModel *model;
- GPtrArray *events;
-
- g_return_val_if_fail (E_IS_CALENDAR_VIEW (cal_view), NULL);
-
- /* We could do this using a factory on the ECalPopup class,
- * that way we would get called implicitly whenever a popup
- * menu was created rather than everyone having to call us.
- * We could also have a different menu id for each view */
-
- /** @HookPoint-ECalPopup: Calendar Main View Context Menu
- * @Id: org.gnome.evolution.calendar.view.popup
- * @Class: org.gnome.evolution.calendar.popup:1.0
- * @Target: ECalPopupTargetSelect
- *
- * The context menu on the main calendar view. This menu
- * applies to all view types.
- */
- ep = e_cal_popup_new("org.gnome.evolution.calendar.view.popup");
-
- model = e_calendar_view_get_model(cal_view);
- events = g_ptr_array_new();
- selected = e_calendar_view_get_selected_events(cal_view);
- for (l=selected;l;l=g_list_next(l)) {
- ECalendarViewEvent *event = l->data;
-
- if (event)
- g_ptr_array_add(events, e_cal_model_copy_component_data(event->comp_data));
- }
- g_list_free(selected);
-
- t = e_cal_popup_target_new_select(ep, model, events);
- t->target.widget = (GtkWidget *)cal_view;
-
- if (t->events->len == 0) {
- for (i=0;i<sizeof(ecv_main_items)/sizeof(ecv_main_items[0]);i++)
- menus = g_slist_prepend(menus, &ecv_main_items[i]);
-
- gnome_calendar_view_popup_factory(cal_view->priv->calendar, (EPopup *)ep, "60.view");
- } else {
- for (i=0;i<sizeof(ecv_child_items)/sizeof(ecv_child_items[0]);i++)
- menus = g_slist_prepend(menus, &ecv_child_items[i]);
- }
-
- e_popup_add_items((EPopup *)ep, menus, NULL, ecv_popup_free, cal_view);
-
- return e_popup_create_menu_once((EPopup *)ep, (EPopupTarget *)t, 0);
-}
-
-void
-e_calendar_view_open_event (ECalendarView *cal_view)
-{
- GList *selected;
-
- selected = e_calendar_view_get_selected_events (cal_view);
- if (selected) {
- ECalendarViewEvent *event = (ECalendarViewEvent *) selected->data;
-
- if (event)
- e_calendar_view_edit_appointment (cal_view, event->comp_data->client,
- event->comp_data->icalcomp, FALSE);
-
- g_list_free (selected);
- }
-}
-
-/**
- * e_calendar_view_new_appointment_for
- * @cal_view: A calendar view.
- * @dtstart: A Unix time_t that marks the beginning of the appointment.
- * @dtend: A Unix time_t that marks the end of the appointment.
- * @all_day: If TRUE, the dtstart and dtend are expanded to cover
- * the entire day, and the event is set to TRANSPARENT.
- * @meeting: Whether the appointment is a meeting or not.
- *
- * Opens an event editor dialog for a new appointment.
- */
-void
-e_calendar_view_new_appointment_for (ECalendarView *cal_view,
- time_t dtstart, time_t dtend,
- gboolean all_day,
- gboolean meeting)
-{
- ECalendarViewPrivate *priv;
- struct icaltimetype itt;
- ECalComponentDateTime dt;
- ECalComponent *comp;
- icalcomponent *icalcomp;
- ECalComponentTransparency transparency;
-
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- priv = cal_view->priv;
-
- dt.value = &itt;
- if (all_day)
- dt.tzid = NULL;
- else
- dt.tzid = icaltimezone_get_tzid (e_cal_model_get_timezone (cal_view->priv->model));
-
- icalcomp = e_cal_model_create_component_with_defaults (priv->model);
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomp);
-
- /* DTSTART, DTEND */
- itt = icaltime_from_timet_with_zone (dtstart, FALSE, e_cal_model_get_timezone (cal_view->priv->model));
- if (all_day) {
- itt.hour = itt.minute = itt.second = 0;
- itt.is_date = TRUE;
- }
- e_cal_component_set_dtstart (comp, &dt);
-
- itt = icaltime_from_timet_with_zone (dtend, FALSE, e_cal_model_get_timezone (cal_view->priv->model));
- if (all_day) {
- /* We round it up to the end of the day, unless it is
- already set to midnight */
- if (itt.hour != 0 || itt.minute != 0 || itt.second != 0) {
- icaltime_adjust (&itt, 1, 0, 0, 0);
- }
- itt.hour = itt.minute = itt.second = 0;
- itt.is_date = TRUE;
- }
- e_cal_component_set_dtend (comp, &dt);
-
- /* TRANSPARENCY */
- transparency = all_day ? E_CAL_COMPONENT_TRANSP_TRANSPARENT
- : E_CAL_COMPONENT_TRANSP_OPAQUE;
- e_cal_component_set_transparency (comp, transparency);
-
- /* CATEGORY */
- e_cal_component_set_categories (comp, priv->default_category);
-
- /* edit the object */
- e_cal_component_commit_sequence (comp);
-
- e_calendar_view_edit_appointment (cal_view,
- e_cal_model_get_default_client (priv->model),
- icalcomp, meeting);
-
- g_object_unref (comp);
-}
-
-/**
- * e_calendar_view_new_appointment
- * @cal_view: A calendar view.
- *
- * Opens an event editor dialog for a new appointment. The appointment's
- * start and end times are set to the currently selected time range in
- * the calendar view.
- */
-void
-e_calendar_view_new_appointment_full (ECalendarView *cal_view, gboolean all_day, gboolean meeting)
-{
- time_t dtstart, dtend;
-
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- if (!e_calendar_view_get_selected_time_range (cal_view, &dtstart, &dtend)) {
- dtstart = time (NULL);
- dtend = dtstart + 3600;
- }
- /* FIXME This is a rough hack to make sure "all day" is set for */
- if ((dtend - dtstart) % (60 * 60 * 24) == 0)
- all_day = TRUE;
-
- e_calendar_view_new_appointment_for (cal_view, dtstart, dtend, all_day, meeting);
-}
-
-void
-e_calendar_view_new_appointment (ECalendarView *cal_view)
-{
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
-
- e_calendar_view_new_appointment_full (cal_view, FALSE, FALSE);
-}
-
-/**
- * e_calendar_view_edit_appointment
- * @cal_view: A calendar view.
- * @client: Calendar client.
- * @icalcomp: The object to be edited.
- * @meeting: Whether the appointment is a meeting or not.
- *
- * Opens an editor window to allow the user to edit the selected
- * object.
- */
-void
-e_calendar_view_edit_appointment (ECalendarView *cal_view,
- ECal *client,
- icalcomponent *icalcomp,
- gboolean meeting)
-{
- ECalendarViewPrivate *priv;
- CompEditor *ce;
- const char *uid;
- ECalComponent *comp;
-
- g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
- g_return_if_fail (E_IS_CAL (client));
- g_return_if_fail (icalcomp != NULL);
-
- priv = cal_view->priv;
-
- uid = icalcomponent_get_uid (icalcomp);
-
- ce = e_comp_editor_registry_find (comp_editor_registry, uid);
- if (!ce) {
- EventEditor *ee;
-
- ee = event_editor_new (client, meeting);
- ce = COMP_EDITOR (ee);
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (icalcomp));
- comp_editor_edit_comp (ce, comp);
- if (meeting)
- event_editor_show_meeting (ee);
-
- e_comp_editor_registry_add (comp_editor_registry, ce, FALSE);
-
- g_object_unref (comp);
- }
-
- comp_editor_focus (ce);
-}
-
-void
-e_calendar_view_modify_and_send (ECalComponent *comp,
- ECal *client,
- CalObjModType mod,
- GtkWindow *toplevel,
- gboolean new)
-{
- if (e_cal_modify_object (client, e_cal_component_get_icalcomponent (comp), mod, NULL)) {
- if (itip_organizer_is_user (comp, client) &&
- send_component_dialog (toplevel, client, comp, new))
- itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, client, NULL, NULL);
- } else {
- g_message (G_STRLOC ": Could not update the object!");
- }
-}
diff --git a/calendar/gui/e-calendar-view.h b/calendar/gui/e-calendar-view.h
deleted file mode 100644
index 8335352976..0000000000
--- a/calendar/gui/e-calendar-view.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-#ifndef _E_CALENDAR_VIEW_H_
-#define _E_CALENDAR_VIEW_H_
-
-#include <libecal/e-cal.h>
-#include <gtk/gtktable.h>
-#include <gtk/gtkwindow.h>
-#include "e-cal-model.h"
-#include "gnome-cal.h"
-
-G_BEGIN_DECLS
-
-/*
- * EView - base widget class for the calendar views.
- */
-
-#define E_TYPE_CALENDAR_VIEW (e_calendar_view_get_type ())
-#define E_CALENDAR_VIEW(obj) GTK_CHECK_CAST (obj, e_calendar_view_get_type (), ECalendarView)
-#define E_CALENDAR_VIEW_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_calendar_view_get_type (), ECalendarViewClass)
-#define E_IS_CALENDAR_VIEW(obj) GTK_CHECK_TYPE (obj, e_calendar_view_get_type ())
-
-typedef enum {
- E_CALENDAR_VIEW_POS_OUTSIDE,
- E_CALENDAR_VIEW_POS_NONE,
- E_CALENDAR_VIEW_POS_EVENT,
- E_CALENDAR_VIEW_POS_LEFT_EDGE,
- E_CALENDAR_VIEW_POS_RIGHT_EDGE,
- E_CALENDAR_VIEW_POS_TOP_EDGE,
- E_CALENDAR_VIEW_POS_BOTTOM_EDGE
-} ECalendarViewPosition;
-
-typedef enum {
- E_CAL_VIEW_MOVE_UP,
- E_CAL_VIEW_MOVE_DOWN,
- E_CAL_VIEW_MOVE_LEFT,
- E_CAL_VIEW_MOVE_RIGHT
-} ECalViewMoveDirection;
-
-#define E_CALENDAR_VIEW_EVENT_FIELDS \
- GnomeCanvasItem *canvas_item; \
- ECalModelComponent *comp_data; \
- time_t start; \
- time_t end; \
- guint16 start_minute; \
- guint16 end_minute; \
- guint different_timezone : 1;
-
-typedef struct {
- E_CALENDAR_VIEW_EVENT_FIELDS
-} ECalendarViewEvent;
-
-typedef struct _ECalendarView ECalendarView;
-typedef struct _ECalendarViewClass ECalendarViewClass;
-typedef struct _ECalendarViewPrivate ECalendarViewPrivate;
-
-struct _ECalendarView {
- GtkTable table;
- ECalendarViewPrivate *priv;
-};
-
-struct _ECalendarViewClass {
- GtkTableClass parent_class;
-
- /* Notification signals */
- void (* selection_changed) (ECalendarView *cal_view);
- void (* selected_time_changed) (ECalendarView *cal_view);
- void (* timezone_changed) (ECalendarView *cal_view, icaltimezone *old_zone, icaltimezone *new_zone);
- void (* event_changed) (ECalendarView *day_view, ECalendarViewEvent *event);
- void (* event_added) (ECalendarView *day_view, ECalendarViewEvent *event);
- void (* user_created) (ECalendarView *cal_view);
-
- /* Virtual methods */
- GList * (* get_selected_events) (ECalendarView *cal_view); /* a GList of ECalendarViewEvent's */
- gboolean (* get_selected_time_range) (ECalendarView *cal_view, time_t *start_time, time_t *end_time);
- void (* set_selected_time_range) (ECalendarView *cal_view, time_t start_time, time_t end_time);
- gboolean (* get_visible_time_range) (ECalendarView *cal_view, time_t *start_time, time_t *end_time);
- void (* update_query) (ECalendarView *cal_view);
- void (* open_event) (ECalendarView *cal_view);
-};
-
-GType e_calendar_view_get_type (void);
-
-GnomeCalendar *e_calendar_view_get_calendar (ECalendarView *cal_view);
-void e_calendar_view_set_calendar (ECalendarView *cal_view, GnomeCalendar *calendar);
-ECalModel *e_calendar_view_get_model (ECalendarView *cal_view);
-void e_calendar_view_set_model (ECalendarView *cal_view, ECalModel *model);
-icaltimezone *e_calendar_view_get_timezone (ECalendarView *cal_view);
-void e_calendar_view_set_timezone (ECalendarView *cal_view, icaltimezone *zone);
-const char *e_calendar_view_get_default_category (ECalendarView *cal_view);
-void e_calendar_view_set_default_category (ECalendarView *cal_view, const char *category);
-gboolean e_calendar_view_get_use_24_hour_format (ECalendarView *view);
-void e_calendar_view_set_use_24_hour_format (ECalendarView *view, gboolean use_24_hour);
-
-void e_calendar_view_set_activity_handler (ECalendarView *cal_view, EActivityHandler *activity_handler);
-void e_calendar_view_set_status_message (ECalendarView *cal_view, const gchar *message);
-
-GList *e_calendar_view_get_selected_events (ECalendarView *cal_view);
-gboolean e_calendar_view_get_selected_time_range (ECalendarView *cal_view, time_t *start_time, time_t *end_time);
-void e_calendar_view_set_selected_time_range (ECalendarView *cal_view, time_t start_time, time_t end_time);
-gboolean e_calendar_view_get_visible_time_range (ECalendarView *cal_view, time_t *start_time, time_t *end_time);
-void e_calendar_view_update_query (ECalendarView *cal_view);
-
-void e_calendar_view_cut_clipboard (ECalendarView *cal_view);
-void e_calendar_view_copy_clipboard (ECalendarView *cal_view);
-void e_calendar_view_paste_clipboard (ECalendarView *cal_view);
-void e_calendar_view_delete_selected_event (ECalendarView *cal_view);
-void e_calendar_view_delete_selected_events (ECalendarView *cal_view);
-void e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view);
-
-GtkMenu *e_calendar_view_create_popup_menu (ECalendarView *cal_view);
-
-void e_calendar_view_add_event (ECalendarView *cal_view, ECal *client, time_t dtstart,
- icaltimezone *default_zone, icalcomponent *icalcomp, gboolean in_top_canvas);
-void e_calendar_view_new_appointment_for (ECalendarView *cal_view,
- time_t dtstart,
- time_t dtend,
- gboolean all_day,
- gboolean meeting);
-void e_calendar_view_new_appointment_full (ECalendarView *cal_view,
- gboolean all_day,
- gboolean meeting);
-void e_calendar_view_new_appointment (ECalendarView *cal_view);
-void e_calendar_view_edit_appointment (ECalendarView *cal_view,
- ECal *client,
- icalcomponent *icalcomp,
- gboolean meeting);
-void e_calendar_view_open_event (ECalendarView *cal_view);
-void e_calendar_view_modify_and_send (ECalComponent *comp,
- ECal *client,
- CalObjModType mod,
- GtkWindow *toplevel,
- gboolean new);
-
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/e-cell-date-edit-config.c b/calendar/gui/e-cell-date-edit-config.c
deleted file mode 100644
index 0af909eb76..0000000000
--- a/calendar/gui/e-cell-date-edit-config.c
+++ /dev/null
@@ -1,328 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Author :
- * JP Rosevear <jpr@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#include "calendar-config.h"
-#include "e-mini-calendar-config.h"
-#include "e-cell-date-edit-config.h"
-
-struct _ECellDateEditConfigPrivate {
- ECellDateEdit *cell;
-
- EMiniCalendarConfig *mini_config;
-
- GList *notifications;
-};
-
-/* Property IDs */
-enum props {
- PROP_0,
- PROP_CELL,
-};
-
-G_DEFINE_TYPE (ECellDateEditConfig, e_cell_date_edit_config, G_TYPE_OBJECT);
-
-static void
-e_cell_date_edit_config_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
-{
- ECellDateEditConfig *view_config;
- ECellDateEditConfigPrivate *priv;
-
- view_config = E_CELL_DATE_EDIT_CONFIG (object);
- priv = view_config->priv;
-
- switch (property_id) {
- case PROP_CELL:
- e_cell_date_edit_config_set_cell (view_config, g_value_get_object (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-e_cell_date_edit_config_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
-{
- ECellDateEditConfig *view_config;
- ECellDateEditConfigPrivate *priv;
-
- view_config = E_CELL_DATE_EDIT_CONFIG (object);
- priv = view_config->priv;
-
- switch (property_id) {
- case PROP_CELL:
- g_value_set_object (value, e_cell_date_edit_config_get_cell (view_config));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-e_cell_date_edit_config_dispose (GObject *object)
-{
- ECellDateEditConfig *view_config = E_CELL_DATE_EDIT_CONFIG (object);
- ECellDateEditConfigPrivate *priv;
-
- priv = view_config->priv;
-
- e_cell_date_edit_config_set_cell (view_config, NULL);
-
- if (G_OBJECT_CLASS (e_cell_date_edit_config_parent_class)->dispose)
- G_OBJECT_CLASS (e_cell_date_edit_config_parent_class)->dispose (object);
-}
-
-static void
-e_cell_date_edit_config_finalize (GObject *object)
-{
- ECellDateEditConfig *view_config = E_CELL_DATE_EDIT_CONFIG (object);
- ECellDateEditConfigPrivate *priv;
-
- priv = view_config->priv;
-
- g_free (priv);
-
- if (G_OBJECT_CLASS (e_cell_date_edit_config_parent_class)->finalize)
- G_OBJECT_CLASS (e_cell_date_edit_config_parent_class)->finalize (object);
-}
-
-static void
-e_cell_date_edit_config_class_init (ECellDateEditConfigClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GParamSpec *spec;
-
- /* Method override */
- gobject_class->set_property = e_cell_date_edit_config_set_property;
- gobject_class->get_property = e_cell_date_edit_config_get_property;
- gobject_class->dispose = e_cell_date_edit_config_dispose;
- gobject_class->finalize = e_cell_date_edit_config_finalize;
-
- spec = g_param_spec_object ("cell", NULL, NULL, e_cell_date_edit_get_type (),
- G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT);
- g_object_class_install_property (gobject_class, PROP_CELL, spec);
-}
-
-static void
-e_cell_date_edit_config_init (ECellDateEditConfig *view_config)
-{
- view_config->priv = g_new0 (ECellDateEditConfigPrivate, 1);
-
-}
-
-ECellDateEditConfig *
-e_cell_date_edit_config_new (ECellDateEdit *cell)
-{
- ECellDateEditConfig *view_config;
-
- view_config = g_object_new (e_cell_date_edit_config_get_type (), "cell", cell, NULL);
-
- return view_config;
-}
-
-ECellDateEdit *
-e_cell_date_edit_config_get_cell (ECellDateEditConfig *view_config)
-{
- ECellDateEditConfigPrivate *priv;
-
- g_return_val_if_fail (view_config != NULL, NULL);
- g_return_val_if_fail (E_IS_CELL_DATE_EDIT_CONFIG (view_config), NULL);
-
- priv = view_config->priv;
-
- return priv->cell;
-}
-
-static void
-set_timezone (ECellDateEdit *cell)
-{
- ECellDateEditText *cell_text;
- ECellPopup *cell_popup;
- icaltimezone *zone;
-
- zone = calendar_config_get_icaltimezone ();
-
- cell_popup = E_CELL_POPUP (cell);
- cell_text = E_CELL_DATE_EDIT_TEXT (cell_popup->child);
- e_cell_date_edit_text_set_timezone (cell_text, zone);
-}
-
-static void
-timezone_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- ECellDateEditConfig *view_config = data;
- ECellDateEditConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_timezone (priv->cell);
-}
-
-static void
-set_twentyfour_hour (ECellDateEdit *cell)
-{
- ECellDateEditText *cell_text;
- ECellPopup *cell_popup;
- gboolean use_24_hour;
-
- use_24_hour = calendar_config_get_24_hour_format ();
-
- e_cell_date_edit_freeze (cell);
- g_object_set (G_OBJECT (cell),
- "use_24_hour_format", use_24_hour,
- NULL);
- e_cell_date_edit_thaw (cell);
-
- cell_popup = E_CELL_POPUP (cell);
- cell_text = E_CELL_DATE_EDIT_TEXT (cell_popup->child);
- e_cell_date_edit_text_set_use_24_hour_format (cell_text, use_24_hour);
-}
-
-static void
-twentyfour_hour_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- ECellDateEditConfig *view_config = data;
- ECellDateEditConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_twentyfour_hour (priv->cell);
-}
-
-static void
-set_range (ECellDateEdit *cell)
-{
- int start_hour, end_hour;
-
- start_hour = calendar_config_get_day_start_hour ();
- end_hour = calendar_config_get_day_end_hour ();
-
- /* Round up the end hour. */
- if (calendar_config_get_day_end_minute () != 0)
- end_hour++;
-
- /* Make sure the start hour is ok */
- if (start_hour > end_hour)
- start_hour = end_hour;
-
- /* We use the default 0 - 24 now. */
-#if 0
- g_object_set (G_OBJECT (cell),
- "lower_hour", start_hour,
- "upper_hour", end_hour,
- NULL);
-#endif
-}
-
-static void
-day_start_hour_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- ECellDateEditConfig *view_config = data;
- ECellDateEditConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_range (priv->cell);
-}
-
-static void
-day_end_hour_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- ECellDateEditConfig *view_config = data;
- ECellDateEditConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_range (priv->cell);
-}
-
-static void
-day_end_minute_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- ECellDateEditConfig *view_config = data;
- ECellDateEditConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_range (priv->cell);
-}
-
-void
-e_cell_date_edit_config_set_cell (ECellDateEditConfig *view_config, ECellDateEdit *cell)
-{
- ECellDateEditConfigPrivate *priv;
- guint not;
- GList *l;
-
- g_return_if_fail (view_config != NULL);
- g_return_if_fail (E_IS_CELL_DATE_EDIT_CONFIG (view_config));
-
- priv = view_config->priv;
-
- if (priv->cell) {
- g_object_unref (priv->cell);
- priv->cell = NULL;
- }
-
- if (priv->mini_config) {
- g_object_unref (priv->mini_config);
- priv->mini_config = NULL;
- }
-
- for (l = priv->notifications; l; l = l->next)
- calendar_config_remove_notification (GPOINTER_TO_UINT (l->data));
-
- g_list_free (priv->notifications);
- priv->notifications = NULL;
-
- /* If the new view is NULL, return right now */
- if (!cell)
- return;
-
- priv->cell = g_object_ref (cell);
-
- /* Time zone */
- set_timezone (cell);
-
- not = calendar_config_add_notification_timezone (timezone_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* 24 Hour format */
- set_twentyfour_hour (cell);
-
- not = calendar_config_add_notification_24_hour_format (twentyfour_hour_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Popup time range */
- set_range (cell);
-
- not = calendar_config_add_notification_day_start_hour (day_start_hour_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
- not = calendar_config_add_notification_day_end_hour (day_end_hour_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
- not = calendar_config_add_notification_day_end_minute (day_end_minute_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* The mini calendar */
- priv->mini_config = e_mini_calendar_config_new (E_CALENDAR (cell->calendar));
-}
diff --git a/calendar/gui/e-cell-date-edit-config.h b/calendar/gui/e-cell-date-edit-config.h
deleted file mode 100644
index 889e6440e3..0000000000
--- a/calendar/gui/e-cell-date-edit-config.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Author :
- * JP Rosevear <jpr@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#ifndef _E_CELL_DATE_EDIT_CONFIG_H_
-#define _E_CELL_DATE_EDIT_CONFIG_H_
-
-#include <widgets/misc/e-cell-date-edit.h>
-#include "e-cell-date-edit-text.h"
-
-G_BEGIN_DECLS
-
-#define E_CELL_DATE_EDIT_CONFIG(obj) GTK_CHECK_CAST (obj, e_cell_date_edit_config_get_type (), ECellDateEditConfig)
-#define E_CELL_DATE_EDIT_CONFIG_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_cell_date_edit_config_get_type (), ECellDateEditConfigClass)
-#define E_IS_CELL_DATE_EDIT_CONFIG(obj) GTK_CHECK_TYPE (obj, e_cell_date_edit_config_get_type ())
-
-typedef struct _ECellDateEditConfig ECellDateEditConfig;
-typedef struct _ECellDateEditConfigClass ECellDateEditConfigClass;
-typedef struct _ECellDateEditConfigPrivate ECellDateEditConfigPrivate;
-
-struct _ECellDateEditConfig {
- GObject parent;
-
- ECellDateEditConfigPrivate *priv;
-};
-
-struct _ECellDateEditConfigClass {
- GObjectClass parent_class;
-};
-
-GType e_cell_date_edit_config_get_type (void);
-ECellDateEditConfig *e_cell_date_edit_config_new (ECellDateEdit *cell);
-ECellDateEdit *e_cell_date_edit_config_get_cell (ECellDateEditConfig *cell_config);
-void e_cell_date_edit_config_set_cell (ECellDateEditConfig *view_config, ECellDateEdit *cell);
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/e-cell-date-edit-text.c b/calendar/gui/e-cell-date-edit-text.c
deleted file mode 100644
index 635aaf0032..0000000000
--- a/calendar/gui/e-cell-date-edit-text.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 2001, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * ECellDateEditText - a subclass of ECellText used to show and edit the text
- * representation of the date, from a ECalComponentDateTime* model value.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <sys/time.h>
-#include <time.h>
-#include <unistd.h>
-#include <string.h>
-#include <libgnomeui/gnome-messagebox.h>
-#include <libgnomeui/gnome-stock-icons.h>
-#include <libgnome/gnome-i18n.h>
-#include <gal/util/e-util.h>
-#include <e-util/e-time-utils.h>
-#include <libecal/e-cal-time-util.h>
-
-#include "e-cell-date-edit-text.h"
-
-G_DEFINE_TYPE (ECellDateEditText, e_cell_date_edit_text, E_CELL_TEXT_TYPE);
-
-void
-e_cell_date_edit_text_set_timezone (ECellDateEditText *ecd,
- icaltimezone *zone)
-{
- g_return_if_fail (E_IS_CELL_DATE_EDIT_TEXT (ecd));
-
- ecd->zone = zone;
-}
-
-
-void
-e_cell_date_edit_text_set_use_24_hour_format (ECellDateEditText *ecd,
- gboolean use_24_hour)
-{
- g_return_if_fail (E_IS_CELL_DATE_EDIT_TEXT (ecd));
-
- ecd->use_24_hour_format = use_24_hour;
-}
-
-
-static char *
-ecd_get_text (ECellText *cell, ETableModel *model, int col, int row)
-{
- ECellDateEditText *ecd = E_CELL_DATE_EDIT_TEXT (cell);
- ECellDateEditValue *dv = e_table_model_value_at (model, col, row);
- struct tm tmp_tm;
- char buffer[64];
-
- if (!dv)
- return g_strdup ("");
-
- /* Note that although the property may be in a different
- timezone, we convert it to the current timezone to display
- it in the table. If the user actually edits the value,
- it will be set to the current timezone. See set_value(). */
- tmp_tm = icaltimetype_to_tm_with_zone (&dv->tt, dv->zone, ecd->zone);
-
- e_time_format_date_and_time (&tmp_tm, ecd->use_24_hour_format,
- !dv->tt.is_date, FALSE,
- buffer, sizeof (buffer));
- return g_strdup (buffer);
-}
-
-
-static void
-ecd_free_text (ECellText *cell, char *text)
-{
- g_free (text);
-}
-
-
-/* FIXME: We need to set the "transient_for" property for the dialog. */
-static void
-show_date_warning (ECellDateEditText *ecd)
-{
- GtkWidget *dialog;
- char buffer[64], message[256], *format;
- time_t t;
- struct tm *tmp_tm;
-
- t = time (NULL);
- /* We are only using this as an example, so the timezone doesn't
- matter. */
- tmp_tm = localtime (&t);
-
- if (ecd->use_24_hour_format)
- /* strftime format of a weekday, a date and a time, 24-hour. */
- format = _("%a %m/%d/%Y %H:%M:%S");
- else
- /* strftime format of a weekday, a date and a time, 12-hour. */
- format = _("%a %m/%d/%Y %I:%M:%S %p");
-
- e_utf8_strftime (buffer, sizeof (buffer), format, tmp_tm);
-
- g_snprintf (message, 256,
- _("The date must be entered in the format: \n\n%s"),
- buffer);
-
- dialog = gnome_message_box_new (message,
- GNOME_MESSAGE_BOX_ERROR,
- GNOME_STOCK_BUTTON_OK, NULL);
- gtk_widget_show (dialog);
-}
-
-
-static void
-ecd_set_value (ECellText *cell, ETableModel *model, int col, int row,
- const char *text)
-{
- ECellDateEditText *ecd = E_CELL_DATE_EDIT_TEXT (cell);
- ETimeParseStatus status;
- struct tm tmp_tm;
- ECellDateEditValue *value;
- gboolean is_date = TRUE;
-
- /* Try to parse just a date first. If the value is only a date, we
- use a DATE value. */
- status = e_time_parse_date (text, &tmp_tm);
- if (status == E_TIME_PARSE_INVALID) {
- is_date = FALSE;
- status = e_time_parse_date_and_time (text, &tmp_tm);
-
- if (status == E_TIME_PARSE_INVALID) {
- show_date_warning (ecd);
- return;
- }
- }
-
- if (status == E_TIME_PARSE_NONE) {
- value = NULL;
- } else {
- ECellDateEditValue dv;
-
- dv.tt = icaltime_null_time ();
-
- dv.tt.year = tmp_tm.tm_year + 1900;
- dv.tt.month = tmp_tm.tm_mon + 1;
- dv.tt.day = tmp_tm.tm_mday;
- dv.tt.hour = tmp_tm.tm_hour;
- dv.tt.minute = tmp_tm.tm_min;
- dv.tt.second = tmp_tm.tm_sec;
- dv.tt.is_date = is_date;
-
- /* FIXME: We assume it is being set to the current timezone.
- Is that OK? */
- if (is_date) {
- dv.zone = NULL;
- } else {
- dv.zone = ecd->zone;
- }
-
- value = &dv;
- }
-
- e_table_model_set_value_at (model, col, row, value);
-}
-
-
-static void
-e_cell_date_edit_text_class_init (ECellDateEditTextClass *ecdet)
-{
- ECellTextClass *ectc = E_CELL_TEXT_CLASS (ecdet);
-
- ectc->get_text = ecd_get_text;
- ectc->free_text = ecd_free_text;
- ectc->set_value = ecd_set_value;
-}
-
-
-static void
-e_cell_date_edit_text_init (ECellDateEditText *ecd)
-{
- ecd->zone = icaltimezone_get_utc_timezone ();
- ecd->use_24_hour_format = TRUE;
-}
-
-
-/**
- * e_cell_date_edit_text_new:
- *
- * Creates a new ECell renderer that can be used to render and edit dates that
- * that come from the model. The value returned from the model is
- * interpreted as being a ECalComponentDateTime*.
- *
- * Returns: an ECell object that can be used to render dates.
- */
-ECell *
-e_cell_date_edit_text_new (const char *fontname,
- GtkJustification justify)
-{
- ECellDateEditText *ecd = g_object_new (e_cell_date_edit_text_get_type (), NULL);
-
- e_cell_text_construct (E_CELL_TEXT (ecd), fontname, justify);
-
- return (ECell *) ecd;
-}
-
diff --git a/calendar/gui/e-cell-date-edit-text.h b/calendar/gui/e-cell-date-edit-text.h
deleted file mode 100644
index ab00c0b39c..0000000000
--- a/calendar/gui/e-cell-date-edit-text.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 2001, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * ECellDateEditText - a subclass of ECellText used to show and edit the text
- * representation of the date, from a ECalComponentDateTime* model value.
- */
-
-#ifndef _E_CELL_DATE_EDIT_TEXT_H_
-#define _E_CELL_DATE_EDIT_TEXT_H_
-
-#include <libical/ical.h>
-#include <gal/e-table/e-cell-text.h>
-
-G_BEGIN_DECLS
-
-#define E_CELL_DATE_EDIT_TEXT_TYPE (e_cell_date_edit_text_get_type ())
-#define E_CELL_DATE_EDIT_TEXT(o) (GTK_CHECK_CAST ((o), E_CELL_DATE_EDIT_TEXT_TYPE, ECellDateEditText))
-#define E_CELL_DATE_EDIT_TEXT_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_CELL_DATE_EDIT_TEXT_TYPE, ECellDateEditTextClass))
-#define E_IS_CELL_DATE_EDIT_TEXT(o) (GTK_CHECK_TYPE ((o), E_CELL_DATE_EDIT_TEXT_TYPE))
-#define E_IS_CELL_DATE_EDIT_TEXT_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CELL_DATE_EDIT_TEXT_TYPE))
-
-typedef struct _ECellDateEditValue ECellDateEditValue;
-struct _ECellDateEditValue {
- struct icaltimetype tt;
- icaltimezone *zone;
-};
-
-typedef struct {
- ECellText base;
-
- /* The timezone to display the date in. */
- icaltimezone *zone;
-
- /* Whether to display in 24-hour format. */
- gboolean use_24_hour_format;
-} ECellDateEditText;
-
-typedef struct {
- ECellTextClass parent_class;
-} ECellDateEditTextClass;
-
-GtkType e_cell_date_edit_text_get_type (void);
-ECell *e_cell_date_edit_text_new (const char *fontname,
- GtkJustification justify);
-
-
-void e_cell_date_edit_text_set_timezone (ECellDateEditText *ecd,
- icaltimezone *zone);
-void e_cell_date_edit_text_set_use_24_hour_format (ECellDateEditText *ecd,
- gboolean use_24_hour);
-G_END_DECLS
-
-#endif /* _E_CELL_DATE_EDIT_TEXT_H_ */
diff --git a/calendar/gui/e-comp-editor-registry.c b/calendar/gui/e-comp-editor-registry.c
deleted file mode 100644
index 1f679097bd..0000000000
--- a/calendar/gui/e-comp-editor-registry.c
+++ /dev/null
@@ -1,214 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-comp-editor-registry.c
- *
- * Copyright (C) 2002 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: JP Rosevear
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-#include "e-comp-editor-registry.h"
-
-struct _ECompEditorRegistryPrivate {
- GHashTable *editors;
-};
-
-struct _ECompEditorRegistryData
-{
- ECompEditorRegistry *registry;
- CompEditor *editor;
- char *uid;
-};
-
-typedef struct _ECompEditorRegistryData ECompEditorRegistryData;
-typedef struct _ECompEditorRegistryForeachData ECompEditorRegistryForeachData;
-
-static void editor_destroy_cb (gpointer data, GObject *where_object_was);
-
-G_DEFINE_TYPE (ECompEditorRegistry, e_comp_editor_registry, G_TYPE_OBJECT);
-
-static void
-registry_data_free (gpointer data)
-{
- ECompEditorRegistryData *rdata = data;
-
- if (rdata->editor)
- g_object_weak_unref (G_OBJECT (rdata->editor), editor_destroy_cb, rdata);
- g_free (rdata->uid);
- g_free (rdata);
-}
-
-static void
-e_comp_editor_registry_dispose (GObject *obj)
-{
- ECompEditorRegistry *reg;
- ECompEditorRegistryPrivate *priv;
-
- reg = E_COMP_EDITOR_REGISTRY (obj);
- priv = reg->priv;
-
- if (priv->editors) {
- g_hash_table_destroy (priv->editors);
- priv->editors = NULL;
- }
-
- (* G_OBJECT_CLASS (e_comp_editor_registry_parent_class)->dispose) (obj);
-}
-
-static void
-e_comp_editor_registry_finalize (GObject *obj)
-{
- ECompEditorRegistry *reg;
- ECompEditorRegistryPrivate *priv;
-
- reg = E_COMP_EDITOR_REGISTRY (obj);
- priv = reg->priv;
-
- g_free (priv);
-
- (* G_OBJECT_CLASS (e_comp_editor_registry_parent_class)->finalize) (obj);
-}
-
-static void
-e_comp_editor_registry_class_init (ECompEditorRegistryClass *klass)
-{
- GObjectClass *object_class;
-
- object_class = G_OBJECT_CLASS (klass);
-
- object_class->dispose = e_comp_editor_registry_dispose;
- object_class->finalize = e_comp_editor_registry_finalize;
-}
-
-static void
-e_comp_editor_registry_init (ECompEditorRegistry *reg)
-{
- ECompEditorRegistryPrivate *priv;
-
- priv = g_new0 (ECompEditorRegistryPrivate, 1);
-
- reg->priv = priv;
- priv->editors = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, registry_data_free);
-}
-
-GObject *
-e_comp_editor_registry_new (void)
-{
- return g_object_new (E_TYPE_COMP_EDITOR_REGISTRY, NULL);
-}
-
-void
-e_comp_editor_registry_add (ECompEditorRegistry *reg, CompEditor *editor, gboolean remote)
-{
- ECompEditorRegistryPrivate *priv;
- ECompEditorRegistryData *rdata;
- ECalComponent *comp;
- const char *uid;
-
- g_return_if_fail (reg != NULL);
- g_return_if_fail (E_IS_COMP_EDITOR_REGISTRY (reg));
- g_return_if_fail (editor != NULL);
- g_return_if_fail (IS_COMP_EDITOR (editor));
-
- priv = reg->priv;
-
- comp = comp_editor_get_comp (editor);
- e_cal_component_get_uid (comp, &uid);
-
- rdata = g_new0 (ECompEditorRegistryData, 1);
-
- rdata->registry = reg;
- rdata->editor = editor;
- rdata->uid = g_strdup (uid);
-
- g_hash_table_insert (priv->editors, g_strdup (uid), rdata);
-
- /* FIXME Need to know when uid on the editor changes (if the component changes locations) */
- g_object_weak_ref (G_OBJECT (editor), editor_destroy_cb, rdata);
-}
-
-CompEditor *
-e_comp_editor_registry_find (ECompEditorRegistry *reg, const char *uid)
-{
- ECompEditorRegistryPrivate *priv;
- ECompEditorRegistryData *rdata;
-
- g_return_val_if_fail (reg != NULL, NULL);
- g_return_val_if_fail (E_IS_COMP_EDITOR_REGISTRY (reg), NULL);
- g_return_val_if_fail (uid != NULL, NULL);
-
- priv = reg->priv;
-
- rdata = g_hash_table_lookup (priv->editors, uid);
- if (rdata != NULL)
- return rdata->editor;
-
- return NULL;
-}
-
-static gboolean
-foreach_close_cb (gpointer key, gpointer value, gpointer data)
-{
- ECompEditorRegistryData *rdata;
-
- rdata = value;
-
- g_signal_handlers_block_matched (rdata->editor, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, data);
-
- comp_editor_focus (rdata->editor);
- if (!comp_editor_close (rdata->editor)) {
- g_signal_handlers_unblock_matched (rdata->editor, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, data);
- return FALSE;
- }
-
- g_free (rdata->uid);
- g_free (rdata);
-
- return TRUE;
-}
-
-gboolean
-e_comp_editor_registry_close_all (ECompEditorRegistry *reg)
-{
- ECompEditorRegistryPrivate *priv;
-
- g_return_val_if_fail (reg != NULL, FALSE);
- g_return_val_if_fail (E_IS_COMP_EDITOR_REGISTRY (reg), FALSE);
-
- priv = reg->priv;
-
- g_hash_table_foreach_remove (priv->editors, foreach_close_cb, reg);
- if (g_hash_table_size (priv->editors) != 0)
- return FALSE;
-
- return TRUE;
-}
-
-static void
-editor_destroy_cb (gpointer data, GObject *where_object_was)
-{
- ECompEditorRegistryData *rdata = data;
-
- /* We null it out because its dead, so we won't try to weak
- * unref it in the hash destroyer */
- rdata->editor = NULL;
- g_hash_table_remove (rdata->registry->priv->editors, rdata->uid);
-}
diff --git a/calendar/gui/e-comp-editor-registry.h b/calendar/gui/e-comp-editor-registry.h
deleted file mode 100644
index 6ddf2f34e5..0000000000
--- a/calendar/gui/e-comp-editor-registry.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-comp-editor-registry.h
- *
- * Copyright (C) 2002 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: JP Rosevear
- */
-
-#ifndef _E_COMP_EDITOR_REGISTRY_H_
-#define _E_COMP_EDITOR_REGISTRY_H_
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib-object.h>
-#include <dialogs/comp-editor.h>
-
-G_BEGIN_DECLS
-
-#define E_TYPE_COMP_EDITOR_REGISTRY (e_comp_editor_registry_get_type ())
-#define E_COMP_EDITOR_REGISTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_COMP_EDITOR_REGISTRY, ECompEditorRegistry))
-#define E_COMP_EDITOR_REGISTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_COMP_EDITOR_REGISTRY, ECompEditorRegistryClass))
-#define E_IS_COMP_EDITOR_REGISTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_COMP_EDITOR_REGISTRY))
-#define E_IS_COMP_EDITOR_REGISTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_COMP_EDITOR_REGISTRY))
-
-
-typedef struct _ECompEditorRegistry ECompEditorRegistry;
-typedef struct _ECompEditorRegistryPrivate ECompEditorRegistryPrivate;
-typedef struct _ECompEditorRegistryClass ECompEditorRegistryClass;
-
-struct _ECompEditorRegistry {
- GObject parent;
-
- ECompEditorRegistryPrivate *priv;
-};
-
-struct _ECompEditorRegistryClass {
- GObjectClass parent_class;
-};
-
-typedef void (* ECompEditorRegistryForeachFn) (CompEditor *editor, gpointer data);
-
-
-
-
-GType e_comp_editor_registry_get_type (void);
-GObject *e_comp_editor_registry_new (void);
-void e_comp_editor_registry_add (ECompEditorRegistry *reg,
- CompEditor *editor,
- gboolean remote);
-CompEditor *e_comp_editor_registry_find (ECompEditorRegistry *reg,
- const char *uid);
-gboolean e_comp_editor_registry_close_all (ECompEditorRegistry *reg);
-
-G_END_DECLS
-
-#endif /* _E_COMP_EDITOR_REGISTRY_H_ */
-
-
diff --git a/calendar/gui/e-date-edit-config.c b/calendar/gui/e-date-edit-config.c
deleted file mode 100644
index acc61bda61..0000000000
--- a/calendar/gui/e-date-edit-config.c
+++ /dev/null
@@ -1,264 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Author :
- * JP Rosevear <jpr@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#include "calendar-config.h"
-#include "e-date-edit-config.h"
-
-struct _EDateEditConfigPrivate {
- EDateEdit *edit;
-
- GList *notifications;
-};
-
-/* Property IDs */
-enum props {
- PROP_0,
- PROP_EDIT,
-};
-
-G_DEFINE_TYPE (EDateEditConfig, e_date_edit_config, G_TYPE_OBJECT);
-
-static void
-e_date_edit_config_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
-{
- EDateEditConfig *edit_config;
- EDateEditConfigPrivate *priv;
-
- edit_config = E_DATE_EDIT_CONFIG (object);
- priv = edit_config->priv;
-
- switch (property_id) {
- case PROP_EDIT:
- e_date_edit_config_set_edit (edit_config, g_value_get_object (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-e_date_edit_config_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
-{
- EDateEditConfig *edit_config;
- EDateEditConfigPrivate *priv;
-
- edit_config = E_DATE_EDIT_CONFIG (object);
- priv = edit_config->priv;
-
- switch (property_id) {
- case PROP_EDIT:
- g_value_set_object (value, e_date_edit_config_get_edit (edit_config));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-e_date_edit_config_dispose (GObject *object)
-{
- EDateEditConfig *edit_config = E_DATE_EDIT_CONFIG (object);
- EDateEditConfigPrivate *priv;
-
- priv = edit_config->priv;
-
- e_date_edit_config_set_edit (edit_config, NULL);
-
- if (G_OBJECT_CLASS (e_date_edit_config_parent_class)->dispose)
- G_OBJECT_CLASS (e_date_edit_config_parent_class)->dispose (object);
-}
-
-static void
-e_date_edit_config_finalize (GObject *object)
-{
- EDateEditConfig *edit_config = E_DATE_EDIT_CONFIG (object);
- EDateEditConfigPrivate *priv;
-
- priv = edit_config->priv;
-
- g_free (priv);
-
- if (G_OBJECT_CLASS (e_date_edit_config_parent_class)->finalize)
- G_OBJECT_CLASS (e_date_edit_config_parent_class)->finalize (object);
-}
-
-static void
-e_date_edit_config_class_init (EDateEditConfigClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GParamSpec *spec;
-
- /* Method override */
- gobject_class->set_property = e_date_edit_config_set_property;
- gobject_class->get_property = e_date_edit_config_get_property;
- gobject_class->dispose = e_date_edit_config_dispose;
- gobject_class->finalize = e_date_edit_config_finalize;
-
- spec = g_param_spec_object ("edit", NULL, NULL, e_date_edit_get_type (),
- G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT);
- g_object_class_install_property (gobject_class, PROP_EDIT, spec);
-}
-
-static void
-e_date_edit_config_init (EDateEditConfig *edit_config)
-{
- edit_config->priv = g_new0 (EDateEditConfigPrivate, 1);
-
-}
-
-EDateEditConfig *
-e_date_edit_config_new (EDateEdit *date_edit)
-{
- EDateEditConfig *edit_config;
-
- edit_config = g_object_new (e_date_edit_config_get_type (), "edit", date_edit, NULL);
-
- return edit_config;
-}
-
-EDateEdit *
-e_date_edit_config_get_edit (EDateEditConfig *edit_config)
-{
- EDateEditConfigPrivate *priv;
-
- g_return_val_if_fail (edit_config != NULL, NULL);
- g_return_val_if_fail (E_IS_DATE_EDIT_CONFIG (edit_config), NULL);
-
- priv = edit_config->priv;
-
- return priv->edit;
-}
-
-static void
-set_week_start (EDateEdit *date_edit)
-{
- int week_start_day;
-
- week_start_day = calendar_config_get_week_start_day ();
-
- /* Convert it to 0 (Mon) to 6 (Sun), which is what we use. */
- week_start_day = (week_start_day + 6) % 7;
-
- e_date_edit_set_week_start_day (date_edit, week_start_day);
-}
-
-static void
-week_start_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EDateEditConfig *edit_config = data;
- EDateEditConfigPrivate *priv;
-
- priv = edit_config->priv;
-
- set_week_start (priv->edit);
-}
-
-static void
-set_twentyfour_hour (EDateEdit *date_edit)
-{
- gboolean use_24_hour;
-
- use_24_hour = calendar_config_get_24_hour_format ();
-
- e_date_edit_set_use_24_hour_format (date_edit, use_24_hour);
-}
-
-static void
-twentyfour_hour_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EDateEditConfig *edit_config = data;
- EDateEditConfigPrivate *priv;
-
- priv = edit_config->priv;
-
- set_twentyfour_hour (priv->edit);
-}
-
-static void
-set_dnav_show_week_no (EDateEdit *date_edit)
-{
- gboolean show_week_no;
-
- show_week_no = calendar_config_get_dnav_show_week_no ();
-
- e_date_edit_set_show_week_numbers (date_edit, show_week_no);
-}
-
-static void
-dnav_show_week_no_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EDateEditConfig *edit_config = data;
- EDateEditConfigPrivate *priv;
-
- priv = edit_config->priv;
-
- set_dnav_show_week_no (priv->edit);
-}
-void
-e_date_edit_config_set_edit (EDateEditConfig *edit_config, EDateEdit *date_edit)
-{
- EDateEditConfigPrivate *priv;
- guint not;
- GList *l;
-
- g_return_if_fail (edit_config != NULL);
- g_return_if_fail (E_IS_DATE_EDIT_CONFIG (edit_config));
-
- priv = edit_config->priv;
-
- if (priv->edit) {
- g_object_unref (priv->edit);
- priv->edit = NULL;
- }
-
- for (l = priv->notifications; l; l = l->next)
- calendar_config_remove_notification (GPOINTER_TO_UINT (l->data));
-
- g_list_free (priv->notifications);
- priv->notifications = NULL;
-
- /* If the new edit is NULL, return right now */
- if (!date_edit)
- return;
-
- priv->edit = g_object_ref (date_edit);
-
- /* Week start */
- set_week_start (date_edit);
-
- not = calendar_config_add_notification_week_start_day (week_start_changed_cb, edit_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* 24 Hour format */
- set_twentyfour_hour (date_edit);
-
- not = calendar_config_add_notification_24_hour_format (twentyfour_hour_changed_cb, edit_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Show week numbers */
- set_dnav_show_week_no (date_edit);
-
- not = calendar_config_add_notification_dnav_show_week_no (dnav_show_week_no_changed_cb, edit_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-}
diff --git a/calendar/gui/e-date-edit-config.h b/calendar/gui/e-date-edit-config.h
deleted file mode 100644
index 0707666bff..0000000000
--- a/calendar/gui/e-date-edit-config.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Author :
- * JP Rosevear <jpr@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#ifndef _E_DATE_EDIT_CONFIG_H_
-#define _E_DATE_EDIT_CONFIG_H_
-
-#include <widgets/misc/e-dateedit.h>
-
-G_BEGIN_DECLS
-
-#define E_DATE_EDIT_CONFIG(obj) GTK_CHECK_CAST (obj, e_date_edit_config_get_type (), EDateEditConfig)
-#define E_DATE_EDIT_CONFIG_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_date_edit_config_get_type (), EDateEditConfigClass)
-#define E_IS_DATE_EDIT_CONFIG(obj) GTK_CHECK_TYPE (obj, e_date_edit_config_get_type ())
-
-typedef struct _EDateEditConfig EDateEditConfig;
-typedef struct _EDateEditConfigClass EDateEditConfigClass;
-typedef struct _EDateEditConfigPrivate EDateEditConfigPrivate;
-
-struct _EDateEditConfig {
- GObject parent;
-
- EDateEditConfigPrivate *priv;
-};
-
-struct _EDateEditConfigClass {
- GObjectClass parent_class;
-};
-
-GType e_date_edit_config_get_type (void);
-EDateEditConfig *e_date_edit_config_new (EDateEdit *date_edit);
-EDateEdit *e_date_edit_config_get_edit (EDateEditConfig *edit_config);
-void e_date_edit_config_set_edit (EDateEditConfig *edit_config, EDateEdit *date_edit);
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/e-date-time-list.c b/calendar/gui/e-date-time-list.c
deleted file mode 100644
index 4ba4a4fcc4..0000000000
--- a/calendar/gui/e-date-time-list.c
+++ /dev/null
@@ -1,563 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/* EDateTimeList - list of calendar dates/times with GtkTreeModel interface.
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- *
- * Authors: Hans Petter Jansson <hpj@ximian.com>
- */
-
-#include <string.h>
-#include <gtk/gtktreemodel.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtktreednd.h>
-#include <glib.h>
-#include <e-util/e-time-utils.h>
-#include "e-date-time-list.h"
-#include <libecal/e-cal-time-util.h>
-#include "calendar-config.h"
-
-#define G_LIST(x) ((GList *) x)
-#define E_DATE_TIME_LIST_IS_SORTED(list) (E_DATE_TIME_LIST (list)->sort_column_id != -2)
-#define IS_VALID_ITER(dt_list, iter) (iter!= NULL && iter->user_data != NULL && \
- dt_list->stamp == iter->stamp)
-
-static GType column_types [E_DATE_TIME_LIST_NUM_COLUMNS];
-
-static void e_date_time_list_init (EDateTimeList *file_list);
-static void e_date_time_list_class_init (EDateTimeListClass *class);
-static void e_date_time_list_tree_model_init (GtkTreeModelIface *iface);
-static void e_date_time_list_finalize (GObject *object);
-static guint e_date_time_list_get_flags (GtkTreeModel *tree_model);
-static gint e_date_time_list_get_n_columns (GtkTreeModel *tree_model);
-static GType e_date_time_list_get_column_type (GtkTreeModel *tree_model,
- gint index);
-static gboolean e_date_time_list_get_iter (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreePath *path);
-static GtkTreePath *e_date_time_list_get_path (GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-static void e_date_time_list_get_value (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- gint column,
- GValue *value);
-static gboolean e_date_time_list_iter_next (GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-static gboolean e_date_time_list_iter_children (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *parent);
-static gboolean e_date_time_list_iter_has_child (GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-static gint e_date_time_list_iter_n_children (GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-static gboolean e_date_time_list_iter_nth_child (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *parent,
- gint n);
-static gboolean e_date_time_list_iter_parent (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *child);
-
-static GObjectClass *parent_class = NULL;
-
-GtkType
-e_date_time_list_get_type (void)
-{
- static GType date_time_list_type = 0;
-
- if (!date_time_list_type) {
- static const GTypeInfo date_time_list_info =
- {
- sizeof (EDateTimeListClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) e_date_time_list_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EDateTimeList),
- 0,
- (GInstanceInitFunc) e_date_time_list_init,
- };
-
- static const GInterfaceInfo tree_model_info =
- {
- (GInterfaceInitFunc) e_date_time_list_tree_model_init,
- NULL,
- NULL
- };
-
- column_types [E_DATE_TIME_LIST_COLUMN_DESCRIPTION] = G_TYPE_STRING;
-
- date_time_list_type = g_type_register_static (G_TYPE_OBJECT, "EDateTimeList",
- &date_time_list_info, 0);
- g_type_add_interface_static (date_time_list_type,
- GTK_TYPE_TREE_MODEL,
- &tree_model_info);
- }
-
- return date_time_list_type;
-}
-
-static void
-e_date_time_list_class_init (EDateTimeListClass *class)
-{
- GObjectClass *object_class;
-
- parent_class = g_type_class_peek_parent (class);
- object_class = (GObjectClass*) class;
-
- object_class->finalize = e_date_time_list_finalize;
-}
-
-static void
-e_date_time_list_tree_model_init (GtkTreeModelIface *iface)
-{
- iface->get_flags = e_date_time_list_get_flags;
- iface->get_n_columns = e_date_time_list_get_n_columns;
- iface->get_column_type = e_date_time_list_get_column_type;
- iface->get_iter = e_date_time_list_get_iter;
- iface->get_path = e_date_time_list_get_path;
- iface->get_value = e_date_time_list_get_value;
- iface->iter_next = e_date_time_list_iter_next;
- iface->iter_children = e_date_time_list_iter_children;
- iface->iter_has_child = e_date_time_list_iter_has_child;
- iface->iter_n_children = e_date_time_list_iter_n_children;
- iface->iter_nth_child = e_date_time_list_iter_nth_child;
- iface->iter_parent = e_date_time_list_iter_parent;
-}
-
-static void
-e_date_time_list_init (EDateTimeList *date_time_list)
-{
- date_time_list->stamp = g_random_int ();
- date_time_list->columns_dirty = FALSE;
- date_time_list->list = NULL;
-}
-
-EDateTimeList *
-e_date_time_list_new (void)
-{
- EDateTimeList *date_time_list;
-
- date_time_list = E_DATE_TIME_LIST (g_object_new (e_date_time_list_get_type (), NULL));
-
- return date_time_list;
-}
-
-static void
-all_rows_deleted (EDateTimeList *date_time_list)
-{
- GtkTreePath *path;
- gint i;
-
- if (!date_time_list->list)
- return;
-
- path = gtk_tree_path_new ();
- i = g_list_length (date_time_list->list);
- gtk_tree_path_append_index (path, i);
-
- for ( ; i >= 0; i--) {
- gtk_tree_model_row_deleted (GTK_TREE_MODEL (date_time_list), path);
- gtk_tree_path_prev (path);
- }
-
- gtk_tree_path_free (path);
-}
-
-static void
-row_deleted (EDateTimeList *date_time_list, gint n)
-{
- GtkTreePath *path;
-
- path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, n);
- gtk_tree_model_row_deleted (GTK_TREE_MODEL (date_time_list), path);
- gtk_tree_path_free (path);
-}
-
-static void
-row_added (EDateTimeList *date_time_list, gint n)
-{
- GtkTreePath *path;
- GtkTreeIter iter;
-
- path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, n);
-
- if (gtk_tree_model_get_iter (GTK_TREE_MODEL (date_time_list), &iter, path))
- gtk_tree_model_row_inserted (GTK_TREE_MODEL (date_time_list), path, &iter);
-
- gtk_tree_path_free (path);
-}
-
-static void
-row_updated (EDateTimeList *date_time_list, gint n)
-{
- GtkTreePath *path;
- GtkTreeIter iter;
-
- path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, n);
-
- if (gtk_tree_model_get_iter (GTK_TREE_MODEL (date_time_list), &iter, path))
- gtk_tree_model_row_changed (GTK_TREE_MODEL (date_time_list), path, &iter);
-
- gtk_tree_path_free (path);
-}
-
-static void
-e_date_time_list_finalize (GObject *object)
-{
- if (G_OBJECT_CLASS (parent_class)->finalize)
- (* G_OBJECT_CLASS (parent_class)->finalize) (object);
-}
-
-/* Fulfill the GtkTreeModel requirements */
-static guint
-e_date_time_list_get_flags (GtkTreeModel *tree_model)
-{
- g_return_val_if_fail (E_IS_DATE_TIME_LIST (tree_model), 0);
-
- return GTK_TREE_MODEL_LIST_ONLY;
-}
-
-static gint
-e_date_time_list_get_n_columns (GtkTreeModel *tree_model)
-{
- EDateTimeList *date_time_list = (EDateTimeList *) tree_model;
-
- g_return_val_if_fail (E_IS_DATE_TIME_LIST (tree_model), 0);
-
- date_time_list->columns_dirty = TRUE;
- return E_DATE_TIME_LIST_NUM_COLUMNS;
-}
-
-static GType
-e_date_time_list_get_column_type (GtkTreeModel *tree_model,
- gint index)
-{
- EDateTimeList *date_time_list = (EDateTimeList *) tree_model;
-
- g_return_val_if_fail (E_IS_DATE_TIME_LIST (tree_model), G_TYPE_INVALID);
- g_return_val_if_fail (index < E_DATE_TIME_LIST_NUM_COLUMNS &&
- index >= 0, G_TYPE_INVALID);
-
- date_time_list->columns_dirty = TRUE;
- return column_types [index];
-}
-
-const ECalComponentDateTime *
-e_date_time_list_get_date_time (EDateTimeList *date_time_list, GtkTreeIter *iter)
-{
- g_return_val_if_fail (IS_VALID_ITER (date_time_list, iter), NULL);
-
- return G_LIST (iter->user_data)->data;
-}
-
-static void
-free_datetime (ECalComponentDateTime *datetime)
-{
- g_free (datetime->value);
- if (datetime->tzid)
- g_free ((gchar *) datetime->tzid);
- g_free (datetime);
-}
-
-static ECalComponentDateTime *
-copy_datetime (const ECalComponentDateTime *datetime)
-{
- ECalComponentDateTime *datetime_copy;
-
- datetime_copy = g_new0 (ECalComponentDateTime, 1);
- datetime_copy->value = g_new (struct icaltimetype, 1);
- *datetime_copy->value = *datetime->value;
-
- if (datetime->tzid)
- datetime_copy->tzid = g_strdup (datetime->tzid);
-
- return datetime_copy;
-}
-
-static gint
-compare_datetime (const ECalComponentDateTime *datetime1, const ECalComponentDateTime *datetime2)
-{
- return icaltime_compare (*datetime1->value, *datetime2->value);
-}
-
-void
-e_date_time_list_set_date_time (EDateTimeList *date_time_list, GtkTreeIter *iter,
- const ECalComponentDateTime *datetime)
-{
- ECalComponentDateTime *datetime_old;
-
- g_return_if_fail (IS_VALID_ITER (date_time_list, iter));
-
- datetime_old = G_LIST (iter->user_data)->data;
- free_datetime (datetime_old);
- G_LIST (iter->user_data)->data = copy_datetime (datetime);
- row_updated (date_time_list, g_list_position (date_time_list->list, G_LIST (iter->user_data)));
-}
-
-void
-e_date_time_list_append (EDateTimeList *date_time_list, GtkTreeIter *iter,
- const ECalComponentDateTime *datetime)
-{
- g_return_if_fail (datetime != NULL);
-
- if (g_list_find_custom (date_time_list->list, datetime, (GCompareFunc)compare_datetime) == NULL) {
- date_time_list->list = g_list_append (date_time_list->list, copy_datetime (datetime));
- row_added (date_time_list, g_list_length (date_time_list->list) - 1);
- }
-
- if (iter) {
- iter->user_data = g_list_last (date_time_list->list);
- iter->stamp = date_time_list->stamp;
- }
-}
-
-void
-e_date_time_list_remove (EDateTimeList *date_time_list, GtkTreeIter *iter)
-{
- gint n;
-
- g_return_if_fail (IS_VALID_ITER (date_time_list, iter));
-
- n = g_list_position (date_time_list->list, G_LIST (iter->user_data));
- free_datetime ((ECalComponentDateTime *) G_LIST (iter->user_data)->data);
- date_time_list->list = g_list_delete_link (date_time_list->list, G_LIST (iter->user_data));
- row_deleted (date_time_list, n);
-}
-
-void
-e_date_time_list_clear (EDateTimeList *date_time_list)
-{
- GList *l;
-
- all_rows_deleted (date_time_list);
-
- for (l = date_time_list->list; l; l = g_list_next (l)) {
- free_datetime ((ECalComponentDateTime *) l->data);
- }
-
- g_list_free (date_time_list->list);
- date_time_list->list = NULL;
-}
-
-static gboolean
-e_date_time_list_get_iter (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path)
-{
- EDateTimeList *date_time_list = (EDateTimeList *) tree_model;
- GList *l;
- gint i;
-
- g_return_val_if_fail (E_IS_DATE_TIME_LIST (tree_model), FALSE);
- g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE);
-
- if (!date_time_list->list)
- return FALSE;
-
- date_time_list->columns_dirty = TRUE;
-
- i = gtk_tree_path_get_indices (path)[0];
- l = g_list_nth (date_time_list->list, i);
- if (!l)
- return FALSE;
-
- iter->user_data = l;
- iter->stamp = date_time_list->stamp;
- return TRUE;
-}
-
-static GtkTreePath *
-e_date_time_list_get_path (GtkTreeModel *tree_model,
- GtkTreeIter *iter)
-{
- EDateTimeList *date_time_list = (EDateTimeList *) tree_model;
- GtkTreePath *retval;
- GList *l;
-
- g_return_val_if_fail (E_IS_DATE_TIME_LIST (tree_model), NULL);
- g_return_val_if_fail (iter->stamp == E_DATE_TIME_LIST (tree_model)->stamp, NULL);
-
- l = iter->user_data;
- retval = gtk_tree_path_new ();
- gtk_tree_path_append_index (retval, g_list_position (date_time_list->list, l));
- return retval;
-}
-
-/* Builds a static string out of an exception date */
-static char *
-get_exception_string (ECalComponentDateTime *dt)
-{
- static char buf [256];
- struct tm tmp_tm;
-
- tmp_tm.tm_year = dt->value->year - 1900;
- tmp_tm.tm_mon = dt->value->month - 1;
- tmp_tm.tm_mday = dt->value->day;
- tmp_tm.tm_hour = dt->value->hour;
- tmp_tm.tm_min = dt->value->minute;
- tmp_tm.tm_sec = dt->value->second;
- tmp_tm.tm_isdst = -1;
-
- tmp_tm.tm_wday = time_day_of_week (dt->value->day,
- dt->value->month - 1,
- dt->value->year);
-
- e_time_format_date_and_time (&tmp_tm, calendar_config_get_24_hour_format (),
- FALSE, FALSE, buf, sizeof (buf));
-
- return buf;
-}
-
-static void
-e_date_time_list_get_value (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- gint column,
- GValue *value)
-{
- EDateTimeList *date_time_list = E_DATE_TIME_LIST (tree_model);
- ECalComponentDateTime *datetime;
- GList *l;
- const gchar *str;
-
- g_return_if_fail (E_IS_DATE_TIME_LIST (tree_model));
- g_return_if_fail (column < E_DATE_TIME_LIST_NUM_COLUMNS);
- g_return_if_fail (E_DATE_TIME_LIST (tree_model)->stamp == iter->stamp);
- g_return_if_fail (IS_VALID_ITER (date_time_list, iter));
-
- g_value_init (value, column_types [column]);
-
- if (!date_time_list->list)
- return;
-
- l = iter->user_data;
- datetime = l->data;
-
- if (!datetime)
- return;
-
- switch (column) {
- case E_DATE_TIME_LIST_COLUMN_DESCRIPTION:
- str = get_exception_string (datetime);
- g_value_set_string (value, str);
- break;
- }
-}
-
-static gboolean
-e_date_time_list_iter_next (GtkTreeModel *tree_model,
- GtkTreeIter *iter)
-{
- GList *l;
-
- g_return_val_if_fail (E_IS_DATE_TIME_LIST (tree_model), FALSE);
- g_return_val_if_fail (IS_VALID_ITER (E_DATE_TIME_LIST (tree_model), iter), FALSE);
-
- if (!E_DATE_TIME_LIST (tree_model)->list)
- return FALSE;
-
- l = iter->user_data;
- l = g_list_next (l);
- if (l) {
- iter->user_data = l;
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-e_date_time_list_iter_children (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *parent)
-{
- EDateTimeList *date_time_list = E_DATE_TIME_LIST (tree_model);
-
- /* this is a list, nodes have no children */
- if (parent)
- return FALSE;
-
- /* but if parent == NULL we return the list itself as children of the
- * "root" */
-
- if (!date_time_list->list)
- return FALSE;
-
- iter->stamp = E_DATE_TIME_LIST (tree_model)->stamp;
- iter->user_data = date_time_list->list;
- return TRUE;
-}
-
-static gboolean
-e_date_time_list_iter_has_child (GtkTreeModel *tree_model,
- GtkTreeIter *iter)
-{
- g_return_val_if_fail (IS_VALID_ITER (E_DATE_TIME_LIST (tree_model), iter), FALSE);
- return FALSE;
-}
-
-static gint
-e_date_time_list_iter_n_children (GtkTreeModel *tree_model,
- GtkTreeIter *iter)
-{
- EDateTimeList *date_time_list = E_DATE_TIME_LIST (tree_model);
-
- g_return_val_if_fail (E_IS_DATE_TIME_LIST (tree_model), -1);
-
- if (iter == NULL)
- return g_list_length (date_time_list->list);
-
- g_return_val_if_fail (E_DATE_TIME_LIST (tree_model)->stamp == iter->stamp, -1);
- return 0;
-}
-
-static gboolean
-e_date_time_list_iter_nth_child (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *parent,
- gint n)
-{
- EDateTimeList *date_time_list = E_DATE_TIME_LIST (tree_model);
-
- g_return_val_if_fail (E_IS_DATE_TIME_LIST (tree_model), FALSE);
-
- if (parent)
- return FALSE;
-
- if (date_time_list->list) {
- GList *l;
-
- l = g_list_nth (date_time_list->list, n);
- if (!l)
- return FALSE;
-
- iter->stamp = date_time_list->stamp;
- iter->user_data = l;
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-e_date_time_list_iter_parent (GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *child)
-{
- return FALSE;
-}
diff --git a/calendar/gui/e-date-time-list.h b/calendar/gui/e-date-time-list.h
deleted file mode 100644
index 83b145c7c6..0000000000
--- a/calendar/gui/e-date-time-list.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/* EDateTimeList - list of calendar dates/times with GtkTreeModel interface.
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- *
- * Authors: Hans Petter Jansson <hpj@ximian.com>
- */
-
-#ifndef E_DATE_TIME_LIST_H
-#define E_DATE_TIME_LIST_H
-
-#include <gtk/gtktreemodel.h>
-#include <libecal/e-cal-component.h>
-
-G_BEGIN_DECLS
-
-#define E_TYPE_DATE_TIME_LIST (e_date_time_list_get_type ())
-#define E_DATE_TIME_LIST(obj) (GTK_CHECK_CAST ((obj), E_TYPE_DATE_TIME_LIST, EDateTimeList))
-#define E_DATE_TIME_LIST_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_DATE_TIME_LIST, EDateTimeListClass))
-#define E_IS_DATE_TIME_LIST(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_DATE_TIME_LIST))
-#define E_IS_DATE_TIME_LIST_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_DATE_TIME_LIST))
-#define E_DATE_TIME_LIST_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), E_TYPE_DATE_TIME_LIST, EDateTimeListClass))
-
-typedef struct _EDateTimeList EDateTimeList;
-typedef struct _EDateTimeListClass EDateTimeListClass;
-
-typedef enum
-{
- E_DATE_TIME_LIST_COLUMN_DESCRIPTION,
-
- E_DATE_TIME_LIST_NUM_COLUMNS
-}
-EDateTimeListColumnType;
-
-struct _EDateTimeList
-{
- GObject parent;
-
- /* Private */
-
- gint stamp;
- GList *list;
-
- guint columns_dirty : 1;
-};
-
-struct _EDateTimeListClass
-{
- GObjectClass parent_class;
-};
-
-GtkType e_date_time_list_get_type (void);
-EDateTimeList *e_date_time_list_new (void);
-
-const ECalComponentDateTime *e_date_time_list_get_date_time (EDateTimeList *date_time_list,
- GtkTreeIter *iter);
-void e_date_time_list_set_date_time (EDateTimeList *date_time_list,
- GtkTreeIter *iter,
- const ECalComponentDateTime *datetime);
-void e_date_time_list_append (EDateTimeList *date_time_list,
- GtkTreeIter *iter,
- const ECalComponentDateTime *datetime);
-void e_date_time_list_remove (EDateTimeList *date_time_list,
- GtkTreeIter *iter);
-void e_date_time_list_clear (EDateTimeList *date_time_list);
-
-G_END_DECLS
-
-#endif /* E_DATE_TIME_LIST_H */
diff --git a/calendar/gui/e-day-view-config.c b/calendar/gui/e-day-view-config.c
deleted file mode 100644
index 50d4d8eeea..0000000000
--- a/calendar/gui/e-day-view-config.c
+++ /dev/null
@@ -1,466 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#include "calendar-config.h"
-#include "e-day-view-config.h"
-
-struct _EDayViewConfigPrivate {
- EDayView *view;
-
- GList *notifications;
-};
-
-/* Property IDs */
-enum props {
- PROP_0,
- PROP_VIEW,
-};
-
-G_DEFINE_TYPE (EDayViewConfig, e_day_view_config, G_TYPE_OBJECT);
-
-static void
-e_day_view_config_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
-{
- EDayViewConfig *view_config;
- EDayViewConfigPrivate *priv;
-
- view_config = E_DAY_VIEW_CONFIG (object);
- priv = view_config->priv;
-
- switch (property_id) {
- case PROP_VIEW:
- e_day_view_config_set_view (view_config, g_value_get_object (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-e_day_view_config_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
-{
- EDayViewConfig *view_config;
- EDayViewConfigPrivate *priv;
-
- view_config = E_DAY_VIEW_CONFIG (object);
- priv = view_config->priv;
-
- switch (property_id) {
- case PROP_VIEW:
- g_value_set_object (value, e_day_view_config_get_view (view_config));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-e_day_view_config_dispose (GObject *object)
-{
- EDayViewConfig *view_config = E_DAY_VIEW_CONFIG (object);
- EDayViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- e_day_view_config_set_view (view_config, NULL);
-
- if (G_OBJECT_CLASS (e_day_view_config_parent_class)->dispose)
- G_OBJECT_CLASS (e_day_view_config_parent_class)->dispose (object);
-}
-
-static void
-e_day_view_config_finalize (GObject *object)
-{
- EDayViewConfig *view_config = E_DAY_VIEW_CONFIG (object);
- EDayViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- g_free (priv);
-
- if (G_OBJECT_CLASS (e_day_view_config_parent_class)->finalize)
- G_OBJECT_CLASS (e_day_view_config_parent_class)->finalize (object);
-}
-
-static void
-e_day_view_config_class_init (EDayViewConfigClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GParamSpec *spec;
-
- /* Method override */
- gobject_class->set_property = e_day_view_config_set_property;
- gobject_class->get_property = e_day_view_config_get_property;
- gobject_class->dispose = e_day_view_config_dispose;
- gobject_class->finalize = e_day_view_config_finalize;
-
- spec = g_param_spec_object ("view", NULL, NULL, e_day_view_get_type (),
- G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT);
- g_object_class_install_property (gobject_class, PROP_VIEW, spec);
-}
-
-static void
-e_day_view_config_init (EDayViewConfig *view_config)
-{
- view_config->priv = g_new0 (EDayViewConfigPrivate, 1);
-
-}
-
-EDayViewConfig *
-e_day_view_config_new (EDayView *day_view)
-{
- EDayViewConfig *view_config;
-
- view_config = g_object_new (e_day_view_config_get_type (), "view", day_view, NULL);
-
- return view_config;
-}
-
-EDayView *
-e_day_view_config_get_view (EDayViewConfig *view_config)
-{
- EDayViewConfigPrivate *priv;
-
- g_return_val_if_fail (view_config != NULL, NULL);
- g_return_val_if_fail (E_IS_DAY_VIEW_CONFIG (view_config), NULL);
-
- priv = view_config->priv;
-
- return priv->view;
-}
-
-static void
-set_timezone (EDayView *day_view)
-{
- icaltimezone *zone;
-
- zone = calendar_config_get_icaltimezone ();
- e_calendar_view_set_timezone (E_CALENDAR_VIEW (day_view), zone);
-}
-
-static void
-timezone_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EDayViewConfig *view_config = data;
- EDayViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_timezone (priv->view);
-}
-
-static void
-set_week_start (EDayView *day_view)
-{
- int week_start_day;
-
- week_start_day = calendar_config_get_week_start_day ();
-
- /* Convert it to 0 (Mon) to 6 (Sun), which is what we use. */
- week_start_day = (week_start_day + 6) % 7;
-
- e_day_view_set_week_start_day (day_view, week_start_day);
-}
-
-static void
-week_start_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EDayViewConfig *view_config = data;
- EDayViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_week_start (priv->view);
-}
-
-static void
-set_twentyfour_hour (EDayView *day_view)
-{
- gboolean use_24_hour;
-
- use_24_hour = calendar_config_get_24_hour_format ();
-
- e_calendar_view_set_use_24_hour_format (E_CALENDAR_VIEW (day_view), use_24_hour);
-
- /* To redraw the times */
- gtk_widget_queue_draw (day_view->time_canvas);
-}
-
-static void
-twentyfour_hour_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EDayViewConfig *view_config = data;
- EDayViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_twentyfour_hour (priv->view);
-}
-
-static void
-set_working_days (EDayView *day_view)
-{
- CalWeekdays working_days;
-
- working_days = calendar_config_get_working_days ();
-
- e_day_view_set_working_days (day_view, working_days);
-}
-
-static void
-working_days_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EDayViewConfig *view_config = data;
- EDayViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_working_days (priv->view);
-}
-
-static void
-set_day_start_hour (EDayView *day_view)
-{
- int start_hour, start_minute, end_hour, end_minute;
-
- e_day_view_get_working_day (day_view, &start_hour, &start_minute, &end_hour, &end_minute);
-
- start_hour = calendar_config_get_day_start_hour ();
-
- e_day_view_set_working_day (day_view, start_hour, start_minute, end_hour, end_minute);
-}
-
-static void
-day_start_hour_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EDayViewConfig *view_config = data;
- EDayViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_day_start_hour (priv->view);
-}
-
-static void
-set_day_start_minute (EDayView *day_view)
-{
- int start_hour, start_minute, end_hour, end_minute;
-
- e_day_view_get_working_day (day_view, &start_hour, &start_minute, &end_hour, &end_minute);
-
- start_minute = calendar_config_get_day_start_minute ();
-
- e_day_view_set_working_day (day_view, start_hour, start_minute, end_hour, end_minute);
-}
-
-static void
-day_start_minute_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EDayViewConfig *view_config = data;
- EDayViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_day_start_minute (priv->view);
-}
-
-static void
-set_day_end_hour (EDayView *day_view)
-{
- int start_hour, start_minute, end_hour, end_minute;
-
- e_day_view_get_working_day (day_view, &start_hour, &start_minute, &end_hour, &end_minute);
-
- end_hour = calendar_config_get_day_end_hour ();
-
- e_day_view_set_working_day (day_view, start_hour, start_minute, end_hour, end_minute);
-}
-
-static void
-day_end_hour_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EDayViewConfig *view_config = data;
- EDayViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_day_end_hour (priv->view);
-}
-
-
-static void
-set_day_end_minute (EDayView *day_view)
-{
- int start_hour, start_minute, end_hour, end_minute;
-
- e_day_view_get_working_day (day_view, &start_hour, &start_minute, &end_hour, &end_minute);
-
- end_minute = calendar_config_get_day_end_minute ();
-
- e_day_view_set_working_day (day_view, start_hour, start_minute, end_hour, end_minute);
-}
-
-static void
-day_end_minute_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EDayViewConfig *view_config = data;
- EDayViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_day_end_minute (priv->view);
-}
-
-static void
-set_time_divisions (EDayView *day_view)
-{
- int time_divisions;
-
- time_divisions = calendar_config_get_time_divisions ();
-
- e_day_view_set_mins_per_row (day_view, time_divisions);
-}
-
-static void
-time_divisions_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EDayViewConfig *view_config = data;
- EDayViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_time_divisions (priv->view);
-}
-
-static void
-set_show_event_end (EDayView *day_view)
-{
- gboolean show_event_end;
-
- show_event_end = calendar_config_get_show_event_end ();
-
- e_day_view_set_show_event_end_times (day_view, show_event_end);
-}
-
-static void
-show_event_end_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EDayViewConfig *view_config = data;
- EDayViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_show_event_end (priv->view);
-}
-
-void
-e_day_view_config_set_view (EDayViewConfig *view_config, EDayView *day_view)
-{
- EDayViewConfigPrivate *priv;
- guint not;
- GList *l;
-
- g_return_if_fail (view_config != NULL);
- g_return_if_fail (E_IS_DAY_VIEW_CONFIG (view_config));
-
- priv = view_config->priv;
-
- if (priv->view) {
- g_object_unref (priv->view);
- priv->view = NULL;
- }
-
- for (l = priv->notifications; l; l = l->next)
- calendar_config_remove_notification (GPOINTER_TO_UINT (l->data));
-
- g_list_free (priv->notifications);
- priv->notifications = NULL;
-
- /* If the new view is NULL, return right now */
- if (!day_view)
- return;
-
- priv->view = g_object_ref (day_view);
-
- /* Time zone */
- set_timezone (day_view);
-
- not = calendar_config_add_notification_timezone (timezone_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Week start */
- set_week_start (day_view);
-
- not = calendar_config_add_notification_week_start_day (week_start_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* 24 Hour format */
- set_twentyfour_hour (day_view);
-
- not = calendar_config_add_notification_24_hour_format (twentyfour_hour_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Working days */
- set_working_days (day_view);
-
- not = calendar_config_add_notification_working_days (working_days_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Day start hour */
- set_day_start_hour (day_view);
-
- not = calendar_config_add_notification_day_start_hour (day_start_hour_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Day start minute */
- set_day_start_minute (day_view);
-
- not = calendar_config_add_notification_day_start_minute (day_start_minute_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Day end hour */
- set_day_end_hour (day_view);
-
- not = calendar_config_add_notification_day_end_hour (day_end_hour_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Day start minute */
- set_day_end_minute (day_view);
-
- not = calendar_config_add_notification_day_end_minute (day_end_minute_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Time divisions */
- set_time_divisions (day_view);
-
- not = calendar_config_add_notification_time_divisions (time_divisions_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Showing event end */
- set_show_event_end (day_view);
-
- not = calendar_config_add_notification_show_event_end (show_event_end_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-}
diff --git a/calendar/gui/e-day-view-config.h b/calendar/gui/e-day-view-config.h
deleted file mode 100644
index 105cbb4f07..0000000000
--- a/calendar/gui/e-day-view-config.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Author :
- * JP Rosevear <jpr@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#ifndef _E_DAY_VIEW_CONFIG_H_
-#define _E_DAY_VIEW_CONFIG_H_
-
-#include "e-day-view.h"
-
-G_BEGIN_DECLS
-
-#define E_DAY_VIEW_CONFIG(obj) GTK_CHECK_CAST (obj, e_day_view_config_get_type (), EDayViewConfig)
-#define E_DAY_VIEW_CONFIG_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_day_view_config_get_type (), EDayViewConfigClass)
-#define E_IS_DAY_VIEW_CONFIG(obj) GTK_CHECK_TYPE (obj, e_day_view_config_get_type ())
-
-typedef struct _EDayViewConfig EDayViewConfig;
-typedef struct _EDayViewConfigClass EDayViewConfigClass;
-typedef struct _EDayViewConfigPrivate EDayViewConfigPrivate;
-
-struct _EDayViewConfig {
- GObject parent;
-
- EDayViewConfigPrivate *priv;
-};
-
-struct _EDayViewConfigClass {
- GObjectClass parent_class;
-};
-
-GType e_day_view_config_get_type (void);
-EDayViewConfig *e_day_view_config_new (EDayView *day_view);
-EDayView *e_day_view_config_get_view (EDayViewConfig *view_config);
-void e_day_view_config_set_view (EDayViewConfig *view_config, EDayView *day_view);
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/e-day-view-layout.c b/calendar/gui/e-day-view-layout.c
deleted file mode 100644
index ba843b828c..0000000000
--- a/calendar/gui/e-day-view-layout.c
+++ /dev/null
@@ -1,352 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 2001, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * Lays out events for the Day & Work-Week views of the calendar. It is also
- * used for printing.
- */
-
-#include <config.h>
-
-#include "e-day-view-layout.h"
-
-static void e_day_view_layout_long_event (EDayViewEvent *event,
- guint8 *grid,
- gint days_shown,
- time_t *day_starts,
- gint *rows_in_top_display);
-
-static void e_day_view_layout_day_event (EDayViewEvent *event,
- guint8 *grid,
- guint16 *group_starts,
- gint8 *cols_per_row,
- gint rows,
- gint mins_per_row);
-static void e_day_view_expand_day_event (EDayViewEvent *event,
- guint8 *grid,
- gint8 *cols_per_row,
- gint mins_per_row);
-static void e_day_view_recalc_cols_per_row (gint rows,
- gint8 *cols_per_row,
- guint16 *group_starts);
-
-
-void
-e_day_view_layout_long_events (GArray *events,
- gint days_shown,
- time_t *day_starts,
- gint *rows_in_top_display)
-{
- EDayViewEvent *event;
- gint event_num;
- guint8 *grid;
-
- /* This is a temporary 2-d grid which is used to place events.
- Each element is 0 if the position is empty, or 1 if occupied.
- We allocate the maximum size possible here, assuming that each
- event will need its own row. */
- grid = g_new0 (guint8, events->len * E_DAY_VIEW_MAX_DAYS);
-
- /* Reset the number of rows in the top display to 0. It will be
- updated as events are layed out below. */
- *rows_in_top_display = 0;
-
- /* Iterate over the events, finding which days they cover, and putting
- them in the first free row available. */
- for (event_num = 0; event_num < events->len; event_num++) {
- event = &g_array_index (events, EDayViewEvent, event_num);
- e_day_view_layout_long_event (event, grid,
- days_shown, day_starts,
- rows_in_top_display);
- }
-
- /* Free the grid. */
- g_free (grid);
-}
-
-
-static void
-e_day_view_layout_long_event (EDayViewEvent *event,
- guint8 *grid,
- gint days_shown,
- time_t *day_starts,
- gint *rows_in_top_display)
-{
- gint start_day, end_day, free_row, day, row;
-
- event->num_columns = 0;
-
- if (!e_day_view_find_long_event_days (event,
- days_shown, day_starts,
- &start_day, &end_day))
- return;
-
- /* Try each row until we find a free one. */
- row = 0;
- do {
- free_row = row;
- for (day = start_day; day <= end_day; day++) {
- if (grid[row * E_DAY_VIEW_MAX_DAYS + day]) {
- free_row = -1;
- break;
- }
- }
- row++;
- } while (free_row == -1);
-
- event->start_row_or_col = free_row;
- event->num_columns = 1;
-
- /* Mark the cells as full. */
- for (day = start_day; day <= end_day; day++) {
- grid[free_row * E_DAY_VIEW_MAX_DAYS + day] = 1;
- }
-
- /* Update the number of rows in the top canvas if necessary. */
- *rows_in_top_display = MAX (*rows_in_top_display, free_row + 1);
-}
-
-
-void
-e_day_view_layout_day_events (GArray *events,
- gint rows,
- gint mins_per_row,
- gint8 *cols_per_row)
-{
- EDayViewEvent *event;
- gint row, event_num;
- guint8 *grid;
-
- /* This is a temporary array which keeps track of rows which are
- connected. When an appointment spans multiple rows then the number
- of columns in each of these rows must be the same (i.e. the maximum
- of all of them). Each element in the array corresponds to one row
- and contains the index of the first row in the group of connected
- rows. */
- guint16 group_starts[12 * 24];
-
- /* Reset the cols_per_row array, and initialize the connected rows so
- that all rows are not connected - each row is the start of a new
- group. */
- for (row = 0; row < rows; row++) {
- cols_per_row[row] = 0;
- group_starts[row] = row;
- }
-
- /* This is a temporary 2-d grid which is used to place events.
- Each element is 0 if the position is empty, or 1 if occupied. */
- grid = g_new0 (guint8, rows * E_DAY_VIEW_MAX_COLUMNS);
-
-
- /* Iterate over the events, finding which rows they cover, and putting
- them in the first free column available. Increment the number of
- events in each of the rows it covers, and make sure they are all
- in one group. */
- for (event_num = 0; event_num < events->len; event_num++) {
- event = &g_array_index (events, EDayViewEvent, event_num);
-
- e_day_view_layout_day_event (event, grid, group_starts,
- cols_per_row, rows, mins_per_row);
- }
-
- /* Recalculate the number of columns needed in each row. */
- e_day_view_recalc_cols_per_row (rows, cols_per_row, group_starts);
-
- /* Iterate over the events again, trying to expand events horizontally
- if there is enough space. */
- for (event_num = 0; event_num < events->len; event_num++) {
- event = &g_array_index (events, EDayViewEvent, event_num);
- e_day_view_expand_day_event (event, grid, cols_per_row,
- mins_per_row);
- }
-
- /* Free the grid. */
- g_free (grid);
-}
-
-
-/* Finds the first free position to place the event in.
- Increments the number of events in each of the rows it covers, and makes
- sure they are all in one group. */
-static void
-e_day_view_layout_day_event (EDayViewEvent *event,
- guint8 *grid,
- guint16 *group_starts,
- gint8 *cols_per_row,
- gint rows,
- gint mins_per_row)
-{
- gint start_row, end_row, free_col, col, row, group_start;
-
- start_row = event->start_minute / mins_per_row;
- end_row = (event->end_minute - 1) / mins_per_row;
- if (end_row < start_row)
- end_row = start_row;
-
- event->num_columns = 0;
-
- /* If the event can't currently be seen, just return. */
- if (start_row >= rows || end_row < 0)
- return;
-
- /* Make sure we don't go outside the visible times. */
- start_row = CLAMP (start_row, 0, rows - 1);
- end_row = CLAMP (end_row, 0, rows - 1);
-
- /* Try each column until we find a free one. */
- for (col = 0; col < E_DAY_VIEW_MAX_COLUMNS; col++) {
- free_col = col;
- for (row = start_row; row <= end_row; row++) {
- if (grid[row * E_DAY_VIEW_MAX_COLUMNS + col]) {
- free_col = -1;
- break;
- }
- }
-
- if (free_col != -1)
- break;
- }
-
- /* If we can't find space for the event, just return. */
- if (free_col == -1)
- return;
-
- /* The event is assigned 1 col initially, but may be expanded later. */
- event->start_row_or_col = free_col;
- event->num_columns = 1;
-
- /* Determine the start index of the group. */
- group_start = group_starts[start_row];
-
- /* Increment number of events in each of the rows the event covers.
- We use the cols_per_row array for this. It will be sorted out after
- all the events have been layed out. Also make sure all the rows that
- the event covers are in one group. */
- for (row = start_row; row <= end_row; row++) {
- grid[row * E_DAY_VIEW_MAX_COLUMNS + free_col] = 1;
- cols_per_row[row]++;
- group_starts[row] = group_start;
- }
-
- /* If any following rows should be in the same group, add them. */
- for (row = end_row + 1; row < rows; row++) {
- if (group_starts[row] > end_row)
- break;
- group_starts[row] = group_start;
- }
-}
-
-
-/* For each group of rows, find the max number of events in all the
- rows, and set the number of cols in each of the rows to that. */
-static void
-e_day_view_recalc_cols_per_row (gint rows,
- gint8 *cols_per_row,
- guint16 *group_starts)
-{
- gint start_row = 0, row, next_start_row, max_events;
-
- while (start_row < rows) {
- max_events = 0;
- for (row = start_row; row < rows && group_starts[row] == start_row; row++)
- max_events = MAX (max_events, cols_per_row[row]);
-
- next_start_row = row;
-
- for (row = start_row; row < next_start_row; row++)
- cols_per_row[row] = max_events;
-
- start_row = next_start_row;
- }
-}
-
-
-/* Expands the event horizontally to fill any free space. */
-static void
-e_day_view_expand_day_event (EDayViewEvent *event,
- guint8 *grid,
- gint8 *cols_per_row,
- gint mins_per_row)
-{
- gint start_row, end_row, col, row;
- gboolean clashed;
-
- start_row = event->start_minute / mins_per_row;
- end_row = (event->end_minute - 1) / mins_per_row;
- if (end_row < start_row)
- end_row = start_row;
-
- /* Try each column until we find a free one. */
- clashed = FALSE;
- for (col = event->start_row_or_col + 1; col < cols_per_row[start_row]; col++) {
- for (row = start_row; row <= end_row; row++) {
- if (grid[row * E_DAY_VIEW_MAX_COLUMNS + col]) {
- clashed = TRUE;
- break;
- }
- }
-
- if (clashed)
- break;
-
- event->num_columns++;
- }
-}
-
-
-/* Find the start and end days for the event. */
-gboolean
-e_day_view_find_long_event_days (EDayViewEvent *event,
- gint days_shown,
- time_t *day_starts,
- gint *start_day_return,
- gint *end_day_return)
-{
- gint day, start_day, end_day;
-
- start_day = -1;
- end_day = -1;
-
- for (day = 0; day < days_shown; day++) {
- if (start_day == -1
- && event->start < day_starts[day + 1])
- start_day = day;
- if (event->end > day_starts[day])
- end_day = day;
- }
-
- /* Sanity check. */
- if (start_day < 0 || start_day >= days_shown
- || end_day < 0 || end_day >= days_shown
- || end_day < start_day) {
- g_warning ("Invalid date range for event");
- return FALSE;
- }
-
- *start_day_return = start_day;
- *end_day_return = end_day;
-
- return TRUE;
-}
-
-
diff --git a/calendar/gui/e-day-view-layout.h b/calendar/gui/e-day-view-layout.h
deleted file mode 100644
index 70d0dd6394..0000000000
--- a/calendar/gui/e-day-view-layout.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 2001, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-#ifndef _E_DAY_VIEW_LAYOUT_H_
-#define _E_DAY_VIEW_LAYOUT_H_
-
-#include "e-day-view.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/* I've split these functions away from EDayView so we can use them for
- printing. */
-
-void e_day_view_layout_long_events (GArray *events,
- gint days_shown,
- time_t *day_starts,
- gint *rows_in_top_display);
-
-
-void e_day_view_layout_day_events (GArray *events,
- gint rows,
- gint mins_per_row,
- gint8 *cols_per_row);
-
-gboolean e_day_view_find_long_event_days (EDayViewEvent *event,
- gint days_shown,
- time_t *day_starts,
- gint *start_day,
- gint *end_day);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_DAY_VIEW_LAYOUT_H_ */
diff --git a/calendar/gui/e-day-view-main-item.c b/calendar/gui/e-day-view-main-item.c
deleted file mode 100644
index f384fdbd66..0000000000
--- a/calendar/gui/e-day-view-main-item.c
+++ /dev/null
@@ -1,823 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 1999, Ximian, Inc.
- * Copyright 1999, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * EDayViewMainItem - canvas item which displays most of the appointment
- * data in the main Day/Work Week display.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-util/e-categories-config.h"
-#include "e-day-view-layout.h"
-#include "e-day-view-main-item.h"
-#include "ea-calendar.h"
-
-static void e_day_view_main_item_set_arg (GtkObject *o, GtkArg *arg,
- guint arg_id);
-static void e_day_view_main_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path, int flags);
-static void e_day_view_main_item_draw (GnomeCanvasItem *item,
- GdkDrawable *drawable,
- int x, int y,
- int width, int height);
-static double e_day_view_main_item_point (GnomeCanvasItem *item,
- double x, double y,
- int cx, int cy,
- GnomeCanvasItem **actual_item);
-static gint e_day_view_main_item_event (GnomeCanvasItem *item,
- GdkEvent *event);
-
-static void e_day_view_main_item_draw_long_events_in_vbars (EDayViewMainItem *dvmitem,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height);
-static void e_day_view_main_item_draw_events_in_vbars (EDayViewMainItem *dvmitem,
- GdkDrawable *drawable,
- int x, int y,
- int width, int height,
- gint day);
-static void e_day_view_main_item_draw_day_events (EDayViewMainItem *dvmitem,
- GdkDrawable *drawable,
- int x, int y,
- int width, int height,
- gint day);
-static void e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem,
- GdkDrawable *drawable,
- int x, int y,
- int width, int height,
- gint day, gint event_num);
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_DAY_VIEW
-};
-
-G_DEFINE_TYPE (EDayViewMainItem, e_day_view_main_item, GNOME_TYPE_CANVAS_ITEM);
-
-static void
-e_day_view_main_item_class_init (EDayViewMainItemClass *class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass *) class;
- item_class = (GnomeCanvasItemClass *) class;
-
- gtk_object_add_arg_type ("EDayViewMainItem::day_view",
- GTK_TYPE_POINTER, GTK_ARG_WRITABLE,
- ARG_DAY_VIEW);
-
- object_class->set_arg = e_day_view_main_item_set_arg;
-
- /* GnomeCanvasItem method overrides */
- item_class->update = e_day_view_main_item_update;
- item_class->draw = e_day_view_main_item_draw;
- item_class->point = e_day_view_main_item_point;
- item_class->event = e_day_view_main_item_event;
-
- /* init the accessibility support for e_day_view */
- e_day_view_main_item_a11y_init ();
-}
-
-
-static void
-e_day_view_main_item_init (EDayViewMainItem *dvtitem)
-{
- dvtitem->day_view = NULL;
-}
-
-
-static void
-e_day_view_main_item_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EDayViewMainItem *dvmitem;
-
- item = GNOME_CANVAS_ITEM (o);
- dvmitem = E_DAY_VIEW_MAIN_ITEM (o);
-
- switch (arg_id){
- case ARG_DAY_VIEW:
- dvmitem->day_view = GTK_VALUE_POINTER (*arg);
- break;
- }
-}
-
-
-static void
-e_day_view_main_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path,
- int flags)
-{
- if (GNOME_CANVAS_ITEM_CLASS (e_day_view_main_item_parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (e_day_view_main_item_parent_class)->update) (item, affine, clip_path, flags);
-
- /* The item covers the entire canvas area. */
- item->x1 = 0;
- item->y1 = 0;
- item->x2 = INT_MAX;
- item->y2 = INT_MAX;
-}
-
-
-/*
- * DRAWING ROUTINES - functions to paint the canvas item.
- */
-
-static void
-e_day_view_main_item_draw (GnomeCanvasItem *canvas_item, GdkDrawable *drawable,
- int x, int y, int width, int height)
-{
- EDayViewMainItem *dvmitem;
- EDayView *day_view;
- GtkStyle *style;
- GdkGC *gc;
- gint row, row_y, grid_x1, grid_x2;
- gint day, grid_y1, grid_y2;
- gint work_day_start_y, work_day_end_y;
- gint day_x, day_w, work_day;
- gint start_row, end_row, rect_x, rect_y, rect_width, rect_height;
- struct icaltimetype day_start_tt;
- gint weekday;
-
-#if 0
- g_print ("In e_day_view_main_item_draw %i,%i %ix%i\n",
- x, y, width, height);
-#endif
- dvmitem = E_DAY_VIEW_MAIN_ITEM (canvas_item);
- day_view = dvmitem->day_view;
- g_return_if_fail (day_view != NULL);
-
- style = gtk_widget_get_style (GTK_WIDGET (day_view));
-
- /* Paint the background colors. */
- gc = day_view->main_gc;
- work_day_start_y = e_day_view_convert_time_to_position (day_view, day_view->work_day_start_hour, day_view->work_day_start_minute) - y;
- work_day_end_y = e_day_view_convert_time_to_position (day_view, day_view->work_day_end_hour, day_view->work_day_end_minute) - y;
-
- for (day = 0; day < day_view->days_shown; day++) {
- day_start_tt = icaltime_from_timet_with_zone (day_view->day_starts[day], FALSE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- weekday = icaltime_day_of_week (day_start_tt) - 1;
-
- work_day = day_view->working_days & (1 << weekday);
-
- day_x = day_view->day_offsets[day] - x;
- day_w = day_view->day_widths[day];
-
- if (work_day) {
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING]);
- gdk_draw_rectangle (drawable, gc, TRUE,
- day_x, 0 - y,
- day_w, work_day_start_y - (0 - y));
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_WORKING]);
- gdk_draw_rectangle (drawable, gc, TRUE,
- day_x, work_day_start_y,
- day_w, work_day_end_y - work_day_start_y);
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING]);
- gdk_draw_rectangle (drawable, gc, TRUE,
- day_x, work_day_end_y,
- day_w, height - work_day_end_y);
- } else {
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING]);
- gdk_draw_rectangle (drawable, gc, TRUE,
- day_x, 0,
- day_w, height);
- }
- }
-
- /* Paint the selection background. */
- if (day_view->selection_start_day != -1
- && !day_view->selection_in_top_canvas) {
- for (day = day_view->selection_start_day;
- day <= day_view->selection_end_day;
- day++) {
- if (day == day_view->selection_start_day
- && day_view->selection_start_row != -1)
- start_row = day_view->selection_start_row;
- else
- start_row = 0;
- if (day == day_view->selection_end_day
- && day_view->selection_end_row != -1)
- end_row = day_view->selection_end_row;
- else
- end_row = day_view->rows - 1;
-
- rect_x = day_view->day_offsets[day] - x;
- rect_width = day_view->day_widths[day];
- rect_y = start_row * day_view->row_height - y;
- rect_height = (end_row - start_row + 1) * day_view->row_height;
-
- if (GTK_WIDGET_HAS_FOCUS(day_view))
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED]);
- else
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED_UNFOCUSSED]);
- gdk_draw_rectangle (drawable, gc, TRUE,
- rect_x, rect_y,
- rect_width, rect_height);
- }
- }
-
- /* Drawing the horizontal grid lines. */
- grid_x1 = day_view->day_offsets[0] - x;
- grid_x2 = day_view->day_offsets[day_view->days_shown] - x;
-
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_GRID]);
- for (row = 0, row_y = 0 - y;
- row < day_view->rows && row_y < height;
- row++, row_y += day_view->row_height) {
- if (row_y >= 0 && row_y < height)
- gdk_draw_line (drawable, gc,
- grid_x1, row_y, grid_x2, row_y);
- }
-
- /* Draw the vertical bars down the left of each column. */
- grid_y1 = 0;
- grid_y2 = height;
- for (day = 0; day < day_view->days_shown; day++) {
- grid_x1 = day_view->day_offsets[day] - x;
-
- /* Skip if it isn't visible. */
- if (grid_x1 >= width || grid_x1 + E_DAY_VIEW_BAR_WIDTH <= 0)
- continue;
-
- gdk_draw_line (drawable, style->black_gc,
- grid_x1, grid_y1,
- grid_x1, grid_y2);
- gdk_draw_line (drawable, style->black_gc,
- grid_x1 + E_DAY_VIEW_BAR_WIDTH - 1, grid_y1,
- grid_x1 + E_DAY_VIEW_BAR_WIDTH - 1, grid_y2);
- gdk_draw_rectangle (drawable, style->white_gc, TRUE,
- grid_x1 + 1, grid_y1,
- E_DAY_VIEW_BAR_WIDTH - 2, grid_y2 - grid_y1);
-
- /* Fill in the bars when the user is busy. */
- e_day_view_main_item_draw_events_in_vbars (dvmitem, drawable,
- x, y,
- width, height,
- day);
- }
-
- /* Fill in the vertical bars corresponding to the busy times from the
- long events. */
- e_day_view_main_item_draw_long_events_in_vbars (dvmitem, drawable,
- x, y, width, height);
-
- /* Draw the event borders and backgrounds, and the vertical bars
- down the left edges. */
- for (day = 0; day < day_view->days_shown; day++) {
- e_day_view_main_item_draw_day_events (dvmitem, drawable,
- x, y, width, height,
- day);
- }
-}
-
-
-static void
-e_day_view_main_item_draw_events_in_vbars (EDayViewMainItem *dvmitem,
- GdkDrawable *drawable,
- int x, int y,
- int width, int height,
- gint day)
-{
- EDayView *day_view;
- EDayViewEvent *event;
- GdkGC *gc;
- gint grid_x, event_num, bar_y, bar_h;
- ECalComponentTransparency transparency;
-
- day_view = dvmitem->day_view;
-
- gc = day_view->main_gc;
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]);
-
- grid_x = day_view->day_offsets[day] + 1 - x;
-
- /* Draw the busy times corresponding to the events in the day. */
- for (event_num = 0; event_num < day_view->events[day]->len;
- event_num++) {
- ECalComponent *comp;
-
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
- /* If the event is TRANSPARENT, skip it. */
- e_cal_component_get_transparency (comp, &transparency);
- if (transparency == E_CAL_COMPONENT_TRANSP_TRANSPARENT)
- continue;
-
- /* We can skip the events in the first column since they will
- draw over this anyway. */
- if (event->num_columns > 0 && event->start_row_or_col == 0)
- continue;
-
- bar_y = event->start_minute * day_view->row_height / day_view->mins_per_row;
- bar_h = event->end_minute * day_view->row_height / day_view->mins_per_row - bar_y;
- bar_y -= y;
-
- /* Skip it if it isn't visible. */
- if (bar_y >= height || bar_y + bar_h <= 0)
- continue;
-
- gdk_draw_rectangle (drawable, gc, TRUE,
- grid_x, bar_y,
- E_DAY_VIEW_BAR_WIDTH - 2, bar_h);
-
- g_object_unref (comp);
- }
-}
-
-
-static void
-e_day_view_main_item_draw_long_events_in_vbars (EDayViewMainItem *dvmitem,
- GdkDrawable *drawable,
- int x, int y,
- int width, int height)
-{
- EDayView *day_view;
- EDayViewEvent *event;
- gint event_num, start_day, end_day, day, bar_y1, bar_y2, grid_x;
- GdkGC *gc;
- ECalComponentTransparency transparency;
-
- day_view = dvmitem->day_view;
-
- gc = day_view->main_gc;
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]);
-
- for (event_num = 0; event_num < day_view->long_events->len;
- event_num++) {
- ECalComponent *comp;
-
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
- /* If the event is TRANSPARENT, skip it. */
- e_cal_component_get_transparency (comp, &transparency);
- if (transparency == E_CAL_COMPONENT_TRANSP_TRANSPARENT)
- continue;
-
- if (!e_day_view_find_long_event_days (event,
- day_view->days_shown,
- day_view->day_starts,
- &start_day, &end_day))
- continue;
-
- for (day = start_day; day <= end_day; day++) {
- grid_x = day_view->day_offsets[day] + 1 - x;
-
- /* Skip if it isn't visible. */
- if (grid_x >= width
- || grid_x + E_DAY_VIEW_BAR_WIDTH <= 0)
- continue;
-
- if (event->start <= day_view->day_starts[day]) {
- bar_y1 = 0;
- } else {
- bar_y1 = event->start_minute * day_view->row_height / day_view->mins_per_row - y;
- }
-
- if (event->end >= day_view->day_starts[day + 1]) {
- bar_y2 = height;
- } else {
- bar_y2 = event->end_minute * day_view->row_height / day_view->mins_per_row - y;
- }
-
- if (bar_y1 < height && bar_y2 > 0 && bar_y2 > bar_y1) {
- gdk_draw_rectangle (drawable, gc, TRUE,
- grid_x, bar_y1,
- E_DAY_VIEW_BAR_WIDTH - 2,
- bar_y2 - bar_y1);
- }
- }
-
-
- g_object_unref (comp);
- }
-}
-
-
-static void
-e_day_view_main_item_draw_day_events (EDayViewMainItem *dvmitem,
- GdkDrawable *drawable,
- int x, int y, int width, int height,
- gint day)
-{
- EDayView *day_view;
- gint event_num;
-
- day_view = dvmitem->day_view;
-
- for (event_num = 0; event_num < day_view->events[day]->len;
- event_num++) {
- e_day_view_main_item_draw_day_event (dvmitem, drawable,
- x, y, width, height,
- day, event_num);
- }
-}
-
-
-static void
-e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem,
- GdkDrawable *drawable,
- int x, int y, int width, int height,
- gint day, gint event_num)
-{
- EDayView *day_view;
- EDayViewEvent *event;
- gint item_x, item_y, item_w, item_h, bar_y1, bar_y2;
- GtkStyle *style;
- GdkGC *gc;
- GdkColor bg_color;
- ECalComponent *comp;
- gint num_icons, icon_x, icon_y, icon_x_inc, icon_y_inc;
- gint max_icon_w, max_icon_h;
- gboolean draw_reminder_icon, draw_recurrence_icon, draw_timezone_icon, draw_meeting_icon;
- gboolean draw_attach_icon;
- GSList *categories_list, *elem;
- ECalComponentTransparency transparency;
-
- day_view = dvmitem->day_view;
-
- /* If the event is currently being dragged, don't draw it. It will
- be drawn in the special drag items. */
- if (day_view->drag_event_day == day
- && day_view->drag_event_num == event_num)
- return;
-
- style = GTK_WIDGET (day_view)->style;
-
- gc = day_view->main_gc;
-
- /* Get the position of the event. If it is not shown skip it.*/
- if (!e_day_view_get_event_position (day_view, day, event_num,
- &item_x, &item_y,
- &item_w, &item_h))
- return;
-
- item_x -= x;
- item_y -= y;
-
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
-
- /* Fill in the event background. Note that for events in the first
- column of the day, we might not want to paint over the vertical bar,
- since that is used for multiple events. But then you can't see
- where the event in the first column finishes. */
-
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND]);
-
- if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), event->comp_data),
- &bg_color)) {
- GdkColormap *colormap;
-
- colormap = gtk_widget_get_colormap (GTK_WIDGET (day_view));
- if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE))
- gdk_gc_set_foreground (gc, &bg_color);
- }
-
-#if 1
- if (event->start_row_or_col == 0)
- gdk_draw_rectangle (drawable, gc, TRUE,
- item_x + E_DAY_VIEW_BAR_WIDTH, item_y + 1,
- MAX (item_w - E_DAY_VIEW_BAR_WIDTH - 1, 0),
- item_h - 2);
- else
-#endif
- gdk_draw_rectangle (drawable, gc, TRUE,
- item_x + 1, item_y + 1,
- MAX (item_w - 2, 0), item_h - 2);
-
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]);
-
- /* Draw the right edge of the vertical bar. */
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER]);
- gdk_draw_line (drawable, gc,
- item_x + E_DAY_VIEW_BAR_WIDTH - 1,
- item_y + 1,
- item_x + E_DAY_VIEW_BAR_WIDTH - 1,
- item_y + item_h - 2);
-
- /* Draw the vertical colored bar showing when the appointment
- begins & ends. */
- bar_y1 = event->start_minute * day_view->row_height / day_view->mins_per_row - y;
- bar_y2 = event->end_minute * day_view->row_height / day_view->mins_per_row - y;
-
- /* When an item is being resized, we fill the bar up to the new row. */
- if (day_view->resize_drag_pos != E_CALENDAR_VIEW_POS_NONE
- && day_view->resize_event_day == day
- && day_view->resize_event_num == event_num) {
- if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_TOP_EDGE)
- bar_y1 = item_y + 1;
- else if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_BOTTOM_EDGE)
- bar_y2 = item_y + item_h - 1;
- }
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
- /* Only fill it in if the event isn't TRANSPARENT. */
- e_cal_component_get_transparency (comp, &transparency);
- if (transparency != E_CAL_COMPONENT_TRANSP_TRANSPARENT) {
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]);
- gdk_draw_rectangle (drawable, gc, TRUE,
- item_x + 1, bar_y1,
- E_DAY_VIEW_BAR_WIDTH - 2, bar_y2 - bar_y1);
- }
-
- /* Draw the box around the entire event. Do this after drawing
- the colored bar so we don't have to worry about being 1
- pixel out. */
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER]);
- gdk_draw_rectangle (drawable, gc, FALSE,
- item_x, item_y, MAX (item_w - 1, 0), item_h - 1);
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]);
-
-#if 0
- /* Draw the horizontal bars above and beneath the event if it
- is currently being edited. */
- if (day_view->editing_event_day == day
- && day_view->editing_event_num == event_num) {
- gdk_draw_rectangle (drawable, gc, TRUE,
- item_x,
- item_y - E_DAY_VIEW_BAR_HEIGHT,
- item_w,
- E_DAY_VIEW_BAR_HEIGHT);
- gdk_draw_rectangle (drawable, gc, TRUE,
- item_x, item_y + item_h,
- item_w, E_DAY_VIEW_BAR_HEIGHT);
- }
-#endif
-
- /* Draw the reminder & recurrence icons, if needed. */
- num_icons = 0;
- draw_reminder_icon = FALSE;
- draw_recurrence_icon = FALSE;
- draw_timezone_icon = FALSE;
- draw_meeting_icon = FALSE;
- draw_attach_icon = FALSE;
- icon_x = item_x + E_DAY_VIEW_BAR_WIDTH + E_DAY_VIEW_ICON_X_PAD;
- icon_y = item_y + E_DAY_VIEW_EVENT_BORDER_HEIGHT
- + E_DAY_VIEW_ICON_Y_PAD;
-
- if (e_cal_component_has_alarms (comp)) {
- draw_reminder_icon = TRUE;
- num_icons++;
- }
-
- if (e_cal_component_has_recurrences (comp)) {
- draw_recurrence_icon = TRUE;
- num_icons++;
- }
- if (e_cal_component_has_attachments (comp)) {
- draw_attach_icon = TRUE;
- num_icons++;
- }
- /* If the DTSTART or DTEND are in a different timezone to our current
- timezone, we display the timezone icon. */
- if (event->different_timezone) {
- draw_timezone_icon = TRUE;
- num_icons++;
- }
-
- if (e_cal_component_has_organizer (comp)) {
- draw_meeting_icon = TRUE;
- num_icons++;
- }
-
- e_cal_component_get_categories_list (comp, &categories_list);
- for (elem = categories_list; elem; elem = elem->next) {
- char *category;
- GdkPixmap *pixmap = NULL;
- GdkBitmap *mask = NULL;
-
- category = (char *) elem->data;
- if (e_categories_config_get_icon_for (category, &pixmap, &mask))
- num_icons++;
- }
-
- if (num_icons != 0) {
- if (item_h >= (E_DAY_VIEW_ICON_HEIGHT + E_DAY_VIEW_ICON_Y_PAD)
- * num_icons) {
- icon_x_inc = 0;
- icon_y_inc = E_DAY_VIEW_ICON_HEIGHT
- + E_DAY_VIEW_ICON_Y_PAD;
- } else {
- icon_x_inc = E_DAY_VIEW_ICON_WIDTH
- + E_DAY_VIEW_ICON_X_PAD;
- icon_y_inc = 0;
- }
-
- if (draw_reminder_icon) {
- max_icon_w = item_x + item_w - icon_x
- - E_DAY_VIEW_EVENT_BORDER_WIDTH;
- max_icon_h = item_y + item_h - icon_y
- - E_DAY_VIEW_EVENT_BORDER_HEIGHT;
-
- gdk_gc_set_clip_mask (gc, NULL);
- gdk_draw_pixbuf (drawable, gc,
- day_view->reminder_icon,
- 0, 0, icon_x, icon_y,
- MIN (E_DAY_VIEW_ICON_WIDTH,
- max_icon_w),
- MIN (E_DAY_VIEW_ICON_HEIGHT,
- max_icon_h),
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- icon_x += icon_x_inc;
- icon_y += icon_y_inc;
- }
-
- if (draw_recurrence_icon) {
- max_icon_w = item_x + item_w - icon_x
- - E_DAY_VIEW_EVENT_BORDER_WIDTH;
- max_icon_h = item_y + item_h - icon_y
- - E_DAY_VIEW_EVENT_BORDER_HEIGHT;
-
- gdk_gc_set_clip_mask (gc, NULL);
- gdk_draw_pixbuf (drawable, gc,
- day_view->recurrence_icon,
- 0, 0, icon_x, icon_y,
- MIN (E_DAY_VIEW_ICON_WIDTH,
- max_icon_w),
- MIN (E_DAY_VIEW_ICON_HEIGHT,
- max_icon_h),
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- icon_x += icon_x_inc;
- icon_y += icon_y_inc;
- }
- if (draw_attach_icon) {
- max_icon_w = item_x + item_w - icon_x
- - E_DAY_VIEW_EVENT_BORDER_WIDTH;
- max_icon_h = item_y + item_h - icon_y
- - E_DAY_VIEW_EVENT_BORDER_HEIGHT;
-
- gdk_gc_set_clip_mask (gc, NULL);
- gdk_draw_pixbuf (drawable, gc,
- day_view->attach_icon,
- 0, 0, icon_x, icon_y,
- MIN (E_DAY_VIEW_ICON_WIDTH,
- max_icon_w),
- MIN (E_DAY_VIEW_ICON_HEIGHT,
- max_icon_h),
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- icon_x += icon_x_inc;
- icon_y += icon_y_inc;
- }
- if (draw_timezone_icon) {
- max_icon_w = item_x + item_w - icon_x
- - E_DAY_VIEW_EVENT_BORDER_WIDTH;
- max_icon_h = item_y + item_h - icon_y
- - E_DAY_VIEW_EVENT_BORDER_HEIGHT;
-
- gdk_gc_set_clip_mask (gc, NULL);
- gdk_draw_pixbuf (drawable, gc,
- day_view->timezone_icon,
- 0, 0, icon_x, icon_y,
- MIN (E_DAY_VIEW_ICON_WIDTH,
- max_icon_w),
- MIN (E_DAY_VIEW_ICON_HEIGHT,
- max_icon_h),
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- icon_x += icon_x_inc;
- icon_y += icon_y_inc;
- }
-
-
- if (draw_meeting_icon) {
- max_icon_w = item_x + item_w - icon_x
- - E_DAY_VIEW_EVENT_BORDER_WIDTH;
- max_icon_h = item_y + item_h - icon_y
- - E_DAY_VIEW_EVENT_BORDER_HEIGHT;
-
- gdk_gc_set_clip_mask (gc, NULL);
- gdk_draw_pixbuf (drawable, gc,
- day_view->meeting_icon,
- 0, 0, icon_x, icon_y,
- MIN (E_DAY_VIEW_ICON_WIDTH,
- max_icon_w),
- MIN (E_DAY_VIEW_ICON_HEIGHT,
- max_icon_h),
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- icon_x += icon_x_inc;
- icon_y += icon_y_inc;
- }
-
- /* draw categories icons */
- for (elem = categories_list; elem; elem = elem->next) {
- char *category;
- GdkPixmap *pixmap = NULL;
- GdkBitmap *mask = NULL;
-
- category = (char *) elem->data;
- if (!e_categories_config_get_icon_for (category, &pixmap, &mask))
- continue;
-
- max_icon_w = item_x + item_w - icon_x
- - E_DAY_VIEW_EVENT_BORDER_WIDTH;
- max_icon_h = item_y + item_h - icon_y
- - E_DAY_VIEW_EVENT_BORDER_HEIGHT;
-
- gdk_gc_set_clip_origin (gc, icon_x, icon_y);
- if (mask != NULL)
- gdk_gc_set_clip_mask (gc, mask);
- gdk_draw_pixmap (drawable, gc,
- pixmap,
- 0, 0, icon_x, icon_y,
- MIN (E_DAY_VIEW_ICON_WIDTH,
- max_icon_w),
- MIN (E_DAY_VIEW_ICON_HEIGHT,
- max_icon_h));
-
- gdk_pixmap_unref (pixmap);
- if (mask != NULL)
- gdk_bitmap_unref (mask);
-
- icon_x += icon_x_inc;
- icon_y += icon_y_inc;
- }
-
- gdk_gc_set_clip_mask (gc, NULL);
- }
-
- /* free memory */
- e_cal_component_free_categories_list (categories_list);
- g_object_unref (comp);
-}
-
-
-/* This is supposed to return the nearest item to the point and the distance.
- Since we are the only item we just return ourself and 0 for the distance.
- This is needed so that we get button/motion events. */
-static double
-e_day_view_main_item_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- *actual_item = item;
- return 0.0;
-}
-
-
-static gint
-e_day_view_main_item_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- EDayViewMainItem *dvtitem;
-
- dvtitem = E_DAY_VIEW_MAIN_ITEM (item);
-
- switch (event->type) {
- case GDK_BUTTON_PRESS:
-
- case GDK_BUTTON_RELEASE:
-
- case GDK_MOTION_NOTIFY:
-
- default:
- break;
- }
-
- return FALSE;
-}
-
-
diff --git a/calendar/gui/e-day-view-main-item.h b/calendar/gui/e-day-view-main-item.h
deleted file mode 100644
index be7f130606..0000000000
--- a/calendar/gui/e-day-view-main-item.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 1999, Ximian, Inc.
- * Copyright 1999, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-#ifndef _E_DAY_VIEW_MAIN_ITEM_H_
-#define _E_DAY_VIEW_MAIN_ITEM_H_
-
-#include "e-day-view.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * EDayViewMainItem - canvas item which displays most of the appointment
- * data in the main Day/Work Week display.
- */
-
-#define E_DAY_VIEW_MAIN_ITEM(obj) (GTK_CHECK_CAST((obj), \
- e_day_view_main_item_get_type (), EDayViewMainItem))
-#define E_DAY_VIEW_MAIN_ITEM_CLASS(k) (GTK_CHECK_CLASS_CAST ((k),\
- e_day_view_main_item_get_type ()))
-#define E_IS_DAY_VIEW_MAIN_ITEM(o) (GTK_CHECK_TYPE((o), \
- e_day_view_main_item_get_type ()))
-
-typedef struct {
- GnomeCanvasItem canvas_item;
-
- /* The parent EDayView widget. */
- EDayView *day_view;
-} EDayViewMainItem;
-
-typedef struct {
- GnomeCanvasItemClass parent_class;
-
-} EDayViewMainItemClass;
-
-
-GtkType e_day_view_main_item_get_type (void);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_DAY_VIEW_MAIN_ITEM_H_ */
diff --git a/calendar/gui/e-day-view-time-item.c b/calendar/gui/e-day-view-time-item.c
deleted file mode 100644
index db4b66e54b..0000000000
--- a/calendar/gui/e-day-view-time-item.c
+++ /dev/null
@@ -1,666 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 1999, Ximian, Inc.
- * Copyright 1999, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * EDayViewTimeItem - canvas item which displays the times down the left of
- * the EDayView.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <glib.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkradiomenuitem.h>
-#include <gtk/gtkcheckmenuitem.h>
-#include <libgnome/gnome-i18n.h>
-#include <gal/widgets/e-gui-utils.h>
-#include "e-day-view-time-item.h"
-#include "calendar-config.h"
-
-
-/* The spacing between items in the time column. GRID_X_PAD is the space down
- either side of the column, i.e. outside the main horizontal grid lines.
- HOUR_L_PAD & HOUR_R_PAD are the spaces on the left & right side of the
- big hour number (this is inside the horizontal grid lines).
- MIN_X_PAD is the spacing either side of the minute number. The smaller
- horizontal grid lines match with this.
- 60_MIN_X_PAD is the space either side of the HH:MM display used when
- we are displaying 60 mins per row (inside the main grid lines).
- LARGE_HOUR_Y_PAD is the offset of the large hour string from the top of the
- row.
- SMALL_FONT_Y_PAD is the offset of the small time/minute string from the top
- of the row. */
-#define E_DVTMI_TIME_GRID_X_PAD 4
-#define E_DVTMI_HOUR_L_PAD 4
-#define E_DVTMI_HOUR_R_PAD 2
-#define E_DVTMI_MIN_X_PAD 2
-#define E_DVTMI_60_MIN_X_PAD 4
-#define E_DVTMI_LARGE_HOUR_Y_PAD 1
-#define E_DVTMI_SMALL_FONT_Y_PAD 1
-
-static void e_day_view_time_item_set_arg (GtkObject *o,
- GtkArg *arg,
- guint arg_id);
-
-static void e_day_view_time_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path, int flags);
-static void e_day_view_time_item_draw (GnomeCanvasItem *item,
- GdkDrawable *drawable,
- int x, int y,
- int width, int height);
-static double e_day_view_time_item_point (GnomeCanvasItem *item,
- double x, double y,
- int cx, int cy,
- GnomeCanvasItem **actual_item);
-static gint e_day_view_time_item_event (GnomeCanvasItem *item,
- GdkEvent *event);
-static void e_day_view_time_item_increment_time (gint *hour,
- gint *minute,
- gint mins_per_row);
-static void e_day_view_time_item_show_popup_menu (EDayViewTimeItem *dvtmitem,
- GdkEvent *event);
-static void e_day_view_time_item_on_set_divisions (GtkWidget *item,
- EDayViewTimeItem *dvtmitem);
-static void e_day_view_time_item_on_button_press (EDayViewTimeItem *dvtmitem,
- GdkEvent *event);
-static void e_day_view_time_item_on_button_release (EDayViewTimeItem *dvtmitem,
- GdkEvent *event);
-static void e_day_view_time_item_on_motion_notify (EDayViewTimeItem *dvtmitem,
- GdkEvent *event);
-static gint e_day_view_time_item_convert_position_to_row (EDayViewTimeItem *dvtmitem,
- gint y);
-
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_DAY_VIEW
-};
-
-G_DEFINE_TYPE (EDayViewTimeItem, e_day_view_time_item, GNOME_TYPE_CANVAS_ITEM);
-
-static void
-e_day_view_time_item_class_init (EDayViewTimeItemClass *class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass *) class;
- item_class = (GnomeCanvasItemClass *) class;
-
- gtk_object_add_arg_type ("EDayViewTimeItem::day_view",
- GTK_TYPE_POINTER, GTK_ARG_WRITABLE,
- ARG_DAY_VIEW);
-
- object_class->set_arg = e_day_view_time_item_set_arg;
-
- /* GnomeCanvasItem method overrides */
- item_class->update = e_day_view_time_item_update;
- item_class->draw = e_day_view_time_item_draw;
- item_class->point = e_day_view_time_item_point;
- item_class->event = e_day_view_time_item_event;
-}
-
-
-static void
-e_day_view_time_item_init (EDayViewTimeItem *dvtmitem)
-{
- dvtmitem->dragging_selection = FALSE;
-}
-
-
-static void
-e_day_view_time_item_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EDayViewTimeItem *dvtmitem;
-
- item = GNOME_CANVAS_ITEM (o);
- dvtmitem = E_DAY_VIEW_TIME_ITEM (o);
-
- switch (arg_id){
- case ARG_DAY_VIEW:
- dvtmitem->day_view = GTK_VALUE_POINTER (*arg);
- break;
- }
-}
-
-
-static void
-e_day_view_time_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path,
- int flags)
-{
- if (GNOME_CANVAS_ITEM_CLASS (e_day_view_time_item_parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (e_day_view_time_item_parent_class)->update) (item, affine, clip_path, flags);
-
- /* The item covers the entire canvas area. */
- item->x1 = 0;
- item->y1 = 0;
- item->x2 = INT_MAX;
- item->y2 = INT_MAX;
-}
-
-
-/* Returns the minimum width needed for the column, by adding up all the
- maximum widths of the strings. The string widths are all calculated in
- the style_set handlers of EDayView and EDayViewTimeCanvas. */
-gint
-e_day_view_time_item_get_column_width (EDayViewTimeItem *dvtmitem)
-{
- EDayView *day_view;
- GtkStyle *style;
- gint digit, large_digit_width, max_large_digit_width = 0;
- gint max_suffix_width, max_minute_or_suffix_width;
- gint column_width_default, column_width_60_min_rows;
- PangoContext *context;
-
- day_view = dvtmitem->day_view;
- g_return_val_if_fail (day_view != NULL, 0);
-
- style = gtk_widget_get_style (GTK_WIDGET (day_view));
- g_return_val_if_fail (style != NULL, 0);
-
- context = gtk_widget_get_pango_context (GTK_WIDGET (day_view));
-
- /* Find the maximum width a digit can have. FIXME: We could use pango's
- * approximation function, but I worry it won't be precise enough. Also
- * it needs a language tag that I don't know where to get. */
- for (digit = '0'; digit <= '9'; digit++) {
- PangoLayout *layout;
- gchar digit_str [2];
-
- digit_str [0] = digit;
- digit_str [1] = '\0';
-
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), digit_str);
- pango_layout_set_font_description (layout, day_view->large_font_desc);
- pango_layout_get_pixel_size (layout, &large_digit_width, NULL);
- g_object_unref (layout);
-
- max_large_digit_width = MAX (max_large_digit_width,
- large_digit_width);
- }
-
- /* Calculate the width of each time column, using the maximum of the
- default format with large hour numbers, and the 60-min divisions
- format which uses small text. */
- max_suffix_width = MAX (day_view->am_string_width,
- day_view->pm_string_width);
-
- max_minute_or_suffix_width = MAX (max_suffix_width,
- day_view->max_minute_width);
-
- column_width_default = max_large_digit_width * 2
- + max_minute_or_suffix_width
- + E_DVTMI_MIN_X_PAD * 2
- + E_DVTMI_HOUR_L_PAD
- + E_DVTMI_HOUR_R_PAD
- + E_DVTMI_TIME_GRID_X_PAD * 2;
-
- column_width_60_min_rows = day_view->max_small_hour_width
- + day_view->colon_width
- + max_minute_or_suffix_width
- + E_DVTMI_60_MIN_X_PAD * 2
- + E_DVTMI_TIME_GRID_X_PAD * 2;
-
- dvtmitem->column_width = MAX (column_width_default,
- column_width_60_min_rows);
-
- return dvtmitem->column_width;
-}
-
-
-/*
- * DRAWING ROUTINES - functions to paint the canvas item.
- */
-
-static void
-e_day_view_time_item_draw (GnomeCanvasItem *canvas_item,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height)
-{
- EDayView *day_view;
- EDayViewTimeItem *dvtmitem;
- GtkStyle *style;
- GdkGC *fg_gc, *dark_gc;
- gchar buffer[64], *suffix;
- gint hour, display_hour, minute, row;
- gint row_y, start_y, large_hour_y_offset, small_font_y_offset;
- gint long_line_x1, long_line_x2, short_line_x1;
- gint large_hour_x2, minute_x2;
- gint hour_width, minute_width, suffix_width;
- gint max_suffix_width, max_minute_or_suffix_width;
- PangoLayout *layout;
- PangoContext *context;
- PangoFontDescription *small_font_desc;
- PangoFontMetrics *large_font_metrics, *small_font_metrics;
-
- dvtmitem = E_DAY_VIEW_TIME_ITEM (canvas_item);
- day_view = dvtmitem->day_view;
- g_return_if_fail (day_view != NULL);
-
- style = gtk_widget_get_style (GTK_WIDGET (day_view));
- small_font_desc = style->font_desc;
-
- context = gtk_widget_get_pango_context (GTK_WIDGET (day_view));
- large_font_metrics = pango_context_get_metrics (context, day_view->large_font_desc,
- pango_context_get_language (context));
- small_font_metrics = pango_context_get_metrics (context, small_font_desc,
- pango_context_get_language (context));
-
- fg_gc = style->fg_gc[GTK_STATE_NORMAL];
- dark_gc = style->dark_gc[GTK_STATE_NORMAL];
-
- /* The start and end of the long horizontal line between hours. */
- long_line_x1 = E_DVTMI_TIME_GRID_X_PAD - x;
- long_line_x2 = dvtmitem->column_width - E_DVTMI_TIME_GRID_X_PAD - x;
-
- if (day_view->mins_per_row == 60) {
- /* The right edge of the complete time string in 60-min
- divisions, e.g. "14:00" or "2 pm". */
- minute_x2 = long_line_x2 - E_DVTMI_60_MIN_X_PAD;
-
- /* These aren't used for 60-minute divisions, but we initialize
- them to keep gcc happy. */
- short_line_x1 = 0;
- large_hour_x2 = 0;
- } else {
- max_suffix_width = MAX (day_view->am_string_width,
- day_view->pm_string_width);
-
- max_minute_or_suffix_width = MAX (max_suffix_width,
- day_view->max_minute_width);
-
- /* The start of the short horizontal line between the periods
- within each hour. */
- short_line_x1 = long_line_x2 - E_DVTMI_MIN_X_PAD * 2
- - max_minute_or_suffix_width;
-
- /* The right edge of the large hour string. */
- large_hour_x2 = short_line_x1 - E_DVTMI_HOUR_R_PAD;
-
- /* The right edge of the minute part of the time. */
- minute_x2 = long_line_x2 - E_DVTMI_MIN_X_PAD;
- }
-
- /* Start with the first hour & minute shown in the EDayView. */
- hour = day_view->first_hour_shown;
- minute = day_view->first_minute_shown;
-
- /* The offset of the large hour string from the top of the row. */
- large_hour_y_offset = E_DVTMI_LARGE_HOUR_Y_PAD;
-
- /* The offset of the small time/minute string from top of row. */
- small_font_y_offset = E_DVTMI_SMALL_FONT_Y_PAD;
-
- /* Calculate the minimum y position of the first row we need to draw.
- This is normally one row height above the 0 position, but if we
- are using the large font we may have to go back a bit further. */
- start_y = 0 - MAX (day_view->row_height,
- (pango_font_metrics_get_ascent (large_font_metrics) +
- pango_font_metrics_get_descent (large_font_metrics)) / PANGO_SCALE +
- E_DVTMI_LARGE_HOUR_Y_PAD);
-
- /* Step through each row, drawing the times and the horizontal lines
- between them. */
- for (row = 0, row_y = 0 - y;
- row < day_view->rows && row_y < height;
- row++, row_y += day_view->row_height) {
-
- /* If the row is above the first row we want to draw just
- increment the time and skip to the next row. */
- if (row_y < start_y) {
- e_day_view_time_item_increment_time (&hour, &minute,
- day_view->mins_per_row);
- continue;
- }
-
- /* Calculate the actual hour number to display. For 12-hour
- format we convert 0-23 to 12-11am/12-11pm. */
- e_day_view_convert_time_to_display (day_view, hour,
- &display_hour,
- &suffix, &suffix_width);
-
- if (day_view->mins_per_row == 60) {
- /* 60 minute intervals - draw a long horizontal line
- between hours and display as one long string,
- e.g. "14:00" or "2 pm". */
- gdk_draw_line (drawable, dark_gc,
- long_line_x1, row_y,
- long_line_x2, row_y);
-
- if (e_calendar_view_get_use_24_hour_format (E_CALENDAR_VIEW (day_view))) {
- g_snprintf (buffer, sizeof (buffer), "%i:%02i",
- display_hour, minute);
- } else {
- g_snprintf (buffer, sizeof (buffer), "%i %s",
- display_hour, suffix);
- }
-
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), buffer);
- pango_layout_get_pixel_size (layout, &minute_width, NULL);
- gdk_draw_layout (drawable, fg_gc,
- minute_x2 - minute_width,
- row_y + small_font_y_offset,
- layout);
- g_object_unref (layout);
- } else {
- /* 5/10/15/30 minute intervals. */
-
- if (minute == 0) {
- /* On the hour - draw a long horizontal line
- before the hour and display the hour in the
- large font. */
- gdk_draw_line (drawable, dark_gc,
- long_line_x1, row_y,
- long_line_x2, row_y);
-
- g_snprintf (buffer, sizeof (buffer), "%i",
- display_hour);
-
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), buffer);
- pango_layout_set_font_description (layout, day_view->large_font_desc);
- pango_layout_get_pixel_size (layout, &hour_width, NULL);
- gdk_draw_layout (drawable, fg_gc,
- large_hour_x2 - hour_width,
- row_y + large_hour_y_offset,
- layout);
- g_object_unref (layout);
- } else {
- /* Within the hour - draw a short line before
- the time. */
- gdk_draw_line (drawable, dark_gc,
- short_line_x1, row_y,
- long_line_x2, row_y);
- }
-
- /* Normally we display the minute in each
- interval, but when using 30-minute intervals
- we don't display the '30'. */
- if (day_view->mins_per_row != 30 || minute != 30) {
- /* In 12-hour format we display 'am' or 'pm'
- instead of '00'. */
- if (minute == 0
- && !e_calendar_view_get_use_24_hour_format (E_CALENDAR_VIEW (day_view))) {
- strcpy (buffer, suffix);
- } else {
- g_snprintf (buffer, sizeof (buffer),
- "%02i", minute);
- }
-
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), buffer);
- pango_layout_get_pixel_size (layout, &minute_width, NULL);
- gdk_draw_layout (drawable, fg_gc,
- minute_x2 - minute_width,
- row_y + small_font_y_offset,
- layout);
- g_object_unref (layout);
- }
- }
-
- e_day_view_time_item_increment_time (&hour, &minute,
- day_view->mins_per_row);
- }
-
- pango_font_metrics_unref (large_font_metrics);
- pango_font_metrics_unref (small_font_metrics);
-}
-
-
-/* Increment the time by the 5/10/15/30/60 minute interval.
- Note that mins_per_row is never > 60, so we never have to
- worry about adding more than 60 minutes. */
-static void
-e_day_view_time_item_increment_time (gint *hour,
- gint *minute,
- gint mins_per_row)
-{
- *minute += mins_per_row;
- if (*minute >= 60) {
- *minute -= 60;
- /* Currently we never wrap around to the next day, but
- we may do if we display extra timezones. */
- *hour = (*hour + 1) % 24;
- }
-}
-
-
-static double
-e_day_view_time_item_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- *actual_item = item;
- return 0.0;
-}
-
-
-static gint
-e_day_view_time_item_event (GnomeCanvasItem *item,
- GdkEvent *event)
-{
- EDayViewTimeItem *dvtmitem;
-
- dvtmitem = E_DAY_VIEW_TIME_ITEM (item);
-
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- if (event->button.button == 1) {
- e_day_view_time_item_on_button_press (dvtmitem, event);
- } else if (event->button.button == 3) {
- e_day_view_time_item_show_popup_menu (dvtmitem, event);
- return TRUE;
- }
- break;
- case GDK_BUTTON_RELEASE:
- if (event->button.button == 1)
- e_day_view_time_item_on_button_release (dvtmitem,
- event);
- break;
-
- case GDK_MOTION_NOTIFY:
- e_day_view_time_item_on_motion_notify (dvtmitem, event);
- break;
-
- default:
- break;
- }
-
- return FALSE;
-}
-
-
-static void
-e_day_view_time_item_show_popup_menu (EDayViewTimeItem *dvtmitem,
- GdkEvent *event)
-{
- static gint divisions[] = { 60, 30, 15, 10, 5 };
- EDayView *day_view;
- gint num_divisions = sizeof (divisions) / sizeof (divisions[0]);
- GtkWidget *menu, *item;
- gchar buffer[256];
- GSList *group = NULL;
- gint current_divisions, i;
-
- day_view = dvtmitem->day_view;
- g_return_if_fail (day_view != NULL);
-
- current_divisions = e_day_view_get_mins_per_row (day_view);
-
- menu = gtk_menu_new ();
-
- /* Make sure the menu is destroyed when it disappears. */
- e_auto_kill_popup_menu_on_selection_done (GTK_MENU (menu));
-
- for (i = 0; i < num_divisions; i++) {
- g_snprintf (buffer, sizeof (buffer),
- _("%02i minute divisions"), divisions[i]);
- item = gtk_radio_menu_item_new_with_label (group, buffer);
- group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (item));
- gtk_widget_show (item);
- gtk_menu_append (GTK_MENU (menu), item);
-
- if (current_divisions == divisions[i])
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
-
- g_object_set_data (G_OBJECT (item), "divisions",
- GINT_TO_POINTER (divisions[i]));
-
- g_signal_connect (item, "toggled",
- G_CALLBACK (e_day_view_time_item_on_set_divisions), dvtmitem);
- }
-
- gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
- event->button.button, event->button.time);
-}
-
-
-static void
-e_day_view_time_item_on_set_divisions (GtkWidget *item,
- EDayViewTimeItem *dvtmitem)
-{
- EDayView *day_view;
- gint divisions;
-
- day_view = dvtmitem->day_view;
- g_return_if_fail (day_view != NULL);
-
- if (!gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (item)))
- return;
-
- divisions = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item), "divisions"));
- e_day_view_set_mins_per_row (day_view, divisions);
- calendar_config_set_time_divisions (divisions);
-}
-
-
-static void
-e_day_view_time_item_on_button_press (EDayViewTimeItem *dvtmitem,
- GdkEvent *event)
-{
- EDayView *day_view;
- GnomeCanvas *canvas;
- gint row;
-
- day_view = dvtmitem->day_view;
- g_return_if_fail (day_view != NULL);
-
- canvas = GNOME_CANVAS_ITEM (dvtmitem)->canvas;
-
- row = e_day_view_time_item_convert_position_to_row (dvtmitem,
- event->button.y);
-
- if (row == -1)
- return;
-
- if (!GTK_WIDGET_HAS_FOCUS (day_view))
- gtk_widget_grab_focus (GTK_WIDGET (day_view));
-
- if (gdk_pointer_grab (GTK_LAYOUT (canvas)->bin_window, FALSE,
- GDK_POINTER_MOTION_MASK
- | GDK_BUTTON_RELEASE_MASK,
- FALSE, NULL, event->button.time) == 0) {
- e_day_view_start_selection (day_view, -1, row);
- dvtmitem->dragging_selection = TRUE;
- }
-}
-
-
-static void
-e_day_view_time_item_on_button_release (EDayViewTimeItem *dvtmitem,
- GdkEvent *event)
-{
- EDayView *day_view;
-
- day_view = dvtmitem->day_view;
- g_return_if_fail (day_view != NULL);
-
- if (dvtmitem->dragging_selection) {
- gdk_pointer_ungrab (event->button.time);
- e_day_view_finish_selection (day_view);
- e_day_view_stop_auto_scroll (day_view);
- }
-
- dvtmitem->dragging_selection = FALSE;
-}
-
-
-static void
-e_day_view_time_item_on_motion_notify (EDayViewTimeItem *dvtmitem,
- GdkEvent *event)
-{
- EDayView *day_view;
- GnomeCanvas *canvas;
- gdouble window_y;
- gint y, row;
-
- if (!dvtmitem->dragging_selection)
- return;
-
- day_view = dvtmitem->day_view;
- g_return_if_fail (day_view != NULL);
-
- canvas = GNOME_CANVAS_ITEM (dvtmitem)->canvas;
-
- y = event->motion.y;
- row = e_day_view_time_item_convert_position_to_row (dvtmitem, y);
-
- if (row != -1) {
- gnome_canvas_world_to_window (canvas, 0, event->motion.y,
- NULL, &window_y);
- e_day_view_update_selection (day_view, -1, row);
- e_day_view_check_auto_scroll (day_view, -1, (gint) window_y);
- }
-}
-
-
-/* Returns the row corresponding to the y position, or -1. */
-static gint
-e_day_view_time_item_convert_position_to_row (EDayViewTimeItem *dvtmitem,
- gint y)
-{
- EDayView *day_view;
- gint row;
-
- day_view = dvtmitem->day_view;
- g_return_val_if_fail (day_view != NULL, -1);
-
- if (y < 0)
- return -1;
-
- row = y / day_view->row_height;
- if (row >= day_view->rows)
- return -1;
-
- return row;
-}
diff --git a/calendar/gui/e-day-view-time-item.h b/calendar/gui/e-day-view-time-item.h
deleted file mode 100644
index f425363c98..0000000000
--- a/calendar/gui/e-day-view-time-item.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 1999, Ximian, Inc.
- * Copyright 1999, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-#ifndef _E_DAY_VIEW_TIME_ITEM_H_
-#define _E_DAY_VIEW_TIME_ITEM_H_
-
-#include "e-day-view.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * EDayViewTimeItem - canvas item which displays the times down the left of
- * the EDayView.
- */
-
-#define E_DAY_VIEW_TIME_ITEM(obj) (GTK_CHECK_CAST((obj), \
- e_day_view_time_item_get_type (), EDayViewTimeItem))
-#define E_DAY_VIEW_TIME_ITEM_CLASS(k) (GTK_CHECK_CLASS_CAST ((k),\
- e_day_view_time_item_get_type ()))
-#define E_IS_DAY_VIEW_TIME_ITEM(o) (GTK_CHECK_TYPE((o), \
- e_day_view_time_item_get_type ()))
-
-typedef struct {
- GnomeCanvasItem canvas_item;
-
- /* The parent EDayView widget. */
- EDayView *day_view;
-
- /* The width of the time column. */
- gint column_width;
-
- /* TRUE if we are currently dragging the selection times. */
- gboolean dragging_selection;
-} EDayViewTimeItem;
-
-typedef struct {
- GnomeCanvasItemClass parent_class;
-
-} EDayViewTimeItemClass;
-
-
-GtkType e_day_view_time_item_get_type (void);
-
-
-gint e_day_view_time_item_get_column_width (EDayViewTimeItem *dvtmitem);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_DAY_VIEW_TIME_ITEM_H_ */
diff --git a/calendar/gui/e-day-view-top-item.c b/calendar/gui/e-day-view-top-item.c
deleted file mode 100644
index a733a7ec17..0000000000
--- a/calendar/gui/e-day-view-top-item.c
+++ /dev/null
@@ -1,728 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 1999, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * EDayViewTopItem - displays the top part of the Day/Work Week calendar view.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include <libgnome/gnome-i18n.h>
-#include "e-util/e-categories-config.h"
-#include <libecal/e-cal-time-util.h>
-#include "e-day-view-top-item.h"
-
-static void e_day_view_top_item_set_arg (GtkObject *o,
- GtkArg *arg,
- guint arg_id);
-static void e_day_view_top_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path,
- int flags);
-static void e_day_view_top_item_draw (GnomeCanvasItem *item,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height);
-static void e_day_view_top_item_draw_long_event (EDayViewTopItem *dvtitem,
- gint event_num,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height);
-static void e_day_view_top_item_draw_triangle (EDayViewTopItem *dvtitem,
- GdkDrawable *drawable,
- gint x,
- gint y,
- gint w,
- gint h,
- gint event_num);
-static double e_day_view_top_item_point (GnomeCanvasItem *item,
- double x,
- double y,
- int cx,
- int cy,
- GnomeCanvasItem **actual_item);
-static gint e_day_view_top_item_event (GnomeCanvasItem *item,
- GdkEvent *event);
-
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_DAY_VIEW
-};
-
-G_DEFINE_TYPE (EDayViewTopItem, e_day_view_top_item, GNOME_TYPE_CANVAS_ITEM);
-
-static void
-e_day_view_top_item_class_init (EDayViewTopItemClass *class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass *) class;
- item_class = (GnomeCanvasItemClass *) class;
-
- gtk_object_add_arg_type ("EDayViewTopItem::day_view",
- GTK_TYPE_POINTER, GTK_ARG_WRITABLE,
- ARG_DAY_VIEW);
-
- object_class->set_arg = e_day_view_top_item_set_arg;
-
- /* GnomeCanvasItem method overrides */
- item_class->update = e_day_view_top_item_update;
- item_class->draw = e_day_view_top_item_draw;
- item_class->point = e_day_view_top_item_point;
- item_class->event = e_day_view_top_item_event;
-}
-
-
-static void
-e_day_view_top_item_init (EDayViewTopItem *dvtitem)
-{
- dvtitem->day_view = NULL;
-}
-
-
-static void
-e_day_view_top_item_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EDayViewTopItem *dvtitem;
-
- item = GNOME_CANVAS_ITEM (o);
- dvtitem = E_DAY_VIEW_TOP_ITEM (o);
-
- switch (arg_id){
- case ARG_DAY_VIEW:
- dvtitem->day_view = GTK_VALUE_POINTER (*arg);
- break;
- }
-}
-
-
-static void
-e_day_view_top_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path,
- int flags)
-{
- if (GNOME_CANVAS_ITEM_CLASS (e_day_view_top_item_parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (e_day_view_top_item_parent_class)->update) (item, affine, clip_path, flags);
-
- /* The item covers the entire canvas area. */
- item->x1 = 0;
- item->y1 = 0;
- item->x2 = INT_MAX;
- item->y2 = INT_MAX;
-}
-
-
-/*
- * DRAWING ROUTINES - functions to paint the canvas item.
- */
-
-static void
-e_day_view_top_item_draw (GnomeCanvasItem *canvas_item,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height)
-{
- EDayViewTopItem *dvtitem;
- EDayView *day_view;
- GtkStyle *style;
- GdkGC *gc, *fg_gc, *bg_gc, *light_gc, *dark_gc;
- gchar buffer[128];
- GdkRectangle clip_rect;
- gint canvas_width, canvas_height, left_edge, day, date_width, date_x;
- gint item_height, event_num;
- PangoLayout *layout;
-
-#if 0
- g_print ("In e_day_view_top_item_draw %i,%i %ix%i\n",
- x, y, width, height);
-#endif
- dvtitem = E_DAY_VIEW_TOP_ITEM (canvas_item);
- day_view = dvtitem->day_view;
- g_return_if_fail (day_view != NULL);
-
- style = gtk_widget_get_style (GTK_WIDGET (day_view));
- gc = day_view->main_gc;
- fg_gc = style->fg_gc[GTK_STATE_NORMAL];
- bg_gc = style->bg_gc[GTK_STATE_NORMAL];
- light_gc = style->light_gc[GTK_STATE_NORMAL];
- dark_gc = style->dark_gc[GTK_STATE_NORMAL];
- canvas_width = GTK_WIDGET (canvas_item->canvas)->allocation.width;
- canvas_height = GTK_WIDGET (canvas_item->canvas)->allocation.height;
- left_edge = 0;
- item_height = day_view->top_row_height - E_DAY_VIEW_TOP_CANVAS_Y_GAP;
-
- /* Draw the shadow around the dates. */
- gdk_draw_line (drawable, light_gc,
- left_edge - x, 1 - y,
- canvas_width - 2 - x, 1 - y);
- gdk_draw_line (drawable, light_gc,
- left_edge - x, 2 - y,
- left_edge - x, item_height - 2 - y);
- gdk_draw_line (drawable, dark_gc,
- left_edge - x, item_height - 1 - y,
- canvas_width - 1 - x, item_height - 1 - y);
- gdk_draw_line (drawable, dark_gc,
- canvas_width - 1 - x, 1 - y,
- canvas_width - 1 - x, item_height - 1 - y);
-
- /* Draw the background for the dates. */
- gdk_draw_rectangle (drawable, bg_gc, TRUE,
- left_edge + 2 - x, 2 - y,
- canvas_width - left_edge - 3,
- item_height - 3);
-
- /* Clear the main area background. */
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS]);
- gdk_draw_rectangle (drawable, gc, TRUE,
- left_edge - x, item_height - y,
- canvas_width - left_edge,
- canvas_height - item_height);
-
- /* Draw the selection background. */
- if (GTK_WIDGET_HAS_FOCUS (day_view)
- && day_view->selection_start_day != -1) {
- gint start_col, end_col, rect_x, rect_y, rect_w, rect_h;
-
- start_col = day_view->selection_start_day;
- end_col = day_view->selection_end_day;
-
- if (end_col > start_col
- || day_view->selection_start_row == -1
- || day_view->selection_end_row == -1) {
- rect_x = day_view->day_offsets[start_col];
- rect_y = item_height;
- rect_w = day_view->day_offsets[end_col + 1] - rect_x;
- rect_h = canvas_height - 1 - rect_y;
-
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_SELECTED]);
- gdk_draw_rectangle (drawable, gc, TRUE,
- rect_x - x, rect_y - y,
- rect_w, rect_h);
- }
- }
-
- /* Draw the date. Set a clipping rectangle so we don't draw over the
- next day. */
- for (day = 0; day < day_view->days_shown; day++) {
- e_day_view_top_item_get_day_label (day_view, day,
- buffer, sizeof (buffer));
- clip_rect.x = day_view->day_offsets[day] - x;
- clip_rect.y = 2 - y;
- clip_rect.width = day_view->day_widths[day];
- clip_rect.height = item_height - 2;
- gdk_gc_set_clip_rectangle (fg_gc, &clip_rect);
-
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), buffer);
- pango_layout_get_pixel_size (layout, &date_width, NULL);
- date_x = day_view->day_offsets[day] + (day_view->day_widths[day] - date_width) / 2;
-
- gdk_draw_layout (drawable, fg_gc,
- date_x - x,
- 3 - y,
- layout);
- g_object_unref (layout);
-
- gdk_gc_set_clip_rectangle (fg_gc, NULL);
-
- /* Draw the lines down the left and right of the date cols. */
- if (day != 0) {
- gdk_draw_line (drawable, light_gc,
- day_view->day_offsets[day] - x,
- 4 - y,
- day_view->day_offsets[day] - x,
- item_height - 4 - y);
-
- gdk_draw_line (drawable, dark_gc,
- day_view->day_offsets[day] - 1 - x,
- 4 - y,
- day_view->day_offsets[day] - 1 - x,
- item_height - 4 - y);
- }
-
- /* Draw the lines between each column. */
- if (day != 0) {
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_GRID]);
- gdk_draw_line (drawable, gc,
- day_view->day_offsets[day] - x,
- item_height - y,
- day_view->day_offsets[day] - x,
- canvas_height - y);
- }
- }
-
- /* Draw the long events. */
- for (event_num = 0; event_num < day_view->long_events->len;
- event_num++) {
- e_day_view_top_item_draw_long_event (dvtitem, event_num,
- drawable,
- x, y, width, height);
- }
-}
-
-
-/* This draws one event in the top canvas. */
-static void
-e_day_view_top_item_draw_long_event (EDayViewTopItem *dvtitem,
- gint event_num,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height)
-{
- EDayView *day_view;
- EDayViewEvent *event;
- GtkStyle *style;
- GdkGC *gc, *fg_gc, *bg_gc;
- gint start_day, end_day;
- gint item_x, item_y, item_w, item_h;
- gint text_x, icon_x, icon_y, icon_x_inc;
- ECalComponent *comp;
- gchar buffer[16];
- gint hour, display_hour, minute, offset, time_width, time_x;
- gint min_end_time_x, suffix_width, max_icon_x;
- gchar *suffix;
- gboolean draw_start_triangle, draw_end_triangle;
- GdkRectangle clip_rect;
- GSList *categories_list, *elem;
- PangoLayout *layout;
- GdkColor bg_color;
-
- day_view = dvtitem->day_view;
-
- /* If the event is currently being dragged, don't draw it. It will
- be drawn in the special drag items. */
- if (day_view->drag_event_day == E_DAY_VIEW_LONG_EVENT
- && day_view->drag_event_num == event_num)
- return;
-
- if (!e_day_view_get_long_event_position (day_view, event_num,
- &start_day, &end_day,
- &item_x, &item_y,
- &item_w, &item_h))
- return;
-
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
-
- style = gtk_widget_get_style (GTK_WIDGET (day_view));
- gc = day_view->main_gc;
- fg_gc = style->fg_gc[GTK_STATE_NORMAL];
- bg_gc = style->bg_gc[GTK_STATE_NORMAL];
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
- /* Draw the lines across the top & bottom of the entire event. */
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER]);
- gdk_draw_line (drawable, gc,
- item_x - x, item_y - y,
- item_x + item_w - 1 - x, item_y - y);
- gdk_draw_line (drawable, gc,
- item_x - x, item_y + item_h - 1 - y,
- item_x + item_w - 1 - x, item_y + item_h - 1 - y);
-
- /* Fill it in. */
- if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)),
- event->comp_data),
- &bg_color)) {
- GdkColormap *colormap;
-
- colormap = gtk_widget_get_colormap (GTK_WIDGET (day_view));
- if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE))
- gdk_gc_set_foreground (gc, &bg_color);
- else
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND]);
- } else
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND]);
- gdk_draw_rectangle (drawable, gc, TRUE,
- item_x - x, item_y + 1 - y,
- item_w, item_h - 2);
-
- /* When resizing we don't draw the triangles.*/
- draw_start_triangle = TRUE;
- draw_end_triangle = TRUE;
- if (day_view->resize_drag_pos != E_CALENDAR_VIEW_POS_NONE
- && day_view->resize_event_day == E_DAY_VIEW_LONG_EVENT
- && day_view->resize_event_num == event_num) {
- if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_LEFT_EDGE)
- draw_start_triangle = FALSE;
-
- if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_RIGHT_EDGE)
- draw_end_triangle = FALSE;
- }
-
- /* If the event starts before the first day shown, draw a triangle,
- else just draw a vertical line down the left. */
- if (draw_start_triangle
- && event->start < day_view->day_starts[start_day]) {
- e_day_view_top_item_draw_triangle (dvtitem, drawable,
- item_x - x, item_y - y,
- -E_DAY_VIEW_BAR_WIDTH,
- item_h, event_num);
- } else {
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER]);
- gdk_draw_line (drawable, gc,
- item_x - x, item_y - y,
- item_x - x, item_y + item_h - 1 - y);
- }
-
- /* Similar for the event end. */
- if (draw_end_triangle
- && event->end > day_view->day_starts[end_day + 1]) {
- e_day_view_top_item_draw_triangle (dvtitem, drawable,
- item_x + item_w - 1 - x,
- item_y - y,
- E_DAY_VIEW_BAR_WIDTH,
- item_h, event_num);
- } else {
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER]);
- gdk_draw_line (drawable, gc,
- item_x + item_w - 1 - x,
- item_y - y,
- item_x + item_w - 1 - x,
- item_y + item_h - 1 - y);
- }
-
- /* If we are editing the event we don't show the icons or the start
- & end times. */
- if (day_view->editing_event_day == E_DAY_VIEW_LONG_EVENT
- && day_view->editing_event_num == event_num)
- return;
-
- /* Determine the position of the label, so we know where to place the
- icons. Note that since the top canvas never scrolls we don't need
- to take the scroll offset into account. It will always be 0. */
- text_x = event->canvas_item->x1;
-
- /* Draw the start & end times, if necessary. */
- min_end_time_x = item_x + E_DAY_VIEW_LONG_EVENT_X_PAD - x;
-
- time_width = e_day_view_get_time_string_width (day_view);
-
- if (event->start > day_view->day_starts[start_day]) {
- offset = day_view->first_hour_shown * 60
- + day_view->first_minute_shown + event->start_minute;
- hour = offset / 60;
- minute = offset % 60;
- /* Calculate the actual hour number to display. For 12-hour
- format we convert 0-23 to 12-11am/12-11pm. */
- e_day_view_convert_time_to_display (day_view, hour,
- &display_hour,
- &suffix, &suffix_width);
- if (e_calendar_view_get_use_24_hour_format (E_CALENDAR_VIEW (day_view))) {
- g_snprintf (buffer, sizeof (buffer), "%i:%02i",
- display_hour, minute);
- } else {
- g_snprintf (buffer, sizeof (buffer), "%i:%02i%s",
- display_hour, minute, suffix);
- }
-
- clip_rect.x = item_x - x;
- clip_rect.y = item_y - y;
- clip_rect.width = item_w - E_DAY_VIEW_LONG_EVENT_BORDER_WIDTH;
- clip_rect.height = item_h;
- gdk_gc_set_clip_rectangle (fg_gc, &clip_rect);
-
- time_x = item_x + E_DAY_VIEW_LONG_EVENT_X_PAD - x;
- if (display_hour < 10)
- time_x += day_view->digit_width;
-
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), buffer);
- gdk_draw_layout (drawable, fg_gc,
- time_x,
- item_y + E_DAY_VIEW_LONG_EVENT_BORDER_HEIGHT +
- E_DAY_VIEW_LONG_EVENT_Y_PAD - y,
- layout);
- g_object_unref (layout);
-
- gdk_gc_set_clip_rectangle (fg_gc, NULL);
-
- min_end_time_x += time_width
- + E_DAY_VIEW_LONG_EVENT_TIME_X_PAD;
- }
-
- max_icon_x = item_x + item_w - E_DAY_VIEW_LONG_EVENT_X_PAD
- - E_DAY_VIEW_ICON_WIDTH;
-
- if (event->end < day_view->day_starts[end_day + 1]) {
- offset = day_view->first_hour_shown * 60
- + day_view->first_minute_shown
- + event->end_minute;
- hour = offset / 60;
- minute = offset % 60;
- time_x = item_x + item_w - E_DAY_VIEW_LONG_EVENT_X_PAD - time_width - E_DAY_VIEW_LONG_EVENT_TIME_X_PAD - x;
-
- if (time_x >= min_end_time_x) {
- /* Calculate the actual hour number to display. */
- e_day_view_convert_time_to_display (day_view, hour,
- &display_hour,
- &suffix,
- &suffix_width);
- if (e_calendar_view_get_use_24_hour_format (E_CALENDAR_VIEW (day_view))) {
- g_snprintf (buffer, sizeof (buffer),
- "%i:%02i", display_hour, minute);
- } else {
- g_snprintf (buffer, sizeof (buffer),
- "%i:%02i%s", display_hour, minute,
- suffix);
- }
-
- if (display_hour < 10)
- time_x += day_view->digit_width;
-
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), buffer);
- gdk_draw_layout (drawable, fg_gc,
- time_x,
- item_y + E_DAY_VIEW_LONG_EVENT_Y_PAD + 1 - y,
- layout);
- g_object_unref (layout);
-
- max_icon_x -= time_width + E_DAY_VIEW_LONG_EVENT_TIME_X_PAD;
- }
- }
-
- /* Draw the icons. */
- icon_x_inc = E_DAY_VIEW_ICON_WIDTH + E_DAY_VIEW_ICON_X_PAD;
- icon_x = text_x - E_DAY_VIEW_LONG_EVENT_ICON_R_PAD
- - icon_x_inc - x;
- icon_y = item_y + E_DAY_VIEW_LONG_EVENT_BORDER_HEIGHT
- + E_DAY_VIEW_ICON_Y_PAD - y;
-
- if (icon_x <= max_icon_x && e_cal_component_has_recurrences (comp)) {
- gdk_gc_set_clip_mask (gc, NULL);
- gdk_draw_pixbuf (drawable, gc,
- day_view->recurrence_icon,
- 0, 0, icon_x, icon_y,
- E_DAY_VIEW_ICON_WIDTH,
- E_DAY_VIEW_ICON_HEIGHT,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- icon_x -= icon_x_inc;
- }
-
- if (icon_x <= max_icon_x && e_cal_component_has_attachments (comp)) {
- gdk_gc_set_clip_mask (gc, NULL);
- gdk_draw_pixbuf (drawable, gc,
- day_view->attach_icon,
- 0, 0, icon_x, icon_y,
- E_DAY_VIEW_ICON_WIDTH,
- E_DAY_VIEW_ICON_HEIGHT,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- icon_x -= icon_x_inc;
- }
- if (icon_x <= max_icon_x && e_cal_component_has_alarms (comp)) {
- gdk_gc_set_clip_mask (gc, NULL);
- gdk_draw_pixbuf (drawable, gc,
- day_view->reminder_icon,
- 0, 0, icon_x, icon_y,
- E_DAY_VIEW_ICON_WIDTH,
- E_DAY_VIEW_ICON_HEIGHT,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- icon_x -= icon_x_inc;
- }
-
- /* draw categories icons */
- e_cal_component_get_categories_list (comp, &categories_list);
- for (elem = categories_list; elem; elem = elem->next) {
- char *category;
- GdkPixmap *pixmap = NULL;
- GdkBitmap *mask = NULL;
-
- category = (char *) elem->data;
- e_categories_config_get_icon_for (category, &pixmap, &mask);
- if (pixmap == NULL)
- continue;
-
- if (icon_x <= max_icon_x) {
- gdk_gc_set_clip_origin (gc, icon_x, icon_y);
- if (mask != NULL)
- gdk_gc_set_clip_mask (gc, mask);
- gdk_draw_pixmap (drawable, gc,
- pixmap,
- 0, 0, icon_x, icon_y,
- E_DAY_VIEW_ICON_WIDTH,
- E_DAY_VIEW_ICON_HEIGHT);
- icon_x -= icon_x_inc;
- }
-
- gdk_pixmap_unref (pixmap);
- if (mask != NULL)
- gdk_bitmap_unref (mask);
- }
-
- e_cal_component_free_categories_list (categories_list);
- g_object_unref (comp);
-
- gdk_gc_set_clip_mask (gc, NULL);
-}
-
-
-/* This draws a little triangle to indicate that an event extends past
- the days visible on screen. */
-static void
-e_day_view_top_item_draw_triangle (EDayViewTopItem *dvtitem,
- GdkDrawable *drawable,
- gint x,
- gint y,
- gint w,
- gint h,
- gint event_num)
-{
- EDayView *day_view;
- EDayViewEvent *event;
- GtkStyle *style;
- GdkGC *gc;
- GdkColor bg_color;
- GdkPoint points[3];
- gint c1, c2;
-
- day_view = dvtitem->day_view;
-
- style = GTK_WIDGET (day_view)->style;
- gc = day_view->main_gc;
-
- points[0].x = x;
- points[0].y = y;
- points[1].x = x + w;
- points[1].y = y + (h / 2);
- points[2].x = x;
- points[2].y = y + h - 1;
-
- /* If the height is odd we can use the same central point for both
- lines. If it is even we use different end-points. */
- c1 = c2 = y + (h / 2);
- if (h % 2 == 0)
- c1--;
-
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
-
- /* Fill it in. */
- if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)),
- event->comp_data),
- &bg_color)) {
- GdkColormap *colormap;
-
- colormap = gtk_widget_get_colormap (GTK_WIDGET (day_view));
- if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE))
- gdk_gc_set_foreground (gc, &bg_color);
- else
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND]);
- } else
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND]);
-
- gdk_draw_polygon (drawable, gc, TRUE, points, 3);
-
- gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER]);
- gdk_draw_line (drawable, gc, x, y, x + w, c1);
- gdk_draw_line (drawable, gc, x, y + h - 1, x + w, c2);
-}
-
-
-/* This is supposed to return the nearest item the the point and the distance.
- Since we are the only item we just return ourself and 0 for the distance.
- This is needed so that we get button/motion events. */
-static double
-e_day_view_top_item_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- *actual_item = item;
- return 0.0;
-}
-
-
-static gint
-e_day_view_top_item_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- EDayViewTopItem *dvtitem;
-
- dvtitem = E_DAY_VIEW_TOP_ITEM (item);
-
- switch (event->type) {
- case GDK_BUTTON_PRESS:
-
- case GDK_BUTTON_RELEASE:
-
- case GDK_MOTION_NOTIFY:
-
- default:
- break;
- }
-
- return FALSE;
-}
-
-void
-e_day_view_top_item_get_day_label (EDayView *day_view, gint day,
- gchar *buffer, gint buffer_len)
-{
- struct icaltimetype day_start_tt;
- struct tm day_start = { 0 };
- gchar *format;
-
- day_start_tt = icaltime_from_timet_with_zone (day_view->day_starts[day],
- FALSE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- day_start.tm_year = day_start_tt.year - 1900;
- day_start.tm_mon = day_start_tt.month - 1;
- day_start.tm_mday = day_start_tt.day;
- day_start.tm_isdst = -1;
-
- day_start.tm_wday = time_day_of_week (day_start_tt.day,
- day_start_tt.month - 1,
- day_start_tt.year);
-
- if (day_view->date_format == E_DAY_VIEW_DATE_FULL)
- /* strftime format %A = full weekday name, %d = day of month,
- %B = full month name. Don't use any other specifiers. */
- format = _("%A %d %B");
- else if (day_view->date_format == E_DAY_VIEW_DATE_ABBREVIATED)
- /* strftime format %a = abbreviated weekday name, %d = day of month,
- %b = abbreviated month name. Don't use any other specifiers. */
- format = _("%a %d %b");
- else if (day_view->date_format == E_DAY_VIEW_DATE_NO_WEEKDAY)
- /* strftime format %d = day of month, %b = abbreviated month name.
- Don't use any other specifiers. */
- format = _("%d %b");
- else
- format = "%d";
-
- e_utf8_strftime (buffer, buffer_len, format, &day_start);
-}
diff --git a/calendar/gui/e-day-view-top-item.h b/calendar/gui/e-day-view-top-item.h
deleted file mode 100644
index 9b8342af99..0000000000
--- a/calendar/gui/e-day-view-top-item.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 1999, Ximian, Inc.
- * Copyright 1999, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-#ifndef _E_DAY_VIEW_TOP_ITEM_H_
-#define _E_DAY_VIEW_TOP_ITEM_H_
-
-#include "e-day-view.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * EDayViewTopItem - displays the top part of the Day/Work Week calendar view.
- */
-
-#define E_DAY_VIEW_TOP_ITEM(obj) (GTK_CHECK_CAST((obj), \
- e_day_view_top_item_get_type (), EDayViewTopItem))
-#define E_DAY_VIEW_TOP_ITEM_CLASS(k) (GTK_CHECK_CLASS_CAST ((k),\
- e_day_view_top_item_get_type ()))
-#define E_IS_DAY_VIEW_TOP_ITEM(o) (GTK_CHECK_TYPE((o), \
- e_day_view_top_item_get_type ()))
-
-typedef struct {
- GnomeCanvasItem canvas_item;
-
- /* The parent EDayView widget. */
- EDayView *day_view;
-} EDayViewTopItem;
-
-typedef struct {
- GnomeCanvasItemClass parent_class;
-
-} EDayViewTopItemClass;
-
-
-GtkType e_day_view_top_item_get_type (void);
-void e_day_view_top_item_get_day_label (EDayView *day_view, gint day,
- gchar *buffer, gint buffer_len);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_DAY_VIEW_TOP_ITEM_H_ */
diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c
deleted file mode 100644
index 485a930f89..0000000000
--- a/calendar/gui/e-day-view.c
+++ /dev/null
@@ -1,7501 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Authors :
- * Damon Chaplin <damon@ximian.com>
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 1999-2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * EDayView - displays the Day & Work-Week views of the calendar.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-day-view.h"
-#include "ea-calendar.h"
-
-#include <math.h>
-#include <time.h>
-#include <gdk/gdkkeysyms.h>
-#include <gdk/gdkx.h>
-#include <gtk/gtkdnd.h>
-#include <gtk/gtkmain.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkvscrollbar.h>
-#include <gtk/gtkwindow.h>
-#include <gal/e-text/e-text.h>
-#include <gal/widgets/e-canvas-utils.h>
-#include <gal/widgets/e-popup-menu.h>
-#include <gal/widgets/e-gui-utils.h>
-#include <gal/widgets/e-unicode.h>
-#include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnome/gnome-exec.h>
-#include <libgnome/gnome-util.h>
-#include <e-util/e-categories-config.h>
-#include <e-util/e-dialog-utils.h>
-
-#include <libecal/e-cal-time-util.h>
-#include "dialogs/delete-comp.h"
-#include "dialogs/delete-error.h"
-#include "dialogs/send-comp.h"
-#include "dialogs/cancel-comp.h"
-#include "dialogs/recur-comp.h"
-#include "print.h"
-#include "comp-util.h"
-#include "itip-utils.h"
-#include "calendar-commands.h"
-#include "calendar-config.h"
-#include "goto.h"
-#include "e-cal-model-calendar.h"
-#include "e-day-view-time-item.h"
-#include "e-day-view-top-item.h"
-#include "e-day-view-layout.h"
-#include "e-day-view-main-item.h"
-#include "misc.h"
-#include <e-util/e-icon-factory.h>
-
-/* The minimum amount of space wanted on each side of the date string. */
-#define E_DAY_VIEW_DATE_X_PAD 4
-
-#define E_DAY_VIEW_LARGE_FONT_PTSIZE 18
-
-/* The offset from the top/bottom of the canvas before auto-scrolling starts.*/
-#define E_DAY_VIEW_AUTO_SCROLL_OFFSET 16
-
-/* The time between each auto-scroll, in milliseconds. */
-#define E_DAY_VIEW_AUTO_SCROLL_TIMEOUT 50
-
-/* The number of timeouts we skip before we start scrolling. */
-#define E_DAY_VIEW_AUTO_SCROLL_DELAY 5
-
-/* The number of pixels the mouse has to be moved with the button down before
- we start a drag. */
-#define E_DAY_VIEW_DRAG_START_OFFSET 4
-
-/* The amount we scroll the main canvas when the Page Up/Down keys are pressed,
- as a fraction of the page size. */
-#define E_DAY_VIEW_PAGE_STEP 0.5
-
-/* The amount we scroll the main canvas when the mouse wheel buttons are
- pressed, as a fraction of the page size. */
-#define E_DAY_VIEW_WHEEL_MOUSE_STEP_SIZE 0.25
-
-/* The timeout before we do a layout, so we don't do a layout for each event
- we get from the server. */
-#define E_DAY_VIEW_LAYOUT_TIMEOUT 100
-
-typedef struct {
- EDayView *day_view;
- ECalModelComponent *comp_data;
-} AddEventData;
-
-/* Drag and Drop stuff. */
-enum {
- TARGET_CALENDAR_EVENT,
- TARGET_VCALENDAR
-};
-static GtkTargetEntry target_table[] = {
- { "application/x-e-calendar-event", 0, TARGET_CALENDAR_EVENT },
- { "text/x-calendar", 0, TARGET_VCALENDAR },
- { "text/calendar", 0, TARGET_VCALENDAR }
-};
-static guint n_targets = sizeof(target_table) / sizeof(target_table[0]);
-
-static void e_day_view_destroy (GtkObject *object);
-static void e_day_view_realize (GtkWidget *widget);
-static void e_day_view_set_colors(EDayView *day_view, GtkWidget *widget);
-static void e_day_view_unrealize (GtkWidget *widget);
-static void e_day_view_style_set (GtkWidget *widget,
- GtkStyle *previous_style);
-static void e_day_view_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static gboolean e_day_view_update_scroll_regions (EDayView *day_view);
-static gint e_day_view_focus_in (GtkWidget *widget,
- GdkEventFocus *event);
-static gint e_day_view_focus_out (GtkWidget *widget,
- GdkEventFocus *event);
-static gboolean e_day_view_key_press (GtkWidget *widget,
- GdkEventKey *event);
-static gboolean e_day_view_focus (GtkWidget *widget,
- GtkDirectionType direction);
-static gboolean e_day_view_get_next_tab_event (EDayView *day_view,
- GtkDirectionType direction,
- gint *day, gint *event_num);
-static gboolean e_day_view_get_extreme_long_event (EDayView *day_view,
- gboolean first,
- gint *day_out,
- gint *event_num_out);
-static gboolean e_day_view_get_extreme_event (EDayView *day_view,
- gint start_day,
- gint end_day,
- gboolean first,
- gint *day_out,
- gint *event_num_out);
-static gboolean e_day_view_do_key_press (GtkWidget *widget,
- GdkEventKey *event);
-static gboolean e_day_view_popup_menu (GtkWidget *widget);
-static GList *e_day_view_get_selected_events (ECalendarView *cal_view);
-static gboolean e_day_view_get_selected_time_range (ECalendarView *cal_view, time_t *start_time, time_t *end_time);
-static void e_day_view_set_selected_time_range (ECalendarView *cal_view, time_t start_time, time_t end_time);
-static gboolean e_day_view_get_visible_time_range (ECalendarView *cal_view, time_t *start_time, time_t *end_time);
-static void e_day_view_update_query (EDayView *day_view);
-static void e_day_view_goto_start_of_work_day (EDayView *day_view);
-static void e_day_view_goto_end_of_work_day (EDayView *day_view);
-static void e_day_view_change_duration_to_start_of_work_day (EDayView *day_view);
-static void e_day_view_change_duration_to_end_of_work_day (EDayView *day_view);
-static void e_day_view_cursor_key_up_shifted (EDayView *day_view,
- GdkEventKey *event);
-static void e_day_view_cursor_key_down_shifted (EDayView *day_view,
- GdkEventKey *event);
-static void e_day_view_cursor_key_left_shifted (EDayView *day_view,
- GdkEventKey *event);
-static void e_day_view_cursor_key_right_shifted (EDayView *day_view,
- GdkEventKey *event);
-static void e_day_view_cursor_key_up (EDayView *day_view,
- GdkEventKey *event);
-static void e_day_view_cursor_key_down (EDayView *day_view,
- GdkEventKey *event);
-static void e_day_view_cursor_key_left (EDayView *day_view,
- GdkEventKey *event);
-static void e_day_view_cursor_key_right (EDayView *day_view,
- GdkEventKey *event);
-static void e_day_view_scroll (EDayView *day_view,
- gfloat pages_to_scroll);
-
-static gboolean e_day_view_check_if_new_event_fits (EDayView *day_view);
-
-static void e_day_view_on_canvas_realized (GtkWidget *widget,
- EDayView *day_view);
-
-static gboolean e_day_view_on_top_canvas_button_press (GtkWidget *widget,
- GdkEventButton *event,
- EDayView *day_view);
-static gboolean e_day_view_on_top_canvas_button_release (GtkWidget *widget,
- GdkEventButton *event,
- EDayView *day_view);
-static gboolean e_day_view_on_top_canvas_motion (GtkWidget *widget,
- GdkEventMotion *event,
- EDayView *day_view);
-
-static gboolean e_day_view_on_main_canvas_button_press (GtkWidget *widget,
- GdkEventButton *event,
- EDayView *day_view);
-static gboolean e_day_view_on_main_canvas_button_release (GtkWidget *widget,
- GdkEventButton *event,
- EDayView *day_view);
-static gboolean e_day_view_on_main_canvas_scroll (GtkWidget *widget,
- GdkEventScroll *scroll,
- EDayView *day_view);
-
-static gboolean e_day_view_on_time_canvas_scroll (GtkWidget *widget,
- GdkEventScroll *scroll,
- EDayView *day_view);
-
-static gboolean e_day_view_on_main_canvas_motion (GtkWidget *widget,
- GdkEventMotion *event,
- EDayView *day_view);
-static gboolean e_day_view_convert_event_coords (EDayView *day_view,
- GdkEvent *event,
- GdkWindow *window,
- gint *x_return,
- gint *y_return);
-static void e_day_view_update_long_event_resize (EDayView *day_view,
- gint day);
-static void e_day_view_update_resize (EDayView *day_view,
- gint row);
-static void e_day_view_finish_long_event_resize (EDayView *day_view);
-static void e_day_view_finish_resize (EDayView *day_view);
-static void e_day_view_abort_resize (EDayView *day_view,
- guint32 time);
-
-
-static gboolean e_day_view_on_long_event_button_press (EDayView *day_view,
- gint event_num,
- GdkEventButton *event,
- ECalendarViewPosition pos,
- gint event_x,
- gint event_y);
-static gboolean e_day_view_on_event_button_press (EDayView *day_view,
- gint day,
- gint event_num,
- GdkEventButton *event,
- ECalendarViewPosition pos,
- gint event_x,
- gint event_y);
-static void e_day_view_on_long_event_click (EDayView *day_view,
- gint event_num,
- GdkEventButton *bevent,
- ECalendarViewPosition pos,
- gint event_x,
- gint event_y);
-static void e_day_view_on_event_click (EDayView *day_view,
- gint day,
- gint event_num,
- GdkEventButton *event,
- ECalendarViewPosition pos,
- gint event_x,
- gint event_y);
-static void e_day_view_on_event_double_click (EDayView *day_view,
- gint day,
- gint event_num);
-static void e_day_view_on_event_right_click (EDayView *day_view,
- GdkEventButton *bevent,
- gint day,
- gint event_num);
-static void e_day_view_show_popup_menu (EDayView *day_view,
- GdkEvent *gdk_event,
- gint day,
- gint event_num);
-
-
-static void e_day_view_recalc_day_starts (EDayView *day_view,
- time_t start_time);
-static void e_day_view_recalc_num_rows (EDayView *day_view);
-static void e_day_view_recalc_cell_sizes (EDayView *day_view);
-
-static ECalendarViewPosition e_day_view_convert_position_in_top_canvas (EDayView *day_view,
- gint x,
- gint y,
- gint *day_return,
- gint *event_num_return);
-static ECalendarViewPosition e_day_view_convert_position_in_main_canvas (EDayView *day_view,
- gint x,
- gint y,
- gint *day_return,
- gint *row_return,
- gint *event_num_return);
-static gboolean e_day_view_find_event_from_uid (EDayView *day_view,
- ECal *client,
- const gchar *uid,
- const gchar *rid,
- gint *day_return,
- gint *event_num_return);
-
-typedef gboolean (* EDayViewForeachEventCallback) (EDayView *day_view,
- gint day,
- gint event_num,
- gpointer data);
-
-static void e_day_view_foreach_event (EDayView *day_view,
- EDayViewForeachEventCallback callback,
- gpointer data);
-static void e_day_view_foreach_event_with_uid (EDayView *day_view,
- const gchar *uid,
- EDayViewForeachEventCallback callback,
- gpointer data);
-
-static void e_day_view_free_events (EDayView *day_view);
-static void e_day_view_free_event_array (EDayView *day_view,
- GArray *array);
-static int e_day_view_add_event (ECalComponent *comp,
- time_t start,
- time_t end,
- gpointer data);
-static void e_day_view_update_event_label (EDayView *day_view,
- gint day,
- gint event_num);
-static void e_day_view_update_long_event_label (EDayView *day_view,
- gint event_num);
-
-static void e_day_view_reshape_long_events (EDayView *day_view);
-static void e_day_view_reshape_long_event (EDayView *day_view,
- gint event_num);
-static void e_day_view_reshape_day_events (EDayView *day_view,
- gint day);
-static void e_day_view_reshape_day_event (EDayView *day_view,
- gint day,
- gint event_num);
-static void e_day_view_reshape_main_canvas_resize_bars (EDayView *day_view);
-static void e_day_view_reshape_resize_long_event_rect_item (EDayView *day_view);
-static void e_day_view_reshape_resize_rect_item (EDayView *day_view);
-
-static void e_day_view_ensure_events_sorted (EDayView *day_view);
-
-static void e_day_view_start_editing_event (EDayView *day_view,
- gint day,
- gint event_num,
- gchar *initial_text);
-static void e_day_view_stop_editing_event (EDayView *day_view);
-static gboolean e_day_view_on_text_item_event (GnomeCanvasItem *item,
- GdkEvent *event,
- EDayView *day_view);
-static gboolean e_day_view_event_move (ECalendarView *cal_view, ECalViewMoveDirection direction);
-static void e_day_view_change_event_time (EDayView *day_view, time_t start_dt,
-time_t end_dt);
-static void e_day_view_change_event_end_time_up (EDayView *day_view);
-static void e_day_view_change_event_end_time_down (EDayView *day_view);
-static void e_day_view_on_editing_started (EDayView *day_view,
- GnomeCanvasItem *item);
-static void e_day_view_on_editing_stopped (EDayView *day_view,
- GnomeCanvasItem *item);
-
-static time_t e_day_view_convert_grid_position_to_time (EDayView *day_view,
- gint col,
- gint row);
-static gboolean e_day_view_convert_time_to_grid_position (EDayView *day_view,
- time_t time,
- gint *col,
- gint *row);
-
-static void e_day_view_start_auto_scroll (EDayView *day_view,
- gboolean scroll_up);
-static gboolean e_day_view_auto_scroll_handler (gpointer data);
-
-static EDayViewEvent* e_day_view_get_popup_menu_event (EDayView *day_view);
-
-static gboolean e_day_view_on_top_canvas_drag_motion (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time,
- EDayView *day_view);
-static void e_day_view_update_top_canvas_drag (EDayView *day_view,
- gint day);
-static void e_day_view_reshape_top_canvas_drag_item (EDayView *day_view);
-static gboolean e_day_view_on_main_canvas_drag_motion (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time,
- EDayView *day_view);
-static void e_day_view_reshape_main_canvas_drag_item (EDayView *day_view);
-static void e_day_view_update_main_canvas_drag (EDayView *day_view,
- gint row,
- gint day);
-static void e_day_view_on_top_canvas_drag_leave (GtkWidget *widget,
- GdkDragContext *context,
- guint time,
- EDayView *day_view);
-static void e_day_view_on_main_canvas_drag_leave (GtkWidget *widget,
- GdkDragContext *context,
- guint time,
- EDayView *day_view);
-static void e_day_view_on_drag_begin (GtkWidget *widget,
- GdkDragContext *context,
- EDayView *day_view);
-static void e_day_view_on_drag_end (GtkWidget *widget,
- GdkDragContext *context,
- EDayView *day_view);
-static void e_day_view_on_drag_data_get (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- EDayView *day_view);
-static void e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- GtkSelectionData *data,
- guint info,
- guint time,
- EDayView *day_view);
-static void e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- GtkSelectionData *data,
- guint info,
- guint time,
- EDayView *day_view);
-
-static gboolean e_day_view_update_event_cb (EDayView *day_view,
- gint day,
- gint event_num,
- gpointer data);
-static gboolean e_day_view_remove_event_cb (EDayView *day_view,
- gint day,
- gint event_num,
- gpointer data);
-static void e_day_view_normalize_selection (EDayView *day_view);
-static gboolean e_day_view_set_show_times_cb (EDayView *day_view,
- gint day,
- gint event_num,
- gpointer data);
-static time_t e_day_view_find_work_week_start (EDayView *day_view,
- time_t start_time);
-static void e_day_view_recalc_work_week (EDayView *day_view);
-static void e_day_view_recalc_work_week_days_shown (EDayView *day_view);
-
-static void e_day_view_queue_layout (EDayView *day_view);
-static void e_day_view_cancel_layout (EDayView *day_view);
-static gboolean e_day_view_layout_timeout_cb (gpointer data);
-
-G_DEFINE_TYPE (EDayView, e_day_view, E_TYPE_CALENDAR_VIEW);
-
-static void
-e_day_view_class_init (EDayViewClass *class)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- ECalendarViewClass *view_class;
-
- object_class = (GtkObjectClass *) class;
- widget_class = (GtkWidgetClass *) class;
- view_class = (ECalendarViewClass *) class;
-
- /* Method override */
- object_class->destroy = e_day_view_destroy;
-
- widget_class->realize = e_day_view_realize;
- widget_class->unrealize = e_day_view_unrealize;
- widget_class->style_set = e_day_view_style_set;
- widget_class->size_allocate = e_day_view_size_allocate;
- widget_class->focus_in_event = e_day_view_focus_in;
- widget_class->focus_out_event = e_day_view_focus_out;
- widget_class->key_press_event = e_day_view_key_press;
- widget_class->focus = e_day_view_focus;
- widget_class->popup_menu = e_day_view_popup_menu;
-
- view_class->get_selected_events = e_day_view_get_selected_events;
- view_class->get_selected_time_range = e_day_view_get_selected_time_range;
- view_class->set_selected_time_range = e_day_view_set_selected_time_range;
- view_class->get_visible_time_range = e_day_view_get_visible_time_range;
-
- /* init the accessibility support for e_day_view */
- e_day_view_a11y_init ();
-}
-
-static void
-time_range_changed_cb (ECalModel *model, time_t start_time, time_t end_time, gpointer user_data)
-{
- EDayView *day_view = E_DAY_VIEW (user_data);
- time_t lower;
-
- g_return_if_fail (E_IS_DAY_VIEW (day_view));
-
- /* Calculate the first day that should be shown, based on start_time
- and the days_shown setting. If we are showing 1 day it is just the
- start of the day given by start_time, otherwise it is the previous
- work-week start day. */
- if (!day_view->work_week_view) {
- lower = time_day_begin_with_zone (start_time, e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- } else {
- lower = e_day_view_find_work_week_start (day_view, start_time);
- }
-
- /* See if we need to change the days shown. */
- if (lower != day_view->lower)
- e_day_view_recalc_day_starts (day_view, lower);
-
- /* If we don't show the new selection, don't preserve it */
- if (day_view->selection_start_day == -1 || day_view->days_shown <= day_view->selection_start_day)
- e_day_view_set_selected_time_range (E_CALENDAR_VIEW (day_view), start_time, end_time);
-}
-
-
-static void
-process_component (EDayView *day_view, ECalModelComponent *comp_data)
-{
- EDayViewEvent *event;
- gint day, event_num;
- const char *uid, *rid;
- ECalComponent *comp;
- AddEventData add_event_data;
-
- /* If our time hasn't been set yet, just return. */
- if (day_view->lower == 0 && day_view->upper == 0)
- return;
-
- comp = e_cal_component_new ();
- if (!e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp))) {
- g_object_unref (comp);
-
- g_message (G_STRLOC ": Could not set icalcomponent on ECalComponent");
- return;
- }
-
- e_cal_component_get_uid (comp, &uid);
- if (e_cal_component_is_instance (comp))
- rid = e_cal_component_get_recurid_as_string (comp);
- else
- rid = NULL;
-
- /* Add the object */
- add_event_data.day_view = day_view;
- add_event_data.comp_data = comp_data;
- e_day_view_add_event (comp, comp_data->instance_start, comp_data->instance_end, &add_event_data);
-
- g_object_unref (comp);
-}
-
-static void
-update_row (EDayView *day_view, int row)
-{
- ECalModelComponent *comp_data;
- ECalModel *model;
-
- e_day_view_stop_editing_event (day_view);
-
- model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
- comp_data = e_cal_model_get_component_at (model, row);
- g_assert (comp_data != NULL);
- process_component (day_view, comp_data);
-
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
- e_day_view_queue_layout (day_view);
-}
-
-static void
-model_row_changed_cb (ETableModel *etm, int row, gpointer user_data)
-{
- EDayView *day_view = E_DAY_VIEW (user_data);
-
- update_row (day_view, row);
-}
-
-static void
-model_cell_changed_cb (ETableModel *etm, int col, int row, gpointer user_data)
-{
- EDayView *day_view = E_DAY_VIEW (user_data);
-
- update_row (day_view, row);
-}
-
-static void
-model_rows_inserted_cb (ETableModel *etm, int row, int count, gpointer user_data)
-{
- EDayView *day_view = E_DAY_VIEW (user_data);
- ECalModel *model;
- int i;
-
- e_day_view_stop_editing_event (day_view);
-
- model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
- for (i = 0; i < count; i++) {
- ECalModelComponent *comp_data;
-
- comp_data = e_cal_model_get_component_at (model, row + i);
- g_assert (comp_data != NULL);
- process_component (day_view, comp_data);
- }
-
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
- e_day_view_queue_layout (day_view);
-
-}
-
-static void
-model_rows_deleted_cb (ETableModel *etm, int row, int count, gpointer user_data)
-{
- EDayView *day_view = E_DAY_VIEW (user_data);
- int i;
-
- e_day_view_stop_editing_event (day_view);
-
- for (i = row + count; i > row; i--) {
- gint day, event_num;
- const char *uid, *rid = NULL;
- ECalModelComponent *comp_data;
-
- comp_data = e_cal_model_get_component_at (E_CAL_MODEL (etm), i - 1);
- if (!comp_data)
- continue;
-
- uid = icalcomponent_get_uid (comp_data->icalcomp);
- if (e_cal_util_component_is_instance (comp_data->icalcomp)) {
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_RECURRENCEID_PROPERTY);
- if (prop)
- rid = icaltime_as_ical_string (icalcomponent_get_recurrenceid (comp_data->icalcomp));
- }
-
- if (e_day_view_find_event_from_uid (day_view, comp_data->client, uid, rid, &day, &event_num))
- e_day_view_remove_event_cb (day_view, day, event_num, NULL);
- }
-
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
- e_day_view_queue_layout (day_view);
-}
-
-static void
-timezone_changed_cb (ECalendarView *cal_view, icaltimezone *old_zone,
- icaltimezone *new_zone, gpointer user_data)
-{
- struct icaltimetype tt;
- time_t lower;
- EDayView *day_view = (EDayView *) cal_view;
-
- g_return_if_fail (E_IS_DAY_VIEW (day_view));
-
- /* If our time hasn't been set yet, just return. */
- if (day_view->lower == 0 && day_view->upper == 0)
- return;
-
- /* Recalculate the new start of the first day. We just use exactly
- the same time, but with the new timezone. */
- tt = icaltime_from_timet_with_zone (day_view->lower, FALSE,
- old_zone);
-
- lower = icaltime_as_timet_with_zone (tt, new_zone);
-
- e_day_view_recalc_day_starts (day_view, lower);
- e_day_view_update_query (day_view);
-}
-
-static void
-e_day_view_init (EDayView *day_view)
-{
- gint day;
- GnomeCanvasGroup *canvas_group;
- ECalModel *model;
-
- GTK_WIDGET_SET_FLAGS (day_view, GTK_CAN_FOCUS);
-
- day_view->long_events = g_array_new (FALSE, FALSE,
- sizeof (EDayViewEvent));
- day_view->long_events_sorted = TRUE;
- day_view->long_events_need_layout = FALSE;
- day_view->long_events_need_reshape = FALSE;
-
- day_view->layout_timeout_id = 0;
-
- for (day = 0; day < E_DAY_VIEW_MAX_DAYS; day++) {
- day_view->events[day] = g_array_new (FALSE, FALSE,
- sizeof (EDayViewEvent));
- day_view->events_sorted[day] = TRUE;
- day_view->need_layout[day] = FALSE;
- day_view->need_reshape[day] = FALSE;
- }
-
- /* These indicate that the times haven't been set. */
- day_view->lower = 0;
- day_view->upper = 0;
-
- day_view->work_week_view = FALSE;
- day_view->days_shown = 1;
-
- day_view->mins_per_row = 30;
- day_view->date_format = E_DAY_VIEW_DATE_FULL;
- day_view->rows_in_top_display = 0;
-
- /* Note that these don't work yet. It would need a few fixes to the
- way event->start_minute and event->end_minute are used, and there
- may be problems with events that go outside the visible times. */
- day_view->first_hour_shown = 0;
- day_view->first_minute_shown = 0;
- day_view->last_hour_shown = 24;
- day_view->last_minute_shown = 0;
-
- day_view->main_gc = NULL;
- e_day_view_recalc_num_rows (day_view);
-
- day_view->working_days = E_DAY_VIEW_MONDAY | E_DAY_VIEW_TUESDAY
- | E_DAY_VIEW_WEDNESDAY | E_DAY_VIEW_THURSDAY
- | E_DAY_VIEW_FRIDAY;
-
- day_view->work_day_start_hour = 9;
- day_view->work_day_start_minute = 0;
- day_view->work_day_end_hour = 17;
- day_view->work_day_end_minute = 0;
- day_view->show_event_end_times = TRUE;
- day_view->week_start_day = 0;
- day_view->scroll_to_work_day = TRUE;
-
- day_view->editing_event_day = -1;
- day_view->editing_event_num = -1;
-
- day_view->resize_event_num = -1;
- day_view->resize_bars_event_day = -1;
- day_view->resize_bars_event_num = -1;
-
- day_view->last_edited_comp_string = NULL;
-
- day_view->selection_start_row = -1;
- day_view->selection_start_day = -1;
- day_view->selection_end_row = -1;
- day_view->selection_end_day = -1;
- day_view->selection_is_being_dragged = FALSE;
- day_view->selection_drag_pos = E_DAY_VIEW_DRAG_END;
- day_view->selection_in_top_canvas = FALSE;
-
- day_view->resize_drag_pos = E_CALENDAR_VIEW_POS_NONE;
-
- day_view->pressed_event_day = -1;
-
- day_view->drag_event_day = -1;
- day_view->drag_last_day = -1;
-
- day_view->auto_scroll_timeout_id = 0;
-
- day_view->large_font_desc = NULL;
-
- /* String to use in 12-hour time format for times in the morning. */
- day_view->am_string = _("am");
-
- /* String to use in 12-hour time format for times in the afternoon. */
- day_view->pm_string = _("pm");
-
-
- /*
- * Top Canvas
- */
- day_view->top_canvas = e_canvas_new ();
- gtk_table_attach (GTK_TABLE (day_view), day_view->top_canvas,
- 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (day_view->top_canvas);
- g_signal_connect_after (day_view->top_canvas, "button_press_event",
- G_CALLBACK (e_day_view_on_top_canvas_button_press), day_view);
- g_signal_connect (day_view->top_canvas, "button_release_event",
- G_CALLBACK (e_day_view_on_top_canvas_button_release), day_view);
- g_signal_connect (day_view->top_canvas, "motion_notify_event",
- G_CALLBACK (e_day_view_on_top_canvas_motion), day_view);
- g_signal_connect (day_view->top_canvas, "drag_motion",
- G_CALLBACK (e_day_view_on_top_canvas_drag_motion), day_view);
- g_signal_connect (day_view->top_canvas, "drag_leave",
- G_CALLBACK (e_day_view_on_top_canvas_drag_leave), day_view);
-
- g_signal_connect (day_view->top_canvas, "drag_begin",
- G_CALLBACK (e_day_view_on_drag_begin), day_view);
- g_signal_connect (day_view->top_canvas, "drag_end",
- G_CALLBACK (e_day_view_on_drag_end), day_view);
- g_signal_connect (day_view->top_canvas, "drag_data_get",
- G_CALLBACK (e_day_view_on_drag_data_get), day_view);
- g_signal_connect (day_view->top_canvas, "drag_data_received",
- G_CALLBACK (e_day_view_on_top_canvas_drag_data_received), day_view);
-
- canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->top_canvas)->root);
-
- day_view->top_canvas_item =
- gnome_canvas_item_new (canvas_group,
- e_day_view_top_item_get_type (),
- "EDayViewTopItem::day_view", day_view,
- NULL);
-
- day_view->resize_long_event_rect_item =
- gnome_canvas_item_new (canvas_group,
- gnome_canvas_rect_get_type(),
- "width_pixels", 1,
- NULL);
- gnome_canvas_item_hide (day_view->resize_long_event_rect_item);
-
- day_view->drag_long_event_rect_item =
- gnome_canvas_item_new (canvas_group,
- gnome_canvas_rect_get_type (),
- "width_pixels", 1,
- NULL);
- gnome_canvas_item_hide (day_view->drag_long_event_rect_item);
-
- day_view->drag_long_event_item =
- gnome_canvas_item_new (canvas_group,
- e_text_get_type (),
- "anchor", GTK_ANCHOR_NW,
- "line_wrap", TRUE,
- "clip", TRUE,
- "max_lines", 1,
- "editable", TRUE,
- "draw_background", FALSE,
- "fill_color_rgba", GNOME_CANVAS_COLOR(0, 0, 0),
- NULL);
- gnome_canvas_item_hide (day_view->drag_long_event_item);
-
- /*
- * Main Canvas
- */
- day_view->main_canvas = e_canvas_new ();
- gtk_table_attach (GTK_TABLE (day_view), day_view->main_canvas,
- 1, 2, 1, 2,
- GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
- gtk_widget_show (day_view->main_canvas);
- g_signal_connect (day_view->main_canvas, "realize",
- G_CALLBACK (e_day_view_on_canvas_realized), day_view);
-
- g_signal_connect (day_view->main_canvas,
- "button_press_event",
- G_CALLBACK (e_day_view_on_main_canvas_button_press),
- day_view);
- g_signal_connect (day_view->main_canvas,
- "button_release_event",
- G_CALLBACK (e_day_view_on_main_canvas_button_release),
- day_view);
- g_signal_connect (day_view->main_canvas,
- "scroll_event",
- G_CALLBACK (e_day_view_on_main_canvas_scroll),
- day_view);
- g_signal_connect (day_view->main_canvas,
- "motion_notify_event",
- G_CALLBACK (e_day_view_on_main_canvas_motion),
- day_view);
- g_signal_connect (day_view->main_canvas,
- "drag_motion",
- G_CALLBACK (e_day_view_on_main_canvas_drag_motion),
- day_view);
- g_signal_connect (day_view->main_canvas,
- "drag_leave",
- G_CALLBACK (e_day_view_on_main_canvas_drag_leave),
- day_view);
-
- g_signal_connect (day_view->main_canvas, "drag_begin",
- G_CALLBACK (e_day_view_on_drag_begin), day_view);
- g_signal_connect (day_view->main_canvas, "drag_end",
- G_CALLBACK (e_day_view_on_drag_end), day_view);
- g_signal_connect (day_view->main_canvas, "drag_data_get",
- G_CALLBACK (e_day_view_on_drag_data_get), day_view);
- g_signal_connect (day_view->main_canvas, "drag_data_received",
- G_CALLBACK (e_day_view_on_main_canvas_drag_data_received), day_view);
-
- canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->main_canvas)->root);
-
- day_view->main_canvas_item =
- gnome_canvas_item_new (canvas_group,
- e_day_view_main_item_get_type (),
- "EDayViewMainItem::day_view", day_view,
- NULL);
-
- day_view->resize_rect_item =
- gnome_canvas_item_new (canvas_group,
- gnome_canvas_rect_get_type(),
- "width_pixels", 1,
- NULL);
- gnome_canvas_item_hide (day_view->resize_rect_item);
-
- day_view->resize_bar_item =
- gnome_canvas_item_new (canvas_group,
- gnome_canvas_rect_get_type(),
- "width_pixels", 1,
- NULL);
- gnome_canvas_item_hide (day_view->resize_bar_item);
-
- day_view->main_canvas_top_resize_bar_item =
- gnome_canvas_item_new (canvas_group,
- gnome_canvas_rect_get_type (),
- "width_pixels", 1,
- NULL);
- gnome_canvas_item_hide (day_view->main_canvas_top_resize_bar_item);
-
- day_view->main_canvas_bottom_resize_bar_item =
- gnome_canvas_item_new (canvas_group,
- gnome_canvas_rect_get_type (),
- "width_pixels", 1,
- NULL);
- gnome_canvas_item_hide (day_view->main_canvas_bottom_resize_bar_item);
-
-
- day_view->drag_rect_item =
- gnome_canvas_item_new (canvas_group,
- gnome_canvas_rect_get_type (),
- "width_pixels", 1,
- NULL);
- gnome_canvas_item_hide (day_view->drag_rect_item);
-
- day_view->drag_bar_item =
- gnome_canvas_item_new (canvas_group,
- gnome_canvas_rect_get_type (),
- "width_pixels", 1,
- NULL);
- gnome_canvas_item_hide (day_view->drag_bar_item);
-
- day_view->drag_item =
- gnome_canvas_item_new (canvas_group,
- e_text_get_type (),
- "anchor", GTK_ANCHOR_NW,
- "line_wrap", TRUE,
- "clip", TRUE,
- "editable", TRUE,
- "draw_background", FALSE,
- "fill_color_rgba", GNOME_CANVAS_COLOR(0, 0, 0),
- NULL);
- gnome_canvas_item_hide (day_view->drag_item);
-
-
- /*
- * Times Canvas
- */
- day_view->time_canvas = e_canvas_new ();
- gtk_layout_set_vadjustment (GTK_LAYOUT (day_view->time_canvas),
- GTK_LAYOUT (day_view->main_canvas)->vadjustment);
- gtk_table_attach (GTK_TABLE (day_view), day_view->time_canvas,
- 0, 1, 1, 2,
- GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
- gtk_widget_show (day_view->time_canvas);
- g_signal_connect_after (day_view->time_canvas, "scroll_event",
- G_CALLBACK (e_day_view_on_time_canvas_scroll), day_view);
-
- canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->time_canvas)->root);
-
- day_view->time_canvas_item =
- gnome_canvas_item_new (canvas_group,
- e_day_view_time_item_get_type (),
- "EDayViewTimeItem::day_view", day_view,
- NULL);
-
-
- /*
- * Scrollbar.
- */
- day_view->vscrollbar = gtk_vscrollbar_new (GTK_LAYOUT (day_view->main_canvas)->vadjustment);
- gtk_table_attach (GTK_TABLE (day_view), day_view->vscrollbar,
- 2, 3, 1, 2, 0, GTK_EXPAND | GTK_FILL, 0, 0);
- gtk_widget_show (day_view->vscrollbar);
-
-
- /* Create the cursors. */
- day_view->normal_cursor = gdk_cursor_new (GDK_LEFT_PTR);
- day_view->move_cursor = gdk_cursor_new (GDK_FLEUR);
- day_view->resize_width_cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
- day_view->resize_height_cursor = gdk_cursor_new (GDK_SB_V_DOUBLE_ARROW);
- day_view->last_cursor_set_in_top_canvas = NULL;
- day_view->last_cursor_set_in_main_canvas = NULL;
-
- /* Set up the drop sites. */
- gtk_drag_dest_set (day_view->top_canvas,
- GTK_DEST_DEFAULT_ALL,
- target_table, n_targets,
- GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK);
- gtk_drag_dest_set (day_view->main_canvas,
- GTK_DEST_DEFAULT_ALL,
- target_table, n_targets,
- GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK);
-
- /* Get the model */
- model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
-
- /* connect to ECalModel's signals */
- g_signal_connect (G_OBJECT (model), "time_range_changed",
- G_CALLBACK (time_range_changed_cb), day_view);
- g_signal_connect (G_OBJECT (model), "model_row_changed",
- G_CALLBACK (model_row_changed_cb), day_view);
- g_signal_connect (G_OBJECT (model), "model_cell_changed",
- G_CALLBACK (model_cell_changed_cb), day_view);
- g_signal_connect (G_OBJECT (model), "model_rows_inserted",
- G_CALLBACK (model_rows_inserted_cb), day_view);
- g_signal_connect (G_OBJECT (model), "model_rows_deleted",
- G_CALLBACK (model_rows_deleted_cb), day_view);
-
- /* connect to ECalendarView's signals */
- g_signal_connect (G_OBJECT (day_view), "timezone_changed",
- G_CALLBACK (timezone_changed_cb), NULL);
-}
-
-
-/* Turn off the background of the canvas windows. This reduces flicker
- considerably when scrolling. (Why isn't it in GnomeCanvas?). */
-static void
-e_day_view_on_canvas_realized (GtkWidget *widget,
- EDayView *day_view)
-{
- gdk_window_set_back_pixmap (GTK_LAYOUT (widget)->bin_window,
- NULL, FALSE);
-}
-
-
-/**
- * e_day_view_new:
- * @Returns: a new #EDayView.
- *
- * Creates a new #EDayView.
- **/
-GtkWidget *
-e_day_view_new (void)
-{
- GObject *day_view;
-
- day_view = g_object_new (e_day_view_get_type (), NULL);
- e_cal_model_set_flags (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES);
-
- return GTK_WIDGET (day_view);
-}
-
-static void
-e_day_view_destroy (GtkObject *object)
-{
- EDayView *day_view;
- gint day;
-
- day_view = E_DAY_VIEW (object);
-
- e_day_view_cancel_layout (day_view);
-
- e_day_view_stop_auto_scroll (day_view);
-
- if (day_view->large_font_desc) {
- pango_font_description_free (day_view->large_font_desc);
- day_view->large_font_desc = NULL;
- }
-
- if (day_view->normal_cursor) {
- gdk_cursor_unref (day_view->normal_cursor);
- day_view->normal_cursor = NULL;
- }
- if (day_view->move_cursor) {
- gdk_cursor_unref (day_view->move_cursor);
- day_view->move_cursor = NULL;
- }
- if (day_view->resize_width_cursor) {
- gdk_cursor_unref (day_view->resize_width_cursor);
- day_view->resize_width_cursor = NULL;
- }
- if (day_view->resize_height_cursor) {
- gdk_cursor_unref (day_view->resize_height_cursor);
- day_view->resize_height_cursor = NULL;
- }
-
- if (day_view->long_events) {
- e_day_view_free_events (day_view);
- g_array_free (day_view->long_events, TRUE);
- day_view->long_events = NULL;
- }
-
- for (day = 0; day < E_DAY_VIEW_MAX_DAYS; day++) {
- if (day_view->events[day]) {
- g_array_free (day_view->events[day], TRUE);
- day_view->events[day] = NULL;
- }
- }
-
- GTK_OBJECT_CLASS (e_day_view_parent_class)->destroy (object);
-}
-
-
-static void
-e_day_view_realize (GtkWidget *widget)
-{
- EDayView *day_view;
- GdkColormap *colormap;
- gboolean success[E_DAY_VIEW_COLOR_LAST];
- gint nfailed;
-
- if (GTK_WIDGET_CLASS (e_day_view_parent_class)->realize)
- (*GTK_WIDGET_CLASS (e_day_view_parent_class)->realize)(widget);
-
- day_view = E_DAY_VIEW (widget);
- day_view->main_gc = gdk_gc_new (widget->window);
-
- colormap = gtk_widget_get_colormap (widget);
-
- /* Allocate the colors. */
-
- e_day_view_set_colors(day_view, widget);
-
- gdk_gc_set_colormap (day_view->main_gc, colormap);
-
- /* Create the pixmaps. */
- day_view->reminder_icon = e_icon_factory_get_icon ("stock_bell", E_ICON_SIZE_MENU);
- day_view->recurrence_icon = e_icon_factory_get_icon ("stock_refresh", E_ICON_SIZE_MENU);
- day_view->timezone_icon = e_icon_factory_get_icon ("stock_timezone", E_ICON_SIZE_MENU);
- day_view->meeting_icon = e_icon_factory_get_icon ("stock_people", E_ICON_SIZE_MENU);
- day_view->attach_icon = e_icon_factory_get_icon ("stock_attach", E_ICON_SIZE_MENU);
-
-
- /* Set the canvas item colors. */
- gnome_canvas_item_set (day_view->resize_long_event_rect_item,
- "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND],
- "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER],
- NULL);
-
- gnome_canvas_item_set (day_view->drag_long_event_rect_item,
- "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND],
- "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER],
- NULL);
-
-
- gnome_canvas_item_set (day_view->resize_rect_item,
- "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND],
- "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER],
- NULL);
-
- gnome_canvas_item_set (day_view->resize_bar_item,
- "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR],
- "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER],
- NULL);
-
- gnome_canvas_item_set (day_view->main_canvas_top_resize_bar_item,
- "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR],
- "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER],
- NULL);
-
- gnome_canvas_item_set (day_view->main_canvas_bottom_resize_bar_item,
- "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR],
- "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER],
- NULL);
-
-
- gnome_canvas_item_set (day_view->drag_rect_item,
- "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND],
- "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER],
- NULL);
-
- gnome_canvas_item_set (day_view->drag_bar_item,
- "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR],
- "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER],
- NULL);
-}
-
-static void
-e_day_view_set_colors(EDayView *day_view, GtkWidget *widget)
-{
- day_view->colors[E_DAY_VIEW_COLOR_BG_WORKING] = widget->style->base[GTK_STATE_NORMAL];
- day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING] = widget->style->bg[GTK_STATE_ACTIVE];
- day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED] = widget->style->base[GTK_STATE_SELECTED];
- day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED_UNFOCUSSED] = widget->style->bg[GTK_STATE_SELECTED];
- day_view->colors[E_DAY_VIEW_COLOR_BG_GRID] = widget->style->dark[GTK_STATE_NORMAL];
- day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS] = widget->style->dark[GTK_STATE_NORMAL];
- day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_SELECTED] = widget->style->bg[GTK_STATE_SELECTED];
- day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_GRID] = widget->style->light[GTK_STATE_NORMAL];
- day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR] = widget->style->base[GTK_STATE_SELECTED];
- day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND] = widget->style->base[GTK_STATE_NORMAL];
- day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER] = widget->style->dark[GTK_STATE_NORMAL];
- day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND] = widget->style->bg[GTK_STATE_ACTIVE];
- day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER] = widget->style->dark[GTK_STATE_NORMAL];
-}
-
-static void
-e_day_view_unrealize (GtkWidget *widget)
-{
- EDayView *day_view;
- GdkColormap *colormap;
-
- day_view = E_DAY_VIEW (widget);
-
- gdk_gc_unref (day_view->main_gc);
- day_view->main_gc = NULL;
-
- colormap = gtk_widget_get_colormap (widget);
- gdk_colormap_free_colors (colormap, day_view->colors, E_DAY_VIEW_COLOR_LAST);
-
- g_object_unref (day_view->reminder_icon);
- day_view->reminder_icon = NULL;
- g_object_unref (day_view->recurrence_icon);
- day_view->recurrence_icon = NULL;
- g_object_unref (day_view->timezone_icon);
- day_view->timezone_icon = NULL;
- g_object_unref (day_view->meeting_icon);
- day_view->meeting_icon = NULL;
- g_object_unref (day_view->attach_icon);
- day_view->attach_icon = NULL;
-
- if (GTK_WIDGET_CLASS (e_day_view_parent_class)->unrealize)
- (*GTK_WIDGET_CLASS (e_day_view_parent_class)->unrealize)(widget);
-}
-
-
-static void
-e_day_view_style_set (GtkWidget *widget,
- GtkStyle *previous_style)
-{
- EDayView *day_view;
- gint top_rows, top_canvas_height;
- gint hour, max_large_hour_width;
- gint minute, max_minute_width, i;
- gint month, day, width;
- gint longest_month_width, longest_abbreviated_month_width;
- gint longest_weekday_width, longest_abbreviated_weekday_width;
- struct tm date_tm;
- gchar buffer[128];
- gint times_width;
- PangoFontDescription *font_desc;
- PangoContext *pango_context;
- PangoFontMetrics *font_metrics;
- PangoLayout *layout;
- gint week_day, event_num;
- EDayViewEvent *event;
-
- if (GTK_WIDGET_CLASS (e_day_view_parent_class)->style_set)
- (*GTK_WIDGET_CLASS (e_day_view_parent_class)->style_set)(widget, previous_style);
-
- day_view = E_DAY_VIEW (widget);
- e_day_view_set_colors(day_view, widget);
-
- for (week_day = 0; week_day < E_DAY_VIEW_MAX_DAYS; week_day++){
- for (event_num = 0; event_num < day_view->events[week_day]->len; event_num++) {
- event = &g_array_index (day_view->events[week_day], EDayViewEvent, event_num);
- if (event->canvas_item)
- gnome_canvas_item_set (event->canvas_item,
- "fill_color_gdk", &widget->style->text[GTK_STATE_NORMAL],
- NULL);
- }
- }
- for (event_num = 0; event_num < day_view->long_events->len; event_num++) {
- event = &g_array_index (day_view->long_events, EDayViewEvent, event_num);
- if (event->canvas_item)
- gnome_canvas_item_set (event->canvas_item,
- "fill_color_gdk", &widget->style->text[GTK_STATE_NORMAL],
- NULL);
- }
- gnome_canvas_item_set (day_view->main_canvas_top_resize_bar_item,
- "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR],
- "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER],
- NULL);
- gnome_canvas_item_set (day_view->main_canvas_bottom_resize_bar_item,
- "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR],
- "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER],
- NULL);
-
- /* Set up Pango prerequisites */
- font_desc = gtk_widget_get_style (widget)->font_desc;
- pango_context = gtk_widget_get_pango_context (widget);
- font_metrics = pango_context_get_metrics (pango_context, font_desc,
- pango_context_get_language (pango_context));
- layout = pango_layout_new (pango_context);
-
- /* Create the large font. */
- if (day_view->large_font_desc != NULL)
- pango_font_description_free (day_view->large_font_desc);
-
- day_view->large_font_desc = pango_font_description_copy (font_desc);
- pango_font_description_set_size (day_view->large_font_desc,
- E_DAY_VIEW_LARGE_FONT_PTSIZE * PANGO_SCALE);
-
- /* Recalculate the height of each row based on the font size. */
- day_view->row_height =
- PANGO_PIXELS (pango_font_metrics_get_ascent (font_metrics)) +
- PANGO_PIXELS (pango_font_metrics_get_descent (font_metrics)) +
- E_DAY_VIEW_EVENT_BORDER_HEIGHT + E_DAY_VIEW_EVENT_Y_PAD * 2 + 2 /* FIXME */;
- day_view->row_height = MAX (day_view->row_height, E_DAY_VIEW_ICON_HEIGHT + E_DAY_VIEW_ICON_Y_PAD + 2);
- GTK_LAYOUT (day_view->main_canvas)->vadjustment->step_increment = day_view->row_height;
-
- day_view->top_row_height =
- PANGO_PIXELS (pango_font_metrics_get_ascent (font_metrics)) +
- PANGO_PIXELS (pango_font_metrics_get_descent (font_metrics)) +
- E_DAY_VIEW_LONG_EVENT_BORDER_HEIGHT * 2 + E_DAY_VIEW_LONG_EVENT_Y_PAD * 2 +
- E_DAY_VIEW_TOP_CANVAS_Y_GAP;
- day_view->top_row_height = MAX (day_view->top_row_height, E_DAY_VIEW_ICON_HEIGHT + E_DAY_VIEW_ICON_Y_PAD + 2 + E_DAY_VIEW_TOP_CANVAS_Y_GAP);
-
- /* Set the height of the top canvas based on the row height and the
- number of rows needed (min 1 + 1 for the dates + 1 space for DnD).*/
- top_rows = MAX (1, day_view->rows_in_top_display);
- top_canvas_height = (top_rows + 2) * day_view->top_row_height;
- gtk_widget_set_usize (day_view->top_canvas, -1, top_canvas_height);
-
- /* Find the longest full & abbreviated month names. */
- memset (&date_tm, 0, sizeof (date_tm));
- date_tm.tm_year = 100;
- date_tm.tm_mday = 1;
- date_tm.tm_isdst = -1;
-
- longest_month_width = 0;
- longest_abbreviated_month_width = 0;
- for (month = 0; month < 12; month++) {
- date_tm.tm_mon = month;
-
- e_utf8_strftime (buffer, sizeof (buffer), "%B", &date_tm);
- pango_layout_set_text (layout, buffer, -1);
- pango_layout_get_pixel_size (layout, &width, NULL);
-
- if (width > longest_month_width) {
- longest_month_width = width;
- day_view->longest_month_name = month;
- }
-
- e_utf8_strftime (buffer, sizeof (buffer), "%b", &date_tm);
- pango_layout_set_text (layout, buffer, -1);
- pango_layout_get_pixel_size (layout, &width, NULL);
-
- if (width > longest_abbreviated_month_width) {
- longest_abbreviated_month_width = width;
- day_view->longest_abbreviated_month_name = month;
- }
- }
-
- /* Find the longest full & abbreviated weekday names. */
- memset (&date_tm, 0, sizeof (date_tm));
- date_tm.tm_year = 100;
- date_tm.tm_mon = 0;
- date_tm.tm_isdst = -1;
-
- longest_weekday_width = 0;
- longest_abbreviated_weekday_width = 0;
- for (day = 0; day < 7; day++) {
- date_tm.tm_mday = 2 + day;
- date_tm.tm_wday = day;
-
- e_utf8_strftime (buffer, sizeof (buffer), "%A", &date_tm);
- pango_layout_set_text (layout, buffer, -1);
- pango_layout_get_pixel_size (layout, &width, NULL);
-
- if (width > longest_weekday_width) {
- longest_weekday_width = width;
- day_view->longest_weekday_name = day;
- }
-
- e_utf8_strftime (buffer, sizeof (buffer), "%a", &date_tm);
- pango_layout_set_text (layout, buffer, -1);
- pango_layout_get_pixel_size (layout, &width, NULL);
-
- if (width > longest_abbreviated_weekday_width) {
- longest_abbreviated_weekday_width = width;
- day_view->longest_abbreviated_weekday_name = day;
- }
- }
-
-
- /* Calculate the widths of all the time strings necessary. */
- day_view->max_small_hour_width = 0;
- max_large_hour_width = 0;
- for (hour = 0; hour < 24; hour++) {
- g_snprintf (buffer, sizeof (buffer), "%02i", hour);
- pango_layout_set_text (layout, buffer, -1);
- pango_layout_get_pixel_size (layout, &day_view->small_hour_widths [hour], NULL);
-
- day_view->max_small_hour_width = MAX (day_view->max_small_hour_width, day_view->small_hour_widths[hour]);
- }
-
- max_minute_width = 0;
- for (minute = 0, i = 0; minute < 60; minute += 5, i++) {
- gint minute_width;
-
- g_snprintf (buffer, sizeof (buffer), "%02i", minute);
- pango_layout_set_text (layout, buffer, -1);
- pango_layout_get_pixel_size (layout, &minute_width, NULL);
-
- max_minute_width = MAX (max_minute_width, minute_width);
- }
- day_view->max_minute_width = max_minute_width;
-
- pango_layout_set_text (layout, ":", 1);
- pango_layout_get_pixel_size (layout, &day_view->colon_width, NULL);
- pango_layout_set_text (layout, "0", 1);
- pango_layout_get_pixel_size (layout, &day_view->digit_width, NULL);
-
- pango_layout_set_text (layout, day_view->am_string, -1);
- pango_layout_get_pixel_size (layout, &day_view->am_string_width, NULL);
- pango_layout_set_text (layout, day_view->pm_string, -1);
- pango_layout_get_pixel_size (layout, &day_view->pm_string_width, NULL);
-
- /* Calculate the width of the time column. */
- times_width = e_day_view_time_item_get_column_width (E_DAY_VIEW_TIME_ITEM (day_view->time_canvas_item));
- gtk_widget_set_usize (day_view->time_canvas, times_width, -1);
-
- g_object_unref (layout);
- pango_font_metrics_unref (font_metrics);
-}
-
-
-/* This recalculates the sizes of each column. */
-static void
-e_day_view_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
-{
- EDayView *day_view;
- gint day, scroll_y;
- gboolean need_reshape;
- gdouble old_x2, old_y2, new_x2, new_y2;
-
-#if 0
- g_print ("In e_day_view_size_allocate\n");
-#endif
- day_view = E_DAY_VIEW (widget);
-
- (*GTK_WIDGET_CLASS (e_day_view_parent_class)->size_allocate) (widget, allocation);
-
- e_day_view_recalc_cell_sizes (day_view);
-
- /* Set the scroll region of the top canvas to its allocated size. */
- gnome_canvas_get_scroll_region (GNOME_CANVAS (day_view->top_canvas),
- NULL, NULL, &old_x2, &old_y2);
- new_x2 = day_view->top_canvas->allocation.width - 1;
- new_y2 = day_view->top_canvas->allocation.height - 1;
- if (old_x2 != new_x2 || old_y2 != new_y2)
- gnome_canvas_set_scroll_region (GNOME_CANVAS (day_view->top_canvas),
- 0, 0, new_x2, new_y2);
-
- need_reshape = e_day_view_update_scroll_regions (day_view);
-
- /* Scroll to the start of the working day, if this is the initial
- allocation. */
- if (day_view->scroll_to_work_day) {
- scroll_y = e_day_view_convert_time_to_position (day_view, day_view->work_day_start_hour, day_view->work_day_start_minute);
- gnome_canvas_scroll_to (GNOME_CANVAS (day_view->main_canvas),
- 0, scroll_y);
- day_view->scroll_to_work_day = FALSE;
- }
-
- /* Flag that we need to reshape the events. Note that changes in height
- don't matter, since the rows are always the same height. */
- if (need_reshape) {
- day_view->long_events_need_reshape = TRUE;
- for (day = 0; day < E_DAY_VIEW_MAX_DAYS; day++)
- day_view->need_reshape[day] = TRUE;
-
- e_day_view_check_layout (day_view);
- }
-}
-
-
-static void
-e_day_view_recalc_cell_sizes (EDayView *day_view)
-{
- /* An array of dates, one for each month in the year 2000. They must
- all be Sundays. */
- static const int days[12] = { 23, 20, 19, 23, 21, 18,
- 23, 20, 17, 22, 19, 24 };
- gfloat width, offset;
- gint day, max_width;
- struct tm date_tm;
- char buffer[128];
- PangoFontDescription *font_desc;
- PangoContext *pango_context;
- PangoLayout *layout;
- gint pango_width;
-
- g_return_if_fail (((GtkWidget*)day_view)->style != NULL);
-
- /* Set up Pango prerequisites */
- font_desc = gtk_widget_get_style (GTK_WIDGET (day_view))->font_desc;
- pango_context = gtk_widget_get_pango_context (GTK_WIDGET (day_view));
- layout = pango_layout_new (pango_context);
-
- /* Calculate the column sizes, using floating point so that pixels
- get divided evenly. Note that we use one more element than the
- number of columns, to make it easy to get the column widths. */
- width = day_view->main_canvas->allocation.width;
- width /= day_view->days_shown;
- offset = 0;
- for (day = 0; day <= day_view->days_shown; day++) {
- day_view->day_offsets[day] = floor (offset + 0.5);
- offset += width;
- }
-
- /* Calculate the days widths based on the offsets. */
- for (day = 0; day < day_view->days_shown; day++) {
- day_view->day_widths[day] = day_view->day_offsets[day + 1] - day_view->day_offsets[day];
- }
-
- /* Determine which date format to use, based on the column widths.
- We want to check the widths using the longest full or abbreviated
- month name and the longest full or abbreviated weekday name, as
- appropriate. */
- max_width = day_view->day_widths[0];
-
- memset (&date_tm, 0, sizeof (date_tm));
- date_tm.tm_year = 100;
-
- /* Try "Thursday 21 January". */
- date_tm.tm_mon = day_view->longest_month_name;
- date_tm.tm_mday = days[date_tm.tm_mon]
- + day_view->longest_weekday_name;
- date_tm.tm_wday = day_view->longest_weekday_name;
- date_tm.tm_isdst = -1;
- /* strftime format %A = full weekday name, %d = day of month,
- %B = full month name. Don't use any other specifiers. */
- e_utf8_strftime (buffer, sizeof (buffer), _("%A %d %B"), &date_tm);
- pango_layout_set_text (layout, buffer, -1);
- pango_layout_get_pixel_size (layout, &pango_width, NULL);
-
- if (pango_width < max_width) {
- day_view->date_format = E_DAY_VIEW_DATE_FULL;
- return;
- }
-
- /* Try "Thu 21 Jan". */
- date_tm.tm_mon = day_view->longest_abbreviated_month_name;
- date_tm.tm_mday = days[date_tm.tm_mon]
- + day_view->longest_abbreviated_weekday_name;
- date_tm.tm_wday = day_view->longest_abbreviated_weekday_name;
- date_tm.tm_isdst = -1;
- /* strftime format %a = abbreviated weekday name, %d = day of month,
- %b = abbreviated month name. Don't use any other specifiers. */
- e_utf8_strftime (buffer, sizeof (buffer), _("%a %d %b"), &date_tm);
- pango_layout_set_text (layout, buffer, -1);
- pango_layout_get_pixel_size (layout, &pango_width, NULL);
-
- if (pango_width < max_width) {
- day_view->date_format = E_DAY_VIEW_DATE_ABBREVIATED;
- return;
- }
-
- /* Try "23 Jan". */
- date_tm.tm_mon = day_view->longest_abbreviated_month_name;
- date_tm.tm_mday = 23;
- date_tm.tm_wday = 0;
- date_tm.tm_isdst = -1;
- /* strftime format %d = day of month, %b = abbreviated month name.
- Don't use any other specifiers. */
- e_utf8_strftime (buffer, sizeof (buffer), _("%d %b"), &date_tm);
- pango_layout_set_text (layout, buffer, -1);
- pango_layout_get_pixel_size (layout, &pango_width, NULL);
-
- if (pango_width < max_width)
- day_view->date_format = E_DAY_VIEW_DATE_NO_WEEKDAY;
- else
- day_view->date_format = E_DAY_VIEW_DATE_SHORT;
-
- g_object_unref (layout);
-}
-
-
-static gint
-e_day_view_focus_in (GtkWidget *widget, GdkEventFocus *event)
-{
- EDayView *day_view;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_DAY_VIEW (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- day_view = E_DAY_VIEW (widget);
-
- GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
-
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-
- return FALSE;
-}
-
-
-static gint
-e_day_view_focus_out (GtkWidget *widget, GdkEventFocus *event)
-{
- EDayView *day_view;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_DAY_VIEW (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- day_view = E_DAY_VIEW (widget);
-
- GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
-
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-
- return FALSE;
-}
-
-static gboolean
-e_day_view_update_event_cb (EDayView *day_view,
- gint day,
- gint event_num,
- gpointer data)
-{
- EDayViewEvent *event;
- ECalModelComponent *comp_data;
-
- comp_data = data;
-#if 0
- g_print ("In e_day_view_update_event_cb day:%i event_num:%i\n",
- day, event_num);
-#endif
- if (day == E_DAY_VIEW_LONG_EVENT) {
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
- } else {
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
- }
-
- e_cal_model_free_component_data (event->comp_data);
- event->comp_data = e_cal_model_copy_component_data (comp_data);
-
- if (day == E_DAY_VIEW_LONG_EVENT) {
- e_day_view_update_long_event_label (day_view, event_num);
- e_day_view_reshape_long_event (day_view, event_num);
- } else {
- e_day_view_update_event_label (day_view, day, event_num);
- e_day_view_reshape_day_event (day_view, day, event_num);
- }
-
- g_signal_emit_by_name (G_OBJECT(day_view),
- "event_changed", event);
-
- return TRUE;
-}
-
-
-/* This calls a given function for each event instance (in both views).
- If the callback returns FALSE the iteration is stopped.
- Note that it is safe for the callback to remove the event (since we
- step backwards through the arrays). */
-static void
-e_day_view_foreach_event (EDayView *day_view,
- EDayViewForeachEventCallback callback,
- gpointer data)
-{
- EDayViewEvent *event;
- gint day, event_num;
-
- for (day = 0; day < day_view->days_shown; day++) {
- for (event_num = day_view->events[day]->len - 1;
- event_num >= 0;
- event_num--) {
- event = &g_array_index (day_view->events[day],
- EDayViewEvent, event_num);
-
- if (!(*callback) (day_view, day, event_num, data))
- return;
- }
- }
-
- for (event_num = day_view->long_events->len - 1;
- event_num >= 0;
- event_num--) {
- event = &g_array_index (day_view->long_events,
- EDayViewEvent, event_num);
-
- if (!(*callback) (day_view, E_DAY_VIEW_LONG_EVENT, event_num,
- data))
- return;
- }
-}
-
-
-/* This calls a given function for each event instance that matches the given
- uid. If the callback returns FALSE the iteration is stopped.
- Note that it is safe for the callback to remove the event (since we
- step backwards through the arrays). */
-static void
-e_day_view_foreach_event_with_uid (EDayView *day_view,
- const gchar *uid,
- EDayViewForeachEventCallback callback,
- gpointer data)
-{
- EDayViewEvent *event;
- gint day, event_num;
- const char *u;
-
- for (day = 0; day < day_view->days_shown; day++) {
- for (event_num = day_view->events[day]->len - 1;
- event_num >= 0;
- event_num--) {
- event = &g_array_index (day_view->events[day],
- EDayViewEvent, event_num);
-
- u = icalcomponent_get_uid (event->comp_data->icalcomp);
- if (uid && !strcmp (uid, u)) {
- if (!(*callback) (day_view, day, event_num, data))
- return;
- }
- }
- }
-
- for (event_num = day_view->long_events->len - 1;
- event_num >= 0;
- event_num--) {
- event = &g_array_index (day_view->long_events,
- EDayViewEvent, event_num);
-
- u = icalcomponent_get_uid (event->comp_data->icalcomp);
- if (u && !strcmp (uid, u)) {
- if (!(*callback) (day_view, E_DAY_VIEW_LONG_EVENT, event_num, data))
- return;
- }
- }
-}
-
-
-static gboolean
-e_day_view_remove_event_cb (EDayView *day_view,
- gint day,
- gint event_num,
- gpointer data)
-{
- EDayViewEvent *event;
-
-#if 0
- g_print ("In e_day_view_remove_event_cb day:%i event_num:%i\n",
- day, event_num);
-#endif
-
- if (day == E_DAY_VIEW_LONG_EVENT)
- event = &g_array_index (day_view->long_events,
- EDayViewEvent, event_num);
- else
- event = &g_array_index (day_view->events[day],
- EDayViewEvent, event_num);
-
- if (!event)
- return TRUE;
-
- /* If we were editing this event, set editing_event_day to -1 so
- on_editing_stopped doesn't try to update the event. */
- if (day_view->editing_event_day == day
- && day_view->editing_event_num == event_num)
- day_view->editing_event_day = -1;
-
- if (event->canvas_item)
- gtk_object_destroy (GTK_OBJECT (event->canvas_item));
-
- e_cal_model_free_component_data (event->comp_data);
- event->comp_data = NULL;
-
- if (day == E_DAY_VIEW_LONG_EVENT) {
- g_array_remove_index (day_view->long_events, event_num);
- day_view->long_events_need_layout = TRUE;
- } else {
- g_array_remove_index (day_view->events[day], event_num);
- day_view->need_layout[day] = TRUE;
- }
- return TRUE;
-}
-
-
-/* This updates the text shown for an event. If the event start or end do not
- lie on a row boundary, the time is displayed before the summary. */
-static void
-e_day_view_update_event_label (EDayView *day_view,
- gint day,
- gint event_num)
-{
- EDayViewEvent *event;
- char *text, *start_suffix, *end_suffix;
- gboolean free_text = FALSE, editing_event = FALSE;
- gint offset;
- gint start_hour, start_display_hour, start_minute, start_suffix_width;
- gint end_hour, end_display_hour, end_minute, end_suffix_width;
- const gchar *summary;
-
- event = &g_array_index (day_view->events[day], EDayViewEvent, event_num);
-
- /* If the event isn't visible just return. */
- if (!event->canvas_item)
- return;
-
- summary = icalcomponent_get_summary (event->comp_data->icalcomp);
- text = summary ? (char *) summary : "";
-
- if (day_view->editing_event_day == day
- && day_view->editing_event_num == event_num)
- editing_event = TRUE;
-
- if (!editing_event
- && (event->start_minute % day_view->mins_per_row != 0
- || (day_view->show_event_end_times
- && event->end_minute % day_view->mins_per_row != 0))) {
- offset = day_view->first_hour_shown * 60
- + day_view->first_minute_shown;
- start_minute = offset + event->start_minute;
- end_minute = offset + event->end_minute;
-
- start_hour = start_minute / 60;
- start_minute = start_minute % 60;
-
- end_hour = end_minute / 60;
- end_minute = end_minute % 60;
-
- e_day_view_convert_time_to_display (day_view, start_hour,
- &start_display_hour,
- &start_suffix,
- &start_suffix_width);
- e_day_view_convert_time_to_display (day_view, end_hour,
- &end_display_hour,
- &end_suffix,
- &end_suffix_width);
-
- if (e_calendar_view_get_use_24_hour_format (E_CALENDAR_VIEW (day_view))) {
- if (day_view->show_event_end_times) {
- /* 24 hour format with end time. */
- text = g_strdup_printf
- ("%2i:%02i-%2i:%02i %s",
- start_display_hour, start_minute,
- end_display_hour, end_minute,
- text);
- } else {
- /* 24 hour format without end time. */
- text = g_strdup_printf
- ("%2i:%02i %s",
- start_display_hour, start_minute,
- text);
- }
- } else {
- if (day_view->show_event_end_times) {
- /* 12 hour format with end time. */
- text = g_strdup_printf
- ("%2i:%02i%s-%2i:%02i%s %s",
- start_display_hour, start_minute,
- start_suffix,
- end_display_hour, end_minute,
- end_suffix,
- text);
- } else {
- /* 12 hour format without end time. */
- text = g_strdup_printf
- ("%2i:%02i%s %s",
- start_display_hour, start_minute,
- start_suffix,
- text);
- }
- }
-
- free_text = TRUE;
- }
-
- gnome_canvas_item_set (event->canvas_item,
- "text", text,
- NULL);
-
- if (free_text)
- g_free (text);
-}
-
-
-static void
-e_day_view_update_long_event_label (EDayView *day_view,
- gint event_num)
-{
- EDayViewEvent *event;
- const gchar *summary;
-
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
-
- /* If the event isn't visible just return. */
- if (!event->canvas_item)
- return;
-
- summary = icalcomponent_get_summary (event->comp_data->icalcomp);
- gnome_canvas_item_set (event->canvas_item,
- "text", summary ? summary : "",
- NULL);
-}
-
-
-/* Finds the day and index of the event with the given canvas item.
- If is is a long event, -1 is returned as the day.
- Returns TRUE if the event was found. */
-gboolean
-e_day_view_find_event_from_item (EDayView *day_view,
- GnomeCanvasItem *item,
- gint *day_return,
- gint *event_num_return)
-{
- EDayViewEvent *event;
- gint day, event_num;
-
- for (day = 0; day < day_view->days_shown; day++) {
- for (event_num = 0; event_num < day_view->events[day]->len;
- event_num++) {
- event = &g_array_index (day_view->events[day],
- EDayViewEvent, event_num);
- if (event->canvas_item == item) {
- *day_return = day;
- *event_num_return = event_num;
- return TRUE;
- }
- }
- }
-
- for (event_num = 0; event_num < day_view->long_events->len;
- event_num++) {
- event = &g_array_index (day_view->long_events,
- EDayViewEvent, event_num);
- if (event->canvas_item == item) {
- *day_return = E_DAY_VIEW_LONG_EVENT;
- *event_num_return = event_num;
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-
-/* Finds the day and index of the event with the given uid.
- If is is a long event, E_DAY_VIEW_LONG_EVENT is returned as the day.
- Returns TRUE if an event with the uid was found.
- Note that for recurring events there may be several EDayViewEvents, one
- for each instance, all with the same iCalObject and uid. So only use this
- function if you know the event doesn't recur or you are just checking to
- see if any events with the uid exist. */
-static gboolean
-e_day_view_find_event_from_uid (EDayView *day_view,
- ECal *client,
- const gchar *uid,
- const gchar *rid,
- gint *day_return,
- gint *event_num_return)
-{
- EDayViewEvent *event;
- gint day, event_num;
- const char *u, *r;
-
- if (!uid)
- return FALSE;
-
- for (day = 0; day < day_view->days_shown; day++) {
- for (event_num = 0; event_num < day_view->events[day]->len;
- event_num++) {
- event = &g_array_index (day_view->events[day],
- EDayViewEvent, event_num);
-
- if (event->comp_data->client != client)
- continue;
-
- u = icalcomponent_get_uid (event->comp_data->icalcomp);
- if (u && !strcmp (uid, u)) {
- if (rid && *rid) {
- r = icaltime_as_ical_string (icalcomponent_get_recurrenceid (event->comp_data->icalcomp));
- if (!r || !*r)
- continue;
- if (strcmp (rid, r) != 0)
- continue;
- }
-
- *day_return = day;
- *event_num_return = event_num;
- return TRUE;
- }
- }
- }
-
- for (event_num = 0; event_num < day_view->long_events->len;
- event_num++) {
- event = &g_array_index (day_view->long_events,
- EDayViewEvent, event_num);
-
- u = icalcomponent_get_uid (event->comp_data->icalcomp);
- if (u && !strcmp (uid, u)) {
- *day_return = E_DAY_VIEW_LONG_EVENT;
- *event_num_return = event_num;
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static void
-e_day_view_set_selected_time_range_in_top_visible (EDayView *day_view,
- time_t start_time,
- time_t end_time)
-{
- gint start_row, start_col, end_row, end_col;
- gboolean need_redraw = FALSE, start_in_grid, end_in_grid;
-
- g_return_if_fail (E_IS_DAY_VIEW (day_view));
-
- /* Set the selection. */
- start_in_grid = e_day_view_convert_time_to_grid_position (day_view,
- start_time,
- &start_col,
- &start_row);
- end_in_grid = e_day_view_convert_time_to_grid_position (day_view,
- end_time - 60,
- &end_col,
- &end_row);
-
- if (!start_in_grid)
- start_col = 0;
- if (!end_in_grid)
- end_col = day_view->days_shown - 1;
-
- if (start_row != day_view->selection_start_row
- || start_col != day_view->selection_start_day) {
- need_redraw = TRUE;
- day_view->selection_in_top_canvas = TRUE;
- day_view->selection_start_row = -1;
- day_view->selection_start_day = start_col;
- }
-
- if (end_row != day_view->selection_end_row
- || end_col != day_view->selection_end_day) {
- need_redraw = TRUE;
- day_view->selection_in_top_canvas = TRUE;
- day_view->selection_end_row = -1;
- day_view->selection_end_day = end_col;
- }
-
- if (need_redraw) {
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
- }
-}
-
-static void
-e_day_view_set_selected_time_range_visible (EDayView *day_view,
- time_t start_time,
- time_t end_time)
-{
- gint start_row, start_col, end_row, end_col;
- gboolean need_redraw = FALSE, start_in_grid, end_in_grid;
-
- g_return_if_fail (E_IS_DAY_VIEW (day_view));
-
- /* Set the selection. */
- start_in_grid = e_day_view_convert_time_to_grid_position (day_view,
- start_time,
- &start_col,
- &start_row);
- end_in_grid = e_day_view_convert_time_to_grid_position (day_view,
- end_time - 60,
- &end_col,
- &end_row);
-
- /* If either of the times isn't in the grid, or the selection covers
- an entire day, we set the selection to 1 row from the start of the
- working day, in the day corresponding to the start time. */
- if (!start_in_grid || !end_in_grid
- || (start_row == 0 && end_row == day_view->rows - 1)) {
- end_col = start_col;
-
- start_row = e_day_view_convert_time_to_row (day_view, day_view->work_day_start_hour, day_view->work_day_start_minute);
- start_row = CLAMP (start_row, 0, day_view->rows - 1);
- end_row = start_row;
- }
-
- if (start_row != day_view->selection_start_row
- || start_col != day_view->selection_start_day) {
- need_redraw = TRUE;
- day_view->selection_in_top_canvas = FALSE;
- day_view->selection_start_row = start_row;
- day_view->selection_start_day = start_col;
- }
-
- if (end_row != day_view->selection_end_row
- || end_col != day_view->selection_end_day) {
- need_redraw = TRUE;
- day_view->selection_in_top_canvas = FALSE;
- day_view->selection_end_row = end_row;
- day_view->selection_end_day = end_col;
- }
-
- if (need_redraw) {
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
- }
-}
-
-
-/* Finds the start of the working week which includes the given time. */
-static time_t
-e_day_view_find_work_week_start (EDayView *day_view,
- time_t start_time)
-{
- GDate date;
- gint weekday, day, i;
- guint offset;
- struct icaltimetype tt = icaltime_null_time ();
-
- time_to_gdate_with_zone (&date, start_time, e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
-
- /* The start of the work-week is the first working day after the
- week start day. */
-
- /* Get the weekday corresponding to start_time, 0 (Sun) to 6 (Sat). */
- weekday = g_date_weekday (&date) % 7;
-
- /* Calculate the first working day of the week, 0 (Sun) to 6 (Sat).
- It will automatically default to the week start day if no days
- are set as working days. */
- day = (day_view->week_start_day + 1) % 7;
- for (i = 0; i < 7; i++) {
- if (day_view->working_days & (1 << day))
- break;
- day = (day + 1) % 7;
- }
-
- /* Calculate how many days we need to go back to the first workday. */
- if (weekday < day) {
- offset = (day - weekday) % 7;
- g_date_add_days (&date, offset);
- } else {
- offset = (weekday - day) % 7;
- g_date_subtract_days (&date, offset);
- }
-
- tt.year = g_date_year (&date);
- tt.month = g_date_month (&date);
- tt.day = g_date_day (&date);
-
- return icaltime_as_timet_with_zone (tt, e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
-}
-
-
-/* This sets the selected time range. If the start_time & end_time are not equal
- and are both visible in the view, then the selection is set to those times,
- otherwise it is set to 1 hour from the start of the working day. */
-static void
-e_day_view_set_selected_time_range (ECalendarView *cal_view,
- time_t start_time,
- time_t end_time)
-{
- gint start_row, start_col, end_row, end_col;
- gboolean need_redraw = FALSE, start_in_grid, end_in_grid;
- EDayView *day_view = E_DAY_VIEW (cal_view);
-
- /* Set the selection. */
- start_in_grid = e_day_view_convert_time_to_grid_position (day_view,
- start_time,
- &start_col,
- &start_row);
- end_in_grid = e_day_view_convert_time_to_grid_position (day_view,
- end_time - 60,
- &end_col,
- &end_row);
-
- /* If either of the times isn't in the grid, or the selection covers
- an entire day, we set the selection to 1 row from the start of the
- working day, in the day corresponding to the start time. */
- if (!start_in_grid || !end_in_grid
- || (start_row == 0 && end_row == day_view->rows - 1)) {
- end_col = start_col;
-
- start_row = e_day_view_convert_time_to_row (day_view, day_view->work_day_start_hour, day_view->work_day_start_minute);
- start_row = CLAMP (start_row, 0, day_view->rows - 1);
- end_row = start_row;
- }
-
- if (start_row != day_view->selection_start_row
- || start_col != day_view->selection_start_day) {
- need_redraw = TRUE;
- day_view->selection_in_top_canvas = FALSE;
- day_view->selection_start_row = start_row;
- day_view->selection_start_day = start_col;
- }
-
- if (end_row != day_view->selection_end_row
- || end_col != day_view->selection_end_day) {
- need_redraw = TRUE;
- day_view->selection_in_top_canvas = FALSE;
- day_view->selection_end_row = end_row;
- day_view->selection_end_day = end_col;
- }
-
- if (need_redraw) {
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
- }
-}
-
-/* Returns the selected time range. */
-static gboolean
-e_day_view_get_selected_time_range (ECalendarView *cal_view, time_t *start_time, time_t *end_time)
-{
- gint start_col, start_row, end_col, end_row;
- time_t start, end;
- EDayView *day_view = E_DAY_VIEW (cal_view);
-
- start_col = day_view->selection_start_day;
- start_row = day_view->selection_start_row;
- end_col = day_view->selection_end_day;
- end_row = day_view->selection_end_row;
-
- if (start_col == -1) {
- start_col = 0;
- start_row = 0;
- end_col = 0;
- end_row = 0;
- }
-
- /* Check if the selection is only in the top canvas, in which case
- we can simply use the day_starts array. */
- if (day_view->selection_in_top_canvas) {
- start = day_view->day_starts[start_col];
- end = day_view->day_starts[end_col + 1];
- } else {
- /* Convert the start col + row into a time. */
- start = e_day_view_convert_grid_position_to_time (day_view, start_col, start_row);
- end = e_day_view_convert_grid_position_to_time (day_view, end_col, end_row + 1);
- }
-
- if (start_time)
- *start_time = start;
-
- if (end_time)
- *end_time = end;
-
- return TRUE;
-}
-
-/* Gets the visible time range. Returns FALSE if no time range has been set. */
-static gboolean
-e_day_view_get_visible_time_range (ECalendarView *cal_view,
- time_t *start_time,
- time_t *end_time)
-{
- EDayView *day_view = E_DAY_VIEW (cal_view);
-
- /* If the date isn't set, return FALSE. */
- if (day_view->lower == 0 && day_view->upper == 0)
- return FALSE;
-
- *start_time = day_view->day_starts[0];
- *end_time = day_view->day_starts[day_view->days_shown];
-
- return TRUE;
-}
-
-static void
-e_day_view_recalc_day_starts (EDayView *day_view,
- time_t start_time)
-{
- gint day;
-
- day_view->day_starts[0] = start_time;
- for (day = 1; day <= day_view->days_shown; day++) {
- day_view->day_starts[day] = time_add_day_with_zone (day_view->day_starts[day - 1], 1, e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- }
-
-#if 0
- for (day = 0; day <= day_view->days_shown; day++)
- g_print ("Day Starts %i: %s", day, ctime (&day_view->day_starts[day]));
-#endif
-
- day_view->lower = start_time;
- day_view->upper = day_view->day_starts[day_view->days_shown];
-}
-
-
-/* Whether we are displaying a work-week, in which case the display always
- starts on the first day of the working week. */
-gboolean
-e_day_view_get_work_week_view (EDayView *day_view)
-{
- g_return_val_if_fail (E_IS_DAY_VIEW (day_view), FALSE);
-
- return day_view->work_week_view;
-}
-
-
-void
-e_day_view_set_work_week_view (EDayView *day_view,
- gboolean work_week_view)
-{
- g_return_if_fail (E_IS_DAY_VIEW (day_view));
-
- if (day_view->work_week_view == work_week_view)
- return;
-
- day_view->work_week_view = work_week_view;
-
- if (day_view->work_week_view)
- e_day_view_recalc_work_week (day_view);
-}
-
-
-gint
-e_day_view_get_days_shown (EDayView *day_view)
-{
- g_return_val_if_fail (E_IS_DAY_VIEW (day_view), -1);
-
- return day_view->days_shown;
-}
-
-
-void
-e_day_view_set_days_shown (EDayView *day_view,
- gint days_shown)
-{
- g_return_if_fail (E_IS_DAY_VIEW (day_view));
- g_return_if_fail (days_shown >= 1);
- g_return_if_fail (days_shown <= E_DAY_VIEW_MAX_DAYS);
-
- if (day_view->days_shown == days_shown)
- return;
-
- day_view->days_shown = days_shown;
-
- /* If the date isn't set, just return. */
- if (day_view->lower == 0 && day_view->upper == 0)
- return;
-
- e_day_view_recalc_day_starts (day_view, day_view->lower);
- e_day_view_recalc_cell_sizes (day_view);
-
- e_day_view_update_query (day_view);
-}
-
-
-gint
-e_day_view_get_mins_per_row (EDayView *day_view)
-{
- g_return_val_if_fail (E_IS_DAY_VIEW (day_view), -1);
-
- return day_view->mins_per_row;
-}
-
-
-void
-e_day_view_set_mins_per_row (EDayView *day_view,
- gint mins_per_row)
-{
- gint day;
-
- g_return_if_fail (E_IS_DAY_VIEW (day_view));
-
- if (mins_per_row != 5 && mins_per_row != 10 && mins_per_row != 15
- && mins_per_row != 30 && mins_per_row != 60) {
- g_warning ("Invalid minutes per row setting");
- return;
- }
-
- if (day_view->mins_per_row == mins_per_row)
- return;
-
- day_view->mins_per_row = mins_per_row;
- e_day_view_recalc_num_rows (day_view);
-
- /* If we aren't visible, we'll sort it out later. */
- if (!GTK_WIDGET_VISIBLE (day_view))
- return;
-
- for (day = 0; day < E_DAY_VIEW_MAX_DAYS; day++)
- day_view->need_layout[day] = TRUE;
-
- /* We need to update all the day event labels since the start & end
- times may or may not be on row boundaries any more. */
- e_day_view_foreach_event (day_view,
- e_day_view_set_show_times_cb, NULL);
-
- /* We must layout the events before updating the scroll region, since
- that will result in a redraw which would crash otherwise. */
- e_day_view_check_layout (day_view);
- gtk_widget_queue_draw (day_view->time_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-
- e_day_view_update_scroll_regions (day_view);
-}
-
-
-/* This specifies the working days in the week. The value is a bitwise
- combination of day flags. Defaults to Mon-Fri. */
-EDayViewDays
-e_day_view_get_working_days (EDayView *day_view)
-{
- g_return_val_if_fail (E_IS_DAY_VIEW (day_view), 0);
-
- return day_view->working_days;
-}
-
-
-void
-e_day_view_set_working_days (EDayView *day_view,
- EDayViewDays days)
-{
- g_return_if_fail (E_IS_DAY_VIEW (day_view));
-
- if (day_view->working_days == days)
- return;
-
- day_view->working_days = days;
-
- if (day_view->work_week_view)
- e_day_view_recalc_work_week (day_view);
-
- /* We have to do this, as the new working days may have no effect on
- the days shown, but we still want the background color to change. */
- gtk_widget_queue_draw (day_view->main_canvas);
-}
-
-
-static void
-e_day_view_recalc_work_week_days_shown (EDayView *day_view)
-{
- gint first_day, last_day, i, days_shown;
- gboolean has_working_days = FALSE;
-
- /* Find the first working day in the week, 0 (Sun) to 6 (Sat). */
- first_day = (day_view->week_start_day + 1) % 7;
- for (i = 0; i < 7; i++) {
- if (day_view->working_days & (1 << first_day)) {
- has_working_days = TRUE;
- break;
- }
- first_day = (first_day + 1) % 7;
- }
-
- if (has_working_days) {
- /* Now find the last working day of the week, backwards. */
- last_day = day_view->week_start_day % 7;
- for (i = 0; i < 7; i++) {
- if (day_view->working_days & (1 << last_day))
- break;
- last_day = (last_day + 6) % 7;
- }
- /* Now calculate the days we need to show to include all the
- working days in the week. Add 1 to make it inclusive. */
- days_shown = (last_day + 7 - first_day) % 7 + 1;
- } else {
- /* If no working days are set, just use 7. */
- days_shown = 7;
- }
-
- e_day_view_set_days_shown (day_view, days_shown);
-}
-
-
-/* The start and end time of the working day. This only affects the background
- colors. */
-void
-e_day_view_get_working_day (EDayView *day_view,
- gint *start_hour,
- gint *start_minute,
- gint *end_hour,
- gint *end_minute)
-{
- g_return_if_fail (E_IS_DAY_VIEW (day_view));
-
- *start_hour = day_view->work_day_start_hour;
- *start_minute = day_view->work_day_start_minute;
- *end_hour = day_view->work_day_end_hour;
- *end_minute = day_view->work_day_end_minute;
-}
-
-
-void
-e_day_view_set_working_day (EDayView *day_view,
- gint start_hour,
- gint start_minute,
- gint end_hour,
- gint end_minute)
-{
- g_return_if_fail (E_IS_DAY_VIEW (day_view));
-
- day_view->work_day_start_hour = start_hour;
- day_view->work_day_start_minute = start_minute;
- day_view->work_day_end_hour = end_hour;
- day_view->work_day_end_minute = end_minute;
-
- gtk_widget_queue_draw (day_view->main_canvas);
-}
-
-/* Whether we display event end times in the main canvas. */
-gboolean
-e_day_view_get_show_event_end_times (EDayView *day_view)
-{
- g_return_val_if_fail (E_IS_DAY_VIEW (day_view), TRUE);
-
- return day_view->show_event_end_times;
-}
-
-
-void
-e_day_view_set_show_event_end_times (EDayView *day_view,
- gboolean show)
-{
- g_return_if_fail (E_IS_DAY_VIEW (day_view));
-
- if (day_view->show_event_end_times != show) {
- day_view->show_event_end_times = show;
- e_day_view_foreach_event (day_view,
- e_day_view_set_show_times_cb, NULL);
- }
-}
-
-/* This is a callback used to update all day event labels. */
-static gboolean
-e_day_view_set_show_times_cb (EDayView *day_view,
- gint day,
- gint event_num,
- gpointer data)
-{
- if (day != E_DAY_VIEW_LONG_EVENT) {
- e_day_view_update_event_label (day_view, day, event_num);
- }
-
- return TRUE;
-}
-
-
-/* The first day of the week, 0 (Monday) to 6 (Sunday). */
-gint
-e_day_view_get_week_start_day (EDayView *day_view)
-{
- g_return_val_if_fail (E_IS_DAY_VIEW (day_view), 0);
-
- return day_view->week_start_day;
-}
-
-
-void
-e_day_view_set_week_start_day (EDayView *day_view,
- gint week_start_day)
-{
- g_return_if_fail (E_IS_DAY_VIEW (day_view));
- g_return_if_fail (week_start_day >= 0);
- g_return_if_fail (week_start_day < 7);
-
- if (day_view->week_start_day == week_start_day)
- return;
-
- day_view->week_start_day = week_start_day;
-
- if (day_view->work_week_view)
- e_day_view_recalc_work_week (day_view);
-}
-
-static void
-e_day_view_recalc_work_week (EDayView *day_view)
-{
- time_t lower;
-
- /* If we aren't showing the work week, just return. */
- if (!day_view->work_week_view)
- return;
-
- e_day_view_recalc_work_week_days_shown (day_view);
-
- /* If the date isn't set, just return. */
- if (day_view->lower == 0 && day_view->upper == 0)
- return;
-
- lower = e_day_view_find_work_week_start (day_view, day_view->lower);
- if (lower != day_view->lower) {
- /* Reset the selection, as it may disappear. */
- day_view->selection_start_day = -1;
-
- e_day_view_recalc_day_starts (day_view, lower);
- e_day_view_update_query (day_view);
-
- /* This updates the date navigator. */
- e_day_view_update_calendar_selection_time (day_view);
- }
-}
-
-
-static gboolean
-e_day_view_update_scroll_regions (EDayView *day_view)
-{
- gdouble old_x2, old_y2, new_x2, new_y2;
- gboolean need_reshape = FALSE;
-
- /* Set the scroll region of the time canvas to its allocated width,
- but with the height the same as the main canvas. */
- gnome_canvas_get_scroll_region (GNOME_CANVAS (day_view->time_canvas),
- NULL, NULL, &old_x2, &old_y2);
- new_x2 = day_view->time_canvas->allocation.width - 1;
- new_y2 = MAX (day_view->rows * day_view->row_height,
- day_view->main_canvas->allocation.height) - 1;
- if (old_x2 != new_x2 || old_y2 != new_y2)
- gnome_canvas_set_scroll_region (GNOME_CANVAS (day_view->time_canvas),
- 0, 0, new_x2, new_y2);
-
- /* Set the scroll region of the main canvas to its allocated width,
- but with the height depending on the number of rows needed. */
- gnome_canvas_get_scroll_region (GNOME_CANVAS (day_view->main_canvas),
- NULL, NULL, &old_x2, &old_y2);
- new_x2 = day_view->main_canvas->allocation.width - 1;
- if (old_x2 != new_x2 || old_y2 != new_y2) {
- need_reshape = TRUE;
- gnome_canvas_set_scroll_region (GNOME_CANVAS (day_view->main_canvas),
- 0, 0, new_x2, new_y2);
- }
-
- return need_reshape;
-}
-
-
-/* This recalculates the number of rows to display, based on the time range
- shown and the minutes per row. */
-static void
-e_day_view_recalc_num_rows (EDayView *day_view)
-{
- gint hours, minutes, total_minutes;
-
- hours = day_view->last_hour_shown - day_view->first_hour_shown;
- /* This could be negative but it works out OK. */
- minutes = day_view->last_minute_shown - day_view->first_minute_shown;
- total_minutes = hours * 60 + minutes;
- day_view->rows = total_minutes / day_view->mins_per_row;
-}
-
-
-/* Converts an hour and minute to a row in the canvas. Note that if we aren't
- showing all 24 hours of the day, the returned row may be negative or
- greater than day_view->rows. */
-gint
-e_day_view_convert_time_to_row (EDayView *day_view,
- gint hour,
- gint minute)
-{
- gint total_minutes, start_minute, offset;
-
- total_minutes = hour * 60 + minute;
- start_minute = day_view->first_hour_shown * 60
- + day_view->first_minute_shown;
- offset = total_minutes - start_minute;
- if (offset < 0)
- return -1;
- else
- return offset / day_view->mins_per_row;
-}
-
-
-/* Converts an hour and minute to a y coordinate in the canvas. */
-gint
-e_day_view_convert_time_to_position (EDayView *day_view,
- gint hour,
- gint minute)
-{
- gint total_minutes, start_minute, offset;
-
- total_minutes = hour * 60 + minute;
- start_minute = day_view->first_hour_shown * 60
- + day_view->first_minute_shown;
- offset = total_minutes - start_minute;
-
- return offset * day_view->row_height / day_view->mins_per_row;
-}
-
-
-static gboolean
-e_day_view_on_top_canvas_button_press (GtkWidget *widget,
- GdkEventButton *event,
- EDayView *day_view)
-{
- gint event_x, event_y, day, event_num;
- ECalendarViewPosition pos;
-
- /* Convert the coords to the main canvas window, or return if the
- window is not found. */
- if (!e_day_view_convert_event_coords (day_view, (GdkEvent*) event,
- GTK_LAYOUT (widget)->bin_window,
- &event_x, &event_y))
- return FALSE;
-
- pos = e_day_view_convert_position_in_top_canvas (day_view,
- event_x, event_y,
- &day, &event_num);
-
- if (pos == E_CALENDAR_VIEW_POS_OUTSIDE)
- return FALSE;
-
- if (pos != E_CALENDAR_VIEW_POS_NONE)
- return e_day_view_on_long_event_button_press (day_view,
- event_num,
- event, pos,
- event_x,
- event_y);
-
- e_day_view_stop_editing_event (day_view);
-
- if (event->button == 1) {
- if (event->type == GDK_2BUTTON_PRESS) {
- time_t dtstart, dtend;
-
- e_day_view_get_selected_time_range ((ECalendarView *) day_view, &dtstart, &dtend);
- e_calendar_view_new_appointment_for (E_CALENDAR_VIEW (day_view),
- dtstart, dtend,
- TRUE, FALSE);
- return TRUE;
- }
-
- if (!GTK_WIDGET_HAS_FOCUS (day_view))
- gtk_widget_grab_focus (GTK_WIDGET (day_view));
-
- if (gdk_pointer_grab (GTK_LAYOUT (widget)->bin_window, FALSE,
- GDK_POINTER_MOTION_MASK
- | GDK_BUTTON_RELEASE_MASK,
- FALSE, NULL, event->time) == 0) {
- e_day_view_start_selection (day_view, day, -1);
- }
- } else if (event->button == 3) {
- if (!GTK_WIDGET_HAS_FOCUS (day_view))
- gtk_widget_grab_focus (GTK_WIDGET (day_view));
-
- if (day < day_view->selection_start_day || day > day_view->selection_end_day) {
- e_day_view_start_selection (day_view, day, -1);
- e_day_view_finish_selection (day_view);
- }
-
- e_day_view_on_event_right_click (day_view, event, -1, -1);
- }
-
- return TRUE;
-}
-
-
-static gboolean
-e_day_view_convert_event_coords (EDayView *day_view,
- GdkEvent *event,
- GdkWindow *window,
- gint *x_return,
- gint *y_return)
-{
- gint event_x, event_y, win_x, win_y;
- GdkWindow *event_window;;
-
- /* Get the event window, x & y from the appropriate event struct. */
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- case GDK_2BUTTON_PRESS:
- case GDK_3BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- event_x = event->button.x;
- event_y = event->button.y;
- event_window = event->button.window;
- break;
- case GDK_MOTION_NOTIFY:
- event_x = event->motion.x;
- event_y = event->motion.y;
- event_window = event->motion.window;
- break;
- default:
- /* Shouldn't get here. */
- g_assert_not_reached ();
- return FALSE;
- }
-
- while (event_window && event_window != window
- && event_window != GDK_ROOT_PARENT()) {
- gdk_window_get_position (event_window, &win_x, &win_y);
- event_x += win_x;
- event_y += win_y;
- event_window = gdk_window_get_parent (event_window);
- }
-
- *x_return = event_x;
- *y_return = event_y;
-
- if (event_window != window)
- g_warning ("Couldn't find event window\n");
-
- return (event_window == window) ? TRUE : FALSE;
-}
-
-
-static gboolean
-e_day_view_on_main_canvas_button_press (GtkWidget *widget,
- GdkEventButton *event,
- EDayView *day_view)
-{
- gint event_x, event_y, row, day, event_num;
- ECalendarViewPosition pos;
-
-#if 0
- g_print ("In e_day_view_on_main_canvas_button_press\n");
-#endif
-
- /* Convert the coords to the main canvas window, or return if the
- window is not found. */
- if (!e_day_view_convert_event_coords (day_view, (GdkEvent*) event,
- GTK_LAYOUT (widget)->bin_window,
- &event_x, &event_y))
- return FALSE;
-
- /* Find out where the mouse is. */
- pos = e_day_view_convert_position_in_main_canvas (day_view,
- event_x, event_y,
- &day, &row,
- &event_num);
-
- if (pos == E_CALENDAR_VIEW_POS_OUTSIDE)
- return FALSE;
-
- if (pos != E_CALENDAR_VIEW_POS_NONE)
- return e_day_view_on_event_button_press (day_view, day,
- event_num, event, pos,
- event_x, event_y);
-
- e_day_view_stop_editing_event (day_view);
-
- /* Start the selection drag. */
- if (event->button == 1) {
- if (event->type == GDK_2BUTTON_PRESS) {
- time_t dtstart, dtend;
-
- e_day_view_get_selected_time_range ((ECalendarView *) day_view, &dtstart, &dtend);
- e_calendar_view_new_appointment_for (E_CALENDAR_VIEW (day_view),
- dtstart, dtend,
- FALSE, FALSE);
- return TRUE;
- }
-
- if (!GTK_WIDGET_HAS_FOCUS (day_view) && !GTK_WIDGET_HAS_FOCUS (day_view->main_canvas))
- gtk_widget_grab_focus (GTK_WIDGET (day_view));
-
- if (gdk_pointer_grab (GTK_LAYOUT (widget)->bin_window, FALSE,
- GDK_POINTER_MOTION_MASK
- | GDK_BUTTON_RELEASE_MASK,
- FALSE, NULL, event->time) == 0) {
- e_day_view_start_selection (day_view, day, row);
- g_signal_emit_by_name (day_view, "selected_time_changed");
- }
- } else if (event->button == 3) {
- if (!GTK_WIDGET_HAS_FOCUS (day_view))
- gtk_widget_grab_focus (GTK_WIDGET (day_view));
-
-
- if ((day < day_view->selection_start_day || day > day_view->selection_end_day)
- || (day == day_view->selection_start_day && row < day_view->selection_start_row)
- || (day == day_view->selection_end_day && row > day_view->selection_end_row)) {
- e_day_view_start_selection (day_view, day, row);
- e_day_view_finish_selection (day_view);
- }
-
- e_day_view_on_event_right_click (day_view, event, -1, -1);
- }
-
- return TRUE;
-}
-
-static gboolean
-e_day_view_on_main_canvas_scroll (GtkWidget *widget,
- GdkEventScroll *scroll,
- EDayView *day_view)
-{
- switch (scroll->direction) {
- case GDK_SCROLL_UP:
- e_day_view_scroll (day_view, E_DAY_VIEW_WHEEL_MOUSE_STEP_SIZE);
- return TRUE;
- case GDK_SCROLL_DOWN:
- e_day_view_scroll (day_view, -E_DAY_VIEW_WHEEL_MOUSE_STEP_SIZE);
- return TRUE;
- default:
- break;
- }
-
- return FALSE;
-}
-
-
-static gboolean
-e_day_view_on_time_canvas_scroll (GtkWidget *widget,
- GdkEventScroll *scroll,
- EDayView *day_view)
-{
-
- switch (scroll->direction) {
- case GDK_SCROLL_UP:
- e_day_view_scroll (day_view, E_DAY_VIEW_WHEEL_MOUSE_STEP_SIZE);
- return TRUE;
- case GDK_SCROLL_DOWN:
- e_day_view_scroll (day_view, -E_DAY_VIEW_WHEEL_MOUSE_STEP_SIZE);
- return TRUE;
- default:
- break;
- }
-
- return FALSE;
-}
-
-static gboolean
-e_day_view_on_long_event_button_press (EDayView *day_view,
- gint event_num,
- GdkEventButton *event,
- ECalendarViewPosition pos,
- gint event_x,
- gint event_y)
-{
- if (event->button == 1) {
- if (event->type == GDK_BUTTON_PRESS) {
- e_day_view_on_long_event_click (day_view, event_num,
- event, pos,
- event_x, event_y);
- return TRUE;
- } else if (event->type == GDK_2BUTTON_PRESS) {
- e_day_view_on_event_double_click (day_view, -1,
- event_num);
- gtk_signal_emit_stop_by_name (GTK_OBJECT (day_view->top_canvas),
- "button_press_event");
- return TRUE;
- }
- } else if (event->button == 3) {
- EDayViewEvent *e;
-
- e = &g_array_index (day_view->long_events, EDayViewEvent, event_num);
-
- if (!GTK_WIDGET_HAS_FOCUS (day_view))
- gtk_widget_grab_focus (GTK_WIDGET (day_view));
-
- e_day_view_set_selected_time_range_in_top_visible (day_view, e->start, e->end);
-
- e_day_view_on_event_right_click (day_view, event,
- E_DAY_VIEW_LONG_EVENT,
- event_num);
-
- return TRUE;
- }
- return FALSE;
-}
-
-
-static gboolean
-e_day_view_on_event_button_press (EDayView *day_view,
- gint day,
- gint event_num,
- GdkEventButton *event,
- ECalendarViewPosition pos,
- gint event_x,
- gint event_y)
-{
- if (event->button == 1) {
- if (event->type == GDK_BUTTON_PRESS) {
- e_day_view_on_event_click (day_view, day, event_num,
- event, pos,
- event_x, event_y);
- return TRUE;
- } else if (event->type == GDK_2BUTTON_PRESS) {
- e_day_view_on_event_double_click (day_view, day,
- event_num);
- gtk_signal_emit_stop_by_name (GTK_OBJECT (day_view->main_canvas),
- "button_press_event");
- return TRUE;
- }
- } else if (event->button == 3) {
- EDayViewEvent *e;
-
- e = &g_array_index (day_view->events[day], EDayViewEvent, event_num);
-
- if (!GTK_WIDGET_HAS_FOCUS (day_view))
- gtk_widget_grab_focus (GTK_WIDGET (day_view));
-
- e_day_view_set_selected_time_range_visible (day_view, e->start, e->end);
-
- e_day_view_on_event_right_click (day_view, event,
- day, event_num);
-
- return TRUE;
- }
- return FALSE;
-}
-
-
-static void
-e_day_view_on_long_event_click (EDayView *day_view,
- gint event_num,
- GdkEventButton *bevent,
- ECalendarViewPosition pos,
- gint event_x,
- gint event_y)
-{
- EDayViewEvent *event;
- gint start_day, end_day, day;
- gint item_x, item_y, item_w, item_h;
-
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
-
- /* Ignore clicks on the EText while editing. */
- if (pos == E_CALENDAR_VIEW_POS_EVENT
- && E_TEXT (event->canvas_item)->editing)
- return;
-
- if ((e_cal_util_component_is_instance (event->comp_data->icalcomp) ||
- !e_cal_util_component_has_recurrences (event->comp_data->icalcomp))
- && (pos == E_CALENDAR_VIEW_POS_LEFT_EDGE
- || pos == E_CALENDAR_VIEW_POS_RIGHT_EDGE)) {
- if (!e_day_view_find_long_event_days (event,
- day_view->days_shown,
- day_view->day_starts,
- &start_day, &end_day))
- return;
-
- /* Grab the keyboard focus, so the event being edited is saved
- and we can use the Escape key to abort the resize. */
- if (!GTK_WIDGET_HAS_FOCUS (day_view))
- gtk_widget_grab_focus (GTK_WIDGET (day_view));
-
- if (gdk_pointer_grab (GTK_LAYOUT (day_view->top_canvas)->bin_window, FALSE,
- GDK_POINTER_MOTION_MASK
- | GDK_BUTTON_RELEASE_MASK,
- FALSE, NULL, bevent->time) == 0) {
-
- day_view->resize_event_day = E_DAY_VIEW_LONG_EVENT;
- day_view->resize_event_num = event_num;
- day_view->resize_drag_pos = pos;
- day_view->resize_start_row = start_day;
- day_view->resize_end_row = end_day;
-
- /* Create the edit rect if necessary. */
- e_day_view_reshape_resize_long_event_rect_item (day_view);
-
- /* Make sure the text item is on top. */
- gnome_canvas_item_raise_to_top (day_view->resize_long_event_rect_item);
-
- /* Raise the event's item, above the rect as well. */
- gnome_canvas_item_raise_to_top (event->canvas_item);
- }
- } else if (e_day_view_get_long_event_position (day_view, event_num,
- &start_day, &end_day,
- &item_x, &item_y,
- &item_w, &item_h)) {
- /* Remember the item clicked and the mouse position,
- so we can start a drag if the mouse moves. */
- day_view->pressed_event_day = E_DAY_VIEW_LONG_EVENT;
- day_view->pressed_event_num = event_num;
-
- day_view->drag_event_x = event_x;
- day_view->drag_event_y = event_y;
-
- e_day_view_convert_position_in_top_canvas (day_view,
- event_x, event_y,
- &day, NULL);
- day_view->drag_event_offset = day - start_day;
- }
-}
-
-
-static void
-e_day_view_on_event_click (EDayView *day_view,
- gint day,
- gint event_num,
- GdkEventButton *bevent,
- ECalendarViewPosition pos,
- gint event_x,
- gint event_y)
-{
- EDayViewEvent *event;
- gint tmp_day, row, start_row;
-
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
-
- /* Ignore clicks on the EText while editing. */
- if (pos == E_CALENDAR_VIEW_POS_EVENT
- && E_TEXT (event->canvas_item)->editing)
- return;
-
- if ((e_cal_util_component_is_instance (event->comp_data->icalcomp) ||
- !e_cal_util_component_has_recurrences (event->comp_data->icalcomp))
- && (pos == E_CALENDAR_VIEW_POS_TOP_EDGE
- || pos == E_CALENDAR_VIEW_POS_BOTTOM_EDGE)) {
- /* Grab the keyboard focus, so the event being edited is saved
- and we can use the Escape key to abort the resize. */
- if (!GTK_WIDGET_HAS_FOCUS (day_view))
- gtk_widget_grab_focus (GTK_WIDGET (day_view));
-
- if (gdk_pointer_grab (GTK_LAYOUT (day_view->main_canvas)->bin_window, FALSE,
- GDK_POINTER_MOTION_MASK
- | GDK_BUTTON_RELEASE_MASK,
- FALSE, NULL, bevent->time) == 0) {
-
- day_view->resize_event_day = day;
- day_view->resize_event_num = event_num;
- day_view->resize_drag_pos = pos;
- day_view->resize_start_row = event->start_minute / day_view->mins_per_row;
- day_view->resize_end_row = (event->end_minute - 1) / day_view->mins_per_row;
- if (day_view->resize_end_row < day_view->resize_start_row)
- day_view->resize_end_row = day_view->resize_start_row;
-
- day_view->resize_bars_event_day = day;
- day_view->resize_bars_event_num = event_num;
-
- /* Create the edit rect if necessary. */
- e_day_view_reshape_resize_rect_item (day_view);
-
- e_day_view_reshape_main_canvas_resize_bars (day_view);
-
- /* Make sure the text item is on top. */
- gnome_canvas_item_raise_to_top (day_view->resize_rect_item);
- gnome_canvas_item_raise_to_top (day_view->resize_bar_item);
-
- /* Raise the event's item, above the rect as well. */
- gnome_canvas_item_raise_to_top (event->canvas_item);
- }
-
- } else {
- /* Remember the item clicked and the mouse position,
- so we can start a drag if the mouse moves. */
- day_view->pressed_event_day = day;
- day_view->pressed_event_num = event_num;
-
- day_view->drag_event_x = event_x;
- day_view->drag_event_y = event_y;
-
- e_day_view_convert_position_in_main_canvas (day_view,
- event_x, event_y,
- &tmp_day, &row,
- NULL);
- start_row = event->start_minute / day_view->mins_per_row;
- day_view->drag_event_offset = row - start_row;
- }
-}
-
-
-static void
-e_day_view_reshape_resize_long_event_rect_item (EDayView *day_view)
-{
- gint day, event_num, start_day, end_day;
- gint item_x, item_y, item_w, item_h;
- gdouble x1, y1, x2, y2;
-
- day = day_view->resize_event_day;
- event_num = day_view->resize_event_num;
-
- /* If we're not resizing an event, or the event is not shown,
- hide the resize bars. */
- if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_NONE
- || !e_day_view_get_long_event_position (day_view, event_num,
- &start_day, &end_day,
- &item_x, &item_y,
- &item_w, &item_h)) {
- gnome_canvas_item_hide (day_view->resize_long_event_rect_item);
- return;
- }
-
- x1 = item_x;
- y1 = item_y;
- x2 = item_x + item_w - 1;
- y2 = item_y + item_h - 1;
-
- gnome_canvas_item_set (day_view->resize_long_event_rect_item,
- "x1", x1,
- "y1", y1,
- "x2", x2,
- "y2", y2,
- NULL);
- gnome_canvas_item_show (day_view->resize_long_event_rect_item);
-}
-
-
-static void
-e_day_view_reshape_resize_rect_item (EDayView *day_view)
-{
- gint day, event_num;
- gint item_x, item_y, item_w, item_h;
- gdouble x1, y1, x2, y2;
-
- day = day_view->resize_event_day;
- event_num = day_view->resize_event_num;
-
- /* If we're not resizing an event, or the event is not shown,
- hide the resize bars. */
- if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_NONE
- || !e_day_view_get_event_position (day_view, day, event_num,
- &item_x, &item_y,
- &item_w, &item_h)) {
- gnome_canvas_item_hide (day_view->resize_rect_item);
- return;
- }
-
- x1 = item_x;
- y1 = item_y;
- x2 = item_x + item_w - 1;
- y2 = item_y + item_h - 1;
-
- gnome_canvas_item_set (day_view->resize_rect_item,
- "x1", x1 + E_DAY_VIEW_BAR_WIDTH - 1,
- "y1", y1,
- "x2", x2,
- "y2", y2,
- NULL);
- gnome_canvas_item_show (day_view->resize_rect_item);
-
- gnome_canvas_item_set (day_view->resize_bar_item,
- "x1", x1,
- "y1", y1,
- "x2", x1 + E_DAY_VIEW_BAR_WIDTH - 1,
- "y2", y2,
- NULL);
- gnome_canvas_item_show (day_view->resize_bar_item);
-}
-
-
-static void
-e_day_view_on_event_double_click (EDayView *day_view,
- gint day,
- gint event_num)
-{
- EDayViewEvent *event;
- icalproperty *attendee_prop = NULL;
-
- if (day == -1)
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
- else
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
-
- e_day_view_stop_editing_event (day_view);
-
-
- attendee_prop = icalcomponent_get_first_property (event->comp_data->icalcomp, ICAL_ATTENDEE_PROPERTY);
- e_calendar_view_edit_appointment (E_CALENDAR_VIEW (day_view),
- event->comp_data->client,
- event->comp_data->icalcomp, attendee_prop ? TRUE:FALSE);
-}
-
-static void
-popup_destroyed_cb (gpointer data, GObject *where_object_was)
-{
- EDayView *day_view = data;
-
- day_view->popup_event_day = -1;
- day_view->popup_event_num = -1;
-}
-
-static void
-e_day_view_show_popup_menu (EDayView *day_view,
- GdkEvent *gdk_event,
- gint day,
- gint event_num)
-{
- GtkMenu *popup;
-
- day_view->popup_event_day = day;
- day_view->popup_event_num = event_num;
-
- popup = e_calendar_view_create_popup_menu (E_CALENDAR_VIEW (day_view));
- g_object_weak_ref (G_OBJECT (popup), popup_destroyed_cb, day_view);
- gtk_menu_popup (popup, NULL, NULL, NULL, NULL, gdk_event?gdk_event->button.button:0, gdk_event?gdk_event->button.time:gtk_get_current_event_time());
-}
-
-static gboolean
-e_day_view_popup_menu (GtkWidget *widget)
-{
- EDayView *day_view = E_DAY_VIEW (widget);
- e_day_view_show_popup_menu (day_view, NULL,
- day_view->editing_event_day,
- day_view->editing_event_num);
- return TRUE;
-}
-
-/* Returns the currently-selected event, or NULL if none */
-static GList *
-e_day_view_get_selected_events (ECalendarView *cal_view)
-{
- EDayViewEvent *event = NULL;
- GList *list = NULL;
- EDayView *day_view = (EDayView *) cal_view;
-
- g_return_val_if_fail (E_IS_DAY_VIEW (day_view), NULL);
-
- if (day_view->editing_event_num != -1) {
- if (day_view->editing_event_day == E_DAY_VIEW_LONG_EVENT)
- event = &g_array_index (day_view->long_events,
- EDayViewEvent,
- day_view->editing_event_num);
- else
- event = &g_array_index (day_view->events[day_view->editing_event_day],
- EDayViewEvent,
- day_view->editing_event_num);
- } else if (day_view->popup_event_num != -1) {
- if (day_view->popup_event_day == E_DAY_VIEW_LONG_EVENT)
- event = &g_array_index (day_view->long_events,
- EDayViewEvent,
- day_view->popup_event_num);
- else
- event = &g_array_index (day_view->events[day_view->popup_event_day],
- EDayViewEvent,
- day_view->popup_event_num);
- }
-
- if (event)
- list = g_list_append (list, event);
-
- return list;
-}
-
-/* Restarts a query for the day view */
-static void
-e_day_view_update_query (EDayView *day_view)
-{
- gint rows, r;
-
- e_day_view_stop_editing_event (day_view);
-
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
- e_day_view_free_events (day_view);
- e_day_view_queue_layout (day_view);
-
- rows = e_table_model_row_count (E_TABLE_MODEL (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view))));
- for (r = 0; r < rows; r++) {
- ECalModelComponent *comp_data;
-
- comp_data = e_cal_model_get_component_at (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), r);
- g_assert (comp_data != NULL);
- process_component (day_view, comp_data);
- }
-}
-
-static void
-e_day_view_on_event_right_click (EDayView *day_view,
- GdkEventButton *bevent,
- gint day,
- gint event_num)
-{
- e_day_view_show_popup_menu (day_view, (GdkEvent*)bevent,
- day, event_num);
-}
-
-static EDayViewEvent*
-e_day_view_get_popup_menu_event (EDayView *day_view)
-{
- if (day_view->popup_event_num == -1)
- return NULL;
-
- if (day_view->popup_event_day == E_DAY_VIEW_LONG_EVENT)
- return &g_array_index (day_view->long_events,
- EDayViewEvent,
- day_view->popup_event_num);
- else
- return &g_array_index (day_view->events[day_view->popup_event_day],
- EDayViewEvent,
- day_view->popup_event_num);
-}
-
-
-static gboolean
-e_day_view_on_top_canvas_button_release (GtkWidget *widget,
- GdkEventButton *event,
- EDayView *day_view)
-{
- if (day_view->selection_is_being_dragged) {
- gdk_pointer_ungrab (event->time);
- e_day_view_finish_selection (day_view);
- } else if (day_view->resize_drag_pos != E_CALENDAR_VIEW_POS_NONE) {
- gdk_pointer_ungrab (event->time);
- e_day_view_finish_long_event_resize (day_view);
- } else if (day_view->pressed_event_day != -1) {
- e_day_view_start_editing_event (day_view,
- day_view->pressed_event_day,
- day_view->pressed_event_num,
- NULL);
- }
-
- day_view->pressed_event_day = -1;
-
- return FALSE;
-}
-
-
-static gboolean
-e_day_view_on_main_canvas_button_release (GtkWidget *widget,
- GdkEventButton *event,
- EDayView *day_view)
-{
-#if 0
- g_print ("In e_day_view_on_main_canvas_button_release\n");
-#endif
-
- if (day_view->selection_is_being_dragged) {
- gdk_pointer_ungrab (event->time);
- e_day_view_finish_selection (day_view);
- e_day_view_stop_auto_scroll (day_view);
- } else if (day_view->resize_drag_pos != E_CALENDAR_VIEW_POS_NONE) {
- gdk_pointer_ungrab (event->time);
- e_day_view_finish_resize (day_view);
- e_day_view_stop_auto_scroll (day_view);
- } else if (day_view->pressed_event_day != -1) {
- e_day_view_start_editing_event (day_view,
- day_view->pressed_event_day,
- day_view->pressed_event_num,
- NULL);
- }
-
- day_view->pressed_event_day = -1;
-
- return FALSE;
-}
-
-
-void
-e_day_view_update_calendar_selection_time (EDayView *day_view)
-{
- time_t start, end;
- GnomeCalendar *calendar;
-
- e_day_view_get_selected_time_range ((ECalendarView *) day_view, &start, &end);
-
-#if 0
- g_print ("Start: %s", ctime (&start));
- g_print ("End : %s", ctime (&end));
-#endif
-
-#if 0
- calendar = e_calendar_view_get_calendar (E_CALENDAR_VIEW (day_view));
- if (calendar)
- gnome_calendar_set_selected_time_range (calendar,
- start, end);
-#endif
-}
-
-
-static gboolean
-e_day_view_on_top_canvas_motion (GtkWidget *widget,
- GdkEventMotion *mevent,
- EDayView *day_view)
-{
- EDayViewEvent *event = NULL;
- ECalendarViewPosition pos;
- gint event_x, event_y, canvas_x, canvas_y;
- gint day, event_num;
- GdkCursor *cursor;
-
-#if 0
- g_print ("In e_day_view_on_top_canvas_motion\n");
-#endif
-
- /* Convert the coords to the main canvas window, or return if the
- window is not found. */
- if (!e_day_view_convert_event_coords (day_view, (GdkEvent*) mevent,
- GTK_LAYOUT (widget)->bin_window,
- &event_x, &event_y))
- return FALSE;
-
- canvas_x = event_x;
- canvas_y = event_y;
-
- pos = e_day_view_convert_position_in_top_canvas (day_view,
- canvas_x, canvas_y,
- &day, &event_num);
- if (event_num != -1)
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
-
- if (day_view->selection_is_being_dragged) {
- e_day_view_update_selection (day_view, day, -1);
- return TRUE;
- } else if (day_view->resize_drag_pos != E_CALENDAR_VIEW_POS_NONE) {
- if (pos != E_CALENDAR_VIEW_POS_OUTSIDE) {
- e_day_view_update_long_event_resize (day_view, day);
- return TRUE;
- }
- } else if (day_view->pressed_event_day == E_DAY_VIEW_LONG_EVENT) {
- GtkTargetList *target_list;
-
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- day_view->pressed_event_num);
-
- if ((e_cal_util_component_is_instance (event->comp_data->icalcomp) ||
- !e_cal_util_component_has_recurrences (event->comp_data->icalcomp))
- && (abs (canvas_x - day_view->drag_event_x)
- > E_DAY_VIEW_DRAG_START_OFFSET
- || abs (canvas_y - day_view->drag_event_y)
- > E_DAY_VIEW_DRAG_START_OFFSET)) {
- day_view->drag_event_day = day_view->pressed_event_day;
- day_view->drag_event_num = day_view->pressed_event_num;
- day_view->pressed_event_day = -1;
-
- /* Hide the horizontal bars. */
- if (day_view->resize_bars_event_day != -1) {
- day_view->resize_bars_event_day = -1;
- day_view->resize_bars_event_num = -1;
- gnome_canvas_item_hide (day_view->main_canvas_top_resize_bar_item);
- gnome_canvas_item_hide (day_view->main_canvas_bottom_resize_bar_item);
- }
-
- target_list = gtk_target_list_new (target_table,
- n_targets);
- gtk_drag_begin (widget, target_list,
- GDK_ACTION_COPY | GDK_ACTION_MOVE,
- 1, (GdkEvent*)mevent);
- gtk_target_list_unref (target_list);
- }
- } else {
- cursor = day_view->normal_cursor;
-
- /* Recurring events can't be resized. */
- if (event && (e_cal_util_component_is_instance (event->comp_data->icalcomp) ||
- !e_cal_util_component_has_recurrences (event->comp_data->icalcomp))) {
- switch (pos) {
- case E_CALENDAR_VIEW_POS_LEFT_EDGE:
- case E_CALENDAR_VIEW_POS_RIGHT_EDGE:
- cursor = day_view->resize_width_cursor;
- break;
- default:
- break;
- }
- }
-
- /* Only set the cursor if it is different to last one set. */
- if (day_view->last_cursor_set_in_top_canvas != cursor) {
- day_view->last_cursor_set_in_top_canvas = cursor;
- gdk_window_set_cursor (widget->window, cursor);
- }
-
- }
-
- return FALSE;
-}
-
-
-static gboolean
-e_day_view_on_main_canvas_motion (GtkWidget *widget,
- GdkEventMotion *mevent,
- EDayView *day_view)
-{
- EDayViewEvent *event = NULL;
- ECalendarViewPosition pos;
- gint event_x, event_y, canvas_x, canvas_y;
- gint row, day, event_num;
- GdkCursor *cursor;
-
-#if 0
- g_print ("In e_day_view_on_main_canvas_motion\n");
-#endif
-
- /* Convert the coords to the main canvas window, or return if the
- window is not found. */
- if (!e_day_view_convert_event_coords (day_view, (GdkEvent*) mevent,
- GTK_LAYOUT (widget)->bin_window,
- &event_x, &event_y))
- return FALSE;
-
- canvas_x = event_x;
- canvas_y = event_y;
-
- pos = e_day_view_convert_position_in_main_canvas (day_view,
- canvas_x, canvas_y,
- &day, &row,
- &event_num);
- if (event_num != -1)
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
-
- if (day_view->selection_is_being_dragged) {
- if (pos != E_CALENDAR_VIEW_POS_OUTSIDE) {
- e_day_view_update_selection (day_view, day, row);
- e_day_view_check_auto_scroll (day_view,
- event_x, event_y);
- return TRUE;
- }
- } else if (day_view->resize_drag_pos != E_CALENDAR_VIEW_POS_NONE) {
- if (pos != E_CALENDAR_VIEW_POS_OUTSIDE) {
- e_day_view_update_resize (day_view, row);
- e_day_view_check_auto_scroll (day_view,
- event_x, event_y);
- return TRUE;
- }
- } else if (day_view->pressed_event_day != -1
- && day_view->pressed_event_day != E_DAY_VIEW_LONG_EVENT) {
- GtkTargetList *target_list;
-
- event = &g_array_index (day_view->events[day_view->pressed_event_day], EDayViewEvent, day_view->pressed_event_num);
-
- if ((e_cal_util_component_is_instance (event->comp_data->icalcomp) ||
- !e_cal_util_component_has_recurrences (event->comp_data->icalcomp))
- && (abs (canvas_x - day_view->drag_event_x)
- > E_DAY_VIEW_DRAG_START_OFFSET
- || abs (canvas_y - day_view->drag_event_y)
- > E_DAY_VIEW_DRAG_START_OFFSET)) {
- day_view->drag_event_day = day_view->pressed_event_day;
- day_view->drag_event_num = day_view->pressed_event_num;
- day_view->pressed_event_day = -1;
-
- /* Hide the horizontal bars. */
- if (day_view->resize_bars_event_day != -1) {
- day_view->resize_bars_event_day = -1;
- day_view->resize_bars_event_num = -1;
- gnome_canvas_item_hide (day_view->main_canvas_top_resize_bar_item);
- gnome_canvas_item_hide (day_view->main_canvas_bottom_resize_bar_item);
- }
-
- target_list = gtk_target_list_new (target_table,
- n_targets);
- gtk_drag_begin (widget, target_list,
- GDK_ACTION_COPY | GDK_ACTION_MOVE,
- 1, (GdkEvent*)mevent);
- gtk_target_list_unref (target_list);
- }
- } else {
- cursor = day_view->normal_cursor;
-
- /* Recurring events can't be resized. */
- if (event && (e_cal_util_component_is_instance (event->comp_data->icalcomp) ||
- !e_cal_util_component_has_recurrences (event->comp_data->icalcomp))) {
- switch (pos) {
- case E_CALENDAR_VIEW_POS_LEFT_EDGE:
- cursor = day_view->move_cursor;
- break;
- case E_CALENDAR_VIEW_POS_TOP_EDGE:
- case E_CALENDAR_VIEW_POS_BOTTOM_EDGE:
- cursor = day_view->resize_height_cursor;
- break;
- default:
- break;
- }
- }
-
- /* Only set the cursor if it is different to last one set. */
- if (day_view->last_cursor_set_in_main_canvas != cursor) {
- day_view->last_cursor_set_in_main_canvas = cursor;
- gdk_window_set_cursor (widget->window, cursor);
- }
- }
-
- return FALSE;
-}
-
-
-/* This sets the selection to a single cell. If day is -1 then the current
- start day is reused. If row is -1 then the selection is in the top canvas.
-*/
-void
-e_day_view_start_selection (EDayView *day_view,
- gint day,
- gint row)
-{
- if (day == -1) {
- day = day_view->selection_start_day;
- if (day == -1)
- day = 0;
- }
-
- day_view->selection_start_day = day;
- day_view->selection_end_day = day;
-
- day_view->selection_start_row = row;
- day_view->selection_end_row = row;
-
- day_view->selection_is_being_dragged = TRUE;
- day_view->selection_drag_pos = E_DAY_VIEW_DRAG_END;
- day_view->selection_in_top_canvas = (row == -1) ? TRUE : FALSE;
-
- /* FIXME: Optimise? */
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-}
-
-
-/* Updates the selection during a drag. If day is -1 the selection day is
- unchanged. */
-void
-e_day_view_update_selection (EDayView *day_view,
- gint day,
- gint row)
-{
- gboolean need_redraw = FALSE;
-
-#if 0
- g_print ("Updating selection %i,%i\n", day, row);
-#endif
-
- day_view->selection_in_top_canvas = (row == -1) ? TRUE : FALSE;
-
- if (day == -1)
- day = (day_view->selection_drag_pos == E_DAY_VIEW_DRAG_START)
- ? day_view->selection_start_day
- : day_view->selection_end_day;
-
- if (day_view->selection_drag_pos == E_DAY_VIEW_DRAG_START) {
- if (row != day_view->selection_start_row
- || day != day_view->selection_start_day) {
- need_redraw = TRUE;
- day_view->selection_start_row = row;
- day_view->selection_start_day = day;
- }
- } else {
- if (row != day_view->selection_end_row
- || day != day_view->selection_end_day) {
- need_redraw = TRUE;
- day_view->selection_end_row = row;
- day_view->selection_end_day = day;
- }
- }
-
- e_day_view_normalize_selection (day_view);
-
- /* FIXME: Optimise? */
- if (need_redraw) {
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
- }
-}
-
-
-static void
-e_day_view_normalize_selection (EDayView *day_view)
-{
- gint tmp_row, tmp_day;
-
- /* Switch the drag position if necessary. */
- if (day_view->selection_start_day > day_view->selection_end_day
- || (day_view->selection_start_day == day_view->selection_end_day
- && day_view->selection_start_row > day_view->selection_end_row)) {
- tmp_row = day_view->selection_start_row;
- tmp_day = day_view->selection_start_day;
- day_view->selection_start_day = day_view->selection_end_day;
- day_view->selection_start_row = day_view->selection_end_row;
- day_view->selection_end_day = tmp_day;
- day_view->selection_end_row = tmp_row;
- if (day_view->selection_drag_pos == E_DAY_VIEW_DRAG_START)
- day_view->selection_drag_pos = E_DAY_VIEW_DRAG_END;
- else
- day_view->selection_drag_pos = E_DAY_VIEW_DRAG_START;
- }
-}
-
-
-void
-e_day_view_finish_selection (EDayView *day_view)
-{
- day_view->selection_is_being_dragged = FALSE;
- e_day_view_update_calendar_selection_time (day_view);
-}
-
-static void
-e_day_view_update_long_event_resize (EDayView *day_view,
- gint day)
-{
- EDayViewEvent *event;
- gint event_num;
- gboolean need_reshape = FALSE;
-
-#if 0
- g_print ("Updating resize Day:%i\n", day);
-#endif
-
- event_num = day_view->resize_event_num;
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
-
- if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_LEFT_EDGE) {
- day = MIN (day, day_view->resize_end_row);
- if (day != day_view->resize_start_row) {
- need_reshape = TRUE;
- day_view->resize_start_row = day;
-
- }
- } else {
- day = MAX (day, day_view->resize_start_row);
- if (day != day_view->resize_end_row) {
- need_reshape = TRUE;
- day_view->resize_end_row = day;
- }
- }
-
- /* FIXME: Optimise? */
- if (need_reshape) {
- e_day_view_reshape_long_event (day_view, event_num);
- e_day_view_reshape_resize_long_event_rect_item (day_view);
- gtk_widget_queue_draw (day_view->top_canvas);
- }
-}
-
-
-static void
-e_day_view_update_resize (EDayView *day_view,
- gint row)
-{
- EDayViewEvent *event;
- gint day, event_num;
- gboolean need_reshape = FALSE;
-
-#if 0
- g_print ("Updating resize Row:%i\n", row);
-#endif
-
- day = day_view->resize_event_day;
- event_num = day_view->resize_event_num;
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
-
- if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_TOP_EDGE) {
- row = MIN (row, day_view->resize_end_row);
- if (row != day_view->resize_start_row) {
- need_reshape = TRUE;
- day_view->resize_start_row = row;
-
- }
- } else {
- row = MAX (row, day_view->resize_start_row);
- if (row != day_view->resize_end_row) {
- need_reshape = TRUE;
- day_view->resize_end_row = row;
- }
- }
-
- /* FIXME: Optimise? */
- if (need_reshape) {
- e_day_view_reshape_day_event (day_view, day, event_num);
- e_day_view_reshape_resize_rect_item (day_view);
- e_day_view_reshape_main_canvas_resize_bars (day_view);
- gtk_widget_queue_draw (day_view->main_canvas);
- }
-}
-
-
-/* This converts the resize start or end row back to a time and updates the
- event. */
-static void
-e_day_view_finish_long_event_resize (EDayView *day_view)
-{
- EDayViewEvent *event;
- gint event_num;
- ECalComponent *comp;
- ECalComponentDateTime date;
- struct icaltimetype itt;
- time_t dt;
- ECal *client;
- CalObjModType mod = CALOBJ_MOD_ALL;
- GtkWindow *toplevel;
- int is_date;
-
- event_num = day_view->resize_event_num;
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
-
- client = event->comp_data->client;
-
- /* We use a temporary copy of the comp since we don't want to
- change the original comp here. Otherwise we would not detect that
- the event's time had changed in the "update_event" callback. */
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
- date.value = &itt;
- date.tzid = NULL;
-
- if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_LEFT_EDGE) {
- e_cal_component_get_dtstart (comp, &date);
- is_date = date.value->is_date;
- if (!is_date)
- date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- dt = day_view->day_starts[day_view->resize_start_row];
- *date.value = icaltime_from_timet_with_zone (dt, is_date,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- e_cal_component_set_dtstart (comp, &date);
- } else {
- e_cal_component_get_dtend (comp, &date);
- is_date = date.value->is_date;
- if (!is_date)
- date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- dt = day_view->day_starts[day_view->resize_end_row + 1];
- *date.value = icaltime_from_timet_with_zone (dt, is_date,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- e_cal_component_set_dtend (comp, &date);
- }
-
- if (e_cal_component_is_instance (comp)) {
- if (!recur_component_dialog (client, comp, &mod, NULL)) {
- gtk_widget_queue_draw (day_view->top_canvas);
- goto out;
- }
- }
-
- toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (day_view)));
-
- e_cal_component_commit_sequence (comp);
- e_calendar_view_modify_and_send (comp, client, mod, toplevel, TRUE);
-
- out:
- gnome_canvas_item_hide (day_view->resize_long_event_rect_item);
-
- day_view->resize_drag_pos = E_CALENDAR_VIEW_POS_NONE;
-
- g_object_unref (comp);
-}
-
-
-/* This converts the resize start or end row back to a time and updates the
- event. */
-static void
-e_day_view_finish_resize (EDayView *day_view)
-{
- EDayViewEvent *event;
- gint day, event_num;
- ECalComponent *comp;
- ECalComponentDateTime date;
- struct icaltimetype itt;
- time_t dt;
- ECal *client;
- CalObjModType mod = CALOBJ_MOD_ALL;
- GtkWindow *toplevel;
-
- day = day_view->resize_event_day;
- event_num = day_view->resize_event_num;
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
-
- client = event->comp_data->client;
-
- /* We use a temporary shallow copy of the ico since we don't want to
- change the original ico here. Otherwise we would not detect that
- the event's time had changed in the "update_event" callback. */
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
- date.value = &itt;
- /* FIXME: Should probably keep the timezone of the original start
- and end times. */
- date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
-
- if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_TOP_EDGE) {
- dt = e_day_view_convert_grid_position_to_time (day_view, day, day_view->resize_start_row);
- *date.value = icaltime_from_timet_with_zone (dt, FALSE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- e_cal_component_set_dtstart (comp, &date);
- } else {
- dt = e_day_view_convert_grid_position_to_time (day_view, day, day_view->resize_end_row + 1);
- *date.value = icaltime_from_timet_with_zone (dt, FALSE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- e_cal_component_set_dtend (comp, &date);
- }
-
- e_cal_component_commit_sequence (comp);
-
- if (day_view->last_edited_comp_string != NULL) {
- g_free (day_view->last_edited_comp_string);
- day_view->last_edited_comp_string = NULL;
- }
-
- day_view->last_edited_comp_string = e_cal_component_get_as_string (comp);
-
- gnome_canvas_item_hide (day_view->resize_rect_item);
- gnome_canvas_item_hide (day_view->resize_bar_item);
-
- /* Hide the horizontal bars. */
- day_view->resize_bars_event_day = -1;
- day_view->resize_bars_event_num = -1;
- gnome_canvas_item_hide (day_view->main_canvas_top_resize_bar_item);
- gnome_canvas_item_hide (day_view->main_canvas_bottom_resize_bar_item);
-
- day_view->resize_drag_pos = E_CALENDAR_VIEW_POS_NONE;
-
- if (e_cal_component_is_instance (comp)) {
- if (!recur_component_dialog (client, comp, &mod, NULL)) {
- gtk_widget_queue_draw (day_view->top_canvas);
- goto out;
- }
- }
-
- toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (day_view)));
-
- e_cal_component_commit_sequence (comp);
- e_calendar_view_modify_and_send (comp, client, mod, toplevel, TRUE);
-
- out:
- g_object_unref (comp);
-}
-
-
-static void
-e_day_view_abort_resize (EDayView *day_view,
- guint32 time)
-{
- gint day, event_num;
-
- if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_NONE)
- return;
-
- day_view->resize_drag_pos = E_CALENDAR_VIEW_POS_NONE;
- gdk_pointer_ungrab (time);
-
- day = day_view->resize_event_day;
- event_num = day_view->resize_event_num;
-
- if (day == E_DAY_VIEW_LONG_EVENT) {
- e_day_view_reshape_long_event (day_view, event_num);
- gtk_widget_queue_draw (day_view->top_canvas);
-
- day_view->last_cursor_set_in_top_canvas = day_view->normal_cursor;
- gdk_window_set_cursor (day_view->top_canvas->window,
- day_view->normal_cursor);
- gnome_canvas_item_hide (day_view->resize_long_event_rect_item);
- } else {
- e_day_view_reshape_day_event (day_view, day, event_num);
- e_day_view_reshape_main_canvas_resize_bars (day_view);
- gtk_widget_queue_draw (day_view->main_canvas);
-
- day_view->last_cursor_set_in_main_canvas = day_view->normal_cursor;
- gdk_window_set_cursor (day_view->main_canvas->window,
- day_view->normal_cursor);
- gnome_canvas_item_hide (day_view->resize_rect_item);
- gnome_canvas_item_hide (day_view->resize_bar_item);
- }
-}
-
-
-static void
-e_day_view_free_events (EDayView *day_view)
-{
- gint day;
-
- /* Reset all our indices. */
- day_view->editing_event_day = -1;
- day_view->popup_event_day = -1;
- day_view->resize_bars_event_day = -1;
- day_view->resize_event_day = -1;
- day_view->pressed_event_day = -1;
- day_view->drag_event_day = -1;
- day_view->editing_event_num = -1;
- day_view->popup_event_num = -1;
-
-
- e_day_view_free_event_array (day_view, day_view->long_events);
-
- for (day = 0; day < E_DAY_VIEW_MAX_DAYS; day++)
- e_day_view_free_event_array (day_view, day_view->events[day]);
-}
-
-
-static void
-e_day_view_free_event_array (EDayView *day_view,
- GArray *array)
-{
- EDayViewEvent *event;
- gint event_num;
-
- for (event_num = 0; event_num < array->len; event_num++) {
- event = &g_array_index (array, EDayViewEvent, event_num);
- if (event->canvas_item)
- gtk_object_destroy (GTK_OBJECT (event->canvas_item));
-
- e_cal_model_free_component_data (event->comp_data);
- }
-
- g_array_set_size (array, 0);
-}
-
-
-/* This adds one event to the view, adding it to the appropriate array. */
-static gboolean
-e_day_view_add_event (ECalComponent *comp,
- time_t start,
- time_t end,
- gpointer data)
-
-{
- EDayViewEvent event;
- gint day, offset;
- struct icaltimetype start_tt, end_tt;
- AddEventData *add_event_data;
-
- add_event_data = data;
-
-#if 0
- g_print ("Day view lower: %s", ctime (&add_event_data->day_view->lower));
- g_print ("Day view upper: %s", ctime (&add_event_data->day_view->upper));
- g_print ("Event start: %s", ctime (&start));
- g_print ("Event end : %s\n", ctime (&end));
-#endif
-
- /* Check that the event times are valid. */
- g_return_val_if_fail (start <= end, TRUE);
- g_return_val_if_fail (start < add_event_data->day_view->upper, TRUE);
- g_return_val_if_fail (end > add_event_data->day_view->lower, TRUE);
-
- start_tt = icaltime_from_timet_with_zone (start, FALSE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (add_event_data->day_view)));
- end_tt = icaltime_from_timet_with_zone (end, FALSE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (add_event_data->day_view)));
-
- if (add_event_data->comp_data) {
- event.comp_data = e_cal_model_copy_component_data (add_event_data->comp_data);
- } else {
- event.comp_data = g_new0 (ECalModelComponent, 1);
-
- event.comp_data->client = g_object_ref (e_cal_model_get_default_client (e_calendar_view_get_model (E_CALENDAR_VIEW (add_event_data->day_view))));
- e_cal_component_abort_sequence (comp);
- event.comp_data->icalcomp = icalcomponent_new_clone (e_cal_component_get_icalcomponent (comp));
- }
-
- event.start = start;
- event.end = end;
- event.canvas_item = NULL;
- event.comp_data->instance_start = start;
- event.comp_data->instance_end = end;
-
- /* Calculate the start & end minute, relative to the top of the
- display. */
- offset = add_event_data->day_view->first_hour_shown * 60
- + add_event_data->day_view->first_minute_shown;
- event.start_minute = start_tt.hour * 60 + start_tt.minute - offset;
- event.end_minute = end_tt.hour * 60 + end_tt.minute - offset;
-
- event.start_row_or_col = 0;
- event.num_columns = 0;
-
- event.different_timezone = FALSE;
- if (!cal_comp_util_compare_event_timezones (comp,
- event.comp_data->client,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (add_event_data->day_view))))
- event.different_timezone = TRUE;
-
- /* Find out which array to add the event to. */
- for (day = 0; day < add_event_data->day_view->days_shown; day++) {
- if (start >= add_event_data->day_view->day_starts[day]
- && end <= add_event_data->day_view->day_starts[day + 1]) {
-
- /* Special case for when the appointment ends at
- midnight, i.e. the start of the next day. */
- if (end == add_event_data->day_view->day_starts[day + 1]) {
-
- /* If the event last the entire day, then we
- skip it here so it gets added to the top
- canvas. */
- if (start == add_event_data->day_view->day_starts[day])
- break;
-
- event.end_minute = 24 * 60;
- }
-
- g_array_append_val (add_event_data->day_view->events[day], event);
- add_event_data->day_view->events_sorted[day] = FALSE;
- add_event_data->day_view->need_layout[day] = TRUE;
- return TRUE;
- }
- }
-
- /* The event wasn't within one day so it must be a long event,
- i.e. shown in the top canvas. */
- g_array_append_val (add_event_data->day_view->long_events, event);
- add_event_data->day_view->long_events_sorted = FALSE;
- add_event_data->day_view->long_events_need_layout = TRUE;
- return TRUE;
-}
-
-
-/* This lays out the short (less than 1 day) events in the columns.
- Any long events are simply skipped. */
-void
-e_day_view_check_layout (EDayView *day_view)
-{
- gint day, rows_in_top_display, top_canvas_height, top_rows;
-
- /* Don't bother if we aren't visible. */
- if (!GTK_WIDGET_VISIBLE (day_view))
- return;
-
- /* Make sure the events are sorted (by start and size). */
- e_day_view_ensure_events_sorted (day_view);
-
- for (day = 0; day < day_view->days_shown; day++) {
- if (day_view->need_layout[day])
- e_day_view_layout_day_events (day_view->events[day],
- day_view->rows,
- day_view->mins_per_row,
- day_view->cols_per_row[day]);
-
- if (day_view->need_layout[day]
- || day_view->need_reshape[day]) {
- e_day_view_reshape_day_events (day_view, day);
-
- if (day_view->resize_bars_event_day == day)
- e_day_view_reshape_main_canvas_resize_bars (day_view);
- }
-
- day_view->need_layout[day] = FALSE;
- day_view->need_reshape[day] = FALSE;
- }
-
- if (day_view->long_events_need_layout) {
- e_day_view_layout_long_events (day_view->long_events,
- day_view->days_shown,
- day_view->day_starts,
- &rows_in_top_display);
-
- /* Set the height of the top canvas based on the row height
- and the number of rows needed (min 1 + 1 for the dates + 1
- space for DnD).*/
- if (day_view->rows_in_top_display != rows_in_top_display) {
- day_view->rows_in_top_display = rows_in_top_display;
- top_rows = MAX (1, rows_in_top_display);
- top_canvas_height = (top_rows + 2)
- * day_view->top_row_height;
- gtk_widget_set_usize (day_view->top_canvas, -1,
- top_canvas_height);
- }
- }
-
-
- if (day_view->long_events_need_layout
- || day_view->long_events_need_reshape)
- e_day_view_reshape_long_events (day_view);
-
- day_view->long_events_need_layout = FALSE;
- day_view->long_events_need_reshape = FALSE;
-}
-
-
-static void
-e_day_view_reshape_long_events (EDayView *day_view)
-{
- EDayViewEvent *event;
- gint event_num;
-
- for (event_num = 0; event_num < day_view->long_events->len;
- event_num++) {
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
-
- if (event->num_columns == 0) {
- if (event->canvas_item) {
- gtk_object_destroy (GTK_OBJECT (event->canvas_item));
- event->canvas_item = NULL;
- }
- } else {
- e_day_view_reshape_long_event (day_view, event_num);
- }
- }
-}
-
-
-static void
-e_day_view_reshape_long_event (EDayView *day_view,
- gint event_num)
-{
- EDayViewEvent *event;
- gint start_day, end_day, item_x, item_y, item_w, item_h;
- gint text_x, text_w, num_icons, icons_width, width, time_width;
- ECalComponent *comp;
- gint min_text_x, max_text_w, text_width, line_len;
- gchar *text, *end_of_line;
- gboolean show_icons = TRUE, use_max_width = FALSE;
- PangoFontDescription *font_desc;
- PangoContext *pango_context;
- PangoLayout *layout;
-
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
-
- if (!e_day_view_get_long_event_position (day_view, event_num,
- &start_day, &end_day,
- &item_x, &item_y,
- &item_w, &item_h)) {
- if (event->canvas_item) {
- gtk_object_destroy (GTK_OBJECT (event->canvas_item));
- event->canvas_item = NULL;
- }
- return;
- }
-
- /* Take off the border and padding. */
- item_x += E_DAY_VIEW_LONG_EVENT_BORDER_WIDTH + E_DAY_VIEW_LONG_EVENT_X_PAD;
- item_w -= (E_DAY_VIEW_LONG_EVENT_BORDER_WIDTH + E_DAY_VIEW_LONG_EVENT_X_PAD) * 2;
- item_y += E_DAY_VIEW_LONG_EVENT_BORDER_HEIGHT + E_DAY_VIEW_LONG_EVENT_Y_PAD;
- item_h -= (E_DAY_VIEW_LONG_EVENT_BORDER_HEIGHT + E_DAY_VIEW_LONG_EVENT_Y_PAD) * 2;
-
- /* We don't show the icons while resizing, since we'd have to
- draw them on top of the resize rect. Nor when editing. */
- num_icons = 0;
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
- /* Set up Pango prerequisites */
- font_desc = gtk_widget_get_style (GTK_WIDGET (day_view))->font_desc;
- pango_context = gtk_widget_get_pango_context (GTK_WIDGET (day_view));
- layout = pango_layout_new (pango_context);
-
- if (day_view->resize_drag_pos != E_CALENDAR_VIEW_POS_NONE
- && day_view->resize_event_day == E_DAY_VIEW_LONG_EVENT
- && day_view->resize_event_num == event_num)
- show_icons = FALSE;
-
- if (day_view->editing_event_day == E_DAY_VIEW_LONG_EVENT
- && day_view->editing_event_num == event_num) {
- show_icons = FALSE;
- use_max_width = TRUE;
- }
-
- if (show_icons) {
- GSList *categories_list, *elem;
-
- if (e_cal_component_has_alarms (comp))
- num_icons++;
- if (e_cal_component_has_recurrences (comp))
- num_icons++;
- if (event->different_timezone)
- num_icons++;
- if (e_cal_component_has_organizer (comp))
- num_icons++;
- if (e_cal_component_has_attachments (comp))
- num_icons++;
- e_cal_component_get_categories_list (comp, &categories_list);
- for (elem = categories_list; elem; elem = elem->next) {
- char *category;
- GdkPixmap *pixmap = NULL;
- GdkBitmap *mask = NULL;
-
- category = (char *) elem->data;
- if (e_categories_config_get_icon_for (category, &pixmap, &mask))
- num_icons++;
- }
- e_cal_component_free_categories_list (categories_list);
- }
-
- if (!event->canvas_item) {
- GtkWidget *widget;
-
- widget = (GtkWidget *)day_view;
- event->canvas_item =
- gnome_canvas_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->top_canvas)->root),
- e_text_get_type (),
- "anchor", GTK_ANCHOR_NW,
- "clip", TRUE,
- "max_lines", 1,
- "editable", TRUE,
- "use_ellipsis", TRUE,
- "draw_background", FALSE,
- "fill_color_gdk", &widget->style->text[GTK_STATE_NORMAL],
- "im_context", E_CANVAS (day_view->top_canvas)->im_context,
- NULL);
- g_signal_connect (event->canvas_item, "event",
- G_CALLBACK (e_day_view_on_text_item_event), day_view);
- g_signal_emit_by_name (G_OBJECT(day_view),
- "event_added", event);
-
- e_day_view_update_long_event_label (day_view, event_num);
- }
-
- /* Calculate its position. We first calculate the ideal position which
- is centered with the icons. We then make sure we haven't gone off
- the left edge of the available space. Finally we make sure we don't
- go off the right edge. */
- icons_width = (E_DAY_VIEW_ICON_WIDTH + E_DAY_VIEW_ICON_X_PAD)
- * num_icons + E_DAY_VIEW_LONG_EVENT_ICON_R_PAD;
- time_width = e_day_view_get_time_string_width (day_view);
-
- if (use_max_width) {
- text_x = item_x;
- text_w = item_w;
- } else {
- /* Get the requested size of the label. */
- g_object_get (G_OBJECT (event->canvas_item), "text", &text, NULL);
- text_width = 0;
- if (text) {
- end_of_line = strchr (text, '\n');
- if (end_of_line)
- line_len = end_of_line - text;
- else
- line_len = strlen (text);
- pango_layout_set_text (layout, text, line_len);
- pango_layout_get_pixel_size (layout, &text_width, NULL);
- g_free (text);
- }
-
- width = text_width + icons_width;
- text_x = item_x + (item_w - width) / 2;
-
- min_text_x = item_x;
- if (event->start > day_view->day_starts[start_day])
- min_text_x += time_width + E_DAY_VIEW_LONG_EVENT_TIME_X_PAD;
-
- text_x = MAX (text_x, min_text_x);
-
- max_text_w = item_x + item_w - text_x;
- if (event->end < day_view->day_starts[end_day + 1])
- max_text_w -= time_width + E_DAY_VIEW_LONG_EVENT_TIME_X_PAD;
-
- text_w = MIN (width, max_text_w);
-
- /* Now take out the space for the icons. */
- text_x += icons_width;
- text_w -= icons_width;
- }
-
- text_w = MAX (text_w, 0);
- gnome_canvas_item_set (event->canvas_item,
- "clip_width", (gdouble) text_w,
- "clip_height", (gdouble) item_h,
- NULL);
- e_canvas_item_move_absolute(event->canvas_item,
- text_x, item_y);
-
- g_object_unref (layout);
-}
-
-
-/* This creates or updates the sizes of the canvas items for one day of the
- main canvas. */
-static void
-e_day_view_reshape_day_events (EDayView *day_view,
- gint day)
-{
- gint event_num;
-
- for (event_num = 0; event_num < day_view->events[day]->len;
- event_num++) {
- EDayViewEvent *event;
- gchar *current_comp_string;
-
- e_day_view_reshape_day_event (day_view, day, event_num);
- event = &g_array_index (day_view->events[day], EDayViewEvent, event_num);
- current_comp_string = icalcomponent_as_ical_string (event->comp_data->icalcomp);
- if (day_view->last_edited_comp_string == NULL)
- continue;
- if (strncmp (current_comp_string, day_view->last_edited_comp_string,50) == 0) {
- e_canvas_item_grab_focus (event->canvas_item, TRUE);
- g_free (day_view->last_edited_comp_string);
- day_view-> last_edited_comp_string = NULL;
- }
- }
-}
-
-
-static void
-e_day_view_reshape_day_event (EDayView *day_view,
- gint day,
- gint event_num)
-{
- EDayViewEvent *event;
- gint item_x, item_y, item_w, item_h;
- gint num_icons, icons_offset;
-
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
-
- if (!e_day_view_get_event_position (day_view, day, event_num,
- &item_x, &item_y,
- &item_w, &item_h)) {
- if (event->canvas_item) {
- gtk_object_destroy (GTK_OBJECT (event->canvas_item));
- event->canvas_item = NULL;
- }
- } else {
- /* Skip the border and padding. */
- item_x += E_DAY_VIEW_BAR_WIDTH + E_DAY_VIEW_EVENT_X_PAD;
- item_w -= E_DAY_VIEW_BAR_WIDTH + E_DAY_VIEW_EVENT_X_PAD * 2;
- item_y += E_DAY_VIEW_EVENT_BORDER_HEIGHT + E_DAY_VIEW_EVENT_Y_PAD;
- item_h -= (E_DAY_VIEW_EVENT_BORDER_HEIGHT + E_DAY_VIEW_EVENT_Y_PAD) * 2;
-
- /* We don't show the icons while resizing, since we'd have to
- draw them on top of the resize rect. */
- num_icons = 0;
- if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_NONE
- || day_view->resize_event_day != day
- || day_view->resize_event_num != event_num) {
- GSList *categories_list, *elem;
- ECalComponent *comp;
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
- if (e_cal_component_has_alarms (comp))
- num_icons++;
- if (e_cal_component_has_recurrences (comp))
- num_icons++;
- if (e_cal_component_has_attachments (comp))
- num_icons++;
- if (event->different_timezone)
- num_icons++;
- if (e_cal_component_has_organizer (comp))
- num_icons++;
-
- e_cal_component_get_categories_list (comp, &categories_list);
- for (elem = categories_list; elem; elem = elem->next) {
- char *category;
- GdkPixmap *pixmap = NULL;
- GdkBitmap *mask = NULL;
-
- category = (char *) elem->data;
- if (e_categories_config_get_icon_for (category, &pixmap, &mask))
- num_icons++;
- }
- e_cal_component_free_categories_list (categories_list);
- }
-
- if (num_icons > 0) {
- if (item_h >= (E_DAY_VIEW_ICON_HEIGHT + E_DAY_VIEW_ICON_Y_PAD) * num_icons)
- icons_offset = E_DAY_VIEW_ICON_WIDTH + E_DAY_VIEW_ICON_X_PAD * 2;
- else
- icons_offset = (E_DAY_VIEW_ICON_WIDTH + E_DAY_VIEW_ICON_X_PAD) * num_icons + E_DAY_VIEW_ICON_X_PAD;
- item_x += icons_offset;
- item_w -= icons_offset;
- }
-
- if (!event->canvas_item) {
- GtkWidget *widget;
-
- widget = (GtkWidget *)day_view;
- event->canvas_item =
- gnome_canvas_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->main_canvas)->root),
- e_text_get_type (),
- "anchor", GTK_ANCHOR_NW,
- "line_wrap", TRUE,
- "editable", TRUE,
- "clip", TRUE,
- "use_ellipsis", TRUE,
- "draw_background", FALSE,
- "fill_color_gdk", &widget->style->text[GTK_STATE_NORMAL],
- "im_context", E_CANVAS (day_view->main_canvas)->im_context,
- NULL);
- g_signal_connect (event->canvas_item, "event",
- G_CALLBACK (e_day_view_on_text_item_event), day_view);
- g_signal_emit_by_name (G_OBJECT(day_view),
- "event_added", event);
-
- e_day_view_update_event_label (day_view, day, event_num);
- }
-
- item_w = MAX (item_w, 0);
- gnome_canvas_item_set (event->canvas_item,
- "clip_width", (gdouble) item_w,
- "clip_height", (gdouble) item_h,
- NULL);
- e_canvas_item_move_absolute(event->canvas_item,
- item_x, item_y);
- }
-}
-
-
-/* This creates or resizes the horizontal bars used to resize events in the
- main canvas. */
-static void
-e_day_view_reshape_main_canvas_resize_bars (EDayView *day_view)
-{
- gint day, event_num;
- gint item_x, item_y, item_w, item_h;
- gdouble x, y, w, h;
-
- day = day_view->resize_bars_event_day;
- event_num = day_view->resize_bars_event_num;
-
- /* If we're not editing an event, or the event is not shown,
- hide the resize bars. */
- if (day != -1 && day == day_view->drag_event_day
- && event_num == day_view->drag_event_num) {
- g_object_get (G_OBJECT (day_view->drag_rect_item),
- "x1", &x,
- "y1", &y,
- "x2", &w,
- "y2", &h,
- NULL);
- w -= x;
- x++;
- h -= y;
- } else if (day != -1
- && e_day_view_get_event_position (day_view, day, event_num,
- &item_x, &item_y,
- &item_w, &item_h)) {
- x = item_x + E_DAY_VIEW_BAR_WIDTH;
- y = item_y;
- w = item_w - E_DAY_VIEW_BAR_WIDTH;
- h = item_h;
- } else {
- gnome_canvas_item_hide (day_view->main_canvas_top_resize_bar_item);
- gnome_canvas_item_hide (day_view->main_canvas_bottom_resize_bar_item);
- return;
- }
-
- gnome_canvas_item_set (day_view->main_canvas_top_resize_bar_item,
- "x1", x - E_DAY_VIEW_BAR_WIDTH,
- "y1", y - E_DAY_VIEW_BAR_HEIGHT,
- "x2", x + w - 1,
- "y2", y - 1,
- NULL);
- gnome_canvas_item_show (day_view->main_canvas_top_resize_bar_item);
-
- gnome_canvas_item_set (day_view->main_canvas_bottom_resize_bar_item,
- "x1", x - E_DAY_VIEW_BAR_WIDTH,
- "y1", y + h,
- "x2", x + w - 1,
- "y2", y + h + E_DAY_VIEW_BAR_HEIGHT - 1,
- NULL);
- gnome_canvas_item_show (day_view->main_canvas_bottom_resize_bar_item);
-}
-
-
-static void
-e_day_view_ensure_events_sorted (EDayView *day_view)
-{
- gint day;
-
- /* Sort the long events. */
- if (!day_view->long_events_sorted) {
- qsort (day_view->long_events->data,
- day_view->long_events->len,
- sizeof (EDayViewEvent),
- e_day_view_event_sort_func);
- day_view->long_events_sorted = TRUE;
- }
-
- /* Sort the events for each day. */
- for (day = 0; day < day_view->days_shown; day++) {
- if (!day_view->events_sorted[day]) {
- qsort (day_view->events[day]->data,
- day_view->events[day]->len,
- sizeof (EDayViewEvent),
- e_day_view_event_sort_func);
- day_view->events_sorted[day] = TRUE;
- }
- }
-}
-
-
-gint
-e_day_view_event_sort_func (const void *arg1,
- const void *arg2)
-{
- EDayViewEvent *event1, *event2;
-
- event1 = (EDayViewEvent*) arg1;
- event2 = (EDayViewEvent*) arg2;
-
- if (event1->start < event2->start)
- return -1;
- if (event1->start > event2->start)
- return 1;
-
- if (event1->end > event2->end)
- return -1;
- if (event1->end < event2->end)
- return 1;
-
- return 0;
-}
-
-static gboolean
-e_day_view_do_key_press (GtkWidget *widget, GdkEventKey *event)
-{
- EDayView *day_view;
- icalcomponent *icalcomp;
- ECal *ecal;
- ECalModel *model;
- ECalComponent *comp;
- gint day, event_num;
- gchar *initial_text;
- guint keyval;
- gboolean stop_emission;
- time_t dtstart, dtend;
- ECalComponentDateTime start_dt, end_dt;
- struct icaltimetype start_tt, end_tt;
- const char *uid;
- AddEventData add_event_data;
- gboolean read_only = TRUE;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_DAY_VIEW (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- day_view = E_DAY_VIEW (widget);
- keyval = event->keyval;
-
- /* The Escape key aborts a resize operation. */
- if (day_view->resize_drag_pos != E_CALENDAR_VIEW_POS_NONE) {
- if (keyval == GDK_Escape) {
- e_day_view_abort_resize (day_view, event->time);
- }
- return FALSE;
- }
-
- /* Alt + Arrow Keys to move a selected event through time lines */
- if (((event->state & GDK_SHIFT_MASK) != GDK_SHIFT_MASK)
- &&((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)
- &&((event->state & GDK_MOD1_MASK) == GDK_MOD1_MASK)) {
- if (keyval == GDK_Up || keyval == GDK_KP_Up)
- return e_day_view_event_move ((ECalendarView *) day_view, E_CAL_VIEW_MOVE_UP);
- else if (keyval == GDK_Down || keyval == GDK_KP_Down)
- return e_day_view_event_move ((ECalendarView *) day_view, E_CAL_VIEW_MOVE_DOWN);
- else if (keyval == GDK_Left || keyval == GDK_KP_Left)
- return e_day_view_event_move ((ECalendarView *) day_view, E_CAL_VIEW_MOVE_LEFT);
- else if (keyval == GDK_Right || keyval == GDK_KP_Right)
- return e_day_view_event_move ((ECalendarView *) day_view, E_CAL_VIEW_MOVE_RIGHT);
- }
-
- /*Go to the start/end of a work day*/
- if ((keyval == GDK_Home)
- &&((event->state & GDK_SHIFT_MASK) != GDK_SHIFT_MASK)
- &&((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)
- &&((event->state & GDK_MOD1_MASK) != GDK_MOD1_MASK)) {
- e_day_view_goto_start_of_work_day (day_view);
- return TRUE;
- }
- if ((keyval == GDK_End)
- &&((event->state & GDK_SHIFT_MASK) != GDK_SHIFT_MASK)
- &&((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)
- &&((event->state & GDK_MOD1_MASK) != GDK_MOD1_MASK)) {
- e_day_view_goto_end_of_work_day (day_view);
- return TRUE;
- }
-
- /* In DayView, Shift+Home/End, Change the duration to the time that begins/ends the current work day */
- if ((keyval == GDK_Home)
- &&((event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK)
- &&((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)
- &&((event->state & GDK_MOD1_MASK) != GDK_MOD1_MASK)) {
- e_day_view_change_duration_to_start_of_work_day (day_view);
- return TRUE;
- }
- if ((keyval == GDK_End)
- &&((event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK)
- &&((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)
- &&((event->state & GDK_MOD1_MASK) != GDK_MOD1_MASK)) {
- e_day_view_change_duration_to_end_of_work_day (day_view);
- return TRUE;
- }
-
-
- /* Handle the cursor keys for moving & extending the selection. */
- stop_emission = TRUE;
- if (event->state & GDK_SHIFT_MASK) {
- switch (keyval) {
- case GDK_Up:
- e_day_view_cursor_key_up_shifted (day_view, event);
- break;
- case GDK_Down:
- e_day_view_cursor_key_down_shifted (day_view, event);
- break;
- case GDK_Left:
- e_day_view_cursor_key_left_shifted (day_view, event);
- break;
- case GDK_Right:
- e_day_view_cursor_key_right_shifted (day_view, event);
- break;
- default:
- stop_emission = FALSE;
- break;
- }
- } else if (!(event->state & GDK_MOD1_MASK)) {
- switch (keyval) {
- case GDK_Up:
- e_day_view_cursor_key_up (day_view, event);
- break;
- case GDK_Down:
- e_day_view_cursor_key_down (day_view, event);
- break;
- case GDK_Left:
- e_day_view_cursor_key_left (day_view, event);
- break;
- case GDK_Right:
- e_day_view_cursor_key_right (day_view, event);
- break;
- case GDK_Page_Up:
- e_day_view_scroll (day_view, E_DAY_VIEW_PAGE_STEP);
- break;
- case GDK_Page_Down:
- e_day_view_scroll (day_view, -E_DAY_VIEW_PAGE_STEP);
- break;
- default:
- stop_emission = FALSE;
- break;
- }
- }
- else
- stop_emission = FALSE;
- if (stop_emission)
- return TRUE;
-
- if (day_view->selection_start_day == -1)
- return FALSE;
-
- /* Check if there is room for a new event to be typed in. If there
- isn't we don't want to add an event as we will then add a new
- event for every key press. */
- if (!e_day_view_check_if_new_event_fits (day_view)) {
- return FALSE;
- }
-
- /* Check if the client is read only */
- model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
- ecal = e_cal_model_get_default_client (model);
- if (!e_cal_is_read_only (ecal, &read_only, NULL) || read_only)
- return FALSE;
-
- /* We only want to start an edit with a return key or a simple
- character. */
- if (keyval == GDK_Return) {
- initial_text = NULL;
- } else if (((keyval >= 0x20) && (keyval <= 0xFF)
- && (event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK)))
- || (event->length == 0)
- || (keyval == GDK_Tab)) {
- return FALSE;
- } else
- initial_text = e_utf8_from_gtk_event_key (widget, event->keyval, event->string);
-
- /* Add a new event covering the selected range */
- icalcomp = e_cal_model_create_component_with_defaults (model);
- if (!icalcomp)
- return FALSE;
- uid = icalcomponent_get_uid (icalcomp);
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomp);
-
- e_day_view_get_selected_time_range ((ECalendarView *) day_view, &dtstart, &dtend);
-
- start_tt = icaltime_from_timet_with_zone (dtstart, FALSE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
-
- end_tt = icaltime_from_timet_with_zone (dtend, FALSE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
-
- if (day_view->selection_in_top_canvas) {
- start_dt.tzid = NULL;
- start_tt.is_date = 1;
- end_tt.is_date = 1;
- } else {
- start_dt.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- }
-
- start_dt.value = &start_tt;
- end_dt.value = &end_tt;
- end_dt.tzid = start_dt.tzid;
- e_cal_component_set_dtstart (comp, &start_dt);
- e_cal_component_set_dtend (comp, &end_dt);
-
- e_cal_component_set_categories (
- comp, e_calendar_view_get_default_category (E_CALENDAR_VIEW (day_view)));
-
- /* We add the event locally and start editing it. We don't send it
- to the server until the user finishes editing it. */
- add_event_data.day_view = day_view;
- add_event_data.comp_data = NULL;
- e_day_view_add_event (comp, dtstart, dtend, &add_event_data);
- e_day_view_check_layout (day_view);
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-
- if (e_day_view_find_event_from_uid (day_view, ecal, uid, NULL, &day, &event_num)) {
- e_day_view_start_editing_event (day_view, day, event_num,
- initial_text);
- } else {
- g_warning ("Couldn't find event to start editing.\n");
- }
-
- if (initial_text)
- g_free (initial_text);
-
- g_object_unref (comp);
-
- return TRUE;
-}
-
-static gboolean
-e_day_view_key_press (GtkWidget *widget, GdkEventKey *event)
-{
- gboolean handled = FALSE;
- handled = e_day_view_do_key_press (widget, event);
-
- /* if not handled, try key bindings */
- if (!handled)
- handled = GTK_WIDGET_CLASS (e_day_view_parent_class)->key_press_event (widget, event);
- return handled;
-}
-
-/* Select the time that begins a work day*/
-static void
-e_day_view_goto_start_of_work_day (EDayView *day_view)
-{
- g_return_if_fail(day_view!=NULL);
-
- if (day_view->selection_in_top_canvas)
- return;
- else
- day_view->selection_start_row =
- e_day_view_convert_time_to_row (day_view,
- day_view->work_day_start_hour,
- day_view->work_day_start_minute);
- day_view->selection_end_row = day_view->selection_start_row;
-
- e_day_view_ensure_rows_visible (day_view,
- day_view->selection_start_row,
- day_view->selection_end_row);
-
- e_day_view_update_calendar_selection_time (day_view);
-
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-}
-
-
-/* Select the time that ends a work day*/
-static void
-e_day_view_goto_end_of_work_day (EDayView *day_view)
-{
- if (day_view->selection_in_top_canvas)
- return;
- else
- day_view->selection_start_row =
- e_day_view_convert_time_to_row (day_view,
- day_view->work_day_end_hour-1,
- day_view->work_day_end_minute+30);
- day_view->selection_end_row = day_view->selection_start_row;
-
- e_day_view_ensure_rows_visible (day_view,
- day_view->selection_start_row,
- day_view->selection_end_row);
-
- e_day_view_update_calendar_selection_time (day_view);
-
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-}
-
-/* Change the duration to the time that begins the current work day */
-static void
-e_day_view_change_duration_to_start_of_work_day (EDayView *day_view)
-{
- g_return_if_fail(day_view != NULL);
-
- if (day_view->selection_in_top_canvas)
- return;
- else {
- gint work_start_row,work_end_row,selection_start_row,selection_end_row;
-
- work_start_row =
- e_day_view_convert_time_to_row (day_view,
- day_view->work_day_start_hour,
- day_view->work_day_start_minute);
- work_end_row =
- e_day_view_convert_time_to_row (day_view,
- day_view->work_day_end_hour - 1,
- day_view->work_day_end_minute + 30);
- selection_start_row = day_view->selection_start_row;
- selection_end_row = day_view->selection_end_row;
- if (selection_start_row < work_start_row)
- day_view->selection_end_row = work_start_row - 1;
- else day_view->selection_start_row = work_start_row;
- }
-
- e_day_view_ensure_rows_visible (day_view,
- day_view->selection_start_row,
- day_view->selection_end_row);
-
- e_day_view_update_calendar_selection_time (day_view);
-
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-}
-
-/* Change the duration to the time that ends the current work day */
-static void
-e_day_view_change_duration_to_end_of_work_day (EDayView *day_view)
-{
- g_return_if_fail(day_view != NULL);
-
- if (day_view->selection_in_top_canvas)
- return;
- else {
- gint work_start_row,work_end_row,selection_start_row,selection_end_row;
- work_start_row =
- e_day_view_convert_time_to_row (day_view,
- day_view->work_day_start_hour,
- day_view->work_day_start_minute);
- work_end_row = e_day_view_convert_time_to_row (day_view,
- day_view->work_day_end_hour-1,
- day_view->work_day_end_minute+30);
- selection_start_row = day_view->selection_start_row;
- selection_end_row = day_view->selection_end_row;
- if (selection_start_row <= work_end_row)
- day_view->selection_end_row = work_end_row;
- else {
- day_view->selection_start_row = work_end_row + 1;
- day_view->selection_end_row = selection_start_row;
- }
- }
-
- e_day_view_ensure_rows_visible (day_view,
- day_view->selection_start_row,
- day_view->selection_end_row);
-
- e_day_view_update_calendar_selection_time (day_view);
-
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-}
-
-
-static void
-e_day_view_cursor_key_up_shifted (EDayView *day_view, GdkEventKey *event)
-{
- gint *row;
-
- if (day_view->selection_in_top_canvas)
- return;
-
- if (day_view->selection_drag_pos == E_DAY_VIEW_DRAG_START)
- row = &day_view->selection_start_row;
- else
- row = &day_view->selection_end_row;
-
- if (*row == 0)
- return;
-
- *row = *row - 1;
-
- e_day_view_ensure_rows_visible (day_view, *row, *row);
-
- e_day_view_normalize_selection (day_view);
-
- e_day_view_update_calendar_selection_time (day_view);
-
- /* FIXME: Optimise? */
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-}
-
-static gboolean
-e_day_view_focus (GtkWidget *widget, GtkDirectionType direction)
-{
- EDayView *day_view;
- gint new_day;
- gint new_event_num;
- gint start_row, end_row;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_DAY_VIEW (widget), FALSE);
- day_view = E_DAY_VIEW (widget);
-
- if (!e_day_view_get_next_tab_event (day_view, direction,
- &new_day, &new_event_num))
- return FALSE;
-
- if ((new_day == -1) && (new_event_num == -1)) {
- /* focus should go to the day view widget itself
- */
- gtk_widget_grab_focus (GTK_WIDGET(day_view));
- return TRUE;
- }
-
- if (new_day != E_DAY_VIEW_LONG_EVENT && new_day != -1) {
- if (e_day_view_get_event_rows (day_view, new_day,
- new_event_num,
- &start_row, &end_row))
- /* ensure the event to be seen */
- e_day_view_ensure_rows_visible (day_view,
- start_row, end_row);
- }
- e_day_view_start_editing_event (day_view, new_day,
- new_event_num, NULL);
-
- return TRUE;
-}
-
-/**
- * e_day_view_get_extreme_event
- * @day_view: the day view widget operates on
- * @start_day, @end_day: range of search, both inclusive
- * @first: %TURE indicate to return the data for the first event in the range,
- * %FALSE to return data for the last event in the range.
- * @day_out: out value, day of the event found. -1 for no event found.
- * @event_num_out: out value, event number of the event found.
- * -1 for no event found.
- *
- * Get day and event_num value for the first or last event found in the day range.
- *
- * Return value: %TRUE, if a event found.
- **/
-static gboolean
-e_day_view_get_extreme_event (EDayView *day_view, gint start_day,
- gint end_day, gboolean first,
- gint *day_out, gint *event_num_out)
-{
- gint loop_day;
-
- g_return_val_if_fail (day_view != NULL, FALSE);
- g_return_val_if_fail (start_day >= 0, FALSE);
- g_return_val_if_fail (end_day <= E_DAY_VIEW_LONG_EVENT, FALSE);
- g_return_val_if_fail (day_out && event_num_out, FALSE);
-
- if (start_day > end_day)
- return FALSE;
- if (first) {
- for (loop_day = start_day; loop_day <= end_day; ++loop_day)
- if (day_view->events[loop_day]->len > 0) {
- *day_out = loop_day;
- *event_num_out = 0;
- return TRUE;
- }
- }
- else {
- for (loop_day = end_day; loop_day >= start_day; --loop_day)
- if (day_view->events[loop_day]->len > 0) {
- *day_out = loop_day;
- *event_num_out =
- day_view->events[loop_day]->len - 1;
- return TRUE;
- }
- }
- *day_out = -1;
- *event_num_out = -1;
- return FALSE;
-}
-
-/**
- * e_day_view_get_extreme_long_event
- * @day_view: the day view widget operates on
- * @first: %TURE indicate to return the data for the first event in the range,
- * %FALSE to return data for the last event in the range.
- * @event_num_out: out value, event number of the event found.
- * -1 for no event found.
- *
- * Similar to e_day_view_get_extreme_event, but run for long events.
- *
- * Return value: %TRUE, if a event found.
- **/
-static gboolean
-e_day_view_get_extreme_long_event (EDayView *day_view, gboolean first,
- gint *day_out, gint *event_num_out)
-{
- g_return_val_if_fail (day_view != NULL, FALSE);
- g_return_val_if_fail (day_out && event_num_out, FALSE);
-
- if (first && (day_view->long_events->len > 0)) {
- *day_out = E_DAY_VIEW_LONG_EVENT;
- *event_num_out = 0;
- return TRUE;
- }
- if ((!first) && (day_view->long_events->len > 0)) {
- *day_out = E_DAY_VIEW_LONG_EVENT;
- *event_num_out = day_view->long_events->len - 1;
- return TRUE;
- }
- *day_out = -1;
- *event_num_out = -1;
- return FALSE;
-}
-
-/**
- * e_day_view_get_next_tab_event
- * @day_view: the day view widget operates on
- * @direction: GTK_DIR_TAB_BACKWARD or GTK_DIR_TAB_FORWARD
- * @day_out: out value, day of the event found. -1 for no event found.
- * @event_num_out: out value, event number of the event found.
- * -1 for no event found.
- *
- * Decide on which event the focus should go next.
- * if ((day_out == -1) && (event_num_out == -1)) is true, focus should go
- * to day_view widget itself.
- *
- * Return value: %TRUE, if a event found.
- **/
-static gboolean
-e_day_view_get_next_tab_event (EDayView *day_view, GtkDirectionType direction,
- gint *day_out, gint *event_num_out)
-{
- gint new_day;
- gint new_event_num;
- gint days_shown;
-
- g_return_val_if_fail (day_view != NULL, FALSE);
- g_return_val_if_fail (day_out != NULL, FALSE);
- g_return_val_if_fail (event_num_out != NULL, FALSE);
-
- days_shown = e_day_view_get_days_shown(day_view);
- *day_out = -1;
- *event_num_out = -1;
-
- g_return_val_if_fail (days_shown > 0, FALSE);
-
- switch (direction) {
- case GTK_DIR_TAB_BACKWARD:
- new_event_num = day_view->editing_event_num - 1;
- break;
- case GTK_DIR_TAB_FORWARD:
- new_event_num = day_view->editing_event_num + 1;
- break;
- default:
- return FALSE;
- }
-
- new_day = day_view->editing_event_day;
-
- /* not current editing event, set to first long event if there is one
- */
- if (new_day == -1) {
- if (direction == GTK_DIR_TAB_FORWARD) {
- if (e_day_view_get_extreme_long_event (day_view, TRUE,
- day_out,
- event_num_out))
- return TRUE;
-
- /* no long event, set to first event if there is
- */
- e_day_view_get_extreme_event (day_view, 0,
- days_shown - 1, TRUE,
- day_out, event_num_out);
- /* go to event if found, or day view widget
- */
- return TRUE;
- }
- else {
- if (e_day_view_get_extreme_event (day_view, 0,
- days_shown - 1, FALSE,
- day_out, event_num_out))
- return TRUE;
-
- /* no event, set to last long event if there is
- */
- e_day_view_get_extreme_long_event (day_view, FALSE,
- day_out,
- event_num_out);
-
- /* go to long event if found, or day view widget
- */
- return TRUE;
- }
- }
- /* go backward from the first long event */
- else if ((new_day == E_DAY_VIEW_LONG_EVENT) && (new_event_num < 0)) {
- /* let focus go to day view widget in this case
- */
- return TRUE;
- }
- /* go forward from the last long event */
- else if ((new_day == E_DAY_VIEW_LONG_EVENT) &&
- (new_event_num >= day_view->long_events->len)) {
- e_day_view_get_extreme_event (day_view, 0,
- days_shown - 1, TRUE,
- day_out, event_num_out);
- /* go to the next main item event if found or day view widget
- */
- return TRUE;
- }
-
- /* go backward from the first event in current editting day */
- else if ((new_day < E_DAY_VIEW_LONG_EVENT) && (new_event_num < 0)) {
- /* try to find a event from the previous day in days shown
- */
- if (e_day_view_get_extreme_event (day_view, 0,
- new_day - 1, FALSE,
- day_out, event_num_out))
- return TRUE;
- /* try to find a long event
- */
- e_day_view_get_extreme_long_event (day_view, FALSE,
- day_out, event_num_out);
- /* go to a long event if found, or day view widget
- */
- return TRUE;
- }
- /* go forward from the last event in current editting day */
- else if ((new_day < E_DAY_VIEW_LONG_EVENT) &&
- (new_event_num >= day_view->events[new_day]->len)) {
- /* try to find a event from the next day in days shown
- */
- e_day_view_get_extreme_event (day_view, (new_day + 1),
- days_shown - 1, TRUE,
- day_out, event_num_out);
- /* go to a event found, or day view widget
- */
- return TRUE;
- }
- /* in the normal case
- */
- *day_out = new_day;
- *event_num_out = new_event_num;
- return TRUE;
-}
-
-static void
-e_day_view_cursor_key_down_shifted (EDayView *day_view, GdkEventKey *event)
-{
- gint *row;
-
- if (day_view->selection_in_top_canvas)
- return;
-
- if (day_view->selection_drag_pos == E_DAY_VIEW_DRAG_START)
- row = &day_view->selection_start_row;
- else
- row = &day_view->selection_end_row;
-
- if (*row >= day_view->rows - 1)
- return;
-
- *row = *row + 1;
-
- e_day_view_ensure_rows_visible (day_view, *row, *row);
-
- e_day_view_normalize_selection (day_view);
-
- e_day_view_update_calendar_selection_time (day_view);
-
- /* FIXME: Optimise? */
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-}
-
-
-static void
-e_day_view_cursor_key_left_shifted (EDayView *day_view, GdkEventKey *event)
-{
- gint *day;
-
- if (day_view->selection_drag_pos == E_DAY_VIEW_DRAG_START)
- day = &day_view->selection_start_day;
- else
- day = &day_view->selection_end_day;
-
- if (*day == 0)
- return;
-
- *day = *day - 1;
-
- e_day_view_normalize_selection (day_view);
-
- e_day_view_update_calendar_selection_time (day_view);
-
- /* FIXME: Optimise? */
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-}
-
-
-static void
-e_day_view_cursor_key_right_shifted (EDayView *day_view, GdkEventKey *event)
-{
- gint *day;
-
- if (day_view->selection_drag_pos == E_DAY_VIEW_DRAG_START)
- day = &day_view->selection_start_day;
- else
- day = &day_view->selection_end_day;
-
- if (*day >= day_view->days_shown - 1)
- return;
-
- *day = *day + 1;
-
- e_day_view_normalize_selection (day_view);
-
- e_day_view_update_calendar_selection_time (day_view);
-
- /* FIXME: Optimise? */
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-}
-
-
-static void
-e_day_view_cursor_key_up (EDayView *day_view, GdkEventKey *event)
-{
- if (day_view->selection_start_day == -1) {
- day_view->selection_start_day = 0;
- day_view->selection_start_row = 0;
- }
- day_view->selection_end_day = day_view->selection_start_day;
-
- if (day_view->selection_in_top_canvas) {
- return;
- } else if (day_view->selection_start_row == 0) {
- day_view->selection_in_top_canvas = TRUE;
- day_view->selection_start_row = -1;
- } else {
- day_view->selection_start_row--;
- }
- day_view->selection_end_row = day_view->selection_start_row;
-
- if (!day_view->selection_in_top_canvas)
- e_day_view_ensure_rows_visible (day_view,
- day_view->selection_start_row,
- day_view->selection_end_row);
-
- g_signal_emit_by_name (day_view, "selected_time_changed");
- e_day_view_update_calendar_selection_time (day_view);
-
- /* FIXME: Optimise? */
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-}
-
-
-static void
-e_day_view_cursor_key_down (EDayView *day_view, GdkEventKey *event)
-{
- if (day_view->selection_start_day == -1) {
- day_view->selection_start_day = 0;
- day_view->selection_start_row = 0;
- }
- day_view->selection_end_day = day_view->selection_start_day;
-
- if (day_view->selection_in_top_canvas) {
- day_view->selection_in_top_canvas = FALSE;
- day_view->selection_start_row = 0;
- } else if (day_view->selection_start_row >= day_view->rows - 1) {
- return;
- } else {
- day_view->selection_start_row++;
- }
- day_view->selection_end_row = day_view->selection_start_row;
-
- if (!day_view->selection_in_top_canvas)
- e_day_view_ensure_rows_visible (day_view,
- day_view->selection_start_row,
- day_view->selection_end_row);
-
- g_signal_emit_by_name (day_view, "selected_time_changed");
- e_day_view_update_calendar_selection_time (day_view);
-
- /* FIXME: Optimise? */
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
-}
-
-
-static void
-e_day_view_cursor_key_left (EDayView *day_view, GdkEventKey *event)
-{
- if (day_view->selection_start_day == 0) {
- gnome_calendar_previous (e_calendar_view_get_calendar (E_CALENDAR_VIEW (day_view)));
- } else {
- day_view->selection_start_day--;
- day_view->selection_end_day--;
-
- e_day_view_update_calendar_selection_time (day_view);
-
- /* FIXME: Optimise? */
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
- }
- g_signal_emit_by_name (day_view, "selected_time_changed");
-}
-
-
-static void
-e_day_view_cursor_key_right (EDayView *day_view, GdkEventKey *event)
-{
- if (day_view->selection_end_day == day_view->days_shown - 1) {
- gnome_calendar_next (e_calendar_view_get_calendar (E_CALENDAR_VIEW (day_view)));
- } else {
- day_view->selection_start_day++;
- day_view->selection_end_day++;
-
- e_day_view_update_calendar_selection_time (day_view);
-
- /* FIXME: Optimise? */
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
- }
- g_signal_emit_by_name (day_view, "selected_time_changed");
-}
-
-
-/* Scrolls the main canvas up or down. The pages_to_scroll argument
- is multiplied with the adjustment's page size and added to the adjustment's
- value, while ensuring we stay within the bounds. A positive value will
- scroll the canvas down and a negative value will scroll it up. */
-static void
-e_day_view_scroll (EDayView *day_view,
- gfloat pages_to_scroll)
-{
- GtkAdjustment *adj = GTK_LAYOUT (day_view->main_canvas)->vadjustment;
- gfloat new_value;
-
- new_value = adj->value - adj->page_size * pages_to_scroll;
- new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
- gtk_adjustment_set_value (adj, new_value);
-}
-
-
-static gboolean
-e_day_view_check_if_new_event_fits (EDayView *day_view)
-{
- gint day, start_row, end_row, row;
-
- day = day_view->selection_start_day;
- start_row = day_view->selection_start_row;
- end_row = day_view->selection_end_row;
-
- /* Long events always fit, since we keep adding rows to the top
- canvas. */
- if (day != day_view->selection_end_day)
- return TRUE;
- if (start_row == 0 && end_row == day_view->rows)
- return TRUE;
-
- /* If any of the rows already have E_DAY_VIEW_MAX_COLUMNS columns,
- return FALSE. */
- for (row = start_row; row <= end_row; row++) {
- if (day_view->cols_per_row[day][row] >= E_DAY_VIEW_MAX_COLUMNS)
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-void
-e_day_view_ensure_rows_visible (EDayView *day_view,
- gint start_row,
- gint end_row)
-{
- GtkAdjustment *adj;
- gfloat value, min_value, max_value;
-
- adj = GTK_LAYOUT (day_view->main_canvas)->vadjustment;
-
- value = adj->value;
-
- min_value = (end_row + 1) * day_view->row_height - adj->page_size;
- if (value < min_value)
- value = min_value;
-
- max_value = start_row * day_view->row_height;
- if (value > max_value)
- value = max_value;
-
- if (value != adj->value) {
- adj->value = value;
- gtk_adjustment_value_changed (adj);
- }
-}
-
-
-static void
-e_day_view_start_editing_event (EDayView *day_view,
- gint day,
- gint event_num,
- gchar *initial_text)
-{
- EDayViewEvent *event;
- ETextEventProcessor *event_processor = NULL;
- ETextEventProcessorCommand command;
- gboolean read_only;
-
-#if 0
- g_print ("In e_day_view_start_editing_event\n");
-#endif
-
- /* If we are already editing the event, just return. */
- if (day == day_view->editing_event_day
- && event_num == day_view->editing_event_num)
- return;
-
- if (day == E_DAY_VIEW_LONG_EVENT) {
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
- } else {
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
- }
-
- if (!e_cal_is_read_only (event->comp_data->client, &read_only, NULL) || read_only)
- return;
-
- /* If the event is not shown, don't try to edit it. */
- if (!event->canvas_item)
- return;
-
- /* We must grab the focus before setting the initial text, since
- grabbing the focus will result in a call to
- e_day_view_on_editing_started(), which will reset the text to get
- rid of the start and end times. */
- e_canvas_item_grab_focus (event->canvas_item, TRUE);
-
- if (initial_text) {
- gnome_canvas_item_set (event->canvas_item,
- "text", initial_text,
- NULL);
- }
-
- /* Try to move the cursor to the end of the text. */
- g_object_get (G_OBJECT (event->canvas_item),
- "event_processor", &event_processor,
- NULL);
- if (event_processor) {
- command.action = E_TEP_MOVE;
- command.position = E_TEP_END_OF_BUFFER;
- g_signal_emit_by_name (event_processor,
- "command", &command);
- }
-}
-
-
-/* This stops the current edit. If accept is TRUE the event summary is updated,
- else the edit is cancelled. */
-static void
-e_day_view_stop_editing_event (EDayView *day_view)
-{
- GtkWidget *toplevel;
-
- /* Check we are editing an event. */
- if (day_view->editing_event_day == -1)
- return;
-
- /* Set focus to the toplevel so the item loses focus. */
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (day_view));
- if (toplevel && GTK_IS_WINDOW (toplevel))
- gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
-}
-
-
-/* Cancels the current edition by resetting the appointment's text to its original value */
-static void
-cancel_editing (EDayView *day_view)
-{
- int day, event_num;
- EDayViewEvent *event;
- const gchar *summary;
-
- day = day_view->editing_event_day;
- event_num = day_view->editing_event_num;
-
- g_assert (day != -1);
-
- if (day == E_DAY_VIEW_LONG_EVENT)
- event = &g_array_index (day_view->long_events, EDayViewEvent, event_num);
- else
- event = &g_array_index (day_view->events[day], EDayViewEvent, event_num);
-
- /* Reset the text to what was in the component */
-
- summary = icalcomponent_get_summary (event->comp_data->icalcomp);
- g_object_set (G_OBJECT (event->canvas_item),
- "text", summary ? summary : "",
- NULL);
-
- /* Stop editing */
- e_day_view_stop_editing_event (day_view);
-}
-
-
-static gboolean
-e_day_view_on_text_item_event (GnomeCanvasItem *item,
- GdkEvent *event,
- EDayView *day_view)
-{
- switch (event->type) {
- case GDK_KEY_PRESS:
- if (event && event->key.keyval == GDK_Return) {
- day_view->resize_event_num = -1;
-
- /* We set the keyboard focus to the EDayView, so the
- EText item loses it and stops the edit. */
- gtk_widget_grab_focus (GTK_WIDGET (day_view));
-
- /* Stop the signal last or we will also stop any
- other events getting to the EText item. */
- gtk_signal_emit_stop_by_name (GTK_OBJECT (item),
- "event");
- return TRUE;
- } else if (event->key.keyval == GDK_Escape) {
- cancel_editing (day_view);
- gtk_signal_emit_stop_by_name (GTK_OBJECT (item), "event");
- /* focus should go to day view when stop editing */
- gtk_widget_grab_focus (GTK_WIDGET (day_view));
- return TRUE;
- } else if ((event->key.keyval == GDK_Up)
- && (event->key.state & GDK_SHIFT_MASK)
- && (event->key.state & GDK_CONTROL_MASK)
- && (event->key.state & GDK_MOD1_MASK)) {
- e_day_view_change_event_end_time_up (day_view);
- return TRUE;
- } else if ((event->key.keyval == GDK_Down)
- && (event->key.state & GDK_SHIFT_MASK)
- && (event->key.state & GDK_CONTROL_MASK)
- && (event->key.state & GDK_MOD1_MASK)) {
- e_day_view_change_event_end_time_down (day_view);
- return TRUE;
- }
- break;
- case GDK_2BUTTON_PRESS:
-#if 0
- g_print ("Item got double-click\n");
-#endif
- break;
-
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- /* Only let the EText handle the event while editing. */
- if (!E_TEXT (item)->editing)
- gtk_signal_emit_stop_by_name (GTK_OBJECT (item),
- "event");
- break;
- case GDK_FOCUS_CHANGE:
- if (event->focus_change.in)
- e_day_view_on_editing_started (day_view, item);
- else
- e_day_view_on_editing_stopped (day_view, item);
-
- return FALSE;
- default:
- break;
- }
-
- return FALSE;
-}
-
-static gboolean
-e_day_view_event_move (ECalendarView *cal_view, ECalViewMoveDirection direction)
-{
- EDayViewEvent *event;
- EDayView *day_view;
- gint day, event_num, resize_start_row, resize_end_row;
- time_t start_dt, end_dt;
- struct icaltimetype start_time, end_time;
-
- day_view = E_DAY_VIEW (cal_view);
- day = day_view->editing_event_day;
- event_num = day_view->editing_event_num;
-
- if ((day == -1) || (day == E_DAY_VIEW_LONG_EVENT))
- return FALSE;
-
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
- day_view->resize_event_day = day;
- day_view->resize_event_num = event_num;
- day_view->resize_bars_event_day = day;
- day_view->resize_bars_event_num = event_num;
- resize_start_row = event->start_minute / day_view->mins_per_row;
- resize_end_row = (event->end_minute - 1) / day_view->mins_per_row;
- if (resize_end_row < resize_start_row)
- resize_end_row = resize_start_row;
-
- switch (direction) {
- case E_CAL_VIEW_MOVE_UP:
- if (resize_start_row <= 0)
- return FALSE;
- resize_start_row--;
- resize_end_row--;
- start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row);
- end_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_end_row + 1);
- break;
- case E_CAL_VIEW_MOVE_DOWN:
- if (resize_end_row >= day_view->rows - 1)
- return FALSE;
- resize_start_row++;
- resize_end_row++;
- start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row);
- end_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_end_row + 1);
- break;
- case E_CAL_VIEW_MOVE_LEFT:
- if (day <= 0)
- return TRUE;
- start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row);
- end_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_end_row + 1);
- start_time = icaltime_from_timet (start_dt, 0);
- end_time = icaltime_from_timet (end_dt, 0);
- icaltime_adjust (&start_time ,-1,0,0,0);
- icaltime_adjust (&end_time ,-1,0,0,0);
- start_dt = icaltime_as_timet (start_time);
- end_dt = icaltime_as_timet (end_time);
- break;
- case E_CAL_VIEW_MOVE_RIGHT:
- if (day + 1 >= day_view->days_shown)
- return TRUE;
- start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row);
- end_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_end_row + 1);
- start_time = icaltime_from_timet (start_dt, 0);
- end_time = icaltime_from_timet (end_dt, 0);
- icaltime_adjust (&start_time ,1,0,0,0);
- icaltime_adjust (&end_time ,1,0,0,0);
- start_dt = icaltime_as_timet (start_time);
- end_dt = icaltime_as_timet (end_time);
- break;
- default:
- return FALSE;
- }
-
- e_day_view_change_event_time (day_view, start_dt, end_dt);
- e_day_view_ensure_rows_visible (day_view, resize_start_row, resize_end_row);
-
- return TRUE;
-}
-
-static void
-e_day_view_change_event_time (EDayView *day_view, time_t start_dt, time_t end_dt)
-{
- EDayViewEvent *event;
- gint day, event_num;
- ECalComponent *comp;
- ECalComponentDateTime date;
- struct icaltimetype itt;
- ECal *client;
- CalObjModType mod = CALOBJ_MOD_ALL;
- GtkWindow *toplevel;
-
- day = day_view->editing_event_day;
- event_num = day_view->editing_event_num;
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
- client = event->comp_data->client;
-
- /* We use a temporary shallow copy of the ico since we don't want to
- change the original ico here. Otherwise we would not detect that
- the event's time had changed in the "update_event" callback. */
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
- date.value = &itt;
- /* FIXME: Should probably keep the timezone of the original start
- and end times. */
- date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
-
- *date.value = icaltime_from_timet_with_zone (start_dt, FALSE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- e_cal_component_set_dtstart (comp, &date);
- *date.value = icaltime_from_timet_with_zone (end_dt, FALSE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- e_cal_component_set_dtend (comp, &date);
-
- e_cal_component_commit_sequence (comp);
-
- if (day_view->last_edited_comp_string != NULL) {
- g_free (day_view->last_edited_comp_string);
- day_view->last_edited_comp_string = NULL;
- }
-
- day_view->last_edited_comp_string = e_cal_component_get_as_string (comp);
-
- gnome_canvas_item_hide (day_view->resize_rect_item);
- gnome_canvas_item_hide (day_view->resize_bar_item);
-
- day_view->resize_drag_pos = E_CALENDAR_VIEW_POS_NONE;
-
- if (e_cal_component_is_instance (comp)) {
- if (!recur_component_dialog (client, comp, &mod, NULL)) {
- gtk_widget_queue_draw (day_view->top_canvas);
- goto out;
- }
- }
-
- toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (day_view)));
-
- e_cal_component_commit_sequence (comp);
- e_calendar_view_modify_and_send (comp, client, mod, toplevel, TRUE);
-
-out:
- g_object_unref (comp);
-}
-
-static void
-e_day_view_change_event_end_time_up (EDayView *day_view)
-{
- EDayViewEvent *event;
- gint day, event_num, resize_start_row, resize_end_row;
-
- day = day_view->editing_event_day;
- event_num = day_view->editing_event_num;
- if ((day == -1) || (day == E_DAY_VIEW_LONG_EVENT))
- return;
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
- day_view->resize_event_day = day;
- day_view->resize_event_num = event_num;
- day_view->resize_bars_event_day = day;
- day_view->resize_bars_event_num = event_num;
- resize_start_row = event->start_minute / day_view->mins_per_row;
- resize_end_row = (event->end_minute - 1) / day_view->mins_per_row;
- if (resize_end_row < resize_start_row)
- resize_end_row = resize_start_row;
- if (resize_end_row == resize_start_row)
- return;
- day_view->resize_drag_pos = E_CALENDAR_VIEW_POS_BOTTOM_EDGE;
- resize_end_row--;
- day_view->resize_start_row = resize_start_row;
- day_view->resize_end_row = resize_end_row;
- e_day_view_finish_resize (day_view);
- e_day_view_ensure_rows_visible (day_view, resize_start_row, resize_end_row);
-}
-
-
-static void
-e_day_view_change_event_end_time_down (EDayView *day_view)
-{
- EDayViewEvent *event;
- gint day, event_num, resize_start_row, resize_end_row;
-
- day = day_view->editing_event_day;
- event_num = day_view->editing_event_num;
- if ((day == -1) || (day == E_DAY_VIEW_LONG_EVENT))
- return;
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
- day_view->resize_event_day = day;
- day_view->resize_event_num = event_num;
- day_view->resize_bars_event_day = day;
- day_view->resize_bars_event_num = event_num;
- resize_start_row = event->start_minute / day_view->mins_per_row;
- resize_end_row = (event->end_minute - 1) / day_view->mins_per_row;
- if (resize_end_row < resize_start_row)
- resize_end_row = resize_start_row;
- if (resize_end_row == day_view->rows -1)
- return;
- day_view->resize_drag_pos = E_CALENDAR_VIEW_POS_BOTTOM_EDGE;
- resize_end_row++;
- day_view->resize_start_row = resize_start_row;
- day_view->resize_end_row = resize_end_row;
- e_day_view_finish_resize (day_view);
- e_day_view_ensure_rows_visible (day_view, resize_start_row, resize_end_row);
-}
-
-
-static void
-e_day_view_on_editing_started (EDayView *day_view,
- GnomeCanvasItem *item)
-{
- gint day, event_num;
-
- if (!e_day_view_find_event_from_item (day_view, item,
- &day, &event_num))
- return;
-
-#if 0
- g_print ("In e_day_view_on_editing_started Day:%i Event:%i\n",
- day, event_num);
-#endif
-
- /* FIXME: This is a temporary workaround for a bug which seems to stop
- us getting focus_out signals. It is not a complete fix since if we
- don't get focus_out signals we don't save the appointment text so
- this may be lost. */
- if (day_view->editing_event_day == day
- && day_view->editing_event_num == event_num)
- return;
-
- day_view->editing_event_day = day;
- day_view->editing_event_num = event_num;
-
- if (day == E_DAY_VIEW_LONG_EVENT) {
- e_day_view_reshape_long_event (day_view, event_num);
- } else {
- day_view->resize_bars_event_day = day;
- day_view->resize_bars_event_num = event_num;
- e_day_view_update_event_label (day_view, day, event_num);
- e_day_view_reshape_main_canvas_resize_bars (day_view);
- }
-
- g_signal_emit_by_name (day_view, "selection_changed");
-}
-
-static void
-e_day_view_on_editing_stopped (EDayView *day_view,
- GnomeCanvasItem *item)
-{
- gint day, event_num;
- gboolean editing_long_event = FALSE;
- EDayViewEvent *event;
- gchar *text = NULL;
- ECalComponentText summary;
- ECalComponent *comp;
- ECal *client;
- gboolean on_server;
-
- /* Note: the item we are passed here isn't reliable, so we just stop
- the edit of whatever item was being edited. We also receive this
- event twice for some reason. */
- day = day_view->editing_event_day;
- event_num = day_view->editing_event_num;
-
-#if 0
- g_print ("In e_day_view_on_editing_stopped Day:%i Event:%i\n",
- day, event_num);
-#endif
-
- /* If no item is being edited, just return. */
- if (day == -1)
- return;
-
- if (day == E_DAY_VIEW_LONG_EVENT) {
- editing_long_event = TRUE;
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
- } else {
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
-
- /* Hide the horizontal bars. */
- gnome_canvas_item_hide (day_view->main_canvas_top_resize_bar_item);
- gnome_canvas_item_hide (day_view->main_canvas_bottom_resize_bar_item);
- }
-
- /* Reset the edit fields. */
- day_view->editing_event_day = -1;
- day_view->editing_event_num = -1;
-
- day_view->resize_bars_event_day = -1;
- day_view->resize_bars_event_num = -1;
-
- g_object_set (event->canvas_item, "handle_popup", FALSE, NULL);
- g_object_get (G_OBJECT (event->canvas_item),
- "text", &text,
- NULL);
- g_assert (text != NULL);
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
- client = event->comp_data->client;
- on_server = cal_comp_is_on_server (comp, client);
-
- if (string_is_empty (text) && !on_server) {
- const char *uid;
-
- e_cal_component_get_uid (comp, &uid);
-
- e_day_view_foreach_event_with_uid (day_view, uid,
- e_day_view_remove_event_cb, NULL);
- e_day_view_check_layout (day_view);
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
- goto out;
- }
-
- /* Only update the summary if necessary. */
- e_cal_component_get_summary (comp, &summary);
- if (summary.value && !strcmp (text, summary.value)) {
- if (day == E_DAY_VIEW_LONG_EVENT)
- e_day_view_reshape_long_event (day_view, event_num);
- else
- e_day_view_update_event_label (day_view, day,
- event_num);
- } else if (summary.value || !string_is_empty (text)) {
- icalcomponent *icalcomp = e_cal_component_get_icalcomponent (comp);
-
- summary.value = text;
- summary.altrep = NULL;
- e_cal_component_set_summary (comp, &summary);
- e_cal_component_commit_sequence (comp);
-
- if (!on_server) {
- if (!e_cal_create_object (client, icalcomp, NULL, NULL))
- g_message (G_STRLOC ": Could not create the object!");
- else
- g_signal_emit_by_name (day_view, "user_created");
-
- /* we remove the object since we either got the update from the server or failed */
- e_day_view_remove_event_cb (day_view, day, event_num, NULL);
- } else {
- CalObjModType mod = CALOBJ_MOD_ALL;
- GtkWindow *toplevel;
- if (e_cal_component_is_instance (comp)) {
- if (!recur_component_dialog (client, comp, &mod, NULL)) {
- goto out;
- }
- }
-
- /* FIXME When sending here, what exactly should we send? */
- toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (day_view)));
- e_calendar_view_modify_and_send (comp, client, mod, toplevel, FALSE);
- }
-
- }
-
- out:
-
- g_object_unref (comp);
- g_free (text);
-
- g_signal_emit_by_name (day_view, "selection_changed");
-}
-
-
-/* FIXME: It is possible that we may produce an invalid time due to daylight
- saving times (i.e. when clocks go forward there is a range of time which
- is not valid). I don't know the best way to handle daylight saving time. */
-static time_t
-e_day_view_convert_grid_position_to_time (EDayView *day_view,
- gint col,
- gint row)
-{
- struct icaltimetype tt;
- time_t val;
- gint minutes;
-
- /* Calulate the number of minutes since the start of the day. */
- minutes = day_view->first_hour_shown * 60
- + day_view->first_minute_shown
- + row * day_view->mins_per_row;
-
- /* A special case for midnight, where we can use the start of the
- next day. */
- if (minutes == 60 * 24)
- return day_view->day_starts[col + 1];
-
- /* Create an icaltimetype and convert to a time_t. */
- tt = icaltime_from_timet_with_zone (day_view->day_starts[col],
- FALSE, e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- tt.hour = minutes / 60;
- tt.minute = minutes % 60;
- tt.second = 0;
-
- val = icaltime_as_timet_with_zone (tt, e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- return val;
-}
-
-
-static gboolean
-e_day_view_convert_time_to_grid_position (EDayView *day_view,
- time_t time,
- gint *col,
- gint *row)
-{
- struct icaltimetype tt;
- gint day, minutes;
-
- *col = *row = 0;
-
- if (time < day_view->lower || time >= day_view->upper)
- return FALSE;
-
- /* We can find the column easily using the day_starts array. */
- for (day = 1; day <= day_view->days_shown; day++) {
- if (time < day_view->day_starts[day]) {
- *col = day - 1;
- break;
- }
- }
-
- /* To find the row we need to convert the time to an icaltimetype,
- calculate the offset in minutes from the top of the display and
- divide it by the mins per row setting. */
- tt = icaltime_from_timet_with_zone (time, FALSE, e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
-
- minutes = tt.hour * 60 + tt.minute;
- minutes -= day_view->first_hour_shown * 60 + day_view->first_minute_shown;
-
- *row = minutes / day_view->mins_per_row;
-
- if (*row < 0 || *row >= day_view->rows)
- return FALSE;
-
- return TRUE;
-}
-
-
-/* This starts or stops auto-scrolling when dragging a selection or resizing
- an event. */
-void
-e_day_view_check_auto_scroll (EDayView *day_view,
- gint event_x,
- gint event_y)
-{
- gint scroll_x, scroll_y;
-
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (day_view->main_canvas),
- &scroll_x, &scroll_y);
-
- event_x -= scroll_x;
- event_y -= scroll_y;
-
- day_view->last_mouse_x = event_x;
- day_view->last_mouse_y = event_y;
-
- if (event_y < E_DAY_VIEW_AUTO_SCROLL_OFFSET)
- e_day_view_start_auto_scroll (day_view, TRUE);
- else if (event_y >= day_view->main_canvas->allocation.height
- - E_DAY_VIEW_AUTO_SCROLL_OFFSET)
- e_day_view_start_auto_scroll (day_view, FALSE);
- else
- e_day_view_stop_auto_scroll (day_view);
-}
-
-
-static void
-e_day_view_start_auto_scroll (EDayView *day_view,
- gboolean scroll_up)
-{
- if (day_view->auto_scroll_timeout_id == 0) {
- day_view->auto_scroll_timeout_id = g_timeout_add (E_DAY_VIEW_AUTO_SCROLL_TIMEOUT, e_day_view_auto_scroll_handler, day_view);
- day_view->auto_scroll_delay = E_DAY_VIEW_AUTO_SCROLL_DELAY;
- }
- day_view->auto_scroll_up = scroll_up;
-}
-
-
-void
-e_day_view_stop_auto_scroll (EDayView *day_view)
-{
- if (day_view->auto_scroll_timeout_id != 0) {
- gtk_timeout_remove (day_view->auto_scroll_timeout_id);
- day_view->auto_scroll_timeout_id = 0;
- }
-}
-
-
-static gboolean
-e_day_view_auto_scroll_handler (gpointer data)
-{
- EDayView *day_view;
- ECalendarViewPosition pos;
- gint scroll_x, scroll_y, new_scroll_y, canvas_x, canvas_y, row, day;
- GtkAdjustment *adj;
-
- g_return_val_if_fail (E_IS_DAY_VIEW (data), FALSE);
-
- day_view = E_DAY_VIEW (data);
-
- GDK_THREADS_ENTER ();
-
- if (day_view->auto_scroll_delay > 0) {
- day_view->auto_scroll_delay--;
- GDK_THREADS_LEAVE ();
- return TRUE;
- }
-
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (day_view->main_canvas),
- &scroll_x, &scroll_y);
-
- adj = GTK_LAYOUT (day_view->main_canvas)->vadjustment;
-
- if (day_view->auto_scroll_up)
- new_scroll_y = MAX (scroll_y - adj->step_increment, 0);
- else
- new_scroll_y = MIN (scroll_y + adj->step_increment,
- adj->upper - adj->page_size);
-
- if (new_scroll_y != scroll_y) {
- /* NOTE: This reduces flicker, but only works if we don't use
- canvas items which have X windows. */
-
- /* FIXME: Since GNOME 2.0 we can't do this, since the canvas
- * won't update when its's thawed. Is this a bug or should we
- * really be doing something else? Investigate. */
-#if 0
- gtk_layout_freeze (GTK_LAYOUT (day_view->main_canvas));
-#endif
-
- gnome_canvas_scroll_to (GNOME_CANVAS (day_view->main_canvas),
- scroll_x, new_scroll_y);
-#if 0
- gtk_layout_thaw (GTK_LAYOUT (day_view->main_canvas));
-#endif
- }
-
- canvas_x = day_view->last_mouse_x + scroll_x;
- canvas_y = day_view->last_mouse_y + new_scroll_y;
-
- /* The last_mouse_x position is set to -1 when we are selecting using
- the time column. In this case we set canvas_x to 0 and we ignore
- the resulting day. */
- if (day_view->last_mouse_x == -1)
- canvas_x = 0;
-
- /* Update the selection/resize/drag if necessary. */
- pos = e_day_view_convert_position_in_main_canvas (day_view,
- canvas_x, canvas_y,
- &day, &row, NULL);
-
- if (day_view->last_mouse_x == -1)
- day = -1;
-
- if (pos != E_CALENDAR_VIEW_POS_OUTSIDE) {
- if (day_view->selection_is_being_dragged) {
- e_day_view_update_selection (day_view, day, row);
- } else if (day_view->resize_drag_pos != E_CALENDAR_VIEW_POS_NONE) {
- e_day_view_update_resize (day_view, row);
- } else if (day_view->drag_item->object.flags
- & GNOME_CANVAS_ITEM_VISIBLE) {
- e_day_view_update_main_canvas_drag (day_view, row,
- day);
- }
- }
-
- GDK_THREADS_LEAVE ();
- return TRUE;
-}
-
-gboolean
-e_day_view_get_event_rows (EDayView *day_view,
- gint day,
- gint event_num,
- gint *start_row_out,
- gint *end_row_out)
-{
- gint start_row, end_row;
- EDayViewEvent *event;
-
- g_return_val_if_fail (day >= 0, FALSE);
- g_return_val_if_fail (day < E_DAY_VIEW_LONG_EVENT, FALSE);
- g_return_val_if_fail (event_num >= 0, FALSE);
-
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
- start_row = event->start_minute / day_view->mins_per_row;
- end_row = (event->end_minute - 1) / day_view->mins_per_row;
- if (end_row < start_row)
- end_row = start_row;
-
- *start_row_out = start_row;
- *end_row_out = end_row;
- return TRUE;
-}
-
-gboolean
-e_day_view_get_event_position (EDayView *day_view,
- gint day,
- gint event_num,
- gint *item_x,
- gint *item_y,
- gint *item_w,
- gint *item_h)
-{
- EDayViewEvent *event;
- gint start_row, end_row, cols_in_row, start_col, num_columns;
-
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
-
- /* If the event is flagged as not displayed, return FALSE. */
- if (event->num_columns == 0)
- return FALSE;
-
- e_day_view_get_event_rows(day_view, day, event_num, &start_row, &end_row);
-
- cols_in_row = day_view->cols_per_row[day][start_row];
- start_col = event->start_row_or_col;
- num_columns = event->num_columns;
-
- if (cols_in_row == 0)
- return FALSE;
-
- /* If the event is being resize, use the resize position. */
- if (day_view->resize_drag_pos != E_CALENDAR_VIEW_POS_NONE
- && day_view->resize_event_day == day
- && day_view->resize_event_num == event_num) {
- if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_TOP_EDGE)
- start_row = day_view->resize_start_row;
- else if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_BOTTOM_EDGE)
- end_row = day_view->resize_end_row;
- }
-
-
- *item_x = day_view->day_offsets[day]
- + day_view->day_widths[day] * start_col / cols_in_row;
- *item_w = day_view->day_widths[day] * num_columns / cols_in_row
- - E_DAY_VIEW_GAP_WIDTH;
- *item_w = MAX (*item_w, 0);
- *item_y = start_row * day_view->row_height;
-#if 0
- *item_h = (end_row - start_row + 1) * day_view->row_height;
-#else
- /* This makes the event end on the grid line of the next row,
- which maybe looks nicer if you have 2 events on consecutive rows. */
- *item_h = (end_row - start_row + 1) * day_view->row_height + 1;
-#endif
- return TRUE;
-}
-
-
-gboolean
-e_day_view_get_long_event_position (EDayView *day_view,
- gint event_num,
- gint *start_day,
- gint *end_day,
- gint *item_x,
- gint *item_y,
- gint *item_w,
- gint *item_h)
-{
- EDayViewEvent *event;
-
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
-
- /* If the event is flagged as not displayed, return FALSE. */
- if (event->num_columns == 0)
- return FALSE;
-
- if (!e_day_view_find_long_event_days (event,
- day_view->days_shown,
- day_view->day_starts,
- start_day, end_day))
- return FALSE;
-
- /* If the event is being resize, use the resize position. */
- if (day_view->resize_drag_pos != E_CALENDAR_VIEW_POS_NONE
- && day_view->resize_event_day == E_DAY_VIEW_LONG_EVENT
- && day_view->resize_event_num == event_num) {
- if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_LEFT_EDGE)
- *start_day = day_view->resize_start_row;
- else if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_RIGHT_EDGE)
- *end_day = day_view->resize_end_row;
- }
-
- *item_x = day_view->day_offsets[*start_day] + E_DAY_VIEW_BAR_WIDTH;
- *item_w = day_view->day_offsets[*end_day + 1] - *item_x
- - E_DAY_VIEW_GAP_WIDTH;
- *item_w = MAX (*item_w, 0);
- *item_y = (event->start_row_or_col + 1) * day_view->top_row_height;
- *item_h = day_view->top_row_height - E_DAY_VIEW_TOP_CANVAS_Y_GAP;
- return TRUE;
-}
-
-
-/* Converts a position within the entire top canvas to a day & event and
- a place within the event if appropriate. If event_num_return is NULL, it
- simply returns the grid position without trying to find the event. */
-static ECalendarViewPosition
-e_day_view_convert_position_in_top_canvas (EDayView *day_view,
- gint x,
- gint y,
- gint *day_return,
- gint *event_num_return)
-{
- EDayViewEvent *event;
- gint day, row, col;
- gint event_num, start_day, end_day, item_x, item_y, item_w, item_h;
-
- *day_return = -1;
- if (event_num_return)
- *event_num_return = -1;
-
- if (x < 0 || y < 0)
- return E_CALENDAR_VIEW_POS_OUTSIDE;
-
- row = y / day_view->top_row_height - 1;
-
- day = -1;
- for (col = 1; col <= day_view->days_shown; col++) {
- if (x < day_view->day_offsets[col]) {
- day = col - 1;
- break;
- }
- }
- if (day == -1)
- return E_CALENDAR_VIEW_POS_OUTSIDE;
-
- *day_return = day;
-
- /* If only the grid position is wanted, return. */
- if (event_num_return == NULL)
- return E_CALENDAR_VIEW_POS_NONE;
-
- for (event_num = 0; event_num < day_view->long_events->len;
- event_num++) {
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
-
- if (event->start_row_or_col != row)
- continue;
-
- if (!e_day_view_get_long_event_position (day_view, event_num,
- &start_day, &end_day,
- &item_x, &item_y,
- &item_w, &item_h))
- continue;
-
- if (x < item_x)
- continue;
-
- if (x >= item_x + item_w)
- continue;
-
- *event_num_return = event_num;
-
- if (x < item_x + E_DAY_VIEW_LONG_EVENT_BORDER_WIDTH
- + E_DAY_VIEW_LONG_EVENT_X_PAD)
- return E_CALENDAR_VIEW_POS_LEFT_EDGE;
-
- if (x >= item_x + item_w - E_DAY_VIEW_LONG_EVENT_BORDER_WIDTH
- - E_DAY_VIEW_LONG_EVENT_X_PAD)
- return E_CALENDAR_VIEW_POS_RIGHT_EDGE;
-
- return E_CALENDAR_VIEW_POS_EVENT;
- }
-
- return E_CALENDAR_VIEW_POS_NONE;
-}
-
-
-/* Converts a position within the entire main canvas to a day, row, event and
- a place within the event if appropriate. If event_num_return is NULL, it
- simply returns the grid position without trying to find the event. */
-static ECalendarViewPosition
-e_day_view_convert_position_in_main_canvas (EDayView *day_view,
- gint x,
- gint y,
- gint *day_return,
- gint *row_return,
- gint *event_num_return)
-{
- gint day, row, col, event_num;
- gint item_x, item_y, item_w, item_h;
-
-#if 0
- g_print ("e_day_view_convert_position_in_main_canvas: (%d, %d)\n", x, y);
-#endif
-
- *day_return = -1;
- *row_return = -1;
- if (event_num_return)
- *event_num_return = -1;
-
- /* Check the position is inside the canvas, and determine the day
- and row. */
- if (x < 0 || y < 0)
- return E_CALENDAR_VIEW_POS_OUTSIDE;
-
- row = y / day_view->row_height;
- if (row >= day_view->rows)
- return E_CALENDAR_VIEW_POS_OUTSIDE;
-
- day = -1;
- for (col = 1; col <= day_view->days_shown; col++) {
- if (x < day_view->day_offsets[col]) {
- day = col - 1;
- break;
- }
- }
- if (day == -1)
- return E_CALENDAR_VIEW_POS_OUTSIDE;
-
- *day_return = day;
- *row_return = row;
-
- /* If only the grid position is wanted, return. */
- if (event_num_return == NULL)
- return E_CALENDAR_VIEW_POS_NONE;
-
- /* Check the selected item first, since the horizontal resizing bars
- may be above other events. */
- if (day_view->resize_bars_event_day == day) {
- if (e_day_view_get_event_position (day_view, day,
- day_view->resize_bars_event_num,
- &item_x, &item_y,
- &item_w, &item_h)) {
- if (x >= item_x && x < item_x + item_w) {
- *event_num_return = day_view->resize_bars_event_num;
- if (y >= item_y - E_DAY_VIEW_BAR_HEIGHT
- && y < item_y + E_DAY_VIEW_EVENT_BORDER_HEIGHT)
- return E_CALENDAR_VIEW_POS_TOP_EDGE;
- if (y >= item_y + item_h - E_DAY_VIEW_EVENT_BORDER_HEIGHT
- && y < item_y + item_h + E_DAY_VIEW_BAR_HEIGHT)
- return E_CALENDAR_VIEW_POS_BOTTOM_EDGE;
- }
- }
- }
-
- /* Try to find the event at the found position. */
- *event_num_return = -1;
- for (event_num = 0; event_num < day_view->events[day]->len;
- event_num++) {
- if (!e_day_view_get_event_position (day_view, day, event_num,
- &item_x, &item_y,
- &item_w, &item_h))
- continue;
-
- if (x < item_x || x >= item_x + item_w
- || y < item_y || y >= item_y + item_h)
- continue;
-
- *event_num_return = event_num;
-
- if (x < item_x + E_DAY_VIEW_BAR_WIDTH)
- return E_CALENDAR_VIEW_POS_LEFT_EDGE;
-
- if (y < item_y + E_DAY_VIEW_EVENT_BORDER_HEIGHT
- + E_DAY_VIEW_EVENT_Y_PAD)
- return E_CALENDAR_VIEW_POS_TOP_EDGE;
-
- if (y >= item_y + item_h - E_DAY_VIEW_EVENT_BORDER_HEIGHT
- - E_DAY_VIEW_EVENT_Y_PAD)
- return E_CALENDAR_VIEW_POS_BOTTOM_EDGE;
-
- return E_CALENDAR_VIEW_POS_EVENT;
- }
-
- return E_CALENDAR_VIEW_POS_NONE;
-}
-
-
-static gboolean
-e_day_view_on_top_canvas_drag_motion (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time,
- EDayView *day_view)
-{
- gint scroll_x, scroll_y;
-
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (widget),
- &scroll_x, &scroll_y);
- day_view->drag_event_x = x + scroll_x;
- day_view->drag_event_y = y + scroll_y;
-
- e_day_view_reshape_top_canvas_drag_item (day_view);
-
- return TRUE;
-}
-
-
-static void
-e_day_view_reshape_top_canvas_drag_item (EDayView *day_view)
-{
- ECalendarViewPosition pos;
- gint x, y, day;
-
- /* Calculate the day & start row of the event being dragged, using
- the current mouse position. */
- x = day_view->drag_event_x;
- y = day_view->drag_event_y;
- pos = e_day_view_convert_position_in_top_canvas (day_view, x, y,
- &day, NULL);
- /* This shouldn't really happen in a drag. */
- if (pos == E_CALENDAR_VIEW_POS_OUTSIDE)
- return;
-
- if (day_view->drag_event_day == E_DAY_VIEW_LONG_EVENT)
- day -= day_view->drag_event_offset;
- day = MAX (day, 0);
-
- e_day_view_update_top_canvas_drag (day_view, day);
-}
-
-
-static void
-e_day_view_update_top_canvas_drag (EDayView *day_view,
- gint day)
-{
- EDayViewEvent *event = NULL;
- gint row, num_days, start_day, end_day;
- gdouble item_x, item_y, item_w, item_h;
- gchar *text;
-
- /* Calculate the event's position. If the event is in the same
- position we started in, we use the same columns. */
- row = day_view->rows_in_top_display + 1;
- num_days = 1;
-
- if (day_view->drag_event_day == E_DAY_VIEW_LONG_EVENT) {
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- day_view->drag_event_num);
- row = event->start_row_or_col + 1;
-
- if (!e_day_view_find_long_event_days (event,
- day_view->days_shown,
- day_view->day_starts,
- &start_day, &end_day))
- return;
-
- num_days = end_day - start_day + 1;
-
- /* Make sure we don't go off the screen. */
- day = MIN (day, day_view->days_shown - num_days);
-
- } else if (day_view->drag_event_day != -1) {
- event = &g_array_index (day_view->events[day_view->drag_event_day],
- EDayViewEvent,
- day_view->drag_event_num);
- }
-
- /* If the position hasn't changed, just return. */
- if (day_view->drag_last_day == day
- && (day_view->drag_long_event_item->object.flags
- & GNOME_CANVAS_ITEM_VISIBLE))
- return;
-
- day_view->drag_last_day = day;
-
-
- item_x = day_view->day_offsets[day] + E_DAY_VIEW_BAR_WIDTH;
- item_w = day_view->day_offsets[day + num_days] - item_x
- - E_DAY_VIEW_GAP_WIDTH;
- item_y = row * day_view->top_row_height;
- item_h = day_view->top_row_height - E_DAY_VIEW_TOP_CANVAS_Y_GAP;
-
-
- /* Set the positions of the event & associated items. */
- gnome_canvas_item_set (day_view->drag_long_event_rect_item,
- "x1", item_x,
- "y1", item_y,
- "x2", item_x + item_w - 1,
- "y2", item_y + item_h - 1,
- NULL);
-
- gnome_canvas_item_set (day_view->drag_long_event_item,
- "clip_width", item_w - (E_DAY_VIEW_LONG_EVENT_BORDER_WIDTH + E_DAY_VIEW_LONG_EVENT_X_PAD) * 2,
- "clip_height", item_h - (E_DAY_VIEW_LONG_EVENT_BORDER_HEIGHT + E_DAY_VIEW_LONG_EVENT_Y_PAD) * 2,
- NULL);
- e_canvas_item_move_absolute (day_view->drag_long_event_item,
- item_x + E_DAY_VIEW_LONG_EVENT_BORDER_WIDTH + E_DAY_VIEW_LONG_EVENT_X_PAD,
- item_y + E_DAY_VIEW_LONG_EVENT_BORDER_HEIGHT + E_DAY_VIEW_LONG_EVENT_Y_PAD);
-
- if (!(day_view->drag_long_event_rect_item->object.flags & GNOME_CANVAS_ITEM_VISIBLE)) {
- gnome_canvas_item_raise_to_top (day_view->drag_long_event_rect_item);
- gnome_canvas_item_show (day_view->drag_long_event_rect_item);
- }
-
- /* Set the text, if necessary. We don't want to set the text every
- time it moves, so we check if it is currently invisible and only
- set the text then. */
- if (!(day_view->drag_long_event_item->object.flags
- & GNOME_CANVAS_ITEM_VISIBLE)) {
- const gchar *summary;
-
- if (event) {
- summary = icalcomponent_get_summary (event->comp_data->icalcomp);
- text = g_strdup (summary);
- } else {
- text = NULL;
- }
-
- gnome_canvas_item_set (day_view->drag_long_event_item,
- "text", text ? text : "",
- NULL);
- gnome_canvas_item_raise_to_top (day_view->drag_long_event_item);
- gnome_canvas_item_show (day_view->drag_long_event_item);
-
- g_free (text);
- }
-}
-
-
-static gboolean
-e_day_view_on_main_canvas_drag_motion (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time,
- EDayView *day_view)
-{
- gint scroll_x, scroll_y;
-
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (widget),
- &scroll_x, &scroll_y);
-
- day_view->drag_event_x = x + scroll_x;
- day_view->drag_event_y = y + scroll_y;
-
- e_day_view_reshape_main_canvas_drag_item (day_view);
- e_day_view_reshape_main_canvas_resize_bars (day_view);
-
- e_day_view_check_auto_scroll (day_view, day_view->drag_event_x, day_view->drag_event_y);
-
- return TRUE;
-}
-
-
-static void
-e_day_view_reshape_main_canvas_drag_item (EDayView *day_view)
-{
- ECalendarViewPosition pos;
- gint x, y, day, row;
-
- /* Calculate the day & start row of the event being dragged, using
- the current mouse position. */
- x = day_view->drag_event_x;
- y = day_view->drag_event_y;
- pos = e_day_view_convert_position_in_main_canvas (day_view, x, y,
- &day, &row, NULL);
- /* This shouldn't really happen in a drag. */
- if (pos == E_CALENDAR_VIEW_POS_OUTSIDE)
- return;
-
- if (day_view->drag_event_day != -1
- && day_view->drag_event_day != E_DAY_VIEW_LONG_EVENT)
- row -= day_view->drag_event_offset;
- row = MAX (row, 0);
-
- e_day_view_update_main_canvas_drag (day_view, row, day);
-}
-
-
-static void
-e_day_view_update_main_canvas_drag (EDayView *day_view,
- gint row,
- gint day)
-{
- EDayViewEvent *event = NULL;
- gint cols_in_row, start_col, num_columns, num_rows, start_row, end_row;
- gdouble item_x, item_y, item_w, item_h;
- gchar *text;
-
- /* If the position hasn't changed, just return. */
- if (day_view->drag_last_day == day
- && day_view->drag_last_row == row
- && (day_view->drag_item->object.flags & GNOME_CANVAS_ITEM_VISIBLE))
- return;
-
- day_view->drag_last_day = day;
- day_view->drag_last_row = row;
-
- /* Calculate the event's position. If the event is in the same
- position we started in, we use the same columns. */
- cols_in_row = 1;
- start_row = 0;
- start_col = 0;
- num_columns = 1;
- num_rows = 1;
-
- if (day_view->drag_event_day == E_DAY_VIEW_LONG_EVENT) {
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- day_view->drag_event_num);
- } else if (day_view->drag_event_day != -1) {
- event = &g_array_index (day_view->events[day_view->drag_event_day],
- EDayViewEvent,
- day_view->drag_event_num);
- start_row = event->start_minute / day_view->mins_per_row;
- end_row = (event->end_minute - 1) / day_view->mins_per_row;
- if (end_row < start_row)
- end_row = start_row;
-
- num_rows = end_row - start_row + 1;
- }
-
- if (day_view->drag_event_day == day && start_row == row) {
- cols_in_row = day_view->cols_per_row[day][row];
- start_col = event->start_row_or_col;
- num_columns = event->num_columns;
- }
-
- item_x = day_view->day_offsets[day]
- + day_view->day_widths[day] * start_col / cols_in_row;
- item_w = day_view->day_widths[day] * num_columns / cols_in_row
- - E_DAY_VIEW_GAP_WIDTH;
- item_y = row * day_view->row_height;
- item_h = num_rows * day_view->row_height;
-
- /* Set the positions of the event & associated items. */
- gnome_canvas_item_set (day_view->drag_rect_item,
- "x1", item_x + E_DAY_VIEW_BAR_WIDTH - 1,
- "y1", item_y,
- "x2", item_x + item_w - 1,
- "y2", item_y + item_h - 1,
- NULL);
-
- gnome_canvas_item_set (day_view->drag_bar_item,
- "x1", item_x,
- "y1", item_y,
- "x2", item_x + E_DAY_VIEW_BAR_WIDTH - 1,
- "y2", item_y + item_h - 1,
- NULL);
-
- gnome_canvas_item_set (day_view->drag_item,
- "clip_width", item_w - E_DAY_VIEW_BAR_WIDTH - E_DAY_VIEW_EVENT_X_PAD * 2,
- "clip_height", item_h - (E_DAY_VIEW_EVENT_BORDER_HEIGHT + E_DAY_VIEW_EVENT_Y_PAD) * 2,
- NULL);
- e_canvas_item_move_absolute (day_view->drag_item,
- item_x + E_DAY_VIEW_BAR_WIDTH + E_DAY_VIEW_EVENT_X_PAD,
- item_y + E_DAY_VIEW_EVENT_BORDER_HEIGHT + E_DAY_VIEW_EVENT_Y_PAD);
-
- if (!(day_view->drag_bar_item->object.flags & GNOME_CANVAS_ITEM_VISIBLE)) {
- gnome_canvas_item_raise_to_top (day_view->drag_bar_item);
- gnome_canvas_item_show (day_view->drag_bar_item);
- }
-
- if (!(day_view->drag_rect_item->object.flags & GNOME_CANVAS_ITEM_VISIBLE)) {
- gnome_canvas_item_raise_to_top (day_view->drag_rect_item);
- gnome_canvas_item_show (day_view->drag_rect_item);
- }
-
- /* Set the text, if necessary. We don't want to set the text every
- time it moves, so we check if it is currently invisible and only
- set the text then. */
- if (!(day_view->drag_item->object.flags & GNOME_CANVAS_ITEM_VISIBLE)) {
- const gchar *summary;
-
- if (event) {
- summary = icalcomponent_get_summary (event->comp_data->icalcomp);
- text = g_strdup (summary);
- } else {
- text = NULL;
- }
-
- gnome_canvas_item_set (day_view->drag_item,
- "text", text ? text : "",
- NULL);
- gnome_canvas_item_raise_to_top (day_view->drag_item);
- gnome_canvas_item_show (day_view->drag_item);
-
- g_free (text);
- }
-}
-
-
-static void
-e_day_view_on_top_canvas_drag_leave (GtkWidget *widget,
- GdkDragContext *context,
- guint time,
- EDayView *day_view)
-{
- day_view->drag_last_day = -1;
-
- gnome_canvas_item_hide (day_view->drag_long_event_rect_item);
- gnome_canvas_item_hide (day_view->drag_long_event_item);
-}
-
-
-static void
-e_day_view_on_main_canvas_drag_leave (GtkWidget *widget,
- GdkDragContext *context,
- guint time,
- EDayView *day_view)
-{
- day_view->drag_last_day = -1;
-
- e_day_view_stop_auto_scroll (day_view);
-
- gnome_canvas_item_hide (day_view->drag_rect_item);
- gnome_canvas_item_hide (day_view->drag_bar_item);
- gnome_canvas_item_hide (day_view->drag_item);
-
- /* Hide the resize bars if they are being used in the drag. */
- if (day_view->drag_event_day == day_view->resize_bars_event_day
- && day_view->drag_event_num == day_view->resize_bars_event_num) {
- gnome_canvas_item_hide (day_view->main_canvas_top_resize_bar_item);
- gnome_canvas_item_hide (day_view->main_canvas_bottom_resize_bar_item);
- }
-}
-
-
-static void
-e_day_view_on_drag_begin (GtkWidget *widget,
- GdkDragContext *context,
- EDayView *day_view)
-{
- EDayViewEvent *event;
- gint day, event_num;
-
- day = day_view->drag_event_day;
- event_num = day_view->drag_event_num;
-
- /* These should both be set. */
- g_return_if_fail (day != -1);
- g_return_if_fail (event_num != -1);
-
- if (day == E_DAY_VIEW_LONG_EVENT)
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
- else
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
-
- /* Hide the text item, since it will be shown in the special drag
- items. */
- gnome_canvas_item_hide (event->canvas_item);
-}
-
-
-static void
-e_day_view_on_drag_end (GtkWidget *widget,
- GdkDragContext *context,
- EDayView *day_view)
-{
- EDayViewEvent *event;
- gint day, event_num;
-
- day = day_view->drag_event_day;
- event_num = day_view->drag_event_num;
-
- /* If the calendar has already been updated in drag_data_received()
- we just return. */
- if (day == -1 || event_num == -1)
- return;
-
- if (day == E_DAY_VIEW_LONG_EVENT) {
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- event_num);
- gtk_widget_queue_draw (day_view->top_canvas);
- } else {
- event = &g_array_index (day_view->events[day], EDayViewEvent,
- event_num);
- gtk_widget_queue_draw (day_view->main_canvas);
- }
-
- /* Show the text item again. */
- gnome_canvas_item_show (event->canvas_item);
-
- day_view->drag_event_day = -1;
- day_view->drag_event_num = -1;
-}
-
-
-static void
-e_day_view_on_drag_data_get (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- EDayView *day_view)
-{
- EDayViewEvent *event;
- gint day, event_num;
-
- day = day_view->drag_event_day;
- event_num = day_view->drag_event_num;
-
- /* These should both be set. */
- g_return_if_fail (day != -1);
- g_return_if_fail (event_num != -1);
-
- if (day == E_DAY_VIEW_LONG_EVENT)
- event = &g_array_index (day_view->long_events,
- EDayViewEvent, event_num);
- else
- event = &g_array_index (day_view->events[day],
- EDayViewEvent, event_num);
-
- if (info == TARGET_CALENDAR_EVENT || info == TARGET_VCALENDAR) {
- /* we will pass an icalcalendar component for both types */
- char *comp_str;
- icalcomponent *vcal;
-
- vcal = e_cal_util_new_top_level ();
- e_cal_util_add_timezones_from_component (vcal, event->comp_data->icalcomp);
- icalcomponent_add_component (
- vcal,
- icalcomponent_new_clone (event->comp_data->icalcomp));
-
- comp_str = icalcomponent_as_ical_string (vcal);
- if (comp_str) {
- gtk_selection_data_set (selection_data, selection_data->target,
- 8, comp_str, strlen (comp_str));
- }
-
- icalcomponent_free (vcal);
- }
-}
-
-
-static void
-e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- GtkSelectionData *data,
- guint info,
- guint time,
- EDayView *day_view)
-{
- EDayViewEvent *event=NULL;
- ECalendarViewPosition pos;
- gint day, start_day, end_day, num_days;
- gint start_offset, end_offset;
- ECalComponent *comp;
- ECalComponentDateTime date;
- struct icaltimetype itt;
- time_t dt;
- gboolean all_day_event;
- ECal *client;
- gboolean drag_from_same_window;
-
- if (day_view->drag_event_day != -1)
- drag_from_same_window = TRUE;
- else
- drag_from_same_window = FALSE;
-
- client = e_cal_model_get_default_client (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)));
-
- /* Note that we only support DnD within the EDayView at present. */
- if ((data->length >= 0) && (data->format == 8)
- && (day_view->drag_event_day != -1)) {
- /* We are dragging in the same window */
-
- pos = e_day_view_convert_position_in_top_canvas (day_view,
- x, y, &day,
- NULL);
- if (pos != E_CALENDAR_VIEW_POS_OUTSIDE) {
- CalObjModType mod = CALOBJ_MOD_ALL;
- GtkWindow *toplevel;
-
- num_days = 1;
- start_offset = 0;
- end_offset = 0;
-
- if (day_view->drag_event_day == E_DAY_VIEW_LONG_EVENT) {
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- day_view->drag_event_num);
- day -= day_view->drag_event_offset;
- day = MAX (day, 0);
-
- e_day_view_find_long_event_days (event,
- day_view->days_shown,
- day_view->day_starts,
- &start_day,
- &end_day);
- num_days = end_day - start_day + 1;
- /* Make sure we don't go off the screen. */
- day = MIN (day, day_view->days_shown - num_days);
-
- start_offset = event->start_minute;
- end_offset = event->end_minute;
- } else {
- event = &g_array_index (day_view->events[day_view->drag_event_day],
- EDayViewEvent,
- day_view->drag_event_num);
- }
-
- client = event->comp_data->client;
-
- /* We clone the event since we don't want to change
- the original comp here.
- Otherwise we would not detect that the event's time
- had changed in the "update_event" callback. */
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
- if (start_offset == 0 && end_offset == 0)
- all_day_event = TRUE;
- else
- all_day_event = FALSE;
-
- date.value = &itt;
-
- dt = day_view->day_starts[day] + start_offset * 60;
- itt = icaltime_from_timet_with_zone (dt, FALSE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- if (all_day_event) {
- itt.is_date = TRUE;
- date.tzid = NULL;
- } else {
- /* FIXME: Should probably keep the timezone of
- the original start and end times. */
- date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- }
- e_cal_component_set_dtstart (comp, &date);
-
- if (end_offset == 0)
- dt = day_view->day_starts[day + num_days];
- else
- dt = day_view->day_starts[day + num_days - 1] + end_offset * 60;
- itt = icaltime_from_timet_with_zone (dt, FALSE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- if (all_day_event) {
- itt.is_date = TRUE;
- date.tzid = NULL;
- } else {
- /* FIXME: Should probably keep the timezone of
- the original start and end times. */
- date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- }
- e_cal_component_set_dtend (comp, &date);
-
- gtk_drag_finish (context, TRUE, TRUE, time);
-
- /* Reset this since it will be invalid. */
- day_view->drag_event_day = -1;
-
- /* Show the text item again, just in case it hasn't
- moved. If we don't do this it may not appear. */
- if (event->canvas_item)
- gnome_canvas_item_show (event->canvas_item);
-
- if (e_cal_component_is_instance (comp)) {
- if (!recur_component_dialog (client, comp, &mod, NULL))
- return;
- }
-
- toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (day_view)));
- e_cal_component_commit_sequence (comp);
-
- e_calendar_view_modify_and_send (comp, client, mod, toplevel, FALSE);
-
- g_object_unref (comp);
-
- return;
- }
- }
-
- if ((data->length >= 0) && (data->format == 8)
- && !drag_from_same_window) {
- /* We are dragging between different window */
-
- char *comp_str;
- icalcomponent *icalcomp;
- icalcomponent_kind kind;
- time_t dtstart;
- icaltimezone *default_zone;
-
- pos = e_day_view_convert_position_in_top_canvas (day_view,
- x, y, &day,
- NULL);
- if (pos == E_CALENDAR_VIEW_POS_OUTSIDE)
- goto error;
-
- comp_str = (char *) data->data;
- icalcomp = icalparser_parse_string ((const char *) comp_str);
- if (!icalcomp)
- goto error;
-
- default_zone = calendar_config_get_icaltimezone ();
-
- /* check the type of the component */
- kind = icalcomponent_isa (icalcomp);
- if (kind != ICAL_VCALENDAR_COMPONENT && kind != ICAL_VEVENT_COMPONENT)
- goto error;
-
- dtstart = day_view->day_starts[day];
-
- if (kind == ICAL_VCALENDAR_COMPONENT) {
- icalcomponent_kind child_kind;
- icalcomponent *subcomp;
-
- subcomp = icalcomponent_get_first_component (icalcomp, ICAL_ANY_COMPONENT);
- while (subcomp) {
- child_kind = icalcomponent_isa (subcomp);
- if (child_kind == ICAL_VEVENT_COMPONENT)
- e_calendar_view_add_event (E_CALENDAR_VIEW (day_view), client, dtstart,
- default_zone, subcomp, TRUE);
- else if (child_kind == ICAL_VTIMEZONE_COMPONENT) {
- icaltimezone *zone;
-
- zone = icaltimezone_new ();
- icaltimezone_set_component (zone, subcomp);
- e_cal_add_timezone (client, zone, NULL);
-
- icaltimezone_free (zone, 1);
- }
-
- subcomp = icalcomponent_get_next_component (
- icalcomp, ICAL_ANY_COMPONENT);
- }
-
- icalcomponent_free (icalcomp);
-
- } else {
- e_calendar_view_add_event (E_CALENDAR_VIEW (day_view), client, dtstart, default_zone, icalcomp, TRUE);
- }
-
- gtk_drag_finish (context, TRUE, TRUE, time);
- return;
- }
-
-error:
- gtk_drag_finish (context, FALSE, FALSE, time);
-}
-
-
-static void
-e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- GtkSelectionData *data,
- guint info,
- guint time,
- EDayView *day_view)
-{
- EDayViewEvent *event = NULL;
- ECalendarViewPosition pos;
- gint day, row, start_row, end_row, num_rows, scroll_x, scroll_y;
- gint start_offset, end_offset;
- ECalComponent *comp;
- ECalComponentDateTime date;
- struct icaltimetype itt;
- time_t dt;
- ECal *client;
- gboolean drag_from_same_window;
-
- if (day_view->drag_event_day != -1)
- drag_from_same_window = TRUE;
- else
- drag_from_same_window = FALSE;
-
- client = e_cal_model_get_default_client (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)));
-
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (widget),
- &scroll_x, &scroll_y);
- x += scroll_x;
- y += scroll_y;
-
- /* Note that we only support DnD within the EDayView at present. */
- if ((data->length >= 0) && (data->format == 8)
- && (day_view->drag_event_day != -1)) {
- /* We are dragging in the same window */
-
- pos = e_day_view_convert_position_in_main_canvas (day_view,
- x, y, &day,
- &row, NULL);
- if (pos != E_CALENDAR_VIEW_POS_OUTSIDE) {
- CalObjModType mod = CALOBJ_MOD_ALL;
- GtkWindow *toplevel;
-
- num_rows = 1;
- start_offset = 0;
- end_offset = 0;
-
- if (day_view->drag_event_day == E_DAY_VIEW_LONG_EVENT) {
- event = &g_array_index (day_view->long_events, EDayViewEvent,
- day_view->drag_event_num);
- } else {
- event = &g_array_index (day_view->events[day_view->drag_event_day],
- EDayViewEvent,
- day_view->drag_event_num);
- row -= day_view->drag_event_offset;
-
- /* Calculate time offset from start row. */
- start_row = event->start_minute / day_view->mins_per_row;
- end_row = (event->end_minute - 1) / day_view->mins_per_row;
- if (end_row < start_row)
- end_row = start_row;
-
- num_rows = end_row - start_row + 1;
-
- start_offset = event->start_minute % day_view->mins_per_row;
- end_offset = event->end_minute % day_view->mins_per_row;
- if (end_offset != 0)
- end_offset = day_view->mins_per_row - end_offset;
- }
-
- client = event->comp_data->client;
-
- /* We use a temporary shallow copy of comp since we
- don't want to change the original comp here.
- Otherwise we would not detect that the event's time
- had changed in the "update_event" callback. */
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
- date.value = &itt;
- date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
-
- dt = e_day_view_convert_grid_position_to_time (day_view, day, row) + start_offset * 60;
- *date.value = icaltime_from_timet_with_zone (dt, FALSE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- e_cal_component_set_dtstart (comp, &date);
- dt = e_day_view_convert_grid_position_to_time (day_view, day, row + num_rows) - end_offset * 60;
- *date.value = icaltime_from_timet_with_zone (dt, FALSE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
- e_cal_component_set_dtend (comp, &date);
-
- gtk_drag_finish (context, TRUE, TRUE, time);
-
- /* Reset this since it will be invalid. */
- day_view->drag_event_day = -1;
-
- /* Show the text item again, just in case it hasn't
- moved. If we don't do this it may not appear. */
- if (event->canvas_item)
- gnome_canvas_item_show (event->canvas_item);
-
- if (e_cal_component_is_instance (comp)) {
- if (!recur_component_dialog (client, comp, &mod, NULL)) {
- g_object_unref (comp);
- return;
- }
- }
-
- toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (day_view)));
- e_cal_component_commit_sequence (comp);
-
- e_calendar_view_modify_and_send (comp, client, mod, toplevel, FALSE);
-
- g_object_unref (comp);
-
- return;
- }
- }
-
- if ((data->length >= 0) && (data->format == 8)
- && !drag_from_same_window) {
- /* We are dragging between different window */
-
- char *comp_str;
- icalcomponent *icalcomp;
- icalcomponent_kind kind;
- time_t dtstart;
- icaltimezone *default_zone;
-
- pos = e_day_view_convert_position_in_main_canvas (day_view,
- x, y, &day,
- &row, NULL);
- if (pos == E_CALENDAR_VIEW_POS_OUTSIDE)
- goto error;
-
- comp_str = (char *) data->data;
- icalcomp = icalparser_parse_string ((const char *) comp_str);
- if (!icalcomp)
- goto error;
-
- default_zone = calendar_config_get_icaltimezone ();
-
- /* check the type of the component */
- kind = icalcomponent_isa (icalcomp);
- if (kind != ICAL_VCALENDAR_COMPONENT && kind != ICAL_VEVENT_COMPONENT)
- goto error;
-
- dtstart = e_day_view_convert_grid_position_to_time (day_view, day, row);
-
- if (kind == ICAL_VCALENDAR_COMPONENT) {
- icalcomponent_kind child_kind;
- icalcomponent *subcomp;
-
- subcomp = icalcomponent_get_first_component (icalcomp, ICAL_ANY_COMPONENT);
- while (subcomp) {
- child_kind = icalcomponent_isa (subcomp);
- if (child_kind == ICAL_VEVENT_COMPONENT)
- e_calendar_view_add_event (E_CALENDAR_VIEW (day_view), client, dtstart,
- default_zone, subcomp, FALSE);
- else if (child_kind == ICAL_VTIMEZONE_COMPONENT) {
- icaltimezone *zone;
-
- zone = icaltimezone_new ();
- icaltimezone_set_component (zone, subcomp);
- e_cal_add_timezone (client, zone, NULL);
-
- icaltimezone_free (zone, 1);
- }
-
- subcomp = icalcomponent_get_next_component (
- icalcomp, ICAL_ANY_COMPONENT);
- }
-
- icalcomponent_free (icalcomp);
-
- } else {
- e_calendar_view_add_event (E_CALENDAR_VIEW (day_view), client, dtstart, default_zone, icalcomp, FALSE);
- }
-
- gtk_drag_finish (context, TRUE, TRUE, time);
- return;
- }
-
-error:
- gtk_drag_finish (context, FALSE, FALSE, time);
-}
-
-
-/* Converts an hour from 0-23 to the preferred time format, and returns the
- suffix to add and the width of it in the normal font. */
-void
-e_day_view_convert_time_to_display (EDayView *day_view,
- gint hour,
- gint *display_hour,
- gchar **suffix,
- gint *suffix_width)
-{
- /* Calculate the actual hour number to display. For 12-hour
- format we convert 0-23 to 12-11am/12-11pm. */
- *display_hour = hour;
- if (e_calendar_view_get_use_24_hour_format (E_CALENDAR_VIEW (day_view))) {
- *suffix = "";
- *suffix_width = 0;
- } else {
- if (hour < 12) {
- *suffix = day_view->am_string;
- *suffix_width = day_view->am_string_width;
- } else {
- *display_hour -= 12;
- *suffix = day_view->pm_string;
- *suffix_width = day_view->pm_string_width;
- }
-
- /* 12-hour uses 12:00 rather than 0:00. */
- if (*display_hour == 0)
- *display_hour = 12;
- }
-}
-
-
-gint
-e_day_view_get_time_string_width (EDayView *day_view)
-{
- gint time_width;
-
- time_width = day_view->digit_width * 4 + day_view->colon_width;
-
- if (!e_calendar_view_get_use_24_hour_format (E_CALENDAR_VIEW (day_view)))
- time_width += MAX (day_view->am_string_width,
- day_view->pm_string_width);
-
- return time_width;
-}
-
-/* Queues a layout, unless one is already queued. */
-static void
-e_day_view_queue_layout (EDayView *day_view)
-{
- if (day_view->layout_timeout_id == 0) {
- day_view->layout_timeout_id = g_timeout_add (E_DAY_VIEW_LAYOUT_TIMEOUT, e_day_view_layout_timeout_cb, day_view);
- }
-}
-
-
-/* Removes any queued layout. */
-static void
-e_day_view_cancel_layout (EDayView *day_view)
-{
- if (day_view->layout_timeout_id != 0) {
- gtk_timeout_remove (day_view->layout_timeout_id);
- day_view->layout_timeout_id = 0;
- }
-}
-
-
-static gboolean
-e_day_view_layout_timeout_cb (gpointer data)
-{
- EDayView *day_view = E_DAY_VIEW (data);
-
- gtk_widget_queue_draw (day_view->top_canvas);
- gtk_widget_queue_draw (day_view->main_canvas);
- e_day_view_check_layout (day_view);
-
- day_view->layout_timeout_id = 0;
- return FALSE;
-}
-
-
-/* Returns the number of selected events (0 or 1 at present). */
-gint
-e_day_view_get_num_events_selected (EDayView *day_view)
-{
- g_return_val_if_fail (E_IS_DAY_VIEW (day_view), 0);
-
- return (day_view->editing_event_day != -1) ? 1 : 0;
-}
-
-
diff --git a/calendar/gui/e-day-view.h b/calendar/gui/e-day-view.h
deleted file mode 100644
index 4c563e4dbd..0000000000
--- a/calendar/gui/e-day-view.h
+++ /dev/null
@@ -1,578 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 1999, Ximian, Inc.
- * Copyright 1999, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-#ifndef _E_DAY_VIEW_H_
-#define _E_DAY_VIEW_H_
-
-#include <time.h>
-#include <gtk/gtktable.h>
-#include <gtk/gtktooltips.h>
-#include <libgnomecanvas/gnome-canvas.h>
-
-#include "e-calendar-view.h"
-#include "gnome-cal.h"
-
-G_BEGIN_DECLS
-
-/*
- * EDayView - displays the Day & Work-Week views of the calendar.
- */
-
-/* The maximum number of days shown. We use the week view for anything more
- than about 9 days. */
-#define E_DAY_VIEW_MAX_DAYS 10
-
-/* This is used as a special code to signify a long event instead of the day
- of a normal event. */
-#define E_DAY_VIEW_LONG_EVENT E_DAY_VIEW_MAX_DAYS
-
-/* The maximum number of columns of appointments within a day. */
-#define E_DAY_VIEW_MAX_COLUMNS 6
-
-/* The width of the gap between appointments. This should be at least
- E_DAY_VIEW_BAR_WIDTH, since in the top canvas we use this space to draw
- the triangle to represent continuing events. */
-#define E_DAY_VIEW_GAP_WIDTH 7
-
-/* The width of the bars down the left of each column and appointment.
- This includes the borders on each side of it. */
-#define E_DAY_VIEW_BAR_WIDTH 7
-
-/* The height of the horizontal bar above & beneath the selected event.
- This includes the borders on the top and bottom. */
-#define E_DAY_VIEW_BAR_HEIGHT 6
-
-/* The size of the reminder & recurrence icons, and padding around them. */
-#define E_DAY_VIEW_ICON_WIDTH 16
-#define E_DAY_VIEW_ICON_HEIGHT 16
-#define E_DAY_VIEW_ICON_X_PAD 1
-#define E_DAY_VIEW_ICON_Y_PAD 1
-
-/* The space between the icons and the long event text. */
-#define E_DAY_VIEW_LONG_EVENT_ICON_R_PAD 1
-
-/* The size of the border around the event. */
-#define E_DAY_VIEW_EVENT_BORDER_WIDTH 1
-#define E_DAY_VIEW_EVENT_BORDER_HEIGHT 1
-
-/* The padding on each side of the event text. */
-#define E_DAY_VIEW_EVENT_X_PAD 2
-#define E_DAY_VIEW_EVENT_Y_PAD 1
-
-/* The padding on each side of the event text for events in the top canvas. */
-#define E_DAY_VIEW_LONG_EVENT_X_PAD 2
-#define E_DAY_VIEW_LONG_EVENT_Y_PAD 2
-
-/* The size of the border around the long events in the top canvas. */
-#define E_DAY_VIEW_LONG_EVENT_BORDER_WIDTH 1
-#define E_DAY_VIEW_LONG_EVENT_BORDER_HEIGHT 1
-
-/* The space between the time and the icon/text in the top canvas. */
-#define E_DAY_VIEW_LONG_EVENT_TIME_X_PAD 2
-
-/* The gap between rows in the top canvas. */
-#define E_DAY_VIEW_TOP_CANVAS_Y_GAP 2
-
-
-/* These are used to get/set the working days in the week. The bit-flags are
- combined together. The bits must be from 0 (Sun) to 6 (Sat) to match the
- day values used by localtime etc. */
-typedef enum
-{
- E_DAY_VIEW_SUNDAY = 1 << 0,
- E_DAY_VIEW_MONDAY = 1 << 1,
- E_DAY_VIEW_TUESDAY = 1 << 2,
- E_DAY_VIEW_WEDNESDAY = 1 << 3,
- E_DAY_VIEW_THURSDAY = 1 << 4,
- E_DAY_VIEW_FRIDAY = 1 << 5,
- E_DAY_VIEW_SATURDAY = 1 << 6
-} EDayViewDays;
-
-
-/* These are used to specify the type of an appointment. They match those
- used in EMeetingTimeSelector. */
-typedef enum
-{
- E_DAY_VIEW_BUSY_TENTATIVE = 0,
- E_DAY_VIEW_BUSY_OUT_OF_OFFICE = 1,
- E_DAY_VIEW_BUSY_BUSY = 2,
-
- E_DAY_VIEW_BUSY_LAST = 3
-} EDayViewBusyType;
-
-/* This is used to specify the format used when displaying the dates.
- The full format is like 'Thursday 12 September'. The abbreviated format is
- like 'Thu 12 Sep'. The no weekday format is like '12 Sep'. The short format
- is like '12'. The actual format used is determined in
- e_day_view_recalc_cell_sizes(), once we know the font being used. */
-typedef enum
-{
- E_DAY_VIEW_DATE_FULL,
- E_DAY_VIEW_DATE_ABBREVIATED,
- E_DAY_VIEW_DATE_NO_WEEKDAY,
- E_DAY_VIEW_DATE_SHORT
-} EDayViewDateFormat;
-
-/* These index our colors array. */
-typedef enum
-{
- E_DAY_VIEW_COLOR_BG_WORKING,
- E_DAY_VIEW_COLOR_BG_NOT_WORKING,
- E_DAY_VIEW_COLOR_BG_SELECTED,
- E_DAY_VIEW_COLOR_BG_SELECTED_UNFOCUSSED,
- E_DAY_VIEW_COLOR_BG_GRID,
-
- E_DAY_VIEW_COLOR_BG_TOP_CANVAS,
- E_DAY_VIEW_COLOR_BG_TOP_CANVAS_SELECTED,
- E_DAY_VIEW_COLOR_BG_TOP_CANVAS_GRID,
-
- E_DAY_VIEW_COLOR_EVENT_VBAR,
- E_DAY_VIEW_COLOR_EVENT_BACKGROUND,
- E_DAY_VIEW_COLOR_EVENT_BORDER,
-
- E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND,
- E_DAY_VIEW_COLOR_LONG_EVENT_BORDER,
-
- E_DAY_VIEW_COLOR_LAST
-} EDayViewColors;
-
-/* These specify which part of the selection we are dragging, if any. */
-typedef enum
-{
- E_DAY_VIEW_DRAG_START,
- E_DAY_VIEW_DRAG_END
-} EDayViewDragPosition;
-
-typedef struct _EDayViewEvent EDayViewEvent;
-struct _EDayViewEvent {
- E_CALENDAR_VIEW_EVENT_FIELDS
-
- /* For events in the main canvas, this contains the start column.
- For long events in the top canvas, this is its row. */
- guint8 start_row_or_col;
-
- /* For events in the main canvas, this is the number of columns that
- it covers. For long events this is set to 1 if the event is shown.
- For both types of events this is set to 0 if the event is not shown,
- i.e. it couldn't fit into the display. Currently long events are
- always shown as we just increase the height of the top canvas. */
- guint8 num_columns;
-};
-
-
-#define E_DAY_VIEW(obj) GTK_CHECK_CAST (obj, e_day_view_get_type (), EDayView)
-#define E_DAY_VIEW_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_day_view_get_type (), EDayViewClass)
-#define E_IS_DAY_VIEW(obj) GTK_CHECK_TYPE (obj, e_day_view_get_type ())
-
-
-typedef struct _EDayView EDayView;
-typedef struct _EDayViewClass EDayViewClass;
-
-struct _EDayView
-{
- ECalendarView cal_view;
-
- /* The top canvas where the dates and long appointments are shown. */
- GtkWidget *top_canvas;
- GnomeCanvasItem *top_canvas_item;
-
- /* The main canvas where the rest of the appointments are shown. */
- GtkWidget *main_canvas;
- GnomeCanvasItem *main_canvas_item;
-
- /* The canvas displaying the times of the day. */
- GtkWidget *time_canvas;
- GnomeCanvasItem *time_canvas_item;
-
- GtkWidget *vscrollbar;
-
- /* S-expression for query and the query object */
- ECalView *query;
-
- /* The start and end of the days shown. */
- time_t lower;
- time_t upper;
-
- /* Whether we are showing the work-week view. */
- gboolean work_week_view;
-
- /* The number of days we are showing. Usually 1 or 5, but can be up
- to E_DAY_VIEW_MAX_DAYS, e.g. when the user selects a range of
- days in the date navigator. */
- gint days_shown;
-
- /* The start of each day & an extra element to hold the last time. */
- time_t day_starts[E_DAY_VIEW_MAX_DAYS + 1];
-
- /* An array of EDayViewEvent elements for the top view and each day. */
- GArray *long_events;
- GArray *events[E_DAY_VIEW_MAX_DAYS];
-
- /* These are set to FALSE whenever an event in the corresponding array
- is changed. Any function that needs the events sorted calls
- e_day_view_ensure_events_sorted(). */
- gboolean long_events_sorted;
- gboolean events_sorted[E_DAY_VIEW_MAX_DAYS];
-
- /* This is TRUE if we need to relayout the events before drawing. */
- gboolean long_events_need_layout;
- gboolean need_layout[E_DAY_VIEW_MAX_DAYS];
-
- /* This is TRUE if we need to reshape the canvas items, but a full
- layout is not necessary. */
- gboolean long_events_need_reshape;
- gboolean need_reshape[E_DAY_VIEW_MAX_DAYS];
-
- /* The ID of the timeout function for doing a new layout. */
- gint layout_timeout_id;
-
- /* The number of minutes per row. 5, 10, 15, 30 or 60. */
- gint mins_per_row;
-
- /* The number of rows needed, depending on the times shown and the
- minutes per row. */
- gint rows;
-
- /* The height of each row. */
- gint row_height;
-
- /* The number of rows in the top display. */
- gint rows_in_top_display;
-
- /* The height of each row in the top canvas. */
- gint top_row_height;
-
- /* The first and last times shown in the display. The last time isn't
- included in the range. Default is 0:00-24:00 */
- gint first_hour_shown;
- gint first_minute_shown;
- gint last_hour_shown;
- gint last_minute_shown;
-
- /* Bitwise combination of working days. Defaults to Mon-Fri. */
- EDayViewDays working_days;
-
- /* The start and end of the work day, rounded to the nearest row. */
- gint work_day_start_hour;
- gint work_day_start_minute;
- gint work_day_end_hour;
- gint work_day_end_minute;
-
- /* Whether we use show event end times in the main canvas. */
- gboolean show_event_end_times;
-
- /* The first day of the week, 0 (Monday) to 6 (Sunday). */
- gint week_start_day;
-
- /* This is set to TRUE when the widget is created, so it scrolls to
- the start of the working day when first shown. */
- gboolean scroll_to_work_day;
-
- /* This is the width & offset of each of the day columns in the
- display. */
- gint day_widths[E_DAY_VIEW_MAX_DAYS];
- gint day_offsets[E_DAY_VIEW_MAX_DAYS + 1];
-
- /* An array holding the number of columns in each row, in each day.
- Note that there are a maximum of 12 * 24 rows (when a row is 5 mins)
- but we don't always have that many rows. */
- guint8 cols_per_row[E_DAY_VIEW_MAX_DAYS][12 * 24];
-
- /* Sizes of the various time strings. */
- gint small_hour_widths[24];
- gint max_small_hour_width;
- gint max_minute_width;
- gint colon_width;
- gint digit_width; /* Size of '0' character. */
-
- /* This specifies how we are displaying the dates at the top. */
- EDayViewDateFormat date_format;
-
- /* These are the longest month & weekday names in the current font.
- Months are 0 to 11. Weekdays are 0 (Sun) to 6 (Sat). */
- gint longest_month_name;
- gint longest_abbreviated_month_name;
- gint longest_weekday_name;
- gint longest_abbreviated_weekday_name;
-
- /* The large font used to display the hours. I don't think we need a
- fontset since we only display numbers. */
- PangoFontDescription *large_font_desc;
-
- /* The GC used for painting in different colors. */
- GdkGC *main_gc;
-
- /* The icons. */
- GdkPixbuf *reminder_icon;
- GdkPixbuf *recurrence_icon;
- GdkPixbuf *timezone_icon;
- GdkPixbuf *meeting_icon;
- GdkPixbuf *attach_icon;
-
- /* Colors for drawing. */
- GdkColor colors[E_DAY_VIEW_COLOR_LAST];
-
- /* The normal & resizing cursors. */
- GdkCursor *normal_cursor;
- GdkCursor *move_cursor;
- GdkCursor *resize_width_cursor;
- GdkCursor *resize_height_cursor;
-
- /* This remembers the last cursor set on the window. */
- GdkCursor *last_cursor_set_in_top_canvas;
- GdkCursor *last_cursor_set_in_main_canvas;
-
- /*
- * Editing, Selection & Dragging data
- */
-
- /* The horizontal bars to resize events in the main canvas. */
- GnomeCanvasItem *main_canvas_top_resize_bar_item;
- GnomeCanvasItem *main_canvas_bottom_resize_bar_item;
-
- /* The event currently being edited. The day is -1 if no event is
- being edited, or E_DAY_VIEW_LONG_EVENT if a long event is edited. */
- gint editing_event_day;
- gint editing_event_num;
-
- /* This is a GnomeCanvasRect which is placed around an item while it
- is being resized, so we can raise it above all other EText items. */
- GnomeCanvasItem *resize_long_event_rect_item;
- GnomeCanvasItem *resize_rect_item;
- GnomeCanvasItem *resize_bar_item;
-
- /* The event for which a popup menu is being displayed, as above. */
- gint popup_event_day;
- gint popup_event_num;
-
- /* The currently selected region. If selection_start_day is -1 there is
- no current selection. If start_row or end_row is -1 then the
- selection is in the top canvas. */
- gint selection_start_day;
- gint selection_end_day;
- gint selection_start_row;
- gint selection_end_row;
-
- /* This is TRUE if the selection is currently being dragged using the
- mouse. */
- gboolean selection_is_being_dragged;
-
- /* This specifies which end of the selection is being dragged. */
- EDayViewDragPosition selection_drag_pos;
-
- /* This is TRUE if the selection is in the top canvas only (i.e. if the
- last motion event was in the top canvas). */
- gboolean selection_in_top_canvas;
-
- /* The last mouse position, relative to the main canvas window.
- Used when auto-scrolling to update the selection. */
- gint last_mouse_x;
- gint last_mouse_y;
-
- /* Auto-scroll info for when selecting an area or dragging an item. */
- gint auto_scroll_timeout_id;
- gint auto_scroll_delay;
- gboolean auto_scroll_up;
-
- /* These are used for the resize bars. */
- gint resize_bars_event_day;
- gint resize_bars_event_num;
-
- /* These are used when resizing events. */
- gint resize_event_day;
- gint resize_event_num;
- ECalendarViewPosition resize_drag_pos;
- gint resize_start_row;
- gint resize_end_row;
-
- /* This is used to remember the last edited event. */
- gchar *last_edited_comp_string;
-
- /* This is the event the mouse button was pressed on. If the button
- is released we start editing it, but if the mouse is dragged we set
- this to -1. */
- gint pressed_event_day;
- gint pressed_event_num;
-
- /* These are used when dragging events. If drag_event_day is not -1 we
- know that we are dragging one of the EDayView events around. */
- gint drag_event_day;
- gint drag_event_num;
-
- /* The last mouse position when dragging, in the entire canvas. */
- gint drag_event_x;
- gint drag_event_y;
-
- /* The offset of the mouse from the top of the event, in rows.
- In the top canvas this is the offset from the left, in days. */
- gint drag_event_offset;
-
- /* The last day & row dragged to, so we know when we need to update
- the dragged event's position. */
- gint drag_last_day;
- gint drag_last_row;
-
- /* This is a GnomeCanvasRect which is placed around an item while it
- is being resized, so we can raise it above all other EText items. */
- GnomeCanvasItem *drag_long_event_rect_item;
- GnomeCanvasItem *drag_long_event_item;
- GnomeCanvasItem *drag_rect_item;
- GnomeCanvasItem *drag_bar_item;
- GnomeCanvasItem *drag_item;
-
- /* "am" and "pm" in the current locale, and their widths. */
- gchar *am_string;
- gchar *pm_string;
- gint am_string_width;
- gint pm_string_width;
-};
-
-struct _EDayViewClass
-{
- ECalendarViewClass parent_class;
-};
-
-
-GtkType e_day_view_get_type (void);
-GtkWidget* e_day_view_new (void);
-
-/* Whether we are displaying a work-week, in which case the display always
- starts on the first day of the working week. */
-gboolean e_day_view_get_work_week_view (EDayView *day_view);
-void e_day_view_set_work_week_view (EDayView *day_view,
- gboolean work_week_view);
-
-/* The number of days shown in the EDayView, from 1 to 7. This is normally
- either 1 or 5 (for the Work-Week view). */
-gint e_day_view_get_days_shown (EDayView *day_view);
-void e_day_view_set_days_shown (EDayView *day_view,
- gint days_shown);
-
-/* This specifies how many minutes are represented by one row in the display.
- It can be 60, 30, 15, 10 or 5. The default is 30. */
-gint e_day_view_get_mins_per_row (EDayView *day_view);
-void e_day_view_set_mins_per_row (EDayView *day_view,
- gint mins_per_row);
-
-/* This specifies the working days in the week. The value is a bitwise
- combination of day flags. Defaults to Mon-Fri. */
-EDayViewDays e_day_view_get_working_days (EDayView *day_view);
-void e_day_view_set_working_days (EDayView *day_view,
- EDayViewDays days);
-
-/* The start and end time of the working day. This only affects the background
- colors. */
-void e_day_view_get_working_day (EDayView *day_view,
- gint *start_hour,
- gint *start_minute,
- gint *end_hour,
- gint *end_minute);
-void e_day_view_set_working_day (EDayView *day_view,
- gint start_hour,
- gint start_minute,
- gint end_hour,
- gint end_minute);
-
-/* Whether we display event end times in the main canvas. */
-gboolean e_day_view_get_show_event_end_times (EDayView *day_view);
-void e_day_view_set_show_event_end_times (EDayView *day_view,
- gboolean show);
-
-/* The first day of the week, 0 (Monday) to 6 (Sunday). */
-gint e_day_view_get_week_start_day (EDayView *day_view);
-void e_day_view_set_week_start_day (EDayView *day_view,
- gint week_start_day);
-
-void e_day_view_delete_occurrence (EDayView *day_view);
-
-/* Returns the number of selected events (0 or 1 at present). */
-gint e_day_view_get_num_events_selected (EDayView *day_view);
-
-/*
- * Internal functions called by the associated canvas items.
- */
-void e_day_view_check_layout (EDayView *day_view);
-gint e_day_view_convert_time_to_row (EDayView *day_view,
- gint hour,
- gint minute);
-gint e_day_view_convert_time_to_position (EDayView *day_view,
- gint hour,
- gint minute);
-gboolean e_day_view_get_event_rows (EDayView *day_view,
- gint day,
- gint event_num,
- gint *start_row_out,
- gint *end_row_out);
-gboolean e_day_view_get_event_position (EDayView *day_view,
- gint day,
- gint event_num,
- gint *item_x,
- gint *item_y,
- gint *item_w,
- gint *item_h);
-gboolean e_day_view_get_long_event_position (EDayView *day_view,
- gint event_num,
- gint *start_day,
- gint *end_day,
- gint *item_x,
- gint *item_y,
- gint *item_w,
- gint *item_h);
-
-void e_day_view_start_selection (EDayView *day_view,
- gint day,
- gint row);
-void e_day_view_update_selection (EDayView *day_view,
- gint day,
- gint row);
-void e_day_view_finish_selection (EDayView *day_view);
-
-void e_day_view_check_auto_scroll (EDayView *day_view,
- gint event_x,
- gint event_y);
-void e_day_view_stop_auto_scroll (EDayView *day_view);
-
-void e_day_view_convert_time_to_display (EDayView *day_view,
- gint hour,
- gint *display_hour,
- gchar **suffix,
- gint *suffix_width);
-gint e_day_view_get_time_string_width (EDayView *day_view);
-
-
-gint e_day_view_event_sort_func (const void *arg1,
- const void *arg2);
-
-gboolean e_day_view_find_event_from_item (EDayView *day_view,
- GnomeCanvasItem *item,
- gint *day_return,
- gint *event_num_return);
-void e_day_view_update_calendar_selection_time (EDayView *day_view);
-void e_day_view_ensure_rows_visible (EDayView *day_view,
- gint start_row,
- gint end_row);
-
-
-G_END_DECLS
-
-#endif /* _E_DAY_VIEW_H_ */
diff --git a/calendar/gui/e-itip-control.c b/calendar/gui/e-itip-control.c
deleted file mode 100644
index 77116834a1..0000000000
--- a/calendar/gui/e-itip-control.c
+++ /dev/null
@@ -1,2517 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-itip-control.c
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: JP Rosevear
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <glib.h>
-#include <gtk/gtkmisc.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnome/gnome-util.h>
-#include <libgnomeui/gnome-stock-icons.h>
-#include <libgnomeui/gnome-uidefs.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <libgnomeui/gnome-dialog-util.h>
-#include <bonobo/bonobo-object.h>
-#include <bonobo/bonobo-exception.h>
-#include <gtkhtml/gtkhtml.h>
-#include <gtkhtml/gtkhtml-embedded.h>
-#include <gtkhtml/gtkhtml-stream.h>
-#include <libedataserver/e-source-list.h>
-#include <libedataserverui/e-source-option-menu.h>
-#include <libical/ical.h>
-#include <libecal/e-cal-component.h>
-#include <libecal/e-cal-time-util.h>
-#include <libecal/e-cal.h>
-#include <e-util/e-time-utils.h>
-#include <e-util/e-dialog-widgets.h>
-#include <e-util/e-html-utils.h>
-#include "dialogs/delete-error.h"
-#include "calendar-config.h"
-#include "itip-utils.h"
-#include "e-itip-control.h"
-#include "common/authentication.h"
-#include <e-util/e-icon-factory.h>
-
-struct _EItipControlPrivate {
- GtkWidget *html;
-
- ESourceList *source_lists[E_CAL_SOURCE_TYPE_LAST];
- GHashTable *ecals[E_CAL_SOURCE_TYPE_LAST];
-
- ECal *current_ecal;
- ECalSourceType type;
-
- char action;
- gboolean rsvp;
-
- GtkWidget *ok;
- GtkWidget *hbox;
- GtkWidget *vbox;
-
- char *vcalendar;
- ECalComponent *comp;
- icalcomponent *main_comp;
- icalcomponent *ical_comp;
- icalcomponent *top_level;
- icalcompiter iter;
- icalproperty_method method;
-
- int current;
- int total;
-
- gchar *calendar_uid;
-
- EAccountList *accounts;
-
- gchar *from_address;
- gchar *delegator_address;
- gchar *delegator_name;
- gchar *my_address;
- gint view_only;
-};
-
-#define ACTION_DATA "EItipControl:Action"
-
-/* HTML Strings */
-#define HTML_BODY_START "<body bgcolor=\"#ffffff\" text=\"#000000\" link=\"#336699\">"
-#define HTML_SEP "<hr color=#336699 align=\"left\" width=450>"
-#define HTML_BODY_END "</body>"
-#define HTML_FOOTER "</html>"
-
-static void e_itip_control_destroy (GtkObject *obj);
-
-static void find_my_address (EItipControl *itip, icalcomponent *ical_comp, icalparameter_partstat *status);
-static void url_requested_cb (GtkHTML *html, const gchar *url, GtkHTMLStream *handle, gpointer data);
-static gboolean object_requested_cb (GtkHTML *html, GtkHTMLEmbedded *eb, gpointer data);
-static void ok_clicked_cb (GtkWidget *widget, gpointer data);
-
-G_DEFINE_TYPE (EItipControl, e_itip_control, GTK_TYPE_VBOX);
-
-static void
-e_itip_control_class_init (EItipControlClass *klass)
-{
- GObjectClass *object_class;
- GtkObjectClass *gtkobject_class;
-
- object_class = G_OBJECT_CLASS (klass);
- gtkobject_class = GTK_OBJECT_CLASS (klass);
-
- gtkobject_class->destroy = e_itip_control_destroy;
-}
-
-static void
-set_ok_sens (EItipControl *itip)
-{
- EItipControlPrivate *priv;
- gboolean read_only = TRUE;
-
- priv = itip->priv;
-
- if (!priv->ok)
- return;
-
- if (priv->current_ecal)
- e_cal_is_read_only (priv->current_ecal, &read_only, NULL);
-
- gtk_widget_set_sensitive (priv->ok, priv->current_ecal != NULL && !read_only);
-}
-
-static void
-cal_opened_cb (ECal *ecal, ECalendarStatus status, gpointer data)
-{
- EItipControl *itip = data;
- EItipControlPrivate *priv;
- ESource *source;
- ECalSourceType source_type;
- icaltimezone *zone;
-
- priv = itip->priv;
-
- source_type = e_cal_get_source_type (ecal);
- source = e_cal_get_source (ecal);
-
- g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, cal_opened_cb, NULL);
-
- if (status != E_CALENDAR_STATUS_OK) {
- g_hash_table_remove (priv->ecals[source_type], e_source_peek_uid (source));
-
- return;
- }
-
- zone = calendar_config_get_icaltimezone ();
- e_cal_set_default_timezone (ecal, zone, NULL);
-
- priv->current_ecal = ecal;
- set_ok_sens (itip);
-}
-
-typedef void (* EItipControlOpenFunc) (ECal *ecal, ECalendarStatus status, gpointer data);
-
-static ECal *
-start_calendar_server (EItipControl *itip, ESource *source, ECalSourceType type, EItipControlOpenFunc func, gpointer data)
-{
- EItipControlPrivate *priv;
- ECal *ecal;
-
- priv = itip->priv;
-
- ecal = g_hash_table_lookup (priv->ecals[type], e_source_peek_uid (source));
- if (ecal) {
- priv->current_ecal = ecal;
- set_ok_sens (itip);
- return ecal;
- }
-
- ecal = auth_new_cal_from_source (source, type);
- g_signal_connect (G_OBJECT (ecal), "cal_opened", G_CALLBACK (func), data);
-
- g_hash_table_insert (priv->ecals[type], g_strdup (e_source_peek_uid (source)), ecal);
-
- e_cal_open_async (ecal, TRUE);
-
- return ecal;
-}
-
-static ECal *
-start_calendar_server_by_uid (EItipControl *itip, const char *uid, ECalSourceType type)
-{
- EItipControlPrivate *priv;
- int i;
-
- priv = itip->priv;
-
- for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) {
- ESource *source;
-
- source = e_source_list_peek_source_by_uid (priv->source_lists[i], uid);
- if (source)
- return start_calendar_server (itip, source, type, cal_opened_cb, itip);
- }
-
- return NULL;
-}
-
-typedef struct {
- EItipControl *itip;
- char *uid;
- int count;
- gboolean show_selector;
-} EItipControlFindData;
-
-static void
-source_selected_cb (ESourceOptionMenu *esom, ESource *source, gpointer data)
-{
- EItipControl *itip = data;
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- if (priv->ok)
- gtk_widget_set_sensitive (priv->ok, FALSE);
-
- start_calendar_server (itip, source, priv->type, cal_opened_cb, itip);
-}
-
-static void
-find_cal_opened_cb (ECal *ecal, ECalendarStatus status, gpointer data)
-{
- EItipControlFindData *fd = data;
- EItipControlPrivate *priv;
- ESource *source;
- ECalSourceType source_type;
- icalcomponent *icalcomp;
- icaltimezone *zone;
-
- source_type = e_cal_get_source_type (ecal);
- source = e_cal_get_source (ecal);
-
- priv = fd->itip->priv;
-
- fd->count--;
-
- g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, find_cal_opened_cb, NULL);
-
- if (status != E_CALENDAR_STATUS_OK) {
- g_hash_table_remove (priv->ecals[source_type], e_source_peek_uid (source));
-
- goto cleanup;
- }
-
- if (e_cal_get_object (ecal, fd->uid, NULL, &icalcomp, NULL)) {
- icalcomponent_free (icalcomp);
-
- priv->current_ecal = ecal;
- set_ok_sens (fd->itip);
- }
-
- zone = calendar_config_get_icaltimezone ();
- e_cal_set_default_timezone (ecal, zone, NULL);
-
- cleanup:
- if (fd->count == 0) {
- if (fd->show_selector && !priv->current_ecal && priv->vbox) {
- GtkWidget *esom;
- ESource *source = NULL;
- char *uid;
-
- switch (priv->type) {
- case E_CAL_SOURCE_TYPE_EVENT:
- uid = calendar_config_get_primary_calendar ();
- break;
- case E_CAL_SOURCE_TYPE_TODO:
- uid = calendar_config_get_primary_tasks ();
- break;
- default:
- uid = NULL;
- g_assert_not_reached ();
- }
-
- if (uid) {
- source = e_source_list_peek_source_by_uid (priv->source_lists[priv->type], uid);
- g_free (uid);
- }
-
- /* Try to create a default if there isn't one */
- if (!source)
- source = e_source_list_peek_source_any (priv->source_lists[priv->type]);
-
- esom = e_source_option_menu_new (priv->source_lists[priv->type]);
- g_signal_connect_object (esom, "source_selected",
- G_CALLBACK (source_selected_cb),
- fd->itip, 0);
-
- gtk_box_pack_start (GTK_BOX (priv->vbox), esom, FALSE, TRUE, 0);
- gtk_widget_show (esom);
-
- /* FIXME What if there is no source? */
- if (source)
- e_source_option_menu_select (E_SOURCE_OPTION_MENU (esom), source);
- } else {
- /* FIXME Display error message to user */
- }
-
- g_free (fd->uid);
- g_free (fd);
- }
-}
-
-static void
-find_server (EItipControl *itip, ECalComponent *comp, gboolean show_selector)
-{
- EItipControlPrivate *priv;
- EItipControlFindData *fd = NULL;
- GSList *groups, *l;
- const char *uid;
-
- priv = itip->priv;
-
- e_cal_component_get_uid (comp, &uid);
-
- groups = e_source_list_peek_groups (priv->source_lists[priv->type]);
- for (l = groups; l; l = l->next) {
- ESourceGroup *group;
- GSList *sources, *m;
-
- group = l->data;
-
- sources = e_source_group_peek_sources (group);
- for (m = sources; m; m = m->next) {
- ESource *source;
- ECal *ecal;
-
- source = m->data;
-
- if (!fd) {
- fd = g_new0 (EItipControlFindData, 1);
- fd->itip = itip;
- fd->uid = g_strdup (uid);
- fd->show_selector = show_selector;
- }
- fd->count++;
-
- ecal = start_calendar_server (itip, source, priv->type, find_cal_opened_cb, fd);
- }
- }
-}
-
-static void
-cleanup_ecal (ECal *ecal)
-{
- /* Clean up any signals */
- g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, cal_opened_cb, NULL);
- g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, find_cal_opened_cb, NULL);
-
- g_object_unref (ecal);
-}
-
-static void
-html_destroyed (gpointer data)
-{
- EItipControl *itip = data;
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- priv->html = NULL;
-}
-
-static void
-e_itip_control_init (EItipControl *itip)
-{
- EItipControlPrivate *priv;
- GtkWidget *scrolled_window;
- int i;
-
- priv = g_new0 (EItipControlPrivate, 1);
- itip->priv = priv;
-
- /* Addresses */
- priv->accounts = itip_addresses_get ();
-
- /* Source Lists */
- for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++)
- priv->source_lists[i] = NULL;
-
- priv->source_lists[E_CAL_SOURCE_TYPE_EVENT] = e_source_list_new_for_gconf_default ("/apps/evolution/calendar/sources");
- priv->source_lists[E_CAL_SOURCE_TYPE_TODO] = e_source_list_new_for_gconf_default ("/apps/evolution/tasks/sources");
-
- /* Initialize the ecal hashes */
- for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++)
- priv->ecals[i] = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, cleanup_ecal);
- priv->current_ecal = NULL;
-
- /* Other fields to init */
- priv->calendar_uid = NULL;
- priv->from_address = NULL;
- priv->delegator_address = NULL;
- priv->delegator_name = NULL;
- priv->my_address = NULL;
- priv->view_only = 0;
-
- /* Html Widget */
- priv->html = gtk_html_new ();
- gtk_html_set_default_content_type (GTK_HTML (priv->html),
- "text/html; charset=utf-8");
- gtk_html_load_from_string (GTK_HTML (priv->html), " ", 1);
- gtk_widget_show (priv->html);
-
- scrolled_window = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- gtk_widget_show (scrolled_window);
-
- gtk_container_add (GTK_CONTAINER (scrolled_window), priv->html);
- g_object_weak_ref (G_OBJECT (priv->html), (GWeakNotify)html_destroyed, itip);
- gtk_widget_set_usize (scrolled_window, 600, 400);
- gtk_box_pack_start (GTK_BOX (itip), scrolled_window, FALSE, FALSE, 6);
-
- g_signal_connect (priv->html, "url_requested", G_CALLBACK (url_requested_cb), itip);
- g_signal_connect (priv->html, "object_requested", G_CALLBACK (object_requested_cb), itip);
- g_signal_connect (priv->html, "submit", G_CALLBACK (ok_clicked_cb), itip);
-}
-
-static void
-clean_up (EItipControl *itip)
-{
- EItipControlPrivate *priv;
-
- priv = itip->priv;
- if (!priv)
- return;
-
- g_free (priv->vcalendar);
- priv->vcalendar = NULL;
-
- if (priv->comp) {
- g_object_unref (priv->comp);
- priv->comp = NULL;
- }
-
- if (priv->top_level) {
- icalcomponent_free (priv->top_level);
- priv->top_level = NULL;
- }
-
- if (priv->main_comp) {
- icalcomponent_free (priv->main_comp);
- priv->main_comp = NULL;
- }
- priv->ical_comp = NULL;
-
- priv->current = 0;
- priv->total = 0;
-
- g_free (priv->calendar_uid);
- priv->calendar_uid = NULL;
-
- g_free (priv->from_address);
- priv->from_address = NULL;
- g_free (priv->delegator_address);
- priv->delegator_address = NULL;
- g_free (priv->delegator_name);
- priv->delegator_name = NULL;
- g_free (priv->my_address);
- priv->my_address = NULL;
-}
-
-static void
-e_itip_control_destroy (GtkObject *obj)
-{
- EItipControl *itip = E_ITIP_CONTROL (obj);
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- if (priv) {
- int i;
-
- clean_up (itip);
-
- priv->accounts = NULL;
-
- for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) {
- if (priv->ecals[i]) {
- g_hash_table_destroy (priv->ecals[i]);
- priv->ecals[i] = NULL;
- }
- }
-
- if (priv->html) {
- g_signal_handlers_disconnect_matched (priv->html, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, itip);
- g_object_weak_unref (G_OBJECT (priv->html), (GWeakNotify)html_destroyed, itip);
- }
-
- g_free (priv);
- itip->priv = NULL;
- }
-
- (* GTK_OBJECT_CLASS (e_itip_control_parent_class)->destroy) (obj);
-}
-
-GtkWidget *
-e_itip_control_new (void)
-{
- return g_object_new (E_TYPE_ITIP_CONTROL, NULL);
-}
-
-static void
-find_my_address (EItipControl *itip, icalcomponent *ical_comp, icalparameter_partstat *status)
-{
- EItipControlPrivate *priv;
- icalproperty *prop;
- char *my_alt_address = NULL;
-
- priv = itip->priv;
-
- for (prop = icalcomponent_get_first_property (ical_comp, ICAL_ATTENDEE_PROPERTY);
- prop != NULL;
- prop = icalcomponent_get_next_property (ical_comp, ICAL_ATTENDEE_PROPERTY)) {
- icalvalue *value;
- icalparameter *param;
- const char *attendee, *name;
- char *attendee_clean, *name_clean;
- EIterator *it;
-
- value = icalproperty_get_value (prop);
- if (value != NULL) {
- attendee = icalvalue_get_string (value);
- attendee_clean = g_strdup (itip_strip_mailto (attendee));
- attendee_clean = g_strstrip (attendee_clean);
- } else {
- attendee = NULL;
- attendee_clean = NULL;
- }
-
- param = icalproperty_get_first_parameter (prop, ICAL_CN_PARAMETER);
- if (param != NULL) {
- name = icalparameter_get_cn (param);
- name_clean = g_strdup (name);
- name_clean = g_strstrip (name_clean);
- } else {
- name = NULL;
- name_clean = NULL;
- }
-
- if (priv->delegator_address) {
- char *delegator_clean;
-
- delegator_clean = g_strdup (itip_strip_mailto (attendee));
- delegator_clean = g_strstrip (delegator_clean);
-
- /* If the mailer told us the address to use, use that */
- if (delegator_clean != NULL
- && !g_ascii_strcasecmp (attendee_clean, delegator_clean)) {
- priv->my_address = g_strdup (itip_strip_mailto (priv->delegator_address));
- priv->my_address = g_strstrip (priv->my_address);
-
- if (status) {
- param = icalproperty_get_first_parameter (prop, ICAL_PARTSTAT_PARAMETER);
- *status = param ? icalparameter_get_partstat (param) : ICAL_PARTSTAT_NEEDSACTION;
- }
- }
-
- g_free (delegator_clean);
- } else {
- it = e_list_get_iterator((EList *)priv->accounts);
- while (e_iterator_is_valid(it)) {
- const EAccount *account = e_iterator_get(it);
-
- /* Check for a matching address */
- if (attendee_clean != NULL
- && !g_ascii_strcasecmp (account->id->address, attendee_clean)) {
- priv->my_address = g_strdup (account->id->address);
- if (status) {
- param = icalproperty_get_first_parameter (prop, ICAL_PARTSTAT_PARAMETER);
- *status = param ? icalparameter_get_partstat (param) : ICAL_PARTSTAT_NEEDSACTION;
- }
- g_free (attendee_clean);
- g_free (name_clean);
- g_free (my_alt_address);
- g_object_unref(it);
- return;
- }
-
- /* Check for a matching cname to fall back on */
- if (name_clean != NULL
- && !g_ascii_strcasecmp (account->id->name, name_clean))
- my_alt_address = g_strdup (attendee_clean);
-
- e_iterator_next(it);
- }
- g_object_unref(it);
- }
-
- g_free (attendee_clean);
- g_free (name_clean);
- }
-
- priv->my_address = my_alt_address;
- if (status)
- *status = ICAL_PARTSTAT_NEEDSACTION;
-}
-
-static icalproperty *
-find_attendee (icalcomponent *ical_comp, const char *address)
-{
- icalproperty *prop;
-
- if (address == NULL)
- return NULL;
-
- for (prop = icalcomponent_get_first_property (ical_comp, ICAL_ATTENDEE_PROPERTY);
- prop != NULL;
- prop = icalcomponent_get_next_property (ical_comp, ICAL_ATTENDEE_PROPERTY)) {
- icalvalue *value;
- const char *attendee;
- char *text;
-
- value = icalproperty_get_value (prop);
- if (!value)
- continue;
-
- attendee = icalvalue_get_string (value);
-
- text = g_strdup (itip_strip_mailto (attendee));
- text = g_strstrip (text);
- if (!g_strcasecmp (address, text)) {
- g_free (text);
- break;
- }
- g_free (text);
- }
-
- return prop;
-}
-
-static void
-write_label_piece (EItipControl *itip, ECalComponentDateTime *dt,
- char *buffer, int size,
- const char *stext, const char *etext,
- gboolean just_date)
-{
- EItipControlPrivate *priv;
- struct tm tmp_tm;
- char time_buf[64];
- icaltimezone *zone = NULL;
- char *display_name;
-
- priv = itip->priv;
-
- /* UTC times get converted to the current timezone. This is done for
- the COMPLETED property, which is always in UTC, and also because
- Outlook sends simple events as UTC times. */
- if (dt->value->is_utc) {
- zone = calendar_config_get_icaltimezone ();
- icaltimezone_convert_time (dt->value, icaltimezone_get_utc_timezone (), zone);
- }
-
- tmp_tm = icaltimetype_to_tm (dt->value);
- if (just_date)
- tmp_tm.tm_hour = tmp_tm.tm_min = tmp_tm.tm_sec = 0;
-
- if (stext != NULL)
- strcat (buffer, stext);
-
- e_time_format_date_and_time (&tmp_tm,
- calendar_config_get_24_hour_format (),
- FALSE, FALSE,
- time_buf, sizeof (time_buf));
- strcat (buffer, time_buf);
-
- if (!dt->value->is_utc && dt->tzid) {
- zone = icalcomponent_get_timezone (priv->top_level, dt->tzid);
- }
-
- /* Output timezone after time, e.g. " America/New_York". */
- if (zone && !just_date) {
- /* Note that this returns UTF-8, since all iCalendar data is
- UTF-8. But it probably is not translated. */
- display_name = icaltimezone_get_display_name (zone);
- if (display_name && *display_name) {
- strcat (buffer, " <font size=-1>[");
-
- /* We check if it is one of our builtin timezone names,
- in which case we call gettext to translate it. */
- if (icaltimezone_get_builtin_timezone (display_name)) {
- strcat (buffer, _(display_name));
- } else {
- strcat (buffer, display_name);
- }
- strcat (buffer, "]</font>");
- }
- }
-
- if (etext != NULL)
- strcat (buffer, etext);
-}
-
-static const char *
-nth (int n)
-{
- if (n == -1)
- return "last";
- else if (n < 1 || n > 31)
- return "?";
- else
- return e_cal_recur_nth[n];
-}
-
-static const char *dayname[] = {
- N_("Sunday"),
- N_("Monday"),
- N_("Tuesday"),
- N_("Wednesday"),
- N_("Thursday"),
- N_("Friday"),
- N_("Saturday")
-};
-
-static inline char *
-get_dayname (struct icalrecurrencetype *r, int i)
-{
- enum icalrecurrencetype_weekday day;
-
- day = icalrecurrencetype_day_day_of_week (r->by_day[i]);
- g_return_val_if_fail (day > 0 && day < 8, "?");
-
- return _(dayname[day - 1]);
-}
-
-static void
-write_recurrence_piece (EItipControl *itip, ECalComponent *comp,
- char *buffer, int size)
-{
- GSList *rrules;
- struct icalrecurrencetype *r;
- int len, i;
-
- strcpy (buffer, "<b>Recurring:</b> ");
- len = strlen (buffer);
- buffer += len;
- size -= len;
-
- if (!e_cal_component_has_simple_recurrence (comp)) {
- strcpy (buffer, _("Yes. (Complex Recurrence)"));
- return;
- }
-
- e_cal_component_get_rrule_list (comp, &rrules);
- g_return_if_fail (rrules && !rrules->next);
-
- r = rrules->data;
-
- switch (r->freq) {
- case ICAL_DAILY_RECURRENCE:
- sprintf (buffer, ngettext("Every day", "Every %d days", r->interval), r->interval);
- break;
-
- case ICAL_WEEKLY_RECURRENCE:
- if (r->by_day[0] == ICAL_RECURRENCE_ARRAY_MAX) {
- sprintf (buffer, ngettext("Every week", "Every %d weeks", r->interval), r->interval);
- } else {
- sprintf (buffer, ngettext("Every week on ", "Every %d weeks on ", r->interval), r->interval);
-
- for (i = 1; i < 8 && r->by_day[i] != ICAL_RECURRENCE_ARRAY_MAX; i++) {
- if (i > 1)
- strcat (buffer, ", ");
- strcat (buffer, get_dayname (r, i - 1));
- }
- if (i > 1)
- strcat (buffer, _(" and "));
- strcat (buffer, get_dayname (r, i - 1));
- }
- break;
-
- case ICAL_MONTHLY_RECURRENCE:
- if (r->by_month_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
- sprintf (buffer, _("The %s day of "),
- nth (r->by_month_day[0]));
- } else {
- int pos;
-
- /* Outlook 2000 uses BYDAY=TU;BYSETPOS=2, and will not
- accept BYDAY=2TU. So we now use the same as Outlook
- by default. */
-
- pos = icalrecurrencetype_day_position (r->by_day[0]);
- if (pos == 0)
- pos = r->by_set_pos[0];
-
- sprintf (buffer, _("The %s %s of "),
- nth (pos), get_dayname (r, 0));
- }
-
- len = strlen (buffer);
- buffer += len;
- size -= len;
- sprintf (buffer, ngettext("every month","every %d months", r->interval), r->interval);
- break;
-
- case ICAL_YEARLY_RECURRENCE:
- sprintf (buffer, ngettext("Every year", "Every %d years", r->interval), r->interval);
- break;
-
- default:
- g_assert_not_reached ();
- }
-
- len = strlen (buffer);
- buffer += len;
- size -= len;
- if (r->count) {
- sprintf (buffer, ngettext("a total of %d time", " a total of %d times", r->count), r->count);
- } else if (!icaltime_is_null_time (r->until)) {
- ECalComponentDateTime dt;
-
- /* FIXME This should get the tzid id, not the whole zone */
- dt.value = &r->until;
- dt.tzid = icaltimezone_get_tzid ((icaltimezone *)r->until.zone);
-
- write_label_piece (itip, &dt, buffer, size,
- _(", ending on "), NULL, TRUE);
- }
-
- strcat (buffer, "<br>");
-}
-
-static void
-set_date_label (EItipControl *itip, GtkHTML *html, GtkHTMLStream *html_stream,
- ECalComponent *comp)
-{
- EItipControlPrivate *priv;
- ECalComponentDateTime datetime;
- static char buffer[1024];
- gchar *str;
- gboolean wrote = FALSE, task_completed = FALSE;
- ECalComponentVType type;
-
- priv = itip->priv;
-
- type = e_cal_component_get_vtype (comp);
-
- buffer[0] = '\0';
- e_cal_component_get_dtstart (comp, &datetime);
- if (datetime.value) {
- str = g_strdup_printf ("<b>%s:</b>", _("Starts"));
- write_label_piece (itip, &datetime, buffer, 1024,
- str,
- "<br>", FALSE);
- gtk_html_write (html, html_stream, buffer, strlen(buffer));
- wrote = TRUE;
- g_free (str);
- }
- e_cal_component_free_datetime (&datetime);
-
- buffer[0] = '\0';
- e_cal_component_get_dtend (comp, &datetime);
- if (datetime.value){
- str = g_strdup_printf ("<b>%s:</b>", _("Ends"));
- write_label_piece (itip, &datetime, buffer, 1024, str, "<br>", FALSE);
- gtk_html_write (html, html_stream, buffer, strlen (buffer));
- wrote = TRUE;
- g_free (str);
- }
- e_cal_component_free_datetime (&datetime);
-
- buffer[0] = '\0';
- if (e_cal_component_has_recurrences (comp)) {
- write_recurrence_piece (itip, comp, buffer, 1024);
- gtk_html_write (html, html_stream, buffer, strlen (buffer));
- wrote = TRUE;
- }
-
- buffer[0] = '\0';
- datetime.tzid = NULL;
- e_cal_component_get_completed (comp, &datetime.value);
- if (type == E_CAL_COMPONENT_TODO && datetime.value) {
- /* Pass TRUE as is_utc, so it gets converted to the current
- timezone. */
- str = g_strdup_printf ("<b>%s:</b>", _("Completed"));
- datetime.value->is_utc = TRUE;
- write_label_piece (itip, &datetime, buffer, 1024, str, "<br>", FALSE);
- gtk_html_write (html, html_stream, buffer, strlen (buffer));
- wrote = TRUE;
- task_completed = TRUE;
- g_free (str);
- }
- e_cal_component_free_datetime (&datetime);
-
- buffer[0] = '\0';
- e_cal_component_get_due (comp, &datetime);
- if (type == E_CAL_COMPONENT_TODO && !task_completed && datetime.value) {
- str = g_strdup_printf ("<b>%s:</b>", _("Due"));
- write_label_piece (itip, &datetime, buffer, 1024, str, "<br>", FALSE);
- gtk_html_write (html, html_stream, buffer, strlen (buffer));
- wrote = TRUE;
- g_free (str);
- }
-
- e_cal_component_free_datetime (&datetime);
-
- if (wrote)
- gtk_html_stream_printf (html_stream, "<br>");
-}
-
-static void
-set_message (GtkHTML *html, GtkHTMLStream *html_stream, const gchar *message, gboolean err)
-{
- if (message == NULL)
- return;
-
-
- if (err) {
- gtk_html_stream_printf (html_stream, "<b><font color=\"#ff0000\">%s</font></b><br><br>", message);
- } else {
- gtk_html_stream_printf (html_stream, "<b>%s</b><br><br>", message);
- }
-}
-
-static void
-write_error_html (EItipControl *itip, const gchar *itip_err)
-{
- EItipControlPrivate *priv;
- GtkHTMLStream *html_stream;
- gchar *filename;
-
- priv = itip->priv;
-
- /* Html widget */
- html_stream = gtk_html_begin (GTK_HTML (priv->html));
- gtk_html_stream_printf (html_stream,
- "<html><head><title>%s</title></head>",
- _("iCalendar Information"));
-
- gtk_html_write (GTK_HTML (priv->html), html_stream,
- HTML_BODY_START, strlen(HTML_BODY_START));
-
- /* The table */
- gtk_html_stream_printf (html_stream, "<table width=450 cellspacing=\"0\" cellpadding=\"4\" border=\"0\">");
- /* The column for the image */
- gtk_html_stream_printf (html_stream, "<tr><td width=48 align=\"center\" valign=\"top\" rowspan=\"8\">");
- /* The image */
- filename = e_icon_factory_get_icon_filename ("stock_new-meeting", E_ICON_SIZE_DIALOG);
- gtk_html_stream_printf (html_stream, "<img src=\"%s\"></td>", filename);
- g_free (filename);
-
- gtk_html_stream_printf (html_stream, "<td align=\"left\" valign=\"top\">");
-
- /* Title */
- set_message (GTK_HTML (priv->html), html_stream, _("iCalendar Error"), TRUE);
-
- /* Error */
- gtk_html_write (GTK_HTML (priv->html), html_stream, itip_err, strlen(itip_err));
-
- /* Clean up */
- gtk_html_stream_printf (html_stream, "</td></tr></table>");
-
- gtk_html_write (GTK_HTML (priv->html), html_stream,
- HTML_BODY_END, strlen(HTML_BODY_END));
- gtk_html_write (GTK_HTML (priv->html), html_stream,
- HTML_FOOTER, strlen(HTML_FOOTER));
-
- gtk_html_end (GTK_HTML (priv->html), html_stream, GTK_HTML_STREAM_OK);
-}
-
-static void
-write_html (EItipControl *itip, const gchar *itip_desc, const gchar *itip_title, const gchar *options)
-{
- EItipControlPrivate *priv;
- GtkHTMLStream *html_stream;
- ECalComponentText text;
- ECalComponentOrganizer organizer;
- ECalComponentAttendee *attendee;
- GSList *attendees, *l = NULL;
- const char *string;
- gchar *html;
- const gchar *const_html;
- gchar *filename;
- gchar *str;
-
- priv = itip->priv;
-
- if (priv->html == NULL)
- return;
-
- /* Html widget */
- html_stream = gtk_html_begin (GTK_HTML (priv->html));
- gtk_html_stream_printf (html_stream,
- "<html><head><title>%s</title></head>",
- _("iCalendar Information"));
- gtk_html_write (GTK_HTML (priv->html), html_stream,
- HTML_BODY_START, strlen(HTML_BODY_START));
-
- /* The table */
- const_html = "<table width=450 cellspacing=\"0\" cellpadding=\"4\" border=\"0\">";
- gtk_html_write (GTK_HTML (priv->html), html_stream, const_html, strlen(const_html));
-
- /* The column for the image */
- const_html = "<tr><td width=48 align=\"center\" valign=\"top\" rowspan=\"8\">";
- gtk_html_write (GTK_HTML (priv->html), html_stream, const_html, strlen(const_html));
-
- /* The image */
- filename = e_icon_factory_get_icon_filename ("stock_new-meeting", E_ICON_SIZE_DIALOG);
- gtk_html_stream_printf (html_stream, "<img src=\"%s\"></td>", filename);
- g_free (filename);
-
- const_html = "<td align=\"left\" valign=\"top\">";
- gtk_html_write (GTK_HTML (priv->html), html_stream, const_html, strlen(const_html));
-
- switch (priv->method) {
- case ICAL_METHOD_REFRESH:
- case ICAL_METHOD_REPLY:
- /* An attendee sent this */
- e_cal_component_get_attendee_list (priv->comp, &attendees);
- if (attendees != NULL) {
- attendee = attendees->data;
- html = g_strdup_printf (itip_desc,
- attendee->cn ?
- attendee->cn :
- itip_strip_mailto (attendee->value));
- } else {
- html = g_strdup_printf (itip_desc, _("An unknown person"));
- }
- break;
- case ICAL_METHOD_REQUEST:
- /* The organizer sent this */
- e_cal_component_get_organizer (priv->comp, &organizer);
- if (priv->delegator_address != NULL) {
- if (organizer.value != NULL)
- html = g_strdup_printf (itip_desc,
- organizer.cn ?
- organizer.cn :
- itip_strip_mailto (organizer.value),
- priv->delegator_name ?
- priv->delegator_name :
- priv->delegator_address);
- else
- html = g_strdup_printf (itip_desc, _("An unknown person"),
- priv->delegator_name ?
- priv->delegator_name :
- priv->delegator_address);
- } else {
- if (organizer.value != NULL)
- html = g_strdup_printf (itip_desc,
- organizer.cn ?
- organizer.cn :
- itip_strip_mailto (organizer.value));
- else
- html = g_strdup_printf (itip_desc, _("An unknown person"));
- }
-
- break;
-
- case ICAL_METHOD_PUBLISH:
- case ICAL_METHOD_ADD:
- case ICAL_METHOD_CANCEL:
- default:
- /* The organizer sent this */
- e_cal_component_get_organizer (priv->comp, &organizer);
- if (organizer.value != NULL)
- html = g_strdup_printf (itip_desc,
- organizer.cn ?
- organizer.cn :
- itip_strip_mailto (organizer.value));
- else
- html = g_strdup_printf (itip_desc, _("An unknown person"));
- break;
- }
- gtk_html_write (GTK_HTML (priv->html), html_stream, html, strlen(html));
- g_free (html);
-
- /* Describe what the user can do */
- const_html = _("<br> Please review the following information, "
- "and then select an action from the menu below.");
- gtk_html_write (GTK_HTML (priv->html), html_stream, const_html, strlen(const_html));
-
- /* Separator */
- gtk_html_write (GTK_HTML (priv->html), html_stream, HTML_SEP, strlen (HTML_SEP));
-
- /* Title */
- set_message (GTK_HTML (priv->html), html_stream, itip_title, FALSE);
-
- /* Date information */
- set_date_label (itip, GTK_HTML (priv->html), html_stream, priv->comp);
-
- /* Summary */
- e_cal_component_get_summary (priv->comp, &text);
- str = g_strdup_printf ("<i>%s:</i>", _("None"));
-
- html = text.value ? e_text_to_html_full (text.value, E_TEXT_TO_HTML_CONVERT_NL, 0) : str;
- gtk_html_stream_printf (html_stream, "<b>%s</b><br>%s<br><br>",
- _("Summary:"), html);
- g_free (str);
- if (text.value)
- g_free (html);
-
- /* Location */
- e_cal_component_get_location (priv->comp, &string);
- if (string != NULL) {
- html = e_text_to_html_full (string, E_TEXT_TO_HTML_CONVERT_NL, 0);
- gtk_html_stream_printf (html_stream, "<b>%s</b><br>%s<br><br>",
- _("Location:"), html);
- g_free (html);
- }
-
- /* Status */
- if (priv->method == ICAL_METHOD_REPLY) {
- GSList *alist;
-
- e_cal_component_get_attendee_list (priv->comp, &alist);
-
- if (alist != NULL) {
- ECalComponentAttendee *a = alist->data;
-
- gtk_html_stream_printf (html_stream, "<b>%s</b><br>",
- _("Status:"));
-
- switch (a->status) {
- case ICAL_PARTSTAT_ACCEPTED:
- gtk_html_stream_printf (html_stream, "%s<br><br>",
- _("Accepted"));
- break;
- case ICAL_PARTSTAT_TENTATIVE:
- gtk_html_stream_printf (html_stream, "%s<br><br>",
- _("Tentatively Accepted"));
- break;
- case ICAL_PARTSTAT_DECLINED:
- gtk_html_stream_printf (html_stream, "%s<br><br>",
- _("Declined"));
- break;
- default:
- gtk_html_stream_printf (html_stream, "%s<br><br>",
- _("Unknown"));
- }
- }
-
- e_cal_component_free_attendee_list (alist);
- }
-
- /* Description */
- e_cal_component_get_description_list (priv->comp, &l);
- if (l)
- text = *((ECalComponentText *)l->data);
-
- if (l && text.value) {
- html = e_text_to_html_full (text.value, E_TEXT_TO_HTML_CONVERT_NL, 0);
- gtk_html_stream_printf (html_stream, "<b>%s</b><br>%s",
- _("Description:"), html);
- g_free (html);
- }
- e_cal_component_free_text_list (l);
-
- /* Separator */
- gtk_html_write (GTK_HTML (priv->html), html_stream, HTML_SEP, strlen (HTML_SEP));
-
- /* Options */
- if (!e_itip_control_get_view_only (itip)) {
- if (options != NULL) {
- const_html = "</td></tr><tr><td valign=\"center\">";
- gtk_html_write (GTK_HTML (priv->html), html_stream, const_html, strlen (const_html));
- gtk_html_write (GTK_HTML (priv->html), html_stream, options, strlen (options));
- }
- }
-
- const_html = "</td></tr></table>";
- gtk_html_write (GTK_HTML (priv->html), html_stream, const_html, strlen(const_html));
-
- gtk_html_write (GTK_HTML (priv->html), html_stream,
- HTML_BODY_END, strlen(HTML_BODY_END));
- gtk_html_write (GTK_HTML (priv->html), html_stream,
- HTML_FOOTER, strlen(HTML_FOOTER));
-
- gtk_html_end (GTK_HTML (priv->html), html_stream, GTK_HTML_STREAM_OK);
-}
-
-
-static char*
-get_publish_options (void)
-{
- return g_strdup_printf ("<object classid=\"itip:publish_options\"></object>");
-}
-
-static char*
-get_request_options (void)
-{
- return g_strdup_printf ("<object classid=\"itip:request_options\"></object>");
-}
-
-static char*
-get_request_fb_options ()
-{
- return g_strdup_printf ("<object classid=\"itip:freebusy_options\"></object>");
-}
-
-static char*
-get_reply_options ()
-{
- return g_strdup_printf ("<object classid=\"itip:reply_options\"></object>");
-}
-
-static char*
-get_refresh_options ()
-{
- return g_strdup_printf ("<object classid=\"itip:refresh_options\"></object>");
-}
-
-static char*
-get_cancel_options (gboolean found, icalcomponent_kind kind)
-{
- if (!found) {
- switch (kind) {
- case ICAL_VEVENT_COMPONENT:
- return g_strdup_printf ("<i>%s</i>", _("The meeting has been cancelled, however it could not be found in your calendars"));
- case ICAL_VTODO_COMPONENT:
- return g_strdup_printf ("<i>%s</i>", _("The task has been cancelled, however it could not be found in your task lists"));
- default:
- g_assert_not_reached ();
- return NULL;
- }
- }
-
- return g_strdup_printf ("<object classid=\"itip:cancel_options\"></object>");
-}
-
-
-static ECalComponent *
-get_real_item (EItipControl *itip)
-{
- EItipControlPrivate *priv;
- ECalComponent *comp;
- icalcomponent *icalcomp;
- gboolean found = FALSE;
- const char *uid;
-
- priv = itip->priv;
-
- e_cal_component_get_uid (priv->comp, &uid);
-
- found = e_cal_get_object (priv->current_ecal, uid, NULL, &icalcomp, NULL);
- if (!found)
- return NULL;
-
- comp = e_cal_component_new ();
- if (!e_cal_component_set_icalcomponent (comp, icalcomp)) {
- g_object_unref (comp);
- icalcomponent_free (icalcomp);
- return NULL;
- }
-
- return comp;
-}
-
-static void
-adjust_item (EItipControl *itip, ECalComponent *comp)
-{
- ECalComponent *real_comp;
-
- real_comp = get_real_item (itip);
- if (real_comp != NULL) {
- ECalComponentText text;
- const char *string;
- GSList *l;
-
- e_cal_component_get_summary (real_comp, &text);
- e_cal_component_set_summary (comp, &text);
- e_cal_component_get_location (real_comp, &string);
- e_cal_component_set_location (comp, string);
- e_cal_component_get_description_list (real_comp, &l);
- e_cal_component_set_description_list (comp, l);
- e_cal_component_free_text_list (l);
-
- g_object_unref (real_comp);
- } else {
- ECalComponentText text = {_("Unknown"), NULL};
-
- e_cal_component_set_summary (comp, &text);
- }
-}
-
-static void
-show_current_event (EItipControl *itip)
-{
- EItipControlPrivate *priv;
- const gchar *itip_title, *itip_desc;
- char *options;
- gboolean show_selector = FALSE;
-
- priv = itip->priv;
-
- priv->type = E_CAL_SOURCE_TYPE_EVENT;
-
- switch (priv->method) {
- case ICAL_METHOD_PUBLISH:
- itip_desc = _("<b>%s</b> has published meeting information.");
- itip_title = _("Meeting Information");
- options = get_publish_options ();
- show_selector = TRUE;
- break;
- case ICAL_METHOD_REQUEST:
- if (priv->delegator_address != NULL)
- itip_desc = _("<b>%s</b> requests the presence of %s at a meeting.");
- else
- itip_desc = _("<b>%s</b> requests your presence at a meeting.");
- itip_title = _("Meeting Proposal");
- options = get_request_options ();
- show_selector = TRUE;
- break;
- case ICAL_METHOD_ADD:
- /* FIXME Whats going on here? */
- itip_desc = _("<b>%s</b> wishes to add to an existing meeting.");
- itip_title = _("Meeting Update");
- options = get_publish_options ();
- break;
- case ICAL_METHOD_REFRESH:
- itip_desc = _("<b>%s</b> wishes to receive the latest meeting information.");
- itip_title = _("Meeting Update Request");
- options = get_refresh_options ();
-
- /* Provide extra info, since its not in the component */
- adjust_item (itip, priv->comp);
- break;
- case ICAL_METHOD_REPLY:
- itip_desc = _("<b>%s</b> has replied to a meeting request.");
- itip_title = _("Meeting Reply");
- options = get_reply_options ();
-
- /* Provide extra info, since might not be in the component */
- adjust_item (itip, priv->comp);
- break;
- case ICAL_METHOD_CANCEL:
- itip_desc = _("<b>%s</b> has cancelled a meeting.");
- itip_title = _("Meeting Cancellation");
- /* FIXME priv->current_ecal will always be NULL so the
- * user won't see an error message, the OK button will
- * just be de-sensitized */
- options = get_cancel_options (TRUE, ICAL_VEVENT_COMPONENT);
-
- /* Provide extra info, since might not be in the component */
- adjust_item (itip, priv->comp);
- break;
- default:
- itip_desc = _("<b>%s</b> has sent an unintelligible message.");
- itip_title = _("Bad Meeting Message");
- options = NULL;
- }
-
- write_html (itip, itip_desc, itip_title, options);
- g_free (options);
-
- if (priv->calendar_uid)
- priv->current_ecal = start_calendar_server_by_uid (itip, priv->calendar_uid, priv->type);
- else
- find_server (itip, priv->comp, show_selector);
-}
-
-static void
-show_current_todo (EItipControl *itip)
-{
- EItipControlPrivate *priv;
- const gchar *itip_title, *itip_desc;
- char *options;
- gboolean show_selector = FALSE;
-
- priv = itip->priv;
-
- priv->type = E_CAL_SOURCE_TYPE_TODO;
-
- switch (priv->method) {
- case ICAL_METHOD_PUBLISH:
- itip_desc = _("<b>%s</b> has published task information.");
- itip_title = _("Task Information");
- options = get_publish_options ();
- show_selector = TRUE;
- break;
- case ICAL_METHOD_REQUEST:
- /* FIXME Does this need to handle like events above? */
- if (priv->delegator_address != NULL)
- itip_desc = _("<b>%s</b> requests %s to perform a task.");
- else
- itip_desc = _("<b>%s</b> requests you perform a task.");
- itip_title = _("Task Proposal");
- options = get_request_options ();
- show_selector = TRUE;
- break;
- case ICAL_METHOD_ADD:
- /* FIXME Whats going on here? */
- itip_desc = _("<b>%s</b> wishes to add to an existing task.");
- itip_title = _("Task Update");
- options = get_publish_options ();
- break;
- case ICAL_METHOD_REFRESH:
- itip_desc = _("<b>%s</b> wishes to receive the latest task information.");
- itip_title = _("Task Update Request");
- options = get_refresh_options ();
-
- /* Provide extra info, since its not in the component */
- adjust_item (itip, priv->comp);
- break;
- case ICAL_METHOD_REPLY:
- itip_desc = _("<b>%s</b> has replied to a task assignment.");
- itip_title = _("Task Reply");
- options = get_reply_options ();
-
- /* Provide extra info, since might not be in the component */
- adjust_item (itip, priv->comp);
- break;
- case ICAL_METHOD_CANCEL:
- itip_desc = _("<b>%s</b> has cancelled a task.");
- itip_title = _("Task Cancellation");
- /* FIXME priv->current_ecal will always be NULL so the
- * user won't see an error message, the OK button will
- * just be de-sensitized */
- options = get_cancel_options (TRUE, ICAL_VTODO_COMPONENT);
-
- /* Provide extra info, since might not be in the component */
- adjust_item (itip, priv->comp);
- break;
- default:
- itip_desc = _("<b>%s</b> has sent an unintelligible message.");
- itip_title = _("Bad Task Message");
- options = NULL;
- }
-
- write_html (itip, itip_desc, itip_title, options);
- g_free (options);
-
- if (priv->calendar_uid)
- priv->current_ecal = start_calendar_server_by_uid (itip, priv->calendar_uid, priv->type);
- else
- find_server (itip, priv->comp, show_selector);
-}
-
-static void
-show_current_freebusy (EItipControl *itip)
-{
- EItipControlPrivate *priv;
- const gchar *itip_title, *itip_desc;
- char *options;
-
- priv = itip->priv;
-
- switch (priv->method) {
- case ICAL_METHOD_PUBLISH:
- itip_desc = _("<b>%s</b> has published free/busy information.");
- itip_title = _("Free/Busy Information");
- options = NULL;
- break;
- case ICAL_METHOD_REQUEST:
- itip_desc = _("<b>%s</b> requests your free/busy information.");
- itip_title = _("Free/Busy Request");
- options = get_request_fb_options ();
- break;
- case ICAL_METHOD_REPLY:
- itip_desc = _("<b>%s</b> has replied to a free/busy request.");
- itip_title = _("Free/Busy Reply");
- options = NULL;
- break;
- default:
- itip_desc = _("<b>%s</b> has sent an unintelligible message.");
- itip_title = _("Bad Free/Busy Message");
- options = NULL;
- }
-
- write_html (itip, itip_desc, itip_title, options);
- g_free (options);
-}
-
-static icalcomponent *
-get_next (icalcompiter *iter)
-{
- icalcomponent *ret = NULL;
- icalcomponent_kind kind;
-
- do {
- icalcompiter_next (iter);
- ret = icalcompiter_deref (iter);
- if (ret == NULL)
- break;
- kind = icalcomponent_isa (ret);
- } while (ret != NULL
- && kind != ICAL_VEVENT_COMPONENT
- && kind != ICAL_VTODO_COMPONENT
- && kind != ICAL_VFREEBUSY_COMPONENT);
-
- return ret;
-}
-
-static void
-show_current (EItipControl *itip)
-{
- EItipControlPrivate *priv;
- ECalComponentVType type;
- icalcomponent *alarm_comp;
- icalcompiter alarm_iter;
- icalproperty *prop;
-
- priv = itip->priv;
-
- g_object_ref (itip);
-
- if (priv->comp)
- g_object_unref (priv->comp);
- priv->current_ecal = NULL;
-
- /* Determine any delegate sections */
- prop = icalcomponent_get_first_property (priv->ical_comp, ICAL_X_PROPERTY);
- while (prop) {
- const char *x_name, *x_val;
-
- x_name = icalproperty_get_x_name (prop);
- x_val = icalproperty_get_x (prop);
-
- if (!strcmp (x_name, "X-EVOLUTION-DELEGATOR-CALENDAR-UID"))
- e_itip_control_set_calendar_uid (itip, x_val);
- else if (!strcmp (x_name, "X-EVOLUTION-DELEGATOR-CALENDAR-URI"))
- g_warning (G_STRLOC ": X-EVOLUTION-DELEGATOR-CALENDAR-URI used");
- else if (!strcmp (x_name, "X-EVOLUTION-DELEGATOR-ADDRESS"))
- e_itip_control_set_delegator_address (itip, x_val);
- else if (!strcmp (x_name, "X-EVOLUTION-DELEGATOR-NAME"))
- e_itip_control_set_delegator_name (itip, x_val);
-
- prop = icalcomponent_get_next_property (priv->ical_comp, ICAL_X_PROPERTY);
- }
-
- /* Strip out alarms for security purposes */
- alarm_iter = icalcomponent_begin_component (priv->ical_comp, ICAL_VALARM_COMPONENT);
- while ((alarm_comp = icalcompiter_deref (&alarm_iter)) != NULL) {
- icalcomponent_remove_component (priv->ical_comp, alarm_comp);
-
- icalcompiter_next (&alarm_iter);
- }
-
- priv->comp = e_cal_component_new ();
- if (!e_cal_component_set_icalcomponent (priv->comp, priv->ical_comp)) {
- write_error_html (itip, _("The message does not appear to be properly formed"));
- g_object_unref (priv->comp);
- priv->comp = NULL;
- g_object_unref (itip);
- return;
- };
-
- /* Add default reminder if the config says so */
- if (calendar_config_get_use_default_reminder ()) {
- ECalComponentAlarm *acomp;
- int interval;
- CalUnits units;
- ECalComponentAlarmTrigger trigger;
-
- interval = calendar_config_get_default_reminder_interval ();
- units = calendar_config_get_default_reminder_units ();
-
- acomp = e_cal_component_alarm_new ();
-
- e_cal_component_alarm_set_action (acomp, E_CAL_COMPONENT_ALARM_DISPLAY);
-
- trigger.type = E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START;
- memset (&trigger.u.rel_duration, 0, sizeof (trigger.u.rel_duration));
-
- trigger.u.rel_duration.is_neg = TRUE;
-
- switch (units) {
- case CAL_MINUTES:
- trigger.u.rel_duration.minutes = interval;
- break;
- case CAL_HOURS:
- trigger.u.rel_duration.hours = interval;
- break;
- case CAL_DAYS:
- trigger.u.rel_duration.days = interval;
- break;
- default:
- g_assert_not_reached ();
- }
-
- e_cal_component_alarm_set_trigger (acomp, trigger);
- e_cal_component_add_alarm (priv->comp, acomp);
-
- e_cal_component_alarm_free (acomp);
- }
-
- type = e_cal_component_get_vtype (priv->comp);
-
- switch (type) {
- case E_CAL_COMPONENT_EVENT:
- show_current_event (itip);
- break;
- case E_CAL_COMPONENT_TODO:
- show_current_todo (itip);
- break;
- case E_CAL_COMPONENT_FREEBUSY:
- show_current_freebusy (itip);
- break;
- default:
- write_error_html (itip, _("The message contains only unsupported requests."));
- }
-
- find_my_address (itip, priv->ical_comp, NULL);
-
- g_object_unref (itip);
-}
-
-void
-e_itip_control_set_data (EItipControl *itip, const gchar *text)
-{
- EItipControlPrivate *priv;
- icalproperty *prop;
- icalcomponent_kind kind = ICAL_NO_COMPONENT;
- icalcomponent *tz_comp;
- icalcompiter tz_iter;
-
- priv = itip->priv;
- if (priv == NULL)
- return;
-
- clean_up (itip);
-
- if (text == NULL || *text == '\0') {
- gtk_html_load_from_string (GTK_HTML (priv->html), " ", 1);
- return;
- }
-
- priv->vcalendar = g_strdup (text);
- priv->top_level = e_cal_util_new_top_level ();
-
- priv->main_comp = icalparser_parse_string (priv->vcalendar);
- if (priv->main_comp == NULL) {
- write_error_html (itip, _("The attachment does not contain a valid calendar message"));
- return;
- }
-
- prop = icalcomponent_get_first_property (priv->main_comp, ICAL_METHOD_PROPERTY);
- if (prop == NULL) {
- priv->method = ICAL_METHOD_PUBLISH;
- } else {
- priv->method = icalproperty_get_method (prop);
- }
-
- tz_iter = icalcomponent_begin_component (priv->main_comp, ICAL_VTIMEZONE_COMPONENT);
- while ((tz_comp = icalcompiter_deref (&tz_iter)) != NULL) {
- icalcomponent *clone;
-
- clone = icalcomponent_new_clone (tz_comp);
- icalcomponent_add_component (priv->top_level, clone);
-
- icalcompiter_next (&tz_iter);
- }
-
- priv->iter = icalcomponent_begin_component (priv->main_comp, ICAL_ANY_COMPONENT);
- priv->ical_comp = icalcompiter_deref (&priv->iter);
- if (priv->ical_comp != NULL) {
- kind = icalcomponent_isa (priv->ical_comp);
- if (kind != ICAL_VEVENT_COMPONENT
- && kind != ICAL_VTODO_COMPONENT
- && kind != ICAL_VFREEBUSY_COMPONENT)
- priv->ical_comp = get_next (&priv->iter);
- }
-
- if (priv->ical_comp == NULL) {
- write_error_html (itip, _("The attachment has no viewable calendar items"));
- return;
- }
-
- priv->total = icalcomponent_count_components (priv->main_comp, ICAL_VEVENT_COMPONENT);
- priv->total += icalcomponent_count_components (priv->main_comp, ICAL_VTODO_COMPONENT);
- priv->total += icalcomponent_count_components (priv->main_comp, ICAL_VFREEBUSY_COMPONENT);
-
- if (priv->total > 0)
- priv->current = 1;
- else
- priv->current = 0;
-
- show_current (itip);
-}
-
-gchar *
-e_itip_control_get_data (EItipControl *itip)
-{
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- return g_strdup (priv->vcalendar);
-}
-
-gint
-e_itip_control_get_data_size (EItipControl *itip)
-{
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- if (priv->vcalendar == NULL)
- return 0;
-
- return strlen (priv->vcalendar);
-}
-
-void
-e_itip_control_set_from_address (EItipControl *itip, const gchar *address)
-{
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- if (priv->from_address)
- g_free (priv->from_address);
-
- priv->from_address = g_strdup (address);
-}
-
-const gchar *
-e_itip_control_get_from_address (EItipControl *itip)
-{
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- return priv->from_address;
-}
-
-void
-e_itip_control_set_view_only (EItipControl *itip, gint view_only)
-{
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- priv->view_only = view_only;
-}
-
-gint
-e_itip_control_get_view_only (EItipControl *itip)
-{
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- return priv->view_only;
-}
-
-
-void
-e_itip_control_set_delegator_address (EItipControl *itip, const gchar *address)
-{
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- if (priv->delegator_address)
- g_free (priv->delegator_address);
-
- priv->delegator_address = g_strdup (address);
-}
-
-const gchar *
-e_itip_control_get_delegator_address (EItipControl *itip)
-{
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- return priv->delegator_address;
-}
-
-
-void
-e_itip_control_set_delegator_name (EItipControl *itip, const gchar *name)
-{
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- if (priv->delegator_name)
- g_free (priv->delegator_name);
-
- priv->delegator_name = g_strdup (name);
-}
-
-const gchar *
-e_itip_control_get_delegator_name (EItipControl *itip)
-{
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- return priv->delegator_name;
-}
-
-void
-e_itip_control_set_calendar_uid (EItipControl *itip, const gchar *uri)
-{
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- if (priv->calendar_uid)
- g_free (priv->calendar_uid);
-
- priv->calendar_uid = g_strdup (uri);
-}
-
-const gchar *
-e_itip_control_get_calendar_uid (EItipControl *itip)
-{
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- return priv->calendar_uid;
-}
-
-
-static gboolean
-change_status (icalcomponent *ical_comp, const char *address, icalparameter_partstat status)
-{
- icalproperty *prop;
-
- prop = find_attendee (ical_comp, address);
- if (prop) {
- icalparameter *param;
-
- icalproperty_remove_parameter (prop, ICAL_PARTSTAT_PARAMETER);
- param = icalparameter_new_partstat (status);
- icalproperty_add_parameter (prop, param);
- } else {
- icalparameter *param;
-
- if (address != NULL) {
- prop = icalproperty_new_attendee (address);
- icalcomponent_add_property (ical_comp, prop);
-
- param = icalparameter_new_role (ICAL_ROLE_OPTPARTICIPANT);
- icalproperty_add_parameter (prop, param);
-
- param = icalparameter_new_partstat (status);
- icalproperty_add_parameter (prop, param);
- } else {
- EAccount *a;
-
- a = itip_addresses_get_default ();
-
- prop = icalproperty_new_attendee (a->id->address);
- icalcomponent_add_property (ical_comp, prop);
-
- param = icalparameter_new_cn (a->id->name);
- icalproperty_add_parameter (prop, param);
-
- param = icalparameter_new_role (ICAL_ROLE_REQPARTICIPANT);
- icalproperty_add_parameter (prop, param);
-
- param = icalparameter_new_partstat (status);
- icalproperty_add_parameter (prop, param);
- }
- }
-
- return TRUE;
-}
-
-static void
-update_item (EItipControl *itip)
-{
- EItipControlPrivate *priv;
- struct icaltimetype stamp;
- icalproperty *prop;
- icalcomponent *clone;
- GtkWidget *dialog;
- GError *error = NULL;
-
- priv = itip->priv;
-
- /* Set X-MICROSOFT-CDO-REPLYTIME to record the time at which
- * the user accepted/declined the request. (Outlook ignores
- * SEQUENCE in REPLY reponses and instead requires that each
- * updated response have a later REPLYTIME than the previous
- * one.) This also ends up getting saved in our own copy of
- * the meeting, though there's currently no way to see that
- * information (unless it's being saved to an Exchange folder
- * and you then look at it in Outlook).
- */
- stamp = icaltime_current_time_with_zone (icaltimezone_get_utc_timezone ());
- prop = icalproperty_new_x (icaltime_as_ical_string (stamp));
- icalproperty_set_x_name (prop, "X-MICROSOFT-CDO-REPLYTIME");
- icalcomponent_add_property (priv->ical_comp, prop);
-
- clone = icalcomponent_new_clone (priv->ical_comp);
- icalcomponent_add_component (priv->top_level, clone);
- icalcomponent_set_method (priv->top_level, priv->method);
-
- if (!e_cal_receive_objects (priv->current_ecal, priv->top_level, &error)) {
- dialog = gnome_warning_dialog (error->message);
- g_error_free (error);
- } else {
- dialog = gnome_ok_dialog (_("Update complete\n"));
- }
- gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
-
- icalcomponent_remove_component (priv->top_level, clone);
-}
-
-static void
-update_attendee_status (EItipControl *itip)
-{
- EItipControlPrivate *priv;
- ECalComponent *comp = NULL;
- icalcomponent *icalcomp = NULL;
- const char *uid;
- GtkWidget *dialog;
- GError *error;
-
- priv = itip->priv;
-
- /* Obtain our version */
- e_cal_component_get_uid (priv->comp, &uid);
- if (e_cal_get_object (priv->current_ecal, uid, NULL, &icalcomp, NULL)) {
- GSList *attendees;
-
- comp = e_cal_component_new ();
- if (!e_cal_component_set_icalcomponent (comp, icalcomp)) {
- icalcomponent_free (icalcomp);
-
- dialog = gnome_warning_dialog (_("Object is invalid and cannot be updated\n"));
- } else {
- e_cal_component_get_attendee_list (priv->comp, &attendees);
- if (attendees != NULL) {
- ECalComponentAttendee *a = attendees->data;
- icalproperty *prop;
-
- prop = find_attendee (icalcomp, itip_strip_mailto (a->value));
-
- if (prop == NULL) {
- dialog = gnome_question_dialog_modal (_("This response is not from a current "
- "attendee. Add as an attendee?"),
- NULL, NULL);
- if (gnome_dialog_run_and_close (GNOME_DIALOG (dialog)) == GNOME_YES) {
- change_status (icalcomp,
- itip_strip_mailto (a->value),
- a->status);
- e_cal_component_rescan (comp);
- } else {
- goto cleanup;
- }
- } else if (a->status == ICAL_PARTSTAT_NONE || a->status == ICAL_PARTSTAT_X) {
- dialog = gnome_warning_dialog (_("Attendee status could "
- "not be updated because "
- "of an invalid status!\n"));
- goto cleanup;
- } else {
- change_status (icalcomp,
- itip_strip_mailto (a->value),
- a->status);
- e_cal_component_rescan (comp);
- }
- }
- }
-
- if (!e_cal_modify_object (priv->current_ecal, icalcomp, CALOBJ_MOD_ALL, &error)) {
- dialog = gnome_warning_dialog (error->message);
- g_error_free (error);
- } else {
- dialog = gnome_ok_dialog (_("Attendee status updated\n"));
- }
- } else {
- dialog = gnome_warning_dialog (_("Attendee status can not be updated "
- "because the item no longer exists"));
- }
-
- cleanup:
- if (comp != NULL)
- g_object_unref (comp);
- gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
-}
-
-static void
-remove_item (EItipControl *itip)
-{
- EItipControlPrivate *priv;
- const char *uid;
- GtkWidget *dialog;
- GError *error = NULL;
-
- priv = itip->priv;
-
- /* FIXME Is this check necessary? */
- if (!priv->current_ecal)
- return;
-
- e_cal_component_get_uid (priv->comp, &uid);
- e_cal_remove_object (priv->current_ecal, uid, &error);
- if (!error || error->code == E_CALENDAR_STATUS_OBJECT_NOT_FOUND) {
- dialog = gnome_ok_dialog (_("Removal Complete"));
- gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
- } else {
- delete_error_dialog (error, e_cal_component_get_vtype (priv->comp));
- }
-
- g_clear_error (&error);
-}
-
-static void
-send_item (EItipControl *itip)
-{
- EItipControlPrivate *priv;
- ECalComponent *comp;
- GtkWidget *dialog;
-
- priv = itip->priv;
-
- comp = get_real_item (itip);
-
- if (comp != NULL) {
- itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, priv->current_ecal, NULL, NULL);
- g_object_unref (comp);
- dialog = gnome_ok_dialog (_("Item sent!\n"));
- } else {
- dialog = gnome_warning_dialog (_("The item could not be sent!\n"));
- }
- gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
-}
-
-static void
-send_freebusy (EItipControl *itip)
-{
- EItipControlPrivate *priv;
- ECalComponentDateTime datetime;
- time_t start, end;
- GtkWidget *dialog;
- GList *comp_list = NULL;
- icaltimezone *zone;
-
- priv = itip->priv;
-
- e_cal_component_get_dtstart (priv->comp, &datetime);
- if (datetime.tzid) {
- zone = icalcomponent_get_timezone (priv->top_level,
- datetime.tzid);
- } else {
- zone = NULL;
- }
- start = icaltime_as_timet_with_zone (*datetime.value, zone);
- e_cal_component_free_datetime (&datetime);
-
- e_cal_component_get_dtend (priv->comp, &datetime);
- if (datetime.tzid) {
- zone = icalcomponent_get_timezone (priv->top_level,
- datetime.tzid);
- } else {
- zone = NULL;
- }
- end = icaltime_as_timet_with_zone (*datetime.value, zone);
- e_cal_component_free_datetime (&datetime);
-
- if (e_cal_get_free_busy (priv->current_ecal, NULL, start, end, &comp_list, NULL)) {
- GList *l;
-
- for (l = comp_list; l; l = l->next) {
- ECalComponent *comp = E_CAL_COMPONENT (l->data);
- itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, priv->current_ecal, NULL, NULL);
-
- g_object_unref (comp);
- }
- dialog = gnome_ok_dialog (_("Item sent!\n"));
-
- g_list_free (comp_list);
- } else {
- dialog = gnome_warning_dialog (_("The item could not be sent!\n"));
- }
- gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
-}
-
-static void
-url_requested_cb (GtkHTML *html, const gchar *url, GtkHTMLStream *handle, gpointer data)
-{ unsigned char buffer[4096];
- int len, fd;
-
- if ((fd = open (url, O_RDONLY)) == -1) {
- g_warning ("%s", g_strerror (errno));
- return;
- }
-
- while ((len = read (fd, buffer, 4096)) > 0) {
- gtk_html_write (html, handle, buffer, len);
- }
-
- if (len < 0) {
- /* check to see if we stopped because of an error */
- gtk_html_end (html, handle, GTK_HTML_STREAM_ERROR);
- g_warning ("%s", g_strerror (errno));
- return;
- }
- /* done with no errors */
- gtk_html_end (html, handle, GTK_HTML_STREAM_OK);
- close (fd);
-}
-
-static void
-option_activated_cb (GtkWidget *widget, gpointer data)
-{
- EItipControl *itip = E_ITIP_CONTROL (data);
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- priv->action = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), ACTION_DATA));
-}
-
-static void
-add_option (EItipControl *itip, GtkWidget *menu, const char *text, char action)
-{
- GtkWidget *item;
-
- item = gtk_menu_item_new_with_label (text);
- g_signal_connect (item, "activate", G_CALLBACK (option_activated_cb), itip);
- g_object_set_data (G_OBJECT (item), ACTION_DATA, GINT_TO_POINTER ((int)action));
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
-
-}
-
-static void
-insert_boxes (GtkHTMLEmbedded *eb, EItipControl *itip)
-{
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- priv->vbox = gtk_vbox_new (FALSE, 12);
- g_object_add_weak_pointer (G_OBJECT (priv->vbox), ((gpointer *)&priv->vbox));
-
- gtk_container_add (GTK_CONTAINER (eb), priv->vbox);
- gtk_widget_show (priv->vbox);
-
- priv->hbox = gtk_hbox_new (FALSE, 6);
- g_object_add_weak_pointer (G_OBJECT (priv->hbox), ((gpointer *)&priv->hbox));
-
- gtk_box_pack_start (GTK_BOX (priv->vbox), priv->hbox, FALSE, TRUE, 0);
- gtk_widget_show (priv->hbox);
-}
-
-static void
-insert_label (GtkWidget *hbox)
-{
- GtkWidget *label;
- char *text;
-
- text = g_strdup_printf ("<b>%s</b>", _("Choose an action:"));
- label = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL (label), text);
- g_free (text);
-
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
- gtk_widget_show (label);
-}
-
-static void
-rsvp_clicked_cb (GtkWidget *widget, gpointer data)
-{
- EItipControl *itip = E_ITIP_CONTROL (data);
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- priv->rsvp = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
-}
-
-static void
-insert_rsvp (GtkWidget *hbox, EItipControl *itip)
-{
- EItipControlPrivate *priv;
- GtkWidget *btn;
-
- priv = itip->priv;
-
- btn = gtk_check_button_new_with_label ("RSVP");
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (btn), TRUE);
- priv->rsvp = TRUE;
-
- g_signal_connect (btn, "clicked", G_CALLBACK (rsvp_clicked_cb), itip);
-
- gtk_box_pack_start (GTK_BOX (hbox), btn, FALSE, TRUE, 0);
- gtk_widget_show (btn);
-}
-
-static void
-insert_ok (GtkWidget *hbox, EItipControl *itip)
-{
- EItipControlPrivate *priv;
-
- priv = itip->priv;
-
- priv->ok = gtk_button_new_from_stock (GTK_STOCK_OK);
- g_object_add_weak_pointer (G_OBJECT (priv->ok), ((gpointer *)&priv->ok));
-
- g_signal_connect (priv->ok, "clicked", G_CALLBACK (ok_clicked_cb), itip);
-
- set_ok_sens (itip);
-
- gtk_box_pack_start (GTK_BOX (hbox), priv->ok, FALSE, TRUE, 0);
- gtk_widget_show (priv->ok);
-}
-
-static gboolean
-publish_options_object (EItipControl *itip, GtkHTML *html, GtkHTMLEmbedded *eb)
-{
- EItipControlPrivate *priv;
- GtkWidget *option, *menu;
-
- priv = itip->priv;
-
- insert_boxes (eb, itip);
- insert_label (priv->hbox);
-
- option = gtk_option_menu_new ();
-
- menu = gtk_menu_new ();
-
- add_option (itip, menu, _("Update"), 'U');
- priv->action = 'U';
-
- gtk_option_menu_set_menu (GTK_OPTION_MENU (option), menu);
-
- gtk_box_pack_start (GTK_BOX (priv->hbox), option, FALSE, TRUE, 0);
- gtk_widget_show (option);
-
- insert_ok (priv->hbox, itip);
-
- return TRUE;
-}
-
-static gboolean
-request_options_object (EItipControl *itip, GtkHTML *html, GtkHTMLEmbedded *eb)
-{
- EItipControlPrivate *priv;
- GtkWidget *option, *menu;
-
- priv = itip->priv;
-
- insert_boxes (eb, itip);
- insert_label (priv->hbox);
-
- option = gtk_option_menu_new ();
-
- menu = gtk_menu_new ();
-
- add_option (itip, menu, _("Accept"), 'A');
- add_option (itip, menu, _("Tentatively accept"), 'T');
- add_option (itip, menu, _("Decline"), 'D');
- priv->action = 'A';
-
- gtk_option_menu_set_menu (GTK_OPTION_MENU (option), menu);
-
- gtk_box_pack_start (GTK_BOX (priv->hbox), option, FALSE, TRUE, 0);
- gtk_widget_show (option);
-
- insert_rsvp (priv->hbox, itip);
- insert_ok (priv->hbox, itip);
-
- return TRUE;
-}
-
-static gboolean
-freebusy_options_object (EItipControl *itip, GtkHTML *html, GtkHTMLEmbedded *eb)
-{
- EItipControlPrivate *priv;
- GtkWidget *option, *menu;
-
- priv = itip->priv;
-
- insert_boxes (eb, itip);
- insert_label (priv->hbox);
-
- option = gtk_option_menu_new ();
-
- menu = gtk_menu_new ();
-
- add_option (itip, menu, _("Send Free/Busy Information"), 'F');
- priv->action = 'F';
-
- gtk_option_menu_set_menu (GTK_OPTION_MENU (option), menu);
-
- gtk_container_add (GTK_CONTAINER (priv->hbox), option);
- gtk_widget_show (option);
-
- insert_ok (priv->hbox, itip);
-
- return TRUE;
-}
-
-static gboolean
-reply_options_object (EItipControl *itip, GtkHTML *html, GtkHTMLEmbedded *eb)
-{
- EItipControlPrivate *priv;
- GtkWidget *option, *menu;
-
- priv = itip->priv;
-
- insert_boxes (eb, itip);
- insert_label (priv->hbox);
-
- option = gtk_option_menu_new ();
-
- menu = gtk_menu_new ();
-
- add_option (itip, menu, _("Update respondent status"), 'R');
- priv->action = 'R';
-
- gtk_option_menu_set_menu (GTK_OPTION_MENU (option), menu);
-
- gtk_container_add (GTK_CONTAINER (priv->hbox), option);
- gtk_widget_show (option);
-
- insert_ok (priv->hbox, itip);
-
- return TRUE;
-}
-
-static gboolean
-refresh_options_object (EItipControl *itip, GtkHTML *html, GtkHTMLEmbedded *eb)
-{
- EItipControlPrivate *priv;
- GtkWidget *option, *menu;
-
- priv = itip->priv;
-
- insert_boxes (eb, itip);
- insert_label (priv->hbox);
-
- option = gtk_option_menu_new ();
-
- menu = gtk_menu_new ();
-
- add_option (itip, menu, _("Send Latest Information"), 'S');
- priv->action = 'R';
-
- gtk_option_menu_set_menu (GTK_OPTION_MENU (option), menu);
-
- gtk_container_add (GTK_CONTAINER (priv->hbox), option);
- gtk_widget_show (option);
-
- insert_ok (priv->hbox, itip);
-
- return TRUE;
-}
-
-static gboolean
-cancel_options_object (EItipControl *itip, GtkHTML *html, GtkHTMLEmbedded *eb)
-{
- EItipControlPrivate *priv;
- GtkWidget *option, *menu;
-
- priv = itip->priv;
-
- insert_boxes (eb, itip);
- insert_label (priv->hbox);
-
- option = gtk_option_menu_new ();
-
- menu = gtk_menu_new ();
-
- add_option (itip, menu, _("Cancel"), 'C');
- priv->action = 'C';
-
- gtk_option_menu_set_menu (GTK_OPTION_MENU (option), menu);
-
- gtk_container_add (GTK_CONTAINER (priv->hbox), option);
- gtk_widget_show (option);
-
- insert_ok (priv->hbox, itip);
-
- return TRUE;
-}
-
-static gboolean
-object_requested_cb (GtkHTML *html, GtkHTMLEmbedded *eb, gpointer data)
-{
- EItipControl *itip = E_ITIP_CONTROL (data);
-
- if (!strcmp (eb->classid, "itip:publish_options"))
- return publish_options_object (itip, html, eb);
- else if (!strcmp (eb->classid, "itip:request_options"))
- return request_options_object (itip, html, eb);
- else if (!strcmp (eb->classid, "itip:freebusy_options"))
- return freebusy_options_object (itip, html, eb);
- else if (!strcmp (eb->classid, "itip:reply_options"))
- return reply_options_object (itip, html, eb);
- else if (!strcmp (eb->classid, "itip:refresh_options"))
- return refresh_options_object (itip, html, eb);
- else if (!strcmp (eb->classid, "itip:cancel_options"))
- return cancel_options_object (itip, html, eb);
-
- return FALSE;
-}
-
-static void
-ok_clicked_cb (GtkWidget *widget, gpointer data)
-{
- EItipControl *itip = E_ITIP_CONTROL (data);
- EItipControlPrivate *priv;
- gboolean status = FALSE;
-
- priv = itip->priv;
-
- if (!priv->my_address && priv->current_ecal != NULL)
- e_cal_get_cal_address (priv->current_ecal, &priv->my_address, NULL);
-
- switch (priv->action) {
- case 'U':
- update_item (itip);
- break;
- case 'A':
- status = change_status (priv->ical_comp, priv->my_address,
- ICAL_PARTSTAT_ACCEPTED);
- if (status) {
- e_cal_component_rescan (priv->comp);
- update_item (itip);
- }
- break;
- case 'T':
- status = change_status (priv->ical_comp, priv->my_address,
- ICAL_PARTSTAT_TENTATIVE);
- if (status) {
- e_cal_component_rescan (priv->comp);
- update_item (itip);
- }
- break;
- case 'D':
- status = change_status (priv->ical_comp, priv->my_address,
- ICAL_PARTSTAT_DECLINED);
- if (status) {
- e_cal_component_rescan (priv->comp);
- update_item (itip);
- }
- break;
- case 'F':
- send_freebusy (itip);
- break;
- case 'R':
- update_attendee_status (itip);
- break;
- case 'S':
- send_item (itip);
- break;
- case 'C':
- update_item (itip);
- break;
- }
-
- if (e_cal_get_save_schedules (priv->current_ecal))
- return;
-
- if (priv->rsvp && status) {
- ECalComponent *comp = NULL;
- ECalComponentVType vtype;
- icalcomponent *ical_comp;
- icalproperty *prop;
- icalvalue *value;
- const char *attendee;
- GSList *l, *list = NULL;
-
- comp = e_cal_component_clone (priv->comp);
- if (comp == NULL)
- return;
- vtype = e_cal_component_get_vtype (comp);
-
- if (priv->my_address == NULL)
- find_my_address (itip, priv->ical_comp, NULL);
- g_assert (priv->my_address != NULL);
-
- ical_comp = e_cal_component_get_icalcomponent (comp);
-
- for (prop = icalcomponent_get_first_property (ical_comp, ICAL_ATTENDEE_PROPERTY);
- prop != NULL;
- prop = icalcomponent_get_next_property (ical_comp, ICAL_ATTENDEE_PROPERTY))
- {
- char *text;
-
- value = icalproperty_get_value (prop);
- if (!value)
- continue;
-
- attendee = icalvalue_get_string (value);
-
- text = g_strdup (itip_strip_mailto (attendee));
- text = g_strstrip (text);
- if (g_strcasecmp (priv->my_address, text))
- list = g_slist_prepend (list, prop);
- g_free (text);
- }
-
- for (l = list; l; l = l->next) {
- prop = l->data;
- icalcomponent_remove_property (ical_comp, prop);
- icalproperty_free (prop);
- }
- g_slist_free (list);
-
- e_cal_component_rescan (comp);
- itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, priv->current_ecal, priv->top_level, NULL);
-
- g_object_unref (comp);
- }
-}
diff --git a/calendar/gui/e-itip-control.glade b/calendar/gui/e-itip-control.glade
deleted file mode 100644
index 344bcdeced..0000000000
--- a/calendar/gui/e-itip-control.glade
+++ /dev/null
@@ -1,493 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd" >
-
-<glade-interface>
- <widget class="GtkWindow" id="window1">
- <property name="visible">no</property>
- <property name="title" translatable="yes">window1</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="modal">no</property>
- <property name="allow_shrink">no</property>
- <property name="allow_grow">yes</property>
- <property name="window-position">GTK_WIN_POS_NONE</property>
-
- <child>
- <widget class="GtkFrame" id="main_frame">
- <property name="border_width">4</property>
- <property name="label" translatable="yes">Calendar Message</property>
- <property name="label_xalign">0</property>
- <property name="shadow">GTK_SHADOW_ETCHED_IN</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow1">
- <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
- <property name="vscrollbar_policy">GTK_POLICY_NEVER</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkViewport" id="viewport1">
- <property name="shadow_type">GTK_SHADOW_NONE</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkVBox" id="vbox1">
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkTable" id="table1">
- <property name="border_width">3</property>
- <property name="homogeneous">no</property>
- <property name="row_spacing">3</property>
- <property name="column_spacing">3</property>
- <property name="n-rows">4</property>
- <property name="n-columns">2</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkEntry" id="organizer_entry">
- <property name="can_focus">yes</property>
- <property name="editable">no</property>
- <property name="text" translatable="yes"></property>
- <property name="max-length">0</property>
- <property name="visibility">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">expand|fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="summary_entry">
- <property name="can_focus">yes</property>
- <property name="editable">no</property>
- <property name="text" translatable="yes"></property>
- <property name="max-length">0</property>
- <property name="visibility">yes</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">expand|fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow2">
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkTextView" id="description_box">
- <property name="can_focus">yes</property>
- <property name="editable">no</property>
- <property name="text" translatable="yes"></property>
- <property name="wrap_mode">GTK_WRAP_WORD</property>
- <property name="visible">yes</property>
- </widget>
- </child>
-
- <child internal-child="hscrollbar">
- <widget class="GtkHScrollbar" id="convertwidget3">
- <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
- <property name="visible">yes</property>
- </widget>
- </child>
-
- <child internal-child="vscrollbar">
- <widget class="GtkVScrollbar" id="convertwidget4">
- <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
- <property name="visible">yes</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkAlignment" id="alignment1">
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="xscale">1</property>
- <property name="yscale">1</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkHBox" id="hbox1">
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="dtstart_label">
- <property name="label" translatable="yes">date-start</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="label" translatable="yes">--to--</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0</property>
- <property name="xpad">19</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="dtend_label">
- <property name="label" translatable="yes">date-end</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">expand|fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label6">
- <property name="label" translatable="yes">Organizer:</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label7">
- <property name="label" translatable="yes">Date:</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label8">
- <property name="label" translatable="yes">Summary:</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label9">
- <property name="label" translatable="yes">Description:</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">no</property>
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_padding">0</property>
- <property name="y_padding">0</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">6</property>
- <property name="expand">yes</property>
- <property name="fill">yes</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label12">
- <property name="label" translatable="yes">Server Message:</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">no</property>
- <property name="xalign">7.45058e-09</property>
- <property name="yalign">0.5</property>
- <property name="xpad">3</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow3">
- <property name="border_width">3</property>
- <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="width-request">365</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkTextView" id="message_text">
- <property name="can_focus">yes</property>
- <property name="editable">no</property>
- <property name="text" translatable="yes"></property>
- <property name="wrap_mode">GTK_WRAP_WORD</property>
- <property name="visible">yes</property>
- </widget>
- </child>
-
- <child internal-child="hscrollbar">
- <widget class="GtkHScrollbar" id="convertwidget5">
- <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
- <property name="visible">yes</property>
- </widget>
- </child>
-
- <child internal-child="vscrollbar">
- <widget class="GtkVScrollbar" id="convertwidget6">
- <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
- <property name="visible">yes</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">yes</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="button_box">
- <property name="border_width">3</property>
- <property name="homogeneous">no</property>
- <property name="spacing">0</property>
- <property name="height-request">30</property>
- <property name="visible">yes</property>
-
- <child>
- <placeholder />
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child internal-child="hscrollbar">
- <widget class="GtkHScrollbar" id="convertwidget1">
- <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
- <property name="visible">yes</property>
- </widget>
- </child>
-
- <child internal-child="vscrollbar">
- <widget class="GtkVScrollbar" id="convertwidget2">
- <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
- <property name="visible">yes</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <widget class="GtkWindow" id="loading_window">
- <property name="visible">no</property>
- <property name="title" translatable="yes">Loading Calendar</property>
- <property name="type">GTK_WINDOW_DIALOG</property>
- <property name="modal">no</property>
- <property name="allow_shrink">no</property>
- <property name="allow_grow">yes</property>
- <property name="window-position">GTK_WIN_POS_CENTER</property>
-
- <child>
- <widget class="GtkFrame" id="frame1">
- <property name="border_width">4</property>
- <property name="label" translatable="yes"></property>
- <property name="label_xalign">0</property>
- <property name="shadow">GTK_SHADOW_ETCHED_OUT</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkVBox" id="vbox2">
- <property name="border_width">7</property>
- <property name="homogeneous">no</property>
- <property name="spacing">1</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkHBox" id="hbox2">
- <property name="border_width">6</property>
- <property name="homogeneous">no</property>
- <property name="spacing">9</property>
- <property name="visible">yes</property>
-
- <child>
- <widget class="GtkLabel" id="label10">
- <property name="label" translatable="yes">Loading calendar...</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">no</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="visible">yes</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkProgressBar" id="loading_progress">
- <property name="bar_style">GTK_PROGRESS_CONTINUOUS</property>
- <property name="orientation">GTK_PROGRESS_LEFT_TO_RIGHT</property>
- <property name="activity_mode">no</property>
- <property name="show_text">no</property>
- <property name="format" translatable="yes">%P %%</property>
- <property name="text_xalign">0.5</property>
- <property name="text_yalign">0.5</property>
- <property name="visible">yes</property>
- <property name="adjustment">0 0 100 1 10 10</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">no</property>
- <property name="fill">no</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
-</glade-interface>
diff --git a/calendar/gui/e-itip-control.h b/calendar/gui/e-itip-control.h
deleted file mode 100644
index 1a1e3e6eb9..0000000000
--- a/calendar/gui/e-itip-control.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-itip-control.h
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: JP Rosevear
- */
-
-#ifndef _E_ITIP_CONTROL_H_
-#define _E_ITIP_CONTROL_H_
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define E_TYPE_ITIP_CONTROL (e_itip_control_get_type ())
-#define E_ITIP_CONTROL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_ITIP_CONTROL, EItipControl))
-#define E_ITIP_CONTROL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_ITIP_CONTROL, EItipControlClass))
-#define E_IS_ITIP_CONTROL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_ITIP_CONTROL))
-#define E_IS_ITIP_CONTROL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_ITIP_CONTROL))
-
-
-typedef struct _EItipControl EItipControl;
-typedef struct _EItipControlPrivate EItipControlPrivate;
-typedef struct _EItipControlClass EItipControlClass;
-
-struct _EItipControl {
- GtkVBox parent;
-
- EItipControlPrivate *priv;
-};
-
-struct _EItipControlClass {
- GtkVBoxClass parent_class;
-};
-
-
-
-GtkType e_itip_control_get_type (void);
-GtkWidget * e_itip_control_new (void);
-void e_itip_control_set_data (EItipControl *itip,
- const gchar *text);
-gchar * e_itip_control_get_data (EItipControl *itip);
-gint e_itip_control_get_data_size (EItipControl *itip);
-void e_itip_control_set_from_address (EItipControl *itip,
- const gchar *address);
-const gchar *e_itip_control_get_from_address (EItipControl *itip);
-void e_itip_control_set_view_only (EItipControl *itip,
- gboolean view_only);
-gboolean e_itip_control_get_view_only (EItipControl *itip);
-void e_itip_control_set_delegator_address (EItipControl *itip,
- const gchar *address);
-const gchar *e_itip_control_get_delegator_address (EItipControl *itip);
-void e_itip_control_set_delegator_name (EItipControl *itip,
- const gchar *name);
-const gchar *e_itip_control_get_delegator_name (EItipControl *itip);
-void e_itip_control_set_calendar_uid (EItipControl *itip,
- const gchar *uid);
-const gchar *e_itip_control_get_calendar_uid (EItipControl *itip);
-
-G_END_DECLS
-
-#endif /* _E_ITIP_CONTROL_H_ */
diff --git a/calendar/gui/e-meeting-attendee.c b/calendar/gui/e-meeting-attendee.c
deleted file mode 100644
index e66667fd0b..0000000000
--- a/calendar/gui/e-meeting-attendee.c
+++ /dev/null
@@ -1,992 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-attendee.c
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: JP Rosevear
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <gtk/gtk.h>
-#include "e-meeting-attendee.h"
-
-struct _EMeetingAttendeePrivate {
- gchar *address;
- gchar *member;
-
- icalparameter_cutype cutype;
- icalparameter_role role;
-
- gboolean rsvp;
-
- gchar *delto;
- gchar *delfrom;
-
- icalparameter_partstat status;
-
- gchar *sentby;
- gchar *cn;
- gchar *language;
-
- EMeetingAttendeeEditLevel edit_level;
-
- gboolean has_calendar_info;
-
- GArray *busy_periods;
- gboolean busy_periods_sorted;
-
- EMeetingTime busy_periods_start;
- EMeetingTime busy_periods_end;
- gboolean start_busy_range_set;
- gboolean end_busy_range_set;
-
- gint longest_period_in_days;
-};
-
-enum {
- CHANGED,
- LAST_SIGNAL
-};
-static guint signals[LAST_SIGNAL];
-
-static void e_meeting_attendee_finalize (GObject *obj);
-
-G_DEFINE_TYPE (EMeetingAttendee, e_meeting_attendee, G_TYPE_OBJECT);
-
-static void
-e_meeting_attendee_class_init (EMeetingAttendeeClass *klass)
-{
- GObjectClass *object_class;
-
- object_class = G_OBJECT_CLASS (klass);
-
- signals[CHANGED] =
- g_signal_new ("changed",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EMeetingAttendeeClass, changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
- object_class->finalize = e_meeting_attendee_finalize;
-}
-
-static gchar *
-string_test (gchar *string)
-{
- return string != NULL ? string : g_strdup ("");
-}
-
-static gboolean
-string_is_set (gchar *string)
-{
- if (string != NULL && *string != '\0')
- return TRUE;
-
- return FALSE;
-}
-
-static void
-notify_changed (EMeetingAttendee *ia)
-{
- g_signal_emit_by_name (G_OBJECT (ia), "changed");
-}
-
-static void
-e_meeting_attendee_init (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = g_new0 (EMeetingAttendeePrivate, 1);
-
- ia->priv = priv;
-
- priv->address = string_test (NULL);
- priv->member = string_test (NULL);
-
- priv->cutype = ICAL_CUTYPE_NONE;
- priv->role = ICAL_ROLE_NONE;
-
- priv->rsvp = FALSE;
-
- priv->delto = string_test (NULL);
- priv->delfrom = string_test (NULL);
-
- priv->status = ICAL_PARTSTAT_NONE;
-
- priv->sentby = string_test (NULL);
- priv->cn = string_test (NULL);
- priv->language = string_test (NULL);
-
- priv->edit_level = E_MEETING_ATTENDEE_EDIT_FULL;
- priv->has_calendar_info = FALSE;
-
- priv->busy_periods = g_array_new (FALSE, FALSE, sizeof (EMeetingFreeBusyPeriod));
- priv->busy_periods_sorted = FALSE;
-
- g_date_clear (&priv->busy_periods_start.date, 1);
- priv->busy_periods_start.hour = 0;
- priv->busy_periods_start.minute = 0;
-
- g_date_clear (&priv->busy_periods_end.date, 1);
- priv->busy_periods_end.hour = 0;
- priv->busy_periods_end.minute = 0;
-
- priv->start_busy_range_set = FALSE;
- priv->end_busy_range_set = FALSE;
-
- priv->longest_period_in_days = 0;
-}
-
-
-static void
-e_meeting_attendee_finalize (GObject *obj)
-{
- EMeetingAttendee *ia = E_MEETING_ATTENDEE (obj);
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- g_free (priv->address);
- g_free (priv->member);
-
- g_free (priv->delto);
- g_free (priv->delfrom);
-
- g_free (priv->sentby);
- g_free (priv->cn);
- g_free (priv->language);
-
- g_array_free (priv->busy_periods, TRUE);
-
- g_free (priv);
-
- if (G_OBJECT_CLASS (e_meeting_attendee_parent_class)->finalize)
- (* G_OBJECT_CLASS (e_meeting_attendee_parent_class)->finalize) (obj);
-}
-
-GObject *
-e_meeting_attendee_new (void)
-{
- return g_object_new (E_TYPE_MEETING_ATTENDEE, NULL);
-}
-
-GObject *
-e_meeting_attendee_new_from_e_cal_component_attendee (ECalComponentAttendee *ca)
-{
- EMeetingAttendee *ia;
-
- ia = E_MEETING_ATTENDEE (g_object_new (E_TYPE_MEETING_ATTENDEE, NULL));
-
- e_meeting_attendee_set_address (ia, g_strdup (ca->value));
- e_meeting_attendee_set_member (ia, g_strdup (ca->member));
- e_meeting_attendee_set_cutype (ia, ca->cutype);
- e_meeting_attendee_set_role (ia, ca->role);
- e_meeting_attendee_set_status (ia, ca->status);
- e_meeting_attendee_set_rsvp (ia, ca->rsvp);
- e_meeting_attendee_set_delto (ia, g_strdup (ca->delto));
- e_meeting_attendee_set_delfrom (ia, g_strdup (ca->delfrom));
- e_meeting_attendee_set_sentby (ia, g_strdup (ca->sentby));
- e_meeting_attendee_set_cn (ia, g_strdup (ca->cn));
- e_meeting_attendee_set_language (ia, g_strdup (ca->language));
-
- return G_OBJECT (ia);
-}
-
-ECalComponentAttendee *
-e_meeting_attendee_as_e_cal_component_attendee (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
- ECalComponentAttendee *ca;
-
- priv = ia->priv;
-
- ca = g_new0 (ECalComponentAttendee, 1);
-
- ca->value = priv->address;
- ca->member = string_is_set (priv->member) ? priv->member : NULL;
- ca->cutype= priv->cutype;
- ca->role = priv->role;
- ca->status = priv->status;
- ca->rsvp = priv->rsvp;
- ca->delto = string_is_set (priv->delto) ? priv->delto : NULL;
- ca->delfrom = string_is_set (priv->delfrom) ? priv->delfrom : NULL;
- ca->sentby = string_is_set (priv->sentby) ? priv->sentby : NULL;
- ca->cn = string_is_set (priv->cn) ? priv->cn : NULL;
- ca->language = string_is_set (priv->language) ? priv->language : NULL;
-
- return ca;
-}
-
-
-const gchar *
-e_meeting_attendee_get_address (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return priv->address;
-}
-
-void
-e_meeting_attendee_set_address (EMeetingAttendee *ia, gchar *address)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- if (priv->address != NULL)
- g_free (priv->address);
-
- priv->address = string_test (address);
-
- notify_changed (ia);
-}
-
-gboolean
-e_meeting_attendee_is_set_address (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return string_is_set (priv->address);
-}
-
-const gchar *
-e_meeting_attendee_get_member (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return priv->member;
-}
-
-void
-e_meeting_attendee_set_member (EMeetingAttendee *ia, gchar *member)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- if (priv->member != NULL)
- g_free (priv->member);
-
- priv->member = string_test (member);
-
- notify_changed (ia);
-}
-
-gboolean
-e_meeting_attendee_is_set_member (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return string_is_set (priv->member);
-}
-
-icalparameter_cutype
-e_meeting_attendee_get_cutype (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return priv->cutype;
-}
-
-void
-e_meeting_attendee_set_cutype (EMeetingAttendee *ia, icalparameter_cutype cutype)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- priv->cutype = cutype;
-
- notify_changed (ia);
-}
-
-icalparameter_role
-e_meeting_attendee_get_role (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return priv->role;
-}
-
-void
-e_meeting_attendee_set_role (EMeetingAttendee *ia, icalparameter_role role)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- priv->role = role;
-
- notify_changed (ia);
-}
-
-gboolean
-e_meeting_attendee_get_rsvp (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return priv->rsvp;
-}
-
-void
-e_meeting_attendee_set_rsvp (EMeetingAttendee *ia, gboolean rsvp)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- priv->rsvp = rsvp;
-
- notify_changed (ia);
-}
-
-const gchar *
-e_meeting_attendee_get_delto (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return priv->delto;
-}
-
-void
-e_meeting_attendee_set_delto (EMeetingAttendee *ia, gchar *delto)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- if (priv->delto != NULL)
- g_free (priv->delto);
-
- priv->delto = string_test (delto);
-
- notify_changed (ia);
-}
-
-gboolean
-e_meeting_attendee_is_set_delto (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return string_is_set (priv->delto);
-}
-
-const gchar *
-e_meeting_attendee_get_delfrom (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return priv->delfrom;
-}
-
-void
-e_meeting_attendee_set_delfrom (EMeetingAttendee *ia, gchar *delfrom)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- if (priv->delfrom != NULL)
- g_free (priv->delfrom);
-
- priv->delfrom = string_test (delfrom);
-
- notify_changed (ia);
-}
-
-gboolean
-e_meeting_attendee_is_set_delfrom (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return string_is_set (priv->delfrom);
-}
-
-icalparameter_partstat
-e_meeting_attendee_get_status (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return priv->status;
-}
-
-void
-e_meeting_attendee_set_status (EMeetingAttendee *ia, icalparameter_partstat status)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- priv->status = status;
-
- notify_changed (ia);
-}
-
-const gchar *
-e_meeting_attendee_get_sentby (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return priv->sentby;
-}
-
-void
-e_meeting_attendee_set_sentby (EMeetingAttendee *ia, gchar *sentby)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- if (priv->sentby != NULL)
- g_free (priv->sentby);
-
- priv->sentby = string_test (sentby);
-
- notify_changed (ia);
-}
-
-gboolean
-e_meeting_attendee_is_set_sentby (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return string_is_set (priv->sentby);
-}
-
-const gchar *
-e_meeting_attendee_get_cn (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return priv->cn;
-}
-
-void
-e_meeting_attendee_set_cn (EMeetingAttendee *ia, gchar *cn)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- if (priv->cn != NULL)
- g_free (priv->cn);
-
- priv->cn = string_test (cn);
-
- notify_changed (ia);
-}
-
-gboolean
-e_meeting_attendee_is_set_cn (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return string_is_set (priv->cn);
-}
-
-const gchar *
-e_meeting_attendee_get_language (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return priv->language;
-}
-
-void
-e_meeting_attendee_set_language (EMeetingAttendee *ia, gchar *language)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- if (priv->language != NULL)
- g_free (priv->language);
-
- priv->language = string_test (language);
-
- notify_changed (ia);
-}
-
-gboolean
-e_meeting_attendee_is_set_language (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return string_is_set (priv->language);
-}
-
-EMeetingAttendeeType
-e_meeting_attendee_get_atype (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- if (priv->cutype == ICAL_CUTYPE_ROOM
- || priv->cutype == ICAL_CUTYPE_RESOURCE)
- return E_MEETING_ATTENDEE_RESOURCE;
-
- if (priv->role == ICAL_ROLE_CHAIR
- || priv->role == ICAL_ROLE_REQPARTICIPANT)
- return E_MEETING_ATTENDEE_REQUIRED_PERSON;
-
- return E_MEETING_ATTENDEE_OPTIONAL_PERSON;
-}
-
-
-EMeetingAttendeeEditLevel
-e_meeting_attendee_get_edit_level (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- g_return_val_if_fail (ia != NULL, E_MEETING_ATTENDEE_EDIT_NONE);
- g_return_val_if_fail (E_IS_MEETING_ATTENDEE (ia), E_MEETING_ATTENDEE_EDIT_NONE);
-
- priv = ia->priv;
-
- return priv->edit_level;
-}
-
-void
-e_meeting_attendee_set_edit_level (EMeetingAttendee *ia, EMeetingAttendeeEditLevel level)
-{
- EMeetingAttendeePrivate *priv;
-
- g_return_if_fail (ia != NULL);
- g_return_if_fail (E_IS_MEETING_ATTENDEE (ia));
-
- priv = ia->priv;
-
- priv->edit_level = level;
-}
-
-
-static gint
-compare_times (EMeetingTime *time1,
- EMeetingTime *time2)
-{
- gint day_comparison;
-
- day_comparison = g_date_compare (&time1->date,
- &time2->date);
- if (day_comparison != 0)
- return day_comparison;
-
- if (time1->hour < time2->hour)
- return -1;
- if (time1->hour > time2->hour)
- return 1;
-
- if (time1->minute < time2->minute)
- return -1;
- if (time1->minute > time2->minute)
- return 1;
-
- /* The start times are exactly the same. */
- return 0;
-}
-
-static gint
-compare_period_starts (const void *arg1,
- const void *arg2)
-{
- EMeetingFreeBusyPeriod *period1, *period2;
-
- period1 = (EMeetingFreeBusyPeriod *) arg1;
- period2 = (EMeetingFreeBusyPeriod *) arg2;
-
- return compare_times (&period1->start, &period2->start);
-}
-
-static void
-ensure_periods_sorted (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- if (priv->busy_periods_sorted)
- return;
-
- qsort (priv->busy_periods->data, priv->busy_periods->len,
- sizeof (EMeetingFreeBusyPeriod),
- compare_period_starts);
-
- priv->busy_periods_sorted = TRUE;
-}
-
-gboolean
-e_meeting_attendee_get_has_calendar_info (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return priv->has_calendar_info;
-}
-
-void
-e_meeting_attendee_set_has_calendar_info (EMeetingAttendee *ia, gboolean has_calendar_info)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- priv->has_calendar_info = has_calendar_info;
-}
-
-const GArray *
-e_meeting_attendee_get_busy_periods (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- ensure_periods_sorted (ia);
-
- return priv->busy_periods;
-}
-
-gint
-e_meeting_attendee_find_first_busy_period (EMeetingAttendee *ia, GDate *date)
-{
- EMeetingAttendeePrivate *priv;
- EMeetingFreeBusyPeriod *period;
- gint lower, upper, middle = 0, cmp = 0;
- GDate tmp_date;
-
- priv = ia->priv;
-
- /* Make sure the busy periods have been sorted. */
- ensure_periods_sorted (ia);
-
- /* Calculate the first day which could have a busy period which
- continues onto our given date. */
- tmp_date = *date;
- g_date_subtract_days (&tmp_date, priv->longest_period_in_days);
-
- /* We want the first busy period which starts on tmp_date. */
- lower = 0;
- upper = priv->busy_periods->len;
-
- if (upper == 0)
- return -1;
-
- while (lower < upper) {
- middle = (lower + upper) >> 1;
-
- period = &g_array_index (priv->busy_periods,
- EMeetingFreeBusyPeriod, middle);
-
- cmp = g_date_compare (&tmp_date, &period->start.date);
-
- if (cmp == 0)
- break;
- else if (cmp < 0)
- upper = middle;
- else
- lower = middle + 1;
- }
-
- /* There may be several busy periods on the same day so we step
- backwards to the first one. */
- if (cmp == 0) {
- while (middle > 0) {
- period = &g_array_index (priv->busy_periods,
- EMeetingFreeBusyPeriod, middle - 1);
- if (g_date_compare (&tmp_date, &period->start.date) != 0)
- break;
- middle--;
- }
- } else if (cmp > 0) {
- /* This means we couldn't find a period on the given day, and
- the last one we looked at was before it, so if there are
- any more periods after this one we return it. */
- middle++;
- if (priv->busy_periods->len <= middle)
- return -1;
- }
-
- return middle;
-}
-
-gboolean
-e_meeting_attendee_add_busy_period (EMeetingAttendee *ia,
- gint start_year,
- gint start_month,
- gint start_day,
- gint start_hour,
- gint start_minute,
- gint end_year,
- gint end_month,
- gint end_day,
- gint end_hour,
- gint end_minute,
- EMeetingFreeBusyType busy_type)
-{
- EMeetingAttendeePrivate *priv;
- EMeetingFreeBusyPeriod period;
- gint period_in_days;
-
- g_return_val_if_fail (ia != NULL, FALSE);
- g_return_val_if_fail (E_IS_MEETING_ATTENDEE (ia), FALSE);
- g_return_val_if_fail (busy_type >= 0, FALSE);
- g_return_val_if_fail (busy_type < E_MEETING_FREE_BUSY_LAST, FALSE);
-
- priv = ia->priv;
-
- /* Check the dates are valid. */
- if (!g_date_valid_dmy (start_day, start_month, start_year))
- return FALSE;
- if (!g_date_valid_dmy (end_day, end_month, end_year))
- return FALSE;
- if (start_hour < 0 || start_hour > 23)
- return FALSE;
- if (end_hour < 0 || end_hour > 23)
- return FALSE;
- if (start_minute < 0 || start_minute > 59)
- return FALSE;
- if (end_minute < 0 || end_minute > 59)
- return FALSE;
-
- g_date_clear (&period.start.date, 1);
- g_date_clear (&period.end.date, 1);
- g_date_set_dmy (&period.start.date, start_day, start_month, start_year);
- g_date_set_dmy (&period.end.date, end_day, end_month, end_year);
- period.start.hour = start_hour;
- period.start.minute = start_minute;
- period.end.hour = end_hour;
- period.end.minute = end_minute;
- period.busy_type = busy_type;
-
- /* Check that the start time is before or equal to the end time. */
- if (compare_times (&period.start, &period.end) > 0)
- return FALSE;
-
- /* If the busy range is not set elsewhere, track it as best we can */
- if (!priv->start_busy_range_set) {
- if (!g_date_valid (&priv->busy_periods_start.date)) {
- priv->busy_periods_start.date = period.start.date;
- priv->busy_periods_start.hour = period.start.hour;
- priv->busy_periods_start.minute = period.start.minute;
- } else {
- switch (g_date_compare (&period.start.date, &priv->busy_periods_start.date)) {
- case -1:
- priv->busy_periods_start.date = period.start.date;
- priv->busy_periods_start.hour = period.start.hour;
- priv->busy_periods_start.minute = period.start.minute;
- break;
- case 0:
- if (period.start.hour < priv->busy_periods_start.hour
- || (period.start.hour == priv->busy_periods_start.hour
- && period.start.minute < priv->busy_periods_start.minute)) {
- priv->busy_periods_start.date = period.start.date;
- priv->busy_periods_start.hour = period.start.hour;
- priv->busy_periods_start.minute = period.start.minute;
- break;
- }
- break;
- }
- }
- }
- if (!priv->end_busy_range_set) {
- if (!g_date_valid (&priv->busy_periods_end.date)) {
- priv->busy_periods_end.date = period.end.date;
- priv->busy_periods_end.hour = period.end.hour;
- priv->busy_periods_end.minute = period.end.minute;
- } else {
- switch (g_date_compare (&period.end.date, &priv->busy_periods_end.date)) {
- case 0:
- if (period.end.hour > priv->busy_periods_end.hour
- || (period.end.hour == priv->busy_periods_end.hour
- && period.end.minute > priv->busy_periods_end.minute)) {
- priv->busy_periods_end.date = period.end.date;
- priv->busy_periods_end.hour = period.end.hour;
- priv->busy_periods_end.minute = period.end.minute;
- break;
- }
- break;
- case 1:
- priv->busy_periods_end.date = period.end.date;
- priv->busy_periods_end.hour = period.end.hour;
- priv->busy_periods_end.minute = period.end.minute;
- break;
- }
- }
- }
-
- g_array_append_val (priv->busy_periods, period);
- priv->has_calendar_info = TRUE;
- priv->busy_periods_sorted = FALSE;
-
- period_in_days = g_date_julian (&period.end.date) - g_date_julian (&period.start.date) + 1;
- priv->longest_period_in_days = MAX (priv->longest_period_in_days, period_in_days);
-
- return TRUE;
-}
-
-EMeetingTime
-e_meeting_attendee_get_start_busy_range (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return priv->busy_periods_start;
-}
-
-EMeetingTime
-e_meeting_attendee_get_end_busy_range (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- priv = ia->priv;
-
- return priv->busy_periods_end;
-}
-
-gboolean
-e_meeting_attendee_set_start_busy_range (EMeetingAttendee *ia,
- gint start_year,
- gint start_month,
- gint start_day,
- gint start_hour,
- gint start_minute)
-{
- EMeetingAttendeePrivate *priv;
-
- g_return_val_if_fail (E_IS_MEETING_ATTENDEE (ia), FALSE);
-
- priv = ia->priv;
-
- /* Check the dates are valid. */
- if (!g_date_valid_dmy (start_day, start_month, start_year))
- return FALSE;
- if (start_hour < 0 || start_hour > 23)
- return FALSE;
- if (start_minute < 0 || start_minute > 59)
- return FALSE;
-
- g_date_clear (&priv->busy_periods_start.date, 1);
- g_date_set_dmy (&priv->busy_periods_start.date,
- start_day, start_month, start_year);
- priv->busy_periods_start.hour = start_hour;
- priv->busy_periods_start.minute = start_minute;
-
- priv->start_busy_range_set = TRUE;
-
- return TRUE;
-}
-
-gboolean
-e_meeting_attendee_set_end_busy_range (EMeetingAttendee *ia,
- gint end_year,
- gint end_month,
- gint end_day,
- gint end_hour,
- gint end_minute)
-{
- EMeetingAttendeePrivate *priv;
-
- g_return_val_if_fail (E_IS_MEETING_ATTENDEE (ia), FALSE);
-
- priv = ia->priv;
-
- /* Check the dates are valid. */
- if (!g_date_valid_dmy (end_day, end_month, end_year))
- return FALSE;
- if (end_hour < 0 || end_hour > 23)
- return FALSE;
- if (end_minute < 0 || end_minute > 59)
- return FALSE;
-
- g_date_clear (&priv->busy_periods_end.date, 1);
- g_date_set_dmy (&priv->busy_periods_end.date,
- end_day, end_month, end_year);
- priv->busy_periods_end.hour = end_hour;
- priv->busy_periods_end.minute = end_minute;
-
- priv->end_busy_range_set = TRUE;
-
- return TRUE;
-}
-
-/* Clears all busy times for the given attendee. */
-void
-e_meeting_attendee_clear_busy_periods (EMeetingAttendee *ia)
-{
- EMeetingAttendeePrivate *priv;
-
- g_return_if_fail (E_IS_MEETING_ATTENDEE (ia));
-
- priv = ia->priv;
-
- g_array_set_size (priv->busy_periods, 0);
- priv->busy_periods_sorted = TRUE;
-
- g_date_clear (&priv->busy_periods_start.date, 1);
- priv->busy_periods_start.hour = 0;
- priv->busy_periods_start.minute = 0;
-
- g_date_clear (&priv->busy_periods_end.date, 1);
- priv->busy_periods_end.hour = 0;
- priv->busy_periods_end.minute = 0;
-
- priv->longest_period_in_days = 0;
-}
diff --git a/calendar/gui/e-meeting-attendee.h b/calendar/gui/e-meeting-attendee.h
deleted file mode 100644
index 42c5e13c2e..0000000000
--- a/calendar/gui/e-meeting-attendee.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-meeting_attendee.h
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: JP Rosevear
- */
-
-#ifndef _E_MEETING_ATTENDEE_H_
-#define _E_MEETING_ATTENDEE_H_
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtk.h>
-#include <libecal/e-cal-component.h>
-#include "e-meeting-types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_MEETING_ATTENDEE (e_meeting_attendee_get_type ())
-#define E_MEETING_ATTENDEE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MEETING_ATTENDEE, EMeetingAttendee))
-#define E_MEETING_ATTENDEE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MEETING_ATTENDEE, EMeetingAttendeeClass))
-#define E_IS_MEETING_ATTENDEE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MEETING_ATTENDEE))
-#define E_IS_MEETING_ATTENDEE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MEETING_ATTENDEE))
-
-
-typedef struct _EMeetingAttendee EMeetingAttendee;
-typedef struct _EMeetingAttendeePrivate EMeetingAttendeePrivate;
-typedef struct _EMeetingAttendeeClass EMeetingAttendeeClass;
-
-/* These specify the type of attendee. Either a person or a resource (e.g. a
- meeting room). These are used for the Autopick options, where the user can
- ask for a time when, for example, all people and one resource are free.
- The default is E_MEETING_ATTENDEE_REQUIRED_PERSON. */
-typedef enum
-{
- E_MEETING_ATTENDEE_REQUIRED_PERSON,
- E_MEETING_ATTENDEE_OPTIONAL_PERSON,
- E_MEETING_ATTENDEE_RESOURCE
-} EMeetingAttendeeType;
-
-typedef enum
-{
- E_MEETING_ATTENDEE_EDIT_FULL,
- E_MEETING_ATTENDEE_EDIT_STATUS,
- E_MEETING_ATTENDEE_EDIT_NONE
-} EMeetingAttendeeEditLevel;
-
-struct _EMeetingAttendee {
- GtkObject parent;
-
- EMeetingAttendeePrivate *priv;
-};
-
-struct _EMeetingAttendeeClass {
- GtkObjectClass parent_class;
-
- void (* changed) (EMeetingAttendee *ia);
-};
-
-
-GType e_meeting_attendee_get_type (void);
-GObject *e_meeting_attendee_new (void);
-GObject *e_meeting_attendee_new_from_e_cal_component_attendee (ECalComponentAttendee *ca);
-
-ECalComponentAttendee *e_meeting_attendee_as_e_cal_component_attendee (EMeetingAttendee *ia);
-
-const gchar *e_meeting_attendee_get_address (EMeetingAttendee *ia);
-void e_meeting_attendee_set_address (EMeetingAttendee *ia, gchar *address);
-gboolean e_meeting_attendee_is_set_address (EMeetingAttendee *ia);
-
-const gchar *e_meeting_attendee_get_member (EMeetingAttendee *ia);
-void e_meeting_attendee_set_member (EMeetingAttendee *ia, gchar *member);
-gboolean e_meeting_attendee_is_set_member (EMeetingAttendee *ia);
-
-icalparameter_cutype e_meeting_attendee_get_cutype (EMeetingAttendee *ia);
-void e_meeting_attendee_set_cutype (EMeetingAttendee *ia, icalparameter_cutype cutype);
-
-icalparameter_role e_meeting_attendee_get_role (EMeetingAttendee *ia);
-void e_meeting_attendee_set_role (EMeetingAttendee *ia, icalparameter_role role);
-
-gboolean e_meeting_attendee_get_rsvp (EMeetingAttendee *ia);
-void e_meeting_attendee_set_rsvp (EMeetingAttendee *ia, gboolean rsvp);
-
-const gchar *e_meeting_attendee_get_delto (EMeetingAttendee *ia);
-void e_meeting_attendee_set_delto (EMeetingAttendee *ia, gchar *delto);
-gboolean e_meeting_attendee_is_set_delto (EMeetingAttendee *ia);
-
-const gchar *e_meeting_attendee_get_delfrom (EMeetingAttendee *ia);
-void e_meeting_attendee_set_delfrom (EMeetingAttendee *ia, gchar *delfrom);
-gboolean e_meeting_attendee_is_set_delfrom (EMeetingAttendee *ia);
-
-icalparameter_partstat e_meeting_attendee_get_status (EMeetingAttendee *ia);
-void e_meeting_attendee_set_status (EMeetingAttendee *ia, icalparameter_partstat status);
-
-const gchar *e_meeting_attendee_get_sentby (EMeetingAttendee *ia);
-void e_meeting_attendee_set_sentby (EMeetingAttendee *ia, gchar *sentby);
-gboolean e_meeting_attendee_is_set_sentby (EMeetingAttendee *ia);
-
-const gchar *e_meeting_attendee_get_cn (EMeetingAttendee *ia);
-void e_meeting_attendee_set_cn (EMeetingAttendee *ia, gchar *cn);
-gboolean e_meeting_attendee_is_set_cn (EMeetingAttendee *ia);
-
-const gchar *e_meeting_attendee_get_language (EMeetingAttendee *ia);
-void e_meeting_attendee_set_language (EMeetingAttendee *ia, gchar *language);
-gboolean e_meeting_attendee_is_set_language (EMeetingAttendee *ia);
-
-EMeetingAttendeeType e_meeting_attendee_get_atype (EMeetingAttendee *ia);
-
-EMeetingAttendeeEditLevel e_meeting_attendee_get_edit_level (EMeetingAttendee *ia);
-void e_meeting_attendee_set_edit_level (EMeetingAttendee *ia, EMeetingAttendeeEditLevel level);
-
-gboolean e_meeting_attendee_get_has_calendar_info (EMeetingAttendee *ia);
-void e_meeting_attendee_set_has_calendar_info (EMeetingAttendee *ia, gboolean has_calendar_info);
-
-const GArray *e_meeting_attendee_get_busy_periods (EMeetingAttendee *ia);
-gint e_meeting_attendee_find_first_busy_period (EMeetingAttendee *ia, GDate *date);
-gboolean e_meeting_attendee_add_busy_period (EMeetingAttendee *ia,
- gint start_year,
- gint start_month,
- gint start_day,
- gint start_hour,
- gint start_minute,
- gint end_year,
- gint end_month,
- gint end_day,
- gint end_hour,
- gint end_minute,
- EMeetingFreeBusyType busy_type);
-
-EMeetingTime e_meeting_attendee_get_start_busy_range (EMeetingAttendee *ia);
-EMeetingTime e_meeting_attendee_get_end_busy_range (EMeetingAttendee *ia);
-
-gboolean e_meeting_attendee_set_start_busy_range (EMeetingAttendee *ia,
- gint start_year,
- gint start_month,
- gint start_day,
- gint start_hour,
- gint start_minute);
-gboolean e_meeting_attendee_set_end_busy_range (EMeetingAttendee *ia,
- gint end_year,
- gint end_month,
- gint end_day,
- gint end_hour,
- gint end_minute);
-
-void e_meeting_attendee_clear_busy_periods (EMeetingAttendee *ia);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_MEETING_ATTENDEE_H_ */
diff --git a/calendar/gui/e-meeting-list-view.c b/calendar/gui/e-meeting-list-view.c
deleted file mode 100644
index a3965da4af..0000000000
--- a/calendar/gui/e-meeting-list-view.c
+++ /dev/null
@@ -1,409 +0,0 @@
-/*
- * e-meeting-list-view.c
- *
- * Authors: Mike Kestner <mkestner@ximian.com>
- * JP Rosevear <jpr@ximian.com>
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <glib.h>
-#include <gtk/gtktreemodel.h>
-#include <bonobo/bonobo-control.h>
-#include <bonobo/bonobo-widget.h>
-#include <bonobo/bonobo-exception.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnome/gnome-util.h>
-#include <libgnomevfs/gnome-vfs.h>
-#include <libebook/e-book.h>
-#include <libebook/e-vcard.h>
-#include <libecal/e-cal-component.h>
-#include <libecal/e-cal-util.h>
-#include <libecal/e-cal-time-util.h>
-#include <libedataserverui/e-name-selector.h>
-#include "calendar-config.h"
-#include "e-meeting-list-view.h"
-#include <misc/e-cell-renderer-combo.h>
-#include <libebook/e-destination.h>
-#include "e-select-names-renderer.h"
-
-struct _EMeetingListViewPrivate {
- EMeetingStore *store;
-
- ENameSelector *name_selector;
-};
-
-#define BUF_SIZE 1024
-
-static void name_selector_dialog_close_cb (ENameSelectorDialog *dialog, gint response, gpointer data);
-
-static char *sections[] = {N_("Chair Persons"),
- N_("Required Participants"),
- N_("Optional Participants"),
- N_("Resources"),
- NULL};
-static icalparameter_role roles[] = {ICAL_ROLE_CHAIR,
- ICAL_ROLE_REQPARTICIPANT,
- ICAL_ROLE_OPTPARTICIPANT,
- ICAL_ROLE_NONPARTICIPANT,
- ICAL_ROLE_NONE};
-
-G_DEFINE_TYPE (EMeetingListView, e_meeting_list_view, GTK_TYPE_TREE_VIEW);
-
-static void
-e_meeting_list_view_finalize (GObject *obj)
-{
- EMeetingListView *view = E_MEETING_LIST_VIEW (obj);
- EMeetingListViewPrivate *priv = view->priv;
-
- if (priv->name_selector)
- g_object_unref (priv->name_selector);
-
- g_free (priv);
-
- if (G_OBJECT_CLASS (e_meeting_list_view_parent_class)->finalize)
- (* G_OBJECT_CLASS (e_meeting_list_view_parent_class)->finalize) (obj);
-}
-
-static void
-e_meeting_list_view_class_init (EMeetingListViewClass *klass)
-{
- GObjectClass *object_class;
-
- object_class = G_OBJECT_CLASS (klass);
-
- object_class->finalize = e_meeting_list_view_finalize;
-}
-
-
-static void
-add_section (ENameSelector *name_selector, const char *name)
-{
- ENameSelectorModel *name_selector_model;
-
- name_selector_model = e_name_selector_peek_model (name_selector);
- e_name_selector_model_add_section (name_selector_model, name, gettext (name), NULL);
-}
-
-static void
-e_meeting_list_view_init (EMeetingListView *view)
-{
- EMeetingListViewPrivate *priv;
- ENameSelectorDialog *name_selector_dialog;
- gint i;
-
- priv = g_new0 (EMeetingListViewPrivate, 1);
-
- view->priv = priv;
-
- priv->name_selector = e_name_selector_new ();
-
- for (i = 0; sections [i]; i++)
- add_section (priv->name_selector, sections [i]);
-
- name_selector_dialog = e_name_selector_peek_dialog (view->priv->name_selector);
- gtk_window_set_title (GTK_WINDOW (name_selector_dialog), _("Required Participants"));
- g_signal_connect (name_selector_dialog, "response",
- G_CALLBACK (name_selector_dialog_close_cb), view);
-
-}
-
-static GList *
-get_type_strings ()
-{
- GList *strings = NULL;
-
- strings = g_list_append (strings, (char*) _("Individual"));
- strings = g_list_append (strings, (char*) _("Group"));
- strings = g_list_append (strings, (char*) _("Resource"));
- strings = g_list_append (strings, (char*) _("Room"));
- strings = g_list_append (strings, (char*) _("Unknown"));
-
- return strings;
-}
-
-static GList *
-get_role_strings ()
-{
- GList *strings = NULL;
-
- strings = g_list_append (strings, (char*) _("Chair"));
- strings = g_list_append (strings, (char*) _("Required Participant"));
- strings = g_list_append (strings, (char*) _("Optional Participant"));
- strings = g_list_append (strings, (char*) _("Non-Participant"));
- strings = g_list_append (strings, (char*) _("Unknown"));
-
- return strings;
-}
-
-static GList *
-get_rsvp_strings ()
-{
- GList *strings = NULL;
-
- strings = g_list_append (strings, (char*) _("Yes"));
- strings = g_list_append (strings, (char*) _("No"));
-
- return strings;
-}
-
-static GList *
-get_status_strings ()
-{
- GList *strings = NULL;
-
- strings = g_list_append (strings, (char*) _("Needs Action"));
- strings = g_list_append (strings, (char*) _("Accepted"));
- strings = g_list_append (strings, (char*) _("Declined"));
- strings = g_list_append (strings, (char*) _("Tentative"));
- strings = g_list_append (strings, (char*) _("Delegated"));
-
- return strings;
-}
-
-static void
-value_edited (GtkTreeView *view, gint col, const gchar *path, const gchar *text)
-{
- EMeetingStore *model = E_MEETING_STORE (gtk_tree_view_get_model (view));
- GtkTreePath *treepath = gtk_tree_path_new_from_string (path);
- int row = gtk_tree_path_get_indices (treepath)[0];
-
- e_meeting_store_set_value (model, row, col, text);
- gtk_tree_path_free (treepath);
-}
-
-static void
-attendee_edited_cb (GtkCellRenderer *renderer, const gchar *path, const gchar *address, const gchar *name, GtkTreeView *view)
-{
- value_edited (view, E_MEETING_STORE_ADDRESS_COL, path, address);
- value_edited (view, E_MEETING_STORE_CN_COL, path, name);
-}
-
-static void
-type_edited_cb (GtkCellRenderer *renderer, const gchar *path, const gchar *text, GtkTreeView *view)
-{
- value_edited (view, E_MEETING_STORE_TYPE_COL, path, text);
-}
-
-static void
-role_edited_cb (GtkCellRenderer *renderer, const gchar *path, const gchar *text, GtkTreeView *view)
-{
- value_edited (view, E_MEETING_STORE_ROLE_COL, path, text);
-}
-
-static void
-rsvp_edited_cb (GtkCellRenderer *renderer, const gchar *path, const gchar *text, GtkTreeView *view)
-{
- value_edited (view, E_MEETING_STORE_RSVP_COL, path, text);
-}
-
-static void
-status_edited_cb (GtkCellRenderer *renderer, const gchar *path, const gchar *text, GtkTreeView *view)
-{
- value_edited (view, E_MEETING_STORE_STATUS_COL, path, text);
-}
-
-static void
-build_table (GtkTreeView *view)
-{
- GtkCellRenderer *renderer;
-
- gtk_tree_view_set_headers_visible (view, TRUE);
- gtk_tree_view_set_rules_hint (view, TRUE);
-
- renderer = e_select_names_renderer_new ();
- g_object_set (G_OBJECT (renderer), "editable", TRUE, NULL);
- gtk_tree_view_insert_column_with_attributes (view, -1, _("Attendee"), renderer,
- "text", E_MEETING_STORE_ATTENDEE_COL,
- "address", E_MEETING_STORE_ADDRESS_COL,
- "underline", E_MEETING_STORE_ATTENDEE_UNDERLINE_COL,
- NULL);
- g_signal_connect (renderer, "cell_edited", G_CALLBACK (attendee_edited_cb), view);
-
- renderer = e_cell_renderer_combo_new ();
- g_object_set (G_OBJECT (renderer), "list", get_type_strings (), "editable", TRUE, NULL);
- gtk_tree_view_insert_column_with_attributes (view, -1, _("Type"), renderer,
- "text", E_MEETING_STORE_TYPE_COL,
- NULL);
- g_signal_connect (renderer, "edited", G_CALLBACK (type_edited_cb), view);
-
- renderer = e_cell_renderer_combo_new ();
- g_object_set (G_OBJECT (renderer), "list", get_role_strings (), "editable", TRUE, NULL);
- gtk_tree_view_insert_column_with_attributes (view, -1, _("Role"), renderer,
- "text", E_MEETING_STORE_ROLE_COL,
- NULL);
- g_signal_connect (renderer, "edited", G_CALLBACK (role_edited_cb), view);
-
- renderer = e_cell_renderer_combo_new ();
- g_object_set (G_OBJECT (renderer), "list", get_rsvp_strings (), "editable", TRUE, NULL);
- gtk_tree_view_insert_column_with_attributes (view, -1, _("RSVP"), renderer,
- "text", E_MEETING_STORE_RSVP_COL,
- NULL);
- g_signal_connect (renderer, "edited", G_CALLBACK (rsvp_edited_cb), view);
-
- renderer = e_cell_renderer_combo_new ();
- g_object_set (G_OBJECT (renderer), "list", get_status_strings (), "editable", TRUE, NULL);
- gtk_tree_view_insert_column_with_attributes (view, -1, _("Status"), renderer,
- "text", E_MEETING_STORE_STATUS_COL,
- NULL);
- g_signal_connect (renderer, "edited", G_CALLBACK (status_edited_cb), view);
-}
-
-EMeetingListView *
-e_meeting_list_view_new (EMeetingStore *store)
-{
- EMeetingListView *view = g_object_new (E_TYPE_MEETING_LIST_VIEW, NULL);
-
- if (view) {
- view->priv->store = store;
- gtk_tree_view_set_model (GTK_TREE_VIEW (view), GTK_TREE_MODEL (store));
- build_table (GTK_TREE_VIEW (view));
- }
-
- return view;
-}
-
-void
-e_meeting_list_view_column_set_visible (EMeetingListView *view, const gchar *col_name, gboolean visible)
-{
- GList *cols, *l;
-
- cols = gtk_tree_view_get_columns (GTK_TREE_VIEW (view));
-
- for (l = cols; l; l = l->next) {
- GtkTreeViewColumn *col = (GtkTreeViewColumn *) l->data;
-
- if (strcmp (gtk_tree_view_column_get_title (col), col_name) == 0) {
- gtk_tree_view_column_set_visible (col, visible);
- break;
- }
- }
-}
-
-void
-e_meeting_list_view_edit (EMeetingListView *emlv, EMeetingAttendee *attendee)
-{
- EMeetingListViewPrivate *priv;
- GtkTreePath *path;
- GtkTreeViewColumn *focus_col;
-
- priv = emlv->priv;
-
- g_return_if_fail (emlv != NULL);
- g_return_if_fail (E_IS_MEETING_LIST_VIEW (emlv));
- g_return_if_fail (attendee != NULL);
-
- path = e_meeting_store_find_attendee_path (priv->store, attendee);
- focus_col = gtk_tree_view_get_column (GTK_TREE_VIEW (emlv), 0);
-
- if (path) {
- gtk_tree_view_set_cursor (GTK_TREE_VIEW (emlv), path, focus_col, TRUE);
-
- gtk_tree_path_free (path);
- }
-}
-
-static void
-process_section (EMeetingListView *view, GList *destinations, icalparameter_role role)
-{
- EMeetingListViewPrivate *priv;
- GList *l;
-
- priv = view->priv;
- for (l = destinations; l; l = g_list_next (l)) {
- EDestination *destination = l->data;
- const char *name, *attendee = NULL;
- char *attr = NULL;
-
- name = e_destination_get_name (destination);
-
- /* Get the field as attendee from the backend */
- if (e_cal_get_ldap_attribute (e_meeting_store_get_e_cal (priv->store),
- &attr, NULL)) {
- /* FIXME this should be more general */
- if (!g_ascii_strcasecmp (attr, "icscalendar")) {
- EContact *contact;
-
- /* FIXME: this does not work, have to use first
- e_destination_use_contact() */
- contact = e_destination_get_contact (destination);
- if (contact) {
- attendee = e_contact_get (contact, E_CONTACT_FREEBUSY_URL);
- if (!attendee)
- attendee = e_contact_get (contact, E_CONTACT_CALENDAR_URI);
- }
- }
- }
-
- /* If we couldn't get the attendee prior, get the email address as the default */
- if (attendee == NULL || *attendee == '\0') {
- attendee = e_destination_get_email (destination);
- }
-
- if (attendee == NULL || *attendee == '\0')
- continue;
-
- if (e_meeting_store_find_attendee (priv->store, attendee, NULL) == NULL) {
- EMeetingAttendee *ia = e_meeting_store_add_attendee_with_defaults (priv->store);
-
- e_meeting_attendee_set_address (ia, g_strdup_printf ("MAILTO:%s", attendee));
- e_meeting_attendee_set_role (ia, role);
- if (role == ICAL_ROLE_NONPARTICIPANT)
- e_meeting_attendee_set_cutype (ia, ICAL_CUTYPE_RESOURCE);
- e_meeting_attendee_set_cn (ia, g_strdup (name));
- }
- }
-}
-
-static void
-name_selector_dialog_close_cb (ENameSelectorDialog *dialog, gint response, gpointer data)
-{
- EMeetingListView *view = E_MEETING_LIST_VIEW (data);
- ENameSelectorModel *name_selector_model;
- int i;
-
- name_selector_model = e_name_selector_peek_model (view->priv->name_selector);
-
- for (i = 0; sections[i] != NULL; i++) {
- EDestinationStore *destination_store;
- GList *destinations;
-
- e_name_selector_model_peek_section (name_selector_model, sections [i],
- NULL, &destination_store);
- g_assert (destination_store);
-
- destinations = e_destination_store_list_destinations (destination_store);
- process_section (view, destinations, roles [i]);
- g_list_free (destinations);
- }
-
- gtk_widget_hide (GTK_WIDGET (dialog));
-}
-
-void
-e_meeting_list_view_invite_others_dialog (EMeetingListView *view)
-{
- ENameSelectorDialog *dialog;
-
- dialog = e_name_selector_peek_dialog (view->priv->name_selector);
- gtk_widget_show (GTK_WIDGET (dialog));
-}
diff --git a/calendar/gui/e-meeting-list-view.h b/calendar/gui/e-meeting-list-view.h
deleted file mode 100644
index 6fc433b82c..0000000000
--- a/calendar/gui/e-meeting-list-view.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * e-meeting-list-view.h
- *
- * Author: Mike Kestner <mkestner@ximian.com>
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef _E_MEETING_LIST_VIEW_H_
-#define _E_MEETING_LIST_VIEW_H_
-
-#include <gtk/gtktreeview.h>
-#include "e-meeting-store.h"
-
-G_BEGIN_DECLS
-
-#define E_TYPE_MEETING_LIST_VIEW (e_meeting_list_view_get_type ())
-#define E_MEETING_LIST_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MEETING_LIST_VIEW, EMeetingListView))
-#define E_MEETING_LIST_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MEETING_LIST_VIEW, EMeetingListViewClass))
-#define E_IS_MEETING_LIST_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MEETING_LIST_VIEW))
-#define E_IS_MEETING_LIST_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MEETING_LIST_VIEW))
-
-
-typedef struct _EMeetingListView EMeetingListView;
-typedef struct _EMeetingListViewPrivate EMeetingListViewPrivate;
-typedef struct _EMeetingListViewClass EMeetingListViewClass;
-
-struct _EMeetingListView {
- GtkTreeView parent;
-
- EMeetingListViewPrivate *priv;
-};
-
-struct _EMeetingListViewClass {
- GtkTreeViewClass parent_class;
-};
-
-GType e_meeting_list_view_get_type (void);
-
-EMeetingListView *e_meeting_list_view_new (EMeetingStore *store);
-
-void e_meeting_list_view_column_set_visible (EMeetingListView *emlv, const gchar *col_name, gboolean visible);
-
-void e_meeting_list_view_edit (EMeetingListView *emlv, EMeetingAttendee *attendee);
-
-void e_meeting_list_view_invite_others_dialog (EMeetingListView *emlv);
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/e-meeting-store.c b/calendar/gui/e-meeting-store.c
deleted file mode 100644
index 7cbfbe2b79..0000000000
--- a/calendar/gui/e-meeting-store.c
+++ /dev/null
@@ -1,1537 +0,0 @@
-/*
- * e-meeting-store.c
- *
- * Copyright (C) 2001-2003 Ximian, Inc.
- *
- * Authors: JP Rosevear <jpr@ximian.com>
- * Mike Kestner <mkestner@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnome/gnome-util.h>
-#include <libgnomevfs/gnome-vfs.h>
-#include <libebook/e-book.h>
-#include <libecal/e-cal-component.h>
-#include <libecal/e-cal-util.h>
-#include <libecal/e-cal-time-util.h>
-#include "calendar-config.h"
-#include "itip-utils.h"
-#include "e-meeting-utils.h"
-#include "e-meeting-attendee.h"
-#include "e-meeting-store.h"
-
-#define ROW_VALID(store, row) (row >= 0 && row < store->priv->attendees->len)
-
-struct _EMeetingStorePrivate {
- GPtrArray *attendees;
- gint stamp;
-
- ECal *client;
- icaltimezone *zone;
-
- char *fb_uri;
-
- EBook *ebook;
-
- GPtrArray *refresh_queue;
- GHashTable *refresh_data;
- GMutex *mutex;
- guint refresh_idle_id;
-
- guint callback_idle_id;
- guint num_threads;
- GAsyncQueue *async_queue;
-};
-
-#define BUF_SIZE 1024
-
-typedef struct _EMeetingStoreQueueData EMeetingStoreQueueData;
-struct _EMeetingStoreQueueData {
- EMeetingStore *store;
- EMeetingAttendee *attendee;
-
- gboolean refreshing;
-
- EMeetingTime start;
- EMeetingTime end;
-
- char buffer[BUF_SIZE];
- GString *string;
-
- GPtrArray *call_backs;
- GPtrArray *data;
-};
-
-
-static GObjectClass *parent_class = NULL;
-
-static void start_async_read (GnomeVFSAsyncHandle *handle, GnomeVFSResult result, gpointer data);
-
-static void
-start_addressbook_server (EMeetingStore *store)
-{
- store->priv->ebook = e_book_new_system_addressbook (NULL);
- e_book_open (store->priv->ebook, FALSE, NULL);
-}
-
-static icalparameter_cutype
-text_to_type (const char *type)
-{
- if (!g_strcasecmp (type, _("Individual")))
- return ICAL_CUTYPE_INDIVIDUAL;
- else if (!g_strcasecmp (type, _("Group")))
- return ICAL_CUTYPE_GROUP;
- else if (!g_strcasecmp (type, _("Resource")))
- return ICAL_CUTYPE_RESOURCE;
- else if (!g_strcasecmp (type, _("Room")))
- return ICAL_CUTYPE_ROOM;
- else
- return ICAL_CUTYPE_NONE;
-}
-
-static char *
-type_to_text (icalparameter_cutype type)
-{
- switch (type) {
- case ICAL_CUTYPE_INDIVIDUAL:
- return _("Individual");
- case ICAL_CUTYPE_GROUP:
- return _("Group");
- case ICAL_CUTYPE_RESOURCE:
- return _("Resource");
- case ICAL_CUTYPE_ROOM:
- return _("Room");
- default:
- return _("Unknown");
- }
-
- return NULL;
-
-}
-
-static icalparameter_role
-text_to_role (const char *role)
-{
- if (!g_strcasecmp (role, _("Chair")))
- return ICAL_ROLE_CHAIR;
- else if (!g_strcasecmp (role, _("Required Participant")))
- return ICAL_ROLE_REQPARTICIPANT;
- else if (!g_strcasecmp (role, _("Optional Participant")))
- return ICAL_ROLE_OPTPARTICIPANT;
- else if (!g_strcasecmp (role, _("Non-Participant")))
- return ICAL_ROLE_NONPARTICIPANT;
- else
- return ICAL_ROLE_NONE;
-}
-
-static char *
-role_to_text (icalparameter_role role)
-{
- switch (role) {
- case ICAL_ROLE_CHAIR:
- return _("Chair");
- case ICAL_ROLE_REQPARTICIPANT:
- return _("Required Participant");
- case ICAL_ROLE_OPTPARTICIPANT:
- return _("Optional Participant");
- case ICAL_ROLE_NONPARTICIPANT:
- return _("Non-Participant");
- default:
- return _("Unknown");
- }
-
- return NULL;
-}
-
-static gboolean
-text_to_boolean (const char *role)
-{
- if (!g_strcasecmp (role, _("Yes")))
- return TRUE;
- else
- return FALSE;
-}
-
-static char *
-boolean_to_text (gboolean b)
-{
- if (b)
- return _("Yes");
- else
- return _("No");
-}
-
-static icalparameter_partstat
-text_to_partstat (const char *partstat)
-{
- if (!g_strcasecmp (partstat, _("Needs Action")))
- return ICAL_PARTSTAT_NEEDSACTION;
- else if (!g_strcasecmp (partstat, _("Accepted")))
- return ICAL_PARTSTAT_ACCEPTED;
- else if (!g_strcasecmp (partstat, _("Declined")))
- return ICAL_PARTSTAT_DECLINED;
- else if (!g_strcasecmp (partstat, _("Tentative")))
- return ICAL_PARTSTAT_TENTATIVE;
- else if (!g_strcasecmp (partstat, _("Delegated")))
- return ICAL_PARTSTAT_DELEGATED;
- else if (!g_strcasecmp (partstat, _("Completed")))
- return ICAL_PARTSTAT_COMPLETED;
- else if (!g_strcasecmp (partstat, _("In Process")))
- return ICAL_PARTSTAT_INPROCESS;
- else
- return ICAL_PARTSTAT_NONE;
-}
-
-static char *
-partstat_to_text (icalparameter_partstat partstat)
-{
- switch (partstat) {
- case ICAL_PARTSTAT_NEEDSACTION:
- return _("Needs Action");
- case ICAL_PARTSTAT_ACCEPTED:
- return _("Accepted");
- case ICAL_PARTSTAT_DECLINED:
- return _("Declined");
- case ICAL_PARTSTAT_TENTATIVE:
- return _("Tentative");
- case ICAL_PARTSTAT_DELEGATED:
- return _("Delegated");
- case ICAL_PARTSTAT_COMPLETED:
- return _("Completed");
- case ICAL_PARTSTAT_INPROCESS:
- return _("In Process");
- case ICAL_PARTSTAT_NONE:
- default:
- return _("Unknown");
- }
-
- return NULL;
-}
-
-static GtkTreeModelFlags
-get_flags (GtkTreeModel *model)
-{
- g_return_val_if_fail (E_IS_MEETING_STORE (model), 0);
-
- return GTK_TREE_MODEL_ITERS_PERSIST | GTK_TREE_MODEL_LIST_ONLY;
-}
-
-static int
-get_n_columns (GtkTreeModel *model)
-{
- g_return_val_if_fail (E_IS_MEETING_STORE (model), 0);
-
- return E_MEETING_STORE_COLUMN_COUNT;
-}
-
-static GType
-get_column_type (GtkTreeModel *model, int col)
-{
- g_return_val_if_fail (E_IS_MEETING_STORE (model), G_TYPE_INVALID);
-
- switch (col) {
- case E_MEETING_STORE_ADDRESS_COL:
- case E_MEETING_STORE_MEMBER_COL:
- case E_MEETING_STORE_TYPE_COL:
- case E_MEETING_STORE_ROLE_COL:
- case E_MEETING_STORE_RSVP_COL:
- case E_MEETING_STORE_DELTO_COL:
- case E_MEETING_STORE_DELFROM_COL:
- case E_MEETING_STORE_STATUS_COL:
- case E_MEETING_STORE_CN_COL:
- case E_MEETING_STORE_LANGUAGE_COL:
- case E_MEETING_STORE_ATTENDEE_COL:
- return G_TYPE_STRING;
- case E_MEETING_STORE_ATTENDEE_UNDERLINE_COL:
- return PANGO_TYPE_UNDERLINE;
- default:
- return G_TYPE_INVALID;
- }
-}
-
-static gboolean
-get_iter (GtkTreeModel *model, GtkTreeIter *iter, GtkTreePath *path)
-{
- int row;
-
- g_return_val_if_fail (E_IS_MEETING_STORE (model), FALSE);
- g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE);
-
- row = gtk_tree_path_get_indices (path) [0];
-
- if (!ROW_VALID (E_MEETING_STORE (model), row))
- return FALSE;
-
- iter->stamp = E_MEETING_STORE (model)->priv->stamp;
- iter->user_data = GINT_TO_POINTER (row);
-
- return TRUE;
-}
-
-static GtkTreePath *
-get_path (GtkTreeModel *model, GtkTreeIter *iter)
-{
- int row;
- GtkTreePath *result;
-
- g_return_val_if_fail (E_IS_MEETING_STORE (model), NULL);
- g_return_val_if_fail (iter->stamp == E_MEETING_STORE (model)->priv->stamp, NULL);
-
- row = GPOINTER_TO_INT (iter->user_data);
-
- g_return_val_if_fail (ROW_VALID (E_MEETING_STORE (model), row), NULL);
-
- result = gtk_tree_path_new ();
- gtk_tree_path_append_index (result, row);
- return result;
-}
-
-static void
-get_value (GtkTreeModel *model, GtkTreeIter *iter, int col, GValue *value)
-{
- EMeetingStore *store;
- EMeetingAttendee *attendee;
- const gchar *cn;
- int row;
-
- g_return_if_fail (E_IS_MEETING_STORE (model));
- g_return_if_fail (col >= 0 && col < E_MEETING_STORE_COLUMN_COUNT);
-
- row = GPOINTER_TO_INT (iter->user_data);
- store = E_MEETING_STORE (model);
-
- g_return_if_fail (iter->stamp == store->priv->stamp);
- g_return_if_fail (ROW_VALID (E_MEETING_STORE (model), row));
-
- attendee = g_ptr_array_index (store->priv->attendees, row);
-
- switch (col) {
- case E_MEETING_STORE_ADDRESS_COL:
- g_value_init (value, G_TYPE_STRING);
- g_value_set_string (value, itip_strip_mailto (e_meeting_attendee_get_address (attendee)));
- break;
- case E_MEETING_STORE_MEMBER_COL:
- g_value_init (value, G_TYPE_STRING);
- g_value_set_string (value, e_meeting_attendee_get_member (attendee));
- break;
- case E_MEETING_STORE_TYPE_COL:
- g_value_init (value, G_TYPE_STRING);
- g_value_set_string (value, type_to_text (e_meeting_attendee_get_cutype (attendee)));
- break;
- case E_MEETING_STORE_ROLE_COL:
- g_value_init (value, G_TYPE_STRING);
- g_value_set_string (value, role_to_text (e_meeting_attendee_get_role (attendee)));
- break;
- case E_MEETING_STORE_RSVP_COL:
- g_value_init (value, G_TYPE_STRING);
- g_value_set_string (value, boolean_to_text (e_meeting_attendee_get_rsvp (attendee)));
- break;
- case E_MEETING_STORE_DELTO_COL:
- g_value_init (value, G_TYPE_STRING);
- g_value_set_string (value, itip_strip_mailto (e_meeting_attendee_get_delto (attendee)));
- break;
- case E_MEETING_STORE_DELFROM_COL:
- g_value_init (value, G_TYPE_STRING);
- g_value_set_string (value, itip_strip_mailto (e_meeting_attendee_get_delfrom (attendee)));
- break;
- case E_MEETING_STORE_STATUS_COL:
- g_value_init (value, G_TYPE_STRING);
- g_value_set_string (value, partstat_to_text (e_meeting_attendee_get_status (attendee)));
- break;
- case E_MEETING_STORE_CN_COL:
- g_value_init (value, G_TYPE_STRING);
- g_value_set_string (value, e_meeting_attendee_get_cn (attendee));
- break;
- case E_MEETING_STORE_LANGUAGE_COL:
- g_value_init (value, G_TYPE_STRING);
- g_value_set_string (value, e_meeting_attendee_get_language (attendee));
- break;
- case E_MEETING_STORE_ATTENDEE_COL:
- g_value_init (value, G_TYPE_STRING);
- cn = e_meeting_attendee_get_cn (attendee);
- if (strcmp (cn, ""))
- g_value_set_string (value, cn);
- else
- g_value_set_string (value, itip_strip_mailto (e_meeting_attendee_get_address (attendee)));
- break;
- case E_MEETING_STORE_ATTENDEE_UNDERLINE_COL:
- cn = e_meeting_attendee_get_cn (attendee);
- g_value_init (value, PANGO_TYPE_UNDERLINE);
- g_value_set_enum (value, strcmp ("", cn) == 0 ? PANGO_UNDERLINE_NONE : PANGO_UNDERLINE_SINGLE);
- }
-}
-
-static gboolean
-iter_next (GtkTreeModel *model, GtkTreeIter *iter)
-{
- int row;
-
- g_return_val_if_fail (E_IS_MEETING_STORE (model), FALSE);
- g_return_val_if_fail (iter->stamp == E_MEETING_STORE (model)->priv->stamp, FALSE);
-
- row = GPOINTER_TO_INT (iter->user_data) + 1;
- iter->user_data = GINT_TO_POINTER (row);
-
- return ROW_VALID (E_MEETING_STORE (model), row);
-}
-
-static gboolean
-iter_children (GtkTreeModel *model, GtkTreeIter *iter, GtkTreeIter *parent)
-{
- EMeetingStore *store;
-
- g_return_val_if_fail (E_IS_MEETING_STORE (model), FALSE);
-
- store = E_MEETING_STORE (model);
-
- if (parent || store->priv->attendees->len <= 0)
- return FALSE;
-
- iter->stamp = store->priv->stamp;
- iter->user_data = GINT_TO_POINTER (0);
-
- return TRUE;
-}
-
-static gboolean
-iter_has_child (GtkTreeModel *model, GtkTreeIter *iter)
-{
- return FALSE;
-}
-
-static int
-iter_n_children (GtkTreeModel *model, GtkTreeIter *iter)
-{
- g_return_val_if_fail (E_IS_MEETING_STORE (model), -1);
-
- if (!iter)
- return E_MEETING_STORE (model)->priv->attendees->len;
-
- g_return_val_if_fail (iter->stamp == E_MEETING_STORE (model)->priv->stamp, -1);
-
- return 0;
-}
-
-static gboolean
-iter_nth_child (GtkTreeModel *model, GtkTreeIter *iter, GtkTreeIter *parent, int n)
-{
- EMeetingStore *store;
-
- g_return_val_if_fail (E_IS_MEETING_STORE (model), FALSE);
-
- store = E_MEETING_STORE (model);
-
- if (parent || !ROW_VALID (store, n))
- return FALSE;
-
- iter->stamp = store->priv->stamp;
- iter->user_data = GINT_TO_POINTER (n);
-
- return TRUE;
-}
-
-static gboolean
-iter_parent (GtkTreeModel *model, GtkTreeIter *iter, GtkTreeIter *child)
-{
- return FALSE;
-}
-
-static void
-ems_tree_model_init (GtkTreeModelIface *iface)
-{
- iface->get_flags = get_flags;
- iface->get_n_columns = get_n_columns;
- iface->get_column_type = get_column_type;
- iface->get_iter = get_iter;
- iface->get_path = get_path;
- iface->get_value = get_value;
- iface->iter_next = iter_next;
- iface->iter_children = iter_children;
- iface->iter_has_child = iter_has_child;
- iface->iter_n_children = iter_n_children;
- iface->iter_nth_child = iter_nth_child;
- iface->iter_parent = iter_parent;
-}
-
-void
-e_meeting_store_set_value (EMeetingStore *store, int row, int col, const gchar *val)
-{
- icalparameter_cutype type;
- EMeetingAttendee *attendee = g_ptr_array_index (store->priv->attendees, row);
-
- switch (col) {
- case E_MEETING_STORE_ADDRESS_COL:
- if (val != NULL && *((char *)val))
- e_meeting_attendee_set_address (attendee, g_strdup_printf ("MAILTO:%s", (char *) val));
- break;
- case E_MEETING_STORE_MEMBER_COL:
- e_meeting_attendee_set_member (attendee, g_strdup (val));
- break;
- case E_MEETING_STORE_TYPE_COL:
- type = text_to_type (val);
- e_meeting_attendee_set_cutype (attendee, text_to_type (val));
- if (type == ICAL_CUTYPE_RESOURCE) {
- e_meeting_attendee_set_role (attendee, ICAL_ROLE_NONPARTICIPANT);
- }
- break;
- case E_MEETING_STORE_ROLE_COL:
- e_meeting_attendee_set_role (attendee, text_to_role (val));
- break;
- case E_MEETING_STORE_RSVP_COL:
- e_meeting_attendee_set_rsvp (attendee, text_to_boolean (val));
- break;
- case E_MEETING_STORE_DELTO_COL:
- e_meeting_attendee_set_delto (attendee, g_strdup (val));
- break;
- case E_MEETING_STORE_DELFROM_COL:
- e_meeting_attendee_set_delfrom (attendee, g_strdup (val));
- break;
- case E_MEETING_STORE_STATUS_COL:
- e_meeting_attendee_set_status (attendee, text_to_partstat (val));
- break;
- case E_MEETING_STORE_CN_COL:
- e_meeting_attendee_set_cn (attendee, g_strdup (val));
- break;
- case E_MEETING_STORE_LANGUAGE_COL:
- e_meeting_attendee_set_language (attendee, g_strdup (val));
- break;
- }
-}
-
-static gboolean
-is_cell_editable (EMeetingStore *etm, int col, int row)
-{
- EMeetingStore *store;
- EMeetingStorePrivate *priv;
- EMeetingAttendee *attendee;
- EMeetingAttendeeEditLevel level;
-
- store = E_MEETING_STORE (etm);
- priv = store->priv;
-
- if (col == E_MEETING_STORE_DELTO_COL
- || col == E_MEETING_STORE_DELFROM_COL)
- return FALSE;
-
- if (row == -1)
- return TRUE;
- if (row >= priv->attendees->len)
- return TRUE;
-
- attendee = g_ptr_array_index (priv->attendees, row);
- level = e_meeting_attendee_get_edit_level (attendee);
-
- switch (level) {
- case E_MEETING_ATTENDEE_EDIT_FULL:
- return TRUE;
- case E_MEETING_ATTENDEE_EDIT_STATUS:
- return col == E_MEETING_STORE_STATUS_COL;
- case E_MEETING_ATTENDEE_EDIT_NONE:
- return FALSE;
- }
-
- return TRUE;
-}
-
-static void
-refresh_queue_remove (EMeetingStore *store, EMeetingAttendee *attendee)
-{
- EMeetingStorePrivate *priv;
- EMeetingStoreQueueData *qdata;
-
- priv = store->priv;
-
- /* Free the queue data */
- qdata = g_hash_table_lookup (priv->refresh_data, itip_strip_mailto (e_meeting_attendee_get_address (attendee)));
- if (qdata) {
- g_mutex_lock (priv->mutex);
- g_hash_table_remove (priv->refresh_data, itip_strip_mailto (e_meeting_attendee_get_address (attendee)));
- g_mutex_unlock (priv->mutex);
- g_ptr_array_free (qdata->call_backs, TRUE);
- g_ptr_array_free (qdata->data, TRUE);
- g_free (qdata);
- }
-
- /* Unref the attendee */
- g_ptr_array_remove (priv->refresh_queue, attendee);
- g_object_unref (attendee);
-}
-
-static void
-ems_finalize (GObject *obj)
-{
- EMeetingStore *store = E_MEETING_STORE (obj);
- EMeetingStorePrivate *priv;
- int i;
-
- priv = store->priv;
-
- for (i = 0; i < priv->attendees->len; i++)
- g_object_unref (g_ptr_array_index (priv->attendees, i));
- g_ptr_array_free (priv->attendees, TRUE);
-
- if (priv->client != NULL)
- g_object_unref (priv->client);
-
- if (priv->ebook != NULL)
- g_object_unref (priv->ebook);
-
- while (priv->refresh_queue->len > 0)
- refresh_queue_remove (store, g_ptr_array_index (priv->refresh_queue, 0));
- g_ptr_array_free (priv->refresh_queue, TRUE);
- g_hash_table_destroy (priv->refresh_data);
-
- if (priv->refresh_idle_id)
- g_source_remove (priv->refresh_idle_id);
-
- if (priv->callback_idle_id)
- g_source_remove (priv->callback_idle_id);
-
- g_free (priv->fb_uri);
-
- g_mutex_free (priv->mutex);
-
- g_async_queue_unref (priv->async_queue);
-
- g_free (priv);
-
- if (G_OBJECT_CLASS (parent_class)->finalize)
- (* G_OBJECT_CLASS (parent_class)->finalize) (obj);
-}
-
-static void
-ems_class_init (GObjectClass *klass)
-{
- parent_class = g_type_class_peek_parent (klass);
-
- klass->finalize = ems_finalize;
-}
-
-
-static void
-ems_init (EMeetingStore *store)
-{
- EMeetingStorePrivate *priv;
-
- priv = g_new0 (EMeetingStorePrivate, 1);
-
- store->priv = priv;
-
- priv->attendees = g_ptr_array_new ();
-
- priv->zone = calendar_config_get_icaltimezone ();
-
- priv->fb_uri = calendar_config_get_free_busy_template ();
-
- priv->refresh_queue = g_ptr_array_new ();
- priv->refresh_data = g_hash_table_new (g_str_hash, g_str_equal);
-
- priv->mutex = g_mutex_new ();
-
- priv->async_queue = g_async_queue_new ();
-
- start_addressbook_server (store);
-}
-
-GType
-e_meeting_store_get_type (void)
-{
- static GType ems_type = 0;
-
- if (!ems_type) {
- static const GTypeInfo ems_info = {
- sizeof (EMeetingStoreClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) ems_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EMeetingStore),
- 0,
- (GInstanceInitFunc) ems_init };
-
- static const GInterfaceInfo tree_model_info = {
- (GInterfaceInitFunc) ems_tree_model_init,
- NULL,
- NULL };
-
- ems_type = g_type_register_static (GTK_TYPE_LIST_STORE,
- "EMeetingStore",
- &ems_info, 0);
-
- g_type_add_interface_static (ems_type,
- GTK_TYPE_TREE_MODEL,
- &tree_model_info);
- }
-
- return ems_type;
-}
-
-GObject *
-e_meeting_store_new (void)
-{
- return g_object_new (E_TYPE_MEETING_STORE, NULL);
-}
-
-
-ECal *
-e_meeting_store_get_e_cal (EMeetingStore *store)
-{
- return store->priv->client;
-}
-
-void
-e_meeting_store_set_e_cal (EMeetingStore *store, ECal *client)
-{
- if (store->priv->client != NULL)
- g_object_unref (store->priv->client);
-
- if (client != NULL)
- g_object_ref (client);
- store->priv->client = client;
-}
-
-icaltimezone *
-e_meeting_store_get_zone (EMeetingStore *store)
-{
- g_return_val_if_fail (E_IS_MEETING_STORE (store), NULL);
-
- return store->priv->zone;
-}
-
-void
-e_meeting_store_set_zone (EMeetingStore *store, icaltimezone *zone)
-{
- g_return_if_fail (E_IS_MEETING_STORE (store));
-
- store->priv->zone = zone;
-}
-
-gchar *
-e_meeting_store_get_fb_uri (EMeetingStore *store)
-{
- g_return_val_if_fail (E_IS_MEETING_STORE (store), NULL);
-
- return g_strdup (store->priv->fb_uri);
-}
-
-void
-e_meeting_store_set_fb_uri (EMeetingStore *store, const gchar *fb_uri)
-{
- g_return_if_fail (E_IS_MEETING_STORE (store));
-
- g_free (store->priv->fb_uri);
- store->priv->fb_uri = g_strdup (fb_uri);
-}
-
-static void
-attendee_changed_cb (EMeetingAttendee *attendee, gpointer data)
-{
- EMeetingStore *store = E_MEETING_STORE (data);
- GtkTreePath *path;
- GtkTreeIter iter;
- gint row = -1, i;
-
- for (i = 0; i < store->priv->attendees->len; i++) {
- if (attendee == g_ptr_array_index (store->priv->attendees, i)) {
- row = i;
- break;
- }
- }
-
- if (row == -1)
- return;
-
- path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, row);
- get_iter (GTK_TREE_MODEL (store), &iter, path);
- gtk_tree_model_row_changed (GTK_TREE_MODEL (store), path, &iter);
- gtk_tree_path_free (path);
-}
-
-void
-e_meeting_store_add_attendee (EMeetingStore *store, EMeetingAttendee *attendee)
-{
- GtkTreePath *path;
- GtkTreeIter iter;
-
- g_return_if_fail (E_IS_MEETING_STORE (store));
-
- g_object_ref (attendee);
- g_ptr_array_add (store->priv->attendees, attendee);
-
- g_signal_connect (attendee, "changed", G_CALLBACK (attendee_changed_cb), store);
-
- path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, store->priv->attendees->len - 1);
- get_iter (GTK_TREE_MODEL (store), &iter, path);
- gtk_tree_model_row_inserted (GTK_TREE_MODEL (store), path, &iter);
- gtk_tree_path_free (path);
-}
-
-EMeetingAttendee *
-e_meeting_store_add_attendee_with_defaults (EMeetingStore *store)
-{
- EMeetingAttendee *attendee;
- char *str;
-
- attendee = E_MEETING_ATTENDEE (e_meeting_attendee_new ());
-
- e_meeting_attendee_set_address (attendee, g_strdup (""));
- e_meeting_attendee_set_member (attendee, g_strdup (""));
-
- str = g_strdup (_("Individual"));
- e_meeting_attendee_set_cutype (attendee, text_to_type (str));
- g_free (str);
- str = g_strdup (_("Required Participant"));
- e_meeting_attendee_set_role (attendee, text_to_role (str));
- g_free (str);
- str = g_strdup (_("Yes"));
- e_meeting_attendee_set_rsvp (attendee, text_to_boolean (str));
- g_free (str);
-
- e_meeting_attendee_set_delto (attendee, g_strdup (""));
- e_meeting_attendee_set_delfrom (attendee, g_strdup (""));
-
- str = g_strdup (_("Needs Action"));
- e_meeting_attendee_set_status (attendee, text_to_partstat (str));
- g_free (str);
-
- e_meeting_attendee_set_cn (attendee, g_strdup (""));
- e_meeting_attendee_set_language (attendee, g_strdup ("en"));
-
- e_meeting_store_add_attendee (store, attendee);
-
- return attendee;
-}
-
-void
-e_meeting_store_remove_attendee (EMeetingStore *store, EMeetingAttendee *attendee)
-{
- gint i, row = -1;
- GtkTreePath *path;
-
- for (i = 0; i < store->priv->attendees->len; i++) {
- if (attendee == g_ptr_array_index (store->priv->attendees, i)) {
- row = i;
- break;
- }
- }
-
- if (row != -1) {
-
- g_ptr_array_remove_index (store->priv->attendees, row);
- g_object_unref (attendee);
-
- path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, row);
- gtk_tree_model_row_deleted (GTK_TREE_MODEL (store), path);
- gtk_tree_path_free (path);
- }
-}
-
-void
-e_meeting_store_remove_all_attendees (EMeetingStore *store)
-{
- gint i;
- GtkTreePath *path = gtk_tree_path_new ();
-
- gtk_tree_path_append_index (path, 0);
-
- for (i = 0; i < store->priv->attendees->len; i++) {
- EMeetingAttendee *attendee = g_ptr_array_index (store->priv->attendees, i);
- g_object_unref (attendee);
-
- gtk_tree_model_row_deleted (GTK_TREE_MODEL (store), path);
- gtk_tree_path_next (path);
- }
-
- g_ptr_array_set_size (store->priv->attendees, 0);
- gtk_tree_path_free (path);
-}
-
-EMeetingAttendee *
-e_meeting_store_find_attendee (EMeetingStore *store, const gchar *address, gint *row)
-{
- EMeetingAttendee *attendee;
- int i;
-
- if (address == NULL)
- return NULL;
-
- for (i = 0; i < store->priv->attendees->len; i++) {
- const gchar *attendee_address;
-
- attendee = g_ptr_array_index (store->priv->attendees, i);
-
- attendee_address = e_meeting_attendee_get_address (attendee);
- if (attendee_address && !g_strcasecmp (itip_strip_mailto (attendee_address), itip_strip_mailto (address))) {
- if (row != NULL)
- *row = i;
-
- return attendee;
- }
- }
-
- return NULL;
-}
-
-EMeetingAttendee *
-e_meeting_store_find_attendee_at_row (EMeetingStore *store, gint row)
-{
- g_return_val_if_fail (E_IS_MEETING_STORE (store), NULL);
- g_return_val_if_fail (ROW_VALID (store, row), NULL);
-
- return g_ptr_array_index (store->priv->attendees, row);
-}
-
-GtkTreePath *
-e_meeting_store_find_attendee_path (EMeetingStore *store, EMeetingAttendee *attendee)
-{
- GtkTreePath *path;
- gint row = -1, i;
-
- for (i = 0; i < store->priv->attendees->len; i++) {
- if (attendee == g_ptr_array_index (store->priv->attendees, i)) {
- row = i;
- break;
- }
- }
-
- if (row == -1)
- return NULL;
-
- path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, row);
-
- return path;
-}
-
-gint
-e_meeting_store_count_actual_attendees (EMeetingStore *store)
-{
- g_return_val_if_fail (E_IS_MEETING_STORE (store), 0);
-
- return store->priv->attendees->len;
-}
-
-const GPtrArray *
-e_meeting_store_get_attendees (EMeetingStore *store)
-{
- g_return_val_if_fail (E_IS_MEETING_STORE (store), NULL);
-
- return store->priv->attendees;
-}
-
-static icaltimezone *
-find_zone (icalproperty *ip, icalcomponent *tz_top_level)
-{
- icalparameter *param;
- icalcomponent *sub_comp;
- const char *tzid;
- icalcompiter iter;
-
- if (tz_top_level == NULL)
- return NULL;
-
- param = icalproperty_get_first_parameter (ip, ICAL_TZID_PARAMETER);
- if (param == NULL)
- return NULL;
- tzid = icalparameter_get_tzid (param);
-
- iter = icalcomponent_begin_component (tz_top_level, ICAL_VTIMEZONE_COMPONENT);
- while ((sub_comp = icalcompiter_deref (&iter)) != NULL) {
- icalcomponent *clone;
- icalproperty *prop;
- const char *tz_tzid;
-
- prop = icalcomponent_get_first_property (sub_comp, ICAL_TZID_PROPERTY);
- tz_tzid = icalproperty_get_tzid (prop);
- if (!strcmp (tzid, tz_tzid)) {
- icaltimezone *zone;
-
- zone = icaltimezone_new ();
- clone = icalcomponent_new_clone (sub_comp);
- icaltimezone_set_component (zone, clone);
-
- return zone;
- }
-
- icalcompiter_next (&iter);
- }
-
- return NULL;
-}
-
-typedef struct {
- EMeetingStoreRefreshCallback call_back;
- gpointer *data;
-} QueueCbData;
-
-/* Process the callbacks in the main thread. Avoids widget redrawing issues. */
-static gboolean
-process_callbacks_main_thread (EMeetingStore *store)
-{
- EMeetingStorePrivate *priv;
- QueueCbData *aqueue_data;
- gboolean threads_done = FALSE;
-
- priv = store->priv;
-
- g_mutex_lock (priv->mutex);
- if (priv->num_threads == 0) {
- threads_done = TRUE;
- priv->callback_idle_id = 0;
- }
- g_mutex_unlock (priv->mutex);
-
- while ((aqueue_data = g_async_queue_try_pop (priv->async_queue)) != NULL) {
- aqueue_data->call_back (aqueue_data->data);
-
- g_free (aqueue_data);
- }
-
- return !threads_done;
-}
-
-static void
-process_callbacks (EMeetingStoreQueueData *qdata)
-{
- EMeetingStore *store;
- int i;
-
- store = qdata->store;
-
- for (i = 0; i < qdata->call_backs->len; i++) {
- QueueCbData *aqueue_data = g_new0 (QueueCbData, 1);
-
- aqueue_data->call_back = g_ptr_array_index (qdata->call_backs, i);
- aqueue_data->data = g_ptr_array_index (qdata->data, i);
-
- g_async_queue_push (store->priv->async_queue, aqueue_data);
- }
-
- g_mutex_lock (store->priv->mutex);
- store->priv->num_threads--;
- g_mutex_unlock (store->priv->mutex);
-
- refresh_queue_remove (qdata->store, qdata->attendee);
- g_async_queue_unref (store->priv->async_queue);
- g_object_unref (store);
-}
-
-static void
-process_free_busy_comp (EMeetingAttendee *attendee,
- icalcomponent *fb_comp,
- icaltimezone *zone,
- icalcomponent *tz_top_level)
-{
- icalproperty *ip;
-
- ip = icalcomponent_get_first_property (fb_comp, ICAL_DTSTART_PROPERTY);
- if (ip != NULL) {
- struct icaltimetype dtstart;
- icaltimezone *ds_zone;
-
- dtstart = icalproperty_get_dtstart (ip);
- if (!dtstart.is_utc)
- ds_zone = find_zone (ip, tz_top_level);
- else
- ds_zone = icaltimezone_get_utc_timezone ();
- icaltimezone_convert_time (&dtstart, ds_zone, zone);
- e_meeting_attendee_set_start_busy_range (attendee,
- dtstart.year,
- dtstart.month,
- dtstart.day,
- dtstart.hour,
- dtstart.minute);
- }
-
- ip = icalcomponent_get_first_property (fb_comp, ICAL_DTEND_PROPERTY);
- if (ip != NULL) {
- struct icaltimetype dtend;
- icaltimezone *de_zone;
-
- dtend = icalproperty_get_dtend (ip);
- if (!dtend.is_utc)
- de_zone = find_zone (ip, tz_top_level);
- else
- de_zone = icaltimezone_get_utc_timezone ();
- icaltimezone_convert_time (&dtend, de_zone, zone);
- e_meeting_attendee_set_end_busy_range (attendee,
- dtend.year,
- dtend.month,
- dtend.day,
- dtend.hour,
- dtend.minute);
- }
-
- ip = icalcomponent_get_first_property (fb_comp, ICAL_FREEBUSY_PROPERTY);
- while (ip != NULL) {
- icalparameter *param;
- struct icalperiodtype fb;
- EMeetingFreeBusyType busy_type = E_MEETING_FREE_BUSY_LAST;
- icalparameter_fbtype fbtype = ICAL_FBTYPE_BUSY;
-
- fb = icalproperty_get_freebusy (ip);
- param = icalproperty_get_first_parameter (ip, ICAL_FBTYPE_PARAMETER);
- if (param != NULL)
- fbtype = icalparameter_get_fbtype (param);
-
- switch (fbtype) {
- case ICAL_FBTYPE_BUSY:
- busy_type = E_MEETING_FREE_BUSY_BUSY;
- break;
-
- case ICAL_FBTYPE_BUSYUNAVAILABLE:
- busy_type = E_MEETING_FREE_BUSY_OUT_OF_OFFICE;
- break;
-
- case ICAL_FBTYPE_BUSYTENTATIVE:
- busy_type = E_MEETING_FREE_BUSY_TENTATIVE;
- break;
-
- default:
- break;
- }
-
- if (busy_type != E_MEETING_FREE_BUSY_LAST) {
- icaltimezone *utc_zone = icaltimezone_get_utc_timezone ();
-
- icaltimezone_convert_time (&fb.start, utc_zone, zone);
- icaltimezone_convert_time (&fb.end, utc_zone, zone);
- e_meeting_attendee_add_busy_period (attendee,
- fb.start.year,
- fb.start.month,
- fb.start.day,
- fb.start.hour,
- fb.start.minute,
- fb.end.year,
- fb.end.month,
- fb.end.day,
- fb.end.hour,
- fb.end.minute,
- busy_type);
- }
-
- ip = icalcomponent_get_next_property (fb_comp, ICAL_FREEBUSY_PROPERTY);
- }
-}
-
-static void
-process_free_busy (EMeetingStoreQueueData *qdata, char *text)
-{
- EMeetingStore *store = qdata->store;
- EMeetingStorePrivate *priv;
- EMeetingAttendee *attendee = qdata->attendee;
- icalcomponent *main_comp;
- icalcomponent_kind kind = ICAL_NO_COMPONENT;
-
- priv = store->priv;
-
- main_comp = icalparser_parse_string (text);
- if (main_comp == NULL) {
- process_callbacks (qdata);
- return;
- }
-
- kind = icalcomponent_isa (main_comp);
- if (kind == ICAL_VCALENDAR_COMPONENT) {
- icalcompiter iter;
- icalcomponent *tz_top_level, *sub_comp;
-
- tz_top_level = e_cal_util_new_top_level ();
-
- iter = icalcomponent_begin_component (main_comp, ICAL_VTIMEZONE_COMPONENT);
- while ((sub_comp = icalcompiter_deref (&iter)) != NULL) {
- icalcomponent *clone;
-
- clone = icalcomponent_new_clone (sub_comp);
- icalcomponent_add_component (tz_top_level, clone);
-
- icalcompiter_next (&iter);
- }
-
- iter = icalcomponent_begin_component (main_comp, ICAL_VFREEBUSY_COMPONENT);
- while ((sub_comp = icalcompiter_deref (&iter)) != NULL) {
- process_free_busy_comp (attendee, sub_comp, priv->zone, tz_top_level);
-
- icalcompiter_next (&iter);
- }
- icalcomponent_free (tz_top_level);
- } else if (kind == ICAL_VFREEBUSY_COMPONENT) {
- process_free_busy_comp (attendee, main_comp, priv->zone, NULL);
- }
-
- icalcomponent_free (main_comp);
-
- process_callbacks (qdata);
-}
-
-/*
- * Replace all instances of from_value in string with to_value
- * In the returned newly allocated string.
-*/
-static gchar *
-replace_string (gchar *string, gchar *from_value, gchar *to_value)
-{
- gchar *replaced;
- gchar **split_uri;
-
- split_uri = g_strsplit (string, from_value, 0);
- replaced = g_strjoinv (to_value, split_uri);
- g_strfreev (split_uri);
-
- return replaced;
-}
-
-typedef struct {
- ECal *client;
- time_t startt;
- time_t endt;
- GList *users;
- GList *fb_data;
- char *fb_uri;
- char *email;
- EMeetingAttendee *attendee;
- EMeetingStoreQueueData *qdata;
-} FreeBusyAsyncData;
-
-#define USER_SUB "%u"
-#define DOMAIN_SUB "%d"
-
-static gboolean
-freebusy_async (gpointer data)
-{
- FreeBusyAsyncData *fbd = data;
- EMeetingAttendee *attendee = fbd->attendee;
- gchar *default_fb_uri;
-
- if (fbd->client) {
- e_cal_get_free_busy (fbd->client, fbd->users, fbd->startt, fbd->endt, &(fbd->fb_data), NULL);
-
- g_list_foreach (fbd->users, (GFunc)g_free, NULL);
- g_list_free (fbd->users);
-
- if (fbd->fb_data != NULL) {
- ECalComponent *comp = fbd->fb_data->data;
- char *comp_str;
-
- comp_str = e_cal_component_get_as_string (comp);
- process_free_busy (fbd->qdata, comp_str);
- g_free (comp_str);
-
- return TRUE;
- }
- }
-
- /* Look for fburl's of attendee with no free busy info on server */
- if (!e_meeting_attendee_is_set_address (attendee)) {
- process_callbacks (fbd->qdata);
- return TRUE;
- }
-
-
-
- /* Check for free busy info on the default server */
- default_fb_uri = g_strdup (fbd->fb_uri);
-
- if (default_fb_uri != NULL && !g_str_equal (default_fb_uri, "")) {
- GnomeVFSAsyncHandle *handle;
- gchar *tmp_fb_uri;
- gchar **split_email;
-
- split_email = g_strsplit (fbd->email, "@", 2);
-
- tmp_fb_uri = replace_string (default_fb_uri, USER_SUB, split_email[0]);
- g_free (default_fb_uri);
- default_fb_uri = replace_string (tmp_fb_uri, DOMAIN_SUB, split_email[1]);
-
- gnome_vfs_async_open (&handle, default_fb_uri, GNOME_VFS_OPEN_READ,
- GNOME_VFS_PRIORITY_DEFAULT, start_async_read,
- fbd->qdata);
-
- g_free (tmp_fb_uri);
- g_strfreev (split_email);
- g_free (default_fb_uri);
- } else {
- process_callbacks (fbd->qdata);
- }
-
- return TRUE;
-
-
-}
-
-#undef USER_SUB
-#undef DOMAIN_SUB
-
-
-static gboolean
-refresh_busy_periods (gpointer data)
-{
- EMeetingStore *store = E_MEETING_STORE (data);
- EMeetingStorePrivate *priv;
- EMeetingAttendee *attendee = NULL;
- EMeetingStoreQueueData *qdata = NULL;
- int i;
- GThread *thread;
- GError *error = NULL;
- FreeBusyAsyncData *fbd;
-
- priv = store->priv;
-
- /* Check to see if there are any remaining attendees in the queue */
- for (i = 0; i < priv->refresh_queue->len; i++) {
- attendee = g_ptr_array_index (priv->refresh_queue, i);
- g_assert (attendee != NULL);
-
- qdata = g_hash_table_lookup (priv->refresh_data, itip_strip_mailto (e_meeting_attendee_get_address (attendee)));
- if (!qdata)
- continue;
-
- if (!qdata->refreshing)
- break;
- }
-
- /* The everything in the queue is being refreshed */
- if (i >= priv->refresh_queue->len) {
- priv->refresh_idle_id = 0;
- return FALSE;
- }
-
- /* Indicate we are trying to refresh it */
- qdata->refreshing = TRUE;
-
- /* We take a ref in case we get destroyed in the gui during a callback */
- g_object_ref (qdata->store);
-
- fbd = g_new0 (FreeBusyAsyncData, 1);
- fbd->client = priv->client;
- fbd->attendee = attendee;
- fbd->users = NULL;
- fbd->fb_data = NULL;
- fbd->qdata = qdata;
- fbd->fb_uri = priv->fb_uri;
- fbd->email = g_strdup (itip_strip_mailto (e_meeting_attendee_get_address (attendee)));
-
- /* Check the server for free busy data */
- if (priv->client) {
- struct icaltimetype itt;
-
- itt = icaltime_null_time ();
- itt.year = g_date_year (&qdata->start.date);
- itt.month = g_date_month (&qdata->start.date);
- itt.day = g_date_day (&qdata->start.date);
- itt.hour = qdata->start.hour;
- itt.minute = qdata->start.minute;
- fbd->startt = icaltime_as_timet_with_zone (itt, priv->zone);
-
- itt = icaltime_null_time ();
- itt.year = g_date_year (&qdata->end.date);
- itt.month = g_date_month (&qdata->end.date);
- itt.day = g_date_day (&qdata->end.date);
- itt.hour = qdata->end.hour;
- itt.minute = qdata->end.minute;
- fbd->endt = icaltime_as_timet_with_zone (itt, priv->zone);
- fbd->qdata = qdata;
-
- fbd->users = g_list_append (fbd->users, g_strdup (fbd->email));
-
- }
-
-
- g_async_queue_ref (priv->async_queue);
-
- g_mutex_lock (store->priv->mutex);
- store->priv->num_threads++;
- g_mutex_unlock (store->priv->mutex);
-
- thread = g_thread_create ((GThreadFunc) freebusy_async, fbd, FALSE, &error);
- if (!thread) {
- /* do clean up stuff here */
- g_list_foreach (fbd->users, (GFunc)g_free, NULL);
- g_list_free (fbd->users);
- g_free (fbd->email);
- priv->refresh_idle_id = 0;
-
- g_async_queue_unref (priv->async_queue);
-
- g_mutex_lock (store->priv->mutex);
- store->priv->num_threads--;
- g_mutex_unlock (store->priv->mutex);
-
- return FALSE;
- } else if (priv->callback_idle_id == 0) {
- priv->callback_idle_id = g_idle_add (process_callbacks_main_thread,
- store);
- }
- return TRUE;
-}
-
-static void
-refresh_queue_add (EMeetingStore *store, int row,
- EMeetingTime *start,
- EMeetingTime *end,
- EMeetingStoreRefreshCallback call_back,
- gpointer data)
-{
- EMeetingStorePrivate *priv;
- EMeetingAttendee *attendee;
- EMeetingStoreQueueData *qdata;
- int i;
-
- priv = store->priv;
-
- attendee = g_ptr_array_index (priv->attendees, row);
- if ((attendee == NULL) || !strcmp (itip_strip_mailto (e_meeting_attendee_get_address (attendee)), ""))
- return;
-
- /* check the queue if the attendee is already in there*/
- for (i = 0; i < priv->refresh_queue->len; i++) {
- if (attendee == g_ptr_array_index (priv->refresh_queue, i))
- return;
-
- if (!strcmp (e_meeting_attendee_get_address (attendee), e_meeting_attendee_get_address (g_ptr_array_index (priv->refresh_queue, i))))
- return;
- }
-
- g_mutex_lock (priv->mutex);
- qdata = g_hash_table_lookup (priv->refresh_data, itip_strip_mailto (e_meeting_attendee_get_address (attendee)));
-
- if (qdata == NULL) {
- qdata = g_new0 (EMeetingStoreQueueData, 1);
-
- qdata->store = store;
- qdata->attendee = attendee;
- e_meeting_attendee_clear_busy_periods (attendee);
- e_meeting_attendee_set_has_calendar_info (attendee, FALSE);
-
- qdata->start = *start;
- qdata->end = *end;
- qdata->string = g_string_new (NULL);
- qdata->call_backs = g_ptr_array_new ();
- qdata->data = g_ptr_array_new ();
- g_ptr_array_add (qdata->call_backs, call_back);
- g_ptr_array_add (qdata->data, data);
-
- g_hash_table_insert (priv->refresh_data, itip_strip_mailto (e_meeting_attendee_get_address (attendee)), qdata);
- } else {
- if (e_meeting_time_compare_times (start, &qdata->start) == -1)
- qdata->start = *start;
- if (e_meeting_time_compare_times (end, &qdata->end) == -1)
- qdata->end = *end;
- g_ptr_array_add (qdata->call_backs, call_back);
- g_ptr_array_add (qdata->data, data);
- }
- g_mutex_unlock (priv->mutex);
-
-
- g_object_ref (attendee);
- g_ptr_array_add (priv->refresh_queue, attendee);
-
- if (priv->refresh_idle_id == 0)
- priv->refresh_idle_id = g_idle_add (refresh_busy_periods, store);
-}
-
-static void
-async_close (GnomeVFSAsyncHandle *handle,
- GnomeVFSResult result,
- gpointer data)
-{
- EMeetingStoreQueueData *qdata = data;
-
- process_free_busy (qdata, qdata->string->str);
-}
-
-static void
-async_read (GnomeVFSAsyncHandle *handle,
- GnomeVFSResult result,
- gpointer buffer,
- GnomeVFSFileSize requested,
- GnomeVFSFileSize read,
- gpointer data)
-{
- EMeetingStoreQueueData *qdata = data;
- GnomeVFSFileSize buf_size = BUF_SIZE - 1;
-
- if (result != GNOME_VFS_OK && result != GNOME_VFS_ERROR_EOF) {
- gnome_vfs_async_close (handle, async_close, qdata);
- return;
- }
-
- ((char *)buffer)[read] = '\0';
- qdata->string = g_string_append (qdata->string, buffer);
-
- if (result == GNOME_VFS_ERROR_EOF) {
- gnome_vfs_async_close (handle, async_close, qdata);
- return;
- }
-
- gnome_vfs_async_read (handle, qdata->buffer, buf_size, async_read, qdata);
-}
-
-static void
-start_async_read (GnomeVFSAsyncHandle *handle,
- GnomeVFSResult result,
- gpointer data)
-{
- EMeetingStoreQueueData *qdata = data;
- GnomeVFSFileSize buf_size = BUF_SIZE - 1;
-
- if (result != GNOME_VFS_OK) {
- g_warning ("Unable to access free/busy url: %s",
- gnome_vfs_result_to_string (result));
- process_callbacks (qdata);
- return;
- }
-
- gnome_vfs_async_read (handle, qdata->buffer, buf_size, async_read, qdata);
-}
-
-void
-e_meeting_store_refresh_all_busy_periods (EMeetingStore *store,
- EMeetingTime *start,
- EMeetingTime *end,
- EMeetingStoreRefreshCallback call_back,
- gpointer data)
-{
- int i;
-
- g_return_if_fail (E_IS_MEETING_STORE (store));
-
- for (i = 0; i < store->priv->attendees->len; i++)
- refresh_queue_add (store, i, start, end, call_back, data);
-}
-
-void
-e_meeting_store_refresh_busy_periods (EMeetingStore *store,
- int row,
- EMeetingTime *start,
- EMeetingTime *end,
- EMeetingStoreRefreshCallback call_back,
- gpointer data)
-{
- g_return_if_fail (E_IS_MEETING_STORE (store));
-
- refresh_queue_add (store, row, start, end, call_back, data);
-}
diff --git a/calendar/gui/e-meeting-store.h b/calendar/gui/e-meeting-store.h
deleted file mode 100644
index 8d18126422..0000000000
--- a/calendar/gui/e-meeting-store.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * e-meeting-store.h
- *
- * Copyright (C) 2003 Ximian, Inc.
- *
- * Author: Mike Kestner
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef _E_MEETING_STORE_H_
-#define _E_MEETING_STORE_H_
-
-#include <gtk/gtkliststore.h>
-#include <libecal/e-cal.h>
-#include "e-meeting-attendee.h"
-
-G_BEGIN_DECLS
-
-#define E_TYPE_MEETING_STORE (e_meeting_store_get_type ())
-#define E_MEETING_STORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MEETING_STORE, EMeetingStore))
-#define E_MEETING_STORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MEETING_STORE, EMeetingStoreClass))
-#define E_IS_MEETING_STORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MEETING_STORE))
-#define E_IS_MEETING_STORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MEETING_STORE))
-
-typedef struct _EMeetingStore EMeetingStore;
-typedef struct _EMeetingStorePrivate EMeetingStorePrivate;
-typedef struct _EMeetingStoreClass EMeetingStoreClass;
-
-typedef enum {
- E_MEETING_STORE_ADDRESS_COL,
- E_MEETING_STORE_MEMBER_COL,
- E_MEETING_STORE_TYPE_COL,
- E_MEETING_STORE_ROLE_COL,
- E_MEETING_STORE_RSVP_COL,
- E_MEETING_STORE_DELTO_COL,
- E_MEETING_STORE_DELFROM_COL,
- E_MEETING_STORE_STATUS_COL,
- E_MEETING_STORE_CN_COL,
- E_MEETING_STORE_LANGUAGE_COL,
- E_MEETING_STORE_ATTENDEE_COL,
- E_MEETING_STORE_ATTENDEE_UNDERLINE_COL,
- E_MEETING_STORE_COLUMN_COUNT
-} EMeetingStoreColumns;
-
-struct _EMeetingStore {
- GtkListStore parent;
-
- EMeetingStorePrivate *priv;
-};
-
-struct _EMeetingStoreClass {
- GtkListStoreClass parent_class;
-};
-
-typedef void (* EMeetingStoreRefreshCallback) (gpointer data);
-
-GType e_meeting_store_get_type (void);
-GObject *e_meeting_store_new (void);
-
-void e_meeting_store_set_value (EMeetingStore *im, int row, int col, const gchar *val);
-
-ECal *e_meeting_store_get_e_cal (EMeetingStore *im);
-void e_meeting_store_set_e_cal (EMeetingStore *im, ECal *client);
-
-icaltimezone *e_meeting_store_get_zone (EMeetingStore *im);
-void e_meeting_store_set_zone (EMeetingStore *im, icaltimezone *zone);
-
-gchar *e_meeting_store_get_fb_uri (EMeetingStore *im);
-void e_meeting_store_set_fb_uri (EMeetingStore *im, const gchar *fb_uri);
-
-void e_meeting_store_add_attendee (EMeetingStore *im, EMeetingAttendee *ia);
-EMeetingAttendee *e_meeting_store_add_attendee_with_defaults (EMeetingStore *im);
-
-void e_meeting_store_remove_attendee (EMeetingStore *im, EMeetingAttendee *ia);
-void e_meeting_store_remove_all_attendees (EMeetingStore *im);
-
-EMeetingAttendee *e_meeting_store_find_attendee (EMeetingStore *im, const gchar *address, gint *row);
-EMeetingAttendee *e_meeting_store_find_attendee_at_row (EMeetingStore *im, gint row);
-GtkTreePath *e_meeting_store_find_attendee_path (EMeetingStore *store, EMeetingAttendee *attendee);
-
-gint e_meeting_store_count_actual_attendees (EMeetingStore *im);
-const GPtrArray *e_meeting_store_get_attendees (EMeetingStore *im);
-
-void e_meeting_store_refresh_all_busy_periods (EMeetingStore *im,
- EMeetingTime *start,
- EMeetingTime *end,
- EMeetingStoreRefreshCallback call_back,
- gpointer data);
-void e_meeting_store_refresh_busy_periods (EMeetingStore *im,
- int row,
- EMeetingTime *start,
- EMeetingTime *end,
- EMeetingStoreRefreshCallback call_back,
- gpointer data);
-
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/e-meeting-time-sel-item.c b/calendar/gui/e-meeting-time-sel-item.c
deleted file mode 100644
index 74d2931b5e..0000000000
--- a/calendar/gui/e-meeting-time-sel-item.c
+++ /dev/null
@@ -1,991 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@gtk.org>
- *
- * Copyright 1999, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * EMeetingTimeSelectorItem - A GnomeCanvasItem which is used for both the main
- * display canvas and the top display (with the dates, times & All Attendees).
- * I didn't make these separate GnomeCanvasItems since they share a lot of
- * code.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <time.h>
-#include <glib.h>
-#include <libgnome/gnome-i18n.h>
-#include "calendar-config.h"
-#include "e-meeting-time-sel-item.h"
-#include "e-meeting-time-sel.h"
-
-/* Initially the grid lines were drawn at the bottom of cells, but this didn't
- line up well with the GtkEntry widgets, which in the default theme draw a
- black shadow line across the top. So I've switched our code to draw the
- lines across the top of cells. */
-#define E_MEETING_TIME_SELECTOR_DRAW_GRID_LINES_AT_BOTTOM 0
-
-static void e_meeting_time_selector_item_destroy (GtkObject *object);
-
-static void e_meeting_time_selector_item_set_arg (GtkObject *o, GtkArg *arg,
- guint arg_id);
-static void e_meeting_time_selector_item_realize (GnomeCanvasItem *item);
-static void e_meeting_time_selector_item_unrealize (GnomeCanvasItem *item);
-static void e_meeting_time_selector_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path, int flags);
-static void e_meeting_time_selector_item_draw (GnomeCanvasItem *item,
- GdkDrawable *drawable,
- int x, int y,
- int width, int height);
-static double e_meeting_time_selector_item_point (GnomeCanvasItem *item,
- double x, double y,
- int cx, int cy,
- GnomeCanvasItem **actual_item);
-static gint e_meeting_time_selector_item_event (GnomeCanvasItem *item,
- GdkEvent *event);
-static gint e_meeting_time_selector_item_button_press (EMeetingTimeSelectorItem *mts_item,
- GdkEvent *event);
-static gint e_meeting_time_selector_item_button_release (EMeetingTimeSelectorItem *mts_item,
- GdkEvent *event);
-static gint e_meeting_time_selector_item_motion_notify (EMeetingTimeSelectorItem *mts_item,
- GdkEvent *event);
-
-static void e_meeting_time_selector_item_paint_day_top (EMeetingTimeSelectorItem *mts_item,
- GdkDrawable *drawable,
- GDate *date,
- int x, int scroll_y,
- int width, int height);
-static void e_meeting_time_selector_item_paint_all_attendees_busy_periods (EMeetingTimeSelectorItem *mts_item, GdkDrawable *drawable, GDate *date, int x, int y, int width, int height);
-static void e_meeting_time_selector_item_paint_day (EMeetingTimeSelectorItem *mts_item,
- GdkDrawable *drawable,
- GDate *date,
- int x, int scroll_y,
- int width, int height);
-static void e_meeting_time_selector_item_paint_busy_periods (EMeetingTimeSelectorItem *mts_item, GdkDrawable *drawable, GDate *date, int x, int scroll_y, int width, int height);
-static gint e_meeting_time_selector_item_find_first_busy_period (EMeetingTimeSelectorItem *mts_item, GDate *date, gint row);
-static void e_meeting_time_selector_item_paint_attendee_busy_periods (EMeetingTimeSelectorItem *mts_item, GdkDrawable *drawable, int row, int x, int y, int width, int first_period, EMeetingFreeBusyType busy_type);
-
-static EMeetingTimeSelectorPosition e_meeting_time_selector_item_get_drag_position (EMeetingTimeSelectorItem *mts_item, gint x, gint y);
-static gboolean e_meeting_time_selector_item_calculate_busy_range (EMeetingTimeSelector *mts,
- gint row,
- gint x,
- gint width,
- gint *start_x,
- gint *end_x);
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_MEETING_TIME_SELECTOR
-};
-
-G_DEFINE_TYPE (EMeetingTimeSelectorItem, e_meeting_time_selector_item, GNOME_TYPE_CANVAS_ITEM);
-
-static void
-e_meeting_time_selector_item_class_init (EMeetingTimeSelectorItemClass *mts_item_class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass *) mts_item_class;
- item_class = (GnomeCanvasItemClass *) mts_item_class;
-
- gtk_object_add_arg_type ("EMeetingTimeSelectorItem::meeting_time_selector",
- GTK_TYPE_POINTER, GTK_ARG_WRITABLE,
- ARG_MEETING_TIME_SELECTOR);
-
- object_class->destroy = e_meeting_time_selector_item_destroy;
- object_class->set_arg = e_meeting_time_selector_item_set_arg;
-
- /* GnomeCanvasItem method overrides */
- item_class->realize = e_meeting_time_selector_item_realize;
- item_class->unrealize = e_meeting_time_selector_item_unrealize;
- item_class->update = e_meeting_time_selector_item_update;
- item_class->draw = e_meeting_time_selector_item_draw;
- item_class->point = e_meeting_time_selector_item_point;
- item_class->event = e_meeting_time_selector_item_event;
-}
-
-
-static void
-e_meeting_time_selector_item_init (EMeetingTimeSelectorItem *mts_item)
-{
- GnomeCanvasItem *item = GNOME_CANVAS_ITEM (mts_item);
-
- mts_item->mts = NULL;
-
- mts_item->main_gc = NULL;
- mts_item->stipple_gc = NULL;
-
- /* Create the cursors. */
- mts_item->normal_cursor = gdk_cursor_new (GDK_LEFT_PTR);
- mts_item->resize_cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
- mts_item->last_cursor_set = NULL;
-
- item->x1 = 0;
- item->y1 = 0;
- item->x2 = 0;
- item->y2 = 0;
-}
-
-
-static void
-e_meeting_time_selector_item_destroy (GtkObject *object)
-{
- EMeetingTimeSelectorItem *mts_item;
-
- mts_item = E_MEETING_TIME_SELECTOR_ITEM (object);
-
- if (mts_item->normal_cursor) {
- gdk_cursor_destroy (mts_item->normal_cursor);
- mts_item->normal_cursor = NULL;
- }
- if (mts_item->resize_cursor) {
- gdk_cursor_destroy (mts_item->resize_cursor);
- mts_item->resize_cursor = NULL;
- }
-
- if (GTK_OBJECT_CLASS (e_meeting_time_selector_item_parent_class)->destroy)
- (*GTK_OBJECT_CLASS (e_meeting_time_selector_item_parent_class)->destroy)(object);
-}
-
-
-static void
-e_meeting_time_selector_item_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EMeetingTimeSelectorItem *mts_item;
-
- item = GNOME_CANVAS_ITEM (o);
- mts_item = E_MEETING_TIME_SELECTOR_ITEM (o);
-
- switch (arg_id){
- case ARG_MEETING_TIME_SELECTOR:
- mts_item->mts = GTK_VALUE_POINTER (*arg);
- break;
- }
-}
-
-
-static void
-e_meeting_time_selector_item_realize (GnomeCanvasItem *item)
-{
- GnomeCanvas *canvas;
- GdkWindow *window;
- EMeetingTimeSelectorItem *mts_item;
-
- if (GNOME_CANVAS_ITEM_CLASS (e_meeting_time_selector_item_parent_class)->realize)
- (*GNOME_CANVAS_ITEM_CLASS (e_meeting_time_selector_item_parent_class)->realize)(item);
-
- mts_item = E_MEETING_TIME_SELECTOR_ITEM (item);
-
- canvas = item->canvas;
- window = GTK_WIDGET (canvas)->window;
-
- mts_item->main_gc = gdk_gc_new (window);
- mts_item->stipple_gc = gdk_gc_new (window);
-}
-
-
-static void
-e_meeting_time_selector_item_unrealize (GnomeCanvasItem *item)
-{
- EMeetingTimeSelectorItem *mts_item;
-
- mts_item = E_MEETING_TIME_SELECTOR_ITEM (item);
-
- gdk_gc_unref (mts_item->main_gc);
- mts_item->main_gc = NULL;
- gdk_gc_unref (mts_item->stipple_gc);
- mts_item->stipple_gc = NULL;
-
- if (GNOME_CANVAS_ITEM_CLASS (e_meeting_time_selector_item_parent_class)->unrealize)
- (*GNOME_CANVAS_ITEM_CLASS (e_meeting_time_selector_item_parent_class)->unrealize)(item);
-}
-
-
-static void
-e_meeting_time_selector_item_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- if (GNOME_CANVAS_ITEM_CLASS (e_meeting_time_selector_item_parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (e_meeting_time_selector_item_parent_class)->update) (item, affine, clip_path, flags);
-
- /* The grid covers the entire canvas area. */
- item->x1 = 0;
- item->y1 = 0;
- item->x2 = INT_MAX;
- item->y2 = INT_MAX;
-}
-
-
-/*
- * DRAWING ROUTINES - functions to paint the canvas item.
- */
-
-static void
-e_meeting_time_selector_item_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height)
-{
- EMeetingTimeSelector *mts;
- EMeetingTimeSelectorItem *mts_item;
- EMeetingAttendee *ia;
- gint day_x, meeting_start_x, meeting_end_x, bar_y, bar_height;
- gint row, row_y, start_x, end_x;
- GDate date, last_date, current_date;
- gboolean is_display_top, show_meeting_time;
- GdkGC *gc, *stipple_gc;
-
- mts_item = E_MEETING_TIME_SELECTOR_ITEM (item);
- mts = mts_item->mts;
- g_return_if_fail (mts != NULL);
- gc = mts_item->main_gc;
- stipple_gc = mts_item->stipple_gc;
-
- is_display_top = (GTK_WIDGET (item->canvas) == mts->display_top)
- ? TRUE : FALSE;
-
- /* Calculate the first and last visible days and positions. */
- e_meeting_time_selector_calculate_day_and_position (mts, x,
- &date, &day_x);
- e_meeting_time_selector_calculate_day_and_position (mts, x + width,
- &last_date, NULL);
-
- /* For the top display draw the 'All Attendees' row background. */
- if (is_display_top) {
- gdk_gc_set_foreground (gc, &mts->all_attendees_bg_color);
- gdk_draw_rectangle (drawable, gc, TRUE,
- 0, mts->row_height * 2 - y,
- width, mts->row_height);
- } else {
- gdk_gc_set_foreground (gc, &mts->bg_color);
- gdk_draw_rectangle (drawable, gc, TRUE, 0, 0, width, height);
- }
-
- /* Calculate the x coordinates of the meeting time. */
- show_meeting_time = e_meeting_time_selector_get_meeting_time_positions (mts, &meeting_start_x, &meeting_end_x);
-
- /* Draw the meeting time background. */
- if (show_meeting_time
- && (meeting_end_x - 1 >= x) && (meeting_start_x + 1 < x + width)
- && (meeting_end_x - meeting_start_x > 2)) {
- gdk_gc_set_foreground (gc, &mts->meeting_time_bg_color);
- if (is_display_top)
- gdk_draw_rectangle (drawable, gc, TRUE,
- meeting_start_x + 1 - x, mts->row_height * 2 - y,
- meeting_end_x - meeting_start_x - 2, mts->row_height);
- else
- gdk_draw_rectangle (drawable, gc, TRUE,
- meeting_start_x + 1 - x, 0,
- meeting_end_x - meeting_start_x - 2, height);
- }
-
- /* For the main display draw the stipple background for attendee's
- that have no calendar information. */
- if (!is_display_top) {
- gdk_gc_set_foreground (gc, &mts->grid_color);
- gdk_gc_set_foreground (stipple_gc, &mts->grid_color);
- gdk_gc_set_background (stipple_gc, &mts->stipple_bg_color);
- gdk_gc_set_stipple (stipple_gc, mts->stipple);
- gnome_canvas_set_stipple_origin (item->canvas, stipple_gc);
- gdk_gc_set_fill (stipple_gc, GDK_OPAQUE_STIPPLED);
- row = y / mts->row_height;
- row_y = row * mts->row_height - y;
- while (row < e_meeting_store_count_actual_attendees (mts->model) && row_y < height) {
- ia = e_meeting_store_find_attendee_at_row (mts->model, row);
-
- if (e_meeting_attendee_get_has_calendar_info (ia)) {
- if (e_meeting_time_selector_item_calculate_busy_range (mts, row, x, width, &start_x, &end_x)) {
- if (start_x >= width || end_x <= 0) {
- gdk_draw_rectangle (drawable, stipple_gc, TRUE, 0, row_y, width, mts->row_height);
- } else {
- if (start_x >= 0) {
- gdk_draw_rectangle (drawable, stipple_gc, TRUE, 0, row_y, start_x, mts->row_height);
- gdk_draw_line (drawable, gc, start_x, row_y, start_x, row_y + mts->row_height);
- }
- if (end_x <= width) {
- gdk_draw_rectangle (drawable, stipple_gc, TRUE, end_x, row_y, width - end_x, mts->row_height);
- gdk_draw_line (drawable, gc, end_x, row_y, end_x, row_y + mts->row_height);
- }
- }
- }
- } else {
- gdk_draw_rectangle (drawable, stipple_gc, TRUE,
- 0, row_y,
- width, mts->row_height);
- }
- row++;
- row_y += mts->row_height;
- }
- gdk_gc_set_fill (gc, GDK_SOLID);
- }
-
- /* Now paint the visible days one by one. */
- current_date = date;
- for (;;) {
- /* Currently we use the same GnomeCanvasItem class for the
- top display and the main display. We may use separate
- classes in future if necessary. */
- if (is_display_top)
- e_meeting_time_selector_item_paint_day_top (mts_item, drawable, &current_date, day_x, y, width, height);
- else
- e_meeting_time_selector_item_paint_day (mts_item, drawable, &current_date, day_x, y, width, height);
-
- day_x += mts_item->mts->day_width;
- if (g_date_compare (&current_date, &last_date) == 0)
- break;
- g_date_add_days (&current_date, 1);
- }
-
- /* Draw the busy periods. */
- if (is_display_top)
- e_meeting_time_selector_item_paint_all_attendees_busy_periods (mts_item, drawable, &date, x, y, width, height);
- else
- e_meeting_time_selector_item_paint_busy_periods (mts_item, drawable, &date, x, y, width, height);
-
-
- /* Draw the currently-selected meeting time vertical bars. */
- if (show_meeting_time) {
- if (is_display_top) {
- bar_y = mts->row_height * 2 - y;
- bar_height = mts->row_height;
- } else {
- bar_y = 0;
- bar_height = height;
- }
-
- gdk_gc_set_foreground (gc, &mts->grid_color);
-
- if ((meeting_start_x + 2 >= x)
- && (meeting_start_x - 2 < x + width)) {
- gdk_draw_rectangle (drawable, gc, TRUE,
- meeting_start_x - 2 - x, bar_y,
- 5, bar_height);
- }
-
- if ((meeting_end_x + 2 >= x)
- && (meeting_end_x - 2 < x + width)) {
- gdk_draw_rectangle (drawable, gc, TRUE,
- meeting_end_x - 2 - x, bar_y,
- 5, bar_height);
- }
- }
-}
-
-
-static void
-e_meeting_time_selector_item_paint_day_top (EMeetingTimeSelectorItem *mts_item,
- GdkDrawable *drawable, GDate *date,
- int x, int scroll_y,
- int width, int height)
-{
- EMeetingTimeSelector *mts;
- GdkGC *gc;
- gint y, grid_x;
- gchar buffer[128], *format;
- gint hour, hour_x, hour_y;
- GdkRectangle clip_rect;
- PangoLayout *layout;
-
- mts = mts_item->mts;
- gc = mts_item->main_gc;
-
- gdk_gc_set_foreground (gc, &mts->grid_color);
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (mts), NULL);
-
- /* Draw the horizontal lines. */
- y = mts->row_height - 1 - scroll_y;
- gdk_draw_line (drawable, gc, x, y, x + mts->day_width - 1, y);
- gdk_gc_set_foreground (gc, &mts->grid_shadow_color);
- gdk_draw_line (drawable, gc, x, y + 1, x + mts->day_width - 1, y + 1);
- gdk_gc_set_foreground (gc, &mts->grid_color);
- y += mts->row_height;
- gdk_draw_line (drawable, gc, x, y, x + mts->day_width - 1, y);
- y += mts->row_height;
- gdk_draw_line (drawable, gc, x, y, x + mts->day_width - 1, y);
-
- /* Draw the vertical grid lines. */
- for (grid_x = mts->col_width - 1;
- grid_x < mts->day_width - mts->col_width;
- grid_x += mts->col_width) {
- gdk_draw_line (drawable, gc,
- x + grid_x, mts->row_height * 2 - 4 - scroll_y,
- x + grid_x, height);
- }
- grid_x = mts->day_width - 2;
- gdk_draw_line (drawable, gc, x + grid_x, 0, x + grid_x, height);
- grid_x++;
- gdk_draw_line (drawable, gc, x + grid_x, 0, x + grid_x, height);
-
- /* Draw the date. Set a clipping rectangle so we don't draw over the
- next day. */
- if (mts->date_format == E_MEETING_TIME_SELECTOR_DATE_FULL)
- /* This is a strftime() format string %A = full weekday name,
- %B = full month name, %d = month day, %Y = full year. */
- format = _("%A, %B %d, %Y");
- else if (mts->date_format == E_MEETING_TIME_SELECTOR_DATE_ABBREVIATED_DAY)
- /* This is a strftime() format string %a = abbreviated weekday
- name, %m = month number, %d = month day, %Y = full year. */
- format = _("%a %m/%d/%Y");
- else
- /* This is a strftime() format string %m = month number,
- %d = month day, %Y = full year. */
- format = _("%m/%d/%Y");
-
- g_date_strftime (buffer, sizeof (buffer), format, date);
-
- clip_rect.x = x;
- clip_rect.y = -scroll_y;
- clip_rect.width = mts->day_width - 2;
- clip_rect.height = mts->row_height - 2;
- gdk_gc_set_clip_rectangle (gc, &clip_rect);
- pango_layout_set_text (layout, buffer, -1);
- gdk_draw_layout (drawable, gc,
- x + 2,
- 4 - scroll_y,
- layout);
- gdk_gc_set_clip_rectangle (gc, NULL);
-
- /* Draw the hours. */
- hour = mts->first_hour_shown;
- hour_x = x + 2;
- hour_y = mts->row_height + 4 - scroll_y;
- while (hour < mts->last_hour_shown) {
- if (calendar_config_get_24_hour_format ())
- pango_layout_set_text (layout, EMeetingTimeSelectorHours [hour], -1);
- else
- pango_layout_set_text (layout, EMeetingTimeSelectorHours12 [hour], -1);
-
- gdk_draw_layout (drawable, gc,
- hour_x,
- hour_y,
- layout);
-
- hour += mts->zoomed_out ? 3 : 1;
- hour_x += mts->col_width;
- }
-
- g_object_unref (layout);
-}
-
-
-/* This paints the colored bars representing busy periods for the combined
- list of attendees. For now we just paint the bars for each attendee of
- each other. If we want to speed it up we could optimise it later. */
-static void
-e_meeting_time_selector_item_paint_all_attendees_busy_periods (EMeetingTimeSelectorItem *mts_item, GdkDrawable *drawable, GDate *date, int x, int scroll_y, int width, int height)
-{
- EMeetingTimeSelector *mts;
- EMeetingAttendee *ia;
- EMeetingFreeBusyType busy_type;
- gint row, y;
- GdkGC *gc;
- gint *first_periods;
-
- mts = mts_item->mts;
- gc = mts_item->main_gc;
-
- /* Calculate the y coordinate to paint the row at in the drawable. */
- y = 2 * mts->row_height - scroll_y - 1;
-
- /* Get the first visible busy periods for all the attendees. */
- first_periods = g_new (gint, e_meeting_store_count_actual_attendees (mts->model));
- for (row = 0; row < e_meeting_store_count_actual_attendees (mts->model); row++) {
- ia = e_meeting_store_find_attendee_at_row (mts->model, row);
- first_periods[row] = e_meeting_time_selector_item_find_first_busy_period (mts_item, date, row);
- }
-
- for (busy_type = 0;
- busy_type < E_MEETING_FREE_BUSY_LAST;
- busy_type++) {
- gdk_gc_set_foreground (gc, &mts->busy_colors[busy_type]);
- for (row = 0; row < e_meeting_store_count_actual_attendees (mts->model); row++) {
- if (first_periods[row] == -1)
- continue;
- e_meeting_time_selector_item_paint_attendee_busy_periods (mts_item, drawable, x, y, width, row, first_periods[row], busy_type);
- }
- }
-
- g_free (first_periods);
-}
-
-
-static void
-e_meeting_time_selector_item_paint_day (EMeetingTimeSelectorItem *mts_item,
- GdkDrawable *drawable, GDate *date,
- int x, int scroll_y,
- int width, int height)
-{
- EMeetingTimeSelector *mts;
- GdkGC *gc;
- gint grid_x, grid_y, attendee_index, unused_y;
-
- mts = mts_item->mts;
- gc = mts_item->main_gc;
-
- /* Draw the grid lines. The grid lines around unused rows are drawn in
- a different color. */
-
- /* Draw the horizontal grid lines. */
- attendee_index = scroll_y / mts->row_height;
-#if E_MEETING_TIME_SELECTOR_DRAW_GRID_LINES_AT_BOTTOM
- for (grid_y = mts->row_height - 1 - (scroll_y % mts->row_height);
-#else
- for (grid_y = - (scroll_y % mts->row_height);
-#endif
- grid_y < height;
- grid_y += mts->row_height)
- {
- if (attendee_index <= e_meeting_store_count_actual_attendees (mts->model)) {
- gdk_gc_set_foreground (gc, &mts->grid_color);
- gdk_draw_line (drawable, gc, 0, grid_y,
- width, grid_y);
- } else {
- gdk_gc_set_foreground (gc, &mts->grid_unused_color);
- gdk_draw_line (drawable, gc, 0, grid_y,
- width, grid_y);
- }
- attendee_index++;
- }
-
- /* Draw the vertical grid lines. */
- unused_y = (e_meeting_store_count_actual_attendees (mts->model) * mts->row_height) - scroll_y;
- if (unused_y >= 0) {
- gdk_gc_set_foreground (gc, &mts->grid_color);
- for (grid_x = mts->col_width - 1;
- grid_x < mts->day_width - mts->col_width;
- grid_x += mts->col_width)
- {
- gdk_draw_line (drawable, gc,
- x + grid_x, 0,
- x + grid_x, unused_y - 1);
- }
- gdk_draw_rectangle (drawable, gc, TRUE,
- x + mts->day_width - 2, 0,
- 2, unused_y);
- }
-
- if (unused_y < height) {
- gdk_gc_set_foreground (gc, &mts->grid_unused_color);
- for (grid_x = mts->col_width - 1;
- grid_x < mts->day_width - mts->col_width;
- grid_x += mts->col_width)
- {
- gdk_draw_line (drawable, gc,
- x + grid_x, unused_y,
- x + grid_x, height);
- }
- gdk_draw_rectangle (drawable, gc, TRUE,
- x + mts->day_width - 2, unused_y,
- 2, height - unused_y);
- }
-
-
-}
-
-
-/* This paints the colored bars representing busy periods for the individual
- attendees. */
-static void
-e_meeting_time_selector_item_paint_busy_periods (EMeetingTimeSelectorItem *mts_item, GdkDrawable *drawable, GDate *date, int x, int scroll_y, int width, int height)
-{
- EMeetingTimeSelector *mts;
- EMeetingFreeBusyType busy_type;
- gint row, y, first_period;
- GdkGC *gc;
-
- mts = mts_item->mts;
- gc = mts_item->main_gc;
-
- /* Calculate the first visible attendee row. */
- row = scroll_y / mts->row_height;
-
- /* Calculate the y coordinate to paint the row at in the drawable. */
- y = row * mts->row_height - scroll_y;
-
- /* Step through the attendees painting the busy periods. */
- while (y < height && row < e_meeting_store_count_actual_attendees (mts->model)) {
-
- /* Find the first visible busy period. */
- first_period = e_meeting_time_selector_item_find_first_busy_period (mts_item, date, row);
- if (first_period != -1) {
- /* Paint the different types of busy periods, in
- reverse order of precedence, so the highest
- precedences are displayed. */
- for (busy_type = 0;
- busy_type < E_MEETING_FREE_BUSY_LAST;
- busy_type++) {
- gdk_gc_set_foreground (gc, &mts->busy_colors[busy_type]);
- e_meeting_time_selector_item_paint_attendee_busy_periods (mts_item, drawable, x, y, width, row, first_period, busy_type);
- }
- }
- y += mts->row_height;
- row++;
- }
-}
-
-
-/* This subtracts the attendees longest_period_in_days from the given date,
- and does a binary search of the attendee's busy periods array to find the
- first one which could possible end on the given day or later.
- If none are found it returns -1. */
-static gint
-e_meeting_time_selector_item_find_first_busy_period (EMeetingTimeSelectorItem *mts_item, GDate *date, gint row)
-{
- EMeetingTimeSelector *mts;
- EMeetingAttendee *ia;
- const GArray *busy_periods;
- EMeetingFreeBusyPeriod *period;
- gint period_num;
-
- mts = mts_item->mts;
-
- ia = e_meeting_store_find_attendee_at_row (mts->model, row);
-
- period_num = e_meeting_attendee_find_first_busy_period (ia, date);
- if (period_num == -1)
- return -1;
-
- /* Check if the period starts after the end of the current canvas
- scroll area. */
- busy_periods = e_meeting_attendee_get_busy_periods (ia);
- period = &g_array_index (busy_periods, EMeetingFreeBusyPeriod, period_num);
- if (g_date_compare (&mts->last_date_shown, &period->start.date) < 0)
- return -1;
-
- return period_num;
-}
-
-
-/* This paints the visible busy periods for one attendee which are of a certain
- busy type, e.g out of office. It is passed the index of the first visible
- busy period of the attendee and continues until it runs off the screen. */
-static void
-e_meeting_time_selector_item_paint_attendee_busy_periods (EMeetingTimeSelectorItem *mts_item, GdkDrawable *drawable, int x, int y, int width, int row, int first_period, EMeetingFreeBusyType busy_type)
-{
- EMeetingTimeSelector *mts;
- EMeetingAttendee *ia;
- const GArray *busy_periods;
- EMeetingFreeBusyPeriod *period;
- GdkGC *gc;
- gint period_num, x1, x2, x2_within_day, x2_within_col;
-
- mts = mts_item->mts;
- gc = mts_item->main_gc;
-
- ia = e_meeting_store_find_attendee_at_row (mts->model, row);
-
- busy_periods = e_meeting_attendee_get_busy_periods (ia);
- for (period_num = first_period;
- period_num < busy_periods->len;
- period_num++) {
- period = &g_array_index (busy_periods, EMeetingFreeBusyPeriod, period_num);
-
- if (period->busy_type != busy_type)
- continue;
-
- /* Convert the period start and end times to x coordinates. */
- x1 = e_meeting_time_selector_calculate_time_position (mts, &period->start);
- /* If the period is off the right of the area being drawn, we
- are finished. */
- if (x1 >= x + width)
- return;
-
- x2 = e_meeting_time_selector_calculate_time_position (mts, &period->end);
- /* If the period is off the left edge of the area skip it. */
- if (x2 <= x)
- continue;
-
- /* We paint from x1 to x2 - 1, so that for example a time
- from 5:00-6:00 is distinct from 6:00-7:00.
- We never finish on a grid line separating days, and we only
- ever paint on a normal vertical grid line if the period is
- only 1 pixel wide. */
- x2_within_day = x2 % mts->day_width;
- if (x2_within_day == 0) {
- x2 -= 2;
- } else if (x2_within_day == mts->day_width - 1) {
- x2 -= 1;
- } else {
- x2_within_col = x2_within_day % mts->col_width;
- if (x2_within_col == 0 && x2 > x1 + 1)
- x2 -= 1;
- }
-
- /* Paint the rectangle. We leave a gap of 2 pixels at the
- top and bottom, remembering that the grid is painted along
- the top/bottom line of each row. */
- if (x2 - x1 > 0) {
-#if E_MEETING_TIME_SELECTOR_DRAW_GRID_LINES_AT_BOTTOM
- gdk_draw_rectangle (drawable, gc, TRUE,
- x1 - x, y + 2,
- x2 - x1, mts->row_height - 5);
-#else
- gdk_draw_rectangle (drawable, gc, TRUE,
- x1 - x, y + 3,
- x2 - x1, mts->row_height - 5);
-#endif
- }
- }
-}
-
-
-/*
- * CANVAS ITEM ROUTINES - functions to be a GnomeCanvasItem.
- */
-
-/* This is supposed to return the nearest item the the point and the distance.
- Since we are the only item we just return ourself and 0 for the distance.
- This is needed so that we get button/motion events. */
-static double
-e_meeting_time_selector_item_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- *actual_item = item;
- return 0.0;
-}
-
-
-static gint
-e_meeting_time_selector_item_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- EMeetingTimeSelectorItem *mts_item;
-
- mts_item = E_MEETING_TIME_SELECTOR_ITEM (item);
-
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- return e_meeting_time_selector_item_button_press (mts_item,
- event);
- case GDK_BUTTON_RELEASE:
- return e_meeting_time_selector_item_button_release (mts_item,
- event);
- case GDK_MOTION_NOTIFY:
- return e_meeting_time_selector_item_motion_notify (mts_item,
- event);
- default:
- break;
- }
-
- return FALSE;
-}
-
-
-/* This handles all button press events for the item. If the cursor is over
- one of the meeting time vertical bars we start a drag. If not we set the
- meeting time to the nearest half-hour interval.
- Note that GnomeCanvas converts the event coords to world coords,
- i.e. relative to the entire canvas scroll area. */
-static gint
-e_meeting_time_selector_item_button_press (EMeetingTimeSelectorItem *mts_item,
- GdkEvent *event)
-{
- EMeetingTimeSelector *mts;
- EMeetingTime start_time, end_time;
- EMeetingTimeSelectorPosition position;
- GDate *start_date, *end_date;
- gint x, y;
-
- mts = mts_item->mts;
- x = (gint) event->button.x;
- y = (gint) event->button.y;
-
- /* Check if we are starting a drag of the vertical meeting time bars.*/
- position = e_meeting_time_selector_item_get_drag_position (mts_item,
- x, y);
- if (position != E_MEETING_TIME_SELECTOR_POS_NONE) {
- if (gnome_canvas_item_grab (GNOME_CANVAS_ITEM (mts_item),
- GDK_POINTER_MOTION_MASK
- | GDK_BUTTON_RELEASE_MASK,
- mts_item->resize_cursor,
- event->button.time) == 0 /*Success*/) {
- mts->dragging_position = position;
- return TRUE;
- }
- }
-
- /* Convert the x coordinate into a EMeetingTimeSelectorTime. */
- e_meeting_time_selector_calculate_time (mts, x, &start_time);
- start_date = &start_time.date;
- end_date = &end_time.date;
-
- /* Find the nearest half-hour or hour interval, depending on whether
- zoomed_out is set. */
- if (!mts->all_day) {
- if (mts->zoomed_out) {
- start_time.minute = 0;
- end_time = start_time;
- end_time.hour += 1;
- } else {
- start_time.minute -= start_time.minute % 30;
- end_time = start_time;
- end_time.minute += 30;
- }
- } else {
- start_time.hour = 0;
- start_time.minute = 0;
- end_time = start_time;
- g_date_add_days (&end_time.date, 1);
- }
-
- /* Fix any overflows. */
- e_meeting_time_selector_fix_time_overflows (&end_time);
-
- /* Set the new meeting time. */
- e_meeting_time_selector_set_meeting_time (mts_item->mts,
- g_date_year (start_date),
- g_date_month (start_date),
- g_date_day (start_date),
- start_time.hour,
- start_time.minute,
- g_date_year (end_date),
- g_date_month (end_date),
- g_date_day (end_date),
- end_time.hour,
- end_time.minute);
-
-
- return FALSE;
-}
-
-
-/* This handles all button release events for the item. If we were dragging,
- we finish the drag. */
-static gint
-e_meeting_time_selector_item_button_release (EMeetingTimeSelectorItem *mts_item,
- GdkEvent *event)
-{
- EMeetingTimeSelector *mts;
-
- mts = mts_item->mts;
-
- /* Reset any drag. */
- if (mts->dragging_position != E_MEETING_TIME_SELECTOR_POS_NONE) {
- mts->dragging_position = E_MEETING_TIME_SELECTOR_POS_NONE;
- e_meeting_time_selector_remove_timeout (mts);
- gnome_canvas_item_ungrab (GNOME_CANVAS_ITEM (mts_item),
- event->button.time);
- }
-
- return FALSE;
-}
-
-
-/* This handles all motion notify events for the item. If button1 is pressed
- we check if a drag is in progress. If not, we set the cursor if we are over
- the meeting time vertical bars. Note that GnomeCanvas doesn't use motion
- hints, which may affect performance. */
-static gint
-e_meeting_time_selector_item_motion_notify (EMeetingTimeSelectorItem *mts_item,
- GdkEvent *event)
-{
- EMeetingTimeSelector *mts;
- EMeetingTimeSelectorPosition position;
- GdkCursor *cursor;
- gint x, y;
-
- mts = mts_item->mts;
- x = (gint) event->motion.x;
- y = (gint) event->motion.y;
-
- if (mts->dragging_position != E_MEETING_TIME_SELECTOR_POS_NONE) {
- e_meeting_time_selector_drag_meeting_time (mts, x);
- return TRUE;
- }
-
- position = e_meeting_time_selector_item_get_drag_position (mts_item,
- x, y);
-
- /* Determine which cursor should be used. */
- if (position == E_MEETING_TIME_SELECTOR_POS_NONE)
- cursor = mts_item->normal_cursor;
- else
- cursor = mts_item->resize_cursor;
-
- /* Only set the cursor if it is different to the last one we set. */
- if (mts_item->last_cursor_set != cursor) {
- mts_item->last_cursor_set = cursor;
- gdk_window_set_cursor (GTK_WIDGET (GNOME_CANVAS_ITEM (mts_item)->canvas)->window, cursor);
- }
-
- return FALSE;
-}
-
-
-static EMeetingTimeSelectorPosition
-e_meeting_time_selector_item_get_drag_position (EMeetingTimeSelectorItem *mts_item,
- gint x, gint y)
-{
- EMeetingTimeSelector *mts;
- gboolean is_display_top;
- gint meeting_start_x, meeting_end_x;
-
- mts = mts_item->mts;
-
- is_display_top = (GTK_WIDGET (GNOME_CANVAS_ITEM (mts_item)->canvas) == mts->display_top) ? TRUE : FALSE;
-
- if (is_display_top && y < mts->row_height * 2)
- return E_MEETING_TIME_SELECTOR_POS_NONE;
-
- if (!e_meeting_time_selector_get_meeting_time_positions (mts, &meeting_start_x, &meeting_end_x))
- return E_MEETING_TIME_SELECTOR_POS_NONE;
-
- if (x >= meeting_end_x - 2 && x <= meeting_end_x + 2)
- return E_MEETING_TIME_SELECTOR_POS_END;
-
- if (x >= meeting_start_x - 2 && x <= meeting_start_x + 2)
- return E_MEETING_TIME_SELECTOR_POS_START;
-
- return E_MEETING_TIME_SELECTOR_POS_NONE;
-}
-
-
-static gboolean
-e_meeting_time_selector_item_calculate_busy_range (EMeetingTimeSelector *mts,
- gint row,
- gint x,
- gint width,
- gint *start_x,
- gint *end_x)
-{
- EMeetingAttendee *ia;
- EMeetingTime busy_periods_start;
- EMeetingTime busy_periods_end;
-
- ia = e_meeting_store_find_attendee_at_row (mts->model, row);
- busy_periods_start = e_meeting_attendee_get_start_busy_range (ia);
- busy_periods_end = e_meeting_attendee_get_end_busy_range (ia);
-
- *start_x = -1;
- *end_x = -1;
-
- if (!g_date_valid (&busy_periods_start.date)
- || !g_date_valid (&busy_periods_end.date))
- return FALSE;
-
- *start_x = e_meeting_time_selector_calculate_time_position (mts, &busy_periods_start) - x - 1;
-
- *end_x = e_meeting_time_selector_calculate_time_position (mts, &busy_periods_end) - x;
-
- return TRUE;
-}
diff --git a/calendar/gui/e-meeting-time-sel-item.h b/calendar/gui/e-meeting-time-sel-item.h
deleted file mode 100644
index 11b355dfa0..0000000000
--- a/calendar/gui/e-meeting-time-sel-item.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@gtk.org>
- *
- * Copyright 1999, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * MeetingTimeSelectorItem - A GnomeCanvasItem which is used for both the main
- * display canvas and the top display (with the dates, times & All Attendees).
- * I didn't make these separate GnomeCanvasItems since they share a lot of
- * code.
- */
-
-#ifndef _E_MEETING_TIME_SELECTOR_ITEM_H_
-#define _E_MEETING_TIME_SELECTOR_ITEM_H_
-
-#include "e-meeting-time-sel.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-
-#define E_MEETING_TIME_SELECTOR_ITEM(obj) (GTK_CHECK_CAST((obj), e_meeting_time_selector_item_get_type (), EMeetingTimeSelectorItem))
-#define E_MEETING_TIME_SELECTOR_ITEM_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), e_meeting_time_selector_item_get_type (), EMeetingTimeSelectorItemClass))
-#define IS_E_MEETING_TIME_SELECTOR_ITEM(o) (GTK_CHECK_TYPE((o), e_meeting_time_selector_item_get_type ()))
-
-
-typedef struct _EMeetingTimeSelectorItem EMeetingTimeSelectorItem;
-typedef struct _EMeetingTimeSelectorItemClass EMeetingTimeSelectorItemClass;
-
-struct _EMeetingTimeSelectorItem
-{
- GnomeCanvasItem canvas_item;
-
- /* The parent EMeetingTimeSelector widget. */
- EMeetingTimeSelector *mts;
-
- /* This GC is used for most of the drawing. The fg/bg colors are
- changed for each bit. */
- GdkGC *main_gc;
- GdkGC *stipple_gc;
-
- /* The normal & resize cursors. */
- GdkCursor *normal_cursor;
- GdkCursor *resize_cursor;
-
- /* This remembers the last cursor set on the window. */
- GdkCursor *last_cursor_set;
-};
-
-
-struct _EMeetingTimeSelectorItemClass
-{
- GnomeCanvasItemClass parent_class;
-};
-
-GtkType e_meeting_time_selector_item_get_type (void);
-
-
-#endif /* _E_MEETING_TIME_SELECTOR_ITEM_H_ */
diff --git a/calendar/gui/e-meeting-time-sel.c b/calendar/gui/e-meeting-time-sel.c
deleted file mode 100644
index 5f92ab6a63..0000000000
--- a/calendar/gui/e-meeting-time-sel.c
+++ /dev/null
@@ -1,2933 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Authors :
- * Damon Chaplin <damon@gtk.org>
- * Rodrigo Moya <rodrigo@novell.com>
- *
- * Copyright 1999, Ximian, Inc.
- * Copyright 2004, Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-meeting-time-sel.h"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <time.h>
-#include <glib.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtkalignment.h>
-#include <gtk/gtkarrow.h>
-#include <gtk/gtkbutton.h>
-#include <gtk/gtkdrawingarea.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkfixed.h>
-#include <gtk/gtkhbox.h>
-#include <gtk/gtkhscrollbar.h>
-#include <gtk/gtkhseparator.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkmenu.h>
-#include <gtk/gtkradiomenuitem.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkvbox.h>
-#include <gtk/gtkvscrollbar.h>
-#include <libgnomeui/gnome-dateedit.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomecanvas/gnome-canvas-widget.h>
-
-#include <gal/widgets/e-canvas.h>
-#include <gal/widgets/e-canvas-utils.h>
-
-#include <widgets/misc/e-dateedit.h>
-#include <e-util/e-gui-utils.h>
-
-#include "calendar-component.h"
-#include "calendar-config.h"
-#include "e-meeting-utils.h"
-#include "e-meeting-list-view.h"
-#include "e-meeting-time-sel-item.h"
-
-/* An array of hour strings for 24 hour time, "0:00" .. "23:00". */
-const gchar *EMeetingTimeSelectorHours[24] = {
- "0:00", "1:00", "2:00", "3:00", "4:00", "5:00", "6:00", "7:00",
- "8:00", "9:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00",
- "16:00", "17:00", "18:00", "19:00", "20:00", "21:00", "22:00", "23:00"
-};
-
-/* An array of hour strings for 12 hour time, "12:00am" .. "11:00pm". */
-const gchar *EMeetingTimeSelectorHours12[24] = {
- "12:00am", "1:00am", "2:00am", "3:00am", "4:00am", "5:00am", "6:00am",
- "7:00am", "8:00am", "9:00am", "10:00am", "11:00am", "12:00pm",
- "1:00pm", "2:00pm", "3:00pm", "4:00pm", "5:00pm", "6:00pm", "7:00pm",
- "8:00pm", "9:00pm", "10:00pm", "11:00pm"
-};
-
-/* The number of days shown in the entire canvas. */
-#define E_MEETING_TIME_SELECTOR_DAYS_SHOWN 365
-#define E_MEETING_TIME_SELECTOR_DAYS_START_BEFORE 60
-#define E_MEETING_TIME_SELECTOR_FB_DAYS_BEFORE 7
-#define E_MEETING_TIME_SELECTOR_FB_DAYS_AFTER 28
-
-/* This is the number of pixels between the mouse has to move before the
- scroll speed is incremented. */
-#define E_MEETING_TIME_SELECTOR_SCROLL_INCREMENT_WIDTH 10
-
-/* This is the maximum scrolling speed. */
-#define E_MEETING_TIME_SELECTOR_MAX_SCROLL_SPEED 4
-
-/* Signals */
-enum {
- CHANGED,
- LAST_SIGNAL
-};
-
-
-static gint mts_signals [LAST_SIGNAL] = { 0 };
-
-static void e_meeting_time_selector_destroy (GtkObject *object);
-static void e_meeting_time_selector_alloc_named_color (EMeetingTimeSelector * mts,
- const char *name, GdkColor *c);
-static void e_meeting_time_selector_add_key_color (EMeetingTimeSelector * mts,
- GtkWidget *hbox,
- gchar *label_text,
- GdkColor *color);
-static gint e_meeting_time_selector_expose_key_color (GtkWidget *darea,
- GdkEventExpose *event,
- GdkColor *color);
-static void e_meeting_time_selector_options_menu_detacher (GtkWidget *widget,
- GtkMenu *menu);
-static void e_meeting_time_selector_autopick_menu_detacher (GtkWidget *widget,
- GtkMenu *menu);
-static void e_meeting_time_selector_realize (GtkWidget *widget);
-static void e_meeting_time_selector_unrealize (GtkWidget *widget);
-static void e_meeting_time_selector_style_set (GtkWidget *widget,
- GtkStyle *previous_style);
-static gint e_meeting_time_selector_expose_event (GtkWidget *widget,
- GdkEventExpose *event);
-static void e_meeting_time_selector_draw_shadow (EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_hadjustment_changed (GtkAdjustment *adjustment,
- EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_vadjustment_changed (GtkAdjustment *adjustment,
- EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_on_canvas_realized (GtkWidget *widget,
- EMeetingTimeSelector *mts);
-
-static void e_meeting_time_selector_on_options_button_clicked (GtkWidget *button,
- EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_options_menu_position_callback (GtkMenu *menu,
- gint *x,
- gint *y,
- gboolean *push_in,
- gpointer user_data);
-static void e_meeting_time_selector_on_zoomed_out_toggled (GtkWidget *button,
- EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_on_working_hours_toggled (GtkWidget *button,
- EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_on_invite_others_button_clicked (GtkWidget *button,
- EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_on_update_free_busy (GtkWidget *button,
- EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_on_autopick_button_clicked (GtkWidget *button,
- EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_autopick_menu_position_callback (GtkMenu *menu,
- gint *x,
- gint *y,
- gboolean *push_in,
- gpointer user_data);
-static void e_meeting_time_selector_on_autopick_option_toggled (GtkWidget *button,
- EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_on_prev_button_clicked (GtkWidget *button,
- EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_on_next_button_clicked (GtkWidget *button,
- EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_autopick (EMeetingTimeSelector *mts,
- gboolean forward);
-static void e_meeting_time_selector_calculate_time_difference (EMeetingTime*start,
- EMeetingTime*end,
- gint *days,
- gint *hours,
- gint *minutes);
-static void e_meeting_time_selector_find_nearest_interval (EMeetingTimeSelector *mts,
- EMeetingTime*start_time,
- EMeetingTime*end_time,
- gint days, gint hours, gint mins);
-static void e_meeting_time_selector_find_nearest_interval_backward (EMeetingTimeSelector *mts,
- EMeetingTime *start_time,
- EMeetingTime *end_time,
- gint days, gint hours, gint mins);
-static void e_meeting_time_selector_adjust_time (EMeetingTime*mtstime,
- gint days, gint hours, gint minutes);
-static EMeetingFreeBusyPeriod* e_meeting_time_selector_find_time_clash (EMeetingTimeSelector *mts,
- EMeetingAttendee *attendee,
- EMeetingTime *start_time,
- EMeetingTime *end_time);
-
-
-static void e_meeting_time_selector_recalc_grid (EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_recalc_date_format (EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_save_position (EMeetingTimeSelector *mts,
- EMeetingTime *mtstime);
-static void e_meeting_time_selector_restore_position (EMeetingTimeSelector *mts,
- EMeetingTime*mtstime);
-static void e_meeting_time_selector_on_start_time_changed (GtkWidget *widget,
- EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_on_end_time_changed (GtkWidget *widget,
- EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_update_date_popup_menus (EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_on_canvas_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation,
- EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_update_main_canvas_scroll_region (EMeetingTimeSelector *mts);
-static gboolean e_meeting_time_selector_timeout_handler (gpointer data);
-static void e_meeting_time_selector_update_start_date_edit (EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_update_end_date_edit (EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_ensure_meeting_time_shown (EMeetingTimeSelector *mts);
-static void e_meeting_time_selector_update_dates_shown (EMeetingTimeSelector *mts);
-
-static void row_inserted_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data);
-static void row_changed_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data);
-static void row_deleted_cb (GtkTreeModel *model, GtkTreePath *path, gpointer data);
-
-static void free_busy_template_changed_cb (GConfClient *client, guint cnxn_id,
- GConfEntry *entry, gpointer user_data);
-
-G_DEFINE_TYPE (EMeetingTimeSelector, e_meeting_time_selector, GTK_TYPE_TABLE);
-
-static void
-e_meeting_time_selector_class_init (EMeetingTimeSelectorClass * klass)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
-
- object_class = (GtkObjectClass *) klass;
- widget_class = (GtkWidgetClass *) klass;
-
- mts_signals [CHANGED] =
- gtk_signal_new ("changed", GTK_RUN_FIRST,
- G_TYPE_FROM_CLASS (object_class),
- GTK_SIGNAL_OFFSET (EMeetingTimeSelectorClass,
- changed),
- gtk_signal_default_marshaller,
- GTK_TYPE_NONE, 0);
-
- object_class->destroy = e_meeting_time_selector_destroy;
-
- widget_class->realize = e_meeting_time_selector_realize;
- widget_class->unrealize = e_meeting_time_selector_unrealize;
- widget_class->style_set = e_meeting_time_selector_style_set;
- widget_class->expose_event = e_meeting_time_selector_expose_event;
-}
-
-
-static void
-e_meeting_time_selector_init (EMeetingTimeSelector * mts)
-{
- /* The shadow is drawn in the border so it must be >= 2 pixels. */
- gtk_container_set_border_width (GTK_CONTAINER (mts), 2);
-
- mts->accel_group = gtk_accel_group_new ();
-
- mts->working_hours_only = TRUE;
- mts->day_start_hour = 9;
- mts->day_start_minute = 0;
- mts->day_end_hour = 18;
- mts->day_end_minute = 0;
- mts->zoomed_out = TRUE;
- mts->dragging_position = E_MEETING_TIME_SELECTOR_POS_NONE;
-
- mts->list_view = NULL;
-
- mts->fb_uri_not =
- calendar_config_add_notification_free_busy_template ((GConfClientNotifyFunc) free_busy_template_changed_cb,
- mts);
-
- mts->fb_refresh_not = 0;
-}
-
-
-void
-e_meeting_time_selector_construct (EMeetingTimeSelector * mts, EMeetingStore *ems)
-{
- char *filename;
- GtkWidget *hbox, *vbox, *separator, *label, *table, *sw;
- GtkWidget *alignment, *child_hbox, *arrow, *menuitem;
- GSList *group;
- GdkVisual *visual;
- GdkColormap *colormap;
- guint accel_key;
- time_t meeting_start_time;
- struct tm *meeting_start_tm;
- guchar stipple_bits[] = {
- 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
- };
- AtkObject *a11y_label, *a11y_date_edit;
-
- /* The default meeting time is the nearest half-hour interval in the
- future, in working hours. */
- meeting_start_time = time (NULL);
- g_date_clear (&mts->meeting_start_time.date, 1);
- g_date_set_time (&mts->meeting_start_time.date, meeting_start_time);
- meeting_start_tm = localtime (&meeting_start_time);
- mts->meeting_start_time.hour = meeting_start_tm->tm_hour;
- mts->meeting_start_time.minute = meeting_start_tm->tm_min;
-
- e_meeting_time_selector_find_nearest_interval (mts, &mts->meeting_start_time,
- &mts->meeting_end_time,
- 0, 0, 30);
-
- e_meeting_time_selector_update_dates_shown (mts);
-
- mts->meeting_positions_valid = FALSE;
-
- mts->row_height = 17;
- mts->col_width = 55;
- mts->day_width = 55 * 24 + 1;
-
- mts->auto_scroll_timeout_id = 0;
-
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_table_attach (GTK_TABLE (mts),
- vbox, 0, 1, 0, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (vbox);
-
- mts->attendees_vbox_spacer = gtk_vbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), mts->attendees_vbox_spacer, FALSE, FALSE, 0);
- gtk_widget_show (mts->attendees_vbox_spacer);
-
- mts->attendees_vbox = gtk_vbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), mts->attendees_vbox, TRUE, TRUE, 0);
- gtk_widget_show (mts->attendees_vbox);
-
-
- /* build the etable */
- filename = g_build_filename (calendar_component_peek_config_directory (calendar_component_peek ()),
- "config", "et-header-meeting-time-sel", NULL);
- mts->model = ems;
-
- if (mts->model)
- g_object_ref (mts->model);
-
- g_signal_connect (mts->model, "row_inserted", G_CALLBACK (row_inserted_cb), mts);
- g_signal_connect (mts->model, "row_changed", G_CALLBACK (row_changed_cb), mts);
- g_signal_connect (mts->model, "row_deleted", G_CALLBACK (row_deleted_cb), mts);
-
- mts->list_view = e_meeting_list_view_new (mts->model);
- e_meeting_list_view_column_set_visible (mts->list_view, "Role", FALSE);
- e_meeting_list_view_column_set_visible (mts->list_view, "RSVP", FALSE);
- gtk_widget_show (GTK_WIDGET (mts->list_view));
-
-
- sw = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
- gtk_widget_set_child_visible (GTK_SCROLLED_WINDOW (sw)->vscrollbar, FALSE);
- gtk_widget_show (sw);
- gtk_container_add (GTK_CONTAINER (sw), GTK_WIDGET (mts->list_view));
-
-#if 0
- /* FIXME: do we need sorting here */
- g_signal_connect (real_table->sort_info, "sort_info_changed", G_CALLBACK (sort_info_changed_cb), mts);
-#endif
-
- gtk_box_pack_start (GTK_BOX (mts->attendees_vbox), GTK_WIDGET (sw), TRUE, TRUE, 6);
-
- /* The free/busy information */
- mts->display_top = gnome_canvas_new ();
- gtk_widget_set_usize (mts->display_top, -1, mts->row_height * 3);
- gnome_canvas_set_scroll_region (GNOME_CANVAS (mts->display_top),
- 0, 0,
- mts->day_width * E_MEETING_TIME_SELECTOR_DAYS_SHOWN,
- mts->row_height * 3);
- /* Add some horizontal padding for the shadow around the display. */
- gtk_table_attach (GTK_TABLE (mts), mts->display_top,
- 1, 4, 0, 1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
- gtk_widget_show (mts->display_top);
- g_signal_connect (mts->display_top, "realize",
- G_CALLBACK (e_meeting_time_selector_on_canvas_realized), mts);
-
- mts->display_main = gnome_canvas_new ();
- e_meeting_time_selector_update_main_canvas_scroll_region (mts);
- /* Add some horizontal padding for the shadow around the display. */
- gtk_table_attach (GTK_TABLE (mts), mts->display_main,
- 1, 4, 1, 2,
- GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
- gtk_widget_show (mts->display_main);
- g_signal_connect (mts->display_main, "realize",
- G_CALLBACK (e_meeting_time_selector_on_canvas_realized), mts);
- g_signal_connect (mts->display_main, "size_allocate",
- G_CALLBACK (e_meeting_time_selector_on_canvas_size_allocate), mts);
-
- gtk_scrolled_window_set_vadjustment (GTK_SCROLLED_WINDOW (sw), GTK_LAYOUT (mts->display_main)->vadjustment);
-
- mts->hscrollbar = gtk_hscrollbar_new (GTK_LAYOUT (mts->display_main)->hadjustment);
- GTK_LAYOUT (mts->display_main)->hadjustment->step_increment = mts->col_width;
- gtk_table_attach (GTK_TABLE (mts), mts->hscrollbar,
- 1, 4, 2, 3, GTK_EXPAND | GTK_FILL, 0, 0, 0);
- gtk_widget_show (mts->hscrollbar);
-
- mts->vscrollbar = gtk_vscrollbar_new (GTK_LAYOUT (mts->display_main)->vadjustment);
- GTK_LAYOUT (mts->display_main)->vadjustment->step_increment = mts->row_height;
- gtk_table_attach (GTK_TABLE (mts), mts->vscrollbar,
- 4, 5, 1, 2, 0, GTK_EXPAND | GTK_FILL, 0, 0);
- gtk_widget_show (mts->vscrollbar);
-
- /* Create the item in the top canvas. */
- gnome_canvas_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (mts->display_top)->root),
- e_meeting_time_selector_item_get_type (),
- "EMeetingTimeSelectorItem::meeting_time_selector", mts,
- NULL);
-
- /* Create the item in the main canvas. */
- gnome_canvas_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (mts->display_main)->root),
- e_meeting_time_selector_item_get_type (),
- "EMeetingTimeSelectorItem::meeting_time_selector", mts,
- NULL);
-
- /* Create the hbox containing the color key. */
- hbox = gtk_hbox_new (FALSE, 2);
- gtk_table_attach (GTK_TABLE (mts), hbox,
- 1, 4, 3, 4, GTK_FILL, 0, 0, 8);
- gtk_widget_show (hbox);
-
- e_meeting_time_selector_add_key_color (mts, hbox, _("Tentative"), &mts->busy_colors[E_MEETING_FREE_BUSY_TENTATIVE]);
- e_meeting_time_selector_add_key_color (mts, hbox, _("Busy"), &mts->busy_colors[E_MEETING_FREE_BUSY_BUSY]);
- e_meeting_time_selector_add_key_color (mts, hbox, _("Out of Office"), &mts->busy_colors[E_MEETING_FREE_BUSY_OUT_OF_OFFICE]);
- e_meeting_time_selector_add_key_color (mts, hbox, _("No Information"),
- NULL);
-
- separator = gtk_hseparator_new ();
- gtk_table_attach (GTK_TABLE (mts), separator,
- 0, 5, 4, 5, GTK_FILL, 0, 6, 6);
- gtk_widget_show (separator);
-
- /* Create the Invite Others & Options buttons on the left. */
- hbox = gtk_hbox_new (FALSE, 4);
- gtk_table_attach (GTK_TABLE (mts), hbox,
- 0, 1, 3, 4, GTK_FILL, 0, 0, 0);
- gtk_widget_show (hbox);
-
- mts->add_attendees_button = e_button_new_with_stock_icon (_("Con_tacts..."), "gtk-jump-to");
- gtk_box_pack_start (GTK_BOX (hbox), mts->add_attendees_button, TRUE, TRUE, 6);
- gtk_widget_show (mts->add_attendees_button);
- g_signal_connect (mts->add_attendees_button, "clicked",
- G_CALLBACK (e_meeting_time_selector_on_invite_others_button_clicked), mts);
-
- mts->options_button = gtk_button_new ();
- gtk_box_pack_start (GTK_BOX (hbox), mts->options_button, TRUE, TRUE, 6);
- gtk_widget_show (mts->options_button);
-
- g_signal_connect (mts->options_button, "clicked",
- G_CALLBACK (e_meeting_time_selector_on_options_button_clicked), mts);
-
- child_hbox = gtk_hbox_new (FALSE, 2);
- gtk_container_add (GTK_CONTAINER (mts->options_button), child_hbox);
- gtk_widget_show (child_hbox);
-
- label = gtk_label_new_with_mnemonic (_("O_ptions"));
- accel_key = gtk_label_get_mnemonic_keyval (GTK_LABEL (label));
- gtk_box_pack_start (GTK_BOX (child_hbox), label, TRUE, TRUE, 6);
- gtk_widget_show (label);
- gtk_widget_add_accelerator (mts->options_button, "clicked", mts->accel_group,
- accel_key, GDK_MOD1_MASK, 0);
-
- arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE);
- gtk_box_pack_start (GTK_BOX (child_hbox), arrow, FALSE, FALSE, 6);
- gtk_widget_show (arrow);
-
- /* Create the Options menu. */
- mts->options_menu = gtk_menu_new ();
- gtk_menu_attach_to_widget (GTK_MENU (mts->options_menu), mts->options_button,
- e_meeting_time_selector_options_menu_detacher);
-
- menuitem = gtk_check_menu_item_new_with_label ("");
- gtk_label_set_text_with_mnemonic (GTK_LABEL (GTK_BIN (menuitem)->child), _("Show _only working hours"));
- gtk_menu_append (GTK_MENU (mts->options_menu), menuitem);
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem),
- mts->working_hours_only);
-
- g_signal_connect (menuitem, "toggled",
- G_CALLBACK (e_meeting_time_selector_on_working_hours_toggled), mts);
- gtk_widget_show (menuitem);
-
- menuitem = gtk_check_menu_item_new_with_label ("");
- gtk_label_set_text_with_mnemonic (GTK_LABEL (GTK_BIN (menuitem)->child), _("Show _zoomed out"));
- gtk_menu_append (GTK_MENU (mts->options_menu), menuitem);
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem),
- mts->zoomed_out);
-
- g_signal_connect (menuitem, "toggled",
- G_CALLBACK (e_meeting_time_selector_on_zoomed_out_toggled), mts);
- gtk_widget_show (menuitem);
-
- menuitem = gtk_menu_item_new ();
- gtk_menu_append (GTK_MENU (mts->options_menu), menuitem);
- gtk_widget_set_sensitive (menuitem, FALSE);
- gtk_widget_show (menuitem);
-
- menuitem = gtk_menu_item_new_with_label ("");
- gtk_label_set_text_with_mnemonic (GTK_LABEL (GTK_BIN (menuitem)->child), _("_Update free/busy"));
- gtk_menu_append (GTK_MENU (mts->options_menu), menuitem);
-
- g_signal_connect (menuitem, "activate",
- G_CALLBACK (e_meeting_time_selector_on_update_free_busy), mts);
- gtk_widget_show (menuitem);
-
- /* Create the 3 AutoPick buttons on the left. */
- hbox = gtk_hbox_new (FALSE, 0);
- gtk_table_attach (GTK_TABLE (mts), hbox,
- 0, 1, 5, 6, GTK_FILL, 0, 0, 0);
- gtk_widget_show (hbox);
-
- mts->autopick_down_button = gtk_button_new_with_label ("");
- gtk_label_set_text_with_mnemonic (GTK_LABEL (GTK_BIN (mts->autopick_down_button)->child),
- _("_<<"));
- accel_key = gtk_label_get_mnemonic_keyval (GTK_LABEL (GTK_BIN (mts->autopick_down_button)->child));
- gtk_widget_add_accelerator (mts->autopick_down_button, "clicked", mts->accel_group,
- accel_key, GDK_MOD1_MASK | GDK_SHIFT_MASK, 0);
- gtk_box_pack_start (GTK_BOX (hbox), mts->autopick_down_button, TRUE, TRUE, 6);
- gtk_widget_show (mts->autopick_down_button);
- g_signal_connect (mts->autopick_down_button, "clicked",
- G_CALLBACK (e_meeting_time_selector_on_prev_button_clicked), mts);
-
- mts->autopick_button = gtk_button_new ();
- gtk_box_pack_start (GTK_BOX (hbox), mts->autopick_button, TRUE, TRUE, 6);
- gtk_widget_show (mts->autopick_button);
-
- child_hbox = gtk_hbox_new (FALSE, 2);
- gtk_container_add (GTK_CONTAINER (mts->autopick_button), child_hbox);
- gtk_widget_show (child_hbox);
-
- label = gtk_label_new ("");
- gtk_label_set_text_with_mnemonic (GTK_LABEL (label), _("_Autopick"));
- accel_key = gtk_label_get_mnemonic_keyval (GTK_LABEL (label));
- gtk_box_pack_start (GTK_BOX (child_hbox), label, TRUE, TRUE, 6);
- gtk_widget_show (label);
- gtk_widget_add_accelerator (mts->autopick_button, "clicked", mts->accel_group,
- accel_key, GDK_MOD1_MASK, 0);
- g_signal_connect (mts->autopick_button, "clicked",
- G_CALLBACK (e_meeting_time_selector_on_autopick_button_clicked), mts);
-
- arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE);
- gtk_box_pack_start (GTK_BOX (child_hbox), arrow, FALSE, FALSE, 6);
- gtk_widget_show (arrow);
-
- mts->autopick_up_button = gtk_button_new_with_label ("");
- gtk_label_set_text_with_mnemonic (GTK_LABEL (GTK_BIN (mts->autopick_up_button)->child),
- _(">_>"));
- accel_key = gtk_label_get_mnemonic_keyval (GTK_LABEL (GTK_BIN (mts->autopick_up_button)->child));
- gtk_widget_add_accelerator (mts->autopick_up_button, "clicked", mts->accel_group,
- accel_key, GDK_MOD1_MASK | GDK_SHIFT_MASK, 0);
- gtk_box_pack_start (GTK_BOX (hbox), mts->autopick_up_button, TRUE, TRUE, 6);
- gtk_widget_show (mts->autopick_up_button);
- g_signal_connect (mts->autopick_up_button, "clicked",
- G_CALLBACK (e_meeting_time_selector_on_next_button_clicked), mts);
-
- /* Create the Autopick menu. */
- mts->autopick_menu = gtk_menu_new ();
- gtk_menu_attach_to_widget (GTK_MENU (mts->autopick_menu), mts->autopick_button,
- e_meeting_time_selector_autopick_menu_detacher);
-
- menuitem = gtk_radio_menu_item_new_with_label (NULL, "");
- mts->autopick_all_item = menuitem;
- group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
- gtk_label_set_text_with_mnemonic (GTK_LABEL (GTK_BIN (menuitem)->child), _("_All people and resources"));
- gtk_menu_append (GTK_MENU (mts->autopick_menu), menuitem);
- g_signal_connect (menuitem, "toggled",
- G_CALLBACK (e_meeting_time_selector_on_autopick_option_toggled), mts);
- gtk_widget_show (menuitem);
-
- menuitem = gtk_radio_menu_item_new_with_label (group, "");
- mts->autopick_all_people_one_resource_item = menuitem;
- group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
- gtk_label_set_text_with_mnemonic (GTK_LABEL (GTK_BIN (menuitem)->child), _("All _people and one resource"));
- gtk_menu_append (GTK_MENU (mts->autopick_menu), menuitem);
- g_signal_connect (menuitem, "toggled",
- G_CALLBACK (e_meeting_time_selector_on_autopick_option_toggled), mts);
- gtk_widget_show (menuitem);
-
- menuitem = gtk_radio_menu_item_new_with_label (group, "");
- mts->autopick_required_people_item = menuitem;
- group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
- gtk_label_set_text_with_mnemonic (GTK_LABEL (GTK_BIN (menuitem)->child), _("_Required people"));
- gtk_menu_append (GTK_MENU (mts->autopick_menu), menuitem);
- g_signal_connect (menuitem, "activate",
- G_CALLBACK (e_meeting_time_selector_on_autopick_option_toggled), mts);
- gtk_widget_show (menuitem);
-
- menuitem = gtk_radio_menu_item_new_with_label (group, "");
- mts->autopick_required_people_one_resource_item = menuitem;
- group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
- gtk_label_set_text_with_mnemonic (GTK_LABEL (GTK_BIN (menuitem)->child), _("Required people and _one resource"));
- gtk_menu_append (GTK_MENU (mts->autopick_menu), menuitem);
- g_signal_connect (menuitem, "activate",
- G_CALLBACK (e_meeting_time_selector_on_autopick_option_toggled), mts);
- gtk_widget_show (menuitem);
-
- /* Create the date entry fields on the right. */
- alignment = gtk_alignment_new (0.0, 0.5, 0, 0);
- gtk_table_attach (GTK_TABLE (mts), alignment,
- 1, 4, 5, 6, GTK_FILL, 0, 0, 0);
- gtk_widget_show (alignment);
-
- table = gtk_table_new (2, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 4);
- gtk_container_add (GTK_CONTAINER (alignment), table);
- gtk_widget_show (table);
-
- mts->start_date_edit = e_date_edit_new ();
- gtk_label_set_mnemonic_widget (GTK_LABEL (label), mts->start_date_edit);
- a11y_label = gtk_widget_get_accessible (label);
- a11y_date_edit = gtk_widget_get_accessible (mts->start_date_edit);
- if (a11y_label != NULL && a11y_date_edit != NULL) {
- atk_object_add_relationship (a11y_date_edit,
- ATK_RELATION_LABELLED_BY,
- a11y_label);
- }
- e_date_edit_set_show_time (E_DATE_EDIT (mts->start_date_edit), TRUE);
- e_date_edit_set_use_24_hour_format (E_DATE_EDIT (mts->start_date_edit),
- calendar_config_get_24_hour_format ());
-
- gtk_table_attach (GTK_TABLE (table), mts->start_date_edit,
- 1, 2, 0, 1, GTK_FILL, 0, 0, 0);
- gtk_widget_show (mts->start_date_edit);
- g_signal_connect (mts->start_date_edit, "changed",
- G_CALLBACK (e_meeting_time_selector_on_start_time_changed), mts);
-
- label = gtk_label_new_with_mnemonic (_("_Start time:"));
- gtk_label_set_mnemonic_widget (GTK_LABEL (label), (mts->start_date_edit));
-
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
- gtk_table_attach (GTK_TABLE (table), label,
- 0, 1, 0, 1, GTK_FILL, 0, 4, 0);
- gtk_widget_show (label);
-
- mts->end_date_edit = e_date_edit_new ();
- gtk_label_set_mnemonic_widget (GTK_LABEL (label), mts->end_date_edit);
- a11y_label = gtk_widget_get_accessible (label);
- a11y_date_edit = gtk_widget_get_accessible (mts->end_date_edit);
- if (a11y_label != NULL && a11y_date_edit != NULL) {
- atk_object_add_relationship (a11y_date_edit,
- ATK_RELATION_LABELLED_BY,
- a11y_label);
- }
- e_date_edit_set_show_time (E_DATE_EDIT (mts->end_date_edit), TRUE);
- e_date_edit_set_use_24_hour_format (E_DATE_EDIT (mts->end_date_edit),
- calendar_config_get_24_hour_format ());
-
- gtk_table_attach (GTK_TABLE (table), mts->end_date_edit,
- 1, 2, 1, 2, GTK_FILL, 0, 0, 0);
- gtk_widget_show (mts->end_date_edit);
- g_signal_connect (mts->end_date_edit, "changed",
- G_CALLBACK (e_meeting_time_selector_on_end_time_changed), mts);
-
- label = gtk_label_new_with_mnemonic (_("_End time:"));
- gtk_label_set_mnemonic_widget (GTK_LABEL (label), (mts->end_date_edit));
-
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
- gtk_table_attach (GTK_TABLE (table), label,
- 0, 1, 1, 2, GTK_FILL, 0, 4, 0);
- gtk_widget_show (label);
-
- gtk_table_set_col_spacing (GTK_TABLE (mts), 0, 4);
- gtk_table_set_row_spacing (GTK_TABLE (mts), 4, 12);
-
- /* Allocate the colors. */
- visual = gtk_widget_get_visual (GTK_WIDGET (mts));
- colormap = gtk_widget_get_colormap (GTK_WIDGET (mts));
- e_meeting_time_selector_alloc_named_color (mts, "gray75", &mts->bg_color);
- e_meeting_time_selector_alloc_named_color (mts, "gray50", &mts->all_attendees_bg_color);
- gdk_color_black (colormap, &mts->grid_color);
- gdk_color_white (colormap, &mts->grid_shadow_color);
- e_meeting_time_selector_alloc_named_color (mts, "gray50", &mts->grid_unused_color);
- gdk_color_white (colormap, &mts->meeting_time_bg_color);
- gdk_color_white (colormap, &mts->stipple_bg_color);
- gdk_color_white (colormap, &mts->attendee_list_bg_color);
-
- e_meeting_time_selector_alloc_named_color (mts, "LightSkyBlue2", &mts->busy_colors[E_MEETING_FREE_BUSY_TENTATIVE]);
- e_meeting_time_selector_alloc_named_color (mts, "blue", &mts->busy_colors[E_MEETING_FREE_BUSY_BUSY]);
- e_meeting_time_selector_alloc_named_color (mts, "HotPink3", &mts->busy_colors[E_MEETING_FREE_BUSY_OUT_OF_OFFICE]);
-
- /* Create the stipple, for attendees with no data. */
- mts->stipple = gdk_bitmap_create_from_data (NULL, (gchar*)stipple_bits,
- 8, 8);
-
- /* Connect handlers to the adjustments scroll the other items. */
- g_signal_connect (GTK_LAYOUT (mts->display_main)->hadjustment, "value_changed",
- G_CALLBACK (e_meeting_time_selector_hadjustment_changed), mts);
- g_signal_connect (GTK_LAYOUT (mts->display_main)->vadjustment, "value_changed",
- G_CALLBACK (e_meeting_time_selector_vadjustment_changed), mts);
- g_signal_connect (GTK_LAYOUT (mts->display_main)->vadjustment, "changed",
- G_CALLBACK (e_meeting_time_selector_vadjustment_changed), mts);
-
- e_meeting_time_selector_recalc_grid (mts);
- e_meeting_time_selector_ensure_meeting_time_shown (mts);
- e_meeting_time_selector_update_start_date_edit (mts);
- e_meeting_time_selector_update_end_date_edit (mts);
- e_meeting_time_selector_update_date_popup_menus (mts);
-
- gtk_signal_emit (GTK_OBJECT (mts), mts_signals [CHANGED]);
-}
-
-
-/* This adds a color to the color key beneath the main display. If color is
- NULL, it displays the No Info stipple instead. */
-static void
-e_meeting_time_selector_add_key_color (EMeetingTimeSelector * mts,
- GtkWidget *hbox,
- gchar *label_text, GdkColor *color)
-{
- GtkWidget *child_hbox, *darea, *label;
-
- child_hbox = gtk_hbox_new (FALSE, 4);
- gtk_box_pack_start (GTK_BOX (hbox), child_hbox, TRUE, TRUE, 0);
- gtk_widget_show (child_hbox);
-
- darea = gtk_drawing_area_new ();
- gtk_box_pack_start (GTK_BOX (child_hbox), darea, FALSE, FALSE, 0);
- gtk_object_set_user_data (GTK_OBJECT (darea), mts);
- gtk_widget_set_usize (darea, 14, 14);
- gtk_widget_show (darea);
-
- label = gtk_label_new (label_text);
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
- gtk_box_pack_start (GTK_BOX (child_hbox), label, TRUE, TRUE, 6);
- gtk_widget_show (label);
-
- g_signal_connect (darea, "expose_event",
- G_CALLBACK (e_meeting_time_selector_expose_key_color),
- color);
-}
-
-static gint
-e_meeting_time_selector_expose_key_color (GtkWidget *darea,
- GdkEventExpose *event,
- GdkColor *color)
-{
- EMeetingTimeSelector * mts;
- GdkGC *gc;
- gint width, height;
-
- mts = gtk_object_get_user_data (GTK_OBJECT (darea));
- gc = mts->color_key_gc;
- width = darea->allocation.width;
- height = darea->allocation.height;
-
- gtk_draw_shadow (darea->style, darea->window, GTK_STATE_NORMAL,
- GTK_SHADOW_IN, 0, 0, width, height);
-
- if (color) {
- gdk_gc_set_foreground (gc, color);
- gdk_draw_rectangle (darea->window, gc, TRUE, 1, 1,
- width - 2, height - 2);
- } else {
- gdk_gc_set_foreground (gc, &mts->grid_color);
- gdk_gc_set_background (gc, &mts->stipple_bg_color);
- gdk_gc_set_stipple (gc, mts->stipple);
- gdk_gc_set_fill (gc, GDK_OPAQUE_STIPPLED);
- gdk_draw_rectangle (darea->window, gc, TRUE, 1, 1,
- width - 2, height - 2);
- gdk_gc_set_fill (gc, GDK_SOLID);
- }
-
- return TRUE;
-}
-
-
-static void
-e_meeting_time_selector_alloc_named_color (EMeetingTimeSelector * mts,
- const char *name, GdkColor *c)
-{
- GdkColormap *colormap;
-
- g_return_if_fail (name != NULL);
- g_return_if_fail (c != NULL);
-
- gdk_color_parse (name, c);
- colormap = gtk_widget_get_colormap (GTK_WIDGET (mts));
- if (!gdk_colormap_alloc_color (colormap, c, TRUE, TRUE))
- g_warning ("Failed to allocate color: %s\n", name);
-}
-
-
-static void
-e_meeting_time_selector_options_menu_detacher (GtkWidget *widget,
- GtkMenu *menu)
-{
- EMeetingTimeSelector *mts;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (widget));
-
- mts = E_MEETING_TIME_SELECTOR (widget);
- g_return_if_fail (mts->options_menu == (GtkWidget*) menu);
-
- mts->options_menu = NULL;
-}
-
-
-static void
-e_meeting_time_selector_autopick_menu_detacher (GtkWidget *widget,
- GtkMenu *menu)
-{
- EMeetingTimeSelector *mts;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (widget));
-
- mts = E_MEETING_TIME_SELECTOR (widget);
- g_return_if_fail (mts->autopick_menu == (GtkWidget*) menu);
-
- mts->autopick_menu = NULL;
-}
-
-
-GtkWidget *
-e_meeting_time_selector_new (EMeetingStore *ems)
-{
- GtkWidget *mts;
-
- mts = GTK_WIDGET (g_object_new (e_meeting_time_selector_get_type (), NULL));
-
- e_meeting_time_selector_construct (E_MEETING_TIME_SELECTOR (mts), ems);
-
- return mts;
-}
-
-
-static void
-e_meeting_time_selector_destroy (GtkObject *object)
-{
- EMeetingTimeSelector *mts;
-
- mts = E_MEETING_TIME_SELECTOR (object);
-
- e_meeting_time_selector_remove_timeout (mts);
-
- if (mts->stipple) {
- gdk_bitmap_unref (mts->stipple);
- mts->stipple = NULL;
- }
-
- if (mts->model) {
- g_object_unref (mts->model);
- mts->model = NULL;
- }
-
- mts->display_top = NULL;
- mts->display_main = NULL;
-
- calendar_config_remove_notification (mts->fb_uri_not);
-
- if (mts->fb_refresh_not != 0) {
- g_source_remove (mts->fb_refresh_not);
- }
-
- if (GTK_OBJECT_CLASS (e_meeting_time_selector_parent_class)->destroy)
- (*GTK_OBJECT_CLASS (e_meeting_time_selector_parent_class)->destroy)(object);
-}
-
-
-static void
-e_meeting_time_selector_realize (GtkWidget *widget)
-{
- EMeetingTimeSelector *mts;
-
- if (GTK_WIDGET_CLASS (e_meeting_time_selector_parent_class)->realize)
- (*GTK_WIDGET_CLASS (e_meeting_time_selector_parent_class)->realize)(widget);
-
- mts = E_MEETING_TIME_SELECTOR (widget);
-
- mts->color_key_gc = gdk_gc_new (widget->window);
-}
-
-
-static void
-e_meeting_time_selector_unrealize (GtkWidget *widget)
-{
- EMeetingTimeSelector *mts;
-
- mts = E_MEETING_TIME_SELECTOR (widget);
-
- gdk_gc_unref (mts->color_key_gc);
- mts->color_key_gc = NULL;
-
- if (GTK_WIDGET_CLASS (e_meeting_time_selector_parent_class)->unrealize)
- (*GTK_WIDGET_CLASS (e_meeting_time_selector_parent_class)->unrealize)(widget);
-}
-
-static int
-get_cell_height (GtkTreeView *tree)
-{
- GtkTreeViewColumn *column;
- int height = -1;
-
- column = gtk_tree_view_get_column (tree, 0);
- gtk_tree_view_column_cell_get_size (column, NULL,
- NULL, NULL,
- NULL, &height);
-
- return height;
-}
-
-static void
-e_meeting_time_selector_style_set (GtkWidget *widget,
- GtkStyle *previous_style)
-{
- EMeetingTimeSelector *mts;
- EMeetingTime saved_time;
- int hour, max_hour_width;
- int maxheight;
- PangoFontDescription *font_desc;
- PangoContext *pango_context;
- PangoFontMetrics *font_metrics;
- PangoLayout *layout;
- GtkTreePath *path;
- GdkRectangle cell_area;
-
- if (GTK_WIDGET_CLASS (e_meeting_time_selector_parent_class)->style_set)
- (*GTK_WIDGET_CLASS (e_meeting_time_selector_parent_class)->style_set)(widget, previous_style);
-
- mts = E_MEETING_TIME_SELECTOR (widget);
-
- /* Set up Pango prerequisites */
- font_desc = gtk_widget_get_style (widget)->font_desc;
- pango_context = gtk_widget_get_pango_context (widget);
- font_metrics = pango_context_get_metrics (pango_context, font_desc,
- pango_context_get_language (pango_context));
- layout = pango_layout_new (pango_context);
-
- /* Calculate the widths of the hour strings in the style's font. */
- max_hour_width = 0;
- for (hour = 0; hour < 24; hour++) {
- if (calendar_config_get_24_hour_format ())
- pango_layout_set_text (layout, EMeetingTimeSelectorHours [hour], -1);
- else
- pango_layout_set_text (layout, EMeetingTimeSelectorHours12 [hour], -1);
-
- pango_layout_get_pixel_size (layout, &mts->hour_widths [hour], NULL);
- max_hour_width = MAX (max_hour_width, mts->hour_widths[hour]);
- }
-
- mts->row_height = get_cell_height (GTK_TREE_VIEW (mts->list_view));
- mts->col_width = max_hour_width + 6;
-
- e_meeting_time_selector_save_position (mts, &saved_time);
- e_meeting_time_selector_recalc_grid (mts);
- e_meeting_time_selector_restore_position (mts, &saved_time);
-
- gtk_widget_set_usize (mts->display_top, -1, mts->row_height * 3 + 4);
-
- /*
- * FIXME: I can't find a way to get the treeview header heights
- * other than the below but it isn't nice to realize that widget here
- *
-
- gtk_widget_realize (mts->list_view);
- gdk_window_get_position (gtk_tree_view_get_bin_window (GTK_TREE_VIEW (mts->list_view)),
- NULL, &maxheight);
- gtk_widget_set_usize (mts->attendees_vbox_spacer, 1, mts->row_height * 3 - maxheight);
-
- */
-
- gtk_widget_set_usize (mts->attendees_vbox_spacer, 1, mts->row_height * 2 - 6);
-
- GTK_LAYOUT (mts->display_main)->hadjustment->step_increment = mts->col_width;
- GTK_LAYOUT (mts->display_main)->vadjustment->step_increment = mts->row_height;
-
- g_object_unref (layout);
- pango_font_metrics_unref (font_metrics);
-}
-
-/* This draws a shadow around the top display and main display. */
-static gint
-e_meeting_time_selector_expose_event (GtkWidget *widget,
- GdkEventExpose *event)
-{
- EMeetingTimeSelector *mts;
-
- mts = E_MEETING_TIME_SELECTOR (widget);
-
- e_meeting_time_selector_draw_shadow (mts);
-
- if (GTK_WIDGET_CLASS (e_meeting_time_selector_parent_class)->expose_event)
- (*GTK_WIDGET_CLASS (e_meeting_time_selector_parent_class)->expose_event)(widget, event);
-
- return FALSE;
-}
-
-static void
-e_meeting_time_selector_draw_shadow (EMeetingTimeSelector *mts)
-{
- GtkWidget *widget;
- gint x, y, w, h;
-
- widget = GTK_WIDGET (mts);
-
- /* Draw the shadow around the graphical displays. */
- x = mts->display_top->allocation.x - 2;
- y = mts->display_top->allocation.y - 2;
- w = mts->display_top->allocation.width + 4;
- h = mts->display_top->allocation.height + mts->display_main->allocation.height + 4;
-
- gtk_draw_shadow (widget->style, widget->window, GTK_STATE_NORMAL,
- GTK_SHADOW_IN, x, y, w, h);
-}
-
-
-/* When the main canvas scrolls, we scroll the other canvases. */
-static void
-e_meeting_time_selector_hadjustment_changed (GtkAdjustment *adjustment,
- EMeetingTimeSelector *mts)
-{
- GtkAdjustment *adj;
-
- adj = GTK_LAYOUT (mts->display_top)->hadjustment;
- if (adj->value != adjustment->value) {
- adj->value = adjustment->value;
- gtk_adjustment_value_changed (adj);
- }
-}
-
-
-static void
-e_meeting_time_selector_vadjustment_changed (GtkAdjustment *adjustment,
- EMeetingTimeSelector *mts)
-{
- GtkAdjustment *adj;
-
- adj = gtk_tree_view_get_vadjustment (GTK_TREE_VIEW (mts->list_view));
- if (adj->value != adjustment->value) {
- adj->value = adjustment->value;
- gtk_adjustment_value_changed (adj);
- }
-}
-
-void
-e_meeting_time_selector_get_meeting_time (EMeetingTimeSelector *mts,
- gint *start_year,
- gint *start_month,
- gint *start_day,
- gint *start_hour,
- gint *start_minute,
- gint *end_year,
- gint *end_month,
- gint *end_day,
- gint *end_hour,
- gint *end_minute)
-{
- *start_year = g_date_year (&mts->meeting_start_time.date);
- *start_month = g_date_month (&mts->meeting_start_time.date);
- *start_day = g_date_day (&mts->meeting_start_time.date);
- *start_hour = mts->meeting_start_time.hour;
- *start_minute = mts->meeting_start_time.minute;
-
- *end_year = g_date_year (&mts->meeting_end_time.date);
- *end_month = g_date_month (&mts->meeting_end_time.date);
- *end_day = g_date_day (&mts->meeting_end_time.date);
- *end_hour = mts->meeting_end_time.hour;
- *end_minute = mts->meeting_end_time.minute;
-}
-
-
-gboolean
-e_meeting_time_selector_set_meeting_time (EMeetingTimeSelector *mts,
- gint start_year,
- gint start_month,
- gint start_day,
- gint start_hour,
- gint start_minute,
- gint end_year,
- gint end_month,
- gint end_day,
- gint end_hour,
- gint end_minute)
-{
- g_return_val_if_fail (IS_E_MEETING_TIME_SELECTOR (mts), FALSE);
-
- /* Check the dates are valid. */
- if (!g_date_valid_dmy (start_day, start_month, start_year)
- || !g_date_valid_dmy (end_day, end_month, end_year)
- || start_hour < 0 || start_hour > 23
- || end_hour < 0 || end_hour > 23
- || start_minute < 0 || start_minute > 59
- || end_minute < 0 || end_minute > 59)
- return FALSE;
-
- g_date_set_dmy (&mts->meeting_start_time.date, start_day, start_month,
- start_year);
- mts->meeting_start_time.hour = start_hour;
- mts->meeting_start_time.minute = start_minute;
- g_date_set_dmy (&mts->meeting_end_time.date, end_day, end_month,
- end_year);
- mts->meeting_end_time.hour = end_hour;
- mts->meeting_end_time.minute = end_minute;
-
- mts->meeting_positions_valid = FALSE;
-
- gtk_widget_queue_draw (mts->display_top);
- gtk_widget_queue_draw (mts->display_main);
-
- /* Set the times in the EDateEdit widgets. */
- e_meeting_time_selector_update_start_date_edit (mts);
- e_meeting_time_selector_update_end_date_edit (mts);
-
- gtk_signal_emit (GTK_OBJECT (mts), mts_signals [CHANGED]);
-
- return TRUE;
-}
-
-void
-e_meeting_time_selector_set_all_day (EMeetingTimeSelector *mts,
- gboolean all_day)
-{
- EMeetingTime saved_time;
-
- mts->all_day = all_day;
-
- e_date_edit_set_show_time (E_DATE_EDIT (mts->start_date_edit),
- !all_day);
- e_date_edit_set_show_time (E_DATE_EDIT (mts->end_date_edit),
- !all_day);
-
- e_meeting_time_selector_save_position (mts, &saved_time);
- e_meeting_time_selector_recalc_grid (mts);
- e_meeting_time_selector_restore_position (mts, &saved_time);
-
- gtk_widget_queue_draw (mts->display_top);
- gtk_widget_queue_draw (mts->display_main);
- e_meeting_time_selector_update_date_popup_menus (mts);
-}
-
-
-void
-e_meeting_time_selector_set_working_hours_only (EMeetingTimeSelector *mts,
- gboolean working_hours_only)
-{
- EMeetingTime saved_time;
-
- g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts));
-
- if (mts->working_hours_only == working_hours_only)
- return;
-
- mts->working_hours_only = working_hours_only;
-
- e_meeting_time_selector_save_position (mts, &saved_time);
- e_meeting_time_selector_recalc_grid (mts);
- e_meeting_time_selector_restore_position (mts, &saved_time);
-
- gtk_widget_queue_draw (mts->display_top);
- gtk_widget_queue_draw (mts->display_main);
- e_meeting_time_selector_update_date_popup_menus (mts);
-}
-
-
-void
-e_meeting_time_selector_set_working_hours (EMeetingTimeSelector *mts,
- gint day_start_hour,
- gint day_start_minute,
- gint day_end_hour,
- gint day_end_minute)
-{
- EMeetingTime saved_time;
-
- g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts));
-
- if (mts->day_start_hour == day_start_hour
- && mts->day_start_minute == day_start_minute
- && mts->day_end_hour == day_end_hour
- && mts->day_end_minute == day_end_minute)
- return;
-
- mts->day_start_hour = day_start_hour;
- mts->day_start_minute = day_start_minute;
-
- /* Make sure we always show atleast an hour */
- if (day_start_hour * 60 + day_start_minute + 60 < day_end_hour * 60 + day_end_minute) {
- mts->day_end_hour = day_end_hour;
- mts->day_end_minute = day_end_minute;
- } else {
- mts->day_end_hour = day_start_hour + 1;
- mts->day_end_minute = day_start_minute;
- }
-
- e_meeting_time_selector_save_position (mts, &saved_time);
- e_meeting_time_selector_recalc_grid (mts);
- e_meeting_time_selector_restore_position (mts, &saved_time);
-
- gtk_widget_queue_draw (mts->display_top);
- gtk_widget_queue_draw (mts->display_main);
- e_meeting_time_selector_update_date_popup_menus (mts);
-}
-
-
-void
-e_meeting_time_selector_set_zoomed_out (EMeetingTimeSelector *mts,
- gboolean zoomed_out)
-{
- EMeetingTime saved_time;
-
- g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts));
-
- if (mts->zoomed_out == zoomed_out)
- return;
-
- mts->zoomed_out = zoomed_out;
-
- e_meeting_time_selector_save_position (mts, &saved_time);
- e_meeting_time_selector_recalc_grid (mts);
- e_meeting_time_selector_restore_position (mts, &saved_time);
-
- gtk_widget_queue_draw (mts->display_top);
- gtk_widget_queue_draw (mts->display_main);
-}
-
-static void
-e_meeting_time_selector_refresh_cb (gpointer data)
-{
- EMeetingTimeSelector *mts = data;
-
- if (mts->display_top != NULL)
- gtk_widget_queue_draw (mts->display_top);
- if (mts->display_main != NULL)
- gtk_widget_queue_draw (mts->display_main);
-
- gtk_object_unref (GTK_OBJECT (mts));
-}
-
-static void
-e_meeting_time_selector_refresh_free_busy (EMeetingTimeSelector *mts, int row, gboolean all)
-{
- EMeetingTime start, end;
-
- start = mts->meeting_start_time;
- g_date_subtract_days (&start.date, E_MEETING_TIME_SELECTOR_FB_DAYS_BEFORE);
- start.hour = 0;
- start.minute = 0;
- end = mts->meeting_end_time;
- g_date_add_days (&end.date, E_MEETING_TIME_SELECTOR_FB_DAYS_AFTER);
- end.hour = 0;
- end.minute = 0;
-
- /* Ref ourselves in case we are called back after destruction,
- * we can do this because we will get a call back even after
- * an error */
- /* FIXME We should really have a mechanism to unqueue the
- * notification */
- if (all) {
- int i;
-
- for (i = 0; i < e_meeting_store_count_actual_attendees (mts->model); i++)
- gtk_object_ref (GTK_OBJECT (mts));
- } else {
- gtk_object_ref (GTK_OBJECT (mts));
- }
-
- if (all)
- e_meeting_store_refresh_all_busy_periods (mts->model, &start, &end,
- e_meeting_time_selector_refresh_cb, mts);
- else
- e_meeting_store_refresh_busy_periods (mts->model, row, &start, &end,
- e_meeting_time_selector_refresh_cb, mts);
-}
-
-EMeetingTimeSelectorAutopickOption
-e_meeting_time_selector_get_autopick_option (EMeetingTimeSelector *mts)
-{
- if (GTK_CHECK_MENU_ITEM (mts->autopick_all_item)->active)
- return E_MEETING_TIME_SELECTOR_ALL_PEOPLE_AND_RESOURCES;
- if (GTK_CHECK_MENU_ITEM (mts->autopick_all_people_one_resource_item)->active)
- return E_MEETING_TIME_SELECTOR_ALL_PEOPLE_AND_ONE_RESOURCE;
- if (GTK_CHECK_MENU_ITEM (mts->autopick_required_people_item)->active)
- return E_MEETING_TIME_SELECTOR_REQUIRED_PEOPLE;
- return E_MEETING_TIME_SELECTOR_REQUIRED_PEOPLE_AND_ONE_RESOURCE;
-}
-
-
-void
-e_meeting_time_selector_set_autopick_option (EMeetingTimeSelector *mts,
- EMeetingTimeSelectorAutopickOption autopick_option)
-{
- g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts));
-
- switch (autopick_option) {
- case E_MEETING_TIME_SELECTOR_ALL_PEOPLE_AND_RESOURCES:
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mts->autopick_all_item), TRUE);
- break;
- case E_MEETING_TIME_SELECTOR_ALL_PEOPLE_AND_ONE_RESOURCE:
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mts->autopick_all_people_one_resource_item), TRUE);
- break;
- case E_MEETING_TIME_SELECTOR_REQUIRED_PEOPLE:
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mts->autopick_required_people_item), TRUE);
- break;
- case E_MEETING_TIME_SELECTOR_REQUIRED_PEOPLE_AND_ONE_RESOURCE:
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mts->autopick_required_people_one_resource_item), TRUE);
- break;
- }
-}
-#if 0
-void
-e_meeting_time_selector_attendee_set_send_meeting_to (EMeetingTimeSelector *mts,
- gint row,
- gboolean send_meeting_to)
-{
- EMeetingTimeSelectorAttendee *attendee;
-
- g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts));
- g_return_if_fail (row >= 0);
- g_return_if_fail (row < mts->attendees->len);
-
- attendee = &g_array_index (mts->attendees,
- EMeetingTimeSelectorAttendee, row);
- attendee->send_meeting_to = send_meeting_to;
-}
-#endif
-
-void
-e_meeting_time_selector_set_read_only (EMeetingTimeSelector *mts, gboolean read_only)
-{
- g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts));
-
- gtk_widget_set_sensitive (GTK_WIDGET (mts->list_view), !read_only);
- gtk_widget_set_sensitive (mts->display_main, !read_only);
- gtk_widget_set_sensitive (mts->add_attendees_button, !read_only);
- gtk_widget_set_sensitive (mts->autopick_down_button, !read_only);
- gtk_widget_set_sensitive (mts->autopick_button, !read_only);
- gtk_widget_set_sensitive (mts->autopick_up_button, !read_only);
- gtk_widget_set_sensitive (mts->start_date_edit, !read_only);
- gtk_widget_set_sensitive (mts->end_date_edit, !read_only);
-}
-
-/*
- * DEBUGGING ROUTINES - functions to output various bits of data.
- */
-
-#ifdef E_MEETING_TIME_SELECTOR_DEBUG
-
-/* Debugging function to dump information on all attendees. */
-void
-e_meeting_time_selector_dump (EMeetingTimeSelector *mts)
-{
- EMeetingTimeSelectorAttendee *attendee;
- EMeetingTimeSelectorPeriod *period;
- gint row, period_num;
- gchar buffer[128];
-
- g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts));
-
- g_print ("\n\nAttendee Information:\n");
-
- for (row = 0; row < mts->attendees->len; row++) {
- attendee = &g_array_index (mts->attendees,
- EMeetingTimeSelectorAttendee, row);
- g_print ("Attendee: %s\n", attendee->name);
- g_print (" Longest Busy Period: %i days\n",
- attendee->longest_period_in_days);
-
- e_meeting_time_selector_attendee_ensure_periods_sorted (mts, attendee);
-#if 1
- for (period_num = 0;
- period_num < attendee->busy_periods->len;
- period_num++) {
- period = &g_array_index (attendee->busy_periods,
- EMeetingTimeSelectorPeriod,
- period_num);
-
- /* These are just for debugging so don't need i18n. */
- g_date_strftime (buffer, sizeof (buffer),
- "%A, %B %d, %Y", &period->start.date);
- g_print (" Start: %s %i:%02i\n", buffer,
- period->start.hour, period->start.minute);
-
- g_date_strftime (buffer, sizeof (buffer),
- "%A, %B %d, %Y", &period->end.date);
- g_print (" End : %s %i:%02i\n", buffer,
- period->end.hour, period->end.minute);
- }
-#endif
- }
-
-}
-
-
-/* This formats a EMeetingTimein a string and returns it.
- Note that it uses a static buffer. */
-gchar*
-e_meeting_time_selector_dump_time (EMeetingTime*mtstime)
-{
- static gchar buffer[128];
-
- gchar buffer2[128];
-
- /* This is just for debugging so doesn't need i18n. */
- g_date_strftime (buffer, sizeof (buffer), "%A, %B %d, %Y",
- &mtstime->date);
- sprintf (buffer2, " at %i:%02i", (gint) mtstime->hour,
- (gint) mtstime->minute);
- strcat (buffer, buffer2);
-
- return buffer;
-}
-
-
-/* This formats a GDate in a string and returns it.
- Note that it uses a static buffer. */
-gchar*
-e_meeting_time_selector_dump_date (GDate *date)
-{
- static gchar buffer[128];
-
- /* This is just for debugging so doesn't need i18n. */
- g_date_strftime (buffer, sizeof (buffer), "%A, %B %d, %Y", date);
- return buffer;
-}
-
-#endif /* E_MEETING_TIME_SELECTOR_DEBUG */
-
-static void
-e_meeting_time_selector_on_invite_others_button_clicked (GtkWidget *button,
- EMeetingTimeSelector *mts)
-{
- e_meeting_list_view_invite_others_dialog (mts->list_view);
-}
-
-
-static void
-e_meeting_time_selector_on_options_button_clicked (GtkWidget *button,
- EMeetingTimeSelector *mts)
-{
- gtk_menu_popup (GTK_MENU (mts->options_menu), NULL, NULL,
- e_meeting_time_selector_options_menu_position_callback,
- mts, 1, GDK_CURRENT_TIME);
-}
-
-
-static void
-e_meeting_time_selector_options_menu_position_callback (GtkMenu *menu,
- gint *x,
- gint *y,
- gboolean *push_in,
- gpointer user_data)
-{
- EMeetingTimeSelector *mts;
- GtkRequisition menu_requisition;
- gint max_x, max_y;
-
- mts = E_MEETING_TIME_SELECTOR (user_data);
-
- /* Calculate our preferred position. */
- gdk_window_get_origin (mts->options_button->window, x, y);
- *x += mts->options_button->allocation.x;
- *y += mts->options_button->allocation.y + mts->options_button->allocation.height / 2 - 2;
-
- /* Now make sure we are on the screen. */
- gtk_widget_size_request (mts->options_menu, &menu_requisition);
- max_x = MAX (0, gdk_screen_width () - menu_requisition.width);
- max_y = MAX (0, gdk_screen_height () - menu_requisition.height);
- *x = CLAMP (*x, 0, max_x);
- *y = CLAMP (*y, 0, max_y);
-}
-
-static void
-e_meeting_time_selector_on_update_free_busy (GtkWidget *button,
- EMeetingTimeSelector *mts)
-{
- /* Make sure the menu pops down, which doesn't happen by default if
- keyboard accelerators are used. */
- if (GTK_WIDGET_VISIBLE (mts->options_menu))
- gtk_menu_popdown (GTK_MENU (mts->options_menu));
-
- e_meeting_time_selector_refresh_free_busy (mts, 0, TRUE);
-}
-
-
-static void
-e_meeting_time_selector_on_autopick_button_clicked (GtkWidget *button,
- EMeetingTimeSelector *mts)
-{
- gtk_menu_popup (GTK_MENU (mts->autopick_menu), NULL, NULL,
- e_meeting_time_selector_autopick_menu_position_callback,
- mts, 1, GDK_CURRENT_TIME);
-}
-
-
-static void
-e_meeting_time_selector_autopick_menu_position_callback (GtkMenu *menu,
- gint *x,
- gint *y,
- gboolean *push_in,
- gpointer user_data)
-{
- EMeetingTimeSelector *mts;
- GtkRequisition menu_requisition;
- gint max_x, max_y;
-
- mts = E_MEETING_TIME_SELECTOR (user_data);
-
- /* Calculate our preferred position. */
- gdk_window_get_origin (mts->autopick_button->window, x, y);
- *x += mts->autopick_button->allocation.x;
- *y += mts->autopick_button->allocation.y + mts->autopick_button->allocation.height / 2 - 2;
-
- /* Now make sure we are on the screen. */
- gtk_widget_size_request (mts->autopick_menu, &menu_requisition);
- max_x = MAX (0, gdk_screen_width () - menu_requisition.width);
- max_y = MAX (0, gdk_screen_height () - menu_requisition.height);
- *x = CLAMP (*x, 0, max_x);
- *y = CLAMP (*y, 0, max_y);
-}
-
-
-static void
-e_meeting_time_selector_on_autopick_option_toggled (GtkWidget *button,
- EMeetingTimeSelector *mts)
-{
- /* Make sure the menu pops down, which doesn't happen by default if
- keyboard accelerators are used. */
- if (GTK_WIDGET_VISIBLE (mts->autopick_menu))
- gtk_menu_popdown (GTK_MENU (mts->autopick_menu));
-}
-
-
-static void
-e_meeting_time_selector_on_prev_button_clicked (GtkWidget *button,
- EMeetingTimeSelector *mts)
-{
- e_meeting_time_selector_autopick (mts, FALSE);
-}
-
-
-static void
-e_meeting_time_selector_on_next_button_clicked (GtkWidget *button,
- EMeetingTimeSelector *mts)
-{
- e_meeting_time_selector_autopick (mts, TRUE);
-}
-
-
-/* This tries to find the previous or next meeting time for which all
- attendees will be available. */
-static void
-e_meeting_time_selector_autopick (EMeetingTimeSelector *mts,
- gboolean forward)
-{
- EMeetingTime start_time, end_time, *resource_free;
- EMeetingAttendee *attendee;
- EMeetingFreeBusyPeriod *period;
- EMeetingTimeSelectorAutopickOption autopick_option;
- gint duration_days, duration_hours, duration_minutes, row;
- gboolean meeting_time_ok, skip_optional = FALSE;
- gboolean need_one_resource = FALSE, found_resource;
-
- /* Get the current meeting duration in days + hours + minutes. */
- e_meeting_time_selector_calculate_time_difference (&mts->meeting_start_time, &mts->meeting_end_time, &duration_days, &duration_hours, &duration_minutes);
-
- /* Find the first appropriate start time. */
- start_time = mts->meeting_start_time;
- if (forward)
- e_meeting_time_selector_find_nearest_interval (mts, &start_time, &end_time, duration_days, duration_hours, duration_minutes);
- else
- e_meeting_time_selector_find_nearest_interval_backward (mts, &start_time, &end_time, duration_days, duration_hours, duration_minutes);
-
- /* Determine if we can skip optional people and if we only need one
- resource based on the autopick option. */
- autopick_option = e_meeting_time_selector_get_autopick_option (mts);
- if (autopick_option == E_MEETING_TIME_SELECTOR_REQUIRED_PEOPLE
- || autopick_option == E_MEETING_TIME_SELECTOR_REQUIRED_PEOPLE_AND_ONE_RESOURCE)
- skip_optional = TRUE;
- if (autopick_option == E_MEETING_TIME_SELECTOR_ALL_PEOPLE_AND_ONE_RESOURCE
- || autopick_option == E_MEETING_TIME_SELECTOR_REQUIRED_PEOPLE_AND_ONE_RESOURCE)
- need_one_resource = TRUE;
-
- /* Keep moving forward or backward until we find a possible meeting
- time. */
- for (;;) {
- meeting_time_ok = TRUE;
- found_resource = FALSE;
- resource_free = NULL;
-
- /* Step through each attendee, checking if the meeting time
- intersects one of the attendees busy periods. */
- for (row = 0; row < e_meeting_store_count_actual_attendees (mts->model); row++) {
- attendee = e_meeting_store_find_attendee_at_row (mts->model, row);
-
- /* Skip optional people if they don't matter. */
- if (skip_optional && e_meeting_attendee_get_atype (attendee) == E_MEETING_ATTENDEE_OPTIONAL_PERSON)
- continue;
-
- period = e_meeting_time_selector_find_time_clash (mts, attendee, &start_time, &end_time);
-
- if (need_one_resource && e_meeting_attendee_get_atype (attendee) == E_MEETING_ATTENDEE_RESOURCE) {
- if (period) {
- /* We want to remember the closest
- prev/next time that one resource is
- available, in case we don't find any
- free resources. */
- if (forward) {
- if (!resource_free || e_meeting_time_compare_times (resource_free, &period->end) > 0)
- resource_free = &period->end;
- } else {
- if (!resource_free || e_meeting_time_compare_times (resource_free, &period->start) < 0)
- resource_free = &period->start;
- }
-
- } else {
- found_resource = TRUE;
- }
- } else if (period) {
- /* Skip the period which clashed. */
- if (forward) {
- start_time = period->end;
- } else {
- start_time = period->start;
- e_meeting_time_selector_adjust_time (&start_time, -duration_days, -duration_hours, -duration_minutes);
- }
- meeting_time_ok = FALSE;
- break;
- }
- }
-
- /* Check that we found one resource if necessary. If not, skip
- to the closest time that a resource is free. Note that if
- there are no resources, resource_free will never get set,
- so we assume the meeting time is OK. */
- if (meeting_time_ok && need_one_resource && !found_resource
- && resource_free) {
- if (forward) {
- start_time = *resource_free;
- } else {
- start_time = *resource_free;
- e_meeting_time_selector_adjust_time (&start_time, -duration_days, -duration_hours, -duration_minutes);
- }
- meeting_time_ok = FALSE;
- }
-
- if (meeting_time_ok) {
- mts->meeting_start_time = start_time;
- mts->meeting_end_time = end_time;
- mts->meeting_positions_valid = FALSE;
- gtk_widget_queue_draw (mts->display_top);
- gtk_widget_queue_draw (mts->display_main);
-
- /* Make sure the time is shown. */
- e_meeting_time_selector_ensure_meeting_time_shown (mts);
-
- /* Set the times in the EDateEdit widgets. */
- e_meeting_time_selector_update_start_date_edit (mts);
- e_meeting_time_selector_update_end_date_edit (mts);
-
- gtk_signal_emit (GTK_OBJECT (mts), mts_signals [CHANGED]);
-
- return;
- }
-
- /* Move forward to the next possible interval. */
- if (forward)
- e_meeting_time_selector_find_nearest_interval (mts, &start_time, &end_time, duration_days, duration_hours, duration_minutes);
- else
- e_meeting_time_selector_find_nearest_interval_backward (mts, &start_time, &end_time, duration_days, duration_hours, duration_minutes);
- }
-}
-
-
-static void
-e_meeting_time_selector_calculate_time_difference (EMeetingTime*start,
- EMeetingTime*end,
- gint *days,
- gint *hours,
- gint *minutes)
-{
- *days = g_date_julian (&end->date) - g_date_julian (&start->date);
- *hours = end->hour - start->hour;
- *minutes = end->minute - start->minute;
- if (*minutes < 0) {
- *minutes += 60;
- *hours = *hours - 1;
- }
- if (*hours < 0) {
- *hours += 24;
- *days = *days - 1;
- }
-}
-
-
-/* This moves the given time forward to the next suitable start of a meeting.
- If zoomed_out is set, this means every hour. If not every half-hour. */
-static void
-e_meeting_time_selector_find_nearest_interval (EMeetingTimeSelector *mts,
- EMeetingTime*start_time,
- EMeetingTime*end_time,
- gint days, gint hours, gint mins)
-{
- gint minutes_shown;
- gboolean set_to_start_of_working_day = FALSE;
-
- if (!mts->all_day) {
- if (mts->zoomed_out) {
- start_time->hour++;
- start_time->minute = 0;
- } else {
- start_time->minute += 30;
- start_time->minute -= start_time->minute % 30;
- }
- } else {
- g_date_add_days (&start_time->date, 1);
- start_time->hour = 0;
- start_time->minute = 0;
- }
- e_meeting_time_selector_fix_time_overflows (start_time);
-
- *end_time = *start_time;
- e_meeting_time_selector_adjust_time (end_time, days, hours, mins);
-
- /* Check if the interval is less than a day as seen in the display.
- If it isn't we don't worry about the working day. */
- if (!mts->working_hours_only || days > 0)
- return;
- minutes_shown = (mts->day_end_hour - mts->day_start_hour) * 60;
- minutes_shown += mts->day_end_minute - mts->day_start_minute;
- if (hours * 60 + mins > minutes_shown)
- return;
-
- /* If the meeting time finishes past the end of the working day, move
- onto the start of the next working day. If the meeting time starts
- before the working day, move it on as well. */
- if (start_time->hour > mts->day_end_hour
- || (start_time->hour == mts->day_end_hour
- && start_time->minute > mts->day_end_minute)
- || end_time->hour > mts->day_end_hour
- || (end_time->hour == mts->day_end_hour
- && end_time->minute > mts->day_end_minute)) {
- g_date_add_days (&start_time->date, 1);
- set_to_start_of_working_day = TRUE;
- } else if (start_time->hour < mts->day_start_hour
- || (start_time->hour == mts->day_start_hour
- && start_time->minute < mts->day_start_minute)) {
- set_to_start_of_working_day = TRUE;
- }
-
- if (set_to_start_of_working_day) {
- start_time->hour = mts->day_start_hour;
- start_time->minute = mts->day_start_minute;
-
- if (mts->zoomed_out) {
- if (start_time->minute > 0) {
- start_time->hour++;
- start_time->minute = 0;
- }
- } else {
- start_time->minute += 29;
- start_time->minute -= start_time->minute % 30;
- }
-
- e_meeting_time_selector_fix_time_overflows (start_time);
-
- *end_time = *start_time;
- e_meeting_time_selector_adjust_time (end_time, days, hours, mins);
- }
-}
-
-
-/* This moves the given time backward to the next suitable start of a meeting.
- If zoomed_out is set, this means every hour. If not every half-hour. */
-static void
-e_meeting_time_selector_find_nearest_interval_backward (EMeetingTimeSelector *mts,
- EMeetingTime*start_time,
- EMeetingTime*end_time,
- gint days, gint hours, gint mins)
-{
- gint new_hour, minutes_shown;
- gboolean set_to_end_of_working_day = FALSE;
-
- if (!mts->all_day) {
- new_hour = start_time->hour;
- if (mts->zoomed_out) {
- if (start_time->minute == 0)
- new_hour--;
- start_time->minute = 0;
- } else {
- if (start_time->minute == 0) {
- start_time->minute = 30;
- new_hour--;
- } else if (start_time->minute <= 30)
- start_time->minute = 0;
- else
- start_time->minute = 30;
- }
- if (new_hour < 0) {
- new_hour += 24;
- g_date_subtract_days (&start_time->date, 1);
- }
- start_time->hour = new_hour;
- } else {
- g_date_subtract_days (&start_time->date, 1);
- start_time->hour = 0;
- start_time->minute = 0;
- }
-
- *end_time = *start_time;
- e_meeting_time_selector_adjust_time (end_time, days, hours, mins);
-
- /* Check if the interval is less than a day as seen in the display.
- If it isn't we don't worry about the working day. */
- if (!mts->working_hours_only || days > 0)
- return;
- minutes_shown = (mts->day_end_hour - mts->day_start_hour) * 60;
- minutes_shown += mts->day_end_minute - mts->day_start_minute;
- if (hours * 60 + mins > minutes_shown)
- return;
-
- /* If the meeting time finishes past the end of the working day, move
- back to the end of the working day. If the meeting time starts
- before the working day, move it back to the end of the previous
- working day. */
- if (start_time->hour > mts->day_end_hour
- || (start_time->hour == mts->day_end_hour
- && start_time->minute > mts->day_end_minute)
- || end_time->hour > mts->day_end_hour
- || (end_time->hour == mts->day_end_hour
- && end_time->minute > mts->day_end_minute)) {
- set_to_end_of_working_day = TRUE;
- } else if (start_time->hour < mts->day_start_hour
- || (start_time->hour == mts->day_start_hour
- && start_time->minute < mts->day_start_minute)) {
- g_date_subtract_days (&end_time->date, 1);
- set_to_end_of_working_day = TRUE;
- }
-
- if (set_to_end_of_working_day) {
- end_time->hour = mts->day_end_hour;
- end_time->minute = mts->day_end_minute;
- *start_time = *end_time;
- e_meeting_time_selector_adjust_time (start_time, -days, -hours, -mins);
-
- if (mts->zoomed_out) {
- start_time->minute = 0;
- } else {
- start_time->minute -= start_time->minute % 30;
- }
-
- *end_time = *start_time;
- e_meeting_time_selector_adjust_time (end_time, days, hours, mins);
- }
-}
-
-
-/* This adds on the given days, hours & minutes to a EMeetingTimeSelectorTime.
- It is used to calculate the end of a period given a start & duration.
- Days, hours & minutes can be negative, to move backwards, but they should
- be within normal ranges, e.g. hours should be between -23 and 23. */
-static void
-e_meeting_time_selector_adjust_time (EMeetingTime*mtstime,
- gint days, gint hours, gint minutes)
-{
- gint new_hours, new_minutes;
-
- /* We have to handle negative values for hous and minutes here, since
- EMeetingTimeuses guint8s to store them. */
- new_minutes = mtstime->minute + minutes;
- if (new_minutes < 0) {
- new_minutes += 60;
- hours -= 1;
- }
-
- new_hours = mtstime->hour + hours;
- if (new_hours < 0) {
- new_hours += 24;
- days -= 1;
- }
-
- g_date_add_days (&mtstime->date, days);
- mtstime->hour = new_hours;
- mtstime->minute = new_minutes;
-
- e_meeting_time_selector_fix_time_overflows (mtstime);
-}
-
-
-/* This looks for any busy period of the given attendee which clashes with
- the start and end time. It uses a binary search. */
-static EMeetingFreeBusyPeriod *
-e_meeting_time_selector_find_time_clash (EMeetingTimeSelector *mts,
- EMeetingAttendee *attendee,
- EMeetingTime*start_time,
- EMeetingTime*end_time)
-{
- EMeetingFreeBusyPeriod *period;
- const GArray *busy_periods;
- gint period_num;
-
- busy_periods = e_meeting_attendee_get_busy_periods (attendee);
- period_num = e_meeting_attendee_find_first_busy_period (attendee, &start_time->date);
-
- if (period_num == -1)
- return NULL;
-
- /* Step forward through the busy periods until we find a clash or we
- go past the end_time. */
- while (period_num < busy_periods->len) {
- period = &g_array_index (busy_periods, EMeetingFreeBusyPeriod, period_num);
-
- /* If the period starts at or after the end time, there is no
- clash and we are finished. The busy periods are sorted by
- their start times, so all the rest will be later. */
- if (e_meeting_time_compare_times (&period->start, end_time) >= 0)
- return NULL;
-
- /* If the period ends after the start time, we have found a
- clash. From the above test we already know the busy period
- isn't completely after the meeting time. */
- if (e_meeting_time_compare_times (&period->end, start_time) > 0)
- return period;
-
- period_num++;
- }
-
- return NULL;
-}
-
-static void
-e_meeting_time_selector_on_zoomed_out_toggled (GtkWidget *menuitem,
- EMeetingTimeSelector *mts)
-{
- /* Make sure the menu pops down, which doesn't happen by default if
- keyboard accelerators are used. */
- if (GTK_WIDGET_VISIBLE (mts->options_menu))
- gtk_menu_popdown (GTK_MENU (mts->options_menu));
-
- e_meeting_time_selector_set_zoomed_out (mts, GTK_CHECK_MENU_ITEM (menuitem)->active);
- e_meeting_time_selector_ensure_meeting_time_shown (mts);
-}
-
-
-static void
-e_meeting_time_selector_on_working_hours_toggled (GtkWidget *menuitem,
- EMeetingTimeSelector *mts)
-{
- /* Make sure the menu pops down, which doesn't happen by default if
- keyboard accelerators are used. */
- if (GTK_WIDGET_VISIBLE (mts->options_menu))
- gtk_menu_popdown (GTK_MENU (mts->options_menu));
-
- e_meeting_time_selector_set_working_hours_only (mts, GTK_CHECK_MENU_ITEM (menuitem)->active);
- e_meeting_time_selector_ensure_meeting_time_shown (mts);
-}
-
-
-/* This recalculates day_width, first_hour_shown and last_hour_shown. */
-static void
-e_meeting_time_selector_recalc_grid (EMeetingTimeSelector *mts)
-{
- if (mts->working_hours_only) {
- mts->first_hour_shown = mts->day_start_hour;
- mts->last_hour_shown = mts->day_end_hour;
- if (mts->day_end_minute != 0)
- mts->last_hour_shown += 1;
- } else {
- mts->first_hour_shown = 0;
- mts->last_hour_shown = 24;
- }
-
- /* In the brief view we use the nearest hours divisible by 3. */
- if (mts->zoomed_out) {
- mts->first_hour_shown -= mts->first_hour_shown % 3;
- mts->last_hour_shown += 2;
- mts->last_hour_shown -= mts->last_hour_shown % 3;
- }
-
- mts->day_width = mts->col_width * (mts->last_hour_shown - mts->first_hour_shown);
- if (mts->zoomed_out)
- mts->day_width /= 3;
-
- /* Add one pixel for the extra vertical grid line. */
- mts->day_width++;
-
- gnome_canvas_set_scroll_region (GNOME_CANVAS (mts->display_top),
- 0, 0,
- mts->day_width * E_MEETING_TIME_SELECTOR_DAYS_SHOWN,
- mts->row_height * 3);
- e_meeting_time_selector_update_main_canvas_scroll_region (mts);
-
- e_meeting_time_selector_recalc_date_format (mts);
- mts->meeting_positions_valid = FALSE;
-}
-
-
-/* This saves the first visible time in the given EMeetingTimeSelectorTime. */
-static void
-e_meeting_time_selector_save_position (EMeetingTimeSelector *mts,
- EMeetingTime*mtstime)
-{
- gint scroll_x, scroll_y;
-
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (mts->display_main),
- &scroll_x, &scroll_y);
- e_meeting_time_selector_calculate_time (mts, scroll_x, mtstime);
-}
-
-
-/* This restores a saved position. */
-static void
-e_meeting_time_selector_restore_position (EMeetingTimeSelector *mts,
- EMeetingTime*mtstime)
-{
- gint scroll_x, scroll_y, new_scroll_x;
-
- new_scroll_x = e_meeting_time_selector_calculate_time_position (mts,
- mtstime);
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (mts->display_main),
- &scroll_x, &scroll_y);
- gnome_canvas_scroll_to (GNOME_CANVAS (mts->display_main),
- new_scroll_x, scroll_y);
-}
-
-
-/* This returns the x pixel coords of the meeting time in the entire scroll
- region. It recalculates them if they have been marked as invalid.
- If it returns FALSE then no meeting time is set or the meeting time is
- not visible in the current scroll area. */
-gboolean
-e_meeting_time_selector_get_meeting_time_positions (EMeetingTimeSelector *mts,
- gint *start_x,
- gint *end_x)
-{
- if (mts->meeting_positions_valid) {
- if (mts->meeting_positions_in_scroll_area) {
- *start_x = mts->meeting_start_x;
- *end_x = mts->meeting_end_x;
- return TRUE;
- } else {
- return FALSE;
- }
- }
-
- mts->meeting_positions_valid = TRUE;
-
- /* Check if the days aren't in our current range. */
- if (g_date_compare (&mts->meeting_start_time.date, &mts->last_date_shown) > 0
- || g_date_compare (&mts->meeting_end_time.date, &mts->first_date_shown) < 0) {
- mts->meeting_positions_in_scroll_area = FALSE;
- return FALSE;
- }
-
- mts->meeting_positions_in_scroll_area = TRUE;
- *start_x = mts->meeting_start_x = e_meeting_time_selector_calculate_time_position (mts, &mts->meeting_start_time);
- *end_x = mts->meeting_end_x = e_meeting_time_selector_calculate_time_position (mts, &mts->meeting_end_time);
-
- return TRUE;
-}
-
-
-/* This recalculates the date format to used, by computing the width of the
- longest date strings in the widget's font and seeing if they fit. */
-static void
-e_meeting_time_selector_recalc_date_format (EMeetingTimeSelector *mts)
-{
- /* An array of dates, one for each month in the year 2000. They must
- all be Sundays. */
- static const int days[12] = { 23, 20, 19, 23, 21, 18,
- 23, 20, 17, 22, 19, 24 };
- GDate date;
- gint max_date_width, longest_weekday_width, longest_month_width, width;
- gint day, longest_weekday, month, longest_month;
- gchar buffer[128];
- PangoFontDescription *font_desc;
- PangoContext *pango_context;
- PangoLayout *layout;
-
- /* Set up Pango prerequisites */
- font_desc = gtk_widget_get_style (GTK_WIDGET (mts))->font_desc;
- pango_context = gtk_widget_get_pango_context (GTK_WIDGET (mts));
- layout = pango_layout_new (pango_context);
-
- /* Calculate the maximum date width we can fit into the display. */
- max_date_width = mts->day_width - 2;
-
- /* Find the biggest full weekday name. We start on a particular
- Monday and go through seven days. */
- g_date_clear (&date, 1);
- g_date_set_dmy (&date, 3, 1, 2000); /* Monday 3rd Jan 2000. */
- longest_weekday_width = 0;
- longest_weekday = G_DATE_MONDAY;
- for (day = G_DATE_MONDAY; day <= G_DATE_SUNDAY; day++) {
- g_date_strftime (buffer, sizeof (buffer), "%A", &date);
- pango_layout_set_text (layout, buffer, -1);
- pango_layout_get_pixel_size (layout, &width, NULL);
- if (width > longest_weekday_width) {
- longest_weekday = day;
- longest_weekday_width = width;
- }
- g_date_add_days (&date, 1);
- }
-
- /* Now find the biggest month name. */
- longest_month_width = 0;
- longest_month = G_DATE_JANUARY;
- for (month = G_DATE_JANUARY; month <= G_DATE_DECEMBER; month++) {
- g_date_set_month (&date, month);
- g_date_strftime (buffer, sizeof (buffer), "%B", &date);
- pango_layout_set_text (layout, buffer, -1);
- pango_layout_get_pixel_size (layout, &width, NULL);
- if (width > longest_month_width) {
- longest_month = month;
- longest_month_width = width;
- }
- }
-
- /* See if we can use the full date. We want to use a date with a
- month day > 20 and also the longest weekday. We use a
- pre-calculated array of days for each month and add on the
- weekday (which is 1 (Mon) to 7 (Sun). */
- g_date_set_dmy (&date, days[longest_month - 1] + longest_weekday,
- longest_month, 2000);
- /* This is a strftime() format string %A = full weekday name,
- %B = full month name, %d = month day, %Y = full year. */
- g_date_strftime (buffer, sizeof (buffer), _("%A, %B %d, %Y"), &date);
-
-#if 0
- g_print ("longest_month: %i longest_weekday: %i date: %s\n",
- longest_month, longest_weekday, buffer);
-#endif
-
- pango_layout_set_text (layout, buffer, -1);
- pango_layout_get_pixel_size (layout, &width, NULL);
- if (width < max_date_width) {
- mts->date_format = E_MEETING_TIME_SELECTOR_DATE_FULL;
- return;
- }
-
- /* Now try it with abbreviated weekday names. */
- longest_weekday_width = 0;
- longest_weekday = G_DATE_MONDAY;
- g_date_set_dmy (&date, 3, 1, 2000); /* Monday 3rd Jan 2000. */
- for (day = G_DATE_MONDAY; day <= G_DATE_SUNDAY; day++) {
- g_date_strftime (buffer, sizeof (buffer), "%a", &date);
- pango_layout_set_text (layout, buffer, -1);
- pango_layout_get_pixel_size (layout, &width, NULL);
- if (width > longest_weekday_width) {
- longest_weekday = day;
- longest_weekday_width = width;
- }
- g_date_add_days (&date, 1);
- }
-
- g_date_set_dmy (&date, days[longest_month - 1] + longest_weekday,
- longest_month, 2000);
- /* This is a strftime() format string %a = abbreviated weekday name,
- %m = month number, %d = month day, %Y = full year. */
- g_date_strftime (buffer, sizeof (buffer), _("%a %m/%d/%Y"), &date);
-
-#if 0
- g_print ("longest_month: %i longest_weekday: %i date: %s\n",
- longest_month, longest_weekday, buffer);
-#endif
-
- pango_layout_set_text (layout, buffer, -1);
- pango_layout_get_pixel_size (layout, &width, NULL);
- if (width < max_date_width)
- mts->date_format = E_MEETING_TIME_SELECTOR_DATE_ABBREVIATED_DAY;
- else
- mts->date_format = E_MEETING_TIME_SELECTOR_DATE_SHORT;
-
- g_object_unref (layout);
-}
-
-
-/* Turn off the background of the canvas windows. This reduces flicker
- considerably when scrolling. (Why isn't it in GnomeCanvas?). */
-static void
-e_meeting_time_selector_on_canvas_realized (GtkWidget *widget,
- EMeetingTimeSelector *mts)
-{
- gdk_window_set_back_pixmap (GTK_LAYOUT (widget)->bin_window,
- NULL, FALSE);
-}
-
-
-/* This is called when the meeting start time GnomeDateEdit is changed,
- either via the "date_changed". "time_changed" or "activate" signals on one
- of the GtkEntry widgets. So don't use the widget parameter since it may be
- one of the child GtkEntry widgets. */
-static void
-e_meeting_time_selector_on_start_time_changed (GtkWidget *widget,
- EMeetingTimeSelector *mts)
-{
- gint duration_days, duration_hours, duration_minutes;
- EMeetingTime mtstime;
- gint hour = 0, minute = 0;
- time_t newtime;
-
- /* Date */
- newtime = e_date_edit_get_time (E_DATE_EDIT (mts->start_date_edit));
- g_date_clear (&mtstime.date, 1);
- g_date_set_time (&mtstime.date, newtime);
-
- /* Time */
- e_date_edit_get_time_of_day (E_DATE_EDIT (mts->start_date_edit), &hour, &minute);
- mtstime.hour = hour;
- mtstime.minute = minute;
-
- /* If the time hasn't changed, just return. */
- if (e_meeting_time_compare_times (&mtstime, &mts->meeting_start_time) == 0)
- return;
-
- /* Calculate the current meeting duration. */
- e_meeting_time_selector_calculate_time_difference (&mts->meeting_start_time, &mts->meeting_end_time, &duration_days, &duration_hours, &duration_minutes);
-
- /* Set the new start time. */
- mts->meeting_start_time = mtstime;
-
- /* Update the end time so the meeting duration stays the same. */
- mts->meeting_end_time = mts->meeting_start_time;
- e_meeting_time_selector_adjust_time (&mts->meeting_end_time, duration_days, duration_hours, duration_minutes);
- e_meeting_time_selector_update_end_date_edit (mts);
-
- mts->meeting_positions_valid = FALSE;
- e_meeting_time_selector_ensure_meeting_time_shown (mts);
- gtk_widget_queue_draw (mts->display_top);
- gtk_widget_queue_draw (mts->display_main);
-
- gtk_signal_emit (GTK_OBJECT (mts), mts_signals [CHANGED]);
-}
-
-
-/* This is called when the meeting end time GnomeDateEdit is changed,
- either via the "date_changed", "time_changed" or "activate" signals on one
- of the GtkEntry widgets. So don't use the widget parameter since it may be
- one of the child GtkEntry widgets. */
-static void
-e_meeting_time_selector_on_end_time_changed (GtkWidget *widget,
- EMeetingTimeSelector *mts)
-{
- EMeetingTime mtstime;
- gint hour = 0, minute = 0;
- time_t newtime;
-
- /* Date */
- newtime = e_date_edit_get_time (E_DATE_EDIT (mts->end_date_edit));
- g_date_clear (&mtstime.date, 1);
- g_date_set_time (&mtstime.date, newtime);
- if (mts->all_day)
- g_date_add_days (&mtstime.date, 1);
-
- /* Time */
- e_date_edit_get_time_of_day (E_DATE_EDIT (mts->end_date_edit), &hour, &minute);
- mtstime.hour = hour;
- mtstime.minute = minute;
-
- /* If the time hasn't changed, just return. */
- if (e_meeting_time_compare_times (&mtstime, &mts->meeting_end_time) == 0)
- return;
-
- /* Set the new end time. */
- mts->meeting_end_time = mtstime;
-
- /* If the start time is after the end time, set it to the same time. */
- if (e_meeting_time_compare_times (&mtstime, &mts->meeting_start_time) <= 0) {
- /* We set it first, before updating the widget, so the signal
- handler will just return. */
- mts->meeting_start_time = mtstime;
- if (mts->all_day)
- g_date_subtract_days (&mts->meeting_start_time.date, 1);
- e_meeting_time_selector_update_start_date_edit (mts);
- }
-
- mts->meeting_positions_valid = FALSE;
- e_meeting_time_selector_ensure_meeting_time_shown (mts);
- gtk_widget_queue_draw (mts->display_top);
- gtk_widget_queue_draw (mts->display_main);
-
- gtk_signal_emit (GTK_OBJECT (mts), mts_signals [CHANGED]);
-}
-
-
-/* This updates the ranges shown in the GnomeDateEdit popup menus, according
- to working_hours_only etc. */
-static void
-e_meeting_time_selector_update_date_popup_menus (EMeetingTimeSelector *mts)
-{
- EDateEdit *start_edit, *end_edit;
- gint low_hour, high_hour;
-
- start_edit = E_DATE_EDIT (mts->start_date_edit);
- end_edit = E_DATE_EDIT (mts->end_date_edit);
-
- if (mts->working_hours_only) {
- low_hour = mts->day_start_hour;
- high_hour = mts->day_end_hour;
- } else {
- low_hour = 0;
- high_hour = 23;
- }
-
- e_date_edit_set_time_popup_range (start_edit, low_hour, high_hour);
- e_date_edit_set_time_popup_range (end_edit, low_hour, high_hour);
-}
-
-
-static void
-e_meeting_time_selector_on_canvas_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation,
- EMeetingTimeSelector *mts)
-{
- e_meeting_time_selector_update_main_canvas_scroll_region (mts);
-
- e_meeting_time_selector_ensure_meeting_time_shown (mts);
-}
-
-/* This updates the canvas scroll regions according to the number of attendees.
- If the total height needed is less than the height of the canvas, we must
- use the height of the canvas, or it causes problems. */
-static void
-e_meeting_time_selector_update_main_canvas_scroll_region (EMeetingTimeSelector *mts)
-{
- gint height, canvas_height;
-
- height = mts->row_height * (e_meeting_store_count_actual_attendees (mts->model) + 2);
- canvas_height = GTK_WIDGET (mts->display_main)->allocation.height;
-
- height = MAX (height, canvas_height);
-
- gnome_canvas_set_scroll_region (GNOME_CANVAS (mts->display_main),
- 0, 0,
- mts->day_width * E_MEETING_TIME_SELECTOR_DAYS_SHOWN,
- height);
-}
-
-
-/* This changes the meeting time based on the given x coordinate and whether
- we are dragging the start or end bar. It returns the new position, which
- will be swapped if the start bar is dragged past the end bar or vice versa.
- It make sure the meeting time is never dragged outside the visible canvas
- area. */
-void
-e_meeting_time_selector_drag_meeting_time (EMeetingTimeSelector *mts,
- gint x)
-{
- EMeetingTime first_time, last_time, drag_time, *time_to_set;
- gint scroll_x, scroll_y, canvas_width;
- gboolean set_both_times = FALSE;
-
- /* Get the x coords of visible part of the canvas. */
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (mts->display_main),
- &scroll_x, &scroll_y);
- canvas_width = mts->display_main->allocation.width;
-
- /* Save the x coordinate for the timeout handler. */
- mts->last_drag_x = (x < scroll_x) ? x - scroll_x
- : x - scroll_x - canvas_width + 1;
-
- /* Check if the mouse is off the edge of the canvas. */
- if (x < scroll_x || x > scroll_x + canvas_width) {
- /* If we haven't added a timeout function, add one. */
- if (mts->auto_scroll_timeout_id == 0) {
- mts->auto_scroll_timeout_id = g_timeout_add (60, e_meeting_time_selector_timeout_handler, mts);
- mts->scroll_count = 0;
-
- /* Call the handler to start scrolling now. */
- e_meeting_time_selector_timeout_handler (mts);
- return;
- }
- } else {
- e_meeting_time_selector_remove_timeout (mts);
- }
-
- /* Calculate the minimum & maximum times we can use, based on the
- scroll offsets and whether zoomed_out is set. */
- e_meeting_time_selector_calculate_time (mts, scroll_x, &first_time);
- e_meeting_time_selector_calculate_time (mts, scroll_x + canvas_width - 1,
- &last_time);
- if (!mts->all_day) {
- if (mts->zoomed_out) {
- if (first_time.minute > 30)
- first_time.hour++;
- first_time.minute = 0;
- last_time.minute = 0;
- } else {
- first_time.minute += 15;
- first_time.minute -= first_time.minute % 30;
- last_time.minute -= last_time.minute % 30;
- }
- } else {
- if (first_time.hour > 0 || first_time.minute > 0)
- g_date_add_days (&first_time.date, 1);
- first_time.hour = 0;
- first_time.minute = 0;
- last_time.hour = 0;
- last_time.minute = 0;
- }
- e_meeting_time_selector_fix_time_overflows (&first_time);
- e_meeting_time_selector_fix_time_overflows (&last_time);
-
- /* Calculate the time from x coordinate. */
- e_meeting_time_selector_calculate_time (mts, x, &drag_time);
-
- /* Calculate the nearest half-hour or hour, depending on whether
- zoomed_out is set. */
- if (!mts->all_day) {
- if (mts->zoomed_out) {
- if (drag_time.minute > 30)
- drag_time.hour++;
- drag_time.minute = 0;
- } else {
- drag_time.minute += 15;
- drag_time.minute -= drag_time.minute % 30;
- }
- } else {
- if (drag_time.hour > 12)
- g_date_add_days (&drag_time.date, 1);
- drag_time.hour = 0;
- drag_time.minute = 0;
- }
- e_meeting_time_selector_fix_time_overflows (&drag_time);
-
- /* Now make sure we are between first_time & last_time. */
- if (e_meeting_time_compare_times (&drag_time, &first_time) < 0)
- drag_time = first_time;
- if (e_meeting_time_compare_times (&drag_time, &last_time) > 0)
- drag_time = last_time;
-
- /* Set the meeting start or end time to drag_time. */
- if (mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_START)
- time_to_set = &mts->meeting_start_time;
- else
- time_to_set = &mts->meeting_end_time;
-
- /* If the time is unchanged, just return. */
- if (e_meeting_time_compare_times (time_to_set, &drag_time) == 0)
- return;
-
- /* Don't let an empty occur for all day events */
- if (mts->all_day
- && mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_START
- && e_meeting_time_compare_times (&mts->meeting_end_time, &drag_time) == 0)
- return;
- else if (mts->all_day
- && mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_END
- && e_meeting_time_compare_times (&mts->meeting_start_time, &drag_time) == 0)
- return;
-
- *time_to_set = drag_time;
-
- /* Check if the start time and end time need to be switched. */
- if (e_meeting_time_compare_times (&mts->meeting_start_time,
- &mts->meeting_end_time) > 0) {
- drag_time = mts->meeting_start_time;
- mts->meeting_start_time = mts->meeting_end_time;
- mts->meeting_end_time = drag_time;
-
- if (mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_START)
- mts->dragging_position = E_MEETING_TIME_SELECTOR_POS_END;
- else
- mts->dragging_position = E_MEETING_TIME_SELECTOR_POS_START;
-
- set_both_times = TRUE;
- }
-
-
- /* Mark the calculated positions as invalid. */
- mts->meeting_positions_valid = FALSE;
-
- /* Redraw the canvases. */
- gtk_widget_queue_draw (mts->display_top);
- gtk_widget_queue_draw (mts->display_main);
-
- /* Set the times in the GnomeDateEdit widgets. */
- if (set_both_times
- || mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_START)
- e_meeting_time_selector_update_start_date_edit (mts);
-
- if (set_both_times
- || mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_END)
- e_meeting_time_selector_update_end_date_edit (mts);
-
- if (set_both_times
- || mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_END
- || mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_START)
- gtk_signal_emit (GTK_OBJECT (mts), mts_signals [CHANGED]);
-}
-
-
-/* This is the timeout function which handles auto-scrolling when the user is
- dragging one of the meeting time vertical bars outside the left or right
- edge of the canvas. */
-static gboolean
-e_meeting_time_selector_timeout_handler (gpointer data)
-{
- EMeetingTimeSelector *mts;
- EMeetingTime drag_time, *time_to_set;
- gint scroll_x, max_scroll_x, scroll_y, canvas_width;
- gint scroll_speed, scroll_offset;
- gboolean set_both_times = FALSE;
-
- mts = E_MEETING_TIME_SELECTOR (data);
-
- GDK_THREADS_ENTER ();
-
- /* Return if we don't need to scroll yet. */
- if (mts->scroll_count-- > 0) {
- GDK_THREADS_LEAVE ();
- return TRUE;
- }
-
- /* Get the x coords of visible part of the canvas. */
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (mts->display_main),
- &scroll_x, &scroll_y);
- canvas_width = mts->display_main->allocation.width;
-
- /* Calculate the scroll delay, between 0 and MAX_SCROLL_SPEED. */
- scroll_speed = abs (mts->last_drag_x / E_MEETING_TIME_SELECTOR_SCROLL_INCREMENT_WIDTH);
- scroll_speed = MIN (scroll_speed,
- E_MEETING_TIME_SELECTOR_MAX_SCROLL_SPEED);
-
- /* Reset the scroll count. */
- mts->scroll_count = E_MEETING_TIME_SELECTOR_MAX_SCROLL_SPEED - scroll_speed;
-
- /* Calculate how much we need to scroll. */
- if (mts->last_drag_x >= 0)
- scroll_offset = mts->col_width;
- else
- scroll_offset = -mts->col_width;
-
- scroll_x += scroll_offset;
- max_scroll_x = (mts->day_width * E_MEETING_TIME_SELECTOR_DAYS_SHOWN)
- - canvas_width;
- scroll_x = CLAMP (scroll_x, 0, max_scroll_x);
-
- /* Calculate the minimum or maximum visible time in the canvas, which
- we will now set the dragged time to. */
- if (scroll_offset > 0) {
- e_meeting_time_selector_calculate_time (mts,
- scroll_x + canvas_width - 1,
- &drag_time);
- if (!mts->all_day) {
- if (mts->zoomed_out) {
- drag_time.minute = 0;
- } else {
- drag_time.minute -= drag_time.minute % 30;
- }
- } else {
- drag_time.hour = 0;
- drag_time.minute = 0;
- }
- } else {
- e_meeting_time_selector_calculate_time (mts, scroll_x,
- &drag_time);
- if (!mts->all_day) {
- if (mts->zoomed_out) {
- if (drag_time.minute > 30)
- drag_time.hour++;
- drag_time.minute = 0;
- } else {
- drag_time.minute += 15;
- drag_time.minute -= drag_time.minute % 30;
- }
- } else {
- if (drag_time.hour > 0 || drag_time.minute > 0)
- g_date_add_days (&drag_time.date, 1);
- drag_time.hour = 0;
- drag_time.minute = 0;
- }
- }
- e_meeting_time_selector_fix_time_overflows (&drag_time);
-
- /* Set the meeting start or end time to drag_time. */
- if (mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_START)
- time_to_set = &mts->meeting_start_time;
- else
- time_to_set = &mts->meeting_end_time;
-
- /* If the time is unchanged, just return. */
- if (e_meeting_time_compare_times (time_to_set, &drag_time) == 0) {
- GDK_THREADS_LEAVE ();
- goto scroll;
- }
-
- /* Don't let an empty occur for all day events */
- if (mts->all_day
- && mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_START
- && e_meeting_time_compare_times (&mts->meeting_end_time, &drag_time) == 0)
- goto scroll;
- else if (mts->all_day
- && mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_END
- && e_meeting_time_compare_times (&mts->meeting_start_time, &drag_time) == 0)
- goto scroll;
-
- *time_to_set = drag_time;
-
- /* Check if the start time and end time need to be switched. */
- if (e_meeting_time_compare_times (&mts->meeting_start_time, &mts->meeting_end_time) > 0) {
- drag_time = mts->meeting_start_time;
- mts->meeting_start_time = mts->meeting_end_time;
- mts->meeting_end_time = drag_time;
-
- if (mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_START)
- mts->dragging_position = E_MEETING_TIME_SELECTOR_POS_END;
- else
- mts->dragging_position = E_MEETING_TIME_SELECTOR_POS_START;
-
- set_both_times = TRUE;
- }
-
- /* Mark the calculated positions as invalid. */
- mts->meeting_positions_valid = FALSE;
-
- /* Set the times in the GnomeDateEdit widgets. */
- if (set_both_times
- || mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_START)
- e_meeting_time_selector_update_start_date_edit (mts);
-
- if (set_both_times
- || mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_END)
- e_meeting_time_selector_update_end_date_edit (mts);
-
- if (set_both_times
- || mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_END
- || mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_START)
- gtk_signal_emit (GTK_OBJECT (mts), mts_signals [CHANGED]);
-
- scroll:
- /* Redraw the canvases. We freeze and thaw the layouts so that they
- get redrawn completely. Otherwise the pixels get scrolled left or
- right which is not good for us (since our vertical bars have been
- moved) and causes flicker. */
- gtk_layout_freeze (GTK_LAYOUT (mts->display_main));
- gtk_layout_freeze (GTK_LAYOUT (mts->display_top));
- gnome_canvas_scroll_to (GNOME_CANVAS (mts->display_main),
- scroll_x, scroll_y);
- gnome_canvas_scroll_to (GNOME_CANVAS (mts->display_top),
- scroll_x, scroll_y);
- gtk_layout_thaw (GTK_LAYOUT (mts->display_main));
- gtk_layout_thaw (GTK_LAYOUT (mts->display_top));
-
- GDK_THREADS_LEAVE ();
- return TRUE;
-}
-
-
-/* This removes our auto-scroll timeout function, if we have one installed. */
-void
-e_meeting_time_selector_remove_timeout (EMeetingTimeSelector *mts)
-{
- if (mts->auto_scroll_timeout_id) {
- g_source_remove (mts->auto_scroll_timeout_id);
- mts->auto_scroll_timeout_id = 0;
- }
-}
-
-
-/* This updates the GnomeDateEdit widget displaying the meeting start time. */
-static void
-e_meeting_time_selector_update_start_date_edit (EMeetingTimeSelector *mts)
-{
- e_date_edit_set_date_and_time_of_day (E_DATE_EDIT (mts->start_date_edit),
- g_date_year (&mts->meeting_start_time.date),
- g_date_month (&mts->meeting_start_time.date),
- g_date_day (&mts->meeting_start_time.date),
- mts->meeting_start_time.hour,
- mts->meeting_start_time.minute);
-}
-
-
-/* This updates the GnomeDateEdit widget displaying the meeting end time. */
-static void
-e_meeting_time_selector_update_end_date_edit (EMeetingTimeSelector *mts)
-{
- GDate date;
-
- date = mts->meeting_end_time.date;
- if (mts->all_day)
- g_date_subtract_days (&date, 1);
-
- e_date_edit_set_date_and_time_of_day (E_DATE_EDIT (mts->end_date_edit),
- g_date_year (&date),
- g_date_month (&date),
- g_date_day (&date),
- mts->meeting_end_time.hour,
- mts->meeting_end_time.minute);
-}
-
-
-/* This ensures that the meeting time is shown on screen, by scrolling the
- canvas and possibly by changing the range of dates shown in the canvas. */
-static void
-e_meeting_time_selector_ensure_meeting_time_shown (EMeetingTimeSelector *mts)
-{
- gint start_x, end_x, scroll_x, scroll_y, canvas_width;
- gint new_scroll_x;
- gboolean fits_in_canvas;
-
- /* Check if we need to change the range of dates shown. */
- if (g_date_compare (&mts->meeting_start_time.date,
- &mts->first_date_shown) < 0
- || g_date_compare (&mts->meeting_end_time.date,
- &mts->last_date_shown) > 0) {
- e_meeting_time_selector_update_dates_shown (mts);
- gtk_widget_queue_draw (mts->display_top);
- gtk_widget_queue_draw (mts->display_main);
- }
-
- /* If all of the meeting time is visible, just return. */
- e_meeting_time_selector_get_meeting_time_positions (mts, &start_x,
- &end_x);
- gnome_canvas_get_scroll_offsets (GNOME_CANVAS (mts->display_main),
- &scroll_x, &scroll_y);
- canvas_width = mts->display_main->allocation.width;
- if (start_x > scroll_x && end_x <= scroll_x + canvas_width)
- return;
-
- fits_in_canvas = end_x - start_x < canvas_width ? TRUE : FALSE;
-
- /* If the meeting is not entirely visible, either center it if it is
- smaller than the canvas, or show the start of it if it is big. */
- if (fits_in_canvas) {
- new_scroll_x = (start_x + end_x - canvas_width) / 2;
- } else {
- new_scroll_x = start_x;
- }
- gnome_canvas_scroll_to (GNOME_CANVAS (mts->display_main),
- new_scroll_x, scroll_y);
-}
-
-
-/* This updates the range of dates shown in the canvas, to make sure that the
- currently selected meeting time is in the range. */
-static void
-e_meeting_time_selector_update_dates_shown (EMeetingTimeSelector *mts)
-{
- mts->first_date_shown = mts->meeting_start_time.date;
- g_date_subtract_days (&mts->first_date_shown,
- E_MEETING_TIME_SELECTOR_DAYS_START_BEFORE);
-
- mts->last_date_shown = mts->first_date_shown;
- g_date_add_days (&mts->last_date_shown,
- E_MEETING_TIME_SELECTOR_DAYS_SHOWN - 1);
-}
-
-
-/* This checks if the time's hour is over 24 or its minute is over 60 and if
- so it updates the day/hour appropriately. Note that hours and minutes are
- stored in guint8's so they can't overflow by much. */
-void
-e_meeting_time_selector_fix_time_overflows (EMeetingTime*mtstime)
-{
- gint hours_to_add, days_to_add;
-
- hours_to_add = mtstime->minute / 60;
- if (hours_to_add > 0) {
- mtstime->minute -= hours_to_add * 60;
- mtstime->hour += hours_to_add;
- }
-
- days_to_add = mtstime->hour / 24;
- if (days_to_add > 0) {
- mtstime->hour -= days_to_add * 24;
- g_date_add_days (&mtstime->date, days_to_add);
- }
-}
-
-/*
- * CONVERSION ROUTINES - functions to convert between different coordinate
- * spaces and dates.
- */
-
-/* This takes an x pixel coordinate within the entire canvas scroll region and
- returns the date in which it falls. If day_position is not NULL it also
- returns the x coordinate within the date, relative to the visible part of
- the canvas. It is used when painting the days in the item_draw function.
- Note that it must handle negative x coordinates in case we are dragging off
- the edge of the canvas. */
-void
-e_meeting_time_selector_calculate_day_and_position (EMeetingTimeSelector *mts,
- gint x,
- GDate *date,
- gint *day_position)
-{
- gint days_from_first_shown;
-
- *date = mts->first_date_shown;
-
- if (x >= 0) {
- days_from_first_shown = x / mts->day_width;
- g_date_add_days (date, days_from_first_shown);
- if (day_position)
- *day_position = - x % mts->day_width;
- } else {
- days_from_first_shown = -x / mts->day_width + 1;
- g_date_subtract_days (date, days_from_first_shown);
- if (day_position)
- *day_position = -mts->day_width - x % mts->day_width;
- }
-}
-
-
-/* This takes an x pixel coordinate within a day, and converts it to hours
- and minutes, depending on working_hours_only and zoomed_out. */
-void
-e_meeting_time_selector_convert_day_position_to_hours_and_mins (EMeetingTimeSelector *mts, gint day_position, guint8 *hours, guint8 *minutes)
-{
- if (mts->zoomed_out)
- day_position *= 3;
-
- /* Calculate the hours & minutes from the first displayed. */
- *hours = day_position / mts->col_width;
- *minutes = (day_position % mts->col_width) * 60 / mts->col_width;
-
- /* Now add on the first hour shown. */
- *hours += mts->first_hour_shown;
-}
-
-
-/* This takes an x pixel coordinate within the entire canvas scroll region and
- returns the time in which it falls. Note that it won't be extremely
- accurate since hours may only be a few pixels wide in the display.
- With zoomed_out set each pixel may represent 5 minutes or more, depending
- on how small the font is. */
-void
-e_meeting_time_selector_calculate_time (EMeetingTimeSelector *mts,
- gint x,
- EMeetingTime*time)
-{
- gint day_position;
-
- /* First get the day and the x position within the day. */
- e_meeting_time_selector_calculate_day_and_position (mts, x, &time->date,
- NULL);
-
- /* Now convert the day_position into an hour and minute. */
- if (x >= 0)
- day_position = x % mts->day_width;
- else
- day_position = mts->day_width + x % mts->day_width;
-
- e_meeting_time_selector_convert_day_position_to_hours_and_mins (mts, day_position, &time->hour, &time->minute);
-}
-
-
-/* This takes a EMeetingTime and calculates the x pixel coordinate
- within the entire canvas scroll region. It is used to draw the selected
- meeting time and all the busy periods. */
-gint
-e_meeting_time_selector_calculate_time_position (EMeetingTimeSelector *mts,
- EMeetingTime *mtstime)
-{
- gint x, date_offset, day_offset;
-
- /* Calculate the number of days since the first date shown in the
- entire canvas scroll region. */
- date_offset = g_date_julian (&mtstime->date) - g_date_julian (&mts->first_date_shown);
-
- /* Calculate the x pixel coordinate of the start of the day. */
- x = date_offset * mts->day_width;
-
- /* Add on the hours and minutes, depending on whether zoomed_out and
- working_hours_only are set. */
- day_offset = (mtstime->hour - mts->first_hour_shown) * 60
- + mtstime->minute;
- /* The day width includes an extra vertical grid line so subtract 1. */
- day_offset *= (mts->day_width - 1);
- day_offset /= (mts->last_hour_shown - mts->first_hour_shown) * 60;
-
- /* Clamp the day_offset in case the time isn't actually visible. */
- x += CLAMP (day_offset, 0, mts->day_width);
-
- return x;
-}
-
-static void
-row_inserted_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
-{
- EMeetingTimeSelector *mts = E_MEETING_TIME_SELECTOR (data);
- int row = gtk_tree_path_get_indices (path) [0];
- /* Update the scroll region. */
- e_meeting_time_selector_update_main_canvas_scroll_region (mts);
-
- /* Redraw */
- gtk_widget_queue_draw (mts->display_top);
- gtk_widget_queue_draw (mts->display_main);
-
- /* Get the latest free/busy info */
- e_meeting_time_selector_refresh_free_busy (mts, row, FALSE);
-}
-
-static void
-row_changed_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
-{
- EMeetingTimeSelector *mts = E_MEETING_TIME_SELECTOR (data);
- int row = gtk_tree_path_get_indices (path) [0];
-
- /* Get the latest free/busy info */
- e_meeting_time_selector_refresh_free_busy (mts, row, FALSE);
-}
-
-static void
-row_deleted_cb (GtkTreeModel *model, GtkTreePath *path, gpointer data)
-{
- EMeetingTimeSelector *mts = E_MEETING_TIME_SELECTOR (data);
-
- /* Update the scroll region. */
- e_meeting_time_selector_update_main_canvas_scroll_region (mts);
-
- /* Redraw */
- gtk_widget_queue_draw (mts->display_top);
- gtk_widget_queue_draw (mts->display_main);
-}
-
-
-#define REFRESH_PAUSE 5000
-
-static gboolean
-free_busy_timeout_refresh (gpointer data)
-{
- char *fb_uri;
-
- EMeetingTimeSelector *mts = E_MEETING_TIME_SELECTOR (data);
-
- fb_uri = calendar_config_get_free_busy_template ();
- e_meeting_store_set_fb_uri (mts->model, fb_uri);
- g_free (fb_uri);
-
- /* Update all free/busy info, so we use the new template uri */
- e_meeting_time_selector_refresh_free_busy (mts, 0, TRUE);
-
- mts->fb_refresh_not = 0;
-
- return FALSE;
-}
-
-static void
-free_busy_template_changed_cb (GConfClient *client,
- guint cnxn_id,
- GConfEntry *entry,
- gpointer data)
-{
- EMeetingTimeSelector *mts = E_MEETING_TIME_SELECTOR (data);
-
- /* Wait REFRESH_PAUSE before refreshing, using the latest uri value */
- if (mts->fb_refresh_not != 0) {
- g_source_remove (mts->fb_refresh_not);
- }
-
- mts->fb_refresh_not = g_timeout_add (REFRESH_PAUSE,
- free_busy_timeout_refresh,
- data);
-}
diff --git a/calendar/gui/e-meeting-time-sel.etspec b/calendar/gui/e-meeting-time-sel.etspec
deleted file mode 100644
index c0b5c721dd..0000000000
--- a/calendar/gui/e-meeting-time-sel.etspec
+++ /dev/null
@@ -1,19 +0,0 @@
-<ETableSpecification click-to-add="true" click-to-add-end="true" _click-to-add-message="Click here to add an attendee" draw-grid="true">
- <ETableColumn model_col= "0" _title="Attendee" expansion="2.0" minimum_width="10" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "1" _title="Member" expansion="2.0" minimum_width="10" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "2" _title="Type" expansion="1.0" minimum_width="10" resizable="true" cell="typeedit" compare="string"/>
- <ETableColumn model_col= "3" _title="Role" expansion="1.0" minimum_width="10" resizable="true" cell="roleedit" compare="string"/>
- <ETableColumn model_col= "4" _title="RSVP" expansion="1.0" minimum_width="10" resizable="true" cell="rsvpedit" compare="string"/>
- <ETableColumn model_col= "5" _title="Delegated To" expansion="2.0" minimum_width="10" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "6" _title="Delegated From" expansion="2.0" minimum_width="10" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "7" _title="Status" expansion="1.0" minimum_width="10" resizable="true" cell="statusedit" compare="string"/>
- <ETableColumn model_col= "8" _title="Common Name" expansion="2.0" minimum_width="10" resizable="true" cell="string" compare="string"/>
- <ETableColumn model_col= "9" _title="Language" expansion="2.0" minimum_width="10" resizable="true" cell="string" compare="string"/>
-
- <ETableState>
- <column source="0"/>
- <column source="2"/>
- <column source="7"/>
- <grouping></grouping>
- </ETableState>
-</ETableSpecification>
diff --git a/calendar/gui/e-meeting-time-sel.h b/calendar/gui/e-meeting-time-sel.h
deleted file mode 100644
index b3ff09f18f..0000000000
--- a/calendar/gui/e-meeting-time-sel.h
+++ /dev/null
@@ -1,392 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@gtk.org>
- *
- * Copyright 1999, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-#ifndef _E_MEETING_TIME_SELECTOR_H_
-#define _E_MEETING_TIME_SELECTOR_H_
-
-#include <glib.h>
-#include <gtk/gtkaccelgroup.h>
-#include <gtk/gtktable.h>
-#include <gtk/gtkwidget.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include <gal/e-text/e-text.h>
-#include <gal/e-table/e-table-model.h>
-#include <gal/e-table/e-table.h>
-#include "e-meeting-store.h"
-#include "e-meeting-list-view.h"
-
-G_BEGIN_DECLS
-
-/*
- * EMeetingTimeSelector displays a list of attendees for a meeting and a
- * graphical summary of the times which they are free and busy, allowing the
- * user to select an appropriate time for a meeting.
- */
-
-/* Define this to include the debugging functions. */
-#undef E_MEETING_TIME_SELECTOR_DEBUG
-
-/* This is the width of the icon column in the attendees list. */
-#define E_MEETING_TIME_SELECTOR_ICON_COLUMN_WIDTH 24
-
-#define E_MEETING_TIME_SELECTOR_TEXT_Y_PAD 3
-#define E_MEETING_TIME_SELECTOR_TEXT_X_PAD 2
-
-
-/* This is used to specify the format used when displaying the dates.
- The full format is like 'Sunday, September 12, 1999'. The abbreviated format
- is like 'Sun 12/9/99'. The short format is like '12/9/99'. The actual
- format used is determined in e_meeting_time_selector_style_set(), once we
- know the font being used. */
-typedef enum
-{
- E_MEETING_TIME_SELECTOR_DATE_FULL,
- E_MEETING_TIME_SELECTOR_DATE_ABBREVIATED_DAY,
- E_MEETING_TIME_SELECTOR_DATE_SHORT
-} EMeetingTimeSelectorDateFormat;
-
-
-/* This is used to specify a position regarding the vertical bars around the
- current meeting time, so we know which one is being dragged. */
-typedef enum
-{
- E_MEETING_TIME_SELECTOR_POS_NONE,
- E_MEETING_TIME_SELECTOR_POS_START,
- E_MEETING_TIME_SELECTOR_POS_END
-} EMeetingTimeSelectorPosition;
-
-
-/* This is used to specify the autopick option, which determines how we choose
- the previous/next appropriate meeting time. */
-typedef enum
-{
- E_MEETING_TIME_SELECTOR_ALL_PEOPLE_AND_RESOURCES,
- E_MEETING_TIME_SELECTOR_ALL_PEOPLE_AND_ONE_RESOURCE,
- E_MEETING_TIME_SELECTOR_REQUIRED_PEOPLE,
- E_MEETING_TIME_SELECTOR_REQUIRED_PEOPLE_AND_ONE_RESOURCE
-} EMeetingTimeSelectorAutopickOption;
-
-/* An array of hour strings for 24 hour time, "0:00" .. "23:00". */
-extern const gchar *EMeetingTimeSelectorHours[24];
-/* An array of hour strings for 12 hour time, "12:00am" .. "11:00pm". */
-extern const gchar *EMeetingTimeSelectorHours12[24];
-
-
-#define E_MEETING_TIME_SELECTOR(obj) GTK_CHECK_CAST (obj, e_meeting_time_selector_get_type (), EMeetingTimeSelector)
-#define E_MEETING_TIME_SELECTOR_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_meeting_time_selector_get_type (), EMeetingTimeSelectorClass)
-#define IS_E_MEETING_TIME_SELECTOR(obj) GTK_CHECK_TYPE (obj, e_meeting_time_selector_get_type ())
-
-
-typedef struct _EMeetingTimeSelector EMeetingTimeSelector;
-typedef struct _EMeetingTimeSelectorClass EMeetingTimeSelectorClass;
-
-struct _EMeetingTimeSelector
-{
- /* We subclass a GtkTable which makes it easy to add extra widgets
- if neccesary. */
- GtkTable table;
-
- /*
- * User Interface stuff - widgets, colors etc.
- */
-
- /* This contains our keyboard accelerators, which need to be added to
- the toplevel window. */
- GtkAccelGroup *accel_group;
-
- /* The vbox in the top-left corner, containing the 'All Attendees'
- title bar packed at the end. Extra widgets can be added here
- with PACK_START if necessary. */
- GtkWidget *attendees_vbox;
- GtkWidget *attendees_vbox_spacer;
-
- /* The etable and model */
- EMeetingStore *model;
- EMeetingListView *list_view;
-
- /* The canvas displaying the dates, times, and the summary
- 'All Attendees' free/busy display. */
- GtkWidget *display_top;
-
- /* The canvas containing the free/busy displays of individual
- attendees. This is separate from display_top since it also scrolls
- vertically. */
- GtkWidget *display_main;
-
- /* The 'Add attendees from addressbook' button */
- GtkWidget *add_attendees_button;
-
- /* This is the 'Options' button & menu. */
- GtkWidget *options_button;
- GtkWidget *options_menu;
-
- /* This is the 'Autopick' button, menu & radio menu items. */
- GtkWidget *autopick_down_button;
- GtkWidget *autopick_button;
- GtkWidget *autopick_up_button;
- GtkWidget *autopick_menu;
- GtkWidget *autopick_all_item;
- GtkWidget *autopick_all_people_one_resource_item;
- GtkWidget *autopick_required_people_item;
- GtkWidget *autopick_required_people_one_resource_item;
-
- /* The horizontal scrollbar which scrolls display_top & display_main.*/
- GtkWidget *hscrollbar;
-
- /* The vertical scrollbar which scrolls attendees & display_main. */
- GtkWidget *vscrollbar;
-
- /* The 2 EDateEdit widgets for the meeting start & end times. */
- GtkWidget *start_date_edit;
- GtkWidget *end_date_edit;
-
- /* Colors. */
- GdkColor bg_color;
- GdkColor all_attendees_bg_color;
- GdkColor meeting_time_bg_color;
- GdkColor stipple_bg_color;
- GdkColor attendee_list_bg_color;
- GdkColor grid_color;
- GdkColor grid_shadow_color;
- GdkColor grid_unused_color;
- GdkColor busy_colors[E_MEETING_FREE_BUSY_LAST];
-
- /* The stipple used for attendees with no data. */
- GdkPixmap *stipple;
-
- /* GC for drawing the color key. */
- GdkGC *color_key_gc;
-
- /* Width of the hours strings (e.g. "1:00") in the current font. */
- gint hour_widths[24];
-
- /* Whether we are using the full, abbreviated or short date format. */
- EMeetingTimeSelectorDateFormat date_format;
-
- /*
- * Option Settings.
- */
-
- /* True if we are selecting all day events */
- gboolean all_day;
-
- /* If this is TRUE we only show hours between day_start_hour and
- day_end_hour, defaults to TRUE (9am-6pm). */
- gboolean working_hours_only;
- gint day_start_hour;
- gint day_start_minute;
- gint day_end_hour;
- gint day_end_minute;
-
- /* If TRUE, view is compressed, with one cell for every 3 hours rather
- than every hour. Defaults to FALSE. */
- gboolean zoomed_out;
-
-
- /*
- * Internal Data.
- */
-
- /* These are the first & last dates shown in the current scroll area.
- We show E_MEETING_TIME_SELECTOR_DAYS_SHOWN days at a time. */
- GDate first_date_shown;
- GDate last_date_shown;
-
- /* This is the current selection of the meeting time. */
- EMeetingTime meeting_start_time;
- EMeetingTime meeting_end_time;
-
- /* These are the x pixel coordinates in the entire scroll region of
- the start and end times. Set to meeting_positions_valid to FALSE to
- invalidate. They will then be recomputed when needed. Always access
- with e_meeting_time_selector_get_meeting_time_positions(). */
- gint meeting_positions_valid;
- gint meeting_positions_in_scroll_area;
- gint meeting_start_x;
- gint meeting_end_x;
-
- /* These are the width and height of the cells, including the grid
- lines which are displayed on the right and top or bottom of cells.*/
- gint row_height;
- gint col_width;
-
- /* This is the width of a day in the display, which depends on
- col_width, working_hours_only and zoomed_out. */
- gint day_width;
-
- /* These are the first and last hour of each day we display, depending
- on working_hours_only and zoomed_out. */
- gint first_hour_shown;
- gint last_hour_shown;
-
- /* The id of the source function for auto-scroll timeouts. */
- guint auto_scroll_timeout_id;
-
- /* This specifies if we are dragging one of the vertical bars around
- the meeting time. */
- EMeetingTimeSelectorPosition dragging_position;
-
- /* The last x coordinate of the mouse, relative to either the left or
- right edge of the canvas. Used in the auto_scroll_timeout function
- to determine which way to scroll and how fast. */
- gint last_drag_x;
-
- /* This is used to determine the delay between scrolls. */
- gint scroll_count;
-
- /* The notification function id for Free/Busy template uri changes */
- guint fb_uri_not;
-
- /* The notification function id for Free/Busy refreshes */
- gboolean fb_refresh_not;
-};
-
-
-struct _EMeetingTimeSelectorClass
-{
- GtkTableClass parent_class;
-
- void (* changed) (EMeetingTimeSelector *mts);
-};
-
-
-/*
- * PUBLIC INTERFACE - note that this interface will probably change, when I
- * know where the data is coming from. This is mainly just for testing for now.
- */
-
-GtkType e_meeting_time_selector_get_type (void);
-GtkWidget* e_meeting_time_selector_new (EMeetingStore *ems);
-void e_meeting_time_selector_construct (EMeetingTimeSelector * mts, EMeetingStore *ems);
-
-/* This returns the currently selected meeting time.
- Note that months are 1-12 and days are 1-31. The start time is guaranteed to
- be before or equal to the end time. You may want to check if they are equal
- if that if it is a problem. */
-void e_meeting_time_selector_get_meeting_time (EMeetingTimeSelector *mts,
- gint *start_year,
- gint *start_month,
- gint *start_day,
- gint *start_hour,
- gint *start_minute,
- gint *end_year,
- gint *end_month,
- gint *end_day,
- gint *end_hour,
- gint *end_minute);
-
-/* This sets the meeting time, returning TRUE if it is valid. */
-gboolean e_meeting_time_selector_set_meeting_time (EMeetingTimeSelector *mts,
- gint start_year,
- gint start_month,
- gint start_day,
- gint start_hour,
- gint start_minute,
- gint end_year,
- gint end_month,
- gint end_day,
- gint end_hour,
- gint end_minute);
-
-void e_meeting_time_selector_set_all_day (EMeetingTimeSelector *mts,
- gboolean all_day);
-void e_meeting_time_selector_set_working_hours_only (EMeetingTimeSelector *mts,
- gboolean working_hours_only);
-void e_meeting_time_selector_set_working_hours (EMeetingTimeSelector *mts,
- gint day_start_hour,
- gint day_start_minute,
- gint day_end_hour,
- gint day_end_minute);
-
-void e_meeting_time_selector_set_zoomed_out (EMeetingTimeSelector *mts,
- gboolean zoomed_out);
-
-EMeetingTimeSelectorAutopickOption e_meeting_time_selector_get_autopick_option (EMeetingTimeSelector *mts);
-void e_meeting_time_selector_set_autopick_option (EMeetingTimeSelector *mts,
- EMeetingTimeSelectorAutopickOption autopick_option);
-
-void e_meeting_time_selector_attendee_set_send_meeting_to (EMeetingTimeSelector *mts,
- gint row,
- gboolean send_meeting_to);
-
-void e_meeting_time_selector_set_read_only (EMeetingTimeSelector *mts, gboolean read_only);
-
-/* Clears all busy times for the given attendee. */
-void e_meeting_time_selector_attendee_clear_busy_periods (EMeetingTimeSelector *mts,
- gint row);
-/* Adds one busy time for the given attendee. */
-gboolean e_meeting_time_selector_attendee_add_busy_period (EMeetingTimeSelector *mts,
- gint row,
- gint start_year,
- gint start_month,
- gint start_day,
- gint start_hour,
- gint start_minute,
- gint end_year,
- gint end_month,
- gint end_day,
- gint end_hour,
- gint end_minute,
- EMeetingFreeBusyType busy_type);
-
-
-
-/*
- * INTERNAL ROUTINES - functions to communicate with the canvas items within
- * the EMeetingTimeSelector.
- */
-
-/* This returns the x pixel coordinates of the meeting start and end times,
- in the entire canvas scroll area. If it returns FALSE, then the meeting
- time isn't in the current scroll area (which shouldn't really happen). */
-gboolean e_meeting_time_selector_get_meeting_time_positions (EMeetingTimeSelector *mts,
- gint *start_x,
- gint *end_x);
-
-void e_meeting_time_selector_drag_meeting_time (EMeetingTimeSelector *mts,
- gint x);
-
-void e_meeting_time_selector_remove_timeout (EMeetingTimeSelector *mts);
-
-void e_meeting_time_selector_fix_time_overflows (EMeetingTime*mtstime);
-
-void e_meeting_time_selector_calculate_day_and_position (EMeetingTimeSelector *mts,
- gint x,
- GDate *date,
- gint *day_position);
-void e_meeting_time_selector_convert_day_position_to_hours_and_mins (EMeetingTimeSelector *mts, gint day_position, guint8 *hours, guint8 *minutes);
-void e_meeting_time_selector_calculate_time (EMeetingTimeSelector *mts,
- gint x,
- EMeetingTime*time);
-gint e_meeting_time_selector_calculate_time_position (EMeetingTimeSelector *mts,
- EMeetingTime *mtstime);
-
-/* Debugging function to dump information on all attendees. */
-#ifdef E_MEETING_TIME_SELECTOR_DEBUG
-void e_meeting_time_selector_dump (EMeetingTimeSelector *mts);
-gchar* e_meeting_time_selector_dump_time (EMeetingTime*mtstime);
-gchar* e_meeting_time_selector_dump_date (GDate *date);
-#endif /* E_MEETING_TIME_SELECTOR_DEBUG */
-
-G_END_DECLS
-
-#endif /* _E_MEETING_TIME_SELECTOR_H_ */
diff --git a/calendar/gui/e-meeting-types.h b/calendar/gui/e-meeting-types.h
deleted file mode 100644
index ab330a6d40..0000000000
--- a/calendar/gui/e-meeting-types.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* itip-attendee.h
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: JP Rosevear
- */
-
-#ifndef _E_MEETING_TYPES_H_
-#define _E_MEETING_TYPES_H_
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include "e-meeting-types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-
-
-typedef struct _EMeetingTime EMeetingTime;
-typedef struct _EMeetingFreeBusyPeriod EMeetingFreeBusyPeriod;
-
-/* These are used to specify whether an attendee is free or busy at a
- particular time. We'll probably replace this with a global calendar type.
- These should be ordered in increasing order of preference. Higher precedence
- busy periods will be painted over lower precedence ones. These are also
- used as for loop counters, so they should start at 0 and be ordered. */
-typedef enum
-{
- E_MEETING_FREE_BUSY_TENTATIVE = 0,
- E_MEETING_FREE_BUSY_OUT_OF_OFFICE = 1,
- E_MEETING_FREE_BUSY_BUSY = 2,
-
- E_MEETING_FREE_BUSY_LAST = 3
-} EMeetingFreeBusyType;
-
-/* This is our representation of a time. We use a GDate to store the day,
- and guint8s for the hours and minutes. */
-struct _EMeetingTime
-{
- GDate date;
- guint8 hour;
- guint8 minute;
-};
-
-/* This represents a busy period. */
-struct _EMeetingFreeBusyPeriod
-{
- EMeetingTime start;
- EMeetingTime end;
- EMeetingFreeBusyType busy_type;
-};
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_MEETING_TYPES_H_ */
diff --git a/calendar/gui/e-meeting-utils.c b/calendar/gui/e-meeting-utils.c
deleted file mode 100644
index 496bb8ebaa..0000000000
--- a/calendar/gui/e-meeting-utils.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* itip-model.c
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: JP Rosevear
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-meeting-utils.h"
-
-gint
-e_meeting_time_compare_times (EMeetingTime*time1,
- EMeetingTime*time2)
-{
- gint day_comparison;
-
- day_comparison = g_date_compare (&time1->date,
- &time2->date);
- if (day_comparison != 0)
- return day_comparison;
-
- if (time1->hour < time2->hour)
- return -1;
- if (time1->hour > time2->hour)
- return 1;
-
- if (time1->minute < time2->minute)
- return -1;
- if (time1->minute > time2->minute)
- return 1;
-
- /* The start times are exactly the same. */
- return 0;
-}
diff --git a/calendar/gui/e-meeting-utils.h b/calendar/gui/e-meeting-utils.h
deleted file mode 100644
index 4c2798fcf0..0000000000
--- a/calendar/gui/e-meeting-utils.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* itip-attendee.h
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: JP Rosevear
- */
-
-#ifndef _E_MEETING_UTILS_H_
-#define _E_MEETING_UTILS_H_
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include "e-meeting-types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-
-
-gint e_meeting_time_compare_times (EMeetingTime *time1,
- EMeetingTime *time2);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_MEETING_UTILS_H_ */
-
-
diff --git a/calendar/gui/e-mini-calendar-config.c b/calendar/gui/e-mini-calendar-config.c
deleted file mode 100644
index 120f3dba84..0000000000
--- a/calendar/gui/e-mini-calendar-config.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Author :
- * JP Rosevear <jpr@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#include "calendar-config.h"
-#include "e-mini-calendar-config.h"
-
-struct _EMiniCalendarConfigPrivate {
- ECalendar *mini_cal;
-
- GList *notifications;
-};
-
-/* Property IDs */
-enum props {
- PROP_0,
- PROP_CALENDAR
-};
-
-G_DEFINE_TYPE (EMiniCalendarConfig, e_mini_calendar_config, G_TYPE_OBJECT);
-
-static void
-e_mini_calendar_config_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
-{
- EMiniCalendarConfig *mini_config;
- EMiniCalendarConfigPrivate *priv;
-
- mini_config = E_MINI_CALENDAR_CONFIG (object);
- priv = mini_config->priv;
-
- switch (property_id) {
- case PROP_CALENDAR:
- e_mini_calendar_config_set_calendar (mini_config, g_value_get_object (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-e_mini_calendar_config_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
-{
- EMiniCalendarConfig *mini_config;
- EMiniCalendarConfigPrivate *priv;
-
- mini_config = E_MINI_CALENDAR_CONFIG (object);
- priv = mini_config->priv;
-
- switch (property_id) {
- case PROP_CALENDAR:
- g_value_set_object (value, e_mini_calendar_config_get_calendar (mini_config));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-e_mini_calendar_config_dispose (GObject *object)
-{
- EMiniCalendarConfig *mini_config = E_MINI_CALENDAR_CONFIG (object);
- EMiniCalendarConfigPrivate *priv;
-
- priv = mini_config->priv;
-
- e_mini_calendar_config_set_calendar (mini_config, NULL);
-
- if (G_OBJECT_CLASS (e_mini_calendar_config_parent_class)->dispose)
- G_OBJECT_CLASS (e_mini_calendar_config_parent_class)->dispose (object);
-}
-
-static void
-e_mini_calendar_config_finalize (GObject *object)
-{
- EMiniCalendarConfig *mini_config = E_MINI_CALENDAR_CONFIG (object);
- EMiniCalendarConfigPrivate *priv;
-
- priv = mini_config->priv;
-
- g_free (priv);
-
- if (G_OBJECT_CLASS (e_mini_calendar_config_parent_class)->finalize)
- G_OBJECT_CLASS (e_mini_calendar_config_parent_class)->finalize (object);
-}
-
-static void
-e_mini_calendar_config_class_init (EMiniCalendarConfigClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GParamSpec *spec;
-
- /* Method override */
- gobject_class->set_property = e_mini_calendar_config_set_property;
- gobject_class->get_property = e_mini_calendar_config_get_property;
- gobject_class->dispose = e_mini_calendar_config_dispose;
- gobject_class->finalize = e_mini_calendar_config_finalize;
-
- spec = g_param_spec_object ("calendar", NULL, NULL, e_calendar_get_type (),
- G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT);
- g_object_class_install_property (gobject_class, PROP_CALENDAR, spec);
-}
-
-static void
-e_mini_calendar_config_init (EMiniCalendarConfig *mini_config)
-{
- mini_config->priv = g_new0 (EMiniCalendarConfigPrivate, 1);
-
-}
-
-EMiniCalendarConfig *
-e_mini_calendar_config_new (ECalendar *mini_cal)
-{
- EMiniCalendarConfig *mini_config;
-
- mini_config = g_object_new (e_mini_calendar_config_get_type (), "calendar", mini_cal, NULL);
-
- return mini_config;
-}
-
-ECalendar *
-e_mini_calendar_config_get_calendar (EMiniCalendarConfig *mini_config)
-{
- EMiniCalendarConfigPrivate *priv;
-
- g_return_val_if_fail (mini_config != NULL, NULL);
- g_return_val_if_fail (E_IS_MINI_CALENDAR_CONFIG (mini_config), NULL);
-
- priv = mini_config->priv;
-
- return priv->mini_cal;
-}
-
-static void
-set_week_start (ECalendar *mini_cal)
-{
- int week_start_day;
-
- week_start_day = calendar_config_get_week_start_day ();
-
- /* Convert it to 0 (Mon) to 6 (Sun), which is what we use. */
- week_start_day = (week_start_day + 6) % 7;
-
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (mini_cal->calitem),
- "week_start_day", week_start_day,
- NULL);
-}
-
-static void
-week_start_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EMiniCalendarConfig *mini_config = data;
- EMiniCalendarConfigPrivate *priv;
-
- priv = mini_config->priv;
-
- set_week_start (priv->mini_cal);
-}
-
-static void
-set_dnav_show_week_no (ECalendar *mini_cal)
-{
- gboolean show_week_no;
-
- show_week_no = calendar_config_get_dnav_show_week_no ();
-
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (mini_cal->calitem),
- "show_week_numbers", show_week_no,
- NULL);
-}
-
-static void
-dnav_show_week_no_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EMiniCalendarConfig *mini_config = data;
- EMiniCalendarConfigPrivate *priv;
-
- priv = mini_config->priv;
-
- set_dnav_show_week_no (priv->mini_cal);
-}
-
-void
-e_mini_calendar_config_set_calendar (EMiniCalendarConfig *mini_config, ECalendar *mini_cal)
-{
- EMiniCalendarConfigPrivate *priv;
- guint not;
- GList *l;
-
- g_return_if_fail (mini_config != NULL);
- g_return_if_fail (E_IS_MINI_CALENDAR_CONFIG (mini_config));
-
- priv = mini_config->priv;
-
- if (priv->mini_cal) {
- g_object_unref (priv->mini_cal);
- priv->mini_cal = NULL;
- }
-
- for (l = priv->notifications; l; l = l->next)
- calendar_config_remove_notification (GPOINTER_TO_UINT (l->data));
-
- g_list_free (priv->notifications);
- priv->notifications = NULL;
-
- /* If the new view is NULL, return right now */
- if (!mini_cal)
- return;
-
- priv->mini_cal = g_object_ref (mini_cal);
-
- /* Week start */
- set_week_start (mini_cal);
-
- not = calendar_config_add_notification_week_start_day (week_start_changed_cb, mini_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Show week numbers */
- set_dnav_show_week_no (mini_cal);
-
- not = calendar_config_add_notification_dnav_show_week_no (dnav_show_week_no_changed_cb, mini_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-}
diff --git a/calendar/gui/e-mini-calendar-config.h b/calendar/gui/e-mini-calendar-config.h
deleted file mode 100644
index 78b9cfd363..0000000000
--- a/calendar/gui/e-mini-calendar-config.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Author :
- * JP Rosevear <jpr@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#ifndef _E_MINI_CALENDAR_CONFIG_H_
-#define _E_MINI_CALENDAR_CONFIG_H_
-
-#include <widgets/misc/e-calendar.h>
-
-G_BEGIN_DECLS
-
-#define E_MINI_CALENDAR_CONFIG(obj) GTK_CHECK_CAST (obj, e_mini_calendar_config_get_type (), EMiniCalendarConfig)
-#define E_MINI_CALENDAR_CONFIG_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_mini_calendar_config_get_type (), EMiniCalendarConfigClass)
-#define E_IS_MINI_CALENDAR_CONFIG(obj) GTK_CHECK_TYPE (obj, e_mini_calendar_config_get_type ())
-
-typedef struct _EMiniCalendarConfig EMiniCalendarConfig;
-typedef struct _EMiniCalendarConfigClass EMiniCalendarConfigClass;
-typedef struct _EMiniCalendarConfigPrivate EMiniCalendarConfigPrivate;
-
-struct _EMiniCalendarConfig {
- GObject parent;
-
- EMiniCalendarConfigPrivate *priv;
-};
-
-struct _EMiniCalendarConfigClass {
- GObjectClass parent_class;
-};
-
-GType e_mini_calendar_config_get_type (void);
-EMiniCalendarConfig *e_mini_calendar_config_new (ECalendar *mini_cal);
-ECalendar *e_mini_calendar_config_get_calendar (EMiniCalendarConfig *mini_config);
-void e_mini_calendar_config_set_calendar (EMiniCalendarConfig *mini_config, ECalendar *mini_cal);
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/e-pub-utils.c b/calendar/gui/e-pub-utils.c
deleted file mode 100644
index 235ce8d159..0000000000
--- a/calendar/gui/e-pub-utils.c
+++ /dev/null
@@ -1,337 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/* Evolution calendar Free/Busy utilities and types
- *
- * Copyright (C) 2004 Ximian, Inc.
- *
- * Author: Gary Ekker <gekker@novell.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <string.h>
-#include <glib.h>
-#include <gconf/gconf.h>
-#include <gconf/gconf-client.h>
-#include <libedataserver/e-source.h>
-#include <libedataserver/e-source-list.h>
-#include <libecal/e-cal-time-util.h>
-#include <libgnome/gnome-i18n.h>
-#include "e-util/e-passwords.h"
-#include "calendar-config.h"
-#include "common/authentication.h"
-#include "itip-utils.h"
-#include "e-pub-utils.h"
-
-void
-e_pub_uri_from_xml (EPublishUri *uri, const gchar *xml)
-{
- xmlDocPtr doc;
- xmlNodePtr root, p;
- xmlChar *location, *enabled, *frequency;
- xmlChar *username, *publish_time;
- GSList *l = NULL;
-
- uri->location = NULL;
- doc = xmlParseDoc ((char *)xml);
- if (doc == NULL) {
- uri->location = NULL;
- return;
- }
-
- root = doc->children;
- if (strcmp (root->name, "uri") != 0) {
- return;
- }
- location = xmlGetProp (root, "location");
- enabled = xmlGetProp (root, "enabled");
- frequency = xmlGetProp (root, "frequency");
- username = xmlGetProp (root, "username");
- publish_time = xmlGetProp (root, "publish_time");
-
- if (location != NULL)
- uri->location = g_strdup (location);
- if (enabled != NULL)
- uri->enabled = atoi (enabled);
- if (frequency != NULL)
- uri->publish_freq = atoi (frequency);
- if (username != NULL)
- uri->username = g_strdup (username);
- if (publish_time != NULL)
- uri->last_pub_time = g_strdup (publish_time);
-
- uri->password = g_strdup ("");
-
- for (p = root->children; p != NULL; p = p->next) {
- xmlChar *uid = xmlGetProp (p, "uid");
-
- l = g_slist_append (l, uid);
- }
- uri->calendars = l;
-
- xmlFree(location);
- xmlFree(enabled);
- xmlFreeDoc(doc);
- return;
-}
-
-gchar *
-e_pub_uri_to_xml (EPublishUri *uri)
-{
- xmlDocPtr doc;
- xmlNodePtr root;
- gchar *enabled, *frequency;
- GSList *cals = NULL;
- xmlChar *xml_buffer;
- char *returned_buffer;
- int xml_buffer_size;
-
- g_return_val_if_fail (uri != NULL, NULL);
- g_return_val_if_fail (uri->location != NULL, NULL);
-
- doc = xmlNewDoc ("1.0");
-
- root = xmlNewDocNode (doc, NULL, "uri", NULL);
- enabled = g_strdup_printf ("%d", uri->enabled);
- frequency = g_strdup_printf ("%d", uri->publish_freq);
- xmlSetProp (root, "location", uri->location);
- xmlSetProp (root, "enabled", enabled);
- xmlSetProp (root, "frequency", frequency);
- xmlSetProp (root, "username", uri->username);
- xmlSetProp (root, "publish_time", uri->last_pub_time);
-
- for (cals = uri->calendars; cals != NULL; cals = cals->next) {
- xmlNodePtr node;
-
- node = xmlNewChild (root, NULL, "source", NULL);
- xmlSetProp (node, "uid", cals->data);
- }
- xmlDocSetRootElement (doc, root);
-
- xmlDocDumpMemory (doc, &xml_buffer, &xml_buffer_size);
- xmlFreeDoc (doc);
-
- returned_buffer = g_malloc (xml_buffer_size + 1);
- memcpy (returned_buffer, xml_buffer, xml_buffer_size);
- returned_buffer [xml_buffer_size] = '\0';
- xmlFree (xml_buffer);
- g_free (enabled);
-
- return returned_buffer;
-}
-
-static gboolean
-is_publish_time (EPublishUri *uri) {
- icaltimezone *utc;
- struct icaltimetype current_itt, adjust_itt;
-
- if (!uri->last_pub_time) {
- utc = icaltimezone_get_utc_timezone ();
- current_itt = icaltime_current_time_with_zone (utc);
- uri->last_pub_time = g_strdup (icaltime_as_ical_string (current_itt));
- return TRUE;
-
- } else {
- if (strlen (uri->last_pub_time) == 0) {
- uri->last_pub_time = g_strdup (icaltime_as_ical_string (current_itt));
- return TRUE;
- }
-
- utc = icaltimezone_get_utc_timezone ();
- current_itt = icaltime_current_time_with_zone (utc);
- adjust_itt = icaltime_from_string (uri->last_pub_time);
-
- switch (uri->publish_freq) {
- case URI_PUBLISH_DAILY:
- icaltime_adjust (&adjust_itt, 1, 0, 0, 0);
- if (icaltime_compare_date_only (adjust_itt, current_itt ) < 0) {
- uri->last_pub_time = g_strdup (icaltime_as_ical_string (current_itt));
- return TRUE;
- }
- break;
- case URI_PUBLISH_WEEKLY:
- icaltime_adjust (&adjust_itt, 7, 0, 0, 0);
- if (icaltime_compare_date_only (adjust_itt, current_itt ) < 0) {
- uri->last_pub_time = g_strdup (icaltime_as_ical_string (current_itt));
- return TRUE;
- }
- break;
- }
- }
-
- return FALSE;
-}
-
-static gboolean
-just_published (gchar *last_pub_time) {
- icaltimezone *utc;
- struct icaltimetype current_itt, adjust_itt;
-
- if (strlen (last_pub_time) != 0) {
- utc = icaltimezone_get_utc_timezone ();
- adjust_itt = icaltime_from_string (last_pub_time);
- current_itt = icaltime_current_time_with_zone (utc);
- icaltime_adjust (&adjust_itt, 0, 0, 0, 3);
- if (icaltime_compare (adjust_itt, current_itt) < 0)
- return TRUE;
- else
- return FALSE;
- }
-
-
- return TRUE;
-}
-
-void
-e_pub_publish (gboolean publish) {
- icaltimezone *utc;
- time_t start = time (NULL), end;
- GSList *uri_config_list, *l, *uri_list = NULL;
- ESourceList *source_list;
- GConfClient *gconf_client;
- gboolean published = FALSE;
-
- gconf_client = gconf_client_get_default ();
- source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/calendar/sources");
-
- utc = icaltimezone_get_utc_timezone ();
- start = time_day_begin_with_zone (start, utc);
- end = time_add_week_with_zone (start, 6, utc);
-
- uri_config_list = calendar_config_get_free_busy ();
-
- for (l = uri_config_list; l != NULL; l = l->next) {
- GSList *p =NULL;
- EPublishUri *uri;
- ECalComponent *clone = NULL;
- gboolean cloned = FALSE;
- ECal *client = NULL;
- char *prompt;
- gboolean remember = FALSE;
- gchar *password;
-
- gchar *xml = (gchar *)l->data;
-
- uri = g_new0 (EPublishUri, 1);
- e_pub_uri_from_xml (uri, xml);
-
- /* kludge to safeguard against loop from gconf update */
- if (!just_published (uri->last_pub_time))
- return;
-
- /* TODO: make sure we're online */
- /* skip this url if it isn't enabled or if it is manual */
- if (!uri->enabled) {
- uri_config_list = g_slist_next (uri_config_list);
- continue;
- }
-
- if (!publish) {
- /* a g_idle publish, make sure we are not set to user only */
- if (uri->publish_freq == URI_PUBLISH_USER) {
- uri_config_list = g_slist_next (uri_config_list);
- continue;
- }
-
- /* If not is it time to publish again? */
- publish = is_publish_time (uri);
-
- }
-
- /* User published or config change */
- if (publish) {
- /* We still need to set the last_pub_time */
- uri->last_pub_time = 0;
- is_publish_time (uri);
-
- for (p = uri->calendars; p != NULL; p = p->next) {
- GList *comp_list = NULL;
- gchar *source_uid;
- ESource * source;
-
- source_uid = g_strdup (p->data);
- source = e_source_list_peek_source_by_uid (source_list, source_uid);
- if (source)
- client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_EVENT);
-
- if (!client) {
- g_warning (G_STRLOC ": Could not publish Free/Busy: Calendar backend no longer exists");
-
- continue;
- }
-
- e_cal_open (client, TRUE, NULL);
-
- if (e_cal_get_free_busy ((ECal *) client, NULL,
- start, end,
- &comp_list, NULL)) {
- GList *l;
-
- for (l = comp_list; l; l = l->next) {
- ECalComponent *comp = E_CAL_COMPONENT (l->data);
-
- cloned = itip_publish_begin (comp, (ECal *) client, cloned, &clone);
- g_object_unref (comp);
- }
- g_list_free (comp_list);
- }
-
- g_object_unref (client);
-
- g_free (source_uid);
- }
-
- /* add password to the uri */
- password = e_passwords_get_password ("Calendar",
- (gchar *)uri->location);
-
- if (!password) {
- prompt = g_strdup_printf (_("Enter the password for %s"), (gchar *)uri->location);
- password = e_passwords_ask_password (_("Enter password"),
- "Calendar", (gchar *)uri->location,
- prompt,
- E_PASSWORDS_REMEMBER_FOREVER|E_PASSWORDS_SECRET|E_PASSWORDS_ONLINE,
- &remember, NULL);
-
- g_free (prompt);
-
- if (!password) {
- g_slist_free (p);
- continue;
- }
- }
-
- if (cloned && clone)
- published = itip_publish_comp ((ECal *) client,
- uri->location,
- uri->username,
- password, &clone);
-
- g_slist_free (p);
- }
- xml = e_pub_uri_to_xml (uri);
- if (xml != NULL) {
- uri_list = g_slist_append (uri_list, xml);
- }
- g_free (uri);
- }
-
- if (published) {
- /* Update gconf so we have the last_pub_time */
- calendar_config_set_free_busy (uri_list);
- }
-
- g_slist_free (uri_config_list);
- g_slist_free (uri_list);
-}
diff --git a/calendar/gui/e-pub-utils.h b/calendar/gui/e-pub-utils.h
deleted file mode 100644
index 03dcd97c98..0000000000
--- a/calendar/gui/e-pub-utils.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/* Evolution calendar Free/Busy utilities and types
- *
- * Copyright (C) 2004 Ximian, Inc.
- *
- * Author: Gary Ekker <gekker@novell.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef E_CAL_FB_UTIL_H
-#define E_CAL_FB_UTIL_H
-
-#include <glib.h>
-#include <libxml/tree.h>
-
-G_BEGIN_DECLS
-
-enum publish_frequency{
- URI_PUBLISH_DAILY,
- URI_PUBLISH_WEEKLY,
- URI_PUBLISH_USER
-};
-
-static const int pub_frequency_type_map[] = {
- URI_PUBLISH_DAILY,
- URI_PUBLISH_WEEKLY,
- URI_PUBLISH_USER,
- -1
-};
-
-struct _EPublishUri {
- gint enabled;
- gchar *location;
- gint publish_freq;
- gchar *username;
- gchar *password;
- GSList *calendars;
- gchar *last_pub_time;
-};
-
-typedef struct _EPublishUri EPublishUri;
-
-void e_pub_uri_from_xml (EPublishUri *uri, const gchar *xml);
-gchar *e_pub_uri_to_xml (EPublishUri *uri);
-void e_pub_publish (gboolean publish) ;
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/e-select-names-editable.c b/calendar/gui/e-select-names-editable.c
deleted file mode 100644
index 60289a5b74..0000000000
--- a/calendar/gui/e-select-names-editable.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * e-select-names-editable.c
- *
- * Author: Mike Kestner <mkestner@ximian.com>
- *
- * Copyright (C) 2003 Ximian Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtkcelleditable.h>
-#include <libebook/e-destination.h>
-#include <libedataserverui/e-name-selector-entry.h>
-
-#include "e-select-names-editable.h"
-
-struct _ESelectNamesEditablePriv {
-
-};
-
-static ENameSelectorEntryClass *parent_class;
-
-static void
-esne_start_editing (GtkCellEditable *cell_editable, GdkEvent *event)
-{
- ESelectNamesEditable *esne = E_SELECT_NAMES_EDITABLE (cell_editable);
-
- /* Grab the focus */
-
- /* TODO */
-}
-
-static void
-esne_cell_editable_init (GtkCellEditableIface *iface)
-{
- iface->start_editing = esne_start_editing;
-}
-
-static void
-esne_finalize (GObject *obj)
-{
- ESelectNamesEditable *esne = (ESelectNamesEditable *) obj;
-
- g_free (esne->priv);
-
- if (G_OBJECT_CLASS (parent_class)->finalize)
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-static void
-esne_init (ESelectNamesEditable *esne)
-{
- esne->priv = g_new0 (ESelectNamesEditablePriv, 1);
-}
-
-static void
-esne_class_init (GObjectClass *klass)
-{
- klass->finalize = esne_finalize;
-
- parent_class = E_NAME_SELECTOR_ENTRY_CLASS (g_type_class_peek_parent (klass));
-}
-
-GType
-e_select_names_editable_get_type (void)
-{
- static GType esne_type = 0;
-
- if (!esne_type) {
- static const GTypeInfo esne_info = {
- sizeof (ESelectNamesEditableClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) esne_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (ESelectNamesEditable),
- 0, /* n_preallocs */
- (GInstanceInitFunc) esne_init,
- };
-
- static const GInterfaceInfo cell_editable_info = {
- (GInterfaceInitFunc) esne_cell_editable_init,
- NULL,
- NULL
- };
-
- esne_type = g_type_register_static (E_TYPE_NAME_SELECTOR_ENTRY, "ESelectNamesEditable", &esne_info, 0);
-
- g_type_add_interface_static (esne_type, GTK_TYPE_CELL_EDITABLE, &cell_editable_info);
- }
-
- return esne_type;
-}
-
-static void
-entry_activate (ESelectNamesEditable *esne)
-{
- gtk_cell_editable_editing_done (GTK_CELL_EDITABLE (esne));
- gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE (esne));
-}
-
-ESelectNamesEditable *
-e_select_names_editable_construct (ESelectNamesEditable *esne)
-{
- g_signal_connect (esne, "activate", G_CALLBACK (entry_activate), esne);
-
- return esne;
-
-#if 0
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
-
- esne->priv->select_names = bonobo_activation_activate_from_id (SELECT_NAMES_OAFIID, 0, NULL, &ev);
- if (BONOBO_EX (&ev)) {
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- GNOME_Evolution_Addressbook_SelectNames_addSection (esne->priv->select_names, "A", "A", &ev);
- if (BONOBO_EX (&ev)) {
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- esne->priv->control = GNOME_Evolution_Addressbook_SelectNames_getEntryBySection (
- esne->priv->select_names, "A", &ev);
- if (BONOBO_EX (&ev)) {
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- bonobo_widget_construct_control_from_objref (BONOBO_WIDGET (esne), esne->priv->control, CORBA_OBJECT_NIL, &ev);
-
- CORBA_exception_free (&ev);
-
- esne->priv->bag = bonobo_control_frame_get_control_property_bag (
- bonobo_widget_get_control_frame (BONOBO_WIDGET (esne)), NULL);
- bonobo_event_source_client_add_listener (esne->priv->bag, entry_activate,
- "GNOME/Evolution/Addressbook/SelectNames:activate:entry",
- NULL, esne);
-
- return esne;
-#endif
-}
-
-ESelectNamesEditable *
-e_select_names_editable_new ()
-{
- ESelectNamesEditable *esne = g_object_new (E_TYPE_SELECT_NAMES_EDITABLE, NULL);
-
- if (!esne)
- return NULL;
-
- if (!e_select_names_editable_construct (esne)) {
- g_object_unref (esne);
- return NULL;
- }
-
- return esne;
-}
-
-gchar *
-e_select_names_editable_get_address (ESelectNamesEditable *esne)
-{
- EDestinationStore *destination_store;
- GList *destinations;
- EDestination *destination;
- gchar *dest_str;
- gchar *result = NULL;
-
- g_return_val_if_fail (E_SELECT_NAMES_EDITABLE (esne), NULL);
-
- destination_store = e_name_selector_entry_peek_destination_store (E_NAME_SELECTOR_ENTRY (esne));
- destinations = e_destination_store_list_destinations (destination_store);
- if (!destinations)
- return NULL;
-
- destination = destinations->data;
- result = g_strdup (e_destination_get_email (destination));
- g_list_free (destinations);
- return result;
-}
-
-gchar *
-e_select_names_editable_get_name (ESelectNamesEditable *esne)
-{
- EDestinationStore *destination_store;
- GList *destinations;
- EDestination *destination;
- gchar *dest_str;
- gchar *result = NULL;
-
- g_return_val_if_fail (E_SELECT_NAMES_EDITABLE (esne), NULL);
-
- destination_store = e_name_selector_entry_peek_destination_store (E_NAME_SELECTOR_ENTRY (esne));
- destinations = e_destination_store_list_destinations (destination_store);
- if (!destinations)
- return NULL;
-
- destination = destinations->data;
- result = g_strdup (e_destination_get_name (destination));
- g_list_free (destinations);
- return result;
-}
-
-void
-e_select_names_editable_set_address (ESelectNamesEditable *esne, const gchar *text)
-{
- EDestinationStore *destination_store;
- GList *destinations;
- EDestination *destination;
- gchar *dest_str;
- gchar *result = NULL;
-
- g_return_if_fail (E_IS_SELECT_NAMES_EDITABLE (esne));
-
- destination_store = e_name_selector_entry_peek_destination_store (E_NAME_SELECTOR_ENTRY (esne));
- destinations = e_destination_store_list_destinations (destination_store);
- if (!destinations)
- return;
-
- destination = destinations->data;
- e_destination_set_address (destination, text);
- g_list_free (destinations);
-}
-
diff --git a/calendar/gui/e-select-names-editable.h b/calendar/gui/e-select-names-editable.h
deleted file mode 100644
index f361c48cd8..0000000000
--- a/calendar/gui/e-select-names-editable.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * e-select-names-editable.h
- *
- * Author: Mike Kestner <mkestner@ximian.com>
- *
- * Copyright (C) 2003 Ximian Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef __E_SELECT_NAMES_EDITABLE_H__
-#define __E_SELECT_NAMES_EDITABLE_H__
-
-#include <libedataserverui/e-name-selector-entry.h>
-
-G_BEGIN_DECLS
-
-#define E_TYPE_SELECT_NAMES_EDITABLE (e_select_names_editable_get_type ())
-#define E_SELECT_NAMES_EDITABLE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_SELECT_NAMES_EDITABLE, ESelectNamesEditable))
-#define E_SELECT_NAMES_EDITABLE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), E_TYPE_SELECT_NAMES_EDITABLE, ESelectNamesEditableClass))
-#define E_IS_SELECT_NAMES_EDITABLE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_SELECT_NAMES_EDITABLE))
-#define E_IS_SELECT_NAMES_EDITABLE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((o), E_TYPE_SELECT_NAMES_EDITABLE))
-#define E_SELECT_NAMES_EDITABLE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), E_TYPE_SELECT_NAMES_EDITABLE, ESelectNamesEditableClass))
-
-typedef struct _ESelectNamesEditable ESelectNamesEditable;
-typedef struct _ESelectNamesEditableClass ESelectNamesEditableClass;
-typedef struct _ESelectNamesEditablePriv ESelectNamesEditablePriv;
-
-struct _ESelectNamesEditable
-{
- ENameSelectorEntry parent;
-
- ESelectNamesEditablePriv *priv;
-};
-
-struct _ESelectNamesEditableClass
-{
- ENameSelectorEntryClass parent_class;
-};
-
-GType e_select_names_editable_get_type (void);
-
-ESelectNamesEditable *e_select_names_editable_construct (ESelectNamesEditable *esne);
-ESelectNamesEditable *e_select_names_editable_new (void);
-
-gchar *e_select_names_editable_get_address (ESelectNamesEditable *esne);
-void e_select_names_editable_set_address (ESelectNamesEditable *esne, const gchar *text);
-
-gchar *e_select_names_editable_get_name (ESelectNamesEditable *esne);
-G_END_DECLS
-
-#endif /* __E_SELECT_NAMES_EDITABLE_H__ */
diff --git a/calendar/gui/e-select-names-renderer.c b/calendar/gui/e-select-names-renderer.c
deleted file mode 100644
index 5a8e3316a7..0000000000
--- a/calendar/gui/e-select-names-renderer.c
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * e-select-names-renderer.c
- *
- * Author: Mike Kestner <mkestner@ximian.com>
- *
- * Copyright (C) 2003 Ximian Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-#include <gtk/gtkcellrenderertext.h>
-
-#include "e-calendar-marshal.h"
-
-#include "e-select-names-editable.h"
-#include "e-select-names-renderer.h"
-
-
-struct _ESelectNamesRendererPriv {
- ESelectNamesEditable *editable;
- gchar *path;
- gchar *address;
-};
-
-enum {
- PROP_0,
- PROP_ADDRESS
-};
-
-enum {
- CELL_EDITED,
- LAST_SIGNAL
-};
-
-static gint signals [LAST_SIGNAL];
-
-G_DEFINE_TYPE (ESelectNamesRenderer, e_select_names_renderer, GTK_TYPE_CELL_RENDERER_TEXT)
-
-static void
-e_select_names_renderer_editing_done (GtkCellEditable *editable, ESelectNamesRenderer *cell)
-{
- gchar *new_address, *new_name;
-
- /* We don't need to listen for the de-activation any more */
- g_signal_handlers_disconnect_matched (editable, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, cell);
-
- new_address = e_select_names_editable_get_address (E_SELECT_NAMES_EDITABLE (editable));
- new_name = e_select_names_editable_get_name (E_SELECT_NAMES_EDITABLE (editable));
-
- g_signal_emit (cell, signals [CELL_EDITED], 0, cell->priv->path, new_address, new_name);
- g_free (new_address);
- g_free (new_name);
- g_free (cell->priv->path);
- cell->priv->path = NULL;
-}
-
-static void
-e_select_names_renderer_activated (ESelectNamesEditable *editable, ESelectNamesRenderer *cell)
-{
- e_select_names_renderer_editing_done (GTK_CELL_EDITABLE (cell->priv->editable), cell);
-}
-
-static GtkCellEditable *
-e_select_names_renderer_start_editing (GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path,
- GdkRectangle *bg_area, GdkRectangle *cell_area, GtkCellRendererState flags)
-{
- ESelectNamesRenderer *sn_cell = E_SELECT_NAMES_RENDERER (cell);
- GtkCellRendererText *text_cell = GTK_CELL_RENDERER_TEXT (cell);
- ESelectNamesEditable *editable;
-
- if (!text_cell->editable)
- return NULL;
-
- editable = E_SELECT_NAMES_EDITABLE (e_select_names_editable_new ());
- e_select_names_editable_set_address (editable, sn_cell->priv->address);
- gtk_widget_show (GTK_WIDGET (editable));
-
- g_signal_connect (editable, "editing_done", G_CALLBACK (e_select_names_renderer_editing_done), sn_cell);
-
-#if 0
- /* Listen for de-activation/loss of focus */
- cf = bonobo_widget_get_control_frame (BONOBO_WIDGET (editable));
- bonobo_control_frame_set_autoactivate (cf, TRUE);
-#endif
-
- g_signal_connect (editable, "activate", G_CALLBACK (e_select_names_renderer_activated), sn_cell);
-
- sn_cell->priv->editable = g_object_ref (editable);
- sn_cell->priv->path = g_strdup (path);
-
- return GTK_CELL_EDITABLE (editable);
-}
-
-static void
-e_select_names_renderer_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
- ESelectNamesRenderer *esnr = E_SELECT_NAMES_RENDERER (object);
-
- switch (prop_id) {
- case PROP_ADDRESS:
- g_value_set_string (value, esnr->priv->address);
- break;
- default:
- break;
- }
-}
-
-static void
-e_select_names_renderer_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
- ESelectNamesRenderer *esnr = E_SELECT_NAMES_RENDERER (object);
-
- switch (prop_id) {
- case PROP_ADDRESS:
- g_free (esnr->priv->address);
- esnr->priv->address = g_strdup (g_value_get_string (value));
- break;
- default:
- break;
- }
-}
-
-static void
-e_select_names_renderer_finalize (GObject *obj)
-{
- ESelectNamesRenderer *cell = (ESelectNamesRenderer *) obj;
-
- if (cell->priv->editable)
- g_object_unref (cell->priv->editable);
- cell->priv->editable = NULL;
-
- g_free (cell->priv->path);
- g_free (cell->priv->address);
- g_free (cell->priv);
-
- if (G_OBJECT_CLASS (e_select_names_renderer_parent_class)->finalize)
- G_OBJECT_CLASS (e_select_names_renderer_parent_class)->finalize (obj);
-}
-
-static void
-e_select_names_renderer_init (ESelectNamesRenderer *cell)
-{
- cell->priv = g_new0 (ESelectNamesRendererPriv, 1);
-}
-
-static void
-e_select_names_renderer_class_init (ESelectNamesRendererClass *class)
-{
- GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS (class);
- GObjectClass *obj_class = G_OBJECT_CLASS (class);
-
- obj_class->finalize = e_select_names_renderer_finalize;
- obj_class->get_property = e_select_names_renderer_get_property;
- obj_class->set_property = e_select_names_renderer_set_property;
-
- cell_class->start_editing = e_select_names_renderer_start_editing;
-
- g_object_class_install_property (obj_class, PROP_ADDRESS,
- g_param_spec_string ("address", "Address", "Email address.", NULL, G_PARAM_READWRITE));
-
- signals [CELL_EDITED] = g_signal_new ("cell_edited",
- G_OBJECT_CLASS_TYPE (obj_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (ESelectNamesRendererClass, cell_edited),
- NULL, NULL,
- e_calendar_marshal_VOID__STRING_STRING_STRING,
- G_TYPE_NONE, 3,
- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
-}
-
-GtkCellRenderer *
-e_select_names_renderer_new (void)
-{
- return GTK_CELL_RENDERER (g_object_new (E_TYPE_SELECT_NAMES_RENDERER, NULL));
-}
-
diff --git a/calendar/gui/e-select-names-renderer.h b/calendar/gui/e-select-names-renderer.h
deleted file mode 100644
index fb045d928f..0000000000
--- a/calendar/gui/e-select-names-renderer.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * e-select-names-renderer.h
- *
- * Author: Mike Kestner <mkestner@ximian.com>
- *
- * Copyright (C) 2003 Ximian Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef __E_SELECT_NAMES_RENDERER_H__
-#define __E_SELECT_NAMES_RENDERER_H__
-
-#include <gtk/gtkcellrenderertext.h>
-
-G_BEGIN_DECLS
-
-#define E_TYPE_SELECT_NAMES_RENDERER (e_select_names_renderer_get_type ())
-#define E_SELECT_NAMES_RENDERER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_SELECT_NAMES_RENDERER, ESelectNamesRenderer))
-#define E_SELECT_NAMES_RENDERER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), E_TYPE_SELECT_NAMES_RENDERER, ESelectNamesRendererClass))
-#define E_IS_SELECT_NAMES_RENDERER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_SELECT_NAMES_RENDERER))
-#define E_IS_SELECT_NAMES_RENDERER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((o), E_TYPE_SELECT_NAMES_RENDERER))
-#define E_SELECT_NAMES_RENDERER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), E_TYPE_SELECT_NAMES_RENDERER, ESelectNamesRendererClass))
-
-typedef struct _ESelectNamesRenderer ESelectNamesRenderer;
-typedef struct _ESelectNamesRendererClass ESelectNamesRendererClass;
-typedef struct _ESelectNamesRendererPriv ESelectNamesRendererPriv;
-
-struct _ESelectNamesRenderer
-{
- GtkCellRendererText parent;
-
- ESelectNamesRendererPriv *priv;
-};
-
-struct _ESelectNamesRendererClass
-{
- GtkCellRendererTextClass parent_class;
-
- void (* cell_edited) (ESelectNamesRenderer *renderer,
- const gchar *path,
- const gchar *address,
- const gchar *name);
-};
-
-GType e_select_names_renderer_get_type (void);
-GtkCellRenderer *e_select_names_renderer_new (void);
-
-G_END_DECLS
-
-#endif /* __E_SELECT_NAMES_RENDERER_H__ */
diff --git a/calendar/gui/e-tasks.c b/calendar/gui/e-tasks.c
deleted file mode 100644
index 068a9dac9e..0000000000
--- a/calendar/gui/e-tasks.c
+++ /dev/null
@@ -1,1297 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-tasks.c
- *
- * Copyright (C) 2001-2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Authors: Federico Mena Quintero <federico@ximian.com>
- * Damon Chaplin <damon@ximian.com>
- * Rodrigo Moya <rodrigo@ximian.com>
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gnome.h>
-#include <libgnomevfs/gnome-vfs-ops.h>
-#include <gal/e-table/e-table-scrolled.h>
-#include <gal/menus/gal-view-instance.h>
-#include <gal/menus/gal-view-factory-etable.h>
-#include <gal/menus/gal-view-etable.h>
-
-#include "widgets/misc/e-error.h"
-#include "e-util/e-categories-config.h"
-#include "e-util/e-config-listener.h"
-#include "e-util/e-time-utils.h"
-#include "shell/e-user-creatable-items-handler.h"
-#include <libedataserver/e-url.h>
-#include <libecal/e-cal-time-util.h>
-#include "widgets/menus/gal-view-menus.h"
-#include "dialogs/delete-error.h"
-#include "dialogs/task-editor.h"
-#include "e-calendar-marshal.h"
-#include "cal-search-bar.h"
-#include "calendar-config.h"
-#include "calendar-component.h"
-#include "comp-util.h"
-#include "e-calendar-table-config.h"
-#include "misc.h"
-#include "tasks-component.h"
-#include "e-cal-component-preview.h"
-#include "e-tasks.h"
-#include "common/authentication.h"
-
-
-/* Private part of the GnomeCalendar structure */
-struct _ETasksPrivate {
- /* The task lists for display */
- GHashTable *clients;
- GList *clients_list;
- ECal *default_client;
-
- ECalView *query;
-
- EConfigListener *config_listener;
-
- /* The ECalendarTable showing the tasks. */
- GtkWidget *tasks_view;
- ECalendarTableConfig *tasks_view_config;
-
- /* Calendar search bar for tasks */
- GtkWidget *search_bar;
-
- /* Paned widget */
- GtkWidget *paned;
-
- /* The preview */
- GtkWidget *preview;
-
- gchar *current_uid;
- char *sexp;
- guint update_timeout;
-
- /* View instance and the view menus handler */
- GalViewInstance *view_instance;
- GalViewMenus *view_menus;
-
- GList *notifications;
-};
-
-static void setup_widgets (ETasks *tasks);
-static void e_tasks_destroy (GtkObject *object);
-static void update_view (ETasks *tasks);
-
-static void config_categories_changed_cb (EConfigListener *config_listener, const char *key, gpointer user_data);
-static void backend_error_cb (ECal *client, const char *message, gpointer data);
-
-/* Signal IDs */
-enum {
- SELECTION_CHANGED,
- SOURCE_ADDED,
- SOURCE_REMOVED,
- LAST_SIGNAL
-};
-
-enum DndTargetType {
- TARGET_VCALENDAR
-};
-
-static GtkTargetEntry list_drag_types[] = {
- { "text/calendar", 0, TARGET_VCALENDAR },
- { "text/x-calendar", 0, TARGET_VCALENDAR }
-};
-static const int num_list_drag_types = sizeof (list_drag_types) / sizeof (list_drag_types[0]);
-
-static guint e_tasks_signals[LAST_SIGNAL] = { 0 };
-
-G_DEFINE_TYPE (ETasks, e_tasks, GTK_TYPE_TABLE)
-
-/* Callback used when the cursor changes in the table */
-static void
-table_cursor_change_cb (ETable *etable, int row, gpointer data)
-{
- ETasks *tasks;
- ETasksPrivate *priv;
- ECalModel *model;
- ECalModelComponent *comp_data;
- ECalComponent *comp;
- const char *uid;
-
- int n_selected;
-
- tasks = E_TASKS (data);
- priv = tasks->priv;
-
- n_selected = e_table_selected_count (etable);
-
- /* update the HTML widget */
- if (n_selected != 1) {
- e_cal_component_preview_clear (E_CAL_COMPONENT_PREVIEW (priv->preview));
-
- return;
- }
-
- model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view));
-
- comp_data = e_cal_model_get_component_at (model, e_table_get_cursor_row (etable));
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp));
-
- e_cal_component_preview_display (E_CAL_COMPONENT_PREVIEW (priv->preview), comp_data->client, comp);
-
- e_cal_component_get_uid (comp, &uid);
- if (priv->current_uid)
- g_free (priv->current_uid);
- priv->current_uid = g_strdup (uid);
-
- g_object_unref (comp);
-}
-
-/* Callback used when the selection changes in the table. */
-static void
-table_selection_change_cb (ETable *etable, gpointer data)
-{
- ETasks *tasks;
- int n_selected;
-
- tasks = E_TASKS (data);
-
- n_selected = e_table_selected_count (etable);
- gtk_signal_emit (GTK_OBJECT (tasks), e_tasks_signals[SELECTION_CHANGED],
- n_selected);
-}
-
-static void
-user_created_cb (GtkWidget *view, ETasks *tasks)
-{
- ETasksPrivate *priv;
- ECal *ecal;
- ECalModel *model;
-
- priv = tasks->priv;
-
- model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view));
- ecal = e_cal_model_get_default_client (model);
-
- e_tasks_add_todo_source (tasks, e_cal_get_source (ecal));
-}
-
-/* Callback used when the sexp in the search bar changes */
-static void
-search_bar_sexp_changed_cb (CalSearchBar *cal_search, const char *sexp, gpointer data)
-{
- ETasks *tasks;
- ETasksPrivate *priv;
-
- tasks = E_TASKS (data);
- priv = tasks->priv;
-
- if (priv->sexp)
- g_free (priv->sexp);
-
- priv->sexp = g_strdup (sexp);
-
- update_view (tasks);
-}
-
-/* Callback used when the selected category in the search bar changes */
-static void
-search_bar_category_changed_cb (CalSearchBar *cal_search, const char *category, gpointer data)
-{
- ETasks *tasks;
- ETasksPrivate *priv;
- ECalModel *model;
-
- tasks = E_TASKS (data);
- priv = tasks->priv;
-
- model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view));
- e_cal_model_set_default_category (model, category);
-}
-
-static gboolean
-vpaned_resized_cb (GtkWidget *widget, GdkEventButton *event, ETasks *tasks)
-{
- calendar_config_set_task_vpane_pos (gtk_paned_get_position (GTK_PANED (widget)));
-
- return FALSE;
-}
-
-static void
-set_timezone (ETasks *tasks)
-{
- ETasksPrivate *priv;
- icaltimezone *zone;
- GList *l;
-
- priv = tasks->priv;
-
- zone = calendar_config_get_icaltimezone ();
- for (l = priv->clients_list; l != NULL; l = l->next) {
- ECal *client = l->data;
-
- if (e_cal_get_load_state (client) == E_CAL_LOAD_LOADED)
- /* FIXME Error checking */
- e_cal_set_default_timezone (client, zone, NULL);
- }
-
- if (priv->default_client && e_cal_get_load_state (priv->default_client) == E_CAL_LOAD_LOADED)
- /* FIXME Error checking */
- e_cal_set_default_timezone (priv->default_client, zone, NULL);
-
- if (priv->preview)
- e_cal_component_preview_set_default_timezone (E_CAL_COMPONENT_PREVIEW (priv->preview), zone);
-}
-
-static void
-timezone_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- ETasks *tasks = data;
-
- set_timezone (tasks);
-}
-
-static void
-update_view (ETasks *tasks)
-{
- ETasksPrivate *priv;
- ECalModel *model;
- char *real_sexp = NULL;
- char *new_sexp = NULL;
-
- priv = tasks->priv;
-
- model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view));
-
- if ((new_sexp = calendar_config_get_hide_completed_tasks_sexp()) != NULL) {
- real_sexp = g_strdup_printf ("(and %s %s)", new_sexp, priv->sexp);
- e_cal_model_set_search_query (model, real_sexp);
- g_free (new_sexp);
- g_free (real_sexp);
- } else
- e_cal_model_set_search_query (model, priv->sexp);
-}
-
-static gboolean
-update_view_cb (ETasks *tasks)
-{
- update_view (tasks);
-
- return TRUE;
-}
-
-static void
-config_hide_completed_tasks_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- update_view (data);
-}
-
-static void
-model_row_changed_cb (ETableModel *etm, int row, gpointer data)
-{
- ETasks *tasks;
- ETasksPrivate *priv;
- ECalModelComponent *comp_data;
-
- tasks = E_TASKS (data);
- priv = tasks->priv;
-
- if (priv->current_uid) {
- const char *uid;
-
- comp_data = e_cal_model_get_component_at (E_CAL_MODEL (etm), row);
- if (comp_data) {
- uid = icalcomponent_get_uid (comp_data->icalcomp);
- if (!strcmp (uid ? uid : "", priv->current_uid)) {
- ETable *etable;
-
- etable = e_table_scrolled_get_table (
- E_TABLE_SCROLLED (E_CALENDAR_TABLE (priv->tasks_view)->etable));
- table_cursor_change_cb (etable, 0, tasks);
- }
- }
- }
-}
-
-static void
-setup_config (ETasks *tasks)
-{
- ETasksPrivate *priv;
- guint not;
-
- priv = tasks->priv;
-
- /* Timezone */
- set_timezone (tasks);
-
- not = calendar_config_add_notification_timezone (timezone_changed_cb, tasks);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- not = calendar_config_add_notification_hide_completed_tasks (config_hide_completed_tasks_changed_cb,
- tasks);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- not = calendar_config_add_notification_hide_completed_tasks_units (config_hide_completed_tasks_changed_cb,
- tasks);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- not = calendar_config_add_notification_hide_completed_tasks_value (config_hide_completed_tasks_changed_cb,
- tasks);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-}
-
-static void
-table_drag_data_get (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- ETasks *tasks)
-{
- ETasksPrivate *priv;
- ECalModelComponent *comp_data;
-
- priv = tasks->priv;
-
- if (priv->current_uid) {
- ECalModel *model;
-
- model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view));
- comp_data = e_cal_model_get_component_at (model, row);
-
- if (info == TARGET_VCALENDAR) {
- /* we will pass an icalcalendar component for both types */
- char *comp_str;
- icalcomponent *vcal;
-
- vcal = e_cal_util_new_top_level ();
- e_cal_util_add_timezones_from_component (vcal, comp_data->icalcomp);
- icalcomponent_add_component (
- vcal,
- icalcomponent_new_clone (comp_data->icalcomp));
-
- comp_str = icalcomponent_as_ical_string (vcal);
- if (comp_str) {
- gtk_selection_data_set (selection_data, selection_data->target,
- 8, comp_str, strlen (comp_str));
- }
- icalcomponent_free (vcal);
- }
- }
-}
-
-/*
-static void
-table_drag_begin (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- ETasks *tasks)
-{
-
-}
-
-
-static void
-table_drag_end (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- ETasks *tasks)
-{
-
-}
-*/
-
-static void
-table_drag_data_delete (ETable *table,
- int row,
- int col,
- GdkDragContext *context,
- ETasks *tasks)
-{
- ETasksPrivate *priv;
- ECalModelComponent *comp_data;
- ECalModel *model;
- gboolean read_only = TRUE;
-
- priv = tasks->priv;
-
- model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view));
- comp_data = e_cal_model_get_component_at (model, row);
-
- e_cal_is_read_only (comp_data->client, &read_only, NULL);
- if (read_only)
- return;
-
- e_cal_remove_object (comp_data->client, icalcomponent_get_uid (comp_data->icalcomp), NULL);
-}
-
-#define E_TASKS_TABLE_DEFAULT_STATE \
- "<?xml version=\"1.0\"?>" \
- "<ETableState>" \
- "<column source=\"13\"/>" \
- "<column source=\"14\"/>" \
- "<column source=\"9\"/>" \
- "<column source=\"5\"/>" \
- "<grouping/>" \
- "</ETableState>"
-
-static void
-pane_realized (GtkWidget *widget, ETasks *tasks)
-{
- gtk_paned_set_position ((GtkPaned *)widget, calendar_config_get_task_vpane_pos ());
-}
-
-static void
-setup_widgets (ETasks *tasks)
-{
- ETasksPrivate *priv;
- ETable *etable;
- ECalModel *model;
-
- priv = tasks->priv;
-
- priv->search_bar = cal_search_bar_new (CAL_SEARCH_TASKS_DEFAULT);
- g_signal_connect (priv->search_bar, "sexp_changed",
- G_CALLBACK (search_bar_sexp_changed_cb), tasks);
- g_signal_connect (priv->search_bar, "category_changed",
- G_CALLBACK (search_bar_category_changed_cb), tasks);
- config_categories_changed_cb (priv->config_listener, "/apps/evolution/general/category_master_list", tasks);
-
- gtk_table_attach (GTK_TABLE (tasks), priv->search_bar, 0, 1, 0, 1,
- GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0);
- gtk_widget_show (priv->search_bar);
-
- /* add the paned widget for the task list and task detail areas */
- priv->paned = gtk_vpaned_new ();
- g_signal_connect (priv->paned, "realize", G_CALLBACK (pane_realized), tasks);
-
- g_signal_connect (G_OBJECT (priv->paned), "button_release_event",
- G_CALLBACK (vpaned_resized_cb), tasks);
- gtk_table_attach (GTK_TABLE (tasks), priv->paned, 0, 1, 1, 2,
- GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
- gtk_widget_show (priv->paned);
-
- /* create the task list */
- priv->tasks_view = e_calendar_table_new ();
- priv->tasks_view_config = e_calendar_table_config_new (E_CALENDAR_TABLE (priv->tasks_view));
-
- g_signal_connect (priv->tasks_view, "user_created", G_CALLBACK (user_created_cb), tasks);
-
- etable = e_table_scrolled_get_table (
- E_TABLE_SCROLLED (E_CALENDAR_TABLE (priv->tasks_view)->etable));
- e_table_set_state (etable, E_TASKS_TABLE_DEFAULT_STATE);
- gtk_paned_add1 (GTK_PANED (priv->paned), priv->tasks_view);
- gtk_widget_show (priv->tasks_view);
-
-
- e_table_drag_source_set (etable, GDK_BUTTON1_MASK,
- list_drag_types, num_list_drag_types,
- GDK_ACTION_MOVE|GDK_ACTION_COPY|GDK_ACTION_ASK);
-
- g_signal_connect (etable, "table_drag_data_get",
- G_CALLBACK(table_drag_data_get), tasks);
- g_signal_connect (etable, "table_drag_data_delete",
- G_CALLBACK(table_drag_data_delete), tasks);
-
- /*
- e_table_drag_dest_set (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)),
- 0, list_drag_types, num_list_drag_types, GDK_ACTION_LINK);
-
- g_signal_connect (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)),
- "table_drag_motion", G_CALLBACK(table_drag_motion_cb), editor);
- g_signal_connect (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)),
- "table_drag_drop", G_CALLBACK (table_drag_drop_cb), editor);
- g_signal_connect (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)),
- "table_drag_data_received", G_CALLBACK(table_drag_data_received_cb), editor);
- */
-
- g_signal_connect (etable, "cursor_change", G_CALLBACK (table_cursor_change_cb), tasks);
- g_signal_connect (etable, "selection_change", G_CALLBACK (table_selection_change_cb), tasks);
-
- /* Timeout check to hide completed items */
- priv->update_timeout = g_timeout_add_full (G_PRIORITY_LOW, 60000, (GSourceFunc) update_view_cb, tasks, NULL);
-
- /* create the task detail */
- priv->preview = e_cal_component_preview_new ();
- e_cal_component_preview_set_default_timezone (E_CAL_COMPONENT_PREVIEW (priv->preview), calendar_config_get_icaltimezone ());
- gtk_paned_add2 (GTK_PANED (priv->paned), priv->preview);
- gtk_widget_show (priv->preview);
-
- model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view));
- g_signal_connect (G_OBJECT (model), "model_row_changed",
- G_CALLBACK (model_row_changed_cb), tasks);
-}
-
-/* Class initialization function for the gnome calendar */
-static void
-e_tasks_class_init (ETasksClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *) class;
-
- e_tasks_signals[SELECTION_CHANGED] =
- gtk_signal_new ("selection_changed",
- GTK_RUN_LAST,
- G_TYPE_FROM_CLASS (object_class),
- GTK_SIGNAL_OFFSET (ETasksClass, selection_changed),
- gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_INT);
-
- e_tasks_signals[SOURCE_ADDED] =
- g_signal_new ("source_added",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (ETasksClass, source_added),
- NULL, NULL,
- e_calendar_marshal_VOID__OBJECT,
- G_TYPE_NONE,
- 1,
- G_TYPE_OBJECT);
-
- e_tasks_signals[SOURCE_REMOVED] =
- g_signal_new ("source_removed",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (ETasksClass, source_removed),
- NULL, NULL,
- e_calendar_marshal_VOID__OBJECT,
- G_TYPE_NONE,
- 1,
- G_TYPE_OBJECT);
-
- object_class->destroy = e_tasks_destroy;
-
- class->selection_changed = NULL;
- class->source_added = NULL;
- class->source_removed = NULL;
-}
-
-
-static void
-config_categories_changed_cb (EConfigListener *config_listener, const char *key, gpointer user_data)
-{
- GList *cat_list;
- GPtrArray *cat_array;
- ETasksPrivate *priv;
- ETasks *tasks = user_data;
-
- priv = tasks->priv;
-
- cat_array = g_ptr_array_new ();
- cat_list = e_categories_get_list ();
- while (cat_list != NULL) {
- if (e_categories_is_searchable ((const char *) cat_list->data))
- g_ptr_array_add (cat_array, cat_list->data);
- cat_list = g_list_remove (cat_list, cat_list->data);
- }
-
- cal_search_bar_set_categories (priv->search_bar, cat_array);
-
- g_ptr_array_free (cat_array, TRUE);
-}
-
-/* Object initialization function for the gnome calendar */
-static void
-e_tasks_init (ETasks *tasks)
-{
- ETasksPrivate *priv;
-
- priv = g_new0 (ETasksPrivate, 1);
- tasks->priv = priv;
-
- priv->config_listener = e_config_listener_new ();
- g_signal_connect (priv->config_listener, "key_changed", G_CALLBACK (config_categories_changed_cb), tasks);
-
- setup_config (tasks);
- setup_widgets (tasks);
-
- priv->clients = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
- priv->query = NULL;
- priv->view_instance = NULL;
- priv->view_menus = NULL;
- priv->current_uid = NULL;
- priv->sexp = g_strdup ("#t");
- priv->default_client = NULL;
- update_view (tasks);
-}
-
-GtkWidget *
-e_tasks_new (void)
-{
- ETasks *tasks;
-
- tasks = g_object_new (e_tasks_get_type (), NULL);
-
- return GTK_WIDGET (tasks);
-}
-
-
-void
-e_tasks_set_ui_component (ETasks *tasks,
- BonoboUIComponent *ui_component)
-{
- g_return_if_fail (E_IS_TASKS (tasks));
- g_return_if_fail (ui_component == NULL || BONOBO_IS_UI_COMPONENT (ui_component));
-
- e_search_bar_set_ui_component (E_SEARCH_BAR (tasks->priv->search_bar), ui_component);
-}
-
-
-static void
-e_tasks_destroy (GtkObject *object)
-{
- ETasks *tasks;
- ETasksPrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (E_IS_TASKS (object));
-
- tasks = E_TASKS (object);
- priv = tasks->priv;
-
- if (priv) {
- GList *l;
-
- /* unset the config listener */
- if (priv->config_listener) {
- g_signal_handlers_disconnect_matched (priv->config_listener,
- G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, tasks);
- g_object_unref (priv->config_listener);
- priv->config_listener = NULL;
- }
-
- /* disconnect from signals on all the clients */
- for (l = priv->clients_list; l != NULL; l = l->next) {
- g_signal_handlers_disconnect_matched (l->data, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, tasks);
- }
-
- g_hash_table_destroy (priv->clients);
- g_list_free (priv->clients_list);
-
- if (priv->default_client)
- g_object_unref (priv->default_client);
- priv->default_client = NULL;
-
- if (priv->current_uid) {
- g_free (priv->current_uid);
- priv->current_uid = NULL;
- }
-
- if (priv->sexp) {
- g_free (priv->sexp);
- priv->sexp = NULL;
- }
-
- if (priv->update_timeout) {
- g_source_remove (priv->update_timeout);
- priv->update_timeout = 0;
- }
-
- if (priv->tasks_view_config) {
- g_object_unref (priv->tasks_view_config);
- priv->tasks_view_config = NULL;
- }
-
- for (l = priv->notifications; l; l = l->next)
- calendar_config_remove_notification (GPOINTER_TO_UINT (l->data));
- priv->notifications = NULL;
-
- g_free (priv);
- tasks->priv = NULL;
- }
-
- if (GTK_OBJECT_CLASS (e_tasks_parent_class)->destroy)
- (* GTK_OBJECT_CLASS (e_tasks_parent_class)->destroy) (object);
-}
-
-static void
-set_status_message (ETasks *tasks, const char *message, ...)
-{
- ETasksPrivate *priv;
- va_list args;
- char sz[2048], *msg_string = NULL;
-
- if (message) {
- va_start (args, message);
- vsnprintf (sz, sizeof sz, message, args);
- va_end (args);
- msg_string = sz;
- }
-
- priv = tasks->priv;
-
- e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->tasks_view), msg_string);
-}
-
-/* Callback from the calendar client when an error occurs in the backend */
-static void
-backend_error_cb (ECal *client, const char *message, gpointer data)
-{
- ETasks *tasks;
- ETasksPrivate *priv;
- char *errmsg;
- char *urinopwd;
-
- tasks = E_TASKS (data);
- priv = tasks->priv;
-
- urinopwd = get_uri_without_password (e_cal_get_uri (client));
- errmsg = g_strdup_printf (_("Error on %s:\n %s"), urinopwd, message);
- gnome_error_dialog_parented (errmsg, GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (tasks))));
- g_free (errmsg);
- g_free (urinopwd);
-}
-
-/* Callback from the calendar client when the backend dies */
-static void
-backend_died_cb (ECal *client, gpointer data)
-{
- ETasks *tasks;
- ETasksPrivate *priv;
- ESource *source;
-
- tasks = E_TASKS (data);
- priv = tasks->priv;
-
- source = g_object_ref (e_cal_get_source (client));
-
- priv->clients_list = g_list_remove (priv->clients_list, client);
- g_hash_table_remove (priv->clients, e_source_peek_uid (source));
-
- gtk_signal_emit (GTK_OBJECT (tasks), e_tasks_signals[SOURCE_REMOVED], source);
-
- e_calendar_table_set_status_message (E_CALENDAR_TABLE (e_tasks_get_calendar_table (tasks)), NULL);
-
- e_error_run (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (tasks))),
- "calendar:tasks-crashed", NULL);
-
- g_object_unref (source);
-}
-
-/* Callback from the calendar client when the calendar is opened */
-static void
-client_cal_opened_cb (ECal *ecal, ECalendarStatus status, ETasks *tasks)
-{
- ECalModel *model;
- ESource *source;
- ETasksPrivate *priv;
-
- priv = tasks->priv;
-
- source = e_cal_get_source (ecal);
-
- switch (status) {
- case E_CALENDAR_STATUS_OK :
- g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, client_cal_opened_cb, NULL);
-
- set_status_message (tasks, _("Loading tasks"));
- model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view));
- e_cal_model_add_client (model, ecal);
-
- set_timezone (tasks);
- set_status_message (tasks, NULL);
- break;
- case E_CALENDAR_STATUS_BUSY :
- break;
- default :
- /* Make sure the source doesn't disappear on us */
- g_object_ref (source);
-
- priv->clients_list = g_list_remove (priv->clients_list, ecal);
- g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, tasks);
-
- /* Do this last because it unrefs the client */
- g_hash_table_remove (priv->clients, e_source_peek_uid (source));
-
- gtk_signal_emit (GTK_OBJECT (tasks), e_tasks_signals[SOURCE_REMOVED], source);
-
- set_status_message (tasks, NULL);
- g_object_unref (source);
-
- break;
- }
-}
-
-static void
-default_client_cal_opened_cb (ECal *ecal, ECalendarStatus status, ETasks *tasks)
-{
- ECalModel *model;
- ESource *source;
- ETasksPrivate *priv;
-
- priv = tasks->priv;
-
- source = e_cal_get_source (ecal);
-
- switch (status) {
- case E_CALENDAR_STATUS_OK :
- g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, default_client_cal_opened_cb, NULL);
- model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view));
-
- set_timezone (tasks);
- e_cal_model_set_default_client (model, ecal);
- set_status_message (tasks, NULL);
- break;
- case E_CALENDAR_STATUS_BUSY:
- break;
- default :
- /* Make sure the source doesn't disappear on us */
- g_object_ref (source);
-
- priv->clients_list = g_list_remove (priv->clients_list, ecal);
- g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, tasks);
-
- /* Do this last because it unrefs the client */
- g_hash_table_remove (priv->clients, e_source_peek_uid (source));
-
- gtk_signal_emit (GTK_OBJECT (tasks), e_tasks_signals[SOURCE_REMOVED], source);
-
- set_status_message (tasks, NULL);
- g_object_unref (priv->default_client);
- priv->default_client = NULL;
- g_object_unref (source);
-
- break;
- }
-}
-
-typedef void (*open_func) (ECal *, ECalendarStatus, ETasks *);
-
-static gboolean
-open_ecal (ETasks *tasks, ECal *cal, gboolean only_if_exists, open_func of)
-{
- ETasksPrivate *priv;
-
- priv = tasks->priv;
-
- set_status_message (tasks, _("Opening tasks at %s"), e_cal_get_uri (cal));
-
- g_signal_connect (G_OBJECT (cal), "cal_opened", G_CALLBACK (of), tasks);
- e_cal_open_async (cal, only_if_exists);
-
- return TRUE;
-}
-
-void
-e_tasks_open_task (ETasks *tasks)
-{
- ECalendarTable *cal_table;
-
- cal_table = e_tasks_get_calendar_table (tasks);
- e_calendar_table_open_selected (cal_table);
-}
-
-void
-e_tasks_new_task (ETasks *tasks)
-{
- ETasksPrivate *priv;
- TaskEditor *tedit;
- ECalComponent *comp;
- const char *category;
- ECal *ecal;
-
- g_return_if_fail (E_IS_TASKS (tasks));
-
- priv = tasks->priv;
-
- /* FIXME What to do about no default client */
- ecal = e_tasks_get_default_client (tasks);
- if (!ecal)
- return;
-
- comp = cal_comp_task_new_with_defaults (ecal);
-
- category = cal_search_bar_get_category (CAL_SEARCH_BAR (priv->search_bar));
- e_cal_component_set_categories (comp, category);
-
- tedit = task_editor_new (ecal, FALSE);
- comp_editor_edit_comp (COMP_EDITOR (tedit), comp);
- g_object_unref (comp);
-
- comp_editor_focus (COMP_EDITOR (tedit));
-}
-
-gboolean
-e_tasks_add_todo_source (ETasks *tasks, ESource *source)
-{
- ETasksPrivate *priv;
- ECal *client;
- const char *uid;
-
- g_return_val_if_fail (tasks != NULL, FALSE);
- g_return_val_if_fail (E_IS_TASKS (tasks), FALSE);
- g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
-
- priv = tasks->priv;
-
- uid = e_source_peek_uid (source);
- client = g_hash_table_lookup (priv->clients, uid);
- if (client) {
- /* We already have it */
-
- return TRUE;
- } else {
- ESource *default_source;
-
- if (priv->default_client) {
- default_source = e_cal_get_source (priv->default_client);
-
- /* We don't have it but the default client is it */
- if (!strcmp (e_source_peek_uid (default_source), uid))
- client = g_object_ref (priv->default_client);
- }
-
- /* Create a new one */
- if (!client) {
- client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_TODO);
- if (!client)
- return FALSE;
- }
- }
-
- g_signal_connect (G_OBJECT (client), "backend_error", G_CALLBACK (backend_error_cb), tasks);
- g_signal_connect (G_OBJECT (client), "backend_died", G_CALLBACK (backend_died_cb), tasks);
-
- /* add the client to internal structure */
- g_hash_table_insert (priv->clients, g_strdup (uid) , client);
- priv->clients_list = g_list_prepend (priv->clients_list, client);
-
- gtk_signal_emit (GTK_OBJECT (tasks), e_tasks_signals[SOURCE_ADDED], source);
-
- open_ecal (tasks, client, FALSE, client_cal_opened_cb);
-
- return TRUE;
-}
-
-gboolean
-e_tasks_remove_todo_source (ETasks *tasks, ESource *source)
-{
- ETasksPrivate *priv;
- ECal *client;
- ECalModel *model;
- const char *uid;
-
- g_return_val_if_fail (tasks != NULL, FALSE);
- g_return_val_if_fail (E_IS_TASKS (tasks), FALSE);
- g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
-
- priv = tasks->priv;
-
- uid = e_source_peek_uid (source);
- client = g_hash_table_lookup (priv->clients, uid);
- if (!client)
- return TRUE;
-
-
- priv->clients_list = g_list_remove (priv->clients_list, client);
- g_signal_handlers_disconnect_matched (client, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, tasks);
-
- model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view));
- e_cal_model_remove_client (model, client);
-
- g_hash_table_remove (priv->clients, uid);
-
-
- gtk_signal_emit (GTK_OBJECT (tasks), e_tasks_signals[SOURCE_REMOVED], source);
-
- return TRUE;
-}
-
-gboolean
-e_tasks_set_default_source (ETasks *tasks, ESource *source)
-{
- ETasksPrivate *priv;
- ECal *ecal;
-
- g_return_val_if_fail (tasks != NULL, FALSE);
- g_return_val_if_fail (E_IS_TASKS (tasks), FALSE);
- g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
-
- priv = tasks->priv;
-
- ecal = g_hash_table_lookup (priv->clients, e_source_peek_uid (source));
-
- if (priv->default_client)
- g_object_unref (priv->default_client);
-
- if (ecal) {
- priv->default_client = g_object_ref (ecal);
- } else {
- priv->default_client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_TODO);
- if (!priv->default_client)
- return FALSE;
- }
-
- open_ecal (tasks, priv->default_client, FALSE, default_client_cal_opened_cb);
-
- return TRUE;
-}
-
-ECal *
-e_tasks_get_default_client (ETasks *tasks)
-{
- ETasksPrivate *priv;
-
- g_return_val_if_fail (tasks != NULL, NULL);
- g_return_val_if_fail (E_IS_TASKS (tasks), NULL);
-
- priv = tasks->priv;
-
- return e_cal_model_get_default_client (e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view)));
-}
-
-/**
- * e_tasks_complete_selected:
- * @tasks: A tasks control widget
- *
- * Marks the selected tasks complete
- **/
-void
-e_tasks_complete_selected (ETasks *tasks)
-{
- ETasksPrivate *priv;
- ECalendarTable *cal_table;
-
- g_return_if_fail (tasks != NULL);
- g_return_if_fail (E_IS_TASKS (tasks));
-
- priv = tasks->priv;
-
- cal_table = E_CALENDAR_TABLE (priv->tasks_view);
-
- set_status_message (tasks, _("Completing tasks..."));
- e_calendar_table_complete_selected (cal_table);
- set_status_message (tasks, NULL);
-}
-
-/**
- * e_tasks_delete_selected:
- * @tasks: A tasks control widget.
- *
- * Deletes the selected tasks in the task list.
- **/
-void
-e_tasks_delete_selected (ETasks *tasks)
-{
- ETasksPrivate *priv;
- ECalendarTable *cal_table;
-
- g_return_if_fail (tasks != NULL);
- g_return_if_fail (E_IS_TASKS (tasks));
-
- priv = tasks->priv;
-
- cal_table = E_CALENDAR_TABLE (priv->tasks_view);
- set_status_message (tasks, _("Deleting selected objects..."));
- e_calendar_table_delete_selected (cal_table);
- set_status_message (tasks, NULL);
-
- e_cal_component_preview_clear (E_CAL_COMPONENT_PREVIEW (priv->preview));
-}
-
-/**
- * e_tasks_expunge:
- * @tasks: A tasks control widget
- *
- * Removes all tasks marked as completed
- **/
-void
-e_tasks_delete_completed (ETasks *tasks)
-{
- ETasksPrivate *priv;
- char *sexp;
- GList *l;
-
- g_return_if_fail (tasks != NULL);
- g_return_if_fail (E_IS_TASKS (tasks));
-
- priv = tasks->priv;
-
- sexp = g_strdup ("(is-completed?)");
-
- set_status_message (tasks, _("Expunging"));
-
- for (l = priv->clients_list; l != NULL; l = l->next) {
- ECal *client = l->data;
- GList *objects, *m;
- gboolean read_only = TRUE;
-
- e_cal_is_read_only (client, &read_only, NULL);
- if (read_only)
- continue;
-
- if (!e_cal_get_object_list (client, sexp, &objects, NULL)) {
- g_warning (G_STRLOC ": Could not get the objects");
-
- continue;
- }
-
- for (m = objects; m; m = m->next) {
- /* FIXME Better error handling */
- e_cal_remove_object (client, icalcomponent_get_uid (m->data), NULL);
- }
- }
-
- set_status_message (tasks, NULL);
-
- g_free (sexp);
-}
-
-/* Callback used from the view collection when we need to display a new view */
-static void
-display_view_cb (GalViewInstance *instance, GalView *view, gpointer data)
-{
- ETasks *tasks;
-
- tasks = E_TASKS (data);
-
- if (GAL_IS_VIEW_ETABLE (view)) {
- gal_view_etable_attach_table (GAL_VIEW_ETABLE (view), e_table_scrolled_get_table (E_TABLE_SCROLLED (E_CALENDAR_TABLE (tasks->priv->tasks_view)->etable)));
- }
-
- gtk_paned_set_position ((GtkPaned *)tasks->priv->paned, calendar_config_get_task_vpane_pos ());
-}
-
-/**
- * e_tasks_setup_view_menus:
- * @tasks: A tasks widget.
- * @uic: UI controller to use for the menus.
- *
- * Sets up the #GalView menus for a tasks control. This function should be
- * called from the Bonobo control activation callback for this tasks control.
- * Also, the menus should be discarded using e_tasks_discard_view_menus().
- **/
-void
-e_tasks_setup_view_menus (ETasks *tasks, BonoboUIComponent *uic)
-{
- ETasksPrivate *priv;
- GalViewFactory *factory;
- ETableSpecification *spec;
- char *dir;
- static GalViewCollection *collection = NULL;
-
- g_return_if_fail (tasks != NULL);
- g_return_if_fail (E_IS_TASKS (tasks));
- g_return_if_fail (uic != NULL);
- g_return_if_fail (BONOBO_IS_UI_COMPONENT (uic));
-
- priv = tasks->priv;
-
- g_return_if_fail (priv->view_instance == NULL);
-
- g_assert (priv->view_instance == NULL);
- g_assert (priv->view_menus == NULL);
-
- /* Create the view instance */
-
- if (collection == NULL) {
- collection = gal_view_collection_new ();
-
- gal_view_collection_set_title (collection, _("Tasks"));
-
- dir = g_build_filename (tasks_component_peek_base_directory (tasks_component_peek ()),
- "tasks", "views", NULL);
- gal_view_collection_set_storage_directories (collection,
- EVOLUTION_GALVIEWSDIR "/tasks/",
- dir);
- g_free (dir);
-
- /* Create the views */
-
- spec = e_table_specification_new ();
- e_table_specification_load_from_file (spec,
- EVOLUTION_ETSPECDIR "/e-calendar-table.etspec");
-
- factory = gal_view_factory_etable_new (spec);
- g_object_unref (spec);
- gal_view_collection_add_factory (collection, factory);
- g_object_unref (factory);
-
- /* Load the collection and create the menus */
-
- gal_view_collection_load (collection);
- }
-
- priv->view_instance = gal_view_instance_new (collection, NULL);
-
- priv->view_menus = gal_view_menus_new (priv->view_instance);
- gal_view_menus_apply (priv->view_menus, uic, NULL);
- g_signal_connect (priv->view_instance, "display_view", G_CALLBACK (display_view_cb), tasks);
- display_view_cb (priv->view_instance, gal_view_instance_get_current_view (priv->view_instance), tasks);
-}
-
-/**
- * e_tasks_discard_view_menus:
- * @tasks: A tasks widget.
- *
- * Discards the #GalView menus used by a tasks control. This function should be
- * called from the Bonobo control deactivation callback for this tasks control.
- * The menus should have been set up with e_tasks_setup_view_menus().
- **/
-void
-e_tasks_discard_view_menus (ETasks *tasks)
-{
- ETasksPrivate *priv;
-
- g_return_if_fail (tasks != NULL);
- g_return_if_fail (E_IS_TASKS (tasks));
-
- priv = tasks->priv;
-
- g_return_if_fail (priv->view_instance != NULL);
-
- g_assert (priv->view_instance != NULL);
- g_assert (priv->view_menus != NULL);
-
- g_object_unref (priv->view_instance);
- priv->view_instance = NULL;
-
- g_object_unref (priv->view_menus);
- priv->view_menus = NULL;
-}
-
-/**
- * e_tasks_get_calendar_table:
- * @tasks: A tasks widget.
- *
- * Queries the #ECalendarTable contained in a tasks widget.
- *
- * Return value: The #ECalendarTable that the tasks widget uses to display its
- * information.
- **/
-ECalendarTable *
-e_tasks_get_calendar_table (ETasks *tasks)
-{
- ETasksPrivate *priv;
-
- g_return_val_if_fail (tasks != NULL, NULL);
- g_return_val_if_fail (E_IS_TASKS (tasks), NULL);
-
- priv = tasks->priv;
- return E_CALENDAR_TABLE (priv->tasks_view);
-}
diff --git a/calendar/gui/e-tasks.h b/calendar/gui/e-tasks.h
deleted file mode 100644
index 26a8c37984..0000000000
--- a/calendar/gui/e-tasks.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-tasks.h
- *
- * Copyright (C) 2001 Ximian, Inc.
- * Copyright (C) 2001 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Authors: Federico Mena Quintero <federico@ximian.com>
- * Damon Chaplin <damon@ximian.com>
- */
-
-#ifndef _E_TASKS_H_
-#define _E_TASKS_H_
-
-#include <bonobo/bonobo-ui-component.h>
-#include <gtk/gtktable.h>
-#include <libedataserver/e-source.h>
-#include <libecal/e-cal.h>
-#include "e-calendar-table.h"
-
-#define E_TYPE_TASKS (e_tasks_get_type ())
-#define E_TASKS(obj) (GTK_CHECK_CAST ((obj), E_TYPE_TASKS, ETasks))
-#define E_TASKS_CLASS(klass) (GTK_CHECK_CAST_CLASS ((klass), E_TYPE_TASKS, \
- ETasksClass))
-#define E_IS_TASKS(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_TASKS))
-#define E_IS_TASKS_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_TASKS))
-
-typedef struct _ETasks ETasks;
-typedef struct _ETasksClass ETasksClass;
-typedef struct _ETasksPrivate ETasksPrivate;
-
-struct _ETasks {
- GtkTable table;
-
- /* Private data */
- ETasksPrivate *priv;
-};
-
-struct _ETasksClass {
- GtkTableClass parent_class;
-
- /* Notification signals */
- void (* selection_changed) (ETasks *tasks, int n_selected);
- void (* source_added) (ETasks *tasks, ESource *source);
- void (* source_removed) (ETasks *tasks, ESource *source);
-};
-
-
-GtkType e_tasks_get_type (void);
-GtkWidget *e_tasks_construct (ETasks *tasks);
-
-GtkWidget *e_tasks_new (void);
-
-void e_tasks_set_ui_component (ETasks *tasks,
- BonoboUIComponent *ui_component);
-
-gboolean e_tasks_add_todo_source (ETasks *tasks, ESource *source);
-gboolean e_tasks_remove_todo_source (ETasks *tasks, ESource *source);
-gboolean e_tasks_set_default_source (ETasks *tasks, ESource *source);
-ECal *e_tasks_get_default_client (ETasks *tasks);
-
-void e_tasks_open_task (ETasks *tasks);
-void e_tasks_new_task (ETasks *tasks);
-void e_tasks_complete_selected (ETasks *tasks);
-void e_tasks_delete_selected (ETasks *tasks);
-void e_tasks_delete_completed (ETasks *tasks);
-
-
-void e_tasks_setup_view_menus (ETasks *tasks, BonoboUIComponent *uic);
-void e_tasks_discard_view_menus (ETasks *tasks);
-
-ECalendarTable *e_tasks_get_calendar_table (ETasks *tasks);
-
-#endif /* _E_TASKS_H_ */
diff --git a/calendar/gui/e-timezone-entry.c b/calendar/gui/e-timezone-entry.c
deleted file mode 100644
index 4004ae2cb8..0000000000
--- a/calendar/gui/e-timezone-entry.c
+++ /dev/null
@@ -1,344 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 2001, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * ETimezoneEntry - a field for setting a timezone. It shows the timezone in
- * a GtkEntry with a '...' button beside it which shows a dialog for changing
- * the timezone. The dialog contains a map of the world with a point for each
- * timezone, and an option menu as an alternative way of selecting the
- * timezone.
- */
-
-#include <config.h>
-#include <gtk/gtkbutton.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtksignal.h>
-#include <gnome.h>
-#include <widgets/e-timezone-dialog/e-timezone-dialog.h>
-#include <libgnome/gnome-i18n.h>
-#include "e-timezone-entry.h"
-#include <e-util/e-icon-factory.h>
-
-struct _ETimezoneEntryPrivate {
- /* The current timezone, set in e_timezone_entry_set_timezone()
- or from the timezone dialog. Note that we don't copy it or
- use a ref count - we assume it is never destroyed for the
- lifetime of this widget. */
- icaltimezone *zone;
-
- /* This can be set to the default timezone. If the current timezone
- setting in the ETimezoneEntry matches this, then the entry field
- is hidden. This makes the user interface simpler. */
- icaltimezone *default_zone;
-
- GtkWidget *entry;
- GtkWidget *button;
-};
-
-
-enum {
- CHANGED,
- LAST_SIGNAL
-};
-
-static void e_timezone_entry_destroy (GtkObject *object);
-
-static gboolean e_timezone_entry_mnemonic_activate (GtkWidget *widget,
- gboolean group_cycling);
-static gboolean e_timezone_entry_focus (GtkWidget *widget,
- GtkDirectionType direction);
-static void on_entry_changed (GtkEntry *entry,
- ETimezoneEntry *tentry);
-static void on_button_clicked (GtkWidget *widget,
- ETimezoneEntry *tentry);
-
-static void e_timezone_entry_set_entry (ETimezoneEntry *tentry);
-
-
-static guint timezone_entry_signals[LAST_SIGNAL] = { 0 };
-
-G_DEFINE_TYPE (ETimezoneEntry, e_timezone_entry, GTK_TYPE_HBOX);
-
-static void
-e_timezone_entry_class_init (ETimezoneEntryClass *class)
-{
- GtkObjectClass *object_class = (GtkObjectClass *) class;
- GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class) ;
-
- object_class = (GtkObjectClass*) class;
-
- widget_class->mnemonic_activate = e_timezone_entry_mnemonic_activate;
- widget_class->focus = e_timezone_entry_focus;
- timezone_entry_signals[CHANGED] =
- gtk_signal_new ("changed",
- GTK_RUN_LAST,
- G_TYPE_FROM_CLASS (object_class),
- GTK_SIGNAL_OFFSET (ETimezoneEntryClass,
- changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
-
- object_class->destroy = e_timezone_entry_destroy;
-
- class->changed = NULL;
-}
-
-
-static void
-e_timezone_entry_init (ETimezoneEntry *tentry)
-{
- ETimezoneEntryPrivate *priv;
- GtkWidget *gtk_image;
- AtkObject *a11y;
-
- tentry->priv = priv = g_new0 (ETimezoneEntryPrivate, 1);
-
- priv->zone = NULL;
- priv->default_zone = NULL;
-
- priv->entry = gtk_entry_new ();
- gtk_entry_set_editable (GTK_ENTRY (priv->entry), FALSE);
- /*gtk_widget_set_usize (priv->date_entry, 90, 0);*/
- gtk_box_pack_start (GTK_BOX (tentry), priv->entry, TRUE, TRUE, 6);
- gtk_widget_show (priv->entry);
- g_signal_connect (priv->entry, "changed", G_CALLBACK (on_entry_changed), tentry);
-
- priv->button = gtk_button_new ();
- g_signal_connect (priv->button, "clicked", G_CALLBACK (on_button_clicked), tentry);
- gtk_box_pack_start (GTK_BOX (tentry), priv->button, FALSE, FALSE, 6);
- gtk_widget_show (priv->button);
- a11y = gtk_widget_get_accessible (priv->button);
- if (a11y != NULL) {
- atk_object_set_name (a11y, _("Timezone Button"));
- }
-
- gtk_image = e_icon_factory_get_image ("stock_timezone", E_ICON_SIZE_BUTTON);
- gtk_container_add (GTK_CONTAINER (priv->button), gtk_image);
- gtk_widget_show (gtk_image);
-}
-
-
-/**
- * e_timezone_entry_new:
- *
- * Description: Creates a new #ETimezoneEntry widget which can be used
- * to provide an easy to use way for entering dates and times.
- *
- * Returns: a new #ETimezoneEntry widget.
- */
-GtkWidget *
-e_timezone_entry_new (void)
-{
- ETimezoneEntry *tentry;
-
- tentry = g_object_new (e_timezone_entry_get_type (), NULL);
-
- GTK_WIDGET_SET_FLAGS (GTK_WIDGET(tentry), GTK_CAN_FOCUS);
-
- return GTK_WIDGET (tentry);
-}
-
-
-static void
-e_timezone_entry_destroy (GtkObject *object)
-{
- ETimezoneEntry *tentry;
- ETimezoneEntryPrivate *priv;
-
- g_return_if_fail (E_IS_TIMEZONE_ENTRY (object));
-
- tentry = E_TIMEZONE_ENTRY (object);
- priv = tentry->priv;
-
- g_free (tentry->priv);
- tentry->priv = NULL;
-
- if (GTK_OBJECT_CLASS (e_timezone_entry_parent_class)->destroy)
- (* GTK_OBJECT_CLASS (e_timezone_entry_parent_class)->destroy) (object);
-}
-
-
-/* The arrow button beside the date field has been clicked, so we show the
- popup with the ECalendar in. */
-static void
-on_button_clicked (GtkWidget *widget,
- ETimezoneEntry *tentry)
-{
- ETimezoneEntryPrivate *priv;
- ETimezoneDialog *timezone_dialog;
- GtkWidget *dialog;
-
- priv = tentry->priv;
-
- timezone_dialog = e_timezone_dialog_new ();
-
- e_timezone_dialog_set_timezone (timezone_dialog, priv->zone);
-
- dialog = e_timezone_dialog_get_toplevel (timezone_dialog);
-
- if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
- priv->zone = e_timezone_dialog_get_timezone (timezone_dialog);
- e_timezone_entry_set_entry (tentry);
- }
-
- g_object_unref (timezone_dialog);
-}
-
-
-static void
-on_entry_changed (GtkEntry *entry,
- ETimezoneEntry *tentry)
-{
- gtk_signal_emit (GTK_OBJECT (tentry), timezone_entry_signals[CHANGED]);
-}
-
-
-icaltimezone*
-e_timezone_entry_get_timezone (ETimezoneEntry *tentry)
-{
- ETimezoneEntryPrivate *priv;
-
- g_return_val_if_fail (E_IS_TIMEZONE_ENTRY (tentry), NULL);
-
- priv = tentry->priv;
-
- return priv->zone;
-}
-
-
-void
-e_timezone_entry_set_timezone (ETimezoneEntry *tentry,
- icaltimezone *zone)
-{
- ETimezoneEntryPrivate *priv;
-
- g_return_if_fail (E_IS_TIMEZONE_ENTRY (tentry));
-
- priv = tentry->priv;
-
- priv->zone = zone;
-
- e_timezone_entry_set_entry (tentry);
-}
-
-
-/* Sets the default timezone. If the current timezone matches this, then the
- entry field is hidden. This is useful since most people do not use timezones
- so it makes the user interface simpler. */
-void
-e_timezone_entry_set_default_timezone (ETimezoneEntry *tentry,
- icaltimezone *zone)
-{
- ETimezoneEntryPrivate *priv;
-
- g_return_if_fail (E_IS_TIMEZONE_ENTRY (tentry));
-
- priv = tentry->priv;
-
- priv->default_zone = zone;
-
- e_timezone_entry_set_entry (tentry);
-}
-
-
-static void
-e_timezone_entry_set_entry (ETimezoneEntry *tentry)
-{
- ETimezoneEntryPrivate *priv;
- const char *display_name;
- char *name_buffer;
-
- priv = tentry->priv;
-
- if (priv->zone) {
- display_name = icaltimezone_get_display_name (priv->zone);
-
- /* We check if it is one of our builtin timezone
- names, in which case we call gettext to translate
- it. If it isn't a builtin timezone name, we
- don't. */
- if (icaltimezone_get_builtin_timezone (display_name))
- display_name = _(display_name);
- } else
- display_name = "";
-
- name_buffer = g_strdup (display_name);
-
- gtk_entry_set_text (GTK_ENTRY (priv->entry), name_buffer);
-
- if (!priv->default_zone || (priv->zone != priv->default_zone))
- gtk_widget_show (priv->entry);
- else
- gtk_widget_hide (priv->entry);
-
- g_free (name_buffer);
-}
-
-
-static gboolean
-e_timezone_entry_mnemonic_activate (GtkWidget *widget,
- gboolean group_cycling)
-{
- GtkButton *button = NULL;
-
- if (GTK_WIDGET_CAN_FOCUS (widget)) {
- button = GTK_BUTTON (((ETimezoneEntryPrivate *) ((ETimezoneEntry *) widget)->priv)->button);
- if (button != NULL)
- gtk_widget_grab_focus (GTK_WIDGET (button));
- }
-
- return TRUE;
-}
-
-static gboolean
-e_timezone_entry_focus (GtkWidget *widget, GtkDirectionType direction)
-{
- ETimezoneEntry *tentry;
-
- tentry = E_TIMEZONE_ENTRY (widget);
-
- if (direction == GTK_DIR_TAB_FORWARD) {
- if (GTK_WIDGET_HAS_FOCUS (tentry->priv->entry))
- gtk_widget_grab_focus (tentry->priv->button);
- else if (GTK_WIDGET_HAS_FOCUS (tentry->priv->button))
- return FALSE;
- else if (GTK_WIDGET_VISIBLE (tentry->priv->entry))
- gtk_widget_grab_focus (tentry->priv->entry);
- else
- gtk_widget_grab_focus (tentry->priv->button);
- } else if (direction == GTK_DIR_TAB_BACKWARD) {
- if (GTK_WIDGET_HAS_FOCUS (tentry->priv->entry))
- return FALSE;
- else if (GTK_WIDGET_HAS_FOCUS (tentry->priv->button)) {
- if (GTK_WIDGET_VISIBLE (tentry->priv->entry))
- gtk_widget_grab_focus (tentry->priv->entry);
- else
- return FALSE;
- } else
- gtk_widget_grab_focus (tentry->priv->button);
- } else
- return FALSE;
- return TRUE;
-}
-
diff --git a/calendar/gui/e-timezone-entry.h b/calendar/gui/e-timezone-entry.h
deleted file mode 100644
index 94a7df9efc..0000000000
--- a/calendar/gui/e-timezone-entry.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 2001, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * ETimezoneEntry - a field for setting a timezone. It shows the timezone in
- * a GtkEntry with a '...' button beside it which shows a dialog for changing
- * the timezone. The dialog contains a map of the world with a point for each
- * timezone, and an option menu as an alternative way of selecting the
- * timezone.
- */
-
-#ifndef __E_TIMEZONE_ENTRY_H_
-#define __E_TIMEZONE_ENTRY_H_
-
-#include <gtk/gtkhbox.h>
-#include <libecal/e-cal.h>
-
-G_BEGIN_DECLS
-
-
-#define E_TYPE_TIMEZONE_ENTRY (e_timezone_entry_get_type ())
-#define E_TIMEZONE_ENTRY(obj) (GTK_CHECK_CAST ((obj), E_TYPE_TIMEZONE_ENTRY, ETimezoneEntry))
-#define E_TIMEZONE_ENTRY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_TIMEZONE_ENTRY, ETimezoneEntryClass))
-#define E_IS_TIMEZONE_ENTRY(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_TIMEZONE_ENTRY))
-#define E_IS_TIMEZONE_ENTRY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_TIMEZONE_ENTRY))
-
-
-typedef struct _ETimezoneEntry ETimezoneEntry;
-typedef struct _ETimezoneEntryPrivate ETimezoneEntryPrivate;
-typedef struct _ETimezoneEntryClass ETimezoneEntryClass;
-
-struct _ETimezoneEntry {
- GtkHBox hbox;
-
- /*< private >*/
- ETimezoneEntryPrivate *priv;
-};
-
-struct _ETimezoneEntryClass {
- GtkHBoxClass parent_class;
-
- void (* changed) (ETimezoneEntry *tentry);
-};
-
-GType e_timezone_entry_get_type (void);
-GtkWidget* e_timezone_entry_new (void);
-
-icaltimezone* e_timezone_entry_get_timezone (ETimezoneEntry *tentry);
-void e_timezone_entry_set_timezone (ETimezoneEntry *tentry,
- icaltimezone *zone);
-
-/* Sets the default timezone. If the current timezone matches this, then the
- entry field is hidden. This is useful since most people do not use timezones
- so it makes the user interface simpler. */
-void e_timezone_entry_set_default_timezone(ETimezoneEntry *tentry,
- icaltimezone *zone);
-
-G_END_DECLS
-
-#endif /* __E_TIMEZONE_ENTRY_H_ */
diff --git a/calendar/gui/e-week-view-config.c b/calendar/gui/e-week-view-config.c
deleted file mode 100644
index e93f44373e..0000000000
--- a/calendar/gui/e-week-view-config.c
+++ /dev/null
@@ -1,320 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#include "calendar-config.h"
-#include "e-week-view-config.h"
-
-struct _EWeekViewConfigPrivate {
- EWeekView *view;
-
- GList *notifications;
-};
-
-/* Property IDs */
-enum props {
- PROP_0,
- PROP_VIEW,
-};
-
-G_DEFINE_TYPE (EWeekViewConfig, e_week_view_config, G_TYPE_OBJECT);
-
-static void
-e_week_view_config_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
-{
- EWeekViewConfig *view_config;
- EWeekViewConfigPrivate *priv;
-
- view_config = E_WEEK_VIEW_CONFIG (object);
- priv = view_config->priv;
-
- switch (property_id) {
- case PROP_VIEW:
- e_week_view_config_set_view (view_config, g_value_get_object (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-e_week_view_config_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
-{
- EWeekViewConfig *view_config;
- EWeekViewConfigPrivate *priv;
-
- view_config = E_WEEK_VIEW_CONFIG (object);
- priv = view_config->priv;
-
- switch (property_id) {
- case PROP_VIEW:
- g_value_set_object (value, e_week_view_config_get_view (view_config));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-e_week_view_config_dispose (GObject *object)
-{
- EWeekViewConfig *view_config = E_WEEK_VIEW_CONFIG (object);
- EWeekViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- e_week_view_config_set_view (view_config, NULL);
-
- if (G_OBJECT_CLASS (e_week_view_config_parent_class)->dispose)
- G_OBJECT_CLASS (e_week_view_config_parent_class)->dispose (object);
-}
-
-static void
-e_week_view_config_finalize (GObject *object)
-{
- EWeekViewConfig *view_config = E_WEEK_VIEW_CONFIG (object);
- EWeekViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- g_free (priv);
-
- if (G_OBJECT_CLASS (e_week_view_config_parent_class)->finalize)
- G_OBJECT_CLASS (e_week_view_config_parent_class)->finalize (object);
-}
-
-static void
-e_week_view_config_class_init (EWeekViewConfigClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GParamSpec *spec;
-
- /* Method override */
- gobject_class->set_property = e_week_view_config_set_property;
- gobject_class->get_property = e_week_view_config_get_property;
- gobject_class->dispose = e_week_view_config_dispose;
- gobject_class->finalize = e_week_view_config_finalize;
-
- spec = g_param_spec_object ("view", NULL, NULL, e_week_view_get_type (),
- G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT);
- g_object_class_install_property (gobject_class, PROP_VIEW, spec);
-}
-
-static void
-e_week_view_config_init (EWeekViewConfig *view_config)
-{
- view_config->priv = g_new0 (EWeekViewConfigPrivate, 1);
-
-}
-
-EWeekViewConfig *
-e_week_view_config_new (EWeekView *week_view)
-{
- EWeekViewConfig *view_config;
-
- view_config = g_object_new (e_week_view_config_get_type (), "view", week_view, NULL);
-
- return view_config;
-}
-
-EWeekView *
-e_week_view_config_get_view (EWeekViewConfig *view_config)
-{
- EWeekViewConfigPrivate *priv;
-
- g_return_val_if_fail (view_config != NULL, NULL);
- g_return_val_if_fail (E_IS_WEEK_VIEW_CONFIG (view_config), NULL);
-
- priv = view_config->priv;
-
- return priv->view;
-}
-
-static void
-set_timezone (EWeekView *week_view)
-{
- icaltimezone *zone;
-
- zone = calendar_config_get_icaltimezone ();
- e_calendar_view_set_timezone (E_CALENDAR_VIEW (week_view), zone);
-}
-
-static void
-timezone_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EWeekViewConfig *view_config = data;
- EWeekViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_timezone (priv->view);
-}
-
-static void
-set_week_start (EWeekView *week_view)
-{
- int week_start_week;
-
- week_start_week = calendar_config_get_week_start_day ();
-
- /* Convert it to 0 (Mon) to 6 (Sun), which is what we use. */
- week_start_week = (week_start_week + 6) % 7;
-
- e_week_view_set_week_start_day (week_view, week_start_week);
-}
-
-static void
-week_start_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EWeekViewConfig *view_config = data;
- EWeekViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_week_start (priv->view);
-}
-
-static void
-set_twentyfour_hour (EWeekView *week_view)
-{
- gboolean use_24_hour;
-
- use_24_hour = calendar_config_get_24_hour_format ();
-
- e_calendar_view_set_use_24_hour_format (E_CALENDAR_VIEW (week_view), use_24_hour);
-}
-
-static void
-twentyfour_hour_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EWeekViewConfig *view_config = data;
- EWeekViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_twentyfour_hour (priv->view);
-}
-
-static void
-set_show_event_end (EWeekView *week_view)
-{
- gboolean show_event_end;
-
- show_event_end = calendar_config_get_show_event_end ();
-
- e_week_view_set_show_event_end_times (week_view, show_event_end);
-}
-
-static void
-show_event_end_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EWeekViewConfig *view_config = data;
- EWeekViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_show_event_end (priv->view);
-}
-
-static void
-set_compress_weekend (EWeekView *week_view)
-{
- gboolean compress_weekend;
-
- compress_weekend = calendar_config_get_compress_weekend ();
-
- e_week_view_set_compress_weekend (week_view, compress_weekend);
-}
-
-static void
-compress_weekend_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- EWeekViewConfig *view_config = data;
- EWeekViewConfigPrivate *priv;
-
- priv = view_config->priv;
-
- set_compress_weekend (priv->view);
-}
-
-void
-e_week_view_config_set_view (EWeekViewConfig *view_config, EWeekView *week_view)
-{
- EWeekViewConfigPrivate *priv;
- guint not;
- GList *l;
-
- g_return_if_fail (view_config != NULL);
- g_return_if_fail (E_IS_WEEK_VIEW_CONFIG (view_config));
-
- priv = view_config->priv;
-
- if (priv->view) {
- g_object_unref (priv->view);
- priv->view = NULL;
- }
-
- for (l = priv->notifications; l; l = l->next)
- calendar_config_remove_notification (GPOINTER_TO_UINT (l->data));
-
- g_list_free (priv->notifications);
- priv->notifications = NULL;
-
- /* If the new view is NULL, return right now */
- if (!week_view)
- return;
-
- priv->view = g_object_ref (week_view);
-
- /* Time zone */
- set_timezone (week_view);
-
- not = calendar_config_add_notification_timezone (timezone_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Week start */
- set_week_start (week_view);
-
- not = calendar_config_add_notification_week_start_day (week_start_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* 24 Hour format */
- set_twentyfour_hour (week_view);
-
- not = calendar_config_add_notification_24_hour_format (twentyfour_hour_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Show event end */
- set_show_event_end (week_view);
-
- not = calendar_config_add_notification_show_event_end (show_event_end_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Compress weekend */
- set_compress_weekend (week_view);
-
- not = calendar_config_add_notification_compress_weekend (compress_weekend_changed_cb, view_config);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-}
-
diff --git a/calendar/gui/e-week-view-config.h b/calendar/gui/e-week-view-config.h
deleted file mode 100644
index e37cb0cfc0..0000000000
--- a/calendar/gui/e-week-view-config.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Author :
- * JP Rosevear <jpr@ximian.com>
- *
- * Copyright 2003, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#ifndef _E_WEEK_VIEW_CONFIG_H_
-#define _E_WEEK_VIEW_CONFIG_H_
-
-#include "e-week-view.h"
-
-G_BEGIN_DECLS
-
-#define E_WEEK_VIEW_CONFIG(obj) GTK_CHECK_CAST (obj, e_week_view_config_get_type (), EWeekViewConfig)
-#define E_WEEK_VIEW_CONFIG_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_week_view_config_get_type (), EWeekViewConfigClass)
-#define E_IS_WEEK_VIEW_CONFIG(obj) GTK_CHECK_TYPE (obj, e_week_view_config_get_type ())
-
-typedef struct _EWeekViewConfig EWeekViewConfig;
-typedef struct _EWeekViewConfigClass EWeekViewConfigClass;
-typedef struct _EWeekViewConfigPrivate EWeekViewConfigPrivate;
-
-struct _EWeekViewConfig {
- GObject parent;
-
- EWeekViewConfigPrivate *priv;
-};
-
-struct _EWeekViewConfigClass {
- GObjectClass parent_class;
-};
-
-GType e_week_view_config_get_type (void);
-EWeekViewConfig *e_week_view_config_new (EWeekView *week_view);
-EWeekView *e_week_view_config_get_view (EWeekViewConfig *view_config);
-void e_week_view_config_set_view (EWeekViewConfig *view_config, EWeekView *week_view);
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/e-week-view-event-item.c b/calendar/gui/e-week-view-event-item.c
deleted file mode 100644
index e4ace7961e..0000000000
--- a/calendar/gui/e-week-view-event-item.c
+++ /dev/null
@@ -1,982 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 1999, Ximian, Inc.
- * Copyright 2001, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * EWeekViewEventItem - displays the background, times and icons for an event
- * in the week/month views. A separate EText canvas item is used to display &
- * edit the text.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-util/e-categories-config.h"
-#include "e-week-view-event-item.h"
-
-#include <gtk/gtksignal.h>
-#include <gal/e-text/e-text.h>
-
-static void e_week_view_event_item_set_arg (GtkObject *o,
- GtkArg *arg,
- guint arg_id);
-static void e_week_view_event_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path,
- int flags);
-static void e_week_view_event_item_draw (GnomeCanvasItem *item,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height);
-static void e_week_view_draw_time (EWeekView *week_view,
- GdkDrawable *drawable,
- gint time_x,
- gint time_y,
- gint hour,
- gint minute);
-static void e_week_view_event_item_draw_icons (EWeekViewEventItem *wveitem,
- GdkDrawable *drawable,
- gint icon_x,
- gint icon_y,
- gint x2,
- gboolean right_align);
-static void e_week_view_event_item_draw_triangle (EWeekViewEventItem *wveitem,
- GdkDrawable *drawable,
- gint x,
- gint y,
- gint w,
- gint h);
-static double e_week_view_event_item_point (GnomeCanvasItem *item,
- double x,
- double y,
- int cx,
- int cy,
- GnomeCanvasItem **actual_item);
-static gint e_week_view_event_item_event (GnomeCanvasItem *item,
- GdkEvent *event);
-static gboolean e_week_view_event_item_button_press (EWeekViewEventItem *wveitem,
- GdkEvent *event);
-static gboolean e_week_view_event_item_button_release (EWeekViewEventItem *wveitem,
- GdkEvent *event);
-static gboolean e_week_view_event_item_double_click (EWeekViewEventItem *wveitem,
- GdkEvent *bevent);
-static ECalendarViewPosition e_week_view_event_item_get_position (EWeekViewEventItem *wveitem,
- gdouble x,
- gdouble y);
-
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_EVENT_NUM,
- ARG_SPAN_NUM
-};
-
-G_DEFINE_TYPE (EWeekViewEventItem, e_week_view_event_item, GNOME_TYPE_CANVAS_ITEM);
-
-static void
-e_week_view_event_item_class_init (EWeekViewEventItemClass *class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass *) class;
- item_class = (GnomeCanvasItemClass *) class;
-
- gtk_object_add_arg_type ("EWeekViewEventItem::event_num",
- GTK_TYPE_INT, GTK_ARG_WRITABLE,
- ARG_EVENT_NUM);
- gtk_object_add_arg_type ("EWeekViewEventItem::span_num",
- GTK_TYPE_INT, GTK_ARG_WRITABLE,
- ARG_SPAN_NUM);
-
- object_class->set_arg = e_week_view_event_item_set_arg;
-
- /* GnomeCanvasItem method overrides */
- item_class->update = e_week_view_event_item_update;
- item_class->draw = e_week_view_event_item_draw;
- item_class->point = e_week_view_event_item_point;
- item_class->event = e_week_view_event_item_event;
-}
-
-
-static void
-e_week_view_event_item_init (EWeekViewEventItem *wveitem)
-{
- wveitem->event_num = -1;
- wveitem->span_num = -1;
-}
-
-
-static void
-e_week_view_event_item_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EWeekViewEventItem *wveitem;
- gboolean needs_update = FALSE;
-
- item = GNOME_CANVAS_ITEM (o);
- wveitem = E_WEEK_VIEW_EVENT_ITEM (o);
-
- switch (arg_id){
- case ARG_EVENT_NUM:
- wveitem->event_num = GTK_VALUE_INT (*arg);
- needs_update = TRUE;
- break;
- case ARG_SPAN_NUM:
- wveitem->span_num = GTK_VALUE_INT (*arg);
- needs_update = TRUE;
- break;
- }
-
- if (needs_update)
- gnome_canvas_item_request_update (item);
-}
-
-
-static void
-e_week_view_event_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path,
- int flags)
-{
- EWeekViewEventItem *wveitem;
- EWeekView *week_view;
- gint span_x, span_y, span_w;
-
-#if 0
- g_print ("In e_week_view_event_item_update\n");
-#endif
-
- wveitem = E_WEEK_VIEW_EVENT_ITEM (item);
- week_view = E_WEEK_VIEW (GTK_WIDGET (item->canvas)->parent);
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
- if (GNOME_CANVAS_ITEM_CLASS (e_week_view_event_item_parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (e_week_view_event_item_parent_class)->update) (item, affine, clip_path, flags);
-
- item->x1 = 0;
- item->y1 = 0;
- item->x2 = 0;
- item->y2 = 0;
-
- if (wveitem->event_num != -1 && wveitem->span_num != -1) {
- if (e_week_view_get_span_position (week_view,
- wveitem->event_num,
- wveitem->span_num,
- &span_x, &span_y,
- &span_w)) {
-#if 0
- g_print (" Event:%i Span:%i %i,%i W:%i\n",
- wveitem->event_num, wveitem->span_num,
- span_x, span_y, span_w);
-#endif
- item->x1 = span_x;
- item->y1 = span_y;
- item->x2 = span_x + span_w - 1;
- item->y2 = span_y + week_view->row_height - 1;
- }
- }
-}
-
-
-/*
- * DRAWING ROUTINES - functions to paint the canvas item.
- */
-
-static void
-e_week_view_event_item_draw (GnomeCanvasItem *canvas_item,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height)
-{
- EWeekViewEventItem *wveitem;
- EWeekView *week_view;
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- GtkStyle *style;
- GdkGC *gc;
- gint x1, y1, x2, y2, time_x, time_y;
- gint icon_x, icon_y, time_width, min_end_time_x, max_icon_x;
- gint rect_x, rect_w, rect_x2;
- gboolean one_day_event, editing_span = FALSE;
- gint start_hour, start_minute, end_hour, end_minute;
- gboolean draw_start, draw_end;
- gboolean draw_start_triangle = FALSE, draw_end_triangle = FALSE;
- GdkRectangle clip_rect;
- GdkColor bg_color;
-
-#if 0
- g_print ("In e_week_view_event_item_draw %i,%i %ix%i\n",
- x, y, width, height);
-#endif
-
- wveitem = E_WEEK_VIEW_EVENT_ITEM (canvas_item);
- week_view = E_WEEK_VIEW (GTK_WIDGET (canvas_item->canvas)->parent);
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
- if (wveitem->event_num == -1 || wveitem->span_num == -1)
- return;
-
- g_return_if_fail(wveitem->event_num < week_view->events->len);
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- wveitem->event_num);
-
- g_return_if_fail(event->spans_index + wveitem->span_num < week_view->spans->len);
-
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- event->spans_index + wveitem->span_num);
-
- style = GTK_WIDGET (week_view)->style;
- gc = week_view->main_gc;
-
- x1 = canvas_item->x1 - x;
- y1 = canvas_item->y1 - y;
- x2 = canvas_item->x2 - x;
- y2 = canvas_item->y2 - y;
-
- if (x1 == x2 || y1 == y2)
- return;
-
- icon_x = 0;
- icon_y = y1 + E_WEEK_VIEW_EVENT_BORDER_HEIGHT + E_WEEK_VIEW_ICON_Y_PAD;
-
- /* Get the start & end times in 24-hour format. */
- start_hour = event->start_minute / 60;
- start_minute = event->start_minute % 60;
-
- /* Modulo 24 because a midnight end time will be '24' */
- end_hour = (event->end_minute / 60) % 24;
- end_minute = event->end_minute % 60;
-
- time_y = y1 + E_WEEK_VIEW_EVENT_BORDER_HEIGHT
- + E_WEEK_VIEW_EVENT_TEXT_Y_PAD;
-
- time_width = e_week_view_get_time_string_width (week_view);
-
- one_day_event = e_week_view_is_one_day_event (week_view,
- wveitem->event_num);
- if (one_day_event) {
- time_x = x1 + E_WEEK_VIEW_EVENT_L_PAD + 1;
- rect_x = x1 + E_WEEK_VIEW_EVENT_L_PAD;
- rect_w = x2 - x1 - E_WEEK_VIEW_EVENT_L_PAD - E_WEEK_VIEW_EVENT_R_PAD + 1;
-
- if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)),
- event->comp_data),
- &bg_color)) {
- GdkColormap *colormap;
-
- colormap = gtk_widget_get_colormap (GTK_WIDGET (week_view));
- if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE))
- gdk_gc_set_foreground (gc, &bg_color);
- else
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]);
- } else
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]);
- gdk_draw_rectangle (drawable, gc, TRUE, rect_x, y1 + 1, rect_w, y2 - y1 - 1);
-
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER]);
- gdk_draw_line (drawable, gc, rect_x, y1 + 1, rect_x + rect_w, y1 + 1);
- gdk_draw_line (drawable, gc, rect_x, y2, rect_x + rect_w, y2);
- gdk_draw_line (drawable, gc, rect_x, y1 + 1, rect_x, y1 + (y2 - (y1 + 1)));
- gdk_draw_line (drawable, gc, rect_x + rect_w, y1 + 1, rect_x + rect_w, y1 + (y2 - (y1 + 1)));
-
- /* Draw the start and end times, as required. */
- switch (week_view->time_format) {
- case E_WEEK_VIEW_TIME_BOTH_SMALL_MIN:
- case E_WEEK_VIEW_TIME_BOTH:
- draw_start = TRUE;
- draw_end = TRUE;
- break;
-
- case E_WEEK_VIEW_TIME_START_SMALL_MIN:
- case E_WEEK_VIEW_TIME_START:
- draw_start = TRUE;
- draw_end = FALSE;
- break;
-
- case E_WEEK_VIEW_TIME_NONE:
- draw_start = FALSE;
- draw_end = FALSE;
- break;
- default:
- g_assert_not_reached();
- draw_start = FALSE;
- draw_end = FALSE;
- break;
- }
-
- if (draw_start) {
- e_week_view_draw_time (week_view, drawable,
- time_x, time_y,
- start_hour, start_minute);
- time_x += time_width;
- }
-
- if (draw_end) {
- time_x += E_WEEK_VIEW_EVENT_TIME_SPACING;
- e_week_view_draw_time (week_view, drawable,
- time_x, time_y,
- end_hour, end_minute);
- time_x += time_width;
- }
-
- icon_x = time_x;
- if (draw_start)
- icon_x += E_WEEK_VIEW_EVENT_TIME_X_PAD;
-
- /* Draw the icons. */
- e_week_view_event_item_draw_icons (wveitem, drawable,
- icon_x, icon_y,
- x2, FALSE);
-
- } else {
- rect_x = x1 + E_WEEK_VIEW_EVENT_L_PAD;
- rect_w = x2 - x1 - E_WEEK_VIEW_EVENT_L_PAD
- - E_WEEK_VIEW_EVENT_R_PAD + 1;
-
- /* Draw the triangles at the start & end, if needed.
- They also use the first few pixels at the edge of the
- event so we update rect_x & rect_w so we don't draw over
- them. */
- if (event->start < week_view->day_starts[span->start_day]) {
- draw_start_triangle = TRUE;
- rect_x += 2;
- rect_w -= 2;
- }
-
- if (event->end > week_view->day_starts[span->start_day
- + span->num_days]) {
- draw_end_triangle = TRUE;
- rect_w -= 2;
- }
-
- if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)),
- event->comp_data),
- &bg_color)) {
- GdkColormap *colormap;
-
- colormap = gtk_widget_get_colormap (GTK_WIDGET (week_view));
- if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE))
- gdk_gc_set_foreground (gc, &bg_color);
- else
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]);
- } else
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]);
- gdk_draw_rectangle (drawable, gc, TRUE, rect_x, y1 + 1, rect_w, y2 - y1 - 1);
-
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER]);
- rect_x2 = rect_x + rect_w - 1;
- gdk_draw_line (drawable, gc, rect_x, y1, rect_x2, y1);
- gdk_draw_line (drawable, gc, rect_x, y2, rect_x2, y2);
-
- if (draw_start_triangle) {
- e_week_view_event_item_draw_triangle (wveitem, drawable, x1 + E_WEEK_VIEW_EVENT_L_PAD + 2, y1, -3, y2 - y1 + 1);
- } else {
- gdk_draw_line (drawable, gc, rect_x, y1, rect_x, y2);
- }
-
- if (draw_end_triangle) {
- e_week_view_event_item_draw_triangle (wveitem, drawable, x2 - E_WEEK_VIEW_EVENT_R_PAD - 2, y1, 3, y2 - y1 + 1);
- } else {
- gdk_draw_line (drawable, gc, rect_x2, y1, rect_x2, y2);
- }
-
- if (span->text_item && E_TEXT (span->text_item)->editing)
- editing_span = TRUE;
-
- /* Draw the start & end times, if they are not on day
- boundaries. The start time would always be shown if it was
- needed, though it may be clipped as the window shrinks.
- The end time is only displayed if there is enough room.
- We calculate the minimum position for the end time, which
- depends on whether the start time is displayed. If the end
- time doesn't fit, then we don't draw it. */
- min_end_time_x = x1 + E_WEEK_VIEW_EVENT_L_PAD
- + E_WEEK_VIEW_EVENT_BORDER_WIDTH
- + E_WEEK_VIEW_EVENT_EDGE_X_PAD;
- if (!editing_span
- && event->start > week_view->day_starts[span->start_day]) {
- time_x = x1 + E_WEEK_VIEW_EVENT_L_PAD
- + E_WEEK_VIEW_EVENT_BORDER_WIDTH
- + E_WEEK_VIEW_EVENT_EDGE_X_PAD;
-
- clip_rect.x = x1;
- clip_rect.y = y1;
- clip_rect.width = x2 - x1 - E_WEEK_VIEW_EVENT_R_PAD
- - E_WEEK_VIEW_EVENT_BORDER_WIDTH + 1;
- clip_rect.height = y2 - y1 + 1;
- gdk_gc_set_clip_rectangle (gc, &clip_rect);
-
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_TEXT]);
-
- e_week_view_draw_time (week_view, drawable,
- time_x, time_y,
- start_hour, start_minute);
-
- gdk_gc_set_clip_rectangle (gc, NULL);
-
- /* We don't want the end time to be drawn over the
- start time, so we increase the minimum position. */
- min_end_time_x += time_width
- + E_WEEK_VIEW_EVENT_TIME_X_PAD;
- }
-
- max_icon_x = x2 + 1 - E_WEEK_VIEW_EVENT_R_PAD
- - E_WEEK_VIEW_EVENT_BORDER_WIDTH
- - E_WEEK_VIEW_EVENT_EDGE_X_PAD;
-
- if (!editing_span
- && event->end < week_view->day_starts[span->start_day
- + span->num_days]) {
- /* Calculate where the end time should be displayed. */
- time_x = x2 + 1 - E_WEEK_VIEW_EVENT_R_PAD
- - E_WEEK_VIEW_EVENT_BORDER_WIDTH
- - E_WEEK_VIEW_EVENT_EDGE_X_PAD
- - time_width;
-
- /* Draw the end time, if the position is greater than
- the minimum calculated above. */
- if (time_x >= min_end_time_x) {
- e_week_view_draw_time (week_view, drawable,
- time_x, time_y,
- end_hour, end_minute);
- max_icon_x -= time_width
- + E_WEEK_VIEW_EVENT_TIME_X_PAD;
- }
- }
-
- /* Draw the icons. */
- if (span->text_item
- && (week_view->editing_event_num != wveitem->event_num
- || week_view->editing_span_num != wveitem->span_num)) {
- icon_x = span->text_item->x1 - E_WEEK_VIEW_ICON_R_PAD - x;
- e_week_view_event_item_draw_icons (wveitem, drawable,
- icon_x, icon_y,
- max_icon_x, TRUE);
- }
- }
-}
-
-
-static void
-e_week_view_draw_time (EWeekView *week_view,
- GdkDrawable *drawable,
- gint time_x,
- gint time_y,
- gint hour,
- gint minute)
-{
- GtkStyle *style;
- GdkGC *gc;
- gint hour_to_display, suffix_width;
- gint time_y_normal_font, time_y_small_font;
- gchar buffer[128], *suffix;
- PangoLayout *layout;
- PangoFontDescription *small_font_desc;
-
- style = gtk_widget_get_style (GTK_WIDGET (week_view));
- small_font_desc = week_view->small_font_desc;
- gc = week_view->main_gc;
-
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_TEXT]);
-
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (week_view), NULL);
-
- time_y_normal_font = time_y_small_font = time_y;
- if (small_font_desc)
- time_y_small_font = time_y;
-
- e_week_view_convert_time_to_display (week_view, hour, &hour_to_display,
- &suffix, &suffix_width);
-
- if (week_view->use_small_font && week_view->small_font_desc) {
- g_snprintf (buffer, sizeof (buffer), "%2i:%02i",
- hour_to_display, minute);
-
- /* Draw the hour. */
- if (hour_to_display < 10) {
- pango_layout_set_text (layout, buffer + 1, 1);
- gdk_draw_layout (drawable, gc,
- time_x + week_view->digit_width,
- time_y_normal_font,
- layout);
- } else {
- pango_layout_set_text (layout, buffer, 2);
- gdk_draw_layout (drawable, gc,
- time_x,
- time_y_normal_font,
- layout);
- }
-
- time_x += week_view->digit_width * 2;
-
- /* Draw the start minute, in the small font. */
- pango_layout_set_font_description (layout, week_view->small_font_desc);
- pango_layout_set_text (layout, buffer + 3, 2);
- gdk_draw_layout (drawable, gc,
- time_x,
- time_y_small_font,
- layout);
-
- pango_layout_set_font_description (layout, style->font_desc);
-
- time_x += week_view->small_digit_width * 2;
-
- /* Draw the 'am'/'pm' suffix, if 12-hour format. */
- if (!e_calendar_view_get_use_24_hour_format (E_CALENDAR_VIEW (week_view))) {
- pango_layout_set_text (layout, suffix, -1);
- gdk_draw_layout (drawable, gc,
- time_x,
- time_y_normal_font,
- layout);
- }
- } else {
- /* Draw the start time in one go. */
- g_snprintf (buffer, sizeof (buffer), "%2i:%02i%s",
- hour_to_display, minute, suffix);
- if (hour_to_display < 10) {
- pango_layout_set_text (layout, buffer + 1, -1);
- gdk_draw_layout (drawable, gc,
- time_x + week_view->digit_width,
- time_y_normal_font,
- layout);
- } else {
- pango_layout_set_text (layout, buffer, -1);
- gdk_draw_layout (drawable, gc,
- time_x,
- time_y_normal_font,
- layout);
- }
-
- }
-
- g_object_unref (layout);
-}
-
-
-static void
-e_week_view_event_item_draw_icons (EWeekViewEventItem *wveitem,
- GdkDrawable *drawable,
- gint icon_x,
- gint icon_y,
- gint x2,
- gboolean right_align)
-{
- EWeekView *week_view;
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- ECalComponent *comp;
- GdkGC *gc;
- gint num_icons = 0, icon_x_inc;
- gboolean draw_reminder_icon = FALSE, draw_recurrence_icon = FALSE;
- gboolean draw_timezone_icon = FALSE, draw_attach_icon = FALSE;
- GSList *categories_list, *elem;
-
- week_view = E_WEEK_VIEW (GTK_WIDGET (GNOME_CANVAS_ITEM (wveitem)->canvas)->parent);
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- wveitem->event_num);
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- event->spans_index + wveitem->span_num);
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
- gc = week_view->main_gc;
-
- if (e_cal_component_has_alarms (comp)) {
- draw_reminder_icon = TRUE;
- num_icons++;
- }
-
- if (e_cal_component_has_recurrences (comp)) {
- draw_recurrence_icon = TRUE;
- num_icons++;
- }
-
- if (e_cal_component_has_attachments (comp)) {
- draw_attach_icon = TRUE;
- num_icons++;
- }
-
- if (event->different_timezone) {
- draw_timezone_icon = TRUE;
- num_icons++;
- }
-
- e_cal_component_get_categories_list (comp, &categories_list);
- for (elem = categories_list; elem; elem = elem->next) {
- char *category;
- GdkPixmap *pixmap = NULL;
- GdkBitmap *mask = NULL;
-
- category = (char *) elem->data;
- if (e_categories_config_get_icon_for (category, &pixmap, &mask))
- num_icons++;
- }
-
- icon_x_inc = E_WEEK_VIEW_ICON_WIDTH + E_WEEK_VIEW_ICON_X_PAD;
-
- if (right_align)
- icon_x -= icon_x_inc * num_icons;
-
- if (draw_reminder_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) {
- gdk_gc_set_clip_mask (gc, NULL);
- gdk_draw_pixbuf (drawable, gc,
- week_view->reminder_icon,
- 0, 0, icon_x, icon_y,
- E_WEEK_VIEW_ICON_WIDTH,
- E_WEEK_VIEW_ICON_HEIGHT,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- icon_x += icon_x_inc;
- }
-
- if (draw_attach_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) {
- gdk_gc_set_clip_mask (gc, NULL);
- gdk_draw_pixbuf (drawable, gc,
- week_view->attach_icon,
- 0, 0, icon_x, icon_y,
- E_WEEK_VIEW_ICON_WIDTH,
- E_WEEK_VIEW_ICON_HEIGHT,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- icon_x += icon_x_inc;
- }
-
- if (draw_recurrence_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) {
- gdk_gc_set_clip_mask (gc, NULL);
- gdk_draw_pixbuf (drawable, gc,
- week_view->recurrence_icon,
- 0, 0, icon_x, icon_y,
- E_WEEK_VIEW_ICON_WIDTH,
- E_WEEK_VIEW_ICON_HEIGHT,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- icon_x += icon_x_inc;
- }
-
- if (draw_timezone_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) {
- gdk_gc_set_clip_mask (gc, NULL);
- gdk_draw_pixbuf (drawable, gc,
- week_view->timezone_icon,
- 0, 0, icon_x, icon_y,
- E_WEEK_VIEW_ICON_WIDTH,
- E_WEEK_VIEW_ICON_HEIGHT,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- icon_x += icon_x_inc;
- }
-
- /* draw categories icons */
- for (elem = categories_list; elem; elem = elem->next) {
- char *category;
- GdkPixmap *pixmap = NULL;
- GdkBitmap *mask = NULL;
-
- category = (char *) elem->data;
- if (!e_categories_config_get_icon_for (category, &pixmap, &mask))
- continue;
-
- if (icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) {
- gdk_gc_set_clip_origin (gc, icon_x, icon_y);
- if (mask != NULL)
- gdk_gc_set_clip_mask (gc, mask);
- gdk_draw_pixmap (drawable, gc,
- pixmap,
- 0, 0, icon_x, icon_y,
- E_WEEK_VIEW_ICON_WIDTH,
- E_WEEK_VIEW_ICON_HEIGHT);
- icon_x += icon_x_inc;
- }
- gdk_pixmap_unref (pixmap);
- if (mask != NULL)
- gdk_bitmap_unref (mask);
- }
-
- e_cal_component_free_categories_list (categories_list);
-
- gdk_gc_set_clip_mask (gc, NULL);
-}
-
-
-/* This draws a little triangle to indicate that an event extends past
- the days visible on screen. */
-static void
-e_week_view_event_item_draw_triangle (EWeekViewEventItem *wveitem,
- GdkDrawable *drawable,
- gint x,
- gint y,
- gint w,
- gint h)
-{
- EWeekView *week_view;
- EWeekViewEvent *event;
- GdkGC *gc;
- GdkColor bg_color;
- GdkPoint points[3];
- gint c1, c2;
-
- week_view = E_WEEK_VIEW (GTK_WIDGET (GNOME_CANVAS_ITEM (wveitem)->canvas)->parent);
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- wveitem->event_num);
-
- gc = week_view->main_gc;
-
- points[0].x = x;
- points[0].y = y;
- points[1].x = x + w;
- points[1].y = y + (h / 2);
- points[2].x = x;
- points[2].y = y + h - 1;
-
- if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)),
- event->comp_data),
- &bg_color)) {
- GdkColormap *colormap;
-
- colormap = gtk_widget_get_colormap (GTK_WIDGET (week_view));
- if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE))
- gdk_gc_set_foreground (gc, &bg_color);
- else
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]);
- } else
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]);
-
- gdk_draw_polygon (drawable, gc, TRUE, points, 3);
-
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER]);
-
- /* If the height is odd we can use the same central point for both
- lines. If it is even we use different end-points. */
- c1 = c2 = y + (h / 2);
- if (h % 2 == 0)
- c1--;
-
- gdk_draw_line (drawable, gc, x, y, x + w, c1);
- gdk_draw_line (drawable, gc, x, y + h - 1, x + w, c2);
-}
-
-
-/* This is supposed to return the nearest item the the point and the distance.
- Since we are the only item we just return ourself and 0 for the distance.
- This is needed so that we get button/motion events. */
-static double
-e_week_view_event_item_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- *actual_item = item;
- return 0.0;
-}
-
-
-static gint
-e_week_view_event_item_event (GnomeCanvasItem *item, GdkEvent *event)
-{
- EWeekViewEventItem *wveitem;
-
- wveitem = E_WEEK_VIEW_EVENT_ITEM (item);
-
- switch (event->type) {
- case GDK_2BUTTON_PRESS:
- return e_week_view_event_item_double_click (wveitem, event);
- case GDK_BUTTON_PRESS:
- return e_week_view_event_item_button_press (wveitem, event);
- case GDK_BUTTON_RELEASE:
- return e_week_view_event_item_button_release (wveitem, event);
- case GDK_MOTION_NOTIFY:
- break;
- default:
- break;
- }
-
- return FALSE;
-}
-
-
-static gboolean
-e_week_view_event_item_button_press (EWeekViewEventItem *wveitem,
- GdkEvent *bevent)
-{
- EWeekView *week_view;
- ECalendarViewPosition pos;
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- GnomeCanvasItem *item;
-
- item = GNOME_CANVAS_ITEM (wveitem);
-
- week_view = E_WEEK_VIEW (GTK_WIDGET (item->canvas)->parent);
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), FALSE);
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- wveitem->event_num);
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- event->spans_index + wveitem->span_num);
-
-#if 0
- g_print ("In e_week_view_event_item_button_press\n");
-#endif
-
- pos = e_week_view_event_item_get_position (wveitem, bevent->button.x,
- bevent->button.y);
- if (pos == E_CALENDAR_VIEW_POS_NONE)
- return FALSE;
-
- if (bevent->button.button == 1) {
- week_view->pressed_event_num = wveitem->event_num;
- week_view->pressed_span_num = wveitem->span_num;
-
- /* Ignore clicks on the event while editing. */
- if (E_TEXT (span->text_item)->editing)
- return FALSE;
-
- /* Remember the item clicked and the mouse position,
- so we can start a drag if the mouse moves. */
- week_view->drag_event_x = bevent->button.x;
- week_view->drag_event_y = bevent->button.y;
-
- /* FIXME: Remember the day offset from the start of the event.
- */
-
- return TRUE;
- } else if (bevent->button.button == 3) {
- if (!GTK_WIDGET_HAS_FOCUS (week_view))
- gtk_widget_grab_focus (GTK_WIDGET (week_view));
-
- e_week_view_set_selected_time_range_visible (week_view, event->start, event->end);
-
- e_week_view_show_popup_menu (week_view,
- (GdkEventButton*) bevent,
- wveitem->event_num);
- gtk_signal_emit_stop_by_name (GTK_OBJECT (item->canvas),
- "button_press_event");
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-
-static gboolean
-e_week_view_event_item_button_release (EWeekViewEventItem *wveitem,
- GdkEvent *event)
-{
- EWeekView *week_view;
- GnomeCanvasItem *item;
-
- item = GNOME_CANVAS_ITEM (wveitem);
-
- week_view = E_WEEK_VIEW (GTK_WIDGET (item->canvas)->parent);
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), FALSE);
-
-#if 0
- g_print ("In e_week_view_event_item_button_release\n");
-#endif
-
- if (week_view->pressed_event_num != -1
- && week_view->pressed_event_num == wveitem->event_num
- && week_view->pressed_span_num == wveitem->span_num) {
- e_week_view_start_editing_event (week_view,
- wveitem->event_num,
- wveitem->span_num,
- NULL);
- week_view->pressed_event_num = -1;
- return TRUE;
- }
-
- week_view->pressed_event_num = -1;
-
- return FALSE;
-}
-
-
-static gboolean
-e_week_view_event_item_double_click (EWeekViewEventItem *wveitem,
- GdkEvent *bevent)
-{
- EWeekView *week_view;
- EWeekViewEvent *event;
- GnomeCanvasItem *item;
-
- item = GNOME_CANVAS_ITEM (wveitem);
-
- week_view = E_WEEK_VIEW (GTK_WIDGET (item->canvas)->parent);
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), FALSE);
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- wveitem->event_num);
-
- e_week_view_stop_editing_event (week_view);
-
- e_calendar_view_edit_appointment (E_CALENDAR_VIEW (week_view), event->comp_data->client, event->comp_data->icalcomp, FALSE);
-
- return TRUE;
-}
-
-
-static ECalendarViewPosition
-e_week_view_event_item_get_position (EWeekViewEventItem *wveitem,
- gdouble x,
- gdouble y)
-{
- EWeekView *week_view;
- GnomeCanvasItem *item;
-
- item = GNOME_CANVAS_ITEM (wveitem);
-
- week_view = E_WEEK_VIEW (GTK_WIDGET (item->canvas)->parent);
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), E_CALENDAR_VIEW_POS_NONE);
-
-#if 0
- g_print ("In e_week_view_event_item_get_position item: %g,%g %g,%g point: %g,%g\n", item->x1, item->y1, item->x2, item->y2, x, y);
-#endif
-
- if (x < item->x1 + E_WEEK_VIEW_EVENT_L_PAD
- || x >= item->x2 - E_WEEK_VIEW_EVENT_R_PAD)
- return E_CALENDAR_VIEW_POS_NONE;
-
- /* Support left/right edge for long events only. */
- if (!e_week_view_is_one_day_event (week_view, wveitem->event_num)) {
- if (x < item->x1 + E_WEEK_VIEW_EVENT_L_PAD
- + E_WEEK_VIEW_EVENT_BORDER_WIDTH
- + E_WEEK_VIEW_EVENT_EDGE_X_PAD)
- return E_CALENDAR_VIEW_POS_LEFT_EDGE;
-
- if (x >= item->x2 + 1 - E_WEEK_VIEW_EVENT_R_PAD
- - E_WEEK_VIEW_EVENT_BORDER_WIDTH
- - E_WEEK_VIEW_EVENT_EDGE_X_PAD)
- return E_CALENDAR_VIEW_POS_RIGHT_EDGE;
- }
-
- return E_CALENDAR_VIEW_POS_EVENT;
-}
diff --git a/calendar/gui/e-week-view-event-item.h b/calendar/gui/e-week-view-event-item.h
deleted file mode 100644
index 20cace0132..0000000000
--- a/calendar/gui/e-week-view-event-item.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 1999, Ximian, Inc.
- * Copyright 2001, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-#ifndef _E_WEEK_VIEW_EVENT_ITEM_H_
-#define _E_WEEK_VIEW_EVENT_ITEM_H_
-
-#include "e-week-view.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * EWeekViewEventItem - displays the background, times and icons for an event
- * in the week/month views. A separate EText canvas item is used to display &
- * edit the text.
- */
-
-#define E_WEEK_VIEW_EVENT_ITEM(obj) (GTK_CHECK_CAST((obj), \
- e_week_view_event_item_get_type (), EWeekViewEventItem))
-#define E_WEEK_VIEW_EVENT_ITEM_CLASS(k) (GTK_CHECK_CLASS_CAST ((k),\
- e_week_view_event_item_get_type ()))
-#define E_IS_WEEK_VIEW_EVENT_ITEM(o) (GTK_CHECK_TYPE((o), \
- e_week_view_event_item_get_type ()))
-
-typedef struct {
- GnomeCanvasItem canvas_item;
-
- /* The event index in the EWeekView events array. */
- gint event_num;
-
- /* The span index within the event. */
- gint span_num;
-} EWeekViewEventItem;
-
-typedef struct {
- GnomeCanvasItemClass parent_class;
-
-} EWeekViewEventItemClass;
-
-
-GtkType e_week_view_event_item_get_type (void);
-
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_WEEK_VIEW_EVENT_ITEM_H_ */
diff --git a/calendar/gui/e-week-view-layout.c b/calendar/gui/e-week-view-layout.c
deleted file mode 100644
index 4ab1cf1fd9..0000000000
--- a/calendar/gui/e-week-view-layout.c
+++ /dev/null
@@ -1,425 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 2001, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * Lays out events for the Week & Month views of the calendar. It is also
- * used for printing.
- */
-
-#include <config.h>
-
-#include "e-week-view-layout.h"
-
-
-static void e_week_view_layout_event (EWeekViewEvent *event,
- guint8 *grid,
- GArray *spans,
- GArray *old_spans,
- gboolean multi_week_view,
- gint weeks_shown,
- gboolean compress_weekend,
- gint start_weekday,
- time_t *day_starts,
- gint *rows_per_day);
-static gint e_week_view_find_day (time_t time_to_find,
- gboolean include_midnight_in_prev_day,
- gint days_shown,
- time_t *day_starts);
-static gint e_week_view_find_span_end (gboolean multi_week_view,
- gboolean compress_weekend,
- gint display_start_day,
- gint day);
-
-
-GArray*
-e_week_view_layout_events (GArray *events,
- GArray *old_spans,
- gboolean multi_week_view,
- gint weeks_shown,
- gboolean compress_weekend,
- gint start_weekday,
- time_t *day_starts,
- gint *rows_per_day)
-{
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- gint num_days, day, event_num, span_num;
- guint8 *grid;
- GArray *spans;
-
- /* This is a temporary 2-d grid which is used to place events.
- Each element is 0 if the position is empty, or 1 if occupied.
- We allocate the maximum size possible here, assuming that each
- event will need its own row. */
- grid = g_new0 (guint8, E_WEEK_VIEW_MAX_ROWS_PER_CELL * 7
- * E_WEEK_VIEW_MAX_WEEKS);
-
- /* We create a new array of spans, which will replace the old one. */
- spans = g_array_new (FALSE, FALSE, sizeof (EWeekViewEventSpan));
-
- /* Clear the number of rows used per day. */
- num_days = multi_week_view ? weeks_shown * 7 : 7;
- for (day = 0; day < num_days; day++) {
- rows_per_day[day] = 0;
- }
-
- /* Iterate over the events, finding which weeks they cover, and putting
- them in the first free row available. */
- for (event_num = 0; event_num < events->len; event_num++) {
- event = &g_array_index (events, EWeekViewEvent, event_num);
- e_week_view_layout_event (event, grid, spans, old_spans,
- multi_week_view,
- weeks_shown, compress_weekend,
- start_weekday, day_starts,
- rows_per_day);
- }
-
- /* Free the grid. */
- g_free (grid);
-
- /* Destroy the old spans array, destroying any unused canvas items. */
- if (old_spans) {
- for (span_num = 0; span_num < old_spans->len; span_num++) {
- span = &g_array_index (old_spans, EWeekViewEventSpan,
- span_num);
- if (span->background_item)
- gtk_object_destroy (GTK_OBJECT (span->background_item));
- if (span->text_item)
- gtk_object_destroy (GTK_OBJECT (span->text_item));
- }
- g_array_free (old_spans, TRUE);
- }
-
- return spans;
-}
-
-
-static void
-e_week_view_layout_event (EWeekViewEvent *event,
- guint8 *grid,
- GArray *spans,
- GArray *old_spans,
- gboolean multi_week_view,
- gint weeks_shown,
- gboolean compress_weekend,
- gint start_weekday,
- time_t *day_starts,
- gint *rows_per_day)
-{
- gint start_day, end_day, span_start_day, span_end_day, rows_per_cell;
- gint free_row, row, day, span_num, spans_index, num_spans, days_shown;
- EWeekViewEventSpan span, *old_span;
-
- days_shown = multi_week_view ? weeks_shown * 7 : 7;
- start_day = e_week_view_find_day (event->start, FALSE, days_shown,
- day_starts);
- end_day = e_week_view_find_day (event->end, TRUE, days_shown,
- day_starts);
- start_day = CLAMP (start_day, 0, days_shown - 1);
- end_day = CLAMP (end_day, 0, days_shown - 1);
-
-#if 0
- g_print ("In e_week_view_layout_event Start:%i End: %i\n",
- start_day, end_day);
-#endif
-
- /* Iterate through each of the spans of the event, where each span
- is a sequence of 1 or more days displayed next to each other. */
- span_start_day = start_day;
- rows_per_cell = E_WEEK_VIEW_MAX_ROWS_PER_CELL;
- span_num = 0;
- spans_index = spans->len;
- num_spans = 0;
- while (span_start_day <= end_day) {
- span_end_day = e_week_view_find_span_end (multi_week_view,
- compress_weekend,
- start_weekday,
- span_start_day);
- span_end_day = MIN (span_end_day, end_day);
-#if 0
- g_print (" Span start:%i end:%i\n", span_start_day,
- span_end_day);
-#endif
- /* Try each row until we find a free one or we fall off the
- bottom of the available rows. */
- row = 0;
- free_row = -1;
- while (free_row == -1 && row < rows_per_cell) {
- free_row = row;
- for (day = span_start_day; day <= span_end_day;
- day++) {
- if (grid[day * rows_per_cell + row]) {
- free_row = -1;
- break;
- }
- }
- row++;
- };
-
- if (free_row != -1) {
- /* Mark the cells as full. */
- for (day = span_start_day; day <= span_end_day;
- day++) {
- grid[day * rows_per_cell + free_row] = 1;
- rows_per_day[day] = MAX (rows_per_day[day],
- free_row + 1);
- }
-#if 0
- g_print (" Span start:%i end:%i row:%i\n",
- span_start_day, span_end_day, free_row);
-#endif
- /* Add the span to the array, and try to reuse any
- canvas items from the old spans. */
- span.start_day = span_start_day;
- span.num_days = span_end_day - span_start_day + 1;
- span.row = free_row;
- span.background_item = NULL;
- span.text_item = NULL;
- if (event->num_spans > span_num) {
- old_span = &g_array_index (old_spans, EWeekViewEventSpan, event->spans_index + span_num);
- span.background_item = old_span->background_item;
- span.text_item = old_span->text_item;
- old_span->background_item = NULL;
- old_span->text_item = NULL;
- }
-
- g_array_append_val (spans, span);
- num_spans++;
- }
-
- span_start_day = span_end_day + 1;
- span_num++;
- }
-
- /* Set the event's spans. */
- event->spans_index = spans_index;
- event->num_spans = num_spans;
-}
-
-
-/* Finds the day containing the given time.
- If include_midnight_in_prev_day is TRUE then if the time exactly
- matches the start of a day the previous day is returned. This is useful
- when calculating the end day of an event. */
-static gint
-e_week_view_find_day (time_t time_to_find,
- gboolean include_midnight_in_prev_day,
- gint days_shown,
- time_t *day_starts)
-{
- gint day;
-
- if (time_to_find < day_starts[0])
- return -1;
- if (time_to_find > day_starts[days_shown])
- return days_shown;
-
- for (day = 1; day <= days_shown; day++) {
- if (time_to_find <= day_starts[day]) {
- if (time_to_find == day_starts[day]
- && !include_midnight_in_prev_day)
- return day;
- return day - 1;
- }
- }
-
- g_assert_not_reached ();
- return days_shown;
-}
-
-
-/* This returns the last possible day in the same span as the given day.
- A span is all the days which are displayed next to each other from left to
- right. In the week view all spans are only 1 day, since Tuesday is below
- Monday rather than beside it etc. In the month view, if the weekends are not
- compressed then each week is a span, otherwise we have to break a span up
- on Saturday, use a separate span for Sunday, and start again on Monday. */
-static gint
-e_week_view_find_span_end (gboolean multi_week_view,
- gboolean compress_weekend,
- gint display_start_day,
- gint day)
-{
- gint week, col, sat_col, end_col;
-
- if (multi_week_view) {
- week = day / 7;
- col = day % 7;
-
- /* We default to the last column in the row. */
- end_col = 6;
-
- /* If the weekend is compressed we must end any spans on
- Saturday and Sunday. */
- if (compress_weekend) {
- sat_col = (5 + 7 - display_start_day) % 7;
- if (col <= sat_col)
- end_col = sat_col;
- else if (col == sat_col + 1)
- end_col = sat_col + 1;
- }
-
- return week * 7 + end_col;
- } else {
- return day;
- }
-}
-
-
-void
-e_week_view_layout_get_day_position (gint day,
- gboolean multi_week_view,
- gint weeks_shown,
- gint display_start_day,
- gboolean compress_weekend,
- gint *day_x,
- gint *day_y,
- gint *rows)
-{
- gint week, day_of_week, row, col, weekend_col, box, weekend_box;
-
- *day_x = *day_y = *rows = 0;
- g_return_if_fail (day >= 0);
-
- if (multi_week_view) {
- g_return_if_fail (day < weeks_shown * 7);
-
- week = day / 7;
- col = day % 7;
- day_of_week = (display_start_day + day) % 7;
- if (compress_weekend && day_of_week >= 5) {
- /* In the compressed view Saturday is above Sunday and
- both have just one row as opposed to 2 for all the
- other days. */
- if (day_of_week == 5) {
- *day_y = week * 2;
- *rows = 1;
- } else {
- *day_y = week * 2 + 1;
- *rows = 1;
- col--;
- }
- /* Both Saturday and Sunday are in the same column. */
- *day_x = col;
- } else {
- /* If the weekend is compressed and the day is after
- the weekend we have to move back a column. */
- if (compress_weekend) {
- /* Calculate where the weekend column is.
- Note that 5 is Saturday. */
- weekend_col = (5 + 7 - display_start_day) % 7;
- if (col > weekend_col)
- col--;
- }
-
- *day_y = week * 2;
- *rows = 2;
- *day_x = col;
- }
- } else {
- g_return_if_fail (day < 7);
-
- /* Calculate which box to place the day in, from 0-5.
- Note that in the week view the weekends are always
- compressed and share a box. */
- box = day;
- day_of_week = (display_start_day + day) % 7;
- weekend_box = (5 + 7 - display_start_day) % 7;
- if (box > weekend_box)
- box--;
-
- if (box < 3)
- *day_x = 0;
- else
- *day_x = 1;
-
- row = (box % 3) * 2;
- if (day_of_week < 5) {
- *day_y = row;
- *rows = 2;
- } else if (day_of_week == 5) {
- /* Saturday. */
- *day_y = row;
- *rows = 1;
-
- } else {
- /* Sunday. */
- *day_y = row + 1;
- *rows = 1;
- }
- }
-}
-
-
-/* Returns TRUE if the event span is visible or FALSE if it isn't.
- It also returns the number of days of the span that are visible.
- Usually this can easily be determined by the start & end days and row of
- the span, which are set in e_week_view_layout_event(). Though we need a
- special case for the weekends when they are compressed, since the span may
- not fit. */
-gboolean
-e_week_view_layout_get_span_position (EWeekViewEvent *event,
- EWeekViewEventSpan *span,
- gint rows_per_cell,
- gint rows_per_compressed_cell,
- gint display_start_day,
- gboolean multi_week_view,
- gboolean compress_weekend,
- gint *span_num_days)
-{
- gint end_day_of_week;
-
- if (span->row >= rows_per_cell)
- return FALSE;
-
- end_day_of_week = (display_start_day + span->start_day
- + span->num_days - 1) % 7;
- *span_num_days = span->num_days;
- /* Check if the row will not be visible in compressed cells. */
- if (span->row >= rows_per_compressed_cell) {
- if (multi_week_view) {
- if (compress_weekend) {
- /* If it ends on a Saturday and is 1 day long
- we skip it, else we shorten it. If it ends
- on a Sunday it must be 1 day long and we
- skip it. */
- if (end_day_of_week == 5) { /* Sat */
- if (*span_num_days == 1) {
- return FALSE;
- } else {
- (*span_num_days)--;
- }
- } else if (end_day_of_week == 6) { /* Sun */
- return FALSE;
- }
- }
- } else {
- /* All spans are 1 day long in the week view, so we
- just skip it. */
- if (end_day_of_week > 4)
- return FALSE;
- }
- }
-
- return TRUE;
-}
diff --git a/calendar/gui/e-week-view-layout.h b/calendar/gui/e-week-view-layout.h
deleted file mode 100644
index 2c6d5a29d8..0000000000
--- a/calendar/gui/e-week-view-layout.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 2001, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-#ifndef _E_WEEK_VIEW_LAYOUT_H_
-#define _E_WEEK_VIEW_LAYOUT_H_
-
-#include "e-week-view.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/* I've split these functions away from EWeekView so we can use them for
- printing. */
-
-GArray* e_week_view_layout_events (GArray *events,
- GArray *old_spans,
- gboolean multi_week_view,
- gint weeks_shown,
- gboolean compress_weekend,
- gint start_weekday,
- time_t *day_starts,
- gint *rows_per_day);
-
-/* Returns which 'cell' in the table the day appears in. Note that most days
- have a height of 2 rows, but Sat/Sun are sometimes compressed so they have
- a height of only 1 row. */
-void e_week_view_layout_get_day_position(gint day,
- gboolean multi_week_view,
- gint weeks_shown,
- gint display_start_day,
- gboolean compress_weekend,
- gint *cell_x,
- gint *cell_y,
- gint *rows);
-
-gboolean e_week_view_layout_get_span_position (EWeekViewEvent *event,
- EWeekViewEventSpan *span,
- gint rows_per_cell,
- gint rows_per_compressed_cell,
- gint display_start_day,
- gboolean multi_week_view,
- gboolean compress_weekend,
- gint *span_num_days);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_WEEK_VIEW_LAYOUT_H_ */
diff --git a/calendar/gui/e-week-view-main-item.c b/calendar/gui/e-week-view-main-item.c
deleted file mode 100644
index e33ec66e3f..0000000000
--- a/calendar/gui/e-week-view-main-item.c
+++ /dev/null
@@ -1,396 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 1999, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * EWeekViewMainItem - displays the background grid and dates for the Week and
- * Month calendar views.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include <libgnome/gnome-i18n.h>
-#include "e-week-view-main-item.h"
-#include "ea-calendar.h"
-
-static void e_week_view_main_item_set_arg (GtkObject *o,
- GtkArg *arg,
- guint arg_id);
-static void e_week_view_main_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path,
- int flags);
-static void e_week_view_main_item_draw (GnomeCanvasItem *item,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height);
-static void e_week_view_main_item_draw_day (EWeekViewMainItem *wvmitem,
- gint day,
- GDate *date,
- GdkDrawable *drawable,
- gint x,
- gint y,
- gint width,
- gint height);
-static double e_week_view_main_item_point (GnomeCanvasItem *item,
- double x,
- double y,
- int cx,
- int cy,
- GnomeCanvasItem **actual_item);
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_WEEK_VIEW
-};
-
-G_DEFINE_TYPE (EWeekViewMainItem, e_week_view_main_item, GNOME_TYPE_CANVAS_ITEM);
-
-static void
-e_week_view_main_item_class_init (EWeekViewMainItemClass *class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass *) class;
- item_class = (GnomeCanvasItemClass *) class;
-
- gtk_object_add_arg_type ("EWeekViewMainItem::week_view",
- GTK_TYPE_POINTER, GTK_ARG_WRITABLE,
- ARG_WEEK_VIEW);
-
- object_class->set_arg = e_week_view_main_item_set_arg;
-
- /* GnomeCanvasItem method overrides */
- item_class->update = e_week_view_main_item_update;
- item_class->draw = e_week_view_main_item_draw;
- item_class->point = e_week_view_main_item_point;
-
- /* init the accessibility support for e_week_view_main_item */
- e_week_view_main_item_a11y_init ();
-}
-
-
-static void
-e_week_view_main_item_init (EWeekViewMainItem *wvmitem)
-{
- wvmitem->week_view = NULL;
-}
-
-
-static void
-e_week_view_main_item_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EWeekViewMainItem *wvmitem;
-
- item = GNOME_CANVAS_ITEM (o);
- wvmitem = E_WEEK_VIEW_MAIN_ITEM (o);
-
- switch (arg_id){
- case ARG_WEEK_VIEW:
- wvmitem->week_view = GTK_VALUE_POINTER (*arg);
- break;
- }
-}
-
-
-static void
-e_week_view_main_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path,
- int flags)
-{
- if (GNOME_CANVAS_ITEM_CLASS (e_week_view_main_item_parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (e_week_view_main_item_parent_class)->update) (item, affine, clip_path, flags);
-
- /* The item covers the entire canvas area. */
- item->x1 = 0;
- item->y1 = 0;
- item->x2 = INT_MAX;
- item->y2 = INT_MAX;
-}
-
-
-/*
- * DRAWING ROUTINES - functions to paint the canvas item.
- */
-
-static void
-e_week_view_main_item_draw (GnomeCanvasItem *canvas_item,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height)
-{
- EWeekViewMainItem *wvmitem;
- EWeekView *week_view;
- GDate date;
- gint num_days, day, day_x, day_y, day_w, day_h;
-
-#if 0
- g_print ("In e_week_view_main_item_draw %i,%i %ix%i\n",
- x, y, width, height);
-#endif
-
- wvmitem = E_WEEK_VIEW_MAIN_ITEM (canvas_item);
- week_view = wvmitem->week_view;
- g_return_if_fail (week_view != NULL);
-
- /* Step through each of the days. */
- date = week_view->first_day_shown;
-
- /* If no date has been set, we just use Dec 1999/January 2000. */
- if (!g_date_valid (&date))
- g_date_set_dmy (&date, 27, 12, 1999);
-
- num_days = week_view->multi_week_view ? week_view->weeks_shown * 7 : 7;
- for (day = 0; day < num_days; day++) {
- e_week_view_get_day_position (week_view, day,
- &day_x, &day_y,
- &day_w, &day_h);
- /* Skip any days which are outside the area. */
- if (day_x < x + width && day_x + day_w >= x
- && day_y < y + height && day_y + day_h >= y) {
- e_week_view_main_item_draw_day (wvmitem, day, &date,
- drawable,
- day_x - x, day_y - y,
- day_w, day_h);
- }
- g_date_add_days (&date, 1);
- }
-}
-
-
-static void
-e_week_view_main_item_draw_day (EWeekViewMainItem *wvmitem,
- gint day,
- GDate *date,
- GdkDrawable *drawable,
- gint x,
- gint y,
- gint width,
- gint height)
-{
- EWeekView *week_view;
- GtkStyle *style;
- GdkGC *gc;
- gint right_edge, bottom_edge, date_width, date_x, line_y;
- gboolean show_day_name, show_month_name, selected;
- gchar buffer[128], *format_string;
- gint month, day_of_month, max_width;
- GdkColor *bg_color;
- PangoFontDescription *font_desc;
- PangoContext *pango_context;
- PangoFontMetrics *font_metrics;
- PangoLayout *layout;
-
-#if 0
- g_print ("Drawing Day:%i at %i,%i\n", day, x, y);
-#endif
- week_view = wvmitem->week_view;
- style = gtk_widget_get_style (GTK_WIDGET (week_view));
- gc = week_view->main_gc;
-
- /* Set up Pango prerequisites */
- font_desc = style->font_desc;
- pango_context = gtk_widget_get_pango_context (GTK_WIDGET (week_view));
- font_metrics = pango_context_get_metrics (pango_context, font_desc,
- pango_context_get_language (pango_context));
-
- g_return_if_fail (gc != NULL);
-
- month = g_date_month (date);
- day_of_month = g_date_day (date);
- line_y = y + E_WEEK_VIEW_DATE_T_PAD +
- PANGO_PIXELS (pango_font_metrics_get_ascent (font_metrics)) +
- PANGO_PIXELS (pango_font_metrics_get_descent (font_metrics)) +
- E_WEEK_VIEW_DATE_LINE_T_PAD;
-
- /* Draw the background of the day. In the month view odd months are
- one color and even months another, so you can easily see when each
- month starts (defaults are white for odd - January, March, ... and
- light gray for even). In the week view the background is always the
- same color, the color used for the odd months in the month view. */
- if (week_view->multi_week_view && (month % 2 == 0))
- bg_color = &week_view->colors[E_WEEK_VIEW_COLOR_EVEN_MONTHS];
- else
- bg_color = &week_view->colors[E_WEEK_VIEW_COLOR_ODD_MONTHS];
-
- gdk_gc_set_foreground (gc, bg_color);
- gdk_draw_rectangle (drawable, gc, TRUE, x, y, width, height);
-
- /* Draw the lines on the right and bottom of the cell. The canvas is
- sized so that the lines on the right & bottom edges will be off the
- edge of the canvas, so we don't have to worry about them. */
- right_edge = x + width - 1;
- bottom_edge = y + height - 1;
-
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_GRID]);
- gdk_draw_line (drawable, gc,
- right_edge, y, right_edge, bottom_edge);
- gdk_draw_line (drawable, gc,
- x, bottom_edge, right_edge, bottom_edge);
-
- /* If the day is selected, draw the blue background. */
- selected = TRUE;
- if (week_view->selection_start_day == -1
- || week_view->selection_start_day > day
- || week_view->selection_end_day < day)
- selected = FALSE;
- if (selected) {
- if (GTK_WIDGET_HAS_FOCUS (week_view))
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_SELECTED]);
- else
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_SELECTED_UNFOCUSSED]);
-
- if (week_view->multi_week_view) {
- gdk_draw_rectangle (drawable, gc, TRUE,
- x + 2, y + 1,
- width - 5,
- E_WEEK_VIEW_DATE_T_PAD - 1 +
- PANGO_PIXELS (pango_font_metrics_get_ascent (font_metrics)) +
- PANGO_PIXELS (pango_font_metrics_get_descent (font_metrics)));
- } else {
- gdk_draw_rectangle (drawable, gc, TRUE,
- x + 2, y + 1,
- width - 5, line_y - y);
- }
- }
-
- /* Display the date in the top of the cell.
- In the week view, display the long format "10 January" in all cells,
- or abbreviate it to "10 Jan" or "10" if that doesn't fit.
- In the month view, only use the long format for the first cell and
- the 1st of each month, otherwise use "10". */
- show_day_name = FALSE;
- show_month_name = FALSE;
- if (!week_view->multi_week_view) {
- show_day_name = TRUE;
- show_month_name = TRUE;
- } else if (day == 0 || day_of_month == 1) {
- show_month_name = TRUE;
- }
-
- /* Now find the longest form of the date that will fit. */
- max_width = width - 4;
- format_string = NULL;
- if (show_day_name) {
- if (week_view->max_day_width + week_view->digit_width * 2
- + week_view->space_width * 2
- + week_view->month_widths[month - 1] < max_width)
- /* strftime format %A = full weekday name, %d = day of
- month, %B = full month name. You can change the
- order but don't change the specifiers or add
- anything. */
- format_string = _("%A %d %B");
- else if (week_view->max_abbr_day_width
- + week_view->digit_width * 2
- + week_view->space_width * 2
- + week_view->abbr_month_widths[month - 1] < max_width)
- /* strftime format %a = abbreviated weekday name,
- %d = day of month, %b = abbreviated month name.
- You can change the order but don't change the
- specifiers or add anything. */
- format_string = _("%a %d %b");
- }
- if (!format_string && show_month_name) {
- if (week_view->digit_width * 2 + week_view->space_width
- + week_view->month_widths[month - 1] < max_width)
- /* strftime format %d = day of month, %B = full
- month name. You can change the order but don't
- change the specifiers or add anything. */
- format_string = _("%d %B");
- else if (week_view->digit_width * 2 + week_view->space_width
- + week_view->abbr_month_widths[month - 1] < max_width)
- /* strftime format %d = day of month, %b = abbreviated
- month name. You can change the order but don't
- change the specifiers or add anything. */
- format_string = _("%d %b");
- }
-
- if (selected) {
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_DATES_SELECTED]);
- } else if (week_view->multi_week_view) {
- struct icaltimetype tt;
-
- /* Check if we are drawing today */
- tt = icaltime_from_timet_with_zone (time (NULL), FALSE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
- if (g_date_year (date) == tt.year
- && g_date_month (date) == tt.month
- && g_date_day (date) == tt.day)
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_TODAY]);
- else
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_DATES]);
- } else {
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_DATES]);
- }
-
- g_date_strftime (buffer, sizeof (buffer),
- format_string ? format_string : "%d", date);
-
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (week_view), buffer);
- pango_layout_get_pixel_size (layout, &date_width, NULL);
- date_x = x + width - date_width - E_WEEK_VIEW_DATE_R_PAD;
- date_x = MAX (date_x, x + 1);
-
- gdk_draw_layout (drawable, gc,
- date_x,
- y + E_WEEK_VIEW_DATE_T_PAD,
- layout);
- g_object_unref (layout);
-
- /* Draw the line under the date. */
- if (!week_view->multi_week_view) {
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_GRID]);
- gdk_draw_line (drawable, gc,
- x + E_WEEK_VIEW_DATE_LINE_L_PAD, line_y,
- right_edge, line_y);
- }
-
- pango_font_metrics_unref (font_metrics);
-}
-
-
-
-
-/* This is supposed to return the nearest item the the point and the distance.
- Since we are the only item we just return ourself and 0 for the distance.
- This is needed so that we get button/motion events. */
-static double
-e_week_view_main_item_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- *actual_item = item;
- return 0.0;
-}
-
-
diff --git a/calendar/gui/e-week-view-main-item.h b/calendar/gui/e-week-view-main-item.h
deleted file mode 100644
index 35740479da..0000000000
--- a/calendar/gui/e-week-view-main-item.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 1999, Ximian, Inc.
- * Copyright 2001, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-#ifndef _E_WEEK_VIEW_MAIN_ITEM_H_
-#define _E_WEEK_VIEW_MAIN_ITEM_H_
-
-#include "e-week-view.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * EWeekViewMainItem - displays the background grid and dates for the Week and
- * Month calendar views.
- */
-
-#define E_WEEK_VIEW_MAIN_ITEM(obj) (GTK_CHECK_CAST((obj), \
- e_week_view_main_item_get_type (), EWeekViewMainItem))
-#define E_WEEK_VIEW_MAIN_ITEM_CLASS(k) (GTK_CHECK_CLASS_CAST ((k),\
- e_week_view_main_item_get_type ()))
-#define E_IS_WEEK_VIEW_MAIN_ITEM(o) (GTK_CHECK_TYPE((o), \
- e_week_view_main_item_get_type ()))
-
-typedef struct {
- GnomeCanvasItem canvas_item;
-
- /* The parent EWeekView widget. */
- EWeekView *week_view;
-} EWeekViewMainItem;
-
-typedef struct {
- GnomeCanvasItemClass parent_class;
-
-} EWeekViewMainItemClass;
-
-
-GtkType e_week_view_main_item_get_type (void);
-
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_WEEK_VIEW_MAIN_ITEM_H_ */
diff --git a/calendar/gui/e-week-view-titles-item.c b/calendar/gui/e-week-view-titles-item.c
deleted file mode 100644
index c688cb9025..0000000000
--- a/calendar/gui/e-week-view-titles-item.c
+++ /dev/null
@@ -1,289 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 1999, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * EWeekViewTitlesItem - displays the 'Monday', 'Tuesday' etc. at the top of
- * the Month calendar view.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include "e-week-view-titles-item.h"
-
-static void e_week_view_titles_item_set_arg (GtkObject *o,
- GtkArg *arg,
- guint arg_id);
-static void e_week_view_titles_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path,
- int flags);
-static void e_week_view_titles_item_draw (GnomeCanvasItem *item,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height);
-static double e_week_view_titles_item_point (GnomeCanvasItem *item,
- double x,
- double y,
- int cx,
- int cy,
- GnomeCanvasItem **actual_item);
-
-/* The arguments we take */
-enum {
- ARG_0,
- ARG_WEEK_VIEW
-};
-
-G_DEFINE_TYPE (EWeekViewTitlesItem, e_week_view_titles_item, GNOME_TYPE_CANVAS_ITEM);
-
-static void
-e_week_view_titles_item_class_init (EWeekViewTitlesItemClass *class)
-{
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass *) class;
- item_class = (GnomeCanvasItemClass *) class;
-
- gtk_object_add_arg_type ("EWeekViewTitlesItem::week_view",
- GTK_TYPE_POINTER, GTK_ARG_WRITABLE,
- ARG_WEEK_VIEW);
-
- object_class->set_arg = e_week_view_titles_item_set_arg;
-
- /* GnomeCanvasItem method overrides */
- item_class->update = e_week_view_titles_item_update;
- item_class->draw = e_week_view_titles_item_draw;
- item_class->point = e_week_view_titles_item_point;
-}
-
-
-static void
-e_week_view_titles_item_init (EWeekViewTitlesItem *wvtitem)
-{
- wvtitem->week_view = NULL;
-}
-
-
-static void
-e_week_view_titles_item_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
-{
- GnomeCanvasItem *item;
- EWeekViewTitlesItem *wvtitem;
-
- item = GNOME_CANVAS_ITEM (o);
- wvtitem = E_WEEK_VIEW_TITLES_ITEM (o);
-
- switch (arg_id){
- case ARG_WEEK_VIEW:
- wvtitem->week_view = GTK_VALUE_POINTER (*arg);
- break;
- }
-}
-
-
-static void
-e_week_view_titles_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path,
- int flags)
-{
- if (GNOME_CANVAS_ITEM_CLASS (e_week_view_titles_item_parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (e_week_view_titles_item_parent_class)->update) (item, affine, clip_path, flags);
-
- /* The item covers the entire canvas area. */
- item->x1 = 0;
- item->y1 = 0;
- item->x2 = INT_MAX;
- item->y2 = INT_MAX;
-}
-
-
-/*
- * DRAWING ROUTINES - functions to paint the canvas item.
- */
-
-static void
-e_week_view_titles_item_draw (GnomeCanvasItem *canvas_item,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height)
-{
- EWeekViewTitlesItem *wvtitem;
- EWeekView *week_view;
- GtkStyle *style;
- GdkGC *fg_gc, *bg_gc, *light_gc, *dark_gc;
- gint canvas_width, canvas_height, col_width, col, date_width, date_x;
- gchar buffer[128], *date_format;
- GDate date;
- GdkRectangle clip_rect;
- gboolean long_format;
- gint weekday;
- PangoLayout *layout;
-
-#if 0
- g_print ("In e_week_view_titles_item_draw %i,%i %ix%i\n",
- x, y, width, height);
-#endif
-
- wvtitem = E_WEEK_VIEW_TITLES_ITEM (canvas_item);
- week_view = wvtitem->week_view;
- g_return_if_fail (week_view != NULL);
-
- style = gtk_widget_get_style (GTK_WIDGET (week_view));
- fg_gc = style->fg_gc[GTK_STATE_NORMAL];
- bg_gc = style->bg_gc[GTK_STATE_NORMAL];
- light_gc = style->light_gc[GTK_STATE_NORMAL];
- dark_gc = style->dark_gc[GTK_STATE_NORMAL];
- canvas_width = GTK_WIDGET (canvas_item->canvas)->allocation.width;
- canvas_height = GTK_WIDGET (canvas_item->canvas)->allocation.height;
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (week_view), NULL);
-
- /* Draw the shadow around the dates. */
- gdk_draw_line (drawable, light_gc,
- 1 - x, 1 - y,
- canvas_width - 2 - x, 1 - y);
- gdk_draw_line (drawable, light_gc,
- 1 - x, 2 - y,
- 1 - x, canvas_height - 1 - y);
-
- gdk_draw_rectangle (drawable, dark_gc, FALSE,
- 0 - x, 0 - y,
- canvas_width - 1, canvas_height);
-
- /* Determine the format to use. */
- col_width = canvas_width / week_view->columns;
- if (col_width > week_view->max_day_width + 2) {
- date_format = "%A";
- long_format = TRUE;
- } else {
- date_format = "%a";
- long_format = FALSE;
- }
-
- /* Shift right one pixel to account for the shadow around the main
- canvas. */
- x--;
-
- /* Draw the date. Set a clipping rectangle so we don't draw over the
- next day. */
- g_date_clear (&date, 1);
- /* Note that 20th March 2000 is a Monday. We only care about the
- weekday. */
- weekday = week_view->display_start_day;
- g_date_set_dmy (&date, 20 + weekday, 3, 2000);
- for (col = 0; col < week_view->columns; col++) {
- if (weekday == 5 && week_view->compress_weekend) {
- g_date_strftime (buffer, 128, "%a/", &date);
- g_date_add_days (&date, 1);
- g_date_strftime (buffer + strlen (buffer), 100,
- "%a", &date);
- } else {
- g_date_strftime (buffer, 128, date_format, &date);
- }
-
- clip_rect.x = week_view->col_offsets[col] - x;
- clip_rect.y = 2 - y;
- clip_rect.width = week_view->col_widths[col];
- clip_rect.height = canvas_height - 2;
- gdk_gc_set_clip_rectangle (fg_gc, &clip_rect);
-
- if (weekday == 5 && week_view->compress_weekend)
- date_width = week_view->abbr_day_widths[5]
- + week_view->slash_width
- + week_view->abbr_day_widths[6];
- else if (long_format)
- date_width = week_view->day_widths[weekday];
- else
- date_width = week_view->abbr_day_widths[weekday];
-
- date_x = week_view->col_offsets[col]
- + (week_view->col_widths[col] - date_width) / 2;
- date_x = MAX (date_x, week_view->col_offsets[col]);
-
- pango_layout_set_text (layout, buffer, -1);
- gdk_draw_layout (drawable, fg_gc,
- date_x - x,
- 3 - y,
- layout);
-
- gdk_gc_set_clip_rectangle (fg_gc, NULL);
-
- /* Draw the lines down the left and right of the date cols. */
- if (col != 0) {
- gdk_draw_line (drawable, light_gc,
- week_view->col_offsets[col] - x,
- 4 - y,
- week_view->col_offsets[col] - x,
- canvas_height - 4 - y);
-
- gdk_draw_line (drawable, dark_gc,
- week_view->col_offsets[col] - 1 - x,
- 4 - y,
- week_view->col_offsets[col] - 1 - x,
- canvas_height - 4 - y);
- }
-
- /* Draw the lines between each column. */
- if (col != 0) {
- gdk_draw_line (drawable, style->black_gc,
- week_view->col_offsets[col] - x,
- canvas_height - y,
- week_view->col_offsets[col] - x,
- canvas_height - y);
- }
-
- if (weekday == 5 && week_view->compress_weekend)
- weekday += 2;
- else
- weekday++;
-
- weekday = weekday % 7;
-
- g_date_add_days (&date, 1);
- }
-
- g_object_unref (layout);
-}
-
-
-/* This is supposed to return the nearest item the the point and the distance.
- Since we are the only item we just return ourself and 0 for the distance.
- This is needed so that we get button/motion events. */
-static double
-e_week_view_titles_item_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- *actual_item = item;
- return 0.0;
-}
-
-
diff --git a/calendar/gui/e-week-view-titles-item.h b/calendar/gui/e-week-view-titles-item.h
deleted file mode 100644
index 77fed506c8..0000000000
--- a/calendar/gui/e-week-view-titles-item.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 1999, Ximian, Inc.
- * Copyright 2001, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-#ifndef _E_WEEK_VIEW_TITLES_ITEM_H_
-#define _E_WEEK_VIEW_TITLES_ITEM_H_
-
-#include "e-week-view.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * EWeekViewTitlesItem - displays the 'Monday', 'Tuesday' etc. at the top of
- * the Month calendar view.
- */
-
-#define E_WEEK_VIEW_TITLES_ITEM(obj) (GTK_CHECK_CAST((obj), \
- e_week_view_titles_item_get_type (), EWeekViewTitlesItem))
-#define E_WEEK_VIEW_TITLES_ITEM_CLASS(k) (GTK_CHECK_CLASS_CAST ((k),\
- e_week_view_titles_item_get_type ()))
-#define E_IS_WEEK_VIEW_TITLES_ITEM(o) (GTK_CHECK_TYPE((o), \
- e_week_view_titles_item_get_type ()))
-
-typedef struct {
- GnomeCanvasItem canvas_item;
-
- /* The parent EWeekView widget. */
- EWeekView *week_view;
-} EWeekViewTitlesItem;
-
-typedef struct {
- GnomeCanvasItemClass parent_class;
-
-} EWeekViewTitlesItemClass;
-
-
-GtkType e_week_view_titles_item_get_type (void);
-
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_WEEK_VIEW_TITLES_ITEM_H_ */
diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c
deleted file mode 100644
index d829675624..0000000000
--- a/calendar/gui/e-week-view.c
+++ /dev/null
@@ -1,4078 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Authors :
- * Damon Chaplin <damon@ximian.com>
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 1999, Ximian, Inc.
- * Copyright 2001, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*
- * EWeekView - displays the Week & Month views of the calendar.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-week-view.h"
-#include "ea-calendar.h"
-
-#include <math.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtkselection.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkvscrollbar.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtkmain.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnome/gnome-exec.h>
-#include <libgnome/gnome-util.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <libgnomecanvas/gnome-canvas-pixbuf.h>
-#include <gal/e-text/e-text.h>
-#include <gal/widgets/e-canvas-utils.h>
-#include <gal/widgets/e-gui-utils.h>
-#include <gal/widgets/e-unicode.h>
-#include <e-util/e-categories-config.h>
-#include <e-util/e-dialog-utils.h>
-#include "dialogs/delete-comp.h"
-#include "dialogs/delete-error.h"
-#include "dialogs/send-comp.h"
-#include "dialogs/cancel-comp.h"
-#include "dialogs/recur-comp.h"
-#include "comp-util.h"
-#include "itip-utils.h"
-#include <libecal/e-cal-time-util.h>
-#include "calendar-commands.h"
-#include "calendar-config.h"
-#include "print.h"
-#include "goto.h"
-#include "e-cal-model-calendar.h"
-#include "e-week-view-event-item.h"
-#include "e-week-view-layout.h"
-#include "e-week-view-main-item.h"
-#include "e-week-view-titles-item.h"
-#include "misc.h"
-#include <e-util/e-icon-factory.h>
-
-/* Images */
-#include "art/jump.xpm"
-
-#define E_WEEK_VIEW_SMALL_FONT_PTSIZE 7
-
-#define E_WEEK_VIEW_JUMP_BUTTON_WIDTH 16
-#define E_WEEK_VIEW_JUMP_BUTTON_HEIGHT 8
-
-#define E_WEEK_VIEW_JUMP_BUTTON_X_PAD 3
-#define E_WEEK_VIEW_JUMP_BUTTON_Y_PAD 3
-
-#define E_WEEK_VIEW_JUMP_BUTTON_NO_FOCUS -1
-
-/* The timeout before we do a layout, so we don't do a layout for each event
- we get from the server. */
-#define E_WEEK_VIEW_LAYOUT_TIMEOUT 100
-
-typedef struct {
- EWeekView *week_view;
- ECalModelComponent *comp_data;
-} AddEventData;
-
-static void e_week_view_destroy (GtkObject *object);
-static void e_week_view_realize (GtkWidget *widget);
-static void e_week_view_set_colors(EWeekView *week_view, GtkWidget *widget);
-static void e_week_view_unrealize (GtkWidget *widget);
-static void e_week_view_style_set (GtkWidget *widget,
- GtkStyle *previous_style);
-static void e_week_view_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static void e_week_view_recalc_cell_sizes (EWeekView *week_view);
-static gint e_week_view_focus_in (GtkWidget *widget,
- GdkEventFocus *event);
-static gint e_week_view_focus_out (GtkWidget *widget,
- GdkEventFocus *event);
-static gint e_week_view_expose_event (GtkWidget *widget,
- GdkEventExpose *event);
-static gboolean e_week_view_get_next_tab_event (EWeekView *week_view,
- GtkDirectionType direction,
- gint current_event_num,
- gint current_span_num,
- gint *next_event_num,
- gint *next_span_num);
-static gboolean e_week_view_focus (GtkWidget *widget,
- GtkDirectionType direction);
-static GList *e_week_view_get_selected_events (ECalendarView *cal_view);
-static gboolean e_week_view_get_selected_time_range (ECalendarView *cal_view, time_t *start_time, time_t *end_time);
-static void e_week_view_set_selected_time_range (ECalendarView *cal_view, time_t start_time, time_t end_time);
-static gboolean e_week_view_get_visible_time_range (ECalendarView *cal_view, time_t *start_time, time_t *end_time);
-static void e_week_view_update_query (EWeekView *week_view);
-static void e_week_view_draw_shadow (EWeekView *week_view);
-
-static gboolean e_week_view_on_button_press (GtkWidget *widget,
- GdkEventButton *event,
- EWeekView *week_view);
-static gboolean e_week_view_on_button_release (GtkWidget *widget,
- GdkEventButton *event,
- EWeekView *week_view);
-static gboolean e_week_view_on_scroll (GtkWidget *widget,
- GdkEventScroll *scroll,
- EWeekView *week_view);
-static gboolean e_week_view_on_motion (GtkWidget *widget,
- GdkEventMotion *event,
- EWeekView *week_view);
-static gint e_week_view_convert_position_to_day (EWeekView *week_view,
- gint x,
- gint y);
-static void e_week_view_update_selection (EWeekView *week_view,
- gint day);
-
-static void e_week_view_free_events (EWeekView *week_view);
-static gboolean e_week_view_add_event (ECalComponent *comp,
- time_t start,
- time_t end,
- gboolean prepend,
- gpointer data);
-static void e_week_view_check_layout (EWeekView *week_view);
-static void e_week_view_ensure_events_sorted (EWeekView *week_view);
-static void e_week_view_reshape_events (EWeekView *week_view);
-static void e_week_view_reshape_event_span (EWeekView *week_view,
- gint event_num,
- gint span_num);
-static void e_week_view_recalc_day_starts (EWeekView *week_view,
- time_t lower);
-static void e_week_view_on_editing_started (EWeekView *week_view,
- GnomeCanvasItem *item);
-static void e_week_view_on_editing_stopped (EWeekView *week_view,
- GnomeCanvasItem *item);
-static gboolean e_week_view_find_event_from_uid (EWeekView *week_view,
- ECal *client,
- const gchar *uid,
- const gchar *rid,
- gint *event_num_return);
-typedef gboolean (* EWeekViewForeachEventCallback) (EWeekView *week_view,
- gint event_num,
- gpointer data);
-static void e_week_view_foreach_event (EWeekView *week_view,
- EWeekViewForeachEventCallback callback,
- gpointer data);
-static void e_week_view_foreach_event_with_uid (EWeekView *week_view,
- const gchar *uid,
- EWeekViewForeachEventCallback callback,
- gpointer data);
-static gboolean e_week_view_on_text_item_event (GnomeCanvasItem *item,
- GdkEvent *event,
- EWeekView *week_view);
-static gboolean e_week_view_event_move (ECalendarView *cal_view, ECalViewMoveDirection direction);
-static gint e_week_view_get_day_offset_of_event (EWeekView *week_view, time_t event_time);
-static void e_week_view_scroll_a_step (EWeekView *week_view, ECalViewMoveDirection direction);
-static void e_week_view_change_event_time (EWeekView *week_view, time_t start_dt, time_t end_dt, gboolean is_all_day);
-static gboolean e_week_view_on_jump_button_event (GnomeCanvasItem *item,
- GdkEvent *event,
- EWeekView *week_view);
-static gboolean e_week_view_key_press (GtkWidget *widget, GdkEventKey *event);
-static gboolean e_week_view_do_key_press (GtkWidget *widget,
- GdkEventKey *event);
-static void e_week_view_move_selection_day (EWeekView *week_view, ECalViewMoveDirection direction);
-static gint e_week_view_get_adjust_days_for_move_up (EWeekView *week_view, gint
-current_day);
-static gint e_week_view_get_adjust_days_for_move_down (EWeekView *week_view,gint current_day);
-static gint e_week_view_get_adjust_days_for_move_left (EWeekView *week_view,gint current_day);
-static gint e_week_view_get_adjust_days_for_move_right (EWeekView *week_view,gint current_day);
-static gboolean e_week_view_popup_menu (GtkWidget *widget);
-
-static gboolean e_week_view_update_event_cb (EWeekView *week_view,
- gint event_num,
- gpointer data);
-static gboolean e_week_view_remove_event_cb (EWeekView *week_view,
- gint event_num,
- gpointer data);
-static gboolean e_week_view_recalc_display_start_day (EWeekView *week_view);
-
-static void e_week_view_queue_layout (EWeekView *week_view);
-static void e_week_view_cancel_layout (EWeekView *week_view);
-static gboolean e_week_view_layout_timeout_cb (gpointer data);
-
-G_DEFINE_TYPE (EWeekView, e_week_view, E_TYPE_CALENDAR_VIEW);
-
-static void
-e_week_view_class_init (EWeekViewClass *class)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- ECalendarViewClass *view_class;
-
- object_class = (GtkObjectClass *) class;
- widget_class = (GtkWidgetClass *) class;
- view_class = (ECalendarViewClass *) class;
-
- /* Method override */
- object_class->destroy = e_week_view_destroy;
-
- widget_class->realize = e_week_view_realize;
- widget_class->unrealize = e_week_view_unrealize;
- widget_class->style_set = e_week_view_style_set;
- widget_class->size_allocate = e_week_view_size_allocate;
- widget_class->focus_in_event = e_week_view_focus_in;
- widget_class->focus_out_event = e_week_view_focus_out;
- widget_class->key_press_event = e_week_view_key_press;
- widget_class->popup_menu = e_week_view_popup_menu;
- widget_class->expose_event = e_week_view_expose_event;
- widget_class->focus = e_week_view_focus;
-
- view_class->get_selected_events = e_week_view_get_selected_events;
- view_class->get_selected_time_range = e_week_view_get_selected_time_range;
- view_class->set_selected_time_range = e_week_view_set_selected_time_range;
- view_class->get_visible_time_range = e_week_view_get_visible_time_range;
-
- /* init the accessibility support for e_week_view */
- e_week_view_a11y_init ();
-}
-
-static void
-time_range_changed_cb (ECalModel *model, time_t start_time, time_t end_time, gpointer user_data)
-{
- EWeekView *week_view = E_WEEK_VIEW (user_data);
- GDate date, base_date;
- gint day_offset, weekday, week_start_offset;
- gboolean update_adjustment_value = FALSE;
-
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
- time_to_gdate_with_zone (&date, start_time, e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
-
- /* Calculate the weekday of the given date, 0 = Mon. */
- weekday = g_date_weekday (&date) - 1;
-
- /* Convert it to an offset from the start of the display. */
- week_start_offset = (weekday + 7 - week_view->display_start_day) % 7;
-
- /* Set the day_offset to the result, so we move back to the
- start of the week. */
- day_offset = week_start_offset;
-
- /* Calculate the base date, i.e. the first day shown when the
- scrollbar adjustment value is 0. */
- base_date = date;
- g_date_subtract_days (&base_date, day_offset);
-
- /* See if we need to update the base date. */
- if (!g_date_valid (&week_view->base_date)
- || week_view->update_base_date) {
- week_view->base_date = base_date;
- update_adjustment_value = TRUE;
- }
-
- /* See if we need to update the first day shown. */
- if (!g_date_valid (&week_view->first_day_shown)
- || g_date_compare (&week_view->first_day_shown, &base_date)) {
- week_view->first_day_shown = base_date;
- start_time = time_add_day_with_zone (start_time, -day_offset,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
- start_time = time_day_begin_with_zone (start_time,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
- e_week_view_recalc_day_starts (week_view, start_time);
- }
-
- /* Reset the adjustment value to 0 if the base address has changed.
- Note that we do this after updating first_day_shown so that our
- signal handler will not try to reload the events. */
- if (update_adjustment_value)
- gtk_adjustment_set_value (GTK_RANGE (week_view->vscrollbar)->adjustment, 0);
-
- gtk_widget_queue_draw (week_view->main_canvas);
-
- /* FIXME Preserve selection if possible */
- if (week_view->selection_start_day == -1 ||
- (week_view->multi_week_view ? week_view->weeks_shown * 7 : 7) <= week_view->selection_start_day)
- e_week_view_set_selected_time_range (E_CALENDAR_VIEW (week_view), start_time, start_time);
-}
-
-static void
-process_component (EWeekView *week_view, ECalModelComponent *comp_data)
-{
- gint num_days;
- ECalComponent *comp = NULL;
- AddEventData add_event_data;
- const char *uid, *rid;
-
- /* If we don't have a valid date set yet, just return. */
- if (!g_date_valid (&week_view->first_day_shown))
- return;
-
- comp = e_cal_component_new ();
- if (!e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp))) {
- g_object_unref (comp);
-
- g_message (G_STRLOC ": Could not set icalcomponent on ECalComponent");
- return;
- }
-
- e_cal_component_get_uid (comp, &uid);
- if (e_cal_component_is_instance (comp))
- rid = e_cal_component_get_recurid_as_string (comp);
- else
- rid = NULL;
-
- /* Add the object */
- num_days = week_view->multi_week_view ? week_view->weeks_shown * 7 : 7;
-
- add_event_data.week_view = week_view;
- add_event_data.comp_data = comp_data;
- e_week_view_add_event (comp, comp_data->instance_start, comp_data->instance_end, FALSE, &add_event_data);
-
- g_object_unref (comp);
-}
-
-static void
-update_row (EWeekView *week_view, int row)
-{
- ECalModelComponent *comp_data;
- ECalModel *model;
-
- model = e_calendar_view_get_model (E_CALENDAR_VIEW (week_view));
- comp_data = e_cal_model_get_component_at (model, row);
- g_assert (comp_data != NULL);
- process_component (week_view, comp_data);
-
- gtk_widget_queue_draw (week_view->main_canvas);
- e_week_view_queue_layout (week_view);
-}
-
-static void
-model_row_changed_cb (ETableModel *etm, int row, gpointer user_data)
-{
- EWeekView *week_view = E_WEEK_VIEW (user_data);
-
- update_row (week_view, row);
-}
-
-static void
-model_cell_changed_cb (ETableModel *etm, int col, int row, gpointer user_data)
-{
- EWeekView *week_view = E_WEEK_VIEW (user_data);
-
- update_row (week_view, row);
-}
-
-static void
-model_rows_inserted_cb (ETableModel *etm, int row, int count, gpointer user_data)
-{
- EWeekView *week_view = E_WEEK_VIEW (user_data);
- ECalModel *model;
- int i;
-
- model = e_calendar_view_get_model (E_CALENDAR_VIEW (week_view));
-
- for (i = 0; i < count; i++) {
- ECalModelComponent *comp_data;
-
- comp_data = e_cal_model_get_component_at (model, row + i);
- g_assert (comp_data != NULL);
- process_component (week_view, comp_data);
- }
-
- gtk_widget_queue_draw (week_view->main_canvas);
- e_week_view_queue_layout (week_view);
-}
-
-static void
-model_rows_deleted_cb (ETableModel *etm, int row, int count, gpointer user_data)
-{
- EWeekView *week_view = E_WEEK_VIEW (user_data);
- int i;
-
- /* FIXME Stop editing? */
-
- for (i = row + count; i > row; i--) {
- gint event_num;
- const char *uid, *rid = NULL;
- ECalModelComponent *comp_data;
-
- comp_data = e_cal_model_get_component_at (E_CAL_MODEL (etm), i - 1);
- if (!comp_data)
- continue;
-
- uid = icalcomponent_get_uid (comp_data->icalcomp);
- if (e_cal_util_component_is_instance (comp_data->icalcomp)) {
- icalproperty *prop;
-
- prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_RECURRENCEID_PROPERTY);
- if (prop)
- rid = icaltime_as_ical_string (icalcomponent_get_recurrenceid (comp_data->icalcomp));
- }
-
- if (e_week_view_find_event_from_uid (week_view, comp_data->client, uid, rid, &event_num))
- e_week_view_remove_event_cb (week_view, event_num, NULL);
- }
-
- gtk_widget_queue_draw (week_view->main_canvas);
- e_week_view_queue_layout (week_view);
-}
-
-static void
-timezone_changed_cb (ECalendarView *cal_view, icaltimezone *old_zone,
- icaltimezone *new_zone, gpointer user_data)
-{
- struct icaltimetype tt = icaltime_null_time ();
- time_t lower;
- EWeekView *week_view = (EWeekView *) cal_view;
-
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
- /* If we don't have a valid date set yet, just return. */
- if (!g_date_valid (&week_view->first_day_shown))
- return;
-
- /* Recalculate the new start of the first week. We just use exactly
- the same time, but with the new timezone. */
- tt.year = g_date_year (&week_view->first_day_shown);
- tt.month = g_date_month (&week_view->first_day_shown);
- tt.day = g_date_day (&week_view->first_day_shown);
-
- lower = icaltime_as_timet_with_zone (tt, new_zone);
-
- e_week_view_recalc_day_starts (week_view, lower);
- e_week_view_update_query (week_view);
-}
-
-static void
-e_week_view_init (EWeekView *week_view)
-{
- GnomeCanvasGroup *canvas_group;
- GtkObject *adjustment;
- GdkPixbuf *pixbuf;
- ECalModel *model;
- gint i;
-
- GTK_WIDGET_SET_FLAGS (week_view, GTK_CAN_FOCUS);
-
- week_view->query = NULL;
-
- week_view->events = g_array_new (FALSE, FALSE,
- sizeof (EWeekViewEvent));
- week_view->events_sorted = TRUE;
- week_view->events_need_layout = FALSE;
- week_view->events_need_reshape = FALSE;
-
- week_view->layout_timeout_id = 0;
-
- week_view->spans = NULL;
-
- week_view->multi_week_view = FALSE;
- week_view->update_base_date = TRUE;
- week_view->weeks_shown = 6;
- week_view->rows = 6;
- week_view->columns = 2;
- week_view->compress_weekend = TRUE;
- week_view->show_event_end_times = TRUE;
- week_view->week_start_day = 0; /* Monday. */
- week_view->display_start_day = 0; /* Monday. */
-
- g_date_clear (&week_view->base_date, 1);
- g_date_clear (&week_view->first_day_shown, 1);
-
- week_view->row_height = 10;
- week_view->rows_per_cell = 1;
-
- week_view->selection_start_day = -1;
- week_view->selection_drag_pos = E_WEEK_VIEW_DRAG_NONE;
-
- week_view->pressed_event_num = -1;
- week_view->editing_event_num = -1;
-
- week_view->last_edited_comp_string = NULL;
-
- week_view->main_gc = NULL;
-
- /* Create the small font. */
- week_view->use_small_font = TRUE;
-
- week_view->small_font_desc =
- pango_font_description_copy (gtk_widget_get_style (GTK_WIDGET (week_view))->font_desc);
- pango_font_description_set_size (week_view->small_font_desc,
- E_WEEK_VIEW_SMALL_FONT_PTSIZE * PANGO_SCALE);
-
- /* String to use in 12-hour time format for times in the morning. */
- week_view->am_string = _("am");
-
- /* String to use in 12-hour time format for times in the afternoon. */
- week_view->pm_string = _("pm");
-
-
- /*
- * Titles Canvas. Note that we don't show it is only shown in the
- * Month view.
- */
- week_view->titles_canvas = e_canvas_new ();
- gtk_table_attach (GTK_TABLE (week_view), week_view->titles_canvas,
- 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
-
- canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (week_view->titles_canvas)->root);
-
- week_view->titles_canvas_item =
- gnome_canvas_item_new (canvas_group,
- e_week_view_titles_item_get_type (),
- "EWeekViewTitlesItem::week_view", week_view,
- NULL);
-
- /*
- * Main Canvas
- */
- week_view->main_canvas = e_canvas_new ();
- gtk_table_attach (GTK_TABLE (week_view), week_view->main_canvas,
- 1, 2, 1, 2,
- GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 1, 1);
- gtk_widget_show (week_view->main_canvas);
-
- canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (week_view->main_canvas)->root);
-
- week_view->main_canvas_item =
- gnome_canvas_item_new (canvas_group,
- e_week_view_main_item_get_type (),
- "EWeekViewMainItem::week_view", week_view,
- NULL);
-
- g_signal_connect_after (week_view->main_canvas, "button_press_event",
- G_CALLBACK (e_week_view_on_button_press), week_view);
- g_signal_connect (week_view->main_canvas, "button_release_event",
- G_CALLBACK (e_week_view_on_button_release), week_view);
- g_signal_connect (week_view->main_canvas, "scroll_event",
- G_CALLBACK (e_week_view_on_scroll), week_view);
- g_signal_connect (week_view->main_canvas, "motion_notify_event",
- G_CALLBACK (e_week_view_on_motion), week_view);
-
- /* Create the buttons to jump to each days. */
- pixbuf = gdk_pixbuf_new_from_xpm_data ((const char**) jump_xpm);
-
- for (i = 0; i < E_WEEK_VIEW_MAX_WEEKS * 7; i++) {
- week_view->jump_buttons[i] = gnome_canvas_item_new
- (canvas_group,
- gnome_canvas_pixbuf_get_type (),
- "GnomeCanvasPixbuf::pixbuf", pixbuf,
- NULL);
-
- g_signal_connect (week_view->jump_buttons[i], "event",
- G_CALLBACK (e_week_view_on_jump_button_event), week_view);
- }
- week_view->focused_jump_button = E_WEEK_VIEW_JUMP_BUTTON_NO_FOCUS;
-
- gdk_pixbuf_unref (pixbuf);
-
- /*
- * Scrollbar.
- */
- adjustment = gtk_adjustment_new (0, -52, 52, 1, 1, 1);
-
- week_view->vscrollbar = gtk_vscrollbar_new (GTK_ADJUSTMENT (adjustment));
- gtk_table_attach (GTK_TABLE (week_view), week_view->vscrollbar,
- 2, 3, 1, 2, 0, GTK_EXPAND | GTK_FILL, 0, 0);
- gtk_widget_show (week_view->vscrollbar);
-
- /* Create the cursors. */
- week_view->normal_cursor = gdk_cursor_new (GDK_LEFT_PTR);
- week_view->move_cursor = gdk_cursor_new (GDK_FLEUR);
- week_view->resize_width_cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
- week_view->last_cursor_set = NULL;
-
- /* Get the model */
- model = e_calendar_view_get_model (E_CALENDAR_VIEW (week_view));
-
- /* connect to ECalModel's signals */
- g_signal_connect (G_OBJECT (model), "time_range_changed",
- G_CALLBACK (time_range_changed_cb), week_view);
- g_signal_connect (G_OBJECT (model), "model_row_changed",
- G_CALLBACK (model_row_changed_cb), week_view);
- g_signal_connect (G_OBJECT (model), "model_cell_changed",
- G_CALLBACK (model_cell_changed_cb), week_view);
- g_signal_connect (G_OBJECT (model), "model_rows_inserted",
- G_CALLBACK (model_rows_inserted_cb), week_view);
- g_signal_connect (G_OBJECT (model), "model_rows_deleted",
- G_CALLBACK (model_rows_deleted_cb), week_view);
-
- /* connect to ECalendarView's signals */
- g_signal_connect (G_OBJECT (week_view), "timezone_changed",
- G_CALLBACK (timezone_changed_cb), NULL);
-}
-
-
-/**
- * e_week_view_new:
- * @Returns: a new #EWeekView.
- *
- * Creates a new #EWeekView.
- **/
-GtkWidget *
-e_week_view_new (void)
-{
- GtkWidget *week_view;
-
- week_view = GTK_WIDGET (g_object_new (e_week_view_get_type (), NULL));
- e_cal_model_set_flags (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)), E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES);
-
- return week_view;
-}
-
-
-static void
-e_week_view_destroy (GtkObject *object)
-{
- EWeekView *week_view;
-
- week_view = E_WEEK_VIEW (object);
-
- e_week_view_cancel_layout (week_view);
-
- if (week_view->events) {
- e_week_view_free_events (week_view);
- g_array_free (week_view->events, TRUE);
- week_view->events = NULL;
- }
-
- if (week_view->query) {
- g_signal_handlers_disconnect_matched (week_view->query, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, week_view);
- g_object_unref (week_view->query);
- week_view->query = NULL;
- }
-
- if (week_view->small_font_desc) {
- pango_font_description_free (week_view->small_font_desc);
- week_view->small_font_desc = NULL;
- }
-
- if (week_view->normal_cursor) {
- gdk_cursor_unref (week_view->normal_cursor);
- week_view->normal_cursor = NULL;
- }
- if (week_view->move_cursor) {
- gdk_cursor_unref (week_view->move_cursor);
- week_view->move_cursor = NULL;
- }
- if (week_view->resize_width_cursor) {
- gdk_cursor_unref (week_view->resize_width_cursor);
- week_view->resize_width_cursor = NULL;
- }
-
- GTK_OBJECT_CLASS (e_week_view_parent_class)->destroy (object);
-}
-
-
-static void
-e_week_view_realize (GtkWidget *widget)
-{
- EWeekView *week_view;
- GdkColormap *colormap;
- gboolean success[E_WEEK_VIEW_COLOR_LAST];
- gint nfailed;
-
- if (GTK_WIDGET_CLASS (e_week_view_parent_class)->realize)
- (*GTK_WIDGET_CLASS (e_week_view_parent_class)->realize)(widget);
-
- week_view = E_WEEK_VIEW (widget);
- week_view->main_gc = gdk_gc_new (widget->window);
-
- colormap = gtk_widget_get_colormap (widget);
-
- /* Allocate the colors. */
- e_week_view_set_colors(week_view, widget);
-
- gdk_gc_set_colormap (week_view->main_gc, colormap);
-
- /* Create the pixmaps. */
- week_view->reminder_icon = e_icon_factory_get_icon ("stock_bell", E_ICON_SIZE_MENU);
- week_view->recurrence_icon = e_icon_factory_get_icon ("stock_refresh", E_ICON_SIZE_MENU);
- week_view->timezone_icon = e_icon_factory_get_icon ("stock_timezone", E_ICON_SIZE_MENU);
- week_view->attach_icon = e_icon_factory_get_icon ("stock_attach", E_ICON_SIZE_MENU);
-}
-
-static void
-e_week_view_set_colors(EWeekView *week_view, GtkWidget *widget)
-{
- week_view->colors[E_WEEK_VIEW_COLOR_EVEN_MONTHS] = widget->style->base[GTK_STATE_INSENSITIVE];
- week_view->colors[E_WEEK_VIEW_COLOR_ODD_MONTHS] = widget->style->base[GTK_STATE_NORMAL];
- week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND] = widget->style->base[GTK_STATE_NORMAL];
- week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER] = widget->style->dark[GTK_STATE_NORMAL];
- week_view->colors[E_WEEK_VIEW_COLOR_EVENT_TEXT] = widget->style->text[GTK_STATE_NORMAL];
- week_view->colors[E_WEEK_VIEW_COLOR_GRID] = widget->style->dark[GTK_STATE_NORMAL];
- week_view->colors[E_WEEK_VIEW_COLOR_SELECTED] = widget->style->base[GTK_STATE_SELECTED];
- week_view->colors[E_WEEK_VIEW_COLOR_SELECTED_UNFOCUSSED] = widget->style->bg[GTK_STATE_SELECTED];
- week_view->colors[E_WEEK_VIEW_COLOR_DATES] = widget->style->text[GTK_STATE_NORMAL];
- week_view->colors[E_WEEK_VIEW_COLOR_DATES_SELECTED] = widget->style->text[GTK_STATE_SELECTED];
- week_view->colors[E_WEEK_VIEW_COLOR_TODAY] = widget->style->base[GTK_STATE_SELECTED];
-}
-
-static void
-e_week_view_unrealize (GtkWidget *widget)
-{
- EWeekView *week_view;
- GdkColormap *colormap;
-
- week_view = E_WEEK_VIEW (widget);
-
- gdk_gc_unref (week_view->main_gc);
- week_view->main_gc = NULL;
-
- colormap = gtk_widget_get_colormap (widget);
- gdk_colormap_free_colors (colormap, week_view->colors, E_WEEK_VIEW_COLOR_LAST);
-
- g_object_unref (week_view->reminder_icon);
- week_view->reminder_icon = NULL;
- g_object_unref (week_view->recurrence_icon);
- week_view->recurrence_icon = NULL;
- g_object_unref (week_view->timezone_icon);
- week_view->timezone_icon = NULL;
- g_object_unref (week_view->attach_icon);
- week_view->attach_icon = NULL;
-
- if (GTK_WIDGET_CLASS (e_week_view_parent_class)->unrealize)
- (*GTK_WIDGET_CLASS (e_week_view_parent_class)->unrealize)(widget);
-}
-
-static gint
-get_string_width (PangoLayout *layout, const gchar *string)
-{
- gint width;
-
- pango_layout_set_text (layout, string, -1);
- pango_layout_get_pixel_size (layout, &width, NULL);
- return width;
-}
-
-/* FIXME: This is also needed in e-day-view-time-item.c. We should probably use
- * pango's approximation function, but it needs a language tag. Find out how to
- * get one of those properly. */
-static gint
-get_digit_width (PangoLayout *layout)
-{
- gint digit;
- gint max_digit_width = 1;
-
- for (digit = '0'; digit <= '9'; digit++) {
- gchar digit_char;
- gint digit_width;
-
- digit_char = digit;
-
- pango_layout_set_text (layout, &digit_char, 1);
- pango_layout_get_pixel_size (layout, &digit_width, NULL);
-
- max_digit_width = MAX (max_digit_width, digit_width);
- }
-
- return max_digit_width;
-}
-
-static void
-e_week_view_style_set (GtkWidget *widget,
- GtkStyle *previous_style)
-{
- EWeekView *week_view;
- GtkStyle *style;
- gint day, day_width, max_day_width, max_abbr_day_width;
- gint month, month_width, max_month_width, max_abbr_month_width;
- gint span_num;
- GDate date;
- gchar buffer[128];
- PangoFontDescription *font_desc;
- PangoContext *pango_context;
- PangoFontMetrics *font_metrics;
- PangoLayout *layout;
- EWeekViewEventSpan *span;
-
- if (GTK_WIDGET_CLASS (e_week_view_parent_class)->style_set)
- (*GTK_WIDGET_CLASS (e_week_view_parent_class)->style_set)(widget, previous_style);
-
- week_view = E_WEEK_VIEW (widget);
- style = gtk_widget_get_style (widget);
-
- e_week_view_set_colors(week_view, widget);
- if (week_view->spans) {
- for (span_num = 0; span_num < week_view->spans->len;
- span_num++) {
- span = &g_array_index (week_view->spans,
- EWeekViewEventSpan, span_num);
- if (span->text_item){
- gnome_canvas_item_set (span->text_item,
- "fill_color_gdk", &widget->style->text[GTK_STATE_NORMAL],
- NULL);
- }
- }
- }
-
- /* Set up Pango prerequisites */
- font_desc = style->font_desc;
- pango_context = gtk_widget_get_pango_context (widget);
- font_metrics = pango_context_get_metrics (pango_context, font_desc,
- pango_context_get_language (pango_context));
- layout = pango_layout_new (pango_context);
-
- /* Recalculate the height of each row based on the font size. */
- week_view->row_height = PANGO_PIXELS (pango_font_metrics_get_ascent (font_metrics)) +
- PANGO_PIXELS (pango_font_metrics_get_descent (font_metrics)) +
- E_WEEK_VIEW_EVENT_BORDER_HEIGHT * 2 + E_WEEK_VIEW_EVENT_TEXT_Y_PAD * 2;
- week_view->row_height = MAX (week_view->row_height, E_WEEK_VIEW_ICON_HEIGHT + E_WEEK_VIEW_ICON_Y_PAD + E_WEEK_VIEW_EVENT_BORDER_HEIGHT * 2);
-
- /* Check that the small font is smaller than the default font.
- If it isn't, we won't use it. */
- if (week_view->small_font_desc) {
- if (PANGO_PIXELS (pango_font_metrics_get_ascent (font_metrics)) +
- PANGO_PIXELS (pango_font_metrics_get_descent (font_metrics))
- <= E_WEEK_VIEW_SMALL_FONT_PTSIZE)
- week_view->use_small_font = FALSE;
- }
-
- /* Set the height of the top canvas. */
- gtk_widget_set_usize (week_view->titles_canvas, -1,
- PANGO_PIXELS (pango_font_metrics_get_ascent (font_metrics)) +
- PANGO_PIXELS (pango_font_metrics_get_descent (font_metrics)) + 5);
-
- /* Save the sizes of various strings in the font, so we can quickly
- decide which date formats to use. */
- g_date_clear (&date, 1);
- g_date_set_dmy (&date, 27, 3, 2000); /* Must be a Monday. */
-
- max_day_width = 0;
- max_abbr_day_width = 0;
- for (day = 0; day < 7; day++) {
- g_date_strftime (buffer, 128, "%A", &date);
- day_width = get_string_width (layout, buffer);
- week_view->day_widths[day] = day_width;
- max_day_width = MAX (max_day_width, day_width);
-
- g_date_strftime (buffer, 128, "%a", &date);
- day_width = get_string_width (layout, buffer);
- week_view->abbr_day_widths[day] = day_width;
- max_abbr_day_width = MAX (max_abbr_day_width, day_width);
-
- g_date_add_days (&date, 1);
- }
-
- max_month_width = 0;
- max_abbr_month_width = 0;
- for (month = 0; month < 12; month++) {
- g_date_set_month (&date, month + 1);
-
- g_date_strftime (buffer, 128, "%B", &date);
- month_width = get_string_width (layout, buffer);
- week_view->month_widths[month] = month_width;
- max_month_width = MAX (max_month_width, month_width);
-
- g_date_strftime (buffer, 128, "%b", &date);
- month_width = get_string_width (layout, buffer);
- week_view->abbr_month_widths[month] = month_width;
- max_abbr_month_width = MAX (max_abbr_month_width, month_width);
- }
-
- week_view->space_width = get_string_width (layout, " ");
- week_view->colon_width = get_string_width (layout, ":");
- week_view->slash_width = get_string_width (layout, "/");
- week_view->digit_width = get_digit_width (layout);
- if (week_view->small_font_desc) {
- pango_layout_set_font_description (layout, week_view->small_font_desc);
- week_view->small_digit_width = get_digit_width (layout);
- pango_layout_set_font_description (layout, style->font_desc);
- }
- week_view->max_day_width = max_day_width;
- week_view->max_abbr_day_width = max_abbr_day_width;
- week_view->max_month_width = max_month_width;
- week_view->max_abbr_month_width = max_abbr_month_width;
-
- week_view->am_string_width = get_string_width (layout,
- week_view->am_string);
- week_view->pm_string_width = get_string_width (layout,
- week_view->pm_string);
-
- g_object_unref (layout);
- pango_font_metrics_unref (font_metrics);
-}
-
-
-/* This recalculates the sizes of each column. */
-static void
-e_week_view_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
-{
- EWeekView *week_view;
- gdouble old_x2, old_y2, new_x2, new_y2;
-
- week_view = E_WEEK_VIEW (widget);
-
- (*GTK_WIDGET_CLASS (e_week_view_parent_class)->size_allocate) (widget, allocation);
-
- e_week_view_recalc_cell_sizes (week_view);
-
- /* Set the scroll region of the top canvas to its allocated size. */
- gnome_canvas_get_scroll_region (GNOME_CANVAS (week_view->titles_canvas),
- NULL, NULL, &old_x2, &old_y2);
- new_x2 = week_view->titles_canvas->allocation.width - 1;
- new_y2 = week_view->titles_canvas->allocation.height - 1;
- if (old_x2 != new_x2 || old_y2 != new_y2)
- gnome_canvas_set_scroll_region (GNOME_CANVAS (week_view->titles_canvas),
- 0, 0, new_x2, new_y2);
-
-
- /* Set the scroll region of the main canvas to its allocated width,
- but with the height depending on the number of rows needed. */
- gnome_canvas_get_scroll_region (GNOME_CANVAS (week_view->main_canvas),
- NULL, NULL, &old_x2, &old_y2);
- new_x2 = week_view->main_canvas->allocation.width - 1;
- new_y2 = week_view->main_canvas->allocation.height - 1;
- if (old_x2 != new_x2 || old_y2 != new_y2)
- gnome_canvas_set_scroll_region (GNOME_CANVAS (week_view->main_canvas),
- 0, 0, new_x2, new_y2);
-
- /* Flag that we need to reshape the events. */
- if (old_x2 != new_x2 || old_y2 != new_y2) {
- week_view->events_need_reshape = TRUE;
- e_week_view_check_layout (week_view);
- }
-}
-
-
-static void
-e_week_view_recalc_cell_sizes (EWeekView *week_view)
-{
- gfloat canvas_width, canvas_height, offset;
- gint row, col;
- GtkWidget *widget;
- GtkStyle *style;
- gint width, height, time_width;
- PangoFontDescription *font_desc;
- PangoContext *pango_context;
- PangoFontMetrics *font_metrics;
-
- if (week_view->multi_week_view) {
- week_view->rows = week_view->weeks_shown * 2;
- week_view->columns = week_view->compress_weekend ? 6 : 7;
- } else {
- week_view->rows = 6;
- week_view->columns = 2;
- }
-
- /* Calculate the column sizes, using floating point so that pixels
- get divided evenly. Note that we use one more element than the
- number of columns, to make it easy to get the column widths.
- We also add one to the width so that the right border of the last
- column is off the edge of the displayed area. */
- canvas_width = week_view->main_canvas->allocation.width + 1;
- canvas_width /= week_view->columns;
- offset = 0;
- for (col = 0; col <= week_view->columns; col++) {
- week_view->col_offsets[col] = floor (offset + 0.5);
- offset += canvas_width;
- }
-
- /* Calculate the cell widths based on the offsets. */
- for (col = 0; col < week_view->columns; col++) {
- week_view->col_widths[col] = week_view->col_offsets[col + 1]
- - week_view->col_offsets[col];
- }
-
- /* Now do the same for the row heights. */
- canvas_height = week_view->main_canvas->allocation.height + 1;
- canvas_height /= week_view->rows;
- offset = 0;
- for (row = 0; row <= week_view->rows; row++) {
- week_view->row_offsets[row] = floor (offset + 0.5);
- offset += canvas_height;
- }
-
- /* Calculate the cell heights based on the offsets. */
- for (row = 0; row < week_view->rows; row++) {
- week_view->row_heights[row] = week_view->row_offsets[row + 1]
- - week_view->row_offsets[row];
- }
-
-
- /* If the font hasn't been set yet just return. */
- widget = GTK_WIDGET (week_view);
- style = gtk_widget_get_style (widget);
- if (!style)
- return;
- font_desc = style->font_desc;
- if (!font_desc)
- return;
-
- pango_context = gtk_widget_get_pango_context (widget);
- font_metrics = pango_context_get_metrics (pango_context, font_desc,
- pango_context_get_language (pango_context));
-
-
- /* Calculate the number of rows of events in each cell, for the large
- cells and the compressed weekend cells. */
- if (week_view->multi_week_view) {
- week_view->events_y_offset = E_WEEK_VIEW_DATE_T_PAD +
- + PANGO_PIXELS (pango_font_metrics_get_ascent (font_metrics))
- + PANGO_PIXELS (pango_font_metrics_get_descent (font_metrics))
- + E_WEEK_VIEW_DATE_B_PAD;
- } else {
- week_view->events_y_offset = E_WEEK_VIEW_DATE_T_PAD
- + PANGO_PIXELS (pango_font_metrics_get_ascent (font_metrics))
- + PANGO_PIXELS (pango_font_metrics_get_descent (font_metrics))
- + E_WEEK_VIEW_DATE_LINE_T_PAD + 1
- + E_WEEK_VIEW_DATE_LINE_B_PAD;
- }
-
- height = week_view->row_heights[0];
- week_view->rows_per_cell = (height * 2 - week_view->events_y_offset)
- / (week_view->row_height + E_WEEK_VIEW_EVENT_Y_SPACING);
- week_view->rows_per_cell = MIN (week_view->rows_per_cell,
- E_WEEK_VIEW_MAX_ROWS_PER_CELL);
-
- week_view->rows_per_compressed_cell =
- (height - week_view->events_y_offset)
- / (week_view->row_height + E_WEEK_VIEW_EVENT_Y_SPACING);
- week_view->rows_per_compressed_cell = MIN (week_view->rows_per_compressed_cell,
- E_WEEK_VIEW_MAX_ROWS_PER_CELL);
-
- /* Determine which time format to use, based on the width of the cells.
- We only allow the time to take up about half of the width. */
- width = week_view->col_widths[0];
-
- time_width = e_week_view_get_time_string_width (week_view);
-
- week_view->time_format = E_WEEK_VIEW_TIME_NONE;
- if (week_view->use_small_font && week_view->small_font_desc) {
- if (week_view->show_event_end_times
- && width / 2 > time_width * 2 + E_WEEK_VIEW_EVENT_TIME_SPACING)
- week_view->time_format = E_WEEK_VIEW_TIME_BOTH_SMALL_MIN;
- else if (width / 2 > time_width)
- week_view->time_format = E_WEEK_VIEW_TIME_START_SMALL_MIN;
- } else {
- if (week_view->show_event_end_times
- && width / 2 > time_width * 2 + E_WEEK_VIEW_EVENT_TIME_SPACING)
- week_view->time_format = E_WEEK_VIEW_TIME_BOTH;
- else if (width / 2 > time_width)
- week_view->time_format = E_WEEK_VIEW_TIME_START;
- }
-
- pango_font_metrics_unref (font_metrics);
-}
-
-
-static gint
-e_week_view_focus_in (GtkWidget *widget, GdkEventFocus *event)
-{
- EWeekView *week_view;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_WEEK_VIEW (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- week_view = E_WEEK_VIEW (widget);
-
- GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
-
- gtk_widget_queue_draw (week_view->main_canvas);
-
- return FALSE;
-}
-
-
-static gint
-e_week_view_focus_out (GtkWidget *widget, GdkEventFocus *event)
-{
- EWeekView *week_view;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_WEEK_VIEW (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- week_view = E_WEEK_VIEW (widget);
-
- GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
-
- gtk_widget_queue_draw (week_view->main_canvas);
-
- return FALSE;
-}
-
-
-/* This draws a shadow around the top display and main display. */
-static gint
-e_week_view_expose_event (GtkWidget *widget,
- GdkEventExpose *event)
-{
- EWeekView *week_view;
-
- week_view = E_WEEK_VIEW (widget);
-
- e_week_view_draw_shadow (week_view);
-
- if (GTK_WIDGET_CLASS (e_week_view_parent_class)->expose_event)
- (*GTK_WIDGET_CLASS (e_week_view_parent_class)->expose_event)(widget, event);
-
- return FALSE;
-}
-
-/**
- * e_week_view_get_next_tab_event
- * @week_view: the week_view widget operate on
- * @direction: GTK_DIR_TAB_BACKWARD or GTK_DIR_TAB_FORWARD.
- * @current_event_num and @current_span_num: current status.
- * @next_event_num: the event number focus should go next.
- * -1 indicates focus should go to week_view widget.
- * @next_span_num: always return 0.
- **/
-static gboolean
-e_week_view_get_next_tab_event (EWeekView *week_view,
- GtkDirectionType direction,
- gint current_event_num,
- gint current_span_num,
- gint *next_event_num,
- gint *next_span_num)
-{
- gint event_num;
-
- g_return_val_if_fail (week_view != NULL, FALSE);
- g_return_val_if_fail (next_event_num != NULL, FALSE);
- g_return_val_if_fail (next_span_num != NULL, FALSE);
-
- if (week_view->events->len <= 0)
- return FALSE;
-
- /* we only tab through events not spans */
- *next_span_num = 0;
-
- switch (direction) {
- case GTK_DIR_TAB_BACKWARD:
- event_num = current_event_num - 1;
- break;
- case GTK_DIR_TAB_FORWARD:
- event_num = current_event_num + 1;
- break;
- default:
- return FALSE;
- }
-
- if (event_num == -1)
- /* backward, out of event range, go to week view widget
- */
- *next_event_num = -1;
- else if (event_num < -1)
- /* backward from week_view, go to the last event
- */
- *next_event_num = week_view->events->len - 1;
- else if (event_num >= week_view->events->len)
- /* forward, out of event range, go to week view widget
- */
- *next_event_num = -1;
- else
- *next_event_num = event_num;
- return TRUE;
-}
-
-static gboolean
-e_week_view_focus (GtkWidget *widget, GtkDirectionType direction)
-{
- EWeekView *week_view;
- gint new_event_num;
- gint new_span_num;
- gint event_loop;
- gboolean editable = FALSE;
- static gint last_focus_event_num = -1, last_focus_span_num = -1;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_WEEK_VIEW (widget), FALSE);
-
- week_view = E_WEEK_VIEW (widget);
-
- e_week_view_check_layout (week_view);
-
- if (week_view->focused_jump_button == E_WEEK_VIEW_JUMP_BUTTON_NO_FOCUS) {
- last_focus_event_num = week_view->editing_event_num;
- last_focus_span_num = week_view->editing_span_num;
- }
-
- for (event_loop = 0; event_loop < week_view->events->len;
- ++event_loop) {
- if (!e_week_view_get_next_tab_event (week_view, direction,
- last_focus_event_num,
- last_focus_span_num,
- &new_event_num,
- &new_span_num))
- return FALSE;
-
- if (new_event_num == -1) {
- /* focus should go to week_view widget
- */
- gtk_widget_grab_focus (widget);
- return TRUE;
- }
-
- editable = e_week_view_start_editing_event (week_view,
- new_event_num,
- new_span_num,
- NULL);
- last_focus_event_num = new_event_num;
- last_focus_span_num = new_span_num;
-
- if (editable)
- break;
- else {
- /* check if we should go to the jump button */
-
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- gint current_day;
-
- event = &g_array_index (week_view->events,
- EWeekViewEvent,
- new_event_num);
- span = &g_array_index (week_view->spans,
- EWeekViewEventSpan,
- event->spans_index + new_span_num);
- current_day = span->start_day;
-
- if ((week_view->focused_jump_button != current_day) &&
- e_week_view_is_jump_button_visible(week_view, current_day)) {
-
- /* focus go to the jump button */
- e_week_view_stop_editing_event (week_view);
- gnome_canvas_item_grab_focus (week_view->jump_buttons[current_day]);
- return TRUE;
- }
- }
- }
- return editable;
-}
-
-/* Returns the currently-selected event, or NULL if none */
-static GList *
-e_week_view_get_selected_events (ECalendarView *cal_view)
-{
- EWeekViewEvent *event = NULL;
- GList *list = NULL;
- EWeekView *week_view = (EWeekView *) cal_view;
-
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), NULL);
-
- if (week_view->editing_event_num != -1) {
- event = &g_array_index (week_view->events, EWeekViewEvent,
- week_view->editing_event_num);
- } else if (week_view->popup_event_num != -1) {
- event = &g_array_index (week_view->events, EWeekViewEvent,
- week_view->popup_event_num);
- }
-
- if (event)
- list = g_list_prepend (list, event);
-
- return list;
-}
-
-/* Restarts a query for the week view */
-static void
-e_week_view_update_query (EWeekView *week_view)
-{
- gint rows, r;
-
- gtk_widget_queue_draw (week_view->main_canvas);
- e_week_view_free_events (week_view);
- e_week_view_queue_layout (week_view);
-
- rows = e_table_model_row_count (E_TABLE_MODEL (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view))));
- for (r = 0; r < rows; r++) {
- ECalModelComponent *comp_data;
-
- comp_data = e_cal_model_get_component_at (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)), r);
- g_assert (comp_data != NULL);
- process_component (week_view, comp_data);
- }
-}
-
-static void
-e_week_view_draw_shadow (EWeekView *week_view)
-{
- gint x1, y1, x2, y2;
- GtkStyle *style;
- GdkGC *light_gc, *dark_gc;
- GdkWindow *window;
-
- /* Draw the shadow around the graphical displays. */
- x1 = week_view->main_canvas->allocation.x - 1;
- y1 = week_view->main_canvas->allocation.y - 1;
- x2 = x1 + week_view->main_canvas->allocation.width + 2;
- y2 = y1 + week_view->main_canvas->allocation.height + 2;
-
- style = GTK_WIDGET (week_view)->style;
- dark_gc = style->dark_gc[GTK_STATE_NORMAL];
- light_gc = style->light_gc[GTK_STATE_NORMAL];
-
- window = GTK_WIDGET (week_view)->window;
- gdk_draw_line (window, dark_gc, x1, y1, x1, y2);
- gdk_draw_line (window, dark_gc, x1, y1, x2, y1);
- gdk_draw_line (window, light_gc, x2, y1, x2, y2);
- gdk_draw_line (window, light_gc, x1, y2, x2, y2);
-}
-
-/* This sets the selected time range. The EWeekView will show the corresponding
- month and the days between start_time and end_time will be selected.
- To select a single day, use the same value for start_time & end_time. */
-static void
-e_week_view_set_selected_time_range (ECalendarView *cal_view,
- time_t start_time,
- time_t end_time)
-{
- GDate date, end_date;
- gint num_days;
- gboolean update_adjustment_value = FALSE;
- EWeekView *week_view = E_WEEK_VIEW (cal_view);
-
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
- time_to_gdate_with_zone (&date, start_time, e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
-
- /* Set the selection to the given days. */
- week_view->selection_start_day = g_date_julian (&date)
- - g_date_julian (&week_view->base_date);
- if (end_time == start_time
- || end_time <= time_add_day_with_zone (start_time, 1,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view))))
- week_view->selection_end_day = week_view->selection_start_day;
- else {
- time_to_gdate_with_zone (&end_date, end_time - 60, e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
- week_view->selection_end_day = g_date_julian (&end_date)
- - g_date_julian (&week_view->base_date);
- }
-
- /* Make sure the selection is valid. */
- num_days = week_view->multi_week_view ? week_view->weeks_shown * 7 : 7;
- num_days--;
- week_view->selection_start_day = CLAMP (week_view->selection_start_day,
- 0, num_days);
- week_view->selection_end_day = CLAMP (week_view->selection_end_day,
- week_view->selection_start_day,
- num_days);
-
- /* Reset the adjustment value to 0 if the base address has changed.
- Note that we do this after updating first_day_shown so that our
- signal handler will not try to reload the events. */
- if (update_adjustment_value)
- gtk_adjustment_set_value (GTK_RANGE (week_view->vscrollbar)->adjustment, 0);
-
- gtk_widget_queue_draw (week_view->main_canvas);
-}
-
-void
-e_week_view_set_selected_time_range_visible (EWeekView *week_view,
- time_t start_time,
- time_t end_time)
-{
- GDate date, end_date;
- gint num_days;
-
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
- time_to_gdate_with_zone (&date, start_time, e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
-
- /* Set the selection to the given days. */
- week_view->selection_start_day = g_date_julian (&date)
- - g_date_julian (&week_view->first_day_shown);
- if (end_time == start_time
- || end_time <= time_add_day_with_zone (start_time, 1,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view))))
- week_view->selection_end_day = week_view->selection_start_day;
- else {
- time_to_gdate_with_zone (&end_date, end_time - 60, e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
- week_view->selection_end_day = g_date_julian (&end_date)
- - g_date_julian (&week_view->first_day_shown);
- }
-
- /* Make sure the selection is valid. */
- num_days = week_view->multi_week_view ? week_view->weeks_shown * 7 : 7;
- num_days--;
- week_view->selection_start_day = CLAMP (week_view->selection_start_day,
- 0, num_days);
- week_view->selection_end_day = CLAMP (week_view->selection_end_day,
- week_view->selection_start_day,
- num_days);
-
- gtk_widget_queue_draw (week_view->main_canvas);
-}
-
-
-/* Returns the selected time range. */
-static gboolean
-e_week_view_get_selected_time_range (ECalendarView *cal_view,
- time_t *start_time,
- time_t *end_time)
-{
- gint start_day, end_day;
- EWeekView *week_view = E_WEEK_VIEW (cal_view);
-
- start_day = week_view->selection_start_day;
- end_day = week_view->selection_end_day;
-
- if (start_day == -1) {
- start_day = 0;
- end_day = 0;
- }
-
- if (start_time)
- *start_time = week_view->day_starts[start_day];
-
- if (end_time)
- *end_time = week_view->day_starts[end_day + 1];
-
- return TRUE;
-}
-
-/* Gets the visible time range. Returns FALSE if no time range has been set. */
-static gboolean
-e_week_view_get_visible_time_range (ECalendarView *cal_view,
- time_t *start_time,
- time_t *end_time)
-{
- gint num_days;
- EWeekView *week_view = E_WEEK_VIEW (cal_view);
-
- /* If we don't have a valid date set yet, return FALSE. */
- if (!g_date_valid (&week_view->first_day_shown))
- return FALSE;
-
- num_days = week_view->multi_week_view ? week_view->weeks_shown * 7 : 7;
- *start_time = week_view->day_starts[0];
- *end_time = week_view->day_starts[num_days];
-
- return TRUE;
-}
-
-
-/* Note that the returned date may be invalid if no date has been set yet. */
-void
-e_week_view_get_first_day_shown (EWeekView *week_view,
- GDate *date)
-{
- *date = week_view->first_day_shown;
-}
-
-
-/* This sets the first day shown in the view. It will be rounded down to the
- nearest week. */
-void
-e_week_view_set_first_day_shown (EWeekView *week_view,
- GDate *date)
-{
- GDate base_date;
- gint weekday, day_offset, num_days;
- gboolean update_adjustment_value = FALSE;
- guint32 old_selection_start_julian = 0, old_selection_end_julian = 0;
- struct icaltimetype start_tt = icaltime_null_time ();
- time_t start_time;
-
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
- /* Calculate the old selection range. */
- if (week_view->selection_start_day != -1) {
- old_selection_start_julian =
- g_date_julian (&week_view->base_date)
- + week_view->selection_start_day;
- old_selection_end_julian =
- g_date_julian (&week_view->base_date)
- + week_view->selection_end_day;
- }
-
- /* Calculate the weekday of the given date, 0 = Mon. */
- weekday = g_date_weekday (date) - 1;
-
- /* Convert it to an offset from the start of the display. */
- day_offset = (weekday + 7 - week_view->display_start_day) % 7;
-
- /* Calculate the base date, i.e. the first day shown when the
- scrollbar adjustment value is 0. */
- base_date = *date;
- g_date_subtract_days (&base_date, day_offset);
-
- /* See if we need to update the base date. */
- if (!g_date_valid (&week_view->base_date)
- || g_date_compare (&week_view->base_date, &base_date)) {
- week_view->base_date = base_date;
- update_adjustment_value = TRUE;
- }
-
- /* See if we need to update the first day shown. */
- if (!g_date_valid (&week_view->first_day_shown)
- || g_date_compare (&week_view->first_day_shown, &base_date)) {
- week_view->first_day_shown = base_date;
-
- start_tt.year = g_date_year (&base_date);
- start_tt.month = g_date_month (&base_date);
- start_tt.day = g_date_day (&base_date);
-
- start_time = icaltime_as_timet_with_zone (start_tt,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
-
- e_week_view_recalc_day_starts (week_view, start_time);
- e_week_view_update_query (week_view);
- }
-
- /* Try to keep the previous selection, but if it is no longer shown
- just select the first day. */
- if (week_view->selection_start_day != -1) {
- week_view->selection_start_day = old_selection_start_julian
- - g_date_julian (&base_date);
- week_view->selection_end_day = old_selection_end_julian
- - g_date_julian (&base_date);
-
- /* Make sure the selection is valid. */
- num_days = week_view->multi_week_view
- ? week_view->weeks_shown * 7 : 7;
- num_days--;
- week_view->selection_start_day =
- CLAMP (week_view->selection_start_day, 0, num_days);
- week_view->selection_end_day =
- CLAMP (week_view->selection_end_day,
- week_view->selection_start_day,
- num_days);
- }
-
- /* Reset the adjustment value to 0 if the base address has changed.
- Note that we do this after updating first_day_shown so that our
- signal handler will not try to reload the events. */
- if (update_adjustment_value)
- gtk_adjustment_set_value (GTK_RANGE (week_view->vscrollbar)->adjustment, 0);
-
- e_week_view_update_query (week_view);
- gtk_widget_queue_draw (week_view->main_canvas);
-}
-
-
-/* Recalculates the time_t corresponding to the start of each day. */
-static void
-e_week_view_recalc_day_starts (EWeekView *week_view,
- time_t lower)
-{
- gint num_days, day;
- time_t tmp_time;
-
- num_days = week_view->multi_week_view ? week_view->weeks_shown * 7 : 7;
-
- tmp_time = lower;
- week_view->day_starts[0] = tmp_time;
- for (day = 1; day <= num_days; day++) {
- tmp_time = time_add_day_with_zone (tmp_time, 1,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
- week_view->day_starts[day] = tmp_time;
- }
-}
-
-
-gboolean
-e_week_view_get_multi_week_view (EWeekView *week_view)
-{
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), FALSE);
-
- return week_view->multi_week_view;
-}
-
-
-void
-e_week_view_set_multi_week_view (EWeekView *week_view,
- gboolean multi_week_view)
-{
- GtkAdjustment *adjustment;
- gint page_increment, page_size;
-
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
- if (week_view->multi_week_view == multi_week_view)
- return;
-
- week_view->multi_week_view = multi_week_view;
-
- if (multi_week_view) {
- gtk_widget_show (week_view->titles_canvas);
- page_increment = 4;
- page_size = 5;
- } else {
- gtk_widget_hide (week_view->titles_canvas);
- page_increment = page_size = 1;
- }
-
- adjustment = GTK_RANGE (week_view->vscrollbar)->adjustment;
- adjustment->page_increment = page_increment;
- adjustment->page_size = page_size;
- gtk_adjustment_changed (adjustment);
-
- e_week_view_recalc_cell_sizes (week_view);
-
- if (g_date_valid (&week_view->first_day_shown))
- e_week_view_set_first_day_shown (week_view,
- &week_view->first_day_shown);
-}
-
-gboolean
-e_week_view_get_update_base_date (EWeekView *week_view)
-{
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), FALSE);
-
- return week_view->update_base_date;
-}
-
-
-void
-e_week_view_set_update_base_date (EWeekView *week_view, gboolean update_base_date)
-{
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
- week_view->update_base_date = update_base_date;
-}
-
-gint
-e_week_view_get_weeks_shown (EWeekView *week_view)
-{
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), 1);
-
- return week_view->weeks_shown;
-}
-
-
-void
-e_week_view_set_weeks_shown (EWeekView *week_view,
- gint weeks_shown)
-{
- GtkAdjustment *adjustment;
- gint page_increment, page_size;
-
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
- weeks_shown = MIN (weeks_shown, E_WEEK_VIEW_MAX_WEEKS);
-
- if (week_view->weeks_shown == weeks_shown)
- return;
-
- week_view->weeks_shown = weeks_shown;
-
- if (week_view->multi_week_view) {
- page_increment = 4;
- page_size = 5;
-
- adjustment = GTK_RANGE (week_view->vscrollbar)->adjustment;
- adjustment->page_increment = page_increment;
- adjustment->page_size = page_size;
- gtk_adjustment_changed (adjustment);
-
- e_week_view_recalc_cell_sizes (week_view);
-
- if (g_date_valid (&week_view->first_day_shown))
- e_week_view_set_first_day_shown (week_view, &week_view->first_day_shown);
-
- e_week_view_update_query (week_view);
- }
-}
-
-
-gboolean
-e_week_view_get_compress_weekend (EWeekView *week_view)
-{
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), FALSE);
-
- return week_view->compress_weekend;
-}
-
-
-void
-e_week_view_set_compress_weekend (EWeekView *week_view,
- gboolean compress)
-{
- gboolean need_reload = FALSE;
-
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
- if (week_view->compress_weekend == compress)
- return;
-
- week_view->compress_weekend = compress;
-
- /* The option only affects the month view. */
- if (!week_view->multi_week_view)
- return;
-
- e_week_view_recalc_cell_sizes (week_view);
-
- need_reload = e_week_view_recalc_display_start_day (week_view);
-
- /* If the display_start_day has changed we need to recalculate the
- date range shown and reload all events, otherwise we only need to
- do a reshape. */
- if (need_reload) {
- /* Recalculate the days shown and reload if necessary. */
- if (g_date_valid (&week_view->first_day_shown))
- e_week_view_set_first_day_shown (week_view, &week_view->first_day_shown);
- } else {
- week_view->events_need_reshape = TRUE;
- e_week_view_check_layout (week_view);
- }
-
- gtk_widget_queue_draw (week_view->titles_canvas);
- gtk_widget_queue_draw (week_view->main_canvas);
-}
-
-/* Whether we display event end times. */
-gboolean
-e_week_view_get_show_event_end_times (EWeekView *week_view)
-{
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), TRUE);
-
- return week_view->show_event_end_times;
-}
-
-
-void
-e_week_view_set_show_event_end_times (EWeekView *week_view,
- gboolean show)
-{
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
- if (week_view->show_event_end_times != show) {
- week_view->show_event_end_times = show;
- e_week_view_recalc_cell_sizes (week_view);
- week_view->events_need_reshape = TRUE;
- e_week_view_check_layout (week_view);
- }
-}
-
-
-/* The first day of the week, 0 (Monday) to 6 (Sunday). */
-gint
-e_week_view_get_week_start_day (EWeekView *week_view)
-{
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), 0);
-
- return week_view->week_start_day;
-}
-
-
-void
-e_week_view_set_week_start_day (EWeekView *week_view,
- gint week_start_day)
-{
- g_return_if_fail (E_IS_WEEK_VIEW (week_view));
- g_return_if_fail (week_start_day >= 0);
- g_return_if_fail (week_start_day < 7);
-
- if (week_view->week_start_day == week_start_day)
- return;
-
- week_view->week_start_day = week_start_day;
-
- e_week_view_recalc_display_start_day (week_view);
-
- /* Recalculate the days shown and reload if necessary. */
- if (g_date_valid (&week_view->first_day_shown))
- e_week_view_set_first_day_shown (week_view,
- &week_view->first_day_shown);
-
- gtk_widget_queue_draw (week_view->titles_canvas);
- gtk_widget_queue_draw (week_view->main_canvas);
-}
-
-static gboolean
-e_week_view_recalc_display_start_day (EWeekView *week_view)
-{
- gint display_start_day;
-
- /* The display start day defaults to week_start_day, but we have
- to use Saturday if the weekend is compressed and week_start_day
- is Sunday. */
- display_start_day = week_view->week_start_day;
-
- if (display_start_day == 6
- && (!week_view->multi_week_view || week_view->compress_weekend))
- display_start_day = 5;
-
- if (week_view->display_start_day != display_start_day) {
- week_view->display_start_day = display_start_day;
- return TRUE;
- }
-
- return FALSE;
-}
-
-
-static gboolean
-e_week_view_update_event_cb (EWeekView *week_view,
- gint event_num,
- gpointer data)
-{
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- gint span_num;
- const gchar *text;
- ECalModelComponent *comp_data;
-
- comp_data = data;
-
- event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
-
- e_cal_model_free_component_data (event->comp_data);
- event->comp_data = e_cal_model_copy_component_data (comp_data);
-
- for (span_num = 0; span_num < event->num_spans; span_num++) {
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- event->spans_index + span_num);
-
- if (span->text_item) {
- text = icalcomponent_get_summary (comp_data->icalcomp);
- gnome_canvas_item_set (span->text_item,
- "text", text ? text : "",
- NULL);
-
- e_week_view_reshape_event_span (week_view, event_num,
- span_num);
- }
- }
- g_signal_emit_by_name (G_OBJECT(week_view),
- "event_changed", event);
-
-
- return TRUE;
-}
-
-/* This calls a given function for each event instance Note that it is
- safe for the callback to remove the event (since we step backwards
- through the arrays). */
-static void
-e_week_view_foreach_event (EWeekView *week_view,
- EWeekViewForeachEventCallback callback,
- gpointer data)
-{
- EWeekViewEvent *event;
- gint event_num;
-
- for (event_num = week_view->events->len - 1;
- event_num >= 0;
- event_num--) {
- event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
-
- if (!(*callback) (week_view, event_num, data))
- return;
- }
-}
-
-/* This calls a given function for each event instance that matches the given
- uid. Note that it is safe for the callback to remove the event (since we
- step backwards through the arrays). */
-static void
-e_week_view_foreach_event_with_uid (EWeekView *week_view,
- const gchar *uid,
- EWeekViewForeachEventCallback callback,
- gpointer data)
-{
- EWeekViewEvent *event;
- gint event_num;
-
- for (event_num = week_view->events->len - 1;
- event_num >= 0;
- event_num--) {
- const char *u;
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- event_num);
-
- u = icalcomponent_get_uid (event->comp_data->icalcomp);
- if (u && !strcmp (uid, u)) {
- if (!(*callback) (week_view, event_num, data))
- return;
- }
- }
-}
-
-
-static gboolean
-e_week_view_remove_event_cb (EWeekView *week_view,
- gint event_num,
- gpointer data)
-{
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- gint span_num;
-
- event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
- if (!event)
- return TRUE;
-
- /* If we were editing this event, set editing_event_num to -1 so
- on_editing_stopped doesn't try to update the event. */
- if (week_view->editing_event_num == event_num)
- week_view->editing_event_num = -1;
-
- /* We leave the span elements in the array, but set the canvas item
- pointers to NULL. */
- for (span_num = 0; span_num < event->num_spans; span_num++) {
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- event->spans_index + span_num);
-
- if (span->text_item) {
- gtk_object_destroy (GTK_OBJECT (span->text_item));
- span->text_item = NULL;
- }
- if (span->background_item) {
- gtk_object_destroy (GTK_OBJECT (span->background_item));
- span->background_item = NULL;
- }
- }
-
- e_cal_model_free_component_data (event->comp_data);
- event->comp_data = NULL;
-
- g_array_remove_index (week_view->events, event_num);
- week_view->events_need_layout = TRUE;
-
- return TRUE;
-}
-
-
-void
-e_week_view_get_day_position (EWeekView *week_view,
- gint day,
- gint *day_x,
- gint *day_y,
- gint *day_w,
- gint *day_h)
-{
- gint cell_x, cell_y, cell_h;
-
- e_week_view_layout_get_day_position (day,
- week_view->multi_week_view,
- week_view->weeks_shown,
- week_view->display_start_day,
- week_view->compress_weekend,
- &cell_x, &cell_y, &cell_h);
-
- *day_x = week_view->col_offsets[cell_x];
- *day_y = week_view->row_offsets[cell_y];
-
- *day_w = week_view->col_widths[cell_x];
- *day_h = week_view->row_heights[cell_y];
- if (cell_h == 2)
- *day_h += week_view->row_heights[cell_y + 1];
-}
-
-
-/* Returns the bounding box for a span of an event. Usually this can easily
- be determined by the start & end days and row of the span, which are set in
- e_week_view_layout_event(). Though we need a special case for the weekends
- when they are compressed, since the span may not fit.
- The bounding box includes the entire width of the days in the view (but
- not the vertical line down the right of the last day), though the displayed
- event doesn't normally extend to the edges of the day.
- It returns FALSE if the span isn't visible. */
-gboolean
-e_week_view_get_span_position (EWeekView *week_view,
- gint event_num,
- gint span_num,
- gint *span_x,
- gint *span_y,
- gint *span_w)
-{
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- gint num_days;
- gint start_x, start_y, start_w, start_h;
- gint end_x, end_y, end_w, end_h;
-
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), FALSE);
- g_return_val_if_fail (event_num < week_view->events->len, FALSE);
-
- event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
-
- g_return_val_if_fail (span_num < event->num_spans, FALSE);
-
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- event->spans_index + span_num);
-
- if (!e_week_view_layout_get_span_position (event, span,
- week_view->rows_per_cell,
- week_view->rows_per_compressed_cell,
- week_view->display_start_day,
- week_view->multi_week_view,
- week_view->compress_weekend,
- &num_days)) {
- return FALSE;
- }
-
- e_week_view_get_day_position (week_view, span->start_day,
- &start_x, &start_y, &start_w, &start_h);
- *span_y = start_y + week_view->events_y_offset
- + span->row * (week_view->row_height
- + E_WEEK_VIEW_EVENT_Y_SPACING);
- if (num_days == 1) {
- *span_x = start_x;
- *span_w = start_w - 1;
- } else {
- e_week_view_get_day_position (week_view,
- span->start_day + num_days - 1,
- &end_x, &end_y, &end_w, &end_h);
- *span_x = start_x;
- *span_w = end_x + end_w - start_x - 1;
- }
-
- return TRUE;
-}
-
-
-
-static gboolean
-e_week_view_on_button_press (GtkWidget *widget,
- GdkEventButton *event,
- EWeekView *week_view)
-{
- gint x, y, day;
-
-#if 0
- g_print ("In e_week_view_on_button_press\n");
- if (event->type == GDK_2BUTTON_PRESS)
- g_print (" is a double-click\n");
- if (week_view->pressed_event_num != -1)
- g_print (" item is pressed\n");
-#endif
-
- /* Convert the mouse position to a week & day. */
- x = event->x;
- y = event->y;
- day = e_week_view_convert_position_to_day (week_view, x, y);
- if (day == -1)
- return FALSE;
-
- /* If an event is pressed just return. */
- if (week_view->pressed_event_num != -1)
- return FALSE;
-
- if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) {
- e_calendar_view_new_appointment_full (E_CALENDAR_VIEW (week_view), TRUE, FALSE);
- return TRUE;
- }
-
- if (event->button == 1) {
- /* Start the selection drag. */
- if (!GTK_WIDGET_HAS_FOCUS (week_view) && !GTK_WIDGET_HAS_FOCUS (week_view->main_canvas))
- gtk_widget_grab_focus (GTK_WIDGET (week_view));
-
- if (gdk_pointer_grab (GTK_LAYOUT (widget)->bin_window, FALSE,
- GDK_POINTER_MOTION_MASK
- | GDK_BUTTON_RELEASE_MASK,
- FALSE, NULL, event->time) == 0) {
- week_view->selection_start_day = day;
- week_view->selection_end_day = day;
- week_view->selection_drag_pos = E_WEEK_VIEW_DRAG_END;
- g_signal_emit_by_name (week_view, "selected_time_changed");
-
- /* FIXME: Optimise? */
- gtk_widget_queue_draw (week_view->main_canvas);
- }
- } else if (event->button == 3) {
- if (!GTK_WIDGET_HAS_FOCUS (week_view))
- gtk_widget_grab_focus (GTK_WIDGET (week_view));
-
- if (day < week_view->selection_start_day || day > week_view->selection_end_day) {
- week_view->selection_start_day = day;
- week_view->selection_end_day = day;
- week_view->selection_drag_pos = E_WEEK_VIEW_DRAG_NONE;
-
- /* FIXME: Optimise? */
- gtk_widget_queue_draw (week_view->main_canvas);
- }
-
- e_week_view_show_popup_menu (week_view, event, -1);
- }
-
- return TRUE;
-}
-
-
-static gboolean
-e_week_view_on_button_release (GtkWidget *widget,
- GdkEventButton *event,
- EWeekView *week_view)
-{
-#if 0
- g_print ("In e_week_view_on_button_release\n");
-#endif
-
- if (week_view->selection_drag_pos != E_WEEK_VIEW_DRAG_NONE) {
- week_view->selection_drag_pos = E_WEEK_VIEW_DRAG_NONE;
- gdk_pointer_ungrab (event->time);
- }
-
- return FALSE;
-}
-
-static gboolean
-e_week_view_on_scroll (GtkWidget *widget,
- GdkEventScroll *scroll,
- EWeekView *week_view)
-{
- GtkAdjustment *adj = GTK_RANGE (week_view->vscrollbar)->adjustment;
- gfloat new_value;
-
- switch (scroll->direction){
- case GDK_SCROLL_UP:
- new_value = adj->value - adj->page_increment;
- break;
- case GDK_SCROLL_DOWN:
- new_value = adj->value + adj->page_increment;
- break;
- default:
- return FALSE;
- }
-
- new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
- gtk_adjustment_set_value (adj, new_value);
-
- return TRUE;
-}
-
-
-static gboolean
-e_week_view_on_motion (GtkWidget *widget,
- GdkEventMotion *mevent,
- EWeekView *week_view)
-{
- gint x, y, day;
-
-#if 0
- g_print ("In e_week_view_on_motion\n");
-#endif
-
- /* Convert the mouse position to a week & day. */
- x = mevent->x;
- y = mevent->y;
- day = e_week_view_convert_position_to_day (week_view, x, y);
- if (day == -1)
- return FALSE;
-
- if (week_view->selection_drag_pos != E_WEEK_VIEW_DRAG_NONE) {
- e_week_view_update_selection (week_view, day);
- return TRUE;
- }
-
- return FALSE;
-}
-
-
-/* Converts a position in the canvas window to a day offset from the first
- day displayed. Returns -1 if the position is outside the grid. */
-static gint
-e_week_view_convert_position_to_day (EWeekView *week_view,
- gint x,
- gint y)
-{
- gint col, row, grid_x = -1, grid_y = -1, week, day;
- gint weekend_col, box, weekend_box;
-
- /* First we convert it to a grid position. */
- for (col = 0; col <= week_view->columns; col++) {
- if (x < week_view->col_offsets[col]) {
- grid_x = col - 1;
- break;
- }
- }
-
- for (row = 0; row <= week_view->rows; row++) {
- if (y < week_view->row_offsets[row]) {
- grid_y = row - 1;
- break;
- }
- }
-
- /* If the mouse is outside the grid return FALSE. */
- if (grid_x == -1 || grid_y == -1)
- return -1;
-
- /* Now convert the grid position to a week and day. */
- if (week_view->multi_week_view) {
- week = grid_y / 2;
- day = grid_x;
-
- if (week_view->compress_weekend) {
- weekend_col = (5 + 7 - week_view->display_start_day) % 7;
- if (grid_x > weekend_col
- || (grid_x == weekend_col && grid_y % 2 == 1))
- day++;
- }
- } else {
- week = 0;
-
- box = grid_x * 3 + grid_y / 2;
- weekend_box = (5 + 7 - week_view->display_start_day) % 7;
- day = box;
- if (box > weekend_box
- ||( box == weekend_box && grid_y % 2 == 1))
- day++;
- }
-
- return week * 7 + day;
-}
-
-
-static void
-e_week_view_update_selection (EWeekView *week_view,
- gint day)
-{
- gint tmp_day;
- gboolean need_redraw = FALSE;
-
-#if 0
- g_print ("Updating selection %i,%i\n", week, day);
-#endif
-
- if (week_view->selection_drag_pos == E_WEEK_VIEW_DRAG_START) {
- if (day != week_view->selection_start_day) {
- need_redraw = TRUE;
- week_view->selection_start_day = day;
- }
- } else {
- if (day != week_view->selection_end_day) {
- need_redraw = TRUE;
- week_view->selection_end_day = day;
- }
- }
-
- /* Switch the drag position if necessary. */
- if (week_view->selection_start_day > week_view->selection_end_day) {
- tmp_day = week_view->selection_start_day;
- week_view->selection_start_day = week_view->selection_end_day;
- week_view->selection_end_day = tmp_day;
- if (week_view->selection_drag_pos == E_WEEK_VIEW_DRAG_START)
- week_view->selection_drag_pos = E_WEEK_VIEW_DRAG_END;
- else
- week_view->selection_drag_pos = E_WEEK_VIEW_DRAG_START;
- }
-
- /* FIXME: Optimise? */
- if (need_redraw) {
- gtk_widget_queue_draw (week_view->main_canvas);
- }
-}
-
-
-static void
-e_week_view_free_events (EWeekView *week_view)
-{
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- gint event_num, span_num, num_days, day;
-
- /* Reset all our indices. */
- week_view->pressed_event_num = -1;
- week_view->pressed_span_num = -1;
- week_view->editing_event_num = -1;
- week_view->editing_span_num = -1;
- week_view->popup_event_num = -1;
-
- for (event_num = 0; event_num < week_view->events->len; event_num++) {
- event = &g_array_index (week_view->events, EWeekViewEvent,
- event_num);
- e_cal_model_free_component_data (event->comp_data);
- }
-
- g_array_set_size (week_view->events, 0);
-
- /* Destroy all the old canvas items. */
- if (week_view->spans) {
- for (span_num = 0; span_num < week_view->spans->len;
- span_num++) {
- span = &g_array_index (week_view->spans,
- EWeekViewEventSpan, span_num);
- if (span->background_item)
- gtk_object_destroy (GTK_OBJECT (span->background_item));
- if (span->text_item)
- gtk_object_destroy (GTK_OBJECT (span->text_item));
- }
- g_array_free (week_view->spans, TRUE);
- week_view->spans = NULL;
- }
-
- /* Clear the number of rows used per day. */
- num_days = week_view->multi_week_view ? week_view->weeks_shown * 7 : 7;
- for (day = 0; day <= num_days; day++) {
- week_view->rows_per_day[day] = 0;
- }
-
- /* Hide all the jump buttons. */
- for (day = 0; day < E_WEEK_VIEW_MAX_WEEKS * 7; day++) {
- gnome_canvas_item_hide (week_view->jump_buttons[day]);
- }
-}
-
-
-/* This adds one event to the view, adding it to the appropriate array. */
-static gboolean
-e_week_view_add_event (ECalComponent *comp,
- time_t start,
- time_t end,
- gboolean prepend,
- gpointer data)
-
-{
- AddEventData *add_event_data;
- EWeekViewEvent event;
- gint num_days;
- struct icaltimetype start_tt, end_tt;
-
- add_event_data = data;
-
- /* Check that the event times are valid. */
- num_days = add_event_data->week_view->multi_week_view ? add_event_data->week_view->weeks_shown * 7 : 7;
-
-#if 0
- g_print ("View start:%li end:%li Event start:%li end:%li\n",
- add_event_data->week_view->day_starts[0], add_event_data->week_view->day_starts[num_days],
- start, end);
-#endif
- g_return_val_if_fail (start <= end, TRUE);
- g_return_val_if_fail (start < add_event_data->week_view->day_starts[num_days], TRUE);
- g_return_val_if_fail (end > add_event_data->week_view->day_starts[0], TRUE);
-
- start_tt = icaltime_from_timet_with_zone (start, FALSE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (add_event_data->week_view)));
- end_tt = icaltime_from_timet_with_zone (end, FALSE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (add_event_data->week_view)));
-
- if (add_event_data->comp_data) {
- event.comp_data = e_cal_model_copy_component_data (add_event_data->comp_data);
- } else {
- event.comp_data = g_new0 (ECalModelComponent, 1);
-
- event.comp_data->client = g_object_ref (e_cal_model_get_default_client (e_calendar_view_get_model (E_CALENDAR_VIEW (add_event_data->week_view))));
- e_cal_component_abort_sequence (comp);
- event.comp_data->icalcomp = icalcomponent_new_clone (e_cal_component_get_icalcomponent (comp));
- }
- event.start = start;
- event.end = end;
- event.spans_index = 0;
- event.num_spans = 0;
- event.comp_data->instance_start = start;
- event.comp_data->instance_end = end;
-
- event.start_minute = start_tt.hour * 60 + start_tt.minute;
- event.end_minute = end_tt.hour * 60 + end_tt.minute;
- if (event.end_minute == 0 && start != end)
- event.end_minute = 24 * 60;
-
- event.different_timezone = FALSE;
- if (!cal_comp_util_compare_event_timezones (
- comp,
- event.comp_data->client,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (add_event_data->week_view))))
- event.different_timezone = TRUE;
-
- if (prepend)
- g_array_prepend_val (add_event_data->week_view->events, event);
- else
- g_array_append_val (add_event_data->week_view->events, event);
- add_event_data->week_view->events_sorted = FALSE;
- add_event_data->week_view->events_need_layout = TRUE;
-
- return TRUE;
-}
-
-
-/* This lays out the events, or reshapes them, as necessary. */
-static void
-e_week_view_check_layout (EWeekView *week_view)
-{
- /* Don't bother if we aren't visible. */
- if (!GTK_WIDGET_VISIBLE (week_view))
- return;
-
- /* Make sure the events are sorted (by start and size). */
- e_week_view_ensure_events_sorted (week_view);
-
- if (week_view->events_need_layout)
- week_view->spans = e_week_view_layout_events
- (week_view->events, week_view->spans,
- week_view->multi_week_view,
- week_view->weeks_shown,
- week_view->compress_weekend,
- week_view->display_start_day,
- week_view->day_starts,
- week_view->rows_per_day);
-
- if (week_view->events_need_layout || week_view->events_need_reshape)
- e_week_view_reshape_events (week_view);
-
- week_view->events_need_layout = FALSE;
- week_view->events_need_reshape = FALSE;
-}
-
-
-static void
-e_week_view_ensure_events_sorted (EWeekView *week_view)
-{
- if (!week_view->events_sorted) {
- qsort (week_view->events->data,
- week_view->events->len,
- sizeof (EWeekViewEvent),
- e_week_view_event_sort_func);
- week_view->events_sorted = TRUE;
- }
-}
-
-
-gint
-e_week_view_event_sort_func (const void *arg1,
- const void *arg2)
-{
- EWeekViewEvent *event1, *event2;
-
- event1 = (EWeekViewEvent*) arg1;
- event2 = (EWeekViewEvent*) arg2;
-
- if (event1->start < event2->start)
- return -1;
- if (event1->start > event2->start)
- return 1;
-
- if (event1->end > event2->end)
- return -1;
- if (event1->end < event2->end)
- return 1;
-
- return 0;
-}
-
-
-static void
-e_week_view_reshape_events (EWeekView *week_view)
-{
- EWeekViewEvent *event;
- gint event_num, span_num;
- gint num_days, day, day_x, day_y, day_w, day_h, max_rows;
- gboolean is_weekend;
-
- for (event_num = 0; event_num < week_view->events->len; event_num++) {
- event = &g_array_index (week_view->events, EWeekViewEvent,
- event_num);
- for (span_num = 0; span_num < event->num_spans; span_num++) {
- gchar *current_comp_string;
-
- e_week_view_reshape_event_span (week_view, event_num,
- span_num);
- current_comp_string = icalcomponent_as_ical_string (event->comp_data->icalcomp);
- if (week_view->last_edited_comp_string == NULL)
- continue;
- if (strncmp (current_comp_string, week_view->last_edited_comp_string,50) == 0) {
- EWeekViewEventSpan *span;
- span = &g_array_index (week_view->spans, EWeekViewEventSpan, event->spans_index + span_num);
- e_canvas_item_grab_focus (span->text_item, TRUE);
- week_view->last_edited_comp_string = NULL;
- }
- }
- }
-
- /* Reshape the jump buttons and show/hide them as appropriate. */
- num_days = week_view->multi_week_view ? week_view->weeks_shown * 7 : 7;
- for (day = 0; day < num_days; day++) {
-
- is_weekend = ((week_view->display_start_day + day) % 7 >= 5) ? TRUE : FALSE;
- if (!is_weekend || (week_view->multi_week_view
- && !week_view->compress_weekend))
- max_rows = week_view->rows_per_cell;
- else
- max_rows = week_view->rows_per_compressed_cell;
-
- /* Determine whether the jump button should be shown. */
- if (week_view->rows_per_day[day] <= max_rows) {
- gnome_canvas_item_hide (week_view->jump_buttons[day]);
- } else {
- e_week_view_get_day_position (week_view, day,
- &day_x, &day_y,
- &day_w, &day_h);
-
- gnome_canvas_item_set (week_view->jump_buttons[day],
- "GnomeCanvasPixbuf::x", (gdouble) (day_x + day_w - E_WEEK_VIEW_JUMP_BUTTON_X_PAD - E_WEEK_VIEW_JUMP_BUTTON_WIDTH),
- "GnomeCanvasPixbuf::y", (gdouble) (day_y + day_h - E_WEEK_VIEW_JUMP_BUTTON_Y_PAD - E_WEEK_VIEW_JUMP_BUTTON_HEIGHT),
- NULL);
-
- gnome_canvas_item_show (week_view->jump_buttons[day]);
- gnome_canvas_item_raise_to_top (week_view->jump_buttons[day]);
- }
- }
-
- for (day = num_days; day < E_WEEK_VIEW_MAX_WEEKS * 7; day++) {
- gnome_canvas_item_hide (week_view->jump_buttons[day]);
- }
-}
-
-
-static void
-e_week_view_reshape_event_span (EWeekView *week_view,
- gint event_num,
- gint span_num)
-{
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- gint span_x, span_y, span_w, num_icons, icons_width, time_width;
- gint min_text_x, max_text_w, width;
- gboolean show_icons = TRUE, use_max_width = FALSE;
- gboolean one_day_event;
- ECalComponent *comp;
- gdouble text_x, text_y, text_w, text_h;
- gchar *text, *end_of_line;
- gint line_len, text_width;
- PangoFontDescription *font_desc;
- PangoContext *pango_context;
- PangoFontMetrics *font_metrics;
- PangoLayout *layout;
-
- event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- event->spans_index + span_num);
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
- one_day_event = e_week_view_is_one_day_event (week_view, event_num);
-
- /* If the span will not be visible destroy the canvas items and
- return. */
- if (!e_week_view_get_span_position (week_view, event_num, span_num,
- &span_x, &span_y, &span_w)) {
- if (span->background_item)
- gtk_object_destroy (GTK_OBJECT (span->background_item));
- if (span->text_item)
- gtk_object_destroy (GTK_OBJECT (span->text_item));
- span->background_item = NULL;
- span->text_item = NULL;
-
- g_object_unref (comp);
- return;
- }
-
- /* Set up Pango prerequisites */
- font_desc = gtk_widget_get_style (GTK_WIDGET (week_view))->font_desc;
- pango_context = gtk_widget_get_pango_context (GTK_WIDGET (week_view));
- font_metrics = pango_context_get_metrics (pango_context, font_desc,
- pango_context_get_language (pango_context));
- layout = pango_layout_new (pango_context);
-
- /* If we are editing a long event we don't show the icons and the EText
- item uses the maximum width available. */
- if (!one_day_event && week_view->editing_event_num == event_num
- && week_view->editing_span_num == span_num) {
- show_icons = FALSE;
- use_max_width = TRUE;
- }
-
- /* Calculate how many icons we need to show. */
- num_icons = 0;
- if (show_icons) {
- GSList *categories_list, *elem;
-
- if (e_cal_component_has_alarms (comp))
- num_icons++;
- if (e_cal_component_has_recurrences (comp))
- num_icons++;
- if (e_cal_component_has_attachments (comp))
- num_icons++;
- if (event->different_timezone)
- num_icons++;
-
- e_cal_component_get_categories_list (comp, &categories_list);
- for (elem = categories_list; elem; elem = elem->next) {
- char *category;
- GdkPixmap *pixmap = NULL;
- GdkBitmap *mask = NULL;
-
- category = (char *) elem->data;
- if (e_categories_config_get_icon_for (category, &pixmap, &mask))
- num_icons++;
- }
-
- e_cal_component_free_categories_list (categories_list);
- }
-
- /* Create the background canvas item if necessary. */
- if (!span->background_item) {
- span->background_item =
- gnome_canvas_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (week_view->main_canvas)->root),
- e_week_view_event_item_get_type (),
- NULL);
- }
-
- gnome_canvas_item_set (span->background_item,
- "event_num", event_num,
- "span_num", span_num,
- NULL);
-
- /* Create the text item if necessary. */
- if (!span->text_item) {
- ECalComponentText text;
- GtkWidget *widget;
-
- widget = (GtkWidget *)week_view;
- e_cal_component_get_summary (comp, &text);
- span->text_item =
- gnome_canvas_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (week_view->main_canvas)->root),
- e_text_get_type (),
- "anchor", GTK_ANCHOR_NW,
- "clip", TRUE,
- "max_lines", 1,
- "editable", TRUE,
- "text", text.value ? text.value : "",
- "use_ellipsis", TRUE,
- "fill_color_gdk", &widget->style->text[GTK_STATE_NORMAL],
- "im_context", E_CANVAS (week_view->main_canvas)->im_context,
- NULL);
-
- g_signal_connect (span->text_item, "event",
- G_CALLBACK (e_week_view_on_text_item_event),
- week_view);
- g_signal_emit_by_name (G_OBJECT(week_view),
- "event_added", event);
-
- }
-
- /* Calculate the position of the text item.
- For events < 1 day it starts after the times & icons and ends at the
- right edge of the span.
- For events >= 1 day we need to determine whether times are shown at
- the start and end of the span, then try to center the text item with
- the icons in the middle, but making sure we don't go over the times.
- */
-
-
- /* Calculate the space necessary to display a time, e.g. "13:00". */
- time_width = e_week_view_get_time_string_width (week_view);
-
- /* Calculate the space needed for the icons. */
- icons_width = (E_WEEK_VIEW_ICON_WIDTH + E_WEEK_VIEW_ICON_X_PAD)
- * num_icons - E_WEEK_VIEW_ICON_X_PAD + E_WEEK_VIEW_ICON_R_PAD;
-
- /* The y position and height are the same for both event types. */
- text_y = span_y + E_WEEK_VIEW_EVENT_BORDER_HEIGHT
- + E_WEEK_VIEW_EVENT_TEXT_Y_PAD;
-
- text_h =
- PANGO_PIXELS (pango_font_metrics_get_ascent (font_metrics)) +
- PANGO_PIXELS (pango_font_metrics_get_descent (font_metrics));
-
- if (one_day_event) {
- /* Note that 1-day events don't have a border. Although we
- still use the border height to position the events
- vertically so they still line up neatly (see above),
- we don't use the border width or edge padding at all. */
- text_x = span_x + E_WEEK_VIEW_EVENT_L_PAD;
-
- switch (week_view->time_format) {
- case E_WEEK_VIEW_TIME_BOTH_SMALL_MIN:
- case E_WEEK_VIEW_TIME_BOTH:
- /* These have 2 time strings with a small space between
- them and some space before the EText item. */
- text_x += time_width * 2
- + E_WEEK_VIEW_EVENT_TIME_SPACING
- + E_WEEK_VIEW_EVENT_TIME_X_PAD;
- break;
- case E_WEEK_VIEW_TIME_START_SMALL_MIN:
- case E_WEEK_VIEW_TIME_START:
- /* These have just 1 time string with some space
- before the EText item. */
- text_x += time_width + E_WEEK_VIEW_EVENT_TIME_X_PAD;
- break;
- case E_WEEK_VIEW_TIME_NONE:
- break;
- }
-
- /* The icons_width includes space on the right of the icons. */
- text_x += icons_width;
-
- /* The width of the EText item extends right to the edge of the
- event, just inside the border. */
- text_w = span_x + span_w - E_WEEK_VIEW_EVENT_R_PAD - text_x;
-
- } else {
- if (use_max_width) {
- /* When we are editing the event we use all the
- available width. */
- text_x = span_x + E_WEEK_VIEW_EVENT_L_PAD
- + E_WEEK_VIEW_EVENT_BORDER_WIDTH
- + E_WEEK_VIEW_EVENT_EDGE_X_PAD;
- text_w = span_x + span_w - E_WEEK_VIEW_EVENT_R_PAD
- - E_WEEK_VIEW_EVENT_BORDER_WIDTH
- - E_WEEK_VIEW_EVENT_EDGE_X_PAD - text_x;
- } else {
- /* Get the width of the text of the event. This is a
- bit of a hack. It would be better if EText could
- tell us this. */
- g_object_get (G_OBJECT (span->text_item), "text", &text, NULL);
- text_width = 0;
- if (text) {
- /* It should only have one line of text in it.
- I'm not sure we need this any more. */
- end_of_line = strchr (text, '\n');
- if (end_of_line)
- line_len = end_of_line - text;
- else
- line_len = strlen (text);
-
- pango_layout_set_text (layout, text, line_len);
- pango_layout_get_pixel_size (layout, &text_width, NULL);
- g_free (text);
- }
-
- /* Add on the width of the icons and find the default
- position, which centers the icons + text. */
- width = text_width + icons_width;
- text_x = span_x + (span_w - width) / 2;
-
- /* Now calculate the left-most valid position, and make
- sure we don't go to the left of that. */
- min_text_x = span_x + E_WEEK_VIEW_EVENT_L_PAD
- + E_WEEK_VIEW_EVENT_BORDER_WIDTH
- + E_WEEK_VIEW_EVENT_EDGE_X_PAD;
- /* See if we will want to display the start time, and
- if so take that into account. */
- if (event->start > week_view->day_starts[span->start_day])
- min_text_x += time_width
- + E_WEEK_VIEW_EVENT_TIME_X_PAD;
-
- /* Now make sure we don't go to the left of the minimum
- position. */
- text_x = MAX (text_x, min_text_x);
-
- /* Now calculate the largest valid width, using the
- calculated x position, and make sure we don't
- exceed that. */
- max_text_w = span_x + span_w - E_WEEK_VIEW_EVENT_R_PAD
- - E_WEEK_VIEW_EVENT_BORDER_WIDTH
- - E_WEEK_VIEW_EVENT_EDGE_X_PAD - text_x;
- if (event->end < week_view->day_starts[span->start_day
- + span->num_days])
- max_text_w -= time_width
- + E_WEEK_VIEW_EVENT_TIME_X_PAD;
-
- text_w = MIN (width, max_text_w);
-
- /* Now take out the space for the icons. */
- text_x += icons_width;
- text_w -= icons_width;
- }
- }
-
- /* Make sure we don't try to use a negative width. */
- text_w = MAX (text_w, 0);
-
- gnome_canvas_item_set (span->text_item,
- "clip_width", (gdouble) text_w,
- "clip_height", (gdouble) text_h,
- NULL);
- e_canvas_item_move_absolute (span->text_item, text_x, text_y);
-
- g_object_unref (comp);
- g_object_unref (layout);
- pango_font_metrics_unref (font_metrics);
-}
-
-gboolean
-e_week_view_start_editing_event (EWeekView *week_view,
- gint event_num,
- gint span_num,
- gchar *initial_text)
-{
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- ETextEventProcessor *event_processor = NULL;
- ETextEventProcessorCommand command;
- ECalModelComponent *comp_data;
- gboolean read_only;
-
- /* If we are already editing the event, just return. */
- if (event_num == week_view->editing_event_num
- && span_num == week_view->editing_span_num)
- return TRUE;
-
- event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- event->spans_index + span_num);
-
- if (!e_cal_is_read_only (event->comp_data->client, &read_only, NULL) || read_only)
- return FALSE;
-
- /* If the event is not shown, don't try to edit it. */
- if (!span->text_item)
- return FALSE;
-
- if (initial_text) {
- gnome_canvas_item_set (span->text_item,
- "text", initial_text,
- NULL);
- }
-
- /* Save the comp_data value because we use that as our invariant */
- comp_data = event->comp_data;
-
- e_canvas_item_grab_focus (span->text_item, TRUE);
-
- /* If the above focus caused things to redraw, then find the
- * the event and the span again */
- if (event_num < week_view->events->len)
- event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
-
- if (event_num >= week_view->events->len || event->comp_data != comp_data) {
- /* Unfocussing can cause a removal but not a new
- * addition so just run backwards through the
- * events */
- for (event_num--; event_num >= 0; event_num--){
- event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
- if (event->comp_data == comp_data)
- break;
- }
- g_assert (event_num >= 0);
- }
- span = &g_array_index (week_view->spans, EWeekViewEventSpan, event->spans_index + span_num);
-
- /* Try to move the cursor to the end of the text. */
- g_object_get (G_OBJECT (span->text_item), "event_processor", &event_processor, NULL);
- if (event_processor) {
- command.action = E_TEP_MOVE;
- command.position = E_TEP_END_OF_BUFFER;
- g_signal_emit_by_name (event_processor,
- "command", &command);
- }
- return TRUE;
-}
-
-
-/* This stops any current edit. */
-void
-e_week_view_stop_editing_event (EWeekView *week_view)
-{
- GtkWidget *toplevel;
-
- /* Check we are editing an event. */
- if (week_view->editing_event_num == -1)
- return;
-
- /* Set focus to the toplevel so the item loses focus. */
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (week_view));
- if (toplevel && GTK_IS_WINDOW (toplevel))
- gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
-}
-
-
-/* Cancels the current edition by resetting the appointment's text to its original value */
-static void
-cancel_editing (EWeekView *week_view)
-{
- int event_num, span_num;
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- const gchar *summary;
-
- event_num = week_view->editing_event_num;
- span_num = week_view->editing_span_num;
-
- g_assert (event_num != -1);
-
- event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
- span = &g_array_index (week_view->spans, EWeekViewEventSpan, event->spans_index + span_num);
-
- /* Reset the text to what was in the component */
-
- summary = icalcomponent_get_summary (event->comp_data->icalcomp);
- g_object_set (G_OBJECT (span->text_item), "text", summary ? summary : "", NULL);
-
- /* Stop editing */
- e_week_view_stop_editing_event (week_view);
-}
-
-static gboolean
-e_week_view_on_text_item_event (GnomeCanvasItem *item,
- GdkEvent *gdkevent,
- EWeekView *week_view)
-{
- EWeekViewEvent *event;
- gint event_num, span_num;
-
-#if 0
- g_print ("In e_week_view_on_text_item_event\n");
-#endif
-
- switch (gdkevent->type) {
- case GDK_KEY_PRESS:
- if (gdkevent && gdkevent->key.keyval == GDK_Return) {
- /* We set the keyboard focus to the EDayView, so the
- EText item loses it and stops the edit. */
- gtk_widget_grab_focus (GTK_WIDGET (week_view));
-
- /* Stop the signal last or we will also stop any
- other events getting to the EText item. */
- gtk_signal_emit_stop_by_name (GTK_OBJECT (item),
- "event");
- return TRUE;
- } else if (gdkevent->key.keyval == GDK_Escape) {
- cancel_editing (week_view);
- gtk_signal_emit_stop_by_name (GTK_OBJECT (item), "event");
- /* focus should go to week view when stop editing */
- gtk_widget_grab_focus (GTK_WIDGET (week_view));
- return TRUE;
- }
- break;
- case GDK_2BUTTON_PRESS:
- if (!e_week_view_find_event_from_item (week_view, item,
- &event_num, &span_num))
- return FALSE;
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- event_num);
-
- e_calendar_view_edit_appointment (E_CALENDAR_VIEW (week_view),
- event->comp_data->client,
- event->comp_data->icalcomp, FALSE);
-
- gtk_signal_emit_stop_by_name (GTK_OBJECT (item), "event");
- return TRUE;
- case GDK_BUTTON_PRESS:
- if (!e_week_view_find_event_from_item (week_view, item,
- &event_num, &span_num))
- return FALSE;
-
- if (gdkevent->button.button == 3) {
- EWeekViewEvent *e;
-
- if (E_TEXT (item)->editing)
- e_week_view_stop_editing_event (week_view);
-
- e = &g_array_index (week_view->events, EWeekViewEvent, event_num);
-
- if (!GTK_WIDGET_HAS_FOCUS (week_view))
- gtk_widget_grab_focus (GTK_WIDGET (week_view));
-
- e_week_view_set_selected_time_range_visible (week_view, e->start, e->end);
-
- e_week_view_show_popup_menu (week_view,
- (GdkEventButton*) gdkevent,
- event_num);
-
- gtk_signal_emit_stop_by_name (GTK_OBJECT (item->canvas),
- "button_press_event");
- return TRUE;
- }
-
- if (gdkevent->button.button != 3) {
- week_view->pressed_event_num = event_num;
- week_view->pressed_span_num = span_num;
- }
-
- /* Only let the EText handle the event while editing. */
- if (!E_TEXT (item)->editing) {
- gtk_signal_emit_stop_by_name (GTK_OBJECT (item),
- "event");
-
- if (gdkevent) {
- week_view->drag_event_x = gdkevent->button.x;
- week_view->drag_event_y = gdkevent->button.y;
- } else
- g_warning ("No GdkEvent");
-
- /* FIXME: Remember the day offset from the start of
- the event, for DnD. */
-
- return TRUE;
- }
- break;
- case GDK_BUTTON_RELEASE:
- if (!E_TEXT (item)->editing) {
- /* This shouldn't ever happen. */
- if (!e_week_view_find_event_from_item (week_view,
- item,
- &event_num,
- &span_num))
- return FALSE;
-
- if (week_view->pressed_event_num != -1
- && week_view->pressed_event_num == event_num
- && week_view->pressed_span_num == span_num) {
- e_week_view_start_editing_event (week_view,
- event_num,
- span_num,
- NULL);
- week_view->pressed_event_num = -1;
- }
-
- /* Stop the signal last or we will also stop any
- other events getting to the EText item. */
- gtk_signal_emit_stop_by_name (GTK_OBJECT (item),
- "event");
- return TRUE;
- }
- week_view->pressed_event_num = -1;
- break;
- case GDK_FOCUS_CHANGE:
- if (gdkevent->focus_change.in) {
- e_week_view_on_editing_started (week_view, item);
- } else {
- e_week_view_on_editing_stopped (week_view, item);
- }
-
- return FALSE;
- default:
- break;
- }
-
- return FALSE;
-}
-
-static gboolean e_week_view_event_move (ECalendarView *cal_view, ECalViewMoveDirection direction)
-{
- EWeekViewEvent *event;
- gint event_num, span_num, adjust_days, current_start_day, current_end_day;
- time_t start_dt, end_dt;
- struct icaltimetype start_time,end_time;
- EWeekView *week_view = E_WEEK_VIEW (cal_view);
- gboolean is_all_day = FALSE;
-
- event_num = week_view->editing_event_num;
- span_num = week_view->editing_span_num;
- adjust_days = 0;
-
- /* If no item is being edited, just return. */
- if (event_num == -1)
- return FALSE;
-
- event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
-
- start_dt = event->start;
- end_dt = event->end;
- start_time = icalcomponent_get_dtstart (event->comp_data->icalcomp);
- end_time = icalcomponent_get_dtend (event->comp_data->icalcomp);
-
- if (start_time.is_date && end_time.is_date)
- is_all_day = TRUE;
-
- current_end_day = e_week_view_get_day_offset_of_event (week_view,end_dt);
-
- switch (direction) {
- case E_CAL_VIEW_MOVE_UP:
- adjust_days = e_week_view_get_adjust_days_for_move_up (week_view,current_end_day);
- break;
- case E_CAL_VIEW_MOVE_DOWN:
- adjust_days = e_week_view_get_adjust_days_for_move_down (week_view,current_end_day);
- break;
- case E_CAL_VIEW_MOVE_LEFT:
- adjust_days = e_week_view_get_adjust_days_for_move_left (week_view,current_end_day);
- break;
- case E_CAL_VIEW_MOVE_RIGHT:
- adjust_days = e_week_view_get_adjust_days_for_move_right (week_view,current_end_day);
- break;
- default:
- break;
- }
-
- icaltime_adjust (&start_time ,adjust_days,0,0,0);
- icaltime_adjust (&end_time ,adjust_days,0,0,0);
- start_dt = icaltime_as_timet_with_zone (start_time,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
- end_dt = icaltime_as_timet_with_zone (end_time,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
-
- current_start_day = e_week_view_get_day_offset_of_event (week_view,start_dt);
- current_end_day = e_week_view_get_day_offset_of_event (week_view,end_dt);
- if (is_all_day)
- current_end_day--;
-
- if (current_start_day < 0) {
- return TRUE;
- }
- if (week_view->multi_week_view) {
- if (current_end_day >= week_view->weeks_shown * 7) {
- return TRUE;
- }
- }else {
- if (current_end_day >= 7) {
- return TRUE;
- }
- }
-
- e_week_view_change_event_time (week_view, start_dt, end_dt, is_all_day);
- return TRUE;
-}
-
-static gint
-e_week_view_get_day_offset_of_event (EWeekView *week_view, time_t event_time)
-{
- time_t first_day = week_view->day_starts[0];
-
- if (event_time - first_day < 0)
- return -1;
- else
- return (event_time - first_day) / (24 * 60 * 60);
-}
-
-static void
-e_week_view_scroll_a_step (EWeekView *week_view, ECalViewMoveDirection direction)
-{
- GtkAdjustment *adj = GTK_RANGE (week_view->vscrollbar)->adjustment;
- gfloat new_value;
-
- switch (direction){
- case E_CAL_VIEW_MOVE_UP:
- new_value = adj->value - adj->step_increment;
- break;
- case E_CAL_VIEW_MOVE_DOWN:
- new_value = adj->value + adj->step_increment;
- break;
- default:
- return;
- }
-
- new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
- gtk_adjustment_set_value (adj, new_value);
-}
-
-static void
-e_week_view_change_event_time (EWeekView *week_view, time_t start_dt, time_t end_dt, gboolean is_all_day)
-{
- EWeekViewEvent *event;
- gint event_num;
- ECalComponent *comp;
- ECalComponentDateTime date;
- struct icaltimetype itt;
- ECal *client;
- CalObjModType mod = CALOBJ_MOD_ALL;
- GtkWindow *toplevel;
-
- event_num = week_view->editing_event_num;
-
- /* If no item is being edited, just return. */
- if (event_num == -1)
- return;
-
- event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
- client = event->comp_data->client;
-
- /* We use a temporary shallow copy of the ico since we don't want to
- change the original ico here. Otherwise we would not detect that
- the event's time had changed in the "update_event" callback. */
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
- date.value = &itt;
- /* FIXME: Should probably keep the timezone of the original start
- and end times. */
- date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
-
- *date.value = icaltime_from_timet_with_zone (start_dt, is_all_day,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
- e_cal_component_set_dtstart (comp, &date);
- *date.value = icaltime_from_timet_with_zone (end_dt, is_all_day,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
- e_cal_component_set_dtend (comp, &date);
-
- e_cal_component_commit_sequence (comp);
-
- if (week_view->last_edited_comp_string != NULL) {
- g_free (week_view->last_edited_comp_string);
- week_view->last_edited_comp_string = NULL;
- }
-
- week_view->last_edited_comp_string = e_cal_component_get_as_string (comp);
-
-
- if (e_cal_component_is_instance (comp)) {
- if (!recur_component_dialog (client, comp, &mod, NULL)) {
- gtk_widget_queue_draw (week_view->main_canvas);
- goto out;
- }
- }
-
- toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (week_view)));
-
- e_cal_component_commit_sequence (comp);
- e_calendar_view_modify_and_send (comp, client, mod, toplevel, TRUE);
-
-out:
- g_object_unref (comp);
-}
-
-static void
-e_week_view_on_editing_started (EWeekView *week_view,
- GnomeCanvasItem *item)
-{
- gint event_num, span_num;
-
- if (!e_week_view_find_event_from_item (week_view, item,
- &event_num, &span_num))
- return;
-
-#if 0
- g_print ("In e_week_view_on_editing_started event_num:%i span_num:%i\n", event_num, span_num);
-#endif
-
- week_view->editing_event_num = event_num;
- week_view->editing_span_num = span_num;
-
- /* We need to reshape long events so the whole width is used while
- editing. */
- if (!e_week_view_is_one_day_event (week_view, event_num)) {
- e_week_view_reshape_event_span (week_view, event_num,
- span_num);
- }
-
- g_signal_emit_by_name (week_view, "selection_changed");
-}
-
-
-static void
-e_week_view_on_editing_stopped (EWeekView *week_view,
- GnomeCanvasItem *item)
-{
- gint event_num, span_num;
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- gchar *text = NULL;
- ECalComponent *comp;
- ECalComponentText summary;
- ECal *client;
- const char *uid;
- gboolean on_server;
-
- /* Note: the item we are passed here isn't reliable, so we just stop
- the edit of whatever item was being edited. We also receive this
- event twice for some reason. */
- event_num = week_view->editing_event_num;
- span_num = week_view->editing_span_num;
-
- /* If no item is being edited, just return. */
- if (event_num == -1)
- return;
-
- event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- event->spans_index + span_num);
-
- /* Reset the edit fields. */
- week_view->editing_event_num = -1;
-
- /* Check that the event is still valid. */
- uid = icalcomponent_get_uid (event->comp_data->icalcomp);
- if (!uid)
- return;
-
- g_object_set (span->text_item, "handle_popup", FALSE, NULL);
- g_object_get (G_OBJECT (span->text_item), "text", &text, NULL);
- g_assert (text != NULL);
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
- client = event->comp_data->client;
- on_server = cal_comp_is_on_server (comp, client);
-
- if (string_is_empty (text) && !on_server) {
- const char *uid;
-
- e_cal_component_get_uid (comp, &uid);
-
- e_week_view_foreach_event_with_uid (week_view, uid,
- e_week_view_remove_event_cb, NULL);
- gtk_widget_queue_draw (week_view->main_canvas);
- e_week_view_check_layout (week_view);
- goto out;
- }
-
- /* Only update the summary if necessary. */
- e_cal_component_get_summary (comp, &summary);
- if (summary.value && !strcmp (text, summary.value)) {
- if (!e_week_view_is_one_day_event (week_view, event_num))
- e_week_view_reshape_event_span (week_view, event_num,
- span_num);
- } else if (summary.value || !string_is_empty (text)) {
- icalcomponent *icalcomp = e_cal_component_get_icalcomponent (comp);
-
- summary.value = text;
- summary.altrep = NULL;
- e_cal_component_set_summary (comp, &summary);
- e_cal_component_commit_sequence (comp);
-
- if (!on_server) {
- if (!e_cal_create_object (client, icalcomp, NULL, NULL))
- g_message (G_STRLOC ": Could not create the object!");
- else
- g_signal_emit_by_name (week_view, "user_created");
-
- /* we remove the object since we either got the update from the server or failed */
- e_week_view_remove_event_cb (week_view, event_num, NULL);
- } else {
- CalObjModType mod = CALOBJ_MOD_ALL;
- GtkWindow *toplevel;
-
- if (e_cal_component_is_instance (comp)) {
- if (!recur_component_dialog (client, comp, &mod, NULL)) {
- goto out;
- }
- }
-
- /* FIXME When sending here, what exactly should we send? */
- toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (week_view)));
- e_calendar_view_modify_and_send (comp, client, mod, toplevel, FALSE);
- }
- }
-
- out:
-
- g_free (text);
- g_object_unref (comp);
-
- g_signal_emit_by_name (week_view, "selection_changed");
-}
-
-
-gboolean
-e_week_view_find_event_from_item (EWeekView *week_view,
- GnomeCanvasItem *item,
- gint *event_num_return,
- gint *span_num_return)
-{
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- gint event_num, span_num, num_events;
-
- num_events = week_view->events->len;
- for (event_num = 0; event_num < num_events; event_num++) {
- event = &g_array_index (week_view->events, EWeekViewEvent,
- event_num);
- for (span_num = 0; span_num < event->num_spans; span_num++) {
- span = &g_array_index (week_view->spans,
- EWeekViewEventSpan,
- event->spans_index + span_num);
- if (span->text_item == item) {
- *event_num_return = event_num;
- *span_num_return = span_num;
- return TRUE;
- }
- }
- }
-
- return FALSE;
-}
-
-
-/* Finds the index of the event with the given uid.
- Returns TRUE if an event with the uid was found.
- Note that for recurring events there may be several EWeekViewEvents, one
- for each instance, all with the same iCalObject and uid. So only use this
- function if you know the event doesn't recur or you are just checking to
- see if any events with the uid exist. */
-static gboolean
-e_week_view_find_event_from_uid (EWeekView *week_view,
- ECal *client,
- const gchar *uid,
- const gchar *rid,
- gint *event_num_return)
-{
- EWeekViewEvent *event;
- gint event_num, num_events;
-
- *event_num_return = -1;
- if (!uid)
- return FALSE;
-
- num_events = week_view->events->len;
- for (event_num = 0; event_num < num_events; event_num++) {
- const char *u, *r;
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- event_num);
-
- if (event->comp_data->client != client)
- continue;
-
- u = icalcomponent_get_uid (event->comp_data->icalcomp);
- if (u && !strcmp (uid, u)) {
- if (rid && *rid) {
- r = icaltime_as_ical_string (icalcomponent_get_recurrenceid (event->comp_data->icalcomp));
- if (!r || !*r)
- continue;
- if (strcmp (rid, r) != 0)
- continue;
- }
-
- *event_num_return = event_num;
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-
-gboolean
-e_week_view_is_one_day_event (EWeekView *week_view,
- gint event_num)
-{
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
-
- event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
- if (event->num_spans != 1)
- return FALSE;
-
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- event->spans_index);
-
- if (event->start == week_view->day_starts[span->start_day]
- && event->end == week_view->day_starts[span->start_day + 1])
- return FALSE;
-
- if (span->num_days == 1
- && event->start >= week_view->day_starts[span->start_day]
- && event->end <= week_view->day_starts[span->start_day + 1])
- return TRUE;
-
- return FALSE;
-}
-
-static gint map_left[] = {0, 1, 2, 0, 1, 2, 2};
-static gint map_right[] = {3, 4, 5, 3, 4, 5, 6};
-
-static void
-e_week_view_do_cursor_key_up (EWeekView *week_view)
-{
- if (week_view->selection_start_day <= 0)
- return;
-
- week_view->selection_start_day--;
- week_view->selection_end_day = week_view->selection_start_day;
- g_signal_emit_by_name (week_view, "selected_time_changed");
- gtk_widget_queue_draw (week_view->main_canvas);
-}
-
-static void
-e_week_view_do_cursor_key_down (EWeekView *week_view)
-{
- if (week_view->selection_start_day == -1 ||
- week_view->selection_start_day >= 6)
- return;
-
- week_view->selection_start_day++;
- week_view->selection_end_day = week_view->selection_start_day;
- g_signal_emit_by_name (week_view, "selected_time_changed");
- gtk_widget_queue_draw (week_view->main_canvas);
-}
-
-static void
-e_week_view_do_cursor_key_left (EWeekView *week_view)
-{
- if (week_view->selection_start_day == -1)
- return;
-
- week_view->selection_start_day = map_left[week_view->selection_start_day];
- week_view->selection_end_day = week_view->selection_start_day;
- g_signal_emit_by_name (week_view, "selected_time_changed");
- gtk_widget_queue_draw (week_view->main_canvas);
-}
-
-static void
-e_week_view_do_cursor_key_right (EWeekView *week_view)
-{
- if (week_view->selection_start_day == -1)
- return;
-
- week_view->selection_start_day = map_right[week_view->selection_start_day];
- week_view->selection_end_day = week_view->selection_start_day;
- g_signal_emit_by_name (week_view, "selected_time_changed");
- gtk_widget_queue_draw (week_view->main_canvas);
-}
-
-static void
-e_month_view_do_cursor_key_up (EWeekView *week_view)
-{
- if (week_view->selection_start_day < 7)
- return;
-
- week_view->selection_start_day -= 7;
- week_view->selection_end_day = week_view->selection_start_day;
- g_signal_emit_by_name (week_view, "selected_time_changed");
- gtk_widget_queue_draw (week_view->main_canvas);
-}
-
-static void
-e_month_view_do_cursor_key_down (EWeekView *week_view)
-{
- gint weeks_shown = e_week_view_get_weeks_shown (week_view);
-
- if (week_view->selection_start_day == -1 ||
- week_view->selection_start_day >= (weeks_shown - 1) * 7)
- return;
-
- week_view->selection_start_day += 7;
- week_view->selection_end_day = week_view->selection_start_day;
- g_signal_emit_by_name (week_view, "selected_time_changed");
- gtk_widget_queue_draw (week_view->main_canvas);
-}
-
-static void
-e_month_view_do_cursor_key_left (EWeekView *week_view)
-{
- if (week_view->selection_start_day <= 0)
- return;
-
- week_view->selection_start_day--;
- week_view->selection_end_day = week_view->selection_start_day;
- g_signal_emit_by_name (week_view, "selected_time_changed");
- gtk_widget_queue_draw (week_view->main_canvas);
-}
-
-static void
-e_month_view_do_cursor_key_right (EWeekView *week_view)
-{
- gint weeks_shown = e_week_view_get_weeks_shown (week_view);
-
- if (week_view->selection_start_day == -1 ||
- week_view->selection_start_day >= weeks_shown * 7 - 1)
- return;
-
- week_view->selection_start_day++;
- week_view->selection_end_day = week_view->selection_start_day;
- g_signal_emit_by_name (week_view, "selected_time_changed");
- gtk_widget_queue_draw (week_view->main_canvas);
-}
-
-static void
-e_week_view_cursor_key_up (EWeekView *week_view, GnomeCalendarViewType view_type)
-{
- switch (view_type) {
- case GNOME_CAL_WEEK_VIEW:
- e_week_view_do_cursor_key_up (week_view);
- break;
- case GNOME_CAL_MONTH_VIEW:
- e_month_view_do_cursor_key_up (week_view);
- break;
- default:
- g_assert_not_reached ();
- }
-}
-
-static void
-e_week_view_cursor_key_down (EWeekView *week_view, GnomeCalendarViewType view_type)
-{
- switch (view_type) {
- case GNOME_CAL_WEEK_VIEW:
- e_week_view_do_cursor_key_down (week_view);
- break;
- case GNOME_CAL_MONTH_VIEW:
- e_month_view_do_cursor_key_down (week_view);
- break;
- default:
- g_assert_not_reached ();
- }
-}
-
-static void
-e_week_view_cursor_key_left (EWeekView *week_view, GnomeCalendarViewType view_type)
-{
- switch (view_type) {
- case GNOME_CAL_WEEK_VIEW:
- e_week_view_do_cursor_key_left (week_view);
- break;
- case GNOME_CAL_MONTH_VIEW:
- e_month_view_do_cursor_key_left (week_view);
- break;
- default:
- g_assert_not_reached ();
- }
-}
-
-static void
-e_week_view_cursor_key_right (EWeekView *week_view, GnomeCalendarViewType view_type)
-{
- switch (view_type) {
- case GNOME_CAL_WEEK_VIEW:
- e_week_view_do_cursor_key_right (week_view);
- break;
- case GNOME_CAL_MONTH_VIEW:
- e_month_view_do_cursor_key_right (week_view);
- break;
- default:
- g_assert_not_reached ();
- }
-}
-
-static gboolean
-e_week_view_do_key_press (GtkWidget *widget, GdkEventKey *event)
-{
- EWeekView *week_view;
- ECal *ecal;
- ECalModel *model;
- ECalComponent *comp;
- icalcomponent *icalcomp;
- gint event_num;
- gchar *initial_text;
- ECalComponentDateTime date;
- struct icaltimetype itt;
- time_t dtstart, dtend;
- const char *uid;
- AddEventData add_event_data;
- guint keyval;
- gboolean read_only = TRUE;
- gboolean stop_emission;
- GnomeCalendarViewType view_type;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (E_IS_WEEK_VIEW (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- week_view = E_WEEK_VIEW (widget);
- keyval = event->keyval;
-
- /* The Escape key aborts a resize operation. */
-#if 0
- if (week_view->resize_drag_pos != E_CALENDAR_VIEW_POS_NONE) {
- if (event->keyval == GDK_Escape) {
- e_week_view_abort_resize (week_view, event->time);
- }
- return FALSE;
- }
-#endif
-
- /* Handle the cursor keys for moving the selection */
- view_type = gnome_calendar_get_view (e_calendar_view_get_calendar (E_CALENDAR_VIEW (week_view)));
- stop_emission = FALSE;
- if (!(event->state & GDK_SHIFT_MASK)
- && !(event->state & GDK_MOD1_MASK)) {
- stop_emission = TRUE;
- switch (keyval) {
- case GDK_Up:
- e_week_view_cursor_key_up (week_view, view_type);
- break;
- case GDK_Down:
- e_week_view_cursor_key_down (week_view, view_type);
- break;
- case GDK_Left:
- e_week_view_cursor_key_left (week_view, view_type);
- break;
- case GDK_Right:
- e_week_view_cursor_key_right (week_view, view_type);
- break;
- default:
- stop_emission = FALSE;
- break;
- }
- }
- if (stop_emission)
- return TRUE;
-
- /*Navigation through days with arrow keys*/
- if (((event->state & GDK_SHIFT_MASK) != GDK_SHIFT_MASK)
- &&((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)
- &&((event->state & GDK_MOD1_MASK) == GDK_MOD1_MASK)) {
- if (keyval == GDK_Up || keyval == GDK_KP_Up)
- return e_week_view_event_move ((ECalendarView *) week_view, E_CAL_VIEW_MOVE_UP);
- else if (keyval == GDK_Down || keyval == GDK_KP_Down)
- return e_week_view_event_move ((ECalendarView *) week_view, E_CAL_VIEW_MOVE_DOWN);
- else if (keyval == GDK_Left || keyval == GDK_KP_Left)
- return e_week_view_event_move ((ECalendarView *) week_view, E_CAL_VIEW_MOVE_LEFT);
- else if (keyval == GDK_Right || keyval == GDK_KP_Right)
- return e_week_view_event_move ((ECalendarView *) week_view, E_CAL_VIEW_MOVE_RIGHT);
- }
-
- if (week_view->selection_start_day == -1)
- return FALSE;
-
- /* Check if the client is read only */
- model = e_calendar_view_get_model (E_CALENDAR_VIEW (week_view));
- ecal = e_cal_model_get_default_client (model);
- if (!e_cal_is_read_only (ecal, &read_only, NULL) || read_only)
- return FALSE;
-
- /* We only want to start an edit with a return key or a simple
- character. */
- if (event->keyval == GDK_Return) {
- initial_text = NULL;
- } else if (((event->keyval >= 0x20) && (event->keyval <= 0xFF)
- && (event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK)))
- || (event->length == 0)
- || (event->keyval == GDK_Tab)) {
- return FALSE;
- } else
- initial_text = e_utf8_from_gtk_event_key (widget, event->keyval, event->string);
-
- /* Add a new event covering the selected range. */
- icalcomp = e_cal_model_create_component_with_defaults (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)));
- if (!icalcomp)
- return FALSE;
- uid = icalcomponent_get_uid (icalcomp);
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomp);
-
- dtstart = week_view->day_starts[week_view->selection_start_day];
- dtend = week_view->day_starts[week_view->selection_end_day + 1];
-
- date.value = &itt;
- date.tzid = NULL;
-
- /* We use DATE values now, so we don't need the timezone. */
- /*date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));*/
-
- *date.value = icaltime_from_timet_with_zone (dtstart, TRUE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
- e_cal_component_set_dtstart (comp, &date);
-
- *date.value = icaltime_from_timet_with_zone (dtend, TRUE,
- e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
- e_cal_component_set_dtend (comp, &date);
-
- e_cal_component_set_categories (
- comp, e_calendar_view_get_default_category (E_CALENDAR_VIEW (week_view)));
-
- /* We add the event locally and start editing it. We don't send it
- to the server until the user finishes editing it. */
- add_event_data.week_view = week_view;
- add_event_data.comp_data = NULL;
- e_week_view_add_event (comp, dtstart, dtend, TRUE, &add_event_data);
- e_week_view_check_layout (week_view);
- gtk_widget_queue_draw (week_view->main_canvas);
-
- if (e_week_view_find_event_from_uid (week_view, ecal, uid, NULL, &event_num)) {
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- event_num);
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- event->spans_index + 0);
-
- /* If the event can't be fit on the screen, don't try to edit it. */
- if (!span->text_item) {
- e_week_view_foreach_event_with_uid (week_view, uid,
- e_week_view_remove_event_cb, NULL);
- } else {
- e_week_view_start_editing_event (week_view, event_num, 0,
- initial_text);
- }
-
- } else {
- g_warning ("Couldn't find event to start editing.\n");
- }
-
- if (initial_text)
- g_free (initial_text);
-
- g_object_unref (comp);
-
- return TRUE;
-}
-
-static void
-e_week_view_move_selection_day (EWeekView *week_view, ECalViewMoveDirection direction)
-{
- gint selection_start_day, selection_end_day;
-
- selection_start_day = week_view->selection_start_day;
- selection_end_day = week_view->selection_end_day;
-
- if (selection_start_day == -1) {
- selection_start_day = 0;
- selection_end_day = 0;
- }
-
- switch (direction) {
- case E_CAL_VIEW_MOVE_UP:
- selection_end_day += e_week_view_get_adjust_days_for_move_up (week_view,selection_end_day);
- break;
- case E_CAL_VIEW_MOVE_DOWN:
- selection_end_day += e_week_view_get_adjust_days_for_move_down (week_view,selection_end_day);
- break;
- case E_CAL_VIEW_MOVE_LEFT:
- selection_end_day += e_week_view_get_adjust_days_for_move_left (week_view,selection_end_day);
- break;
- case E_CAL_VIEW_MOVE_RIGHT:
- selection_end_day += e_week_view_get_adjust_days_for_move_right (week_view,selection_end_day);
- break;
- default:
- break;
- }
- if (selection_end_day < 0) {
- e_week_view_scroll_a_step (week_view, E_CAL_VIEW_MOVE_UP);
- selection_end_day +=7;
- }
- if (week_view->multi_week_view) {
- if (selection_end_day >= week_view->weeks_shown * 7) {
- e_week_view_scroll_a_step (week_view, E_CAL_VIEW_MOVE_DOWN);
- selection_end_day -=7;
- }
- }else {
- if (selection_end_day >= 7) {
- e_week_view_scroll_a_step (week_view, E_CAL_VIEW_MOVE_DOWN);
- selection_end_day -=7;
- }
- }
-
- week_view->selection_start_day = selection_end_day;
- week_view->selection_end_day = selection_end_day;
-
- gtk_widget_queue_draw (week_view->main_canvas);
- g_signal_emit_by_name (week_view, "selected_time_changed");
-}
-
-static gint
-e_week_view_get_adjust_days_for_move_up (EWeekView *week_view,gint current_day)
-{
- if (week_view->multi_week_view)
- return -7;
- else
- return 0;
-}
-
-static gint
-e_week_view_get_adjust_days_for_move_down (EWeekView *week_view,gint current_day)
-{
- if (week_view->multi_week_view)
- return 7;
- else
- return 0;
-}
-
-static gint
-e_week_view_get_adjust_days_for_move_left (EWeekView *week_view,gint current_day)
-{
- return -1;
-}
-
-static gint
-e_week_view_get_adjust_days_for_move_right (EWeekView *week_view,gint current_day)
-{
- return 1;
-}
-
-static gboolean
-e_week_view_key_press (GtkWidget *widget, GdkEventKey *event)
-{
- gboolean handled = FALSE;
- handled = e_week_view_do_key_press (widget, event);
-
- /* if not handled, try key bindings */
- if (!handled)
- handled = GTK_WIDGET_CLASS (e_week_view_parent_class)->key_press_event (widget, event);
- return handled;
-}
-
-static void
-popup_destroyed_cb (gpointer data, GObject *where_object_was)
-{
- EWeekView *week_view = data;
-
- week_view->popup_event_num = -1;
-}
-
-void
-e_week_view_show_popup_menu (EWeekView *week_view,
- GdkEventButton *bevent,
- gint event_num)
-{
- GtkMenu *popup;
-
- week_view->popup_event_num = event_num;
-
- popup = e_calendar_view_create_popup_menu (E_CALENDAR_VIEW (week_view));
- g_object_weak_ref (G_OBJECT (popup), popup_destroyed_cb, week_view);
- gtk_menu_popup (popup, NULL, NULL, NULL, NULL, bevent?bevent->button:0, bevent?bevent->time:gtk_get_current_event_time());
-}
-
-static gboolean
-e_week_view_popup_menu (GtkWidget *widget)
-{
- EWeekView *week_view = E_WEEK_VIEW (widget);
- e_week_view_show_popup_menu (week_view, NULL,
- week_view->editing_event_num);
- return TRUE;
-}
-
-void
-e_week_view_jump_to_button_item (EWeekView *week_view, GnomeCanvasItem *item)
-{
- gint day;
- GnomeCalendar *calendar;
-
- for (day = 0; day < E_WEEK_VIEW_MAX_WEEKS * 7; ++day) {
- if (item == week_view->jump_buttons[day]) {
- calendar = e_calendar_view_get_calendar (E_CALENDAR_VIEW (week_view));
- if (calendar)
- gnome_calendar_dayjump
- (calendar,
- week_view->day_starts[day]);
- else
- g_warning ("Calendar not set");
- return;
- }
- }
-}
-
-static gboolean
-e_week_view_on_jump_button_event (GnomeCanvasItem *item,
- GdkEvent *event,
- EWeekView *week_view)
-{
- gint day;
-
- if (event->type == GDK_BUTTON_PRESS) {
- e_week_view_jump_to_button_item (week_view, item);
- return TRUE;
- }
- else if (event->type == GDK_KEY_PRESS) {
- /* return, if Tab, Control or Alt is pressed */
- if ((event->key.keyval == GDK_Tab) ||
- (event->key.state & (GDK_CONTROL_MASK | GDK_MOD1_MASK)))
- return FALSE;
- /* with a return key or a simple character (from 0x20 to 0xff),
- * jump to the day
- */
- if ((event->key.keyval == GDK_Return) ||
- ((event->key.keyval >= 0x20) &&
- (event->key.keyval <= 0xFF))) {
- e_week_view_jump_to_button_item (week_view, item);
- return TRUE;
- }
- }
- else if (event->type == GDK_FOCUS_CHANGE) {
- GdkEventFocus *focus_event = (GdkEventFocus *)event;
- GdkPixbuf *pixbuf = NULL;
-
- for (day = 0; day < E_WEEK_VIEW_MAX_WEEKS * 7; day++) {
- if (item == week_view->jump_buttons[day])
- break;
- }
-
- if (focus_event->in) {
- week_view->focused_jump_button = day;
- pixbuf = gdk_pixbuf_new_from_xpm_data ((const char**) jump_xpm_focused);
- gnome_canvas_item_set (week_view->jump_buttons[day],
- "GnomeCanvasPixbuf::pixbuf",
- pixbuf, NULL);
- }
- else {
- week_view->focused_jump_button = E_WEEK_VIEW_JUMP_BUTTON_NO_FOCUS;
- pixbuf = gdk_pixbuf_new_from_xpm_data ((const char**) jump_xpm);
- gnome_canvas_item_set (week_view->jump_buttons[day],
- "GnomeCanvasPixbuf::pixbuf",
- pixbuf, NULL);
- }
- if (pixbuf)
- gdk_pixbuf_unref (pixbuf);
- }
-
- return FALSE;
-}
-
-
-/* Converts an hour from 0-23 to the preferred time format, and returns the
- suffix to add and the width of it in the normal font. */
-void
-e_week_view_convert_time_to_display (EWeekView *week_view,
- gint hour,
- gint *display_hour,
- gchar **suffix,
- gint *suffix_width)
-{
- /* Calculate the actual hour number to display. For 12-hour
- format we convert 0-23 to 12-11am/12-11pm. */
- *display_hour = hour;
- if (e_calendar_view_get_use_24_hour_format (E_CALENDAR_VIEW (week_view))) {
- *suffix = "";
- *suffix_width = 0;
- } else {
- if (hour < 12) {
- *suffix = week_view->am_string;
- *suffix_width = week_view->am_string_width;
- } else {
- *display_hour -= 12;
- *suffix = week_view->pm_string;
- *suffix_width = week_view->pm_string_width;
- }
-
- /* 12-hour uses 12:00 rather than 0:00. */
- if (*display_hour == 0)
- *display_hour = 12;
- }
-}
-
-
-gint
-e_week_view_get_time_string_width (EWeekView *week_view)
-{
- gint time_width;
-
- if (week_view->use_small_font && week_view->small_font_desc)
- time_width = week_view->digit_width * 2
- + week_view->small_digit_width * 2;
- else
- time_width = week_view->digit_width * 4
- + week_view->colon_width;
-
- if (!e_calendar_view_get_use_24_hour_format (E_CALENDAR_VIEW (week_view)))
- time_width += MAX (week_view->am_string_width,
- week_view->pm_string_width);
-
- return time_width;
-}
-
-/* Queues a layout, unless one is already queued. */
-static void
-e_week_view_queue_layout (EWeekView *week_view)
-{
- if (week_view->layout_timeout_id == 0) {
- week_view->layout_timeout_id = g_timeout_add (E_WEEK_VIEW_LAYOUT_TIMEOUT, e_week_view_layout_timeout_cb, week_view);
- }
-}
-
-
-/* Removes any queued layout. */
-static void
-e_week_view_cancel_layout (EWeekView *week_view)
-{
- if (week_view->layout_timeout_id != 0) {
- gtk_timeout_remove (week_view->layout_timeout_id);
- week_view->layout_timeout_id = 0;
- }
-}
-
-
-static gboolean
-e_week_view_layout_timeout_cb (gpointer data)
-{
- EWeekView *week_view = E_WEEK_VIEW (data);
-
- gtk_widget_queue_draw (week_view->main_canvas);
- e_week_view_check_layout (week_view);
-
- week_view->layout_timeout_id = 0;
- return FALSE;
-}
-
-
-/* Returns the number of selected events (0 or 1 at present). */
-gint
-e_week_view_get_num_events_selected (EWeekView *week_view)
-{
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), 0);
-
- return (week_view->editing_event_num != -1) ? 1 : 0;
-}
-
-gboolean
-e_week_view_is_jump_button_visible (EWeekView *week_view, gint day)
-{
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), FALSE);
-
- if ((day >= 0) && (day < E_WEEK_VIEW_MAX_WEEKS * 7))
- return week_view->jump_buttons[day]->object.flags & GNOME_CANVAS_ITEM_VISIBLE;
- return FALSE;
-}
diff --git a/calendar/gui/e-week-view.h b/calendar/gui/e-week-view.h
deleted file mode 100644
index 58ff08aa22..0000000000
--- a/calendar/gui/e-week-view.h
+++ /dev/null
@@ -1,444 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * Author :
- * Damon Chaplin <damon@ximian.com>
- *
- * Copyright 1999, Ximian, Inc.
- * Copyright 2001, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-#ifndef _E_WEEK_VIEW_H_
-#define _E_WEEK_VIEW_H_
-
-#include <gtk/gtktable.h>
-#include <libgnomecanvas/gnome-canvas.h>
-
-#include "e-calendar-view.h"
-#include "gnome-cal.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * EWeekView - displays the Week & Month views of the calendar.
- */
-
-/* The maximum number of weeks we show. 5 is usually enough for 1 month,
- but we allow 6 for longer selections. */
-#define E_WEEK_VIEW_MAX_WEEKS 6
-
-/* The size of the reminder & recurrence icons, and padding around them.
- X_PAD is the padding between icons. R_PAD is the padding on the right of
- the last icon, before the event text. */
-#define E_WEEK_VIEW_ICON_WIDTH 16
-#define E_WEEK_VIEW_ICON_HEIGHT 16
-#define E_WEEK_VIEW_ICON_X_PAD 1
-#define E_WEEK_VIEW_ICON_Y_PAD 1
-#define E_WEEK_VIEW_ICON_R_PAD 8
-
-/* The space on the left & right outside of the event. (The triangle to
- indicate the event continues is displayed in this space). */
-#define E_WEEK_VIEW_EVENT_L_PAD 2
-#define E_WEEK_VIEW_EVENT_R_PAD 2
-
-/* The vertical spacing between rows of events. */
-#define E_WEEK_VIEW_EVENT_Y_SPACING 1
-
-/* The size of the border around long events. */
-#define E_WEEK_VIEW_EVENT_BORDER_WIDTH 1
-#define E_WEEK_VIEW_EVENT_BORDER_HEIGHT 1
-
-/* The padding on the top and bottom of the event text. */
-#define E_WEEK_VIEW_EVENT_TEXT_Y_PAD 1
-
-/* The space between the start and end times. */
-#define E_WEEK_VIEW_EVENT_TIME_SPACING 2
-
-/* The space between the time and the event text or icons. */
-#define E_WEEK_VIEW_EVENT_TIME_X_PAD 8
-
-/* The space between the borders of long events and any text of icons. */
-#define E_WEEK_VIEW_EVENT_EDGE_X_PAD 2
-
-/* The padding above and on the right of the date string at the top of each
- cell. */
-#define E_WEEK_VIEW_DATE_T_PAD 2
-#define E_WEEK_VIEW_DATE_R_PAD 4
-
-/* The padding above and below the line under the date string, in the Week
- view, and also the space on the left of it. */
-#define E_WEEK_VIEW_DATE_LINE_T_PAD 1
-#define E_WEEK_VIEW_DATE_LINE_B_PAD 1
-#define E_WEEK_VIEW_DATE_LINE_L_PAD 10
-
-/* The padding below the date string in the Month view. */
-#define E_WEEK_VIEW_DATE_B_PAD 1
-
-/* We use a 7-bit field to store row numbers in EWeekViewEventSpan, so the
- maximum number or rows we can allow is 127. It is very unlikely to be
- reached anyway. */
-#define E_WEEK_VIEW_MAX_ROWS_PER_CELL 127
-
-/* These index our colors array. */
-typedef enum
-{
- E_WEEK_VIEW_COLOR_EVEN_MONTHS,
- E_WEEK_VIEW_COLOR_ODD_MONTHS,
- E_WEEK_VIEW_COLOR_EVENT_BACKGROUND,
- E_WEEK_VIEW_COLOR_EVENT_BORDER,
- E_WEEK_VIEW_COLOR_EVENT_TEXT,
- E_WEEK_VIEW_COLOR_GRID,
- E_WEEK_VIEW_COLOR_SELECTED,
- E_WEEK_VIEW_COLOR_SELECTED_UNFOCUSSED,
- E_WEEK_VIEW_COLOR_DATES,
- E_WEEK_VIEW_COLOR_DATES_SELECTED,
- E_WEEK_VIEW_COLOR_TODAY,
-
- E_WEEK_VIEW_COLOR_LAST
-} EWeekViewColors;
-
-/* These specify which part of the selection we are dragging, if any. */
-typedef enum
-{
- E_WEEK_VIEW_DRAG_NONE,
- E_WEEK_VIEW_DRAG_START,
- E_WEEK_VIEW_DRAG_END
-} EWeekViewDragPosition;
-
-/* These specify which times are shown for the 1-day events. We use the small
- font for the minutes if it can be loaded and the option is on. */
-typedef enum
-{
- E_WEEK_VIEW_TIME_NONE,
- E_WEEK_VIEW_TIME_START,
- E_WEEK_VIEW_TIME_BOTH,
- E_WEEK_VIEW_TIME_START_SMALL_MIN,
- E_WEEK_VIEW_TIME_BOTH_SMALL_MIN
-} EWeekViewTimeFormat;
-
-typedef struct _EWeekViewEventSpan EWeekViewEventSpan;
-struct _EWeekViewEventSpan {
- guint start_day : 6;
- guint num_days : 3;
- guint row : 7;
- GnomeCanvasItem *background_item;
- GnomeCanvasItem *text_item;
-};
-
-typedef struct _EWeekViewEvent EWeekViewEvent;
-struct _EWeekViewEvent {
- E_CALENDAR_VIEW_EVENT_FIELDS
- gint spans_index;
- guint8 num_spans;
-};
-
-
-#define E_WEEK_VIEW(obj) GTK_CHECK_CAST (obj, e_week_view_get_type (), EWeekView)
-#define E_WEEK_VIEW_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_week_view_get_type (), EWeekViewClass)
-#define E_IS_WEEK_VIEW(obj) GTK_CHECK_TYPE (obj, e_week_view_get_type ())
-
-
-typedef struct _EWeekView EWeekView;
-typedef struct _EWeekViewClass EWeekViewClass;
-
-struct _EWeekView
-{
- ECalendarView cal_view;
-
- /* The top canvas where the dates are shown. */
- GtkWidget *titles_canvas;
- GnomeCanvasItem *titles_canvas_item;
-
- /* The main canvas where the appointments are shown. */
- GtkWidget *main_canvas;
- GnomeCanvasItem *main_canvas_item;
-
- GnomeCanvasItem *jump_buttons[E_WEEK_VIEW_MAX_WEEKS * 7];
- gint focused_jump_button;
-
- GtkWidget *vscrollbar;
-
- /* The query object */
- ECalView *query;
-
- /* The array of EWeekViewEvent elements. */
- GArray *events;
- gboolean events_sorted;
- gboolean events_need_layout;
- gboolean events_need_reshape;
-
- /* The ID of the timeout function for doing a new layout. */
- gint layout_timeout_id;
-
- /* An array of EWeekViewEventSpan elements. Each event has its own
- space within this array, and uses the spans_index and num_spans
- fields of the EWeekViewEvent struct to access it. */
- GArray *spans;
-
- /* The start of each day displayed. */
- time_t day_starts[E_WEEK_VIEW_MAX_WEEKS * 7 + 1];
-
- /* The base date, where the adjustment value is 0. */
- GDate base_date;
-
- /* The first day shown in the view. */
- GDate first_day_shown;
-
- /* If we are displaying multiple weeks in rows. If this is FALSE only
- one week is shown, with a different layout. */
- gboolean multi_week_view;
-
- gboolean update_base_date;
-
- /* How many weeks we are showing. This is only relevant if
- display_month is TRUE. */
- gint weeks_shown;
-
- /* If Sat & Sun are compressed. Only applicable in month view, since
- they are always compressed into 1 cell in the week view. */
- gboolean compress_weekend;
-
- /* Whether we use show event end times. */
- gboolean show_event_end_times;
-
- /* The first day of the week, 0 (Monday) to 6 (Sunday). */
- gint week_start_day;
-
- /* The first day of the week we display, 0 (Monday) to 6 (Sunday).
- This will usually be week_start_day, but if the weekend is
- compressed, and week_start_day is Sunday we have to use Saturday. */
- gint display_start_day;
-
- /* The vertical offset of the events from the top of the cells. */
- gint events_y_offset;
-
- /* The height of the events, not including spacing between them. */
- gint row_height;
-
- /* The number of rows of events in each cell. */
- gint rows_per_cell;
- gint rows_per_compressed_cell;
-
- /* The number of rows we have used for each day (i.e. each cell) */
- gint rows_per_day[E_WEEK_VIEW_MAX_WEEKS * 7];
-
- /* If the small font is used for displaying the minutes. */
- gboolean use_small_font;
-
- /* Small font to display the minutes. */
- PangoFontDescription *small_font_desc;
-
- /* The widths of various pieces of text, used to determine which of
- several date formats to display, set in e_week_view_style_set(). */
- gint space_width; /* One space character ' '. */
- gint colon_width; /* Size of ':' in the font. */
- gint slash_width; /* Size of '/' in the font. */
- gint digit_width; /* Size of a '0' digit. */
- gint small_digit_width; /* Size of a small_font '0' digit. */
- gint day_widths[7]; /* Monday first. */
- gint max_day_width;
- gint abbr_day_widths[7];
- gint max_abbr_day_width;
- gint month_widths[12];
- gint max_month_width;
- gint abbr_month_widths[12];
- gint max_abbr_month_width;
-
- /* The size of the main grid of days and of the cells. A row
- corresponds to a compressed day, so normal days usually take
- up 2 rows. Note that the offsets arrays have one more element
- than the widths/heights arrays since they also contain the
- right/bottom edge. */
- gint rows;
- gint columns;
- gint col_widths[7];
- gint col_offsets[8];
- gint row_heights[E_WEEK_VIEW_MAX_WEEKS * 2];
- gint row_offsets[E_WEEK_VIEW_MAX_WEEKS * 2 + 1];
-
- /* This specifies which times we are showing for the events, depending
- on how much room is available. */
- EWeekViewTimeFormat time_format;
-
- /* The GC used for painting in different colors. */
- GdkGC *main_gc;
-
- /* The icons. */
- GdkPixbuf *reminder_icon;
- GdkPixbuf *recurrence_icon;
- GdkPixbuf *attach_icon;
- GdkPixbuf *timezone_icon;
-
- /* Colors for drawing. */
- GdkColor colors[E_WEEK_VIEW_COLOR_LAST];
-
- /* The normal & resizing cursors. */
- GdkCursor *normal_cursor;
- GdkCursor *move_cursor;
- GdkCursor *resize_width_cursor;
-
- /* This remembers the last cursor set on the window. */
- GdkCursor *last_cursor_set;
-
- /* The currently selected region, in days from the first day shown.
- If selection_start_day is -1 there is no current selection. */
- gint selection_start_day;
- gint selection_end_day;
-
- /* This specifies which end of the selection is being dragged, or is
- E_WEEK_VIEW_DRAG_NONE if the selection isn't being dragged. */
- EWeekViewDragPosition selection_drag_pos;
-
- /* This is the event the mouse button was pressed on. If the button
- is released we start editing it, but if the mouse is dragged we set
- this to -1. */
- gint pressed_event_num;
- gint pressed_span_num;
-
- /* The event span currently being edited. The num is -1 if no event is
- being edited. */
- gint editing_event_num;
- gint editing_span_num;
-
- /* This is used to remember the last edited event. */
- gchar *last_edited_comp_string;
-
- /* The event that the context menu is for. */
- gint popup_event_num;
-
- /* The last mouse position when dragging, in the entire canvas. */
- gint drag_event_x;
- gint drag_event_y;
-
- /* "am" and "pm" in the current locale, and their widths. */
- gchar *am_string;
- gchar *pm_string;
- gint am_string_width;
- gint pm_string_width;
-};
-
-struct _EWeekViewClass
-{
- ECalendarViewClass parent_class;
-};
-
-
-GtkType e_week_view_get_type (void);
-GtkWidget* e_week_view_new (void);
-
-/* The first day shown. Note that it will be rounded down to the start of a
- week when set. The returned value will be invalid if no date has been set
- yet. */
-void e_week_view_get_first_day_shown (EWeekView *week_view,
- GDate *date);
-void e_week_view_set_first_day_shown (EWeekView *week_view,
- GDate *date);
-
-/* The selected time range. The EWeekView will show the corresponding
- month and the days between start_time and end_time will be selected.
- To select a single day, use the same value for start_time & end_time. */
-void e_week_view_set_selected_time_range_visible (EWeekView *week_view,
- time_t start_time,
- time_t end_time);
-
-/* Whether to display 1 week or 1 month (5 weeks). It defaults to 1 week. */
-gboolean e_week_view_get_multi_week_view (EWeekView *week_view);
-void e_week_view_set_multi_week_view (EWeekView *week_view,
- gboolean multi_week_view);
-
-/* Whether to update the base date when the time range changes */
-gboolean e_week_view_get_update_base_date (EWeekView *week_view);
-void e_week_view_set_update_base_date (EWeekView *week_view, gboolean update_base_date);
-
-/* The number of weeks shown in the multi-week view. */
-gint e_week_view_get_weeks_shown (EWeekView *week_view);
-void e_week_view_set_weeks_shown (EWeekView *week_view,
- gint weeks_shown);
-
-/* Whether the weekend (Sat/Sun) should be compressed into 1 cell in the Month
- view. In the Week view they are always compressed. */
-gboolean e_week_view_get_compress_weekend (EWeekView *week_view);
-void e_week_view_set_compress_weekend (EWeekView *week_view,
- gboolean compress);
-
-/* Whether we display event end times. */
-gboolean e_week_view_get_show_event_end_times (EWeekView *week_view);
-void e_week_view_set_show_event_end_times (EWeekView *week_view,
- gboolean show);
-
-/* The first day of the week, 0 (Monday) to 6 (Sunday). */
-gint e_week_view_get_week_start_day (EWeekView *week_view);
-void e_week_view_set_week_start_day (EWeekView *week_view,
- gint week_start_day);
-
-void e_week_view_delete_occurrence (EWeekView *week_view);
-
-/* Returns the number of selected events (0 or 1 at present). */
-gint e_week_view_get_num_events_selected (EWeekView *week_view);
-
-/*
- * Internal functions called by the associated canvas items.
- */
-void e_week_view_get_day_position (EWeekView *week_view,
- gint day,
- gint *day_x,
- gint *day_y,
- gint *day_w,
- gint *day_h);
-gboolean e_week_view_get_span_position (EWeekView *week_view,
- gint event_num,
- gint span_num,
- gint *span_x,
- gint *span_y,
- gint *span_w);
-gboolean e_week_view_is_one_day_event (EWeekView *week_view,
- gint event_num);
-gboolean e_week_view_start_editing_event (EWeekView *week_view,
- gint event_num,
- gint span_num,
- gchar *initial_text);
-void e_week_view_stop_editing_event (EWeekView *week_view);
-
-void e_week_view_show_popup_menu (EWeekView *week_view,
- GdkEventButton *event,
- gint event_num);
-
-void e_week_view_convert_time_to_display (EWeekView *week_view,
- gint hour,
- gint *display_hour,
- gchar **suffix,
- gint *suffix_width);
-gint e_week_view_get_time_string_width (EWeekView *week_view);
-
-gint e_week_view_event_sort_func (const void *arg1,
- const void *arg2);
-
-gboolean e_week_view_find_event_from_item (EWeekView *week_view,
- GnomeCanvasItem *item,
- gint *event_num_return,
- gint *span_num_return);
-
-gboolean e_week_view_is_jump_button_visible (EWeekView *week_view,
- gint day);
-void e_week_view_jump_to_button_item (EWeekView *week_view, GnomeCanvasItem *item);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_WEEK_VIEW_H_ */
diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c
deleted file mode 100644
index a01e26b6a2..0000000000
--- a/calendar/gui/gnome-cal.c
+++ /dev/null
@@ -1,3305 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution calendar - Main calendar view widget
- *
- * Copyright (C) 1998 The Free Software Foundation
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2001 Ximian, Inc.
- * Copyright (C) 2003 Novell, Inc
- *
- * Authors: Miguel de Icaza <miguel@ximian.com>
- * Federico Mena-Quintero <federico@ximian.com>
- * Seth Alves <alves@hungry.com>
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <unistd.h>
-#include <math.h>
-#include <signal.h>
-#include <sys/wait.h>
-#include <fcntl.h>
-#include <glib.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtkbindings.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnome/gnome-util.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <libgnomeui/gnome-dialog-util.h>
-#include <bonobo/bonobo-exception.h>
-#include <libedataserver/e-categories.h>
-#include <libedataserver/e-url.h>
-#include "e-util/e-config-listener.h"
-#include "shell/e-user-creatable-items-handler.h"
-#include <libecal/e-cal-time-util.h>
-#include <gal/menus/gal-view-factory-etable.h>
-#include <gal/menus/gal-view-etable.h>
-#include <gal/menus/gal-define-views-dialog.h>
-#include "widgets/menus/gal-view-menus.h"
-#include "widgets/misc/e-error.h"
-#include "e-comp-editor-registry.h"
-#include "dialogs/delete-error.h"
-#include "dialogs/event-editor.h"
-#include "dialogs/task-editor.h"
-#include "comp-util.h"
-#include "e-calendar-marshal.h"
-#include "e-cal-model-calendar.h"
-#include "e-day-view.h"
-#include "e-day-view-config.h"
-#include "e-day-view-time-item.h"
-#include "e-week-view.h"
-#include "e-week-view-config.h"
-#include "e-cal-list-view.h"
-#include "e-cal-list-view-config.h"
-#include "e-mini-calendar-config.h"
-#include "e-calendar-table-config.h"
-#include "evolution-calendar.h"
-#include "gnome-cal.h"
-#include "calendar-component.h"
-#include "cal-search-bar.h"
-#include "calendar-commands.h"
-#include "calendar-config.h"
-#include "calendar-view.h"
-#include "calendar-view-factory.h"
-#include "tag-calendar.h"
-#include "misc.h"
-#include "ea-calendar.h"
-#include "common/authentication.h"
-#include "e-cal-popup.h"
-#include "e-cal-menu.h"
-
-/* FIXME glib 2.4 and above has this */
-#ifndef G_MAXINT32
-#define G_MAXINT32 ((gint32) 0x7fffffff)
-#endif
-
-
-
-/* Private part of the GnomeCalendar structure */
-struct _GnomeCalendarPrivate {
- /* The clients for display */
-
- GHashTable *clients[E_CAL_SOURCE_TYPE_LAST];
- GList *clients_list[E_CAL_SOURCE_TYPE_LAST];
- ECal *default_client[E_CAL_SOURCE_TYPE_LAST];
-
- EConfigListener *config_listener;
-
- /*
- * Fields for the calendar view
- */
-
- /* This is the last time explicitly selected by the user */
- time_t base_view_time;
-
- /* Widgets */
-
- GtkWidget *search_bar;
-
- GtkWidget *hpane;
- GtkWidget *notebook;
- GtkWidget *vpane;
-
- ECalendar *date_navigator;
- EMiniCalendarConfig *date_navigator_config;
- GtkWidget *todo;
- ECalendarTableConfig *todo_config;
-
- GtkWidget *day_view;
- GtkWidget *work_week_view;
- GtkWidget *week_view;
- GtkWidget *month_view;
- GtkWidget *list_view;
-
- /* Activity */
- EActivityHandler *activity_handler;
-
- /* plugin menu managers */
- ECalMenu *calendar_menu;
- ECalMenu *taskpad_menu;
-
- /* Calendar query for the date navigator */
- GList *dn_queries; /* list of CalQueries */
- char *sexp;
- char *todo_sexp;
- guint update_timeout;
-
- /* This is the view currently shown. We use it to keep track of the
- positions of the panes. range_selected is TRUE if a range of dates
- was selected in the date navigator to show the view. */
- ECalendarView *views[GNOME_CAL_LAST_VIEW];
- GObject *configs[GNOME_CAL_LAST_VIEW];
- GnomeCalendarViewType current_view_type;
- GList *notifications;
-
- gboolean range_selected;
-
- /* These are the saved positions of the panes. They are multiples of
- calendar month widths & heights in the date navigator, so that they
- will work OK after theme changes. */
- gint hpane_pos;
- gint vpane_pos;
- gint hpane_pos_month_view;
- gint vpane_pos_month_view;
-
- /* The signal handler id for our GtkCalendar "day_selected" handler. */
- guint day_selected_id;
-
- /* View instance and menus for the control */
- GalViewInstance *view_instance;
- GalViewMenus *view_menus;
-
- /* Our current week start */
- int week_start;
-
- /* Our current timezone. */
- icaltimezone *zone;
-
- /* The dates currently shown. If they are -1 then we have no dates
- shown. We only use these to check if we need to emit a
- 'dates-shown-changed' signal.*/
- time_t visible_start;
- time_t visible_end;
-};
-
-/* Signal IDs */
-
-enum {
- DATES_SHOWN_CHANGED,
- CALENDAR_SELECTION_CHANGED,
- TASKPAD_SELECTION_CHANGED,
- CALENDAR_FOCUS_CHANGE,
- TASKPAD_FOCUS_CHANGE,
- GOTO_DATE,
- SOURCE_ADDED,
- SOURCE_REMOVED,
- LAST_SIGNAL
-};
-
-/* Used to indicate who has the focus within the calendar view */
-typedef enum {
- FOCUS_CALENDAR,
- FOCUS_TASKPAD,
- FOCUS_OTHER
-} FocusLocation;
-
-static guint gnome_calendar_signals[LAST_SIGNAL];
-
-
-
-
-static void gnome_calendar_destroy (GtkObject *object);
-static void gnome_calendar_goto_date (GnomeCalendar *gcal,
- GnomeCalendarGotoDateType goto_date);
-
-static void gnome_calendar_set_pane_positions (GnomeCalendar *gcal);
-static void update_view_times (GnomeCalendar *gcal, time_t start_time);
-static void gnome_calendar_update_date_navigator (GnomeCalendar *gcal);
-
-static void gnome_calendar_hpane_realized (GtkWidget *w, GnomeCalendar *gcal);
-static void gnome_calendar_vpane_realized (GtkWidget *w, GnomeCalendar *gcal);
-static gboolean gnome_calendar_vpane_resized (GtkWidget *w, GdkEventButton *e, GnomeCalendar *gcal);
-static gboolean gnome_calendar_hpane_resized (GtkWidget *w, GdkEventButton *e, GnomeCalendar *gcal);
-
-static void gnome_calendar_on_date_navigator_date_range_changed (ECalendarItem *calitem,
- GnomeCalendar *gcal);
-static void gnome_calendar_on_date_navigator_selection_changed (ECalendarItem *calitem,
- GnomeCalendar *gcal);
-static void gnome_calendar_notify_dates_shown_changed (GnomeCalendar *gcal);
-
-static void update_query (GnomeCalendar *gcal);
-
-static void update_todo_view (GnomeCalendar *gcal);
-
-G_DEFINE_TYPE (GnomeCalendar, gnome_calendar, GTK_TYPE_VBOX);
-
-/* Class initialization function for the gnome calendar */
-static void
-gnome_calendar_class_init (GnomeCalendarClass *class)
-{
- GtkObjectClass *object_class;
- GtkBindingSet *binding_set;
-
- object_class = (GtkObjectClass *) class;
-
- gnome_calendar_signals[DATES_SHOWN_CHANGED] =
- gtk_signal_new ("dates_shown_changed",
- GTK_RUN_LAST,
- G_TYPE_FROM_CLASS (object_class),
- GTK_SIGNAL_OFFSET (GnomeCalendarClass,
- dates_shown_changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gnome_calendar_signals[CALENDAR_SELECTION_CHANGED] =
- gtk_signal_new ("calendar_selection_changed",
- GTK_RUN_LAST,
- G_TYPE_FROM_CLASS (object_class),
- GTK_SIGNAL_OFFSET (GnomeCalendarClass, calendar_selection_changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gnome_calendar_signals[TASKPAD_SELECTION_CHANGED] =
- gtk_signal_new ("taskpad_selection_changed",
- GTK_RUN_LAST,
- G_TYPE_FROM_CLASS (object_class),
- GTK_SIGNAL_OFFSET (GnomeCalendarClass, taskpad_selection_changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gnome_calendar_signals[CALENDAR_FOCUS_CHANGE] =
- gtk_signal_new ("calendar_focus_change",
- GTK_RUN_FIRST,
- G_TYPE_FROM_CLASS (object_class),
- GTK_SIGNAL_OFFSET (GnomeCalendarClass, calendar_focus_change),
- gtk_marshal_NONE__BOOL,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_BOOL);
-
- gnome_calendar_signals[TASKPAD_FOCUS_CHANGE] =
- gtk_signal_new ("taskpad_focus_change",
- GTK_RUN_FIRST,
- G_TYPE_FROM_CLASS (object_class),
- GTK_SIGNAL_OFFSET (GnomeCalendarClass, taskpad_focus_change),
- gtk_marshal_NONE__BOOL,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_BOOL);
-
- gnome_calendar_signals[SOURCE_ADDED] =
- g_signal_new ("source_added",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GnomeCalendarClass, source_added),
- NULL, NULL,
- e_calendar_marshal_VOID__INT_OBJECT,
- G_TYPE_NONE,
- 2,
- G_TYPE_INT, G_TYPE_OBJECT);
-
- gnome_calendar_signals[SOURCE_REMOVED] =
- g_signal_new ("source_removed",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GnomeCalendarClass, source_removed),
- NULL, NULL,
- e_calendar_marshal_VOID__INT_OBJECT,
- G_TYPE_NONE,
- 2,
- G_TYPE_INT, G_TYPE_OBJECT);
-
- gnome_calendar_signals[GOTO_DATE] =
- g_signal_new ("goto_date",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
- G_STRUCT_OFFSET (GnomeCalendarClass, goto_date),
- NULL, NULL,
- g_cclosure_marshal_VOID__INT,
- G_TYPE_NONE,
- 1,
- G_TYPE_INT);
-
- object_class->destroy = gnome_calendar_destroy;
-
- class->dates_shown_changed = NULL;
- class->calendar_selection_changed = NULL;
- class->taskpad_selection_changed = NULL;
- class->calendar_focus_change = NULL;
- class->taskpad_focus_change = NULL;
- class->source_added = NULL;
- class->source_removed = NULL;
- class->goto_date = gnome_calendar_goto_date;
-
- /*
- * Key bindings
- */
-
- binding_set = gtk_binding_set_by_class (class);
-
- /* Alt+PageUp/PageDown, go to the first/last day of the month */
- gtk_binding_entry_add_signal (binding_set, GDK_Page_Up,
- GDK_MOD1_MASK,
- "goto_date", 1,
- G_TYPE_ENUM,
- GNOME_CAL_GOTO_FIRST_DAY_OF_MONTH);
- gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Up,
- GDK_MOD1_MASK,
- "goto_date", 1,
- G_TYPE_ENUM,
- GNOME_CAL_GOTO_FIRST_DAY_OF_MONTH);
- gtk_binding_entry_add_signal (binding_set, GDK_Page_Down,
- GDK_MOD1_MASK,
- "goto_date", 1,
- G_TYPE_ENUM,
- GNOME_CAL_GOTO_LAST_DAY_OF_MONTH);
- gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Down,
- GDK_MOD1_MASK,
- "goto_date", 1,
- G_TYPE_ENUM,
- GNOME_CAL_GOTO_LAST_DAY_OF_MONTH);
-
- /* Alt+Home/End, go to the first/last day of the week */
- gtk_binding_entry_add_signal (binding_set, GDK_Home,
- GDK_MOD1_MASK,
- "goto_date", 1,
- G_TYPE_ENUM,
- GNOME_CAL_GOTO_FIRST_DAY_OF_WEEK);
- gtk_binding_entry_add_signal (binding_set, GDK_End,
- GDK_MOD1_MASK,
- "goto_date", 1,
- G_TYPE_ENUM,
- GNOME_CAL_GOTO_LAST_DAY_OF_WEEK);
- gtk_binding_entry_add_signal (binding_set, GDK_KP_Home,
- GDK_MOD1_MASK,
- "goto_date", 1,
- G_TYPE_ENUM,
- GNOME_CAL_GOTO_FIRST_DAY_OF_WEEK);
- gtk_binding_entry_add_signal (binding_set, GDK_KP_End,
- GDK_MOD1_MASK,
- "goto_date", 1,
- G_TYPE_ENUM,
- GNOME_CAL_GOTO_LAST_DAY_OF_WEEK);
-
- /*Alt+Left/Right, go to the same day of the previous/next week*/
- gtk_binding_entry_add_signal (binding_set,GDK_Left,
- GDK_MOD1_MASK,
- "goto_date",1,
- G_TYPE_ENUM,
- GNOME_CAL_GOTO_SAME_DAY_OF_PREVIOUS_WEEK);
- gtk_binding_entry_add_signal (binding_set,GDK_KP_Left,
- GDK_MOD1_MASK,
- "goto_date",1,
- G_TYPE_ENUM,
- GNOME_CAL_GOTO_SAME_DAY_OF_PREVIOUS_WEEK);
- gtk_binding_entry_add_signal (binding_set,GDK_Right,
- GDK_MOD1_MASK,
- "goto_date",1,
- G_TYPE_ENUM,
- GNOME_CAL_GOTO_SAME_DAY_OF_NEXT_WEEK);
- gtk_binding_entry_add_signal (binding_set,GDK_KP_Right,
- GDK_MOD1_MASK,
- "goto_date",1,
- G_TYPE_ENUM,
- GNOME_CAL_GOTO_SAME_DAY_OF_NEXT_WEEK);
- /* init the accessibility support for gnome_calendar */
- gnome_calendar_a11y_init ();
-
-}
-
-/* Callback used when the calendar query reports of an updated object */
-static void
-dn_e_cal_view_objects_added_cb (ECalView *query, GList *objects, gpointer data)
-{
- GnomeCalendar *gcal;
- GnomeCalendarPrivate *priv;
- GList *l;
-
- gcal = GNOME_CALENDAR (data);
- priv = gcal->priv;
-
- for (l = objects; l; l = l->next) {
- ECalComponent *comp = NULL;
-
- comp = e_cal_component_new ();
- if (!e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (l->data))) {
- g_object_unref (comp);
-
- continue;
- }
-
- tag_calendar_by_comp (priv->date_navigator, comp, e_cal_view_get_client (query), NULL,
- FALSE, TRUE);
- g_object_unref (comp);
- }
-}
-
-static void
-dn_e_cal_view_objects_modified_cb (ECalView *query, GList *objects, gpointer data)
-{
- GnomeCalendar *gcal;
- GnomeCalendarPrivate *priv;
-
- gcal = GNOME_CALENDAR (data);
- priv = gcal->priv;
-
- /* We have to retag the whole thing: an event may change dates
- * and the tag_calendar_by_comp() below would not know how to
- * untag the old dates.
- */
- update_query (gcal);
-}
-
-/* Callback used when the calendar query reports of a removed object */
-static void
-dn_e_cal_view_objects_removed_cb (ECalView *query, GList *uids, gpointer data)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- /* Just retag the whole thing */
- update_query (gcal);
-}
-
-/* Callback used when the calendar query is done */
-static void
-dn_e_cal_view_done_cb (ECalView *query, ECalendarStatus status, gpointer data)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- /* FIXME Better error reporting */
- if (status != E_CALENDAR_STATUS_OK)
- g_warning (G_STRLOC ": Query did not successfully complete");
-}
-
-/* Returns the current view widget, an EDayView, EWeekView or ECalListView. */
-GtkWidget*
-gnome_calendar_get_current_view_widget (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
-
- priv = gcal->priv;
-
- return GTK_WIDGET (priv->views[priv->current_view_type]);
-}
-
-static void
-get_times_for_views (GnomeCalendar *gcal, GnomeCalendarViewType view_type, time_t *start_time, time_t *end_time)
-{
- GnomeCalendarPrivate *priv;
- int shown, display_start;
- GDate date;
- gint weekday, first_day, last_day, days_shown, i;
- gboolean has_working_days = FALSE;
- guint offset;
- struct icaltimetype tt = icaltime_null_time ();
-
- priv = gcal->priv;
-
- switch (view_type) {
- case GNOME_CAL_DAY_VIEW:
- shown = e_day_view_get_days_shown (E_DAY_VIEW (priv->views[view_type]));
- *start_time = time_day_begin_with_zone (*start_time, priv->zone);
- *end_time = time_add_day_with_zone (*start_time, shown, priv->zone);
- break;
- case GNOME_CAL_WORK_WEEK_VIEW:
- /* FIXME Kind of gross, but it works */
- time_to_gdate_with_zone (&date, *start_time, priv->zone);
-
- /* The start of the work-week is the first working day after the
- week start day. */
-
- /* Get the weekday corresponding to start_time, 0 (Sun) to 6 (Sat). */
- weekday = g_date_weekday (&date) % 7;
-
- /* Find the first working day in the week, 0 (Sun) to 6 (Sat). */
- first_day = (E_DAY_VIEW (priv->views[view_type])->week_start_day + 1) % 7;
- for (i = 0; i < 7; i++) {
- if (E_DAY_VIEW (priv->views[view_type])->working_days & (1 << first_day)) {
- has_working_days = TRUE;
- break;
- }
- first_day = (first_day + 1) % 7;
- }
-
- if (has_working_days) {
- /* Now find the last working day of the week, backwards. */
- last_day = E_DAY_VIEW (priv->views[view_type])->week_start_day % 7;
- for (i = 0; i < 7; i++) {
- if (E_DAY_VIEW (priv->views[view_type])->working_days & (1 << last_day))
- break;
- last_day = (last_day + 6) % 7;
- }
- /* Now calculate the days we need to show to include all the
- working days in the week. Add 1 to make it inclusive. */
- days_shown = (last_day + 7 - first_day) % 7 + 1;
- } else {
- /* If no working days are set, just use 7. */
- days_shown = 7;
- }
-
- /* Calculate how many days we need to go back to the first workday. */
- if (weekday < first_day) {
- offset = (first_day - weekday) % 7;
- g_date_add_days (&date, offset);
- } else {
- offset = (weekday - first_day) % 7;
- g_date_subtract_days (&date, offset);
- }
-
- tt.year = g_date_year (&date);
- tt.month = g_date_month (&date);
- tt.day = g_date_day (&date);
-
- *start_time = icaltime_as_timet_with_zone (tt, priv->zone);
- *end_time = time_add_day_with_zone (*start_time, days_shown, priv->zone);
- break;
- case GNOME_CAL_WEEK_VIEW:
- /* FIXME We should be using the same day of the week enum every where */
- display_start = (E_WEEK_VIEW (priv->views[view_type])->display_start_day + 1) % 7;
-
- *start_time = time_week_begin_with_zone (*start_time, display_start, priv->zone);
- *end_time = time_add_week_with_zone (*start_time, 1, priv->zone);
- break;
- case GNOME_CAL_MONTH_VIEW:
- shown = e_week_view_get_weeks_shown (E_WEEK_VIEW (priv->views[view_type]));
- /* FIXME We should be using the same day of the week enum every where */
- display_start = (E_WEEK_VIEW (priv->views[view_type])->display_start_day + 1) % 7;
-
- if (!priv->range_selected)
- *start_time = time_month_begin_with_zone (*start_time, priv->zone);
- *start_time = time_week_begin_with_zone (*start_time, display_start, priv->zone);
- *end_time = time_add_week_with_zone (*start_time, shown, priv->zone);
- break;
- case GNOME_CAL_LIST_VIEW:
- /* FIXME What to do here? */
- *start_time = time_month_begin_with_zone (*start_time, priv->zone);
- *end_time = time_add_month_with_zone (*start_time, 1, priv->zone);
- break;
- default:
- g_assert_not_reached ();
- return;
- }
-}
-
-/* Gets the focus location based on who is the focused widget within the
- * calendar view.
- */
-static FocusLocation
-get_focus_location (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- ETable *etable;
-
- priv = gcal->priv;
-
- etable = e_calendar_table_get_table (E_CALENDAR_TABLE (priv->todo));
-
- if (GTK_WIDGET_HAS_FOCUS (etable->table_canvas))
- return FOCUS_TASKPAD;
- else {
- GtkWidget *widget;
- EDayView *dv;
- EWeekView *wv;
- ECalListView *lv;
-
- widget = gnome_calendar_get_current_view_widget (gcal);
-
- switch (priv->current_view_type) {
- case GNOME_CAL_DAY_VIEW:
- case GNOME_CAL_WORK_WEEK_VIEW:
- dv = E_DAY_VIEW (widget);
-
- if (GTK_WIDGET_HAS_FOCUS (dv->top_canvas)
- || GNOME_CANVAS (dv->top_canvas)->focused_item != NULL
- || GTK_WIDGET_HAS_FOCUS (dv->main_canvas)
- || GNOME_CANVAS (dv->main_canvas)->focused_item != NULL)
- return FOCUS_CALENDAR;
- else
- return FOCUS_OTHER;
-
- case GNOME_CAL_WEEK_VIEW:
- case GNOME_CAL_MONTH_VIEW:
- wv = E_WEEK_VIEW (widget);
-
- if (GTK_WIDGET_HAS_FOCUS (wv->main_canvas)
- || GNOME_CANVAS (wv->main_canvas)->focused_item != NULL)
- return FOCUS_CALENDAR;
- else
- return FOCUS_OTHER;
-
- case GNOME_CAL_LIST_VIEW:
- lv = E_CAL_LIST_VIEW (widget);
-
- if (GTK_WIDGET_HAS_FOCUS (e_table_scrolled_get_table (lv->table_scrolled)))
- return FOCUS_CALENDAR;
- else
- return FOCUS_OTHER;
-
- default:
- g_assert_not_reached ();
- return FOCUS_OTHER;
- }
- }
-}
-
-/* Computes the range of time that the date navigator is showing */
-static void
-get_date_navigator_range (GnomeCalendar *gcal, time_t *start_time, time_t *end_time)
-{
- GnomeCalendarPrivate *priv;
- gint start_year, start_month, start_day;
- gint end_year, end_month, end_day;
- struct icaltimetype start_tt;
- struct icaltimetype end_tt;
-
- priv = gcal->priv;
-
- start_tt = icaltime_null_time ();
- end_tt = icaltime_null_time ();
-
- if (!e_calendar_item_get_date_range (priv->date_navigator->calitem,
- &start_year, &start_month, &start_day,
- &end_year, &end_month, &end_day)) {
- *start_time = -1;
- *end_time = -1;
- return;
- }
-
- start_tt.year = start_year;
- start_tt.month = start_month + 1;
- start_tt.day = start_day;
-
- end_tt.year = end_year;
- end_tt.month = end_month + 1;
- end_tt.day = end_day;
-
- icaltime_adjust (&end_tt, 1, 0, 0, 0);
-
- *start_time = icaltime_as_timet_with_zone (start_tt, priv->zone);
- *end_time = icaltime_as_timet_with_zone (end_tt, priv->zone);
-}
-
-/* Adjusts a given query sexp with the time range of the date navigator */
-static char *
-adjust_e_cal_view_sexp (GnomeCalendar *gcal, const char *sexp)
-{
- time_t start_time, end_time;
- char *start, *end;
- char *new_sexp;
-
- get_date_navigator_range (gcal, &start_time, &end_time);
- if (start_time == -1 || end_time == -1)
- return NULL;
-
- start = isodate_from_time_t (start_time);
- end = isodate_from_time_t (end_time);
-
- new_sexp = g_strdup_printf ("(and (occur-in-time-range? (make-time \"%s\")"
- " (make-time \"%s\"))"
- " %s)",
- start, end,
- sexp);
-
-
- g_free (start);
- g_free (end);
-
- return new_sexp;
-}
-
-/* Restarts a query for the date navigator in the calendar */
-static void
-update_query (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- ECalView *old_query;
- char *real_sexp;
- GList *l;
-
- priv = gcal->priv;
-
- e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), _("Updating query"));
- e_calendar_item_clear_marks (priv->date_navigator->calitem);
-
- /* free the previous queries */
- for (l = priv->dn_queries; l != NULL; l = l->next) {
- old_query = l->data;
-
- if (old_query) {
- g_signal_handlers_disconnect_matched (old_query, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, gcal);
- g_object_unref (old_query);
- }
- }
-
- g_list_free (priv->dn_queries);
- priv->dn_queries = NULL;
-
- g_assert (priv->sexp != NULL);
-
- real_sexp = adjust_e_cal_view_sexp (gcal, priv->sexp);
- if (!real_sexp) {
- e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL);
- return; /* No time range is set, so don't start a query */
- }
-
- /* create queries for each loaded client */
- for (l = priv->clients_list[E_CAL_SOURCE_TYPE_EVENT]; l != NULL; l = l->next) {
- /* don't create queries for clients not loaded yet */
- if (e_cal_get_load_state ((ECal *) l->data) != E_CAL_LOAD_LOADED)
- continue;
-
- old_query = NULL;
- if (!e_cal_get_query ((ECal *) l->data, real_sexp, &old_query, NULL)) {
- g_warning (G_STRLOC ": Could not create the query");
-
- continue;
- }
-
- g_signal_connect (old_query, "objects_added",
- G_CALLBACK (dn_e_cal_view_objects_added_cb), gcal);
- g_signal_connect (old_query, "objects_modified",
- G_CALLBACK (dn_e_cal_view_objects_modified_cb), gcal);
- g_signal_connect (old_query, "objects_removed",
- G_CALLBACK (dn_e_cal_view_objects_removed_cb), gcal);
- g_signal_connect (old_query, "view_done",
- G_CALLBACK (dn_e_cal_view_done_cb), gcal);
-
- priv->dn_queries = g_list_append (priv->dn_queries, old_query);
-
- e_cal_view_start (old_query);
- }
-
- /* free memory */
- g_free (real_sexp);
- e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL);
- update_todo_view (gcal);
-}
-
-static void
-set_search_query (GnomeCalendar *gcal, const char *sexp)
-{
- GnomeCalendarPrivate *priv;
- int i;
-
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
- g_return_if_fail (sexp != NULL);
-
- priv = gcal->priv;
-
- /* Set the query on the date navigator */
-
- if (priv->sexp)
- g_free (priv->sexp);
-
- priv->sexp = g_strdup (sexp);
-
- update_query (gcal);
-
- /* Set the query on the views */
- for (i = 0; i < GNOME_CAL_LAST_VIEW; i++)
- e_cal_model_set_search_query (e_calendar_view_get_model (priv->views[i]), sexp);
-
- /* Set the query on the task pad */
- update_todo_view (gcal);
-}
-
-/* Returns the current time, for the ECalendarItem. */
-static struct tm
-get_current_time (ECalendarItem *calitem, gpointer data)
-{
- GnomeCalendar *cal = data;
- struct tm tmp_tm = { 0 };
- struct icaltimetype tt;
-
- g_return_val_if_fail (cal != NULL, tmp_tm);
- g_return_val_if_fail (GNOME_IS_CALENDAR (cal), tmp_tm);
-
- tt = icaltime_from_timet_with_zone (time (NULL), FALSE,
- cal->priv->zone);
-
- /* Now copy it to the struct tm and return it. */
- tmp_tm = icaltimetype_to_tm (&tt);
-
- return tmp_tm;
-}
-
-/* Callback used when the sexp changes in the calendar search bar */
-static void
-search_bar_sexp_changed_cb (CalSearchBar *cal_search, const char *sexp, gpointer data)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
- set_search_query (gcal, sexp);
-}
-
-/* Callback used when the selected category in the search bar changes */
-static void
-search_bar_category_changed_cb (CalSearchBar *cal_search, const char *category, gpointer data)
-{
- GnomeCalendar *gcal;
- GnomeCalendarPrivate *priv;
- ECalModel *model;
- int i;
-
- gcal = GNOME_CALENDAR (data);
- priv = gcal->priv;
-
- for (i = 0; i < GNOME_CAL_LAST_VIEW; i++) {
- e_calendar_view_set_default_category (E_CALENDAR_VIEW (priv->views[i]),
- category);
- }
-
- model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo));
- e_cal_model_set_default_category (model, category);
-}
-
-static void
-view_selection_changed_cb (GtkWidget *view, GnomeCalendar *gcal)
-{
- gtk_signal_emit (GTK_OBJECT (gcal),
- gnome_calendar_signals[CALENDAR_SELECTION_CHANGED]);
-}
-
-static void
-user_created_cb (GtkWidget *view, GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- ECal *ecal;
- ECalModel *model;
-
- priv = gcal->priv;
-
- model = e_calendar_view_get_model (priv->views[priv->current_view_type]);
- ecal = e_cal_model_get_default_client (model);
-
- gnome_calendar_add_source (gcal, E_CAL_SOURCE_TYPE_EVENT, e_cal_get_source (ecal));
-}
-
-
-/* Callback used when the taskpad receives a focus event. We emit the
- * corresponding signal so that parents can change the menus as appropriate.
- */
-static gint
-table_canvas_focus_change_cb (GtkWidget *widget, GdkEventFocus *event, gpointer data)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- gtk_signal_emit (GTK_OBJECT (gcal), gnome_calendar_signals [TASKPAD_FOCUS_CHANGE],
- event->in ? TRUE : FALSE);
-
- return FALSE;
-}
-
-static gint
-calendar_focus_change_cb (GtkWidget *widget, GdkEventFocus *event, gpointer data)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
-
- gtk_signal_emit (GTK_OBJECT (gcal), gnome_calendar_signals [CALENDAR_FOCUS_CHANGE],
- event->in ? TRUE : FALSE);
-
- return FALSE;
-}
-
-/* Connects to the focus change signals of a day view widget */
-static void
-connect_day_view_focus (GnomeCalendar *gcal, EDayView *dv)
-{
- g_signal_connect_after (dv->top_canvas, "focus_in_event",
- G_CALLBACK (calendar_focus_change_cb), gcal);
- g_signal_connect_after (dv->top_canvas, "focus_out_event",
- G_CALLBACK (calendar_focus_change_cb), gcal);
-
- g_signal_connect_after (dv->main_canvas, "focus_in_event",
- G_CALLBACK (calendar_focus_change_cb), gcal);
- g_signal_connect_after (dv->main_canvas, "focus_out_event",
- G_CALLBACK (calendar_focus_change_cb), gcal);
-}
-
-/* Connects to the focus change signals of a week view widget */
-static void
-connect_week_view_focus (GnomeCalendar *gcal, EWeekView *wv)
-{
- if (!E_IS_WEEK_VIEW (wv))
- return;
-
- g_signal_connect (wv->main_canvas, "focus_in_event",
- G_CALLBACK (calendar_focus_change_cb), gcal);
- g_signal_connect (wv->main_canvas, "focus_out_event",
- G_CALLBACK (calendar_focus_change_cb), gcal);
-}
-
-static void
-connect_list_view_focus (GnomeCalendar *gcal, ECalListView *lv)
-{
- ETable *etable;
-
- etable = e_table_scrolled_get_table (lv->table_scrolled);
-
- g_signal_connect (etable->table_canvas, "focus_in_event",
- G_CALLBACK (calendar_focus_change_cb), gcal);
- g_signal_connect (etable->table_canvas, "focus_out_event",
- G_CALLBACK (calendar_focus_change_cb), gcal);
-}
-
-/* Callback used when the selection in the taskpad table changes. We just proxy
- * the signal with our own one.
- */
-static void
-table_selection_change_cb (ETable *etable, gpointer data)
-{
- GnomeCalendar *gcal;
- int n_selected;
-
- gcal = GNOME_CALENDAR (data);
-
- n_selected = e_table_selected_count (etable);
- gtk_signal_emit (GTK_OBJECT (gcal), gnome_calendar_signals[TASKPAD_SELECTION_CHANGED]);
-}
-
-static void
-set_week_start (GnomeCalendar *calendar)
-{
- GnomeCalendarPrivate *priv;
-
- priv = calendar->priv;
-
- priv->week_start = calendar_config_get_week_start_day ();
-
- /* Only do this if views exist */
- if (priv->day_view && priv->work_week_view && priv->week_view && priv->month_view && priv->list_view) {
- update_view_times (calendar, priv->base_view_time);
- gnome_calendar_update_date_navigator (calendar);
- gnome_calendar_notify_dates_shown_changed (calendar);
- }
-}
-
-static void
-week_start_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- GnomeCalendar *calendar = data;
-
- set_week_start (calendar);
-}
-
-static void
-set_working_days (GnomeCalendar *calendar)
-{
- GnomeCalendarPrivate *priv;
-
- priv = calendar->priv;
-
- /* Only do this if views exist */
- if (priv->day_view && priv->work_week_view && priv->week_view && priv->month_view && priv->list_view) {
- update_view_times (calendar, priv->base_view_time);
- gnome_calendar_update_date_navigator (calendar);
- gnome_calendar_notify_dates_shown_changed (calendar);
- }
-}
-
-static void
-working_days_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- GnomeCalendar *calendar = data;
-
- set_working_days (calendar);
-}
-
-static void
-set_timezone (GnomeCalendar *calendar)
-{
- GnomeCalendarPrivate *priv;
- int i;
-
- priv = calendar->priv;
-
- priv->zone = calendar_config_get_icaltimezone ();
-
- for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) {
- GList *l;
-
- for (l = priv->clients_list[i]; l != NULL; l = l->next) {
- ECal *client = l->data;
-
- if (e_cal_get_load_state (client) == E_CAL_LOAD_LOADED)
- /* FIXME Error checking */
- e_cal_set_default_timezone (client, priv->zone, NULL);
- }
-
- if (priv->default_client[i]
- && e_cal_get_load_state (priv->default_client[i]) == E_CAL_LOAD_LOADED)
- /* FIXME Error checking */
- e_cal_set_default_timezone (priv->default_client[i], priv->zone, NULL);
- }
-}
-
-static void
-timezone_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- GnomeCalendar *calendar = data;
-
- set_timezone (calendar);
-}
-
-static void
-update_todo_view (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- ECalModel *model;
- char *sexp = NULL;
-
- priv = gcal->priv;
-
- /* Set the query on the task pad */
- if (priv->todo_sexp) {
- g_free (priv->todo_sexp);
- }
-
- model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo));
-
- if ((sexp = calendar_config_get_hide_completed_tasks_sexp()) != NULL) {
- priv->todo_sexp = g_strdup_printf ("(and %s %s)", sexp, priv->sexp);
- e_cal_model_set_search_query (model, priv->todo_sexp);
- g_free (sexp);
- } else {
- priv->todo_sexp = g_strdup (priv->sexp);
- e_cal_model_set_search_query (model, priv->todo_sexp);
- }
-
-}
-
-static gboolean
-update_todo_view_cb (GnomeCalendar *gcal)
-{
- update_todo_view(gcal);
-
- return TRUE;
-}
-
-static void
-config_hide_completed_tasks_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- update_todo_view (data);
-}
-
-static void
-setup_config (GnomeCalendar *calendar)
-{
- GnomeCalendarPrivate *priv;
- guint not;
-
- priv = calendar->priv;
-
- /* Week Start */
- set_week_start (calendar);
- not = calendar_config_add_notification_week_start_day (week_start_changed_cb, calendar);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Working Days */
- set_working_days (calendar);
- not = calendar_config_add_notification_working_days (working_days_changed_cb, calendar);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Timezone */
- set_timezone (calendar);
- not = calendar_config_add_notification_timezone (timezone_changed_cb, calendar);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Hide completed tasks */
- not = calendar_config_add_notification_hide_completed_tasks (config_hide_completed_tasks_changed_cb,
- calendar);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- not = calendar_config_add_notification_hide_completed_tasks_units (config_hide_completed_tasks_changed_cb,
- calendar);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- not = calendar_config_add_notification_hide_completed_tasks_value (config_hide_completed_tasks_changed_cb,
- calendar);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Pane positions */
- priv->hpane_pos = calendar_config_get_hpane_pos ();
- priv->vpane_pos = calendar_config_get_vpane_pos ();
- priv->hpane_pos_month_view = calendar_config_get_month_hpane_pos ();
- priv->vpane_pos_month_view = calendar_config_get_month_vpane_pos ();
-}
-
-static void
-update_adjustment (GnomeCalendar *gcal, GtkAdjustment *adjustment, EWeekView *week_view)
-{
- GDate date;
- gint week_offset;
- struct icaltimetype start_tt = icaltime_null_time ();
- time_t lower;
- guint32 old_first_day_julian, new_first_day_julian;
-
- /* If we don't have a valid date set yet, just return. */
- if (!g_date_valid (&week_view->first_day_shown))
- return;
-
- /* Determine the first date shown. */
- date = week_view->base_date;
- week_offset = floor (adjustment->value + 0.5);
- g_date_add_days (&date, week_offset * 7);
-
- /* Convert the old & new first days shown to julian values. */
- old_first_day_julian = g_date_julian (&week_view->first_day_shown);
- new_first_day_julian = g_date_julian (&date);
-
- /* If we are already showing the date, just return. */
- if (old_first_day_julian == new_first_day_julian)
- return;
-
- /* Convert it to a time_t. */
- start_tt.year = g_date_year (&date);
- start_tt.month = g_date_month (&date);
- start_tt.day = g_date_day (&date);
-
- lower = icaltime_as_timet_with_zone (start_tt, gcal->priv->zone);
-
- e_week_view_set_update_base_date (week_view, FALSE);
- update_view_times (gcal, lower);
- gnome_calendar_update_date_navigator (gcal);
- gnome_calendar_notify_dates_shown_changed (gcal);
- e_week_view_set_update_base_date (week_view, TRUE);
-}
-
-static void
-week_view_adjustment_changed_cb (GtkAdjustment *adjustment, GnomeCalendar *gcal)
-{
- update_adjustment (gcal, adjustment, E_WEEK_VIEW (gcal->priv->week_view));
-}
-
-static void
-month_view_adjustment_changed_cb (GtkAdjustment *adjustment, GnomeCalendar *gcal)
-{
- update_adjustment (gcal, adjustment, E_WEEK_VIEW (gcal->priv->month_view));
-}
-
-static void
-config_categories_changed_cb (EConfigListener *config_listener, const char *key, gpointer user_data)
-{
- GList *cat_list;
- GPtrArray *cat_array;
- GnomeCalendarPrivate *priv;
- GnomeCalendar *gcal = user_data;
-
- priv = gcal->priv;
-
- cat_array = g_ptr_array_new ();
- cat_list = e_categories_get_list ();
- while (cat_list != NULL) {
- if (e_categories_is_searchable ((const char *) cat_list->data))
- g_ptr_array_add (cat_array, cat_list->data);
- cat_list = g_list_remove (cat_list, cat_list->data);
- }
-
- cal_search_bar_set_categories (priv->search_bar, cat_array);
-
- g_ptr_array_free (cat_array, TRUE);
-}
-
-static void
-setup_widgets (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- GtkWidget *w;
- gchar *filename;
- ETable *etable;
- GtkAdjustment *adjustment;
- int i;
-
- priv = gcal->priv;
-
- priv->search_bar = cal_search_bar_new (CAL_SEARCH_CALENDAR_DEFAULT);
- g_signal_connect (priv->search_bar, "sexp_changed",
- G_CALLBACK (search_bar_sexp_changed_cb), gcal);
- g_signal_connect (priv->search_bar, "category_changed",
- G_CALLBACK (search_bar_category_changed_cb), gcal);
- config_categories_changed_cb (priv->config_listener, "/apps/evolution/general/category_master_list", gcal);
-
- gtk_widget_show (priv->search_bar);
- gtk_box_pack_start (GTK_BOX (gcal), priv->search_bar, FALSE, FALSE, 6);
-
- /* The main HPaned, with the notebook of calendar views on the left
- and the ECalendar and ToDo list on the right. */
- priv->hpane = gtk_hpaned_new ();
- g_signal_connect_after(priv->hpane, "realize",
- G_CALLBACK(gnome_calendar_hpane_realized), gcal);
- g_signal_connect (priv->hpane, "button_release_event",
- G_CALLBACK (gnome_calendar_hpane_resized), gcal);
- gtk_widget_show (priv->hpane);
- gtk_box_pack_start (GTK_BOX (gcal), priv->hpane, TRUE, TRUE, 6);
-
- /* The Notebook containing the 4 calendar views. */
- priv->notebook = gtk_notebook_new ();
- gtk_notebook_set_show_border (GTK_NOTEBOOK (priv->notebook), FALSE);
- gtk_notebook_set_show_tabs (GTK_NOTEBOOK (priv->notebook), FALSE);
- gtk_widget_show (priv->notebook);
- gtk_paned_pack1 (GTK_PANED (priv->hpane), priv->notebook, FALSE, TRUE);
-
- /* The VPaned widget, to contain the GtkCalendar & ToDo list. */
- priv->vpane = gtk_vpaned_new ();
- g_signal_connect_after (priv->vpane, "realize",
- G_CALLBACK(gnome_calendar_vpane_realized), gcal);
- g_signal_connect (priv->vpane, "button_release_event",
- G_CALLBACK (gnome_calendar_vpane_resized), gcal);
- gtk_widget_show (priv->vpane);
- gtk_paned_pack2 (GTK_PANED (priv->hpane), priv->vpane, TRUE, TRUE);
-
- /* The ECalendar. */
- w = e_calendar_new ();
- priv->date_navigator = E_CALENDAR (w);
- priv->date_navigator_config = e_mini_calendar_config_new (priv->date_navigator);
- e_calendar_item_set_days_start_week_sel (priv->date_navigator->calitem, 9);
- e_calendar_item_set_max_days_sel (priv->date_navigator->calitem, 42);
- gtk_widget_show (w);
- e_calendar_item_set_get_time_callback (priv->date_navigator->calitem,
- (ECalendarItemGetTimeCallback) get_current_time,
- gcal, NULL);
-
- gtk_paned_pack1 (GTK_PANED (priv->vpane), w, FALSE, TRUE);
-
- g_signal_connect (priv->date_navigator->calitem, "selection_changed",
- G_CALLBACK (gnome_calendar_on_date_navigator_selection_changed), gcal);
- g_signal_connect (priv->date_navigator->calitem, "date_range_changed",
- G_CALLBACK (gnome_calendar_on_date_navigator_date_range_changed), gcal);
-
- /* The ToDo list. */
- priv->todo = e_calendar_table_new ();
- priv->todo_config = e_calendar_table_config_new (E_CALENDAR_TABLE (priv->todo));
- gtk_paned_pack2 (GTK_PANED (priv->vpane), priv->todo, TRUE, TRUE);
- gtk_widget_show (priv->todo);
-
- filename = g_build_filename (calendar_component_peek_config_directory (calendar_component_peek ()),
- "TaskPad", NULL);
- e_calendar_table_load_state (E_CALENDAR_TABLE (priv->todo), filename);
-
- update_todo_view (gcal);
- g_free (filename);
-
- etable = e_calendar_table_get_table (E_CALENDAR_TABLE (priv->todo));
- g_signal_connect (etable->table_canvas, "focus_in_event",
- G_CALLBACK (table_canvas_focus_change_cb), gcal);
- g_signal_connect (etable->table_canvas, "focus_out_event",
- G_CALLBACK (table_canvas_focus_change_cb), gcal);
-
- g_signal_connect (etable, "selection_change",
- G_CALLBACK (table_selection_change_cb), gcal);
-
- /* Timeout check to hide completed items */
- priv->update_timeout = g_timeout_add_full (G_PRIORITY_LOW, 60000, (GSourceFunc) update_todo_view_cb, gcal, NULL);
-
- /* The Day View. */
- priv->day_view = e_day_view_new ();
- e_calendar_view_set_calendar (E_CALENDAR_VIEW (priv->day_view), gcal);
- e_calendar_view_set_timezone (E_CALENDAR_VIEW (priv->day_view), priv->zone);
- g_signal_connect (priv->day_view, "selection_changed",
- G_CALLBACK (view_selection_changed_cb), gcal);
- connect_day_view_focus (gcal, E_DAY_VIEW (priv->day_view));
-
- /* The Work Week View. */
- priv->work_week_view = e_day_view_new ();
- e_day_view_set_work_week_view (E_DAY_VIEW (priv->work_week_view),
- TRUE);
- e_day_view_set_days_shown (E_DAY_VIEW (priv->work_week_view), 5);
- e_calendar_view_set_calendar (E_CALENDAR_VIEW (priv->work_week_view), gcal);
- e_calendar_view_set_timezone (E_CALENDAR_VIEW (priv->work_week_view), priv->zone);
- connect_day_view_focus (gcal, E_DAY_VIEW (priv->work_week_view));
-
- /* The Week View. */
- priv->week_view = e_week_view_new ();
- e_calendar_view_set_calendar (E_CALENDAR_VIEW (priv->week_view), gcal);
- e_calendar_view_set_timezone (E_CALENDAR_VIEW (priv->week_view), priv->zone);
- g_signal_connect (priv->week_view, "selection_changed",
- G_CALLBACK (view_selection_changed_cb), gcal);
-
- connect_week_view_focus (gcal, E_WEEK_VIEW (priv->week_view));
-
- adjustment = gtk_range_get_adjustment (GTK_RANGE (E_WEEK_VIEW (priv->week_view)->vscrollbar));
- g_signal_connect (adjustment, "value_changed",
- G_CALLBACK (week_view_adjustment_changed_cb),
- gcal);
-
- /* The Month View. */
- priv->month_view = e_week_view_new ();
- e_calendar_view_set_calendar (E_CALENDAR_VIEW (priv->month_view), gcal);
- e_calendar_view_set_timezone (E_CALENDAR_VIEW (priv->month_view), priv->zone);
- e_week_view_set_multi_week_view (E_WEEK_VIEW (priv->month_view), TRUE);
- e_week_view_set_weeks_shown (E_WEEK_VIEW (priv->month_view), 6);
- g_signal_connect (priv->month_view, "selection_changed",
- G_CALLBACK (view_selection_changed_cb), gcal);
-
- connect_week_view_focus (gcal, E_WEEK_VIEW (priv->month_view));
-
- adjustment = gtk_range_get_adjustment (GTK_RANGE (E_WEEK_VIEW (priv->month_view)->vscrollbar));
- g_signal_connect (adjustment, "value_changed",
- G_CALLBACK (month_view_adjustment_changed_cb),
- gcal);
-
- /* The List View. */
- priv->list_view = e_cal_list_view_new ();
-
- e_calendar_view_set_calendar (E_CALENDAR_VIEW (priv->list_view), gcal);
- e_calendar_view_set_timezone (E_CALENDAR_VIEW (priv->list_view), priv->zone);
- g_signal_connect (priv->list_view, "selection_changed",
- G_CALLBACK (view_selection_changed_cb), gcal);
-
- connect_list_view_focus (gcal, E_CAL_LIST_VIEW (priv->list_view));
-
- priv->views[GNOME_CAL_DAY_VIEW] = E_CALENDAR_VIEW (priv->day_view);
- priv->configs[GNOME_CAL_DAY_VIEW] = G_OBJECT (e_day_view_config_new (E_DAY_VIEW (priv->views[GNOME_CAL_DAY_VIEW])));
- priv->views[GNOME_CAL_WORK_WEEK_VIEW] = E_CALENDAR_VIEW (priv->work_week_view);
- priv->configs[GNOME_CAL_WORK_WEEK_VIEW] = G_OBJECT (e_day_view_config_new (E_DAY_VIEW (priv->views[GNOME_CAL_WORK_WEEK_VIEW])));
- priv->views[GNOME_CAL_WEEK_VIEW] = E_CALENDAR_VIEW (priv->week_view);
- priv->configs[GNOME_CAL_WEEK_VIEW] = G_OBJECT (e_week_view_config_new (E_WEEK_VIEW (priv->views[GNOME_CAL_WEEK_VIEW])));
- priv->views[GNOME_CAL_MONTH_VIEW] = E_CALENDAR_VIEW (priv->month_view);
- priv->configs[GNOME_CAL_MONTH_VIEW] = G_OBJECT (e_week_view_config_new (E_WEEK_VIEW (priv->views[GNOME_CAL_MONTH_VIEW])));
- priv->views[GNOME_CAL_LIST_VIEW] = E_CALENDAR_VIEW (priv->list_view);
- priv->configs[GNOME_CAL_LIST_VIEW] = G_OBJECT (e_cal_list_view_config_new (E_CAL_LIST_VIEW (priv->views[GNOME_CAL_LIST_VIEW])));
-
- for (i = 0; i < GNOME_CAL_LAST_VIEW; i++) {
- gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook),
- GTK_WIDGET (priv->views[i]), gtk_label_new (""));
-
- g_signal_connect (priv->views[i], "user_created",
- G_CALLBACK (user_created_cb), gcal);
-
- gtk_widget_show (GTK_WIDGET (priv->views[i]));
- }
-
- /* make sure we set the initial time ranges for the views */
- update_view_times (gcal, time (NULL));
- gnome_calendar_update_date_navigator (gcal);
-}
-
-/* Object initialization function for the gnome calendar */
-static void
-gnome_calendar_init (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- int i;
-
- priv = g_new0 (GnomeCalendarPrivate, 1);
- gcal->priv = priv;
-
- for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++)
- priv->clients[i] = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
-
- priv->config_listener = e_config_listener_new ();
- g_signal_connect (priv->config_listener, "key_changed", G_CALLBACK (config_categories_changed_cb), gcal);
-
- priv->current_view_type = GNOME_CAL_DAY_VIEW;
- priv->range_selected = FALSE;
-
- setup_config (gcal);
- setup_widgets (gcal);
-
- priv->calendar_menu = e_cal_menu_new("org.gnome.evolution.calendar.view");
- priv->taskpad_menu = e_cal_menu_new("org.gnome.evolution.calendar.taskpad");
-
- priv->dn_queries = NULL;
- priv->sexp = g_strdup ("#t"); /* Match all */
- priv->todo_sexp = g_strdup ("#t");
-
- priv->view_instance = NULL;
- priv->view_menus = NULL;
-
- priv->visible_start = -1;
- priv->visible_end = -1;
-}
-
-static void
-gnome_calendar_destroy (GtkObject *object)
-{
- GnomeCalendar *gcal;
- GnomeCalendarPrivate *priv;
- gchar *filename;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (object));
-
- gcal = GNOME_CALENDAR (object);
- priv = gcal->priv;
-
- if (priv) {
- GList *l;
- int i;
-
- /* unset the config listener */
- if (priv->config_listener) {
- g_signal_handlers_disconnect_matched (priv->config_listener,
- G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, gcal);
- g_object_unref (priv->config_listener);
- priv->config_listener = NULL;
- }
-
- /* Clean up the clients */
- for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) {
- for (l = priv->clients_list[i]; l != NULL; l = l->next) {
- g_signal_handlers_disconnect_matched (l->data, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, gcal);
- }
-
- g_hash_table_destroy (priv->clients[i]);
- g_list_free (priv->clients_list[i]);
-
- priv->clients[i] = NULL;
- priv->clients_list[i] = NULL;
-
- if (priv->default_client[i]) {
- g_signal_handlers_disconnect_matched (priv->default_client[i],
- G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, gcal);
- g_object_unref (priv->default_client[i]);
- }
- priv->default_client[i] = NULL;
- }
-
- for (i = 0; i < GNOME_CAL_LAST_VIEW; i++) {
- if (priv->configs[i])
- g_object_unref (priv->configs[i]);
- priv->configs[i] = NULL;
- }
- g_object_unref (priv->date_navigator_config);
- g_object_unref (priv->todo_config);
-
- for (l = priv->notifications; l; l = l->next)
- calendar_config_remove_notification (GPOINTER_TO_UINT (l->data));
- g_list_free (priv->notifications);
- priv->notifications = NULL;
-
- /* Save the TaskPad layout. */
- filename = g_build_filename (calendar_component_peek_config_directory (calendar_component_peek ()),
- "TaskPad", NULL);
- e_calendar_table_save_state (E_CALENDAR_TABLE (priv->todo), filename);
- g_free (filename);
-
- if (priv->dn_queries) {
- for (l = priv->dn_queries; l != NULL; l = l->next) {
- g_signal_handlers_disconnect_matched ((ECalView *) l->data, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, gcal);
- g_object_unref (l->data);
- }
-
- g_list_free (priv->dn_queries);
- priv->dn_queries = NULL;
- }
-
- if (priv->sexp) {
- g_free (priv->sexp);
- priv->sexp = NULL;
- }
-
- if (priv->todo_sexp) {
- g_free (priv->todo_sexp);
- priv->todo_sexp = NULL;
- }
-
- if (priv->update_timeout) {
- g_source_remove (priv->update_timeout);
- priv->update_timeout = 0;
- }
-
- if (priv->view_instance) {
- g_object_unref (priv->view_instance);
- priv->view_instance = NULL;
- }
-
- if (priv->view_menus) {
- g_object_unref (priv->view_menus);
- priv->view_menus = NULL;
- }
-
- if (priv->calendar_menu) {
- g_object_unref (priv->calendar_menu);
- priv->calendar_menu = NULL;
- }
-
- if (priv->taskpad_menu) {
- g_object_unref (priv->taskpad_menu);
- priv->taskpad_menu = NULL;
- }
-
- g_free (priv);
- gcal->priv = NULL;
- }
-
- if (GTK_OBJECT_CLASS (gnome_calendar_parent_class)->destroy)
- (* GTK_OBJECT_CLASS (gnome_calendar_parent_class)->destroy) (object);
-}
-
-static void
-gnome_calendar_goto_date (GnomeCalendar *gcal,
- GnomeCalendarGotoDateType goto_date)
-{
- GnomeCalendarPrivate *priv;
- time_t new_time = 0;
- gboolean need_updating = FALSE;
-
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR(gcal));
-
- priv = gcal->priv;
-
- switch (goto_date) {
- /* GNOME_CAL_GOTO_TODAY and GNOME_CAL_GOTO_DATE are
- currently not used
- */
- case GNOME_CAL_GOTO_TODAY:
- break;
- case GNOME_CAL_GOTO_DATE:
- break;
- case GNOME_CAL_GOTO_FIRST_DAY_OF_MONTH:
- new_time = time_month_begin_with_zone (priv->base_view_time, priv->zone);
- need_updating = TRUE;
- break;
- case GNOME_CAL_GOTO_LAST_DAY_OF_MONTH:
- new_time = time_add_month_with_zone (priv->base_view_time, 1, priv->zone);
- new_time = time_month_begin_with_zone (new_time, priv->zone);
- new_time = time_add_day_with_zone (new_time, -1, priv->zone);
- need_updating = TRUE;
- break;
- case GNOME_CAL_GOTO_FIRST_DAY_OF_WEEK:
- new_time = time_week_begin_with_zone (priv->base_view_time, priv->week_start, priv->zone);
- need_updating = TRUE;
- break;
- case GNOME_CAL_GOTO_LAST_DAY_OF_WEEK:
- new_time = time_week_begin_with_zone (priv->base_view_time, priv->week_start, priv->zone);
- if (priv->current_view_type == GNOME_CAL_DAY_VIEW ||
- priv->current_view_type == GNOME_CAL_WORK_WEEK_VIEW) {
- /* FIXME Shouldn't hard code work week end */
- /* goto Friday of this week */
- new_time = time_add_day_with_zone (new_time, 4, priv->zone);
- } else {
- /* goto Sunday of this week */
- /* FIXME Shouldn't hard code week end */
- new_time = time_add_day_with_zone (new_time, 6, priv->zone);
- }
- need_updating = TRUE;
- break;
- case GNOME_CAL_GOTO_SAME_DAY_OF_PREVIOUS_WEEK:
- new_time = time_add_week_with_zone (priv->base_view_time, -1, priv->zone);
- need_updating = TRUE;
- break;
- case GNOME_CAL_GOTO_SAME_DAY_OF_NEXT_WEEK:
- new_time = time_add_week_with_zone (priv->base_view_time, 1, priv->zone);
- need_updating = TRUE;
- break;
- default:
- break;
- }
-
- if (need_updating) {
- update_view_times (gcal, new_time);
- gnome_calendar_update_date_navigator (gcal);
- gnome_calendar_notify_dates_shown_changed (gcal);
- }
-}
-
-void
-gnome_calendar_goto (GnomeCalendar *gcal, time_t new_time)
-{
- GnomeCalendarPrivate *priv;
-
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
- g_return_if_fail (new_time != -1);
-
- priv = gcal->priv;
-
- update_view_times (gcal, new_time);
- gnome_calendar_update_date_navigator (gcal);
- gnome_calendar_notify_dates_shown_changed (gcal);
-}
-
-
-static void
-update_view_times (GnomeCalendar *gcal, time_t start_time)
-{
- GnomeCalendarPrivate *priv;
- int i;
-
- priv = gcal->priv;
-
- priv->base_view_time = start_time;
-
- for (i = 0; i < GNOME_CAL_LAST_VIEW; i++) {
- ECalModel *model;
- time_t real_start_time = start_time;
- time_t end_time;
-
- model = e_calendar_view_get_model (priv->views[i]);
- get_times_for_views (gcal, i, &real_start_time, &end_time);
-
- e_cal_model_set_time_range (model, real_start_time, end_time);
- }
-}
-
-static void
-gnome_calendar_direction (GnomeCalendar *gcal, int direction)
-{
- GnomeCalendarPrivate *priv;
-
- priv = gcal->priv;
-
- switch (priv->current_view_type) {
- case GNOME_CAL_DAY_VIEW:
- priv->base_view_time = time_add_day_with_zone (priv->base_view_time, direction, priv->zone);
- break;
- case GNOME_CAL_WORK_WEEK_VIEW:
- case GNOME_CAL_WEEK_VIEW:
- priv->base_view_time = time_add_week_with_zone (priv->base_view_time, direction, priv->zone);
- break;
- case GNOME_CAL_LIST_VIEW:
- g_warning ("Using month view time interval for list view.");
- case GNOME_CAL_MONTH_VIEW:
- priv->base_view_time = time_add_month_with_zone (priv->base_view_time, direction, priv->zone);
- break;
- default:
- g_assert_not_reached ();
- return;
- }
-
- update_view_times (gcal, priv->base_view_time);
- gnome_calendar_update_date_navigator (gcal);
- gnome_calendar_notify_dates_shown_changed (gcal);
-}
-
-void
-gnome_calendar_next (GnomeCalendar *gcal)
-{
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- gnome_calendar_direction (gcal, 1);
-}
-
-void
-gnome_calendar_previous (GnomeCalendar *gcal)
-{
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- gnome_calendar_direction (gcal, -1);
-}
-
-void
-gnome_calendar_dayjump (GnomeCalendar *gcal, time_t time)
-{
- GnomeCalendarPrivate *priv;
-
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- priv = gcal->priv;
-
- priv->base_view_time = time_day_begin_with_zone (time, priv->zone);
-
- update_view_times (gcal, priv->base_view_time);
- gnome_calendar_set_view (gcal, GNOME_CAL_DAY_VIEW);
-}
-
-static void
-focus_current_view (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
-
- priv = gcal->priv;
-
- gtk_widget_grab_focus (gnome_calendar_get_current_view_widget (gcal));
-}
-
-void
-gnome_calendar_goto_today (GnomeCalendar *gcal)
-{
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- gnome_calendar_goto (gcal, time (NULL));
- focus_current_view (gcal);
-}
-
-/**
- * gnome_calendar_get_view:
- * @gcal: A calendar.
- *
- * Queries the type of the view that is being shown in a calendar.
- *
- * Return value: Type of the view that is currently shown.
- **/
-GnomeCalendarViewType
-gnome_calendar_get_view (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
-
- g_return_val_if_fail (gcal != NULL, GNOME_CAL_DAY_VIEW);
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), GNOME_CAL_DAY_VIEW);
-
- priv = gcal->priv;
- return priv->current_view_type;
-}
-
-static void
-set_view (GnomeCalendar *gcal, GnomeCalendarViewType view_type, gboolean range_selected)
-{
- GnomeCalendarPrivate *priv;
- const char *view_id;
-
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- priv = gcal->priv;
-
- switch (view_type) {
- case GNOME_CAL_DAY_VIEW:
- view_id = "Day_View";
- break;
-
- case GNOME_CAL_WORK_WEEK_VIEW:
- view_id = "Work_Week_View";
- break;
-
- case GNOME_CAL_WEEK_VIEW:
- view_id = "Week_View";
- break;
-
- case GNOME_CAL_MONTH_VIEW:
- view_id = "Month_View";
- break;
-
- case GNOME_CAL_LIST_VIEW:
- view_id = "List_View";
- break;
-
- default:
- g_assert_not_reached ();
- return;
- }
-
- priv->range_selected = range_selected;
- priv->current_view_type = view_type;
-
- gal_view_instance_set_current_view_id (priv->view_instance, view_id);
- focus_current_view (gcal);
-}
-
-
-/**
- * gnome_calendar_set_view:
- * @gcal: A calendar.
- * @view_type: Type of view to show.
- *
- * Sets the view that should be shown in a calendar. If @reset_range is true,
- * this function will automatically set the number of days or weeks shown in
- * the view; otherwise the last configuration will be kept.
- **/
-void
-gnome_calendar_set_view (GnomeCalendar *gcal, GnomeCalendarViewType view_type)
-{
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- set_view (gcal, view_type, FALSE);
-}
-
-/* Sets the view without changing the selection or updating the date
- * navigator. If a range of dates isn't selected it will also reset the number
- * of days/weeks shown to the default (i.e. 1 day for the day view or 5 weeks
- * for the month view).
- */
-static void
-display_view (GnomeCalendar *gcal, GnomeCalendarViewType view_type, gboolean grab_focus)
-{
- GnomeCalendarPrivate *priv;
- gboolean preserve_day;
-
- priv = gcal->priv;
-
- preserve_day = FALSE;
-
- switch (view_type) {
- case GNOME_CAL_DAY_VIEW:
- if (!priv->range_selected)
- e_day_view_set_days_shown (E_DAY_VIEW (priv->day_view), 1);
-
- break;
-
- case GNOME_CAL_WORK_WEEK_VIEW:
- preserve_day = TRUE;
- break;
-
- case GNOME_CAL_WEEK_VIEW:
- preserve_day = TRUE;
- break;
-
- case GNOME_CAL_MONTH_VIEW:
- if (!priv->range_selected)
- e_week_view_set_weeks_shown (E_WEEK_VIEW (priv->month_view), 6);
-
- preserve_day = TRUE;
- break;
-
- case GNOME_CAL_LIST_VIEW:
- break;
-
- default:
- g_assert_not_reached ();
- return;
- }
-
- priv->current_view_type = view_type;
-
- gtk_notebook_set_page (GTK_NOTEBOOK (priv->notebook), (int) view_type);
-
- if (grab_focus)
- focus_current_view (gcal);
-
- gnome_calendar_set_pane_positions (gcal);
-
- /* For the week & month views we want the selection in the date
- navigator to be rounded to the nearest week when the arrow buttons
- are pressed to move to the previous/next month. */
- g_object_set (G_OBJECT (priv->date_navigator->calitem),
- "preserve_day_when_moving", preserve_day,
- NULL);
-}
-
-/* Callback used when the view collection asks us to display a particular view */
-static void
-display_view_cb (GalViewInstance *view_instance, GalView *view, gpointer data)
-{
- GnomeCalendar *gcal;
- GnomeCalendarPrivate *priv;
- CalendarView *cal_view;
- GnomeCalendarViewType view_type;
-
- gcal = GNOME_CALENDAR (data);
- priv = gcal->priv;
-
- if (GAL_IS_VIEW_ETABLE(view)) {
- ETable *table;
-
- view_type = GNOME_CAL_LIST_VIEW;
-
- table = e_table_scrolled_get_table (E_CAL_LIST_VIEW (priv->list_view)->table_scrolled);
- gal_view_etable_attach_table (GAL_VIEW_ETABLE (view), table);
- } else if (IS_CALENDAR_VIEW (view)) {
- cal_view = CALENDAR_VIEW (view);
-
- view_type = calendar_view_get_view_type (cal_view);
- } else {
- g_error (G_STRLOC ": Unknown type of view for GnomeCalendar");
- return;
- }
-
-
- display_view (gcal, view_type, TRUE);
- gnome_calendar_update_date_navigator (gcal);
- gnome_calendar_notify_dates_shown_changed (gcal);
-}
-
-/**
- * gnome_calendar_setup_view_menus:
- * @gcal: A calendar.
- * @uic: UI controller to use for the menus.
- *
- * Sets up the #GalView menus for a calendar. This function should be called
- * from the Bonobo control activation callback for this calendar. Also, the
- * menus should be discarded using gnome_calendar_discard_view_menus().
- **/
-void
-gnome_calendar_setup_view_menus (GnomeCalendar *gcal, BonoboUIComponent *uic)
-{
- GnomeCalendarPrivate *priv;
- char *path;
- CalendarViewFactory *factory;
- GalViewFactory *gal_factory;
- static GalViewCollection *collection = NULL;
-
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
- g_return_if_fail (uic != NULL);
- g_return_if_fail (BONOBO_IS_UI_COMPONENT (uic));
-
- priv = gcal->priv;
-
- g_assert (priv->view_instance == NULL);
- g_assert (priv->view_menus == NULL);
-
- /* Create the view instance */
- if (collection == NULL) {
- ETableSpecification *spec;
-
- collection = gal_view_collection_new ();
-
- gal_view_collection_set_title (collection, _("Calendar"));
-
- path = g_build_filename (calendar_component_peek_base_directory (calendar_component_peek ()),
- "calendar", "views", NULL);
- gal_view_collection_set_storage_directories (collection,
- EVOLUTION_GALVIEWSDIR "/calendar/",
- path);
- g_free (path);
-
- /* Create the views */
-
- factory = calendar_view_factory_new (GNOME_CAL_DAY_VIEW);
- gal_view_collection_add_factory (collection, GAL_VIEW_FACTORY (factory));
- g_object_unref (factory);
-
- factory = calendar_view_factory_new (GNOME_CAL_WORK_WEEK_VIEW);
- gal_view_collection_add_factory (collection, GAL_VIEW_FACTORY (factory));
- g_object_unref (factory);
-
- factory = calendar_view_factory_new (GNOME_CAL_WEEK_VIEW);
- gal_view_collection_add_factory (collection, GAL_VIEW_FACTORY (factory));
- g_object_unref (factory);
-
- factory = calendar_view_factory_new (GNOME_CAL_MONTH_VIEW);
- gal_view_collection_add_factory (collection, GAL_VIEW_FACTORY (factory));
- g_object_unref (factory);
-
- spec = e_table_specification_new ();
- e_table_specification_load_from_file (spec, EVOLUTION_ETSPECDIR "/e-cal-list-view.etspec");
- gal_factory = gal_view_factory_etable_new (spec);
- g_object_unref (spec);
- gal_view_collection_add_factory (collection, GAL_VIEW_FACTORY (gal_factory));
- g_object_unref (gal_factory);
-
- /* Load the collection and create the menus */
-
- gal_view_collection_load (collection);
-
- }
-
- priv->view_instance = gal_view_instance_new (collection, NULL);
- priv->view_menus = gal_view_menus_new (priv->view_instance);
- gal_view_menus_apply (priv->view_menus, uic, NULL);
-
- g_signal_connect (priv->view_instance, "display_view", G_CALLBACK (display_view_cb), gcal);
- display_view_cb (priv->view_instance, gal_view_instance_get_current_view (priv->view_instance), gcal);
-}
-
-/**
- * gnome_calendar_discard_view_menus:
- * @gcal: A calendar.
- *
- * Discards the #GalView menus used by a calendar. This function should be
- * called from the Bonobo control deactivation callback for this calendar. The
- * menus should have been set up with gnome_calendar_setup_view_menus().
- **/
-void
-gnome_calendar_discard_view_menus (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
-
- g_return_if_fail (gcal != NULL);
-
- priv = gcal->priv;
-
- g_assert (priv->view_instance != NULL);
- g_assert (priv->view_menus != NULL);
-
- g_object_unref (priv->view_instance);
- priv->view_instance = NULL;
-
- g_object_unref (priv->view_menus);
- priv->view_menus = NULL;
-}
-
-/* This is copied/moved from gal-view-instance, only the calendar uses this for a popup menu */
-static void
-gc_set_view(EPopup *ep, EPopupItem *pitem, void *data)
-{
- GnomeCalendar *gcal = data;
-
- if (pitem->type & E_POPUP_ACTIVE)
- gal_view_instance_set_current_view_id(gcal->priv->view_instance, (char *)pitem->user_data);
-}
-
-static void
-gc_save_custom_view(EPopup *ep, EPopupItem *pitem, void *data)
-{
- GnomeCalendar *gcal = data;
-
- gal_view_instance_save_as(gcal->priv->view_instance);
-}
-
-static void
-gc_define_views_response(GtkWidget *d, int id, GnomeCalendar *gcal)
-{
- if (id == GTK_RESPONSE_OK)
- gal_view_collection_save(gcal->priv->view_instance->collection);
-
- gtk_widget_destroy(d);
-}
-
-static void
-gc_define_views(EPopup *ep, EPopupItem *pitem, void *data)
-{
- GnomeCalendar *gcal = data;
- GtkWidget *dialog = gal_define_views_dialog_new(gcal->priv->view_instance->collection);
-
- g_signal_connect(dialog, "response", G_CALLBACK(gc_define_views_response), data);
- gtk_widget_show(dialog);
-}
-
-static EPopupItem gc_popups[] = {
- /* Code generates the path to fit */
- { E_POPUP_BAR, NULL },
- { E_POPUP_RADIO|E_POPUP_ACTIVE, NULL, N_("Custom View"), },
- { E_POPUP_ITEM, NULL, N_("Save Custom View"), gc_save_custom_view },
-
- /* index == 3, when we have non-custom view */
-
- { E_POPUP_BAR, NULL },
- { E_POPUP_ITEM, NULL, N_("Define Views..."), gc_define_views },
-};
-
-static void
-gc_popup_free (EPopup *ep, GSList *list, void *data)
-{
- while (list) {
- GSList *n = list->next;
- EPopupItem *pitem = list->data;
-
- g_free(pitem->path);
- g_free(pitem->label);
- g_free(pitem->user_data);
- g_free(pitem);
- g_slist_free_1(list);
- list = n;
- }
-}
-
-static void
-gc_popup_free_static (EPopup *ep, GSList *list, void *data)
-{
- while (list) {
- GSList *n = list->next;
- EPopupItem *pitem = list->data;
-
- g_free(pitem->path);
- g_free(pitem);
- g_slist_free_1(list);
- list = n;
- }
-}
-
-void
-gnome_calendar_view_popup_factory (GnomeCalendar *gcal, EPopup *ep, const char *prefix)
-{
- GnomeCalendarPrivate *priv;
- int length;
- int i;
- gboolean found = FALSE;
- char *id;
- GSList *menus = NULL;
- EPopupItem *pitem;
-
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
- g_return_if_fail (prefix != NULL);
-
- priv = gcal->priv;
-
- g_return_if_fail (priv->view_instance != NULL);
-
- length = gal_view_collection_get_count(priv->view_instance->collection);
- id = gal_view_instance_get_current_view_id (priv->view_instance);
-
- for (i = 0; i < length; i++) {
- GalViewCollectionItem *item = gal_view_collection_get_view_item(priv->view_instance->collection, i);
-
- pitem = g_malloc0(sizeof(*pitem));
- pitem->type = E_POPUP_RADIO;
- pitem->path = g_strdup_printf("%s/%02d.item", prefix, i);
- pitem->label = g_strdup(item->title);
- pitem->activate = gc_set_view;
- pitem->user_data = g_strdup(item->id);
-
- if (!found && id && !strcmp (id, item->id)) {
- found = TRUE;
- pitem->type |= E_POPUP_ACTIVE;
- }
-
- menus = g_slist_prepend(menus, pitem);
- }
-
- if (menus)
- e_popup_add_items(ep, menus, NULL, gc_popup_free, gcal);
-
- menus = NULL;
- for (i = found?3:0; i<sizeof(gc_popups)/sizeof(gc_popups[0]);i++) {
- pitem = g_malloc0(sizeof(*pitem));
- memcpy(pitem, &gc_popups[i], sizeof(*pitem));
- pitem->path = g_strdup_printf("%s/%02d.item", prefix, i+length);
- menus = g_slist_prepend(menus, pitem);
- }
-
- e_popup_add_items(ep, menus, NULL, gc_popup_free_static, gcal);
-}
-
-static void
-gnome_calendar_set_pane_positions (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
-
- priv = gcal->priv;
-
- if (priv->current_view_type == GNOME_CAL_MONTH_VIEW && !priv->range_selected) {
- gtk_paned_set_position (GTK_PANED (priv->hpane), priv->hpane_pos_month_view);
- gtk_paned_set_position (GTK_PANED (priv->vpane), priv->vpane_pos_month_view);
- } else {
- gtk_paned_set_position (GTK_PANED (priv->hpane), priv->hpane_pos);
- gtk_paned_set_position (GTK_PANED (priv->vpane), priv->vpane_pos);
- }
-}
-
-static void
-client_cal_opened_cb (ECal *ecal, ECalendarStatus status, GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- ECalSourceType source_type;
- ESource *source;
- char *msg;
- int i;
-
- priv = gcal->priv;
-
- source_type = e_cal_get_source_type (ecal);
- source = e_cal_get_source (ecal);
-
- if (source_type == E_CAL_SOURCE_TYPE_EVENT)
- e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL);
- else
- e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), NULL);
-
- if (status == E_CALENDAR_STATUS_BUSY)
- return;
-
- if (status == E_CALENDAR_STATUS_INVALID_SERVER_VERSION) {
- e_error_run (NULL, "calendar:server-version", NULL);
- status = E_CALENDAR_STATUS_OK;
- }
- if (status != E_CALENDAR_STATUS_OK) {
- /* Make sure the source doesn't disappear on us */
- g_object_ref (source);
-
- priv->clients_list[source_type] = g_list_remove (priv->clients_list[source_type], ecal);
- g_hash_table_remove (priv->clients[source_type], e_source_peek_uid (source));
-
- gtk_signal_emit (GTK_OBJECT (gcal), gnome_calendar_signals[SOURCE_REMOVED], source_type, source);
-
- g_object_unref (source);
-
- return;
- }
-
- g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, client_cal_opened_cb, NULL);
-
- e_cal_set_default_timezone (ecal, priv->zone, NULL);
-
- switch (source_type) {
- case E_CAL_SOURCE_TYPE_EVENT :
- msg = g_strdup_printf (_("Loading appointments at %s"), e_cal_get_uri (ecal));
- e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), msg);
- g_free (msg);
-
- /* add client to the views */
- for (i = 0; i < GNOME_CAL_LAST_VIEW; i++) {
- ECalModel *model;
-
- model = e_calendar_view_get_model (priv->views[i]);
- e_cal_model_add_client (model, ecal);
- }
-
- /* update date navigator query */
- update_query (gcal);
-
- e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL);
- break;
-
- case E_CAL_SOURCE_TYPE_TODO :
- msg = g_strdup_printf (_("Loading tasks at %s"), e_cal_get_uri (ecal));
- e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), msg);
- g_free (msg);
-
- e_cal_model_add_client (e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo)), ecal);
-
- e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), NULL);
- break;
-
- default:
- g_assert_not_reached ();
- return;
- }
-}
-
-static void
-default_client_cal_opened_cb (ECal *ecal, ECalendarStatus status, GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- ECalSourceType source_type;
- ESource *source;
- int i;
-
- priv = gcal->priv;
-
- source_type = e_cal_get_source_type (ecal);
- source = e_cal_get_source (ecal);
-
- switch (source_type) {
- case E_CAL_SOURCE_TYPE_EVENT:
- e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL);
- break;
- case E_CAL_SOURCE_TYPE_TODO:
- e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), NULL);
- break;
- default:
- break;
- }
-
- if (status == E_CALENDAR_STATUS_BUSY)
- return;
-
- if (status == E_CALENDAR_STATUS_INVALID_SERVER_VERSION) {
- e_error_run (NULL, "calendar:server-version", NULL);
- status = E_CALENDAR_STATUS_OK;
- }
-
- if (status != E_CALENDAR_STATUS_OK) {
- /* Make sure the source doesn't disappear on us */
- g_object_ref (source);
-
- /* FIXME should we do this to prevent multiple error dialogs? */
- priv->clients_list[source_type] = g_list_remove (priv->clients_list[source_type], ecal);
- g_hash_table_remove (priv->clients[source_type], e_source_peek_uid (source));
-
- /* FIXME Is there a better way to handle this? */
- g_object_unref (priv->default_client[source_type]);
- priv->default_client[source_type] = NULL;
-
- gtk_signal_emit (GTK_OBJECT (gcal), gnome_calendar_signals[SOURCE_REMOVED], source_type, source);
-
- g_object_unref (source);
-
- return;
- }
-
- g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, default_client_cal_opened_cb, NULL);
-
- e_cal_set_default_timezone (ecal, priv->zone, NULL);
-
- switch (source_type) {
- case E_CAL_SOURCE_TYPE_EVENT:
- for (i = 0; i < GNOME_CAL_LAST_VIEW; i++) {
- e_cal_model_set_default_client (
- e_calendar_view_get_model (E_CALENDAR_VIEW (priv->views[i])),
- ecal);
- }
- break;
-
- case E_CAL_SOURCE_TYPE_TODO:
- e_cal_model_set_default_client (e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo)), ecal);
- break;
-
- default:
- break;
- }
-}
-
-typedef void (*open_func) (ECal *, ECalendarStatus, GnomeCalendar *);
-
-static gboolean
-open_ecal (GnomeCalendar *gcal, ECal *cal, gboolean only_if_exists, open_func of)
-{
- GnomeCalendarPrivate *priv;
- char *msg;
-
- priv = gcal->priv;
-
- msg = g_strdup_printf (_("Opening %s"), e_cal_get_uri (cal));
- switch (e_cal_get_source_type (cal)) {
- case E_CAL_SOURCE_TYPE_EVENT :
- e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), msg);
- break;
- case E_CAL_SOURCE_TYPE_TODO :
- e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), msg);
- break;
- default:
- g_assert_not_reached ();
- break;
- }
-
- g_free (msg);
-
- g_signal_connect (G_OBJECT (cal), "cal_opened", G_CALLBACK (of), gcal);
- e_cal_open_async (cal, only_if_exists);
-
- return TRUE;
-}
-
-/* Callback when we get an error message from the backend */
-static void
-backend_error_cb (ECal *client, const char *message, gpointer data)
-{
- GnomeCalendar *gcal;
- GnomeCalendarPrivate *priv;
- char *errmsg;
- char *uristr;
-
- gcal = GNOME_CALENDAR (data);
- priv = gcal->priv;
-
- uristr = get_uri_without_password (e_cal_get_uri (client));
- errmsg = g_strdup_printf (_("Error on %s:\n %s"), uristr, message);
- gnome_error_dialog_parented (errmsg, GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gcal))));
- g_free (errmsg);
- g_free (uristr);
-}
-
-/* Callback when the backend dies */
-static void
-backend_died_cb (ECal *ecal, gpointer data)
-{
- GnomeCalendar *gcal;
- GnomeCalendarPrivate *priv;
- ECalSourceType source_type;
- ESource *source;
- const char *id;
-
- gcal = GNOME_CALENDAR (data);
- priv = gcal->priv;
-
- /* FIXME What about default sources? */
-
- /* Make sure the source doesn't go away on us since we use it below */
- source_type = e_cal_get_source_type (ecal);
- source = g_object_ref (e_cal_get_source (ecal));
-
- priv->clients_list[source_type] = g_list_remove (priv->clients_list[source_type], ecal);
- g_hash_table_remove (priv->clients[source_type], e_source_peek_uid (source));
-
- switch (source_type) {
- case E_CAL_SOURCE_TYPE_EVENT:
- id = "calendar:calendar-crashed";
-
- e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL);
-
- gtk_signal_emit (GTK_OBJECT (gcal), gnome_calendar_signals[SOURCE_REMOVED], source_type, source);
- break;
-
- case E_CAL_SOURCE_TYPE_TODO:
- id = "calendar:tasks-crashed";
-
- e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), NULL);
-
- gtk_signal_emit (GTK_OBJECT (gcal), gnome_calendar_signals[SOURCE_REMOVED], source_type, source);
- break;
-
- default:
- g_assert_not_reached ();
- return;
- }
-
- g_object_unref (source);
-
- e_error_run (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gcal))), id, NULL);
-}
-
-GtkWidget *
-gnome_calendar_construct (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
-
- g_return_val_if_fail (gcal != NULL, NULL);
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL);
-
- priv = gcal->priv;
-
- return GTK_WIDGET (gcal);
-}
-
-GtkWidget *
-gnome_calendar_new (void)
-{
- GnomeCalendar *gcal;
-
- gcal = g_object_new (gnome_calendar_get_type (), NULL);
-
- if (!gnome_calendar_construct (gcal)) {
- g_message (G_STRLOC ": Could not construct the calendar GUI");
- g_object_unref (gcal);
- return NULL;
- }
-
- return GTK_WIDGET (gcal);
-}
-
-void
-gnome_calendar_set_activity_handler (GnomeCalendar *cal, EActivityHandler *activity_handler)
-{
- GnomeCalendarPrivate *priv;
- int i;
-
- g_return_if_fail (cal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (cal));
-
- priv = cal->priv;
-
- priv->activity_handler = activity_handler;
-
- for (i = 0; i < GNOME_CAL_LAST_VIEW; i++)
- e_calendar_view_set_activity_handler (priv->views[i], activity_handler);
-
- e_calendar_table_set_activity_handler (E_CALENDAR_TABLE (priv->todo), activity_handler);
-}
-
-void
-gnome_calendar_set_ui_component (GnomeCalendar *gcal,
- BonoboUIComponent *ui_component)
-{
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
- g_return_if_fail (ui_component == NULL || BONOBO_IS_UI_COMPONENT (ui_component));
-
- e_search_bar_set_ui_component (E_SEARCH_BAR (gcal->priv->search_bar), ui_component);
-}
-
-/**
- * gnome_calendar_get_calendar_model:
- * @gcal: A calendar view.
- *
- * Queries the calendar model object that a calendar view is using.
- *
- * Return value: A calendar client interface object.
- **/
-ECalModel *
-gnome_calendar_get_calendar_model (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
-
- g_return_val_if_fail (gcal != NULL, NULL);
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL);
-
- priv = gcal->priv;
-
- return e_calendar_view_get_model (priv->views[priv->current_view_type]);
-}
-
-/**
- * gnome_calendar_get_default_client
- */
-ECal *
-gnome_calendar_get_default_client (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
-
- g_return_val_if_fail (gcal != NULL, NULL);
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL);
-
- priv = gcal->priv;
-
- return e_cal_model_get_default_client (e_calendar_view_get_model (gcal->priv->views[priv->current_view_type]));
-}
-
-/**
- * gnome_calendar_add_source:
- * @gcal: A GnomeCalendar.
- * @source: #ESource to add to the calendar views.
- *
- * Adds the given calendar source to the calendar views.
- *
- * Returns: TRUE if successful, FALSE if error.
- */
-gboolean
-gnome_calendar_add_source (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source)
-{
- GnomeCalendarPrivate *priv;
- ECal *client;
-
- g_return_val_if_fail (gcal != NULL, FALSE);
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), FALSE);
- g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
-
- priv = gcal->priv;
-
- client = g_hash_table_lookup (priv->clients[source_type], e_source_peek_uid (source));
- if (client) {
- /* We already have it */
-
- return TRUE;
- } else {
- ESource *default_source;
-
- if (priv->default_client[source_type]) {
- default_source = e_cal_get_source (priv->default_client[source_type]);
-
- g_message ("Check if default client matches (%s %s)", e_source_peek_uid (default_source), e_source_peek_uid (source));
- /* We don't have it but the default client is it */
- if (!strcmp (e_source_peek_uid (default_source), e_source_peek_uid (source)))
- client = g_object_ref (priv->default_client[source_type]);
- }
-
- /* Create a new one */
- if (!client) {
- client = auth_new_cal_from_source (source, source_type);
- if (!client)
- return FALSE;
- }
- }
-
- g_signal_connect (G_OBJECT (client), "backend_error", G_CALLBACK (backend_error_cb), gcal);
- g_signal_connect (G_OBJECT (client), "backend_died", G_CALLBACK (backend_died_cb), gcal);
-
- /* add the client to internal structure */
- g_hash_table_insert (priv->clients[source_type], g_strdup (e_source_peek_uid (source)), client);
- priv->clients_list[source_type] = g_list_prepend (priv->clients_list[source_type], client);
-
- gtk_signal_emit (GTK_OBJECT (gcal), gnome_calendar_signals[SOURCE_ADDED], source_type, source);
-
- open_ecal (gcal, client, FALSE, client_cal_opened_cb);
-
- return TRUE;
-}
-
-/**
- * gnome_calendar_remove_source
- * @gcal: A #GnomeCalendar.
- * @source: #ESource to be removed from the clients.
- *
- * Removes the given source from the list of clients being shown by the
- * calendar views.
- *
- * Returns: TRUE if successful, FALSE otherwise.
- */
-gboolean
-gnome_calendar_remove_source (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source)
-{
- gboolean result;
-
- g_return_val_if_fail (gcal != NULL, FALSE);
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), FALSE);
- g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
-
- result = gnome_calendar_remove_source_by_uid (gcal, source_type, e_source_peek_uid (source));
- if (result)
- gtk_signal_emit (GTK_OBJECT (gcal), gnome_calendar_signals[SOURCE_REMOVED], source_type, source);
-
- return result;
-}
-
-gboolean
-gnome_calendar_remove_source_by_uid (GnomeCalendar *gcal, ECalSourceType source_type, const char *uid)
-{
- GnomeCalendarPrivate *priv;
- ECal *client;
- ECalModel *model;
- int i;
- GList *l;
-
- g_return_val_if_fail (gcal != NULL, FALSE);
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), FALSE);
- g_return_val_if_fail (uid != NULL, FALSE);
-
- priv = gcal->priv;
-
- client = g_hash_table_lookup (priv->clients[source_type], uid);
- if (!client)
- return TRUE;
-
- priv->clients_list[source_type] = g_list_remove (priv->clients_list[source_type], client);
- g_signal_handlers_disconnect_matched (client, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, gcal);
-
- switch (source_type) {
- case E_CAL_SOURCE_TYPE_EVENT:
- /* remove the query for this client */
- for (l = priv->dn_queries; l != NULL; l = l->next) {
- ECalView *query = l->data;
-
- if (query && (client == e_cal_view_get_client (query))) {
- g_signal_handlers_disconnect_matched (query, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, gcal);
- priv->dn_queries = g_list_remove (priv->dn_queries, query);
- g_object_unref (query);
- break;
- }
- }
-
- for (i = 0; i < GNOME_CAL_LAST_VIEW; i++) {
- model = e_calendar_view_get_model (priv->views[i]);
- e_cal_model_remove_client (model, client);
- }
-
- /* update date navigator query */
- update_query (gcal);
- break;
-
- case E_CAL_SOURCE_TYPE_TODO:
- model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo));
- e_cal_model_remove_client (model, client);
- break;
-
- default:
- g_assert_not_reached ();
- break;
- }
-
- g_hash_table_remove (priv->clients[source_type], uid);
-
- return TRUE;
-}
-
-/**
- * gnome_calendar_set_default_source:
- * @gcal: A calendar view
- * @source: The #ESource to use as default
- *
- * Set the default uri on the given calendar view, the default uri
- * will be used as the default when creating events in the view.
-
- *
- * Return value: TRUE if the uri was already added and is set, FALSE
- * otherwise
- **/
-gboolean
-gnome_calendar_set_default_source (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source)
-{
- GnomeCalendarPrivate *priv;
- ECal *client;
-
- g_return_val_if_fail (gcal != NULL, FALSE);
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), FALSE);
- g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
-
- priv = gcal->priv;
-
- client = g_hash_table_lookup (priv->clients[source_type], e_source_peek_uid (source));
-
- if (priv->default_client[source_type])
- g_object_unref (priv->default_client[source_type]);
-
- if (client) {
- priv->default_client[source_type] = g_object_ref (client);
- } else {
- priv->default_client[source_type] = auth_new_cal_from_source (source, source_type);
- if (!priv->default_client[source_type])
- return FALSE;
- }
-
- open_ecal (gcal, priv->default_client[source_type], FALSE, default_client_cal_opened_cb);
-
- return TRUE;
-}
-
-void
-gnome_calendar_set_selected_time_range (GnomeCalendar *gcal,
- time_t start_time,
- time_t end_time)
-{
- GnomeCalendarPrivate *priv;
-
- priv = gcal->priv;
-
- update_view_times (gcal, start_time);
- gnome_calendar_update_date_navigator (gcal);
- gnome_calendar_notify_dates_shown_changed (gcal);
-}
-
-/**
- * gnome_calendar_get_selected_time_range:
- * @gcal: A calendar view.
- * @start_time: Return value for the start of the time selection.
- * @end_time: Return value for the end of the time selection.
- *
- * Queries the time selection range on the calendar view.
- **/
-void
-gnome_calendar_get_selected_time_range (GnomeCalendar *gcal,
- time_t *start_time,
- time_t *end_time)
-{
- GnomeCalendarPrivate *priv;
- ECalModel *model;
-
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- priv = gcal->priv;
-
- model = e_calendar_view_get_model (priv->views[priv->current_view_type]);
- e_cal_model_get_time_range (model, start_time, end_time);
-}
-
-/**
- * gnome_calendar_new_task:
- * @gcal: An Evolution calendar.
- *
- * Opens a task editor dialog for a new task.
- **/
-void
-gnome_calendar_new_task (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- ECal *ecal;
- ECalModel *model;
- TaskEditor *tedit;
- ECalComponent *comp;
- icalcomponent *icalcomp;
- const char *category;
-
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- priv = gcal->priv;
-
- model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo));
- ecal = e_cal_model_get_default_client (model);
- if (!ecal)
- return;
-
- tedit = task_editor_new (ecal, FALSE);
-
- icalcomp = e_cal_model_create_component_with_defaults (model);
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomp);
-
- category = cal_search_bar_get_category (CAL_SEARCH_BAR (priv->search_bar));
- e_cal_component_set_categories (comp, category);
-
- comp_editor_edit_comp (COMP_EDITOR (tedit), comp);
- g_object_unref (comp);
-
- comp_editor_focus (COMP_EDITOR (tedit));
-}
-
-
-/* Returns the selected time range for the current view. Note that this may be
- different from the fields in the GnomeCalendar, since the view may clip
- this or choose a more appropriate time. */
-void
-gnome_calendar_get_current_time_range (GnomeCalendar *gcal,
- time_t *start_time,
- time_t *end_time)
-{
- GnomeCalendarPrivate *priv;
-
- priv = gcal->priv;
-
- e_calendar_view_get_selected_time_range (E_CALENDAR_VIEW (gnome_calendar_get_current_view_widget (gcal)),
- start_time, end_time);
-}
-
-
-/* Gets the visible time range for the current view. Returns FALSE if no
- time range has been set yet. */
-gboolean
-gnome_calendar_get_visible_time_range (GnomeCalendar *gcal,
- time_t *start_time,
- time_t *end_time)
-{
- GnomeCalendarPrivate *priv;
- gboolean retval = FALSE;
-
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), FALSE);
-
- priv = gcal->priv;
-
- retval = e_calendar_view_get_visible_time_range (E_CALENDAR_VIEW (gnome_calendar_get_current_view_widget (gcal)),
- start_time, end_time);
-
- return retval;
-}
-
-/* This updates the month shown and the days selected in the calendar, if
- necessary. */
-static void
-gnome_calendar_update_date_navigator (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- ECalModel *model;
- time_t start, end;
- GDate start_date, end_date;
-
- priv = gcal->priv;
-
- /* If the ECalendar isn't visible, we just return. */
- if (!GTK_WIDGET_VISIBLE (priv->date_navigator))
- return;
-
- model = e_calendar_view_get_model (priv->views[priv->current_view_type]);
- e_cal_model_get_time_range (model, &start, &end);
-
- time_to_gdate_with_zone (&start_date, start, priv->zone);
- if (priv->current_view_type == GNOME_CAL_MONTH_VIEW) {
- EWeekView *week_view = E_WEEK_VIEW (priv->views[priv->current_view_type]);
-
- if (priv->week_start == 0
- && (!week_view->multi_week_view || week_view->compress_weekend))
- g_date_add_days (&start_date, 1);
- }
- time_to_gdate_with_zone (&end_date, end, priv->zone);
- g_date_subtract_days (&end_date, 1);
-
- e_calendar_item_set_selection (priv->date_navigator->calitem,
- &start_date, &end_date);
-}
-
-static void
-gnome_calendar_on_date_navigator_selection_changed (ECalendarItem *calitem, GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- GnomeCalendarViewType view_type;
- ECalModel *model;
- GDate start_date, end_date, new_start_date, new_end_date;
- gint new_days_shown;
- gboolean starts_on_week_start_day;
- time_t new_time, start, end;
- struct icaltimetype tt;
-
- priv = gcal->priv;
-
- starts_on_week_start_day = FALSE;
-
- model = e_calendar_view_get_model (priv->views[priv->current_view_type]);
- e_cal_model_get_time_range (model, &start, &end);
-
- time_to_gdate_with_zone (&start_date, start, priv->zone);
- if (priv->current_view_type == GNOME_CAL_MONTH_VIEW) {
- EWeekView *week_view = E_WEEK_VIEW (priv->views[priv->current_view_type]);
-
- if (priv->week_start == 0 && (!week_view->multi_week_view || week_view->compress_weekend))
- g_date_add_days (&start_date, 1);
- }
- time_to_gdate_with_zone (&end_date, end, priv->zone);
- g_date_subtract_days (&end_date, 1);
-
- e_calendar_item_get_selection (calitem, &new_start_date, &new_end_date);
-
- /* If the selection hasn't changed just return. */
- if (!g_date_compare (&start_date, &new_start_date)
- && !g_date_compare (&end_date, &new_end_date))
- return;
-
- new_days_shown = g_date_julian (&new_end_date) - g_date_julian (&new_start_date) + 1;
-
- /* If a complete week is selected we show the Week view.
- Note that if weekends are compressed and the week start day is set
- to Sunday we don't actually show complete weeks in the Week view,
- so this may need tweaking. */
- if (g_date_weekday (&new_start_date) % 7 == priv->week_start)
- starts_on_week_start_day = TRUE;
-
- /* Update selection to be in the new time range */
- tt = icaltime_null_time ();
- tt.year = g_date_year (&new_start_date);
- tt.month = g_date_month (&new_start_date);
- tt.day = g_date_day (&new_start_date);
- new_time = icaltime_as_timet_with_zone (tt, priv->zone);
-
- /* Switch views as appropriate, and change the number of days or weeks
- shown. */
- if (new_days_shown > 9) {
- /* FIXME Gross hack so that the view times are updated properly */
- priv->range_selected = TRUE;
-
- e_week_view_set_weeks_shown (E_WEEK_VIEW (priv->month_view),
- (new_days_shown + 6) / 7);
- view_type = GNOME_CAL_MONTH_VIEW;
- } else if (new_days_shown == 7 && starts_on_week_start_day) {
- view_type = GNOME_CAL_WEEK_VIEW;
- } else {
- e_day_view_set_days_shown (E_DAY_VIEW (priv->day_view), new_days_shown);
-
- if (new_days_shown == 5 && starts_on_week_start_day
- && priv->current_view_type == GNOME_CAL_WORK_WEEK_VIEW)
- view_type = GNOME_CAL_WORK_WEEK_VIEW;
- else
- view_type = GNOME_CAL_DAY_VIEW;
- }
-
- /* Make the views display things properly */
- update_view_times (gcal, new_time);
-
- set_view (gcal, view_type, TRUE);
- gnome_calendar_notify_dates_shown_changed (gcal);
-}
-
-static void
-gnome_calendar_on_date_navigator_date_range_changed (ECalendarItem *calitem, GnomeCalendar *gcal)
-{
- update_query (gcal);
-}
-
-static void
-gnome_calendar_hpane_realized (GtkWidget *w, GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
-
- priv = gcal->priv;
-
- if (priv->current_view_type == GNOME_CAL_MONTH_VIEW && !priv->range_selected) {
- gtk_paned_set_position (GTK_PANED (priv->hpane), priv->hpane_pos_month_view);
- } else {
- gtk_paned_set_position (GTK_PANED (priv->hpane), priv->hpane_pos);
- }
-}
-
-static void
-gnome_calendar_vpane_realized (GtkWidget *w, GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
-
- priv = gcal->priv;
-
- if (priv->current_view_type == GNOME_CAL_MONTH_VIEW && !priv->range_selected) {
- gtk_paned_set_position (GTK_PANED (priv->vpane), priv->vpane_pos_month_view);
- } else {
- gtk_paned_set_position (GTK_PANED (priv->vpane), priv->vpane_pos);
- }
-}
-
-static gboolean
-gnome_calendar_vpane_resized (GtkWidget *w, GdkEventButton *e, GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
-
- priv = gcal->priv;
-
- if (priv->current_view_type == GNOME_CAL_MONTH_VIEW && !priv->range_selected) {
- priv->vpane_pos_month_view = gtk_paned_get_position (GTK_PANED (priv->vpane));
- calendar_config_set_month_vpane_pos (priv->vpane_pos_month_view);
- } else {
- priv->vpane_pos = gtk_paned_get_position (GTK_PANED (priv->vpane));
- calendar_config_set_vpane_pos (priv->vpane_pos);
- }
-
- return FALSE;
-}
-
-static gboolean
-gnome_calendar_hpane_resized (GtkWidget *w, GdkEventButton *e, GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- gint times_width;
-
- priv = gcal->priv;
-
- if (priv->current_view_type == GNOME_CAL_MONTH_VIEW && !priv->range_selected) {
- priv->hpane_pos_month_view = gtk_paned_get_position (GTK_PANED (priv->hpane));
- calendar_config_set_month_hpane_pos (priv->hpane_pos_month_view);
- } else {
- priv->hpane_pos = gtk_paned_get_position (GTK_PANED (priv->hpane));
- calendar_config_set_hpane_pos (priv->hpane_pos);
- }
-
- /* adjust the size of the EDayView's time column */
- times_width = e_day_view_time_item_get_column_width (
- E_DAY_VIEW_TIME_ITEM (E_DAY_VIEW (priv->day_view)->time_canvas_item));
- if (times_width < priv->hpane_pos - 20)
- gtk_widget_set_usize (E_DAY_VIEW (priv->day_view)->time_canvas, times_width, -1);
- else
- gtk_widget_set_usize (E_DAY_VIEW (priv->day_view)->time_canvas, priv->hpane_pos - 20, -1);
-
-
- return FALSE;
-}
-
-void
-gnome_calendar_cut_clipboard (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- FocusLocation location;
-
- priv = gcal->priv;
-
- location = get_focus_location (gcal);
-
- if (location == FOCUS_CALENDAR) {
- e_calendar_view_cut_clipboard (E_CALENDAR_VIEW (gnome_calendar_get_current_view_widget (gcal)));
- } else if (location == FOCUS_TASKPAD)
- e_calendar_table_cut_clipboard (E_CALENDAR_TABLE (priv->todo));
-}
-
-void
-gnome_calendar_copy_clipboard (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- FocusLocation location;
-
- priv = gcal->priv;
-
- location = get_focus_location (gcal);
-
- if (location == FOCUS_CALENDAR) {
- e_calendar_view_copy_clipboard (E_CALENDAR_VIEW (gnome_calendar_get_current_view_widget (gcal)));
- } else if (location == FOCUS_TASKPAD)
- e_calendar_table_copy_clipboard (E_CALENDAR_TABLE (priv->todo));
-}
-
-void
-gnome_calendar_paste_clipboard (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- FocusLocation location;
-
- priv = gcal->priv;
-
- location = get_focus_location (gcal);
-
- if (location == FOCUS_CALENDAR) {
- e_calendar_view_paste_clipboard (E_CALENDAR_VIEW (gnome_calendar_get_current_view_widget (gcal)));
- } else if (location == FOCUS_TASKPAD)
- e_calendar_table_paste_clipboard (E_CALENDAR_TABLE (priv->todo));
-}
-
-
-/* Get the current timezone. */
-icaltimezone*
-gnome_calendar_get_timezone (GnomeCalendar *gcal)
-{
- g_return_val_if_fail (gcal != NULL, NULL);
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL);
-
- return gcal->priv->zone;
-}
-
-
-static void
-gnome_calendar_notify_dates_shown_changed (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- time_t start_time, end_time;
-
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- priv = gcal->priv;
-
- /* If no time range is set yet, just return. */
- if (!gnome_calendar_get_visible_time_range (gcal, &start_time,
- &end_time))
- return;
-
- /* We check if the visible date range has changed, and only emit the
- signal if it has. (This makes sure we only change the folder title
- bar label in the shell when we need to.) */
- if (priv->visible_start != start_time
- || priv->visible_end != end_time) {
- priv->visible_start = start_time;
- priv->visible_end = end_time;
-
- gtk_signal_emit (GTK_OBJECT (gcal),
- gnome_calendar_signals[DATES_SHOWN_CHANGED]);
- }
-}
-
-
-/* Returns the number of selected events (0 or 1 at present). */
-gint
-gnome_calendar_get_num_events_selected (GnomeCalendar *gcal)
-{
- GtkWidget *view;
- gint retval = 0;
-
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), 0);
-
- view = gnome_calendar_get_current_view_widget (gcal);
- if (E_IS_DAY_VIEW (view))
- retval = e_day_view_get_num_events_selected (E_DAY_VIEW (view));
- else
- retval = e_week_view_get_num_events_selected (E_WEEK_VIEW (view));
-
- return retval;
-}
-
-/**
- * gnome_calendar_get_num_tasks_selected:
- * @gcal: A calendar view.
- *
- * Queries the number of tasks that are currently selected in the task pad of a
- * calendar view.
- *
- * Return value: Number of selected tasks.
- **/
-gint
-gnome_calendar_get_num_tasks_selected (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- ETable *etable;
-
- g_return_val_if_fail (gcal != NULL, -1);
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), -1);
-
- priv = gcal->priv;
-
- etable = e_calendar_table_get_table (E_CALENDAR_TABLE (priv->todo));
- return e_table_selected_count (etable);
-}
-
-
-void
-gnome_calendar_delete_selection (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- FocusLocation location;
- GtkWidget *view;
-
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- priv = gcal->priv;
-
- location = get_focus_location (gcal);
-
- if (location == FOCUS_CALENDAR) {
- view = gnome_calendar_get_current_view_widget (gcal);
-
- e_calendar_view_delete_selected_events (E_CALENDAR_VIEW (view));
- } else if (location == FOCUS_TASKPAD)
- e_calendar_table_delete_selected (E_CALENDAR_TABLE (priv->todo));
-}
-
-void
-gnome_calendar_delete_selected_occurrence (GnomeCalendar *gcal)
-{
- GnomeCalendarPrivate *priv;
- FocusLocation location;
- GtkWidget *view;
-
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- priv = gcal->priv;
-
- location = get_focus_location (gcal);
-
- if (location == FOCUS_CALENDAR) {
-
- view = gnome_calendar_get_current_view_widget (gcal);
- e_calendar_view_delete_selected_occurrence (E_CALENDAR_VIEW (view));
- }
-}
-
-static gboolean
-check_instance_cb (ECalComponent *comp,
- time_t instance_start,
- time_t instance_end,
- gpointer data)
-{
- gboolean *remove = data;
-
- *remove = FALSE;
-
- return FALSE;
-}
-
-void
-gnome_calendar_purge (GnomeCalendar *gcal, time_t older_than)
-{
- GnomeCalendarPrivate *priv;
- char *sexp, *start, *end;
- GList *l;
-
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- priv = gcal->priv;
-
- start = isodate_from_time_t (0);
- end = isodate_from_time_t (older_than);
- sexp = g_strdup_printf ("(occur-in-time-range? (make-time \"%s\")"
- " (make-time \"%s\"))",
- start, end);
-
- e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), _("Purging"));
-
- /* FIXME Confirm expunge */
- for (l = priv->clients_list[E_CAL_SOURCE_TYPE_EVENT]; l != NULL; l = l->next) {
- ECal *client = l->data;
- GList *objects, *m;
- gboolean read_only;
-
- if (!e_cal_is_read_only (client, &read_only, NULL) || read_only)
- continue;
-
- if (!e_cal_get_object_list (client, sexp, &objects, NULL)) {
- g_warning (G_STRLOC ": Could not get the objects");
-
- continue;
- }
-
- for (m = objects; m; m = m->next) {
- gboolean remove = TRUE;
-
- /* FIXME write occur-before and occur-after
- * sexp funcs so we don't have to use the max
- * int */
- e_cal_generate_instances_for_object (client, m->data,
- older_than, G_MAXINT32,
- (ECalRecurInstanceFn) check_instance_cb,
- &remove);
-
- /* FIXME Better error handling */
- if (remove)
- e_cal_remove_object (client, icalcomponent_get_uid (m->data), NULL);
- }
- }
-
- e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL);
-
- g_free (sexp);
- g_free (start);
- g_free (end);
-
-}
-
-ECalendarTable*
-gnome_calendar_get_task_pad (GnomeCalendar *gcal)
-{
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL);
-
- return E_CALENDAR_TABLE (gcal->priv->todo);
-}
-
-GtkWidget *
-gnome_calendar_get_e_calendar_widget (GnomeCalendar *gcal)
-{
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL);
-
- return GTK_WIDGET(gcal->priv->date_navigator);
-}
-
-GtkWidget *
-gnome_calendar_get_search_bar_widget (GnomeCalendar *gcal)
-{
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL);
-
- return GTK_WIDGET(gcal->priv->search_bar);
-}
-
-GtkWidget *
-gnome_calendar_get_view_notebook_widget (GnomeCalendar *gcal)
-{
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL);
-
- return GTK_WIDGET(gcal->priv->notebook);
-}
-
-ECalMenu *gnome_calendar_get_taskpad_menu (GnomeCalendar *gcal)
-{
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL);
-
- return gcal->priv->taskpad_menu;
-}
-
-ECalMenu *gnome_calendar_get_calendar_menu (GnomeCalendar *gcal)
-{
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL);
-
- return gcal->priv->calendar_menu;
-}
diff --git a/calendar/gui/gnome-cal.h b/calendar/gui/gnome-cal.h
deleted file mode 100644
index 756a9ade84..0000000000
--- a/calendar/gui/gnome-cal.h
+++ /dev/null
@@ -1,192 +0,0 @@
-/* Evolution calendar - Main calendar view widget
- *
- * Copyright (C) 1998 The Free Software Foundation
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Miguel de Icaza <miguel@ximian.com>
- * Federico Mena-Quintero <federico@ximian.com>
- * Seth Alves <alves@hungry.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef GNOME_CALENDAR_APP_H
-#define GNOME_CALENDAR_APP_H
-
-#include <time.h>
-#include <gtk/gtkvbox.h>
-#include <bonobo/bonobo-ui-component.h>
-#include <widgets/misc/e-calendar.h>
-#include <libecal/e-cal.h>
-
-#include "e-calendar-table.h"
-
-G_BEGIN_DECLS
-
-
-
-struct _EPopup;
-
-#define GNOME_TYPE_CALENDAR (gnome_calendar_get_type ())
-#define GNOME_CALENDAR(obj) (GTK_CHECK_CAST ((obj), GNOME_TYPE_CALENDAR, GnomeCalendar))
-#define GNOME_CALENDAR_CLASS(klass) (GTK_CHECK_CAST_CLASS ((klass), GNOME_TYPE_CALENDAR, \
- GnomeCalendarClass))
-#define GNOME_IS_CALENDAR(obj) (GTK_CHECK_TYPE ((obj), GNOME_TYPE_CALENDAR))
-#define GNOME_IS_CALENDAR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_CALENDAR))
-
-typedef struct _GnomeCalendar GnomeCalendar;
-typedef struct _GnomeCalendarClass GnomeCalendarClass;
-typedef struct _GnomeCalendarPrivate GnomeCalendarPrivate;
-
-/* View types */
-typedef enum {
- GNOME_CAL_DAY_VIEW,
- GNOME_CAL_WORK_WEEK_VIEW,
- GNOME_CAL_WEEK_VIEW,
- GNOME_CAL_MONTH_VIEW,
- GNOME_CAL_LIST_VIEW,
- GNOME_CAL_LAST_VIEW
-} GnomeCalendarViewType;
-
-typedef enum {
- GNOME_CAL_GOTO_TODAY,
- GNOME_CAL_GOTO_DATE,
- GNOME_CAL_GOTO_FIRST_DAY_OF_MONTH,
- GNOME_CAL_GOTO_LAST_DAY_OF_MONTH,
- GNOME_CAL_GOTO_FIRST_DAY_OF_WEEK,
- GNOME_CAL_GOTO_LAST_DAY_OF_WEEK,
- GNOME_CAL_GOTO_SAME_DAY_OF_PREVIOUS_WEEK,
- GNOME_CAL_GOTO_SAME_DAY_OF_NEXT_WEEK
-} GnomeCalendarGotoDateType;
-
-struct _GnomeCalendar {
- GtkVBox vbox;
-
- /* Private data */
- GnomeCalendarPrivate *priv;
-};
-
-struct _GnomeCalendarClass {
- GtkVBoxClass parent_class;
-
- /* Notification signals */
- void (* dates_shown_changed) (GnomeCalendar *gcal);
-
- void (* calendar_selection_changed) (GnomeCalendar *gcal);
- void (* taskpad_selection_changed) (GnomeCalendar *gcal);
-
- void (* calendar_focus_change) (GnomeCalendar *gcal, gboolean in);
- void (* taskpad_focus_change) (GnomeCalendar *gcal, gboolean in);
-
- void (* source_added) (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source);
- void (* source_removed) (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source);
-
- /* Action signals */
- void (* goto_date) (GnomeCalendar *gcal, GnomeCalendarGotoDateType date);
-};
-
-
-GtkType gnome_calendar_get_type (void);
-GtkWidget *gnome_calendar_construct (GnomeCalendar *gcal);
-
-GtkWidget *gnome_calendar_new (void);
-
-void gnome_calendar_set_activity_handler (GnomeCalendar *cal, EActivityHandler *activity_handler);
-void gnome_calendar_set_ui_component (GnomeCalendar *cal, BonoboUIComponent *ui_component);
-
-ECalendarTable *gnome_calendar_get_task_pad (GnomeCalendar *gcal);
-
-ECalModel *gnome_calendar_get_calendar_model (GnomeCalendar *gcal);
-ECal *gnome_calendar_get_default_client (GnomeCalendar *gcal);
-
-gboolean gnome_calendar_add_source (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source);
-gboolean gnome_calendar_remove_source (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source);
-gboolean gnome_calendar_remove_source_by_uid (GnomeCalendar *gcal, ECalSourceType source_type, const char *uid);
-gboolean gnome_calendar_set_default_source (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source);
-
-void gnome_calendar_next (GnomeCalendar *gcal);
-void gnome_calendar_previous (GnomeCalendar *gcal);
-void gnome_calendar_goto (GnomeCalendar *gcal,
- time_t new_time);
-void gnome_calendar_dayjump (GnomeCalendar *gcal,
- time_t time);
-/* Jumps to the current day */
-void gnome_calendar_goto_today (GnomeCalendar *gcal);
-
-GnomeCalendarViewType gnome_calendar_get_view (GnomeCalendar *gcal);
-void gnome_calendar_set_view (GnomeCalendar *gcal, GnomeCalendarViewType view_type);
-
-GtkWidget *gnome_calendar_get_current_view_widget (GnomeCalendar *gcal);
-
-ECalendarTable *gnome_calendar_get_task_pad (GnomeCalendar *gcal);
-GtkWidget *gnome_calendar_get_e_calendar_widget (GnomeCalendar *gcal);
-GtkWidget *gnome_calendar_get_search_bar_widget (GnomeCalendar *gcal);
-GtkWidget *gnome_calendar_get_view_notebook_widget (GnomeCalendar *gcal);
-
-struct _ECalMenu *gnome_calendar_get_taskpad_menu (GnomeCalendar *gcal);
-struct _ECalMenu *gnome_calendar_get_calendar_menu (GnomeCalendar *gcal);
-
-void gnome_calendar_setup_view_menus (GnomeCalendar *gcal, BonoboUIComponent *uic);
-void gnome_calendar_discard_view_menus (GnomeCalendar *gcal);
-
-void gnome_calendar_view_popup_factory (GnomeCalendar *gcal, struct _EPopup *ep, const char *prefix);
-
-void gnome_calendar_set_selected_time_range (GnomeCalendar *gcal,
- time_t start_time,
- time_t end_time);
-void gnome_calendar_get_selected_time_range (GnomeCalendar *gcal,
- time_t *start_time,
- time_t *end_time);
-
-void gnome_calendar_new_task (GnomeCalendar *gcal);
-
-/* Returns the selected time range for the current view. Note that this may be
- different from the fields in the GnomeCalendar, since the view may clip
- this or choose a more appropriate time. */
-void gnome_calendar_get_current_time_range (GnomeCalendar *gcal,
- time_t *start_time,
- time_t *end_time);
-
-/* Gets the visible time range for the current view. Returns FALSE if no
- time range has been set yet. */
-gboolean gnome_calendar_get_visible_time_range (GnomeCalendar *gcal,
- time_t *start_time,
- time_t *end_time);
-
-/* Returns the number of selected events (0 or 1 at present). */
-gint gnome_calendar_get_num_events_selected (GnomeCalendar *gcal);
-
-/* Returns the number of selected tasks */
-gint gnome_calendar_get_num_tasks_selected (GnomeCalendar *gcal);
-
-/* Get the current timezone. */
-icaltimezone *gnome_calendar_get_timezone (GnomeCalendar *gcal);
-
-
-/* Clipboard operations */
-void gnome_calendar_cut_clipboard (GnomeCalendar *gcal);
-void gnome_calendar_copy_clipboard (GnomeCalendar *gcal);
-void gnome_calendar_paste_clipboard (GnomeCalendar *gcal);
-
-void gnome_calendar_delete_selection (GnomeCalendar *gcal);
-void gnome_calendar_delete_selected_occurrence (GnomeCalendar *gcal);
-void gnome_calendar_purge (GnomeCalendar *gcal,
- time_t older_than);
-
-
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/gnome-calendar-conduit.png b/calendar/gui/gnome-calendar-conduit.png
deleted file mode 100644
index e867ba90b2..0000000000
--- a/calendar/gui/gnome-calendar-conduit.png
+++ /dev/null
Binary files differ
diff --git a/calendar/gui/goto-dialog.glade b/calendar/gui/goto-dialog.glade
deleted file mode 100644
index f976fe5214..0000000000
--- a/calendar/gui/goto-dialog.glade
+++ /dev/null
@@ -1,225 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkDialog" id="goto-dialog">
- <property name="title" translatable="yes">Select Date</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="has_separator">True</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">8</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="button4">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Select Today</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">0</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="button5">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">-6</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">4</property>
-
- <child>
- <widget class="GtkHBox" id="hbox12">
- <property name="visible">True</property>
- <property name="homogeneous">True</property>
- <property name="spacing">4</property>
-
- <child>
- <widget class="GtkOptionMenu" id="month">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget1">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">January</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">February</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget4">
- <property name="visible">True</property>
- <property name="label" translatable="yes">March</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget5">
- <property name="visible">True</property>
- <property name="label" translatable="yes">April</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget6">
- <property name="visible">True</property>
- <property name="label" translatable="yes">May</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget7">
- <property name="visible">True</property>
- <property name="label" translatable="yes">June</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget8">
- <property name="visible">True</property>
- <property name="label" translatable="yes">July</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget9">
- <property name="visible">True</property>
- <property name="label" translatable="yes">August</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget10">
- <property name="visible">True</property>
- <property name="label" translatable="yes">September</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget11">
- <property name="visible">True</property>
- <property name="label" translatable="yes">October</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget12">
- <property name="visible">True</property>
- <property name="label" translatable="yes">November</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget13">
- <property name="visible">True</property>
- <property name="label" translatable="yes">December</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="year">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_IF_VALID</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">1969 1969 2038 1 5 10</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <placeholder/>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/calendar/gui/goto.c b/calendar/gui/goto.c
deleted file mode 100644
index 89d37455ca..0000000000
--- a/calendar/gui/goto.c
+++ /dev/null
@@ -1,264 +0,0 @@
-/* Go to date dialog for Evolution
- *
- * Copyright (C) 1998 Red Hat, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena <federico@ximian.com>
- * JP Rosevear <jpr@ximian.com>
- */
-
-#include <config.h>
-#include <gtk/gtkmenu.h>
-#include <gtk/gtkoptionmenu.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkspinbutton.h>
-#include <gtk/gtktogglebutton.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtkdialog.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <glade/glade.h>
-#include "calendar-commands.h"
-#include "calendar-config.h"
-#include "tag-calendar.h"
-#include "goto.h"
-
-typedef struct
-{
- GladeXML *xml;
- GtkWidget *dialog;
-
- GtkWidget *month;
- GtkWidget *year;
- ECalendar *ecal;
- GtkWidget *vbox;
-
- GnomeCalendar *gcal;
- gint year_val;
- gint month_val;
- gint day_val;
-
-} GoToDialog;
-
-GoToDialog *dlg = NULL;
-
-/* Callback used when the year adjustment is changed */
-static void
-year_changed (GtkAdjustment *adj, gpointer data)
-{
- GoToDialog *dlg = data;
-
- dlg->year_val = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (dlg->year));
- e_calendar_item_set_first_month (dlg->ecal->calitem, dlg->year_val, dlg->month_val);
-}
-
-/* Callback used when a month button is toggled */
-static void
-month_changed (GtkToggleButton *toggle, gpointer data)
-{
- GoToDialog *dlg = data;
- GtkWidget *menu, *active;
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (dlg->month));
- active = gtk_menu_get_active (GTK_MENU (menu));
- dlg->month_val = g_list_index (GTK_MENU_SHELL (menu)->children, active);
-
- e_calendar_item_set_first_month (dlg->ecal->calitem, dlg->year_val, dlg->month_val);
-}
-
-static void
-ecal_date_range_changed (ECalendarItem *calitem, gpointer user_data)
-{
- GoToDialog *dlg = user_data;
- ECal *client;
-
- client = gnome_calendar_get_default_client (dlg->gcal);
- if (client)
- tag_calendar_by_client (dlg->ecal, client);
-}
-
-/* Event handler for day groups in the month item. A button press makes the calendar jump to the
- * selected day and destroys the Go-to dialog box.
- */
-static void
-ecal_event (ECalendarItem *calitem, gpointer user_data)
-{
- GoToDialog *dlg = user_data;
- GDate start_date, end_date;
- struct icaltimetype tt = icaltime_null_time ();
- time_t et;
-
- e_calendar_item_get_selection (calitem, &start_date, &end_date);
-
- tt.year = g_date_year (&start_date);
- tt.month = g_date_month (&start_date);
- tt.day = g_date_day (&start_date);
-
- et = icaltime_as_timet_with_zone (tt, gnome_calendar_get_timezone (dlg->gcal));
-
- gnome_calendar_goto (dlg->gcal, et);
-
- gtk_dialog_response (GTK_DIALOG (dlg->dialog), GTK_RESPONSE_NONE);
- /* gnome_dialog_close (GNOME_DIALOG (dlg->dialog)); */
-}
-
-/* Returns the current time, for the ECalendarItem. */
-static struct tm
-get_current_time (ECalendarItem *calitem, gpointer data)
-{
- icaltimezone *zone;
- struct tm tmp_tm = { 0 };
- struct icaltimetype tt;
-
- /* Get the current timezone. */
- zone = calendar_config_get_icaltimezone ();
-
- tt = icaltime_from_timet_with_zone (time (NULL), FALSE, zone);
-
- /* Now copy it to the struct tm and return it. */
- tmp_tm.tm_year = tt.year - 1900;
- tmp_tm.tm_mon = tt.month - 1;
- tmp_tm.tm_mday = tt.day;
- tmp_tm.tm_hour = tt.hour;
- tmp_tm.tm_min = tt.minute;
- tmp_tm.tm_sec = tt.second;
- tmp_tm.tm_isdst = -1;
-
- return tmp_tm;
-}
-
-/* Creates the ecalendar */
-static void
-create_ecal (GoToDialog *dlg)
-{
- ECalendarItem *calitem;
-
- dlg->ecal = E_CALENDAR (e_calendar_new ());
- calitem = dlg->ecal->calitem;
-
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (calitem),
- "move_selection_when_moving", FALSE,
- NULL);
- e_calendar_item_set_display_popup (calitem, FALSE);
- gtk_widget_show (GTK_WIDGET (dlg->ecal));
- gtk_box_pack_start (GTK_BOX (dlg->vbox), GTK_WIDGET (dlg->ecal), TRUE, TRUE, 0);
-
- e_calendar_item_set_first_month (calitem, dlg->year_val, dlg->month_val);
- e_calendar_item_set_get_time_callback (calitem,
- get_current_time,
- dlg, NULL);
-
- ecal_date_range_changed (calitem, dlg);
-}
-
-static void
-goto_today (GoToDialog *dlg)
-{
- gnome_calendar_goto_today (dlg->gcal);
-}
-
-/* Gets the widgets from the XML file and returns if they are all available. */
-static gboolean
-get_widgets (GoToDialog *dlg)
-{
-#define GW(name) glade_xml_get_widget (dlg->xml, name)
-
- dlg->dialog = GW ("goto-dialog");
-
- dlg->month = GW ("month");
- dlg->year = GW ("year");
- dlg->vbox = GW ("vbox");
-
-#undef GW
-
- return (dlg->dialog
- && dlg->month
- && dlg->year
- && dlg->vbox);
-}
-
-static void
-goto_dialog_init_widgets (GoToDialog *dlg)
-{
- GtkWidget *menu;
- GtkAdjustment *adj;
- GList *l;
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (dlg->month));
- for (l = GTK_MENU_SHELL (menu)->children; l != NULL; l = l->next)
- g_signal_connect (menu, "selection_done", G_CALLBACK (month_changed), dlg);
-
- adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (dlg->year));
- g_signal_connect (adj, "value_changed", G_CALLBACK (year_changed), dlg);
-
- g_signal_connect (dlg->ecal->calitem, "date_range_changed", G_CALLBACK (ecal_date_range_changed), dlg);
- g_signal_connect (dlg->ecal->calitem, "selection_changed", G_CALLBACK (ecal_event), dlg);
-}
-
-/* Creates a "goto date" dialog and runs it */
-void
-goto_dialog (GnomeCalendar *gcal)
-{
- GtkWidget *menu;
- time_t start_time;
- struct icaltimetype tt;
- int b;
-
- if (dlg) {
- return;
- }
-
- dlg = g_new0 (GoToDialog, 1);
-
- /* Load the content widgets */
- dlg->xml = glade_xml_new (EVOLUTION_GLADEDIR "/goto-dialog.glade", NULL, NULL);
- if (!dlg->xml) {
- g_message ("goto_dialog(): Could not load the Glade XML file!");
- g_free (dlg);
- return;
- }
-
- if (!get_widgets (dlg)) {
- g_message ("goto_dialog(): Could not find all widgets in the XML file!");
- g_free (dlg);
- return;
- }
- dlg->gcal = gcal;
-
- gnome_calendar_get_selected_time_range (dlg->gcal, &start_time, NULL);
- tt = icaltime_from_timet_with_zone (start_time, FALSE, gnome_calendar_get_timezone (gcal));
- dlg->year_val = tt.year;
- dlg->month_val = tt.month - 1;
- dlg->day_val = tt.day;
-
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (dlg->month));
- gtk_option_menu_set_history (GTK_OPTION_MENU (dlg->month), dlg->month_val);
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (dlg->year), dlg->year_val);
-
- create_ecal (dlg);
-
- goto_dialog_init_widgets (dlg);
-
- gtk_window_set_transient_for (GTK_WINDOW (dlg->dialog),
- GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gcal))));
-
- /* set initial selection to current day */
-
- dlg->ecal->calitem->selection_set = TRUE;
- dlg->ecal->calitem->selection_start_month_offset = 0;
- dlg->ecal->calitem->selection_start_day = tt.day;
- dlg->ecal->calitem->selection_end_month_offset = 0;
- dlg->ecal->calitem->selection_end_day = tt.day;
-
- gnome_canvas_item_grab_focus (GNOME_CANVAS_ITEM (dlg->ecal->calitem));
-
- b = gtk_dialog_run (GTK_DIALOG (dlg->dialog));
- gtk_widget_destroy (dlg->dialog);
-
- if (b == 0)
- goto_today (dlg);
-
- g_object_unref (dlg->xml);
- g_free (dlg);
- dlg = NULL;
-}
diff --git a/calendar/gui/goto.h b/calendar/gui/goto.h
deleted file mode 100644
index 9ecfeeeb83..0000000000
--- a/calendar/gui/goto.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Evolution calendar - Go To Date dialog
- *
- * Copyright (C) 1998 Red Hat, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena <federico@ximian.com>
- * JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef GOTO_DIALOG_H
-#define GOTO_DIALOG_H
-
-#include "gnome-cal.h"
-
-void goto_dialog (GnomeCalendar *gcal);
-
-#endif
diff --git a/calendar/gui/itip-bonobo-control.c b/calendar/gui/itip-bonobo-control.c
deleted file mode 100644
index 391bc1f73d..0000000000
--- a/calendar/gui/itip-bonobo-control.c
+++ /dev/null
@@ -1,265 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution calendar - Control for displaying iTIP mail messages
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Author: Jesse Pavel <jpavel@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-#include <string.h>
-#include <glib.h>
-#include <gtk/gtkobject.h>
-#include <gtk/gtkwidget.h>
-#include <bonobo/bonobo-generic-factory.h>
-#include <bonobo/bonobo-control.h>
-#include <bonobo/bonobo-property-bag.h>
-#include <bonobo/bonobo-persist-stream.h>
-#include <bonobo/bonobo-stream-client.h>
-#include <bonobo/bonobo-context.h>
-#include <bonobo/bonobo-exception.h>
-#include <libical/ical.h>
-
-#include "e-itip-control.h"
-#include "itip-bonobo-control.h"
-
-extern gchar *evolution_dir;
-
-enum E_ITIP_BONOBO_ARGS {
- FROM_ADDRESS_ARG_ID,
- VIEW_ONLY_ARG_ID
-};
-
-/*
- * Bonobo::PersistStream
- *
- * These two functions implement the Bonobo::PersistStream load and
- * save methods which allow data to be loaded into and out of the
- * BonoboObject.
- */
-
-static char *
-stream_read (Bonobo_Stream stream)
-{
- Bonobo_Stream_iobuf *buffer;
- CORBA_Environment ev;
- gchar *data = NULL;
- gint length = 0;
-
- CORBA_exception_init (&ev);
- do {
-#define READ_CHUNK_SIZE 65536
- Bonobo_Stream_read (stream, READ_CHUNK_SIZE,
- &buffer, &ev);
-
- if (BONOBO_EX (&ev)) {
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- if (buffer->_length <= 0)
- break;
-
- data = g_realloc (data, length + buffer->_length + 1);
- memcpy (data + length, buffer->_buffer, buffer->_length);
- length += buffer->_length;
- data[length] = '\0';
-
- CORBA_free (buffer);
-#undef READ_CHUNK_SIZE
- } while (1);
-
- CORBA_free (buffer);
- CORBA_exception_free (&ev);
-
- if (data == NULL)
- data = g_strdup("");
-
- return data;
-} /* stream_read */
-
-/*
- * This function implements the Bonobo::PersistStream:load method.
- */
-typedef struct {
- EItipControl *itip;
- char *text;
-} idle_data;
-
-static gboolean
-set_data_idle_cb (gpointer data)
-{
- idle_data *id = data;
-
- e_itip_control_set_data (id->itip, id->text);
- g_object_unref (id->itip);
- g_free (id->text);
- g_free (id);
-
- return FALSE;
-}
-
-static void
-pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream,
- Bonobo_Persist_ContentType type, void *data,
- CORBA_Environment *ev)
-{
- EItipControl *itip = data;
- idle_data *id;
-
- if (type && g_strcasecmp (type, "text/calendar") != 0 &&
- g_strcasecmp (type, "text/x-calendar") != 0) {
- bonobo_exception_set (ev, ex_Bonobo_Persist_WrongDataType);
- return;
- }
-
- id = g_new0 (idle_data, 1);
- if ((id->text = stream_read (stream)) == NULL) {
- bonobo_exception_set (ev, ex_Bonobo_Persist_FileNotFound);
- g_free (id);
- return;
- }
- g_object_ref (itip);
- id->itip = itip;
-
- g_idle_add (set_data_idle_cb, id);
-}
-/*
- * This function implements the Bonobo::PersistStream:save method.
- */
-static void
-pstream_save (BonoboPersistStream *ps, const Bonobo_Stream stream,
- Bonobo_Persist_ContentType type, void *data,
- CORBA_Environment *ev)
-{
- EItipControl *itip = data;
- gchar *text;
- gint len;
-
- if (type && g_strcasecmp (type, "text/calendar") != 0 &&
- g_strcasecmp (type, "text/x-calendar") != 0) {
- bonobo_exception_set (ev, ex_Bonobo_Persist_WrongDataType);
- return;
- }
-
- text = e_itip_control_get_data (itip);
- len = e_itip_control_get_data_size (itip);
-
- bonobo_stream_client_write (stream, text, len, ev);
- g_free (text);
-} /* pstream_save */
-
-/* static CORBA_long */
-/* pstream_get_max_size (BonoboPersistStream *ps, void *data, */
-/* CORBA_Environment *ev) */
-/* { */
-/* EItipControl *itip = data; */
-/* gint len; */
-
-/* len = e_itip_control_get_data_size (itip); */
-
-/* if (len > 0) */
-/* return len; */
-
-/* return 0L; */
-/* } */
-
-static Bonobo_Persist_ContentTypeList *
-pstream_get_content_types (BonoboPersistStream *ps, void *closure,
- CORBA_Environment *ev)
-{
- return bonobo_persist_generate_content_types (2, "text/calendar", "text/x-calendar");
-}
-
-static void
-get_prop (BonoboPropertyBag *bag,
- BonoboArg *arg,
- guint arg_id,
- CORBA_Environment *ev,
- gpointer user_data)
-{
- EItipControl *itip = user_data;
-
- switch (arg_id) {
- case FROM_ADDRESS_ARG_ID:
- BONOBO_ARG_SET_STRING (arg, e_itip_control_get_from_address (itip));
- break;
- case VIEW_ONLY_ARG_ID:
- BONOBO_ARG_SET_INT (arg, e_itip_control_get_view_only (itip));
- break;
- }
-}
-
-static void
-set_prop ( BonoboPropertyBag *bag,
- const BonoboArg *arg,
- guint arg_id,
- CORBA_Environment *ev,
- gpointer user_data)
-{
- EItipControl *itip = user_data;
-
- switch (arg_id) {
- case FROM_ADDRESS_ARG_ID:
- e_itip_control_set_from_address (itip, BONOBO_ARG_GET_STRING (arg));
- break;
- case VIEW_ONLY_ARG_ID:
- e_itip_control_set_view_only (itip, BONOBO_ARG_GET_INT (arg));
- break;
- }
-}
-
-
-BonoboControl *
-itip_bonobo_control_new (void)
-{
- BonoboControl *control;
- BonoboPropertyBag *prop_bag;
- BonoboPersistStream *stream;
- GtkWidget *itip;
-
- itip = e_itip_control_new ();
- gtk_widget_show (itip);
- control = bonobo_control_new (itip);
-
- /* create a property bag */
- prop_bag = bonobo_property_bag_new (get_prop, set_prop, itip);
- bonobo_property_bag_add (prop_bag, "from_address", FROM_ADDRESS_ARG_ID, BONOBO_ARG_STRING, NULL,
- "from_address", 0 );
- bonobo_property_bag_add (prop_bag, "view_only", VIEW_ONLY_ARG_ID, BONOBO_ARG_INT, NULL,
- "view_only", 0 );
-
- bonobo_control_set_properties (control, bonobo_object_corba_objref (BONOBO_OBJECT (prop_bag)), NULL);
- bonobo_object_unref (BONOBO_OBJECT (prop_bag));
-
- bonobo_control_set_automerge (control, TRUE);
-
- stream = bonobo_persist_stream_new (pstream_load, pstream_save,
- pstream_get_content_types,
- "OAFIID:GNOME_Evolution_Calendar_iTip_Control:" BASE_VERSION,
- itip);
-
- if (stream == NULL) {
- bonobo_object_unref (BONOBO_OBJECT (control));
- return NULL;
- }
-
- bonobo_object_add_interface (BONOBO_OBJECT (control),
- BONOBO_OBJECT (stream));
-
- return control;
-}
diff --git a/calendar/gui/itip-bonobo-control.h b/calendar/gui/itip-bonobo-control.h
deleted file mode 100644
index 11b33e6602..0000000000
--- a/calendar/gui/itip-bonobo-control.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Evolution calendar - Control for displaying iTIP mail messages
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors:
- * Jesse Pavel <jpavel@ximian.com>
- * JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef __ITIP_CONTROL_FACTORY_H__
-#define __ITIP_CONTROL_FACTORY_H__
-
-#include <bonobo/bonobo-control.h>
-
-BonoboControl *itip_bonobo_control_new (void);
-
-#endif /* __ITIP_CONTROL_H__ */
diff --git a/calendar/gui/itip-utils.c b/calendar/gui/itip-utils.c
deleted file mode 100644
index a9fac69138..0000000000
--- a/calendar/gui/itip-utils.c
+++ /dev/null
@@ -1,1257 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * JP Rosevear <jpr@ximian.com>
- *
- * Copyright 2001, Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <bonobo/bonobo-exception.h>
-#include <bonobo/bonobo-object.h>
-#include <bonobo/bonobo-moniker-util.h>
-#include <libgnome/gnome-i18n.h>
-#include <gtk/gtkmessagedialog.h>
-#include <gtk/gtkwidget.h>
-#include <libical/ical.h>
-#include <Evolution-Composer.h>
-#include <e-util/e-dialog-utils.h>
-#include <e-util/e-time-utils.h>
-#include <libecal/e-cal-time-util.h>
-#include <libecal/e-cal-util.h>
-#include <libsoup/soup-session-async.h>
-#include <libsoup/soup-message.h>
-#include <libsoup/soup-uri.h>
-#include "e-util/e-passwords.h"
-#include "calendar-config.h"
-#include "itip-utils.h"
-#include "dialogs/cal-attachment.h"
-
-#define GNOME_EVOLUTION_COMPOSER_OAFIID "OAFIID:GNOME_Evolution_Mail_Composer:" BASE_VERSION
-
-static gchar *itip_methods[] = {
- "PUBLISH",
- "REQUEST",
- "REPLY",
- "ADD",
- "CANCEL",
- "RERESH",
- "COUNTER",
- "DECLINECOUNTER"
-};
-
-static icalproperty_method itip_methods_enum[] = {
- ICAL_METHOD_PUBLISH,
- ICAL_METHOD_REQUEST,
- ICAL_METHOD_REPLY,
- ICAL_METHOD_ADD,
- ICAL_METHOD_CANCEL,
- ICAL_METHOD_REFRESH,
- ICAL_METHOD_COUNTER,
- ICAL_METHOD_DECLINECOUNTER,
-};
-
-static EAccountList *accounts = NULL;
-
-EAccountList *
-itip_addresses_get (void)
-{
- if (accounts == NULL) {
- GConfClient *gconf_client = gconf_client_get_default ();
- accounts = e_account_list_new (gconf_client);
- g_object_unref (gconf_client);
- }
-
- return accounts;
-}
-
-EAccount *
-itip_addresses_get_default (void)
-{
- return (EAccount *)e_account_list_get_default(itip_addresses_get());
-}
-
-gboolean
-itip_organizer_is_user (ECalComponent *comp, ECal *client)
-{
- ECalComponentOrganizer organizer;
- const char *strip;
- gboolean user_org = FALSE;
-
- if (!e_cal_component_has_organizer (comp))
- return FALSE;
-
- e_cal_component_get_organizer (comp, &organizer);
- if (organizer.value != NULL) {
-
- strip = itip_strip_mailto (organizer.value);
-
- if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS)) {
- char *email;
-
- if (e_cal_get_cal_address (client, &email, NULL) && !g_strcasecmp (email, strip)) {
- g_free (email);
-
- return TRUE;
- }
-
- return FALSE;
- }
-
- user_org = e_account_list_find(itip_addresses_get(), E_ACCOUNT_FIND_ID_ADDRESS, strip) != NULL;
- }
-
- return user_org;
-}
-
-gboolean
-itip_sentby_is_user (ECalComponent *comp)
-{
- ECalComponentOrganizer organizer;
- const char *strip;
- gboolean user_sentby = FALSE;
-
- if (!e_cal_component_has_organizer (comp))
- return FALSE;
-
- e_cal_component_get_organizer (comp, &organizer);
- if (organizer.sentby != NULL) {
- strip = itip_strip_mailto (organizer.sentby);
- user_sentby = e_account_list_find(itip_addresses_get(), E_ACCOUNT_FIND_ID_ADDRESS, strip) != NULL;
- }
-
- return user_sentby;
-}
-
-const gchar *
-itip_strip_mailto (const gchar *address)
-{
- if (address == NULL)
- return NULL;
-
- if (!g_strncasecmp (address, "mailto:", 7))
- address += 7;
-
- return address;
-}
-
-static char *
-get_label (struct icaltimetype *tt)
-{
- char buffer[1000];
- struct tm tmp_tm;
-
- tmp_tm = icaltimetype_to_tm (tt);
- e_time_format_date_and_time (&tmp_tm,
- calendar_config_get_24_hour_format (),
- FALSE, FALSE,
- buffer, 1000);
-
- return g_strdup (buffer);
-}
-
-typedef struct {
- GHashTable *tzids;
- icalcomponent *icomp;
- ECal *client;
- icalcomponent *zones;
-} ItipUtilTZData;
-
-
-static void
-foreach_tzid_callback (icalparameter *param, gpointer data)
-{
- ItipUtilTZData *tz_data = data;
- const char *tzid;
- icaltimezone *zone = NULL;
- icalcomponent *vtimezone_comp;
-
- /* Get the TZID string from the parameter. */
- tzid = icalparameter_get_tzid (param);
- if (!tzid || g_hash_table_lookup (tz_data->tzids, tzid))
- return;
-
- /* Look for the timezone */
- if (tz_data->zones != NULL)
- zone = icalcomponent_get_timezone (tz_data->zones, tzid);
- if (zone == NULL)
- zone = icaltimezone_get_builtin_timezone_from_tzid (tzid);
- if (zone == NULL && tz_data->client != NULL)
- e_cal_get_timezone (tz_data->client, tzid, &zone, NULL);
- if (zone == NULL)
- return;
-
- /* Convert it to a string and add it to the hash. */
- vtimezone_comp = icaltimezone_get_component (zone);
- if (!vtimezone_comp)
- return;
-
- icalcomponent_add_component (tz_data->icomp, icalcomponent_new_clone (vtimezone_comp));
- g_hash_table_insert (tz_data->tzids, (char *)tzid, (char *)tzid);
-}
-
-static icalcomponent *
-comp_toplevel_with_zones (ECalComponentItipMethod method, ECalComponent *comp, ECal *client, icalcomponent *zones)
-{
- icalcomponent *top_level, *icomp;
- icalproperty *prop;
- icalvalue *value;
- ItipUtilTZData tz_data;
-
- top_level = e_cal_util_new_top_level ();
-
- prop = icalproperty_new (ICAL_METHOD_PROPERTY);
- value = icalvalue_new_method (itip_methods_enum[method]);
- icalproperty_set_value (prop, value);
- icalcomponent_add_property (top_level, prop);
-
- icomp = e_cal_component_get_icalcomponent (comp);
- icomp = icalcomponent_new_clone (icomp);
-
- tz_data.tzids = g_hash_table_new (g_str_hash, g_str_equal);
- tz_data.icomp = top_level;
- tz_data.client = client;
- tz_data.zones = zones;
- icalcomponent_foreach_tzid (icomp, foreach_tzid_callback, &tz_data);
- g_hash_table_destroy (tz_data.tzids);
-
- icalcomponent_add_component (top_level, icomp);
-
- return top_level;
-}
-
-static gboolean
-users_has_attendee (GList *users, const char *address)
-{
- GList *l;
-
- for (l = users; l != NULL; l = l->next) {
- if (!g_strcasecmp (address, l->data))
- return TRUE;
- }
-
- return FALSE;
-}
-
-static CORBA_char *
-comp_from (ECalComponentItipMethod method, ECalComponent *comp)
-{
- ECalComponentOrganizer organizer;
- ECalComponentAttendee *attendee;
- GSList *attendees;
- CORBA_char *str;
-
- switch (method) {
- case E_CAL_COMPONENT_METHOD_PUBLISH:
- return CORBA_string_dup ("");
-
- case E_CAL_COMPONENT_METHOD_REQUEST:
- case E_CAL_COMPONENT_METHOD_CANCEL:
- case E_CAL_COMPONENT_METHOD_ADD:
- e_cal_component_get_organizer (comp, &organizer);
- if (organizer.value == NULL) {
- e_notice (NULL, GTK_MESSAGE_ERROR,
- _("An organizer must be set."));
- return NULL;
- }
-
- return CORBA_string_dup (itip_strip_mailto (organizer.value));
-
- default:
- if (!e_cal_component_has_attendees (comp))
- return CORBA_string_dup ("");
-
- e_cal_component_get_attendee_list (comp, &attendees);
- attendee = attendees->data;
- str = CORBA_string_dup (attendee->value ? itip_strip_mailto (attendee->value) : "");
- e_cal_component_free_attendee_list (attendees);
-
- return str;
- }
-}
-
-static GNOME_Evolution_Composer_RecipientList *
-comp_to_list (ECalComponentItipMethod method, ECalComponent *comp, GList *users)
-{
- GNOME_Evolution_Composer_RecipientList *to_list;
- GNOME_Evolution_Composer_Recipient *recipient;
- ECalComponentOrganizer organizer;
- GSList *attendees, *l;
- gint len;
-
- switch (method) {
- case E_CAL_COMPONENT_METHOD_REQUEST:
- case E_CAL_COMPONENT_METHOD_CANCEL:
- e_cal_component_get_attendee_list (comp, &attendees);
- len = g_slist_length (attendees);
- if (len <= 0) {
- e_notice (NULL, GTK_MESSAGE_ERROR,
- _("At least one attendee is necessary"));
- e_cal_component_free_attendee_list (attendees);
- return NULL;
- }
-
- to_list = GNOME_Evolution_Composer_RecipientList__alloc ();
- to_list->_maximum = len;
- to_list->_length = 0;
- to_list->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (len);
-
- e_cal_component_get_organizer (comp, &organizer);
- if (organizer.value == NULL) {
- e_notice (NULL, GTK_MESSAGE_ERROR,
- _("An organizer must be set."));
- return NULL;
- }
-
- for (l = attendees; l != NULL; l = l->next) {
- ECalComponentAttendee *att = l->data;
-
- if (users_has_attendee (users, att->value))
- continue;
- else if (!g_strcasecmp (att->value, organizer.value))
- continue;
-
- recipient = &(to_list->_buffer[to_list->_length]);
- if (att->cn)
- recipient->name = CORBA_string_dup (att->cn);
- else
- recipient->name = CORBA_string_dup ("");
- recipient->address = CORBA_string_dup (itip_strip_mailto (att->value));
-
- to_list->_length++;
- }
- e_cal_component_free_attendee_list (attendees);
- break;
-
- case E_CAL_COMPONENT_METHOD_REPLY:
- case E_CAL_COMPONENT_METHOD_ADD:
- case E_CAL_COMPONENT_METHOD_REFRESH:
- case E_CAL_COMPONENT_METHOD_COUNTER:
- case E_CAL_COMPONENT_METHOD_DECLINECOUNTER:
- e_cal_component_get_organizer (comp, &organizer);
- if (organizer.value == NULL) {
- e_notice (NULL, GTK_MESSAGE_ERROR,
- _("An organizer must be set."));
- return NULL;
- }
-
- len = 1;
-
- to_list = GNOME_Evolution_Composer_RecipientList__alloc ();
- to_list->_maximum = len;
- to_list->_length = len;
- to_list->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (len);
- recipient = &(to_list->_buffer[0]);
-
- if (organizer.cn != NULL)
- recipient->name = CORBA_string_dup (organizer.cn);
- else
- recipient->name = CORBA_string_dup ("");
- recipient->address = CORBA_string_dup (itip_strip_mailto (organizer.value));
- break;
-
- default:
- to_list = GNOME_Evolution_Composer_RecipientList__alloc ();
- to_list->_maximum = to_list->_length = 0;
- break;
- }
- CORBA_sequence_set_release (to_list, TRUE);
-
- return to_list;
-}
-
-static CORBA_char *
-comp_subject (ECalComponentItipMethod method, ECalComponent *comp)
-{
- ECalComponentText caltext;
- const char *description, *prefix = NULL;
- GSList *alist;
- CORBA_char *subject;
-
- e_cal_component_get_summary (comp, &caltext);
- if (caltext.value != NULL)
- description = caltext.value;
- else {
- switch (e_cal_component_get_vtype (comp)) {
- case E_CAL_COMPONENT_EVENT:
- description = _("Event information");
- case E_CAL_COMPONENT_TODO:
- description = _("Task information");
- case E_CAL_COMPONENT_JOURNAL:
- description = _("Journal information");
- case E_CAL_COMPONENT_FREEBUSY:
- description = _("Free/Busy information");
- default:
- description = _("Calendar information");
- }
- }
-
- switch (method) {
- case E_CAL_COMPONENT_METHOD_PUBLISH:
- case E_CAL_COMPONENT_METHOD_REQUEST:
- /* FIXME: If this is an update to a previous
- * PUBLISH or REQUEST, then
- prefix = U_("Updated");
- */
- break;
-
- case E_CAL_COMPONENT_METHOD_REPLY:
- e_cal_component_get_attendee_list (comp, &alist);
- if (alist != NULL) {
- ECalComponentAttendee *a = alist->data;
-
- switch (a->status) {
- case ICAL_PARTSTAT_ACCEPTED:
- prefix = _("Accepted");
- break;
- case ICAL_PARTSTAT_TENTATIVE:
- prefix = _("Tentatively Accepted");
- break;
- case ICAL_PARTSTAT_DECLINED:
- prefix = _("Declined");
- break;
- default:
- break;
- }
- e_cal_component_free_attendee_list (alist);
- }
- break;
-
- case E_CAL_COMPONENT_METHOD_ADD:
- prefix = _("Updated");
- break;
-
- case E_CAL_COMPONENT_METHOD_CANCEL:
- prefix = _("Cancel");
- break;
-
- case E_CAL_COMPONENT_METHOD_REFRESH:
- prefix = _("Refresh");
- break;
-
- case E_CAL_COMPONENT_METHOD_COUNTER:
- prefix = _("Counter-proposal");
- break;
-
- case E_CAL_COMPONENT_METHOD_DECLINECOUNTER:
- prefix = _("Declined");
- break;
-
- default:
- break;
- }
-
- if (prefix) {
- subject = CORBA_string_alloc (strlen (description) +
- strlen (prefix) + 3);
- sprintf (subject, "%s: %s", prefix, description);
- } else
- subject = CORBA_string_dup (description);
-
- return subject;
-}
-
-static CORBA_char *
-comp_content_type (ECalComponent *comp, ECalComponentItipMethod method)
-{
- char tmp[256];
-
- sprintf (tmp, "text/calendar; name=\"%s\"; charset=utf-8; METHOD=%s",
- e_cal_component_get_vtype (comp) == E_CAL_COMPONENT_FREEBUSY ?
- "freebusy.ifb" : "calendar.ics", itip_methods[method]);
- return CORBA_string_dup (tmp);
-
-}
-
-static CORBA_char *
-comp_filename (ECalComponent *comp)
-{
- switch (e_cal_component_get_vtype (comp)) {
- case E_CAL_COMPONENT_FREEBUSY:
- return CORBA_string_dup ("freebusy.ifb");
- default:
- return CORBA_string_dup ("calendar.ics");
- }
-}
-
-static CORBA_char *
-comp_description (ECalComponent *comp)
-{
- CORBA_char *description;
- ECalComponentDateTime dt;
- char *start = NULL, *end = NULL;
-
- switch (e_cal_component_get_vtype (comp)) {
- case E_CAL_COMPONENT_EVENT:
- return CORBA_string_dup (_("Event information"));
- case E_CAL_COMPONENT_TODO:
- return CORBA_string_dup (_("Task information"));
- case E_CAL_COMPONENT_JOURNAL:
- return CORBA_string_dup (_("Journal information"));
- case E_CAL_COMPONENT_FREEBUSY:
- e_cal_component_get_dtstart (comp, &dt);
- if (dt.value)
- start = get_label (dt.value);
- e_cal_component_free_datetime (&dt);
-
- e_cal_component_get_dtend (comp, &dt);
- if (dt.value)
- end = get_label (dt.value);
- e_cal_component_free_datetime (&dt);
-
- if (start != NULL && end != NULL) {
- char *tmp;
- tmp = g_strdup_printf (_("Free/Busy information (%s to %s)"), start, end);
- description = CORBA_string_dup (tmp);
- g_free (tmp);
- } else {
- description = CORBA_string_dup (_("Free/Busy information"));
- }
- g_free (start);
- g_free (end);
- return description;
- default:
- return CORBA_string_dup (_("iCalendar information"));
- }
-}
-
-static gboolean
-comp_server_send (ECalComponentItipMethod method, ECalComponent *comp, ECal *client,
- icalcomponent *zones, GList **users)
-{
- icalcomponent *top_level, *returned_icalcomp = NULL;
- gboolean retval = TRUE;
- GError *error = NULL;
-
- top_level = comp_toplevel_with_zones (method, comp, client, zones);
- if (!e_cal_send_objects (client, top_level, users, &returned_icalcomp, &error)) {
- /* FIXME Really need a book problem status code */
- if (error->code != E_CALENDAR_STATUS_OK) {
- /* FIXME Better error message */
- e_notice (NULL, GTK_MESSAGE_ERROR, "Unable to book");
-
- retval = FALSE;
- }
- }
-
- g_clear_error (&error);
-
- if (returned_icalcomp)
- icalcomponent_free (returned_icalcomp);
- icalcomponent_free (top_level);
-
- return retval;
-}
-
-static gboolean
-comp_limit_attendees (ECalComponent *comp)
-{
- icalcomponent *icomp;
- icalproperty *prop;
- gboolean found = FALSE, match = FALSE;
- GSList *l, *list = NULL;
-
- icomp = e_cal_component_get_icalcomponent (comp);
-
- for (prop = icalcomponent_get_first_property (icomp, ICAL_ATTENDEE_PROPERTY);
- prop != NULL;
- prop = icalcomponent_get_next_property (icomp, ICAL_ATTENDEE_PROPERTY))
- {
- icalvalue *value;
- const char *attendee;
- char *text;
-
- /* If we've already found something, just erase the rest */
- if (found) {
- list = g_slist_prepend (list, prop);
- continue;
- }
-
- value = icalproperty_get_value (prop);
- if (!value)
- continue;
-
- attendee = icalvalue_get_string (value);
-
- text = g_strdup (itip_strip_mailto (attendee));
- text = g_strstrip (text);
- found = match = e_account_list_find(itip_addresses_get(), E_ACCOUNT_FIND_ID_ADDRESS, text) != NULL;
- g_free (text);
-
- if (!match)
- list = g_slist_prepend (list, prop);
- match = FALSE;
- }
-
- for (l = list; l != NULL; l = l->next) {
- prop = l->data;
-
- icalcomponent_remove_property (icomp, prop);
- icalproperty_free (prop);
- }
- g_slist_free (list);
-
- return found;
-}
-
-static void
-comp_sentby (ECalComponent *comp, ECal *client)
-{
- ECalComponentOrganizer organizer;
-
- e_cal_component_get_organizer (comp, &organizer);
- if (!organizer.value) {
- EAccount *a = itip_addresses_get_default ();
-
- organizer.value = g_strdup_printf ("MAILTO:%s", a->id->address);
- organizer.sentby = NULL;
- organizer.cn = a->id->name;
- organizer.language = NULL;
-
- e_cal_component_set_organizer (comp, &organizer);
- g_free ((char *) organizer.value);
-
- return;
- }
-
- if (!itip_organizer_is_user (comp, client) && !itip_sentby_is_user (comp)) {
- EAccount *a = itip_addresses_get_default ();
-
- organizer.value = g_strdup (organizer.value);
- organizer.sentby = g_strdup_printf ("MAILTO:%s", a->id->address);
- organizer.cn = g_strdup (organizer.cn);
- organizer.language = g_strdup (organizer.language);
-
- e_cal_component_set_organizer (comp, &organizer);
-
- g_free ((char *)organizer.value);
- g_free ((char *)organizer.sentby);
- g_free ((char *)organizer.cn);
- g_free ((char *)organizer.language);
- }
-}
-static ECalComponent *
-comp_minimal (ECalComponent *comp, gboolean attendee)
-{
- ECalComponent *clone;
- icalcomponent *icomp, *icomp_clone;
- icalproperty *prop;
- ECalComponentOrganizer organizer;
- const char *uid;
- GSList *comments;
- struct icaltimetype itt;
- ECalComponentRange recur_id;
-
- clone = e_cal_component_new ();
- e_cal_component_set_new_vtype (clone, e_cal_component_get_vtype (comp));
-
- if (attendee) {
- GSList *attendees;
-
- e_cal_component_get_attendee_list (comp, &attendees);
- e_cal_component_set_attendee_list (clone, attendees);
-
- if (!comp_limit_attendees (clone)) {
- e_notice (NULL, GTK_MESSAGE_ERROR,
- _("You must be an attendee of the event."));
- goto error;
- }
- }
-
- itt = icaltime_from_timet_with_zone (time (NULL), FALSE,
- icaltimezone_get_utc_timezone ());
- e_cal_component_set_dtstamp (clone, &itt);
-
- e_cal_component_get_organizer (comp, &organizer);
- if (organizer.value == NULL)
- goto error;
- e_cal_component_set_organizer (clone, &organizer);
-
- e_cal_component_get_uid (comp, &uid);
- e_cal_component_set_uid (clone, uid);
-
- e_cal_component_get_comment_list (comp, &comments);
- if (g_slist_length (comments) <= 1) {
- e_cal_component_set_comment_list (clone, comments);
- } else {
- GSList *l = comments;
-
- comments = g_slist_remove_link (comments, l);
- e_cal_component_set_comment_list (clone, l);
- e_cal_component_free_text_list (l);
- }
- e_cal_component_free_text_list (comments);
-
- e_cal_component_get_recurid (comp, &recur_id);
- if (recur_id.datetime.value != NULL)
- e_cal_component_set_recurid (clone, &recur_id);
-
- icomp = e_cal_component_get_icalcomponent (comp);
- icomp_clone = e_cal_component_get_icalcomponent (clone);
- for (prop = icalcomponent_get_first_property (icomp, ICAL_X_PROPERTY);
- prop != NULL;
- prop = icalcomponent_get_next_property (icomp, ICAL_X_PROPERTY))
- {
- icalproperty *p;
-
- p = icalproperty_new_clone (prop);
- icalcomponent_add_property (icomp_clone, p);
- }
-
- e_cal_component_rescan (clone);
-
- return clone;
-
- error:
- g_object_unref (clone);
- return NULL;
-}
-
-static ECalComponent *
-comp_compliant (ECalComponentItipMethod method, ECalComponent *comp, ECal *client, icalcomponent *zones)
-{
- ECalComponent *clone, *temp_clone;
- struct icaltimetype itt;
-
- clone = e_cal_component_clone (comp);
- itt = icaltime_from_timet_with_zone (time (NULL), FALSE,
- icaltimezone_get_utc_timezone ());
- e_cal_component_set_dtstamp (clone, &itt);
-
- /* Make UNTIL date a datetime in a simple recurrence */
- if (e_cal_component_has_recurrences (clone)
- && e_cal_component_has_simple_recurrence (clone)) {
- GSList *rrule_list;
- struct icalrecurrencetype *r;
-
- e_cal_component_get_rrule_list (clone, &rrule_list);
- r = rrule_list->data;
-
- if (!icaltime_is_null_time (r->until) && r->until.is_date) {
- ECalComponentDateTime dt;
- icaltimezone *from_zone = NULL, *to_zone;
-
- e_cal_component_get_dtstart (clone, &dt);
-
- if (dt.value->is_date) {
- from_zone = calendar_config_get_icaltimezone ();
- } else if (dt.tzid == NULL) {
- from_zone = icaltimezone_get_utc_timezone ();
- } else {
- if (zones != NULL)
- from_zone = icalcomponent_get_timezone (zones, dt.tzid);
- if (from_zone == NULL)
- from_zone = icaltimezone_get_builtin_timezone_from_tzid (dt.tzid);
- if (from_zone == NULL && client != NULL)
- /* FIXME Error checking */
- e_cal_get_timezone (client, dt.tzid, &from_zone, NULL);
- }
-
- to_zone = icaltimezone_get_utc_timezone ();
-
- r->until.hour = dt.value->hour;
- r->until.minute = dt.value->minute;
- r->until.second = dt.value->second;
- r->until.is_date = FALSE;
-
- icaltimezone_convert_time (&r->until, from_zone, to_zone);
- r->until.is_utc = TRUE;
-
- e_cal_component_set_rrule_list (clone, rrule_list);
- e_cal_component_abort_sequence (clone);
- }
-
- e_cal_component_free_recur_list (rrule_list);
- }
-
- /* We delete incoming alarms anyhow, and this helps with outlook */
- e_cal_component_remove_all_alarms (clone);
-
- /* Strip X-LIC-ERROR stuff */
- e_cal_component_strip_errors (clone);
-
- /* Comply with itip spec */
- switch (method) {
- case E_CAL_COMPONENT_METHOD_PUBLISH:
- comp_sentby (clone, client);
- e_cal_component_set_attendee_list (clone, NULL);
- break;
- case E_CAL_COMPONENT_METHOD_REQUEST:
- comp_sentby (clone, client);
- break;
- case E_CAL_COMPONENT_METHOD_CANCEL:
- comp_sentby (clone, client);
- break;
- case E_CAL_COMPONENT_METHOD_REPLY:
- break;
- case E_CAL_COMPONENT_METHOD_ADD:
- break;
- case E_CAL_COMPONENT_METHOD_REFRESH:
- /* Need to remove almost everything */
- temp_clone = comp_minimal (clone, TRUE);
- g_object_unref (clone);
- clone = temp_clone;
- break;
- case E_CAL_COMPONENT_METHOD_COUNTER:
- break;
- case E_CAL_COMPONENT_METHOD_DECLINECOUNTER:
- /* Need to remove almost everything */
- temp_clone = comp_minimal (clone, FALSE);
- g_object_unref (clone);
- clone = temp_clone;
- break;
- default:
- break;
- }
-
- return clone;
-}
-
-static gboolean
-append_cal_attachments (GNOME_Evolution_Composer composer_server, ECalComponent
- *comp, GSList *attach_list)
-{
- CORBA_char *content_type = NULL, *filename = NULL, *description = NULL;
- CORBA_Environment ev;
- GNOME_Evolution_Composer_AttachmentData *attach_data = NULL;
- struct CalMimeAttach *mime_attach;
- GSList *l;
- gboolean retval = TRUE;
-
- CORBA_exception_init (&ev);
-
- for (l = attach_list; l ; l = l->next) {
- mime_attach = (struct CalMimeAttach *) l->data;
-
- filename = CORBA_string_dup (mime_attach->filename);
- content_type = CORBA_string_dup (mime_attach->content_type);
- description = CORBA_string_dup (mime_attach->description);
-
- attach_data = GNOME_Evolution_Composer_AttachmentData__alloc ();
- attach_data->_length = mime_attach->length;
- attach_data->_maximum = attach_data->_length;
- attach_data->_buffer = CORBA_sequence_CORBA_char_allocbuf (attach_data->_length);
- memcpy (attach_data->_buffer, mime_attach->encoded_data, attach_data->_length);
-
- GNOME_Evolution_Composer_attachData (composer_server,
- content_type, filename, description,
- TRUE, attach_data,
- &ev);
- if (BONOBO_EX (&ev)) {
- g_warning ("Unable to add attachments in composer");
- retval = FALSE;
- }
-
- CORBA_exception_free (&ev);
- if (content_type != NULL)
- CORBA_free (content_type);
- if (filename != NULL)
- CORBA_free (filename);
- if (description != NULL)
- CORBA_free (description);
- if (attach_data != NULL) {
- CORBA_free (attach_data->_buffer);
- CORBA_free (attach_data);
- }
- g_free (mime_attach->filename);
- g_free (mime_attach->content_type);
- g_free (mime_attach->description);
- g_free (mime_attach->encoded_data);
- }
-
- return retval;
-}
-
-gboolean
-itip_send_comp (ECalComponentItipMethod method, ECalComponent *send_comp,
- ECal *client, icalcomponent *zones, GSList *attachments_list)
-{
- GNOME_Evolution_Composer composer_server;
- ECalComponent *comp = NULL;
- icalcomponent *top_level = NULL;
- GList *users = NULL;
- GNOME_Evolution_Composer_RecipientList *to_list = NULL;
- GNOME_Evolution_Composer_RecipientList *cc_list = NULL;
- GNOME_Evolution_Composer_RecipientList *bcc_list = NULL;
- CORBA_char *subject = NULL, *body = NULL, *content_type = NULL;
- CORBA_char *from = NULL, *filename = NULL, *description = NULL;
- GNOME_Evolution_Composer_AttachmentData *attach_data = NULL;
- char *ical_string;
- CORBA_Environment ev;
- gboolean retval = FALSE;
-
- CORBA_exception_init (&ev);
-
- /* Give the server a chance to manipulate the comp */
- if (method != E_CAL_COMPONENT_METHOD_PUBLISH && !e_cal_get_save_schedules (client)) {
- if (!comp_server_send (method, send_comp, client, zones, &users))
- goto cleanup;
- }
-
- /* Tidy up the comp */
- comp = comp_compliant (method, send_comp, client, zones);
- if (comp == NULL)
- goto cleanup;
-
- /* Recipients */
- to_list = comp_to_list (method, comp, users);
- if (method != E_CAL_COMPONENT_METHOD_PUBLISH) {
- if (to_list == NULL || to_list->_length == 0) {
- /* We sent them all via the server */
- retval = TRUE;
- goto cleanup;
- }
- }
-
- cc_list = GNOME_Evolution_Composer_RecipientList__alloc ();
- cc_list->_maximum = cc_list->_length = 0;
- bcc_list = GNOME_Evolution_Composer_RecipientList__alloc ();
- bcc_list->_maximum = bcc_list->_length = 0;
-
- /* Subject information */
- subject = comp_subject (method, comp);
-
- /* From address */
- from = comp_from (method, comp);
-
- /* Obtain an object reference for the Composer. */
- composer_server = bonobo_activation_activate_from_id (GNOME_EVOLUTION_COMPOSER_OAFIID, 0, NULL, &ev);
- if (BONOBO_EX (&ev)) {
- g_warning ("Could not activate composer: %s", bonobo_exception_get_text (&ev));
- CORBA_exception_free (&ev);
- return FALSE;
- }
-
- /* Set recipients, subject */
- GNOME_Evolution_Composer_setHeaders (composer_server, from, to_list, cc_list, bcc_list, subject, &ev);
- if (BONOBO_EX (&ev)) {
- g_warning ("Unable to set composer headers while sending iTip message: %s",
- bonobo_exception_get_text (&ev));
- goto cleanup;
- }
-
-
- /* Content type */
- content_type = comp_content_type (comp, method);
-
- top_level = comp_toplevel_with_zones (method, comp, client, zones);
- ical_string = icalcomponent_as_ical_string (top_level);
-
- if (e_cal_component_get_vtype (comp) == E_CAL_COMPONENT_EVENT) {
- GNOME_Evolution_Composer_setBody (composer_server, ical_string, content_type, &ev);
- } else {
- GNOME_Evolution_Composer_setMultipartType (composer_server, GNOME_Evolution_Composer_MIXED, &ev);
- if (BONOBO_EX (&ev)) {
- g_warning ("Unable to set multipart type while sending iTip message");
- goto cleanup;
- }
-
- filename = comp_filename (comp);
- description = comp_description (comp);
-
- GNOME_Evolution_Composer_setBody (composer_server, description, "text/plain", &ev);
- if (BONOBO_EX (&ev)) {
- g_warning ("Unable to set body text while sending iTip message");
- goto cleanup;
- }
-
- attach_data = GNOME_Evolution_Composer_AttachmentData__alloc ();
- attach_data->_length = strlen (ical_string);
- attach_data->_maximum = attach_data->_length;
- attach_data->_buffer = CORBA_sequence_CORBA_char_allocbuf (attach_data->_length);
- memcpy (attach_data->_buffer, ical_string, attach_data->_length);
-
- GNOME_Evolution_Composer_attachData (composer_server,
- content_type, filename, description,
- TRUE, attach_data,
- &ev);
- }
-
- if (BONOBO_EX (&ev)) {
- g_warning ("Unable to place iTip message in composer");
- goto cleanup;
- }
-
- if (attachments_list) {
- if (append_cal_attachments (composer_server, comp, attachments_list))
- retval = TRUE;
- }
-
- if (method == E_CAL_COMPONENT_METHOD_PUBLISH) {
- GNOME_Evolution_Composer_show (composer_server, &ev);
- if (BONOBO_EX (&ev))
- g_warning ("Unable to show the composer while sending iTip message");
- else
- retval = TRUE;
- } else {
- GNOME_Evolution_Composer_send (composer_server, &ev);
- if (BONOBO_EX (&ev))
- g_warning ("Unable to send iTip message");
- else
- retval = TRUE;
- }
-
- cleanup:
- CORBA_exception_free (&ev);
-
- if (comp != NULL)
- g_object_unref (comp);
- if (top_level != NULL)
- icalcomponent_free (top_level);
-
- if (users) {
- g_list_foreach (users, (GFunc) g_free, NULL);
- g_list_free (users);
- }
-
- if (to_list != NULL)
- CORBA_free (to_list);
- if (cc_list != NULL)
- CORBA_free (cc_list);
- if (bcc_list != NULL)
- CORBA_free (bcc_list);
-
- if (from != NULL)
- CORBA_free (from);
- if (subject != NULL)
- CORBA_free (subject);
- if (body != NULL)
- CORBA_free (body);
- if (content_type != NULL)
- CORBA_free (content_type);
- if (filename != NULL)
- CORBA_free (filename);
- if (description != NULL)
- CORBA_free (description);
- if (attach_data != NULL) {
- CORBA_free (attach_data->_buffer);
- CORBA_free (attach_data);
- }
-
- return retval;
-}
-
-gboolean
-itip_publish_begin (ECalComponent *pub_comp, ECal *client,
- gboolean cloned, ECalComponent **clone)
-{
- icalcomponent *icomp =NULL, *icomp_clone = NULL;
- icalproperty *prop;
-
- if (e_cal_component_get_vtype (pub_comp) == E_CAL_COMPONENT_FREEBUSY) {
-
- if (!cloned) {
- *clone = e_cal_component_clone (pub_comp);
- cloned = TRUE;
- } else {
-
- icomp = e_cal_component_get_icalcomponent (pub_comp);
- icomp_clone = e_cal_component_get_icalcomponent (*clone);
- for (prop = icalcomponent_get_first_property (icomp,
- ICAL_FREEBUSY_PROPERTY);
- prop != NULL;
- prop = icalcomponent_get_next_property (icomp,
- ICAL_FREEBUSY_PROPERTY))
- {
- icalproperty *p;
-
- p = icalproperty_new_clone (prop);
- icalcomponent_add_property (icomp_clone, p);
- }
- }
- }
-
- return TRUE;
-}
-
-static void
-fb_sort (struct icalperiodtype *ipt, int fb_count)
-{
- int i,j;
-
- if (ipt == NULL || fb_count == 0)
- return;
-
- for (i = 0; i < fb_count-1; i++) {
- for (j = i+1; j < fb_count; j++) {
- struct icalperiodtype temp;
-
- if (icaltime_compare (ipt[i].start, ipt[j].start) < 0)
- continue;
-
- if (icaltime_compare (ipt[i].start, ipt[j].start) == 0){
- if (icaltime_compare (ipt[i].end,
- ipt[j].start) < 0)
- continue;
- }
- temp = ipt[i];
- ipt[i] = ipt[j];
- ipt[j] = temp;
- }
- }
-}
-
-static icalcomponent *
-comp_fb_normalize (icalcomponent *icomp)
-{
- icalcomponent *iclone;
- icalproperty *prop, *p;
- const char *uid, *comment;
- struct icaltimetype itt;
- int fb_count, i = 0, j;
- struct icalperiodtype *ipt;
-
- iclone = icalcomponent_new (ICAL_VFREEBUSY_COMPONENT);
-
- prop = icalcomponent_get_first_property (icomp,
- ICAL_ORGANIZER_PROPERTY);
- if (prop) {
- p = icalproperty_new_clone (prop);
- icalcomponent_add_property (iclone, p);
- }
-
- itt = icalcomponent_get_dtstart (icomp);
- icalcomponent_set_dtstart (iclone, itt);
-
- itt = icalcomponent_get_dtend (icomp);
- icalcomponent_set_dtend (iclone, itt);
-
- fb_count = icalcomponent_count_properties (icomp,
- ICAL_FREEBUSY_PROPERTY);
- ipt = g_new0 (struct icalperiodtype, fb_count+1);
-
- for (prop = icalcomponent_get_first_property (icomp,
- ICAL_FREEBUSY_PROPERTY);
- prop != NULL;
- prop = icalcomponent_get_next_property (icomp,
- ICAL_FREEBUSY_PROPERTY))
- {
- ipt[i] = icalproperty_get_freebusy (prop);
- i++;
- }
-
- fb_sort (ipt, fb_count);
-
- for (j = 0; j <= fb_count-1; j++) {
- icalparameter *param;
-
- prop = icalproperty_new_freebusy (ipt[j]);
- param = icalparameter_new_fbtype (ICAL_FBTYPE_BUSY);
- icalproperty_add_parameter (prop, param);
- icalcomponent_add_property (iclone, prop);
- }
- g_free (ipt);
-
- /* Should I strip this RFC 2446 says there must not be a UID
- if the METHOD is PUBLISH?? */
- uid = icalcomponent_get_uid (icomp);
- if (uid)
- icalcomponent_set_uid (iclone, uid);
-
- itt = icaltime_from_timet_with_zone (time (NULL), FALSE,
- icaltimezone_get_utc_timezone ());
- icalcomponent_set_dtstamp (iclone, itt);
-
- prop = icalcomponent_get_first_property (icomp, ICAL_URL_PROPERTY);
- if (prop) {
- p = icalproperty_new_clone (prop);
- icalcomponent_add_property (iclone, p);
- }
-
- comment = icalcomponent_get_comment (icomp);
- if (comment)
- icalcomponent_set_comment (iclone, comment);
-
- for (prop = icalcomponent_get_first_property (icomp, ICAL_X_PROPERTY);
- prop != NULL;
- prop = icalcomponent_get_next_property (icomp, ICAL_X_PROPERTY))
- {
- p = icalproperty_new_clone (prop);
- icalcomponent_add_property (iclone, p);
- }
-
- return iclone;
-
- g_object_unref (iclone);
- return NULL;
-}
-
-gboolean
-itip_publish_comp (ECal *client, gchar *uri, gchar *username,
- gchar *password, ECalComponent **pub_comp)
-{
- icalcomponent *toplevel = NULL, *icalcomp = NULL;
- icalcomponent *icomp = NULL;
- SoupSession *session;
- SoupMessage *msg;
- SoupUri *real_uri;
- char *ical_string;
-
- toplevel = e_cal_util_new_top_level ();
- icalcomponent_set_method (toplevel, ICAL_METHOD_PUBLISH);
-
- e_cal_component_set_url (*pub_comp, uri);
-
- icalcomp = e_cal_component_get_icalcomponent (*pub_comp);
-
- icomp = comp_fb_normalize (icalcomp);
-
- icalcomponent_add_component (toplevel, icomp);
- ical_string = icalcomponent_as_ical_string (toplevel);
-
- /* Publish the component */
- session = soup_session_async_new ();
-
- real_uri = soup_uri_new (uri);
- if (!real_uri || !real_uri->host) {
- g_warning (G_STRLOC ": Invalid URL: %s", uri);
- g_object_unref (session);
- return FALSE;
- }
-
- real_uri->user = g_strdup (username);
- real_uri->passwd = g_strdup (password);
-
- /* build the SOAP message */
- msg = soup_message_new_from_uri (SOUP_METHOD_PUT, real_uri);
- if (!msg) {
- g_warning (G_STRLOC ": Could not build SOAP message");
- g_object_unref (session);
- return FALSE;
- }
- soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT);
- soup_message_set_request (msg, "text/calendar", SOUP_BUFFER_USER_OWNED,
- ical_string, strlen (ical_string));
-
- /* send message to server */
- soup_session_send_message (session, msg);
- if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
- g_warning(G_STRLOC ": Could not publish Free/Busy: %d: %s",
- msg->status_code,
- soup_status_get_phrase (msg->status_code));
- g_object_unref (session);
- return FALSE;
- }
-
- soup_uri_free (real_uri);
- g_object_unref (session);
-
- return TRUE;
-}
diff --git a/calendar/gui/itip-utils.h b/calendar/gui/itip-utils.h
deleted file mode 100644
index bfbd4ab6fc..0000000000
--- a/calendar/gui/itip-utils.h
+++ /dev/null
@@ -1,40 +0,0 @@
-
-#ifndef ITIP_UTILS_HEADER
-#define ITIP_UTILS_HEADER
-
-#include <libical/ical.h>
-#include <string.h>
-#include <glib.h>
-#include <libecal/e-cal.h>
-#include <libecal/e-cal-component.h>
-#include <e-util/e-account-list.h>
-
-typedef enum {
- E_CAL_COMPONENT_METHOD_PUBLISH,
- E_CAL_COMPONENT_METHOD_REQUEST,
- E_CAL_COMPONENT_METHOD_REPLY,
- E_CAL_COMPONENT_METHOD_ADD,
- E_CAL_COMPONENT_METHOD_CANCEL,
- E_CAL_COMPONENT_METHOD_REFRESH,
- E_CAL_COMPONENT_METHOD_COUNTER,
- E_CAL_COMPONENT_METHOD_DECLINECOUNTER
-} ECalComponentItipMethod;
-
-EAccountList *itip_addresses_get (void);
-EAccount *itip_addresses_get_default (void);
-
-gboolean itip_organizer_is_user (ECalComponent *comp, ECal *client);
-gboolean itip_sentby_is_user (ECalComponent *comp);
-
-const gchar *itip_strip_mailto (const gchar *address);
-
-gboolean itip_send_comp (ECalComponentItipMethod method, ECalComponent *comp,
- ECal *client, icalcomponent *zones, GSList *attachments_list);
-
-gboolean itip_publish_comp (ECal *client, gchar* uri, gchar* username,
- gchar* password, ECalComponent **pub_comp);
-
-gboolean itip_publish_begin (ECalComponent *pub_comp, ECal *client,
- gboolean cloned, ECalComponent **clone);
-
-#endif
diff --git a/calendar/gui/main.c b/calendar/gui/main.c
deleted file mode 100644
index b1b5cfdd77..0000000000
--- a/calendar/gui/main.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* main.c
- *
- * Copyright (C) 2000, 2001, 2002, 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnome/gnome-init.h>
-#include <libgnomevfs/gnome-vfs-init.h>
-#include <glade/glade.h>
-
-#include <bonobo/bonobo-main.h>
-#include <bonobo/bonobo-shlib-factory.h>
-#include <bonobo/bonobo-exception.h>
-
-#include "dialogs/cal-prefs-dialog.h"
-#include "calendar-commands.h"
-#include "calendar-config.h"
-#include "calendar-component.h"
-#include "e-comp-editor-registry.h"
-#include "comp-editor-factory.h"
-#include "control-factory.h"
-#include "itip-bonobo-control.h"
-#include "tasks-control.h"
-#include "tasks-component.h"
-
-#include <e-util/e-plugin.h>
-#include "e-cal-config.h"
-#include "e-cal-popup.h"
-#include "e-cal-menu.h"
-#include "e-cal-event.h"
-
-#define FACTORY_ID "OAFIID:GNOME_Evolution_Calendar_Factory:" BASE_VERSION
-
-#define CALENDAR_COMPONENT_ID "OAFIID:GNOME_Evolution_Calendar_Component:" BASE_VERSION
-#define TASKS_COMPONENT_ID "OAFIID:GNOME_Evolution_Tasks_Component:" BASE_VERSION
-#define ITIP_CONTROL_ID "OAFIID:GNOME_Evolution_Calendar_iTip_Control:" BASE_VERSION
-#define CONFIG_CONTROL_ID "OAFIID:GNOME_Evolution_Calendar_ConfigControl:" BASE_VERSION
-#define COMP_EDITOR_FACTORY_ID "OAFIID:GNOME_Evolution_Calendar_CompEditorFactory:" BASE_VERSION
-
-ECompEditorRegistry *comp_editor_registry = NULL;
-
-/* The component editor factory */
-static CompEditorFactory *comp_editor_factory = NULL;
-
-
-/* Factory function for the calendar component factory; just creates and
- * references a singleton service object.
- */
-static BonoboObject *
-comp_editor_factory_fn (void)
-{
- if (!comp_editor_factory) {
- comp_editor_factory = comp_editor_factory_new ();
- if (!comp_editor_factory)
- return NULL;
- }
-
- bonobo_object_ref (BONOBO_OBJECT (comp_editor_factory));
- return BONOBO_OBJECT (comp_editor_factory);
-}
-
-
-/* Does a simple activation and unreffing of the alarm notification service so
- * that the daemon will be launched if it is not running yet.
- */
-static gboolean
-launch_alarm_daemon_cb (gpointer data)
-{
- CORBA_Environment ev;
- CORBA_Object an;
- guint *idle_id = (guint *) data;
-
- /* remove the idle function */
- g_source_remove (*idle_id);
- g_free (idle_id);
-
- /* activate the alarm daemon */
- CORBA_exception_init (&ev);
- an = bonobo_activation_activate_from_id ("OAFIID:GNOME_Evolution_Calendar_AlarmNotify:" BASE_VERSION, 0, NULL, &ev);
-
- if (BONOBO_EX (&ev)) {
- g_message ("launch_alarm_daemon_cb(): %s", bonobo_exception_get_text (&ev));
- CORBA_exception_free (&ev);
- return FALSE;
- }
- CORBA_exception_free (&ev);
-
- /* Just get rid of it; what we are interested in is that it gets launched */
-
- CORBA_exception_init (&ev);
- bonobo_object_release_unref (an, &ev);
- if (BONOBO_EX (&ev))
- g_message ("add_alarms(): Could not unref the alarm notification service");
-
- CORBA_exception_free (&ev);
-
- return FALSE;
-}
-
-static void
-launch_alarm_daemon (void)
-{
- guint *idle_id;
-
- idle_id = g_new0 (guint, 1);
- *idle_id = g_idle_add ((GSourceFunc) launch_alarm_daemon_cb, idle_id);
-}
-
-static void
-initialize (void)
-{
- comp_editor_registry = E_COMP_EDITOR_REGISTRY (e_comp_editor_registry_new ());
-
-#if 0
- itip_control_factory_init ();
- component_editor_factory_init ();
-#endif
-
- launch_alarm_daemon ();
-
- /* Initialize Calendar Publishing */
- calendar_component_init_publishing ();
-
- /* Initialize plugin system */
- e_plugin_hook_register_type (e_cal_popup_hook_get_type());
- e_plugin_hook_register_type (e_cal_menu_hook_get_type());
- e_plugin_hook_register_type (e_cal_config_hook_get_type ());
- e_plugin_hook_register_type (e_cal_event_hook_get_type ());
-}
-
-
-static BonoboObject *
-factory (BonoboGenericFactory *factory,
- const char *component_id,
- void *closure)
-{
- static gboolean initialized = FALSE;
-
- if (! initialized) {
- initialize ();
- initialized = TRUE;
- }
-
- if (strcmp (component_id, CALENDAR_COMPONENT_ID) == 0) {
- BonoboObject *object = BONOBO_OBJECT (calendar_component_peek ());
- bonobo_object_ref (object);
- return object;
- } else if (strcmp (component_id, TASKS_COMPONENT_ID) == 0) {
- BonoboObject *object = BONOBO_OBJECT (tasks_component_peek ());
- bonobo_object_ref (object);
- return object;
- } else if (strcmp (component_id, ITIP_CONTROL_ID) == 0)
- return BONOBO_OBJECT (itip_bonobo_control_new ());
- else if (strcmp (component_id, CONFIG_CONTROL_ID) == 0)
- return BONOBO_OBJECT (cal_prefs_dialog_new ());
- else if (strcmp (component_id, COMP_EDITOR_FACTORY_ID) == 0)
- return BONOBO_OBJECT (comp_editor_factory_fn ());
-
- g_warning (FACTORY_ID ": Don't know what to do with %s", component_id);
- return NULL;
-}
-
-BONOBO_ACTIVATION_SHLIB_FACTORY (FACTORY_ID, "Evolution Calendar component factory", factory, NULL)
diff --git a/calendar/gui/migration.c b/calendar/gui/migration.c
deleted file mode 100644
index 76b8a52a16..0000000000
--- a/calendar/gui/migration.c
+++ /dev/null
@@ -1,989 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* calendar-component.c
- *
- * Copyright (C) 2003 Ximian, Inc
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Rodrigo Moya <rodrigo@ximian.com>
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <errno.h>
-
-#include <bonobo/bonobo-i18n.h>
-#include <libgnomevfs/gnome-vfs-uri.h>
-#include <libgnomevfs/gnome-vfs-xfer.h>
-#include <gtk/gtkwidget.h>
-#include <gtk/gtkvbox.h>
-#include <gtk/gtkmain.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkprogressbar.h>
-#include <libecal/e-cal.h>
-#include <e-util/e-bconf-map.h>
-#include <e-util/e-folder-map.h>
-#include <libedataserver/e-dbhash.h>
-#include <libedataserver/e-xml-hash-utils.h>
-#include "calendar-config.h"
-#include "calendar-config-keys.h"
-#include "e-cal-event.h"
-#include "migration.h"
-
-static e_gconf_map_t calendar_display_map[] = {
- /* /Calendar/Display */
- { "Timezone", "calendar/display/timezone", E_GCONF_MAP_STRING },
- { "Use24HourFormat", "calendar/display/use_24hour_format", E_GCONF_MAP_BOOL },
- { "WeekStartDay", "calendar/display/week_start_day", E_GCONF_MAP_INT },
- { "DayStartHour", "calendar/display/day_start_hour", E_GCONF_MAP_INT },
- { "DayStartMinute", "calendar/display/day_start_minute", E_GCONF_MAP_INT },
- { "DayEndHour", "calendar/display/day_end_hour", E_GCONF_MAP_INT },
- { "DayEndMinute", "calendar/display/day_end_minute", E_GCONF_MAP_INT },
- { "TimeDivisions", "calendar/display/time_divisions", E_GCONF_MAP_INT },
- { "View", "calendar/display/default_view", E_GCONF_MAP_INT },
- { "HPanePosition", "calendar/display/hpane_position", E_GCONF_MAP_FLOAT },
- { "VPanePosition", "calendar/display/vpane_position", E_GCONF_MAP_FLOAT },
- { "MonthHPanePosition", "calendar/display/month_hpane_position", E_GCONF_MAP_FLOAT },
- { "MonthVPanePosition", "calendar/display/month_vpane_position", E_GCONF_MAP_FLOAT },
- { "CompressWeekend", "calendar/display/compress_weekend", E_GCONF_MAP_BOOL },
- { "ShowEventEndTime", "calendar/display/show_event_end", E_GCONF_MAP_BOOL },
- { "WorkingDays", "calendar/display/working_days", E_GCONF_MAP_INT },
- { 0 },
-};
-
-static e_gconf_map_t calendar_tasks_map[] = {
- /* /Calendar/Tasks */
- { "HideCompletedTasks", "calendar/tasks/hide_completed", E_GCONF_MAP_BOOL },
- { "HideCompletedTasksUnits", "calendar/tasks/hide_completed_units", E_GCONF_MAP_STRING },
- { "HideCompletedTasksValue", "calendar/tasks/hide_completed_value", E_GCONF_MAP_INT },
- { 0 },
-};
-
-static e_gconf_map_t calendar_tasks_colours_map[] = {
- /* /Calendar/Tasks/Colors */
- { "TasksDueToday", "calendar/tasks/colors/due_today", E_GCONF_MAP_STRING },
- { "TasksOverDue", "calendar/tasks/colors/overdue", E_GCONF_MAP_STRING },
- { "TasksDueToday", "calendar/tasks/colors/due_today", E_GCONF_MAP_STRING },
- { 0 },
-};
-
-static e_gconf_map_t calendar_other_map[] = {
- /* /Calendar/Other */
- { "ConfirmDelete", "calendar/prompts/confirm_delete", E_GCONF_MAP_BOOL },
- { "ConfirmExpunge", "calendar/prompts/confirm_expunge", E_GCONF_MAP_BOOL },
- { "UseDefaultReminder", "calendar/other/use_default_reminder", E_GCONF_MAP_BOOL },
- { "DefaultReminderInterval", "calendar/other/default_reminder_interval", E_GCONF_MAP_INT },
- { "DefaultReminderUnits", "calendar/other/default_reminder_units", E_GCONF_MAP_STRING },
- { 0 },
-};
-
-static e_gconf_map_t calendar_datenavigator_map[] = {
- /* /Calendar/DateNavigator */
- { "ShowWeekNumbers", "calendar/date_navigator/show_week_numbers", E_GCONF_MAP_BOOL },
- { 0 },
-};
-
-static e_gconf_map_t calendar_alarmnotify_map[] = {
- /* /Calendar/AlarmNotify */
- { "LastNotificationTime", "calendar/notify/last_notification_time", E_GCONF_MAP_INT },
- { "CalendarToLoad%i", "calendar/notify/calendars", E_GCONF_MAP_STRING|E_GCONF_MAP_LIST },
- { "BlessedProgram%i", "calendar/notify/programs", E_GCONF_MAP_STRING|E_GCONF_MAP_LIST },
- { 0 },
-};
-
-e_gconf_map_list_t calendar_remap_list[] = {
-
- { "/Calendar/Display", calendar_display_map },
- { "/Calendar/Other/Map", calendar_other_map },
- { "/Calendar/DateNavigator", calendar_datenavigator_map },
- { "/Calendar/AlarmNotify", calendar_alarmnotify_map },
-
- { 0 },
-};
-
-e_gconf_map_list_t task_remap_list[] = {
-
- { "/Calendar/Tasks", calendar_tasks_map },
- { "/Calendar/Tasks/Colors", calendar_tasks_colours_map },
-
- { 0 },
-};
-
-static GtkWidget *window;
-static GtkLabel *label;
-static GtkProgressBar *progress;
-
-static void
-setup_progress_dialog (gboolean tasks)
-{
- GtkWidget *vbox, *hbox, *w;
-
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title ((GtkWindow *) window, _("Migrating..."));
- gtk_window_set_modal ((GtkWindow *) window, TRUE);
- gtk_container_set_border_width ((GtkContainer *) window, 6);
-
- vbox = gtk_vbox_new (FALSE, 6);
- gtk_widget_show (vbox);
- gtk_container_add ((GtkContainer *) window, vbox);
-
- if (tasks)
- w = gtk_label_new (_("The location and hierarchy of the Evolution task "
- "folders has changed since Evolution 1.x.\n\nPlease be "
- "patient while Evolution migrates your folders..."));
- else
- w = gtk_label_new (_("The location and hierarchy of the Evolution calendar "
- "folders has changed since Evolution 1.x.\n\nPlease be "
- "patient while Evolution migrates your folders..."));
-
- gtk_label_set_line_wrap ((GtkLabel *) w, TRUE);
- gtk_widget_show (w);
- gtk_box_pack_start_defaults ((GtkBox *) vbox, w);
-
- hbox = gtk_hbox_new (FALSE, 6);
- gtk_widget_show (hbox);
- gtk_box_pack_start_defaults ((GtkBox *) vbox, hbox);
-
- label = (GtkLabel *) gtk_label_new ("");
- gtk_widget_show ((GtkWidget *) label);
- gtk_box_pack_start_defaults ((GtkBox *) hbox, (GtkWidget *) label);
-
- progress = (GtkProgressBar *) gtk_progress_bar_new ();
- gtk_widget_show ((GtkWidget *) progress);
- gtk_box_pack_start_defaults ((GtkBox *) hbox, (GtkWidget *) progress);
-
- gtk_widget_show (window);
-}
-
-static void
-dialog_close (void)
-{
- gtk_widget_destroy ((GtkWidget *) window);
-}
-
-static void
-dialog_set_folder_name (const char *folder_name)
-{
- char *text;
-
- text = g_strdup_printf (_("Migrating `%s':"), folder_name);
- gtk_label_set_text (label, text);
- g_free (text);
-
- gtk_progress_bar_set_fraction (progress, 0.0);
-
- while (gtk_events_pending ())
- gtk_main_iteration ();
-}
-
-static void
-dialog_set_progress (double percent)
-{
- char text[5];
-
- snprintf (text, sizeof (text), "%d%%", (int) (percent * 100.0f));
-
- gtk_progress_bar_set_fraction (progress, percent);
- gtk_progress_bar_set_text (progress, text);
-
- while (gtk_events_pending ())
- gtk_main_iteration ();
-}
-
-static gboolean
-check_for_conflict (ESourceGroup *group, char *name)
-{
- GSList *sources;
- GSList *s;
-
- sources = e_source_group_peek_sources (group);
-
- for (s = sources; s; s = s->next) {
- ESource *source = E_SOURCE (s->data);
-
- if (!strcmp (e_source_peek_name (source), name))
- return TRUE;
- }
-
- return FALSE;
-}
-
-static char *
-get_source_name (ESourceGroup *group, const char *path)
-{
- char **p = g_strsplit (path, "/", 0);
- int i, j, starting_index;
- int num_elements;
- gboolean conflict;
- GString *s = g_string_new ("");
-
- for (i = 0; p[i]; i ++) ;
-
- num_elements = i;
- i--;
-
- /* p[i] is now the last path element */
-
- /* check if it conflicts */
- starting_index = i;
- do {
- g_string_assign (s, "");
- for (j = starting_index; j < num_elements; j += 2) {
- if (j != starting_index)
- g_string_append_c (s, '_');
- g_string_append (s, p[j]);
- }
-
- conflict = check_for_conflict (group, s->str);
-
-
- /* if there was a conflict back up 2 levels (skipping the /subfolder/ element) */
- if (conflict)
- starting_index -= 2;
-
- /* we always break out if we can't go any further,
- regardless of whether or not we conflict. */
- if (starting_index < 0)
- break;
-
- } while (conflict);
-
- return g_string_free (s, FALSE);
-}
-
-static gboolean
-migrate_ical (ECal *old_ecal, ECal *new_ecal)
-{
- GList *l, *objects;
- int num_added = 0;
- int num_objects;
- gboolean retval = TRUE;
-
- /* both ecals are loaded, start the actual migration */
- if (!e_cal_get_object_list (old_ecal, "#t", &objects, NULL))
- return FALSE;
-
- num_objects = g_list_length (objects);
- for (l = objects; l; l = l->next) {
- icalcomponent *ical_comp = l->data;
- GError *error = NULL;
-
- if (!e_cal_create_object (new_ecal, ical_comp, NULL, &error)) {
- g_warning ("Migration of object failed: %s", error->message);
- retval = FALSE;
- }
-
- g_clear_error (&error);
-
- num_added ++;
- dialog_set_progress ((double)num_added / num_objects);
- }
-
- return retval;
-}
-
-static gboolean
-migrate_ical_folder_to_source (char *old_path, ESource *new_source, ECalSourceType type)
-{
- ECal *old_ecal = NULL, *new_ecal = NULL;
- ESource *old_source;
- ESourceGroup *group;
- char *old_uri = g_strdup_printf ("file://%s", old_path);
- GError *error = NULL;
- gboolean retval = FALSE;
-
- group = e_source_group_new ("", old_uri);
- old_source = e_source_new ("", "");
- e_source_group_add_source (group, old_source, -1);
-
- dialog_set_folder_name (e_source_peek_name (new_source));
-
- old_ecal = e_cal_new (old_source, type);
- if (!e_cal_open (old_ecal, TRUE, &error)) {
- g_warning ("failed to load source ecal for migration: '%s' (%s)", error->message,
- e_source_get_uri (old_source));
- goto finish;
- }
-
- new_ecal = e_cal_new (new_source, type);
- if (!e_cal_open (new_ecal, FALSE, &error)) {
- g_warning ("failed to load destination ecal for migration: '%s' (%s)", error->message,
- e_source_get_uri (new_source));
- goto finish;
- }
-
- retval = migrate_ical (old_ecal, new_ecal);
-
-finish:
- g_clear_error (&error);
- g_object_unref (old_ecal);
- g_object_unref (group);
- if (new_ecal)
- g_object_unref (new_ecal);
- g_free (old_uri);
-
- return retval;
-}
-
-static gboolean
-migrate_ical_folder (char *old_path, ESourceGroup *dest_group, char *source_name, ECalSourceType type)
-{
- ESource *new_source;
- gboolean retval;
-
- new_source = e_source_new (source_name, source_name);
- e_source_set_relative_uri (new_source, e_source_peek_uid (new_source));
- e_source_group_add_source (dest_group, new_source, -1);
-
- retval = migrate_ical_folder_to_source (old_path, new_source, type);
-
- g_object_unref (new_source);
-
- return retval;
-}
-
-
-#define WEBCAL_BASE_URI "webcal://"
-#define CONTACTS_BASE_URI "contacts://"
-#define BAD_CONTACTS_BASE_URI "contact://"
-#define PERSONAL_RELATIVE_URI "system"
-
-static ESourceGroup *
-create_calendar_contact_source (ESourceList *source_list)
-{
- ESourceGroup *group;
- ESource *source;
-
- /* Create the contacts group */
- group = e_source_group_new (_("Contacts"), CONTACTS_BASE_URI);
- e_source_list_add_group (source_list, group, -1);
-
- source = e_source_new (_("Birthdays & Anniversaries"), "/");
- e_source_group_add_source (group, source, -1);
- g_object_unref (source);
-
- e_source_set_color (source, 0xFED4D3);
- e_source_group_set_readonly (group, TRUE);
-
- return group;
-}
-
-static void
-create_calendar_sources (CalendarComponent *component,
- ESourceList *source_list,
- ESourceGroup **on_this_computer,
- ESource **personal_source,
- ESourceGroup **on_the_web,
- ESourceGroup **contacts)
-{
- GSList *groups;
- ESourceGroup *group;
- char *base_uri, *base_uri_proto;
-
- *on_this_computer = NULL;
- *on_the_web = NULL;
- *contacts = NULL;
- *personal_source = NULL;
-
- base_uri = g_build_filename (calendar_component_peek_base_directory (component),
- "/calendar/local/",
- NULL);
-
- base_uri_proto = g_strconcat ("file://", base_uri, NULL);
-
- groups = e_source_list_peek_groups (source_list);
- if (groups) {
- /* groups are already there, we need to search for things... */
- GSList *g;
-
- for (g = groups; g; g = g->next) {
-
- group = E_SOURCE_GROUP (g->data);
-
- if (!strcmp (BAD_CONTACTS_BASE_URI, e_source_group_peek_base_uri (group)))
- e_source_group_set_base_uri (group, CONTACTS_BASE_URI);
-
- if (!strcmp (base_uri, e_source_group_peek_base_uri (group)))
- e_source_group_set_base_uri (group, base_uri_proto);
-
- if (!*on_this_computer && !strcmp (base_uri_proto, e_source_group_peek_base_uri (group)))
- *on_this_computer = g_object_ref (group);
- else if (!*on_the_web && !strcmp (WEBCAL_BASE_URI, e_source_group_peek_base_uri (group)))
- *on_the_web = g_object_ref (group);
- else if (!*contacts && !strcmp (CONTACTS_BASE_URI, e_source_group_peek_base_uri (group)))
- *contacts = g_object_ref (group);
- }
- }
-
- if (*on_this_computer) {
- /* make sure "Personal" shows up as a source under
- this group */
- GSList *sources = e_source_group_peek_sources (*on_this_computer);
- GSList *s;
- for (s = sources; s; s = s->next) {
- ESource *source = E_SOURCE (s->data);
- if (!strcmp (PERSONAL_RELATIVE_URI, e_source_peek_relative_uri (source))) {
- *personal_source = g_object_ref (source);
- break;
- }
- }
- } else {
- /* create the local source group */
- group = e_source_group_new (_("On This Computer"), base_uri_proto);
- e_source_list_add_group (source_list, group, -1);
-
- *on_this_computer = group;
- }
-
- if (!*personal_source) {
- /* Create the default Person calendar */
- ESource *source = e_source_new (_("Personal"), PERSONAL_RELATIVE_URI);
- e_source_group_add_source (*on_this_computer, source, -1);
-
- if (!calendar_config_get_primary_calendar () && !calendar_config_get_calendars_selected ()) {
- GSList selected;
-
- calendar_config_set_primary_calendar (e_source_peek_uid (source));
-
- selected.data = (gpointer)e_source_peek_uid (source);
- selected.next = NULL;
- calendar_config_set_calendars_selected (&selected);
- }
-
- e_source_set_color (source, 0xBECEDD);
- *personal_source = source;
- }
-
- if (!*on_the_web) {
- /* Create the Webcal source group */
- group = e_source_group_new (_("On The Web"), WEBCAL_BASE_URI);
- e_source_list_add_group (source_list, group, -1);
-
- *on_the_web = group;
- }
-
- if (!*contacts) {
- group = create_calendar_contact_source (source_list);
-
- *contacts = group;
- }
-
- g_free (base_uri_proto);
- g_free (base_uri);
-}
-
-static void
-create_task_sources (TasksComponent *component,
- ESourceList *source_list,
- ESourceGroup **on_this_computer,
- ESourceGroup **on_the_web,
- ESource **personal_source)
-{
- GSList *groups;
- ESourceGroup *group;
- char *base_uri, *base_uri_proto;
-
- *on_this_computer = NULL;
- *on_the_web = NULL;
- *personal_source = NULL;
-
- base_uri = g_build_filename (tasks_component_peek_base_directory (component),
- "tasks", "local", NULL);
-
- base_uri_proto = g_strconcat ("file://", base_uri, NULL);
-
- groups = e_source_list_peek_groups (source_list);
- if (groups) {
- /* groups are already there, we need to search for things... */
- GSList *g;
-
- for (g = groups; g; g = g->next) {
-
- group = E_SOURCE_GROUP (g->data);
-
- if (!*on_this_computer && !strcmp (base_uri_proto, e_source_group_peek_base_uri (group)))
- *on_this_computer = g_object_ref (group);
- else if (!*on_the_web && !strcmp (WEBCAL_BASE_URI, e_source_group_peek_base_uri (group)))
- *on_the_web = g_object_ref (group);
- }
- }
-
- if (*on_this_computer) {
- /* make sure "Personal" shows up as a source under
- this group */
- GSList *sources = e_source_group_peek_sources (*on_this_computer);
- GSList *s;
- for (s = sources; s; s = s->next) {
- ESource *source = E_SOURCE (s->data);
- if (!strcmp (PERSONAL_RELATIVE_URI, e_source_peek_relative_uri (source))) {
- *personal_source = g_object_ref (source);
- break;
- }
- }
- } else {
- /* create the local source group */
- group = e_source_group_new (_("On This Computer"), base_uri_proto);
- e_source_list_add_group (source_list, group, -1);
-
- *on_this_computer = group;
- }
-
- if (!*personal_source) {
- /* Create the default Person task list */
- ESource *source = e_source_new (_("Personal"), PERSONAL_RELATIVE_URI);
- e_source_group_add_source (*on_this_computer, source, -1);
-
- if (!calendar_config_get_primary_tasks () && !calendar_config_get_tasks_selected ()) {
- GSList selected;
-
- calendar_config_set_primary_tasks (e_source_peek_uid (source));
-
- selected.data = (gpointer)e_source_peek_uid (source);
- selected.next = NULL;
- calendar_config_set_tasks_selected (&selected);
- }
-
- e_source_set_color (source, 0xBECEDD);
- *personal_source = source;
- }
-
- if (!*on_the_web) {
- /* Create the Webcal source group */
- group = e_source_group_new (_("On The Web"), WEBCAL_BASE_URI);
- e_source_list_add_group (source_list, group, -1);
-
- *on_the_web = group;
- }
-
- g_free (base_uri_proto);
- g_free (base_uri);
-}
-
-static void
-migrate_pilot_db_key (const char *key, gpointer user_data)
-{
- EXmlHash *xmlhash = user_data;
-
- e_xmlhash_add (xmlhash, key, "");
-}
-
-static void
-migrate_pilot_data (const char *component, const char *conduit, const char *old_path, const char *new_path)
-{
- char *changelog, *map;
- struct dirent *dent;
- const char *ext;
- char *filename;
- DIR *dir;
-
- if (!(dir = opendir (old_path)))
- return;
-
- map = g_alloca (12 + strlen (conduit));
- sprintf (map, "pilot-map-%s-", conduit);
-
- changelog = g_alloca (24 + strlen (conduit));
- sprintf (changelog, "pilot-sync-evolution-%s-", conduit);
-
- while ((dent = readdir (dir))) {
- if (!strncmp (dent->d_name, map, strlen (map)) &&
- ((ext = strrchr (dent->d_name, '.')) && !strcmp (ext, ".xml"))) {
- /* pilot map file - src and dest file formats are identical */
- unsigned char inbuf[4096];
- size_t nread, nwritten;
- int fd0, fd1;
- ssize_t n;
-
- filename = g_build_filename (old_path, dent->d_name, NULL);
- if ((fd0 = open (filename, O_RDONLY)) == -1) {
- g_free (filename);
- continue;
- }
-
- g_free (filename);
- filename = g_build_filename (new_path, dent->d_name, NULL);
- if ((fd1 = open (filename, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1) {
- g_free (filename);
- close (fd0);
- continue;
- }
-
- do {
- do {
- n = read (fd0, inbuf, sizeof (inbuf));
- } while (n == -1 && errno == EINTR);
-
- if (n < 1)
- break;
-
- nread = n;
- nwritten = 0;
- do {
- do {
- n = write (fd1, inbuf + nwritten, nread - nwritten);
- } while (n == -1 && errno == EINTR);
-
- if (n > 0)
- nwritten += n;
- } while (nwritten < nread && n != -1);
-
- if (n == -1)
- break;
- } while (1);
-
- if (n != -1)
- n = fsync (fd1);
-
- if (n == -1) {
- g_warning ("Failed to migrate %s: %s", dent->d_name, strerror (errno));
- unlink (filename);
- }
-
- close (fd0);
- close (fd1);
- g_free (filename);
- } else if (!strncmp (dent->d_name, changelog, strlen (changelog)) &&
- ((ext = strrchr (dent->d_name, '.')) && !strcmp (ext, ".db"))) {
- /* src and dest formats differ, src format is db3 while dest format is xml */
- EXmlHash *xmlhash;
- EDbHash *dbhash;
- struct stat st;
-
- filename = g_build_filename (old_path, dent->d_name, NULL);
- if (stat (filename, &st) == -1) {
- g_free (filename);
- continue;
- }
-
- dbhash = e_dbhash_new (filename);
- g_free (filename);
-
- filename = g_strdup_printf ("%s/%s.ics-%s", new_path, component, dent->d_name);
- if (stat (filename, &st) != -1)
- unlink (filename);
- xmlhash = e_xmlhash_new (filename);
- g_free (filename);
-
- e_dbhash_foreach_key (dbhash, migrate_pilot_db_key, xmlhash);
-
- e_dbhash_destroy (dbhash);
-
- e_xmlhash_write (xmlhash);
- e_xmlhash_destroy (xmlhash);
- }
- }
-
- closedir (dir);
-}
-
-gboolean
-migrate_calendars (CalendarComponent *component, int major, int minor, int revision, GError **err)
-{
- ESourceGroup *on_this_computer = NULL, *on_the_web = NULL, *contacts = NULL;
- ESource *personal_source = NULL;
- ECalEvent *ece;
- ECalEventTargetComponent *target;
- gboolean retval = FALSE;
-
- /* we call this unconditionally now - create_groups either
- creates the groups/sources or it finds the necessary
- groups/sources. */
- create_calendar_sources (component, calendar_component_peek_source_list (component), &on_this_computer, &personal_source, &on_the_web, &contacts);
-
- if (major == 1) {
- xmlDocPtr config_doc = NULL;
- char *conf_file;
- struct stat st;
-
- conf_file = g_build_filename (g_get_home_dir (), "evolution", "config.xmldb", NULL);
- if (lstat (conf_file, &st) == 0 && S_ISREG (st.st_mode))
- config_doc = xmlParseFile (conf_file);
- g_free (conf_file);
-
- if (config_doc && minor <= 2) {
- GConfClient *gconf;
- int res = 0;
-
- /* move bonobo config to gconf */
- gconf = gconf_client_get_default ();
-
- res = e_bconf_import (gconf, config_doc, calendar_remap_list);
-
- g_object_unref (gconf);
-
- xmlFreeDoc(config_doc);
-
- if (res != 0) {
- /* FIXME: set proper domain/code */
- g_set_error(err, 0, 0, _("Unable to migrate old settings from evolution/config.xmldb"));
- goto fail;
- }
- }
-
- if (minor <= 4) {
- GSList *migration_dirs, *l;
- char *path, *local_cal_folder;
-
- setup_progress_dialog (FALSE);
-
- path = g_build_filename (g_get_home_dir (), "evolution", "local", NULL);
- migration_dirs = e_folder_map_local_folders (path, "calendar");
- local_cal_folder = g_build_filename (path, "Calendar", NULL);
- g_free (path);
-
- if (personal_source)
- migrate_ical_folder_to_source (local_cal_folder, personal_source, E_CAL_SOURCE_TYPE_EVENT);
-
- for (l = migration_dirs; l; l = l->next) {
- char *source_name;
-
- if (personal_source && !strcmp ((char*)l->data, local_cal_folder))
- continue;
-
- source_name = get_source_name (on_this_computer, (char*)l->data);
-
- if (!migrate_ical_folder (l->data, on_this_computer, source_name, E_CAL_SOURCE_TYPE_EVENT)) {
- /* FIXME: domain/code */
- g_set_error(err, 0, 0, _("Unable to migrate calendar `%s'"), source_name);
- g_free(source_name);
- goto fail;
- }
-
- g_free (source_name);
- }
-
- g_free (local_cal_folder);
-
- dialog_close ();
- }
-
- if (minor <= 4 || (minor == 5 && revision < 5)) {
- GConfClient *gconf;
- GConfValue *gconf_val;
- int i;
- const char *keys[] = {
- CALENDAR_CONFIG_HPANE_POS,
- CALENDAR_CONFIG_VPANE_POS,
- CALENDAR_CONFIG_MONTH_HPANE_POS,
- CALENDAR_CONFIG_MONTH_VPANE_POS,
- NULL
- };
-
- gconf = gconf_client_get_default ();
-
- for (i = 0; keys[i]; i++) {
- gconf_val = gconf_client_get (gconf, keys[i], NULL);
- if (gconf_val) {
- if (gconf_val->type != GCONF_VALUE_INT)
- gconf_client_unset (gconf, keys[i], NULL);
- gconf_value_free (gconf_val);
- }
- }
-
- g_object_unref (gconf);
- }
-
- if (minor < 5 || (minor == 5 && revision <= 10)) {
- char *old_path, *new_path;
-
- old_path = g_build_filename (g_get_home_dir (), "evolution", "local", "Calendar", NULL);
- new_path = g_build_filename (calendar_component_peek_base_directory (component),
- "calendar", "local", "system", NULL);
- migrate_pilot_data ("calendar", "calendar", old_path, new_path);
- g_free (new_path);
- g_free (old_path);
- }
-
- /* we only need to do this next step if people ran
- older versions of 1.5. We need to clear out the
- absolute URI's that were assigned to ESources
- during one phase of development, as they take
- precedent over relative uris (but aren't updated
- when editing an ESource). */
- if (minor == 5 && revision <= 11) {
- GSList *g;
- for (g = e_source_list_peek_groups (calendar_component_peek_source_list (component)); g; g = g->next) {
- ESourceGroup *group = g->data;
- GSList *s;
-
- for (s = e_source_group_peek_sources (group); s; s = s->next) {
- ESource *source = s->data;
- e_source_set_absolute_uri (source, NULL);
- }
- }
- }
-
- }
-
- e_source_list_sync (calendar_component_peek_source_list (component), NULL);
-
- /** @Event: component.migration
- * @Title: Migration step in component initialization
- * @Target: ECalEventTargetComponent
- *
- * component.migration is emitted during the calendar component
- * initialization process. This allows new calendar backend types
- * to be distributed as an e-d-s backend and a plugin without
- * reaching their grubby little fingers into migration.c
- */
- /* Fire off migration event */
- ece = e_cal_event_peek ();
- target = e_cal_event_target_new_component (ece, calendar_component_peek (), 0);
- e_event_emit ((EEvent *) ece, "component.migration", (EEventTarget *) target);
-
- retval = TRUE;
-fail:
- if (on_this_computer)
- g_object_unref (on_this_computer);
- if (on_the_web)
- g_object_unref (on_the_web);
- if (contacts)
- g_object_unref (contacts);
- if (personal_source)
- g_object_unref (personal_source);
-
- return retval;
-}
-
-gboolean
-migrate_tasks (TasksComponent *component, int major, int minor, int revision, GError **err)
-{
- ESourceGroup *on_this_computer = NULL;
- ESourceGroup *on_the_web = NULL;
- ESource *personal_source = NULL;
- gboolean retval = FALSE;
-
- /* we call this unconditionally now - create_groups either
- creates the groups/sources or it finds the necessary
- groups/sources. */
- create_task_sources (component, tasks_component_peek_source_list (component), &on_this_computer, &on_the_web, &personal_source);
-
- if (major == 1) {
- xmlDocPtr config_doc = NULL;
- char *conf_file;
- struct stat st;
-
- conf_file = g_build_filename (g_get_home_dir (), "evolution", "config.xmldb", NULL);
- if (lstat (conf_file, &st) == 0 && S_ISREG (st.st_mode))
- config_doc = xmlParseFile (conf_file);
- g_free (conf_file);
-
- if (config_doc && minor <= 2) {
- GConfClient *gconf;
- int res = 0;
-
- /* move bonobo config to gconf */
- gconf = gconf_client_get_default ();
-
- res = e_bconf_import (gconf, config_doc, task_remap_list);
-
- g_object_unref (gconf);
-
- xmlFreeDoc(config_doc);
-
- if (res != 0) {
- g_set_error(err, 0, 0, _("Unable to migrate old settings from evolution/config.xmldb"));
- goto fail;
- }
- }
-
- if (minor <= 4) {
- GSList *migration_dirs, *l;
- char *path, *local_task_folder;
-
- setup_progress_dialog (TRUE);
-
- path = g_build_filename (g_get_home_dir (), "evolution", "local", NULL);
- migration_dirs = e_folder_map_local_folders (path, "tasks");
- local_task_folder = g_build_filename (path, "Tasks", NULL);
- g_free (path);
-
- if (personal_source)
- migrate_ical_folder_to_source (local_task_folder, personal_source, E_CAL_SOURCE_TYPE_TODO);
-
- for (l = migration_dirs; l; l = l->next) {
- char *source_name;
-
- if (personal_source && !strcmp ((char*)l->data, local_task_folder))
- continue;
-
- source_name = get_source_name (on_this_computer, (char*)l->data);
-
- if (!migrate_ical_folder (l->data, on_this_computer, source_name, E_CAL_SOURCE_TYPE_TODO)) {
- /* FIXME: domain/code */
- g_set_error(err, 0, 0, _("Unable to migrate tasks `%s'"), source_name);
- g_free(source_name);
- goto fail;
- }
-
- g_free (source_name);
- }
-
- g_free (local_task_folder);
-
- dialog_close ();
- }
-
- if (minor < 5 || (minor == 5 && revision <= 10)) {
- char *old_path, *new_path;
-
- old_path = g_build_filename (g_get_home_dir (), "evolution", "local", "Tasks", NULL);
- new_path = g_build_filename (tasks_component_peek_base_directory (component),
- "tasks", "local", "system", NULL);
- migrate_pilot_data ("tasks", "todo", old_path, new_path);
- g_free (new_path);
- g_free (old_path);
- }
-
- /* we only need to do this next step if people ran
- older versions of 1.5. We need to clear out the
- absolute URI's that were assigned to ESources
- during one phase of development, as they take
- precedent over relative uris (but aren't updated
- when editing an ESource). */
- if (minor == 5 && revision <= 11) {
- GSList *g;
- for (g = e_source_list_peek_groups (tasks_component_peek_source_list (component)); g; g = g->next) {
- ESourceGroup *group = g->data;
- GSList *s;
-
- for (s = e_source_group_peek_sources (group); s; s = s->next) {
- ESource *source = s->data;
- e_source_set_absolute_uri (source, NULL);
- }
- }
- }
- }
-
- e_source_list_sync (tasks_component_peek_source_list (component), NULL);
- retval = TRUE;
-fail:
- if (on_this_computer)
- g_object_unref (on_this_computer);
- if (on_the_web)
- g_object_unref (on_the_web);
- if (personal_source)
- g_object_unref (personal_source);
-
- return retval;
-}
diff --git a/calendar/gui/migration.h b/calendar/gui/migration.h
deleted file mode 100644
index 1092e30c14..0000000000
--- a/calendar/gui/migration.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* calendar-component.c
- *
- * Copyright (C) 2003 Ximian, Inc
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Rodrigo Moya <rodrigo@ximian.com>
- */
-
-#ifndef MIGRATION_H
-#define MIGRATION_H
-
-#include <libedataserver/e-source-group.h>
-#include "calendar-component.h"
-#include "tasks-component.h"
-
-struct _GError;
-
-gboolean migrate_calendars (CalendarComponent *component, int major, int minor, int revision, struct _GError **err);
-gboolean migrate_tasks (TasksComponent *component, int major, int minor, int revision, struct _GError **err);
-
-#endif
diff --git a/calendar/gui/misc.c b/calendar/gui/misc.c
deleted file mode 100644
index 332283172b..0000000000
--- a/calendar/gui/misc.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/* Evolution calendar - Miscellaneous utility functions
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <ctype.h>
-#include <libedataserver/e-url.h>
-#include "misc.h"
-
-
-
-/**
- * string_is_empty:
- * @value: A string.
- *
- * Returns whether a string is NULL, the empty string, or completely made up of
- * whitespace characters.
- *
- * Return value: TRUE if the string is empty, FALSE otherwise.
- **/
-gboolean
-string_is_empty (const char *value)
-{
- const char *p;
- gboolean empty;
-
- empty = TRUE;
-
- if (value) {
- p = value;
- while (*p) {
- if (!isspace ((unsigned char) *p)) {
- empty = FALSE;
- break;
- }
- p++;
- }
- }
- return empty;
-
-}
-
-/**
- * get_uri_without_password
- */
-char *
-get_uri_without_password (const char *full_uri)
-{
- EUri *uri;
- char *uristr;
-
- uri = e_uri_new (full_uri);
- if (!uri)
- return NULL;
-
- uristr = e_uri_to_string (uri, FALSE);
- e_uri_free (uri);
-
- return uristr;
- }
diff --git a/calendar/gui/misc.h b/calendar/gui/misc.h
deleted file mode 100644
index d32739f9f5..0000000000
--- a/calendar/gui/misc.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Evolution calendar - Miscellaneous utility functions
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Authors: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef MISC_H
-#define MISC_H
-
-#include <glib.h>
-
-gboolean string_is_empty (const char *value);
-char *get_uri_without_password (const char *uri);
-
-#endif
diff --git a/calendar/gui/print.c b/calendar/gui/print.c
deleted file mode 100644
index 9991f2e7cc..0000000000
--- a/calendar/gui/print.c
+++ /dev/null
@@ -1,2788 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/* Evolution calendar - Print support
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: Michael Zucchi <notzed@ximian.com>
- * Federico Mena-Quintero <federico@ximian.com>
- * Damon Chaplin <damon@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <math.h>
-#include <string.h>
-#include <time.h>
-#include <glib.h>
-#include <gtk/gtkradiobutton.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <libgnomeui/gnome-uidefs.h>
-#include <libgnomeui/gnome-stock-icons.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-paper.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
-#include <libgnomeprintui/gnome-print-paper-selector.h>
-#include <libgnomeprintui/gnome-print-preview.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
-#include <gal/util/e-util.h>
-#include <e-util/e-dialog-widgets.h>
-#include <e-util/e-time-utils.h>
-#include <e-util/e-print.h>
-#include <libecal/e-cal-time-util.h>
-#include "calendar-commands.h"
-#include "calendar-config.h"
-#include "e-cal-model.h"
-#include "e-day-view.h"
-#include "e-day-view-layout.h"
-#include "e-week-view.h"
-#include "e-week-view-layout.h"
-#include "gnome-cal.h"
-#include "print.h"
-
-
-
-/*
- * Note that most dimensions are in points (1/72 of an inch) since that is
- * what gnome-print uses.
- */
-
-/* GtkHTML prints using a fixed margin. It has code to get the margins from
- * gnome-print keys, but it's commented out. The corresponding code here
- * doesn't seem to work either (getting zero margins), so we adopt
- * gtkhtml's cheat. */
-
-#define TEMP_MARGIN .05
-
-/* The fonts to use */
-#define REGULAR_FONT "Sans Regular"
-#define BOLD_FONT "Sans Bold"
-
-/* The font size to use for normal text. */
-#define DAY_NORMAL_FONT_SIZE 12
-#define WEEK_NORMAL_FONT_SIZE 12
-#define MONTH_NORMAL_FONT_SIZE 8
-
-/* The height of the header bar across the top of the Day, Week & Month views,
- which contains the dates shown and the 2 small calendar months. */
-#define HEADER_HEIGHT 80
-
-/* The width of the small calendar months, the space from the right edge of
- the header rectangle, and the space between the months. */
-#define SMALL_MONTH_WIDTH 80
-#define SMALL_MONTH_PAD 4
-#define SMALL_MONTH_SPACING 12
-
-/* The minimum number of rows we leave space for for the long events in the
- day view. */
-#define DAY_VIEW_MIN_ROWS_IN_TOP_DISPLAY 2
-
-/* The row height for long events in the day view. */
-#define DAY_VIEW_ROW_HEIGHT 20
-
-/* The minutes per row in the day view printout. */
-#define DAY_VIEW_MINS_PER_ROW 30
-
-#define DAY_VIEW_ROWS ((60 / DAY_VIEW_MINS_PER_ROW) * 24)
-
-/* The width of the column with all the times in it. */
-#define DAY_VIEW_TIME_COLUMN_WIDTH 36
-
-/* The space on the right of each event. */
-#define DAY_VIEW_EVENT_X_PAD 8
-
-/* Allowance for small errors in floating point comparisons. */
-#define EPSILON 0.01
-
-/* The weird month of September 1752, where 3 Sep through 13 Sep were
- eliminated due to the Gregorian reformation. */
-static const int sept_1752[42] = {
- 0, 0, 1, 2, 14, 15, 16,
- 17, 18, 19, 20, 21, 22, 23,
- 24, 25, 26, 27, 28, 29, 30,
- 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0
-};
-#define SEPT_1752_START 2 /* Start day within month */
-#define SEPT_1752_END 20 /* End day within month */
-
-
-struct pdinfo
-{
- gint days_shown;
- time_t day_starts[E_DAY_VIEW_MAX_DAYS + 1];
-
- GArray *long_events;
- GArray *events[E_DAY_VIEW_MAX_DAYS];
-
- gint start_hour;
- gint end_hour;
- gint start_minute_offset;
- gint end_minute_offset;
- gint rows;
- gint mins_per_row;
- gint8 cols_per_row[DAY_VIEW_ROWS];
- gboolean use_24_hour_format;
-};
-
-struct psinfo
-{
- gint days_shown;
- time_t day_starts[E_WEEK_VIEW_MAX_WEEKS * 7 + 1];
-
- GArray *events;
-
- int rows_per_cell;
- int rows_per_compressed_cell;
- int display_start_weekday;
- gboolean multi_week_view;
- int weeks_shown;
- int month;
- gboolean compress_weekend;
- gboolean use_24_hour_format;
- double row_height;
- double header_row_height;
-};
-
-struct ptinfo
-{
- GList *todos;
-};
-
-struct einfo
-{
- char *text;
- time_t start;
- time_t end;
- int count;
-};
-
-/* Convenience function to help the transition to timezone functions.
- It converts a time_t to a struct tm. */
-static struct tm*
-convert_timet_to_struct_tm (time_t time, icaltimezone *zone)
-{
- static struct tm my_tm;
- struct icaltimetype tt;
-
- /* Convert it to an icaltimetype. */
- tt = icaltime_from_timet_with_zone (time, FALSE, zone);
-
- /* Fill in the struct tm. */
- my_tm.tm_year = tt.year - 1900;
- my_tm.tm_mon = tt.month - 1;
- my_tm.tm_mday = tt.day;
- my_tm.tm_hour = tt.hour;
- my_tm.tm_min = tt.minute;
- my_tm.tm_sec = tt.second;
- my_tm.tm_isdst = tt.is_daylight;
-
- my_tm.tm_wday = time_day_of_week (tt.day, tt.month - 1, tt.year);
-
- return &my_tm;
-}
-
-
-/* Fills the 42-element days array with the day numbers for the specified month. Slots outside the
- * bounds of the month are filled with zeros. The starting and ending indexes of the days are
- * returned in the start and end arguments.
- */
-static void
-build_month (int month, int year, int *days, int *start, int *end)
-{
- int i;
- int d_month, d_week, week_start_day;
-
- /* Note that months are zero-based, so September is month 8 */
-
- if ((year == 1752) && (month == 8)) {
- memcpy (days, sept_1752, 42 * sizeof (int));
-
- if (start)
- *start = SEPT_1752_START;
-
- if (end)
- *end = SEPT_1752_END;
-
- return;
- }
-
- for (i = 0; i < 42; i++)
- days[i] = 0;
-
- d_month = time_days_in_month (year, month);
- /* Get the start weekday in the month, 0=Sun to 6=Sat. */
- d_week = time_day_of_week (1, month, year);
-
- /* Get the configuration setting specifying which weekday we put on
- the left column, 0=Sun to 6=Sat. */
- week_start_day = calendar_config_get_week_start_day ();
-
- /* Figure out which square we want to put the 1 in. */
- d_week = (d_week + 7 - week_start_day) % 7;
-
- for (i = 0; i < d_month; i++)
- days[d_week + i] = i + 1;
-
- if (start)
- *start = d_week;
-
- if (end)
- *end = d_week + d_month - 1;
-}
-
-static GnomeFont *
-get_font_for_size (double h, GnomeFontWeight weight, gboolean italic)
-{
- GnomeFontFace *face;
- GnomeFont *font;
- double asc, desc, size;
- gchar *font_name;
-
- if (weight <= GNOME_FONT_BOOK)
- font_name = REGULAR_FONT;
- else
- font_name = BOLD_FONT;
-
- if (italic)
- font_name = g_strconcat (font_name, " Italic", NULL);
-
- /* This function is broken in gnome-print (it doesn't find a suitable face).
- * face = gnome_font_face_find_closest_from_weight_slant (DEFAULT_FONT, weight, italic); */
- face = gnome_font_face_find (font_name);
-
- asc = gnome_font_face_get_ascender (face);
- desc = abs (gnome_font_face_get_descender (face));
- size = h * 1000 / (asc + desc);
-
- /* This function is broken in gnome-print (it doesn't find a suitable font).
- * font = gnome_font_find_closest_from_weight_slant (DEFAULT_FONT, weight, italic, size); */
- font = gnome_font_find_closest (font_name, size);
-
- g_object_unref (face);
- if (italic)
- g_free (font_name);
- return font;
-}
-
-enum align_box {
- ALIGN_LEFT=1,
- ALIGN_RIGHT,
- ALIGN_CENTER,
- ALIGN_BORDER= 1<<8
-};
-
-
-/* Prints a rectangle, with or without a border, filled or outline, and
- possibly with triangular arrows at one or both horizontal edges.
- width = width of border, -ve means no border.
- red,green,blue = bgcolor to fill, -ve means no fill.
- left_triangle_width, right_triangle_width = width from edge of rectangle to
- point of triangle, or -ve for no triangle. */
-static void
-print_border_with_triangles (GnomePrintContext *pc,
- double l, double r, double t, double b,
- double width, double red, double green, double blue,
- double left_triangle_width,
- double right_triangle_width)
-{
- gnome_print_gsave (pc);
-
- /* Fill in the interior of the rectangle, if desired. */
- if (red >= -EPSILON && green >= -EPSILON && blue >= -EPSILON) {
- gnome_print_moveto (pc, l, t);
- if (left_triangle_width > 0.0)
- gnome_print_lineto (pc, l - left_triangle_width,
- (t + b) / 2);
- gnome_print_lineto (pc, l, b);
- gnome_print_lineto (pc, r, b);
- if (right_triangle_width > 0.0)
- gnome_print_lineto (pc, r + right_triangle_width,
- (t + b) / 2);
- gnome_print_lineto (pc, r, t);
- gnome_print_closepath (pc);
- gnome_print_setrgbcolor (pc, red, green, blue);
- gnome_print_fill (pc);
- }
-
- /* Draw the outline, if desired. */
- if (width >= -EPSILON) {
- gnome_print_moveto (pc, l, t);
- if (left_triangle_width > 0.0)
- gnome_print_lineto (pc, l - left_triangle_width,
- (t + b) / 2);
- gnome_print_lineto (pc, l, b);
- gnome_print_lineto (pc, r, b);
- if (right_triangle_width > 0.0)
- gnome_print_lineto (pc, r + right_triangle_width,
- (t + b) / 2);
- gnome_print_lineto (pc, r, t);
- gnome_print_closepath (pc);
- gnome_print_setrgbcolor (pc, 0, 0, 0);
- gnome_print_setlinewidth (pc, width);
- gnome_print_stroke (pc);
- }
-
- gnome_print_grestore (pc);
-}
-
-
-/* Prints a rectangle, with or without a border, and filled or outline.
- width = width of border, -ve means no border.
- fillcolor = shade of fill, -ve means no fill. */
-static void
-print_border_rgb (GnomePrintContext *pc,
- double l, double r, double t, double b,
- double width, double red, double green, double blue)
-{
- print_border_with_triangles (pc, l, r, t, b, width, red, green, blue, -1.0, -1.0);
-}
-
-static void
-print_border (GnomePrintContext *pc,
- double l, double r, double t, double b,
- double width, double fillcolor)
-{
- print_border_rgb (pc, l, r, t, b, width, fillcolor, fillcolor, fillcolor);
-}
-
-static void
-print_rectangle (GnomePrintContext *pc,
- double l, double r, double t, double b,
- double red, double green, double blue)
-{
- gnome_print_gsave (pc);
-
- gnome_print_moveto (pc, l, t);
- gnome_print_lineto (pc, l, b);
- gnome_print_lineto (pc, r, b);
- gnome_print_lineto (pc, r, t);
- gnome_print_closepath (pc);
- gnome_print_setrgbcolor (pc, red, green, blue);
- gnome_print_fill (pc);
-
- gnome_print_grestore (pc);
-}
-
-/* Prints 1 line of aligned text in a box. It is centered vertically, and
- the horizontal alignment can be either ALIGN_LEFT, ALIGN_RIGHT, or
- ALIGN_CENTER. */
-static void
-print_text(GnomePrintContext *pc, GnomeFont *font, const char *text,
- enum align_box align, double l, double r, double t, double b)
-{
- double w, x, y;
-
- gnome_print_gsave (pc);
-
- w = gnome_font_get_width_utf8 (font, text);
-
- switch (align & 3) {
- case ALIGN_LEFT:
- default:
- x = l;
- break;
- case ALIGN_RIGHT:
- x = r - w;
- break;
- case ALIGN_CENTER:
- x = l + ((r - l) - w) / 2;
- break;
- }
-
- /* Make sure we don't go off the left edge. */
- x = MAX (l, x);
-
- /* Now calculate the baseline. */
- y = t - gnome_font_get_ascender (font);
-
- /* Set a clipping rectangle. */
- gnome_print_moveto (pc, l, t);
- gnome_print_lineto (pc, r, t);
- gnome_print_lineto (pc, r, b);
- gnome_print_lineto (pc, l, b);
- gnome_print_closepath (pc);
- gnome_print_clip (pc);
-
- gnome_print_newpath (pc);
- gnome_print_moveto (pc, x, y);
- gnome_print_setfont (pc, font);
- gnome_print_setrgbcolor (pc, 0, 0, 0);
- gnome_print_show (pc, text);
-
- gnome_print_grestore (pc);
-}
-
-/* gets/frees the font for you, as a book font */
-static void
-print_text_size(GnomePrintContext *pc, const char *text,
- enum align_box align, double l, double r, double t, double b)
-{
- GnomeFont *font;
-
- font = get_font_for_size (t - b, GNOME_FONT_BOOK, FALSE);
- print_text(pc, font, text, align, l, r, t, b);
- g_object_unref (font);
-}
-
-/* gets/frees the font for you, as a bold font */
-static void
-print_text_size_bold(GnomePrintContext *pc, const char *text,
- enum align_box align, double l, double r, double t, double b)
-{
- GnomeFont *font;
-
- font = get_font_for_size (t - b, GNOME_FONT_BOLD, FALSE);
- print_text(pc, font, text, align, l, r, t, b);
- g_object_unref (font);
-}
-
-static void
-titled_box (GnomePrintContext *pc, const char *text, GnomeFont *font,
- enum align_box align, double *l, double *r, double *t, double *b,
- double linewidth)
-{
- double size;
-
- size = gnome_font_get_size (font);
-
- if (align & ALIGN_BORDER) {
- print_border (pc, *l, *r, *t, *t - size * 1.4,
- linewidth, 0.9);
- print_border (pc, *l, *r, *t - size * 1.4, *b,
- linewidth, -1.0);
-
- *l += 2;
- *r -= 2;
- *b += 2;
- }
-
- print_text (pc, font, text, align, *l, *r, *t, *t - size * 1.4);
- *t -= size * 1.4;
-}
-
-enum datefmt {
- DATE_MONTH = 1 << 0,
- DATE_DAY = 1 << 1,
- DATE_DAYNAME = 1 << 2,
- DATE_YEAR = 1 << 3
-};
-
-static char *days[] = {
- N_("1st"), N_("2nd"), N_("3rd"), N_("4th"), N_("5th"),
- N_("6th"), N_("7th"), N_("8th"), N_("9th"), N_("10th"),
- N_("11th"), N_("12th"), N_("13th"), N_("14th"), N_("15th"),
- N_("16th"), N_("17th"), N_("18th"), N_("19th"), N_("20th"),
- N_("21st"), N_("22nd"), N_("23rd"), N_("24th"), N_("25th"),
- N_("26th"), N_("27th"), N_("28th"), N_("29th"), N_("30th"),
- N_("31st")
-};
-
-/*
- format the date 'nicely' and consistently for various headers
-*/
-static char *
-format_date(time_t time, int flags, char *buffer, int bufflen)
-{
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- char fmt[64];
- struct tm tm;
-
- tm = *convert_timet_to_struct_tm (time, zone);
-
- fmt[0] = 0;
- if (flags & DATE_DAYNAME) {
- strcat(fmt, "%A");
- }
- if (flags & DATE_DAY) {
- if (flags & DATE_DAYNAME)
- strcat(fmt, " ");
- strcat(fmt, gettext(days[tm.tm_mday-1]));
- }
- if (flags & DATE_MONTH) {
- if (flags & (DATE_DAY|DATE_DAYNAME))
- strcat(fmt, " ");
- strcat(fmt, "%B");
- if ((flags & (DATE_DAY|DATE_YEAR)) == (DATE_DAY|DATE_YEAR))
- strcat(fmt, ",");
- }
- if (flags & DATE_YEAR) {
- if (flags & (DATE_DAY|DATE_DAYNAME|DATE_MONTH))
- strcat(fmt, " ");
- strcat(fmt, "%Y");
- }
- e_utf8_strftime(buffer, bufflen, fmt, &tm);
- buffer[bufflen - 1] = '\0';
-
- return buffer;
-}
-
-static gboolean
-instance_cb (ECalComponent *comp, time_t instance_start, time_t instance_end, gpointer data)
-{
-
- gboolean *found = ((ECalModelGenerateInstancesData *) data)->cb_data;
-
- *found = TRUE;
-
- return FALSE;
-}
-
-
-/*
- print out the month small, embolden any days with events.
-*/
-static void
-print_month_small (GnomePrintContext *pc, GnomeCalendar *gcal, time_t month,
- double left, double right, double top, double bottom,
- int titleflags, time_t greystart, time_t greyend,
- int bordertitle)
-{
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- ECal *client;
- GnomeFont *font, *font_bold, *font_normal;
- time_t now, next;
- int x, y;
- int days[42];
- int day, weekday, week_start_day;
- char buf[100];
- struct tm tm;
- double font_size, max_font_size;
- double header_size, col_width, row_height, text_xpad, w;
- double cell_top, cell_bottom, cell_left, cell_right, text_right;
- char *daynames[] = { N_("Su"), N_("Mo"), N_("Tu"), N_("We"),
- N_("Th"), N_("Fr"), N_("Sa") };
-
- /* Print the title, e.g. 'June 2001', in the top 16% of the area. */
- format_date (month, titleflags, buf, 100);
- header_size = (top - bottom) * 0.16;
- font = get_font_for_size (header_size, GNOME_FONT_BOLD, FALSE);
- if (bordertitle) {
- print_border (pc, left, right, top, top - header_size,
- 1.0, 0.9);
- }
- print_text (pc, font, buf, ALIGN_CENTER, left, right,
- top, top - header_size);
- g_object_unref (font);
-
- top -= header_size;
-
- client = gnome_calendar_get_default_client (gcal);
-
- col_width = (right - left) / 7;
-
- /* The top row with the day abbreviations gets an extra bit of
- vertical space around it. */
- row_height = (top - bottom) / 7.4;
-
- /* First we need to calculate a reasonable font size. We start with a
- rough guess of just under the height of each row. */
- font_size = row_height;
-
- /* Check that it isn't going to be too wide. The characters are about
- twice as high as they are wide, but we need to fit two characters
- into each cell, so we don't want to go over col_width. */
- max_font_size = col_width * 0.65;
-
- font_size = row_height;
-
- /* get month days */
- tm = *convert_timet_to_struct_tm (month, zone);
- build_month (tm.tm_mon, tm.tm_year + 1900, days, 0, 0);
-
- font_normal = get_font_for_size (font_size, GNOME_FONT_BOOK, FALSE);
- font_bold = get_font_for_size (font_size, GNOME_FONT_BOLD, FALSE);
-
- /* Get a reasonable estimate of the largest number we will need,
- and use it to calculate the offset from the right edge of the
- cell that we should put the numbers. */
- w = gnome_font_get_width_utf8 (font_bold, "23");
- text_xpad = (col_width - w) / 2;
-
- gnome_print_setrgbcolor (pc, 0, 0, 0);
-
- /* Print the abbreviated day names across the top in bold. */
- week_start_day = calendar_config_get_week_start_day ();
- weekday = week_start_day;
- for (x = 0; x < 7; x++) {
- print_text (pc, font_bold, _(daynames[weekday]), ALIGN_CENTER,
- left + x * col_width, left + (x + 1) * col_width,
- top, top - row_height * 1.4);
- weekday = (weekday + 1) % 7;
- }
-
- top -= row_height * 1.4;
-
- now = time_month_begin_with_zone (month, zone);
- for (y = 0; y < 6; y++) {
-
- cell_top = top - y * row_height;
- cell_bottom = cell_top - row_height;
-
- for (x = 0; x < 7; x++) {
-
- cell_left = left + x * col_width;
- /* We add a 0.05 to make sure the cells meet up with
- each other. Otherwise you sometimes get lines
- between them which looks bad. Maybe I'm not using
- coords in the way gnome-print expects. */
- cell_right = cell_left + col_width + 0.05;
- text_right = cell_right - text_xpad;
-
- day = days[y * 7 + x];
- if (day != 0) {
- gboolean found = FALSE;
-
- sprintf (buf, "%d", day);
-
- /* this is a slow messy way to do this ... but easy ... */
- e_cal_model_generate_instances (gnome_calendar_get_calendar_model (gcal), now,
- time_day_end_with_zone (now, zone),
- instance_cb, &found);
-
- font = found ? font_bold : font_normal;
-
- next = time_add_day_with_zone (now, 1, zone);
- if ((now >= greystart && now < greyend)
- || (greystart >= now && greystart < next)) {
- print_border (pc,
- cell_left, cell_right,
- cell_top, cell_bottom,
- -1.0, 0.75);
- }
- print_text (pc, font, buf, ALIGN_RIGHT,
- cell_left, text_right,
- cell_top, cell_bottom);
-
- now = next;
- }
- }
- }
- g_object_unref (font_normal);
- g_object_unref (font_bold);
-}
-
-
-
-/* wraps text into the print context, not taking up more than its allowed space */
-static double
-bound_text(GnomePrintContext *pc, GnomeFont *font, const char *text,
- double left, double right, double top, double bottom, double indent)
-{
- double maxwidth = right-left;
- double width;
- const char *p;
- char *wordstart;
- int c;
- char *outbuffer, *o, *outbuffendmarker;
- int outbufflen;
- int dump=0;
- int first=1;
-
- g_return_val_if_fail(text!=NULL, top);
-
- if (top<bottom) {
- /* too much to fit in appointment printout */
- return top;
- }
-
- outbufflen = 1024;
- outbuffer = g_malloc(outbufflen);
- outbuffendmarker = outbuffer+outbufflen-2;
-
- top -= gnome_font_get_size (font);
- gnome_print_setfont (pc, font);
-
- width=0;
- p = text;
- wordstart = outbuffer;
- o = outbuffer;
- while ((c=*p)) {
- if (c=='\n') {
- wordstart=o;
- dump=1;
- } else {
- /* grow output buffer if required */
- if (o>=outbuffendmarker) {
- char *newbuf;
- outbufflen*=2;
- newbuf = g_realloc(outbuffer, outbufflen);
- o = newbuf+(o-outbuffer);
- wordstart = newbuf+(o-outbuffer);
- outbuffer = newbuf;
- outbuffendmarker = outbuffer+outbufflen-2;
- }
- *o++=c;
- if (c==' ')
- wordstart = o;
-
- dump=0;
- if (g_utf8_validate (p, strlen(p), NULL)) {
- width+=gnome_font_get_glyph_width(font, gnome_font_lookup_default (font, c));
- if (width>maxwidth) {
- o--;
- p--;
- dump=1;
- }
- }
- }
- if (dump) {
- if (wordstart==outbuffer)
- wordstart=o;
- c=*wordstart;
- *wordstart=0;
- gnome_print_moveto(pc, left, top);
- gnome_print_show(pc, outbuffer);
- *wordstart=c;
- memcpy(outbuffer, wordstart, o-wordstart);
- width = gnome_font_get_width_utf8_sized(font, outbuffer, o-wordstart);
- o=outbuffer+(o-wordstart);
- wordstart = outbuffer;
- top -= gnome_font_get_size (font);
- if (top<bottom) {
- /* too much to fit, drop the rest */
- g_free(outbuffer);
- return top;
- }
- if (first) {
- left += indent;
- maxwidth -= indent;
- first=0;
- }
- }
- p++;
- }
- if (dump==0) {
- *o=0;
- gnome_print_moveto(pc, left, top);
- gnome_print_show(pc, outbuffer);
- top -= gnome_font_get_size (font);
- }
- g_free(outbuffer);
-
- return top;
-}
-
-
-/* Draw the borders, lines, and times down the left of the day view. */
-static void
-print_day_background (GnomePrintContext *pc, GnomeCalendar *gcal,
- time_t whence, struct pdinfo *pdi,
- double left, double right, double top, double bottom)
-{
- GnomeFont *font_hour, *font_minute;
- double yinc, y;
- double width = DAY_VIEW_TIME_COLUMN_WIDTH;
- double font_size, max_font_size, hour_font_size, minute_font_size;
- char buf[20];
- const char *minute;
- gboolean use_24_hour;
- int i, hour, row;
-
- /* Fill the time column in light-gray. */
- print_border (pc, left, left + width, top, bottom, -1.0, 0.9);
-
- /* Draw the border around the entire view. */
- gnome_print_setrgbcolor (pc, 0, 0, 0);
- print_border (pc, left, right, top, bottom, 1.0, -1.0);
-
- /* Draw the vertical line on the right of the time column. */
- gnome_print_setlinewidth (pc, 0.0);
- gnome_print_moveto (pc, left + width, bottom);
- gnome_print_lineto (pc, left + width, top);
- gnome_print_stroke (pc);
-
- /* Calculate the row height. */
- yinc = (top - bottom) / (pdi->end_hour - pdi->start_hour);
-
- /* Get the 2 fonts we need. */
- font_size = yinc * 0.6;
- max_font_size = width * 0.5;
- hour_font_size = MIN (font_size, max_font_size);
- font_hour = get_font_for_size (hour_font_size, GNOME_FONT_BOLD, FALSE);
-
- font_size = yinc * 0.33;
- max_font_size = width * 0.25;
- minute_font_size = MIN (font_size, max_font_size);
- font_minute = get_font_for_size (minute_font_size, GNOME_FONT_BOLD, FALSE);
-
- use_24_hour = calendar_config_get_24_hour_format ();
-
- row = 0;
- for (i = pdi->start_hour; i < pdi->end_hour; i++) {
- y = top - yinc * (row + 1);
- gnome_print_setrgbcolor (pc, 0, 0, 0);
-
- if (use_24_hour) {
- hour = i;
- minute = "00";
- } else {
- if (i < 12)
- minute = _("am");
- else
- minute = _("pm");
-
- hour = i % 12;
- if (hour == 0)
- hour = 12;
- }
-
- /* the hour label/minute */
- sprintf (buf, "%d", hour);
- print_text (pc, font_hour, buf, ALIGN_RIGHT,
- left, left + width * 0.58,
- y + yinc - 4, y + yinc - 4 - hour_font_size);
- print_text (pc, font_minute, minute, ALIGN_RIGHT,
- left, left + width - 3,
- y + yinc - 3, y + yinc - 3 - minute_font_size);
-
- /* Draw the horizontal line between hours, across the entire
- width of the day view. */
- gnome_print_moveto (pc, left, y);
- gnome_print_lineto (pc, right, y);
- gnome_print_stroke (pc);
-
- /* Draw the horizontal line for the 1/2-hours, across the
- entire width except for part of the time column. */
- gnome_print_moveto (pc, left + width * 0.6, y + yinc / 2);
- gnome_print_lineto (pc, right, y + yinc / 2);
- gnome_print_stroke (pc);
-
- row++;
- }
-
- g_object_unref (font_hour);
- g_object_unref (font_minute);
-}
-
-
-/* This adds one event to the view, adding it to the appropriate array. */
-static gint
-print_day_add_event (ECalModelComponent *comp_data,
- time_t start,
- time_t end,
- gint days_shown,
- time_t *day_starts,
- GArray *long_events,
- GArray **events)
-
-{
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- EDayViewEvent event;
- gint day, offset;
- struct icaltimetype start_tt, end_tt;
-
-#if 0
- g_print ("Day view lower: %s", ctime (&day_starts[0]));
- g_print ("Day view upper: %s", ctime (&day_starts[days_shown]));
- g_print ("Event start: %s", ctime (&start));
- g_print ("Event end : %s\n", ctime (&end));
-#endif
-
- /* Check that the event times are valid. */
- g_return_val_if_fail (start <= end, -1);
- g_return_val_if_fail (start < day_starts[days_shown], -1);
- g_return_val_if_fail (end > day_starts[0], -1);
-
- start_tt = icaltime_from_timet_with_zone (start, FALSE, zone);
- end_tt = icaltime_from_timet_with_zone (end, FALSE, zone);
-
- event.comp_data = comp_data;
- event.start = start;
- event.end = end;
- event.canvas_item = NULL;
-
- /* Calculate the start & end minute, relative to the top of the
- display. */
- /*offset = day_view->first_hour_shown * 60
- + day_view->first_minute_shown;*/
- offset = 0;
- event.start_minute = start_tt.hour * 60 + start_tt.minute - offset;
- event.end_minute = end_tt.hour * 60 + end_tt.minute - offset;
-
- event.start_row_or_col = 0;
- event.num_columns = 0;
-
- /* Find out which array to add the event to. */
- for (day = 0; day < days_shown; day++) {
- if (start >= day_starts[day] && end <= day_starts[day + 1]) {
-
- /* Special case for when the appointment ends at
- midnight, i.e. the start of the next day. */
- if (end == day_starts[day + 1]) {
-
- /* If the event last the entire day, then we
- skip it here so it gets added to the top
- canvas. */
- if (start == day_starts[day])
- break;
-
- event.end_minute = 24 * 60;
- }
-
- g_array_append_val (events[day], event);
- return day;
- }
- }
-
- /* The event wasn't within one day so it must be a long event,
- i.e. shown in the top canvas. */
- g_array_append_val (long_events, event);
- return E_DAY_VIEW_LONG_EVENT;
-}
-
-
-static gboolean
-print_day_details_cb (ECalComponent *comp, time_t istart, time_t iend,
- gpointer data)
-{
- ECalModelGenerateInstancesData *mdata = (ECalModelGenerateInstancesData *) data;
- struct pdinfo *pdi = (struct pdinfo *) mdata->cb_data;
-
- print_day_add_event (mdata->comp_data, istart, iend,
- pdi->days_shown, pdi->day_starts,
- pdi->long_events, pdi->events);
-
- return TRUE;
-}
-
-
-static void
-free_event_array (GArray *array)
-{
- EDayViewEvent *event;
- gint event_num;
-
- for (event_num = 0; event_num < array->len; event_num++) {
- event = &g_array_index (array, EDayViewEvent, event_num);
- if (event->canvas_item)
- gtk_object_destroy (GTK_OBJECT (event->canvas_item));
- }
-
- g_array_set_size (array, 0);
-}
-
-
-static void
-print_day_long_event (GnomePrintContext *pc, GnomeFont *font,
- double left, double right, double top, double bottom,
- double row_height, EDayViewEvent *event,
- struct pdinfo *pdi, ECalModel *model)
-{
- const gchar *summary;
- double x1, x2, y1, y2;
- double left_triangle_width = -1.0, right_triangle_width = -1.0;
- char *text;
- char buffer[32];
- struct tm date_tm;
- double red, green, blue;
-
- /* If the event starts before the first day being printed, draw a
- triangle. (Note that I am assuming we are just showing 1 day at
- the moment.) */
- if (event->start < pdi->day_starts[0])
- left_triangle_width = 4;
-
- /* If the event ends after the last day being printed, draw a
- triangle. */
- if (event->end > pdi->day_starts[1])
- right_triangle_width = 4;
-
- x1 = left + 10;
- x2 = right - 10;
- y1 = top - event->start_row_or_col * row_height - 4;
- y2 = y1 - row_height + 4;
- red = green = blue = 0.95;
- e_cal_model_get_rgb_color_for_component (model, event->comp_data, &red, &green, &blue);
- print_border_with_triangles (pc, x1, x2, y1, y2, 0.5, red, green, blue,
- left_triangle_width,
- right_triangle_width);
-
- /* If the event starts after the first day being printed, we need to
- print the start time. */
- if (event->start > pdi->day_starts[0]) {
- date_tm.tm_year = 2001;
- date_tm.tm_mon = 0;
- date_tm.tm_mday = 1;
- date_tm.tm_hour = event->start_minute / 60;
- date_tm.tm_min = event->start_minute % 60;
- date_tm.tm_sec = 0;
- date_tm.tm_isdst = -1;
-
- e_time_format_time (&date_tm, pdi->use_24_hour_format, FALSE,
- buffer, sizeof (buffer));
-
- x1 += 4;
- print_text (pc, font, buffer, ALIGN_LEFT, x1, x2, y1, y2);
- x1 += gnome_font_get_width_utf8 (font, buffer);
- }
-
- /* If the event ends before the end of the last day being printed,
- we need to print the end time. */
- if (event->end < pdi->day_starts[1]) {
- date_tm.tm_year = 2001;
- date_tm.tm_mon = 0;
- date_tm.tm_mday = 1;
- date_tm.tm_hour = event->end_minute / 60;
- date_tm.tm_min = event->end_minute % 60;
- date_tm.tm_sec = 0;
- date_tm.tm_isdst = -1;
-
- e_time_format_time (&date_tm, pdi->use_24_hour_format, FALSE,
- buffer, sizeof (buffer));
-
- x2 -= 4;
- print_text (pc, font, buffer, ALIGN_RIGHT, x1, x2, y1, y2);
- x2 -= gnome_font_get_width_utf8 (font, buffer);
- }
-
- /* Print the text. */
- summary = icalcomponent_get_summary (event->comp_data->icalcomp);
- text = summary ? (char*) summary : "";
-
- x1 += 4;
- x2 -= 4;
- print_text (pc, font, text, ALIGN_CENTER, x1, x2, y1, y2);
-}
-
-
-static void
-print_day_event (GnomePrintContext *pc, GnomeFont *font,
- double left, double right, double top, double bottom,
- EDayViewEvent *event, struct pdinfo *pdi, ECalModel *model)
-{
- const gchar *summary;
- double x1, x2, y1, y2, col_width, row_height;
- int start_offset, end_offset, start_row, end_row;
- char *text, start_buffer[32], end_buffer[32];
- gboolean display_times = FALSE, free_text = FALSE;
- struct tm date_tm;
- double red, green, blue;
-
- if ((event->start_minute >= pdi->end_minute_offset)
- || (event->end_minute <= pdi->start_minute_offset))
- return;
-
- start_offset = event->start_minute - pdi->start_minute_offset;
- end_offset = event->end_minute - pdi->start_minute_offset;
-
- start_row = start_offset / pdi->mins_per_row;
- start_row = MAX (0, start_row);
- end_row = (end_offset - 1) / pdi->mins_per_row;
- end_row = MIN (pdi->rows - 1, end_row);
- col_width = (right - left) / pdi->cols_per_row[event->start_minute / pdi->mins_per_row];
-
- if (start_offset != start_row * pdi->mins_per_row
- || end_offset != (end_row + 1) * pdi->mins_per_row)
- display_times = TRUE;
-
- x1 = left + event->start_row_or_col * col_width;
- x2 = x1 + event->num_columns * col_width - DAY_VIEW_EVENT_X_PAD;
-
- row_height = (top - bottom) / pdi->rows;
- y1 = top - start_row * row_height;
- y2 = top - (end_row + 1) * row_height;
-
-#if 0
- g_print ("Event: %g,%g %g,%g\n row_height: %g start_row: %i top: %g rows: %i\n",
- x1, y1, x2, y2, row_height, start_row, top, pdi->rows);
-#endif
-
- red = green = blue = 0.95;
- e_cal_model_get_rgb_color_for_component (model, event->comp_data, &red, &green, &blue);
- print_border_rgb (pc, x1, x2, y1, y2, 1.0, red, green, blue);
-
- summary = icalcomponent_get_summary (event->comp_data->icalcomp);
- text = summary ? (char*) summary : "";
-
-
- if (display_times) {
- date_tm.tm_year = 2001;
- date_tm.tm_mon = 0;
- date_tm.tm_mday = 1;
- date_tm.tm_hour = event->start_minute / 60;
- date_tm.tm_min = event->start_minute % 60;
- date_tm.tm_sec = 0;
- date_tm.tm_isdst = -1;
-
- e_time_format_time (&date_tm, pdi->use_24_hour_format, FALSE,
- start_buffer, sizeof (start_buffer));
-
- date_tm.tm_hour = event->end_minute / 60;
- date_tm.tm_min = event->end_minute % 60;
-
- e_time_format_time (&date_tm, pdi->use_24_hour_format, FALSE,
- end_buffer, sizeof (end_buffer));
-
- text = g_strdup_printf ("%s - %s %s ", start_buffer,
- end_buffer, text);
-
- free_text = TRUE;
- }
-
- bound_text (pc, font, text, x1 + 2, x2 - 2, y1, y2, 0);
-
- if (free_text)
- g_free (text);
-}
-
-
-static void
-print_day_details (GnomePrintContext *pc, GnomeCalendar *gcal, time_t whence,
- double left, double right, double top, double bottom)
-{
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- EDayViewEvent *event;
- GnomeFont *font;
- time_t start, end;
- struct pdinfo pdi;
- gint rows_in_top_display, i;
- double font_size, max_font_size;
- ECalModel *model = gnome_calendar_get_calendar_model (gcal);
-
- start = time_day_begin_with_zone (whence, zone);
- end = time_day_end_with_zone (start, zone);
-
- pdi.days_shown = 1;
- pdi.day_starts[0] = start;
- pdi.day_starts[1] = end;
- pdi.long_events = g_array_new (FALSE, FALSE, sizeof (EDayViewEvent));
- pdi.events[0] = g_array_new (FALSE, FALSE, sizeof (EDayViewEvent));
- pdi.start_hour = calendar_config_get_day_start_hour ();
- pdi.end_hour = calendar_config_get_day_end_hour ();
- if (calendar_config_get_day_end_minute () != 0)
- pdi.end_hour++;
- pdi.rows = (pdi.end_hour - pdi.start_hour) * 2;
- pdi.mins_per_row = 30;
- pdi.start_minute_offset = pdi.start_hour * 60;
- pdi.end_minute_offset = pdi.end_hour * 60;
- pdi.use_24_hour_format = calendar_config_get_24_hour_format ();
-
- /* Get the events from the server. */
- e_cal_model_generate_instances (model, start, end, print_day_details_cb, &pdi);
- qsort (pdi.long_events->data, pdi.long_events->len,
- sizeof (EDayViewEvent), e_day_view_event_sort_func);
- qsort (pdi.events[0]->data, pdi.events[0]->len,
- sizeof (EDayViewEvent), e_day_view_event_sort_func);
-
- /* Also print events outside of work hours */
- if (pdi.events[0]->len > 0) {
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- struct icaltimetype tt;
-
- event = &g_array_index (pdi.events[0], EDayViewEvent, 0);
- tt = icaltime_from_timet_with_zone (event->start, FALSE, zone);
- if (tt.hour < pdi.start_hour)
- pdi.start_hour = tt.hour;
- pdi.start_minute_offset = pdi.start_hour * 60;
-
- event = &g_array_index (pdi.events[0], EDayViewEvent, pdi.events[0]->len - 1);
- tt = icaltime_from_timet_with_zone (event->end, FALSE, zone);
- if (tt.hour > pdi.end_hour || tt.hour == 0) {
- pdi.end_hour = tt.hour ? tt.hour : 24;
- if (tt.minute > 0)
- pdi.end_hour++;
- }
- pdi.end_minute_offset = pdi.end_hour * 60;
-
- pdi.rows = (pdi.end_hour - pdi.start_hour) * 2;
- }
-
- /* Lay them out the long events, across the top of the page. */
- e_day_view_layout_long_events (pdi.long_events, pdi.days_shown,
- pdi.day_starts, &rows_in_top_display);
-
- /* Print the long events. */
- font = get_font_for_size (12, GNOME_FONT_BOOK, FALSE);
- for (i = 0; i < pdi.long_events->len; i++) {
- event = &g_array_index (pdi.long_events, EDayViewEvent, i);
- print_day_long_event (pc, font, left, right, top, bottom,
- DAY_VIEW_ROW_HEIGHT, event, &pdi, model);
- }
- g_object_unref (font);
-
- /* We always leave space for DAY_VIEW_MIN_ROWS_IN_TOP_DISPLAY in the
- top display, but we may have more rows than that, in which case
- the main display area will be compressed. */
- rows_in_top_display = MAX (rows_in_top_display,
- DAY_VIEW_MIN_ROWS_IN_TOP_DISPLAY);
-
- /* Draw the border around the long events. */
- gnome_print_setrgbcolor (pc, 0, 0, 0);
- print_border (pc, left, right,
- top, top - rows_in_top_display * DAY_VIEW_ROW_HEIGHT - 4,
- 1.0, -1.0);
-
- /* Adjust the area containing the main display. */
- top -= rows_in_top_display * DAY_VIEW_ROW_HEIGHT + 4;
-
- /* Draw the borders, lines, and times down the left. */
- print_day_background (pc, gcal, whence, &pdi,
- left, right, top, bottom);
-
- /* Now adjust to get rid of the time column. */
- left += DAY_VIEW_TIME_COLUMN_WIDTH;
-
- /* Lay out the short events, within the day. */
- e_day_view_layout_day_events (pdi.events[0], DAY_VIEW_ROWS,
- DAY_VIEW_MINS_PER_ROW, pdi.cols_per_row);
-
- /* Print the short events. */
- max_font_size = ((top - bottom) / pdi.rows) - 4;
- font_size = MIN (DAY_NORMAL_FONT_SIZE, max_font_size);
- font = get_font_for_size (font_size, GNOME_FONT_BOOK, FALSE);
- for (i = 0; i < pdi.events[0]->len; i++) {
- event = &g_array_index (pdi.events[0], EDayViewEvent, i);
- print_day_event (pc, font, left, right, top, bottom,
- event, &pdi, model);
- }
- g_object_unref (font);
-
- /* Free everything. */
- free_event_array (pdi.long_events);
- g_array_free (pdi.long_events, TRUE);
- free_event_array (pdi.events[0]);
- g_array_free (pdi.events[0], TRUE);
-}
-
-/* Returns TRUE if the event is a one-day event (i.e. not a long event). */
-static gboolean
-print_is_one_day_week_event (EWeekViewEvent *event,
- EWeekViewEventSpan *span,
- time_t *day_starts)
-{
- if (event->start == day_starts[span->start_day]
- && event->end == day_starts[span->start_day + 1])
- return FALSE;
-
- if (span->num_days == 1
- && event->start >= day_starts[span->start_day]
- && event->end <= day_starts[span->start_day + 1])
- return TRUE;
-
- return FALSE;
-}
-
-
-static void
-print_week_long_event (GnomePrintContext *pc, GnomeFont *font,
- struct psinfo *psi,
- double x1, double x2, double y1, double y2,
- EWeekViewEvent *event, EWeekViewEventSpan *span,
- char *text, double red, double green, double blue)
-{
- double left_triangle_width = -1.0, right_triangle_width = -1.0;
- struct tm date_tm;
- char buffer[32];
-
- /* If the event starts before the first day of the span, draw a
- triangle to indicate it continues. */
- if (event->start < psi->day_starts[span->start_day])
- left_triangle_width = 4;
-
- /* If the event ends after the last day of the span, draw a
- triangle. */
- if (event->end > psi->day_starts[span->start_day + span->num_days])
- right_triangle_width = 4;
-
- print_border_with_triangles (pc, x1, x2, y1, y2, 0.5, red, green, blue,
- left_triangle_width,
- right_triangle_width);
-
- /* If the event starts after the first day being printed, we need to
- print the start time. */
- if (event->start > psi->day_starts[span->start_day]) {
- date_tm.tm_year = 2001;
- date_tm.tm_mon = 0;
- date_tm.tm_mday = 1;
- date_tm.tm_hour = event->start_minute / 60;
- date_tm.tm_min = event->start_minute % 60;
- date_tm.tm_sec = 0;
- date_tm.tm_isdst = -1;
-
- e_time_format_time (&date_tm, psi->use_24_hour_format, FALSE,
- buffer, sizeof (buffer));
-
- x1 += 4;
- print_text_size (pc, buffer, ALIGN_LEFT, x1, x2, y1, y2);
- x1 += gnome_font_get_width_utf8 (font, buffer);
- }
-
- /* If the event ends before the end of the last day being printed,
- we need to print the end time. */
- if (event->end < psi->day_starts[span->start_day + span->num_days]) {
- date_tm.tm_year = 2001;
- date_tm.tm_mon = 0;
- date_tm.tm_mday = 1;
- date_tm.tm_hour = event->end_minute / 60;
- date_tm.tm_min = event->end_minute % 60;
- date_tm.tm_sec = 0;
- date_tm.tm_isdst = -1;
-
- e_time_format_time (&date_tm, psi->use_24_hour_format, FALSE,
- buffer, sizeof (buffer));
-
- x2 -= 4;
- print_text_size (pc, buffer, ALIGN_RIGHT, x1, x2, y1, y2);
- x2 -= gnome_font_get_width_utf8 (font, buffer);
- }
-
- x1 += 4;
- x2 -= 4;
- print_text_size (pc, text, ALIGN_CENTER, x1, x2, y1, y2);
-}
-
-
-static void
-print_week_day_event (GnomePrintContext *pc, GnomeFont *font,
- struct psinfo *psi,
- double x1, double x2, double y1, double y2,
- EWeekViewEvent *event, EWeekViewEventSpan *span,
- char *text, double red, double green, double blue)
-{
- struct tm date_tm;
- char buffer[32];
-
- date_tm.tm_year = 2001;
- date_tm.tm_mon = 0;
- date_tm.tm_mday = 1;
- date_tm.tm_hour = event->start_minute / 60;
- date_tm.tm_min = event->start_minute % 60;
- date_tm.tm_sec = 0;
- date_tm.tm_isdst = -1;
-
- e_time_format_time (&date_tm, psi->use_24_hour_format, FALSE,
- buffer, sizeof (buffer));
-
- print_rectangle (pc, x1, x2, y1, y2, red, green, blue);
- print_text_size (pc, buffer, ALIGN_LEFT, x1, x2, y1, y2);
- x1 += gnome_font_get_width_utf8 (font, buffer) + 4;
- print_text_size (pc, text, ALIGN_LEFT, x1, x2, y1, y2);
-}
-
-
-static void
-print_week_event (GnomePrintContext *pc, GnomeFont *font,
- struct psinfo *psi,
- double left, double top,
- double cell_width, double cell_height,
- ECalModel *model,
- EWeekViewEvent *event, GArray *spans)
-{
- EWeekViewEventSpan *span;
- gint span_num;
- const gchar *summary;
- char *text;
- int num_days, start_x, start_y, start_h, end_x, end_y, end_h;
- double x1, x2, y1, y2;
- double red, green, blue;
-
- summary = icalcomponent_get_summary (event->comp_data->icalcomp);
- text = summary ? (char*) summary : "";
-
- for (span_num = 0; span_num < event->num_spans; span_num++) {
- span = &g_array_index (spans, EWeekViewEventSpan,
- event->spans_index + span_num);
-
- if (e_week_view_layout_get_span_position
- (event, span,
- psi->rows_per_cell,
- psi->rows_per_compressed_cell,
- psi->display_start_weekday,
- psi->multi_week_view,
- psi->compress_weekend,
- &num_days)) {
-
- e_week_view_layout_get_day_position
- (span->start_day,
- psi->multi_week_view,
- psi->weeks_shown,
- psi->display_start_weekday,
- psi->compress_weekend,
- &start_x, &start_y, &start_h);
-
- if (num_days == 1) {
- end_x = start_x;
- end_y = start_y;
- end_h = start_h;
- } else {
- e_week_view_layout_get_day_position
- (span->start_day + num_days - 1,
- psi->multi_week_view,
- psi->weeks_shown,
- psi->display_start_weekday,
- psi->compress_weekend,
- &end_x, &end_y, &end_h);
- }
-
- x1 = left + start_x * cell_width + 6;
- x2 = left + (end_x + 1) * cell_width - 6;
- y1 = top - start_y * cell_height
- - psi->header_row_height
- - span->row * psi->row_height;
- y2 = y1 - psi->row_height * 0.9;
-
- red = .9;
- green = .9;
- blue = .9;
- e_cal_model_get_rgb_color_for_component (model, event->comp_data, &red, &green, &blue);
- if (print_is_one_day_week_event (event, span,
- psi->day_starts)) {
- print_week_day_event (pc, font, psi,
- x1, x2, y1, y2,
- event, span, text, red, green, blue);
- } else {
- print_week_long_event (pc, font, psi,
- x1, x2, y1, y2,
- event, span, text, red, green, blue);
- }
- }
- }
-}
-
-
-static void
-print_week_view_background (GnomePrintContext *pc, GnomeFont *font,
- struct psinfo *psi,
- double left, double top,
- double cell_width, double cell_height)
-{
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- int day, day_x, day_y, day_h;
- double x1, x2, y1, y2, font_size, fillcolor;
- struct tm tm;
- char *format_string, buffer[128];
-
- font_size = gnome_font_get_size (font);
-
- for (day = 0; day < psi->days_shown; day++) {
- e_week_view_layout_get_day_position
- (day, psi->multi_week_view, psi->weeks_shown,
- psi->display_start_weekday, psi->compress_weekend,
- &day_x, &day_y, &day_h);
-
- x1 = left + day_x * cell_width;
- x2 = left + (day_x + 1) * cell_width;
- y1 = top - day_y * cell_height;
- y2 = y1 - day_h * cell_height;
-
- tm = *convert_timet_to_struct_tm (psi->day_starts[day], zone);
-
- /* In the month view we draw a grey background for the end
- of the previous month and the start of the following. */
- fillcolor = -1.0;
- if (psi->multi_week_view && (tm.tm_mon != psi->month))
- fillcolor = 0.9;
-
- print_border (pc, x1, x2, y1, y2, 1.0, fillcolor);
-
- if (psi->multi_week_view) {
- if (tm.tm_mday == 1)
- format_string = _("%d %B");
- else
- format_string = "%d";
- } else {
- gnome_print_moveto (pc, x1 + 0.1 * cell_width,
- y1 - psi->header_row_height + 3);
- gnome_print_lineto (pc, x2,
- y1 - psi->header_row_height + 3);
- gnome_print_setrgbcolor (pc, 0, 0, 0);
- gnome_print_setlinewidth (pc, 0.5);
- gnome_print_stroke (pc);
-
- /* strftime format %A = full weekday name, %d = day of
- month, %B = full month name. You can change the
- order but don't change the specifiers or add
- anything. */
- format_string = _("%A %d %B");
-
- }
-
- e_utf8_strftime (buffer, sizeof (buffer), format_string, &tm);
- print_text_size (pc, buffer, ALIGN_RIGHT,
- x1, x2 - 4, y1 - 2, y1 - 2 - font_size);
- }
-}
-
-/* This adds one event to the view, adding it to the appropriate array. */
-static gboolean
-print_week_summary_cb (ECalComponent *comp,
- time_t start,
- time_t end,
- gpointer data)
-
-{
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- EWeekViewEvent event;
- struct icaltimetype start_tt, end_tt;
- ECalModelGenerateInstancesData *mdata = (ECalModelGenerateInstancesData *) data;
- struct psinfo *psi = (struct psinfo *) mdata->cb_data;
-
- /* Check that the event times are valid. */
-
-#if 0
- g_print ("View start:%li end:%li Event start:%li end:%li\n",
- psi->day_starts[0], psi->day_starts[psi->days_shown],
- start, end);
-#endif
-
- g_return_val_if_fail (start <= end, TRUE);
- g_return_val_if_fail (start < psi->day_starts[psi->days_shown], TRUE);
- g_return_val_if_fail (end > psi->day_starts[0], TRUE);
-
- start_tt = icaltime_from_timet_with_zone (start, FALSE, zone);
- end_tt = icaltime_from_timet_with_zone (end, FALSE, zone);
-
- event.comp_data = e_cal_model_copy_component_data (mdata->comp_data);
-
- event.start = start;
- event.end = end;
- event.spans_index = 0;
- event.num_spans = 0;
-
- event.start_minute = start_tt.hour * 60 + start_tt.minute;
- event.end_minute = end_tt.hour * 60 + end_tt.minute;
- if (event.end_minute == 0 && start != end)
- event.end_minute = 24 * 60;
-
- g_array_append_val (psi->events, event);
-
- return TRUE;
-}
-
-static void
-print_week_summary (GnomePrintContext *pc, GnomeCalendar *gcal,
- time_t whence, gboolean multi_week_view, int weeks_shown,
- int month, double font_size,
- double left, double right, double top, double bottom)
-{
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- EWeekViewEvent *event;
- struct psinfo psi;
- time_t day_start;
- gint rows_per_day[E_WEEK_VIEW_MAX_WEEKS * 7], day, event_num;
- GArray *spans;
- GnomeFont *font;
- double cell_width, cell_height;
- ECalModel *model = gnome_calendar_get_calendar_model (gcal);
-
- psi.days_shown = weeks_shown * 7;
- psi.events = g_array_new (FALSE, FALSE, sizeof (EWeekViewEvent));
- psi.multi_week_view = multi_week_view;
- psi.weeks_shown = weeks_shown;
- psi.month = month;
-
- /* Get a few config settings. */
- if (multi_week_view)
- psi.compress_weekend = calendar_config_get_compress_weekend ();
- else
- psi.compress_weekend = TRUE;
- psi.use_24_hour_format = calendar_config_get_24_hour_format ();
-
- /* We convert this from (0 = Sun, 6 = Sat) to (0 = Mon, 6 = Sun). */
- psi.display_start_weekday = calendar_config_get_week_start_day ();
- psi.display_start_weekday = (psi.display_start_weekday + 6) % 7;
-
- /* If weekends are compressed then we can't start on a Sunday. */
- if (psi.compress_weekend && psi.display_start_weekday == 6)
- psi.display_start_weekday = 5;
-
- day_start = time_day_begin_with_zone (whence, zone);
- for (day = 0; day <= psi.days_shown; day++) {
- psi.day_starts[day] = day_start;
- day_start = time_add_day_with_zone (day_start, 1, zone);
- }
-
- /* Get the events from the server. */
- e_cal_model_generate_instances (model,
- psi.day_starts[0], psi.day_starts[psi.days_shown],
- print_week_summary_cb, &psi);
- qsort (psi.events->data, psi.events->len,
- sizeof (EWeekViewEvent), e_week_view_event_sort_func);
-
- /* Layout the events. */
- spans = e_week_view_layout_events (psi.events, NULL,
- psi.multi_week_view,
- psi.weeks_shown,
- psi.compress_weekend,
- psi.display_start_weekday,
- psi.day_starts, rows_per_day);
-
- /* Calculate the size of the cells. */
- if (multi_week_view) {
- cell_width = (right - left) / (psi.compress_weekend ? 6 : 7);
- cell_height = (top - bottom) / (weeks_shown * 2);
- } else {
- cell_width = (right - left) / 2;
- cell_height = (top - bottom) / 6;
- }
-
- /* Calculate the row height, using the normal font and with room for
- space or a rectangle around it. */
- psi.row_height = font_size * 1.2;
- psi.header_row_height = font_size * 1.5;
-
- /* Calculate how many rows we can fit into each type of cell. */
- psi.rows_per_cell = ((cell_height * 2) - psi.header_row_height)
- / psi.row_height;
- psi.rows_per_compressed_cell = (cell_height - psi.header_row_height)
- / psi.row_height;
-
- font = get_font_for_size (font_size, GNOME_FONT_BOOK, FALSE);
-
- /* Draw the grid and the day names/numbers. */
- print_week_view_background (pc, font, &psi, left, top,
- cell_width, cell_height);
-
- /* Print the events. */
- for (event_num = 0; event_num < psi.events->len; event_num++) {
- event = &g_array_index (psi.events, EWeekViewEvent, event_num);
- print_week_event (pc, font, &psi, left, top,
- cell_width, cell_height, model, event, spans);
- }
-
- g_object_unref (font);
-
- /* Free everything. */
- for (event_num = 0; event_num < psi.events->len; event_num++) {
- event = &g_array_index (psi.events, EWeekViewEvent, event_num);
- }
- g_array_free (psi.events, TRUE);
- g_array_free (spans, TRUE);
-}
-
-
-static void
-print_year_summary (GnomePrintContext *pc, GnomeCalendar *gcal, time_t whence,
- double left, double right, double top, double bottom,
- int morerows)
-{
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- double row_height, col_width, l, r, t, b;
- time_t now;
- int col, row, rows, cols;
-
- l = left;
- t = top;
-
- /* If morerows is set we do 4 rows and 3 columns instead of 3 rows and
- 4 columns. This is useful if we switch paper orientation. */
- if (morerows) {
- rows = 4;
- cols = 3;
- } else {
- rows = 3;
- cols = 4;
- }
-
- row_height = (top - bottom) / rows;
- col_width = (right - left) / cols;
- r = l + col_width;
- b = top - row_height;
- now = time_year_begin_with_zone (whence, zone);
-
- for (row = 0; row < rows; row++) {
- t = top - row_height * row;
- b = t - row_height;
- for (col = 0; col < cols; col++) {
- l = left + col_width * col;
- r = l + col_width;
- print_month_small (pc, gcal, now,
- l + 8, r - 8, t - 8, b + 8,
- DATE_MONTH, 0, 0, TRUE);
- now = time_add_month_with_zone (now, 1, zone);
- }
- }
-}
-
-static void
-print_month_summary (GnomePrintContext *pc, GnomeCalendar *gcal, time_t whence,
- double left, double right, double top, double bottom)
-{
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- time_t date;
- struct tm tm;
- struct icaltimetype tt;
- char buffer[100];
- GnomeFont *font;
- gboolean compress_weekend;
- int columns, col, weekday, len, month;
- double font_size, cell_width, x1, x2, y1, y2;
-
- weekday = calendar_config_get_week_start_day ();
- compress_weekend = calendar_config_get_compress_weekend ();
-
- /* Remember which month we want. */
- tt = icaltime_from_timet_with_zone (whence, FALSE, zone);
- month = tt.month - 1;
-
- /* Find the start of the month, and then the start of the week on
- or before that day. */
- date = time_month_begin_with_zone (whence, zone);
- date = time_week_begin_with_zone (date, weekday, zone);
-
- /* If weekends are compressed then we can't start on a Sunday. */
- if (compress_weekend && weekday == 0)
- date = time_add_day_with_zone (date, -1, zone);
-
- /* do day names ... */
-
- /* We are only interested in outputting the weekday here, but we want
- to be able to step through the week without worrying about
- overflows making strftime choke, so we move near to the start of
- the month. */
- tm = *convert_timet_to_struct_tm (date, zone);
- tm.tm_mday = (tm.tm_mday % 7) + 7;
-
- font = get_font_for_size (MONTH_NORMAL_FONT_SIZE, GNOME_FONT_BOLD, FALSE);
- font_size = gnome_font_get_size (font);
- gnome_print_setfont (pc, font);
-
- columns = compress_weekend ? 6 : 7;
- cell_width = (right - left) / columns;
- y1 = top;
- y2 = top - font_size * 1.5;
-
- for (col = 0; col < columns; col++) {
- if (tm.tm_wday == 6 && compress_weekend) {
- e_utf8_strftime (buffer, sizeof (buffer), "%a/", &tm);
- len = strlen (buffer);
- tm.tm_mday++;
- tm.tm_wday = (tm.tm_wday + 1) % 7;
- e_utf8_strftime (buffer + len, sizeof (buffer) - len,
- "%a", &tm);
- } else {
- e_utf8_strftime (buffer, sizeof (buffer), "%A", &tm);
- }
-
- x1 = left + cell_width * col;
- x2 = x1 + cell_width;
-
- print_border (pc, x1, x2, y1, y2, 1.0, -1.0);
- print_text_size (pc, buffer, ALIGN_CENTER, x1, x2, y1, y2);
-
- tm.tm_mday++;
- tm.tm_wday = (tm.tm_wday + 1) % 7;
- }
- g_object_unref (font);
-
- top = y2;
- print_week_summary (pc, gcal, date, TRUE, 6, month,
- MONTH_NORMAL_FONT_SIZE,
- left, right, top, bottom);
-}
-
-
-static void
-print_todo_details (GnomePrintContext *pc, GnomeCalendar *gcal,
- time_t start, time_t end,
- double left, double right, double top, double bottom)
-{
- ECal *client;
- GnomeFont *font_summary;
- double y, yend, x, xend;
- struct icaltimetype *tt;
- ECalendarTable *task_pad;
- ETable *table;
- ECalModel *model;
- gint rows, row;
-
- /* We get the tasks directly from the TaskPad ETable. This means we
- get them filtered & sorted for free. */
- task_pad = gnome_calendar_get_task_pad (gcal);
- table = e_calendar_table_get_table (task_pad);
- model = e_calendar_table_get_model (task_pad);
- client = e_cal_model_get_default_client (model);
-
- font_summary = get_font_for_size (10, GNOME_FONT_BOOK, FALSE);
-
- gnome_print_setrgbcolor (pc, 0, 0, 0);
- gnome_print_setlinewidth (pc, 0.0);
-
- titled_box (pc, _("Tasks"), font_summary, ALIGN_CENTER | ALIGN_BORDER,
- &left, &right, &top, &bottom, 1.0);
-
- y = top - 3;
- yend = bottom - 2;
-
- rows = e_table_model_row_count (E_TABLE_MODEL (model));
- for (row = 0; row < rows; row++) {
- ECalModelComponent *comp_data;
- ECalComponent *comp;
- ECalComponentText summary;
- int model_row;
-
- model_row = e_table_view_to_model_row (table, row);
- comp_data = e_cal_model_get_component_at (model, model_row);
- if (!comp_data)
- continue;
-
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp));
-
- e_cal_component_get_summary (comp, &summary);
- if (!summary.value) {
- g_object_unref (comp);
- continue;
- }
-
- x = left;
- xend = right - 2;
-
- if (y < bottom)
- break;
-
- /* Print the box to put the tick in. */
- print_border (pc, x + 2, x + 8, y - 3, y - 11, 0.1, -1.0);
-
- /* If the task is complete, print a tick in the box. */
- e_cal_component_get_completed (comp, &tt);
- if (tt) {
- e_cal_component_free_icaltimetype (tt);
-
- gnome_print_setrgbcolor (pc, 0, 0, 0);
- gnome_print_setlinewidth (pc, 1.0);
- gnome_print_moveto (pc, x + 3, y - 8);
- gnome_print_lineto (pc, x + 5, y - 10);
- gnome_print_lineto (pc, x + 7, y - 3.5);
- gnome_print_stroke (pc);
- }
-
- y = bound_text (pc, font_summary, summary.value,
- x + 10, xend, y, yend, 0);
- y += gnome_font_get_size (font_summary) - 6;
- gnome_print_moveto (pc, x, y);
- gnome_print_lineto (pc, xend, y);
- gnome_print_stroke (pc);
- y -= 3;
-
- g_object_unref (comp);
- }
-
- g_object_unref (font_summary);
-}
-
-
-/* Value for the PrintView enum */
-static const int print_view_map[] = {
- PRINT_VIEW_DAY,
- PRINT_VIEW_WEEK,
- PRINT_VIEW_MONTH,
- PRINT_VIEW_YEAR,
- -1
-};
-
-/* Creates the range selector widget for printing a calendar */
-static GtkWidget *
-range_selector_new (GtkWidget *dialog, time_t at, int *view)
-{
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- GtkWidget *box;
- GtkWidget *radio;
- GSList *group;
- char text[1024];
- char str1[512];
- char str2[512];
- struct tm tm;
- time_t week_begin, week_end;
- struct tm week_begin_tm, week_end_tm;
- gint week_start_day;
-
- box = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
-
- tm = *convert_timet_to_struct_tm (at, zone);
-
- /* Day */
-
- e_utf8_strftime (text, sizeof (text), _("Selected day (%a %b %d %Y)"), &tm);
- radio = gtk_radio_button_new_with_label (NULL, text);
- group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
- gtk_box_pack_start (GTK_BOX (box), radio, FALSE, FALSE, 0);
-
- /* Week */
-
- week_start_day = calendar_config_get_week_start_day ();
- week_begin = time_week_begin_with_zone (at, week_start_day, zone);
- /* If the week starts on a Sunday, we have to show the Saturday first,
- since the weekend is compressed. If the original date passed in was
- a Saturday, we need to move on to the next Saturday, else we move
- back to the last one. */
- if (week_start_day == 0) {
- if (tm.tm_wday == 6)
- week_begin = time_add_day_with_zone (week_begin, 6, zone);
- else
- week_begin = time_add_day_with_zone (week_begin, -1, zone);
- }
- week_end = time_add_day_with_zone (week_begin, 6, zone);
-
- week_begin_tm = *convert_timet_to_struct_tm (week_begin, zone);
- week_end_tm = *convert_timet_to_struct_tm (week_end, zone);
-
- if (week_begin_tm.tm_mon == week_end_tm.tm_mon) {
- e_utf8_strftime (str1, sizeof (str1), _("%a %b %d"), &week_begin_tm);
- e_utf8_strftime (str2, sizeof (str2), _("%a %d %Y"), &week_end_tm);
- } else {
- if (week_begin_tm.tm_year == week_end_tm.tm_year) {
- e_utf8_strftime (str1, sizeof (str1), _("%a %b %d"), &week_begin_tm);
- e_utf8_strftime (str2, sizeof (str2), _("%a %b %d %Y"), &week_end_tm);
- } else {
- e_utf8_strftime (str1, sizeof (str1), _("%a %b %d %Y"), &week_begin_tm);
- e_utf8_strftime (str2, sizeof (str2), _("%a %b %d %Y"), &week_end_tm);
- }
- }
-
- g_snprintf (text, sizeof (text), _("Selected week (%s - %s)"), str1, str2);
-
- radio = gtk_radio_button_new_with_label (group, text);
- group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
- gtk_box_pack_start (GTK_BOX (box), radio, FALSE, FALSE, 0);
-
- /* Month */
-
- e_utf8_strftime (text, sizeof (text), _("Selected month (%b %Y)"), &tm);
- radio = gtk_radio_button_new_with_label (group, text);
- group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
- gtk_box_pack_start (GTK_BOX (box), radio, FALSE, FALSE, 0);
-
- /* Year */
-
- e_utf8_strftime (text, sizeof (text), _("Selected year (%Y)"), &tm);
- radio = gtk_radio_button_new_with_label (group, text);
- group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
- gtk_box_pack_start (GTK_BOX (box), radio, FALSE, FALSE, 0);
-
- /* Select default */
-
- e_dialog_widget_hook_value (dialog, radio, view, (gpointer) print_view_map);
-
- gtk_widget_show_all (box);
- return box;
-}
-
-
-static void
-print_day_view (GnomePrintContext *pc, GnomeCalendar *gcal, time_t date,
- double left, double right, double top, double bottom)
-{
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- int i, days = 1;
- double todo, header, l;
- char buf[100];
-
- for (i = 0; i < days; i++) {
- todo = (right - left) * 0.75 + left;
- header = top - HEADER_HEIGHT;
-
- gnome_print_beginpage (pc, NULL);
-
- /* Print the main view with all the events in. */
- print_day_details (pc, gcal, date,
- left, todo - 2.0, header, bottom);
-
- /* Print the TaskPad down the right. */
- print_todo_details (pc, gcal, 0, INT_MAX,
- todo, right, header, bottom);
-
- /* Print the filled border around the header. */
- print_border (pc, left, right, top, header + 2.0, 1.0, 0.9);
-
- /* Print the 2 mini calendar-months. */
- l = right - SMALL_MONTH_PAD - SMALL_MONTH_WIDTH * 2
- - SMALL_MONTH_SPACING;
- print_month_small (pc, gcal, date,
- l, l + SMALL_MONTH_WIDTH,
- top - 4, header + 4,
- DATE_MONTH | DATE_YEAR, date, date, FALSE);
-
- l += SMALL_MONTH_SPACING + SMALL_MONTH_WIDTH;
- print_month_small (pc, gcal,
- time_add_month_with_zone (date, 1, zone),
- l, l + SMALL_MONTH_WIDTH,
- top - 4, header + 4,
- DATE_MONTH | DATE_YEAR, 0, 0, FALSE);
-
- /* Print the date, e.g. '8th May, 2001'. */
- format_date (date, DATE_DAY | DATE_MONTH | DATE_YEAR,
- buf, 100);
- print_text_size_bold (pc, buf, ALIGN_LEFT,
- left + 4, todo, top - 4, top - 4 - 24);
-
- /* Print the day, e.g. 'Tuesday'. */
- format_date (date, DATE_DAYNAME, buf, 100);
- print_text_size_bold (pc, buf, ALIGN_LEFT,
- left + 4, todo, top - 32, top - 32 - 18);
-
- gnome_print_showpage (pc);
- date = time_add_day_with_zone (date, 1, zone);
- }
-}
-
-
-static void
-print_week_view (GnomePrintContext *pc, GnomeCalendar *gcal, time_t date,
- double left, double right, double top, double bottom)
-{
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- double header, l;
- char buf[100];
- time_t when;
- gint week_start_day;
- struct tm tm;
-
- header = top - HEADER_HEIGHT;
-
- gnome_print_beginpage (pc, NULL);
-
- tm = *convert_timet_to_struct_tm (date, zone);
- week_start_day = calendar_config_get_week_start_day ();
- when = time_week_begin_with_zone (date, week_start_day, zone);
- /* If the week starts on a Sunday, we have to show the Saturday first,
- since the weekend is compressed. */
- if (week_start_day == 0) {
- if (tm.tm_wday == 6)
- when = time_add_day_with_zone (when, 6, zone);
- else
- when = time_add_day_with_zone (when, -1, zone);
- }
-
- /* Print the main week view. */
- print_week_summary (pc, gcal, when, FALSE, 1, 0,
- WEEK_NORMAL_FONT_SIZE,
- left, right, header, bottom);
-
- /* Print the border around the main view. */
- print_border (pc, left, right, header, bottom, 1.0, -1.0);
-
- /* Print the border around the header area. */
- print_border (pc, left, right, top, header + 2.0, 1.0, 0.9);
-
- /* Print the 2 mini calendar-months. */
- l = right - SMALL_MONTH_PAD - SMALL_MONTH_WIDTH * 2
- - SMALL_MONTH_SPACING;
- print_month_small (pc, gcal, when,
- l, l + SMALL_MONTH_WIDTH,
- top - 4, header + 4,
- DATE_MONTH | DATE_YEAR, when,
- time_add_week_with_zone (when, 1, zone), FALSE);
-
- l += SMALL_MONTH_SPACING + SMALL_MONTH_WIDTH;
- print_month_small (pc, gcal,
- time_add_month_with_zone (when, 1, zone),
- l, l + SMALL_MONTH_WIDTH,
- top - 4, header + 4,
- DATE_MONTH | DATE_YEAR, when,
- time_add_week_with_zone (when, 1, zone), FALSE);
-
- /* Print the start day of the week, e.g. '7th May 2001'. */
- format_date (when, DATE_DAY | DATE_MONTH | DATE_YEAR, buf, 100);
- print_text_size_bold (pc, buf, ALIGN_LEFT,
- left + 3, right, top - 4, top - 4 - 24);
-
- /* Print the end day of the week, e.g. '13th May 2001'. */
- when = time_add_day_with_zone (when, 6, zone);
- format_date (when, DATE_DAY | DATE_MONTH | DATE_YEAR, buf, 100);
- print_text_size_bold (pc, buf, ALIGN_LEFT,
- left + 3, right, top - 24 - 3, top - 24 - 3 - 24);
-
- gnome_print_showpage (pc);
-}
-
-
-static void
-print_month_view (GnomePrintContext *pc, GnomeCalendar *gcal, time_t date,
- double left, double right, double top, double bottom)
-{
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- double header;
- char buf[100];
-
- header = top - HEADER_HEIGHT;
-
- gnome_print_beginpage (pc, NULL);
-
- /* Print the main month view. */
- print_month_summary (pc, gcal, date, left, right, header, bottom);
-
- /* Print the border around the header. */
- print_border (pc, left, right, top, header, 1.0, 0.9);
-
- /* Print the 2 mini calendar-months. */
- print_month_small (pc, gcal,
- time_add_month_with_zone (date, 1, zone),
- right - (right - left) / 7 + 2, right - 8,
- top - 4, header,
- DATE_MONTH | DATE_YEAR, 0, 0, FALSE);
- print_month_small (pc, gcal,
- time_add_month_with_zone (date, -1, zone),
- left + 8, left + (right - left) / 7 - 2,
- top - 4, header,
- DATE_MONTH | DATE_YEAR, 0, 0, FALSE);
-
- /* Print the month, e.g. 'May 2001'. */
- format_date (date, DATE_MONTH | DATE_YEAR, buf, 100);
- print_text_size_bold (pc, buf, ALIGN_CENTER,
- left + 3, right - 3, top - 3, top - 3 - 24);
-
- gnome_print_showpage (pc);
-}
-
-
-static void
-print_year_view (GnomePrintContext *pc, GnomeCalendar *gcal, time_t date,
- double left, double right, double top, double bottom)
-{
- char buf[100];
-
- gnome_print_beginpage (pc, NULL);
-
- print_year_summary (pc, gcal, date, left, right, top - 50, bottom,
- TRUE);
-
- /* centered title */
- format_date (date, DATE_YEAR, buf, 100);
- print_text_size_bold (pc, buf, ALIGN_CENTER,
- left+3, right, top-3, top - 27);
-
- gnome_print_showpage (pc);
-}
-
-static void
-write_label_piece (time_t t, char *buffer, int size, char *stext, char *etext)
-{
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- struct tm *tmp_tm;
- int len;
-
- tmp_tm = convert_timet_to_struct_tm (t, zone);
-
- if (stext != NULL)
- strcat (buffer, stext);
-
- len = strlen (buffer);
- e_time_format_date_and_time (tmp_tm,
- calendar_config_get_24_hour_format (),
- FALSE, FALSE,
- &buffer[len], size - len);
- if (etext != NULL)
- strcat (buffer, etext);
-}
-
-static icaltimezone*
-get_zone_from_tzid (ECal *client, const char *tzid)
-{
- icaltimezone *zone;
-
- /* Note that the timezones may not be on the server, so we try to get
- the builtin timezone with the TZID first. */
- zone = icaltimezone_get_builtin_timezone_from_tzid (tzid);
- if (!zone) {
- if (!e_cal_get_timezone (client, tzid, &zone, NULL))
- /* FIXME: Handle error better. */
- g_warning ("Couldn't get timezone from server: %s",
- tzid ? tzid : "");
- }
-
- return zone;
-}
-
-static void
-print_date_label (GnomePrintContext *pc, ECalComponent *comp, ECal *client,
- double left, double right, double top, double bottom)
-{
- icaltimezone *start_zone, *end_zone, *due_zone, *completed_zone;
- ECalComponentDateTime datetime;
- time_t start = 0, end = 0, complete = 0, due = 0;
- static char buffer[1024];
-
- e_cal_component_get_dtstart (comp, &datetime);
- if (datetime.value) {
- start_zone = get_zone_from_tzid (client, datetime.tzid);
- if (!start_zone || datetime.value->is_date)
- start_zone = calendar_config_get_icaltimezone ();
- start = icaltime_as_timet_with_zone (*datetime.value,
- start_zone);
- }
- e_cal_component_free_datetime (&datetime);
-
- e_cal_component_get_dtend (comp, &datetime);
- if (datetime.value) {
- end_zone = get_zone_from_tzid (client, datetime.tzid);
- if (!end_zone || datetime.value->is_date)
- end_zone = calendar_config_get_icaltimezone ();
- end = icaltime_as_timet_with_zone (*datetime.value,
- end_zone);
- }
- e_cal_component_free_datetime (&datetime);
-
- e_cal_component_get_due (comp, &datetime);
- if (datetime.value) {
- due_zone = get_zone_from_tzid (client, datetime.tzid);
- if (!due_zone || datetime.value->is_date)
- due_zone = calendar_config_get_icaltimezone ();
- due = icaltime_as_timet_with_zone (*datetime.value,
- due_zone);
- }
- e_cal_component_free_datetime (&datetime);
-
- e_cal_component_get_completed (comp, &datetime.value);
- if (datetime.value) {
- completed_zone = icaltimezone_get_utc_timezone ();
- complete = icaltime_as_timet_with_zone (*datetime.value,
- completed_zone);
- e_cal_component_free_icaltimetype (datetime.value);
- }
-
- buffer[0] = '\0';
-
- if (start > 0)
- write_label_piece (start, buffer, 1024, NULL, NULL);
-
- if (end > 0 && start > 0)
- write_label_piece (end, buffer, 1024, _(" to "), NULL);
-
- if (complete > 0) {
- if (start > 0)
- write_label_piece (complete, buffer, 1024, _(" (Completed "), ")");
- else
- write_label_piece (complete, buffer, 1024, _("Completed "), NULL);
- }
-
- if (due > 0 && complete == 0) {
- if (start > 0)
- write_label_piece (due, buffer, 1024, _(" (Due "), ")");
- else
- write_label_piece (due, buffer, 1024, _("Due "), NULL);
- }
-
- print_text_size_bold (pc, buffer, ALIGN_LEFT,
- left, right, top, top - 15);
-}
-
-static void
-print_comp_item (GnomePrintContext *pc, ECalComponent *comp, ECal *client,
- double left, double right, double top, double bottom)
-{
- GnomeFont *font;
- ECalComponentVType vtype;
- ECalComponentText text;
- GSList *desc, *l;
- const char *title, *categories;
- char *categories_string;
- GSList *contact_list, *elem;
- gint header_size;
-
- vtype = e_cal_component_get_vtype (comp);
-
- /* We should only be asked to print VEVENTs or VTODOs. */
- if (vtype == E_CAL_COMPONENT_EVENT)
- title = _("Appointment");
- else if (vtype == E_CAL_COMPONENT_TODO)
- title = _("Task");
- else
- return;
-
- gnome_print_beginpage (pc, NULL);
-
- /* Print the title in a box at the top of the page. */
- font = get_font_for_size (18, GNOME_FONT_BOLD, FALSE);
- header_size = 50;
- print_border (pc, left, right, top, top - header_size,
- 1.0, 0.9);
- print_text (pc, font, title, ALIGN_CENTER, left, right,
- top - header_size * 0.1, top - header_size);
- g_object_unref (font);
-
- top -= header_size + 10;
-
- /* Summary */
- font = get_font_for_size (18, GNOME_FONT_BOLD, FALSE);
- e_cal_component_get_summary (comp, &text);
- top = bound_text (pc, font, text.value, left, right,
- top - 3, bottom, 0);
- g_object_unref (font);
-
- /* Date information */
- print_date_label (pc, comp, client, left, right, top-3, top - 15);
- top -= 20;
-
- font = get_font_for_size (12, GNOME_FONT_BOOK, FALSE);
-
- /* For a VTODO we print the Status, Priority, % Complete and URL. */
- if (vtype == E_CAL_COMPONENT_TODO) {
- icalproperty_status status;
- const char *status_string = NULL;
- int *percent;
- int *priority;
- const char *url;
-
- /* Status */
- e_cal_component_get_status (comp, &status);
- if (status != ICAL_STATUS_NONE) {
- switch (status) {
- case ICAL_STATUS_NEEDSACTION:
- status_string = _("Not Started");
- break;
- case ICAL_STATUS_INPROCESS:
- status_string = _("In Progress");
- break;
- case ICAL_STATUS_COMPLETED:
- status_string = _("Completed");
- break;
- case ICAL_STATUS_CANCELLED:
- status_string = _("Cancelled");
- break;
- default:
- break;
- }
-
- if (status_string) {
- char *text = g_strdup_printf (_("Status: %s"),
- status_string);
- top = bound_text (pc, font, text,
- left, right, top, bottom, 0);
- top += gnome_font_get_size (font) - 6;
- g_free (text);
- }
- }
-
- /* Priority */
- e_cal_component_get_priority (comp, &priority);
- if (priority && *priority >= 0) {
- char *priority_string, *text;
-
- priority_string = e_cal_util_priority_to_string (*priority);
- e_cal_component_free_priority (priority);
-
- text = g_strdup_printf (_("Priority: %s"), priority_string);
- top = bound_text (pc, font, text,
- left, right, top, bottom, 0);
- top += gnome_font_get_size (font) - 6;
- g_free (text);
- }
-
- /* Percent Complete */
- e_cal_component_get_percent (comp, &percent);
- if (percent) {
- char *percent_string;
-
- percent_string = g_strdup_printf (_("Percent Complete: %i"), *percent);
- e_cal_component_free_percent (percent);
-
- top = bound_text (pc, font, percent_string,
- left, right, top, bottom, 0);
- top += gnome_font_get_size (font) - 6;
- }
-
-
- /* URL */
- e_cal_component_get_url (comp, &url);
- if (url && url[0]) {
- char *url_string = g_strdup_printf (_("URL: %s"),
- url);
-
- top = bound_text (pc, font, url_string,
- left, right, top, bottom, 0);
- top += gnome_font_get_size (font) - 6;
-
- g_free (url_string);
- }
- }
-
- /* Categories */
- e_cal_component_get_categories (comp, &categories);
- if (categories && categories[0]) {
- categories_string = g_strdup_printf (_("Categories: %s"),
- categories);
- top = bound_text (pc, font, categories_string,
- left, right, top, bottom, 0);
- top += gnome_font_get_size (font) - 6;
- g_free (categories_string);
- }
-
- /* Contacts */
- e_cal_component_get_contact_list (comp, &contact_list);
- if (contact_list) {
- GString *contacts = g_string_new (_("Contacts: "));
- for (elem = contact_list; elem; elem = elem->next) {
- ECalComponentText *t = elem->data;
- /* Put a comma between contacts. */
- if (elem != contact_list)
- g_string_append (contacts, ", ");
- g_string_append (contacts, t->value);
- }
- e_cal_component_free_text_list (contact_list);
-
- top = bound_text (pc, font, contacts->str,
- left, right, top, bottom, 0);
- top += gnome_font_get_size (font) - 6;
-
- g_string_free (contacts, TRUE);
- }
-
- top -= 16;
-
- /* Description */
- e_cal_component_get_description_list (comp, &desc);
- for (l = desc; l != NULL; l = l->next) {
- ECalComponentText *text = l->data;
-
- if (text->value != NULL)
- top = bound_text (pc, font, text->value, left, right, top-3, bottom, 0);
- }
- e_cal_component_free_text_list (desc);
- g_object_unref (font);
-
- gnome_print_showpage (pc);
-}
-
-void
-print_calendar (GnomeCalendar *gcal, gboolean preview, time_t date,
- PrintView default_view)
-{
- GnomePrintConfig *print_config;
- GnomePrintJob *gpm;
- GnomePrintContext *pc;
- double l, r, t, b;
- char *old_orientation;
-
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- print_config = e_print_load_config ();
-
- /* Don't save the orientation if we guessed it to be nice to the user */
- old_orientation = gnome_print_config_get (print_config, GNOME_PRINT_KEY_PAGE_ORIENTATION);
- if (default_view == PRINT_VIEW_MONTH) {
- if (old_orientation && !strcmp (old_orientation, "R90")) {
- g_free (old_orientation);
- old_orientation = NULL;
- }
-
- gnome_print_config_set (print_config, GNOME_PRINT_KEY_PAGE_ORIENTATION, "R90");
- }
-
- if (!preview) {
- GtkWidget *gpd;
- GtkWidget *range;
- int view;
-
- gpd = e_print_get_dialog_with_config (_("Print"), GNOME_PRINT_DIALOG_COPIES | GNOME_PRINT_DIALOG_RANGE, print_config);
-
- view = (int) default_view;
- range = range_selector_new (gpd, date, &view);
- gnome_print_dialog_construct_range_custom (GNOME_PRINT_DIALOG (gpd), range);
-
- gtk_dialog_set_default_response (GTK_DIALOG (gpd),
- GNOME_PRINT_DIALOG_RESPONSE_PRINT);
-
- /* Run dialog */
-
- switch (gtk_dialog_run (GTK_DIALOG (gpd))) {
- case GNOME_PRINT_DIALOG_RESPONSE_PRINT:
- break;
-
- case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW:
- preview = TRUE;
- break;
-
- case -1:
- return;
-
- default:
- gtk_widget_destroy (gpd);
- return;
- }
-
- e_dialog_get_values (gpd);
- default_view = (PrintView) view;
-
- gtk_widget_destroy (gpd);
- }
-
- gpm = gnome_print_job_new (print_config);
-
- pc = gnome_print_job_get_context (gpm);
- gnome_print_config_get_page_size (print_config, &r, &t);
-
- /* See top of source for an explanation of this */
-
- /* gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_TOP, &temp_d);
- * t -= temp_d;
- * gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_RIGHT, &temp_d);
- * r -= temp_d;
- * gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_BOTTOM, &b);
- * gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_LEFT, &l);
- * b = l = TEMP_MARGIN; */
-
- b = t * TEMP_MARGIN;
- l = r * TEMP_MARGIN;
- t *= (1.0 - TEMP_MARGIN);
- r *= (1.0 - TEMP_MARGIN);
-
- /* depending on the view, do a different output */
- switch (default_view) {
- case PRINT_VIEW_DAY:
- print_day_view (pc, gcal, date, l, r, t, b);
- break;
- case PRINT_VIEW_WEEK:
- print_week_view (pc, gcal, date, l, r, t, b);
- break;
- case PRINT_VIEW_MONTH:
- print_month_view (pc, gcal, date, l, r, t, b);
- break;
- case PRINT_VIEW_YEAR:
- print_year_view (pc, gcal, date, l, r, t, b);
- break;
- default:
- g_assert_not_reached ();
- }
-
- gnome_print_job_close (gpm);
-
- if (preview) {
- GtkWidget *gpmp;
-
- gpmp = gnome_print_job_preview_new (gpm, _("Print Preview"));
- gtk_widget_show (gpmp);
- } else {
- gnome_print_job_print (gpm);
- }
-
- /* Don't save the orientation if we guessed it to be nice to the user */
- if (old_orientation) {
- gnome_print_config_set (print_config, GNOME_PRINT_KEY_PAGE_ORIENTATION, old_orientation);
-
- e_print_save_config (print_config);
- g_free (old_orientation);
- }
-
- g_object_unref (print_config);
- g_object_unref (gpm);
-}
-
-
-void
-print_comp (ECalComponent *comp, ECal *client, gboolean preview)
-{
- GnomePrintConfig *print_config;
- GnomePrintJob *gpm;
- GnomePrintContext *pc;
- double l, r, t, b;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (E_IS_CAL_COMPONENT (comp));
-
- print_config = e_print_load_config ();
-
- if (!preview) {
- GtkWidget *gpd;
-
- gpd = e_print_get_dialog_with_config (_("Print Item"), GNOME_PRINT_DIALOG_COPIES, print_config);
-
- gtk_dialog_set_default_response (GTK_DIALOG (gpd),
- GNOME_PRINT_DIALOG_RESPONSE_PRINT);
-
- /* Run dialog */
-
- switch (gtk_dialog_run (GTK_DIALOG (gpd))) {
- case GNOME_PRINT_DIALOG_RESPONSE_PRINT:
- break;
-
- case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW:
- preview = TRUE;
- break;
-
- case -1:
- return;
-
- default:
- gtk_widget_destroy (gpd);
- return;
- }
-
- e_dialog_get_values (gpd);
- gtk_widget_destroy (gpd);
- }
-
- gpm = gnome_print_job_new (print_config);
-
- pc = gnome_print_job_get_context (gpm);
- gnome_print_config_get_page_size (print_config, &r, &t);
-
- /* See top of source for an explanation of this */
-
- /* gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_TOP, &temp_d);
- * t -= temp_d;
- * gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_RIGHT, &temp_d);
- * r -= temp_d;
- * gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_BOTTOM, &b);
- * gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_LEFT, &l);
- * b = l = TEMP_MARGIN; */
-
- b = t * TEMP_MARGIN;
- l = r * TEMP_MARGIN;
- t *= (1.0 - TEMP_MARGIN);
- r *= (1.0 - TEMP_MARGIN);
-
- print_comp_item (pc, comp, client, l, r, t, b);
- gnome_print_job_close (gpm);
-
- if (preview) {
- GtkWidget *gpmp;
-
- gpmp = gnome_print_job_preview_new (gpm, _("Print Preview"));
- gtk_widget_show (gpmp);
- } else {
- gnome_print_job_print (gpm);
- }
-
- g_object_unref (print_config);
- g_object_unref (gpm);
-}
-
-static void
-print_title (GnomePrintContext *pc, const char *title,
- double page_width, double page_height)
-{
- GnomeFont *font;
- double w, x, y;
-
- font = gnome_font_find_closest ("Sans Bold", 18);
-
- w = gnome_font_get_width_utf8 (font, title);
-
- x = (page_width - w) / 2;
- y = page_height - gnome_font_get_ascender (font);
-
- gnome_print_moveto (pc, x, y);
- gnome_print_setfont (pc, font);
- gnome_print_setrgbcolor (pc, 0, 0, 0);
- gnome_print_show (pc, title);
-
- g_object_unref (font);
-}
-
-void
-print_table (ETable *etable, const char *dialog_title, const char *print_header, gboolean preview)
-{
- EPrintable *printable;
- GnomePrintConfig *print_config;
- GnomePrintContext *pc;
- GnomePrintJob *gpm;
- double l, r, t, b, page_width, page_height, left_margin, bottom_margin;
-
- print_config = e_print_load_config ();
-
- printable = e_table_get_printable (etable);
- g_object_ref (printable);
- gtk_object_sink (GTK_OBJECT (printable));
- e_printable_reset (printable);
-
- if (!preview) {
- GtkWidget *gpd;
-
- gpd = e_print_get_dialog_with_config (dialog_title, GNOME_PRINT_DIALOG_COPIES, print_config);
-
- gtk_dialog_set_default_response (GTK_DIALOG (gpd),
- GNOME_PRINT_DIALOG_RESPONSE_PRINT);
-
- /* Run dialog */
-
- switch (gtk_dialog_run (GTK_DIALOG (gpd))) {
- case GNOME_PRINT_DIALOG_RESPONSE_PRINT:
- break;
-
- case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW:
- preview = TRUE;
- break;
-
- case -1:
- return;
-
- default:
- gtk_widget_destroy (gpd);
- return;
- }
-
- e_dialog_get_values (gpd);
-
- gtk_widget_destroy (gpd);
- }
-
- gpm = gnome_print_job_new (print_config);
-
- pc = gnome_print_job_get_context (gpm);
-
- gnome_print_config_get_page_size (print_config, &r, &t);
-
- /* See top of source for an explanation of this */
-
-#if 0
- gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_TOP, &temp_d);
- t -= temp_d;
- gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_RIGHT, &temp_d);
- r -= temp_d;
- gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_BOTTOM, &b);
- gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_LEFT, &l);
-#endif
-
- b = t * TEMP_MARGIN;
- l = r * TEMP_MARGIN;
- t *= (1.0 - TEMP_MARGIN);
- r *= (1.0 - TEMP_MARGIN);
-
- page_width = r - l;
- page_height = t - b;
- left_margin = l;
- bottom_margin = b;
-
- do {
- gnome_print_beginpage (pc, "Tasks");
- gnome_print_gsave (pc);
-
- gnome_print_translate (pc, left_margin, bottom_margin);
-
- print_title (pc, print_header, page_width, page_height);
-
- if (e_printable_data_left (printable))
- e_printable_print_page (printable, pc,
- page_width, page_height - 24, TRUE);
-
- gnome_print_grestore (pc);
- gnome_print_showpage (pc);
- } while (e_printable_data_left (printable));
-
- gnome_print_job_close (gpm);
-
- if (preview) {
- GtkWidget *gpmp;
- gpmp = gnome_print_job_preview_new (gpm, _("Print Preview"));
- gtk_widget_show (gpmp);
- } else {
- gnome_print_job_print (gpm);
- }
-
- g_object_unref (print_config);
- g_object_unref (gpm);
- g_object_unref (printable);
-}
diff --git a/calendar/gui/print.h b/calendar/gui/print.h
deleted file mode 100644
index d706125e6c..0000000000
--- a/calendar/gui/print.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Evolution calendar - Print support
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: Michael Zucchi <notzed@ximian.com>
- * Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef PRINT_H
-#define PRINT_H
-
-#include "gnome-cal.h"
-
-
-
-typedef enum {
- PRINT_VIEW_DAY,
- PRINT_VIEW_WEEK,
- PRINT_VIEW_MONTH,
- PRINT_VIEW_YEAR,
- PRINT_VIEW_LIST
-} PrintView;
-
-void print_calendar (GnomeCalendar *gcal, gboolean preview, time_t at, PrintView default_view);
-void print_comp (ECalComponent *comp, ECal *client, gboolean preview);
-void print_table (ETable *etable, const char *dialog_title, const char *print_header, gboolean preview);
-
-
-
-#endif
diff --git a/calendar/gui/tag-calendar.c b/calendar/gui/tag-calendar.c
deleted file mode 100644
index 0ec8c959e2..0000000000
--- a/calendar/gui/tag-calendar.c
+++ /dev/null
@@ -1,226 +0,0 @@
-/* Evolution calendar - Utilities for tagging ECalendar widgets
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: Damon Chaplin <damon@ximian.com>
- * Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <libecal/e-cal-time-util.h>
-#include "calendar-config.h"
-#include "tag-calendar.h"
-
-
-
-struct calendar_tag_closure {
- ECalendarItem *calitem;
- icaltimezone *zone;
- time_t start_time;
- time_t end_time;
-
- gboolean skip_transparent_events;
-};
-
-/* Clears all the tags in a calendar and fills a closure structure with the
- * necessary information for iterating over occurrences.
- * Returns FALSE if the calendar has no dates shown.
- */
-static gboolean
-prepare_tag (ECalendar *ecal, struct calendar_tag_closure *c, icaltimezone *zone, gboolean clear_first)
-{
- gint start_year, start_month, start_day;
- gint end_year, end_month, end_day;
- struct icaltimetype start_tt = icaltime_null_time ();
- struct icaltimetype end_tt = icaltime_null_time ();
-
- if (clear_first)
- e_calendar_item_clear_marks (ecal->calitem);
-
- if (!e_calendar_item_get_date_range (ecal->calitem,
- &start_year, &start_month,
- &start_day,
- &end_year, &end_month, &end_day))
- return FALSE;
-
- start_tt.year = start_year;
- start_tt.month = start_month + 1;
- start_tt.day = start_day;
-
- end_tt.year = end_year;
- end_tt.month = end_month + 1;
- end_tt.day = end_day;
-
- icaltime_adjust (&end_tt, 1, 0, 0, 0);
-
- c->calitem = ecal->calitem;
-
- if (zone) {
- c->zone = zone;
- } else {
- c->zone = calendar_config_get_icaltimezone ();
- }
-
- c->start_time = icaltime_as_timet_with_zone (start_tt, c->zone);
- c->end_time = icaltime_as_timet_with_zone (end_tt, c->zone);
-
- return TRUE;
-}
-
-/* Marks the specified range in an ECalendar; called from e_cal_generate_instances() */
-static gboolean
-tag_calendar_cb (ECalComponent *comp,
- time_t istart,
- time_t iend,
- gpointer data)
-{
- struct calendar_tag_closure *c = data;
- struct icaltimetype start_tt, end_tt;
- ECalComponentTransparency transparency;
-
- /* If we are skipping TRANSPARENT events, return if the event is
- transparent. */
- if (c->skip_transparent_events) {
- e_cal_component_get_transparency (comp, &transparency);
- if (transparency == E_CAL_COMPONENT_TRANSP_TRANSPARENT)
- return TRUE;
- }
-
- start_tt = icaltime_from_timet_with_zone (istart, FALSE, c->zone);
- end_tt = icaltime_from_timet_with_zone (iend - 1, FALSE, c->zone);
- e_calendar_item_mark_days (c->calitem,
- start_tt.year, start_tt.month - 1,
- start_tt.day,
- end_tt.year, end_tt.month - 1,
- end_tt.day,
- E_CALENDAR_ITEM_MARK_BOLD);
-
- return TRUE;
-}
-
-/**
- * tag_calendar_by_client:
- * @ecal: Calendar widget to tag.
- * @client: A calendar client object.
- *
- * Tags an #ECalendar widget with the events that occur in its current time
- * range. The occurrences are extracted from the specified calendar @client.
- **/
-void
-tag_calendar_by_client (ECalendar *ecal, ECal *client)
-{
- struct calendar_tag_closure c;
-
- g_return_if_fail (ecal != NULL);
- g_return_if_fail (E_IS_CALENDAR (ecal));
- g_return_if_fail (client != NULL);
- g_return_if_fail (E_IS_CAL (client));
-
- /* If the ECalendar isn't visible, we just return. */
- if (!GTK_WIDGET_VISIBLE (ecal))
- return;
-
- if (e_cal_get_load_state (client) != E_CAL_LOAD_LOADED)
- return;
-
- if (!prepare_tag (ecal, &c, NULL, TRUE))
- return;
-
- c.skip_transparent_events = TRUE;
-
-#if 0
- g_print ("DateNavigator generating instances\n");
-#endif
- e_cal_generate_instances (client, c.start_time, c.end_time,
- tag_calendar_cb, &c);
-}
-
-/* Resolves TZIDs for the recurrence generator, for when the comp is not on
- the server. We need to try to use builtin timezones first, as they may not
- be added to the server yet. */
-static icaltimezone*
-resolve_tzid_cb (const char *tzid, gpointer data)
-{
- ECal *client;
- icaltimezone *zone = NULL;
-
- g_return_val_if_fail (data != NULL, NULL);
- g_return_val_if_fail (E_IS_CAL (data), NULL);
-
- client = E_CAL (data);
-
- /* Try to find the builtin timezone first. */
- zone = icaltimezone_get_builtin_timezone_from_tzid (tzid);
-
- if (!zone) {
- /* FIXME: Handle errors. */
- e_cal_get_timezone (client, tzid, &zone, NULL);
- }
-
- return zone;
-}
-
-/**
- * tag_calendar_by_comp:
- * @ecal: Calendar widget to tag.
- * @comp: A calendar component object.
- * @clear_first: Whether the #ECalendar should be cleared of any marks first.
- *
- * Tags an #ECalendar widget with any occurrences of a specific calendar
- * component that occur within the calendar's current time range.
- * Note that TRANSPARENT events are also tagged here.
- *
- * If comp_is_on_server is FALSE, it will try to resolve TZIDs using builtin
- * timezones first, before querying the server, since the timezones may not
- * have been added to the calendar on the server yet.
- **/
-void
-tag_calendar_by_comp (ECalendar *ecal, ECalComponent *comp, ECal *client, icaltimezone *display_zone,
- gboolean clear_first, gboolean comp_is_on_server)
-{
- struct calendar_tag_closure c;
-
- g_return_if_fail (ecal != NULL);
- g_return_if_fail (E_IS_CALENDAR (ecal));
- g_return_if_fail (comp != NULL);
- g_return_if_fail (E_IS_CAL_COMPONENT (comp));
-
- /* If the ECalendar isn't visible, we just return. */
- if (!GTK_WIDGET_VISIBLE (ecal))
- return;
-
- if (!prepare_tag (ecal, &c, display_zone, clear_first))
- return;
-
- c.skip_transparent_events = FALSE;
-
-#if 0
- g_print ("DateNavigator generating instances\n");
-#endif
- if (comp_is_on_server) {
- e_cal_generate_instances_for_object (client, e_cal_component_get_icalcomponent (comp),
- c.start_time, c.end_time,
- tag_calendar_cb, &c);
- } else {
- e_cal_recur_generate_instances (comp, c.start_time, c.end_time,
- tag_calendar_cb, &c,
- resolve_tzid_cb,
- client, c.zone);
- }
-}
diff --git a/calendar/gui/tag-calendar.h b/calendar/gui/tag-calendar.h
deleted file mode 100644
index d31d675543..0000000000
--- a/calendar/gui/tag-calendar.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Evolution calendar - Utilities for tagging ECalendar widgets
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: Damon Chaplin <damon@ximian.com>
- * Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef TAG_CALENDAR_H
-#define TAG_CALENDAR_H
-
-#include <widgets/misc/e-calendar.h>
-#include <libecal/e-cal.h>
-
-void tag_calendar_by_client (ECalendar *ecal, ECal *client);
-void tag_calendar_by_comp (ECalendar *ecal, ECalComponent *comp,
- ECal *client, icaltimezone *display_zone,
- gboolean clear_first, gboolean comp_is_on_server);
-
-#endif
diff --git a/calendar/gui/tasks-component.c b/calendar/gui/tasks-component.c
deleted file mode 100644
index 60ac1cd868..0000000000
--- a/calendar/gui/tasks-component.c
+++ /dev/null
@@ -1,1222 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* tasks-component.c
- *
- * Copyright (C) 2003 Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Rodrigo Moya <rodrigo@ximian.com>
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <errno.h>
-#include <string.h>
-#include <bonobo/bonobo-control.h>
-#include <bonobo/bonobo-i18n.h>
-#include <bonobo/bonobo-exception.h>
-#include <gconf/gconf-client.h>
-#include <libecal/e-cal.h>
-#include <libedataserverui/e-source-selector.h>
-#include <shell/e-user-creatable-items-handler.h>
-#include "e-cal-model.h"
-#include "e-tasks.h"
-#include "tasks-component.h"
-#include "tasks-control.h"
-#include "e-comp-editor-registry.h"
-#include "migration.h"
-#include "comp-util.h"
-#include "calendar-config.h"
-#include "e-cal-popup.h"
-#include "common/authentication.h"
-#include "dialogs/calendar-setup.h"
-#include "dialogs/comp-editor.h"
-#include "dialogs/copy-source-dialog.h"
-#include "dialogs/task-editor.h"
-#include "widgets/misc/e-info-label.h"
-#include "widgets/misc/e-error.h"
-#include "e-util/e-icon-factory.h"
-
-#define CREATE_TASK_ID "task"
-#define CREATE_TASK_ASSIGNED_ID "task-assigned"
-#define CREATE_TASK_LIST_ID "task-list"
-
-enum DndTargetType {
- DND_TARGET_TYPE_CALENDAR_LIST,
-};
-#define CALENDAR_TYPE "text/calendar"
-#define XCALENDAR_TYPE "text/x-calendar"
-static GtkTargetEntry drag_types[] = {
- { CALENDAR_TYPE, 0, DND_TARGET_TYPE_CALENDAR_LIST },
- { XCALENDAR_TYPE, 0, DND_TARGET_TYPE_CALENDAR_LIST }
-};
-static gint num_drag_types = sizeof(drag_types) / sizeof(drag_types[0]);
-
-#define PARENT_TYPE bonobo_object_get_type ()
-
-static BonoboObjectClass *parent_class = NULL;
-
-/* Tasks should have their own registry */
-extern ECompEditorRegistry *comp_editor_registry;
-
-
-typedef struct
-{
- ESourceList *source_list;
-
- GSList *source_selection;
-
- ETasks *tasks;
- ETable *table;
- ETableModel *model;
-
- EInfoLabel *info_label;
- GtkWidget *source_selector;
-
- BonoboControl *view_control;
- BonoboControl *sidebar_control;
- BonoboControl *statusbar_control;
-
- GList *notifications;
-
- EUserCreatableItemsHandler *creatable_items_handler;
-
- EActivityHandler *activity_handler;
-} TasksComponentView;
-
-struct _TasksComponentPrivate {
- char *base_directory;
- char *config_directory;
-
- ESourceList *source_list;
- GSList *source_selection;
-
- GList *views;
-
- ECal *create_ecal;
-
- GList *notifications;
-};
-
-/* Utility functions. */
-/* FIXME Some of these are duplicated from calendar-component.c */
-static gboolean
-is_in_selection (GSList *selection, ESource *source)
-{
- GSList *l;
-
- for (l = selection; l; l = l->next) {
- ESource *selected_source = l->data;
-
- if (!strcmp (e_source_peek_uid (selected_source), e_source_peek_uid (source)))
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-is_in_uids (GSList *uids, ESource *source)
-{
- GSList *l;
-
- for (l = uids; l; l = l->next) {
- const char *uid = l->data;
-
- if (!strcmp (uid, e_source_peek_uid (source)))
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-update_uris_for_selection (TasksComponentView *component_view)
-{
- GSList *selection, *l, *uids_selected = NULL;
-
- selection = e_source_selector_get_selection (E_SOURCE_SELECTOR (component_view->source_selector));
-
- for (l = component_view->source_selection; l; l = l->next) {
- ESource *old_selected_source = l->data;
-
- if (!is_in_selection (selection, old_selected_source))
- e_tasks_remove_todo_source (component_view->tasks, old_selected_source);
- }
-
- for (l = selection; l; l = l->next) {
- ESource *selected_source = l->data;
-
- e_tasks_add_todo_source (component_view->tasks, selected_source);
- uids_selected = g_slist_append (uids_selected, (char *)e_source_peek_uid (selected_source));
- }
-
- e_source_selector_free_selection (component_view->source_selection);
- component_view->source_selection = selection;
-
- /* Save the selection for next time we start up */
- calendar_config_set_tasks_selected (uids_selected);
- g_slist_free (uids_selected);
-}
-
-static void
-update_uri_for_primary_selection (TasksComponentView *component_view)
-{
- ESource *source;
- ECalendarTable *cal_table;
- ETable *etable;
-
- source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (component_view->source_selector));
- if (!source)
- return;
-
- /* Set the default */
- e_tasks_set_default_source (component_view->tasks, source);
-
- cal_table = e_tasks_get_calendar_table (component_view->tasks);
- etable = e_calendar_table_get_table (cal_table);
-
- tasks_control_sensitize_commands (component_view->view_control, component_view->tasks, e_table_selected_count (etable));
-
- /* Save the selection for next time we start up */
- calendar_config_set_primary_tasks (e_source_peek_uid (source));
-}
-
-static void
-update_selection (TasksComponentView *component_view)
-{
- GSList *selection, *uids_selected, *l;
-
- /* Get the selection in gconf */
- uids_selected = calendar_config_get_tasks_selected ();
-
- /* Remove any that aren't there any more */
- selection = e_source_selector_get_selection (E_SOURCE_SELECTOR (component_view->source_selector));
-
- for (l = selection; l; l = l->next) {
- ESource *source = l->data;
-
- if (!is_in_uids (uids_selected, source))
- e_source_selector_unselect_source (E_SOURCE_SELECTOR (component_view->source_selector), source);
- }
-
- e_source_selector_free_selection (selection);
-
- /* Make sure the whole selection is there */
- for (l = uids_selected; l; l = l->next) {
- char *uid = l->data;
- ESource *source;
-
- source = e_source_list_peek_source_by_uid (component_view->source_list, uid);
- if (source)
- e_source_selector_select_source (E_SOURCE_SELECTOR (component_view->source_selector), source);
-
- g_free (uid);
- }
- g_slist_free (uids_selected);
-}
-
-static void
-update_primary_selection (TasksComponentView *component_view)
-{
- ESource *source = NULL;
- char *uid;
-
- uid = calendar_config_get_primary_tasks ();
- if (uid) {
- source = e_source_list_peek_source_by_uid (component_view->source_list, uid);
- g_free (uid);
- }
-
- if (source) {
- e_source_selector_set_primary_selection (E_SOURCE_SELECTOR (component_view->source_selector), source);
- } else {
- /* Try to create a default if there isn't one */
- source = e_source_list_peek_source_any (component_view->source_list);
- if (source)
- e_source_selector_set_primary_selection (E_SOURCE_SELECTOR (component_view->source_selector), source);
- }
-}
-
-/* Callbacks. */
-static void
-copy_task_list_cb (EPopup *ep, EPopupItem *pitem, void *data)
-{
- TasksComponentView *component_view = data;
- ESource *selected_source;
-
- selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (component_view->source_selector));
- if (!selected_source)
- return;
-
- copy_source_dialog (GTK_WINDOW (gtk_widget_get_toplevel(ep->target->widget)), selected_source, E_CAL_SOURCE_TYPE_TODO);
-}
-
-static void
-delete_task_list_cb (EPopup *ep, EPopupItem *pitem, void *data)
-{
- TasksComponentView *component_view = data;
- ESource *selected_source;
- ECal *cal;
- char *uri;
-
- selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (component_view->source_selector));
- if (!selected_source)
- return;
-
- if (e_error_run((GtkWindow *)gtk_widget_get_toplevel(ep->target->widget),
- "calendar:prompt-delete-task-list", e_source_peek_name(selected_source)) != GTK_RESPONSE_YES)
- return;
-
- /* first, ask the backend to remove the task list */
- uri = e_source_get_uri (selected_source);
- cal = e_cal_model_get_client_for_uri (
- e_calendar_table_get_model (E_CALENDAR_TABLE (e_tasks_get_calendar_table (component_view->tasks))),
- uri);
- if (!cal)
- cal = e_cal_new_from_uri (uri, E_CAL_SOURCE_TYPE_TODO);
- g_free (uri);
- if (cal) {
- if (e_cal_remove (cal, NULL)) {
- if (e_source_selector_source_is_selected (E_SOURCE_SELECTOR (component_view->source_selector),
- selected_source)) {
- e_tasks_remove_todo_source (component_view->tasks, selected_source);
- e_source_selector_unselect_source (E_SOURCE_SELECTOR (component_view->source_selector),
- selected_source);
- }
-
- e_source_group_remove_source (e_source_peek_group (selected_source), selected_source);
- e_source_list_sync (component_view->source_list, NULL);
- }
- }
-}
-
-static void
-new_task_list_cb (EPopup *ep, EPopupItem *pitem, void *data)
-{
- calendar_setup_new_task_list (GTK_WINDOW (gtk_widget_get_toplevel(ep->target->widget)));
-}
-
-static void
-edit_task_list_cb (EPopup *ep, EPopupItem *pitem, void *data)
-{
- TasksComponentView *component_view = data;
- ESource *selected_source;
-
- selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (component_view->source_selector));
- if (!selected_source)
- return;
-
- calendar_setup_edit_task_list (GTK_WINDOW (gtk_widget_get_toplevel(ep->target->widget)), selected_source);
-}
-
-static EPopupItem etc_source_popups[] = {
- { E_POPUP_ITEM, "10.new", N_("New Task List"), new_task_list_cb, NULL, "stock_todo", 0, 0 },
- { E_POPUP_ITEM, "15.copy", N_("Copy"), copy_task_list_cb, NULL, "stock_folder-copy", 0, E_CAL_POPUP_SOURCE_PRIMARY },
- { E_POPUP_ITEM, "20.delete", N_("Delete"), delete_task_list_cb, NULL, "stock_delete", 0, E_CAL_POPUP_SOURCE_USER|E_CAL_POPUP_SOURCE_PRIMARY },
- { E_POPUP_ITEM, "30.properties", N_("Properties..."), edit_task_list_cb, NULL, "stock_folder-properties", 0, E_CAL_POPUP_SOURCE_PRIMARY },
-};
-
-static void
-etc_source_popup_free(EPopup *ep, GSList *list, void *data)
-{
- g_slist_free(list);
-}
-
-static gboolean
-popup_event_cb(ESourceSelector *selector, ESource *insource, GdkEventButton *event, TasksComponentView *component_view)
-{
- ECalPopup *ep;
- ECalPopupTargetSource *t;
- GSList *menus = NULL;
- int i;
- GtkMenu *menu;
-
- /** @HookPoint-ECalPopup: Tasks Source Selector Context Menu
- * @Id: org.gnome.evolution.tasks.source.popup
- * @Class: org.gnome.evolution.calendar.popup:1.0
- * @Target: ECalPopupTargetSource
- *
- * The context menu on the source selector in the tasks window.
- */
- ep = e_cal_popup_new("org.gnome.evolution.tasks.source.popup");
- t = e_cal_popup_target_new_source(ep, selector);
- t->target.widget = (GtkWidget *)component_view->tasks;
-
- for (i=0;i<sizeof(etc_source_popups)/sizeof(etc_source_popups[0]);i++)
- menus = g_slist_prepend(menus, &etc_source_popups[i]);
-
- e_popup_add_items((EPopup *)ep, menus, NULL,etc_source_popup_free, component_view);
-
- menu = e_popup_create_menu_once((EPopup *)ep, (EPopupTarget *)t, 0);
- gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event?event->button:0, event?event->time:gtk_get_current_event_time());
-
- return TRUE;
-}
-
-static void
-source_selection_changed_cb (ESourceSelector *selector, TasksComponentView *component_view)
-{
- update_uris_for_selection (component_view);
-}
-
-static void
-primary_source_selection_changed_cb (ESourceSelector *selector, TasksComponentView *component_view)
-{
- update_uri_for_primary_selection (component_view);
-}
-
-static void
-source_added_cb (ETasks *tasks, ESource *source, TasksComponentView *component_view)
-{
- e_source_selector_select_source (E_SOURCE_SELECTOR (component_view->source_selector), source);
-}
-
-static void
-source_removed_cb (ETasks *tasks, ESource *source, TasksComponentView *component_view)
-{
- e_source_selector_unselect_source (E_SOURCE_SELECTOR (component_view->source_selector), source);
-}
-
-static void
-set_info (TasksComponentView *component_view)
-{
- GString *message = g_string_new ("");
- int rows, selected_rows;
-
- rows = e_table_model_row_count (component_view->model);
- selected_rows = e_table_selected_count (component_view->table);
-
- g_string_append_printf(message, ngettext("%d task", "%d tasks", rows), rows);
- if (selected_rows > 0)
- g_string_append_printf(message, ngettext(", %d selected", ", %d selected", selected_rows), selected_rows);
-
- e_info_label_set_info (component_view->info_label, _("Tasks"), message->str);
-
- g_string_free (message, TRUE);
-}
-
-static void
-table_selection_change_cb (ETableModel *etm, TasksComponentView *component_view)
-{
- set_info (component_view);
-}
-
-static void
-model_changed_cb (ETableModel *etm, TasksComponentView *component_view)
-{
- set_info (component_view);
-}
-
-static void
-model_rows_inserted_cb (ETableModel *etm, int row, int count, TasksComponentView *component_view)
-{
- set_info (component_view);
-}
-
-static void
-model_rows_deleted_cb (ETableModel *etm, int row, int count, TasksComponentView *component_view)
-{
- set_info (component_view);
-}
-
-/* Evolution::Component CORBA methods */
-
-static void
-impl_upgradeFromVersion (PortableServer_Servant servant,
- CORBA_short major,
- CORBA_short minor,
- CORBA_short revision,
- CORBA_Environment *ev)
-{
- GError *err = NULL;
- TasksComponent *component = TASKS_COMPONENT (bonobo_object_from_servant (servant));
-
- if (!migrate_tasks(component, major, minor, revision, &err)) {
- GNOME_Evolution_Component_UpgradeFailed *failedex;
-
- failedex = GNOME_Evolution_Component_UpgradeFailed__alloc();
- failedex->what = CORBA_string_dup(_("Failed upgrading tasks."));
- failedex->why = CORBA_string_dup(err->message);
- CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Component_UpgradeFailed, failedex);
- }
-
- if (err)
- g_error_free(err);
-}
-
-static gboolean
-selector_tree_drag_drop (GtkWidget *widget,
- GdkDragContext *context,
- int x,
- int y,
- guint time,
- CalendarComponent *component)
-{
- GtkTreeViewColumn *column;
- int cell_x;
- int cell_y;
- GtkTreePath *path;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gpointer data;
-
- if (!gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), x, y, &path,
- &column, &cell_x, &cell_y))
- return FALSE;
-
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
-
- if (!gtk_tree_model_get_iter (model, &iter, path)) {
- gtk_tree_path_free (path);
- return FALSE;
- }
-
- gtk_tree_model_get (model, &iter, 0, &data, -1);
-
- if (E_IS_SOURCE_GROUP (data)) {
- g_object_unref (data);
- gtk_tree_path_free (path);
- return FALSE;
- }
-
- gtk_tree_path_free (path);
- return TRUE;
-}
-
-static gboolean
-selector_tree_drag_motion (GtkWidget *widget,
- GdkDragContext *context,
- int x,
- int y,
- guint time,
- gpointer user_data)
-{
- GtkTreePath *path = NULL;
- gpointer data = NULL;
- GtkTreeViewDropPosition pos;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GdkDragAction action = GDK_ACTION_DEFAULT;
-
- if (!gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW (widget),
- x, y, &path, &pos))
- goto finish;
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
-
- if (!gtk_tree_model_get_iter (model, &iter, path))
- goto finish;
-
- gtk_tree_model_get (model, &iter, 0, &data, -1);
-
- if (E_IS_SOURCE_GROUP (data) || e_source_get_readonly (data))
- goto finish;
-
- gtk_tree_view_set_drag_dest_row(GTK_TREE_VIEW (widget), path, GTK_TREE_VIEW_DROP_INTO_OR_BEFORE);
- action = context->suggested_action;
-
- finish:
- if (path)
- gtk_tree_path_free (path);
- if (data)
- g_object_unref (data);
-
- gdk_drag_status (context, action, time);
- return TRUE;
-}
-
-static gboolean
-update_single_object (ECal *client, icalcomponent *icalcomp)
-{
- char *uid;
- icalcomponent *tmp_icalcomp;
-
- uid = (char *) icalcomponent_get_uid (icalcomp);
-
- if (e_cal_get_object (client, uid, NULL, &tmp_icalcomp, NULL))
- return e_cal_modify_object (client, icalcomp, CALOBJ_MOD_ALL, NULL);
-
- return e_cal_create_object (client, icalcomp, &uid, NULL);
-}
-
-static gboolean
-update_objects (ECal *client, icalcomponent *icalcomp)
-{
- icalcomponent *subcomp;
- icalcomponent_kind kind;
-
- kind = icalcomponent_isa (icalcomp);
- if (kind == ICAL_VTODO_COMPONENT || kind == ICAL_VEVENT_COMPONENT)
- return update_single_object (client, icalcomp);
- else if (kind != ICAL_VCALENDAR_COMPONENT)
- return FALSE;
-
- subcomp = icalcomponent_get_first_component (icalcomp, ICAL_ANY_COMPONENT);
- while (subcomp) {
- gboolean success;
-
- kind = icalcomponent_isa (subcomp);
- if (kind == ICAL_VTIMEZONE_COMPONENT) {
- icaltimezone *zone;
-
- zone = icaltimezone_new ();
- icaltimezone_set_component (zone, subcomp);
-
- success = e_cal_add_timezone (client, zone, NULL);
- icaltimezone_free (zone, 1);
- if (!success)
- return success;
- } else if (kind == ICAL_VTODO_COMPONENT ||
- kind == ICAL_VEVENT_COMPONENT) {
- success = update_single_object (client, subcomp);
- if (!success)
- return success;
- }
-
- subcomp = icalcomponent_get_next_component (icalcomp, ICAL_ANY_COMPONENT);
- }
-
- return TRUE;
-}
-
-static void
-selector_tree_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- GtkSelectionData *data,
- guint info,
- guint time,
- gpointer user_data)
-{
- GtkTreePath *path = NULL;
- GtkTreeViewDropPosition pos;
- gpointer source = NULL;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gboolean success = FALSE;
- icalcomponent *icalcomp = NULL;
- ECal *client = NULL;
-
- if (!gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW (widget),
- x, y, &path, &pos))
- goto finish;
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
-
- if (!gtk_tree_model_get_iter (model, &iter, path))
- goto finish;
-
-
- gtk_tree_model_get (model, &iter, 0, &source, -1);
-
- if (E_IS_SOURCE_GROUP (source) || e_source_get_readonly (source))
- goto finish;
-
- icalcomp = icalparser_parse_string (data->data);
-
- if (icalcomp) {
- char * uid;
-
- /* FIXME deal with GDK_ACTION_ASK */
- if (context->action == GDK_ACTION_COPY) {
- uid = e_cal_component_gen_uid ();
- icalcomponent_set_uid (icalcomp, uid);
- }
-
- client = auth_new_cal_from_source (source,
- E_CAL_SOURCE_TYPE_TODO);
-
- if (client) {
- if (e_cal_open (client, TRUE, NULL)) {
- success = TRUE;
- update_objects (client, icalcomp);
- }
-
- g_object_unref (client);
- }
-
- icalcomponent_free (icalcomp);
- }
-
- finish:
- if (source)
- g_object_unref (source);
- if (path)
- gtk_tree_path_free (path);
-
- gtk_drag_finish (context, success, context->action == GDK_ACTION_MOVE, time);
-}
-
-static void
-selector_tree_drag_leave (GtkWidget *widget, GdkDragContext *context, guint time, gpointer data)
-{
- gtk_tree_view_set_drag_dest_row(GTK_TREE_VIEW (widget),
- NULL, GTK_TREE_VIEW_DROP_BEFORE);
-}
-
-
-static void
-control_activate_cb (BonoboControl *control, gboolean activate, gpointer data)
-{
- TasksComponentView *component_view = data;
-
- if (activate) {
- BonoboUIComponent *uic;
- uic = bonobo_control_get_ui_component (component_view->view_control);
-
- e_user_creatable_items_handler_activate (component_view->creatable_items_handler, uic);
- }
-}
-
-static void
-config_create_ecal_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
-{
- TasksComponent *component = data;
- TasksComponentPrivate *priv;
-
- priv = component->priv;
-
- g_object_unref (priv->create_ecal);
- priv->create_ecal = NULL;
-
- priv->notifications = g_list_remove (priv->notifications, GUINT_TO_POINTER (id));
-}
-
-static ECal *
-setup_create_ecal (TasksComponent *component, TasksComponentView *component_view)
-{
- TasksComponentPrivate *priv;
- ESource *source = NULL;
- char *uid;
- guint not;
-
- priv = component->priv;
-
- if (component_view) {
- ECal *default_ecal;
-
- default_ecal = e_tasks_get_default_client (component_view->tasks);
- if (default_ecal)
- return default_ecal;
- }
-
- if (priv->create_ecal)
- return priv->create_ecal;
-
- /* Get the current primary calendar, or try to set one if it doesn't already exist */
- uid = calendar_config_get_primary_tasks ();
- if (uid) {
- source = e_source_list_peek_source_by_uid (priv->source_list, uid);
- g_free (uid);
-
- priv->create_ecal = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_TODO);
- }
-
- if (!priv->create_ecal) {
- /* Try to create a default if there isn't one */
- source = e_source_list_peek_source_any (priv->source_list);
- if (source)
- priv->create_ecal = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_TODO);
- }
-
- if (priv->create_ecal) {
- icaltimezone *zone;
-
- if (!e_cal_open (priv->create_ecal, FALSE, NULL)) {
- GtkWidget *dialog;
-
- dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
- GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
- _("Unable to open the task list '%s' for creating events and meetings"),
- e_source_peek_name (source));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
-
- return NULL;
- }
-
- zone = calendar_config_get_icaltimezone ();
- e_cal_set_default_timezone (priv->create_ecal, zone, NULL);
- } else {
- GtkWidget *dialog;
-
- dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
- GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
- _("There is no calendar available for creating tasks"));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
-
- return NULL;
- }
-
- /* Handle the fact it may change on us */
- not = calendar_config_add_notification_primary_tasks (config_create_ecal_changed_cb,
- component);
- priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
- /* Save the primary source for use elsewhere */
- calendar_config_set_primary_tasks (e_source_peek_uid (source));
-
- return priv->create_ecal ;
-}
-
-static gboolean
-create_new_todo (TasksComponent *task_component, gboolean is_assigned, TasksComponentView *component_view)
-{
- ECal *ecal;
- TasksComponentPrivate *priv;
- ECalComponent *comp;
- TaskEditor *editor;
-
- priv = task_component->priv;
-
- ecal = setup_create_ecal (task_component, component_view);
- if (!ecal)
- return FALSE;
-
- editor = task_editor_new (ecal, is_assigned);
- comp = cal_comp_task_new_with_defaults (ecal);
-
- comp_editor_edit_comp (COMP_EDITOR (editor), comp);
- if (is_assigned)
- task_editor_show_assignment (editor);
- comp_editor_focus (COMP_EDITOR (editor));
-
- e_comp_editor_registry_add (comp_editor_registry, COMP_EDITOR (editor), TRUE);
-
- return TRUE;
-}
-
-static void
-create_local_item_cb (EUserCreatableItemsHandler *handler, const char *item_type_name, void *data)
-{
- TasksComponent *tasks_component = data;
- TasksComponentPrivate *priv;
- TasksComponentView *component_view = NULL;
- GList *l;
-
- priv = tasks_component->priv;
-
- for (l = priv->views; l; l = l->next) {
- component_view = l->data;
-
- if (component_view->creatable_items_handler == handler)
- break;
-
- component_view = NULL;
- }
-
- if (strcmp (item_type_name, CREATE_TASK_ID) == 0) {
- create_new_todo (tasks_component, FALSE, component_view);
- } else if (strcmp (item_type_name, CREATE_TASK_ASSIGNED_ID) == 0) {
- create_new_todo (tasks_component, TRUE, component_view);
- } else if (strcmp (item_type_name, CREATE_TASK_LIST_ID) == 0) {
- calendar_setup_new_task_list (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (component_view->tasks))));
- }
-}
-
-static TasksComponentView *
-create_component_view (TasksComponent *tasks_component)
-{
- TasksComponentPrivate *priv;
- TasksComponentView *component_view;
- GtkWidget *selector_scrolled_window, *vbox;
- GtkWidget *statusbar_widget;
- AtkObject *a11y;
-
- priv = tasks_component->priv;
-
- /* Create the calendar component view */
- component_view = g_new0 (TasksComponentView, 1);
-
- /* Add the source lists */
- component_view->source_list = g_object_ref (priv->source_list);
-
- /* Create sidebar selector */
- component_view->source_selector = e_source_selector_new (tasks_component->priv->source_list);
- e_source_selector_set_select_new ((ESourceSelector *)component_view->source_selector, TRUE);
- a11y = gtk_widget_get_accessible (GTK_WIDGET (component_view->source_selector));
- atk_object_set_name (a11y, _("Task Source Selector"));
-
- g_signal_connect (component_view->source_selector, "drag-motion", G_CALLBACK (selector_tree_drag_motion),
- tasks_component);
- g_signal_connect (component_view->source_selector, "drag-leave", G_CALLBACK (selector_tree_drag_leave),
- tasks_component);
- g_signal_connect (component_view->source_selector, "drag-drop", G_CALLBACK (selector_tree_drag_drop),
- tasks_component);
- g_signal_connect (component_view->source_selector, "drag-data-received",
- G_CALLBACK (selector_tree_drag_data_received), tasks_component);
-
- gtk_drag_dest_set(component_view->source_selector, GTK_DEST_DEFAULT_ALL, drag_types,
- num_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE);
-
- gtk_widget_show (component_view->source_selector);
-
- selector_scrolled_window = gtk_scrolled_window_new (NULL, NULL);
- gtk_container_add (GTK_CONTAINER (selector_scrolled_window), component_view->source_selector);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (selector_scrolled_window),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (selector_scrolled_window),
- GTK_SHADOW_IN);
- gtk_widget_show (selector_scrolled_window);
-
- component_view->info_label = (EInfoLabel *)e_info_label_new("stock_task");
- e_info_label_set_info(component_view->info_label, _("Tasks"), "");
- gtk_widget_show (GTK_WIDGET (component_view->info_label));
-
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX (vbox), GTK_WIDGET (component_view->info_label), FALSE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX (vbox), selector_scrolled_window, TRUE, TRUE, 0);
- gtk_widget_show (vbox);
-
- component_view->sidebar_control = bonobo_control_new (vbox);
-
- /* Create main view */
- component_view->view_control = tasks_control_new ();
- if (!component_view->view_control) {
- /* FIXME free memory */
-
- return NULL;
- }
-
- component_view->tasks = (ETasks *) bonobo_control_get_widget (component_view->view_control);
- component_view->table = e_calendar_table_get_table (e_tasks_get_calendar_table (component_view->tasks));
- component_view->model = E_TABLE_MODEL (e_calendar_table_get_model (e_tasks_get_calendar_table (component_view->tasks)));
-
- /* This signal is thrown if backends die - we update the selector */
- g_signal_connect (component_view->tasks, "source_added",
- G_CALLBACK (source_added_cb), component_view);
- g_signal_connect (component_view->tasks, "source_removed",
- G_CALLBACK (source_removed_cb), component_view);
-
- /* Create status bar */
- statusbar_widget = e_task_bar_new ();
- component_view->activity_handler = e_activity_handler_new ();
- e_activity_handler_attach_task_bar (component_view->activity_handler, E_TASK_BAR (statusbar_widget));
- gtk_widget_show (statusbar_widget);
-
- component_view->statusbar_control = bonobo_control_new (statusbar_widget);
-
- e_calendar_table_set_activity_handler (e_tasks_get_calendar_table (component_view->tasks), component_view->activity_handler);
-
- /* connect after setting the initial selections, or we'll get unwanted calls
- to calendar_control_sensitize_calendar_commands */
- g_signal_connect (component_view->source_selector, "selection_changed",
- G_CALLBACK (source_selection_changed_cb), component_view);
- g_signal_connect (component_view->source_selector, "primary_selection_changed",
- G_CALLBACK (primary_source_selection_changed_cb), component_view);
- g_signal_connect (component_view->source_selector, "popup_event",
- G_CALLBACK (popup_event_cb), component_view);
-
- /* Set up the "new" item handler */
- component_view->creatable_items_handler = e_user_creatable_items_handler_new ("tasks", create_local_item_cb, tasks_component);
- g_signal_connect (component_view->view_control, "activate", G_CALLBACK (control_activate_cb), component_view);
-
- /* We use this to update the component information */
- set_info (component_view);
- g_signal_connect (component_view->table, "selection_change",
- G_CALLBACK (table_selection_change_cb), component_view);
- g_signal_connect (component_view->model, "model_changed",
- G_CALLBACK (model_changed_cb), component_view);
- g_signal_connect (component_view->model, "model_rows_inserted",
- G_CALLBACK (model_rows_inserted_cb), component_view);
- g_signal_connect (component_view->model, "model_rows_deleted",
- G_CALLBACK (model_rows_deleted_cb), component_view);
-
- /* Load the selection from the last run */
- update_selection (component_view);
- update_primary_selection (component_view);
-
- return component_view;
-}
-
-static void
-destroy_component_view (TasksComponentView *component_view)
-{
- GList *l;
-
- if (component_view->source_list)
- g_object_unref (component_view->source_list);
-
- if (component_view->source_selection)
- e_source_selector_free_selection (component_view->source_selection);
-
- for (l = component_view->notifications; l; l = l->next)
- calendar_config_remove_notification (GPOINTER_TO_UINT (l->data));
- g_list_free (component_view->notifications);
-
- if (component_view->creatable_items_handler)
- g_object_unref (component_view->creatable_items_handler);
-
- if (component_view->activity_handler)
- g_object_unref (component_view->activity_handler);
-
- g_free (component_view);
-}
-
-static void
-view_destroyed_cb (gpointer data, GObject *where_the_object_was)
-{
- TasksComponent *tasks_component = data;
- TasksComponentPrivate *priv;
- GList *l;
-
- priv = tasks_component->priv;
-
- for (l = priv->views; l; l = l->next) {
- TasksComponentView *component_view = l->data;
-
- if (G_OBJECT (component_view->view_control) == where_the_object_was) {
- priv->views = g_list_remove (priv->views, component_view);
- destroy_component_view (component_view);
-
- break;
- }
- }
-}
-
-static void
-impl_createControls (PortableServer_Servant servant,
- Bonobo_Control *corba_sidebar_control,
- Bonobo_Control *corba_view_control,
- Bonobo_Control *corba_statusbar_control,
- CORBA_Environment *ev)
-{
- TasksComponent *component = TASKS_COMPONENT (bonobo_object_from_servant (servant));
- TasksComponentPrivate *priv;
- TasksComponentView *component_view;
-
- priv = component->priv;
-
- /* Create the calendar component view */
- component_view = create_component_view (component);
- if (!component_view) {
- /* FIXME Should we describe the problem in a control? */
- bonobo_exception_set (ev, ex_GNOME_Evolution_Component_Failed);
-
- return;
- }
-
- g_object_weak_ref (G_OBJECT (component_view->view_control), view_destroyed_cb, component);
- priv->views = g_list_append (priv->views, component_view);
-
- /* Return the controls */
- *corba_sidebar_control = CORBA_Object_duplicate (BONOBO_OBJREF (component_view->sidebar_control), ev);
- *corba_view_control = CORBA_Object_duplicate (BONOBO_OBJREF (component_view->view_control), ev);
- *corba_statusbar_control = CORBA_Object_duplicate (BONOBO_OBJREF (component_view->statusbar_control), ev);
-}
-
-static GNOME_Evolution_CreatableItemTypeList *
-impl__get_userCreatableItems (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- GNOME_Evolution_CreatableItemTypeList *list = GNOME_Evolution_CreatableItemTypeList__alloc ();
-
- list->_length = 3;
- list->_maximum = list->_length;
- list->_buffer = GNOME_Evolution_CreatableItemTypeList_allocbuf (list->_length);
-
- CORBA_sequence_set_release (list, FALSE);
-
- list->_buffer[0].id = CREATE_TASK_ID;
- list->_buffer[0].description = _("New task");
- list->_buffer[0].menuDescription = _("_Task");
- list->_buffer[0].tooltip = _("Create a new task");
- list->_buffer[0].menuShortcut = 't';
- list->_buffer[0].iconName = "stock_task";
- list->_buffer[0].type = GNOME_Evolution_CREATABLE_OBJECT;
-
- list->_buffer[1].id = CREATE_TASK_ASSIGNED_ID;
- list->_buffer[1].description = _("New assigned task");
- list->_buffer[1].menuDescription = _("Assigne_d Task");
- list->_buffer[1].tooltip = _("Create a new assigned task");
- list->_buffer[1].menuShortcut = 'd';
- list->_buffer[1].iconName = "stock_task";
- list->_buffer[1].type = GNOME_Evolution_CREATABLE_OBJECT;
-
- list->_buffer[2].id = CREATE_TASK_LIST_ID;
- list->_buffer[2].description = _("New task list");
- list->_buffer[2].menuDescription = _("Task l_ist");
- list->_buffer[2].tooltip = _("Create a new task list");
- list->_buffer[2].menuShortcut = 'i';
- list->_buffer[2].iconName = "stock_todo";
- list->_buffer[2].type = GNOME_Evolution_CREATABLE_FOLDER;
-
- return list;
-}
-
-static void
-impl_requestCreateItem (PortableServer_Servant servant,
- const CORBA_char *item_type_name,
- CORBA_Environment *ev)
-{
- TasksComponent *tasks_component = TASKS_COMPONENT (bonobo_object_from_servant (servant));
- TasksComponentPrivate *priv;
-
- priv = tasks_component->priv;
-
- if (strcmp (item_type_name, CREATE_TASK_ID) == 0) {
- if (!create_new_todo (tasks_component, FALSE, NULL))
- bonobo_exception_set (ev, ex_GNOME_Evolution_Component_Failed);
- } else if (strcmp (item_type_name, CREATE_TASK_ASSIGNED_ID) == 0) {
- if (!create_new_todo (tasks_component, TRUE, NULL))
- bonobo_exception_set (ev, ex_GNOME_Evolution_Component_Failed);
- } else if (strcmp (item_type_name, CREATE_TASK_LIST_ID) == 0) {
- /* FIXME Should we use the last opened window? */
- calendar_setup_new_task_list (NULL);
- } else {
- bonobo_exception_set (ev, ex_GNOME_Evolution_Component_UnknownType);
- }
-}
-
-/* GObject methods. */
-
-static void
-impl_dispose (GObject *object)
-{
- TasksComponent *tasks_component = TASKS_COMPONENT (object);
- TasksComponentPrivate *priv = tasks_component->priv;
- GList *l;
-
- if (priv->source_list != NULL) {
- g_object_unref (priv->source_list);
- priv->source_list = NULL;
- }
- if (priv->source_selection != NULL) {
- e_source_selector_free_selection (priv->source_selection);
- priv->source_selection = NULL;
- }
-
- if (priv->create_ecal) {
- g_object_unref (priv->create_ecal);
- priv->create_ecal = NULL;
- }
-
- for (l = priv->views; l; l = l->next) {
- TasksComponentView *component_view = l->data;
-
- g_object_weak_unref (G_OBJECT (component_view->view_control), view_destroyed_cb, tasks_component);
- }
- g_list_free (priv->views);
- priv->views = NULL;
-
- for (l = priv->notifications; l; l = l->next)
- calendar_config_remove_notification (GPOINTER_TO_UINT (l->data));
- g_list_free (priv->notifications);
- priv->notifications = NULL;
-
- (* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-static void
-impl_finalize (GObject *object)
-{
- TasksComponentPrivate *priv = TASKS_COMPONENT (object)->priv;
- GList *l;
-
- for (l = priv->views; l; l = l->next) {
- TasksComponentView *component_view = l->data;
-
- destroy_component_view (component_view);
- }
- g_list_free (priv->views);
-
- g_free (priv->base_directory);
- g_free (priv->config_directory);
- g_free (priv);
-
- (* G_OBJECT_CLASS (parent_class)->finalize) (object);
-}
-
-static void
-tasks_component_class_init (TasksComponentClass *klass)
-{
- POA_GNOME_Evolution_Component__epv *epv = &klass->epv;
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_peek_parent (klass);
-
- epv->upgradeFromVersion = impl_upgradeFromVersion;
- epv->createControls = impl_createControls;
- epv->_get_userCreatableItems = impl__get_userCreatableItems;
- epv->requestCreateItem = impl_requestCreateItem;
-
- object_class->dispose = impl_dispose;
- object_class->finalize = impl_finalize;
-}
-
-static void
-tasks_component_init (TasksComponent *component, TasksComponentClass *klass)
-{
- TasksComponentPrivate *priv;
-
- priv = g_new0 (TasksComponentPrivate, 1);
-
- priv->base_directory = g_build_filename (g_get_home_dir (), ".evolution", NULL);
- priv->config_directory = g_build_filename (g_get_home_dir (),
- ".evolution", "tasks", "config",
- NULL);
-
- if (!e_cal_get_sources (&priv->source_list, E_CAL_SOURCE_TYPE_TODO, NULL))
- ;
-
- component->priv = priv;
-}
-
-/* Public API */
-
-TasksComponent *
-tasks_component_peek (void)
-{
- static TasksComponent *component = NULL;
-
- if (component == NULL) {
- component = g_object_new (tasks_component_get_type (), NULL);
-
- if (e_mkdir_hier (component->priv->config_directory, 0777) != 0) {
- g_warning (G_STRLOC ": Cannot create directory %s: %s",
- component->priv->config_directory, g_strerror (errno));
- g_object_unref (component);
- component = NULL;
- }
- }
-
- return component;
-}
-
-const char *
-tasks_component_peek_base_directory (TasksComponent *component)
-{
- return component->priv->base_directory;
-}
-
-const char *
-tasks_component_peek_config_directory (TasksComponent *component)
-{
- return component->priv->config_directory;
-}
-
-ESourceList *
-tasks_component_peek_source_list (TasksComponent *component)
-{
- return component->priv->source_list;
-}
-
-BONOBO_TYPE_FUNC_FULL (TasksComponent, GNOME_Evolution_Component, PARENT_TYPE, tasks_component)
diff --git a/calendar/gui/tasks-component.h b/calendar/gui/tasks-component.h
deleted file mode 100644
index b5050f3840..0000000000
--- a/calendar/gui/tasks-component.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* tasks-component.h
- *
- * Copyright (C) 2003 Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Rodrigo Moya <rodrigo@ximian.com>
- */
-
-#ifndef _TASKS_COMPONENT_H_
-#define _TASKS_COMPONENT_H_
-
-#include <bonobo/bonobo-object.h>
-#include <libedataserver/e-source-list.h>
-#include <widgets/misc/e-activity-handler.h>
-#include "Evolution.h"
-
-
-#define TASKS_TYPE_COMPONENT (tasks_component_get_type ())
-#define TASKS_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TASKS_TYPE_COMPONENT, TasksComponent))
-#define TASKS_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TASKS_TYPE_COMPONENT, TasksComponentClass))
-#define TASKS_IS_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TASKS_TYPE_COMPONENT))
-#define TASKS_IS_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TASKS_TYPE_COMPONENT))
-
-
-typedef struct _TasksComponent TasksComponent;
-typedef struct _TasksComponentPrivate TasksComponentPrivate;
-typedef struct _TasksComponentClass TasksComponentClass;
-
-struct _TasksComponent {
- BonoboObject parent;
-
- TasksComponentPrivate *priv;
-};
-
-struct _TasksComponentClass {
- BonoboObjectClass parent_class;
-
- POA_GNOME_Evolution_Component__epv epv;
-};
-
-
-GType tasks_component_get_type (void);
-TasksComponent *tasks_component_peek (void);
-
-const char *tasks_component_peek_base_directory (TasksComponent *component);
-const char *tasks_component_peek_config_directory (TasksComponent *component);
-ESourceList *tasks_component_peek_source_list (TasksComponent *component);
-
-#endif /* _TASKS_COMPONENT_H_ */
diff --git a/calendar/gui/tasks-control.c b/calendar/gui/tasks-control.c
deleted file mode 100644
index e3f3358e9f..0000000000
--- a/calendar/gui/tasks-control.c
+++ /dev/null
@@ -1,435 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* tasks-control.c
- *
- * Copyright (C) 2000, 2001, 2002, 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Authors: Damon Chaplin <damon@ximian.com>
- * Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtksignal.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkcheckbutton.h>
-#include <gtk/gtkmessagedialog.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnome/gnome-util.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <libgnomeui/gnome-dialog-util.h>
-#include <libgnomeui/gnome-stock-icons.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-paper.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
-#include <libgnomeprintui/gnome-print-paper-selector.h>
-#include <libgnomeprintui/gnome-print-preview.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
-#include <bonobo/bonobo-control.h>
-#include <bonobo/bonobo-ui-util.h>
-#include <e-util/e-dialog-utils.h>
-#include <e-util/e-print.h>
-#include "dialogs/cal-prefs-dialog.h"
-#include "calendar-config.h"
-#include "calendar-commands.h"
-#include "e-tasks.h"
-#include "e-calendar-table.h"
-#include "print.h"
-#include "tasks-control.h"
-#include "evolution-shell-component-utils.h"
-
-#define FIXED_MARGIN .05
-
-
-static void tasks_control_activate_cb (BonoboControl *control,
- gboolean activate,
- gpointer user_data);
-static void tasks_control_open_task_cmd (BonoboUIComponent *uic,
- gpointer data,
- const char *path);
-static void tasks_control_new_task_cmd (BonoboUIComponent *uic,
- gpointer data,
- const char *path);
-static void tasks_control_cut_cmd (BonoboUIComponent *uic,
- gpointer data,
- const gchar *path);
-static void tasks_control_copy_cmd (BonoboUIComponent *uic,
- gpointer data,
- const gchar *path);
-static void tasks_control_paste_cmd (BonoboUIComponent *uic,
- gpointer data,
- const gchar *path);
-static void tasks_control_delete_cmd (BonoboUIComponent *uic,
- gpointer data,
- const char *path);
-static void tasks_control_complete_cmd (BonoboUIComponent *uic,
- gpointer data,
- const char *path);
-static void tasks_control_purge_cmd (BonoboUIComponent *uic,
- gpointer data,
- const char *path);
-static void tasks_control_print_cmd (BonoboUIComponent *uic,
- gpointer data,
- const char *path);
-static void tasks_control_print_preview_cmd (BonoboUIComponent *uic,
- gpointer data,
- const char *path);
-
-
-BonoboControl *
-tasks_control_new (void)
-{
- BonoboControl *control;
- GtkWidget *tasks;
-
- tasks = e_tasks_new ();
- if (!tasks)
- return NULL;
- gtk_widget_show (tasks);
-
- control = bonobo_control_new (tasks);
- if (!control) {
- gtk_widget_destroy (tasks);
- g_message ("control_factory_fn(): could not create the control!");
- return NULL;
- }
-
- g_signal_connect (control, "activate", G_CALLBACK (tasks_control_activate_cb), tasks);
-
- return control;
-}
-
-
-static void
-tasks_control_activate_cb (BonoboControl *control,
- gboolean activate,
- gpointer user_data)
-{
- ETasks *tasks;
-
- tasks = E_TASKS (user_data);
-
- if (activate)
- tasks_control_activate (control, tasks);
- else
- tasks_control_deactivate (control, tasks);
-}
-
-/* Sensitizes the UI Component menu/toolbar commands based on the number of
- * selected tasks.
- */
-void
-tasks_control_sensitize_commands (BonoboControl *control, ETasks *tasks, int n_selected)
-{
- BonoboUIComponent *uic;
- gboolean read_only = TRUE;
- ECal *ecal;
- ECalModel *model;
-
- uic = bonobo_control_get_ui_component (control);
- g_assert (uic != NULL);
-
- if (bonobo_ui_component_get_container (uic) == CORBA_OBJECT_NIL)
- return;
-
- model = e_calendar_table_get_model (e_tasks_get_calendar_table (tasks));
- ecal = e_cal_model_get_default_client (model);
- if (ecal)
- e_cal_is_read_only (ecal, &read_only, NULL);
-
- bonobo_ui_component_set_prop (uic, "/commands/TasksOpenTask", "sensitive",
- n_selected != 1 ? "0" : "1",
- NULL);
- bonobo_ui_component_set_prop (uic, "/commands/TasksCut", "sensitive",
- n_selected == 0 || read_only ? "0" : "1",
- NULL);
- bonobo_ui_component_set_prop (uic, "/commands/TasksCopy", "sensitive",
- n_selected == 0 ? "0" : "1",
- NULL);
- bonobo_ui_component_set_prop (uic, "/commands/TasksPaste", "sensitive",
- read_only ? "0" : "1",
- NULL);
- bonobo_ui_component_set_prop (uic, "/commands/TasksDelete", "sensitive",
- n_selected == 0 || read_only ? "0" : "1",
- NULL);
- bonobo_ui_component_set_prop (uic, "/commands/TasksMarkComplete", "sensitive",
- n_selected == 0 || read_only ? "0" : "1",
- NULL);
- bonobo_ui_component_set_prop (uic, "/commands/TasksPurge", "sensitive",
- read_only ? "0" : "1",
- NULL);
-}
-
-/* Callback used when the selection in the table changes */
-static void
-selection_changed_cb (ETasks *tasks, int n_selected, gpointer data)
-{
- BonoboControl *control;
-
- control = BONOBO_CONTROL (data);
-
- tasks_control_sensitize_commands (control, tasks, n_selected);
-}
-
-static BonoboUIVerb verbs [] = {
- BONOBO_UI_VERB ("TasksOpenTask", tasks_control_open_task_cmd),
- BONOBO_UI_VERB ("TasksNewTask", tasks_control_new_task_cmd),
- BONOBO_UI_VERB ("TasksCut", tasks_control_cut_cmd),
- BONOBO_UI_VERB ("TasksCopy", tasks_control_copy_cmd),
- BONOBO_UI_VERB ("TasksPaste", tasks_control_paste_cmd),
- BONOBO_UI_VERB ("TasksDelete", tasks_control_delete_cmd),
- BONOBO_UI_VERB ("TasksMarkComplete", tasks_control_complete_cmd),
- BONOBO_UI_VERB ("TasksPurge", tasks_control_purge_cmd),
- BONOBO_UI_VERB ("TasksPrint", tasks_control_print_cmd),
- BONOBO_UI_VERB ("TasksPrintPreview", tasks_control_print_preview_cmd),
-
- BONOBO_UI_VERB_END
-};
-
-void
-tasks_control_activate (BonoboControl *control, ETasks *tasks)
-{
- Bonobo_UIContainer remote_uih;
- BonoboUIComponent *uic;
- int n_selected;
- ECalendarTable *cal_table;
- ETable *etable;
-
- uic = bonobo_control_get_ui_component (control);
- g_assert (uic != NULL);
-
- remote_uih = bonobo_control_get_remote_ui_container (control, NULL);
- bonobo_ui_component_set_container (uic, remote_uih, NULL);
- bonobo_object_release_unref (remote_uih, NULL);
-
- e_tasks_set_ui_component (tasks, uic);
-
- bonobo_ui_component_add_verb_list_with_data (uic, verbs, tasks);
-
- bonobo_ui_component_freeze (uic, NULL);
-
- bonobo_ui_util_set_ui (uic, PREFIX,
- EVOLUTION_UIDIR "/evolution-tasks.xml",
- "evolution-tasks",
- NULL);
-
- e_tasks_setup_view_menus (tasks, uic);
-
- /* Signals from the tasks widget; also sensitize the menu items as appropriate */
-
- g_signal_connect (tasks, "selection_changed", G_CALLBACK (selection_changed_cb), control);
-
- cal_table = e_tasks_get_calendar_table (tasks);
- etable = e_calendar_table_get_table (cal_table);
- n_selected = e_table_selected_count (etable);
-
- tasks_control_sensitize_commands (control, tasks, n_selected);
-
- bonobo_ui_component_thaw (uic, NULL);
-
- /* Show the dialog for setting the timezone if the user hasn't chosen
- a default timezone already. This is done in the startup wizard now,
- so we don't do it here. */
-#if 0
- calendar_config_check_timezone_set ();
-#endif
-}
-
-
-void
-tasks_control_deactivate (BonoboControl *control, ETasks *tasks)
-{
- BonoboUIComponent *uic = bonobo_control_get_ui_component (control);
-
- g_assert (uic != NULL);
-
- e_tasks_set_ui_component (tasks, NULL);
-
- e_tasks_discard_view_menus (tasks);
-
- /* Stop monitoring the "selection_changed" signal */
- g_signal_handlers_disconnect_matched (tasks, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, control);
-
- bonobo_ui_component_rm (uic, "/", NULL);
- bonobo_ui_component_unset_container (uic, NULL);
-}
-
-static void tasks_control_open_task_cmd (BonoboUIComponent *uic,
- gpointer data,
- const char *path)
-{
- ETasks *tasks;
-
- tasks = E_TASKS (data);
- e_tasks_open_task (tasks);
-}
-
-static void
-tasks_control_new_task_cmd (BonoboUIComponent *uic,
- gpointer data,
- const char *path)
-{
- ETasks *tasks;
-
- tasks = E_TASKS (data);
- e_tasks_new_task (tasks);
-}
-
-static void
-tasks_control_cut_cmd (BonoboUIComponent *uic,
- gpointer data,
- const char *path)
-{
- ETasks *tasks;
- ECalendarTable *cal_table;
-
- tasks = E_TASKS (data);
- cal_table = e_tasks_get_calendar_table (tasks);
- e_calendar_table_cut_clipboard (cal_table);
-}
-
-static void
-tasks_control_copy_cmd (BonoboUIComponent *uic,
- gpointer data,
- const char *path)
-{
- ETasks *tasks;
- ECalendarTable *cal_table;
-
- tasks = E_TASKS (data);
- cal_table = e_tasks_get_calendar_table (tasks);
- e_calendar_table_copy_clipboard (cal_table);
-}
-
-static void
-tasks_control_paste_cmd (BonoboUIComponent *uic,
- gpointer data,
- const char *path)
-{
- ETasks *tasks;
- ECalendarTable *cal_table;
-
- tasks = E_TASKS (data);
- cal_table = e_tasks_get_calendar_table (tasks);
- e_calendar_table_paste_clipboard (cal_table);
-}
-
-static void
-tasks_control_delete_cmd (BonoboUIComponent *uic,
- gpointer data,
- const char *path)
-{
- ETasks *tasks;
-
- tasks = E_TASKS (data);
- e_tasks_delete_selected (tasks);
-}
-
-static void
-tasks_control_complete_cmd (BonoboUIComponent *uic,
- gpointer data,
- const char *path)
-{
- ETasks *tasks;
-
- tasks = E_TASKS (data);
- e_tasks_complete_selected (tasks);
-}
-
-static gboolean
-confirm_purge (ETasks *tasks)
-{
- GtkWidget *dialog, *checkbox, *parent;
- int button;
-
- if (!calendar_config_get_confirm_purge ())
- return TRUE;
-
- parent = gtk_widget_get_toplevel (GTK_WIDGET (tasks));
- dialog = gtk_message_dialog_new (
- (GtkWindow *)parent,
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_WARNING,
- GTK_BUTTONS_YES_NO,
- _("This operation will permanently erase all tasks marked as completed. If you continue, you will not be able to recover these tasks.\n\nReally erase these tasks?"));
- gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_NO);
-
- checkbox = gtk_check_button_new_with_label (_("Do not ask me again."));
- gtk_widget_show (checkbox);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), checkbox, TRUE, TRUE, 6);
-
- button = gtk_dialog_run (GTK_DIALOG (dialog));
- if (button == GTK_RESPONSE_YES && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbox)))
- calendar_config_set_confirm_purge (FALSE);
- gtk_widget_destroy (dialog);
-
- return button == GTK_RESPONSE_YES ? TRUE : FALSE;
-}
-
-static void
-tasks_control_purge_cmd (BonoboUIComponent *uic,
- gpointer data,
- const char *path)
-{
- ETasks *tasks;
-
- tasks = E_TASKS (data);
-
- if (confirm_purge (tasks))
- e_tasks_delete_completed (tasks);
-}
-
-
-static void
-print_tasks (ETasks *tasks, gboolean preview)
-{
- ECalendarTable *cal_table;
- ETable *etable;
-
- cal_table = e_tasks_get_calendar_table (tasks);
- etable = e_calendar_table_get_table (E_CALENDAR_TABLE (cal_table));
-
- print_table (etable, _("Print Tasks"), _("Tasks"), preview);
-}
-
-/* File/Print callback */
-static void
-tasks_control_print_cmd (BonoboUIComponent *uic,
- gpointer data,
- const char *path)
-{
- ETasks *tasks;
-
- tasks = E_TASKS (data);
-
- print_tasks (tasks, FALSE);
-}
-
-static void
-tasks_control_print_preview_cmd (BonoboUIComponent *uic,
- gpointer data,
- const char *path)
-{
- ETasks *tasks;
-
- tasks = E_TASKS (data);
-
- print_tasks (tasks, TRUE);
-}
-
diff --git a/calendar/gui/tasks-control.h b/calendar/gui/tasks-control.h
deleted file mode 100644
index 97938ec613..0000000000
--- a/calendar/gui/tasks-control.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* tasks-control.h
- *
- * Copyright (C) 2000, 2001, 2002, 2003 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Authors: Federico Mena Quintero <federico@ximian.com>
- * Damon Chaplin <damon@ximian.com>
- */
-
-#ifndef _TASKS_CONTROL_H_
-#define _TASKS_CONTROL_H_
-
-#include "e-tasks.h"
-
-BonoboControl *tasks_control_new (void);
-void tasks_control_activate (BonoboControl *control, ETasks *tasks);
-void tasks_control_deactivate (BonoboControl *control, ETasks *tasks);
-void tasks_control_sensitize_commands (BonoboControl *control, ETasks *tasks, int n_selected);
-
-#endif /* _TASKS_CONTROL_H_ */
diff --git a/calendar/gui/weekday-picker.c b/calendar/gui/weekday-picker.c
deleted file mode 100644
index 7a7e8ad85f..0000000000
--- a/calendar/gui/weekday-picker.c
+++ /dev/null
@@ -1,651 +0,0 @@
-/* Evolution calendar - Week day picker widget
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <gtk/gtksignal.h>
-#include <gdk/gdkkeysyms.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
-#include <libgnomecanvas/gnome-canvas-text.h>
-#include "weekday-picker.h"
-
-
-
-#define PADDING 2
-
-/* Private part of the WeekdayPicker structure */
-struct _WeekdayPickerPrivate {
- /* Selected days; see weekday_picker_set_days() */
- guint8 day_mask;
-
- /* Blocked days; these cannot be modified */
- guint8 blocked_day_mask;
-
- /* Day that defines the start of the week; 0 = Sunday, ..., 6 = Saturday */
- int week_start_day;
-
- /* Current keyboard focus day */
- int focus_day;
-
- /* Metrics */
- int font_ascent, font_descent;
- int max_letter_width;
-
- /* Components */
- GnomeCanvasItem *boxes[7];
- GnomeCanvasItem *labels[7];
-};
-
-
-
-/* Signal IDs */
-enum {
- CHANGED,
- LAST_SIGNAL
-};
-
-static void weekday_picker_class_init (WeekdayPickerClass *class);
-static void weekday_picker_init (WeekdayPicker *wp);
-static void weekday_picker_destroy (GtkObject *object);
-
-static void weekday_picker_realize (GtkWidget *widget);
-static void weekday_picker_size_request (GtkWidget *widget, GtkRequisition *requisition);
-static void weekday_picker_size_allocate (GtkWidget *widget, GtkAllocation *allocation);
-static void weekday_picker_style_set (GtkWidget *widget, GtkStyle *previous_style);
-static gboolean weekday_picker_focus (GtkWidget *widget, GtkDirectionType direction);
-static void colorize_items (WeekdayPicker *wp);
-
-static guint wp_signals[LAST_SIGNAL];
-
-G_DEFINE_TYPE (WeekdayPicker, weekday_picker, GNOME_TYPE_CANVAS);
-
-/* Class initialization function for the weekday picker */
-static void
-weekday_picker_class_init (WeekdayPickerClass *class)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
-
- object_class = (GtkObjectClass *) class;
- widget_class = (GtkWidgetClass *) class;
-
- wp_signals[CHANGED] =
- gtk_signal_new ("changed",
- GTK_RUN_FIRST,
- G_TYPE_FROM_CLASS (object_class),
- GTK_SIGNAL_OFFSET (WeekdayPickerClass, changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- object_class->destroy = weekday_picker_destroy;
-
- widget_class->realize = weekday_picker_realize;
- widget_class->size_request = weekday_picker_size_request;
- widget_class->size_allocate = weekday_picker_size_allocate;
- widget_class->style_set = weekday_picker_style_set;
- widget_class->focus = weekday_picker_focus;
-
- class->changed = NULL;
-}
-
-static void
-day_clicked (WeekdayPicker *wp, int index)
-{
- WeekdayPickerPrivate *priv = wp->priv;
- guint8 day_mask;
-
- if (priv->blocked_day_mask & (0x1 << index))
- return;
-
- if (priv->day_mask & (0x1 << index))
- day_mask = priv->day_mask & ~(0x1 << index);
- else
- day_mask = priv->day_mask | (0x1 << index);
-
- weekday_picker_set_days (wp, day_mask);
-}
-
-static gint
-handle_key_press_event (WeekdayPicker *wp, GdkEvent *event)
-{
- WeekdayPickerPrivate *priv = wp->priv;
- guint keyval = event->key.keyval;
-
- if (priv->focus_day == -1)
- priv->focus_day = priv->week_start_day;
-
- switch (keyval) {
- case GDK_Up:
- case GDK_Right:
- priv->focus_day += 1;
- break;
- case GDK_Down:
- case GDK_Left:
- priv->focus_day -= 1;
- break;
- case GDK_space:
- case GDK_Return:
- day_clicked (wp, priv->focus_day);
- return TRUE;
- default:
- return FALSE;
- }
-
- if (priv->focus_day > 6)
- priv->focus_day = 0;
- if (priv->focus_day < 0)
- priv->focus_day = 6;
-
- colorize_items (wp);
- gnome_canvas_item_grab_focus (priv->boxes[priv->focus_day]);
- return TRUE;
-}
-
-/* Event handler for the day items */
-static gint
-day_event_cb (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
-{
- WeekdayPicker *wp;
- WeekdayPickerPrivate *priv;
- int i;
-
- wp = WEEKDAY_PICKER (data);
- priv = wp->priv;
-
- if (event->type == GDK_KEY_PRESS)
- return handle_key_press_event(wp, event);
-
- if (!(event->type == GDK_BUTTON_PRESS && event->button.button == 1))
- return FALSE;
-
- /* Find which box was clicked */
-
- for (i = 0; i < 7; i++)
- if (priv->boxes[i] == item || priv->labels[i] == item)
- break;
-
- g_assert (i != 7);
-
- i += priv->week_start_day;
- if (i >= 7)
- i -= 7;
-
- priv->focus_day = i;
- gnome_canvas_item_grab_focus (priv->boxes[i]);
- day_clicked (wp, i);
- return TRUE;
-}
-
-
-/* Creates the canvas items for the weekday picker. The items are empty until
- * they are configured elsewhere.
- */
-static void
-create_items (WeekdayPicker *wp)
-{
- WeekdayPickerPrivate *priv;
- GnomeCanvasGroup *parent;
- int i;
-
- priv = wp->priv;
-
- parent = gnome_canvas_root (GNOME_CANVAS (wp));
-
- for (i = 0; i < 7; i++) {
- priv->boxes[i] = gnome_canvas_item_new (parent,
- GNOME_TYPE_CANVAS_RECT,
- NULL);
- g_signal_connect (priv->boxes[i], "event", G_CALLBACK (day_event_cb), wp);
-
- priv->labels[i] = gnome_canvas_item_new (parent,
- GNOME_TYPE_CANVAS_TEXT,
- NULL);
- g_signal_connect (priv->labels[i], "event", G_CALLBACK (day_event_cb), wp);
- }
-}
-
-/* Object initialization function for the weekday picker */
-static void
-weekday_picker_init (WeekdayPicker *wp)
-{
- WeekdayPickerPrivate *priv;
-
- priv = g_new0 (WeekdayPickerPrivate, 1);
-
- wp->priv = priv;
-
- create_items (wp);
- priv->focus_day = -1;
-}
-
-/* Finalize handler for the weekday picker */
-static void
-weekday_picker_destroy (GtkObject *object)
-{
- WeekdayPicker *wp;
- WeekdayPickerPrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_WEEKDAY_PICKER (object));
-
- wp = WEEKDAY_PICKER (object);
- priv = wp->priv;
-
- g_free (priv);
- wp->priv = NULL;
-
- if (GTK_OBJECT_CLASS (weekday_picker_parent_class)->destroy)
- (* GTK_OBJECT_CLASS (weekday_picker_parent_class)->destroy) (object);
-}
-
-static void
-colorize_items (WeekdayPicker *wp)
-{
- WeekdayPickerPrivate *priv;
- GdkColor *outline, *focus_outline;
- GdkColor *fill, *sel_fill;
- GdkColor *text_fill, *sel_text_fill;
- int i;
-
- priv = wp->priv;
-
- outline = &GTK_WIDGET (wp)->style->fg[GTK_WIDGET_STATE (wp)];
- focus_outline = &GTK_WIDGET (wp)->style->bg[GTK_WIDGET_STATE (wp)];
-
- fill = &GTK_WIDGET (wp)->style->base[GTK_WIDGET_STATE (wp)];
- text_fill = &GTK_WIDGET (wp)->style->fg[GTK_WIDGET_STATE (wp)];
-
- sel_fill = &GTK_WIDGET (wp)->style->bg[GTK_STATE_SELECTED];
- sel_text_fill = &GTK_WIDGET (wp)->style->fg[GTK_STATE_SELECTED];
-
- for (i = 0; i < 7; i++) {
- int day;
- GdkColor *f, *t, *o;
-
- day = i + priv->week_start_day;
- if (day >= 7)
- day -= 7;
-
- if (priv->day_mask & (0x1 << day)) {
- f = sel_fill;
- t = sel_text_fill;
- } else {
- f = fill;
- t = text_fill;
- }
-
- if (day == priv->focus_day)
- o = focus_outline;
- else
- o = outline;
-
- gnome_canvas_item_set (priv->boxes[i],
- "fill_color_gdk", f,
- "outline_color_gdk", o,
- NULL);
-
- gnome_canvas_item_set (priv->labels[i],
- "fill_color_gdk", t,
- NULL);
- }
-}
-
-/* Configures the items in the weekday picker by setting their attributes. */
-static char *
-get_day_text (int day_index)
-{
- /* The first letter of each day of the week starting with Sunday */
- const char *str = _("SMTWTFS");
- char *day;
- int char_size = 0;
-
- day = g_utf8_offset_to_pointer (str, day_index);
-
- /* we use strlen because we actually want to count bytes */
- if (day_index == 6)
- char_size = strlen (day);
- else
- char_size = strlen (day) - strlen (g_utf8_find_next_char (day, NULL));
-
- return g_strndup (day, char_size);
-}
-
-static void
-configure_items (WeekdayPicker *wp)
-{
- WeekdayPickerPrivate *priv;
- int width, height;
- int box_width;
- int i;
-
- priv = wp->priv;
-
- width = GTK_WIDGET (wp)->allocation.width;
- height = GTK_WIDGET (wp)->allocation.height;
-
- box_width = (width - 1) / 7;
-
- for (i = 0; i < 7; i++) {
- char *c;
- int day;
-
- day = i + priv->week_start_day;
- if (day >= 7)
- day -= 7;
-
- gnome_canvas_item_set (priv->boxes[i],
- "x1", (double) (i * box_width),
- "y1", (double) 0,
- "x2", (double) ((i + 1) * box_width),
- "y2", (double) (height - 1),
- "width_pixels", 0,
- NULL);
-
- c = get_day_text (day);
- gnome_canvas_item_set (priv->labels[i],
- "text", c,
-#if 0
- "font_gdk", gtk_style_get_font (gtk_widget_get_style (GTK_WIDGET (wp))),
-#endif
- "x", (double) (i * box_width) + box_width / 2.0,
- "y", (double) (1 + PADDING),
- "anchor", GTK_ANCHOR_N,
- NULL);
- g_free (c);
- }
-
- colorize_items (wp);
-}
-
-/* Realize handler for the weekday picker */
-static void
-weekday_picker_realize (GtkWidget *widget)
-{
- WeekdayPicker *wp;
-
- wp = WEEKDAY_PICKER (widget);
-
- if (GTK_WIDGET_CLASS (weekday_picker_parent_class)->realize)
- (* GTK_WIDGET_CLASS (weekday_picker_parent_class)->realize) (widget);
-
- configure_items (wp);
-}
-
-/* Size_request handler for the weekday picker */
-static void
-weekday_picker_size_request (GtkWidget *widget, GtkRequisition *requisition)
-{
- WeekdayPicker *wp;
- WeekdayPickerPrivate *priv;
-
- wp = WEEKDAY_PICKER (widget);
- priv = wp->priv;
-
- requisition->width = (priv->max_letter_width + 2 * PADDING + 1) * 7 + 1;
- requisition->height = (priv->font_ascent + priv->font_descent + 2 * PADDING + 2);
-}
-
-/* Size_allocate handler for the weekday picker */
-static void
-weekday_picker_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
-{
- WeekdayPicker *wp;
-
- wp = WEEKDAY_PICKER (widget);
-
- if (GTK_WIDGET_CLASS (weekday_picker_parent_class)->size_allocate)
- (* GTK_WIDGET_CLASS (weekday_picker_parent_class)->size_allocate) (widget, allocation);
-
- gnome_canvas_set_scroll_region (GNOME_CANVAS (wp),
- 0, 0, allocation->width, allocation->height);
-
- configure_items (wp);
-}
-
-/* Style_set handler for the weekday picker */
-static void
-weekday_picker_style_set (GtkWidget *widget, GtkStyle *previous_style)
-{
- WeekdayPicker *wp;
- WeekdayPickerPrivate *priv;
- int max_width;
- int i;
- PangoFontDescription *font_desc;
- PangoContext *pango_context;
- PangoFontMetrics *font_metrics;
- PangoLayout *layout;
-
- wp = WEEKDAY_PICKER (widget);
- priv = wp->priv;
-
- /* Set up Pango prerequisites */
- font_desc = gtk_widget_get_style (widget)->font_desc;
- pango_context = gtk_widget_get_pango_context (widget);
- font_metrics = pango_context_get_metrics (pango_context, font_desc,
- pango_context_get_language (pango_context));
- layout = pango_layout_new (pango_context);
-
- priv->font_ascent = PANGO_PIXELS (pango_font_metrics_get_ascent (font_metrics));
- priv->font_descent = PANGO_PIXELS (pango_font_metrics_get_descent (font_metrics));
-
- max_width = 0;
-
- for (i = 0; i < 7; i++) {
- char *c;
- int w;
-
- c = get_day_text (i);
- pango_layout_set_text (layout, c, strlen (c));
- pango_layout_get_pixel_size (layout, &w, NULL);
- g_free (c);
-
- if (w > max_width)
- max_width = w;
- }
-
- priv->max_letter_width = max_width;
-
- configure_items (wp);
- g_object_unref (layout);
- pango_font_metrics_unref (font_metrics);
-
- if (GTK_WIDGET_CLASS (weekday_picker_parent_class)->style_set)
- (* GTK_WIDGET_CLASS (weekday_picker_parent_class)->style_set) (widget, previous_style);
-}
-
-
-
-/**
- * weekday_picker_new:
- * @void:
- *
- * Creates a new weekday picker widget.
- *
- * Return value: A newly-created weekday picker.
- **/
-GtkWidget *
-weekday_picker_new (void)
-{
- return g_object_new (TYPE_WEEKDAY_PICKER, NULL);
-}
-
-/**
- * weekday_picker_set_days:
- * @wp: A weekday picker.
- * @day_mask: Bitmask with the days to be selected.
- *
- * Sets the days that are selected in a weekday picker. In the @day_mask,
- * Sunday is bit 0, Monday is bit 1, etc.
- **/
-void
-weekday_picker_set_days (WeekdayPicker *wp, guint8 day_mask)
-{
- WeekdayPickerPrivate *priv;
-
- g_return_if_fail (wp != NULL);
- g_return_if_fail (IS_WEEKDAY_PICKER (wp));
-
- priv = wp->priv;
-
- priv->day_mask = day_mask;
- colorize_items (wp);
-
- gtk_signal_emit (GTK_OBJECT (wp), wp_signals[CHANGED]);
-}
-
-/**
- * weekday_picker_get_days:
- * @wp: A weekday picker.
- *
- * Queries the days that are selected in a weekday picker.
- *
- * Return value: Bit mask of selected days. Sunday is bit 0, Monday is bit 1,
- * etc.
- **/
-guint8
-weekday_picker_get_days (WeekdayPicker *wp)
-{
- WeekdayPickerPrivate *priv;
-
- g_return_val_if_fail (wp != NULL, 0);
- g_return_val_if_fail (IS_WEEKDAY_PICKER (wp), 0);
-
- priv = wp->priv;
- return priv->day_mask;
-}
-
-/**
- * weekday_picker_set_blocked_days:
- * @wp: A weekday picker.
- * @blocked_day_mask: Bitmask with the days to be blocked.
- *
- * Sets the days that the weekday picker will prevent from being modified by the
- * user. The @blocked_day_mask is specified in the same way as in
- * weekday_picker_set_days().
- **/
-void
-weekday_picker_set_blocked_days (WeekdayPicker *wp, guint8 blocked_day_mask)
-{
- WeekdayPickerPrivate *priv;
-
- g_return_if_fail (wp != NULL);
- g_return_if_fail (IS_WEEKDAY_PICKER (wp));
-
- priv = wp->priv;
- priv->blocked_day_mask = blocked_day_mask;
-}
-
-/**
- * weekday_picker_get_blocked_days:
- * @wp: A weekday picker.
- *
- * Queries the set of days that the weekday picker prevents from being modified
- * by the user.
- *
- * Return value: Bit mask of blocked days, with the same format as that returned
- * by weekday_picker_get_days().
- **/
-guint
-weekday_picker_get_blocked_days (WeekdayPicker *wp)
-{
- WeekdayPickerPrivate *priv;
-
- g_return_val_if_fail (wp != NULL, 0);
- g_return_val_if_fail (IS_WEEKDAY_PICKER (wp), 0);
-
- priv = wp->priv;
- return priv->blocked_day_mask;
-}
-
-/**
- * weekday_picker_set_week_start_day:
- * @wp: A weekday picker.
- * @week_start_day: Index of the day that defines the start of the week; 0 is
- * Sunday, 1 is Monday, etc.
- *
- * Sets the day that defines the start of the week for a weekday picker.
- **/
-void
-weekday_picker_set_week_start_day (WeekdayPicker *wp, int week_start_day)
-{
- WeekdayPickerPrivate *priv;
-
- g_return_if_fail (wp != NULL);
- g_return_if_fail (IS_WEEKDAY_PICKER (wp));
- g_return_if_fail (week_start_day >= 0 && week_start_day < 7);
-
- priv = wp->priv;
- priv->week_start_day = week_start_day;
-
- configure_items (wp);
-}
-
-/**
- * weekday_picker_get_week_start_day:
- * @wp: A weekday picker.
- *
- * Queries the day that defines the start of the week in a weekday picker.
- *
- * Return value: Index of the day that defines the start of the week. See
- * weekday_picker_set_week_start_day() to see how this is represented.
- **/
-int
-weekday_picker_get_week_start_day (WeekdayPicker *wp)
-{
- WeekdayPickerPrivate *priv;
-
- g_return_val_if_fail (wp != NULL, -1);
- g_return_val_if_fail (IS_WEEKDAY_PICKER (wp), -1);
-
- priv = wp->priv;
- return priv->week_start_day;
-}
-
-/* focus handler for weekday picker */
-static gboolean
-weekday_picker_focus (GtkWidget *widget, GtkDirectionType direction)
-{
- WeekdayPicker *wp;
- WeekdayPickerPrivate *priv;
-
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (IS_WEEKDAY_PICKER (widget), FALSE);
- wp = WEEKDAY_PICKER (widget);
- priv = wp->priv;
-
- if (!GTK_WIDGET_CAN_FOCUS (widget))
- return FALSE;
-
- if (GTK_WIDGET_HAS_FOCUS (widget)) {
- priv->focus_day = -1;
- colorize_items (wp);
- return FALSE;
- }
-
- priv->focus_day = priv->week_start_day;
- gnome_canvas_item_grab_focus (priv->boxes[priv->focus_day]);
- colorize_items (wp);
-
- return TRUE;
-}
diff --git a/calendar/gui/weekday-picker.h b/calendar/gui/weekday-picker.h
deleted file mode 100644
index 67a72f9ebd..0000000000
--- a/calendar/gui/weekday-picker.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Evolution calendar - Week day picker widget
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef WEEKDAY_PICKER_H
-#define WEEKDAY_PICKER_H
-
-#include <libgnomecanvas/gnome-canvas.h>
-
-G_BEGIN_DECLS
-
-
-
-#define TYPE_WEEKDAY_PICKER (weekday_picker_get_type ())
-#define WEEKDAY_PICKER(obj) (GTK_CHECK_CAST ((obj), TYPE_WEEKDAY_PICKER, WeekdayPicker))
-#define WEEKDAY_PICKER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_WEEKDAY_PICKER, \
- WeekdayPickerClass))
-#define IS_WEEKDAY_PICKER(obj) (GTK_CHECK_TYPE ((obj), TYPE_WEEKDAY_PICKER))
-#define IS_WEEKDAY_PICKER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), TYPE_WEEKDAY_PICKER))
-
-typedef struct _WeekdayPicker WeekdayPicker;
-typedef struct _WeekdayPickerClass WeekdayPickerClass;
-typedef struct _WeekdayPickerPrivate WeekdayPickerPrivate;
-
-struct _WeekdayPicker {
- GnomeCanvas canvas;
-
- /* Private data */
- WeekdayPickerPrivate *priv;
-};
-
-struct _WeekdayPickerClass {
- GnomeCanvasClass parent_class;
-
- void (* changed) (WeekdayPicker *wp);
-};
-
-GtkType weekday_picker_get_type (void);
-
-GtkWidget *weekday_picker_new (void);
-
-void weekday_picker_set_days (WeekdayPicker *wp, guint8 day_mask);
-guint8 weekday_picker_get_days (WeekdayPicker *wp);
-
-void weekday_picker_set_blocked_days (WeekdayPicker *wp, guint8 blocked_day_mask);
-guint weekday_picker_get_blocked_days (WeekdayPicker *wp);
-
-void weekday_picker_set_week_start_day (WeekdayPicker *wp, int week_start_day);
-int weekday_picker_get_week_start_day (WeekdayPicker *wp);
-
-
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/idl/.cvsignore b/calendar/idl/.cvsignore
deleted file mode 100644
index b840c21800..0000000000
--- a/calendar/idl/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile.in
-Makefile \ No newline at end of file
diff --git a/calendar/idl/Makefile.am b/calendar/idl/Makefile.am
deleted file mode 100644
index dd866141fc..0000000000
--- a/calendar/idl/Makefile.am
+++ /dev/null
@@ -1,5 +0,0 @@
-idl_DATA = \
- evolution-calendar.idl
-
-EXTRA_DIST = \
- $(idl_DATA)
diff --git a/calendar/idl/evolution-calendar.idl b/calendar/idl/evolution-calendar.idl
deleted file mode 100644
index 48f7281ab3..0000000000
--- a/calendar/idl/evolution-calendar.idl
+++ /dev/null
@@ -1,52 +0,0 @@
-/* Evolution calendar interface
- *
- * Copyright (C) 2000 Eskil Heyn Olsen
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: Eskil Heyn Olsen <deity@eskil.dk>
- * Federico Mena-Quintero <federico@ximian.com>
- */
-
-#ifndef _EVOLUTION_CALENDAR_IDL_
-#define _EVOLUTION_CALENDAR_IDL_
-
-#include <Bonobo.idl>
-#include <Evolution-DataServer-Calendar.idl>
-
-module GNOME {
-module Evolution {
-
-module Calendar {
- /* Factory to centralize calendar component editor dialogs */
- interface CompEditorFactory : Bonobo::Unknown {
- exception InvalidURI {};
- exception BackendContactError {};
- exception UnsupportedType {};
-
- typedef long CompEditorMode;
- const CompEditorMode EDITOR_MODE_EVENT = 1 << 0;
- const CompEditorMode EDITOR_MODE_ALLDAY_EVENT = 1 << 1;
- const CompEditorMode EDITOR_MODE_MEETING = 1 << 2;
- const CompEditorMode EDITOR_MODE_TODO = 1 << 3;
-
- /* Loads a calendar and opens an editor for the specified object */
- /* FIXME Its nasty to use CompEditorMode to pass event/todo source type
- but it saves adding yet another corba type - only MODE_EVENT or
- MODE_TODO should be passed here */
- void editExisting (in string uri, in CalObjUID uid, in CompEditorMode mode)
- raises (InvalidURI, BackendContactError);
-
- /* Loads a calendar and creates a new component of the specified type */
- void editNew (in string uri, in CompEditorMode mode)
- raises (InvalidURI, BackendContactError, UnsupportedType);
- };
-
- interface AlarmNotify : Bonobo::Unknown {
- };
-};
-
-};
-};
-
-#endif
diff --git a/calendar/importers/.cvsignore b/calendar/importers/.cvsignore
deleted file mode 100644
index 99d6030704..0000000000
--- a/calendar/importers/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-.deps
-.libs
-Makefile
-Makefile.in
-evolution-calendar-importer
-GNOME_Evolution_Calendar_Importer*.server
diff --git a/calendar/importers/GNOME_Evolution_Calendar_Importer.server.in.in b/calendar/importers/GNOME_Evolution_Calendar_Importer.server.in.in
deleted file mode 100644
index 810905fbfa..0000000000
--- a/calendar/importers/GNOME_Evolution_Calendar_Importer.server.in.in
+++ /dev/null
@@ -1,54 +0,0 @@
-<oaf_info>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Calendar_ImporterFactory:@VERSION@"
- type="shlib"
- location="@IMPORTERSDIR@/libevolution-calendar-importers.so">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/ObjectFactory:1.0"/>
- </oaf_attribute>
- <oaf_attribute name="name" type="string"
- _value="Evolution iCalendar importer"/>
-</oaf_server>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Calendar_iCalendar_Importer:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Calendar_ImporterFactory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution/Importer:@VERSION@"/>
- </oaf_attribute>
- <oaf_attribute name="evolution:menu_name" type="string"
- _value="iCalendar files (.ics)"/>
- <oaf_attribute name="name" type="string"
- _value="Evolution iCalendar importer"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Calendar_vCalendar_Importer:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Calendar_ImporterFactory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution/Importer:@VERSION@"/>
- </oaf_attribute>
- <oaf_attribute name="evolution:menu_name" type="string"
- _value="vCalendar files (.vcf)"/>
- <oaf_attribute name="name" type="string"
- _value="Evolution vCalendar importer"/>
-
-</oaf_server>
-
-<oaf_server iid="OAFIID:GNOME_Evolution_Gnome_Calendar_Intelligent_Importer:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Calendar_ImporterFactory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution/IntelligentImporter:@VERSION@"/>
- </oaf_attribute>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution Calendar intelligent importer"/>
-
-</oaf_server>
-</oaf_info>
diff --git a/calendar/importers/Makefile.am b/calendar/importers/Makefile.am
deleted file mode 100644
index 369ce70c75..0000000000
--- a/calendar/importers/Makefile.am
+++ /dev/null
@@ -1,40 +0,0 @@
-importersdir = $(privlibdir)/evolution-calendar-importers
-
-importers_LTLIBRARIES = libevolution-calendar-importers.la
-
-INCLUDES = \
- -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \
- -DEVOLUTION_SOUNDDIR=\""$(soundsdir)"\" \
- -DG_LOG_DOMAIN=\"Evolution-Importer\" \
- -I$(top_srcdir) \
- -I$(top_builddir)/shell \
- -I$(top_srcdir)/shell \
- -I$(top_srcdir)/calendar \
- -I$(top_builddir)/calendar \
- $(EVOLUTION_CALENDAR_CFLAGS)
-
-libevolution_calendar_importers_la_SOURCES = \
- evolution-calendar-importer.h \
- icalendar-importer.c \
- main.c
-
-libevolution_calendar_importers_la_LDFLAGS = -avoid-version -module
-
-libevolution_calendar_importers_la_LIBADD = \
- $(top_builddir)/shell/importer/libevolution-importer.la \
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/calendar/common/libevolution-calendarprivate.la \
- $(IMPORTERS_LIBS)
-
-server_in_files = GNOME_Evolution_Calendar_Importer.server.in.in
-server_DATA = $(server_in_files:.server.in.in=_$(BASE_VERSION).server)
-@EVO_SERVER_RULE@
-@INTLTOOL_SERVER_RULE@
-
-BUILT_SOURCES = $(server_DATA)
-CLEANFILES = $(BUILT_SOURCES)
-
-EXTRA_DIST = $(server_in_files)
-
-dist-hook:
- cd $(distdir); rm -f $(BUILT_SOURCES)
diff --git a/calendar/importers/evolution-calendar-importer.h b/calendar/importers/evolution-calendar-importer.h
deleted file mode 100644
index 0691ee2cab..0000000000
--- a/calendar/importers/evolution-calendar-importer.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution calendar importer component
- *
- * Authors: Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef EVOLUTION_CALENDAR_IMPORTER_H
-#define EVOLUTION_CALENDAR_IMPORTER_H
-
-#include <bonobo/bonobo-object.h>
-
-G_BEGIN_DECLS
-
-BonoboObject *ical_importer_new (void);
-BonoboObject *vcal_importer_new (void);
-
-BonoboObject *gnome_calendar_importer_new (void);
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/importers/icalendar-importer.c b/calendar/importers/icalendar-importer.c
deleted file mode 100644
index 2e17d39f59..0000000000
--- a/calendar/importers/icalendar-importer.c
+++ /dev/null
@@ -1,738 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution calendar importer component
- *
- * Authors: Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <gtk/gtkcheckbutton.h>
-#include <gtk/gtkhbox.h>
-#include <gtk/gtkvbox.h>
-#include <gtk/gtkmain.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkradiobutton.h>
-#include <gtk/gtknotebook.h>
-#include <libgnome/gnome-util.h>
-#include <libgnome/gnome-i18n.h>
-#include <bonobo/bonobo-control.h>
-#include <bonobo/bonobo-exception.h>
-#include <libecal/e-cal.h>
-#include <libedataserverui/e-source-selector.h>
-#include <importer/evolution-importer.h>
-#include <importer/evolution-intelligent-importer.h>
-#include <importer/GNOME_Evolution_Importer.h>
-#include <libical/icalvcal.h>
-#include <e-util/e-dialog-widgets.h>
-#include "evolution-calendar-importer.h"
-#include "common/authentication.h"
-
-/* We timeout after 2 minutes, when opening the folders. */
-#define IMPORTER_TIMEOUT_SECONDS 120
-
-
-typedef struct {
- EvolutionImporter *importer;
-
- GtkWidget *nb;
-
- ESource *primary;
- ESourceSelector *selectors[E_CAL_SOURCE_TYPE_LAST];
-
- ECal *client;
- ECalSourceType source_type;
-
- icalcomponent *icalcomp;
-} ICalImporter;
-
-typedef struct {
- gboolean do_calendar;
- gboolean do_tasks;
-} ICalIntelligentImporter;
-
-static const int import_type_map[] = {
- E_CAL_SOURCE_TYPE_EVENT,
- E_CAL_SOURCE_TYPE_TODO,
- -1
-};
-
-static const char *import_type_strings[] = {
- N_("Appointments and Meetings"),
- N_("Tasks"),
- NULL
-};
-
-
-/*
- * Functions shared by iCalendar & vCalendar importer.
- */
-
-static void
-importer_destroy_cb (gpointer user_data)
-{
- ICalImporter *ici = (ICalImporter *) user_data;
-
- g_return_if_fail (ici != NULL);
-
- if (ici->client)
- g_object_unref (ici->client);
-
- if (ici->icalcomp != NULL) {
- icalcomponent_free (ici->icalcomp);
- ici->icalcomp = NULL;
- }
-
- g_free (ici);
-}
-
-/* This removes all components except VEVENTs and VTIMEZONEs from the toplevel */
-static void
-prepare_events (icalcomponent *icalcomp, GList **vtodos)
-{
- icalcomponent *subcomp;
- icalcompiter iter;
-
- if (vtodos)
- *vtodos = NULL;
-
- iter = icalcomponent_begin_component (icalcomp, ICAL_ANY_COMPONENT);
- while ((subcomp = icalcompiter_deref (&iter)) != NULL) {
- icalcomponent_kind child_kind = icalcomponent_isa (subcomp);
- if (child_kind != ICAL_VEVENT_COMPONENT
- && child_kind != ICAL_VTIMEZONE_COMPONENT) {
-
- icalcompiter_next (&iter);
-
- icalcomponent_remove_component (icalcomp, subcomp);
- if (child_kind == ICAL_VTODO_COMPONENT && vtodos)
- *vtodos = g_list_prepend (*vtodos, subcomp);
- else
- icalcomponent_free (subcomp);
- }
-
- icalcompiter_next (&iter);
- }
-}
-
-
-/* This removes all components except VTODOs and VTIMEZONEs from the toplevel
- icalcomponent, and adds the given list of VTODO components. The list is
- freed afterwards. */
-static void
-prepare_tasks (icalcomponent *icalcomp, GList *vtodos)
-{
- icalcomponent *subcomp;
- GList *elem;
- icalcompiter iter;
-
- iter = icalcomponent_begin_component (icalcomp, ICAL_ANY_COMPONENT);
- while ((subcomp = icalcompiter_deref (&iter)) != NULL) {
- icalcomponent_kind child_kind = icalcomponent_isa (subcomp);
- if (child_kind != ICAL_VTODO_COMPONENT
- && child_kind != ICAL_VTIMEZONE_COMPONENT) {
- icalcompiter_next (&iter);
- icalcomponent_remove_component (icalcomp, subcomp);
- icalcomponent_free (subcomp);
- }
-
- icalcompiter_next (&iter);
- }
-
- for (elem = vtodos; elem; elem = elem->next) {
- icalcomponent_add_component (icalcomp, elem->data);
- }
- g_list_free (vtodos);
-}
-
-static gboolean
-update_single_object (ECal *client, icalcomponent *icalcomp)
-{
- char *uid;
- icalcomponent *tmp_icalcomp;
-
- uid = (char *) icalcomponent_get_uid (icalcomp);
-
- /* FIXME Shouldn't we check for RIDs here? */
- /* FIXME Should we always create a new UID? */
- if (uid && e_cal_get_object (client, uid, NULL, &tmp_icalcomp, NULL))
- return e_cal_modify_object (client, icalcomp, CALOBJ_MOD_ALL, NULL);
-
- return e_cal_create_object (client, icalcomp, &uid, NULL);
-}
-
-static gboolean
-update_objects (ECal *client, icalcomponent *icalcomp)
-{
- icalcomponent *subcomp;
- icalcomponent_kind kind;
- icalcomponent *vcal;
- GError *error = NULL;
- gboolean success = TRUE;
-
- kind = icalcomponent_isa (icalcomp);
- if (kind == ICAL_VTODO_COMPONENT || kind == ICAL_VEVENT_COMPONENT) {
- vcal = e_cal_util_new_top_level ();
- if (icalcomponent_get_method (icalcomp) == ICAL_METHOD_CANCEL)
- icalcomponent_set_method (vcal, ICAL_METHOD_CANCEL);
- else
- icalcomponent_set_method (vcal, ICAL_METHOD_PUBLISH);
- icalcomponent_add_component (vcal, icalcomponent_new_clone (icalcomp));
- } else if (kind == ICAL_VCALENDAR_COMPONENT) {
- vcal = icalcomponent_new_clone (icalcomp);
- if (!icalcomponent_get_first_property (vcal, ICAL_METHOD_PROPERTY))
- icalcomponent_set_method (vcal, ICAL_METHOD_PUBLISH);
- } else
- return FALSE;
-
- if (!e_cal_receive_objects (client, vcal, NULL))
- success = FALSE;
-
- icalcomponent_free (vcal);
-
- return success;
-}
-
-static void
-button_toggled_cb (GtkWidget *widget, gpointer data)
-{
- ICalImporter *ici = data;
-
- ici->source_type = e_dialog_radio_get (widget, import_type_map);
- gtk_notebook_set_current_page (GTK_NOTEBOOK (ici->nb), ici->source_type);
-
- /* If we switched pages we have a new primary source */
- if (ici->primary)
- g_object_unref (ici->primary);
- ici->primary = g_object_ref (e_source_selector_peek_primary_selection (ici->selectors[ici->source_type]));
-}
-
-static void
-primary_selection_changed_cb (ESourceSelector *selector, gpointer data)
-{
- ICalImporter *ici = data;
-
- if (ici->primary)
- g_object_unref (ici->primary);
- ici->primary = g_object_ref (e_source_selector_peek_primary_selection (selector));
-}
-
-static void
-create_control_fn (EvolutionImporter *importer, Bonobo_Control *control, void *closure)
-{
- ICalImporter *ici = (ICalImporter *) closure;
- GtkWidget *vbox, *hbox, *rb = NULL;
- GSList *group = NULL;
- ESourceList *source_list;
- int i;
-
- vbox = gtk_vbox_new (FALSE, FALSE);
-
- hbox = gtk_hbox_new (FALSE, FALSE);
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 6);
-
- /* Type of icalendar items */
- for (i = 0; import_type_map[i] != -1; i++) {
- rb = gtk_radio_button_new_with_label (group, import_type_strings[i]);
- gtk_box_pack_start (GTK_BOX (hbox), rb, FALSE, FALSE, 6);
- g_signal_connect (G_OBJECT (rb), "toggled", G_CALLBACK (button_toggled_cb), ici);
- if (!group)
- group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (rb));
- }
- e_dialog_radio_set (rb, import_type_map[0], import_type_map);
-
- /* The source selector notebook */
- ici->nb = gtk_notebook_new ();
- gtk_notebook_set_show_tabs (GTK_NOTEBOOK (ici->nb), FALSE);
- gtk_container_add (GTK_CONTAINER (vbox), ici->nb);
-
- /* The source selectors */
- for (i = 0; import_type_map[i] != -1; i++) {
- GtkWidget *selector;
- ESource *primary;
-
- /* FIXME Better error handling */
- if (!e_cal_get_sources (&source_list, import_type_map[i], NULL))
- return;
-
- selector = e_source_selector_new (source_list);
- e_source_selector_show_selection (E_SOURCE_SELECTOR (selector), FALSE);
- gtk_notebook_append_page (GTK_NOTEBOOK (ici->nb), selector, NULL);
-
- /* FIXME What if no sources? */
- primary = e_source_list_peek_source_any (source_list);
- e_source_selector_set_primary_selection (E_SOURCE_SELECTOR (selector), primary);
- if (!ici->primary)
- ici->primary = g_object_ref (primary);
- g_object_unref (source_list);
-
- g_signal_connect (G_OBJECT (selector), "primary_selection_changed",
- G_CALLBACK (primary_selection_changed_cb), ici);
-
- ici->selectors[import_type_map[i]] = E_SOURCE_SELECTOR (selector);
- }
-
- gtk_widget_show_all (vbox);
-
- *control = BONOBO_OBJREF (bonobo_control_new (vbox));
-}
-
-static void
-process_item_fn (EvolutionImporter *importer,
- CORBA_Object listener,
- void *closure,
- CORBA_Environment *ev)
-{
- ECalLoadState state;
- ICalImporter *ici = (ICalImporter *) closure;
- GNOME_Evolution_ImporterListener_ImporterResult result;
-
- result = GNOME_Evolution_ImporterListener_OK;
-
- g_return_if_fail (ici != NULL);
- g_return_if_fail (ici->icalcomp != NULL);
-
- state = e_cal_get_load_state (ici->client);
- if (state == E_CAL_LOAD_LOADING) {
- GNOME_Evolution_ImporterListener_notifyResult (
- listener,
- GNOME_Evolution_ImporterListener_BUSY,
- TRUE, ev);
- return;
- } else if (state != E_CAL_LOAD_LOADED) {
- GNOME_Evolution_ImporterListener_notifyResult (
- listener,
- GNOME_Evolution_ImporterListener_UNSUPPORTED_OPERATION,
- FALSE, ev);
- return;
- }
-
- switch (ici->source_type) {
- case E_CAL_SOURCE_TYPE_EVENT:
- prepare_events (ici->icalcomp, NULL);
- if (!update_objects (ici->client, ici->icalcomp))
- result = GNOME_Evolution_ImporterListener_BAD_DATA;
- break;
- case E_CAL_SOURCE_TYPE_TODO:
- prepare_tasks (ici->icalcomp, NULL);
- if (!update_objects (ici->client, ici->icalcomp))
- result = GNOME_Evolution_ImporterListener_BAD_DATA;
- break;
- default:
- g_assert_not_reached ();
- }
-
- GNOME_Evolution_ImporterListener_notifyResult (listener, result, FALSE, ev);
-}
-
-
-/*
- * iCalendar importer functions.
- */
-
-static gboolean
-support_format_fn (EvolutionImporter *importer,
- const char *filename,
- void *closure)
-{
- char *contents ;
- icalcomponent *icalcomp;
- gboolean ret = FALSE;
-
- if (g_file_get_contents (filename, &contents, NULL, NULL)) {
- /* parse the file */
- icalcomp = icalparser_parse_string (contents);
- g_free (contents);
-
- if (icalcomp) {
- if (icalcomponent_is_valid (icalcomp))
- ret = TRUE;
- else
- ret = FALSE;
- icalcomponent_free (icalcomp);
- }
- }
-
- return ret;
-}
-
-static gboolean
-load_file_fn (EvolutionImporter *importer,
- const char *filename,
- void *closure)
-{
- char *contents;
- gboolean ret = FALSE;
- ICalImporter *ici = (ICalImporter *) closure;
-
- g_return_val_if_fail (ici != NULL, FALSE);
-
- if (g_file_get_contents (filename, &contents, NULL, NULL)) {
- icalcomponent *icalcomp;
-
- /* parse the file */
- icalcomp = icalparser_parse_string (contents);
- g_free (contents);
-
- if (icalcomp) {
- /* create the neccessary ECal */
- if (ici->client)
- g_object_unref (ici->client);
- ici->client = auth_new_cal_from_source (ici->primary, ici->source_type);
-
- if (ici->client) {
- if (e_cal_open (ici->client, TRUE, NULL)) {
- ici->icalcomp = icalcomp;
- ret = TRUE;
- }
- }
- }
- }
-
- return ret;
-}
-
-BonoboObject *
-ical_importer_new (void)
-{
- ICalImporter *ici;
-
- ici = g_new0 (ICalImporter, 1);
-
- ici->client = NULL;
- ici->icalcomp = NULL;
- ici->importer = evolution_importer_new (create_control_fn,
- support_format_fn,
- load_file_fn,
- process_item_fn,
- NULL,
- ici);
-
- g_object_weak_ref (G_OBJECT (ici->importer), (GWeakNotify) importer_destroy_cb, ici);
-
- return BONOBO_OBJECT (ici->importer);
-}
-
-
-
-/*
- * vCalendar importer functions.
- */
-
-static gboolean
-vcal_support_format_fn (EvolutionImporter *importer,
- const char *filename,
- void *closure)
-{
- char *contents;
- gboolean ret = FALSE;
-
- if (g_file_get_contents (filename, &contents, NULL, NULL)) {
- VObject *vcal;
-
- /* parse the file */
- vcal = Parse_MIME (contents, strlen (contents));
- g_free (contents);
-
- if (vcal) {
- icalcomponent *icalcomp;
-
- icalcomp = icalvcal_convert (vcal);
-
- if (icalcomp) {
- icalcomponent_free (icalcomp);
- ret = TRUE;
- }
-
- cleanVObject (vcal);
- }
- }
-
- return ret;
-}
-
-/* This tries to load in a vCalendar file and convert it to an icalcomponent.
- It returns NULL on failure. */
-static icalcomponent*
-load_vcalendar_file (const char *filename)
-{
- icalvcal_defaults defaults = { 0 };
- icalcomponent *icalcomp = NULL;
- char *contents;
-
- defaults.alarm_audio_url = "file://" EVOLUTION_SOUNDDIR "/default_alarm.wav";
- defaults.alarm_audio_fmttype = "audio/x-wav";
- defaults.alarm_description = (char*) _("Reminder!!");
-
- if (g_file_get_contents (filename, &contents, NULL, NULL)) {
- VObject *vcal;
-
- /* parse the file */
- vcal = Parse_MIME (contents, strlen (contents));
- g_free (contents);
-
- if (vcal) {
- icalcomp = icalvcal_convert_with_defaults (vcal,
- &defaults);
- cleanVObject (vcal);
- }
- }
-
- return icalcomp;
-}
-
-static gboolean
-vcal_load_file_fn (EvolutionImporter *importer,
- const char *filename,
- void *closure)
-{
- gboolean ret = FALSE;
- ICalImporter *ici = (ICalImporter *) closure;
- icalcomponent *icalcomp;
-
- g_return_val_if_fail (ici != NULL, FALSE);
-
- icalcomp = load_vcalendar_file (filename);
- if (icalcomp) {
- /* create the neccessary ECal */
- if (ici->client)
- g_object_unref (ici->client);
- ici->client = auth_new_cal_from_source (ici->primary, ici->source_type);
-
- if (ici->client) {
- if (e_cal_open (ici->client, TRUE, NULL)) {
- ici->icalcomp = icalcomp;
- ret = TRUE;
- }
- }
- }
-
- return ret;
-}
-
-BonoboObject *
-vcal_importer_new (void)
-{
- ICalImporter *ici;
-
- ici = g_new0 (ICalImporter, 1);
- ici->icalcomp = NULL;
- ici->importer = evolution_importer_new (create_control_fn,
- vcal_support_format_fn,
- vcal_load_file_fn,
- process_item_fn,
- NULL,
- ici);
-
- g_object_weak_ref (G_OBJECT (ici->importer), (GWeakNotify) importer_destroy_cb, ici);
-
- return BONOBO_OBJECT (ici->importer);
-}
-
-
-
-
-
-
-static void
-gnome_calendar_importer_destroy_cb (gpointer user_data)
-{
- ICalIntelligentImporter *ici = (ICalIntelligentImporter *) user_data;
-
- g_return_if_fail (ici != NULL);
-
- g_free (ici);
-}
-
-
-
-static gboolean
-gnome_calendar_can_import_fn (EvolutionIntelligentImporter *ii,
- void *closure)
-{
- char *filename;
- gboolean gnome_calendar_exists;
-
- filename = gnome_util_home_file ("user-cal.vcf");
- gnome_calendar_exists = g_file_exists (filename);
- g_free (filename);
-
- return gnome_calendar_exists;
-}
-
-
-static void
-gnome_calendar_import_data_fn (EvolutionIntelligentImporter *ii,
- void *closure)
-{
- ICalIntelligentImporter *ici = closure;
- icalcomponent *icalcomp = NULL;
- char *filename;
- GList *vtodos;
- ECal *calendar_client = NULL, *tasks_client = NULL;
- int t;
-
- /* If neither is selected, just return. */
- if (!ici->do_calendar && !ici->do_tasks) {
- return;
- }
-
- /* Try to open the default calendar & tasks folders. */
- if (ici->do_calendar) {
- calendar_client = auth_new_cal_from_default (E_CAL_SOURCE_TYPE_EVENT);
- goto out;
- }
-
- if (ici->do_tasks) {
- tasks_client = auth_new_cal_from_default (E_CAL_SOURCE_TYPE_TODO);
- if (!tasks_client)
- goto out;
- }
-
- /* Load the Gnome Calendar file and convert to iCalendar. */
- filename = gnome_util_home_file ("user-cal.vcf");
- icalcomp = load_vcalendar_file (filename);
- g_free (filename);
-
- /* If we couldn't load the file, just return. FIXME: Error message? */
- if (!icalcomp)
- goto out;
-
- /*
- * Import the calendar events into the default calendar folder.
- */
- prepare_events (icalcomp, &vtodos);
-
- /* Wait for client to finish opening the calendar & tasks folders. */
- for (t = 0; t < IMPORTER_TIMEOUT_SECONDS; t++) {
- ECalLoadState calendar_state, tasks_state;
-
- calendar_state = tasks_state = E_CAL_LOAD_LOADED;
-
- /* We need this so the ECal gets notified that the
- folder is opened, via Corba. */
- while (gtk_events_pending ())
- gtk_main_iteration ();
-
- if (ici->do_calendar)
- calendar_state = e_cal_get_load_state (calendar_client);
-
- if (ici->do_tasks)
- tasks_state = e_cal_get_load_state (tasks_client);
-
- if (calendar_state == E_CAL_LOAD_LOADED
- && tasks_state == E_CAL_LOAD_LOADED)
- break;
-
- sleep (1);
- }
-
- /* If we timed out, just return. */
- if (t == IMPORTER_TIMEOUT_SECONDS)
- goto out;
-
- /* Import the calendar events. */
- /* FIXME: What do intelligent importers do about errors? */
- if (ici->do_calendar)
- update_objects (calendar_client, icalcomp);
-
-
- /*
- * Import the tasks into the default tasks folder.
- */
- prepare_tasks (icalcomp, vtodos);
- if (ici->do_tasks)
- update_objects (tasks_client, icalcomp);
-
- out:
- if (icalcomp)
- icalcomponent_free (icalcomp);
- if (calendar_client)
- g_object_unref (calendar_client);
- if (tasks_client)
- g_object_unref (tasks_client);
-}
-
-
-/* Fun with aggregation */
-static void
-checkbox_toggle_cb (GtkToggleButton *tb,
- gboolean *do_item)
-{
- *do_item = gtk_toggle_button_get_active (tb);
-}
-
-static BonoboControl *
-create_checkboxes_control (ICalIntelligentImporter *ici)
-{
- GtkWidget *hbox, *calendar_checkbox, *tasks_checkbox;
- BonoboControl *control;
-
- hbox = gtk_hbox_new (FALSE, 2);
-
- calendar_checkbox = gtk_check_button_new_with_label (_("Calendar Events"));
- g_signal_connect (G_OBJECT (calendar_checkbox), "toggled",
- G_CALLBACK (checkbox_toggle_cb),
- &ici->do_calendar);
- gtk_box_pack_start (GTK_BOX (hbox), calendar_checkbox,
- FALSE, FALSE, 0);
-
- tasks_checkbox = gtk_check_button_new_with_label (_("Tasks"));
- g_signal_connect (G_OBJECT (tasks_checkbox), "toggled",
- G_CALLBACK (checkbox_toggle_cb),
- &ici->do_tasks);
- gtk_box_pack_start (GTK_BOX (hbox), tasks_checkbox,
- FALSE, FALSE, 0);
-
- gtk_widget_show_all (hbox);
- control = bonobo_control_new (hbox);
- return control;
-}
-
-BonoboObject *
-gnome_calendar_importer_new (void)
-{
- EvolutionIntelligentImporter *importer;
- ICalIntelligentImporter *ici;
- BonoboControl *control;
- char *message = N_("Evolution has found Gnome Calendar files.\n"
- "Would you like to import them into Evolution?");
-
- ici = g_new0 (ICalIntelligentImporter, 1);
-
- importer = evolution_intelligent_importer_new (gnome_calendar_can_import_fn,
- gnome_calendar_import_data_fn,
- _("Gnome Calendar"),
- _(message),
- ici);
-
-
- g_object_weak_ref (G_OBJECT (importer), (GWeakNotify) gnome_calendar_importer_destroy_cb, ici);
-
- control = create_checkboxes_control (ici);
- bonobo_object_add_interface (BONOBO_OBJECT (importer),
- BONOBO_OBJECT (control));
-
- return BONOBO_OBJECT (importer);
-}
diff --git a/calendar/importers/main.c b/calendar/importers/main.c
deleted file mode 100644
index d19f98a271..0000000000
--- a/calendar/importers/main.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution calendar importer component
- *
- * Authors: Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include <string.h>
-#include <bonobo/bonobo-shlib-factory.h>
-#include <bonobo/bonobo-context.h>
-#include <bonobo/bonobo-main.h>
-#include "evolution-calendar-importer.h"
-
-#define IMPORTER_FACTORY_ID "OAFIID:GNOME_Evolution_Calendar_ImporterFactory:" BASE_VERSION
-#define ICALENDAR_IMPORTER_ID "OAFIID:GNOME_Evolution_Calendar_iCalendar_Importer:" BASE_VERSION
-#define VCALENDAR_IMPORTER_ID "OAFIID:GNOME_Evolution_Calendar_vCalendar_Importer:" BASE_VERSION
-#define GNOME_CALENDAR_IMPORTER_ID "OAFIID:GNOME_Evolution_Gnome_Calendar_Intelligent_Importer:" BASE_VERSION
-
-static BonoboObject *
-importer_factory_fn (BonoboGenericFactory *factory, const char *id, void *closure)
-{
- BonoboObject *object = NULL;
-
- g_return_val_if_fail (id != NULL, NULL);
-
- if (!strcmp (id, ICALENDAR_IMPORTER_ID))
- object = ical_importer_new ();
- else if (!strcmp (id, VCALENDAR_IMPORTER_ID))
- object = vcal_importer_new ();
- else if (!strcmp (id, GNOME_CALENDAR_IMPORTER_ID))
- object = gnome_calendar_importer_new ();
- else
- g_warning ("Component not supported by this factory");
-
- return object;
-}
-
-BONOBO_ACTIVATION_SHLIB_FACTORY (IMPORTER_FACTORY_ID, "Evolution Calendar importer factory", importer_factory_fn, NULL)
diff --git a/calendar/zones.h b/calendar/zones.h
deleted file mode 100644
index 5b482255f0..0000000000
--- a/calendar/zones.h
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * These are the timezone names from the Olson timezone data.
- * We only place them here so gettext picks them up for translation.
- * Don't include in any C files.
- */
-
-N_("Africa/Abidjan");
-N_("Africa/Accra");
-N_("Africa/Addis_Ababa");
-N_("Africa/Algiers");
-N_("Africa/Asmera");
-N_("Africa/Bamako");
-N_("Africa/Bangui");
-N_("Africa/Banjul");
-N_("Africa/Bissau");
-N_("Africa/Blantyre");
-N_("Africa/Brazzaville");
-N_("Africa/Bujumbura");
-N_("Africa/Cairo");
-N_("Africa/Casablanca");
-N_("Africa/Ceuta");
-N_("Africa/Conakry");
-N_("Africa/Dakar");
-N_("Africa/Dar_es_Salaam");
-N_("Africa/Djibouti");
-N_("Africa/Douala");
-N_("Africa/El_Aaiun");
-N_("Africa/Freetown");
-N_("Africa/Gaborone");
-N_("Africa/Harare");
-N_("Africa/Johannesburg");
-N_("Africa/Kampala");
-N_("Africa/Khartoum");
-N_("Africa/Kigali");
-N_("Africa/Kinshasa");
-N_("Africa/Lagos");
-N_("Africa/Libreville");
-N_("Africa/Lome");
-N_("Africa/Luanda");
-N_("Africa/Lubumbashi");
-N_("Africa/Lusaka");
-N_("Africa/Malabo");
-N_("Africa/Maputo");
-N_("Africa/Maseru");
-N_("Africa/Mbabane");
-N_("Africa/Mogadishu");
-N_("Africa/Monrovia");
-N_("Africa/Nairobi");
-N_("Africa/Ndjamena");
-N_("Africa/Niamey");
-N_("Africa/Nouakchott");
-N_("Africa/Ouagadougou");
-N_("Africa/Porto-Novo");
-N_("Africa/Sao_Tome");
-N_("Africa/Timbuktu");
-N_("Africa/Tripoli");
-N_("Africa/Tunis");
-N_("Africa/Windhoek");
-N_("America/Adak");
-N_("America/Anchorage");
-N_("America/Anguilla");
-N_("America/Antigua");
-N_("America/Araguaina");
-N_("America/Aruba");
-N_("America/Asuncion");
-N_("America/Barbados");
-N_("America/Belem");
-N_("America/Belize");
-N_("America/Boa_Vista");
-N_("America/Bogota");
-N_("America/Boise");
-N_("America/Buenos_Aires");
-N_("America/Cambridge_Bay");
-N_("America/Cancun");
-N_("America/Caracas");
-N_("America/Catamarca");
-N_("America/Cayenne");
-N_("America/Cayman");
-N_("America/Chicago");
-N_("America/Chihuahua");
-N_("America/Cordoba");
-N_("America/Costa_Rica");
-N_("America/Cuiaba");
-N_("America/Curacao");
-N_("America/Danmarkshavn");
-N_("America/Dawson");
-N_("America/Dawson_Creek");
-N_("America/Denver");
-N_("America/Detroit");
-N_("America/Dominica");
-N_("America/Edmonton");
-N_("America/Eirunepe");
-N_("America/El_Salvador");
-N_("America/Fortaleza");
-N_("America/Glace_Bay");
-N_("America/Godthab");
-N_("America/Goose_Bay");
-N_("America/Grand_Turk");
-N_("America/Grenada");
-N_("America/Guadeloupe");
-N_("America/Guatemala");
-N_("America/Guayaquil");
-N_("America/Guyana");
-N_("America/Halifax");
-N_("America/Havana");
-N_("America/Hermosillo");
-N_("America/Indiana/Indianapolis");
-N_("America/Indiana/Knox");
-N_("America/Indiana/Marengo");
-N_("America/Indiana/Vevay");
-N_("America/Indianapolis");
-N_("America/Inuvik");
-N_("America/Iqaluit");
-N_("America/Jamaica");
-N_("America/Jujuy");
-N_("America/Juneau");
-N_("America/Kentucky/Louisville");
-N_("America/Kentucky/Monticello");
-N_("America/La_Paz");
-N_("America/Lima");
-N_("America/Los_Angeles");
-N_("America/Louisville");
-N_("America/Maceio");
-N_("America/Managua");
-N_("America/Manaus");
-N_("America/Martinique");
-N_("America/Mazatlan");
-N_("America/Mendoza");
-N_("America/Menominee");
-N_("America/Merida");
-N_("America/Mexico_City");
-N_("America/Miquelon");
-N_("America/Monterrey");
-N_("America/Montevideo");
-N_("America/Montreal");
-N_("America/Montserrat");
-N_("America/Nassau");
-N_("America/New_York");
-N_("America/Nipigon");
-N_("America/Nome");
-N_("America/Noronha");
-N_("America/North_Dakota/Center");
-N_("America/Panama");
-N_("America/Pangnirtung");
-N_("America/Paramaribo");
-N_("America/Phoenix");
-N_("America/Port-au-Prince");
-N_("America/Port_of_Spain");
-N_("America/Porto_Velho");
-N_("America/Puerto_Rico");
-N_("America/Rainy_River");
-N_("America/Rankin_Inlet");
-N_("America/Recife");
-N_("America/Regina");
-N_("America/Rio_Branco");
-N_("America/Rosario");
-N_("America/Santiago");
-N_("America/Santo_Domingo");
-N_("America/Sao_Paulo");
-N_("America/Scoresbysund");
-N_("America/Shiprock");
-N_("America/St_Johns");
-N_("America/St_Kitts");
-N_("America/St_Lucia");
-N_("America/St_Thomas");
-N_("America/St_Vincent");
-N_("America/Swift_Current");
-N_("America/Tegucigalpa");
-N_("America/Thule");
-N_("America/Thunder_Bay");
-N_("America/Tijuana");
-N_("America/Tortola");
-N_("America/Vancouver");
-N_("America/Whitehorse");
-N_("America/Winnipeg");
-N_("America/Yakutat");
-N_("America/Yellowknife");
-N_("Antarctica/Casey");
-N_("Antarctica/Davis");
-N_("Antarctica/DumontDUrville");
-N_("Antarctica/Mawson");
-N_("Antarctica/McMurdo");
-N_("Antarctica/Palmer");
-N_("Antarctica/South_Pole");
-N_("Antarctica/Syowa");
-N_("Antarctica/Vostok");
-N_("Arctic/Longyearbyen");
-N_("Asia/Aden");
-N_("Asia/Almaty");
-N_("Asia/Amman");
-N_("Asia/Anadyr");
-N_("Asia/Aqtau");
-N_("Asia/Aqtobe");
-N_("Asia/Ashgabat");
-N_("Asia/Baghdad");
-N_("Asia/Bahrain");
-N_("Asia/Baku");
-N_("Asia/Bangkok");
-N_("Asia/Beirut");
-N_("Asia/Bishkek");
-N_("Asia/Brunei");
-N_("Asia/Calcutta");
-N_("Asia/Choibalsan");
-N_("Asia/Chongqing");
-N_("Asia/Colombo");
-N_("Asia/Damascus");
-N_("Asia/Dhaka");
-N_("Asia/Dili");
-N_("Asia/Dubai");
-N_("Asia/Dushanbe");
-N_("Asia/Gaza");
-N_("Asia/Harbin");
-N_("Asia/Hong_Kong");
-N_("Asia/Hovd");
-N_("Asia/Irkutsk");
-N_("Asia/Istanbul");
-N_("Asia/Jakarta");
-N_("Asia/Jayapura");
-N_("Asia/Jerusalem");
-N_("Asia/Kabul");
-N_("Asia/Kamchatka");
-N_("Asia/Karachi");
-N_("Asia/Kashgar");
-N_("Asia/Katmandu");
-N_("Asia/Krasnoyarsk");
-N_("Asia/Kuala_Lumpur");
-N_("Asia/Kuching");
-N_("Asia/Kuwait");
-N_("Asia/Macao");
-N_("Asia/Macau");
-N_("Asia/Magadan");
-N_("Asia/Makassar");
-N_("Asia/Manila");
-N_("Asia/Muscat");
-N_("Asia/Nicosia");
-N_("Asia/Novosibirsk");
-N_("Asia/Omsk");
-N_("Asia/Oral");
-N_("Asia/Phnom_Penh");
-N_("Asia/Pontianak");
-N_("Asia/Pyongyang");
-N_("Asia/Qatar");
-N_("Asia/Qyzylorda");
-N_("Asia/Rangoon");
-N_("Asia/Riyadh");
-N_("Asia/Saigon");
-N_("Asia/Sakhalin");
-N_("Asia/Samarkand");
-N_("Asia/Seoul");
-N_("Asia/Shanghai");
-N_("Asia/Singapore");
-N_("Asia/Taipei");
-N_("Asia/Tashkent");
-N_("Asia/Tbilisi");
-N_("Asia/Tehran");
-N_("Asia/Thimphu");
-N_("Asia/Tokyo");
-N_("Asia/Ujung_Pandang");
-N_("Asia/Ulaanbaatar");
-N_("Asia/Urumqi");
-N_("Asia/Vientiane");
-N_("Asia/Vladivostok");
-N_("Asia/Yakutsk");
-N_("Asia/Yekaterinburg");
-N_("Asia/Yerevan");
-N_("Atlantic/Azores");
-N_("Atlantic/Bermuda");
-N_("Atlantic/Canary");
-N_("Atlantic/Cape_Verde");
-N_("Atlantic/Faeroe");
-N_("Atlantic/Jan_Mayen");
-N_("Atlantic/Madeira");
-N_("Atlantic/Reykjavik");
-N_("Atlantic/South_Georgia");
-N_("Atlantic/St_Helena");
-N_("Atlantic/Stanley");
-N_("Australia/Adelaide");
-N_("Australia/Brisbane");
-N_("Australia/Broken_Hill");
-N_("Australia/Darwin");
-N_("Australia/Hobart");
-N_("Australia/Lindeman");
-N_("Australia/Lord_Howe");
-N_("Australia/Melbourne");
-N_("Australia/Perth");
-N_("Australia/Sydney");
-N_("Europe/Amsterdam");
-N_("Europe/Andorra");
-N_("Europe/Athens");
-N_("Europe/Belfast");
-N_("Europe/Belgrade");
-N_("Europe/Berlin");
-N_("Europe/Bratislava");
-N_("Europe/Brussels");
-N_("Europe/Bucharest");
-N_("Europe/Budapest");
-N_("Europe/Chisinau");
-N_("Europe/Copenhagen");
-N_("Europe/Dublin");
-N_("Europe/Gibraltar");
-N_("Europe/Helsinki");
-N_("Europe/Istanbul");
-N_("Europe/Kaliningrad");
-N_("Europe/Kiev");
-N_("Europe/Lisbon");
-N_("Europe/Ljubljana");
-N_("Europe/London");
-N_("Europe/Luxembourg");
-N_("Europe/Madrid");
-N_("Europe/Malta");
-N_("Europe/Minsk");
-N_("Europe/Monaco");
-N_("Europe/Moscow");
-N_("Europe/Nicosia");
-N_("Europe/Oslo");
-N_("Europe/Paris");
-N_("Europe/Prague");
-N_("Europe/Riga");
-N_("Europe/Rome");
-N_("Europe/Samara");
-N_("Europe/San_Marino");
-N_("Europe/Sarajevo");
-N_("Europe/Simferopol");
-N_("Europe/Skopje");
-N_("Europe/Sofia");
-N_("Europe/Stockholm");
-N_("Europe/Tallinn");
-N_("Europe/Tirane");
-N_("Europe/Uzhgorod");
-N_("Europe/Vaduz");
-N_("Europe/Vatican");
-N_("Europe/Vienna");
-N_("Europe/Vilnius");
-N_("Europe/Warsaw");
-N_("Europe/Zagreb");
-N_("Europe/Zaporozhye");
-N_("Europe/Zurich");
-N_("Indian/Antananarivo");
-N_("Indian/Chagos");
-N_("Indian/Christmas");
-N_("Indian/Cocos");
-N_("Indian/Comoro");
-N_("Indian/Kerguelen");
-N_("Indian/Mahe");
-N_("Indian/Maldives");
-N_("Indian/Mauritius");
-N_("Indian/Mayotte");
-N_("Indian/Reunion");
-N_("Pacific/Apia");
-N_("Pacific/Auckland");
-N_("Pacific/Chatham");
-N_("Pacific/Easter");
-N_("Pacific/Efate");
-N_("Pacific/Enderbury");
-N_("Pacific/Fakaofo");
-N_("Pacific/Fiji");
-N_("Pacific/Funafuti");
-N_("Pacific/Galapagos");
-N_("Pacific/Gambier");
-N_("Pacific/Guadalcanal");
-N_("Pacific/Guam");
-N_("Pacific/Honolulu");
-N_("Pacific/Johnston");
-N_("Pacific/Kiritimati");
-N_("Pacific/Kosrae");
-N_("Pacific/Kwajalein");
-N_("Pacific/Majuro");
-N_("Pacific/Marquesas");
-N_("Pacific/Midway");
-N_("Pacific/Nauru");
-N_("Pacific/Niue");
-N_("Pacific/Norfolk");
-N_("Pacific/Noumea");
-N_("Pacific/Pago_Pago");
-N_("Pacific/Palau");
-N_("Pacific/Pitcairn");
-N_("Pacific/Ponape");
-N_("Pacific/Port_Moresby");
-N_("Pacific/Rarotonga");
-N_("Pacific/Saipan");
-N_("Pacific/Tahiti");
-N_("Pacific/Tarawa");
-N_("Pacific/Tongatapu");
-N_("Pacific/Truk");
-N_("Pacific/Wake");
-N_("Pacific/Wallis");
-N_("Pacific/Yap");
diff --git a/composer/.cvsignore b/composer/.cvsignore
deleted file mode 100644
index 06374ed96d..0000000000
--- a/composer/.cvsignore
+++ /dev/null
@@ -1,17 +0,0 @@
-*.la
-*.lo
-.deps
-.libs
-Composer-common.c
-Composer-skels.c
-Composer-stubs.c
-Composer.h
-Editor-common.c
-Editor-skels.c
-Editor-stubs.c
-Editor.h
-Makefile
-Makefile.in
-mail-composer-errors.xml
-composer-marshal.c
-composer-marshal.h
diff --git a/composer/ChangeLog b/composer/ChangeLog
deleted file mode 100644
index 2d7e532f33..0000000000
--- a/composer/ChangeLog
+++ /dev/null
@@ -1,1035 +0,0 @@
-2005-01-24 Hans Petter Jansson <hpj@novell.com>
-
- * e-msg-composer-hdrs.c (create_addressbook_entry): Set pointers to the
- contact editor creation functions in the entries, so they can pop up
- said editors.
-
-2005-01-12 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (destroy): initialise composer before using it.
- sigh.
-
-2005-01-05 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (d): turn off debug, setup g private instance
- data structure.
- (setup_ui): activate the composer plugin menu.
- (destroy): clean up the composer plugin menu.
- (class_init, init): init private instance data & plugin menu.
-
-2004-12-24 JP Rosevear <jpr@novell.com>
-
- * e-msg-composer.c (setup_signatures_menu): kill warnings
- (map_default_cb): the to entry widget is now just a gtk entry at
- its core, so check for text that way
-
-2004-12-23 Hans Petter Jansson <hpj@novell.com>
-
- * Makefile.am (selectnamesdir)
- (IDL_GENERATED)
- (INCLUDES): Remove select-names from here.
-
- * Composer.idl: Remove Evolution-Addressbook-SelectNames.idl include.
-
-2004-12-22 Hans Petter Jansson <hpj@novell.com>
-
- * e-msg-composer-hdrs.c (addressbook_dialog_response)
- (setup_corba)
- (setup_name_selector)
- (address_button_clicked_cb)
- (addressbook_entry_changed)
- (create_addressbook_entry)
- (destroy)
- (e_msg_composer_hdrs_new)
- (destinations_to_name_selector_entry)
- (e_msg_composer_hdrs_set_to)
- (e_msg_composer_hdrs_set_cc)
- (e_msg_composer_hdrs_set_bcc)
- (destination_list_to_destv)
- (e_msg_composer_hdrs_get_to)
- (e_msg_composer_hdrs_get_cc)
- (e_msg_composer_hdrs_get_bcc): Adapt to new ENameSelector.
-
-2004-12-17 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer-attachment-bar.c (emcab_popup):
-
- * e-msg-composer.c (drag_data_received):
-
-2004-12-08 Hans Petter Jansson <hpj@novell.com>
-
- * e-msg-composer-hdrs.h: Include <libebook/e-destination.h> from
- evolution-data-server.
-
-2004-12-07 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c: include camel-cipher-context.h so we build if
- nss isn't available.
-
-2004-11-26 JP Rosevear <jpr@novell.com>
-
- * e-msg-composer.c (create_composer): get image from icon factory
- directly
-
-2004-11-15 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (handle_multipart_encrypted): remove the old
- camel_multipart_encrypted api.
-
-2004-10-28 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (drag_data_received): fix the popup id.
-
- * e-msg-composer-attachment-bar.c (emcab_popup): added popup doco.
-
-2004-10-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (composer_key_pressed): Close on Esc.
- (create_composer): Connect to the key-press-event signal.
-
-2004-10-26 mengjie yu <meng-jie.yu@sun.com>
-
- fix for bugzilla #44876
-
- * e-msg-composer-hdrs.c (header_new_recipient, create_headers):
- add access key for Reply_to, From, Subject, To, Cc, Bcc, Post_to
-
- * e-msg-composer.c (setup_signatures_menu): Add accesss key for
- Signature.
-
-2004-10-19 JP Rosevear <jpr@novell.com>
-
- * e-msg-composer.c, e-msg-composer-attachment-bar.c: convert to
- org.gnome hook names
-
-2004-10-08 Jeffrey Stedfast <fejj@novell.com>
-
- * e-msg-composer.c (build_message): g_strdup() the gpg/smime keys
- into the recipients list or else we end up free'ing them later
- when we shouldn't. Fixes bug #66703
-
-2004-10-06 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (drag_data_received):
- * e-msg-composer-attachment-bar.c (emcab_popup): e-popup api changes.
-
-2004-10-01 JP Rosevear <jpr@novell.com>
-
- * e-msg-composer.c: uses GTKHTML_API_VERSION for the bonobo server
- look up
-
-2004-10-01 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (create_composer): enable ask drop action and
- hook onto drag motion.
- (drag_motion): implement.
- (drop_action): do the work here now.
- (drag_data_received): popup a menu if the action is ask.
- (drop_popup_copy, drop_popup_move, drop_popup_cancel):
- (drop_popup_free): Popup callbacks.
-
-2004-09-30 Kjartan Maraas <kmaraas@gnome.org>
-
- * e-msg-composer.c: (autosave_manager_start),
- (autosave_manager_stop), (create_composer): Use non-deprecated
- functions.
-
-2004-08-17 Michael Meeks <michael@ximian.com>
-
- * e-msg-composer.c (handle_mailto): handle 'attachment' as
- well, as per Mozilla's mangling, and the new desktop-launch spec.
- [ this was approved months ago, but somehow never got committed ]
- ** See bug #65592
-
-2004-09-08 Not Zed <NotZed@Ximian.com>
-
- ** See bug #64454.
-
- * mail-composer-errors.xml: add accelerators to modified message
- dialogue.
-
-2004-08-13 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_show_sig_file): set paragraph
- style to normal to avoid signature landing in PRE paragraph
-
-2004-07-29 Carlos Garnacho Parro <carlosg@gnome.org>
-
- * e-msg-composer-select-file.[ch]: Optionally use GtkFileChooser
- if compiled against Gtk+ >= 2.4.0. (e_msg_composer_select_file):
- added save_mode parameter
-
- * e-msg-composer.c: use the modified e_msg_composer_select_file()
- function
-
-2004-07-28 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c: Fixes for api changes in mail/ for 61940.
-
-2004-07-23 Radek Doulik <rodo@ximian.com>
-
- * listener.c: removed unused static variable listener_vepv
-
- * added len parameter to set_editor_text,
- e_msg_composer_set_body_text, e_msg_composer_set_pending_body. it
- allows us to send whole buffer (even if it contains \0 in the
- middle) to gtkhtml editor.
-
-2004-07-22 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (set_editor_text): removed body content +
- signature html concatenating and call e_msg_composer_show_sig_file
- instead
-
- Fixes #59490
-
-2004-07-20 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer-attachment.c: include config.h. See #61395.
-
-2004-09-04 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer-*.c: include gnome-i18n.h if required.
-
-2004-08-30 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer-attachment-bar.c (emcab_popup): em-popup based
- popup menu to replace the gnome one.
- (popup_menu_event): use new func above.
- (button_press_event): ", some cleanup.
-
-2004-06-18 Not Zed <NotZed@Ximian.com>
-
- ** Fix for #60387.
-
- * mail-composer-errors.xml: added an error for failing to retrieve
- to-be-attached messages.
-
- * e-msg-composer.c (message_rfc822_dnd): remove this, we only want
- to treat it as a real rfc822 message, not a berkeley mailbox.
- (drag_data_received): handle the rfc822 type here, and also the
- new x-uid-list type.
- (attach_message): helper set a description on attached messages.
-
-2004-06-16 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (e_msg_composer_guess_mime_type): clean up the
- code slightly.
-
- * evolution-composer.c (impl_Composer_set_headers): Fix all the
- strn?casecmp calls.
-
- * e-msg-composer.c (from_changed_cb, drag_data_received)
- (is_special_header, e_msg_composer_new_with_message)
- (handle_mailto, e_msg_composer_new_from_url): as above.
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_new): as
- above.
-
- * e-msg-composer.c (drag_data_received): handle comments in uri
- lists.
-
-2004-06-14 Jeffrey Stedfast <fejj@novell.com>
-
- * e-msg-composer.c (create_composer): Don't connect to the
- key_pressed_event.
- (composer_key_pressed): Removed. We don't want to close the
- compose on Escape. To do so would violate the HIG.
-
-2004-06-07 Dan Winship <danw@novell.com>
-
- * e-msg-composer.c (pixcache): s/stock_save_as/stock_save-as/
-
-2004-06-04 Jeffrey Stedfast <fejj@novell.com>
-
- * e-msg-composer.c (create_composer): Use e_error_run() instead of
- the e_activation_error_dialog() stuff that no longer exists.
-
-2004-06-03 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_show_sig_file): always insert
- new paragraph for signature
-
- Fixes #37601
-
-2004-05-27 Jeffrey Stedfast <fejj@novell.com>
-
- * mail-composer-errors.xml: s/${0}/{0}/g
-
-2004-05-27 Rodney Dawes <dobey@novell.com>
-
- * Makefile.am (EXTRA_DIST): Add $(error_i18n)
-
-2004-05-25 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (pixcache[]): use e-icon-factory sizes.
-
- * e-msg-composer-attachment-bar.c (update): if we have a cached
- icon, use it, don't just ignore it! #58831.
-
-2004-05-19 JP Rosevear <jpr@novell.com>
-
- * Makefile.am: don't dist the error .h file
-
-2004-05-18 Not Zed <NotZed@Ximian.com>
-
- * mail-composer-errors.xml: set the default for exit-unsaved to
- save, as in 1.4. #57995.
-
- * e-msg-composer-hdrs.c (post_browser_clicked_cb): fix for folder
- selector api change.
-
-2004-05-12 Not Zed <NotZed@Ximian.com>
-
- * mail-composer-errors.xml.h: add for translators.
-
- * mail-composer-errors.xml: renamed from xml.in file.
-
- * Makefile.am: Fix for i18n build stuff.
-
-2004-05-11 Jeffrey Stedfast <fejj@novell.com>
-
- * e-msg-composer.c (build_message): Use CAMEL_EXCEPTION_SYSTEM
- instead of '1', also don't use camel_exception_setv() if we aren't
- using the printf-style arguments. Just use camel_exception_set() -
- safer anyway, since then we don't have to worry about translated
- strings containing printf-style formatters that could break stuff.
-
-2004-05-08 Enver ALTIN <enver.altin@frontsite.com.tr>
-
- * e-msg-composer.c: Fixing parts of #53466.
-
-2004-05-03 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c: header cleanups.
-
-2004-04-28 Not Zed <NotZed@Ximian.com>
-
- ** Changed error messages to EError.
-
-2004-04-27 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer-attachment-bar.c (update): duh, pass the string
- not the content type to the warning message. And derrr, print it
- for the actual error case, not the ok case. Fixes #57680.
-
-2004-04-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (autosave_load_draft): Only unlink the original
- autosave draft file if we are successful in saving a new copy,
- otherwise don't unlink the file. Fixes bug #57540.
-
-2004-04-23 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer-attachment-bar.c (update): fallback to stock
- unknown if we can't ifnd the icon. #56717.
-
-2004-04-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (create_composer): Use the E_ICON_SIZE enums
- rather than specifying an absolute pixel size.
-
-2004-04-19 Michael Terry <mike@mterry.name>
-
- * e-msg-composer.c: Update the composer to use the icon theme via
- the EIconFactory object in e-util
-
-2004-04-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c (attach_to_multipart): Same idea
- here as with build_mesage(), don't convert th gconf charset
- setting to the iconv name before setting it on the mime part.
-
- * e-msg-composer.c (best_charset): Now returns a malloc'd string
- bufefr containing the charset that has NOT been converted to the
- iconv name. This is important in order to avoid using the iconv
- charset name which may or may not necessarily be the IANA blessed
- name.
- (composer_get_default_charset_setting): Changed to always return
- the actual value in the settings (eg. don't return the iconv
- name).
- (build_message): Updated for changes to best_charset(). Set the
- actual charset name as the charset param and then get the
- iconv_charset from that. Use iconv_charset everywhere else.
- (get_file_content): Updated for changes to
- get_default_charset_setting().
- (setup_ui): Same.
-
-2004-04-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (get_file_content): To be on the safe side
- (even though the real bug behind bug #51924 can't happen here),
- protect against adding a NULL charset filter tot he filtered
- stream.
-
-2004-04-13 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.c (drag_data_received): accept text/calendar
- drops.
-
-2004-04-09 Chris Toshok <toshok@ximian.com>
-
- * e-msg-composer-hdrs.c (set_recipients_from_destv):
- EABDestination -> EDestination.
- (e_msg_composer_hdrs_to_message_internal): same.
- (e_msg_composer_hdrs_set_to): same.
- (e_msg_composer_hdrs_set_cc): same.
- (e_msg_composer_hdrs_set_bcc): same.
- (e_msg_composer_hdrs_get_to): same.
- (e_msg_composer_hdrs_get_cc): same.
- (e_msg_composer_hdrs_get_bcc): same.
- (e_msg_composer_hdrs_get_recipients): same.
-
- * e-msg-composer-hdrs.h: convert prototypes such that
- EABDestination -> EDestination.
-
- * e-msg-composer.h: convert prototypes such that EABDestination ->
- EDestination.
-
- * e-msg-composer.c (destination_list_to_vector_sized): new
- function, ripped from EABDestination, as this code is the only
- consumer.
- (destination_list_to_vector): same.
- (update_auto_recipients): EABDestination -> EDestination.
- (e_msg_composer_new_with_message): same.
- (add_recipients): same.
- (handle_mailto): same.
- (e_msg_composer_set_headers): same.
- (e_msg_composer_get_recipients): same.
- (e_msg_composer_get_to): same.
- (e_msg_composer_get_cc): same.
- (e_msg_composer_get_bcc): same.
-
- * evolution-composer.c (corba_recipientlist_to_destv):
- EABDestination -> EDestination.
- (impl_Composer_set_headers): same.
-
-2004-04-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (sig_select_item): Reversed the logic for
- setting the signature menu to "None" (only set it to "None" if a
- signature *isn't* set, doh!)
- (prepare_signatures_menu): Removed. Combined with
- setup_signature_menu().
-
-2004-04-06 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (prepare_signatures_menu): added empty hbox so
- that we have 12pxs between account setting and signature setting
- (set_editor_text): added pad_signature parameter to tell if we
- want to pad signature with <BR> (used when creating new mail, in
- other cases we don't want to pad the signature)
-
- Fixes #42866
-
-2004-04-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (set_editor_text): Revert Radek's last change
- to fix bug #56381.
-
-2004-04-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (get_signature_html): Fixed some breakage I
- introduced in the changes below.
-
-2004-04-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c: Updated to use the new signature APIs.
- (signature_added): _()ify the "Autogenerated" signature name.
-
-2004-03-31 Not Zed <NotZed@Ximian.com>
-
- * *.[ch]: Fixed missing headers now mail/* doesn't include gtk/*,
- camel/*, and gnome/* for you.
-
-2004-03-29 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (set_editor_text): do not add <br> between text
- and signature
-
-2004-03-22 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (disable_editor): do not set editor
- insensitive, use editable-off command instead
-
- Fixes #55049
-
-2004-03-22 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer-hdrs.c (post_browser_clicked_cb): exclude
- non-viable folder targets for selection, related to #55089.
-
-2004-03-18 Radek Doulik <rodo@ximian.com>
-
- * listener.c (impl_event): delete event: if empty paragraph has
- signature == 1 then set it to 0
-
- Fixes #55735 (be sure to update gtkhtml as well)
-
-2004-03-17 Bill Zhu <bill.zhu@sun.com>
-
- * e-msg_composer-attachment-bar.c: If we select multi-attachments, the
- "properities" menu item in popup icon context menu will be disabled.
-
- Fixes bug #55299
-
-2004-03-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (do_exit): If the subject is empty, use
- _("Untitled Message") as the subject instead.
-
-2004-03-05 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes bug #55202
-
- * e-msg-composer.c (add_recipients): No longer takes a decode
- argument (handle_mailto is the only function that calls it, and
- the decode value always has to be TRUE for mailto).
- (handle_mailto): Updated.
-
-2004-02-27 Bruce Tao <bruce.tao@sun.com>
-
- * e-msg-composer-attachment-bar.c: add a key-press event handler,
- with which a little modification to Paolo Borelli's patch.
- <pborelli@katamail.com> When one attachment is deleted, the
- icon right after the last deleted one will be focused.
-
-2004-02-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (set_editor_text): Add a <br> tag between the
- message text and the signature text (makes it nicer looking and
- also fixes bug #53747.
-
-2004-02-17 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_unrealize): renamed from unmap
-
-2004-02-13 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (create_composer): get default composer size
- from gconf, hook to unrealize event and save size to gconf
- (e_msg_composer_unmap): new handler, saves composer window size
-
-2004-02-06 Rodney Dawes <dobey@ximian.com>
-
- * e-msg-composer-attachment-bar.c: add accel and icon for
- the "remove" item in the popup menu.
- Patch from Paolo Borelli <pborelli@katamail.com>
-
-2004-02-03 Chris Toshok <toshok@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_guess_mime_type): use
- FORCE_SLOW_MIME_TYPE so gnome-vfs actually sniffs the file
- contents before coming up with a mime type.
-
-2004-02-03 Dan Winship <danw@ximian.com>
-
- * Makefile.am (INCLUDES): add widgets/misc
-
-2004-02-02 Not Zed <NotZed@Ximian.com>
-
- * evolution-composer.c (impl_Composer_set_body): use
- g_ascii_strcasecmp rather than strcasecmp.
-
- ** See bug #53506, again.
-
- * e-msg-composer.c (set_editor_text): Add an argument to make
- adding the signature optional. Also fix a memleak with the sig
- content.
- (e_msg_composer_new_with_type, e_msg_composer_flush_pending_body)
- (handle_mailto, e_msg_composer_set_body_text)
- (e_msg_composer_set_body): Fixed callers for above change
- appropriately.
-
-2004-01-29 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_type): reverted
- radek's patch below, it was already fixed (#53176). Changed the
- init order though, set_editor_signature only sets the current one,
- it doen'st insert it.
-
- ** See bug #53506.
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_set_post_to_list):
- use a GString to build the result.
- (e_msg_composer_hdrs_set_post_to_base): same here.
- (e_msg_composer_hdrs_set_post_to_base): dont bother copying the
- post_to string.
- (e_msg_composer_hdrs_get_post_to): change the relative-url test to
- ":/" rather than "://", so that mbox url's work.
-
-2004-01-27 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_type): set body text
- after setting composer's signature, so that signature is shown
-
- Fixes #53367
-
-2004-01-28 Not Zed <NotZed@Ximian.com>
-
- ** See Bug #53176, probably fixes others too.
-
- * e-msg-composer.c (set_editor_text): When we set the text, always
- add the signature implictly. Means we don't have to set it
- manually and break changing the file, or hit any races.
- (e_msg_composer_set_body_text): dont call show_sig_file here.
-
-2004-01-14 Not Zed <NotZed@Ximian.com>
-
- ** See Bug #20017.
-
- * e-msg-composer.c (create_composer): set the composer to
- unchanged after all setup, some setup (from_changed_cb) will mark
- it changed.
- (create_composer): remove a warning.
-
- ** See Bug #52794.
-
- (e_msg_composer_get_message_draft): save sign/encrypt settings to
- X-Evolution-Format header.
- (e_msg_composer_new_with_message): restore sign/encrypt settings
- from X-Evolution-Format header.
- (e_msg_composer_set_pgp_sign, e_msg_composer_set_pgp_encrypt)
- (e_msg_composer_set_smime_sign, e_msg_composer_set_smime_encrypt):
- Set composer changed if it did.
-
-2004-01-12 JP Rosevear <jpr@ximian.com>
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_set_post_to): fix
- compilation error
-
-2004-01-12 Meilof Veeningen <meilof@wanadoo.nl>
-
- * e-msg-composer.[ch]: added "View To", "View Post To" menu items,
- made it possible to see both at the same time, new
- e_msg_composer_new_with_type, only visibility info of headers if
- in the visible mask.
-
- * e-msg-composer.[ch]: replaced folder selection button by entry
- with selection button next to it, enabled multiple folder selection,
- made it possible to see both To and PostTo fields, disabled
- setting the "X-Evolution-PostTo" header.
-
-2004-01-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (autosave_manager_query_load_orphans):
- s/unsaved files/unsaved messages/ as per bug #45407.
-
-2004-01-08 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (set_editor_signature): add an assertion for no
- account set. Discovered from bug #50786.
-
-2004-01-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (create_composer): Remove the 6-pixel border
- around the main window. That just looked ugly.
-
-2004-01-07 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: missed this - remove disable deprecated flag
-
-2003-12-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-hdrs.c (create_headers): Unifdef out the post-to
- code and fix it to use the new folder selection button.
- (e_msg_composer_hdrs_set_post_to): Same.
- (e_msg_composer_hdrs_get_post_to): Same.
-
-2003-12-03 Ettore Perazzoli <ettore@ximian.com>
-
- * e-msg-composer-hdrs.c: Do not #include
- <evolution-folder-selector-button.h>.
- (e_msg_composer_hdrs_set_post_to): #if 0 out for now.
- (e_msg_composer_hdrs_get_post_to): Likewise.
-
-2003-12-02 ERDI Gergo <cactus@cactus.rulez.org>
-
- * e-msg-composer.c: Implemented #127527: the attachment bar is
- packed inside an EExpander
-
-2003-12-01 Rodney Dawes <dobey@ximian.com>
-
- * e-msg-composer-hdrs.h: Use BASE_VERSION for repo_ids and OAFIIDs
-
-2003-11-11 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_set_autosaved): new method to
- wrap autosaved flag setting
- (e_msg_composer_unset_autosaved): ditto
- (e_msg_composer_is_autosaved): new method, says if composer was
- autosaved only
- (autosave_save_draft): unset changed so that we don't autosave all
- the time when anything else than gtkhtml control changed
-
-2003-11-06 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (autosave_save_draft): call gtkhtml's saved
- command to clean is-saved flag, set composer's autosaved flag
- (do_exit): complain if last save was just autosave
- (e_msg_composer_unset_changed): reset autosaved flag
- (save): reset autosaved flag
-
- * e-msg-composer.h: added autosaved flag, it tells whether last
- save was autosave or regular save, when changed flag is reset the
- autosaved one is reset too
-
-2003-11-30 Ettore Perazzoli <ettore@ximian.com>
-
- * e-msg-composer-hdrs.c (create_headers): #if 0 the "post to"
- stuff for now (it requires the global_shell_client and the
- evolution_folder_selector_button which we don't have anymore).
-
-2003-11-26 Chris Toshok <toshok@ximian.com>
-
- * e-msg-composer.c (build_message): switch from just checking
- SMIME_SUPPORTED to checking both HAVE_NSS and SMIME_SUPPORTED.
-
-2003-11-26 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: turn on deprecated gtk widgets
-
-2003-11-03 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (build_message): changed to use ciphercontext
- directly to sign the message, no multipart-signed usage.
- (build_message): do the same for multipart/encryption for gpg encrypting.
-
-2003-11-03 Ettore Perazzoli <ettore@ximian.com>
-
- * e-msg-composer-hdrs.h (SELECT_NAMES_OAFIID): Append "_2".
-
-2003-10-31 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (build_message): fix for e-account smime info
- changes. Also enforce having a signing certificate set in
- preferences before doing any signing.
- (from_changed_cb): handle smime sign/encrypt default for account
- (create_composer): force a from-changed when we start, to properly
- setup signing options.
-
-2003-10-30 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c: Turn on SMIME_SUPPORTED.
- (build_message): move some of the security code around, and fix
- up smime code.
-
-2003-10-08 Chris Toshok <toshok@ximian.com>
-
- * evolution-composer.c (corba_recipientlist_to_destv): EDestination =>
- EABDestination, and e_destination => eab_destination.
- (impl_Composer_set_headers): same.
-
- * e-msg-composer.c (update_auto_recipients): EDestination =>
- EABDestination, and e_destination => eab_destination.
- (e_msg_composer_new_with_message): same.
- (add_recipients): same.
- (handle_mailto): same.
- (e_msg_composer_set_headers): same.
- (e_msg_composer_get_recipients): same.
- (e_msg_composer_get_to): same.
- (e_msg_composer_get_cc): same.
- (e_msg_composer_get_bcc): same.
-
- * e-msg-composer.h: EDestination => EABDestination, and
- e_destination => eab_destination.
-
- * e-msg-composer-hdrs.c (set_recipients_from_destv): EDestination
- => EABDestination, and e_destination => eab_destination.
- (e_msg_composer_hdrs_to_message_internal): same.
- (e_msg_composer_hdrs_set_to): same.
- (e_msg_composer_hdrs_set_cc): same.
- (e_msg_composer_hdrs_set_bcc): same.
- (e_msg_composer_hdrs_get_to): same.
- (e_msg_composer_hdrs_get_cc): same.
- (e_msg_composer_hdrs_get_bcc): same.
- (e_msg_composer_hdrs_get_recipients): same.
-
- * e-msg-composer-hdrs.h: EDestination => EABDestination, and
- e_destination => eab_destination.
-
-2003-09-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (save): Don't blindly claim that the file
- exists and then ask the user if he/she would like to overwrite
- it. First check that the file even exists, if not - then we've got
- a different error. Fixes bug #48759.
-
- * e-msg-composer-select-file.c (e_msg_composer_select_file): Use
- the proper selector title, otherwise it says "Attach files" when
- we are trying to save a message.
-
-2003-09-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c (get_default_charset): Same as
- below.
-
- * e-msg-composer.c (composer_get_default_charset_setting): Handle
- empty-string as the charset value gotten from gconf as this can
- happen. Partial fix for bug #47638.
-
-2003-09-13 Charles Zhang <charles.zhang@sun.com>
-
- * e-msg-composer-attachment-bar.c (remove_attachment): Add some
- assertion. Send Close response signal to the properties dialog
- while removeing an attachment.
- * e-msg-composer-attachment-bar.c (remove_selected): Fix a re-
- remove-attachment bug. [#48466]
-
-2003-09-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c: updated for
- CamelTransferEncoding namespace changes
-
- * e-msg-composer.c: updated for CamelTransferEncoding namespace
- changes
-
-2003-09-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c:
- * e-msg-composer-attachment.c:
- * e-msg-composer.c: Updated for namespace changes in Camel.
-
-2003-09-17 Not Zed <NotZed@Ximian.com>
-
- ** Merge in mail-refactor-2-branch
-
-2003-09-15 Ettore Perazzoli <ettore@ximian.com>
-
- * e-msg-composer-hdrs.c (header_new_recipient): Make the entry
- non-focusable again. The right fix for A11Y is to add
- accelerators.
-
-2003-09-11 Federico Mena Quintero <federico@ximian.com>
-
- * e-msg-composer.h (EMsgComposer): Added an entry_uic field for a
- BonoboUIComponent for the non-control entries (e.g. the Subject
- line).
-
- * e-msg-composer.c (create_composer): Set autoactivate to true on
- the HTML control's BonoboControlFrame.
- (setup_ui): Create the composer->entry_uic.
- (destroy): Free the composer->entry_uic.
- (entry_verbs): New array of verbs for the non-control entries.
- Moved the Edit* verbs to here, as they should not be part of the
- main set.
- (composer_entry_focus_in_event_cb): Load
- evolution-composer-entries.xml here for the non-control entries' UI.
- (composer_entry_focus_out_event_cb): Remove the menu items.
-
-2003-09-10 Not Zed <NotZed@Ximian.com>
-
- * listener.c (impl_event): We want to use decode to stream for
- attachment parts.
-
-2003-09-08 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (autosave_load_draft): ugh, direct linking to
- evolution-mail suckage. Should these callbacks just be handled
- internally?
- (handle_multipart_encrypted, handle_multipart_signed)
- (handle_multipart_alternative, handle_multipart)
- (e_msg_composer_new_with_message): Use new em_utils stuff for
- message formatting.
-
-2003-08-22 Antonio Xu <antonio.xu@sun.com>
-
- * e-msg-composer-attachment.c (): Connect response signal to
- attachment properties dialog, fix bug #47950.
-
-2003-08-21 Antonio Xu <antonio.xu@sun.com>
-
- * Makefile.am (INCLUDES): add EVOLUTION_IMAGESDIR define
- * e-msg-composer.c (create_composer): use EVOLUTION_IMAGESDIR
- and composer icon name to get the path of composer icon.
- [#47781]
-
-2003-08-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * Original patch from David Woodhouse, but modified a bit by me.
-
- * e-msg-composer.c (handle_mailto): Fix insertion of arbitrary
- headers from mailto: links. Ignore From: and Reply-To: headers.
-
-2003-08-13 Lorenzo Gil Sanchez <lgs@sicem.biz>
-
- * e-msg-composer-hdrs.c (account_removed_cb): fixed an insulting
- error message. Fixes bug #47413.
-
-2003-08-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c (update): This needs to use
- camel_data_wrapper_decode_to_stream() rather than
- write_to_stream(). Also simplify a bit - no sense looping to load
- the pixbuf data into the gdk-pixbuf loader 4K at a time when we
- have the whole thing in a memory buffer already. Once done, unref
- the stream instead of closing it so we don't leak.
- (attach_to_multipart): Use decode_to_stream().
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_new):
- Avoid constructing thwe data-wrapper from the stream twice for
- message/rfc822 parts.
-
-2003-07-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c (attach_to_multipart): don't set
- the rawtext bit anymore.
-
- * e-msg-composer.c (build_message): Convert the plain part's
- content stream from UTF-8 to whatever charset we want.
-
-2003-07-31 Antonio Xu <antonio.xu@sun.com>
-
- * e-msg-composer.c (drag_data_received): add the drop type of
- mozilla browser link to make composer support to handle mozilla
- DnD data. [#47131]
-
-2003-07-28 Antonio Xu <antonio.xu@sun.com>
-
- * e-msg-composer-attachment-bar.c (update): add
- gdk_pixbuf_loader_close to close pix buffer loading. [#45908]
-
-2003-07-25 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.c (GNOME_GTKHTML_EDITOR_CONTROL_ID): require the
- new composer control version.
-
-2003-07-17 Michel Daenzer <michel@daenzer.net>
-
- * e-msg-composer.c (autosave_manager_query_load_orphans): Set
- default answer of dialog to 'yes' to try and prevent autosaved
- messages from getting lost accidentally.
-
-2003-07-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c (attach_to_multipart): Revert my
- previous changes here too.
-
- * e-msg-composer.c (build_message): Revert my previous changes.
-
-2003-07-23 Dan Winship <danw@ximian.com>
-
- * bad-icon.xpm: Remove this. It was only used by e-icon-list,
- which is no longer there.
-
- * composer-marshal.list: Likewise
-
- * Makefile.am: Update
-
-2003-07-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): Init charset to NULL.
-
-2003-07-21 Dan Winship <danw@ximian.com>
-
- * e-msg-composer.c (build_message): Make this work again.
-
-2003-07-17 Maxx Cao <maxx.cao@sun.com>
-
- ** For bug #46013
-
- * e-msg-composer-hdrs.c (header_new_recipient): To/cc/bcc buttons
- made focusable.
-
-2003-07-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c (attach_to_multipart): don't set
- the rawtext bit anymore.
-
- * e-msg-composer.c (build_message): Convert the plain part's
- content stream from UTF-8 to whatever charset we want.
-
-2003-07-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c (popup_menu_event): Fix warnings
- and other breakage introduced by Maxx.
-
-2002-07-14 Maxx Cao <maxx.cao@sun.com>
-
- ** For bug #45826
-
- * e-msg-composer-attachment-bar.c (class_init): connect the
- "popup_menu" signal, so that S-F10 keybinding will work.
- (popup_menu_event): funcion added to handle "popup_menu" (S-F10 key).
- (popup_menu_placement_callback): function added to place the popup
- menu to the center of attachment icon, in case it is activated by
- keyboard.
-
-2003-07-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_message): Updated to
- use camel_strcase_hash/equal.
-
-2003-07-01 Dan Winship <danw@ximian.com>
-
- * e-msg-composer-attachment-bar.c (pixbuf_for_mime_type): Gone.
- (update): Use e_icon_for_mime_type instead.
-
- * Makefile.am (INCLUDES): remove EVOLUTION_IMAGESDIR define
-
-2003-06-25 Antonio Xu <antonio.xu@sun.com>
-
- * e-msg-composer.c (handle_mailto): Change file url to absolute
- path. Fixes bug #44065.
-
-2003-07-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (autosave_load_draft): Connect to the
- save-draft signal too. Fixes bug #45531.
-
-2003-06-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): Set the rawtext bits for the
- 'plain' and 'html' data wrappers to FALSE.
-
-2003-06-19 Larry Ewing <lewing@ximian.com>
-
- * listener.c (insert_paragraph_after): free the return value.
- (impl_event): free the return value.
-
-2003-06-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (best_encoding): Use e_iconv_open/close so that
- we get charset aliasing for free. Fixes bug #44991.
-
-2003-06-16 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes bug #44139.
-
- * e-msg-composer-hdrs.c (attach_couple): Set the vertical and
- horizontal padding to 3 always.
- (create_from_optionmenu): Change the hbox spacing to 6 pixels.
-
- * e-msg-composer.c (create_composer): Set the border width around
- the composer's vbox to HIG specification and make the box_spacing
- 6 pixels as well.
-
-2003-06-10 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_and_string_free):
- free the structure as well.
-
-2003-06-09 Larry Ewing <lewing@ximian.com>
-
- * listener.c (insert_paragraph_before): free the return values.
-
-2003-05-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (composer_get_default_charset_setting): Same as
- the rest.
- (setup_ui): We didn't even seem to be using the gconf client
- here. Removed.
- (e_msg_composer_load_config): Unref the gconf client after we're
- finished.
- (e_msg_composer_new): Same.
- (e_msg_composer_new_post): Here too.
- (e_msg_composer_set_view_from): And here.
- (e_msg_composer_set_view_replyto): And here.
- (e_msg_composer_set_view_cc): Here too.
- (e_msg_composer_set_view_bcc): Again here.
-
- * e-msg-composer-hdrs.c (create_from_optionmenu): Same as below.
- (e_msg_composer_hdrs_set_from_account): Here too.
-
- * e-msg-composer-attachment-bar.c (get_default_charset): Unref the
- gconf client.
diff --git a/composer/ChangeLog.pre-1-4 b/composer/ChangeLog.pre-1-4
deleted file mode 100644
index 58f0eebec1..0000000000
--- a/composer/ChangeLog.pre-1-4
+++ /dev/null
@@ -1,4037 +0,0 @@
-2003-05-20 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.c (composer_settings_update): set the various
- bonobo properties that are composer preferences.
- (create_composer): add notification of gconf changes.
- (destroy): disconnect notification.
-
- * e-msg-composer.h: keep the gcond notify handler id.
-
-2003-05-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_edit):
- Don't connect to the focus-out-event in order to update the
- mime-type. Simply don't update the mime-type ever. Fixes bug
- #42798.
-
-2003-04-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (autosave_manager_query_load_orphans): Change
- the "would you like to recover unsaved drafts?" dialog a QUESTION
- dialog rather than an ERROR dialog. Fixes bug #42024.
-
-2003-04-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c (pixbuf_for_mime_type): If we
- fail to load the icon that gnome_vfs_get_icon() gave us, the
- default back to gnome-unknown.png. This is the only POSSIBLE way
- for Anna to be getting a NULL pixbuf if she has gnome-unknown.png
- that I can see. Should fix bug #41513.
-
-2003-04-23 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (map_default_cb): removed debug printfs.
-
-2003-04-22 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (add_attachments_handle_mime_part): added
- related argument, TRUE means that container of mime_part is
- multipart/related
- (add_attachments_handle_mime_part): add images as inline when
- related is TRUE
- (add_attachments_from_multipart): pass related to
- add_attachments_handle_mime_part
-
-2003-04-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (add_attachments_handle_mime_part): Don't ever
- attach non-inlined text or message parts. Reverts a prior fix.
-
-2003-04-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment.glade: Change the order of the
- ok/cancel buttons.
-
-2003-04-19 Chris Toshok <toshok@ximian.com>
-
- [ fixes #40694 ]
- * e-msg-composer-hdrs.c (create_addressbook_entry): this can't
- hurt - set the frame to autoactivate so if by some chance the
- widget is focused the control will end up being activated.
-
- * e-msg-composer.c (map_default_cb): activate the To: control
- instead of focusing the widget.
-
-2003-04-18 Rodney Dawes <dobey@ximian.com>
-
- * Makefile.am:
- * e-msg-composer.c:
- Use PREFIX instead of EVOLUTION_DATADIR for bonobo_ui_util_set_ui ().
- Fixes bug #21499.
-
-2003-04-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment.c (file_name_focus_out_cb): Return
- FALSE so the signal gets propogated further up the chain. Fixes
- bug #41238.
- (e_msg_composer_attachment_edit): The focus-out-event signal name
- changed (although the old name still works...for now?).
-
-2003-04-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment.glade: Updated to comply with the
- HIG. Fixes bug #41239 and bug #41241.
-
-2003-04-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (composer_get_default_charset_setting): Use
- e_iconv_locale_charset() instead of e_iconv_locale_name(), dunno
- what I was thinking. locale_name() doesn't even exist.
- (setup_ui): Don't free the default_charset, it's a const char*.
-
- * e-msg-composer-attachment-bar.c (get_default_charset): Same.
-
-2003-04-09 Chris Toshok <toshok@ximian.com>
-
- * e-msg-composer.c (setup_ui): fix build, it's
- composer_get_default_charset_setting.
-
-2003-04-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (composer_get_default_charset_setting): Same as
- with attachment-bar's get_default_charset().
- (setup_ui): Instead of pulling the default charset from gconf,
- call our helper function above.
-
- * e-msg-composer-attachment-bar.c (get_default_charset): If gconf
- returns a NULL string, default back to the locale charset.
-
-2003-04-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (map_default_cb): Added some debug printfs.
- (create_composer): Call map_default_cb directly instead of having
- it in a "map" callback. Ettore says we shouldn't be doing this
- *shrug*. Still doesn't work tho.
-
-2003-04-07 Chris Toshok <toshok@ximian.com>
-
- [ fixes bug #39763 ]
- * e-msg-composer.c (setup_cut_copy_paste): remove the
- control_entry_focus_{in,out}_event_cb signal stuff.
- (control_entry_focus_in_event_cb): nuke
- (control_entry_focus_in_event_cb): same.
-
- * e-msg-composer-hdrs.c (create_addressbook_entry): pass the
- contain to bonobo_widget_new_control_from_objref when creating the
- entries.
-
-2003-04-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (autosave_save_draft): If the composer isn't
- 'dirty', then don't autosave the draft (no need to). Fixes bug
- #40764.
-
-2003-04-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (menu_edit_select_all_cb): Add a select-all
- callback and verb.
- (composer_entry_focus_in_event_cb): Set our bonobo-ui verbs.
-
-2003-04-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-select-file.c (e_msg_composer_select_file): Guard
- against the filesel's selection being NULL. Fixes bug #40679.
-
-2003-04-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (composer_entry_focus_in_event_cb): Keep track
- of which entry widget has focus.
- (composer_entry_focus_out_event_cb): Same.
- (control_entry_focus_in_event_cb): Same idea, but since this is in
- another component, tell that component that its widget has focus
- so it can merge bonoboui cut/copy/paste (and anything else) menus.
- (control_entry_focus_out_event_cb): Same.
- (setup_cut_copy_paste): Connect to the focus-in and focus-out
- events for all the entry widgets and the html editor.
- (menu_edit_cut_cb): New callback function since the composer will
- now own the Cut/Copy/Paste menu items sometimes (depending on
- which widget is in focus... confused yet? good).
-
- * e-msg-composer-hdrs.c (from_changed): Update the Reply-To entry
- to be a normal GtkEntry.
- (create_headers): Same.
- (e_msg_composer_hdrs_set_reply_to): Here too.
- (e_msg_composer_hdrs_get_reply_to): And finally here.
-
-2003-04-01 Not Zed <NotZed@Ximian.com>
-
- ** See bug #40300 & probably others.
-
- * e-msg-composer.c (autosave_manager_query_load_orphans): make the
- composer arg a parent arg, its only used parent the dialogue.
- Fix caller casts.
- (e_msg_composer_check_autosave): new function, checks for
- autosave files, and recovers them per user instructions.
-
-2003-03-31 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment.glade: Convert to libglade-2's format.
-
- * e-msg-composer.c (set_editor_signature): E_MSG_COMPOSER_HDRS
- (composer->hdrs)->account->id can never be NULL anymore.
-
-2003-03-25 Dan Winship <danw@ximian.com>
-
- * e-msg-composer.c: Update for e_notice move
-
-2003-03-20 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes for bug #39813
-
- * e-msg-composer.c (composer_finalise): Don't unregister the
- signature event handler here.
- (destroy): Unregister it here instead.
-
-2003-03-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (add_attachments_handle_mime_part): Change the
- logic to attach text parts when appropriate.
- (map_default_cb): Grab the focus of the To entry widget. Fixes bug
- #39800. Fixes another #warning too.
-
-2003-03-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (do_exit): e_msg_composer_hdrs_get_subject()
- now returns const so don't g_free() it :-)
- (map_default_cb): Same as above. Also, the subject entry no longer
- derives from GnomeCanvas so eliminate the now unneeded casting to
- grab the focus of the subject widget.
- (e_msg_composer_get_subject): Return a const char * now.
-
- * e-msg-composer-hdrs.c (create_headers): Make the subject entry
- into a GtkEntry so we don't have to worry about i18n and other
- EEntry bugs anymore. Fixes numerous bugs (including #39924).
- (e_msg_composer_hdrs_set_subject): Use gtk_entry_set_text().
- (e_msg_composer_hdrs_to_message_internal):
- e_msg_composer_hdrs_get_subject() now returns const.
- (e_msg_composer_hdrs_get_subject): Return a const char *.
- (entry_changed): e_msg_composer_hdrs_get_subject() now returns
- const.
-
-2003-03-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (create_composer): Default the composer's title
- to "Create a message". Fixes bug #39696.
-
-2003-03-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c: Use GnomeIconList instead of
- EIconList so we don't have to maintain an exact copy/paste of
- GnomeIconList ourselves. I don't udnerstand why we ever did.
-
- * e-icon-list.[c,h]: Removed.
-
-2003-03-11 Not Zed <NotZed@Ximian.com>
-
- * evolution-composer.c (evolution_composer_new): add
- send_cb/save_draft_cb arguments.
- (impl_Composer_send): use the local send_cb.
- (evolution_composer_init): dont init send, save-draft signals
- here.
- (evolution_composer_new): init signals here, fix params to
- composer_construct().
- (evolution_composer_factory_init): remove, part of mailer now.
- (factory_fn): same.
- (finalise): disconnect from callbacks first.
-
- * evolution-composer.h: add send_cb/save_draft_cb to composer object.
-
-2003-03-10 Not Zed <NotZed@Ximian.com>
-
- * evolution-composer.c (finalise): from destroy.
- (evolution_composer_class_init): gtkobject->gobject stuff.
- (evolution_composer_new): remove old redundant stuff.
-
-2003-03-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (composer_get_default_charset_setting): Don't
- allow the returned charset to be NULL.
- (get_file_content): Make sure there is buffered data before trying
- to convert it to UTF-8.
-
-2003-03-04 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer-hdrs.c (destroy): disconnect any signal handlers
- on the accounts object. For bug #37873.
-
-2003-02-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c: Same as below.
-
- * e-msg-composer-attachment-bar.c: Go back to using
- e_iconv_charset_name().
-
-2003-02-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (drag_data_received): Make sure the url is !=
- NULL? I can't think of anything else in this code that could
- possibly cause bug #38382.
-
- * e-msg-composer-attachment-bar.c (pixbuf_for_mime_type): Fixed a
- memory leak.
-
-2003-02-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_set_send_html): Don't save the
- HTML format setting to gconf. This option menu is meant for a
- per-essage setting (ie. once the composer closes, the next
- composer will again use the default and not what the user chose
- last time).
-
-2003-02-21 Dan Winship <danw@ximian.com>
-
- * Makefile.am: build libcomposer as a shared library so it can be
- linked into libevolution-mail.so without portability problems
-
-2003-02-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (composer_get_default_charset_setting): Same as
- below.
-
- * e-msg-composer-attachment-bar.c (get_default_charset): Use
- camel_charset_canonical_name() rather than e_iconv_charset_name()
- as the latter will be removed shortly.
-
-2003-02-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_set_from_account):
- default_account is now a string value, not an int.
- (create_from_optionmenu): Same.
- (header_new_recipient): Use g_signal_connect_data() instead of the
- now deprecated gtk_signal_connect_full().
-
-2003-02-06 Dan Winship <danw@ximian.com>
-
- * Makefile.am: clean up
-
- * e-msg-composer.c (autosave_manager_query_load_orphans): #include
- string.h
- (menu_file_send_cb): s/gtk_signal_emit/g_signal_emit/
-
- * e-msg-composer-attachment.c: #include string.h
- (e_msg_composer_attachment_edit): s/E_GLADEDIR/EVOLUTION_GLADEDIR
-
- * e-msg-composer-attachment-bar.c: #include string.h
- (pixbuf_for_mime_type): s/ICONSDIR/IMAGESDIR/
-
- * e-msg-composer-hdrs.c: #include string.h
-
- * e-msg-composer-select-file.c (run_selector): Remove unused var
-
- * evolution-composer.c: #include string.h
- (evolution_composer_init): Remove unused var
-
- * listener.c: #include string.h
- (listener_new): Remove unused var
-
-2003-02-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_new_from_url): Split out the
- mailto handling code from here so we can use it in the drag-n-drop
- code too.
- (drag_data_received): If we find a mailto: url in the
- text/uri-list drop, pass that off to handle_mailto() so it can
- fill in the fields for us.
-
-2003-02-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment.c: Just use
- gnome_vfs_get_mime_type_from_name().
-
-2003-02-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment.c (update_mime_type): Give
- gnome_vfs_get_uri_from_local_path a full path.
-
-2003-01-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_new_from_url): If the subject
- or body components of the mailto url are not in UTF-8, convert
- them to UTF-8.
-
- * e-msg-composer-attachment.c (update_mime_type): Fixed a #warning
- by converting the filename into a uri before passing it into
- gnome_vfs_get_mime_type() since that function really needs a uri.
-
-2003-01-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-hdrs.c (init): Get the list of accounts here and
- ref the account-list.
- (destroy): Unref the accounts list here.
- (create_from_optionmenu): Connect to the added/changed/removed
- account-list signals here.
- (account_added_cb): New callback function that adds the newly
- added account to the from-dropdown menu.
- (account_changed_cb): New callback that changes the label for the
- account that got changed in the dropdown menu.
- (account_removed_cb): Removes the account from the from dropdown
- menu.
-
-2003-01-24 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (iconsdir): Remove, this is now defined in
- configure.in.
-
-2003-01-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_load_config): Load the view
- menu states from gconf.
- (e_msg_composer_set_send_html): Save the setting via gconf instead
- of bonobo-config.
- (e_msg_composer_set_view_from): Same.
- (e_msg_composer_set_view_replyto): Here too.
- (e_msg_composer_set_view_cc): Again here.
- (e_msg_composer_set_view_bcc): And finally here.
- (setup_ui): Fixed a #warning - use gconf instead of bonobo-conf.
- (destroy): No need to sync/destroy the bonobo-conf db, we don't
- use it anymore.
-
-2003-01-16 Ettore Perazzoli <ettore@ximian.com>
-
- * e-msg-composer.c (setup_ui): Get evolution-message-composer.xml
- from EVOLUTION_UI_DIRECTORY.
-
- * Makefile.am (gladedir): Version it using $(BASE_VERSION).
- (iconsdir): Likewise.
- (libcomposerincludedir): Removed.
-
-2003-01-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * evolution-composer.c (impl_Composer_set_headers): Updated to use
- EAccountList and iterators.
- (evolution_composer_init): Updated to use EAccount.
-
- * e-msg-composer.c (from_changed_cb): Updated to use the EAccount
- object.
- (e_msg_composer_new_with_message): Same.
- (e_msg_composer_get_preferred_account): Updated to return an
- EAccount object.
- (set_editor_signature): Updated to use an EAccountIdentity pointer.
- (get_signature_html): Same.
-
- * e-msg-composer-hdrs.c (create_from_optionmenu): Updated to use
- EAccount and EAccountList foo.
- (destroy): Same here.
- (e_msg_composer_hdrs_set_from_account): Here too.
- (e_msg_composer_hdrs_get_from): Updated.
-
-2003-01-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (signature_cb): mail_config_get_signature_list
- now returns a GSList.
- (setup_signatures_menu): Same.
- (set_signature_gui): Here too.
-
-2003-01-14 Ettore Perazzoli <ettore@ximian.com>
-
- * e-msg-composer.c (do_exit): Make dialog HIG compliant
- [Discard/Cancel/Save].
-
-2003-01-09 Chris Toshok <toshok@ximian.com>
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_set_to): don't pass
- NULL to bonobo_widget_set_property.
- (e_msg_composer_hdrs_set_cc): same.
- (e_msg_composer_hdrs_set_bcc): same.
-
-2003-01-09 Chris Toshok <toshok@ximian.com>
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_new): need to
- ref/sink "new" so that the g_object_unref doesn't spew a warning.
-
-2003-01-08 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am: Icons are now in $(datadir)/evolution/images
- instead of $(datadir)/images/evolution.
-
-2003-01-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-hdrs.c (create_from_optionmenu): Use gconf to get
- the default account index.
- (e_msg_composer_hdrs_set_from_account): Same.
-
-2003-01-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c (get_default_charset): New
- convenience function.
- (attach_to_multipart): Use get_default_charset().
-
- * e-msg-composer.c (composer_get_default_charset): Convenience
- function.
- (get_file_content): Use the convenience function to get the
- default charset setting.
- (best_charset): Same.
- (e_msg_composer_new): Use gconf to get the send_html setting.
- (e_msg_composer_new_post): Same.
-
-2003-01-06 Dan Winship <danw@ximian.com>
-
- * Makefile.am: Remove idldir definition. (It's defined in
- configure.in now)
-
-2002-12-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (get_signature_html): Use camel_text_to_html().
- (e_msg_composer_new_from_url): Same.
-
- * evolution-composer.c (impl_Composer_set_body): Use
- camel_text_to_html().
-
-2002-12-07 Jeffrey Stedfast <fejj@ximian.com>
-
- Fix for bug #33295
-
- * e-msg-composer-attachment.c: Change the parent_class to a
- GObjectClass pointer instead of a GtkObjectClass pointer.
- (e_msg_composer_attachment_edit): Ref the attachment object so
- that if the attachment is removed while it is still being edited,
- the attachment object will still exist and therefor foil the
- user's attempt to make Evolution crash when they close the
- properties dialog for this attachment.
- (close_cb): Unref the attachment object.
-
-2002-12-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (message_rfc822_dnd): Get rid of the unused
- exception variable.
-
-2002-11-27 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (save): removed warning about e_notice. its
- used too much, its here to stay.
-
- * *.[ch]: run fix.sh over everything.
-
-2002-12-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c: s/g_str[n]casecmp/str[n]casecmp
-
-2002-11-26 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (composer_finalise): properly chain finalise.
-
-2002-11-25 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer-attachment-bar.c (init): Remove the window size
- setting.
- (e_msg_composer_attachment_bar_new): Move the window size setting
- here. Also set icon width based on 15 approximate characters, so
- the icon text is more readable.
-
-2002-11-22 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer-select-file.c: rewrote most of this. Just use
- gtkfileselection directly, no e-file-selector, much
- smaller/simpler.
-
-2002-11-21 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer-attachment-bar.c (remove_attachment): fix
- g_signal_emit params, detail in wrong spot.
- (add_common): Same.
-
- * e-icon-list.c (icon_new_from_pixbuf): remove the
- 'use_broken_event_handling' set.
- (emit_select): Add detail to signal emit.
- (text_changed): Same.
-
- * e-msg-composer.c (subject_changed_cb): Duh! dont free subject &
- simplify logic a little.
-
-2002-11-20 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer-hdrs.c (entry_changed): duh, emit the signal
- using an initialised value(!).
-
-2002-11-19 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_get_sig_file_content): use
- CAMEL_MIME_FILTER_TOHTML_PRESERVE_8BIT flag
-
-2002-11-19 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer-attachment-bar.c (add_from_file): dont unref
- after destroy. duh.
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_set_to): Add type
- code to set_property call.
- (e_msg_composer_hdrs_set_cc): "
- (e_msg_composer_hdrs_set_bcc): "
- (e_msg_composer_hdrs_get_to): Do the same for get_property calls.
- (init): ref/sink the tooltip object.
- (e_msg_composer_hdrs_get_type): fix return type.
-
- * e-msg-composer.c (GNOME_GTKHTML_EDITOR_CONTROL_ID): we want
- version 3.0 not 1.1.
- (create_composer): Add type code to set property call.
- (autosave_manager_query_load_orphans): my bad, we dont unref
- dialog's once we've destroyed 'em.
- (build_message): "
- (get_file_content): "
- (save): "
- (do_exit): "
- (composer_dispose): moved the autosave shutdown here.
-
-2002-11-18 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (create_composer): Remove check for
- gtk_main_level(). as far as i can tell it serves no real purpose,
- and i think gtkmain is now redundant.
- (e_msg_composer_new_with_message): Same here.
- (destroy): moved some stuff into finalise, and made destroy
- mulitcall safe.
-
-2002-11-13 Ettore Perazzoli <ettore@ximian.com>
-
- * listener.h: Removed {BEGIN,END}_GNOME_DECLS.
-
- * e-msg-composer-select-file.c: Do not #include
- <libgnome/gnome-defs.h>.
- * e-msg-composer.c: Likewise.
- * listener.h: Likewise.
-
-2002-11-13 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (setup_ui): bonobo api changes.
-
- * e-icon-list.c (e_icon_list_new): Use the right object_new method.
-
- * e-icon-list.h: get rid of BEGIN/END_GNOME_DECLS stuff.
-
-2002-11-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c: Remove some unused ehaders and
- ones that cause compilation failures (such as gnome-defs.h).
-
- * e-icon-list.h: Same.
-
-2002-11-08 Not Zed <NotZed@Ximian.com>
-
- * listener.c: Fix bonobo object setup.
-
- * e-msg-composer-hdrs.c: Remove oaf stuff, fix destroy to be
- multi-call safe.
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_new):
- Remove utf8 from locale conversions, & glib api changes.
- (ok_cb): "
-
- * e-msg-composer-attachment-bar.c (add_from_file): gtk message
- dialog.
- (pixbuf_for_mime_type): glib,gnome-vfs api changes.
- (init): Estimate the icon_height based on the pango font
- description size, this is probably not correct.
- (properties_cb):
- (remove_cb): Changed signature for gnomeui callbacks.
- (popup_icon_context_menu):
- (popup_context_menu): popup_menu api change
- (destroy): Protect from multiple calls.
- (e_msg_composer_attachment_bar_new): Remove push/pop
- visual/colormap stuff.
-
- * composer-marshal.list: The list of marshallers used by the
- composer.
-
- * Makefile.am (composer-marshal.h): Added composer marshal builder.
-
- * evolution-composer.c (class_init): bonobo object epv setup change.
- (factory_fn): Fix changes to factory callback.
-
- * e-icon-list.c: (icon_get_height): Use bounding box to calc
- height.
- (icon_event): drop gtk_selection_extended.
- (e_icon_list_remove): "
- (select_icon):
- (unselect_icon): "
-
- * e-msg-composer.c (autosave_save_draft): Dup fd rather than poke
- camel_stream_fd's data. Also, use camel_stream_close() rather
- than flush.
- (autosave_manager_query_load_orphans): Port to gtk dialog.
- (autosave_query_cb): Removed, redundant.
- (save): Port to gtkdialog.
- (prepare_engine): Fix bonobo-object-client code.
- (get_file_content): gtk dialog
- (do_exit): gtk dialog.
- (setup_signatures_menu): dump gtkutf8 stuff.
- (marshal_NONE__NONE_INT): What WAS jeff thinking? Removed :)
- (class_init): g object setup.
- (e_msg_composer_get_type): "
- (create_composer): remove bonobo_window_construct, use create
- property instead. g_signal stuff. bonobo stuff.
- (is_special_header): Use ascii_strncasecmp
- (e_msg_composer_set_pending_body): gtk->g_object_get/set_data.
- (e_msg_composer_set_body): use ascii_strncasecmp
- (e_msg_composer_add_inline_image_from_mime_part): make cid const.
- (autosave_manager_register):
- (autosave_manager_unregister): Use g_path_get_basename() & account
- for differences.
- (composer_shutdown): rename to finalise/etc.
- (class_init): Use object:finalize instead of shutdown.
- (e_msg_composer_set_body): Use _() rather than U_().
- (build_message): gtk dialog.
-
-2002-11-06 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer-attachment-bar.c (pixbuf_for_mime_type): Add
- error return to gdk_pixbuf_new_from_file().
-
-2002-11-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_new_from_url): Add support for
- an attach option in the mailto: url.
-
-2002-10-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_message): Make sure to
- save References and In-Reply-To headers. Fixes bug #32932.
-
-2002-10-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c (attach_to_multipart): Don't set
- the charset param on text parts nor tha rawtext bit on the content
- if a charset for the part is already specified.
-
-2002-10-25 Ettore Perazzoli <ettore@ximian.com>
-
- * e-msg-composer-attachment-bar.c (size_to_string): Return NULL
- instead of the empty string if the size is less than one K.
- (update): Only put the size if size_to_string() doesn't return
- NULL. [#32751]
-
-2002-10-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-hdrs.c (create_from_optionmenu): Only add the
- account address to the list of addresses if it is non-NULL. Fixes
- bug #32446 although it shouldn't ever happen anyway (an account
- address is not allowed to be NULL).
-
-2002-10-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_new): We
- need to treat message/rfc822 streams differently. Fixes bug
- #32378.
-
-2002-10-16 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer-select-file.c (select_file_internal): Mark the
- file selector modal. Quick fix for bug #32256.
-
-2002-10-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c (attach_to_multipart): Set
- content->rawtext to TRUE for text parts because the content is in
- its raw form (since we didn't know the charset when we created
- it). Also only write out the content-object to discover the best
- encoding, we don't want to include the headers of the MIME
- part. Second half of the fix for bug #31655.
-
-2002-10-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (get_file_content): Don't create a new file if
- the file doesn't exist.
-
-2002-10-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): If the user hits cancel when
- signing/encrypting, don't continue constructing the message,
- instead abort (and just don't pop up a dialog).
-
-2002-10-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): When signing/encrypting a
- part, if a USER_CANCEL occurs, re-use the part otherwise unref it
- and replace it with the new part.
-
-2002-09-30 Aaron Weber <aaron@ximian.com>
-
- * evolution-composer.c (evolution_composer_factory_init): adjust
- string on line 391
-
- * e-msg-composer.c (create_composer): adjust string on 2872
-
-2002-09-27 Dan Winship <danw@ximian.com>
-
- * Evolution-Composer.idl (setHeaders): let the caller set the
- "From" account too (by name or address).
-
- * evolution-composer.c (impl_Composer_set_headers): Update for
- that.
-
-2002-09-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): Don't reuse the part that
- we've signed and/or encrypted, create a new part container
- instead. Fixes bug #31379.
-
-2002-09-25 Dan Winship <danw@ximian.com>
-
- * e-msg-composer-hdrs.c (create_headers): Use "mail/*" for the
- allowed_types for the posting folder selector.
-
-2002-09-24 Dan Winship <danw@ximian.com>
-
- * e-msg-composer-hdrs.c (create_from_optionmenu): Only append the
- account name to the end of the From menu item if the email address
- is not unique. (That was added for people who have multiple
- accounts with the same email address but different transports. The
- rest of us don't need to be reminded of the account name, and
- having it there can make the window very wide.)
-
-2002-09-24 Zbigniew Chyla <cyba@gnome.pl>
-
- * e-msg-composer-attachment-bar.c (size_to_string):
- Don't mark empty string with _().
-
-2002-09-23 Ettore Perazzoli <ettore@ximian.com>
-
- * e-icon-list.c (icon_new_from_pixbuf): Removed a #warning.
-
- * e-msg-composer-attachment-bar.c (size_to_string): Don't use dots
- here so we don't get funny wrapping from GnomeIconList. [#236]
-
-2002-09-22 Dan Winship <danw@ximian.com>
-
- * e-msg-composer.c (save): Fix non-ANSI switch statement
-
-2002-09-19 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (signature_cb): allow to select last 2 menu
- items
-
-2002-09-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (add_attachments_from_multipart): Handle
- multipart/signed and multipart/encrypted parts in a more expected
- way. Fixes bug #28453.
-
-2002-09-15 Kjartan Maraas <kmaraas@gnome.org>
-
- * e-msg-composer.c: Mark a string for translation.
-
-2002-09-05 Ettore Perazzoli <ettore@ximian.com>
-
- * e-msg-composer.c (composer_key_pressed): Don't chain the event
- handler here -- that's just wrong! Also stop emission of the
- signal when we catch Escape.
-
-2002-09-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (create_composer): Make it so that the composer
- will close when the user hits Escape.
-
-2002-08-27 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (signature_cb): removed "Set as default" menu item
-
-2002-08-26 Peter Williams <peterw@ximian.com>
-
- * e-msg-composer.c (handle_multipart): Oops, we were overwriting
- 'multipart' with our child multipart. Fixes 29399.
- (handle_multipart_alternative): Here too.
-
-2002-08-22 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes bug #29016
-
- * e-msg-composer.c (e_msg_composer_new_with_message): If the
- X-Evolution-PostTo header exists, then treat this message composer
- as a PostTo composer rather than a mail composer.
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_to_message_internal):
- Set the X-Evolution-PostTo header if that is the mdoe we are in.
-
-2002-08-16 Dan Winship <danw@ximian.com>
-
- * e-msg-composer-hdrs.c (create_headers): Use an
- EvolutionFolderSelectorButton instead of a label to indicate the
- posting destination. #27920.
- (e_msg_composer_hdrs_set_post_to): Use
- evolution_folder_button_set_uri.
- (e_msg_composer_hdrs_get_post_to): Use
- evolution_folder_button_get_folder.
-
-2002-08-14 Dan Winship <danw@ximian.com>
-
- * e-msg-composer.c (from_changed_cb): Don't turn on pgp signing if
- this is an iMIP message and pgp_no_imip_sign is set.
- (e_msg_composer_set_body): If setting a text/calendar body and
- pgp_no_imip_sign is true, turn off signing.
-
-2002-08-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (do_exit): Make the warning dialog display the
- message subject so that it is more clear which composer the dialog
- is referring to. Fixes bug #25467.
-
-2002-08-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-select-file.c (create_file_selection): Set the
- file-selection window icon. Fixes the mailer part of bug #7368.
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_new):
- Don't call new_from_mime_part() since that function now does some
- copying of the mime part rather than simply reffing it.
- (e_msg_composer_attachment_new_from_mime_part): Make a copy of the
- MIME part so that if the message that this part belongs to gets
- deleted from the the remote store, the composer will still have a
- copy of it. Fixes bug #20308.
-
-2002-07-31 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_message): Parse the
- auto-cc/bcc recipients and then later when parsing the cc/bcc
- recipients into EDestination objects, if the address is an
- auto-*cc address, then set auto_recipient to TRUE on that
- EDestination. This fixes bug #28339.
-
-2002-07-29 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (encode_signature_name): new helper function
- (decode_signature_name): new helper function
- (get_signature_html): use encode_signature_name
- (set_signature_gui): use decode_signature_name
-
-2002-07-26 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (do_exit): don't assert on default, when ESC is
- pressed, the dialog is closed as well and we get button number -1
- (set_signature_gui): new helper method to set signature from draft
- message
- (e_msg_composer_new_with_message): use set_signature_gui
-
-2002-07-26 Ettore Perazzoli <ettore@ximian.com>
-
- * e-msg-composer-attachment-bar.c (pixbuf_for_mime_type):
- Special-case message/digest, multipart/digest and message/rfc822
- and give them a nice icon. [#9786]
-
- * Makefile.am (INCLUDES): Add -D for EVOLUTION_ICONSDIR.
-
-2002-07-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-hdrs.c (create_headers): Create the Post-To
- header.
- (headers_set_visibility): Possibly show the Post-To header.
- (attach_headers): Attach the Post-To header.
- (e_msg_composer_hdrs_set_post_to): Set the text for the Post-To
- header.
- (e_msg_composer_hdrs_get_post_to_label): Return the label widget
- for this header pair.
- (e_msg_composer_hdrs_set_visible_mask): New function to set the
- visible mask (so we can disallow certain headers to be shown).
- (e_msg_composer_hdrs_new): Save the visible mask argument.
- (setup_headers): To: does not always have to be visible anymore.
- (e_msg_composer_hdrs_get_post_to): New function to get the url for
- the Post-To folder.
-
- * e-msg-composer.c (e_msg_composer_get_visible_flags): Set the
- Post-To bit when it is supposed to be visible.
- (e_msg_composer_new_post): Set the visible_mask to only allow the
- headers needed for Posting.
-
-2002-07-25 Dan Winship <danw@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_set_body): Fix spelling.
-
-2002-07-23 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (autosave_run): restart automanager to avoid
- multiple dialog apearing
-
-2002-07-23 Not Zed <NotZed@Ximian.com>
-
- * Applied patch below.
-
-2002-07-19 Christian Kreibich <christian@whoop.org>
-
- * e.msg-composer.c (get_signature_html): Test for the signature
- delimiter not only at the beginning of a signature file, but also
- inside the signature.
-
-2002-07-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_set_view_bcc): Reverted some
- code that got committed by accident.
- (e_msg_composer_set_view_cc): Same.
- (e_msg_composer_set_view_replyto): Here too.
- (e_msg_composer_set_view_from): And here.
-
-2002-07-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c: Removed a lot of extra g_return_if_fail's that
- we don't need (if we are going to check if the pointer is a a
- composer widget using the gtk type-check macros, then there is no
- need to first check that it isn't NULL).
- (get_file_content): Signatures are now supposed to be in UTF-8 and
- not the user's locale charset, so we must first read in the
- content, then check that it is valid UTF-8. If it isn't, then we
- need to try to convert it to UTF-8.
-
-2002-07-22 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c: removed Insert File menu item
-
-2002-07-19 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_to_message_internal):
- This should use address_encode, since its an rfc822 address, not
- address_format which is for display.
-
-2002-07-17 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (save): use "saved" gtkhtml command
- (e_msg_composer_is_dirty): use "is-saved" gtkhtml command
-
-2002-07-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_set_headers): Set the
- from-account last so that auto-cc/bcc recipients don't get
- overwritten when setting the cc/bcc recipient fields.
-
-2002-07-16 Peter Williams <peterw@ximian.com>
-
- * e-msg-composer.c (create_composer): Instead of doing this with a
- weakref, do it by connecting to the destroy signal. The weakref was
- not getting notified in certain conditions that I could never really
- pin down, and this caused problems at exit.
-
- * e-msg-composer-hdrs.c (create_headers): Reorder to create reply_to
- before from, because create_from_optionmenu causes from_changed to
- be called, which expects reply_to.entry to exist.
-
-2002-07-15 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (build_message): added save_html_object_data
- parameter, use gtkhtml command to save object data when wanted
-
-2002-07-08 Peter Williams <peterw@ximian.com>
-
- * Makefile.am (INCLUDES): Fix cflags for ebook header namespacing.
-
-2002-07-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * evolution-composer.c (init): Don't connect to the postpone
- signal, but do connect to the save-draft signal.
- (evolution_composer_factory_init): No longer takes a postpone_cb
- argument, but does now take a save_draft_cb argument.
-
- * e-msg-composer.c (menu_file_send_later_cb): Removed.
- (class_init): Removed the POSTPONE signal.
- (setup_ui): Don't need to swap the Send/SendLater tooltips and
- accels anymore, since SendLater no longer exists.
-
-2002-06-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): Use the new
- CamelMultipartEncrypted class to do our encryption work for us. We
- also need to always get the user's userid before encrypting since
- pgp/gpg need that.
- (e_msg_composer_new_with_message): Handle multipart/signed and
- multipart/encrypted parts by adding the (decrypted) content and
- setting the composer to pgp sign/encrypt the message when the user
- re-sends it.
-
-2002-06-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): Use
- mail_crypto_get_pgp_cipher_context() so that the PGP/GPG decision
- is done for us.
-
-2002-06-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): Use the new gpg cipher context
- rather than the old pgp context.
-
-2002-06-19 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (get_signature_html): don't convert text to
- html twice
-
-2002-06-10 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (signature_cb): added "Set as default" menu
- item
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_get_from_omenu): new
- method
- (e_msg_composer_hdrs_set_from_account): use
- e_msg_composer_hdrs_get_from_omenu
-
-2002-06-07 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (get_signature_html): use new script signature
- interface
-
-2002-06-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_set_from_account):
- Agh, priv->from.entry is no longer a GtkOptionMenu - it is an hbox
- containing the GtkOptionMenu.
-
- * e-msg-composer.c (setup_ui): Remove the customize toolbar thingy
- since Michael said that this would fix bug #17952.
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_set_from_account):
- Clean up the logic in this. For one, we don't need to do strstr
- using the account address (wtf??).
-
-2002-06-05 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer-hdrs.c (create_from_optionmenu): put option menu
- to hbox to make space for signatures menu
- (e_msg_composer_hdrs_get_from_hbox): new helper function
-
- * e-msg-composer.c: moved signatures from menu to option menu next
- to From:
-
-2002-06-03 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (build_message): Properly handle user
- cancellation for signing/encrypting, just dont sign but create
- anyway.
- (e_msg_composer_get_subject): Wrapper function to get the subject
- from the header object.
- (e_msg_composer_get_to):
- (e_msg_composer_get_cc):
- (e_msg_composer_get_bcc): Same for the destination types.
-
-2002-06-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_guess_mime_type): Allocate a
- new FileInfo struct here rather than using and unref it when we're
- finished with it.
-
-2002-05-30 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (build_message): Changes for multipart/signed
- api changes.
-
-2002-05-16 Ettore Perazzoli <ettore@ximian.com>
-
- * e-msg-composer.c: New local `all_composers'; keeps a list of all
- the composer windows created. Changed type of `parent_class' to
- BonoboWindowClass *.
- (do_exit): Cleaned up a bit. Raise the composer window before
- showing the message box dialog.
- (exit_dialog_cb): Removed.
- (e_msg_composer_request_close_all): New.
- (create_composer): Add the composer to the all_composers list and
- weakref it.
- (msg_composer_destroy_notify): GtkDestroyNotify function for the
- composer's weakref; remove the composer from the all_composers
- list.
-
-2002-05-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_new):
- Just use g_basename.
-
-2002-04-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): Check for empty-string pgp-key
- ids and don't use them.
-
-2002-04-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-hdrs.c (destroy): Unref the priv->tooltips object
- here.
-
- * e-msg-composer-attachment-bar.c (destroy): Free the priv struct.
-
- * e-msg-composer.c (set_editor_signature): We don't need a 'name'?
- So don't strdup it.
-
-2002-04-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-hdrs.c (from_changed): Change the Reply-To header
- contents.
- (e_msg_composer_hdrs_set_reply_to): The Reply-To entry was an
- EEntry, not a bonobo control so fix this to set the text using
- e_entry_set_text.
- (e_msg_composer_hdrs_get_reply_to): Use e_entry_get_text here for
- the same reason.
-
-2002-04-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (set_editor_text): No need to query for the
- persist-stream interface here, just re-use
- composer->persist_stream_interface - this might improve the speed
- at which a reply action brings up the composer.
-
-2002-04-09 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer-hdrs.c (set_recipients_from_destv): Use decode
- rather than unformat - the e_destination was changed (long time
- ago) to rfc2047 encode the addresses, so we should decode
- likewise. Should fix #16158.
-
- * e-msg-composer.c (next_word): g_utf8_next_char never returns
- NULL, it just skips to the next character. So like normal string
- code, we just check for a nul explicitly. Fixes a bug found while
- checking #16158.
-
-2002-04-05 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes bug #3980.
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_set_cc): If a Cc list
- is set to something non-empty, make sure to show the Cc widgets.
- (e_msg_composer_hdrs_set_bcc): Same but for Bcc.
- (e_msg_composer_hdrs_set_reply_to): And here.
-
-2002-03-28 Christopher James Lahey <clahey@ximian.com>
-
- * e-msg-composer-select-file.c: Switch to using EFileSelection
- here instead of GtkFileSelection.
-
-2002-03-27 Larry Ewing <lewing@ximian.com>
-
- * Makefile.am: fix for the changes to GTKHTML_DATADIR that include
- the release number.
-
-2002-03-18 Dan Winship <danw@ximian.com>
-
- * Evolution-Composer.idl, evolution-composer.c
- (impl_Composer_show): "Forward as iCalendar" uses set_body, so we
- can't make the composer un-showable after doing that. So get rid
- of the "cannot show" exception.
-
- * e-msg-composer.c (e_msg_composer_set_body): Prepare the composer
- to be shown in its weird state: Put an explanatory message in the
- body, then call disable_editor.
- (disable_editor): Common editor-disabling code - makes the editor
- and attachment bar insensitive and disables any menu items that
- could be used to modify them.
- (e_msg_composer_new_redirect): Use disable_editor here now.
-
-2002-03-15 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c: use gtkhtml editor API version 1.1
-
-2002-03-11 Dan Winship <danw@ximian.com>
-
- * listener.c (impl_event): Remove the extremely verbose printf
- here.
-
-2002-03-07 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (destroy): ops, unregister and not register new
- one sig_event_client
-
-2002-03-04 Dan Winship <danw@ximian.com>
-
- * e-msg-composer.c (build_message): Fix a dumb bug in previous
- commit that broke iMIP containing 8-bit data.
-
-2002-02-25 Dan Winship <danw@ximian.com>
-
- Mailer side of 14705.
-
- * Evolution-Composer.idl (setBody): Change setBodyText to setBody
- and take a MIME type as well.
- (show): Add an exception.
-
- * evolution-composer.c (impl_Composer_set_body, etc): Update for
- IDL change. While I'm here, fix this to DTRT with both plaintext
- and HTML bodies. (It claimed to take plain text before, but then
- passed it to the composer as HTML.)
- (impl_Composer_show): Raise an exception if setBody has been
- called, since the composer window will not display the real data
- in that case.
-
- * e-msg-composer.c (e_msg_composer_set_body): interface for
- impl_Composer_set_body.
- (build_message): If e_msg_composer_set_body has been called, use
- the body and MIME type supplied to it rather than the contents of
- the HTML editor.
-
-2002-02-14 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (delete_old_signature): don't insert paragraph
- here, also delete paragraph where signature was
- (e_msg_composer_show_sig_file): test if we are in empty document
- and if so, insert new paragraph for signature
-
-2002-02-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_flush_pending_body): Use
- set_editor_text()
- (e_msg_composer_new_from_url): Same.
- (e_msg_composer_set_body_text): Re-Show the signature.
-
-2002-02-12 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_is_dirty): reflect gtkhtml API
- change
-
-2002-02-11 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_drop_editor_undo): new method,
- drops undo in editor and resets dirty flag in editor
- (do_exit): remove TRUE from condition as dirty flag in editor
- should work now
- (e_msg_composer_is_dirty): use new editor API for dirty flag
-
-2002-02-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (update_auto_recipients): Update the
- auto-cc/bcc recipients in the composer header fields to match the
- ones chosen in the account configuration.
-
-2002-01-31 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_ignore): new method, tells
- composer to ignore all word in str string
- (next_word): helper function to get next word from s, saves rest
- of s to sr
-
-2002-01-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): If we are in redirect mode,
- use the original message and set the resent-* headers using
- e_msg_composer_hdrs_to_redirect() and then return.
- (destroy): Unref the redirected message if it exists.
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_to_redirect): New
- function for a composer in redirect mode.
-
-2002-01-27 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am: Use GNOME_FULL_CFLAGS.
-
-2002-01-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (get_file_content): Rewrote to use CamelStreams
- and also convert the file contents to UTF-8 (assums the file
- charset is the same charset that the composer is set to).
- (menu_file_insert_file_cb): Pass the composer into
- get_file_content().
- (e_msg_composer_get_sig_file_content): Pass NULL as the composer
- argument.
-
-2002-01-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (class_init): Fixed the setup of the
- "save-draft" signal so that it would actually work.
-
-2002-01-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (is_special_header): Greatly simplified. No
- need to have a list of headers to not accept - we can just refuse
- all headers that are not X-* headers (other than X-Evolution
- headers).
-
-2002-01-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_get_message_draft): Set the
- X-Evolution-Format header to text/plain if that is the editing
- mode we are really in. This fixes bug #11499.
-
-2002-01-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_new_from_url): A few minor
- fixes to make it more compliant with rfc2368. Should now be fully
- rfc compliant as far as I can tell.
-
-2002-01-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_edit):
- Only connect to the parent's destroy/hide signals while the
- attachment editor dialog is "alive".
-
-2001-12-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-select-file.c (composer_hide_cb): Only cancel the
- selection dialog if it is currently in use, otherwise we'll get an
- extra gtk_main_quit and the mailer will exit :-(
-
-2001-12-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (read_file_content): Don't block forever if we
- are reading a fifo with no data.
-
-2001-12-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (class_init): Setup the SAVE_DRAFT signal.
- (menu_file_save_draft_cb): Emit the SAVE_DRAFT signal.
- (exit_dialog_cb): Same here.
- (save_draft): Removed. This code is now a signal that
- mail-callbacks will connect to.
-
-2001-12-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_edit):
- Attach to the parent widget's destroy signal - when that gets
- destroyed, we need to cancel the editor dialog too. Also connect
- to our parent window's "hide" signal so that when the composer
- gets hidden (ie, it's being sent), we also close the dialogs.
-
- * e-msg-composer.c (init): Default composer->enable_autosave to
- TRUE.
-
-2001-12-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-select-file.c (confirm): If multiple-selection is
- enabled but nothing is slected, fall back to using the filename in
- the entry box as the "selected" file.
- (create_file_selection): If the composer gets hidden (ie it's
- being "sent") then cancel the file selection dialog.
-
-2001-12-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-select-file.c
- (file_selection_info_destroy_notify): If the widget is non-NULL,
- then gtk_widget_destroy that bad boy...
-
-2001-12-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c (add_from_user):
- select_file_attachments now returns a GPtrArray so handle that and
- loop until we've added all the attachment files.
-
- * e-msg-composer-select-file.c (confirm): Add an evil kludge to
- get a list of filenames from the GtkFileSelection widget based on
- the label in the history option menu item and the base filenames
- of the selected items in the filename clist.
- (create_file_selection): Setup the clist to allow multiple
- selection.
- (file_selection_info_destroy_notify): Destroy the GPtrArray
- containing the list of xselected files.
- (select_file_internal): Return a GPtrArray of files instead of a
- char *.
-
-2001-12-10 Jon Trowbridge <trow@ximian.com>
-
- * e-msg-composer.c (get_file_content): Only execute an executable
- sig file if a magic environment variable is set.
-
-2001-12-06 Jon Trowbridge <trow@ximian.com>
-
- * e-msg-composer.c (executed_file_output): Added. Executes the
- given file and returns its output as a string.
- (get_file_content): Stats the file to see if it is executable.
- If it is, execute it and return the string. If not, just read
- the file and return the contents.
-
-2001-11-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (setup_ui): Change the FileSend tooltip the be
- the same as the FileSendLater tooltip if we are in offline mode.
-
-2001-11-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (drag_data_received): Allow drag & drop for
- vcards.
-
-2001-11-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (setup_ui): Change the FileSend tooltip the be
- the same as the FileSendLater tooltip if we are in offline mode.
-
-2001-11-14 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.c (create_composer): popup failure dialog if we
- cannot get a valid editor_engine.
- (prepare_engine): make the checks robust and make sure that we
- unset the engine if any part fails.
-
-2001-11-02 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (add_inlined_images): use hash table to
- eliminate duplicates
-
-2001-11-02 <NotZed@Ximian.com>
-
- * e-msg-composer.c (e_msg_composer_set_enable_autosave): New
- function, enable/disable autosave for the composer temporarily.
- (autosave_run_foreach_cb): Only save if we have enable autosave
- turned on. In other cases we want to save it regardless.
-
-2001-10-30 Dan Winship <danw@ximian.com>
-
- * e-msg-composer.c (build_message): Add back the "remove
- Content-Disposition when sending itip" hack.
-
- * Evolution-Composer.idl (setMultipartType): New.
-
- * evolution-composer.c (impl_Composer_set_multipart_type): Allow
- caller to specify a multipart/alternative rather than
- multipart/mixed.
-
- * e-msg-composer.c (build_message): Revert yesterday's changes.
- Add new ones for sending multipart/alternative.
-
-2001-10-30 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.h: add dirty prototype.
-
- * e-msg-composer.c: add dirty implementation.
-
-2001-10-30 Radek Doulik <rodo@ximian.com>
-
- * listener.c (insert_paragraph_before): new helper function,
- extracted
- (insert_paragraph_after): ditto
- (impl_event): process command_before and command_after, use new
- functions
- (clear_signature): reset style to be sure
- (reply_indent): ditto
-
-2001-10-30 Dan Winship <danw@ximian.com>
-
- * e-msg-composer.c (build_message): Remove Content-Disposition in
- the no_body case. (More kludging around Outlook iCalendar
- brokenness.)
-
-2001-10-29 Ettore Perazzoli <ettore@ximian.com>
-
- * e-msg-composer.c (setup_ui): Put the charset encoding submenu in
- the EncodingPlaceholder.
-
-2001-10-29 Dan Winship <danw@ximian.com>
-
- * evolution-composer.c (init): Set the (new) "no_body" flag on the
- composer.
- (impl_Composer_set_body_text): And unset it here.
- (unset_no_body): And here (called if/when the composer is
- realized).
-
- * e-msg-composer.c (build_message): If the composer has the
- "no_body" flag set, and a single attachment, promote that
- attachment to be the message body.
-
-2001-10-30 Radek Doulik <rodo@ximian.com>
-
- * listener.c (reply_indent): simplified, requires new gtkhtml
-
-2001-10-29 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.h: add GList to hold the current images.
-
- * listener.c (resolve_image_url): keep track of the images that
- the editor is currently uses in current_images as well as storing
- the images in the hash.
-
- * e-msg-composer.c (clear_current_images): clear the list of
- images actually in the message.
- (add_inlined_images): use the current image list rather than the
- hash tables.
- (build_message): clear the current image list when appropriate.
- (init): initialize current_images.
-
-2001-10-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (add_attachments_from_multipart): New function
- that replaces handle_multpart() and handle_multipart_alternative()
- for add_message_attachments().
- (e_msg_composer_add_message_attachments): Call
- add_attachments_from_multipart().
- (handle_multipart_alternative): Now only used by
- new_with_message() and is really only designed to work well with
- messages generated by Evolution (ie for editing Drafts and such).
- (handle_multipart): Same.
- (e_msg_composer_new_with_message): No longer calls
- add_message_attachments() because we can't ever have this fail and
- the logic in add_message_attachments() is impossible
- logic. Instead do like what we used to do before the addition of
- add_message_attachments() came along.
-
-2001-10-24 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.c
- (e_msg_composer_add_inline_image_from_mime_part): rework this so
- that we don't end up freeing the cid then reading from it.
-
-2001-10-22 Jon Trowbridge <trow@ximian.com>
-
- * e-msg-composer-hdrs.c (create_from_optionmenu): Check that
- account->id->address != NULL.
-
-2001-10-21 Dan Winship <danw@ximian.com>
-
- Make inline images used for replies not show up as
- attachments. Also, I think this should make replies to HTML
- messages containing inline images referenced via Content-Location
- work, but that's not tested.
-
- * e-msg-composer.c (various): Keep two hash tables of inline image
- data: one mapping from cid: URLs to CamelMimeParts for all
- attachments, the other mapping from file: and Content-Location
- urls to CamelMimeParts (for those inline images that came from a
- file or have a Content-Location).
- (add_inlined_images): Simplify. Most of this code is in
- e_msg_composer_add_inline_image_from_file() now.
- (e_msg_composer_add_message_attachments, handle_multipart): Change
- "attach_all" arg to "just_inlines". If it is set, call
- e_msg_composer_add_inline_image_from_mime_part on any attachment
- with a Content-Id or Content-Location.
- (e_msg_composer_add_inline_image_from_file): Create a mime part
- from a file and add it to the inline images hash.
- (e_msg_composer_add_inline_image_from_mime_part): Add a mime part
- directly to the inline images hash.
-
- * listener.c (resolve_image_url): If asked to resolve a file: URL
- that isn't in the inline images hash, call
- e_msg_composer_add_inline_image_from_file to get a cid for it.
- (impl_event): Look up the URL in the inline_images and
- inline_images_by_url hashes.
-
- * e-msg-composer-attachment-bar.c
- (e_msg_composer_attachment_bar_find_message): Gone. No longer
- used.
-
-2001-10-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (handle_multipart): Now takes a 'attach_all'
- argument. If !attach_all, then only attach the attachment if the
- part has a content-id, otherwise we can safely assume that nothing
- references it thus we don't need to attach it.
- (e_msg_composer_add_message_attachments): Now takes a 'attach_all'
- argument that overrides the "only attach attachments if they have
- a content-id header" behavior.
- (e_msg_composer_new_with_message): Pass TRUE as the attach_all
- argument to add_message_attachments.
-
-2001-10-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (best_encoding): Don't use a
- g_return_val_if_fail after iconv_open, this is a valid error
- condition and so should use check it for real.
-
- * e-msg-composer-attachment-bar.c (attach_to_multipart): Correctly
- set the charset parameter and use camel's bestenc filter to
- determine which content transfer encoding to use.
-
-2001-10-15 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_add_message_attachments):
- s/apply/flush/.
- (e_msg_composer_flush_pending_body): renamed from apply now takes
- apply as an argument.
- (e_msg_composer_show_sig_file): s/g_assert/g_return_if_fail/
- warnings make for less painful bugs than crashes.
- (set_editor_text): s/g_assert/g_return_if_fail/
-
-2001-10-13 Dan Winship <danw@ximian.com>
-
- * e-msg-composer.c (autosave_manager_unregister): Don't pop up an
- "unable to retrieve message" if the composer never finished
- initializing.
- (init): Don't call autosave_manager_register here: wait until the
- end of create_composer.
- (create_composer): Remove the distinction between this and
- e_msg_composer_construct since there's no need for the latter. Use
- e_activation_failure_dialog if either the selectnames component or
- the gtkhtml editor fails.
-
- * e-msg-composer-hdrs.c (setup_corba): Don't g_warn if the oaf
- activation fails. create_composer() will tell the user.
-
-2001-10-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * listener.c (impl_event): Deleted declaration of len.
-
- * e-msg-composer.c (e_msg_composer_add_message_attachments): Take
- a settext argument.
- (e_msg_composer_new_with_message): Updated to pass the settext argument.
-
-2001-10-10 Jon Trowbridge <trow@ximian.com>
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_set_from_account):
- Check for either a matching account name, or for a matching e-mail
- address embedded in the passed-in string. (Fixes half of bug
- #3255)
- (destroy): Call bonobo_object_release_unref on corba_select_names,
- not CORBA_Object_release. Otherwise we leak stuff all over the
- place. (Bug #11878)
-
- * e-msg-composer.c (e_msg_composer_new_with_message): If our message
- doesn't contain an X-Evolution-Account header, pass in the From
- header as the account name. (Fixes the other half of #3255)
-
-2001-10-10 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.h: add prototype.
-
- * e-msg-composer.c (e_msg_composer_add_message_attachments): new
- function to copy attachments from the a message to a composer.
- (e_msg_composer_set_pending_body): make simple function to
- abstract this.
- (e_msg_composer_apply_pending_body): apply the pending body to
- the composer.
- (e_msg_composer_new_with_message): use
- e_msg_composer_add_message_attachments to copy attachments.
-
-2001-10-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c (add_from_file): If the
- attachment fails, report the error to the user.
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_new): Now
- takes a CamelException argument.
-
- * e-msg-composer.c (setup_ui): Pass /menu/Edit as the menu path to
- e_charset_picker thingy.
-
-2001-10-05 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer-attachment-bar.c
- (e_msg_composer_attachment_bar_find_message): fix cut&pasteo.
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_new):
- remove unused variable.
-
- * e-msg-composer-attachment-bar.c
- (e_msg_composer_attachment_bar_find_message): generalize this to
- lookup content locations as well.
-
- * e-msg-composer-attachment-bar.h: change prototype to match the
- new function.
-
- * listener.c (impl_event): handle the url_requested event, look up
- parts in the attachment part and feed them down the stream if it
- is found.
-
- * e-msg-composer.c (handle_multipart_alternative): delay setting
- the body text.
- (handle_multipart): delay setting body text
- (e_msg_composer_new_with_message): set the body text from the
- object data. Doing this ensures that we will have the attachments
- processed before we try to look them up.
-
-2001-10-04 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer-attachment-bar.c
- (e_msg_composer_attachment_bar_find_content_id): change to return
- a CamelMimePart.
-
- * e-msg-composer-attachment-bar.h: update prototype.
-
- * e-msg-composer-attachment-bar.c
- (e_msg_composer_attachment_bar_find_content_id): look up an
- attachment by it's content id.
-
- * e-msg-composer-attachment-bar.h: add prototype for
- e_msg_composer_attachment_bar_find_content_id.
-
-2001-10-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (autosave_save_draft): Make sure to unref the
- message object so we don't leak it or any references to
- attachments (child mime parts).
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_new):
- Unref the mime part after passing it along to new_from_mime_part.
-
-2001-10-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (save_draft): Pass an empty flags argument to
- mail_get_folder.
-
-2001-10-02 Ettore Perazzoli <ettore@ximian.com>
-
- * e-msg-composer.c (setup_ui): Use
- `bonobo_ui_component_new_default()', not
- `bonobo_ui_component_new()'.
-
-2001-09-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_new):
- Don't set Content-Ids on these parts since they are not contained
- within a multipart/related - this fixes bug #10032.
-
-2001-09-26 Jon Trowbridge <trow@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_new_from_url): Fixes glitch in
- mailto: url parsing that caused it to fail when recipient names
- contained commas. (Bug #10796)
-
-2001-09-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (save_draft): Update to reflect changes to
- mail_get_folder.
-
-2001-09-20 Iain Holmes <iain@ximian.com>
-
- * e-msg-composer.c (get_file_content): Open the file with O_CREAT so
- that if it doesn't exist, it's created. Never return a NULL as this
- could potentially crash on Solaris.
-
-2001-09-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): Attach an X-Evolution-Format
- header so if people re-edit a message in say their Sent folder, we
- will preserve format preferences.
- (e_msg_composer_get_message_draft): Don't attach
- X-Evolution-Format headers here since it is now done in
- build_message().
- (e_msg_composer_new_with_message): Make sure to remove *all*
- X-Evolution headers by using the mail-tools functions.
-
-2001-09-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c (update): Don't
- gtk_object_destroy() the pixbuf loader, unref it instead.
-
- * e-msg-composer-hdrs.c (destroy): Don't forget to free the
- private structure.
-
-2001-09-14 Ettore Perazzoli <ettore@ximian.com>
-
- [Automake 1.5 fixes pointed out by Richard Boulton
- <richard@tartarus.org>, as per #9258.]
-
- * Makefile.am (CLEANFILES): Set directly with `=' instead of `+='.
-
-2001-09-13 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.c (map_default_cb): free the text values we get
- from the property bag and release the property bag properly.
-
-2001-09-12 JP Rosevear <jpr@ximian.com>
-
- * evolution-composer.c (corba_recipientlist_to_destv): null
- terminate the destination vector
-
-2001-09-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * evolution-composer.c (init): Don't call new_with_sig_file, it no
- longer exists.
-
- * e-msg-composer.c (setup_ui): Make sure that the session is
- non-NULL.
- (menu_file_send_cb): And here too.
- (e_msg_composer_new_with_sig_file): Removed.
-
-2001-09-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): Wrap the S/MIME code in ifdef
- SMIME_SUPPORTED which isn't defined but by some later version will
- be.
- (setup_ui): And again here.
-
-2001-09-09 Maciej Stachowiak <mjs@noisehavoc.org>
-
- * Makefile.am: Add VFS_CFLAGS so things don't break when the
- gnome-vfs headers move.
-
-2001-09-08 Jon Trowbridge <trow@ximian.com>
-
- * evolution-composer.c (corba_recipientlist_to_destv): Originally
- was corba_recipientlist_to_glist.
- (impl_Composer_set_headers): Use corba_recipientlist_to_destv, new
- destination-based api.
-
- * e-msg-composer.c (build_message): Get rid of that 'sending'
- stuff. That was a bad idea.
- (e_msg_composer_new_with_message): Apply the revised api and work
- with vectors of destinations rather than just lists.
- (e_msg_composer_get_recipients): Added. Returns the full set of
- recipient destinations in a vector.
-
- * e-msg-composer-hdrs.c: Removed free_destv function. We use
- e_destination_freev instead.
- (e_msg_composer_hdrs_get_to): Changed to return a vector of
- EDestinations. This function now works.
- (e_msg_composer_hdrs_get_cc): Ditto.
- (e_msg_composer_hdrs_get_bcc): Ditto.
- (e_msg_composer_hdrs_get_recipients): Added. Returns a vector of
- EDestinations that is the union of the to, cc and bcc lines.
- (e_msg_composer_hdrs_set_to): Changed to take a vector of
- EDestinations, rather than a GList.
- (e_msg_composer_hdrs_set_cc): Ditto.
- (e_msg_composer_hdrs_set_bcc): Ditto.
- (e_msg_composer_hdrs_to_message): Use our new, improved API, rather
- than a bunch of poking around in BonoboPropertyBags, etc.
-
-2001-09-07 Dan Winship <danw@ximian.com>
-
- * e-msg-composer-hdrs.c (set_recipients_from_destv): Remove some
- debugging messages that don't check for NULL strings and crash
- Solaris.
-
-2001-09-06 Dan Winship <danw@ximian.com>
-
- * e-msg-composer.c (save): Have to specify a mode when using
- O_CREAT.
- (handle_multipart_alternative, handle_multipart,
- e_msg_composer_new_with_message): Update for mail_get_message_body
- change.
-
-2001-09-05 Ettore Perazzoli <ettore@ximian.com>
-
- * e-msg-composer.c (autosave_manager_query_load_orphans):
- s/Evolution/Ximian Evolution/.
- (do_exit): Set the title to be "Warning: Modified Message".
-
-2001-08-29 Jon Trowbridge <trow@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_get_message_draft): Pass
- in FALSE as the 'sending' arg to e_msg_composer_get_message.
- (build_message): Added a 'sending' arg, which is passed to
- e_msg_composer_get_message.
- (e_msg_composer_get_message): Added a 'sending' arg,
- which gets passed directly on to build_message.
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_to_message): Added
- a "sending" arg, which should be TRUE if the message is being
- sent now (rather than being autosaved, etc.). The address
- use scores are only updated when sending. (Bug #8332)
- Removed obsolete (#if 0/#endif-ed) code.
-
-2001-08-22 Jon Trowbridge <trow@ximian.com>
-
- * e-msg-composer-hdrs.c (set_recipients_from_destv): Added. Try
- to properly handle contact lists in which the addresses of the
- list members should be hidden.
- (e_msg_composer_hdrs_to_message): Changed to extract the
- destination data from the entries and pass it along to
- set_recipients_from_destv.
-
-2001-08-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (save): When reporting an error, use
- my_file_name instead of file_name since file_name can be NULL.
-
-2001-08-21 Ettore Perazzoli <ettore@ximian.com>
-
- * e-msg-composer.c (autosave_manager_query_load_orphans):
- s/attempt recovery/try to recover them/.
-
-2001-08-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (save_draft): Reset the "changed" state to
- FALSE after a successful save.
-
-2001-08-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (show_attachments): Toggle the
- View->Attachments menu item. This fixes bug #6107.
-
-2001-07-12 Peter Williams <peterw@ximian.com>
-
- * e-msg-composer.c (map_default_cb): New function. Figure out
- which widget gets the default and assign it. Harder to do than
- it sounds.
- (e_msg_composer_construct): Hook map_default_cb up to the "map"
- signal.
- (set_focus_to_editor): Removed.
- (set_focus_to_editor_idle): Removed.
-
-2001-08-10 Jon Trowbridge <trow@ximian.com>
-
- * e-msg-composer-hdrs.c (set_recipients): Removed comment about
- the need to resolve nicknames properly, because we now do that.
-
-2001-08-09 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (set_focus_to_editor): new helper function,
- just setup idle callback to grab focus
- (set_focus_to_editor_idle): grab focus for editor, before we have
- better solution, it run grab-focus command on editor control
- (e_msg_composer_construct): call prepare_engine here, set focus to
- editor
-
-2001-08-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (autosave_manager_query_load_orphans): Don't
- forget to closedir() when we finish with dir.
-
-2001-08-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (from_changed_cb): Set the smime/pgp
- always-sign options when here so it updates when the user changes
- his/her identity.
-
-2001-08-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_get_message_draft): Set the
- PGP/MIME and S/MIME options to FALSE before getting the message
- draft and restore the values afterward.
-
-2001-08-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (add_inlined_image): Use g_basename().
- (setup_ui): Get the default charset from the mail config db.
-
-2001-08-06 Radek Doulik <rodo@ximian.com>
-
- * listener.c (impl_event): handle delete event
-
-2001-07-31 Peter Williams <peterw@ximian.com>
-
- * e-msg-composer.c (setup_ui): Set the config path for the composer so
- that the customize toolbar command works.
-
-2001-07-31 Jason Leach <jleach@ximian.com>
-
- * e-msg-composer.c: Use Tuomas' and Jakub's new (and beautiful)
- icons for Send and Send Later in the toolbar and menus.
-
-2001-07-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (message_rfc822_dnd): Properly add the
- message/rfc822 part.
-
-2001-07-27 Jason Leach <jleach@ximian.com>
-
- * e-msg-composer.c (get_signature_html): "-- \n" is 4 chars long,
- so when checking if it's already in the sig, strncmp should check
- 4 chars, not 3.
-
-2001-07-26 Peter Williams <peterw@ximian.com>
-
- * e-msg-composer.c (get_signature_html): Correct our manually inserted
- signature dash thingie (it was missing the space).
-
-2001-07-26 Jon Trowbridge <trow@ximian.com>
-
- * e-msg-composer-hdrs.c (set_recipients): Get "destinations",
- rather than "text" from the entry_widget. (The getters/setters in
- the control have been made more symmetric.)
-
-2001-07-18 Jason Leach <jleach@ximian.com>
-
- * e-msg-composer-hdrs.c (create_from_optionmenu): Update to the
- new way of finding the default account.
-
-2001-07-18 Iain Holmes <iain@ximian.com>
-
- * e-msg-composer.c (do_exit): Use a messagebox.
-
-2001-07-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (drag_data_received): Correctly handle
- text/uri-list's that contain more than a single file reference.
-
-2001-07-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (menu_changed_charset_cb): Removed a warning
- that I don't need anymore. This code is working wonderfully ;-)
-
-2001-07-10 Kjartan Maraas <kmaraas@gnome.org>
-
- * e-msg-composer.c: Fix typo. s/sesiion/session/
-
-2001-07-09 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.c (autosave_manager_query_load_orphans): Only ask
- once about recovery, assume if they want to recover one file they
- want to recover all of them.
-
-2001-07-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_message): Use
- camel_internet_address_format_address rather than
- camel_address_encode since we want display-friendly addresses.
-
-2001-07-09 Iain Holmes <iain@ximian.com>
-
- * e-msg-composer-select-file.c (file_selection_info_destroy_notify):
- Unref the file selection dialog when the data is destroyed.
-
-2001-07-09 Dan Winship <danw@ximian.com>
-
- * e-msg-composer.c (composer_shutdown): Do the
- autosave_manager_unregister at shutdown time instead of destroy
- time (by which point the contents of the window, including the
- remote editor control, will have already been destroyed).
-
-2001-07-09 Zbigniew Chyla <cyba@gnome.pl>
-
- * e-msg-composer-select-file.c: Added missing #include <config.h> to
- make translations working.
-
-2001-07-07 Jon Trowbridge <trow@ximian.com>
-
- * e-msg-composer-hdrs.c (set_recipients): Make sure that our
- destination string (dest_str) is not the empty string before we
- try to use it.
-
-2001-07-06 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.c (autosave_manager_new): add missing static.
- (best_encoding): make sure we don't try to call iconv_open with a
- NULL tocode.
- (autosave_manager_query_load_orphans): remove zero length orphans
- so that they don't clutter things up.
-
-2001-07-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_new):
- Convert the filename string to UTF8 before setting it on the
- CamelMimePart because that code expects it to be in UTF8.
-
-2001-07-06 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.c (autosave_manager_query_load_orphans): only ask
- if there are actually contents in the file. Asking about an
- emptry fil is not very useful.
- (autosave_load_draft): add some sanity chacks.
- (autosave_run_foreach_cb): remove debugging warning.
- (autosave_manager_new): add a missing static.
-
-2001-07-06 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.c (autosave_manager_unregister): make sure we
- only remove the file if we think we saved it properly.
- (autosave_manager_stop): make sure we set the timeout back to 0 so
- that we will restart next time since we stop the timer when there
- are no active composers.
- (destroy): move this to the beginning of the destroy process.
- (autosave_save_draft): add a return value indicating success.
- (autosave_manager_register): go ahead and ask next time.
-
-2001-07-05 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.c: add ask argment.
- (autosave_manager_query_load_orphans): move the load loop out of
- the dir reading loop.
- (autosave_manager_new): move initialization out or register.
- (autosave_manager_register): protect against recursion with ask.
- (init): call new, this still needs to be moved.
-
-2001-07-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (save): Play the "File exists, overwrite?"
- game.
- (autosave_run_foreach_cb): Change the return val from a gboolean
- to void.
-
-2001-07-04 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.c (autosave_load_draft): attach send and postpone
- handlers. and be more tolerant of errors.
-
-2001-07-03 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.c (autosave_save_draft): make sure we seek to the
- begining.
-
- * e-msg-composer.h: remove the timer id.
-
- * e-msg-composer.c: use autosave manager.
- (autosave_save_draft): moved initialization to
- autosave_init_file. Only save the buffer if we get a valid
- message.
- (autosave_load_draft): unlink the old file, we own it now. and
- unref the stream when we are done with it.
- (autosave_is_owned): check if we own the file, this needs to be
- extended to check for other valid processes.
- (autosave_query_load_orphans): make this search through the
- managers list as it walks the dir.
- (autosave_query_load_orphans): make sure we use the full path.
- (autosave_run_foreach_cb): timeout foreach handler.
- (autosave_run): the timeout function.
- (autosave_start): start timer.
- (autosave_stop): stop timer.
- (autosave_register): register a composer with the autosave manager.
- (autosave_unregister): unregister a composer.
- (destroy): unregister the composer, everything is okay.
- (init): register the composer.
-
-2001-07-02 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.h: add autosave members.
-
- * e-msg-composer.c (autosave_query_load_orphans): query the user to
- check if they want to load any orphans we've found.
- (autosave_query_cb): the dialog callback.
- (autosave_is_orphan): test if if a particular file is orphaned.
- (autosave_load_draft): load a message from an autosave file.
- (autosave_save_draft): save the current buffer to the autosave file.
-
-2001-07-02 Christopher James Lahey <clahey@ximian.com>
-
- * Makefile.am (INCLUDES): Added $(BONOBO_CONF_CFLAGS).
-
-2001-07-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c (attach_to_multipart): Set the
- user-chosen charset.
-
- * e-msg-composer.c (menu_change_charset_cb): New callback function
- to get the user-set charset.
- (init): Set the charset to NULL.
- (best_charset): Take a default_charset param that holds the value
- the user set for this particular message using the menu.
- (destroy): Free the charset.
-
-2001-07-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (setup_ui): Construct an e-charset-picker
- bonobo-ui menu.
- (menu_change_charset_cb):
-
-2001-06-30 Jon Trowbridge <trow@ximian.com>
-
- * e-msg-composer-hdrs.c (set_recipients): Touch all of our
- EDestinations before we unref them, updating the last-use records
- in the addressbook.
-
-2001-06-29 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_show_sig_file): remove now
- invalid argument in the documentation.
-
-2001-06-28 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c: removed obsolete e_msg_composer_get_sig_file
-
- * e-msg-composer.h: removed sig_file field from EMsgComposer
-
- * e-msg-composer.c (e_msg_composer_get_sig_file_content): exported
- (get_file_content): make it const safe
- (e_msg_composer_get_sig_file_content): refactored, don't try to be
- clever about signature filename, as it's exact now
- (get_signature_html): use has_html_signature flag
- (e_msg_composer_show_sig_file): renamed from
- e_msg_composer_set_sig_file, removed sig_file parameter as it's
- obsolete now
- (e_msg_composer_new_with_sig_file): removed obsolete parameters
-
-2001-06-27 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.c (menu_file_insert_file_cb): make hook this up.
- (get_sig_file_content): use get_file_content.
- (get_file_content): make this usable for both insertion and
- signatures.
- (read_file_content): added helper function to read file.
-
-2001-06-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c: Added a pixcache array for special pixmaps to
- use in the composer.
- (setup_ui): Set the pixcache.
-
-2001-06-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (menu_file_send_cb): Emit the POSTPONE signal
- if we are offline.
- (setup_ui): If we are offline, change the Control+Enter accel to
- be on the SendLater menu item.
-
-2001-06-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (save_draft): Save the formatting preference
- for this message draft using a X-Evolution-Format header.
- (e_msg_composer_new_with_message): Restore the format editing
- preference and also remove any other X-Evolution-* headers that we
- may have set.
-
-2001-06-20 Dave Camp <dave@ximian.com>
-
- * Evolution-Composer.idl: Changed attachData to accept a sequence of
- chars rather than a string.
-
- * evolution-composer.c (impl_Composer_attach_data): Changed the 'data'
- argument to a GNOME_Evolution_Composer_AttachmentData, and pass
- data->_buffer and data->_length to camel_mime_part_set_content().
-
-2001-06-19 JP Rosevear <jpr@ximian.com>
-
- * evolution-composer.c (impl_Composer_send): send the message
-
- * Evolution-Composer.idl: add a "send" method to send a message
- without showing the editor
-
-2001-06-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_construct): Don't define the
- drop_types here.
- (drag_data_received): Implement message/rfc822 dnd drop type
- handling.
-
-2001-06-12 Dan Winship <danw@ximian.com>
-
- * e-msg-composer-attachment.glade: Replace the disposition option
- menu with a checkbox.
-
- * e-msg-composer-select-file.c
- (e_msg_composer_select_file_attachment): New function to select a
- file to attach. Adds a "suggest inline disposition" checkbox.
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_new): Add
- a disposition argument rather than always defaulting to
- "attachment".
- (struct _DialogData, ok_cb, e_msg_composer_attachment_edit):
- Update for optionmenu->checkbox change for disposition.
-
- * e-msg-composer-attachment-bar.c (add_from_file): Add a
- disposition argument.
- (add_from_user): Use e_msg_composer_select_file_attachment, pass
- chosen disposition to add_from_file.
- (e_msg_composer_attachment_bar_attach): Pass "attachment" to
- add_from_file for the disposition.
-
-2001-06-11 Dan Winship <danw@ximian.com>
-
- * e-msg-composer.c (best_charset): Fix again... don't leave
- *encoding uninitialized in the US-ASCII case.
-
-2001-06-11 Jon Trowbridge <trow@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_construct): Rearranged
- gtk_widget_show()s a bit to fix Bug#3204. The composer is now
- (like the rest of Evo) properly network transparent.
-
-2001-06-08 Jon Trowbridge <trow@ximian.com>
-
- * e-msg-composer.c (save_draft): When saving a draft, attach
- information about the From: identity via X-Evolution-Account.
- This lets us select the correct identity when we edit it later.
- (e_msg_composer_new_with_message): If the message we are editting
- is tagged with an account (via X-Evolution-Account), make sure
- that the composer chooses that account's identity by default.
-
-2001-06-08 Dan Winship <danw@ximian.com>
-
- * e-msg-composer.c (best_charset): Don't use the default charset
- if the message is US-ASCII.
-
-2001-06-07 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_sig_file): just set
- sig_file field, but don't actualy insert signature, it will be
- done by format menu item callback
- (e_msg_composer_set_body_text): don't set signature here
-
-2001-06-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): If user is trying to sign
- his/her message, try first to use the key that they might have
- provided in their account settings. If that was never set, default
- to their email address. Also respect their config option to
- encrypt-to-self.
-
-2001-05-31 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): Oops. Fix a few compile problems.
-
-2001-05-31 Christopher James Lahey <clahey@ximian.com>
-
- * Makefile.am (HTML_EDITOR_GENERATED): Use GTKHTML_DATADIR here.
-
-2001-05-31 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): Fixed up the S/MIME
- signing/encrypting code to work with the new API.
-
-2001-05-31 Dan Winship <danw@ximian.com>
-
- * e-msg-composer.c (best_encoding): Add a missing iconv_close
-
-2001-05-30 Dan Winship <danw@ximian.com>
-
- * e-msg-composer.c (build_message): Use the config-specified
- default character set (which in turn defaults to the locale
- character set) as the default for encoding non-US-ASCII messages,
- assuming it works. Fall back to camel_charset_best() if it fails.
- Also, pick the Content-Transfer-Encoding based on how the data
- looks in the destination charset, not in UTF8.
-
- While I was here, I also refactored a bunch and tried to reduce
- redundant code. There are still too many places that set the
- transfer-encoding on the plaintext part though... Also, I think
- some more cleanliness could happen if the sign/encrypt interfaces
- returned CamelMultiparts instead of CamelMimeParts.
-
-2001-05-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c (update): Use
- e_utf8_to_gtk_string() on the description of the attachment since
- camel stores these as utf-8 strings.
-
-2001-05-28 Jason Leach <jleach@ximian.com>
-
- * Makefile.am (INCLUDES): srcdir != builddir fix.
-
-2001-05-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_message): Populate the
- extra_hdr_* arrays with any non-special-case headers.
- (is_special_header): New convenience function to determine if a
- header is a "special" header or not.
-
-2001-05-24 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (menu_edit_delete_all_cb): new callback
- (menu_edit_delete_all_cb): set orig to 0 too
- (menu_edit_delete_all_cb): be more careful about text color and
- style
-
-2001-05-23 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_set_sig_file): set orig to 0
-
-2001-05-18 Jon Trowbridge <trow@ximian.com>
-
- * e-msg-composer-hdrs.c (set_recipients): Properly unserialize the
- string returned by the "text" property of the bonobo control,
- convert it into EDestinations, and use them to get the e-mail
- addresses of our recipients.
-
-2001-05-17 Dan Winship <danw@ximian.com>
-
- * e-msg-composer.c (save_draft): Draft messages should be marked
- read.
-
-2001-05-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): Added S/MIME sign/encrypt code.
- (init): Initalize smime_sign/encrypt.
- (e_msg_composer_get_smime_encrypt): new
- (e_msg_composer_set_smime_encrypt): new
- (e_msg_composer_get_smime_sign): new
- (e_msg_composer_set_smime_sign): new
- (menu_security_smime_sign_cb): new
- (menu_security_smime_encrypt_cb): new
- (setup_ui): Setup the UI for S/MIME stuff.
-
-2001-05-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): If we are creating a message
- with only a single part (ie no attachments and we will not be
- signing/encrypting the part) then `part = CAMEL_MIME_PART(message)`
- otherwise create a new MIME part and set it's content-object as the
- message's content-object at a later date.
-
-2001-05-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (add_inlined_image): Don't wrap content-id with
- brackets here as it is now done internally in camel.
-
-2001-05-03 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (get_signature_html): put signature in 100%
- width table
- (delete_old_signature): look only for first flow with signature == 1
- (e_msg_composer_new): don't insert <BR>
- (e_msg_composer_new_with_sig_file): ditto
- (delete_old_signature): don't delete whole signature paragraph,
- but just it's content
- (delete_old_signature): if signature isn't found, insert new empty
- paragraph to end of document for new signature
- (e_msg_composer_set_sig_file): delete signature always
- (e_msg_composer_set_sig_file): don't place signature to the end of
- document, but place it where previous one was (if there wasn't
- then new one is appended to the document)
-
-2001-05-02 Radek Doulik <rodo@ximian.com>
-
- * listener.c (impl_event): do automagic indenting only when
- in_signature_insert is FALSE
-
- * e-msg-composer.c (e_msg_composer_set_sig_file): do indent-zero
- before signature inserting
- (e_msg_composer_set_sig_file): use in_signature_insert flag
-
-2001-05-01 Radek Doulik <rodo@ximian.com>
-
- * listener.c (impl_event): set signature to 0 in newly created
- empty paragraphs
- (clear_signature): new helper function
-
-2001-04-26 Dan Winship <danw@ximian.com>
-
- * Makefile.am (INCLUDES): Remove UNICODE_CFLAGS
-
-2001-04-25 Radek Doulik <rodo@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_set_send_html): block/unblock
- redraw
-
- * listener.c (impl_event): reflect object data type change
-
- * e-msg-composer.c (get_sig_file_content): renamed from
- get_signature
- (get_signature_html): new helper function, uses
- get_sig_file_content
- (set_editor_text): removed signature parameters
- (from_changed_cb): new signal handler, sets signature by identity
- change
- (delete_old_signature): new function, deletes old signature from
- the document
- (e_msg_composer_set_sig_file): new method, set's signature
- filename
- (e_msg_composer_mark_text_orig): removed (obsolete)
-
- * e-msg-composer-hdrs.c: added signal FROM_CHANGED
-
-2001-04-21 Duncan Mak <duncan@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_construct): Set window_icon to
- "compose-message.png" for the composer window.
-
- Did #include <libgnomeui/gnome-window-icon.h> so we could use
- gnome_window_icon_set_from_file() here.
-
-2001-04-17 Radek Doulik <rodo@ximian.com>
-
- * listener.c (reply_indent): more auto-indentation magic
-
-2001-04-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): Use the mail-crypto pgp-mime
- wrappers.
- (build_message): s/CAMEL_PGP_HASH_TYPE_SHA1/CAMEL_CIPHER_HASH_SHA1
-
-2001-04-11 Dan Winship <danw@ximian.com>
-
- * e-msg-composer-select-file.c (create_file_selection): Fix
- previous.
-
-2001-04-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-select-file.c (create_file_selection): Set the
- default filename to the user's homedir.
-
-2001-04-04 Kjartan Maraas <kmaraas@gnome.org>
-
- * e-msg-composer-attachment.c: Fix headers.
- * e-msg-composer-hdrs.c: Same here.
-
-2001-03-29 Kjartan Maraas <kmaraas@gnome.org>
-
- * e-icon-list.c: Replace #include <gtk/gtk.h>
- * e-msg-composer-attachment-bar.c: Replace #include <gnome.h>
- * e-msg-composer-attachment-bar.h: Remove #include <gnome.h>
- * e-msg-composer-attachment.c: Remove #include <gnome.h>
- * e-msg-composer-attachment.h: Same here.
- * e-msg-composer-hdrs.c: Replace #include <gnome.h> and <bonobo.h>
- * e-msg-composer-hdrs.h: Replace #include <gnome.h>
- * e-msg-composer-file.c: #include <gtk/gtkmain.h>, <gtk/gtksignal.h>
- * e-msg-composer.c: Replace #include <bonobo.h>, <gnome.h>
- * e-msg-composer.h: Replace #include <gnome.h> and <bonobo.h>
- * evolution-composer.c: Replace #include <bonobo.h>
- * listener.c: Same here.
-
-2001-03-28 Dan Winship <danw@ximian.com>
-
- * e-msg-composer.c (save_draft): Use the drafts folder specified
- by the account, if possible. Also, fix the setting of "send_html"
- after saving the draft in case the user plans to keep editting...
-
-2001-03-27 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_set_send_html): set the
- FormatHTML property on the editor to let it know the mode.
- (e_msg_composer_construct): set the property at construct time.
-
-2001-03-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_new): Set
- the mime part content-id.
-
-2001-03-19 Radek Doulik <rodo@ximian.com>
-
- * listener.c (reply_indent): set default text color
-
-2001-03-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_get_reply_to): Make
- sure the reply_to text is non-NULL before trying to pass it off to
- the address parser.
-
-2001-03-13 Dan Winship <danw@ximian.com>
-
- * e-msg-composer-attachment.c (update_mime_type): Use
- gnome_vfs_mime_type_from_name rather than gnome_vfs_mime_info,
- since the entered filename doesn't have to be a real file on disk.
- Deal with it returning NULL too.
- (e_msg_composer_attachment_edit): Select the right item in the
- inline/attachment menu.
-
- * e-msg-composer-hdrs.c: s/Pair/EMsgComposerHdrPair/. Namespace!
-
-2001-03-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.h: Added view_replyto member.
-
- * e-msg-composer.c (e_msg_composer_get_visible_flags): Find out if
- we want to view the Reply-To header.
- (e_msg_composer_set_view_replyto): A new function to set the state
- of the replyto header.
- (menu_view_replyto_cb): Callback for setting the ReplyTo state.
- (set_config): Make static.
- (setup_ui): Setup the ReplyTo bonobo stuff.
- (load_from_property_bag): More defaults for the ReplyTo, yay.
- (load_from_gnome_config): Again...
- (e_msg_composer_get_view_bcc): Implemented.
- (e_msg_composer_get_view_cc): Implemented.
- (e_msg_composer_get_view_from): Implemented.
- (e_msg_composer_get_view_replyto): Implemented.
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_get_reply_to_entry):
- New function, yay.
- (e_msg_composer_hdrs_get_reply_to): Another new function.
- (e_msg_composer_hdrs_set_reply_to): Yet another new function...
- (create_headers): Create the reply-to header.
- (attach_headers): Attach the reply_to.
- (headers_set_visibility): Set the reply_to visibility.
- (e_msg_composer_hdrs_to_message): Set the message's reply-to here
- based on the user-set reply-to header.
-
-2001-03-06 Miguel de Icaza <miguel@ximian.com>
-
- * e-msg-composer.c (set_config): New function. Used to store
- integer values into the configuration engine. Handles the case of
- Bonobo-conf being installed, or falls back to gnome_config.
-
- * e-msg-composer-hdrs.c (add_header): Renamed to be
- header_new_recipient(). Now we take care of the other cases in
- create_headers, which is a lot nicer now.
-
- (create_optionmenu): Removed extra "name" argument which was not
- being used anyways (the only arg passed was From:).
- (init): Removed all the redundant NULL initialization by using
- nice g_new0
-
- (create_headers): New function, much cleaner.
-
- Use of Pair structure everywhere instead of individual widgets to
- keep track of which ones are visible and which ones are not.
-
- * e-msg-composer.c (setup_ui): Handle ViewFrom and ViewBCC
- commands.
- (menu_view_bcc_cb, menu_view_from_cb): New functions that
- implement the features described.
-
- (menu_format_html_cb): Removed unrequired test, as
- e_msg_composer_set_send_html already optimizes the case of the
- state being the same.
- (menu_security_pgp_encrypt_cb): Remove redundant code.
- (menu_security_pgp_sign_cb): ditto.
-
-2001-03-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-icon-list.c (icon_new_from_pixbuf): Added a comment reminding
- us that we should probably not force a particular font in the icon
- caption.
-
-2001-02-27 Dan Winship <danw@ximian.com>
-
- * evolution-composer.c (factory_fn): If
- !mail_config_is_configured(), give an error and return NULL.
-
-2001-02-22 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (INCLUDES): Add `-I$(top_srcdir)/shell'.
-
-2001-02-21 Not Zed <NotZed@Ximian.com>
-
- * e-msg-composer.c (menu_file_save_draft_cb):
- (exit_dialog_cb): Use mail_append_mail to save to drafts instead
- of custom thread handler.
-
-2001-02-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): Handle exceptions a little
- nicer and pop up a nice GnomeDialog with the error message - also,
- don't return a CamelMimeMessage if it fails to sign/decrypt
- because we want to let the user decide what to do based on the
- error message he/she gets.
-
-2001-02-15 Dan Winship <danw@ximian.com>
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_set_from_account): If
- @account_name is NULL, pick the default account rather than giving
- a g_warning.
-
- * e-msg-composer.c (e_msg_composer_set_headers): Note in the
- doc comment that @from can be NULL if you want the default account
- (since there is code that expects this).
-
-2001-02-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * evolution-composer.c (corba_recipientlist_to_glist): Use the
- camel-internet-address code to format the address rather than
- doing it the broken way.
-
-2001-02-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * evolution-composer.c (impl_Composer_set_headers): Updated. We
- might want to change the corba interface for this to allow setting
- the from-address as well.
-
- * e-msg-composer.c (e_msg_composer_new_with_message): Updated.
- (e_msg_composer_set_headers): Now takes a 'From' argument so that
- we can try to pre-determine the account the user will want to send
- from.
-
-2001-02-11 Gediminas Paulauskas <menesis@delfi.lt>
-
- * e-msg-composer-attachment.glade.h: removed.
- * e-msg-composer-attachment.glade: do not write strings to above.
- * Makefile.am: don't include glade.h in EXTRA_DIST.
-
-2001-02-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-attachment-bar.c (attach_to_multipart):
- multipart/* is another mime type we DO NOT want to encode ;-)
-
-2001-02-06 Christopher James Lahey <clahey@ximian.com>
-
- * e-msg-composer-hdrs.c (address_button_clicked_cb, add_header):
- Set the default argument to
- GNOME_Evolution_Addressbook_SelectNames_activateDialog correctly.
-
-2001-01-30 Larry Ewing <lewing@ximian.com>
-
- * e-msg-composer-hdrs.c (create_optionmenu): make sure we convert
- from utf-8 before creating the option menu items.
-
-2001-01-25 Jason Leach <jasonleach@usa.net>
-
- (Moving the flag for has_changed from the Hdrs to the Composer
- itself. Providing public methods to set/unset a composer as
- changed. Adding attachments now flags the composer as changed)
-
- * e-msg-composer.c (e_msg_composer_unset_changed): New function.
- (e_msg_composer_set_changed): New function.
-
- * e-msg-composer.c (hdrs_changed_cb): Callback to the new signal,
- uses the new composer_set_changed.
- (attachment_bar_changed_cb): Add a call to the new
- composer_set_changed.
-
- * e-msg-composer-hdrs.c (class_init): New signal "hdrs_changed" to
- tell the parent composer that any of the headers have changed.
- (addressbook_entry_changed): emit the new signal here.
- (entry_changed): And here.
-
-2001-01-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (menu_security_pgp_encrypt_cb): New callback.
- (menu_security_pgp_sign_cb): Another new callback.
- (setup_ui): Added initialization for the PGP sign and encrypt
- bonobo menu items.
- (e_msg_composer_set_pgp_encrypt): Change the Bonobo UI name to
- SecurityPGPEncrypt.
- (e_msg_composer_set_pgp_sign): Change the Bonobo UI name to
- SecurityPGPSign.
-
-2001-01-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): Fixed some memory leaks
- dealing with content-type temp strings. Also implemented code to
- sign and/or encrypt the message if the user has specified that it
- should.
-
-2001-01-20 Jason Leach <jasonleach@usa.net>
-
- (Fix #1222: doing File->New->Mail Message doesn't include .sig)
-
- * evolution-composer.c (init): Get the users account information,
- see if they've specified a sig file, if they do, create a composer
- with that sig.
-
-2001-01-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-hdrs.c (create_optionmenu): Use "Full Name
- <address>" for the label in the menu rather than the account
- name. Specify the account name only if it's not the same as the
- address.
-
-2001-01-19 Jason Leach <jasonleach@usa.net>
-
- * e-msg-composer-hdrs.c (create_addressbook_entry): Listen for
- property bag changes to "entry_changed" on here, which means on
- the To, Cc, and Bcc entries.
- (addressbook_entry_changed): New function that gets called when
- "entry_changed" property is changed (to TRUE).
-
-2001-01-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer.c (build_message): Updated to reflect changes to
- e_msg_composer_hdrs_get_from().
-
- * e-msg-composer-hdrs.c (set_recipients): Don't do anymore utf8
- conversions, the widget already does this (or should unless there
- is brokenness).
- (e_msg_composer_hdrs_get_from): Return a CamelInternetAddress like
- we should.
- (e_msg_composer_hdrs_to_message): Update to reflect changes made
- the the above function.
-
-2001-01-12 Miguel de Icaza <miguel@gnu.org>
-
- * Makefile.am: Make the composer a standard library, not a libtool
- one. Nobody ever uses it as a shared library and it is not
- installed.
-
-2001-01-17 Jason Leach <jasonleach@usa.net>
-
- (Bug #1192: Set the Composer window title to something useful)
-
- * e-msg-composer.c (e_msg_composer_construct): Connect up the new
- signal here.
- (subject_changed_cb): Set the composer window title to the subject
- as it's changed, or if it goes blank make it the default "Compose
- a message".
-
- * e-msg-composer-hdrs.c (class_init): Create a new signal
- "subject_changed".
- (entry_changed): Emit the signal here when the subject entry is
- changed.
-
-2001-01-17 Iain Holmes <iain@ximian.com>
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_edit):
- Get the option menu from the XML file.
- (ok_cb): Set the attachment disposition depending on the option
- menu results.
- (option_menu_get_history): Really should have been in GTK at some
- point.
-
- * e-msg-composer-attachment.glade: Add the option menu.
-
-2001-01-17 Michael Meeks <michael@helixcode.com>
-
- * evolution-composer.c (enum_objects): comment out for now
- to ease compat issues.
- (evolution_composer_construct): pass in NULL for the item
- handler enum_objects fn + calm warning.
-
-2001-01-17 JP Rosevear <jpr@ximian.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_message): Use the
- to/cc/bcc addresses insted of just the to.
-
-2001-01-17 Federico Mena Quintero <federico@ximian.com>
-
- * e-icon-list.[ch]: Ximianified email addresses.
-
-2001-01-16 Radek Doulik <rodo@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_mark_text_orig): publicate
- mark_orig_text
- (set_editor_text): don't call mark_orig_text, let it for reply
-
-2001-01-15 Jason Leach <jasonleach@usa.net>
-
- (Plug leaking the subject string on each message sent)
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_get_subject): Don't
- strdup before returning the subject, it's already been strdup'd
- from the gtk_object_get().
-
-2001-01-13 Jason Leach <jasonleach@usa.net>
-
- (Fix Bug #1083: Composer IDLs not getting installed)
-
- * Makefile.am: add @idl and @idl_DATA vars.
-
-2001-01-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-msg-composer-hdrs.c (create_optionmenu): Oops. Make sure to
- attach the item to the menu ;-)
-
-2001-01-12 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (build_message): Call set_from_account which
- means we no longer have to do all the crap involved in formatting
- strings into an internet-address.
- (e_msg_composer_get_preferred_account): New access function.
-
- * e-msg-composer-hdrs.c (add_header): case COMBOBOX has changed to
- OPTIOMENU.
- (create_optionmenu): Update to use an optionmenu of accounts.
- (from_changed): New callback for the From optionmenu.
- (setup_headers): s/COMBOBOX/OPTIONMENU
- (init): Set the account and from_options to NULL.
- (e_msg_composer_hdrs_get_from): Updated.
- (destroy): free the from_options.
- (e_msg_composer_hdrs_set_from_address): Renamed from set_from
- because it no longer takes a string arg but rather an account arg.
-
-2001-01-12 Miguel de Icaza <miguel@ximian.com>
-
- * e-msg-composer-hdrs.c (add_header): Only attach to "changed" if
- the widget is an EEntry. The HEADER_COMBOBOX and the
- HEADER_ADDRBOOK are a ComboBox and a remote Bonobo control
- respectively.
-
- * evolution-composer.c (get_object): Move getObject functionality
- here from e-msg-composer.c
-
-2001-01-11 Miguel de Icaza <miguel@ximian.com>
-
- * e-msg-composer-hdrs.c (create_dropdown_entry): Only set the
- popdown strings if we have anything to popdown.
-
-2001-01-10 Miguel de Icaza <miguel@helixcode.com>
-
- * evolution-composer.c (evolution_composer_construct): Add an
- ItemContainer Bonobo interface to allow client applications to
- locate the Message Composer component.
-
-2001-01-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (menu_file_save_draft_cb): New callback to save
- draft. Fixes bug #1045.
-
-2001-01-10 Miguel de Icaza <miguel@helixcode.com>
-
- * e-msg-composer.c: Removed more UNSAFE stuff. Maybe we should
- kill this macro, and have people that want these broken things
- define their own macros.
- (setup_item_container): Add an ItemContainer bonobo interface to
- handle options to the window component.
-
-2001-01-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer-hdrs.c (create_dropdown_entry): Updated for new
- config code - this time it works!
-
-2001-01-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer-hdrs.c (create_dropdown_entry): Reverted back to
- old config code temporarily until I get the new config code
- working 100%.
-
-2001-01-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer-hdrs.c (create_dropdown_entry): Updated to
- reflect changes to the mail-config API.
-
-2001-01-05 Radek Doulik <rodo@helixcode.com>
-
- * listener.c (impl_event): disable indenting for now, it crashes
- editor
-
-2001-01-03 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (do_exit): If the headers have changed, then
- continue with the prompt else just destroy the window.
-
- * e-msg-composer-hdrs.c (init): Initialize has_changed to FALSE.
- (entry_changed): New callback to set the value of has_changed.
- (add_header): Attach the "changed" signal.
-
-2001-01-02 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_edit):
- * e-msg-composer-attachment-bar.c (update): Use
- header_content_type_simple, not header_content_type_format.
-
- * e-msg-composer-hdrs.c (create_dropdown_entry): Call
- e_utf8_to_gtk_string on the combobox strings.
-
-2000-12-28 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (handle_multipart_alternative,
- handle_multipart, e_msg_composer_new_with_message): Use
- CamelContentType instead of GMimeContentField.
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_edit):
- * e-msg-composer-attachment-bar.c (update, attach_to_multipart):
- Use CamelContentType, and use the header_content_type_* functions
- rather than operating on the structure by hand.
-
-2000-12-15 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_get_pgp_encrypt): New function
- to get whether or not to encrypt the message.
- (e_msg_composer_set_pgp_encrypt): New function to set encryption.
- (e_msg_composer_get_pgp_sign): New function to get whether or not
- to sign the message.
- (e_msg_composer_set_pgp_sign): New function to set pgp_sign.
- (init): Initialize pgp_sign and pgp_encrypt to FALSE.
-
-2000-12-14 Christopher James Lahey <clahey@helixcode.com>
-
- * e-msg-composer-hdrs.c (add_header): Made it so that carriage
- return doesn't insert a newline in the subject entry.
-
-2000-12-12 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer-hdrs.c (set_entry): Don't convert the utf-8
- string to a gtkstring because the widget expects to get a utf-8
- string.
-
-2000-12-12 Dan Winship <danw@helixcode.com>
-
- * Makefile.am (EXTRA_DIST): Add $(IDLS). (From campd.)
-
-2000-12-07 Radek Doulik <rodo@helixcode.com>
-
- * e-msg-composer.c (prepare_engine): added warnings
- (prepare_engine): updated to IDL:GNOME/GtkHTML/Editor/Engine:1.0
-
- * Makefile.am: renamed HTMLEditor* to Editor*, added Editor-common.c:
- $(HTML_EDITOR_GENERATED) rule
-
-2000-12-05 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (add_recipients): Use camel to construct the
- list of recipients rather than just strchr(recips, ',') which is
- very prone to errors.
-
-2000-11-03 Iain Holmes <iain@helixcode.com>
-
- * e-msg-composer-attachment-bar.c (update): Pass NULL
- instead of icon_name to the e_icon_list_append_pixbuf
- function.
- (init) Take the font size into account when setting the
- height of the bar.
-
-2000-11-02 Iain Holmes <iain@helixcode.com>
-
- * e-msg-composer-attachment-bar.c (update): Use the
- pixbuf_for_mime_type function to get the icon.
- (pixbuf_for_mime_type): Functino that searches nautilus/
- and mc/ for icon files.
-
-2000-11-15 Radek Doulik <rodo@helixcode.com>
-
- * e-msg-composer.c (prepare_engine): update namespace
-
- * updates for HTMLEditor API changes
-
- * e-msg-composer.c: added #include <libgnomevfs/gnome-vfs.h>
-
- * e-msg-composer.h: e_msg_composer_guess_mime_type renamed and
- moved mime_guess_type_from_file_name from camel as it uses VFS
-
-2000-11-14 Radek Doulik <rodo@helixcode.com>
-
- * listener.c (reply_indent): rename command to runCommand
-
- * e-msg-composer.c: updated to HTMLEditor API changes
-
- * listener.c: updated to HTMLEditor API changes
-
-2000-11-13 Radek Doulik <rodo@helixcode.com>
-
- * listener.c (reply_indent): extracted function, does reply
- indentation, use updated editor engine api
-
-2000-11-10 Michael Meeks <michael@helixcode.com>
-
- * Makefile.am ($(HTML_EDITOR_GENERATED)): rearrnace
- includes.
-
-2000-11-10 Larry Ewing <lewing@helixcode.com>
-
- * e-msg-composer.c (build_message): set the HTML charset to utf-8
- for all the html message parts.
- (build_message): make sure we set the proper encoding on the html
- part now that it may contain utf-8 characters
-
-2000-11-08 Radek Doulik <rodo@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_clear_inlined_table): new
- function
- (destroy): use e_msg_composer_clear_inlined_table, destroy
- inlined_images hash table
- (get_signature): added in_html arg, it tells if we should use HTML
- signature
- (set_editor_text): try to use HTML signature
- (e_msg_composer_new_with_sig_file): added send_html arg to be able
- to use HTML signature
-
- * listener.c (resolve_image_url): don't add inlined images to
- attachement bar
-
- * e-msg-composer.c (add_inlined_images): new function, adds
- inlined images to multipart
- (add_inlined_image): helper function, adds one image to multipart
- (build_message): store HTML messages with inlined images to
- multipart/related
-
- * e-msg-composer-attachment-bar.c (add_from_file): removed
- content_id arg
- (e_msg_composer_attachment_bar_attach): likewise
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_new):
- removed content_id arg
-
-2000-11-06 Not Zed <NotZed@HelixCode.com>
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_to_message): Changed
- for message api changes. Use camel_address_unformat to convert
- the editable->usable.
- (set_recipients): Same. Now we set the recipients as
- camel_internet_address's. Fixed a memleak indirectly.
- (decode_addresses): Removed, no longer needed.
- (create_dropdown_entry): We dont want to use _encode(), we want to
- _format, as we are displaying the result. We can use the static
- function too to avoid the object creation, and the memory leak!
- (set_entry): Convert the args to gtk-safe characters, since the
- entry doesn't understand utf8.
- (set_recipients): And likewise do the reverse when retrieving the
- contents of the widget.
-
-2000-11-06 Larry Ewing <lewing@helixcode.com>
-
- * e-msg-composer.c (build_message): set the content type on the
- plain part of outgoing messages.
- (best_content): a helper function to get the best content type for
- the attachment. This should probably use the helper functions in
- the future.
-
-2000-11-06 Kjartan Maraas <kmaraas@gnome.org>
-
- * e-msg-composer-attachment.c: Added #include <config.h>
- * e-msg-composer-hdrs.c: s/_HAVE_CONFIG_H/HAVE_CONFIG_H for
- working i18n.
-
-2000-11-04 Radek Doulik <rodo@helixcode.com>
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_new): fix
- test for regular file to !S_ISREG (statbuf.st_mode)
-
- * listener.c (resolve_image_url): use inline images hash table
-
- * e-msg-composer.c (init): create inlined images hash table
- (destroy): destroy it
- (clear_inline_images): helper function, used from
- g_hash_table_foreach_remove to destroy one inline image record
-
- * e-msg-composer.h: added hash table with inlined images url ->
- cid info
-
-2000-11-03 Radek Doulik <rodo@helixcode.com>
-
- * listener.c (impl_event): updated for API changed
- implemented image_url event
- (resolve_image_url): new helper function, attaches image to mail
- and returns new (resolved) url pointing to mime component
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_new):
- added conponent_id parameter
-
- * e-msg-composer-attachment-bar.c
- (e_msg_composer_attachment_bar_attach): added parameter content_id
- (add_from_file): likewise
-
-2000-11-03 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer-attachment.c (e_msg_composer_attachment_new):
- Don't allow attaching anything but regular files.
-
-2000-11-03 Federico Mena Quintero <federico@helixcode.com>
-
- * Makefile.am: Clean the idl-generated files properly.
-
-2000-11-02 Peter Williams <peterw@helixcode.com>
-
- * e-msg-composer-attachment-bar.c (attach_to_multipart): CamelStreamMem
- steals our byte array; we can't destroy the byte array explicitly, and
- we must unref the stream only when done using the array.
-
-2000-11-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_message): Don't create
- the To, Cc, and Bcc lists based only on the address, use both the
- name and address and camel_address_encode() them.
-
-2000-11-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer-attachment-bar.c (attach_to_multipart): Fix the
- CTE kludge, calculate the best mime transfer encoding for the mime
- part and use that. Include e-msg-composer-select-file.h
-
-2000-10-31 Radek Doulik <rodo@helixcode.com>
-
- * e-msg-composer.c (prepare_engine): new function, tries prepare
- editor engine
- (mark_orig_text): marks original text in editor
- (set_editor_text): call mark_orig_text
- (create_composer): call prepare_engine
-
- * Makefile.am (IDL_GENERATED): added HTMLEditor generated files to
- IDL_GENERATED
- ($(IDL_GENERATED)): generate also files from HTMLEditor.idl
- (libcomposer_la_SOURCES): added listener.[ch]
-
- * e-msg-composer.h: added editor_engine and editor_listener to
- EMsgComposer
-
- * listener.[ch]: new files, implementation of HTMLEditor::Listener
-
-2000-10-27 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am ($(IDL_GENERATED)): Get `Composer.idl' from
- `$(srcdir)' so that it builds with builddir != srcdir.
-
-2000-10-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_message): Fixed my
- not-quite-right logic so that we don't accidently set the body
- contents using a plain text attachment instead of the actual body
- of the message :-)
-
-2000-10-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_message): Populate the
- composer with any attachments.
-
-2000-10-25 Iain Holmes <iain@helixcode.com>
-
- * e-msg-composer-select-file.c (create_file_selection): Set the
- wmclass and wmclass_name for the file selectors so that Sawfish
- doesn't make the dialogs the same size as the parent.
-
-2000-10-25 Dan Winship <danw@helixcode.com>
-
- * evolution-composer.c (init): Attach send/postpone signal
- handlers to the EMsgComposer.
- (evolution_composer_factory_init): Take send/postpone signal
- handlers as arguments.
-
-2000-10-23 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c, e-msg-composer-attachment-bar.c: add some
- missing _()s.
-
- * e-msg-composer-address-dialog.*, e-msg-composer-address-entry.*:
- Old cruft. Remove.
-
- * Makefile.am: Update for removed files.
-
- * e-msg-composer-hdrs.c: Remove e-msg-composer-address-entry.h
- include.
-
- * e-msg-composer.c: Remove e-msg-composer-address-dialog.h include
-
-2000-10-23 Ariel Rios <ariel@arcavia.com>
-
- * e-msg-composer-hdrs.c: Include Composer.h
- instead of volution-Addressbook-SelectNames.h
-
-2000-10-22 Dan Winship <danw@helixcode.com>
-
- * .cvsignore: No, don't ignore Evolution-Addressbook-SelectNames*.
- They're not supposed to be there any more.
-
-2000-10-22 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-msg-composer-attachment-bar.c (attach_cb): Removed.
- (add_from_user): Use `e_msg_composer_select_file()' instead of
- doing the file selector widget magic by yourself.
-
-2000-10-20 Jeffrey Stedfast <fejj@helixcode.com>
-
- * .cvsignore: Ignore Evolution-Addressbook-SelectNames*
-
-2000-10-20 Dan Winship <danw@helixcode.com>
-
- * Evolution-Composer.idl: Evolution::Composer interface
-
- * evolution-composer.[ch]: Implementation and factory. So
- entirely not tested.
-
- * Makefile.am (libcomposer_la_SOURCES): Add
- evolution-composer.[ch]
- (IDLS): Update this for Evolution-Composer.idl / Composer.idl
-
- * main.c: Removed. (Old, dead code)
-
-2000-10-19 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am (glade_data): Add `e-msg-composer-attachment.glade'.
- (glade_messages): New.
- (EXTRA_DIST): Add `$(glade_messages)'.
-
-2000-10-19 Michael Meeks <michael@helixcode.com>
-
- * e-msg-composer.c (create_menubar_file, create_menubar_edit),
- (create_menubar_format, create_menubar_view, create_menubar): kill.
- (create_toolbar): die.
- (setup_ui): impl.
- (e_msg_composer_construct): hook in.
- (menu_format_html_cb): update.
- (menu_view_attachments_activate_cb): ditto.
- (destroy): upd.
- (e_msg_composer_construct): upd.
- (e_msg_composer_set_send_html): upd.
-
-2000-10-16 Iain Holmes <iain@helixcode.com>
-
- * e-msg-composer-hdrs.c (init): Don't need the ID anymore.
-
-2000-10-17 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_message): If the body
- text was NULL, then don't bother turning it into HTML (besides, it
- causes a nasty segfault).
-
-2000-10-15 Dan Winship <danw@helixcode.com>
-
- * Makefile.am: Move CPPFLAGS flags to INCLUDES to avoid bashing
- any CPPFLAGS set at configure time.
-
-2000-10-14 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer-attachment.c (set_entry): If the entry widget is
- NULL, obviously we can't set any text on it.
-
-2000-10-14 Iain Holmes <iain@helixcode.com>
-
- * e-msg-composer-hdrs.c (init): Create a unique-ish id for this set
- of headers, so that only one select-names dialog will be created for
- a given set of headers.
- (address_button_clicked_cb): Pass the unique-ish id to the activate
- dialog command.
-
-2000-10-13 Larry Ewing <lewing@helixcode.com>
-
- * e-msg-composer.c (build_message): stop using format_text,
- gtkhtml handles this now.
- (format_text): function removed.
-
-2000-10-10 Iain Holmes <iain@helixcode.com>
-
- * e-icon-list.c: Allow NULL pixbufs, and load the "broken" image
-
- * e-msg-composer-attachment-bar.c (update): If the image isn't
- found load the default text/plain icon.
-
-2000-10-02 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (build_message): If the body of the message has
- 8-bit chars, set the Content-Transfer-Encoding type to the best
- encoding.
-
-2000-10-02 Dan Winship <danw@helixcode.com>
-
- * e-icon-list.c: fix #include of gnome-canvas-pixbuf.h
-
-2000-10-02 Iain Holmes <iain@helixcode.com>
-
- * e-msg-composer-attachment-bar.c: If the description of an attachment
- is a blank string, revert to displaying the filename.
-
-2000-10-01 Iain Holmes <iain@helixcode.com>
-
- * e-icon-list.c: If you try to add an icon from a file that doesn't
- exist put a "Broken icon" image.
-
- * bad-icon.xpm: Broken icon image.
-
-2000-10-01 Iain Holmes <iain@helixcode.com>
-
- * e-msg-composer-attachment-bar.[ch] (update): If the attachment is
- an image, then make a thumbnail for it.
- Base the attachment bar on e-icon-list instead of gnome-icon-list.
-
- * e-icon-list.[ch]: New files. These are modified versions of
- gnome-icon-list from gnome-libs HEAD that uses gdk-pixbuf instead
- of the evil Imlib.
-
- * e-msg-composer-attachment.[ch]: Add a pixbuf_cache member, to
- save us having to generate a thumbnail for the attachment every
- time the bar changes.
-
- * e-msg-composer.c (e_msg_composer_construct): Add dnd support for
- files. Drag a file to the composer to add it as an attachment.
-
-2000-09-28 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (build_message): Check to see if the body has
- 8bit chars, if so - set the Content-Transfer-Encoding to 8bit.
- Addresses Bugzilla bug #652.
-
-2000-09-25 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer-hdrs.c (setup_headers): fix typo in tooltip.
- * e-msg-composer.c (create_menubar_file): fix accelerator for
- "Save as" to be different from "Save". (Both problems pointed out
- by menthos@menthos.com.)
-
-2000-09-24 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (get_signature): Updated to handle FIFO
- streams.
-
-2000-09-19 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_construct): Don't g_error out
- if the html-editor-control fails.
- (create_composer): New internal function to create and construct a
- msg_composer and pop up an error message if it fails.
- (e_msg_composer_new, e_msg_composer_new_with_sig_file,
- e_msg_composer_new_with_message, e_msg_composer_new_from_url): Use
- create_composer, return if it fails, change return type to
- EMsgComposer *.
-
-2000-09-18 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer-attachment.c (get_mime_type): Use
- gnome_vfs_get_file_info.
-
- * e-msg-composer-attachment-bar.c (update): Use gnome_vfs_mime
- functions, not old gnome_mime.
-
-2000-09-18 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added $(EXTRA_GNOME_CFLAGS) and
- $(EXTRA_GNOME_LIBS). Removed unneeded libraries.
-
- * e-msg-composer-address-dialog.c, e-msg-composer-address-entry.c,
- e-msg-composer-attachment.c, e-msg-composer-hdrs.c,
- e-msg-composer.c: Fixed the #include lines to deal properly with
- gal.
-
-2000-09-12 Michael Meeks <michael@helixcode.com>
-
- * e-msg-composer.c: Update for new UI handler.
-
-2000-09-12 Larry Ewing <lewing@helixcode.com>
-
- * e-msg-composer-attachment-bar.c (add_common): add a make sure
- the attachment isn't NULL. A more complete fix coming soon.
-
-2000-09-12 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am ($(IDL_GENERATED)): Add space after `-I'.
-
-2000-09-05 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-msg-composer.c (create_menubar_format): Accelerate the
- `Format' menu with an `o' instead of an `f' [the `f' is already
- taken by the "File" menu].
-
-2000-09-04 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_sig_file): Applied
- Jesse's patch that sets the composer's sig_file
-
-2000-09-02 Lauris Kaplinski <lauris@helixcode.com>
-
- * e-msg-composer-address-dialog.c: Use e_utf8 wrappers
-
-2000-09-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_get_sig_file): This needs to
- return a const char * and not a char *, because we're not actually
- allocating memory here.
- (create_menubar_file): Changed "Send" to "Send Now" and added
- "Send Later"
- (menu_file_send_later_cb): New callback that emits the POSTPONE
- signal (equivalent to "Send Later"
-
-2000-08-28 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_message): Always
- request to import the HTML version if at all possible so that we
- maintain formatting and other nifty stuff :-)
-
-2000-08-28 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_to_message): Set the
- "From" address in the CamelMimeMessage. Also updated to use
- get_subject to both make our lives easier and prepare for using UTF8
- (e_msg_composer_hdrs_get_subject): Updated to behave similarly to
- get_from and return allocated memory (it will have to return
- allocated memory once it's converted to use UTF8 anyways)
-
- * e-msg-composer.c (setup_save_draft): Always set
- composer->send_html = TRUE so that formatting is preserved.
-
-2000-08-24 Lauris Kaplinski <lauris@helixcode.com>
-
- * e-msg-composer-address-entry.c: Use e_utf8 wrappers
-
- * e-msg-composer-attachment.c: Use e_utf8 wrappers
-
- * e-msg-composer-hdrs.c: Use e_utf8 wrappers
-
-2000-08-24 Peter Williams <peterw@helixcode.com>
-
- * Makefile.am (INCLUDES): Add builddir/shell so we can
- get Evolution.h
-
-2000-08-12 Michael Meeks <michael@helixcode.com>
-
- * e-msg-composer.c (get_text): get_text not get_txt.
-
-2000-08-11 JP Rosevear <jpr@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_message): Use
- new config accessors
-
-2000-08-10 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c: Remove unneeded e-setup.h include
-
-2000-08-10 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (exit_dialog_cb): Made async
-
-2000-08-10 Peter Williams <peterw@helixcode.com>
-
- * e-msg-composer.c (do_exit): Temporarily disable draft saving
- while we figure out how to work around Zucchi's new append_message.
-
-2000-08-10 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_get_from): Return the
- text in GtkCombo->entry
-
-2000-08-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer-hdrs.c (create_dropdown_entry): Fixed the GList
- identity stuff, should now display all configured identities.
-
-2000-08-09 Christopher James Lahey <clahey@helixcode.com>
-
- * e-msg-composer-address-dialog.c: Fixed some warnings.
-
- * e-msg-composer-hdrs.c: Switched the composer to use an EEntry
- for the subject field.
-
- * e-msg-composer.c: Changed the non scaling objects in this vbox
- to be FALSE, FALSE instead of FALSE, TRUE.
-
-2000-08-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer-hdrs.c (add_header): Modified to allow dropdown
- entry-boxes as well (for headers like From:)
- (setup_headers): Modified to use the correct enum type.
- (create_dropdown_entry): New convenience function to add a
- drop-down combo box and fill it in with identities
- (init): Set from_entry to NULL
- (e_msg_composer_hdrs_get_from): New convenience function to get
- the text in the From widget in the composer
- (e_msg_composer_hdrs_set_from): New convenience function to set
- the From header in the composer
-
-2000-08-08 JP Rosevear <jpr@helixcode.com>
-
- * Makefile.am: Fix build by allowing includes for e-table dir
-
-2000-08-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer-attachment-bar.c (attach_to_multipart):
- s/strcasecmp/g_strcasecmp
-
- * e-msg-composer.c: s/strncasecmp/g_strncasecmp - this will help
- later with building on different platforms :-)
-
-2000-08-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_message): Added code
- to set the body text based on the CamelMimeMessage.
- (set_editor_text): Use lowercase html tags...
-
-2000-08-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c (do_exit): Prompt the user to save their
- composition in Drafts.
- (set_editor_text): Uhm, use "-- \n" not "--\n" because the space
- is called for in the standard
- (e_msg_composer_new_with_message): New convenience function that
- takes a CamelMimeMessage as an argument. This will be useful when
- we code the ability to resume the editing of a message draft (like
- in the Drafts folder).
-
-2000-08-01 JP Rosevear <jpr@helixcode.com>
-
- * e-msg-composer.h: Constify param
-
- * e-msg-composer.c (get_signature): Constify param
- (set_editor_text): ditto
- (e_msg_composer_new_with_sig_file): ditto
-
-2000-08-01 Peter Williams <peterw@helixcode.com>
-
- * e-msg-composer.c (set_editor_text): sizeof("--\") !=
- strlen("--\n"), breaking the test for the signature prefix.
-
-2000-07-28 JP Rosevear <jpr@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_new_with_sig_file): New
- function to create composer with sig file set.
- (e_msg_composer_get_sig_file): New function to get sig file
- (e_msg_composer_set_sig_file): New function to set sig file
-
-2000-07-25 Michael Meeks <michael@helixcode.com>
-
- * e-msg-composer.c (get_text): add textual exception printout.
- (set_editor_text): close pre tags & check for pre-existing
- sig separator.
-
-2000-07-25 Peter Williams <peterw@helixcode.com>
-
- * e-msg-composer.c (menu_file_insert_file_cb): Mark this function
- as FIXME because we're waiting for the HTML Editor Control to
- support paste commands. Also some updates for when that happens.
-
-2000-07-24 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c: Remove GOAD support.
- (create_editor): Try to give a more helpful error message when
- failing to load the editor control.
-
-2000-07-23 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-msg-composer.c (menu_format_html_cb): New callback for the
- "Send HTML" menu toggle item.
- (create_menubar_format): New.
- (create_menubar): Call it.
- (create_menubar_options): Removed.
- (init): Initialize `send_html' and `attachment_bar_visible' to
- FALSE.
- (get_signature): Add `void' to the declaration. This is C, not
- C++.
- (menu_file_close_cb): Renamed from `exit_cb'.
- (menu_file_send_cb): Renamed from `send_cb'.
- (menu_file_save_as_cb): Renamed from `save_as_cb'.
- (menu_file_save_cb): Renamed from `save_cb'.
- (menu_file_open_cb): Renamed from `open_cb'.
- (menu_file_add_attachment_cb): Renamed from `add_attachment_cb'.
- (menu_file_insert_file_cb): Renamed from `insert_file_cb'.
- (e_msg_composer_set_send_html): New.
- (build_message): Use the `send_html' flag instead of peeking the
- `msg_format' gnome-config value directly.
-
- * e-msg-composer.h: New member `send_html' in `EMsgComposer'.
-
-2000-07-23 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-msg-composer.c: Changed to use BonoboUIHandler stuff directly
- instead of translating from GnomeUIInfo.
- (create_menubar_file): New.
- (create_menubar_edit): New.
- (create_menubar_view): New.
- (create_menubar_options): New.
- (create_menubar): Use these functions to set up the menu bar.
- (create_toolbar): Use BonoboUIHandler directly instead of
- converting from GnomeUIInfo.
- (toolbar_view_attachments_clicked_cb): Removed.
- (address_dialog_cb): Removed.
- (address_dialog_destroy_cb): Removed.
- (address_dialog_apply_cb): Removed.
- (setup_address_dialog): Removed.
-
-2000-07-12 Peter Williams <peterw@helixcode.com>
-
- * e-msg-composer.c: (view_tree) Make the "View Attachments" item
- a toggleitem ... so that it can be toggled...
- (menu_view_attachments_activate_cb): Treat the widget correctly
- and toggle correctly.
-
-2000-07-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-msg-composer.c (exit_cb): Use it.
- (delete_event): New, handler for the "delete_event" signal.
-
-2000-07-09 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (set_editor_text): Don't load "" into the
- editor, because it will cause the editor component to g_warning.
-
-2000-07-09 Christopher James Lahey <clahey@helixcode.com>
-
- * e-msg-composer-hdrs.c: Removed the extra frame here.
-
-2000-07-08 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (create_menubar): Create an empty "Edit" menu
- for the editor control to insert itself into.
-
-2000-07-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * .cvsignore: Ignore dynamically created source files
-
-2000-07-08 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-msg-composer-hdrs.c (set_entry): New.
- (e_msg_composer_hdrs_set_to): Use it.
- (e_msg_composer_hdrs_set_cc): Likewise
- (e_msg_composer_hdrs_set_bcc): Likewise.
- (e_msg_composer_hdrs_get_to): Replace implementation with a
- `g_assert_not_reached()'.
- (e_msg_composer_hdrs_get_cc): Likewise.
- (e_msg_composer_hdrs_get_bcc): Likewise.
-
- * e-msg-composer.c: Get rid of cut/copy/paste/undo as they
- duplicate the editor toolbar and cannot be made to work for all
- the widgets anyway.
-
-2000-07-08 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-msg-composer-hdrs.c: New member `corba_select_names' in
- `EMsgComposerHdrsPrivate'.
- (destroy): If not `CORBA_OBJECT_NIL', release.
- (init): Init to `CORBA_OBJECT_NIL'.
- (setup_corba): New.
- (e_msg_composer_hdrs_new): Call it.
- (add_entry): Create the entries by using the ::SelectNames
- interface.
- (address_button_clicked_cb): Activate the dialog through the
- ::SelectNames interface.
-
-2000-06-29 Jeffrey Stedfast <fejj@helixcode.com>
-
- * e-msg-composer.c: Changed "Exit" to "Close" in the File menu.
- This is a little more intuitive as it does not suggest exiting
- the application, just says "close this window".
-
-2000-06-26 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added e-msg-composer-select-file.h for make
- distcheck.
-
-2000-06-26 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-msg-composer.c
- (load): New.
- (open_cb): Use it.
- (save): New function.
- (save_cb): Implemented by using it.
- (save_as_cb): Likewise.
-
-2000-06-17 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_construct): I18N the title bar.
-
- * Makefile.am (libcomposerinclude_HEADERS): Removed. Move all the
- `.h' files into `libcomposer_la_SOURCES' so that they get
- distributed, but not installed.
-
- * e-msg-composer.c (open_cb): New; implement the `Open' command.
- (save_as_cb): New; implement the `Save as' command.
- (init): Initialize the `persist_file_interface' and
- `persist_stream_interface' members to NULL.
- (destroy): Release the PersistStream and PersistFile interfaces.
- (e_msg_composer_construct): Query the PersistFile and
- PersistStream interfaces on the control and save them in the
- `persist_file_interface' and `persist_stream_interface' members.
- (get_text): Renamed from `get_editor_text'. Get a
- @persist_stream_interface instead of querying it a the control.
- (build_message): Return NULL if `persist_stream_interface' is nil.
-
- * e-msg-composer.h: New member `persist_file_interface' in
- `EMsgComposer'.
-
- * e-msg-composer-select-file.c: New.
- * e-msg-composer-select-file.h: New.
-
- * e-msg-composer.c (e_msg_composer_construct): Make the `To:'
- entry grab the keyboard focus.
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_get_to_entry): New.
- (e_msg_composer_hdrs_get_cc_entry): New.
- (e_msg_composer_hdrs_get_bcc_entry): New.
- (e_msg_composer_hdrs_get_subject_entry): New.
-
- * e-msg-composer.c (e_msg_composer_construct): Set the scroll
- frame's shadow type to `GTK_SHADOW_IN'.
- (format_text): Initialize `tabbing' to zero to shut down the
- compiler.
-
-2000-06-14 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer-attachment-bar.c (add_from_user): keep the
- GtkFileSelection around between calls so we start up in the same
- directory we ended up in last time around. (Also fixes a big
- memory leak in that the code was already keeping the
- GtkFileSelection around, it just wasn't remembering to reuse it.)
-
- * e-msg-composer.c (format_text): Don't line-wrap lines that start
- with ">".
-
-2000-06-12 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (format_text): If a paragraph starts with TABs,
- indent the whole paragraph to that tab level.
-
-2000-06-12 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-msg-composer.c: Make the `attachment_scroll_frame' an
- `EScrollFrame'.
- (exit_cb): I18N the quit message.
-
- * e-msg-composer.h: `attachment_scrolled_window' renamed to
- `attachment_scroll_frame'.
-
-2000-06-12 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (format_text): Don't break on non-breaking
- spaces, don't keep non-breaking spaces that fall after a line
- wrap, and translate non-breaking spaces to regular ones after
- wrapping.
-
-2000-06-05 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_attach): New convenience
- function.
-
- * e-msg-composer-attachment.c: Store a CamelMimePart rather than
- filename/description/mime_type info. Also record whether we were
- told or guessed the MIME type.
- (e_msg_composer_attachment_new_from_mime_part): New constructor.
- (e_msg_composer_attachment_edit): Remove the "browse" button. (If
- the user wants to change the actual file that the attachment is
- based on, he should delete the attachment and create a new one...)
- Remove the "Apply" button, because it's not all that useful. Make
- the MIME type only track the filename if it was guessed rather
- than being provided.
-
- * e-msg-composer-attachment.glade: Remove "browse" and "apply"
- buttons. Make filename editable.
-
- * e-msg-composer-attachment-bar.c (sort): Removed. Send the
- attachments in the order the user attached them in.
- (text_changed): Removed, since we weren't enabling the relevant
- GnomeIconList functionality that would have used this.
- (update): Don't print the size if it's 0.
- (attach_to_multipart, etc): adjust for EMsgComposerAttachment
- changes.
- (attach_to_multipart): Use 7bit encoding for message/ subparts.
- (e_msg_composer_attachment_bar_attach_mime_part): New convenience
- function.
-
-
-2000-06-02 Christopher James Lahey <clahey@helixcode.com>
-
- * e-msg-composer.c: Added the ability to save plain text mail.
-
-2000-05-29 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (get_editor_text): add a "format" argument so
- we can fetch different kinds of text.
- (format_text): New function to do line wrapping on plain text.
- (build_message): Build multipart/alternative messages rather than
- HTML-only ones. Yay. We don't suck (as much) any more!
-
-2000-05-28 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c: #include <errno.h>
-
-2000-05-26 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (get_editor_text, set_editor_text): Update for
- PersistStream changes
- (build_message): Update for CamelMultipart changes.
-
- * e-msg-composer.c (get_signature): routine to read the user's
- signature file.
- (set_editor_text): If the user has configured a signature, append
- it to the set text.
- (e_msg_composer_new): Call set_editor_text with "" to load the
- signature (if any).
-
-2000-05-25 Not Zed <NotZed@HelixCode.com>
-
- * e-msg-composer.c (build_message): Use camel_data_wrapper_new
- instead of camel_simple_data_wrapper_new.
-
-2000-05-17 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (build_message): Use
- camel_simple_data_wrapper_new rather than camel_data_wrapper_new.
-
-2000-05-13 Valek Filippov <frob@df.ru>
-
- * e-msg-composer-attachment.glade: save translatable strings
- * e-msg-composer-attachment.glade.h: file with strings
- * e-msg-composer-address-dialog.glade: save translatable strings
- * e-msg-composer-address-dialog.glade.h: file with strings
-
-2000-05-12 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (get_editor_text): NUL-terminate the data
- extracted from the BonoboStream.
-
-2000-05-10 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer-attachment-bar.c (attach_to_multipart): deal with
- Content-Transfer-Encoding a little bit at least.
-
-2000-05-07 Mathieu Lacage <mathieu@gnu.org>
-
- * e-msg-composer.c (create_editor): remove FIXME and hardcoded
- string. You can write mails with OAF now.
-
-2000-05-07 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (build_message): unref content, etc. after
- attaching it to message.
-
- * e-msg-composer-attachment-bar.c (attach_to_multipart): unref
- part after attaching it.
-
-2000-05-06 Christopher James Lahey <clahey@helixcode.com>
-
- * e-msg-composer-hdrs.c: Turned off focus in the To, Cc, and Bcc
- buttons.
-
-2000-05-02 Matt Loper <matt@helixcode.com>
-
- * Makefile.am: set G_LOG_DOMAIN.
-
-2000-04-28 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer-hdrs.c (set_recipients): Update (minimally) for
- Camel recipient changes.
-
-2000-04-27 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_new_from_url): New routine, to
- process mailto URLs.
-
-2000-04-26 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (build_message): Only generate a multipart
- message if there are attachments. Otherwise generate a single
- part.
-
- * Update for CamelMimeBodyPart -> CamelMimePart
-
-2000-04-26 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer-attachment-bar.c (attach_to_multipart): add a
- s/SIMPLE_// that notzed missed. Update to use
- camel_mime_part_set_content.
- * e-msg-composer.c (build_message): remove a now-unused variable.
- Update for camel_mime_part_set_content.
-
-2000-04-26 NotZed <NotZed@HelixCode.com>
-
- * e-msg-composer.c (build_message): Use camel_mime_part_set_text()
- to set the text rather than messing with data wrappers.
-
- * e-msg-composer-attachment-bar.c (attach_to_multipart): Change
- for new camel-stream interfaces.
- (attach_to_multipart): Also set base64 encoding by default.
-
-2000-04-25 Radek Doulik <rodo@helixcode.com>
-
- * e-msg-composer.c (create_editor): use uih here
- (e_msg_composer_construct): create menubar/toolbar before creating
- editor control
-
-2000-04-23 Dan Winship <danw@helixcode.com>
-
- * Makefile.am: build libcomposer static and don't install it.
-
- * e-msg-composer-attachment-bar.c (attach_to_multipart): This was
- only half-implemented. Finish it, mostly.
-
-2000-04-22 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_add_header): new function to
- make the composer record additional headers it should output.
- (In-Reply-To), etc.
- (build_message): output them
-
-2000-04-21 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_set_headers):
- (e_msg_composer_set_body_text): new functions
- (exit_cb): Connect "Exit" menu item finally.
-
- * e-msg-composer-hdrs.c: const poisoning
- (e_msg_composer_hdrs_set_subject):
- (e_msg_composer_hdrs_get_subject): new functions
-
- * e-msg-composer-address-entry.c: const poisoning
-
-2000-04-20 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (get_editor_text, set_editor_text): new
- functions to get and set the contents of the HTML editor via
- Bonobo::PersistStream.
- (build_message): use get_editor_text. This works again.
-
-2000-04-17 Dan Winship <danw@helixcode.com>
-
- * e-msg-composer.c (build_message): Change
- camel_mime_message_new_with_session to camel_mime_message_new
-
-2000-03-17 bertrand <bertrand@helixcode.com>
-
- * e-msg-composer.c (create_menubar): Pass the composer as the data
- for the menubar callbacks.
-
-2000-03-12 Matt Loper <matt@helixcode.com>
-
- * Makefile.am: Modified to make the composer into a library, to be
- used by the mail component.
-
-2000-03-07 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-msg-composer.c (create_toolbar): Pass the composer as the data
- for the toolbar callbacks.
- (e_msg_composer_construct): Connect the "changed" signal of the
- attachment bar to `attachment_bar_changed()'.
- (attachment_bar_changed): Renamed to `attachment_bar_changed_cb'.
-
-2000-03-02 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-msg-composer.c (e_msg_composer_new): Precondition:
- gtk_main_level() greater than zero.
- (e_msg_composer_construct): Likewise.
- (create_menus): New function. Set up menus through
- BonoboUIHandler.
- (e_msg_composer_construct): Use it.
-
- * main.c (main): Initialize Bonobo.
-
- * e-msg-composer.c (init): Initialize `uih' and `editor' to NULL.
- Do not init `text' and `text_scrolled_window' anymore.
- (destroy): Unref `uih'.
- (e_msg_composer_construct): Create a new BonoboUIHandler and put
- it into `uih'.
- (create_editor): New helper function.
- (e_msg_composer_construct): Use it to set up the editor.
-
- * e-msg-composer.h: New member `uih' in `EMsgComposer'. Removed
- members `text', `text_scrolled_window'. New member `editor'.
-
- * Makefile.am (INCLUDES): Add `$(BONOBO_GNOME_CFLAGS)'.
- (evolution_msg_composer_LDADD): Add `$(BONOBO_GNOME_LIBS)'.
-
- * e-msg-composer.c (glade_connect): Removed.
- (setup_signals): Removed.
- (e_msg_composer_construct): Do not use libglade to set the toolbar
- and menubar up.
- (destroy): Removed libglade stuff.
- (init): Likewise.
-
- * e-msg-composer.h: Removed `menubar_gui', `toolbar_gui',
- `appbar_gui'.
-
- * e-msg-composer.glade: Removed.
-
-2000-01-12 bertrand <bertrand@helixcode.com>
-
- * Makefile.am (evolution_msg_composer_LDADD):
- use $(EXTRA_GNOME_LIBS_THREADS) to link with gthread
-
-1999-11-17 Ettore Perazzoli <ettore@gnu.org>
-
- * Makefile.am: New Makefile to compile the message composer
- executable.
-
- * main.c: New file.
-
- * e-msg-composer-hdrs.c (e_msg_composer_hdrs_to_message): Use
- `CAMEL_RECIPIENT*' macros instead of the old `RECIPIENT*' ones
- that do not exist anymore.
-
- * e-msg-composer-address-dialog.c
- (e_msg_composer_address_dialog_construct): Use `E_GLADEDIR'
- instead of `E_GUIDIR'.
- * e-msg-composer-attachment.c (e_msg_composer_attachment_edit):
- Likewise.
- * e-msg-composer.c (e_msg_composer_construct): Likewise.
-
-(See `$(top_srcdir)/widgets/ChangeLog' for previous changes to the
-message composer.)
diff --git a/composer/Composer.idl b/composer/Composer.idl
deleted file mode 100644
index 0f2e47e517..0000000000
--- a/composer/Composer.idl
+++ /dev/null
@@ -1,3 +0,0 @@
-/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-#include <Evolution-Composer.idl>
diff --git a/composer/Evolution-Composer.idl b/composer/Evolution-Composer.idl
deleted file mode 100644
index 5dc62a3317..0000000000
--- a/composer/Evolution-Composer.idl
+++ /dev/null
@@ -1,141 +0,0 @@
-/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Evolution-Composer.idl: Mail composer interfaces for Evolution
- *
- * Author:
- * Dan Winship <danw@ximian.com>
- *
- * (C) 2000 Ximian, Inc.
- */
-
-#include <Bonobo.idl>
-
-module GNOME {
-module Evolution {
-
- interface Composer : Bonobo::Unknown {
- struct Recipient {
- string name; /* UTF-8 */
- string address;
- };
- typedef sequence<Recipient> RecipientList;
-
- typedef sequence<char> AttachmentData;
-
- enum MultipartType {
- MIXED,
- ALTERNATIVE
- };
-
- /**
- * setHeaders:
- * @from: the "From" account or address
- * @to: the "To" recipients
- * @cc: the "CC" recipients
- * @bcc: the "Bcc" recipients
- * @subject: the subject of the message
- *
- * Sets the composer headers. Any of @to, @cc, and
- * @bcc may be an empty list, and @subject may be an
- * empty string. If @from is empty or invalid, the
- * default account will be used. Otherwise is
- * specifies an account name or email address to send
- * from.
- **/
- void setHeaders (in string from, in RecipientList to,
- in RecipientList cc, in RecipientList bcc,
- in string subject);
-
- /**
- * setMultipartType:
- * @type: a multipart subtype
- *
- * Sets the kind of multipart message that is being
- * created.
- *
- * If @type is MIXED (the default), setBody()
- * will create the body, and attachMIME() and
- * attachData() will create attachments.
- *
- * If @type is ALTERNATIVE, setBody() will create
- * text/plain alternative, and each following
- * attachMIME() or attachData() call will create
- * another alternative.
- *
- * Other values of @type are not currently supported,
- * although "related" probably should be.
- **/
- void setMultipartType (in MultipartType type);
-
- /**
- * setBody:
- * @body: the body
- * @mime_type: the MIME type of @body
- *
- * Sets the body of the composer to @body. If
- * @mime_type is something other than "text/plain" or
- * "text/html", the composer will not be editable
- * and it will not attempt to assign a non-UTF8
- * character set to the data. However, @mime_type may
- * include parameters in that case.
- **/
- void setBody (in string body, in string mime_type);
-
- /**
- * attachMIME:
- * @data: the attachment data
- *
- * This adds an attachment to the composer. @data
- * should be a fully-formed MIME body part.
- **/
- exception CouldNotParse {};
- void attachMIME (in string data)
- raises (CouldNotParse);
-
- /**
- * attachData:
- * @content_type: the Content-Type header
- * @filename: the suggested filename, or ""
- * @description: a description of the data, or ""
- * @show_inline: whether the attachment should be
- * displayed inline or not.
- * @data: the raw attachment data
- *
- * This adds @data as an attachment, using the provided
- * information to generate MIME headers. @content_type
- * may contain just a MIME content type, or it may
- * contain a complete Content-Type header. @filename
- * is a filename for the Content-Disposition header
- * @description (if not "") provides the
- * Content-Description, and @show_inline determines if the
- * Content-Disposition is "inline" or "attachment".
- *
- * If you need to specify headers or values other than
- * what this function can do, you will need to generate
- * all of the MIME headers yourself and use
- * add_attachment ().
- **/
- void attachData (in string content_type,
- in string filename,
- in string description,
- in boolean show_inline,
- in AttachmentData data);
-
- /**
- * show:
- *
- * Shows the composer and lets the user edit things
- * and send the message.
- **/
- void show ();
-
-
- /**
- * send:
- *
- * Send the message without showing the user the composer
- **/
- void send ();
- };
-};
-};
diff --git a/composer/Makefile.am b/composer/Makefile.am
deleted file mode 100644
index 4d536dc95e..0000000000
--- a/composer/Makefile.am
+++ /dev/null
@@ -1,93 +0,0 @@
-## CORBA stuff
-
-IDLS = \
- Evolution-Composer.idl \
- Composer.idl
-
-IDL_GENERATED = \
- Composer.h \
- Composer-common.c \
- Composer-skels.c \
- Composer-stubs.c
-
-HTML_EDITOR_GENERATED = \
- Editor.h \
- Editor-common.c \
- Editor-skels.c \
- Editor-stubs.c
-
-$(IDL_GENERATED): $(IDLS)
- $(ORBIT_IDL) -I $(srcdir) -I $(datadir)/idl $(IDL_INCLUDES) \
- $(srcdir)/Composer.idl
-
-Editor-commmon.c: $(GTKHTML_DATADIR)/Editor.idl
-
-$(HTML_EDITOR_GENERATED): $(GTKHTML_DATADIR)/Editor.idl
- $(ORBIT_IDL) -I $(srcdir) $(IDL_INCLUDES) -I $(GTKHTML_DATADIR)/gtkhtml $(GTKHTML_DATADIR)/Editor.idl
-
-##
-
-error_DATA = mail-composer-errors.xml
-error_i18n = $(error_DATA:.xml=.xml.h)
-errordir = $(privdatadir)/errors
-%.xml.h: %.xml
- $(top_builddir)/e-util/e-error-tool $^
-
-idl_DATA = $(IDLS)
-
-glade_DATA = \
- e-msg-composer-attachment.glade
-
-noinst_LTLIBRARIES = libcomposer.la
-
-INCLUDES = \
- -I$(top_srcdir) \
- -I$(top_builddir) \
- -I$(top_srcdir)/widgets \
- -I$(top_builddir)/widgets \
- -I$(top_srcdir)/widgets/misc \
- -I$(top_builddir)/widgets/misc \
- -I$(top_srcdir)/camel \
- -I$(top_builddir)/camel \
- -I$(top_srcdir)/addressbook/backend \
- -I$(top_builddir)/addressbook/backend \
- -I$(top_builddir)/shell \
- -I$(top_srcdir)/shell \
- -DEVOLUTION_DATADIR=\"$(datadir)\" \
- -DEVOLUTION_IMAGESDIR=\"$(imagesdir)\" \
- -DEVOLUTION_UIDIR=\"$(evolutionuidir)\" \
- -DEVOLUTION_GLADEDIR=\"$(gladedir)\" \
- -DPREFIX=\"$(prefix)\" \
- -DG_LOG_DOMAIN=\"composer\" \
- $(EVOLUTION_MAIL_CFLAGS)
-
-libcomposer_la_SOURCES = \
- $(IDL_GENERATED) \
- $(HTML_EDITOR_GENERATED) \
- e-msg-composer-attachment-bar.c \
- e-msg-composer-attachment-bar.h \
- e-msg-composer-attachment.c \
- e-msg-composer-attachment.h \
- e-msg-composer-hdrs.c \
- e-msg-composer-hdrs.h \
- e-msg-composer-select-file.c \
- e-msg-composer-select-file.h \
- e-msg-composer.c \
- e-msg-composer.h \
- evolution-composer.c \
- evolution-composer.h \
- listener.c \
- listener.h
-
-EXTRA_DIST = \
- $(error_DATA) \
- $(error_i18n) \
- $(glade_DATA) \
- $(IDLS) \
- ChangeLog.pre-1-4
-
-BUILT_SOURCES = $(IDL_GENERATED) $(HTML_EDITOR_GENERATED) $(error_i18n)
-CLEANFILES = $(BUILT_SOURCES)
-
-dist-hook:
- cd $(distdir); rm -f $(BUILT_SOURCES)
diff --git a/composer/bad-icon.xpm b/composer/bad-icon.xpm
deleted file mode 100644
index 0a9cac23cd..0000000000
--- a/composer/bad-icon.xpm
+++ /dev/null
@@ -1,53 +0,0 @@
-/* XPM */
-static char * bad_icon_xpm[] = {
-"48 48 2 1",
-" g None",
-". g #000000",
-"................................................",
-". .",
-". .",
-". .",
-". .",
-". .",
-". .",
-". .",
-". .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". .. .",
-". .. .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". . . .",
-". .",
-". .",
-". .",
-". .",
-". .",
-". .",
-"................................................"};
diff --git a/composer/e-msg-composer-attachment-bar.c b/composer/e-msg-composer-attachment-bar.c
deleted file mode 100644
index 221deb9b37..0000000000
--- a/composer/e-msg-composer-attachment-bar.c
+++ /dev/null
@@ -1,847 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/*
- * Authors: Ettore Perazzoli <ettore@ximian.com>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 1999-2002 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <gtk/gtk.h>
-#include <glade/glade.h>
-#include <gconf/gconf.h>
-#include <gconf/gconf-client.h>
-#include <gdk/gdkkeysyms.h>
-#include <libgnomevfs/gnome-vfs-mime-handlers.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "e-msg-composer.h"
-#include "e-msg-composer-select-file.h"
-#include "e-msg-composer-attachment.h"
-#include "e-msg-composer-attachment-bar.h"
-
-#include <libedataserver/e-iconv.h>
-
-#include <camel/camel-data-wrapper.h>
-#include <camel/camel-stream-fs.h>
-#include <camel/camel-stream-null.h>
-#include <camel/camel-stream-mem.h>
-#include <camel/camel-stream-filter.h>
-#include <camel/camel-mime-filter-bestenc.h>
-#include <camel/camel-mime-part.h>
-
-#include "e-util/e-gui-utils.h"
-#include "e-util/e-icon-factory.h"
-#include "widgets/misc/e-error.h"
-#include "mail/em-popup.h"
-
-#define ICON_WIDTH 64
-#define ICON_SEPARATORS " /-_"
-#define ICON_SPACING 2
-#define ICON_ROW_SPACING ICON_SPACING
-#define ICON_COL_SPACING ICON_SPACING
-#define ICON_BORDER 2
-#define ICON_TEXT_SPACING 2
-
-
-static GnomeIconListClass *parent_class = NULL;
-
-struct _EMsgComposerAttachmentBarPrivate {
- GList *attachments;
- guint num_attachments;
-};
-
-
-enum {
- CHANGED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-
-static void update (EMsgComposerAttachmentBar *bar);
-
-
-static char *
-size_to_string (gulong size)
-{
- char *size_string;
-
- /* FIXME: The following should probably go into a separate module, as
- we might have to do the same thing in other places as well. Also,
- I am not sure this will be OK for all the languages. */
-
- if (size < 1e3L) {
- size_string = NULL;
- } else {
- gdouble displayed_size;
-
- if (size < 1e6L) {
- displayed_size = (gdouble) size / 1.0e3;
- size_string = g_strdup_printf (_("%.0fK"), displayed_size);
- } else if (size < 1e9L) {
- displayed_size = (gdouble) size / 1.0e6;
- size_string = g_strdup_printf (_("%.0fM"), displayed_size);
- } else {
- displayed_size = (gdouble) size / 1.0e9;
- size_string = g_strdup_printf (_("%.0fG"), displayed_size);
- }
- }
-
- return size_string;
-}
-
-/* Attachment handling functions. */
-
-static void
-free_attachment_list (EMsgComposerAttachmentBar *bar)
-{
- EMsgComposerAttachmentBarPrivate *priv;
- GList *p;
-
- priv = bar->priv;
-
- for (p = priv->attachments; p != NULL; p = p->next)
- g_object_unref (p->data);
-
- priv->attachments = NULL;
-}
-
-static void
-attachment_changed_cb (EMsgComposerAttachment *attachment,
- gpointer data)
-{
- update (E_MSG_COMPOSER_ATTACHMENT_BAR (data));
-}
-
-static void
-add_common (EMsgComposerAttachmentBar *bar,
- EMsgComposerAttachment *attachment)
-{
- g_return_if_fail (attachment != NULL);
-
- g_signal_connect (attachment, "changed",
- G_CALLBACK (attachment_changed_cb),
- bar);
-
- bar->priv->attachments = g_list_append (bar->priv->attachments,
- attachment);
- bar->priv->num_attachments++;
-
- update (bar);
-
- g_signal_emit (bar, signals[CHANGED], 0);
-}
-
-static void
-add_from_mime_part (EMsgComposerAttachmentBar *bar,
- CamelMimePart *part)
-{
- add_common (bar, e_msg_composer_attachment_new_from_mime_part (part));
-}
-
-static void
-add_from_file (EMsgComposerAttachmentBar *bar,
- const char *file_name,
- const char *disposition)
-{
- EMsgComposerAttachment *attachment;
- CamelException ex;
-
- camel_exception_init (&ex);
- attachment = e_msg_composer_attachment_new (file_name, disposition, &ex);
- if (attachment) {
- add_common (bar, attachment);
- } else {
- e_error_run((GtkWindow *)gtk_widget_get_toplevel((GtkWidget *)bar), "mail-composer:no-attach",
- file_name, camel_exception_get_description(&ex), NULL);
- camel_exception_clear (&ex);
- }
-}
-
-static void
-remove_attachment (EMsgComposerAttachmentBar *bar,
- EMsgComposerAttachment *attachment)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (bar));
- g_return_if_fail (g_list_find (bar->priv->attachments, attachment) != NULL);
-
- bar->priv->attachments = g_list_remove (bar->priv->attachments,
- attachment);
- bar->priv->num_attachments--;
- if (attachment->editor_gui != NULL) {
- GtkWidget *dialog = glade_xml_get_widget (attachment->editor_gui, "dialog");
- g_signal_emit_by_name (dialog, "response", GTK_RESPONSE_CLOSE);
- }
-
- g_object_unref(attachment);
-
- g_signal_emit (bar, signals[CHANGED], 0);
-}
-
-
-/* Icon list contents handling. */
-
-static void
-update (EMsgComposerAttachmentBar *bar)
-{
- EMsgComposerAttachmentBarPrivate *priv;
- GnomeIconList *icon_list;
- GList *p;
-
- priv = bar->priv;
- icon_list = GNOME_ICON_LIST (bar);
-
- gnome_icon_list_freeze (icon_list);
-
- gnome_icon_list_clear (icon_list);
-
- /* FIXME could be faster, but we don't care. */
- for (p = priv->attachments; p != NULL; p = p->next) {
- EMsgComposerAttachment *attachment;
- CamelContentType *content_type;
- char *size_string, *label;
- GdkPixbuf *pixbuf;
- const char *desc;
-
- attachment = p->data;
- content_type = camel_mime_part_get_content_type (attachment->body);
- /* Get the image out of the attachment
- and create a thumbnail for it */
- pixbuf = attachment->pixbuf_cache;
- if (pixbuf) {
- g_object_ref(pixbuf);
- } else if (camel_content_type_is(content_type, "image", "*")) {
- CamelDataWrapper *wrapper;
- CamelStreamMem *mstream;
- GdkPixbufLoader *loader;
- gboolean error = TRUE;
-
- wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (attachment->body));
- mstream = (CamelStreamMem *) camel_stream_mem_new ();
-
- camel_data_wrapper_decode_to_stream (wrapper, (CamelStream *) mstream);
-
- /* Stream image into pixbuf loader */
- loader = gdk_pixbuf_loader_new ();
- error = !gdk_pixbuf_loader_write (loader, mstream->buffer->data, mstream->buffer->len, NULL);
- gdk_pixbuf_loader_close (loader, NULL);
-
- if (!error) {
- int ratio, width, height;
-
- /* Shrink pixbuf */
- pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
- width = gdk_pixbuf_get_width (pixbuf);
- height = gdk_pixbuf_get_height (pixbuf);
- if (width >= height) {
- if (width > 48) {
- ratio = width / 48;
- width = 48;
- height = height / ratio;
- }
- } else {
- if (height > 48) {
- ratio = height / 48;
- height = 48;
- width = width / ratio;
- }
- }
-
- attachment->pixbuf_cache = gdk_pixbuf_scale_simple
- (pixbuf,
- width,
- height,
- GDK_INTERP_BILINEAR);
- pixbuf = attachment->pixbuf_cache;
- g_object_ref(pixbuf);
- } else {
- pixbuf = NULL;
- g_warning ("GdkPixbufLoader Error");
- }
-
- /* Destroy everything */
- g_object_unref (loader);
- camel_object_unref (mstream);
- }
-
- desc = camel_mime_part_get_description (attachment->body);
- if (!desc || *desc == '\0')
- desc = camel_mime_part_get_filename (attachment->body);
-
- if (!desc)
- desc = _("attachment");
-
- if (attachment->size
- && (size_string = size_to_string (attachment->size))) {
- label = g_strdup_printf ("%s (%s)", desc, size_string);
- g_free (size_string);
- } else
- label = g_strdup (desc);
-
- if (pixbuf == NULL) {
- char *mime_type;
-
- mime_type = camel_content_type_simple (content_type);
- pixbuf = e_icon_for_mime_type (mime_type, 48);
- if (pixbuf == NULL) {
- g_warning("cannot find icon for mime type %s (installation problem?)", mime_type);
- /* stock_attach would be better, but its fugly scaled up */
- pixbuf = e_icon_factory_get_icon("stock_unknown", E_ICON_SIZE_DIALOG);
- }
- g_free (mime_type);
- }
-
- if (pixbuf) {
- gnome_icon_list_append_pixbuf (icon_list, pixbuf, NULL, label);
- g_object_unref(pixbuf);
- }
-
- g_free (label);
- }
-
- gnome_icon_list_thaw (icon_list);
-}
-
-static void
-remove_selected (EMsgComposerAttachmentBar *bar)
-{
- GnomeIconList *icon_list;
- EMsgComposerAttachment *attachment;
- GList *attachment_list, *p;
- int num = 0, left, dlen;
-
- icon_list = GNOME_ICON_LIST (bar);
-
- /* Weee! I am especially proud of this piece of cheesy code: it is
- truly awful. But unless one attaches a huge number of files, it
- will not be as greedy as intended. FIXME of course. */
-
- attachment_list = NULL;
- p = gnome_icon_list_get_selection (icon_list);
- dlen = g_list_length (p);
- for ( ; p != NULL; p = p->next) {
- num = GPOINTER_TO_INT (p->data);
- attachment = E_MSG_COMPOSER_ATTACHMENT (g_list_nth_data (bar->priv->attachments, num));
-
- /* We need to check if there are duplicated index in the return list of
- gnome_icon_list_get_selection() because of gnome bugzilla bug #122356.
- FIXME in the future. */
-
- if (g_list_find (attachment_list, attachment) == NULL) {
- attachment_list = g_list_prepend (attachment_list, attachment);
- }
- }
-
- for (p = attachment_list; p != NULL; p = p->next)
- remove_attachment (bar, E_MSG_COMPOSER_ATTACHMENT (p->data));
-
- g_list_free (attachment_list);
-
- update (bar);
-
- left = gnome_icon_list_get_num_icons (icon_list);
- num = num - dlen + 1;
- if (left > 0)
- gnome_icon_list_focus_icon (icon_list, left > num ? num : left - 1);
-}
-
-static void
-edit_selected (EMsgComposerAttachmentBar *bar)
-{
- GnomeIconList *icon_list;
- GList *selection, *attach;
- int num;
-
- icon_list = GNOME_ICON_LIST (bar);
-
- selection = gnome_icon_list_get_selection (icon_list);
- if (selection) {
- num = GPOINTER_TO_INT (selection->data);
- attach = g_list_nth (bar->priv->attachments, num);
- if (attach)
- e_msg_composer_attachment_edit ((EMsgComposerAttachment *)attach->data, GTK_WIDGET (bar));
- }
-}
-
-/* "Attach" dialog. */
-
-static void
-add_from_user (EMsgComposerAttachmentBar *bar)
-{
- EMsgComposer *composer;
- GPtrArray *file_list;
- gboolean is_inline = FALSE;
- int i;
-
- composer = E_MSG_COMPOSER (gtk_widget_get_toplevel (GTK_WIDGET (bar)));
-
- file_list = e_msg_composer_select_file_attachments (composer, &is_inline);
- if (!file_list)
- return;
-
- for (i = 0; i < file_list->len; i++) {
- add_from_file (bar, file_list->pdata[i], is_inline ? "inline" : "attachment");
- g_free (file_list->pdata[i]);
- }
-
- g_ptr_array_free (file_list, TRUE);
-}
-
-
-/* Callbacks. */
-
-static void
-emcab_add(EPopup *ep, EPopupItem *item, void *data)
-{
- EMsgComposerAttachmentBar *bar = data;
-
- add_from_user(bar);
-}
-
-static void
-emcab_properties(EPopup *ep, EPopupItem *item, void *data)
-{
- EMsgComposerAttachmentBar *bar = data;
-
- edit_selected(bar);
-}
-
-static void
-emcab_remove(EPopup *ep, EPopupItem *item, void *data)
-{
- EMsgComposerAttachmentBar *bar = data;
-
- remove_selected(bar);
-}
-
-/* Popup menu handling. */
-static EPopupItem emcab_popups[] = {
- { E_POPUP_ITEM, "10.attach", N_("_Remove"), emcab_remove, NULL, GTK_STOCK_REMOVE, EM_POPUP_ATTACHMENTS_MANY },
- { E_POPUP_ITEM, "20.attach", N_("_Properties"), emcab_properties, NULL, GTK_STOCK_PROPERTIES, EM_POPUP_ATTACHMENTS_ONE },
- { E_POPUP_BAR, "30.attach.00", NULL, NULL, NULL, NULL, EM_POPUP_ATTACHMENTS_MANY|EM_POPUP_ATTACHMENTS_ONE },
- { E_POPUP_ITEM, "30.attach.01", N_("_Add attachment..."), emcab_add, NULL, GTK_STOCK_ADD, 0 },
-};
-
-static void
-emcab_popup_position(GtkMenu *menu, int *x, int *y, gboolean *push_in, gpointer user_data)
-{
- EMsgComposerAttachmentBar *bar = user_data;
- GnomeIconList *icon_list = user_data;
- GList *selection;
- GnomeCanvasPixbuf *image;
-
- gdk_window_get_origin (((GtkWidget*) bar)->window, x, y);
-
- selection = gnome_icon_list_get_selection (icon_list);
- if (selection == NULL)
- return;
-
- image = gnome_icon_list_get_icon_pixbuf_item (icon_list, (gint)selection->data);
- if (image == NULL)
- return;
-
- /* Put menu to the center of icon. */
- *x += (int)(image->item.x1 + image->item.x2) / 2;
- *y += (int)(image->item.y1 + image->item.y2) / 2;
-}
-
-static void
-emcab_popups_free(EPopup *ep, GSList *l, void *data)
-{
- g_slist_free(l);
-}
-
-/* if id != -1, then use it as an index for target of the popup */
-static void
-emcab_popup(EMsgComposerAttachmentBar *bar, GdkEventButton *event, int id)
-{
- GList *p;
- GSList *attachments = NULL, *menus = NULL;
- int i;
- EMPopup *emp;
- EMPopupTargetAttachments *t;
- GtkMenu *menu;
- EMsgComposerAttachment *attachment;
-
- /* We need to check if there are duplicated index in the return list of
- gnome_icon_list_get_selection() because of gnome bugzilla bug #122356.
- FIXME in the future. */
-
- if (id == -1
- || (attachment = g_list_nth_data(bar->priv->attachments, id)) == NULL) {
- p = gnome_icon_list_get_selection((GnomeIconList *)bar);
- for ( ; p != NULL; p = p->next) {
- int num = GPOINTER_TO_INT(p->data);
- EMsgComposerAttachment *attachment = g_list_nth_data(bar->priv->attachments, num);
-
- if (attachment && g_slist_find(attachments, attachment) == NULL) {
- g_object_ref(attachment);
- attachments = g_slist_prepend(attachments, attachment);
- }
- }
- attachments = g_slist_reverse(attachments);
- } else {
- g_object_ref(attachment);
- attachments = g_slist_prepend(attachments, attachment);
- }
-
- for (i=0;i<sizeof(emcab_popups)/sizeof(emcab_popups[0]);i++)
- menus = g_slist_prepend(menus, &emcab_popups[i]);
-
- /** @HookPoint-EMPopup: Composer Attachment Bar Context Menu
- * @Id: org.gnome.evolution.mail.composer.attachmentbar.popup
- * @Class: org.gnome.evolution.mail.popup:1.0
- * @Target: EMPopupTargetAttachments
- *
- * This is the context menu on the composer attachment bar.
- */
- emp = em_popup_new("org.gnome.evolution.mail.composer.attachmentbar.popup");
- e_popup_add_items((EPopup *)emp, menus, NULL,emcab_popups_free, bar);
- t = em_popup_target_new_attachments(emp, attachments);
- t->target.widget = (GtkWidget *)bar;
- menu = e_popup_create_menu_once((EPopup *)emp, (EPopupTarget *)t, 0);
-
- if (event == NULL)
- gtk_menu_popup(menu, NULL, NULL, emcab_popup_position, bar, 0, gtk_get_current_event_time());
- else
- gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event->button, event->time);
-}
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- EMsgComposerAttachmentBar *bar;
-
- bar = E_MSG_COMPOSER_ATTACHMENT_BAR (object);
-
- if (bar->priv) {
- free_attachment_list (bar);
- g_free (bar->priv);
- bar->priv = NULL;
- }
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy != NULL)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-/* GtkWidget methods. */
-
-static gboolean
-popup_menu_event (GtkWidget *widget)
-{
- emcab_popup((EMsgComposerAttachmentBar *)widget, NULL, -1);
- return TRUE;
-}
-
-
-static int
-button_press_event (GtkWidget *widget, GdkEventButton *event)
-{
- EMsgComposerAttachmentBar *bar = (EMsgComposerAttachmentBar *)widget;
- GnomeIconList *icon_list = GNOME_ICON_LIST(widget);
- int icon_number;
-
- if (event->button != 3)
- return GTK_WIDGET_CLASS (parent_class)->button_press_event (widget, event);
-
- icon_number = gnome_icon_list_get_icon_at (icon_list, event->x, event->y);
- if (icon_number >= 0) {
- gnome_icon_list_unselect_all(icon_list);
- gnome_icon_list_select_icon (icon_list, icon_number);
- }
-
- emcab_popup(bar, event, icon_number);
-
- return TRUE;
-}
-
-static gint
-key_press_event(GtkWidget *widget, GdkEventKey *event)
-{
- EMsgComposerAttachmentBar *bar = E_MSG_COMPOSER_ATTACHMENT_BAR(widget);
-
- if (event->keyval == GDK_Delete) {
- remove_selected (bar);
- return TRUE;
- }
-
- return GTK_WIDGET_CLASS (parent_class)->key_press_event (widget, event);
-}
-
-
-/* Initialization. */
-
-static void
-class_init (EMsgComposerAttachmentBarClass *klass)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- GnomeIconListClass *icon_list_class;
-
- object_class = GTK_OBJECT_CLASS (klass);
- widget_class = GTK_WIDGET_CLASS (klass);
- icon_list_class = GNOME_ICON_LIST_CLASS (klass);
-
- parent_class = g_type_class_ref (gnome_icon_list_get_type ());
-
- object_class->destroy = destroy;
-
- widget_class->button_press_event = button_press_event;
- widget_class->popup_menu = popup_menu_event;
- widget_class->key_press_event = key_press_event;
-
-
- /* Setup signals. */
-
- signals[CHANGED] =
- g_signal_new ("changed",
- E_TYPE_MSG_COMPOSER_ATTACHMENT_BAR,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EMsgComposerAttachmentBarClass, changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-}
-
-static void
-init (EMsgComposerAttachmentBar *bar)
-{
- EMsgComposerAttachmentBarPrivate *priv;
-
- priv = g_new (EMsgComposerAttachmentBarPrivate, 1);
-
- priv->attachments = NULL;
- priv->num_attachments = 0;
-
- bar->priv = priv;
-}
-
-
-GType
-e_msg_composer_attachment_bar_get_type (void)
-{
- static GType type = 0;
-
- if (type == 0) {
- static const GTypeInfo info = {
- sizeof (EMsgComposerAttachmentBarClass),
- NULL, NULL,
- (GClassInitFunc) class_init,
- NULL, NULL,
- sizeof (EMsgComposerAttachmentBar),
- 0,
- (GInstanceInitFunc) init,
- };
-
- type = g_type_register_static (GNOME_TYPE_ICON_LIST, "EMsgComposerAttachmentBar", &info, 0);
- }
-
- return type;
-}
-
-GtkWidget *
-e_msg_composer_attachment_bar_new (GtkAdjustment *adj)
-{
- EMsgComposerAttachmentBar *new;
- GnomeIconList *icon_list;
- int width, height, icon_width, window_height;
- PangoFontMetrics *metrics;
- PangoContext *context;
-
- new = g_object_new (e_msg_composer_attachment_bar_get_type (), NULL);
-
- icon_list = GNOME_ICON_LIST (new);
-
- context = gtk_widget_get_pango_context ((GtkWidget *) new);
- metrics = pango_context_get_metrics (context, ((GtkWidget *) new)->style->font_desc, pango_context_get_language (context));
- width = PANGO_PIXELS (pango_font_metrics_get_approximate_char_width (metrics)) * 15;
- /* This should be *2, but the icon list creates too much space above ... */
- height = PANGO_PIXELS (pango_font_metrics_get_ascent (metrics) + pango_font_metrics_get_descent (metrics)) * 3;
- pango_font_metrics_unref (metrics);
-
- icon_width = ICON_WIDTH + ICON_SPACING + ICON_BORDER + ICON_TEXT_SPACING;
- icon_width = MAX (icon_width, width);
-
- gnome_icon_list_construct (icon_list, icon_width, adj, 0);
-
- window_height = ICON_WIDTH + ICON_SPACING + ICON_BORDER + ICON_TEXT_SPACING + height;
- gtk_widget_set_size_request (GTK_WIDGET (new), icon_width * 4, window_height);
-
- gnome_icon_list_set_separators (icon_list, ICON_SEPARATORS);
- gnome_icon_list_set_row_spacing (icon_list, ICON_ROW_SPACING);
- gnome_icon_list_set_col_spacing (icon_list, ICON_COL_SPACING);
- gnome_icon_list_set_icon_border (icon_list, ICON_BORDER);
- gnome_icon_list_set_text_spacing (icon_list, ICON_TEXT_SPACING);
- gnome_icon_list_set_selection_mode (icon_list, GTK_SELECTION_MULTIPLE);
-
- return GTK_WIDGET (new);
-}
-
-static char *
-get_default_charset (void)
-{
- GConfClient *gconf;
- const char *locale;
- char *charset;
-
- gconf = gconf_client_get_default ();
- charset = gconf_client_get_string (gconf, "/apps/evolution/mail/composer/charset", NULL);
-
- if (!charset || charset[0] == '\0') {
- g_free (charset);
- charset = gconf_client_get_string (gconf, "/apps/evolution/mail/format/charset", NULL);
- if (charset && charset[0] == '\0') {
- g_free (charset);
- charset = NULL;
- }
- }
-
- g_object_unref (gconf);
-
- if (!charset && (locale = e_iconv_locale_charset ()))
- charset = g_strdup (locale);
-
- return charset ? charset : g_strdup ("us-ascii");
-}
-
-static void
-attach_to_multipart (CamelMultipart *multipart,
- EMsgComposerAttachment *attachment,
- const char *default_charset)
-{
- CamelContentType *content_type;
- CamelDataWrapper *content;
-
- content_type = camel_mime_part_get_content_type (attachment->body);
- content = camel_medium_get_content_object (CAMEL_MEDIUM (attachment->body));
-
- if (!CAMEL_IS_MULTIPART (content)) {
- if (camel_content_type_is (content_type, "text", "*")) {
- CamelTransferEncoding encoding;
- CamelStreamFilter *filter_stream;
- CamelMimeFilterBestenc *bestenc;
- CamelStream *stream;
- const char *charset;
- char *buf = NULL;
- char *type;
-
- charset = camel_content_type_param (content_type, "charset");
-
- stream = camel_stream_null_new ();
- filter_stream = camel_stream_filter_new_with_stream (stream);
- bestenc = camel_mime_filter_bestenc_new (CAMEL_BESTENC_GET_ENCODING);
- camel_stream_filter_add (filter_stream, CAMEL_MIME_FILTER (bestenc));
- camel_object_unref (stream);
-
- camel_data_wrapper_decode_to_stream (content, CAMEL_STREAM (filter_stream));
- camel_object_unref (filter_stream);
-
- encoding = camel_mime_filter_bestenc_get_best_encoding (bestenc, CAMEL_BESTENC_8BIT);
- camel_mime_part_set_encoding (attachment->body, encoding);
-
- if (encoding == CAMEL_TRANSFER_ENCODING_7BIT) {
- /* the text fits within us-ascii so this is safe */
- /* FIXME: check that this isn't iso-2022-jp? */
- default_charset = "us-ascii";
- } else if (!charset) {
- if (!default_charset)
- default_charset = buf = get_default_charset ();
-
- /* FIXME: We should really check that this fits within the
- default_charset and if not find one that does and/or
- allow the user to specify? */
- }
-
- if (!charset) {
- /* looks kinda nasty, but this is how ya have to do it */
- camel_content_type_set_param (content_type, "charset", default_charset);
- type = camel_content_type_format (content_type);
- camel_mime_part_set_content_type (attachment->body, type);
- g_free (type);
- g_free (buf);
- }
-
- camel_object_unref (bestenc);
- } else if (!CAMEL_IS_MIME_MESSAGE (content)) {
- camel_mime_part_set_encoding (attachment->body, CAMEL_TRANSFER_ENCODING_BASE64);
- }
- }
-
- camel_multipart_add_part (multipart, attachment->body);
-}
-
-void
-e_msg_composer_attachment_bar_to_multipart (EMsgComposerAttachmentBar *bar,
- CamelMultipart *multipart,
- const char *default_charset)
-{
- EMsgComposerAttachmentBarPrivate *priv;
- GList *p;
-
- g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (bar));
- g_return_if_fail (CAMEL_IS_MULTIPART (multipart));
-
- priv = bar->priv;
-
- for (p = priv->attachments; p != NULL; p = p->next) {
- EMsgComposerAttachment *attachment;
-
- attachment = E_MSG_COMPOSER_ATTACHMENT (p->data);
- attach_to_multipart (multipart, attachment, default_charset);
- }
-}
-
-
-guint
-e_msg_composer_attachment_bar_get_num_attachments (EMsgComposerAttachmentBar *bar)
-{
- g_return_val_if_fail (bar != NULL, 0);
- g_return_val_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (bar), 0);
-
- return bar->priv->num_attachments;
-}
-
-
-void
-e_msg_composer_attachment_bar_attach (EMsgComposerAttachmentBar *bar,
- const gchar *file_name)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (bar));
-
- if (file_name == NULL)
- add_from_user (bar);
- else
- add_from_file (bar, file_name, "attachment");
-}
-
-void
-e_msg_composer_attachment_bar_attach_mime_part (EMsgComposerAttachmentBar *bar,
- CamelMimePart *part)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (bar));
-
- add_from_mime_part (bar, part);
-}
diff --git a/composer/e-msg-composer-attachment-bar.h b/composer/e-msg-composer-attachment-bar.h
deleted file mode 100644
index a43b466633..0000000000
--- a/composer/e-msg-composer-attachment-bar.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* msg-composer-attachment-bar.h
- *
- * Copyright (C) 1999 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * published by the Free Software Foundation; either version 2 of the
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef __E_MSG_COMPOSER_ATTACHMENT_BAR_H__
-#define __E_MSG_COMPOSER_ATTACHMENT_BAR_H__
-
-#include <libgnomeui/gnome-icon-list.h>
-
-#include <camel/camel-multipart.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_MSG_COMPOSER_ATTACHMENT_BAR \
- (e_msg_composer_attachment_bar_get_type ())
-#define E_MSG_COMPOSER_ATTACHMENT_BAR(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT_BAR, EMsgComposerAttachmentBar))
-#define E_MSG_COMPOSER_ATTACHMENT_BAR_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MSG_COMPOSER_ATTACHMENT_BAR, EMsgComposerAttachmentBarClass))
-#define E_IS_MSG_COMPOSER_ATTACHMENT_BAR(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT_BAR))
-#define E_IS_MSG_COMPOSER_ATTACHMENT_BAR_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT_BAR))
-
-typedef struct _EMsgComposerAttachmentBar EMsgComposerAttachmentBar;
-typedef struct _EMsgComposerAttachmentBarClass EMsgComposerAttachmentBarClass;
-typedef struct _EMsgComposerAttachmentBarPrivate EMsgComposerAttachmentBarPrivate;
-
-struct _EMsgComposerAttachmentBar {
- GnomeIconList parent;
-
- EMsgComposerAttachmentBarPrivate *priv;
-};
-
-struct _EMsgComposerAttachmentBarClass {
- GnomeIconListClass parent_class;
-
- void (* changed) (EMsgComposerAttachmentBar *bar);
-};
-
-
-GtkType e_msg_composer_attachment_bar_get_type (void);
-
-GtkWidget *e_msg_composer_attachment_bar_new (GtkAdjustment *adj);
-void e_msg_composer_attachment_bar_to_multipart (EMsgComposerAttachmentBar *bar, CamelMultipart *multipart,
- const char *default_charset);
-guint e_msg_composer_attachment_bar_get_num_attachments (EMsgComposerAttachmentBar *bar);
-void e_msg_composer_attachment_bar_attach (EMsgComposerAttachmentBar *bar, const char *file_name);
-void e_msg_composer_attachment_bar_attach_mime_part (EMsgComposerAttachmentBar *bar, CamelMimePart *part);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_MSG_COMPOSER_ATTACHMENT_BAR_H__ */
diff --git a/composer/e-msg-composer-attachment.c b/composer/e-msg-composer-attachment.c
deleted file mode 100644
index f4f173cee2..0000000000
--- a/composer/e-msg-composer-attachment.c
+++ /dev/null
@@ -1,463 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/*
- * Authors: Ettore Perazzoli <ettore@ximian.com>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 1999-2002 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-/* This is the object representing an email attachment. It is implemented as a
- GObject to make it easier for the application to handle it. For example,
- the "changed" signal is emitted whenever something changes in the
- attachment. Also, this contains the code to let users edit the
- attachment manually. */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <sys/stat.h>
-#include <string.h>
-#include <errno.h>
-
-#include <camel/camel.h>
-#include <gtk/gtknotebook.h>
-#include <gtk/gtktogglebutton.h>
-#include <gtk/gtkdialog.h>
-#include <libgnomevfs/gnome-vfs-mime.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "e-util/e-mktemp.h"
-
-#include "e-msg-composer.h"
-#include "e-msg-composer-attachment.h"
-
-
-enum {
- CHANGED,
- LAST_SIGNAL
-};
-static guint signals[LAST_SIGNAL] = { 0 };
-
-static GObjectClass *parent_class = NULL;
-
-
-static void
-changed (EMsgComposerAttachment *attachment)
-{
- g_signal_emit (attachment, signals[CHANGED], 0);
-}
-
-
-/* GtkObject methods. */
-
-static void
-finalise(GObject *object)
-{
- EMsgComposerAttachment *attachment;
-
- attachment = E_MSG_COMPOSER_ATTACHMENT (object);
-
- camel_object_unref (attachment->body);
- if (attachment->pixbuf_cache != NULL)
- g_object_unref (attachment->pixbuf_cache);
-
- G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-
-/* Signals. */
-
-static void
-real_changed (EMsgComposerAttachment *msg_composer_attachment)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT (msg_composer_attachment));
-}
-
-
-static void
-class_init (EMsgComposerAttachmentClass *klass)
-{
- GObjectClass *object_class;
-
- object_class = (GObjectClass*) klass;
- parent_class = g_type_class_ref (G_TYPE_OBJECT);
-
- object_class->finalize = finalise;
- klass->changed = real_changed;
-
- signals[CHANGED] = g_signal_new ("changed",
- E_TYPE_MSG_COMPOSER_ATTACHMENT,
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EMsgComposerAttachmentClass, changed),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-}
-
-static void
-init (EMsgComposerAttachment *msg_composer_attachment)
-{
- msg_composer_attachment->editor_gui = NULL;
- msg_composer_attachment->body = NULL;
- msg_composer_attachment->size = 0;
- msg_composer_attachment->pixbuf_cache = NULL;
-}
-
-GType
-e_msg_composer_attachment_get_type (void)
-{
- static GType type = 0;
-
- if (type == 0) {
- static const GTypeInfo info = {
- sizeof (EMsgComposerAttachmentClass),
- NULL,
- NULL,
- (GClassInitFunc) class_init,
- NULL,
- NULL,
- sizeof (EMsgComposerAttachment),
- 0,
- (GInstanceInitFunc) init,
- };
-
- type = g_type_register_static (G_TYPE_OBJECT, "EMsgComposerAttachment", &info, 0);
- }
-
- return type;
-}
-
-
-/**
- * e_msg_composer_attachment_new:
- * @file_name: filename to attach
- * @disposition: Content-Disposition of the attachment
- * @ex: exception
- *
- * Return value: the new attachment, or %NULL on error
- **/
-EMsgComposerAttachment *
-e_msg_composer_attachment_new (const char *file_name,
- const char *disposition,
- CamelException *ex)
-{
- EMsgComposerAttachment *new;
- CamelMimePart *part;
- CamelDataWrapper *wrapper;
- CamelStream *stream;
- struct stat statbuf;
- char *mime_type;
- char *filename;
-
- g_return_val_if_fail (file_name != NULL, NULL);
-
- if (stat (file_name, &statbuf) < 0) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Cannot attach file %s: %s"),
- file_name, g_strerror (errno));
- return NULL;
- }
-
- /* return if it's not a regular file */
- if (!S_ISREG (statbuf.st_mode)) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Cannot attach file %s: not a regular file"),
- file_name);
- return NULL;
- }
-
- stream = camel_stream_fs_new_with_name (file_name, O_RDONLY, 0);
- if (!stream) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Cannot attach file %s: %s"),
- file_name, g_strerror (errno));
- return NULL;
- }
-
- mime_type = e_msg_composer_guess_mime_type (file_name);
- if (mime_type) {
- if (!g_ascii_strcasecmp (mime_type, "message/rfc822")) {
- wrapper = (CamelDataWrapper *) camel_mime_message_new ();
- } else {
- wrapper = camel_data_wrapper_new ();
- }
-
- camel_data_wrapper_construct_from_stream (wrapper, stream);
- camel_data_wrapper_set_mime_type (wrapper, mime_type);
- g_free (mime_type);
- } else {
- wrapper = camel_data_wrapper_new ();
- camel_data_wrapper_construct_from_stream (wrapper, stream);
- camel_data_wrapper_set_mime_type (wrapper, "application/octet-stream");
- }
-
- camel_object_unref (stream);
-
- part = camel_mime_part_new ();
- camel_medium_set_content_object (CAMEL_MEDIUM (part), wrapper);
- camel_object_unref (wrapper);
-
- camel_mime_part_set_disposition (part, disposition);
- filename = g_path_get_basename (file_name);
- camel_mime_part_set_filename (part, filename);
- g_free (filename);
-
-#if 0
- /* Note: Outlook 2002 is broken with respect to Content-Ids on
- non-multipart/related parts, so as an interoperability
- workaround, don't set a Content-Id on these parts. Fixes
- bug #10032 */
- /* set the Content-Id */
- content_id = camel_header_msgid_generate ();
- camel_mime_part_set_content_id (part, content_id);
- g_free (content_id);
-#endif
-
- new = g_object_new (E_TYPE_MSG_COMPOSER_ATTACHMENT, NULL);
- new->editor_gui = NULL;
- new->body = part;
- new->size = statbuf.st_size;
- new->guessed_type = TRUE;
-
- return new;
-}
-
-
-/**
- * e_msg_composer_attachment_new_from_mime_part:
- * @part: a CamelMimePart
- *
- * Return value: a new EMsgComposerAttachment based on the mime part
- **/
-EMsgComposerAttachment *
-e_msg_composer_attachment_new_from_mime_part (CamelMimePart *part)
-{
- EMsgComposerAttachment *new;
- CamelMimePart *mime_part;
- CamelStream *stream;
-
- g_return_val_if_fail (CAMEL_IS_MIME_PART (part), NULL);
-
- stream = camel_stream_mem_new ();
- if (camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (part), stream) == -1) {
- camel_object_unref (stream);
- return NULL;
- }
-
- camel_stream_reset (stream);
- mime_part = camel_mime_part_new ();
-
- if (camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (mime_part), stream) == -1) {
- camel_object_unref (mime_part);
- camel_object_unref (stream);
- return NULL;
- }
-
- camel_object_unref (stream);
-
- new = g_object_new (E_TYPE_MSG_COMPOSER_ATTACHMENT, NULL);
- new->editor_gui = NULL;
- new->body = mime_part;
- new->guessed_type = FALSE;
- new->size = 0;
-
- return new;
-}
-
-
-/* The attachment property dialog. */
-
-typedef struct {
- GtkWidget *dialog;
- GtkEntry *file_name_entry;
- GtkEntry *description_entry;
- GtkEntry *mime_type_entry;
- GtkToggleButton *disposition_checkbox;
- EMsgComposerAttachment *attachment;
-} DialogData;
-
-static void
-destroy_dialog_data (DialogData *data)
-{
- g_free (data);
-}
-
-/*
- * fixme: I am converting EVERYTHING to/from UTF-8, although mime types
- * are in ASCII. This is not strictly necessary, but we want to be
- * consistent and possibly check for errors somewhere.
- */
-
-static void
-set_entry (GladeXML *xml, const char *widget_name, const char *value)
-{
- GtkEntry *entry;
-
- entry = GTK_ENTRY (glade_xml_get_widget (xml, widget_name));
- if (entry == NULL)
- g_warning ("Entry for `%s' not found.", widget_name);
- else
- gtk_entry_set_text (entry, value ? value : "");
-}
-
-static void
-connect_widget (GladeXML *gui, const char *name, const char *signal_name,
- GCallback func, gpointer data)
-{
- GtkWidget *widget;
-
- widget = glade_xml_get_widget (gui, name);
- g_signal_connect (widget, signal_name, func, data);
-}
-
-static void
-close_cb (GtkWidget *widget, gpointer data)
-{
- EMsgComposerAttachment *attachment;
- DialogData *dialog_data;
-
- dialog_data = (DialogData *) data;
- attachment = dialog_data->attachment;
-
- gtk_widget_destroy (dialog_data->dialog);
- g_object_unref (attachment->editor_gui);
- attachment->editor_gui = NULL;
-
- g_object_unref (attachment);
-
- destroy_dialog_data (dialog_data);
-}
-
-static void
-ok_cb (GtkWidget *widget, gpointer data)
-{
- DialogData *dialog_data;
- EMsgComposerAttachment *attachment;
- const char *str;
-
- dialog_data = (DialogData *) data;
- attachment = dialog_data->attachment;
-
- str = gtk_entry_get_text (dialog_data->file_name_entry);
- camel_mime_part_set_filename (attachment->body, str);
-
- str = gtk_entry_get_text (dialog_data->description_entry);
- camel_mime_part_set_description (attachment->body, str);
-
- str = gtk_entry_get_text (dialog_data->mime_type_entry);
- camel_mime_part_set_content_type (attachment->body, str);
-
- camel_data_wrapper_set_mime_type(camel_medium_get_content_object(CAMEL_MEDIUM (attachment->body)), str);
-
- switch (gtk_toggle_button_get_active (dialog_data->disposition_checkbox)) {
- case 0:
- camel_mime_part_set_disposition (attachment->body, "attachment");
- break;
- case 1:
- camel_mime_part_set_disposition (attachment->body, "inline");
- break;
- default:
- /* Hmmmm? */
- break;
- }
-
- changed (attachment);
- close_cb (widget, data);
-}
-
-static void
-response_cb (GtkWidget *widget, gint response, gpointer data)
-{
- if (response == GTK_RESPONSE_OK)
- ok_cb (widget, data);
- else
- close_cb (widget, data);
-}
-
-void
-e_msg_composer_attachment_edit (EMsgComposerAttachment *attachment, GtkWidget *parent)
-{
- CamelContentType *content_type;
- const char *disposition;
- DialogData *dialog_data;
- GladeXML *editor_gui;
- char *type;
-
- g_return_if_fail (attachment != NULL);
- g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT (attachment));
-
- if (attachment->editor_gui != NULL) {
- GtkWidget *window;
-
- window = glade_xml_get_widget (attachment->editor_gui,
- "dialog");
- gdk_window_show (window->window);
- return;
- }
-
- editor_gui = glade_xml_new (EVOLUTION_GLADEDIR "/e-msg-composer-attachment.glade",
- NULL, NULL);
- if (editor_gui == NULL) {
- g_warning ("Cannot load `e-msg-composer-attachment.glade'");
- return;
- }
-
- attachment->editor_gui = editor_gui;
-
- gtk_window_set_transient_for
- (GTK_WINDOW (glade_xml_get_widget (editor_gui, "dialog")),
- GTK_WINDOW (gtk_widget_get_toplevel (parent)));
-
- dialog_data = g_new (DialogData, 1);
- g_object_ref (attachment);
- dialog_data->attachment = attachment;
- dialog_data->dialog = glade_xml_get_widget (editor_gui, "dialog");
- dialog_data->file_name_entry = GTK_ENTRY (
- glade_xml_get_widget (editor_gui, "file_name_entry"));
- dialog_data->description_entry = GTK_ENTRY (
- glade_xml_get_widget (editor_gui, "description_entry"));
- dialog_data->mime_type_entry = GTK_ENTRY (
- glade_xml_get_widget (editor_gui, "mime_type_entry"));
- dialog_data->disposition_checkbox = GTK_TOGGLE_BUTTON (
- glade_xml_get_widget (editor_gui, "disposition_checkbox"));
-
- set_entry (editor_gui, "file_name_entry",
- camel_mime_part_get_filename (attachment->body));
- set_entry (editor_gui, "description_entry",
- camel_mime_part_get_description (attachment->body));
- content_type = camel_mime_part_get_content_type (attachment->body);
- type = camel_content_type_simple (content_type);
- set_entry (editor_gui, "mime_type_entry", type);
- g_free (type);
-
- disposition = camel_mime_part_get_disposition (attachment->body);
- gtk_toggle_button_set_active (dialog_data->disposition_checkbox,
- disposition && !g_ascii_strcasecmp (disposition, "inline"));
-
- connect_widget (editor_gui, "dialog", "response", (GCallback)response_cb, dialog_data);
-#warning "signal connect while alive"
- /* make sure that when the composer gets hidden/closed that our windows also close */
- parent = gtk_widget_get_toplevel (parent);
- gtk_signal_connect_while_alive (GTK_OBJECT (parent), "destroy", (GCallback)close_cb, dialog_data,
- GTK_OBJECT (dialog_data->dialog));
- gtk_signal_connect_while_alive (GTK_OBJECT (parent), "hide", (GCallback)close_cb, dialog_data,
- GTK_OBJECT (dialog_data->dialog));
-}
diff --git a/composer/e-msg-composer-attachment.glade b/composer/e-msg-composer-attachment.glade
deleted file mode 100644
index dc228eef70..0000000000
--- a/composer/e-msg-composer-attachment.glade
+++ /dev/null
@@ -1,237 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkDialog" id="dialog">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="title" translatable="yes">Attachment Properties</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="has_separator">True</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="close_button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="has_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">-6</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="ok_button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">-5</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table1">
- <property name="visible">True</property>
- <property name="n_rows">4</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkEntry" id="description_entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="mime_type_entry">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can_focus">True</property>
- <property name="editable">False</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="mime_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">MIME type:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="description_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Description:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="filename_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">File name:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="file_name_entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="disposition_checkbox">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Suggest automatic display of attachment</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/composer/e-msg-composer-attachment.h b/composer/e-msg-composer-attachment.h
deleted file mode 100644
index caef6ebc58..0000000000
--- a/composer/e-msg-composer-attachment.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-msg-composer-attachment.h
- *
- * Copyright (C) 1999 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * published by the Free Software Foundation; either version 2 of the
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli
- */
-#ifndef __E_MSG_COMPOSER_ATTACHMENT_H__
-#define __E_MSG_COMPOSER_ATTACHMENT_H__
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <glade/glade-xml.h>
-#include <camel/camel-mime-part.h>
-#include <camel/camel-exception.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_MSG_COMPOSER_ATTACHMENT (e_msg_composer_attachment_get_type ())
-#define E_MSG_COMPOSER_ATTACHMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT, EMsgComposerAttachment))
-#define E_MSG_COMPOSER_ATTACHMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MSG_COMPOSER_ATTACHMENT, EMsgComposerAttachmentClass))
-#define E_IS_MSG_COMPOSER_ATTACHMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT))
-#define E_IS_MSG_COMPOSER_ATTACHMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT))
-
-
-typedef struct _EMsgComposerAttachment EMsgComposerAttachment;
-typedef struct _EMsgComposerAttachmentClass EMsgComposerAttachmentClass;
-
-struct _EMsgComposerAttachment {
- GObject parent;
-
- GladeXML *editor_gui;
-
- CamelMimePart *body;
- gboolean guessed_type;
- gulong size;
-
- GdkPixbuf *pixbuf_cache;
-};
-
-struct _EMsgComposerAttachmentClass {
- GObjectClass parent_class;
-
- void (*changed) (EMsgComposerAttachment *msg_composer_attachment);
-};
-
-
-GType e_msg_composer_attachment_get_type (void);
-EMsgComposerAttachment *e_msg_composer_attachment_new (const char *file_name,
- const char *disposition,
- CamelException *ex);
-EMsgComposerAttachment *e_msg_composer_attachment_new_from_mime_part (CamelMimePart *part);
-void e_msg_composer_attachment_edit (EMsgComposerAttachment *attachment,
- GtkWidget *parent);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_MSG_COMPOSER_ATTACHMENT_H__ */
diff --git a/composer/e-msg-composer-hdrs.c b/composer/e-msg-composer-hdrs.c
deleted file mode 100644
index f8ad7c6717..0000000000
--- a/composer/e-msg-composer-hdrs.c
+++ /dev/null
@@ -1,1626 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* msg-composer-hdrs.c
- *
- * Copyright (C) 1999 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * published by the Free Software Foundation; either version 2 of the
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-
-#include <bonobo/bonobo-control.h>
-#include <bonobo/bonobo-widget.h>
-
-#include <gtk/gtkmenuitem.h>
-#include <gtk/gtkoptionmenu.h>
-#include <gtk/gtktooltips.h>
-#include <libgnomeui/gnome-uidefs.h>
-#include <libgnome/gnome-i18n.h>
-#include <libedataserverui/e-name-selector.h>
-
-#include "Composer.h"
-
-#include <gtk/gtkmenuitem.h>
-#include <gtk/gtkoptionmenu.h>
-#include <gtk/gtktooltips.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkhbox.h>
-#include <gtk/gtkmessagedialog.h>
-
-#include <gconf/gconf.h>
-#include <gconf/gconf-client.h>
-
-#include <gal/e-text/e-entry.h>
-
-#include "widgets/misc/e-error.h"
-
-#include <camel/camel.h>
-#include "e-msg-composer-hdrs.h"
-#include "mail/mail-config.h"
-/*#include "mail/em-folder-selection-button.h"*/
-#include "mail/em-folder-selector.h"
-#include "mail/mail-component.h"
-#include "mail/em-folder-tree.h"
-
-/* TEMPORARY KLUDGE */
-#include "addressbook/gui/contact-editor/e-contact-editor.h"
-#include "addressbook/gui/contact-list-editor/e-contact-list-editor.h"
-
-
-
-/* Indexes in the GtkTable assigned to various items */
-
-#define LINE_FROM 0
-#define LINE_REPLYTO 1
-#define LINE_TO 2
-#define LINE_CC 3
-#define LINE_BCC 4
-#define LINE_POSTTO 5
-#define LINE_SUBJECT 6
-
-
-typedef struct {
- GtkWidget *label;
- GtkWidget *entry;
-} EMsgComposerHdrPair;
-
-struct _EMsgComposerHdrsPrivate {
- ENameSelector *name_selector;
-
- /* ui component */
- BonoboUIComponent *uic;
-
- /* The tooltips. */
- GtkTooltips *tooltips;
-
- EAccountList *accounts;
- GSList *from_options;
-
- gboolean post_custom;
-
- /* Standard headers. */
- EMsgComposerHdrPair from, reply_to, to, cc, bcc, post_to, subject;
-};
-
-
-static GtkTableClass *parent_class = NULL;
-
-enum {
- SHOW_ADDRESS_DIALOG,
- SUBJECT_CHANGED,
- HDRS_CHANGED,
- FROM_CHANGED,
- LAST_SIGNAL
-};
-
-static int signals[LAST_SIGNAL];
-
-
-static void
-addressbook_dialog_response (ENameSelectorDialog *name_selector_dialog, gint response, gpointer user_data)
-{
- EMsgComposerHdrs *hdrs = E_MSG_COMPOSER_HDRS (user_data);
-
- gtk_widget_hide (GTK_WIDGET (name_selector_dialog));
-}
-
-static void
-setup_name_selector (EMsgComposerHdrs *hdrs)
-{
- EMsgComposerHdrsPrivate *priv;
- ENameSelectorDialog *name_selector_dialog;
-
- priv = hdrs->priv;
-
- g_assert (priv->name_selector == NULL);
-
- priv->name_selector = e_name_selector_new ();
- name_selector_dialog = e_name_selector_peek_dialog (priv->name_selector);
- g_signal_connect (name_selector_dialog, "response",
- G_CALLBACK (addressbook_dialog_response), hdrs);
-}
-
-typedef struct {
- EMsgComposerHdrs *hdrs;
- char *string;
-} EMsgComposerHdrsAndString;
-
-static void
-e_msg_composer_hdrs_and_string_free (EMsgComposerHdrsAndString *emchas)
-{
- if (emchas->hdrs)
- g_object_unref (emchas->hdrs);
- g_free (emchas->string);
- g_free (emchas);
-}
-
-static EMsgComposerHdrsAndString *
-e_msg_composer_hdrs_and_string_create (EMsgComposerHdrs *hdrs, const char *string)
-{
- EMsgComposerHdrsAndString *emchas;
-
- emchas = g_new (EMsgComposerHdrsAndString, 1);
- emchas->hdrs = hdrs;
- emchas->string = g_strdup (string);
- if (emchas->hdrs)
- g_object_ref (emchas->hdrs);
-
- return emchas;
-}
-
-static void
-address_button_clicked_cb (GtkButton *button, gpointer data)
-{
- EMsgComposerHdrsAndString *emchas;
- EMsgComposerHdrs *hdrs;
- EMsgComposerHdrsPrivate *priv;
- ENameSelectorDialog *name_selector_dialog;
-
- emchas = data;
- hdrs = emchas->hdrs;
- priv = hdrs->priv;
-
- name_selector_dialog = e_name_selector_peek_dialog (priv->name_selector);
- gtk_widget_show (GTK_WIDGET (name_selector_dialog));
-}
-
-static void
-from_changed (GtkWidget *item, gpointer data)
-{
- EMsgComposerHdrs *hdrs = E_MSG_COMPOSER_HDRS (data);
- const char *reply_to;
- GList *post_items = NULL;
-
- /* this will retrieve items relative to the previous account */
- if (!hdrs->priv->post_custom)
- post_items = e_msg_composer_hdrs_get_post_to(hdrs);
-
- hdrs->account = g_object_get_data ((GObject *) item, "account");
-
- /* we do this rather than calling e_msg_composer_hdrs_set_reply_to()
- because we don't want to change the visibility of the header */
- reply_to = hdrs->account->id->reply_to;
- gtk_entry_set_text (GTK_ENTRY (hdrs->priv->reply_to.entry), reply_to ? reply_to : "");
-
- /* folders should be made relative to the new from */
- if (!hdrs->priv->post_custom) {
- e_msg_composer_hdrs_set_post_to_list (hdrs, post_items);
- g_list_foreach (post_items, (GFunc)g_free, NULL);
- g_list_free(post_items);
- }
-
- g_signal_emit (hdrs, signals [FROM_CHANGED], 0);
-}
-
-static void
-account_added_cb (EAccountList *accounts, EAccount *account, EMsgComposerHdrs *hdrs)
-{
- GtkWidget *item, *menu, *omenu, *toplevel;
- char *label;
-
- omenu = e_msg_composer_hdrs_get_from_omenu (hdrs);
- menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (omenu));
-
- label = g_strdup_printf ("%s <%s>", account->id->name, account->id->address);
- item = gtk_menu_item_new_with_label (label);
- gtk_widget_show (item);
- g_free (label);
-
- g_object_ref (account);
- g_object_set_data ((GObject *) item, "account", account);
- g_signal_connect (item, "activate", G_CALLBACK (from_changed), hdrs);
-
- /* this is so we can later set which one we want */
- hdrs->priv->from_options = g_slist_append (hdrs->priv->from_options, item);
-
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
-
- toplevel = gtk_widget_get_toplevel ((GtkWidget *) hdrs);
- gtk_widget_set_sensitive (toplevel, TRUE);
-}
-
-static void
-account_changed_cb (EAccountList *accounts, EAccount *account, EMsgComposerHdrs *hdrs)
-{
- GtkWidget *item, *label;
- EAccount *acnt;
- GSList *node;
- char *text;
-
- node = hdrs->priv->from_options;
- while (node != NULL) {
- item = node->data;
- acnt = g_object_get_data ((GObject *) item, "account");
- if (acnt == account) {
- text = g_strdup_printf ("%s <%s>", account->id->name, account->id->address);
- label = gtk_bin_get_child ((GtkBin *) item);
- gtk_label_set_text ((GtkLabel *) label, text);
- g_free (text);
- break;
- }
-
- node = node->next;
- }
-}
-
-static void
-account_removed_cb (EAccountList *accounts, EAccount *account, EMsgComposerHdrs *hdrs)
-{
- struct _EMsgComposerHdrsPrivate *priv = hdrs->priv;
- GtkWidget *item, *omenu, *toplevel;
- EAccount *acnt;
- GSList *node;
-
- node = priv->from_options;
- while (node != NULL) {
- item = node->data;
- acnt = g_object_get_data ((GObject *) item, "account");
- if (acnt == account) {
- if (hdrs->account == account)
- hdrs->account = NULL;
-
- priv->from_options = g_slist_remove_link (priv->from_options, node);
- g_slist_free_1 (node);
- g_object_unref (account);
- gtk_widget_destroy (item);
- break;
- }
-
- node = node->next;
- }
-
- if (hdrs->account == NULL) {
- if (priv->from_options) {
- /* the previously selected account was removed,
- default the new selection to the first account in
- the menu list */
- omenu = e_msg_composer_hdrs_get_from_omenu (hdrs);
-
- item = priv->from_options->data;
- gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), 0);
- g_signal_emit_by_name (item, "activate", hdrs);
- } else {
- toplevel = gtk_widget_get_toplevel ((GtkWidget *) hdrs);
- gtk_widget_set_sensitive (toplevel, FALSE);
-
- /* FIXME: this should offer a 'configure account' button, can we do that? */
- e_error_run((GtkWindow *)toplevel, "mail-composer:all-accounts-deleted", NULL);
- }
- }
-}
-
-static GtkWidget *
-create_from_optionmenu (EMsgComposerHdrs *hdrs)
-{
- struct _EMsgComposerHdrsPrivate *priv = hdrs->priv;
- GtkWidget *hbox, *omenu, *menu, *item, *first = NULL;
- int i = 0, history = 0, m, matches;
- GPtrArray *addresses;
- GConfClient *gconf;
- EAccount *account;
- EIterator *iter;
- char *uid;
-
- omenu = gtk_option_menu_new ();
- menu = gtk_menu_new ();
-
- gconf = gconf_client_get_default ();
- uid = gconf_client_get_string (gconf, "/apps/evolution/mail/default_account", NULL);
- g_object_unref (gconf);
-
- /* Make list of account email addresses */
- addresses = g_ptr_array_new ();
- iter = e_list_get_iterator ((EList *) priv->accounts);
- while (e_iterator_is_valid (iter)) {
- account = (EAccount *) e_iterator_get (iter);
-
- if (account->id->address)
- g_ptr_array_add (addresses, account->id->address);
-
- e_iterator_next (iter);
- }
-
- e_iterator_reset (iter);
-
- while (e_iterator_is_valid (iter)) {
- char *label;
-
- account = (EAccount *) e_iterator_get (iter);
-
- /* this should never ever fail */
- if (!account || !account->name || !account->id) {
- g_assert_not_reached ();
- continue;
- }
-
- if (account->id->address && *account->id->address) {
- /* If the account has a unique email address, just
- * show that. Otherwise include the account name.
- */
- for (m = matches = 0; m < addresses->len; m++) {
- if (!strcmp (account->id->address, addresses->pdata[m]))
- matches++;
- }
-
- if (matches > 1)
- label = g_strdup_printf ("%s <%s> (%s)", account->id->name,
- account->id->address, account->name);
- else
- label = g_strdup_printf ("%s <%s>", account->id->name, account->id->address);
-
- item = gtk_menu_item_new_with_label (label);
- g_free (label);
-
- g_object_ref (account);
- g_object_set_data ((GObject *) item, "account", account);
- g_signal_connect (item, "activate", G_CALLBACK (from_changed), hdrs);
-
- if (uid && !strcmp (account->uid, uid)) {
- first = item;
- history = i;
- }
-
- /* this is so we can later set which one we want */
- hdrs->priv->from_options = g_slist_append (hdrs->priv->from_options, item);
-
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
- i++;
- }
-
- e_iterator_next (iter);
- }
-
- g_free (uid);
- g_object_unref (iter);
-
- g_ptr_array_free (addresses, TRUE);
-
- gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
-
- if (first) {
- gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), history);
- g_signal_emit_by_name (first, "activate", hdrs);
- }
-
- hbox = gtk_hbox_new (FALSE, 6);
- gtk_box_pack_start_defaults (GTK_BOX (hbox), omenu);
- gtk_widget_show (omenu);
- gtk_widget_show (hbox);
-
- g_object_set_data ((GObject *) hbox, "from_menu", omenu);
-
- /* listen for changes to the account list so we can auto-update the from menu */
- g_signal_connect (priv->accounts, "account-added", G_CALLBACK (account_added_cb), hdrs);
- g_signal_connect (priv->accounts, "account-changed", G_CALLBACK (account_changed_cb), hdrs);
- g_signal_connect (priv->accounts, "account-removed", G_CALLBACK (account_removed_cb), hdrs);
-
- return hbox;
-}
-
-static void
-addressbook_entry_changed (GtkWidget *entry,
- gpointer user_data)
-{
- EMsgComposerHdrs *hdrs = E_MSG_COMPOSER_HDRS (user_data);
-
- g_signal_emit (hdrs, signals[HDRS_CHANGED], 0);
-}
-
-static GtkWidget *
-create_addressbook_entry (EMsgComposerHdrs *hdrs, const char *name)
-{
- EMsgComposerHdrsPrivate *priv;
- ENameSelectorModel *name_selector_model;
- ENameSelectorEntry *name_selector_entry;
-
- priv = hdrs->priv;
-
- name_selector_model = e_name_selector_peek_model (priv->name_selector);
- e_name_selector_model_add_section (name_selector_model, name, name, NULL);
-
- name_selector_entry = e_name_selector_peek_section_entry (priv->name_selector, name);
- g_signal_connect (name_selector_entry, "changed",
- G_CALLBACK (addressbook_entry_changed), hdrs);
-
- e_name_selector_entry_set_contact_editor_func (name_selector_entry, e_contact_editor_new);
- e_name_selector_entry_set_contact_list_editor_func (name_selector_entry, e_contact_list_editor_new);
-
- return GTK_WIDGET (name_selector_entry);
-
-#if 0
-
- CORBA_exception_init (&ev);
-
- GNOME_Evolution_Addressbook_SelectNames_addSection (
- corba_select_names, name, name, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- corba_control =
- GNOME_Evolution_Addressbook_SelectNames_getEntryBySection (
- corba_select_names, name, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- CORBA_exception_free (&ev);
- return NULL;
- }
-
- CORBA_exception_free (&ev);
-
- control_widget = bonobo_widget_new_control_from_objref (
- corba_control, bonobo_ui_component_get_container (priv->uic));
-
- cf = bonobo_widget_get_control_frame (BONOBO_WIDGET (control_widget));
- pb = bonobo_control_frame_get_control_property_bag (cf, NULL);
-
- bonobo_control_frame_set_autoactivate (cf, TRUE);
-
- bonobo_event_source_client_add_listener (
- pb, addressbook_entry_changed,
- "Bonobo/Property:change:entry_changed",
- NULL, hdrs);
-
- return control_widget;
-#endif
-}
-
-static void
-post_browser_response (EMFolderSelector *emfs, int response, EMsgComposerHdrs *hdrs)
-{
- if (response == GTK_RESPONSE_OK) {
- GList *uris = em_folder_selector_get_selected_uris (emfs);
- e_msg_composer_hdrs_set_post_to_list (hdrs, uris);
- hdrs->priv->post_custom = FALSE;
- g_list_foreach (uris, (GFunc) g_free, NULL);
- g_list_free (uris);
- }
-
- gtk_widget_destroy ((GtkWidget *) emfs);
-}
-
-static void
-post_browser_clicked_cb (GtkButton *button, EMsgComposerHdrs *hdrs)
-{
- EMFolderTreeModel *model;
- EMFolderTree *emft;
- GtkWidget *dialog;
- GList *post_items;
-
- model = mail_component_peek_tree_model (mail_component_peek ());
- emft = (EMFolderTree *) em_folder_tree_new_with_model (model);
- em_folder_tree_set_multiselect (emft, TRUE);
- em_folder_tree_set_excluded(emft, EMFT_EXCLUDE_NOSELECT|EMFT_EXCLUDE_VIRTUAL|EMFT_EXCLUDE_VTRASH);
-
- dialog = em_folder_selector_new (emft, EM_FOLDER_SELECTOR_CAN_CREATE,
- _("Posting destination"),
- _("Choose folders to post the message to."), NULL);
-
- post_items = e_msg_composer_hdrs_get_post_to (hdrs);
- em_folder_selector_set_selected_list ((EMFolderSelector *) dialog, post_items);
- g_list_foreach (post_items, (GFunc) g_free, NULL);
- g_list_free (post_items);
-
- g_signal_connect (dialog, "response", G_CALLBACK (post_browser_response), hdrs);
- gtk_widget_show (dialog);
-}
-
-static void
-post_entry_changed_cb (GtkButton *button, EMsgComposerHdrs *hdrs)
-{
- hdrs->priv->post_custom = TRUE;
-}
-
-static EMsgComposerHdrPair
-header_new_recipient (EMsgComposerHdrs *hdrs, const char *name, const char *tip)
-{
- EMsgComposerHdrsPrivate *priv;
- EMsgComposerHdrPair ret;
-
- priv = hdrs->priv;
-
- ret.label = gtk_button_new_with_mnemonic (name);
- GTK_OBJECT_UNSET_FLAGS (ret.label, GTK_CAN_FOCUS);
- g_signal_connect_data (ret.label, "clicked",
- G_CALLBACK (address_button_clicked_cb),
- e_msg_composer_hdrs_and_string_create (hdrs, name),
- (GClosureNotify) e_msg_composer_hdrs_and_string_free,
- 0);
-
- gtk_tooltips_set_tip (hdrs->priv->tooltips, ret.label,
- _("Click here for the address book"),
- NULL);
-
- ret.entry = create_addressbook_entry (hdrs, name);
-
- return ret;
-}
-
-static void
-entry_changed (GtkWidget *entry, EMsgComposerHdrs *hdrs)
-{
- const char *subject;
-
- subject = e_msg_composer_hdrs_get_subject (hdrs);
- g_signal_emit (hdrs, signals[SUBJECT_CHANGED], 0, subject);
- g_signal_emit (hdrs, signals[HDRS_CHANGED], 0);
-}
-
-static void
-create_headers (EMsgComposerHdrs *hdrs)
-{
- EMsgComposerHdrsPrivate *priv = hdrs->priv;
- AtkObject *a11y;
- /*
- * Reply-To:
- *
- * Create this before we call create_from_optionmenu,
- * because that causes from_changed to be called, which
- * expects the reply_to fields to be initialized.
- */
- priv->reply_to.label = gtk_label_new_with_mnemonic (_("_Reply-To:"));
- priv->reply_to.entry = gtk_entry_new ();
- gtk_label_set_mnemonic_widget (priv->reply_to.label, priv->reply_to.entry);
-
- /*
- * From
- */
- priv->from.label = gtk_label_new_with_mnemonic (_("Fr_om:"));
- priv->from.entry = create_from_optionmenu (hdrs);
- gtk_label_set_mnemonic_widget (priv->from.label, e_msg_composer_hdrs_get_from_omenu (hdrs));
-
- /*
- * Subject
- */
- priv->subject.label = gtk_label_new_with_mnemonic (_("S_ubject:"));
- priv->subject.entry = gtk_entry_new ();
- gtk_label_set_mnemonic_widget (priv->subject.label, priv->subject.entry);
- g_signal_connect (priv->subject.entry, "changed",
- G_CALLBACK (entry_changed), hdrs);
-
- /*
- * To, CC, and Bcc
- */
- priv->to = header_new_recipient (
- hdrs, _("_To:"),
- _("Enter the recipients of the message"));
-
- priv->cc = header_new_recipient (
- hdrs, _("_Cc:"),
- _("Enter the addresses that will receive a carbon copy of the message"));
-
- priv->bcc = header_new_recipient (
- hdrs, _("_Bcc:"),
- _("Enter the addresses that will receive a carbon copy of "
- "the message without appearing in the recipient list of "
- "the message."));
-
- /*
- * Post-To
- */
- priv->post_to.label = gtk_button_new_with_mnemonic (_("_Post To:"));
- GTK_OBJECT_UNSET_FLAGS (priv->post_to.label, GTK_CAN_FOCUS);
- g_signal_connect (priv->post_to.label, "clicked",
- G_CALLBACK (post_browser_clicked_cb), hdrs);
- gtk_tooltips_set_tip (hdrs->priv->tooltips, priv->post_to.label,
- _("Click here to select folders to post to"),
- NULL);
-
- priv->post_to.entry = gtk_entry_new ();
- a11y = gtk_widget_get_accessible (priv->post_to.entry);
- if (a11y != NULL) {
- atk_object_set_name (a11y, _("Post To:"));
- }
- g_signal_connect(priv->post_to.entry, "changed",
- G_CALLBACK (post_entry_changed_cb), hdrs);
-}
-
-static void
-attach_couple (EMsgComposerHdrs *hdrs, EMsgComposerHdrPair *pair, int line)
-{
- gtk_table_attach (GTK_TABLE (hdrs),
- pair->label, 0, 1,
- line, line + 1,
- GTK_FILL, GTK_FILL, 3, 3);
-
- gtk_table_attach (GTK_TABLE (hdrs),
- pair->entry, 1, 2,
- line, line + 1,
- GTK_FILL | GTK_EXPAND, 0, 3, 3);
-}
-
-static void
-attach_headers (EMsgComposerHdrs *hdrs)
-{
- EMsgComposerHdrsPrivate *p = hdrs->priv;
-
- attach_couple (hdrs, &p->from, LINE_FROM);
- attach_couple (hdrs, &p->reply_to, LINE_REPLYTO);
- attach_couple (hdrs, &p->to, LINE_TO);
- attach_couple (hdrs, &p->cc, LINE_CC);
- attach_couple (hdrs, &p->bcc, LINE_BCC);
- attach_couple (hdrs, &p->post_to, LINE_POSTTO);
- attach_couple (hdrs, &p->subject, LINE_SUBJECT);
-}
-
-static void
-set_pair_visibility (EMsgComposerHdrs *h, EMsgComposerHdrPair *pair, int visible)
-{
- if (visible /*& h->visible_mask*/) {
- gtk_widget_show (pair->label);
- gtk_widget_show (pair->entry);
- } else {
- gtk_widget_hide (pair->label);
- gtk_widget_hide (pair->entry);
- }
-}
-
-static void
-headers_set_visibility (EMsgComposerHdrs *h, int visible_flags)
-{
- EMsgComposerHdrsPrivate *p = h->priv;
-
- /* To is always visible if we're not doing Post-To */
- if (!(h->visible_mask & E_MSG_COMPOSER_VISIBLE_POSTTO))
- visible_flags |= E_MSG_COMPOSER_VISIBLE_TO;
- else
- visible_flags |= E_MSG_COMPOSER_VISIBLE_POSTTO;
-
- set_pair_visibility (h, &p->from, visible_flags & E_MSG_COMPOSER_VISIBLE_FROM);
- set_pair_visibility (h, &p->reply_to, visible_flags & E_MSG_COMPOSER_VISIBLE_REPLYTO);
- set_pair_visibility (h, &p->to, visible_flags & E_MSG_COMPOSER_VISIBLE_TO);
- set_pair_visibility (h, &p->cc, visible_flags & E_MSG_COMPOSER_VISIBLE_CC);
- set_pair_visibility (h, &p->bcc, visible_flags & E_MSG_COMPOSER_VISIBLE_BCC);
- set_pair_visibility (h, &p->post_to, visible_flags & E_MSG_COMPOSER_VISIBLE_POSTTO);
- set_pair_visibility (h, &p->subject, visible_flags & E_MSG_COMPOSER_VISIBLE_SUBJECT);
-}
-
-static void
-headers_set_sensitivity (EMsgComposerHdrs *h)
-{
- /* these ones are always on */
- bonobo_ui_component_set_prop (
- h->priv->uic, "/commands/ViewTo", "sensitive",
- h->visible_mask & E_MSG_COMPOSER_VISIBLE_TO ? "0" : "1", NULL);
-
- bonobo_ui_component_set_prop (
- h->priv->uic, "/commands/ViewPostTo", "sensitive",
- h->visible_mask & E_MSG_COMPOSER_VISIBLE_POSTTO ? "0" : "1", NULL);
-}
-
-void
-e_msg_composer_hdrs_set_visible_mask (EMsgComposerHdrs *hdrs, int visible_mask)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs));
-
- hdrs->visible_mask = visible_mask;
- headers_set_sensitivity (hdrs);
-}
-
-void
-e_msg_composer_hdrs_set_visible (EMsgComposerHdrs *hdrs, int visible_flags)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs));
-
- headers_set_visibility (hdrs, visible_flags);
- gtk_widget_queue_resize (GTK_WIDGET (hdrs));
-}
-
-static void
-setup_headers (EMsgComposerHdrs *hdrs, int visible_flags)
-{
- create_headers (hdrs);
- attach_headers (hdrs);
-
- headers_set_sensitivity (hdrs);
- headers_set_visibility (hdrs, visible_flags);
-}
-
-
-/* GtkObject methods. */
-
-static void
-destroy (GtkObject *object)
-{
- EMsgComposerHdrs *hdrs;
- EMsgComposerHdrsPrivate *priv;
- GSList *l, *n;
-
- hdrs = E_MSG_COMPOSER_HDRS (object);
- priv = hdrs->priv;
-
- if (priv) {
- if (priv->name_selector != NULL) {
- g_object_unref (priv->name_selector);
- priv->name_selector = NULL;
- }
-
- if (priv->tooltips) {
- gtk_object_destroy (GTK_OBJECT (priv->tooltips));
- g_object_unref (priv->tooltips);
- priv->tooltips = NULL;
- }
-
- if (priv->accounts) {
- g_signal_handlers_disconnect_matched(priv->accounts, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, hdrs);
- g_object_unref (priv->accounts);
- priv->accounts = NULL;
- }
-
- l = priv->from_options;
- while (l) {
- EAccount *account;
- GtkWidget *item = l->data;
-
- account = g_object_get_data ((GObject *) item, "account");
- g_object_unref (account);
-
- n = l->next;
- g_slist_free_1 (l);
- l = n;
- }
-
- priv->from_options = NULL;
-
- g_free (priv);
- hdrs->priv = NULL;
- }
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy != NULL)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-static void
-class_init (EMsgComposerHdrsClass *class)
-{
- GtkObjectClass *object_class;
-
- object_class = GTK_OBJECT_CLASS (class);
- object_class->destroy = destroy;
-
- parent_class = g_type_class_ref (gtk_table_get_type ());
-
- signals[SHOW_ADDRESS_DIALOG] =
- g_signal_new ("show_address_dialog",
- E_TYPE_MSG_COMPOSER_HDRS,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET(EMsgComposerHdrsClass, show_address_dialog),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
- signals[SUBJECT_CHANGED] =
- g_signal_new ("subject_changed",
- E_TYPE_MSG_COMPOSER_HDRS,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET(EMsgComposerHdrsClass, subject_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE,
- 1, G_TYPE_STRING);
-
- signals[HDRS_CHANGED] =
- g_signal_new ("hdrs_changed",
- E_TYPE_MSG_COMPOSER_HDRS,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET(EMsgComposerHdrsClass, hdrs_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
- signals[FROM_CHANGED] =
- g_signal_new ("from_changed",
- E_TYPE_MSG_COMPOSER_HDRS,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET(EMsgComposerHdrsClass, from_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-}
-
-static void
-init (EMsgComposerHdrs *hdrs)
-{
- EMsgComposerHdrsPrivate *priv;
-
- priv = g_new0 (EMsgComposerHdrsPrivate, 1);
-
- priv->tooltips = gtk_tooltips_new ();
- g_object_ref (priv->tooltips);
- gtk_object_sink ((GtkObject *) priv->tooltips);
-
- priv->accounts = mail_config_get_accounts ();
- g_object_ref (priv->accounts);
-
- priv->post_custom = FALSE;
-
- hdrs->priv = priv;
-}
-
-
-GType
-e_msg_composer_hdrs_get_type (void)
-{
- static GType type = 0;
-
- if (type == 0) {
- static const GTypeInfo info = {
- sizeof (EMsgComposerHdrsClass),
- NULL,
- NULL,
- (GClassInitFunc) class_init,
- NULL,
- NULL,
- sizeof (EMsgComposerHdrs),
- 0,
- (GInstanceInitFunc) init,
- };
-
- type = g_type_register_static (gtk_table_get_type (), "EMsgComposerHdrs", &info, 0);
- }
-
- return type;
-}
-
-GtkWidget *
-e_msg_composer_hdrs_new (BonoboUIComponent *uic, int visible_mask, int visible_flags)
-{
- EMsgComposerHdrs *new;
- EMsgComposerHdrsPrivate *priv;
-
- new = g_object_new (e_msg_composer_hdrs_get_type (), NULL);
- priv = new->priv;
- priv->uic = uic;
-
- g_object_ref (new);
- gtk_object_sink (GTK_OBJECT (new));
-
- setup_name_selector (new);
-
- new->visible_mask = visible_mask;
-
- setup_headers (new, visible_flags);
-
- return GTK_WIDGET (new);
-}
-
-static void
-set_recipients_from_destv (CamelMimeMessage *msg,
- EDestination **to_destv,
- EDestination **cc_destv,
- EDestination **bcc_destv,
- gboolean redirect)
-{
- CamelInternetAddress *to_addr;
- CamelInternetAddress *cc_addr;
- CamelInternetAddress *bcc_addr;
- CamelInternetAddress *target;
- const char *text_addr, *header;
- gboolean seen_hidden_list = FALSE;
- int i;
-
- to_addr = camel_internet_address_new ();
- cc_addr = camel_internet_address_new ();
- bcc_addr = camel_internet_address_new ();
-
- if (to_destv) {
- for (i = 0; to_destv[i] != NULL; ++i) {
- text_addr = e_destination_get_address (to_destv[i]);
-
- if (text_addr && *text_addr) {
- target = to_addr;
- if (e_destination_is_evolution_list (to_destv[i])
- && !e_destination_list_show_addresses (to_destv[i])) {
- target = bcc_addr;
- seen_hidden_list = TRUE;
- }
-
- camel_address_decode (CAMEL_ADDRESS (target), text_addr);
- }
- }
- }
-
- if (cc_destv) {
- for (i = 0; cc_destv[i] != NULL; ++i) {
- text_addr = e_destination_get_address (cc_destv[i]);
- if (text_addr && *text_addr) {
- target = cc_addr;
- if (e_destination_is_evolution_list (cc_destv[i])
- && !e_destination_list_show_addresses (cc_destv[i])) {
- target = bcc_addr;
- seen_hidden_list = TRUE;
- }
-
- camel_address_decode (CAMEL_ADDRESS (target), text_addr);
- }
- }
- }
-
- if (bcc_destv) {
- for (i = 0; bcc_destv[i] != NULL; ++i) {
- text_addr = e_destination_get_address (bcc_destv[i]);
- if (text_addr && *text_addr) {
- camel_address_decode (CAMEL_ADDRESS (bcc_addr), text_addr);
- }
- }
- }
-
- header = redirect ? CAMEL_RECIPIENT_TYPE_RESENT_TO : CAMEL_RECIPIENT_TYPE_TO;
- if (camel_address_length (CAMEL_ADDRESS (to_addr)) > 0) {
- camel_mime_message_set_recipients (msg, header, to_addr);
- } else if (seen_hidden_list) {
- camel_medium_set_header (CAMEL_MEDIUM (msg), header, "Undisclosed-Recipient:;");
- }
-
- header = redirect ? CAMEL_RECIPIENT_TYPE_RESENT_CC : CAMEL_RECIPIENT_TYPE_CC;
- if (camel_address_length (CAMEL_ADDRESS (cc_addr)) > 0) {
- camel_mime_message_set_recipients (msg, header, cc_addr);
- }
-
- header = redirect ? CAMEL_RECIPIENT_TYPE_RESENT_BCC : CAMEL_RECIPIENT_TYPE_BCC;
- if (camel_address_length (CAMEL_ADDRESS (bcc_addr)) > 0) {
- camel_mime_message_set_recipients (msg, header, bcc_addr);
- }
-
- camel_object_unref (to_addr);
- camel_object_unref (cc_addr);
- camel_object_unref (bcc_addr);
-}
-
-static void
-e_msg_composer_hdrs_to_message_internal (EMsgComposerHdrs *hdrs,
- CamelMimeMessage *msg,
- gboolean redirect)
-{
- EDestination **to_destv, **cc_destv, **bcc_destv;
- CamelInternetAddress *addr;
- const char *subject;
- char *header;
-
- g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs));
- g_return_if_fail (CAMEL_IS_MIME_MESSAGE (msg));
-
- subject = e_msg_composer_hdrs_get_subject (hdrs);
- camel_mime_message_set_subject (msg, subject);
-
- addr = e_msg_composer_hdrs_get_from (hdrs);
- if (redirect) {
- header = camel_address_encode (CAMEL_ADDRESS (addr));
- camel_medium_set_header (CAMEL_MEDIUM (msg), "Resent-From", header);
- g_free (header);
- } else {
- camel_mime_message_set_from (msg, addr);
- }
- camel_object_unref (addr);
-
- addr = e_msg_composer_hdrs_get_reply_to (hdrs);
- if (addr) {
- camel_mime_message_set_reply_to (msg, addr);
- camel_object_unref (addr);
- }
-
- if (hdrs->visible_mask & E_MSG_COMPOSER_VISIBLE_MASK_RECIPIENTS) {
- to_destv = e_msg_composer_hdrs_get_to (hdrs);
- cc_destv = e_msg_composer_hdrs_get_cc (hdrs);
- bcc_destv = e_msg_composer_hdrs_get_bcc (hdrs);
-
- /* Attach destinations to the message. */
-
- set_recipients_from_destv (msg, to_destv, cc_destv, bcc_destv, redirect);
-
- e_destination_freev (to_destv);
- e_destination_freev (cc_destv);
- e_destination_freev (bcc_destv);
- }
-
-#if 0
- if (hdrs->visible_mask & E_MSG_COMPOSER_VISIBLE_POSTTO) {
- header = e_msg_composer_hdrs_get_post_to (hdrs);
- camel_medium_set_header (CAMEL_MEDIUM (msg), "X-Evolution-PostTo", header);
- g_free (header);
- }
-#endif
-}
-
-
-void
-e_msg_composer_hdrs_to_message (EMsgComposerHdrs *hdrs,
- CamelMimeMessage *msg)
-{
- e_msg_composer_hdrs_to_message_internal (hdrs, msg, FALSE);
-}
-
-
-void
-e_msg_composer_hdrs_to_redirect (EMsgComposerHdrs *hdrs,
- CamelMimeMessage *msg)
-{
- e_msg_composer_hdrs_to_message_internal (hdrs, msg, TRUE);
-}
-
-
-/* FIXME: yea, this could be better... but it's doubtful it'll be used much */
-void
-e_msg_composer_hdrs_set_from_account (EMsgComposerHdrs *hdrs,
- const char *account_name)
-{
- GtkOptionMenu *omenu;
- GConfClient *gconf;
- GtkWidget *item;
- char *uid = NULL;
- GSList *l;
- int i = 0;
-
- g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs));
-
- omenu = GTK_OPTION_MENU (e_msg_composer_hdrs_get_from_omenu (hdrs));
-
- if (!account_name) {
- gconf = gconf_client_get_default ();
- uid = gconf_client_get_string (gconf, "/apps/evolution/mail/default_account", NULL);
- g_object_unref (gconf);
- }
-
- /* find the item that represents the account and activate it */
- l = hdrs->priv->from_options;
- while (l) {
- EAccount *account;
- item = l->data;
-
- account = g_object_get_data ((GObject *) item, "account");
- if (account_name) {
- if (account->name && !strcmp (account_name, account->name)) {
- /* set the correct optionlist item */
- gtk_option_menu_set_history (omenu, i);
- g_signal_emit_by_name (item, "activate", hdrs);
- g_free (uid);
-
- return;
- }
- } else if (uid && !strcmp (account->uid, uid)) {
- /* set the default optionlist item */
- gtk_option_menu_set_history (omenu, i);
- g_signal_emit_by_name (item, "activate", hdrs);
- g_free (uid);
-
- return;
- }
-
- l = l->next;
- i++;
- }
-
- g_free (uid);
-}
-
-void
-e_msg_composer_hdrs_set_reply_to (EMsgComposerHdrs *hdrs,
- const char *reply_to)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs));
-
- gtk_entry_set_text (GTK_ENTRY (hdrs->priv->reply_to.entry), reply_to ? reply_to : "");
-
- if (reply_to && *reply_to)
- set_pair_visibility (hdrs, &hdrs->priv->cc, TRUE);
-}
-
-static void
-destinations_to_name_selector_entry (ENameSelectorEntry *name_selector_entry, EDestination **destv)
-{
- EDestinationStore *destination_store;
- GList *destinations;
- GList *l;
- gint i;
-
- /* First clear the store */
- destination_store = e_name_selector_entry_peek_destination_store (name_selector_entry);
- destinations = e_destination_store_list_destinations (destination_store);
-
- for (l = destinations; l; l = g_list_next (l)) {
- EDestination *destination = l->data;
- e_destination_store_remove_destination (destination_store, destination);
- }
-
- g_list_free (destinations);
-
- if (!destv)
- return;
-
- for (i = 0; destv [i]; i++)
- e_destination_store_append_destination (destination_store, destv [i]);
-}
-
-void
-e_msg_composer_hdrs_set_to (EMsgComposerHdrs *hdrs,
- EDestination **to_destv)
-{
- char *str;
-
- g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs));
-
- destinations_to_name_selector_entry (E_NAME_SELECTOR_ENTRY (hdrs->priv->to.entry), to_destv);
-}
-
-void
-e_msg_composer_hdrs_set_cc (EMsgComposerHdrs *hdrs,
- EDestination **cc_destv)
-{
- char *str;
-
- g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs));
-
- destinations_to_name_selector_entry (E_NAME_SELECTOR_ENTRY (hdrs->priv->cc.entry), cc_destv);
-
- if (cc_destv && *cc_destv)
- set_pair_visibility (hdrs, &hdrs->priv->cc, TRUE);
-}
-
-void
-e_msg_composer_hdrs_set_bcc (EMsgComposerHdrs *hdrs,
- EDestination **bcc_destv)
-{
- char *str;
-
- g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs));
-
- destinations_to_name_selector_entry (E_NAME_SELECTOR_ENTRY (hdrs->priv->bcc.entry), bcc_destv);
-
- if (bcc_destv && *bcc_destv)
- set_pair_visibility (hdrs, &hdrs->priv->bcc, TRUE);
-}
-
-
-void
-e_msg_composer_hdrs_set_post_to (EMsgComposerHdrs *hdrs,
- const char *post_to)
-{
- GList *list;
-
- g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs));
- g_return_if_fail (post_to != NULL);
-
- list = g_list_append (NULL, g_strdup (post_to));
-
- e_msg_composer_hdrs_set_post_to_list (hdrs, list);
-
- g_free (list->data);
- g_list_free (list);
-}
-
-static GList *
-newsgroups_list_split (const char *list)
-{
- GList *lst = NULL;
- char *tmp;
- char **items, **cur_ptr;
-
- cur_ptr = items = g_strsplit (list, ",", 0);
-
- while ((tmp = *cur_ptr) != NULL) {
- g_strstrip (tmp);
-
- if (tmp[0])
- lst = g_list_append (lst, g_strdup (tmp));
-
- cur_ptr++;
- }
-
- g_strfreev (items);
-
- return lst;
-}
-
-static char *
-get_account_store_url (EMsgComposerHdrs *hdrs)
-{
- CamelURL *url;
- char *ret = NULL;
-
- if (hdrs->account->source && hdrs->account->source->url) {
- url = camel_url_new (hdrs->account->source->url, NULL);
- ret = camel_url_to_string (url, CAMEL_URL_HIDE_ALL);
- camel_url_free (url);
- }
-
- return ret;
-}
-
-static char *
-folder_name_to_string (EMsgComposerHdrs *hdrs, const char *uri)
-{
- char *storeurl = get_account_store_url (hdrs);
- int len;
-
- if (storeurl) {
- len = strlen (storeurl);
-
- if (g_ascii_strncasecmp (uri, storeurl, len) == 0) {
- g_free (storeurl);
- return g_strdup (uri + len);
- }
-
- g_free (storeurl);
- }
-
- return g_strdup (uri);
-}
-
-void
-e_msg_composer_hdrs_set_post_to_list (EMsgComposerHdrs *hdrs, GList *urls)
-{
- GString *caption;
- char *tmp;
- gboolean post_custom;
-
- if (hdrs->priv->post_to.entry == NULL)
- return;
-
- caption = g_string_new("");
- while (urls) {
- tmp = folder_name_to_string(hdrs, (char *)urls->data);
- if (tmp) {
- if (caption->len)
- g_string_append(caption, ", ");
- g_string_append(caption, tmp);
- }
-
- urls = g_list_next (urls);
- }
-
- post_custom = hdrs->priv->post_custom;
- gtk_entry_set_text(GTK_ENTRY(hdrs->priv->post_to.entry), caption->str);
- hdrs->priv->post_custom = post_custom;
-
- g_string_free(caption, TRUE);
-}
-
-void
-e_msg_composer_hdrs_set_post_to_base (EMsgComposerHdrs *hdrs, const char *base, const char *post_to)
-{
- GList *lst, *curlist;
- char *tmp, *tmp2;
- gboolean post_custom;
- GString *caption;
-
- /* split to newsgroup names */
- lst = newsgroups_list_split(post_to);
- curlist = lst;
-
- caption = g_string_new("");
- while (curlist) {
- /* FIXME: this doens't handle all folder names properly */
- tmp2 = g_strdup_printf ("%s/%s", base, (char *)curlist->data);
- tmp = folder_name_to_string (hdrs, tmp2);
- g_free (tmp2);
- if (tmp) {
- if (caption->len)
- g_string_append(caption, ", ");
- g_string_append(caption, tmp);
- }
- curlist = g_list_next(curlist);
- }
-
- post_custom = hdrs->priv->post_custom;
- gtk_entry_set_text(GTK_ENTRY(hdrs->priv->post_to.entry), caption->str);
- hdrs->priv->post_custom = post_custom;
-
- g_string_free(caption, TRUE);
- g_list_foreach(lst, (GFunc)g_free, NULL);
- g_list_free(lst);
-}
-
-void
-e_msg_composer_hdrs_set_subject (EMsgComposerHdrs *hdrs,
- const char *subject)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs));
- g_return_if_fail (subject != NULL);
-
- gtk_entry_set_text ((GtkEntry *) hdrs->priv->subject.entry, subject);
-}
-
-
-CamelInternetAddress *
-e_msg_composer_hdrs_get_from (EMsgComposerHdrs *hdrs)
-{
- CamelInternetAddress *addr;
- EAccount *account;
-
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- if (!(account = hdrs->account)) {
- /* FIXME: perhaps we should try the default account? */
- return NULL;
- }
-
- addr = camel_internet_address_new ();
- camel_internet_address_add (addr, account->id->name, account->id->address);
-
- return addr;
-}
-
-CamelInternetAddress *
-e_msg_composer_hdrs_get_reply_to (EMsgComposerHdrs *hdrs)
-{
- CamelInternetAddress *addr;
- const char *reply_to;
-
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- reply_to = gtk_entry_get_text (GTK_ENTRY (hdrs->priv->reply_to.entry));
-
- if (!reply_to || *reply_to == '\0')
- return NULL;
-
- addr = camel_internet_address_new ();
- if (camel_address_unformat (CAMEL_ADDRESS (addr), reply_to) == -1) {
- camel_object_unref (CAMEL_OBJECT (addr));
- return NULL;
- }
-
- return addr;
-}
-
-static EDestination **
-destination_list_to_destv (GList *destinations)
-{
- EDestination **destv;
- GList *l;
- gint n, i;
-
- n = g_list_length (destinations);
-
- destv = g_new0 (EDestination *, n + 1);
-
- for (i = 0, l = destinations; l; i++, l = g_list_next (l)) {
- EDestination *destination = l->data;
-
- /* Need to ref, as users expect to own it */
- g_object_ref (destination);
- destv [i] = l->data;
- }
-
- return destv;
-}
-
-EDestination **
-e_msg_composer_hdrs_get_to (EMsgComposerHdrs *hdrs)
-{
- char *str = NULL;
- EDestinationStore *destination_store;
- GList *destinations;
- EDestination **destv = NULL;
-
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- destination_store = e_name_selector_entry_peek_destination_store (E_NAME_SELECTOR_ENTRY (
- hdrs->priv->to.entry));
- destinations = e_destination_store_list_destinations (destination_store);
-
- destv = destination_list_to_destv (destinations);
-
- g_list_free (destinations);
- return destv;
-}
-
-EDestination **
-e_msg_composer_hdrs_get_cc (EMsgComposerHdrs *hdrs)
-{
- char *str = NULL;
- EDestinationStore *destination_store;
- GList *destinations;
- EDestination **destv = NULL;
-
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- destination_store = e_name_selector_entry_peek_destination_store (E_NAME_SELECTOR_ENTRY (
- hdrs->priv->cc.entry));
- destinations = e_destination_store_list_destinations (destination_store);
-
- destv = destination_list_to_destv (destinations);
-
- g_list_free (destinations);
- return destv;
-}
-
-EDestination **
-e_msg_composer_hdrs_get_bcc (EMsgComposerHdrs *hdrs)
-{
- char *str = NULL;
- EDestinationStore *destination_store;
- GList *destinations;
- EDestination **destv = NULL;
-
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- destination_store = e_name_selector_entry_peek_destination_store (E_NAME_SELECTOR_ENTRY (
- hdrs->priv->bcc.entry));
- destinations = e_destination_store_list_destinations (destination_store);
-
- destv = destination_list_to_destv (destinations);
-
- g_list_free (destinations);
- return destv;
-}
-
-EDestination **
-e_msg_composer_hdrs_get_recipients (EMsgComposerHdrs *hdrs)
-{
- EDestination **to_destv;
- EDestination **cc_destv;
- EDestination **bcc_destv;
- EDestination **recip_destv;
- int i, j, n;
-
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- to_destv = e_msg_composer_hdrs_get_to (hdrs);
- cc_destv = e_msg_composer_hdrs_get_cc (hdrs);
- bcc_destv = e_msg_composer_hdrs_get_bcc (hdrs);
-
- n = 0;
-
- for (i = 0; to_destv && to_destv[i] != NULL; i++, n++);
- for (i = 0; cc_destv && cc_destv[i] != NULL; i++, n++);
- for (i = 0; bcc_destv && bcc_destv[i] != NULL; i++, n++);
-
- if (n == 0)
- return NULL;
-
- recip_destv = g_new (EDestination *, n + 1);
-
- j = 0;
-
- for (i = 0; to_destv && to_destv[i] != NULL; i++, j++)
- recip_destv[j] = to_destv[i];
- for (i = 0; cc_destv && cc_destv[i] != NULL; i++, j++)
- recip_destv[j] = cc_destv[i];
- for (i = 0; bcc_destv && bcc_destv[i] != NULL; i++, j++)
- recip_destv[j] = bcc_destv[i];
-
- g_assert (j == n);
- recip_destv[j] = NULL;
-
- g_free (to_destv);
- g_free (cc_destv);
- g_free (bcc_destv);
-
- return recip_destv;
-}
-
-
-GList *
-e_msg_composer_hdrs_get_post_to (EMsgComposerHdrs *hdrs)
-{
- GList *uris, *cur;
- char *storeurl = NULL, *tmp;
-
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- if (hdrs->priv->post_to.entry == NULL)
- return NULL;
-
- tmp = g_strdup (gtk_entry_get_text (GTK_ENTRY (hdrs->priv->post_to.entry)));
- uris = newsgroups_list_split (tmp);
- g_free (tmp);
-
- cur = uris;
- while (cur) {
- /* FIXME: this is a bit of a hack, should use camelurl's etc */
- if (strstr ((char *) cur->data, ":/") == NULL) {
- /* relative folder name: convert to absolute */
- if (!storeurl)
- storeurl = get_account_store_url (hdrs);
- if (!storeurl)
- break;
- tmp = g_strconcat (storeurl, cur->data, NULL);
- g_free (cur->data);
- cur->data = tmp;
- }
-
- cur = cur->next;
- }
-
- g_free (storeurl);
-
- return uris;
-}
-
-
-const char *
-e_msg_composer_hdrs_get_subject (EMsgComposerHdrs *hdrs)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- return gtk_entry_get_text ((GtkEntry *) hdrs->priv->subject.entry);
-}
-
-
-GtkWidget *
-e_msg_composer_hdrs_get_reply_to_entry (EMsgComposerHdrs *hdrs)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- return hdrs->priv->reply_to.entry;
-}
-
-GtkWidget *
-e_msg_composer_hdrs_get_to_entry (EMsgComposerHdrs *hdrs)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- return hdrs->priv->to.entry;
-}
-
-GtkWidget *
-e_msg_composer_hdrs_get_cc_entry (EMsgComposerHdrs *hdrs)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- return hdrs->priv->cc.entry;
-}
-
-GtkWidget *
-e_msg_composer_hdrs_get_bcc_entry (EMsgComposerHdrs *hdrs)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- return hdrs->priv->bcc.entry;
-}
-
-GtkWidget *
-e_msg_composer_hdrs_get_post_to_label (EMsgComposerHdrs *hdrs)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- return hdrs->priv->post_to.entry;
-}
-
-GtkWidget *
-e_msg_composer_hdrs_get_subject_entry (EMsgComposerHdrs *hdrs)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- return hdrs->priv->subject.entry;
-}
-
-GtkWidget *
-e_msg_composer_hdrs_get_from_hbox (EMsgComposerHdrs *hdrs)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- return hdrs->priv->from.entry;
-}
-
-GtkWidget *
-e_msg_composer_hdrs_get_from_omenu (EMsgComposerHdrs *hdrs)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL);
-
- return GTK_WIDGET (g_object_get_data ((GObject *) hdrs->priv->from.entry, "from_menu"));
-}
diff --git a/composer/e-msg-composer-hdrs.h b/composer/e-msg-composer-hdrs.h
deleted file mode 100644
index 843b06526d..0000000000
--- a/composer/e-msg-composer-hdrs.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* msg-composer-hdrs.h
- *
- * Copyright (C) 1999 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * published by the Free Software Foundation; either version 2 of the
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli
- */
-
-
-#ifndef ___E_MSG_COMPOSER_HDRS_H__
-#define ___E_MSG_COMPOSER_HDRS_H__
-
-#include <gtk/gtktable.h>
-
-#include <bonobo/bonobo-ui-component.h>
-
-#include <e-util/e-account.h>
-#include <camel/camel-mime-message.h>
-#include <libebook/e-destination.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_MSG_COMPOSER_HDRS (e_msg_composer_hdrs_get_type ())
-#define E_MSG_COMPOSER_HDRS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MSG_COMPOSER_HDRS, EMsgComposerHdrs))
-#define E_MSG_COMPOSER_HDRS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MSG_COMPOSER_HDRS, EMsgComposerHdrsClass))
-#define E_IS_MSG_COMPOSER_HDRS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MSG_COMPOSER_HDRS))
-#define E_IS_MSG_COMPOSER_HDRS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MSG_COMPOSER_HDRS))
-
-
-typedef struct _EMsgComposerHdrs EMsgComposerHdrs;
-typedef struct _EMsgComposerHdrsClass EMsgComposerHdrsClass;
-typedef struct _EMsgComposerHdrsPrivate EMsgComposerHdrsPrivate;
-
-struct _EMsgComposerHdrs {
- GtkTable parent;
-
- EMsgComposerHdrsPrivate *priv;
-
- EAccount *account;
-
- guint32 visible_mask;
-
- gboolean has_changed;
-};
-
-struct _EMsgComposerHdrsClass {
- GtkTableClass parent_class;
-
- void (* show_address_dialog) (EMsgComposerHdrs *hdrs);
-
- void (* subject_changed) (EMsgComposerHdrs *hdrs, gchar *subject);
-
- void (* hdrs_changed) (EMsgComposerHdrs *hdrs);
-
- void (* from_changed) (EMsgComposerHdrs *hdrs);
-};
-
-typedef enum {
- E_MSG_COMPOSER_VISIBLE_FROM = (1 << 0),
- E_MSG_COMPOSER_VISIBLE_REPLYTO = (1 << 1),
- E_MSG_COMPOSER_VISIBLE_TO = (1 << 2),
- E_MSG_COMPOSER_VISIBLE_CC = (1 << 3),
- E_MSG_COMPOSER_VISIBLE_BCC = (1 << 4),
- E_MSG_COMPOSER_VISIBLE_POSTTO = (1 << 5), /* for posting to folders */
- E_MSG_COMPOSER_VISIBLE_SUBJECT = (1 << 7)
-} EMsgComposerHeaderVisibleFlags;
-
-#define E_MSG_COMPOSER_VISIBLE_MASK_SENDER (E_MSG_COMPOSER_VISIBLE_FROM | E_MSG_COMPOSER_VISIBLE_REPLYTO)
-#define E_MSG_COMPOSER_VISIBLE_MASK_BASIC (E_MSG_COMPOSER_VISIBLE_MASK_SENDER | E_MSG_COMPOSER_VISIBLE_SUBJECT)
-#define E_MSG_COMPOSER_VISIBLE_MASK_RECIPIENTS (E_MSG_COMPOSER_VISIBLE_TO | E_MSG_COMPOSER_VISIBLE_CC | E_MSG_COMPOSER_VISIBLE_BCC)
-
-#define E_MSG_COMPOSER_VISIBLE_MASK_MAIL (E_MSG_COMPOSER_VISIBLE_MASK_BASIC | E_MSG_COMPOSER_VISIBLE_MASK_RECIPIENTS)
-#define E_MSG_COMPOSER_VISIBLE_MASK_POST (E_MSG_COMPOSER_VISIBLE_MASK_BASIC | E_MSG_COMPOSER_VISIBLE_POSTTO)
-
-
-GtkType e_msg_composer_hdrs_get_type (void);
-GtkWidget *e_msg_composer_hdrs_new (BonoboUIComponent *uic, int visible_mask, int visible_flags);
-
-void e_msg_composer_hdrs_to_message (EMsgComposerHdrs *hdrs,
- CamelMimeMessage *msg);
-
-void e_msg_composer_hdrs_to_redirect (EMsgComposerHdrs *hdrs,
- CamelMimeMessage *msg);
-
-
-void e_msg_composer_hdrs_set_from_account (EMsgComposerHdrs *hdrs,
- const char *account_name);
-void e_msg_composer_hdrs_set_reply_to (EMsgComposerHdrs *hdrs,
- const char *reply_to);
-void e_msg_composer_hdrs_set_to (EMsgComposerHdrs *hdrs,
- EDestination **to_destv);
-void e_msg_composer_hdrs_set_cc (EMsgComposerHdrs *hdrs,
- EDestination **cc_destv);
-void e_msg_composer_hdrs_set_bcc (EMsgComposerHdrs *hdrs,
- EDestination **bcc_destv);
-void e_msg_composer_hdrs_set_post_to (EMsgComposerHdrs *hdrs,
- const char *post_to);
-void e_msg_composer_hdrs_set_post_to_list (EMsgComposerHdrs *hdrs,
- GList *urls);
-void e_msg_composer_hdrs_set_post_to_base (EMsgComposerHdrs *hdrs,
- const char *base,
- const char *post_to);
-void e_msg_composer_hdrs_set_subject (EMsgComposerHdrs *hdrs,
- const char *subject);
-
-CamelInternetAddress *e_msg_composer_hdrs_get_from (EMsgComposerHdrs *hdrs);
-CamelInternetAddress *e_msg_composer_hdrs_get_reply_to (EMsgComposerHdrs *hdrs);
-
-EDestination **e_msg_composer_hdrs_get_to (EMsgComposerHdrs *hdrs);
-EDestination **e_msg_composer_hdrs_get_cc (EMsgComposerHdrs *hdrs);
-EDestination **e_msg_composer_hdrs_get_bcc (EMsgComposerHdrs *hdrs);
-EDestination **e_msg_composer_hdrs_get_recipients (EMsgComposerHdrs *hdrs);
-const char *e_msg_composer_hdrs_get_subject (EMsgComposerHdrs *hdrs);
-
-/* list of gchar* uris; this data is to be freed by the caller */
-GList *e_msg_composer_hdrs_get_post_to (EMsgComposerHdrs *hdrs);
-
-GtkWidget *e_msg_composer_hdrs_get_from_hbox (EMsgComposerHdrs *hdrs);
-GtkWidget *e_msg_composer_hdrs_get_from_omenu (EMsgComposerHdrs *hdrs);
-GtkWidget *e_msg_composer_hdrs_get_reply_to_entry (EMsgComposerHdrs *hdrs);
-GtkWidget *e_msg_composer_hdrs_get_to_entry (EMsgComposerHdrs *hdrs);
-GtkWidget *e_msg_composer_hdrs_get_cc_entry (EMsgComposerHdrs *hdrs);
-GtkWidget *e_msg_composer_hdrs_get_bcc_entry (EMsgComposerHdrs *hdrs);
-GtkWidget *e_msg_composer_hdrs_get_post_to_label (EMsgComposerHdrs *hdrs);
-GtkWidget *e_msg_composer_hdrs_get_subject_entry (EMsgComposerHdrs *hdrs);
-
-void e_msg_composer_hdrs_set_visible_mask (EMsgComposerHdrs *hdrs,
- int visible_mask);
-void e_msg_composer_hdrs_set_visible (EMsgComposerHdrs *hdrs,
- int visible_flags);
-
-#ifdef _cplusplus
-}
-#endif /* _cplusplus */
-
-
-#endif /* __E_MSG_COMPOSER_HDRS_H__ */
diff --git a/composer/e-msg-composer-select-file.c b/composer/e-msg-composer-select-file.c
deleted file mode 100644
index 687660f0de..0000000000
--- a/composer/e-msg-composer-select-file.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/*
- * Authors: Ettore Perazzoli <ettore@ximian.com>
- * Jeffrey Stedfast <fejj@ximian.com>
- * Michael Zucchi <notzed@ximian.com>
- *
- * Copyright 2002 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtkbox.h>
-#include <gtk/gtkcheckbutton.h>
-#include <gtk/gtkmain.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkversion.h>
-
-#ifdef USE_GTKFILECHOOSER
-#include <gtk/gtkfilechooser.h>
-#include <gtk/gtkfilechooserdialog.h>
-#include <gtk/gtkstock.h>
-#else
-#include <gtk/gtkfilesel.h>
-#endif
-
-#include <libgnomeui/gnome-uidefs.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "e-msg-composer-select-file.h"
-#include <e-util/e-icon-factory.h>
-
-enum {
- SELECTOR_MODE_MULTI = (1 << 0),
- SELECTOR_MODE_SAVE = (1 << 1)
-};
-
-static GtkWidget*
-run_selector(EMsgComposer *composer, const char *title, guint32 flags, gboolean *showinline_p)
-{
- GtkWidget *selection;
- GtkWidget *showinline = NULL;
- char *path;
- GList *icon_list;
-
- path = g_object_get_data ((GObject *) composer, "attach_path");
-
-#ifdef USE_GTKFILECHOOSER
- if (flags & SELECTOR_MODE_SAVE)
- selection = gtk_file_chooser_dialog_new (title,
- NULL,
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_SAVE, GTK_RESPONSE_OK,
- NULL);
- else
- selection = gtk_file_chooser_dialog_new (title,
- NULL,
- GTK_FILE_CHOOSER_ACTION_OPEN,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OPEN, GTK_RESPONSE_OK,
- NULL);
-
- gtk_dialog_set_default_response (GTK_DIALOG (selection), GTK_RESPONSE_OK);
-
- if ((flags & SELECTOR_MODE_SAVE) == 0)
- gtk_file_chooser_set_select_multiple ((GtkFileChooser *) selection, (flags & SELECTOR_MODE_MULTI));
-
- /* restore last path used */
- if (!path)
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (selection), g_get_home_dir ());
- else
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (selection), path);
-
- if (showinline_p) {
- showinline = gtk_check_button_new_with_label (_("Suggest automatic display of attachment"));
- gtk_widget_show (showinline);
- gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (selection), showinline);
- }
-#else
- selection = gtk_file_selection_new (title);
-
- gtk_file_selection_set_select_multiple ((GtkFileSelection *) selection, (flags & SELECTOR_MODE_MULTI));
-
- /* restore last path used */
- if (!path) {
- path = g_strdup_printf ("%s/", g_get_home_dir ());
- gtk_file_selection_set_filename (GTK_FILE_SELECTION (selection), path);
- g_free (path);
- } else {
- gtk_file_selection_set_filename (GTK_FILE_SELECTION (selection), path);
- }
-
- if (showinline_p) {
- showinline = gtk_check_button_new_with_label (_("Suggest automatic display of attachment"));
- gtk_widget_show (showinline);
- gtk_box_pack_end (GTK_BOX (GTK_FILE_SELECTION (selection)->main_vbox), showinline, FALSE, FALSE, 4);
- }
-#endif
-
- gtk_window_set_transient_for ((GtkWindow *) selection, (GtkWindow *) composer);
- gtk_window_set_wmclass ((GtkWindow *) selection, "fileselection", "Evolution:composer");
- gtk_window_set_modal ((GtkWindow *) selection, TRUE);
-
- icon_list = e_icon_factory_get_icon_list ("stock_mail-compose");
- if (icon_list) {
- gtk_window_set_icon_list (GTK_WINDOW (selection), icon_list);
- g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
- g_list_free (icon_list);
- }
-
- if (gtk_dialog_run ((GtkDialog *) selection) == GTK_RESPONSE_OK) {
- if (showinline_p)
- *showinline_p = gtk_toggle_button_get_active ((GtkToggleButton *) showinline);
-
-#ifdef USE_GTKFILECHOOSER
- path = g_path_get_dirname (gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (selection)));
-#else
- path = g_path_get_dirname (gtk_file_selection_get_filename (GTK_FILE_SELECTION (selection)));
-#endif
-
- g_object_set_data_full ((GObject *) composer, "attach_path", g_strdup_printf ("%s/", path), g_free);
- g_free (path);
- } else {
- gtk_widget_destroy (selection);
- selection = NULL;
- }
-
- return selection;
-}
-
-/**
- * e_msg_composer_select_file:
- * @composer: a composer
- * @title: the title for the file selection dialog box
- * @save_mode: whether the file selection box should be shown in save mode or not
- *
- * This pops up a file selection dialog box with the given title
- * and allows the user to select a file.
- *
- * Return value: the selected filename, or %NULL if the user
- * cancelled.
- **/
-char *
-e_msg_composer_select_file (EMsgComposer *composer, const char *title, gboolean save_mode)
-{
- guint32 flags = save_mode ? SELECTOR_MODE_SAVE : SELECTOR_MODE_MULTI;
- GtkWidget *selection;
- char *name = NULL;
-
- selection = run_selector (composer, title, flags, NULL);
- if (selection) {
-#ifdef USE_GTKFILECHOOSER
- name = g_strdup (gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (selection)));
-#else
- name = g_strdup (gtk_file_selection_get_filename (GTK_FILE_SELECTION (selection)));
-#endif
- gtk_widget_destroy (selection);
- }
-
- return name;
-}
-
-GPtrArray *
-e_msg_composer_select_file_attachments (EMsgComposer *composer, gboolean *showinline_p)
-{
- GtkWidget *selection;
- GPtrArray *list = NULL;
-
- selection = run_selector (composer, _("Attach file(s)"), SELECTOR_MODE_MULTI, showinline_p);
-
- if (selection) {
-#ifdef USE_GTKFILECHOOSER
- GSList *files, *l, *n;
-
- if ((l = files = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER (selection)))) {
- list = g_ptr_array_new ();
-
- while (l) {
- n = l->next;
- g_ptr_array_add (list, l->data);
- g_slist_free_1 (l);
- l = n;
- }
- }
-#else
- char **files;
- int i;
-
- if ((files = gtk_file_selection_get_selections (GTK_FILE_SELECTION (selection)))) {
- list = g_ptr_array_new ();
- for (i = 0; files[i]; i++)
- g_ptr_array_add (list, files[i]);
-
- g_free (files);
- }
-#endif
-
- gtk_widget_destroy (selection);
- }
-
- return list;
-}
-
diff --git a/composer/e-msg-composer-select-file.h b/composer/e-msg-composer-select-file.h
deleted file mode 100644
index 6a6ad886df..0000000000
--- a/composer/e-msg-composer-select-file.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-msg-composer-select-file.c
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * published by the Free Software Foundation; either version 2 of the
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef E_MSG_COMPOSER_SELECT_FILE_H
-#define E_MSG_COMPOSER_SELECT_FILE_H
-
-#include "e-msg-composer.h"
-
-char *e_msg_composer_select_file (EMsgComposer *composer,
- const char *title,
- gboolean save_mode);
-
-GPtrArray *e_msg_composer_select_file_attachments (EMsgComposer *composer,
- gboolean *inline_p);
-
-#endif /* E_MSG_COMPOSER_SELECT_FILE_H */
diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c
deleted file mode 100644
index 20772a3afa..0000000000
--- a/composer/e-msg-composer.c
+++ /dev/null
@@ -1,5637 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-msg-composer.c
- *
- * Copyright (C) 1999-2003 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * published by the Free Software Foundation; either version 2 of the
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Authors:
- * Ettore Perazzoli (ettore@ximian.com)
- * Jeffrey Stedfast (fejj@ximian.com)
- * Miguel de Icaza (miguel@ximian.com)
- * Radek Doulik (rodo@ximian.com)
- *
- */
-
-/*
-
- TODO
-
- - Somehow users should be able to see if any file(s) are attached even when
- the attachment bar is not shown.
-
- Should use EventSources to keep track of global changes made to configuration
- values. Right now it ignores the problem olympically. Miguel.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#define SMIME_SUPPORTED 1
-
-#include <string.h>
-#include <stdlib.h>
-#include <dirent.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <ctype.h>
-
-#include <gtk/gtkoptionmenu.h>
-#include <gtk/gtkscrolledwindow.h>
-#include <gtk/gtkmain.h>
-#include <gtk/gtkmenuitem.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkstock.h>
-#include <gtk/gtkdnd.h>
-#include <gtk/gtkvbox.h>
-#include <gtk/gtkhbox.h>
-#include <gtk/gtkimage.h>
-
-#include <gconf/gconf.h>
-#include <gconf/gconf-client.h>
-
-#include <libgnome/gnome-exec.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/gnome-uidefs.h>
-#include <libgnomeui/gnome-window-icon.h>
-
-#include <bonobo/bonobo-exception.h>
-#include <bonobo/bonobo-moniker-util.h>
-#include <bonobo/bonobo-stream-memory.h>
-#include <bonobo/bonobo-ui-util.h>
-#include <bonobo/bonobo-widget.h>
-
-#include <libgnomevfs/gnome-vfs.h>
-
-#include <gtkhtml/htmlselection.h>
-
-#include <glade/glade.h>
-
-#include <libedataserver/e-iconv.h>
-#include <gal/e-text/e-entry.h>
-
-#include "e-util/e-dialog-utils.h"
-#include "e-util/e-signature-list.h"
-#include "widgets/misc/e-charset-picker.h"
-#include "widgets/misc/e-expander.h"
-#include "widgets/misc/e-error.h"
-
-#include <camel/camel-session.h>
-#include <camel/camel-charset-map.h>
-#include <camel/camel-stream-filter.h>
-#include <camel/camel-mime-filter-charset.h>
-#include <camel/camel-stream-mem.h>
-#include <camel/camel-stream-fs.h>
-#include <camel/camel-mime-filter-tohtml.h>
-#include <camel/camel-multipart-signed.h>
-#include <camel/camel-multipart-encrypted.h>
-#include <camel/camel-string-utils.h>
-#include <camel/camel-cipher-context.h>
-#if defined (HAVE_NSS) && defined (SMIME_SUPPORTED)
-#include <camel/camel-smime-context.h>
-#endif
-
-#include "mail/em-utils.h"
-#include "mail/em-composer-utils.h"
-#include "mail/mail-config.h"
-#include "mail/mail-crypto.h"
-#include "mail/mail-tools.h"
-#include "mail/mail-ops.h"
-#include "mail/mail-mt.h"
-#include "mail/mail-session.h"
-#include "mail/em-popup.h"
-#include "mail/em-menu.h"
-
-#include "e-msg-composer.h"
-#include "e-msg-composer-attachment-bar.h"
-#include "e-msg-composer-hdrs.h"
-#include "e-msg-composer-select-file.h"
-
-#include "evolution-shell-component-utils.h"
-#include <e-util/e-icon-factory.h>
-
-#include "Editor.h"
-#include "listener.h"
-
-#define GNOME_GTKHTML_EDITOR_CONTROL_ID "OAFIID:GNOME_GtkHTML_Editor:" GTKHTML_API_VERSION
-
-#define d(x)
-
-#define _PRIVATE(o) (g_type_instance_get_private ((GTypeInstance *)o, e_msg_composer_get_type()))
-
-typedef struct _EMsgComposerPrivate {
- EMMenu *menu;
-} EMsgComposerPrivate;
-
-enum {
- SEND,
- SAVE_DRAFT,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-enum {
- DND_TYPE_MESSAGE_RFC822,
- DND_TYPE_X_UID_LIST,
- DND_TYPE_TEXT_URI_LIST,
- DND_TYPE_NETSCAPE_URL,
- DND_TYPE_TEXT_VCARD,
- DND_TYPE_TEXT_CALENDAR,
-};
-
-static GtkTargetEntry drop_types[] = {
- { "message/rfc822", 0, DND_TYPE_MESSAGE_RFC822 },
- { "x-uid-list", 0, DND_TYPE_X_UID_LIST },
- { "text/uri-list", 0, DND_TYPE_TEXT_URI_LIST },
- { "_NETSCAPE_URL", 0, DND_TYPE_NETSCAPE_URL },
- { "text/x-vcard", 0, DND_TYPE_TEXT_VCARD },
- { "text/calendar", 0, DND_TYPE_TEXT_CALENDAR },
-};
-
-#define num_drop_types (sizeof (drop_types) / sizeof (drop_types[0]))
-
-static struct {
- char *target;
- GdkAtom atom;
- guint32 actions;
-} drag_info[] = {
- { "message/rfc822", 0, GDK_ACTION_COPY },
- { "x-uid-list", 0, GDK_ACTION_ASK|GDK_ACTION_MOVE|GDK_ACTION_COPY },
- { "text/uri-list", 0, GDK_ACTION_COPY },
- { "_NETSCAPE_URL", 0, GDK_ACTION_COPY },
- { "text/x-vcard", 0, GDK_ACTION_COPY },
- { "text/calendar", 0, GDK_ACTION_COPY },
-};
-
-static const char *emc_draft_format_names[] = { "pgp-sign", "pgp-encrypt", "smime-sign", "smime-encrypt" };
-
-
-/* The parent class. */
-static BonoboWindowClass *parent_class = NULL;
-
-/* All the composer windows open, for bookkeeping purposes. */
-static GSList *all_composers = NULL;
-
-
-/* local prototypes */
-static GList *add_recipients (GList *list, const char *recips);
-
-static void handle_mailto (EMsgComposer *composer, const char *mailto);
-
-/* used by e_msg_composer_add_message_attachments() */
-static void add_attachments_from_multipart (EMsgComposer *composer, CamelMultipart *multipart,
- gboolean just_inlines, int depth);
-
-/* used by e_msg_composer_new_with_message() */
-static void handle_multipart (EMsgComposer *composer, CamelMultipart *multipart, int depth);
-static void handle_multipart_alternative (EMsgComposer *composer, CamelMultipart *multipart, int depth);
-static void handle_multipart_encrypted (EMsgComposer *composer, CamelMultipart *multipart, int depth);
-static void handle_multipart_signed (EMsgComposer *composer, CamelMultipart *multipart, int depth);
-
-static void set_editor_signature (EMsgComposer *composer);
-
-
-static EDestination**
-destination_list_to_vector_sized (GList *list, int n)
-{
- EDestination **destv;
- int i = 0;
-
- if (n == -1)
- n = g_list_length (list);
-
- if (n == 0)
- return NULL;
-
- destv = g_new (EDestination *, n + 1);
- while (list != NULL && i < n) {
- destv[i] = E_DESTINATION (list->data);
- list->data = NULL;
- i++;
- list = g_list_next (list);
- }
- destv[i] = NULL;
-
- return destv;
-}
-
-static EDestination**
-destination_list_to_vector (GList *list)
-{
- return destination_list_to_vector_sized (list, -1);
-}
-
-static GByteArray *
-get_text (Bonobo_PersistStream persist, char *format)
-{
- BonoboStream *stream;
- BonoboStreamMem *stream_mem;
- CORBA_Environment ev;
- GByteArray *text;
-
- CORBA_exception_init (&ev);
-
- stream = bonobo_stream_mem_create (NULL, 0, FALSE, TRUE);
- Bonobo_PersistStream_save (persist, (Bonobo_Stream)bonobo_object_corba_objref (BONOBO_OBJECT (stream)),
- format, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("Exception getting mail '%s'",
- bonobo_exception_get_text (&ev));
- return NULL;
- }
-
- CORBA_exception_free (&ev);
-
- stream_mem = BONOBO_STREAM_MEM (stream);
- text = g_byte_array_new ();
- g_byte_array_append (text, stream_mem->buffer, stream_mem->pos);
- bonobo_object_unref (BONOBO_OBJECT (stream));
-
- return text;
-}
-
-#define LINE_LEN 72
-
-static CamelTransferEncoding
-best_encoding (GByteArray *buf, const char *charset)
-{
- char *in, *out, outbuf[256], *ch;
- size_t inlen, outlen;
- int status, count = 0;
- iconv_t cd;
-
- if (!charset)
- return -1;
-
- cd = e_iconv_open (charset, "utf-8");
- if (cd == (iconv_t) -1)
- return -1;
-
- in = buf->data;
- inlen = buf->len;
- do {
- out = outbuf;
- outlen = sizeof (outbuf);
- status = e_iconv (cd, (const char **) &in, &inlen, &out, &outlen);
- for (ch = out - 1; ch >= outbuf; ch--) {
- if ((unsigned char)*ch > 127)
- count++;
- }
- } while (status == (size_t) -1 && errno == E2BIG);
- e_iconv_close (cd);
-
- if (status == (size_t) -1)
- return -1;
-
- if (count == 0)
- return CAMEL_TRANSFER_ENCODING_7BIT;
- else if (count <= buf->len * 0.17)
- return CAMEL_TRANSFER_ENCODING_QUOTEDPRINTABLE;
- else
- return CAMEL_TRANSFER_ENCODING_BASE64;
-}
-
-static char *
-composer_get_default_charset_setting (void)
-{
- GConfClient *gconf;
- const char *locale;
- char *charset;
-
- gconf = gconf_client_get_default ();
- charset = gconf_client_get_string (gconf, "/apps/evolution/mail/composer/charset", NULL);
-
- if (!charset || charset[0] == '\0') {
- g_free (charset);
- charset = gconf_client_get_string (gconf, "/apps/evolution/mail/format/charset", NULL);
- if (charset && charset[0] == '\0') {
- g_free (charset);
- charset = NULL;
- }
- }
-
- g_object_unref (gconf);
-
- if (!charset && (locale = e_iconv_locale_charset ()))
- charset = g_strdup (locale);
-
- return charset ? charset : g_strdup ("us-ascii");
-}
-
-static char *
-best_charset (GByteArray *buf, const char *default_charset, CamelTransferEncoding *encoding)
-{
- char *charset;
-
- /* First try US-ASCII */
- *encoding = best_encoding (buf, "US-ASCII");
- if (*encoding == CAMEL_TRANSFER_ENCODING_7BIT)
- return NULL;
-
- /* Next try the user-specified charset for this message */
- *encoding = best_encoding (buf, default_charset);
- if (*encoding != -1)
- return g_strdup (default_charset);
-
- /* Now try the user's default charset from the mail config */
- charset = composer_get_default_charset_setting ();
- *encoding = best_encoding (buf, charset);
- if (*encoding != -1)
- return charset;
-
- /* Try to find something that will work */
- if (!(charset = (char *) camel_charset_best (buf->data, buf->len))) {
- *encoding = CAMEL_TRANSFER_ENCODING_7BIT;
- return NULL;
- }
-
- *encoding = best_encoding (buf, charset);
-
- return g_strdup (charset);
-}
-
-static gboolean
-clear_inline_images (gpointer key, gpointer value, gpointer user_data)
-{
- g_free (key);
- camel_object_unref (value);
-
- return TRUE;
-}
-
-static void
-clear_current_images (EMsgComposer *composer)
-{
- g_list_free (composer->current_images);
- composer->current_images = NULL;
-}
-
-static gboolean
-clear_url (gpointer key, gpointer value, gpointer user_data)
-{
- g_free (key);
-
- return TRUE;
-}
-
-void
-e_msg_composer_clear_inlined_table (EMsgComposer *composer)
-{
- g_hash_table_foreach_remove (composer->inline_images, clear_inline_images, NULL);
- g_hash_table_foreach_remove (composer->inline_images_by_url, clear_url, NULL);
-}
-
-static void
-add_inlined_images (EMsgComposer *composer, CamelMultipart *multipart)
-{
- GList *d = composer->current_images;
- GHashTable *added;
-
- added = g_hash_table_new (g_direct_hash, g_direct_equal);
- while (d) {
- CamelMimePart *part = d->data;
-
- if (!g_hash_table_lookup (added, part)) {
- camel_multipart_add_part (multipart, part);
- g_hash_table_insert (added, part, part);
- }
- d = d->next;
- }
- g_hash_table_destroy (added);
-}
-
-/* This functions builds a CamelMimeMessage for the message that the user has
- * composed in `composer'.
- */
-static CamelMimeMessage *
-build_message (EMsgComposer *composer, gboolean save_html_object_data)
-{
- EMsgComposerAttachmentBar *attachment_bar =
- E_MSG_COMPOSER_ATTACHMENT_BAR (composer->attachment_bar);
- EMsgComposerHdrs *hdrs = E_MSG_COMPOSER_HDRS (composer->hdrs);
- CamelDataWrapper *plain, *html, *current;
- CamelTransferEncoding plain_encoding;
- const char *iconv_charset = NULL;
- GPtrArray *recipients = NULL;
- CamelMultipart *body = NULL;
- CamelContentType *type;
- CamelMimeMessage *new;
- CamelStream *stream;
- CamelMimePart *part;
- CamelException ex;
- GByteArray *data;
- char *charset;
- int i;
-
- if (composer->persist_stream_interface == CORBA_OBJECT_NIL)
- return NULL;
-
- /* evil kludgy hack for Redirect */
- if (composer->redirect) {
- e_msg_composer_hdrs_to_redirect (hdrs, composer->redirect);
- camel_object_ref (composer->redirect);
- return composer->redirect;
- }
-
- new = camel_mime_message_new ();
- e_msg_composer_hdrs_to_message (hdrs, new);
- for (i = 0; i < composer->extra_hdr_names->len; i++) {
- camel_medium_add_header (CAMEL_MEDIUM (new),
- composer->extra_hdr_names->pdata[i],
- composer->extra_hdr_values->pdata[i]);
- }
-
- if (composer->mime_body) {
- plain_encoding = CAMEL_TRANSFER_ENCODING_7BIT;
- for (i = 0; composer->mime_body[i]; i++) {
- if ((unsigned char) composer->mime_body[i] > 127) {
- plain_encoding = CAMEL_TRANSFER_ENCODING_QUOTEDPRINTABLE;
- break;
- }
- }
- data = g_byte_array_new ();
- g_byte_array_append (data, composer->mime_body, strlen (composer->mime_body));
- type = camel_content_type_decode (composer->mime_type);
- } else {
- data = get_text (composer->persist_stream_interface, "text/plain");
- if (!data) {
- /* The component has probably died */
- camel_object_unref (CAMEL_OBJECT (new));
- return NULL;
- }
-
- /* FIXME: we may want to do better than this... */
- charset = best_charset (data, composer->charset, &plain_encoding);
- type = camel_content_type_new ("text", "plain");
- if ((charset = best_charset (data, composer->charset, &plain_encoding))) {
- camel_content_type_set_param (type, "charset", charset);
- iconv_charset = e_iconv_charset_name (charset);
- g_free (charset);
- }
- }
-
- stream = camel_stream_mem_new_with_byte_array (data);
-
- /* convert the stream to the appropriate charset */
- if (iconv_charset && g_ascii_strcasecmp (iconv_charset, "UTF-8") != 0) {
- CamelStreamFilter *filter_stream;
- CamelMimeFilterCharset *filter;
-
- filter_stream = camel_stream_filter_new_with_stream (stream);
- camel_object_unref (stream);
-
- stream = (CamelStream *) filter_stream;
- filter = camel_mime_filter_charset_new_convert ("UTF-8", iconv_charset);
- camel_stream_filter_add (filter_stream, (CamelMimeFilter *) filter);
- camel_object_unref (filter);
- }
-
- /* construct the content object */
- plain = camel_data_wrapper_new ();
- camel_data_wrapper_construct_from_stream (plain, stream);
- camel_object_unref (stream);
-
- camel_data_wrapper_set_mime_type_field (plain, type);
- camel_content_type_unref (type);
-
- if (composer->send_html) {
- CORBA_Environment ev;
- clear_current_images (composer);
-
- if (save_html_object_data) {
- CORBA_exception_init (&ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "save-data-on", &ev);
- }
- data = get_text (composer->persist_stream_interface, "text/html");
- if (save_html_object_data) {
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "save-data-off", &ev);
- CORBA_exception_free (&ev);
- }
-
- if (!data) {
- /* The component has probably died */
- camel_object_unref (new);
- camel_object_unref (plain);
- return NULL;
- }
-
- html = camel_data_wrapper_new ();
-
- stream = camel_stream_mem_new_with_byte_array (data);
- camel_data_wrapper_construct_from_stream (html, stream);
- camel_object_unref (stream);
- camel_data_wrapper_set_mime_type (html, "text/html; charset=utf-8");
-
- /* Build the multipart/alternative */
- body = camel_multipart_new ();
- camel_data_wrapper_set_mime_type (CAMEL_DATA_WRAPPER (body),
- "multipart/alternative");
- camel_multipart_set_boundary (body, NULL);
-
- part = camel_mime_part_new ();
- camel_medium_set_content_object (CAMEL_MEDIUM (part), plain);
- camel_object_unref (plain);
- camel_mime_part_set_encoding (part, plain_encoding);
- camel_multipart_add_part (body, part);
- camel_object_unref (part);
-
- part = camel_mime_part_new ();
- camel_medium_set_content_object (CAMEL_MEDIUM (part), html);
- camel_object_unref (html);
- camel_multipart_add_part (body, part);
- camel_object_unref (part);
-
- /* If there are inlined images, construct a
- * multipart/related containing the
- * multipart/alternative and the images.
- */
- if (composer->current_images) {
- CamelMultipart *html_with_images;
-
- html_with_images = camel_multipart_new ();
- camel_data_wrapper_set_mime_type (
- CAMEL_DATA_WRAPPER (html_with_images),
- "multipart/related; type=\"multipart/alternative\"");
- camel_multipart_set_boundary (html_with_images, NULL);
-
- part = camel_mime_part_new ();
- camel_medium_set_content_object (CAMEL_MEDIUM (part), CAMEL_DATA_WRAPPER (body));
- camel_object_unref (body);
- camel_multipart_add_part (html_with_images, part);
- camel_object_unref (part);
-
- add_inlined_images (composer, html_with_images);
- clear_current_images (composer);
-
- current = CAMEL_DATA_WRAPPER (html_with_images);
- } else
- current = CAMEL_DATA_WRAPPER (body);
- } else
- current = plain;
-
- if (e_msg_composer_attachment_bar_get_num_attachments (attachment_bar)) {
- CamelMultipart *multipart = camel_multipart_new ();
-
- if (composer->is_alternative) {
- camel_data_wrapper_set_mime_type (CAMEL_DATA_WRAPPER (multipart),
- "multipart/alternative");
- }
-
- /* Generate a random boundary. */
- camel_multipart_set_boundary (multipart, NULL);
-
- part = camel_mime_part_new ();
- camel_medium_set_content_object (CAMEL_MEDIUM (part), current);
- if (current == plain)
- camel_mime_part_set_encoding (part, plain_encoding);
- camel_object_unref (current);
- camel_multipart_add_part (multipart, part);
- camel_object_unref (part);
-
- e_msg_composer_attachment_bar_to_multipart (attachment_bar, multipart, composer->charset);
-
- if (composer->is_alternative) {
- int i;
-
- for (i = camel_multipart_get_number (multipart); i > 1; i--) {
- part = camel_multipart_get_part (multipart, i - 1);
- camel_medium_remove_header (CAMEL_MEDIUM (part), "Content-Disposition");
- }
- }
-
- current = CAMEL_DATA_WRAPPER (multipart);
- }
-
- camel_exception_init (&ex);
-
- /* Setup working recipient list if we're encrypting */
- if (composer->pgp_encrypt
-#if defined (HAVE_NSS) && defined (SMIME_SUPPORTED)
- || composer->smime_encrypt
-#endif
- ) {
- int i, j;
- const char *types[] = { CAMEL_RECIPIENT_TYPE_TO, CAMEL_RECIPIENT_TYPE_CC, CAMEL_RECIPIENT_TYPE_BCC };
-
- recipients = g_ptr_array_new();
- for (i=0; i < sizeof(types)/sizeof(types[0]); i++) {
- const CamelInternetAddress *addr;
- const char *address;
-
- addr = camel_mime_message_get_recipients(new, types[i]);
- for (j=0;camel_internet_address_get(addr, j, NULL, &address); j++)
- g_ptr_array_add(recipients, g_strdup (address));
-
- }
- }
-
- if (composer->pgp_sign || composer->pgp_encrypt) {
- const char *pgp_userid;
- CamelInternetAddress *from = NULL;
- CamelCipherContext *cipher;
-
- part = camel_mime_part_new ();
- camel_medium_set_content_object (CAMEL_MEDIUM (part), current);
- if (current == plain)
- camel_mime_part_set_encoding (part, plain_encoding);
- camel_object_unref (current);
-
- if (hdrs->account && hdrs->account->pgp_key && *hdrs->account->pgp_key) {
- pgp_userid = hdrs->account->pgp_key;
- } else {
- from = e_msg_composer_hdrs_get_from(hdrs);
- camel_internet_address_get(from, 0, NULL, &pgp_userid);
- }
-
- if (composer->pgp_sign) {
- CamelMimePart *npart = camel_mime_part_new();
-
- cipher = mail_crypto_get_pgp_cipher_context(hdrs->account);
- camel_cipher_sign(cipher, pgp_userid, CAMEL_CIPHER_HASH_SHA1, part, npart, &ex);
- camel_object_unref(cipher);
-
- if (camel_exception_is_set(&ex)) {
- camel_object_unref(npart);
- goto exception;
- }
-
- camel_object_unref(part);
- part = npart;
- }
-
- if (composer->pgp_encrypt) {
- CamelMimePart *npart = camel_mime_part_new();
-
- /* check to see if we should encrypt to self, NB gets removed immediately after use */
- if (hdrs->account && hdrs->account->pgp_encrypt_to_self && pgp_userid)
- g_ptr_array_add (recipients, g_strdup (pgp_userid));
-
- cipher = mail_crypto_get_pgp_cipher_context (hdrs->account);
- camel_cipher_encrypt(cipher, pgp_userid, recipients, part, npart, &ex);
- camel_object_unref (cipher);
-
- if (hdrs->account && hdrs->account->pgp_encrypt_to_self && pgp_userid)
- g_ptr_array_set_size(recipients, recipients->len - 1);
-
- if (camel_exception_is_set (&ex)) {
- camel_object_unref(npart);
- goto exception;
- }
-
- camel_object_unref (part);
- part = npart;
- }
-
- if (from)
- camel_object_unref (from);
-
- current = camel_medium_get_content_object (CAMEL_MEDIUM (part));
- camel_object_ref (current);
- camel_object_unref (part);
- }
-
-#if defined (HAVE_NSS) && defined (SMIME_SUPPORTED)
- if (composer->smime_sign || composer->smime_encrypt) {
- CamelInternetAddress *from = NULL;
- CamelCipherContext *cipher;
-
- part = camel_mime_part_new();
- camel_medium_set_content_object((CamelMedium *)part, current);
- if (current == plain)
- camel_mime_part_set_encoding(part, plain_encoding);
- camel_object_unref(current);
-
- if (composer->smime_sign
- && (hdrs->account == NULL || hdrs->account->smime_sign_key == NULL || hdrs->account->smime_sign_key[0] == 0)) {
- camel_exception_set (&ex, CAMEL_EXCEPTION_SYSTEM,
- _("Cannot sign outgoing message: No signing certificate set for this account"));
- goto exception;
- }
-
- if (composer->smime_encrypt
- && (hdrs->account == NULL || hdrs->account->smime_sign_key == NULL || hdrs->account->smime_sign_key[0] == 0)) {
- camel_exception_set (&ex, CAMEL_EXCEPTION_SYSTEM,
- _("Cannot encrypt outgoing message: No encryption certificate set for this account"));
- goto exception;
- }
-
- if (composer->smime_sign) {
- CamelMimePart *npart = camel_mime_part_new();
-
- cipher = camel_smime_context_new(session);
-
- /* if we're also encrypting, envelope-sign rather than clear-sign */
- if (composer->smime_encrypt) {
- camel_smime_context_set_sign_mode((CamelSMIMEContext *)cipher, CAMEL_SMIME_SIGN_ENVELOPED);
- camel_smime_context_set_encrypt_key((CamelSMIMEContext *)cipher, TRUE, hdrs->account->smime_encrypt_key);
- } else if (hdrs->account && hdrs->account->smime_encrypt_key && *hdrs->account->smime_encrypt_key) {
- camel_smime_context_set_encrypt_key((CamelSMIMEContext *)cipher, TRUE, hdrs->account->smime_encrypt_key);
- }
-
- camel_cipher_sign(cipher, hdrs->account->smime_sign_key, CAMEL_CIPHER_HASH_SHA1, part, npart, &ex);
- camel_object_unref(cipher);
-
- if (camel_exception_is_set(&ex)) {
- camel_object_unref(npart);
- goto exception;
- }
-
- camel_object_unref(part);
- part = npart;
- }
-
- if (composer->smime_encrypt) {
- /* check to see if we should encrypt to self, NB removed after use */
- if (hdrs->account->smime_encrypt_to_self)
- g_ptr_array_add(recipients, g_strdup (hdrs->account->smime_encrypt_key));
-
- cipher = camel_smime_context_new(session);
- camel_smime_context_set_encrypt_key((CamelSMIMEContext *)cipher, TRUE, hdrs->account->smime_encrypt_key);
-
- camel_cipher_encrypt(cipher, NULL, recipients, part, (CamelMimePart *)new, &ex);
- camel_object_unref(cipher);
-
- if (camel_exception_is_set(&ex))
- goto exception;
-
- if (hdrs->account->smime_encrypt_to_self)
- g_ptr_array_set_size(recipients, recipients->len - 1);
- }
-
- if (from)
- camel_object_unref(from);
-
- /* we replaced the message directly, we don't want to do reparenting foo */
- if (composer->smime_encrypt) {
- camel_object_unref(part);
- goto skip_content;
- } else {
- current = camel_medium_get_content_object((CamelMedium *)part);
- camel_object_ref(current);
- camel_object_unref(part);
- }
- }
-#endif /* HAVE_NSS */
-
- camel_medium_set_content_object (CAMEL_MEDIUM (new), current);
- if (current == plain)
- camel_mime_part_set_encoding (CAMEL_MIME_PART (new), plain_encoding);
- camel_object_unref (current);
-
-skip_content:
-
- if (recipients) {
- for (i=0; i<recipients->len; i++)
- g_free(recipients->pdata[i]);
- g_ptr_array_free(recipients, TRUE);
- }
-
- /* Attach whether this message was written in HTML */
- camel_medium_set_header (CAMEL_MEDIUM (new), "X-Evolution-Format",
- composer->send_html ? "text/html" : "text/plain");
-
- return new;
-
- exception:
-
- if (part != CAMEL_MIME_PART (new))
- camel_object_unref (part);
-
- camel_object_unref (new);
-
- if (ex.id != CAMEL_EXCEPTION_USER_CANCEL) {
- e_error_run((GtkWindow *)composer, "mail-composer:no-build-message",
- camel_exception_get_description(&ex), NULL);
- }
-
- camel_exception_clear (&ex);
-
- if (recipients) {
- for (i=0; i<recipients->len; i++)
- g_free(recipients->pdata[i]);
- g_ptr_array_free(recipients, TRUE);
- }
-
- return NULL;
-}
-
-
-static char *
-get_file_content (EMsgComposer *composer, const char *file_name, gboolean want_html, guint flags, gboolean warn)
-{
- CamelStreamFilter *filtered_stream;
- CamelStreamMem *memstream;
- CamelMimeFilter *html, *charenc;
- CamelStream *stream;
- GByteArray *buffer;
- char *charset;
- char *content;
- int fd;
-
- fd = open (file_name, O_RDONLY);
- if (fd == -1) {
- if (warn)
- e_error_run((GtkWindow *)composer, "mail-composer:no-sig-file",
- file_name, g_strerror(errno), NULL);
- return g_strdup ("");
- }
-
- stream = camel_stream_fs_new_with_fd (fd);
-
- if (want_html) {
- filtered_stream = camel_stream_filter_new_with_stream (stream);
- camel_object_unref (stream);
-
- html = camel_mime_filter_tohtml_new (flags, 0);
- camel_stream_filter_add (filtered_stream, html);
- camel_object_unref (html);
-
- stream = (CamelStream *) filtered_stream;
- }
-
- memstream = (CamelStreamMem *) camel_stream_mem_new ();
- buffer = g_byte_array_new ();
- camel_stream_mem_set_byte_array (memstream, buffer);
-
- camel_stream_write_to_stream (stream, (CamelStream *) memstream);
- camel_object_unref (stream);
-
- /* The newer signature UI saves signatures in UTF-8, but we still need to check that
- the signature is valid UTF-8 because it is possible that the user imported a
- signature file that is in his/her locale charset. If it's not in UTF-8 and not in
- the charset the composer is in (or their default mail charset) then fuck it,
- there's nothing we can do. */
- if (buffer->len && !g_utf8_validate (buffer->data, buffer->len, NULL)) {
- stream = (CamelStream *) memstream;
- memstream = (CamelStreamMem *) camel_stream_mem_new ();
- camel_stream_mem_set_byte_array (memstream, g_byte_array_new ());
-
- filtered_stream = camel_stream_filter_new_with_stream (stream);
- camel_object_unref (stream);
-
- charset = composer && composer->charset ? composer->charset : NULL;
- charset = charset ? g_strdup (charset) : composer_get_default_charset_setting ();
- if ((charenc = (CamelMimeFilter *) camel_mime_filter_charset_new_convert (charset, "UTF-8"))) {
- camel_stream_filter_add (filtered_stream, charenc);
- camel_object_unref (charenc);
- }
-
- g_free (charset);
-
- camel_stream_write_to_stream ((CamelStream *) filtered_stream, (CamelStream *) memstream);
- camel_object_unref (filtered_stream);
- g_byte_array_free (buffer, TRUE);
-
- buffer = memstream->buffer;
- }
-
- camel_object_unref (memstream);
-
- g_byte_array_append (buffer, "", 1);
- content = buffer->data;
- g_byte_array_free (buffer, FALSE);
-
- return content;
-}
-
-char *
-e_msg_composer_get_sig_file_content (const char *sigfile, gboolean in_html)
-{
- if (!sigfile || !*sigfile) {
- return NULL;
- }
-
- return get_file_content (NULL, sigfile, !in_html,
- CAMEL_MIME_FILTER_TOHTML_PRESERVE_8BIT |
- CAMEL_MIME_FILTER_TOHTML_CONVERT_URLS |
- CAMEL_MIME_FILTER_TOHTML_CONVERT_ADDRESSES |
- CAMEL_MIME_FILTER_TOHTML_CONVERT_SPACES,
- FALSE);
-}
-
-static void
-prepare_engine (EMsgComposer *composer)
-{
- CORBA_Environment ev;
-
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- /* printf ("prepare_engine\n"); */
-
- CORBA_exception_init (&ev);
- composer->editor_engine = (GNOME_GtkHTML_Editor_Engine) Bonobo_Unknown_queryInterface
- (bonobo_widget_get_objref (BONOBO_WIDGET (composer->editor)), "IDL:GNOME/GtkHTML/Editor/Engine:1.0", &ev);
- if ((composer->editor_engine != CORBA_OBJECT_NIL) && (ev._major == CORBA_NO_EXCEPTION)) {
-
- /* printf ("trying set listener\n"); */
- composer->editor_listener = BONOBO_OBJECT (listener_new (composer));
- if (composer->editor_listener != NULL)
- GNOME_GtkHTML_Editor_Engine__set_listener (composer->editor_engine,
- (GNOME_GtkHTML_Editor_Listener)
- bonobo_object_dup_ref
- (bonobo_object_corba_objref (composer->editor_listener),
- &ev),
- &ev);
-
- if ((ev._major != CORBA_NO_EXCEPTION) || (composer->editor_listener == NULL)) {
- CORBA_Environment err_ev;
-
- CORBA_exception_init (&err_ev);
-
- Bonobo_Unknown_unref (composer->editor_engine, &err_ev);
- CORBA_Object_release (composer->editor_engine, &err_ev);
-
- CORBA_exception_free (&err_ev);
-
- composer->editor_engine = CORBA_OBJECT_NIL;
- g_warning ("Can't establish Editor Listener\n");
- }
- } else {
- composer->editor_engine = CORBA_OBJECT_NIL;
- g_warning ("Can't get Editor Engine\n");
- }
-
- CORBA_exception_free (&ev);
-}
-
-static char *
-encode_signature_name (const char *name)
-{
- const char *s;
- char *ename, *e;
- int len = 0;
-
- s = name;
- while (*s) {
- len ++;
- if (*s == '"' || *s == '.' || *s == '=')
- len ++;
- s ++;
- }
-
- ename = g_new (gchar, len + 1);
-
- s = name;
- e = ename;
- while (*s) {
- if (*s == '"') {
- *e = '.';
- e ++;
- *e = '1';
- e ++;
- } else if (*s == '=') {
- *e = '.';
- e ++;
- *e = '2';
- e ++;
- } else {
- *e = *s;
- e ++;
- }
- if (*s == '.') {
- *e = '.';
- e ++;
- }
- s ++;
- }
- *e = 0;
-
- return ename;
-}
-
-static char *
-decode_signature_name (const char *name)
-{
- const char *s;
- char *dname, *d;
- int len = 0;
-
- s = name;
- while (*s) {
- len ++;
- if (*s == '.') {
- s ++;
- if (!*s || !(*s == '.' || *s == '1' || *s == '2'))
- return NULL;
- }
- s ++;
- }
-
- dname = g_new (char, len + 1);
-
- s = name;
- d = dname;
- while (*s) {
- if (*s == '.') {
- s ++;
- if (!*s || !(*s == '.' || *s == '1' || *s == '2')) {
- g_free (dname);
- return NULL;
- }
- if (*s == '1')
- *d = '"';
- else if (*s == '2')
- *d = '=';
- else
- *d = '.';
- } else
- *d = *s;
- d ++;
- s ++;
- }
- *d = 0;
-
- return dname;
-}
-
-#define CONVERT_SPACES CAMEL_MIME_FILTER_TOHTML_CONVERT_SPACES
-
-static char *
-get_signature_html (EMsgComposer *composer)
-{
- char *text = NULL, *html = NULL;
- gboolean format_html;
-
- if (!composer->signature)
- return NULL;
-
- if (!composer->signature->autogen) {
- if (!composer->signature->filename)
- return NULL;
-
- format_html = composer->signature->html;
-
- if (composer->signature->script) {
- text = mail_config_signature_run_script (composer->signature->filename);
- } else {
- text = e_msg_composer_get_sig_file_content (composer->signature->filename, format_html);
- }
- } else {
- EAccountIdentity *id;
- char *organization;
- char *address;
- char *name;
-
- id = E_MSG_COMPOSER_HDRS (composer->hdrs)->account->id;
- address = id->address ? camel_text_to_html (id->address, CONVERT_SPACES, 0) : NULL;
- name = id->name ? camel_text_to_html (id->name, CONVERT_SPACES, 0) : NULL;
- organization = id->organization ? camel_text_to_html (id->organization, CONVERT_SPACES, 0) : NULL;
-
- text = g_strdup_printf ("-- <BR>%s%s%s%s%s%s%s%s",
- name ? name : "",
- (address && *address) ? " &lt;<A HREF=\"mailto:" : "",
- address ? address : "",
- (address && *address) ? "\">" : "",
- address ? address : "",
- (address && *address) ? "</A>&gt;" : "",
- (organization && *organization) ? "<BR>" : "",
- organization ? organization : "");
- g_free (address);
- g_free (name);
- g_free (organization);
- format_html = TRUE;
- }
-
- /* printf ("text: %s\n", text); */
- if (text) {
- char *encoded_uid = NULL;
-
- if (composer->signature)
- encoded_uid = encode_signature_name (composer->signature->uid);
-
- /* The signature dash convention ("-- \n") is specified in the
- * "Son of RFC 1036": http://www.chemie.fu-berlin.de/outerspace/netnews/son-of-1036.html,
- * section 4.3.2.
- */
- html = g_strdup_printf ("<!--+GtkHTML:<DATA class=\"ClueFlow\" key=\"signature\" value=\"1\">-->"
- "<!--+GtkHTML:<DATA class=\"ClueFlow\" key=\"signature_name\" value=\"uid:%s\">-->"
- "<TABLE WIDTH=\"100%%\" CELLSPACING=\"0\" CELLPADDING=\"0\"><TR><TD>"
- "%s%s%s%s"
- "</TD></TR></TABLE>",
- encoded_uid ? encoded_uid : "",
- format_html ? "" : "<PRE>\n",
- format_html || (!strncmp ("-- \n", text, 4) || strstr(text, "\n-- \n")) ? "" : "-- \n",
- text,
- format_html ? "" : "</PRE>\n");
- g_free (text);
- g_free (encoded_uid);
- text = html;
- }
-
- return text;
-}
-
-static void
-set_editor_text(EMsgComposer *composer, const char *text, ssize_t len, int set_signature, int pad_signature)
-{
- Bonobo_PersistStream persist;
- BonoboStream *stream;
- BonoboWidget *editor;
- CORBA_Environment ev;
- Bonobo_Unknown object;
-
- g_return_if_fail (composer->persist_stream_interface != CORBA_OBJECT_NIL);
-
- persist = composer->persist_stream_interface;
-
- editor = BONOBO_WIDGET (composer->editor);
-
- CORBA_exception_init (&ev);
-
- if (len == -1)
- len = strlen (text);
-
- stream = bonobo_stream_mem_create (text, len, TRUE, FALSE);
- object = bonobo_object_corba_objref (BONOBO_OBJECT (stream));
- Bonobo_PersistStream_load (persist, (Bonobo_Stream) object, "text/html", &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- /* FIXME. Some error message. */
- bonobo_object_unref (BONOBO_OBJECT (stream));
- CORBA_exception_free (&ev);
- return;
- }
-
- CORBA_exception_free (&ev);
-
- bonobo_object_unref (BONOBO_OBJECT (stream));
-
- if (set_signature)
- e_msg_composer_show_sig_file (composer);
-}
-
-/* Commands. */
-
-static void
-show_attachments (EMsgComposer *composer,
- gboolean show)
-{
- e_expander_set_expanded (E_EXPANDER (composer->attachment_expander), show);
-}
-
-static void
-save (EMsgComposer *composer, const char *default_filename)
-{
- CORBA_Environment ev;
- char *filename;
- int fd;
-
- if (default_filename != NULL)
- filename = g_strdup (default_filename);
- else
- filename = e_msg_composer_select_file (composer, _("Save as..."), TRUE);
-
- if (filename == NULL)
- return;
-
- /* check to see if we already have the file and that we can create it */
- if ((fd = open (filename, O_RDONLY | O_CREAT | O_EXCL, 0777)) == -1) {
- int resp, errnosav = errno;
- struct stat st;
-
- if (stat (filename, &st) == 0 && S_ISREG (st.st_mode)) {
- resp = e_error_run((GtkWindow *)composer, E_ERROR_ASK_FILE_EXISTS_OVERWRITE,
- filename, NULL);
- if (resp != GTK_RESPONSE_OK) {
- g_free (filename);
- return;
- }
- } else {
- e_error_run((GtkWindow *)composer, E_ERROR_NO_SAVE_FILE,
- filename, g_strerror(errnosav));
- g_free (filename);
- return;
- }
- } else
- close (fd);
-
- CORBA_exception_init (&ev);
-
- Bonobo_PersistFile_save (composer->persist_file_interface, filename, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- e_error_run((GtkWindow *)composer, E_ERROR_NO_SAVE_FILE,
- filename, _("Unknown reason"));
- } else {
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "saved", &ev);
- e_msg_composer_unset_autosaved (composer);
- }
- CORBA_exception_free (&ev);
-
- g_free (filename);
-}
-
-static void
-load (EMsgComposer *composer, const char *file_name)
-{
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
-
- Bonobo_PersistFile_load (composer->persist_file_interface, file_name, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION)
- e_error_run((GtkWindow *)composer, E_ERROR_NO_LOAD_FILE,
- file_name, _("Unknown reason"), NULL);
-
- CORBA_exception_free (&ev);
-}
-
-#define AUTOSAVE_SEED ".evolution-composer.autosave-XXXXXX"
-#define AUTOSAVE_INTERVAL 60000
-
-typedef struct _AutosaveManager AutosaveManager;
-struct _AutosaveManager {
- GHashTable *table;
- guint id;
- gboolean ask;
-};
-
-static AutosaveManager *am = NULL;
-static void autosave_manager_start (AutosaveManager *am);
-static void autosave_manager_stop (AutosaveManager *am);
-
-static gboolean
-autosave_save_draft (EMsgComposer *composer)
-{
- CamelMimeMessage *message;
- CamelStream *stream;
- char *file;
- int fd, camelfd;
- gboolean success = TRUE;
-
- if (!e_msg_composer_is_dirty (composer))
- return TRUE;
-
- fd = composer->autosave_fd;
- file = composer->autosave_file;
-
- if (fd == -1) {
- /* This code is odd, the fd is opened elsewhere but a failure is ignored */
- e_error_run((GtkWindow *)composer, "mail-composer:no-autosave",
- file, _("Could not open file"), NULL);
- return FALSE;
- }
-
- message = e_msg_composer_get_message_draft (composer);
-
- if (message == NULL) {
- e_error_run((GtkWindow *)composer, "mail-composer:no-autosave",
- file, _("Unable to retrieve message from editor"), NULL);
- return FALSE;
- }
-
- if (lseek (fd, (off_t)0, SEEK_SET) == -1
- || ftruncate (fd, (off_t)0) == -1
- || (camelfd = dup(fd)) == -1) {
- camel_object_unref (message);
- e_error_run((GtkWindow *)composer, "mail-composer:no-autosave",
- file, g_strerror(errno), NULL);
- return FALSE;
- }
-
- /* this does an lseek so we don't have to */
- stream = camel_stream_fs_new_with_fd (camelfd);
- if (camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (message), stream) == -1
- || camel_stream_close (CAMEL_STREAM (stream)) == -1) {
- e_error_run((GtkWindow *)composer, "mail-composer:no-autosave",
- file, g_strerror(errno), NULL);
- success = FALSE;
- } else {
- CORBA_Environment ev;
- CORBA_exception_init (&ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "saved", &ev);
- CORBA_exception_free (&ev);
- e_msg_composer_unset_changed (composer);
- e_msg_composer_set_autosaved (composer);
- }
-
- camel_object_unref (stream);
-
- camel_object_unref (message);
-
- return success;
-}
-
-static EMsgComposer *
-autosave_load_draft (const char *filename)
-{
- CamelStream *stream;
- CamelMimeMessage *msg;
- EMsgComposer *composer;
-
- g_return_val_if_fail (filename != NULL, NULL);
-
- g_warning ("autosave load filename = \"%s\"", filename);
-
- if (!(stream = camel_stream_fs_new_with_name (filename, O_RDONLY, 0)))
- return NULL;
-
- msg = camel_mime_message_new ();
- camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (msg), stream);
- camel_object_unref (stream);
-
- composer = e_msg_composer_new_with_message (msg);
- if (composer) {
- if (autosave_save_draft (composer))
- unlink (filename);
-
- g_signal_connect (GTK_OBJECT (composer), "send",
- G_CALLBACK (em_utils_composer_send_cb), NULL);
-
- g_signal_connect (GTK_OBJECT (composer), "save-draft",
- G_CALLBACK (em_utils_composer_save_draft_cb), NULL);
-
- gtk_widget_show (GTK_WIDGET (composer));
- }
-
- return composer;
-}
-
-static gboolean
-autosave_is_owned (AutosaveManager *am, const char *file)
-{
- return g_hash_table_lookup (am->table, file) != NULL;
-}
-
-static void
-autosave_manager_query_load_orphans (AutosaveManager *am, GtkWindow *parent)
-{
- DIR *dir;
- struct dirent *d;
- GSList *match = NULL;
- gint len = strlen (AUTOSAVE_SEED);
- gint load = FALSE;
-
- dir = opendir (g_get_home_dir());
- if (!dir) {
- return;
- }
-
- while ((d = readdir (dir))) {
- if ((!strncmp (d->d_name, AUTOSAVE_SEED, len - 6))
- && (strlen (d->d_name) == len)
- && (!autosave_is_owned (am, d->d_name))) {
- char *filename = g_strdup_printf ("%s/%s", g_get_home_dir(), d->d_name);
- struct stat st;
-
- /*
- * check if the file has any length, It is a valid case if it doesn't
- * so we simply don't ask then.
- */
- if (stat (filename, &st) == -1 || st.st_size == 0) {
- unlink (filename);
- g_free (filename);
- continue;
- }
- match = g_slist_prepend (match, filename);
- }
- }
-
- closedir (dir);
-
- if (match != NULL)
- load = e_error_run(parent, "mail-composer:recover-autosave", NULL) == GTK_RESPONSE_YES;
-
- while (match != NULL) {
- GSList *next = match->next;
- char *filename = match->data;
- EMsgComposer *composer;
-
- if (load) {
- composer = autosave_load_draft (filename);
- } else {
- unlink (filename);
- }
-
- g_free (filename);
- g_slist_free_1 (match);
- match = next;
- }
-}
-
-static void
-autosave_run_foreach_cb (gpointer key, gpointer value, gpointer data)
-{
- EMsgComposer *composer = E_MSG_COMPOSER (value);
-
- if (composer->enable_autosave)
- autosave_save_draft (composer);
-}
-
-static gint
-autosave_run (gpointer data)
-{
- AutosaveManager *am = data;
-
- g_hash_table_foreach (am->table, (GHFunc)autosave_run_foreach_cb, am);
-
- autosave_manager_stop (am);
- autosave_manager_start (am);
-
- return FALSE;
-}
-
-static gboolean
-autosave_init_file (EMsgComposer *composer)
-{
- if (composer->autosave_file == NULL) {
- composer->autosave_file = g_strdup_printf ("%s/%s", g_get_home_dir(), AUTOSAVE_SEED);
- composer->autosave_fd = mkstemp (composer->autosave_file);
- return TRUE;
- }
- return FALSE;
-}
-
-static void
-autosave_manager_start (AutosaveManager *am)
-{
- if (am->id == 0)
- am->id = g_timeout_add (AUTOSAVE_INTERVAL, autosave_run, am);
-}
-
-static void
-autosave_manager_stop (AutosaveManager *am)
-{
- if (am->id) {
- g_source_remove (am->id);
- am->id = 0;
- }
-}
-
-static AutosaveManager *
-autosave_manager_new ()
-{
- AutosaveManager *am;
-
- am = g_new (AutosaveManager, 1);
- am->table = g_hash_table_new (g_str_hash, g_str_equal);
- am->id = 0;
- am->ask = TRUE;
-
- return am;
-}
-
-static void
-autosave_manager_register (AutosaveManager *am, EMsgComposer *composer)
-{
- char *key;
-
- g_return_if_fail (composer != NULL);
-
- if (autosave_init_file (composer)) {
- key = g_path_get_basename (composer->autosave_file);
- g_hash_table_insert (am->table, key, composer);
- if (am->ask) {
- /* keep recursion out of our bedrooms. */
- am->ask = FALSE;
- autosave_manager_query_load_orphans (am, (GtkWindow *)composer);
- am->ask = TRUE;
- }
- }
- autosave_manager_start (am);
-}
-
-static void
-autosave_manager_unregister (AutosaveManager *am, EMsgComposer *composer)
-{
- char *key, *oldkey;
- void *olddata;
-
- if (!composer->autosave_file)
- return;
-
- key = g_path_get_basename(composer->autosave_file);
- if (g_hash_table_lookup_extended(am->table, key, (void **)&oldkey, &olddata)) {
- g_hash_table_remove(am->table, oldkey);
- g_free(oldkey);
- g_free(key);
- }
-
- /* only remove the file if we can successfully save it */
- /* FIXME this test could probably be more efficient */
- if (autosave_save_draft (composer))
- unlink (composer->autosave_file);
-
- close (composer->autosave_fd);
- g_free (composer->autosave_file);
- composer->autosave_file = NULL;
-
- if (g_hash_table_size (am->table) == 0)
- autosave_manager_stop (am);
-}
-
-static void
-menu_file_save_draft_cb (BonoboUIComponent *uic, void *data, const char *path)
-{
- g_signal_emit (data, signals[SAVE_DRAFT], 0, FALSE);
- e_msg_composer_unset_changed (E_MSG_COMPOSER (data));
- e_msg_composer_unset_autosaved (E_MSG_COMPOSER (data));
-}
-
-/* Exit dialog. (Displays a "Save composition to 'Drafts' before exiting?" warning before actually exiting.) */
-
-static void
-do_exit (EMsgComposer *composer)
-{
- const char *subject;
- int button;
-
- if (!e_msg_composer_is_dirty (composer) && !e_msg_composer_is_autosaved (composer)) {
- gtk_widget_destroy (GTK_WIDGET (composer));
- return;
- }
-
- gdk_window_raise (GTK_WIDGET (composer)->window);
-
- subject = e_msg_composer_hdrs_get_subject (E_MSG_COMPOSER_HDRS (composer->hdrs));
-
- button = e_error_run((GtkWindow *)composer, "mail-composer:exit-unsaved",
- subject && subject[0] ? subject : _("Untitled Message"), NULL);
-
- switch (button) {
- case GTK_RESPONSE_YES:
- /* Save */
- g_signal_emit (GTK_OBJECT (composer), signals[SAVE_DRAFT], 0, TRUE);
- e_msg_composer_unset_changed (composer);
- e_msg_composer_unset_autosaved (composer);
- break;
- case GTK_RESPONSE_NO:
- /* Don't save */
- gtk_widget_destroy (GTK_WIDGET (composer));
- break;
- case GTK_RESPONSE_CANCEL:
- break;
- }
-}
-
-/* Menu callbacks. */
-
-static void
-menu_file_open_cb (BonoboUIComponent *uic,
- void *data,
- const char *path)
-{
- EMsgComposer *composer;
- char *file_name;
-
- composer = E_MSG_COMPOSER (data);
-
- file_name = e_msg_composer_select_file (composer, _("Open file"), FALSE);
- if (file_name == NULL)
- return;
-
- load (composer, file_name);
-
- g_free (file_name);
-}
-
-static void
-menu_file_save_cb (BonoboUIComponent *uic,
- void *data,
- const char *path)
-{
- EMsgComposer *composer;
- CORBA_char *file_name;
- CORBA_Environment ev;
-
- composer = E_MSG_COMPOSER (data);
-
- CORBA_exception_init (&ev);
-
- file_name = Bonobo_PersistFile_getCurrentFile (composer->persist_file_interface, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- save (composer, NULL);
- } else {
- save (composer, file_name);
- CORBA_free (file_name);
- }
- CORBA_exception_free (&ev);
-}
-
-static void
-menu_file_save_as_cb (BonoboUIComponent *uic,
- void *data,
- const char *path)
-{
- EMsgComposer *composer;
-
- composer = E_MSG_COMPOSER (data);
-
- save (composer, NULL);
-}
-
-static void
-menu_file_send_cb (BonoboUIComponent *uic,
- void *data,
- const char *path)
-{
- g_signal_emit (GTK_OBJECT (data), signals[SEND], 0);
-}
-
-static void
-menu_file_close_cb (BonoboUIComponent *uic,
- void *data,
- const char *path)
-{
- EMsgComposer *composer;
-
- composer = E_MSG_COMPOSER (data);
- do_exit (composer);
-}
-
-static void
-menu_file_add_attachment_cb (BonoboUIComponent *uic,
- void *data,
- const char *path)
-{
- EMsgComposer *composer;
-
- composer = E_MSG_COMPOSER (data);
-
- e_msg_composer_attachment_bar_attach
- (E_MSG_COMPOSER_ATTACHMENT_BAR (composer->attachment_bar),
- NULL);
-}
-
-static void
-menu_edit_cut_cb (BonoboUIComponent *uic, void *data, const char *path)
-{
- EMsgComposer *composer = data;
-
- g_return_if_fail (composer->focused_entry != NULL);
-
- if (GTK_IS_ENTRY (composer->focused_entry)) {
- gtk_editable_cut_clipboard (GTK_EDITABLE (composer->focused_entry));
- } else {
- /* happy happy joy joy, an EEntry. */
- g_assert_not_reached ();
- }
-}
-
-static void
-menu_edit_copy_cb (BonoboUIComponent *uic, void *data, const char *path)
-{
- EMsgComposer *composer = data;
-
- g_return_if_fail (composer->focused_entry != NULL);
-
- if (GTK_IS_ENTRY (composer->focused_entry)) {
- gtk_editable_copy_clipboard (GTK_EDITABLE (composer->focused_entry));
- } else {
- /* happy happy joy joy, an EEntry. */
- g_assert_not_reached ();
- }
-}
-
-static void
-menu_edit_paste_cb (BonoboUIComponent *uic, void *data, const char *path)
-{
- EMsgComposer *composer = data;
-
- g_return_if_fail (composer->focused_entry != NULL);
-
- if (GTK_IS_ENTRY (composer->focused_entry)) {
- gtk_editable_paste_clipboard (GTK_EDITABLE (composer->focused_entry));
- } else {
- /* happy happy joy joy, an EEntry. */
- g_assert_not_reached ();
- }
-}
-
-static void
-menu_edit_select_all_cb (BonoboUIComponent *uic, void *data, const char *path)
-{
- EMsgComposer *composer = data;
-
- g_return_if_fail (composer->focused_entry != NULL);
-
- if (GTK_IS_ENTRY (composer->focused_entry)) {
- gtk_editable_set_position (GTK_EDITABLE (composer->focused_entry), -1);
- gtk_editable_select_region (GTK_EDITABLE (composer->focused_entry), 0, -1);
- } else {
- /* happy happy joy joy, an EEntry. */
- g_assert_not_reached ();
- }
-}
-
-static void
-menu_edit_delete_all_cb (BonoboUIComponent *uic, void *data, const char *path)
-{
- CORBA_Environment ev;
- EMsgComposer *composer;
-
- composer = E_MSG_COMPOSER (data);
- CORBA_exception_init (&ev);
-
- GNOME_GtkHTML_Editor_Engine_undoBegin (composer->editor_engine, "Delete all but signature", "Undelete all", &ev);
- GNOME_GtkHTML_Editor_Engine_freeze (composer->editor_engine, &ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "disable-selection", &ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "text-default-color", &ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "bold-off", &ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "italic-off", &ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "underline-off", &ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "strikeout-off", &ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "select-all", &ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "delete", &ev);
- GNOME_GtkHTML_Editor_Engine_setParagraphData (composer->editor_engine, "signature", "0", &ev);
- GNOME_GtkHTML_Editor_Engine_setParagraphData (composer->editor_engine, "orig", "0", &ev);
- e_msg_composer_show_sig_file (composer);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "style-normal", &ev);
- GNOME_GtkHTML_Editor_Engine_thaw (composer->editor_engine, &ev);
- GNOME_GtkHTML_Editor_Engine_undoEnd (composer->editor_engine, &ev);
-
- CORBA_exception_free (&ev);
- /* printf ("delete all\n"); */
-}
-
-static void
-menu_view_attachments_activate_cb (BonoboUIComponent *component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- gpointer user_data)
-
-{
- gboolean new_state;
-
- if (type != Bonobo_UIComponent_STATE_CHANGED)
- return;
-
- new_state = atoi (state);
-
- e_msg_composer_show_attachments (E_MSG_COMPOSER (user_data), new_state);
-}
-
-static void
-menu_format_html_cb (BonoboUIComponent *component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- gpointer user_data)
-
-{
- if (type != Bonobo_UIComponent_STATE_CHANGED)
- return;
-
- e_msg_composer_set_send_html (E_MSG_COMPOSER (user_data), atoi (state));
-}
-
-static void
-menu_security_pgp_sign_cb (BonoboUIComponent *component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- gpointer composer)
-
-{
- if (type != Bonobo_UIComponent_STATE_CHANGED)
- return;
-
- e_msg_composer_set_pgp_sign (E_MSG_COMPOSER (composer), atoi (state));
-}
-
-static void
-menu_security_pgp_encrypt_cb (BonoboUIComponent *component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- gpointer composer)
-
-{
- if (type != Bonobo_UIComponent_STATE_CHANGED)
- return;
-
- e_msg_composer_set_pgp_encrypt (E_MSG_COMPOSER (composer), atoi (state));
-}
-
-static void
-menu_security_smime_sign_cb (BonoboUIComponent *component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- gpointer composer)
-
-{
- if (type != Bonobo_UIComponent_STATE_CHANGED)
- return;
-
- e_msg_composer_set_smime_sign (E_MSG_COMPOSER (composer), atoi (state));
-}
-
-static void
-menu_security_smime_encrypt_cb (BonoboUIComponent *component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- gpointer composer)
-
-{
- if (type != Bonobo_UIComponent_STATE_CHANGED)
- return;
-
- e_msg_composer_set_smime_encrypt (E_MSG_COMPOSER (composer), atoi (state));
-}
-
-
-static void
-menu_view_from_cb (BonoboUIComponent *component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- gpointer user_data)
-{
- if (type != Bonobo_UIComponent_STATE_CHANGED)
- return;
-
- e_msg_composer_set_view_from (E_MSG_COMPOSER (user_data), atoi (state));
-}
-
-static void
-menu_view_replyto_cb (BonoboUIComponent *component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- gpointer user_data)
-{
- if (type != Bonobo_UIComponent_STATE_CHANGED)
- return;
-
- e_msg_composer_set_view_replyto (E_MSG_COMPOSER (user_data), atoi (state));
-}
-
-static void
-menu_view_to_cb (BonoboUIComponent *component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- gpointer user_data)
-{
- if (type != Bonobo_UIComponent_STATE_CHANGED)
- return;
-
- e_msg_composer_set_view_to (E_MSG_COMPOSER (user_data), atoi (state));
-}
-
-static void
-menu_view_postto_cb (BonoboUIComponent *component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- gpointer user_data)
-{
- if (type != Bonobo_UIComponent_STATE_CHANGED)
- return;
-
- e_msg_composer_set_view_postto (E_MSG_COMPOSER (user_data), atoi (state));
-}
-
-static void
-menu_view_cc_cb (BonoboUIComponent *component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- gpointer user_data)
-{
- if (type != Bonobo_UIComponent_STATE_CHANGED)
- return;
-
- e_msg_composer_set_view_cc (E_MSG_COMPOSER (user_data), atoi (state));
-}
-
-static void
-menu_view_bcc_cb (BonoboUIComponent *component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- gpointer user_data)
-{
- if (type != Bonobo_UIComponent_STATE_CHANGED)
- return;
-
- e_msg_composer_set_view_bcc (E_MSG_COMPOSER (user_data), atoi (state));
-}
-
-static void
-menu_changed_charset_cb (BonoboUIComponent *component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- gpointer user_data)
-{
- if (type != Bonobo_UIComponent_STATE_CHANGED)
- return;
-
- if (atoi (state)) {
- /* Charset menu names are "Charset-%s" where %s is the charset name */
- g_free (E_MSG_COMPOSER (user_data)->charset);
- E_MSG_COMPOSER (user_data)->charset = g_strdup (path + strlen ("Charset-"));
- }
-}
-
-
-static BonoboUIVerb verbs [] = {
-
- BONOBO_UI_VERB ("FileOpen", menu_file_open_cb),
- BONOBO_UI_VERB ("FileSave", menu_file_save_cb),
- BONOBO_UI_VERB ("FileSaveAs", menu_file_save_as_cb),
- BONOBO_UI_VERB ("FileSaveDraft", menu_file_save_draft_cb),
- BONOBO_UI_VERB ("FileClose", menu_file_close_cb),
-
- BONOBO_UI_VERB ("FileAttach", menu_file_add_attachment_cb),
-
- BONOBO_UI_VERB ("FileSend", menu_file_send_cb),
-
- BONOBO_UI_VERB ("DeleteAll", menu_edit_delete_all_cb),
-
- BONOBO_UI_VERB_END
-};
-
-static EPixmap pixcache [] = {
- E_PIXMAP ("/Toolbar/FileAttach", "stock_attach", E_ICON_SIZE_LARGE_TOOLBAR),
- E_PIXMAP ("/Toolbar/FileSend", "stock_mail-send", E_ICON_SIZE_LARGE_TOOLBAR),
-
-/* E_PIXMAP ("/menu/Insert/FileAttach", "stock_attach", E_ICON_SIZE_LARGE_TOOLBAR), */
- E_PIXMAP ("/commands/FileSend", "stock_mail-send", E_ICON_SIZE_MENU),
- E_PIXMAP ("/commands/FileSave", "stock_save", E_ICON_SIZE_MENU),
- E_PIXMAP ("/commands/FileSaveAs", "stock_save-as", E_ICON_SIZE_MENU),
-
- E_PIXMAP_END
-};
-
-
-static void
-signature_activate_cb (GtkWidget *menu, EMsgComposer *composer)
-{
- GtkWidget *active;
- ESignature *sig;
-
- active = gtk_menu_get_active (GTK_MENU (menu));
- sig = g_object_get_data ((GObject *) active, "sig");
-
- if (composer->signature != sig) {
- composer->signature = sig;
- e_msg_composer_show_sig_file (composer);
- }
-}
-
-static void
-signature_added (ESignatureList *signatures, ESignature *sig, EMsgComposer *composer)
-{
- GtkWidget *menu, *item;
-
- menu = gtk_option_menu_get_menu (composer->sig_menu);
-
- if (sig->autogen)
- item = gtk_menu_item_new_with_label (_("Autogenerated"));
- else
- item = gtk_menu_item_new_with_label (sig->name);
- g_object_set_data ((GObject *) item, "sig", sig);
- gtk_widget_show (item);
-
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
-}
-
-static void
-signature_removed (ESignatureList *signatures, ESignature *sig, EMsgComposer *composer)
-{
- GtkWidget *menu;
- ESignature *cur;
- GList *items;
-
- if (composer->signature == sig) {
- composer->signature = NULL;
- e_msg_composer_show_sig_file (composer);
- }
-
- menu = gtk_option_menu_get_menu (composer->sig_menu);
- items = GTK_MENU_SHELL (menu)->children;
- while (items != NULL) {
- cur = g_object_get_data (items->data, "sig");
- if (cur == sig) {
- gtk_widget_destroy (items->data);
- break;
- }
- items = items->next;
- }
-}
-
-static void
-menu_item_set_label (GtkMenuItem *item, const char *label)
-{
- GtkWidget *widget;
-
- widget = gtk_bin_get_child ((GtkBin *) item);
- if (GTK_IS_LABEL (widget))
- gtk_label_set_text ((GtkLabel *) widget, label);
-}
-
-static void
-signature_changed (ESignatureList *signatures, ESignature *sig, EMsgComposer *composer)
-{
- GtkWidget *menu;
- ESignature *cur;
- GList *items;
-
- menu = gtk_option_menu_get_menu (composer->sig_menu);
- items = GTK_MENU_SHELL (menu)->children;
- while (items != NULL) {
- cur = g_object_get_data (items->data, "sig");
- if (cur == sig) {
- menu_item_set_label (items->data, sig->name);
- break;
- }
- items = items->next;
- }
-}
-
-static void
-sig_select_item (EMsgComposer *composer)
-{
- ESignature *cur;
- GtkWidget *menu;
- GList *items;
- int i = 0;
-
- if (!composer->signature) {
- gtk_option_menu_set_history (composer->sig_menu, 0);
- return;
- }
-
- menu = gtk_option_menu_get_menu (composer->sig_menu);
- items = GTK_MENU_SHELL (menu)->children;
- while (items != NULL) {
- cur = g_object_get_data ((GObject *) items->data, "sig");
- if (cur == composer->signature) {
- gtk_option_menu_set_history (composer->sig_menu, i);
- return;
- }
- items = items->next;
- i++;
- }
-}
-
-static void
-setup_signatures_menu (EMsgComposer *composer)
-{
- GtkWidget *hbox, *hspace, *label;
- ESignatureList *signatures;
- GtkWidget *menu, *item;
- ESignature *sig;
- EIterator *it;
-
- hbox = e_msg_composer_hdrs_get_from_hbox (E_MSG_COMPOSER_HDRS (composer->hdrs));
-
- label = gtk_label_new_with_mnemonic (_("Si_gnature:"));
- gtk_widget_show (label);
-
- composer->sig_menu = (GtkOptionMenu *) gtk_option_menu_new ();
-
- gtk_label_set_mnemonic_widget ((GtkLabel *) label, (GtkWidget *)composer->sig_menu);
-
- gtk_box_pack_end_defaults (GTK_BOX (hbox), (GtkWidget *) composer->sig_menu);
- gtk_box_pack_end (GTK_BOX (hbox), label, FALSE, TRUE, 0);
- hspace = gtk_hbox_new (FALSE, 0);
- gtk_widget_show (hspace);
- gtk_box_pack_start (GTK_BOX (hbox), hspace, FALSE, FALSE, 0);
-
- menu = gtk_menu_new ();
- gtk_widget_show (menu);
- gtk_option_menu_set_menu (composer->sig_menu, menu);
-
- item = gtk_menu_item_new_with_label (_("None"));
- gtk_widget_show (item);
-
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
-
- signatures = mail_config_get_signatures ();
- it = e_list_get_iterator ((EList *) signatures);
-
- while (e_iterator_is_valid (it)) {
- sig = (ESignature *) e_iterator_get (it);
- signature_added (signatures, sig, composer);
- e_iterator_next (it);
- }
-
- g_object_unref (it);
-
- g_signal_connect (menu, "selection-done", G_CALLBACK (signature_activate_cb), composer);
-
- gtk_widget_show ((GtkWidget *) composer->sig_menu);
-
- composer->sig_added_id = g_signal_connect (signatures, "signature-added", G_CALLBACK (signature_added), composer);
- composer->sig_removed_id = g_signal_connect (signatures, "signature-removed", G_CALLBACK (signature_removed), composer);
- composer->sig_changed_id = g_signal_connect (signatures, "signature-changed", G_CALLBACK (signature_changed), composer);
-}
-
-static void
-setup_ui (EMsgComposer *composer)
-{
- EMMenuTargetWidget *target;
- EMsgComposerPrivate *p = _PRIVATE(composer);
- BonoboUIContainer *container;
- gboolean hide_smime;
- char *charset;
-
- container = bonobo_window_get_ui_container (BONOBO_WINDOW (composer));
-
- composer->uic = bonobo_ui_component_new_default ();
- /* FIXME: handle bonobo exceptions */
- bonobo_ui_component_set_container (composer->uic, bonobo_object_corba_objref (BONOBO_OBJECT (container)), NULL);
-
- bonobo_ui_component_add_verb_list_with_data (composer->uic, verbs, composer);
-
- bonobo_ui_component_freeze (composer->uic, NULL);
-
- bonobo_ui_util_set_ui (composer->uic, PREFIX,
- EVOLUTION_UIDIR "/evolution-message-composer.xml",
- "evolution-message-composer", NULL);
-
- e_pixmaps_update (composer->uic, pixcache);
-
- /* Populate the Charset Encoding menu and default it to whatever the user
- chose as his default charset in the mailer */
- charset = composer_get_default_charset_setting ();
- e_charset_picker_bonobo_ui_populate (composer->uic, "/menu/Edit/EncodingPlaceholder",
- charset,
- menu_changed_charset_cb,
- composer);
- g_free (charset);
-
- /* Format -> HTML */
- bonobo_ui_component_set_prop (
- composer->uic, "/commands/FormatHtml",
- "state", composer->send_html ? "1" : "0", NULL);
- bonobo_ui_component_add_listener (
- composer->uic, "FormatHtml",
- menu_format_html_cb, composer);
-
- /* View/From */
- bonobo_ui_component_set_prop (
- composer->uic, "/commands/ViewFrom",
- "state", composer->view_from ? "1" : "0", NULL);
- bonobo_ui_component_add_listener (
- composer->uic, "ViewFrom",
- menu_view_from_cb, composer);
-
- /* View/ReplyTo */
- bonobo_ui_component_set_prop (
- composer->uic, "/commands/ViewReplyTo",
- "state", composer->view_replyto ? "1" : "0", NULL);
- bonobo_ui_component_add_listener (
- composer->uic, "ViewReplyTo",
- menu_view_replyto_cb, composer);
-
- /* View/To */
- bonobo_ui_component_set_prop (
- composer->uic, "/commands/ViewTo",
- "state", composer->view_to ? "1" : "0", NULL);
- bonobo_ui_component_add_listener (
- composer->uic, "ViewTo",
- menu_view_to_cb, composer);
-
- /* View/PostTo */
- bonobo_ui_component_set_prop (
- composer->uic, "/commands/ViewPostTo",
- "state", composer->view_postto ? "1" : "0", NULL);
- bonobo_ui_component_add_listener (
- composer->uic, "ViewPostTo",
- menu_view_postto_cb, composer);
-
- /* View/CC */
- bonobo_ui_component_set_prop (
- composer->uic, "/commands/ViewCC",
- "state", composer->view_cc ? "1" : "0", NULL);
- bonobo_ui_component_add_listener (
- composer->uic, "ViewCC",
- menu_view_cc_cb, composer);
-
- /* View/BCC */
- bonobo_ui_component_set_prop (
- composer->uic, "/commands/ViewBCC",
- "state", composer->view_bcc ? "1" : "0", NULL);
- bonobo_ui_component_add_listener (
- composer->uic, "ViewBCC",
- menu_view_bcc_cb, composer);
-
- /* Security -> PGP Sign */
- bonobo_ui_component_set_prop (
- composer->uic, "/commands/SecurityPGPSign",
- "state", composer->pgp_sign ? "1" : "0", NULL);
-
- bonobo_ui_component_add_listener (
- composer->uic, "SecurityPGPSign",
- menu_security_pgp_sign_cb, composer);
-
- /* Security -> PGP Encrypt */
- bonobo_ui_component_set_prop (
- composer->uic, "/commands/SecurityPGPEncrypt",
- "state", composer->pgp_encrypt ? "1" : "0", NULL);
-
- bonobo_ui_component_add_listener (
- composer->uic, "SecurityPGPEncrypt",
- menu_security_pgp_encrypt_cb, composer);
-
-#if defined(HAVE_NSS) && defined(SMIME_SUPPORTED)
- hide_smime = FALSE;
-#else
- hide_smime = TRUE;
-#endif
-
- /* Security -> S/MIME Sign */
- bonobo_ui_component_set_prop (
- composer->uic, "/commands/SecuritySMimeSign",
- "state", composer->smime_sign ? "1" : "0", NULL);
- bonobo_ui_component_set_prop (
- composer->uic, "/commands/SecuritySMimeSign",
- "hidden", hide_smime ? "1" : "0", NULL);
-
- bonobo_ui_component_add_listener (
- composer->uic, "SecuritySMimeSign",
- menu_security_smime_sign_cb, composer);
-
- /* Security -> S/MIME Encrypt */
- bonobo_ui_component_set_prop (
- composer->uic, "/commands/SecuritySMimeEncrypt",
- "state", composer->smime_encrypt ? "1" : "0", NULL);
- bonobo_ui_component_set_prop (
- composer->uic, "/commands/SecuritySMimeEncrypt",
- "hidden", hide_smime ? "1" : "0", NULL);
-
- bonobo_ui_component_add_listener (
- composer->uic, "SecuritySMimeEncrypt",
- menu_security_smime_encrypt_cb, composer);
-
- /* View -> Attachments */
- bonobo_ui_component_add_listener (
- composer->uic, "ViewAttach",
- menu_view_attachments_activate_cb, composer);
-
- bonobo_ui_component_thaw (composer->uic, NULL);
-
- /* Create the UIComponent for the non-control entries */
-
- composer->entry_uic = bonobo_ui_component_new_default ();
-
- /* Setup main menu plugin mechanism */
- target = em_menu_target_new_widget(p->menu, (GtkWidget *)composer);
- e_menu_update_target((EMenu *)p->menu, target);
- e_menu_activate((EMenu *)p->menu, composer->uic, TRUE);
-}
-
-
-/* Miscellaneous callbacks. */
-
-static void
-attachment_bar_changed_cb (EMsgComposerAttachmentBar *bar,
- void *data)
-{
- EMsgComposer *composer = E_MSG_COMPOSER (data);
-
- guint attachment_num = e_msg_composer_attachment_bar_get_num_attachments (
- E_MSG_COMPOSER_ATTACHMENT_BAR (composer->attachment_bar));
- if (attachment_num) {
- gchar *num_text = g_strdup_printf (
- ngettext ("<b>%d</b> File Attached", "<b>%d</b> Files Attached", attachment_num),
- attachment_num);
- gtk_label_set_markup (GTK_LABEL (composer->attachment_expander_num),
- num_text);
- g_free (num_text);
-
- gtk_widget_show (composer->attachment_expander_icon);
-
- } else {
- gtk_label_set_text (GTK_LABEL (composer->attachment_expander_num), "");
- gtk_widget_hide (composer->attachment_expander_icon);
- }
-
-
- /* Mark the composer as changed so it prompts about unsaved
- changes on close */
- e_msg_composer_set_changed (composer);
-}
-
-static void
-attachment_expander_activate_cb (EExpander *expander,
- void *data)
-{
- EMsgComposer *composer = E_MSG_COMPOSER (data);
- gboolean show = e_expander_get_expanded (expander);
-
- /* Update the expander label */
- if (show)
- gtk_label_set_text_with_mnemonic (GTK_LABEL (composer->attachment_expander_label),
- _("Hide _Attachment Bar (drop attachments here)"));
- else
- gtk_label_set_text_with_mnemonic (GTK_LABEL (composer->attachment_expander_label),
- _("Show _Attachment Bar (drop attachments here)"));
-
- /* Update the GUI. */
- bonobo_ui_component_set_prop (
- composer->uic, "/commands/ViewAttach",
- "state", show ? "1" : "0", NULL);
-}
-
-static void
-subject_changed_cb (EMsgComposerHdrs *hdrs,
- gchar *subject,
- void *data)
-{
- EMsgComposer *composer;
-
- composer = E_MSG_COMPOSER (data);
-
- gtk_window_set_title (GTK_WINDOW (composer), subject[0] ? subject : _("Compose a message"));
-}
-
-static void
-hdrs_changed_cb (EMsgComposerHdrs *hdrs,
- void *data)
-{
- EMsgComposer *composer;
-
- composer = E_MSG_COMPOSER (data);
-
- /* Mark the composer as changed so it prompts about unsaved changes on close */
- e_msg_composer_set_changed (composer);
-}
-
-enum {
- UPDATE_AUTO_CC,
- UPDATE_AUTO_BCC,
-};
-
-static void
-update_auto_recipients (EMsgComposerHdrs *hdrs, int mode, const char *auto_addrs)
-{
- EDestination *dest, **destv = NULL;
- CamelInternetAddress *iaddr;
- GList *list, *tail, *node;
- int i, n = 0;
-
- tail = list = NULL;
-
- if (auto_addrs) {
- iaddr = camel_internet_address_new ();
- if (camel_address_decode (CAMEL_ADDRESS (iaddr), auto_addrs) != -1) {
- for (i = 0; i < camel_address_length (CAMEL_ADDRESS (iaddr)); i++) {
- const char *name, *addr;
-
- if (!camel_internet_address_get (iaddr, i, &name, &addr))
- continue;
-
- dest = e_destination_new ();
- e_destination_set_auto_recipient (dest, TRUE);
-
- if (name)
- e_destination_set_name (dest, name);
-
- if (addr)
- e_destination_set_email (dest, addr);
-
- node = g_list_alloc ();
- node->data = dest;
- node->next = NULL;
-
- if (tail) {
- node->prev = tail;
- tail->next = node;
- } else {
- node->prev = NULL;
- list = node;
- }
-
- tail = node;
- n++;
- }
- }
-
- camel_object_unref (iaddr);
- }
-
- switch (mode) {
- case UPDATE_AUTO_CC:
- destv = e_msg_composer_hdrs_get_cc (hdrs);
- break;
- case UPDATE_AUTO_BCC:
- destv = e_msg_composer_hdrs_get_bcc (hdrs);
- break;
- default:
- g_assert_not_reached ();
- }
-
- if (destv) {
- for (i = 0; destv[i]; i++) {
- if (!e_destination_is_auto_recipient (destv[i])) {
- node = g_list_alloc ();
- node->data = e_destination_copy (destv[i]);
- node->next = NULL;
-
- if (tail) {
- node->prev = tail;
- tail->next = node;
- } else {
- node->prev = NULL;
- list = node;
- }
-
- tail = node;
- n++;
- }
- }
-
- e_destination_freev (destv);
- }
-
- destv = destination_list_to_vector_sized (list, n);
- g_list_free (list);
-
- switch (mode) {
- case UPDATE_AUTO_CC:
- e_msg_composer_hdrs_set_cc (hdrs, destv);
- break;
- case UPDATE_AUTO_BCC:
- e_msg_composer_hdrs_set_bcc (hdrs, destv);
- break;
- default:
- g_assert_not_reached ();
- }
-
- e_destination_freev (destv);
-}
-
-static void
-from_changed_cb (EMsgComposerHdrs *hdrs, void *data)
-{
- EMsgComposer *composer;
-
- composer = E_MSG_COMPOSER (data);
-
- if (hdrs->account) {
- EAccount *account = hdrs->account;
-
- e_msg_composer_set_pgp_sign (composer,
- account->pgp_always_sign &&
- (!account->pgp_no_imip_sign || !composer->mime_type ||
- g_ascii_strncasecmp (composer->mime_type, "text/calendar", 13) != 0));
- e_msg_composer_set_smime_sign (composer, account->smime_sign_default);
- e_msg_composer_set_smime_encrypt (composer, account->smime_encrypt_default);
- update_auto_recipients (hdrs, UPDATE_AUTO_CC, account->always_cc ? account->cc_addrs : NULL);
- update_auto_recipients (hdrs, UPDATE_AUTO_BCC, account->always_bcc ? account->bcc_addrs : NULL);
- } else {
- update_auto_recipients (hdrs, UPDATE_AUTO_CC, NULL);
- update_auto_recipients (hdrs, UPDATE_AUTO_BCC, NULL);
- }
-
- set_editor_signature (composer);
- e_msg_composer_show_sig_file (composer);
-}
-
-
-/* GObject methods. */
-
-static void
-composer_finalise (GObject *object)
-{
- EMsgComposer *composer;
-
- composer = E_MSG_COMPOSER (object);
-
- if (composer->extra_hdr_names) {
- int i;
-
- for (i = 0; i < composer->extra_hdr_names->len; i++) {
- g_free (composer->extra_hdr_names->pdata[i]);
- g_free (composer->extra_hdr_values->pdata[i]);
- }
- g_ptr_array_free (composer->extra_hdr_names, TRUE);
- g_ptr_array_free (composer->extra_hdr_values, TRUE);
- }
-
- e_msg_composer_clear_inlined_table (composer);
- g_hash_table_destroy (composer->inline_images);
- g_hash_table_destroy (composer->inline_images_by_url);
-
- g_free (composer->charset);
- g_free (composer->mime_type);
- g_free (composer->mime_body);
-
- if (composer->redirect)
- camel_object_unref (composer->redirect);
-
- if (G_OBJECT_CLASS (parent_class)->finalize != NULL)
- (* G_OBJECT_CLASS (parent_class)->finalize) (object);
-}
-
-static void
-composer_dispose(GObject *object)
-{
- /* When destroy() is called, the contents of the window
- * (including the remote editor control) will already have
- * been destroyed, so we have to do this here.
- */
- autosave_manager_unregister (am, E_MSG_COMPOSER (object));
- if (G_OBJECT_CLASS (parent_class)->dispose != NULL)
- (* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-/* GtkObject methods */
-static void
-destroy (GtkObject *object)
-{
- EMsgComposer *composer = (EMsgComposer *)object;
- CORBA_Environment ev;
- ESignatureList *signatures;
- EMsgComposerPrivate *p = _PRIVATE(composer);
-
- CORBA_exception_init (&ev);
-
- if (p->menu) {
- e_menu_update_target((EMenu *)p->menu, NULL);
- g_object_unref(p->menu);
- p->menu = NULL;
- }
-
- if (composer->uic) {
- bonobo_object_unref (BONOBO_OBJECT (composer->uic));
- composer->uic = NULL;
- }
-
- if (composer->entry_uic) {
- bonobo_object_unref (BONOBO_OBJECT (composer->entry_uic));
- composer->entry_uic = NULL;
- }
-
- /* FIXME? I assume the Bonobo widget will get destroyed
- normally? */
- if (composer->address_dialog != NULL) {
- gtk_widget_destroy (composer->address_dialog);
- composer->address_dialog = NULL;
- }
- if (composer->hdrs != NULL) {
- gtk_widget_destroy (composer->hdrs);
- composer->hdrs = NULL;
- }
-
- if (composer->notify_id) {
- GConfClient *gconf = gconf_client_get_default ();
- gconf_client_notify_remove (gconf, composer->notify_id);
- composer->notify_id = 0;
- g_object_unref (gconf);
- }
-
- if (composer->persist_stream_interface != CORBA_OBJECT_NIL) {
- Bonobo_Unknown_unref (composer->persist_stream_interface, &ev);
- CORBA_Object_release (composer->persist_stream_interface, &ev);
- composer->persist_stream_interface = CORBA_OBJECT_NIL;
- }
-
- if (composer->persist_file_interface != CORBA_OBJECT_NIL) {
- Bonobo_Unknown_unref (composer->persist_file_interface, &ev);
- CORBA_Object_release (composer->persist_file_interface, &ev);
- composer->persist_file_interface = CORBA_OBJECT_NIL;
- }
-
- if (composer->editor_engine != CORBA_OBJECT_NIL) {
- Bonobo_Unknown_unref (composer->editor_engine, &ev);
- CORBA_Object_release (composer->editor_engine, &ev);
- composer->editor_engine = CORBA_OBJECT_NIL;
- }
-
- CORBA_exception_free (&ev);
-
- if (composer->editor_listener) {
- bonobo_object_unref (composer->editor_listener);
- composer->editor_listener = NULL;
- }
-
- signatures = mail_config_get_signatures ();
-
- if (composer->sig_added_id != 0) {
- g_signal_handler_disconnect (signatures, composer->sig_added_id);
- composer->sig_added_id = 0;
- }
-
- if (composer->sig_removed_id != 0) {
- g_signal_handler_disconnect (signatures, composer->sig_removed_id);
- composer->sig_removed_id = 0;
- }
-
- if (composer->sig_changed_id != 0) {
- g_signal_handler_disconnect (signatures, composer->sig_changed_id);
- composer->sig_changed_id = 0;
- }
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy != NULL)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-/* GtkWidget methods. */
-
-static int
-delete_event (GtkWidget *widget,
- GdkEventAny *event)
-{
- do_exit (E_MSG_COMPOSER (widget));
-
- return TRUE;
-}
-
-static void
-attach_message(EMsgComposer *composer, CamelMimeMessage *msg)
-{
- CamelMimePart *mime_part;
- const char *subject;
-
- mime_part = camel_mime_part_new();
- camel_mime_part_set_disposition(mime_part, "inline");
- subject = camel_mime_message_get_subject(msg);
- if (subject) {
- char *desc = g_strdup_printf(_("Attached message - %s"), subject);
-
- camel_mime_part_set_description(mime_part, desc);
- g_free(desc);
- } else
- camel_mime_part_set_description(mime_part, _("Attached message"));
-
- camel_medium_set_content_object((CamelMedium *)mime_part, (CamelDataWrapper *)msg);
- camel_mime_part_set_content_type(mime_part, "message/rfc822");
- e_msg_composer_attachment_bar_attach_mime_part(E_MSG_COMPOSER_ATTACHMENT_BAR(composer->attachment_bar), mime_part);
- camel_object_unref(mime_part);
-}
-
-struct _drop_data {
- EMsgComposer *composer;
-
- GdkDragContext *context;
- /* Only selection->data and selection->length are valid */
- GtkSelectionData *selection;
-
- guint32 action;
- guint info;
- guint time;
-
- unsigned int move:1;
- unsigned int moved:1;
- unsigned int aborted:1;
-};
-
-static void
-drop_action(EMsgComposer *composer, GdkDragContext *context, guint32 action, GtkSelectionData *selection, guint info, guint time)
-{
- char *tmp, *str, **urls;
- CamelMimePart *mime_part;
- CamelStream *stream;
- CamelURL *url;
- CamelMimeMessage *msg;
- char *content_type;
- int i, success=FALSE, delete=FALSE;
-
- switch (info) {
- case DND_TYPE_MESSAGE_RFC822:
- d(printf ("dropping a message/rfc822\n"));
- /* write the message(s) out to a CamelStream so we can use it */
- stream = camel_stream_mem_new ();
- camel_stream_write (stream, selection->data, selection->length);
- camel_stream_reset (stream);
-
- msg = camel_mime_message_new ();
- if (camel_data_wrapper_construct_from_stream((CamelDataWrapper *)msg, stream) != -1) {
- attach_message(composer, msg);
- success = TRUE;
- delete = action == GDK_ACTION_MOVE;
- }
-
- camel_object_unref(msg);
- camel_object_unref(stream);
- break;
- case DND_TYPE_TEXT_URI_LIST:
- case DND_TYPE_NETSCAPE_URL:
- d(printf ("dropping a text/uri-list\n"));
- tmp = g_strndup (selection->data, selection->length);
- urls = g_strsplit (tmp, "\n", 0);
- g_free (tmp);
-
- for (i = 0; urls[i] != NULL; i++) {
- str = g_strstrip (urls[i]);
- if (urls[i][0] == '#') {
- g_free(str);
- continue;
- }
-
- if (!g_ascii_strncasecmp (str, "mailto:", 7)) {
- handle_mailto (composer, str);
- g_free (str);
- } else {
- url = camel_url_new (str, NULL);
- g_free (str);
-
- if (url == NULL)
- continue;
-
- if (!g_ascii_strcasecmp (url->protocol, "file"))
- e_msg_composer_attachment_bar_attach
- (E_MSG_COMPOSER_ATTACHMENT_BAR (composer->attachment_bar),
- url->path);
-
- camel_url_free (url);
- }
- }
-
- g_free (urls);
- success = TRUE;
- break;
- case DND_TYPE_TEXT_VCARD:
- case DND_TYPE_TEXT_CALENDAR:
- content_type = gdk_atom_name (selection->type);
- d(printf ("dropping a %s\n", content_type));
-
- mime_part = camel_mime_part_new ();
- camel_mime_part_set_content (mime_part, selection->data, selection->length, content_type);
- camel_mime_part_set_disposition (mime_part, "inline");
-
- e_msg_composer_attachment_bar_attach_mime_part
- (E_MSG_COMPOSER_ATTACHMENT_BAR (composer->attachment_bar),
- mime_part);
-
- camel_object_unref (mime_part);
- g_free (content_type);
-
- success = TRUE;
- break;
- case DND_TYPE_X_UID_LIST: {
- GPtrArray *uids;
- char *inptr, *inend;
- CamelFolder *folder;
- CamelException ex = CAMEL_EXCEPTION_INITIALISER;
-
- /* NB: This all runs synchronously, could be very slow/hang/block the ui */
-
- uids = g_ptr_array_new();
-
- inptr = selection->data;
- inend = selection->data + selection->length;
- while (inptr < inend) {
- char *start = inptr;
-
- while (inptr < inend && *inptr)
- inptr++;
-
- if (start > (char *)selection->data)
- g_ptr_array_add(uids, g_strndup(start, inptr-start));
-
- inptr++;
- }
-
- if (uids->len > 0) {
- folder = mail_tool_uri_to_folder(selection->data, 0, &ex);
- if (folder) {
- if (uids->len == 1) {
- msg = camel_folder_get_message(folder, uids->pdata[0], &ex);
- if (msg == NULL)
- goto fail;
- attach_message(composer, msg);
- } else {
- CamelMultipart *mp = camel_multipart_new();
- char *desc;
-
- camel_data_wrapper_set_mime_type((CamelDataWrapper *)mp, "multipart/digest");
- camel_multipart_set_boundary(mp, NULL);
- for (i=0;i<uids->len;i++) {
- msg = camel_folder_get_message(folder, uids->pdata[i], &ex);
- if (msg) {
- mime_part = camel_mime_part_new();
- camel_mime_part_set_disposition(mime_part, "inline");
- camel_medium_set_content_object((CamelMedium *)mime_part, (CamelDataWrapper *)msg);
- camel_mime_part_set_content_type(mime_part, "message/rfc822");
- camel_multipart_add_part(mp, mime_part);
- camel_object_unref(mime_part);
- camel_object_unref(msg);
- } else {
- camel_object_unref(mp);
- goto fail;
- }
- }
- mime_part = camel_mime_part_new();
- camel_medium_set_content_object((CamelMedium *)mime_part, (CamelDataWrapper *)mp);
- /* translators, this count will always be >1 */
- desc = g_strdup_printf(ngettext("Attached message", "%d attached messages", uids->len), uids->len);
- camel_mime_part_set_description(mime_part, desc);
- g_free(desc);
- e_msg_composer_attachment_bar_attach_mime_part(E_MSG_COMPOSER_ATTACHMENT_BAR(composer->attachment_bar), mime_part);
- camel_object_unref(mime_part);
- camel_object_unref(mp);
- }
- success = TRUE;
- delete = action == GDK_ACTION_MOVE;
- fail:
- if (camel_exception_is_set(&ex)) {
- char *name;
-
- camel_object_get(folder, NULL, CAMEL_FOLDER_NAME, &name, NULL);
- e_error_run((GtkWindow *)composer, "mail-composer:attach-nomessages",
- name?name:(char *)selection->data, camel_exception_get_description(&ex), NULL);
- camel_object_free(folder, CAMEL_FOLDER_NAME, name);
- }
- camel_object_unref(folder);
- } else {
- e_error_run((GtkWindow *)composer, "mail-composer:attach-nomessages",
- selection->data, camel_exception_get_description(&ex), NULL);
- }
-
- camel_exception_clear(&ex);
- }
-
- g_ptr_array_free(uids, TRUE);
-
- break; }
- default:
- d(printf ("dropping an unknown\n"));
- break;
- }
-
- printf("Drag finished, success %d delete %d\n", success, delete);
-
- gtk_drag_finish(context, success, delete, time);
-}
-
-static void
-drop_popup_copy(EPopup *ep, EPopupItem *item, void *data)
-{
- struct _drop_data *m = data;
- drop_action(m->composer, m->context, GDK_ACTION_COPY, m->selection, m->info, m->time);
-}
-
-static void
-drop_popup_move(EPopup *ep, EPopupItem *item, void *data)
-{
- struct _drop_data *m = data;
- drop_action(m->composer, m->context, GDK_ACTION_MOVE, m->selection, m->info, m->time);
-}
-
-static void
-drop_popup_cancel(EPopup *ep, EPopupItem *item, void *data)
-{
- struct _drop_data *m = data;
- gtk_drag_finish(m->context, FALSE, FALSE, m->time);
-}
-
-static EPopupItem drop_popup_menu[] = {
- { E_POPUP_ITEM, "00.emc.02", N_("_Copy"), drop_popup_copy, NULL, "stock_mail-copy", 0 },
- { E_POPUP_ITEM, "00.emc.03", N_("_Move"), drop_popup_move, NULL, "stock_mail-move", 0 },
- { E_POPUP_BAR, "10.emc" },
- { E_POPUP_ITEM, "99.emc.00", N_("Cancel _Drag"), drop_popup_cancel, NULL, NULL, 0 },
-};
-
-static void
-drop_popup_free(EPopup *ep, GSList *items, void *data)
-{
- struct _drop_data *m = data;
-
- g_slist_free(items);
-
- g_object_unref(m->context);
- g_object_unref(m->composer);
- g_free(m->selection->data);
- g_free(m->selection);
- g_free(m);
-}
-
-static void
-drag_data_received (EMsgComposer *composer, GdkDragContext *context,
- int x, int y, GtkSelectionData *selection,
- guint info, guint time)
-{
- if (selection->data == NULL || selection->length == -1)
- return;
-
- if (context->action == GDK_ACTION_ASK) {
- EMPopup *emp;
- GSList *menus = NULL;
- GtkMenu *menu;
- int i;
- struct _drop_data *m;
-
- m = g_malloc0(sizeof(*m));
- m->context = context;
- g_object_ref(context);
- m->composer = composer;
- g_object_ref(composer);
- m->action = context->action;
- m->info = info;
- m->time = time;
- m->selection = g_malloc0(sizeof(*m->selection));
- m->selection->data = g_malloc(selection->length);
- memcpy(m->selection->data, selection->data, selection->length);
- m->selection->length = selection->length;
-
- emp = em_popup_new("org.gnome.evolution.mail.composer.popup.drop");
- for (i=0;i<sizeof(drop_popup_menu)/sizeof(drop_popup_menu[0]);i++)
- menus = g_slist_append(menus, &drop_popup_menu[i]);
-
- e_popup_add_items((EPopup *)emp, menus, NULL, drop_popup_free, m);
- menu = e_popup_create_menu_once((EPopup *)emp, NULL, 0);
- gtk_menu_popup(menu, NULL, NULL, NULL, NULL, 0, time);
- } else {
- drop_action(composer, context, context->action, selection, info, time);
- }
-}
-
-static gboolean
-drag_motion(GObject *o, GdkDragContext *context, gint x, gint y, guint time, EMsgComposer *composer)
-{
- GList *targets;
- GdkDragAction action, actions = 0;
-
- for (targets = context->targets; targets; targets = targets->next) {
- int i;
-
- for (i=0;i<sizeof(drag_info)/sizeof(drag_info[0]);i++)
- if (targets->data == (void *)drag_info[i].atom)
- actions |= drag_info[i].actions;
- }
-
- actions &= context->actions;
- action = context->suggested_action;
- /* we default to copy */
- if (action == GDK_ACTION_ASK && (actions & (GDK_ACTION_MOVE|GDK_ACTION_COPY)) != (GDK_ACTION_MOVE|GDK_ACTION_COPY))
- action = GDK_ACTION_COPY;
-
- gdk_drag_status(context, action, time);
-
- return action != 0;
-}
-
-static void
-class_init (EMsgComposerClass *klass)
-{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- GObjectClass *gobject_class;
- int i;
-
- for (i=0;i<sizeof(drag_info)/sizeof(drag_info[0]);i++)
- drag_info[i].atom = gdk_atom_intern(drag_info[i].target, FALSE);
-
- gobject_class = G_OBJECT_CLASS(klass);
- object_class = GTK_OBJECT_CLASS (klass);
- widget_class = GTK_WIDGET_CLASS (klass);
-
- g_type_class_add_private(gobject_class, sizeof(struct _EMsgComposerPrivate));
-
- gobject_class->finalize = composer_finalise;
- gobject_class->dispose = composer_dispose;
- object_class->destroy = destroy;
- widget_class->delete_event = delete_event;
-
- parent_class = g_type_class_ref(bonobo_window_get_type ());
-
- signals[SEND] =
- g_signal_new ("send",
- E_TYPE_MSG_COMPOSER,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EMsgComposerClass, send),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
- signals[SAVE_DRAFT] =
- g_signal_new ("save-draft",
- E_TYPE_MSG_COMPOSER,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EMsgComposerClass, save_draft),
- NULL, NULL,
- g_cclosure_marshal_VOID__BOOLEAN,
- G_TYPE_NONE,
- 1, G_TYPE_BOOLEAN);
-}
-
-static void
-init (EMsgComposer *composer)
-{
- EMsgComposerPrivate *p = _PRIVATE(composer);
-
- composer->uic = NULL;
-
- composer->hdrs = NULL;
- composer->extra_hdr_names = g_ptr_array_new ();
- composer->extra_hdr_values = g_ptr_array_new ();
-
- composer->focused_entry = NULL;
-
- composer->editor = NULL;
-
- composer->address_dialog = NULL;
-
- composer->attachment_bar = NULL;
- composer->attachment_scrolled_window = NULL;
-
- composer->persist_file_interface = CORBA_OBJECT_NIL;
- composer->persist_stream_interface = CORBA_OBJECT_NIL;
-
- composer->editor_engine = CORBA_OBJECT_NIL;
- composer->inline_images = g_hash_table_new (g_str_hash, g_str_equal);
- composer->inline_images_by_url = g_hash_table_new (g_str_hash, g_str_equal);
- composer->current_images = NULL;
-
- composer->attachment_bar_visible = FALSE;
- composer->send_html = FALSE;
- composer->pgp_sign = FALSE;
- composer->pgp_encrypt = FALSE;
- composer->smime_sign = FALSE;
- composer->smime_encrypt = FALSE;
-
- composer->has_changed = FALSE;
- composer->autosaved = FALSE;
-
- composer->redirect = FALSE;
-
- composer->charset = NULL;
-
- composer->enable_autosave = TRUE;
- composer->autosave_file = NULL;
- composer->autosave_fd = -1;
-
- /** @HookPoint-EMMenu: Main Mail Menu
- * @Id: org.gnome.evolution.mail.composer
- * @Class: org.gnome.evolution.mail.bonobomenu:1.0
- * @Target: EMMenuTargetWidget
- *
- * The main menu of the composer window. The widget of the
- * target will point to the EMsgComposer object.
- */
- p->menu = em_menu_new("org.gnome.evolution.mail.composer");
-}
-
-
-GtkType
-e_msg_composer_get_type (void)
-{
- static GType type = 0;
-
- if (type == 0) {
- static const GTypeInfo info = {
- sizeof (EMsgComposerClass),
- NULL, NULL,
- (GClassInitFunc) class_init,
- NULL, NULL,
- sizeof (EMsgComposer),
- 0,
- (GInstanceInitFunc) init,
- };
-
- type = g_type_register_static (bonobo_window_get_type (), "EMsgComposer", &info, 0);
- }
-
- return type;
-}
-
-static void
-e_msg_composer_load_config (EMsgComposer *composer, int visible_mask)
-{
- GConfClient *gconf;
-
- gconf = gconf_client_get_default ();
-
- composer->view_from = gconf_client_get_bool (
- gconf, "/apps/evolution/mail/composer/view/From", NULL);
- composer->view_replyto = gconf_client_get_bool (
- gconf, "/apps/evolution/mail/composer/view/ReplyTo", NULL);
- composer->view_to = gconf_client_get_bool (
- gconf, "/apps/evolution/mail/composer/view/To", NULL);
- composer->view_postto = gconf_client_get_bool (
- gconf, "/apps/evolution/mail/composer/view/PostTo", NULL);
- composer->view_cc = gconf_client_get_bool (
- gconf, "/apps/evolution/mail/composer/view/Cc", NULL);
- composer->view_bcc = gconf_client_get_bool (
- gconf, "/apps/evolution/mail/composer/view/Bcc", NULL);
- composer->view_subject = gconf_client_get_bool (
- gconf, "/apps/evolution/mail/composer/view/Subject", NULL);
-
- /* if we're mailing, you cannot disable to so it should appear checked */
- if (visible_mask & E_MSG_COMPOSER_VISIBLE_TO)
- composer->view_to = TRUE;
- else
- composer->view_to = FALSE;
-
- /* ditto for post-to */
- if (visible_mask & E_MSG_COMPOSER_VISIBLE_POSTTO)
- composer->view_postto = TRUE;
- else
- composer->view_postto = FALSE;
-
- /* we set these to false initially if we're posting */
- if (!(visible_mask & E_MSG_COMPOSER_VISIBLE_CC))
- composer->view_cc = FALSE;
-
- if (!(visible_mask & E_MSG_COMPOSER_VISIBLE_BCC))
- composer->view_bcc = FALSE;
-
- g_object_unref (gconf);
-}
-
-static int
-e_msg_composer_get_visible_flags (EMsgComposer *composer)
-{
- int flags = 0;
-
- if (composer->view_from)
- flags |= E_MSG_COMPOSER_VISIBLE_FROM;
- if (composer->view_replyto)
- flags |= E_MSG_COMPOSER_VISIBLE_REPLYTO;
- if (composer->view_to)
- flags |= E_MSG_COMPOSER_VISIBLE_TO;
- if (composer->view_postto)
- flags |= E_MSG_COMPOSER_VISIBLE_POSTTO;
- if (composer->view_cc)
- flags |= E_MSG_COMPOSER_VISIBLE_CC;
- if (composer->view_bcc)
- flags |= E_MSG_COMPOSER_VISIBLE_BCC;
- if (composer->view_subject)
- flags |= E_MSG_COMPOSER_VISIBLE_SUBJECT;
-
- /*
- * Until we have a GUI way, lets make sure that
- * even if the user screws up, we will do the right
- * thing (screws up == edit the config file manually
- * and screw up).
- */
- flags |= E_MSG_COMPOSER_VISIBLE_SUBJECT;
- return flags;
-}
-
-
-static void
-map_default_cb (EMsgComposer *composer, gpointer user_data)
-{
- GtkWidget *widget;
- CORBA_Environment ev;
- const char *subject;
- const char *text;
-
- /* If the 'To:' field is empty, focus it */
-
- widget = e_msg_composer_hdrs_get_to_entry (E_MSG_COMPOSER_HDRS (composer->hdrs));
- text = gtk_entry_get_text (GTK_ENTRY (widget));
-
- if (!text || text[0] == '\0') {
- gtk_widget_grab_focus (widget);
-
- return;
- }
-
- /* If not, check the subject field */
-
- subject = e_msg_composer_hdrs_get_subject (E_MSG_COMPOSER_HDRS (composer->hdrs));
-
- if (!subject || subject[0] == '\0') {
- widget = e_msg_composer_hdrs_get_subject_entry (E_MSG_COMPOSER_HDRS (composer->hdrs));
- gtk_widget_grab_focus (widget);
- return;
- }
-
- /* Jump to the editor as a last resort. */
-
- CORBA_exception_init (&ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "grab-focus", &ev);
- CORBA_exception_free (&ev);
-}
-
-static void
-msg_composer_destroy_notify (void *data)
-{
- EMsgComposer *composer = E_MSG_COMPOSER (data);
-
- all_composers = g_slist_remove (all_composers, composer);
-}
-
-static int
-composer_key_pressed (EMsgComposer *composer, GdkEventKey *event, void *user_data)
-{
- if (event->keyval == GDK_Escape) {
- do_exit (composer);
- g_signal_stop_emission_by_name (composer, "key-press-event");
- return TRUE;
- }
-
- return FALSE;
-}
-
-
-/* Verbs for non-control entries */
-static BonoboUIVerb entry_verbs [] = {
- BONOBO_UI_VERB ("EditCut", menu_edit_cut_cb),
- BONOBO_UI_VERB ("EditCopy", menu_edit_copy_cb),
- BONOBO_UI_VERB ("EditPaste", menu_edit_paste_cb),
- BONOBO_UI_VERB ("EditSelectAll", menu_edit_select_all_cb),
- BONOBO_UI_VERB_END
-};
-
-/* All this snot is so that Cut/Copy/Paste work. */
-static gboolean
-composer_entry_focus_in_event_cb (GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
-{
- EMsgComposer *composer = user_data;
- BonoboUIContainer *container;
-
- composer->focused_entry = widget;
-
- container = bonobo_window_get_ui_container (BONOBO_WINDOW (composer));
- bonobo_ui_component_set_container (composer->entry_uic, bonobo_object_corba_objref (BONOBO_OBJECT (container)), NULL);
-
- bonobo_ui_component_add_verb_list_with_data (composer->entry_uic, entry_verbs, composer);
-
- bonobo_ui_component_freeze (composer->entry_uic, NULL);
-
- bonobo_ui_util_set_ui (composer->entry_uic, PREFIX,
- EVOLUTION_UIDIR "/evolution-composer-entries.xml",
- "evolution-composer-entries", NULL);
-
- bonobo_ui_component_thaw (composer->entry_uic, NULL);
-
- return FALSE;
-}
-
-static gboolean
-composer_entry_focus_out_event_cb (GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
-{
- EMsgComposer *composer = user_data;
-
- g_assert (composer->focused_entry == widget);
- composer->focused_entry = NULL;
-
- bonobo_ui_component_unset_container (composer->entry_uic, NULL);
-
- return FALSE;
-}
-
-static void
-setup_cut_copy_paste (EMsgComposer *composer)
-{
- EMsgComposerHdrs *hdrs;
- GtkWidget *entry;
-
- hdrs = (EMsgComposerHdrs *) composer->hdrs;
-
- entry = e_msg_composer_hdrs_get_subject_entry (hdrs);
- g_signal_connect (entry, "focus_in_event", G_CALLBACK (composer_entry_focus_in_event_cb), composer);
- g_signal_connect (entry, "focus_out_event", G_CALLBACK (composer_entry_focus_out_event_cb), composer);
-
- entry = e_msg_composer_hdrs_get_reply_to_entry (hdrs);
- g_signal_connect (entry, "focus_in_event", G_CALLBACK (composer_entry_focus_in_event_cb), composer);
- g_signal_connect (entry, "focus_out_event", G_CALLBACK (composer_entry_focus_out_event_cb), composer);
-}
-
-static void
-composer_settings_update (GConfClient *gconf, guint cnxn_id, GConfEntry *entry, gpointer data)
-{
- gboolean bool;
- EMsgComposer *composer = data;
-
- bool = gconf_client_get_bool (gconf, "/apps/evolution/mail/composer/magic_smileys", NULL);
- bonobo_widget_set_property (BONOBO_WIDGET (composer->editor),
- "MagicSmileys", TC_CORBA_boolean, bool,
- NULL);
-
- bool = gconf_client_get_bool (gconf, "/apps/evolution/mail/composer/magic_links", NULL);
- bonobo_widget_set_property (BONOBO_WIDGET (composer->editor),
- "MagicLinks", TC_CORBA_boolean, bool,
- NULL);
-
- bool = gconf_client_get_bool (gconf, "/apps/evolution/mail/composer/inline_spelling", NULL);
- bonobo_widget_set_property (BONOBO_WIDGET (composer->editor),
- "InlineSpelling", TC_CORBA_boolean, bool,
- NULL);
-}
-
-static void
-e_msg_composer_unrealize (GtkWidget *widget, gpointer data)
-{
- EMsgComposer *composer = E_MSG_COMPOSER (widget);
- GConfClient *gconf;
- int width, height;
-
- gtk_window_get_size (GTK_WINDOW (composer), &width, &height);
-
- gconf = gconf_client_get_default ();
- gconf_client_set_int (gconf, "/apps/evolution/mail/composer/width", width, NULL);
- gconf_client_set_int (gconf, "/apps/evolution/mail/composer/height", height, NULL);
- g_object_unref (gconf);
-}
-
-static EMsgComposer *
-create_composer (int visible_mask)
-{
- EMsgComposer *composer;
- GtkWidget *vbox, *expander_hbox;
- Bonobo_Unknown editor_server;
- CORBA_Environment ev;
- GConfClient *gconf;
- int vis;
- GList *icon_list;
- BonoboControlFrame *control_frame;
-
- composer = g_object_new (E_TYPE_MSG_COMPOSER, "win_name", _("Compose a message"), NULL);
- gtk_window_set_title ((GtkWindow *) composer, _("Compose a message"));
-
- all_composers = g_slist_prepend (all_composers, composer);
-
- g_signal_connect (composer, "key-press-event",
- G_CALLBACK (composer_key_pressed),
- NULL);
-
- g_signal_connect (composer, "destroy",
- G_CALLBACK (msg_composer_destroy_notify),
- NULL);
-
- icon_list = e_icon_factory_get_icon_list ("stock_mail-compose");
- if (icon_list) {
- gtk_window_set_icon_list (GTK_WINDOW (composer), icon_list);
- g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
- g_list_free (icon_list);
- }
-
- /* DND support */
- gtk_drag_dest_set (GTK_WIDGET (composer), GTK_DEST_DEFAULT_ALL, drop_types, num_drop_types, GDK_ACTION_COPY|GDK_ACTION_ASK|GDK_ACTION_MOVE);
- g_signal_connect(composer, "drag_data_received", G_CALLBACK (drag_data_received), NULL);
- g_signal_connect(composer, "drag-motion", G_CALLBACK(drag_motion), composer);
- e_msg_composer_load_config (composer, visible_mask);
-
- setup_ui (composer);
-
- vbox = gtk_vbox_new (FALSE, 0);
-
- vis = e_msg_composer_get_visible_flags (composer);
- composer->hdrs = e_msg_composer_hdrs_new (composer->uic, visible_mask, vis);
- if (!composer->hdrs) {
- e_error_run (GTK_WINDOW (composer), "mail-composer:no-address-control", NULL);
- gtk_object_destroy (GTK_OBJECT (composer));
- return NULL;
- }
-
- gtk_box_set_spacing (GTK_BOX (vbox), 6);
- gtk_box_pack_start (GTK_BOX (vbox), composer->hdrs, FALSE, FALSE, 0);
- g_signal_connect (composer->hdrs, "subject_changed",
- G_CALLBACK (subject_changed_cb), composer);
- g_signal_connect (composer->hdrs, "hdrs_changed",
- G_CALLBACK (hdrs_changed_cb), composer);
- g_signal_connect (composer->hdrs, "from_changed",
- G_CALLBACK (from_changed_cb), composer);
- gtk_widget_show (composer->hdrs);
-
- setup_signatures_menu (composer);
-
- from_changed_cb((EMsgComposerHdrs *)composer->hdrs, composer);
-
- /* Editor component. */
- composer->editor = bonobo_widget_new_control (
- GNOME_GTKHTML_EDITOR_CONTROL_ID,
- bonobo_ui_component_get_container (composer->uic));
- if (!composer->editor) {
- e_error_run (GTK_WINDOW (composer), "mail-composer:no-editor-control", NULL);
- gtk_object_destroy (GTK_OBJECT (composer));
- return NULL;
- }
-
- control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (composer->editor));
- bonobo_control_frame_set_autoactivate (control_frame, TRUE);
-
- /* let the editor know which mode we are in */
- bonobo_widget_set_property (BONOBO_WIDGET (composer->editor),
- "FormatHTML", TC_CORBA_boolean, composer->send_html,
- NULL);
-
- gconf = gconf_client_get_default ();
- composer_settings_update (gconf, 0, NULL, composer);
- gconf_client_add_dir (gconf, "/apps/evolution/mail/composer", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
- composer->notify_id = gconf_client_notify_add (gconf, "/apps/evolution/mail/composer",
- composer_settings_update, composer, NULL, NULL);
- gtk_window_set_default_size (GTK_WINDOW (composer),
- gconf_client_get_int (gconf, "/apps/evolution/mail/composer/width", NULL),
- gconf_client_get_int (gconf, "/apps/evolution/mail/composer/height", NULL));
- g_signal_connect (composer, "unrealize", G_CALLBACK (e_msg_composer_unrealize), NULL);
- g_object_unref (gconf);
-
- editor_server = bonobo_widget_get_objref (BONOBO_WIDGET (composer->editor));
-
- /* FIXME: handle exceptions */
- CORBA_exception_init (&ev);
- composer->persist_file_interface
- = Bonobo_Unknown_queryInterface (editor_server, "IDL:Bonobo/PersistFile:1.0", &ev);
- composer->persist_stream_interface
- = Bonobo_Unknown_queryInterface (editor_server, "IDL:Bonobo/PersistStream:1.0", &ev);
- CORBA_exception_free (&ev);
-
- gtk_box_pack_start (GTK_BOX (vbox), composer->editor, TRUE, TRUE, 0);
-
- /* Attachment editor, wrapped into an EScrollFrame. It's
- hidden in an EExpander. */
-
- composer->attachment_scrolled_window = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (composer->attachment_scrolled_window),
- GTK_SHADOW_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (composer->attachment_scrolled_window),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-
- composer->attachment_bar = e_msg_composer_attachment_bar_new (NULL);
- GTK_WIDGET_SET_FLAGS (composer->attachment_bar, GTK_CAN_FOCUS);
- gtk_container_add (GTK_CONTAINER (composer->attachment_scrolled_window),
- composer->attachment_bar);
- gtk_widget_show (composer->attachment_bar);
- g_signal_connect (composer->attachment_bar, "changed",
- G_CALLBACK (attachment_bar_changed_cb), composer);
-
- composer->attachment_expander_label =
- gtk_label_new_with_mnemonic (_("Show _Attachment Bar (drop attachments here)"));
- composer->attachment_expander_num = gtk_label_new ("");
- gtk_label_set_use_markup (GTK_LABEL (composer->attachment_expander_num), TRUE);
- gtk_misc_set_alignment (GTK_MISC (composer->attachment_expander_label), 0.0, 0.5);
- gtk_misc_set_alignment (GTK_MISC (composer->attachment_expander_num), 1.0, 0.5);
- expander_hbox = gtk_hbox_new (FALSE, 0);
-
- composer->attachment_expander_icon = e_icon_factory_get_image ("stock_attach", E_ICON_SIZE_MENU);
- gtk_misc_set_alignment (GTK_MISC (composer->attachment_expander_icon), 1, 0.5);
- gtk_widget_set_size_request (composer->attachment_expander_icon, 100, -1);
-
- gtk_box_pack_start (GTK_BOX (expander_hbox), composer->attachment_expander_label,
- TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (expander_hbox), composer->attachment_expander_icon,
- TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (expander_hbox), composer->attachment_expander_num,
- TRUE, TRUE, 0);
- gtk_widget_show_all (expander_hbox);
- gtk_widget_hide (composer->attachment_expander_icon);
-
- composer->attachment_expander = e_expander_new ("");
- e_expander_set_label_widget (E_EXPANDER (composer->attachment_expander), expander_hbox);
-
- gtk_container_add (GTK_CONTAINER (composer->attachment_expander),
- composer->attachment_scrolled_window);
- gtk_box_pack_start (GTK_BOX (vbox), composer->attachment_expander,
- FALSE, FALSE, GNOME_PAD_SMALL);
- gtk_widget_show (composer->attachment_expander);
- g_signal_connect_after (composer->attachment_expander, "activate",
- G_CALLBACK (attachment_expander_activate_cb), composer);
-
- bonobo_window_set_contents (BONOBO_WINDOW (composer), vbox);
- gtk_widget_show (vbox);
-
- /* If we show this widget earlier, we lose network transparency. i.e. the
- component appears on the machine evo is running on, ignoring any DISPLAY
- variable. */
- gtk_widget_show (composer->editor);
-
- e_msg_composer_show_attachments (composer, FALSE);
- prepare_engine (composer);
- if (composer->editor_engine == CORBA_OBJECT_NIL) {
- e_error_run (GTK_WINDOW (composer), "mail-composer:no-editor-control", NULL);
- gtk_object_destroy (GTK_OBJECT (composer));
- return NULL;
- }
-
- setup_cut_copy_paste (composer);
-
- g_signal_connect (composer, "map", (GCallback) map_default_cb, NULL);
-
- if (am == NULL)
- am = autosave_manager_new ();
-
- autosave_manager_register (am, composer);
-
- composer->has_changed = FALSE;
-
- return composer;
-}
-
-static void
-set_editor_signature (EMsgComposer *composer)
-{
- EAccountIdentity *id;
-
- g_return_if_fail (E_MSG_COMPOSER_HDRS (composer->hdrs)->account != NULL);
-
- id = E_MSG_COMPOSER_HDRS (composer->hdrs)->account->id;
- if (id->sig_uid)
- composer->signature = mail_config_get_signature_by_uid (id->sig_uid);
- else
- composer->signature = NULL;
-
- sig_select_item (composer);
-}
-
-/**
- * e_msg_composer_new_with_type:
- *
- * Create a new message composer widget. The type can be
- * E_MSG_COMPOSER_MAIL, E_MSG_COMPOSER_POST or E_MSG_COMPOSER_MAIL_POST.
- *
- * Return value: A pointer to the newly created widget
- **/
-
-EMsgComposer *
-e_msg_composer_new_with_type (int type)
-{
- gboolean send_html;
- GConfClient *gconf;
- EMsgComposer *new;
-
- gconf = gconf_client_get_default ();
- send_html = gconf_client_get_bool (gconf, "/apps/evolution/mail/composer/send_html", NULL);
- g_object_unref (gconf);
-
- switch (type) {
- case E_MSG_COMPOSER_MAIL:
- new = create_composer (E_MSG_COMPOSER_VISIBLE_MASK_MAIL);
- break;
- case E_MSG_COMPOSER_POST:
- new = create_composer (E_MSG_COMPOSER_VISIBLE_MASK_POST);
- break;
- default:
- new = create_composer (E_MSG_COMPOSER_VISIBLE_MASK_MAIL | E_MSG_COMPOSER_VISIBLE_MASK_POST);
- }
-
- if (new) {
- e_msg_composer_set_send_html (new, send_html);
- set_editor_signature (new);
- set_editor_text (new, "", 0, TRUE, TRUE);
- }
-
- return new;
-}
-
-/**
- * e_msg_composer_new:
- *
- * Create a new message composer widget.
- *
- * Return value: A pointer to the newly created widget
- **/
-EMsgComposer *
-e_msg_composer_new (void)
-{
- return e_msg_composer_new_with_type (E_MSG_COMPOSER_MAIL);
-}
-
-static gboolean
-is_special_header (const char *hdr_name)
-{
- /* Note: a header is a "special header" if it has any meaning:
- 1. it's not a X-* header or
- 2. it's an X-Evolution* header
- */
- if (g_ascii_strncasecmp (hdr_name, "X-", 2))
- return TRUE;
-
- if (!g_ascii_strncasecmp (hdr_name, "X-Evolution", 11))
- return TRUE;
-
- /* we can keep all other X-* headers */
-
- return FALSE;
-}
-
-static void
-e_msg_composer_set_pending_body (EMsgComposer *composer, char *text, ssize_t len)
-{
- char *old;
-
- old = g_object_get_data ((GObject *) composer, "body:text");
- g_free (old);
- g_object_set_data ((GObject *) composer, "body:text", text);
- g_object_set_data ((GObject *) composer, "body:len", GSIZE_TO_POINTER (len));
-}
-
-static void
-e_msg_composer_flush_pending_body (EMsgComposer *composer, gboolean apply)
-{
- char *body;
- ssize_t len;
-
- body = g_object_get_data ((GObject *) composer, "body:text");
- len = GPOINTER_TO_SIZE (g_object_get_data ((GObject *) composer, "body:len"));
- if (body) {
- if (apply)
- set_editor_text (composer, body, len, FALSE, FALSE);
-
- g_object_set_data ((GObject *) composer, "body:text", NULL);
- g_free (body);
- }
-}
-
-static void
-add_attachments_handle_mime_part (EMsgComposer *composer, CamelMimePart *mime_part,
- gboolean just_inlines, gboolean related, int depth)
-{
- CamelContentType *content_type;
- CamelDataWrapper *wrapper;
-
- content_type = camel_mime_part_get_content_type (mime_part);
- wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part));
-
- if (CAMEL_IS_MULTIPART (wrapper)) {
- /* another layer of multipartness... */
- add_attachments_from_multipart (composer, (CamelMultipart *) wrapper, just_inlines, depth + 1);
- } else if (just_inlines) {
- if (camel_mime_part_get_content_id (mime_part) ||
- camel_mime_part_get_content_location (mime_part))
- e_msg_composer_add_inline_image_from_mime_part (composer, mime_part);
- } else if (CAMEL_IS_MIME_MESSAGE (wrapper)) {
- /* do nothing */
- } else if (related && camel_content_type_is (content_type, "image", "*")) {
- e_msg_composer_add_inline_image_from_mime_part (composer, mime_part);
- } else {
- if (camel_content_type_is (content_type, "text", "*")) {
- /* do nothing */
- } else {
- e_msg_composer_attach (composer, mime_part);
- }
- }
-}
-
-static void
-add_attachments_from_multipart (EMsgComposer *composer, CamelMultipart *multipart,
- gboolean just_inlines, int depth)
-{
- /* find appropriate message attachments to add to the composer */
- CamelMimePart *mime_part;
- gboolean related;
- int i, nparts;
-
- related = camel_content_type_is (CAMEL_DATA_WRAPPER (multipart)->mime_type, "multipart", "related");
-
- if (CAMEL_IS_MULTIPART_SIGNED (multipart)) {
- mime_part = camel_multipart_get_part (multipart, CAMEL_MULTIPART_SIGNED_CONTENT);
- add_attachments_handle_mime_part (composer, mime_part, just_inlines, related, depth);
- } else if (CAMEL_IS_MULTIPART_ENCRYPTED (multipart)) {
- /* what should we do in this case? */
- } else {
- nparts = camel_multipart_get_number (multipart);
-
- for (i = 0; i < nparts; i++) {
- mime_part = camel_multipart_get_part (multipart, i);
- add_attachments_handle_mime_part (composer, mime_part, just_inlines, related, depth);
- }
- }
-}
-
-
-/**
- * e_msg_composer_add_message_attachments:
- * @composer: the composer to add the attachments to.
- * @message: the source message to copy the attachments from.
- * @just_inlines: whether to attach all attachments or just add
- * inline images.
- *
- * Walk through all the mime parts in @message and add them to the composer
- * specified in @composer.
- */
-void
-e_msg_composer_add_message_attachments (EMsgComposer *composer, CamelMimeMessage *message,
- gboolean just_inlines)
-{
- CamelDataWrapper *wrapper;
-
- wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (message));
- if (!CAMEL_IS_MULTIPART (wrapper))
- return;
-
- /* there must be attachments... */
- add_attachments_from_multipart (composer, (CamelMultipart *) wrapper, just_inlines, 0);
-}
-
-
-static void
-handle_multipart_signed (EMsgComposer *composer, CamelMultipart *multipart, int depth)
-{
- CamelContentType *content_type;
- CamelDataWrapper *content;
- CamelMimePart *mime_part;
-
- /* FIXME: make sure this isn't an s/mime signed part?? */
- e_msg_composer_set_pgp_sign (composer, TRUE);
-
- mime_part = camel_multipart_get_part (multipart, CAMEL_MULTIPART_SIGNED_CONTENT);
- content_type = camel_mime_part_get_content_type (mime_part);
-
- content = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part));
-
- if (CAMEL_IS_MULTIPART (content)) {
- multipart = CAMEL_MULTIPART (content);
-
- /* Note: depth is preserved here because we're not
- counting multipart/signed as a multipart, instead
- we want to treat the content part as our mime part
- here. */
-
- if (CAMEL_IS_MULTIPART_SIGNED (content)) {
- /* handle the signed content and configure the composer to sign outgoing messages */
- handle_multipart_signed (composer, multipart, depth);
- } else if (CAMEL_IS_MULTIPART_ENCRYPTED (content)) {
- /* decrypt the encrypted content and configure the composer to encrypt outgoing messages */
- handle_multipart_encrypted (composer, multipart, depth);
- } else if (camel_content_type_is (content_type, "multipart", "alternative")) {
- /* this contains the text/plain and text/html versions of the message body */
- handle_multipart_alternative (composer, multipart, depth);
- } else {
- /* there must be attachments... */
- handle_multipart (composer, multipart, depth);
- }
- } else if (camel_content_type_is (content_type, "text", "*")) {
- ssize_t len;
- char *html;
-
- html = em_utils_part_to_html (mime_part, &len, NULL);
- e_msg_composer_set_pending_body (composer, html, len);
- } else {
- e_msg_composer_attach (composer, mime_part);
- }
-}
-
-static void
-handle_multipart_encrypted (EMsgComposer *composer, CamelMultipart *multipart, int depth)
-{
- CamelContentType *content_type;
- CamelCipherContext *cipher;
- CamelDataWrapper *content;
- CamelMimePart *mime_part;
- CamelException ex;
- CamelCipherValidity *valid;
-
- /* FIXME: make sure this is a PGP/MIME encrypted part?? */
- e_msg_composer_set_pgp_encrypt (composer, TRUE);
-
- camel_exception_init (&ex);
- cipher = mail_crypto_get_pgp_cipher_context (NULL);
- mime_part = camel_mime_part_new();
- valid = camel_cipher_decrypt(cipher, (CamelMimePart *)multipart, mime_part, &ex);
- camel_object_unref(cipher);
- camel_exception_clear (&ex);
- if (valid == NULL)
- return;
- camel_cipher_validity_free(valid);
-
- content_type = camel_mime_part_get_content_type (mime_part);
-
- content = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part));
-
- if (CAMEL_IS_MULTIPART (content)) {
- multipart = CAMEL_MULTIPART (content);
-
- /* Note: depth is preserved here because we're not
- counting multipart/encrypted as a multipart, instead
- we want to treat the content part as our mime part
- here. */
-
- if (CAMEL_IS_MULTIPART_SIGNED (content)) {
- /* handle the signed content and configure the composer to sign outgoing messages */
- handle_multipart_signed (composer, multipart, depth);
- } else if (CAMEL_IS_MULTIPART_ENCRYPTED (content)) {
- /* decrypt the encrypted content and configure the composer to encrypt outgoing messages */
- handle_multipart_encrypted (composer, multipart, depth);
- } else if (camel_content_type_is (content_type, "multipart", "alternative")) {
- /* this contains the text/plain and text/html versions of the message body */
- handle_multipart_alternative (composer, multipart, depth);
- } else {
- /* there must be attachments... */
- handle_multipart (composer, multipart, depth);
- }
- } else if (camel_content_type_is (content_type, "text", "*")) {
- ssize_t len;
- char *html;
-
- html = em_utils_part_to_html (mime_part, &len, NULL);
- e_msg_composer_set_pending_body (composer, html, len);
- } else {
- e_msg_composer_attach (composer, mime_part);
- }
-
- camel_object_unref (mime_part);
-}
-
-static void
-handle_multipart_alternative (EMsgComposer *composer, CamelMultipart *multipart, int depth)
-{
- /* Find the text/html part and set the composer body to it's contents */
- CamelMimePart *text_part = NULL;
- int i, nparts;
-
- nparts = camel_multipart_get_number (multipart);
-
- for (i = 0; i < nparts; i++) {
- CamelContentType *content_type;
- CamelDataWrapper *content;
- CamelMimePart *mime_part;
-
- mime_part = camel_multipart_get_part (multipart, i);
- content_type = camel_mime_part_get_content_type (mime_part);
- content = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part));
-
- if (CAMEL_IS_MULTIPART (content)) {
- CamelMultipart *mp;
-
- mp = CAMEL_MULTIPART (content);
-
- if (CAMEL_IS_MULTIPART_SIGNED (content)) {
- /* handle the signed content and configure the composer to sign outgoing messages */
- handle_multipart_signed (composer, mp, depth + 1);
- } else if (CAMEL_IS_MULTIPART_ENCRYPTED (content)) {
- /* decrypt the encrypted content and configure the composer to encrypt outgoing messages */
- handle_multipart_encrypted (composer, mp, depth + 1);
- } else {
- /* depth doesn't matter so long as we don't pass 0 */
- handle_multipart (composer, mp, depth + 1);
- }
- } else if (camel_content_type_is (content_type, "text", "html")) {
- /* text/html is preferable, so once we find it we're done... */
- text_part = mime_part;
- break;
- } else if (camel_content_type_is (content_type, "text", "*")) {
- /* anyt text part not text/html is second rate so the first
- text part we find isn't necessarily the one we'll use. */
- if (!text_part)
- text_part = mime_part;
- } else {
- e_msg_composer_attach (composer, mime_part);
- }
- }
-
- if (text_part) {
- ssize_t len;
- char *html;
-
- html = em_utils_part_to_html(text_part, &len, NULL);
- e_msg_composer_set_pending_body(composer, html, len);
- }
-}
-
-static void
-handle_multipart (EMsgComposer *composer, CamelMultipart *multipart, int depth)
-{
- int i, nparts;
-
- nparts = camel_multipart_get_number (multipart);
-
- for (i = 0; i < nparts; i++) {
- CamelContentType *content_type;
- CamelDataWrapper *content;
- CamelMimePart *mime_part;
-
- mime_part = camel_multipart_get_part (multipart, i);
- content_type = camel_mime_part_get_content_type (mime_part);
- content = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part));
-
- if (CAMEL_IS_MULTIPART (content)) {
- CamelMultipart *mp;
-
- mp = CAMEL_MULTIPART (content);
-
- if (CAMEL_IS_MULTIPART_SIGNED (content)) {
- /* handle the signed content and configure the composer to sign outgoing messages */
- handle_multipart_signed (composer, mp, depth + 1);
- } else if (CAMEL_IS_MULTIPART_ENCRYPTED (content)) {
- /* decrypt the encrypted content and configure the composer to encrypt outgoing messages */
- handle_multipart_encrypted (composer, mp, depth + 1);
- } else if (camel_content_type_is (content_type, "multipart", "alternative")) {
- handle_multipart_alternative (composer, mp, depth + 1);
- } else {
- /* depth doesn't matter so long as we don't pass 0 */
- handle_multipart (composer, mp, depth + 1);
- }
- } else if (depth == 0 && i == 0) {
- ssize_t len;
- char *html;
-
- /* Since the first part is not multipart/alternative, then this must be the body */
- html = em_utils_part_to_html(mime_part, &len, NULL);
- e_msg_composer_set_pending_body(composer, html, len);
- } else if (camel_mime_part_get_content_id (mime_part) ||
- camel_mime_part_get_content_location (mime_part)) {
- /* special in-line attachment */
- e_msg_composer_add_inline_image_from_mime_part (composer, mime_part);
- } else {
- /* normal attachment */
- e_msg_composer_attach (composer, mime_part);
- }
- }
-}
-
-static void
-set_signature_gui (EMsgComposer *composer)
-{
- CORBA_Environment ev;
-
- composer->signature = NULL;
-
- CORBA_exception_init (&ev);
- if (GNOME_GtkHTML_Editor_Engine_searchByData (composer->editor_engine, 1, "ClueFlow", "signature", "1", &ev)) {
- char *name, *str = NULL;
-
- str = GNOME_GtkHTML_Editor_Engine_getParagraphData (composer->editor_engine, "signature_name", &ev);
- if (ev._major == CORBA_NO_EXCEPTION && str) {
- if (!strncmp (str, "uid:", 4)) {
- name = decode_signature_name (str + 4);
- composer->signature = mail_config_get_signature_by_uid (name);
- g_free (name);
- } else if (!strncmp (str, "name:", 5)) {
- name = decode_signature_name (str + 4);
- composer->signature = mail_config_get_signature_by_name (name);
- g_free (name);
- }
- }
-
- sig_select_item (composer);
- }
- CORBA_exception_free (&ev);
-}
-
-
-static void
-auto_recip_free (gpointer key, gpointer value, gpointer user_data)
-{
- g_free (key);
-}
-
-/**
- * e_msg_composer_new_with_message:
- * @message: The message to use as the source
- *
- * Create a new message composer widget.
- *
- * Note: Designed to work only for messages constructed using Evolution.
- *
- * Return value: A pointer to the newly created widget
- **/
-EMsgComposer *
-e_msg_composer_new_with_message (CamelMimeMessage *message)
-{
- const CamelInternetAddress *to, *cc, *bcc;
- GList *To = NULL, *Cc = NULL, *Bcc = NULL;
- const char *format, *subject, *postto;
- EDestination **Tov, **Ccv, **Bccv;
- GHashTable *auto_cc, *auto_bcc;
- CamelContentType *content_type;
- struct _camel_header_raw *headers;
- CamelDataWrapper *content;
- EAccount *account = NULL;
- char *account_name;
- EMsgComposer *new;
- XEvolution *xev;
- int len, i;
-
- postto = camel_medium_get_header (CAMEL_MEDIUM (message), "X-Evolution-PostTo");
-
- new = create_composer (postto ? E_MSG_COMPOSER_VISIBLE_MASK_POST : E_MSG_COMPOSER_VISIBLE_MASK_MAIL);
- if (!new)
- return NULL;
-
- if (postto)
- e_msg_composer_hdrs_set_post_to (E_MSG_COMPOSER_HDRS (new->hdrs), postto);
-
- /* Restore the Account preference */
- account_name = (char *) camel_medium_get_header (CAMEL_MEDIUM (message), "X-Evolution-Account");
- if (account_name) {
- account_name = g_strdup (account_name);
- g_strstrip (account_name);
-
- account = mail_config_get_account_by_name (account_name);
- }
-
- if (postto == NULL) {
- auto_cc = g_hash_table_new (camel_strcase_hash, camel_strcase_equal);
- auto_bcc = g_hash_table_new (camel_strcase_hash, camel_strcase_equal);
-
- if (account) {
- CamelInternetAddress *iaddr;
-
- /* hash our auto-recipients for this account */
- if (account->always_cc) {
- iaddr = camel_internet_address_new ();
- if (camel_address_decode (CAMEL_ADDRESS (iaddr), account->cc_addrs) != -1) {
- for (i = 0; i < camel_address_length (CAMEL_ADDRESS (iaddr)); i++) {
- const char *name, *addr;
-
- if (!camel_internet_address_get (iaddr, i, &name, &addr))
- continue;
-
- g_hash_table_insert (auto_cc, g_strdup (addr), GINT_TO_POINTER (TRUE));
- }
- }
- camel_object_unref (iaddr);
- }
-
- if (account->always_bcc) {
- iaddr = camel_internet_address_new ();
- if (camel_address_decode (CAMEL_ADDRESS (iaddr), account->bcc_addrs) != -1) {
- for (i = 0; i < camel_address_length (CAMEL_ADDRESS (iaddr)); i++) {
- const char *name, *addr;
-
- if (!camel_internet_address_get (iaddr, i, &name, &addr))
- continue;
-
- g_hash_table_insert (auto_bcc, g_strdup (addr), GINT_TO_POINTER (TRUE));
- }
- }
- camel_object_unref (iaddr);
- }
- }
-
- to = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_TO);
- cc = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC);
- bcc = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_BCC);
-
- len = CAMEL_ADDRESS (to)->addresses->len;
- for (i = 0; i < len; i++) {
- const char *name, *addr;
-
- if (camel_internet_address_get (to, i, &name, &addr)) {
- EDestination *dest = e_destination_new ();
- e_destination_set_name (dest, name);
- e_destination_set_email (dest, addr);
- To = g_list_append (To, dest);
- }
- }
- Tov = destination_list_to_vector (To);
- g_list_free (To);
-
- len = CAMEL_ADDRESS (cc)->addresses->len;
- for (i = 0; i < len; i++) {
- const char *name, *addr;
-
- if (camel_internet_address_get (cc, i, &name, &addr)) {
- EDestination *dest = e_destination_new ();
- e_destination_set_name (dest, name);
- e_destination_set_email (dest, addr);
-
- if (g_hash_table_lookup (auto_cc, addr))
- e_destination_set_auto_recipient (dest, TRUE);
-
- Cc = g_list_append (Cc, dest);
- }
- }
-
- Ccv = destination_list_to_vector (Cc);
- g_hash_table_foreach (auto_cc, auto_recip_free, NULL);
- g_hash_table_destroy (auto_cc);
- g_list_free (Cc);
-
- len = CAMEL_ADDRESS (bcc)->addresses->len;
- for (i = 0; i < len; i++) {
- const char *name, *addr;
-
- if (camel_internet_address_get (bcc, i, &name, &addr)) {
- EDestination *dest = e_destination_new ();
- e_destination_set_name (dest, name);
- e_destination_set_email (dest, addr);
-
- if (g_hash_table_lookup (auto_bcc, addr))
- e_destination_set_auto_recipient (dest, TRUE);
-
- Bcc = g_list_append (Bcc, dest);
- }
- }
-
- Bccv = destination_list_to_vector (Bcc);
- g_hash_table_foreach (auto_bcc, auto_recip_free, NULL);
- g_hash_table_destroy (auto_bcc);
- g_list_free (Bcc);
- } else {
- Tov = NULL;
- Ccv = NULL;
- Bccv = NULL;
- }
-
- subject = camel_mime_message_get_subject (message);
-
- e_msg_composer_set_headers (new, account_name, Tov, Ccv, Bccv, subject);
-
- g_free (account_name);
-
- e_destination_freev (Tov);
- e_destination_freev (Ccv);
- e_destination_freev (Bccv);
-
- /* Restore the format editing preference */
- format = camel_medium_get_header (CAMEL_MEDIUM (message), "X-Evolution-Format");
- if (format) {
- char **flags;
-
- while (*format && camel_mime_is_lwsp(*format))
- format++;
-
- flags = g_strsplit(format, ", ", 0);
- for (i=0;flags[i];i++) {
- printf("restoring draft flag '%s'\n", flags[i]);
-
- if (g_ascii_strcasecmp(flags[i], "text/html") == 0)
- e_msg_composer_set_send_html (new, TRUE);
- else if (g_ascii_strcasecmp(flags[i], "text/plain") == 0)
- e_msg_composer_set_send_html (new, FALSE);
- else if (g_ascii_strcasecmp(flags[i], "pgp-sign") == 0)
- e_msg_composer_set_pgp_sign(new, TRUE);
- else if (g_ascii_strcasecmp(flags[i], "pgp-encrypt") == 0)
- e_msg_composer_set_pgp_encrypt(new, TRUE);
- else if (g_ascii_strcasecmp(flags[i], "smime-sign") == 0)
- e_msg_composer_set_smime_sign(new, TRUE);
- else if (g_ascii_strcasecmp(flags[i], "smime-encrypt") == 0)
- e_msg_composer_set_smime_encrypt(new, TRUE);
- }
- g_strfreev(flags);
- }
-
- /* Remove any other X-Evolution-* headers that may have been set */
- xev = mail_tool_remove_xevolution_headers (message);
- mail_tool_destroy_xevolution (xev);
-
- /* set extra headers */
- headers = CAMEL_MIME_PART (message)->headers;
- while (headers) {
- if (!is_special_header (headers->name) ||
- !g_ascii_strcasecmp (headers->name, "References") ||
- !g_ascii_strcasecmp (headers->name, "In-Reply-To")) {
- g_ptr_array_add (new->extra_hdr_names, g_strdup (headers->name));
- g_ptr_array_add (new->extra_hdr_values, g_strdup (headers->value));
- }
-
- headers = headers->next;
- }
-
- /* Restore the attachments and body text */
- content = camel_medium_get_content_object (CAMEL_MEDIUM (message));
- if (CAMEL_IS_MULTIPART (content)) {
- CamelMultipart *multipart;
-
- multipart = CAMEL_MULTIPART (content);
- content_type = camel_mime_part_get_content_type (CAMEL_MIME_PART (message));
-
- if (CAMEL_IS_MULTIPART_SIGNED (content)) {
- /* handle the signed content and configure the composer to sign outgoing messages */
- handle_multipart_signed (new, multipart, 0);
- } else if (CAMEL_IS_MULTIPART_ENCRYPTED (content)) {
- /* decrypt the encrypted content and configure the composer to encrypt outgoing messages */
- handle_multipart_encrypted (new, multipart, 0);
- } else if (camel_content_type_is (content_type, "multipart", "alternative")) {
- /* this contains the text/plain and text/html versions of the message body */
- handle_multipart_alternative (new, multipart, 0);
- } else {
- /* there must be attachments... */
- handle_multipart (new, multipart, 0);
- }
- } else {
- ssize_t len;
- char *html;
-
- html = em_utils_part_to_html((CamelMimePart *)message, &len, NULL);
- e_msg_composer_set_pending_body(new, html, len);
- }
-
- /* We wait until now to set the body text because we need to ensure that
- * the attachment bar has all the attachments, before we request them.
- */
- e_msg_composer_flush_pending_body (new, TRUE);
-
- set_signature_gui (new);
-
- return new;
-}
-
-static void
-disable_editor (EMsgComposer *composer)
-{
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "editable-off", &ev);
- CORBA_exception_free (&ev);
-
- gtk_widget_set_sensitive (composer->attachment_bar, FALSE);
-
- bonobo_ui_component_set_prop (composer->uic, "/menu/Edit", "sensitive", "0", NULL);
- bonobo_ui_component_set_prop (composer->uic, "/menu/Format", "sensitive", "0", NULL);
- bonobo_ui_component_set_prop (composer->uic, "/menu/Insert", "sensitive", "0", NULL);
-}
-
-/**
- * e_msg_composer_new_redirect:
- * @message: The message to use as the source
- *
- * Create a new message composer widget.
- *
- * Return value: A pointer to the newly created widget
- **/
-EMsgComposer *
-e_msg_composer_new_redirect (CamelMimeMessage *message, const char *resent_from)
-{
- EMsgComposer *composer;
- const char *subject;
-
- g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), NULL);
-
- composer = e_msg_composer_new_with_message (message);
- subject = camel_mime_message_get_subject (message);
-
- composer->redirect = message;
- camel_object_ref (message);
-
- e_msg_composer_set_headers (composer, resent_from, NULL, NULL, NULL, subject);
-
- disable_editor (composer);
-
- return composer;
-}
-
-
-static GList *
-add_recipients (GList *list, const char *recips)
-{
- CamelInternetAddress *cia;
- const char *name, *addr;
- int num, i;
-
- cia = camel_internet_address_new ();
- num = camel_address_decode (CAMEL_ADDRESS (cia), recips);
-
- for (i = 0; i < num; i++) {
- if (camel_internet_address_get (cia, i, &name, &addr)) {
- EDestination *dest = e_destination_new ();
- e_destination_set_name (dest, name);
- e_destination_set_email (dest, addr);
-
- list = g_list_append (list, dest);
- }
- }
-
- return list;
-}
-
-static void
-handle_mailto (EMsgComposer *composer, const char *mailto)
-{
- EMsgComposerHdrs *hdrs;
- GList *to = NULL, *cc = NULL, *bcc = NULL;
- EDestination **tov, **ccv, **bccv;
- char *subject = NULL, *body = NULL;
- char *header, *content, *buf;
- size_t nread, nwritten;
- const char *p;
- int len, clen;
- CamelURL *url;
-
- buf = g_strdup (mailto);
-
- /* Parse recipients (everything after ':' until '?' or eos). */
- p = buf + 7;
- len = strcspn (p, "?");
- if (len) {
- content = g_strndup (p, len);
- camel_url_decode (content);
- to = add_recipients (to, content);
- g_free (content);
- }
-
- p += len;
- if (*p == '?') {
- p++;
-
- while (*p) {
- len = strcspn (p, "=&");
-
- /* If it's malformed, give up. */
- if (p[len] != '=')
- break;
-
- header = (char *) p;
- header[len] = '\0';
- p += len + 1;
-
- clen = strcspn (p, "&");
-
- content = g_strndup (p, clen);
- camel_url_decode (content);
-
- if (!g_ascii_strcasecmp (header, "to")) {
- to = add_recipients (to, content);
- } else if (!g_ascii_strcasecmp (header, "cc")) {
- cc = add_recipients (cc, content);
- } else if (!g_ascii_strcasecmp (header, "bcc")) {
- bcc = add_recipients (bcc, content);
- } else if (!g_ascii_strcasecmp (header, "subject")) {
- g_free (subject);
- if (g_utf8_validate (content, -1, NULL)) {
- subject = content;
- content = NULL;
- } else {
- subject = g_locale_to_utf8 (content, clen, &nread,
- &nwritten, NULL);
- if (subject) {
- subject = g_realloc (subject, nwritten + 1);
- subject[nwritten] = '\0';
- }
- }
- } else if (!g_ascii_strcasecmp (header, "body")) {
- g_free (body);
- if (g_utf8_validate (content, -1, NULL)) {
- body = content;
- content = NULL;
- } else {
- body = g_locale_to_utf8 (content, clen, &nread,
- &nwritten, NULL);
- if (body) {
- body = g_realloc (body, nwritten + 1);
- body[nwritten] = '\0';
- }
- }
- } else if (!g_ascii_strcasecmp (header, "attach") ||
- !g_ascii_strcasecmp (header, "attachment")) {
- /* Change file url to absolute path */
- if (!g_ascii_strncasecmp (content, "file:", 5)) {
- url = camel_url_new (content, NULL);
- e_msg_composer_attachment_bar_attach (E_MSG_COMPOSER_ATTACHMENT_BAR (composer->attachment_bar),
- url->path);
- camel_url_free (url);
- } else {
- e_msg_composer_attachment_bar_attach (E_MSG_COMPOSER_ATTACHMENT_BAR (composer->attachment_bar),
- content);
- }
- } else if (!g_ascii_strcasecmp (header, "from")) {
- /* Ignore */
- } else if (!g_ascii_strcasecmp (header, "reply-to")) {
- /* ignore */
- } else {
- /* add an arbitrary header? */
- e_msg_composer_add_header (composer, header, content);
- }
-
- g_free (content);
-
- p += clen;
- if (*p == '&') {
- p++;
- if (!strcmp (p, "amp;"))
- p += 4;
- }
- }
- }
-
- g_free (buf);
-
- tov = destination_list_to_vector (to);
- ccv = destination_list_to_vector (cc);
- bccv = destination_list_to_vector (bcc);
-
- g_list_free (to);
- g_list_free (cc);
- g_list_free (bcc);
-
- hdrs = E_MSG_COMPOSER_HDRS (composer->hdrs);
-
- e_msg_composer_hdrs_set_to (hdrs, tov);
- e_msg_composer_hdrs_set_cc (hdrs, ccv);
- e_msg_composer_hdrs_set_bcc (hdrs, bccv);
-
- e_destination_freev (tov);
- e_destination_freev (ccv);
- e_destination_freev (bccv);
-
- if (subject) {
- e_msg_composer_hdrs_set_subject (hdrs, subject);
- g_free (subject);
- }
-
- if (body) {
- char *htmlbody;
-
- htmlbody = camel_text_to_html (body, CAMEL_MIME_FILTER_TOHTML_PRE, 0);
- set_editor_text (composer, htmlbody, -1, FALSE, FALSE);
- g_free (htmlbody);
- }
-}
-
-/**
- * e_msg_composer_new_from_url:
- * @url: a mailto URL
- *
- * Create a new message composer widget, and fill in fields as
- * defined by the provided URL.
- **/
-EMsgComposer *
-e_msg_composer_new_from_url (const char *url)
-{
- EMsgComposer *composer;
-
- g_return_val_if_fail (g_ascii_strncasecmp (url, "mailto:", 7) == 0, NULL);
-
- composer = e_msg_composer_new ();
- if (!composer)
- return NULL;
-
- handle_mailto (composer, url);
-
- return composer;
-}
-
-
-/**
- * e_msg_composer_show_attachments:
- * @composer: A message composer widget
- * @show: A boolean specifying whether the attachment bar should be shown or
- * not
- *
- * If @show is %FALSE, hide the attachment bar. Otherwise, show it.
- **/
-void
-e_msg_composer_show_attachments (EMsgComposer *composer,
- gboolean show)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- show_attachments (composer, show);
-}
-
-
-/**
- * e_msg_composer_set_headers:
- * @composer: a composer object
- * @from: the name of the account the user will send from,
- * or %NULL for the default account
- * @to: the values for the "To" header
- * @cc: the values for the "Cc" header
- * @bcc: the values for the "Bcc" header
- * @subject: the value for the "Subject" header
- *
- * Sets the headers in the composer to the given values.
- **/
-void
-e_msg_composer_set_headers (EMsgComposer *composer,
- const char *from,
- EDestination **to,
- EDestination **cc,
- EDestination **bcc,
- const char *subject)
-{
- EMsgComposerHdrs *hdrs;
-
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- hdrs = E_MSG_COMPOSER_HDRS (composer->hdrs);
-
- e_msg_composer_hdrs_set_to (hdrs, to);
- e_msg_composer_hdrs_set_cc (hdrs, cc);
- e_msg_composer_hdrs_set_bcc (hdrs, bcc);
- e_msg_composer_hdrs_set_subject (hdrs, subject);
- e_msg_composer_hdrs_set_from_account (hdrs, from);
-}
-
-
-/**
- * e_msg_composer_set_body_text:
- * @composer: a composer object
- * @text: the HTML text to initialize the editor with
- *
- * Loads the given HTML text into the editor.
- **/
-void
-e_msg_composer_set_body_text (EMsgComposer *composer, const char *text, ssize_t len)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- set_editor_text (composer, text, len, TRUE, text == "");
-}
-
-/**
- * e_msg_composer_set_body:
- * @composer: a composer object
- * @body: the data to initialize the composer with
- * @mime_type: the MIME type of data
- *
- * Loads the given data into the composer as the message body.
- * This function should only be used by the CORBA composer factory.
- **/
-void
-e_msg_composer_set_body (EMsgComposer *composer, const char *body,
- const char *mime_type)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- set_editor_text (composer, _("<b>(The composer contains a non-text message body, which cannot be edited.)<b>"), -1, FALSE, FALSE);
- e_msg_composer_set_send_html (composer, FALSE);
- disable_editor (composer);
-
- g_free (composer->mime_body);
- composer->mime_body = g_strdup (body);
- g_free (composer->mime_type);
- composer->mime_type = g_strdup (mime_type);
-
- if (g_ascii_strncasecmp (composer->mime_type, "text/calendar", 13) == 0) {
- EMsgComposerHdrs *hdrs = E_MSG_COMPOSER_HDRS (composer->hdrs);
- if (hdrs->account && hdrs->account->pgp_no_imip_sign)
- e_msg_composer_set_pgp_sign (composer, FALSE);
- }
-}
-
-
-/**
- * e_msg_composer_add_header:
- * @composer: a composer object
- * @name: the header name
- * @value: the header value
- *
- * Adds a header with @name and @value to the message. This header
- * may not be displayed by the composer, but will be included in
- * the message it outputs.
- **/
-void
-e_msg_composer_add_header (EMsgComposer *composer, const char *name,
- const char *value)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
- g_return_if_fail (name != NULL);
- g_return_if_fail (value != NULL);
-
- g_ptr_array_add (composer->extra_hdr_names, g_strdup (name));
- g_ptr_array_add (composer->extra_hdr_values, g_strdup (value));
-}
-
-
-/**
- * e_msg_composer_attach:
- * @composer: a composer object
- * @attachment: the CamelMimePart to attach
- *
- * Attaches @attachment to the message being composed in the composer.
- **/
-void
-e_msg_composer_attach (EMsgComposer *composer, CamelMimePart *attachment)
-{
- EMsgComposerAttachmentBar *bar;
-
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
- g_return_if_fail (CAMEL_IS_MIME_PART (attachment));
-
- bar = E_MSG_COMPOSER_ATTACHMENT_BAR (composer->attachment_bar);
- e_msg_composer_attachment_bar_attach_mime_part (bar, attachment);
-}
-
-
-/**
- * e_msg_composer_add_inline_image_from_file:
- * @composer: a composer object
- * @file_name: the name of the file containing the image
- *
- * This reads in the image in @file_name and adds it to @composer
- * as an inline image, to be wrapped in a multipart/related.
- *
- * Return value: the newly-created CamelMimePart (which must be reffed
- * if the caller wants to keep its own reference), or %NULL on error.
- **/
-CamelMimePart *
-e_msg_composer_add_inline_image_from_file (EMsgComposer *composer,
- const char *file_name)
-{
- char *mime_type, *cid, *url, *name;
- CamelStream *stream;
- CamelDataWrapper *wrapper;
- CamelMimePart *part;
- struct stat statbuf;
-
- /* check for regular file */
- if (stat (file_name, &statbuf) < 0 || !S_ISREG (statbuf.st_mode))
- return NULL;
-
- stream = camel_stream_fs_new_with_name (file_name, O_RDONLY, 0);
- if (!stream)
- return NULL;
-
- wrapper = camel_data_wrapper_new ();
- camel_data_wrapper_construct_from_stream (wrapper, stream);
- camel_object_unref (CAMEL_OBJECT (stream));
-
- mime_type = e_msg_composer_guess_mime_type (file_name);
- camel_data_wrapper_set_mime_type (wrapper, mime_type ? mime_type : "application/octet-stream");
- g_free (mime_type);
-
- part = camel_mime_part_new ();
- camel_medium_set_content_object (CAMEL_MEDIUM (part), wrapper);
- camel_object_unref (wrapper);
-
- cid = camel_header_msgid_generate ();
- camel_mime_part_set_content_id (part, cid);
- name = g_path_get_basename(file_name);
- camel_mime_part_set_filename (part, name);
- g_free(name);
- camel_mime_part_set_encoding (part, CAMEL_TRANSFER_ENCODING_BASE64);
-
- url = g_strdup_printf ("file:%s", file_name);
- g_hash_table_insert (composer->inline_images_by_url, url, part);
-
- url = g_strdup_printf ("cid:%s", cid);
- g_hash_table_insert (composer->inline_images, url, part);
- g_free (cid);
-
- return part;
-}
-
-
-/**
- * e_msg_composer_add_inline_image_from_mime_part:
- * @composer: a composer object
- * @part: a CamelMimePart containing image data
- *
- * This adds the mime part @part to @composer as an inline image, to
- * be wrapped in a multipart/related.
- **/
-void
-e_msg_composer_add_inline_image_from_mime_part (EMsgComposer *composer,
- CamelMimePart *part)
-{
- char *url;
- const char *location, *cid;
-
- cid = camel_mime_part_get_content_id (part);
- if (!cid) {
- camel_mime_part_set_content_id (part, NULL);
- cid = camel_mime_part_get_content_id (part);
- }
-
- url = g_strdup_printf ("cid:%s", cid);
- g_hash_table_insert (composer->inline_images, url, part);
- camel_object_ref (part);
-
- location = camel_mime_part_get_content_location (part);
- if (location) {
- g_hash_table_insert (composer->inline_images_by_url,
- g_strdup (location), part);
- }
-}
-
-
-/**
- * e_msg_composer_get_message:
- * @composer: A message composer widget
- *
- * Retrieve the message edited by the user as a CamelMimeMessage. The
- * CamelMimeMessage object is created on the fly; subsequent calls to this
- * function will always create new objects from scratch.
- *
- * Return value: A pointer to the new CamelMimeMessage object
- **/
-CamelMimeMessage *
-e_msg_composer_get_message (EMsgComposer *composer, gboolean save_html_object_data)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
-
- return build_message (composer, save_html_object_data);
-}
-
-CamelMimeMessage *
-e_msg_composer_get_message_draft (EMsgComposer *composer)
-{
- CamelMimeMessage *msg;
- EAccount *account;
- gboolean old_flags[4];
- gboolean old_send_html;
- GString *flags;
- int i;
-
- /* always save drafts as HTML to preserve formatting */
- old_send_html = composer->send_html;
- composer->send_html = TRUE;
- old_flags[0] = composer->pgp_sign;
- composer->pgp_sign = FALSE;
- old_flags[1] = composer->pgp_encrypt;
- composer->pgp_encrypt = FALSE;
- old_flags[2] = composer->smime_sign;
- composer->smime_sign = FALSE;
- old_flags[3] = composer->smime_encrypt;
- composer->smime_encrypt = FALSE;
-
- msg = e_msg_composer_get_message (composer, TRUE);
-
- composer->send_html = old_send_html;
- composer->pgp_sign = old_flags[0];
- composer->pgp_encrypt = old_flags[1];
- composer->smime_sign = old_flags[2];
- composer->smime_encrypt = old_flags[3];
-
- /* Attach account info to the draft. */
- account = e_msg_composer_get_preferred_account (composer);
- if (account && account->name)
- camel_medium_set_header (CAMEL_MEDIUM (msg), "X-Evolution-Account", account->name);
-
- /* build_message() set this to text/html since we set composer->send_html to
- TRUE before calling e_msg_composer_get_message() */
- if (!composer->send_html)
- flags = g_string_new("text/plain");
- else
- flags = g_string_new("text/html");
-
- /* This should probably only save the setting if it is
- * different from the from-account default? */
- for (i=0;i<4;i++) {
- if (old_flags[i])
- g_string_append_printf(flags, ", %s", emc_draft_format_names[i]);
- }
-
- camel_medium_set_header (CAMEL_MEDIUM (msg), "X-Evolution-Format", flags->str);
- g_string_free(flags, TRUE);
-
- return msg;
-}
-
-
-static void
-delete_old_signature (EMsgComposer *composer)
-{
- CORBA_Environment ev;
-
- /* printf ("delete_old_signature\n"); */
- CORBA_exception_init (&ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "cursor-bod", &ev);
- if (GNOME_GtkHTML_Editor_Engine_searchByData (composer->editor_engine, 1, "ClueFlow", "signature", "1", &ev)) {
- /* printf ("found\n"); */
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "select-paragraph", &ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "delete", &ev);
- /* selection-move-right doesn't succeed means that we are already on the end of document */
- /* if (!rv)
- break; */
- GNOME_GtkHTML_Editor_Engine_setParagraphData (composer->editor_engine, "signature", "0", &ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "delete-back", &ev);
- }
- CORBA_exception_free (&ev);
-}
-
-
-/**
- * e_msg_composer_show_sig:
- * @composer: A message composer widget
- *
- * Set a signature
- **/
-void
-e_msg_composer_show_sig_file (EMsgComposer *composer)
-{
- CORBA_Environment ev;
- char *html;
-
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- /* printf ("e_msg_composer_show_sig_file\n"); */
- /* printf ("set sig '%s' '%s'\n", sig_file, composer->sig_file); */
-
- composer->in_signature_insert = TRUE;
- CORBA_exception_init (&ev);
- GNOME_GtkHTML_Editor_Engine_freeze (composer->editor_engine, &ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "cursor-position-save", &ev);
- GNOME_GtkHTML_Editor_Engine_undoBegin (composer->editor_engine, "Set signature", "Reset signature", &ev);
-
- delete_old_signature (composer);
- html = get_signature_html (composer);
- if (html) {
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "insert-paragraph", &ev);
- if (!GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "cursor-backward", &ev))
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "insert-paragraph", &ev);
- else
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "cursor-forward", &ev);
- /* printf ("insert %s\n", html); */
- GNOME_GtkHTML_Editor_Engine_setParagraphData (composer->editor_engine, "orig", "0", &ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "indent-zero", &ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "style-normal", &ev);
- GNOME_GtkHTML_Editor_Engine_insertHTML (composer->editor_engine, html, &ev);
- g_free (html);
- }
-
- GNOME_GtkHTML_Editor_Engine_undoEnd (composer->editor_engine, &ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "cursor-position-restore", &ev);
- GNOME_GtkHTML_Editor_Engine_thaw (composer->editor_engine, &ev);
- CORBA_exception_free (&ev);
- composer->in_signature_insert = FALSE;
-
- /* printf ("e_msg_composer_show_sig_file end\n"); */
-}
-
-
-/**
- * e_msg_composer_set_send_html:
- * @composer: A message composer widget
- * @send_html: Whether the composer should have the "Send HTML" flag set
- *
- * Set the status of the "Send HTML" toggle item. The user can override it.
- **/
-void
-e_msg_composer_set_send_html (EMsgComposer *composer,
- gboolean send_html)
-{
- CORBA_Environment ev;
-
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- if (composer->send_html && send_html)
- return;
-
- if (!composer->send_html && !send_html)
- return;
-
- composer->send_html = send_html;
-
- CORBA_exception_init (&ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "block-redraw", &ev);
- CORBA_exception_free (&ev);
-
- bonobo_ui_component_set_prop (composer->uic, "/commands/FormatHtml",
- "state", composer->send_html ? "1" : "0", NULL);
-
- /* let the editor know which mode we are in */
- bonobo_widget_set_property (BONOBO_WIDGET (composer->editor),
- "FormatHTML", TC_CORBA_boolean,
- composer->send_html, NULL);
-
- CORBA_exception_init (&ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "unblock-redraw", &ev);
- CORBA_exception_free (&ev);
-}
-
-
-/**
- * e_msg_composer_get_send_html:
- * @composer: A message composer widget
- *
- * Get the status of the "Send HTML mail" flag.
- *
- * Return value: The status of the "Send HTML mail" flag.
- **/
-gboolean
-e_msg_composer_get_send_html (EMsgComposer *composer)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
-
- return composer->send_html;
-}
-
-
-/**
- * e_msg_composer_get_preferred_account:
- * @composer: composer
- *
- * Returns the user-specified account (from field).
- */
-EAccount *
-e_msg_composer_get_preferred_account (EMsgComposer *composer)
-{
- EMsgComposerHdrs *hdrs;
-
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
-
- hdrs = E_MSG_COMPOSER_HDRS (composer->hdrs);
-
- return hdrs->account;
-}
-
-
-/**
- * e_msg_composer_set_pgp_sign:
- * @composer: A message composer widget
- * @send_html: Whether the composer should have the "PGP Sign" flag set
- *
- * Set the status of the "PGP Sign" toggle item. The user can override it.
- **/
-void
-e_msg_composer_set_pgp_sign (EMsgComposer *composer, gboolean pgp_sign)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- if (composer->pgp_sign && pgp_sign)
- return;
- if (!composer->pgp_sign && !pgp_sign)
- return;
-
- composer->pgp_sign = pgp_sign;
- e_msg_composer_set_changed (composer);
-
- bonobo_ui_component_set_prop (composer->uic, "/commands/SecurityPGPSign",
- "state", composer->pgp_sign ? "1" : "0", NULL);
-}
-
-
-/**
- * e_msg_composer_get_pgp_sign:
- * @composer: A message composer widget
- *
- * Get the status of the "PGP Sign" flag.
- *
- * Return value: The status of the "PGP Sign" flag.
- **/
-gboolean
-e_msg_composer_get_pgp_sign (EMsgComposer *composer)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
-
- return composer->pgp_sign;
-}
-
-
-/**
- * e_msg_composer_set_pgp_encrypt:
- * @composer: A message composer widget
- * @send_html: Whether the composer should have the "PGP Encrypt" flag set
- *
- * Set the status of the "PGP Encrypt" toggle item. The user can override it.
- **/
-void
-e_msg_composer_set_pgp_encrypt (EMsgComposer *composer, gboolean pgp_encrypt)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- if (composer->pgp_encrypt && pgp_encrypt)
- return;
- if (!composer->pgp_encrypt && !pgp_encrypt)
- return;
-
- composer->pgp_encrypt = pgp_encrypt;
- e_msg_composer_set_changed (composer);
-
- bonobo_ui_component_set_prop (composer->uic, "/commands/SecurityPGPEncrypt",
- "state", composer->pgp_encrypt ? "1" : "0", NULL);
-}
-
-
-/**
- * e_msg_composer_get_pgp_encrypt:
- * @composer: A message composer widget
- *
- * Get the status of the "PGP Encrypt" flag.
- *
- * Return value: The status of the "PGP Encrypt" flag.
- **/
-gboolean
-e_msg_composer_get_pgp_encrypt (EMsgComposer *composer)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
-
- return composer->pgp_encrypt;
-}
-
-
-/**
- * e_msg_composer_set_smime_sign:
- * @composer: A message composer widget
- * @send_html: Whether the composer should have the "S/MIME Sign" flag set
- *
- * Set the status of the "S/MIME Sign" toggle item. The user can override it.
- **/
-void
-e_msg_composer_set_smime_sign (EMsgComposer *composer, gboolean smime_sign)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- if (composer->smime_sign && smime_sign)
- return;
- if (!composer->smime_sign && !smime_sign)
- return;
-
- composer->smime_sign = smime_sign;
- e_msg_composer_set_changed (composer);
-
- bonobo_ui_component_set_prop (composer->uic, "/commands/SecuritySMimeSign",
- "state", composer->smime_sign ? "1" : "0", NULL);
-}
-
-
-/**
- * e_msg_composer_get_smime_sign:
- * @composer: A message composer widget
- *
- * Get the status of the "S/MIME Sign" flag.
- *
- * Return value: The status of the "S/MIME Sign" flag.
- **/
-gboolean
-e_msg_composer_get_smime_sign (EMsgComposer *composer)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
-
- return composer->smime_sign;
-}
-
-
-/**
- * e_msg_composer_set_smime_encrypt:
- * @composer: A message composer widget
- * @send_html: Whether the composer should have the "S/MIME Encrypt" flag set
- *
- * Set the status of the "S/MIME Encrypt" toggle item. The user can override it.
- **/
-void
-e_msg_composer_set_smime_encrypt (EMsgComposer *composer, gboolean smime_encrypt)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- if (composer->smime_encrypt && smime_encrypt)
- return;
- if (!composer->smime_encrypt && !smime_encrypt)
- return;
-
- composer->smime_encrypt = smime_encrypt;
- e_msg_composer_set_changed (composer);
-
- bonobo_ui_component_set_prop (composer->uic, "/commands/SecuritySMimeEncrypt",
- "state", composer->smime_encrypt ? "1" : "0", NULL);
-}
-
-
-/**
- * e_msg_composer_get_smime_encrypt:
- * @composer: A message composer widget
- *
- * Get the status of the "S/MIME Encrypt" flag.
- *
- * Return value: The status of the "S/MIME Encrypt" flag.
- **/
-gboolean
-e_msg_composer_get_smime_encrypt (EMsgComposer *composer)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
-
- return composer->smime_encrypt;
-}
-
-
-/**
- * e_msg_composer_get_view_from:
- * @composer: A message composer widget
- *
- * Get the status of the "View From header" flag.
- *
- * Return value: The status of the "View From header" flag.
- **/
-gboolean
-e_msg_composer_get_view_from (EMsgComposer *composer)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
-
- return composer->view_from;
-}
-
-
-/**
- * e_msg_composer_set_view_from:
- * @composer: A message composer widget
- * @state: whether to show or hide the From selector
- *
- * Controls the state of the From selector
- */
-void
-e_msg_composer_set_view_from (EMsgComposer *composer, gboolean view_from)
-{
- GConfClient *gconf;
-
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- if ((composer->view_from && view_from) ||
- (!composer->view_from && !view_from))
- return;
-
- composer->view_from = view_from;
- bonobo_ui_component_set_prop (composer->uic, "/commands/ViewFrom",
- "state", composer->view_from ? "1" : "0", NULL);
-
- gconf = gconf_client_get_default ();
- gconf_client_set_bool (gconf, "/apps/evolution/mail/composer/view/From", view_from, NULL);
- g_object_unref (gconf);
-
- e_msg_composer_hdrs_set_visible (E_MSG_COMPOSER_HDRS (composer->hdrs),
- e_msg_composer_get_visible_flags (composer));
-}
-
-
-/**
- * e_msg_composer_get_view_replyto:
- * @composer: A message composer widget
- *
- * Get the status of the "View Reply-To header" flag.
- *
- * Return value: The status of the "View Reply-To header" flag.
- **/
-gboolean
-e_msg_composer_get_view_replyto (EMsgComposer *composer)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
-
- return composer->view_replyto;
-}
-
-
-/**
- * e_msg_composer_set_view_replyto:
- * @composer: A message composer widget
- * @state: whether to show or hide the Reply-To selector
- *
- * Controls the state of the Reply-To selector
- */
-void
-e_msg_composer_set_view_replyto (EMsgComposer *composer, gboolean view_replyto)
-{
- GConfClient *gconf;
-
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- if ((composer->view_replyto && view_replyto) ||
- (!composer->view_replyto && !view_replyto))
- return;
-
- composer->view_replyto = view_replyto;
- bonobo_ui_component_set_prop (composer->uic, "/commands/ViewReplyTo",
- "state", composer->view_replyto ? "1" : "0", NULL);
-
- /* we do this /only/ if the fields is in the visible_mask */
- gconf = gconf_client_get_default ();
- gconf_client_set_bool (gconf, "/apps/evolution/mail/composer/view/ReplyTo", view_replyto, NULL);
- g_object_unref (gconf);
-
- e_msg_composer_hdrs_set_visible (E_MSG_COMPOSER_HDRS (composer->hdrs),
- e_msg_composer_get_visible_flags (composer));
-}
-
-
-/**
- * e_msg_composer_get_view_to:
- * @composer: A message composer widget
- *
- * Get the status of the "View To header" flag.
- *
- * Return value: The status of the "View To header" flag.
- **/
-gboolean
-e_msg_composer_get_view_to (EMsgComposer *composer)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
-
- return composer->view_to;
-}
-
-
-/**
- * e_msg_composer_set_view_to:
- * @composer: A message composer widget
- * @state: whether to show or hide the To selector
- *
- * Controls the state of the To selector
- */
-void
-e_msg_composer_set_view_to (EMsgComposer *composer, gboolean view_to)
-{
- GConfClient *gconf;
-
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- if ((composer->view_to && view_to) ||
- (!composer->view_to && !view_to))
- return;
-
- composer->view_to = view_to;
- bonobo_ui_component_set_prop (composer->uic, "/commands/ViewTo",
- "state", composer->view_to ? "1" : "0", NULL);
-
- if ((E_MSG_COMPOSER_HDRS(composer->hdrs))->visible_mask & E_MSG_COMPOSER_VISIBLE_TO) {
- gconf = gconf_client_get_default ();
- gconf_client_set_bool (gconf, "/apps/evolution/mail/composer/view/To", view_to, NULL);
- g_object_unref (gconf);
- }
-
- e_msg_composer_hdrs_set_visible (E_MSG_COMPOSER_HDRS (composer->hdrs),
- e_msg_composer_get_visible_flags (composer));
-}
-
-
-
-/**
- * e_msg_composer_get_view_postto:
- * @composer: A message composer widget
- *
- * Get the status of the "View PostTo header" flag.
- *
- * Return value: The status of the "View PostTo header" flag.
- **/
-gboolean
-e_msg_composer_get_view_postto (EMsgComposer *composer)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
-
- return composer->view_postto;
-}
-
-
-/**
- * e_msg_composer_set_view_postto:
- * @composer: A message composer widget
- * @state: whether to show or hide the PostTo selector
- *
- * Controls the state of the PostTo selector
- */
-void
-e_msg_composer_set_view_postto (EMsgComposer *composer, gboolean view_postto)
-{
- GConfClient *gconf;
-
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- if ((composer->view_postto && view_postto) ||
- (!composer->view_postto && !view_postto))
- return;
-
- composer->view_postto = view_postto;
- bonobo_ui_component_set_prop (composer->uic, "/commands/ViewPostTo",
- "state", composer->view_postto ? "1" : "0", NULL);
-
- if ((E_MSG_COMPOSER_HDRS(composer->hdrs))->visible_mask & E_MSG_COMPOSER_VISIBLE_POSTTO) {
- gconf = gconf_client_get_default ();
- gconf_client_set_bool (gconf, "/apps/evolution/mail/composer/view/PostTo", view_postto, NULL);
- g_object_unref (gconf);
- }
-
- e_msg_composer_hdrs_set_visible (E_MSG_COMPOSER_HDRS (composer->hdrs),
- e_msg_composer_get_visible_flags (composer));
-}
-
-
-
-/**
- * e_msg_composer_get_view_cc:
- * @composer: A message composer widget
- *
- * Get the status of the "View CC header" flag.
- *
- * Return value: The status of the "View CC header" flag.
- **/
-gboolean
-e_msg_composer_get_view_cc (EMsgComposer *composer)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
-
- return composer->view_cc;
-}
-
-
-/**
- * e_msg_composer_set_view_cc:
- * @composer: A message composer widget
- * @state: whether to show or hide the cc view
- *
- * Controls the state of the CC display
- */
-void
-e_msg_composer_set_view_cc (EMsgComposer *composer, gboolean view_cc)
-{
- GConfClient *gconf;
-
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- if ((composer->view_cc && view_cc) ||
- (!composer->view_cc && !view_cc))
- return;
-
- composer->view_cc = view_cc;
- bonobo_ui_component_set_prop (composer->uic, "/commands/ViewCC",
- "state", composer->view_cc ? "1" : "0", NULL);
-
- if ((E_MSG_COMPOSER_HDRS (composer->hdrs))->visible_mask & E_MSG_COMPOSER_VISIBLE_CC) {
- gconf = gconf_client_get_default ();
- gconf_client_set_bool (gconf, "/apps/evolution/mail/composer/view/Cc", view_cc, NULL);
- g_object_unref (gconf);
- }
-
- e_msg_composer_hdrs_set_visible (E_MSG_COMPOSER_HDRS (composer->hdrs),
- e_msg_composer_get_visible_flags (composer));
-}
-
-
-/**
- * e_msg_composer_get_view_bcc:
- * @composer: A message composer widget
- *
- * Get the status of the "View BCC header" flag.
- *
- * Return value: The status of the "View BCC header" flag.
- **/
-gboolean
-e_msg_composer_get_view_bcc (EMsgComposer *composer)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
-
- return composer->view_bcc;
-}
-
-
-/**
- * e_msg_composer_set_view_bcc:
- * @composer: A message composer widget
- * @state: whether to show or hide the bcc view
- *
- * Controls the state of the BCC display
- */
-void
-e_msg_composer_set_view_bcc (EMsgComposer *composer, gboolean view_bcc)
-{
- GConfClient *gconf;
-
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- if ((composer->view_bcc && view_bcc) ||
- (!composer->view_bcc && !view_bcc))
- return;
-
- composer->view_bcc = view_bcc;
- bonobo_ui_component_set_prop (composer->uic, "/commands/ViewBCC",
- "state", composer->view_bcc ? "1" : "0", NULL);
-
- if ((E_MSG_COMPOSER_HDRS (composer->hdrs))->visible_mask & E_MSG_COMPOSER_VISIBLE_BCC) {
- gconf = gconf_client_get_default ();
- gconf_client_set_bool (gconf, "/apps/evolution/mail/composer/view/Bcc", view_bcc, NULL);
- g_object_unref (gconf);
- }
-
- e_msg_composer_hdrs_set_visible (E_MSG_COMPOSER_HDRS (composer->hdrs),
- e_msg_composer_get_visible_flags (composer));
-}
-
-
-EDestination **
-e_msg_composer_get_recipients (EMsgComposer *composer)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
-
- return composer->hdrs ? e_msg_composer_hdrs_get_recipients (E_MSG_COMPOSER_HDRS (composer->hdrs)) : NULL;
-}
-
-EDestination **
-e_msg_composer_get_to (EMsgComposer *composer)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
-
- return composer->hdrs ? e_msg_composer_hdrs_get_to (E_MSG_COMPOSER_HDRS (composer->hdrs)) : NULL;
-}
-
-EDestination **
-e_msg_composer_get_cc (EMsgComposer *composer)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
-
- return composer->hdrs ? e_msg_composer_hdrs_get_cc (E_MSG_COMPOSER_HDRS (composer->hdrs)) : NULL;
-}
-
-EDestination **
-e_msg_composer_get_bcc (EMsgComposer *composer)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
-
- return composer->hdrs ? e_msg_composer_hdrs_get_bcc (E_MSG_COMPOSER_HDRS (composer->hdrs)) : NULL;
-}
-
-const char *
-e_msg_composer_get_subject (EMsgComposer *composer)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
-
- return composer->hdrs ? e_msg_composer_hdrs_get_subject (E_MSG_COMPOSER_HDRS (composer->hdrs)) : NULL;
-}
-
-
-/**
- * e_msg_composer_guess_mime_type:
- * @file_name: filename
- *
- * Returns the guessed mime type of the file given by #file_name.
- **/
-char *
-e_msg_composer_guess_mime_type (const char *file_name)
-{
- GnomeVFSFileInfo *info;
- GnomeVFSResult result;
- char *type = NULL;
-
- info = gnome_vfs_file_info_new ();
- result = gnome_vfs_get_file_info (file_name, info,
- GNOME_VFS_FILE_INFO_GET_MIME_TYPE |
- GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE |
- GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
- if (result == GNOME_VFS_OK)
- type = g_strdup (gnome_vfs_file_info_get_mime_type (info));
-
- gnome_vfs_file_info_unref (info);
-
- return type;
-}
-
-
-/**
- * e_msg_composer_set_changed:
- * @composer: An EMsgComposer object.
- *
- * Mark the composer as changed, so before the composer gets destroyed
- * the user will be prompted about unsaved changes.
- **/
-void
-e_msg_composer_set_changed (EMsgComposer *composer)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- composer->has_changed = TRUE;
-}
-
-
-/**
- * e_msg_composer_unset_changed:
- * @composer: An EMsgComposer object.
- *
- * Mark the composer as unchanged, so no prompt about unsaved changes
- * will appear before destroying the composer.
- **/
-void
-e_msg_composer_unset_changed (EMsgComposer *composer)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- composer->has_changed = FALSE;
-}
-
-gboolean
-e_msg_composer_is_dirty (EMsgComposer *composer)
-{
- CORBA_Environment ev;
- gboolean rv;
-
- CORBA_exception_init (&ev);
- rv = composer->has_changed
- || (GNOME_GtkHTML_Editor_Engine_hasUndo (composer->editor_engine, &ev) &&
- !GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "is-saved", &ev));
- CORBA_exception_free (&ev);
-
- return rv;
-}
-
-/**
- * e_msg_composer_set_autosaved:
- * @composer: An EMsgComposer object.
- *
- * Mark the composer as autosaved, so before the composer gets destroyed
- * the user will be prompted about unsaved changes.
- **/
-void
-e_msg_composer_set_autosaved (EMsgComposer *composer)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- composer->autosaved = TRUE;
-}
-
-
-/**
- * e_msg_composer_unset_autosaved:
- * @composer: An EMsgComposer object.
- *
- * Mark the composer as unautosaved, so no prompt about unsaved changes
- * will appear before destroying the composer.
- **/
-void
-e_msg_composer_unset_autosaved (EMsgComposer *composer)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- composer->autosaved = FALSE;
-}
-
-gboolean
-e_msg_composer_is_autosaved (EMsgComposer *composer)
-{
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
-
- return composer->autosaved;
-}
-
-void
-e_msg_composer_set_enable_autosave (EMsgComposer *composer, gboolean enabled)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- composer->enable_autosave = enabled;
-}
-
-static char *
-next_word (const char *s, const char **sr)
-{
- if (!s || !*s)
- return NULL;
- else {
- const char *begin;
- gunichar uc;
- gboolean cited;
-
- do {
- begin = s;
- cited = FALSE;
- uc = g_utf8_get_char (s);
- if (uc == 0)
- return NULL;
- s = g_utf8_next_char (s);
- } while (!html_selection_spell_word (uc, &cited) && !cited && s);
-
- /* we are at beginning of word */
- if (s && *s) {
- gboolean cited_end;
-
- cited_end = FALSE;
- uc = g_utf8_get_char (s);
-
- /* go to end of word */
- while (html_selection_spell_word (uc, &cited_end) || (!cited && cited_end)) {
- cited_end = FALSE;
- s = g_utf8_next_char (s);
- uc = g_utf8_get_char (s);
- if (uc == 0)
- break;
- }
- *sr = s;
- return s ? g_strndup (begin, s - begin) : g_strdup (begin);
- } else
- return NULL;
- }
-}
-
-
-void
-e_msg_composer_ignore (EMsgComposer *composer, const char *str)
-{
- CORBA_Environment ev;
- char *word;
-
- if (!str)
- return;
-
- CORBA_exception_init (&ev);
- while ((word = next_word (str, &str))) {
- /* printf ("ignore word %s\n", word); */
- GNOME_GtkHTML_Editor_Engine_ignoreWord (composer->editor_engine, word, &ev);
- g_free (word);
- }
- CORBA_exception_free (&ev);
-}
-
-
-void
-e_msg_composer_drop_editor_undo (EMsgComposer *composer)
-{
- CORBA_Environment ev;
-
- CORBA_exception_init (&ev);
- GNOME_GtkHTML_Editor_Engine_dropUndo (composer->editor_engine, &ev);
- CORBA_exception_free (&ev);
-}
-
-
-gboolean
-e_msg_composer_request_close_all (void)
-{
- GSList *p, *pnext;
-
- for (p = all_composers; p != NULL; p = pnext) {
- pnext = p->next;
- do_exit (E_MSG_COMPOSER (p->data));
- }
-
- if (all_composers == NULL)
- return TRUE;
- else
- return FALSE;
-}
-
-void
-e_msg_composer_check_autosave(GtkWindow *parent)
-{
- if (am == NULL)
- am = autosave_manager_new();
-
- if (am->ask) {
- am->ask = FALSE;
- autosave_manager_query_load_orphans (am, parent);
- am->ask = TRUE;
- }
-}
diff --git a/composer/e-msg-composer.h b/composer/e-msg-composer.h
deleted file mode 100644
index 06e139d9b2..0000000000
--- a/composer/e-msg-composer.h
+++ /dev/null
@@ -1,244 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-msg-composer.h
- *
- * Copyright (C) 1999, 2000 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * published by the Free Software Foundation; either version 2 of the
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli
- */
-
-
-#ifndef ___E_MSG_COMPOSER_H__
-#define ___E_MSG_COMPOSER_H__
-
-typedef struct _EMsgComposer EMsgComposer;
-typedef struct _EMsgComposerClass EMsgComposerClass;
-
-#include <bonobo/bonobo-window.h>
-#include <bonobo/bonobo-ui-component.h>
-
-#include "e-msg-composer-attachment-bar.h"
-#include "e-msg-composer-hdrs.h"
-#include "Editor.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-
-#define E_TYPE_MSG_COMPOSER (e_msg_composer_get_type ())
-#define E_MSG_COMPOSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MSG_COMPOSER, EMsgComposer))
-#define E_MSG_COMPOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MSG_COMPOSER, EMsgComposerClass))
-#define E_IS_MSG_COMPOSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MSG_COMPOSER))
-#define E_IS_MSG_COMPOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MSG_COMPOSER))
-
-
-
-struct _EMsgComposer {
- BonoboWindow parent;
-
- /* Main UIComponent */
- BonoboUIComponent *uic;
-
- /* UIComponent for the non-control GtkEntries */
- BonoboUIComponent *entry_uic;
-
- GtkWidget *hdrs;
- GPtrArray *extra_hdr_names, *extra_hdr_values;
-
- GtkWidget *focused_entry;
-
- GtkWidget *editor;
-
- GtkWidget *attachment_bar;
- GtkWidget *attachment_scrolled_window;
- GtkWidget *attachment_expander;
- GtkWidget *attachment_expander_label;
- GtkWidget *attachment_expander_icon;
- GtkWidget *attachment_expander_num;
-
- GtkWidget *address_dialog;
-
- Bonobo_PersistFile persist_file_interface;
- Bonobo_PersistStream persist_stream_interface;
- GNOME_GtkHTML_Editor_Engine editor_engine;
- BonoboObject *editor_listener;
- GHashTable *inline_images, *inline_images_by_url;
- GList *current_images;
-
- char *mime_type, *mime_body, *charset;
-
- char *autosave_file;
- int autosave_fd;
- guint32 enable_autosave : 1;
-
- guint32 attachment_bar_visible : 1;
- guint32 send_html : 1;
- guint32 is_alternative : 1;
- guint32 pgp_sign : 1;
- guint32 pgp_encrypt : 1;
- guint32 smime_sign : 1;
- guint32 smime_encrypt : 1;
- guint32 view_from : 1;
- guint32 view_replyto : 1;
- guint32 view_to : 1;
- guint32 view_postto : 1;
- guint32 view_bcc : 1;
- guint32 view_cc : 1;
- guint32 view_subject : 1;
- guint32 has_changed : 1;
- guint32 autosaved : 1;
-
- guint32 mode_post : 1;
-
- guint32 in_signature_insert : 1;
-
- struct _ESignature *signature;
- struct _GtkOptionMenu *sig_menu;
- guint sig_added_id;
- guint sig_removed_id;
- guint sig_changed_id;
-
- CamelMimeMessage *redirect;
-
- guint notify_id;
-};
-
-struct _EMsgComposerClass {
- BonoboWindowClass parent_class;
-
- void (* send) (EMsgComposer *composer);
- void (* save_draft) (EMsgComposer *composer, int quit);
-};
-
-
-GtkType e_msg_composer_get_type (void);
-
-EMsgComposer *e_msg_composer_new (void);
-
-#define E_MSG_COMPOSER_MAIL 1
-#define E_MSG_COMPOSER_POST 2
-#define E_MSG_COMPOSER_MAIL_POST E_MSG_COMPOSER_MAIL|E_MSG_COMPOSER_POST
-
-EMsgComposer *e_msg_composer_new_with_type (int type);
-
-EMsgComposer *e_msg_composer_new_with_message (CamelMimeMessage *msg);
-EMsgComposer *e_msg_composer_new_from_url (const char *url);
-EMsgComposer *e_msg_composer_new_redirect (CamelMimeMessage *message,
- const char *resent_from);
-
-void e_msg_composer_show_attachments (EMsgComposer *composer,
- gboolean show);
-void e_msg_composer_set_headers (EMsgComposer *composer,
- const char *from,
- EDestination **to,
- EDestination **cc,
- EDestination **bcc,
- const char *subject);
-void e_msg_composer_set_body_text (EMsgComposer *composer,
- const char *text,
- ssize_t len);
-void e_msg_composer_set_body (EMsgComposer *composer,
- const char *body,
- const char *mime_type);
-void e_msg_composer_add_header (EMsgComposer *composer,
- const char *name,
- const char *value);
-void e_msg_composer_attach (EMsgComposer *composer,
- CamelMimePart *attachment);
-CamelMimePart *e_msg_composer_add_inline_image_from_file (EMsgComposer *composer,
- const char *filename);
-void e_msg_composer_add_inline_image_from_mime_part (EMsgComposer *composer,
- CamelMimePart *part);
-CamelMimeMessage *e_msg_composer_get_message (EMsgComposer *composer,
- gboolean save_html_object_data);
-CamelMimeMessage *e_msg_composer_get_message_draft (EMsgComposer *composer);
-void e_msg_composer_show_sig_file (EMsgComposer *composer);
-gboolean e_msg_composer_get_send_html (EMsgComposer *composer);
-void e_msg_composer_set_send_html (EMsgComposer *composer,
- gboolean send_html);
-
-gboolean e_msg_composer_get_view_from (EMsgComposer *composer);
-void e_msg_composer_set_view_from (EMsgComposer *composer,
- gboolean view_from);
-gboolean e_msg_composer_get_view_to (EMsgComposer *composer);
-void e_msg_composer_set_view_to (EMsgComposer *composer,
- gboolean view_replyto);
-gboolean e_msg_composer_get_view_replyto (EMsgComposer *composer);
-void e_msg_composer_set_view_replyto (EMsgComposer *composer,
- gboolean view_replyto);
-gboolean e_msg_composer_get_view_postto (EMsgComposer *composer);
-void e_msg_composer_set_view_postto (EMsgComposer *composer,
- gboolean view_replyto);
-gboolean e_msg_composer_get_view_cc (EMsgComposer *composer);
-void e_msg_composer_set_view_cc (EMsgComposer *composer,
- gboolean view_cc);
-gboolean e_msg_composer_get_view_bcc (EMsgComposer *composer);
-void e_msg_composer_set_view_bcc (EMsgComposer *composer,
- gboolean view_bcc);
-
-EDestination **e_msg_composer_get_recipients (EMsgComposer *composer);
-EDestination **e_msg_composer_get_to (EMsgComposer *composer);
-EDestination **e_msg_composer_get_cc (EMsgComposer *composer);
-EDestination **e_msg_composer_get_bcc (EMsgComposer *composer);
-const char *e_msg_composer_get_subject (EMsgComposer *composer);
-
-EAccount *e_msg_composer_get_preferred_account (EMsgComposer *composer);
-void e_msg_composer_clear_inlined_table (EMsgComposer *composer);
-char *e_msg_composer_guess_mime_type (const char *file_name);
-void e_msg_composer_set_changed (EMsgComposer *composer);
-void e_msg_composer_unset_changed (EMsgComposer *composer);
-gboolean e_msg_composer_is_dirty (EMsgComposer *composer);
-void e_msg_composer_set_autosaved (EMsgComposer *composer);
-void e_msg_composer_unset_autosaved (EMsgComposer *composer);
-gboolean e_msg_composer_is_autosaved (EMsgComposer *composer);
-void e_msg_composer_set_enable_autosave (EMsgComposer *composer,
- gboolean enabled);
-
-/* PGP */
-void e_msg_composer_set_pgp_sign (EMsgComposer *composer,
- gboolean pgp_sign);
-gboolean e_msg_composer_get_pgp_sign (EMsgComposer *composer);
-void e_msg_composer_set_pgp_encrypt (EMsgComposer *composer,
- gboolean pgp_encrypt);
-gboolean e_msg_composer_get_pgp_encrypt (EMsgComposer *composer);
-
-/* S/MIME */
-void e_msg_composer_set_smime_sign (EMsgComposer *composer,
- gboolean smime_sign);
-gboolean e_msg_composer_get_smime_sign (EMsgComposer *composer);
-void e_msg_composer_set_smime_encrypt (EMsgComposer *composer,
- gboolean smime_encrypt);
-gboolean e_msg_composer_get_smime_encrypt (EMsgComposer *composer);
-char *e_msg_composer_get_sig_file_content (const char *sigfile,
- gboolean in_html);
-void e_msg_composer_add_message_attachments (EMsgComposer *composer,
- CamelMimeMessage *message,
- gboolean just_inlines);
-void e_msg_composer_ignore (EMsgComposer *composer,
- const char *str);
-void e_msg_composer_drop_editor_undo (EMsgComposer *composer);
-
-gboolean e_msg_composer_request_close_all (void);
-void e_msg_composer_check_autosave (GtkWindow *parent);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* ___E_MSG_COMPOSER_H__ */
diff --git a/composer/evolution-composer.c b/composer/evolution-composer.c
deleted file mode 100644
index 10ed5b922e..0000000000
--- a/composer/evolution-composer.c
+++ /dev/null
@@ -1,399 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-composer.c
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * published by the Free Software Foundation; either version 2 of the
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Dan Winship <danw@ximian.com>
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <gtk/gtksignal.h>
-#include <bonobo/bonobo-item-handler.h>
-#include <bonobo/bonobo-generic-factory.h>
-#include <gal/util/e-util.h>
-#include <gal/widgets/e-gui-utils.h>
-#include "evolution-composer.h"
-#include "mail/mail-config.h"
-#include "e-util/e-account-list.h"
-#include <camel/camel-mime-filter-tohtml.h>
-#include <camel/camel-stream-mem.h>
-
-#define PARENT_TYPE BONOBO_OBJECT_TYPE
-static BonoboObjectClass *parent_class = NULL;
-
-struct _EvolutionComposerPrivate {
- int send_id;
- int save_draft_id;
-
- void (*send_cb) (EMsgComposer *, gpointer);
- void (*save_draft_cb) (EMsgComposer *, int, gpointer);
-};
-
-/* CORBA interface implementation. */
-static EDestination **
-corba_recipientlist_to_destv (const GNOME_Evolution_Composer_RecipientList *cl)
-{
- GNOME_Evolution_Composer_Recipient *recip;
- EDestination **destv;
- int i;
-
- if (cl->_length == 0)
- return NULL;
-
- destv = g_new (EDestination *, cl->_length+1);
-
- for (i = 0; i < cl->_length; ++i) {
- recip = &(cl->_buffer[i]);
-
- destv[i] = e_destination_new ();
-
- if (*recip->name)
- e_destination_set_name (destv[i], recip->name);
- e_destination_set_email (destv[i], recip->address);
-
- }
- destv[cl->_length] = NULL;
-
- return destv;
-}
-
-static void
-impl_Composer_set_headers (PortableServer_Servant servant,
- const CORBA_char *from,
- const GNOME_Evolution_Composer_RecipientList *to,
- const GNOME_Evolution_Composer_RecipientList *cc,
- const GNOME_Evolution_Composer_RecipientList *bcc,
- const CORBA_char *subject,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionComposer *composer;
- EDestination **tov, **ccv, **bccv;
- EAccountList *accounts;
- EAccount *account;
- EIterator *iter;
- int found = 0;
-
- bonobo_object = bonobo_object_from_servant (servant);
- composer = EVOLUTION_COMPOSER (bonobo_object);
-
- account = mail_config_get_account_by_name (from);
- if (!account) {
- accounts = mail_config_get_accounts ();
- iter = e_list_get_iterator ((EList *) accounts);
- while (e_iterator_is_valid (iter)) {
- account = (EAccount *) e_iterator_get (iter);
-
- if (!g_ascii_strcasecmp (account->id->address, from)) {
- found = TRUE;
- break;
- }
-
- e_iterator_next (iter);
- }
-
- g_object_unref (iter);
-
- if (!found)
- account = mail_config_get_default_account ();
- }
-
- tov = corba_recipientlist_to_destv (to);
- ccv = corba_recipientlist_to_destv (cc);
- bccv = corba_recipientlist_to_destv (bcc);
-
- e_msg_composer_set_headers (composer->composer, account->name,
- tov, ccv, bccv, subject);
-
- e_destination_freev (tov);
- e_destination_freev (ccv);
- e_destination_freev (bccv);
-}
-
-static void
-impl_Composer_set_multipart_type (PortableServer_Servant servant,
- GNOME_Evolution_Composer_MultipartType type,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionComposer *composer;
-
- bonobo_object = bonobo_object_from_servant (servant);
- composer = EVOLUTION_COMPOSER (bonobo_object);
-
- if (type == GNOME_Evolution_Composer_ALTERNATIVE) {
- composer->composer->is_alternative = TRUE;
- composer->composer->send_html = FALSE;
- }
-}
-
-static void
-impl_Composer_set_body (PortableServer_Servant servant,
- const CORBA_char *body,
- const CORBA_char *mime_type,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionComposer *composer;
-
- bonobo_object = bonobo_object_from_servant (servant);
- composer = EVOLUTION_COMPOSER (bonobo_object);
-
- if (!g_ascii_strcasecmp (mime_type, "text/plain")) {
- char *htmlbody = camel_text_to_html (body, CAMEL_MIME_FILTER_TOHTML_PRE, 0);
-
- e_msg_composer_set_body_text (composer->composer, htmlbody, -1);
- g_free (htmlbody);
- } else if (!g_ascii_strcasecmp (mime_type, "text/html"))
- e_msg_composer_set_body_text (composer->composer, body, -1);
- else
- e_msg_composer_set_body (composer->composer, body, mime_type);
-}
-
-static void
-impl_Composer_attach_MIME (PortableServer_Servant servant,
- const CORBA_char *data,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionComposer *composer;
- CamelMimePart *attachment;
- CamelStream *mem_stream;
- int status;
-
- bonobo_object = bonobo_object_from_servant (servant);
- composer = EVOLUTION_COMPOSER (bonobo_object);
-
- mem_stream = camel_stream_mem_new_with_buffer (data, strlen (data));
- attachment = camel_mime_part_new ();
- status = camel_data_wrapper_construct_from_stream (
- CAMEL_DATA_WRAPPER (attachment), mem_stream);
- camel_object_unref (mem_stream);
-
- if (status == -1) {
- CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
- ex_GNOME_Evolution_Composer_CouldNotParse,
- NULL);
- return;
- }
-
- e_msg_composer_attach (composer->composer, attachment);
- camel_object_unref (CAMEL_OBJECT (attachment));
-}
-
-static void
-impl_Composer_attach_data (PortableServer_Servant servant,
- const CORBA_char *content_type,
- const CORBA_char *filename,
- const CORBA_char *description,
- const CORBA_boolean show_inline,
- const GNOME_Evolution_Composer_AttachmentData *data,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionComposer *composer;
- CamelMimePart *attachment;
-
- bonobo_object = bonobo_object_from_servant (servant);
- composer = EVOLUTION_COMPOSER (bonobo_object);
-
- attachment = camel_mime_part_new ();
- camel_mime_part_set_content (attachment, data->_buffer, data->_length,
- content_type);
-
- if (*filename)
- camel_mime_part_set_filename (attachment, filename);
- if (*description)
- camel_mime_part_set_description (attachment, description);
- camel_mime_part_set_disposition (attachment, show_inline ?
- "inline" : "attachment");
-
- e_msg_composer_attach (composer->composer, attachment);
- camel_object_unref (attachment);
-}
-
-static void
-impl_Composer_show (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionComposer *composer;
-
- bonobo_object = bonobo_object_from_servant (servant);
- composer = EVOLUTION_COMPOSER (bonobo_object);
-
- gtk_widget_show (GTK_WIDGET (composer->composer));
-}
-
-static void
-impl_Composer_send (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionComposer *composer;
-
- bonobo_object = bonobo_object_from_servant (servant);
- composer = EVOLUTION_COMPOSER (bonobo_object);
-
- composer->priv->send_cb (composer->composer, NULL);
-}
-
-POA_GNOME_Evolution_Composer__epv *
-evolution_composer_get_epv (void)
-{
- POA_GNOME_Evolution_Composer__epv *epv;
-
- epv = g_new0 (POA_GNOME_Evolution_Composer__epv, 1);
- epv->setHeaders = impl_Composer_set_headers;
- epv->setMultipartType = impl_Composer_set_multipart_type;
- epv->setBody = impl_Composer_set_body;
- epv->attachMIME = impl_Composer_attach_MIME;
- epv->attachData = impl_Composer_attach_data;
- epv->show = impl_Composer_show;
- epv->send = impl_Composer_send;
-
- return epv;
-}
-
-
-/* GObject stuff */
-
-static void
-finalise (GObject *object)
-{
- EvolutionComposer *composer = EVOLUTION_COMPOSER (object);
- struct _EvolutionComposerPrivate *p = composer->priv;
-
- g_signal_handler_disconnect(composer->composer, p->send_id);
- g_signal_handler_disconnect(composer->composer, p->save_draft_id);
- g_free(p);
-
- if (composer->composer) {
- g_object_unref(composer->composer);
- composer->composer = NULL;
- }
-
- G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-static void
-evolution_composer_class_init (EvolutionComposerClass *klass)
-{
- GObjectClass *object_class;
- POA_GNOME_Evolution_Composer__epv *epv;
-
- object_class = G_OBJECT_CLASS (klass);
- object_class->finalize = finalise;
-
- parent_class = g_type_class_ref(bonobo_object_get_type ());
-
- epv = &klass->epv;
-
- epv->setHeaders = impl_Composer_set_headers;
- epv->setMultipartType = impl_Composer_set_multipart_type;
- epv->setBody = impl_Composer_set_body;
- epv->attachMIME = impl_Composer_attach_MIME;
- epv->attachData = impl_Composer_attach_data;
- epv->show = impl_Composer_show;
- epv->send = impl_Composer_send;
-}
-
-static void
-evolution_composer_init (EvolutionComposer *composer)
-{
- EAccount *account;
-
- account = mail_config_get_default_account ();
- composer->composer = e_msg_composer_new ();
- composer->priv = g_malloc0(sizeof(*composer->priv));
-}
-
-#if 0
-static Bonobo_ItemContainer_ObjectNames *
-enum_objects (BonoboItemHandler *handler, gpointer data, CORBA_Environment *ev)
-{
-}
-#endif
-
-static Bonobo_Unknown
-get_object (BonoboItemHandler *h, const char *item_name, gboolean only_if_exists,
- gpointer data, CORBA_Environment *ev)
-{
- EvolutionComposer *composer = data;
- GSList *options, *l;
-
- options = bonobo_item_option_parse (item_name);
- for (l = options; l; l = l->next){
- BonoboItemOption *option = l->data;
-
- if (strcmp (option->key, "visible") == 0){
- gboolean show = 1;
-
- if (option->value)
- show = atoi (option->value);
-
- if (show)
- gtk_widget_show (GTK_WIDGET (composer->composer));
- else
- gtk_widget_hide (GTK_WIDGET (composer->composer));
- }
- }
- return bonobo_object_dup_ref (
- BONOBO_OBJECT (composer)->corba_objref, ev);
-}
-
-void
-evolution_composer_construct (EvolutionComposer *composer,
- GNOME_Evolution_Composer corba_object)
-{
- BonoboObject *item_handler;
-
- g_return_if_fail (composer != NULL);
- g_return_if_fail (EVOLUTION_IS_COMPOSER (composer));
- g_return_if_fail (corba_object != CORBA_OBJECT_NIL);
-
- /*bonobo_object_construct (BONOBO_OBJECT (composer), corba_object);*/
-
- item_handler = BONOBO_OBJECT (
- bonobo_item_handler_new (NULL, get_object, composer));
- bonobo_object_add_interface (BONOBO_OBJECT (composer), BONOBO_OBJECT (item_handler));
-}
-
-EvolutionComposer *
-evolution_composer_new (void (*send) (EMsgComposer *, gpointer),
- void (*save_draft) (EMsgComposer *, int, gpointer))
-{
- EvolutionComposer *new;
- struct _EvolutionComposerPrivate *p;
-
- new = g_object_new(EVOLUTION_TYPE_COMPOSER, NULL);
- evolution_composer_construct (new, bonobo_object_corba_objref((BonoboObject *)new));
- p = new->priv;
- p->send_cb = send;
- p->save_draft_cb = save_draft;
- p->send_id = g_signal_connect (new->composer, "send", G_CALLBACK (send), NULL);
- p->save_draft_id = g_signal_connect (new->composer, "save-draft", G_CALLBACK (save_draft), NULL);
-
- return new;
-}
-
-BONOBO_TYPE_FUNC_FULL(EvolutionComposer, GNOME_Evolution_Composer, BONOBO_TYPE_OBJECT, evolution_composer)
diff --git a/composer/evolution-composer.h b/composer/evolution-composer.h
deleted file mode 100644
index 8928801583..0000000000
--- a/composer/evolution-composer.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* evolution-composer.h
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * published by the Free Software Foundation; either version 2 of the
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Dan Winship
- */
-
-#ifndef __EVOLUTION_COMPOSER_H__
-#define __EVOLUTION_COMPOSER_H__
-
-#include <bonobo/bonobo-object.h>
-
-#include "Composer.h"
-#include "e-msg-composer.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define EVOLUTION_TYPE_COMPOSER (evolution_composer_get_type ())
-#define EVOLUTION_COMPOSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EVOLUTION_TYPE_COMPOSER, EvolutionComposer))
-#define EVOLUTION_COMPOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_COMPOSER, EvolutionComposerClass))
-#define EVOLUTION_IS_COMPOSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EVOLUTION_TYPE_COMPOSER))
-#define EVOLUTION_IS_COMPOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_COMPOSER))
-
-typedef struct _EvolutionComposer EvolutionComposer;
-typedef struct _EvolutionComposerClass EvolutionComposerClass;
-
-struct _EvolutionComposer {
- BonoboObject parent;
-
- struct _EvolutionComposerPrivate *priv;
-
- EMsgComposer *composer;
-};
-
-struct _EvolutionComposerClass {
- BonoboObjectClass parent_class;
-
- POA_GNOME_Evolution_Composer__epv epv;
-};
-
-POA_GNOME_Evolution_Composer__epv *evolution_composer_get_epv (void);
-
-GtkType evolution_composer_get_type (void);
-void evolution_composer_construct (EvolutionComposer *,
- GNOME_Evolution_Composer);
-EvolutionComposer *evolution_composer_new (void (*send_cb) (EMsgComposer *, gpointer),
- void (*save_draft_cb) (EMsgComposer *, int, gpointer));
-
-void evolution_composer_factory_init (void (*send) (EMsgComposer *, gpointer),
- void (*save_draft) (EMsgComposer *, int, gpointer));
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __EVOLUTION_COMPOSER_H__ */
diff --git a/composer/listener.c b/composer/listener.c
deleted file mode 100644
index 2eb78cc8cc..0000000000
--- a/composer/listener.c
+++ /dev/null
@@ -1,282 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* This file is part of gnome-spell bonobo component
-
- Copyright (C) 2000 Ximian, Inc.
- Authors: Radek Doulik <rodo@ximian.com>
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of version 2 of the GNU General Public
- License as published by the Free Software Foundation.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public
- License along with this program; if not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <bonobo/bonobo-arg.h>
-#include <bonobo/bonobo-object.h>
-#include <bonobo/bonobo-stream-client.h>
-#include <camel/camel-stream-mem.h>
-
-#include "listener.h"
-
-static BonoboObjectClass *listener_parent_class;
-
-inline static EditorListener *
-listener_from_servant (PortableServer_Servant servant)
-{
- return EDITOR_LISTENER (bonobo_object_from_servant (servant));
-}
-
-static CORBA_any *
-get_any_null ()
-{
- CORBA_any *rv;
-
- rv = CORBA_any__alloc ();
- rv->_type = TC_null;
-
- return rv;
-}
-
-static gchar *
-resolve_image_url (EditorListener *l, gchar *url)
-{
- CamelMimePart *part;
- const char *cid;
-
- part = g_hash_table_lookup (l->composer->inline_images_by_url, url);
- if (!part && !strncmp (url, "file:", 5)) {
- part = e_msg_composer_add_inline_image_from_file (l->composer,
- url + 5);
- }
- if (!part && !strncmp (url, "cid:", 4)) {
- part = g_hash_table_lookup (l->composer->inline_images, url);
- }
- if (!part)
- return NULL;
-
- l->composer->current_images = g_list_prepend (l->composer->current_images, part);
-
- cid = camel_mime_part_get_content_id (part);
- if (!cid)
- return NULL;
-
- return g_strconcat ("cid:", cid, NULL);
-}
-
-static void
-reply_indent (EditorListener *l, CORBA_Environment * ev)
-{
- if (!GNOME_GtkHTML_Editor_Engine_isParagraphEmpty (l->composer->editor_engine, ev)) {
- if (GNOME_GtkHTML_Editor_Engine_isPreviousParagraphEmpty (l->composer->editor_engine, ev))
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "cursor-backward", ev);
- else {
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "text-default-color", ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "italic-off", ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "insert-paragraph", ev);
- return;
- }
- }
-
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "style-normal", ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "indent-zero", ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "text-default-color", ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "italic-off", ev);
-}
-
-static void
-clear_signature (GNOME_GtkHTML_Editor_Engine e, CORBA_Environment * ev)
-{
- if (GNOME_GtkHTML_Editor_Engine_isParagraphEmpty (e, ev))
- GNOME_GtkHTML_Editor_Engine_setParagraphData (e, "signature", "0", ev);
- else if (GNOME_GtkHTML_Editor_Engine_isPreviousParagraphEmpty (e, ev)
- && GNOME_GtkHTML_Editor_Engine_runCommand (e, "cursor-backward", ev)) {
- GNOME_GtkHTML_Editor_Engine_setParagraphData (e, "signature", "0", ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (e, "cursor-forward", ev);
- }
- GNOME_GtkHTML_Editor_Engine_runCommand (e, "text-default-color", ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (e, "italic-off", ev);
-}
-
-static void
-insert_paragraph_before (EditorListener *l, CORBA_Environment * ev)
-{
- if (!l->composer->in_signature_insert) {
- CORBA_char *orig, *signature;
- gboolean changed = FALSE;
- /* FIXME check for insert-paragraph command */
-
- orig = GNOME_GtkHTML_Editor_Engine_getParagraphData (l->composer->editor_engine, "orig", ev);
- if (ev->_major == CORBA_NO_EXCEPTION) {
- if (orig && *orig == '1') {
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "text-default-color", ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "italic-off", ev);
- changed = TRUE;
- }
- CORBA_free (orig);
- }
- if (!changed) {
- signature = GNOME_GtkHTML_Editor_Engine_getParagraphData (l->composer->editor_engine, "signature", ev);
- if (ev->_major == CORBA_NO_EXCEPTION) {
- if (signature && *signature == '1') {
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "text-default-color",
- ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "italic-off", ev);
- }
- CORBA_free (signature);
- }
- }
- }
-}
-
-static void
-insert_paragraph_after (EditorListener *l, CORBA_Environment * ev)
-{
- if (!l->composer->in_signature_insert) {
- CORBA_char *orig, *signature;
- /* FIXME check for insert-paragraph command */
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "text-default-color", ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "italic-off", ev);
-
- orig = GNOME_GtkHTML_Editor_Engine_getParagraphData (l->composer->editor_engine, "orig", ev);
- if (ev->_major == CORBA_NO_EXCEPTION) {
- if (orig && *orig == '1')
- reply_indent (l, ev);
- GNOME_GtkHTML_Editor_Engine_setParagraphData (l->composer->editor_engine, "orig", "0", ev);
- CORBA_free (orig);
- }
- signature = GNOME_GtkHTML_Editor_Engine_getParagraphData (l->composer->editor_engine, "signature", ev);
- if (ev->_major == CORBA_NO_EXCEPTION) {
- if (signature && *signature == '1')
- clear_signature (l->composer->editor_engine, ev);
- CORBA_free (signature);
- }
- }
-}
-
-static CORBA_any *
-impl_event (PortableServer_Servant _servant,
- const CORBA_char * name, const CORBA_any * arg,
- CORBA_Environment * ev)
-{
- EditorListener *l = listener_from_servant (_servant);
- CORBA_any *rv = NULL;
- gchar *command;
-
- if (!strcmp (name, "command_before")) {
- command = BONOBO_ARG_GET_STRING (arg);
- if (!strcmp (command, "insert-paragraph")) {
- insert_paragraph_before (l, ev);
- }
- } else if (!strcmp (name, "command_after")) {
- command = BONOBO_ARG_GET_STRING (arg);
- if (!strcmp (command, "insert-paragraph")) {
- insert_paragraph_after (l, ev);
- }
- } else if (!strcmp (name, "image_url")) {
- gchar *url;
-
- if ((url = resolve_image_url (l, BONOBO_ARG_GET_STRING (arg)))) {
- rv = bonobo_arg_new (BONOBO_ARG_STRING);
- BONOBO_ARG_SET_STRING (rv, url);
- /* printf ("new url: %s\n", url); */
- g_free (url);
- }
- } else if (!strcmp (name, "delete")) {
- if (GNOME_GtkHTML_Editor_Engine_isParagraphEmpty (l->composer->editor_engine, ev)) {
- CORBA_char *orig;
- CORBA_char *signature;
-
- orig = GNOME_GtkHTML_Editor_Engine_getParagraphData (l->composer->editor_engine, "orig", ev);
- if (ev->_major == CORBA_NO_EXCEPTION) {
- if (orig && *orig == '1') {
- GNOME_GtkHTML_Editor_Engine_setParagraphData (l->composer->editor_engine, "orig", "0", ev);
-
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "indent-zero", ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "style-normal", ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "text-default-color", ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "italic-off", ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "insert-paragraph", ev);
- GNOME_GtkHTML_Editor_Engine_runCommand (l->composer->editor_engine, "delete-back", ev);
- }
- CORBA_free (orig);
- }
- signature = GNOME_GtkHTML_Editor_Engine_getParagraphData (l->composer->editor_engine, "signature", ev);
- if (ev->_major == CORBA_NO_EXCEPTION) {
- if (signature && *signature == '1')
- GNOME_GtkHTML_Editor_Engine_setParagraphData (l->composer->editor_engine, "signature", "0", ev);
- CORBA_free (signature);
- }
- }
- } else if (!strcmp (name, "url_requested")) {
- GNOME_GtkHTML_Editor_URLRequestEvent *e;
- CamelMimePart *part;
- GByteArray *ba;
- CamelStream *cstream;
- CamelDataWrapper *wrapper;
-
- e = (GNOME_GtkHTML_Editor_URLRequestEvent *)arg->_value;
-
- if (!e->url || e->stream == CORBA_OBJECT_NIL)
- return get_any_null ();
-
- part = g_hash_table_lookup (l->composer->inline_images_by_url, e->url);
- if (!part)
- part = g_hash_table_lookup (l->composer->inline_images, e->url);
- if (!part)
- return get_any_null ();
-
- /* Write the data to a CamelStreamMem... */
- ba = g_byte_array_new ();
- cstream = camel_stream_mem_new_with_byte_array (ba);
- wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part));
- camel_data_wrapper_decode_to_stream (wrapper, cstream);
-
- bonobo_stream_client_write (e->stream, ba->data, ba->len, ev);
-
- camel_object_unref (cstream);
- }
-
- return rv ? rv : get_any_null ();
-}
-
-static void
-listener_class_init (EditorListenerClass *klass)
-{
- POA_GNOME_GtkHTML_Editor_Listener__epv *epv;
-
- listener_parent_class = g_type_class_ref(bonobo_object_get_type ());
-
- epv = &klass->epv;
- epv->event = impl_event;
-}
-
-static void
-listener_init(EditorListener *object)
-{
-}
-
-BONOBO_TYPE_FUNC_FULL(EditorListener, GNOME_GtkHTML_Editor_Listener, BONOBO_TYPE_OBJECT, listener);
-
-EditorListener *
-listener_new (EMsgComposer *composer)
-{
- EditorListener *listener;
-
- listener = g_object_new (EDITOR_LISTENER_TYPE, NULL);
- listener->composer = composer;
-
- return listener;
-}
diff --git a/composer/listener.h b/composer/listener.h
deleted file mode 100644
index d238583453..0000000000
--- a/composer/listener.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* This file is part of gnome-spell bonobo component
-
- Copyright (C) 2000 Ximian, Inc.
- Authors: Radek Doulik <rodo@ximian.com>
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of version 2 of the GNU General Public
- License as published by the Free Software Foundation.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public
- License along with this program; if not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
-*/
-
-#ifndef LISTENER_H_
-#define LISTENER_H_
-
-#include <bonobo/bonobo-object.h>
-#include "Editor.h"
-#include "e-msg-composer.h"
-
-#define EDITOR_LISTENER_TYPE (listener_get_type ())
-#define EDITOR_LISTENER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EDITOR_LISTENER_TYPE, EditorListener))
-#define EDITOR_LISTENER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), EDITOR_LISTENER_TYPE, EditorListenerClass))
-#define IS_EDITOR_LISTENER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EDITOR_LISTENER_TYPE))
-#define IS_EDITOR_LISTENER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EDITOR_LISTENER_TYPE))
-
-typedef struct {
- BonoboObject parent;
- EMsgComposer *composer;
-} EditorListener;
-
-typedef struct {
- BonoboObjectClass parent_class;
-
- POA_GNOME_GtkHTML_Editor_Listener__epv epv;
-} EditorListenerClass;
-
-GtkType listener_get_type (void);
-EditorListener *listener_construct (EditorListener *listener,
- GNOME_GtkHTML_Editor_Listener corba_listener);
-EditorListener *listener_new (EMsgComposer *composer);
-
-#endif /* LISTENER_H_ */
diff --git a/composer/mail-composer-errors.xml b/composer/mail-composer-errors.xml
deleted file mode 100644
index 1a52225ca3..0000000000
--- a/composer/mail-composer-errors.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<error-list domain="mail-composer">
-
- <error id="no-attach" type="error" modal="true">
- <primary>You cannot attach the file `{0}' to this message.</primary>
- <secondary>{1}</secondary>
- </error>
-
- <error id="attach-notfile" type="warning">
- <primary>The file `{0}' is not a regular file and cannot be sent in a message.</primary>
- </error>
-
- <error id="attach-directory">
- <primary>Directories can not be attached to Messages.</primary>
- <secondary>To attach the contents of this directory, either attach the files in this directory individually, or create an archive of the directory and attach it.</secondary>
- </error>
-
- <error id="attach-nomessages" type="error">
- <primary>Could not retrieve messages to attach from {0}.</primary>
- <secondary>Because &quot;{1}&quot;.</secondary>
- </error>
-
- <error id="recover-autosave" type="question">
- <title>Unfinished messages found</title>
- <primary>Do you want to recover unfinished messages?</primary>
- <secondary>Evolution quit unexpectedly while you were composing a new message. Recovering the message will allow you to continue where you left off.</secondary>
- <button label="Don't Recover" response="GTK_RESPONSE_CANCEL"/>
- <button label="Recover" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="no-autosave" type="error">
- <primary>Could not save to autosave file &quot;{0}&quot;.</primary>
- <secondary>Error saving to autosave because &quot;{1}&quot;.</secondary>
- </error>
-
- <error id="exit-unsaved" modal="true" type="warning" default="GTK_RESPONSE_YES">
- <title>Warning: Modified Message</title>
- <primary>Are you sure you want to discard the message, titled '{0}', you are composing?</primary>
- <secondary>Closing this composer window will discard the message permanently, unless you choose to save the message in your Drafts folder. This will allow you to continue the message at a later date.</secondary>
- <button label="_Discard Changes" response="GTK_RESPONSE_NO"/>
- <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/>
- <button label="_Save Message" response="GTK_RESPONSE_YES"/>
- </error>
-
- <error id="no-build-message" type="error" modal="true">
- <primary>Could not create message.</primary>
- <secondary>Because &quot;{0}&quot;, you may need to select different mail options.</secondary>
- </error>
-
- <error id="no-sig-file" type="warning" modal="true">
- <primary>Could not read signature file &quot;{0}&quot;.</primary>
- <secondary>Because &quot;{1}&quot;.</secondary>
- </error>
-
- <error id="all-accounts-deleted" type="warning" modal="true">
- <primary>All accounts have been removed.</primary>
- <secondary>You need to configure an account before you can compose mail.</secondary>
- </error>
-
- <error id="no-address-control" type="error" modal="true">
- <primary>Could not create composer window.</primary>
- <secondary>Unable to activate the address selector control.</secondary>
- </error>
-
- <error id="no-editor-control" type="error" modal="true">
- <primary>Could not create composer window.</primary>
- <secondary>Unable to activate the HTML editor control.
-
-Please make sure that you have the correct version of gtkhtml and libgtkhtml installed.</secondary>
- </error>
-
-</error-list>
diff --git a/composer/mail-composer-errors.xml.h b/composer/mail-composer-errors.xml.h
deleted file mode 100644
index 30f0005258..0000000000
--- a/composer/mail-composer-errors.xml.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* mail-composer:no-attach primary */
-char *s = N_("You cannot attach the file `{0}' to this message.");
-/* mail-composer:no-attach secondary */
-char *s = N_("{1}");
-/* mail-composer:attach-notfile primary */
-char *s = N_("The file `{0}' is not a regular file and cannot be sent in a message.");
-/* mail-composer:attach-directory primary */
-char *s = N_("Directories can not be attached to Messages.");
-/* mail-composer:attach-directory secondary */
-char *s = N_("To attach the contents of this directory, either attach the files in this directory individually, or create an archive of the directory and attach it.");
-/* mail-composer:attach-nomessages primary */
-char *s = N_("Could not retrieve messages to attach from {0}.");
-/* mail-composer:attach-nomessages secondary */
-char *s = N_("Because \"{1}\".");
-/* mail-composer:recover-autosave title */
-char *s = N_("Unfinished messages found");
-/* mail-composer:recover-autosave primary */
-char *s = N_("Do you want to recover unfinished messages?");
-/* mail-composer:recover-autosave secondary */
-char *s = N_("Evolution quit unexpectedly while you were composing a new message. Recovering the message will allow you to continue where you left off.");
-char *s = N_("Don't Recover");
-char *s = N_("Recover");
-/* mail-composer:no-autosave primary */
-char *s = N_("Could not save to autosave file \"{0}\".");
-/* mail-composer:no-autosave secondary */
-char *s = N_("Error saving to autosave because \"{1}\".");
-/* mail-composer:exit-unsaved title */
-char *s = N_("Warning: Modified Message");
-/* mail-composer:exit-unsaved primary */
-char *s = N_("Are you sure you want to discard the message, titled '{0}', you are composing?");
-/* mail-composer:exit-unsaved secondary */
-char *s = N_("Closing this composer window will discard the message permanently, unless you choose to save the message in your Drafts folder. This will allow you to continue the message at a later date.");
-char *s = N_("_Discard Changes");
-char *s = N_("_Save Message");
-/* mail-composer:no-build-message primary */
-char *s = N_("Could not create message.");
-/* mail-composer:no-build-message secondary */
-char *s = N_("Because \"{0}\", you may need to select different mail options.");
-/* mail-composer:no-sig-file primary */
-char *s = N_("Could not read signature file \"{0}\".");
-/* mail-composer:no-sig-file secondary */
-char *s = N_("Because \"{1}\".");
-/* mail-composer:all-accounts-deleted primary */
-char *s = N_("All accounts have been removed.");
-/* mail-composer:all-accounts-deleted secondary */
-char *s = N_("You need to configure an account before you can compose mail.");
-/* mail-composer:no-address-control primary */
-char *s = N_("Could not create composer window.");
-/* mail-composer:no-address-control secondary */
-char *s = N_("Unable to activate the address selector control.");
-/* mail-composer:no-editor-control primary */
-char *s = N_("Could not create composer window.");
-/* mail-composer:no-editor-control secondary */
-char *s = N_("Unable to activate the HTML editor control.\n"
- "\n"
- "Please make sure that you have the correct version of gtkhtml and libgtkhtml installed.");
diff --git a/configure.in b/configure.in
deleted file mode 100644
index 7ab584afe3..0000000000
--- a/configure.in
+++ /dev/null
@@ -1,1626 +0,0 @@
-# Process this file with autoconf to produce a configure script.
-AC_PREREQ(2.52)
-
-AC_INIT(evolution, 2.1.4, http://bugzilla.ximian.com/enter_bug.cgi?product=Evolution)
-AC_CONFIG_SRCDIR(README)
-AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
-
-AM_CONFIG_HEADER(config.h)
-
-AC_CANONICAL_HOST
-AC_DEFINE_UNQUOTED(VERSION_COMMENT, "", [Define if you want a comment appended to the version number])
-
-dnl Put the ACLOCAL flags in the Makefile
-ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS"
-
-dnl Initialize maintainer mode
-AM_MAINTAINER_MODE
-
-dnl *************************************************************************************************
-dnl Base Version
-dnl
-dnl This is for api/versioning tracking for things like bonobo .server files
-dnl
-dnl This should always be the major/minor of the stable version or stable version to be
-dnl *************************************************************************************************
-BASE_VERSION=2.2
-AC_SUBST(BASE_VERSION)
-AC_DEFINE_UNQUOTED(BASE_VERSION, "$BASE_VERSION", [Base version (Major.Minor)])
-
-dnl *************************************************************************************************
-dnl Upgrade Revision
-dnl
-dnl This is for triggering migration calls between varying versions.
-dnl
-dnl This should be reset to 0 whenever BASE_VERSION changes
-dnl *************************************************************************************************
-UPGRADE_REVISION=1
-AC_SUBST(UPGRADE_REVISION)
-AC_DEFINE_UNQUOTED(UPGRADE_REVISION, "$UPGRADE_REVISION", [The number of times we've upgraded since the BASE_VERSION release])
-
-dnl *************************************************************************************************
-dnl Development mode
-dnl
-dnl The controls whether things like the development warning in shell/main.c are displayed.
-dnl
-dnl This should be set to 0 for stable releases and 1 for unstable releases
-dnl *************************************************************************************************
-AC_DEFINE(DEVELOPMENT, 1, [If we are in development mode or not])
-AC_SUBST(DEVELOPMENT)
-
-AC_ISC_POSIX
-AC_PROG_CC
-AC_PROG_CPP
-AC_C_INLINE
-AM_PROG_LEX
-AC_PROG_YACC
-case $YACC in
-*yacc*)
- AC_MSG_ERROR(You need bison to build Evolution)
- ;;
-esac
-AC_STDC_HEADERS
-AC_ARG_PROGRAM
-AC_PROG_INSTALL
-AC_PROG_LN_S
-AC_PROG_MAKE_SET
-
-dnl Test whether jw is installed
-AC_PATH_PROG(JW,jw,no)
-if test x$JW = xno; then
- HAVE_JW="no"
-else
- HAVE_JW="yes"
-fi
-AM_CONDITIONAL(HAVE_JW, test "x$HAVE_JW" = "xyes")
-AC_SUBST(HAVE_JW)
-
-dnl I18N stuff
-AC_PROG_INTLTOOL([0.30])
-
-ALL_LINGUAS="am ar az be bg bs ca cs cy da de el en_AU en_CA en_GB es et eu fa fi fr ga gl gu he hr hu is it ja ko lt lv mn ms nb nl nn no pa pl pt pt_BR ro ru sk sl sq sr sr@Latn sv tr uk vi wa zh_CN zh_TW"
-AM_GLIB_GNU_GETTEXT
-
-GETTEXT_PACKAGE=evolution-2.2
-AC_SUBST(GETTEXT_PACKAGE)
-AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Package name for gettext])
-
-localedir='$(prefix)/$(DATADIRNAME)/locale'
-AC_SUBST(localedir)
-
-dnl Initialize libtool
-AM_DISABLE_STATIC
-AM_PROG_LIBTOOL
-
-dnl alloca()
-AC_CHECK_HEADERS(alloca.h)
-
-dnl check for socklen_t (in Unix98)
-AC_MSG_CHECKING(for socklen_t)
-AC_TRY_COMPILE([#include <sys/types.h>
-#include <sys/socket.h>
-socklen_t x;
-],[],[AC_MSG_RESULT(yes)],[
-AC_TRY_COMPILE([#include <sys/types.h>
-#include <sys/socket.h>
-int accept (int, struct sockaddr *, size_t *);
-],[],[
-AC_MSG_RESULT(size_t)
-AC_DEFINE(socklen_t,size_t,[Define to appropriate type if socklen_t is not defined])], [
-AC_MSG_RESULT(int)
-AC_DEFINE(socklen_t,int)])])
-
-dnl
-dnl Purify support
-dnl
-EVO_PURIFY_SUPPORT
-
-dnl **************
-dnl Test Component
-dnl **************
-AC_ARG_ENABLE(test-component, [ --enable-test-component=[no/yes] Enable test component.],enable_test_comp="$enableval",enable_test_comp=no)
-AM_CONDITIONAL(ENABLE_TEST_COMPONENT, test "x$enable_test_comp" = "xyes")
-
-dnl
-dnl system mail stuff (tbd?)
-dnl
-AC_PATH_PROG(SENDMAIL, sendmail, /usr/sbin/sendmail, /usr/sbin:/usr/lib)
-AC_DEFINE_UNQUOTED(SENDMAIL_PATH, "$SENDMAIL", [Path to a sendmail binary, or equivalent])
-
-AC_MSG_CHECKING(system mail directory)
-if test -d /var/mail -a '!' -h /var/mail ; then
- system_mail_dir=/var/mail
-else
- system_mail_dir=/var/spool/mail
-fi
-AC_DEFINE_UNQUOTED(SYSTEM_MAIL_DIR, "$system_mail_dir", [Directory local mail is delivered to])
-
-case `ls -ld $system_mail_dir 2>&1 | awk '{print $1;}'` in
-d??????rw?)
- CAMEL_LOCK_HELPER_USER=""
- CAMEL_LOCK_HELPER_GROUP=""
- system_mail_perm="world writable"
- ;;
-
-d???rw????)
- CAMEL_LOCK_HELPER_USER=""
- CAMEL_LOCK_HELPER_GROUP=`ls -ld $system_mail_dir 2>&1 | awk '{print $4;}'`
- system_mail_perm="writable by group $CAMEL_LOCK_HELPER_GROUP"
- ;;
-
-drw???????)
- CAMEL_LOCK_HELPER_USER=`ls -ld $system_mail_dir 2>&1 | awk '{print $3;}'`
- CAMEL_LOCK_HELPER_GROUP=""
- system_mail_perm="writable by user $CAMEL_LOCK_HELPER_USER"
- ;;
-
-*)
- CAMEL_LOCK_HELPER_USER=""
- CAMEL_LOCK_HELPER_GROUP=""
- system_mail_perm="???"
- ;;
-esac
-
-AC_MSG_RESULT([$system_mail_dir, $system_mail_perm])
-AC_SUBST(CAMEL_LOCK_HELPER_USER)
-AC_SUBST(CAMEL_LOCK_HELPER_GROUP)
-
-
-dnl ***************
-dnl Timezone checks
-dnl ***************
-AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
- AC_TRY_COMPILE([
- #include <time.h>
- ], [
- struct tm tm;
- tm.tm_gmtoff = 1;
- ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
-if test $ac_cv_struct_tm_gmtoff = yes; then
- AC_DEFINE(HAVE_TM_GMTOFF, 1, [Define if struct tm has a tm_gmtoff member])
-else
- AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
- AC_TRY_COMPILE([
- #include <time.h>
- ], [
- timezone = 1;
- ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
- if test $ac_cv_var_timezone = yes; then
- AC_DEFINE(HAVE_TIMEZONE, 1, [Define if libc defines a timezone variable])
- AC_CACHE_CHECK(for altzone variable, ac_cv_var_altzone,
- AC_TRY_COMPILE([
- #include <time.h>
- ], [
- altzone = 1;
- ], ac_cv_var_altzone=yes, ac_cv_var_altzone=no))
- if test $ac_cv_var_altzone = yes; then
- AC_DEFINE(HAVE_ALTZONE, 1, [Define if libc defines an altzone variable])
- fi
- else
- AC_ERROR(unable to find a way to determine timezone)
- fi
-fi
-
-
-AC_CHECK_FUNCS(mkstemp mkdtemp isblank)
-
-dnl **************************************************
-dnl ctime_r prototype
-dnl **************************************************
-
-AC_CACHE_CHECK([if ctime_r wants three arguments], ac_cv_ctime_r_three_args,
-[
- AC_TRY_COMPILE([
- #include <time.h>
- ],[
- char *buf;
- time_t date;
- ctime_r (&date, buf, 100);
- ],[
- ac_cv_ctime_r_three_args=yes
- ],[
- ac_cv_ctime_r_three_args=no
- ])
-])
-
-if test x"$ac_cv_ctime_r_three_args" = xyes ; then
- AC_DEFINE(CTIME_R_THREE_ARGS, 1, [Solaris-style ctime_r])
-fi
-
-dnl **************************************************
-dnl gethostbyname_r prototype
-dnl **************************************************
-
-AC_CHECK_FUNCS(gethostbyname_r,[
-AC_CACHE_CHECK([if gethostbyname_r wants five arguments], ac_cv_gethostbyname_r_five_args,
-[
- AC_TRY_COMPILE([
- #include "confdefs.h"
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
-
- #define BUFSIZE (sizeof(struct hostent)+10)
- ],[
- struct hostent hent;
- char buffer[BUFSIZE];
- int bufsize=BUFSIZE;
- int h_errno;
-
- (void)gethostbyname_r ("www.ximian.com", &hent, buffer, bufsize, &h_errno);
- ],[
- ac_cv_gethostbyname_r_five_args=yes
- ],[
- ac_cv_gethostbyname_r_five_args=no
- ])
-])])
-
-if test "x$ac_cv_gethostbyname_r_five_args" = "xyes" ; then
- AC_DEFINE(GETHOSTBYNAME_R_FIVE_ARGS, 1, [Solaris-style gethostbyname_r])
-fi
-
-dnl **************************************************
-dnl gethostbyaddr_r prototype
-dnl **************************************************
-
-AC_CHECK_FUNCS(gethostbyaddr_r,[
-AC_CACHE_CHECK([if gethostbyaddr_r wants seven arguments], ac_cv_gethostbyaddr_r_seven_args,
-[
- AC_TRY_COMPILE([
- #include "confdefs.h"
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
-
- #define BUFSIZE (sizeof(struct hostent)+10)
- ],[
- struct hostent hent;
- char buffer[BUFSIZE];
- int bufsize=BUFSIZE;
- int h_errno;
-
- (void)gethostbyaddr_r ("www.ximian.com", 14, AF_INET, &hent, buffer, bufsize, &h_errno);
- ],[
- ac_cv_gethostbyaddr_r_seven_args=yes
- ],[
- ac_cv_gethostbyaddr_r_seven_args=no
- ])
-])])
-
-if test "x$ac_cv_gethostbyaddr_r_seven_args" = "xyes" ; then
- AC_DEFINE(GETHOSTBYADDR_R_SEVEN_ARGS, 1, [Solaris-style gethostbyaddr_r])
-fi
-
-dnl **************************************************
-dnl stat(v)fs location/type
-dnl **************************************************
-
-AC_CHECK_HEADERS(sys/statvfs.h)
-AC_CHECK_FUNCS(statvfs)
-AC_CHECK_HEADERS(sys/param.h)
-AC_CHECK_HEADERS(sys/mount.h)
-AC_CHECK_FUNCS(statfs)
-
-dnl **************************************************
-dnl * Gnome Icon Theme
-dnl **************************************************
-PKG_CHECK_MODULES(GIT, gnome-icon-theme >= 1.2.0)
-
-dnl **************************************************
-dnl * Accessibility support
-dnl **************************************************
-PKG_CHECK_MODULES(A11Y, atk)
-AC_SUBST(A11Y_CFLAGS)
-AC_SUBST(A11Y_LIBS)
-
-dnl **************************************************
-dnl * IPv6 support and getaddrinfo calls
-dnl **************************************************
-AC_CACHE_CHECK([if system supports getaddrinfo and getnameinfo], have_addrinfo,
-[
- AC_TRY_COMPILE([
- #include "confdefs.h"
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
-
- ],[
- struct addrinfo hints, *res;
- struct sockaddr_in6 sin6;
- int af = AF_INET6;
- char host[NI_MAXHOST];
- char serv[NI_MAXSERV];
-
- getaddrinfo ("www.ximian.com", NULL, &hints, &res);
- freeaddrinfo (res);
- getnameinfo((struct sockaddr *)&sin6, sizeof(sin6), host, sizeof(host), serv, sizeof(serv), 0);
- ],[
- have_addrinfo=yes
- ],[
- have_addrinfo=no
- ])
-])
-
-if test x"$have_addrinfo" = "xno" ; then
- AC_DEFINE(NEED_ADDRINFO,1,[Enable getaddrinfo emulation])
- if test x"$enable_ipv6" = "xyes" ; then
- AC_ERROR(system doesn't support necessary interfaces for ipv6 support)
- fi
- msg_ipv6=no
-else
- AC_ARG_ENABLE(ipv6, [ --enable-ipv6=[no/yes] Enable support for resolving IPv6 addresses.],,enable_ipv6=yes)
- if test x"$enable_ipv6" = "xyes"; then
- msg_ipv6=yes
- AC_DEFINE(ENABLE_IPv6,1,[Enable IPv6 support])
- AC_TRY_COMPILE([
- #include "confdefs.h"
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
-
- ],[
- struct addrinfo hints;
-
- hints.ai_flags = AI_ADDRCONFIG;
- ],[
- AC_DEFINE(HAVE_AI_ADDRCONFIG,1,[Define if the system defines the AI_ADDRCONFIG flag for getaddrinfo])
- ])
- else
- msg_ipv6=no
- fi
-fi
-
-AM_CONDITIONAL(ENABLE_IPv6, test "x$enable_ipv6" = "xyes")
-
-dnl **************************************************
-dnl LDAP support.
-dnl **************************************************
-EVO_LDAP_CHECK(no)
-case $with_openldap in
-no)
- msg_ldap=no
- ;;
-*)
- case $with_static_ldap in
- yes)
- msg_ldap="yes (static)"
- ;;
- *)
- msg_ldap="yes (dynamic)"
- ;;
- esac
-esac
-
-dnl **************************************************
-dnl NNTP support.
-dnl **************************************************
-AC_ARG_ENABLE(nntp,
-[ --enable-nntp=[no/yes] Build Usenet news (NNTP) backend],,enable_nntp=yes)
-if test "x$enable_nntp" = "xyes"; then
- AC_DEFINE(ENABLE_NNTP,1,[Build NNTP backend])
- msg_nntp=yes
-else
- msg_nntp=no
-fi
-AM_CONDITIONAL(ENABLE_NNTP, test x$enable_nntp = xyes)
-
-dnl **************************************************
-dnl New IMAP code support.
-dnl **************************************************
-AC_ARG_ENABLE(imapp,
-[ --enable-imapp=[no/yes] Attempt to compile alternative, incomplete, very unsupported IMAPv4r1 code],,enable_imapp=no)
-if test "x$enable_imapp" = "xyes"; then
- AC_DEFINE(ENABLE_IMAPP,1,[Really don't try this at home])
- msg_imapp=yes
-else
- msg_imapp=no
-fi
-AM_CONDITIONAL(ENABLE_IMAPP, test x$enable_imapp = xyes)
-
-dnl **************************************************
-dnl New IMAP code support.
-dnl **************************************************
-AC_ARG_ENABLE(imap4,
-[ --enable-imap4=[no/yes] Attempt to compile yet another, incomplete, very unsupported IMAPv4r1 implementation],,enable_imap4="yes")
-if test "x$enable_imap4" = "xyes"; then
- AC_DEFINE(ENABLE_IMAP4,1,[Really don't try this at home])
- msg_imap4=yes
-else
- msg_imap4=no
-fi
-AM_CONDITIONAL(ENABLE_IMAP4, test x$enable_imap4 = xyes)
-
-dnl **************************************************
-dnl * Posix thread support
-dnl **************************************************
-
-dnl GLIB_CONFIG=${GLIB_CONFIG-glib-config}
-dnl GNOME_PTHREAD_CHECK
-
-dnl if test "x$PTHREAD_LIB" = "x" ; then
-dnl AC_MSG_ERROR([POSIX threads are currently required for Evolution])
-dnl fi
-
-dnl
-dnl Notice that this is a hack, and we wont be able to use this forever, but
-dnl at least for some time
-dnl
-
-EVO_PTHREAD_CHECK
-
-THREADS_LIBS="$PTHREAD_LIB"
-THREADS_CFLAGS="$PTHREAD_CFLAGS"
-
-AC_SUBST(THREADS_LIBS)
-AC_SUBST(THREADS_CFLAGS)
-AC_DEFINE(ENABLE_THREADS,1,[Required])
-
-
-dnl **************************************************
-dnl * File locking
-dnl **************************************************
-
-AC_ARG_ENABLE(dot-locking,
-[ --enable-dot-locking=[yes/no] Enable support for locking mail files with dot locking],,enable_dot_locking=yes)
-if test "x$enable_dot_locking" = "xyes"; then
- AC_DEFINE(USE_DOT,1,[Define to use dot locking for mbox files])
- msg_dot=yes
-else
- msg_dot=no
-fi
-
-AC_ARG_ENABLE(file-locking,
-[ --enable-file-locking=[fcntl/flock/no] Enable support for locking mail files with file locking],,enable_file_locking=fcntl)
-if test "x$enable_file_locking" = "xfcntl"; then
- AC_DEFINE(USE_FCNTL,1,[Define to use fcntl locking for mbox files])
- msg_file=fcntl
-else
- if test "x$enable_file_locking" = "xflock"; then
- AC_DEFINE(USE_FLOCK,1,[Define to use flock locking for mbox files])
- msg_file=flock
- else
- msg_file=no
- fi
-fi
-
-
-dnl **************************************************
-dnl * sendmail operation
-dnl **************************************************
-
-AC_MSG_CHECKING(for SunOS broken spool format)
-if test "x$host_os" = "xsunos" ; then
- with_broken_spool="yes"
-fi
-
-AC_ARG_WITH(broken-spool,
-[ --with-broken-spool=[yes/no] Using SunOS/Solaris sendmail which has a broken spool format],,with_broken_spool=${with_broken_spool:=no})
-
-if test "x$with_broken_spool" = "xyes"; then
- AC_DEFINE(HAVE_BROKEN_SPOOL,1,[Define if mail delivered to the system mail directory is in broken Content-Length format])
-fi
-
-AC_MSG_RESULT($with_broken_spool)
-
-
-dnl *********
-dnl Libraries
-dnl *********
-
-PKG_CHECK_MODULES(GTKHTML, libgtkhtml-3.6)
-AC_SUBST(GTKHTML_CFLAGS)
-AC_SUBST(GTKHTML_LIBS)
-GTKHTML_DATADIR=`$PKG_CONFIG --variable gtkhtml_datadir libgtkhtml-3.6`
-AC_SUBST(GTKHTML_DATADIR)
-GTKHTML_API_VERSION=`$PKG_CONFIG --variable gtkhtml_apiversion libgtkhtml-3.6`
-AC_DEFINE_UNQUOTED(GTKHTML_API_VERSION, "$GTKHTML_API_VERSION", [The gtkhtml api version])
-
-
-
-
-dnl ******************************
-dnl Pilot checking
-dnl ******************************
-AC_ARG_ENABLE(pilot-conduits,
-[ --enable-pilot-conduits=[no/yes] Enable support for building pilot conduits.],,enable_pilot_conduits=no)
-if test "x$enable_pilot_conduits" = "xyes"; then
- PKG_CHECK_MODULES(GNOME_PILOT, gnome-pilot-2.0)
-
- CFLAGS_save="$CFLAGS"
- CFLAGS="$CFLAGS $GNOME_PILOT_CFLAGS"
- LDFLAGS_save="$LDFLAGS"
- LDFLAGS="$LDFLAGS $GNOME_PILOT_LIBS"
-
- AC_CACHE_CHECK([if pilot-link handles UTF-8 conversions], ac_cv_pilot_link_utf8, AC_TRY_RUN([
-
-#include <stdlib.h>
-#include <string.h>
-#include <pi-util.h>
-
-int main (int argc, char **argv)
-{
- const char *utf8 = "\x66\x66\x66\x66\x66\x66\x66\xC2\xA9";
- size_t utf8_real_len = strlen (utf8);
- char *pstring;
-
- if (convert_ToPilotChar ("UTF-8", utf8, utf8_real_len, &pstring) == -1)
- exit (1);
-
- exit (0);
-}
-], ac_cv_pilot_link_utf8=yes, ac_cv_pilot_link_utf8=no, ac_cv_pilot_link_utf8=no))
-
- CFLAGS="$CFLAGS_save"
- LDFLAGS="$LDFLAGS_save"
-
- if test "$ac_cv_pilot_link_utf8" = no; then
- AC_MSG_ERROR(evolution requires pilot-link to have working UTF-8 conversion routines)
- fi
-fi
-AM_CONDITIONAL(ENABLE_PILOT_CONDUITS, test "x$enable_pilot_conduits" = "xyes")
-if test x$enable_pilot_conduits = xyes; then
- msg_pilot=yes
-else
- msg_pilot=no
-fi
-AC_SUBST(GNOME_PILOT_CFLAGS)
-AC_SUBST(GNOME_PILOT_LIBS)
-
-dnl ********
-dnl Kerberos
-dnl ********
-AC_ARG_WITH(krb5, [ --with-krb5=DIR Location of Kerberos 5 install dir], with_krb5="$withval", with_krb5="no")
-AC_ARG_WITH(krb5-libs, [ --with-krb5-libs=DIR Location of Kerberos 5 libraries], with_krb5_libs="$withval", with_krb5_libs="$with_krb5/lib")
-AC_ARG_WITH(krb5-includes, [ --with-krb5-includes=DIR Location of Kerberos 5 headers], with_krb5_includes="$withval", with_krb5_includes="")
-AC_ARG_WITH(krb4, [ --with-krb4=DIR Location of Kerberos 4 install dir], with_krb4="$withval", with_krb4="no")
-AC_ARG_WITH(krb4-libs, [ --with-krb4-libs=DIR Location of Kerberos 4 libraries], with_krb4_libs="$withval", with_krb4_libs="$with_krb4/lib")
-AC_ARG_WITH(krb4-includes, [ --with-krb4-includes=DIR Location of Kerberos 4 headers], with_krb4_includes="$withval", with_krb4_includes="")
-
-
-msg_krb5="no"
-if test "x${with_krb5}" != "xno"; then
- LDFLAGS_save="$LDFLAGS"
-
- mitlibs="-lkrb5 -lk5crypto -lcom_err -lgssapi_krb5"
- heimlibs="-lkrb5 -lcrypto -lasn1 -lcom_err -lroken -lgssapi"
- AC_CACHE_CHECK([for Kerberos 5], ac_cv_lib_kerberos5,
- [
- LDFLAGS="$LDFLAGS -L$with_krb5_libs $mitlibs"
- AC_TRY_LINK_FUNC(krb5_init_context, ac_cv_lib_kerberos5="$mitlibs",
- [
- LDFLAGS="$LDFLAGS_save -L$with_krb5_libs $heimlibs"
- AC_TRY_LINK_FUNC(krb5_init_context, ac_cv_lib_kerberos5="$heimlibs", ac_cv_lib_kerberos5="no")
- ])
- LDFLAGS="$LDFLAGS_save"
- ])
- if test "$ac_cv_lib_kerberos5" != "no"; then
- AC_DEFINE(HAVE_KRB5,1,[Define if you have Krb5])
- if test "$ac_cv_lib_kerberos5" = "$mitlibs"; then
- AC_DEFINE(HAVE_MIT_KRB5,1,[Define if you have MIT Krb5])
- if test -z "$with_krb5_includes"; then
- KRB5_CFLAGS="-I$with_krb5/include"
- else
- KRB5_CFLAGS="-I$with_krb5_includes"
- fi
- msg_krb5="yes (MIT)"
- else
- AC_DEFINE(HAVE_HEIMDAL_KRB5,1,[Define if you have Heimdal])
- if test -z "$with_krb5_includes"; then
- KRB5_CFLAGS="-I$with_krb5/include/heimdal"
- else
- KRB5_CFLAGS="-I$with_krb5_includes"
- fi
- msg_krb5="yes (Heimdal)"
- fi
- KRB5_LDFLAGS="-L$with_krb5_libs $ac_cv_lib_kerberos5"
- fi
-else
- AC_MSG_CHECKING(for Kerberos 5)
- AC_MSG_RESULT($with_krb5)
-fi
-
-AC_CHECK_HEADER([et/com_err.h],[AC_DEFINE([HAVE_ET_COM_ERR_H], 1, [Have et/comm_err.h])])
-AC_CHECK_HEADER([com_err.h],[AC_DEFINE([HAVE_COM_ERR_H], 1, [Have comm_err.h])])
-
-msg_krb4="no"
-if test "x${with_krb4}" != "xno"; then
- LDFLAGS_save="$LDFLAGS"
- AC_CACHE_CHECK(for Kerberos 4, ac_cv_lib_kerberos4,
- [
- ac_cv_lib_kerberos4="no"
-
- mitcompatlibs="-lkrb4 -ldes425 -lkrb5 -lk5crypto -lcom_err"
- # Look for MIT krb5 compat krb4
- LDFLAGS="$LDFLAGS -L$with_krb4_libs $mitcompatlibs"
- AC_TRY_LINK_FUNC(krb_mk_req, ac_cv_lib_kerberos4="$mitcompatlibs")
-
- if test "$ac_cv_lib_kerberos4" = "no"; then
- # Look for KTH krb4
- LDFLAGS="$LDFLAGS_save -L$with_krb4_libs -lkrb -lcrypto -lcom_err -lroken"
- AC_TRY_LINK_FUNC(krb_mk_req, ac_cv_lib_kerberos4="-lkrb -lcrypto -lcom_err -lroken")
- fi
- if test "$ac_cv_lib_kerberos4" = "no"; then
- # Look for old MIT krb4
- LDFLAGS="$LDFLAGS_save -L$with_krb4_libs -lkrb"
- AC_TRY_LINK_FUNC(krb_mk_req, ac_cv_lib_kerberos4="-lkrb",
- [
- LDFLAGS="$LDFLAGS -ldes"
- AC_TRY_LINK_FUNC(krb_mk_req, ac_cv_lib_kerberos4="-lkrb -ldes")
- ])
- fi
- ])
- LDFLAGS="$LDFLAGS_save"
- if test "$ac_cv_lib_kerberos4" != "no"; then
- AC_DEFINE(HAVE_KRB4,1,[Define if you have Krb4])
- msg_krb4="yes"
-
- if test -z "$with_krb4_includes"; then
- if test -f "$with_krb4/include/krb.h" -o -f "$with_krb4/include/port-sockets.h"; then
- KRB4_CFLAGS="-I$with_krb4/include"
- fi
- if test -d "$with_krb4/include/kerberosIV"; then
- KRB4_CFLAGS="$KRB4_CFLAGS -I$with_krb4/include/kerberosIV"
- fi
- else
- KRB4_CFLAGS="-I$with_krb4_includes"
- fi
- KRB4_LDFLAGS="-L$with_krb4_libs $ac_cv_lib_kerberos4"
-
- CFLAGS_save="$CFLAGS"
- CFLAGS="$CFLAGS $KRB4_CFLAGS"
- AC_TRY_COMPILE([#include "krb.h"
- int krb_sendauth;
- ],[return 0],[AC_DEFINE(NEED_KRB_SENDAUTH_PROTO,1,[Need krb_sendauth proto])],)
- CFLAGS="$CFLAGS_save"
- fi
-else
- AC_MSG_CHECKING(for Kerberos 4)
- AC_MSG_RESULT(${with_krb4})
-fi
-
-AC_SUBST(KRB5_CFLAGS)
-AC_SUBST(KRB5_LDFLAGS)
-AC_SUBST(KRB4_CFLAGS)
-AC_SUBST(KRB4_LDFLAGS)
-
-dnl Mono hooks
-
-AC_ARG_ENABLE(mono, [ --enable-mono=[yes,no] Add Mono embedded hooks.],
- enable_mono="$enableval", enable_mono="no")
-
-if test "x${enable_mono}" = "xyes"; then
- AC_DEFINE(ENABLE_MONO,1,[Define if Mono embedding should be enabled])
- mono_package="mono"
-fi
-AM_CONDITIONAL(ENABLE_MONO, test x$enable_mono = xyes)
-
-dnl ********************************************************************************
-dnl security extension support (SSL and S/MIME)
-dnl
-dnl The following voodoo does detection of mozilla libraries (nspr and nss)
-dnl needed by Camel (SSL and S/MIME).
-dnl
-dnl The Evolution security extensions are only built if these libraries are found
-dnl ********************************************************************************
-msg_ssl="no"
-msg_smime="no"
-
-dnl these 2 enable's are inverses of each other
-AC_ARG_ENABLE(nss, [ --enable-nss=[yes,no,static] Attempt to use Mozilla libnss for SSL support.],
- enable_nss="$enableval", enable_nss="yes")
-
-AC_ARG_ENABLE(smime, [ --enable-smime=[yes,no] Attempt to use Mozilla libnss for SMIME support (this requires --enable-nss)],
- enable_smime="$enableval", enable_smime="yes")
-
-dnl ***********************************************************************************************************
-dnl OpenSSL is no longer available. DO NOT USE IT!!! The OpenSSL camel code is known to have security problems,
-dnl it doesn't work, it doesn't build, it is never tested, and to top it all off, it is not GPL compatable.
-dnl ***********************************************************************************************************
-dnl
-dnl AC_ARG_ENABLE(openssl, [ --enable-openssl=[no,yes] Attempt to use OpenSSL for SSL support.],
-dnl enable_openssl="$enableval", enable_openssl="no")
-dnl
-dnl if test "x${enable_openssl}" = "xyes"; then
-dnl User wants to override nss with OpenSSL
-dnl enable_nss="no"
-dnl AC_MSG_WARN([OpenSSL enabled, disabling NSS.])
-dnl fi
-
-AC_ARG_WITH(nspr-includes, [ --with-nspr-includes=PREFIX Location of Mozilla nspr4 includes.],
- with_nspr_includes="$withval")
-
-AC_ARG_WITH(nspr-libs, [ --with-nspr-libs=PREFIX Location of Mozilla nspr4 libs.],
- with_nspr_libs="$withval")
-
-AC_ARG_WITH(nss-includes, [ --with-nss-includes=PREFIX Location of Mozilla nss3 includes.],
- with_nss_includes="$withval")
-
-AC_ARG_WITH(nss-libs, [ --with-nss-libs=PREFIX Location of Mozilla nss3 libs.],
- with_nss_libs="$withval")
-
-if test "x${enable_nss}" = "xyes" || test "x${enable_nss}" = "xstatic"; then
- if test -n "${with_nspr_includes}" || test -n "${with_nspr_libs}" || test -n "${with_nss_includes}" || test -n "${with_nss_libs}" || test "x${enable_nss}" = "xstatic"; then
-dnl If the user specifies --with-foo or --enable-nss=static, then we have to do this manually
- check_manually="yes"
- else
- check_manually="no"
- fi
-
- if test "x${check_manually}" = "xno" && `$PKG_CONFIG --exists mozilla-nss`; then
- PKG_CHECK_MODULES(NSS, mozilla-nss, have_nss="yes")
- if test "x${have_nss}" = "xyes"; then
- msg_ssl="yes (Mozilla NSS)"
- if test "x$enable_smime" = "xyes"; then
- AC_DEFINE(ENABLE_SMIME,1,[Define if SMIME should be enabled])
- msg_smime="yes (Mozilla NSS)"
- fi
- mozilla_nspr="mozilla-nspr"
- mozilla_nss="mozilla-nss"
- AC_DEFINE(HAVE_NSS,1,[Define if you have NSS])
- AC_DEFINE(HAVE_SSL,1,[Define if you have a supported SSL library])
- MANUAL_NSPR_CFLAGS=""
- MANUAL_NSPR_LIBS=""
- MANUAL_NSS_CFLAGS=""
- MANUAL_NSS_LIBS=""
- else
- check_manually="yes"
- fi
- fi
-
- if test "x${check_manually}" = "xyes"; then
- mozilla_nss=""
- have_nspr_includes="no"
- if test "x${with_nspr_includes}" != "xno"; then
- CPPFLAGS_save="$CPPFLAGS"
-
- AC_MSG_CHECKING(for Mozilla nspr4 includes in $with_nspr_includes)
- AC_MSG_RESULT("")
-
- CPPFLAGS="$CPPFLAGS -I$with_nspr_includes"
- AC_CHECK_HEADERS(nspr.h prio.h, [ moz_nspr_includes="yes" ])
- CPPFLAGS="$CPPFLAGS_save"
-
- if test "x{$moz_nspr_includes}" != "xno" -a "x{$moz_nspr_includes}" != "x" ; then
- have_nspr_includes="yes"
- MANUAL_NSPR_CFLAGS="-I$with_nspr_includes"
- fi
- else
- AC_MSG_CHECKING(for Mozilla nspr4 includes)
- AC_MSG_RESULT(no)
- fi
-
- have_nspr_libs="no"
- if test "x${with_nspr_libs}" != "xno" -a "x${have_nspr_includes}" != "xno"; then
- CFLAGS_save="$CFLAGS"
- LDFLAGS_save="$LDFLAGS"
-
- if test "$enable_nss" = "static"; then
- if test -z "${with_nspr_libs}"; then
- AC_MSG_ERROR([Static linkage requested, but path to nspr libraries not set.]
-[Please specify the path to libnspr4.a]
-[Example: --with-nspr-libs=/usr/lib])
- else
- nsprlibs="-ldl $with_nspr_libs/libplc4.a $with_nspr_libs/libplds4.a $with_nspr_libs/libnspr4.a $PTHREAD_LIB"
- fi
- else
- nsprlibs="-ldl -lplc4 -lplds4 -lnspr4 $PTHREAD_LIB"
- fi
-
- AC_CACHE_CHECK([for Mozilla nspr libraries], moz_nspr_libs,
- [
- LIBS_save="$LIBS"
- CFLAGS="$CFLAGS $MANUAL_NSPR_CFLAGS"
-
- if test "x${with_nspr_libs}" != "x"; then
- LIBS="$nsprlibs"
- LDFLAGS="$LDFLAGS -L$with_nspr_libs"
- else
- LIBS="$nsprlibs"
- LDFLAGS="$LDFLAGS"
- fi
-
- AC_TRY_LINK_FUNC(PR_Init, moz_nspr_libs="yes", moz_nspr_libs="no")
- CFLAGS="$CFLAGS_save"
- LDFLAGS="$LDFLAGS_save"
- LIBS="$LIBS_save"
- ])
- if test "x$moz_nspr_libs" != "xno"; then
- have_nspr_libs="yes"
- MANUAL_NSPR_LIBS="-L$with_nspr_libs $nsprlibs"
- else
- MANUAL_NSPR_CLFAGS=""
- fi
- else
- AC_MSG_CHECKING(for Mozilla nspr4 libraries)
- AC_MSG_RESULT(no)
- fi
-
- if test "x${with_nss_includes}" != "xno" -a "x${have_nspr_libs}" != "xno"; then
- CPPFLAGS_save="$CPPFLAGS"
-
- AC_MSG_CHECKING(for Mozilla nss3 includes in $with_nss_includes)
- AC_MSG_RESULT("")
-
- if test "x${with_nspr_includes}" != "x"; then
- CPPFLAGS="$CPPFLAGS -I$with_nspr_includes -I$with_nss_includes"
- else
- CPPFLAGS="$CPPFLAGS -I$with_nss_includes"
- fi
-
- AC_CHECK_HEADERS(nss.h ssl.h smime.h,
- [ have_nss_includes="yes" ],
- [ have_nss_includes="no" ])
-
- CPPFLAGS="$CPPFLAGS_save"
-
- if test "x${have_nss_includes}" = "xyes"; then
- have_nss_includes="yes"
- MANUAL_NSS_CFLAGS="-I$with_nss_includes"
- else
- MANUAL_NSPR_CFLAGS=""
- MANUAL_NSPR_LIBS=""
- fi
- else
- AC_MSG_CHECKING(for Mozilla nss3 includes)
- AC_MSG_RESULT(no)
- fi
-
- if test "x${with_nss_libs}" != "xno" -a "x${have_nss_includes}" != "xno"; then
- LDFLAGS_save="$LDFLAGS"
-
- if test "$enable_nss" = "static"; then
- if test -z "${with_nss_libs}"; then
- AC_MSG_ERROR([Static linkage requested, but path to nss libraries not set.]
-[Please specify the path to libnss3.a]
-[Example: --with-nspr-libs=/usr/lib/mozilla])
- else
- nsslibs="-ldb1 $with_nss_libs/libnssckfw.a $with_nss_libs/libasn1.a $with_nss_libs/libcrmf.a $with_nss_libs/libswfci.a $with_nss_libs/libjar.a $with_nss_libs/libpkcs12.a $with_nss_libs/libpkcs7.a $with_nss_libs/libpki1.a $with_nss_libs/libsmime.a $with_nss_libs/libssl.a $with_nss_libs/libnss.a $with_nss_libs/libpk11wrap.a $with_nss_libs/libsoftokn.a $with_nss_libs/libfreebl.a $with_nss_libs/libnsspki.a $with_nss_libs/libnssdev.a $with_nss_libs/libcryptohi.a $with_nss_libs/libcerthi.a $with_nss_libs/libcertdb.a $with_nss_libs/libsecutil.a $with_nss_libs/libnssb.a"
- case "$host" in
- *solaris*)
- nsslibs="$nsslibs $with_nss_libs/libfreebl.a"
- ;;
- esac
- fi
- else
- nsslibs="-lssl3 -lsmime3 -lnss3 -lsoftokn3"
- fi
-
- AC_CACHE_CHECK([for Mozilla nss libraries], moz_nss_libs,
- [
- LIBS_save="$LIBS"
- LDFLAGS="$LDFLAGS -L$with_nspr_libs $nsprlibs -L$with_nss_libs $nsslibs"
- LIBS="$nsslibs $nsprlibs"
- AC_TRY_LINK_FUNC(NSS_Init, moz_nss_libs="yes", moz_nss_libs="no")
- if test "$moz_nss_libs" = no; then
- nsslibs="-lssl3 -lsmime3 -lnss3 -lsoftokn3"
- LDFLAGS="$LDFLAGS -L$with_nspr_libs $nsprlibs -L$with_nss_libs $nsslibs"
- AC_TRY_LINK_FUNC(NSS_Init, moz_nss_libs="yes", moz_nss_libs="no")
- fi
- LDFLAGS="$LDFLAGS_save"
- LIBS="$LIBS_save"
- ])
- if test "$moz_nss_libs" != no; then
- AC_DEFINE(HAVE_NSS)
- AC_DEFINE(HAVE_SSL)
- if test "$enable_nss" = "static"; then
- msg_ssl="yes (Mozilla NSS:static)"
- else
- msg_ssl="yes (Mozilla NSS)"
- fi # static_nss
- if test "$enable_smime" = "yes"; then
- AC_DEFINE(ENABLE_SMIME,1,[Define if SMIME should be enabled])
- msg_smime="yes (Mozilla NSS)"
- fi
- MANUAL_NSS_LIBS="-L$with_nss_libs $nsslibs"
- else
- MANUAL_NSS_CFLAGS=""
- MANUAL_NSPR_CFLAGS=""
- MANUAL_NSPR_LIBS=""
- fi
- else
- AC_MSG_CHECKING(for Mozilla nss libraries)
- AC_MSG_RESULT(no)
- fi
-
- MANUAL_NSS_CFLAGS="$MANUAL_NSPR_CFLAGS $MANUAL_NSS_CFLAGS"
- MANUAL_NSS_LIBS="$MANUAL_NSPR_LIBS $MANUAL_NSS_LIBS"
- fi
-fi
-
-AM_CONDITIONAL(ENABLE_SMIME, test "x$msg_smime" != "xno")
-
-AC_SUBST(MANUAL_NSPR_CFLAGS)
-AC_SUBST(MANUAL_NSPR_LIBS)
-AC_SUBST(MANUAL_NSS_CFLAGS)
-AC_SUBST(MANUAL_NSS_LIBS)
-
-dnl ******************
-dnl CDE dtappintegrate
-dnl ******************
-
-AC_ARG_WITH(cde-path, [ --with-cde-path=PATH Location of CDE installation],
- [with_cde_path="$withval"])
-if test -z "$with_cde_path"; then
- with_cde_path="/usr/dt"
-fi
-
-AC_MSG_CHECKING(for dtappintegrate)
-if test -x "$with_cde_path/bin/dtappintegrate" ; then
- DTAPPINTEGRATE="$with_cde_path/bin/dtappintegrate"
-else
- DTAPPINTEGRATE="no"
-fi
-AC_MSG_RESULT([$DTAPPINTEGRATE])
-
-AC_SUBST(DTAPPINTEGRATE)
-AM_CONDITIONAL(HAVE_DTAPPINTEGRATE, test "x$DTAPPINTEGRATE" != "xno")
-
-dnl *****************
-dnl killall or pkill?
-dnl *****************
-
-AC_MSG_CHECKING(for command to kill processes)
-
-if test `uname -s` = "SunOS" ; then
- KILL_PROCESS_CMD="pkill";
-else
- KILL_PROCESS_CMD="killall";
-fi
-
-KILL_PROCESS_CMD=`which $KILL_PROCESS_CMD`
-if test -z "$KILL_PROCESS_CMD" ; then
- AC_MSG_RESULT(none)
-else
- AC_MSG_RESULT($KILL_PROCESS_CMD)
- AC_DEFINE_UNQUOTED([KILL_PROCESS_CMD], "$KILL_PROCESS_CMD", [Command to kill processes by name])
-fi
-
-dnl ******************************
-dnl OpenSSL
-dnl ******************************
-
-dnl only continue detecting OpenSSL if we haven't already found all of the
-dnl Mozilla libnss includes/libraries and if user actually wants ssl support
-dnl if test "$msg_ssl" = "no" -a "x${enable_openssl}" != "xno"; then
-dnl AC_ARG_WITH(openssl-includes, [ --with-openssl-includes=PREFIX Location of OpenSSL includes.],
-dnl with_openssl_includes="$withval", with_openssl_includes="/usr/include")
-dnl have_openssl_includes="no"
-dnl if test "x${with_openssl_includes}" != "xno"; then
-dnl CPPFLAGS_save="$CPPFLAGS"
-dnl
-dnl AC_MSG_CHECKING(for OpenSSL includes)
-dnl AC_MSG_RESULT("")
-dnl
-dnl CPPFLAGS="$CPPFLAGS -I$with_openssl_includes"
-dnl AC_CHECK_HEADERS(openssl/ssl.h openssl/x509.h, [ openssl_includes="yes" ])
-dnl CPPFLAGS="$CPPFLAGS_save"
-dnl
-dnl if test "x{$openssl_includes}" != "xno" -a "x{$openssl_includes}" != "x"; then
-dnl have_openssl_includes="yes"
-dnl OPENSSL_CFLAGS="-I$with_openssl_includes"
-dnl else
-dnl OPENSSL_CFLAGS=""
-dnl fi
-dnl else
-dnl AC_MSG_CHECKING(for OpenSSL includes)
-dnl AC_MSG_RESULT(no)
-dnl fi
-dnl
-dnl AC_ARG_WITH(openssl-libs, [ --with-openssl-libs=PREFIX Location of OpenSSL libs.],
-dnl with_openssl_libs="$withval")
-dnl if test "x${with_openssl_libs}" != "xno" -a "x${have_openssl_includes}" != "xno"; then
-dnl LDFLAGS_save="$LDFLAGS"
-dnl
-dnl case $with_openssl_libs in
-dnl ""|-L*) ;;
-dnl *) with_openssl_libs="-L$with_openssl_libs" ;;
-dnl esac
-dnl
-dnl AC_CHECK_LIB(dl, dlopen, DL_LDFLAGS="-ldl", DL_LDFLAGS="")
-dnl AC_CACHE_CHECK([for OpenSSL libraries], openssl_libs,
-dnl [
-dnl LDFLAGS="$LDFLAGS $with_openssl_libs -lssl -lcrypto $DL_LDFLAGS"
-dnl AC_TRY_LINK_FUNC(SSL_read, openssl_libs="yes", openssl_libs="no")
-dnl LDFLAGS="$LDFLAGS_save"
-dnl ])
-dnl if test "x${openssl_libs}" != "xno"; then
-dnl AC_DEFINE(HAVE_OPENSSL,1,[Define if you have OpenSSL])
-dnl AC_DEFINE(HAVE_SSL)
-dnl msg_ssl="yes (OpenSSL)"
-dnl OPENSSL_LDFLAGS="$with_openssl_libs -lssl -lcrypto $DL_LDFLAGS"
-dnl else
-dnl OPENSSL_CFLAGS=""
-dnl OPENSSL_LDFLAGS=""
-dnl fi
-dnl else
-dnl AC_MSG_CHECKING(for OpenSSL libraries)
-dnl AC_MSG_RESULT(no)
-dnl fi
-dnl else
-dnl OPENSSL_CFLAGS=""
-dnl OPENSSL_LDFLAGS=""
-dnl
-dnl
-dnl AC_SUBST(OPENSSL_CFLAGS)
-dnl AC_SUBST(OPENSSL_LDFLAGS)
-
-dnl *******************
-dnl GObject marshalling
-dnl *******************
-AM_PATH_GLIB_2_0
-
-dnl We use AC_SUBST_FILE because AC_SUBST won't deal with newlines
-EVO_MARSHAL_RULE=$srcdir/marshal.mk
-AC_SUBST_FILE(EVO_MARSHAL_RULE)
-
-dnl *************************
-dnl CFLAGS and LIBS and stuff
-dnl *************************
-
-GNOME_COMPILE_WARNINGS(yes)
-CFLAGS="$CFLAGS $WARN_CFLAGS"
-case $CFLAGS in
-*-Wall*)
- # Turn off the annoying "comparison between signed and unsigned"
- # warning in gcc 3.3
- CFLAGS="$CFLAGS -Wno-sign-compare"
- ;;
-esac
-
-AM_PATH_ORBIT2(2.9.8)
-
-AC_MSG_CHECKING(for CORBA include paths)
-IDL_INCLUDES="-I "`pkg-config --variable=idldir libbonobo-2.0`" -I "`pkg-config --variable=idldir bonobo-activation-2.0`" -I "`pkg-config --variable=idldir evolution-data-server-1.2`
-AC_MSG_RESULT($IDL_INCLUDES)
-AC_SUBST(IDL_INCLUDES)
-
-dnl Utility macro to set compiler flags for a specific lib.
-AC_DEFUN(EVO_SET_COMPILE_FLAGS, [
- deps="$2"
- extra_cflags="$3"
- extra_libs="$4"
- PKG_CHECK_MODULES(EVOLUTION, $deps)
- $1_CFLAGS="$EVOLUTION_CFLAGS \$(WERROR) $extra_cflags"
- $1_LIBS="$EVOLUTION_LIBS $extra_libs"
-])
-
-dnl enable USE_GTKFILECHOOSER if gtk version is > 2.4.0
-AC_ARG_ENABLE(file-chooser, [ --enable-file-chooser Enable the usage of the GtkFileChooser in place of the GtkFileSelection dialog], enable_file_chooser="$enableval", enable_file_chooser="yes")
-if test "x$enable_file_chooser" = "xyes"; then
- if pkg-config --atleast-version=2.4.0 gtk+-2.0; then
- AC_DEFINE(USE_GTKFILECHOOSER,1,[Use new GtkFileChooser])
- fi
-fi
-
-dnl --- Required version numbers
-
-GAL_REQUIRED=2.3.3
-GAL_PACKAGE=2.4
-GTKHTML_REQUIRED=3.5.4
-GTKHTML_PACKAGE=3.6
-EDS_REQUIRED=1.1.4
-EDS_PACKAGE=1.2
-BONOBOUI_REQUIRED=2.4.2
-
-AC_SUBST(GAL_REQUIRED)
-AC_SUBST(GAL_PACKAGE)
-AC_SUBST(GTKHTML_REQUIRED)
-AC_SUBST(GTKHTML_PACKAGE)
-AC_SUBST(EDS_REQUIRED)
-AC_SUBST(EDS_PACKAGE)
-AC_SUBST(BONOBOUI_REQUIRED)
-
-dnl --- Flags to get all the GNOME stuff
-
-FULL_GNOME_DEPS="glib-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED gnome-vfs-2.0 libgnomeui-2.0 libglade-2.0 libgnomecanvas-2.0 libxml-2.0 gconf-2.0 gal-$GAL_PACKAGE >= $GAL_REQUIRED"
-
-EVO_SET_COMPILE_FLAGS(GNOME_FULL, $FULL_GNOME_DEPS)
-AC_SUBST(GNOME_FULL_CFLAGS)
-AC_SUBST(GNOME_FULL_LIBS)
-
-CPPFLAGS_save="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS `$PKG_CONFIG --cflags-only-I libgnomeui-2.0`"
-AC_CHECK_HEADERS(libgnomeui/gnome-icon-lookup.h)
-AC_CHECK_HEADERS(libgnomeui/gnome-thumbnail.h)
-CPPFLAGS="$CPPFLAGS_save"
-
-dnl --- Flags for the various libraries we build
-
-EVO_SET_COMPILE_FLAGS(CAMEL, camel-provider-$EDS_PACKAGE)
-AC_SUBST(CAMEL_CFLAGS)
-AC_SUBST(CAMEL_LIBS)
-
-EVO_SET_COMPILE_FLAGS(CAMEL_GROUPWISE, camel-provider-$EDS_PACKAGE libedataserver-$EDS_PACKAGE libegroupwise-$EDS_PACKAGE >= $EDS_REQUIRED)
-AC_SUBST(CAMEL_GROUPWISE_CFLAGS)
-AC_SUBST(CAMEL_GROUPWISE_LIBS)
-
-if test "x$mozilla_nss" != "x"; then
- EVO_SET_COMPILE_FLAGS(MOZILLA_NSS, $mozilla_nss)
- MOZILLA_L_DIR=`pkg-config --libs-only-L $mozilla_nss`
-else
- if test "x$MOZILLA_MANUAL_LIBS" != "x"; then
- MOZILLA_L_DIR="-L$with_nss_lib"
- fi
-fi
-
-EVO_SET_COMPILE_FLAGS(CERT_UI, glib-2.0 gobject-2.0 gthread-2.0,
- $MANUAL_NSS_CFLAGS $MOZILLA_NSS_CFLAGS,
- $MOZILLA_L_DIR $MANUAL_NSS_LIBS $MOZILLA_NSS_LIBS)
-AC_SUBST(CERT_UI_CFLAGS)
-AC_SUBST(CERT_UI_LIBS)
-
-EVO_SET_COMPILE_FLAGS(E_NAME, libgnomeui-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED gal-$GAL_PACKAGE >= $GAL_REQUIRED)
-AC_SUBST(E_NAME_CFLAGS)
-AC_SUBST(E_NAME_LIBS)
-
-EVO_SET_COMPILE_FLAGS(E_UTIL, gthread-2.0 gconf-2.0 libxml-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 gal-$GAL_PACKAGE >= $GAL_REQUIRED libgnomeui-2.0 libgnome-2.0 libgnomecanvas-2.0 libgnomeprintui-2.2 libedataserver-$EDS_PACKAGE libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED $mozilla_nspr $mono_package, $THREADS_CFLAGS $MANUAL_NSPR_CFLAGS, $THREADS_LIBS $MANUAL_NSPR_LIBS)
-AC_SUBST(E_UTIL_CFLAGS)
-AC_SUBST(E_UTIL_LIBS)
-
-EVO_SET_COMPILE_FLAGS(TZDIALOG, libecal-$EDS_PACKAGE >= $EDS_REQUIRED, $GNOME_FULL_CFLAGS, $GNOME_FULL_LIBS)
-AC_SUBST(TZDIALOG_CFLAGS)
-AC_SUBST(TZDIALOG_LIBS)
-
-EVO_SET_COMPILE_FLAGS(E_WIDGETS, glib-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED gnome-vfs-2.0 libgnomeui-2.0 libglade-2.0 libgnomecanvas-2.0 libxml-2.0 gconf-2.0 gal-$GAL_PACKAGE >= $GAL_REQUIRED libedataserverui-$EDS_PACKAGE)
-AC_SUBST(E_WIDGETS_CFLAGS)
-AC_SUBST(E_WIDGETS_LIBS)
-
-EVO_SET_COMPILE_FLAGS(IMPORTERS, camel-$EDS_PACKAGE gconf-2.0 libglade-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED libgnomeui-2.0 libebook-$EDS_PACKAGE >= $EDS_REQUIRED)
-AC_SUBST(IMPORTERS_CFLAGS)
-AC_SUBST(IMPORTERS_LIBS)
-
-EVO_SET_COMPILE_FLAGS(LIBFILTER, libgnome-2.0 libgnomeui-2.0 libglade-2.0 libxml-2.0 gconf-2.0 gal-$GAL_PACKAGE >= $GAL_REQUIRED libedataserver-$EDS_PACKAGE >= $EDS_REQUIRED)
-AC_SUBST(LIBFILTER_CFLAGS)
-AC_SUBST(LIBFILTER_LIBS)
-
-dnl --- evolution (shell) flags
-
-EVO_SET_COMPILE_FLAGS(SHELL, libgnome-2.0 libgnomeui-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED gal-$GAL_PACKAGE >= $GAL_REQUIRED libglade-2.0 gnome-vfs-2.0 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED)
-AC_SUBST(SHELL_CFLAGS)
-AC_SUBST(SHELL_LIBS)
-
-dnl --- evolution-addressbook flags
-
-EVOLUTION_ADDRESSBOOK_DEPS="gconf-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 gal-$GAL_PACKAGE >= $GAL_REQUIRED libgnomeui-2.0 libgnome-2.0 libgnomecanvas-2.0 gnome-vfs-2.0 libgnomeprintui-2.2 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED libebook-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED camel-$EDS_PACKAGE"
-
-EVO_SET_COMPILE_FLAGS(EVOLUTION_ADDRESSBOOK, $EVOLUTION_ADDRESSBOOK_DEPS)
-AC_SUBST(EVOLUTION_ADDRESSBOOK_CFLAGS)
-AC_SUBST(EVOLUTION_ADDRESSBOOK_LIBS)
-
-if test x$enable_pilot_conduits = xyes; then
-EVO_SET_COMPILE_FLAGS(EVOLUTION_ADDRESSBOOK_CONDUIT, gnome-pilot-2.0 $EVOLUTION_ADDRESSBOOK_DEPS)
-AC_SUBST(EVOLUTION_ADDRESSBOOK_CONDUIT_CFLAGS)
-AC_SUBST(EVOLUTION_ADDRESSBOOK_CONDUIT_LIBS)
-fi
-
-dnl --- evolution-calendar flags
-EVO_SET_COMPILE_FLAGS(LIBSOUP, libsoup-2.2 >= 2.2.0)
-AC_SUBST(LIBSOUP_CFLAGS)
-AC_SUBST(LIBSOUP_LIBS)
-
-EVO_SET_COMPILE_FLAGS(EVOLUTION_CALENDAR, libgnome-2.0 libgnomeui-2.0 libbonoboui-2.0 gal-$GAL_PACKAGE >= $GAL_REQUIRED libglade-2.0 gnome-vfs-2.0 libgnomeprint-2.2 libgnomeprintui-2.2 gnome-vfs-module-2.0 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED libebook-$EDS_PACKAGE >= $EDS_REQUIRED libecal-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED)
-AC_SUBST(EVOLUTION_CALENDAR_CFLAGS)
-AC_SUBST(EVOLUTION_CALENDAR_LIBS)
-
-if test x$enable_pilot_conduits = xyes; then
-EVO_SET_COMPILE_FLAGS(EVOLUTION_CALENDAR_CONDUIT, gnome-pilot-2.0, $EVOLUTION_CALENDAR_CFLAGS, $EVOLUTION_CALENDAR_LIBS)
-AC_SUBST(EVOLUTION_CALENDAR_CONDUIT_CFLAGS)
-AC_SUBST(EVOLUTION_CALENDAR_CONDUIT_LIBS)
-fi
-
-dnl --- evolution-mail flags
-
-EVO_SET_COMPILE_FLAGS(EVOLUTION_MAIL, camel-provider-$EDS_PACKAGE libgnome-2.0 libgnomeui-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED gal-$GAL_PACKAGE >= $GAL_REQUIRED libglade-2.0 gnome-vfs-module-2.0 libgnomeprint-2.2 libgnomeprintui-2.2 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED libxml-2.0 bonobo-activation-2.0 gthread-2.0 gconf-2.0 $mozilla_nss libebook-$EDS_PACKAGE >= $EDS_REQUIRED)
-AC_SUBST(EVOLUTION_MAIL_CFLAGS)
-AC_SUBST(EVOLUTION_MAIL_LIBS)
-
-dnl -- evolution-data-server IDL and version
-
-AC_DEFINE(DATASERVER_API_VERSION, "1.2", evolution-data-server API version)
-AC_DEFINE_UNQUOTED(DATASERVER_VERSION, "`pkg-config --modversion evolution-data-server-1.2`", evolution-data-server version)
-
-AC_MSG_CHECKING(for evolution-data-server IDL)
-DATASERVER_IDL=`pkg-config --variable=idldir evolution-data-server-1.2`/Evolution-DataServer.idl
-if test -f "$DATASERVER_IDL"; then
- AC_MSG_RESULT($DATASERVER_IDL)
- AC_SUBST(DATASERVER_IDL)
-else
- AC_MSG_ERROR(no)
-fi
-
-dnl --- evolution-test flags
-
-EVO_SET_COMPILE_FLAGS(EVOLUTION_TEST, libgnome-2.0 libgnomeui-2.0 libbonobo-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED)
-AC_SUBST(EVOLUTION_TEST_CFLAGS)
-AC_SUBST(EVOLUTION_TEST_LIBS)
-
-dnl *******************
-dnl Special directories
-dnl *******************
-
-dnl --- If you add something here, consider whether or not you also
-dnl --- need to add it to one or more .pc.in files (for Connector,
-dnl --- etc)
-
-privlibdir='${libdir}'/evolution/$BASE_VERSION
-AC_SUBST(privlibdir)
-
-privlibexecdir='${libexecdir}'/evolution/$BASE_VERSION
-AC_SUBST(privlibexecdir)
-
-privdatadir='${datadir}'/evolution/$BASE_VERSION
-AC_SUBST(privdatadir)
-
-privincludedir='${includedir}'/evolution-$BASE_VERSION
-AC_SUBST(privincludedir)
-
-componentdir="$privlibdir/components"
-AC_SUBST(componentdir)
-
-idldir="$datadir/idl/evolution-$BASE_VERSION"
-AC_SUBST(idldir)
-
-serverdir="$libdir/bonobo/servers"
-AC_SUBST(serverdir)
-
-evolutionuidir="$privdatadir/ui"
-AC_SUBST(evolutionuidir)
-
-evolutionhelpdir="$privdatadir/help"
-AC_SUBST(evolutionhelpdir)
-
-imagesdir="$privdatadir/images"
-AC_SUBST(imagesdir)
-
-images16dir="$privdatadir/images/16x16"
-AC_SUBST(images16dir)
-
-dnl images18dir="$privdatadir/images/18x18"
-dnl AC_SUBST(images18dir)
-
-dnl images20dir="$privdatadir/images/20x20"
-dnl AC_SUBST(images20dir)
-
-dnl images24dir="$privdatadir/images/24x24"
-dnl AC_SUBST(images24dir)
-
-dnl images32dir="$privdatadir/images/32x32"
-dnl AC_SUBST(images32dir)
-
-images48dir="$privdatadir/images/48x48"
-AC_SUBST(images48dir)
-
-soundsdir="$privdatadir/sounds"
-AC_SUBST(soundsdir)
-
-gladedir="$privdatadir/glade"
-AC_SUBST(gladedir)
-
-etspecdir="$privdatadir/etspec"
-AC_SUBST(etspecdir)
-
-viewsdir="$privdatadir/views"
-AC_SUBST(viewsdir)
-
-privconduitdir='${libdir}'/evolution/$BASE_VERSION/conduits
-AC_SUBST(privconduitdir)
-
-dnl ************************
-dnl IDL/Component Versioning
-dnl ************************
-
-INTERFACE_VERSION="$BASE_VERSION"
-AC_SUBST(INTERFACE_VERSION)
-AC_DEFINE_UNQUOTED(INTERFACE_VERSION, "$INTERFACE_VERSION", [IDL interface version (Major.Minor)])
-
-EVO_SERVER_RULE=$srcdir/server.mk
-AC_SUBST_FILE(EVO_SERVER_RULE)
-
-dnl ************************
-dnl Plugins
-dnl ************************
-
-plugindir="$privlibdir/plugins"
-AC_SUBST(plugindir)
-
-EVO_PLUGIN_RULE=$srcdir/plugin.mk
-AC_SUBST_FILE(EVO_PLUGIN_RULE)
-
-AC_ARG_ENABLE(plugins, [ --enable-plugins=[no/all/list] Enable plugins.],enable_plugins="$enableval",enable_plugins=base)
-
-dnl Add any new plugins here
-plugins_base="calendar-file calendar-http calendar-weather groupwise-account-setup itip-formatter plugin-manager send-options shared-folder groupwise-send-options exchange-account-setup groupwise-status-tracking default-source addressbook-file addressbook-groupwise"
-
-plugins_all="bbdb subject-thread save-attachments prefer-plain save-calendar select-one-source copy-tool mail-to-meeting mail-to-task folder-unsubscribe mark-calendar-offline audio-inline mailing-list-actions backup-restore new-mail-notify"
-
-case x"$enable_plugins" in
-xno)
- plugins_enabled=""
- msg_plugins="no (some core functionality will not be available)"
- ;;
-xall | x | xyes)
- plugins_enabled="$plugins_base $plugins_all"
- msg_plugins="yes (all)"
- ;;
-xbase)
- plugins_enabled="$plugins_base"
- msg_plugins="yes ($plugins_base)"
- ;;
-*)
- plugins_enabled="$enable_plugins"
- msg_plugins="yes ($enable_plugins)"
- ;;
-esac
-AC_SUBST(plugins_enabled)
-AC_SUBST(plugins_all)
-AC_SUBST(plugins_base)
-
-if echo ${plugins_enabled} | grep -q "audio-inline"
-then
- if ${PKG_CONFIG} --exists gstreamer-0.8
- then
- dnl *********************
- dnl gstreamer
- dnl *********************
- PKG_CHECK_MODULES(GSTREAMER, gstreamer-0.8)
- AC_SUBST(GSTREAMER_CFLAGS)
- AC_SUBST(GSTREAMER_LIBS)
- else
- plugins_enabled=`echo $plugins_enabled | sed -e "s/audio-inline//g"`
- echo "warning: gstreamer was not found, audio-inline plugin will not be built."
- echo "you are probably missing gstreamer-devel package."
- fi
-fi
-
-if echo ${plugins_enabled} | grep -q "new-mail-notify" ; then
- if ${PKG_CONFIG} --exists dbus-glib-1 ; then
- dnl **************************************************
- dnl * New Mail Notify plugin
- dnl **************************************************
- PKG_CHECK_MODULES(NMN, dbus-glib-1)
- AC_SUBST(NMN_CFLAGS)
- AC_SUBST(NMN_LIBS)
- else
- plugins_enabled=`echo $plugins_enabled | sed -e "s/new-mail-notify//g"`
- echo "warning: dbus-glib-1 was not found, new-mail-notify plugin will not be built."
- fi
-fi
-
-##################################################
-# Check for gtk-doc.
-##################################################
-
-AC_ARG_WITH(html-dir, [ --with-html-dir=PATH path to installed docs ])
-
-if test "x$with_html_dir" = "x" ; then
- HTML_DIR='${datadir}/gnome/html'
-else
- HTML_DIR=$with_html_dir
-fi
-
-AC_SUBST(HTML_DIR)
-
-AC_CHECK_PROG(GTKDOC, gtkdoc-mkdb, true, false)
-
-gtk_doc_min_version=0.6
-if $GTKDOC ; then
- gtk_doc_version=`gtkdoc-mkdb --version`
- AC_MSG_CHECKING([gtk-doc version ($gtk_doc_version) >= $gtk_doc_min_version])
- if perl <<EOF ; then
- exit (("$gtk_doc_version" =~ /^[[0-9]]+\.[[0-9]]+$/) &&
- ("$gtk_doc_version" >= "$gtk_doc_min_version") ? 0 : 1);
-EOF
- AC_MSG_RESULT(yes)
- else
- AC_MSG_RESULT(no)
- GTKDOC=false
- fi
-fi
-
-dnl Let people disable the gtk-doc stuff.
-AC_ARG_ENABLE(gtk-doc, [ --enable-gtk-doc Use gtk-doc to build documentation [default=auto]], enable_gtk_doc="$enableval", enable_gtk_doc=auto)
-
-if test x$enable_gtk_doc = xauto ; then
- if test x$GTKDOC = xtrue ; then
- enable_gtk_doc=yes
- else
- enable_gtk_doc=no
- fi
-fi
-
-AM_CONDITIONAL(ENABLE_GTK_DOC, test x$enable_gtk_doc = xyes)
-
-dnl ***********
-dnl GConf stuff
-dnl ***********
-AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
-AM_GCONF_SOURCE_2
-
-dnl ******************
-dnl Sub-version number
-dnl ******************
-AC_ARG_WITH(sub-version, [ --with-sub-version=VERSION Specify a sub-version string])
-AC_DEFINE_UNQUOTED(SUB_VERSION, "$with_sub_version", [Version substring, for packagers])
-
-AC_ARG_ENABLE(default-binary, [ --disable-default-binary Do not install as the default "evolution" binary ], , enable_default_binary=no)
-AM_CONDITIONAL(DEFAULT_BINARY, test x$enable_default_binary = xyes)
-
-
-dnl ********************
-dnl KDE applnk directory
-dnl ********************
-AC_ARG_WITH(kde-applnk-path, [ --with-kde-applnk-path=PATH Location of KDE applnk files],
- [with_kde_applnk_path="$withval"],
- [with_kde_applnk_path="no"])
-if test x"$with_kde_applnk_path" != x"no"; then
- if test -z "$with_kde_applnk_path"; then
- with_kde_applnk_path="$datadir/applnk"
- fi
- KDE_APPLNK_DIR="$with_kde_applnk_path"
-else
- KDE_APPLNK_DIR=""
-fi
-AM_CONDITIONAL(HAVE_KDE_APPLNK, test x"$KDE_APPLNK_DIR" != x)
-AC_SUBST(KDE_APPLNK_DIR)
-
-dnl ******************************
-dnl Makefiles
-dnl ******************************
-
-export privlibdir
-export privincludedir
-export privdatadir
-export plugindir
-
-EVOLUTION_DIR=`(cd $srcdir; pwd)`
-AC_SUBST(EVOLUTION_DIR)
-
-AC_OUTPUT([ po/Makefile.in
-Makefile
-a11y/Makefile
-a11y/addressbook/Makefile
-a11y/calendar/Makefile
-a11y/widgets/Makefile
-addressbook/Makefile
-addressbook/conduit/Makefile
-addressbook/gui/Makefile
-addressbook/gui/component/Makefile
-addressbook/gui/contact-editor/Makefile
-addressbook/gui/contact-list-editor/Makefile
-addressbook/gui/merging/Makefile
-addressbook/gui/search/Makefile
-addressbook/gui/widgets/Makefile
-addressbook/importers/Makefile
-addressbook/printing/Makefile
-addressbook/tools/Makefile
-addressbook/util/Makefile
-art/Makefile
-data/Makefile
-data/cde_app_root/Makefile
-data/cde_app_root/dt/Makefile
-data/cde_app_root/dt/appconfig/Makefile
-data/cde_app_root/dt/appconfig/appmanager/Makefile
-data/cde_app_root/dt/appconfig/appmanager/C/Makefile
-data/cde_app_root/dt/appconfig/appmanager/C/Ximian/Makefile
-data/cde_app_root/dt/appconfig/icons/Makefile
-data/cde_app_root/dt/appconfig/icons/C/Makefile
-data/cde_app_root/dt/appconfig/types/Makefile
-data/cde_app_root/dt/appconfig/types/C/Makefile
-data/cde_app_root/dt/appconfig/types/C/Ximian.dt
-e-util/Makefile
-filter/Makefile
-help/Makefile
-help/C/Makefile
-help/quickref/Makefile
-help/quickref/C/Makefile
-shell/Makefile
-shell/evolution-nognome
-shell/importer/Makefile
-ui/Makefile
-views/Makefile
-views/addressbook/Makefile
-views/calendar/Makefile
-views/mail/Makefile
-views/tasks/Makefile
-widgets/Makefile
-widgets/e-timezone-dialog/Makefile
-widgets/menus/Makefile
-widgets/misc/Makefile
-calendar/Makefile
-calendar/importers/Makefile
-calendar/common/Makefile
-calendar/idl/Makefile
-calendar/conduits/Makefile
-calendar/conduits/todo/Makefile
-calendar/conduits/calendar/Makefile
-calendar/gui/Makefile
-calendar/gui/alarm-notify/Makefile
-calendar/gui/dialogs/Makefile
-composer/Makefile
-mail/Makefile
-mail/default/Makefile
-mail/default/C/Makefile
-mail/default/zh_CN/Makefile
-mail/default/ja/Makefile
-mail/default/nl/Makefile
-mail/default/pt/Makefile
-mail/importers/Makefile
-plugins/Makefile
-plugins/send-options/Makefile
-plugins/calendar-file/Makefile
-plugins/calendar-http/Makefile
-plugins/calendar-weather/Makefile
-plugins/plugin-manager/Makefile
-plugins/bbdb/Makefile
-plugins/audio-inline/Makefile
-plugins/mail-to-meeting/Makefile
-plugins/mail-to-task/Makefile
-plugins/new-mail-notify/Makefile
-plugins/subject-thread/Makefile
-plugins/save-attachments/Makefile
-plugins/save-calendar/Makefile
-plugins/select-one-source/Makefile
-plugins/mark-calendar-offline/Makefile
-plugins/prefer-plain/Makefile
-plugins/copy-tool/Makefile
-plugins/folder-unsubscribe/Makefile
-plugins/mailing-list-actions/Makefile
-plugins/itip-formatter/Makefile
-plugins/groupwise-account-setup/Makefile
-plugins/backup-restore/Makefile
-plugins/shared-folder/Makefile
-plugins/groupwise-send-options/Makefile
-plugins/exchange-account-setup/Makefile
-plugins/groupwise-status-tracking/Makefile
-plugins/default-source/Makefile
-plugins/addressbook-file/Makefile
-plugins/addressbook-groupwise/Makefile
-smime/Makefile
-smime/lib/Makefile
-smime/gui/Makefile
-tools/Makefile
-evolution-shell.pc
-evolution-plugin.pc
-])
-
-if test "x$with_sub_version" != "x"; then
-echo "
- Evolution ($with_sub_version) has been configured as follows: "
-else
-echo "
- Evolution has been configured as follows: "
-fi
-
-echo "
- Mail Directory: $system_mail_dir, $system_mail_perm
- LDAP support: $msg_ldap"
-if test "$msg_nntp" = "yes"; then
-echo "\
- NNTP support: $msg_nntp"
-fi
-echo "\
- Pilot conduits: $msg_pilot
- Kerberos 4/5: $msg_krb4/$msg_krb5
- SSL support: $msg_ssl
- SMIME support: $msg_smime
- IPv6 support: $msg_ipv6
- Dot Locking: $msg_dot
- File Locking: $msg_file
- Plugins: $msg_plugins
- Gtk-doc: $enable_gtk_doc"
-
-if test x$enable_gtk_doc = xyes; then
-echo "
- Programming documentation files will be built automatically.
-"
-else
-echo "
- Programming documentation files will not be built.
- You may want to install the gtk-doc package
- so that you will get the Evolution Developer's Guide.
-"
-fi
diff --git a/data/.cvsignore b/data/.cvsignore
deleted file mode 100644
index 5f6365598d..0000000000
--- a/data/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Makefile
-Makefile.in
-evolution.keys
-evolution.desktop
diff --git a/data/Makefile.am b/data/Makefile.am
deleted file mode 100644
index 9dcb5ceb62..0000000000
--- a/data/Makefile.am
+++ /dev/null
@@ -1,79 +0,0 @@
-desktopdir = $(datadir)/applications
-desktop_in_in_file = evolution.desktop.in.in
-desktop_file = $(desktop_in_in_file:.desktop.in.in=.desktop)
-%.desktop.in: %.desktop.in.in
- sed -e "s|\@BASE_VERSION\@|$(BASE_VERSION)|" $< > $@
-
-@INTLTOOL_DESKTOP_RULE@
-
-keysdir = $(datadir)/mime-info
-keys_in_file = evolution.keys.in.in
-keys_file = $(keys_in_file:.keys.in.in=.keys)
-%.keys.in: %.keys.in.in
- sed -e "s|\@BASE_VERSION\@|$(BASE_VERSION)|" $< > $@
-
-@INTLTOOL_KEYS_RULE@
-
-mimedir = $(datadir)/mime-info
-mime_file = evolution.mime
-
-if HAVE_KDE_APPLNK
-
-kdedesktopdir = $(KDE_APPLNK_DIR)/Applications
-kdedesktop_file = $(desktop_in_in_file:.desktop.in.in=.desktop)
-
-install-kde-applnk:
- $(mkinstalldirs) $(DESTDIR)$(kdedesktopdir); \
- $(INSTALL_DATA) $(kdedesktop_file) \
- $(DESTDIR)$(kdedesktopdir)/$(kdedesktop_file:.desktop=-$(BASE_VERSION).desktop)
-
-uninstall-kde-applnk:
- rm -rf $(DESTDIR)$(kdedesktopdir)/$(kdedesktop_file:.desktop=-$(BASE_VERSION).desktop)
-
-else
-
-install-kde-applnk:
-uninstall-kde-applnk:
-
-endif
-
-noinst_MANS = evolution.1
-noinst_DATA = $(keys_file) $(desktop_file)
-
-SUBDIRS = cde_app_root
-
-install-data-local: install-kde-applnk $(desktop_file) $(keys_file) $(mime_file)
- $(mkinstalldirs) $(DESTDIR)$(desktopdir); \
- $(INSTALL_DATA) $(desktop_file) \
- $(DESTDIR)$(desktopdir)/$(desktop_file:.desktop=-$(BASE_VERSION).desktop) ; \
- $(mkinstalldirs) $(DESTDIR)$(keysdir); \
- $(INSTALL_DATA) $(keys_file) $(DESTDIR)$(keysdir)/$(keys_file:.keys=-$(BASE_VERSION).keys) ; \
- $(mkinstalldirs) $(DESTDIR)$(mimedir); \
- $(INSTALL_DATA) $(srcdir)/$(mime_file) $(DESTDIR)$(mimedir)/$(mime_file:.mime=-$(BASE_VERSION).mime) ;
-
-uninstall-local: uninstall-kde-applnk
- rm -rf $(DESTDIR)$(desktopdir)/$(desktop_file:.desktop=-$(BASE_VERSION).desktop) ; \
- rm -rf $(DESTDIR)$(keysdir)/$(keys_file:.keys=-$(BASE_VERSION).keys) ; \
- rm -rf $(DESTDIR)$(mimedir)/$(mime_file:.mime=-$(BASE_VERSION).mime) ;
-
-# CDE Stuff
-
-if HAVE_DTAPPINTEGRATE
-
-# This installs Evolution into the Application Manager on CDE
-dtappintegrate:
- $(DTAPPINTEGRATE) -s $(privdatadir)/cde_app_root
-
-# ...And this uninstalls it
-dtappunintegrate:
- $(DTAPPINTEGRATE) -u -s $(privdatadir)/cde_app_root
-
-endif
-
-EXTRA_DIST = \
- $(desktop_in_in_file) \
- $(mime_file) \
- $(keys_file) \
- $(keys_in_file) \
- $(noinst_MANS)
-
diff --git a/data/cde_app_root/.cvsignore b/data/cde_app_root/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/data/cde_app_root/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/data/cde_app_root/Makefile.am b/data/cde_app_root/Makefile.am
deleted file mode 100644
index 56b759c9eb..0000000000
--- a/data/cde_app_root/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-SUBDIRS = dt \ No newline at end of file
diff --git a/data/cde_app_root/dt/.cvsignore b/data/cde_app_root/dt/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/data/cde_app_root/dt/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/data/cde_app_root/dt/Makefile.am b/data/cde_app_root/dt/Makefile.am
deleted file mode 100644
index 8c9d98022f..0000000000
--- a/data/cde_app_root/dt/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-SUBDIRS = appconfig \ No newline at end of file
diff --git a/data/cde_app_root/dt/appconfig/.cvsignore b/data/cde_app_root/dt/appconfig/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/data/cde_app_root/dt/appconfig/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/data/cde_app_root/dt/appconfig/Makefile.am b/data/cde_app_root/dt/appconfig/Makefile.am
deleted file mode 100644
index 3bc34b8d0b..0000000000
--- a/data/cde_app_root/dt/appconfig/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-SUBDIRS = appmanager icons types \ No newline at end of file
diff --git a/data/cde_app_root/dt/appconfig/appmanager/.cvsignore b/data/cde_app_root/dt/appconfig/appmanager/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/data/cde_app_root/dt/appconfig/appmanager/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/data/cde_app_root/dt/appconfig/appmanager/C/.cvsignore b/data/cde_app_root/dt/appconfig/appmanager/C/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/data/cde_app_root/dt/appconfig/appmanager/C/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/data/cde_app_root/dt/appconfig/appmanager/C/Makefile.am b/data/cde_app_root/dt/appconfig/appmanager/C/Makefile.am
deleted file mode 100644
index ea9b837cf0..0000000000
--- a/data/cde_app_root/dt/appconfig/appmanager/C/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-SUBDIRS = Ximian \ No newline at end of file
diff --git a/data/cde_app_root/dt/appconfig/appmanager/C/Ximian/.cvsignore b/data/cde_app_root/dt/appconfig/appmanager/C/Ximian/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/data/cde_app_root/dt/appconfig/appmanager/C/Ximian/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/data/cde_app_root/dt/appconfig/appmanager/C/Ximian/Evolution b/data/cde_app_root/dt/appconfig/appmanager/C/Ximian/Evolution
deleted file mode 100755
index cad83932e6..0000000000
--- a/data/cde_app_root/dt/appconfig/appmanager/C/Ximian/Evolution
+++ /dev/null
@@ -1,17 +0,0 @@
-################################################
-#
-# action
-#
-# Common Desktop Environment (CDE)
-#
-# $Revision: 1.2 $
-#
-################################################
-
-# This file represents a CDE Dt action. The contents of the file do
-# not matter; however, the file must have executable permission and the
-# name of the file must match an entry in the action database (*.dt files).
-#
-# For more information on Dt actions, see the CDE Dt manuals.
-
-echo "Common Desktop Environment Dt action"
diff --git a/data/cde_app_root/dt/appconfig/appmanager/C/Ximian/Makefile.am b/data/cde_app_root/dt/appconfig/appmanager/C/Ximian/Makefile.am
deleted file mode 100644
index 0d3ff391ec..0000000000
--- a/data/cde_app_root/dt/appconfig/appmanager/C/Ximian/Makefile.am
+++ /dev/null
@@ -1,6 +0,0 @@
-EXTRA_DIST = Evolution
-
-if HAVE_DTAPPINTEGRATE
-cdeappmanagerdir = $(privdatadir)/cde_app_root/dt/appconfig/appmanager/C/Ximian
-cdeappmanager_SCRIPTS = Evolution
-endif
diff --git a/data/cde_app_root/dt/appconfig/appmanager/Makefile.am b/data/cde_app_root/dt/appconfig/appmanager/Makefile.am
deleted file mode 100644
index 9f660cf34e..0000000000
--- a/data/cde_app_root/dt/appconfig/appmanager/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-SUBDIRS = C \ No newline at end of file
diff --git a/data/cde_app_root/dt/appconfig/icons/.cvsignore b/data/cde_app_root/dt/appconfig/icons/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/data/cde_app_root/dt/appconfig/icons/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/data/cde_app_root/dt/appconfig/icons/C/.cvsignore b/data/cde_app_root/dt/appconfig/icons/C/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/data/cde_app_root/dt/appconfig/icons/C/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/data/cde_app_root/dt/appconfig/icons/C/Evolution.l.pm b/data/cde_app_root/dt/appconfig/icons/C/Evolution.l.pm
deleted file mode 100644
index 907f0ad825..0000000000
--- a/data/cde_app_root/dt/appconfig/icons/C/Evolution.l.pm
+++ /dev/null
@@ -1,307 +0,0 @@
-/* XPM */
-static char * evo_cde_48_xpm[] = {
-"48 48 256 2",
-" c None",
-". c #020202",
-"+ c #3C2E06",
-"@ c #6E6E6E",
-"# c #AA8616",
-"$ c #AA8E2A",
-"% c #BA9E32",
-"& c #BAA65E",
-"* c #C6AE4A",
-"= c #AEAEAE",
-"- c #AE5A0A",
-"; c #D6C26E",
-"> c #DAC276",
-", c #7E7E7E",
-"' c #FEFEF6",
-") c #864E0A",
-"! c #8A6E0E",
-"~ c #EAB216",
-"{ c #2E1A02",
-"] c #6A5A1A",
-"^ c #C2C2C2",
-"/ c #FCDE8A",
-"( c #6A3606",
-"_ c #9E720E",
-": c #2A1E02",
-"< c #664A0A",
-"[ c #E6DA9E",
-"} c #D2A612",
-"| c #BA9A32",
-"1 c #DEDEDE",
-"2 c #A26E0E",
-"3 c #121212",
-"4 c #3E320A",
-"5 c #FEEEC2",
-"6 c #CEA212",
-"7 c #B26E0E",
-"8 c #5A5A5A",
-"9 c #C6A632",
-"0 c #AE820E",
-"a c #0B0602",
-"b c #D8BA46",
-"c c #3E3A22",
-"d c #FAE69E",
-"e c #FAE6A2",
-"f c #82560A",
-"g c #8A8A8A",
-"h c #5A4A0E",
-"i c #CABA7E",
-"j c #E6BA1E",
-"k c #8A7E4A",
-"l c #FCF2CA",
-"m c #FEE6AA",
-"n c #BE8E12",
-"o c #462606",
-"p c #E6C646",
-"q c #CA9212",
-"r c #5E4E16",
-"s c #4E3206",
-"t c #EEBA16",
-"u c #BAAA6E",
-"v c #F6C626",
-"w c #70500A",
-"x c #EEEEEE",
-"y c #2E260C",
-"z c #DACA82",
-"A c #AA9A5E",
-"B c #8E5A0A",
-"C c #FEEAB6",
-"D c #BE6A0E",
-"E c #663E0A",
-"F c #5A5226",
-"G c #BE6E0E",
-"H c #B6B6B6",
-"I c #FEF2CE",
-"J c #C27A0E",
-"K c #E6D272",
-"L c #DED6BA",
-"M c #8A8252",
-"N c #3E320E",
-"O c #B6720E",
-"P c #E6CA58",
-"Q c #E6D682",
-"R c #1A1202",
-"S c #1E1E16",
-"T c #9E9E9E",
-"U c #0E0A02",
-"V c #969696",
-"W c #88640C",
-"X c #F6F6F6",
-"Y c #C2720E",
-"Z c #2E2E2E",
-"` c #E3A614",
-" . c #E2E2E2",
-".. c #8E7A3E",
-"+. c #7A620B",
-"@. c #C67A0E",
-"#. c #AE5E0A",
-"$. c #362606",
-"%. c #D18612",
-"&. c #F2BE16",
-"*. c #3E3612",
-"=. c #828281",
-"-. c #C6C6C6",
-";. c #F6CA2A",
-">. c #6A420A",
-",. c #E6E6E6",
-"'. c #4E4E4E",
-"). c #7A6212",
-"!. c #8E6A0E",
-"~. c #3A3A3A",
-"{. c #0A0A0A",
-"]. c #F6C61B",
-"^. c #CE8212",
-"/. c #FAD258",
-"(. c #CE9212",
-"_. c #D2A212",
-":. c #C68E12",
-"<. c #5E3206",
-"[. c #261602",
-"}. c #F6CE42",
-"|. c #DA9612",
-"1. c #2E2204",
-"2. c #4E4626",
-"3. c #6A6A6A",
-"4. c #965A0A",
-"5. c #E6AE16",
-"6. c #F6DA66",
-"7. c #AAAAAA",
-"8. c #D2D2D0",
-"9. c #1A0E02",
-"0. c #964E0A",
-"a. c #FADA80",
-"b. c #F7D660",
-"c. c #F6D252",
-"d. c #F6CA2E",
-"e. c #262626",
-"f. c #D28A12",
-"g. c #92620E",
-"h. c #464646",
-"i. c #BA660E",
-"j. c #FEFAEA",
-"k. c #BE760E",
-"l. c #767676",
-"m. c #523606",
-"n. c #CECECC",
-"o. c #0E0E06",
-"p. c #BABABA",
-"q. c #7E420A",
-"r. c #DE9E12",
-"s. c #F7CE3B",
-"t. c #B6961A",
-"u. c #A6760E",
-"v. c #F2C216",
-"w. c #603C06",
-"x. c #8A8E8E",
-"y. c #D6D6D2",
-"z. c #3E2606",
-"A. c #CA7E12",
-"B. c #7A6A28",
-"C. c #BA620E",
-"D. c #4E3E06",
-"E. c #F2F2F2",
-"F. c #0E0E0A",
-"G. c #A2620E",
-"H. c #F6E280",
-"I. c #CE8E12",
-"J. c #1E1A06",
-"K. c #C6760E",
-"L. c #BEBEBE",
-"M. c #D68E12",
-"N. c #D29212",
-"O. c #6A3A06",
-"P. c #825E0A",
-"Q. c #FAD672",
-"R. c #F6D24B",
-"S. c #522A06",
-"T. c #9A8232",
-"U. c #FCE49A",
-"V. c #323232",
-"W. c #8E520A",
-"X. c #EDB616",
-"Y. c #D69A12",
-"Z. c #F6DA6D",
-"`. c #E1A212",
-" + c #F6D246",
-".+ c #362206",
-"++ c #F6CE35",
-"@+ c #0E0E02",
-"#+ c #E6AA16",
-"$+ c #321E05",
-"%+ c #9E5A0A",
-"&+ c #8E8E8E",
-"*+ c #AE760E",
-"=+ c #6A5612",
-"-+ c #866A0E",
-";+ c #EAEAE2",
-">+ c #563E06",
-",+ c #764A0A",
-"'+ c #B89A2A",
-")+ c #221202",
-"!+ c #1E1E1E",
-"~+ c #DD9A12",
-"{+ c #F6D659",
-"]+ c #F6C216",
-"^+ c #F6DE72",
-"/+ c #D69212",
-"(+ c #5E5E5E",
-"_+ c #8A4A0A",
-":+ c #8A560A",
-"<+ c #C26E0E",
-"[+ c #F6C622",
-"}+ c #F6CA26",
-"|+ c #9A620E",
-"1+ c #160E02",
-"2+ c #291A02",
-"3+ c #F6DE7A",
-"4+ c #DADADA",
-"5+ c #BE660E",
-"6+ c #3E361E",
-"7+ c #C6720E",
-"8+ c #72460A",
-"9+ c #5A3A06",
-"0+ c #723E06",
-"a+ c #A2A2A2",
-"b+ c #3E3E3E",
-"c+ c #929292",
-"d+ c #222222",
-"e+ c #8E4E0A",
-"f+ c #CE7E12",
-"g+ c #CA7A0F",
-"h+ c #FEF6D7",
-"i+ c #FAFAFA",
-"j+ c #F6CA33",
-"k+ c #3E3206",
-"l+ c #C07E10",
-"m+ c #9A9A9A",
-"n+ c #F6D652",
-"o+ c #F2BA16",
-"p+ c #3A2A06",
-"q+ c #422A06",
-"r+ c #FEFEFE",
-"s+ c #EAEAEA",
-"t+ c #0E0E0E",
-"u+ c #FAD244",
-"v+ c #161616",
-"w+ c #FAF2C6",
-"x+ c #2E2A12",
-"y+ c #B6760E",
-"z+ c #9A5E0E",
-"A+ c #A27A0E",
-"B+ c #6E3E06",
-"C+ c #1E1602",
-"D+ c #865A0A",
-"E+ c #EAAE16",
-"F+ c #D28E12",
-"G+ c #DA9212",
-" ",
-" ",
-" . . . . . . . . . ",
-" . . . . . . . . . . . . . . . ",
-" . . . . . . . . . . . . . . . . . . . . . ",
-" . . . . . . . . 4 h ).+.+.+.+ C+. . . . . . . ",
-" . . . . . . o.r $ ++s.++d.v ].].v.&._.W 1.. . . . . . ",
-" . . . . . @+B.p R.}.}.}.}.}.++v [+].v.&.&.~ 0 p+. . . . . ",
-" . . . . . N b c.c.b.b.{+c.R.}. +++d.v ].&.&.t ~ 5.P.. . . . . ",
-" . . . . . B.b.5 l ; Z.Z.Z.6.6.{+c.}.j+d.[+].v.&.X.E+#+:.: . . . . ",
-" . . . . . T.Z.j.r+y.@+2.K 3+Z.Z.b.{+{+% '+;.].v.&.t ~ #+`.N.: . . . . ",
-" . . . . T.Z.h+j.5 6+@ '.o.A H.3+^+Z.p {.{.=+j v.v.o+~ 5.#+`.I.2+. . . ",
-" . . . . ] {+5 l l M S r+n.t+i u K H.^+F Z g V.o.# v.&.t E+` r.~+l+. . . . ",
-" . . . . y R.U.5 l z o.^ r+= S [ !+t+A & . b+V T 3.{.D.} o+~ 5.` ~+/+g.. . . . ",
-" . . . . '+b.m C e 6+@ r+r+x b+. b+= t+. , b+{.@ T c+h.U -+~ #+` r.G+f.q+. . . ",
-" . . . N R./ U.U.M !+x r+r+r+r+r+r+r+x '.t+= = t+V.&+T l.3 + n ` r.|.F+O . . . ",
-" . . . . t.c.a./ > t+L.r+s+r+r+r+r+r+r+r+r+a+. a+x t+{.8 T T '.. w ~+|.F+^.z.. . . ",
-" . . . C+}.c.Q.a.6+@ r+,.p.8.i+r+r+r+E.r+r+, @ r+b+. = !+e.=.T , e.C+2 f.%.:+. . . ",
-" . . . =+j+c./...d+E.E.-.1 ^ ^ ,.r+ .&+L.X T t+@ t+!+b+ ., . '.a+T 8 {.9+J @.. . . ",
-" . . . . t.j+}.b o.T r+E.L.= y.n.p.n.X -.x.m+ .T =.n.E.d+@ r+= . 3 l.T g V.a 4.$+. . . ",
-" . . . . j d.}. +B.. , r+@ {., ^ y.L.L. .E.7.x.L.X r+&+!+x r+b+, &+t+h.V g . G.( . . . ",
-" . . . . v.}+++}.R.* x+d+t+&+!+Z a+8.n.p.n.E.n.c+y.1 t+. @ &+d+x r+1 '.a !+w.Y B+. . . ",
-" . . . k+v.].d.++}.c.p t+. .E.@ t+3.^ y.^ L. .x r+b+@ .b+. =.r+r+r+r+(+9.k.k.W.. . . ",
-" . . . + &.v.[+j+}.R.B.b+'.&+r+r+L.Z d+V 8.n.p.X a+d+x r+'.b+t+'. .r+E.3 |+@.<+e+. . . ",
-" . . . 1.&.v.v.}+j+9 . n.T Z r+r+r+r+=.. 8 H x x t+L.r+^ t+x E.@ 3 &+'.p+f+K.<+e+. . . ",
-" . . . . t &.v.v.}+y , r+x . .r+r+r+r+4+h.v+L.'.. V.= !+&+r+r+r+L.Z a @.A.K.D ( . . . ",
-" . . . . 6 o+v.v.! Z r+r+r+'.c+r+r+r+r+r+r+&+t+. 1 c+t+3 E.r+r+r+x d+f f+K.Y D S.. . . ",
-" . . . . A+X.t } @+^ r+r+r+&+Z r+r+r+r+r+r+r+E.'.t+&+. '.t+a+r+r+@ 1.^.A.K.D C.{ . . . ",
-" . . . r ~ X.+ @ .a+(+!+t+. .r+r+r+r+r+r+r+r+= !+!+1 = d+h.= a y+A.K.Y i.- . . . ",
-" . . . R #+_ . t+t+'.c+8.r+'.&+r+r+r+r+r+r+r+r+r+x !+@ r+x @ . >.^.g+7+D C.0+. . . ",
-" . . . . _ !.U b+x r+r+r+r+T V.^ a+=.=., =.=.=.h.Z d+x r+r+&+2+^.A.k.<+5+C.{ . . . ",
-" . . . p+`.q p+!+= r+r+r+x b+b+b+!+'.=., , , T . &+r+r+1 F.|+A.K.<+5+C._+. . . ",
-" . . . . W `.` _ U '.E.r+r+r+r+r+@ @ r+r+r+r+'.: U @ E.b+9+A.K.<+D i.C.)+. . . ",
-" . . . . a I.r.`.Y.>+t+c+r+r+r+r+L.!+r+r+r+= {.f.l+$.!+R O K.<+D C.C.( . . . . ",
-" . . . . .+/+|.r.r.u.C+h.1 r+r+r+3 1 r+E.S P.N.f.%.:+:+K.Y D i.C.0.. . . . ",
-" . . . . m./+/+|.|.I.< . =.r+r+(+c+r+@ .+f.%.^.A.g+7+<+D i.C.0.a . . . ",
-" . . . . . s f.F+M.G+M.*+2+V.L.T '.L.{.y+^.A.g+K.7+G i.C.C.0.a . . . . ",
-" . . . . . p+J %.%.f.%.f.,+U (+. Z 8+g+@.K.Y <+D i.C.#._+a . . . . ",
-" . . . . . 1+z+A.A.A.A.A.7 $+. [.@.K.Y <+D i.C.C.#.S.. . . . . ",
-" . . . . . . : 4.K.K.K.K.K.) %+<+D D i.C.C.- <.a . . . . . ",
-" . . . . . . . [.B+4.D D D 5+i.C.C.#.q.o a . . . . . . ",
-" . . . . . . . . . { { { { { 1+. . . . . . . . ",
-" . . . . . . . . . . . . . . . . . . . . . ",
-" . . . . . . . . . . . . . . . ",
-" . . . . . . . . . ",
-" ",
-" ",
-" "};
diff --git a/data/cde_app_root/dt/appconfig/icons/C/Evolution.m.pm b/data/cde_app_root/dt/appconfig/icons/C/Evolution.m.pm
deleted file mode 100644
index 72b591dd3f..0000000000
--- a/data/cde_app_root/dt/appconfig/icons/C/Evolution.m.pm
+++ /dev/null
@@ -1,291 +0,0 @@
-/* XPM */
-static char * evo_cde_32_xpm[] = {
-"32 32 256 2",
-" c None",
-". c #020202",
-"+ c #121212",
-"@ c #7A620C",
-"# c #767676",
-"$ c #BA8E12",
-"% c #B6962A",
-"& c #C6AA3A",
-"* c #DABA46",
-"= c #E2C24A",
-"- c #E2CA6E",
-"; c #7E420A",
-"> c #B25E0E",
-", c #E6D276",
-"' c #362A06",
-") c #D2D2D2",
-"! c #AA7A0E",
-"~ c #FEF6DE",
-"{ c #66520E",
-"] c #825E12",
-"^ c #CAA212",
-"/ c #FEDE8A",
-"( c #D6D6D6",
-"_ c #6C3C08",
-": c #EAE6DA",
-"< c #A28E52",
-"[ c #DAB216",
-"} c #7A6216",
-"| c #E6E6E6",
-"1 c #5E4E1A",
-"2 c #323232",
-"3 c #5E5E5E",
-"4 c #B07610",
-"5 c #C2AA5A",
-"6 c #EAEADE",
-"7 c #482E06",
-"8 c #CEBE8A",
-"9 c #EAEAEA",
-"0 c #D6B236",
-"a c #3A2206",
-"b c #A29666",
-"c c #8A5E0E",
-"d c #5A4E1E",
-"e c #7A723E",
-"f c #EEB616",
-"g c #F6DE92",
-"h c #463A16",
-"i c #BE7612",
-"j c #AAAAAA",
-"k c #9A520E",
-"l c #E2B622",
-"m c #3E3E3E",
-"n c #B66A0E",
-"o c #7B7A7A",
-"p c #BE860E",
-"q c #665A22",
-"r c #88480A",
-"s c #FEEAA6",
-"t c #BEBEBE",
-"u c #B2A65E",
-"v c #E2BA2E",
-"w c #262212",
-"x c #BE9212",
-"y c #928A62",
-"z c #965E0A",
-"A c #EEE6DE",
-"B c #524E3A",
-"C c #B6B6B6",
-"D c #5E5A42",
-"E c #824E0A",
-"F c #7A6A32",
-"G c #A6A6A6",
-"H c #2E2E2E",
-"I c #5E3206",
-"J c #F6C622",
-"K c #F6CA2E",
-"L c #FEEAB2",
-"M c #DADADA",
-"N c #6E6E6E",
-"O c #EEEADE",
-"P c #828282",
-"Q c #54400C",
-"R c #8E560E",
-"S c #EECA4A",
-"T c #EABA16",
-"U c #9A720E",
-"V c #8E8E8D",
-"W c #BA7E0E",
-"X c #D2CAA2",
-"Y c #CA9412",
-"Z c #F2F2F2",
-"` c #EEEAD6",
-" . c #BE6A0E",
-".. c #C2C2C2",
-"+. c #584816",
-"@. c #FAFAFA",
-"#. c #FEF2C6",
-"$. c #6A6A6A",
-"%. c #9A9A98",
-"&. c #4A3A26",
-"*. c #EAE6E2",
-"=. c #726A62",
-"-. c #281804",
-";. c #464646",
-">. c #C27A12",
-",. c #F2E6CE",
-"'. c #DE9A12",
-"). c #F3C218",
-"!. c #9E620E",
-"~. c #BE720E",
-"{. c #AE8612",
-"]. c #F6DA66",
-"^. c #EAEAE6",
-"/. c #66665E",
-"(. c #CACACA",
-"_. c #EEEADA",
-":. c #6E520E",
-"<. c #3A3622",
-"[. c #C68612",
-"}. c #221E1A",
-"|. c #F6DA6A",
-"1. c #FCEEC0",
-"2. c #BAA23E",
-"3. c #DEDEDE",
-"4. c #CE9212",
-"5. c #AA8A1E",
-"6. c #B29E52",
-"7. c #8E6E0E",
-"8. c #C28212",
-"9. c #EECA42",
-"0. c #5A5646",
-"a. c #524E42",
-"b. c #ADAEAE",
-"c. c #BA660E",
-"d. c #E6AA16",
-"e. c #FEFEFE",
-"f. c #3A3A3A",
-"g. c #878685",
-"h. c #F6D046",
-"i. c #AC680E",
-"j. c #E2B216",
-"k. c #46361E",
-"l. c #78560A",
-"m. c #78400A",
-"n. c #F6F6F6",
-"o. c #DE9E12",
-"p. c #7E6C26",
-"q. c #B69A3A",
-"r. c #362606",
-"s. c #AA5A0E",
-"t. c #161202",
-"u. c #969696",
-"v. c #F6D24A",
-"w. c #96520A",
-"x. c #565656",
-"y. c #56421E",
-"z. c #CA8612",
-"A. c #3E2206",
-"B. c #CE8212",
-"C. c #463E2E",
-"D. c #666256",
-"E. c #4E4E46",
-"F. c #865E0A",
-"G. c #402C06",
-"H. c #522E06",
-"I. c #524A3E",
-"J. c #EEEEEE",
-"K. c #76726A",
-"L. c #F3EACD",
-"M. c #7E560A",
-"N. c #423E2E",
-"O. c #92560A",
-"P. c #525252",
-"Q. c #463612",
-"R. c #4A4222",
-"S. c #5E3E0A",
-"T. c #D68E12",
-"U. c #4A4232",
-"V. c #2E221A",
-"W. c #1E1810",
-"X. c #6A561A",
-"Y. c #A25E0A",
-"Z. c #7A4E0A",
-"`. c #C16E0E",
-" + c #EEE6DA",
-".+ c #F2DA72",
-"++ c #9E5A0A",
-"@+ c #B2720E",
-"#+ c #262626",
-"$+ c #F6D242",
-"%+ c #B2B2B2",
-"&+ c #AE6E0E",
-"*+ c #3E320E",
-"=+ c #DA9612",
-"-+ c #CA7A11",
-";+ c #EEBA16",
-">+ c #5A5A59",
-",+ c #F6CE3C",
-"'+ c #C5760E",
-")+ c #EAAE16",
-"!+ c #E2E2E2",
-"~+ c #F2EAD2",
-"{+ c #F4C61A",
-"]+ c #C97E12",
-"^+ c #EAEAE2",
-"/+ c #524A22",
-"(+ c #F6D24E",
-"_+ c #626262",
-":+ c #C2720E",
-"<+ c #929292",
-"[+ c #4A4A49",
-"}+ c #CECECE",
-"|+ c #BA620E",
-"1+ c #2A2206",
-"2+ c #D18A12",
-"3+ c #FADA76",
-"4+ c #423826",
-"5+ c #C2A246",
-"6+ c #462606",
-"7+ c #BABAB9",
-"8+ c #422E12",
-"9+ c #2E2612",
-"0+ c #723A06",
-"a+ c #1E1602",
-"b+ c #52422A",
-"c+ c #B6620E",
-"d+ c #C6C6C6",
-"e+ c #8A8A8A",
-"f+ c #5A3E14",
-"g+ c #B29A46",
-"h+ c #F6CA26",
-"i+ c #F2BE16",
-"j+ c #DFA213",
-"k+ c #E9B216",
-"l+ c #F6D656",
-"m+ c #BE660E",
-"n+ c #B27A0E",
-"o+ c #424242",
-"p+ c #B66E0E",
-"q+ c #82520A",
-"r+ c #5E3606",
-"s+ c #8C5A0E",
-"t+ c #765A0A",
-"u+ c #945A0A",
-"v+ c #D69212",
-"w+ c #F6DE72",
-"x+ c #4E4E4E",
-"y+ c #727272",
-"z+ c #3E3A34",
-"A+ c #C6720E",
-"B+ c #676666",
-"C+ c #F6CE42",
-"D+ c #86827E",
-"E+ c #F6D256",
-"F+ c #B6921A",
-"G+ c #866212",
-" ",
-" . . . . . . . ",
-" . . . . . . . . . . . . . ",
-" . . . . . . 1+{ @ @ Q . . . . . . ",
-" . . . . q p.0 ,+,+K {+{+T x t+. . . . ",
-" . . . . p.* E+(+(+C+$+K J ).i+)+$ . . . . ",
-" . . . 9+5 1.X 6..+|.l+E+S v J {+;+k+j+F.. . . ",
-" . . . 9+6.#.#.D.[+e , w+|.q.h F+i+i+f )+j+M.. . . ",
-" . . . q.s 1.y V ( B b u - <.N [+d ^ f )+j+v+4 . . ",
-" . . . q w+L 8 0.J.| f.f./.4+x+f.P y+R.7.)+d.'.z.. . . ",
-" . . *+& / g 0.t @.e.e.e.e.j P.%.[+x+g.x.+.! '.4.&+. . ",
-" . . +.S 3+< P J.) Z e.e.n.e.# b.P.P.f.# y+N.l.z.&+. . . ",
-" . . . 5.C+5+P.n.) }+d+3.^.G (.e+_+x.;.C _+[+g.3 k.z E . . ",
-" . . . l ,+q.z+..b.3 7+(.}+( %+b.d+( x+( u.>+o+y+o a _ . . ",
-" . . t.).,+$+= +.+ <+E.g...d+M d+) P o+3 x+n.J.B+}.z O.. . ",
-" . . G.).J K v.F 2 ..3.N x+C (.( ) 3 | m H j @.%+f+'+++. . ",
-" . . a+i+).{+% /.d+/.@.e.d+E.y+) o+j j o n.P _+&.i.:+w.. . ",
-" . . . [ ).[ /+!+@.>+!+e.e.!+g.f.N _+w 3.e.Z _+q+]+`.; . . ",
-" . . . {.f } u.M 7+x+b.e.e.e.e.) >+[+>+P.j %+y.]+>.c._ . . ",
-" . . { Y }.[+y+<+g.P e.e.e.e.e.J.o $.) # <.!.-+`.s.. . . ",
-" . . ' U Q.P 9 e.9 _+V $.# P P N H 7+@.<+Z.-+:+m+r . . ",
-" . . . :.Y G+>+) @.) t # e+) ) e+}.o (.b+i A+ .c.6+. . ",
-" . . . n+o.p Q g.!+e.!+_+@.) U.2+s+*+u+:+ .> r . . ",
-" . . . r.W '.4.] I.(.e.B+!+K.c z.B.n p+`.|+; . . . ",
-" . . . -.@+2+T.W f+=.N y+S.]+>.'+`.c.> ; . . . ",
-" . . . 8+R B.B.W R V.t.&+'+A+ .|+c+m.. . . ",
-" . . . . G.E i.p+n s. .m+> k 0+a+. . . ",
-" . . . . . H.A.r+r+I H.6+. . . . . ",
-" . . . . . . . . . . . . . ",
-" . . . . . . . . . ",
-" ",
-" "};
diff --git a/data/cde_app_root/dt/appconfig/icons/C/Evolution.t.pm b/data/cde_app_root/dt/appconfig/icons/C/Evolution.t.pm
deleted file mode 100644
index 27995ddcd9..0000000000
--- a/data/cde_app_root/dt/appconfig/icons/C/Evolution.t.pm
+++ /dev/null
@@ -1,103 +0,0 @@
-/* XPM */
-static char * evo_cde_16_xpm[] = {
-"16 16 84 1",
-" c None",
-". c #020202",
-"+ c #E6C750",
-"@ c #F8E191",
-"# c #F8E6A4",
-"$ c #F7E499",
-"% c #F2DD8B",
-"& c #BDA752",
-"* c #685617",
-"= c #C9A92F",
-"- c #F8E395",
-"; c #F8E8AE",
-"> c #F7DD7E",
-", c #F7D65D",
-"' c #F7D455",
-") c #F6CF42",
-"! c #DEC054",
-"~ c #B49E4E",
-"{ c #BC9F33",
-"] c #000000",
-"^ c #363326",
-"/ c #F8E18C",
-"( c #F9E499",
-"_ c #F6D148",
-": c #F6CE3B",
-"< c #ECC63F",
-"[ c #B59B3A",
-"} c #060300",
-"| c #100E0B",
-"1 c #E7D184",
-"2 c #F8E393",
-"3 c #DEBA35",
-"4 c #A68C26",
-"5 c #282623",
-"6 c #F1D97F",
-"7 c #F8DE7D",
-"8 c #848484",
-"9 c #FFFFFF",
-"0 c #E6E6E6",
-"a c #5E5E5E",
-"b c #A18726",
-"c c #24221F",
-"d c #F8E497",
-"e c #F6D049",
-"f c #EDEDED",
-"g c #676767",
-"h c #F5F5F5",
-"i c #666666",
-"j c #DDDDDD",
-"k c #D5B233",
-"l c #B4972A",
-"m c #757575",
-"n c #737373",
-"o c #797979",
-"p c #BABABA",
-"q c #818181",
-"r c #D9B634",
-"s c #BC9D2D",
-"t c #070502",
-"u c #F5E5AA",
-"v c #C2C2C2",
-"w c #E1E1E1",
-"x c #CFCFCF",
-"y c #AA8E28",
-"z c #E1C663",
-"A c #F9E8AA",
-"B c #BE9F2D",
-"C c #8A7420",
-"D c #F7DE82",
-"E c #F9E6A0",
-"F c #D0AE31",
-"G c #937B23",
-"H c #F7DC7A",
-"I c #F9E8A5",
-"J c #F6D55A",
-"K c #ECC638",
-"L c #9E8526",
-"M c #AC9129",
-"N c #D2B441",
-"O c #D5C37E",
-"P c #DABD56",
-"Q c #C9AC40",
-"R c #AE9129",
-"S c #8A7421",
-" ",
-" ...... ",
-" ..+@#$%&*. ",
-" .=-;>,')!~{] ",
-" ^/(_:::::<[} ",
-" |12........34] ",
-" 567.89990a.3b] ",
-" cde.fgh0ij.kl] ",
-" c$:.mjnopq.rs] ",
-" tue.vwjwwx.ky] ",
-" tzA........BC] ",
-" .DE3rkrrrFG. ",
-" .FHIJ:::KLM. ",
-" ..NOPQRS.. ",
-" ...... ",
-" "};
diff --git a/data/cde_app_root/dt/appconfig/icons/C/Makefile.am b/data/cde_app_root/dt/appconfig/icons/C/Makefile.am
deleted file mode 100644
index 5fa1af0309..0000000000
--- a/data/cde_app_root/dt/appconfig/icons/C/Makefile.am
+++ /dev/null
@@ -1,15 +0,0 @@
-ICONS = \
- Evolution.l.pm \
- Evolution.m.pm \
- Evolution.t.pm \
- Ximian.l.pm \
- Ximian.m.pm \
- Ximian.t.pm
-
-EXTRA_DIST = $(ICONS)
-
-if HAVE_DTAPPINTEGRATE
-cdeiconsdir = $(privdatadir)/cde_app_root/dt/appconfig/icons/C
-cdeicons_DATA = $(ICONS)
-endif
-
diff --git a/data/cde_app_root/dt/appconfig/icons/C/Ximian.l.pm b/data/cde_app_root/dt/appconfig/icons/C/Ximian.l.pm
deleted file mode 100644
index a5fda59d40..0000000000
--- a/data/cde_app_root/dt/appconfig/icons/C/Ximian.l.pm
+++ /dev/null
@@ -1,147 +0,0 @@
-/* XPM */
-static char *ximian.l[] = {
-/* columns rows colors chars-per-pixel */
-"16 16 125 2",
-" c #000000",
-". c #080502",
-"X c #0d0b04",
-"o c #140c01",
-"O c #1d1201",
-"+ c #19160b",
-"@ c #1d190c",
-"# c #1c1910",
-"$ c #241e0a",
-"% c #2a1f03",
-"& c #391e02",
-"* c #2d2405",
-"= c #3d2202",
-"- c #3c2e05",
-"; c #4b2a02",
-": c #4b3b0c",
-"> c #463b13",
-", c #532d02",
-"< c #503907",
-"1 c #633503",
-"2 c #643b04",
-"3 c #54440c",
-"4 c #59440d",
-"5 c #5c4b12",
-"6 c #564e2e",
-"7 c #524d3a",
-"8 c #624b08",
-"9 c #684706",
-"0 c #694108",
-"q c #6c4d07",
-"w c #6c550a",
-"e c #60511b",
-"r c #6c5a18",
-"t c #704104",
-"y c #744d07",
-"u c #7b4e07",
-"i c #70570c",
-"p c #7e580c",
-"a c #725c13",
-"s c #60562f",
-"d c #605536",
-"f c #79600e",
-"g c #7e6611",
-"h c #756427",
-"j c #7f6b23",
-"k c #7e703c",
-"l c #716b57",
-"z c #8f4d05",
-"x c #8d5e09",
-"c c #9e5908",
-"v c #8a640a",
-"b c #8b6e0f",
-"n c #8a731f",
-"m c #926b0e",
-"M c #9e6409",
-"N c #97760e",
-"B c #99740d",
-"V c #917414",
-"C c #92791d",
-"Z c #816f2b",
-"A c #897a3f",
-"S c #a15905",
-"D c #ac6307",
-"F c #a8750c",
-"G c #a27b10",
-"H c #a97d11",
-"J c #b66606",
-"K c #be6f08",
-"L c #b2760a",
-"P c #bc7309",
-"I c #857949",
-"U c #cc7c0a",
-"Y c #ac860f",
-"T c #b3870f",
-"R c #968b5e",
-"E c #9a8c52",
-"W c #878165",
-"Q c #a4924d",
-"! c #bca650",
-"~ c #afa065",
-"^ c #b7a662",
-"/ c #c28c10",
-"( c #c88b12",
-") c #c29211",
-"_ c #c79e16",
-"` c #ca9715",
-"' c #ca9a11",
-"] c #d1850c",
-"[ c #d38a0d",
-"{ c #d2970f",
-"} c #db950f",
-"| c #dd990f",
-" . c #df9d10",
-".. c #daa115",
-"X. c #e4a311",
-"o. c #e0b41e",
-"O. c #edb515",
-"+. c #f2be16",
-"@. c #e5bc2d",
-"#. c #c5aa59",
-"$. c #d8bb4f",
-"%. c #c9b878",
-"&. c #f5c21a",
-"*. c #f6c520",
-"=. c #f7c827",
-"-. c #f6c82a",
-";. c #f6ce3d",
-":. c #f8cf3d",
-">. c #dcca7f",
-",. c #f4d04d",
-"<. c #f8d041",
-"1. c #f6d558",
-"2. c #f8d354",
-"3. c #eacf65",
-"4. c #f1d363",
-"5. c #b4aa80",
-"6. c #e1d18c",
-"7. c #f4e299",
-"8. c #fbe691",
-"9. c #ede1a9",
-"0. c #fcecaa",
-"q. c #fdf0ba",
-"w. c #fdf3c6",
-"e. c #fef6d1",
-"r. c None",
-/* pixels */
-"r.r.r.r.r. r.r.r.r.r.",
-"r.r.r. . * > r g w - . r.r.r.",
-"r.r. @ 7 k 3.1.<.o.Y v O r.r.",
-"r. + l R 7.>.Q j @.&.` v o r.",
-"r.. d %.~ e.W ~ ! n &.O.{ y r.",
-" $ #.E 9.e.q.8.4.e _ O.X.L O ",
-" 5 2.I 6.0.7.I @ o * B ..[ ; ",
-" V <.$.d ^ 6 + X . . ( [ t ",
-" B =.:.,.h j -.f G H } U 2 ",
-" 8 &.&.-.C a 3 &.i H .] K = ",
-" * T _ b a G : O.) < x P S o ",
-"r. q m ` ) 4 ....| [ 2 S , r.",
-"r. o 9 F p ( } [ ] U J 1 . r.",
-"r.r. o 2 u M P P D z ; . r.r.",
-"r.r.r. O = , , & o r.r.r.",
-"r.r.r.r.r. r.r.r.r.r."
-};
diff --git a/data/cde_app_root/dt/appconfig/icons/C/Ximian.m.pm b/data/cde_app_root/dt/appconfig/icons/C/Ximian.m.pm
deleted file mode 100644
index 125aaeceb9..0000000000
--- a/data/cde_app_root/dt/appconfig/icons/C/Ximian.m.pm
+++ /dev/null
@@ -1,272 +0,0 @@
-/* XPM */
-static char *ximian.m[] = {
-/* columns rows colors chars-per-pixel */
-"32 32 234 2",
-" c #000000",
-". c #0a0602",
-"X c #0c0902",
-"o c #0b090a",
-"O c #130d02",
-"+ c #100c0e",
-"@ c #1c0f01",
-"# c #120e10",
-"$ c #141004",
-"% c #111009",
-"& c #1c1302",
-"* c #181409",
-"= c #1c180c",
-"- c #211401",
-"; c #251b02",
-": c #2b1601",
-"> c #2c1c02",
-", c #272109",
-"< c #292004",
-"1 c #2a230a",
-"2 c #2e280f",
-"3 c #262213",
-"4 c #362604",
-"5 c #342c0d",
-"6 c #382603",
-"7 c #36311d",
-"8 c #3c3310",
-"9 c #3b351f",
-"0 c #2f2d22",
-"q c #402a05",
-"w c #482702",
-"e c #4d2902",
-"r c #433005",
-"t c #45380c",
-"y c #493707",
-"u c #4c3d0b",
-"i c #4a3810",
-"p c #483f1c",
-"a c #502f03",
-"s c #553d06",
-"d c #5c3503",
-"f c #5f3a05",
-"g c #423b22",
-"h c #643503",
-"j c #653f0a",
-"k c #743e03",
-"l c #534007",
-"z c #55420f",
-"x c #524516",
-"c c #534619",
-"v c #5a4711",
-"b c #5b4a11",
-"n c #4a4428",
-"m c #4e4933",
-"M c #524c33",
-"N c #5d5123",
-"B c #5e5532",
-"V c #624206",
-"C c #6f4706",
-"Z c #684d09",
-"A c #634c13",
-"S c #665116",
-"D c #6b5a1d",
-"F c #794004",
-"G c #7d4c0a",
-"H c #775e0b",
-"J c #7b5b0a",
-"K c #6a5e2c",
-"L c #625a3d",
-"P c #7e6612",
-"I c #7a6419",
-"U c #6e602a",
-"Y c #6c633e",
-"T c #716844",
-"R c #7e7240",
-"E c #7a7354",
-"W c #8e4c04",
-"Q c #8d5106",
-"! c #885908",
-"~ c #995204",
-"^ c #82640c",
-"/ c #8c650b",
-"( c #8a6b0c",
-") c #856b11",
-"_ c #836d1f",
-"` c #8a721f",
-"' c #95660e",
-"] c #94680a",
-"[ c #91710d",
-"{ c #9b700e",
-"} c #9b7a0e",
-"| c #967018",
-" . c #9a7014",
-".. c #9d7e12",
-"X. c #806e2d",
-"o. c #937d2f",
-"O. c #a55805",
-"+. c #a05d0a",
-"@. c #a85905",
-"#. c #b25f06",
-"$. c #a26308",
-"%. c #ac6908",
-"&. c #a2750f",
-"*. c #a37c0e",
-"=. c #ad720b",
-"-. c #aa7c0d",
-";. c #b66206",
-":. c #b76807",
-">. c #bb6506",
-",. c #be6806",
-"<. c #b9750a",
-"1. c #81764d",
-"2. c #877943",
-"3. c #c06c07",
-"4. c #c26e08",
-"5. c #c57308",
-"6. c #c87709",
-"7. c #ca7b0a",
-"8. c #9e8730",
-"9. c #aa830f",
-"0. c #a48110",
-"q. c #a88716",
-"w. c #b58e10",
-"e. c #b58d1b",
-"r. c #bf8e10",
-"t. c #ba9312",
-"y. c #a28d3c",
-"u. c #b29325",
-"i. c #bb9821",
-"p. c #8e824e",
-"a. c #9f8c46",
-"s. c #a59966",
-"d. c #b3a362",
-"f. c #b8a867",
-"g. c #bfaf6c",
-"h. c #c1840d",
-"j. c #ce810b",
-"k. c #ca8a0e",
-"l. c #cf8e14",
-"z. c #ca910f",
-"x. c #c49310",
-"c. c #c79e15",
-"v. c #ce9415",
-"b. c #c89b18",
-"n. c #d1850b",
-"m. c #d48a0c",
-"M. c #d9920e",
-"N. c #dd980f",
-"B. c #d49d1b",
-"V. c #de9b10",
-"C. c #c09d24",
-"Z. c #cea61e",
-"A. c #dca513",
-"S. c #dba618",
-"D. c #cfac35",
-"F. c #cfb03f",
-"G. c #d2b33f",
-"H. c #dcba3c",
-"J. c #e09d10",
-"K. c #e3a311",
-"L. c #e6a912",
-"P. c #e0ad18",
-"I. c #e8ab13",
-"U. c #edb314",
-"Y. c #e8b31d",
-"T. c #ecb916",
-"R. c #edbd1c",
-"E. c #f1bb15",
-"W. c #e2bb32",
-"Q. c #c3aa4d",
-"!. c #c8ae4e",
-"~. c #c3ac55",
-"^. c #ccb252",
-"/. c #ccb55b",
-"(. c #c6b265",
-"). c #d0b961",
-"_. c #f4c017",
-"`. c #f6c31a",
-"'. c #f7c621",
-"]. c #f7c826",
-"[. c #f7c92b",
-"{. c #f9c928",
-"}. c #f6cb33",
-"|. c #fccd32",
-" X c #f8ce3a",
-".X c #f8d03e",
-"XX c #ddc153",
-"oX c #d9c678",
-"OX c #dec975",
-"+X c #ebca51",
-"@X c #eccb58",
-"#X c #f9cf41",
-"$X c #f8d144",
-"%X c #f8d34b",
-"&X c #f9d451",
-"*X c #f8d75a",
-"=X c #f8d85d",
-"-X c #e5ca63",
-";X c #ecd47b",
-":X c #fdd669",
-">X c #fada66",
-",X c #f9db69",
-"<X c #f6db76",
-"1X c #fadc71",
-"2X c #fddc7a",
-"3X c #f9e07a",
-"4X c #c2b789",
-"5X c #cfc69c",
-"6X c #ddcb83",
-"7X c #dfd196",
-"8X c #d8cea1",
-"9X c #e6d693",
-"0X c #f0db86",
-"qX c #f0dc8b",
-"wX c #fddf8f",
-"eX c #f1df9b",
-"rX c #e5d8a0",
-"tX c #fae286",
-"yX c #fae48b",
-"uX c #fbe596",
-"iX c #fbe99c",
-"pX c #f3e3a1",
-"aX c #fee6a8",
-"sX c #fae9a3",
-"dX c #fbeba9",
-"fX c #fcedb4",
-"gX c #fcf0ba",
-"hX c #feefc8",
-"jX c #fdf3c3",
-"kX c #fdf3cc",
-"lX c #fef7d7",
-"zX c #fef6dc",
-"xX c #fef8d8",
-"cX c None",
-/* pixels */
-"cXcXcXcXcXcXcXcXcXcXcXcX cXcXcXcXcXcXcXcXcXcXcXcXcX",
-"cXcXcXcXcXcXcXcXcX cXcXcXcXcXcXcXcXcXcX",
-"cXcXcXcXcXcXcX X & 1 ; O cXcXcXcXcXcXcXcX",
-"cXcXcXcXcXcX . 5 ` u.i.Z.c.w.[ l . cXcXcXcXcXcXcX",
-"cXcXcXcXcX . $ c F.%X%X$X.X}.].`._.T.A.H & cXcXcXcXcXcX",
-"cXcXcXcX o % a.;X3X^.=X=X&X$X X[.`._.T.U.-.4 cXcXcXcXcX",
-"cXcXcX o 5 ~.kXzXd.(.3X3X,X=X%X X].`.E.U.I.V.q . cXcXcXcX",
-"cXcX o . O Q.fXzX9XR qXyXtX3X,X+XH.[.'.E.E.U.K.h.4 cXcXcX",
-"cXcX . X y.uXhXeXL 9XdXsXs.B 9 3 1 H.].E.E.U.L.J.h.O cXcXcX",
-"cX c @XaXsX(.E fXjX5X0 B f./.U _ [.`.E.U.I.J.M.C cXcX",
-"cX o D.:XwXyXT 4XkXlXkX5X9XyX1XXX, i.`._.U.I.J.M.<.> cXcX",
-"cX 1 $X:X2X3Xm rXjXlXkXgXiXyX1X*Xx l _._.U.I.J.M.j.f cXcX",
-" P X&X>X).M sXfXgXgXdXuXOXa.X.D P T.U.L.J.M.n.+. cX",
-" . q.|.$X=X-X7 6XsXdXsXiXd.n & l *.K.N.M.j.5. cX",
-" $ t.{..X%X=XK n OXyXtXp. . { N.m.7.6.& cX",
-" $ w.'.[.$X%X).U 7 Y 2.% * n & * . .N.m.7.4.- cX",
-" $ w.`.`.[..X%X&X!.D = o.}.]... b.Z | V.l.n.6.3.@ cX",
-" . 9.E.`.{.[. X#X$X!. 8 W.].`.0. U.K.K.N.m.7.5.,.. cX",
-" J E.E.`.`.].].[.C.5 I X ) `.`.( = L.K.V.M.n.7.4.~ cX",
-"cX r U.E.E.E.`.`.R.P v R.H , T.E.^ o / V.M.m.7.6.,.h cXcX",
-"cX z.I.U.U.} } t t t.} O v Y.U.L.&.> V ! $.6.,.@.: # . cXcX",
-"cX Z K.I.A.& z e.P.x.; S S.I.L.K.N.=.6 - j 4.,.F o # cXcX",
-"cXcX X ] K.z.B.I.U.r.y A I.K.J.J.N.M.m.j.G +.,.@.@ # cXcXcX",
-"cXcX ; k.V.V.N.K.s i v.K.V.N.M.m.n.j.6.4.,.#.e o o cXcXcX",
-"cXcXcX > =.M.N.M.' l.M.M.m.m.m.7.6.4.3.,.#.w o # cXcXcXcX",
-"cXcXcXcX > %.m.n.l.m.n.m.j.7.7.6.4.,.>.@.e . + cXcXcXcXcX",
-"cXcXcXcXcX X d %.7.7.7.6.6.5.4.,.>.O.k O o o cXcXcXcXcXcX",
-"cXcXcXcXcXcX - e W :.,.,.>.>.W d : X o o cXcXcXcXcXcXcX",
-"cXcXcXcXcXcXcX . - O . o o o cXcXcXcXcXcXcXcX",
-"cXcXcXcXcXcXcXcXcX . cXcXcXcXcXcXcXcXcXcX",
-"cXcXcXcXcXcXcXcXcXcXcXcX cXcXcXcXcXcXcXcXcXcXcXcXcX",
-"cXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcX"
-};
diff --git a/data/cde_app_root/dt/appconfig/icons/C/Ximian.t.pm b/data/cde_app_root/dt/appconfig/icons/C/Ximian.t.pm
deleted file mode 100644
index d0bdc61e8c..0000000000
--- a/data/cde_app_root/dt/appconfig/icons/C/Ximian.t.pm
+++ /dev/null
@@ -1,289 +0,0 @@
-/* XPM */
-static char *ximian.t[] = {
-/* columns rows colors chars-per-pixel */
-"48 48 235 2",
-" c #000000",
-". c #090604",
-"X c #080708",
-"o c #0e0a01",
-"O c #0d0a0a",
-"+ c #100d0e",
-"@ c #120f10",
-"# c #1c1402",
-"$ c #1e1905",
-"% c #1e1908",
-"& c #151213",
-"* c #181315",
-"= c #1b1618",
-"- c #1e1b10",
-"; c #1d181a",
-": c #221201",
-"> c #271902",
-", c #2c1a01",
-"< c #311d02",
-"1 c #2c2204",
-"2 c #2d260c",
-"3 c #2c2410",
-"4 c #2e2914",
-"5 c #2e2918",
-"6 c #332002",
-"7 c #3f2503",
-"8 c #3c2e05",
-"9 c #3d3005",
-"0 c #3e3209",
-"q c #3d3311",
-"w c #3b3218",
-"e c #2f2c22",
-"r c #3f3b2c",
-"t c #452502",
-"y c #4b2c03",
-"u c #453005",
-"i c #45320b",
-"p c #483506",
-"a c #493913",
-"s c #512b02",
-"d c #583504",
-"f c #5c3b05",
-"g c #5b3f17",
-"h c #613704",
-"j c #683703",
-"k c #4d431d",
-"l c #56400d",
-"z c #584307",
-"x c #5c4b10",
-"c c #59491b",
-"v c #4e472c",
-"b c #5d5021",
-"n c #5d532d",
-"m c #674005",
-"M c #684f09",
-"N c #6b540a",
-"B c #6c5a1a",
-"V c #774c07",
-"C c #7d4a06",
-"Z c #725308",
-"A c #7f5012",
-"S c #6c5f2c",
-"D c #7b610c",
-"F c #7b6312",
-"G c #7b661a",
-"H c #6d6133",
-"J c #6d633a",
-"K c #7c6923",
-"L c #7c6b2d",
-"P c #7c6c30",
-"I c #7d703e",
-"U c #5e5840",
-"Y c #7d7245",
-"T c #7e785e",
-"R c #8b4a04",
-"E c #825207",
-"W c #965004",
-"Q c #8b6210",
-"! c #896e13",
-"~ c #936c0b",
-"^ c #95710d",
-"/ c #95741a",
-"( c #896f20",
-") c #8c7a36",
-"_ c #a25605",
-"` c #ae5c05",
-"' c #a16b0a",
-"] c #aa6107",
-"[ c #ae6608",
-"{ c #ab6f0a",
-"} c #a57f0e",
-"| c #ae730b",
-" . c #ac7d0d",
-".. c #b16c09",
-"X. c #ba6406",
-"o. c #be6906",
-"O. c #b1780c",
-"+. c #bd7f12",
-"@. c #8c7d42",
-"#. c #c06c07",
-"$. c #c26e08",
-"%. c #c57308",
-"&. c #c57e0c",
-"*. c #c87709",
-"=. c #cb7b0a",
-"-. c #9a8125",
-";. c #9b832c",
-":. c #a6800f",
-">. c #a8840f",
-",. c #aa891b",
-"<. c #bc830d",
-"1. c #be9123",
-"2. c #b99a2a",
-"3. c #ba9d33",
-"4. c #ba9f3b",
-"5. c #baa03e",
-"6. c #9c8a48",
-"7. c #9c8d54",
-"8. c #9c8f5a",
-"9. c #9c905a",
-"0. c #8e8563",
-"q. c #9e9676",
-"w. c #baa141",
-"e. c #bba758",
-"r. c #bba85c",
-"t. c #ada377",
-"y. c #bcb07d",
-"u. c #ce800b",
-"i. c #cd8b0e",
-"p. c #c38a1a",
-"a. c #cb8913",
-"s. c #c19111",
-"d. c #c7921c",
-"f. c #c59a11",
-"g. c #c59c1f",
-"h. c #cc9814",
-"j. c #d1850c",
-"k. c #d58c0d",
-"l. c #d88f0e",
-"z. c #d08512",
-"x. c #d0900e",
-"c. c #da930e",
-"v. c #dd980f",
-"b. c #d39510",
-"n. c #d09d12",
-"m. c #d59b1d",
-"M. c #dd9b10",
-"N. c #c8a016",
-"B. c #d4a513",
-"V. c #daa111",
-"C. c #c9a62b",
-"Z. c #c9ab3b",
-"A. c #d8b024",
-"S. c #d9b73a",
-"D. c #e09d10",
-"F. c #e3a311",
-"G. c #e6a812",
-"H. c #e6a818",
-"J. c #e9ad13",
-"K. c #e9ae19",
-"L. c #e4b315",
-"P. c #e3b21b",
-"I. c #e7b91d",
-"U. c #edb314",
-"Y. c #edb51b",
-"T. c #f0b715",
-"R. c #f1bb15",
-"E. c #e2b328",
-"W. c #eab921",
-"Q. c #c9ad41",
-"!. c #caae49",
-"~. c #cab050",
-"^. c #dabf5c",
-"/. c #cbb86d",
-"(. c #cbb971",
-"). c #cbbc79",
-"_. c #f5c117",
-"`. c #f6c41a",
-"'. c #e9c33e",
-"]. c #f7c622",
-"[. c #f7c826",
-"{. c #f7c92b",
-"}. c #fac926",
-"|. c #fbcb2b",
-" X c #f7cc33",
-".X c #f7cf3c",
-"XX c #f8cc33",
-"oX c #f8ce3a",
-"OX c #f9d03c",
-"+X c #e9c647",
-"@X c #e8c749",
-"#X c #e8c84d",
-"$X c #e9cc5e",
-"%X c #f8d143",
-"&X c #f8d34c",
-"*X c #f8d453",
-"=X c #f9d65a",
-"-X c #f9d85c",
-";X c #eacf68",
-":X c #ead273",
-">X c #ead479",
-",X c #fed76c",
-"<X c #f9d964",
-"1X c #f9db6b",
-"2X c #f9dd73",
-"3X c #fcdb7d",
-"4X c #fae17d",
-"5X c #bdb387",
-"6X c #ccbf87",
-"7X c #ccc08a",
-"8X c #ebd98d",
-"9X c #fddc86",
-"0X c #fae282",
-"qX c #fae48b",
-"wX c #fbe593",
-"eX c #fbe599",
-"rX c #fbe89d",
-"tX c #eee4ba",
-"yX c #fde5a4",
-"uX c #fee7ac",
-"iX c #fbeaa3",
-"pX c #fbebaa",
-"aX c #fceeb3",
-"sX c #fdedba",
-"dX c #feefc8",
-"fX c #fdf2c3",
-"gX c #fef4ce",
-"hX c #fef6d3",
-"jX c #fff5db",
-"kX c #fef8d8",
-"lX c #fff6e1",
-"zX c #fffae3",
-"xX c #fff9eb",
-"cX c #fefbf3",
-"vX c None",
-/* pixels */
-"vXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvX vXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvX vXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvXvXvXvXvXvXvX vXvXvXvXvXvXvXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvXvXvXvXvXvX 0 0 D D D 9 1 vXvXvXvXvXvXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvXvXvXvX % B 2. X X X{.[.`.`.`.R.:.M o vXvXvXvXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvXvXvX X % ;.%X%X%X%X%XoX X{.[.`.`._.R.R.U.~ # vXvXvXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvXvX & o K &X*X*X=X=X*X&X&X%XoX X{.].`._.R.T.U.V.Z vXvXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvX & 2 Q.2XpXeX$X6.<X-X-X*X*X%XOX X{.`.`._.R.U.J.G.<.# vXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvX * 2 #XpXcXcXqXn :X4X2X1X<X-X*X&X.X X[.`.`.R.R.U.J.G.b.> vXvXvXvXvXvXvX",
-"vXvXvXvXvX & 2 #XaXxXcXeXI 9.0X0X0X4X2X1X-X*X%XoX X].`._.R.U.U.G.F.x.> vXvXvXvXvXvX",
-"vXvXvXvXvXO 2 @XwXjXlXpX/.r wXwXwXqXqX0X2X1X-X5.S. X{.`.`.R.U.U.G.F.D.i.o vXvXvXvXvXvX",
-"vXvXvXvX O Z.2XdXdXsX9X5 y.iXpXiXrX).8.H 4 q .X{.].`._.R.U.J.G.v.v.^ vXvXvXvXvX",
-"vXvXvX O K *XyXsXsXwX8.r pXaXaXaXt. r J L -. X[.`._.R.U.J.G.D.v.l.f vXvXvXvX",
-"vXvXvX X % %X2XyXuXwXqX- 5XsXfXfXfXT J wX0X2X<Xb % .X[.`._.R.U.J.G.F.v.l.u.o vXvXvXvX",
-"vXvXvXX -.%X9XwXeX9X8.e aXfXhXkXhXtXq.7XwX0X2X<Xw. G {.`._.R.U.U.G.D.v.c.j.j vXvXvXvX",
-"vXvX O o XX*X3X9X4X0Xv 0.aXfXhXzXkXfXaXpXwX0X2X1X-X2 o A.`.`._.U.U.G.F.v.k.j.%. vXvXvX",
-"vXvX x XX=X,X2X2X0X 7XaXfXhXhXhXfXaXiXwX0X4X<X*X;. 0 `.`.R.U.U.F.F.v.c.k.u.7 vXvXvX",
-"vXvX. ,.XX*X=X<X1Xr. rXpXaXfXfXfXaXpXrXqX0X1X~.5.'.o D `.R.T.U.G.D.v.l.j.u.C vXvXvX",
-"vX W.XXOX&X=X1Xe. 8XrXpXaXaXaXpXrXwXqXI o >.T.U.J.G.D.v.k.j.=.[ vXvX",
-"vX % `.|.OX%X*X<X;X Y wXrXiXiXiXrXwX(.4 % l M.G.D.c.k.j.=.*. vXvX",
-"vX 9 `.}.XX%X&X=X<XS 7.qXqXwXwXqX7. 1 V.D.c.k.j.*.$.< vXvX",
-"vX 9 _.].|.oX%X&X-X$X4 J >X0X0X6. d.v.l.k.=.*.$., vXvX",
-"vX 8 _._.[.|.oX%X*X=X<XS O n 6. + k P 2 4 o 3 D.v.l.k.=.*.$., vXvX",
-"vX 8 _._.`.{. X.X%X&X*X=X^.n + ) '. X{.I. g.^ w m.D.c.k.j.=.%.o., vXvX",
-"vX 8 R._._.`.[.{..X%X%X&X*X*X!. +X.X X[.`._. U.U.h.H.D.M.l.j.=.=.$.o.: vXvX",
-"vX o R.R._._.`.[.{. X.X.X%X%X5. -.{.[.`.`._. U.J.F.F.v.c.k.j.=.%.#.o. vXvX",
-"vX h.T.R._.`.`.`.[.{.{. X{.2. L 2 o I.`.`._.L. 4 U.G.F.D.v.k.k.=.*.$.o.W vXvX",
-"vXvX ^ U.R.R._._._.`.`.[.[.[.F C.W.1 D _._.R.:. % M.H.D.v.c.k.j.=.%.#.X.j vXvXvX",
-"vXvX p J.U.U.R.R._._.`.`.`.N.9 - `.`.L.> o L.T.R.s.2 > b.v.v.k.j.=.*.$.o.X.: + vXvXvX",
-"vXvX M.J.U.U.R.R.B.f.L.N o ! `.>.o q A.U.J.J.M.l > <.| V =.*.*.#.X._ O @ vXvXvX",
-"vXvXvX Z V.J.J.J.U.z o 1 - ( L.R.f.o c Y.U.U.J.J.V.F.Q o o V 6 ..%.#.X.X.t * . vXvXvXvX",
-"vXvXvX o c.V.J.J.b. % / W.U.U.U.8 c Y.J.J.G.F.F.M.v.c.+.> A #.o.X._ X = vXvXvXvX",
-"vXvXvX u v.F.F. .1.K.J.J.K.U.~ c K.G.G.F.F.v.v.c.c.k.j.z.d g ] o.X.X.> = X vXvXvXvX",
-"vXvXvXvX ~ v.v.D.F.F.F.G.G., a H.F.F.D.v.v.v.v.l.k.j.u.*.*.$.o.X.X.j @ * vXvXvXvXvX",
-"vXvXvXvXvX o O.v.v.v.D.D.D.D. 3 m.M.D.M.v.v.c.l.k.j.j.=.*.%.#.o.X.X.W X ; vXvXvXvXvXvX",
-"vXvXvXvXvX o | l.c.c.v.c.v.i p.c.c.c.c.l.l.k.j.j.u.=.*.%.#.o.X.X.W . . * X vXvXvXvXvXvX",
-"vXvXvXvXvXvX o { k.k.k.k.l.a.l.l.k.k.k.k.j.u.u.*.*.*.#.o.o.X.X.W o * + vXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvX o E j.j.j.k.j.j.k.j.j.j.=.=.*.*.*.$.#.o.X.X.X.j @ @ vXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvXvX < ..=.=.=.=.=.=.*.*.*.*.%.$.#.o.X.X.X.W , X * O vXvXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvXvXvX y [ *.*.*.%.%.$.#.#.o.o.X.X.X.W t O & X vXvXvXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvXvXvXvX : h R o.#.o.X.X.X.` R s : O @ + vXvXvXvXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvXvXvXvXvXvX , , , . O + + . vXvXvXvXvXvXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvXvXvXvXvXvXvX . . X X O O X vXvXvXvXvXvXvXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvX X X X X vXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvX vXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvX",
-"vXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvX"
-};
diff --git a/data/cde_app_root/dt/appconfig/icons/Makefile.am b/data/cde_app_root/dt/appconfig/icons/Makefile.am
deleted file mode 100644
index 9f660cf34e..0000000000
--- a/data/cde_app_root/dt/appconfig/icons/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-SUBDIRS = C \ No newline at end of file
diff --git a/data/cde_app_root/dt/appconfig/types/.cvsignore b/data/cde_app_root/dt/appconfig/types/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/data/cde_app_root/dt/appconfig/types/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/data/cde_app_root/dt/appconfig/types/C/.cvsignore b/data/cde_app_root/dt/appconfig/types/C/.cvsignore
deleted file mode 100644
index ed2271e0f5..0000000000
--- a/data/cde_app_root/dt/appconfig/types/C/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-Makefile
-Makefile.in
-Ximian.dt
diff --git a/data/cde_app_root/dt/appconfig/types/C/Makefile.am b/data/cde_app_root/dt/appconfig/types/C/Makefile.am
deleted file mode 100644
index 3cda99060e..0000000000
--- a/data/cde_app_root/dt/appconfig/types/C/Makefile.am
+++ /dev/null
@@ -1,6 +0,0 @@
-EXTRA_DIST = Ximian.dt.in
-
-if HAVE_DTAPPINTEGRATE
-cdetypesdir = $(privdatadir)/cde_app_root/dt/appconfig/types/C
-cdetypes_DATA = Ximian.dt
-endif
diff --git a/data/cde_app_root/dt/appconfig/types/C/Ximian.dt.in b/data/cde_app_root/dt/appconfig/types/C/Ximian.dt.in
deleted file mode 100644
index 3815769b7e..0000000000
--- a/data/cde_app_root/dt/appconfig/types/C/Ximian.dt.in
+++ /dev/null
@@ -1,30 +0,0 @@
-DATA_ATTRIBUTES XimianAppgroup
-{
- ACTIONS OpenInPlace, OpenNewView
- ICON Ximian
- DESCRIPTION Double-click to open the Ximian application group
-}
-
-DATA_CRITERIA XimianAppgroupCriterial
-{
- DATA_ATTRIBUTES_NAME XimianAppgroup
- MODE d
- PATH_PATTERN */appmanager/*/Ximian
-}
-
-ACTION Open
-{
- LABEL Open
- ARG_TYPE XimianAppgroup
- TYPE MAP
- MAP_ACTION OpenAppGroup
-}
-
-ACTION Evolution
-{
- LABEL Ximian Evolution
- TYPE COMMAND
- EXEC_STRING @prefix@/bin/evolution-nognome
- ICON Evolution
- WINDOW_TYPE NO_STDIO
-}
diff --git a/data/cde_app_root/dt/appconfig/types/Makefile.am b/data/cde_app_root/dt/appconfig/types/Makefile.am
deleted file mode 100644
index 42ffacc264..0000000000
--- a/data/cde_app_root/dt/appconfig/types/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-SUBDIRS = C
diff --git a/data/evolution.1 b/data/evolution.1
deleted file mode 100644
index db8b09f715..0000000000
--- a/data/evolution.1
+++ /dev/null
@@ -1,41 +0,0 @@
-.TH "Evolution" "1" "1.2" "Ximian, Inc." "GNOME Applications"
-.SH "NAME"
-.LP
-evolution \- Run Ximian Evolution, a groupware suite for GNOME containing email, calendar, addressbook, and task\-list tools.
-.SH "SYNOPSIS"
-.LP
-evolution [OPTION] ... [URI]
-.SH "DESCRIPTION"
-.LP
-This program is a graphical groupware suite; a single application with email, calendar, address book, and task\-list tools to help you collaborate with other people.
-
-.LP
-This man page is not the central source of help for Evolution. You can find the user's guide by running the application and selecting items from the Help menu. Additional help and security information are available at the Ximian knowledge base online at \fBhttp://support.ximian.com\fR. For help with additional command\-line options, type evolution \-\-help at the command line.
-.SH "EXAMPLES"
-.TP
-\fBevolution\fR
-Runs the application.
-
-.TP
-\fBevolution "%s"\fR
-To use Evolution as the handler for \fImailto:\fR links in GNOME applications, open the GNOME Control Center and set the \fImailto:\fR URL handler to this value. You can do this with non\-GNOME browsers such as Mozilla, by setting the appropriate value in that application's preferences dialogs.
-
-.TP
-\fBevolution mailto:joe@somewhere.net\fR
-Open the message composer, addressing the message to \fIjoe@somewhere.net\fR.
-
-.TP
-\fBevolution evolution:/local/Inbox\fR
-Start the application with the local Inbox folder open.
-
-.TP
-\fBevolution default:mail\fR
-Start the application with the folder mail/calendar/contacts/tasks open.
-
-.TP
-\fBevolution \-\-no\-splash\fR
-Start Evolution, but do not display the start\-up splash screen.
-
-.TP
-\fBevolution \-\-debug\fR=\fIFILENAME\fR
-Start the application, and output debugging messages to FILENAME.
diff --git a/data/evolution.desktop.in.in b/data/evolution.desktop.in.in
deleted file mode 100644
index ce85ca5ec1..0000000000
--- a/data/evolution.desktop.in.in
+++ /dev/null
@@ -1,14 +0,0 @@
-[Desktop Entry]
-Encoding=UTF-8
-_Name=Evolution
-_Comment=The Evolution Groupware Suite
-Exec=evolution-@BASE_VERSION@
-Icon=evolution
-Terminal=false
-Type=Application
-Categories=GNOME;Application;Office;X-Red-Hat-Base;
-StartupNotify=true
-X-GNOME-Bugzilla-Bugzilla=Ximian
-X-GNOME-Bugzilla-Product=Evolution
-X-GNOME-Bugzilla-OtherBinaries=evolution-data-server-1.0;evolution-exchange-storage;evolution-alarm-notify;
-
diff --git a/data/evolution.keys.in.in b/data/evolution.keys.in.in
deleted file mode 100644
index 6baf605235..0000000000
--- a/data/evolution.keys.in.in
+++ /dev/null
@@ -1,24 +0,0 @@
-text/x-vcard
- _description=address card
- default_action_type=component
- default_component_iid=OAFIID:GNOME_Evolution_Addressbook_VCard_Control:@BASE_VERSION@
- short_list_component_iids_for_novice_user_level=OAFIID:GNOME_Evolution_Addressbook_VCard_Control:@BASE_VERSION@
- short_list_component_iids_for_intermediate_user_level=OAFIID:GNOME_Evolution_Addressbook_VCard_Control:@BASE_VERSION@
- short_list_component_iids_for_hacker_user_level=OAFIID:GNOME_Evolution_Addressbook_VCard_Control:@BASE_VERSION@
-
-text/x-calendar
- _description=calendar information
- default_action_type=component
- default_component_iid=OAFIID:GNOME_Evolution_Calendar_iTip_Control:@BASE_VERSION@
- short_list_component_iids_for_novice_user_level=OAFIID:GNOME_Evolution_Calendar_iTip_Control:@BASE_VERSION@
- short_list_component_iids_for_intermediate_user_level=OAFIID:GNOME_Evolution_Calendar_iTip_Control:@BASE_VERSION@
- short_list_component_iids_for_hacker_user_level=OAFIID:GNOME_Evolution_Calendar_iTip_Control:@BASE_VERSION@
-
-text/calendar
- _description=calendar information
- default_action_type=component
- default_component_iid=OAFIID:GNOME_Evolution_Calendar_iTip_Control:@BASE_VERSION@
- short_list_component_iids_for_novice_user_level=OAFIID:GNOME_Evolution_Calendar_iTip_Control:@BASE_VERSION@
- short_list_component_iids_for_intermediate_user_level=OAFIID:GNOME_Evolution_Calendar_iTip_Control:@BASE_VERSION@
- short_list_component_iids_for_hacker_user_level=OAFIID:GNOME_Evolution_Calendar_iTip_Control:@BASE_VERSION@
-
diff --git a/data/evolution.mime b/data/evolution.mime
deleted file mode 100644
index f72de6399b..0000000000
--- a/data/evolution.mime
+++ /dev/null
@@ -1,5 +0,0 @@
-text/x-vcard
- ext: vcf
-
-text/calendar
- ext: ics \ No newline at end of file
diff --git a/designs/ChangeLog b/designs/ChangeLog
deleted file mode 100644
index b8eec55373..0000000000
--- a/designs/ChangeLog
+++ /dev/null
@@ -1,36 +0,0 @@
-2003-01-15 Anna Marie Dirks <anna@ximian.com>
-
- * OOA/Comments: Added this file to store discussion of OOA designs
-
-2003-01-09 Anna Marie Dirks <anna@ximian.com>
-
- * OOA/oooa_question.png: Updated question test
-
-
-
-2003-01-09 Anna Marie Dirks <anna@ximian.com>
-
- * OOA/outlook_screenshot.png: Screenshot of outlook's OOOA Config dialog.
-
- * OOA/outlook_question.png: Screenshot of outlook's OOOA question dialog
-
- * OOA/spec.txt: Spec file for Out of Office Assistant
-
- * OOA/oooa_screenshot.png: Screenshot of mockup of OOOA Config dialog.
-
- * OOA/oooa_question.png: Screenshot of mockup of question dialog
-
- * OOA/ooa.glade: Glade file for the Out of Office Assistant
-
- *OOA : New directory
-
-
-2003-01-06 Anna Marie Dirks <anna@ximian.com>
-
- * proposal.png : Changed help message
-
-
-2003-01-03 Anna Marie Dirks <anna@ximian.com>
-
- * read_receipts: New directory.
-
diff --git a/designs/OOA/Comments b/designs/OOA/Comments
deleted file mode 100644
index 83d3c2900d..0000000000
--- a/designs/OOA/Comments
+++ /dev/null
@@ -1,3 +0,0 @@
-Hi! Please feel free to add your comments and questions about this
-design here. Be sure to include your name, your email address, and the
-date/time at which you are commenting. Thanks! -Anna
diff --git a/designs/OOA/ooa.glade b/designs/OOA/ooa.glade
deleted file mode 100644
index 386ad85810..0000000000
--- a/designs/OOA/ooa.glade
+++ /dev/null
@@ -1,488 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkWindow" id="Out of Office Assistant">
- <property name="visible">True</property>
- <property name="title" translatable="yes">Out of Office Assistant</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
-
- <child>
- <widget class="GtkVBox" id="vbox1">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkHBox" id="hbox2">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkImage" id="image2">
- <property name="visible">True</property>
- <property name="stock">gtk-dialog-info</property>
- <property name="icon_size">5</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label6">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;small&gt;The message specified below will be automatically sent to each person who sends
-mail to you while you are out of the office.&lt;/small&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table1">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Status:&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkRadioButton" id="radiobutton1">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">I am currently in the office</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkRadioButton" id="radiobutton2">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">I am currently out of the office</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">radiobutton1</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="frame1">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkVBox" id="vbox2">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow1">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_OUT</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
- <child>
- <widget class="GtkTextView" id="textview1">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="justification">GTK_JUSTIFY_LEFT</property>
- <property name="wrap_mode">GTK_WRAP_NONE</property>
- <property name="cursor_visible">True</property>
- <property name="pixels_above_lines">0</property>
- <property name="pixels_below_lines">0</property>
- <property name="pixels_inside_wrap">0</property>
- <property name="left_margin">0</property>
- <property name="right_margin">0</property>
- <property name="indent">0</property>
- <property name="text" translatable="yes"></property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Out of Office Message:&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-<widget class="GtkWindow" id="window2">
- <property name="visible">True</property>
- <property name="title" translatable="yes">Out of Office</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
-
- <child>
- <widget class="GtkVBox" id="vbox3">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkHBox" id="hbox3">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkImage" id="image3">
- <property name="visible">True</property>
- <property name="stock">gtk-dialog-question</property>
- <property name="icon_size">6</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label7">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Currently, your status is &quot;Out of the Office&quot;. &lt;/b&gt;
-
-Would you like to change your status to &quot;In the Office&quot;? </property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.69</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHSeparator" id="hseparator1">
- <property name="visible">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHButtonBox" id="hbuttonbox1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkButton" id="button1">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment2">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox5">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child>
- <widget class="GtkImage" id="image6">
- <property name="visible">True</property>
- <property name="stock">gtk-no</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label9">
- <property name="visible">True</property>
- <property name="label" translatable="yes">No, Don't Change Status</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="button2">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment1">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox4">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child>
- <widget class="GtkImage" id="image5">
- <property name="visible">True</property>
- <property name="stock">gtk-yes</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label8">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Yes, Change Status</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/designs/OOA/oooa_question.png b/designs/OOA/oooa_question.png
deleted file mode 100644
index 086d65ac78..0000000000
--- a/designs/OOA/oooa_question.png
+++ /dev/null
Binary files differ
diff --git a/designs/OOA/oooa_screenshot.png b/designs/OOA/oooa_screenshot.png
deleted file mode 100644
index d458b34360..0000000000
--- a/designs/OOA/oooa_screenshot.png
+++ /dev/null
Binary files differ
diff --git a/designs/OOA/outlook_question.png b/designs/OOA/outlook_question.png
deleted file mode 100644
index 23e0fdbd1f..0000000000
--- a/designs/OOA/outlook_question.png
+++ /dev/null
Binary files differ
diff --git a/designs/OOA/outlook_screenshot.png b/designs/OOA/outlook_screenshot.png
deleted file mode 100644
index a90aab07b0..0000000000
--- a/designs/OOA/outlook_screenshot.png
+++ /dev/null
Binary files differ
diff --git a/designs/OOA/spec.txt b/designs/OOA/spec.txt
deleted file mode 100644
index e369578823..0000000000
--- a/designs/OOA/spec.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-Out of the Office Assistant Spec:
-
-0) Screenshots Included:
-
-a) oooa_screenshot.png : A screenshot of my mockup of the Out of Office configuration dialog.
-b) oooa_question.png : A screenshot of my mockup of the Out of Office question dialog. (Used to switch status back to "in the office".)
-c) outlook_screenshot.png : Screenshot of Outlook's implementation of the OOO configuration dialog.
-d) outlook_question.png : Screenshot of Outlook's OOO question dialog.
-
-1) Location:
-
-The OOOA Configuration dialog should be accessible from the "Tools" menu.
-
-2) Defaults:
-
-When the user opens the OOOA Configuration dialog, the value of the "Status:" parameter should be "I am currently in the office".
-
-3) Use:
-
-The user may toggle her in/out of the office status using the "Status:" radiobuttons.
-
-The user may specify an out of the office message in the text box provided. This message will be sent once to each sender who sends an email to the user while the user's status is "out of the office".
-
-FIXME: What event triggers the "Do you want to change status?" dialog?
-
-
-
-
-
diff --git a/designs/read_receipts/.cvsignore b/designs/read_receipts/.cvsignore
deleted file mode 100644
index 751553b3ac..0000000000
--- a/designs/read_receipts/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-*.bak
diff --git a/designs/read_receipts/Comments b/designs/read_receipts/Comments
deleted file mode 100644
index 83d3c2900d..0000000000
--- a/designs/read_receipts/Comments
+++ /dev/null
@@ -1,3 +0,0 @@
-Hi! Please feel free to add your comments and questions about this
-design here. Be sure to include your name, your email address, and the
-date/time at which you are commenting. Thanks! -Anna
diff --git a/designs/read_receipts/notification-of-rr-request.jpg b/designs/read_receipts/notification-of-rr-request.jpg
deleted file mode 100644
index 588aa1e656..0000000000
--- a/designs/read_receipts/notification-of-rr-request.jpg
+++ /dev/null
Binary files differ
diff --git a/designs/read_receipts/proposal.png b/designs/read_receipts/proposal.png
deleted file mode 100644
index 6a1a4a4faa..0000000000
--- a/designs/read_receipts/proposal.png
+++ /dev/null
Binary files differ
diff --git a/designs/read_receipts/read.glade b/designs/read_receipts/read.glade
deleted file mode 100644
index 358239db0c..0000000000
--- a/designs/read_receipts/read.glade
+++ /dev/null
@@ -1,339 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkWindow" id="Read Receipts">
- <property name="visible">True</property>
- <property name="title" translatable="yes">Read Receipts</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
-
- <child>
- <widget class="GtkVBox" id="vbox7">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkHBox" id="hbox4">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkImage" id="image3">
- <property name="visible">True</property>
- <property name="stock">gtk-dialog-info</property>
- <property name="icon_size">5</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label30">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;small&gt;This page allows you to choose if you want to be notified via a read receipt when a message you
-sent is read, and to specify what Evolution should do when someone requests a receipt from you.&lt;/small&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox10">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkHBox" id="hbox6">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label36">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Sending Email:&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="checkbutton8">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Request a read receipt for all messages I send</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="frame6">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
- <child>
- <widget class="GtkVBox" id="vbox9">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkHBox" id="hbox5">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label33">
- <property name="visible">True</property>
- <property name="label" translatable="yes">When you receive an email with a read receipt request, what should Evolution do?</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkRadioButton" id="radiobutton11">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Never send back a read receipt</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkRadioButton" id="radiobutton12">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Ask me if I want to send back a read receipt</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">radiobutton11</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table2">
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">0</property>
- <property name="column_spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="label34">
- <property name="visible">True</property>
- <property name="label" translatable="yes"> </property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkRadioButton" id="radiobutton13">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Always send back a read reciept</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">radiobutton11</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="checkbutton7">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Unless the message is sent to a mailing list, and not to me personally</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label35">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Receiving Email&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/designs/read_receipts/read.gladep b/designs/read_receipts/read.gladep
deleted file mode 100644
index af366b66a7..0000000000
--- a/designs/read_receipts/read.gladep
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd">
-
-<glade-project>
- <name>read</name>
- <program_name>read</program_name>
-</glade-project>
diff --git a/designs/read_receipts/read_receipt_options.jpg b/designs/read_receipts/read_receipt_options.jpg
deleted file mode 100644
index 5b1462d31f..0000000000
--- a/designs/read_receipts/read_receipt_options.jpg
+++ /dev/null
Binary files differ
diff --git a/designs/read_receipts/receipt.jpg b/designs/read_receipts/receipt.jpg
deleted file mode 100644
index 854ca4ae78..0000000000
--- a/designs/read_receipts/receipt.jpg
+++ /dev/null
Binary files differ
diff --git a/designs/read_receipts/secure_options.jpg b/designs/read_receipts/secure_options.jpg
deleted file mode 100644
index b82562fb9b..0000000000
--- a/designs/read_receipts/secure_options.jpg
+++ /dev/null
Binary files differ
diff --git a/designs/read_receipts/spec.txt b/designs/read_receipts/spec.txt
deleted file mode 100644
index dd8fb7b832..0000000000
--- a/designs/read_receipts/spec.txt
+++ /dev/null
@@ -1,67 +0,0 @@
-Specification for Read Receipts:
-
-0) Screenshots: The screenshots included in this directory are:
-
-a) proposal.png : My proposal for the RR page of the settings dialog
-
-b) read_receipt_options.jpg : Outlook (Express)'s RR settings dialog
-
-c) security_options.jpg : Outlook (Express)'s Secure Receipts settings
-dialog
-
-d) notification-of-rr-request.jpg : The question dialog which appears
-if you have configured outlook to ask you before sending read
-receipts.
-
-3) receipt.jpg: The receipt itself, as found in my inbox.
-
-
-1) The Read Receipt Settings Dialog:
-
-a) Location: Should be added to the "Mail Preferences" section of the
-global settings dialog, in its own tab, entitled "Receipts".
-
-b) Help: Needs to be accompanied by a detailed help entry which
-explains what a read receipt is. I couldn't fit much of an explanation
-into the interface (not that the interface is a good place for this
-explanation, anyway.)
-
-c) Insensitive widgets: Unless the "Always send back a read receipt"
-option is selected, the checkbox beneath it ("Unless the message is
-sent to a mailing list, etc") should be insensitive.
-
-d) Known problems: The text as shown in my mockup could be improved. I
-would be more than happy to have Aaron (and anyone else who'd like to
-help) assist me in making the text more clear.
-
-
-2) Read Receipt Messages:
-
-a) Appearance: Read Receipt messages should appear in your inbox with
-the subject line: "Read:" (or "Message Read:"); "Read:" is what
-Outlook does, I think expanding it to "Message Read:" is a bit more
-clear.
-
-b) The text of this message should tell you: i) what time you sent the
-mail, ii) what the subject of your email was iii) what the email
-address of your recipient is iv) what time your message was read by
-its recipient
-
-c) When as user has selected to be asked before sending a read
-receipt, he should be presented with a question dialog (including
-"Yes, Send" and "No, Don't Send" buttons.) The dialog should inform
-the user that a read reciept has been requested by the sender of the
-mail in question, and ask if s/he want to send such a receipt.
-
-
-3) Secure Receipts: Outlook includes support for "secure receipts",
-and I am unsure of whether or not this is something we can support. My
-hunch is that secure receipts are S/MIME related, and hence not
-applicable to Evo at present.
-
-The secure receipt settings, in Outlook,are launched by pressing the
-"Secure Receipts..." button in the RR setting dialog. The
-secure_options.jpg screenshot shows these options.
-
-Jeff? Michael? Dan? Anyone have an idea of what this secure receipt
-stuff is, and if we need to include it in our implementation?
diff --git a/devel-docs/.cvsignore b/devel-docs/.cvsignore
deleted file mode 100644
index d436efd0f7..0000000000
--- a/devel-docs/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-Makefile.in
-Makefile
-
diff --git a/devel-docs/Makefile.am b/devel-docs/Makefile.am
deleted file mode 100644
index 74a5ff5b60..0000000000
--- a/devel-docs/Makefile.am
+++ /dev/null
@@ -1,3 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-SUBDIRS=camel
diff --git a/devel-docs/camel/.cvsignore b/devel-docs/camel/.cvsignore
deleted file mode 100644
index 56d9506207..0000000000
--- a/devel-docs/camel/.cvsignore
+++ /dev/null
@@ -1,12 +0,0 @@
-sgml
-html
-Makefile.in
-Makefile
-camel.signals
-camel.hierarchy
-camel.args
-camel-decl.txt
-camel-unused.txt
-camel.html
-camel-decl-list.txt
-
diff --git a/devel-docs/camel/Makefile.am b/devel-docs/camel/Makefile.am
deleted file mode 100644
index 1c76a6c05e..0000000000
--- a/devel-docs/camel/Makefile.am
+++ /dev/null
@@ -1,101 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-# The name of the module.
-DOC_MODULE=camel
-
-# The top-level SGML file.
-DOC_MAIN_SGML_FILE=camel-docs.sgml
-
-# The directory containing the source code (if it contains documentation).
-DOC_SOURCE_DIR=$(top_srcdir)/camel
-
-CFLAGS=`gtk-config --cflags gtk`
-LDFLAGS="-lcamel `gtk-config --libs gtk` "
-
-
-HTML_DIR=$(datadir)/gnome/html/evolution-$(BASE_VERSION)
-
-
-
-TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
-
-tmpl_sources = \
- tmpl/camel-data-wrapper.sgml \
- tmpl/camel-folder.sgml \
- tmpl/camel-mime-message.sgml \
- tmpl/camel-mime-part.sgml \
- tmpl/camel-recipient.sgml \
- tmpl/camel-service.sgml \
- tmpl/camel-store.sgml \
- tmpl/camel-stream.sgml
-
-
-camel_docdir = $(HTML_DIR)
-camel_doc_DATA = \
- camel.html \
- camel.hierarchy \
- camel.types \
- camel-scan.c \
- camel-decl.txt \
- camel-sections.txt
-
-EXTRA_DIST = $(camel_doc_DATA)
-
-camel.html: html/book1.html
- -cd $(srcdir) && cp html/book1.html camel.html
-
-html/book1.html: sgml/camel-doc.bottom
- $(MAKE) html
-
-sgml/camel-doc.bottom: $(tmpl_sources)
- $(MAKE) sgml
-
-camel-scan.c:
-
-scan: camel-scan.c
- CFLAGS=$(CFLAGS) LDFLAGS=$(LDFLAGS) gtkdoc-scanobj --module=$(DOC_MODULE)
- gtkdoc-scan --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR)
-
-templates: scan
- gtkdoc-mktmpl --module=$(DOC_MODULE)
-
-sgml:
- gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR)
-
-html:
- if ! test -d html ; then mkdir html ; fi
- -cd html && gtkdoc-mkhtml $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
-
-clean-local:
- rm -f *~ *.bak *.hierarchy *.signals *.args *-unused.txt camel.html
-
-maintainer-clean-local: clean
- rm -rf sgml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt Makefile.in
-
-install-data-local:
- $(mkinstalldirs) $(TARGET_DIR)
- (installfiles=`echo $(srcdir)/html/*.html`; \
- if test "$$installfiles" = '$(srcdir)/html/*.html'; \
- then echo '-- Nothing to install' ; \
- else \
- for i in $$installfiles; do \
- echo '-- Installing '$$i ; \
- $(INSTALL_DATA) $$i $(TARGET_DIR); \
- done; \
- echo '-- Installing $(srcdir)/html/index.sgml' ; \
- $(INSTALL_DATA) $(srcdir)/html/index.sgml $(TARGET_DIR); \
- echo '-- Fixing Crossreferences' ; \
- gtkdoc-fixxref --module=$(DOC_MODULE) --html-dir=$(HTML_DIR)|| true; \
- fi)
-
-dist-hook:
- mkdir $(distdir)/html
- mkdir $(distdir)/sgml
- mkdir $(distdir)/tmpl
- -cp $(srcdir)/html/*.html $(srcdir)/html/*.css $(distdir)/html
- -cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl
- -cp $(srcdir)/sgml/*.sgml $(distdir)/sgml
- -cp $(srcdir)/sgml/*.bottom $(srcdir)/sgml/*.top $(distdir)/sgml
-
-
-.PHONY : html sgml templates scan
diff --git a/devel-docs/camel/README_AND_TODO.txt b/devel-docs/camel/README_AND_TODO.txt
deleted file mode 100644
index 5feeb1e4e9..0000000000
--- a/devel-docs/camel/README_AND_TODO.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-Camel is currently (conceptualy) separated in four parts:
-
-* the session handling
-* the storage mechanism.
-* the (mime) message handling.
-* some general utilities class/functions.
-
-
-
-* Session handling
-------------------
-
-(This is not gnome session managing related)
-CamelSession is an object used to store some parameters on a user
-basis. This can be a permanent (fs based) or volatile
-(ram only) storage depending on user preferences.
-The session object is, for example, responsible for
-remembering authentication datas during application lifetime.
-It is also responsible for selecting and loading providers
-corresponding to protocols. In the case where only one
-provider exists for a given protocol, the task is trivial,
-but when multiple providers exist for a given protocol, the
-user can choose their prefered one. Given its relationship
-with providers, the session object is also used to instanciate
-a store given an URL.
-
-Associated Classes:
- CamelSession
- implementation: 5%
-
-Associated Files:
- camel-provider.[ch]
- implementation: 2.5% (a struct in camel-provider.h)
-
-
-* the storage mechanism.
-------------------------
-
-The storage mechanism is mainly represented by
-the Store class and the Folder class.
-* the (mime) message handling.
-* some general utilities class/functions.
-
diff --git a/devel-docs/camel/camel-docs.sgml b/devel-docs/camel/camel-docs.sgml
deleted file mode 100644
index 33c6623731..0000000000
--- a/devel-docs/camel/camel-docs.sgml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!doctype book PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [
-<!entity CamelDataWrapper SYSTEM "sgml/camel-data-wrapper.sgml">
-<!entity CamelFolder SYSTEM "sgml/camel-folder.sgml">
-<!entity CamelMimeMessage SYSTEM "sgml/camel-mime-message.sgml">
-<!entity CamelMimePart SYSTEM "sgml/camel-mime-part.sgml">
-<!entity CamelRecipient SYSTEM "sgml/camel-recipient.sgml">
-<!entity CamelService SYSTEM "sgml/camel-service.sgml">
-<!entity CamelStore SYSTEM "sgml/camel-store.sgml">
-<!entity CamelStream SYSTEM "sgml/camel-stream.sgml">
-]>
-
-<book>
- <bookinfo>
- <title>Camel Messaging Library Reference Manual</title>
- </bookinfo>
-
- <chapter id="camel-objects">
- <title>Camel Objects</title>
- &CamelMimeMessage;
- &CamelService;
- &CamelStore;
- &CamelFolder;
- &CamelMimePart;
- &CamelDataWrapper;
- &CamelRecipient;
-
- </chapter>
-</book>
diff --git a/devel-docs/camel/camel-sections.txt b/devel-docs/camel/camel-sections.txt
deleted file mode 100644
index 1f6d45c03c..0000000000
--- a/devel-docs/camel/camel-sections.txt
+++ /dev/null
@@ -1,154 +0,0 @@
-
-<INCLUDE>gnome.h</INCLUDE>
-<INCLUDE>camel-data-wrapper.h</INCLUDE>
-
-
-<SECTION>
-<FILE>camel-data-wrapper</FILE>
-CamelDataWrapper
-<TITLE>CamelDataWrapper</TITLE>
-camel_data_wrapper_write_to_stream
-<SUBSECTION Standard>
-CAMEL_DATA_WRAPPER
-camel_data_wrapper_get_type
-CAMEL_DATA_WRAPPER_CLASS
-</SECTION>
-
-<SECTION>
-<FILE>camel-recipient</FILE>
-CamelRecipientTable
-<TITLE>CamelRecipientTable</TITLE>
-camel_recipient_table_new
-camel_recipient_table_get
-camel_recipient_table_add
-camel_recipient_table_add_list
-camel_recipient_table_remove
-camel_recipient_table_ref
-camel_recipient_table_unref
-</SECTION>
-
-<SECTION>
-<FILE>camel-mime-part</FILE>
-CamelMimePart
-<TITLE>CamelMimePart</TITLE>
-camel_mime_part_add_header
-camel_mime_part_set_content_object
-camel_mime_part_set_filename
-camel_mime_part_get_disposition
-camel_mime_part_get_content_MD5
-camel_mime_part_get_encoding
-camel_mime_part_set_header_lines
-camel_mime_part_get_content_object
-camel_mime_part_get_content_id
-camel_mime_part_set_description
-camel_mime_part_set_text
-camel_mime_part_set_encoding
-camel_mime_part_set_disposition
-camel_mime_part_remove_header
-camel_mime_part_get_filename
-camel_mime_part_get_content_languages
-camel_mime_part_set_content_languages
-camel_mime_part_get_header_lines
-camel_mime_part_get_description
-camel_mime_part_get_header
-<SUBSECTION Standard>
-CAMEL_MIME_PART
-camel_mime_part_get_type
-CAMEL_MIME_PART_CLASS
-</SECTION>
-
-
-
-<SECTION>
-<FILE>camel-mime-message</FILE>
-CamelMimeMessage
-<TITLE>CamelMimeMessage</TITLE>
-camel_mime_message_remove_recipient
-camel_mime_message_get_recipients
-camel_mime_message_set_flag
-camel_mime_message_set_subject
-camel_mime_message_get_reply_to
-camel_mime_message_get_from
-camel_mime_message_set_reply_to
-camel_mime_message_get_sent_date
-camel_mime_message_new_with_session
-camel_mime_message_add_recipient
-camel_mime_message_get_subject
-camel_mime_message_set_from
-camel_mime_message_get_flag
-camel_mime_message_get_message_number
-camel_mime_message_get_received_date
-camel_mime_message_set_received_date
-<SUBSECTION Standard>
-CAMEL_MIME_MESSAGE
-camel_mime_message_get_type
-CAMEL_MIME_MESSAGE_CLASS
-</SECTION>
-
-
-<SECTION>
-<FILE>camel-folder</FILE>
-CamelFolder
-<TITLE>CamelFolder</TITLE>
-camel_folder_get_folder
-camel_folder_create
-camel_folder_delete
-camel_folder_delete_messages
-camel_folder_get_parent_folder
-camel_folder_get_parent_store
-camel_folder_get_mode
-camel_folder_list_subfolders
-<SUBSECTION Standard>
-CAMEL_FOLDER
-camel_folder_get_type
-CAMEL_FOLDER_CLASS
-</SECTION>
-
-<SECTION>
-<FILE>camel-service</FILE>
-CamelService
-<TITLE>CamelService</TITLE>
-camel_service_connect
-camel_service_is_connected
-camel_service_connect_to_with_login_passwd
-camel_service_connect_to_with_login_passwd_port
-camel_service_get_url
-<SUBSECTION Standard>
-CAMEL_SERVICE
-camel_service_get_type
-CAMEL_SERVICE_CLASS
-</SECTION>
-
-<SECTION>
-<FILE>camel-store</FILE>
-CamelStore
-<TITLE>CamelStore</TITLE>
-camel_store_get_separator
-camel_store_get_folder
-<SUBSECTION Standard>
-CAMEL_STORE
-camel_store_get_type
-CAMEL_STORE_CLASS
-</SECTION>
-
-
-<SECTION>
-<FILE>camel-stream</FILE>
-CamelStream
-<TITLE>CamelStream</TITLE>
-camel_stream_seek
-camel_stream_write
-camel_stream_flush
-camel_stream_eos
-camel_stream_write_string
-camel_stream_close
-camel_stream_write_strings
-camel_stream_read
-camel_stream_available
-<SUBSECTION Standard>
-CAMEL_STREAM
-camel_stream_get_type
-CAMEL_STREAM_CLASS
-</SECTION>
-
-
diff --git a/devel-docs/camel/camel.types b/devel-docs/camel/camel.types
deleted file mode 100644
index 93142d8692..0000000000
--- a/devel-docs/camel/camel.types
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <gtk/gtk.h>
-#include <camel/camel-data-wrapper.h>
-camel_data_wrapper_get_type
-camel_folder_get_type
-camel_mime_message_get_type
-camel_mime_part_get_type
-camel_service_get_type
-camel_store_get_type
-camel_stream_get_type
diff --git a/devel-docs/camel/tmpl/.cvsignore b/devel-docs/camel/tmpl/.cvsignore
deleted file mode 100644
index 29db8d052d..0000000000
--- a/devel-docs/camel/tmpl/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-camel-unused.sgml
-
diff --git a/devel-docs/camel/tmpl/camel-data-wrapper.sgml b/devel-docs/camel/tmpl/camel-data-wrapper.sgml
deleted file mode 100644
index 6fce9eb128..0000000000
--- a/devel-docs/camel/tmpl/camel-data-wrapper.sgml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-CamelDataWrapper
-
-<!-- ##### SECTION Short_Description ##### -->
-data container with streaming methods
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-A CamelDataWrapper is wrapper around data which can save them to a stream
-and restore them from a stream.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### FUNCTION camel_data_wrapper_write_to_stream ##### -->
-<para>
-
-</para>
-
-@data_wrapper:
-@stream:
-
-
diff --git a/devel-docs/camel/tmpl/camel-folder.sgml b/devel-docs/camel/tmpl/camel-folder.sgml
deleted file mode 100644
index 882d63499c..0000000000
--- a/devel-docs/camel/tmpl/camel-folder.sgml
+++ /dev/null
@@ -1,96 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-CamelFolder
-
-<!-- ##### SECTION Short_Description ##### -->
-Represents a folder of messages on a store.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-CamelFolder represents a folder in a message store.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### STRUCT CamelFolder ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION camel_folder_get_folder ##### -->
-<para>
-
-</para>
-
-@folder:
-@folder_name:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_folder_create ##### -->
-<para>
-
-</para>
-
-@folder:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_folder_delete ##### -->
-<para>
-
-</para>
-
-@folder:
-@recurse:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_folder_delete_messages ##### -->
-<para>
-
-</para>
-
-@folder:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_folder_get_parent_folder ##### -->
-<para>
-
-</para>
-
-@folder:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_folder_get_parent_store ##### -->
-<para>
-
-</para>
-
-@folder:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_folder_get_mode ##### -->
-<para>
-
-</para>
-
-@folder:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_folder_list_subfolders ##### -->
-<para>
-
-</para>
-
-@folder:
-@Returns:
-
-
diff --git a/devel-docs/camel/tmpl/camel-mime-message.sgml b/devel-docs/camel/tmpl/camel-mime-message.sgml
deleted file mode 100644
index 704f3d3572..0000000000
--- a/devel-docs/camel/tmpl/camel-mime-message.sgml
+++ /dev/null
@@ -1,171 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-CamelMimeMessage
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### STRUCT CamelMimeMessage ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION camel_mime_message_remove_recipient ##### -->
-<para>
-
-</para>
-
-@mime_message:
-@recipient_type:
-@recipient:
-
-
-<!-- ##### FUNCTION camel_mime_message_get_recipients ##### -->
-<para>
-
-</para>
-
-@mime_message:
-@recipient_type:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_mime_message_set_flag ##### -->
-<para>
-
-</para>
-
-@mime_message:
-@flag:
-@value:
-
-
-<!-- ##### FUNCTION camel_mime_message_set_subject ##### -->
-<para>
-
-</para>
-
-@mime_message:
-@subject:
-
-
-<!-- ##### FUNCTION camel_mime_message_get_reply_to ##### -->
-<para>
-
-</para>
-
-@mime_message:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_mime_message_get_from ##### -->
-<para>
-
-</para>
-
-@mime_message:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_mime_message_set_reply_to ##### -->
-<para>
-
-</para>
-
-@mime_message:
-@reply_to:
-
-
-<!-- ##### FUNCTION camel_mime_message_get_sent_date ##### -->
-<para>
-
-</para>
-
-@mime_message:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_mime_message_new_with_session ##### -->
-<para>
-
-</para>
-
-@session:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_mime_message_add_recipient ##### -->
-<para>
-
-</para>
-
-@mime_message:
-@recipient_type:
-@recipient:
-
-
-<!-- ##### FUNCTION camel_mime_message_get_subject ##### -->
-<para>
-
-</para>
-
-@mime_message:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_mime_message_set_from ##### -->
-<para>
-
-</para>
-
-@mime_message:
-@from:
-
-
-<!-- ##### FUNCTION camel_mime_message_get_flag ##### -->
-<para>
-
-</para>
-
-@mime_message:
-@flag:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_mime_message_get_message_number ##### -->
-<para>
-
-</para>
-
-@mime_message:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_mime_message_get_received_date ##### -->
-<para>
-
-</para>
-
-@mime_message:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_mime_message_set_received_date ##### -->
-<para>
-
-</para>
-
-@mime_message:
-@received_date:
-
-
diff --git a/devel-docs/camel/tmpl/camel-mime-part.sgml b/devel-docs/camel/tmpl/camel-mime-part.sgml
deleted file mode 100644
index 2db158b25f..0000000000
--- a/devel-docs/camel/tmpl/camel-mime-part.sgml
+++ /dev/null
@@ -1,151 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-CamelMimePart
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### FUNCTION camel_mime_part_set_filename ##### -->
-<para>
-
-</para>
-
-@mime_part:
-@filename:
-
-
-<!-- ##### FUNCTION camel_mime_part_get_disposition ##### -->
-<para>
-
-</para>
-
-@mime_part:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_mime_part_get_content_MD5 ##### -->
-<para>
-
-</para>
-
-@mime_part:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_mime_part_get_encoding ##### -->
-<para>
-
-</para>
-
-@mime_part:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_mime_part_set_header_lines ##### -->
-<para>
-
-</para>
-
-@mime_part:
-@header_lines:
-
-
-<!-- ##### FUNCTION camel_mime_part_get_content_id ##### -->
-<para>
-
-</para>
-
-@mime_part:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_mime_part_set_description ##### -->
-<para>
-
-</para>
-
-@mime_part:
-@description:
-
-
-<!-- ##### FUNCTION camel_mime_part_set_text ##### -->
-<para>
-
-</para>
-
-@camel_mime_part:
-@text:
-
-
-<!-- ##### FUNCTION camel_mime_part_set_encoding ##### -->
-<para>
-
-</para>
-
-@mime_part:
-@encoding:
-
-
-<!-- ##### FUNCTION camel_mime_part_set_disposition ##### -->
-<para>
-
-</para>
-
-@mime_part:
-@disposition:
-
-
-<!-- ##### FUNCTION camel_mime_part_get_filename ##### -->
-<para>
-
-</para>
-
-@mime_part:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_mime_part_get_content_languages ##### -->
-<para>
-
-</para>
-
-@mime_part:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_mime_part_set_content_languages ##### -->
-<para>
-
-</para>
-
-@mime_part:
-@content_languages:
-
-
-<!-- ##### FUNCTION camel_mime_part_get_header_lines ##### -->
-<para>
-
-</para>
-
-@mime_part:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_mime_part_get_description ##### -->
-<para>
-
-</para>
-
-@mime_part:
-@Returns:
-
-
diff --git a/devel-docs/camel/tmpl/camel-recipient.sgml b/devel-docs/camel/tmpl/camel-recipient.sgml
deleted file mode 100644
index 4af84cf58e..0000000000
--- a/devel-docs/camel/tmpl/camel-recipient.sgml
+++ /dev/null
@@ -1,88 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-CamelRecipientTable
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### STRUCT CamelRecipientTable ##### -->
-<para>
-
-</para>
-
-@recipient_hash_table:
-@ref_count:
-
-<!-- ##### FUNCTION camel_recipient_table_new ##### -->
-<para>
-
-</para>
-
-@Returns:
-
-
-<!-- ##### FUNCTION camel_recipient_table_unref ##### -->
-<para>
-
-</para>
-
-@recipient_table:
-
-
-<!-- ##### FUNCTION camel_recipient_table_get ##### -->
-<para>
-
-</para>
-
-@recipient_table:
-@recipient_type:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_recipient_table_add ##### -->
-<para>
-
-</para>
-
-@recipient_table:
-@recipient_type:
-@recipient:
-
-
-<!-- ##### FUNCTION camel_recipient_table_remove ##### -->
-<para>
-
-</para>
-
-@recipient_table:
-@recipient_type:
-@recipient:
-
-
-<!-- ##### FUNCTION camel_recipient_table_add_list ##### -->
-<para>
-
-</para>
-
-@recipient_table:
-@recipient_type:
-@recipient_list:
-
-
-<!-- ##### FUNCTION camel_recipient_table_ref ##### -->
-<para>
-
-</para>
-
-@recipient_table:
-
-
diff --git a/devel-docs/camel/tmpl/camel-service.sgml b/devel-docs/camel/tmpl/camel-service.sgml
deleted file mode 100644
index 5b51ea902e..0000000000
--- a/devel-docs/camel/tmpl/camel-service.sgml
+++ /dev/null
@@ -1,72 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-CamelService
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### STRUCT CamelService ##### -->
-<para>
-
-</para>
-
-@e:
-
-<!-- ##### FUNCTION camel_service_connect ##### -->
-<para>
-
-</para>
-
-@service:
-
-
-<!-- ##### FUNCTION camel_service_is_connected ##### -->
-<para>
-
-</para>
-
-@service:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_service_connect_to_with_login_passwd ##### -->
-<para>
-
-</para>
-
-@service:
-@host:
-@login:
-@passwd:
-
-
-<!-- ##### FUNCTION camel_service_connect_to_with_login_passwd_port ##### -->
-<para>
-
-</para>
-
-@service:
-@host:
-@login:
-@passwd:
-@port:
-
-
-<!-- ##### FUNCTION camel_service_get_url ##### -->
-<para>
-
-</para>
-
-@service:
-@Returns:
-
-
diff --git a/devel-docs/camel/tmpl/camel-store.sgml b/devel-docs/camel/tmpl/camel-store.sgml
deleted file mode 100644
index 2882c09986..0000000000
--- a/devel-docs/camel/tmpl/camel-store.sgml
+++ /dev/null
@@ -1,45 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-CamelStore
-
-<!-- ##### SECTION Short_Description ##### -->
-
-A class representing a message (local or distant) repository
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-The store class models a place where messages can be stored and retreived. It can be a local
-store (for example an mbox-style store) or a distant server (for example an POP3 server). Messages are
-not retreived or stored directly with a CamelStore object. Instead, a CamelFolder object must be
-obtained from the store first.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### STRUCT CamelStore ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION camel_store_get_separator ##### -->
-<para>
-
-</para>
-
-@store:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_store_get_folder ##### -->
-<para>
-
-</para>
-
-@store:
-@folder_name:
-@Returns:
-
-
diff --git a/devel-docs/camel/tmpl/camel-stream.sgml b/devel-docs/camel/tmpl/camel-stream.sgml
deleted file mode 100644
index e965db2e45..0000000000
--- a/devel-docs/camel/tmpl/camel-stream.sgml
+++ /dev/null
@@ -1,101 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-CamelStream
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### FUNCTION camel_stream_seek ##### -->
-<para>
-
-</para>
-
-@stream:
-@offset:
-@policy:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_stream_write ##### -->
-<para>
-
-</para>
-
-@stream:
-@buffer:
-@n:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_stream_flush ##### -->
-<para>
-
-</para>
-
-@stream:
-
-
-<!-- ##### FUNCTION camel_stream_eos ##### -->
-<para>
-
-</para>
-
-@stream:
-@Returns:
-
-
-<!-- ##### MACRO camel_stream_write_string ##### -->
-<para>
-
-</para>
-
-@stream:
-@string:
-
-
-<!-- ##### FUNCTION camel_stream_close ##### -->
-<para>
-
-</para>
-
-@stream:
-
-
-<!-- ##### FUNCTION camel_stream_write_strings ##### -->
-<para>
-
-</para>
-
-@stream:
-@Varargs:
-
-
-<!-- ##### FUNCTION camel_stream_read ##### -->
-<para>
-
-</para>
-
-@stream:
-@buffer:
-@n:
-@Returns:
-
-
-<!-- ##### FUNCTION camel_stream_available ##### -->
-<para>
-
-</para>
-
-@stream:
-@Returns:
-
-
diff --git a/devel-docs/misc/errors.txt b/devel-docs/misc/errors.txt
deleted file mode 100644
index df622b6967..0000000000
--- a/devel-docs/misc/errors.txt
+++ /dev/null
@@ -1,168 +0,0 @@
-
-
-Errors can be displayed using e_error_* functions. This will ensure
-that Evolution presents a common and consistent face to the user.
-e_error also automatically does HIG presentation, and allows
-simplification of code.
-
-Errors are defined in an XML file, given an identifier, and some
-formatting information. The XML format is described below.
-
-Translators also see the section "Error template format" for
-information on the substitution format.
-
-To use these functions, include "widgets/misc/e-error.h"
-
-A source build also includes the test program test-error, which may be
-used to test the errors being written. It resides in
-"widgets/misc/test-error".
-
-API
----
-
-The error API is very simple, it consists of 2 main entry points, with
-varags alternatives of each.
-
-struct _GtkWidget *e_error_new(struct _GtkWindow *parent,
- const char *tag, const char *arg0, ...);
-int e_error_run(struct _GtkWindow *parent,
- const char *tag, const char *arg0, ...);
-
-The first is to create a GtkDialog filled out with the error
-information, which can be added to, and/or run asynchronously. It can
-be used as if it was a normal GtkDialog, except the buttons and some
-content will already be setup.
-
-The second is to create this GtkDialog, run it synchronously, get its
-response, and then destroy it.
-
-They share common arguments:
-
-parent: The parent GtkWindow if available. If set, then this window
-will be set as the transient parent for this dialog. It will also
-implictly set the DESTROY_WITH_PARENT flag.
-
-tag: The id of the error message to use as a template. This consists
-of two parts, domain:id, where domain is defined in each error
-definition file, and id is defined for each error itself.
-
-arg0, ...: The arguments to the error template. These consist of a
-NULL terminated array of strings which are inserted into the template
-at the appropriate location(s).
-
-struct _GtkWidget *e_error_newv(struct _GtkWindow *parent,
- const char *tag, const char *arg0, va_list ap);
-int e_error_runv(struct _GtkWindow *parent,
- const char *tag, const char *arg0, va_list ap);
-
-These are identical to above, but can be used from other varags
-functions.
-
-Predefined Errors
------------------
-
-Note that this list is liable to become out of date, but the
-currently known list of system errors follows.
-
-#define E_ERROR_WARNING "builtin:warning"
-#define E_ERROR_ERROR "builtin:error"
-
-Blank templates of each error type which pass the first argument as
-the whole primary text, and the second argument as the whole secondary
-text to be displayed. A single Ok button is available to close the
-window.
-
-#define E_ERROR_WARNING_PRIMARY "builtin:warning-primary"
-#define E_ERROR_ERROR_PRIMARY "builtin:error-primary"
-
-As above, but no secondary text is supplied.
-
-#define E_ERROR_ASK_FILE_EXISTS_OVERWRITE "system:ask-save-file-exists-overwrite"
-
-The user has tried to save a file, but they have chosen an existing
-file. Ask the user if they wish to overwrite the file or cancel the
-operation. The first argument is the name of the file. A return of
-GTK_RESPONSE_OK indicates that the user wishes to overwrite.
-
-#define E_ERROR_NO_SAVE_FILE "system:no-save-file"
-
-The program has tried to save a file, but it could not be written for
-some reason. The first argument is the file name, the second is the
-reason.
-
-#define E_ERROR_NO_LOAD_FILE "system:no-save-file"
-
-The program has tried to load a file, but it could not be opened or
-read for some reason. The first argument is the file name, the second
-is the reason.
-
-Error templates
----------------
-
-Error templates are xml files which are installed in an Evolution
-defined, version-specific directory. They should be installed in
-"${privdatadir}/errors".
-
-The following Makefile.am entries should be setup for each error
-template file. This is required to generate the i18n template files
-used for internationalisation.
-
-List the files, and build rules:
-
-error_DATA = error-file-name.xml
-error_i18n = $(error_DATA:.xml=.xml.h)
-errordir = $(privdatadir)/errors
-%.xml.h: %.xml
- $(top_builddir)/e-util/e-error-tool $^
-
-Add to EXTRA_DIST:
-
-EXTRA_DIST = \
- $(error_DATA) \
- $(error_i18n)
-
-And add to BUILT_SOURCES:
-
-BUILT_SOURCES = $(error_i18n)
-
-Error template format
----------------------
-
-The XML file is in the following format.
-
-<?xml version="1.0"?>
-<error-list domain="ERRORDOMAIN" translation-domain="translation domain" translation-localedir="localedir">
- <error id="error-id" type="info|warning|question|error"? response="default_response"? modal="true"? >
- <title>Window Title</title>?
- <primary>Primary error text.</primary>?
- <secondary>Secondary error text.</secondary>?
- <button stock="stock-button-id"? label="button label"? response="response_id"? /> *
- </error>
-</error-list>
-
-translation-domain and translation-localedir are used to specify a custom
-translation domain for this error file, and where to find it.
-
-response_id is a standard GTK_RESPONSE_* GtkDialog response
-enumeration.
-
-stock-button-id is a standard GtkStock button name.
-
-label is a translatable string for the button name otherwise,
-including an underlined mnemonic.
-
-One of stock and _label must be supplied for all buttons defined.
-Both may be defined, in which case you get a stock-looking button with
-a different label text.
-
-<button /> is optional, if missing, a single stock Ok button will be
-used.
-
-title, primary, and secondary are all optional, if missing,
-standard text (for title) or blank text will be used.
-
-For the title, primary and secondary texts, substitution of the passed
-e_error parameters can be performed using "{n}" syntax, where n is a
-decimal index of the string parameter argument. This allows the same
-arguments to be re-used in different locations within the same error
-box.
diff --git a/devel-docs/misc/ref_and_id_proposition.txt b/devel-docs/misc/ref_and_id_proposition.txt
deleted file mode 100644
index 2127b45a57..0000000000
--- a/devel-docs/misc/ref_and_id_proposition.txt
+++ /dev/null
@@ -1,237 +0,0 @@
-Author: Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org>
-Date: August 9th 1999
-Last revision date : September 3rd 1999
-Version: 0.2
-
-The last version of this document is always available in gnome CVS in
-the gnome-mailer module: devel-docs/misc/ref_and_id_proposition.txt
-
-
-
-A) Identifying messages within folders
---------------------------------------
-
-Currently, in Camel there is only one way to retrieve a message from a
-mail store:
- CamelMimeMessage *
- get_message (CamelFolder *folder, gint number)
-
-where number is an integer representing the message rank within its
-parent folder.
-
-This is a traditional method (JavaMail, MAPI) and it is very useful
-because this is often the only way to get a message in from a
-classical store (pop3 for example).
-
-Moreover, various documents ([1], [2]) proposed to generalize the URL
-scheme used in Camel ([3]) to access mail stores in order to identify
-messages. Such an URL would be, for instance:
-
-pop3://po.myisp.com:1
-
-Meaning: "Access message 1 on Pop3 server po.myisp.com"
-
-
-However, referencing a message with its number within a folder is a
-very unreliable method:
-
-1) Message order in a folder can change during a session:
-
- The user can move or remove messages from the folder, thus
- completely changing message numbers. We could however imagine to
- follow message operations in order to keep camel in a coherent
- state at each time instant. This could be quite complex but may
- be feasible using gtk signal system.
-
-2) Message order can change between sessions:
-
- Gnome-mailer was designed from the begining to allow messages to be
- stored in classical mailboxes (mbox, maildir, MH, IMAP ...), in
- order to allow users to run other MUA on their mailboxes if
- necessary. These other MUA can change message order within folders
- without any chance for Camel to trace the operations.
-
-These two scenarii show that it is quite impossible to use reliable
-folder caching or message referencing if messages are referenced only
-by their position within their parent folder.
-
-
-We thus have to find a general way to identify and retreive a message
-within its folder. One thing is sure, however: all folders
-implementation won't allow this method. Pop3 stores will always access
-messages using their rank on the server. MUA using Camel will thus
-have to be prepared to access some stores providing only the old
-fashionned message number access method.
-
-Basically, we have two choices:
-
-1) Accessing messages using (mailbox) Unique ID (UID)
-
- A UID is a string identifier associated to a message, which is
- guaranteed to be unique within its parent folder and which will not
- change between sessions.
-
-2) Accessing messages using Message ID
-
- A Message ID is a string identifier associated to a messages which
- is guaranteed to be unique in the world, that is, no other message
- can have the same Message ID. The message ID is defined in RFC 822,
- and is stored as the message header "Message-id"
-
-Method (1) already exists in IMAP.
-It is quite simple to define on local stores (MH, mbox, ....) but it
-may not resist to message modification by other MUA.
-Methods based on Message-id matching or message content checksum seem
-to be the best one. Using an "X-" header is another possibility for
-non read-only folders. A combination of these three methods may be the
-most reliable solution.
-The UID is impossible to implement in a POP3 store provider.
-
-(2) Can be used with IMAP, but would be very ineficient.
-The main issue with this method is its dependancy upon other MUAs and
-MTAs. Message-id is set before or during message transport. Moreover,
-some rfc822 compliant messages may not even have any Message-id
-header.
-These are major issues when accessing read-only stores.
-The M-ID is also impossible to implement in a POP3 store provider.
-
-
-We may not rely on external MUA and MTA to guarentee the uniqueness of
-the identifier . We may loose messages by never being able to read them
-if two had the same uid. It would be possible to find workarounds, but
-it could make Camel use a bit tricky.
-
-Given that most users will use IMAP or a database based store as their
-main mail store, and given that this stores allow UID very
-easily, I suggest that we use method (1). Discussion is still open,
-though.
-
-Here are the public methods I propose to add to CamelFolder:
-
-gboolean camel_folder_supports_uid (CamelFolder *folder)
- returns true if the folder can get messages
- by their uid.
-
-gchar * camel_folder_get_uid_by_number (CamelFolder *folder, gint message_number)
- return the uid of message which number in the folder
- is %message_number.
-
-gchar * camel_folder_get_message_uid (CamelFolder *folder, CamelMimeMessage *message)
- return the uid of the message within the folder.
-
-CamelMimeMessage *camel_folder_get_message_by_uid (CamelFolder *folder, gchar *uid)
- return the message which uid is %uid
-
-In addition, the CamelMessage Class will have a new public method
-
-gchar * camel_mime_message_get_uid (CamelMimeMessage *message)
- return the uid associated to the message in its physical parent
- folder.
-
-
-
-B) Handling message references in (v)folders.
----------------------------------------------
-
-
-We want the future Gnome mailer to be able to build (virtual) folders
-holding references to messages physically located in other
-folders. More generally, we would like folders to be able to hold:
-
-1) messages
-2) subfolders
-3) references to messages
-
-(1) and (2) are already implemented in Camel because most mail stores
-can hold messages and/or subfolders.
-
-(3) is a different issue, because no existing mail store can currently
-hold, within folders, references to messages in other folders.
-It will thus be a specific gnome-mailer extension.
-
-
-One of the main issue is to determine what kind of behaviour we expect
-from folders holding references. Here is a possible API.
-
-( the world (v)folder is used to distinguish between the physical
-parent folder and the folder holding a reference to the message, when
-a confusion may arise)
-
-Addition to CamelFolder:
-
-gboolean camel_folder_can_hold_references (CamelFolder *folder)
- return true if the folder can contain references
-
-void camel_folder_add_reference_by_uid (CamelFolder *folder, gchar *folder_url, gchar *message_uid)
- add a reference into a folder. %folder_url is the url of
- the folder, %message_uid is the uid of the message within
- its physical parent folder.
-
-void camel_folder_add_reference_by_message (CamelFolder *folder, CamelMessage *message)
- add a reference. The place where the reference points
- to is found using CamelMessage methods
-
-void camel_folder_remove_reference_by_uid (CamelFolder *folder, gchar *uid)
- remove a message reference form a folder. Reference
- is identified using its uid within the folder.
-
-gboolean camel_folder_uid_is_reference (CamelFolder *folder, gchar *uid)
- return true if the message corresponding to the uid is a reference.
-
-Then all usual operations on the folder act if the message was
-actually physically stored in this folder. For example, when the mailer
-uses camel_folder_get_message_by_uid onto the (v)folder, the actual
-message is retreived from its physical store.
-
-As you can see, the uid of the message within its physical parent
-folder is different than its uid within the (v)folder. This is because
-there is no way to guarantee that the uids of two messages in two
-different folders would be different. Using references on this two
-message in the same vfolder would break uniqueness of the uid in the
-(v)folder.
-
-A couple of other methods could be defined but all the basics are
-described here.
-
-This draft API is far from complete nor perfect, and is described here
-only to stimulate discussions before the actual implementation.
-
-
-The question now is to know how we store references. There are basically
-two ways:
-
-1) references are stored using the URL of the physical folder
- and the uid of the message within the folder
-
-2) a list of reference is kept, and in this list, reference are stored
-as in (1). Folders would refer to the actual message using index in
-the list
-
-
-
-The main problem with (1) is that references get lost as soon
-as the actual message is moved. There is no way to find in which
-folders references to the message exist.
-
-(2) is a way to solve this issue. When messages are used, Camel looks
-in the list to see if the message is refered somewhere, and actualize
-the URL and the uid with their new values.
-
-The problem with (2) is that we need to keep this information in a file
-and libraries writing automatically to files are generally a bad idea.
-
-As in additional remark, it is clear that Camel will only be able to
-hold references to messages on stores supporting UIDs.
-
-
-Thanks in advance for your comments and ideas,
-
-
- Bertrand <Bertrand.Guiheneuf@aful.org>
-
-
---
-
-[1] : http://www.selequa.com/%7epurp/gnomail/mail2db.html
-[2] : http://www.selequa.com/%7epurp/gnomail/dbRecFmt.html
-[3] : http://www.gnome.org/mailing-lists/archives/gnome-mailer-list/1999-April/0248.shtml
diff --git a/devel-docs/query/virtual-folder-in-depth.sgml b/devel-docs/query/virtual-folder-in-depth.sgml
deleted file mode 100644
index d3e3e0504b..0000000000
--- a/devel-docs/query/virtual-folder-in-depth.sgml
+++ /dev/null
@@ -1,407 +0,0 @@
-<!doctype article PUBLIC "-//Davenport//DTD DocBook V3.0//EN" []>
-
-<!-- SGMLized by Bertrand <Bertrand.Guiheneuf@aful.org> -->
-
-<article id="index">
- <artheader>
- <authorgroup>
- <author>
- <firstname>Giao</firstname>
- <surname>Nguyen</surname>
- </author>
- </authorgroup>
-
- <title>An in-depth look at the virtual folder mechanism</title>
- <abstract>
- <para>
- This document describes a different way of approaching mail
- organization and how all things are possible in this brave new
- world. This document does not describe physical storage issues
- nor interface issues.
- </para>
- <para>
- Historically mail has been organized into folders. These
- folders usually mapped to a single storage medium. The
- relationship between mail organization and storage medium was
- one to one. There was one mail organization for every storage
- medium. This scheme had its limitations.
- </para>
- <para>
- Efforts at categorizations are only meaningful at the instance that
- one categorized. To find any piece of data, regardless of how well
- it was categorized, required some amount of searching. Therefore, any
- attempts to nullify searching is doomed to fail. It's time to embrace
- searching as a way of life.
- </para>
- <para>
- These are the terms and their definitions. The example rules used are
- based on the syntax for VM (http://www.wonderworks.com/vm/) by Kyle
- Jones whose ideas form the basis for this. I'm only adding the
- existence of summary files to aid in scaling. I currently use VM and
- it's virtual-folder rules for my daily mail purposes. To date, my only
- complaints are speed (it has no caches) and for the unitiated, it's
- not very user-friendly.
- </para>
- <para>
- Comments, questions, rants, etc. should be directed at Giao Nguyen
- (grail@cafebabe.org) who will try to address issues in a timely
- manner.
- </para>
- </abstract>
- </artheader>
-
- <!-- Definitions -->
- <sect1 id="definitions">
- <title>Definitions</title>
- <sect2>
- <title>Store</title>
- <para>
- A location where mail can be found. This may be a file (Berkeley
- mbox), directory (MH), IMAP server, POP3 server, Exchange server,
- Lotus Notes server, a stack of Post-Its by your monitor fed through
- some OCR system.
- </para>
- </sect2>
-
- <sect2>
- <title>Message</title>
- <para>
- An individual mail message.
- </para>
- </sect2>
- <sect2>
- <title>Vfolder</title>
- <para>
- A group of messages sharing some commonality. This is the result of a
- query. The vfolder maybe contained in a store, but it is not necessary
- that a store holds only one vfolder. There is always an implicit
- vfolder rule which matches all messages. A store contains the vfolder
- which is the result of the query (any). It's short for virtual folder
- or maybe view folder. I dunno.
- </para>
- </sect2>
- <sect2>
- <title>Default-vfolder</title>
- <para>
- The vfolder defined by (any) applied to the store. This is not the
- inbox. The inbox could easily be defined by a query. A default rule
- for the inbox could be (new) but it doesn't have to be. Mine happens
- to be (or (unread) (new)).
- </para>
- </sect2>
- <sect2>
- <title>Folder</title>
- <para>
- The classical mail folder approach: one message organization per
- store.
- </para>
- </sect2>
- <sect2>
- <title>Query</title>
- <para>
- A search for messages. The result of this is a vfolder. There are two
- kinds of queries: named queries and lambda queries. More on this
- later.
- </para>
- </sect2>
- <sect2>
- <title>Summary file </title>
- <para>
- An external file that contains pointers to messages which are matches
- for a named query. In addition to pointers, the summary file should
- also contain signatures of the store for sanity checks. When the term
- "index" is used as a verb, it means to build a summary file for a
- given name-value pair.
- </para>
- </sect2>
- </sect1>
-
- <!-- Queries -->
- <sect1>
- <title>Queries</title>
- <para>
- Named queries are analogous to classical mail folders. Because named
- queries maybe reused, summary files are kept as caches to reduce
- the overall cost of viewing a vfolder. Summary files are superior to
- folders in that they allow for the same messages to appear in multiple
- vfolders without message duplications. Duplications of messages
- defeats attempts at tagging a message with additional user information
- like annotations. Named queries will define folders.
- </para>
- <para>
- Lambda queries are similar to named queries except that they have no
- name. These are created on the fly by the user to filter out or
- include certain messages.
- </para>
- <para>
- All queries can be layered on top of each other. A lambda query can be
- layered on a named query and a named query can be layered on a lambda
- query. The possibilities are endless.
- </para>
- <para>
- The layerings can be done as boolean operations (and, or, not). Short
- circuiting should be used.
- </para>
- <para>
- Examples:
- <programlisting>
-(and (author "Giao")
- (unread))
- </programlisting>
- The (unread) query should only be evaluated on the results of (author
- "Giao").
- <programlisting>
-(or (author "Giao")
- (unread))
- </programlisting>
- Both of these queries should be evaluated. Any matches are added to the
- resulting vfolder.
- </para>
- </sect1>
-
- <!-- Summary files -->
- <sect1>
- <title>Summary files</title>
- <para>
- Summary files are only meaningful when applied to the context of the
- default-vfolder of a store.
- </para>
- <para>
- Summary files should be generated for queries of the form:
- <programlisting>
-(function "constant value")
- </programlisting>
- Summary files should never be generated for queries of the form:
- <programlisting>
- (function (function1))
-
- (and (function "value")
- (another-function "another value"))
- </programlisting>
- Given a query of the form:
- <programlisting>
- (and (function "value")
- (another-function "another value"))
- </programlisting>
- The system should use one summary file for (function "value") and
- another summary file for (another-function "another value"). I will
- call the prior form the "plain form".
- </para>
- <para>
- It should be noted that the signature of the store should be based on
- the assumption that new data may have been added to the store since
- the application generated the summary file. Signatures generated on
- the entirety of the store will most likely be meaningless for things
- like POP/IMAP servers.
- </para>
- </sect1>
-
- <!-- Incremental Indexing -->
- <sect1>
- <title>Incremental indexing</title>
- <para>
- When new messages are detected, all known queries should be evaluated
- on the new messages. vfolders should be notified of new messages that
- are positive matches for their queries. The indexes generated by this
- process should be merged into the current indexes for the vfolder.
- </para>
- </sect1>
-
- <!-- Can I have multiple stores -->
- <sect1>
- <title>Can I have multiple stores?</title>
- <para>
- I don't see why not. Again, the inbox is a vfolder so you can get a
- unified inbox consisting of all new mail sent to all your stores or
- your can get inboxes for each store or any combination your heart
- desire. You get your cake, eat it, and someone else cleans the dishes!
- </para>
- </sect1>
-
- <!-- Why all this? -->
- <sect1>
- <title>Why all this?</title>
- <para>
- Consider the dynamic nature of the following query:
- <programlisting>
-(and (author "Giao")
- (sent-after (today-midnight)))
- </programlisting>
- today-midnight would be a function that is evaluated at run-time to
- calculate the appropriate object.
- </para>
- </sect1>
-
- <!-- Scenarios of usage and their solutions -->
- <sect1>
- <title>Scenarios of usage and their solutions</title>
- <sect2>
- <title>Mesage alterations</title>
- <para>
- This is a fuzzy area that should be left to the UI to handle. Messages
- are altered. Read status are altered when a new message is read for
- example. How do we handle this if our query is for unread messages?
- Upon viewing the state would change.
- </para>
- <para>
- One idea is to not evaluate the queries unless we're changing between
- vfolder views. This assumes that one can only view a particular
- vfolder at a time. For multi-vfolder viewing, a message change should
- propagate through the vfolder system. Certain effects (as in our
- example) would not be intuitive.
- </para>
- <para>
- It would not be a clean solution to make special cases but they may be
- necessary where certain defined fields are ignored when they are
- changed. Some combination of the above rules can be used. I don't
- think it's an easy solution.
- </para>
- </sect2>
- <sect2>
- <title>Message inclusion and exclusion</title>
- <para>
- Messages are included and excluded also with queries. The final query
- will have the form of:
- <programlisting>
- (and (author "Giao")
- (criteria value)
- (not (criteria other-value)))
- </programlisting>
- Userland criterias may be a label of some sort. These may be userland
- labels or Message-IDs. What are the performance issues involved in
- this? With short circuiting, it's not a major problem.
- </para>
- <para>
- The criterias and values are determined by the UI. The vfolder
- mechanism isn't concerned with such issues.
- </para>
- <para>
- Messages can be included and excluded at will. The idea is often
- called "arbitrary inclusion/exclusion". This can be done by
- Message-IDs or other fields. It's been noted that Message-IDs are not
- unique.
- </para>
- <para>
- I propose that any given vfolder is allocated an inclusion label and an
- exclusion label. These should be randomly generated. This should be
- part of the vfolder description. It should be noted that the vfolder
- description has not been drafted yet.
- </para>
- <para>
- The result is such that the rules for a given named query is:
- <programlisting>
- (and (user-query)
- (label inclusion-label)
- (not exclusion-label))
- </programlisting>
- </para>
- </sect2>
- <sect2>
- <title>Query scheduling</title>
- <para>
- Consider the following extremely dynamic queries:
- <programlisting>
- A:
- (and (author "Giao")
- (sent-after (today-midnight)))
-
- B:
- (and (sent-after (today-midnight))
- (author "Giao"))
-
- C:
- (or (author "Giao")
- (sent-after (today-midnight)))
- </programlisting>
- Query A would be significantly faster because (author "Giao") is not
- dynamic. A summary file could be generated for this query. Query B is
- slow and can be optimized if there was a query compiler of some
- sort. Query C demonstrates a query in which there is no good
- optimization which can be applied. These come with a certain amount of
- baggage.
- </para>
- <para>
- It seems then that for boolean 'and' operations, plain forms should be
- moved forward and other queries should be moved such that they are
- evaluated later. I would expect that the majority of queries would be
- of the plain form.
- </para>
- <para>
- First is that the summary file is tied to the query and the store
- where the query originates from. Second, a hashing function for
- strings needs to be calculated for the query so that the query and the
- summary file can be associated. This hashing function could be similar
- to the hashing function described in Rob Pike's "The Practice of
- Programming". (FIXME: Stick page number here)
- </para>
- </sect2>
- <sect2>
- <title>Archives</title>
- <para>
- Many people are concerned that archives won't be preserved, archives
- aren't supported, and many other archive related issues. This is the
- short version.
- </para>
- <para>
- Archives are just that, archives. Archives are stores. Take your
- vfolder, export it to a store. You are done. If you load up the store
- again, then the default-vfolder of that store is the view of the
- vfolder, except the query is different.
- </para>
- <para>
- The point to vfolder is not to do away with classical folder
- representation but to move the queries to the front where it would
- make data management easier for people who don't think in terms of
- files but in terms of queries because ordinary people don't think in
- terms of files.
- </para>
- </sect2>
- </sect1>
-
- <!-- Miscellany -->
- <sect1>
- <title>Miscellany</title>
- <sect2>
- <title>Annotations</title>
- <para>
- There should be a scheme to add annotations to messages. Common mail
- user agents have used a tag in the message header to mark messages as
- read/unread for example. Extending on this we have the ability to add
- our own data to a message to add meaning to it. If we have a good
- scheme for doing this, new possibilities are opened.
- </para>
- <sect3>
- <title>Keywords</title>
- <para>
- When sending a message, a message could have certain keywords attached
- to it. While this can be done with the subject line, the subject line
- has a tendency to be munged by other mail applications. One popular
- example is the "[rR]e:" prefix. Using the subject line also breaks the
- "contract" with other mail user agents. Using keywords in another
- field in the message header allows the sender to assist the recipient
- in organizing data automatically. Note that the sender can only
- provide hints as the sender is unlikely to know the organization
- schemes of the recipient.
- </para>
- </sect3>
- </sect2>
- <sect2>
- <title>Scope</title>
- <para>
- Let us assume that we have multiple stores. Does a query work on a
- given store? Or does it work on all stores? Or is it configurable such
- that a query can work on a user-selected list of stores?
- </para>
- </sect2>
- </sect1>
-
- <!-- Alternatives to the above -->
- <sect1>
- <title>Alternatives to the above</title>
- <para>
- Jim Meyer (purp@selequa.com) is putting some notes on where
- annotations needs to be located. They'll be located here as well as
- any contributions I may have to them.
- </para>
- </sect1>
-</article>
diff --git a/devel-docs/query/virtual-folder-in-depth.txt b/devel-docs/query/virtual-folder-in-depth.txt
deleted file mode 100644
index 01718a5f05..0000000000
--- a/devel-docs/query/virtual-folder-in-depth.txt
+++ /dev/null
@@ -1,309 +0,0 @@
-TITLE: An in-depth look at the virtual folder mechanism
-AUTHOR: Giao Nguyen <grail@cafebabe.org>
-
-* introduction
-
-This document describes a different way of approaching mail
-organization and how all things are possible in this brave new
-world. This document does not describe physical storage issues nor
-interface issues.
-
-Historically mail has been organized into folders. These folders
-usually mapped to a single storage medium. The relationship between
-mail organization and storage medium was one to one. There was one
-mail organization for every storage medium. This scheme had its
-limitations.
-
-Efforts at categorizations are only meaningful at the instance that
-one categorized. To find any piece of data, regardless of how well
-it was categorized, required some amount of searching. Therefore, any
-attempts to nullify searching is doomed to fail. It's time to embrace
-searching as a way of life.
-
-These are the terms and their definitions. The example rules used are
-based on the syntax for VM (http://www.wonderworks.com/vm/) by Kyle
-Jones whose ideas form the basis for this. I'm only adding the
-existence of summary files to aid in scaling. I currently use VM and
-it's virtual-folder rules for my daily mail purposes. To date, my only
-complaints are speed (it has no caches) and for the unitiated, it's
-not very user-friendly.
-
-Comments, questions, rants, etc. should be directed at Giao Nguyen
-<grail@cafebabe.org> who will try to address issues in a timely
-manner.
-
-* Definitions
-
-** store
-
-A location where mail can be found. This may be a file (Berkeley
-mbox), directory (MH), IMAP server, POP3 server, Exchange server,
-Lotus Notes server, a stack of Post-Its by your monitor fed through
-some OCR system.
-
-** message
-
-An individual mail message.
-
-** vfolder
-
-A group of messages sharing some commonality. This is the result of a
-query. The vfolder maybe contained in a store, but it is not necessary
-that a store holds only one vfolder. There is always an implicit
-vfolder rule which matches all messages. A store contains the vfolder
-which is the result of the query (any). It's short for virtual folder
-or maybe view folder. I dunno.
-
-** default-vfolder
-
-The vfolder defined by (any) applied to the store. This is not the
-inbox. The inbox could easily be defined by a query. A default rule
-for the inbox could be (new) but it doesn't have to be. Mine happens
-to be (or (unread) (new)).
-
-** folder
-
-The classical mail folder approach: one message organization per
-store.
-
-** query
-
-A search for messages. The result of this is a vfolder. There are two
-kinds of queries: named queries and lambda queries. More on this
-later.
-
-** summary file
-
-An external file that contains pointers to messages which are matches
-for a named query. In addition to pointers, the summary file should
-also contain signatures of the store for sanity checks. When the term
-"index" is used as a verb, it means to build a summary file for a
-given name-value pair.
-
-* Queries
-
-Named queries are analogous to classical mail folders. Because named
-queries maybe reused, summary files are kept as caches to reduce
-the overall cost of viewing a vfolder. Summary files are superior to
-folders in that they allow for the same messages to appear in multiple
-vfolders without message duplications. Duplications of messages
-defeats attempts at tagging a message with additional user information
-like annotations. Named queries will define folders.
-
-Lambda queries are similar to named queries except that they have no
-name. These are created on the fly by the user to filter out or
-include certain messages.
-
-All queries can be layered on top of each other. A lambda query can be
-layered on a named query and a named query can be layered on a lambda
-query. The possibilities are endless.
-
-The layerings can be done as boolean operations (and, or, not). Short
-circuiting should be used.
-
-Examples:
-
-(and (author "Giao")
- (unread))
-
-The (unread) query should only be evaluated on the results of (author
-"Giao").
-
-(or (author "Giao")
- (unread))
-
-Both of these queries should be evaluated. Any matches are added to the
-resulting vfolder.
-
-* Summary files
-
-Summary files are only meaningful when applied to the context of the
-default-vfolder of a store.
-
-Summary files should be generated for queries of the form:
-
-(function "constant value")
-
-Summary files should never be generated for queries of the form:
-
-(function (function1))
-
-(and (function "value")
- (another-function "another value"))
-
-Given a query of the form:
-
-(and (function "value")
- (another-function "another value"))
-
-The system should use one summary file for (function "value") and
-another summary file for (another-function "another value"). I will
-call the prior form the "plain form".
-
-It should be noted that the signature of the store should be based on
-the assumption that new data may have been added to the store since
-the application generated the summary file. Signatures generated on
-the entirety of the store will most likely be meaningless for things
-like POP/IMAP servers.
-
-* Incremental indexing
-
-When new messages are detected, all known queries should be evaluated
-on the new messages. vfolders should be notified of new messages that
-are positive matches for their queries. The indexes generated by this
-process should be merged into the current indexes for the vfolder.
-
-* Can I have multiple stores?
-
-I don't see why not. Again, the inbox is a vfolder so you can get a
-unified inbox consisting of all new mail sent to all your stores or
-your can get inboxes for each store or any combination your heart
-desire. You get your cake, eat it, and someone else cleans the dishes!
-
-* Why all this?
-
-Consider the dynamic nature of the following query:
-
-(and (author "Giao")
- (sent-after (today-midnight)))
-
-today-midnight would be a function that is evaluated at run-time to
-calculate the appropriate object.
-
-* Scenarios of usage and their solutions
-
-** Mesage alterations
-
-This is a fuzzy area that should be left to the UI to handle. Messages
-are altered. Read status are altered when a new message is read for
-example. How do we handle this if our query is for unread messages?
-Upon viewing the state would change.
-
-One idea is to not evaluate the queries unless we're changing between
-vfolder views. This assumes that one can only view a particular
-vfolder at a time. For multi-vfolder viewing, a message change should
-propagate through the vfolder system. Certain effects (as in our
-example) would not be intuitive.
-
-It would not be a clean solution to make special cases but they may be
-necessary where certain defined fields are ignored when they are
-changed. Some combination of the above rules can be used. I don't
-think it's an easy solution.
-
-** Message inclusion and exclusion
-
-Messages are included and excluded also with queries. The final query
-will have the form of:
-
-(and (author "Giao")
- (criteria value)
- (not (criteria other-value)))
-
-Userland criterias may be a label of some sort. These may be userland
-labels or Message-IDs. What are the performance issues involved in
-this? With short circuiting, it's not a major problem.
-
-The criterias and values are determined by the UI. The vfolder
-mechanism isn't concerned with such issues.
-
-Messages can be included and excluded at will. The idea is often
-called "arbitrary inclusion/exclusion". This can be done by
-Message-IDs or other fields. It's been noted that Message-IDs are not
-unique.
-
-I propose that any given vfolder is allocated an inclusion label and an
-exclusion label. These should be randomly generated. This should be
-part of the vfolder description. It should be noted that the vfolder
-description has not been drafted yet.
-
-The result is such that the rules for a given named query is:
-
-(and (user-query)
- (label inclusion-label)
- (not exclusion-label))
-
-** Query scheduling
-
-Consider the following extremely dynamic queries:
-
-A:
-(and (author "Giao")
- (sent-after (today-midnight)))
-
-B:
-(and (sent-after (today-midnight))
- (author "Giao"))
-
-C:
-(or (author "Giao")
- (sent-after (today-midnight)))
-
-Query A would be significantly faster because (author "Giao") is not
-dynamic. A summary file could be generated for this query. Query B is
-slow and can be optimized if there was a query compiler of some
-sort. Query C demonstrates a query in which there is no good
-optimization which can be applied. These come with a certain amount of
-baggage.
-
-It seems then that for boolean 'and' operations, plain forms should be
-moved forward and other queries should be moved such that they are
-evaluated later. I would expect that the majority of queries would be
-of the plain form.
-
-First is that the summary file is tied to the query and the store
-where the query originates from. Second, a hashing function for
-strings needs to be calculated for the query so that the query and the
-summary file can be associated. This hashing function could be similar
-to the hashing function described in Rob Pike's "The Practice of
-Programming". (FIXME: Stick page number here)
-
-** Archives
-
-Many people are concerned that archives won't be preserved, archives
-aren't supported, and many other archive related issues. This is the
-short version.
-
-Archives are just that, archives. Archives are stores. Take your
-vfolder, export it to a store. You are done. If you load up the store
-again, then the default-vfolder of that store is the view of the
-vfolder, except the query is different.
-
-The point to vfolder is not to do away with classical folder
-representation but to move the queries to the front where it would
-make data management easier for people who don't think in terms of
-files but in terms of queries because ordinary people don't think in
-terms of files.
-
-* Miscellany
-
-** Annotations
-
-There should be a scheme to add annotations to messages. Common mail
-user agents have used a tag in the message header to mark messages as
-read/unread for example. Extending on this we have the ability to add
-our own data to a message to add meaning to it. If we have a good
-scheme for doing this, new possibilities are opened.
-
-*** Keywords
-
-When sending a message, a message could have certain keywords attached
-to it. While this can be done with the subject line, the subject line
-has a tendency to be munged by other mail applications. One popular
-example is the "[rR]e:" prefix. Using the subject line also breaks the
-"contract" with other mail user agents. Using keywords in another
-field in the message header allows the sender to assist the recipient
-in organizing data automatically. Note that the sender can only
-provide hints as the sender is unlikely to know the organization
-schemes of the recipient.
-
-** Scope
-
-Let us assume that we have multiple stores. Does a query work on a
-given store? Or does it work on all stores? Or is it configurable such
-that a query can work on a user-selected list of stores?
-
-* Alternatives to the above
-
-Jim Meyer <purp@selequa.com> is putting some notes on where
-annotations needs to be located. They'll be located here as well as
-any contributions I may have to them.
diff --git a/doc/.cvsignore b/doc/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/doc/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/doc/COPYING-DOCS b/doc/COPYING-DOCS
deleted file mode 100644
index b42936beb3..0000000000
--- a/doc/COPYING-DOCS
+++ /dev/null
@@ -1,355 +0,0 @@
- GNU Free Documentation License
- Version 1.1, March 2000
-
- Copyright (C) 2000 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-0. PREAMBLE
-
-The purpose of this License is to make a manual, textbook, or other
-written document "free" in the sense of freedom: to assure everyone
-the effective freedom to copy and redistribute it, with or without
-modifying it, either commercially or noncommercially. Secondarily,
-this License preserves for the author and publisher a way to get
-credit for their work, while not being considered responsible for
-modifications made by others.
-
-This License is a kind of "copyleft", which means that derivative
-works of the document must themselves be free in the same sense. It
-complements the GNU General Public License, which is a copyleft
-license designed for free software.
-
-We have designed this License in order to use it for manuals for free
-software, because free software needs free documentation: a free
-program should come with manuals providing the same freedoms that the
-software does. But this License is not limited to software manuals;
-it can be used for any textual work, regardless of subject matter or
-whether it is published as a printed book. We recommend this License
-principally for works whose purpose is instruction or reference.
-
-
-1. APPLICABILITY AND DEFINITIONS
-
-This License applies to any manual or other work that contains a
-notice placed by the copyright holder saying it can be distributed
-under the terms of this License. The "Document", below, refers to any
-such manual or work. Any member of the public is a licensee, and is
-addressed as "you".
-
-A "Modified Version" of the Document means any work containing the
-Document or a portion of it, either copied verbatim, or with
-modifications and/or translated into another language.
-
-A "Secondary Section" is a named appendix or a front-matter section of
-the Document that deals exclusively with the relationship of the
-publishers or authors of the Document to the Document's overall subject
-(or to related matters) and contains nothing that could fall directly
-within that overall subject. (For example, if the Document is in part a
-textbook of mathematics, a Secondary Section may not explain any
-mathematics.) The relationship could be a matter of historical
-connection with the subject or with related matters, or of legal,
-commercial, philosophical, ethical or political position regarding
-them.
-
-The "Invariant Sections" are certain Secondary Sections whose titles
-are designated, as being those of Invariant Sections, in the notice
-that says that the Document is released under this License.
-
-The "Cover Texts" are certain short passages of text that are listed,
-as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-the Document is released under this License.
-
-A "Transparent" copy of the Document means a machine-readable copy,
-represented in a format whose specification is available to the
-general public, whose contents can be viewed and edited directly and
-straightforwardly with generic text editors or (for images composed of
-pixels) generic paint programs or (for drawings) some widely available
-drawing editor, and that is suitable for input to text formatters or
-for automatic translation to a variety of formats suitable for input
-to text formatters. A copy made in an otherwise Transparent file
-format whose markup has been designed to thwart or discourage
-subsequent modification by readers is not Transparent. A copy that is
-not "Transparent" is called "Opaque".
-
-Examples of suitable formats for Transparent copies include plain
-ASCII without markup, Texinfo input format, LaTeX input format, SGML
-or XML using a publicly available DTD, and standard-conforming simple
-HTML designed for human modification. Opaque formats include
-PostScript, PDF, proprietary formats that can be read and edited only
-by proprietary word processors, SGML or XML for which the DTD and/or
-processing tools are not generally available, and the
-machine-generated HTML produced by some word processors for output
-purposes only.
-
-The "Title Page" means, for a printed book, the title page itself,
-plus such following pages as are needed to hold, legibly, the material
-this License requires to appear in the title page. For works in
-formats which do not have any title page as such, "Title Page" means
-the text near the most prominent appearance of the work's title,
-preceding the beginning of the body of the text.
-
-
-2. VERBATIM COPYING
-
-You may copy and distribute the Document in any medium, either
-commercially or noncommercially, provided that this License, the
-copyright notices, and the license notice saying this License applies
-to the Document are reproduced in all copies, and that you add no other
-conditions whatsoever to those of this License. You may not use
-technical measures to obstruct or control the reading or further
-copying of the copies you make or distribute. However, you may accept
-compensation in exchange for copies. If you distribute a large enough
-number of copies you must also follow the conditions in section 3.
-
-You may also lend copies, under the same conditions stated above, and
-you may publicly display copies.
-
-
-3. COPYING IN QUANTITY
-
-If you publish printed copies of the Document numbering more than 100,
-and the Document's license notice requires Cover Texts, you must enclose
-the copies in covers that carry, clearly and legibly, all these Cover
-Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
-the back cover. Both covers must also clearly and legibly identify
-you as the publisher of these copies. The front cover must present
-the full title with all words of the title equally prominent and
-visible. You may add other material on the covers in addition.
-Copying with changes limited to the covers, as long as they preserve
-the title of the Document and satisfy these conditions, can be treated
-as verbatim copying in other respects.
-
-If the required texts for either cover are too voluminous to fit
-legibly, you should put the first ones listed (as many as fit
-reasonably) on the actual cover, and continue the rest onto adjacent
-pages.
-
-If you publish or distribute Opaque copies of the Document numbering
-more than 100, you must either include a machine-readable Transparent
-copy along with each Opaque copy, or state in or with each Opaque copy
-a publicly-accessible computer-network location containing a complete
-Transparent copy of the Document, free of added material, which the
-general network-using public has access to download anonymously at no
-charge using public-standard network protocols. If you use the latter
-option, you must take reasonably prudent steps, when you begin
-distribution of Opaque copies in quantity, to ensure that this
-Transparent copy will remain thus accessible at the stated location
-until at least one year after the last time you distribute an Opaque
-copy (directly or through your agents or retailers) of that edition to
-the public.
-
-It is requested, but not required, that you contact the authors of the
-Document well before redistributing any large number of copies, to give
-them a chance to provide you with an updated version of the Document.
-
-
-4. MODIFICATIONS
-
-You may copy and distribute a Modified Version of the Document under
-the conditions of sections 2 and 3 above, provided that you release
-the Modified Version under precisely this License, with the Modified
-Version filling the role of the Document, thus licensing distribution
-and modification of the Modified Version to whoever possesses a copy
-of it. In addition, you must do these things in the Modified Version:
-
-A. Use in the Title Page (and on the covers, if any) a title distinct
- from that of the Document, and from those of previous versions
- (which should, if there were any, be listed in the History section
- of the Document). You may use the same title as a previous version
- if the original publisher of that version gives permission.
-B. List on the Title Page, as authors, one or more persons or entities
- responsible for authorship of the modifications in the Modified
- Version, together with at least five of the principal authors of the
- Document (all of its principal authors, if it has less than five).
-C. State on the Title page the name of the publisher of the
- Modified Version, as the publisher.
-D. Preserve all the copyright notices of the Document.
-E. Add an appropriate copyright notice for your modifications
- adjacent to the other copyright notices.
-F. Include, immediately after the copyright notices, a license notice
- giving the public permission to use the Modified Version under the
- terms of this License, in the form shown in the Addendum below.
-G. Preserve in that license notice the full lists of Invariant Sections
- and required Cover Texts given in the Document's license notice.
-H. Include an unaltered copy of this License.
-I. Preserve the section entitled "History", and its title, and add to
- it an item stating at least the title, year, new authors, and
- publisher of the Modified Version as given on the Title Page. If
- there is no section entitled "History" in the Document, create one
- stating the title, year, authors, and publisher of the Document as
- given on its Title Page, then add an item describing the Modified
- Version as stated in the previous sentence.
-J. Preserve the network location, if any, given in the Document for
- public access to a Transparent copy of the Document, and likewise
- the network locations given in the Document for previous versions
- it was based on. These may be placed in the "History" section.
- You may omit a network location for a work that was published at
- least four years before the Document itself, or if the original
- publisher of the version it refers to gives permission.
-K. In any section entitled "Acknowledgements" or "Dedications",
- preserve the section's title, and preserve in the section all the
- substance and tone of each of the contributor acknowledgements
- and/or dedications given therein.
-L. Preserve all the Invariant Sections of the Document,
- unaltered in their text and in their titles. Section numbers
- or the equivalent are not considered part of the section titles.
-M. Delete any section entitled "Endorsements". Such a section
- may not be included in the Modified Version.
-N. Do not retitle any existing section as "Endorsements"
- or to conflict in title with any Invariant Section.
-
-If the Modified Version includes new front-matter sections or
-appendices that qualify as Secondary Sections and contain no material
-copied from the Document, you may at your option designate some or all
-of these sections as invariant. To do this, add their titles to the
-list of Invariant Sections in the Modified Version's license notice.
-These titles must be distinct from any other section titles.
-
-You may add a section entitled "Endorsements", provided it contains
-nothing but endorsements of your Modified Version by various
-parties--for example, statements of peer review or that the text has
-been approved by an organization as the authoritative definition of a
-standard.
-
-You may add a passage of up to five words as a Front-Cover Text, and a
-passage of up to 25 words as a Back-Cover Text, to the end of the list
-of Cover Texts in the Modified Version. Only one passage of
-Front-Cover Text and one of Back-Cover Text may be added by (or
-through arrangements made by) any one entity. If the Document already
-includes a cover text for the same cover, previously added by you or
-by arrangement made by the same entity you are acting on behalf of,
-you may not add another; but you may replace the old one, on explicit
-permission from the previous publisher that added the old one.
-
-The author(s) and publisher(s) of the Document do not by this License
-give permission to use their names for publicity for or to assert or
-imply endorsement of any Modified Version.
-
-
-5. COMBINING DOCUMENTS
-
-You may combine the Document with other documents released under this
-License, under the terms defined in section 4 above for modified
-versions, provided that you include in the combination all of the
-Invariant Sections of all of the original documents, unmodified, and
-list them all as Invariant Sections of your combined work in its
-license notice.
-
-The combined work need only contain one copy of this License, and
-multiple identical Invariant Sections may be replaced with a single
-copy. If there are multiple Invariant Sections with the same name but
-different contents, make the title of each such section unique by
-adding at the end of it, in parentheses, the name of the original
-author or publisher of that section if known, or else a unique number.
-Make the same adjustment to the section titles in the list of
-Invariant Sections in the license notice of the combined work.
-
-In the combination, you must combine any sections entitled "History"
-in the various original documents, forming one section entitled
-"History"; likewise combine any sections entitled "Acknowledgements",
-and any sections entitled "Dedications". You must delete all sections
-entitled "Endorsements."
-
-
-6. COLLECTIONS OF DOCUMENTS
-
-You may make a collection consisting of the Document and other documents
-released under this License, and replace the individual copies of this
-License in the various documents with a single copy that is included in
-the collection, provided that you follow the rules of this License for
-verbatim copying of each of the documents in all other respects.
-
-You may extract a single document from such a collection, and distribute
-it individually under this License, provided you insert a copy of this
-License into the extracted document, and follow this License in all
-other respects regarding verbatim copying of that document.
-
-
-7. AGGREGATION WITH INDEPENDENT WORKS
-
-A compilation of the Document or its derivatives with other separate
-and independent documents or works, in or on a volume of a storage or
-distribution medium, does not as a whole count as a Modified Version
-of the Document, provided no compilation copyright is claimed for the
-compilation. Such a compilation is called an "aggregate", and this
-License does not apply to the other self-contained works thus compiled
-with the Document, on account of their being thus compiled, if they
-are not themselves derivative works of the Document.
-
-If the Cover Text requirement of section 3 is applicable to these
-copies of the Document, then if the Document is less than one quarter
-of the entire aggregate, the Document's Cover Texts may be placed on
-covers that surround only the Document within the aggregate.
-Otherwise they must appear on covers around the whole aggregate.
-
-
-8. TRANSLATION
-
-Translation is considered a kind of modification, so you may
-distribute translations of the Document under the terms of section 4.
-Replacing Invariant Sections with translations requires special
-permission from their copyright holders, but you may include
-translations of some or all Invariant Sections in addition to the
-original versions of these Invariant Sections. You may include a
-translation of this License provided that you also include the
-original English version of this License. In case of a disagreement
-between the translation and the original English version of this
-License, the original English version will prevail.
-
-
-9. TERMINATION
-
-You may not copy, modify, sublicense, or distribute the Document except
-as expressly provided for under this License. Any other attempt to
-copy, modify, sublicense or distribute the Document is void, and will
-automatically terminate your rights under this License. However,
-parties who have received copies, or rights, from you under this
-License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-
-10. FUTURE REVISIONS OF THIS LICENSE
-
-The Free Software Foundation may publish new, revised versions
-of the GNU Free Documentation 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. See
-http://www.gnu.org/copyleft/.
-
-Each version of the License is given a distinguishing version number.
-If the Document specifies that a particular numbered version of this
-License "or any later version" applies to it, you have the option of
-following the terms and conditions either of that specified version or
-of any later version that has been published (not as a draft) by the
-Free Software Foundation. If the Document does not specify a version
-number of this License, you may choose any version ever published (not
-as a draft) by the Free Software Foundation.
-
-
-ADDENDUM: How to use this License for your documents
-
-To use this License in a document you have written, include a copy of
-the License in the document and put the following copyright and
-license notices just after the title page:
-
- Copyright (c) YEAR YOUR NAME.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.1
- or any later version published by the Free Software Foundation;
- with the Invariant Sections being LIST THEIR TITLES, with the
- Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
- A copy of the license is included in the section entitled "GNU
- Free Documentation License".
-
-If you have no Invariant Sections, write "with no Invariant Sections"
-instead of saying which ones are invariant. If you have no
-Front-Cover Texts, write "no Front-Cover Texts" instead of
-"Front-Cover Texts being LIST"; likewise for Back-Cover Texts.
-
-If your document contains nontrivial examples of program code, we
-recommend releasing these examples in parallel under your choice of
-free software license, such as the GNU General Public License,
-to permit their use in free software.
diff --git a/doc/Camel-Classes b/doc/Camel-Classes
deleted file mode 100644
index 8b510dad7a..0000000000
--- a/doc/Camel-Classes
+++ /dev/null
@@ -1,65 +0,0 @@
-CamelException
-CamelLock
-CamelLockClient
-CamelLockHelper
-CamelMovemail
-CamelOperation
-CamelProvider
-CamelUIDCache
-CamelURL
-CamelObject
- + CamelAddress
- | + CamelInternetAddress
- | ` CamelNewsAddress
- + CamelDataWrapper
- | + CamelMedium
- | | ` CamelMimePart
- | | ` CamelMimeMessage
- | ` CamelMultipart
- + CamelCipherContext
- | ` CamelPgpContext
- + CamelCMSContext
- | ` CamelSMimeContext
- + CamelDiscoDiary
- + CamelFolder
- | + CamelDiscoFolder
- | ` CamelVeeFolder
- | ` CamelVTrashFolder
- + CamelFolderSearch
- + CamelFolderSummary
- + CamelMimeFilter
- | + CamelMimeFilterBasic
- | + CamelMimeFilterBestenc
- | + CamelMimeFilterCharset
- | + CamelMimeFilterCRLF
- | + CamelMimeFilterFrom
- | + CamelMimeFilterIndex
- | + CamelMimeFilterLinewrap
- | + CamelMimeFilterSave
- | ` CamelMimeFilterStripHeader
- + CamelSasl
- | + CamelSaslAnonymous
- | + CamelSaslCramMD5
- | + CamelSaslDigestMD5
- | + CamelSaslKerberos
- | + CamelSaslLogin
- | ` CamelSaslPlain
- + CamelService
- | + CamelStore
- | | + CamelRemoteStore
- | | | ` CamelDiscoStore
- | | ` CamelVeeStore
- | ` CamelTransport
- + CamelSession
- ` CamelStream
- + CamelSeekableStream
- | + CamelSeekableSubstream
- | + CamelStreamFs
- | ` CamelStreamMem
- + CamelStreamBuffer
- + CamelStreamFilter
- + CamelStreamNull
- ` CamelTcpStream
- + CamelTcpStreamOpenSSL
- + CamelTcpStreamRaw
- ` CamelTcpStreamSSL
diff --git a/doc/ChangeLog b/doc/ChangeLog
deleted file mode 100644
index e69de29bb2..0000000000
--- a/doc/ChangeLog
+++ /dev/null
diff --git a/doc/ChangeLog.pre-1-4 b/doc/ChangeLog.pre-1-4
deleted file mode 100644
index e7dd37db31..0000000000
--- a/doc/ChangeLog.pre-1-4
+++ /dev/null
@@ -1,1146 +0,0 @@
-2001-08-16 Kjartan Maraas <kmaraas@gnome.org>
-
- * C/Makefile.am: Small fix to build.
- * C/evolution-C.omf: Small fix. Remove an extra space.
- * no/Makefile.am: Same here.
- * no/evolution-no.omf: And here.
-
-2001-08-15 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Updated one line about bullet points.
-
-2001-08-15 Kjartan Maraas <kmaraas@gnome.org>
-
- * no/*: Added beginnings of a Norwegian translation.
- * sgmldocs.make: Forgot to add this. Kinda important.
- * C/*.sgml: s/fig/figures/
- * C/Makefile.am: Make it use the sgmldocs.make framework.
-
-2001-08-14 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mainwindow.sgml: Commented out menuref.
- * C/usage-contact.sgml: Commented out menuref.
- * C/evolution.sgml: commented out menuref.
- * C/preface.sgml: commented out menuref.
-
-2001-08-12 Kjartan Maraas <kmaraas@gnome.org>
-
- * C/apx-authors.sgml: Added missing ;'s after entities.
- * C/evolution-C.omf: s/en/C in Language.
- * C/usage-mail-org.sgml: Add missing ;.
- * C/usage-mainwindow.sgml: Same here.
-
-2001-08-10 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail.sgml: Switched all images in entire document to
- *not* use file extensions, so that they work properly with
- db2ps. This doesn't completely fix the db2ps issues, but it's
- apparently the right way to do this.
-
-2001-08-09 Aaron Weber <aaron@ximian.com>
-
- * C/config-prefs.sgml: Made sharing tip an orderedlist.
-
-2001-08-08 Kevin Breit <battery841@mediaone.net>
-
- * C/config-prefs.sgml: Add information about sharing mailbox files.
-
-2001-08-03 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-calendar.sgml: Add information about gathering actions.
-
-2001-08-02 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Added a <tip> for scrolling through mails.
-
-2001-07-30 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Fixed some breakage Aaron caused.
-
-2001-07-26 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail-org.sgml: revised.
-
- * C/usage-mail.sgml: revisions and stuff.
-
-2001-07-24 Aaron Weber <aaron@ximian.com>
-
- * C/evolution-faq.sgml: Reworded a few questions.
-
-2001-07-23 Kevin Breit <battery841@mediaone.net>
-
- * C/Makefile.am: Pulled instance of config-setupassist.sgml to make stuff build right.
-
-2001-07-23 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mainwindow.sgml: validated.
-
- * C/config-setupassist.sgml: Removed.
-
- * C/evolution.sgml: removed config-setupassist.
-
- * C/usage-exec-summary.sgml: Minor revisions.
-
- * C/usage-contact.sgml: Added 'format="png"' to all <image> tags
- missing the attribute.
-
- * C/usage-calendar.sgml: Added 'format="png"' to all <image> tags
- missing the attribute.
-
- * C/usage-mail.sgml: Added 'format="png"' to all <image> tags
- missing the attribute.
-
- * C/usage-mainwindow.sgml: Style. Merged info from preface. Added
- 'format="png"' to all <image> tags missing the attribute.
-
- * C/preface.sgml: Style changes. Removed info that was duplicated
- in mainwindow.sgml.
-
-2001-07-20 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mainwindow.sgml: Fixed the first time druid stuff a little more.
-
-2001-07-16 Aaron Weber <aaron@ximian.com>
-
- * C/evolution-faq.sgml: Sepllcheck.
-
-2001-07-15 Kevin Breit <battery841@mediaone.net>
-
- * C/config-sync.sgml: Updated slightly for new design.
-
-2001-07-13 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mainwindow.sgml: Added lots of good stuff with the first time druid.
-
-2001-07-12 Aaron Weber <aaron@ximian.com>
-
- * C/evolution-faq.sgml: TYPO fixing.
-
-2001-07-12 Aaron Weber <aaron@ximian.com>
-
- * C/evolution-faq.sgml: Added "get bt for component-only crash" qandaentry.
-
-2001-07-10 Peter Williams <peterw@ximian.com>
-
- * */Makefile.am (dist-hook): Clean up make dist.
-
-2001-07-11 Aaron Weber <aaron@ximian.com>
-
- * C/evolution.sgml: validation on usage-mainwindow and usage-contact.
-
-2001-07-11 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-calendar.sgml: More edits.
-
- * C/usage-contact.sgml: Sick amounts of changes too!
-
- * C/usage-mail-org.sgml: Heavy editing...touched almost everything.
-
- * C/usage-exec-summary.sgml: Minor change. There was only one change for this chapter, cuz I'm such a 'godly' writer...yeah.
-
- * C/usage-mainwindow.sgml: A bit of editing.
-
- * C/preface.sgml: Screwed with the examples and did some cleanup.
-
-2001-07-10 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail-org.sgml: validation.
-
-2001-07-10 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Added <application> tags
-
- * C/usage-mail-org.sgml: Added <application> tags
-
- * C/config-prefs.sgml: Added <application> tags
-
-2001-07-09 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-exec-summary.sgml: Editing
-
- * C/usage-mail.sgml: Editing
-
- * C/usage-mail-org.sgml: Editing
-
- * C/usage-calendar.sgml: Editing
-
- * C/usage-contact.sgml: Editing
-
- * C/usage-mail-org.sgml: Mention UNMATCHED
-
- * C/usage-mail.sgml: Commented on trash being a vFolder
-
-2001-07-06 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Spell check
-
- * C/usage-calendar.sgml: Spell check
-
-2001-07-05 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mainwindow.sgml: Added orderedlists.
-
- * C/usage-exec-summary.sgml: Added orderedlists.
-
- * C/usage-contact.sgml: Added orderedlists.
-
- * C/usage-mail-org.sgml: Added orderedlists.
-
-2001-07-03 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Put in lots of orderedlists...more SGML, less
- for the user to read. They'll thank me in droves later.
-
- * C/usage-exec-summary.sgml: Fixed build error
-
-2001-06-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * white-papers/mail/camel.sgml: Updated slightly.
-
- * Camel-Classes: Updated.
-
-2001-07-02 Kevin Breit <battery841@mediaone.net>
-
- * C/apx-common-tasks.sgml: Created its own file.
-
- * C/usage-mainwindow.sgml: You name it.
-
- * C/preface.sgml: Pulled shortcuts from here into its own apx
-
- * C/evolution.sgml: Reordered entities
-
-2001-06-30 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Pulled organizing stuff, made its own file.
-
-2001-06-26 Aaron Weber <aaron@ximian.com>
-
- * C/evolution-faq.sgml: Revised move/rename/copy questions, now
- that these functions work.
-
-2001-06-25 Aaron Weber <aaron@ximian.com>
-
- * C/evolution-faq.sgml: Now that bug-buddy works with our
- bugzilla, update faq to reflect it.
-
-2001-06-25 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Put config-encryption in usage-mail.sgml.
- config-encryption.sgml should be depreciated.
-
- * C/usage-contact.sgml: Fixed typo
-
- * C/usage-mail.sgml: Added info about mailing lists Elaborated on
- mailing lists
-
- * C/usage-exec-summary.sgml: Fixed a few typos
-
- * C/preface.sgml: Added section for importing files
-
- * C/usage-calendar.sgml: Removed some *'s that are causing
- problems.
-
-2001-06-22 Kevin Breit <battery841@mediaone.net>
-
- * C/preface.sgml: Put in Contacts information in the quicktasks.
-
- * C/usage-mail.sgml: Pulled some redundant information.
-
-2001-06-21 battery841 <battery841@mediaone.net>
-
- * C/preface.sgml, C/fig/mail-inbox.png, C/fig/mainwindow-pic.png,
- C/usage-mail.sgml: Updated screenshots and redid layout for
- graphics on pages.
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-contact.sgml: Fixed .gif problem
-
- * C/usage-mail.sgml:
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Specify the file format
-
- * C/usage-contact.sgml, C/usage-mail.sgml:
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Trying to fix the .gif problem
-
- * C/fig/calendar.png, C/fig/contact.png, C/usage-calendar.sgml:
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-calendar.sgml: Redid graphics to add labels to them and
- described the labels in text.
-
- * C/config-encryption.sgml, C/evolution.sgml:
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/evolution.sgml: Added config-encryption.sgml for building
-
- * C/fig/calendar.png, C/fig/config-cal.png, C/fig/config-mail.png,
- C/fig/filter-assist-fig.png, C/fig/filter-new-fig.png,
- C/fig/mail-composer.png, C/fig/mail-druid-pic.png,
- C/fig/mail-inbox.png, C/fig/print-dest.png,
- C/fig/print-preview.png, C/fig/vfolder-createrule-fig.png:
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/fig/*png: Updated graphics for newer UI.
-
- * C/fig/full-1.png, C/fig/full-2.png, C/fig/full-3.png,
- C/fig/full-4.png, C/fig/full-5.png, C/fig/full-6.png,
- C/fig/full-7.png, C/fig/mainwindow-pic.png, C/usage-mail.sgml:
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Redid graphics to add labels to them and
- described in labels in text. Looks good!
-
- * C/usage-encryption.sgml:
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/encryption.sgml: Added file
-
- * C/preface.sgml:
-
-2001-06-20 Kevin Breit <battery841@mediaone.net>
-
- * doc/ChangeLog: Moved my entires to doc/ChangeLog per request of
- danw
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-contact.sgml: Fixed .gif problem
-
- * C/usage-mail.sgml: Specify the file format
-
- * C/usage-mail.sgml: Trying to fix the .gif problem
-
- * C/usage-calendar.sgml: Redid graphics to add labels to them and
- described the labels in text.
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/evolution.sgml: Added config-encryption.sgml for building
-
- * C/fig/*png: Updated graphics for newer UI.
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Redid graphics to add labels to them and
- described in labels in text. Looks good!
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml:
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/encryption.sgml: Added file
-
-2001-06-20 Kevin Breit <battery841@mediaone.net>
-
- * ChangeLog: Moved my entires to doc/ChangeLog per request of danw
-
-2001-06-20 Kevin Breit <battery841@mediaone.net>
-
- * C/config-setupassist.sgml: Updated for new UI.
-
-2001-06-20 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-sync: Reworded a little bit for more descrip.
-
-2001-06-20 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-calendar.sgml: Documented categorizing an event.
-
-2001-06-20 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Updated Bcc: example
-
-2001-06-19 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mainwindow.sgml: A couple changes to Kevin's update.
-
-2001-06-19 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Basic edits
-
-2001-06-19 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-exec-summary: Updated to say "My Evolution"
-
-2001-06-19 Kevin Breit <battery841@mediaone.net>
-
- * C/apx-gloss.sgml: Added definition.
-
- * C/usage-mainwindow.sgml: Routine updates.
-
-2001-06-07 Duncan Mak <duncan@lumox.simplemente.net>
-
- * C/evolution-faq.sgml: Fixed a typo. Thanks to Greg Leblanc for
- pointing this out.
-
-2001-05-23 Ettore Perazzoli <ettore@ximian.com>
-
- * C/evolution-faq.sgml: Re-indented.
-
-2001-05-18 Duncan Mak <duncan@ximian.com>
-
- * C/evolution-faq.sgml: Added two questions about importing
- Outlook (text from Iain). Fixed some tags and cleaned up a bit
- here and there.
-
-2001-05-18 Ettore Perazzoli <ettore@ximian.com>
-
- * C/evolution-faq.sgml: Added a question about the permission
- issues with /var/spool/mail.
-
-2001-05-15 Ettore Perazzoli <ettore@ximian.com>
-
- * C/Makefile.am (SGML_FILES): Renamed to `GUIDE_SGML_FILES'.
- (EXTRA_DIST): Add `$(FAQ_SGML_FILES)'.
- (all): Depend on `evolution-faq' too.
- (evolution-faq): New.
- (install-data-local): Depend on `evolution-faq' too. Install the
- FAQ into `$(evolution_helpdir)/evolution-faq' and the guide into
- `$(evolution_helpdir)/evolution-guide'.
-
- * C/evolution-faq.sgml: New.
-
-2001-04-23 Jon Trowbridge <trow@ximian.com>
-
- * C/Makefile.am (install-data-local): Changed dependency for
- install-data-local from "evolution" to "evolution-guide".
-
-2001-04-23 Ettore Perazzoli <ettore@ximian.com>
-
- * C/Makefile.am (evolution-guide): Use `$(srcdir)' here.
-
-2001-04-23 Ettore Perazzoli <ettore@ximian.com>
-
- * C/Makefile.am (SGML_FILES): Add `evolution.sgml'.
- (evolution-guide): Process `evolution.sgml', not
- `evolution-guide.sgml'.
- (dist-hook): s/evolution-guide/evolution/
- (install-data-local): Likewise.
-
-2001-02-23 Aaron Weber <aaron@helixcode.com>
-
- * C/apx-authors.sgml: s/helixcode/ximian (How I missed this page
- on the first go-round I don't know).
-
-2001-03-14 Gediminas Paulauskas <menesis@delfi.lt>
-
- * C/Makefile.am: there's no apx-fdl.sgml and evolution-guide.sgml
- anymore
-
-2001-02-23 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: IMAP subscriptions stuff.
-
-2001-02-21 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: Advanced search/show all/save search stuff.
-
- * C/evolution.sgml: This file replaces evolution-guide.sgml, for
- Nautilus Readiness.
-
- * C/apx-gloss.sgml: glossterm conduit.
-
- * C/config-sync.sgml: Glossterm conduit.
-
- * C/preface.sgml: Checked over for Keyboard-Shortcut and other
- truthfulness.
-
-2001-02-15 Aaron Weber <aaron@helixcode.com>
-
- * C/evolution-guide.sgml: Validated. Verified. Markup fixed in
- several individual files.
-
- * C/apx-gpl.sgml: cvs-removed for GNOME 1.4 compliance.
-
- * C/apx-fdl.sgml: cvs-removed for GNOME 1.4 compliance.
-
-2001-02-09 Aaron Weber <aaron@helixcode.com>
-
- * C/config-sync.sgml: Overhaul. Now accurate and truthful and
- clear.
-
- * C/usage-calendar.sgml: Minor Changes.
-
-2001-02-08 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: Minor Changes.
-
- * C/usage-mail.sgml: Minor Changes.
-
-2001-02-07 Aaron Weber <aaron@helixcode.com>
-
- * C/menuref.sgml: Added section, but left blank til UI stabilizes.
-
- * C/usage-exec-summary.sgml: A little functionality described.
-
- * C/usage-mainwindow.sgml: Added tasks and Exec-summary.
-
- * C/usage-calendar.sgml: Describe semi-autonomy of task pad.
-
-2001-02-06 Aaron Weber <aaron@ximian.com>
-
- * C/usage-contact.sgml: s/contact manager/address book/ and
- revised text.
-
- * C/usage-exec-summary.sgml: New file. Describes Executive
- Summary.
-
-2001-01-19 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: More of Megan's revisions, and Field Chooser
- functions in the Sort section.
-
- * C/apx-gloss.sgml: added "ToolTip"
-
-2001-01-18 Aaron Weber <aaron@helixcode.com>
-
- * C/preface.sgml: s/Helix Code/Ximian, and Megan's comments.
-
- * C/usage-mainwindow.sgml: s/Helix Code/Ximian/, and Megan's
- comments.
-
- * C/evolution-guide.sgml: s/Helix Code/Ximian/
-
-2000-12-13 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: Revisions as suggested by Dan. Especially to
- filter dialogs... which still need some renaming, IMHO.
-
- * C/usage-mainwindow.sgml: Revisions as suggested by
- Dan. Especially to the Folder Limits thing, which still upsets me
- somehow.
-
- * C/preface.sgml: Revisions as suggested by Dan.
-
-2000-11-29 Aaron Weber <aaron@helixcode.com>
-
- * C/config-setupassist.sgml: added some <glossterms>, added
- linkends to existing glossterms.
-
-2000-11-28 Aaron Weber <aaron@helixcode.com>
-
- * C/evolution-guide.sgml: Changed intro to Config section. Now
- defines what, exactly, "configurable" means.
-
- * C/usage-print.sgml: Stylistic revisions.
-
- * C/usage-calendar.sgml: Stylistic revisions.
-
- * C/usage-contact.sgml: Stylistic revisions.
-
-2000-11-09 Aaron Weber <aaron@helixcode.com>
-
- * C/menuref.sgml: Message heading Right-Click Menu.
-
-2000-11-03 Aaron Weber <aaron@helixcode.com>
-
- * C/apx-gloss.sgml: The regexp example was quite wrong. Props to
- Sasha.
-
-2000-11-02 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: Style and spelling.
-
-2000-11-01 Aaron Weber <aaron@helixcode.com>
-
- * C/config-prefs.sgml: Fixed validation errors.
-
- * C/apx-gloss.sgml: Fixed HTML, style stuff.
-
- * C/usage-mail.sgml: Stylistic overhaul.
-
- * C/usage-mainwindow.sgml: Fixed groups in shortcut bar, fixed
- folder navigation tips.
-
-2000-10-31 Aaron Weber <aaron@helixcode.com>
-
- * C/preface.sgml: Minor stylistic revisions.
-
-2000-10-30 Aaron Weber <aaron@helixcode.com>
-
- * COPYING-DOCS: New file. This is the official place to put the
- FDL now.
-
-
-2000-11-01 Radek Doulik <rodo@helixcode.com>
-
- * Keybindings: added composer keybindings description
-
-2000-10-25 Aaron Weber <aaron@helixcode.com>
-
- * C/menuref.sgml: Actions -> New Directory Server added.
-
- * C/config-prefs.sgml: Actions -> New Directory Server added.
-
- * C/usage-contact.sgml: Actions -> New Directory Server added.
-
- * C/menuref.sgml: Added mail Settings->Manage Subscriptions menu.
-
- * C/usage-mail.sgml: Subscriptions section added. Quite
- incomplete, though.
-
-2000-10-11 Aaron Weber <aaron@helixcode.com>
-
- * C/evolution-guide.sgml: Re-checked validity of all files. Made
- minor changes to menuref.sgml, usage-mail.sgml, usage-print.sgml
- to bring up to spec.
-
- * C/usage-mail.sgml: Redid Filter & Vfolder to match the new &
- improved functionality.
-
- * C/fig/*: Re-did remaining screenshots.
-
-2000-10-10 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-print.sgml: New file, describing printing and
- print-preview.
-
- * C/fig/print-preview.png: New file.
-
- * C/fig/print-dest.png: New file.
-
- * C/evolution-guide.sgml: Added usage-print entity.
-
- * C/menuref.sgml: Fixed calendar menu stuff.
-
- * C/usage-mail.sgml: No more "Actions" menu, other assorted
- menu-related changes.
-
-2000-10-06 Aaron Weber <aaron@helixcode.com>
-
- * C/fig/ * replaced a whole bunch of screenshots.
-
-2000-10-05 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: Described Search features.
-
- * C/menuref.sgml: Contact Manager menus fixed.
-
-2000-10-04 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: Fixed glossterms.
-
- * C/usage-mail.sgml: Fixed glossterms, filenames, spellchecked.
-
- * C/apx-gloss.sgml: Added "Inline," "VCard".
-
- * C/usage-mainwindow.sgml: Fixed glossterms,
- filenames. Spellchecked.
-
- * C/usage-mail.sgml: Fixed glossterms, filenames. Spellchecked.
-
- * C/evolution-guide.sgml: New Legalnotice. Removed FDL and GPL,
- which are now included as part of the gnome-help package.
-
- * C/usage-contact.sgml: Spellcheck. Fixed some wording, and
- responded to clahey's suggestions-- notably, commented out the
- "add to master list" category feature.
-
- * C/usage-calendar.sgml: Spellcheck. Fixed wording, event overlap
- description.
-
- * C/evolution-guide.sgml: Spellcheck. Commented out Notes
- entities.
-
- * C/usage-notes.sgml: Spellchecked, then decided to comment out
- this file/chapter and all references to it, since it's unlikely to
- be implemented any time soon.
-
- * C/config-setupassist.sgml: Spellcheck. Other minor updates. May
- need more work in the near future.
-
- * C/usage-sync.sgml: Now it's really short. And spelled correctly.
-
-2000-10-03 Aaron Weber <aaron@helixcode.com>
-
- * C/config-prefs.sgml: Mostly spelling. Still needs major
- alteration.
-
- * C/menuref.sgml: s/Appintment/Appointment, fixed small errors,
- ran spellcheck. Still needs lots of work, since many menus have
- changed.
-
- * C/apx-gloss.sgml: Added Virus, Protocol, fixed vFolder,
- spellchecked.
-
-2000-09-26 Aaron Weber <aaron@helixcode.com>
-
- * C/apx-gloss.sgml: Added sendmail and SMTP.
-
-2000-09-22 Aaron Weber <aaron@helixcode.com>
-
- * C/menuref.sgml: Changed to reflect new menu layout.
-
- * C/usage-mainwindow.sgml: Changed to reflect new menu
- layout. Again.
-
- * C/usage-contact.sgml: Stop and Display All features.
-
-2000-09-21 Aaron Weber <aaron@helixcode.com>
-
- * C/evolution-guide.sgml: Switched to the "official" FSF markup.
- I will have to make changes to the markup-- adding ids, etc, or
- switch to another version of the markup. Pending discussion by
- GDP.
-
- * C/apx-authors.sgml: Changed Matt Loper's email address to
- loper.org; added Jeff Stedfast and Peter Williams to authors list,
- realphebetized.
-
- * C/config-prefs.sgml: Revision to reflect current options
- labelling.
-
- * C/evolution-guide.sgml: Changes to part intros.
-
- * C/preface.sgml: Spelling and menu fixes. Will need more work
- tomorrow.
-
-2000-09-20 Aaron Weber <aaron@helixcode.com>
-
- * C/config-prefs.sgml: Fixed sig stuff here and in setupassist.
-
- * C/config-sync.sgml: Fixed description of conduit usage.
-
-2000-09-18 Aaron Weber <aaron@helixcode.com>
-
- * C/preface.sgml: Spelling fixes, etc.
-
-2000-09-19 Federico Mena Quintero <federico@helixcode.com>
-
- * C/Makefile.am: Fixed to install the stylesheet-images as well.
-
-2000-09-07 Aaron Weber <aaron@helixcode.com>
-
- * C/fig/ New files: contact-editor.png, mail-composer.png,
- filter-assist-fig.png, mail-inbox.png
-
-2000-09-07 Aaron Weber <aaron@helixcode.com>
-
- * C/preface.sgml: Redid "soft" intro stuff.
-
- * C/evolution-guide.sgml: Accidentally broke docs, now valid.
-
-2000-09-06 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: Editing, proofing.
-
-2000-09-05 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: Grammar, links, screenshots.
-
- * fig/* Re-took most screenshots.
-
- * C/usage-mail.sgml: Filters, proofing.
-
-2000-09-01 Aaron Weber <aaron@helixcode.com>
-
- * C/config-prefs.sgml: Added coverage of news, clarified POP/IMAP
- distinction (there's a theme to these four log entries here).
-
- * C/usage-mail.sgml: Added coverage of news.
-
- * C/config-setupassist.sgml: Revised mail sources content for
- IMAP/POP stuff.
-
- * C/apx-gloss.sgml: Added IMAP and POP.
-
-2000-08-31 Aaron Weber <aaron@helixcode.com>
-
- * C/apx-gloss.sgml: Added regular expressions to glossary.
- Explanation should be removed from other portions of the book now.
-
- * C/usage-mainwindow.sgml: Revisions, minor.
-
- * C/apx-menuref.sgml: Now named menuref.sgml, to reflect its new
- status as a part.
-
- * C/evolution-guide.sgml: Structural alterations: Menuref is now a
- part, not an appendix.
-
- * C/apx-menuref.sgml: Added contextual menus for mail.
-
- * C/preface.sgml: Added "quickref and pointers" sections. Props to
- O'Reilly for the copy of Outlook in a Nutshell which gave me the
- idea.
-
-2000-08-30 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mainwindow.sgml: Minor fixes.
-
- * C/preface.sgml: Corrected grammar, added glossterms, described
- menuref.
-
-2000-08-25 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: Redid filter and vFolder assistant
- descriptions.
-
- * C/fig/filter-new-fig.png: Replaced with new assistant pic.
-
- * C/fig/filter-assist-fig.png: New file, showing only assistant.
-
-
- * C/apx-menuref.sgml: Finished message composer and calendar
- editor menus. Looked at Contact Editor menus and decided to
- document those features after implementation.
-
-2000-08-24 Aaron Weber <aaron@helixcode.com>
-
- * C/apx-menuref.sgml: Message Composer File and Edit menus.
-
-2000-08-23 Aaron Weber <aaron@helixcode.com>
-
- * C/apx-menuref.sgml: Added editor sections.
-
- * C/evolution-guide.sgml: Included Menu Reference Appendix.
-
-2000-08-22 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: Minor markup changes.
-
- * C/apx-menuref.sgml: New File. Menu Reference. Still needs much
- work, but not bad for an evening.
-
-2000-08-21 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: Kevin's diff applied, with minor changes.
-
-2000-08-09 Aaron Weber <aaron@helixcode.com>
-
- * C/evolution-guide.sgml: Fixed bugs in validation. Went home to
- sleep.
-
- * C/usage-mainwindow.sgml: Redid menubar description.
-
-
- * C/config-prefs.sgml: Added coverage of folder config, requested
- that feature be transferred to config section. Switched to
- variablelist in "Other" config section.
-
- * C/usage-mail.sgml: Added coverage of right-click on messages,
- threaded-view.
-
- * C/usage-mainwindow.sgml: Right-click on folder menu reinstated.
-
-2000-08-07 Aaron Weber <aaron@helixcode.com>
-
- * C/config-prefs.sgml: Added news server coverage. Other config
- proofing changes.
-
-
-2000-08-05 Aaron Weber <aaron@helixcode.com>
-
- * C/apx-gpl.sgml: New file. Contains contents of "COPYING", but
- marked up (probably not very well, but valid) as docbook
- (SGML).
-
- * C/evolution-guide.sgml: Subtle change to the legal notice:
- distinguished manual license from software license. Linked to
- apx-gpl.sgml above.
-
- * C/usage-calendar.sgml: I redid all the usage files.
-
-2000-07-21 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: Added password remembering/forgetting
- feature.
-
- * C/config-prefs.sgml: Mostly moved to variablelists, a few
- language changes.
-
- * C/config-setupassist.sgml: Minor changes to formatting, wording.
-
- * C/usage-notes.sgml: Changed trademark references, other minor
- changes.
-
- * C/usage-calendar.sgml: Minor fixes, added additional calendar
- section, removed references to unimplemented features. Spellcheck,
- prep for 0.3 release.
-
-2000-07-19 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: lots of minor fixes to language. added
- desc. of clahey's cool button-address thing.
-
- * C/usage-mainwindow.sgml: fixed itemizedlists, ch. to shortcut
- bar & folder descs, removed refs to trash.
-
-2000-07-18 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: Altered category addition stuff, plus
- suggestions from Kevin.
-
- * C/apx-gloss.sgml: Added ldap and signature definitions (from
- Kevin).
-
- * C/usage-mail.sgml: Move to variablelists from itemizedlists.
-
-2000-07-14 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: moved to variablelists from itemizedlists
- * C/usage-calendar.sgml: moved to variablelists from itemizedlists
-
-2000-06-29 Aaron Weber <aaron@helixcode.com>
-
- * C/preface.sgml: Minor fixes.
-
- * C/usage-notes.sgml: New File for feature that is yet to come.
- * C/evolution-guide.sgml: Added entity for notes chapter.
- * C/usage-mainwindow.sgml: Un-commented references to notes section.
-
- * C/apx-authors.sgml: Removed dcm from author list.
-
- * C/usage-calendar.sgml: Added to-do list features.
-
-2000-06-28 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: commented out future features; redid
- contact editor stuff.
-
- * C/apx-gloss.sgml: Removed "live doc" and added "minicard"
-
-2000-06-27 Aaron Weber <aaron@helixcode.com>
-
- * C/devel-action.sgml: Removed file.
- * C/devel-script.sgml: Same.
- * C/devel-component.sgml: Same.
- * C/preface.sgml: Removed references to devel section.
- * C/evolution-guide.sgml: Removed references to devel section.
-
-2000-06-23 Aaron Weber <aaron@helixcode.com>
-
- * C/evolution-guide.sgml: Made moderate to major stylistic updates
- to this, apx-gloss.sgml, and to all files beginning with "usage,"
- especially wrt HTML mail.
-
-
-2000-06-15 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: Category stuff improved.
-
- * C/usage-calendar.sgml: Now covers how to add an event properly.
-
-2000-07-17 Federico Mena Quintero <federico@helixcode.com>
-
- * Makefile.am (SUBDIRS): Added the devel directory.
-
-2000-06-28 Peter Williams <peterw@curious-george.helixcode.com>
-
- * C/Makefile.am (SGML_FILES): Don't depend on the newly-removed
- devel-*.sgml files.
-
-2000-06-16 Damon Chaplin <damon@helixcode.com>
-
- * C/.cvsignore: added evolution-guide and evolution-guide.junk
- so we don't get the '? doc/C/evolution-guide' messages each time we
- do a cvs update.
-
-2000-06-14 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mainwindow.sgml: added sect on menubar, other minor changes.
-
- * C/usage-mail.sgml: Improved filter and vfolder
- description, and some minor changes from me and Kevin.
-
-2000-06-07 Aaron Weber <aaron@helixcode.com>
-
- * C/config-prefs.sgml: finished adding calendar prefs. screenshots.
- * C/fig/config-cal.png: new file (screenshot for above)
- * C/fig/config-mail.png: same
-
-2000-06-05 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-calendar.sgml: Incorporated chgs from Kevin.
-
- * C/config-prefs.sgml: began total overhaul of structure and added
- content reflecting new prefs items. needs LOTS more work.
-
- * C/usage-mail.sgml: changed some references to id's in the
- config-prefs section.
-
- * C/fig/config-mail.png: changed filename from config-prefs.png
-
-2000-06-01 Aaron Weber <aaron@helixcode.com>
-
- * C/config-prefs.sgml: filename was wrong, altered.
-
- * C/usage-mail.sgml: improved filter instructions, vFolder
- instructions. still need work though.
-
-
- * C/usage-contact.sgml: added screenshot.
-
- * C/usage-calendar.sgml: added screenshot.
-
- * C/config-prefs.sgml: added screenshots, and now describes the
- actual prefs dialogs.
-
- * C/fig/config-camel.png: new (screenshot) file
- * C/fig/filter-druid.png: same
- * C/fig/vfolder-druid.png: same
- * C/fig/calendar.png: same
- * C/fig/contact.png: same
- * C/fig/vfolder-createrule-fig.png: same
- * C/fig/filter-new-fig.png: same
- * C/fig/config-camel.png: same
-
-2000-06-01 Dan Winship <danw@helixcode.com>
-
- * Makefile.am: recurse into the C directory
-
- * C/Makefile.am: Rules to build and install the docs. Mostly
- stolen from gnomecal. Only works if you have GDP stuff
- (http://www.gnome.org/gdp/) set up on your machine, but won't make
- the build fail if you don't.
-
-2000-05-29 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: incorporated kevins notes.
- * C/usage-mainwindow.sgml: incorporated kevins notes.
-
-2000-05-27 Aaron Weber <aaron@helixcode.com>
-
- * C/evolution-guide.sgml: added Kevin Breit to author and
- copyright.
-
- * C/apx-authors.sgml: Put app authors in a simplelist.
-
- * C/usage-mail.sgml: Removed USAGE-SETUP insertion, added xref to send
- users to config-setupassist chapter. This and the following changes
- take setup druid coverage out of usage
- section and put it in config section.
- * C/config-setupassist.sgml: Added mail druid coverage from
- usage-setup.sgml.
- * C/usage-setup.sgml: Removed file. contents in
- config-setupassist.sgml.
- * C/evolution-guide.sgml: Removed
- USAGE-SETUP entity (and file usage-setup.sgml.)
-
-
-2000-05-26 Aaron Weber <aaron@helixcode.com>
-
- * C/fig/mainwindow-pic.png: new file
- * C/fig/mail-druid-pic.png: new file
- * C/fig: New directory, for figure graphics.
-
- * C/apx-gloss.sgml: new file. glossary. thx. to kevin from chicago.
-
- * C/usage-setup.sgml: More accurate description of druid, and
- moved to mail section-- see usage-mail.sgml entry. This is a new
- location for this entity, and it may move more later.
-
-
- * C/usage-mainwindow.sgml: altered description of starting
- evolution. added screenshot for main-window picture.
-
- * C/usage-mail.sgml: added screenshots, added coverage of setup
- druid and put it into get-and-send section, which is probably not
- where it should stay. Also started filter druid coverage and
- clarified examples, esp. in Bcc: section.
-
- * C/usage-contact.sgml: Clarified examples.
-
- * C/preface.sgml: rewording of "what is" and "about book" sections.
-
- * C/evolution-guide.sgml: added glossary entity APX-GLOSS, altered
- phrasing in part intros, changed order of Setup-assistant section.
-
- * C/config-prefs.sgml: changed wording, removed ref. to re-running
- setup assistant.
-
-2000-05-18 Aaron Weber <aaron@helixcode.com>
-
- * C/evo_book_0.1.sgml: removed.
-
- * C/apx-authors.sgml: new file.
- * C/apx-bugs.sgml: same.
- * C/apx-fdl.sgml: same.
- * C/config-prefs.sgml: same.
- * C/config-setupassist.sgml: same.
- * C/config-sync.sgml: same.
- * C/devel-action.sgml: same.
- * C/devel-component.sgml: same.
- * C/devel-script.sgml: same.
- * C/evolution-guide.sgml: same.
- * C/preface.sgml: same.
- * C/usage-calendar.sgml: same.
- * C/usage-contact.sgml: same.
- * C/usage-mail.sgml: same.
- * C/usage-mainwindow.sgml: same.
- * C/usage-setup.sgml: same.
- * C/usage-sync.sgml: same.
-
-2000-05-07 Dan Winship <danw@helixcode.com>
-
- * Camel-Classes: sync
-
-2000-04-16 Aaron Weber <aaron@helixcode.com>
-
- * C/evo_book_0.1.sgml: new file (doc sgml)
-
- * C/ : New directory for doc sgml & graphics
-
-2000-03-05 Christopher James Lahey <clahey@helixcode.com>
-
- * white-papers/widgets/e-table.sgml: Added Miguel to the author
- list for ETable.
-
-2000-03-03 Christopher James Lahey <clahey@helixcode.com>
-
- * white-papers/widgets/, white-papers/widgets/e-table.sgml: New
- doc for the ETable widget.
-
- * ChangeLog: Created a ChangeLog file for the docs file and
- integrated the individual ChangeLogs.
-
-2000-03-01 Dan Winship <danw@helixcode.com>
-
- * ibex.sgml: Ibex white paper
-
-2000-02-29 Federico Mena Quintero <federico@helixcode.com>
-
- * calendar.sgml: Sections for the calendar user agent and the
- calendar client library.
-
-2000-02-29 Dan Winship <danw@helixcode.com>
-
- * camel.sgml: Reorg a bit more, make the <PRE> section narrower,
- add more references to graphics (the graphics themselves are
- still in beta), add a section on CamelStream.
-
-2000-02-28 Federico Mena Quintero <federico@helixcode.com>
-
- * calendar.sgml: Section for the personal calendar server.
-
-2000-02-28 Dan Winship <danw@helixcode.com>
-
- * camel.sgml: add Bertrand to authors, edit his additions
-
-2000-02-28 bertrand <bertrand@helixcode.com>
-
- * camel.sgml: add a blurb about camel offering
- uniform interface. needs style and grammar corrections.
- Talk about virtual folders.
- Talk about lightweight messages
- Talk about IMAP.
-
-2000-02-28 Dan Winship <danw@helixcode.com>
-
- * camel.sgml: Beginnings of a Camel white paper
-
-2000-02-25 Federico Mena Quintero <federico@helixcode.com>
-
- * calendar.sgml: New file for the Evolution calendaring white paper.
diff --git a/doc/Design b/doc/Design
deleted file mode 100644
index 7b7cf6f821..0000000000
--- a/doc/Design
+++ /dev/null
@@ -1,201 +0,0 @@
-
-The Evolution Project specification
-Miguel de Icaza.
-
-
-* Introduction
-
- Evolution is a project aiming at providing the free software
- community with a professional, high-quality tool for managing
- mail, appointments, tasks and other personal information
- tools.
-
- We want to make Evolution a system that addresses our needs
- (the free software development community) and we believe that
- by addressing our needs, we will provide a system that will
- scale in the years to come for other users that are just
- starting to use computers and the internet.
-
- The main objectives of Evolution are to provide these powerful
- features, and to make the user interface as pretty and
- polished as possible.
-
- Evolution is a GNOME application and a number of auxiliary
- CORBA servers that act as the storage backends.
-
- Evolution will copy the best user interface bits and the best
- ideas and features found on contemporary groupware systems.
-
-* Evolution internals.
-
- Evolution can store its information locally (files for mail,
- calendar and address book) or on a remote server (imap/pop,
- cap, ldap).
-
- Given the importance of syncing in this modern PDA world,
- the Evolution GUI acts as a client to the data repository.
- The data repository is a GUI-less CORBA server called Wombat.
-
- Wombat provides a unified access system to the calendar and
- addressbook data (doing mail is a bit hard, so we are leaving
- this as a TODO item for now).
-
- Wombat's CORBA interfaces are notifier-based. This means that
- CORBA requests sent to Wombat do not return values
- inmediately, but rather than for Wombat requests the user has
- to provide a CORBA object that will be notified of what
- happened.
-
- Yes, that sounds hairy. It is actually pretty simple. It
- basically means that you submit requests to Wombat, and a
- callback is invoked in your code when the request has been
- carried away.
-
- This enables a Palm to sync to the repository without having
- the GUI for Evolution running. It also means that volunteers
- will be able to write text-based and web-based versions of
- Evolution (not me though :-).
-
-* Evolution as a platform
-
- Evolution is more than a client for managing the above
- information: Evolution is a platform for building groupware
- applications that use the above components to get their work done.
-
- To achieve this Evolution is designed to be scriptable, and it
- exports its internals trough CORBA/Bonobo. It is implemented
- as a collection of Bonobo containers and Bonobo components.
-
- There is a clean separation between the views (the user
- interface) and the model (the view). The views that we are
- writing are GNOME based, and they talk to the Wombat CORBA
- server.
-
- Wombat takes care of notifications to the various clients for
- the data.
-
-* The overall organization
-
- A bar similar to outlook provides shortcuts for accessing the
- various resources managed by Evolution: mail folders,
- contacts, tasks, journal entries, notes, messages and other
- user-defined destinations.
-
-* User interface widgets
-
-** The ETable package
-
- This package provides a way of displaying and editing tables.
-
- Tables are displayed based on a TableColumn definition that
- defines the layout used for the display. Table Columns can be
- nested, and the package does grouping of information displayed
- according to the criteria defined there.
-
- This is used in multiple places troughout evolution: it is
- used for the Mail summary display, for the TODO display and
- TODO new data entry and for the address book.
-
- Nesting in the address book can be performed on various
- fields. For example, a first level of nesting could be
- "Company" and a second level would be "Country" the result is
- a 2-level tree that can be collapsed expanded and contains the
- information sorted/grouped by those two criteria.
-
- The user interface for this will be copied from Outlook: the
- possibility of adding and removing fields with drag and drop
- as well as grouping using drag and drop.
-
-* The Mail system
-
-** The Mail sources
-
- The mail system will support 4 sources of mail:
-
- POP3 (transfer to a local file).
- IMAP
- Local mbox format in $MAIL.
- Local mbox format that have other delivery points.
-
- On top of that, it will be possible to browse existing mbox
- archives (and possibly other formats in the future, like
- Mailbox and Maildir).
-
-** Storing the mail
-
- Mail that gets incorporated into the system is stored in mbox
- format, and summary files are provided for quick access to the
- files. No modifications to the file on disk is performed (I
- am not quite sure about this, perhaps we want to add the
- status flags and some method for adding metadata to the mail).
-
- Summary files are rebuilt on demand or rebuild if the mbox
- file and the summary file have got out of sync.
-
- A Metadata system that will enable us to attach information to
- a message will have to be designed and implemented (enabling
- users to add annotations to mails, and special keywords and
- flags in a per-message fashion).
-
-** Folders
-
- Michael Zucchi is working on a system that will let users
- easily define rules for splitting their incoming mail into
- physical folders.
-
- A further refinement to Folders are Virtual Folders. This
- basically provides a powerful search and viewing facility for
- mail. It works like this: when a mail is "incorporated" into
- Evolution it is scanned and indexed.
-
- Then users can enter queries into Evolution that will search
- the entire database of messages.
-
-** Virtual folders
-
- Virtual folders will enable users to read/browse their mail in
- new ways: by specifying search criterias, these folders will
- contain messages that match the criteria given.
-
- There is more information about this in the libcamel
- directory.
-
- We will index all headers from a message, and possible the
- contents of messages and keep those on a separate file, to
- enable users to query their mail database.
-
-** Mail summary display
-
- The summary will be displayed using the ETable package, to
- enable users to add a number of sorting criteria and various
- display methods for the summary view.
-
- The Outlook methods for displaying will be present on the
- system.
-
- Message threading will be supported in Evolution.
-
-** Message display engine
-
- We are going to be using a combination of
- libcamel/limime/libjamie to parse messages and render them
- into an HTML buffer.
-
-* The HTML engine
-
- The GtkHTML engine will be used to display messages, and will
- be extended to support a number of features that we require:
- internal handling of characters will be based on Unicode
-
-* The message composer
-
- Regular features found in composers will be added: connecting
- the composer to the address book, support for drag and drop
- for including attachments, editing the message, archiving
- drafts and archiving messages sent.
-
- Ettore has been working on adding editing support to the
- GtkHTML and he is working currently on a Bonobo component that
- will provide a ready-to-use Bonobo control for embedding into
- other applications.
-
diff --git a/doc/Keybindings b/doc/Keybindings
deleted file mode 100644
index f232802110..0000000000
--- a/doc/Keybindings
+++ /dev/null
@@ -1,13 +0,0 @@
-* Keybindings for the mailer
-
- Delete key: Deletes message, moves forward.
-
-* Keybindings for the composer
-
- Control-s: Saves message to file.
- Control-w: Closes composer window.
- Control-Return: Sends message now.
-
- F6: Opens find dialog.
- F7: Opens replace dialog.
-
diff --git a/doc/Makefile.am b/doc/Makefile.am
deleted file mode 100644
index 965492689a..0000000000
--- a/doc/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-EXTRA_DIST = ChangeLog.pre-1-4
diff --git a/doc/NAMESPACE b/doc/NAMESPACE
deleted file mode 100644
index 4ca7c454d1..0000000000
--- a/doc/NAMESPACE
+++ /dev/null
@@ -1,65 +0,0 @@
-
- Here is how both the Evolution implementation and IDL namespacing
-is to be organized, NB. for implementations and oafinfo filenames we replace
-'/' with '_'
-
-Files:
-
-/GNOME/Evolution/
-
- Addressbook/
- Calendar/
- Control
- gnomecal
- Composer/
- Mail/
- Notes/
- Shell/
- Summary/
- test
- rdf
- Wombat/
-
-Components:
-
- Shell components end in _ShellComponent, controls in _Control,
-executive summary components in _ExecutiveSummaryComponent and
-factories append 'Factory'.
-
-GNOME/
- Evolution/
-
- Shell
-
- Addressbook/
- MiniCard/
- Control, ControlFactory
- SelectNames, SelectNamesFactory
- Control, ControlFactory
- ShellComponent, ShellComponentFactory
- Calendar/
- iTip/
- Control, ControlFactory
- Control, ControlFactory
- ShellComponent, ShellComponentFactory
- ExecutiveSummaryComponent, ExecutiveSummaryComponentFactory
- Mail/
- Control, ControlFactory
- ShellComponent, ShellComponentFactory
- ExecutiveSummaryComponent, ExecutiveSummaryComponentFactory
- Composer, ComposerFactory
- Notes/
- control, controlFactory
- shellComponent, shellComponentFactory
- Summary/
- rdf/
- SummaryComponent, SummaryComponentFactory
- test/
- Component, ComponentFactory
-
- ShellComponent, ShellComponentFactory
-
- Wombat/
- ServerFactory
- CalendarFactory
-
diff --git a/doc/devel/.cvsignore b/doc/devel/.cvsignore
deleted file mode 100644
index 81268d18cf..0000000000
--- a/doc/devel/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-Makefile
-Makefile.in
-html
-evolution-devel-guide.html
-*.stamp
diff --git a/doc/devel/ChangeLog b/doc/devel/ChangeLog
deleted file mode 100644
index 0b137d8036..0000000000
--- a/doc/devel/ChangeLog
+++ /dev/null
@@ -1,57 +0,0 @@
-2004-11-18 Not Zed <NotZed@Ximian.com>
-
- * evolution-plugin-manual.xml: define load-on-startup parameter.
-
-2004-11-03 Not Zed <NotZed@Ximian.com>
-
- * evolution-plugin-manual.xml: added author section to eplugin
- definition.
-
-2004-10-28 Not Zed <NotZed@Ximian.com>
-
- * evolution-plugin-manual.xml: setup for more auto-built stuff.
-
- * build-eplugin-manual.pl: auto-build more stuff.
-
-2004-10-12 Not Zed <NotZed@Ximian.com>
-
- * evolution-plugin-manual.xml: doc updates for new 'check' callback.
-
-2004-10-07 Not Zed <NotZed@Ximian.com>
-
- * evolution-plugin-manual.xml: some updates.
-
-2004-09-09 Not Zed <NotZed@Ximian.com>
-
- * evolution-plugin-manual.xml: updates. some not very readable, sigh.
-
- * images: Added e-popup-merge-[12].pic.
-
-2004-09-04 Not Zed <NotZed@Ximian.com>
-
- * images/Makefile: add a temporary makefile to build images from
- source pic files.
-
- * evolution-plugin-manual.xml: updates/rearrangements.
-
-2004-09-01 Not Zed <NotZed@Ximian.com>
-
- * images/*: added some image files.
-
- * evolution-plugin-manual.xml: fix for some api changes. Updates.
-
-2004-08-25 Not Zed <NotZed@Ximian.com>
-
- * evolution-plugin-manual.xml: Added the working plugin manual
- in-case i crash my bike going to work one day.
-
-2003-11-20 JP Rosevear <jpr@ximian.com>
-
- * Remove dead doc files.
-
-2003-09-11 Dan Winship <danw@ximian.com>
-
- * calendar/cal-client/Makefile.am (GTKDOC_LIBS): Use non-static
- libraries.
-
- * calendar/cal-util/Makefile.am (GTKDOC_LIBS): Likewise
diff --git a/doc/devel/ChangeLog.pre-1-4 b/doc/devel/ChangeLog.pre-1-4
deleted file mode 100644
index 4d90e1e515..0000000000
--- a/doc/devel/ChangeLog.pre-1-4
+++ /dev/null
@@ -1,286 +0,0 @@
-2003-01-22 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (HTML_DIR): Version using $(BASE_VERSION).
-
-2002-07-17 Peter Williams <peterw@ximian.com>
-
- * calendar/cal-util/Makefile.am (GTKDOC_LIBS): Because we're
- using libtool as our LD, we can reference .la's and libtool
- will DTRT for us.
-
- * calendar/cal-client/Makefile.am (GTKDOC_LIBS): Same here.
-
-2002-03-19 Dan Winship <danw@ximian.com>
-
- * calendar/cal-util/Makefile.am (GTKDOC_LIBS): Update for
- libversit change.
-
- * calendar/cal-client/Makefile.am (GTKDOC_LIBS): Likewise
-
-2002-01-24 Ettore Perazzoli <ettore@ximian.com>
-
- * calendar/cal-client/Makefile.am: Use EVOLUTION_CALENDAR_CFLAGS
- and EVOLUTION_CALENDAR_LIBS.
- * calendar/cal-util/Makefile.am: Likewise.
-
-2001-12-18 JP Rosevear <jpr@ximian.com>
-
- * calendar/cal-client/Makefile.am: cal-client needs bonobo-conf
- now
-
-2001-10-29 Federico Mena Quintero <federico@ximian.com>
-
- * calendar/alarm-generation.sgml: Updated docs for repeating
- alarms.
-
-2001-07-31 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (dist-hook): Remove the copying of the
- index.sgml file which doesn't seem to be generated
- anywhere anyway.
-
-2001-06-25 Peter Williams <peterw@ximian.com>
-
- * Makefile.am: ... and comment out more exec summary stuff.
-
- * reference.sgml: Here too.
-
-2001-06-25 Peter Williams <peterw@ximian.com>
-
- * calendar/cal-util/Makefile.am,
- calendar/cal-client/Makefile.am: Fix make dist.
-
- * Makefile.am: clean up a bit.
-
-2001-06-21 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: disable executive summary build because it is no
- longer built
-
-2001-06-21 JP Rosevear <jpr@ximian.com>
-
- * calendar/cal-client/Makefile.am: add new lib
-
-2001-06-21 Peter Williams <peterw@ximian.com>
-
- * Makefile.am:
- calendar/cal-client/Makefile.am:
- calendar/cal-util/Makefile.am:
- importer/Makefile.am:
- executive-summary/Makefile.am: Changed to used gtk-doc's
- canonical Makefile.am (plus some tweaks because not every
- dir builds html).
-
-2001-06-14 Damon Chaplin <damon@ximian.com>
-
- * executive-summary/.cvsignore:
- * calendar/cal-util/.cvsignore:
- * calendar/cal-client/.cvsignore: added *-undocumented.txt
-
-2001-05-24 Federico Mena Quintero <federico@ximian.com>
-
- * evolution-devel-guide.sgml: s/Helix Code/Ximian
-
-2001-05-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * Removed some evolution-*-decl.txt files since these are
- autogenerated by gtk-doc and don't belong in cvs anyway.
- Should the tmpl/ dirs also be removed??
-
- Updated: Readded them and updated the .cvsignore files - I guess
- we do need them after all ;-)
-
-2001-04-25 Jon Trowbridge <trow@ximian.com>
-
- * Removed generated files from CVS, updated .cvsignore files
- to include generated files.
-
-2001-04-23 Ettore Perazzoli <ettore@ximian.com>
-
- * executive-summary/Makefile.am (scan) [ENABLE_GTK_DOC]: Kludge
- builddir != srcdir behavior by symlinking the $(DOC_MODULE).types
- file into the builddir.
- * calendar/cal-client/Makefile.am (scan) [ENABLE_GTK_DOC]:
- Likewise.
- * calendar/cal-util/Makefile.am (scan) [ENABLE_GTK_DOC]: Likewise.
-
-2001-04-23 Ettore Perazzoli <ettore@ximian.com>
-
- * evolution-devel-guide.sgml: Disable the importer references here
- too.
-
- * Makefile.am: Remove the importer stuff for now.
-
-2001-04-20 Damon Chaplin <damon@ximian.com>
-
- * importer/evolution-shell-importer.types: changed path to the
- importer header files, since we've had reports that they aren't being
- found (though it worked OK for me).
-
-2001-04-17 Ettore Perazzoli <ettore@ximian.com>
-
- * calendar/cal-client/Makefile.am (install-data-local): Install
- the $(DOC_DIR_INSTALL_FILES) from the srcdir.
- * calendar/cal-util/Makefile.am (install-data-local): Likewise.
- * importer/Makefile.am (install-data-local): Likewise.
- * executive-summary/Makefile.am (install-data-local): Likewise.
-
-2001-01-26 John R. Sheets <dusk@ravendusk.org>
-
- * importer/Makefile.am: Change (nonexistant) importer.sgml
- references to evolution-importer.sgml to fix dependency problem.
-
-2001-01-17 Iain Holmes <iain@ximian.com>
-
- * Makefile.am (local_entities): Added the importer stuff.
-
- * evolution-devel-guide.sgml: Added entities for the importer documents.
-
- * reference.sgml: Added the public and private APIs for the importer.
-
- * importer/*: New directory containing all the documenation for the
- importer.
-
-2001-01-17 Federico Mena Quintero <federico@ximian.com>
-
- * evolution-devel-guide.sgml: Ximianified.
-
- * calendar/evolution-calendar.sgml: Ditto.
-
- * calendar/cal-util/evolution-cal-util-sections.txt: Updated.
-
- * calendar/cal-client/evolution-cal-client-sections.txt: Updated.
-
-2001-01-10 Federico Mena Quintero <federico@helixcode.com>
-
- * Makefile.am: Make it work when gtk-doc is not installed.
-
- * calendar/cal-client/Makefile.am: Likewise.
-
- * calendar/cal-util/Makefile.am: Likewise.
-
-2000-12-19 Federico Mena Quintero <federico@helixcode.com>
-
- Added proper dependency lists to the gtk-doc mess.
-
- * calendar/cal-client/Makefile.am (TARGET_DIR): Removed unused
- variable.
- (SOURCE_FILES): New variable with the list of source files we
- depend on.
- (IGNORED_SOURCE_HEADERS): New variable with the headers we ignore
- for the gtkdoc-scan phase.
- (scan_generated):
- (tmpl_dependencies):
- (tmpl_sources):
- (tmpl_generated);
- (sgml_dependencies):
- (sgml_generated): Lists of stuff that is generated and that other
- stuff depends on.
- (all): Added the $(sgml_generated) as the final target.
- (install-data-local): Added an installation hook; gtk-doc seems to
- want some of its generated files to be installed.
-
- * calendar/cal-client/evolution-cal-client-sections.txt: Updated.
-
- * calendar/cal-util/Makefile.am: Made the same changes as for
- calendar/cal-client/Makefile.am.
-
- * calendar/cal-util/evolution-cal-util-sections.txt: Updated.
-
- * Makefile.am (local_entities): Added alarm-generation.sgml.
- (all): Made the main target be the html/index.html.
-
-2000-12-18 Federico Mena Quintero <federico@helixcode.com>
-
- * calendar/alarm-generation.sgml: New file with a description of
- the algorithm used to generate alarm instances.
-
- * evolution-devel-guide.sgml: Added an entity for the above
- chapter.
-
- * calendar/evolution-calendar.sgml: Reference the entity here.
-
- * calendar/Makefile.am (EXTRA_DIST): Added alarm-generation.sgml.
-
-2000-12-13 Larry Ewing <lewing@helixcode.com>
-
- * calendar/Makefile.am (EXTRA_DIST): make it public-reference.sgml
- not referenc.sgml here.
-
-2000-11-29 Federico Mena Quintero <federico@helixcode.com>
-
- * calendar/architecture.sgml: Finished the calendar architecture
- chapter.
-
-2000-11-29 Federico Mena Quintero <federico@helixcode.com>
-
- * evolution-devel-guide.sgml: Added an id for the API reference <part>.
- Added the FDL <legalnotice>.
- Added the preface and toplevel reference entities.
- Added entities for Evolution, Wombat, and Camel.
- Added an appendix for the GNU FDL.
-
- * preface.sgml: New file with the introduction to the Evolution
- Developer's Guide.
-
- * reference.sgml: Split the toplevel reference part into its own
- file.
-
- * fdl.sgml: Added the GNU Free Documentation License.
-
- * calendar/evolution-calendar.sgml: Added an id for the <part>.
-
- * calendar/public-reference.sgml: Added an id for the <reference>.
- Moved this file over from calendar/reference.sgml.
-
- * Makefile.am (local_entities): Added a list of the SGML files
- that define entities for inclusion in the toplevel document. This
- way we can track documentation file dependencies down to all
- levels.
- (html/index.html): Made the toplevel document depend on
- $(local_entities). Also, removed the "html" target and put its
- contents directly here; this way we avoid having .PHONY targets.
- (EXTRA_DIST): Removed the evolution_devel_guideDATA; it made no
- sense.
- (content_files): Added preface.sgml and reference.sgml.
-
-2000-09-15 Federico Mena Quintero <federico@helixcode.com>
-
- * evolution-devel-guide.sgml: Made the toplevel <book> id be
- "index".
-
-2000-08-14 Federico Mena Quintero <federico@helixcode.com>
-
- * calendar/cal-util/*: Integrated the cal-util library into the
- documentation framework.
-
- * calendar/Makefile.am (SUBDIRS): Added the cal-util directory.
-
- * evolution-devel-guide.sgml: Added entities for the cal-util stuff.
- Added entity for libical.
-
- * calendar/reference.sgml: Added the cal-util reference entries.
-
- * calendar/cal-client/evolution-cal-client-sections.txt: Updated
- for new API.
-
-2000-08-09 Peter Williams <peterw@helixcode.com>
-
- * Makefile.am (maintainer-clean-local): Don't depend
- on 'clean'; this messes up maintainer-clean.
-
-2000-07-17 Federico Mena Quintero <federico@helixcode.com>
-
- * calendar/cal-client/tmpl/cal-client.sgml: Populated.
-
- * evolution-devel-guide.sgml: New <book> toplevel for the
- Evolution Developer's Guide.
-
- * calendar/evolution-calendar.sgml: New <part> for the calendar
- developer's documentation.
-
- * calendar/architecture.sgml: New <chapter> for the calendar
- architecture.
-
- * calendar/reference.sgml: New <reference> for the calendar API
- reference.
diff --git a/doc/devel/Makefile.am b/doc/devel/Makefile.am
deleted file mode 100644
index 7940af73f5..0000000000
--- a/doc/devel/Makefile.am
+++ /dev/null
@@ -1,179 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-SUBDIRS = calendar
-
-# The name of the module, e.g. 'glib'.
-DOC_MODULE=evolution-devel-guide
-
-# The top-level SGML file. Change it if you want.
-DOC_MAIN_SGML_FILE=evolution-devel-guide.sgml
-
-# The directory containing the source code. Relative to $(srcdir).
-# gtk-doc will search all .c & .h files beneath here for inline comments
-# documenting functions and macros.
-#DOC_SOURCE_DIR=
-
-# Extra options to supply to gtkdoc-scan.
-#SCAN_OPTIONS=
-
-# Extra options to supply to gtkdoc-mkdb.
-#MKDB_OPTIONS=
-
-# Extra options to supply to gtkdoc-fixref.
-#FIXXREF_OPTIONS=
-
-# Used for dependencies.
-#HFILE_GLOB=
-#CFILE_GLOB=
-
-# Header files to ignore when scanning.
-#IGNORE_HFILES=
-
-# Images to copy into HTML directory.
-HTML_IMAGES =
-
-
-# Add your module's hand-written and auto-generated files here; these
-# are used for dependency tracking.
-
-local_entities = \
- calendar/alarm-generation.sgml \
- calendar/architecture.sgml \
- calendar/evolution-calendar.sgml \
- calendar/public-reference.sgml \
- \
- calendar/cal-client/sgml/cal-client.sgml \
- \
- calendar/cal-util/sgml/cal-component.sgml \
- calendar/cal-util/sgml/cal-recur.sgml \
- calendar/cal-util/sgml/cal-util.sgml \
- calendar/cal-util/sgml/timeutil.sgml
-
-# executive-summary/sgml/executive-summary-component.sgml \
-# executive-summary/sgml/executive-summary-component-factory.sgml \
-# executive-summary/sgml/executive-summary-component-factory-client.sgml \
-# executive-summary/sgml/executive-summary-html-view.sgml
-
-# importer/sgml/evolution-importer.sgml \
-# importer/sgml/evolution-importer-client.sgml
-
-installed_content_files = \
- fdl.sgml \
- preface.sgml \
- reference.sgml
-
-# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
-content_files = \
- $(installed_content_files) \
- $(local_entities)
-
-# Other files to distribute.
-extra_files =
-
-# CFLAGS and LDFLAGS for compiling scan program. Only needed if your app/lib
-# contains GtkObjects/GObjects and you want to document signals and properties.
-#GTKDOC_CFLAGS =
-#GTKDOC_LIBS =
-#
-#GTKDOC_CC=$(LIBTOOL) --mode=compile $(CC)
-#GTKDOC_LD=$(LIBTOOL) --mode=link $(CC)
-
-# If you need to override some of the declarations, place them in this file
-# and uncomment this line.
-#DOC_OVERRIDES = $(DOC_MODULE)-overrides.txt
-
-HTML_DIR = $(datadir)/gnome/html/evolution-$(BASE_VERSION)
-
-###########################################################################
-# Everything below here is generic and you shouldn't need to change it.
-###########################################################################
-
-TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
-
-EXTRA_DIST = \
- $(extra_files) \
- $(installed_content_files) \
- $(HTML_IMAGES) \
- $(DOC_MAIN_SGML_FILE) \
- ChangeLog.pre-1-4
-
-# $(DOC_MODULE).types \
-# $(DOC_MODULE)-sections.txt \
-# $(DOC_OVERRIDES)
-
-DOC_STAMPS=scan-build.stamp tmpl-build.stamp sgml-build.stamp html-build.stamp \
- $(srcdir)/tmpl.stamp $(srcdir)/sgml.stamp $(srcdir)/html.stamp
-
-#SCANOBJ_FILES = \
-# $(DOC_MODULE).args \
-# $(DOC_MODULE).hierarchy \
-# $(DOC_MODULE).signals
-
-if ENABLE_GTK_DOC
-all-local: html-build.stamp
-
-#### html ####
-
-html-build.stamp: $(DOC_MAIN_SGML_FILE) $(content_files) #sgml.stamp
- @echo '*** Building HTML ***'
- test -d $(srcdir)/html || mkdir $(srcdir)/html
- cd $(srcdir)/html && gtkdoc-mkhtml $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
- test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) html )
- @echo '-- Fixing Crossreferences'
- cd $(srcdir) && gtkdoc-fixxref --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
- touch html-build.stamp
-endif
-
-##############
-
-clean-local:
- rm -f *~ *.bak *-unused.txt $(DOC_STAMPS) # $(SCANOBJ_FILES)
-
-maintainer-clean-local: clean
- cd $(srcdir) && rm -rf sgml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
-
-install-data-local:
- $(mkinstalldirs) $(DESTDIR)$(TARGET_DIR)
- (installfiles=`echo $(srcdir)/html/*.html`; \
- if test "$$installfiles" = '$(srcdir)/html/*.html'; \
- then echo '-- Nothing to install' ; \
- else \
- for i in $$installfiles; do \
- echo '-- Installing '$$i ; \
- $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \
- done; \
- fi)
-
-# echo '-- Installing $(srcdir)/html/index.sgml' ; \
-# $(INSTALL_DATA) $(srcdir)/html/index.sgml $(DESTDIR)$(TARGET_DIR); \
-
-#
-# Require gtk-doc when making dist
-#
-if ENABLE_GTK_DOC
-dist-check-gtkdoc:
-else
-dist-check-gtkdoc:
- @echo "*** gtk-doc must be installed and enabled in order to make dist"
- @false
-endif
-
-dist-hook: dist-check-gtkdoc dist-hook-local
- mkdir $(distdir)/html
- files=`echo $(srcdir)/html/*.html` ; \
- test '$(srcdir)/html/*.html' = "$$files" \
- || cp $$files $(distdir)/html
- files=`echo $(srcdir)/html/*.css` ; \
- test '$(srcdir)/html/*.css' = "$$files" \
- || cp $$files $(distdir)/html
- images=$(HTML_IMAGES) ; \
- for i in $$images ; do \
- cp $(srcdir)/$$i $(distdir)/html ; \
- done
-
-# mkdir $(distdir)/tmpl
-# mkdir $(distdir)/sgml
-# -cp $(srcdir)/sgml/*.sgml $(distdir)/sgml
-# -cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl
-
-.PHONY : dist-hook-local
diff --git a/doc/devel/build-eplugin-manual.pl b/doc/devel/build-eplugin-manual.pl
deleted file mode 100755
index 8cb951a516..0000000000
--- a/doc/devel/build-eplugin-manual.pl
+++ /dev/null
@@ -1,263 +0,0 @@
-#!/usr/bin/perl
-
-#
-# API reference
-#
-
-%byref = ( 'e-popup.xml' =>
- { 'files' => [ 'e-popup.h', 'e-popup.c' ],
- 'module' => 'e-util' },
-
- 'e-menu.xml' =>
- { 'files' => [ 'e-menu.h', 'e-menu.c' ],
- 'module' => 'e-util' },
-
- 'e-event.xml' =>
- { 'files' => [ 'e-event.h', 'e-event.c' ],
- 'module' => 'e-util' },
-
- 'e-config.xml' =>
- { 'files' => [ 'e-config.h', 'e-config.c' ],
- 'module' => 'e-util' },
-
- 'e-plugin.xml' =>
- { 'files' => [ 'e-plugin.h', 'e-plugin.c' ],
- 'module' => 'e-util' },
-
- 'em-popup.xml' =>
- { 'files' => [ 'em-popup.h', 'em-popup.c' ],
- 'module' => 'mail' },
-
- 'em-format.xml' =>
- { 'files' => [ 'em-format-hook.h' , 'em-format-hook.c',
- 'em-format.h', 'em-format.c',
- 'em-format-html.h', 'em-format-html.c' ],
- 'module' => 'mail' },
- );
-
-foreach $out (keys %byref) {
- print "file $out\n";
- %data = %{$byref{$out}};
- @files = @{$data{'files'}};
- $module = $data{'module'};
- $files = "";
- foreach $file (@files) {
- $files .= " ../../".$module."/".$file;
- }
- system("kernel-doc -docbook $files > $out");
-}
-
-#
-# Event reference
-#
-
-# %events = ( 'em-events.xml' =>
-# { 'files' => [ 'em-folder-view.c', 'em-composer-utils.c', 'mail-folder-cache.c' ],
-# 'module' => 'mail' },
-# );
-
-# foreach $out (keys %events) {
-# print "generating events doc $out\n";
-# %data = %{$events{$out}};
-# @files = @{$data{'files'}};
-# $module = $data{'module'};
-# open OUT,">$out";
-# foreach $file (@files) {
-# open IN,"<../../$module/$file";
-# while (<IN>) {
-# if (m/\@Event: (.*)/) {
-# $title = $1;
-# $name = $1;
-# $target = "";
-# while (<IN>) {
-# if (m/\@Title: (.*)/) {
-# $title = $1;
-# } elsif (m/\@Target: (.*)/) {
-# $target = $1;
-# } elsif (m/\* (.*)/) {
-# $desc.= $1."\n";
-# }
-# last if (m/\*\//);
-# }
-# if ($target eq "") {
-# print "Warning: No target defined for event $name ($title)\n";
-# }
-# print OUT <<END;
-# <sect2>
-# <title>$title</title>
-# <informaltable>
-# <tgroup cols="2">
-# <colspec colnum="1" colname="field" colwidth="1*"/>
-# <colspec colnum="2" colname="value" colwidth="4*"/>
-# <tbody valign="top">
-# <row>
-# <entry>Name</entry>
-# <entry><constant>$name</constant></entry>
-# </row>
-# <row>
-# <entry>Target</entry>
-# <entry>
-# <link
-# linkend="$module-hooks-event-$target">$target</link>
-# </entry>
-# </row>
-# <row>
-# <entry>Description</entry>
-# <entry>
-# <simpara>
-# $desc
-# </simpara>
-# </entry>
-# </row>
-# </tbody>
-# </tgroup>
-# </informaltable>
-# </sect2>
-# END
-# }
-# }
-# close IN;
-# }
-# close OUT;
-# }
-
-#
-# Generic table builder, still experimental.
-#
-
-sub buildxml {
- my $type = $_[0];
- my $out = $_[1];
- my %data = %{$_[2]};
- my @files, $module;
- my $line;
-
- print "generating doc $out for $type\n";
- @files = @{$data{'files'}};
- $module = $data{'module'};
- open OUT,">$out";
- foreach $file (@files) {
- my $line = 0;
-
- open IN,"<../../$module/$file" || die ("Cannot open \"$module/$file\"");
- while (<IN>) {
- if (m/\/\*\* \@$type: (.*)/) {
- my $key = "";
- my $val = "";
- my $desc = 0;
- my $title = $1;
- my %blob = { };
- my @blobs = ();
-
- while (<IN>) {
- $line++;
- if (m/\@(.*): (.*)/) {
- if ($val ne "") {
- $blob{$key} = $val;
- }
- $key = $1;
- $val = $2;
- push @blobs, $key;
- } elsif (m/\* (.+)/) {
- $val .= $1."\n";
- } else {
- if ($desc == 0) {
- if ($val ne "") {
- $blob{$key} = $val;
- }
- $val = "";
- $key = "";
- } else {
- $val .= "\n";
- }
- if (m/\*\s*$/) {
- $desc = 1;
- }
- }
- last if (m/\*\//);
- }
- print OUT<<END;
- <sect2>
- <title>$title</title>
-END
- if ($val ne "") {
- $val =~ s/[\n]+$//gos;
- $val =~ s/\n\n/\<\/simpara\>\n\<simpara\>/g;
- print OUT "<simpara>$val</simpara>\n";
- }
- print OUT <<END;
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody valign="top">
-END
-
- foreach $key (@blobs) {
- print OUT <<END;
- <row>
- <entry>$key</entry>
- <entry>$blob{$key}</entry>
- </row>
-END
-}
- print OUT <<END;
- <row>
- <entry>Defined</entry>
- <entry>$module/$file:$line</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect2>
-END
- }
- $line++;
- }
- close IN;
- }
- close OUT;
-}
-
-
-%hooks = ( 'es-hooks.xml' =>
- { 'type' => 'HookClass',
- 'files' => [ 'es-menu.c', 'es-event.c' ],
- 'module' => 'shell' },
- 'es-menus.xml' =>
- { 'type' => 'HookPoint',
- 'files' => [ 'e-shell-window.c' ],
- 'module' => 'shell' },
- 'es-events.xml' =>
- { 'type' => 'Event',
- 'files' => [ 'e-shell.c' ],
- 'module' => 'shell' },
- 'em-events.xml' =>
- { 'type' => 'Event',
- 'files' => [ 'em-folder-view.c', 'em-composer-utils.c', 'mail-folder-cache.c' ],
- 'module' => 'mail' },
- 'em-popups.xml' =>
- { 'type' => 'HookPoint-EMPopup',
- 'files' => [ 'em-folder-tree.c', 'em-folder-view.c', 'em-format-html-display.c', '../composer/e-msg-composer-attachment-bar.c' ],
- 'module' => 'mail' },
- 'ecal-popups.xml' =>
- { 'type' => 'HookPoint-ECalPopup',
- 'files' => [ 'gui/e-calendar-view.c', 'gui/calendar-component.c', 'gui/e-calendar-view.c', 'gui/tasks-component.c' ],
- 'module' => 'calendar' },
- 'em-configs.xml' =>
- { 'type' => 'HookPoint-EMConfig',
- 'files' => [ 'em-mailer-prefs.c', 'em-account-editor.c', 'em-folder-properties.c', 'em-composer-prefs.c' ],
- 'module' => 'mail' },
- 'em-menus.xml' =>
- { 'type' => 'HookPoint-EMMenu',
- 'files' => [ 'em-folder-browser.c', 'em-message-browser.c' ],
- 'module' => 'mail' },
- );
-
-foreach $out (keys %hooks) {
- %data = %{$hooks{$out}};
-
- &buildxml($data{'type'}, $out, \%data);
-}
-
-
diff --git a/doc/devel/evolution-devel-guide.sgml b/doc/devel/evolution-devel-guide.sgml
deleted file mode 100644
index c089c5b885..0000000000
--- a/doc/devel/evolution-devel-guide.sgml
+++ /dev/null
@@ -1,98 +0,0 @@
-<!DOCTYPE book PUBLIC "-//Davenport//DTD DocBook V3.0//EN"[
-<!ENTITY preface SYSTEM "preface.sgml">
-<!ENTITY evolution-reference SYSTEM "reference.sgml">
-<!ENTITY FDL SYSTEM "fdl.sgml">
-
-<!ENTITY evolution-calendar SYSTEM "calendar/evolution-calendar.sgml">
-<!ENTITY calendar-architecture SYSTEM "calendar/architecture.sgml">
-<!ENTITY calendar-alarm-generation SYSTEM "calendar/alarm-generation.sgml">
-<!ENTITY calendar-public-reference SYSTEM "calendar/public-reference.sgml">
-<!ENTITY CalClient SYSTEM "calendar/cal-client/sgml/cal-client.sgml">
-<!ENTITY CalComponent SYSTEM "calendar/cal-util/sgml/cal-component.sgml">
-<!ENTITY cal-recur SYSTEM "calendar/cal-util/sgml/cal-recur.sgml">
-<!ENTITY cal-util SYSTEM "calendar/cal-util/sgml/cal-util.sgml">
-<!ENTITY timeutil SYSTEM "calendar/cal-util/sgml/timeutil.sgml">
-
-<!ENTITY evolution-services-public-reference SYSTEM "executive-summary/public-reference.sgml">
-<!ENTITY evolution-services-private-reference SYSTEM "executive-summary/private-reference.sgml">
-<!ENTITY ExecutiveSummaryComponent SYSTEM "executive-summary/sgml/executive-summary-component.sgml">
-<!ENTITY ExecutiveSummaryComponentFactory SYSTEM "executive-summary/sgml/executive-summary-component-factory.sgml">
-<!ENTITY ExecutiveSummaryComponentFactoryClient SYSTEM "executive-summary/sgml/executive-summary-component-factory-client.sgml">
-<!ENTITY ExecutiveSummaryHtmlView SYSTEM "executive-summary/sgml/executive-summary-html-view.sgml">
-
-<!ENTITY Evolution "<application>Evolution</application>">
-<!ENTITY Wombat "<application>Wombat</application>">
-<!ENTITY Camel "<application>Camel</application>">
-<!ENTITY PCS "<acronym>PCS</acronym>">
-<!ENTITY libical "<application>libical</application>">
-<!ENTITY Executive-Summary "<application>Executive Summary</application>">
-]>
-
-<!-- ENTITY importer-public-reference SYSTEM "importer/public-reference.sgml" -->
-<!-- ENTITY importer-private-reference SYSTEM "importer/private-reference.sgml" -->
-<!-- ENTITY EvolutionImporter SYSTEM "importer/sgml/evolution-importer.sgml" -->
-<!-- ENTITY EvolutionImporterClient SYSTEM "importer/sgml/evolution-importer-client.sgml" -->
-<!-- ENTITY EvolutionImporterListener SYSTEM "importer/sgml/evolution-importer-listener.sgml" -->
-
-
-<book id="index">
- <bookinfo>
- <title>&Evolution; Developer's Guide</title>
-
- <authorgroup>
- <corpauthor>
- Ximian, Inc.
- </corpauthor>
- </authorgroup>
-
- <copyright>
- <year>2001</year>
- <holder>Ximian, Inc.</holder>
- </copyright>
-
- <copyright>
- <year>2001</year>
- <holder>Ximian, Inc.</holder>
- </copyright>
-
- <legalnotice id="legalnotice">
- <para>
- Permission is granted to copy, distribute and/or modify this
- document under the terms of the <ulink type="help"
- url="gnome-help:fdl"><citetitle>GNU Free Documentation
- License</citetitle></ulink>, Version 1.1 or any later version
- published by the Free Software Foundation with no Invariant
- Sections, no Front-Cover Texts, and no Back-Cover Texts. You
- may obtain a copy of the <citetitle>GNU Free Documentation
- License</citetitle> from the Free Software Foundation by
- visiting <ulink type="http" url="http://www.fsf.org">their Web
- site</ulink> or by writing to: Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- </para>
-
- <para>
- Many of the names used by companies to distinguish their
- products and services are claimed as trademarks. Where those
- names appear in any GNOME documentation, and those trademarks
- are made aware to the members of the GNOME Documentation
- Project, the names have been printed in caps or initial caps.
- </para>
- </legalnotice>
- </bookinfo>
-
- <!-- Introduction -->
-
- &preface;
-
- <!-- DocBook parts for each individual component -->
-
- &evolution-calendar;
-
- <!-- API Reference part -->
-
- &evolution-reference;
-
- <!-- Appendices -->
-
- &FDL;
-</book>
diff --git a/doc/devel/evolution-plugin-manual.xml b/doc/devel/evolution-plugin-manual.xml
deleted file mode 100644
index 2feb047482..0000000000
--- a/doc/devel/evolution-plugin-manual.xml
+++ /dev/null
@@ -1,2803 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-
-<!ENTITY Evolution "<application>Evolution</application>">
-<!ENTITY GNOME "<application>GNOME</application>">
-<!ENTITY eclipse "<application>Eclipse</application>">
-<!ENTITY Camel "<application>Camel</application>">
-<!ENTITY EPlugin "<application>EPlugin</application>">
-<!ENTITY e-popup-reference SYSTEM "e-popup.xml">
-<!ENTITY e-menu-reference SYSTEM "e-menu.xml">
-<!ENTITY e-config-reference SYSTEM "e-config.xml">
-<!ENTITY e-event-reference SYSTEM "e-event.xml">
-<!ENTITY e-plugin-reference SYSTEM "e-plugin.xml">
-
-<!ENTITY em-popup-reference SYSTEM "em-popup.xml">
-<!ENTITY em-format-reference SYSTEM "em-format.xml">
-
-<!ENTITY em-popups SYSTEM "em-popups.xml">
-<!ENTITY em-menus SYSTEM "em-menus.xml">
-<!ENTITY em-configs SYSTEM "em-configs.xml">
-<!ENTITY em-events SYSTEM "em-events.xml">
-
-<!ENTITY ecal-popups SYSTEM "ecal-popups.xml">
-
-<!ENTITY es-events SYSTEM "es-events.xml">
-<!ENTITY es-menus SYSTEM "es-menus.xml">
-
-]>
-<?xml-stylesheet href="sdocbook.css" type="text/css"?>
-
-<book lang="en">
- <!-- DocBook file was created by LyX 1.3
- See http://www.lyx.org/ for more information -->
- <bookinfo>
- <title>
- &Evolution; Plugin Development Manual
- </title>
-
- <authorgroup>
- <corpauthor>
- Novell, Inc.
- </corpauthor>
- <author>
- <firstname>Michael</firstname><surname>Zucchi</surname>
- </author>
- </authorgroup>
-
- <copyright>
- <year>2004</year>
- <holder>Novell, Inc.</holder>
- </copyright>
-
- </bookinfo>
-
- <preface id="preface">
- <title>Preface</title>
-
- <para>
- This document is work-in-progress. Its structure and design is still as
- fluid as the underlying strucutre and design of some parts of EPlugin.
- There's no guarantee it will be updated at regular intervals,
- particularly this version.
- </para>
- <para>
- The API documentation is currently generated using the Linux kernel-doc
- script. The stylesheets used to generate the HTML you're seeing seems to
- have bugs which duplicates some sections. It is also ugly and difficult
- to navigate.
- </para>
-
- <sect1>
- <title>Conventions</title>
- <para>
- The following conventions are used in the manual ... (insert details
- here).
- </para>
- <sect2>
- <title>XML Annotation</title>
- <para>
- XML definitions are annotated with BNF-style markers to indicate
- alternative (|), multiples (* or +), and optional (?) items. If no
- annotation is present then the item must be present once.
- </para>
- <variablelist>
- <varlistentry>
- <!-- is symbol the right one here? -->
- <term><symbol>|</symbol></term>
- <listitem>
- <simpara>Indicates an alternative option. Only one of the items
- separated by <symbol>|</symbol> is to be chosen.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><symbol>*</symbol></term>
- <listitem>
- <simpara>Following an item, <symbol>*</symbol> indicates the item
- may occur any number of times, including no times (0 or more
- multiple).
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><symbol>+</symbol></term>
- <listitem>
- <simpara>Following an item, <symbol>+</symbol> indicates the item
- must occur at least once, but may occur more than ones (1 or
- more multiple).
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><symbol>?</symbol></term>
- <listitem>
- <simpara>Following an item, <symbol>?</symbol> indicates the item
- may occur at most once, if present (0 or 1 times).
- </simpara>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect2>
- </sect1>
-
- </preface>
-
- <part id="informational">
- <title>
- EPlugin
- </title>
- <chapter>
- <title>
- Introduction
- </title>
- <para>
- This book aims to be a comprehensive technical manual for the
- development of plugins for &Evolution;, a personal information manager
- for &GNOME;.
- </para>
- <para>
- Up-to, and including, &Evolution; version 2.0, &Evolution; contained
- limited extensibility interfaces. There were only two ways to extend
- &Evolution;; by implementing a new top-level component, or by
- implementing a &Camel; provider. When implementing a top-level component,
- there was still little integration, and in effect it was merely a more
- complex way of writing a separate &GNOME; application. &Camel; providers
- were only designed to be e-mail storage backends, so were of limited
- use for general extensibility. Despite this, both mechanisms were used
- for example for the Exchange Connector, although the system made the
- integration clumsy and difficult.
- </para>
- <para>
- This lack of extensibility has severaly stifled external developer
- contributions by forcing any extensions to be considered as core
- features. &Evolution; being a commercial product, it has tight usability
- and quality requirements that limits the ability to experiment with
- the core feature set in this way. As a result, very few lines of code
- or new features have been implemented by external contributors.
- </para>
- <para>
- One of the major goals for the 2.2 release was to implement an
- extensibility system, given the working name of EPlugin, which must
- provide a frame-work for both providing extensibility hooks, and for
- extending the functionality of &Evolution;.
- </para>
- <sect1>
- <title>
- Plugin System
- </title>
- <para>
- Any plugin system will generally have a number of goals:
- </para>
- <itemizedlist>
- <listitem>
- <simpara>
- Provide a language independent invocation mechanism
- </simpara>
- </listitem>
- <listitem>
- <simpara>
- Allow extension of parts of the user interface and processing elements
- </simpara>
- </listitem>
- <listitem>
- <simpara>
- Require minimal extra or foreign code to implement in the core application
- </simpara>
- </listitem>
- <listitem>
- <simpara>
- Require minimal interface code to implement the extensions
- </simpara>
- </listitem>
- <listitem>
- <simpara>
- Not to impact performance or increase resource usage unduly
- </simpara>
- </listitem>
- <listitem>
- <simpara>
- Versioning
- </simpara>
- </listitem>
- <listitem>
- <simpara>
- Be able to be extended itself fairly easily.
- </simpara>
- </listitem>
- </itemizedlist>
- <para>
- EPlugin manages to fulfill these goals in most cases. EPlugin isn't a
- single object or interface in itself, although there is an object
- titled EPlugin, it is a synergistic
- <footnote><simpara>I've always wanted to use
- <emphasis>synergistic</emphasis> in a sentence since
- I read it on the back of the Commodore 64 Users
- Guide.</simpara></footnote>
- collection of integrated and
- continually evolving objects which work together to achieve these
- goals (and that will definitly be the end of the MarketSpeak). It
- consists of a loader to invoke extension callbacks, hooks to resolve
- these callbacks, targets to identify context, and managers which are
- used by the core code to provide functionality and merging points for
- the extensions.
- </para>
- <para>
- EPlugin's design was inspired and influenced by the &eclipse;
- project. It aims at a lower target however, so it was able more easily
- implemented in a practical time-frame.
- </para>
- <para>
- &EPlugin; was chosen as an approach to the problem of adding
- scriptability to &Evolution;. Instead of just linking to Perl, or
- Python, or even Mono by itself an approach was taken which focuses on
- the application end of the system. So instead of making every part
- of the application export its functionality and have to deal with
- whatever script engine is present, EPlugin addresses the hooking part
- of the equation in a language-independent manner. It also attemps to
- do it in a way which doesn't impact on the application development
- either.
- </para>
- <para>
- The EPlugin world is awash with its own language. The next few
- sections will introduce the basic plugin nomenclature and high-level
- view of this world.
- </para>
-
- </sect1>
-
- <sect1>
- <title>
- Loaders
- </title>
- <para>
- The core of EPlugin is a light-weight object loader and callback
- invocation system. Because of the varied calling conventions of
- different languages, and to reduce the overhead of the plugin system
- itself, all callbacks only receive and return a single argument. By
- using structures to pass complex arguments, native C plugins require
- no extra overhead, and marshalling details are moved into the plugin
- implementation itself where required. It also simplifies memory
- management issues significantly. For example, the C plugin handler
- merely loads a shared library using GModule, and resolves a symbol by
- name; and is so all of 50 lines of code, total. The loaders are the
- only modules which need to interace with non-native code or
- conventions.
- </para>
- <para>
- The other task of the plugin core is to load XML definitions of the
- plugins. Extension hooks are registered with the plugin core before
- the plugins are scanned, and are automatically instantiated to load
- each definition appropriately as they are encountered.
- </para>
- <para>
- At each layer, a level of indirection is used so that new loaders and
- new hooks can be added transparently, and extend the plugin
- definition freely with any information they require.
- </para>
- </sect1>
-
- <sect1>
- <title>
- Hooks
- </title>
- <para>
- The hooks
- <footnote>
- <para>A hook is something you can hang your stuff on.</para>
- </footnote>
- which are registered with the loader provide meta-data for
- the management implementation layer for extending it at
- run-time. Their primary
- functions are to load the detail of the XML plugin definition, map it
- to the implementation, and marshal the implementation callbacks to
- the common plugin interface. How they do this depends on the
- implementation itself, and ranges from registering factory methods to
- simply adding the items directly.
- </para>
- <para>
- In most cases the physical object need not be loaded until the
- callback is invoked, since the plugin definitions provide enough
- contextual information to build the interface or determine when they
- need to be invoked.
- </para>
- </sect1>
-
- <sect1>
- <title>
- Managers
- </title>
- <para>
- Managers
- <footnote>
- <para>
- Unlike real managers, these are the ones that do the heavy lifting.
- </para>
- </footnote>
- provide tools for the core code to extend itself at specific
- points, and in many cases are the objects used directly in the code
- to implement core features. In other cases they simply provide the
- hooks with an entry point into &Evolution;. For example, for the main
- menu hook, the manager is a thin layer to BonoboUI. On the other
- hand, EPopup is a complete implementation of a popup menu management
- system which was already used in &Evolution; 2.0. Some managers are
- one-off objects used as constructors for other objects, others are
- view-dependent, and some are static objects, such as the Event
- routers.
- </para>
- </sect1>
-
- <sect1>
- <title>
- Items
- </title>
- <para>
- Each manager uses a number of items to describe the object they
- control or create. The items are added to each manager instance from
- the plugins or from core code. The items from all of these sources
- are then merged together when required and processed accordingly. For
- example, menu items are merged into a tree of GtkMenus. Events on the
- other hand are simply ordered and then invoked in the order of their
- priority. Items are part of the manager implementation, and in
- &EPlugin; they are all extensible objects too, which the hooks use to
- perform mapping to the plugin. Items may be extended by code hooking
- into the implementation, either the plugin hooks, or the core code.
- </para>
- </sect1>
-
- <sect1>
- <title>
- Targets
- </title>
- <para>
- Targets
- <footnote><para>Think of a target as the target of
- interest.</para></footnote>
- are view or component specific context objects. They contain
- enough information to be used as stand-alone contexts to implement
- callbacks for both core functions and plugin hooks. For example for
- the mail view, a select target contains a folder and a list of
- selected messages. An attachment (part) target contains the
- &Camel; representation of the part and the mime-type for
- that part. Targets are part of the manager implementation and are
- extended by subclassing the manager.
- </para>
- </sect1>
- </chapter>
-
- <chapter id="plugin-loaders">
- <title>
- Plugin Loaders
- </title>
- <para>
- Plugin loaders implement a hool to a new language, or loading system in the
- plugin system. The actual binding of new languages to the plugin system or
- other parst of &Evolution;s api's are beyond the scope of this
- document, some languages make this easier than others.
- </para>
- <sect1 id="plugin-loaders-base">
- <title>
- Base Plugin
- </title>
- <para>
- The <link linkend="API-struct--EPlugin">EPlugin base class</link>
- is an abstract class which provides the basic services for plugin
- implementations. The main services are:
- <itemizedlist>
- <listitem><simpara>Resolve plugin type and instantiate an EPlugin
- object to represent and manage it.</simpara></listitem>
- <listitem><simpara>Load the base structure of the XML plugin
- definition files.</simpara></listitem>
- <listitem><simpara>Resolve plugin hook types and instantiate a
- EPluginHook to represent and manage it.</simpara></listitem>
- <listitem><simpara>Provide a simple, language-independent api for
- invoking plugin callbacks</simpara></listitem>
- <listitem><simpara>Provide I18N context for plugins.</simpara></listitem>
- <listitem><simpara>Some simple static helper methods to simplify each
- implementing class.</simpara></listitem>
- </itemizedlist>
- See the <xref linkend="REF-EPlugin"/> for
- these details.
- </para>
-
- <sect2 id="plugin-loaders-definition">
- <title>Definition of a Plugin</title>
- <para>
- The base plugin XML definition. Subclasses of EPlugin extend this
- basic structure with additional parameters or elements as they
- require.
- </para>
- <para>
- Note that there may be any number of <sgmltag>e-plugin</sgmltag>
- elements in a given plugin file, this may be used to simplify
- distribution of plugin packages.
- </para>
- <programlisting>
- <![CDATA[
-<?xml version="1.0">
-<e-plugin-list>
- <e-plugin
- id="unique id"
- type="loader type"
- domain="translation domain" ?
- name="plugin name"
- ...>
- <description>long description</description> ?
- <author name="real name"? email="email addr"?/> *
- <hook
- class="hook class"
- ...>
- ...
- </hook> +
- </e-plugin> +
-</e-plugin-list>]]></programlisting>
- <variablelist>
- <varlistentry>
- <term><parameter>id</parameter></term>
- <listitem>
- <simpara>
- A unique string identifying this plugin. By convention this
- will follow the java-like class namespace system.
- e.g. <constant>com.ximian.evolution.test-plugin</constant>
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>type</parameter></term>
- <listitem>
- <simpara>
- The type name of the plugin loader. Currently <link
- linkend="plugin-loaders-lib">shlib</link> and <link
- linkend="plugin-loaders-mono">mono</link> are the only
- supported values. If no known handler is registered for this
- type, the plugin definition is silently ignored.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>domain</parameter></term>
- <listitem>
- <simpara>
- The translation domain for this plugin, as passed to the
- <function>dcgettext</function> call of the gettext package.
- If not supplied then the default application domain is used
- (i.e. &quot;evolution&quot;). This is used to translate
- translatable strings for display.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>name</parameter></term>
- <listitem>
- <simpara>
- A short name for the plugin. &quot;Bob's Wonder
- Extender&quot; might be suitable. This value will be
- translated.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>description</parameter></term>
- <listitem>
- <simpara>
- A longer description of the plugin's purpose. This value will be
- translated.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>author</parameter></term>
- <listitem>
- <simpara>
- One of the authors who wrote the plugin. Either
- <parameter>name</parameter> or <parameter>email</parameter>
- may be ommitted. This element may occur multiple times to
- indicate multiple authors.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>hook</parameter></term>
- <listitem>
- <simpara>
- This is a list of all of the hooks that this plugin wishes to
- hook into. See the <link linkend="plugin-hooks">Plugin
- Hooks</link> section for the details of the basic hook
- types defined.
- </simpara>
- <simpara>
- The hook <parameter>class</parameter> is resolved using the
- registered hook types, and if none can be found, or a version
- mismatch occurs, then the hook is silently ignored.
- </simpara>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect2>
- </sect1>
-
- <sect1 id="plugin-loaders-lib">
- <title>
- Shared Library Loader
- </title>
- <para>
- The shared library loader <link
- linkend="API-struct--EPluginLib">EPluginLib</link> implements a
- concrete EPlugin type which loads GNU shared libraries via the
- GModule api. It simply resolves symbols directly from the loaded
- shared object and invokes them expecting a function signature of
- <type>EPluginLibFunc</type>.
- </para>
- <para>
- To manage plugin lifecycle, the function
- <function>e_plugin_lib_enable</function>
- will be invoked which allows the plugin to initialise itself. Its
- signature should match <type>EPluginLibEnableFunc</type>, and it will
- be called with <parameter>enable=1</parameter>. If the enable
- function returns non-zero it is assumed to have failed intialisation
- and will not be invoked further.
- </para>
-
- <sect2 id="plugin-loaders-lib-definition">
- <title>Definition</title>
- <para>The shared library loader only requires one extra parameter in
- the base plugin definition.
- </para>
- <programlisting>
- <![CDATA[
-<e-plugin
- ...
- type="shlib"
- location="/full/path/name.so"
- load-on-startup="true" ?
- ...
- <hook class="...">
- ...
-</e-plugin>]]></programlisting>
- <variablelist>
- <varlistentry>
- <term><parameter>type</parameter></term>
- <listitem>
- <simpara>
- The type name of the shared library plugin is
- <constant>shlib</constant>.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>location</parameter></term>
- <listitem>
- <simpara>
- The location parameter contains
- the full path-name of a shared object to load.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>load-on-startup</parameter></term>
- <listitem>
- <simpara>
- If provided, indicates that the plugin should be loaded and
- enabled when the application is first started. Normally the
- plugin is only loaded when necessary, i.e. when a callback is
- first invoked. Only use this option if you have defined an
- <function>e_plugin_lib_enable</function> callback in your
- module, and only if absolutely necessary.
- </simpara>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect2>
-
- <sect2 id="plugin-loaders-lib-invocation">
- <title>Invocation</title>
- <simplesect>
- <title>Function specification
- </title>
- <para>Where a function spec is required in a plugin
- hook definition, it should simply be the full name of an
- exported symbol in the shared object.
- </para>
- </simplesect>
- <simplesect>
- <title>Callback signature</title>
- <funcsynopsis><funcprototype>
- <funcdef>void * <function>function</function></funcdef>
- <paramdef>EPlugin * <parameter>ep</parameter></paramdef>
- <paramdef>void * <parameter>data</parameter></paramdef>
- </funcprototype></funcsynopsis>
- <variablelist>
- <varlistentry>
- <term><function>function</function></term>
- <listitem>
- <simpara>
- The callback function.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>ep</parameter></term>
- <listitem>
- <simpara>
- The container EPlugin representing this plugin.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>data</parameter></term>
- <listitem>
- <simpara>
- Hook context data. It is part of the hook's api to specify
- the type of this pointer.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><returnvalue>return value</returnvalue></term>
- <listitem>
- <simpara>
- Return data. It is part of the hook's api to specify the
- type of this pointer.
- </simpara>
- </listitem>
- </varlistentry>
- </variablelist>
- </simplesect>
- </sect2>
- </sect1>
-
- <sect1 id="plugin-loaders-mono">
- <title>
- Mono Assembly Loader
- </title>
- <para>
- The mono assembly loader <link
- linkend="API-struct--EPluginMono">EPluginMono</link> implements a
- concrete EPlugin type which loads C# assemblies using Mono. Apart
- from loading the assembly, it can optionally instantiate a class to
- implement the callback or invoke static methods directly.
- </para>
-
- <sect2 id="plugin-loaders-mono-definition">
- <title>Definition</title>
- <para>The mono assembly loader needs the name of the assembly and
- optionally the name of the class for handling the callbacks.
- </para>
- <programlisting>
- <![CDATA[
-<e-plugin
- ...
- type="mono"
- location="/full/path/name.dll"
- handler="PluginClass" ?
- ...
- <hook class="...">
- ...
-</e-plugin>]]></programlisting>
- <variablelist>
- <varlistentry>
- <term><parameter>type</parameter></term>
- <listitem>
- <simpara>
- The type name of a mono assembly plugin is
- <constant>mono</constant>.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>location</parameter></term>
- <listitem>
- <simpara>
- The location parameter contains
- the full path-name of an assembly to load.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>handler</parameter></term>
- <listitem>
- <simpara>
- If supplied, the handler contains the fully qualified name of
- the class which handles all callbacks for this plugin. If a
- handling class is used, then the function specifications
- become relative to this class.
- </simpara>
- <simpara>
- This class will be
- instantiated once upon the first callback invocation, and
- remain active for the life of the plugin (or application).
- </simpara>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect2>
-
- <sect2 id="plugin-loaders-mono-invocation">
- <title>Invocation</title>
- <simplesect>
- <title>Function specification
- </title>
- <para>If no <parameter>handler</parameter> class is specified, then
- the function specification must match a static method in the
- assembly. This is passed to <function>mono_method_desc_new</function>
- and <function>mono_method_desc_search_in_image</function>,
- typically <function>FunctionName(intptr)</function>.
- </para>
- <para>
- If the handler is specified, then the function specification is
- relative to the handler class. This is passed to
- <function>mono_method_desc_new</function> and
- <function>mono_method_desc_search_in_class</function>, typically
- <function>:MethodName(intptr)</function>.
- </para>
- </simplesect>
- <simplesect>
- <title>Callback signature</title>
- <funcsynopsis><funcprototype>
- <funcdef>IntPtr <function>function</function></funcdef>
- <paramdef>IntPtr <parameter>data</parameter></paramdef>
- </funcprototype></funcsynopsis>
- <variablelist>
- <varlistentry>
- <term><function>function</function></term>
- <listitem>
- <simpara>
- The callback method.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>data</parameter></term>
- <listitem>
- <simpara>
- The hook context data. This is a pointer to unmanaged data, and it is up-to the plugin to interpret this
- data right now, although some helper binding classes are
- planned. FIXME: hook-up when they and doco are done.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><returnvalue>return value</returnvalue></term>
- <listitem>
- <simpara>
- The callback return data. It is up to the hook's api to
- define the type of this pointer. It may be a simple boxed
- value type, or a memory pointer allocated in unmanaged memory (e.g. a
- GObject handle or a CamelObject cobject value).
- </simpara>
- </listitem>
- </varlistentry>
- </variablelist>
- </simplesect>
- </sect2>
- </sect1>
-
- </chapter>
-
- <chapter id="plugin-hooks">
- <title>
- Plugin Hooks
- </title>
- <para>
- This chapter will introduce the available plugin hook types. A given
- plugin can hook into any of these hooks any number of times. Some refer
- to specific instances of objects and others are implicitly defined.
- </para>
- <para>
- By design, there is considerable similarity and orthogonality amongst
- all of the various hook types and management objects.
- </para>
- <sect1 id="plugin-hooks-popup">
- <title>
- Popup Menus
- </title>
- <para>
- The popup menu hook lets you hook into any of the context menus in
- &Evolution;, by name and context. Complex, dynamic, and multi-level
- menus are created on the fly by merging the items for a given menu as
- it is being shown. Each component provides its own context targets to
- self-describe the situation under which the menu is invoked. Plugins
- and core code alike are then invoked at the user's direction. The
- popup manager and all context data lives as long as the menu and
- until a choice is made, simplifying memory management.
- </para>
- <para>
- The menu is merged from multiple plugins and core application code by
- using a simple lexiographical sort of an absolute path to the menu
- item. This merged list is then scanned and expanded into a tree of
- menus. Individual items can be hidden or inactive based on the target
- and a simple mask which is defined by the component itself. A rich
- collection of menu item types are possible, from simple, to
- checkboxes or images. The popup code is simple, and easy to use, and
- simplifies the use of popup menu's in the core application anyway,
- that they are pluggable is a free-bonus.
- </para>
- <sect2>
- <title>Defining a popup hook</title>
- <para>
- Not sure if this fits here as such. Probably temporary placeholder.
- </para>
- <programlisting>
- <![CDATA[
-<hook class="com.ximian.evolution.mail.popup:1.0">
- <menu id="menuid" target="targettype">
- <item
- type="item | toggle | radio | image | submenu | bar"
- active ?
- path="foo/bar"
- label="menu text"
- icon="icon name" ?
- visible="target mask" ?
- enable="target mask" ?
- activate="function spec"/> *
- </menu> *
-</hook>]]></programlisting>
- <!-- this is all too bloody verbose, is there a better way? -->
- <para>
- <emphasis>Need to define menu tag</emphasis>
- </para>
- <variablelist>
- <varlistentry>
- <term><parameter>type</parameter></term>
- <listitem>
- <simpara>
- The menu item type. The type maps directly to the
- corresponding EPopupItem types.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>active</parameter></term>
- <listitem>
- <simpara>
- If present, then radio or toggle menu items are active when
- first shown. After the first instantiation, they will
- remember their active state.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>path</parameter></term>
- <listitem>
- <simpara>
- A '/' separated path used to position the item within menu
- and in the right submenu. Each menu and plugin should
- define how its menu's are layed out so other plugins can
- determine what value to use here.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>label</parameter></term>
- <listitem>
- <simpara>
- The text to be displayed on the menu item. This will be
- translated based on the plugin translation domain.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>icon</parameter></term>
- <listitem>
- <simpara>
- The name of a gnome-icon-theme standard icon, or the full
- path-name of an icon image to use as menu item icon. This
- will be blank if not supplied.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>visible</parameter></term>
- <listitem>
- <simpara>
- A comma separated list of mask enumeration values used to
- define when this item is shown. What values are valid
- depend on the menu hook class of the menu being hooked
- onto.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>enable</parameter></term>
- <listitem>
- <simpara>
- A comma separated list of mask enumeration values used to
- define when this item is enabled. What values are valid
- depend on the menu hook class of the menu being hooked
- onto. This is currently unimplemented.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>activate</parameter></term>
- <listitem>
- <simpara>
- A plugin-type specific function specification. This
- function will be resolved and called when the menu item is
- activated.
- </simpara>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect2>
- <sect2>
- <title>Merging Plugin Items</title>
- <para>
- A very simple algorithm is used to form the menu by merging the
- plugin's menu items with the system menu items for a given menu.
- What follows is a simple example of how this is done. It will be
- demonstrated using a simplified menu from the message-list, as used
- in the &Evolution; Mail component, and a simple plugin which adds a
- single menu item and menu separator into the middle of the menu,
- when appropriate.
- </para>
- <para>
- When the application wishes to show a specific popup menu, it
- creates a new EPopup object with a unique menu id to manage it. It
- adds all of the items it wishes to add to the menu (see "Builtin
- Items" in the following diagrams). The application then asks for
- the menu to be created. The menu building
- process adds all of the menu items from all plugins that target
- this specific menu into a flat list, discarding those which don't
- match the current Target qualifications. The result is then
- sorted using a simple ASCII sort, and then a menu built from the
- remaining items. This is probably best described by some diagrams.
- </para>
- <para>
- The following two diagrams show how a popup menu is automatically
- customised depending on the context. On the left of each diagram
- are all of the menu items which apply to the example menu. The
- menu label, with the qualifiers listed underneath, with the menu
- item path along-side. On the right-hand side of each diagram is
- the result of:
- </para>
- <itemizedlist>
- <listitem><simpara>Selecting items based on the target
- qualifiers</simpara></listitem>
- <listitem><simpara>Sorting the remaining items based on their
- path.</simpara></listitem>
- <listitem><simpara>Building this sorted list into a
- menu.</simpara></listitem>
- </itemizedlist>
-
- <para>
- The actual list of target qualifiers are defined by the application
- itself. Generally a specific menu will have only one possible
- target, and a list of matching target qualifiers. The example
- shows how a plugin can insert a menu item anwhere it wishes in the
- menu system. Submenus are also supported, and they work in exactly
- the same manner, with / characters used to separate submenu paths.
- A submenu must sort into the position immediately before the
- definition of its items.
- </para>
-
- <figure id="e-popup-merge-1">
- <title>Merging a menu with many items selected.</title>
- <mediaobject>
- <imageobject>
- <imagedata fileref="images/e-popup-merge-1.pic" format="PIC" />
- </imageobject>
- <imageobject>
- <imagedata fileref="images/e-popup-merge-1.eps" format="EPS"/>
- </imageobject>
- <imageobject>
- <imagedata fileref="images/e-popup-merge-1.png" format="PNG"/>
- </imageobject>
- <textobject>
- <phrase>Showing how a display list of menu items is selected
- and then sorted for display.</phrase>
- </textobject>
- </mediaobject>
- </figure>
-
- <para>
- The first diagram shows when the target qualifiers are
- <parameter>many</parameter>, and
- <parameter>mark_unread</parameter>. The menu items which operate
- on only one selected message are not shown. Similarly for those
- able to be marked as unread (i.e. they are currently read).
- </para>
-
- <figure id="e-popup-merge-2">
- <title>Merging a menu with one item selected.</title>
- <mediaobject>
- <imageobject>
- <imagedata fileref="images/e-popup-merge-2.pic" format="PIC"/>
- </imageobject>
- <imageobject>
- <imagedata fileref="images/e-popup-merge-2.eps" format="EPS"/>
- </imageobject>
- <imageobject>
- <imagedata fileref="images/e-popup-merge-2.png" format="PNG"/>
- </imageobject>
- <textobject>
- <phrase>Showing how a display list of menu items is selected
- and then sorted for display with different qualifiers.</phrase>
- </textobject>
- </mediaobject>
- </figure>
-
- <para>
- This diagram shows when the target qualifiers are
- <parameter>one</parameter>, and
- <parameter>mark_read</parameter>. The menu items which operate
- on only many selected messages are not shown. Similarly for those
- able to be marked as read.
- </para>
- </sect2>
- </sect1>
-
- <sect1 id="plugin-hooks-menu">
- <title>
- Main menus
- </title>
- <para>
- The main menu hook lets you hook into various main menus in
- &Evolution;, based on the current active view (component). The system
- works by piggy-backing on the existing use of the BonoboUI menu
- system used by all of the &Evolution; components. Bonobo handles the
- menu merging and user input, and the hook resolves the verb being
- invoked and redirects it to the plugin. Each view defines a single
- target which describes the appropriate context. For the Mail view,
- this is the current folder and currently selected message(s).
- </para>
- <para>
- Each view keeps track of its own manager object. When it is
- (de)activated, it also (de)activates the management object which
- dynamically adds and removes the menu items from the
- BonoboUIContainer via a supplied BonoboUI XML definition file
- &lt;perhaps it should embed the bonobouixml&gt;. If the target
- changes, the view lets the manager know, and it updates the
- visibility and sensitivity of objects appropriately, allowing
- reasonably dynamic user-interfaces to be managed automatically. The
- plugin itself isn't loaded until the menu item in question is invoked
- </para>
- <para>
- Simple menu items and toggle menu items are supported currently.
- Also, because actual menu display is driven by BonoboUI, then toolbar
- items can also be added using this mechanism.
- </para>
- <sect2>
- <title>Defining a menu hook</title>
- <para>
- Not sure if this fits here as such. Probably temporary placeholder.
- </para>
- <programlisting>
- <![CDATA[
-<hook class="com.ximian.evolution.mail.bonoboMenu:1.0">
- <menu id="menuid" target="targettype"
- <ui file="/path/to/bonobo-ui-menu-definition.xml"> +
- <item
- type="item | toggle | radio"
- active ?
- path="/commands/FooBar"
- verb="FooBar"
- visible="target mask" ?
- enable="target mask" ?
- activate="function spec"/> *
- </menu> *
-</hook>]]></programlisting>
- <para>
- <emphasis>Need to define menu tag</emphasis>
- </para>
- <variablelist>
- <varlistentry>
- <term><parameter>ui</parameter></term>
- <listitem>
- <simpara>
- The <parameter>ui</parameter> element contains a filename of the
- BonoboUI XML menu definition to load when the view is activated. Any number of
- <parameter>ui</parameter> elements may be defined, and they
- are all loaded.
- </simpara>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><parameter>type</parameter></term>
- <listitem>
- <simpara>
- The menu item type. The type maps directly to the
- corresponding EMenuItem types.
- <parameter>radio</parameter> is currently not implemented.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>active</parameter></term>
- <listitem>
- <simpara>
- If present, then radio or toggle menu items are active when
- first shown. After the first instantiation, they will
- remember their active state.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>path</parameter></term>
- <listitem>
- <simpara>
- The BonoboUI element path corresponding to this menu item.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>verb</parameter></term>
- <listitem>
- <simpara>
- The BonoboUI verb corresponding to the item to be listened to.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>visible</parameter></term>
- <listitem>
- <simpara>
- A comma separated list of mask enumeration values used to
- define when this item is shown. What values are valid
- depend on the menu hook class of the menu being hooked
- onto.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>enable</parameter></term>
- <listitem>
- <simpara>
- A comma separated list of mask enumeration values used to
- define when this item is sensitive. What values are valid
- depend on the menu hook class of the menu being hooked
- onto.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>activate</parameter></term>
- <listitem>
- <simpara>
- A plugin-type specific function specification. This
- function will be resolved and called when the menu item is
- activated. The funciton's parameters will depend on the type
- of menu item being invoked.
- </simpara>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect2>
- <sect2>
- <title>Merging Plugin Items</title>
- <para>
- Merging is performed by BonoboUI, and the source of the menu data
- is defined by the <parameter>ui</parameter> file.
- </para>
- </sect2>
- </sect1>
-
- <sect1 id="plugin-hooks-config">
- <title>
- Configuration Pages and Wizards
- </title>
- <para>
- Configuration pages are somewhat more complex than any of the other
- types of hookable object. This is reflected in the complexity of the
- items and callbacks involved.
- </para>
- <para>
- Essentially, the EConfig object is used in combination to both
- instrument existing windows and building new content. Each
- configuration window comprises of several basic elements with some
- minor variations allowed. It consists of a number of pages in a
- specific order, each containing a number of titled sections in a specific
- order, each containing a number of items. The variations are that
- the top-level widget may be a GtkNotebook or a GnomeDruid; and each
- section may instrument a GtkBox, or a GtkTable. The definition of
- the available hooks will define what form they take.
- </para>
- <para>
- The EConfig manager uses the description of all the items supplied to
- it to build the complete window. It can also drive various aspects
- of the UI, such as navigating through a druid or handling
- instant-apply vs. modify-and-save dialogues.
- </para>
- <figure id="e-config-flow">
- <title>Event and Data Flow in EMConfig</title>
- <mediaobject>
- <imageobject>
- <imagedata fileref="images/e-config-flow.pic" format="PIC"/>
- </imageobject>
- <imageobject>
- <imagedata fileref="images/e-config-flow.eps" format="EPS"/>
- </imageobject>
- <imageobject>
- <imagedata fileref="images/e-config-flow.png" format="PNG"/>
- </imageobject>
- <textobject>
- <phrase>The flow of information and control signals in the
- configuration management object.</phrase>
- </textobject>
- </mediaobject>
- </figure>
-
- <sect2>
- <title>Defining a configuration page hook</title>
- <para>
- Not sure if this fits here as such. Probably temporary placeholder.
- </para>
- <programlisting>
- <![CDATA[
-<hook class="com.ximian.evolution.mail.config:1.0">
- <group
- id="window id"
- target="targettype"
- check="function spec"?
- commit="function spec"?
- abort="function spec"?>
- <item
- type="book | druid | page | page_start | page_finish | section | section_table | item"
- path="/absolute/path"
- label="name" | factory="function spec"
- /> *
- </menu> *
-</hook>]]></programlisting>
-
- <sect3>
- <title>Group Element Properties</title>
-
- <variablelist>
- <varlistentry>
- <term><parameter>id</parameter></term>
- <listitem>
- <simpara>
- The name of the configuration window to which this hook
- applies.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>target</parameter></term>
- <listitem>
- <simpara>
- The type of target this configuration window applies too.
- This will normally be tied directly to the specific
- configuration window itself.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>check</parameter></term>
- <listitem>
- <simpara>
- A callback which will be invoked to validate the
- configuration or a specific page of the configuration. It
- will be invoked with a
- <link
- linkend="API-struct--EConfigHookPageCheckData">EConfigHookPageCheckData</link>
- structure, and is expected to return a non-NULL value if
- the page validates.
- </simpara>
- <simpara>
- The callback will be expected to handle all
- <parameter>pageid</parameter>'s present in the
- configuration window, and should return
- <constant>TRUE</constant> for pages it does not recognise.
- If <parameter>pageid=&quot;&quot;</parameter> (an empty
- string), then the <parameter>check</parameter> function
- should validate all settings. See also <xref
- linkend="API-e-config-add-page-check" />.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>commit</parameter></term>
- <listitem>
- <simpara>
- A callback which will be invoked to commit the
- configuration data, if the configuration page isn't an
- instant-apply one. This callback can write any
- configuration changes to permanent storage. It is not used
- for instant-apply windows.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>abort</parameter></term>
- <listitem>
- <simpara>
- A callback which will be invoked to abort the configuration
- process. This callback is called when the
- <guibutton>Cancel</guibutton> button is pressed on stateful
- configuration windows.
- </simpara>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect3>
- <sect3>
- <title>Item Element Properties</title>
-
- <variablelist>
- <varlistentry>
- <term><parameter>type</parameter></term>
- <listitem>
- <simpara>
- The menu item type. The type maps directly to the
- corresponding EConfigItem types. Only one of
- <parameter>book</parameter> and <parameter>druid</parameter>
- may be supplied for the entire configuration page, and this
- will usually already be defined by the application.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>path</parameter></term>
- <listitem>
- <simpara>
- The path to the configuration item in question. This is a
- simple string that when sorted using an ASCII sort will place
- the items in the right order. That is, sections before items
- before pages before the root object.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>label</parameter></term>
- <listitem>
- <simpara>
- The textual label of this item. This may only be supplied
- for the section and page types. For sections it will be the
- section frame text. For pages this will be the druid page
- title or the notebook tab text. If a
- <parameter>factory</parameter>is supplied then this value is
- not used. This will be translated based on the plugin
- translation domain.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>factory</parameter></term>
- <listitem>
- <simpara>
- If supplied, the factory method used to create the GtkWidget
- elements for this configuration item. Factories may be
- supplied for any of the item types. If no
- <parameter>label</parameter> is set then the
- <parameter>factory</parameter> must be set.
- </simpara>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect3>
- </sect2>
- <sect2>
- <title>Generating Configuration Pages</title>
- <para>
- Configuration items essentially spam 3 dimensions, but are
- merged in a similar fashion to the way Popup items are merged. The
- main difference is that there are no target qualifiers used to
- select which items are shown, it is up to the item factory to
- either create or not create the item as it sees fit. The EConfig
- manager takes care of the rest, including removing un-used sections
- or pages.
- </para>
- <para>
- All items for a given configuration screen are converted into a
- list and sorted based on the <parameter>path</parameter>. The
- configuration builder then goes through each item, creating
- container widgets or calling factories as required. If a given
- page or section is empty, then it is removed automatically. This
- process isn't only a one-off process. For certain complex
- configuration screens, items or even pages and sections need to be
- dynamic based on a previous setting. EConfig supports this mode of
- operation too, in which case it re-builds the configuration screen
- the same way, and automatically destroys the old widgets
- <footnote><simpara>In most cases, in some cases additional manual
- processing is required in the factory
- callback.</simpara></footnote> and even re-orders pages and
- sections where appropriate to make the user-interface consistent.
- </para>
- <para>
- The following few examples some of the flexibility of the EConfig
- system.
- </para>
- <figure id="e-config-build-1">
- <title>The application defined, unaltered configuration page.</title>
- <mediaobject>
- <!-- do we need to build our own eps for the image? -->
- <imageobject>
- <imagedata fileref="images/e-config-build-1.png" format="PNG"/>
- </imageobject>
- <textobject>
- <phrase>Shows the original HTML Mail settings page.</phrase>
- </textobject>
- </mediaobject>
- </figure>
- <para>
- First we have the original configuration window. This is defined
- by the application, the application uses EConfig to build this
- window, and in the process EConfig instruments the sections that
- the application defines. This allows plugins to add new
- pages/sections/items anywhere on the page - to a granularity as
- defined by the application. For example the application may at
- minimum merely define the top-level notebook or druid object and a
- number of pages. When the pages are created the application could
- add as much content as it wants, which would still allow plugins to
- extend the user interface, but only by adding options to the end of
- each page. At the other end of the scale the application could
- enumerate every single item (i.e. row) in every section on every
- page, allowing plugins to put new items anywhere in the display.
- </para>
- <figure id="e-config-build-2">
- <title>A plugin adding a new section to an existing page.</title>
- <mediaobject>
- <!-- do we need to build our own eps for the image? -->
- <imageobject>
- <imagedata fileref="images/e-config-build-2.png" format="PNG"/>
- </imageobject>
- <textobject>
- <phrase>Shows the HTML Mail settings page with a new section
- and item added by a plugin.</phrase>
- </textobject>
- </mediaobject>
- </figure>
- <para>
- In this case the plugin has merely added a new section on the
- bottom of the HTML Mail settings page. When the factory is called
- the plugin has a parent GtkTable (in this case, it could be a VBox)
- and borderless frame already defined, and it just has to
- instantiate its own control widgets, add them to the table, and
- return one of the widgets. The returned widget is used later if
- the window needs to be reconfigured, although this particular configuration
- page is static so it isn't needed.
- </para>
- <figure id="e-config-build-3">
- <title>A plugin inserting a new page for its settings.</title>
- <mediaobject>
- <!-- do we need to build our own eps for the image? -->
- <imageobject>
- <imagedata fileref="images/e-config-build-3.png" format="PNG"/>
- </imageobject>
- <textobject>
- <phrase>Shows the plugin adding a new page for its setting as
- an alternative.</phrase>
- </textobject>
- </mediaobject>
- </figure>
- <para>
- And finally we have exactly the same plugin, which has exactly the
- same code. But a small change to the plugin definition allows the
- plugin to add an arbitrary new page (in an arbitrary position) into
- the whole window. If this was a druid, then new druid pages can
- also be inserted at arbitrary locations, and page navigation (in a
- strictly linear manner) is automatically controlled by EConfig as
- per <xref linkend="e-config-flow"/>.
- </para>
- <para>
- In practice, EConfig provides more than it takes the application to
- use - generally little or no extra application code is required to
- use it. It also
- <footnote><simpara>Or it will - the code needs some
- tweaking.</simpara></footnote> enforces and simplifies HIG
- compliance. And as a side-benefit to the application it
- transparently provides extension hooks for
- external code to provide a seamlessly integrated user experience.
- </para>
- </sect2>
- </sect1>
-
- <sect1 id="plugin-hooks-event">
- <title>
- Events
- </title>
- <para>
- No extensibility framework would be complete without an event
- system. Events are used to reflect changes in internal state of the
- application, and track actions by the user. They can contain any
- information and additionally can be filtered based on the information
- itself. Special targets are used, as in the other plugin hooks, to
- hold this information.
- </para>
- <para>
- Event managers are defined to contain the different event types that
- a given component can export. Only one event manager object is
- instantiated for each component, and each plugin listening to events
- from that component are registered on that event manager directly.
- </para>
- <para>
- Events handlers have priorities, and can swallow events, allowing
- some level of complexity of event routing. This feature might not
- prove useful and may be removed in the future if it isn't.
- </para>
- <sect2>
- <title>Defining an event hook</title>
- <para>
- Not sure if this fits here as such. Probably temporary placeholder.
- </para>
-
- <programlisting>
- <![CDATA[
-<hook class="com.ximian.evolution.mail.events:1.0">
- <event
- target="target name"
- id="event name"
- type="pass | sink" ?
- priority="signed integer" ?
- enable="target mask" ?
- handle="function spec"/> *
-</hook>]]></programlisting>
- <variablelist>
- <varlistentry>
- <term><parameter>target</parameter></term>
- <listitem>
- <simpara>
- The target type of the event listener. This will normally
- match in a 1:1 relationship to the event
- <parameter>id</parameter> itself.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>id</parameter></term>
- <listitem>
- <simpara>
- The name of the event to listen to. By convention the names
- will be of the form
- <constant>target.event</constant>.
- e.g. <constant>folder.changed</constant>, or
- <constant>message.read</constant>, etc. Although they are
- just simple case-sensitive strings.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>type</parameter></term>
- <listitem>
- <simpara>
- The event listener type. The type maps directly to the corresponding
- corresponding EEventItem types.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>priority</parameter></term>
- <listitem>
- <simpara>
- A signed integer specifying the priority of this event
- listener. 0 (zero) should be used normally, although positive
- and negative integers in the range -128 to 127 may aslo be
- used.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>enable</parameter></term>
- <listitem>
- <simpara>
- A comma separated list of mask enumeration values used to
- qualify when this event listener is invoked. What values are valid
- depend on the event hook class.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>handle</parameter></term>
- <listitem>
- <simpara>
- A plugin-type specific function specification. This
- function will be resolved and called when an event is routed to
- this listener.
- </simpara>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect2>
- </sect1>
-
- <sect1 id="plugin-hooks-format">
- <title>
- Mail Formatter
- </title>
- <para>
- The mail formatter plugin will invoke plugin code to format any part
- of an email based on mime-type. There are several formatters used
- internally by the mailer for different contexts, and each can be
- hooked into separately, providing extensible mail formatting for
- everything from the primary mail display, to printing, to reply
- quoting and more. If you are implementing a handler for a given
- mime-type, each formatter appropriate for the data-type should be
- hooked into, so that it displays properly in all contexts.
- </para>
- <para>
- Since the management object in this case is the same formatting
- object as used by the core mail display engine, a plugin may override
- or reimplement complete new functionality seamlessly.
- </para>
- <para>
- This plugin hook isn't strictly part of the core functionality as it
- is provided only by the mail component. It however demonstrates that the
- plugin system is extensible itself.
- </para>
- <sect2>
- <title>Defining a formatter hook</title>
- <para>
- Not sure if this fits here as such. Probably temporary placeholder.
- </para>
-
- <programlisting>
- <![CDATA[
-<hook class="com.novell.evolution.mail.format:1.0">
- <group id="formatter type">
- <item
- flags="handler flags"
- mime_type="major/minor"
- format="function spec"/> +
- </group> +
-</hook>]]></programlisting>
- <variablelist>
- <varlistentry>
- <term><parameter>id</parameter></term>
- <listitem>
- <simpara>
- The actual formatter this applies to. e.g. EMFormat for the
- base formatter class, EMFormatHTML for HTML output to a
- GtkHTML object, etc.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>flags</parameter></term>
- <listitem>
- <simpara>
- Flags to define whether this is an attachment or inline
- content.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>id</parameter></term>
- <listitem>
- <simpara>
- The name of the event to listen to.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>mime_type</parameter></term>
- <listitem>
- <simpara>
- The type of object this handler formats.
- </simpara>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><parameter>format</parameter></term>
- <listitem>
- <simpara>
- A plugin-type specific function specification. This
- function will be invoked to format objects of the specified
- <parameter>mime_type</parameter>.
- </simpara>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect2>
-
- <sect2>
- <title>The formatting process</title>
- <para>
- The formatting process is driven by the <link
- linkend="API-struct--EMFormat">EMFormat</link> object, although
- there are different subclasses of this object used for different
- purposes. These behave quite differently so each must be explained
- separately. There is the basic formatter type which converts a
- CamelMimeMessage into a stream of data, and there is a HTML
- <link linkend="API-struct--EMFormatHTML">formatter type</link>
- which uses a GtkHTML object to parse the content
- and may request further information required to complete the
- formatting.
- </para>
- <para>
- A basic formatter goes through the following steps:
- </para>
- <orderedlist>
- <listitem>
- <simpara>Outputs pre-amble information. e.g. Flag-For-Followup
- status.</simpara>
- </listitem>
- <listitem>
- <simpara>Invokes <methodname>format_message</methodname> to begin the message
- formatting. <methodname>format_message</methodname> displays the message header, then
- looks up the content object.</simpara>
- </listitem>
- <listitem>
- <simpara>Using the mime-type of the content object (whether
- supplied or calculated), a handler is looked up from a
- per-class table to process the type.</simpara>
- </listitem>
- <listitem>
- <simpara>If no handler exists, then the data is formatted as an
- attachment.</simpara>
- </listitem>
- <listitem>
- <simpara>If a handler exists, then it is invoked to display that
- type. Depending on whether the data is to be displayed
- 'inline' or not, the data may also get an attachment expander
- and button.</simpara>
- </listitem>
- <listitem>
- <simpara>The handler transforms the part's data, if need be, and
- writes the appropriate format output to a stream.</simpara>
- </listitem>
- </orderedlist>
- <para>
- For conglomerate types, the formatting process is continued
- recursively, until all parts have been displayed, as appropriate.
- </para>
- <para>
- A HTML formatter goes through the same basic steps, but has
- additional features and requirements. It uses multiple
- threads. At least one other thread is used for all of the
- Camel message content operations since some of them may block on
- remote I/O. This also simplifies cancellation processing. Also,
- because it has access to a full HTML rendering object, references
- to embedded content (images, buttons, etc.) are also processed.
- </para>
- <para>
- Most format handlers don't need to know about all the fiddly
- details however. If they are just outputting HTML content with no
- out of band references, they work identical to the basic format
- handlers with the exception they cannot call any Gtk GUI code
- because of threading issues. This can still be done by using an
- IFRAME. If they want to embed an icon or other image,
- they simply need to insert the HTML IMG tag reference in their
- format handler, and setup a callback to handle it when GtkHTML
- requests it. EMFormat has some helper classes to make this
- only a few lines of code, including generation of the IMG SRC URL.
- IFRAMEs work identically to IMG tags, and similar process is
- involved with embedding custom widgets using the OBJECT tag.
- EMFormatHTML takes care of calling the right callbacks for the
- right embedded reference from the right thread.
- </para>
- <para>
- Since format handlers are chained off a given type, then a plugin
- can also inherit formatting behaviour as well as override it. This
- gives much greater flexibility since the plugin need only implement
- its behaviour in specific situations. e.g. an OpenPGP message
- handler could fall-back to the normal text-formatter if it doesn't
- detect the ASCII armour in a text/plain part. Or another handler
- may disable itself based on configuration or state.
- </para>
- <para>
- All format handlers for all types must also be fully re-entrant
- code (more or less write-once global and static variables) if
- they call any other formatting functions.
- </para>
- </sect2>
- </sect1>
- </chapter>
- </part>
-
- <part>
- <title>
- &Evolution; Hook Points.
- </title>
- <partintro>
- <para>
- This section enumerates all of the published hook points and target
- types available in each component in &Evolution;.
- </para>
-
- <simplesect>
- <title>Table Format</title>
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody>
- <row>
- <entry>Id</entry>
- <entry>The hook point id.</entry>
- </row>
- <row>
- <entry>Target</entry>
- <entry>The target which this hook uses for its context data.
- Targets are described in a following section.
- </entry>
- </row>
- <row>
- <entry>Items</entry>
- <entry>If appropriate and defined, specifies identifying path
- names of items which make up the hook. e.g. popup menu
- items, and configuration pages. These item specifications
- allow the plugin writer to position their items
- appropriately.
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </simplesect>
-
- </partintro>
- <chapter id="mail-hooks">
- <title>
- Mail Hooks
- </title>
- <para>
- <emphasis>
- Need to find out the right docbook to mark-up most of this
- text.
- </emphasis>
- </para>
-
- <sect1 id="mail-hooks-popup">
- <title>Popup menus</title>
-
- <para>
- The mail popup menu class is
- <interfacename>org.gnome.evolution.mail.popup:1.0</interfacename>.
- </para>
- <para>
- The plugin callback data will be the target matching the plugin
- menu itself, and the callback returns no value.
- </para>
-
- &em-popups;
-
- <sect2>
- <title>Internal popup menus</title>
- <para>
- The following popup menus are defined, but they are used with no
- target, and so provide no useful context if they were to be hooked
- onto.
- </para>
- <para>
- <interfacename>com.ximian.mail.messagelist.popup.drop</interfacename>
- is used for the ASK drop type on the message list.
- </para>
- <para>
- <interfacename>com.ximian.mail.storageset.popup.drop</interfacename>
- is used for the ASK drop type on the folder tree.
- </para>
- </sect2>
-
- <sect2>
- <title>Mail Popup Targets</title>
-
- <para>
- <emphasis>
- Not sure if this needs to explain the qualifier meanings, or
- leave it to the in-line comment stuff in the enumeration
- definition. Maybe it just needs a direct link to the
- enumeration.
- </emphasis>
- </para>
-
- <sect3 id="mail-hooks-popup-EMPopupTargetFolder">
- <title>Folder Target</title>
-
- <para>
- This target is used to define actions on a folder context.
- Normally associated with the folder tree.
- </para>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody valign="top">
- <row>
- <entry>Name</entry>
- <entry><constant>folder</constant></entry>
- </row>
- <row>
- <entry>Structure</entry>
- <entry>
- <link
- linkend="API-struct--EMPopupTargetFolder">EMPopupTargetFolder</link>
- </entry>
- </row>
- <row>
- <entry>Qualifiers</entry>
- <entry>
- <simplelist>
- <member><constant>folder</constant> = <constant>EM_POPUP_FOLDER_FOLDER</constant></member>
- <member><constant>store</constant> = <constant>EM_POPUP_FOLDER_STORE</constant></member>
- <member><constant>inferiors</constant> = <constant>EM_POPUP_FOLDER_INFERIORS</constant></member>
- <member><constant>delete</constant> = <constant>EM_POPUP_FOLDER_DELETE</constant></member>
- <member><constant>select</constant> = <constant>EM_POPUP_FOLDER_SELECT</constant></member>
- </simplelist>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect3>
-
- <sect3 id="mail-hooks-popup-EMPopupTargetSelect">
- <title>Selection Target</title>
-
- <para>This target is used to define context for actions associated
- with a selection of mail messages from a specific folder.</para>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody valign="top">
- <row>
- <entry>Name</entry>
- <entry><constant>select</constant></entry>
- </row>
- <row>
- <entry>Structure</entry>
- <entry>
- <link
- linkend="API-struct--EMPopupTargetSelect">EMPopupTargetSelect</link>
- </entry>
- </row>
- <row>
- <entry>Qualifiers</entry>
- <entry>
- <simplelist>
- <member><constant>one</constant> = <constant>EM_POPUP_SELECT_ONE</constant></member>
- <member><constant>many</constant> = <constant>EM_POPUP_SELECT_MANY</constant></member>
- <member><constant>mark_read</constant> = <constant>EM_POPUP_SELECT_MARK_READ</constant></member>
- <member><constant>mark_unread</constant> = <constant>EM_POPUP_SELECT_MARK_UNREAD</constant></member>
- <member><constant>delete</constant> = <constant>EM_POPUP_SELECT_DELETE</constant></member>
- <member><constant>undelete</constant> = <constant>EM_POPUP_SELECT_UNDELETE</constant></member>
- <member><constant>mailing_list</constant> = <constant>EM_POPUP_SELECT_MAILING_LIST</constant></member>
- <member><constant>resend</constant> = <constant>EM_POPUP_SELECT_EDIT</constant></member>
- <member><constant>mark_important</constant> = <constant>EM_POPUP_SELECT_MARK_IMPORTANT</constant></member>
- <member><constant>mark_unimportant</constant> = <constant>EM_POPUP_SELECT_MARK_UNIMPORTANT</constant></member>
- <member><constant>flag_followup</constant> = <constant>EM_POPUP_SELECT_FLAG_FOLLOWUP</constant></member>
- <member><constant>flag_completed</constant> = <constant>EM_POPUP_SELECT_FLAG_COMPLETED</constant></member>
- <member><constant>flag_clear</constant> = <constant>EM_POPUP_SELECT_FLAG_CLEAR</constant></member>
- <member><constant>add_sender</constant> = <constant>EM_POPUP_SELECT_ADD_SENDER</constant></member>
- <member><constant>mark_junk</constant> = <constant>EM_POPUP_SELECT_MARK_JUNK</constant></member>
- <member><constant>mark_nojunk</constant> = <constant>EM_POPUP_SELECT_MARK_NOJUNK</constant></member>
- <member><constant>folder</constant> = <constant>EM_POPUP_SELECT_FOLDER</constant></member>
- </simplelist>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect3>
-
- <sect3 id="mail-hooks-popup-EMPopupTargetURI">
- <title>URI Target</title>
-
- <para>This target defines context for operations on a URI, normally
- displayed inline somewhere in the message view.</para>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody valign="top">
- <row>
- <entry>Name</entry>
- <entry><constant>uri</constant></entry>
- </row>
- <row>
- <entry>Structure</entry>
- <entry><link
- linkend="API-struct--EMPopupTargetURI">EMPopupTargetURI</link></entry>
- </row>
- <row>
- <entry>Qualifiers</entry>
- <entry>
- <simplelist>
- <member><constant>http</constant> = <constant>EM_POPUP_URI_HTTP</constant></member>
- <member><constant>mailto</constant> = <constant>EM_POPUP_URI_MAILTO</constant></member>
- <member><constant>notmailto</constant> = <constant>EM_POPUP_URI_NOT_MAILTO</constant></member>
- </simplelist>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect3>
-
- <sect3 id="mail-hooks-popup-EMPopupTargetPart">
- <title>Message Part Target</title>
-
- <para>This target defines context for operations on messages, or
- individual message parts. The same target is used for inline
- images or other content which can be encapsulated in a MIME part
- (i.e. anything).</para>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody valign="top">
- <row>
- <entry>Name</entry>
- <entry><constant>part</constant></entry>
- </row>
- <row>
- <entry>Structure</entry>
- <entry><link
- linkend="API-struct--EMPopupTargetPart">EMPopupTargetPart</link></entry>
- </row>
- <row>
- <entry>Qualifiers</entry>
- <entry>
- <simplelist>
- <member><constant>message</constant> = <constant>EM_POPUP_PART_MESSAGE</constant></member>
- <member><constant>image</constant> = <constant>EM_POPUP_PART_IMAGE</constant></member>
- </simplelist>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect3>
-
- <sect3 id="mail-hooks-popup-EMPopupTargetAttachments">
- <title>Attachments Target</title>
-
- <para>This target is used to define context for operations on the
- mail composer attachment bar.</para>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody valign="top">
- <row>
- <entry>Name</entry>
- <entry><constant>attachments</constant></entry>
- </row>
- <row>
- <entry>Structure</entry>
- <entry><link
- linkend="API-struct--EMPopupTargetAttachments">EMPopupTargetAttachments</link></entry>
- </row>
- <row>
- <entry>Qualifiers</entry>
- <entry>
- <simplelist>
- <member><constant>one</constant> = <constant>EM_POPUP_ATTACHMENTS_ONE</constant></member>
- <member><constant>many</constant> = <constant>EM_POPUP_ATTACHMENTS_MANY</constant></member>
- </simplelist>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect3>
-
- </sect2>
- </sect1>
-
- <sect1 id="mail-hooks-menu">
- <title>Main menus</title>
-
- <para>
- The mail popup menu class is
- <interfacename>org.gnome.evolution.mail.bonobomenu:1.0</interfacename>.
- </para>
- <para>
- The plugin callback data will be the target matching the plugin
- menu itself, and the callback returns no value.
- </para>
-
- &em-menus;
-
- <sect2>
- <title>Mail Menu Targets</title>
-
- <sect3 id="mail-hooks-menu-EMMenuTargetSelect">
- <title>Message Selection Target</title>
-
- <para>This target is used to define context for operations on a
- selection of messages in the view's message list.</para>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody valign="top">
- <row>
- <entry>Name</entry>
- <entry><constant>select</constant></entry>
- </row>
- <row>
- <entry>Structure</entry>
- <entry>
- <link
- linkend="API-struct--EMMenuTargeSelect">EMMenuTargetSelect</link>
- </entry>
- </row>
- <row>
- <entry>Qualifiers</entry>
- <entry>
- <simplelist>
- <member><constant>one</constant> = <constant>EM_MENU_SELECT_ONE</constant></member>
- <member><constant>many</constant> = <constant>EM_MENU_SELECT_MANY</constant></member>
- <member><constant>mark_read</constant> = <constant>EM_MENU_SELECT_MARK_READ</constant></member>
- <member><constant>mark_unread</constant> = <constant>EM_MENU_SELECT_MARK_UNREAD</constant></member>
- <member><constant>delete</constant> = <constant>EM_MENU_SELECT_DELETE</constant></member>
- <member><constant>undelete</constant> = <constant>EM_MENU_SELECT_UNDELETE</constant></member>
- <member><constant>mailing_list</constant> = <constant>EM_MENU_SELECT_MAILING_LIST</constant></member>
- <member><constant>resend</constant> = <constant>EM_MENU_SELECT_EDIT</constant></member>
- <member><constant>mark_important</constant> = <constant>EM_MENU_SELECT_MARK_IMPORTANT</constant></member>
- <member><constant>mark_unimportant</constant> = <constant>EM_MENU_SELECT_MARK_UNIMPORTANT</constant></member>
- <member><constant>flag_followup</constant> = <constant>EM_MENU_SELECT_FLAG_FOLLOWUP</constant></member>
- <member><constant>flag_completed</constant> = <constant>EM_MENU_SELECT_FLAG_COMPLETED</constant></member>
- <member><constant>flag_clear</constant> = <constant>EM_MENU_SELECT_FLAG_CLEAR</constant></member>
- <member><constant>add_sender</constant> = <constant>EM_MENU_SELECT_ADD_SENDER</constant></member>
- <member><constant>mark_junk</constant> = <constant>EM_MENU_SELECT_MARK_JUNK</constant></member>
- <member><constant>mark_nojunk</constant> = <constant>EM_MENU_SELECT_MARK_NOJUNK</constant></member>
- <member><constant>folder</constant> = <constant>EM_MENU_SELECT_FOLDER</constant></member>
- </simplelist>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect3>
- </sect2>
- </sect1>
-
- <sect1 id="mail-hooks-config">
- <title>Config Windows and Druids</title>
-
- <para>
- The mail config class is
- <interfacename>org.gnome.evolution.mail.config:1.0</interfacename>.
- </para>
-
- &em-configs;
-
- <sect2>
- <title>Mail Config Targets</title>
-
- <sect3 id="mail-hooks-config-EMConfigTargetAccount">
- <title>Account Target</title>
-
- <para>The account target is used for configuring accounts, and so
- has a pointer to the EAccount being configured. This is a copy
- of the actual account object, and is copied to the original once
- the data is ready to commit.</para>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody valign="top">
- <row>
- <entry>Name</entry>
- <entry><constant>account</constant></entry>
- </row>
- <row>
- <entry>Structure</entry>
- <entry>
- <link
- linkend="API-struct--EMConfigTargetAccount">EMConfigTargetAccount</link>
- </entry>
- </row>
- <row>
- <entry>Items</entry>
- <entry>Define some of the items available and where they fit
- in the gui</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect3>
-
- <sect3 id="mail-hooks-config-EMConfigTargetPrefs">
- <title>Preferences Target</title>
-
- <para>The preferences target is used for global preferences. As
- such it just contains a pointer to the global configuration store
- - a GConfClient.</para>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody valign="top">
- <row>
- <entry>Name</entry>
- <entry><constant>prefs</constant></entry>
- </row>
- <row>
- <entry>Structure</entry>
- <entry>
- <link
- linkend="API-struct--EMConfigTargetPrefs">EMConfigTargetPrefs</link>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect3>
-
- <sect3 id="mail-hooks-config-EMConfigTargetFolder">
- <title>Folder Target</title>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody valign="top">
- <row>
- <entry>Name</entry>
- <entry><constant>folder</constant></entry>
- </row>
- <row>
- <entry>Structure</entry>
- <entry>
- <link
- linkend="API-struct--EMConfigTargetFolder">EMConfigTargetFolder</link>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect3>
-
- </sect2>
- </sect1>
-
- <sect1 id="mail-hooks-event">
- <title>Events</title>
-
- <para>
- The mail event class is
- <interfacename>org.gnome.evolution.mail.events:1.0</interfacename>.
- </para>
-
- &em-events;
-
- <sect2>
- <title>Mail Event Targets</title>
-
- <sect3 id="mail-hooks-event-EMEventTargetFolder">
- <title>Folder Target</title>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody valign="top">
- <row>
- <entry>Name</entry>
- <entry><constant>folder</constant></entry>
- </row>
- <row>
- <entry>Structure</entry>
- <entry>
- <link
- linkend="API-struct--EMEventTargetFolder">EMEventTargetFolder</link>
- </entry>
- </row>
- <row>
- <entry>Qualifiers</entry>
- <entry>List qualifiers</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect3>
- </sect2>
- </sect1>
-
- <sect1 id="mail-hooks-format">
- <title>Formatters</title>
-
- <para>
- The mail formatter hook class is
- <interfacename>com.novell.evolution.mail.format:1.0</interfacename>.
- </para>
-
- <sect2>
- <title>Base Formatter</title>
-
- <para>
- The EMFormat class is the base class for all formatting types.
- It should only be used to define compound and complex types which
- do not rely on outputting any textual information, or rely on any
- screen or print output differences.
- </para>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody valign="top">
- <row>
- <entry>Name</entry>
- <entry><constant>EMFormat</constant></entry>
- </row>
- <row>
- <entry>Target</entry>
- <entry>
- <link
- linkend="mail-hooks-format-EMFormatHookTarget">EMFormatHookTarget</link>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect2>
-
- <sect2>
- <title>HTML Formatter</title>
-
- <para>
- The EMFormatHTML class is the base class for most formatting types
- which generate HTML output. It renders output to a GtkHTML
- object. It uses a fairly complex multi-thread approach to the
- formatting to ensure the user-interface is not blocked for
- processing. GtkHTML is used in a limited way by this class for
- HTML parsing and resolution of embedded objects. Embedded objects
- and Widgets may not be used from formatters which hook onto this
- entry point.
- </para>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody valign="top">
- <row>
- <entry>Name</entry>
- <entry><constant>EMFormatHTML</constant></entry>
- </row>
- <row>
- <entry>Target</entry>
- <entry>
- <link
- linkend="mail-hooks-format-EMFormatHookTarget">EMFormatHookTarget</link>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>
- <emphasis>This section needs a huge amount of
- explanation, and/or more detail needs to be added to another
- section about the formatter class</emphasis>
- </para>
- </sect2>
-
- <sect2>
- <title>HTML Display Formatter</title>
-
- <para>
- The EMFormatHTMLDisplay class is a subclass of EMFormatHTML, and is
- used as a mail display widget. As such, it has access to all of
- the facilities of GtkHTML, such as embedded widgets. Like the
- EMFormatHTML class, this uses a complex multi-thread architecture.
- </para>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody valign="top">
- <row>
- <entry>Name</entry>
- <entry><constant>EMFormatHTMLDisplay</constant></entry>
- </row>
- <row>
- <entry>Target</entry>
- <entry>
- <link
- linkend="mail-hooks-format-EMFormatHookTarget">EMFormatHookTarget</link>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>
- <emphasis>This section needs a huge amount of
- explanation, and/or more detail needs to be added to another
- section about the formatter class</emphasis>
- </para>
- </sect2>
-
- <sect2>
- <title>HTML Print Formatter</title>
-
- <para>
- The EMFormatHTMLPrint class is a subclass of EMFormatHTML, and is
- used as a mail printing widget. It cannot access embedded
- widgets. For most purposes you would normally only connect to the
- EMFormatHTML hook, and generate generic HTML output which could be
- printed or shown on-screen if it isn't overriden by the display
- formatter.
- </para>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody valign="top">
- <row>
- <entry>Name</entry>
- <entry><constant>EMFormatHTMLPrint</constant></entry>
- </row>
- <row>
- <entry>Target</entry>
- <entry>
- <link
- linkend="mail-hooks-format-EMFormatHookTarget">EMFormatHookTarget</link>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>
- <emphasis>This section needs a huge amount of
- explanation, and/or more detail needs to be added to another
- section about the formatter class</emphasis>
- </para>
- </sect2>
-
- <sect2>
- <title>Mail Quote Formatter</title>
- <para>
- The EMFormatQuote class is a subclass of EMFormat, and is
- used as generator for quoted mail content and for
- inline-forwarding. This formatter converts message objects into
- a pure HTML stream, which is not parsed directly, but normally fed
- to the message composer.
- </para>
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody valign="top">
- <row>
- <entry>Name</entry>
- <entry><constant>EMFormatQuote</constant></entry>
- </row>
- <row>
- <entry>Target</entry>
- <entry>
- <link
- linkend="mail-hooks-EMFormatHookTarget">EMFormatHookTarget</link>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect2>
-
- <sect2 id="mail-hooks-format-EMFormatHookTarget">
- <title>Mail Formatter Targets</title>
-
- <para>There is only one target for all mail formatters, and it is
- implied automatically for all formatter hooks.</para>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colname="field" colwidth="1*"/>
- <colspec colnum="2" colname="value" colwidth="4*"/>
- <tbody valign="top">
- <row>
- <entry>Structure</entry>
- <entry>
- <link
- linkend="API-struct--EMFormatHookTarget">EMFormatHookTarget</link>
- </entry>
- </row>
- <row>
- <entry>Flags</entry>
- <entry>
- <simplelist>
- <member><constant>inline</constant> = <constant>EM_FORMAT_HANDLER_INLINE</constant></member>
- <member><constant>inline_disposition</constant> =
- <constant>EM_FORMAT_HANDLER_INLINE_DISPOSITION</constant></member>
- </simplelist>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- </sect2>
- </sect1>
- </chapter>
-
- <chapter id="contacts-hooks">
- <title>
- Contacts Hooks
- </title>
- <para>
- Hooks available in the the contacts component.
- </para>
-
- <sect1 id="contacts-hooks-popup">
- <title>Popup menus</title>
-
- <para>
- The contacts popup menu class is
- <interfacename>org.gnome.evolution.addressbook.popup:1.0</interfacename>.
- </para>
-
- <!-- TODO: define the entity once it exists
- &eab-popups; -->
-
- <sect2>
- <title>Calendar Popup Targets</title>
- <para>TBD</para>
- </sect2>
- </sect1>
-
- <sect1 id="contacts-hooks-menu">
- <title>Main menus</title>
-
- <para>
- The addressbook menu class is
- <interfacename>org.gnome.evolution.addressbook.bonobomenu:1.0</interfacename>.
- </para>
-
- <!-- TODO: define the entity once it exists
- &eab-menus; -->
-
- <sect2>
- <title>Contacts Menu Targets</title>
- <para>TBD</para>
- </sect2>
- </sect1>
-
- <sect1 id="contacts-hooks-config">
- <title>Config Windows and Druids</title>
- <para>
- The addressbook config class is
- <interfacename>org.gnome.evolution.addressbook.config:1.0</interfacename>.
- </para>
-
- <!-- TODO: define the entity once it exists
- &eab-configs; -->
-
- <sect2>
- <title>Contacts Config Targets</title>
- <para>TBD</para>
- </sect2>
- </sect1>
-
- <sect1 id="contacts-hooks-event">
- <title>Events</title>
-
- <para>
- None defined.
- </para>
- </sect1>
- </chapter>
-
- <chapter id="calendar-hooks">
- <title>
- Calendar Hooks
- </title>
- <para>
- Hooks available in the the calendar component.
- </para>
-
- <sect1 id="calendar-hooks-popup">
- <title>Popup menus</title>
-
- <para>
- The calendar popup menu class is
- <interfacename>org.gnome.evolution.calendar.popup:1.0</interfacename>.
- </para>
-
- &ecal-popups;
-
- <sect2>
- <title>Calendar Popup Targets</title>
- <para>TBD</para>
- </sect2>
- </sect1>
-
- <sect1 id="calendar-hooks-menu">
- <title>Main menus</title>
-
- <para>
- The calendar menu class is
- <interfacename>org.gnome.evolution.calendar.bonobomenu:1.0</interfacename>.
- </para>
-
- <!-- TODO: define the entity once it exists
- &ecal-menus; -->
-
- <sect2>
- <title>Calendar Menu Targets</title>
- <para>TBD</para>
- </sect2>
- </sect1>
-
- <sect1 id="calendar-hooks-config">
- <title>Config Windows and Druids</title>
- <para>
- The calendar config class is
- <interfacename>org.gnome.evolution.calendar.config:1.0</interfacename>.
- </para>
-
- <!-- TODO: define the entity once it exists
- &ecal-configs; -->
-
- <sect2>
- <title>Calendar Config Targets</title>
- <para>TBD</para>
- </sect2>
- </sect1>
-
- <sect1 id="calendar-hooks-event">
- <title>Events</title>
-
- <para>
- None defined.
- </para>
- </sect1>
- </chapter>
-
- <chapter id="shell-hooks">
- <title>
- Shell Hooks
- </title>
-
- <sect1 id="shell-hooks-menu">
- <title>Main menus</title>
-
- <para>
- The mail menu class is
- <interfacename>org.gnome.evolution.shell.bonobomenu:1.0</interfacename>.
- </para>
- <para>
- The plugin callback data will be the target matching the plugin
- menu itself, and the callback returns no value.
- </para>
- &es-menus;
- </sect1>
- <sect1 id="shell-hooks-event">
- <title>Events</title>
-
- <para>
- The shell event class is
- <interfacename>org.gnome.evolution.shell.events:1.0</interfacename>.
- </para>
-
- &es-events;
- </sect1>
-
- </chapter>
-
- </part>
-
- <part id="reference">
- <title>
- Reference
- </title>
- <partintro>
- <para>
- This section of the book is a detailed API reference of the
- objects and methods that implement the core plugin system and hooks.
- </para>
- <para>
- It contains the detailed information required for all uses of the
- plugin system. That is, implementors
- of new hook types, application developers providing hook points, and
- plugin developers.
- </para>
- </partintro>
- <chapter id="REF-EPlugin">
- <title>
- EPlugin
- </title>
- <para>
- The EPlugin object manages the loading and invocation of physical
- plugin definitions and plugin binaries. The base EPlugin class is an
- abstract class which loads plugin definitons, resolving hooks, and
- provides an api for invoking callbacks.
- </para>
- <para>
- The EPluginLib object is a concrete derived class of EPlugin which
- handles loading shared libraries using the GModule interface.
- </para>
- &e-plugin-reference;
- </chapter>
-
- <chapter>
- <title>
- EPopup
- </title>
- <para>
- The EPopup object manages a single popup menu. It is used to
- application code as a convenience function for building dynamic popup
- menus based on a specific context.
- </para>
- <para>
- The EPopupHook object is loaded by
- the &EPlugin; system, and is used to provide dynamic extension to the
- application context menus.
- </para>
- &e-popup-reference;
-
- <!-- this looks like bum here, not sure where else to put it though -->
- &em-popup-reference;
- </chapter>
-
- <chapter>
- <title>
- EMenu
- </title>
- <para>
- The EMenu object manages the menus for a given view or component. It
- is used by application code to allow the plugin system an entry point
- to current application view. It may also be used by the application as
- a convenience function to dynamically alter the menu system based on
- user context.
- </para>
- <para>
- The EMenuHook object is loaded by the &EPlugin; system, and is used to
- provide dynamic extension to the application menus.
- </para>
- &e-menu-reference;
- </chapter>
-
- <chapter>
- <title>
- EConfig
- </title>
- <para>
- The EConfig object manages the building of dynamic configuration pages
- to configure specific application objects. The same basic object can
- be used to fully drive a wizard-like druid object, or to drive a
- note-book of configuration options. It is used by application code to
- provide the core controller in a model-view-controller implementation
- of a UI window.
- </para>
- <para>
- The EConfigHook object is loaded by the &EPlugin; system, and is used hook
- in additional configuration items into configuration windows or druids
- dynamically.
- </para>
- &e-config-reference;
- </chapter>
-
- <chapter>
- <title>
- EEvent
- </title>
- <para>
- The EEvent object manages broadcast of events for a given component or
- application. It is used by application code to provide the plugin
- system with an entry point for user and system state events.
- </para>
- <para>
- The EEventHook object is loaded by the &EPlugin; system, and is used hook
- event listeners into dynamically loaded event handlers.
- </para>
- &e-event-reference;
- </chapter>
-
- <chapter>
- <title>
- EMFormat
- </title>
- <para>
- The EMFormat object drives the formatting of MIME message content for
- display, print, and replying. EMFormatHTML is an implementation of
- EMFormat which writes its output to a GtkHTML instance.
- </para>
- <para>
- The EMFormatHook object is loaded by the &EPlugin; system, and is used hook
- event listeners into dynamically loaded event handlers.
- </para>
- &em-format-reference;
- </chapter>
- </part>
-
-</book>
diff --git a/doc/devel/executive-summary/evolution-services.hierarchy b/doc/devel/executive-summary/evolution-services.hierarchy
deleted file mode 100644
index 37559d819d..0000000000
--- a/doc/devel/executive-summary/evolution-services.hierarchy
+++ /dev/null
@@ -1,7 +0,0 @@
-GtkObject
- BonoboObject
- ExecutiveSummaryComponent
- ExecutiveSummaryComponentFactory
- Handle to remote Bonobo::Unknown
- ExecutiveSummaryComponentFactoryClient
- ExecutiveSummaryHtmlView
diff --git a/doc/devel/fdl.sgml b/doc/devel/fdl.sgml
deleted file mode 100644
index 817adbdbb7..0000000000
--- a/doc/devel/fdl.sgml
+++ /dev/null
@@ -1,671 +0,0 @@
-<!--
- The GNU Free Documentation License 1.1 in DocBook
- Markup by Eric Baudais <baudais@okstate.edu>
- Maintained by the GNOME Documentation Project
- http://developer.gnome.org/projects/gdp
- Version: 1.0.1
- Last Modified: Nov 16, 2000
--->
-
-<appendix id="fdl">
- <docinfo>
- <releaseinfo>
- Version 1.1, March 2000
- </releaseinfo>
- <copyright>
- <year>2000</year><holder>Free Software Foundation, Inc.</holder>
- </copyright>
- <legalnotice id="fdl-legalnotice">
- <para>
- <address>Free Software Foundation, Inc. <street>59 Temple Place,
- Suite 330</street>, <city>Boston</city>, <state>MA</state>
- <postcode>02111-1307</postcode> <country>USA</country></address>
- Everyone is permitted to copy and distribute verbatim copies of this
- license document, but changing it is not allowed.
- </para>
- </legalnotice>
- </docinfo>
- <title>GNU Free Documentation License</title>
-
- <sect1 id="fdl-preamble">
- <title>0. PREAMBLE</title>
- <para>
- The purpose of this License is to make a manual, textbook, or
- other written document <quote>free</quote> in the sense of
- freedom: to assure everyone the effective freedom to copy and
- redistribute it, with or without modifying it, either
- commercially or noncommercially. Secondarily, this License
- preserves for the author and publisher a way to get credit for
- their work, while not being considered responsible for
- modifications made by others.
- </para>
-
- <para>
- This License is a kind of <quote>copyleft</quote>, which means
- that derivative works of the document must themselves be free in
- the same sense. It complements the GNU General Public License,
- which is a copyleft license designed for free software.
- </para>
-
- <para>
- We have designed this License in order to use it for manuals for
- free software, because free software needs free documentation: a
- free program should come with manuals providing the same
- freedoms that the software does. But this License is not limited
- to software manuals; it can be used for any textual work,
- regardless of subject matter or whether it is published as a
- printed book. We recommend this License principally for works
- whose purpose is instruction or reference.
- </para>
- </sect1>
- <sect1 id="fdl-section1">
- <title>1. APPLICABILITY AND DEFINITIONS</title>
- <para id="fdl-document">
- This License applies to any manual or other work that contains a
- notice placed by the copyright holder saying it can be
- distributed under the terms of this License. The
- <quote>Document</quote>, below, refers to any such manual or
- work. Any member of the public is a licensee, and is addressed
- as <quote>you</quote>.
- </para>
-
- <para id="fdl-modified">
- A <quote>Modified Version</quote> of the Document means any work
- containing the Document or a portion of it, either copied
- verbatim, or with modifications and/or translated into another
- language.
- </para>
-
- <para id="fdl-secondary">
- A <quote>Secondary Section</quote> is a named appendix or a
- front-matter section of the <link
- linkend="fdl-document">Document</link> that deals exclusively
- with the relationship of the publishers or authors of the
- Document to the Document's overall subject (or to related
- matters) and contains nothing that could fall directly within
- that overall subject. (For example, if the Document is in part a
- textbook of mathematics, a Secondary Section may not explain any
- mathematics.) The relationship could be a matter of historical
- connection with the subject or with related matters, or of
- legal, commercial, philosophical, ethical or political position
- regarding them.
- </para>
-
- <para id="fdl-invariant">
- The <quote>Invariant Sections</quote> are certain <link
- linkend="fdl-secondary"> Secondary Sections</link> whose titles
- are designated, as being those of Invariant Sections, in the
- notice that says that the <link
- linkend="fdl-document">Document</link> is released under this
- License.
- </para>
-
- <para id="fdl-cover-texts">
- The <quote>Cover Texts</quote> are certain short passages of
- text that are listed, as Front-Cover Texts or Back-Cover Texts,
- in the notice that says that the <link
- linkend="fdl-document">Document</link> is released under this
- License.
- </para>
-
- <para id="fdl-transparent">
- A <quote>Transparent</quote> copy of the <link
- linkend="fdl-document"> Document</link> means a machine-readable
- copy, represented in a format whose specification is available
- to the general public, whose contents can be viewed and edited
- directly and straightforwardly with generic text editors or (for
- images composed of pixels) generic paint programs or (for
- drawings) some widely available drawing editor, and that is
- suitable for input to text formatters or for automatic
- translation to a variety of formats suitable for input to text
- formatters. A copy made in an otherwise Transparent file format
- whose markup has been designed to thwart or discourage
- subsequent modification by readers is not Transparent. A copy
- that is not <quote>Transparent</quote> is called
- <quote>Opaque</quote>.
- </para>
-
- <para>
- Examples of suitable formats for Transparent copies include
- plain ASCII without markup, Texinfo input format, LaTeX input
- format, SGML or XML using a publicly available DTD, and
- standard-conforming simple HTML designed for human
- modification. Opaque formats include PostScript, PDF,
- proprietary formats that can be read and edited only by
- proprietary word processors, SGML or XML for which the DTD
- and/or processing tools are not generally available, and the
- machine-generated HTML produced by some word processors for
- output purposes only.
- </para>
-
- <para id="fdl-title-page">
- The <quote>Title Page</quote> means, for a printed book, the
- title page itself, plus such following pages as are needed to
- hold, legibly, the material this License requires to appear in
- the title page. For works in formats which do not have any title
- page as such, <quote>Title Page</quote> means the text near the
- most prominent appearance of the work's title, preceding the
- beginning of the body of the text.
- </para>
- </sect1>
-
- <sect1 id="fdl-section2">
- <title>2. VERBATIM COPYING</title>
- <para>
- You may copy and distribute the <link
- linkend="fdl-document">Document</link> in any medium, either
- commercially or noncommercially, provided that this License, the
- copyright notices, and the license notice saying this License
- applies to the Document are reproduced in all copies, and that
- you add no other conditions whatsoever to those of this
- License. You may not use technical measures to obstruct or
- control the reading or further copying of the copies you make or
- distribute. However, you may accept compensation in exchange for
- copies. If you distribute a large enough number of copies you
- must also follow the conditions in <link
- linkend="fdl-section3">section 3</link>.
- </para>
-
- <para>
- You may also lend copies, under the same conditions stated
- above, and you may publicly display copies.
- </para>
- </sect1>
-
- <sect1 id="fdl-section3">
- <title>3. COPYING IN QUANTITY</title>
- <para>
- If you publish printed copies of the <link
- linkend="fdl-document">Document</link> numbering more than 100,
- and the Document's license notice requires <link
- linkend="fdl-cover-texts">Cover Texts</link>, you must enclose
- the copies in covers that carry, clearly and legibly, all these
- Cover Texts: Front-Cover Texts on the front cover, and
- Back-Cover Texts on the back cover. Both covers must also
- clearly and legibly identify you as the publisher of these
- copies. The front cover must present the full title with all
- words of the title equally prominent and visible. You may add
- other material on the covers in addition. Copying with changes
- limited to the covers, as long as they preserve the title of the
- <link linkend="fdl-document">Document</link> and satisfy these
- conditions, can be treated as verbatim copying in other
- respects.
- </para>
-
- <para>
- If the required texts for either cover are too voluminous to fit
- legibly, you should put the first ones listed (as many as fit
- reasonably) on the actual cover, and continue the rest onto
- adjacent pages.
- </para>
-
- <para>
- If you publish or distribute <link
- linkend="fdl-transparent">Opaque</link> copies of the <link
- linkend="fdl-document">Document</link> numbering more than 100,
- you must either include a machine-readable <link
- linkend="fdl-transparent">Transparent</link> copy along with
- each Opaque copy, or state in or with each Opaque copy a
- publicly-accessible computer-network location containing a
- complete Transparent copy of the Document, free of added
- material, which the general network-using public has access to
- download anonymously at no charge using public-standard network
- protocols. If you use the latter option, you must take
- reasonably prudent steps, when you begin distribution of Opaque
- copies in quantity, to ensure that this Transparent copy will
- remain thus accessible at the stated location until at least one
- year after the last time you distribute an Opaque copy (directly
- or through your agents or retailers) of that edition to the
- public.
- </para>
-
- <para>
- It is requested, but not required, that you contact the authors
- of the <link linkend="fdl-document">Document</link> well before
- redistributing any large number of copies, to give them a chance
- to provide you with an updated version of the Document.
- </para>
- </sect1>
-
- <sect1 id="fdl-section4">
- <title>4. MODIFICATIONS</title>
- <para>
- You may copy and distribute a <link
- linkend="fdl-modified">Modified Version</link> of the <link
- linkend="fdl-document">Document</link> under the conditions of
- sections <link linkend="fdl-section2">2</link> and <link
- linkend="fdl-section3">3</link> above, provided that you release
- the Modified Version under precisely this License, with the
- Modified Version filling the role of the Document, thus
- licensing distribution and modification of the Modified Version
- to whoever possesses a copy of it. In addition, you must do
- these things in the Modified Version:
- </para>
-
- <itemizedlist mark="opencircle">
- <listitem>
- <formalpara>
- <title>A</title>
- <para>
- Use in the <link linkend="fdl-title-page">Title
- Page</link> (and on the covers, if any) a title distinct
- from that of the <link
- linkend="fdl-document">Document</link>, and from those of
- previous versions (which should, if there were any, be
- listed in the History section of the Document). You may
- use the same title as a previous version if the original
- publisher of that version gives permission.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>B</title>
- <para>
- List on the <link linkend="fdl-title-page">Title
- Page</link>, as authors, one or more persons or entities
- responsible for authorship of the modifications in the
- <link linkend="fdl-modified">Modified Version</link>,
- together with at least five of the principal authors of
- the <link linkend="fdl-document">Document</link> (all of
- its principal authors, if it has less than five).
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>C</title>
- <para>
- State on the <link linkend="fdl-title-page">Title
- Page</link> the name of the publisher of the <link
- linkend="fdl-modified">Modified Version</link>, as the
- publisher.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>D</title>
- <para>
- Preserve all the copyright notices of the <link
- linkend="fdl-document">Document</link>.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>E</title>
- <para>
- Add an appropriate copyright notice for your modifications
- adjacent to the other copyright notices.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>F</title>
- <para>
- Include, immediately after the copyright notices, a
- license notice giving the public permission to use the
- <link linkend="fdl-modified">Modified Version</link> under
- the terms of this License, in the form shown in the
- Addendum below.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>G</title>
- <para>
- Preserve in that license notice the full lists of <link
- linkend="fdl-invariant"> Invariant Sections</link> and
- required <link linkend="fdl-cover-texts">Cover
- Texts</link> given in the <link
- linkend="fdl-document">Document's</link> license notice.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>H</title>
- <para>
- Include an unaltered copy of this License.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>I</title>
- <para>
- Preserve the section entitled <quote>History</quote>, and
- its title, and add to it an item stating at least the
- title, year, new authors, and publisher of the <link
- linkend="fdl-modified">Modified Version </link>as given on
- the <link linkend="fdl-title-page">Title Page</link>. If
- there is no section entitled <quote>History</quote> in the
- <link linkend="fdl-document">Document</link>, create one
- stating the title, year, authors, and publisher of the
- Document as given on its Title Page, then add an item
- describing the Modified Version as stated in the previous
- sentence.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>J</title>
- <para>
- Preserve the network location, if any, given in the <link
- linkend="fdl-document">Document</link> for public access
- to a <link linkend="fdl-transparent">Transparent</link>
- copy of the Document, and likewise the network locations
- given in the Document for previous versions it was based
- on. These may be placed in the <quote>History</quote>
- section. You may omit a network location for a work that
- was published at least four years before the Document
- itself, or if the original publisher of the version it
- refers to gives permission.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>K</title>
- <para>
- In any section entitled <quote>Acknowledgements</quote> or
- <quote>Dedications</quote>, preserve the section's title,
- and preserve in the section all the substance and tone of
- each of the contributor acknowledgements and/or
- dedications given therein.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>L</title>
- <para>
- Preserve all the <link linkend="fdl-invariant">Invariant
- Sections</link> of the <link
- linkend="fdl-document">Document</link>, unaltered in their
- text and in their titles. Section numbers or the
- equivalent are not considered part of the section titles.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>M</title>
- <para>
- Delete any section entitled
- <quote>Endorsements</quote>. Such a section may not be
- included in the <link linkend="fdl-modified">Modified
- Version</link>.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>N</title>
- <para>
- Do not retitle any existing section as
- <quote>Endorsements</quote> or to conflict in title with
- any <link linkend="fdl-invariant">Invariant
- Section</link>.
- </para>
- </formalpara>
- </listitem>
- </itemizedlist>
-
- <para>
- If the <link linkend="fdl-modified">Modified Version</link>
- includes new front-matter sections or appendices that qualify as
- <link linkend="fdl-secondary">Secondary Sections</link> and
- contain no material copied from the Document, you may at your
- option designate some or all of these sections as invariant. To
- do this, add their titles to the list of <link
- linkend="fdl-invariant">Invariant Sections</link> in the
- Modified Version's license notice. These titles must be
- distinct from any other section titles.
- </para>
-
- <para>
- You may add a section entitled <quote>Endorsements</quote>,
- provided it contains nothing but endorsements of your <link
- linkend="fdl-modified">Modified Version</link> by various
- parties--for example, statements of peer review or that the text
- has been approved by an organization as the authoritative
- definition of a standard.
- </para>
-
- <para>
- You may add a passage of up to five words as a <link
- linkend="fdl-cover-texts">Front-Cover Text</link>, and a passage
- of up to 25 words as a <link
- linkend="fdl-cover-texts">Back-Cover Text</link>, to the end of
- the list of <link linkend="fdl-cover-texts">Cover Texts</link>
- in the <link linkend="fdl-modified">Modified Version</link>.
- Only one passage of Front-Cover Text and one of Back-Cover Text
- may be added by (or through arrangements made by) any one
- entity. If the <link linkend="fdl-document">Document</link>
- already includes a cover text for the same cover, previously
- added by you or by arrangement made by the same entity you are
- acting on behalf of, you may not add another; but you may
- replace the old one, on explicit permission from the previous
- publisher that added the old one.
- </para>
-
- <para>
- The author(s) and publisher(s) of the <link
- linkend="fdl-document">Document</link> do not by this License
- give permission to use their names for publicity for or to
- assert or imply endorsement of any <link
- linkend="fdl-modified">Modified Version </link>.
- </para>
- </sect1>
-
- <sect1 id="fdl-section5">
- <title>5. COMBINING DOCUMENTS</title>
- <para>
- You may combine the <link linkend="fdl-document">Document</link>
- with other documents released under this License, under the
- terms defined in <link linkend="fdl-section4">section 4</link>
- above for modified versions, provided that you include in the
- combination all of the <link linkend="fdl-invariant">Invariant
- Sections</link> of all of the original documents, unmodified,
- and list them all as Invariant Sections of your combined work in
- its license notice.
- </para>
-
- <para>
- The combined work need only contain one copy of this License,
- and multiple identical <link linkend="fdl-invariant">Invariant
- Sections</link> may be replaced with a single copy. If there are
- multiple Invariant Sections with the same name but different
- contents, make the title of each such section unique by adding
- at the end of it, in parentheses, the name of the original
- author or publisher of that section if known, or else a unique
- number. Make the same adjustment to the section titles in the
- list of Invariant Sections in the license notice of the combined
- work.
- </para>
-
- <para>
- In the combination, you must combine any sections entitled
- <quote>History</quote> in the various original documents,
- forming one section entitled <quote>History</quote>; likewise
- combine any sections entitled <quote>Acknowledgements</quote>,
- and any sections entitled <quote>Dedications</quote>. You must
- delete all sections entitled <quote>Endorsements.</quote>
- </para>
- </sect1>
-
- <sect1 id="fdl-section6">
- <title>6. COLLECTIONS OF DOCUMENTS</title>
- <para>
- You may make a collection consisting of the <link
- linkend="fdl-document">Document</link> and other documents
- released under this License, and replace the individual copies
- of this License in the various documents with a single copy that
- is included in the collection, provided that you follow the
- rules of this License for verbatim copying of each of the
- documents in all other respects.
- </para>
-
- <para>
- You may extract a single document from such a collection, and
- dispbibute it individually under this License, provided you
- insert a copy of this License into the extracted document, and
- follow this License in all other respects regarding verbatim
- copying of that document.
- </para>
- </sect1>
-
- <sect1 id="fdl-section7">
- <title>7. AGGREGATION WITH INDEPENDENT WORKS</title>
- <para>
- A compilation of the <link
- linkend="fdl-document">Document</link> or its derivatives with
- other separate and independent documents or works, in or on a
- volume of a storage or distribution medium, does not as a whole
- count as a <link linkend="fdl-modified">Modified Version</link>
- of the Document, provided no compilation copyright is claimed
- for the compilation. Such a compilation is called an
- <quote>aggregate</quote>, and this License does not apply to the
- other self-contained works thus compiled with the Document , on
- account of their being thus compiled, if they are not themselves
- derivative works of the Document. If the <link
- linkend="fdl-cover-texts">Cover Text</link> requirement of <link
- linkend="fdl-section3">section 3</link> is applicable to these
- copies of the Document, then if the Document is less than one
- quarter of the entire aggregate, the Document's Cover Texts may
- be placed on covers that surround only the Document within the
- aggregate. Otherwise they must appear on covers around the whole
- aggregate.
- </para>
- </sect1>
-
- <sect1 id="fdl-section8">
- <title>8. TRANSLATION</title>
- <para>
- Translation is considered a kind of modification, so you may
- distribute translations of the <link
- linkend="fdl-document">Document</link> under the terms of <link
- linkend="fdl-section4">section 4</link>. Replacing <link
- linkend="fdl-invariant"> Invariant Sections</link> with
- translations requires special permission from their copyright
- holders, but you may include translations of some or all
- Invariant Sections in addition to the original versions of these
- Invariant Sections. You may include a translation of this
- License provided that you also include the original English
- version of this License. In case of a disagreement between the
- translation and the original English version of this License,
- the original English version will prevail.
- </para>
- </sect1>
-
- <sect1 id="fdl-section9">
- <title>9. TERMINATION</title>
- <para>
- You may not copy, modify, sublicense, or distribute the <link
- linkend="fdl-document">Document</link> except as expressly
- provided for under this License. Any other attempt to copy,
- modify, sublicense or distribute the Document is void, and will
- automatically terminate your rights under this License. However,
- parties who have received copies, or rights, from you under this
- License will not have their licenses terminated so long as such
- parties remain in full compliance.
- </para>
- </sect1>
-
- <sect1 id="fdl-section10">
- <title>10. FUTURE REVISIONS OF THIS LICENSE</title>
- <para>
- The <ulink type="http"
- url="http://www.gnu.org/fsf/fsf.html">Free Software
- Foundation</ulink> may publish new, revised versions of the GNU
- Free Documentation 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. See <ulink
- type="http"
- url="http://www.gnu.org/copyleft">http://www.gnu.org/copyleft/</ulink>.
- </para>
-
- <para>
- Each version of the License is given a distinguishing version
- number. If the <link linkend="fdl-document">Document</link>
- specifies that a particular numbered version of this License
- <quote>or any later version</quote> applies to it, you have the
- option of following the terms and conditions either of that
- specified version or of any later version that has been
- published (not as a draft) by the Free Software Foundation. If
- the Document does not specify a version number of this License,
- you may choose any version ever published (not as a draft) by
- the Free Software Foundation.
- </para>
- </sect1>
-
- <sect1 id="fdl-using">
- <title>Addendum</title>
- <para>
- To use this License in a document you have written, include a copy of
- the License in the document and put the following copyright and
- license notices just after the title page:
- </para>
-
- <blockquote>
- <para>
- Copyright &copy; YEAR YOUR NAME.
- </para>
- <para>
- Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU Free Documentation
- License, Version 1.1 or any later version published by the
- Free Software Foundation; with the <link
- linkend="fdl-invariant">Invariant Sections</link> being LIST
- THEIR TITLES, with the <link
- linkend="fdl-cover-texts">Front-Cover Texts</link> being LIST,
- and with the <link linkend="fdl-cover-texts">Back-Cover
- Texts</link> being LIST. A copy of the license is included in
- the section entitled <quote>GNU Free Documentation
- License</quote>.
- </para>
- </blockquote>
-
- <para>
- If you have no <link linkend="fdl-invariant">Invariant
- Sections</link>, write <quote>with no Invariant Sections</quote>
- instead of saying which ones are invariant. If you have no
- <link linkend="fdl-cover-texts">Front-Cover Texts</link>, write
- <quote>no Front-Cover Texts</quote> instead of
- <quote>Front-Cover Texts being LIST</quote>; likewise for <link
- linkend="fdl-cover-texts">Back-Cover Texts</link>.
- </para>
-
- <para>
- If your document contains nontrivial examples of program code,
- we recommend releasing these examples in parallel under your
- choice of free software license, such as the <ulink type="http"
- url="http://www.gnu.org/copyleft/gpl.html"> GNU General Public
- License</ulink>, to permit their use in free software.
- </para>
- </sect1>
-</appendix>
-
-
-
-
-
-
diff --git a/doc/devel/images/Makefile b/doc/devel/images/Makefile
deleted file mode 100644
index bef9f8bf62..0000000000
--- a/doc/devel/images/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-
-# this is only a temporary makefile
-
-# you need ps2eps, groff, pnmutils, and ghostscript installed
-
-PICS=e-config-flow.pic e-popup-merge-1.pic e-popup-merge-2.pic
-EPS=$(PICS:.pic=.eps)
-PNG=$(PICS:.pic=.png)
-
-all: $(PNG)
-
-%.eps: %.pic
- groff -p $^ | ps2eps -f -l > $@
-
-%.png: %.pic
- groff -p $^ \
- | gs -q -dSAFER -dNOPAUSE -dBATCH -r180 -sDEVICE=pnmraw -sOutputFile=- - -c quit \
- | pnmcrop \
- | pnmscale 0.5 \
- | pnmtopng > $@
-
diff --git a/doc/devel/images/e-config-build-1.png b/doc/devel/images/e-config-build-1.png
deleted file mode 100644
index a18f8ab503..0000000000
--- a/doc/devel/images/e-config-build-1.png
+++ /dev/null
Binary files differ
diff --git a/doc/devel/images/e-config-build-2.png b/doc/devel/images/e-config-build-2.png
deleted file mode 100644
index 455a21728f..0000000000
--- a/doc/devel/images/e-config-build-2.png
+++ /dev/null
Binary files differ
diff --git a/doc/devel/images/e-config-build-3.png b/doc/devel/images/e-config-build-3.png
deleted file mode 100644
index 546210793e..0000000000
--- a/doc/devel/images/e-config-build-3.png
+++ /dev/null
Binary files differ
diff --git a/doc/devel/images/e-config-flow.pic b/doc/devel/images/e-config-flow.pic
deleted file mode 100644
index a75a8b6087..0000000000
--- a/doc/devel/images/e-config-flow.pic
+++ /dev/null
@@ -1,36 +0,0 @@
-
-.PS 5
-space=0.7
-[
- Editor: ellipse "Editor"
- Pages: box "Pages" at last ellipse + (0,-space)
- Sections: box "Sections" at last box + (space/4, -space/2) fill 0
- Items: box "Items" at last box + (space/4, -space/2) fill 0
- line <-> from Editor.s to Pages.n
-]
-Manager: box dashed ht last [].ht+0.2 wid last[].wid+.2 at last []
-right; move; move
-[
- EConfig: ellipse "EConfig"
- EMConfig: ellipse "EMConfig" at last ellipse + (0,-space)
-]
-Config: box dashed ht last [].ht+0.2 wid last[].wid+.2 at last []
-
-EMTargetAccount: ellipse "Account" "Target" at Config.e + (1.5*space, 0)
-Druid: ellipse "Druid" at Config.s + (0,-1.5*space)
-EAccount: ellipse "EAccount" at Config.se + (1.5*space,-1.5*space)
-
-line <-> from Config.s to Druid.n " next, prepare" ljust "create, enable " rjust
-line -> from EAccount.n to EMTargetAccount.s " initialise" ljust " change" ljust
-
-line <-> from EAccount.w to Druid.e "initialise" "changes"
-line <-> from Config.e to EMTargetAccount.w "create" "changed"
-
-line <-> from Manager.e to Config.w "create" "check" "commit" "abort"
-spline <-> from Manager.s \
- to (Manager.s.x,Druid.s.y) \
- to (Manager.s.x+space/2,Druid.s.y-space/2) \
- then to EAccount.s + (-space/2,-space/2) \
- then to EAccount.s
-.PE
-
diff --git a/doc/devel/images/e-popup-merge-1.pic b/doc/devel/images/e-popup-merge-1.pic
deleted file mode 100644
index 1baa83a793..0000000000
--- a/doc/devel/images/e-popup-merge-1.pic
+++ /dev/null
@@ -1,61 +0,0 @@
-
-.PS 5
-space=0.7
-down
-define item {
- [ right
- box ht 0.25 wid 0 $1 ljust invis
- box ht 0.25 wid 3 "" invis ]
- [ right
- box ht 0.25 wid 0 $3 ljust invis
- box ht 0.25 wid 3 $2 ljust invis ]
- box ht 0.5 wid 3 at last [].n
-}
-
-define link {
- line -> from $1.e + (0.1,0) to $2.w - (0.1,0)
-}
-
-define title {
- box ht 0.5 wid 3 $1 invis
-}
-
-A: [
- title("Core Menu")
-
- Copy: item("Copy", "many", "00.copy")
- Paste: item("Paste", "", "01.paste")
- Bar1: item("-----", "one", "20.")
- Open: item("Open", "one", "21.open")
- Save: item("Save...", "one", "22.save")
- Bar2: item("-----", "", "40.")
- Read: item("Mark as Read", "mark_read", "41.markread")
- Unread: item("Mark as Unread", "mark_unread", "42.markunread")
-]
-
-move
-B: [
- title("Additional Items")
-
- ReplyList: item("Reply To List", "one", "02.replylist")
- Forward: item("Forward", "any", "03.forward")
-]
-
-C: [
- title("Merged Menu")
-
- Copy: item("Copy", "", "00.copy")
- Paste: item("Paste", "", "01.paste")
- Forward: item("Forward", "", "03.forward")
- Bar2: item("-----", "", "40.")
- Unread: item("Mark as Unread", "", "42.markunread")
-] with .nw at A.ne + ( 2,-1)
-
-link(A.Copy, C.Copy)
-link(A.Paste, C.Paste)
-link(B.Forward, C.Forward)
-link(A.Bar2, C.Bar2)
-link(A.Unread, C.Unread)
-
-.PE
-
diff --git a/doc/devel/images/e-popup-merge-2.pic b/doc/devel/images/e-popup-merge-2.pic
deleted file mode 100644
index 277d451517..0000000000
--- a/doc/devel/images/e-popup-merge-2.pic
+++ /dev/null
@@ -1,67 +0,0 @@
-
-.PS 5
-space=0.7
-down
-define item {
- [ right
- box ht 0.25 wid 0 $1 ljust invis
- box ht 0.25 wid 3 "" invis ]
- [ right
- box ht 0.25 wid 0 $3 ljust invis
- box ht 0.25 wid 3 $2 ljust invis ]
- box ht 0.5 wid 3 at last [].n
-}
-
-define link {
- line -> from $1.e + (0.1,0) to $2.w - (0.1,0)
-}
-
-define title {
- box ht 0.5 wid 3 $1 invis
-}
-
-A: [
- title("Core Menu")
-
- Copy: item("Copy", "many", "00.copy")
- Paste: item("Paste", "", "01.paste")
- Bar1: item("-----", "one", "20.")
- Open: item("Open", "one", "21.open")
- Save: item("Save...", "one", "22.save")
- Bar2: item("-----", "", "40.")
- Read: item("Mark as Read", "mark_read", "41.markread")
- Unread: item("Mark as Unread", "mark_unread", "42.markunread")
-]
-
-move
-B: [
- title("Additional Items")
-
- ReplyList: item("Reply To List", "one", "02.replylist")
- Forward: item("Forward", "any", "03.forward")
-]
-
-C: [
- title("Merged Menu")
-
- Paste: item("Paste", "", "01.paste")
- ReplyList: item("Reply To List", "", "02.replylist")
- Forward: item("Forward", "", "03.forward")
- Bar1: item("-----", "", "20.")
- Open: item("Open", "", "21.open");
- Save: item("Save...", "", "22.save")
- Bar2: item("-----", "", "40.")
- Read: item("Mark as Read", "", "41.markread")
-] with .nw at A.ne + ( 2,-1)
-
-link(A.Paste, C.Paste)
-link(B.ReplyList, C.ReplyList)
-link(B.Forward, C.Forward)
-link(A.Bar1, C.Bar1)
-link(A.Open, C.Open)
-link(A.Save, C.Save)
-link(A.Bar2, C.Bar2)
-link(A.Read, C.Read)
-
-.PE
-
diff --git a/doc/devel/importer/.cvsignore b/doc/devel/importer/.cvsignore
deleted file mode 100644
index 439d6641ff..0000000000
--- a/doc/devel/importer/.cvsignore
+++ /dev/null
@@ -1,10 +0,0 @@
-sgml
-Makefile
-Makefile.in
-*-decl.txt
-*-decl-list.txt
-*-unused.txt
-*.hierarchy
-*.signals
-*.stamp
-*-scan.c
diff --git a/doc/devel/importer/Makefile.am b/doc/devel/importer/Makefile.am
deleted file mode 100644
index 8b5343677a..0000000000
--- a/doc/devel/importer/Makefile.am
+++ /dev/null
@@ -1,195 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-# The name of the module, e.g. 'glib'.
-DOC_MODULE=evolution-shell-importer
-
-# The top-level SGML file. Change it if you want.
-DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
-
-# The directory containing the source code. Relative to $(srcdir).
-# gtk-doc will search all .c & .h files beneath here for inline comments
-# documenting functions and macros.
-DOC_SOURCE_DIR=$(EVOLUTION_DIR)/shell/importer
-
-# Extra options to supply to gtkdoc-scan.
-SCAN_OPTIONS=
-
-# Extra options to supply to gtkdoc-mkdb.
-MKDB_OPTIONS=
-
-# Extra options to supply to gtkdoc-fixref.
-FIXXREF_OPTIONS=
-
-# Used for dependencies.
-HFILE_GLOB= \
- $(top_srcdir)/shell/importer/evolution-importer.h \
- $(top_srcdir)/shell/importer/evolution-importer-client.h
-
-CFILE_GLOB= \
- $(top_srcdir)/shell/importer/evolution-importer.c \
- $(top_srcdir)/shell/importer/evolution-importer-client.c
-
-# Header files to ignore when scanning.
-IGNORE_HFILES= \
- GNOME_Evolution_Importer.h \
- importer.h
-
-# Images to copy into HTML directory.
-HTML_IMAGES =
-
-# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
-content_files =
-
-# Other files to distribute.
-extra_files =
-
-# CFLAGS and LDFLAGS for compiling scan program. Only needed if your app/lib
-# contains GtkObjects/GObjects and you want to document signals and properties.
-GTKDOC_CFLAGS = \
- -I$(top_srcdir)/shell/importer \
- -I$(top_srcdir)/shell \
- -I$(top_srcdir) \
- -I$(top_builddir) \
- $(BONOBO_VFS_GNOME_CFLAGS)
-
-GTKDOC_LIBS = \
- $(BONOBO_VFS_GNOME_LIBS) \
- $(top_builddir)/shell/importer/.libs/libevolution-importer.so
-
-GTKDOC_CC=$(LIBTOOL) --mode=compile $(CC)
-GTKDOC_LD=$(LIBTOOL) --mode=link $(CC)
-
-# If you need to override some of the declarations, place them in this file
-# and uncomment this line.
-#DOC_OVERRIDES = $(DOC_MODULE)-overrides.txt
-DOC_OVERRIDES =
-
-###########################################################################
-# Everything below here is generic and you shouldn't need to change it.
-###########################################################################
-
-TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
-
-EXTRA_DIST = \
- $(content_files) \
- $(extra_files) \
- $(HTML_IMAGES) \
- $(DOC_MAIN_SGML_FILE) \
- $(DOC_MODULE).types \
- $(DOC_MODULE)-sections.txt \
- $(DOC_OVERRIDES)
-
-DOC_STAMPS=scan-build.stamp tmpl-build.stamp sgml-build.stamp html-build.stamp \
- $(srcdir)/tmpl.stamp $(srcdir)/sgml.stamp $(srcdir)/html.stamp
-
-SCANOBJ_FILES = \
- $(DOC_MODULE).args \
- $(DOC_MODULE).hierarchy \
- $(DOC_MODULE).signals
-
-if ENABLE_GTK_DOC
-#all-local: html-build.stamp
-all-local: sgml-build.stamp
-
-#### scan ####
-
-scan-build.stamp: $(HFILE_GLOB)
- @echo '*** Scanning header files ***'
- if grep -l '^..*$$' $(srcdir)/$(DOC_MODULE).types > /dev/null ; then \
- CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" CFLAGS="$(GTKDOC_CFLAGS)" LDFLAGS="$(GTKDOC_LIBS)" gtkdoc-scanobj --module=$(DOC_MODULE) --output-dir=$(srcdir) ; \
- else \
- cd $(srcdir) ; \
- for i in $(SCANOBJ_FILES) ; do \
- test -f $$i || touch $$i ; \
- done \
- fi
- cd $(srcdir) && \
- gtkdoc-scan --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --ignore-headers="$(IGNORE_HFILES)" $(SCAN_OPTIONS) $(EXTRA_HFILES)
- touch scan-build.stamp
-
-$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES): scan-build.stamp
- @true
-
-#### templates ####
-
-tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_OVERRIDES)
- @echo '*** Rebuilding template files ***'
- cd $(srcdir) && gtkdoc-mktmpl --module=$(DOC_MODULE)
- touch tmpl-build.stamp
-
-tmpl.stamp: tmpl-build.stamp
- @true
-
-#### sgml ####
-
-sgml-build.stamp: tmpl.stamp $(CFILE_GLOB) $(srcdir)/tmpl/*.sgml
- @echo '*** Building SGML ***'
- cd $(srcdir) && \
- gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --main-sgml-file=$(DOC_MAIN_SGML_FILE) $(MKDB_OPTIONS)
- touch sgml-build.stamp
-
-sgml.stamp: sgml-build.stamp
- @true
-
-#### html ####
-
-html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
- @echo '*** Building HTML ***'
- test -d $(srcdir)/html || mkdir $(srcdir)/html
- cd $(srcdir)/html && gtkdoc-mkhtml $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
- test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) html )
- @echo '-- Fixing Crossreferences'
- cd $(srcdir) && gtkdoc-fixxref --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
- touch html-build.stamp
-endif
-
-##############
-
-clean-local:
- rm -f *~ *.bak $(SCANOBJ_FILES) *-unused.txt $(DOC_STAMPS)
-
-maintainer-clean-local: clean
- cd $(srcdir) && rm -rf sgml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
-
-install-data-local:
- $(mkinstalldirs) $(DESTDIR)$(TARGET_DIR)
- (installfiles=`echo $(srcdir)/html/*.html`; \
- if test "$$installfiles" = '$(srcdir)/html/*.html'; \
- then echo '-- Nothing to install' ; \
- else \
- for i in $$installfiles; do \
- echo '-- Installing '$$i ; \
- $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \
- done; \
- echo '-- Installing $(srcdir)/html/index.sgml' ; \
- $(INSTALL_DATA) $(srcdir)/html/index.sgml $(DESTDIR)$(TARGET_DIR); \
- fi)
-
-#
-# Require gtk-doc when making dist
-#
-if ENABLE_GTK_DOC
-dist-check-gtkdoc:
-else
-dist-check-gtkdoc:
- @echo "*** gtk-doc must be installed and enabled in order to make dist"
- @false
-endif
-
-dist-hook: dist-check-gtkdoc dist-hook-local
- mkdir $(distdir)/tmpl
- mkdir $(distdir)/sgml
- mkdir $(distdir)/html
- -cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl
- -cp $(srcdir)/sgml/*.sgml $(distdir)/sgml
- -cp $(srcdir)/html/index.sgml $(distdir)/html
- -cp $(srcdir)/html/*.html $(srcdir)/html/*.css $(distdir)/html
-
- images=$(HTML_IMAGES) ; \
- for i in $$images ; do \
- cp $(srcdir)/$$i $(distdir)/html ; \
- done
-
-.PHONY : dist-hook-local
-
-
diff --git a/doc/devel/importer/evolution-shell-importer-sections.txt b/doc/devel/importer/evolution-shell-importer-sections.txt
deleted file mode 100644
index e2474f6375..0000000000
--- a/doc/devel/importer/evolution-shell-importer-sections.txt
+++ /dev/null
@@ -1,79 +0,0 @@
-<INCLUDE>evolution-importer.h</INCLUDE>
-
-<SECTION>
-<FILE>evolution-importer</FILE>
-EVOLUTION_IMPORTER
-<TITLE>EvolutionImporter</TITLE>
-
-EvolutionImporterSupportFormatFn
-EvolutionImporterLoadFileFn
-EvolutionImporterProcessItemFn
-EvolutionImporterGetErrorFn
-
-EvolutionImporterResult
-
-evolution_importer_new
-
-<SUBSECTION Standard>
-EVOLUTION_TYPE_IMPORTER
-EVOLUTION_IMPORTER
-EVOLUTION_IS_IMPORTER
-EVOLUTION_IMPORTER_CLASS
-EVOLUTION_IS_IMPORTER_CLASS
-evolution_importer_get_type
-
-<SUBSECTION Private>
-EvolutionImporter
-EvolutionImporterPrivate
-
-</SECTION>
-
-<INCLUDE>evolution-importer-listener.h</INCLUDE>
-<SECTION>
-<FILE>evolution-importer-listener</FILE>
-EVOLUTION_IMPORTER_LISTENER
-<TITLE>EvolutionImporterListener</TITLE>
-
-EvolutionImporterListenerCallback
-
-evolution_importer_listener_new
-
-<SUBSECTION Standard>
-EVOLUTION_TYPE_IMPORTER_LISTENER
-EVOLUTION_IMPORTER_LISTENER
-EVOLUTION_IMPORTER_LISTENER_CLASS
-EVOLUTION_IS_IMPORTER_LISTENER
-EVOLUTION_IS_IMPORTER_LISTENER_CLASS
-evolution_importer_listener_get_type
-
-<SUBSECTION Private>
-EvolutionImporterListener
-EvolutionImporterListenerPrivate
-
-</SECTION>
-
-<INCLUDE>evolution-importer-client.h</INCLUDE>
-<SECTION>
-<FILE>evolution-importer-client</FILE>
-EVOLUTION_IMPORTER_CLIENT
-<TITLE>EvolutionImporterClient</TITLE>
-
-evolution_importer_client_new
-evolution_importer_client_new_from_id
-evolution_importer_client_support_format
-evolution_importer_client_load_file
-evolution_importer_client_process_item
-evolution_importer_client_get_error
-
-<SUBSECTION Standard>
-EVOLUTION_TYPE_IMPORTER_CLIENT
-EVOLUTION_IMPORTER_CLIENT
-EVOLUTION_IMPORTER_CLIENT_CLASS
-EVOLUTION_IS_IMPORTER_CLIENT
-EVOLUTION_IS_IMPORTER_CLIENT_CLASS
-evolution_importer_client_get_type
-
-<SUBSECTION Private>
-EvolutionImporterClient
-
-</SECTION>
diff --git a/doc/devel/importer/evolution-shell-importer.args b/doc/devel/importer/evolution-shell-importer.args
deleted file mode 100644
index e69de29bb2..0000000000
--- a/doc/devel/importer/evolution-shell-importer.args
+++ /dev/null
diff --git a/doc/devel/importer/evolution-shell-importer.hierarchy b/doc/devel/importer/evolution-shell-importer.hierarchy
deleted file mode 100644
index c46ebdf782..0000000000
--- a/doc/devel/importer/evolution-shell-importer.hierarchy
+++ /dev/null
@@ -1,7 +0,0 @@
-GtkObject
- BonoboObject
- BonoboXObject
- EvolutionImporter
- EvolutionImporterListener
- Handle to remote Bonobo::Unknown
- EvolutionImporterClient
diff --git a/doc/devel/importer/evolution-shell-importer.types b/doc/devel/importer/evolution-shell-importer.types
deleted file mode 100644
index e787818599..0000000000
--- a/doc/devel/importer/evolution-shell-importer.types
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <gnome.h>
-#include <bonobo.h>
-#include <shell/importer/evolution-importer.h>
-#include <shell/importer/evolution-importer-client.h>
-#include <shell/importer/evolution-importer-listener.h>
-
-evolution_importer_get_type
-evolution_importer_client_get_type
-evolution_importer_listener_get_type
diff --git a/doc/devel/importer/private-reference.sgml b/doc/devel/importer/private-reference.sgml
deleted file mode 100644
index d28c7b8591..0000000000
--- a/doc/devel/importer/private-reference.sgml
+++ /dev/null
@@ -1,21 +0,0 @@
- <reference id="importer-private-reference">
- <title>Importer Private API Reference</title>
-
- <partintro>
- <para>
- This part presents the class and function reference for the
- private APIs of the different components of the &Evolution;
- Import Framework.
- </para>
- </partintro>
-
- &EvolutionImporterListener;
- &EvolutionImporterClient;
- </reference>
-
-<!--
-Local variables:
-mode: sgml
-sml-parent-document: ("../evolution-devel-guide.sgml" "book" "part" "")
-End:
--->
diff --git a/doc/devel/importer/public-reference.sgml b/doc/devel/importer/public-reference.sgml
deleted file mode 100644
index ba99c9b309..0000000000
--- a/doc/devel/importer/public-reference.sgml
+++ /dev/null
@@ -1,20 +0,0 @@
- <reference id="importer-public-reference">
- <title>Importer Public API Reference</title>
-
- <partintro>
- <para>
- This part presents the class and function reference for the
- public APIs of the different components of the &Evolution;
- Import Framework.
- </para>
- </partintro>
-
- &EvolutionImporter;
- </reference>
-
-<!--
-Local variables:
-mode: sgml
-sml-parent-document: ("../evolution-devel-guide.sgml" "book" "part" "")
-End:
--->
diff --git a/doc/devel/importer/tmpl/evolution-importer-client.sgml b/doc/devel/importer/tmpl/evolution-importer-client.sgml
deleted file mode 100644
index 6cee37bef1..0000000000
--- a/doc/devel/importer/tmpl/evolution-importer-client.sgml
+++ /dev/null
@@ -1,84 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-EvolutionImporterClient
-
-<!-- ##### SECTION Short_Description ##### -->
-A #GtkObject based client to simplify use of a GNOME_Evolution_Importer object.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-This #GtkObject provides a convience wrapper to the GNOME_Evolution_Importer object, providing error checking and hiding all the CORBA internals from the user.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### MACRO EVOLUTION_IMPORTER_CLIENT ##### -->
-<para>
-Casts a #GtkObject into an #EvolutionImporterClient
-</para>
-
-@obj: A #GtkObject
-
-
-<!-- ##### FUNCTION evolution_importer_client_new ##### -->
-<para>
-
-</para>
-
-@objref:
-@Returns:
-
-
-<!-- ##### FUNCTION evolution_importer_client_new_from_id ##### -->
-<para>
-
-</para>
-
-@id:
-@Returns:
-
-
-<!-- ##### FUNCTION evolution_importer_client_support_format ##### -->
-<para>
-
-</para>
-
-@client:
-@filename:
-@Returns:
-
-
-<!-- ##### FUNCTION evolution_importer_client_load_file ##### -->
-<para>
-
-</para>
-
-@client:
-@filename:
-@folderpath:
-@Returns:
-
-
-<!-- ##### FUNCTION evolution_importer_client_process_item ##### -->
-<para>
-
-</para>
-
-@client:
-@listener:
-<!-- # Unused Parameters # -->
-@callback:
-@closure:
-
-
-<!-- ##### FUNCTION evolution_importer_client_get_error ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
diff --git a/doc/devel/importer/tmpl/evolution-importer.sgml b/doc/devel/importer/tmpl/evolution-importer.sgml
deleted file mode 100644
index 1c7736a37f..0000000000
--- a/doc/devel/importer/tmpl/evolution-importer.sgml
+++ /dev/null
@@ -1,96 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-EvolutionImporter
-
-<!-- ##### SECTION Short_Description ##### -->
-A #BonoboObject that implements the GNOME/Evolution/Importer interface.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-A #BonoboObject wrapper around the GNOME/Evolution/Importer interface, providing error checking and reference counting, hiding the CORBA internals from the user and providing a simple way to create a GNOME_Evolution_Importer object.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### MACRO EVOLUTION_IMPORTER ##### -->
-<para>
-Casts a #GtkObject into an #EvolutionImporter.
-</para>
-
-@obj: A #GtkObject.
-
-
-<!-- ##### USER_FUNCTION EvolutionImporterSupportFormatFn ##### -->
-<para>
-The type of function that is called when the importer wishes to find out if the importing component can support the file given in @filename.
-</para>
-
-@importer: The #EvolutionImporter.
-@filename: The filename of the file to check.
-@closure: The data passed into evolution_importer_new ().
-@Returns: A #gboolean. TRUE if the importing component can import the file, FALSE otherwise.
-
-
-<!-- ##### USER_FUNCTION EvolutionImporterLoadFileFn ##### -->
-<para>
-The type of function that is called when the importer wishes the importing component to load the file given in @filename, and initialise itself.
-</para>
-
-@importer: The #EvolutionImporter.
-@filename: The filename of the file to load.
-@folderpath:
-@closure: The data passed into evolution_importer_new ().
-@Returns: A #gboolean. TRUE if the load and initialisation was successful, FALSE otherwise.
-
-
-<!-- ##### USER_FUNCTION EvolutionImporterProcessItemFn ##### -->
-<para>
-The type of function that is called when the importer wants the importing component to process the next item (or items) in a file.
-</para>
-
-@importer: The #EvolutionImporter
-@listener: A GNOME_Evolution_Importer_Listener CORBA object.
-@closure: The data passed into evolution_importer_new ().
-@ev: A #CORBA_Environment for returning any CORBA exceptions.
-
-
-<!-- ##### USER_FUNCTION EvolutionImporterGetErrorFn ##### -->
-<para>
-The type of function that is called when the importer wants to get a string version of an error. Not all importing components support this function.
-</para>
-
-@importer: The #EvolutionImporter.
-@closure: The data passed to evolution_importer_new ().
-@Returns: A string representation of the error, or NULL if there was no error, or the importing component does not support the getError method.
-
-
-<!-- ##### ENUM EvolutionImporterResult ##### -->
-<para>
-
-</para>
-
-@EVOLUTION_IMPORTER_OK:
-@EVOLUTION_IMPORTER_UNSUPPORTED_OPERATION:
-@EVOLUTION_IMPORTER_INTERRUPTED:
-@EVOLUTION_IMPORTER_BUSY:
-@EVOLUTION_IMPORTER_NOT_READY:
-@EVOLUTION_IMPORTER_UNKNOWN_DATA:
-@EVOLUTION_IMPORTER_BAD_DATA:
-@EVOLUTION_IMPORTER_BAD_FILE:
-@EVOLUTION_IMPORTER_UNKNOWN_ERROR:
-
-<!-- ##### FUNCTION evolution_importer_new ##### -->
-<para>
-
-</para>
-
-@support_format_fn:
-@load_file_fn:
-@process_item_fn:
-@get_error_fn:
-@closure:
-@Returns:
-
-
diff --git a/doc/devel/importer/tmpl/evolution-shell-importer-unused.sgml b/doc/devel/importer/tmpl/evolution-shell-importer-unused.sgml
deleted file mode 100644
index 7a9a98034b..0000000000
--- a/doc/devel/importer/tmpl/evolution-shell-importer-unused.sgml
+++ /dev/null
@@ -1,10 +0,0 @@
-<!-- ##### USER_FUNCTION EvolutionImporterClientCallback ##### -->
-<para>
-
-</para>
-
-@client:
-@result:
-@more_items:
-@data:
-
diff --git a/doc/devel/preface.sgml b/doc/devel/preface.sgml
deleted file mode 100644
index fdaa824a8b..0000000000
--- a/doc/devel/preface.sgml
+++ /dev/null
@@ -1,113 +0,0 @@
- <preface id="introduction">
- <title>Introduction</title>
-
- <para>
- This is the &Evolution; Developer's Guide or programming guide
- for the &Evolution; groupware suite. If you are a programmer
- and you wish to use &Evolution;'s functionality from your own
- applications or if you wish to modify the &Evolution; core code,
- you should read this guide.
- </para>
-
- <para>
- If you are an end-user of &Evolution; you do not need to read
- this guide; please read the &Evolution; User's Guide instead.
- </para>
-
- <para>
- This guide contains the information you need to know to do the
- following:
-
- <itemizedlist>
- <listitem>
- <para>
- Write applications that use &Evolution;'s data
- repositories via the &Wombat; personal information server.
- Examples of this would be a <application>GNOME
- Panel</application> applet that displays today's
- appointments, or a telephone dialer application that uses
- the contents of the &Evolution; Addressbook.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Write applications that use the &Camel; mail library.
- This includes extending &Evolution;'s own mail component
- to perform additional functions.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Write new components for the &Evolution; Shell. Instead
- of writing a stand-alone application, you can provide your
- users with the benefit of having integrated views of their
- data from within Evolution.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Write new modules for the &Evolution; Executive Summary.
- This allows you to present commonly-accessed information
- in a convenient fashion directly in the &Evolution; Shell.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Modify the core &Evolution; code to add new features or
- change its architecture.
- </para>
- </listitem>
- </itemizedlist>
- </para>
-
- <sect1 id="organization">
- <title>Organization of this Guide</title>
-
- <para>
- This guide is organized in two big sections. The first is a
- programming guide, which consists of one part for each one of
- &Evolution;'s components: there are separate parts for the
- calendar, the addressbook, the mailer, the executive summary,
- and the shell. Each part gives a description of the
- architecture of its corresponding component, and also gives
- information about the component's internal architecture and
- some implementation details.
- </para>
-
- <para>
- The second section of this guide is a reference guide for
- &Evolution;'s programming interfaces. We have separated these
- into public and private interfaces. The public ones are those
- that most people will need to use when writing extensions or
- third-party components; the private interfaces are those used
- internally in &Evolution;. Even if you do not intend to
- modify the &Evolution; core code, it may be useful to know a
- bit about the way it is organized internally.
- </para>
-
- <para>
- &Evolution; is free software, and we want you as a programmer
- to make the most of it. We have provided many useful
- interfaces that you can use in your own applications. Still,
- we want you to view &Evolution; as a framework for building
- groupware applications, and this may occasionally involve
- making changes to its core code. We want you to learn from
- &Evolution;'s design because we think it marks an important
- milestone in the development of large-scale free software
- applications. We want you to modify it as you see fit. Free
- software gives you this freedom, and we want the whole world
- to benefit from it.
- </para>
- </sect1>
- </preface>
-
-<!--
-Local variables:
-mode: sgml
-sgml-parent-document: ("evolution-devel-guide.sgml" "book" "book" "")
-End:
--->
diff --git a/doc/devel/reference.sgml b/doc/devel/reference.sgml
deleted file mode 100644
index 4381ad29b7..0000000000
--- a/doc/devel/reference.sgml
+++ /dev/null
@@ -1,49 +0,0 @@
- <part id="evolution-api-reference">
- <title>&Evolution; API Reference</title>
-
- <partintro>
- <para>
- This part presents the class and function reference for the
- different libraries and interfaces that &Evolution; provides.
- Classes are described together with their methods; individual
- functions are grouped by functional group.
- </para>
-
- <para>
- &Evolution; provides two kinds of interfaces, public and
- private. The public interfaces are those designed to be used
- from third-party applications or components; if you wanted to
- write an application that uses &Evolution;'s data repositories
- to display data in a particular way, you would use the public
- interfaces. The private interfaces are those used inside
- &Evolution; itself; these are generally not interesting unless
- you intend to make modifications to the &Evolution; code base.
- </para>
-
- <para>
- While the public and private interfaces are described in
- separate reference sections, we have decided to put them
- together in the same book, this guide, because we want to
- encourage you to regard &Evolution; as something more than a
- black box that stores and dispatches personal information. We
- want you to make modifications to the &Evolution; core if
- these would allow you to present or store your data in better
- ways. &Evolution; is free software; we want you to learn from
- its design and implementation details so that you can make it
- even better for the whole world to use.
- </para>
- </partintro>
-
- &calendar-public-reference;
- <!-- &importer-public-reference; -->
- <!-- &evolution-services-public-reference; -->
- <!-- &importer-private-reference; -->
- <!-- &evolution-services-private-reference; -->
- </part>
-
-<!--
-Local variables:
-mode: sgml
-sgml-parent-document: ("evolution-devel-guide.sgml" "book" "book" "")
-End:
--->
diff --git a/doc/white-papers/calendar/calendar.sgml b/doc/white-papers/calendar/calendar.sgml
deleted file mode 100644
index 2cb3132e2b..0000000000
--- a/doc/white-papers/calendar/calendar.sgml
+++ /dev/null
@@ -1,209 +0,0 @@
-<!doctype article PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [
-<!entity Evolution "<application>Evolution</application>">
-<!entity CUA "<acronym>CUA</acronym>">
-<!entity PCS "<acronym>PCS</acronym>">
-<!entity Bonobo "<application>Bonobo</application>">
-<!entity CORBA "<acronym>CORBA</acronym>">
-<!entity GTK "<acronym>GTK+</acronym>">
-]>
-
-<article class="whitepaper" id="calendar">
-
- <artheader>
- <title>&Evolution; Calendaring Framework</title>
-
- <authorgroup>
- <author>
- <firstname>Federico</firstname>
- <surname>Mena Quintero</surname>
- <affiliation>
- <address>
- <email>federico@helixcode.com</email>
- </address>
- </affiliation>
- </author>
- </authorgroup>
-
- <copyright>
- <year>2000</year>
- <holder>Helix Code, Inc.</holder>
- </copyright>
-
- <abstract>
- <para>
- The &Evolution; groupware suite provides a framework for
- developing calendaring applications, as well as a graphical
- calendar client and a personal calendar server. This white
- paper describes the architecture of the &Evolution;
- calendaring framework.
- </para>
- </abstract>
- </artheader>
-
- <!-- Introduction -->
-
- <sect1 id="introduction">
- <title>Introduction</title>
-
- <para>
- Calendaring is an important part of a groupware suite. A
- calendaring framework will allow a user to keep a personal
- calendar and have several applications use it. Such
- applications could be a graphical calendar client that the user
- employs to schedule appointments and keep track of his time, a
- <productname>Palm Pilot</productname> synchronization client, or
- a simple alarm or reminder utility. A comprehensive calendaring
- framework will also allow multiple users to schedule
- appointments between each other; for example, a project director
- may want to schedule a weekly meeting with the rest of the
- project members, or a person who owns a large house may want to
- schedule a big party with his friends. The attendees will then
- want to reply with messages such as, &ldquo;I will
- attend&rdquo;, or &ldquo;I will attend only if the proposed time
- is changed&rdquo;.
- </para>
-
- <para>
- The &Evolution; groupware suite provides a framework for
- developing calendaring applications, as well as a graphical
- calendar client or calendar user agent (&CUA;) and a personal
- calendar server (&PCS;).
- </para>
-
- <para>
- The following sections explain the basic calendaring framework,
- the functions of the calendar user agent and the personal
- calendar server, and the relationship between the two.
- </para>
- </sect1>
-
- <!-- Personal Calendar Server -->
-
- <sect1 id="pcs">
- <title>Personal Calendar Server</title>
-
- <para>
- The personal calendar server (&PCS;) provides centralized
- management and storage of a user's personal calendar. Multiple
- clients can connect to the &PCS; simultaneously to query and
- modify the user's calendar in a synchronized fashion. The main
- features of the &PCS; are as follows:
- </para>
-
- <formalpara>
- <title>Storage</title>
-
- <para>
- The &PCS; is responsible for loading and saving calendars.
- Centralizing the loading and saving functionality allows
- multiple clients to use the same calendar at the same time
- without having to worry about each other.
- </para>
- </formalpara>
-
- <formalpara>
- <title>Basic Queries</title>
-
- <para>
- The &PCS; provides functions to do basic queries on a
- calendar, for example, a client can ask the server for a list
- of all the appointments in the calendar, or for all the data
- for a specific appointment.
- </para>
- </formalpara>
-
- <formalpara>
- <title>Recurrence and Alarm Queries</title>
-
- <para>
- Clients can ask the &PCS; for a list of the appointments that
- occur within a specified time range; for example a graphical
- client that has a per-week view could ask the &PCS; for all
- the appointments that occur in a particular week. This
- includes multiple occurrences of a single recurring event; for
- example, the object for &ldquo;a 1-hour meeting that occurs on
- every Tuesday and Thursday&rdquo; is represented inside the
- &PCS; as a single event with a recurrence rule. Similarly,
- clients can ask the &PCS; for a list of events that have
- alarms that trigger within a specified time range.
- </para>
- </formalpara>
-
- <formalpara>
- <title>Notification of Changes</title>
-
- <para>
- This is the most important function of the &PCS;, as it allows
- multiple calendar clients to maintain a unified view of the
- calendar between the server and themselves. When a client
- asks the &PCS; to modify or remove an event, the &PCS;
- notifies all the clients that are connected to it about the
- change. The policy is that &ldquo;the server is always
- right&rdquo;; clients can act as dumb views onto the
- calendar's data and they will be notified by the &PCS; when
- something changes.
- </para>
- </formalpara>
- </sect1>
-
- <!-- Calenar User Agent -->
-
- <sect1 id="cua">
- <title>Calendar User Agent</title>
-
- <para>
- A calendar user agent (&CUA;) is a program that lets a user
- manipulate a calendar. &Evolution; provides an attractive,
- graphical calendar client that communicates with the &Evolution;
- personal calendar server.
- </para>
-
- <para>
- The &Evolution; calendar client just provides a view onto the
- data that is stored and managed by the personal calendar server.
- The calendar client does not perform direct manipulations on a
- calendar's data; instead it offloads those requests to the
- calendar server, which takes care of making the appropriate
- modifications in the calendar and then notifies all the clients
- about the changes.
- </para>
- </sect1>
-
- <!-- Calendar Client Library -->
-
- <sect1 id="client-lib">
- <title>Calendar Client Library</title>
-
- <para>
- Communication between the personal calendar server and calendar
- clients is defined by a set of &Bonobo; &CORBA; interfaces.
- Clients can be written by implementing the client-side
- <classname>Listener</classname> interface, which defines the
- notification callbacks that the PCS uses to inform clients about
- changes to the calendar.
- </para>
-
- <para>
- As a convenience for &GTK; programmers, &Evolution; also
- includes a library which provides a
- <classname>CalClient</classname> class which can be used for
- communication with the personal calendar server. Objects of
- this class automatically contact the PCS when they are created.
- <classname>CalClient</classname> provides functions to request
- changes in the calendar, and it also emits signals when it gets
- notification about changes from the PCS. This makes it easy and
- convenient to write calendar clients for &Evolution; using
- &GTK;.
- </para>
-
- <para>
- The implementation of the <classname>CalClient</classname> class
- simply wraps the &Evolution; &CORBA; interfaces for calendaring
- with a familiar-looking &GTK; object. Calls to the
- <classname>Listener</classname> interface get translated to
- signal emissions from the <classname>CalClient</classname>, thus
- shielding programmers from the details of the &CORBA;
- interfaces.
- </para>
- </sect1>
-</article>
diff --git a/doc/white-papers/mail/camel.sgml b/doc/white-papers/mail/camel.sgml
deleted file mode 100644
index 5f5ea27a98..0000000000
--- a/doc/white-papers/mail/camel.sgml
+++ /dev/null
@@ -1,356 +0,0 @@
-<!doctype article PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [
-<!entity Evolution "<application>Evolution</application>">
-<!entity Camel "Camel">
-]>
-
-<article class="whitepaper" id="camel">
-
- <artheader>
- <title>The &Camel; Messaging Library</title>
-
- <authorgroup>
- <author>
- <firstname>Jeffrey</firstname>
- <surname>Stedfast</surname>
- <affiliation>
- <address>
- <email>fejj@helixcode.com</email>
- </address>
- </affiliation>
- </author>
-
- <author>
- <firstname>Michael</firstname>
- <surname>Zucchi</surname>
- <affiliation>
- <address>
- <email>notzed@helixcode.com</email>
- </address>
- </affiliation>
- </author>
-
- <author>
- <firstname>Dan</firstname>
- <surname>Winship</surname>
- <affiliation>
- <address>
- <email>danw@helixcode.com</email>
- </address>
- </affiliation>
- </author>
-
- <author>
- <firstname>Bertrand</firstname>
- <surname>Guiheneuf</surname>
- <affiliation>
- <address>
- <email>bertrand@helixcode.com</email>
- </address>
- </affiliation>
- </author>
- </authorgroup>
-
- <copyright>
- <year>2000, 2001</year>
- <holder>Ximian, Inc.</holder>
- </copyright>
-
- </artheader>
-
- <sect1 id="introduction">
- <title>Introduction</title>
-
- <para>
- &Camel; is a generic messaging library. It is being used as the
- back end for the mail component of &Evolution;. The name
- "&Camel;" is an acronym; it refers to the fact that the
- library is capable of going several days without food or water.
- It means : Camel's Acronym Makes Everyone Laugh.
- </para>
-
- <para>
- &Camel;'s initial design is heavily based on Sun's
- <trademark>JavaMail</trademark> API. It uses the Gtk+ object
- system, and many of its classes are direct analags of JavaMail
- classes. Its design has also been influenced by the features of
- IMAP, and the limitations of the standard UNIX mbox mail store,
- which set some of the boundaries on its requirements and
- extensibility.
- </para>
-
- <para>
- &Camel; sees all message repositories as stores containing
- folders. These folders in turn contain the messages the client
- actually accesses. The use of such a unified interface allows
- the client applications to be very extensible. &Camel; includes
- an external provider mechanism which allows applications to
- dynamically load and use protocols which were not available when
- the application was initially written.
- </para>
-
- <para>
- The abstract store/folder mechanism is a powerful and versatile
- way of accessing messages. No particular asumptions are made on
- the client side, thus allowing new ways of managing the
- messages. For example, the messages stored in the folders don't
- necessarily have to share some common physical location. The
- folder can be a purely virtual folder, containing only
- references to the actual messages. This is used by the "vFolder"
- provider, which allows you select messages meeting particular
- criteria and deal with them as a group.
- </para>
-
- <para>
- In addition to these possibilities, &Camel; has full MIME
- support. &Camel; MIME messages are lightweight objects
- representing the MIME skeleton of the actual message. The data
- contained in the subparts are never stored in memory except when
- they are actually needed. The application, when accessing the
- various MIME objects contained in the message (text parts,
- attachments, embedded binary objects ...) asks &Camel; for a
- stream that it can read data from. This scheme is particularly
- useful with the IMAP provider. IMAP has strong MIME support
- built-in, which allows &Camel; to download only the parts of
- messages that it actually needs: attachments need not be
- downloaded until they are viewed, and unnecessary
- "multipart/alternative" parts will never be read off the server.
- </para>
- </sect1>
-
- <sect1 id="overview">
- <title>Overview</title>
-
- <graphic format="gif" fileref="camel"></graphic>
-
- <para>
- To begin using &Camel;, an application first creates subclassed
- <classname>CamelSession</classname> object. This object is used
- to store application defaults, and to coordinate communication
- between providers and the application.
- </para>
-
- <para>
- A <classname>CamelProvider</classname> is a dynamically-loadable
- module that provides functionality associated with a specific
- service. Examples of providers are POP, IMAP and SMTP. Providers
- include subclasses of the various other &Camel; classes for
- accessing and manipulating messages.
- </para>
-
- <para>
- <classname>CamelService</classname> is an abstract class for
- describing a connection to a local or remote service. It
- currently has two subclasses: <classname>CamelStore</classname>,
- for services that store messages (such as IMAP servers and mbox
- files), and <classname>CamelTransport</classname>, for services
- that deliver messages (such as SMTP or a local MTA). A provider
- could also be both a store and a transport, as in the case of
- NNTP.
- </para>
-
- <para>
- A <classname>CamelStore</classname> contains some number of
- <classname>CamelFolder</classname> objects, which in turn
- contain messages. A <classname>CamelFolder</classname> provides
- a <classname>CamelFolderSummary</classname> object, which
- includes details about the subject, date, and sender of each
- message in the folder. The folder also includes the messages
- themselves, as subclasses of <classname>CamelMedium</classname>.
- </para>
-
- <para>
- Email messages are represented by the
- <classname>CamelMimeMessage</classname> class, a subclass of
- <classname>CamelMedium</classname>. This class includes
- operations for accessing RFC822 and MIME headers, accessing
- subparts of MIME messages, encoding and decoding Base64 and
- Quoted-Printable, etc.
- </para>
-
- <para>
- <classname>CamelTransport</classname> includes methods for
- delivering messages. While the abstract
- <function>CamelTransport::send</function> method takes a
- <classname>CamelMedium</classname>, its subclasses may only be
- able to deliver messages of specific
- <classname>CamelMedium</classname> subclasses. For instance,
- <classname>CamelSendmailTransport</classname> requires a
- <classname>CamelMimeMessage</classname>, because it needs a
- message that includes a "To:" header. A hypothetical
- <classname>CamelNNTPTransport</classname> would need a
- <classname>CamelNewsMessage</classname>, which would have a
- "Newsgroups:" header.
- </para>
-
- <para>
- The content of messages are referred to using
- <classname>CamelStream</classname> and its subclasses. In the
- case of an mbox-based store, the
- <classname>CamelStream</classname> would abstract the operation
- of reading the correct section of the mbox file. For IMAP,
- reading off the <classname>CamelStream</classname> might result
- in commands being issued to the remote IMAP server and data
- being read off a socket.
- </para>
-
- <para>
- The final major class in &Camel; is
- <classname>CamelException</classname>, which is used to
- propagate information about errors. Many methods take a
- <classname>CamelException</classname> as an argument, which the
- caller can then check if an error occurs. It includes both a
- numeric error code which can be interpreted by the program, and
- a text error message that can be displayed to the user.
- </para>
- </sect1>
-
- <sect1 id="classes">
- <title>Major Subcomponents</title>
-
- <sect2 id="store">
- <title>The Message Store</title>
-
- <para>
- A <classname>CamelStore</classname> inherits the ability to
- connect and authenticate to a service from its parent class,
- <classname>CamelService</classname>. It then adds the ability
- to retrieve folders. A store must contain at least one folder,
- which can be retrieved with
- <function>CamelStore::get_default_folder</function>. There are
- also methods to retrieve the "top-level" folder (for
- hieararchical stores), and to retrieve an arbitrary folder by
- name.
- </para>
-
- <para>
- All <classname>CamelFolder</classname>s must implement certain
- core operations, most notably generating a summary and
- retrieving and deleting messages. A
- <classname>CamelFolder</classname> must assign a permanently
- unique identifier to each message it contains. Messages can
- then be retrieved via
- <function>CamelFolder::get_message</function>.
- </para>
-
- <para>
- Folders must also implement the
- <function>get_parent_folder</function> and
- <function>list_subfolders</function> methods. For stores that
- don't allow multiple folders, they would return NULL and an
- empty list, respectively. Stores that do allow multiple
- folders will also define methods for creating and deleting
- folders, and for moving messages between them (assuming the
- folders are writable).
- </para>
-
- <para>
- Folders that support searching can define the
- <function>search_by_expression</function> method. For mbox
- folders, this is implemented by indexing the messages with the
- ibex library and using that to search them later. For IMAP
- folders, this uses the IMAP SEARCH command. Other folder types
- might not be able to implement this functionality, in which
- case users would not be able to do full-content searches on
- them.
- </para>
- </sect2>
-
- <sect2 id="messages">
- <title>Messages</title>
-
- <para>
- As mentioned before, messages are represented by subclasses of
- <classname>CamelMedium</classname>.
- <classname>CamelMedium</classname> itself is a subclass of
- <classname>CamelDataWrapper</classname>, a generic class for
- connecting a typed data source to a data sink.
- <classname>CamelMedium</classname> adds the concept of message
- headers versus message body.
- (<classname>CamelDataWrapper</classname> has one other
- important subclass, <classname>CamelMultipart</classname>,
- which is used to provide separate access to the multiple
- independent parts of a multipart MIME type.)
- <classname>CamelMedium</classname>'s subclasses provide more
- specialized handling of various headers:
- <classname>CamelMimePart</classname> adds special handling for
- the &ldquot;Content-*&rdquot; headers in MIME messages, and
- its subclass <classname>CamelMimeMessage</classname> adds
- handling for the RFC822 headers.
- </para>
-
- <graphic format="gif" fileref="mimemessage"></graphic>
-
- <para>
- Consider a message with two parts: a text part (in both plain
- text and HTML), and an attached image:
-
- <programlisting>
-
- From: Dan Winship &lt;danw@helixcode.com&gt;
- To: Matt Loper &lt;matt@helixcode.com&gt;
- Subject: the Camel white paper
- MIME-Version: 1.0
- Content-Type: multipart/mixed;
- boundary="jhTYrnsRrdhDFGa"
-
- This is a multi-part message in MIME format.
- --jhTYrnsRrdhDFGa
- Content-Type: multipart/alternative;
- boundary="sFSenbAFDSgDfg"
-
- --sFSenbAFDSgDfg
- Content-Type: text/plain
-
- Hey, Matt
-
- Check out this graphic...
-
- -- Dan
-
- --sFSenbAFDSgDfg
- Content-Type: text/html
-
- Hey, Matt&lt;br&gt;
- &lt;br&gt;
- Check out this graphic...&lt;br&gt;
- &lt;br&gt;
- -- Dan&lt;br&gt;
- &lt;br&gt;
- --sFSenbAFDSgDfg--
-
- --jhTYrnsRrdhDFGa
- Content-Type: image/png
- Content-Transfer-Encoding: base64
-
- F4JLw0ORrkRa8AwAMQJLAaI3UDIGsco9RAaB92...
- --jhTYrnsRrdhDFGa--
- </programlisting>
-
- <para>
- In &Camel;, this would be represented as follows:
- </para>
-
- <graphic fileref="samplemsg"></graphic>
- </sect2>
-
- <sect2 id="streams">
- <title>Streams</title>
-
- <para>
- Streams are a generic data transport layer. Two basic stream
- classes are <classname>CamelStreamFs</classname>, for
- reading and writing files, and
- <classname>CamelStreamMem</classname>, for reading from and
- writing to objects that are already in memory.
- </para>
-
- <para>
- Streams can also be filtered. So a CamelMimePart
- containing base64-encoded data can filter its output through
- CamelMimeFilterBasic. Other parts of the application that want
- to read its data will never need to even realize that the
- original data was encoded.
- </para>
- </sect2>
-
-</article>
diff --git a/doc/white-papers/mail/ibex.sgml b/doc/white-papers/mail/ibex.sgml
deleted file mode 100644
index dcb8f5ca4b..0000000000
--- a/doc/white-papers/mail/ibex.sgml
+++ /dev/null
@@ -1,158 +0,0 @@
-<!doctype article PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [
-<!entity Evolution "<application>Evolution</application>">
-<!entity Camel "Camel">
-<!entity Ibex "Ibex">
-]>
-
-<article class="whitepaper" id="ibex">
-
- <artheader>
- <title>Ibex: an Indexing System</title>
-
- <authorgroup>
- <author>
- <firstname>Dan</firstname>
- <surname>Winship</surname>
- <affiliation>
- <address>
- <email>danw@helixcode.com</email>
- </address>
- </affiliation>
- </author>
- </authorgroup>
-
- <copyright>
- <year>2000</year>
- <holder>Helix Code, Inc.</holder>
- </copyright>
-
- </artheader>
-
- <sect1 id="introduction">
- <title>Introduction</title>
-
- <para>
- &Ibex; is a library for text indexing. It is being used by
- &Camel; to allow it to quickly search locally-stored messages,
- either because the user is looking for a specific piece of text,
- or because the application is contructing a vFolder or filtering
- incoming mail.
- </para>
- </sect1>
-
- <sect1 id="goals">
- <title>Design Goals and Requirements for Ibex</title>
-
- <para>
- The design of &Ibex; is based on a number of requirements.
-
- <itemizedlist>
- <listitem>
- <para>
- First, obviously, it must be fast. In particular, searching
- the index must be appreciably faster than searching through
- the messages themselves, and constructing and maintaining
- the index must not take a noticeable amount of time.
- </para>
- </listitem>
-
- <listitem>
- <para>
- The indexes must not take up too much space. Many users have
- limited filesystem quotas on the systems where they read
- their mail, and even users who read mail on private machines
- have to worry about running out of space on their disks. The
- indexes should be able to do their job without taking up so
- much space that the user decides he would be better off
- without them.
- </para>
-
- <para>
- Another aspect of this problem is that the system as a whole
- must be clever about what it does and does not index:
- accidentally indexing a "text" mail message containing
- uuencoded, BinHexed, or PGP-encrypted data will drastically
- affect the size of the index file. Either the caller or the
- indexer itself has to avoid trying to index these sorts of
- things.
- </para>
- </listitem>
-
- <listitem>
- <para>
- The indexing system must allow data to be added to the index
- incrementally, so that new messages can be added to the
- index (and deleted messages can be removed from it) without
- having to re-scan all existing messages.
- </para>
- </listitem>
-
- <listitem>
- <para>
- It must allow the calling application to explain the
- structure of the data however it wants to, rather than
- requiring that the unit of indexing be individual files.
- This way, &Camel; can index a single mbox-format file and
- treat it as multiple messages.
- </para>
- </listitem>
-
- <listitem>
- <para>
- It must support non-ASCII text, given that many people send
- and receive non-English email, and even people who only
- speak English may receive email from people whose names
- cannot be written in the US-ASCII character set.
- </para>
- </listitem>
- </itemizedlist>
-
- <para>
- While there are a number of existing indexing systems, none of
- them met all (or even most) of our requirements.
- </para>
- </sect1>
-
- <sect1 id="implementation">
- <title>The Implementation</title>
-
- <para>
- &Ibex; is still young, and many of the details of the current
- implementation are not yet finalized.
- </para>
-
- <para>
- With the current index file format, 13 megabytes of Info files
- can be indexed into a 371 kilobyte index file&mdash;a bit under
- 3% of the original size. This is reasonable, but making it
- smaller would be nice. (The file format includes some simple
- compression, but <application>gzip</application> can compress an
- index file to about half its size, so we can clearly do better.)
- </para>
-
- <para>
- The implementation has been profiled and optimized for speed to
- some degree. But, it has so far only been run on a 500MHz
- Pentium III system with very fast disks, so we have no solid
- benchmarks.
- </para>
-
- <para>
- Further optimization (of both the file format and the in-memory
- data structures) awaits seeing how the library is most easily
- used by &Evolution;: if the indexes are likely to be kept in
- memory for long periods of time, the in-memory data structures
- need to be kept small, but the reading and writing operations
- can be slow. On the other hand, if the indexes will only be
- opened when they are needed, reading and writing must be fast,
- and memory usage is less critical.
- </para>
-
- <para>
- Of course, to be useful for other applications that have
- indexing needs, the library should provide several options, so
- that each application can use the library in the way that is
- most suited for its needs.
- </para>
- </sect1>
-</article>
diff --git a/doc/white-papers/widgets/e-table.sgml b/doc/white-papers/widgets/e-table.sgml
deleted file mode 100644
index 5ff4faf2ae..0000000000
--- a/doc/white-papers/widgets/e-table.sgml
+++ /dev/null
@@ -1,279 +0,0 @@
-<!doctype article PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [
-<!entity Evolution "<application>Evolution</application>">
-<!entity ETable "<classname>ETable</classname>">
-<!entity ETableModel "<classname>ETableModel</classname>">
-<!entity ETableSimple "<classname>ETableSimple</classname>">
-<!entity ETableHeader "<classname>ETableHeader</classname>">
-<!entity ETableSpecification "<classname>ETableSpecification</classname>">
-<!entity ETableCol "<classname>ETableCol</classname>">
-]>
-
-<article class="whitepaper" id="e-table">
-
- <artheader>
- <title>The ETable Widget</title>
-
- <authorgroup>
- <author>
- <firstname>Chris</firstname>
- <surname>Lahey</surname>
- <affiliation>
- <address>
- <email>clahey@helixcode.com</email>
- </address>
- </affiliation>
- </author>
- <author>
- <firstname>Miguel</firstname>
- <surname>de Icaza</surname>
- <affiliation>
- <address>
- <email>miguel@helixcode.com</email>
- </address>
- </affiliation>
- </author>
- </authorgroup>
-
- <copyright>
- <year>2000</year>
- <holder>Helix Code, Inc.</holder>
- </copyright>
-
- </artheader>
-
- <sect1 id="introduction">
- <title>Introduction</title>
-
- <para>
- &ETable; is a table widget on steroids. It is intended to provide
- all the table functionality needed throughout &Evolution;, and
- hopefully be general purpose enough to be used in other projects.
- </para>
-
- <para>
- &ETable; provides a lot of interactive control over the data in the
- table. Without any work from the programmer, &ETable; provides
- rearrangeable columns and editable data. When finished, &ETable; will
- also provide, again with no programmer intervention, easy interactive
- sorting and grouping.
- </para>
-
- <para>
- &ETable; gives you a great deal of functionality, flexibility, and
- power. Most of this power is internal to the widget, but some of
- the flexibility requires a bit of work by the programmer.
- However, once you learn it, &ETable; is not very hard at all to
- use.
- </para>
-
- <para>
- &ETable;'s power comes from the fact that it is fully
- model/view/controller based. Various models are involved into
- the process of rendering the information, and various views are
- provided. The programmer has a wide range of options: from the
- most finely hand-tuned table to a generic all-encompasing widget
- that takes over most of tasks. It is up to the programmer: he
- can use the simple to use &ETable; widget that takes care of
- everything in a generic way, or he can use the various
- components to roll his own tabular display.
- </para>
-
- <para>
- &ETable; ships with a standard set of information renderers:
- strings, bitmaps, toggle-buttons, check-boxes, and multi-line
- strings. But the programmer can write and implement his own
- renderer for his information. This means that by default
- &ETable; provides the basic display facilities that programmers
- required, but they offer the programmer a complete freedom to
- incorporate new cell renderers.
- </para>
-
- </sect1>
-
- <sect1 id="model">
- <title>ETableModel</title>
-
- <para>
- The data back end for the &ETable; is an &ETableModel;. The
- &ETableModel is an abstract interface that acts as the
- information repository for the various &ETable components.
- </para>
-
- <para>
- To use &ETable; you have to create a subclass of the abstract
- &ETableModel; class. However, to save you the work of defining
- a new <classname>GtkClass</classname> every time you use
- &ETable, there is a predefined subclass of &ETableModel; called
- &ETableSimple; which simply takes a list of function callbacks
- to perform the various operations.
- </para>
-
- </sect1>
-
- <sect1 id="columns">
- <title>Columns</title>
-
- <para>
- There are two different meanings to the word "column". The first
- is the model column (defined by the &ETableCol: object). A model
- column describes how it maps to the column in the &ETableModel;
- as well as containing information about its properties (name,
- resizability, resize dimensions, and a renderer for this
- specific columns).
- </para>
-
- <para>
- &ETable; distinguishes between a model column index, and a view
- column index. The former reflects the column in which the data
- is stored in the &ETableModel; The later represents the actual
- location at which the column is being displayed in the screen.
- </para>
-
- <para>
- Each view column index corresponds to a specific model column,
- though a model column may have any number of view columns
- associated with it (including zero). For example the same
- column might be rendered twice, or the data from one column
- could be used to display different bits of information
- </para>
-
- <para>
- The view column does not necessarily depend on only one model
- column. In some cases, the view column renderer can be given a
- reference to another model column to get extra information about
- its display. For example, a mail program could display deleted
- messages with a line through them by creating a model column
- with no corresponding view column that told whether or not the
- message is deleted, and then having the text column
- strikethrough the display if the invisible column had a value
- corresponding to "deleted".
- </para>
-
- <para>
- The view column also specifies a few other pieces of
- information. One piece of information is the renderer. &ETable;
- provides a number of renderers to choose from, or you can write
- your own. Currently, there are renderers for text, image sets,
- and checkboxes.
- </para>
-
- <para>
- The view column also includes information about the header.
- There are two types of headers: text, and pixbuf. The first
- allows you to specify a string which is rendered in the header.
- The second allows you to specify an image to copy into the
- header.
- </para>
- </sect1>
-
- <sect1 id="header">
- <title>Header</title>
-
- <para>
- The &ETableHeader; represents the header information for the
- table. The &ETableHeader; is used in two different ways. The
- first is the in the <structfield>full_header</structfield>
- element of an &ETable;. This is the list of possible columns in
- the view. You add each of your columns to this &ETableHeader;
- and then pass it into the &ETable;.
- </para>
-
- <para>
- The second use is completely internal. &ETable; uses another
- &ETableHeader; to store the actual displayed columns. Many of
- the &ETableHeader; functions are for this purpose. The only
- functions that users of the library should need to use are
- <function>e_table_header_new</function> and
- <function>e_table_header_add_col</function>.
- </para>
- </sect1>
-
- <sect1 id="layout">
- <title>Layout Specification</title>
-
- <para>
- &ETable; uses an &ETableSpecification; to layout the columns of
- the widget. The &ETableSpecification; is specified as XML data
- passed into the &ETable; as a string.
- </para>
-
- <para>
- The most powerful part of the &ETableSpecification; is that when
- finished, &ETable; will allow you to get a copy of an
- &ETableSpecification; that describes the current view of the
- tree. This allows the developer to save the current view so that
- next time the user opens this table, they find it in exactly the
- state that they left it.
- </para>
-
- <para>
- The XML specification allows for a number of things. First, it
- allows you to pick a set of default columns to be shown. Thus,
- even if you had hundreds of pieces of data, you could choose to
- only display a few that fit on the screen by default.
- </para>
-
- <para>
- The second major thing that the &ETableSpecification; allows you
- to specify is the column grouping and sorting. &ETable; has a
- powerful mechanism for allowing the user to choose columns to
- group by, thus allowing multiple columns of sorting, as well as
- visual grouping of similar elements and interactive selection of
- what data to display.
- </para>
-
- <para>
- The grouping in &ETableSpecification; is specified as a
- hierarchy of columns to group by. Each level of the hierarchy
- lets you sort by a particular column, either ascending or
- descending. All levels except the last cause the canvas to group
- by the given column.
- </para>
-
- <para>
- An example &ETableSpecification; follows.
- </para>
-
- <programlisting>
- &lt;ETableSpecification&gt;
- &lt;columns-shown frozen_columns="2"&gt;
- &lt;column&gt; 0 &lt;/column&gt;
- &lt;column&gt; 1 &lt;/column&gt;
- &lt;column&gt; 2 &lt;/column&gt;
- &lt;column&gt; 3 &lt;/column&gt;
- &lt;column&gt; 4 &lt;/column&gt;
- &lt;/columns-shown&gt;
- &lt;grouping&gt;
- &lt;group column="3" ascending="1"&gt;
- &lt;group column="4" ascending="0"&gt;
- &lt;leaf column="2" ascending="1"/&gt;
- &lt;/group&gt;
- &lt;/group&gt;
- &lt;/grouping&gt;
- &lt;/ETableSpecification&gt;
- </programlisting>
-
- <para>
- This example has 5 columns which are initially in order. It has
- 2 levels of grouping. The first is grouped by the 4th column
- (all indexes are 0 based) and sorts those groups in ascending
- order. Inside those groups, the data is grouped by the fifth
- column and sorted in descending order of the fifth column.
- Finally, the data in those groups is sorted by the third column
- in ascending order. Due to the "frozen_columns" attribute on the
- columns-shown element, the user will not be
- able to rearrange the first two columns. They will always be the
- first two.
- </para>
- </sect1>
-
- <sect1 id="conclusion">
- <title>Conclusion</title>
-
- <para>
- All in all, &ETable; is a very powerful widget. Once you learn
- to use it, you have access to a vast amount of power requiring a
- comparatively small amount of work.
- </para>
- </sect1>
-</article>
diff --git a/e-util/.cvsignore b/e-util/.cvsignore
deleted file mode 100644
index fac587630c..0000000000
--- a/e-util/.cvsignore
+++ /dev/null
@@ -1,10 +0,0 @@
-.deps
-Makefile
-Makefile.in
-.libs
-*.lo
-*.la
-e-error-tool
-e-util-marshal.c
-e-util-marshal.h
-test-source-list \ No newline at end of file
diff --git a/e-util/ChangeLog b/e-util/ChangeLog
deleted file mode 100644
index da4b64f537..0000000000
--- a/e-util/ChangeLog
+++ /dev/null
@@ -1,1155 +0,0 @@
-2005-01-27 Mengjie Yu <meng-jie.yu@sun.com>
-
- * e-request.c: (e_request_string):add a11y description for the
- entry.
-
-2005-01-26 Jeffrey Stedfast <fejj@novell.com>
-
- * e-config.c (ech_check): If the plugin isn't enabled, return TRUE
- so that the suer doesn't get locked in one of the account druid
- pages.
-
-2005-01-21 JP Rosevear <jpr@novell.com>
-
- Fixes #46404
-
- * Makefile.am: build new files
-
- * e-print.[hc]: print related config and dialog routines
-
-2005-01-17 Rodrigo Moya <rodrigo@novell.com>
-
- * e-url.[ch]:
- * Makefile.am: removed e-url.[ch], which are now in libedataserver.
-
-2005-01-08 Not Zed <NotZed@Ximian.com>
-
- * e-url.c (e_url_shroud): dont' use '%.*s' for truncating string
- output.
-
-2005-01-09 JP Rosevear <jpr@novell.com>
-
- * e-url.c (e_uri_new): fix parsing of query string
-
-2005-01-07 Rodrigo Moya <rodrigo@novell.com>
-
- * e-categories-config.c (e_categories_config_open_dialog_for_entry):
- set the dialog's parent.
-
-2005-01-07 Rodrigo Moya <rodrigo@novell.com>
-
- * e-categories-config.c (e_categories_config_open_dialog_for_entry):
- use the new ECategoriesDialog in libedataserverui.
-
-2005-01-06 Rodney Dawes <dobey@novell.com>
-
- * e-config.c (e_config_create_window): Add the GTK_DIALOG_NOSEPARATOR
- flag, and set appropriate border widths around the main dialog vbox,
- and action area, to be more HIG compliant
-
-2005-01-06 JP Rosevear <jpr@novell.com>
-
- * e-error-tool.c (main): use the base name only, so if a full path
- is passed to us we still write out to the current directory, for
- when builddir != srcdir
-
-2005-01-04 Rodrigo Moya <rodrigo@novell.com>
-
- * e-categories-config.[ch]: removed most of the API. The rest will
- be removed as the GAL dependencies are sorted out.
-
-2004-12-22 Not Zed <NotZed@Ximian.com>
-
- * e-plugin.c: include config.h.
-
-2004-12-17 Not Zed <NotZed@Ximian.com>
-
- * e-popup.c (e_popup_add_items): add a translation domain to api.
- (e_popup_create_menu): translate the label using the supplied
- domain.
- (emph_popup_factory): pass domain to popup_add_items.
-
- * e-plugin.c (ep_construct): if we have a localedir set, then
- bindtextdomain so gettext can find it.
-
-2004-12-21 JP Rosevear <jpr@novell.com>
-
- Fixes #30992
-
- * e-config.c (e_config_create_window): use cancel rather than
- close button
-
-2004-12-21 JP Rosevear <jpr@novell.com>
-
- * e-account.c: convert to G_DEFINE_TYPE
-
- * e-account-list.c: ditto
-
-2004-12-08 Not Zed <NotZed@Ximian.com>
-
- * e-plugin.c (e_plugin_load_plugins): kill warning if we can't
- open the path.
-
-2004-12-06 Not Zed <NotZed@Ximian.com>
-
- * e-config.c (ec_rebuild): set the table spacings to 6 for
- generated tables.
-
-2004-11-22 Not Zed <NotZed@Ximian.com>
-
- * e-config.c (ec_rebuild): if the table existed before and we have
- no factory, destroy it always.
-
-2004-12-03 Not Zed <NotZed@Ximian.com>
-
- * e-config.c (ec_rebuild): revert the patch from chenthill, this
- wont work yet.
-
-2004-11-29 Mengjie Yu <meng-jie.yu@sun.com>
-
- * e-config.c: (ec_rebuild):add mnemonic for label.
- * e-passwords.c: (ep_ask_password):add description for password dialog.
-
-2004-11-26 JP Rosevear <jpr@novell.com>
-
- * e-gui-utils.c (e_create_image_widget): get the image directly
- from the icon factory
-
- * e-config.c: insert debug defines so we can
- turn spew on and off
-
- * e-event.c: insert debug defines so we can turn spew on and off
-
- * e-menu.c: insert debug defines so we can turn spew on and off
-
- * e-plugin.c: insert debug defines and set to off for now
-
- * e-popup.c: insert debug defines so we can turn spew on and off
- (e_popup_create_menu): get the image directly from the icon
- factory
-
-2004-11-26 JP Rosevear <jpr@novell.com>
-
- * e-icon-factory.h: add proto
-
- * e-icon-factory.c (e_icon_factory_init): cast to kill warning
- (e_icon_factory_get_image): new function to return a GtkImage
- widget give an icon name and size
-
-2004-11-25 Chenthill Palanisamy <pchenthill@novell.com>
-
- * e-config.c (ec_rebuild): Set the row and column spacings as
- tweleve while creating the table to make it HIG compliant.
-
-2004-11-19 Not Zed <NotZed@Ximian.com>
-
- * e-plugin.c (ep_load): if the plugin fails to load just disable
- it, don't unref it (it may be referenced elsewhere).
-
-2004-11-18 Not Zed <NotZed@Ximian.com>
-
- * e-plugin.c (epl_loadmodule): split out module loadng code.
- (epl_construct): if we're enabled, and load-on-startup is set,
- load the module right away. Not to be abused!
-
-2004-11-16 Not Zed <NotZed@Ximian.com>
-
- * e-host-utils.[ch]: removed, code moved into
- camel-net-utils.[ch].
-
-2004-11-15 Not Zed <NotZed@Ximian.com>
-
- * e-trie.[ch], e-memory.[ch], e-sexp.[ch], e-msgport.[ch]: Moved
- to eds/libedataserver.
-
- * e-path.[ch]: removed & deleted.
-
-2004-11-03 Not Zed <NotZed@Ximian.com>
-
- * e-plugin.c (e_plugin_list_plugins): added helper api to list all
- plugins.
- (ep_construct): load authors into new list for them.
- (e_plugin_register_type): setup disabled list.
- (ep_construct): dont load the hooks if we're not enabled.
- (e_plugin_enable): make this a virutal method.
- (e_plugin_invoke): if we're disabled, noop.
-
-2004-11-01 Not Zed <NotZed@Ximian.com>
-
- ** See bug #68787
-
- * e-account.c (xml_set_content): check the new val isn't null
- before dereferencing it.
- * e-account.c (xml_set_prop): same here.
-
-2004-10-28 Not Zed <NotZed@Ximian.com>
-
- * e-config.c (ec_rebuild): revert the last change.
-
-2004-10-28 Not Zed <NotZed@Ximian.com>
-
- * e-config.c (ec_rebuild): set the default row/col spacings of the
- table.
-
-2004-10-20 Not Zed <NotZed@Ximian.com>
-
- * e-config.c (ec_rebuild): check for empty trailing sections/pages
- after we exit the main loop.
-
- * e-plugin.c (e_plugin_get_type): make ~/.eplugins the default
- eplugin location, not ~/.eplug.
-
-2004-10-18 Not Zed <NotZed@Ximian.com>
-
- * e-config.h: fix some forward decls.
-
-2004-10-19 JP Rosevear <jpr@novell.com>
-
- * e-config.c, e-event.c, e-menu.c, e-plugin.c, e-plugin.h,
- e-popup.c: convert to org.gnome hook names
-
-2004-10-07 Jeffrey Stedfast <fejj@novell.com>
-
- * e-passwords.c (ep_ask_password): Use "%s" as the formatter
- argument and msg->prompt as a printf-style argument rather than
- using it as the format string. Fixes bug #67622.
-
-2004-10-12 Not Zed <NotZed@Ximian.com>
-
- * e-config.c (ech_check, ech_config_factory, emph_construct_menu):
- setup a "check" handler, page-check/validation callback.
-
- * e-popup.c (e_popup_new): new method to create a targetless popup
- menu.
-
-2004-10-08 JP Rosevear <jpr@novell.com>
-
- * e-plugin.c (ep_load): fix typo
-
-2004-10-08 Not Zed <NotZed@Ximian.com>
-
- * e-plugin.c (ep_load): handle wrong root element properly. From
- David Trowbridge <David.Trowbridge@Colorado.edu>
-
-2004-10-07 Not Zed <NotZed@Ximian.com>
-
- * e-plugin.h: Fix the function pointer types!
-
- * e-plugin.c (epl_invoke): noop if we're disabled, and do some
- lifecycle stuff now, call e_plugin_lib_enable on the module if it
- exists.
-
-2004-10-07 Not Zed <NotZed@Ximian.com>
-
- * e-config.c (ec_rebuild): show the toplevel notebook if we
- had to create one, always.
-
- * e-menu.c (e_menu_add_items): initialise node->menu properly.
-
- * e-plugin.c (ep_load): read/initialise a unique id for all
- plugins and track them in a hashtable.
- (ep_construct): refactor so we have more control over what
- happens. if the hook handling class isn't registered yet, just
- note it and keep going.
- (e_plugin_hook_new): remove this, its handled internally by above.
-
-2004-10-06 Not Zed <NotZed@Ximian.com>
-
- * e-popup.c (e_popup_create_menu): only take one mask parameter,
- and implement EPopupItem->enable to do what the other mask did.
- (ep_activate): if this is a toggle or radiobutton, set the active
- state on the item->type.
- (e_popup_create_menu): if a menu image starts with gtk-, then
- assume it is a gtk stock image instead.
-
-2004-08-27 Not Zed <NotZed@Ximian.com>
-
- * e-passwords.c (e_passwords_ask_password): return cancelled if
- we're in an offline state.
-
-2004-08-26 Rodrigo Moya <rodrigo@novell.com>
-
- * eggtrayicon.[ch]: updated from libegg.
-
-2004-08-20 Frederic Crozat <fcrozat@mandrakesoft.com>
-
- * e-dialog-utils.c: (e_notice):
- * e-passwords.c: (ep_ask_password):
- Don't call gtk_dialog_set_has_separator on Gtk Message Dialog
- with GTK+ >= 2.4.0.
-
-2004-08-13 Rodrigo Moya <rodrigo@novell.com>
-
- * e-categories-config.c: include gtkdialog.h rather than gnome-dialog.h.
-
-2004-08-12 Carlos Garnacho Parro <carlosg@gnome.org>
-
- * e-dialog-utils.c: Optionally use GtkFileChooser if compiled
- against Gtk+ >= 2.4.0
-
-2004-08-10 Not Zed <NotZed@Ximian.com>
-
- ** See bug #61840, and others.
-
- * e-passwords.c: Lots of changes. The api is now fully
- multi-thread safe, all calls are serialised internally, even
- recursive main-loop calls. Small api changes to the
- ask_password call to add some new features required by the mailer
- and to clean up some of the names.
- (e_passwords_cancel): new procedure to cancel any outstanding
- password requests, for when we need to go uninteractive.
-
-2004-08-09 Rodney Dawes <dobey@novell.com>
-
- * e-icon-factory.c (icon_foreach_remove): We must return TRUE here
- so that things actually get removed from the list
-
-2004-08-05 Rodrigo Moya <rodrigo@novell.com>
-
- * e-icon-factory.c (e_icon_factory_init): connect to "changed"
- signal on the GnomeIconTheme object.
- (icon_theme_changed_cb): g_hash_table_foreach_remove all items in the
- hash table.
- (icon_foreach_remove): callback for removing hash table items.
-
-2004-08-05 Rodrigo Moya <rodrigo@novell.com>
-
- Fixes #62030
-
- * e-icon-factory.c (load_icon): get the icon_key as a new argument
- and use that in the call to icon_new().
- (e_icon_factory_get_icon): pass icon_key to load_icon().
- (e_icon_factory_get_icon_list): ditto.
-
-2004-08-01 JP Rosevear <jpr@novell.com>
-
- * e-pilot-util.c (e_pilot_get_sync_source): find the source with
- the pilot-sync property
- (e_pilot_set_sync_source): give the source the pilot-sync property
- and make sure its the only one
-
- * e-pilot-util.h: add prototypes
-
- * Makefile.am (eutilincludedir): don't build pilot settings
-
-2004-07-20 Not Zed <NotZed@Ximian.com>
-
- * e-dialog-utils.c: include config.h. See #61395.
-
-2004-07-12 Dan Winship <danw@novell.com>
-
- * e-mktemp.c (e_mktemp, e_mkdtemp): un-const the return values,
- since they need to be freed
- (d): turn off debugging
- (expire_dir_rec): remove debug printfs
-
-2004-08-24 JP Rosevear <jpr@novell.com>
-
- * Makefile.am: define EVOLUTION_PLUGINDIR
-
- * e-plugin.c (e_plugin_get_type): add both a global and user
- specifc eplug path as defaults
- (e_plugin_load_plugins): just skip a directory if it can't be
- opened
-
-2004-09-10 Not Zed <NotZed@Ximian.com>
-
- * e-popup.c (emph_construct_menu): duh, setup the hook pointer.
-
- * e-menu.c (e_menu_add_items): pass pixmaps and ui files to this
- function now.
- (e_menu_add_pixmap): removed, covered by above.
- (e_menu_add_ui): removed, covered by above.
- (emph_construct_menu): setup the hook pointer properly.
-
- * e-menu.h: moved the pixmap and ui file structures to be public,
- removed hte hook equivalents.
-
-2004-09-09 Not Zed <NotZed@Ximian.com>
-
- * e-event.c (e_event_remove_items): implement a remove function.
- (e_event_add_items): return a handle to pass to above.
- (emph_event_handle): noop if we're disabled.
-
- * e-popup.c (emph_popup_factory): noop if the
- plugin is disabled.
-
- * e-plugin.c (ep_init): setup an enabled bit for the plugin.
- Preliminary work on being able to manage plugins.
- (e_plugin_hook_enable): set hook enable state.
- (e_plugin_enable): set plugin enable state.
-
-2004-09-07 Not Zed <NotZed@Ximian.com>
-
- * e-config.c (ec_rebuild): pass the right old widget to the page
- factory.
- (ec_widget_destroy): unref the config and the target when done.
- (e_config_create_widget): force the notebook to page 0, workaround
- some other bug i don't understand.
- (e_config_create_window): set dialog hint on druid.
-
-2004-09-06 Not Zed <NotZed@Ximian.com>
-
- * e-account.c (e_account_import): emit a changed event on the dest.
- (e_account_set_from_xml): emit a changed event if we were.
-
- * e-config.c (ec_rebuild): add a table item for some type-safety.
- remove/alter the asserts so the code attemps to fail gracefully
- rather than just fail.
-
-2004-09-01 Not Zed <NotZed@Ximian.com>
-
- * e-menu.[ch]:
- * e-popup.[ch]:
- * e-config.[ch]:
- * e-event.[ch]: API syncrhonisation. Item callbacks now get the
- root object, the item, and user-supplied data. Removed
- now-redundant data and structures. Documentation updates.
-
-2004-08-30 Not Zed <NotZed@Ximian.com>
-
- * e-popup.c (emph_construct_item): just build a popupitem
- directly, use user_data to pass the activate method name.
-
- * e-popup.h: removed epopuphookitem.
-
- * e-popup.c (emph_construct_item): dont set hook on hookitem
- anymore, dont need to set user_data either.
-
- * e-popup.h: no longer pass parent pointer in EPopupHookItem, its
- handled by add_items's data now.
-
- * e-popup.c (ep_finalise): re-arrange and call freefunc with the
- new args.
- (e_popup_create_menu): change the activate data so we can pass the
- new api arguments.
- (ep_activate): changes for api changes.
- (emph_popup_factory): no longer takes target arg, taken from the
- popup, pass the popuphook to the add_items call.
- (emph_popup_activate): changed for new argument types.
-
- * e-popup.h: removed popup from epopupitem.
-
- * e-popup.c (e_popup_add_static_items): make private/rename to
- ep_add_static_items.
- (ep_add_static_items): dont pass target, it is set on the epopup
- structure.
- (e_popup_add_items): change the freefunc to be an EPopupItemsFunc
- and add a user-data field, and track the parent epopup.
-
- * e-popup.h: change the activatefunc to pass the target and data
- supplied to add_items.
-
-2004-08-25 Not Zed <NotZed@Ximian.com>
-
- * e-config.c (e_config_new): removed, this shouldn't be here for
- an abstract class.
- (*): Added doco.
-
-2004-08-24 Not Zed <NotZed@Ximian.com>
-
- * e-config.c (emph_construct_item): translate the label text.
-
- * e-popup.c (emph_construct_item): translate the label text.
-
- * e-plugin.c (e_plugin_xml_prop_domain): helper to get a property
- translated.
- (ep_construct): translate the name and description based on the
- new domain tag. get the description as tag content not property.
- (e_plugin_xml_content_domain): similar for xml node content.
-
-2004-08-24 Not Zed <NotZed@Ximian.com>
-
- * e-account.c (init): setup some defaults for the account.
-
- * e-config.c (e_config_create_widget): remove target arg actually.
- (ec_rebuild): add druid page start/end pages. fixes.
- (ec_druid_finish, ec_druid_cancel): handle finishing the druid.
-
-2004-08-23 Not Zed <NotZed@Ximian.com>
-
- * e-config.c (ec_druid_prepare, ec_druid_prev, ec_druid_next):
- handle druid navigation.
-
-2004-08-20 Not Zed <NotZed@Ximian.com>
-
- * e-config.c (e_config_target_changed): add 'how' changed arg.
- (e_config_create_widget): dont take target anymore, set that
- separately.
- (e_config_set_target): new virtual method to set the target.
- (ec_set_target): implementation.
-
-2004-08-19 Not Zed <NotZed@Ximian.com>
-
- * e-account.c (e_account_set_bool): only emit changed if it did.
-
-2004-08-17 Not Zed <NotZed@Ximian.com>
-
- * e-config.c (e_config_page_check): fix a past-o.
- (e_config_target_changed): treat the returned page for a druid
- page factory as a gnomedruidpagestandard, so get_page works, etc.
-
-2004-08-16 Not Zed <NotZed@Ximian.com>
-
- * e-event.[ch]: Added event hook and dispatch router.
-
-2004-08-13 Not Zed <NotZed@Ximian.com>
-
- * e-plugin.c (e_plugin_load_plugins): don't take a path, load all
- paths set.
- (e_plugin_add_load_path): add a load path to the search path.
- (e_plugin_get_type): setup the initial load path from environment
- or defaults.
- (e_plugin_xml_int): helper to get a prop in int format.
-
-2004-08-11 Not Zed <NotZed@Ximian.com>
-
- * e-config.c (e_config_target_changed): handle DRUID root type.
-
-2004-08-05 Not Zed <NotZed@Ximian.com>
-
- * e-account.c (class_init): add a changed signal.
- (e_account_set_string, e_account_set_int, e_account_set_bool):
- emit changed signal if it did.
-
- * e-config.c (e_config_add_page_check): add a page verification
- function. It will be called for the given page, or all pages, to
- verify the page contains valid data.
-
-2004-07-29 Not Zed <NotZed@Ximian.com>
-
- * e-account.c (e_account_get_string, e_account_get_int)
- (e_account_get_bool, e_account_set_string, e_account_set_int)
- (e_account_set_bool): implement. completely table driven.
-
-2004-07-02 Chris Toshok <toshok@ximian.com>
-
- [ fixes #60691 ]
-
- * e-iterator.h: rename the "delete" member to
- "remove", to fix c++ build.
-
- * e-iterator.c (e_iterator_delete): same.
- (e_iterator_class_init): same.
-
- * e-list-iterator.c (e_list_iterator_class_init): same.
- (e_list_iterator_remove): same.
-
-2004-06-03 Dan Winship <danw@novell.com>
-
- * e-icon-factory.c (load_icon): If the icon_name is an abolute
- path, just load it.
- (e_icon_factory_get_icon): Update the docs to reflect that
-
-2004-06-01 Not Zed <NotZed@Ximian.com>
-
- * e-fsutils.c (e_fsutils_avail): use statvfs if available. Should
- make it actually work, if not portable. This is for a bug but I
- can't recall the number.
-
-2004-05-27 Rodney Dawes <dobey@novell.com>
-
- * Makefile.am (dist-hook): Require e-error-tool
-
-2004-05-19 Jeffrey Stedfast <fejj@novell.com>
-
- * e-icon-factory.c: Lots of re-working action. We no longer load a
- pixbuf for each and every available size when requesting the icon
- for the first time, instead we simply load the requested icon of
- the requested size and cache only that.
- (e_icon_factory_get_icon): Always return a broken image icon if we
- fail to load the requested icon.
- (e_icon_factory_get_icon_list): Only bother with adding icons of
- the sizes that are suggested by ghe gtk documentation for
- gtk_window_set_icon_list rather than the sizes of the standard
- icons (since it isn't the same list of sizes).
- (load_icon): Fall back to EVOLUTION_ICONSDIR/WWxHH/icon_name if
- the icon-theme lookup fails. Also now takes a 'scale' argument
- which, if non-zero, allows us to look for images of the same name
- with a larger size in order to scale them back down to what we
- need.
-
-2004-05-19 Jeffrey Stedfast <fejj@novell.com>
-
- * e-gui-utils.c (e_icon_for_mime_type): We always have
- GnomeIconTheme nowadays, get rid of the old unused code.
- (e_create_image_widget): Use E_ICON_SIZE_DIALOG
-
-2004-05-17 Jeffrey Stedfast <fejj@novell.com>
-
- * e-icon-factory.h (E_ICON_SIZE_LIST/STATUS): New #define aliases
- for common icon usage cases where it may not be obvious that they
- are the same size as menu icons.
-
-2004-05-12 Jeffrey Stedfast <fejj@novell.com>
-
- * e-icon-factory.c (e_icon_factory_shutdown): New function to
- clean up the cached icons.
-
-2004-05-12 Not Zed <NotZed@Ximian.com>
-
- * e-error-tool.c: Tool to do i18n string extraction for error xml
- files.
-
-2004-05-10 Not Zed <NotZed@Ximian.com>
-
- * e-fsutils.c (e_fsutils_usage): new file/function, get disk usage
- of a path, in 1024 byte blocks.
- (e_fsutils_avail): new file/function, get disk space available for
- a given path, in 1024 byte blocks.
-
- * e-meta.[ch]: Removed. Poor idea badly executed, and no longer used.
-
- * e-path.h: add a fixme about deprecation.
-
-2004-04-30 Not Zed <NotZed@Ximian.com>
-
- * e-lang-utils.[ch]: Removed. This is covered by
- gnome_i18n_get_language_list, which is more complete.
-
-2004-04-30 Dan Winship <danw@ximian.com>
-
- * e-icon-factory.c (load_icon): Make this work for non-stock icons
- too.
-
-2004-04-22 Not Zed <NotZed@Ximian.com>
-
- * e-icon-factory.c (e_icon_factory_get_icon_list): make sure we
- unlock if we fail to find an icon.
-
-2004-04-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-icon-factory.c: Remove the warnings about using E_ICON_SIZE
- enums.
-
-2004-04-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-icon-factory.c (e_icon_factory_get_icon): Make
- thread-safe. Fixes a crash I encountered this morning.
- (e_icon_factory_get_icon_filename): Same.
- (e_icon_factory_get_icon_list): Here too.
-
-2004-04-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-icon-factory.h: Add an enum for icon sizes (temporarily has
- absolute pixel sizes assigned to it until I commit
- e-icon-factory.c changes - but only after all other code has been
- updated to use the enums).
-
-2004-04-16 Michael Terry <mike@mterry.name>
-
- * Makefile.am: Add e-icon-factory.[ch]
- * e-gui-utils.c: Use the icon theme via EIconFactory
- * e-icon-factory.[ch]: Move EIconFactory to e-util, and add icon theme
- support to the object so evolution uses them
-
-2004-04-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-signature-list.c (gconf_signatures_changed): Don't add an
- autogen signature if the new signature is the autogen signature.
-
-2004-04-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-host-utils.c (e_gethostbyname_r): Implemented a similar
- workaround to the one I did for a gethostbyaddr_r() glibc bug
- here. Glibc will apparently return success for addresses such as
- "192..168.1.1" (note the double dot) and yet not have filled in
- the hostent properly.
-
-2004-04-12 Jeffrey Stedfast <fejj@ximian.com>
-
- Really fixes bug #56623
-
- * e-signature-list.c (gconf_signatures_changed): If we've had to
- "fix" any signatures by adding a uid, set the resave state on the
- list (only cared about if this is at initial load time).
- (e_signature_list_construct): If we've set any uids in
- signatures_changed(), then save the signature list back out.
-
-2004-04-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-account.c (xml_set_identity): If we fail to set a sig_uid then
- try to extract the old style signature id and assume the migration
- code will fix us up (if not, nothing bad will happen anyway).
-
- * e-signature-list.c (gconf_signatures_changed): If the autogen
- signature isn't in the list (or isn't the first in the list), add
- it to the head of the list.
-
-2004-04-07 Jeffrey Stedfast <fejj@ximian.com>
-
- Probably fixes bug #56623 and others?
-
- * e-signature-list.c (gconf_signatures_changed): Fixed to not use
- free'd iter memory. Also reverse the new_sigs list before adding
- them to the signature list (so they are in the same order they
- appeared in the gconf key).
-
-2004-04-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-signature-list.c (gconf_signatures_changed): Fixed to not
- ignore signatures without uids (e.g. signatures that were from
- prior versions).
-
-2004-04-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-signature.c (e_signature_to_xml): Always set a format prop so
- that 1.4 and older 1.5 versions won't strcmp() on a NULL value.
-
-2004-04-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-account.c: Reference signatures by their UID rather than by an
- integer id. Also removed the need to have 2 signature settings (no
- need for the "auto" signature boolean anymore).
-
-2004-03-31 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-signature.[c,h]: New class similar to EAccount but for
- signatures.
-
- * e-signature-list.[c,h]: New class similar to EAccountList only
- for signatures.
-
-2004-03-31 Not Zed <NotZed@Ximian.com>
-
- * e-account-list.h: similar to below.
-
- * e-account.h: define struct _EAccount* so you can properly forward
- declare it.
-
-2004-03-18 Not Zed <NotZed@Ximian.com>
-
- * e-account.c: Added options for transport_url and source_url
- permissions.
-
-2004-03-18 Not Zed <NotZed@Ximian.com>
-
- * e-account.c (e_account_writable, e_account_writable_option):
- added interface to find out if various fields or server options
- are writable. to work around gconf limitations.
-
-2004-03-04 William Jon McCann <mccann@jhu.edu>
-
- * e-dialog-utils.c (e_notice, e_notice_with_xid, save_ok):
- * e-request.c (e_request_string):
- * e-passwords.c (e_passwords_ask_password):
- Remove separator from dialogs per HIG.
-
-2004-03-04 Not Zed <NotZed@Ximian.com>
-
- * e-sexp.c: Added some debug stuff.
-
-2004-02-27 Not Zed <NotZed@Ximian.com>
-
- ** See Bug #37329.
-
- * e-mktemp.c (get_dir): setup a comjpile time option for storing
- in the homedir, and also just use the uid as the key for a /tmp
- dir option.
- (e_mktemp_cleanup): removed entirely.
- (e_mkstemp, e_mkdtemp, e_mktemp): dont save the file/dirname in a
- list anymore.
- (expire_dir_rec): expire old temp data from previous runs/old data
- lying around. Based on access time.
- (get_dir): run an expirey every now and then.
-
-2004-02-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-gui-utils.c (e_icon_for_mime_type): Protect against feeding
- gdk_pixbuf_new_from_file() a NULL path. Clears up some console
- warning spewage.
-
-2004-02-19 Not Zed <NotZed@Ximian.com>
-
- * e-pilot-util.c: include string.h, fixes 64 bit crash. From
- David Mosberger.
-
-2004-02-03 Chris Toshok <toshok@ximian.com>
-
- * e-html-utils.c (e_text_to_html_full): add callto:, h323:, and
- webcal: schemes.
-
-2004-01-26 JP Rosevear <jpr@ximian.com>
-
- * e-folder-map.c (e_folder_map_dir): use g_file_test instead of
- stat and pass the type e_folder_map_dir when recursing
-
-2004-01-24 JP Rosevear <jpr@ximian.com>
-
- * e-folder-map.c: turn off debugging
-
-2004-01-24 Chris Toshok <toshok@ximian.com>
-
- * e-folder-map.c (e_folder_map_dir): use GDir/g_build_filename,
- and g_file_test.
- (e_folder_map_local_folders): same.
-
-2004-01-23 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: build new sources
-
- * e-folder-map.[hc]: builds a list of 1.4 folder paths of a
- certain type
-
-2004-01-20 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: don't build dead files
-
- * e-xml-hash-utils.[hc]: kill, these were moved to e-d-s long ago
-
-2004-01-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-bconf-map.[c,h]: New source files for mapping bonobo-conf keys
- to gconf keys. Moved out of shell/e-config-upgrade.c
-
-2004-01-13 Not Zed <NotZed@Ximian.com>
-
- * e-msgport.c (em_cache*): A time-based thread-safe in-memory
- cache thing. Called em_cache 'cause there's an e_cache in gal.
-
-2004-01-05 Not Zed <NotZed@Ximian.com>
-
- * e-memory.c (e_mempool_destroy): Fix from Zan Lynx
- <zlynx@acm.org> to lock the memchunk before freeing the pool
- header.
-
-2003-12-06 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: Remove hard coded disable deprecated flags
-
-2003-11-23 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am (INCLUDES): remove gtk deprecated flag
-
-2003-11-18 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: remove db3 library, if you really want it, get it
- from e-d-s
-
-2003-11-14 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: don't build the e-source stuff anymore, its in
- e-d-s now
-
-2003-11-14 JP Rosevear <jpr@ximian.com>
-
- * test-source-list.c (on_idle_do_stuff): we only need the uid to
- remove and peek at stuff
-
- * e-source-list.h: update proto types
-
- * e-source-list.c (e_source_list_peek_source_by_uid): allow peek
- by uid only
- (e_source_list_remove_source_by_uid): allow removal by uid only
-
-2003-11-07 Dan Winship <danw@ximian.com>
-
- * ename/*: Removed. No longer used by evolution except via
- evolution-data-server.
-
- * Makefile.am (SUBDIRS): Remove ename
-
-2003-11-07 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: remove build sources from dist
-
-2003-11-07 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: make sure the marshal header and source are in the
- source list
-
-2003-10-31 Hans Petter Jansson <hpj@ximian.com>
-
- * e-source.c (e_source_get_uri): Don't compress trailing slashes in
- URI elements.
-
-2003-10-31 Not Zed <NotZed@Ximian.com>
-
- * e-account.c (e_account_(sg)et_from_xml): add encrypt_key id, and
- change some of the names around to be more meaningful.
-
-2003-10-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-host-utils.c (e_gethostbyname_r): If the system defines
- AI_ADDRCONFIG, set this flag on the hints.ai_flags member as well
- so that we don't resolve a host to an IPv6 addr when the node
- doesn't have any IPv6 source addresses.
-
-2003-10-24 Dan Winship <danw@ximian.com>
-
- * Makefile.am (libedb3util_la_LIBADD): add $(DB3_LDADD)
-
-2003-10-22 Dan Winship <danw@ximian.com>
-
- * e-bonobo-factory-util.[ch]: Gone; unused since 1.2
-
- * e-proxy.[ch]: Gone; nothing in evo uses soup any more.
-
- * Makefile.am (eutilinclude_HEADERS, libeutil_la_SOURCES): Remove
- e-proxy.[ch]
-
-2003-10-20 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (pilot_compile) [! ENABLE_PILOT_CONDUITS]: Add
- md5-utils.c so it compiles even if you have no Pilot support.
-
-2003-10-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-source-list.c (e_source_list_sync): use gconf_client_notify_remove
- instead of g_source_remove for GConf notification IDs.
- (impl_finalize): remove the GConf notification also here.
-
-2003-10-13 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-source-group.[ch] (e_source_group_peek_source_by_name): added
- new function.
-
-2003-10-10 Not Zed <NotZed@Ximian.com>
-
- * e-account-list.c (e_account_list_find): add FIND_UID find type.
-
-2003-09-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-host-utils.c (e_gethostbyaddr_r): IPv6 implementation
- rewritten to use getnameinfo() which is the proper function to use
- in this case. Fixes bug #46006 the Right Way (tm).
-
-2003-09-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-host-utils.c (e_gethostbyaddr_r): Make sure that
- res->ai_canonname is non-NULL and that it doesn't match the
- numeric host address that we were trying to resolve. Fixes the
- second half of bug #46006.
-
-2003-09-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-host-utils.c (e_gethostbyaddr_r): Work around a bug in glibc
- 2.3.2's gethostbyaddr_r() implementation.
-
-2003-09-15 Larry Ewing <lewing@ximian.com>
-
- * e-source.c (e_source_dump_to_xml_node): make sure declarations
- precede the body.
-
-2003-09-11 Dan Winship <danw@ximian.com>
-
- * Makefile.am (noinst_LTLIBRARIES): Remove libeutil-static.la and
- libeconduit-static.la
-
- * ename/Makefile.am (noinst_LTLIBRARIES): Remove
- libename-static.la
-
-2003-08-28 Hans Petter Jansson <hpj@ximian.com>
-
- * eggtrayicon.[ch]: Added for tray icon support. To be removed when
- libgnomeui sports this functionality.
-
- * Makefile.am: Include eggtrayicon.
-
-2003-08-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-mktemp.c (e_mktemp_cleanup): We need to unlink the full paths
- in the tmpdirs, not just the base path.
-
-2003-08-20 Suresh Chandrasekharan <suresh.chandrasekharan@sun.com>
-
- * e-time-utils.c (parse_with_strptime): Fixes #43558 Appointment
- Editor always gives time validation error for apptmnts in non
- UTF-8/non ASCII locales.
-
-2003-08-17 Ettore Perazzoli <ettore@ximian.com>
-
- * test-source-list.c: No short letter for --key.
-
-2003-08-15 Ettore Perazzoli <ettore@ximian.com>
-
- * e-uid.c: #include <glib/gstrfuncs.h>
-
- * test-source-list.c: Add options to display, set and unset the
- color as well.
-
- * e-source.c: New members has_color, color in struct
- ESourcePrivate.
- (e_source_update_from_xml_node): Parse a color property from the
- XML node. Protect from NULL name and relative_uri members as
- well.
- (e_source_dump_to_xml_node): Set a color property on the XML node.
- (e_source_get_color): New.
- (e_source_set_color): New.
- (e_source_unset_color): New.
- (e_source_new_from_xml_node): Use e_source_update_from_xml_node()
- instead of getting the data from the XML yourself.
-
-2003-08-14 Ettore Perazzoli <ettore@ximian.com>
-
- Add UIDs to ESource* items so we can distinguish renames from
- removals/additions.
-
- * test-source-list.c: Made --source and --group get UIDs instead
- of names.
- (on_idle_do_stuff): Updated behavior accordingly.
- (dump_list): Print "(No items)" if there are no groups.
- (dump_group): Print the UID of the group.
- (dump_source): Print the UID of the source.
-
- * e-source-list.c (load_from_gconf): Match with group UIDs instead
- of group names.
- (e_source_list_peek_source_by_uid): New.
- (e_source_list_peek_source_by_name): Removed.
- (e_source_list_peek_group_by_uid): New.
- (e_source_list_peek_group_by_name): Removed.
- (e_source_list_remove_group_by_uid): New.
- (e_source_list_remove_group_by_name): Removed.
- (e_source_list_remove_source_by_uid): New.
- (e_source_list_remove_source_by_name): Removed.
-
- * e-source-group.c: New member uid in struct ESourceGroupPrivate.
- (impl_finalize): Free it.
- (e_source_group_new): Set the uid member using e_uid_new().
- (e_source_group_peek_source_by_uid): New.
- (e_source_group_peek_source_by_name): Removed.
- (e_source_group_add_source): Check that the UID is unique, instead
- of the name.
- (e_source_group_remove_source_by_uid): New.
- (e_source_group_remove_source_by_name): Removed.
- (e_source_group_update_from_xmldoc): Use the UID to figure out
- which source has changed, instead of the name.
- (e_source_group_uid_from_xmldoc): New.
- (e_source_group_name_from_xmldoc): Removed.
- (e_source_group_new_from_xmldoc): Set the UID in the new group
- from the XML.
- (e_source_group_to_xml): Set a UID property in the XML.
-
- * e-source.c: New member uid in struct ESourcePrivate.
- (e_source_new): Initialize using e_uid_new().
- (impl_finalize): Free.
- (e_source_peek_uid): New.
- (e_source_new_from_xml_node): Set the UID from the XML node.
- (e_source_name_from_xml_node): Removed.
- (e_source_uid_from_xml_node): New.
- (e_source_dump_to_xml_node): Set the "uid" property on the XML
- node.
-
- * e-account.c (e_account_gen_uid): Removed.
- (e_account_new): Use e_uid_new() instead of e_account_gen_uid().
-
- * e-uid.c (e_uid_new): New file, new function.
-
-2003-08-13 Ettore Perazzoli <ettore@ximian.com>
-
- Fix up the semantics of "changed" signals on GConf changes.
-
- * e-source-group.c (e_source_group_update_from_xmldoc): Added new
- member ignore_source_changed in struct _ESourceGroupPrivate.
- (e_source_group_update_from_xmldoc): Increment
- ignore_source_changed before calling
- e_source_update_from_xml_node(), decrement afterwards.
- (source_changed_callback): Only emit "changed" if
- ignore_source_changed is zero.
- (e_source_group_update_from_xmldoc): Properly emit the "changed"
- signal when the base_uri or the name change.
-
- * e-source-list.c: Changed type of sync_idle_id from gboolean (!)
- to int and added new member ignore_group_changed in struct
- _ESourceListPrivate.
- (load_from_gconf): Increment ignore_group_changed before calling
- e_source_group_update_from_xmldoc() and decrement it afterwards.
- (group_changed_callback): Only emit the signal if
- ignore_group_changed is zero.
-
- * e-source.c (e_source_update_from_xml_node): Removed arg
- emit_signals. Always emit signals.
-
- * e-source-group.c (e_source_group_update_from_xmldoc): Removed
- arg emit_signals. Always emit signals.
- (e_source_group_update_from_xml): Likewise.
-
-2003-08-11 Ettore Perazzoli <ettore@ximian.com>
-
- * e-source.c (e_source_set_group): Weak_unref the current group if
- not NULL and properly handle the case where a NULL group is being
- passed in.
-
-2003-08-11 Ettore Perazzoli <ettore@ximian.com>
-
- * e-source-group.c: New file.
- * e-source-group.h: New file.
- * e-source-list.h: New file.
- * e-source-list.c: New file.
- * e-source.c: New file.
- * e-source.h: New file.
- * test-source-list.c: New file to test the above.
-
-2003-08-11 Not Zed <NotZed@Ximian.com>
-
- * e-msgport.c (e_thread_put): check pthread_create return code
- properly.
- (e_mutex_lock): check pthread* return codes properly.
- (e_mutex_unlock): Same here.
- (e_mutex_cond_wait): and here.
-
-2003-08-05 Dan Winship <danw@ximian.com>
-
- * e-html-utils.c (special_chars): add a flag for non-url chars
- (controls, whitespace, ", and |)
- (url_extract): Use that. When urlifying just a hostname, make sure
- it really is a hostname, and not just something like "www.c".
- (e_text_to_html_full): Deal with url_extract returning NULL in the
- "www." case
- (main): add a regression test, #ifdef E_HTML_UTILS_TEST
-
-2003-07-24 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-config-listener.c (add_key): just preload one level of GConf keys,
- since preloading all makes the calendar startup slow.
-
-2003-07-23 Dan Winship <danw@ximian.com>
-
- * Makefile.am: Use EVO_MARSHAL_RULE
-
- * e-component-listener.c (connection_listen_cb): Fix a non-ANSI
- switch label.
-
- * e-gui-utils.c: only include "art/empty.xpm" if
- HAVE_LIBGNOMEUI_GNOME_ICON_LOOKUP_H isn't defined
-
- * e-xml-hash-utils.c (e_xml_to_hash): Deconstify a non-const
- variable to fix a warning.
-
-2003-07-03 JP Rosevear <jpr@ximian.com>
-
- * e-xml-hash-utils.c (foreach_save_func): encode the text
- (e_xml_from_hash): pass xmlDoc to foreach method
- (e_xmlhash_new): check for file existence
- (e_xmlhash_destroy): only destroy the hash if it exists
-
-2003-07-01 Dan Winship <danw@ximian.com>
-
- * e-gui-utils.c (e_icon_for_mime_type): New function to return an
- icon for a MIME type, using GnomeIconTheme if available or
- gnome-vfs and gnome-mime-data if not.
-
-2003-06-19 Dan Winship <danw@ximian.com>
-
- * e-xml-hash-utils.c (e_xml_to_hash): don't leak an extra copy of
- the values
-
-2003-06-14 Larry Ewing <lewing@ximian.com>
-
- * e-name-western.c (e_name_western_get_suffix_at_str_end): free
- word before breaking out of the loop.
-
-2003-06-12 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-config-listener.c (add_key): use GCONF_CLIENT_PRELOAD_RECURSIVE
- when adding watched directories to avoid GConfd round-trips.
-
-2003-06-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-trie.c (e_trie_free): Free the fail_states array.
-
-2003-05-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-meta.c (meta_load): Stat the file to make sure it exists
- before trying to parse it using xmlParseFile().
-
diff --git a/e-util/ChangeLog.pre-1-4 b/e-util/ChangeLog.pre-1-4
deleted file mode 100644
index 3cbac0eade..0000000000
--- a/e-util/ChangeLog.pre-1-4
+++ /dev/null
@@ -1,2649 +0,0 @@
-2003-05-29 JP Rosevear <jpr@ximian.com>
-
- Fixes #43775
-
- * e-time-utils.c (locale_supports_12_hour_format): use e_utf8_strftime
- (e_time_format_date_and_time): ditto
- (e_time_format_time): ditto
-
-2003-05-16 Dan Winship <danw@ximian.com>
-
- * e-proxy.c (e_proxy_init): Removing trailing / in key name passed
- to gconf_client_notify_add to kill a warning. (Part of #43159)
-
-2003-05-16 Jeremy Katz <katzj@redhat.com>
-
- * e-sexp.c (term_eval_and): Use glib macros for pointer/int
- conversion.
-
-2003-05-07 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes crash in #42212
-
- * e-url.c (e_uri_new): check for 'uri_string' being NULL.
-
-2003-05-02 Not Zed <NotZed@Ximian.com>
-
- * e-request.c (e_request_string): remove the assert, if we dont
- understand the response, assume it's a cancel.
- GTK_RESPONSE_DELETE_EVENT wasn't handled [#42038].
-
-2003-04-30 Ettore Perazzoli <ettore@ximian.com>
-
- * e-request.c (e_request_string): Handle GTK_RESPONSE_NONE.
- [#42038]
-
-2003-04-24 Chris Toshok <toshok@ximian.com>
-
- [ for bug #41211 ]
-
- * e-gui-utils.h (e_button_new_with_stock_icon): add prototype.
-
- * e-gui-utils.c (e_button_new_with_stock_icon): new function,
- allow us to create a custom labeled button with a stock icon.
-
-2003-04-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-host-utils.c: Added #include <netinet/in.h> for the
- sockaddr_in6 typedef for at least MacOS X.
-
-2003-04-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-host-utils.c (e_gethostbyname_r): Keep our buf ptr aligned to
- sizeof (char *). Should fix bug #41362.
- (e_gethostbyaddr_r): Same.
-
-2003-04-18 Anna Marie Dirks <anna@ximian.com>
-
- * e-request.c (e_request_string): Added appropriate spacing/padding
- to the rename dialogs. Fixes bugs #41040, #41036, #41038
-
-2003-04-18 Ettore Perazzoli <ettore@ximian.com>
-
- * e-gtk-utils.c (e_gtk_button_new_with_icon): Remove debugging
- message.
-
-2003-04-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-sexp.c: Finished an #if 0'd out port to GObject from an #if
- 0'd out GtkObject subclassing.
-
-2003-04-15 Hans Petter Jansson <hpj@ximian.com>
-
- * e-sexp.c (e_sexp_add_function)
- (e_sexp_add_ifunction): Make sure any old symbol with the same name
- as the one being added, is removed first.
-
-2003-04-14 Not Zed <NotZed@Ximian.com>
-
- * e-gtk-utils.c (e_gtk_button_new_with_icon): Utility function to
- create a button with a stock icon.
-
-2003-04-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-host-utils.c (e_gethostbyaddr_r): Change the 'len' argument to
- 'addrlen' so that when IPv6 is enabled, our temp vriable (also
- named len) does not cause confusion. Fixes bug #40979.
-
-2003-04-05 Ettore Perazzoli <ettore@ximian.com>
-
- * e-passwords.c (e_passwords_remember_password): Removed debugging
- message that would spit out the actual password, albeit in encoded
- form.
-
-2003-04-04 Dan Winship <danw@ximian.com>
-
- * e-account-list.c (gconf_accounts_changed): Don't start emitting
- ACCOUNT_ADDED signals until we've added all of the new accounts to
- our list. Otherwise if the signal handler calls
- e_account_list_get_default_account() it will end up causing the
- first account in the list to become the default. #40675
-
-2003-04-04 Chris Toshok <toshok@ximian.com>
-
- * ename/e-name-western.c (e_name_western_extract_middle): fix abr.
- (e_name_western_get_suffix_at_str_end): same.
-
-2003-04-02 Not Zed <NotZed@Ximian.com>
-
- * e-passwords.c (e_passwords_forget_passwords): Delete all
- Passwords-* sections. Should make this work.
-
-2003-03-31 Chris Toshok <toshok@ximian.com>
-
- * ename/test-ename-western.c (do_name): print "" if the value is
- NULL.
- (main): add a couple of utf8 test cases (that still use western
- orderings).
-
- * ename/e-name-western.c (e_name_western_str_count_words):
- utf8-ize this.
- (e_name_western_cleanup_string): same.
- (e_name_western_get_words_at_idx): same.
- (e_name_western_get_one_prefix_at_str): same.
- (e_name_western_get_prefix_at_str): same.
- (e_name_western_extract_first): same.
- (e_name_western_extract_middle): same.
- (e_name_western_extract_nickname): same.
- (e_name_western_extract_last): same.
- (e_name_western_get_preceding_word): same.
- (e_name_western_get_suffix_at_str_end): same.
- (e_name_western_detect_backwards): same.
- (e_name_western_reorder_asshole): same.
- (FINISH_CHECK_MIDDLE_NAME_FOR_CONJUNCTION): same.
- (e_name_western_fixup): same.
- (e_name_western_parse): validate the string and truncate it if
- need be.
-
-2003-03-27 JP Rosevear <jpr@ximian.com>
-
- * e-account-list.c (e_account_list_find): guard against NULL keys
-
-2003-03-25 Dan Winship <danw@ximian.com>
-
- * e-dialog-utils.c (e_notice): Move this here from gal. Use
- e_dialog_set_transient_for so it DTRT for out-of-proc components.
- (e_notice_with_xid): Like e_notice but with an X Window ID as the
- parent window
- (e_gnome_dialog_set_parent): Remove this, since it was marked
- deprecated and only used in one place.
- (e_file_dialog_save): Make this use GtkMessageDialog instead of
- GnomeDialog
- (e_dialog_set_transient_for_xid): #ifdef out gtk 2.2 api usage
-
-2003-03-25 Not Zed <NotZed@Ximian.com>
-
- * e-meta.c (meta_filename): fix a typo & some missing headers.
-
-2003-03-24 Dan Winship <danw@ximian.com>
-
- * e-dialog-utils.c (e_dialog_set_transient_for,
- e_dialog_set_transient_for_xid): Rename, rewrite, make them
- actually work.
-
-2003-03-25 Not Zed <NotZed@Ximian.com>
-
- * Makefile.am: Added e-meta.[ch] to libeutil
-
- * e-meta.[ch]: simple api to implement meta-data for keyed
- objects.
-
-2003-03-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-trie.c (e_trie_search): If the gunichar is 0xfffe, just skip
- processing it. Maybe this will fix bug #39900.
- (trie_utf8_getc): Removed unused labels to shutup the compiler.
-
-2003-03-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-sexp.h: Fix ESExpClass to never be an empty struct. Also make
- ESExp optionally a subclass of GObject rather than GtkObject (not
- that we'll probably ever make it so, but for completeness sake?).
-
-2003-03-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-trie.c (trie_utf8_getc): Don't use __inline__ as it is not
- always defined.
-
-2003-03-13 Dan Winship <danw@ximian.com>
-
- * ename/e-address-western.c (e_address_western_parse): When
- declaring a line to be part of "extended" because we don't know
- what else to call it, keep the preceding "\n" so that the address
- still looks the same when we reassemble the pieces later. Fixes
- handling of non-US addresses
-
-2003-03-12 Dan Winship <danw@ximian.com>
-
- * e-xml-hash-utils.c (e_xml_to_hash): Update for a libxml2 change
- that was making this code g_warn a lot
-
-2003-03-06 Ettore Perazzoli <ettore@ximian.com>
-
- * e-request.c (e_request_string): Make the entry activate the
- default response in the dialog.
-
-2003-03-03 Rodney Dawes <dobey@ximian.com>
-
- * e-proxy.c: Use gnome2 proxy settings
-
-2003-03-02 Rodney Dawes <dobey@ximian.com>
-
- * e-pilot-util.c: s/gnome-xml/libxml/
-
-2003-02-27 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: include gnome-pilot cflags
-
-2003-02-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-account-list.c (gconf_accounts_changed): 'uid' should not be
- const.
-
-2003-02-20 Not Zed <NotZed@Ximian.com>
-
- * e-account-list.c (e_account_list_get_default): helper to get the
- dfault account.
- (e_account_list_set_default): helper to set the default account.
- (e_account_list_find): Helper to find accounts based on differnet
- key types.
- (e_account_list_add): helper to add account + emit added event.
- (e_account_list_change): helper to emit changed event.
- (e_account_list_remove): herlper to remove account + emit changed event.
-
-2003-02-22 Hans Petter Jansson <hpj@ximian.com>
-
- * e-categories-config.c (e_categories_config_open_dialog_for_entry):
- A result of 0 no longer indicates success; GTK_RESPONSE_OK does.
-
-2003-02-17 Chris Toshok <toshok@ximian.com>
-
- * e-account-list.c (gconf_accounts_changed): fix memleak - free
- uid.
-
-2003-02-11 Not Zed <NotZed@Ximian.com>
-
- * e-trie.c (trie_utf8_getc): Instead of simply ignoring bad chars,
- return the sentinal invalid char 0xfffe, so that we properly track
- the start of sequences.
-
-2003-02-10 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (libeutil_static_la_DEPENDENCIES): Make
- libeutil-static.la depend on libeutil.la so that parallel
- compilations work; building them at the same time confuses
- libtool.
- (e-util-marshal.h, e-util-marshal.c): Use different tmp files so
- these rules can happen in parallel.
-
-2003-02-05 Dan Winship <danw@ximian.com>
-
- * Makefile.am (eutilincludedir, etc): define in terms of
- privincludedir.
-
- * ename/Makefile.am (libenameincludedir): Likewise
-
- * e-account.c: Fix warnings
- * e-account-list.c: Likewise
- * e-config-listener.c: Likewise
- * e-gui-utils.c: Likewise.
- * e-lang-utils.c: Likewise
- * e-msgport.c: Likewise
- * e-passwords.c: Likewise
-
- * e-categories-config.c
- (e_categories_config_open_dialog_for_entry): Use g_object_get/_set
- rather than gtk_
-
- * e-url.c (e_uri_new): Use g_ascii_strdown instead of deprecated
- g_strdown.
-
-2003-01-27 Ettore Perazzoli <ettore@ximian.com>
-
- * e-request.c (e_request_string): Port to GtkDialog. Strdup the
- text returned by GtkEntry after destroying the dialog, not before.
- Use gtk_editable_select_region() instead of
- gtk_entry_select_region(). Add a little bit of padding to make it
- look less crampy and set a default width.
-
- * e-dialog-utils.h (e_gnome_dialog_set_parent): Declare only if
- GNOME_DISABLE_DEPRECATED is not #defined.
- (e_gnome_warning_dialog_parented): Likewise.
- (e_gnome_ok_cancel_dialog_parented): Likewise.
-
-2003-01-26 Chris Toshok <toshok@ximian.com>
-
- * e-pilot-settings.c (e_pilot_settings_new): ref/sink the pilot
- settings to clear up that gtk warning.
-
-2003-01-25 Chris Toshok <toshok@ximian.com>
-
- * e-pilot-map.c (e_pilot_map_read): g_file_exists -> g_file_test.
- (e_pilot_map_write): don't use doc->root.
-
-2003-01-25 Chris Toshok <toshok@ximian.com>
-
- * e-pilot-settings.[ch]: GObjectify this.
-
-2003-01-24 Hans Petter Jansson <hpj@ximian.com>
-
- * e-categories-config.c (initialize_categories_config): Enable
- getting the categories master list from wombat.
- (e_categories_config_open_dialog_for_entry): It's now a GtkDialog.
-
-2003-01-22 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (eutilincludedir): Version using $(BASE_VERSION).
- (econdincludedir): Likewise.
- (edb3includedir): Likewise.
- (imagesdir): Likewise.
-
- * ename/Makefile.am: Install libename in $(privlibdir) and
- $(includedir)/evolution-$(BASE_VERSION)/ename.
-
-2003-01-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-account-list.c: Changed signal names to use - instead of _
- like the rest of Gtk2.
-
- * e-account.c (e_account_import): New function that is basically
- the old account_copy().
-
-2003-01-17 Dan Winship <danw@ximian.com>
-
- * e-xml-hash-utils.c: New, sort of from evolution-recurid-branch.
-
-2003-01-16 Dan Winship <danw@ximian.com>
-
- * e-account.c: New class, based on MailConfigAccount, for
- describing an evolution (mail) account.
-
- * e-account-list.c: New class for tracking the list of configured
- accounts. (Also uses some code from mail-config.)
-
- * e-list.c (e_list_construct, e_list_remove): New
-
-2003-01-14 Ettore Perazzoli <ettore@ximian.com>
-
- * e-dialog-utils.c: Do not #include <e-bonobo-widget.h>.
- (e_set_dialog_parent): Remove the BonoboWidget handling stuff (it
- doesn't really work anyways).
-
-2003-01-14 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (eutilinclude_HEADERS): Add e-dialog-utils.h.
-
-2003-01-09 Chris Toshok <toshok@ximian.com>
-
- * e-gui-utils.c (e_create_image_widget): change this to use
- GtkImage instead of GnomeCanvas.
-
-2003-01-08 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am: Images are now in $(datadir)/evolution/images
- instead of $(datadir)/images/evolution.
-
-2003-01-07 Dan Winship <danw@ximian.com>
-
- * e-config-listener.c (e_config_listener_remove_value): New.
-
- * e-passwords.c (e_passwords_get_password): Don't look at the
- passwords hash until calling e_passwords_init().
-
-2003-01-06 Dan Winship <danw@ximian.com>
-
- * e-html-utils.c: Add this back: Connector needs it, and there's
- no reason for addressbook and calendar to be using camel to get
- this functionality.
-
- * Makefile.am (libeutil_la_SOURCES): re-add e-html-utils
-
-2003-01-02 Jeffrey Stedfast <fejj@ximian.com>
-
- A bunch of fixes to make e-util build with -DG_DISABLE_DEPRECATED
- and -DGTK_DISABLE_DEPRECATED.
-
-2003-01-02 Ettore Perazzoli <ettore@ximian.com>
-
- * e-gtk-utils.c (e_signal_connect_full_while_alive): Get to
- compile.
- (e_signal_connect_while_alive): Like.
-
-2002-12-19 Ettore Perazzoli <ettore@ximian.com>
-
- * e-gtk-utils.c (e_signal_connect_while_alive): New.
- (e_signal_connect_full_while_alive): Renamed from
- e_gtk_signal_connect_full_while_alive().
-
-2002-12-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-html-utils.[c,h]: Removed. Back to the fiery depths of hell
- from whence ye came!
-
-2002-12-10 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-config-listener.[ch] (e_config_listener_remove_dir): new
- function.
-
-2002-12-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-trie.c: New implementation of an Aho-Corasick trie.
-
-2002-12-09 Chris Toshok <toshok@ximian.com>
-
- * e-passwords.h: track changes to api (e_passwords_init is gone,
- and several functions take the component name as an arg.)
-
- * e-passwords.c (e_passwords_init): make this static, and allow
- multiple calls. Also, it no longer takes the component name.
- (e_passwords_shutdown): make this deal with the case where
- e_passwords_init wasn't called (no hashtable), and it no longer
- needs to free component_name.
- (e_passwords_forget_passwords): call e_passwords_init.
- (e_passwords_clear_component_passwords): take component_name as an
- arg, and call e_passwords_init.
- (password_path): take component_name as an arg.
- (e_passwords_remember_password): same, and call e_passwords_init.
- (e_passwords_forget_password): same.
- (e_passwords_get_password): same.
- (e_passwords_add_password): call e_passwords_init.
- (e_passwords_ask_password): take component_name as an arg.
-
-2002-12-07 Not Zed <NotZed@Ximian.com>
-
- * e-msgport.c (e_mutex_cond_wait): Allow an e-mutex to be used
- with standard condition variables.
-
-2002-12-06 Chris Toshok <toshok@ximian.com>
-
- * e-categories-master-list-wombat.c (ecmlw_load): change to a more
- gconf-like path (with underscores, etc.)
- (ecmlw_save): same.
-
-2002-11-26 Dan Winship <danw@ximian.com>
-
- * e-lang-utils.c (e_get_language_list): If the language is
- something like "fr_FR", return both "fr_FR" and "fr" in the list.
- Oaf doesn't consider "fr_FR" to match a "-fr" translation.
-
-2002-11-22 Not Zed <NotZed@Ximian.com>
-
- * e-msgport.c (EMsgPort): Added an optional nspr pipe field.
- (e_msgport_new): Init nspr pipe to null.
- (e_msgport_destroy): close prfiledesc's if they're open.
- (e_msgport_prfd): get the prfiledesc to wait asynchronously on.
- (e_msgport_put): Write notify to nspr pipe if it exists.
- (e_msgport_wait): poll nspr pipe fd if it is set, and the pipe fd
- isn't.
- (e_msgport_get): skim off a notify byte on the pr pipe if set.
- (): Include config.h, and nspr stuff if HAVE_NSS is set.
-
-2002-11-13 Ettore Perazzoli <ettore@ximian.com>
-
- * e-config-listener.c (e_config_listener_get_string_with_default):
- Make sure we don't use a string value from a GConfValue that got
- freed.
-
-2002-11-12 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am
- (eutilinclude_HEADERS): add e-password.h
- (libeutil_la_SOURCES): add e-password.c
-
- * e-passwords.[ch]: port this to gnome2's gnome-config-private.
-
-2002-11-11 Ettore Perazzoli <ettore@ximian.com>
-
- * e-config-listener.c (add_key): g_strdup() the value in the case
- of a string value.
-
-2002-11-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * Makefile.am: Re-add e-proxy.c to the build.
-
-2002-11-08 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am (eutilinclude_HEADERS): add e-categories-config.h
- and e-categories-master-list-wombat.h
- (libeutil_la_SOURCES): add e-categories-master-list-wombat.c
-
- * e-categories-master-list-wombat.[ch]: port work.
-
-2002-11-07 JP Rosevear <jpr@ximian.com>
-
- * e-categories-config.c (e_categories_config_get_icon_for): pass
- extra pixbuf param
-
- * e-categories-config.h: use G_*_DECLS
-
- * e-dialog-utils.c (save_ok): update g_file_test params
-
- * Makefile.am: Compile some additional files
-
-2002-11-06 Chris Toshok <toshok@ximian.com>
-
- * e-config-listener.c (e_config_listener_set_boolean): init err to
- NULL so if there isn't an error we aren't left with an unitialized
- GError. Fixes crash.
- (e_config_listener_set_float): same.
- (e_config_listener_set_long): same.
- (e_config_listener_set_string): same.
-
-2002-11-05 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-component-listener.[ch]: ported to GObject.
-
- * Makefile.am: re-enabled e-component-listener.[ch]
-
-2002-11-03 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-config-listener.[ch] (e_config_listener_get_boolean,
- e_config_listener_get_float, e_config_listener_get_long,
- e_config_listener_get_string): new simpler functions, without
- a default value.
-
-2002-11-03 Ettore Perazzoli <ettore@ximian.com>
-
- * e-config-listener.c (e_config_listener_get_float_with_default):
- Removed unused variable.
- (e_config_listener_get_long_with_default): Likewise.
- (e_config_listener_get_string_with_default): Likewise.
-
- * Makefile.am: Compile e-config-listener.[ch].
-
-2002-11-02 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am: add marshal building stuff, add e-util-marshal.c to
- SOURCES, and add e-util-marshal.list to EXTRA_DIST.
-
- * e-util-marshal.list: add marshallers for e-util.
-
- * e-list.c: convert to GObject.
-
- * e-list.h: convert to GObject.
-
- * e-iterator.c: convert to GObject.
-
- * e-iterator.h: convert to GObject.
-
- * e-list-iterator.c: convert to GObject.
-
- * e-list-iterator.h: convert to GObject.
-
- * .cvsignore: ignore e-util-marshal.[ch]
-
-2002-11-02 Ettore Perazzoli <ettore@ximian.com>
-
- * ename/Makefile.am (INCLUDES): Removed -I$(includedir).
-
- * ename/test-ename-western-gtk.c: #include
- <libgnomeui/gnome-ui-init.h> instead of <libgnomeui/gnome-init.h>.
- (create_window): Added GTK_SIGNAL_FUNC() cast.
- (main): Use gnome_program_init().
-
- * e-db3-utils.c: Do not #include <libgnome/gnome-defs.h>.
-
- * e-request.c: Do not #include <libgnomeui/gnome-stock.h>.
-
- * e-memory.c (e_memchunk_clean): Replace GSearchFunc with
- GCompareFunc.
-
- * e-iterator.c (e_iterator_class_init): GTK2-ified.
- (ECI_CLASS): Likewise.
-
- * e-html-utils.c: Do not #include <gal/unicode/gunicode.h>.
-
- * e-gui-utils.c: Don't #include <libgnome/gnome-defs.h>.
- (e_create_image_widget): Pass NULL to gdk_pixbuf_new_from_file()
- for the error arg.
-
- * e-corba-utils.h: #include <orbit/orbit.h> instead of
- <orb/orbit.h>.
-
- * Makefile.am: Removed bonobo-factory-util.c,
- bonobo-factory-util.h, e-categories-master-list-wombat.h,
- e-categories-master-list-wombat.c, e-dialog-utils.c,
- e-dialog-utils.h, e-proxy.c e-proxy.h for now.
-
-2002-11-02 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-config-listener.[ch]: ported to GConf and GObject.
-
-2002-11-01 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-config-listener.[ch]:
- * e-component-listener.[ch]: compilation fixes for GNOME 2 porting.
-
-2002-10-24 Rodrigo Moya <rodrigo@ximian.com>
-
- Fixes #32764
-
- * e-config-listener.c (add_key): store the value returned by
- bonobo_event_source_client_add_listener, so that we can remove it
- later, when freeing the key structure.
- (free_key_hash): remove listener.
- (e_config_listener_set_boolean):
- (e_config_listener_set_float):
- (e_config_listener_set_long):
- (e_config_listener_set_string): only set the cache values if there's
- no exception.
- (e_config_listener_destroy): remove all keys before unrefing the db
- component.
-
-2002-10-23 Dan Winship <danw@ximian.com>
-
- * ename/e-name-western.c: Cast chars to unsigned char before
- passing to ctype macros since they are not defined on negative
- numbers. Fixes parsing problems with names with accented
- characters on Solaris. (At least part of #32146)
-
-2002-09-25 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-component-listener.c (ping_component_callback): added a comment
- about the fix for #30918.
-
-2002-09-23 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-component-listener.c (ping_component_callback): gtk_object_ref the
- component listener before emitting the "component_died" signal, since
- in most cases, the component listener will be destroyed in the
- callbacks for that signal.
-
-2002-09-22 Dan Winship <danw@ximian.com>
-
- * e-config-listener.c: Fix some non-ANSI switch statements
-
- * e-path.c: #include <sys/types.h> for OS X
-
-2002-09-11 Chris Toshok <toshok@ximian.com>
-
- [ Fixes #27546 ]
- * ename/e-name-western-tables.h
- (e_name_western_complex_last_table): add "di" to
- e_name_western_complex_last_table.
-
-2002-09-05 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-config-listener.c (e_config_listener_set_boolean,
- e_config_listener_set_float, e_config_listener_set_long,
- e_config_listener_set_string): update the local copy (if we've
- got one) so that we don't return values if asked before getting
- the change notification.
-
-2002-09-04 Dan Winship <danw@ximian.com>
-
- * e-time-utils.c (e_mktime_utc): New. Like mktime(3), but assumes
- the input time is UTC.
- (e_localtime_with_offset): New. Like localtime_r(3), but also
- returns an offset from UTC.
-
-2002-08-29 Dan Winship <danw@ximian.com>
-
- * e-list.c (e_list_destroy): Don't call g_list_foreach with the
- free func if the free func is NULL.
-
-2002-08-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-html-utils.c (e_text_to_html_full): Convert file: urls
- too. Fixes bug #29557.
-
- * e-proxy.[c,h] (e_proxy_init): New convenience function to
- initialise the proxy settings for soup to use.
-
-2002-08-27 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-config-listener.c[ch] (e_config_listener_get_float_with_default,
- e_config_listener_set_boolean, e_config_listener_set_float): new
- functions.
- (property_change_cb, add_key): added support for FLOAT values.
- (e_config_listener_set_string): free strings before returning.
-
-2002-08-26 Peter Williams <peterw@ximian.com>
-
- * e-dialog-utils.c (set_transient_for_gdk): If gdk_window_foreign_new
- returned NULL, we're probably screwed, but try to avoid a segfault.
- (Preemptive fix suggested by kmaraas).
-
-2002-08-26 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-config-listener.c (e_config_listener_get_string_with_default):
- call g_strdup in the correct place, or we'll return the internal copy.
-
-2002-08-26 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-config-listener.c (e_config_listener_set_long): only set the key
- if the value is different from what we've already read from the
- database, to avoid extra change notifications.
- (e_config_listener_set_string): likewise.
-
-2002-08-22 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-config-listener.[ch]: added "key_changed" signal to class.
- (property_change_cb): emit "key_changed" signal.
- (e_config_listener_set_long): new function.
- (e_config_listener_get_long_with_default): new function.
-
-2002-08-22 Dan Winship <danw@ximian.com>
-
- * e-path.c (e_path_rmdir): Remove an e_path directory, and its
- parent "subfolders" dir if it's now empty.
-
-2002-08-22 JP Rosevear <jpr@ximian.com>
-
- * e-time-utils.c (e_time_parse_date): if the year was two digits,
- add the current century
-
- Fixes # 17252
-
-2002-08-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-config-listener.[ch]: new class for config database access and
- monitoring.
-
- * Makefile.am: added new files.
-
-2002-08-14 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-component-listener.[ch]: new class for controlling a component,
- to detect when it dies.
-
-2002-08-01 Dan Winship <danw@ximian.com>
-
- * e-html-utils.c (is_citation): Remove the logic that assumes
- "Rupert> " is a citation, since it misfires more often than it
- hits.
-
-2002-07-31 Dan Winship <danw@ximian.com>
-
- * e-html-utils.c (is_addr_char, is_trailing_garbage): Don't use
- "isprint(c)" to mean "c >= 32 && c < 128" since it doesn't in most
- locales.
- (is_domain_name_char): new macro for dns-valid characters
- (email_address_extract): Use is_domain_name_char rather than
- is_addr_char for the part after the @.
-
-2002-07-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-host-utils.c (e_gethostbyname_r): If the user has enabled IPv6
- support, use getaddrinfo to resolve hostnames and then manually
- fit the result into a struct hostent.
- (e_gethostbyaddr_r): Same.
-
-2002-07-25 Not Zed <NotZed@Ximian.com>
-
- * e-msgport.c (e_dlist_length): Return the actual count, rather
- than always 0!
-
-2002-07-03 Peter Williams <peterw@ximian.com>
-
- * Makefile.am: Install libeutil, libeconduit, and libedb3util and
- their headers.
-
-2002-07-15 Not Zed <NotZed@Ximian.com>
-
- * e-sexp.c (term_eval_caststring): Cast to a string type.
- (term_eval_castint): Cast to an int type.
- (symbols[]): Add to symbol table.
-
-2002-07-09 Dan Winship <danw@ximian.com>
-
- * e-categories-config.c: #include <string.h>
-
-2002-07-02 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-categories-config.c (e_categories_config_get_icon_for): changed to
- return a gboolean (TRUE if the icon is found, FALSE if not).
-
-2002-06-07 Not Zed <NotZed@Ximian.com>
-
- * e-dialog-utils.c (e_gnome_warning_dialog_parented):
- (e_gnome_ok_cancel_dialog_parented): Use connect_while_alive, so
- we're not called after we've quit. See bug #15397.
-
-2002-06-03 Not Zed <NotZed@Ximian.com>
-
- * e-msgport.c (e_msgport_wait): Protect against EINTR (irix?), see
- bug #24086.
-
-2002-05-07 Ettore Perazzoli <ettore@ximian.com>
-
- * e-corba-utils.c (e_safe_corba_string_dup): New.
-
-2002-05-06 Not Zed <NotZed@Ximian.com>
-
- * e-msgport.c (e_thread_destroy): Destroy our mutex too.
- (e_thread_new): Add thread to a new list of all threads.
- (e_thread_destroy): Remove thread from list of all threads.
- (e_thread_busy): New function, returh true if we're busy somewhere
- processing work.
-
-2002-04-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-passwords.c (e_passwords_get_password): Don't leak the base64
- encoded password buffer.
-
-2002-04-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-host-utils.c (e_gethostbyaddr_r): New wrapper around
- gethostbyaddr_r if the system has it, else a whole new
- implementation.
-
-2002-04-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-sexp.c (parse_value): Handle parsing negative integers.
-
-2002-03-29 JP Rosevear <jpr@ximian.com>
-
- * e-dialog-utils.c (e_file_dialog_save): open a file selection
- dialog with the given title and return the selected file name
- (save_ok): if the ok button is clicked, make sure the file doesn't
- already exist and if it does, see if the user wants to over write
- it
-
- * e-dialog-utils.h: new proto
-
-2002-03-22 Ettore Perazzoli <ettore@ximian.com>
-
- * e-lang-utils.c: New.
- * e-lang-utils.h: New.
-
-2002-03-22 Dan Winship <danw@ximian.com>
-
- * e-request.c (e_request_string): Document the fact that this
- takes two locale charset strings and one UTF8 string and returns a
- UTF8 string. (Huh.)
-
-2002-03-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-mktemp.c: #include <string.h> for strcmp.
-
-2002-02-22 Dan Winship <danw@ximian.com>
-
- * e-html-utils.c (e_text_to_html_full): Fix for if the buffer ends
- with an email address (and no newline).
-
-2002-02-09 JP Rosevear <jpr@ximian.com>
-
- * e-pilot-settings.h: add row and column defines
-
-2002-01-27 Ettore Perazzoli <ettore@ximian.com>
-
- * ename/Makefile.am: Use E_NAME_CFLAGS and E_NAME_LIBS.
-
- * Makefile.am: Use E_UTIL_CFLAGS and E_UTIL_LIBS.
-
-2002-01-14 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: compile new files
-
- * e-pilot-settings.[hc]: beginnings of a general conduit
- configuration gui
-
-2002-01-10 Christopher James Lahey <clahey@ximian.com>
-
- * ename/e-name-western.c (e_name_western_word_is_suffix): Allow
- for a period after suffixes. Fixes Ximian bug #17012.
-
-2002-01-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-memory.c (e_memchunk_clean): Prune free'd nodes from our free
- list otherwise we'll end up re-using free'd memory blocks and
- that's not a Good Thing (tm).
-
-2002-01-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * md5-utils.h: Reverted.
-
-2002-01-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * md5-utils.h: Move the struct into md5-utils.c - this is a
- kludgey hack around the fact that NSS also defines
- MD5Context. Besides, this should be a private struct anyway.
-
-2002-01-02 JP Rosevear <jpr@ximian.com>
-
- * e-dialog-utils.c (e_gnome_dialog_set_parent): util function
- moved from mail-callbacks, also destroys the dialog if the parent
- is destroyed
- (e_gnome_warning_dialog_parented): similarly
- (e_gnome_ok_cancel_dialog_parented): ditto
-
- * e-dialog-utils.h: new protos
-
-2001-12-17 JP Rosevear <jpr@ximian.com>
-
- * e-pilot-map.c (e_pilot_map_clear): clear all info from the map
-
- * e-pilot-map.h: add proto
-
-2001-12-10 JP Rosevear <jpr@ximian.com>
-
- * e-pilot-util.c (e_pilot_utf8_to_pchar): use UTF-8 instead of
- UTF8 as the source char set
- (e_pilot_utf8_from_pchar): use UTF-8 instead of UTF8 as the
- destination char set
-
-2001-11-20 Dan Winship <danw@ximian.com>
-
- * e-passwords.c (e_passwords_forget_password): Clear the password
- in bonobo-conf as well. Fixes ximian 14893.
-
-2001-11-13 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (libeutil_la_LIBADD): Remove `-lc'. It makes the
- mailer do strange things when it calls `fork()', thus breaking
- e.g. mail sending through sendmail.
-
-2001-11-13 JP Rosevear <jpr@ximian.com>
-
- * e-pilot-map.c (real_e_pilot_map_insert): only insert non-0 pids
- into the pid map
- (e_pilot_map_insert): remove and free old keys/values here -
- including possibly orphaned keys
- (e_pilot_map_remove_by_uid): only free things if they should have
- been found
-
-2001-11-13 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am (libeutil_la_LIBADD): Explicitly add -lc
-
-2001-10-30 Damon Chaplin <damon@ximian.com>
-
- * e-time-utils.c (e_time_parse_date): added a 2nd format, with the
- weekday and the date. We need this so we can try to parse DATE values
- in the ECalendarTable.
-
-2001-10-29 Ettore Perazzoli <ettore@ximian.com>
-
- * e-dialog-utils.c (e_set_dialog_parent): Remove a g_warning.
-
-2001-10-29 Christopher James Lahey <clahey@ximian.com>
-
- * ename/e-name-western.c (e_name_western_fixup): Added French
- conjunction.
-
- * e-host-utils.c: Don't define gethost_mutex unless we need it.
-
-2001-10-29 Christopher James Lahey <clahey@ximian.com>
-
- * ename/e-name-western.c: Cleaned this up a bit.
-
-2001-10-29 Christopher James Lahey <clahey@ximian.com>
-
- * ename/e-name-western.c (e_name_western_fixup): Check for
- compound first names here (X & Y). Fixes Ximian bug #13859.
-
-2001-10-28 JP Rosevear <jpr@ximian.com>
-
- * e-pilot-map.c (e_pilot_map_remove_by_pid): make sure to free the
- keys as well
- (e_pilot_map_remove_by_uid): ditto
-
-2001-10-27 JP Rosevear <jpr@ximian.com>
-
- * e-pilot-map.h: update proto
-
- * e-pilot-map.c (e_pilot_map_lookup_pid): touch the nodes if
- indicated and found
- (e_pilot_map_lookup_uid): ditto
-
-2001-10-26 JP Rosevear <jpr@ximian.com>
-
- * e-pilot-map.c (real_e_pilot_map_insert): take an extra param on
- whether to mark touched
- (map_sax_start_element): use above
- (e_pilot_map_insert): ditto
- (e_pilot_map_write): pass in extra info to foreach call
- (map_write_foreach): if we are in touched only mode, write out the
- map only if its been touched
-
- * e-pilot-map.h: add new member
-
-2001-10-26 JP Rosevear <jpr@ximian.com>
-
- * e-pilot-map.c (map_sax_start_element): add archived records
- with pilot id of 0
- (map_write_foreach): use the uid map for writing
- (e_pilot_map_write): write using the uid map
-
-2001-10-26 JP Rosevear <jpr@ximian.com>
-
- * e-pilot-map.c (e_pilot_map_insert): free up old memory first
- (e_pilot_map_destroy): free allocated memory when destroying
-
-2001-10-22 JP Rosevear <jpr@ximian.com>
-
- * e-pilot-map.c (map_set_node_timet): plug leak
-
-2001-10-23 Dan Winship <danw@ximian.com>
-
- * e-html-utils.c (e_text_to_html_full): Change " " to "&nbsp;" at
- start of line.
-
-2001-10-22 Dan Winship <danw@ximian.com>
-
- * e-passwords.c (e_passwords_get_password): Pass a
- CORBA_Environment to bonobo_config_get_string so it doesn't g_warn
- on error. (Since the "error" is most likely just that the password
- isn't cached.)
- (e_passwords_remember_password, e_passwords_get_password,
- e_passwords_add_password): Change "if (foo) { entire function; }"
- to "if (!foo) return;"
-
- * e-html-utils.c (special_chars): Don't allow single quote or
- backtick in email addresses, or pipes following URLs.
-
-2001-10-22 JP Rosevear <jpr@ximian.com>
-
- * e-dbhash.c (e_dbhash_foreach_key): null out DBT memory prior to
- usage (from Edd Dumbill <edd@usefulinc.com>)
-
-2001-10-17 Ettore Perazzoli <ettore@ximian.com>
-
- * e-dialog-utils.c (e_set_dialog_parent_from_xid): New.
-
-2001-10-12 Chris Toshok <toshok@ximian.com>
-
- * e-passwords.h: new parameter to e_passwords_init, and add
- prototype for e_passwords_clear_component_passwords.
-
- * e-passwords.c (e_passwords_init): copy off the component name.
- (e_passwords_shutdown): free/NULL the component name.
- (e_passwords_clear_component_passwords): new function. remove the
- subtree rooted at /Passwords/<ComponentName>.
- (e_passwords_remember_password): use component_name when building
- up the path.
- (e_passwords_get_password): same.
- (e_passwords_add_password): remove/free the currently stored
- session password for this key if there is one, before adding the
- new one.
-
-2001-10-11 Chris Toshok <toshok@ximian.com>
-
- * e-passwords.h: change prototype for e_passwords_get_password.
-
- * e-passwords.c (e_passwords_get_password): remove 'const' from
- return type - the return type is now allocated and must be freed
- by the caller.
-
-2001-10-11 Chris Toshok <toshok@ximian.com>
-
- * e-passwords.c (e_passwords_init): open the bonobo config db for
- our passwords.
- (e_passwords_shutdown): sync and unref the bonobo db, and clear
- out the per session hash.
- (e_passwords_forget_passwords): remove the bonobo config db
- /Passwords path, and free up the session hash (but don't destroy
- it).
- (e_passwords_remember_password): remove the key/value from the
- session hash, after inserting it into the bonobo db.
- (e_passwords_get_password): look up a session password for the
- uri, and if it's not there, consult the bonobo db.
- (e_passwords_ask_password): quiet gcc's warnings, and only consult
- the toggle button state if we actaully created it.
-
-2001-10-09 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-url.c (e_uri_to_string): don't add the host if it's null
-
-2001-10-06 Christopher James Lahey <clahey@ximian.com>
-
- * ename/e-address-western.c (e_address_western_parse): Made this
- refuse to parse more than 2047 characters of address.
-
-2001-10-04 Dan Winship <danw@ximian.com>
-
- * e-passwords.c (e_passwords_add_password): Make this dup the
- strings it's passed.
- (*) Add lots of docs.
-
-2001-10-03 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-url.c (e_uri_new): default protocol to file: if not specified
-
-2001-10-02 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-url.c (e_uri_copy): duplicate also the params member
-
-2001-10-02 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-url.[ch] (e_uri_copy, e_uri_to_string): new functions
-
-2001-10-01 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-url.[ch]: added basic URI management functions
-
- * Makefile.am: added BONOBO flags to make it compile with latest
- Bonobo, which installs headers in a version-based directory
-
-2001-10-01 Dan Winship <danw@ximian.com>
-
- * e-passwords.c (e_passwords_ask_password): New, copied/renamed
- from mailer and gnome-libs.
-
-2001-09-30 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am (libeutil_la_SOURCES): add e-passwords.[ch]
-
-2001-09-30 Chris Toshok <toshok@ximian.com>
-
- * e-passwords.c: copy/rename the mail specific password stuff
- here.
-
- * e-passwords.h: same.
-
-2001-09-28 <NotZed@Ximian.com>
-
- * e-msgport.c (e_msgport_put): Write the pipe notification outside
- the lock. This way if the pipe fills up because of too many
- outstanding request, the queue isn't deadlocked. This only
- happens wiht 4096 outstanding messages, so something is getting
- VERY busy! Fixes #11121.
-
-2001-09-24 Christopher James Lahey <clahey@ximian.com>
-
- * e-categories-master-list-wombat.c (ecmlw_load, ecmlw_save): Make
- the printouts here conditionally compiled out.
-
-2001-09-21 <NotZed@Ximian.com>
-
- * e-msgport.c (e_thread_destroy): Instead of using
- pthread_cancel() which seems to have numerous implementation
- issues, send a special quit message to the subordinate thread.
- (thread_dispatch): When it gets a quit message, well, quit!
-
-2001-09-18 Ettore Perazzoli <ettore@ximian.com>
-
- * e-gtk-utils.c (widget_realize_callback_for_backing_store): Use
- ->bin_window [instead of ->window] if the widget is a GtkLayout.
-
-2001-09-17 Damon Chaplin <damon@ximian.com>
-
- * e-time-utils.c (e_time_parse_date): only use 1 format, so we are
- consistent everywhere. If we support multiple formats we have to
- support that in e_time_parse_date_and_time() which means an explosion
- of different formats. I don't think the alternatives are that useful,
- anyway.
- (e_time_parse_date_and_time): parse everything in one go, to avoid
- i18n problems. Also only use '%p' if the locale has am/pm strings.
- (e_time_parse_time): Only use '%p' if locale has am/pm strings.
-
-2001-09-17 Ettore Perazzoli <ettore@ximian.com>
-
- * e-gtk-utils.c (gtk_radio_button_get_nth_selected): Removed.
- (gtk_radio_button_select_nth): Removed.
- (e_make_widget_backing_stored): New.
-
-2001-09-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-mktemp.c (e_mktemp_cleanup): Make sure the dir pointer is
- non-NULL before using it.
-
-2001-09-08 Dan Winship <danw@ximian.com>
-
- * e-html-utils.c (e_text_to_html_full): Fix some broken calls to
- check_size that could result in memory corruption displaying short
- replies.
-
-2001-09-06 Dan Winship <danw@ximian.com>
-
- * e-html-utils.c (e_text_to_html_full): Add E_TEXT_TO_HTML_CITE,
- to prepend "> " to each line.
-
-2001-09-05 Dan Winship <danw@ximian.com>
-
- * e-mktemp.c (get_path): Fix the check for the case when mkdir()
- returns EEXIST to check S_ISDIR on the right structure component.
- Fixes bug #8775.
-
-2001-08-31 Federico Mena Quintero <federico@ximian.com>
-
- * e-time-utils.c (e_time_parse_date_and_time): Added format for
- "7 PM" and equivalents. Fixes bug #7456.
- (e_time_parse_time): Likewise.
-
-2001-08-28 Not Zed <NotZed@Ximian.com>
-
- * e-categories-master-list-wombat.c (ecmlw_load): Dont call
- g_print with a NULL string. See bug #7396.
-
-2001-08-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-mktemp.c (get_path): Make more robust.
-
-2001-08-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * Makefile.am: Added e-mktemp.[c,h] to the build.
-
- * e-mktemp.c (e_mktemp): A new wrapper around mktemp so that we
- can keep track of temp files for later cleanup.
- (e_mkstemp): Same but obviously for the mkstemp call.
- (e_mkdtemp): And finally a mkdtemp wrapper.
-
-2001-08-24 Zbigniew Chyla <cyba@gnome.pl>
-
- * Makefile.am (libeutil_la_SOURCES): Added e-unicode-i18n.c and
- e-unicode-i18n.h.
-
- * e-unicode-i18n.[ch]: New files with two extra functions
- (e_utf8_gettext, e_utf8_dgettext) and U_() macro.
- Should be used instead of _() if we need UTF-8 string.
-
-2001-08-23 Zbigniew Chyla <cyba@gnome.pl>
-
- * e-request.c (e_request_string): Modified to accept and return
- UTF-8 string. It's currently used only in
- shell/e-shortcuts-view.c and we need UTF-8 there.
-
-2001-08-20 Damon Chaplin <damon@ximian.com>
-
- * e-time-utils.c (e_time_parse_date): added comments to help
- translators a bit.
-
-2001-08-09 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-categories-config.c (e_categories_config_get_icon_for): return
- when there's no icon associated with the category
-
- * e-categories-config.c: reworked to use the
- ECategoriesMasterListWombat class. Also, load correctly images
- (fixes #6794)
-
-2001-08-09 Federico Mena Quintero <federico@ximian.com>
-
- * e-categories-master-list-wombat.c (ecmlw_destroy): Chain to the
- destroy handler in the parent class!
-
- * e-list-iterator.c (e_list_iterator_destroy): Likewise. Sigh.
-
- * e-list.c (e_list_destroy): Likewise. Double sigh.
-
-2001-08-08 Ettore Perazzoli <ettore@ximian.com>
-
- * e-dialog-utils.h: New.
- * e-dialog-utils.c: New.
-
-2001-08-04 Ettore Perazzoli <ettore@ximian.com>
-
- * e-bonobo-factory-util.c
- (e_bonobo_generic_factory_multi_display_new): New function to
- create a factory that creates separate component instances for
- different displays.
-
-2001-08-03 Christopher James Lahey <clahey@ximian.com>
-
- * e-list-iterator.c (e_list_iterator_next): Made it so that
- e_list_iterator_next goes to the first element if it's set to
- NULL. This makes deleting the first element and then doing
- e_list_iterator_next go to the new first element. Did the analogy
- for e_list_iterator_prev for completeness and consistency's sakes.
- Fixes Ximian bug #6057.
-
-2001-08-01 Christopher James Lahey <clahey@ximian.com>
-
- * e-categories-master-list-wombat.c (ecmlw_load): Fixed the load
- statement here by just using array_from_string.
- (ecmlw_save): Removed the part where we save the icons and colors
- since that's handled in the array_to_string function. Fixes
- Ximian bug #4451.
-
-2001-07-27 JP Rosevear <jpr@ximian.com>
-
- * e-dbhash.c (string_to_dbt): memset everything to 0
- (md5_to_dbt): ditto
-
-2001-07-20 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-categories-config.c (initialize_categories_config): use the 2
- new category icons (16_category_suppliers.png and
- 16_category_time-and-expenses.png)
-
-2001-07-19 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-categories-config.c (initialize_categories_config): use the 2
- new category icons
-
- * Makefile.am: s/imagedir/imagesdir
-
-2001-07-17 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-categories-config.c (initialize_categories_config): generate
- default configuration for icons-per-category the first time. And
- use a global (for this file) Bonobo_ConfigDatabase
-
-2001-07-16 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-categories-config.c (e_categories_config_get_icon_for):
- (e_categories_config_get_icon_file_for):
- (e_categories_config_set_icon_file_for): use GdkPixbuf to load images
-
-2001-07-16 Federico Mena Quintero <federico@ximian.com>
-
- * e-time-utils.c (parse_with_strptime): Generalized function for
- trying a number of strptime() formats on a string.
- (e_time_parse_time): Use parse_with_strptime().
- (e_time_parse_date): New function, analogous to the previous one,
- but uses a number of date formats.
-
-2001-07-12 Federico Mena Quintero <federico@ximian.com>
-
- * e-time-utils.c (e_time_parse_date_and_time): If the string is
- empty, clear the struct tm before returning.
-
-2001-07-12 Jon Trowbridge <trow@ximian.com>
-
- * e-html-utils.c: Added is_addr_char_no_pipes macro, which specifically
- does not consider '|' ("pipe") to be a legal address character.
- (email_address_extract): Use is_addr_char_no_pipes when looking for
- e-mail addresses to turn into HTML links. (Bug #3940)
-
-2001-07-05 Not Zed <NotZed@Ximian.com>
-
- * e-memory.c: Added some malloc check stuff.
-
-2001-07-04 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-categories-master-list-wombat.c (ecmlw_load): load all icons
- and colors for each category
-
- (ecmlw_save): save all icons and categories associated with
- each category
-
- * e-categories-config.c: use BonoboConf to store/retrieve settings,
- and use ECategoriesMasterListWombat when creating a ECategories
- dialog widget
-
-2001-07-02 Christopher James Lahey <clahey@ximian.com>
-
- * Makefile.am (libeutil_la_SOURCES): Added
- e-categories-master-list-wombat.c and
- e-categories-master-list-wombat.h.
- (INCLUDES): Added $(BONOBO_CONF_CFLAGS).
-
- * e-categories-master-list-wombat.c,
- e-categories-master-list-wombat.h: New class implementing a master
- list that stores its state using bonobo-conf.
-
-2001-07-02 Rodrigo Moya <rodrigo@ximian.com>
-
- * e-categories-config.[ch]: new file for a set of functions for
- managing category-related (icons, colors) configuration
-
-2001-07-01 Ettore Perazzoli <ettore@ximian.com>
-
- * e-request.c: New.
- * e-request.h: New.
-
-2001-06-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-sexp.c (term_eval_and): When ANDing two bools, don't use a
- bitwise AND.
-
-2001-06-18 Dan Winship <danw@ximian.com>
-
- * Makefile.am: Split e-db3-utils and e-dbhash off into libedb3util
- so eutil won't depend on db3.
-
-2001-06-15 Not Zed <NotZed@Ximian.com>
-
- * e-sexp.c (parse_values): REmove a silly hardcoded term limit,
- oops forgot about that.
-
-2001-06-11 Damon Chaplin <damon@ximian.com>
-
- * e-time-utils.c (e_time_parse_date_and_time): skip any non-digits
- while looking for dates and times. This should fix some translation
- problems. Though there is still a problem with Japanese, where the
- am/pm flag comes before the time so we will skip it incorrectly.
-
-2001-06-10 Damon Chaplin <damon@ximian.com>
-
- * e-time-utils.c (e_time_parse_date_and_time):
- (e_time_parse_time): got rid of '%n' at end of each format string
- for strptime. I don't know how I managed to put them in there.
-
-2001-05-31 Christopher James Lahey <clahey@ximian.com>
-
- * Makefile.am (INCLUDES): Added db3 cflags.
-
- * e-dbhash.c: Made this use db3.
-
- * e-db3-utils.c, e-db3-utils.h: New files with some helper
- functions.
-
-2001-05-27 Dan Winship <danw@ximian.com>
-
- * e-gui-utils.c: Remove e_pixmaps_update (moved to libeshell) so
- libeutil won't depend on bonobo.
-
-2001-05-19 Ettore Perazzoli <ettore@ximian.com>
-
- * e-host-utils.c (e_gethostbyname_r)
- [HAVE_GETHOSTBYNAME_R && GETHOSTBYNAME_R_FIVE_ARGS]: Set `*herr'
- to zero if the function returns a non-NULL pointer to the hostent.
- According to the docs, a returned non-NULL hostent always means
- "no error" no matter what the returned value of `herr' is. [And
- in fact, at least on libc 2.2.3, trying to resolve `localhost'
- sets herr to `HOST_NOT_FOUND' even if the name is resolved
- correctly and the returned hostent is non-NULL.]
-
-2001-05-16 Dan Winship <danw@ximian.com>
-
- * e-html-utils.c (e_text_to_html_full): add
- E_TEXT_TO_HTML_ESCAPE_8BIT to turn non-US-ASCII characters into
- "?"s.
-
-2001-05-14 Jon Trowbridge <trow@ximian.com>
-
- * e-html-utils.c (is_citation): Check for bad utf8.
-
-2001-05-08 Dan Winship <danw@ximian.com>
-
- * e-path.c (e_path_find_folders): Walk a hierarchy using the
- "/subfolders/" convention and call a callback for each folder
- found.
-
-2001-05-01 Dan Winship <danw@ximian.com>
-
- * e-msgport.c (e_mutex_assert_locked): Debugging routine. (Only
- works for recursive mutexes right now.)
-
- * e-html-utils.c (e_text_to_html_full): Don't use g_utf8_next_char
- on text that isn't valid UTF8, since it won't work (and might even
- get into an infinite loop).
-
-2001-04-29 Dan Winship <danw@ximian.com>
-
- * e-html-utils.c (email_address_extract): Make this smarter. Now
- e_text_to_html_full calls it when it sees a '@', and
- email_address_extract deals with scanning both forward and
- backward to find the bounds of the email address. It's still
- fooled by Message-IDs, but there's not a whole lot we can do
- there...
-
-2001-04-26 Dan Winship <danw@ximian.com>
-
- * e-host-utils.c (e_gethostbyname_r): Make the Solaris and
- no-gethostbyname_r implementations behave more like the Linux one.
- Document.
-
- * Makefile.am (INCLUDES): Remove UNICODE_CFLAGS
- (libeutil_la_LIBADD): Change UNICODE_LIBS to GAL_LIBS
-
-2001-04-26 Not Zed <NotZed@Ximian.com>
-
- * e-memory.c (e_poolv_get): Modified to match e_strv_get
- behaviour. Assert on bad cases, and return "" rather than NULL
- for empty/unset strings.
- (e_poolv_new): Simplify the mutex cases, only have a single mutex
- for mempool and hashtable references.
- (e_poolv_set): Simplify mutex code. Fixed a #ifdef orde prob in
- profile stuff. Always copy string to our own memory when we add
- it to the hash, even if we free it; I think this would have led to
- dangling references otherwise.
- (e_poolv_destroy): Renamed from poolv_free, for consistency with
- the rest of the allocators here.
- (e_poolv_set): Add optional refcounting code here, not currently
- enabled/used, but should make proper string collection work
- easily.
- (e_poolv_destroy): Unrefcount the strings here.
- (e_poolv_cpy): Add refcounting code here.
-
- * e-memory.[ch]: Applied Jacob's patches <jacob@ximian.com> for
- 'e-poolv' type, added his name to the authors list.
-
-2001-04-24 Dan Winship <danw@ximian.com>
-
- * e-html-utils.c (check_size): If the buffer is too small, making
- it twice as big does not guarantee it will be big enough. "Duh".
- Also, a bunch of the check_size calls don't seem to be taking
- trailing NULs into account, so add in a +1 here.
-
-2001-04-24 Kjartan Maraas <kmaraas@gnome.org>
-
- * e-gui-utils.c, e-memory, e-msgport.c, e-pilot-map, e-sexp.c:
- Added #include <glib.h> and move corresponding local headers
- to the top to catch missing includes in them. Tip from clahey.
-
-2001-04-24 Chris Toshok <toshok@ximian.com>
-
- * e-host-utils.h: remove prototype for e_gethostbyname_init.
-
- * e-host-utils.c (e_gethostbyname_r): don't dynamically allocate
- anything - store everything in the buffer that's passed in. Also,
- stop using EMutex. Switch to a static GMutex (so we can
- initialize it without having e_gethostbyname_init).
- (e_gethostbyname_init): removed.
-
-2001-04-23 Jon Trowbridge <trow@ximian.com>
-
- * e-html-utils.c (e_text_to_html_full): Removed attempts to use
- Radek's evil <DATA> hacks, which were just causing me
- (and GtkHTML) grief.
-
-2001-04-23 Jon Trowbridge <trow@ximian.com>
-
- * e-host-utils.c: Include glib.h, so that the g_warning in
- e_gethostbyname_r will be treated as a macro and not as an
- unresolved symbol.
-
-2001-04-22 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am (libeutil_la_SOURCES): add e-host-utils.[ch]
-
- * e-host-utils.c: new file, with e_gethostbyname_r.
-
- * e-host-utils.h: new file.
-
-2001-04-19 Dan Winship <danw@ximian.com>
-
- * e-html-utils.c (is_citation): ">From" is not a citation unless
- the previous or following line is a citation.
- (e_text_to_html_full): Update for is_citation change. Also, when
- marking citations, unmangle mbox From-mangling.
-
-2001-04-15 Federico Mena Quintero <federico@ximian.com>
-
- * e-sexp.c (e_sexp_parse): Start parsing the sexp with
- parse_value(), not parse_list(), because we may have immediate
- values (e.g. "#f") as the whole sexp.
-
-2001-04-08 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: Setup up the conduit library building better so the
- files get disted
-
-2001-04-06 Federico Mena Quintero <federico@ximian.com>
-
- * e-sexp.c (scanner_config): Added a question mark to the set of
- valid characters for symbol names.
- (parse_value): Fixed parsing of boolean values.
- (parse_term_free): Added missing clause for ESEXP_TERM_BOOL.
-
-2001-04-04 Kjartan Maraas <kmaraas@gnome.org>
-
- * ename/test-ename-western-gtk.c: Fix headers.
-
-2001-04-03 Federico Mena Quintero <federico@ximian.com>
-
- * e-sexp.h (ESExpResultType): Added ESEXP_RES_TIME for time
- values.
- (ESExpResult): Added a "time_t value.time" field.
- (ESExpTermType): Added ESEXP_TERM_TIME.
- (ESExpTerm): Added a "time_t value.time" field.
-
- * e-sexp.c (e_sexp_result_free): Deal with time values. Also, be
- more paranoid; added a default clause with g_assert_not_reached().
- (term_eval_lt): Deal with time values.
- (term_eval_gt): Likewise.
- (term_eval_eq): Likewise.
- (term_eval_plus): Likewise.
- (term_eval_sub): Likewise.
- (e_sexp_term_eval): Likewise.
- (eval_dump_result): Likewise.
- (parse_dump_term): Likewise.
- (parse_term_free): Likewise.
-
-2001-04-01 Gediminas Paulauskas <menesis@delfi.lt>
-
- * e-gui-utils.h: new type EPixmap, which is used to cache pixmaps for
- bonobo components. use e_pixmaps_update to load icons into ui
- component.
- * e-gui-utils.c: implementation of EPixmap cache, moved here from
- mail/folder-browser-factory.c.
-
-2001-03-31 Jon Trowbridge <trow@ximian.com>
-
- * e-url.c (e_url_shroud): Check that first_colon < last_at,
- to prevent horrible things from happening. Removed spew.
- (e_url_equal): Removed spew.
-
-2001-03-30 Jon Trowbridge <trow@ximian.com>
-
- * e-html-utils.c (e_text_to_html_full): Add support for converting
- e-mail addresses to links.
- (is_email_address): Added. Identifies e-mail addresses.
- (email_address_extract): Added. Extracts a copy of the e-mail
- address from the text.
-
- * e-html-utils.h (E_TEXT_TO_HTML_CONVERT_ADDRESSES): Added.
-
- * e-url.c (e_url_shroud): Added. Copy a url, replacing
- any plaintext passwords with a single *.
- (e_url_equal): Compare two urls, taking into account that
- they may or may not be shrouded.
-
-2001-03-29 Kjartan Maraas <kmaraas@gnome.org>
-
- * e-corba-utils.h: Remove #include <glib.h>
- * e-dialog-widgets.c: Shuffle some headers.
- * e-dialog-widgets.h: Remove #include <libgnomeui/gnome-propertybox.h>
- * e-gtk-utils.c: #include <gtk/gtksignal.h>
- * e-gtk-utils.h: Replace #include <gtk/gtk.h>
- * e-gui-utils.c: Replace #include <gnome.h>
- * e-html-utils.c: Shuffle headers.
- * e-iterator.c: Replace #include <gtk/gtk.h>
- * e-iterator.h: Replace #include <gtk/gtk.h>
- * e-list-iterator.c: Remove #include <gtk/gtk.h>
- * e-list-iterator.h: Replace #include <gtk/gtk.h>
- * e-list.c: Remove #include <gtk/gtk.h>
- * e-list.h: Replace #include <gtk/gtk.h>
- * e-memory.c: #include <string.h> and <stdlib.h>
- * e-msgport.c: Move around some includes. s/%d/%ld/g in a printf()
- call to fix a warning.
- * e-pilot-map.c: #include <string.h>. Replace #include <gnome.h>
- * e-pilot-util.c: Remove #include <gnome.h>
- * e-sexp.c: Remove #include <glib.h>
- * e-sexp.h: Replace #include <gtk/gtk.h>
- * e-time-utils.c: #include <string.h>
- * md5-utils.c: Shuffle headers.
- * test-ename-western-gtk.c: Replace #include <gnome.h>
- * test-ename-western.c: Same here.
-
-2001-03-20 Radek Doulik <rodo@ximian.com>
-
- * e-html-utils.c (e_text_to_html_full): new function, extracted
- from e_text_to_html, added color parameter
-
-2001-03-19 Radek Doulik <rodo@ximian.com>
-
- * e-html-utils.c (e_text_to_html): support mark citation
-
- * e-html-utils.h (E_TEXT_TO_HTML_MARK_CITATION): added
- E_TEXT_TO_HTML_MARK_CITATION
-
-2001-03-18 Damon Chaplin <damon@ximian.com>
-
- * e-time-utils.c (e_time_format_time): added function to format just
- the time.
-
-2001-03-16 Dan Winship <danw@ximian.com>
-
- * e-path.c (e_path_to_physical): Fix a bug noticed by kmaraas
-
-2001-03-15 Dan Winship <danw@ximian.com>
-
- * e-html-utils.c (url_extract): Fix a bit: [mailto:foo] shouldn't
- grab the ']'
-
-2001-03-12 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: update cflag macros
-
-2001-03-07 Dan Winship <danw@ximian.com>
-
- * e-html-utils.c (url_extract): Fix an off-by-one in the "is this
- for real?" check so that "http:// " won't get URLified
-
-2001-03-04 Damon Chaplin <damon@ximian.com>
-
- * e-time-utils.[hc]: new files to contain functions to parse and
- format dates and times for various calendar widgets.
-
-2001-03-01 Dan Winship <danw@ximian.com>
-
- * e-path.c (e_path_to_physical): New function to turn foo/bar into
- foo/subfolders/bar. The inverse function doesn't exist yet because
- I didn't need it. Also, if the shell were going to use this, we'd
- need a few more tools...
-
- * Makefile.am (libeutil_la_SOURCES): Add e-path.[ch]
-
-2001-03-01 Not Zed <NotZed@Ximian.com>
-
- * e-sexp.c (e_sexp_encode_string): Make it handle a NULL string as
- an empty string.
-
-2001-02-23 Not Zed <NotZed@Ximian.com>
-
- * e-msgport.c (e_thread_destroy): Wait a lot lot longer for
- threads to finish.
- : Turned off some of the debug.
-
-2001-02-08 Not Zed <NotZed@Ximian.com>
-
- * e-memory.c (EMemChunk): Changed to allocate raw blocks for the
- data, and keep track of them with an array, this is so the native
- malloc alignment is not lost at the allocation stage.
-
-2001-01-30 Not Zed <NotZed@Ximian.com>
-
- * e-msgport.c (e_thread_destroy): Turn on joining of cancelled threads.
- (e_msgport_wait): Put a cleanup handler to clear the mp lock if it
- happens in cond_wait, since it will be locked again.
-
-2001-01-29 Not Zed <NotZed@Ximian.com>
-
- * e-msgport.c (e_thread_put): If we have waiting threads, then
- dont start a new one for the NEW case.
- (thread_dispatch): For the NEW case, dont exit, just keep running,
- waiting for a new message to come along.
- (e_thread_destroy): When cleaning up NEW threads, cancel any
- non-busy threads.
-
-2001-01-24 Not Zed <NotZed@Ximian.com>
-
- * e-sexp.h (ESExp): Add chunk allocators.
-
- * e-sexp.c: Removed some redundant debug printfs.
- (e_sexp_term_eval): Dont allocate result till we have it. so we
- can have a fatal error, and not leak it.
- (term_eval_plus): If we have to abort, free our arguments.
- (term_eval_sub): Same.
- (parse_new_term): Renamed to parse_term_new for consistency.
- Fixed callers.
- (e_sexp_result_new): Add the esexp as an argument. Ouch, lots of
- code to change for this. Allocate blocks from an ememchunk.
- Fixed all callers.
- (e_sexp_result_free): Same as above, free blocks from the
- ememchunk. Fixed all callers.
- (parse_term_new):
- (parse_term_free): Similarly, add the esexp to the argument, and
- alloc/free from memchunks. Fixed all local callers.
- (e_sexp_init): Setup the memory chunk allocators.
- (e_sexp_finalise): Destroy memchunk allocators.
-
-2001-01-23 Not Zed <NotZed@Ximian.com>
-
- * e-sexp.c (e_sexp_parse): Setup error return and return error on
- parse error.
- (parse_list): Fail if we have a problem.
- (parse_value): Here too.
- (fatal_error): Fatal error handling function, jumps back to the
- top caller.
- (term_eval_and):
- (e_sexp_term_eval):
- (term_eval_sub):
- (term_eval_plus):
- (term_eval_gt):
- (term_eval_lt):
- (term_eval_or): Fail on error.
- (e_sexp_term_eval): Added a comment about where this can be
- called, which is only from inside e_sexp_eval().
- (e_sexp_eval): Setup setjmp error handler.
- (e_sexp_error): Error accessor function.
-
- * e-sexp.h: Added a longjmp environment to the structure, and an
- error return to parse.
-
-2001-01-22 JP Rosevear <jpr@ximian.com>
-
- * e-dbhash.c (md5_to_dbt): New function, can't use strlen on the md5
- hash because it might have null chars in it.
- (e_dbhash_add): use md5_to_dbt
-
-2001-01-19 JP Rosevear <jpr@ximian.com>
-
- * e-pilot-map.c (e_pilot_map_remove_by_pid): Remove an item by pid
- (e_pilot_map_remove_by_uid): ditto for uid
-
- * e-pilot-map.h: new protos
-
-2001-01-17 Jason Leach <jasonleach@usa.net>
-
- * e-gtk-utils.c (gtk_radio_button_get_nth_selected): New function,
- name describes it well.
- (gtk_radio_button_select_nth): New function.
-
-2001-01-17 Federico Mena Quintero <federico@ximian.com>
-
- * e-dialog-widgets.[ch]: Ximianified.
-
-2001-01-15 JP Roseveaer <jpr@ximian.com>
-
- * e-pilot-util.c (e_pilot_utf8_from_pchar): Dup the string passed
- in, not the temporary string. d'oh.
-
-2001-01-04 Dan Winship <danw@helixcode.com>
-
- * e-msgport.c: #define E_THREAD_NONE as ((pthread_t)~0) and use
- that instead of ~0 throughout. (pthread_t is a pointer type on my
- system, so there are lots of warnings without the cast.)
-
-2000-12-24 Not Zed <NotZed@HelixCode.com>
-
- * Merge from camel-mt-branch.
-
-2000-12-20 JP Rosevear <jpr@helixcode.com>
-
- * e-pilot-util.c (e_pilot_utf8_to_pchar): Check for null strings
- (e_pilot_utf8_from_pchar): ditto
-
-2000-12-19 JP Rosevear <jpr@helixcode.com>
-
- * e-pilot-util.c (e_pilot_utf8_to_pchar): Convert utf8 strings to
- pilot character set
- (e_pilot_utf8_from_pchar): vice versa
-
- * Makefile.am: Conditionally build e-pilot-util.[hc] because
- they depend on pilot-link stuff
-
-2000-12-23 Not Zed <NotZed@HelixCode.com>
-
- * e-msgport.c (e_dlist_length): Util function.
- (e_thread_new): Another new thread primitive. This one is a
- re-usable 'server thread' thingy.
-
-2000-12-21 Not Zed <NotZed@HelixCode.com>
-
- * Makefile.am (libeutil_la_SOURCES): Added msgport stuff.
-
- * e-msgport.[ch]: Some thread primitives. e_dlist, a
- double-linked list (ok, not a thread primitive, but used in ...),
- e_msgport - an asynchronous, non-copying message passing
- rendesvous port, and e_mutex, a portably configurable mutex.
-
-2000-12-19 Not Zed <NotZed@HelixCode.com>
-
- * e-sexp.c: Make the code compile without being a gtk object (the
- old code can still be built as a gtk object if required). Also
- removed some dead code.
- (e_sexp_ref): New function to ref if we're not a gkt object.
- (e_sexp_unref): Same for unref.
-
-2000-12-13 Larry Ewing <lewing@helixcode.com>
-
- * e-html-utils.c (e_text_to_html): make sure we actually make
- enough space for "&nbsp;".
-
-2000-12-08 Federico Mena Quintero <federico@helixcode.com>
-
- * e-dialog-widgets.c (e_dialog_editable_get): Updated
- documentation comment.
-
-2000-12-04 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-corba-utils.h: New.
-
- * e-corba-utils.c: New.
- (e_safe_corba_string): New.
-
-2000-11-30 Not Zed <NotZed@HelixCode.com>
-
- * e-memory.c (e_strv_new): Fix typename of args (for all funcs).
- (e_strv_set_ref): Assert the index is in range.
- (e_strv_set_ref_free): "
- (e_strv_set): "
- (e_strv_get): "
-
-2000-11-29 Not Zed <NotZed@HelixCode.com>
-
- * e-sexp.c (term_eval_lt): Plug a memleak, need to free results
- from term_eval().
- (term_eval_gt):
- (term_eval_eq):
-
-2000-11-27 Not Zed <NotZed@HelixCode.com>
-
- * e-memory.c (e_mempool_new): Added some locking to global data.
- This should make the interfaces mt-safe, although each object is
- only per-thread safe.
-
-2000-11-22 Not Zed <NotZed@HelixCode.com>
-
- * e-memory.c (e_mempool_alloc): If we dont get a big enough chunk
- in the first node, give up. Otherwise we spend too much time
- searching.
- (e_mempool_strdup): Doh, and allocate enough for the terminating
- NUL at that.
- (e_strv_set_ref_free): New function, set a reference to a string
- that is then owned/free'd by the strv.
- (e_strv_destroy): If there are any strings to destroy, free them
- here.
-
-2000-11-21 Not Zed <NotZed@HelixCode.com>
-
- * e-memory.c (e_memchunk_alloc0): New function to allocate a
- zero'd out chunk.
- (e_mempool_strdup): New function to strdup into a mempool.
-
-2000-11-20 Not Zed <NotZed@HelixCode.com>
-
- * e-memory.[ch]: New routines for fast memory management and
- compact string array storage.
-
- * Makefile.am (libeutil_la_SOURCES): Added e-memory.[ch].
-
-2000-11-09 JP Rosevear <jpr@helixcode.com>
-
- * e-dbhash.h: oops thats func not *func
-
- * e-dbhash.c (e_dbhash_foreach_key): Memset the data DBT to 0
-
-2000-11-07 JP Rosevear <jpr@helixcode.com>
-
- * Makefile.am: Build e-dbhash.[hc]
-
- * e-dbhash.[hc]: New routines to manage a db database on disk that
- contains md5 hashed data and indexed by uids. Provides comparison
- functions and such so the caller does not have to do the md5 bits.
-
-200-10-30 Kjartan Maraas <kmaraas@gnome.org>
-
- * e-dialog-widgets.c: #include <string.h> to quench warning.
- * e-sexp.c: #include <stdlib.h> for same reason.
-
-2000-10-27 <jpr@helixcode.com>
-
- * Makefile.am: build md5-utils
-
- * md5-utils.c: Make part of util, get rid of camel stream util
- function include string.h
-
- * md5-utils.h: ditto
-
-2000-10-27 <jpr@helixcode.com>
-
- * e-pilot-map.c (e_pilot_map_lookup_uid): Return null if no
- pnode was found.
-
-2000-10-27 JP Rosevear <jpr@helixcode.com>
-
- * e-pilot-map.c (map_sax_start_element): Get archive field while
- parsing
- (map_write_foreach): Write out archive field
- (e_pilot_map_pid_is_archived): implement
- (e_pilot_map_uid_is_archived): ditto
- (e_pilot_map_insert): Insert new node structures
- (e_pilot_map_lookup_pid): Take into account the list is now
- a list of structures
- (e_pilot_map_lookup_uid): ditto
-
-2000-10-26 Michael Meeks <michael@helixcode.com>
-
- * ename/e-address-western.c (e_address_western_is_postal):
- unsigned chars.
-
- * ename/e-name-western.c (e_name_western_get_one_prefix_at_str):
- cast to unsigned char.
-
-2000-10-25 Dan Winship <danw@helixcode.com>
-
- * e-html-utils.c (e_text_to_html): Deal properly with URLs at the
- end of the buffer. (The old code would append a "&#0;" to the
- text.)
-
-2000-10-23 JP Rosevear <jpr@helixcode.com>
-
- * e-pilot-map.c (e_pilot_map_lookup_pid): Lookup a pid by uid.
- (e_pilot_map_lookup_uid): Lookup a uid by pid.
- Now this is wrapped, we can store archive info internally
-
- * e-pilot-map.h: New accessor prototypes
-
-2000-10-23 Dan Winship <danw@helixcode.com>
-
- * ename/Makefile.am (INCLUDES): Remove unused GNOMELOCALEDIR
- setting.
-
-2000-10-23 JP Rosevear <jpr@helixcode.com>
-
- * e-pilot-map.c: Operate with EPilotMap structure so things are
- abstract to the caller
- (e_pilot_map_pid_is_archived): Infrastructure for marking records
- as archived
- (e_pilot_map_uid_is_archived): ditto
-
- * e-pilot-map.h: Add more to public interface, including EPilotMap
- structure
-
-2000-10-23 JP Rosevear <jpr@helixcode.com>
-
- * e-pilot-map.c: Pilot map functions grabbed from existing conduits
-
- * e-pilot-map.h (e_pilot_map_write): Header
-
-2000-10-18 Dan Winship <danw@helixcode.com>
-
- * e-html-utils.c (e_text_to_html): If unicode_get_utf8 returns -1,
- assume it was actually undeclared iso-8859-1 text.
-
-2000-10-17 Jesse Pavel <jpavel@helixcode.com>
-
- * ename/e-address-western.c: made the routines use the stardard
- e_strstrcase instead of the included function that existed
- earlier.
-
-2000-10-11 Iain Holmes <iain@helixcode.com>
-
- * ename/e-address-western.c (e_address_western_parse): g_strconcat
- needs to be NULL terminated or it goes funny.
-
-Tue Sep 26 16:48:49 2000 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added $(EXTRA_GNOME_CFLAGS).
-
-2000-09-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * Makefile.am: add ename as a SUBDIR
-
-2000-09-18 Christopher James Lahey <clahey@helixcode.com>
-
- * e-list-iterator.c, e-list.c, e-list.h: Made e_list a bit more
- reentrant. If a iterator gets its data pulled out from under it
- while in a loop, it goes back one so that loops will be able to
- continue.
-
-2000-09-18 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Removed all the files moved to gal.
-
- * e-dialog-widgets.c: Fixed the #include lines to deal properly
- with gal.
-
- * e-gui-utils.c, e-gui-utils.h: Removed all of the functionality
- that was moved to gal.
-
- * e-canvas-utils.c, e-canvas-utils.h, e-canvas-vbox.c,
- e-canvas-vbox.h, e-canvas.c, e-canvas.h, e-cursors.c, e-cursors.h,
- e-font.c, e-font.h, e-popup-menu.c, e-popup-menu.h, e-printable.c,
- e-printable.h, e-unicode.c, e-unicode.h, e-util.c, e-util.h,
- e-xml-utils.c, e-xml-utils.h: Moved to gal.
-
-2000-09-13 Christopher James Lahey <clahey@helixcode.com>
-
- * e-font.c: Fixed an uninitialized variable.
-
-2000-09-12 Lauris Kaplinski <lauris@helixcode.com>
-
- * e-unicode.c (e_utf8_to_gtk_string_sized): Use underscores
- for untranslatable characters
- (e_utf8_from_gtk_string_sized): Ditto
-
-2000-09-12 Dan Winship <danw@helixcode.com>
-
- * e-font.c (e_font_from_gdk_font): Change this a bit so that if
- you pass it a bold font, it puts that in font->bold and finds a
- lighter font for font->font (if it can). This is for themes like
- Metal where the default font is bold.
- (find_variants): renamed from find_best_bold
-
-2000-09-11 Dan Winship <danw@helixcode.com>
-
- * e-font.c (find_best_bold): Thou shalt leave space for the
- trailing \0.
-
- * e-util.c (e_strstrcase): The return value should not be
- const. (Well, unless the input was, but you can't know that.)
-
-2000-09-11 Christopher James Lahey <clahey@helixcode.com>
-
- * e-unicode.c, e-unicode.h: Added e_utf8_gtk_editable_get_text and
- e_utf8_gtk_editable_set_text.
-
-2000-09-11 Lauris Kaplinski <lauris@helixcode.com>
-
- * e-font.c: Try to find real bold variant of X font, fall
- to double stroke only if not found
-
-2000-09-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-gtk-utils.c: New.
- (e_gtk_signal_connect_full_while_alive): New.
-
- * e-gtk-utils.h: New.
-
-2000-09-08 Lauris Kaplinski <lauris@helixcode.com>
-
- * e-font.c: Use experimental 16-bit font stuff for EFonts
-
-2000-09-08 Dan Winship <danw@helixcode.com>
-
- * e-popup-menu.h: remove consts from the EPopupMenu structure: the
- caller may want to modify its own EPopupMenu before calling
- e_popup_menu_run.
-
-2000-09-07 Lauris Kaplinski <lauris@helixcode.com>
-
- * e-dialog-widgets.c (e_dialog_editable_get): Use UTF-8
- (e_dialog_editable_set): Use UTF-8
-
- * e-font.c (translate_encoding): More encodings
- (e_gdk_font_encoding): Use experimental stuff
-
- * e-unicode.* (e_utf8_gtk_editable_insert_text): New wrapper
-
-2000-09-07 Federico Mena Quintero <federico@helixcode.com>
-
- * e-canvas.c (emit_event): Remove incorrect optimization. Events
- are read-only!
-
-2000-09-04 Lauris Kaplinski <lauris@helixcode.com>
-
- * e-unicode.c: Added new font code, but comment it out now
- * e-font.h, e-font.c: Test code for font analyzing
-
-2000-09-02 Lauris Kaplinski <lauris@helixcode.com>
-
- * e-unicode.h, e-unicode.c: New functions
- e_utf8_gtk_clist_append, e_utf8_gtk_clist_set_text
- e_unicode_init
-
-2000-08-31 Lauris Kaplinski <lauris@helixcode.com>
-
- * e-html-utils.c (e_text_to_html): Use UTF-8
-
- * e-unicode.h:
- * e-unicode.c (g_unichar_to_utf8): glib 1.3 function
- (gdk_keyval_to_unicode): gdk 1.3 function
- (e_utf8_from_gdk_event_key): Use keyval, not string
-
-2000-08-30 Lauris Kaplinski <lauris@helixcode.com>
-
- * e-unicode.h: #define gnome_font_get_size and
- gnome_font_get_width, and gnome_font_lookup_default,
- if compiling with gnome-print 0.20
-
-2000-08-30 Dan Winship <danw@helixcode.com>
-
- * Makefile.am (libeutil_la_LIBADD): make e-util depend on
- libunicode
-
- * e-popup-menu.c (make_item): Use GtkMenuItem rather than
- GtkPixmapMenuItem for items with no pixmaps, so that if the whole
- menu is pixmapless, you don't get a column of blank pixmaps.
-
-2000-08-24 Lauris Kaplinski <lauris@helixcode.com>
-
- * e-unicode.h:
- * e-unicode.c (e_utf8_gtk_menu_item_new_with_label): New wrapper
-
-2000-08-23 Lauris Kaplinski <lauris@helixcode.com>
-
- * e-unicode.h:
- * e-unicode.c (e_utf8_strstrcase): New function
-
-2000-08-23 Federico Mena Quintero <federico@helixcode.com>
-
- * e-dialog-widgets.c (e_dialog_editable_set): Constify.
-
-2000-08-22 Lauris Kaplinski <lauris@helixcode.com>
-
- * e-unicode.h:
- * e-unicode.c: e_utf8_gtk_editable_get_chars
- e_utf8_gtk_entry_get_text
- e_utf8_gtk_entry_set_text
- e_utf8_to_gtk_string: New convenience functions
-
-2000-08-22 Lauris Kaplinski <lauris@helixcode.com>
-
- * e-unicode.h:
- * e-unicode.c: Some convenience functions to deal with Gtk+ and UTF-8
-
- * Makefile.am: Added e-unicode.h, e-unicode.c
-
-2000-08-21 Lauris Kaplinski <lauris@helixcode.com>
-
- * e-font.h:
- * e-font.c: Changed UTF-8 syntax from char-based to byte-based
-
-2000-08-21 Peter Williams <peterw@helixcode.com>
-
- * e-html-utils.c (e_text_to_html): Fix a booboo in the tab
- expansion code (didn't use the new value of 'out').
-
-2000-08-19 Lauris Kaplinski lauris@helixcode.com
-
- * e-font.h: #define e_font_height(f) to save some space
-
-2000-08-19 Lauris Kaplinski lauris@helixcode.com
-
- * e-font.h:
- * e-font.c: Thin wrapper around GdkFont to deal with UTF-8 directly
- Also handles bold/italic styling
-
-2000-08-14 Peter Williams <peterw@helixcode.com>
-
- * e-sexp.c (scanner_config): Add "-" to be an acceptable
- first character for an operation -- yaaay subtraction!
-
-2000-08-11 Peter Williams <peterw@helixcode.com>
-
- * e-html-utils.c (e_text_to_html): Fix the tab expansion
- for when the length would exceed the ten characters that
- we allocated.
-
-2000-08-10 Dan Winship <danw@helixcode.com>
-
- * e-setup.[ch]: Remove. The shell tells the components where
- the evolution homedir is now.
-
- * Makefile.am (libeutil_la_SOURCES): Remove e-setup.c
-
- * e-html-utils.c (e_text_to_html): If converting both spaces and
- newlines, then convert tabs too. The joys of pseudo-<PRE>.
-
-2000-08-09 Christopher James Lahey <clahey@helixcode.com>
-
- * e-popup-menu.c: Fix the bug where it truncates the last item
-
-2000-08-09 Christopher James Lahey <clahey@helixcode.com>
-
- * e-popup-menu.c: Ooops.
-
-2000-08-09 Christopher James Lahey <clahey@helixcode.com>
-
- * e-util.c, e-util.h: Added uncompiled e_read_uri function.
-
-2000-08-09 Christopher James Lahey <clahey@helixcode.com>
-
- * e-popup-menu.c, e-popup-menu.h: Added a hide_mask argument to
- the two popup menu functions.
-
-2000-08-07 Christopher James Lahey <clahey@helixcode.com>
-
- * e-gui-utils.c, e-gui-utils.c: Added
- e_container_change_tab_order.
-
-2000-07-27 Peter Williams <peterw@helixcode.com>
-
- * e-canvas.c (e_canvas_destroy): Chain the
- destroy handler.
-
-2000-07-25 Peter Williams <peterw@helixcode.com>
-
- * e-canvas.c (emit_event): Don't bother with
- dereferencing the event pointer.
- (e_canvas_item_set_cursor): Reference our selection
- item; print a debug message. Deref when destroying
- (e_canvas_item_add_selection): Same.
- (e_canvas_item_remove_selection): Same.
-
-2000-07-25 Peter Williams <peterw@helixcode.com>
-
- * Makefile.am (libeutil_static_la_LDFLAGS): Build both libraries
- (a typo didn't build libeutil.la, only -static.)
-
-2000-07-25 Seth Alves <alves@hungry.com>
-
- * Makefile.am (libeutil_static_la_LDFLAGS): build static version
- of library for conduit to use
-
-2000-07-25 Christopher James Lahey <clahey@helixcode.com>
-
- * e-util.c, e-util.h: Added a bunch of e_marshal functions.
-
-2000-07-12 Christopher James Lahey <clahey@helixcode.com>
-
- * e-util.c, e-util.h: Added e_strstrcase function.
-
-2000-07-11 Christopher James Lahey <clahey@helixcode.com>
-
- * e-canvas-vbox.c: Removed some debugging printfs.
-
- * e-canvas.c (e_canvas_unrealize): Call parent unrealize method.
-
-2000-07-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-sexp.c (eval_dump_result): `#if 0'ed out.
-
- * e-popup-menu.h (e_popup_menu_create): New prototype.
-
-2000-07-10 Dan Winship <danw@helixcode.com>
-
- * e-html-utils.c: Fix warnings.
-
-2000-07-08 Christopher James Lahey <clahey@helixcode.com>
-
- * e-list.c, e-list.h: Added e_list_duplicate.
-
-2000-07-07 Christopher James Lahey <clahey@helixcode.com>
-
- * e-util.c, e-util.h: Added e_strsplit to work around a bug in
- g_strsplit.
-
-2000-07-07 Christopher James Lahey <clahey@helixcode.com>
-
- * e-iterator.c, e-iterator.h, e-list-iterator.c,
- e-list-iterator.h: Added last and insert functions.
-
-2000-07-06 Federico Mena Quintero <federico@helixcode.com>
-
- * e-dialog-widgets.c: Added docstrings. This file did not have
- them at all. EEEEEEK!
-
-2000-07-05 Dan Winship <danw@helixcode.com>
-
- * e-sexp.c (e_sexp_parse): Kill debugging message
-
-2000-07-03 Christopher James Lahey <clahey@helixcode.com>
-
- * e-iterator.c, e-iterator.h, e-list-iterator.c,
- e-list-iterator.h, e-list.c, e-list.h: New list class with
- iterators.
-
- * e-canvas.c: Made it so that you don't get the same selection in
- the selection list more than once.
-
-2000-07-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-gui-utils.h: #include <libgnomeui/gnome-messagebox.h>. It's
- needed to be able to pass an appropriate @type arg to
- `e_notice()'.
-
-2000-06-29 Jody Goldberg <jgoldberg@home.com>
-
- * e-canvas.c (e_canvas_init) : Init the InputContext members
- (e_canvas_class_init) : Add a handler for unrealize.
- (e_canvas_focus_in) : enable the input context.
- (e_canvas_focus_out) : enable the input context.
- (e_canvas_realize) : Create an input context.
- (e_canvas_unrealize) : New function to release the input context.
-
-2000-06-28 Dan Winship <danw@helixcode.com>
-
- * e-html-utils.c (url_extract): add ")" to the set of characters
- to back up over at the end of a potential URL.
-
-2000-06-27 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-dialog-widgets.c (get_toggle_value): Use `value_var', not
- `value'.
-
-2000-06-27 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am (INCLUDES): `-I$(top_srcdir)' to fix compilation
- with builddir != srcdir.
-
-2000-06-26 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added e-canvas-vbox.c and e-canvas-vbox.h.
-
- * e-canvas-vbox.c, e-canvas-vbox.h: New canvas object to act like
- a vbox using the reflow system.
-
-2000-06-20 Christopher James Lahey <clahey@helixcode.com>
-
- * e-canvas.c, e-canvas.h: Added a variable to keep track of the
- cursor. Set the cursor when selection_add is called. Properly
- unset the cursor at the right times.
-
-2000-06-20 Christopher James Lahey <clahey@helixcode.com>
-
- * e-canvas.c: Grab the focus when setting the cursor.
-
-2000-06-20 Christopher James Lahey <clahey@helixcode.com>
-
- * e-canvas.c, e-canvas.h: Built a system for doing selections
- and/or a cursor in canvas.
-
-2000-06-13 Christopher James Lahey <clahey@helixcode.com>
-
- * e-util.c, e-util.h: Changed the needed e_marshal functions.
-
- * e-printable.c, e-printable.h: Added a quantize parameter to
- e_printable_height. Also, added a e_printable_will_fit function.
-
-2000-06-10 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added e-printable.c and e-printable.h.
-
- * e-printable.c, e-printable.h: This new class is a printing
- context. Other classes return an EPrintable which represents a
- context for printing that object.
-
- * e-util.c, e-util.h: Added
- e_marshal_NONE__OBJECT_DOUBLE_DOUBLE_BOOL and
- e_marshal_DOUBLE__OBJECT_DOUBLE_DOUBLE.
-
-2000-06-01 Christopher James Lahey <clahey@helixcode.com>
-
- * e-util.c: Fixed e_marshal_INT__INT_INT_POINTER.
-
-2000-06-01 Christopher James Lahey <clahey@helixcode.com>
-
- * e-util.c, e-util.h: Added e_marshal_INT__INT_INT_POINTER.
-
-2000-06-01 Dan Winship <danw@helixcode.com>
-
- * e-util.c (g_int_compare): Duh! -1 != 1. :)
-
-2000-06-01 Christopher James Lahey <clahey@helixcode.com>
-
- * e-sexp.c (e_sexp_term_eval): g_return_val_if_fail to prevent a crash.
-
-2000-05-30 Not Zed <NotZed@HelixCode.com>
-
- * e-sexp.c (e_sexp_encode_bool): Utility function to build a bool
- as part of an expression string.
- (e_sexp_encode_string): Likewise for strings.
-
-2000-05-30 Christopher James Lahey <clahey@helixcode.com>
-
- * e-canvas-utils.c, e-canvas-utils.h: Added
- e_canvas_item_show_area which makes sure that a particular area of
- a given item is in the scroll area.
-
-2000-05-30 Federico Mena Quintero <federico@helixcode.com>
-
- * e-dialog-widgets.c (hook_radio): Use the exported function to
- set the value.
- (get_radio_value): Likewise.
- (hook_option_menu): Likewise.
- (get_option_menu_value): Likewise.
- (hook_toggle): Likewise.
- (get_toggle_value): Likewise.
- (hook_spin_button): Likewise.
- (get_spin_button_value): Likewise.
- (hook_editable): Likewise.
- (get_editable_value): Likewise.
- (e_dialog_radio_set): Radio buttons are prepended to their parent
- group's list, so we need to flip the index around when
- getting/setting the value.
- (e_dialog_radio_get): Likewise.
-
-2000-05-27 Federico Mena Quintero <federico@helixcode.com>
-
- * e-dialog-widgets.c (e_dialog_editable_set): Moved over from
- event-editor-utils.c.
- (e_dialog_editable_get): Likewise.
- (e_dialog_toggle_set): Likewise.
- (e_dialog_toggle_get): Likewise.
- (e_dialog_spin_set): Likewise.
- (e_dialog_spin_get_double): Likewise.
- (e_dialog_spin_get_int): Likewise.
- (e_dialog_option_menu_set): Likewise, and added a value map.
- (e_dialog_option_menu_get): Likewise.
- (e_dialog_dateedit_set): Likewise.
- (e_dialog_dateedit_get): Likewise.
- (e_dialog_radio_set): New function.
- (e_dialog_radio_get): New function.
-
-2000-05-24 Christopher James Lahey <clahey@helixcode.com>
-
- * e-paned.c, e-paned.h: Removed.
-
-2000-05-23 Federico Mena Quintero <federico@helixcode.com>
-
- * e-dialog-widgets.c (get_radio_value): Implemented. Amazing that
- one has to go through so much pain to get a stupid value from
- GTK+.
- (hook_option_menu): Implemented. Same complaint.
- (get_toggle_value): Implemented.
- (get_spin_button_value): Implemented.
- (get_entry_value): Implemented.
- (e_dialog_widget_hook_value): Function to hook a widget to the
- variable it will modify.
- (e_dialog_get_values): Function to feed the variables from a
- dialog's widgets.
- (e_dialog_xml_widget_hook_value): Function to hook a widget from
- a Glade file.
-
-2000-05-23 Christopher James Lahey <clahey@helixcode.com>
-
- * e-util.c, e-util.h: Added e_write_file.
-
-2000-05-19 Federico Mena Quintero <federico@helixcode.com>
-
- * e-dialog-widgets.[ch]: New files with utilities for hooking up
- widgets in Glade-generated dialogs.
-
- * Makefile.am (libeutil_la_SOURCES): Added e-dialog-widgets.[ch].
-
-2000-05-19 Christopher James Lahey <clahey@helixcode.com>
-
- * e-gui-utils.c, e-gui-utils.h: Added e_container_foreach_leaf.
-
-2000-05-18 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Add imagesdir support.
-
- * e-gui-utils.c, e-gui-utils.h: Added e_create_image_widget for
- glade use.
-
-2000-05-16 Christopher James Lahey <clahey@helixcode.com>
-
- * e-xml-utils.c: xmlGetProp appears to return malloced memory.
- Thus we must free it.
-
-2000-05-15 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-util.c (e_free_string_list): New function.
-
-2000-05-14 Christopher James Lahey <clahey@helixcode.com>
-
- * e-util.c, e-util.h: Added e_strdup_strip which returns a copy of
- the string with the leading and trailing spaces removed.
-
-2000-05-11 NotZed <NotZed@HelixCode.com>
-
- * e-sexp.c (e_sexp_finalise): Destroy the g_scanner when cleaning up.
- (e_sexp_finalise): Free symbol table on finalise.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * e-canvas.c: Remove reflow idle when being destroyed.
-
-2000-05-06 Christopher James Lahey <clahey@helixcode.com>
-
- * e-html-utils.c: Got rid of some warnings.
-
- * e-util.c, e-util.h: Added e_read_file which takes a filename and
- returns a newly allocated string containing the contents of that
- file.
-
-2000-05-03 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-util.h: #include <glib.h> and <gtk/gtktypeutils.h>.
-
- * e-util.c (e_free_object_list): New utility function.
-
-2000-05-02 Damon Chaplin <damon@helixcode.com>
-
- * e-canvas.c (e_canvas_focus_in):
- (e_canvas_focus_out): set and reset the GTK_HAS_FOCUS flag. We now get
- focus_out events correctly.
-
-2000-05-02 NotZed <NotZed@HelixCode.com>
-
- * e-sexp.c (e_sexp_finalise): Free the parse tree if we have one.
- (e_sexp_parse): If we already have a parse tree, free it.
-
-2000-05-02 Matt Loper <matt@helixcode.com>
-
- * Makefile.am: set G_LOG_DOMAIN.
-
-2000-05-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * e-xml-utils.c, e-xml-utils.h: Constified all the functions.
-
-2000-04-27 Dan Winship <danw@helixcode.com>
-
- * e-html-utils.c (e_text_to_html): Moved here from the mailer,
- since it's of general use, and the composer needs it too.
-
-2000-04-24 Miguel de Icaza <miguel@helixcode.com>
-
- * e-popup-menu.c: New file. Implements easy to use popup menus.
-
-2000-04-24 Matt Loper <matt@helixcode.com>
-
- * e-paned.c: New file. Makes a GtkPaned with more than two
- children.
- * e-paned.h: same.
-
- * Makefile.am: added e-paned.[ch].
-
-2000-04-19 Christopher James Lahey <clahey@helixcode.com>
-
- * e-xml-utils.c, e-xml-utils.h: Added
- e_xml_get_child_by_name_by_lang.
-
-2000-04-16 Anders Carlsson <andersca@gnu.org>
-
- * e-canvas.c (e_canvas_class_init): Add realize.
- (e_canvas_realize): Set the back pixmap to NULL to reduce flicker.
-
-2000-04-14 Christopher James Lahey <clahey@helixcode.com>
-
- * e-xml-utils.c: Fixing a warning.
-
-2000-04-14 Christopher James Lahey <clahey@helixcode.com>
-
- * e-xml-utils.c: Add g_return_if_fails.
-
-2000-04-12 Miguel de Icaza <miguel@gnu.org>
-
- * e-cursors.c (e_cursor_get): Prevent next hacker to get bitten by this.
-
-2000-04-10 Christopher James Lahey <clahey@helixcode.com>
-
- * e-canvas.c: Added proper keyboard focus handling.
-
-2000-04-06 Matt Loper <matt@helixcode.com>
-
- * e-setup.c (e_setup_base_dir): Get/set Evolution's base directory
- via gnome-config.
- (mkdir_if_necessary): New function.
- (e_setup_base_dir): Use mkdir_if_necessary().
-
-2000-03-22 NotZed <NotZed@HelixCode.com>
-
- * e-util/e-sexp.h: Formatting cleanup.
-
-2000-03-07 NotZed <NotZed@HelixCode.com>
-
- * e-util/Makefile.am (libeutil_la_SOURCES): s-sexp.h -> e-sexp.h.
-
-2000-03-12 Christopher James Lahey <clahey@helixcode.com>
-
- * e-util/e-canvas.c, e-util/e-canvas.h: Fixed some bugs here to
- speed up reflow and to make it fail less often.
-
-2000-03-10 Christopher James Lahey <clahey@helixcode.com>
-
- * e-util/e-canvas.c, e-util/e-canvas.h: Designed a new system for
- doing hierarchical displays in the canvas. Adds an extra idle
- loop to the canvas system.
-
-2000-03-05 Christopher James Lahey <clahey@helixcode.com>
-
- * e-util/e-xml-utils.c: Fixed e_xml_set_integer_prop_by_name.
-
-2000-03-04 Christopher James Lahey <clahey@helixcode.com>
-
- * e-util/e-xml-utils.c, e-util/e-xml-utils.h: Added
- e_xml_set_integer_prop_by_name.
-
-2000-02-28 NotZed <NotZed@HelixCode.com>
-
- * e-util/e-sexp.[ch]: Added. moved from filter-sexp.[ch]
-
- * e-util/Makefile.am (libeutil_a_SOURCES): Add e-sexp.
- (noinst_LTLIBRARIES): Changed to a libtool library.
-
-2000-02-24 Christopher James Lahey <clahey@helixcode.com>
-
- * e-util/e-xml-utils.c, e-util/e-xml-utils.h: Added
- e_xml_get_integer_prop_by_name.
-
- * e-util/Makefile.am: Added e-util.c.
-
- * e-util/e-util.h: Added e-util.c functions.
-
- * e-util/e-util.c: New file for compare functions
-
-2000-02-24 Christopher James Lahey <clahey@helixcode.com>
-
- * e-util/e-canvas-utils.h: Fixed the comment at the top and added
- #ifndef __E_CANVAS_UTILS__.
-
- * e-util/Makefile.am: Added e-xml-utils.c and
- e-xml-utils.h.
-
- * e-util/e-xml-utils.h, e-util/e-xml-utils.c: Added files for some
- xml utilities.
-
- * e-util/e-util.h: Added type EFocus which describes which
- direction the focus will be coming from.
-
-2000-02-23 Dan Winship <danw@helixcode.com>
-
- * e-util/e-setup.c (e_setup_base_dir): Make ~/evolution mode 700
- rather than mode 600 (and use the symbolic name rather than the
- number).
-
-2000-02-09 Christopher James Lahey <clahey@helixcode.com>
-
- * e-util/Makefile.am: Add canvas utilities to libeutil.
-
diff --git a/e-util/Makefile.am b/e-util/Makefile.am
deleted file mode 100644
index 6ae1ffc80d..0000000000
--- a/e-util/Makefile.am
+++ /dev/null
@@ -1,139 +0,0 @@
-eutilincludedir = $(privincludedir)/e-util
-econdincludedir = $(privincludedir)/e-conduit
-
-if ENABLE_MONO
-MONOHEADERS = e-plugin-mono.h
-MONOSOURCES = e-plugin-mono.c
-endif
-
-INCLUDES = \
- -I$(top_srcdir) \
- -DEVOLUTION_IMAGES=\""$(imagesdir)"\" \
- -DEVOLUTION_ICONSDIR=\""$(imagesdir)"\" \
- -DEVOLUTION_CATEGORY_ICONS=\""$(imagesdir)/categories"\" \
- -DEVOLUTION_PLUGINDIR=\""$(plugindir)"\" \
- -DG_LOG_DOMAIN=\"e-utils\" \
- $(GNOME_PILOT_CFLAGS) \
- $(E_UTIL_CFLAGS)
-
-privlib_LTLIBRARIES = libeutil.la libeconduit.la
-
-eutilinclude_HEADERS = \
- e-account-list.h \
- e-account.h \
- e-bconf-map.h \
- e-categories-config.h \
- e-categories-master-list-wombat.h \
- e-component-listener.h \
- e-config.h \
- e-config-listener.h \
- e-corba-utils.h \
- e-dialog-utils.h \
- e-dialog-widgets.h \
- e-event.h \
- e-folder-map.h \
- e-fsutils.h \
- e-gtk-utils.h \
- e-gui-utils.h \
- e-html-utils.h \
- e-icon-factory.h \
- e-iterator.h \
- e-list-iterator.h \
- e-list.h \
- e-menu.h \
- e-mktemp.h \
- e-passwords.h \
- e-print.h \
- e-plugin.h \
- e-popup.h \
- e-request.h \
- e-signature.h \
- e-signature-list.h \
- e-time-utils.h \
- e-uid.h \
- md5-utils.h \
- $(MONOHEADERS)
-
-libeutil_la_SOURCES = \
- $(MARSHAL_GENERATED) \
- $(eutilinclude_HEADERS) \
- e-account-list.c \
- e-account.c \
- e-bconf-map.c \
- e-categories-config.c \
- e-categories-master-list-wombat.c \
- e-component-listener.c \
- e-config.c \
- e-config-listener.c \
- e-corba-utils.c \
- e-dialog-utils.c \
- e-dialog-widgets.c \
- e-event.c \
- e-folder-map.c \
- e-fsutils.c \
- e-gtk-utils.c \
- e-gui-utils.c \
- e-html-utils.c \
- e-icon-factory.c \
- e-iterator.c \
- e-list-iterator.c \
- e-list.c \
- e-menu.c \
- e-mktemp.c \
- e-passwords.c \
- e-plugin.c \
- e-popup.c \
- e-print.c \
- e-request.c \
- e-signature.c \
- e-signature-list.c \
- e-time-utils.c \
- e-uid.c \
- eggtrayicon.c \
- eggtrayicon.h \
- md5-utils.c \
- $(MONOSOURCES)
-
-MARSHAL_GENERATED = e-util-marshal.c e-util-marshal.h
-@EVO_MARSHAL_RULE@
-
-libeutil_la_LIBADD = $(E_UTIL_LIBS)
-
-econdinclude_HEADERS = \
- e-pilot-map.h \
- e-pilot-util.h
-
-pilot_sources = \
- $(econdinclude_HEADERS) \
- e-pilot-map.c \
- e-pilot-util.c
-
-if ENABLE_PILOT_CONDUITS
-pilot_compile = $(pilot_sources)
-else
-pilot_compile = md5-utils.c
-endif
-
-libeconduit_la_SOURCES = $(pilot_compile)
-
-# e-error-tool
-
-e_error_tool_SOURCES = \
- e-error-tool.c
-
-e_error_tool_LDADD = \
- $(GNOME_FULL_LIBS)
-
-noinst_PROGRAMS = \
- e-error-tool
-
-EXTRA_DIST = \
- $(pilot_sources) \
- ChangeLog.pre-1-4 \
- e-util-marshal.list
-
-BUILT_SOURCES = $(MARSHAL_GENERATED)
-CLEANFILES = $(BUILT_SOURCES)
-
-dist-hook: e-error-tool
- cd $(distdir); rm -f $(BUILT_SOURCES)
diff --git a/e-util/e-account-list.c b/e-util/e-account-list.c
deleted file mode 100644
index c4968d82b3..0000000000
--- a/e-util/e-account-list.c
+++ /dev/null
@@ -1,466 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-account-list.h"
-#include "e-account.h"
-#include "e-util-marshal.h"
-
-#include <string.h>
-
-struct EAccountListPrivate {
- GConfClient *gconf;
- guint notify_id;
-};
-
-enum {
- ACCOUNT_ADDED,
- ACCOUNT_CHANGED,
- ACCOUNT_REMOVED,
- LAST_SIGNAL
-};
-
-static guint signals [LAST_SIGNAL] = { 0 };
-
-static void e_account_list_dispose (GObject *);
-static void e_account_list_finalize (GObject *);
-
-G_DEFINE_TYPE (EAccountList, e_account_list, E_TYPE_LIST)
-
-static void
-e_account_list_class_init (EAccountListClass *klass)
-{
- GObjectClass *object_class;
-
- /* virtual method override */
- object_class = G_OBJECT_CLASS (klass);
- object_class->dispose = e_account_list_dispose;
- object_class->finalize = e_account_list_finalize;
-
- /* signals */
- signals[ACCOUNT_ADDED] =
- g_signal_new ("account-added",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EAccountListClass, account_added),
- NULL, NULL,
- e_util_marshal_NONE__OBJECT,
- G_TYPE_NONE, 1,
- E_TYPE_ACCOUNT);
- signals[ACCOUNT_CHANGED] =
- g_signal_new ("account-changed",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EAccountListClass, account_changed),
- NULL, NULL,
- e_util_marshal_NONE__OBJECT,
- G_TYPE_NONE, 1,
- E_TYPE_ACCOUNT);
- signals[ACCOUNT_REMOVED] =
- g_signal_new ("account-removed",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EAccountListClass, account_removed),
- NULL, NULL,
- e_util_marshal_NONE__OBJECT,
- G_TYPE_NONE, 1,
- E_TYPE_ACCOUNT);
-}
-
-static void
-e_account_list_init (EAccountList *account_list)
-{
- account_list->priv = g_new0 (EAccountListPrivate, 1);
-}
-
-static void
-e_account_list_dispose (GObject *object)
-{
- EAccountList *account_list = E_ACCOUNT_LIST (object);
-
- if (account_list->priv->gconf) {
- if (account_list->priv->notify_id) {
- gconf_client_notify_remove (account_list->priv->gconf,
- account_list->priv->notify_id);
- }
- g_object_unref (account_list->priv->gconf);
- account_list->priv->gconf = NULL;
- }
-
- G_OBJECT_CLASS (e_account_list_parent_class)->dispose (object);
-}
-
-static void
-e_account_list_finalize (GObject *object)
-{
- EAccountList *account_list = E_ACCOUNT_LIST (object);
-
- g_free (account_list->priv);
-
- G_OBJECT_CLASS (e_account_list_parent_class)->finalize (object);
-}
-
-static void
-gconf_accounts_changed (GConfClient *client, guint cnxn_id,
- GConfEntry *entry, gpointer user_data)
-{
- EAccountList *account_list = user_data;
- GSList *list, *l, *new_accounts = NULL;
- EAccount *account;
- EList *old_accounts;
- EIterator *iter;
- char *uid;
-
- old_accounts = e_list_duplicate (E_LIST (account_list));
-
- list = gconf_client_get_list (client, "/apps/evolution/mail/accounts",
- GCONF_VALUE_STRING, NULL);
- for (l = list; l; l = l->next) {
- uid = e_account_uid_from_xml (l->data);
- if (!uid)
- continue;
-
- /* See if this is an existing account */
- for (iter = e_list_get_iterator (old_accounts);
- e_iterator_is_valid (iter);
- e_iterator_next (iter)) {
- account = (EAccount *)e_iterator_get (iter);
- if (!strcmp (account->uid, uid)) {
- /* The account still exists, so remove
- * it from "old_accounts" and update it.
- */
- e_iterator_delete (iter);
- if (e_account_set_from_xml (account, l->data))
- g_signal_emit (account_list, signals[ACCOUNT_CHANGED], 0, account);
- goto next;
- }
- }
-
- /* Must be a new account */
- account = e_account_new_from_xml (l->data);
- e_list_append (E_LIST (account_list), account);
- new_accounts = g_slist_prepend (new_accounts, account);
-
- next:
- g_free (uid);
- g_object_unref (iter);
- }
-
- /* Now emit signals for each added account. (We do this after
- * adding all of them because otherwise if the signal handler
- * calls e_account_list_get_default_account() it will end up
- * causing the first account in the list to become the
- * default.)
- */
- for (l = new_accounts; l; l = l->next) {
- account = l->data;
- g_signal_emit (account_list, signals[ACCOUNT_ADDED], 0, account);
- g_object_unref (account);
- }
- g_slist_free (new_accounts);
-
- /* Anything left in old_accounts must have been deleted */
- for (iter = e_list_get_iterator (old_accounts);
- e_iterator_is_valid (iter);
- e_iterator_next (iter)) {
- account = (EAccount *)e_iterator_get (iter);
- e_list_remove (E_LIST (account_list), account);
- g_signal_emit (account_list, signals[ACCOUNT_REMOVED], 0, account);
- }
- g_object_unref (iter);
- g_object_unref (old_accounts);
-}
-
-static void *
-copy_func (const void *data, void *closure)
-{
- GObject *object = (GObject *)data;
-
- g_object_ref (object);
- return object;
-}
-
-static void
-free_func (void *data, void *closure)
-{
- g_object_unref (data);
-}
-
-/**
- * e_account_list_new:
- * @gconf: a #GConfClient
- *
- * Reads the list of accounts from @gconf and listens for changes.
- * Will emit %account_added, %account_changed, and %account_removed
- * signals according to notifications from GConf.
- *
- * You can modify the list using e_list_append(), e_list_remove(), and
- * e_iterator_delete(). After adding, removing, or changing accounts,
- * you must call e_account_list_save() to push the changes back to
- * GConf.
- *
- * Return value: the list of accounts
- **/
-EAccountList *
-e_account_list_new (GConfClient *gconf)
-{
- EAccountList *account_list;
-
- g_return_val_if_fail (GCONF_IS_CLIENT (gconf), NULL);
-
- account_list = g_object_new (E_TYPE_ACCOUNT_LIST, NULL);
- e_account_list_construct (account_list, gconf);
-
- return account_list;
-}
-
-void
-e_account_list_construct (EAccountList *account_list, GConfClient *gconf)
-{
- g_return_if_fail (GCONF_IS_CLIENT (gconf));
-
- e_list_construct (E_LIST (account_list), copy_func, free_func, NULL);
- account_list->priv->gconf = gconf;
- g_object_ref (gconf);
-
- gconf_client_add_dir (account_list->priv->gconf,
- "/apps/evolution/mail/accounts",
- GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
- account_list->priv->notify_id =
- gconf_client_notify_add (account_list->priv->gconf,
- "/apps/evolution/mail/accounts",
- gconf_accounts_changed, account_list,
- NULL, NULL);
-
- gconf_accounts_changed (account_list->priv->gconf,
- account_list->priv->notify_id,
- NULL, account_list);
-}
-
-/**
- * e_account_list_save:
- * @account_list: an #EAccountList
- *
- * Saves @account_list to GConf. Signals will be emitted for changes.
- **/
-void
-e_account_list_save (EAccountList *account_list)
-{
- GSList *list = NULL;
- EAccount *account;
- EIterator *iter;
- char *xmlbuf;
-
- for (iter = e_list_get_iterator (E_LIST (account_list));
- e_iterator_is_valid (iter);
- e_iterator_next (iter)) {
- account = (EAccount *)e_iterator_get (iter);
-
- xmlbuf = e_account_to_xml (account);
- if (xmlbuf)
- list = g_slist_append (list, xmlbuf);
- }
- g_object_unref (iter);
-
- gconf_client_set_list (account_list->priv->gconf,
- "/apps/evolution/mail/accounts",
- GCONF_VALUE_STRING, list, NULL);
-
- while (list) {
- g_free (list->data);
- list = g_slist_remove (list, list->data);
- }
-
- gconf_client_suggest_sync (account_list->priv->gconf, NULL);
-}
-
-/**
- * e_account_list_add:
- * @accounts:
- * @account:
- *
- * Add an account to the account list. Will emit the account-changed
- * event.
- **/
-void
-e_account_list_add(EAccountList *accounts, EAccount *account)
-{
- /* FIXME: should we check for duplicate accounts? */
-
- e_list_append ((EList *)accounts, account);
- g_signal_emit(accounts, signals[ACCOUNT_ADDED], 0, account);
-}
-
-/**
- * e_account_list_change:
- * @accounts:
- * @account:
- *
- * Signal that the details of an account have changed.
- **/
-void
-e_account_list_change(EAccountList *accounts, EAccount *account)
-{
- /* maybe the account should do this itself ... */
- g_signal_emit(accounts, signals[ACCOUNT_CHANGED], 0, account);
-}
-
-/**
- * e_account_list_remove:
- * @accounts:
- * @account:
- *
- * Remove an account from the account list, and emit the
- * account-removed signal. If the account was the default account,
- * then reset the default to the first account.
- **/
-void
-e_account_list_remove(EAccountList *accounts, EAccount *account)
-{
- if (account == e_account_list_get_default(accounts))
- gconf_client_unset (accounts->priv->gconf, "/apps/evolution/mail/default_account", NULL);
-
- /* not sure if need to ref but no harm */
- g_object_ref (account);
- e_list_remove ((EList *) accounts, account);
- g_signal_emit(accounts, signals[ACCOUNT_REMOVED], 0, account);
- g_object_unref (account);
-}
-
-/**
- * e_account_list_get_default:
- * @accounts:
- *
- * Get the default account. If no default is specified, or the default
- * has become stale, then the first account is made the default.
- *
- * Return value: The account or NULL if no accounts are defined.
- **/
-const EAccount *
-e_account_list_get_default(EAccountList *accounts)
-{
- char *uid;
- EIterator *it;
- const EAccount *account = NULL;
-
- uid = gconf_client_get_string (accounts->priv->gconf, "/apps/evolution/mail/default_account", NULL);
- it = e_list_get_iterator ((EList *)accounts);
-
- if (uid) {
- for (;e_iterator_is_valid (it);e_iterator_next (it)) {
- account = (const EAccount *)e_iterator_get (it);
-
- if (!strcmp(uid, account->uid))
- break;
- account = NULL;
- }
- e_iterator_reset(it);
- }
-
- /* no uid or uid not found, @it will be at the first account */
- if (account == NULL && e_iterator_is_valid(it)) {
- account = (const EAccount *) e_iterator_get (it);
- gconf_client_set_string (accounts->priv->gconf, "/apps/evolution/mail/default_account", account->uid, NULL);
- }
-
- g_object_unref(it);
- g_free(uid);
-
- return account;
-}
-
-/**
- * e_account_list_set_default:
- * @accounts:
- * @account:
- *
- * Set the account @account to be the default account.
- **/
-void
-e_account_list_set_default(EAccountList *accounts, EAccount *account)
-{
- gconf_client_set_string (accounts->priv->gconf, "/apps/evolution/mail/default_account", account->uid, NULL);
-}
-
-/**
- * e_account_list_find:
- * @accounts:
- * @type: Type of search.
- * @key: Search key.
- *
- * Perform a search of the account list on a single key.
- *
- * @type must be set from one of the following search types:
- * E_ACCOUNT_FIND_NAME - Find an account by account name.
- * E_ACCOUNT_FIND_ID_NAME - Find an account by the owner's identity name.
- * E_ACCOUNT_FIND_ID_ADDRESS - Find an account by the owner's identity address.
- *
- * Return value: The account or NULL if it doesn't exist.
- **/
-const EAccount *
-e_account_list_find(EAccountList *accounts, e_account_find_t type, const char *key)
-{
- char *val;
- EIterator *it;
- const EAccount *account = NULL;
-
- /* this could use a callback for more flexibility ...
- ... but this makes the common cases easier */
-
- if (!key)
- return NULL;
-
- for (it = e_list_get_iterator ((EList *)accounts);
- e_iterator_is_valid (it);
- e_iterator_next (it)) {
- int found = 0;
-
- account = (const EAccount *)e_iterator_get (it);
-
- val = NULL;
- switch(type) {
- case E_ACCOUNT_FIND_NAME:
- found = strcmp(account->name, key) == 0;
- break;
- case E_ACCOUNT_FIND_UID:
- found = strcmp(account->uid, key) == 0;
- break;
- case E_ACCOUNT_FIND_ID_NAME:
- if (account->id)
- found = strcmp(account->id->name, key) == 0;
- break;
- case E_ACCOUNT_FIND_ID_ADDRESS:
- if (account->id)
- found = g_ascii_strcasecmp(account->id->address, key) == 0;
- break;
- }
-
- if (found)
- break;
-
- account = NULL;
- }
- g_object_unref(it);
-
- return account;
-}
-
diff --git a/e-util/e-account-list.h b/e-util/e-account-list.h
deleted file mode 100644
index f2b17af360..0000000000
--- a/e-util/e-account-list.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef __E_ACCOUNT_LIST__
-#define __E_ACCOUNT_LIST__
-
-#include "e-list.h"
-#include "e-account.h"
-#include <gconf/gconf-client.h>
-
-#define E_TYPE_ACCOUNT_LIST (e_account_list_get_type ())
-#define E_ACCOUNT_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_ACCOUNT_LIST, EAccountList))
-#define E_ACCOUNT_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_ACCOUNT_LIST, EAccountListClass))
-#define E_IS_ACCOUNT_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_ACCOUNT_LIST))
-#define E_IS_ACCOUNT_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_ACCOUNT_LIST))
-
-typedef struct EAccountListPrivate EAccountListPrivate;
-
-/* search options for the find command */
-typedef enum _e_account_find_t {
- E_ACCOUNT_FIND_NAME,
- E_ACCOUNT_FIND_UID,
- E_ACCOUNT_FIND_ID_NAME,
- E_ACCOUNT_FIND_ID_ADDRESS,
-} e_account_find_t;
-
-typedef struct _EAccountList {
- EList parent_object;
-
- EAccountListPrivate *priv;
-} EAccountList;
-
-typedef struct {
- EListClass parent_class;
-
- /* signals */
- void (*account_added) (EAccountList *, EAccount *);
- void (*account_changed) (EAccountList *, EAccount *);
- void (*account_removed) (EAccountList *, EAccount *);
-} EAccountListClass;
-
-
-GType e_account_list_get_type (void);
-
-EAccountList *e_account_list_new (GConfClient *gconf);
-void e_account_list_construct (EAccountList *account_list,
- GConfClient *gconf);
-
-void e_account_list_save (EAccountList *account_list);
-
-void e_account_list_add (EAccountList *, EAccount *);
-void e_account_list_change (EAccountList *, EAccount *);
-void e_account_list_remove (EAccountList *, EAccount *);
-
-const EAccount *e_account_list_get_default(EAccountList *);
-void e_account_list_set_default(EAccountList *, EAccount *);
-const EAccount *e_account_list_find (EAccountList *, e_account_find_t type, const char *key);
-
-#endif /* __E_ACCOUNT_LIST__ */
diff --git a/e-util/e-account.c b/e-util/e-account.c
deleted file mode 100644
index b919a56cc2..0000000000
--- a/e-util/e-account.c
+++ /dev/null
@@ -1,914 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-account.h"
-
-#include "e-uid.h"
-
-#include <string.h>
-
-#include <libxml/parser.h>
-#include <libxml/tree.h>
-#include <libxml/xmlmemory.h>
-
-#include <gconf/gconf-client.h>
-
-enum {
- CHANGED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL];
-
-G_DEFINE_TYPE (EAccount, e_account, G_TYPE_OBJECT)
-
-/*
-lock mail accounts Relatively difficult -- involves redesign of the XML blobs which describe accounts
-disable adding mail accounts Simple -- can be done with just a Gconf key and some UI work to make assoc. widgets unavailable
-disable editing mail accounts Relatively difficult -- involves redesign of the XML blobs which describe accounts
-disable removing mail accounts
-lock default character encoding Simple -- Gconf key + a little UI work to desensitize widgets, etc
-disable free busy publishing
-disable specific mime types (from being viewed) 90% done already (Unknown MIME types still pose a problem)
-lock image loading preference
-lock junk mail filtering settings
-** junk mail per account
-lock work week
-lock first day of work week
-lock working hours
-disable forward as icalendar
-lock color options for tasks
-lock default contact filing format
-* forbid signatures Simple -- can be done with just a Gconf key and some UI work to make assoc. widgets unavailable
-* lock user to having 1 specific signature Simple -- can be done with just a Gconf key and some UI work to make assoc. widgets unavailable
-* forbid adding/removing signatures Simple -- can be done with just a Gconf key and some UI work to make assoc. widgets unavailable
-* lock each account to a certain signature Relatively difficult -- involved redesign of the XML blobs which describe accounts
-* set default folders
-set trash emptying frequency
-* lock displayed mail headers Simple -- can be done with just a Gconf key and some UI work to make assoc. widgets unavailable
-* lock authentication type (for incoming mail) Relatively difficult -- involves redesign of the XML blobs which describe accounts
-* lock authentication type (for outgoing mail) Relatively difficult -- involves redesign of the XML blobs which describe accounts
-* lock minimum check mail on server frequency Simple -- can be done with just a Gconf key and some UI work to make assoc. widgets unavailable
-** lock save password
-* require ssl always Relatively difficult -- involves redesign of the XML blobs which describe accounts
-** lock imap subscribed folder option
-** lock filtering of inbox
-** lock source account/options
-** lock destination account/options
-*/
-
-static void e_account_finalize (GObject *);
-
-static void
-e_account_class_init (EAccountClass *klass)
-{
- GObjectClass *object_class;
-
- /* virtual method override */
- object_class = G_OBJECT_CLASS (klass);
- object_class->finalize = e_account_finalize;
-
- signals[CHANGED] =
- g_signal_new("changed",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EAccountClass, changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__INT,
- G_TYPE_NONE, 1,
- G_TYPE_INT);
-}
-
-static void
-e_account_init (EAccount *account)
-{
- account->id = g_new0 (EAccountIdentity, 1);
- account->source = g_new0 (EAccountService, 1);
- account->transport = g_new0 (EAccountService, 1);
-
- account->source->auto_check = FALSE;
- account->source->auto_check_time = 10;
-}
-
-static void
-identity_destroy (EAccountIdentity *id)
-{
- if (!id)
- return;
-
- g_free (id->name);
- g_free (id->address);
- g_free (id->reply_to);
- g_free (id->organization);
- g_free (id->sig_uid);
-
- g_free (id);
-}
-
-static void
-service_destroy (EAccountService *service)
-{
- if (!service)
- return;
-
- g_free (service->url);
-
- g_free (service);
-}
-
-static void
-e_account_finalize (GObject *object)
-{
- EAccount *account = E_ACCOUNT (object);
-
- g_free (account->name);
- g_free (account->uid);
-
- identity_destroy (account->id);
- service_destroy (account->source);
- service_destroy (account->transport);
-
- g_free (account->drafts_folder_uri);
- g_free (account->sent_folder_uri);
-
- g_free (account->cc_addrs);
- g_free (account->bcc_addrs);
-
- g_free (account->pgp_key);
- g_free (account->smime_sign_key);
- g_free (account->smime_encrypt_key);
-
- G_OBJECT_CLASS (e_account_parent_class)->finalize (object);
-}
-
-/**
- * e_account_new:
- *
- * Return value: a blank new account which can be filled in and
- * added to an #EAccountList.
- **/
-EAccount *
-e_account_new (void)
-{
- EAccount *account;
-
- account = g_object_new (E_TYPE_ACCOUNT, NULL);
- account->uid = e_uid_new ();
-
- return account;
-}
-
-/**
- * e_account_new_from_xml:
- * @xml: an XML account description
- *
- * Return value: a new #EAccount based on the data in @xml, or %NULL
- * if @xml could not be parsed as valid account data.
- **/
-EAccount *
-e_account_new_from_xml (const char *xml)
-{
- EAccount *account;
-
- account = g_object_new (E_TYPE_ACCOUNT, NULL);
- if (!e_account_set_from_xml (account, xml)) {
- g_object_unref (account);
- return NULL;
- }
-
- return account;
-}
-
-
-static gboolean
-xml_set_bool (xmlNodePtr node, const char *name, gboolean *val)
-{
- gboolean bool;
- char *buf;
-
- if ((buf = xmlGetProp (node, name))) {
- bool = (!strcmp (buf, "true") || !strcmp (buf, "yes"));
- xmlFree (buf);
-
- if (bool != *val) {
- *val = bool;
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static gboolean
-xml_set_int (xmlNodePtr node, const char *name, int *val)
-{
- int number;
- char *buf;
-
- if ((buf = xmlGetProp (node, name))) {
- number = strtol (buf, NULL, 10);
- xmlFree (buf);
-
- if (number != *val) {
- *val = number;
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static gboolean
-xml_set_prop (xmlNodePtr node, const char *name, char **val)
-{
- char *buf;
- int res;
-
- buf = xmlGetProp(node, name);
- if (buf == NULL) {
- res = (*val != NULL);
- if (res) {
- g_free(*val);
- *val = NULL;
- }
- } else {
- res = *val == NULL || strcmp(*val, buf) != 0;
- if (res) {
- g_free(*val);
- *val = g_strdup(buf);
- }
- xmlFree(buf);
- }
-
- return res;
-}
-
-static gboolean
-xml_set_content (xmlNodePtr node, char **val)
-{
- char *buf;
- int res;
-
- buf = xmlNodeGetContent(node);
- if (buf == NULL) {
- res = (*val != NULL);
- if (res) {
- g_free(*val);
- *val = NULL;
- }
- } else {
- res = *val == NULL || strcmp(*val, buf) != 0;
- if (res) {
- g_free(*val);
- *val = g_strdup(buf);
- }
- xmlFree(buf);
- }
-
- return res;
-}
-
-static gboolean
-xml_set_identity (xmlNodePtr node, EAccountIdentity *id)
-{
- gboolean changed = FALSE;
-
- for (node = node->children; node; node = node->next) {
- if (!strcmp (node->name, "name"))
- changed |= xml_set_content (node, &id->name);
- else if (!strcmp (node->name, "addr-spec"))
- changed |= xml_set_content (node, &id->address);
- else if (!strcmp (node->name, "reply-to"))
- changed |= xml_set_content (node, &id->reply_to);
- else if (!strcmp (node->name, "organization"))
- changed |= xml_set_content (node, &id->organization);
- else if (!strcmp (node->name, "signature")) {
- changed |= xml_set_prop (node, "uid", &id->sig_uid);
- if (!id->sig_uid) {
-
- /* WTF is this shit doing here? Migrate is supposed to "handle this" */
-
- /* set a fake sig uid so the migrate code can handle this */
- gboolean autogen = FALSE;
- int sig_id = 0;
-
- xml_set_bool (node, "auto", &autogen);
- xml_set_int (node, "default", &sig_id);
-
- if (autogen) {
- id->sig_uid = g_strdup ("::0");
- changed = TRUE;
- } else if (sig_id) {
- id->sig_uid = g_strdup_printf ("::%d", sig_id + 1);
- changed = TRUE;
- }
- }
- }
- }
-
- return changed;
-}
-
-static gboolean
-xml_set_service (xmlNodePtr node, EAccountService *service)
-{
- gboolean changed = FALSE;
-
- changed |= xml_set_bool (node, "save-passwd", &service->save_passwd);
- changed |= xml_set_bool (node, "keep-on-server", &service->keep_on_server);
-
- changed |= xml_set_bool (node, "auto-check", &service->auto_check);
- changed |= xml_set_int (node, "auto-check-timeout", &service->auto_check_time);
- if (service->auto_check && service->auto_check_time <= 0) {
- service->auto_check = FALSE;
- service->auto_check_time = 0;
- }
-
- for (node = node->children; node; node = node->next) {
- if (!strcmp (node->name, "url")) {
- changed |= xml_set_content (node, &service->url);
- break;
- }
- }
-
- return changed;
-}
-
-/**
- * e_account_set_from_xml:
- * @account: an #EAccount
- * @xml: an XML account description.
- *
- * Changes @account to match @xml.
- *
- * Return value: %TRUE if @account was changed, %FALSE if @account
- * already matched @xml or @xml could not be parsed
- **/
-gboolean
-e_account_set_from_xml (EAccount *account, const char *xml)
-{
- xmlNodePtr node, cur;
- xmlDocPtr doc;
- gboolean changed = FALSE;
-
- if (!(doc = xmlParseDoc ((char *)xml)))
- return FALSE;
-
- node = doc->children;
- if (strcmp (node->name, "account") != 0) {
- xmlFreeDoc (doc);
- return FALSE;
- }
-
- if (!account->uid)
- xml_set_prop (node, "uid", &account->uid);
-
- changed |= xml_set_prop (node, "name", &account->name);
- changed |= xml_set_bool (node, "enabled", &account->enabled);
-
- for (node = node->children; node; node = node->next) {
- if (!strcmp (node->name, "identity")) {
- changed |= xml_set_identity (node, account->id);
- } else if (!strcmp (node->name, "source")) {
- changed |= xml_set_service (node, account->source);
- } else if (!strcmp (node->name, "transport")) {
- changed |= xml_set_service (node, account->transport);
- } else if (!strcmp (node->name, "drafts-folder")) {
- changed |= xml_set_content (node, &account->drafts_folder_uri);
- } else if (!strcmp (node->name, "sent-folder")) {
- changed |= xml_set_content (node, &account->sent_folder_uri);
- } else if (!strcmp (node->name, "auto-cc")) {
- changed |= xml_set_bool (node, "always", &account->always_cc);
- changed |= xml_set_content (node, &account->cc_addrs);
- } else if (!strcmp (node->name, "auto-bcc")) {
- changed |= xml_set_bool (node, "always", &account->always_bcc);
- changed |= xml_set_content (node, &account->bcc_addrs);
- } else if (!strcmp (node->name, "pgp")) {
- changed |= xml_set_bool (node, "encrypt-to-self", &account->pgp_encrypt_to_self);
- changed |= xml_set_bool (node, "always-trust", &account->pgp_always_trust);
- changed |= xml_set_bool (node, "always-sign", &account->pgp_always_sign);
- changed |= xml_set_bool (node, "no-imip-sign", &account->pgp_no_imip_sign);
-
- if (node->children) {
- for (cur = node->children; cur; cur = cur->next) {
- if (!strcmp (cur->name, "key-id")) {
- changed |= xml_set_content (cur, &account->pgp_key);
- break;
- }
- }
- }
- } else if (!strcmp (node->name, "smime")) {
- changed |= xml_set_bool (node, "sign-default", &account->smime_sign_default);
- changed |= xml_set_bool (node, "encrypt-to-self", &account->smime_encrypt_to_self);
- changed |= xml_set_bool (node, "encrypt-default", &account->smime_encrypt_default);
-
- if (node->children) {
- for (cur = node->children; cur; cur = cur->next) {
- if (!strcmp (cur->name, "sign-key-id")) {
- changed |= xml_set_content (cur, &account->smime_sign_key);
- } else if (!strcmp (cur->name, "encrypt-key-id")) {
- changed |= xml_set_content (cur, &account->smime_encrypt_key);
- break;
- }
- }
- }
- }
- }
-
- xmlFreeDoc (doc);
-
- g_signal_emit(account, signals[CHANGED], 0, -1);
-
- return changed;
-}
-
-/**
- * e_account_import:
- * @dest: destination account object
- * @src: source account object
- *
- * Import the settings from @src to @dest.
- **/
-void
-e_account_import (EAccount *dest, EAccount *src)
-{
- g_free (dest->name);
- dest->name = g_strdup (src->name);
-
- dest->enabled = src->enabled;
-
- g_free (dest->id->name);
- dest->id->name = g_strdup (src->id->name);
- g_free (dest->id->address);
- dest->id->address = g_strdup (src->id->address);
- g_free (dest->id->reply_to);
- dest->id->reply_to = g_strdup (src->id->reply_to);
- g_free (dest->id->organization);
- dest->id->organization = g_strdup (src->id->organization);
- dest->id->sig_uid = g_strdup (src->id->sig_uid);
-
- g_free (dest->source->url);
- dest->source->url = g_strdup (src->source->url);
- dest->source->keep_on_server = src->source->keep_on_server;
- dest->source->auto_check = src->source->auto_check;
- dest->source->auto_check_time = src->source->auto_check_time;
- dest->source->save_passwd = src->source->save_passwd;
-
- g_free (dest->transport->url);
- dest->transport->url = g_strdup (src->transport->url);
- dest->transport->save_passwd = src->transport->save_passwd;
-
- g_free (dest->drafts_folder_uri);
- dest->drafts_folder_uri = g_strdup (src->drafts_folder_uri);
-
- g_free (dest->sent_folder_uri);
- dest->sent_folder_uri = g_strdup (src->sent_folder_uri);
-
- dest->always_cc = src->always_cc;
- g_free (dest->cc_addrs);
- dest->cc_addrs = g_strdup (src->cc_addrs);
-
- dest->always_bcc = src->always_bcc;
- g_free (dest->bcc_addrs);
- dest->bcc_addrs = g_strdup (src->bcc_addrs);
-
- g_free (dest->pgp_key);
- dest->pgp_key = g_strdup (src->pgp_key);
- dest->pgp_encrypt_to_self = src->pgp_encrypt_to_self;
- dest->pgp_always_sign = src->pgp_always_sign;
- dest->pgp_no_imip_sign = src->pgp_no_imip_sign;
- dest->pgp_always_trust = src->pgp_always_trust;
-
- dest->smime_sign_default = src->smime_sign_default;
- g_free (dest->smime_sign_key);
- dest->smime_sign_key = g_strdup (src->smime_sign_key);
-
- dest->smime_encrypt_default = src->smime_encrypt_default;
- dest->smime_encrypt_to_self = src->smime_encrypt_to_self;
- g_free (dest->smime_encrypt_key);
- dest->smime_encrypt_key = g_strdup (src->smime_encrypt_key);
-
- g_signal_emit(dest, signals[CHANGED], 0, -1);
-}
-
-/**
- * e_account_to_xml:
- * @account: an #EAccount
- *
- * Return value: an XML representation of @account, which the caller
- * must free.
- **/
-char *
-e_account_to_xml (EAccount *account)
-{
- xmlNodePtr root, node, id, src, xport;
- char *tmp, buf[20];
- xmlChar *xmlbuf;
- xmlDocPtr doc;
- int n;
-
- doc = xmlNewDoc ("1.0");
-
- root = xmlNewDocNode (doc, NULL, "account", NULL);
- xmlDocSetRootElement (doc, root);
-
- xmlSetProp (root, "name", account->name);
- xmlSetProp (root, "uid", account->uid);
- xmlSetProp (root, "enabled", account->enabled ? "true" : "false");
-
- id = xmlNewChild (root, NULL, "identity", NULL);
- if (account->id->name)
- xmlNewTextChild (id, NULL, "name", account->id->name);
- if (account->id->address)
- xmlNewTextChild (id, NULL, "addr-spec", account->id->address);
- if (account->id->reply_to)
- xmlNewTextChild (id, NULL, "reply-to", account->id->reply_to);
- if (account->id->organization)
- xmlNewTextChild (id, NULL, "organization", account->id->organization);
-
- node = xmlNewChild (id, NULL, "signature",NULL);
- xmlSetProp (node, "uid", account->id->sig_uid);
-
- src = xmlNewChild (root, NULL, "source", NULL);
- xmlSetProp (src, "save-passwd", account->source->save_passwd ? "true" : "false");
- xmlSetProp (src, "keep-on-server", account->source->keep_on_server ? "true" : "false");
- xmlSetProp (src, "auto-check", account->source->auto_check ? "true" : "false");
- sprintf (buf, "%d", account->source->auto_check_time);
- xmlSetProp (src, "auto-check-timeout", buf);
- if (account->source->url)
- xmlNewTextChild (src, NULL, "url", account->source->url);
-
- xport = xmlNewChild (root, NULL, "transport", NULL);
- xmlSetProp (xport, "save-passwd", account->transport->save_passwd ? "true" : "false");
- if (account->transport->url)
- xmlNewTextChild (xport, NULL, "url", account->transport->url);
-
- xmlNewTextChild (root, NULL, "drafts-folder", account->drafts_folder_uri);
- xmlNewTextChild (root, NULL, "sent-folder", account->sent_folder_uri);
-
- node = xmlNewChild (root, NULL, "auto-cc", NULL);
- xmlSetProp (node, "always", account->always_cc ? "true" : "false");
- if (account->cc_addrs)
- xmlNewTextChild (node, NULL, "recipients", account->cc_addrs);
-
- node = xmlNewChild (root, NULL, "auto-bcc", NULL);
- xmlSetProp (node, "always", account->always_bcc ? "true" : "false");
- if (account->bcc_addrs)
- xmlNewTextChild (node, NULL, "recipients", account->bcc_addrs);
-
- node = xmlNewChild (root, NULL, "pgp", NULL);
- xmlSetProp (node, "encrypt-to-self", account->pgp_encrypt_to_self ? "true" : "false");
- xmlSetProp (node, "always-trust", account->pgp_always_trust ? "true" : "false");
- xmlSetProp (node, "always-sign", account->pgp_always_sign ? "true" : "false");
- xmlSetProp (node, "no-imip-sign", account->pgp_no_imip_sign ? "true" : "false");
- if (account->pgp_key)
- xmlNewTextChild (node, NULL, "key-id", account->pgp_key);
-
- node = xmlNewChild (root, NULL, "smime", NULL);
- xmlSetProp (node, "sign-default", account->smime_sign_default ? "true" : "false");
- xmlSetProp (node, "encrypt-default", account->smime_encrypt_default ? "true" : "false");
- xmlSetProp (node, "encrypt-to-self", account->smime_encrypt_to_self ? "true" : "false");
- if (account->smime_sign_key)
- xmlNewTextChild (node, NULL, "sign-key-id", account->smime_sign_key);
- if (account->smime_encrypt_key)
- xmlNewTextChild (node, NULL, "encrypt-key-id", account->smime_encrypt_key);
-
- xmlDocDumpMemory (doc, &xmlbuf, &n);
- xmlFreeDoc (doc);
-
- /* remap to glib memory */
- tmp = g_malloc (n + 1);
- memcpy (tmp, xmlbuf, n);
- tmp[n] = '\0';
- xmlFree (xmlbuf);
-
- return tmp;
-}
-
-/**
- * e_account_uid_from_xml:
- * @xml: an XML account description
- *
- * Return value: the permanent UID of the account described by @xml
- * (or %NULL if @xml could not be parsed or did not contain a uid).
- * The caller must free this string.
- **/
-char *
-e_account_uid_from_xml (const char *xml)
-{
- xmlNodePtr node;
- xmlDocPtr doc;
- char *uid = NULL;
-
- if (!(doc = xmlParseDoc ((char *)xml)))
- return NULL;
-
- node = doc->children;
- if (strcmp (node->name, "account") != 0) {
- xmlFreeDoc (doc);
- return NULL;
- }
-
- xml_set_prop (node, "uid", &uid);
- xmlFreeDoc (doc);
-
- return uid;
-}
-
-enum {
- EAP_IMAP_SUBSCRIBED = 0,
- EAP_IMAP_NAMESPACE,
- EAP_FILTER_INBOX,
- EAP_FILTER_JUNK,
- EAP_FORCE_SSL,
- EAP_LOCK_SIGNATURE,
- EAP_LOCK_AUTH,
- EAP_LOCK_AUTOCHECK,
- EAP_LOCK_DEFAULT_FOLDERS,
- EAP_LOCK_SAVE_PASSWD,
- EAP_LOCK_SOURCE,
- EAP_LOCK_TRANSPORT,
-};
-
-static struct _system_info {
- const char *key;
- guint32 perm;
-} system_perms[] = {
- { "imap_subscribed", 1<<EAP_IMAP_SUBSCRIBED },
- { "imap_namespace", 1<<EAP_IMAP_NAMESPACE },
- { "filter_inbox", 1<<EAP_FILTER_INBOX },
- { "filter_junk", 1<<EAP_FILTER_JUNK },
- { "ssl", 1<<EAP_FORCE_SSL },
- { "signature", 1<<EAP_LOCK_SIGNATURE },
- { "authtype", 1<<EAP_LOCK_AUTH },
- { "autocheck", 1<<EAP_LOCK_AUTOCHECK },
- { "default_folders", 1<<EAP_LOCK_DEFAULT_FOLDERS },
- { "save_passwd" , 1<<EAP_LOCK_SAVE_PASSWD },
- { "source", 1<<EAP_LOCK_SOURCE },
- { "transport", 1<<EAP_LOCK_TRANSPORT },
-};
-
-#define TYPE_STRING (1)
-#define TYPE_INT (2)
-#define TYPE_BOOL (3)
-#define TYPE_MASK (0xff)
-#define TYPE_STRUCT (1<<8)
-
-static struct _account_info {
- guint32 perms;
- guint32 type;
- unsigned int offset;
- unsigned int struct_offset;
-} account_info[E_ACCOUNT_ITEM_LAST] = {
- { /* E_ACCOUNT_NAME */ 0, TYPE_STRING, G_STRUCT_OFFSET(EAccount, name) },
-
- { /* E_ACCOUNT_ID_NAME, */ 0, TYPE_STRING|TYPE_STRUCT, G_STRUCT_OFFSET(EAccount, id), G_STRUCT_OFFSET(EAccountIdentity, name) },
- { /* E_ACCOUNT_ID_ADDRESS, */ 0, TYPE_STRING|TYPE_STRUCT, G_STRUCT_OFFSET(EAccount, id), G_STRUCT_OFFSET(EAccountIdentity, address) },
- { /* E_ACCOUNT_ID_REPLY_TO, */ 0, TYPE_STRING|TYPE_STRUCT, G_STRUCT_OFFSET(EAccount, id), G_STRUCT_OFFSET(EAccountIdentity, reply_to) },
- { /* E_ACCOUNT_ID_ORGANIZATION */ 0, TYPE_STRING|TYPE_STRUCT, G_STRUCT_OFFSET(EAccount, id), G_STRUCT_OFFSET(EAccountIdentity, organization) },
- { /* E_ACCOUNT_ID_SIGNATURE */ 1<<EAP_LOCK_SIGNATURE, TYPE_STRING|TYPE_STRUCT, G_STRUCT_OFFSET(EAccount, id), G_STRUCT_OFFSET(EAccountIdentity, sig_uid) },
-
- { /* E_ACCOUNT_SOURCE_URL */ 1<<EAP_LOCK_SOURCE, TYPE_STRING|TYPE_STRUCT, G_STRUCT_OFFSET(EAccount, source), G_STRUCT_OFFSET(EAccountService, url) },
- { /* E_ACCOUNT_SOURCE_KEEP_ON_SERVER */ 0, TYPE_BOOL|TYPE_STRUCT, G_STRUCT_OFFSET(EAccount, source), G_STRUCT_OFFSET(EAccountService, keep_on_server) },
- { /* E_ACCOUNT_SOURCE_AUTO_CHECK */ 1<<EAP_LOCK_AUTOCHECK, TYPE_BOOL|TYPE_STRUCT, G_STRUCT_OFFSET(EAccount, source), G_STRUCT_OFFSET(EAccountService, auto_check) },
- { /* E_ACCOUNT_SOURCE_AUTO_CHECK_TIME */ 1<<EAP_LOCK_AUTOCHECK, TYPE_INT|TYPE_STRUCT, G_STRUCT_OFFSET(EAccount, source), G_STRUCT_OFFSET(EAccountService, auto_check_time) },
- { /* E_ACCOUNT_SOURCE_SAVE_PASSWD */ 1<<EAP_LOCK_SAVE_PASSWD, TYPE_BOOL|TYPE_STRUCT, G_STRUCT_OFFSET(EAccount, source), G_STRUCT_OFFSET(EAccountService, save_passwd) },
-
- { /* E_ACCOUNT_TRANSPORT_URL */ 1<<EAP_LOCK_TRANSPORT, TYPE_STRING|TYPE_STRUCT, G_STRUCT_OFFSET(EAccount, transport), G_STRUCT_OFFSET(EAccountService, url) },
- { /* E_ACCOUNT_TRANSPORT_SAVE_PASSWD */ 1<<EAP_LOCK_SAVE_PASSWD, TYPE_BOOL|TYPE_STRUCT, G_STRUCT_OFFSET(EAccount, transport), G_STRUCT_OFFSET(EAccountService, save_passwd) },
-
- { /* E_ACCOUNT_DRAFTS_FOLDER_URI */ 1<<EAP_LOCK_DEFAULT_FOLDERS, TYPE_STRING, G_STRUCT_OFFSET(EAccount, drafts_folder_uri) },
- { /* E_ACCOUNT_SENT_FOLDER_URI */ 1<<EAP_LOCK_DEFAULT_FOLDERS, TYPE_STRING, G_STRUCT_OFFSET(EAccount, sent_folder_uri) },
-
- { /* E_ACCOUNT_CC_ALWAYS */ 0, TYPE_BOOL, G_STRUCT_OFFSET(EAccount, always_cc) },
- { /* E_ACCOUNT_CC_ADDRS */ 0, TYPE_STRING, G_STRUCT_OFFSET(EAccount, cc_addrs) },
-
- { /* E_ACCOUNT_BCC_ALWAYS */ 0, TYPE_BOOL, G_STRUCT_OFFSET(EAccount, always_bcc) },
- { /* E_ACCOUNT_BCC_ADDRS */ 0, TYPE_STRING, G_STRUCT_OFFSET(EAccount, bcc_addrs) },
-
- { /* E_ACCOUNT_PGP_KEY */ 0, TYPE_STRING, G_STRUCT_OFFSET(EAccount, pgp_key) },
- { /* E_ACCOUNT_PGP_ENCRYPT_TO_SELF */ 0, TYPE_BOOL, G_STRUCT_OFFSET(EAccount, pgp_encrypt_to_self) },
- { /* E_ACCOUNT_PGP_ALWAYS_SIGN */ 0, TYPE_BOOL, G_STRUCT_OFFSET(EAccount, pgp_always_sign) },
- { /* E_ACCOUNT_PGP_NO_IMIP_SIGN */ 0, TYPE_BOOL, G_STRUCT_OFFSET(EAccount, pgp_no_imip_sign) },
- { /* E_ACCOUNT_PGP_ALWAYS_TRUST */ 0, TYPE_BOOL, G_STRUCT_OFFSET(EAccount, pgp_always_trust) },
-
- { /* E_ACCOUNT_SMIME_SIGN_KEY */ 0, TYPE_STRING, G_STRUCT_OFFSET(EAccount, smime_sign_key) },
- { /* E_ACCOUNT_SMIME_ENCRYPT_KEY */ 0, TYPE_STRING, G_STRUCT_OFFSET(EAccount, smime_encrypt_key) },
- { /* E_ACCOUNT_SMIME_SIGN_DEFAULT */ 0, TYPE_BOOL, G_STRUCT_OFFSET(EAccount, smime_sign_default) },
- { /* E_ACCOUNT_SMIME_ENCRYPT_TO_SELF */ 0, TYPE_BOOL, G_STRUCT_OFFSET(EAccount, smime_encrypt_to_self) },
- { /* E_ACCOUNT_SMIME_ENCRYPT_DEFAULT */ 0, TYPE_BOOL, G_STRUCT_OFFSET(EAccount, smime_encrypt_default) },
-};
-
-static GHashTable *ea_option_table;
-static GHashTable *ea_system_table;
-static guint32 ea_perms;
-
-static struct _option_info {
- char *key;
- guint32 perms;
-} ea_option_list[] = {
- { "imap_use_lsub", 1<<EAP_IMAP_SUBSCRIBED },
- { "imap_override_namespace", 1<<EAP_IMAP_NAMESPACE },
- { "imap_filter", 1<<EAP_FILTER_INBOX },
- { "imap_filter_junk", 1<<EAP_FILTER_JUNK },
- { "imap_filter_junk_inbox", 1<<EAP_FILTER_JUNK },
- { "*_use_ssl", 1<<EAP_FORCE_SSL },
- { "*_auth", 1<<EAP_LOCK_AUTH },
-};
-
-#define LOCK_BASE "/apps/evolution/lock/mail/accounts"
-
-static void
-ea_setting_notify(GConfClient *gconf, guint cnxn_id, GConfEntry *entry, void *crap)
-{
- GConfValue *value;
- char *tkey;
- struct _system_info *info;
-
- g_return_if_fail (gconf_entry_get_key (entry) != NULL);
-
- if (!(value = gconf_entry_get_value (entry)))
- return;
-
- tkey = strrchr(entry->key, '/');
- g_return_if_fail (tkey != NULL);
-
- info = g_hash_table_lookup(ea_system_table, tkey+1);
- if (info) {
- if (gconf_value_get_bool(value))
- ea_perms |= info->perm;
- else
- ea_perms &= ~info->perm;
- }
-}
-
-static void
-ea_setting_setup(void)
-{
- GConfClient *gconf = gconf_client_get_default();
- GConfEntry *entry;
- GError *err = NULL;
- int i;
- char key[64];
-
- if (ea_option_table != NULL)
- return;
-
- ea_option_table = g_hash_table_new(g_str_hash, g_str_equal);
- for (i=0;i<sizeof(ea_option_list)/sizeof(ea_option_list[0]);i++)
- g_hash_table_insert(ea_option_table, ea_option_list[i].key, &ea_option_list[i]);
-
- gconf_client_add_dir(gconf, LOCK_BASE, GCONF_CLIENT_PRELOAD_NONE, NULL);
-
- ea_system_table = g_hash_table_new(g_str_hash, g_str_equal);
- for (i=0;i<sizeof(system_perms)/sizeof(system_perms[0]);i++) {
- g_hash_table_insert(ea_system_table, (char *)system_perms[i].key, &system_perms[i]);
- sprintf(key, LOCK_BASE "/%s", system_perms[i].key);
- entry = gconf_client_get_entry(gconf, key, NULL, TRUE, &err);
- if (entry)
- ea_setting_notify(gconf, 0, entry, NULL);
- gconf_entry_free(entry);
- }
-
- if (err) {
- g_warning("Could not load account lock settings: %s", err->message);
- g_error_free(err);
- }
-
- gconf_client_notify_add(gconf, LOCK_BASE, (GConfClientNotifyFunc)ea_setting_notify, NULL, NULL, NULL);
- g_object_unref(gconf);
-}
-
-/* look up the item in the structure or the substructure using our table of reflection data */
-#define addr(ea, type) \
- ((account_info[type].type & TYPE_STRUCT)? \
- (((char **)(((char *)ea)+account_info[type].offset))[0] + account_info[type].struct_offset): \
- (((char *)ea)+account_info[type].offset))
-
-const char *e_account_get_string(EAccount *ea, e_account_item_t type)
-{
- return *((const char **)addr(ea, type));
-}
-
-int e_account_get_int(EAccount *ea, e_account_item_t type)
-{
- return *((int *)addr(ea, type));
-}
-
-gboolean e_account_get_bool(EAccount *ea, e_account_item_t type)
-{
- return *((gboolean *)addr(ea, type));
-}
-
-static void
-dump_account(EAccount *ea)
-{
- char *xml;
-
- printf("Account changed\n");
- xml = e_account_to_xml(ea);
- printf(" ->\n%s\n", xml);
- g_free(xml);
-}
-
-/* TODO: should it return true if it changed? */
-void e_account_set_string(EAccount *ea, e_account_item_t type, const char *val)
-{
- char **p;
-
- if (!e_account_writable(ea, type)) {
- g_warning("Trying to set non-writable option account value");
- } else {
- p = (char **)addr(ea, type);
- printf("Setting string %d: old '%s' new '%s'\n", type, *p, val);
- if (*p != val
- && (*p == NULL || val == NULL || strcmp(*p, val) != 0)) {
- g_free(*p);
- *p = g_strdup(val);
-
- dump_account(ea);
- g_signal_emit(ea, signals[CHANGED], 0, type);
- }
- }
-}
-
-void e_account_set_int(EAccount *ea, e_account_item_t type, int val)
-{
- if (!e_account_writable(ea, type)) {
- g_warning("Trying to set non-writable option account value");
- } else {
- int *p = (int *)addr(ea, type);
-
- if (*p != val) {
- *p = val;
- dump_account(ea);
- g_signal_emit(ea, signals[CHANGED], 0, type);
- }
- }
-}
-
-void e_account_set_bool(EAccount *ea, e_account_item_t type, gboolean val)
-{
- if (!e_account_writable(ea, type)) {
- g_warning("Trying to set non-writable option account value");
- } else {
- gboolean *p = (gboolean *)addr(ea, type);
-
- if (*p != val) {
- *p = val;
- dump_account(ea);
- g_signal_emit(ea, signals[CHANGED], 0, type);
- }
- }
-}
-
-gboolean
-e_account_writable_option(EAccount *ea, const char *protocol, const char *option)
-{
- char *key;
- struct _option_info *info;
-
- ea_setting_setup();
-
- key = alloca(strlen(protocol)+strlen(option)+2);
- sprintf(key, "%s_%s", protocol, option);
-
- info = g_hash_table_lookup(ea_option_table, key);
- if (info == NULL) {
- sprintf(key, "*_%s", option);
- info = g_hash_table_lookup(ea_option_table, key);
- }
-
- printf("checking writable option '%s' perms=%08x\n", option, info?info->perms:0);
-
- return info == NULL
- || (info->perms & ea_perms) == 0;
-}
-
-gboolean
-e_account_writable(EAccount *ea, e_account_item_t type)
-{
- ea_setting_setup();
-
- return (account_info[type].perms & ea_perms) == 0;
-}
diff --git a/e-util/e-account.h b/e-util/e-account.h
deleted file mode 100644
index 0e153ca993..0000000000
--- a/e-util/e-account.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2003 Ximian, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef __E_ACCOUNT__
-#define __E_ACCOUNT__
-
-#include <glib-object.h>
-
-#define E_TYPE_ACCOUNT (e_account_get_type ())
-#define E_ACCOUNT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_ACCOUNT, EAccount))
-#define E_ACCOUNT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_ACCOUNT, EAccountClass))
-#define E_IS_ACCOUNT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_ACCOUNT))
-#define E_IS_ACCOUNT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_ACCOUNT))
-
-typedef enum _e_account_item_t {
- E_ACCOUNT_NAME,
-
- E_ACCOUNT_ID_NAME,
- E_ACCOUNT_ID_ADDRESS,
- E_ACCOUNT_ID_REPLY_TO,
- E_ACCOUNT_ID_ORGANIZATION,
- E_ACCOUNT_ID_SIGNATURE,
-
- E_ACCOUNT_SOURCE_URL, /* what about separating out host/user/path settings?? sigh */
- E_ACCOUNT_SOURCE_KEEP_ON_SERVER,
- E_ACCOUNT_SOURCE_AUTO_CHECK,
- E_ACCOUNT_SOURCE_AUTO_CHECK_TIME,
- E_ACCOUNT_SOURCE_SAVE_PASSWD,
-
- E_ACCOUNT_TRANSPORT_URL,
- E_ACCOUNT_TRANSPORT_SAVE_PASSWD,
-
- E_ACCOUNT_DRAFTS_FOLDER_URI,
- E_ACCOUNT_SENT_FOLDER_URI,
-
- E_ACCOUNT_CC_ALWAYS,
- E_ACCOUNT_CC_ADDRS,
-
- E_ACCOUNT_BCC_ALWAYS,
- E_ACCOUNT_BCC_ADDRS,
-
- E_ACCOUNT_PGP_KEY,
- E_ACCOUNT_PGP_ENCRYPT_TO_SELF,
- E_ACCOUNT_PGP_ALWAYS_SIGN,
- E_ACCOUNT_PGP_NO_IMIP_SIGN,
- E_ACCOUNT_PGP_ALWAYS_TRUST,
-
- E_ACCOUNT_SMIME_SIGN_KEY,
- E_ACCOUNT_SMIME_ENCRYPT_KEY,
- E_ACCOUNT_SMIME_SIGN_DEFAULT,
- E_ACCOUNT_SMIME_ENCRYPT_TO_SELF,
- E_ACCOUNT_SMIME_ENCRYPT_DEFAULT,
-
- E_ACCOUNT_ITEM_LAST
-} e_account_item_t;
-
-typedef enum _e_account_access_t {
- E_ACCOUNT_ACCESS_WRITE = 1<<0,
-} e_account_access_t;
-
-typedef struct _EAccountIdentity {
- char *name;
- char *address;
- char *reply_to;
- char *organization;
- char *sig_uid;
-} EAccountIdentity;
-
-typedef struct _EAccountService {
- char *url;
- gboolean keep_on_server;
- gboolean auto_check;
- int auto_check_time;
- gboolean save_passwd;
-} EAccountService;
-
-typedef struct _EAccount {
- GObject parent_object;
-
- char *name;
- char *uid;
-
- gboolean enabled;
-
- EAccountIdentity *id;
- EAccountService *source;
- EAccountService *transport;
-
- char *drafts_folder_uri, *sent_folder_uri;
-
- gboolean always_cc;
- char *cc_addrs;
- gboolean always_bcc;
- char *bcc_addrs;
-
- char *pgp_key;
- gboolean pgp_encrypt_to_self;
- gboolean pgp_always_sign;
- gboolean pgp_no_imip_sign;
- gboolean pgp_always_trust;
-
- char *smime_sign_key;
- char *smime_encrypt_key;
- gboolean smime_sign_default;
- gboolean smime_encrypt_to_self;
- gboolean smime_encrypt_default;
-} EAccount;
-
-typedef struct {
- GObjectClass parent_class;
-
- void (*changed)(EAccount *, int field);
-} EAccountClass;
-
-
-GType e_account_get_type (void);
-
-EAccount *e_account_new (void);
-
-EAccount *e_account_new_from_xml (const char *xml);
-gboolean e_account_set_from_xml (EAccount *account, const char *xml);
-void e_account_import (EAccount *dest, EAccount *src);
-char *e_account_to_xml (EAccount *account);
-char *e_account_uid_from_xml (const char *xml);
-
-const char *e_account_get_string(EAccount *, e_account_item_t type);
-int e_account_get_int(EAccount *, e_account_item_t type);
-gboolean e_account_get_bool(EAccount *, e_account_item_t type);
-
-void e_account_set_string(EAccount *, e_account_item_t type, const char *);
-void e_account_set_int(EAccount *, e_account_item_t type, int);
-void e_account_set_bool(EAccount *, e_account_item_t type, gboolean);
-
-gboolean e_account_writable(EAccount *ea, e_account_item_t type);
-gboolean e_account_writable_option(EAccount *ea, const char *protocol, const char *option);
-
-#endif /* __E_ACCOUNT__ */
diff --git a/e-util/e-bconf-map.c b/e-util/e-bconf-map.c
deleted file mode 100644
index f4d57bbbcc..0000000000
--- a/e-util/e-bconf-map.c
+++ /dev/null
@@ -1,544 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <glib.h>
-
-#include <libxml/tree.h>
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-
-#include "e-bconf-map.h"
-
-
-#define d(x)
-
-
-static char hexnib[256] = {
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
- -1,10,11,12,13,14,15,16,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,10,11,12,13,14,15,16,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-};
-
-char *
-e_bconf_hex_decode (const char *val)
-{
- const unsigned char *p = (const unsigned char *) val;
- char *o, *res;
-
- o = res = g_malloc (strlen (val) / 2 + 1);
- for (p = val; (p[0] && p[1]); p += 2)
- *o++ = (hexnib[p[0]] << 4) | hexnib[p[1]];
- *o = 0;
-
- return res;
-}
-
-char *
-e_bconf_url_decode (const char *val)
-{
- const unsigned char *p = (const unsigned char *) val;
- char *o, *res, c;
-
- o = res = g_malloc (strlen (val) + 1);
- while (*p) {
- c = *p++;
- if (c == '%'
- && hexnib[p[0]] != -1 && hexnib[p[1]] != -1) {
- *o++ = (hexnib[p[0]] << 4) | hexnib[p[1]];
- p+=2;
- } else
- *o++ = c;
- }
- *o = 0;
-
- return res;
-}
-
-
-xmlNodePtr
-e_bconf_get_path (xmlDocPtr doc, const char *path)
-{
- xmlNodePtr root;
- char *val;
- int found;
-
- root = doc->children;
- if (strcmp (root->name, "bonobo-config") != 0) {
- g_warning ("not bonobo-config xml file");
- return NULL;
- }
-
- root = root->children;
- while (root) {
- if (!strcmp (root->name, "section")) {
- val = xmlGetProp (root, "path");
- found = val && strcmp (val, path) == 0;
- xmlFree (val);
- if (found)
- break;
- }
- root = root->next;
- }
-
- return root;
-}
-
-xmlNodePtr
-e_bconf_get_entry (xmlNodePtr root, const char *name)
-{
- xmlNodePtr node = root->children;
- int found;
- char *val;
-
- while (node) {
- if (!strcmp (node->name, "entry")) {
- val = xmlGetProp (node, "name");
- found = val && strcmp (val, name) == 0;
- xmlFree (val);
- if (found)
- break;
- }
- node = node->next;
- }
-
- return node;
-}
-
-char *
-e_bconf_get_value (xmlNodePtr root, const char *name)
-{
- xmlNodePtr node = e_bconf_get_entry (root, name);
- char *prop, *val = NULL;
-
- if (node && (prop = xmlGetProp (node, "value"))) {
- val = g_strdup (prop);
- xmlFree (prop);
- }
-
- return val;
-}
-
-char *
-e_bconf_get_bool (xmlNodePtr root, const char *name)
-{
- char *val, *res;
-
- if ((val = e_bconf_get_value (root, name))) {
- res = g_strdup (val[0] == '1' ? "true" : "false");
- g_free (val);
- } else
- res = NULL;
-
- return res;
-}
-
-char *
-e_bconf_get_long (xmlNodePtr root, const char *name)
-{
- char *val, *res;
-
- if ((val = e_bconf_get_value (root, name))) {
- res = g_strdup (val);
- g_free (val);
- } else
- res = NULL;
-
- return res;
-}
-
-char *
-e_bconf_get_string (xmlNodePtr root, const char *name)
-{
- char *val, *res;
-
- if ((val = e_bconf_get_value (root, name))) {
- res = e_bconf_hex_decode (val);
- g_free (val);
- } else
- res = NULL;
-
- return res;
-}
-
-
-/* lookup functions */
-typedef char * (* bconf_lookup_func) (xmlNodePtr root, const char *name, e_bconf_map_t *nap);
-
-static char *
-bconf_lookup_bool (xmlNodePtr root, const char *name, e_bconf_map_t *map)
-{
- return e_bconf_get_bool (root, name);
-}
-
-static char *
-bconf_lookup_long (xmlNodePtr root, const char *name, e_bconf_map_t *map)
-{
- return e_bconf_get_long (root, name);
-}
-
-static char *
-bconf_lookup_string (xmlNodePtr root, const char *name, e_bconf_map_t *map)
-{
- return e_bconf_get_string (root, name);
-}
-
-static char *
-bconf_lookup_enum (xmlNodePtr root, const char *name, e_bconf_map_t *map)
-{
- int index = 0, i;
- char *val;
-
- if ((val = e_bconf_get_value (root, name))) {
- index = atoi (val);
- g_free (val);
- }
-
- for (i = 0; map->child[i].from; i++) {
- if (i == index)
- return g_strdup (map->child[i].from);
- }
-
- return NULL;
-}
-
-
-static bconf_lookup_func lookup_table[] = {
- bconf_lookup_bool, bconf_lookup_long, bconf_lookup_string, bconf_lookup_enum
-};
-
-static char *
-get_name (const char *in, int index)
-{
- GString *out = g_string_new ("");
- char c, *res;
-
- while ((c = *in++)) {
- if (c == '%') {
- c = *in++;
- switch (c) {
- case '%':
- g_string_append_c (out, '%');
- break;
- case 'i':
- g_string_append_printf (out, "%d", index);
- break;
- }
- } else {
- g_string_append_c (out, c);
- }
- }
-
- res = out->str;
- g_string_free (out, FALSE);
-
- return res;
-}
-
-static void
-build_xml (xmlNodePtr root, e_bconf_map_t *map, int index, xmlNodePtr source)
-{
- char *name, *value;
- xmlNodePtr node;
-
- while (map->type != E_BCONF_MAP_END) {
- if ((map->type & E_BCONF_MAP_MASK) == E_BCONF_MAP_CHILD) {
- node = xmlNewChild (root, NULL, map->to, NULL);
- build_xml (node, map->child, index, source);
- } else {
- name = get_name (map->from, index);
- value = lookup_table[(map->type & E_BCONF_MAP_MASK) - 1] (source, name, map);
-
- d(printf ("key '%s=%s' -> ", name, value));
-
- if (map->type & E_BCONF_MAP_CONTENT) {
- if (value && value[0])
- xmlNewTextChild (root, NULL, map->to, value);
- } else {
- xmlSetProp (root, map->to, value);
- }
-
- g_free (value);
- g_free (name);
- }
- map++;
- }
-}
-
-
-int
-e_bconf_import_xml_blob (GConfClient *gconf, xmlDocPtr config_xmldb, e_bconf_map_t *map,
- const char *bconf_path, const char *gconf_path,
- const char *name, const char *idparam)
-{
- xmlNodePtr source;
- int count = 0, i;
- GSList *list, *l;
- char *val;
-
- source = e_bconf_get_path (config_xmldb, bconf_path);
- if (source) {
- list = NULL;
- if ((val = e_bconf_get_value (source, "num"))) {
- count = atoi (val);
- g_free (val);
- }
-
- d(printf("Found %d blobs at %s\n", count, bconf_path));
-
- for (i = 0; i < count; i++) {
- xmlDocPtr doc;
- xmlNodePtr root;
- xmlChar *xmlbuf;
- int n;
-
- doc = xmlNewDoc ("1.0");
- root = xmlNewDocNode (doc, NULL, name, NULL);
- xmlDocSetRootElement (doc, root);
-
- /* This could be set with a MAP_UID type ... */
- if (idparam) {
- char buf[16];
-
- sprintf (buf, "%d", i);
- xmlSetProp (root, idparam, buf);
- }
-
- build_xml (root, map, i, source);
-
- xmlDocDumpMemory (doc, &xmlbuf, &n);
- xmlFreeDoc (doc);
-
- list = g_slist_append (list, xmlbuf);
- }
-
- gconf_client_set_list (gconf, gconf_path, GCONF_VALUE_STRING, list, NULL);
-
- while (list) {
- l = list->next;
- xmlFree (list->data);
- g_slist_free_1 (list);
- list = l;
- }
- } else {
- g_warning ("could not find '%s' in old config database, skipping", bconf_path);
- }
-
- return 0;
-}
-
-
-static int gconf_type[] = { GCONF_VALUE_BOOL, GCONF_VALUE_BOOL, GCONF_VALUE_INT, GCONF_VALUE_STRING, GCONF_VALUE_STRING };
-
-int
-e_bconf_import (GConfClient *gconf, xmlDocPtr config_xmldb, e_gconf_map_list_t *remap_list)
-{
- char *path, *val, *tmp;
- e_gconf_map_t *map;
- xmlNodePtr source;
- GSList *list, *l;
- char buf[32];
- int i, j, k;
-
- /* process all flat config */
- for (i = 0; remap_list[i].root; i++) {
- d(printf ("Path: %s\n", remap_list[i].root));
- if (!(source = e_bconf_get_path (config_xmldb, remap_list[i].root)))
- continue;
-
- map = remap_list[i].map;
- for (j = 0; map[j].from; j++) {
- if (map[j].type & E_GCONF_MAP_LIST) {
- /* collapse a multi-entry indexed field into a list */
- list = NULL;
- k = 0;
- do {
- path = get_name (map[j].from, k);
- val = e_bconf_get_value (source, path);
- d(printf ("finding path '%s' = '%s'\n", path, val));
- g_free (path);
- if (val) {
- switch (map[j].type & E_GCONF_MAP_MASK) {
- case E_GCONF_MAP_BOOL:
- case E_GCONF_MAP_INT:
- list = g_slist_append (list, GINT_TO_POINTER (atoi (val)));
- break;
- case E_GCONF_MAP_STRING:
- d(printf (" -> '%s'\n", e_bconf_hex_decode (val)));
- list = g_slist_append (list, e_bconf_hex_decode (val));
- break;
- }
-
- g_free (val);
- k++;
- }
- } while (val);
-
- if (list) {
- path = g_strdup_printf ("/apps/evolution/%s", map[j].to);
- gconf_client_set_list (gconf, path, gconf_type[map[j].type & E_GCONF_MAP_MASK], list, NULL);
- g_free (path);
- if ((map[j].type & E_GCONF_MAP_MASK) == E_GCONF_MAP_STRING)
- g_slist_foreach (list, (GFunc) g_free, NULL);
- g_slist_free (list);
- }
-
- continue;
- } else if (map[j].type == E_GCONF_MAP_ANYLIST) {
- val = NULL;
- } else {
- if (!(val = e_bconf_get_value (source, map[j].from)))
- continue;
- }
-
- d(printf (" %s = '%s' -> %s [%d]\n",
- map[j].from,
- val == NULL ? "(null)" : val,
- map[j].to,
- map[j].type));
-
- path = g_strdup_printf ("/apps/evolution/%s", map[j].to);
- switch (map[j].type) {
- case E_GCONF_MAP_BOOL:
- gconf_client_set_bool (gconf, path, atoi (val), NULL);
- break;
- case E_GCONF_MAP_BOOLNOT:
- gconf_client_set_bool (gconf, path, !atoi (val), NULL);
- break;
- case E_GCONF_MAP_INT:
- gconf_client_set_int (gconf, path, atoi (val), NULL);
- break;
- case E_GCONF_MAP_STRING:
- tmp = e_bconf_hex_decode (val);
- gconf_client_set_string (gconf, path, tmp, NULL);
- g_free (tmp);
- break;
- case E_GCONF_MAP_SIMPLESTRING:
- gconf_client_set_string (gconf, path, val, NULL);
- break;
- case E_GCONF_MAP_FLOAT:
- gconf_client_set_float (gconf, path, strtod (val, NULL), NULL);
- break;
- case E_GCONF_MAP_STRLIST: {
- char *v = e_bconf_hex_decode (val);
- char **t = g_strsplit (v, " !<-->! ", 8196);
-
- list = NULL;
- for (k = 0; t[k]; k++) {
- list = g_slist_append (list, t[k]);
- d(printf (" [%d] = '%s'\n", k, t[k]));
- }
-
- gconf_client_set_list (gconf, path, GCONF_VALUE_STRING, list, NULL);
- g_slist_free (list);
- g_strfreev (t);
- g_free (v);
- break; }
- case E_GCONF_MAP_ANYLIST: {
- xmlNodePtr node = source->children;
- list = NULL;
-
- /* find the entry node */
- while (node) {
- if (!strcmp (node->name, "entry")) {
- int found;
-
- if ((tmp = xmlGetProp (node, "name"))) {
- found = strcmp (tmp, map[j].from) == 0;
- xmlFree (tmp);
- if (found)
- break;
- }
- }
-
- node = node->next;
- }
-
- /* find the the any block */
- if (node) {
- node = node->children;
- while (node) {
- if (strcmp (node->name, "any") == 0)
- break;
- node = node->next;
- }
- }
-
- /* skip to the value inside it */
- if (node) {
- node = node->children;
- while (node) {
- if (strcmp (node->name, "value") == 0)
- break;
- node = node->next;
- }
- }
-
- if (node) {
- node = node->children;
- while (node) {
- if (strcmp (node->name, "value") == 0)
- list = g_slist_append (list, xmlNodeGetContent (node));
- node = node->next;
- }
- }
-
- /* & store */
- if (list) {
- gconf_client_set_list (gconf, path, GCONF_VALUE_STRING, list, NULL);
- while (list) {
- l = list->next;
- xmlFree (list->data);
- g_slist_free_1 (list);
- list = l;
- }
- }
-
- break; }
- case E_GCONF_MAP_COLOUR:
- sprintf (buf, "#%06x", atoi (val) & 0xffffff);
- gconf_client_set_string (gconf, path, buf, NULL);
- break;
- }
-
- /* FIXME: handle errors */
- g_free (path);
- g_free (val);
- }
- }
-
- return 0;
-}
diff --git a/e-util/e-bconf-map.h b/e-util/e-bconf-map.h
deleted file mode 100644
index 8db5771401..0000000000
--- a/e-util/e-bconf-map.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifndef __E_BCONF_MAP_H__
-#define __E_BCONF_MAP_H__
-
-#include <gconf/gconf-client.h>
-
-#include <libxml/tree.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-enum {
- E_BCONF_MAP_END = 0, /* end of table */
- E_BCONF_MAP_BOOL, /* bool -> prop of name 'to' value true or false */
- E_BCONF_MAP_LONG, /* long -> prop of name 'to' value a long */
- E_BCONF_MAP_STRING, /* string -> prop of name 'to' */
- E_BCONF_MAP_ENUM, /* long/bool -> prop of name 'to', with the value indexed into the child map table's from field */
- E_BCONF_MAP_CHILD, /* a new child of name 'to' */
- E_BCONF_MAP_MASK = 0x3f,
- E_BCONF_MAP_CONTENT = 0x80, /* if set, create a new node of name 'to' instead of a property */
-};
-
-typedef struct _e_bconf_map {
- char *from;
- char *to;
- int type;
- struct _e_bconf_map *child;
-} e_bconf_map_t;
-
-
-char *e_bconf_hex_decode (const char *val);
-char *e_bconf_url_decode (const char *val);
-
-xmlNodePtr e_bconf_get_path (xmlDocPtr doc, const char *path);
-xmlNodePtr e_bconf_get_entry (xmlNodePtr root, const char *name);
-
-char *e_bconf_get_value (xmlNodePtr root, const char *name);
-char *e_bconf_get_bool (xmlNodePtr root, const char *name);
-char *e_bconf_get_long (xmlNodePtr root, const char *name);
-char *e_bconf_get_string (xmlNodePtr root, const char *name);
-
-int e_bconf_import_xml_blob (GConfClient *gconf, xmlDocPtr config_xmldb, e_bconf_map_t *map,
- const char *bconf_path, const char *gconf_path,
- const char *name, const char *idparam);
-
-
-enum {
- E_GCONF_MAP_BOOL,
- E_GCONF_MAP_BOOLNOT,
- E_GCONF_MAP_INT,
- E_GCONF_MAP_STRING,
- E_GCONF_MAP_SIMPLESTRING, /* a non-encoded string */
- E_GCONF_MAP_COLOUR,
- E_GCONF_MAP_FLOAT, /* bloody floats, who uses floats ... idiots */
- E_GCONF_MAP_STRLIST, /* strings separated to !<-->! -> gconf list */
- E_GCONF_MAP_ANYLIST, /* corba sequence corba string -> gconf list */
- E_GCONF_MAP_MASK = 0x7f,
- E_GCONF_MAP_LIST = 0x80 /* from includes a %i field for the index of the key, to be converted to a list of type MAP_* */
-};
-
-typedef struct {
- char *from;
- char *to;
- int type;
-} e_gconf_map_t;
-
-typedef struct {
- char *root;
- e_gconf_map_t *map;
-} e_gconf_map_list_t;
-
-int e_bconf_import (GConfClient *gconf, xmlDocPtr config_xmldb, e_gconf_map_list_t *remap_list);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_BCONF_MAP_H__ */
diff --git a/e-util/e-categories-config.c b/e-util/e-categories-config.c
deleted file mode 100644
index af5961ef5d..0000000000
--- a/e-util/e-categories-config.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Categories configuration.
- *
- * Author:
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 2001, Ximian, Inc.
- */
-
-#include <string.h>
-#include <gtk/gtkdialog.h>
-#include <libgnome/gnome-i18n.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <libedataserver/e-categories.h>
-#include <libedataserverui/e-categories-dialog.h>
-#include "e-categories-config.h"
-
-static GHashTable *icons_table = NULL;
-
-/**
- * e_categories_config_get_icon_for:
- * @category: Category for which to get the icon.
- * @icon: A pointer to where the pixmap will be returned.
- * @mask: A pointer to where the mask will be returned.
- *
- * Returns the icon (and associated mask) configured for the
- * given category.
- */
-gboolean
-e_categories_config_get_icon_for (const char *category, GdkPixmap **pixmap, GdkBitmap **mask)
-{
- char *icon_file;
- GdkPixbuf *pixbuf;
- GdkBitmap *tmp_mask;
-
- g_return_val_if_fail (pixmap != NULL, FALSE);
-
- icon_file = (char *) e_categories_get_icon_file_for (category);
- if (!icon_file) {
- *pixmap = NULL;
- if (mask != NULL)
- *mask = NULL;
- return FALSE;
- }
-
- /* load the icon in our list */
- pixbuf = gdk_pixbuf_new_from_file (icon_file, NULL);
- if (!pixbuf) {
- *pixmap = NULL;
- if (mask != NULL)
- *mask = NULL;
- return FALSE;
- }
-
- /* render the pixbuf to the pixmap and mask passed */
- gdk_pixbuf_render_pixmap_and_mask (pixbuf, pixmap, &tmp_mask, 1);
- if (mask != NULL)
- *mask = tmp_mask;
-
- return TRUE;
-}
-
-/**
- * e_categories_config_open_dialog_for_entry:
- * entry: A GtkEntry on which to get/set the categories list.
- *
- * This is a self-contained function that lets you open a popup dialog for
- * the user to select a list of categories.
- *
- * The @entry parameter is used, at initialization time, as the list of
- * initial categories that are selected in the categories selection dialog.
- * Then, when the user commits its changes, the list of selected categories
- * is put back on the entry widget.
- */
-void
-e_categories_config_open_dialog_for_entry (GtkEntry *entry)
-{
- GtkDialog *dialog;
- const char *text;
- char *categories;
- int result;
-
- g_return_if_fail (entry != NULL);
- g_return_if_fail (GTK_IS_ENTRY (entry));
-
- text = gtk_entry_get_text (GTK_ENTRY (entry));
- dialog = GTK_DIALOG (e_categories_dialog_new (text));
-
- gtk_window_set_transient_for (GTK_WINDOW (dialog), gtk_widget_get_toplevel (GTK_WIDGET (entry)));
-
- /* run the dialog */
- result = gtk_dialog_run (dialog);
-
- if (result == GTK_RESPONSE_OK) {
- categories = e_categories_dialog_get_categories (E_CATEGORIES_DIALOG (dialog));
- gtk_entry_set_text (GTK_ENTRY (entry), categories);
- }
-
- gtk_object_destroy (GTK_OBJECT (dialog));
-}
diff --git a/e-util/e-categories-config.h b/e-util/e-categories-config.h
deleted file mode 100644
index ed6b5639ae..0000000000
--- a/e-util/e-categories-config.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Categories configuration.
- *
- * Author:
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 2001, Ximian, Inc.
- */
-
-#ifndef __E_CATEGORIES_CONFIG_H__
-#define __E_CATEGORIES_CONFIG_H__
-
-#include <glib.h>
-#include <gdk/gdk.h>
-#include <gtk/gtkentry.h>
-
-G_BEGIN_DECLS
-
-gboolean e_categories_config_get_icon_for (const char *category,
- GdkPixmap **icon,
- GdkBitmap **mask);
-void e_categories_config_open_dialog_for_entry (GtkEntry *entry);
-
-G_END_DECLS
-
-#endif
diff --git a/e-util/e-categories-master-list-wombat.c b/e-util/e-categories-master-list-wombat.c
deleted file mode 100644
index 9e45199877..0000000000
--- a/e-util/e-categories-master-list-wombat.c
+++ /dev/null
@@ -1,183 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-categories-master-list.c: the master list of categories.
- *
- * Authors:
- * Chris Lahey <clahey@ximian.com>
- *
- * (C) 1999, 2000 Ximian, Inc.
- */
-#include <config.h>
-
-#include "e-categories-master-list-wombat.h"
-#include "e-categories-config.h"
-#include "e-config-listener.h"
-
-#include <libxml/tree.h>
-#include <libxml/parser.h>
-
-#define PARENT_TYPE e_categories_master_list_array_get_type ()
-
-#define d(x)
-
-struct _ECategoriesMasterListWombatPriv {
- EConfigListener *listener;
- guint listener_id;
-};
-
-static ECategoriesMasterListArrayClass *parent_class;
-
-static void
-ecmlw_load (ECategoriesMasterListWombat *ecmlw)
-{
- char *string;
- gboolean def;
-
- string = e_config_listener_get_string_with_default (ecmlw->priv->listener,
- "/apps/evolution/general/category_master_list",
- NULL,
- &def);
- /* parse the XML string */
- if (!def) {
- e_categories_master_list_array_from_string (E_CATEGORIES_MASTER_LIST_ARRAY (ecmlw),
- string);
- }
-
- d(g_print ("load: %s\n", string?string:"(nil)"));
-
- g_free (string);
-}
-
-static void
-ecmlw_save (ECategoriesMasterListWombat *ecmlw)
-{
- char *string;
-
- string = e_categories_master_list_array_to_string (E_CATEGORIES_MASTER_LIST_ARRAY (ecmlw));
-
- d(g_print ("save: %s\n", string));
-
- e_config_listener_set_string (ecmlw->priv->listener,
- "/apps/evolution/general/category_master_list",
- string);
-
- g_free (string);
-}
-
-/**
- * ecmlw_commit:
- * @ecml: the master list to remove from.
- */
-static void
-ecmlw_commit (ECategoriesMasterList *ecml)
-{
- ECategoriesMasterListWombat *ecmlw = E_CATEGORIES_MASTER_LIST_WOMBAT (ecml);
-
- ((ECategoriesMasterListClass *) parent_class)->commit (ecml);
-
- ecmlw_save (ecmlw);
-}
-
-
-/**
- * ecmlw_reset:
- * @ecml: the master list to reset.
- */
-static void
-ecmlw_reset (ECategoriesMasterList *ecml)
-{
- ECategoriesMasterListWombat *ecmlw = E_CATEGORIES_MASTER_LIST_WOMBAT (ecml);
-
- ((ECategoriesMasterListClass *) parent_class)->reset (ecml);
-
- ecmlw_save (ecmlw);
-}
-
-static void
-ecmlw_dispose (GObject *object)
-{
- ECategoriesMasterListWombat *ecmlw = E_CATEGORIES_MASTER_LIST_WOMBAT (object);
-
- if (ecmlw->priv) {
- /* remove the listener */
- g_signal_handler_disconnect (ecmlw->priv->listener,
- ecmlw->priv->listener_id);
-
- g_object_unref (ecmlw->priv->listener);
-
- g_free (ecmlw->priv);
- ecmlw->priv = NULL;
- }
-
- if (G_OBJECT_CLASS (parent_class)->dispose)
- (* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-
-static void
-ecmlw_class_init (GObjectClass *object_class)
-{
- ECategoriesMasterListClass *ecml_class = E_CATEGORIES_MASTER_LIST_CLASS(object_class);
-
- parent_class = g_type_class_ref (PARENT_TYPE);
-
- ecml_class->commit = ecmlw_commit;
-
- ecml_class->reset = ecmlw_reset ;
-
- object_class->dispose = ecmlw_dispose;
-}
-
-static void
-property_change_cb (EConfigListener *listener,
- char *key,
- gpointer user_data)
-{
- ecmlw_load (user_data);
-}
-
-static void
-ecmlw_init (ECategoriesMasterListWombat *ecmlw)
-{
- ecmlw->priv = g_new (ECategoriesMasterListWombatPriv, 1);
- ecmlw->priv->listener = e_config_listener_new ();
-
- /* add a listener */
- ecmlw->priv->listener_id =
- g_signal_connect (ecmlw->priv->listener,
- "key_changed",
- G_CALLBACK (property_change_cb),
- ecmlw);
-
- ecmlw_load (ecmlw);
-}
-
-GType
-e_categories_master_list_wombat_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (ECategoriesMasterListWombatClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) ecmlw_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (ECategoriesMasterListWombat),
- 0, /* n_preallocs */
- (GInstanceInitFunc) ecmlw_init,
- };
-
- type = g_type_register_static (PARENT_TYPE, "ECategoriesMasterListWombat", &info, 0);
- }
-
- return type;
-}
-
-ECategoriesMasterList *
-e_categories_master_list_wombat_new (void)
-{
- return E_CATEGORIES_MASTER_LIST (g_object_new (E_TYPE_CATEGORIES_MASTER_LIST_WOMBAT, NULL));
-}
diff --git a/e-util/e-categories-master-list-wombat.h b/e-util/e-categories-master-list-wombat.h
deleted file mode 100644
index 024d7644e7..0000000000
--- a/e-util/e-categories-master-list-wombat.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-#ifndef _E_CATEGORIES_MASTER_LIST_WOMBAT_H_
-#define _E_CATEGORIES_MASTER_LIST_WOMBAT_H_
-
-#include <gal/widgets/e-categories-master-list-array.h>
-
-G_BEGIN_DECLS
-
-#define E_TYPE_CATEGORIES_MASTER_LIST_WOMBAT (e_categories_master_list_wombat_get_type ())
-#define E_CATEGORIES_MASTER_LIST_WOMBAT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_CATEGORIES_MASTER_LIST_WOMBAT, ECategoriesMasterListWombat))
-#define E_CATEGORIES_MASTER_LIST_WOMBAT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), E_TYPE_CATEGORIES_MASTER_LIST_WOMBAT, ECategoriesMasterListWombatClass))
-#define E_IS_CATEGORIES_MASTER_LIST_WOMBAT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_CATEGORIES_MASTER_LIST_WOMBAT))
-#define E_IS_CATEGORIES_MASTER_LIST_WOMBAT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_CATEGORIES_MASTER_LIST_WOMBAT))
-
-typedef struct _ECategoriesMasterListWombatPriv ECategoriesMasterListWombatPriv;
-
-typedef struct {
- ECategoriesMasterListArray base;
- ECategoriesMasterListWombatPriv *priv;
-} ECategoriesMasterListWombat;
-
-typedef struct {
- ECategoriesMasterListArrayClass parent_class;
-} ECategoriesMasterListWombatClass;
-
-GType e_categories_master_list_wombat_get_type (void);
-ECategoriesMasterList *e_categories_master_list_wombat_new (void);
-
-G_END_DECLS
-
-#endif /* _E_CATEGORIES_MASTER_LIST_WOMBAT_H_ */
diff --git a/e-util/e-component-listener.c b/e-util/e-component-listener.c
deleted file mode 100644
index 1e7027f33d..0000000000
--- a/e-util/e-component-listener.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Component listener.
- *
- * Author:
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 2002, Ximian, Inc.
- */
-
-#include <bonobo/bonobo-exception.h>
-#include <bonobo/bonobo-object.h>
-#include "e-component-listener.h"
-#include <libgnome/gnome-i18n.h>
-
-#define PARENT_TYPE GTK_TYPE_OBJECT
-
-struct _EComponentListenerPrivate {
- Bonobo_Unknown component;
-};
-
-static void e_component_listener_class_init (EComponentListenerClass *klass);
-static void e_component_listener_init (EComponentListener *cl, EComponentListenerClass *klass);
-static void e_component_listener_finalize (GObject *object);
-
-static GObjectClass *parent_class = NULL;
-static GList *watched_connections = NULL;
-
-enum {
- COMPONENT_DIED,
- LAST_SIGNAL
-};
-
-static guint comp_listener_signals[LAST_SIGNAL];
-
-static void
-connection_listen_cb (gpointer object, gpointer user_data)
-{
- GList *l, *next = NULL;
- EComponentListener *cl;
-
- for (l = watched_connections; l != NULL; l = next) {
- next = l->next;
- cl = l->data;
-
- switch (ORBit_small_get_connection_status (cl->priv->component)) {
- case ORBIT_CONNECTION_DISCONNECTED :
- watched_connections = g_list_delete_link (watched_connections, l);
-
- g_object_ref (cl);
- g_signal_emit (cl, comp_listener_signals[COMPONENT_DIED], 0);
- cl->priv->component = CORBA_OBJECT_NIL;
- g_object_unref (cl);
- break;
- default :
- break;
- }
- }
-}
-
-static void
-e_component_listener_class_init (EComponentListenerClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_peek_parent (klass);
-
- object_class->finalize = e_component_listener_finalize;
- klass->component_died = NULL;
-
- comp_listener_signals[COMPONENT_DIED] =
- g_signal_new ("component_died",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EComponentListenerClass, component_died),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-}
-
-static void
-e_component_listener_init (EComponentListener *cl, EComponentListenerClass *klass)
-{
- /* allocate internal structure */
- cl->priv = g_new (EComponentListenerPrivate, 1);
- cl->priv->component = CORBA_OBJECT_NIL;
-}
-
-static void
-e_component_listener_finalize (GObject *object)
-{
- EComponentListener *cl = (EComponentListener *) object;
-
- g_return_if_fail (E_IS_COMPONENT_LISTENER (cl));
-
- watched_connections = g_list_remove (watched_connections, cl);
-
- if (cl->priv->component != CORBA_OBJECT_NIL)
- cl->priv->component = CORBA_OBJECT_NIL;
-
- /* free memory */
- g_free (cl->priv);
- cl->priv = NULL;
-
- if (G_OBJECT_CLASS (parent_class)->finalize)
- (* G_OBJECT_CLASS (parent_class)->finalize) (object);
-}
-
-GType
-e_component_listener_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static GTypeInfo info = {
- sizeof (EComponentListenerClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) e_component_listener_class_init,
- NULL, NULL,
- sizeof (EComponentListener),
- 0,
- (GInstanceInitFunc) e_component_listener_init
- };
- type = g_type_register_static (G_TYPE_OBJECT, "EComponentListener", &info, 0);
- }
-
- return type;
-}
-
-/**
- * e_component_listener_new
- * @comp: Component to listen for.
- *
- * Create a new #EComponentListener object, which allows to listen
- * for a given component and get notified when that component dies.
- *
- * Returns: a component listener object.
- */
-EComponentListener *
-e_component_listener_new (Bonobo_Unknown comp)
-{
- EComponentListener *cl;
-
- g_return_val_if_fail (comp != NULL, NULL);
-
- cl = g_object_new (E_COMPONENT_LISTENER_TYPE, NULL);
- cl->priv->component = comp;
-
- /* watch the connection */
- ORBit_small_listen_for_broken (comp, G_CALLBACK (connection_listen_cb), cl);
- watched_connections = g_list_prepend (watched_connections, cl);
-
- return cl;
-}
-
-Bonobo_Unknown
-e_component_listener_get_component (EComponentListener *cl)
-{
- g_return_val_if_fail (E_IS_COMPONENT_LISTENER (cl), CORBA_OBJECT_NIL);
- return cl->priv->component;
-}
-
-void
-e_component_listener_set_component (EComponentListener *cl, Bonobo_Unknown comp)
-{
- g_return_if_fail (E_IS_COMPONENT_LISTENER (cl));
-
- cl->priv->component = comp;
- ORBit_small_listen_for_broken (comp, G_CALLBACK (connection_listen_cb), cl);
-}
diff --git a/e-util/e-component-listener.h b/e-util/e-component-listener.h
deleted file mode 100644
index 3f5694ecd0..0000000000
--- a/e-util/e-component-listener.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Component listener
- *
- * Author:
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 2002, Ximian, Inc.
- */
-
-#ifndef __E_COMPONENT_LISTENER_H__
-#define __E_COMPONENT_LISTENER_H__
-
-#include <glib-object.h>
-#include <bonobo/Bonobo.h>
-
-G_BEGIN_DECLS
-
-#define E_COMPONENT_LISTENER_TYPE (e_component_listener_get_type ())
-#define E_COMPONENT_LISTENER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_COMPONENT_LISTENER_TYPE, EComponentListener))
-#define E_COMPONENT_LISTENER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), E_COMPONENT_LISTENER_TYPE, EComponentListenerClass))
-#define E_IS_COMPONENT_LISTENER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_COMPONENT_LISTENER_TYPE))
-#define E_IS_COMPONENT_LISTENER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_COMPONENT_LISTENER_TYPE))
-
-typedef struct _EComponentListenerPrivate EComponentListenerPrivate;
-
-typedef struct {
- GObject object;
- EComponentListenerPrivate *priv;
-} EComponentListener;
-
-typedef struct {
- GObjectClass parent_class;
-
- void (* component_died) (EComponentListener *cl);
-} EComponentListenerClass;
-
-GType e_component_listener_get_type (void);
-EComponentListener *e_component_listener_new (Bonobo_Unknown comp);
-
-Bonobo_Unknown e_component_listener_get_component (EComponentListener *cl);
-void e_component_listener_set_component (EComponentListener *cl,
- Bonobo_Unknown comp);
-
-G_END_DECLS
-
-#endif
diff --git a/e-util/e-config-listener.c b/e-util/e-config-listener.c
deleted file mode 100644
index ecc1b45fce..0000000000
--- a/e-util/e-config-listener.c
+++ /dev/null
@@ -1,607 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Configuration component listener
- *
- * Author:
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 2002, Ximian, Inc.
- */
-
-#include <string.h>
-#include <gconf/gconf-client.h>
-#include "e-config-listener.h"
-
-#define PARENT_TYPE G_TYPE_OBJECT
-
-typedef struct {
- EConfigListener *cl;
- guint lid;
- char *key;
- GConfValueType type;
- union {
- gboolean v_bool;
- float v_float;
- long v_long;
- char *v_str;
- } value;
- gboolean used_default;
-} KeyData;
-
-struct _EConfigListenerPrivate {
- GConfClient *db;
- GHashTable *keys;
-};
-
-static void e_config_listener_class_init (EConfigListenerClass *klass);
-static void e_config_listener_init (EConfigListener *cl, EConfigListenerClass *klass);
-static void e_config_listener_finalize (GObject *object);
-
-static GObjectClass *parent_class = NULL;
-
-enum {
- KEY_CHANGED,
- LAST_SIGNAL
-};
-
-static guint config_listener_signals[LAST_SIGNAL];
-
-static void
-e_config_listener_class_init (EConfigListenerClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_peek_parent (klass);
-
- object_class->finalize = e_config_listener_finalize;
- klass->key_changed = NULL;
-
- config_listener_signals[KEY_CHANGED] =
- g_signal_new ("key_changed",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EConfigListenerClass, key_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE, 1, G_TYPE_STRING);
-
- /* make sure GConf is initialized */
- if (!gconf_is_initialized ())
- gconf_init (0, NULL, NULL);
-}
-
-static void
-e_config_listener_init (EConfigListener *cl, EConfigListenerClass *klass)
-{
- /* allocate internal structure */
- cl->priv = g_new0 (EConfigListenerPrivate, 1);
-
- cl->priv->keys = g_hash_table_new (g_str_hash, g_str_equal);
- cl->priv->db = gconf_client_get_default ();
-}
-
-static void
-free_key_hash (gpointer key, gpointer value, gpointer user_data)
-{
- KeyData *kd = (KeyData *) value;
-
- g_return_if_fail (kd != NULL);
-
- gconf_client_notify_remove (kd->cl->priv->db, kd->lid);
-
- g_free (kd->key);
- switch (kd->type) {
- case GCONF_VALUE_STRING :
- g_free (kd->value.v_str);
- break;
- default :
- break;
- }
-
- g_free (kd);
-}
-
-static void
-e_config_listener_finalize (GObject *object)
-{
- EConfigListener *cl = (EConfigListener *) object;
-
- g_return_if_fail (E_IS_CONFIG_LISTENER (cl));
-
- g_hash_table_foreach (cl->priv->keys, (GHFunc) free_key_hash, NULL);
- g_hash_table_destroy (cl->priv->keys);
- cl->priv->keys = NULL;
-
- if (cl->priv->db != NULL) {
- g_object_unref (G_OBJECT (cl->priv->db));
- cl->priv->db = NULL;
- }
-
- g_free (cl->priv);
- cl->priv = NULL;
-
- if (G_OBJECT_CLASS (parent_class)->finalize)
- (* G_OBJECT_CLASS (parent_class)->finalize) (object);
-}
-
-GType
-e_config_listener_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (EConfigListenerClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) e_config_listener_class_init,
- NULL,
- NULL,
- sizeof (EConfigListener),
- 0,
- (GInstanceInitFunc) e_config_listener_init
- };
- type = g_type_register_static (PARENT_TYPE, "EConfigListener", &info, 0);
- }
-
- return type;
-}
-
-/**
- * e_config_listener_new
- *
- * Create a new configuration listener, which is an object which
- * allows to listen for changes in the configuration database. It keeps
- * an updated copy of all requested configuration entries, so that
- * access is much quicker and instantaneous.
- *
- * Returns: the newly created listener.
- */
-EConfigListener *
-e_config_listener_new (void)
-{
- EConfigListener *cl;
-
- cl = g_object_new (E_CONFIG_LISTENER_TYPE, NULL);
- return cl;
-}
-
-static void
-property_change_cb (GConfEngine *engine,
- guint cnxn_id,
- GConfEntry *entry,
- gpointer user_data)
-{
- KeyData *kd = (KeyData *) user_data;
-
- g_return_if_fail (entry != NULL);
- g_return_if_fail (kd != NULL);
-
- /* free previous value */
- if (kd->type == GCONF_VALUE_STRING)
- g_free (kd->value.v_str);
-
- /* set new value */
- if (entry->value->type == GCONF_VALUE_BOOL) {
- kd->type = GCONF_VALUE_BOOL;
- kd->value.v_bool = gconf_value_get_bool (entry->value);
- } else if (entry->value->type == GCONF_VALUE_FLOAT) {
- kd->type = GCONF_VALUE_FLOAT;
- kd->value.v_float = gconf_value_get_float (entry->value);
- } else if (entry->value->type == GCONF_VALUE_INT) {
- kd->type = GCONF_VALUE_INT;
- kd->value.v_long = gconf_value_get_int (entry->value);
- } else if (entry->value->type == GCONF_VALUE_STRING) {
- kd->type = GCONF_VALUE_STRING;
- kd->value.v_str = g_strdup (gconf_value_get_string (entry->value));
- } else
- return;
-
- g_signal_emit (G_OBJECT (kd->cl), config_listener_signals[KEY_CHANGED], 0, kd->key);
-}
-
-static KeyData *
-add_key (EConfigListener *cl, const char *key, GConfValueType type,
- gpointer value, gboolean used_default)
-{
- KeyData *kd;
-
- /* add the key to our hash table */
- kd = g_new0 (KeyData, 1);
- kd->cl = cl;
- kd->key = g_strdup (key);
- kd->type = type;
- switch (type) {
- case GCONF_VALUE_BOOL :
- memcpy (&kd->value.v_bool, value, sizeof (gboolean));
- break;
- case GCONF_VALUE_FLOAT :
- memcpy (&kd->value.v_float, value, sizeof (float));
- break;
- case GCONF_VALUE_INT :
- memcpy (&kd->value.v_long, value, sizeof (long));
- break;
- case GCONF_VALUE_STRING :
- kd->value.v_str = g_strdup ((const char *) value);
- break;
- default :
- break;
- }
-
- kd->used_default = used_default;
-
- /* add the listener for changes */
- gconf_client_add_dir (cl->priv->db, key, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
- kd->lid = gconf_client_notify_add (cl->priv->db, key,
- (GConfClientNotifyFunc) property_change_cb,
- kd, NULL, NULL);
-
- g_hash_table_insert (cl->priv->keys, kd->key, kd);
-
- return kd;
-}
-
-gboolean
-e_config_listener_get_boolean (EConfigListener *cl, const char *key)
-{
- return e_config_listener_get_boolean_with_default (cl, key, FALSE, NULL);
-}
-
-gboolean
-e_config_listener_get_boolean_with_default (EConfigListener *cl,
- const char *key,
- gboolean def,
- gboolean *used_default)
-{
- GConfValue *conf_value;
- gboolean value;
- KeyData *kd;
- gpointer orig_key, orig_value;
-
- g_return_val_if_fail (E_IS_CONFIG_LISTENER (cl), FALSE);
- g_return_val_if_fail (key != NULL, FALSE);
-
- /* search for the key in our hash table */
- if (!g_hash_table_lookup_extended (cl->priv->keys, key, &orig_key, &orig_value)) {
- /* not found, so retrieve it from the configuration database */
- conf_value = gconf_client_get (cl->priv->db, key, NULL);
- if (conf_value) {
- value = gconf_value_get_bool (conf_value);
- kd = add_key (cl, key, GCONF_VALUE_BOOL, &value, FALSE);
- gconf_value_free (conf_value);
-
- if (used_default != NULL)
- *used_default = FALSE;
- } else {
- value = def;
- kd = add_key (cl, key, GCONF_VALUE_BOOL, &def, TRUE);
-
- if (used_default != NULL)
- *used_default = TRUE;
- }
- } else {
- kd = (KeyData *) orig_value;
- g_assert (kd != NULL);
-
- if (kd->type == GCONF_VALUE_BOOL) {
- value = kd->value.v_bool;
- if (used_default != NULL)
- *used_default = kd->used_default;
- } else
- return FALSE;
- }
-
- return value;
-}
-
-float
-e_config_listener_get_float (EConfigListener *cl, const char *key)
-{
- return e_config_listener_get_float_with_default (cl, key, 0.0, NULL);
-}
-
-float
-e_config_listener_get_float_with_default (EConfigListener *cl,
- const char *key,
- float def,
- gboolean *used_default)
-{
- GConfValue *conf_value;
- float value;
- KeyData *kd;
- gpointer orig_key, orig_value;
-
- g_return_val_if_fail (E_IS_CONFIG_LISTENER (cl), -1);
- g_return_val_if_fail (key != NULL, -1);
-
- /* search for the key in our hash table */
- if (!g_hash_table_lookup_extended (cl->priv->keys, key, &orig_key, &orig_value)) {
- /* not found, so retrieve it from the configuration database */
- conf_value = gconf_client_get (cl->priv->db, key, NULL);
- if (conf_value) {
- value = gconf_value_get_float (conf_value);
- kd = add_key (cl, key, GCONF_VALUE_FLOAT, &value, FALSE);
- gconf_value_free (conf_value);
-
- if (used_default != NULL)
- *used_default = FALSE;
- } else {
- value = def;
- kd = add_key (cl, key, GCONF_VALUE_FLOAT, &def, TRUE);
-
- if (used_default != NULL)
- *used_default = TRUE;
- }
- } else {
- kd = (KeyData *) orig_value;
- g_assert (kd != NULL);
-
- if (kd->type == GCONF_VALUE_FLOAT) {
- value = kd->value.v_float;
- if (used_default != NULL)
- *used_default = kd->used_default;
- } else
- return -1;
- }
-
- return value;
-}
-
-long
-e_config_listener_get_long (EConfigListener *cl, const char *key)
-{
- return e_config_listener_get_long_with_default (cl, key, 0, NULL);
-}
-
-long
-e_config_listener_get_long_with_default (EConfigListener *cl,
- const char *key,
- long def,
- gboolean *used_default)
-{
- GConfValue *conf_value;
- long value;
- KeyData *kd;
- gpointer orig_key, orig_value;
-
- g_return_val_if_fail (E_IS_CONFIG_LISTENER (cl), -1);
- g_return_val_if_fail (key != NULL, -1);
-
- /* search for the key in our hash table */
- if (!g_hash_table_lookup_extended (cl->priv->keys, key, &orig_key, &orig_value)) {
- /* not found, so retrieve it from the configuration database */
- conf_value = gconf_client_get (cl->priv->db, key, NULL);
- if (conf_value) {
- value = gconf_value_get_int (conf_value);
- kd = add_key (cl, key, GCONF_VALUE_INT, &value, FALSE);
- gconf_value_free (conf_value);
-
- if (used_default != NULL)
- *used_default = FALSE;
- } else {
- value = def;
- kd = add_key (cl, key, GCONF_VALUE_INT, &def, TRUE);
-
- if (used_default != NULL)
- *used_default = TRUE;
- }
- } else {
- kd = (KeyData *) orig_value;
- g_assert (kd != NULL);
-
- if (kd->type == GCONF_VALUE_INT) {
- value = kd->value.v_long;
- if (used_default != NULL)
- *used_default = kd->used_default;
- } else
- return -1;
- }
-
- return value;
-}
-
-char *
-e_config_listener_get_string (EConfigListener *cl, const char *key)
-{
- return e_config_listener_get_string_with_default (cl, key, NULL, NULL);
-}
-
-char *
-e_config_listener_get_string_with_default (EConfigListener *cl,
- const char *key,
- const char *def,
- gboolean *used_default)
-{
- GConfValue *conf_value;
- char *str;
- KeyData *kd;
- gpointer orig_key, orig_value;
-
- g_return_val_if_fail (E_IS_CONFIG_LISTENER (cl), NULL);
- g_return_val_if_fail (key != NULL, NULL);
-
- /* search for the key in our hash table */
- if (!g_hash_table_lookup_extended (cl->priv->keys, key, &orig_key, &orig_value)) {
- /* not found, so retrieve it from the configuration database */
- conf_value = gconf_client_get (cl->priv->db, key, NULL);
- if (conf_value) {
- str = g_strdup (gconf_value_get_string (conf_value));
- kd = add_key (cl, key, GCONF_VALUE_STRING, (gpointer) str, FALSE);
- gconf_value_free (conf_value);
-
- if (used_default != NULL)
- *used_default = FALSE;
- } else {
- str = g_strdup (def);
- kd = add_key (cl, key, GCONF_VALUE_STRING, (gpointer) str, TRUE);
-
- if (used_default != NULL)
- *used_default = TRUE;
- }
- } else {
- kd = (KeyData *) orig_value;
- g_assert (kd != NULL);
-
- if (kd->type == GCONF_VALUE_STRING) {
- str = g_strdup (kd->value.v_str);
- if (used_default != NULL)
- *used_default = kd->used_default;
- } else
- return NULL;
- }
-
- return str;
-}
-
-void
-e_config_listener_set_boolean (EConfigListener *cl, const char *key, gboolean value)
-{
- KeyData *kd;
- GError *err = NULL;
-
- g_return_if_fail (E_IS_CONFIG_LISTENER (cl));
- g_return_if_fail (key != NULL);
-
- /* check that the value is not the same */
- if (value == e_config_listener_get_boolean_with_default (cl, key, 0, NULL))
- return;
-
- gconf_client_set_bool (cl->priv->db, key, value, &err);
- if (err) {
- g_warning ("e_config_listener_set_bool: %s", err->message);
- g_error_free (err);
- } else {
- /* update the internal copy */
- kd = g_hash_table_lookup (cl->priv->keys, key);
- if (kd)
- kd->value.v_bool = value;
- }
-}
-
-void
-e_config_listener_set_float (EConfigListener *cl, const char *key, float value)
-{
- KeyData *kd;
- GError *err = NULL;
-
- g_return_if_fail (E_IS_CONFIG_LISTENER (cl));
- g_return_if_fail (key != NULL);
-
- /* check that the value is not the same */
- if (value == e_config_listener_get_float_with_default (cl, key, 0, NULL))
- return;
-
- gconf_client_set_float (cl->priv->db, key, value, &err);
- if (err) {
- g_warning ("e_config_listener_set_float: %s", err->message);
- g_error_free (err);
- } else {
- /* update the internal copy */
- kd = g_hash_table_lookup (cl->priv->keys, key);
- if (kd)
- kd->value.v_float = value;
- }
-}
-
-void
-e_config_listener_set_long (EConfigListener *cl, const char *key, long value)
-{
- KeyData *kd;
- GError *err = NULL;
-
- g_return_if_fail (E_IS_CONFIG_LISTENER (cl));
- g_return_if_fail (key != NULL);
-
- /* check that the value is not the same */
- if (value == e_config_listener_get_long_with_default (cl, key, 0, NULL))
- return;
-
- gconf_client_set_int (cl->priv->db, key, value, &err);
- if (err) {
- g_warning ("e_config_listener_set_long: %s", err->message);
- g_error_free (err);
- } else {
- /* update the internal copy */
- kd = g_hash_table_lookup (cl->priv->keys, key);
- if (kd)
- kd->value.v_long = value;
- }
-}
-
-void
-e_config_listener_set_string (EConfigListener *cl, const char *key, const char *value)
-{
- char *s1, *s2;
- KeyData *kd;
- GError *err = NULL;
-
- g_return_if_fail (E_IS_CONFIG_LISTENER (cl));
- g_return_if_fail (key != NULL);
-
- /* check that the value is not the same */
- s1 = (char *) value;
- s2 = e_config_listener_get_string_with_default (cl, key, NULL, NULL);
- if (!strcmp (s1 ? s1 : "", s2 ? s2 : "")) {
- g_free (s2);
- return;
- }
-
- g_free (s2);
-
- gconf_client_set_string (cl->priv->db, key, value, &err);
- if (err) {
- g_warning ("e_config_listener_set_bool: %s", err->message);
- g_error_free (err);
- } else {
- /* update the internal copy */
- kd = g_hash_table_lookup (cl->priv->keys, key);
- if (kd) {
- g_free (kd->value.v_str);
- kd->value.v_str = g_strdup (value);
- }
- }
-}
-
-void
-e_config_listener_remove_value (EConfigListener *cl, const char *key)
-{
- gpointer orig_key, orig_value;
-
- g_return_if_fail (E_IS_CONFIG_LISTENER (cl));
- g_return_if_fail (key != NULL);
-
- if (g_hash_table_lookup_extended (cl->priv->keys, key, &orig_key, &orig_value)) {
- KeyData *kd = orig_value;
-
- g_hash_table_remove (cl->priv->keys, key);
- g_free (kd->key);
- if (kd->type == GCONF_VALUE_STRING)
- g_free (kd->value.v_str);
- gconf_client_notify_remove (cl->priv->db, kd->lid);
-
- g_free (kd);
- }
-
- gconf_client_unset (cl->priv->db, key, NULL);
-}
-
-void
-e_config_listener_remove_dir (EConfigListener *cl, const char *dir)
-{
- GSList *slist, *iter;
- const gchar *key;
-
- g_return_if_fail (E_IS_CONFIG_LISTENER (cl));
- g_return_if_fail (dir != NULL);
-
- slist = gconf_client_all_entries (cl->priv->db, dir, NULL);
- for (iter = slist; iter != NULL; iter = iter->next) {
- GConfEntry *entry = iter->data;
-
- key = gconf_entry_get_key (entry);
- gconf_client_unset (cl->priv->db, key, NULL);
- gconf_entry_free (entry);
- }
-
- g_slist_free (slist);
-}
diff --git a/e-util/e-config-listener.h b/e-util/e-config-listener.h
deleted file mode 100644
index 9b331a7c8a..0000000000
--- a/e-util/e-config-listener.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Configuration component listener
- *
- * Author:
- * Rodrigo Moya <rodrigo@ximian.com>
- *
- * Copyright 2002, Ximian, Inc.
- */
-
-#ifndef __E_CONFIG_LISTENER_H__
-#define __E_CONFIG_LISTENER_H__
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define E_CONFIG_LISTENER_TYPE (e_config_listener_get_type ())
-#define E_CONFIG_LISTENER(o) (G_TYPE_CHECK_INSTANCECAST ((o), E_CONFIG_LISTENER_TYPE, EConfigListener))
-#define E_CONFIG_LISTENER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), E_CONFIG_LISTENER_TYPE, EConfigListenerClass))
-#define E_IS_CONFIG_LISTENER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_CONFIG_LISTENER_TYPE))
-#define E_IS_CONFIG_LISTENER_CLASS(k) (GT_TYPE_CHECK_CLASS_TYPE ((k), E_CONFIG_LISTENER_TYPE))
-
-typedef struct _EConfigListenerPrivate EConfigListenerPrivate;
-
-typedef struct {
- GObject object;
- EConfigListenerPrivate *priv;
-} EConfigListener;
-
-typedef struct {
- GObjectClass parent_class;
-
- void (* key_changed) (EConfigListener *cl, const char *key);
-} EConfigListenerClass;
-
-GType e_config_listener_get_type (void);
-EConfigListener *e_config_listener_new (void);
-
-gboolean e_config_listener_get_boolean (EConfigListener *cl, const char *key);
-gboolean e_config_listener_get_boolean_with_default (EConfigListener *cl,
- const char *key,
- gboolean def,
- gboolean *used_default);
-float e_config_listener_get_float (EConfigListener *cl, const char *key);
-float e_config_listener_get_float_with_default (EConfigListener *cl,
- const char *key,
- float def,
- gboolean *used_default);
-long e_config_listener_get_long (EConfigListener *cl, const char *key);
-long e_config_listener_get_long_with_default (EConfigListener *cl,
- const char *key,
- long def,
- gboolean *used_default);
-char *e_config_listener_get_string (EConfigListener *cl, const char *key);
-char *e_config_listener_get_string_with_default (EConfigListener *cl,
- const char *key,
- const char *def,
- gboolean *used_default);
-void e_config_listener_set_boolean (EConfigListener *cl,
- const char *key,
- gboolean value);
-void e_config_listener_set_float (EConfigListener *cl,
- const char *key,
- float value);
-void e_config_listener_set_long (EConfigListener *cl,
- const char *key,
- long value);
-void e_config_listener_set_string (EConfigListener *cl,
- const char *key,
- const char *value);
-
-void e_config_listener_remove_value (EConfigListener *cl,
- const char *key);
-void e_config_listener_remove_dir (EConfigListener *cl,
- const char *dir);
-
-G_END_DECLS
-
-#endif
diff --git a/e-util/e-config.c b/e-util/e-config.c
deleted file mode 100644
index c628ae33dc..0000000000
--- a/e-util/e-config.c
+++ /dev/null
@@ -1,1480 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Michael Zucchi <notzed@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <stdlib.h>
-
-#include <glib.h>
-
-#include <gtk/gtknotebook.h>
-#include <gtk/gtkvbox.h>
-#include <gtk/gtkhbox.h>
-#include <gtk/gtktable.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkframe.h>
-#include <gtk/gtkalignment.h>
-
-#include <libgnomeui/gnome-druid.h>
-#include <libgnomeui/gnome-druid-page-standard.h>
-#include <libgnomeui/gnome-druid-page-edge.h>
-
-#include "e-config.h"
-
-#include <e-util/e-icon-factory.h>
-
-#include <libgnome/gnome-i18n.h>
-
-#define d(x)
-
-struct _EConfigFactory {
- struct _EConfigFactory *next, *prev;
-
- char *id;
- EConfigFactoryFunc factory;
- void *factory_data;
-};
-
-struct _menu_node {
- struct _menu_node *next, *prev;
-
- GSList *menu;
- EConfigItemsFunc free;
- EConfigItemsFunc abort;
- EConfigItemsFunc commit;
- void *data;
-};
-
-struct _widget_node {
- struct _widget_node *next, *prev;
-
- EConfig *config;
-
- struct _menu_node *context;
- EConfigItem *item;
- struct _GtkWidget *widget; /* widget created by the factory, if any */
- struct _GtkWidget *frame; /* if created by us */
-
- int empty:1; /* set if empty (i.e. hidden) */
-};
-
-struct _check_node {
- struct _check_node *next, *prev;
-
- char *pageid;
- EConfigCheckFunc check;
- void *data;
-};
-
-struct _EConfigPrivate {
- EDList menus;
- EDList widgets;
- EDList checks;
-
- struct _widget_node *druid_page; /* current druid page if using the druid */
-};
-
-static GObjectClass *ep_parent;
-
-static void
-ep_init(GObject *o)
-{
- EConfig *emp = (EConfig *)o;
- struct _EConfigPrivate *p;
-
- p = emp->priv = g_malloc0(sizeof(struct _EConfigPrivate));
-
- e_dlist_init(&p->menus);
- e_dlist_init(&p->widgets);
- e_dlist_init(&p->checks);
-}
-
-static void
-ep_finalise(GObject *o)
-{
- EConfig *emp = (EConfig *)o;
- struct _EConfigPrivate *p = emp->priv;
- struct _menu_node *mnode;
- struct _widget_node *wn;
- struct _check_node *cn;
-
- d(printf("finalising EConfig %p\n", o));
-
- g_free(emp->id);
-
- while ((mnode = (struct _menu_node *)e_dlist_remhead(&p->menus))) {
- if (mnode->free)
- mnode->free(emp, mnode->menu, mnode->data);
-
- g_free(mnode);
- }
-
- while ( (wn = (struct _widget_node *)e_dlist_remhead(&p->widgets)) ) {
- g_free(wn);
- }
-
- while ( (cn = (struct _check_node *)e_dlist_remhead(&p->widgets)) ) {
- g_free(cn->pageid);
- g_free(cn);
- }
-
- g_free(p);
-
- ((GObjectClass *)ep_parent)->finalize(o);
-}
-
-static void
-ec_target_free(EConfig *ep, EConfigTarget *t)
-{
- g_free(t);
- g_object_unref(ep);
-}
-
-static void
-ec_set_target(EConfig *emp, EConfigTarget *target)
-{
- if (emp->target)
- e_config_target_free(emp, target);
-
- emp->target = target;
-}
-
-static void
-ep_class_init(GObjectClass *klass)
-{
- d(printf("EConfig class init %p '%s'\n", klass, g_type_name(((GObjectClass *)klass)->g_type_class.g_type)));
-
- klass->finalize = ep_finalise;
- ((EConfigClass *)klass)->set_target = ec_set_target;
- ((EConfigClass *)klass)->target_free = ec_target_free;
-}
-
-static void
-ep_base_init(GObjectClass *klass)
-{
- e_dlist_init(&((EConfigClass *)klass)->factories);
-}
-
-/**
- * e_config_get_type:
- *
- * Standard GObject method. Used to subclass for the concrete
- * implementations.
- *
- * Return value: EConfig type.
- **/
-GType
-e_config_get_type(void)
-{
- static GType type = 0;
-
- if (type == 0) {
- static const GTypeInfo info = {
- sizeof(EConfigClass),
- (GBaseInitFunc)ep_base_init, NULL,
- (GClassInitFunc)ep_class_init, NULL, NULL,
- sizeof(EConfig), 0,
- (GInstanceInitFunc)ep_init
- };
- ep_parent = g_type_class_ref(G_TYPE_OBJECT);
- type = g_type_register_static(G_TYPE_OBJECT, "EConfig", &info, 0);
- }
-
- return type;
-}
-
-/**
- * e_config_construct:
- * @ep: The instance to initialise.
- * @type: The type of configuration manager, @E_CONFIG_BOOK or
- * @E_CONFIG_DRUID.
- * @id: The name of the configuration window this manager drives.
- *
- * Used by implementing classes to initialise base parameters.
- *
- * Return value: @ep is returned.
- **/
-EConfig *e_config_construct(EConfig *ep, int type, const char *id)
-{
- g_assert(type == E_CONFIG_BOOK || type == E_CONFIG_DRUID);
-
- ep->type = type;
- ep->id = g_strdup(id);
-
- return ep;
-}
-
-/**
- * e_config_add_items:
- * @ec: An initialised implementing instance of EConfig.
- * @items: A list of EConfigItem's to add to the configuration manager
- * @ec.
- * @commitfunc: If supplied, called to commit the configuration items
- * to persistent storage.
- * @abortfunc: If supplied, called to abort/undo the storage of these
- * items permanently.
- * @freefunc: If supplied, called to free the item list (and/or items)
- * once they are no longer needed.
- * @data: Data for the callback methods.
- *
- * Add new EConfigItems to the configuration window. Nothing will be
- * done with them until the widget is built.
- *
- * TODO: perhaps commit and abort should just be signals.
- **/
-void
-e_config_add_items(EConfig *ec, GSList *items, EConfigItemsFunc commitfunc, EConfigItemsFunc abortfunc, EConfigItemsFunc freefunc, void *data)
-{
- struct _menu_node *node;
-
- node = g_malloc(sizeof(*node));
- node->menu = items;
- node->commit = commitfunc;
- node->abort = abortfunc;
- node->free = freefunc;
- node->data = data;
- e_dlist_addtail(&ec->priv->menus, (EDListNode *)node);
-}
-
-/**
- * e_config_add_page_check:
- * @ec: Initialised implemeting instance of EConfig.
- * @pageid: pageid to check.
- * @check: checking callback.
- * @data: user-data for the callback.
- *
- * Add a page-checking function callback. It will be called to validate the
- * data in the given page or pages. If @pageid is NULL then it will be called
- * to validate every page, or the whole configuration window.
- *
- * In the latter case, the pageid in the callback will be either the
- * specific page being checked, or NULL when the whole config window
- * is being checked.
- *
- * The page check function is used to validate input before allowing
- * the druid to continue or the notebook to close.
- **/
-void
-e_config_add_page_check(EConfig *ec, const char *pageid, EConfigCheckFunc check, void *data)
-{
- struct _check_node *cn;
-
- cn = g_malloc0(sizeof(*cn));
- cn->pageid = g_strdup(pageid);
- cn->check = check;
- cn->data = data;
-
- e_dlist_addtail(&ec->priv->checks, (EDListNode *)cn);
-}
-
-static void
-ec_add_static_items(EConfig *ec)
-{
- struct _EConfigFactory *f;
- EConfigClass *klass = (EConfigClass *)G_OBJECT_GET_CLASS(ec);
-
- f = (struct _EConfigFactory *)klass->factories.head;
- while (f->next) {
- if (f->id == NULL
- || !strcmp(f->id, ec->id)) {
- f->factory(ec, f->factory_data);
- }
- f = f->next;
- }
-}
-
-static int
-ep_cmp(const void *ap, const void *bp)
-{
- struct _widget_node *a = *((void **)ap);
- struct _widget_node *b = *((void **)bp);
-
- return strcmp(a->item->path, b->item->path);
-}
-
-static void
-ec_druid_check_current(EConfig *ec)
-{
- g_return_if_fail(ec->priv->druid_page != NULL);
-
- if (e_config_page_check(ec, ec->priv->druid_page->item->path)) {
- gtk_widget_set_sensitive(((GnomeDruid *)ec->widget)->next, TRUE);
- } else {
- gtk_widget_set_sensitive(((GnomeDruid *)ec->widget)->next, FALSE);
- }
-}
-
-static void
-ec_druid_cancel(GnomeDruid *druid, struct _widget_node *wn)
-{
- d(printf("finishing druid, calling abort\n"));
- e_config_abort(wn->config);
-
- if (wn->config->window)
- gtk_widget_destroy(wn->config->window);
-}
-
-static void
-ec_druid_finish(GnomeDruidPage *page, GnomeDruid *druid, struct _widget_node *wn)
-{
- d(printf("finishing druid, calling commit\n"));
- e_config_commit(wn->config);
-
- /* TODO: allow the commit to fail? Do we care? */
- if (wn->config->window)
- gtk_widget_destroy(wn->config->window);
-}
-
-static void
-ec_druid_prepare(GnomeDruidPage *page, GnomeDruid *druid, struct _widget_node *wn)
-{
- d(printf("prepare page '%s'\n", wn->item->path));
- wn->config->priv->druid_page = wn;
- ec_druid_check_current(wn->config);
-}
-
-static gboolean
-ec_druid_prev(GnomeDruidPage *page, GnomeDruid *druid, struct _widget_node *wn)
-{
- EConfig *ec = wn->config;
-
- d(printf("prev page from '%s'\n", wn->item->path));
- if (wn->prev) {
- for (wn = wn->prev;wn->prev;wn=wn->prev) {
- if (!wn->empty
- && (wn->item->type == E_CONFIG_PAGE
- || wn->item->type == E_CONFIG_PAGE_START
- || wn->item->type == E_CONFIG_PAGE_FINISH))
- break;
- }
- }
-
- if (wn->prev) {
- d(printf(" is %s\n",wn->item->path));
- gnome_druid_set_page((GnomeDruid *)ec->widget, (GnomeDruidPage *)wn->frame);
- ec->priv->druid_page = wn;
- } else {
- /* do we need to indicate first? */
- ec->priv->druid_page = NULL;
- }
-
- return wn->prev != NULL;
-}
-
-static gboolean
-ec_druid_next(GnomeDruidPage *page, GnomeDruid *druid, struct _widget_node *wn)
-{
- EConfig *ec = wn->config;
-
- d(printf("next page from '%s'\n", wn->item->path));
- if (wn->next) {
- for (wn = wn->next;wn->next;wn=wn->next) {
- if (!wn->empty
- && (wn->item->type == E_CONFIG_PAGE
- || wn->item->type == E_CONFIG_PAGE_START
- || wn->item->type == E_CONFIG_PAGE_FINISH))
- break;
- }
- }
-
- if (wn->next) {
- d(printf(" is %s\n",wn->item->path));
- gnome_druid_set_page((GnomeDruid *)ec->widget, (GnomeDruidPage *)wn->frame);
- ec->priv->druid_page = wn;
- } else {
- /* do we need to indicate last? */
- ec->priv->druid_page = NULL;
- }
-
- return wn->next != NULL;
-}
-
-static void
-ec_rebuild(EConfig *emp)
-{
- struct _EConfigPrivate *p = emp->priv;
- struct _widget_node *wn, *sectionnode = NULL, *pagenode = NULL;
- GtkWidget *book = NULL, *page = NULL, *section = NULL, *root = NULL, *druid = NULL;
- int pageno = 0, sectionno = 0, itemno = 0;
-
- d(printf("target changed, rebuilding:\n"));
-
- /* TODO: This code is pretty complex, and will probably just
- * become more complex with time. It could possibly be split
- * into the two base types, but there would be a lot of code
- * duplication */
-
- for (wn = (struct _widget_node *)p->widgets.head;wn->next;wn=wn->next) {
- struct _EConfigItem *item = wn->item;
- GtkWidget *w;
-
- d(printf(" '%s'\n", item->path));
-
- /* If the last section doesn't contain anything, hide it */
- if (sectionnode != NULL
- && (item->type == E_CONFIG_PAGE_START
- || item->type == E_CONFIG_PAGE_FINISH
- || item->type == E_CONFIG_PAGE
- || item->type == E_CONFIG_SECTION
- || item->type == E_CONFIG_SECTION_TABLE)) {
- if ( (sectionnode->empty = itemno == 0) ) {
- gtk_widget_hide(sectionnode->frame);
- sectionno--;
- } else
- gtk_widget_show(sectionnode->frame);
- d(printf("%s section '%s' [sections=%d]\n", sectionnode->empty?"hiding":"showing", sectionnode->item->path, sectionno));
- }
-
- /* If the last page doesn't contain anything, hide it */
- if (pagenode != NULL
- && (item->type == E_CONFIG_PAGE_START
- || item->type == E_CONFIG_PAGE_FINISH
- || item->type == E_CONFIG_PAGE)) {
- if ( (pagenode->empty = sectionno == 0) ) {
- gtk_widget_hide(pagenode->frame);
- pageno--;
- } else
- gtk_widget_show(pagenode->frame);
- d(printf("%s page '%s' [section=%d]\n", pagenode->empty?"hiding":"showing", pagenode->item->path, pageno));
- }
-
- /* Now process the item */
- switch (item->type) {
- case E_CONFIG_BOOK:
- case E_CONFIG_DRUID:
- /* Only one of BOOK or DRUID may be define, it
- is used by the defining code to mark the
- type of the config window. It is
- cross-checked with the code's defined
- type. */
- if (root != NULL) {
- g_warning("EConfig book/druid redefined at: %s", item->path);
- break;
- }
-
- if (wn->widget == NULL) {
- if (item->type != emp->type) {
- g_warning("EConfig book/druid type mismatch");
- break;
- }
- if (item->factory) {
- root = item->factory(emp, item, NULL, wn->widget, wn->context->data);
- } else if (item->type == E_CONFIG_BOOK) {
- root = book = gtk_notebook_new();
- gtk_widget_show(book);
- } else if (item->type == E_CONFIG_DRUID) {
- root = druid = gnome_druid_new();
- } else
- abort();
-
- if (item->type == E_CONFIG_DRUID)
- g_signal_connect(root, "cancel", G_CALLBACK(ec_druid_cancel), wn);
-
- emp->widget = root;
- wn->widget = root;
- } else {
- root = wn->widget;
- }
-
- if (item->type == E_CONFIG_BOOK)
- book = root;
- else
- druid = root;
-
- page = NULL;
- pagenode = NULL;
- section = NULL;
- sectionnode = NULL;
- pageno = 0;
- sectionno = 0;
- break;
- case E_CONFIG_PAGE_START:
- case E_CONFIG_PAGE_FINISH:
- if (root == NULL) {
- g_warning("EConfig page defined before container widget: %s", item->path);
- break;
- }
- if (emp->type != E_CONFIG_DRUID) {
- g_warning("EConfig druid start/finish pages can't be used on E_CONFIG_BOOKs");
- break;
- }
-
- if (wn->widget == NULL) {
- if (item->factory) {
- page = item->factory(emp, item, root, wn->frame, wn->context->data);
- } else {
- page = gnome_druid_page_edge_new(item->type == E_CONFIG_PAGE_START?GNOME_EDGE_START:GNOME_EDGE_FINISH);
- gtk_widget_show(page);
- gnome_druid_page_edge_set_title((GnomeDruidPageEdge *)page, item->label);
- gnome_druid_insert_page((GnomeDruid *)druid, pagenode?(GnomeDruidPage *)pagenode->frame:NULL, (GnomeDruidPage *)page);
- }
- if (item->type == E_CONFIG_PAGE_FINISH) {
- g_signal_connect(page, "back", G_CALLBACK(ec_druid_prev), wn);
- g_signal_connect(page, "finish", G_CALLBACK(ec_druid_finish), wn);
- } else
- g_signal_connect(page, "next", G_CALLBACK(ec_druid_next), wn);
- wn->frame = page;
- wn->widget = page;
- }
- pageno++;
- page = NULL;
- pagenode = wn; /* need this for previous page linking */
- section = NULL;
- sectionnode = NULL;
- sectionno = 1; /* never want to hide these */
- break;
- case E_CONFIG_PAGE: {
- int connect = 0; /* connect druid signals */
-
- /* CONFIG_PAGEs depend on the config type.
- E_CONFIG_BOOK:
- The page is a VBox, stored in the notebook.
- E_CONFIG_DRUID
- The page is a GnomeDruidPageStandard,
- any sections automatically added are added to
- the vbox inside it. */
- sectionno = 0;
- if (root == NULL) {
- g_warning("EConfig page defined before container widget: %s", item->path);
- break;
- }
-
- if (item->factory) {
- page = item->factory(emp, item, root, wn->frame, wn->context->data);
- if (emp->type == E_CONFIG_DRUID) {
- if (page) {
- g_assert(GNOME_IS_DRUID_PAGE_STANDARD(page));
- connect = wn->frame != page;
- wn->frame = page;
- page = ((GnomeDruidPageStandard *)page)->vbox;
- } else
- wn->frame = page;
- } else {
- wn->frame = page;
- }
- if (page)
- sectionno = 1;
- } else if (wn->widget == NULL) {
- if (emp->type == E_CONFIG_DRUID) {
- w = gnome_druid_page_standard_new();
- gtk_widget_show(w);
- gnome_druid_page_standard_set_title((GnomeDruidPageStandard *)w, item->label);
- gnome_druid_insert_page((GnomeDruid *)druid, pagenode?(GnomeDruidPage *)pagenode->frame:NULL, (GnomeDruidPage *)w);
- wn->frame = w;
- page = ((GnomeDruidPageStandard *)w)->vbox;
- connect = TRUE;
- } else {
- w = gtk_label_new_with_mnemonic (item->label);
- gtk_widget_show(w);
- page = gtk_vbox_new(FALSE, 12);
- gtk_container_set_border_width((GtkContainer *)page, 12);
- gtk_widget_show(page);
- gtk_notebook_insert_page((GtkNotebook *)book, page, w, pageno);
- wn->frame = page;
- }
- } else
- page = wn->widget;
-
- d(printf("page %d:%s widget %p\n", pageno, item->path, page));
-
- if (wn->widget && wn->widget != page) {
- d(printf("destroy old widget for page '%s'\n", item->path));
- gtk_widget_destroy(wn->widget);
- }
-
- if (connect) {
- g_signal_connect(wn->frame, "next", G_CALLBACK(ec_druid_next), wn);
- g_signal_connect(wn->frame, "back", G_CALLBACK(ec_druid_prev), wn);
- /* GnomeDruid bug, need to connect_after */
- g_signal_connect_after(wn->frame, "prepare", G_CALLBACK(ec_druid_prepare), wn);
- }
-
- pageno++;
- pagenode = wn;
- section = NULL;
- sectionnode = NULL;
- wn->widget = page;
- break; }
- case E_CONFIG_SECTION:
- case E_CONFIG_SECTION_TABLE:
- /* The section factory is always called with
- the parent vbox object. Even for druid
- pages. */
- if (page == NULL) {
- g_warning("EConfig section '%s' has no parent page", item->path);
- section = NULL;
- goto nopage;
- }
-
- itemno = 0;
- if (item->factory) {
- section = item->factory(emp, item, page, wn->widget, wn->context->data);
- wn->frame = section;
- if (section)
- itemno = 1;
-
- if (section
- && ((item->type == E_CONFIG_SECTION && !GTK_IS_BOX(section))
- || (item->type == E_CONFIG_SECTION_TABLE && !GTK_IS_TABLE(section))))
- g_warning("EConfig section type is wrong");
- } else {
- GtkWidget *frame;
- GtkWidget *label = NULL;
-
- if (wn->frame) {
- d(printf("Item %s, clearing generated section widget\n", wn->item->path));
- gtk_widget_destroy(wn->frame);
- wn->widget = NULL;
- wn->frame = NULL;
- }
-
- if (item->label) {
- char *txt = g_strdup_printf("<span weight=\"bold\">%s</span>", item->label);
-
- label = g_object_new(gtk_label_get_type(),
- "label", txt,
- "use_markup", TRUE,
- "xalign", 0.0, NULL);
- g_free(txt);
- }
-
- if (item->type == E_CONFIG_SECTION)
- section = gtk_vbox_new(FALSE, 6);
- else {
- section = gtk_table_new(1, 1, FALSE);
- gtk_table_set_col_spacings((GtkTable *)section, 6);
- gtk_table_set_row_spacings((GtkTable *)section, 6);
- }
-
- frame = g_object_new(gtk_frame_get_type(),
- "shadow_type", GTK_SHADOW_NONE,
- "label_widget", label,
- "child", g_object_new(gtk_alignment_get_type(),
- "left_padding", 12,
- "top_padding", 6,
- "child", section, NULL),
- NULL);
- gtk_widget_show_all(frame);
- gtk_box_pack_start((GtkBox *)page, frame, FALSE, FALSE, 0);
- wn->frame = frame;
- }
- nopage:
- if (wn->widget && wn->widget != section) {
- d(printf("destroy old widget for section '%s'\n", item->path));
- gtk_widget_destroy(wn->widget);
- }
-
- d(printf("Item %s, setting section widget\n", wn->item->path));
-
- sectionno++;
- wn->widget = section;
- sectionnode = wn;
- break;
- case E_CONFIG_ITEM:
- case E_CONFIG_ITEM_TABLE:
- /* generated sections never retain their widgets on a rebuild */
- if (sectionnode->item->factory == NULL)
- wn->widget = NULL;
-
- /* ITEMs are called with the section parent.
- The type depends on the section type,
- either a GtkTable, or a GtkVBox */
- w = NULL;
- if (section == NULL)
- g_warning("EConfig item has no parent section: %s", item->path);
- else if ((item->type == E_CONFIG_ITEM && !GTK_IS_BOX(section))
- || (item->type == E_CONFIG_ITEM_TABLE && !GTK_IS_TABLE(section)))
- g_warning("EConfig item parent type is incorrect: %s", item->path);
- else if (item->factory)
- w = item->factory(emp, item, section, wn->widget, wn->context->data);
-
- d(printf("item %d:%s widget %p\n", itemno, item->path, w));
-
- if (wn->widget && wn->widget != w) {
- d(printf("destroy old widget for item '%s'\n", item->path));
- gtk_widget_destroy(wn->widget);
- }
-
- wn->widget = w;
- if (w)
- itemno++;
- break;
- }
- }
-
- /* If the last section doesn't contain anything, hide it */
- if (sectionnode != NULL) {
- if ( (sectionnode->empty = itemno == 0) ) {
- gtk_widget_hide(sectionnode->frame);
- sectionno--;
- } else
- gtk_widget_show(sectionnode->frame);
- d(printf("%s section '%s' [sections=%d]\n", sectionnode->empty?"hiding":"showing", sectionnode->item->path, sectionno));
- }
-
- /* If the last page doesn't contain anything, hide it */
- if (pagenode != NULL) {
- if ( (pagenode->empty = sectionno == 0) ) {
- gtk_widget_hide(pagenode->frame);
- pageno--;
- } else
- gtk_widget_show(pagenode->frame);
- d(printf("%s page '%s' [section=%d]\n", pagenode->empty?"hiding":"showing", pagenode->item->path, pageno));
- }
-
- if (book) {
- /* make this depend on flags?? */
- if (gtk_notebook_get_n_pages((GtkNotebook *)book) == 1) {
- gtk_notebook_set_show_tabs((GtkNotebook *)book, FALSE);
- gtk_notebook_set_show_border((GtkNotebook *)book, FALSE);
- }
- }
-}
-
-/**
- * e_config_set_target:
- * @emp: An initialised EConfig.
- * @target: A target allocated from @emp.
- *
- * Sets the target object for the config window. Generally the target
- * is set only once, and will supply its own "changed" signal which
- * can be used to drive the modal. This is a virtual method so that
- * the implementing class can connect to the changed signal and
- * initiate a e_config_target_changed() call where appropriate.
- **/
-void
-e_config_set_target(EConfig *emp, EConfigTarget *target)
-{
- if (emp->target != target)
- ((EConfigClass *)G_OBJECT_GET_CLASS(emp))->set_target(emp, target);
-}
-
-static void
-ec_widget_destroy(GtkWidget *w, EConfig *ec)
-{
- if (ec->target) {
- e_config_target_free(ec, ec->target);
- ec->target = NULL;
- }
-
- g_object_unref(ec);
-}
-
-/**
- * e_config_create_widget:
- * @emp: An initialised EConfig object.
- *
- * Create the widget described by @emp. Only the core widget
- * appropriate for the given type is created, i.e. a GtkNotebook for
- * the E_CONFIG_BOOK type and a GnomeDruid for the E_CONFIG_DRUID
- * type.
- *
- * This object will be self-driving, but will not close itself once
- * complete.
- *
- * Unless reffed otherwise, the management object @emp will be
- * finalised when the widget is.
- *
- * Return value: The widget, also available in @emp.widget
- **/
-GtkWidget *
-e_config_create_widget(EConfig *emp)
-{
- struct _EConfigPrivate *p = emp->priv;
- struct _menu_node *mnode;
- GPtrArray *items = g_ptr_array_new();
- GSList *l;
- /*char *domain = NULL;*/
- int i;
-
- g_assert(emp->target != NULL);
-
- ec_add_static_items(emp);
-
- /* FIXME: need to override old ones with new names */
- for (mnode = (struct _menu_node *)p->menus.head;mnode->next;mnode=mnode->next)
- for (l=mnode->menu; l; l = l->next) {
- struct _EConfigItem *item = l->data;
- struct _widget_node *wn = g_malloc0(sizeof(*wn));
-
- wn->item = item;
- wn->context = mnode;
- wn->config = emp;
- g_ptr_array_add(items, wn);
- }
-
- qsort(items->pdata, items->len, sizeof(items->pdata[0]), ep_cmp);
-
- for (i=0;i<items->len;i++) {
- struct _widget_node *wn = items->pdata[i];
-
- e_dlist_addtail(&p->widgets, (EDListNode *)wn);
- }
-
- g_ptr_array_free(items, TRUE);
- ec_rebuild(emp);
-
- /* auto-unref it */
- g_signal_connect(emp->widget, "destroy", G_CALLBACK(ec_widget_destroy), emp);
-
- /* FIXME: for some reason ec_rebuild puts the widget on page 1, this is just to override that */
- if (emp->type == E_CONFIG_BOOK)
- gtk_notebook_set_current_page((GtkNotebook *)emp->widget, 0);
-
- return emp->widget;
-}
-
-static void
-ec_dialog_response(GtkWidget *d, int id, EConfig *ec)
-{
- if (id == GTK_RESPONSE_OK)
- e_config_commit(ec);
- else
- e_config_abort(ec);
-
- gtk_widget_destroy(d);
-}
-
-/**
- * e_config_create_window:
- * @emp: Initialised and configured EMConfig derived instance.
- * @parent: Parent window or NULL.
- * @title: Title of window or dialog.
- *
- * Create a managed GtkWindow object from @emp. This window will be
- * fully driven by the EConfig @emp. If @emp.type is
- * @E_CONFIG_DRUID, then this will be a toplevel GtkWindow containing
- * a GnomeDruid. If it is @E_CONFIG_BOOK then it will be a GtkDialog
- * containing a Nnotebook.
- *
- * Unless reffed otherwise, the management object @emp will be
- * finalised when the widget is.
- *
- * Return value: The window widget. This is also stored in @emp.window.
- **/
-GtkWidget *
-e_config_create_window(EConfig *emp, struct _GtkWindow *parent, const char *title)
-{
- GtkWidget *w;
-
- e_config_create_widget(emp);
-
- if (emp->type == E_CONFIG_BOOK) {
- w = gtk_dialog_new_with_buttons(title, parent,
- GTK_DIALOG_DESTROY_WITH_PARENT |
- GTK_DIALOG_NO_SEPARATOR,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- NULL);
- g_signal_connect(w, "response", G_CALLBACK(ec_dialog_response), emp);
-
- gtk_widget_ensure_style (w);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (w)->vbox), 0);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (w)->action_area), 12);
-
- gtk_box_pack_start((GtkBox *)((GtkDialog *)w)->vbox, emp->widget, TRUE, TRUE, 0);
- } else {
- /* response is handled directly by the druid stuff */
- w = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_container_add((GtkContainer *)w, emp->widget);
- gtk_window_set_type_hint((GtkWindow *)w, GDK_WINDOW_TYPE_HINT_DIALOG);
- }
-
- emp->window = w;
- gtk_widget_show(w);
-
- return w;
-}
-
-/**
- * e_config_target_changed:
- * @emp:
- * @how:
- *
- * Indicate that the target has changed. This may be called by the
- * self-aware target itself, or by the driving code. If @how is
- * %E_CONFIG_TARGET_CHANGED_REBUILD, then the entire configuration
- * widget may be recreated based on the changed target.
- *
- * This is used to sensitise Druid next/back buttons and the Apply
- * button for the Notebook mode.
- **/
-void e_config_target_changed(EConfig *emp, e_config_target_change_t how)
-{
- if (how == E_CONFIG_TARGET_CHANGED_REBUILD)
- ec_rebuild(emp);
-
- if (emp->type == E_CONFIG_DRUID) {
- if (emp->priv->druid_page)
- ec_druid_check_current(emp);
- } else {
- if (emp->window) {
- if (e_config_page_check(emp, NULL)) {
- gtk_dialog_set_response_sensitive((GtkDialog *)emp->window, GTK_RESPONSE_OK, TRUE);
- } else {
- gtk_dialog_set_response_sensitive((GtkDialog *)emp->window, GTK_RESPONSE_OK, FALSE);
- }
- }
- }
-
- /* virtual method/signal? */
-}
-
-/**
- * e_config_abort:
- * @ec:
- *
- * Signify that the stateful configuration changes must be discarded
- * to all listeners. This is used by self-driven druid or notebook, or
- * may be used by code using the widget directly.
- **/
-void e_config_abort(EConfig *ec)
-{
- struct _EConfigPrivate *p = ec->priv;
- struct _menu_node *mnode;
-
- /* TODO: should these just be signals? */
-
- for (mnode = (struct _menu_node *)p->menus.head;mnode->next;mnode=mnode->next)
- if (mnode->abort)
- mnode->abort(ec, mnode->menu, mnode->data);
-}
-
-/**
- * e_config_commit:
- * @ec:
- *
- * Signify that the stateful configuration changes should be saved.
- * This is used by the self-driven druid or notebook, or may be used
- * by code driving the widget directly.
- **/
-void e_config_commit(EConfig *ec)
-{
- struct _EConfigPrivate *p = ec->priv;
- struct _menu_node *mnode;
-
- /* TODO: should these just be signals? */
-
- for (mnode = (struct _menu_node *)p->menus.head;mnode->next;mnode=mnode->next)
- if (mnode->commit)
- mnode->commit(ec, mnode->menu, mnode->data);
-}
-
-/**
- * e_config_page_check:
- * @ec:
- * @pageid: The path of the page item.
- *
- * Check that a given page is complete. If @pageid is NULL, then check
- * the whole config. No check is made that the page actually exists.
- *
- * Return value: FALSE if the data is inconsistent/incomplete.
- **/
-gboolean e_config_page_check(EConfig *ec, const char *pageid)
-{
- struct _EConfigPrivate *p = ec->priv;
- struct _check_node *mnode;
-
- for (mnode = (struct _check_node *)p->checks.head;mnode->next;mnode=mnode->next)
- if ((pageid == NULL
- || mnode->pageid == NULL
- || strcmp(mnode->pageid, pageid) == 0)
- && !mnode->check(ec, pageid, mnode->data))
- return FALSE;
-
- return TRUE;
-}
-
-/**
- * e_config_page_get:
- * @ec:
- * @pageid: The path of the page item.
- *
- * Retrieve the page widget corresponding to @pageid.
- *
- * Return value: The page widget. It will be the root GtkNotebook
- * container or the GnomeDruidPage object.
- **/
-GtkWidget *e_config_page_get(EConfig *ec, const char *pageid)
-{
- struct _widget_node *wn;
-
- for (wn = (struct _widget_node *)ec->priv->widgets.head;wn->next;wn=wn->next)
- if (!wn->empty
- && (wn->item->type == E_CONFIG_PAGE
- || wn->item->type == E_CONFIG_PAGE_START
- || wn->item->type == E_CONFIG_PAGE_FINISH)
- && !strcmp(wn->item->path, pageid))
- return wn->frame;
-
- return NULL;
-}
-
-/**
- * e_config_page_next:
- * @ec:
- * @pageid: The path of the page item.
- *
- * Find the path of the next visible page after @pageid. If @pageid
- * is NULL then find the first visible page.
- *
- * Return value: The path of the next page, or @NULL if @pageid was the
- * last configured and visible page.
- **/
-const char *e_config_page_next(EConfig *ec, const char *pageid)
-{
- struct _widget_node *wn;
- int found;
-
- found = pageid == NULL ? 1:0;
- for (wn = (struct _widget_node *)ec->priv->widgets.head;wn->next;wn=wn->next)
- if (!wn->empty
- && (wn->item->type == E_CONFIG_PAGE
- || wn->item->type == E_CONFIG_PAGE_START
- || wn->item->type == E_CONFIG_PAGE_FINISH)) {
- if (found)
- return wn->item->path;
- else if (strcmp(wn->item->path, pageid) == 0)
- found = 1;
- }
-
- return NULL;
-}
-
-/**
- * e_config_page_next:
- * @ec:
- * @pageid: The path of the page item.
- *
- * Find the path of the previous visible page before @pageid. If @pageid
- * is NULL then find the last visible page.
- *
- * Return value: The path of the previous page, or @NULL if @pageid was the
- * first configured and visible page.
- **/
-const char *e_config_page_prev(EConfig *ec, const char *pageid)
-{
- struct _widget_node *wn;
- int found;
-
- found = pageid == NULL ? 1:0;
- for (wn = (struct _widget_node *)ec->priv->widgets.tailpred;wn->prev;wn=wn->prev)
- if (!wn->empty
- && (wn->item->type == E_CONFIG_PAGE
- || wn->item->type == E_CONFIG_PAGE_START
- || wn->item->type == E_CONFIG_PAGE_FINISH)) {
- if (found)
- return wn->item->path;
- else if (strcmp(wn->item->path, pageid) == 0)
- found = 1;
- }
-
- return NULL;
-}
-
-/* ********************************************************************** */
-
-/**
- * e_config_class_add_factory:
- * @klass: Implementing class pointer.
- * @id: The name of the configuration window you're interested in.
- * This may be NULL to be called for all windows.
- * @func: An EConfigFactoryFunc to call when the window @id is being
- * created.
- * @data: Callback data.
- *
- * Add a config factory which will be called to add_items() any
- * extra items's if wants to, to the current Config window.
- *
- * TODO: Make the id a pattern?
- *
- * Return value: A handle to the factory.
- **/
-EConfigFactory *
-e_config_class_add_factory(EConfigClass *klass, const char *id, EConfigFactoryFunc func, void *data)
-{
- struct _EConfigFactory *f = g_malloc0(sizeof(*f));
-
- f->id = g_strdup(id);
- f->factory = func;
- f->factory_data = data;
- e_dlist_addtail(&klass->factories, (EDListNode *)f);
-
- return f;
-}
-
-/**
- * e_config_class_remove_factory:
- * @f: Handle from :class_add_factory() call.
- *
- * Remove a config factory. The handle @f may only be removed once.
- **/
-void
-e_config_class_remove_factory(EConfigClass *klass, EConfigFactory *f)
-{
- e_dlist_remove((EDListNode *)f);
- g_free(f->id);
- g_free(f);
-}
-
-/**
- * e_config_target_new:
- * @ep: Parent EConfig object.
- * @type: type, up to implementor
- * @size: Size of object to allocate.
- *
- * Allocate a new config target suitable for this class. Implementing
- * classes will define the actual content of the target.
- **/
-void *e_config_target_new(EConfig *ep, int type, size_t size)
-{
- EConfigTarget *t;
-
- g_assert(size >= sizeof(EConfigTarget));
-
- t = g_malloc0(size);
- t->config = ep;
- g_object_ref(ep);
- t->type = type;
-
- return t;
-}
-
-/**
- * e_config_target_free:
- * @ep: Parent EConfig object.
- * @o: The target to fre.
- *
- * Free a target. The implementing class can override this method to
- * free custom targets.
- **/
-void
-e_config_target_free(EConfig *ep, void *o)
-{
- EConfigTarget *t = o;
-
- ((EConfigClass *)G_OBJECT_GET_CLASS(ep))->target_free(ep, t);
-}
-
-/* ********************************************************************** */
-
-/* Config menu plugin handler */
-
-/*
-<e-plugin
- class="org.gnome.mail.plugin.config:1.0"
- id="org.gnome.mail.plugin.config.item:1.0"
- type="shlib"
- location="/opt/gnome2/lib/camel/1.0/libcamelimap.so"
- name="imap"
- description="IMAP4 and IMAP4v1 mail store">
- <hook class="org.gnome.mail.configMenu:1.0"
- handler="HandleConfig">
- <menu id="any" target="select">
- <item
- type="item|toggle|radio|image|submenu|bar"
- active
- path="foo/bar"
- label="label"
- icon="foo"
- activate="ep_view_emacs"/>
- </menu>
- </extension>
-
-*/
-
-static void *emph_parent_class;
-#define emph ((EConfigHook *)eph)
-
-static const EPluginHookTargetKey ech_item_types[] = {
- { "book", E_CONFIG_BOOK },
- { "druid", E_CONFIG_DRUID },
-
- { "page", E_CONFIG_PAGE },
- { "page_start", E_CONFIG_PAGE_START },
- { "page_finish", E_CONFIG_PAGE_FINISH },
- { "section", E_CONFIG_SECTION },
- { "section_table", E_CONFIG_SECTION_TABLE },
- { "item", E_CONFIG_ITEM },
- { "item_table", E_CONFIG_ITEM_TABLE },
- { 0 },
-};
-
-static void
-ech_commit(EConfig *ec, GSList *items, void *data)
-{
- struct _EConfigHookGroup *group = data;
-
- if (group->commit)
- e_plugin_invoke(group->hook->hook.plugin, group->commit, ec->target);
-}
-
-static void
-ech_abort(EConfig *ec, GSList *items, void *data)
-{
- struct _EConfigHookGroup *group = data;
-
- if (group->abort)
- e_plugin_invoke(group->hook->hook.plugin, group->abort, ec->target);
-}
-
-static gboolean
-ech_check(EConfig *ec, const char *pageid, void *data)
-{
- struct _EConfigHookGroup *group = data;
- EConfigHookPageCheckData hdata;
-
- if (!group->hook->hook.plugin->enabled)
- return TRUE;
-
- hdata.config = ec;
- hdata.target = ec->target;
- hdata.pageid = pageid?pageid:"";
-
- return GPOINTER_TO_INT(e_plugin_invoke(group->hook->hook.plugin, group->check, &hdata));
-}
-
-static void
-ech_config_factory(EConfig *emp, void *data)
-{
- struct _EConfigHookGroup *group = data;
-
- d(printf("config factory called %s\n", group->id?group->id:"all menus"));
-
- if (emp->target->type != group->target_type)
- return;
-
- if (group->items)
- e_config_add_items(emp, group->items, ech_commit, ech_abort, NULL, group);
-
- if (group->check)
- e_config_add_page_check(emp, NULL, ech_check, group);
-}
-
-static void
-emph_free_item(struct _EConfigItem *item)
-{
- g_free(item->path);
- g_free(item->label);
- g_free(item->user_data);
- g_free(item);
-}
-
-static void
-emph_free_group(struct _EConfigHookGroup *group)
-{
- g_slist_foreach(group->items, (GFunc)emph_free_item, NULL);
- g_slist_free(group->items);
-
- g_free(group->id);
- g_free(group);
-}
-
-static struct _GtkWidget *
-ech_config_widget_factory(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, void *data)
-{
- struct _EConfigHookGroup *group = data;
- EConfigHookItemFactoryData hdata;
-
- hdata.config = ec;
- hdata.item = item;
- hdata.target = ec->target;
- hdata.parent = parent;
- hdata.old = old;
-
- return (struct _GtkWidget *)e_plugin_invoke(group->hook->hook.plugin, (char *)item->user_data, &hdata);
-}
-
-static struct _EConfigItem *
-emph_construct_item(EPluginHook *eph, EConfigHookGroup *menu, xmlNodePtr root, EConfigHookTargetMap *map)
-{
- struct _EConfigItem *item;
-
- d(printf(" loading config item\n"));
- item = g_malloc0(sizeof(*item));
- if ((item->type = e_plugin_hook_id(root, ech_item_types, "type")) == -1)
- goto error;
- item->path = e_plugin_xml_prop(root, "path");
- item->label = e_plugin_xml_prop_domain(root, "label", eph->plugin->domain);
- item->user_data = e_plugin_xml_prop(root, "factory");
-
- if (item->path == NULL
- || (item->label == NULL && item->user_data == NULL))
- goto error;
-
- if (item->user_data)
- item->factory = ech_config_widget_factory;
-
- d(printf(" path=%s label=%s factory=%s\n", item->path, item->label, (char *)item->user_data));
-
- return item;
-error:
- d(printf("error!\n"));
- emph_free_item(item);
- return NULL;
-}
-
-static struct _EConfigHookGroup *
-emph_construct_menu(EPluginHook *eph, xmlNodePtr root)
-{
- struct _EConfigHookGroup *menu;
- xmlNodePtr node;
- EConfigHookTargetMap *map;
- EConfigHookClass *klass = (EConfigHookClass *)G_OBJECT_GET_CLASS(eph);
- char *tmp;
-
- d(printf(" loading menu\n"));
- menu = g_malloc0(sizeof(*menu));
-
- tmp = xmlGetProp(root, "target");
- if (tmp == NULL)
- goto error;
- map = g_hash_table_lookup(klass->target_map, tmp);
- xmlFree(tmp);
- if (map == NULL)
- goto error;
-
- menu->target_type = map->id;
- menu->id = e_plugin_xml_prop(root, "id");
- menu->check = e_plugin_xml_prop(root, "check");
- menu->commit = e_plugin_xml_prop(root, "commit");
- menu->abort = e_plugin_xml_prop(root, "abort");
- menu->hook = (EConfigHook *)eph;
- node = root->children;
- while (node) {
- if (0 == strcmp(node->name, "item")) {
- struct _EConfigItem *item;
-
- item = emph_construct_item(eph, menu, node, map);
- if (item)
- menu->items = g_slist_append(menu->items, item);
- }
- node = node->next;
- }
-
- return menu;
-error:
- emph_free_group(menu);
- return NULL;
-}
-
-static int
-emph_construct(EPluginHook *eph, EPlugin *ep, xmlNodePtr root)
-{
- xmlNodePtr node;
- EConfigClass *klass;
-
- d(printf("loading config hook\n"));
-
- if (((EPluginHookClass *)emph_parent_class)->construct(eph, ep, root) == -1)
- return -1;
-
- klass = ((EConfigHookClass *)G_OBJECT_GET_CLASS(eph))->config_class;
-
- node = root->children;
- while (node) {
- if (strcmp(node->name, "group") == 0) {
- struct _EConfigHookGroup *group;
-
- group = emph_construct_menu(eph, node);
- if (group) {
- e_config_class_add_factory(klass, group->id, ech_config_factory, group);
- emph->groups = g_slist_append(emph->groups, group);
- }
- }
- node = node->next;
- }
-
- eph->plugin = ep;
-
- return 0;
-}
-
-static void
-emph_finalise(GObject *o)
-{
- EPluginHook *eph = (EPluginHook *)o;
-
- g_slist_foreach(emph->groups, (GFunc)emph_free_group, NULL);
- g_slist_free(emph->groups);
-
- ((GObjectClass *)emph_parent_class)->finalize(o);
-}
-
-static void
-emph_class_init(EPluginHookClass *klass)
-{
- ((GObjectClass *)klass)->finalize = emph_finalise;
- klass->construct = emph_construct;
-
- /* this is actually an abstract implementation but list it anyway */
- klass->id = "org.gnome.evolution.config:1.0";
-
- d(printf("EConfigHook: init class %p '%s'\n", klass, g_type_name(((GObjectClass *)klass)->g_type_class.g_type)));
-
- ((EConfigHookClass *)klass)->target_map = g_hash_table_new(g_str_hash, g_str_equal);
- ((EConfigHookClass *)klass)->config_class = g_type_class_ref(e_config_get_type());
-}
-
-/**
- * e_config_hook_get_type:
- *
- * Standard GObject function to get the object type.
- *
- * Return value: The EConfigHook class type.
- **/
-GType
-e_config_hook_get_type(void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof(EConfigHookClass), NULL, NULL, (GClassInitFunc) emph_class_init, NULL, NULL,
- sizeof(EConfigHook), 0, (GInstanceInitFunc) NULL,
- };
-
- emph_parent_class = g_type_class_ref(e_plugin_hook_get_type());
- type = g_type_register_static(e_plugin_hook_get_type(), "EConfigHook", &info, 0);
- }
-
- return type;
-}
-
-/**
- * e_config_hook_class_add_target_map:
- *
- * @klass: The dervied EconfigHook class.
- * @map: A map used to describe a single EConfigTarget type for this
- * class.
- *
- * Add a targe tmap to a concrete derived class of EConfig. The
- * target map enumates the target types available for the implenting
- * class.
- **/
-void e_config_hook_class_add_target_map(EConfigHookClass *klass, const EConfigHookTargetMap *map)
-{
- g_hash_table_insert(klass->target_map, (void *)map->type, (void *)map);
-}
diff --git a/e-util/e-config.h b/e-util/e-config.h
deleted file mode 100644
index d2ba37ee5c..0000000000
--- a/e-util/e-config.h
+++ /dev/null
@@ -1,392 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Authors: Michel Zucchi <notzed@ximian.com>
- *
- * Copyright 2003 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifndef __E_CONFIG_H__
-#define __E_CONFIG_H__
-
-#include <glib-object.h>
-#include "libedataserver/e-msgport.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-struct _GtkWindow;
-struct _GtkWidget;
-
-/* This is a config window management/merging class. */
-
-typedef struct _EConfig EConfig;
-typedef struct _EConfigClass EConfigClass;
-
-typedef struct _EConfigItem EConfigItem;
-typedef struct _EConfigFactory EConfigFactory;
-typedef struct _EConfigTarget EConfigTarget;
-
-typedef void (*EConfigFactoryFunc)(EConfig *ec, void *data);
-
-typedef gboolean (*EConfigCheckFunc)(EConfig *ec, const char *pageid, void *data);
-
-typedef void (*EConfigItemsFunc)(EConfig *ec, GSList *items, void *data);
-
-typedef struct _GtkWidget * (*EConfigItemFactoryFunc)(EConfig *ec, EConfigItem *, struct _GtkWidget *parent, struct _GtkWidget *old, void *data);
-
-/* ok so this is all a bit bogussy
- we need to map to glade stuff instead */
-
-/* Add types?
- if no factory, setup appropriate container ?
- if factory, then assume that returns the right sort of object?
- what about pages ?
-*/
-
-/**
- * enum _e_config_target_changed_t - Target changed mode.
- *
- * @E_CONFIG_TARGET_CHANGED_STATE: A state of the target has changed.
- * @E_CONFIG_TARGET_CHANGED_REBUILD: A state of the target has
- * changed, and the UI must be reconfigured as a result.
- *
- * How the target has changed. If @E_CONFIG_TARGET_CHANGED_REBUILD then a
- * widget reconfigure is necessary, otherwise it is used to check if
- * the widget is complete yet.
- **/
-typedef
-enum _e_config_target_change_t {
- E_CONFIG_TARGET_CHANGED_STATE,
- E_CONFIG_TARGET_CHANGED_REBUILD,
-} e_config_target_change_t;
-
-/**
- * enum _e_config_t - configuration item type.
- *
- * @E_CONFIG_BOOK: A notebook item. Only one of this or
- * @E_CONFIG_DRUID may be included in the item list for the entire
- * configuration description.
- * @E_CONFIG_DRUID: A druid item. Only one of this or @E_CONFIG_BOOK
- * may be included in the item list for the entire configutation
- * description.
- * @E_CONFIG_PAGE: A configuration page. The item @label will be
- * either the notebook tab label or the druid page title if no factory
- * is supplied.
- * @E_CONFIG_PAGE_START: A druid start page. Only one of these may be
- * supplied for a druid and it should be the first page in the druid.
- * @E_CONFIG_PAGE_FINISH: A druid finish page. Only one of these may
- * be supplied for a druid and it should be the last page of the druid.
- * @E_CONFIG_SECTION: A section in the configuration page. A page for
- * this section must have already been defined. The item @label if
- * supplied will be setup as a borderless hig-compliant frame title.
- * The content of the section will be a GtkVBox. If a factory is used
- * then it is up to the factory method to create the section and add
- * it to the parent page, and return a GtkVBox for following sections.
- * @E_CONFIG_SECTION_TABLE: A table section. The same as an
- * @E_CONFIG_SECTION but the content object is a GtkTable instead.
- * @E_CONFIG_ITEM: A configuration item. It must have a parent
- * section defined in the configuration system.
- * @E_CONFIG_ITEM_TABLE: A configuration item with a parent
- * @E_CONFIG_SECTION_TABLE.
- *
- * A configuration item type for each configuration item added to the
- * EConfig object. These are merged from all contributors to the
- * configuration window, and then processed to form the combined
- * display.
- **/
-enum _e_config_t {
- /* use one and only one of these for any given config-window id */
- E_CONFIG_BOOK,
- E_CONFIG_DRUID,
-
- E_CONFIG_PAGE,
- E_CONFIG_PAGE_START, /* only allowed in druid types */
- E_CONFIG_PAGE_FINISH, /* only allowed in druid types */
- E_CONFIG_SECTION,
- E_CONFIG_SECTION_TABLE,
- E_CONFIG_ITEM,
- E_CONFIG_ITEM_TABLE, /* only allowed in table sections */
-};
-
-/**
- * struct _EConfigItem - A configuration item.
- *
- * @type: The configuration item type.
- * @path: An absolute path positioning this item in the configuration
- * window. This will be used as a sort key for an ASCII sort to
- * position the item in the layout tree.
- * @label: A label or section title string which is used if no factory
- * is supplied to title the page or section.
- * @factory: If supplied, this will be invoked instead to create the
- * appropriate item.
- * @user_data: User data for the factory.
- *
- * The basic descriptor of a configuration item. This may be
- * subclassed to store extra context information for each item.
- **/
-struct _EConfigItem {
- enum _e_config_t type;
- char *path; /* absolute path, must sort ascii-lexographically into the right spot */
- char *label;
- EConfigItemFactoryFunc factory;
- void *user_data;
-};
-
-/**
- * struct _EConfigTarget - configuration context.
- *
- * @config: The parent object.
- * @widget: A target-specific parent widget.
- * @type: The type of target, defined by implementing classes.
- *
- * The base target object is used as the parent and placeholder for
- * configuration context for a given configuration window. It is
- * subclassed by implementing classes to provide domain-specific
- * context.
- **/
-struct _EConfigTarget {
- struct _EConfig *config;
- struct _GtkWidget *widget; /* used if you need a parent toplevel, if available */
-
- guint32 type;
-
- /* implementation fields follow, depends on window type */
-};
-
-/**
- * struct _EConfig - A configuration management object.
- *
- * @object: Superclass.
- * @priv: Private data.
- * @type: Either @E_CONFIG_BOOK or @E_CONFIG_DRIUD, describing the
- * root window type.
- * @id: The globally unique identifider for this configuration window,
- * used for hooking into it.
- * @target: The current target.
- * @widget: The GtkNoteBook or GnomeDruid created after
- * :create_widget() is called that represents the merged and combined
- * configuration window.
- * @window: If :create_window() is called, then the containing
- * toplevel GtkDialog or GtkWindow appropriate for the @type of
- * configuration window created.
- *
- **/
-struct _EConfig {
- GObject object;
-
- struct _EConfigPrivate *priv;
-
- int type; /* E_CONFIG_BOOK or E_CONFIG_DRUID */
-
- char *id;
-
- EConfigTarget *target;
-
- struct _GtkWidget *widget; /* the generated internal */
- struct _GtkWidget *window; /* the window widget, GtkWindow or GtkDialog */
-};
-
-/**
- * struct _EConfigClass - Configuration management abstract class.
- *
- * @object_class: Superclass.
- * @factories: A list of factories registered on this type of
- * configuration manager.
- * @set_target: A virtual method used to set the target on the
- * configuration manager. This is used by subclasses so they may hook
- * into changes on the target to propery drive the manager.
- * @target_free: A virtual method used to free the target in an
- * implementation-defined way.
- *
- **/
-struct _EConfigClass {
- GObjectClass object_class;
-
- EDList factories;
-
- void (*set_target)(EConfig *ep, EConfigTarget *t);
-
- void (*target_free)(EConfig *ep, EConfigTarget *t);
-};
-
-GType e_config_get_type(void);
-
-/* Static class methods */
-EConfigFactory *e_config_class_add_factory(EConfigClass *klass, const char *id, EConfigFactoryFunc func, void *data);
-void e_config_class_remove_factory(EConfigClass *klass, EConfigFactory *f);
-
-EConfig *e_config_construct(EConfig *, int type, const char *id);
-
-void e_config_add_items(EConfig *, GSList *items, EConfigItemsFunc commitfunc, EConfigItemsFunc abortfunc, EConfigItemsFunc freefunc, void *data);
-void e_config_add_page_check(EConfig *, const char *pageid, EConfigCheckFunc, void *data);
-
-void e_config_set_target(EConfig *emp, EConfigTarget *target);
-struct _GtkWidget *e_config_create_widget(EConfig *);
-struct _GtkWidget *e_config_create_window(EConfig *emp, struct _GtkWindow *parent, const char *title);
-
-void e_config_target_changed(EConfig *emp, e_config_target_change_t how);
-
-gboolean e_config_page_check(EConfig *, const char *);
-
-struct _GtkWidget *e_config_page_get(EConfig *ec, const char *pageid);
-const char *e_config_page_next(EConfig *ec, const char *pageid);
-const char *e_config_page_prev(EConfig *ec, const char *pageid);
-
-void e_config_abort(EConfig *);
-void e_config_commit(EConfig *);
-
-void *e_config_target_new(EConfig *, int type, size_t size);
-void e_config_target_free(EConfig *, void *);
-
-/* ********************************************************************** */
-
-/* config plugin target, they are closely integrated */
-
-/* To implement a basic config plugin, you just need to subclass
- this and initialise the class target type tables */
-
-#include "e-util/e-plugin.h"
-
-typedef struct _EConfigHookGroup EConfigHookGroup;
-typedef struct _EConfigHook EConfigHook;
-typedef struct _EConfigHookClass EConfigHookClass;
-
-typedef struct _EPluginHookTargetMap EConfigHookTargetMap;
-typedef struct _EPluginHookTargetKey EConfigHookTargetMask;
-
-typedef struct _EConfigHookItemFactoryData EConfigHookItemFactoryData;
-typedef struct _EConfigHookPageCheckData EConfigHookPageCheckData;
-
-typedef void (*EConfigHookFunc)(struct _EPlugin *plugin, EConfigTarget *target);
-typedef void (*EConfigHookItemFactoryFunc)(struct _EPlugin *plugin, EConfigHookItemFactoryData *data);
-
-/**
- * struct _EConfigHookItemFactoryData - Factory marshalling structure.
- *
- * @config: The parent EConfig. This is also available in
- * @target->config but is here as a convenience. (TODO: do we need this).
- * @item: The corresponding configuration item.
- * @target: The current configuration target. This is also available
- * on @config->target.
- * @parent: The parent widget for this item. Depends on the item
- * type.
- * @old: The last widget created by this factory. The factory is only
- * re-invoked if a reconfigure request is invoked on the EConfig.
- *
- * Used to marshal the callback data for the EConfigItemFactory method
- * to a single pointer for the EPlugin system.
- **/
-struct _EConfigHookItemFactoryData {
- EConfig *config;
- EConfigItem *item;
- EConfigTarget *target;
- struct _GtkWidget *parent;
- struct _GtkWidget *old;
-};
-
-/**
- * struct _EConfigHookPageCheckData - Check callback data.
- *
- * @config:
- * @target: The current configuration target. This is also available
- * on @config->target.
- * @pageid: Name of page to validate, or "" means check all configuration.
- *
- **/
-struct _EConfigHookPageCheckData {
- EConfig *config;
- EConfigTarget *target;
- const char *pageid;
-};
-
-/**
- * struct _EConfigHookGroup - A group of configuration items.
- *
- * @hook: Parent object.
- * @id: The configuration window to which these items apply.
- * @target_type: The target type expected by the items. This is
- * defined by implementing classes.
- * @items: A list of EConfigHookItem's for this group.
- * @check: A validate page handler.
- * @commit: The name of the commit function for this group of items, or NULL
- * for instant-apply configuration windows. Its format is plugin-type defined.
- * @abort: Similar to the @commit function but for aborting or
- * cancelling a configuration edit.
- *
- * Each plugin that hooks into a given configuration page will define
- * all of the items for that page in a single group.
- **/
-struct _EConfigHookGroup {
- struct _EConfigHook *hook; /* parent pointer */
- char *id; /* target menu id for these config items */
- int target_type; /* target type of this group */
- GSList *items; /* items to add to group */
- char *check; /* validate handler, if set */
- char *commit; /* commit handler, if set */
- char *abort; /* abort handler, if set */
-};
-
-/**
- * struct _EConfigHook - Plugin hook for configuration windows.
- *
- * @hook: Superclass.
- * @groups: A list of EConfigHookGroup's of all configuration windows
- * this plugin hooks into.
- *
- **/
-struct _EConfigHook {
- EPluginHook hook;
-
- GSList *groups;
-};
-
-/**
- * struct _EConfigHookClass - Abstract class for configuration window
- * plugin hooks.
- *
- * @hook_class: Superclass.
- * @target_map: A table of EConfigHookTargetMap structures describing
- * the possible target types supported by this class.
- * @config_class: The EConfig derived class that this hook
- * implementation drives.
- *
- * This is an abstract class defining the plugin hook point for
- * configuration windows.
- *
- **/
-struct _EConfigHookClass {
- EPluginHookClass hook_class;
-
- /* EConfigHookTargetMap by .type */
- GHashTable *target_map;
- /* the config class these configs's belong to */
- EConfigClass *config_class;
-};
-
-GType e_config_hook_get_type(void);
-
-/* for implementors */
-void e_config_hook_class_add_target_map(EConfigHookClass *klass, const EConfigHookTargetMap *);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_CONFIG_H__ */
diff --git a/e-util/e-corba-utils.c b/e-util/e-corba-utils.c
deleted file mode 100644
index b92b247656..0000000000
--- a/e-util/e-corba-utils.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-html-utils.c
-*
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Ettore Perazzoli <ettore@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-corba-utils.h"
-
-
-const CORBA_char *
-e_safe_corba_string (const char *s)
-{
- if (s == NULL)
- return (CORBA_char *) "";
-
- return s;
-}
-
-CORBA_char *
-e_safe_corba_string_dup (const char *s)
-{
- return CORBA_string_dup (e_safe_corba_string (s));
-}
diff --git a/e-util/e-corba-utils.h b/e-util/e-corba-utils.h
deleted file mode 100644
index b48a6e2dab..0000000000
--- a/e-util/e-corba-utils.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-corba-utils.h
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Ettore Perazzoli <ettore@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef E_CORBA_UTILS_H
-#define E_CORBA_UTILS_H
-
-#include <orbit/orbit.h>
-
-const CORBA_char *e_safe_corba_string (const char *s);
-CORBA_char *e_safe_corba_string_dup (const char *s);
-
-#endif
diff --git a/e-util/e-dialog-utils.c b/e-util/e-dialog-utils.c
deleted file mode 100644
index 63d3f1d74c..0000000000
--- a/e-util/e-dialog-utils.c
+++ /dev/null
@@ -1,329 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-dialog-utils.h
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Authors:
- * Michael Meeks <michael@ximian.com>
- * Ettore Perazzoli <ettore@ximian.com>
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-dialog-utils.h"
-
-#include <gdk/gdkx.h>
-
-#include <gtk/gtkmain.h>
-#include <gtk/gtkplug.h>
-#include <gtk/gtkversion.h>
-
-#ifdef USE_GTKFILECHOOSER
-#include <gtk/gtkfilechooser.h>
-#include <gtk/gtkfilechooserdialog.h>
-#include <gtk/gtkstock.h>
-#else
-#include <gtk/gtkfilesel.h>
-#endif
-
-#include <libgnome/gnome-i18n.h>
-#include <libgnome/gnome-util.h>
-
-
-/**
- * e_notice:
- * @parent: the dialog's parent window, or %NULL
- * @type: the type of dialog (%GTK_MESSAGE_INFO, %GTK_MESSAGE_WARNING,
- * or %GTK_MESSAGE_ERROR)
- * @format: printf-style format string, followed by arguments
- *
- * Convenience function to show a dialog with a message and an "OK"
- * button.
- **/
-void
-e_notice (gpointer parent, GtkMessageType type, const char *format, ...)
-{
- GtkWidget *dialog;
- va_list args;
- char *str;
-
- va_start (args, format);
- str = g_strdup_vprintf (format, args);
- dialog = gtk_message_dialog_new (NULL,
- GTK_DIALOG_DESTROY_WITH_PARENT,
- type,
- GTK_BUTTONS_OK,
- "%s",
- str);
-#if !GTK_CHECK_VERSION (2,4,0)
- gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
-#endif
- va_end (args);
- g_free (str);
-
- if (parent)
- e_dialog_set_transient_for (GTK_WINDOW (dialog), parent);
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
-}
-
-/**
- * e_notice_with_xid:
- * @parent: the dialog's parent window, or %NULL
- * @type: the type of dialog (%GTK_MESSAGE_INFO, %GTK_MESSAGE_WARNING,
- * or %GTK_MESSAGE_ERROR)
- * @format: printf-style format string, followed by arguments
- *
- * Like e_notice(), but takes a GdkNativeWindow for the parent
- * window argument.
- **/
-void
-e_notice_with_xid (GdkNativeWindow parent, GtkMessageType type, const char *format, ...)
-{
- GtkWidget *dialog;
- va_list args;
- char *str;
-
- va_start (args, format);
- str = g_strdup_vprintf (format, args);
- dialog = gtk_message_dialog_new (NULL,
- GTK_DIALOG_DESTROY_WITH_PARENT,
- type,
- GTK_BUTTONS_OK,
- "%s",
- str);
- gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
- va_end (args);
- g_free (str);
-
- if (parent)
- e_dialog_set_transient_for_xid (GTK_WINDOW (dialog), parent);
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
-}
-
-
-/* Tests whether or not an X Window is being managed by the
- * window manager.
- */
-static gboolean
-window_is_wm_toplevel (Display *display, Window window)
-{
- static Atom WM_STATE = None;
- unsigned long nitems, after;
- unsigned char *data = NULL;
- Atom type = None;
- int format;
-
- if (!WM_STATE)
- WM_STATE = XInternAtom (display, "WM_STATE", False);
-
- if (XGetWindowProperty (display, window, WM_STATE, 0, 0, False,
- AnyPropertyType, &type, &format,
- &nitems, &after, &data) == Success) {
- if (data)
- XFree((char*)data);
- if (type)
- return TRUE;
- }
- return FALSE;
-}
-
-/**
- * e_dialog_set_transient_for:
- * @dialog: a dialog window
- * @parent_widget: the parent for @dialog
- *
- * This sets the parent for @dialog to be @parent_widget. Unlike
- * gtk_window_set_transient_for(), this doesn't need @parent_widget to
- * be the actual toplevel, and also works if @parent_widget is
- * embedded as a Bonobo control by an out-of-process container.
- * @parent_widget must already be realized before calling this
- * function, but @dialog does not need to be.
- **/
-void
-e_dialog_set_transient_for (GtkWindow *dialog,
- GtkWidget *parent_widget)
-{
- GtkWidget *toplevel;
- Window parent, root_ret, *children;
- unsigned int numchildren;
- Display *display;
- Status status;
-
- g_return_if_fail (GTK_IS_WINDOW (dialog));
- g_return_if_fail (GTK_IS_WIDGET (parent_widget));
-
- toplevel = gtk_widget_get_toplevel (parent_widget);
- if (toplevel == NULL)
- return;
-
- if (!GTK_IS_PLUG (toplevel)) {
- gtk_window_set_transient_for (GTK_WINDOW (dialog),
- GTK_WINDOW (toplevel));
- return;
- }
-
- /* Find the top-level windowmanager-managed X Window */
- display = GDK_WINDOW_XDISPLAY (parent_widget->window);
- parent = GDK_WINDOW_XID (parent_widget->window);
-
- while (parent && !window_is_wm_toplevel (display, parent)) {
- status = XQueryTree (display, parent, &root_ret,
- &parent, &children, &numchildren);
- if (status != 0)
- XFree (children);
- }
-
- e_dialog_set_transient_for_xid (dialog, parent);
-}
-
-static void
-dialog_realized (GtkWindow *dialog, gpointer xid)
-{
- e_dialog_set_transient_for_xid (dialog, (GdkNativeWindow)xid);
-}
-
-/**
- * e_dialog_set_transient_for_xid:
- * @dialog: a dialog window
- * @xid: the X Window parent
- *
- * Like e_dialog_set_transient_for(), but use an XID to specify the
- * parent window.
- **/
-void
-e_dialog_set_transient_for_xid (GtkWindow *dialog,
- GdkNativeWindow xid)
-{
-#ifdef GDK_MULTIHEAD_SAFE
- GdkDisplay *display;
-#endif
- GdkWindow *parent;
-
- g_return_if_fail (GTK_IS_WINDOW (dialog));
-
- if (!GTK_WIDGET_REALIZED (dialog)) {
- g_signal_connect (dialog, "realize",
- G_CALLBACK (dialog_realized),
- (gpointer) xid);
- return;
- }
-
-#ifdef GDK_MULTIHEAD_SAFE
- display = gdk_drawable_get_display (GDK_DRAWABLE (GTK_WIDGET (dialog)->window));
- parent = gdk_window_lookup_for_display (display, xid);
- if (!parent)
- parent = gdk_window_foreign_new_for_display (display, xid);
-#else
- parent = gdk_window_lookup (xid);
- if (!parent)
- parent = gdk_window_foreign_new (xid);
-#endif
- g_return_if_fail (parent != NULL);
-
- gdk_window_set_transient_for (GTK_WIDGET (dialog)->window, parent);
-}
-
-
-
-static void
-save_ok (GtkWidget *widget, gpointer data)
-{
- GtkWidget *fs;
- char **filename = data;
- const char *path;
- int btn = GTK_RESPONSE_YES;
-
- fs = gtk_widget_get_toplevel (widget);
-#ifdef USE_GTKFILECHOOSER
- path = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (fs));
-#else
- path = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs));
-#endif
-
- if (g_file_test (path, G_FILE_TEST_IS_REGULAR)) {
- GtkWidget *dlg;
-
- dlg = gtk_message_dialog_new (GTK_WINDOW (fs), 0,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_YES_NO,
- _("A file by that name already exists.\n"
- "Overwrite it?"));
- gtk_window_set_title (GTK_WINDOW (dlg), _("Overwrite file?"));
- gtk_dialog_set_has_separator (GTK_DIALOG (dlg), FALSE);
-
- btn = gtk_dialog_run (GTK_DIALOG (dlg));
- gtk_widget_destroy (dlg);
- }
-
- if (btn == GTK_RESPONSE_YES)
- *filename = g_strdup (path);
-
- gtk_main_quit ();
-}
-
-#ifdef USE_GTKFILECHOOSER
-static void
-filechooser_response (GtkWidget *fc, gint response_id, gpointer data)
-{
- if (response_id == GTK_RESPONSE_ACCEPT)
- save_ok (fc, data);
- else
- gtk_widget_destroy (fc);
-}
-#endif
-
-char *
-e_file_dialog_save (const char *title)
-{
- GtkWidget *selection;
- char *path, *filename = NULL;
-
-#ifdef USE_GTKFILECHOOSER
- selection = gtk_file_chooser_dialog_new (title,
- NULL,
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
- NULL);
- gtk_dialog_set_default_response (GTK_DIALOG (selection), GTK_RESPONSE_ACCEPT);
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (selection), g_get_home_dir ());
-
- g_signal_connect (G_OBJECT (selection), "response", G_CALLBACK (filechooser_response), &filename);
-#else
- selection = gtk_file_selection_new (title);
- path = g_strdup_printf ("%s/", g_get_home_dir ());
- gtk_file_selection_set_filename (GTK_FILE_SELECTION (selection), path);
- g_free (path);
-
- g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (selection)->ok_button), "clicked", G_CALLBACK (save_ok), &filename);
- g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (selection)->cancel_button), "clicked", G_CALLBACK (gtk_main_quit), NULL);
-#endif
-
- gtk_widget_show (GTK_WIDGET (selection));
- gtk_grab_add (GTK_WIDGET (selection));
- gtk_main ();
-
- gtk_widget_destroy (GTK_WIDGET (selection));
-
- return filename;
-}
-
-
diff --git a/e-util/e-dialog-utils.h b/e-util/e-dialog-utils.h
deleted file mode 100644
index 6e6cff8fb9..0000000000
--- a/e-util/e-dialog-utils.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-dialog-utils.h
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli <ettore@ximian.com>
- */
-
-#ifndef E_DIALOG_UTILS_H
-#define E_DIALOG_UTILS_H
-
-#include <gtk/gtkmessagedialog.h>
-
-void e_notice (gpointer parent,
- GtkMessageType type,
- const char *format,
- ...);
-void e_notice_with_xid (GdkNativeWindow parent,
- GtkMessageType type,
- const char *format,
- ...);
-
-void e_dialog_set_transient_for (GtkWindow *dialog,
- GtkWidget *parent_widget);
-void e_dialog_set_transient_for_xid (GtkWindow *dialog,
- GdkNativeWindow xid);
-
-char *e_file_dialog_save (const char *title);
-
-
-#endif
diff --git a/e-util/e-dialog-widgets.c b/e-util/e-dialog-widgets.c
deleted file mode 100644
index d245917682..0000000000
--- a/e-util/e-dialog-widgets.c
+++ /dev/null
@@ -1,811 +0,0 @@
-/* Evolution internal utilities - Glade dialog widget utilities
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include <math.h>
-#include <string.h>
-#include <time.h>
-#include <gtk/gtkmenu.h>
-#include <gtk/gtkmenuitem.h>
-#include <gtk/gtkoptionmenu.h>
-#include <gtk/gtkradiobutton.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkspinbutton.h>
-#include <libgnomeui/gnome-dateedit.h>
-#include <libgnomeui/gnome-propertybox.h>
-
-#include "e-dialog-widgets.h"
-
-
-
-/* A widget, a pointer to the variable it will modify, and extra information */
-typedef struct {
- GtkWidget *widget;
- gpointer value_var;
- gpointer info;
-} WidgetHook;
-
-/* Hook information for a complete dialog */
-typedef struct {
- GSList *whooks;
-} DialogHooks;
-
-
-
-/* Destroy handler for the dialog; frees the dialog hooks */
-static void
-dialog_destroy_cb (DialogHooks *hooks, GObject *dialog)
-{
- g_slist_free (hooks->whooks);
- hooks->whooks = NULL;
-
- g_free (hooks);
- g_object_set_data (dialog, "dialog-hooks", NULL);
-}
-
-/* Ensures that the dialog has the necessary attached data to store the widget
- * hook information.
- */
-static DialogHooks *
-get_dialog_hooks (GtkWidget *dialog)
-{
- DialogHooks *hooks;
-
- hooks = g_object_get_data ((GObject *) dialog, "dialog-hooks");
- if (!hooks) {
- hooks = g_new0 (DialogHooks, 1);
- g_object_set_data ((GObject *) dialog, "dialog-hooks", hooks);
- g_object_weak_ref ((GObject *) dialog, (GWeakNotify) dialog_destroy_cb, hooks);
- }
-
- return hooks;
-}
-
-/* Converts an mapped value to the appropriate index in an item group. The
- * values for the items are provided as a -1-terminated array.
- */
-static int
-value_to_index (const int *value_map, int value)
-{
- int i;
-
- for (i = 0; value_map[i] != -1; i++)
- if (value_map[i] == value)
- return i;
-
- return -1;
-}
-
-/* Converts an index in an item group to the appropriate mapped value. See the
- * function above.
- */
-static int
-index_to_value (const int *value_map, int index)
-{
- int i;
-
- /* We do this the hard way, i.e. not as a simple array reference, to
- * check for correctness.
- */
-
- for (i = 0; value_map[i] != -1; i++)
- if (i == index)
- return value_map[i];
-
- return -1;
-}
-
-/* Callback for the "toggled" signal of toggle buttons */
-static void
-toggled_cb (GtkToggleButton *toggle, gpointer data)
-{
- GnomePropertyBox *pbox;
-
- pbox = GNOME_PROPERTY_BOX (data);
-
- /* For radio buttons, we only notify the property box if the button is
- * active, because we'll get one call for each of the changed buttons in
- * the radio group.
- */
- if (!GTK_IS_RADIO_BUTTON (toggle) || toggle->active)
- gnome_property_box_changed (pbox);
-}
-
-/* Hooks a radio button group */
-static void
-hook_radio (GtkWidget *dialog, GtkRadioButton *radio, gpointer value_var, gpointer info)
-{
- const int *value_map;
- GSList *group, *l;
- int *value;
-
- group = gtk_radio_button_get_group (radio);
-
- /* Set the value */
-
- value = (int *) value_var;
- value_map = (const int *) info;
-
- e_dialog_radio_set (GTK_WIDGET (radio), *value, value_map);
-
- /* Hook to changed */
-
- if (GNOME_IS_PROPERTY_BOX (dialog))
- for (l = group; l; l = l->next)
- g_signal_connect (l->data, "toggled", G_CALLBACK (toggled_cb), dialog);
-}
-
-/* Gets the value of a radio button group */
-static void
-get_radio_value (GtkRadioButton *radio, gpointer value_var, gpointer info)
-{
- int *value;
- const int *value_map;
-
- value = (int *) value_var;
- value_map = (const int *) info;
-
- *value = e_dialog_radio_get (GTK_WIDGET (radio), value_map);
-}
-
-/* Callback for the "activate" signal of menu items */
-static void
-activate_cb (GtkMenuItem *item, gpointer data)
-{
- GnomePropertyBox *pbox;
-
- pbox = GNOME_PROPERTY_BOX (data);
- gnome_property_box_changed (pbox);
-}
-
-/* Hooks an option menu */
-static void
-hook_option_menu (GtkWidget *dialog, GtkOptionMenu *omenu, gpointer value_var, gpointer info)
-{
- const int *value_map;
- int *value;
-
- /* Set the value */
-
- value = (int *) value_var;
- value_map = (const int *) info;
-
- e_dialog_option_menu_set (GTK_WIDGET (omenu), *value, value_map);
-
- /* Hook to changed */
-
- if (GNOME_IS_PROPERTY_BOX (dialog)) {
- GtkMenu *menu;
- GList *l;
-
- menu = GTK_MENU (gtk_option_menu_get_menu (omenu));
-
- for (l = GTK_MENU_SHELL (menu)->children; l; l = l->next)
- g_signal_connect (l->data, "activate", G_CALLBACK (activate_cb), dialog);
- }
-}
-
-/* Gets the value of an option menu */
-static void
-get_option_menu_value (GtkOptionMenu *omenu, gpointer value_var, gpointer info)
-{
- const int *value_map;
- int *value;
-
- value = (int *) value_var;
- value_map = (const int *) info;
-
- *value = e_dialog_option_menu_get (GTK_WIDGET (omenu), value_map);
-}
-
-/* Hooks a toggle button */
-static void
-hook_toggle (GtkWidget *dialog, GtkToggleButton *toggle, gpointer value_var, gpointer info)
-{
- gboolean *value;
-
- /* Set the value */
-
- value = (gboolean *) value_var;
- e_dialog_toggle_set (GTK_WIDGET (toggle), *value);
-
- /* Hook to changed */
-
- if (GNOME_IS_PROPERTY_BOX (dialog))
- g_signal_connect (toggle, "toggled", G_CALLBACK (toggled_cb), dialog);
-}
-
-/* Gets the value of a toggle button */
-static void
-get_toggle_value (GtkToggleButton *toggle, gpointer value_var, gpointer info)
-{
- gboolean *value;
-
- value = (gboolean *) value_var;
- *value = e_dialog_toggle_get (GTK_WIDGET (toggle));
-}
-
-/* Callback for the "value_changed" signal of the adjustment of a spin button */
-static void
-value_changed_cb (GtkAdjustment *adj, gpointer data)
-{
- GnomePropertyBox *pbox;
-
- pbox = GNOME_PROPERTY_BOX (data);
- gnome_property_box_changed (pbox);
-}
-
-/* Hooks a spin button */
-static void
-hook_spin_button (GtkWidget *dialog, GtkSpinButton *spin, gpointer value_var, gpointer info)
-{
- double *value;
- GtkAdjustment *adj;
-
- /* Set the value */
-
- value = (double *) value_var;
- e_dialog_spin_set (GTK_WIDGET (spin), *value);
-
- /* Hook to changed */
-
- adj = gtk_spin_button_get_adjustment (spin);
-
- if (GNOME_IS_PROPERTY_BOX (dialog))
- g_signal_connect (adj, "value_changed", G_CALLBACK (value_changed_cb), dialog);
-}
-
-/* Gets the value of a spin button */
-static void
-get_spin_button_value (GtkSpinButton *spin, gpointer value_var, gpointer info)
-{
- double *value;
-
- value = (double *) value_var;
- *value = e_dialog_spin_get_double (GTK_WIDGET (spin));
-}
-
-/* Callback for the "changed" signal of a GtkEditable widget */
-static void
-changed_cb (GtkEditable *editable, gpointer data)
-{
- GnomePropertyBox *pbox;
-
- pbox = GNOME_PROPERTY_BOX (data);
- gnome_property_box_changed (pbox);
-}
-
-/* Hooks a GtkEditable widget */
-static void
-hook_editable (GtkWidget *dialog, GtkEditable *editable, gpointer value_var, gpointer info)
-{
- char **value;
-
- /* Set the value */
-
- value = (char **) value_var;
-
- e_dialog_editable_set (GTK_WIDGET (editable), *value);
-
- /* Hook to changed */
-
- if (GNOME_IS_PROPERTY_BOX (dialog))
- g_signal_connect (editable, "changed", G_CALLBACK (changed_cb), dialog);
-}
-
-/* Gets the value of a GtkEditable widget */
-static void
-get_editable_value (GtkEditable *editable, gpointer value_var, gpointer data)
-{
- char **value;
-
- value = (char **) value_var;
- if (*value)
- g_free (*value);
-
- *value = e_dialog_editable_get (GTK_WIDGET (editable));
-}
-
-/**
- * e_dialog_editable_set:
- * @widget: A #GtkEditable widget.
- * @value: String value.
- *
- * Sets the string value inside a #GtkEditable-derived widget.
- **/
-void
-e_dialog_editable_set (GtkWidget *widget, const char *value)
-{
- int pos = 0;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (GTK_IS_EDITABLE (widget));
-
- gtk_editable_delete_text (GTK_EDITABLE (widget), 0, -1);
-
- if (value)
- gtk_editable_insert_text (GTK_EDITABLE (widget), value, strlen (value), &pos);
-}
-
-/**
- * e_dialog_editable_get:
- * @widget: A #GtkEditable widget.
- *
- * Queries the string value inside a #GtkEditable-derived widget.
- *
- * Return value: String value. You should free it when you are done with it.
- * This function can return NULL if the string could not be converted from
- * GTK+'s encoding into UTF8.
- **/
-char *
-e_dialog_editable_get (GtkWidget *widget)
-{
- g_return_val_if_fail (widget != NULL, NULL);
- g_return_val_if_fail (GTK_IS_EDITABLE (widget), NULL);
-
- return gtk_editable_get_chars (GTK_EDITABLE (widget), 0, -1);
-}
-
-/**
- * e_dialog_radio_set:
- * @widget: A #GtkRadioButton in a radio button group.
- * @value: Enumerated value.
- * @value_map: Map from enumeration values to array indices.
- *
- * Sets the selected item in a radio group. The specified @widget can be any of
- * the #GtkRadioButtons in the group. Each radio button should correspond to an
- * enumeration value; the specified @value will be mapped to an integer from
- * zero to the number of items in the group minus 1 by using a mapping table
- * specified in @value_map. The last element in this table should be -1. Thus
- * a table to map three possible interpolation values to integers could be
- * specified as { NEAREST_NEIGHBOR, BILINEAR, HYPERBOLIC, -1 }.
- **/
-void
-e_dialog_radio_set (GtkWidget *widget, int value, const int *value_map)
-{
- GSList *group, *l;
- int i;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (GTK_IS_RADIO_BUTTON (widget));
- g_return_if_fail (value_map != NULL);
-
- group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (widget));
-
- i = value_to_index (value_map, value);
- if (i != -1) {
- /* Groups are built by prepending items, so the list ends up in reverse
- * order; we need to flip the index around.
- */
- i = g_slist_length (group) - i - 1;
-
- l = g_slist_nth (group, i);
- if (!l)
- g_message ("e_dialog_radio_set(): could not find index %d in radio group!", i);
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (l->data), TRUE);
- } else
- g_message ("e_dialog_radio_set(): could not find value %d in value map!", value);
-}
-
-/**
- * e_dialog_radio_get:
- * @widget: A #GtkRadioButton in a radio button group.
- * @value_map: Map from enumeration values to array indices.
- *
- * Queries the selected item in a #GtkRadioButton group. Please read the
- * description of e_dialog_radio_set() to see how @value_map maps enumeration
- * values to button indices.
- *
- * Return value: Enumeration value which corresponds to the selected item in the
- * radio group.
- **/
-int
-e_dialog_radio_get (GtkWidget *widget, const int *value_map)
-{
- GSList *group, *l;
- int i, v;
-
- g_return_val_if_fail (widget != NULL, -1);
- g_return_val_if_fail (GTK_IS_RADIO_BUTTON (widget), -1);
- g_return_val_if_fail (value_map != NULL, -1);
-
- group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (widget));
-
- for (i = 0, l = group; l; l = l->next, i++) {
- widget = GTK_WIDGET (l->data);
-
- if (GTK_TOGGLE_BUTTON (widget)->active)
- break;
- }
-
- g_assert (l != NULL);
-
- /* Groups are built by prepending items, so the list ends up in reverse
- * order; we need to flip the index around.
- */
- i = g_slist_length (group) - i - 1;
-
- v = index_to_value (value_map, i);
- if (v == -1) {
- g_message ("e_dialog_radio_get(): could not find index %d in value map!", i);
- return -1;
- }
-
- return v;
-}
-
-/**
- * e_dialog_toggle_set:
- * @widget: A #GtkToggleButton.
- * @value: Toggle value.
- *
- * Sets the value of a #GtkToggleButton-derived widget. This should not be used
- * for radio buttons; it is more convenient to use use e_dialog_radio_set()
- * instead.
- **/
-void
-e_dialog_toggle_set (GtkWidget *widget, gboolean value)
-{
- g_return_if_fail (widget != NULL);
- g_return_if_fail (GTK_IS_TOGGLE_BUTTON (widget));
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), value);
-}
-
-/**
- * e_dialog_toggle_get:
- * @widget: A #GtkToggleButton.
- *
- * Queries the value of a #GtkToggleButton-derived widget. This should not be
- * used for radio buttons; it is more convenient to use e_dialog_radio_get()
- * instead.
- *
- * Return value: Toggle value.
- **/
-gboolean
-e_dialog_toggle_get (GtkWidget *widget)
-{
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (GTK_IS_TOGGLE_BUTTON (widget), FALSE);
-
- return GTK_TOGGLE_BUTTON (widget)->active;
-}
-
-/**
- * e_dialog_spin_set:
- * @widget: A #GtkSpinButton.
- * @value: Numeric value.
- *
- * Sets the value of a #GtkSpinButton widget.
- **/
-void
-e_dialog_spin_set (GtkWidget *widget, double value)
-{
- GtkAdjustment *adj;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (GTK_IS_SPIN_BUTTON (widget));
-
- adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
-
- adj->value = value;
- g_signal_emit_by_name (adj, "value_changed", 0);
-}
-
-/**
- * e_dialog_spin_get_double:
- * @widget: A #GtkSpinButton.
- *
- * Queries the floating-point value of a #GtkSpinButton widget.
- *
- * Return value: Numeric value.
- **/
-double
-e_dialog_spin_get_double (GtkWidget *widget)
-{
- GtkAdjustment *adj;
-
- g_return_val_if_fail (widget != NULL, 0.0);
- g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), 0.0);
-
- adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
- return adj->value;
-}
-
-/**
- * e_dialog_spin_get_int:
- * @widget: A #GtkSpinButton.
- *
- * Queries the integer value of a #GtkSpinButton widget.
- *
- * Return value: Numeric value.
- **/
-int
-e_dialog_spin_get_int (GtkWidget *widget)
-{
- double value;
-
- g_return_val_if_fail (widget != NULL, -1);
- g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), -1);
-
- value = e_dialog_spin_get_double (widget);
- return (int) floor (value);
-}
-
-/**
- * e_dialog_option_menu_set:
- * @widget: A #GtkOptionMenu.
- * @value: Enumerated value.
- * @value_map: Map from enumeration values to array indices.
- *
- * Sets the selected item in a #GtkOptionMenu. Please read the description of
- * e_dialog_radio_set() to see how @value_map maps enumeration values to item
- * indices.
- **/
-void
-e_dialog_option_menu_set (GtkWidget *widget, int value, const int *value_map)
-{
- int i;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (GTK_IS_OPTION_MENU (widget));
- g_return_if_fail (value_map != NULL);
-
- i = value_to_index (value_map, value);
-
- if (i != -1)
- gtk_option_menu_set_history (GTK_OPTION_MENU (widget), i);
- else
- g_message ("e_dialog_option_menu_set(): could not find value %d in value map!",
- value);
-}
-
-/**
- * e_dialog_option_menu_get:
- * @widget: A #GtkOptionMenu.
- * @value_map: Map from enumeration values to array indices.
- *
- * Queries the selected item in a #GtkOptionMenu. Please read the description
- * of e_dialog_radio_set() to see how @value_map maps enumeration values to item
- * indices.
- *
- * Return value: Enumeration value which corresponds to the selected item in the
- * option menu.
- **/
-int
-e_dialog_option_menu_get (GtkWidget *widget, const int *value_map)
-{
- GtkMenu *menu;
- GtkWidget *active;
- GList *children;
- GList *l;
- int i;
- int v;
-
- g_return_val_if_fail (widget != NULL, -1);
- g_return_val_if_fail (GTK_IS_OPTION_MENU (widget), -1);
- g_return_val_if_fail (value_map != NULL, -1);
-
- menu = GTK_MENU (gtk_option_menu_get_menu (GTK_OPTION_MENU (widget)));
-
- active = gtk_menu_get_active (menu);
- g_assert (active != NULL);
-
- children = GTK_MENU_SHELL (menu)->children;
-
- for (i = 0, l = children; l; l = l->next, i++) {
- if (GTK_WIDGET (l->data) == active)
- break;
- }
-
- g_assert (l != NULL);
-
- v = index_to_value (value_map, i);
- if (v == -1) {
- g_message ("e_dialog_option_menu_get(): could not find index %d in value map!", i);
- return -1;
- }
-
- return v;
-}
-
-/**
- * e_dialog_dateedit_set:
- * @widget: A #GnomeDateEdit widget.
- * @t: Date/time value.
- *
- * Sets the value of a #GnomeDateEdit widget.
- **/
-void
-e_dialog_dateedit_set (GtkWidget *widget, time_t t)
-{
- g_return_if_fail (widget != NULL);
- g_return_if_fail (GNOME_IS_DATE_EDIT (widget));
-
- gnome_date_edit_set_time (GNOME_DATE_EDIT (widget), t);
-}
-
-/**
- * e_dialog_dateedit_get:
- * @widget: A #GnomeDateEdit widget.
- *
- * Queries the value of a #GnomeDateEdit widget.
- *
- * Return value: Date/time value.
- **/
-time_t
-e_dialog_dateedit_get (GtkWidget *widget)
-{
- g_return_val_if_fail (widget != NULL, -1);
- g_return_val_if_fail (GNOME_IS_DATE_EDIT (widget), -1);
-
- return gnome_date_edit_get_date (GNOME_DATE_EDIT (widget));
-}
-
-/**
- * e_dialog_widget_hook_value:
- * @dialog: Dialog box in which the @widget lives in.
- * @widget: A widget that will control a variable.
- * @value_var: Pointer to the variable that the @widget will control.
- * @info: NULL for most widgets, or an integer value map array (see
- * e_dialog_radio_set() for details).
- *
- * Hooks a widget from a dialog box to the variable it will modify. Supported
- * widgets are: #GtkEditable (char *), #GtkRadioButton (int/value_map pair; see
- * e_dialog_radio_set() for more information), #GtkTogglebutton (gboolean),
- * #GtkSpinButton (double), #GtkOptionMenu (int/value_map pair), and
- * #GnomeDateEdit (time_t).
- *
- * A pointer to the appropriate variable to modify should be passed in @value_var.
- * For values that take a value_map array as well, it should be passed in @info.
- *
- * The widgets within a dialog that are hooked with this function will set their
- * respective variables only when e_dialog_get_values() is called. The typical
- * use is to call that function in the handler for the "OK" button of a dialog
- * box.
- *
- * In addition, if the specified @dialog is a #GnomePropertyBox, the widgets wil
- * automatically turn on the "Apply" button of the property box when they are
- * modified by the user.
- *
- * Return value: TRUE if the type of the specified @widget is supported, FALSE
- * otherwise.
- **/
-gboolean
-e_dialog_widget_hook_value (GtkWidget *dialog, GtkWidget *widget,
- gpointer value_var, gpointer info)
-{
- DialogHooks *hooks;
- WidgetHook *wh;
-
- g_return_val_if_fail (dialog != NULL, FALSE);
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
- g_return_val_if_fail (value_var != NULL, FALSE);
-
- hooks = get_dialog_hooks (dialog);
-
- /* First check if it is a "group" widget, like a radio button or an
- * option menu. Then we check for normal ungrouped widgets.
- */
-
- if (GTK_IS_RADIO_BUTTON (widget))
- hook_radio (dialog, GTK_RADIO_BUTTON (widget), value_var, info);
- else if (GTK_IS_OPTION_MENU (widget))
- hook_option_menu (dialog, GTK_OPTION_MENU (widget), value_var, info);
- else if (GTK_IS_TOGGLE_BUTTON (widget))
- hook_toggle (dialog, GTK_TOGGLE_BUTTON (widget), value_var, info);
- else if (GTK_IS_SPIN_BUTTON (widget))
- hook_spin_button (dialog, GTK_SPIN_BUTTON (widget), value_var, info);
- else if (GTK_IS_EDITABLE (widget))
- hook_editable (dialog, GTK_EDITABLE (widget), value_var, info);
- else
- return FALSE;
-
- wh = g_new (WidgetHook, 1);
- wh->widget = widget;
- wh->value_var = value_var;
- wh->info = info;
-
- hooks->whooks = g_slist_prepend (hooks->whooks, wh);
-
- return TRUE;
-}
-
-/**
- * e_dialog_get_values:
- * @dialog: A dialog box whose widgets have been hooked to the appropriate
- * variables with e_dialog_widget_hook_value().
- *
- * Makes every widget in a @dialog that was hooked with
- * e_dialog_widget_hook_value() apply its value to its corresponding variable.
- * The typical usage is to call this function in the handler for the "OK" button
- * of a dialog box.
- **/
-void
-e_dialog_get_values (GtkWidget *dialog)
-{
- DialogHooks *hooks;
- GSList *l;
-
- g_return_if_fail (dialog != NULL);
-
- hooks = get_dialog_hooks (dialog);
-
- for (l = hooks->whooks; l; l = l->next) {
- WidgetHook *wh;
-
- wh = l->data;
-
- if (GTK_IS_RADIO_BUTTON (wh->widget))
- get_radio_value (GTK_RADIO_BUTTON (wh->widget), wh->value_var, wh->info);
- else if (GTK_IS_OPTION_MENU (wh->widget))
- get_option_menu_value (GTK_OPTION_MENU (wh->widget), wh->value_var, wh->info);
- else if (GTK_IS_TOGGLE_BUTTON (wh->widget))
- get_toggle_value (GTK_TOGGLE_BUTTON (wh->widget), wh->value_var, wh->info);
- else if (GTK_IS_SPIN_BUTTON (wh->widget))
- get_spin_button_value (GTK_SPIN_BUTTON (wh->widget), wh->value_var, wh->info);
- else if (GTK_IS_EDITABLE (wh->widget))
- get_editable_value (GTK_EDITABLE (wh->widget), wh->value_var, wh->info);
- else
- g_assert_not_reached ();
- }
-}
-
-/**
- * e_dialog_xml_widget_hook_value:
- * @xml: Glade XML description of a dialog box.
- * @dialog: Dialog box in which the widget lives in.
- * @widget_name: Name of the widget in the Glade XML data.
- * @value_var: Pointer to the variable that the widget will control.
- * @info: NULL for most widgets, or an integer value map array (see
- * e_dialog_radio_set() for details).
- *
- * Similar to e_dialog_widget_hook_value(), but uses the widget from a #GladeXML
- * data structure.
- *
- * Return value: TRUE if the type of the specified widget is supported, FALSE
- * otherwise.
- **/
-gboolean
-e_dialog_xml_widget_hook_value (GladeXML *xml, GtkWidget *dialog, const char *widget_name,
- gpointer value_var, gpointer info)
-{
- GtkWidget *widget;
-
- g_return_val_if_fail (xml != NULL, FALSE);
- g_return_val_if_fail (GLADE_IS_XML (xml), FALSE);
- g_return_val_if_fail (dialog != NULL, FALSE);
- g_return_val_if_fail (widget_name != NULL, FALSE);
- g_return_val_if_fail (value_var != NULL, FALSE);
-
- widget = glade_xml_get_widget (xml, widget_name);
- if (!widget) {
- g_message ("e_dialog_xml_widget_hook_value(): could not find widget `%s' in "
- "Glade data!", widget_name);
- return FALSE;
- }
-
- return e_dialog_widget_hook_value (dialog, widget, value_var, info);
-}
diff --git a/e-util/e-dialog-widgets.h b/e-util/e-dialog-widgets.h
deleted file mode 100644
index a006092e04..0000000000
--- a/e-util/e-dialog-widgets.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Evolution internal utilities - Glade dialog widget utilities
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef E_DIALOG_WIDGETS_H
-#define E_DIALOG_WIDGETS_H
-
-#include <time.h>
-#include <glade/glade.h>
-
-
-
-void e_dialog_editable_set (GtkWidget *widget, const char *value);
-char *e_dialog_editable_get (GtkWidget *widget);
-
-void e_dialog_radio_set (GtkWidget *widget, int value, const int *value_map);
-int e_dialog_radio_get (GtkWidget *widget, const int *value_map);
-
-void e_dialog_toggle_set (GtkWidget *widget, gboolean value);
-gboolean e_dialog_toggle_get (GtkWidget *widget);
-
-void e_dialog_spin_set (GtkWidget *widget, double value);
-double e_dialog_spin_get_double (GtkWidget *widget);
-int e_dialog_spin_get_int (GtkWidget *widget);
-
-void e_dialog_option_menu_set (GtkWidget *widget, int value, const int *value_map);
-int e_dialog_option_menu_get (GtkWidget *widget, const int *value_map);
-
-void e_dialog_dateedit_set (GtkWidget *widget, time_t t);
-time_t e_dialog_dateedit_get (GtkWidget *widget);
-
-gboolean e_dialog_widget_hook_value (GtkWidget *dialog, GtkWidget *widget,
- gpointer value_var, gpointer info);
-
-void e_dialog_get_values (GtkWidget *dialog);
-
-gboolean e_dialog_xml_widget_hook_value (GladeXML *xml, GtkWidget *dialog, const char *widget_name,
- gpointer value_var, gpointer info);
-
-
-
-#endif
diff --git a/e-util/e-error-tool.c b/e-util/e-error-tool.c
deleted file mode 100644
index 4544b8b158..0000000000
--- a/e-util/e-error-tool.c
+++ /dev/null
@@ -1,134 +0,0 @@
-
-#include <errno.h>
-
-#include <stdio.h>
-
-#include <string.h>
-#include <sys/types.h>
-#include <dirent.h>
-
-#include <unistd.h>
-
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-
-#include <glib.h>
-
-static void
-dump_cstring(FILE *out, const char *tmp)
-{
- const char *p;
- int c;
-
- fprintf(out, "char *s = N_(\"");
- p = tmp;
- while ( (c = *p++) ) {
- switch (c) {
- case '\n':
- fprintf(out, "\\n\"\n\t\"");
- break;
- case '\r':
- fprintf(out, "\\r");
- break;
- case '\t':
- fprintf(out, "\\t");
- break;
- case '"':
- case '\\':
- fprintf(out, "\\%c", c);
- break;
- default:
- fputc(c, out);
- }
- }
-
- fprintf(out, "\");\n");
-}
-
-static void
-extract_strings(FILE *out, const char *path)
-{
- xmlDocPtr doc;
- xmlNodePtr root, error, scan;
- char *tmp, *domain;
-
- doc = xmlParseFile(path);
- if (doc == NULL) {
- g_warning("Error file '%s' not found", path);
- return;
- }
-
- root = xmlDocGetRootElement(doc);
- if (root == NULL
- || strcmp(root->name, "error-list") != 0
- || (domain = xmlGetProp(root, "domain")) == NULL) {
- g_warning("Error file '%s' invalid format", path);
- xmlFreeDoc(doc);
- return;
- }
-
- for (error = root->children;error;error = error->next) {
- char *id;
-
- if (strcmp(error->name, "error") != 0)
- continue;
-
- id = xmlGetProp(error, "id");
- if (id == NULL) {
- g_warning("Error format invalid, missing error id");
- _exit(1);
- }
-
- for (scan = error->children;scan;scan=scan->next) {
- if (!strcmp(scan->name, "primary")
- || !strcmp(scan->name, "secondary")
- || !strcmp(scan->name, "title")) {
- fprintf(out, "/* %s:%s %s */\n", domain, id, scan->name);
- tmp = xmlNodeGetContent(scan);
- if (tmp) {
- dump_cstring(out, tmp);
- xmlFree(tmp);
- }
- } else if (!strcmp(scan->name, "button")) {
- tmp = xmlGetProp(scan, "label");
- if (tmp) {
- dump_cstring(out, tmp);
- xmlFree(tmp);
- }
- }
- }
- xmlFree(id);
- }
-
- xmlFree(domain);
-
- xmlFreeDoc(doc);
-}
-
-int main(int argc, char **argv)
-{
- int i;
- FILE *out;
-
- for (i=1;i<argc;i++) {
- char *orig_name, *name;
-
- orig_name = g_path_get_basename (argv[i]);
- name = g_strdup_printf("%s.h", orig_name);
- g_free (orig_name);
-
- out = fopen(name, "w");
- if (out == NULL) {
- fprintf(stderr, "Error creating %s: %s\n", name, strerror(errno));
- return 1;
- }
- extract_strings(out, argv[i]);
- if (fclose(out) != 0) {
- fprintf(stderr, "Error writing to %s: %s\n", name, strerror(errno));
- return 1;
- }
- g_free(name);
- }
-
- return 0;
-}
diff --git a/e-util/e-event.c b/e-util/e-event.c
deleted file mode 100644
index 156d0ae839..0000000000
--- a/e-util/e-event.c
+++ /dev/null
@@ -1,559 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Michael Zucchi <notzed@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <stdlib.h>
-
-#include <glib.h>
-
-#include <gtk/gtkmenu.h>
-#include <gtk/gtkmenuitem.h>
-#include <gtk/gtkimagemenuitem.h>
-#include <gtk/gtkcheckmenuitem.h>
-#include <gtk/gtkradiomenuitem.h>
-#include <gtk/gtkseparatormenuitem.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkimage.h>
-
-#include "e-event.h"
-
-#include <e-util/e-icon-factory.h>
-
-#include <libgnome/gnome-i18n.h>
-
-#define d(x)
-
-struct _EEventFactory {
- struct _EEventFactory *next, *prev;
-
- char *menuid;
- EEventFactoryFunc factory;
- void *factory_data;
-};
-
-struct _event_node {
- struct _event_node *next, *prev;
-
- GSList *events;
- void *data;
- EEventItemsFunc freefunc;
-};
-
-struct _event_info {
- struct _event_node *parent;
- EEventItem *item;
-};
-
-struct _EEventPrivate {
- EDList events;
-
- GSList *sorted; /* sorted list of struct _event_info's */
-};
-
-static GObjectClass *ep_parent;
-
-static void
-ep_init(GObject *o)
-{
- EEvent *emp = (EEvent *)o;
- struct _EEventPrivate *p;
-
- p = emp->priv = g_malloc0(sizeof(struct _EEventPrivate));
-
- e_dlist_init(&p->events);
-}
-
-static void
-ep_finalise(GObject *o)
-{
- EEvent *emp = (EEvent *)o;
- struct _EEventPrivate *p = emp->priv;
- struct _event_node *node;
-
- if (emp->target)
- e_event_target_free(emp, emp->target);
-
- g_free(emp->id);
-
- while ((node = (struct _event_node *)e_dlist_remhead(&p->events))) {
- if (node->freefunc)
- node->freefunc(emp, node->events, node->data);
-
- g_free(node);
- }
-
- g_slist_foreach(p->sorted, (GFunc)g_free, NULL);
- g_slist_free(p->sorted);
-
- g_free(p);
-
- ((GObjectClass *)ep_parent)->finalize(o);
-}
-
-static void
-ep_target_free(EEvent *ep, EEventTarget *t)
-{
- g_free(t);
- g_object_unref(ep);
-}
-
-static void
-ep_class_init(GObjectClass *klass)
-{
- d(printf("EEvent class init %p '%s'\n", klass, g_type_name(((GObjectClass *)klass)->g_type_class.g_type)));
-
- klass->finalize = ep_finalise;
- ((EEventClass *)klass)->target_free = ep_target_free;
-}
-
-/**
- * e_event_get_type:
- *
- * Standard GObject type function. Used to subclass EEvent.
- *
- * Return value: The EEvent type.
- **/
-GType
-e_event_get_type(void)
-{
- static GType type = 0;
-
- if (type == 0) {
- static const GTypeInfo info = {
- sizeof(EEventClass),
- (GBaseInitFunc)NULL, NULL,
- (GClassInitFunc)ep_class_init, NULL, NULL,
- sizeof(EEvent), 0,
- (GInstanceInitFunc)ep_init
- };
- ep_parent = g_type_class_ref(G_TYPE_OBJECT);
- type = g_type_register_static(G_TYPE_OBJECT, "EEvent", &info, 0);
- }
-
- return type;
-}
-
-/**
- * e_event_construct:
- * @ep: An instantiated but uninitialised EEvent.
- * @id: Event manager id.
- *
- * Construct the base event instance with standard parameters.
- *
- * Return value: Returns @ep.
- **/
-EEvent *e_event_construct(EEvent *ep, const char *id)
-{
- ep->id = g_strdup(id);
-
- return ep;
-}
-
-/**
- * e_event_add_items:
- * @emp: An initialised EEvent structure.
- * @items: A list of EEventItems event listeners to register on this event manager.
- * @freefunc: A function called when the @items list is no longer needed.
- * @data: callback data for @freefunc and for item event handlers.
- *
- * Adds @items to the list of events listened to on the event manager @emp.
- *
- * Return value: An opaque key which can later be passed to remove_items.
- **/
-void *
-e_event_add_items(EEvent *emp, GSList *items, EEventItemsFunc freefunc, void *data)
-{
- struct _event_node *node;
-
- node = g_malloc(sizeof(*node));
- node->events = items;
- node->freefunc = freefunc;
- node->data = data;
- e_dlist_addtail(&emp->priv->events, (EDListNode *)node);
-
- if (emp->priv->sorted) {
- g_slist_foreach(emp->priv->sorted, (GFunc)g_free, NULL);
- g_slist_free(emp->priv->sorted);
- emp->priv->sorted = NULL;
- }
-
- return (void *)node;
-}
-
-/**
- * e_event_remove_items:
- * @emp:
- * @handle:
- *
- * Remove items previously added. They MUST have been previously
- * added, and may only be removed once.
- **/
-void
-e_event_remove_items(EEvent *emp, void *handle)
-{
- struct _event_node *node = handle;
-
- e_dlist_remove((EDListNode *)node);
- if (node->freefunc)
- node->freefunc(emp, node->events, node->data);
- g_free(node);
-
- if (emp->priv->sorted) {
- g_slist_foreach(emp->priv->sorted, (GFunc)g_free, NULL);
- g_slist_free(emp->priv->sorted);
- emp->priv->sorted = NULL;
- }
-}
-
-static int
-ee_cmp(const void *ap, const void *bp)
-{
- int a = ((struct _event_info **)ap)[0]->item->priority;
- int b = ((struct _event_info **)bp)[0]->item->priority;
-
- if (a < b)
- return 1;
- else if (a > b)
- return -1;
- else
- return 0;
-}
-
-/**
- * e_event_emit:
- * @ee: An initialised EEvent, potentially with registered event listeners.
- * @id: Event name. This will be compared against EEventItem.id.
- * @target: The target describing the event context. This will be implementation defined.
- *
- * Emit an event. @target will automatically be freed once its
- * emission is complete.
- **/
-void
-e_event_emit(EEvent *emp, const char *id, EEventTarget *target)
-{
- struct _EEventPrivate *p = emp->priv;
- GSList *events;
-
- d(printf("emit event %s\n", id));
-
- g_assert(emp->target == NULL);
-
- emp->target = target;
- events = p->sorted;
- if (events == NULL) {
- struct _event_node *node = (struct _event_node *)p->events.head;
-
- for (;node->next;node=node->next) {
- GSList *l = node->events;
-
- for (;l;l=g_slist_next(l)) {
- struct _event_info *info;
-
- info = g_malloc0(sizeof(*info));
- info->parent = node;
- info->item = l->data;
- events = g_slist_prepend(events, info);
- }
- }
-
- p->sorted = events = g_slist_sort(events, ee_cmp);
- }
-
- for (;events;events=g_slist_next(events)) {
- struct _event_info *info = events->data;
- EEventItem *event = info->item;
-
- d(printf("event '%s' mask %08x target %08x\n", event->id, event->enable, target->mask));
-
- if (event->enable & target->mask)
- continue;
-
- if (strcmp(event->id, id) == 0) {
- event->handle(emp, event, info->parent->data);
-
- if (event->type == E_EVENT_SINK)
- break;
- }
- }
-
- e_event_target_free(emp, target);
- emp->target = NULL;
-}
-
-/**
- * e_event_target_new:
- * @ep: An initialised EEvent instance.
- * @type: type, up to implementor
- * @size: The size of memory to allocate. This must be >= sizeof(EEventTarget).
- *
- * Allocate a new event target suitable for this class. It is up to
- * the implementation to define the available target types and their
- * structure.
- **/
-void *e_event_target_new(EEvent *ep, int type, size_t size)
-{
- EEventTarget *t;
-
- g_assert(size >= sizeof(EEventTarget));
-
- t = g_malloc0(size);
- t->event = ep;
- g_object_ref(ep);
- t->type = type;
-
- return t;
-}
-
-/**
- * e_event_target_free:
- * @ep: An initialised EEvent instance on which this target was allocated.
- * @o: The target to free.
- *
- * Free a target. This invokes the virtual free method on the EEventClass.
- **/
-void
-e_event_target_free(EEvent *ep, void *o)
-{
- EEventTarget *t = o;
-
- ((EEventClass *)G_OBJECT_GET_CLASS(ep))->target_free(ep, t);
-}
-
-/* ********************************************************************** */
-
-/* Event menu plugin handler */
-
-/*
-<e-plugin
- class="org.gnome.mail.plugin.event:1.0"
- id="org.gnome.mail.plugin.event.item:1.0"
- type="shlib"
- location="/opt/gnome2/lib/camel/1.0/libcamelimap.so"
- name="imap"
- description="IMAP4 and IMAP4v1 mail store">
- <hook class="org.gnome.mail.eventMenu:1.0"
- handler="HandleEvent">
- <menu id="any" target="select">
- <item
- type="item|toggle|radio|image|submenu|bar"
- active
- path="foo/bar"
- label="label"
- icon="foo"
- mask="select_one"
- activate="ep_view_emacs"/>
- </menu>
- </extension>
-
- <hook class="org.gnome.evolution.mail.events:1.0">
- <event id=".folder.changed"
- target=""
- priority="0"
- handle="gotevent"
- enable="new"
- />
- <event id=".message.read"
- priority="0"
- handle="gotevent"
- mask="new"
- />
- </hook>
-
-*/
-
-static void *emph_parent_class;
-#define emph ((EEventHook *)eph)
-
-/* must have 1:1 correspondence with e-event types in order */
-static const EPluginHookTargetKey emph_item_types[] = {
- { "pass", E_EVENT_PASS },
- { "sink", E_EVENT_SINK },
- { 0 }
-};
-
-static void
-emph_event_handle(EEvent *ee, EEventItem *item, void *data)
-{
- struct _EEventHook *hook = data;
-
- /* FIXME: we could/should just remove the items we added to the event handler */
- if (!hook->hook.plugin->enabled)
- return;
-
- e_plugin_invoke(hook->hook.plugin, (char *)item->user_data, ee->target);
-}
-
-static void
-emph_free_item(struct _EEventItem *item)
-{
- g_free((char *)item->id);
- g_free(item->user_data);
- g_free(item);
-}
-
-static void
-emph_free_items(EEvent *ee, GSList *items, void *data)
-{
- /*EPluginHook *eph = data;*/
-
- g_slist_foreach(items, (GFunc)emph_free_item, NULL);
- g_slist_free(items);
-}
-
-static struct _EEventItem *
-emph_construct_item(EPluginHook *eph, xmlNodePtr root, EEventHookClass *klass)
-{
- struct _EEventItem *item;
- EEventHookTargetMap *map;
- char *tmp;
-
- item = g_malloc0(sizeof(*item));
-
- tmp = xmlGetProp(root, "target");
- if (tmp == NULL)
- goto error;
- map = g_hash_table_lookup(klass->target_map, tmp);
- xmlFree(tmp);
- if (map == NULL)
- goto error;
- item->target_type = map->id;
- item->type = e_plugin_hook_id(root, emph_item_types, "type");
- if (item->type == -1)
- item->type = E_EVENT_PASS;
- item->priority = e_plugin_xml_int(root, "priority", 0);
- item->id = e_plugin_xml_prop(root, "id");
- item->enable = e_plugin_hook_mask(root, map->mask_bits, "enable");
- item->user_data = e_plugin_xml_prop(root, "handle");
-
- if (item->user_data == NULL || item->id == NULL)
- goto error;
-
- item->handle = emph_event_handle;
-
- return item;
-error:
- emph_free_item(item);
- return NULL;
-}
-
-static int
-emph_construct(EPluginHook *eph, EPlugin *ep, xmlNodePtr root)
-{
- xmlNodePtr node;
- EEventHookClass *klass;
- GSList *items = NULL;
-
- g_return_val_if_fail(((EEventHookClass *)G_OBJECT_GET_CLASS(eph))->event != NULL, -1);
-
- d(printf("loading event hook\n"));
-
- if (((EPluginHookClass *)emph_parent_class)->construct(eph, ep, root) == -1)
- return -1;
-
- klass = (EEventHookClass *)G_OBJECT_GET_CLASS(eph);
-
- node = root->children;
- while (node) {
- if (strcmp(node->name, "event") == 0) {
- struct _EEventItem *item;
-
- item = emph_construct_item(eph, node, klass);
- if (item)
- items = g_slist_prepend(items, item);
- }
- node = node->next;
- }
-
- eph->plugin = ep;
-
- if (items)
- e_event_add_items(klass->event, items, emph_free_items, eph);
-
- return 0;
-}
-
-static void
-emph_finalise(GObject *o)
-{
- /*EPluginHook *eph = (EPluginHook *)o;*/
-
- ((GObjectClass *)emph_parent_class)->finalize(o);
-}
-
-static void
-emph_class_init(EPluginHookClass *klass)
-{
- ((GObjectClass *)klass)->finalize = emph_finalise;
- klass->construct = emph_construct;
-
- /* this is actually an abstract implementation but list it anyway */
- klass->id = "org.gnome.evolution.event:1.0";
-
- d(printf("EEventHook: init class %p '%s'\n", klass, g_type_name(((GObjectClass *)klass)->g_type_class.g_type)));
-
- ((EEventHookClass *)klass)->target_map = g_hash_table_new(g_str_hash, g_str_equal);
-}
-
-/**
- * e_event_hook_get_type:
- *
- * Standard GObject function to get the EEvent object type. Used to
- * subclass EEventHook.
- *
- * Return value: The type of the event hook class.
- **/
-GType
-e_event_hook_get_type(void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof(EEventHookClass), NULL, NULL, (GClassInitFunc) emph_class_init, NULL, NULL,
- sizeof(EEventHook), 0, (GInstanceInitFunc) NULL,
- };
-
- emph_parent_class = g_type_class_ref(e_plugin_hook_get_type());
- type = g_type_register_static(e_plugin_hook_get_type(), "EEventHook", &info, 0);
- }
-
- return type;
-}
-
-/**
- * e_event_hook_class_add_target_map:
- * @klass: The derived EEventHook class.
- * @map: A map used to describe a single EEventTarget type for this
- * class.
- *
- * Add a target map to a concrete derived class of EEvent. The target
- * map enumerates a single target type and th eenable mask bit names,
- * so that the type can be loaded automatically by the base EEvent class.
- **/
-void e_event_hook_class_add_target_map(EEventHookClass *klass, const EEventHookTargetMap *map)
-{
- g_hash_table_insert(klass->target_map, (void *)map->type, (void *)map);
-}
diff --git a/e-util/e-event.h b/e-util/e-event.h
deleted file mode 100644
index f73f0444db..0000000000
--- a/e-util/e-event.h
+++ /dev/null
@@ -1,238 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Authors: Michel Zucchi <notzed@ximian.com>
- *
- * Copyright 2004 Novell Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-/*
- This a bit 'whipped together', so is likely to change mid-term
-*/
-
-#ifndef __E_EVENT_H__
-#define __E_EVENT_H__
-
-#include <glib-object.h>
-#include "libedataserver/e-msgport.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* This is an abstract event management class. */
-
-typedef struct _EEvent EEvent;
-typedef struct _EEventClass EEventClass;
-
-typedef struct _EEventItem EEventItem;
-typedef struct _EEventFactory EEventFactory; /* anonymous type */
-typedef struct _EEventTarget EEventTarget;
-
-typedef void (*EEventItemsFunc)(EEvent *ee, GSList *items, void *data);
-typedef void (*EEventFunc)(EEvent *ee, EEventItem *item, void *data);
-typedef void (*EEventFactoryFunc)(EEvent *ee, void *);
-
-/**
- * enum _e_event_t - Event type.
- *
- * @E_EVENT_PASS: A passthrough event handler which only receives the event.
- * @E_EVENT_SINK: A sink event handler swallows all events it processes.
- *
- * The event type defines what type of event listener this is.
- *
- * Events should normally be @E_EVENT_PASS.
- **/
-enum _e_event_t {
- E_EVENT_PASS, /* passthrough */
- E_EVENT_SINK, /* sink events */
-};
-
-/**
- * struct _EEventItem - An event listener item.
- *
- * @type: The type of the event listener.
- * @priority: A signed number signifying the priority of the event
- * listener. 0 should be used normally. This is used to order event
- * receipt when multiple listners are present.
- * @id: The name of the event to listen to. By convention events are of the form
- * "component.subcomponent". The target mask provides further
- * sub-event type qualification.
- * @target_type: Target type for this event. This is implementation
- * specific.
- * @handle: Event handler callback.
- * @user_data: Callback data.
- * @enable: Target-specific mask to qualify the receipt of events.
- * This is target and implementation specific.
- *
- * An EEventItem defines a specific event listening point on a given
- * EEvent object. When an event is broadcast onto an EEvent handler,
- * any matching EEventItems will be invoked in priority order.
- **/
-struct _EEventItem {
- enum _e_event_t type;
- int priority; /* priority of event */
- const char *id; /* event id */
- int target_type;
- EEventFunc handle;
- void *user_data;
- guint32 enable; /* enable mask */
-};
-
-/**
- * struct _EEventTarget - Base EventTarget.
- *
- * @event: Parent object.
- * @type: Target type. Defined by the implementation.
- * @mask: Mask of this target. This is defined by the implementation,
- * the type, and the actual content of the target.
- *
- * This defined a base EventTarget. This must be subclassed by
- * implementations to provide contextual data for events, and define
- * the enablement qualifiers.
- *
- **/
-struct _EEventTarget {
- struct _EEvent *event; /* used for virtual methods */
-
- guint32 type; /* targe type, for implementors */
- guint32 mask; /* depends on type, enable mask */
-
- /* implementation fields follow */
-};
-
-/**
- * struct _EEvent - An Event Manager.
- *
- * @object: Superclass.
- * @priv: Private data.
- * @id: Id of this event manager.
- * @target: The current target, only set during event emission.
- *
- * The EEvent manager object. Each component which defines event
- * types supplies a single EEvent manager object. This manager routes
- * all events invoked on this object to all registered listeners based
- * on their qualifiers.
- **/
-struct _EEvent {
- GObject object;
-
- struct _EEventPrivate *priv;
- char *id;
- EEventTarget *target; /* current target during event emission */
-};
-
-/**
- * struct _EEventClass - Event management type.
- *
- * @object_class: Superclass.
- * @target_free: Virtual method to free the target.
- *
- * The EEvent class definition. This must be sub-classed for each
- * component that wishes to provide hookable events. The subclass
- * only needs to know how to allocate and free each target type it
- * supports.
- **/
-struct _EEventClass {
- GObjectClass object_class;
-
- void (*target_free)(EEvent *ep, EEventTarget *t);
-};
-
-GType e_event_get_type(void);
-
-EEvent *e_event_construct(EEvent *, const char *id);
-
-void *e_event_add_items(EEvent *emp, GSList *items, EEventItemsFunc freefunc, void *data);
-void e_event_remove_items(EEvent *emp, void *handle);
-
-void e_event_emit(EEvent *, const char *id, EEventTarget *);
-
-void *e_event_target_new(EEvent *, int type, size_t size);
-void e_event_target_free(EEvent *, void *);
-
-/* ********************************************************************** */
-
-/* event plugin target, they are closely integrated */
-
-/* To implement a basic event menu plugin, you just need to subclass
- this and initialise the class target type tables */
-
-/* For events, the plugin item talks to a specific instance, rather than
- a set of instances of the hook handler */
-
-#include "e-util/e-plugin.h"
-
-typedef struct _EEventHook EEventHook;
-typedef struct _EEventHookClass EEventHookClass;
-
-typedef struct _EPluginHookTargetMap EEventHookTargetMap;
-typedef struct _EPluginHookTargetKey EEventHookTargetMask;
-
-typedef void (*EEventHookFunc)(struct _EPlugin *plugin, EEventTarget *target);
-
-/**
- * struct _EEventHook - An event hook.
- *
- * @hook: Superclass.
- *
- * The EEventHook class loads and manages the meta-data required to
- * track event listeners. Unlike other hook types, there is a 1:1
- * match between an EEventHook instance class and its EEvent instance.
- *
- * When the hook is loaded, all of its event hooks are stored directly
- * on the corresponding EEvent which is stored in its class static area.
- **/
-struct _EEventHook {
- EPluginHook hook;
-};
-
-/**
- * struct _EEventHookClass -
- *
- * @hook_class:
- * @target_map: Table of EPluginHookTargetMaps which enumerate the
- * target types and enable bits of the implementing class.
- * @event: The EEvent instance on which all loaded events must be registered.
- *
- * The EEventHookClass is an empty event hooking class, which must be
- * subclassed and initialised before use.
- *
- * The EPluginHookClass.id must be set to the name and version of the
- * hook handler itself, and then the type must be registered with the
- * EPlugin hook list before any plugins are loaded.
- **/
-struct _EEventHookClass {
- EPluginHookClass hook_class;
-
- /* EEventHookTargetMap by .type */
- GHashTable *target_map;
- /* the event router these events's belong to */
- EEvent *event;
-};
-
-GType e_event_hook_get_type(void);
-
-/* for implementors */
-void e_event_hook_class_add_target_map(EEventHookClass *klass, const EEventHookTargetMap *);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_EVENT_H__ */
diff --git a/e-util/e-folder-map.c b/e-util/e-folder-map.c
deleted file mode 100644
index 8643152a06..0000000000
--- a/e-util/e-folder-map.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <libxml/tree.h>
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-
-#include "e-folder-map.h"
-
-#define d(x)
-
-static gboolean
-is_type_folder (const char *metadata, const char *search_type)
-{
- xmlNodePtr node;
- xmlDocPtr doc;
- char *type;
-
- if (!(doc = xmlParseFile (metadata))) {
- g_warning ("Cannot parse `%s'", metadata);
- return FALSE;
- }
-
- if (!(node = xmlDocGetRootElement (doc))) {
- g_warning ("`%s' corrupt: document contains no root node", metadata);
- xmlFreeDoc (doc);
- return FALSE;
- }
-
- if (!node->name || strcmp (node->name, "efolder") != 0) {
- g_warning ("`%s' corrupt: root node is not 'efolder'", metadata);
- xmlFreeDoc (doc);
- return FALSE;
- }
-
- node = node->children;
- while (node != NULL) {
- if (node->name && !strcmp (node->name, "type")) {
- type = xmlNodeGetContent (node);
- if (!strcmp (type, search_type)) {
- xmlFreeDoc (doc);
- xmlFree (type);
-
- return TRUE;
- }
-
- xmlFree (type);
-
- break;
- }
-
- node = node->next;
- }
-
- xmlFreeDoc (doc);
-
- return FALSE;
-}
-
-static void
-e_folder_map_dir (const char *dirname, const char *type, GSList **dir_list)
-{
- char *path;
- const char *name;
- GDir *dir;
- GError *error = NULL;
-
- path = g_build_filename (dirname, "folder-metadata.xml", NULL);
- if (!g_file_test (path, G_FILE_TEST_IS_REGULAR)) {
- g_free (path);
- return;
- }
-
- if (!is_type_folder (path, type)) {
- g_free (path);
- goto try_subdirs;
- }
-
- d(g_message ("Found '%s'", dirname));
- *dir_list = g_slist_prepend (*dir_list, g_strdup (dirname));
-
- g_free (path);
-
- try_subdirs:
-
- path = g_build_filename (dirname, "subfolders", NULL);
- if (!g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) {
- g_free (path);
- return;
- }
-
- if (!(dir = g_dir_open (path, 0, &error))) {
- g_warning ("cannot open `%s': %s", path, error->message);
- g_error_free (error);
- g_free (path);
- return;
- }
-
- while ((name = g_dir_read_name (dir))) {
- char *full_path;
-
- if (*name == '.')
- continue;
-
- full_path = g_build_filename (path, name, NULL);
- if (!g_file_test (full_path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) {
- g_free (full_path);
- continue;
- }
-
- e_folder_map_dir (full_path, type, dir_list);
- g_free (full_path);
- }
-
- g_dir_close (dir);
-
- g_free (path);
-}
-
-GSList *
-e_folder_map_local_folders (char *local_dir, char *type)
-{
- const char *name;
- GDir *dir;
- GSList *dir_list = NULL;
- GError *error = NULL;
-
- if (!(dir = g_dir_open (local_dir, 0, &error))) {
- g_warning ("cannot open `%s': %s", local_dir, error->message);
- g_error_free (error);
- return NULL;
- }
-
- while ((name = g_dir_read_name (dir))) {
- char *full_path;
-
- if (*name == '.')
- continue;
-
- full_path = g_build_filename (local_dir, name, NULL);
- d(g_message ("Looking in %s", full_path));
- if (!g_file_test (full_path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) {
- g_free (full_path);
- continue;
- }
-
- e_folder_map_dir (full_path, type, &dir_list);
-
- g_free (full_path);
- }
-
- g_dir_close (dir);
-
- return dir_list;
-}
diff --git a/e-util/e-folder-map.h b/e-util/e-folder-map.h
deleted file mode 100644
index aeb5b39811..0000000000
--- a/e-util/e-folder-map.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifndef __E_FOLDER_MAP_H__
-#define __E_FOLDER_MAP_H__
-
-#include <glib.h>
-
-G_BEGIN_DECLS
-
-GSList *e_folder_map_local_folders (char *local_dir, char *type);
-
-G_END_DECLS
-
-#endif /* __E_FOLDER_MAP_H__ */
diff --git a/e-util/e-fsutils.c b/e-util/e-fsutils.c
deleted file mode 100644
index 923dd5ec42..0000000000
--- a/e-util/e-fsutils.c
+++ /dev/null
@@ -1,158 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Authors: Michael Zucchi <notzed@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <dirent.h>
-
-/* This isn't as portable as, say, the stuff in GNU coreutils. But I care not for OSF1. */
-#ifdef HAVE_STATVFS
-# ifdef HAVE_SYS_STATVFS_H
-# include <sys/statvfs.h>
-# endif
-#else
-#ifdef HAVE_STATFS
-# ifdef HAVE_SYS_PARAM_H
-# include <sys/param.h> /* bsd interface */
-# endif
-# ifdef HAVE_SYS_MOUNT_H
-# include <sys/mount.h>
-# endif
-#endif
-#endif
-
-#include <errno.h>
-#include <string.h>
-
-#include "e-fsutils.h"
-
-/**
- * e_fsutils_usage:
- * @path:
- *
- * Calculate the amount of disk space used by a given path.
- *
- * Return value: The number of 1024 byte blocks used by the
- * filesystem.
- **/
-long e_fsutils_usage(const char *inpath)
-{
- DIR *dir;
- struct dirent *d;
- long size = 0;
- GSList *paths;
-
- /* iterative, depth-first scan, because i can ... */
- paths = g_slist_prepend(NULL, g_strdup(inpath));
-
- while (paths) {
- char *path = paths->data;
-
- paths = g_slist_remove_link(paths, paths);
-
- dir = opendir(path);
- if (dir == NULL) {
- g_free(path);
- goto fail;
- }
-
- while ((d = readdir(dir))) {
- char *full_path;
- struct stat st;
-
- if (strcmp(d->d_name, ".") == 0
- || strcmp(d->d_name, "..") == 0)
- continue;
-
- full_path = g_build_filename(path, d->d_name, NULL);
- if (stat(full_path, &st) == -1) {
- g_free(full_path);
- closedir(dir);
- g_free(path);
- goto fail;
- } else if (S_ISDIR(st.st_mode)) {
- paths = g_slist_prepend(paths, full_path);
- full_path = NULL;
- } else if (S_ISREG(st.st_mode)) {
- /* This is in 512 byte blocks. st_blksize is page size on linux,
- on *BSD it might be significant. */
- size += st.st_blocks/2;
- }
-
- g_free(full_path);
- }
-
- closedir(dir);
- g_free(path);
- }
-
- return size;
-
-fail:
- g_slist_foreach(paths, (GFunc)g_free, NULL);
- g_slist_free(paths);
-
- return -1;
-}
-
-/**
- * e_fsutils_avail:
- * @path:
- *
- * Find the available disk space at the given path.
- *
- * Return value: -1 if it could not be determined, otherwise the
- * number of disk blocks, expressed as system-independent, 1024 byte
- * blocks.
- **/
-long
-e_fsutils_avail(const char *path)
-{
-#if defined(HAVE_STATVFS)
- struct statvfs stfs;
-
- if (statvfs(path, &stfs) == -1)
- return -1;
-
- /* Assumes that frsize === power of 2 */
- if (stfs.f_frsize >= 1024)
- return stfs.f_bavail * (stfs.f_frsize / 1024);
- else
- return stfs.f_bavail / (1024 / stfs.f_frsize);
-#elif defined(HAVE_STATFS)
- struct statfs stfs;
-
- if (statfs(path, &stfs) == -1)
- return -1;
-
- /* For BSD this isn't clear, it may be dependent on f_bsize */
- return stfs.f_bavail / 2;
-#else
- errno = ENOSYS;
- return -1;
-#endif
-}
-
diff --git a/e-util/e-fsutils.h b/e-util/e-fsutils.h
deleted file mode 100644
index 915e702a9a..0000000000
--- a/e-util/e-fsutils.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Authors: Michael Zucchi <notzed@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifndef E_FSUTILS_H
-#define E_FSUTILS_H
-
-#include <glib.h>
-
-G_BEGIN_DECLS
-
-long e_fsutils_usage(const char *path);
-long e_fsutils_avail(const char *path);
-
-G_END_DECLS
-
-#endif /* !E_FOLDER_MAP_H */
diff --git a/e-util/e-gtk-utils.c b/e-util/e-gtk-utils.c
deleted file mode 100644
index 99df6fe923..0000000000
--- a/e-util/e-gtk-utils.c
+++ /dev/null
@@ -1,216 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-gtk-utils.c
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtklayout.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkwidget.h>
-#include <gtk/gtkbutton.h>
-#include <gtk/gtkstock.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkimage.h>
-#include <gtk/gtkhbox.h>
-#include <gtk/gtkalignment.h>
-
-#include <gdk/gdkx.h>
-
-#include <X11/Xlib.h>
-
-#include "e-gtk-utils.h"
-
-
-void
-e_signal_connect_while_alive (void *instance,
- const char *name,
- GCallback callback,
- void *callback_data,
- void *alive_instance)
-{
- GClosure *closure;
-
- g_return_if_fail (GTK_IS_OBJECT (instance));
-
- closure = g_cclosure_new (callback, callback_data, NULL);
- g_object_watch_closure (alive_instance, closure);
- g_signal_connect_closure_by_id (instance, g_signal_lookup (name, G_OBJECT_TYPE (instance)), 0,
- closure, FALSE);
-}
-
-
-/* (Cut and pasted from Gtk.) */
-
-typedef struct DisconnectInfo {
- unsigned int signal_handler;
-
- GtkObject *object1;
- unsigned int disconnect_handler1;
-
- GtkObject *object2;
- unsigned int disconnect_handler2;
-} DisconnectInfo;
-
-static unsigned int
-alive_disconnecter (GtkObject *object,
- DisconnectInfo *info)
-{
- g_assert (info != NULL);
-
- g_signal_handler_disconnect (info->object1, info->disconnect_handler1);
- g_signal_handler_disconnect (info->object1, info->signal_handler);
- g_signal_handler_disconnect (info->object2, info->disconnect_handler2);
-
- g_free (info);
-
- return 0;
-}
-
-/**
- * e_gtk_signal_connect_full_while_alive:
- * @object:
- * @name:
- * @func:
- * @marshal:
- * @data:
- * @destroy_func:
- * @object_signal:
- * @after:
- * @alive_object:
- *
- * Connect a signal like `gtk_signal_connect_while_alive()', but with full
- * params like `gtk_signal_connect_full()'.
- **/
-void
-e_signal_connect_full_while_alive (void *instance,
- const char *name,
- GtkSignalFunc func,
- GtkCallbackMarshal marshal,
- void *data,
- GtkDestroyNotify destroy_func,
- gboolean instance_signal,
- gboolean after,
- void *alive_instance)
-{
- DisconnectInfo *info;
-
- g_return_if_fail (GTK_IS_OBJECT (instance));
- g_return_if_fail (name != NULL);
- g_return_if_fail (func != NULL);
- g_return_if_fail (GTK_IS_OBJECT (alive_instance));
-
- info = g_new (DisconnectInfo, 1);
-
- info->signal_handler = gtk_signal_connect_full (instance, name,
- func, marshal, data,
- destroy_func,
- instance_signal, after);
-
- info->object1 = instance;
- info->disconnect_handler1 = g_signal_connect (instance, "destroy",
- G_CALLBACK (alive_disconnecter), info);
-
- info->object2 = alive_instance;
- info->disconnect_handler2 = g_signal_connect (alive_instance, "destroy",
- G_CALLBACK (alive_disconnecter), info);
-}
-
-
-/* BackingStore support. */
-
-static void
-widget_realize_callback_for_backing_store (GtkWidget *widget,
- void *data)
-{
- XSetWindowAttributes attributes;
- GdkWindow *window;
-
- if (GTK_IS_LAYOUT (widget))
- window = GTK_LAYOUT (widget)->bin_window;
- else
- window = widget->window;
-
- attributes.backing_store = Always;
- XChangeWindowAttributes (GDK_WINDOW_XDISPLAY (window), GDK_WINDOW_XWINDOW (window),
- CWBackingStore, &attributes);
-}
-
-/**
- * e_make_widget_backing_stored:
- * @widget: A GtkWidget
- *
- * Make sure that the window for @widget has the BackingStore attribute set to
- * Always when realized. This will allow the widget to be refreshed by the X
- * server even if the application is currently not responding to X events (this
- * is e.g. very useful for the splash screen).
- *
- * Notice that this will not work 100% in all cases as the server might not
- * support that or just refuse to do so.
- **/
-void
-e_make_widget_backing_stored (GtkWidget *widget)
-{
- g_signal_connect (widget, "realize", G_CALLBACK (widget_realize_callback_for_backing_store), NULL);
-}
-
-
-/**
- * e_gtk_button_new_with_icon:
- * @text: The mnemonic text for the label.
- * @stock: The name of the stock item to get the icon from.
- *
- * Create a gtk button with a custom label and a stock icon.
- *
- *
- * Return value: The widget.
- **/
-GtkWidget *
-e_gtk_button_new_with_icon(const char *text, const char *stock)
-{
- GtkWidget *button, *label;
- GtkStockItem item;
-
- button = gtk_button_new();
- label = gtk_label_new_with_mnemonic(text);
- gtk_label_set_mnemonic_widget((GtkLabel *)label, button);
-
- if (gtk_stock_lookup(stock, &item)) {
- GtkWidget *image, *hbox, *align;
-
- image = gtk_image_new_from_stock(stock, GTK_ICON_SIZE_BUTTON);
- hbox = gtk_hbox_new(FALSE, 2);
- align = gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
- gtk_box_pack_start((GtkBox *)hbox, image, FALSE, FALSE, 0);
- gtk_box_pack_end((GtkBox *)hbox, label, FALSE, FALSE, 0);
- gtk_container_add((GtkContainer *)align, hbox);
- gtk_container_add((GtkContainer *)button, align);
- gtk_widget_show_all(align);
- } else {
- gtk_misc_set_alignment((GtkMisc *)label, 0.5, 0.5);
- gtk_container_add((GtkContainer *)button, label);
- gtk_widget_show(label);
- }
-
- return button;
-}
diff --git a/e-util/e-gtk-utils.h b/e-util/e-gtk-utils.h
deleted file mode 100644
index cebb5b757d..0000000000
--- a/e-util/e-gtk-utils.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-gtk-utils.c
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef E_GTK_UTILS_H
-#define E_GTK_UTILS_H
-
-#include <gtk/gtkobject.h>
-#include <gtk/gtkradiobutton.h>
-
-void e_signal_connect_while_alive (void *object,
- const char *name,
- GCallback callback,
- void *data,
- void *alive_instance);
-
-void e_signal_connect_full_while_alive (void *instance,
- const char *name,
- GtkSignalFunc func,
- GtkCallbackMarshal marshal,
- void *data,
- GtkDestroyNotify destroy_func,
- gboolean object_signal,
- gboolean after,
- void *alive_instance);
-
-void e_make_widget_backing_stored (GtkWidget *widget);
-
-GtkWidget *e_gtk_button_new_with_icon(const char *text, const char *stock);
-
-#endif
diff --git a/e-util/e-gui-utils.c b/e-util/e-gui-utils.c
deleted file mode 100644
index 3e8849fe93..0000000000
--- a/e-util/e-gui-utils.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * GUI utility functions
- *
- * Authors:
- * Miguel de Icaza (miguel@ximian.com)
- * Chris Toshok (toshok@ximian.com)
- *
- * Copyright (C) 1999 Miguel de Icaza
- * Copyright (C) 2000-2003 Ximian, Inc.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-
-#include "e-gui-utils.h"
-#include <e-util/e-icon-factory.h>
-
-#include <glib.h>
-#include <gtk/gtkalignment.h>
-#include <gtk/gtkimage.h>
-#include <gtk/gtkbutton.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkhbox.h>
-
-#include <libgnome/gnome-program.h>
-#include <libgnomevfs/gnome-vfs-mime-handlers.h>
-#include <libgnomeui/gnome-icon-lookup.h>
-
-GtkWidget *e_create_image_widget(gchar *name,
- gchar *string1, gchar *string2,
- gint int1, gint int2)
-{
- GtkWidget *alignment = NULL;
- GdkPixbuf *pixbuf;
- GtkWidget *w;
-
- if (string1) {
- w = e_icon_factory_get_image (string1, E_ICON_SIZE_DIALOG);
-
- gtk_misc_set_alignment (GTK_MISC (w), 0.5, 0.5);
-
- alignment = gtk_widget_new(gtk_alignment_get_type(),
- "child", w,
- "xalign", (double) 0,
- "yalign", (double) 0,
- "xscale", (double) 0,
- "yscale", (double) 0,
- NULL);
-
- gtk_widget_show_all (alignment);
- }
-
- return alignment;
-}
-
-GtkWidget *
-e_button_new_with_stock_icon (const char *label_str, const char *stockid)
-{
- GtkWidget *button, *hbox, *label, *align, *image;
-
- button = gtk_button_new ();
-
- label = gtk_label_new_with_mnemonic (label_str);
-
- gtk_label_set_mnemonic_widget (GTK_LABEL (label), button);
-
- image = gtk_image_new_from_stock (stockid, GTK_ICON_SIZE_BUTTON);
- hbox = gtk_hbox_new (FALSE, 2);
-
- align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
-
- gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
- gtk_box_pack_end (GTK_BOX (hbox), label, FALSE, FALSE, 0);
-
- gtk_container_add (GTK_CONTAINER (button), align);
- gtk_container_add (GTK_CONTAINER (align), hbox);
- gtk_widget_show_all (align);
-
- return button;
-}
-
-/**
- * e_icon_for_mime_type:
- * @mime_type: a MIME type
- * @size_hint: the size the caller plans to display the icon at
- *
- * Tries to find an icon representing @mime_type that will display
- * nicely at @size_hint by @size_hint pixels. The returned icon
- * may or may not actually be that size.
- *
- * Return value: a pixbuf, which the caller must unref when it is done
- **/
-GdkPixbuf *
-e_icon_for_mime_type (const char *mime_type, int size_hint)
-{
- static GnomeIconTheme *icon_theme = NULL;
- char *icon_name, *icon_path = NULL;
- GdkPixbuf *pixbuf = NULL;
-
- /* Try the icon theme. (GNOME 2.2 or Sun GNOME 2.0).
- * This will also look in GNOME VFS.
- */
-
- if (!icon_theme)
- icon_theme = gnome_icon_theme_new ();
-
- icon_name = gnome_icon_lookup (icon_theme, NULL, NULL, NULL, NULL,
- mime_type, 0, NULL);
- if (icon_name) {
- /* FIXME: should we take size_hint as being the same
- * as e-icon-factory.c? or should we just leave this
- * as pixel size? */
- icon_path = gnome_icon_theme_lookup_icon (
- icon_theme, icon_name, size_hint, NULL, NULL);
- g_free (icon_name);
- }
-
- if (icon_path == NULL)
- return NULL;
-
- pixbuf = gdk_pixbuf_new_from_file (icon_path, NULL);
- g_free (icon_path);
-
- return pixbuf;
-}
-
diff --git a/e-util/e-gui-utils.h b/e-util/e-gui-utils.h
deleted file mode 100644
index 8701949cb0..0000000000
--- a/e-util/e-gui-utils.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef E_GUI_UTILS_H
-#define E_GUI_UTILS_H
-
-#include <gtk/gtkwidget.h>
-#include <bonobo/bonobo-ui-util.h>
-#include <bonobo/bonobo-control.h>
-
-GtkWidget *e_create_image_widget (gchar *name, gchar *string1, gchar *string2, gint int1, gint int2);
-
-GtkWidget *e_button_new_with_stock_icon (const char *label_str, const char *stockid);
-
-GdkPixbuf *e_icon_for_mime_type (const char *mime_type, int size);
-
-#endif /* E_GUI_UTILS_H */
diff --git a/e-util/e-html-utils.c b/e-util/e-html-utils.c
deleted file mode 100644
index 535d772dc4..0000000000
--- a/e-util/e-html-utils.c
+++ /dev/null
@@ -1,524 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-html-utils.c
- * Copyright (C) 2000-2003 Ximian, Inc.
- * Author: Dan Winship <danw@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-#include <glib.h>
-
-#include "e-html-utils.h"
-
-static char *
-check_size (char **buffer, int *buffer_size, char *out, int len)
-{
- if (out + len + 1> *buffer + *buffer_size) {
- int index = out - *buffer;
-
- *buffer_size = MAX (index + len + 1, *buffer_size * 2);
- *buffer = g_realloc (*buffer, *buffer_size);
- out = *buffer + index;
- }
- return out;
-}
-
-/* auto-urlification hints: the goal is not to be strictly RFC-compliant,
- * but rather to accurately distinguish urls/addresses from non-urls/
- * addresses in real-world email.
- *
- * 1 = non-email-address chars: ()<>@,;:\"[]`'{}|
- * 2 = trailing url garbage: ,.!?;:>)]}`'-_
- * 4 = allowed dns chars
- * 8 = non-url chars: "|
- */
-static int special_chars[] = {
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, /* nul - 0x0f */
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, /* 0x10 - 0x1f */
- 9, 2, 9, 0, 0, 0, 0, 3, 1, 3, 0, 0, 3, 6, 6, 0, /* sp - / */
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 1, 0, 3, 2, /* 0 - ? */
- 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, /* @ - O */
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 3, 0, 2, /* P - _ */
- 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, /* ` - o */
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 9, 3, 0, 3 /* p - del */
-};
-
-#define is_addr_char(c) (c < 128 && !(special_chars[c] & 1))
-#define is_url_char(c) (c < 128 && !(special_chars[c] & 8))
-#define is_trailing_garbage(c) (c > 127 || (special_chars[c] & 2))
-#define is_domain_name_char(c) (c < 128 && (special_chars[c] & 4))
-
-/* (http|https|ftp|nntp)://[^ "|/]+\.([^ "|]*[^ ,.!?;:>)\]}`'"|_-])+ */
-/* www\.[A-Za-z0-9.-]+(/([^ "|]*[^ ,.!?;:>)\]}`'"|_-])+) */
-
-static char *
-url_extract (const unsigned char **text, gboolean full_url)
-{
- const unsigned char *end = *text, *p;
- char *out;
-
- while (*end && is_url_char (*end))
- end++;
-
- /* Back up if we probably went too far. */
- while (end > *text && is_trailing_garbage (*(end - 1)))
- end--;
-
- if (full_url) {
- /* Make sure this really looks like a URL. */
- p = memchr (*text, ':', end - *text);
- if (!p || end - p < 4)
- return NULL;
- } else {
- /* Make sure this really looks like a hostname. */
- p = memchr (*text, '.', end - *text);
- if (!p || p >= end - 2)
- return NULL;
- p = memchr (p + 2, '.', end - (p + 2));
- if (!p || p >= end - 2)
- return NULL;
- }
-
- out = g_strndup (*text, end - *text);
- *text = end;
- return out;
-}
-
-static char *
-email_address_extract (const unsigned char **cur, char **out, const unsigned char *linestart)
-{
- const unsigned char *start, *end, *dot;
- char *addr;
-
- /* *cur points to the '@'. Look backward for a valid local-part */
- for (start = *cur; start - 1 >= linestart && is_addr_char (*(start - 1)); start--)
- ;
- if (start == *cur)
- return NULL;
- if (start > linestart + 2 &&
- start[-1] == ':' && start[0] == '/' && start[1] == '/')
- return NULL;
-
- /* Now look forward for a valid domain part */
- for (end = *cur + 1, dot = NULL; is_domain_name_char (*end); end++) {
- if (*end == '.' && !dot)
- dot = end;
- }
- if (!dot)
- return NULL;
-
- /* Remove trailing garbage */
- while (is_trailing_garbage (*(end - 1)))
- end--;
- if (dot > end)
- return NULL;
-
- addr = g_strndup (start, end - start);
- *out -= *cur - start;
- *cur = end;
-
- return addr;
-}
-
-static gboolean
-is_citation (const unsigned char *c, gboolean saw_citation)
-{
- const unsigned char *p;
-
- if (*c != '>')
- return FALSE;
-
- /* A line that starts with a ">" is a citation, unless it's
- * just mbox From-mangling...
- */
- if (strncmp (c, ">From ", 6) != 0)
- return TRUE;
-
- /* If the previous line was a citation, then say this
- * one is too.
- */
- if (saw_citation)
- return TRUE;
-
- /* Same if the next line is */
- p = (const unsigned char *)strchr ((const char *)c, '\n');
- if (p && *++p == '>')
- return TRUE;
-
- /* Otherwise, it was just an isolated ">From" line. */
- return FALSE;
-}
-
-/**
- * e_text_to_html_full:
- * @input: a NUL-terminated input buffer
- * @flags: some combination of the E_TEXT_TO_HTML_* flags defined
- * in e-html-utils.h
- * @color: color for citation highlighting
- *
- * This takes a buffer of text as input and produces a buffer of
- * "equivalent" HTML, subject to certain transformation rules.
- *
- * The set of possible flags is:
- *
- * - E_TEXT_TO_HTML_PRE: wrap the output HTML in <PRE> and </PRE>.
- * Should only be used if @input is the entire buffer to be
- * converted. If e_text_to_html is being called with small pieces
- * of data, you should wrap the entire result in <PRE> yourself.
- *
- * - E_TEXT_TO_HTML_CONVERT_NL: convert "\n" to "<BR>\n" on output.
- * (should not be used with E_TEXT_TO_HTML_PRE, since that would
- * result in double-newlines).
- *
- * - E_TEXT_TO_HTML_CONVERT_SPACES: convert a block of N spaces
- * into N-1 non-breaking spaces and one normal space. A space
- * at the start of the buffer is always converted to a
- * non-breaking space, regardless of the following character,
- * which probably means you don't want to use this flag on
- * pieces of data that aren't delimited by at least line breaks.
- *
- * If E_TEXT_TO_HTML_CONVERT_NL and E_TEXT_TO_HTML_CONVERT_SPACES
- * are both defined, then TABs will also be converted to spaces.
- *
- * - E_TEXT_TO_HTML_CONVERT_URLS: wrap <a href="..."> </a> around
- * strings that look like URLs.
- *
- * - E_TEXT_TO_HTML_CONVERT_ADDRESSES: wrap <a href="mailto:..."> </a> around
- * strings that look like mail addresses.
- *
- * - E_TEXT_TO_HTML_MARK_CITATION: wrap <font color="..."> </font> around
- * citations (lines beginning with "> ", etc).
- *
- * - E_TEXT_TO_HTML_ESCAPE_8BIT: flatten everything to US-ASCII
- *
- * - E_TEXT_TO_HTML_CITE: quote the text with "> " at the start of each
- * line.
- **/
-char *
-e_text_to_html_full (const char *input, unsigned int flags, guint32 color)
-{
- const unsigned char *cur, *next, *linestart;
- char *buffer = NULL;
- char *out = NULL;
- int buffer_size = 0, col;
- gboolean colored = FALSE, saw_citation = FALSE;
-
- /* Allocate a translation buffer. */
- buffer_size = strlen (input) * 2 + 5;
- buffer = g_malloc (buffer_size);
-
- out = buffer;
- if (flags & E_TEXT_TO_HTML_PRE)
- out += sprintf (out, "<PRE>");
-
- col = 0;
-
- for (cur = linestart = input; cur && *cur; cur = next) {
- gunichar u;
-
- if (flags & E_TEXT_TO_HTML_MARK_CITATION && col == 0) {
- saw_citation = is_citation (cur, saw_citation);
- if (saw_citation) {
- if (!colored) {
- gchar font [25];
-
- g_snprintf (font, 25, "<FONT COLOR=\"#%06x\">", color);
-
- out = check_size (&buffer, &buffer_size, out, 25);
- out += sprintf (out, "%s", font);
- colored = TRUE;
- }
- } else if (colored) {
- gchar *no_font = "</FONT>";
-
- out = check_size (&buffer, &buffer_size, out, 9);
- out += sprintf (out, "%s", no_font);
- colored = FALSE;
- }
-
- /* Display mbox-mangled ">From" as "From" */
- if (*cur == '>' && !saw_citation)
- cur++;
- } else if (flags & E_TEXT_TO_HTML_CITE && col == 0) {
- out = check_size (&buffer, &buffer_size, out, 5);
- out += sprintf (out, "&gt; ");
- }
-
- u = g_utf8_get_char (cur);
- if (g_unichar_isalpha (u) &&
- (flags & E_TEXT_TO_HTML_CONVERT_URLS)) {
- char *tmpurl = NULL, *refurl = NULL, *dispurl = NULL;
-
- if (!strncasecmp (cur, "http://", 7) ||
- !strncasecmp (cur, "https://", 8) ||
- !strncasecmp (cur, "ftp://", 6) ||
- !strncasecmp (cur, "nntp://", 7) ||
- !strncasecmp (cur, "mailto:", 7) ||
- !strncasecmp (cur, "news:", 5) ||
- !strncasecmp (cur, "file:", 5) ||
- !strncasecmp (cur, "callto:", 7) ||
- !strncasecmp (cur, "h323:", 5) ||
- !strncasecmp (cur, "webcal:", 7)) {
- tmpurl = url_extract (&cur, TRUE);
- if (tmpurl) {
- refurl = e_text_to_html (tmpurl, 0);
- dispurl = g_strdup (refurl);
- }
- } else if (!strncasecmp (cur, "www.", 4) &&
- is_url_char (*(cur + 4))) {
- tmpurl = url_extract (&cur, FALSE);
- if (tmpurl) {
- dispurl = e_text_to_html (tmpurl, 0);
- refurl = g_strdup_printf ("http://%s",
- dispurl);
- }
- }
-
- if (tmpurl) {
- out = check_size (&buffer, &buffer_size, out,
- strlen (refurl) +
- strlen (dispurl) + 15);
- out += sprintf (out,
- "<a href=\"%s\">%s</a>",
- refurl, dispurl);
- col += strlen (tmpurl);
- g_free (tmpurl);
- g_free (refurl);
- g_free (dispurl);
- }
-
- if (!*cur)
- break;
- u = g_utf8_get_char (cur);
- }
-
- if (u == '@' && (flags & E_TEXT_TO_HTML_CONVERT_ADDRESSES)) {
- char *addr, *dispaddr, *outaddr;
-
- addr = email_address_extract (&cur, &out, linestart);
- if (addr) {
- dispaddr = e_text_to_html (addr, 0);
- outaddr = g_strdup_printf ("<a href=\"mailto:%s\">%s</a>",
- addr, dispaddr);
- out = check_size (&buffer, &buffer_size, out, strlen (outaddr));
- out += sprintf (out, "%s", outaddr);
- col += strlen (addr);
- g_free (addr);
- g_free (dispaddr);
- g_free (outaddr);
-
- if (!*cur)
- break;
- u = g_utf8_get_char (cur);
- }
- }
-
- if (!g_unichar_validate (u)) {
- /* Sigh. Someone sent undeclared 8-bit data.
- * Assume it's iso-8859-1.
- */
- u = *cur;
- next = cur + 1;
- } else
- next = g_utf8_next_char (cur);
-
- out = check_size (&buffer, &buffer_size, out, 10);
-
- switch (u) {
- case '<':
- strcpy (out, "&lt;");
- out += 4;
- col++;
- break;
-
- case '>':
- strcpy (out, "&gt;");
- out += 4;
- col++;
- break;
-
- case '&':
- strcpy (out, "&amp;");
- out += 5;
- col++;
- break;
-
- case '"':
- strcpy (out, "&quot;");
- out += 6;
- col++;
- break;
-
- case '\n':
- if (flags & E_TEXT_TO_HTML_CONVERT_NL) {
- strcpy (out, "<br>");
- out += 4;
- }
- *out++ = *cur;
- linestart = cur;
- col = 0;
- break;
-
- case '\t':
- if (flags & (E_TEXT_TO_HTML_CONVERT_SPACES |
- E_TEXT_TO_HTML_CONVERT_NL)) {
- do {
- out = check_size (&buffer, &buffer_size,
- out, 7);
- strcpy (out, "&nbsp;");
- out += 6;
- col++;
- } while (col % 8);
- break;
- }
- /* otherwise, FALL THROUGH */
-
- case ' ':
- if (flags & E_TEXT_TO_HTML_CONVERT_SPACES) {
- if (cur == (const unsigned char *)input ||
- *(cur + 1) == ' ' || *(cur + 1) == '\t' ||
- *(cur - 1) == '\n') {
- strcpy (out, "&nbsp;");
- out += 6;
- col++;
- break;
- }
- }
- /* otherwise, FALL THROUGH */
-
- default:
- if ((u >= 0x20 && u < 0x80) ||
- (u == '\r' || u == '\t')) {
- /* Default case, just copy. */
- *out++ = u;
- } else {
- if (flags & E_TEXT_TO_HTML_ESCAPE_8BIT)
- *out++ = '?';
- else
- out += g_snprintf(out, 9, "&#%d;", u);
- }
- col++;
- break;
- }
- }
-
- out = check_size (&buffer, &buffer_size, out, 7);
- if (flags & E_TEXT_TO_HTML_PRE)
- strcpy (out, "</PRE>");
- else
- *out = '\0';
-
- return buffer;
-}
-
-char *
-e_text_to_html (const char *input, unsigned int flags)
-{
- return e_text_to_html_full (input, flags, 0);
-}
-
-
-#ifdef E_HTML_UTILS_TEST
-
-struct {
- char *text, *url;
-} url_tests[] = {
- { "bob@foo.com", "mailto:bob@foo.com" },
- { "Ends with bob@foo.com", "mailto:bob@foo.com" },
- { "bob@foo.com at start", "mailto:bob@foo.com" },
- { "bob@foo.com.", "mailto:bob@foo.com" },
- { "\"bob@foo.com\"", "mailto:bob@foo.com" },
- { "<bob@foo.com>", "mailto:bob@foo.com" },
- { "(bob@foo.com)", "mailto:bob@foo.com" },
- { "bob@foo.com, 555-9999", "mailto:bob@foo.com" },
- { "|bob@foo.com|555-9999|", "mailto:bob@foo.com" },
- { "bob@ no match bob@", NULL },
- { "@foo.com no match @foo.com", NULL },
- { "\"bob\"@foo.com", NULL },
- { "M@ke money fast!", NULL },
- { "ASCII art @_@ @>->-", NULL },
-
- { "http://www.foo.com", "http://www.foo.com" },
- { "Ends with http://www.foo.com", "http://www.foo.com" },
- { "http://www.foo.com at start", "http://www.foo.com" },
- { "http://www.foo.com.", "http://www.foo.com" },
- { "http://www.foo.com/.", "http://www.foo.com/" },
- { "<http://www.foo.com>", "http://www.foo.com" },
- { "(http://www.foo.com)", "http://www.foo.com" },
- { "http://www.foo.com, 555-9999", "http://www.foo.com" },
- { "|http://www.foo.com|555-9999|", "http://www.foo.com" },
- { "foo http://www.foo.com/ bar", "http://www.foo.com/" },
- { "foo http://www.foo.com/index.html bar", "http://www.foo.com/index.html" },
- { "foo http://www.foo.com/q?99 bar", "http://www.foo.com/q?99" },
- { "foo http://www.foo.com/;foo=bar&baz=quux bar", "http://www.foo.com/;foo=bar&baz=quux" },
- { "foo http://www.foo.com/index.html#anchor bar", "http://www.foo.com/index.html#anchor" },
- { "http://www.foo.com/index.html; foo", "http://www.foo.com/index.html" },
- { "http://www.foo.com/index.html: foo", "http://www.foo.com/index.html" },
- { "http://www.foo.com/index.html-- foo", "http://www.foo.com/index.html" },
- { "http://www.foo.com/index.html?", "http://www.foo.com/index.html" },
- { "http://www.foo.com/index.html!", "http://www.foo.com/index.html" },
- { "\"http://www.foo.com/index.html\"", "http://www.foo.com/index.html" },
- { "'http://www.foo.com/index.html'", "http://www.foo.com/index.html" },
- { "http://bob@www.foo.com/bar/baz/", "http://bob@www.foo.com/bar/baz/" },
- { "http no match http", NULL },
- { "http: no match http:", NULL },
- { "http:// no match http://", NULL },
- { "unrecognized://bob@foo.com/path", NULL },
-
- { "src/www.c", NULL },
- { "Ewwwwww.Gross.", NULL },
-
-};
-int num_url_tests = G_N_ELEMENTS (url_tests);
-
-int
-main (int argc, char **argv)
-{
- int i, errors = 0;
- char *html, *url, *p;
-
- for (i = 0; i < num_url_tests; i++) {
- html = e_text_to_html (url_tests[i].text, E_TEXT_TO_HTML_CONVERT_URLS | E_TEXT_TO_HTML_CONVERT_ADDRESSES);
-
- url = strstr (html, "href=\"");
- if (url) {
- url += 6;
- p = strchr (url, '"');
- if (p)
- *p = '\0';
-
- while ((p = strstr (url, "&amp;")))
- memmove (p + 1, p + 5, strlen (p + 5) + 1);
- }
-
- if ((url && (!url_tests[i].url || strcmp (url, url_tests[i].url) != 0)) ||
- (!url && url_tests[i].url)) {
- printf ("FAILED on \"%s\" -> %s\n (got %s)\n\n",
- url_tests[i].text,
- url_tests[i].url ? url_tests[i].url : "(nothing)",
- url ? url : "(nothing)");
- errors++;
- }
-
- g_free (html);
- }
-
- printf ("\n%d errors\n", errors);
- return errors;
-}
-#endif
diff --git a/e-util/e-html-utils.h b/e-util/e-html-utils.h
deleted file mode 100644
index 551996e089..0000000000
--- a/e-util/e-html-utils.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-html-utils.c */
-/*
- * Copyright (C) 2000 Ximian, Inc.
- * Author: Dan Winship <danw@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef __E_HTML_UTILS__
-#define __E_HTML_UTILS__
-
-#include <glib.h>
-
-#define E_TEXT_TO_HTML_PRE (1 << 0)
-#define E_TEXT_TO_HTML_CONVERT_NL (1 << 1)
-#define E_TEXT_TO_HTML_CONVERT_SPACES (1 << 2)
-#define E_TEXT_TO_HTML_CONVERT_URLS (1 << 3)
-#define E_TEXT_TO_HTML_MARK_CITATION (1 << 4)
-#define E_TEXT_TO_HTML_CONVERT_ADDRESSES (1 << 5)
-#define E_TEXT_TO_HTML_ESCAPE_8BIT (1 << 6)
-#define E_TEXT_TO_HTML_CITE (1 << 7)
-
-char *e_text_to_html_full (const char *input, unsigned int flags, guint32 color);
-char *e_text_to_html (const char *input, unsigned int flags);
-
-#endif /* __E_HTML_UTILS__ */
diff --git a/e-util/e-icon-factory.c b/e-util/e-icon-factory.c
deleted file mode 100644
index eac14f4e9f..0000000000
--- a/e-util/e-icon-factory.c
+++ /dev/null
@@ -1,391 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@novell.com>
- *
- * Copyright 2004 Novell, Inc. (www.novell.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <dirent.h>
-
-#include <pthread.h>
-
-#include <gtk/gtkimage.h>
-#include <libgnomeui/gnome-icon-theme.h>
-#include <e-util/e-icon-factory.h>
-
-#include "art/broken-image-16.xpm"
-#include "art/broken-image-24.xpm"
-
-static int sizes[E_ICON_NUM_SIZES] = {
- 16, /* menu */
- 20, /* button */
- 18, /* small toolbar */
- 24, /* large toolbar */
- 32, /* dnd */
- 48, /* dialog */
-};
-
-
-typedef struct {
- char *name;
- GdkPixbuf *pixbuf;
-} Icon;
-
-static GdkPixbuf *broken16_pixbuf = NULL;
-static GdkPixbuf *broken24_pixbuf = NULL;
-
-static GHashTable *name_to_icon = NULL;
-static GnomeIconTheme *icon_theme = NULL;
-static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
-
-
-/* Note: takes ownership of the pixbufs (eg. does not ref them) */
-static Icon *
-icon_new (const char *name, GdkPixbuf *pixbuf)
-{
- Icon *icon;
-
- icon = g_malloc0 (sizeof (Icon));
- icon->name = g_strdup (name);
- icon->pixbuf = pixbuf;
-
- return icon;
-}
-
-static void
-icon_free (Icon *icon)
-{
- g_free (icon->name);
- if (icon->pixbuf)
- g_object_unref (icon->pixbuf);
- g_free (icon);
-}
-
-static Icon *
-load_icon (const char *icon_key, const char *icon_name, int size, int scale)
-{
- GdkPixbuf *pixbuf, *unscaled = NULL;
- char *filename = NULL;
-
- if (icon_name[0] == '/')
- filename = g_strdup (icon_name);
- else
- filename = gnome_icon_theme_lookup_icon (icon_theme, icon_name, size, NULL, NULL);
-
- if (!filename || !(unscaled = gdk_pixbuf_new_from_file (filename, NULL))) {
- if (scale) {
- struct dirent *dent;
- int width, height;
- size_t baselen;
- GString *path;
- DIR *dir;
- char *x;
-
- path = g_string_new (EVOLUTION_ICONSDIR);
- if (path->str[path->len - 1] != '/')
- g_string_append_c (path, '/');
-
- baselen = path->len;
-
- if (!(dir = opendir (path->str))) {
- g_string_free (path, TRUE);
- goto done;
- }
-
- /* scan icon directories looking for an icon with a size >= the size we need. */
- while ((dent = readdir (dir))) {
- if (!(dent->d_name[0] >= '1' && dent->d_name[0] <= '9'))
- continue;
-
- if (((width = strtol (dent->d_name, &x, 10)) < size) || *x != 'x')
- continue;
-
- if (((height = strtol (x + 1, &x, 10)) != width) || *x != '\0')
- continue;
-
- /* if the icon exists in this directory, we can [use/scale] it */
- g_string_truncate (path, baselen);
- g_string_append_printf (path, "%s/%s.png", dent->d_name, icon_name);
- if ((unscaled = gdk_pixbuf_new_from_file (path->str, NULL)))
- break;
- }
-
- g_string_free (path, TRUE);
- closedir (dir);
- } else {
- g_free (filename);
- filename = g_strdup_printf (EVOLUTION_ICONSDIR "/%dx%d/%s.png", size, size, icon_name);
- unscaled = gdk_pixbuf_new_from_file (filename, NULL);
- }
- }
-
- done:
-
- g_free (filename);
- if (unscaled != NULL) {
- pixbuf = gdk_pixbuf_scale_simple (unscaled, size, size, GDK_INTERP_BILINEAR);
- g_object_unref (unscaled);
- } else {
- pixbuf = NULL;
- }
-
- return icon_new (icon_key, pixbuf);
-}
-
-
-/* temporary workaround for code that has not yet been ported to the new icon_size API */
-static int
-pixel_size_to_icon_size (int pixel_size)
-{
- int i, icon_size = -1;
-
- for (i = 0; i < E_ICON_NUM_SIZES; i++) {
- if (pixel_size == sizes[i]) {
- icon_size = i;
- break;
- }
- }
-
- return icon_size;
-}
-
-static gboolean
-icon_foreach_remove (gpointer key, gpointer value, gpointer user_data)
-{
- icon_free (value);
-
- return TRUE;
-}
-
-static void
-icon_theme_changed_cb (GnomeIconTheme *object, gpointer user_data)
-{
- g_hash_table_foreach_remove (name_to_icon, (GHRFunc) icon_foreach_remove, NULL);
-}
-
-/**
- * e_icon_factory_init:
- *
- * Initialises the icon factory.
- **/
-void
-e_icon_factory_init (void)
-{
- if (name_to_icon != NULL)
- return;
-
- icon_theme = gnome_icon_theme_new ();
- name_to_icon = g_hash_table_new (g_str_hash, g_str_equal);
- g_signal_connect (G_OBJECT (icon_theme), "changed", G_CALLBACK (icon_theme_changed_cb), NULL);
-
- broken16_pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) broken_image_16_xpm);
- broken24_pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) broken_image_24_xpm);
-}
-
-static void
-icon_foreach_free (gpointer key, gpointer value, gpointer user_data)
-{
- icon_free (value);
-}
-
-/**
- * e_icon_factory_shutdown:
- *
- * Shuts down the icon factory (cleans up all cached icons, etc).
- **/
-void
-e_icon_factory_shutdown (void)
-{
- if (name_to_icon == NULL)
- return;
-
- g_hash_table_foreach (name_to_icon, (GHFunc) icon_foreach_free, NULL);
- g_hash_table_destroy (name_to_icon);
- g_object_unref (broken16_pixbuf);
- g_object_unref (broken24_pixbuf);
- g_object_unref (icon_theme);
- name_to_icon = NULL;
-}
-
-
-/**
- * e_icon_factory_get_icon_filename:
- * @icon_name: name of the icon
- * @size: MENU/SMALL_TOOLBAR/etc
- *
- * Looks up the icon to use based on name and size.
- *
- * Returns the requested icon pixbuf.
- **/
-char *
-e_icon_factory_get_icon_filename (const char *icon_name, int icon_size)
-{
- char *filename;
-
- g_return_val_if_fail (icon_name != NULL, NULL);
- g_return_val_if_fail (strcmp (icon_name, ""), NULL);
-
- if (icon_size >= E_ICON_NUM_SIZES) {
- g_warning ("calling e_icon_factory_get_icon_filename with unknown icon_size value (%d)", icon_size);
- if ((icon_size = pixel_size_to_icon_size (icon_size)) == -1)
- return NULL;
- }
-
- pthread_mutex_lock (&lock);
- filename = gnome_icon_theme_lookup_icon (icon_theme, icon_name, sizes[icon_size], NULL, NULL);
- pthread_mutex_unlock (&lock);
-
- return filename;
-}
-
-
-/**
- * e_icon_factory_get_icon:
- * @icon_name: name of the icon
- * @icon_size: size of the icon (one of the E_ICON_SIZE_* enum values)
- *
- * Returns the specified icon of the requested size (may perform
- * scaling to achieve this). If @icon_name is a full path, that file
- * is used directly. Otherwise it is looked up in the user's current
- * icon theme. If the icon cannot be found in the icon theme, it falls
- * back to loading the requested icon from Evolution's icon set
- * installed from the art/ srcdir. If even that fails to find the
- * requested icon, then a "broken-image" icon is returned.
- **/
-GdkPixbuf *
-e_icon_factory_get_icon (const char *icon_name, int icon_size)
-{
- GdkPixbuf *pixbuf;
- char *icon_key;
- Icon *icon;
- int size;
-
- if (icon_size >= E_ICON_NUM_SIZES) {
- g_warning ("calling e_icon_factory_get_icon with unknown icon_size value (%d)", icon_size);
- if ((icon_size = pixel_size_to_icon_size (icon_size)) == -1)
- return NULL;
- }
-
- size = sizes[icon_size];
-
- if (icon_name == NULL || !strcmp (icon_name, "")) {
- if (size >= 24)
- return gdk_pixbuf_scale_simple (broken24_pixbuf, size, size, GDK_INTERP_NEAREST);
- else
- return gdk_pixbuf_scale_simple (broken16_pixbuf, size, size, GDK_INTERP_NEAREST);
- }
-
- icon_key = g_alloca (strlen (icon_name) + 7);
- sprintf (icon_key, "%dx%d/%s", size, size, icon_name);
-
- pthread_mutex_lock (&lock);
-
- if (!(icon = g_hash_table_lookup (name_to_icon, icon_key))) {
- if (!(icon = load_icon (icon_key, icon_name, size, TRUE))) {
- g_warning ("Icon not found -- %s", icon_name);
-
- /* Create an empty icon so that we don't keep spitting
- out the same warning over and over, every time this
- icon is requested. */
-
- icon = icon_new (icon_key, NULL);
- g_hash_table_insert (name_to_icon, icon->name, icon);
- } else {
- g_hash_table_insert (name_to_icon, icon->name, icon);
- }
- }
-
- if ((pixbuf = icon->pixbuf)) {
- g_object_ref (pixbuf);
- } else {
- if (size >= 24)
- pixbuf = gdk_pixbuf_scale_simple (broken24_pixbuf, size, size, GDK_INTERP_NEAREST);
- else
- pixbuf = gdk_pixbuf_scale_simple (broken16_pixbuf, size, size, GDK_INTERP_NEAREST);
- }
-
- pthread_mutex_unlock (&lock);
-
- return pixbuf;
-}
-
-GtkWidget *
-e_icon_factory_get_image (const char *icon_name, int icon_size)
-{
- GdkPixbuf *pixbuf;
- GtkWidget *image;
-
- pixbuf = e_icon_factory_get_icon (icon_name, icon_size);
- image = gtk_image_new_from_pixbuf (pixbuf);
- g_object_unref (pixbuf);
-
- return image;
-}
-
-/**
- * e_icon_factory_get_icon_list:
- * @icon_name: name of the icon
- *
- * Returns a list of GdkPixbufs of the requested name suitable for
- * gtk_window_set_icon_list().
- **/
-GList *
-e_icon_factory_get_icon_list (const char *icon_name)
-{
- static int icon_list_sizes[] = { 128, 64, 48, 32, 16 };
- GList *list = NULL;
- char *icon_key;
- Icon *icon;
- int size, i;
-
- if (!icon_name || !strcmp (icon_name, ""))
- return NULL;
-
- pthread_mutex_lock (&lock);
-
- icon_key = g_alloca (strlen (icon_name) + 9);
-
- for (i = 0; i < G_N_ELEMENTS (icon_list_sizes); i++) {
- size = icon_list_sizes[i];
- sprintf (icon_key, "%dx%d/%s", size, size, icon_name);
-
- if (!(icon = g_hash_table_lookup (name_to_icon, icon_key))) {
- if ((icon = load_icon (icon_key, icon_name, size, FALSE)))
- g_hash_table_insert (name_to_icon, icon->name, icon);
- }
-
- if (icon && icon->pixbuf) {
- list = g_list_prepend (list, icon->pixbuf);
- g_object_ref (icon->pixbuf);
- }
- }
-
- pthread_mutex_unlock (&lock);
-
- return list;
-}
diff --git a/e-util/e-icon-factory.h b/e-util/e-icon-factory.h
deleted file mode 100644
index 966e1f56e4..0000000000
--- a/e-util/e-icon-factory.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-icon-factory.h - Icon factory for the Evolution shell.
- *
- * Copyright (C) 2002-2004 Novell, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli <ettore@ximian.com>
- */
-
-#ifndef _E_ICON_FACTORY_H_
-#define _E_ICON_FACTORY_H_
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gtk/gtkwidget.h>
-
-enum {
- E_ICON_SIZE_MENU,
- E_ICON_SIZE_BUTTON,
- E_ICON_SIZE_SMALL_TOOLBAR,
- E_ICON_SIZE_LARGE_TOOLBAR,
- E_ICON_SIZE_DND,
- E_ICON_SIZE_DIALOG,
- E_ICON_NUM_SIZES
-};
-
-/* standard size for list/tree widgets (16x16) */
-#define E_ICON_SIZE_LIST E_ICON_SIZE_MENU
-
-/* standard size for status bar icons (16x16) */
-#define E_ICON_SIZE_STATUS E_ICON_SIZE_MENU
-
-
-
-void e_icon_factory_init (void);
-void e_icon_factory_shutdown (void);
-
-char *e_icon_factory_get_icon_filename (const char *icon_name, int icon_size);
-
-GdkPixbuf *e_icon_factory_get_icon (const char *icon_name, int icon_size);
-
-GtkWidget *e_icon_factory_get_image (const char *icon_name, int icon_size);
-
-GList *e_icon_factory_get_icon_list (const char *icon_name);
-
-#endif /* _E_ICON_FACTORY_H_ */
diff --git a/e-util/e-iterator.c b/e-util/e-iterator.c
deleted file mode 100644
index aa7a338eff..0000000000
--- a/e-util/e-iterator.c
+++ /dev/null
@@ -1,183 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Christopher James Lahey <clahey@umich.edu>
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 1999 The Free Software Foundation
- */
-
-#include <config.h>
-
-#include "e-iterator.h"
-#include "e-util-marshal.h"
-
-static void e_iterator_init (EIterator *card);
-static void e_iterator_class_init (EIteratorClass *klass);
-
-#define PARENT_TYPE G_TYPE_OBJECT
-
-static GObjectClass *parent_class;
-
-enum {
- INVALIDATE,
- LAST_SIGNAL
-};
-
-static guint e_iterator_signals [LAST_SIGNAL] = { 0, };
-
-/**
- * e_iterator_get_type:
- * @void:
- *
- * Registers the &EIterator class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &EIterator class.
- **/
-GType
-e_iterator_get_type (void)
-{
- static GType type = 0;
-
- if (! type) {
- GTypeInfo info = {
- sizeof (EIteratorClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) e_iterator_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EIterator),
- 0, /* n_preallocs */
- (GInstanceInitFunc) e_iterator_init
- };
-
- type = g_type_register_static (PARENT_TYPE, "EIterator", &info, 0);
- }
-
- return type;
-}
-
-static void
-e_iterator_class_init (EIteratorClass *klass)
-{
- GObjectClass *object_class;
-
- object_class = G_OBJECT_CLASS(klass);
-
- parent_class = g_type_class_ref (PARENT_TYPE);
-
- e_iterator_signals [INVALIDATE] =
- g_signal_new ("invalidate",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EIteratorClass, invalidate),
- NULL, NULL,
- e_util_marshal_NONE__NONE, /* XXX need a new marshaller here */
- G_TYPE_NONE, 0);
-
- klass->invalidate = NULL;
- klass->get = NULL;
- klass->reset = NULL;
- klass->last = NULL;
- klass->next = NULL;
- klass->prev = NULL;
- klass->remove = NULL;
- klass->insert = NULL;
- klass->set = NULL;
- klass->is_valid = NULL;
-}
-
-/**
- * e_iterator_init:
- */
-static void
-e_iterator_init (EIterator *card)
-{
-}
-
-/*
- * Virtual functions:
- */
-const void *
-e_iterator_get (EIterator *iterator)
-{
- if (E_ITERATOR_GET_CLASS(iterator)->get)
- return E_ITERATOR_GET_CLASS(iterator)->get(iterator);
- else
- return NULL;
-}
-
-void
-e_iterator_reset (EIterator *iterator)
-{
- if (E_ITERATOR_GET_CLASS(iterator)->reset)
- E_ITERATOR_GET_CLASS(iterator)->reset(iterator);
-}
-
-void
-e_iterator_last (EIterator *iterator)
-{
- if (E_ITERATOR_GET_CLASS(iterator)->last)
- E_ITERATOR_GET_CLASS(iterator)->last(iterator);
-}
-
-gboolean
-e_iterator_next (EIterator *iterator)
-{
- if (E_ITERATOR_GET_CLASS(iterator)->next)
- return E_ITERATOR_GET_CLASS(iterator)->next(iterator);
- else
- return FALSE;
-}
-
-gboolean
-e_iterator_prev (EIterator *iterator)
-{
- if (E_ITERATOR_GET_CLASS(iterator)->prev)
- return E_ITERATOR_GET_CLASS(iterator)->prev(iterator);
- else
- return FALSE;
-}
-
-void
-e_iterator_delete (EIterator *iterator)
-{
- if (E_ITERATOR_GET_CLASS(iterator)->remove)
- E_ITERATOR_GET_CLASS(iterator)->remove(iterator);
-}
-
-void e_iterator_insert (EIterator *iterator,
- const void *object,
- gboolean before)
-{
- if (E_ITERATOR_GET_CLASS(iterator)->insert)
- E_ITERATOR_GET_CLASS(iterator)->insert(iterator, object, before);
-}
-
-void
-e_iterator_set (EIterator *iterator,
- const void *object)
-{
- if (E_ITERATOR_GET_CLASS(iterator)->set)
- E_ITERATOR_GET_CLASS(iterator)->set(iterator, object);
-}
-
-gboolean
-e_iterator_is_valid (EIterator *iterator)
-{
- if (E_ITERATOR_GET_CLASS(iterator)->is_valid)
- return E_ITERATOR_GET_CLASS(iterator)->is_valid(iterator);
- else
- return FALSE;
-}
-
-void
-e_iterator_invalidate (EIterator *iterator)
-{
- g_return_if_fail (iterator != NULL);
- g_return_if_fail (E_IS_ITERATOR (iterator));
-
- g_signal_emit (iterator, e_iterator_signals [INVALIDATE], 0);
-}
diff --git a/e-util/e-iterator.h b/e-util/e-iterator.h
deleted file mode 100644
index da25bd8ab6..0000000000
--- a/e-util/e-iterator.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Lahey <clahey@ximian.com>
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 1999 The Free Software Foundation
- */
-
-#ifndef __E_ITERATOR_H__
-#define __E_ITERATOR_H__
-
-#include <stdio.h>
-#include <time.h>
-#include <glib.h>
-#include <glib-object.h>
-
-#define E_TYPE_ITERATOR (e_iterator_get_type ())
-#define E_ITERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_ITERATOR, EIterator))
-#define E_ITERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_ITERATOR, EIteratorClass))
-#define E_IS_ITERATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_ITERATOR))
-#define E_IS_ITERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_ITERATOR))
-#define E_ITERATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TYPE_ITERATOR, EIteratorClass))
-
-typedef struct _EIterator EIterator;
-typedef struct _EIteratorClass EIteratorClass;
-
-struct _EIterator {
- GObject object;
-};
-
-struct _EIteratorClass {
- GObjectClass parent_class;
-
- /* Signals */
- void (*invalidate) (EIterator *iterator);
-
- /* Virtual functions */
- const void * (*get) (EIterator *iterator);
- void (*reset) (EIterator *iterator);
- void (*last) (EIterator *iterator);
- gboolean (*next) (EIterator *iterator);
- gboolean (*prev) (EIterator *iterator);
- void (*remove) (EIterator *iterator);
- void (*insert) (EIterator *iterator,
- const void *object,
- gboolean before);
- void (*set) (EIterator *iterator,
- const void *object);
- gboolean (*is_valid) (EIterator *iterator);
-};
-
-const void *e_iterator_get (EIterator *iterator);
-void e_iterator_reset (EIterator *iterator);
-void e_iterator_last (EIterator *iterator);
-gboolean e_iterator_next (EIterator *iterator);
-gboolean e_iterator_prev (EIterator *iterator);
-void e_iterator_delete (EIterator *iterator);
-void e_iterator_insert (EIterator *iterator,
- const void *object,
- gboolean before);
-void e_iterator_set (EIterator *iterator,
- const void *object);
-gboolean e_iterator_is_valid (EIterator *iterator);
-
-void e_iterator_invalidate (EIterator *iterator);
-
-/* Standard Glib function */
-GType e_iterator_get_type (void);
-
-#endif /* ! __E_ITERATOR_H__ */
diff --git a/e-util/e-list-iterator.c b/e-util/e-list-iterator.c
deleted file mode 100644
index 2f7e2aa953..0000000000
--- a/e-util/e-list-iterator.c
+++ /dev/null
@@ -1,249 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Christopher James Lahey <clahey@umich.edu>
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 1999 The Free Software Foundation
- */
-
-#include <config.h>
-
-#include "e-list-iterator.h"
-#include "e-list.h"
-
-
-static void e_list_iterator_init (EListIterator *list);
-static void e_list_iterator_class_init (EListIteratorClass *klass);
-
-static void e_list_iterator_invalidate (EIterator *iterator);
-static gboolean e_list_iterator_is_valid (EIterator *iterator);
-static void e_list_iterator_set (EIterator *iterator,
- const void *object);
-static void e_list_iterator_remove (EIterator *iterator);
-static void e_list_iterator_insert (EIterator *iterator,
- const void *object,
- gboolean before);
-static gboolean e_list_iterator_prev (EIterator *iterator);
-static gboolean e_list_iterator_next (EIterator *iterator);
-static void e_list_iterator_reset (EIterator *iterator);
-static void e_list_iterator_last (EIterator *iterator);
-static const void *e_list_iterator_get (EIterator *iterator);
-static void e_list_iterator_dispose (GObject *object);
-
-#define PARENT_TYPE E_TYPE_ITERATOR
-
-static EIteratorClass *parent_class;
-
-/**
- * e_list_iterator_get_type:
- * @void:
- *
- * Registers the &EListIterator class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &EListIterator class.
- **/
-GType
-e_list_iterator_get_type (void)
-{
- static GType type = 0;
-
- if (! type) {
- GTypeInfo info = {
- sizeof (EListIteratorClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) e_list_iterator_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EListIterator),
- 0, /* n_preallocs */
- (GInstanceInitFunc) e_list_iterator_init
- };
-
- type = g_type_register_static (PARENT_TYPE, "EListIterator", &info, 0);
- }
-
- return type;
-}
-
-static void
-e_list_iterator_class_init (EListIteratorClass *klass)
-{
- GObjectClass *object_class;
- EIteratorClass *iterator_class;
-
- object_class = G_OBJECT_CLASS(klass);
- iterator_class = E_ITERATOR_CLASS(klass);
-
- parent_class = g_type_class_ref (PARENT_TYPE);
-
- object_class->dispose = e_list_iterator_dispose;
-
- iterator_class->invalidate = e_list_iterator_invalidate;
- iterator_class->get = e_list_iterator_get;
- iterator_class->reset = e_list_iterator_reset;
- iterator_class->last = e_list_iterator_last;
- iterator_class->next = e_list_iterator_next;
- iterator_class->prev = e_list_iterator_prev;
- iterator_class->remove = e_list_iterator_remove;
- iterator_class->insert = e_list_iterator_insert;
- iterator_class->set = e_list_iterator_set;
- iterator_class->is_valid = e_list_iterator_is_valid;
-}
-
-
-
-/**
- * e_list_iterator_init:
- */
-static void
-e_list_iterator_init (EListIterator *list)
-{
-}
-
-EIterator *
-e_list_iterator_new (EList *list)
-{
- EListIterator *iterator = g_object_new (E_TYPE_LIST_ITERATOR, NULL);
-
- iterator->list = list;
- g_object_ref(list);
- iterator->iterator = list->list;
-
- return E_ITERATOR(iterator);
-}
-
-/*
- * Virtual functions:
- */
-static void
-e_list_iterator_dispose (GObject *object)
-{
- EListIterator *iterator = E_LIST_ITERATOR(object);
- e_list_remove_iterator(iterator->list, E_ITERATOR(iterator));
- g_object_unref(iterator->list);
-
- if (G_OBJECT_CLASS (parent_class)->dispose)
- (* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-static const void *
-e_list_iterator_get (EIterator *_iterator)
-{
- EListIterator *iterator = E_LIST_ITERATOR(_iterator);
- if (iterator->iterator)
- return iterator->iterator->data;
- else
- return NULL;
-}
-
-static void
-e_list_iterator_reset (EIterator *_iterator)
-{
- EListIterator *iterator = E_LIST_ITERATOR(_iterator);
- iterator->iterator = iterator->list->list;
-}
-
-static void
-e_list_iterator_last (EIterator *_iterator)
-{
- EListIterator *iterator = E_LIST_ITERATOR(_iterator);
- iterator->iterator = g_list_last(iterator->list->list);
-}
-
-static gboolean
-e_list_iterator_next (EIterator *_iterator)
-{
- EListIterator *iterator = E_LIST_ITERATOR(_iterator);
- if (iterator->iterator)
- iterator->iterator = g_list_next(iterator->iterator);
- else
- iterator->iterator = iterator->list->list;
- return (iterator->iterator != NULL);
-}
-
-static gboolean
-e_list_iterator_prev (EIterator *_iterator)
-{
- EListIterator *iterator = E_LIST_ITERATOR(_iterator);
- if (iterator->iterator)
- iterator->iterator = g_list_previous(iterator->iterator);
- else
- iterator->iterator = g_list_last(iterator->list->list);
- return (iterator->iterator != NULL);
-}
-
-static void
-e_list_iterator_insert (EIterator *_iterator,
- const void *object,
- gboolean before)
-{
- EListIterator *iterator = E_LIST_ITERATOR(_iterator);
- void *data;
- if (iterator->list->copy)
- data = iterator->list->copy(object, iterator->list->closure);
- else
- data = (void *) object;
- if (iterator->iterator) {
- if (before) {
- iterator->list->list = g_list_first(g_list_prepend(iterator->iterator, data));
- iterator->iterator = iterator->iterator->prev;
- } else {
- if (iterator->iterator->next)
- g_list_prepend(iterator->iterator->next, data);
- else
- g_list_append(iterator->iterator, data);
- iterator->iterator = iterator->iterator->next;
- }
- e_list_invalidate_iterators(iterator->list, E_ITERATOR(iterator));
- } else {
- if (before) {
- iterator->list->list = g_list_append(iterator->list->list, data);
- iterator->iterator = g_list_last(iterator->list->list);
- } else {
- iterator->list->list = g_list_prepend(iterator->list->list, data);
- iterator->iterator = iterator->list->list;
- }
- e_list_invalidate_iterators(iterator->list, E_ITERATOR(iterator));
- }
-}
-
-static void
-e_list_iterator_remove (EIterator *_iterator)
-{
- EListIterator *iterator = E_LIST_ITERATOR(_iterator);
- if (iterator->iterator) {
- e_list_remove_link (iterator->list, iterator->iterator);
- }
-}
-
-static void
-e_list_iterator_set (EIterator *_iterator,
- const void *object)
-{
- EListIterator *iterator = E_LIST_ITERATOR(_iterator);
- if (iterator->iterator) {
- if (iterator->list->free)
- iterator->list->free(iterator->iterator->data, iterator->list->closure);
- if (iterator->list->copy)
- iterator->iterator->data = iterator->list->copy(object, iterator->list->closure);
- else
- iterator->iterator->data = (void *) object;
- }
-}
-
-static gboolean
-e_list_iterator_is_valid (EIterator *_iterator)
-{
- EListIterator *iterator = E_LIST_ITERATOR(_iterator);
- return iterator->iterator != NULL;
-}
-
-static void
-e_list_iterator_invalidate (EIterator *_iterator)
-{
- EListIterator *iterator = E_LIST_ITERATOR(_iterator);
- iterator->iterator = NULL;
-}
diff --git a/e-util/e-list-iterator.h b/e-util/e-list-iterator.h
deleted file mode 100644
index b3a8953d80..0000000000
--- a/e-util/e-list-iterator.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Lahey <clahey@ximian.com>
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 1999 The Free Software Foundation
- */
-
-#ifndef __E_LIST_ITERATOR_H__
-#define __E_LIST_ITERATOR_H__
-
-typedef struct _EListIterator EListIterator;
-typedef struct _EListIteratorClass EListIteratorClass;
-
-#include <stdio.h>
-#include <time.h>
-#include <glib.h>
-#include <glib-object.h>
-
-#include <e-util/e-iterator.h>
-#include <e-util/e-list.h>
-
-#define E_TYPE_LIST_ITERATOR (e_list_iterator_get_type ())
-#define E_LIST_ITERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_LIST_ITERATOR, EListIterator))
-#define E_LIST_ITERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_LIST_ITERATOR, EListIteratorClass))
-#define E_IS_LIST_ITERATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_LIST_ITERATOR))
-#define E_IS_LIST_ITERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_LIST_ITERATOR))
-
-struct _EListIterator {
- EIterator parent;
-
- EList *list;
- GList *iterator;
-};
-
-struct _EListIteratorClass {
- EIteratorClass parent_class;
-};
-
-EIterator *e_list_iterator_new (EList *list);
-
-/* Standard Glib function */
-GType e_list_iterator_get_type (void);
-
-#endif /* ! __E_LIST_ITERATOR_H__ */
diff --git a/e-util/e-list.c b/e-util/e-list.c
deleted file mode 100644
index f1b190b16a..0000000000
--- a/e-util/e-list.c
+++ /dev/null
@@ -1,191 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Christopher James Lahey <clahey@umich.edu>
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 1999 The Free Software Foundation
- */
-
-#include <config.h>
-
-#include "e-list.h"
-#include "e-list-iterator.h"
-
-static void e_list_init (EList *list);
-static void e_list_class_init (EListClass *klass);
-static void e_list_dispose (GObject *object);
-
-static GObjectClass *parent_class;
-
-/**
- * e_list_get_type:
- * @void:
- *
- * Registers the &EList class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &EList class.
- **/
-GType
-e_list_get_type (void)
-{
- static GType type = 0;
-
- if (! type) {
- GTypeInfo info = {
- sizeof (EListClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) e_list_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EList),
- 0, /* n_preallocs */
- (GInstanceInitFunc) e_list_init
- };
-
- type = g_type_register_static (G_TYPE_OBJECT, "EList", &info, 0);
- }
-
- return type;
-}
-
-static void
-e_list_class_init (EListClass *klass)
-{
- GObjectClass *object_class;
-
- object_class = G_OBJECT_CLASS(klass);
-
- parent_class = g_type_class_ref (G_TYPE_OBJECT);
-
- object_class->dispose = e_list_dispose;
-}
-
-/**
- * e_list_init:
- */
-static void
-e_list_init (EList *list)
-{
- list->list = NULL;
- list->iterators = NULL;
-}
-
-EList *
-e_list_new (EListCopyFunc copy, EListFreeFunc free, void *closure)
-{
- EList *list = g_object_new (E_TYPE_LIST, NULL);
- e_list_construct (list, copy, free, closure);
- return list;
-}
-
-void
-e_list_construct (EList *list, EListCopyFunc copy, EListFreeFunc free, void *closure)
-{
- list->copy = copy;
- list->free = free;
- list->closure = closure;
-}
-
-EList *
-e_list_duplicate (EList *old)
-{
- EList *list = g_object_new (E_TYPE_LIST, NULL);
-
- list->copy = old->copy;
- list->free = old->free;
- list->closure = old->closure;
- list->list = g_list_copy(old->list);
- if (list->copy) {
- GList *listlist;
- for (listlist = list->list; listlist; listlist = listlist->next) {
- listlist->data = list->copy (listlist->data, list->closure);
- }
- }
- return list;
-}
-
-EIterator *
-e_list_get_iterator (EList *list)
-{
- EIterator *iterator = e_list_iterator_new(list);
- list->iterators = g_list_append(list->iterators, iterator);
- return iterator;
-}
-
-int
-e_list_length (EList *list)
-{
- return g_list_length(list->list);
-}
-
-void
-e_list_append (EList *list, const void *data)
-{
- e_list_invalidate_iterators(list, NULL);
- if (list->copy)
- list->list = g_list_append(list->list, list->copy(data, list->closure));
- else
- list->list = g_list_append(list->list, (void *) data);
-}
-
-void
-e_list_remove (EList *list, const void *data)
-{
- GList *link;
- link = g_list_find (list->list, data);
- if (link)
- e_list_remove_link(list, link);
-}
-
-void
-e_list_invalidate_iterators (EList *list, EIterator *skip)
-{
- GList *iterators = list->iterators;
- for (; iterators; iterators = iterators->next) {
- if (iterators->data != skip) {
- e_iterator_invalidate(E_ITERATOR(iterators->data));
- }
- }
-}
-
-/* FIXME: This doesn't work properly if the iterator is the first
- iterator in the list. Well, the iterator doesn't continue on after
- the next time next is called, at least. */
-void
-e_list_remove_link (EList *list, GList *link)
-{
- GList *iterators = list->iterators;
- for (; iterators; iterators = iterators->next) {
- if (((EListIterator *)iterators->data)->iterator == link) {
- e_iterator_prev(iterators->data);
- }
- }
- if (list->free)
- list->free(link->data, list->closure);
- list->list = g_list_remove_link(list->list, link);
- g_list_free_1(link);
-}
-
-void
-e_list_remove_iterator (EList *list, EIterator *iterator)
-{
- list->iterators = g_list_remove(list->iterators, iterator);
-}
-
-/*
- * Virtual functions
- */
-static void
-e_list_dispose (GObject *object)
-{
- EList *list = E_LIST(object);
- if (list->free)
- g_list_foreach(list->list, (GFunc) list->free, list->closure);
- g_list_free(list->list);
-
- (* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
diff --git a/e-util/e-list.h b/e-util/e-list.h
deleted file mode 100644
index d249fcfa4a..0000000000
--- a/e-util/e-list.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors:
- * Chris Lahey <clahey@ximian.com>
- *
- * Copyright (C) 2000 Ximian, Inc.
- * Copyright (C) 1999 The Free Software Foundation
- */
-
-#ifndef __E_LIST_H__
-#define __E_LIST_H__
-
-typedef struct _EList EList;
-typedef struct _EListClass EListClass;
-
-#include <stdio.h>
-#include <time.h>
-#include <glib.h>
-#include <glib-object.h>
-#include <e-util/e-list-iterator.h>
-
-#define E_TYPE_LIST (e_list_get_type ())
-#define E_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_LIST, EList))
-#define E_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_LIST, EListClass))
-#define E_IS_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_LIST))
-#define E_IS_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_LIST))
-#define E_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TYPE_LIST, EListClass))
-
-typedef void *(*EListCopyFunc) (const void *data, void *closure);
-typedef void (*EListFreeFunc) (void *data, void *closure);
-
-struct _EList {
- GObject object;
- GList *list;
- GList *iterators;
- EListCopyFunc copy;
- EListFreeFunc free;
- void *closure;
-};
-
-struct _EListClass {
- GObjectClass parent_class;
-};
-
-EList *e_list_new (EListCopyFunc copy,
- EListFreeFunc free,
- void *closure);
-void e_list_construct (EList *list,
- EListCopyFunc copy,
- EListFreeFunc free,
- void *closure);
-EList *e_list_duplicate (EList *list);
-EIterator *e_list_get_iterator (EList *list);
-void e_list_append (EList *list,
- const void *data);
-void e_list_remove (EList *list,
- const void *data);
-int e_list_length (EList *list);
-
-/* For iterators to call. */
-void e_list_remove_link (EList *list,
- GList *link);
-void e_list_remove_iterator (EList *list,
- EIterator *iterator);
-void e_list_invalidate_iterators (EList *list,
- EIterator *skip);
-
-/* Standard Glib function */
-GType e_list_get_type (void);
-
-#endif /* ! __E_LIST_H__ */
diff --git a/e-util/e-menu.c b/e-util/e-menu.c
deleted file mode 100644
index ca3d98a07a..0000000000
--- a/e-util/e-menu.c
+++ /dev/null
@@ -1,902 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Michael Zucchi <notzed@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <stdlib.h>
-
-#include <glib.h>
-
-#include "e-menu.h"
-
-#include <e-util/e-icon-factory.h>
-
-#include <libgnome/gnome-i18n.h>
-#include <bonobo/bonobo-ui-util.h>
-
-#define d(x)
-
-struct _EMenuFactory {
- struct _EMenuFactory *next, *prev;
-
- char *menuid;
- EMenuFactoryFunc factory;
- void *factory_data;
-};
-
-struct _item_node {
- struct _item_node *next;
-
- EMenuItem *item;
- struct _menu_node *menu;
-};
-
-struct _menu_node {
- struct _menu_node *next, *prev;
-
- EMenu *parent;
-
- GSList *items;
- GSList *uis;
- GSList *pixmaps;
-
- EMenuItemsFunc freefunc;
- void *data;
-
- /* a copy of items wrapped in an item_node, for bonobo
- * callback mapping */
- struct _item_node *menu;
-};
-
-struct _EMenuPrivate {
- EDList menus;
-};
-
-static GObjectClass *em_parent;
-
-static void
-em_init(GObject *o)
-{
- EMenu *emp = (EMenu *)o;
- struct _EMenuPrivate *p;
-
- p = emp->priv = g_malloc0(sizeof(struct _EMenuPrivate));
-
- e_dlist_init(&p->menus);
-}
-
-static void
-em_finalise(GObject *o)
-{
- EMenu *em = (EMenu *)o;
- struct _EMenuPrivate *p = em->priv;
- struct _menu_node *mnode;
-
- if (em->target)
- e_menu_target_free(em, em->target);
- g_free(em->menuid);
-
- while ((mnode = (struct _menu_node *)e_dlist_remhead(&p->menus))) {
- struct _item_node *inode;
-
- if (mnode->freefunc)
- mnode->freefunc(em, mnode->items, mnode->uis, mnode->pixmaps, mnode->data);
-
- inode = mnode->menu;
- while (inode) {
- struct _item_node *nnode = inode->next;
-
- g_free(inode);
- inode = nnode;
- }
-
- g_free(mnode);
- }
-
- g_free(p);
-
- ((GObjectClass *)em_parent)->finalize(o);
-}
-
-static void
-em_target_free(EMenu *ep, EMenuTarget *t)
-{
- g_free(t);
- /* look funny but t has a reference to us */
- g_object_unref(ep);
-}
-
-static void
-em_class_init(GObjectClass *klass)
-{
- d(printf("EMenu class init %p '%s'\n", klass, g_type_name(((GObjectClass *)klass)->g_type_class.g_type)));
-
- klass->finalize = em_finalise;
- ((EMenuClass *)klass)->target_free = em_target_free;
-}
-
-static void
-em_base_init(GObjectClass *klass)
-{
- /* each class instance must have its own list, it isn't inherited */
- d(printf("%p: list init\n", klass));
- e_dlist_init(&((EMenuClass *)klass)->factories);
-}
-
-/**
- * e_menu_get_type:
- *
- * Standard GObject type function. Used to subclass this type only.
- *
- * Return value: The EMenu object type.
- **/
-GType
-e_menu_get_type(void)
-{
- static GType type = 0;
-
- if (type == 0) {
- static const GTypeInfo info = {
- sizeof(EMenuClass),
- (GBaseInitFunc)em_base_init, NULL,
- (GClassInitFunc)em_class_init,
- NULL, NULL,
- sizeof(EMenu), 0,
- (GInstanceInitFunc)em_init
- };
- em_parent = g_type_class_ref(G_TYPE_OBJECT);
- type = g_type_register_static(G_TYPE_OBJECT, "EMenu", &info, 0);
- }
-
- return type;
-}
-
-/**
- * e_menu_construct:
- * @em: An instantiated but uninitislied EPopup.
- * @menuid: The unique identifier for this menu.
- *
- * Construct the base menu instance based on the parameters.
- *
- * Return value: Returns @em.
- **/
-EMenu *e_menu_construct(EMenu *em, const char *menuid)
-{
- struct _EMenuFactory *f;
- EMenuClass *klass;
-
- d(printf("constructing menu '%s'\n", menuid));
-
- klass = (EMenuClass *)G_OBJECT_GET_CLASS(em);
-
- d(printf(" class is %p '%s'\n", klass, g_type_name(((GObjectClass *)klass)->g_type_class.g_type)));
-
- em->menuid = g_strdup(menuid);
-
- /* setup the menu itself based on factories */
- f = (struct _EMenuFactory *)klass->factories.head;
- if (f->next == NULL) {
- d(printf("%p no factories registered on menu\n", klass));
- }
-
- while (f->next) {
- if (f->menuid == NULL
- || !strcmp(f->menuid, em->menuid)) {
- d(printf(" calling factory\n"));
- f->factory(em, f->factory_data);
- }
- f = f->next;
- }
-
- return em;
-}
-
-/**
- * e_menu_add_items:
- * @emp: An initialised EMenu.
- * @items: A list of EMenuItems or derived structures defining a group
- * of menu items for this menu.
- * @uifiles: A list of EMenuUIFile objects describing all ui files
- * associated with the items.
- * @pixmaps: A list of EMenuPixmap objects describing all pixmaps
- * associated with the menus.
- * @freefunc: If supplied, called when the menu items are no longer needed.
- * @data: user-data passed to @freefunc and activate callbacks.
- *
- * Add new EMenuItems to the menu's. This may be called any number of
- * times before the menu is first activated to hook onto any of the
- * menu items defined for that view.
- *
- * Return value: A handle that can be passed to remove_items as required.
- **/
-void *
-e_menu_add_items(EMenu *emp, GSList *items, GSList *uifiles, GSList *pixmaps, EMenuItemsFunc freefunc, void *data)
-{
- struct _menu_node *node;
- GSList *l;
-
- node = g_malloc0(sizeof(*node));
- node->parent = emp;
- node->items = items;
- node->uis = uifiles;
- node->pixmaps = pixmaps;
- node->freefunc = freefunc;
- node->data = data;
-
- for (l=items;l;l=g_slist_next(l)) {
- struct _item_node *inode = g_malloc0(sizeof(*inode));
- EMenuItem *item = l->data;
-
- inode->item = item;
- inode->menu = node;
- inode->next = node->menu;
- node->menu = inode;
- }
-
- for (l=pixmaps;l;l=g_slist_next(l)) {
- EMenuPixmap *pixmap = l->data;
-
- if (pixmap->pixmap == NULL) {
- GdkPixbuf *pixbuf;
-
- pixbuf = e_icon_factory_get_icon(pixmap->name, pixmap->size);
- if (pixbuf == NULL) {
- g_warning("Unable to load icon '%s'", pixmap->name);
- } else {
- pixmap->pixmap = bonobo_ui_util_pixbuf_to_xml(pixbuf);
- g_object_unref(pixbuf);
- }
- }
- }
-
- e_dlist_addtail(&emp->priv->menus, (EDListNode *)node);
-
- /* FIXME: add the menu's to a running menu if it is there? */
-
- return (void *)node;
-}
-
-/**
- * e_menu_remove_items:
- * @emp:
- * @handle:
- *
- * Remove menu items previously added.
- **/
-void
-e_menu_remove_items(EMenu *emp, void *handle)
-{
- struct _menu_node *node = handle;
- struct _item_node *inode;
- GSList *l;
-
- e_dlist_remove((EDListNode *)node);
-
- if (emp->uic) {
- for (l = node->items;l;l=g_slist_next(l)) {
- EMenuItem *item = l->data;
-
- bonobo_ui_component_remove_verb(emp->uic, item->verb);
- }
- }
-
- if (node->freefunc)
- node->freefunc(emp, node->items, node->uis, node->pixmaps, node->data);
-
- inode = node->menu;
- while (inode) {
- struct _item_node *nnode = inode->next;
-
- g_free(inode);
- inode = nnode;
- }
-
- g_free(node);
-}
-
-static void
-em_activate_toggle(BonoboUIComponent *component, const char *path, Bonobo_UIComponent_EventType type, const char *state, void *data)
-{
- struct _item_node *inode = data;
-
- if (type != Bonobo_UIComponent_STATE_CHANGED)
- return;
-
- ((EMenuToggleActivateFunc)inode->item->activate)(inode->menu->parent, inode->item, state[0] != '0', inode->menu->data);
-}
-
-static void
-em_activate(BonoboUIComponent *uic, void *data, const char *cname)
-{
- struct _item_node *inode = data;
-
- ((EMenuActivateFunc)inode->item->activate)(inode->menu->parent, inode->item, inode->menu->data);
-}
-
-/**
- * e_menu_activate:
- * @em: An initialised EMenu.
- * @uic: The BonoboUI component for this views menu's.
- * @act: If %TRUE, then the control is being activated.
- *
- * This is called by the owner of the component, control, or view to
- * pass on the activate or deactivate control signals. If the view is
- * being activated then the callbacks and menu items are setup,
- * otherwise they are removed.
- *
- * This should always be called in the strict sequence of activate, then
- * deactivate, repeated any number of times.
- **/
-void e_menu_activate(EMenu *em, struct _BonoboUIComponent *uic, int act)
-{
- struct _EMenuPrivate *p = em->priv;
- struct _menu_node *mw;
- GSList *l;
-
- if (act) {
- GArray *verbs;
- int i;
-
- em->uic = uic;
-
- verbs = g_array_new(TRUE, FALSE, sizeof(BonoboUIVerb));
- for (mw = (struct _menu_node *)p->menus.head;mw->next;mw=mw->next) {
- struct _item_node *inode;
-
- for (l = mw->uis; l ; l = g_slist_next(l)) {
- EMenuUIFile *ui = l->data;
-
- bonobo_ui_util_set_ui(uic, ui->appdir, ui->filename, ui->appname, NULL);
- }
-
- for (l = mw->pixmaps; l ; l = g_slist_next(l)) {
- EMenuPixmap *pm = l->data;
-
- if (pm->pixmap)
- bonobo_ui_component_set_prop(uic, pm->command, "pixmap", pm->pixmap, NULL);
- }
-
- for (inode = mw->menu; inode; inode=inode->next) {
- EMenuItem *item = inode->item;
- BonoboUIVerb *verb;
-
- d(printf("adding menu verb '%s'\n", item->verb));
-
- switch (item->type & E_MENU_TYPE_MASK) {
- case E_MENU_ITEM:
- i = verbs->len;
- verbs = g_array_set_size(verbs, i+1);
- verb = &((BonoboUIVerb *)verbs->data)[i];
-
- verb->cname = item->verb;
- verb->cb = em_activate;
- verb->user_data = inode;
- break;
- case E_MENU_TOGGLE:
- bonobo_ui_component_set_prop(uic, item->path, "state", item->type & E_MENU_ACTIVE?"1":"0", NULL);
- bonobo_ui_component_add_listener(uic, item->verb, em_activate_toggle, inode);
- break;
- }
- }
- }
-
- if (verbs->len)
- bonobo_ui_component_add_verb_list(uic, (BonoboUIVerb *)verbs->data);
-
- g_array_free(verbs, TRUE);
- } else {
- for (mw = (struct _menu_node *)p->menus.head;mw->next;mw=mw->next) {
- for (l = mw->items;l;l=g_slist_next(l)) {
- EMenuItem *item = l->data;
-
- bonobo_ui_component_remove_verb(uic, item->verb);
- }
- }
-
- em->uic = NULL;
- }
-}
-
-/**
- * e_menu_update_target:
- * @em: An initialised EMenu.
- * @tp: Target, after this call the menu owns the target.
- *
- * Change the target for the menu. Once the target is changed, the
- * sensitivity state of the menu items managed by @em is re-evaluated
- * and the physical menu's updated to reflect it.
- *
- * This is used by the owner of the menu and view to update the menu
- * system based on user input or changed system state.
- **/
-void e_menu_update_target(EMenu *em, void *tp)
-{
- struct _EMenuPrivate *p = em->priv;
- EMenuTarget *t = tp;
- guint32 mask = ~0;
- struct _menu_node *mw;
- GSList *l;
-
- if (em->target && em->target != t)
- e_menu_target_free(em, em->target);
-
- /* if we unset the target, should we disable/hide all the menu items? */
- em->target = t;
- if (t == NULL)
- return;
-
- mask = t->mask;
-
- /* canna do any more capt'n */
- if (em->uic == NULL)
- return;
-
- for (mw = (struct _menu_node *)p->menus.head;mw->next;mw=mw->next) {
- for (l = mw->items;l;l=g_slist_next(l)) {
- EMenuItem *item = l->data;
- int state;
-
- d(printf("checking item '%s' mask %08x against target %08x\n", item->verb, item->enable, mask));
-
- state = (item->enable & mask) == 0;
- bonobo_ui_component_set_prop(em->uic, item->path, "sensitive", state?"1":"0", NULL);
- /* visible? */
- }
- }
-}
-
-/* ********************************************************************** */
-
-/**
- * e_menu_class_add_factory:
- * @klass: An EMenuClass type to which this factory applies.
- * @menuid: The identifier of the menu for this factory, or NULL to be
- * called on all menus.
- * @func: An EMenuFactoryFunc callback.
- * @data: Callback data for @func.
- *
- * Add a menu factory which will be called when the menu @menuid is
- * created. The factory is free to add new items as it wishes to the
- * menu provided in the callback.
- *
- * TODO: Make the menuid a pattern?
- *
- * Return value: A handle to the factory.
- **/
-EMenuFactory *
-e_menu_class_add_factory(EMenuClass *klass, const char *menuid, EMenuFactoryFunc func, void *data)
-{
- struct _EMenuFactory *f = g_malloc0(sizeof(*f));
-
- d(printf("%p adding factory '%s' to class '%s'\n", klass, menuid?menuid:"<all menus>", g_type_name(((GObjectClass *)klass)->g_type_class.g_type)));
-
- f->menuid = g_strdup(menuid);
- f->factory = func;
- f->factory_data = data;
- e_dlist_addtail(&klass->factories, (EDListNode *)f);
-
- /* setup the menu itself based on factories */
- {
- struct _EMenuFactory *j;
-
- j = (struct _EMenuFactory *)klass->factories.head;
- if (j->next == NULL) {
- d(printf("%p no factories registered on menu???\n", klass));
- }
- }
-
- return f;
-}
-
-/**
- * e_menu_class_remove_factory:
- * @klass: Class on which the factory was originally added.
- * @f: Factory handle.
- *
- * Remove a popup factory. This must only be called once, and must
- * only be called using a valid factory handle @f. After this call,
- * @f is undefined.
- **/
-void
-e_menu_class_remove_factory(EMenuClass *klass, EMenuFactory *f)
-{
- e_dlist_remove((EDListNode *)f);
- g_free(f->menuid);
- g_free(f);
-}
-
-/**
- * e_menu_target_new:
- * @ep: An EMenu to which this target applies.
- * @type: Target type, up to implementation.
- * @size: Size of memory to allocate. Must be >= sizeof(EMenuTarget).
- *
- * Allocate a new menu target suitable for this class. @size is used
- * to specify the actual target size, which may vary depending on the
- * implementing class.
- **/
-void *e_menu_target_new(EMenu *ep, int type, size_t size)
-{
- EMenuTarget *t;
-
- g_assert(size >= sizeof(EMenuTarget));
-
- t = g_malloc0(size);
- t->menu = ep;
- g_object_ref(ep);
- t->type = type;
-
- return t;
-}
-
-/**
- * e_menu_target_free:
- * @ep: EMenu on which the target was allocated.
- * @o: Tareget to free.
- *
- * Free a target.
- **/
-void
-e_menu_target_free(EMenu *ep, void *o)
-{
- EMenuTarget *t = o;
-
- ((EMenuClass *)G_OBJECT_GET_CLASS(ep))->target_free(ep, t);
-}
-
-/* ********************************************************************** */
-
-/* Main menu plugin handler */
-
-/* NB: This has significant overlap with EPopupHook */
-
-/*
-<e-plugin
- class="org.gnome.mail.plugin.popup:1.0"
- id="org.gnome.mail.plugin.popup.item:1.0"
- type="shlib"
- location="/opt/gnome2/lib/camel/1.0/libcamelimap.so"
- name="imap"
- description="Main menu plugin">
- <hook class="org.gnome.evolution.bonobomenu:1.0">
- <menu id="any" target="select" view="org.gnome.mail">
- <ui file="ui file1"/>
- <ui file="ui file2"/>
- <pixmap command="command" pixmap="stockname" size="menu|button|small_toolbar|large_toolbar|dnd|dialog"/>
- <item
- type="item|toggle"
- verb="verb"
- enable="select_one"
- visible="select_one"
- activate="doactivate"/>
- </menu>
- </hook>
- </extension>
-
-*/
-
-static void *emph_parent_class;
-#define emph ((EMenuHook *)eph)
-
-/* must have 1:1 correspondence with e-menu types in order */
-static const EPluginHookTargetKey emph_item_types[] = {
- { "item", E_MENU_ITEM },
- { "toggle", E_MENU_TOGGLE },
- { "radio", E_MENU_RADIO },
- { 0 }
-};
-
-/* 1:1 with e-icon-factory sizes */
-static const EPluginHookTargetKey emph_pixmap_sizes[] = {
- { "menu", 0 },
- { "button", 1},
- { "small_toolbar", 2},
- { "large_toolbar", 3},
- { "dnd", 4},
- { "dialog", 5},
- { 0 }
-};
-
-static void
-emph_menu_activate(EMenu *em, EMenuItem *item, void *data)
-{
- EMenuHook *hook = data;
-
- d(printf("invoking plugin hook '%s' %p\n", (char *)item->user_data, em->target));
-
- e_plugin_invoke(hook->hook.plugin, item->user_data, em->target);
-}
-
-static void
-emph_menu_toggle_activate(EMenu *em, EMenuItem *item, int state, void *data)
-{
- EMenuHook *hook = data;
-
- /* FIXME: where does the toggle state go? */
- d(printf("invoking plugin hook '%s' %p\n", (char *)item->user_data, em->target));
-
- e_plugin_invoke(hook->hook.plugin, item->user_data, em->target);
-}
-
-static void
-emph_menu_factory(EMenu *emp, void *data)
-{
- struct _EMenuHookMenu *menu = data;
-
- d(printf("menu factory, adding %d items\n", g_slist_length(menu->items)));
-
- if (menu->items)
- e_menu_add_items(emp, menu->items, menu->uis, menu->pixmaps, NULL, menu->hook);
-}
-
-static void
-emph_free_item(struct _EMenuItem *item)
-{
- g_free(item->path);
- g_free(item->verb);
- g_free(item->user_data);
- g_free(item);
-}
-
-static void
-emph_free_ui(struct _EMenuUIFile *ui)
-{
- g_free(ui->appdir);
- g_free(ui->appname);
- g_free(ui->filename);
-}
-
-static void
-emph_free_pixmap(struct _EMenuPixmap *pixmap)
-{
- g_free(pixmap->command);
- g_free(pixmap->name);
- g_free(pixmap->pixmap);
- g_free(pixmap);
-}
-
-static void
-emph_free_menu(struct _EMenuHookMenu *menu)
-{
- g_slist_foreach(menu->items, (GFunc)emph_free_item, NULL);
- g_slist_free(menu->items);
- g_slist_foreach(menu->uis, (GFunc)emph_free_ui, NULL);
- g_slist_free(menu->uis);
- g_slist_foreach(menu->pixmaps, (GFunc)emph_free_pixmap, NULL);
- g_slist_free(menu->pixmaps);
-
- g_free(menu->id);
- g_free(menu);
-}
-
-static struct _EMenuItem *
-emph_construct_item(EPluginHook *eph, EMenuHookMenu *menu, xmlNodePtr root, EMenuHookTargetMap *map)
-{
- struct _EMenuItem *item;
-
- d(printf(" loading menu item\n"));
- item = g_malloc0(sizeof(*item));
- item->type = e_plugin_hook_id(root, emph_item_types, "type");
- item->path = e_plugin_xml_prop(root, "path");
- item->verb = e_plugin_xml_prop(root, "verb");
- item->visible = e_plugin_hook_mask(root, map->mask_bits, "visible");
- item->enable = e_plugin_hook_mask(root, map->mask_bits, "enable");
- item->user_data = e_plugin_xml_prop(root, "activate");
- if ((item->type & E_MENU_TYPE_MASK) == E_MENU_TOGGLE)
- item->activate = G_CALLBACK(emph_menu_toggle_activate);
- else
- item->activate = G_CALLBACK(emph_menu_activate);
-
- if (item->type == -1 || item->user_data == NULL)
- goto error;
-
- d(printf(" path=%s\n", item->path));
- d(printf(" verb=%s\n", item->verb));
-
- return item;
-error:
- d(printf("error!\n"));
- emph_free_item(item);
- return NULL;
-}
-
-static struct _EMenuPixmap *
-emph_construct_pixmap(EPluginHook *eph, EMenuHookMenu *menu, xmlNodePtr root)
-{
- struct _EMenuPixmap *pixmap;
-
- d(printf(" loading menu pixmap\n"));
- pixmap = g_malloc0(sizeof(*pixmap));
- pixmap->command = e_plugin_xml_prop(root, "command");
- pixmap->name = e_plugin_xml_prop(root, "pixmap");
- pixmap->size = e_plugin_hook_id(root, emph_pixmap_sizes, "size");
-
- if (pixmap->command == NULL || pixmap->name == NULL || pixmap->size == -1)
- goto error;
-
- return pixmap;
-error:
- d(printf("error!\n"));
- emph_free_pixmap(pixmap);
- return NULL;
-}
-
-static struct _EMenuHookMenu *
-emph_construct_menu(EPluginHook *eph, xmlNodePtr root)
-{
- struct _EMenuHookMenu *menu;
- xmlNodePtr node;
- EMenuHookTargetMap *map;
- EMenuHookClass *klass = (EMenuHookClass *)G_OBJECT_GET_CLASS(eph);
- char *tmp;
-
- d(printf(" loading menu\n"));
- menu = g_malloc0(sizeof(*menu));
- menu->hook = (EMenuHook *)eph;
-
- tmp = xmlGetProp(root, "target");
- if (tmp == NULL)
- goto error;
- map = g_hash_table_lookup(klass->target_map, tmp);
- xmlFree(tmp);
- if (map == NULL)
- goto error;
-
- menu->target_type = map->id;
- menu->id = e_plugin_xml_prop(root, "id");
- node = root->children;
- while (node) {
- if (0 == strcmp(node->name, "item")) {
- struct _EMenuItem *item;
-
- item = emph_construct_item(eph, menu, node, map);
- if (item)
- menu->items = g_slist_append(menu->items, item);
- } else if (0 == strcmp(node->name, "ui")) {
- tmp = xmlGetProp(node, "file");
- if (tmp) {
- EMenuUIFile *ui = g_malloc0(sizeof(*ui));
-
- ui->filename = tmp;
- ui->appdir = g_strdup("/tmp");
- ui->appname = g_strdup("Evolution");
- menu->uis = g_slist_append(menu->uis, ui);
- }
- } else if (0 == strcmp(node->name, "pixmap")) {
- struct _EMenuPixmap *pixmap;
-
- pixmap = emph_construct_pixmap(eph, menu, node);
- if (pixmap)
- menu->pixmaps = g_slist_append(menu->pixmaps, pixmap);
- }
- node = node->next;
- }
-
- return menu;
-error:
- d(printf("error loading menu hook\n"));
- emph_free_menu(menu);
- return NULL;
-}
-
-static int
-emph_construct(EPluginHook *eph, EPlugin *ep, xmlNodePtr root)
-{
- xmlNodePtr node;
- EMenuClass *klass;
-
- d(printf("loading menu hook\n"));
-
- if (((EPluginHookClass *)emph_parent_class)->construct(eph, ep, root) == -1)
- return -1;
-
- klass = ((EMenuHookClass *)G_OBJECT_GET_CLASS(eph))->menu_class;
-
- node = root->children;
- while (node) {
- if (strcmp(node->name, "menu") == 0) {
- struct _EMenuHookMenu *menu;
-
- menu = emph_construct_menu(eph, node);
- if (menu) {
- printf(" plugin adding factory %p\n", klass);
- e_menu_class_add_factory(klass, menu->id, emph_menu_factory, menu);
- emph->menus = g_slist_append(emph->menus, menu);
- }
- }
-
- node = node->next;
- }
-
- eph->plugin = ep;
-
- return 0;
-}
-
-static void
-emph_finalise(GObject *o)
-{
- EPluginHook *eph = (EPluginHook *)o;
-
- g_slist_foreach(emph->menus, (GFunc)emph_free_menu, NULL);
- g_slist_free(emph->menus);
-
- ((GObjectClass *)emph_parent_class)->finalize(o);
-}
-
-static void
-emph_class_init(EPluginHookClass *klass)
-{
- printf("EMenuHook class init %p '%s'\n", klass, g_type_name(((GObjectClass *)klass)->g_type_class.g_type));
-
- ((GObjectClass *)klass)->finalize = emph_finalise;
- klass->construct = emph_construct;
-
- /* this is actually an abstract implementation but list it anyway */
- klass->id = "org.gnome.evolution.bonobomenu:1.0";
-
- ((EMenuHookClass *)klass)->target_map = g_hash_table_new(g_str_hash, g_str_equal);
- ((EMenuHookClass *)klass)->menu_class = g_type_class_ref(e_menu_get_type());
-}
-
-/**
- * e_menu_hook_get_type:
- *
- * Standard GObject function to get the object type. Used to subclass
- * EMenuHook.
- *
- * Return value: The type of the menu hook class.
- **/
-GType
-e_menu_hook_get_type(void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof(EMenuHookClass), NULL, NULL, (GClassInitFunc) emph_class_init, NULL, NULL,
- sizeof(EMenuHook), 0, (GInstanceInitFunc) NULL,
- };
-
- emph_parent_class = g_type_class_ref(e_plugin_hook_get_type());
- type = g_type_register_static(e_plugin_hook_get_type(), "EMenuHook", &info, 0);
- }
-
- return type;
-}
-
-/**
- * e_menu_hook_class_add_target_map:
- * @klass: The derived EMenuHook class.
- * @map: A map used to describe a single EMenuTarget for this class.
- *
- * Adds a target map to a concrete derived class of EMenu. The target
- * map enumerates a single target type, and the enable mask bit names,
- * so that the type can be loaded automatically by the EMenu class.
- **/
-void e_menu_hook_class_add_target_map(EMenuHookClass *klass, const EMenuHookTargetMap *map)
-{
- g_hash_table_insert(klass->target_map, (void *)map->type, (void *)map);
-}
diff --git a/e-util/e-menu.h b/e-util/e-menu.h
deleted file mode 100644
index 80bac35470..0000000000
--- a/e-util/e-menu.h
+++ /dev/null
@@ -1,323 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Authors: Michel Zucchi <notzed@ximian.com>
- *
- * Copyright 2003 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifndef __E_MENU_H__
-#define __E_MENU_H__
-
-#include <glib-object.h>
-#include "libedataserver/e-msgport.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* This is an abstract popup menu management/merging class.
-
- To implement your own popup menu system, just create your own
- target types and implement the target free method. */
-
-typedef struct _EMenu EMenu;
-typedef struct _EMenuClass EMenuClass;
-
-typedef struct _EMenuItem EMenuItem;
-typedef struct _EMenuUIFile EMenuUIFile;
-typedef struct _EMenuPixmap EMenuPixmap;
-
-typedef struct _EMenuFactory EMenuFactory; /* anonymous type */
-typedef struct _EMenuTarget EMenuTarget;
-
-typedef void (*EMenuFactoryFunc)(EMenu *emp, void *data);
-typedef void (*EMenuActivateFunc)(EMenu *, EMenuItem *, void *data);
-typedef void (*EMenuToggleActivateFunc)(EMenu *, EMenuItem *, int state, void *data);
-typedef void (*EMenuItemsFunc)(EMenu *, GSList *items, GSList *uifiles, GSList *pixmaps, void *data);
-
-/**
- * enum _e_menu_t - Menu item type.
- *
- * @E_MENU_ITEM: Normal menu item.
- * @E_MENU_TOGGLE: Toggle menu item.
- * @E_MENU_RADIO: unimplemented.
- * @E_MENU_TYPE_MASK: Mask used to separate item type from option bits.
- * @E_MENU_ACTIVE: Whether a toggle item is active.
- *
- * The type of menu items which are supported by the menu system.
- **/
-enum _e_menu_t {
- E_MENU_ITEM = 0,
- E_MENU_TOGGLE,
- E_MENU_RADIO,
- E_MENU_TYPE_MASK = 0xffff,
- E_MENU_ACTIVE = 0x10000,
-};
-
-/**
- * struct _EMenuItem - A BonoboUI menu item.
- *
- * @type: Menu item type. %E_MENU_ITEM or %E_MENU_TOGGLE.
- * @path: BonoboUI Path to the menu item.
- * @verb: BonoboUI verb for the menu item.
- * @activate: Callback when the menu item is selected. This will be a
- * EMenuToggleActivateFunc for toggle items or EMenuActivateFunc for
- * normal items.
- * @user_data: User data for item.
- * @visible: Visibility mask, unimplemented.
- * @enable: Sensitivity mask, combined with the target mask.
- *
- * An EMenuItem defines a single menu item. This menu item is used to
- * hook onto callbacks from the bonobo menus, but not to build or
- * merge the menu itself.
- **/
-struct _EMenuItem {
- enum _e_menu_t type;
- char *path; /* full path? can we just create it from verb? */
- char *verb; /* command verb */
- GCallback activate; /* depends on type, the bonobo activate callback */
- void *user_data; /* up to caller to use */
- guint32 visible; /* is visible mask */
- guint32 enable; /* is enable mask */
-};
-
-/**
- * struct _EMenuPixmap - A menu icon holder.
- *
- * @command: The path to the command or verb to which this pixmap belongs.
- * @name: The name of the icon. Either an icon-theme name or the full
- * pathname of the icon.
- * @size: The e-icon-factory icon size.
- * @pixmap: The pixmap converted to XML format. If not set, then EMenu will
- * create it as required. This must be freed if set in the free function.
- *
- * Used to track all pixmap items used in menus. These need to be
- * supplied separately from the menu definition.
- **/
-struct _EMenuPixmap {
- char *command;
- char *name;
- int size;
- char *pixmap;
-};
-
-/**
- * struct _EMenuUIFile - A meu UI file holder.
- *
- * @appdir: TODO; should this be handled internally.
- * @appname: TODO; should this be handled internally.
- * @filename: The filename of the BonoboUI XML menu definition.
- *
- * These values are passed directly to bonobo_ui_util_set_ui() when
- * the menu is activated.
- **/
-struct _EMenuUIFile {
- char *appdir;
- char *appname;
- char *filename;
-};
-
-/**
- * struct _EMenuTarget - A BonoboUI menu target definition.
- *
- * @menu: The parent menu object, used for virtual methods on the target.
- * @widget: The parent widget where available. In some cases the type
- * of this object is part of the published api for the target, in
- * others it is merely a GtkWidget from which you can find the
- * toplevel widget.
- * @type: Target type. This will be defined by the implementation.
- * @mask: Target mask. This is used to sensitise show items based on
- * their definition in EMenuItem.
- *
- * An EMenuTarget defines the context for a specific view instance.
- * It is used to enable and show menu items, and to provide contextual
- * data to menu invocations.
- **/
-struct _EMenuTarget {
- struct _EMenu *menu; /* used for virtual methods */
-
- struct _GtkWidget *widget; /* used if you need a parent toplevel, if available */
- guint32 type; /* for implementors */
-
- guint32 mask; /* enable/visible mask */
-
- /* implementation fields follow */
-};
-
-/**
- * struct _EMenu - A BonoboUI menu manager object.
- *
- * @object: Superclass.
- * @priv: Private data.
- * @menuid: The id of this menu instance.
- * @uic: The current BonoboUIComponent which stores the actual menu
- * items this object manages.
- * @target: The current target for the view.
- *
- * The EMenu manager object manages the mappings between EMenuItems
- * and the BonoboUI menus loaded from UI files.
- **/
-struct _EMenu {
- GObject object;
- struct _EMenuPrivate *priv;
-
- char *menuid;
- struct _BonoboUIComponent *uic;
- EMenuTarget *target;
-};
-
-/**
- * struct _EMenuClass -
- *
- * @object_class: Superclass type.
- * @factories: A list of factories for this particular class of main menu.
- * @target_free: Virtual method to free the menu target. The base
- * class free method frees the allocation and unrefs the EMenu parent
- * pointer.
- *
- * The EMenu class definition. This should be sub-classed for each
- * component that wants to provide hookable main menus. The subclass
- * only needs to know how to allocate and free the various target
- * types it supports.
- **/
-struct _EMenuClass {
- GObjectClass object_class;
-
- EDList factories;
-
- void (*target_free)(EMenu *ep, EMenuTarget *t);
-};
-
-GType e_menu_get_type(void);
-
-/* Static class methods */
-EMenuFactory *e_menu_class_add_factory(EMenuClass *klass, const char *menuid, EMenuFactoryFunc func, void *data);
-void e_menu_class_remove_factory(EMenuClass *klass, EMenuFactory *f);
-
-EMenu *e_menu_construct(EMenu *menu, const char *menuid);
-
-void e_menu_add_ui(EMenu *, const char *appdir, const char *appname, const char *filename);
-void e_menu_add_pixmap(EMenu *, const char *cmd, const char *name, int size);
-
-void *e_menu_add_items(EMenu *emp, GSList *items, GSList *uifiles, GSList *pixmaps, EMenuItemsFunc freefunc, void *data);
-void e_menu_remove_items(EMenu *emp, void *handle);
-
-void e_menu_activate(EMenu *, struct _BonoboUIComponent *uic, int act);
-void e_menu_update_target(EMenu *, void *);
-
-void *e_menu_target_new(EMenu *, int type, size_t size);
-void e_menu_target_free(EMenu *, void *);
-
-/* ********************************************************************** */
-
-/* menu plugin, they are closely integrated */
-
-/* To implement a basic menu plugin, you just need to subclass
- this and initialise the class target type tables */
-
-#include "e-util/e-plugin.h"
-
-typedef struct _EMenuHookPixmap EMenuHookPixmap;
-typedef struct _EMenuHookMenu EMenuHookMenu;
-typedef struct _EMenuHook EMenuHook;
-typedef struct _EMenuHookClass EMenuHookClass;
-
-typedef struct _EPluginHookTargetMap EMenuHookTargetMap;
-typedef struct _EPluginHookTargetKey EMenuHookTargetMask;
-
-typedef void (*EMenuHookFunc)(struct _EPlugin *plugin, EMenuTarget *target);
-
-/**
- * struct _EMenuHookMenu - A group of items targetting a specific menu.
- *
- * @hook: Parent pointer.
- * @id: The identifier of the menu or view to which these items belong.
- * @target_type: The target number of the type of target these menu
- * items expect. This will be defined by menu itself.
- * @items: A list of EMenuItems.
- * @uis: A list of filenames of the BonoboUI files that need to be
- * loaded for an active view.
- * @pixmaps: A list of EMenuHookPixmap structures for the menus.
- *
- * This structure is used to keep track of all of the items that a
- * plugin wishes to add to specific menu. This is used internally by
- * a factory method defined by the EMenuHook to add the right menu
- * items to a given view.
- **/
-struct _EMenuHookMenu {
- struct _EMenuHook *hook; /* parent pointer */
- char *id; /* target menu id for these menu items */
- int target_type; /* target type, not used */
- GSList *items; /* items to add to menu */
- GSList *uis; /* ui files */
- GSList *pixmaps; /* pixmap descriptors */
-};
-
-/**
- * struct _EMenuHook - A BonoboUI menu hook.
- *
- * @hook: Superclass.
- * @menus: A list of EMenuHookMenus for all menus registered on this
- * hook type.
- *
- * The EMenuHook class loads and manages the meta-data to required to
- * map plugin definitions to physical menus.
- **/
-struct _EMenuHook {
- EPluginHook hook;
-
- GSList *menus;
-};
-
-/**
- * struct _EMenuHookClass - Menu hook type.
- *
- * @hook_class: Superclass type.
- * @target_map: Table of EluginHookTargetMaps which enumerate the
- * target types and enable bits of the implementing class.
- * @menu_class: The EMenuClass of the corresponding popup manager for
- * implementing the class.
- *
- * The EMenuHookClass is an empty concrete class. It must be
- * subclassed and initialised appropriately to perform useful work.
- *
- * The EPluginHookClass.id must be set to the name and version of the
- * hook handler the implementation defines. The @target_map must be
- * initialised with the data required to enumerate the target types
- * and enable flags supported by the implementing class.
- **/
-struct _EMenuHookClass {
- EPluginHookClass hook_class;
-
- /* EMenuHookTargetMap by .type */
- GHashTable *target_map;
- /* the menu class these menus belong to */
- EMenuClass *menu_class;
-};
-
-GType e_menu_hook_get_type(void);
-
-/* for implementors */
-void e_menu_hook_class_add_target_map(EMenuHookClass *klass, const EMenuHookTargetMap *);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_MENU_H__ */
diff --git a/e-util/e-mktemp.c b/e-util/e-mktemp.c
deleted file mode 100644
index 67a9a5adf8..0000000000
--- a/e-util/e-mktemp.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 2001 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <errno.h>
-#include <stdio.h>
-#include <time.h>
-
-#include <gal/util/e-util.h>
-
-#include "e-mktemp.h"
-
-#define d(x)
-
-/* define to put temporary files in ~/evolution/cache/tmp */
-#define TEMP_HOME (1)
-
-/* how old things need to be to expire */
-#define TEMP_EXPIRE (60*60*2)
-/* dont scan more often than this */
-#define TEMP_SCAN (60)
-
-static int
-expire_dir_rec(const char *base, time_t now)
-{
- DIR *dir;
- struct dirent *d;
- GString *path;
- size_t len;
- struct stat st;
- int count = 0;
-
- d(printf("expire dir '%s'\n", base));
-
- dir = opendir(base);
- if (dir == NULL)
- return 0;
-
- path = g_string_new(base);
- len = path->len;
-
- while ( (d = readdir(dir)) ) {
- if (strcmp(d->d_name, ".") == 0
- || strcmp(d->d_name, "..") == 0)
- continue;
-
- g_string_truncate(path, len);
- g_string_append_printf(path, "/%s", d->d_name);
- d(printf("Checking '%s' for expiry\n", path->str));
-
- if (stat(path->str, &st) == 0
- && st.st_atime + TEMP_EXPIRE < now) {
- if (S_ISDIR(st.st_mode)) {
- if (expire_dir_rec(path->str, now) == 0) {
- d(printf("Removing dir '%s'\n", path->str));
- rmdir(path->str);
- } else {
- count++;
- }
- } else if (unlink(path->str) == -1) {
- d(printf("expiry failed: %s\n", strerror(errno)));
- count++;
- } else {
- d(printf("expired %s\n", path->str));
- }
- } else {
- count++;
- }
- }
- g_string_free(path, TRUE);
- closedir(dir);
-
- d(printf("expire dir '%s' %d remaining files\n", base, count));
-
- return count;
-}
-
-static GString *
-get_dir (gboolean make)
-{
- GString *path;
- time_t now = time(0);
- static time_t last = 0;
-
-#ifdef TEMP_HOME
- path = g_string_new (g_get_home_dir());
- g_string_append_printf(path, "/.evolution/cache/tmp");
- if (make && e_mkdir_hier(path->str, 0777) == -1) {
- g_string_free(path, TRUE);
- path = NULL;
- }
-#else
- path = g_string_new("/tmp/evolution-");
- g_string_append_printf (path, "%d", (int) getuid ());
- if (make) {
- int ret;
-
- /* shoot now, ask questions later */
- ret = mkdir (path->str, S_IRWXU);
- if (ret == -1) {
- if (errno == EEXIST) {
- struct stat st;
-
- if (stat (path->str, &st) == -1) {
- /* reset errno */
- errno = EEXIST;
- g_string_free (path, TRUE);
- return NULL;
- }
-
- /* make sure this is a directory and belongs to us... */
- if (!S_ISDIR (st.st_mode) || st.st_uid != getuid ()) {
- /* eek! this is bad... */
- g_string_free (path, TRUE);
- return NULL;
- }
- } else {
- /* some other error...do not pass go, do not collect $200 */
- g_string_free (path, TRUE);
- return NULL;
- }
- }
- }
-#endif
-
- d(printf("temp dir '%s'\n", path ? path->str : "(null)"));
-
- /* fire off an expirey attempt no more often than TEMP_SCAN seconds */
- if (path && (last+TEMP_SCAN) < now) {
- last = now;
- expire_dir_rec(path->str, now);
- }
-
- return path;
-}
-
-char *
-e_mktemp (const char *template)
-{
- GString *path;
- char *ret;
-
- path = get_dir (TRUE);
- if (!path)
- return NULL;
-
- g_string_append_c (path, '/');
- if (template)
- g_string_append (path, template);
- else
- g_string_append (path, "unknown-XXXXXX");
-
- ret = mktemp (path->str);
- g_string_free(path, ret == NULL);
-
- return ret;
-}
-
-
-int
-e_mkstemp (const char *template)
-{
- GString *path;
- int fd;
-
- path = get_dir (TRUE);
- if (!path)
- return -1;
-
- g_string_append_c (path, '/');
- if (template)
- g_string_append (path, template);
- else
- g_string_append (path, "unknown-XXXXXX");
-
- fd = mkstemp (path->str);
- g_string_free(path, TRUE);
-
- return fd;
-}
-
-
-char *
-e_mkdtemp (const char *template)
-{
- GString *path;
- char *tmpdir;
-
- path = get_dir (TRUE);
- if (!path)
- return NULL;
-
- g_string_append_c (path, '/');
- if (template)
- g_string_append (path, template);
- else
- g_string_append (path, "unknown-XXXXXX");
-
-#ifdef HAVE_MKDTEMP
- tmpdir = mkdtemp (path->str);
-#else
- tmpdir = mktemp (path->str);
- if (tmpdir) {
- if (mkdir (tmpdir, S_IRWXU) == -1)
- tmpdir = NULL;
- }
-#endif
- g_string_free(path, tmpdir == NULL);
-
- return tmpdir;
-}
diff --git a/e-util/e-mktemp.h b/e-util/e-mktemp.h
deleted file mode 100644
index 14fbb9bcc8..0000000000
--- a/e-util/e-mktemp.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 2001 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef __E_MKTEMP_H__
-#define __E_MKTEMP_H__
-
-char *e_mktemp (const char *template);
-
-int e_mkstemp (const char *template);
-
-char *e_mkdtemp (const char *template);
-
-#endif /* __E_MKTEMP_H__ */
diff --git a/e-util/e-passwords.c b/e-util/e-passwords.c
deleted file mode 100644
index 879f055eb4..0000000000
--- a/e-util/e-passwords.c
+++ /dev/null
@@ -1,947 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * e-passwords.c
- *
- * Copyright (C) 2001 Ximian, Inc.
- */
-
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA.
- */
-
-/*
- * This looks a lot more complicated than it is, and than you'd think
- * it would need to be. There is however, method to the madness.
- *
- * The code most cope with being called from any thread at any time,
- * recursively from the main thread, and then serialising every
- * request so that sane and correct values are always returned, and
- * duplicate requests are never made.
- *
- * To this end, every call is marshalled and queued and a dispatch
- * method invoked until that request is satisfied. If mainloop
- * recursion occurs, then the sub-call will necessarily return out of
- * order, but will not be processed out of order.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <string.h>
-#include <libgnome/gnome-config.h>
-#include <libgnome/gnome-i18n.h>
-#include <gtk/gtkversion.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkvbox.h>
-#include <gtk/gtkcheckbutton.h>
-#include <gtk/gtkmessagedialog.h>
-
-#include "e-passwords.h"
-#include "libedataserver/e-msgport.h"
-#include "widgets/misc/e-error.h"
-
-#ifndef ENABLE_THREADS
-#define ENABLE_THREADS (1)
-#endif
-
-#ifdef ENABLE_THREADS
-#include <pthread.h>
-
-static pthread_t main_thread;
-static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
-#define LOCK() pthread_mutex_lock(&lock)
-#define UNLOCK() pthread_mutex_unlock(&lock)
-#else
-#define LOCK()
-#define UNLOCK()
-#endif
-
-struct _EPassMsg {
- EMsg msg;
-
- void (*dispatch)(struct _EPassMsg *);
-
- /* input */
- struct _GtkWindow *parent;
- const char *component;
- const char *key;
- const char *title;
- const char *prompt;
- const char *oldpass;
- guint32 flags;
-
- /* output */
- gboolean *remember;
- char *password;
-
- /* work variables */
- GtkWidget *entry;
- GtkWidget *check;
- int ismain:1;
- int noreply:1; /* supress replies; when calling
- * dispatch functions from others */
-};
-
-typedef struct _EPassMsg EPassMsg;
-
-static GHashTable *passwords = NULL;
-static GtkDialog *password_dialog;
-static EDList request_list = E_DLIST_INITIALISER(request_list);
-static int idle_id;
-static int ep_online_state = TRUE;
-
-static char *decode_base64 (char *base64);
-static int base64_encode_close(unsigned char *in, int inlen, gboolean break_lines, unsigned char *out, int *state, int *save);
-static int base64_encode_step(unsigned char *in, int len, gboolean break_lines, unsigned char *out, int *state, int *save);
-
-static gboolean
-ep_idle_dispatch(void *data)
-{
- EPassMsg *msg;
-
- /* As soon as a password window is up we stop; it will
- re-invoke us when it has been closed down */
- LOCK();
- while (password_dialog == NULL && (msg = (EPassMsg *)e_dlist_remhead(&request_list))) {
- UNLOCK();
-
- msg->dispatch(msg);
-
- LOCK();
- }
-
- idle_id = 0;
- UNLOCK();
-
- return FALSE;
-}
-
-static EPassMsg *
-ep_msg_new(void (*dispatch)(EPassMsg *))
-{
- EPassMsg *msg;
-
- e_passwords_init();
-
- msg = g_malloc0(sizeof(*msg));
- msg->dispatch = dispatch;
- msg->msg.reply_port = e_msgport_new();
-#ifdef ENABLE_THREADS
- msg->ismain = pthread_self() == main_thread;
-#else
- msg->ismain = TRUE;
-#endif
- return msg;
-}
-
-static void
-ep_msg_free(EPassMsg *msg)
-{
- e_msgport_destroy(msg->msg.reply_port);
- g_free(msg->password);
- g_free(msg);
-}
-
-static void
-ep_msg_send(EPassMsg *msg)
-{
- int needidle = 0;
-
- LOCK();
- e_dlist_addtail(&request_list, (EDListNode *)&msg->msg);
- if (!idle_id) {
- if (!msg->ismain)
- idle_id = g_idle_add(ep_idle_dispatch, NULL);
- else
- needidle = 1;
- }
- UNLOCK();
-
- if (msg->ismain) {
- EPassMsg *m;
-
- if (needidle)
- ep_idle_dispatch(NULL);
- while ((m = (EPassMsg *)e_msgport_get(msg->msg.reply_port)) == NULL)
- g_main_context_iteration(NULL, TRUE);
- g_assert(m == msg);
- } else {
- e_msgport_wait(msg->msg.reply_port);
- g_assert(e_msgport_get(msg->msg.reply_port) == &msg->msg);
- }
-}
-
-/* the functions that actually do the work */
-static void
-ep_clear_passwords(EPassMsg *msg)
-{
- char *path;
-
- path = g_strdup_printf ("/Evolution/Passwords-%s", msg->component);
-
- gnome_config_private_clean_section (path);
- gnome_config_private_sync_file ("/Evolution");
-
- g_free (path);
-
- if (!msg->noreply)
- e_msgport_reply(&msg->msg);
-}
-
-static gboolean
-free_entry (gpointer key, gpointer value, gpointer user_data)
-{
- g_free (key);
- memset (value, 0, strlen (value));
- g_free (value);
- return TRUE;
-}
-
-static void
-ep_forget_passwords(EPassMsg *msg)
-{
- void *it;
- char *key;
-
- it = gnome_config_private_init_iterator_sections("/Evolution");
- while ( (it = gnome_config_iterator_next(it, &key, NULL)) ) {
- if (0 == strncmp(key, "Passwords-", 10)) {
- char *section = g_strdup_printf("/Evolution/%s", key);
-
- gnome_config_private_clean_section (section);
- g_free(section);
- }
- g_free(key);
- }
-
- gnome_config_private_sync_file ("/Evolution");
-
- /* free up the session passwords */
- g_hash_table_foreach_remove (passwords, free_entry, NULL);
-
- if (!msg->noreply)
- e_msgport_reply(&msg->msg);
-}
-
-static char *
-password_path (const char *component_name, const char *key)
-{
- char *keycopy, *path;
- int i;
- keycopy = g_strdup (key);
-
- for (i = 0; i < strlen (keycopy); i ++)
- if (keycopy[i] == '/' || keycopy[i] =='=')
- keycopy[i] = '_';
-
- path = g_strdup_printf ("/Evolution/Passwords-%s/%s", component_name, keycopy);
-
- g_free (keycopy);
-
- return path;
-}
-
-static void
-ep_remember_password(EPassMsg *msg)
-{
- gpointer okey, value;
- char *path, *pass64;
- int len, state, save;
-
- if (g_hash_table_lookup_extended (passwords, msg->key, &okey, &value)) {
- /* add it to the on-disk cache of passwords */
- path = password_path (msg->component, okey);
-
- len = strlen (value);
- pass64 = g_malloc0 ((len + 2) * 4 / 3 + 1);
- state = save = 0;
- base64_encode_close (value, len, FALSE, pass64, &state, &save);
-
- gnome_config_private_set_string (path, pass64);
- g_free (path);
- g_free (pass64);
-
- /* now remove it from our session hash */
- g_hash_table_remove (passwords, msg->key);
- g_free (okey);
- g_free (value);
-
- gnome_config_private_sync_file ("/Evolution");
- }
-
- if (!msg->noreply)
- e_msgport_reply(&msg->msg);
-}
-
-static void
-ep_forget_password (EPassMsg *msg)
-{
- gpointer okey, value;
- char *path;
-
- if (g_hash_table_lookup_extended (passwords, msg->key, &okey, &value)) {
- g_hash_table_remove (passwords, msg->key);
- memset (value, 0, strlen (value));
- g_free (okey);
- g_free (value);
- }
-
- /* clear it in the on disk db */
- path = password_path (msg->component, msg->key);
- gnome_config_private_clean_key (path);
- gnome_config_private_sync_file ("/Evolution");
- g_free (path);
-
- if (!msg->noreply)
- e_msgport_reply(&msg->msg);
-}
-
-static void
-ep_get_password (EPassMsg *msg)
-{
- char *path, *passwd;
- char *encoded = NULL;
-
- passwd = g_hash_table_lookup (passwords, msg->key);
- if (passwd) {
- msg->password = g_strdup(passwd);
- } else {
- /* not part of the session hash, look it up in the on disk db */
- path = password_path (msg->component, msg->key);
- encoded = gnome_config_private_get_string_with_default (path, NULL);
- g_free (path);
- if (encoded) {
- msg->password = decode_base64 (encoded);
- g_free (encoded);
- }
- }
-
- if (!msg->noreply)
- e_msgport_reply(&msg->msg);
-}
-
-static void
-ep_add_password (EPassMsg *msg)
-{
- gpointer okey, value;
-
- if (g_hash_table_lookup_extended (passwords, msg->key, &okey, &value)) {
- g_hash_table_remove (passwords, msg->key);
- g_free (okey);
- g_free (value);
- }
-
- g_hash_table_insert (passwords, g_strdup (msg->key), g_strdup (msg->oldpass));
-
- if (!msg->noreply)
- e_msgport_reply(&msg->msg);
-}
-
-static void ep_ask_password(EPassMsg *msg);
-
-static void
-pass_response(GtkDialog *dialog, int response, void *data)
-{
- EPassMsg *msg = data;
- int type = msg->flags & E_PASSWORDS_REMEMBER_MASK;
- EDList pending = E_DLIST_INITIALISER(pending);
- EPassMsg *mw, *mn;
-
- if (response == GTK_RESPONSE_OK) {
- msg->password = g_strdup(gtk_entry_get_text((GtkEntry *)msg->entry));
-
- if (type != E_PASSWORDS_REMEMBER_NEVER) {
- int noreply = msg->noreply;
-
- *msg->remember = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (msg->check));
-
- msg->noreply = 1;
-
- if (*msg->remember || type == E_PASSWORDS_REMEMBER_FOREVER) {
- msg->oldpass = msg->password;
- ep_add_password(msg);
- }
-
- if (*msg->remember && type == E_PASSWORDS_REMEMBER_FOREVER)
- ep_remember_password(msg);
-
- msg->noreply = noreply;
- }
- }
-
- gtk_widget_destroy((GtkWidget *)dialog);
- password_dialog = NULL;
-
- /* ok, here things get interesting, we suck up any pending
- * operations on this specific password, and return the same
- * result or ignore other operations */
-
- LOCK();
- mw = (EPassMsg *)request_list.head;
- mn = (EPassMsg *)mw->msg.ln.next;
- while (mn) {
- if ((mw->dispatch == ep_forget_password
- || mw->dispatch == ep_get_password
- || mw->dispatch == ep_ask_password)
- && (strcmp(mw->component, msg->component) == 0
- && strcmp(mw->key, msg->key) == 0)) {
- e_dlist_remove((EDListNode *)mw);
- mw->password = g_strdup(msg->password);
- e_msgport_reply(&mw->msg);
- }
- mw = mn;
- mn = (EPassMsg *)mn->msg.ln.next;
- }
- UNLOCK();
-
- if (!msg->noreply)
- e_msgport_reply(&msg->msg);
-
- ep_idle_dispatch(NULL);
-}
-
-static void
-ep_ask_password(EPassMsg *msg)
-{
- GtkWidget *vbox;
- int type = msg->flags & E_PASSWORDS_REMEMBER_MASK;
- int noreply = msg->noreply;
- AtkObject *a11y;
-
- msg->noreply = 1;
-
- /*password_dialog = (GtkDialog *)e_error_new(msg->parent, "mail:ask-session-password", msg->prompt, NULL);*/
- password_dialog = (GtkDialog *)gtk_message_dialog_new (msg->parent,
- 0,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_OK_CANCEL,
- "%s", msg->prompt);
- gtk_window_set_title(GTK_WINDOW(password_dialog), msg->title);
-
-#if !GTK_CHECK_VERSION (2,4,0)
- gtk_dialog_set_has_separator(password_dialog, FALSE);
-#endif
- gtk_dialog_set_default_response(password_dialog, GTK_RESPONSE_OK);
-
- vbox = gtk_vbox_new (FALSE, 6);
- gtk_widget_show (vbox);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (password_dialog)->vbox), vbox, TRUE, FALSE, 0);
- gtk_container_set_border_width((GtkContainer *)vbox, 6);
-
- msg->entry = gtk_entry_new ();
-
- a11y = gtk_widget_get_accessible (msg->entry);
- atk_object_set_description (a11y, msg->prompt);
- gtk_entry_set_visibility ((GtkEntry *)msg->entry, !(msg->flags & E_PASSWORDS_SECRET));
- gtk_entry_set_activates_default((GtkEntry *)msg->entry, TRUE);
- gtk_box_pack_start (GTK_BOX (vbox), msg->entry, TRUE, FALSE, 3);
- gtk_widget_show (msg->entry);
- gtk_widget_grab_focus (msg->entry);
-
- if ((msg->flags & E_PASSWORDS_REPROMPT)) {
- ep_get_password(msg);
- if (msg->password) {
- gtk_entry_set_text ((GtkEntry *) msg->entry, msg->password);
- g_free (msg->password);
- msg->password = NULL;
- }
- }
-
- /* static password, shouldn't be remembered between sessions,
- but will be remembered within the session beyond our control */
- if (type != E_PASSWORDS_REMEMBER_NEVER) {
- msg->check = gtk_check_button_new_with_mnemonic(type == E_PASSWORDS_REMEMBER_FOREVER
- ? _("_Remember this password")
- : _("_Remember this password for the remainder of this session"));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (msg->check), *msg->remember);
- gtk_box_pack_start (GTK_BOX (vbox), msg->check, TRUE, FALSE, 3);
- gtk_widget_show (msg->check);
- }
-
- msg->noreply = noreply;
-
- g_signal_connect(password_dialog, "response", G_CALLBACK (pass_response), msg);
- gtk_widget_show((GtkWidget *)password_dialog);
-}
-
-
-/**
- * e_passwords_init:
- *
- * Initializes the e_passwords routines. Must be called before any other
- * e_passwords_* function.
- **/
-void
-e_passwords_init (void)
-{
- LOCK();
-
- if (!passwords) {
- /* create the per-session hash table */
- passwords = g_hash_table_new (g_str_hash, g_str_equal);
-#ifdef ENABLE_THREADS
- main_thread = pthread_self();
-#endif
- }
-
- UNLOCK();
-}
-
-/**
- * e_passwords_cancel:
- *
- * Cancel any outstanding password operations and close any dialogues
- * currently being shown.
- **/
-void
-e_passwords_cancel(void)
-{
- EPassMsg *msg;
-
- LOCK();
- while ((msg = (EPassMsg *)e_dlist_remhead(&request_list)))
- e_msgport_reply(&msg->msg);
- UNLOCK();
-
- if (password_dialog)
- gtk_widget_destroy((GtkWidget *)password_dialog);
-}
-
-/**
- * e_passwords_shutdown:
- *
- * Cleanup routine to call before exiting.
- **/
-void
-e_passwords_shutdown (void)
-{
- /* shouldn't need this really - everything is synchronous */
- gnome_config_private_sync_file ("/Evolution");
-
- e_passwords_cancel();
-
- if (passwords) {
- /* and destroy our per session hash */
- g_hash_table_foreach_remove (passwords, free_entry, NULL);
- g_hash_table_destroy (passwords);
- passwords = NULL;
- }
-}
-
-/**
- * e_passwords_set_online:
- * @state:
- *
- * Set the offline-state of the application. This is a work-around
- * for having the backends fully offline aware, and returns a
- * cancellation response instead of prompting for passwords.
- *
- * FIXME: This is not a permanent api, review post 2.0.
- **/
-void
-e_passwords_set_online(int state)
-{
- ep_online_state = state;
- /* TODO: we could check that a request is open and close it, or maybe who cares */
-}
-
-/**
- * e_passwords_forget_passwords:
- *
- * Forgets all cached passwords, in memory and on disk.
- **/
-void
-e_passwords_forget_passwords (void)
-{
- EPassMsg *msg = ep_msg_new(ep_forget_passwords);
-
- ep_msg_send(msg);
- ep_msg_free(msg);
-}
-
-/**
- * e_passwords_clear_passwords:
- *
- * Forgets all disk cached passwords for the component.
- **/
-void
-e_passwords_clear_passwords (const char *component_name)
-{
- EPassMsg *msg = ep_msg_new(ep_clear_passwords);
-
- msg->component = component_name;
- ep_msg_send(msg);
- ep_msg_free(msg);
-}
-
-/**
- * e_passwords_remember_password:
- * @key: the key
- *
- * Saves the password associated with @key to disk.
- **/
-void
-e_passwords_remember_password (const char *component_name, const char *key)
-{
- EPassMsg *msg;
-
- g_return_if_fail(component_name != NULL);
- g_return_if_fail(key != NULL);
-
- msg = ep_msg_new(ep_remember_password);
-
- msg->component = component_name;
- msg->key = key;
-
- ep_msg_send(msg);
- ep_msg_free(msg);
-}
-
-/**
- * e_passwords_forget_password:
- * @key: the key
- *
- * Forgets the password associated with @key, in memory and on disk.
- **/
-void
-e_passwords_forget_password (const char *component_name, const char *key)
-{
- EPassMsg *msg;
-
- g_return_if_fail(component_name != NULL);
- g_return_if_fail(key != NULL);
-
- msg = ep_msg_new(ep_forget_password);
-
- msg->component = component_name;
- msg->key = key;
-
- ep_msg_send(msg);
- ep_msg_free(msg);
-}
-
-/**
- * e_passwords_get_password:
- * @key: the key
- *
- * Return value: the password associated with @key, or %NULL. Caller
- * must free the returned password.
- **/
-char *
-e_passwords_get_password (const char *component_name, const char *key)
-{
- EPassMsg *msg;
- char *passwd;
-
- g_return_val_if_fail(component_name != NULL, NULL);
- g_return_val_if_fail(key != NULL, NULL);
-
- msg = ep_msg_new(ep_get_password);
-
- msg->component = component_name;
- msg->key = key;
-
- ep_msg_send(msg);
-
- passwd = msg->password;
- msg->password = NULL;
- ep_msg_free(msg);
-
- return passwd;
-}
-
-/**
- * e_passwords_add_password:
- * @key: a key
- * @passwd: the password for @key
- *
- * This stores the @key/@passwd pair in the current session's password
- * hash.
- **/
-void
-e_passwords_add_password (const char *key, const char *passwd)
-{
- EPassMsg *msg;
-
- g_return_if_fail(key != NULL);
- g_return_if_fail(passwd != NULL);
-
- msg = ep_msg_new(ep_add_password);
- msg->key = key;
- msg->oldpass = passwd;
-
- ep_msg_send(msg);
- ep_msg_free(msg);
-}
-
-/**
- * e_passwords_ask_password:
- * @title: title for the password dialog
- * @component_name: the name of the component for which we're storing
- * the password (e.g. Mail, Addressbook, etc.)
- * @key: key to store the password under
- * @prompt: prompt string
- * @secret: whether or not the password text should be ***ed out
- * @remember_type: whether or not to offer to remember the password,
- * and for how long.
- * @remember: on input, the default state of the remember checkbox.
- * on output, the state of the checkbox when the dialog was closed.
- * @parent: parent window of the dialog, or %NULL
- *
- * Asks the user for a password.
- *
- * Return value: the password, which the caller must free, or %NULL if
- * the user cancelled the operation. *@remember will be set if the
- * return value is non-%NULL and @remember_type is not
- * E_PASSWORDS_DO_NOT_REMEMBER.
- **/
-char *
-e_passwords_ask_password (const char *title, const char *component_name,
- const char *key,
- const char *prompt,
- EPasswordsRememberType type,
- gboolean *remember,
- GtkWindow *parent)
-{
- char *passwd;
- EPassMsg *msg = ep_msg_new(ep_ask_password);
-
- if ((type & E_PASSWORDS_ONLINE) && !ep_online_state)
- return NULL;
-
- msg->title = title;
- msg->component = component_name;
- msg->key = key;
- msg->prompt = prompt;
- msg->flags = type;
- msg->remember = remember;
- msg->parent = parent;
-
- ep_msg_send(msg);
- passwd = msg->password;
- msg->password = NULL;
- ep_msg_free(msg);
-
- return passwd;
-}
-
-
-
-static char *base64_alphabet =
-"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-static unsigned char camel_mime_base64_rank[256] = {
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255, 62,255,255,255, 63,
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,255,255,255, 0,255,255,
- 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,255,255,255,255,255,
- 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-};
-
-/* call this when finished encoding everything, to
- flush off the last little bit */
-static int
-base64_encode_close(unsigned char *in, int inlen, gboolean break_lines, unsigned char *out, int *state, int *save)
-{
- int c1, c2;
- unsigned char *outptr = out;
-
- if (inlen>0)
- outptr += base64_encode_step(in, inlen, break_lines, outptr, state, save);
-
- c1 = ((unsigned char *)save)[1];
- c2 = ((unsigned char *)save)[2];
-
- switch (((char *)save)[0]) {
- case 2:
- outptr[2] = base64_alphabet[ ( (c2 &0x0f) << 2 ) ];
- g_assert(outptr[2] != 0);
- goto skip;
- case 1:
- outptr[2] = '=';
- skip:
- outptr[0] = base64_alphabet[ c1 >> 2 ];
- outptr[1] = base64_alphabet[ c2 >> 4 | ( (c1&0x3) << 4 )];
- outptr[3] = '=';
- outptr += 4;
- break;
- }
- if (break_lines)
- *outptr++ = '\n';
-
- *save = 0;
- *state = 0;
-
- return outptr-out;
-}
-
-/*
- performs an 'encode step', only encodes blocks of 3 characters to the
- output at a time, saves left-over state in state and save (initialise to
- 0 on first invocation).
-*/
-static int
-base64_encode_step(unsigned char *in, int len, gboolean break_lines, unsigned char *out, int *state, int *save)
-{
- register unsigned char *inptr, *outptr;
-
- if (len<=0)
- return 0;
-
- inptr = in;
- outptr = out;
-
- if (len + ((char *)save)[0] > 2) {
- unsigned char *inend = in+len-2;
- register int c1, c2, c3;
- register int already;
-
- already = *state;
-
- switch (((char *)save)[0]) {
- case 1: c1 = ((unsigned char *)save)[1]; goto skip1;
- case 2: c1 = ((unsigned char *)save)[1];
- c2 = ((unsigned char *)save)[2]; goto skip2;
- }
-
- /* yes, we jump into the loop, no i'm not going to change it, it's beautiful! */
- while (inptr < inend) {
- c1 = *inptr++;
- skip1:
- c2 = *inptr++;
- skip2:
- c3 = *inptr++;
- *outptr++ = base64_alphabet[ c1 >> 2 ];
- *outptr++ = base64_alphabet[ c2 >> 4 | ( (c1&0x3) << 4 ) ];
- *outptr++ = base64_alphabet[ ( (c2 &0x0f) << 2 ) | (c3 >> 6) ];
- *outptr++ = base64_alphabet[ c3 & 0x3f ];
- /* this is a bit ugly ... */
- if (break_lines && (++already)>=19) {
- *outptr++='\n';
- already = 0;
- }
- }
-
- ((char *)save)[0] = 0;
- len = 2-(inptr-inend);
- *state = already;
- }
-
- if (len>0) {
- register char *saveout;
-
- /* points to the slot for the next char to save */
- saveout = & (((char *)save)[1]) + ((char *)save)[0];
-
- /* len can only be 0 1 or 2 */
- switch(len) {
- case 2: *saveout++ = *inptr++;
- case 1: *saveout++ = *inptr++;
- }
- ((char *)save)[0]+=len;
- }
-
- return outptr-out;
-}
-
-
-/**
- * base64_decode_step: decode a chunk of base64 encoded data
- * @in: input stream
- * @len: max length of data to decode
- * @out: output stream
- * @state: holds the number of bits that are stored in @save
- * @save: leftover bits that have not yet been decoded
- *
- * Decodes a chunk of base64 encoded data
- **/
-static int
-base64_decode_step(unsigned char *in, int len, unsigned char *out, int *state, unsigned int *save)
-{
- register unsigned char *inptr, *outptr;
- unsigned char *inend, c;
- register unsigned int v;
- int i;
-
- inend = in+len;
- outptr = out;
-
- /* convert 4 base64 bytes to 3 normal bytes */
- v=*save;
- i=*state;
- inptr = in;
- while (inptr<inend) {
- c = camel_mime_base64_rank[*inptr++];
- if (c != 0xff) {
- v = (v<<6) | c;
- i++;
- if (i==4) {
- *outptr++ = v>>16;
- *outptr++ = v>>8;
- *outptr++ = v;
- i=0;
- }
- }
- }
-
- *save = v;
- *state = i;
-
- /* quick scan back for '=' on the end somewhere */
- /* fortunately we can drop 1 output char for each trailing = (upto 2) */
- i=2;
- while (inptr>in && i) {
- inptr--;
- if (camel_mime_base64_rank[*inptr] != 0xff) {
- if (*inptr == '=')
- outptr--;
- i--;
- }
- }
-
- /* if i!= 0 then there is a truncation error! */
- return outptr-out;
-}
-
-static char *
-decode_base64 (char *base64)
-{
- char *plain, *pad = "==";
- int len, out, state, save;
-
- len = strlen (base64);
- plain = g_malloc0 (len);
- state = save = 0;
- out = base64_decode_step (base64, len, plain, &state, &save);
- if (len % 4) {
- base64_decode_step (pad, 4 - len % 4, plain + out,
- &state, &save);
- }
-
- return plain;
-}
diff --git a/e-util/e-passwords.h b/e-util/e-passwords.h
deleted file mode 100644
index 2bed97f95d..0000000000
--- a/e-util/e-passwords.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * e-passwords.h
- *
- * Copyright (C) 2001 Ximian, Inc.
- */
-
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA.
- */
-
-#ifndef _E_PASSWORD_H_
-#define _E_PASSWORD_H_
-
-#include <glib.h>
-#include <gtk/gtkwindow.h>
-
-G_BEGIN_DECLS
-
-/*
- initialization is now implicit when you call any of the functions
- below, although this is only correct if the functions are called
- from the main thread.
-
- e_passwords_shutdown should be called at exit time to synch the
- password on-disk storage, and to free up in-memory storage. */
-void e_passwords_init (void);
-
-void e_passwords_shutdown (void);
-void e_passwords_cancel(void);
-void e_passwords_set_online(int state);
-void e_passwords_remember_password (const char *component, const char *key);
-void e_passwords_add_password (const char *key, const char *passwd);
-char *e_passwords_get_password (const char *component, const char *key);
-void e_passwords_forget_password (const char *component, const char *key);
-void e_passwords_forget_passwords (void);
-void e_passwords_clear_passwords (const char *component);
-
-typedef enum {
- E_PASSWORDS_REMEMBER_NEVER,
- E_PASSWORDS_REMEMBER_SESSION,
- E_PASSWORDS_REMEMBER_FOREVER,
- E_PASSWORDS_REMEMBER_MASK = 0xf,
-
- /* option bits */
- E_PASSWORDS_SECRET = 1<<8,
- E_PASSWORDS_REPROMPT = 1<<9,
- E_PASSWORDS_ONLINE = 1<<10, /* only ask if we're online */
-} EPasswordsRememberType;
-
-char * e_passwords_ask_password (const char *title,
- const char*component_name, const char *key,
- const char *prompt,
- EPasswordsRememberType remember_type,
- gboolean *remember,
- GtkWindow *parent);
-
-G_END_DECLS
-
-#endif /* _E_PASSWORD_H_ */
diff --git a/e-util/e-pilot-map.c b/e-util/e-pilot-map.c
deleted file mode 100644
index e155657732..0000000000
--- a/e-util/e-pilot-map.c
+++ /dev/null
@@ -1,448 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution Conduits - Pilot Map routines
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include "e-pilot-map.h"
-
-#include <string.h> /* memset(), strcmp() */
-#include <stdlib.h>
-#include <glib.h>
-#include <libxml/parser.h>
-
-typedef struct
-{
- char *uid;
- gboolean archived;
- gboolean touched;
-} EPilotMapPidNode;
-
-typedef struct
-{
- guint32 pid;
- gboolean archived;
- gboolean touched;
-} EPilotMapUidNode;
-
-typedef struct
-{
- gboolean touched_only;
- xmlNodePtr root;
-} EPilotMapWriteData;
-
-static void
-real_e_pilot_map_insert (EPilotMap *map, guint32 pid, const char *uid, gboolean archived, gboolean touch)
-{
- char *new_uid;
- guint32 *new_pid;
- EPilotMapPidNode *pnode;
- EPilotMapUidNode *unode;
-
- g_return_if_fail (map != NULL);
- g_return_if_fail (uid != NULL);
-
- /* Keys */
- if (pid != 0) {
- new_pid = g_new (guint32, 1);
- *new_pid = pid;
- }
- new_uid = g_strdup (uid);
-
- /* Values */
- if (pid != 0) {
- pnode = g_new0 (EPilotMapPidNode, 1);
- pnode->uid = new_uid;
- pnode->archived = archived;
- if (touch)
- pnode->touched = TRUE;
- }
-
- unode = g_new0 (EPilotMapUidNode, 1);
- unode->pid = pid;
- unode->archived = archived;
- if (touch)
- unode->touched = TRUE;
-
- /* Insertion */
- if (pid != 0)
- g_hash_table_insert (map->pid_map, new_pid, pnode);
- g_hash_table_insert (map->uid_map, new_uid, unode);
-}
-
-static void
-map_set_node_timet (xmlNodePtr node, const char *name, time_t t)
-{
- char *tstring;
-
- tstring = g_strdup_printf ("%ld", t);
- xmlSetProp (node, name, tstring);
- g_free (tstring);
-}
-
-static void
-map_sax_start_element (void *data, const xmlChar *name,
- const xmlChar **attrs)
-{
- EPilotMap *map = (EPilotMap *)data;
-
- if (!strcmp (name, "PilotMap")) {
- while (attrs && *attrs != NULL) {
- const xmlChar **val = attrs;
-
- val++;
- if (!strcmp (*attrs, "timestamp"))
- map->since = (time_t)strtoul (*val, NULL, 0);
-
- attrs = ++val;
- }
- }
-
- if (!strcmp (name, "map")) {
- const char *uid = NULL;
- guint32 pid = 0;
- gboolean archived = FALSE;
-
- while (attrs && *attrs != NULL) {
- const xmlChar **val = attrs;
-
- val++;
- if (!strcmp (*attrs, "uid"))
- uid = *val;
-
- if (!strcmp (*attrs, "pilot_id"))
- pid = strtoul (*val, NULL, 0);
-
- if (!strcmp (*attrs, "archived"))
- archived = strtoul (*val, NULL, 0)== 1 ? TRUE : FALSE;
-
- attrs = ++val;
- }
-
- g_assert (uid != NULL);
- g_assert (pid != 0 || archived);
-
- real_e_pilot_map_insert (map, pid, uid, archived, FALSE);
- }
-}
-
-static void
-map_write_foreach (gpointer key, gpointer value, gpointer data)
-{
- EPilotMapWriteData *wd = data;
- xmlNodePtr root = wd->root;
- char *uid = key;
- EPilotMapUidNode *unode = value;
- xmlNodePtr mnode;
-
- if (wd->touched_only && !unode->touched)
- return;
-
- mnode = xmlNewChild (root, NULL, "map", NULL);
- xmlSetProp (mnode, "uid", uid);
-
- if (unode->archived) {
- xmlSetProp (mnode, "archived", "1");
- } else {
- char *pidstr;
-
- pidstr = g_strdup_printf ("%d", unode->pid);
- xmlSetProp (mnode, "pilot_id", pidstr);
- g_free (pidstr);
- xmlSetProp (mnode, "archived", "0");
- }
-}
-
-gboolean
-e_pilot_map_pid_is_archived (EPilotMap *map, guint32 pid)
-{
- EPilotMapPidNode *pnode;
-
- g_return_val_if_fail (map != NULL, FALSE);
-
- pnode = g_hash_table_lookup (map->pid_map, &pid);
-
- if (pnode == NULL)
- return FALSE;
-
- return pnode->archived;
-}
-
-gboolean
-e_pilot_map_uid_is_archived (EPilotMap *map, const char *uid)
-{
- EPilotMapUidNode *unode;
-
- g_return_val_if_fail (map != NULL, FALSE);
- g_return_val_if_fail (uid != NULL, FALSE);
-
- unode = g_hash_table_lookup (map->uid_map, uid);
-
- if (unode == NULL)
- return FALSE;
-
- return unode->archived;
-}
-
-void
-e_pilot_map_insert (EPilotMap *map, guint32 pid, const char *uid, gboolean archived)
-{
- gpointer key, value;
-
- if (g_hash_table_lookup_extended (map->pid_map, &pid, &key, &value)) {
- EPilotMapPidNode *pnode = value;
- gpointer other_key, other_value;
-
- g_hash_table_remove (map->pid_map, &pid);
-
- /* In case the pid<->uid mapping is not the same anymore */
- if (g_hash_table_lookup_extended (map->uid_map, pnode->uid, &other_key, &other_value)) {
- g_hash_table_remove (map->uid_map, pnode->uid);
- g_free (other_key);
- g_free (other_value);
- }
-
- g_free (key);
- g_free (value);
- }
- if (g_hash_table_lookup_extended (map->uid_map, uid, &key, &value)) {
- EPilotMapUidNode *unode = value;
- gpointer other_key, other_value;
-
- g_hash_table_remove (map->uid_map, uid);
-
- /* In case the pid<->uid mapping is not the same anymore */
- if (g_hash_table_lookup_extended (map->pid_map, &unode->pid, &other_key, &other_value)) {
- g_hash_table_remove (map->pid_map, &unode->pid);
- g_free (other_key);
- g_free (other_value);
- }
-
- g_free (key);
- g_free (value);
- }
-
- real_e_pilot_map_insert (map, pid, uid, archived, TRUE);
-}
-
-void
-e_pilot_map_remove_by_pid (EPilotMap *map, guint32 pid)
-{
- EPilotMapPidNode *pnode = NULL;
- EPilotMapUidNode *unode = NULL;
- gpointer pkey, ukey;
-
- g_return_if_fail (map != NULL);
-
- if (!g_hash_table_lookup_extended (map->pid_map, &pid,
- &pkey, (gpointer *)&pnode))
- return;
-
- g_hash_table_lookup_extended (map->uid_map, pnode->uid, &ukey,
- (gpointer *)&unode);
- g_assert (unode != NULL);
-
- g_hash_table_remove (map->pid_map, &pid);
- g_hash_table_remove (map->uid_map, pnode->uid);
-
- g_free (pkey);
- g_free (ukey);
- g_free (pnode);
- g_free (unode);
-}
-
-void
-e_pilot_map_remove_by_uid (EPilotMap *map, const char *uid)
-{
- EPilotMapPidNode *pnode = NULL;
- EPilotMapUidNode *unode = NULL;
- gpointer pkey, ukey;
-
- g_return_if_fail (map != NULL);
- g_return_if_fail (uid != NULL);
-
- if (!g_hash_table_lookup_extended (map->uid_map, uid, &ukey, (gpointer *)&unode))
- return;
-
- g_hash_table_lookup_extended (map->pid_map, &unode->pid, &pkey, (gpointer *)&pnode);
-
- g_hash_table_remove (map->uid_map, uid);
- g_hash_table_remove (map->pid_map, &unode->pid);
-
- if (unode->pid != 0)
- g_free (pkey);
- g_free (ukey);
-
- if (unode->pid != 0)
- g_free (pnode);
- g_free (unode);
-}
-
-
-guint32
-e_pilot_map_lookup_pid (EPilotMap *map, const char *uid, gboolean touch)
-{
- EPilotMapUidNode *unode = NULL;
-
- g_return_val_if_fail (map != NULL, 0);
- g_return_val_if_fail (uid != NULL, 0);
-
- unode = g_hash_table_lookup (map->uid_map, uid);
-
- if (unode == NULL)
- return 0;
-
- if (touch) {
- EPilotMapPidNode *pnode = NULL;
-
- pnode = g_hash_table_lookup (map->pid_map, &unode->pid);
- if (pnode != NULL)
- pnode->touched = TRUE;
- unode->touched = TRUE;
- }
-
- return unode->pid;
-}
-
-const char *
-e_pilot_map_lookup_uid (EPilotMap *map, guint32 pid, gboolean touch)
-{
- EPilotMapPidNode *pnode = NULL;
-
- g_return_val_if_fail (map != NULL, NULL);
-
- pnode = g_hash_table_lookup (map->pid_map, &pid);
-
- if (pnode == NULL)
- return NULL;
-
- if (touch) {
- EPilotMapUidNode *unode = NULL;
-
- unode = g_hash_table_lookup (map->uid_map, pnode->uid);
- g_assert (unode != NULL);
-
- unode->touched = TRUE;
- pnode->touched = TRUE;
- }
-
- return pnode->uid;
-}
-
-int
-e_pilot_map_read (const char *filename, EPilotMap **map)
-{
- xmlSAXHandler handler;
- EPilotMap *new_map;
-
- g_return_val_if_fail (filename != NULL, -1);
- g_return_val_if_fail (map != NULL, -1);
-
- *map = NULL;
- new_map = g_new0 (EPilotMap, 1);
-
- memset (&handler, 0, sizeof (xmlSAXHandler));
- handler.startElement = map_sax_start_element;
-
- new_map->pid_map = g_hash_table_new (g_int_hash, g_int_equal);
- new_map->uid_map = g_hash_table_new (g_str_hash, g_str_equal);
-
- if (g_file_test (filename, G_FILE_TEST_EXISTS)) {
- if (xmlSAXUserParseFile (&handler, new_map, filename) < 0) {
- g_free (new_map);
- return -1;
- }
- }
-
- new_map->write_touched_only = FALSE;
-
- *map = new_map;
-
- return 0;
-}
-
-int
-e_pilot_map_write (const char *filename, EPilotMap *map)
-{
- EPilotMapWriteData wd;
- xmlDocPtr doc;
- int ret;
-
- g_return_val_if_fail (filename != NULL, -1);
- g_return_val_if_fail (map != NULL, -1);
-
- doc = xmlNewDoc ("1.0");
- if (doc == NULL) {
- g_warning ("Pilot map file could not be created\n");
- return -1;
- }
- xmlDocSetRootElement (doc, xmlNewDocNode(doc, NULL, "PilotMap", NULL));
- map->since = time (NULL);
- map_set_node_timet (xmlDocGetRootElement (doc), "timestamp", map->since);
-
- wd.touched_only = map->write_touched_only;
- wd.root = xmlDocGetRootElement(doc);
- g_hash_table_foreach (map->uid_map, map_write_foreach, &wd);
-
- /* Write the file */
- xmlSetDocCompressMode (doc, 0);
- ret = xmlSaveFile (filename, doc);
- if (ret < 0) {
- g_warning ("Pilot map file '%s' could not be saved\n", filename);
- return -1;
- }
-
- xmlFreeDoc (doc);
-
- return 0;
-}
-
-static gboolean
-foreach_remove (gpointer key, gpointer value, gpointer data)
-{
- g_free (key);
- g_free (value);
-
- return TRUE;
-}
-
-void
-e_pilot_map_clear (EPilotMap *map)
-{
- g_return_if_fail (map != NULL);
-
- g_hash_table_foreach_remove (map->pid_map, foreach_remove, NULL);
- g_hash_table_foreach_remove (map->uid_map, foreach_remove, NULL);
-
- map->since = 0;
- map->write_touched_only = FALSE;
-}
-
-void
-e_pilot_map_destroy (EPilotMap *map)
-{
- g_return_if_fail (map != NULL);
-
- g_hash_table_foreach_remove (map->pid_map, foreach_remove, NULL);
- g_hash_table_foreach_remove (map->uid_map, foreach_remove, NULL);
-
- g_hash_table_destroy (map->pid_map);
- g_hash_table_destroy (map->uid_map);
- g_free (map);
-}
diff --git a/e-util/e-pilot-map.h b/e-util/e-pilot-map.h
deleted file mode 100644
index ff02994645..0000000000
--- a/e-util/e-pilot-map.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution Conduits - Pilot Map routines
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef E_PILOT_MAP_H
-#define E_PILOT_MAP_H
-
-#include <glib.h>
-#include <time.h>
-
-typedef struct _EPilotMap EPilotMap;
-
-struct _EPilotMap
-{
- GHashTable *pid_map;
- GHashTable *uid_map;
-
- time_t since;
-
- gboolean write_touched_only;
-};
-
-gboolean e_pilot_map_pid_is_archived (EPilotMap *map, guint32 pid);
-gboolean e_pilot_map_uid_is_archived (EPilotMap *map, const char *uid);
-
-void e_pilot_map_insert (EPilotMap *map, guint32 pid, const char *uid, gboolean archived);
-void e_pilot_map_remove_by_pid (EPilotMap *map, guint32 pid);
-void e_pilot_map_remove_by_uid (EPilotMap *map, const char *uid);
-
-guint32 e_pilot_map_lookup_pid (EPilotMap *map, const char *uid, gboolean touch);
-const char * e_pilot_map_lookup_uid (EPilotMap *map, guint32 pid, gboolean touch);
-
-int e_pilot_map_read (const char *filename, EPilotMap **map);
-int e_pilot_map_write (const char *filename, EPilotMap *map);
-
-void e_pilot_map_clear (EPilotMap *map);
-
-void e_pilot_map_destroy (EPilotMap *map);
-
-#endif /* E_PILOT_MAP_H */
diff --git a/e-util/e-pilot-util.c b/e-util/e-pilot-util.c
deleted file mode 100644
index 7d82ef290b..0000000000
--- a/e-util/e-pilot-util.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution Conduits - Pilot Map routines
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <string.h>
-#include <stdlib.h>
-#include <time.h>
-#include <libxml/parser.h>
-#include <pi-util.h>
-
-#include "e-pilot-util.h"
-
-char *
-e_pilot_utf8_to_pchar (const char *string)
-{
- char *pstring = NULL;
- int res;
-
- if (!string)
- return NULL;
-
- res = convert_ToPilotChar ("UTF-8", string, strlen (string), &pstring);
-
- if (res != 0)
- pstring = strdup (string);
-
- return pstring;
-}
-
-char *
-e_pilot_utf8_from_pchar (const char *string)
-{
- char *ustring = NULL;
- int res;
-
- if (!string)
- return NULL;
-
- res = convert_FromPilotChar ("UTF-8", string, strlen (string), &ustring);
-
- if (res != 0)
- ustring = strdup (string);
-
- return ustring;
-}
-
-ESource *
-e_pilot_get_sync_source (ESourceList *source_list)
-{
- GSList *g;
-
- g_return_val_if_fail (source_list != NULL, NULL);
- g_return_val_if_fail (E_IS_SOURCE_LIST (source_list), NULL);
-
- for (g = e_source_list_peek_groups (source_list); g; g = g->next) {
- ESourceGroup *group = E_SOURCE_GROUP (g->data);
- GSList *s;
-
- for (s = e_source_group_peek_sources (group); s; s = s->next) {
- ESource *source = E_SOURCE (s->data);
-
- if (e_source_get_property (source, "pilot-sync"))
- return source;
- }
- }
-
- return NULL;
-}
-
-void
-e_pilot_set_sync_source (ESourceList *source_list, ESource *source)
-{
- GSList *g;
-
- g_return_if_fail (source_list != NULL);
- g_return_if_fail (E_IS_SOURCE_LIST (source_list));
-
- for (g = e_source_list_peek_groups (source_list); g; g = g->next) {
- GSList *s;
- for (s = e_source_group_peek_sources (E_SOURCE_GROUP (g->data));
- s; s = s->next) {
- e_source_set_property (E_SOURCE (s->data), "pilot-sync", NULL);
- }
- }
-
- if (source)
- e_source_set_property (source, "pilot-sync", "true");
- e_source_list_sync (source_list, NULL);
-}
diff --git a/e-util/e-pilot-util.h b/e-util/e-pilot-util.h
deleted file mode 100644
index 7953536a5b..0000000000
--- a/e-util/e-pilot-util.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* Evolution Conduits - Pilot Map routines
- *
- * Copyright (C) 2000 Ximian, Inc.
- *
- * Authors: JP Rosevear <jpr@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <libedataserver/e-source-list.h>
-#include <libedataserver/e-source.h>
-
-#ifndef E_PILOT_UTIL_H
-#define E_PILOT_UTIL_H
-
-char *e_pilot_utf8_to_pchar (const char *string);
-char *e_pilot_utf8_from_pchar (const char *string);
-
-ESource *e_pilot_get_sync_source (ESourceList *source_list);
-void e_pilot_set_sync_source (ESourceList *source_list, ESource *source);
-
-
-#endif /* E_PILOT_UTIL_H */
diff --git a/e-util/e-plugin-mono.c b/e-util/e-plugin-mono.c
deleted file mode 100644
index 9b7c39a3f9..0000000000
--- a/e-util/e-plugin-mono.c
+++ /dev/null
@@ -1,198 +0,0 @@
-
-#include <sys/types.h>
-#include <dirent.h>
-#include <string.h>
-
-#include "e-plugin-mono.h"
-
-#include <mono/metadata/debug-helpers.h>
-#include <mono/metadata/object.h>
-#include <mono/metadata/appdomain.h>
-#include <mono/metadata/assembly.h>
-#include <mono/jit/jit.h>
-
-static MonoDomain *domain;
-
-/* ********************************************************************** */
-static void *epm_parent_class;
-
-typedef struct _EPluginMonoPrivate {
- MonoAssembly *assembly;
- MonoClass *klass;
- MonoObject *plugin;
- GHashTable *methods;
-} EPluginMonoPrivate;
-
-#define epm ((EPluginMono *)ep)
-
-static char *
-get_xml_prop(xmlNodePtr node, const char *id)
-{
- char *p = xmlGetProp(node, id);
- char *out = NULL;
-
- if (p) {
- out = g_strdup(p);
- xmlFree(p);
- }
-
- return out;
-}
-
-/*
- Two approaches:
- You can have a Evolution.Plugin implementation which has every callback as methods on it.
- Or you can just use static methods for everything.
-
- All methods take a single (structured) argument.
-*/
-
-static void *
-epm_invoke(EPlugin *ep, const char *name, void *data)
-{
- EPluginMonoPrivate *p = epm->priv;
- MonoMethodDesc *d;
- MonoMethod *m;
- MonoObject *x = NULL, *res;
- void **params;
-
- /* we need to do this every time since we may be called from any thread for some uses */
- mono_thread_attach(domain);
-
- if (p->assembly == NULL) {
- p->assembly = mono_domain_assembly_open(domain, epm->location);
- if (p->assembly == NULL) {
- g_warning("can't load assembly '%s'", epm->location);
- return NULL;
- }
-
- if (epm->handler == NULL
- || (p->klass = mono_class_from_name(mono_assembly_get_image(p->assembly), "", epm->handler)) == NULL) {
- printf("Using static callbacks only");
- } else {
- p->plugin = mono_object_new(domain, p->klass);
- /* could conceivably init with some context too */
- mono_runtime_object_init(p->plugin);
- }
- }
-
- m = g_hash_table_lookup(p->methods, name);
- if (m == NULL) {
- if (p->klass) {
- printf("looking up method '%s' in class\n", name);
- /* class method */
- d = mono_method_desc_new(name, FALSE);
- if (d == NULL) {
- g_warning("Can't create method descriptor for '%s'", name);
- return NULL;
- }
-
- m = mono_method_desc_search_in_class(d, p->klass);
- if (m == NULL) {
- g_warning("Can't find method callback '%s'", name);
- return NULL;
- }
- } else {
- printf("looking up static method '%s'\n", name);
- /* static method */
- d = mono_method_desc_new(name, FALSE);
- if (d == NULL) {
- g_warning("Can't create method descriptor for '%s'", name);
- return NULL;
- }
-
- m = mono_method_desc_search_in_image(d, mono_assembly_get_image(p->assembly));
- if (m == NULL) {
- g_warning("Can't find method callback '%s'", name);
- return NULL;
- }
- }
-
- g_hash_table_insert(p->methods, g_strdup(name), m);
- }
-
- params = g_malloc0(sizeof(*params)*1);
- params[0] = &data;
- res = mono_runtime_invoke(m, p->plugin, params, &x);
- /* do i need to free params?? */
-
- if (x)
- mono_print_unhandled_exception(x);
-
- if (res) {
- void **p = mono_object_unbox(res);
- printf("mono method returned '%p' %ld\n", *p, (long int)*p);
- return *p;
- } else
- return NULL;
-}
-
-static int
-epm_construct(EPlugin *ep, xmlNodePtr root)
-{
- if (((EPluginClass *)epm_parent_class)->construct(ep, root) == -1)
- return -1;
-
- epm->location = get_xml_prop(root, "location");
- epm->handler = get_xml_prop(root, "handler");
-
- if (epm->location == NULL)
- return -1;
-
- return 0;
-}
-
-static void
-epm_finalise(GObject *o)
-{
- EPlugin *ep = (EPlugin *)o;
- EPluginMonoPrivate *p = epm->priv;
-
- g_free(epm->location);
- g_free(epm->handler);
-
- g_hash_table_foreach(p->methods, (GHFunc)g_free, NULL);
- g_hash_table_destroy(p->methods);
-
- g_free(epm->priv);
-
- ((GObjectClass *)epm_parent_class)->finalize(o);
-}
-
-static void
-epm_class_init(EPluginClass *klass)
-{
- ((GObjectClass *)klass)->finalize = epm_finalise;
- klass->construct = epm_construct;
- klass->invoke = epm_invoke;
- klass->type = "mono";
-}
-
-static void
-epm_init(GObject *o)
-{
- EPlugin *ep = (EPlugin *)o;
-
- epm->priv = g_malloc0(sizeof(*epm->priv));
- epm->priv->methods = g_hash_table_new(g_str_hash, g_str_equal);
-}
-
-GType
-e_plugin_mono_get_type(void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof(EPluginMonoClass), NULL, NULL, (GClassInitFunc) epm_class_init, NULL, NULL,
- sizeof(EPluginMono), 0, (GInstanceInitFunc) epm_init,
- };
-
- epm_parent_class = g_type_class_ref(e_plugin_get_type());
- type = g_type_register_static(e_plugin_get_type(), "EPluginMono", &info, 0);
- domain = mono_jit_init("Evolution");
- mono_thread_attach(domain);
- }
-
- return type;
-}
diff --git a/e-util/e-plugin-mono.h b/e-util/e-plugin-mono.h
deleted file mode 100644
index 4c49edf71c..0000000000
--- a/e-util/e-plugin-mono.h
+++ /dev/null
@@ -1,27 +0,0 @@
-
-#ifndef _E_PLUGIN_MONO_H
-#define _E_PLUGIN_MONO_H
-
-#include "e-plugin.h"
-
-/* ********************************************************************** */
-
-typedef struct _EPluginMono EPluginMono;
-typedef struct _EPluginMonoClass EPluginMonoClass;
-
-struct _EPluginMono {
- EPlugin plugin;
-
- struct _EPluginMonoPrivate *priv;
-
- char *location; /* location */
- char *handler; /* handler class */
-};
-
-struct _EPluginMonoClass {
- EPluginClass plugin_class;
-};
-
-GType e_plugin_mono_get_type(void);
-
-#endif /* ! _E_PLUGIN_MONO_H */
diff --git a/e-util/e-plugin.c b/e-util/e-plugin.c
deleted file mode 100644
index d7320ab2cf..0000000000
--- a/e-util/e-plugin.c
+++ /dev/null
@@ -1,1165 +0,0 @@
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <sys/types.h>
-#include <dirent.h>
-#include <string.h>
-
-#include <glib/gi18n.h>
-#include <gconf/gconf-client.h>
-
-#include "e-plugin.h"
-#include "libedataserver/e-msgport.h"
-
-/* plugin debug */
-#define pd(x)
-/* plugin hook debug */
-#define phd(x)
-
-/*
-<camel-plugin
- class="org.gnome.camel.plugin.provider:1.0"
- id="org.gnome.camel.provider.imap:1.0"
- type="shlib"
- location="/opt/gnome2/lib/camel/1.0/libcamelimap.so"
- factory="camel_imap_provider_new">
- <name>imap</name>
- <description>IMAP4 and IMAP4v1 mail store</description>
- <class-data class="org.gnome.camel.plugin.provider:1.0"
- protocol="imap"
- domain="mail"
- flags="remote,source,storage,ssl"/>
-</camel-plugin>
-
-<camel-plugin
- class="org.gnome.camel.plugin.sasl:1.0"
- id="org.gnome.camel.sasl.plain:1.0"
- type="shlib"
- location="/opt/gnome2/lib/camel/1.0/libcamelsasl.so"
- factory="camel_sasl_plain_new">
- <name>PLAIN</name>
- <description>SASL PLAIN authentication mechanism</description>
-</camel-plugin>
-*/
-
-/* EPlugin stuff */
-static GObjectClass *ep_parent_class;
-
-/* global table of plugin types by pluginclass.type */
-static GHashTable *ep_types;
-/* plugin load path */
-static GSList *ep_path;
-/* global table of plugins by plugin.id */
-static GHashTable *ep_plugins;
-/* a table of GSLists of plugins by hook class for hooks not loadable yet */
-static GHashTable *ep_plugins_pending;
-/* list of all cached xml docs:struct _plugin_doc's */
-static EDList ep_plugin_docs = E_DLIST_INITIALISER(ep_plugin_docs);
-/* gconf client */
-static GConfClient *ep_gconf;
-/* the list of disabled plugins from gconf */
-static GSList *ep_disabled;
-
-/* EPluginHook stuff */
-static void *eph_parent_class;
-/* All classes which implement EPluginHooks, by class.id */
-static GHashTable *eph_types;
-
-struct _plugin_doc {
- struct _plugin_doc *next;
- struct _plugin_doc *prev;
-
- xmlDocPtr doc;
- GSList *plugins;
-};
-
-static gboolean
-ep_check_enabled(const char *id)
-{
- GSList *l = ep_disabled;
-
- for (;l;l = g_slist_next(l))
- if (!strcmp((char *)l->data, id))
- return FALSE;
-
- return TRUE;
-}
-
-static void
-ep_set_enabled(const char *id, int state)
-{
- if ((state == 0) == ep_check_enabled(id) == 0)
- return;
-
- if (state) {
- GSList *l = ep_disabled;
-
- while (l) {
- GSList *n = l->next;
-
- if (!strcmp((char *)l->data, id)) {
- g_free(l->data);
- ep_disabled = g_slist_remove_link(ep_disabled, l);
- }
- l = n;
- }
- } else {
- ep_disabled = g_slist_prepend(ep_disabled, g_strdup(id));
- }
-
- gconf_client_set_list(ep_gconf, "/apps/evolution/eplugin/disabled", GCONF_VALUE_STRING, ep_disabled, NULL);
-}
-
-static int
-ep_construct(EPlugin *ep, xmlNodePtr root)
-{
- xmlNodePtr node;
- int res = -1;
- char *localedir;
-
- ep->domain = e_plugin_xml_prop(root, "domain");
- if (ep->domain
- && (localedir = e_plugin_xml_prop(root, "localedir"))) {
- bindtextdomain(ep->domain, localedir);
- g_free(localedir);
- }
-
- ep->name = e_plugin_xml_prop_domain(root, "name", ep->domain);
-
- pd(printf("creating plugin '%s' '%s'\n", ep->name?ep->name:"un-named", ep->id));
-
- node = root->children;
- while (node) {
- if (strcmp(node->name, "hook") == 0) {
- struct _EPluginHook *hook;
- EPluginHookClass *type;
- char *class = e_plugin_xml_prop(node, "class");
-
- if (class == NULL) {
- g_warning("Plugin '%s' load failed in '%s', missing class property for hook", ep->id, ep->path);
- goto fail;
- }
-
- if (ep->enabled
- && eph_types != NULL
- && (type = g_hash_table_lookup(eph_types, class)) != NULL) {
- g_free(class);
- hook = g_object_new(G_OBJECT_CLASS_TYPE(type), NULL);
- res = type->construct(hook, ep, node);
- if (res == -1) {
- g_warning("Plugin '%s' failed to load hook", ep->name);
- g_object_unref(hook);
- goto fail;
- } else {
- ep->hooks = g_slist_append(ep->hooks, hook);
- }
- } else {
- GSList *l;
- char *oldclass;
-
- if (ep_plugins_pending == NULL)
- ep_plugins_pending = g_hash_table_new(g_str_hash, g_str_equal);
- if (!g_hash_table_lookup_extended(ep_plugins_pending, class, (void **)&oldclass, (void **)&l)) {
- oldclass = class;
- l = NULL;
- }
- l = g_slist_prepend(l, ep);
- g_hash_table_insert(ep_plugins_pending, oldclass, l);
- ep->hooks_pending = g_slist_prepend(ep->hooks_pending, node);
- }
- } else if (strcmp(node->name, "description") == 0) {
- ep->description = e_plugin_xml_content_domain(node, ep->domain);
- } else if (strcmp(node->name, "author") == 0) {
- char *name = e_plugin_xml_prop(node, "name");
- char *email = e_plugin_xml_prop(node, "email");
-
- if (name || email) {
- EPluginAuthor *epa = g_malloc0(sizeof(*epa));
-
- epa->name = name;
- epa->email = email;
- ep->authors = g_slist_append(ep->authors, epa);
- }
- }
- node = node->next;
- }
- res = 0;
-fail:
- return res;
-}
-
-static void
-ep_enable(EPlugin *ep, int state)
-{
- GSList *l;
-
- ep->enabled = state;
- for (l=ep->hooks;l;l = g_slist_next(l))
- e_plugin_hook_enable((EPluginHook *)l->data, state);
-
- ep_set_enabled(ep->id, state);
-}
-
-static void
-ep_finalise(GObject *o)
-{
- EPlugin *ep = (EPlugin *)o;
-
- g_free(ep->id);
- g_free(ep->description);
- g_free(ep->name);
- g_free(ep->domain);
- g_slist_free(ep->hooks_pending);
-
- g_slist_foreach(ep->hooks, (GFunc)g_object_unref, NULL);
- g_slist_free(ep->hooks);
-
- ((GObjectClass *)ep_parent_class)->finalize(o);
-}
-
-static void
-ep_init(GObject *o)
-{
- EPlugin *ep = (EPlugin *)o;
-
- ep->enabled = TRUE;
-}
-
-static void
-ep_class_init(EPluginClass *klass)
-{
- ((GObjectClass *)klass)->finalize = ep_finalise;
- klass->construct = ep_construct;
- klass->enable = ep_enable;
-}
-
-/**
- * e_plugin_get_type:
- *
- * Standard GObject type function. This is only an abstract class, so
- * you can only use this to subclass EPlugin.
- *
- * Return value: The type.
- **/
-GType
-e_plugin_get_type(void)
-{
- static GType type = 0;
-
- if (!type) {
- char *path, *col, *p;
-
- static const GTypeInfo info = {
- sizeof(EPluginClass), NULL, NULL, (GClassInitFunc)ep_class_init, NULL, NULL,
- sizeof(EPlugin), 0, (GInstanceInitFunc)ep_init,
- };
-
- ep_parent_class = g_type_class_ref(G_TYPE_OBJECT);
- type = g_type_register_static(G_TYPE_OBJECT, "EPlugin", &info, 0);
-
- /* Add paths in the environment variable or default global and user specific paths */
- path = g_strdup(getenv("EVOLUTION_PLUGIN_PATH"));
- if (path == NULL) {
- /* Add the global path */
- e_plugin_add_load_path(EVOLUTION_PLUGINDIR);
-
- path = g_build_filename(g_get_home_dir(), ".eplugins", NULL);
- }
-
- p = path;
- while ((col = strchr(p, ':'))) {
- *col++ = 0;
- e_plugin_add_load_path(p);
- p = col;
- }
- e_plugin_add_load_path(p);
- g_free(path);
- }
-
- return type;
-}
-
-static int
-ep_load(const char *filename)
-{
- xmlDocPtr doc;
- xmlNodePtr root;
- int res = -1;
- EPlugin *ep;
- int cache = FALSE;
- struct _plugin_doc *pdoc;
-
- doc = xmlParseFile(filename);
- if (doc == NULL) {
- return -1;
- }
-
- root = xmlDocGetRootElement(doc);
- if (strcmp(root->name, "e-plugin-list") != 0) {
- g_warning("No <e-plugin-list> root element: %s", filename);
- xmlFreeDoc(doc);
- return -1;
- }
-
- pdoc = g_malloc0(sizeof(*pdoc));
- pdoc->doc = doc;
- pdoc->plugins = NULL;
-
- for (root = root->children; root ; root = root->next) {
- if (strcmp(root->name, "e-plugin") == 0) {
- char *prop, *id;
- EPluginClass *klass;
-
- id = e_plugin_xml_prop(root, "id");
- if (id == NULL) {
- g_warning("Invalid e-plugin entry in '%s': no id", filename);
- goto fail;
- }
-
- if (g_hash_table_lookup(ep_plugins, id)) {
- g_warning("Plugin '%s' already defined", id);
- g_free(id);
- continue;
- }
-
- prop = xmlGetProp(root, "type");
- if (prop == NULL) {
- g_free(id);
- g_warning("Invalid e-plugin entry in '%s': no type", filename);
- goto fail;
- }
-
- klass = g_hash_table_lookup(ep_types, prop);
- if (klass == NULL) {
- g_warning("Can't find plugin type '%s' for plugin '%s'\n", prop, id);
- g_free(id);
- xmlFree(prop);
- continue;
- }
- xmlFree(prop);
-
- ep = g_object_new(G_TYPE_FROM_CLASS(klass), NULL);
- ep->id = id;
- ep->path = g_strdup(filename);
- ep->enabled = ep_check_enabled(id);
- if (e_plugin_construct(ep, root) == -1)
- e_plugin_enable(ep, FALSE);
- g_hash_table_insert(ep_plugins, ep->id, ep);
- pdoc->plugins = g_slist_prepend(pdoc->plugins, ep);
- cache |= (ep->hooks_pending != NULL);
- }
- }
-
- res = 0;
-fail:
- if (cache) {
- pd(printf("Caching plugin description '%s' for unknown future hooks\n", filename));
- e_dlist_addtail(&ep_plugin_docs, (EDListNode *)pdoc);
- } else {
- xmlFreeDoc(pdoc->doc);
- g_free(pdoc);
- }
-
- return res;
-}
-
-/* This loads a hook that was pending on a given plugin but the type wasn't registered yet */
-/* This works in conjunction with ep_construct and e_plugin_hook_register_type to make sure
- everything works nicely together. Apparently. */
-static int
-ep_load_pending(EPlugin *ep, EPluginHookClass *type)
-{
- int res = 0;
- GSList *l, *p;
-
- phd(printf("New hook type registered '%s', loading pending hooks on plugin '%s'\n", type->id, ep->id));
-
- l = ep->hooks_pending;
- p = NULL;
- while (l) {
- GSList *n = l->next;
- xmlNodePtr node = l->data;
- char *class = xmlGetProp(node, "class");
- EPluginHook *hook;
-
- phd(printf(" checking pending hook '%s'\n", class?class:"<unknown>"));
-
- if (class) {
- if (strcmp(class, type->id) == 0) {
- hook = g_object_new(G_OBJECT_CLASS_TYPE(type), NULL);
- res = type->construct(hook, ep, node);
- if (res == -1) {
- g_warning("Plugin '%s' failed to load hook '%s'", ep->name, type->id);
- g_object_unref(hook);
- } else {
- ep->hooks = g_slist_append(ep->hooks, hook);
- }
-
- if (p)
- p->next = n;
- else
- ep->hooks_pending = n;
- g_slist_free_1(l);
- l = p;
- }
-
- xmlFree(class);
- }
-
- p = l;
- l = n;
- }
-
- return res;
-}
-
-/**
- * e_plugin_add_load_path:
- * @path: The path to add to search for plugins.
- *
- * Add a path to be searched when e_plugin_load_plugins() is called.
- * By default the system plugin directory and ~/.eplugins is used as
- * the search path unless overriden by the environmental variable
- * %EVOLUTION_PLUGIN_PATH.
- *
- * %EVOLUTION_PLUGIN_PATH is a : separated list of paths to search for
- * plugin definitions in order.
- *
- * Plugin definitions are XML files ending in the extension ".eplug".
- **/
-void
-e_plugin_add_load_path(const char *path)
-{
- ep_path = g_slist_append(ep_path, g_strdup(path));
-}
-
-/**
- * e_plugin_load_plugins:
- *
- * Scan the search path, looking for plugin definitions, and load them
- * into memory.
- *
- * Return value: Returns -1 if an error occured.
- **/
-int
-e_plugin_load_plugins(void)
-{
- GSList *l;
-
- if (ep_types == NULL) {
- g_warning("no plugin types defined");
- return 0;
- }
-
-
- for (l = ep_path;l;l = g_slist_next(l)) {
- DIR *dir;
- struct dirent *d;
- char *path = l->data;
-
- pd(printf("scanning plugin dir '%s'\n", path));
-
- dir = opendir(path);
- if (dir == NULL) {
- /*g_warning("Could not find plugin path: %s", path);*/
- continue;
- }
-
- while ( (d = readdir(dir)) ) {
- if (strlen(d->d_name) > 6
- && !strcmp(d->d_name + strlen(d->d_name) - 6, ".eplug")) {
- char * name = g_build_filename(path, d->d_name, NULL);
-
- ep_load(name);
- g_free(name);
- }
- }
-
- closedir(dir);
- }
-
- return 0;
-}
-
-/**
- * e_plugin_register_type:
- * @type: The GObject type of the plugin loader.
- *
- * Register a new plugin type with the plugin system. Each type must
- * subclass EPlugin and must override the type member of the
- * EPluginClass with a unique name.
- **/
-void
-e_plugin_register_type(GType type)
-{
- EPluginClass *klass;
-
- if (ep_types == NULL) {
- ep_types = g_hash_table_new(g_str_hash, g_str_equal);
- ep_plugins = g_hash_table_new(g_str_hash, g_str_equal);
- /* TODO: notify listening */
- ep_gconf = gconf_client_get_default();
- ep_disabled = gconf_client_get_list(ep_gconf, "/apps/evolution/eplugin/disabled", GCONF_VALUE_STRING, NULL);
- }
-
- klass = g_type_class_ref(type);
-
- pd(printf("register plugin type '%s'\n", klass->type));
-
- g_hash_table_insert(ep_types, (void *)klass->type, klass);
-}
-
-static void
-ep_list_plugin(void *key, void *val, void *dat)
-{
- GSList **l = (GSList **)dat;
-
- *l = g_slist_prepend(*l, g_object_ref(val));
-}
-
-/**
- * e_plugin_list_plugins: List all plugins.
- *
- * Static class method to retrieve a list of all current plugins. They
- * are listed in no particular order.
- *
- * Return value: A GSList of all plugins, they must be
- * g_object_unref'd and the list freed.
- **/
-GSList *
-e_plugin_list_plugins(void)
-{
- GSList *l = NULL;
-
- if (ep_plugins)
- g_hash_table_foreach(ep_plugins, ep_list_plugin, &l);
-
- return l;
-}
-
-/**
- * e_plugin_construct:
- * @ep: An EPlugin derived object.
- * @root: The XML root node of the sub-tree containing the plugin
- * definition.
- *
- * Helper to invoke the construct virtual method.
- *
- * Return value: The return from the construct virtual method.
- **/
-int
-e_plugin_construct(EPlugin *ep, xmlNodePtr root)
-{
- return ((EPluginClass *)G_OBJECT_GET_CLASS(ep))->construct(ep, root);
-}
-
-/**
- * e_plugin_invoke:
- * @ep:
- * @name: The name of the function to invoke. The format of this name
- * will depend on the EPlugin type and its language conventions.
- * @data: The argument to the function. Its actual type depends on
- * the hook on which the function resides. It is up to the called
- * function to get this right.
- *
- * Helper to invoke the invoke virtual method.
- *
- * Return value: The return of the plugin invocation.
- **/
-void *
-e_plugin_invoke(EPlugin *ep, const char *name, void *data)
-{
- if (!ep->enabled) {
- g_warning("Invoking method on disabled plugin, ignored");
- return NULL;
- }
-
- return ((EPluginClass *)G_OBJECT_GET_CLASS(ep))->invoke(ep, name, data);
-}
-
-/**
- * e_plugin_enable:
- * @ep:
- * @state:
- *
- * Set the enable state of a plugin.
- *
- * THIS IS NOT FULLY IMPLEMENTED YET
- **/
-void
-e_plugin_enable(EPlugin *ep, int state)
-{
- if ((ep->enabled == 0) == (state == 0))
- return;
-
- ((EPluginClass *)G_OBJECT_GET_CLASS(ep))->enable(ep, state);
-}
-
-/**
- * e_plugin_xml_prop:
- * @node: An XML node.
- * @id: The name of the property to retrieve.
- *
- * A static helper function to look up a property on an XML node, and
- * ensure it is allocated in GLib system memory. If GLib isn't using
- * the system malloc then it must copy the property value.
- *
- * Return value: The property, allocated in GLib memory, or NULL if no
- * such property exists.
- **/
-char *
-e_plugin_xml_prop(xmlNodePtr node, const char *id)
-{
- char *p = xmlGetProp(node, id);
-
- if (g_mem_is_system_malloc()) {
- return p;
- } else {
- char * out = g_strdup(p);
-
- if (p)
- xmlFree(p);
- return out;
- }
-}
-
-/**
- * e_plugin_xml_prop_domain:
- * @node: An XML node.
- * @id: The name of the property to retrieve.
- * @domain: The translation domain for this string.
- *
- * A static helper function to look up a property on an XML node, and
- * translate it based on @domain.
- *
- * Return value: The property, allocated in GLib memory, or NULL if no
- * such property exists.
- **/
-char *
-e_plugin_xml_prop_domain(xmlNodePtr node, const char *id, const char *domain)
-{
- char *p, *out;
-
- p = xmlGetProp(node, id);
- if (p == NULL)
- return NULL;
-
- out = g_strdup(dgettext(domain, p));
- xmlFree(p);
-
- return out;
-}
-
-/**
- * e_plugin_xml_int:
- * @node: An XML node.
- * @id: The name of the property to retrieve.
- * @def: A default value if the property doesn't exist. Can be used
- * to determine if the property isn't set.
- *
- * A static helper function to look up a property on an XML node as an
- * integer. If the property doesn't exist, then @def is returned as a
- * default value instead.
- *
- * Return value: The value if set, or @def if not.
- **/
-int
-e_plugin_xml_int(xmlNodePtr node, const char *id, int def)
-{
- char *p = xmlGetProp(node, id);
-
- if (p)
- return atoi(p);
- else
- return def;
-}
-
-/**
- * e_plugin_xml_content:
- * @node:
- *
- * A static helper function to retrieve the entire textual content of
- * an XML node, and ensure it is allocated in GLib system memory. If
- * GLib isn't using the system malloc them it must copy the content.
- *
- * Return value: The node content, allocated in GLib memory.
- **/
-char *
-e_plugin_xml_content(xmlNodePtr node)
-{
- char *p = xmlNodeGetContent(node);
-
- if (g_mem_is_system_malloc()) {
- return p;
- } else {
- char * out = g_strdup(p);
-
- if (p)
- xmlFree(p);
- return out;
- }
-}
-
-/**
- * e_plugin_xml_content_domain:
- * @node:
- * @domain:
- *
- * A static helper function to retrieve the entire textual content of
- * an XML node, and ensure it is allocated in GLib system memory. If
- * GLib isn't using the system malloc them it must copy the content.
- *
- * Return value: The node content, allocated in GLib memory.
- **/
-char *
-e_plugin_xml_content_domain(xmlNodePtr node, const char *domain)
-{
- char *p, *out;
-
- p = xmlNodeGetContent(node);
- if (p == NULL)
- return NULL;
-
- out = g_strdup(dgettext(domain, p));
- xmlFree(p);
-
- return out;
-}
-
-/* ********************************************************************** */
-static void *epl_parent_class;
-
-/* this looks weird, but it saves a lot of typing */
-#define epl ((EPluginLib *)ep)
-
-/* TODO:
- We need some way to manage lifecycle.
- We need some way to manage state.
-
- Maybe just the g module init method will do, or we could add
- another which returns context.
-
- There is also the question of per-instance context, e.g. for config
- pages.
-*/
-
-static int
-epl_loadmodule(EPlugin *ep)
-{
- if (epl->module == NULL) {
- EPluginLibEnableFunc enable;
-
- if ((epl->module = g_module_open(epl->location, 0)) == NULL) {
- g_warning("can't load plugin '%s'", g_module_error());
- return -1;
- }
-
- if (g_module_symbol(epl->module, "e_plugin_lib_enable", (void *)&enable)) {
- if (enable(epl, TRUE) != 0) {
- ep->enabled = FALSE;
- g_module_close(epl->module);
- epl->module = NULL;
- return -1;
- }
- }
- }
-
- return 0;
-}
-
-static void *
-epl_invoke(EPlugin *ep, const char *name, void *data)
-{
- EPluginLibFunc cb;
-
- if (!ep->enabled) {
- g_warning("trying to invoke '%s' on disabled plugin '%s'", name, ep->id);
- return NULL;
- }
-
- if (epl_loadmodule(ep) != 0)
- return NULL;
-
- if (!g_module_symbol(epl->module, name, (void *)&cb)) {
- g_warning("Cannot resolve symbol '%s' in plugin '%s' (not exported?)", name, epl->location);
- return NULL;
- }
-
- return cb(epl, data);
-}
-
-static int
-epl_construct(EPlugin *ep, xmlNodePtr root)
-{
- if (((EPluginClass *)epl_parent_class)->construct(ep, root) == -1)
- return -1;
-
- epl->location = e_plugin_xml_prop(root, "location");
-
- if (epl->location == NULL)
- return -1;
-
- /* If we're enabled, check for the load-on-startup property */
- if (ep->enabled) {
- xmlChar *tmp;
-
- tmp = xmlGetProp(root, "load-on-startup");
- if (tmp) {
- xmlFree(tmp);
- if (epl_loadmodule(ep) != 0)
- return -1;
- }
- }
-
- return 0;
-}
-
-static void
-epl_enable(EPlugin *ep, int state)
-{
- EPluginLibEnableFunc enable;
-
- ((EPluginClass *)epl_parent_class)->enable(ep, state);
-
- /* if we're disabling and it isn't loaded, nothing to do */
- if (!state && epl->module == NULL)
- return;
-
- /* this will noop if we're disabling since we tested it above */
- if (epl_loadmodule(ep) != 0)
- return;
-
- if (g_module_symbol(epl->module, "e_plugin_lib_enable", (void *)&enable)) {
- if (enable(epl, state) != 0)
- return;
- }
-#if 0
- if (!state) {
- g_module_close(epl->module);
- epl->module = NULL;
- }
-#endif
-}
-
-static void
-epl_finalise(GObject *o)
-{
- EPlugin *ep = (EPlugin *)o;
-
- g_free(epl->location);
-
- if (epl->module)
- g_module_close(epl->module);
-
- ((GObjectClass *)epl_parent_class)->finalize(o);
-}
-
-static void
-epl_class_init(EPluginClass *klass)
-{
- ((GObjectClass *)klass)->finalize = epl_finalise;
- klass->construct = epl_construct;
- klass->invoke = epl_invoke;
- klass->enable = epl_enable;
- klass->type = "shlib";
-}
-
-/**
- * e_plugin_lib_get_type:
- *
- * Standard GObject function to retrieve the EPluginLib type. Use to
- * register the type with the plugin system if you want to use shared
- * library plugins.
- *
- * Return value: The EPluginLib type.
- **/
-GType
-e_plugin_lib_get_type(void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof(EPluginLibClass), NULL, NULL, (GClassInitFunc) epl_class_init, NULL, NULL,
- sizeof(EPluginLib), 0, (GInstanceInitFunc) NULL,
- };
-
- epl_parent_class = g_type_class_ref(e_plugin_get_type());
- type = g_type_register_static(e_plugin_get_type(), "EPluginLib", &info, 0);
- }
-
- return type;
-}
-
-/* ********************************************************************** */
-
-static int
-eph_construct(EPluginHook *eph, EPlugin *ep, xmlNodePtr root)
-{
- eph->plugin = ep;
-
- return 0;
-}
-
-static void
-eph_enable(EPluginHook *eph, int state)
-{
- /* NOOP */
-}
-
-static void
-eph_finalise(GObject *o)
-{
- ((GObjectClass *)eph_parent_class)->finalize((GObject *)o);
-}
-
-static void
-eph_class_init(EPluginHookClass *klass)
-{
- ((GObjectClass *)klass)->finalize = eph_finalise;
- klass->construct = eph_construct;
- klass->enable = eph_enable;
-}
-
-/**
- * e_plugin_hook_get_type:
- *
- * Standard GObject function to retrieve the EPluginHook type. Since
- * EPluginHook is an abstract class, this is only used to subclass it.
- *
- * Return value: The EPluginHook type.
- **/
-GType
-e_plugin_hook_get_type(void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof(EPluginHookClass), NULL, NULL, (GClassInitFunc) eph_class_init, NULL, NULL,
- sizeof(EPluginHook), 0, (GInstanceInitFunc) NULL,
- };
-
- eph_parent_class = g_type_class_ref(G_TYPE_OBJECT);
- type = g_type_register_static(G_TYPE_OBJECT, "EPluginHook", &info, 0);
- }
-
- return type;
-}
-
-/**
- * e_plugin_hook_enable: Set hook enabled state.
- * @eph:
- * @state:
- *
- * Set the enabled state of the plugin hook. This is called by the
- * plugin code.
- *
- * THIS IS NOT FULY IMEPLEMENTED YET
- **/
-void
-e_plugin_hook_enable(EPluginHook *eph, int state)
-{
- ((EPluginHookClass *)G_OBJECT_GET_CLASS(eph))->enable(eph, state);
-}
-
-/**
- * e_plugin_hook_register_type:
- * @type:
- *
- * Register a new plugin hook type with the plugin system. Each type
- * must subclass EPluginHook and must override the id member of the
- * EPluginHookClass with a unique identification string.
- **/
-void
-e_plugin_hook_register_type(GType type)
-{
- EPluginHookClass *klass, *oldklass;
- GSList *l, *plugins;
- char *class;
-
- if (eph_types == NULL)
- eph_types = g_hash_table_new(g_str_hash, g_str_equal);
-
- klass = g_type_class_ref(type);
-
- oldklass = g_hash_table_lookup(eph_types, (void *)klass->id);
- if (oldklass == klass) {
- g_type_class_unref(klass);
- return;
- } else if (oldklass != NULL) {
- g_warning("Trying to re-register hook type '%s'", klass->id);
- return;
- }
-
- phd(printf("register plugin hook type '%s'\n", klass->id));
- g_hash_table_insert(eph_types, (void *)klass->id, klass);
-
- /* if we've already loaded a plugin that needed this hook but it didn't exist, re-load it now */
-
- if (ep_plugins_pending
- && g_hash_table_lookup_extended(ep_plugins_pending, klass->id, (void **)&class, (void **)&plugins)) {
- struct _plugin_doc *pdoc, *ndoc;
-
- g_hash_table_remove(ep_plugins_pending, class);
- g_free(class);
- for (l = plugins; l; l = g_slist_next(l)) {
- EPlugin *ep = l->data;
-
- ep_load_pending(ep, klass);
- }
- g_slist_free(plugins);
-
- /* See if we can now garbage collect the xml definition since its been fully loaded */
-
- /* This is all because libxml doesn't refcount! */
-
- pdoc = (struct _plugin_doc *)ep_plugin_docs.head;
- ndoc = pdoc->next;
- while (ndoc) {
- if (pdoc->doc) {
- int cache = FALSE;
-
- for (l=pdoc->plugins;l;l=g_slist_next(l))
- cache |= (((EPlugin *)l->data)->hooks_pending != NULL);
-
- if (!cache) {
- pd(printf("Gargabe collecting plugin description\n"));
- e_dlist_remove((EDListNode *)pdoc);
- xmlFreeDoc(pdoc->doc);
- g_free(pdoc);
- }
- }
-
- pdoc = ndoc;
- ndoc = ndoc->next;
- }
- }
-}
-
-/**
- * e_plugin_hook_mask:
- * @root: An XML node.
- * @map: A zero-fill terminated array of EPluginHookTargeKeys used to
- * map a string with a bit value.
- * @prop: The property name.
- *
- * This is a static helper function which looks up a property @prop on
- * the XML node @root, and then uses the @map table to convert it into
- * a bitmask. The property value is a comma separated list of
- * enumeration strings which are indexed into the @map table.
- *
- * Return value: A bitmask representing the inclusive-or of all of the
- * integer values of the corresponding string id's stored in the @map.
- **/
-guint32
-e_plugin_hook_mask(xmlNodePtr root, const struct _EPluginHookTargetKey *map, const char *prop)
-{
- char *val, *p, *start, c;
- guint32 mask = 0;
-
- val = xmlGetProp(root, prop);
- if (val == NULL)
- return 0;
-
- p = val;
- do {
- start = p;
- while (*p && *p != ',')
- p++;
- c = *p;
- *p = 0;
- if (start != p) {
- int i;
-
- for (i=0;map[i].key;i++) {
- if (!strcmp(map[i].key, start)) {
- mask |= map[i].value;
- break;
- }
- }
- }
- *p++ = c;
- } while (c);
-
- xmlFree(val);
-
- return mask;
-}
-
-/**
- * e_plugin_hook_id:
- * @root:
- * @map:
- * @prop:
- *
- * This is a static helper function which looks up a property @prop on
- * the XML node @root, and then uses the @map table to convert it into
- * an integer.
- *
- * This is used as a helper wherever you need to represent an
- * enumerated value in the XML.
- *
- * Return value: If the @prop value is in @map, then the corresponding
- * integer value, if not, then ~0.
- **/
-guint32
-e_plugin_hook_id(xmlNodePtr root, const struct _EPluginHookTargetKey *map, const char *prop)
-{
- char *val;
- int i;
-
- val = xmlGetProp(root, prop);
- if (val == NULL)
- return ~0;
-
- for (i=0;map[i].key;i++) {
- if (!strcmp(map[i].key, val)) {
- xmlFree(val);
- return map[i].value;
- }
- }
-
- xmlFree(val);
-
- return ~0;
-}
-
-#if 0
-/*
- e-mail-format-handler
- mime_type
- target
-*/
-struct _EMFormatPlugin {
- EPlugin plugin;
-
- char *target;
- char *mime_type;
- struct _EMFormatHandler *(*get_handler)(void);
-};
-
-struct _EMFormatPluginClass {
- EPluginClass plugin_class;
-};
-
-#endif
-
-#if 0
-void em_setup_plugins(void);
-
-void
-em_setup_plugins(void)
-{
- GType *e_plugin_mono_get_type(void);
-
- e_plugin_register_type(e_plugin_lib_get_type());
- e_plugin_register_type(e_plugin_mono_get_type());
-
- e_plugin_hook_register_type(em_popup_hook_get_type());
-
- e_plugin_load_plugins(".");
-}
-#endif
diff --git a/e-util/e-plugin.h b/e-util/e-plugin.h
deleted file mode 100644
index efc53d5108..0000000000
--- a/e-util/e-plugin.h
+++ /dev/null
@@ -1,250 +0,0 @@
-
-#ifndef _E_PLUGIN_H
-#define _E_PLUGIN_H
-
-#include <glib.h>
-#include <glib-object.h>
-#include <libxml/tree.h>
-
-/* ********************************************************************** */
-
-typedef struct _EPlugin EPlugin;
-typedef struct _EPluginClass EPluginClass;
-
-#define E_PLUGIN_CLASSID "org.gnome.evolution.plugin"
-
-/* Structure to define the author(s) names and addresses */
-typedef struct _EPluginAuthor EPluginAuthor;
-struct _EPluginAuthor {
- char *name;
- char *email;
-};
-
-/**
- * struct _EPlugin - An EPlugin instance.
- *
- * @object: Superclass.
- * @id: Unique identifier for plugin instance.
- * @path: Filename where the xml definition resides.
- * @hooks_pending: A list hooks which can't yet be loaded. This is
- * the xmlNodePtr to the root node of the hook definition.
- * @description: A description of the plugin's purpose.
- * @name: The name of the plugin.
- * @domain: The translation domain for this plugin.
- * @hooks: A list of the EPluginHooks this plugin requires.
- * @enabled: Whether the plugin is enabled or not. This is not fully
- * implemented.
- *
- * The base EPlugin object is used to represent each plugin directly.
- * All of the plugin's hooks are loaded and managed through this
- * object.
- **/
-struct _EPlugin {
- GObject object;
-
- char *id;
- char *path;
- GSList *hooks_pending;
-
- char *description;
- char *name;
- char *domain;
- GSList *hooks;
- GSList *authors; /* EPluginAuthor structures */
-
- int enabled:1;
-};
-
-/**
- * struct _EPluginClass -
- *
- * @class: Superclass.
- * @type: The plugin type. This is used by the plugin loader to
- * determine which plugin object to instantiate to handle the plugin.
- * This must be overriden by each subclass to provide a unique name.
- * @construct: The construct virtual method scans the XML tree to
- * initialise itself.
- * @invoke: The invoke virtual method loads the plugin code, resolves
- * the function name, and marshals a simple pointer to execute the
- * plugin.
- * @enable: Virtual method to enable/disable the plugin.
- *
- * The EPluginClass represents each plugin type. The type of each class is
- * registered in a global table and is used to instantiate a
- * container for each plugin.
- *
- * It provides two main functions, to load the plugin definition, and
- * to invoke a function. Each plugin class is used to handle mappings
- * to different languages.
- **/
-struct _EPluginClass {
- GObjectClass class;
-
- const char *type;
-
- int (*construct)(EPlugin *, xmlNodePtr root);
- void *(*invoke)(EPlugin *, const char *name, void *data);
- void (*enable)(EPlugin *, int state);
-};
-
-GType e_plugin_get_type(void);
-
-int e_plugin_construct(EPlugin *ep, xmlNodePtr root);
-void e_plugin_add_load_path(const char *);
-int e_plugin_load_plugins(void);
-GSList * e_plugin_list_plugins(void);
-
-void e_plugin_register_type(GType type);
-
-void *e_plugin_invoke(EPlugin *ep, const char *name, void *data);
-void e_plugin_enable(EPlugin *eph, int state);
-
-/* static helpers */
-/* maps prop or content to 'g memory' */
-char *e_plugin_xml_prop(xmlNodePtr node, const char *id);
-char *e_plugin_xml_prop_domain(xmlNodePtr node, const char *id, const char *domain);
-int e_plugin_xml_int(xmlNodePtr node, const char *id, int def);
-char *e_plugin_xml_content(xmlNodePtr node);
-char *e_plugin_xml_content_domain(xmlNodePtr node, const char *domain);
-
-/* ********************************************************************** */
-#include <gmodule.h>
-
-typedef struct _EPluginLib EPluginLib;
-typedef struct _EPluginLibClass EPluginLibClass;
-
-/* The callback signature used for epluginlib methods */
-typedef void *(*EPluginLibFunc)(EPluginLib *ep, void *data);
-/* The setup method, this will be called when the plugin is
- * initialised. In the future it may also be called when the plugin
- * is disabled. */
-typedef int (*EPluginLibEnableFunc)(EPluginLib *ep, int enable);
-
-/**
- * struct _EPluginLib -
- *
- * @plugin: Superclass.
- * @location: The filename of the shared object.
- * @module: The GModule once it is loaded.
- *
- * This is a concrete EPlugin class. It loads and invokes dynamically
- * loaded libraries using GModule. The shared object isn't loaded
- * until the first callback is invoked.
- *
- * When the plugin is loaded, and if it exists, "e_plugin_lib_enable"
- * will be invoked to initialise the
- **/
-struct _EPluginLib {
- EPlugin plugin;
-
- char *location;
- GModule *module;
-};
-
-/**
- * struct _EPluginLibClass -
- *
- * @plugin_class: Superclass.
- *
- * The plugin library needs no additional class data.
- **/
-struct _EPluginLibClass {
- EPluginClass plugin_class;
-};
-
-GType e_plugin_lib_get_type(void);
-
-/* ********************************************************************** */
-
-typedef struct _EPluginHook EPluginHook;
-typedef struct _EPluginHookClass EPluginHookClass;
-
-/* utilities for subclasses to use */
-typedef struct _EPluginHookTargetMap EPluginHookTargetMap;
-typedef struct _EPluginHookTargetKey EPluginHookTargetKey;
-
-/**
- * struct _EPluginHookTargetKey -
- *
- * @key: Enumeration value as a string.
- * @value: Enumeration value as an integer.
- *
- * A multi-purpose string to id mapping structure used with various
- * helper functions to simplify plugin hook subclassing.
- **/
-struct _EPluginHookTargetKey {
- const char *key;
- guint32 value;
-};
-
-/**
- * struct _EPluginHookTargetMap -
- *
- * @type: The string id of the target.
- * @id: The integer id of the target. Maps directly to the type field
- * of the various plugin type target id's.
- * @mask_bits: A zero-fill terminated array of EPluginHookTargetKeys.
- *
- * Used by EPluginHook to define mappings of target type enumerations
- * to and from strings. Also used to define the mask option names
- * when reading the XML plugin hook definitions.
- **/
-struct _EPluginHookTargetMap {
- const char *type;
- int id;
- const struct _EPluginHookTargetKey *mask_bits; /* null terminated array */
-};
-
-/**
- * struct _EPluginHook - A plugin hook.
- *
- * @object: Superclass.
- * @plugin: The parent object.
- *
- * An EPluginHook is used as a container for each hook a given plugin
- * is listening to.
- **/
-struct _EPluginHook {
- GObject object;
-
- struct _EPlugin *plugin;
-};
-
-/**
- * struct _EPluginHookClass -
- *
- * @class: Superclass.
- * @id: The plugin hook type. This must be overriden by each subclass
- * and is used as a key when loading hook definitions. This string
- * should contain a globally unique name followed by a : and a version
- * specification. This is to ensure plugins only hook into hooks with
- * the right API.
- * @construct: Virtual method used to initialise the object when
- * loaded.
- * @enable: Virtual method used to enable or disable the hook.
- *
- * The EPluginHookClass represents each hook type. The type of the
- * class is registered in a global table and is used to instantiate a
- * container for each hook.
- **/
-struct _EPluginHookClass {
- GObjectClass class;
-
- const char *id;
-
- int (*construct)(EPluginHook *eph, EPlugin *ep, xmlNodePtr root);
- void (*enable)(EPluginHook *eph, int state);
-};
-
-GType e_plugin_hook_get_type(void);
-
-void e_plugin_hook_register_type(GType type);
-
-EPluginHook * e_plugin_hook_new(EPlugin *ep, xmlNodePtr root);
-void e_plugin_hook_enable(EPluginHook *eph, int state);
-
-/* static methods */
-guint32 e_plugin_hook_mask(xmlNodePtr root, const struct _EPluginHookTargetKey *map, const char *prop);
-guint32 e_plugin_hook_id(xmlNodePtr root, const struct _EPluginHookTargetKey *map, const char *prop);
-
-#endif /* ! _E_PLUGIN_H */
diff --git a/e-util/e-popup.c b/e-util/e-popup.c
deleted file mode 100644
index 6ce73ab2db..0000000000
--- a/e-util/e-popup.c
+++ /dev/null
@@ -1,844 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Michael Zucchi <notzed@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <stdlib.h>
-
-#include <glib.h>
-
-#include <gtk/gtkmenu.h>
-#include <gtk/gtkmenuitem.h>
-#include <gtk/gtkimagemenuitem.h>
-#include <gtk/gtkcheckmenuitem.h>
-#include <gtk/gtkradiomenuitem.h>
-#include <gtk/gtkseparatormenuitem.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkimage.h>
-
-#include "e-popup.h"
-
-#include <e-util/e-icon-factory.h>
-
-#include <libgnome/gnome-i18n.h>
-
-#define d(x)
-
-struct _EPopupFactory {
- struct _EPopupFactory *next, *prev;
-
- char *menuid;
- EPopupFactoryFunc factory;
- void *factory_data;
-};
-
-/* Used for the "activate" signal callback data to re-map to the api */
-struct _item_node {
- struct _item_node *next;
-
- EPopupItem *item;
- struct _menu_node *menu;
-};
-
-/* Stores all the items added */
-struct _menu_node {
- struct _menu_node *next, *prev;
-
- EPopup *popup;
-
- GSList *menu;
- char *domain;
- EPopupItemsFunc freefunc;
- void *data;
-
- struct _item_node *items;
-};
-
-struct _EPopupPrivate {
- EDList menus;
-};
-
-static GObjectClass *ep_parent;
-
-static void
-ep_init(GObject *o)
-{
- EPopup *emp = (EPopup *)o;
- struct _EPopupPrivate *p;
-
- p = emp->priv = g_malloc0(sizeof(struct _EPopupPrivate));
-
- e_dlist_init(&p->menus);
-}
-
-static void
-ep_finalise(GObject *o)
-{
- EPopup *emp = (EPopup *)o;
- struct _EPopupPrivate *p = emp->priv;
- struct _menu_node *mnode, *nnode;
-
- mnode = (struct _menu_node *)p->menus.head;
- nnode = mnode->next;
- while (nnode) {
- struct _item_node *inode;
-
- if (mnode->freefunc)
- mnode->freefunc(emp, mnode->menu, mnode->data);
-
- g_free(mnode->domain);
-
- /* free item activate callback data */
- inode = mnode->items;
- while (inode) {
- struct _item_node *nnode = inode->next;
-
- g_free(inode);
- inode = nnode;
- }
-
- g_free(mnode);
- mnode = nnode;
- nnode = nnode->next;
- }
-
- if (emp->target)
- e_popup_target_free(emp, emp->target);
-
- g_free(emp->menuid);
-
- g_free(p);
-
- ((GObjectClass *)ep_parent)->finalize(o);
-}
-
-static void
-ep_target_free(EPopup *ep, EPopupTarget *t)
-{
- g_free(t);
- g_object_unref(ep);
-}
-
-static void
-ep_class_init(GObjectClass *klass)
-{
- d(printf("EPopup class init %p '%s'\n", klass, g_type_name(((GObjectClass *)klass)->g_type_class.g_type)));
-
- klass->finalize = ep_finalise;
- ((EPopupClass *)klass)->target_free = ep_target_free;
-}
-
-static void
-ep_base_init(GObjectClass *klass)
-{
- e_dlist_init(&((EPopupClass *)klass)->factories);
-}
-
-/**
- * e_popup_get_type:
- *
- * Standard GObject type function.
- *
- * Return value: The EPopup object type.
- **/
-GType
-e_popup_get_type(void)
-{
- static GType type = 0;
-
- if (type == 0) {
- static const GTypeInfo info = {
- sizeof(EPopupClass),
- (GBaseInitFunc)ep_base_init, NULL,
- (GClassInitFunc)ep_class_init, NULL, NULL,
- sizeof(EPopup), 0,
- (GInstanceInitFunc)ep_init
- };
- ep_parent = g_type_class_ref(G_TYPE_OBJECT);
- type = g_type_register_static(G_TYPE_OBJECT, "EPopup", &info, 0);
- }
-
- return type;
-}
-
-/**
- * e_popup_new - Create an targetless popup menu manager.
- * @menuid: Unique ID for this menu.
- *
- * Create a targetless popup menu object. This can be used as a
- * helper for creating popup menu's with no target. Such popup menu's
- * wont be very pluggable.
- *
- * Return value: A new EPopup.
- **/
-EPopup *e_popup_new(const char *menuid)
-{
- EPopup *ep = g_object_new(e_popup_get_type(), NULL);
-
- e_popup_construct(ep, menuid);
-
- return ep;
-}
-
-/**
- * e_popup_construct:
- * @ep: An instantiated but uninitialised EPopup.
- * @menuid: The menu identifier.
- *
- * Construct the base popup instance with standard parameters.
- *
- * Return value: Returns @ep.
- **/
-EPopup *e_popup_construct(EPopup *ep, const char *menuid)
-{
- ep->menuid = g_strdup(menuid);
-
- return ep;
-}
-
-/**
- * e_popup_add_items:
- * @emp: An EPopup derived object.
- * @items: A list of EPopupItem's to add to the current popup menu.
- * @domain: Translation domain for translating labels.
- * @freefunc: A function which will be called when the items are no
- * longer needed.
- * @data: user-data passed to @freefunc, and passed to all activate
- * methods.
- *
- * Add new EPopupItems to the menus. Any with the same path
- * will override previously defined menu items, at menu building
- * time. This may be called any number of times before the menu is
- * built to create a complex heirarchy of menus.
- **/
-void
-e_popup_add_items(EPopup *emp, GSList *items, const char *domain, EPopupItemsFunc freefunc, void *data)
-{
- struct _menu_node *node;
-
- node = g_malloc0(sizeof(*node));
- node->menu = items;
- node->domain = g_strdup(domain);
- node->freefunc = freefunc;
- node->data = data;
- node->popup = emp;
-
- e_dlist_addtail(&emp->priv->menus, (EDListNode *)node);
-}
-
-static void
-ep_add_static_items(EPopup *emp)
-{
- struct _EPopupFactory *f;
- EPopupClass *klass = (EPopupClass *)G_OBJECT_GET_CLASS(emp);
-
- if (emp->menuid == NULL || emp->target == NULL)
- return;
-
- /* setup the menu itself */
- f = (struct _EPopupFactory *)klass->factories.head;
- while (f->next) {
- if (f->menuid == NULL
- || !strcmp(f->menuid, emp->menuid)) {
- f->factory(emp, f->factory_data);
- }
- f = f->next;
- }
-}
-
-static int
-ep_cmp(const void *ap, const void *bp)
-{
- struct _item_node *a = *((void **)ap);
- struct _item_node *b = *((void **)bp);
-
- return strcmp(a->item->path, b->item->path);
-}
-
-static void
-ep_activate(GtkWidget *w, struct _item_node *inode)
-{
- EPopupItem *item = inode->item;
- guint32 type = item->type & E_POPUP_TYPE_MASK;
-
- /* this is a bit hackish, use the item->type to transmit the
- active state, presumes we can write to this memory ... The
- alternative is the EMenu idea of different callbacks, but
- thats painful for breaking type-safety on callbacks */
-
- if (type == E_POPUP_TOGGLE || type == E_POPUP_RADIO) {
- if (gtk_check_menu_item_get_active((GtkCheckMenuItem *)w))
- item->type |= E_POPUP_ACTIVE;
- else
- item->type &= ~E_POPUP_ACTIVE;
- }
-
- item->activate(inode->menu->popup, item, inode->menu->data);
-}
-
-/**
- * e_popup_create:
- * @emp: An EPopup derived object.
- * @target: popup target, if set, then factories will be invoked.
- * This is then owned by the menu.
- * @mask: If supplied, overrides the target specified mask or provides
- * a mask if no target is supplied. Used to enable or show menu
- * items.
- *
- * All of the menu items registered on @emp are sorted by path, and
- * then converted into a menu heirarchy.
- *
- *
- * Return value: A GtkMenu which can be popped up when ready.
- **/
-GtkMenu *
-e_popup_create_menu(EPopup *emp, EPopupTarget *target, guint32 mask)
-{
- struct _EPopupPrivate *p = emp->priv;
- struct _menu_node *mnode, *nnode;
- GPtrArray *items = g_ptr_array_new();
- GSList *l;
- GString *ppath = g_string_new("");
- GtkMenu *topmenu;
- GHashTable *menu_hash = g_hash_table_new(g_str_hash, g_str_equal),
- *group_hash = g_hash_table_new(g_str_hash, g_str_equal);
- int i;
-
- emp->target = target;
- ep_add_static_items(emp);
-
- if (target && mask == 0)
- mask = target->mask;
-
- /* FIXME: need to override old ones with new names */
- mnode = (struct _menu_node *)p->menus.head;
- nnode = mnode->next;
- while (nnode) {
- for (l=mnode->menu; l; l = l->next) {
- struct _item_node *inode = g_malloc0(sizeof(*inode));
-
- inode->item = l->data;
- inode->menu = mnode;
- inode->next = mnode->items;
- mnode->items = inode;
-
- g_ptr_array_add(items, inode);
- }
- mnode = nnode;
- nnode = nnode->next;
- }
-
- qsort(items->pdata, items->len, sizeof(items->pdata[0]), ep_cmp);
-
- topmenu = (GtkMenu *)gtk_menu_new();
- for (i=0;i<items->len;i++) {
- GtkWidget *label;
- struct _item_node *inode = items->pdata[i];
- struct _EPopupItem *item = inode->item;
- GtkMenu *thismenu;
- GtkMenuItem *menuitem;
- char *tmp;
-
- /* for bar's, the mask is exclusive or */
- if (item->visible) {
- if ((item->type & E_POPUP_TYPE_MASK) == E_POPUP_BAR) {
- if ((item->visible & mask) == item->visible)
- continue;
- } else if (item->visible & mask)
- continue;
- }
-
- g_string_truncate(ppath, 0);
- tmp = strrchr(item->path, '/');
- if (tmp) {
- g_string_append_len(ppath, item->path, tmp-item->path);
- thismenu = g_hash_table_lookup(menu_hash, ppath->str);
- g_assert(thismenu != NULL);
- } else {
- thismenu = topmenu;
- }
-
- switch (item->type & E_POPUP_TYPE_MASK) {
- case E_POPUP_ITEM:
- if (item->image) {
- GtkWidget *image;
-
- /* work-around e-icon-factory not doing GTK_STOCK stuff */
- if (strncmp((char *)item->image, "gtk-", 4) == 0) {
- image = gtk_image_new_from_stock((char *)item->image, GTK_ICON_SIZE_MENU);
- } else {
- image = e_icon_factory_get_image((char *)item->image, E_ICON_SIZE_MENU);
- }
-
- gtk_widget_show(image);
- menuitem = (GtkMenuItem *)gtk_image_menu_item_new();
- gtk_image_menu_item_set_image((GtkImageMenuItem *)menuitem, image);
- } else {
- menuitem = (GtkMenuItem *)gtk_menu_item_new();
- }
- break;
- case E_POPUP_TOGGLE:
- menuitem = (GtkMenuItem *)gtk_check_menu_item_new();
- gtk_check_menu_item_set_active((GtkCheckMenuItem *)menuitem, item->type & E_POPUP_ACTIVE);
- break;
- case E_POPUP_RADIO:
- menuitem = (GtkMenuItem *)gtk_radio_menu_item_new(g_hash_table_lookup(group_hash, ppath->str));
- /* FIXME: need to strdup the string */
- g_hash_table_insert(group_hash, ppath->str, gtk_radio_menu_item_get_group((GtkRadioMenuItem *)menuitem));
- gtk_check_menu_item_set_active((GtkCheckMenuItem *)menuitem, item->type & E_POPUP_ACTIVE);
- break;
- case E_POPUP_IMAGE:
- menuitem = (GtkMenuItem *)gtk_image_menu_item_new();
- gtk_image_menu_item_set_image((GtkImageMenuItem *)menuitem, item->image);
- break;
- case E_POPUP_SUBMENU: {
- GtkMenu *submenu = (GtkMenu *)gtk_menu_new();
-
- g_hash_table_insert(menu_hash, item->path, submenu);
- menuitem = (GtkMenuItem *)gtk_menu_item_new();
- gtk_menu_item_set_submenu(menuitem, (GtkWidget *)submenu);
- break; }
- case E_POPUP_BAR:
- /* TODO: double-bar, end-bar stuff? */
- menuitem = (GtkMenuItem *)gtk_separator_menu_item_new();
- break;
- default:
- continue;
- }
-
- if (item->label) {
- label = gtk_label_new_with_mnemonic(dgettext(inode->menu->domain, item->label));
- gtk_misc_set_alignment((GtkMisc *)label, 0.0, 0.5);
- gtk_widget_show(label);
- gtk_container_add((GtkContainer *)menuitem, label);
- }
-
- if (item->activate)
- g_signal_connect(menuitem, "activate", G_CALLBACK(ep_activate), inode);
-
- gtk_menu_shell_append((GtkMenuShell *)thismenu, (GtkWidget *)menuitem);
-
- if (item->enable & mask)
- gtk_widget_set_sensitive((GtkWidget *)menuitem, FALSE);
-
- gtk_widget_show((GtkWidget *)menuitem);
- }
-
- g_string_free(ppath, TRUE);
- g_ptr_array_free(items, TRUE);
- g_hash_table_destroy(menu_hash);
- g_hash_table_destroy(group_hash);
-
- return topmenu;
-}
-
-static void
-ep_popup_done(GtkWidget *w, EPopup *emp)
-{
- gtk_widget_destroy(w);
- if (emp->target) {
- e_popup_target_free(emp, emp->target);
- emp->target = NULL;
- }
- g_object_unref(emp);
-}
-
-/**
- * e_popup_create_menu_once:
- * @emp: EPopup, once the menu is shown, this cannot be
- * considered a valid pointer.
- * @target: If set, the target of the selection. Static menu
- * items will be added. The target will be freed once complete.
- * @mask: Enable/disable and visibility mask.
- *
- * Like popup_create_menu, but automatically sets up the menu
- * so that it is destroyed once a selection takes place, and
- * the EPopup is unreffed. This is the normal entry point as it
- * automates most memory management for popup menus.
- *
- * Return value: A menu, to popup.
- **/
-GtkMenu *
-e_popup_create_menu_once(EPopup *emp, EPopupTarget *target, guint32 mask)
-{
- GtkMenu *menu;
-
- menu = e_popup_create_menu(emp, target, mask);
-
- g_signal_connect(menu, "selection_done", G_CALLBACK(ep_popup_done), emp);
-
- return menu;
-}
-
-/* ********************************************************************** */
-
-/**
- * e_popup_class_add_factory:
- * @klass: The EPopup derived class which you're interested in.
- * @menuid: The identifier of the menu you're interested in, or NULL
- * to be called for all menus on this class.
- * @func: The factory called when the menu @menuid is being created.
- * @data: User-data for the factory callback.
- *
- * This is a class-static method used to register factory callbacks
- * against specific menu's.
- *
- * The factory method will be invoked before the menu is created.
- * This way, the factory may add any additional menu items it wishes
- * based on the context supplied in the @target.
- *
- * Return value: A handle to the factory which can be used to remove
- * it later.
- **/
-EPopupFactory *
-e_popup_class_add_factory(EPopupClass *klass, const char *menuid, EPopupFactoryFunc func, void *data)
-{
- struct _EPopupFactory *f = g_malloc0(sizeof(*f));
-
- f->menuid = g_strdup(menuid);
- f->factory = func;
- f->factory_data = data;
- e_dlist_addtail(&klass->factories, (EDListNode *)f);
-
- return f;
-}
-
-/**
- * e_popup_class_remove_factory:
- * @klass: The EPopup derived class.
- * @f: The factory handle returned by e_popup_class_add_factory().
- *
- * Remove a popup menu factory. If it has not been added, or it has
- * already been removed, then the result is undefined (i.e. it will
- * crash).
- *
- * Generally factories are static for the life of the application, and
- * so do not need to be removed.
- **/
-void
-e_popup_class_remove_factory(EPopupClass *klass, EPopupFactory *f)
-{
- e_dlist_remove((EDListNode *)f);
- g_free(f->menuid);
- g_free(f);
-}
-
-/**
- * e_popup_target_new:
- * @ep: An EPopup derived object.
- * @type: type, defined by the implementing class.
- * @size: The size of memory to allocate for the target. It must be
- * equal or greater than the size of EPopupTarget.
- *
- * Allocate a new popup target suitable for this popup type.
- **/
-void *e_popup_target_new(EPopup *ep, int type, size_t size)
-{
- EPopupTarget *t;
-
- g_assert(size >= sizeof(EPopupTarget));
-
- t = g_malloc0(size);
- t->popup = ep;
- g_object_ref(ep);
- t->type = type;
-
- return t;
-}
-
-/**
- * e_popup_target_free:
- * @ep: An EPopup derived object.
- * @o: The target, previously allocated by e_popup_target_new().
- *
- * Free the target against @ep. Note that targets are automatically
- * freed if they are passed to the menu creation functions, so this is
- * only required if you are using the target for other purposes.
- **/
-void
-e_popup_target_free(EPopup *ep, void *o)
-{
- EPopupTarget *t = o;
-
- ((EPopupClass *)G_OBJECT_GET_CLASS(ep))->target_free(ep, t);
-}
-
-/* ********************************************************************** */
-
-/* Popup menu plugin handler */
-
-/*
-<e-plugin
- class="org.gnome.mail.plugin.popup:1.0"
- id="org.gnome.mail.plugin.popup.item:1.0"
- type="shlib"
- location="/opt/gnome2/lib/camel/1.0/libcamelimap.so"
- name="imap"
- description="IMAP4 and IMAP4v1 mail store">
- <hook class="org.gnome.mail.popupMenu:1.0"
- handler="HandlePopup">
- <menu id="any" target="select">
- <item
- type="item|toggle|radio|image|submenu|bar"
- active
- path="foo/bar"
- label="label"
- icon="foo"
- visible="select_one"
- activate="ep_view_emacs"/>
- </menu>
- </extension>
-
-*/
-
-static void *emph_parent_class;
-#define emph ((EPopupHook *)eph)
-
-/* must have 1:1 correspondence with e-popup types in order */
-static const EPluginHookTargetKey emph_item_types[] = {
- { "item", E_POPUP_ITEM },
- { "toggle", E_POPUP_TOGGLE },
- { "radio", E_POPUP_RADIO },
- { "image", E_POPUP_IMAGE },
- { "submenu", E_POPUP_SUBMENU },
- { "bar", E_POPUP_BAR },
- { 0 }
-};
-
-static void
-emph_popup_activate(EPopup *ep, EPopupItem *item, void *data)
-{
- EPopupHook *hook = data;
-
- e_plugin_invoke(hook->hook.plugin, (char *)item->user_data, ep->target);
-}
-
-static void
-emph_popup_factory(EPopup *emp, void *data)
-{
- struct _EPopupHookMenu *menu = data;
-
- d(printf("popup factory called %s mask %08x\n", menu->id?menu->id:"all menus", emp->target->mask));
-
- /* If we're disabled, then don't add the menu's. */
- if (emp->target->type != menu->target_type
- || !menu->hook->hook.plugin->enabled)
- return;
-
- if (menu->items)
- e_popup_add_items(emp, menu->items, menu->hook->hook.plugin->domain, NULL, menu->hook);
-}
-
-static void
-emph_free_item(struct _EPopupItem *item)
-{
- g_free(item->path);
- g_free(item->label);
- g_free(item->image);
- g_free(item->user_data);
- g_free(item);
-}
-
-static void
-emph_free_menu(struct _EPopupHookMenu *menu)
-{
- g_slist_foreach(menu->items, (GFunc)emph_free_item, NULL);
- g_slist_free(menu->items);
-
- g_free(menu->id);
- g_free(menu);
-}
-
-static struct _EPopupItem *
-emph_construct_item(EPluginHook *eph, EPopupHookMenu *menu, xmlNodePtr root, EPopupHookTargetMap *map)
-{
- struct _EPopupItem *item;
-
- d(printf(" loading menu item\n"));
- item = g_malloc0(sizeof(*item));
- if ((item->type = e_plugin_hook_id(root, emph_item_types, "type")) == -1
- || item->type == E_POPUP_IMAGE)
- goto error;
- item->path = e_plugin_xml_prop(root, "path");
- item->label = e_plugin_xml_prop_domain(root, "label", eph->plugin->domain);
- item->image = e_plugin_xml_prop(root, "icon");
- item->visible = e_plugin_hook_mask(root, map->mask_bits, "visible");
- item->enable = e_plugin_hook_mask(root, map->mask_bits, "enable");
- item->user_data = e_plugin_xml_prop(root, "activate");
-
- item->activate = emph_popup_activate;
-
- if (item->user_data == NULL)
- goto error;
-
- d(printf(" path=%s\n", item->path));
- d(printf(" label=%s\n", item->label));
-
- return item;
-error:
- d(printf("error!\n"));
- emph_free_item(item);
- return NULL;
-}
-
-static struct _EPopupHookMenu *
-emph_construct_menu(EPluginHook *eph, xmlNodePtr root)
-{
- struct _EPopupHookMenu *menu;
- xmlNodePtr node;
- EPopupHookTargetMap *map;
- EPopupHookClass *klass = (EPopupHookClass *)G_OBJECT_GET_CLASS(eph);
- char *tmp;
-
- d(printf(" loading menu\n"));
- menu = g_malloc0(sizeof(*menu));
- menu->hook = (EPopupHook *)eph;
-
- tmp = xmlGetProp(root, "target");
- if (tmp == NULL)
- goto error;
- map = g_hash_table_lookup(klass->target_map, tmp);
- xmlFree(tmp);
- if (map == NULL)
- goto error;
-
- menu->target_type = map->id;
- menu->id = e_plugin_xml_prop(root, "id");
- node = root->children;
- while (node) {
- if (0 == strcmp(node->name, "item")) {
- struct _EPopupItem *item;
-
- item = emph_construct_item(eph, menu, node, map);
- if (item)
- menu->items = g_slist_append(menu->items, item);
- }
- node = node->next;
- }
-
- return menu;
-error:
- emph_free_menu(menu);
- return NULL;
-}
-
-static int
-emph_construct(EPluginHook *eph, EPlugin *ep, xmlNodePtr root)
-{
- xmlNodePtr node;
- EPopupClass *klass;
-
- d(printf("loading popup hook\n"));
-
- if (((EPluginHookClass *)emph_parent_class)->construct(eph, ep, root) == -1)
- return -1;
-
- klass = ((EPopupHookClass *)G_OBJECT_GET_CLASS(eph))->popup_class;
-
- node = root->children;
- while (node) {
- if (strcmp(node->name, "menu") == 0) {
- struct _EPopupHookMenu *menu;
-
- menu = emph_construct_menu(eph, node);
- if (menu) {
- e_popup_class_add_factory(klass, menu->id, emph_popup_factory, menu);
- emph->menus = g_slist_append(emph->menus, menu);
- }
- }
- node = node->next;
- }
-
- eph->plugin = ep;
-
- return 0;
-}
-
-static void
-emph_finalise(GObject *o)
-{
- EPluginHook *eph = (EPluginHook *)o;
-
- g_slist_foreach(emph->menus, (GFunc)emph_free_menu, NULL);
- g_slist_free(emph->menus);
-
- ((GObjectClass *)emph_parent_class)->finalize(o);
-}
-
-static void
-emph_class_init(EPluginHookClass *klass)
-{
- ((GObjectClass *)klass)->finalize = emph_finalise;
- klass->construct = emph_construct;
-
- /* this is actually an abstract implementation but list it anyway */
- klass->id = "org.gnome.evolution.popup:1.0";
-
- d(printf("EPopupHook: init class %p '%s'\n", klass, g_type_name(((GObjectClass *)klass)->g_type_class.g_type)));
-
- ((EPopupHookClass *)klass)->target_map = g_hash_table_new(g_str_hash, g_str_equal);
- ((EPopupHookClass *)klass)->popup_class = g_type_class_ref(e_popup_get_type());
-}
-
-/**
- * e_popup_hook_get_type:
- *
- * Standard GObject function to get the object type. Used to subclass
- * EPopupHook.
- *
- * Return value: The type of the popup hook class.
- **/
-GType
-e_popup_hook_get_type(void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof(EPopupHookClass), NULL, NULL, (GClassInitFunc) emph_class_init, NULL, NULL,
- sizeof(EPopupHook), 0, (GInstanceInitFunc) NULL,
- };
-
- emph_parent_class = g_type_class_ref(e_plugin_hook_get_type());
- type = g_type_register_static(e_plugin_hook_get_type(), "EPopupHook", &info, 0);
- }
-
- return type;
-}
-
-/**
- * e_popup_hook_class_add_target_map:
- * @klass: The derived EPopupHook class.
- * @map: A map used to describe a single EPopupTarget type for this
- * class.
- *
- * Add a target map to a concrete derived class of EPopup. The target
- * map enumerates a single target type and the enable mask bit names,
- * so that the type can be loaded automatically by the EPopup class.
- **/
-void e_popup_hook_class_add_target_map(EPopupHookClass *klass, const EPopupHookTargetMap *map)
-{
- g_hash_table_insert(klass->target_map, (void *)map->type, (void *)map);
-}
diff --git a/e-util/e-popup.h b/e-util/e-popup.h
deleted file mode 100644
index d347b38d62..0000000000
--- a/e-util/e-popup.h
+++ /dev/null
@@ -1,302 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Authors: Michel Zucchi <notzed@ximian.com>
- *
- * Copyright 2003 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifndef __E_POPUP_H__
-#define __E_POPUP_H__
-
-#include <glib-object.h>
-#include "libedataserver/e-msgport.h"
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* This is an abstract popup menu management/merging class.
-
- To implement your own popup menu system, just create your own
- target types and implement the target free method. */
-
-typedef struct _EPopup EPopup;
-typedef struct _EPopupClass EPopupClass;
-
-typedef struct _EPopupItem EPopupItem;
-typedef struct _EPopupFactory EPopupFactory; /* anonymous type */
-typedef struct _EPopupTarget EPopupTarget;
-
-typedef void (*EPopupActivateFunc)(EPopup *ep, EPopupItem *item, void *data);
-typedef void (*EPopupFactoryFunc)(EPopup *emp, void *data);
-typedef void (*EPopupItemsFunc)(EPopup *ep, GSList *items, void *data);
-
-/**
- * enum _e_popup_t - Popup item type enumeration.
- * @E_POPUP_ITEM: A simple menu item.
- * @E_POPUP_TOGGLE: A toggle menu item.
- * @E_POPUP_RADIO: A radio menu item. Note that the radio group is
- * global for the entire (sub) menu. i.e. submenu's must be used to
- * separate radio button menu items.
- * @E_POPUP_IMAGE: A &GtkImage menu item. In this case the @image
- * field of &struct _EPopupItem points to the &GtkImage directly.
- * @E_POPUP_SUBMENU: A sub-menu header. It is up to the application
- * to define the @path properly so that the submenu comes before the
- * submenu items.
- * @E_POPUP_BAR: A menu separator bar.
- * @E_POPUP_TYPE_MASK: Mask used to separate item type from option bits.
- * @E_POPUP_ACTIVE: An option bit to signify that the radio button or
- * toggle button is active.
- */
-enum _e_popup_t {
- E_POPUP_ITEM = 0,
- E_POPUP_TOGGLE,
- E_POPUP_RADIO,
- E_POPUP_IMAGE,
- E_POPUP_SUBMENU,
- E_POPUP_BAR,
- E_POPUP_TYPE_MASK = 0xffff,
- E_POPUP_ACTIVE = 0x10000,
-};
-
-/* FIXME: activate passes back no context data apart from that provided.
- FIXME: It should pass the target at the least. The menu widget is
- useless */
-
-/**
- * struct _EPopupItem - A popup menu item definition.
- * @type: The type of the popup. See the &enum _epopup_t definition
- * for possible values.
- * @path: An absolute path, which when sorted using a simple ASCII
- * sort, will put the menu item in the right place in the menu
- * heirarchy. '/' is used to separate menus from submenu items.
- * @label: The text of the menyu item.
- * @activate: A function conforming to &EPopupActivateFunc which will
- * be called when the menu item is activated.
- * @user_data: Extra per-item user-data available to the
- * application. This is not passed to the @data field of @activate.
- * @image: For most types, the name of the icon in the icon theme to
- * display next to the menu item, if required. For the %E_POPUP_IMAGE
- * type, it is a pointer to the &GtkWidget instead.
- * @visible: Visibility mask. Used together with the &EPopupTarget mask
- * to determine if the item should be part of the menu or not.
- * @enable: Sensitivity mask. Similar to the visibility mask, but
- * currently unimplemented.
- * @popup: Used by e-popup to reference the parent object from
- * callbacks.
- *
- * The EPopupItem defines a single popup menu item, or submenu item,
- * or menu separator based on the @type. Any number of these are
- * merged at popup display type to form the popup menu.
- *
- * The application may extend this structure using simple C structure
- * containers to add any additional fields it may require.
- */
-struct _EPopupItem {
- enum _e_popup_t type;
- char *path; /* absolute path! must sort ascii-lexographically into the right spot */
- char *label;
- EPopupActivateFunc activate;
- void *user_data; /* user data, not passed directly to @activate */
- void *image; /* char* for item type, GtkWidget * for image type */
- guint32 visible; /* visibility mask */
- guint32 enable; /* sensitivity mask */
-};
-
-/**
- * struct EPopupTarget - A popup menu target definition.
- *
- * @popup: The parent popup object, used for virtual methods on the target.
- * @widget: The parent widget, where available. In some cases the
- * type of this object is part of the published api for the target.
- * @type: The target type. This will be defined by the
- * implementation.
- * @mask: Target mask. This is used to sensitise and show items
- * based on their definition in EPopupItem.
- *
- * An EPopupTarget defines the context for a specific popup menu
- * instance. The root target object is abstract, and it is up to
- * sub-classes of &EPopup to define the additional fields required to
- * make it usable.
- */
-struct _EPopupTarget {
- struct _EPopup *popup; /* used for virtual methods */
-
- struct _GtkWidget *widget; /* used if you need a parent toplevel, if available */
- guint32 type; /* targe type, for implementors */
-
- guint32 mask; /* depends on type, visibility mask */
-
- /* implementation fields follow */
-};
-
-/**
- * struct _EPopup - A Popup menu manager.
- *
- * @object: Superclass, GObject.
- * @priv: Private data.
- * @menuid: The id of this menu instance.
- * @target: The current target during the display of the popup menu.
- *
- * The EPopup manager object. Each popup menu is built using this
- * one-off object which is created each time the popup is invoked.
- */
-struct _EPopup {
- GObject object;
-
- struct _EPopupPrivate *priv;
-
- char *menuid;
-
- EPopupTarget *target;
-};
-
-/**
- * struct _EPopupClass -
- *
- * @object_class: Superclass type.
- * @factories: A list of factories for this particular class of popup
- * menu.
- * @target_free: Virtual method to free the popup target. The base
- * class frees the allocation and unrefs the popup pointer
- * structure.
- *
- * The EPopup class definition. This should be sub-classed for each
- * component that wants to provide hookable popup menus. The
- * sub-class only needs to know how to allocate and free the various target
- * types it supports.
- */
-struct _EPopupClass {
- GObjectClass object_class;
-
- EDList factories;
-
- void (*target_free)(EPopup *ep, EPopupTarget *t);
-};
-
-GType e_popup_get_type(void);
-
-EPopup *e_popup_new(const char *menuid);
-
-/* Static class methods */
-EPopupFactory *e_popup_class_add_factory(EPopupClass *klass, const char *menuid, EPopupFactoryFunc func, void *data);
-void e_popup_class_remove_factory(EPopupClass *klass, EPopupFactory *f);
-
-EPopup *e_popup_construct(EPopup *, const char *menuid);
-
-void e_popup_add_items(EPopup *, GSList *items, const char *domain, EPopupItemsFunc freefunc, void *data);
-
-void e_popup_add_static_items(EPopup *emp, EPopupTarget *target);
-/* do not call e_popup_create_menu, it can leak structures if not used right */
-struct _GtkMenu *e_popup_create_menu(EPopup *, EPopupTarget *, guint32 mask);
-struct _GtkMenu *e_popup_create_menu_once(EPopup *emp, EPopupTarget *, guint32 mask);
-
-void *e_popup_target_new(EPopup *, int type, size_t size);
-void e_popup_target_free(EPopup *, void *);
-
-/* ********************************************************************** */
-
-/* popup plugin target, they are closely integrated */
-
-/* To implement a basic popup menu plugin, you just need to subclass
- this and initialise the class target type tables */
-
-#include "e-util/e-plugin.h"
-
-typedef struct _EPopupHookMenu EPopupHookMenu;
-typedef struct _EPopupHook EPopupHook;
-typedef struct _EPopupHookClass EPopupHookClass;
-
-typedef struct _EPluginHookTargetMap EPopupHookTargetMap;
-typedef struct _EPluginHookTargetKey EPopupHookTargetMask;
-
-typedef void (*EPopupHookFunc)(struct _EPlugin *plugin, EPopupTarget *target);
-
-/**
- * struct _EPopupHookMenu -
- *
- * @hook: Parent pointer.
- * @id: The identifier of the menu to which these items belong.
- * @target_type: The target number of the type of target these menu
- * items expect. It will generally also be defined by the menu id.
- * @items: A list of EPopupItems.
- *
- * The structure used to keep track of all of the items that a plugin
- * wishes to add to a given menu. This is used internally by a factory
- * method set on EPlugin to add the right menu items to a given menu.
- */
-struct _EPopupHookMenu {
- struct _EPopupHook *hook; /* parent pointer */
- char *id; /* target menu id for these menu items */
- int target_type; /* target type of this menu */
- GSList *items; /* items to add to menu */
-};
-
-/**
- * struct _EPopupHook - A popup menu hook.
- *
- * @hook: Superclass.
- * @menus: A list of EPopupHookMenus, for all menus registered on
- * this hook type.
- *
- * The EPopupHook class loads and manages the meta-data required to
- * map plugin definitions to physical menus.
- */
-struct _EPopupHook {
- EPluginHook hook;
-
- GSList *menus;
-};
-
-/**
- * struct _EPopupHookClass -
- *
- * @hook_class: Superclass.
- * @target_map: Table of EPluginHookTargetMaps which enumerate the
- * target types and enable bits of the implementing class.
- * @popup_class: The EPopupClass of the corresponding popup manager
- * for the implementing class.
- *
- * The EPopupHookClass is a concrete class, however it is empty on its
- * own. It needs to be sub-classed and initialised appropriately.
- *
- * The EPluginHookClass.id must be set to the name and version of the
- * hook handler itself. The @target_map must be initialised with the
- * data required to enumerate the target types and enable flags
- * supported by the implementing class.
- */
-struct _EPopupHookClass {
- EPluginHookClass hook_class;
-
- /* EPopupHookTargetMap by .type */
- GHashTable *target_map;
- /* the popup class these popups belong to */
- EPopupClass *popup_class;
-};
-
-GType e_popup_hook_get_type(void);
-
-/* for implementors */
-void e_popup_hook_class_add_target_map(EPopupHookClass *klass, const EPopupHookTargetMap *);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_POPUP_H__ */
diff --git a/e-util/e-print.c b/e-util/e-print.c
deleted file mode 100644
index 63d7bf3e1e..0000000000
--- a/e-util/e-print.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-print.c - Uniform print setting/dialog routines for Evolution
- *
- * Copyright (C) 2005 Novell, Inc.
- *
- * Authors: JP Rosevear <jpr@novell.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <gconf/gconf-client.h>
-#include "e-print.h"
-
-#define PRINT_CONFIG_KEY "/apps/evolution/shell/print_config"
-
-GnomePrintConfig *
-e_print_load_config (void)
-{
- GConfClient *gconf;
- GnomePrintConfig *config;
- char *str;
-
- gconf = gconf_client_get_default ();
- str = gconf_client_get_string (gconf, PRINT_CONFIG_KEY, NULL);
- g_object_unref (gconf);
-
- if (!str)
- return gnome_print_config_default ();
-
- config = gnome_print_config_from_string (str, 0);
-
- /* Its unlikely people will want to preserve this too often */
- gnome_print_config_set_int (config, GNOME_PRINT_KEY_NUM_COPIES, 1);
- gnome_print_config_set_boolean (config, GNOME_PRINT_KEY_COLLATE, FALSE);
-
- return config;
-}
-
-
-void
-e_print_save_config (GnomePrintConfig *config)
-{
- GConfClient *gconf;
- char *str;
-
- str = gnome_print_config_to_string (config, 0);
-
- gconf = gconf_client_get_default ();
- gconf_client_set_string (gconf, PRINT_CONFIG_KEY, str, NULL);
- g_object_unref (gconf);
-}
-
-static void
-print_dialog_response(GtkWidget *widget, int resp, gpointer data)
-{
- if (resp == GNOME_PRINT_DIALOG_RESPONSE_PRINT)
- e_print_save_config (gnome_print_dialog_get_config (GNOME_PRINT_DIALOG (widget)));
-}
-
-GtkWidget *
-e_print_get_dialog (const char *title, int flags)
-{
- GnomePrintConfig *config;
- GtkWidget *dialog;
-
- config = e_print_load_config ();
- dialog = e_print_get_dialog_with_config (title, flags, config);
- g_object_unref (config);
-
- return dialog;
-}
-
-GtkWidget *
-e_print_get_dialog_with_config (const char *title, int flags, GnomePrintConfig *config)
-{
- GtkWidget *dialog;
-
- dialog = g_object_new (GNOME_TYPE_PRINT_DIALOG, "print_config", config, NULL);
- gnome_print_dialog_construct (GNOME_PRINT_DIALOG (dialog), title, flags);
-
- g_signal_connect(dialog, "response", G_CALLBACK(print_dialog_response), NULL);
-
- return dialog;
-}
diff --git a/e-util/e-print.h b/e-util/e-print.h
deleted file mode 100644
index 738da0f418..0000000000
--- a/e-util/e-print.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* e-print.c - Uniform print setting/dialog routines for Evolution
- *
- * Copyright (C) 2005 Novell, Inc.
- *
- * Authors: JP Rosevear <jpr@novell.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <gtk/gtk.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
-
-#ifndef __E_PRINT__
-#define __E_PRINT__
-
-G_BEGIN_DECLS
-
-GnomePrintConfig *e_print_load_config (void);
-void e_print_save_config (GnomePrintConfig *config);
-
-GtkWidget *e_print_get_dialog (const char *title, int flags);
-GtkWidget *e_print_get_dialog_with_config (const char *title, int flags, GnomePrintConfig *config);
-
-G_END_DECLS
-
-#endif
diff --git a/e-util/e-request.c b/e-util/e-request.c
deleted file mode 100644
index f105ce1bd3..0000000000
--- a/e-util/e-request.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-request.c
- *
- * Copyright (C) 2000, 2001 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-request.h"
-
-#include <gtk/gtkbox.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkstock.h>
-
-
-/**
- * e_request_string:
- * @parent: parent window, or %NULL
- * @title: the dialog title (in the locale character set)
- * @prompt: the prompt (in the locale character set)
- * @default: default value (in UTF8)
- *
- * Request a string from the user.
- *
- * Return value: %NULL if the user cancelled the dialog, the inserted
- * string (in UTF8) otherwise. The string must be freed by the caller.
- **/
-char *
-e_request_string (GtkWindow *parent,
- const char *title,
- const char *prompt,
- const char *default_string)
-{
- GtkWidget *prompt_label;
- char *text;
- GtkWidget *dialog;
- GtkWidget *entry;
- GtkWidget *vbox;
-
- g_return_val_if_fail (title != NULL, NULL);
- g_return_val_if_fail (prompt != NULL, NULL);
-
- dialog = gtk_dialog_new_with_buttons (title, parent,
- GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- NULL);
- gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
- gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
- gtk_window_set_default_size (GTK_WINDOW (dialog), 275, -1);
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 6);
-
- vbox = GTK_DIALOG (dialog)->vbox;
-
- prompt_label = gtk_label_new (prompt);
- gtk_box_pack_start (GTK_BOX (vbox), prompt_label, TRUE, TRUE, 6);
- gtk_box_set_spacing (GTK_BOX (vbox), 6);
-
- entry = gtk_entry_new ();
- gtk_entry_set_text (GTK_ENTRY (entry), default_string);
- gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1);
- gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
- gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 3);
-
- atk_object_set_description (gtk_widget_get_accessible (entry), prompt);
-
- gtk_widget_grab_focus (entry);
-
- gtk_widget_show (prompt_label);
- gtk_widget_show (entry);
- gtk_widget_show (dialog);
-
- switch (gtk_dialog_run (GTK_DIALOG (dialog))) {
- case GTK_RESPONSE_OK:
- text = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
- break;
- default:
- text = NULL;
- break;
- }
-
- gtk_widget_destroy (dialog);
-
- return text;
-}
diff --git a/e-util/e-request.h b/e-util/e-request.h
deleted file mode 100644
index 7ebb70c43f..0000000000
--- a/e-util/e-request.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-request.c
- *
- * Copyright (C) 2000, 2001 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Ettore Perazzoli
- */
-
-#ifndef E_REQUEST_H
-#define E_REQUEST_H
-
-#include <gtk/gtkwindow.h>
-
-char *e_request_string (GtkWindow *parent,
- const char *title,
- const char *prompt,
- const char *default_string);
-
-#endif
diff --git a/e-util/e-signature-list.c b/e-util/e-signature-list.c
deleted file mode 100644
index e7812f0181..0000000000
--- a/e-util/e-signature-list.c
+++ /dev/null
@@ -1,471 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-
-#include "e-uid.h"
-
-#include "e-util-marshal.h"
-
-#include "e-signature-list.h"
-
-struct _ESignatureListPrivate {
- GConfClient *gconf;
- guint notify_id;
- gboolean resave;
-};
-
-enum {
- SIGNATURE_ADDED,
- SIGNATURE_CHANGED,
- SIGNATURE_REMOVED,
- LAST_SIGNAL
-};
-
-static guint signals [LAST_SIGNAL] = { 0 };
-
-static void e_signature_list_class_init (ESignatureListClass *klass);
-static void e_signature_list_init (ESignatureList *list, ESignatureListClass *klass);
-static void e_signature_list_finalize (GObject *object);
-static void e_signature_list_dispose (GObject *object);
-
-
-static EListClass *parent_class = NULL;
-
-
-GType
-e_signature_list_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- GTypeInfo type_info = {
- sizeof (ESignatureListClass),
- NULL, NULL,
- (GClassInitFunc) e_signature_list_class_init,
- NULL, NULL,
- sizeof (ESignatureList),
- 0,
- (GInstanceInitFunc) e_signature_list_init,
- };
-
- type = g_type_register_static (E_TYPE_LIST, "ESignatureList", &type_info, 0);
- }
-
- return type;
-}
-
-
-static void
-e_signature_list_class_init (ESignatureListClass *klass)
-{
- GObjectClass *object_class = (GObjectClass *) klass;
-
- parent_class = g_type_class_ref (E_TYPE_LIST);
-
- /* virtual method override */
- object_class->dispose = e_signature_list_dispose;
- object_class->finalize = e_signature_list_finalize;
-
- /* signals */
- signals[SIGNATURE_ADDED] =
- g_signal_new ("signature-added",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (ESignatureListClass, signature_added),
- NULL, NULL,
- e_util_marshal_NONE__OBJECT,
- G_TYPE_NONE, 1,
- E_TYPE_SIGNATURE);
- signals[SIGNATURE_CHANGED] =
- g_signal_new ("signature-changed",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (ESignatureListClass, signature_changed),
- NULL, NULL,
- e_util_marshal_NONE__OBJECT,
- G_TYPE_NONE, 1,
- E_TYPE_SIGNATURE);
- signals[SIGNATURE_REMOVED] =
- g_signal_new ("signature-removed",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (ESignatureListClass, signature_removed),
- NULL, NULL,
- e_util_marshal_NONE__OBJECT,
- G_TYPE_NONE, 1,
- E_TYPE_SIGNATURE);
-}
-
-static void
-e_signature_list_init (ESignatureList *list, ESignatureListClass *klass)
-{
- list->priv = g_new0 (struct _ESignatureListPrivate, 1);
-}
-
-static void
-e_signature_list_dispose (GObject *object)
-{
- ESignatureList *list = (ESignatureList *) object;
-
- if (list->priv->gconf) {
- if (list->priv->notify_id != 0)
- gconf_client_notify_remove (list->priv->gconf, list->priv->notify_id);
- g_object_unref (list->priv->gconf);
- list->priv->gconf = NULL;
- }
-
- G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-static void
-e_signature_list_finalize (GObject *object)
-{
- ESignatureList *list = (ESignatureList *) object;
-
- g_free (list->priv);
-
- G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-static GSList *
-add_autogen (ESignatureList *list, GSList *new_sigs)
-{
- ESignature *autogen;
-
- autogen = e_signature_new ();
- autogen->name = g_strdup ("Autogenerated");
- autogen->autogen = TRUE;
-
- e_list_append (E_LIST (list), autogen);
-
- return g_slist_prepend (new_sigs, autogen);
-}
-
-static void
-gconf_signatures_changed (GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer user_data)
-{
- ESignatureList *signature_list = user_data;
- GSList *list, *l, *n, *new_sigs = NULL;
- gboolean have_autogen = FALSE;
- gboolean resave = FALSE;
- ESignature *signature;
- EList *old_sigs;
- EIterator *iter;
- gboolean found;
- char *uid;
-
- old_sigs = e_list_duplicate (E_LIST (signature_list));
-
- list = gconf_client_get_list (client, "/apps/evolution/mail/signatures", GCONF_VALUE_STRING, NULL);
- for (l = list; l; l = l->next) {
- found = FALSE;
- if ((uid = e_signature_uid_from_xml (l->data))) {
- /* See if this is an existing signature */
- for (iter = e_list_get_iterator (old_sigs); e_iterator_is_valid (iter); e_iterator_next (iter)) {
- signature = (ESignature *) e_iterator_get (iter);
- if (!strcmp (signature->uid, uid)) {
- /* The signature still exists, so remove
- * it from "old_sigs" and update it.
- */
- found = TRUE;
- e_iterator_delete (iter);
- if (e_signature_set_from_xml (signature, l->data))
- g_signal_emit (signature_list, signals[SIGNATURE_CHANGED], 0, signature);
-
- have_autogen |= signature->autogen;
-
- break;
- }
- }
-
- g_object_unref (iter);
- }
-
- if (!found) {
- /* Must be a new signature */
- signature = e_signature_new_from_xml (l->data);
- have_autogen |= signature->autogen;
- if (!signature->uid) {
- signature->uid = e_uid_new ();
- resave = TRUE;
- }
-
- e_list_append (E_LIST (signature_list), signature);
- new_sigs = g_slist_prepend (new_sigs, signature);
- }
-
- g_free (uid);
- }
-
- if (!have_autogen) {
- new_sigs = add_autogen (signature_list, new_sigs);
- have_autogen = TRUE;
- resave = TRUE;
- }
-
- if (new_sigs != NULL) {
- /* Now emit signals for each added signature. */
- l = g_slist_reverse (new_sigs);
- while (l != NULL) {
- n = l->next;
- signature = l->data;
- g_signal_emit (signature_list, signals[SIGNATURE_ADDED], 0, signature);
- g_object_unref (signature);
- g_slist_free_1 (l);
- l = n;
- }
- }
-
- /* Anything left in old_sigs must have been deleted */
- for (iter = e_list_get_iterator (old_sigs); e_iterator_is_valid (iter); e_iterator_next (iter)) {
- signature = (ESignature *) e_iterator_get (iter);
- e_list_remove (E_LIST (signature_list), signature);
- g_signal_emit (signature_list, signals[SIGNATURE_REMOVED], 0, signature);
- }
-
- g_object_unref (iter);
- g_object_unref (old_sigs);
-
- signature_list->priv->resave = resave;
-}
-
-static void *
-copy_func (const void *data, void *closure)
-{
- GObject *object = (GObject *)data;
-
- g_object_ref (object);
-
- return object;
-}
-
-static void
-free_func (void *data, void *closure)
-{
- g_object_unref (data);
-}
-
-/**
- * e_signature_list_new:
- * @gconf: a #GConfClient
- *
- * Reads the list of signaturess from @gconf and listens for changes.
- * Will emit #signature_added, #signature_changed, and #signature_removed
- * signals according to notifications from GConf.
- *
- * You can modify the list using e_list_append(), e_list_remove(), and
- * e_iterator_delete(). After adding, removing, or changing accounts,
- * you must call e_signature_list_save() to push the changes back to
- * GConf.
- *
- * Return value: the list of signatures
- **/
-ESignatureList *
-e_signature_list_new (GConfClient *gconf)
-{
- ESignatureList *signature_list;
-
- g_return_val_if_fail (GCONF_IS_CLIENT (gconf), NULL);
-
- signature_list = g_object_new (E_TYPE_SIGNATURE_LIST, NULL);
- e_signature_list_construct (signature_list, gconf);
-
- return signature_list;
-}
-
-void
-e_signature_list_construct (ESignatureList *signature_list, GConfClient *gconf)
-{
- g_return_if_fail (GCONF_IS_CLIENT (gconf));
-
- e_list_construct (E_LIST (signature_list), copy_func, free_func, NULL);
- signature_list->priv->gconf = gconf;
- g_object_ref (gconf);
-
- gconf_client_add_dir (signature_list->priv->gconf,
- "/apps/evolution/mail/signatures",
- GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
-
- signature_list->priv->notify_id =
- gconf_client_notify_add (signature_list->priv->gconf,
- "/apps/evolution/mail/signatures",
- gconf_signatures_changed, signature_list,
- NULL, NULL);
-
- gconf_signatures_changed (signature_list->priv->gconf,
- signature_list->priv->notify_id,
- NULL, signature_list);
-
- if (signature_list->priv->resave) {
- e_signature_list_save (signature_list);
- signature_list->priv->resave = FALSE;
- }
-}
-
-
-/**
- * e_signature_list_save:
- * @signature_list: an #ESignatureList
- *
- * Saves @signature_list to GConf. Signals will be emitted for changes.
- **/
-void
-e_signature_list_save (ESignatureList *signature_list)
-{
- GSList *list = NULL;
- ESignature *signature;
- EIterator *iter;
- char *xmlbuf;
-
- for (iter = e_list_get_iterator (E_LIST (signature_list));
- e_iterator_is_valid (iter);
- e_iterator_next (iter)) {
- signature = (ESignature *) e_iterator_get (iter);
-
- if ((xmlbuf = e_signature_to_xml (signature)))
- list = g_slist_append (list, xmlbuf);
- }
-
- g_object_unref (iter);
-
- gconf_client_set_list (signature_list->priv->gconf,
- "/apps/evolution/mail/signatures",
- GCONF_VALUE_STRING, list, NULL);
-
- while (list) {
- g_free (list->data);
- list = g_slist_remove (list, list->data);
- }
-
- gconf_client_suggest_sync (signature_list->priv->gconf, NULL);
-}
-
-
-/**
- * e_signature_list_add:
- * @signatures: signature list
- * @signature: signature to add
- *
- * Add an signature to the signature list. Will emit the signature-changed
- * event.
- **/
-void
-e_signature_list_add (ESignatureList *signatures, ESignature *signature)
-{
- e_list_append ((EList *) signatures, signature);
- g_signal_emit (signatures, signals[SIGNATURE_ADDED], 0, signature);
-}
-
-
-/**
- * e_signature_list_change:
- * @signatures: signature list
- * @signature: signature to change
- *
- * Signal that the details of an signature have changed.
- **/
-void
-e_signature_list_change (ESignatureList *signatures, ESignature *signature)
-{
- /* maybe the signature should do this itself ... */
- g_signal_emit (signatures, signals[SIGNATURE_CHANGED], 0, signature);
-}
-
-
-/**
- * e_signature_list_remove:
- * @signatures: signature list
- * @signature: signature
- *
- * Remove an signature from the signature list, and emit the
- * signature-removed signal. If the signature was the default signature,
- * then reset the default to the first signature.
- **/
-void
-e_signature_list_remove (ESignatureList *signatures, ESignature *signature)
-{
- /* not sure if need to ref but no harm */
- g_object_ref (signature);
- e_list_remove ((EList *) signatures, signature);
- g_signal_emit (signatures, signals[SIGNATURE_REMOVED], 0, signature);
- g_object_unref (signature);
-}
-
-
-/**
- * e_signature_list_find:
- * @signatures: signature list
- * @type: Type of search.
- * @key: Search key.
- *
- * Perform a search of the signature list on a single key.
- *
- * @type must be set from one of the following search types:
- * E_SIGNATURE_FIND_NAME - Find a signature by signature name.
- * E_SIGNATURE_FIND_UID - Find a signature based on UID
- *
- * Return value: The signature or NULL if it doesn't exist.
- **/
-const ESignature *
-e_signature_list_find (ESignatureList *signatures, e_signature_find_t type, const char *key)
-{
- const ESignature *signature = NULL;
- EIterator *it;
-
- /* this could use a callback for more flexibility ...
- ... but this makes the common cases easier */
-
- if (!key)
- return NULL;
-
- for (it = e_list_get_iterator ((EList *) signatures);
- e_iterator_is_valid (it);
- e_iterator_next (it)) {
- int found = 0;
-
- signature = (const ESignature *) e_iterator_get (it);
-
- switch (type) {
- case E_SIGNATURE_FIND_NAME:
- found = strcmp (signature->name, key) == 0;
- break;
- case E_SIGNATURE_FIND_UID:
- found = strcmp (signature->uid, key) == 0;
- break;
- }
-
- if (found)
- break;
-
- signature = NULL;
- }
-
- g_object_unref (it);
-
- return signature;
-}
diff --git a/e-util/e-signature-list.h b/e-util/e-signature-list.h
deleted file mode 100644
index cec82f9c6f..0000000000
--- a/e-util/e-signature-list.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifndef __E_SIGNATURE_LIST__
-#define __E_SIGNATURE_LIST__
-
-#include <e-util/e-list.h>
-#include <e-util/e-signature.h>
-
-#include <gconf/gconf-client.h>
-
-#define E_TYPE_SIGNATURE_LIST (e_signature_list_get_type ())
-#define E_SIGNATURE_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_SIGNATURE_LIST, ESignatureList))
-#define E_SIGNATURE_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_SIGNATURE_LIST, ESignatureListClass))
-#define E_IS_SIGNATURE_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_SIGNATURE_LIST))
-#define E_IS_SIGNATURE_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_SIGNATURE_LIST))
-
-typedef struct _ESignatureList ESignatureList;
-typedef struct _ESignatureListClass ESignatureListClass;
-
-/* search options for the find command */
-typedef enum {
- E_SIGNATURE_FIND_NAME,
- E_SIGNATURE_FIND_UID,
-} e_signature_find_t;
-
-struct _ESignatureList {
- EList parent_object;
-
- struct _ESignatureListPrivate *priv;
-};
-
-struct _ESignatureListClass {
- EListClass parent_class;
-
- /* signals */
- void (* signature_added) (ESignatureList *, ESignature *);
- void (* signature_changed) (ESignatureList *, ESignature *);
- void (* signature_removed) (ESignatureList *, ESignature *);
-};
-
-
-GType e_signature_list_get_type (void);
-
-ESignatureList *e_signature_list_new (GConfClient *gconf);
-void e_signature_list_construct (ESignatureList *signature_list, GConfClient *gconf);
-
-void e_signature_list_save (ESignatureList *signature_list);
-
-void e_signature_list_add (ESignatureList *signature_list, ESignature *signature);
-void e_signature_list_change (ESignatureList *signature_list, ESignature *signature);
-void e_signature_list_remove (ESignatureList *signature_list, ESignature *signature);
-
-const ESignature *e_signature_list_find (ESignatureList *signature_list, e_signature_find_t type, const char *key);
-
-#endif /* __E_SIGNATURE_LIST__ */
diff --git a/e-util/e-signature.c b/e-util/e-signature.c
deleted file mode 100644
index c02857abb6..0000000000
--- a/e-util/e-signature.c
+++ /dev/null
@@ -1,366 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-
-#include <libxml/tree.h>
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-
-#include <gconf/gconf-client.h>
-
-#include "e-uid.h"
-
-#include "e-signature.h"
-
-
-static void e_signature_class_init (ESignatureClass *klass);
-static void e_signature_init (ESignature *sig, ESignatureClass *klass);
-static void e_signature_finalize (GObject *object);
-
-
-static GObjectClass *parent_class = NULL;
-
-
-GType
-e_signature_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- GTypeInfo type_info = {
- sizeof (ESignatureClass),
- NULL, NULL,
- (GClassInitFunc) e_signature_class_init,
- NULL, NULL,
- sizeof (ESignature),
- 0,
- (GInstanceInitFunc) e_signature_init,
- };
-
- type = g_type_register_static (G_TYPE_OBJECT, "ESignature", &type_info, 0);
- }
-
- return type;
-}
-
-static void
-e_signature_class_init (ESignatureClass *klass)
-{
- GObjectClass *object_class = (GObjectClass *) klass;
-
- parent_class = g_type_class_ref (G_TYPE_OBJECT);
-
- /* virtual method override */
- object_class->finalize = e_signature_finalize;
-}
-
-static void
-e_signature_init (ESignature *sig, ESignatureClass *klass)
-{
- ;
-}
-
-static void
-e_signature_finalize (GObject *object)
-{
- ESignature *sig = (ESignature *) object;
-
- g_free (sig->uid);
- g_free (sig->name);
- g_free (sig->filename);
-
- G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-
-/**
- * e_signature_new:
- *
- * Returns a new signature which can be filled in and
- * added to an #ESignatureList.
- **/
-ESignature *
-e_signature_new (void)
-{
- ESignature *signature;
-
- signature = g_object_new (E_TYPE_SIGNATURE, NULL);
- signature->uid = e_uid_new ();
-
- return signature;
-}
-
-
-/**
- * e_signature_new_from_xml:
- * @xml: an XML signature description
- *
- * Return value: a new #ESignature based on the data in @xml, or %NULL
- * if @xml could not be parsed as valid signature data.
- **/
-ESignature *
-e_signature_new_from_xml (const char *xml)
-{
- ESignature *signature;
-
- signature = g_object_new (E_TYPE_SIGNATURE, NULL);
- if (!e_signature_set_from_xml (signature, xml)) {
- g_object_unref (signature);
- return NULL;
- }
-
- return signature;
-}
-
-
-static gboolean
-xml_set_bool (xmlNodePtr node, const char *name, gboolean *val)
-{
- gboolean bool;
- char *buf;
-
- if ((buf = xmlGetProp (node, name))) {
- bool = (!strcmp (buf, "true") || !strcmp (buf, "yes"));
- xmlFree (buf);
-
- if (bool != *val) {
- *val = bool;
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static gboolean
-xml_set_prop (xmlNodePtr node, const char *name, char **val)
-{
- char *buf, *new_val;
-
- buf = xmlGetProp (node, name);
- new_val = g_strdup (buf);
- xmlFree (buf);
-
- /* We can use strcmp here whether the value is UTF8 or
- * not, since we only care if the bytes changed.
- */
- if (!*val || strcmp (*val, new_val)) {
- g_free (*val);
- *val = new_val;
- return TRUE;
- } else {
- g_free (new_val);
- return FALSE;
- }
-}
-
-static gboolean
-xml_set_content (xmlNodePtr node, char **val)
-{
- char *buf, *new_val;
-
- buf = xmlNodeGetContent (node);
- new_val = g_strdup (buf);
- xmlFree (buf);
-
- /* We can use strcmp here whether the value is UTF8 or
- * not, since we only care if the bytes changed.
- */
- if (!*val || strcmp (*val, new_val)) {
- g_free (*val);
- *val = new_val;
- return TRUE;
- } else {
- g_free (new_val);
- return FALSE;
- }
-}
-
-
-/**
- * e_signature_uid_from_xml:
- * @xml: an XML signature description
- *
- * Return value: the permanent UID of the signature described by @xml
- * (or %NULL if @xml could not be parsed or did not contain a uid).
- * The caller must free this string.
- **/
-char *
-e_signature_uid_from_xml (const char *xml)
-{
- xmlNodePtr node;
- xmlDocPtr doc;
- char *uid = NULL;
-
- if (!(doc = xmlParseDoc ((char *) xml)))
- return NULL;
-
- node = doc->children;
- if (strcmp (node->name, "signature") != 0) {
- xmlFreeDoc (doc);
- return NULL;
- }
-
- xml_set_prop (node, "uid", &uid);
- xmlFreeDoc (doc);
-
- return uid;
-}
-
-
-/**
- * e_signature_set_from_xml:
- * @signature: an #ESignature
- * @xml: an XML signature description.
- *
- * Changes @signature to match @xml.
- *
- * Returns %TRUE if the signature was loaded or %FALSE otherwise.
- **/
-gboolean
-e_signature_set_from_xml (ESignature *signature, const char *xml)
-{
- gboolean changed = FALSE;
- xmlNodePtr node, cur;
- xmlDocPtr doc;
- gboolean bool;
- char *buf;
-
- if (!(doc = xmlParseDoc ((char *) xml)))
- return FALSE;
-
- node = doc->children;
- if (strcmp (node->name, "signature") != 0) {
- xmlFreeDoc (doc);
- return FALSE;
- }
-
- if (!signature->uid)
- xml_set_prop (node, "uid", &signature->uid);
-
- changed |= xml_set_prop (node, "name", &signature->name);
- changed |= xml_set_bool (node, "auto", &signature->autogen);
-
- if (signature->autogen) {
- /* we're done */
- g_free (signature->filename);
- signature->filename = NULL;
- signature->script = FALSE;
- signature->html = FALSE;
- xmlFreeDoc (doc);
-
- return changed;
- }
-
- buf = NULL;
- xml_set_prop (node, "format", &buf);
- if (buf && !strcmp (buf, "text/html"))
- bool = TRUE;
- else
- bool = FALSE;
- g_free (buf);
-
- if (signature->html != bool) {
- signature->html = bool;
- changed = TRUE;
- }
-
- cur = node->children;
- while (cur) {
- if (!strcmp (cur->name, "filename")) {
- changed |= xml_set_content (cur, &signature->filename);
- changed |= xml_set_bool (cur, "script", &signature->script);
- break;
- } else if (!strcmp (cur->name, "script")) {
- /* this is for handling 1.4 signature script definitions */
- changed |= xml_set_content (cur, &signature->filename);
- if (!signature->script) {
- signature->script = TRUE;
- changed = TRUE;
- }
- break;
- }
-
- cur = cur->next;
- }
-
- xmlFreeDoc (doc);
-
- return changed;
-}
-
-
-/**
- * e_signature_to_xml:
- * @signature: an #ESignature
- *
- * Return value: an XML representation of @signature, which the caller
- * must free.
- **/
-char *
-e_signature_to_xml (ESignature *signature)
-{
- char *xmlbuf, *tmp;
- xmlNodePtr root, node;
- xmlDocPtr doc;
- int n;
-
- doc = xmlNewDoc ("1.0");
-
- root = xmlNewDocNode (doc, NULL, "signature", NULL);
- xmlDocSetRootElement (doc, root);
-
- xmlSetProp (root, "name", signature->name);
- xmlSetProp (root, "uid", signature->uid);
- xmlSetProp (root, "auto", signature->autogen ? "true" : "false");
-
- if (!signature->autogen) {
- xmlSetProp (root, "format", signature->html ? "text/html" : "text/plain");
-
- if (signature->filename) {
- node = xmlNewTextChild (root, NULL, "filename", signature->filename);
- if (signature->script)
- xmlSetProp (node, "script", "true");
- }
- } else {
- /* this is to make Evolution-1.4 and older 1.5 versions happy */
- xmlSetProp (root, "format", "text/html");
- }
-
- xmlDocDumpMemory (doc, (xmlChar **) &xmlbuf, &n);
- xmlFreeDoc (doc);
-
- /* remap to glib memory */
- tmp = g_malloc (n + 1);
- memcpy (tmp, xmlbuf, n);
- tmp[n] = '\0';
- xmlFree (xmlbuf);
-
- return tmp;
-}
-
diff --git a/e-util/e-signature.h b/e-util/e-signature.h
deleted file mode 100644
index b30b475c1a..0000000000
--- a/e-util/e-signature.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifndef __E_SIGNATURE_H__
-#define __E_SIGNATURE_H__
-
-#include <glib-object.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define E_TYPE_SIGNATURE (e_signature_get_type ())
-#define E_SIGNATURE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_SIGNATURE, ESignature))
-#define E_SIGNATURE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_SIGNATURE, ESignatureClass))
-#define E_IS_SIGNATURE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_SIGNATURE))
-#define E_IS_SIGNATURE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_SIGNATURE))
-
-typedef struct _ESignature ESignature;
-typedef struct _ESignatureClass ESignatureClass;
-
-struct _ESignature {
- GObject parent_object;
-
- gboolean autogen;
- gboolean script;
- gboolean html;
-
- char *filename;
- char *name;
- char *uid;
-};
-
-struct _ESignatureClass {
- GObjectClass parent_class;
-
-};
-
-
-GType e_signature_get_type (void);
-
-ESignature *e_signature_new (void);
-ESignature *e_signature_new_from_xml (const char *xml);
-
-char *e_signature_uid_from_xml (const char *xml);
-
-gboolean e_signature_set_from_xml (ESignature *sig, const char *xml);
-
-char *e_signature_to_xml (ESignature *sig);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __E_SIGNATURE_H__ */
diff --git a/e-util/e-time-utils.c b/e-util/e-time-utils.c
deleted file mode 100644
index 8f05427a81..0000000000
--- a/e-util/e-time-utils.c
+++ /dev/null
@@ -1,492 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Time utility functions
- *
- * Author:
- * Damon Chaplin (damon@ximian.com)
- *
- * (C) 2001 Ximian, Inc.
- */
-
-#include <config.h>
-
-#ifdef __linux__
-/* We need this to get a prototype for strptime. */
-#define _GNU_SOURCE
-#endif /* __linux__ */
-
-#include <time.h>
-#include <sys/time.h>
-#include <gal/widgets/e-unicode.h>
-
-#ifdef __linux__
-#undef _GNU_SOURCE
-#endif /* __linux__ */
-
-#include <string.h>
-#include <ctype.h>
-#include <glib.h>
-#include <libgnome/gnome-i18n.h>
-#include <gal/util/e-util.h>
-#include "e-time-utils.h"
-
-
-/* Returns whether a string is NULL, empty, or full of whitespace */
-static gboolean
-string_is_empty (const char *value)
-{
- const char *p;
- gboolean empty = TRUE;
-
- if (value) {
- p = value;
- while (*p) {
- if (!isspace (*p)) {
- empty = FALSE;
- break;
- }
- p++;
- }
- }
- return empty;
-}
-
-
-/* Takes a number of format strings for strptime() and attempts to parse a
- * string with them.
- */
-static ETimeParseStatus
-parse_with_strptime (const char *value, struct tm *result, const char **formats, int n_formats)
-{
- const char *parse_end = NULL, *pos;
- gchar *locale_str;
- gchar *format_str;
- ETimeParseStatus parse_ret;
- gboolean parsed = FALSE;
- int i;
-
- if (string_is_empty (value)) {
- memset (result, 0, sizeof (*result));
- result->tm_isdst = -1;
- return E_TIME_PARSE_NONE;
- }
-
- locale_str = e_utf8_to_locale_string (value);
-
- pos = (const char *) locale_str;
-
- /* Skip whitespace */
- while (isspace (*pos))
- pos++;
-
- /* Try each of the formats in turn */
-
- for (i = 0; i < n_formats; i++) {
- memset (result, 0, sizeof (*result));
- format_str = e_utf8_to_locale_string (formats[i]);
- parse_end = strptime (pos, format_str, result);
- g_free (format_str);
- if (parse_end) {
- parsed = TRUE;
- break;
- }
- }
-
- result->tm_isdst = -1;
-
- parse_ret = E_TIME_PARSE_INVALID;
-
- /* If we parsed something, make sure we parsed the entire string. */
- if (parsed) {
- /* Skip whitespace */
- while (isspace (*parse_end))
- parse_end++;
-
- if (*parse_end == '\0')
- parse_ret = E_TIME_PARSE_OK;
- }
-
- g_free (locale_str);
-
- return (parse_ret);
-
-}
-
-
-/* Returns TRUE if the locale has 'am' and 'pm' strings defined, in which
- case the user can choose between 12 and 24-hour time formats. */
-static gboolean
-locale_supports_12_hour_format (void)
-{
- struct tm tmp_tm = { 0 };
- char s[16];
-
- e_utf8_strftime (s, sizeof (s), "%p", &tmp_tm);
- return s[0] != '\0';
-}
-
-
-/*
- * Parses a string containing a date and a time. The date is expected to be
- * in a format something like "Wed 3/13/00 14:20:00", though we use gettext
- * to support the appropriate local formats and we try to accept slightly
- * different formats, e.g. the weekday can be skipped and we can accept 12-hour
- * formats with an am/pm string.
- *
- * Returns E_TIME_PARSE_OK if it could not be parsed, E_TIME_PARSE_NONE if it
- * was empty, or E_TIME_PARSE_INVALID if it couldn't be parsed.
- */
-ETimeParseStatus
-e_time_parse_date_and_time (const char *value,
- struct tm *result)
-{
- struct tm *today_tm;
- time_t t;
- const char *format[16];
- int num_formats = 0;
- gboolean use_12_hour_formats = locale_supports_12_hour_format ();
- ETimeParseStatus status;
-
- if (string_is_empty (value)) {
- memset (result, 0, sizeof (*result));
- result->tm_isdst = -1;
- return E_TIME_PARSE_NONE;
- }
-
- /* We'll parse the whole date and time in one go, otherwise we get
- into i18n problems. We attempt to parse with several formats,
- longest first. Note that we only use the '%p' specifier if the
- locale actually has 'am' and 'pm' strings defined, otherwise we
- will get incorrect results. Note also that we try to use exactly
- the same strings as in e_time_format_date_and_time(), to try to
- avoid i18n problems. We also use cut-down versions, so users don't
- have to type in the weekday or the seconds, for example.
- Note that all these formats include the full date, and the time
- will be set to 00:00:00 before parsing, so we don't need to worry
- about filling in any missing fields after parsing. */
-
- /*
- * Try the full times, with the weekday. Then try without seconds,
- * and without minutes, and finally with no time at all.
- */
- if (use_12_hour_formats) {
- /* strptime format of a weekday, a date and a time,
- in 12-hour format. */
- format[num_formats++] = _("%a %m/%d/%Y %I:%M:%S %p");
- }
-
- /* strptime format of a weekday, a date and a time,
- in 24-hour format. */
- format[num_formats++] = _("%a %m/%d/%Y %H:%M:%S");
-
- if (use_12_hour_formats) {
- /* strptime format of a weekday, a date and a time,
- in 12-hour format, without seconds. */
- format[num_formats++] = _("%a %m/%d/%Y %I:%M %p");
- }
-
- /* strptime format of a weekday, a date and a time,
- in 24-hour format, without seconds. */
- format[num_formats++] = _("%a %m/%d/%Y %H:%M");
-
- if (use_12_hour_formats) {
- /* strptime format of a weekday, a date and a time,
- in 12-hour format, without minutes or seconds. */
- format[num_formats++] = _("%a %m/%d/%Y %I %p");
- }
-
- /* strptime format of a weekday, a date and a time,
- in 24-hour format, without minutes or seconds. */
- format[num_formats++] = _("%a %m/%d/%Y %H");
-
- /* strptime format of a weekday and a date. */
- format[num_formats++] = _("%a %m/%d/%Y");
-
-
- /*
- * Now try all the above formats again, but without the weekday.
- */
- if (use_12_hour_formats) {
- /* strptime format of a date and a time, in 12-hour format. */
- format[num_formats++] = _("%m/%d/%Y %I:%M:%S %p");
- }
-
- /* strptime format of a date and a time, in 24-hour format. */
- format[num_formats++] = _("%m/%d/%Y %H:%M:%S");
-
- if (use_12_hour_formats) {
- /* strptime format of a date and a time, in 12-hour format,
- without seconds. */
- format[num_formats++] = _("%m/%d/%Y %I:%M %p");
- }
-
- /* strptime format of a date and a time, in 24-hour format,
- without seconds. */
- format[num_formats++] = _("%m/%d/%Y %H:%M");
-
- if (use_12_hour_formats) {
- /* strptime format of a date and a time, in 12-hour format,
- without minutes or seconds. */
- format[num_formats++] = _("%m/%d/%Y %I %p");
- }
-
- /* strptime format of a date and a time, in 24-hour format,
- without minutes or seconds. */
- format[num_formats++] = _("%m/%d/%Y %H");
-
- /* strptime format of a weekday and a date. */
- format[num_formats++] = _("%m/%d/%Y");
-
-
- status = parse_with_strptime (value, result, format, num_formats);
- /* Note that we checked if it was empty already, so it is either OK
- or INVALID here. */
- if (status == E_TIME_PARSE_OK) {
- /* If a 2-digit year was used we use the current century. */
- if (result->tm_year < 0) {
- t = time (NULL);
- today_tm = localtime (&t);
-
- /* This should convert it into a value from 0 to 99. */
- result->tm_year += 1900;
-
- /* Now add on the century. */
- result->tm_year += today_tm->tm_year
- - (today_tm->tm_year % 100);
- }
- } else {
- /* Now we try to just parse a time, assuming the current day.*/
- status = e_time_parse_time (value, result);
- if (status == E_TIME_PARSE_OK) {
- /* We fill in the current day. */
- t = time (NULL);
- today_tm = localtime (&t);
- result->tm_mday = today_tm->tm_mday;
- result->tm_mon = today_tm->tm_mon;
- result->tm_year = today_tm->tm_year;
- }
- }
-
- return status;
-}
-
-/**
- * e_time_parse_date:
- * @value: A date string.
- * @result: Return value for the parsed date.
- *
- * Takes in a date string entered by the user and tries to convert it to
- * a struct tm.
- *
- * Return value: Result code indicating whether the @value was an empty
- * string, a valid date, or an invalid date.
- **/
-ETimeParseStatus
-e_time_parse_date (const char *value, struct tm *result)
-{
- const char *format[2];
- struct tm *today_tm;
- time_t t;
- ETimeParseStatus status;
-
- g_return_val_if_fail (value != NULL, E_TIME_PARSE_INVALID);
- g_return_val_if_fail (result != NULL, E_TIME_PARSE_INVALID);
-
- /* strptime format of a weekday and a date. */
- format[0] = _("%a %m/%d/%Y");
-
- /* This is the preferred date format for the locale. */
- format[1] = _("%m/%d/%Y");
-
- status = parse_with_strptime (value, result, format, sizeof (format) / sizeof (format[0]));
- if (status == E_TIME_PARSE_OK) {
- /* If a 2-digit year was used we use the current century. */
- if (result->tm_year < 0) {
- t = time (NULL);
- today_tm = localtime (&t);
-
- /* This should convert it into a value from 0 to 99. */
- result->tm_year += 1900;
-
- /* Now add on the century. */
- result->tm_year += today_tm->tm_year
- - (today_tm->tm_year % 100);
- }
- }
-
- return status;
-}
-
-
-/*
- * Parses a string containing a time. It is expected to be in a format
- * something like "14:20:00", though we use gettext to support the appropriate
- * local formats and we try to accept slightly different formats, e.g. we can
- * accept 12-hour formats with an am/pm string.
- *
- * Returns E_TIME_PARSE_OK if it could not be parsed, E_TIME_PARSE_NONE if it
- * was empty, or E_TIME_PARSE_INVALID if it couldn't be parsed.
- */
-ETimeParseStatus
-e_time_parse_time (const char *value, struct tm *result)
-{
- const char *format[6];
- int num_formats = 0;
- gboolean use_12_hour_formats = locale_supports_12_hour_format ();
-
- if (use_12_hour_formats) {
- /* strptime format for a time of day, in 12-hour format. */
- format[num_formats++] = _("%I:%M:%S %p");
- }
-
- /* strptime format for a time of day, in 24-hour format. */
- format[num_formats++] = _("%H:%M:%S");
-
- if (use_12_hour_formats) {
- /* strptime format for time of day, without seconds,
- in 12-hour format. */
- format[num_formats++] = _("%I:%M %p");
- }
-
- /* strptime format for time of day, without seconds 24-hour format. */
- format[num_formats++] = _("%H:%M");
-
- if (use_12_hour_formats) {
- /* strptime format for hour and AM/PM, 12-hour format. */
- format[num_formats++] = _("%I %p");
- }
-
- /* strptime format for hour, 24-hour format. */
- format[num_formats++] = "%H";
-
- return parse_with_strptime (value, result, format, num_formats);
-}
-
-
-/* Creates a string representation of a time value and stores it in buffer.
- buffer_size should be about 64 to be safe. If show_midnight is FALSE, and
- the time is midnight, then we just show the date. If show_zero_seconds
- is FALSE, then if the time has zero seconds only the hour and minute are
- shown. */
-void
-e_time_format_date_and_time (struct tm *date_tm,
- gboolean use_24_hour_format,
- gboolean show_midnight,
- gboolean show_zero_seconds,
- char *buffer,
- int buffer_size)
-{
- char *format;
-
- if (!show_midnight && date_tm->tm_hour == 0
- && date_tm->tm_min == 0 && date_tm->tm_sec == 0) {
- /* strftime format of a weekday and a date. */
- format = _("%a %m/%d/%Y");
- } else if (use_24_hour_format) {
- if (!show_zero_seconds && date_tm->tm_sec == 0)
- /* strftime format of a weekday, a date and a
- time, in 24-hour format, without seconds. */
- format = _("%a %m/%d/%Y %H:%M");
- else
- /* strftime format of a weekday, a date and a
- time, in 24-hour format. */
- format = _("%a %m/%d/%Y %H:%M:%S");
- } else {
- if (!show_zero_seconds && date_tm->tm_sec == 0)
- /* strftime format of a weekday, a date and a
- time, in 12-hour format, without seconds. */
- format = _("%a %m/%d/%Y %I:%M %p");
- else
- /* strftime format of a weekday, a date and a
- time, in 12-hour format. */
- format = _("%a %m/%d/%Y %I:%M:%S %p");
- }
-
- /* strftime returns 0 if the string doesn't fit, and leaves the buffer
- undefined, so we set it to the empty string in that case. */
- if (e_utf8_strftime (buffer, buffer_size, format, date_tm) == 0)
- buffer[0] = '\0';
-}
-
-
-/* Creates a string representation of a time value and stores it in buffer.
- buffer_size should be about 64 to be safe. */
-void
-e_time_format_time (struct tm *date_tm,
- gboolean use_24_hour_format,
- gboolean show_zero_seconds,
- char *buffer,
- int buffer_size)
-{
- char *format;
-
- if (use_24_hour_format) {
- if (!show_zero_seconds && date_tm->tm_sec == 0)
- /* strftime format of a time in 24-hour format,
- without seconds. */
- format = _("%H:%M");
- else
- /* strftime format of a time in 24-hour format. */
- format = _("%H:%M:%S");
- } else {
- if (!show_zero_seconds && date_tm->tm_sec == 0)
- /* strftime format of a time in 12-hour format,
- without seconds. */
- format = _("%I:%M %p");
- else
- /* strftime format of a time in 12-hour format. */
- format = _("%I:%M:%S %p");
- }
-
- /* strftime returns 0 if the string doesn't fit, and leaves the buffer
- undefined, so we set it to the empty string in that case. */
- if (e_utf8_strftime (buffer, buffer_size, format, date_tm) == 0)
- buffer[0] = '\0';
-}
-
-
-/* Like mktime(3), but assumes UTC instead of local timezone. */
-time_t
-e_mktime_utc (struct tm *tm)
-{
- time_t tt;
-
- tm->tm_isdst = -1;
- tt = mktime (tm);
-
-#if defined (HAVE_TM_GMTOFF)
- tt += tm->tm_gmtoff;
-#elif defined (HAVE_TIMEZONE)
- if (tm->tm_isdst > 0) {
- #if defined (HAVE_ALTZONE)
- tt -= altzone;
- #else /* !defined (HAVE_ALTZONE) */
- tt -= (timezone - 3600);
- #endif
- } else
- tt -= timezone;
-#endif
-
- return tt;
-}
-
-/* Like localtime_r(3), but also returns an offset in seconds after UTC.
- (Calling gmtime with tt + offset would generate the same tm) */
-void
-e_localtime_with_offset (time_t tt, struct tm *tm, int *offset)
-{
- localtime_r (&tt, tm);
-
-#if defined (HAVE_TM_GMTOFF)
- *offset = tm->tm_gmtoff;
-#elif defined (HAVE_TIMEZONE)
- if (tm->tm_isdst > 0) {
- #if defined (HAVE_ALTZONE)
- *offset = -altzone;
- #else /* !defined (HAVE_ALTZONE) */
- *offset = -(timezone - 3600);
- #endif
- } else
- *offset = -timezone;
-#endif
-}
diff --git a/e-util/e-time-utils.h b/e-util/e-time-utils.h
deleted file mode 100644
index 0b081dadd4..0000000000
--- a/e-util/e-time-utils.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Time utility functions
- *
- * Author:
- * Damon Chaplin (damon@ximian.com)
- *
- * (C) 2001 Ximian, Inc.
- */
-
-#ifndef E_TIME_UTILS
-#define E_TIME_UTILS
-
-#include <time.h>
-#include <glib.h>
-
-typedef enum {
- E_TIME_PARSE_OK,
- E_TIME_PARSE_NONE,
- E_TIME_PARSE_INVALID
-} ETimeParseStatus;
-
-/* Tries to parse a string containing a date and time. */
-ETimeParseStatus e_time_parse_date_and_time (const char *value,
- struct tm *result);
-
-/* Tries to parse a string containing a date. */
-ETimeParseStatus e_time_parse_date (const char *value,
- struct tm *result);
-
-/* Tries to parse a string containing a time. */
-ETimeParseStatus e_time_parse_time (const char *value,
- struct tm *result);
-
-/* Turns a struct tm into a string like "Wed 3/12/00 12:00:00 AM". */
-void e_time_format_date_and_time (struct tm *date_tm,
- gboolean use_24_hour_format,
- gboolean show_midnight,
- gboolean show_zero_seconds,
- char *buffer,
- int buffer_size);
-
-/* Formats a time from a struct tm, e.g. "01:59 PM". */
-void e_time_format_time (struct tm *date_tm,
- gboolean use_24_hour_format,
- gboolean show_zero_seconds,
- char *buffer,
- int buffer_size);
-
-
-/* Like mktime(3), but assumes UTC instead of local timezone. */
-time_t e_mktime_utc (struct tm *timeptr);
-
-/* Like localtime_r(3), but also returns an offset in minutes after UTC.
- (Calling gmtime with tt + offset would generate the same tm) */
-void e_localtime_with_offset (time_t tt, struct tm *tm, int *offset);
-
-#endif /* E_TIME_UTILS */
diff --git a/e-util/e-uid.c b/e-util/e-uid.c
deleted file mode 100644
index 90c036e0c1..0000000000
--- a/e-util/e-uid.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-uid.c - Unique ID generator.
- *
- * Copyright (C) 2002 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Dan Winship <danw@ximian.com>
- */
-
-#include "e-uid.h"
-
-#include <glib/gstrfuncs.h>
-
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-
-/**
- * e_uid_new:
- *
- * Generate a new unique string for use e.g. in account lists.
- *
- * Return value: the newly generated UID. The caller should free the string
- * when it's done with it.
- **/
-char *
-e_uid_new (void)
-{
- static char *hostname;
- static int serial;
-
- if (!hostname) {
- static char buffer [512];
-
- if ((gethostname (buffer, sizeof (buffer) - 1) == 0) &&
- (buffer [0] != 0))
- hostname = buffer;
- else
- hostname = "localhost";
- }
-
- return g_strdup_printf ("%lu.%lu.%d@%s",
- (unsigned long) time (NULL),
- (unsigned long) getpid (),
- serial++,
- hostname);
-}
diff --git a/e-util/e-uid.h b/e-util/e-uid.h
deleted file mode 100644
index 44ec8c0dd9..0000000000
--- a/e-util/e-uid.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-uid.h - Unique ID generator.
- *
- * Copyright (C) 2002 Ximian, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Dan Winship <danw@ximian.com>
- */
-
-#ifndef E_UID_H
-#define E_UID_H
-
-char *e_uid_new (void);
-
-#endif /* E_UID_H */
diff --git a/e-util/e-util-marshal.list b/e-util/e-util-marshal.list
deleted file mode 100644
index 463afd8129..0000000000
--- a/e-util/e-util-marshal.list
+++ /dev/null
@@ -1,2 +0,0 @@
-NONE:NONE
-NONE:OBJECT
diff --git a/e-util/eggtrayicon.c b/e-util/eggtrayicon.c
deleted file mode 100644
index 6c309306e9..0000000000
--- a/e-util/eggtrayicon.c
+++ /dev/null
@@ -1,480 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* eggtrayicon.c
- * Copyright (C) 2002 Anders Carlsson <andersca@gnu.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-#include <string.h>
-#include <libintl.h>
-
-#include "eggtrayicon.h"
-
-#include <gdk/gdkx.h>
-#include <X11/Xatom.h>
-
-#ifndef EGG_COMPILATION
-#ifndef _
-#define _(x) dgettext (GETTEXT_PACKAGE, x)
-#define N_(x) x
-#endif
-#else
-#define _(x) x
-#define N_(x) x
-#endif
-
-#define SYSTEM_TRAY_REQUEST_DOCK 0
-#define SYSTEM_TRAY_BEGIN_MESSAGE 1
-#define SYSTEM_TRAY_CANCEL_MESSAGE 2
-
-#define SYSTEM_TRAY_ORIENTATION_HORZ 0
-#define SYSTEM_TRAY_ORIENTATION_VERT 1
-
-enum {
- PROP_0,
- PROP_ORIENTATION
-};
-
-static GtkPlugClass *parent_class = NULL;
-
-static void egg_tray_icon_init (EggTrayIcon *icon);
-static void egg_tray_icon_class_init (EggTrayIconClass *klass);
-
-static void egg_tray_icon_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec);
-
-static void egg_tray_icon_realize (GtkWidget *widget);
-static void egg_tray_icon_unrealize (GtkWidget *widget);
-
-static void egg_tray_icon_update_manager_window (EggTrayIcon *icon);
-
-GType
-egg_tray_icon_get_type (void)
-{
- static GType our_type = 0;
-
- if (our_type == 0)
- {
- static const GTypeInfo our_info =
- {
- sizeof (EggTrayIconClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) egg_tray_icon_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EggTrayIcon),
- 0, /* n_preallocs */
- (GInstanceInitFunc) egg_tray_icon_init
- };
-
- our_type = g_type_register_static (GTK_TYPE_PLUG, "EggTrayIcon", &our_info, 0);
- }
-
- return our_type;
-}
-
-static void
-egg_tray_icon_init (EggTrayIcon *icon)
-{
- icon->stamp = 1;
- icon->orientation = GTK_ORIENTATION_HORIZONTAL;
-
- gtk_widget_add_events (GTK_WIDGET (icon), GDK_PROPERTY_CHANGE_MASK);
-}
-
-static void
-egg_tray_icon_class_init (EggTrayIconClass *klass)
-{
- GObjectClass *gobject_class = (GObjectClass *)klass;
- GtkWidgetClass *widget_class = (GtkWidgetClass *)klass;
-
- parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->get_property = egg_tray_icon_get_property;
-
- widget_class->realize = egg_tray_icon_realize;
- widget_class->unrealize = egg_tray_icon_unrealize;
-
- g_object_class_install_property (gobject_class,
- PROP_ORIENTATION,
- g_param_spec_enum ("orientation",
- _("Orientation"),
- _("The orientation of the tray."),
- GTK_TYPE_ORIENTATION,
- GTK_ORIENTATION_HORIZONTAL,
- G_PARAM_READABLE));
-}
-
-static void
-egg_tray_icon_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- EggTrayIcon *icon = EGG_TRAY_ICON (object);
-
- switch (prop_id)
- {
- case PROP_ORIENTATION:
- g_value_set_enum (value, icon->orientation);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-egg_tray_icon_get_orientation_property (EggTrayIcon *icon)
-{
- Display *xdisplay;
- Atom type;
- int format;
- union {
- gulong *prop;
- guchar *prop_ch;
- } prop = { NULL };
- gulong nitems;
- gulong bytes_after;
- int error, result;
-
- g_assert (icon->manager_window != None);
-
- xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
-
- gdk_error_trap_push ();
- type = None;
- result = XGetWindowProperty (xdisplay,
- icon->manager_window,
- icon->orientation_atom,
- 0, G_MAXLONG, FALSE,
- XA_CARDINAL,
- &type, &format, &nitems,
- &bytes_after, &(prop.prop_ch));
- error = gdk_error_trap_pop ();
-
- if (error || result != Success)
- return;
-
- if (type == XA_CARDINAL)
- {
- GtkOrientation orientation;
-
- orientation = (prop.prop [0] == SYSTEM_TRAY_ORIENTATION_HORZ) ?
- GTK_ORIENTATION_HORIZONTAL :
- GTK_ORIENTATION_VERTICAL;
-
- if (icon->orientation != orientation)
- {
- icon->orientation = orientation;
-
- g_object_notify (G_OBJECT (icon), "orientation");
- }
- }
-
- if (prop.prop)
- XFree (prop.prop);
-}
-
-static GdkFilterReturn
-egg_tray_icon_manager_filter (GdkXEvent *xevent, GdkEvent *event, gpointer user_data)
-{
- EggTrayIcon *icon = user_data;
- XEvent *xev = (XEvent *)xevent;
-
- if (xev->xany.type == ClientMessage &&
- xev->xclient.message_type == icon->manager_atom &&
- xev->xclient.data.l[1] == icon->selection_atom)
- {
- egg_tray_icon_update_manager_window (icon);
- }
- else if (xev->xany.window == icon->manager_window)
- {
- if (xev->xany.type == PropertyNotify &&
- xev->xproperty.atom == icon->orientation_atom)
- {
- egg_tray_icon_get_orientation_property (icon);
- }
- if (xev->xany.type == DestroyNotify)
- {
- egg_tray_icon_update_manager_window (icon);
- }
- }
-
- return GDK_FILTER_CONTINUE;
-}
-
-static void
-egg_tray_icon_unrealize (GtkWidget *widget)
-{
- EggTrayIcon *icon = EGG_TRAY_ICON (widget);
- GdkWindow *root_window;
-
- if (icon->manager_window != None)
- {
- GdkWindow *gdkwin;
-
- gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (widget),
- icon->manager_window);
-
- gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon);
- }
-
- root_window = gdk_screen_get_root_window (gtk_widget_get_screen (widget));
-
- gdk_window_remove_filter (root_window, egg_tray_icon_manager_filter, icon);
-
- if (GTK_WIDGET_CLASS (parent_class)->unrealize)
- (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
-}
-
-static void
-egg_tray_icon_send_manager_message (EggTrayIcon *icon,
- long message,
- Window window,
- long data1,
- long data2,
- long data3)
-{
- XClientMessageEvent ev;
- Display *display;
-
- ev.type = ClientMessage;
- ev.window = window;
- ev.message_type = icon->system_tray_opcode_atom;
- ev.format = 32;
- ev.data.l[0] = gdk_x11_get_server_time (GTK_WIDGET (icon)->window);
- ev.data.l[1] = message;
- ev.data.l[2] = data1;
- ev.data.l[3] = data2;
- ev.data.l[4] = data3;
-
- display = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
-
- gdk_error_trap_push ();
- XSendEvent (display,
- icon->manager_window, False, NoEventMask, (XEvent *)&ev);
- XSync (display, False);
- gdk_error_trap_pop ();
-}
-
-static void
-egg_tray_icon_send_dock_request (EggTrayIcon *icon)
-{
- egg_tray_icon_send_manager_message (icon,
- SYSTEM_TRAY_REQUEST_DOCK,
- icon->manager_window,
- gtk_plug_get_id (GTK_PLUG (icon)),
- 0, 0);
-}
-
-static void
-egg_tray_icon_update_manager_window (EggTrayIcon *icon)
-{
- Display *xdisplay;
-
- xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
-
- if (icon->manager_window != None)
- {
- GdkWindow *gdkwin;
-
- gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)),
- icon->manager_window);
-
- gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon);
- }
-
- XGrabServer (xdisplay);
-
- icon->manager_window = XGetSelectionOwner (xdisplay,
- icon->selection_atom);
-
- if (icon->manager_window != None)
- XSelectInput (xdisplay,
- icon->manager_window, StructureNotifyMask|PropertyChangeMask);
-
- XUngrabServer (xdisplay);
- XFlush (xdisplay);
-
- if (icon->manager_window != None)
- {
- GdkWindow *gdkwin;
-
- gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)),
- icon->manager_window);
-
- gdk_window_add_filter (gdkwin, egg_tray_icon_manager_filter, icon);
-
- /* Send a request that we'd like to dock */
- egg_tray_icon_send_dock_request (icon);
-
- egg_tray_icon_get_orientation_property (icon);
- }
-}
-
-static void
-egg_tray_icon_realize (GtkWidget *widget)
-{
- EggTrayIcon *icon = EGG_TRAY_ICON (widget);
- GdkScreen *screen;
- GdkDisplay *display;
- Display *xdisplay;
- char buffer[256];
- GdkWindow *root_window;
-
- if (GTK_WIDGET_CLASS (parent_class)->realize)
- GTK_WIDGET_CLASS (parent_class)->realize (widget);
-
- screen = gtk_widget_get_screen (widget);
- display = gdk_screen_get_display (screen);
- xdisplay = gdk_x11_display_get_xdisplay (display);
-
- /* Now see if there's a manager window around */
- g_snprintf (buffer, sizeof (buffer),
- "_NET_SYSTEM_TRAY_S%d",
- gdk_screen_get_number (screen));
-
- icon->selection_atom = XInternAtom (xdisplay, buffer, False);
-
- icon->manager_atom = XInternAtom (xdisplay, "MANAGER", False);
-
- icon->system_tray_opcode_atom = XInternAtom (xdisplay,
- "_NET_SYSTEM_TRAY_OPCODE",
- False);
-
- icon->orientation_atom = XInternAtom (xdisplay,
- "_NET_SYSTEM_TRAY_ORIENTATION",
- False);
-
- egg_tray_icon_update_manager_window (icon);
-
- root_window = gdk_screen_get_root_window (screen);
-
- /* Add a root window filter so that we get changes on MANAGER */
- gdk_window_add_filter (root_window,
- egg_tray_icon_manager_filter, icon);
-}
-
-EggTrayIcon *
-egg_tray_icon_new_for_xscreen (Screen *xscreen, const char *name)
-{
- GdkDisplay *display;
- GdkScreen *screen;
-
- display = gdk_x11_lookup_xdisplay (DisplayOfScreen (xscreen));
- screen = gdk_display_get_screen (display, XScreenNumberOfScreen (xscreen));
-
- return egg_tray_icon_new_for_screen (screen, name);
-}
-
-EggTrayIcon *
-egg_tray_icon_new_for_screen (GdkScreen *screen, const char *name)
-{
- g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
-
- return g_object_new (EGG_TYPE_TRAY_ICON, "screen", screen, "title", name, NULL);
-}
-
-EggTrayIcon*
-egg_tray_icon_new (const gchar *name)
-{
- return g_object_new (EGG_TYPE_TRAY_ICON, "title", name, NULL);
-}
-
-guint
-egg_tray_icon_send_message (EggTrayIcon *icon,
- gint timeout,
- const gchar *message,
- gint len)
-{
- guint stamp;
-
- g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), 0);
- g_return_val_if_fail (timeout >= 0, 0);
- g_return_val_if_fail (message != NULL, 0);
-
- if (icon->manager_window == None)
- return 0;
-
- if (len < 0)
- len = strlen (message);
-
- stamp = icon->stamp++;
-
- /* Get ready to send the message */
- egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_BEGIN_MESSAGE,
- (Window)gtk_plug_get_id (GTK_PLUG (icon)),
- timeout, len, stamp);
-
- /* Now to send the actual message */
- gdk_error_trap_push ();
- while (len > 0)
- {
- XClientMessageEvent ev;
- Display *xdisplay;
-
- xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
-
- ev.type = ClientMessage;
- ev.window = (Window)gtk_plug_get_id (GTK_PLUG (icon));
- ev.format = 8;
- ev.message_type = XInternAtom (xdisplay,
- "_NET_SYSTEM_TRAY_MESSAGE_DATA", False);
- if (len > 20)
- {
- memcpy (&ev.data, message, 20);
- len -= 20;
- message += 20;
- }
- else
- {
- memcpy (&ev.data, message, len);
- len = 0;
- }
-
- XSendEvent (xdisplay,
- icon->manager_window, False, StructureNotifyMask, (XEvent *)&ev);
- XSync (xdisplay, False);
- }
- gdk_error_trap_pop ();
-
- return stamp;
-}
-
-void
-egg_tray_icon_cancel_message (EggTrayIcon *icon,
- guint id)
-{
- g_return_if_fail (EGG_IS_TRAY_ICON (icon));
- g_return_if_fail (id > 0);
-
- egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_CANCEL_MESSAGE,
- (Window)gtk_plug_get_id (GTK_PLUG (icon)),
- id, 0, 0);
-}
-
-GtkOrientation
-egg_tray_icon_get_orientation (EggTrayIcon *icon)
-{
- g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), GTK_ORIENTATION_HORIZONTAL);
-
- return icon->orientation;
-}
diff --git a/e-util/eggtrayicon.h b/e-util/eggtrayicon.h
deleted file mode 100644
index 007f4c18e9..0000000000
--- a/e-util/eggtrayicon.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* eggtrayicon.h
- * Copyright (C) 2002 Anders Carlsson <andersca@gnu.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef __EGG_TRAY_ICON_H__
-#define __EGG_TRAY_ICON_H__
-
-#include <gtk/gtkplug.h>
-#include <gdk/gdkx.h>
-
-G_BEGIN_DECLS
-
-#define EGG_TYPE_TRAY_ICON (egg_tray_icon_get_type ())
-#define EGG_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_TRAY_ICON, EggTrayIcon))
-#define EGG_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_TRAY_ICON, EggTrayIconClass))
-#define EGG_IS_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_TRAY_ICON))
-#define EGG_IS_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_TRAY_ICON))
-#define EGG_TRAY_ICON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_TRAY_ICON, EggTrayIconClass))
-
-typedef struct _EggTrayIcon EggTrayIcon;
-typedef struct _EggTrayIconClass EggTrayIconClass;
-
-struct _EggTrayIcon
-{
- GtkPlug parent_instance;
-
- guint stamp;
-
- Atom selection_atom;
- Atom manager_atom;
- Atom system_tray_opcode_atom;
- Atom orientation_atom;
- Window manager_window;
-
- GtkOrientation orientation;
-};
-
-struct _EggTrayIconClass
-{
- GtkPlugClass parent_class;
-};
-
-GType egg_tray_icon_get_type (void);
-
-EggTrayIcon *egg_tray_icon_new_for_screen (GdkScreen *screen,
- const gchar *name);
-
-EggTrayIcon *egg_tray_icon_new (const gchar *name);
-
-guint egg_tray_icon_send_message (EggTrayIcon *icon,
- gint timeout,
- const char *message,
- gint len);
-void egg_tray_icon_cancel_message (EggTrayIcon *icon,
- guint id);
-
-GtkOrientation egg_tray_icon_get_orientation (EggTrayIcon *icon);
-
-G_END_DECLS
-
-#endif /* __EGG_TRAY_ICON_H__ */
diff --git a/e-util/md5-utils.c b/e-util/md5-utils.c
deleted file mode 100644
index 6f7e06f48d..0000000000
--- a/e-util/md5-utils.c
+++ /dev/null
@@ -1,363 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * This code implements the MD5 message-digest algorithm.
- * The algorithm is due to Ron Rivest. This code was
- * written by Colin Plumb in 1993, no copyright is claimed.
- * This code is in the public domain; do with it what you wish.
- *
- * Equivalent code is available from RSA Data Security, Inc.
- * This code has been tested against that, and is equivalent,
- * except that you don't need to include two pages of legalese
- * with every copy.
- *
- * To compute the message digest of a chunk of bytes, declare an
- * MD5Context structure, pass it to md5_init, call md5_update as
- * needed on buffers full of bytes, and then call md5_Final, which
- * will fill a supplied 16-byte array with the digest.
- */
-
-/* parts of this file are :
- * Written March 1993 by Branko Lankester
- * Modified June 1993 by Colin Plumb for altered md5.c.
- * Modified October 1995 by Erik Troan for RPM
- */
-
-
-#include <stdio.h>
-#include <string.h>
-#include "md5-utils.h"
-
-
-static void md5_transform (guint32 buf[4], const guint32 in[16]);
-
-static gint _ie = 0x44332211;
-static union _endian { gint i; gchar b[4]; } *_endian = (union _endian *)&_ie;
-#define IS_BIG_ENDIAN() (_endian->b[0] == '\x44')
-#define IS_LITTLE_ENDIAN() (_endian->b[0] == '\x11')
-
-
-/*
- * Note: this code is harmless on little-endian machines.
- */
-static void
-_byte_reverse (guchar *buf, guint32 longs)
-{
- guint32 t;
- do {
- t = (guint32) ((guint32) buf[3] << 8 | buf[2]) << 16 |
- ((guint32) buf[1] << 8 | buf[0]);
- *(guint32 *) buf = t;
- buf += 4;
- } while (--longs);
-}
-
-/**
- * md5_init: Initialise an md5 context object
- * @ctx: md5 context
- *
- * Initialise an md5 buffer.
- *
- **/
-void
-md5_init (MD5Context *ctx)
-{
- ctx->buf[0] = 0x67452301;
- ctx->buf[1] = 0xefcdab89;
- ctx->buf[2] = 0x98badcfe;
- ctx->buf[3] = 0x10325476;
-
- ctx->bits[0] = 0;
- ctx->bits[1] = 0;
-
- if (IS_BIG_ENDIAN())
- ctx->doByteReverse = 1;
- else
- ctx->doByteReverse = 0;
-}
-
-
-
-/**
- * md5_update: add a buffer to md5 hash computation
- * @ctx: conetxt object used for md5 computaion
- * @buf: buffer to add
- * @len: buffer length
- *
- * Update context to reflect the concatenation of another buffer full
- * of bytes. Use this to progressively construct an md5 hash.
- **/
-void
-md5_update (MD5Context *ctx, const guchar *buf, guint32 len)
-{
- guint32 t;
-
- /* Update bitcount */
-
- t = ctx->bits[0];
- if ((ctx->bits[0] = t + ((guint32) len << 3)) < t)
- ctx->bits[1]++; /* Carry from low to high */
- ctx->bits[1] += len >> 29;
-
- t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
-
- /* Handle any leading odd-sized chunks */
-
- if (t) {
- guchar *p = (guchar *) ctx->in + t;
-
- t = 64 - t;
- if (len < t) {
- memcpy (p, buf, len);
- return;
- }
- memcpy (p, buf, t);
- if (ctx->doByteReverse)
- _byte_reverse (ctx->in, 16);
- md5_transform (ctx->buf, (guint32 *) ctx->in);
- buf += t;
- len -= t;
- }
- /* Process data in 64-byte chunks */
-
- while (len >= 64) {
- memcpy (ctx->in, buf, 64);
- if (ctx->doByteReverse)
- _byte_reverse (ctx->in, 16);
- md5_transform (ctx->buf, (guint32 *) ctx->in);
- buf += 64;
- len -= 64;
- }
-
- /* Handle any remaining bytes of data. */
-
- memcpy (ctx->in, buf, len);
-}
-
-
-
-
-
-/*
- * Final wrapup - pad to 64-byte boundary with the bit pattern
- * 1 0* (64-bit count of bits processed, MSB-first)
- */
-/**
- * md5_final: copy the final md5 hash to a bufer
- * @digest: 16 bytes buffer
- * @ctx: context containing the calculated md5
- *
- * copy the final md5 hash to a bufer
- **/
-void
-md5_final (MD5Context *ctx, guchar digest[16])
-{
- guint32 count;
- guchar *p;
-
- /* Compute number of bytes mod 64 */
- count = (ctx->bits[0] >> 3) & 0x3F;
-
- /* Set the first char of padding to 0x80. This is safe since there is
- always at least one byte free */
- p = ctx->in + count;
- *p++ = 0x80;
-
- /* Bytes of padding needed to make 64 bytes */
- count = 64 - 1 - count;
-
- /* Pad out to 56 mod 64 */
- if (count < 8) {
- /* Two lots of padding: Pad the first block to 64 bytes */
- memset (p, 0, count);
- if (ctx->doByteReverse)
- _byte_reverse (ctx->in, 16);
- md5_transform (ctx->buf, (guint32 *) ctx->in);
-
- /* Now fill the next block with 56 bytes */
- memset (ctx->in, 0, 56);
- } else {
- /* Pad block to 56 bytes */
- memset (p, 0, count - 8);
- }
- if (ctx->doByteReverse)
- _byte_reverse (ctx->in, 14);
-
- /* Append length in bits and transform */
- ((guint32 *) ctx->in)[14] = ctx->bits[0];
- ((guint32 *) ctx->in)[15] = ctx->bits[1];
-
- md5_transform (ctx->buf, (guint32 *) ctx->in);
- if (ctx->doByteReverse)
- _byte_reverse ((guchar *) ctx->buf, 4);
- memcpy (digest, ctx->buf, 16);
-}
-
-
-
-
-/* The four core functions - F1 is optimized somewhat */
-
-/* #define F1(x, y, z) (x & y | ~x & z) */
-#define F1(x, y, z) (z ^ (x & (y ^ z)))
-#define F2(x, y, z) F1(z, x, y)
-#define F3(x, y, z) (x ^ y ^ z)
-#define F4(x, y, z) (y ^ (x | ~z))
-
-/* This is the central step in the MD5 algorithm. */
-#define MD5STEP(f, w, x, y, z, data, s) \
- ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
-
-/*
- * The core of the MD5 algorithm, this alters an existing MD5 hash to
- * reflect the addition of 16 longwords of new data. md5_Update blocks
- * the data and converts bytes into longwords for this routine.
- */
-static void
-md5_transform (guint32 buf[4], const guint32 in[16])
-{
- register guint32 a, b, c, d;
-
- a = buf[0];
- b = buf[1];
- c = buf[2];
- d = buf[3];
-
- MD5STEP (F1, a, b, c, d, in[0] + 0xd76aa478, 7);
- MD5STEP (F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
- MD5STEP (F1, c, d, a, b, in[2] + 0x242070db, 17);
- MD5STEP (F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
- MD5STEP (F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
- MD5STEP (F1, d, a, b, c, in[5] + 0x4787c62a, 12);
- MD5STEP (F1, c, d, a, b, in[6] + 0xa8304613, 17);
- MD5STEP (F1, b, c, d, a, in[7] + 0xfd469501, 22);
- MD5STEP (F1, a, b, c, d, in[8] + 0x698098d8, 7);
- MD5STEP (F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
- MD5STEP (F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
- MD5STEP (F1, b, c, d, a, in[11] + 0x895cd7be, 22);
- MD5STEP (F1, a, b, c, d, in[12] + 0x6b901122, 7);
- MD5STEP (F1, d, a, b, c, in[13] + 0xfd987193, 12);
- MD5STEP (F1, c, d, a, b, in[14] + 0xa679438e, 17);
- MD5STEP (F1, b, c, d, a, in[15] + 0x49b40821, 22);
-
- MD5STEP (F2, a, b, c, d, in[1] + 0xf61e2562, 5);
- MD5STEP (F2, d, a, b, c, in[6] + 0xc040b340, 9);
- MD5STEP (F2, c, d, a, b, in[11] + 0x265e5a51, 14);
- MD5STEP (F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
- MD5STEP (F2, a, b, c, d, in[5] + 0xd62f105d, 5);
- MD5STEP (F2, d, a, b, c, in[10] + 0x02441453, 9);
- MD5STEP (F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
- MD5STEP (F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
- MD5STEP (F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
- MD5STEP (F2, d, a, b, c, in[14] + 0xc33707d6, 9);
- MD5STEP (F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
- MD5STEP (F2, b, c, d, a, in[8] + 0x455a14ed, 20);
- MD5STEP (F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
- MD5STEP (F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
- MD5STEP (F2, c, d, a, b, in[7] + 0x676f02d9, 14);
- MD5STEP (F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
-
- MD5STEP (F3, a, b, c, d, in[5] + 0xfffa3942, 4);
- MD5STEP (F3, d, a, b, c, in[8] + 0x8771f681, 11);
- MD5STEP (F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
- MD5STEP (F3, b, c, d, a, in[14] + 0xfde5380c, 23);
- MD5STEP (F3, a, b, c, d, in[1] + 0xa4beea44, 4);
- MD5STEP (F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
- MD5STEP (F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
- MD5STEP (F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
- MD5STEP (F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
- MD5STEP (F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
- MD5STEP (F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
- MD5STEP (F3, b, c, d, a, in[6] + 0x04881d05, 23);
- MD5STEP (F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
- MD5STEP (F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
- MD5STEP (F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
- MD5STEP (F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
-
- MD5STEP (F4, a, b, c, d, in[0] + 0xf4292244, 6);
- MD5STEP (F4, d, a, b, c, in[7] + 0x432aff97, 10);
- MD5STEP (F4, c, d, a, b, in[14] + 0xab9423a7, 15);
- MD5STEP (F4, b, c, d, a, in[5] + 0xfc93a039, 21);
- MD5STEP (F4, a, b, c, d, in[12] + 0x655b59c3, 6);
- MD5STEP (F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
- MD5STEP (F4, c, d, a, b, in[10] + 0xffeff47d, 15);
- MD5STEP (F4, b, c, d, a, in[1] + 0x85845dd1, 21);
- MD5STEP (F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
- MD5STEP (F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
- MD5STEP (F4, c, d, a, b, in[6] + 0xa3014314, 15);
- MD5STEP (F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
- MD5STEP (F4, a, b, c, d, in[4] + 0xf7537e82, 6);
- MD5STEP (F4, d, a, b, c, in[11] + 0xbd3af235, 10);
- MD5STEP (F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
- MD5STEP (F4, b, c, d, a, in[9] + 0xeb86d391, 21);
-
- buf[0] += a;
- buf[1] += b;
- buf[2] += c;
- buf[3] += d;
-}
-
-
-
-
-/**
- * md5_get_digest: get the md5 hash of a buffer
- * @buffer: byte buffer
- * @buffer_size: buffer size (in bytes)
- * @digest: 16 bytes buffer receiving the hash code.
- *
- * Get the md5 hash of a buffer. The result is put in
- * the 16 bytes buffer @digest .
- **/
-void
-md5_get_digest (const gchar *buffer, gint buffer_size, guchar digest[16])
-{
- MD5Context ctx;
-
- md5_init (&ctx);
- md5_update (&ctx, buffer, buffer_size);
- md5_final (&ctx, digest);
-
-}
-
-
-/**
- * md5_get_digest_from_file: get the md5 hash of a file
- * @filename: file name
- * @digest: 16 bytes buffer receiving the hash code.
- *
- * Get the md5 hash of a file. The result is put in
- * the 16 bytes buffer @digest .
- **/
-void
-md5_get_digest_from_file (const gchar *filename, guchar digest[16])
-{
- MD5Context ctx;
- guchar tmp_buf[1024];
- gint nb_bytes_read;
- FILE *fp;
-
- printf("generating checksum\n");
-
- md5_init (&ctx);
- fp = fopen(filename, "r");
- if (!fp) {
- return;
- }
-
- while ((nb_bytes_read = fread (tmp_buf, sizeof (guchar), 1024, fp)) > 0)
- md5_update (&ctx, tmp_buf, nb_bytes_read);
-
- if (ferror(fp)) {
- fclose(fp);
- return;
- }
-
-
- md5_final (&ctx, digest);
-
- printf("checksum done\n");
-}
-
-
-
-
diff --git a/e-util/md5-utils.h b/e-util/md5-utils.h
deleted file mode 100644
index 607471a752..0000000000
--- a/e-util/md5-utils.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * This code implements the MD5 message-digest algorithm.
- * The algorithm is due to Ron Rivest. This code was
- * written by Colin Plumb in 1993, no copyright is claimed.
- * This code is in the public domain; do with it what you wish.
- *
- * Equivalent code is available from RSA Data Security, Inc.
- * This code has been tested against that, and is equivalent,
- * except that you don't need to include two pages of legalese
- * with every copy.
- *
- * To compute the message digest of a chunk of bytes, declare an
- * MD5Context structure, pass it to rpmMD5Init, call rpmMD5Update as
- * needed on buffers full of bytes, and then call rpmMD5Final, which
- * will fill a supplied 16-byte array with the digest.
- */
-
-/* parts of this file are :
- * Written March 1993 by Branko Lankester
- * Modified June 1993 by Colin Plumb for altered md5.c.
- * Modified October 1995 by Erik Troan for RPM
- */
-
-
-#ifndef MD5_UTILS_H
-#define MD5_UTILS_H
-
-#include <glib.h>
-
-
-typedef struct _MD5Context {
- guint32 buf[4];
- guint32 bits[2];
- guchar in[64];
- gint doByteReverse;
-} MD5Context;
-
-
-void md5_get_digest (const gchar *buffer, gint buffer_size, guchar digest[16]);
-
-/* use this one when speed is needed */
-/* for use in provider code only */
-void md5_get_digest_from_file (const gchar *filename, guchar digest[16]);
-
-/* raw routines */
-void md5_init (MD5Context *ctx);
-void md5_update (MD5Context *ctx, const guchar *buf, guint32 len);
-void md5_final (MD5Context *ctx, guchar digest[16]);
-
-
-#endif /* MD5_UTILS_H */
diff --git a/evolution-plugin.pc.in b/evolution-plugin.pc.in
deleted file mode 100644
index 744f60103f..0000000000
--- a/evolution-plugin.pc.in
+++ /dev/null
@@ -1,19 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-libexecdir=@libexecdir@
-includedir=@includedir@
-datadir=@datadir@
-
-privlibdir=@privlibdir@
-privlibexecdir=@privlibexecdir@
-privincludedir=@privincludedir@
-plugindir=@plugindir@
-errordir=@privdatadir@/errors
-
-Name: evolution-plugin
-Description: libraries needed for Evolution plugin development
-Version: @VERSION@
-Requires: libgnome-2.0 libgnomeui-2.0 libbonoboui-2.0 >= @BONOBOUI_REQUIRED@ gal-2.4 >= @GAL_REQUIRED@ camel-provider-1.2
-Libs: -L${privlibdir} -leutil
-Cflags: -I${privincludedir}
diff --git a/evolution-shell.pc.in b/evolution-shell.pc.in
deleted file mode 100644
index 16f1c3ac1a..0000000000
--- a/evolution-shell.pc.in
+++ /dev/null
@@ -1,23 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-libexecdir=@libexecdir@
-includedir=@includedir@
-datadir=@datadir@
-
-privlibdir=@privlibdir@
-privlibexecdir=@privlibexecdir@
-privincludedir=@privincludedir@
-idldir=@idldir@
-componentdir=@componentdir@
-evolutionuidir=@evolutionuidir@
-imagesdir=@imagesdir@
-
-IDL_INCLUDES=-I ${idldir} @IDL_INCLUDES@
-
-Name: evolution-shell
-Description: libraries needed for Evolution shell components
-Version: @VERSION@
-Requires: libgnome-2.0 libgnomeui-2.0 libbonoboui-2.0 >= @BONOBOUI_REQUIRED@ gal-2.4 >= @GAL_REQUIRED@
-Libs: -L${privlibdir} -leshell
-Cflags: -I${privincludedir}
diff --git a/filter/.cvsignore b/filter/.cvsignore
deleted file mode 100644
index a004ea82d3..0000000000
--- a/filter/.cvsignore
+++ /dev/null
@@ -1,10 +0,0 @@
-*.la
-*.lo
-.deps
-.libs
-Makefile
-Makefile.in
-filter-errors.xml
-filter-marshal.c
-filter-marshal.h
-libfilter-i18n.h
diff --git a/filter/ChangeLog b/filter/ChangeLog
deleted file mode 100644
index 5c3327d9d0..0000000000
--- a/filter/ChangeLog
+++ /dev/null
@@ -1,441 +0,0 @@
-2005-01-11 Not Zed <NotZed@Ximian.com>
-
- * filter-part.c (filter_part_expand_code): cast lenght specifiers
- to int.
-
-2004-12-02 Diego Sevilla Ruiz <dsevilla@dsevilla>
-
- * filter.glade: Added label "Show filters for mail:".
-
- * filter-rule.c: Capitalize Ingoing and Outgoing labels.
- Fixes #46229.
-
-2004-11-29 Mengjie Yu <meng-jie.yu@sun.com>
-
- * filter-rule.c: (get_widget):add mnemonic widget in search box.
-
-2004-11-15 Not Zed <NotZed@Ximian.com>
-
- * *.c: Moved stuff from e-util to libedataserver.
-
- * filter-system-flag.c: removed gal header.
-
-2004-07-29 Carlos Garnacho Parro <carlosg@gnome.org>
-
- * filter-file.c: added the "use_filechooser" property to the
- GnomeFileEntry
-
-2004-06-21 Jeffrey Stedfast <fejj@novell.com>
-
- * filter-input.c (xml_encode): encode entities. fixes bug #46677.
-
-2004-06-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-errors.xml.h: Re-added - THIS IS NOT TO BE REMOVED!!!!
-
-2004-06-17 Rodney Dawes <dobey@novell.com>
-
- * filter-errors.xml.h: Remove this generated file from CVS
-
-2004-06-17 Not Zed <NotZed@Ximian.com>
-
- ** See #59885.
-
- ** Moved all of the mailer specific filter stuff into mail/*.
-
- * filter-element.c (copy_value): implement for base types.
-
- * filter-element.c (filter_element_copy_value): do this as a
- virtual method.
-
- * filter.glade: moved the vfolder stuff to mail/
-
- * libfilter-i18n.h: removed, moved to mailer.
-
- * filter-errors.xml: moved the vfolder/filtering errors to the
- mail error file.
-
- * Makefile.am (EXTRA_DIST): moved *types.xml to mail.
- (INCLUDES): removed a bunch of mail dependencies.
-
- * filter-*.[ch], vfolder-*.[ch]: Moved all mail related filter and
- vfolder stuff to mail directory.
-
- * score-*.[ch]: Removed all of it.
-
- * vfolder-context.c (vfolder_new_element): and for vfolders.
-
- * filter-context.c (filter_new_element): implement for filter
- element types.
-
- * rule-context.c (rc_new_element): replacement for old
- filter_element_new_type_name. only has the basics.
-
- * filter-part.c (filter_part_xml_create): take a rule context
- as an argument & and look up the element name off the context.
-
- * rule-context.c (rule_context_new_element): new virtual method to
- get an element for a given name.
-
- * filter-element.c (filter_element_new_type_name): removed.
-
-2004-06-08 Not Zed <NotZed@Ximian.com>
-
- * filtertypes.xml: give the junk test a unique name. #59567.
-
-2004-05-27 Rodney Dawes <dobey@novell.com>
-
- * Makefile.am (EXTRA_DIST): Add $(error_i18n)
-
-2004-05-26 Rodney Dawes <dobey@novell.com>
-
- * libfilter-i18n.h: Removed from CVS
- Generated files don't belong in CVS
-
-2004-05-19 JP Rosevear <jpr@novell.com>
-
- * Makefile.am: don't dist the error .h file
-
-2004-05-18 Not Zed <NotZed@Ximian.com>
-
- * vfolder-rule.c (source_add): fix for folder selector api change,
- change the ok button to "Add".
-
-2004-05-12 Jeffrey Stedfast <fejj@novell.com>
-
- * vfolder-rule.c: Same.
-
- * filter-folder.c: Added a #include to fix some compile warnings.
-
-2004-05-12 Not Zed <NotZed@Ximian.com>
-
- * filter-rule.c (xml_decode): load threading option if threading
- enabled.
- (xml_encode): write out threading setting.
- (rule_copy): copy threading option.
- (rule_eq): compare threading.
- (build_code): build the match-threads stuff if set.
- (fr_grouping_changed): insead of the match_all match_any activate
- clalbacks.
- (fr_threading_changed): handle threading option menu
-
- * rule-context.c (rule_context_init): set capabilities flags.
-
- * vfolder-context.c (vfolder_context_init): set capabilities flags
- to include threading.
-
- * rule-context.h: added a capabilities flag, grouping and
- threading capabilities. Sort of a hack to workaround not being
- able to put grouping or threading into rules.
-
- * filter-rule.h: added an option for threading as well as
- grouping.
-
-2004-05-12 Not Zed <NotZed@Ximian.com>
-
- * Makefile.am (%.xml.h): fix i18n file generation rules.
-
- * filter-errors.xml: rename from xml.in and fix tags.
-
- * filter-errors.xml.h: add for translators.
-
-2004-05-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * vfoldertypes.xml: Added the Junk status flag to the xml
- definition so you can vfolder on that.
-
-2004-04-28 Not Zed <NotZed@Ximian.com>
-
- * filter-option.c (filter_option_add): fix a warning.
-
- ** Changed error messages to use EError.
-
-2004-03-31 Not Zed <NotZed@Ximian.com>
-
- * filter.glade: renamed filter_label to rule_label, and removed
- the vfolder-editor and filter-editor windows.
-
- * rule-editor.c (rule_editor_new): hide the source widget.
-
- * vfolder-editor.c (vfolder_editor_new): hide the source widget.
-
- * rule-editor.c (rule_editor_new): add a label argument.
-
- * vfolder-editor.c (vfolder_editor_new): ditto below.
-
- * filter-editor.c (filter_editor_new): dont add any label here.
-
- * rule-editor.c (rule_editor_construct): Put the widget back in
- the dialogue box here. Add an argument for the area label.
-
- ** Revert Rodney's last patch.
-
-2004-03-30 Rodney Dawes <dobey@ximian.com>
-
- * filter-editor.c (filter_editor_new): Use the new "filter_editor"
- that has been added to the glade file
- * filter.glade: Remove an unused piece of UI definition and add a
- new "filter_editor" that is the same as rule_editor, only for the
- filter editor dialogs, and change "Filter Rules" to "Search Rules"
- in the rule_editor
- * rule-editor.c (rule_editor_new): Set the child widget of the editor
- dialog appropriately
-
-2004-03-29 Rodney Dawes <dobey@ximian.com>
-
- * filter-filter.c (get_widget):
- * filter-rule.c (get_widget): Fix packing of the hbox that contains
- the actual input widgets to expand and fill
-
-2004-03-26 Not Zed <NotZed@Ximian.com>
-
- * filter-option.c (filter_option_add): return the added option.
- (clone): make sure we set the current option properly on the new
- copy. See #56028.
-
- * filtertypes.xml: s/pipe to shell command/pipe to program/
- s/shell command/run program/, cleans up the UI a lot.
-
-2004-03-20 Danilo Å egan <dsegan@gmx.net>
-
- * filter-datespec.c (set_button): Use ngettext for handling plurals.
- (timespans): Use C preprocessor hacks to make xgettext see real
- ngettext messages (fixes part of #53464).
-
-2004-03-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-rule.c (rule_copy): Don't ref the newly cloned rule (fix
- to previous patch).
-
-2004-03-14 Bill Zhu <bill.zhu@sun.com>
-
- * filter-rule.c (rule_copy): When copying a FilterPart of a rule, we
- need copy the data of parts together but not only copy the pointer.
-
-2004-04-15 Rodney Dawes <dobey@ximian.com>
-
- * filter-datespec.c (validate):
- (button_clicked): Hide the separators on these dialogs
- * filter-editor.c (filter_editor_new): Re-pack the rule_editor widget
- in here, and get rid of the GtkFrame-related code
- * filter-file.c (validate): Hide the separators on these dialogs
- * filter-filter.c (get_widget): Get rid of the GtkFrame, and relayout
- the widgets to be HIG-compliant
- * filter-folder.c (validate): Hide the separator on this dialog
- * filter-input.c (validate): Hide the separator on this dialog
- * filter-part.c (main): Hide the separator on this dialog
- * filter-rule.c (validate): Hide the separator on this dialog
- (get_widget): Get rid of the GtkFrame, and relayout the widgets to be
- HIG-compliant
- * filter.glade: Make the widget layouts here be HIG-compliant
- * rule-context.c (new_rule_response):
- (rule_context_add_rule_gui): Hide the separators on these dialogs
- * rule-editor.c (rule_editor_new): Get rid of the GtkFrame-related code
- (add_editor_response): Hide the dialog separator here
- (rule_add): Hide the dialog separator here
- (edit_editor_response): Hide the dialog separator here
- (rule_edit): Hide the dialog separator here
- (rule_editor_construct): Remove the rule_editor repacking code
- Set the dialog vbox's border width to 12
- Set the mnemonic for the filter label here
- Hide the dialog separator on the filter editor dialog
- * vfolder-editor.c (vfolder_editor_new): Re-pack the appropriate
- editor widget in here
- Get rid of the GtkFrame-related code
- * vfolder-rule.c (validate): Hide the dialog separators here
-
- Original patch from William Jon McCann
-
-2004-02-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-editor.c (rule_delete): After setting the new selected
- iter, call cursor_changed() so we can update state. Fixes bug
- #54205.
-
-2004-02-20 Not Zed <NotZed@Ximian.com>
-
- ** See bug #54338.
-
- * vfolder-rule.c: instead of overriding the filter-rule's 'source'
- attribute for 'with sources', add a 'with' enum.
- (xml_decode): handle loading old-format files, as well as new
- ones, where the with is a prop on the sources xml.
- (xml_encode): set 'with' on save.
- (rule_copy): copy across with value.
- (get_widget): just hook onto option menu changed, dont bother
- setting up any per-item callbacks.
- (select_source_with_changed): callback to monitor source 'with'
- type.
-
-2004-02-17 Not Zed <NotZed@Ximian.com>
-
- * filter-int.c (int_clone): implement, since we dont store the
- min/max values in the xml output, we lose it otherwise. Bug
- #54155.
-
-2004-02-06 Hans Petter Jansson <hpj@ximian.com>
-
- * filter-input.c (filter_input_init): Default to an empty string
- for the value.
- (xml_decode): Remove old values before decoding the new ones.
-
-2004-02-03 Dan Winship <danw@ximian.com>
-
- * Makefile.am (INCLUDES): add widgets/misc
-
-2004-01-20 Not Zed <NotZed@Ximian.com>
-
- * rule-context.c (revert): load from the just-loaded 'userdoc'
- rather than rc->user.
- (rule_context_finalise): remove user and system xmldoc files.
- (load): make rc->system and rc->user locals systemdoc userdoc, and
- free them immediately.
-
-2004-01-16 Not Zed <NotZed@Ximian.com>
-
- ** See bug #52467.
-
- * vfolder-rule.c (vfr_folder_response): convert the uri to an
- evolution uri, rather than a camel one, for storage. And remove
- double-calls to geT_selected_uri.
- (format_source): treat uri as an evolution uri and convert to a
- camel one to get something meaningful out of it.
-
-2004-01-15 Radek Doulik <rodo@ximian.com>
-
- * filtertypes.xml: s/spam/junk, added junk test rule, it must be
- lost while porting to 1.5
-
-2003-08-20 Not Zed <NotZed@Ximian.com>
-
- ** See bug #47751.
-
- * rule-editor.c (add_editor_response, edit_editor_response)
- (rule_edit, rule_add, rule_editor_construct, editor_response):
- * rule-context.c (new_rule_response, rule_context_add_rule_gui):
- * filter-datespec.c (button_clicked): RESPONSE_REJECT/ACCEPT ->
- RESPONSE_CANCEL/OK
-
-2003-12-23 JP Rosevear <jpr@ximian.com>
-
- * vfolder-rule.c (source_add): call peek instead of get as the
- function was renamed
-
-2003-12-06 JP Rosevear <jpr@ximian.com>
-
- * */Makefile.am: Remove hard coded disable deprecated flags
-
-2003-12-04 Radek Doulik <rodo@ximian.com>
-
- * filter-rule.h: added FILTER_SOURCE_JUNKTEST - perform only
- junktest on incoming mail
-
-2003-11-26 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: turn on deprecated gtk stuff
-
-2003-11-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * vfolder-rule.c: #include "em-folder-tree.h"
-
-2003-11-17 Not Zed <NotZed@Ximian.com>
-
- * vfolder-rule.c (source_add): fix for folder selector api changes.
- (vfr_folder_response): handle the dialog response.
-
-2003-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * filter.glade: Remove Viewports around the treeviews, since they
- already have a scrolled window around them and the viewports cause
- a double bevel to appear.
-
- * rule-editor.c (rule_editor_treeview_new): Make the scrolled
- window have a GTK_SHADOW_IN shadow.
- * vfolder-rule.c (vfolder_editor_sourcelist_new): Likewise
-
-2003-10-10 Not Zed <NotZed@Ximian.com>
-
- * filter-folder.c (folder_selected): change for
- emfolderselectionbutton fixes.
- (get_widget): same.
-
-2003-09-29 Ettore Perazzoli <ettore@ximian.com>
-
- * filter-folder.c (get_widget): Use an EMFolderSelectionButton.
-
-2003-09-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-int.c (get_widget): Listen to the "value-changed" signal
- rather than the "changed" signal. Fixes bug #48166.
-
-2003-09-16 Jeremy Katz <katzj@redhat.com>
-
- * rule-context.c (rule_context_add_part_set): type should be a GType.
- (rule_context_add_rule_set): Likewise.
- * rule-context.h: Update prototypes. Use GType instead of int for
- type in _part_set_map and _rule_set_map.
-
-2003-09-15 Not Zed <NotZed@Ximian.com>
-
- ** See Natzilla task #47524
-
- * filter-rule.h (FilterRule): add a system bit, for rules that
- shouldn't be edited/saved.
-
- * rule-context.c (load): check for ruleset maps in the system
- file, and if they exist, load in as system rules.
- (save): ignore system rules if they exist.
-
- * searchtypes.xml: Added a search-specific types folder. Also
- contains system searches that cannot be deleted.
-
-2003-08-18 Ettore Perazzoli <ettore@ximian.com>
-
- * vfolder-rule.c (source_add): As a temporary measure, don't call
- evolution_shell_client_user_select_folder() since this is not done
- by the shell anymore.
-
- * filter-folder.c (get_widget): Return NULL for now, since we
- can't get the folder selector button from the shell anymore.
-
-2003-08-05 Not Zed <NotZed@Ximian.com>
-
- ** See bug #42636.
-
- * vfoldertypes.xml: Fix some of the subject rules, they were
- missing matching ')'s.
-
-2003-08-01 Not Zed <NotZed@Ximian.com>
-
- ** See bug #47208.
-
- * filter-code.c (build_code): wrap the expression in a match-all
- so boolean expressions work properly for folder searches.
-
-2003-07-23 Dan Winship <danw@ximian.com>
-
- * Makefile.am: Use EVO_MARSHAL_RULE
-
-2003-06-13 Larry Ewing <lewing@ximian.com>
-
- * filter-source.c (filter_source_finalize): free current_url.
-
-2003-06-11 Mike Kestner <mkestner@ximian.com>
-
- * rule-context.c (load): stat the user file before parsing.
-
-2003-06-06 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes some leaks from bug #43883.
-
- * filter-file.c (xml_decode): Free file->path and set it to
- NULL before entering the loop to decode it. This way if the value
- is already set we don't leak it. Set file->path = g_strdup (str ?
- str : ""); and then xmlFree the str.
-
-2003-05-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-source.c (filter_source_get_sources): Same as below.
-
- * filter-label.c (xml_create): Unref the gconf client when we're
- finished with it.
diff --git a/filter/ChangeLog.pre-1-4 b/filter/ChangeLog.pre-1-4
deleted file mode 100644
index ece5ee7998..0000000000
--- a/filter/ChangeLog.pre-1-4
+++ /dev/null
@@ -1,2967 +0,0 @@
-2003-05-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-colour.c (format_sexp): Format the colour string in a way
- that gdk_color_parse() will handle. Apparently it no longer
- handles rgb:<red>/<green>/<blue>? Fixes bug #42345.
-
-2003-04-24 Jeffrey Stedfast <fejj@ximian.com>
-
- Fix for bug #41578.
-
- * rule-editor.c (rule_move): Pass re->source instead of
- re->current->source to rule_context_get_rank_rule(). Also updated
- to pass re->source to rule_context_rank_rule().
- (rule_editor_play_undo): Updated to pass re->source to
- rule_context_rank_rule().
-
- * rule-context.c (rule_context_rank_rule): Now takes a 'source'
- argument rather than using rule->source (vfolder editor lists
- rules of all sources, not just same-source rules).
- (revert): Pass frule->source/part->source to
- rule_context_rank_rule() - might not be right but should preserve
- the prior behaviour at least.
-
-2003-04-18 Not Zed <NotZed@Ximian.com>
-
- * rule-editor.c (d): removed debug spew.
-
- * addresses #41398
-
- * vfolder-rule.c (format_source): helper function to decode a url
- into a more user-friendly format.
- (source_add, get_widget): add the formatted data as another
- column to the table.
- (vfolder_editor_sourcelist_new): add another column to the table,
- a formatted uri as well as the raw one.
- (d): turned off debug vomit while i'm here.
-
-2003-04-11 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes for bugs: #41149, #41150, #41151, #41152, #41153, #41155,
- #41156, #41205, and #41208.
-
- * filter-filter.c (get_widget): Same as with filter-rule.
-
- * filter-rule.c (get_widget): Changed border widths of frame
- vboxes and other padding to comply with the HIG.
-
- * rule-editor.c (rule_add): Change window border and padding
- around the 'rules' widget to comply with the HIG.
- (rule_edit): Same.
- (rule_editor_construct): Same here as well.
-
- * filter.glade: Many HIG compliance fixes.
-
-2003-03-28 Not Zed <NotZed@Ximian.com>
-
- * filter-datespec.c (button_clicked): cast warning.
-
-2003-03-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-file.c (xml_decode): Loop over child nodes here too in
- order to not be affected by libxml2 crack.
-
- * filter-source.c (xml_decode): Fixed to disreguard libxml2 crack.
- (get_widget): Use strcmp instead of e_url_equal().
-
-2003-03-20 Dan Winship <danw@ximian.com>
-
- * filter-datespec.c (timespans, set_button): Change the strings in
- the timespans array from "second" / "seconds" to "1 second ago" /
- "%d seconds ago", etc, and update the code in set_button that uses
- them. Fixes #36245, translation clash between the "second" here
- and the one in the calendar (where it's used as "2nd").
- (button_clicked): Fix this so we don't get stuck inside
- gtk_dialog_run's main loop forever.
-
-2003-03-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-editor.c (rule_editor_set_sensitive): Don't return here -
- this is a void function.
- (rule_editor_set_source): Same.
-
-2003-03-18 Not Zed <NotZed@Ximian.com>
-
- * rule-context.c (new_rule_response): use the same code as in
- filter-rule to enforce unique names for all rules/vfolders.
-
-2003-03-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-editor.c (rule_editor_construct): Set the default window
- size to something reasonable (350x400?). Fixes bug #39808.
-
- * vfolder-rule.c (source_remove): Fixed to work properly. Fixes
- bug #39654.
-
- * rule-editor.c (rule_editor_construct): Always add a Cancel
- button here, but if !enable_undo - make the response id
- GTK_RESPONSE_CANCEL rather than GTK_RESPONSE_REJECT (which does
- undo). This mimics the behaviour that was done in the mail/ code
- previously. Fixes bug #39809.
-
-2003-03-11 Not Zed <NotZed@Ximian.com>
-
- * rule-context.c (revert): go to the proper level of child node
- before looking for rule sets, fix for #39165 to make 'cancel' work.
-
-2003-03-06 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes for bug #39170
-
- * filter-element.c (filter_element_xml_create): Remove return
- keyword.
- (filter_element_build_code): Same.
- (filter_element_format_sexp): Here too.
-
-2003-02-20 Not Zed <NotZed@Ximian.com>
-
- * filter-source.c (filter_source_get_sources): Change to use
- EAccountList, etc.
-
-2003-02-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * vfolder-rule.c (source_add): Get rid of the need for the
- GTK_WIDGET_DESTROYED() check.
-
-2003-02-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-editor.c (filter_editor_new): Use g_object_new()
- instead of gtk_type_new().
-
- * vfolder-editor.c (vfolder_editor_new): Use g_object_new()
- instead of gtk_type_new().
-
- * score-editor.c (score_editor_new): Use g_object_new() instead of
- gtk_type_new().
-
- * rule-editor.c (rule_editor_new): Use g_object_new() instead of
- gtk_type_new().
- (rule_add): Use gtk_window_set_resizable() instead of the
- deprecated gtk_window_set_policy().
- (rule_edit): Same here.
- (rule_editor_construct): Here too.
-
- * rule-context.c (rule_context_add_rule_gui): Use
- gtk_window_set_resizable() instead of the deprecated
- gtk_window_set_policy().
-
-2003-02-05 Dan Winship <danw@ximian.com>
-
- * Makefile.am (gladedir): Defined in configure.in now
- (filterdir): Define using privdatadir
-
-2003-01-22 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (gladedir): Version using $(BASE_VERSION).
- (filterdir): Likewise.
-
-2003-01-15 Not Zed <NotZed@Ximian.com>
-
- * vfolder-rule.c (get_widget): dont re-use 'widget', its the
- return value!
-
-2003-01-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-context.c (save): Back to using e_xml_save_file().
-
-2003-01-14 Ettore Perazzoli <ettore@ximian.com>
-
- * rule-editor.c (rule_add): Change dialog from OK/Cancel to
- Cancel/OK to match HIG.
- (rule_edit): Likewise.
- (rule_editor_construct): Likewise.
-
- * rule-context.c (rule_context_add_rule_gui): Change dialog from
- OK/Cancel to Cancel/OK to match HIG.
-
- * filter-datespec.c (button_clicked): Change dialog from OK/Cancel
- to Cancel/OK to match HIG.
-
-2003-01-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-editor.c (add_editor_response): Scroll to the newly added
- row. Fixes bug #3725.
- (rule_delete): Scroll to the selected row.
- (rule_move): After moving the row, re-select it and then scroll to
- make sure that it is still visible. Fixes bug #7800.
-
-2003-01-02 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixed to build with -DG_DISABLE_DEPRECATED and
- -DGTK_DISABLE_DEPRECATED
-
-2002-12-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-editor.c (cursor_changed): Use an easier method for getting
- the iter.
-
-2002-12-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * vfolder-rule.c (vfolder_editor_sourcelist_new): New custom
- function for creating the source_list widget.
- (get_widget): Removed the source_list creation code.
-
- * rule-editor.c (rule_editor_construct): Listen to row-activated
- for double-click events. Also, removed the model creation code out
- of here.
- (rule_editor_treeview_new): Moved the treeview and model creation
- code into here instead, and made the glade widgets into custom
- widgets.
-
-2002-11-26 Not Zed <NotZed@Ximian.com>
-
- * vfolder-rule.c (get_widget): Add a textcellrenderer to display
- the folders.
- (get_widget): Remove FIXME which was wrong.
-
- * filter-rule.c (filter_rule_validate): FILTER_RULE_CLASS ->
- _GET_CLASS
-
- * rule-context.c (rule_context_save): RULE_CONTEXT_CLASS ->
- RULE_CONTEXT_GET_CLASS
- (rule_context_revert): "
-
- * *.[ch]: Ran fix.sh over all files.
-
- * rule-editor.c (rule_add): widget:set_parent ->
- window:set_transient_for
- (editor_response): renamed from editor_clicked, handle gtk dialog
- response codes.
- (rule_edit): connect to response rather than clicked.
- (rule_editor_construct): Setup a text column in the tree view.
- Not sure if this can be handled via glade.
-
-2002-11-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-label.c (xml_create): gconfify.
-
-2002-11-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-editor.c: Updated to use GtkTreeView.
-
- * vfolder-rule.c: Same.
-
-2002-11-13 Not Zed <NotZed@Ximian.com>
-
- * rule-context.c (load): Get the root node properly.
-
- * rule-editor.c (rule_add): cast g_object_weak_ref
- (rule_edit): "
-
- * all: xml2 node change - childs->children. Also, ignore 'text'
- nodes while scanning tree.
-
- * rule-context.h: gnome-xml->libxml.
-
- * filter-element.h: gnome-xml->libxml
-
- * vfolder-rule.c (source_add): comment out gtk_destroyed check.
-
- * filter-label.c: Added back some of the guts. Might not work but
- some of the code uses it :-/. Gives u a fixed set of non-editable
- labels.
-
-2002-11-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-editor.c (rule_edit): Use weak_ref instead of connecting to
- "destroy".
- (rule_add): Same.
-
-2002-11-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * vfolder-rule.c (validate): Use a GtkDialog instead of a
- GnomeDialog for reporting errors.
-
- * rule-editor.c (rule_add): Use a GtkDialog instead of
- GnomeDialog.
- (rule_edit): Same.
- (add_editor_response): Use a GtkMessageDialog for the error
- reporting instead of a GnomeDialog.
- (edit_editor_response): Same.
-
- * rule-context.c (rule_context_add_rule_gui): Use a GtkDialog
- instead of a GnomeDialog.
-
- * filter-rule.c (validate): Use GtkDialog instead of GnomeDialog
- here.
-
- * filter-input.c (validate): Use GtkDialog instead of GnomeDialog
- here.
-
- * filter-folder.c (validate): Use GtkDialog instead of GnomeDialog
- here.
-
- * filter-file.c (validate): Use GtkDialog instead of GnomeDialog
- here.
-
- * rule-editor.c: Subclass GtkDialog instead of GnomeDialog.
-
- * filter-datespec.c (validate): Use GtkDialog instead of
- GnomeDialog.
- (button_clicked): Same.
-
-2002-11-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-label.c (xml_create): Deleted most of the internals until
- we devise a gconf schema and redesign how we want to do this. It
- didn't work correctly for 1.2 anyway.
-
- * filter.glade: Converted to the glade-2 format.
-
-2002-11-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-filter.c: Ported.
-
- * filter-source.c (get_widget): Don't use e_utf8_to_gtk_string.
-
- * filter-option.c (xml_create): Don't use e_utf8_xml1_decode.
-
- * filter-input.c (xml_encode): Don't use e_utf8_xml1_encode.
- (xml_decode): Don't use e_utf8_xml1_decode.
- (entry_changed): Don't use e_utf8_gtk_entry_get_text.
- (get_widget): Don't use e_utf8_gtk_entry_set_text.
-
- * filter-file.c (xml_encode): Don't use e_utf8_xml1_encode shit.
- (xml_decode): Don't use e_utf8_xml1_decode.
- (entry_changed): Don't use e_utf8_gtk_entry_get_text.
- (get_widget): Don't use e_utf8_gtk_entry_set_text.
-
-2002-11-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * vfolder-rule.c: Ported.
-
- * vfolder-editor.c: Ported.
-
- * vfolder-context.c: Ported.
-
-2002-11-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-rule.c: Ported.
-
- * score-rule.c: Ported.
-
- * score-editor.c: Ported. Again, thise code seems to be unused.
-
- * score-context.c: Ported. Although it seems this code isn't
- really used anywhere?
-
-2002-11-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-part.c: Ported.
-
- * filter-editor.c: Also ported.
-
- * rule-editor.c: Ported to gtk2 and removed unnecessary e_utf8 snot.
-
-2002-11-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-context.c: Ported this too.
-
- * rule-context.c: Ported to glib2/GObject.
-
-2002-11-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-element.c: Ported to GObject.
-
- * filter-input.c: Same.
-
- * filter-code.c: This too.
-
- * filter-colour.c: And this.
-
- * filter-datespec.c: You guessed it.
-
- * filter-file.c: And again...
-
- * filter-folder.c: Wheee! This is fun...
-
- * filter-int.c: Gee, I wonder...
-
- * filter-label.c: Also ported.
-
- * filter-option.c: Yep, this too.
-
- * filter-source.c: And finally this one.
-
-2002-10-30 Dan Winship <danw@ximian.com>
-
- * rule-editor.c (rule_add): Adjust default rule editor size to
- accomodate the menu widening caused by "Pipe Message to Shell
- Command".
-
-2002-10-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * filtertypes.xml: Removed the Run Once filter action.
-
-2002-09-30 Aaron Weber <aaron@ximian.com>
-
- * filter-folder.c (validate): adjust string on 149 to "You must
- specify a folder.
-
- * filter-datespec.c (get_best_span): adjust string on 174 from
- "You have forgotten to choose a date" to "You must choose a date."
-
-2002-09-25 Dan Winship <danw@ximian.com>
-
- * filter-folder.c (get_widget): Use "mail/*" as the allowed folder
- type.
-
- * vfolder-rule.c (source_add): Likewise
-
-2002-09-22 Dan Winship <danw@ximian.com>
-
- * filter-context.c (filter_delete_uri): add empty statement after
- label to make it ANSI.
-
-2002-09-19 Not Zed <NotZed@Ximian.com>
-
- * filtertypes.xml: Changed source account, use header-source
- rather than (= (get-source) ...)
-
-2002-09-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * filtertypes.xml: Add a Run Once action to run a command only
- once rather than for each message that has that action applied.
-
-2002-08-08 Not Zed <NotZed@Ximian.com>
-
- * rule-editor.c (add_editor_clicked): Dont allow duplicate names.
- (edit_editor_clicked): Same here. For #24803.
-
-2002-08-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-context.c (save): Don't need to save temp/backup files
- anymore, e_xml_save_file() now handles this for us (well, at least
- the saving of temp files). I'm not sure we need a backup file
- anymore now that we can depend on e_xml_save_file() to "Just Work"
-
-2002-08-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-context.c (save): Use e_xml_save_file().
- (xml_doc_save): Removed this code and added it to gal so that
- e-table and all other parts of evolution and so forth could use
- it.
-
-2002-08-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-context.c (xml_doc_save): New internal function to replace
- xmlSaveFile. Does proper error checking and so forth to ensure
- that the resulting file does not ever get truncated.
- (save): Cal xml_doc_save rather than xmlSaveFile. Fixes bug
- #25980.
-
-2002-08-02 Not Zed <NotZed@Ximian.com>
-
- * filter.glade: Added a datespec editor window.
-
- * filter-datespec.c (button_clicked): Rewritten to use glade.
- Simplified all the code around it as a result, etc, and fixed bug
- #21798.
-
-2002-08-01 Peter Williams <peterw@ximian.com>
-
- * filter-datespec.c (activate_specified): If the value was unset,
- initialize it to now.
-
-2002-07-31 Ettore Perazzoli <ettore@ximian.com>
-
- * filter-option.c (xml_create): Remove unused variable.
-
-2002-07-30 Peter Williams <peterw@ximian.com>
-
- * filter-rule.c (get_widget): Translate the rule name when filling
- in the name entry.
-
-2002-07-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * filtertypes.xml: Add xml to unset system flags.
-
-2002-07-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-int.c (xml_decode): Use fs->type in xmlGetProp since we
- already free'd 'type'. Fixes bug #28113.
-
- * filter-element.c: Removed the empty private struct.
-
- * filter-int.c: Removed the empty private struct.
-
-2002-07-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-int.[c,h]: Use GtkType (I only changed this one because I
- turned on debugging for a bit).
-
- * filter-file.c (validate): Fix the strcmp logic a bit, I had it
- the exact opposite of what I really wanted. Oops :-)
-
-2002-07-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-file.c (validate): Do some minimalistic validation of
- command-lines (ie, make sure it isn't an empty string).
-
- * filtertypes.xml: s/shell-exec/shell/ (for the action) and pass
- "/bin/sh" "-c" as the first 2 arguments. For the shell-exec
- *rule*, change the name to "pipe-message" and add the "/bin/sh"
- "-c" arguments too.
-
-2002-07-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-label.c (xml_create): Use the U_() macro to get the UTF-8
- translation.
-
-2002-07-15 Not Zed <NotZed@Ximian.com>
-
- * filter-score.[ch]: cvs remove.
-
- * filter-element.c: Remove reference to filter-score.h
-
- * vfoldertypes.xml: Fix label vfolder rule as below, also add
- score and size rules from filtertypes.xml.
-
- * filtertypes.xml (score): Use (cast-int (user-tag "score")) to
- get the value directly, rather than (get-score).
- (label): Use (user-tag "label") to get the value directly, rather
- than (get-label). The label is now a string too.
-
- * filter-label.c (filter_label_get_type): Make filter-label
- inherit from filter-option. Which makes more sense doesn't it
- ... surely.
- (validate): Removed, optionlists are self-validating.
- (xml_create): Initialise the list of options from our
- configuration database. If it isn't working, ignore it and set it
- up anyway.
- (filter_label_init): Override the xml type.
- (filter_label_count):
- (filter_label_label):
- (filter_label_index): Some helper functions for external
- interfaces. All of the mail config/etc should use this.
-
- * filter-option.c (free_option):
- (xml_create):
- (clone): Made the "value" type in glib memory rather than xml
- memory space.
- (filter_option_add): Utility function to add a new option to the
- list.
- (clone): Use above function to simplify code.
- (xml_create): Same here.
- (xml_encode): Allow subclasses to override the type.
-
-2002-07-10 Not Zed <NotZed@Ximian.com>
-
- ** fixes for #10781
-
- * filter-int.c (xml_encode):
- (xml_decode): Handle encoding/decoding with a type name, in a
- manner compatible with the score/label elemtns.
- (filter_int_new_type): New constructor to create a generic 'int'
- type.
-
- * filter-score.c: Removed. Now relies on using a filter-int with
- appropriate settings.
-
- * filter-label.[ch]: Now inherits from filter-int.
-
- * rule-context.c (rule_context_revert): New method to revert a
- filter context back to a user-file's definition.
- (revert): implementation.
-
- * filter-rule.h: Added new virtual method _eq and wrapper, and
- fixed all subclasses to implement it.
-
- * filter-element.h: Added new virtual method _eq and wrapper.
- Fixed all subclasses to implement it.
-
-2002-07-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * filtertypes.xml: Make the sound type for (play-sound ) a "file"
- type rather than "string" since users will want to use a filesel
- to select it most likely. Fixes bug #26921.
-
- * filter-file.c (validate): If the type is "file" check that it is
- a valid file, otheriwse if it is a command-line just ignore it for
- now.
-
- * filter-element.c (filter_element_new_type_name): A filter type
- of "file" should also use the filter-file object.
-
-2002-05-24 Ettore Perazzoli <ettore@ximian.com>
-
- * filter-rule.c (get_widget): Fix English grammar.
-
-2002-05-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * vfoldertypes.xml: Added a label definition.
-
- * filtertypes.xml: Added a label definition.
-
- * filter-label.c: New filter widget for labels.
-
- * filter-element.c (filter_element_new_type_name): Add support for
- the new label widget.
-
- * filter-int.c (format_sexp): Fixed a memory leak.
-
-2002-05-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-file.c (get_widget): Set the path in the entry widget.
-
- * Makefile.am: Add filter-file.[c,h] to the build.
-
- * filtertypes.xml: Add a "Command" filter rule.
-
- * filter-element.c (filter_element_new_type_name): Add support for
- type "command" which uses the new FilterFile widget.
-
- * filter-file.[c,h]: New filter widgets for choosing files and/or
- command-line's (?). Not yet hooked up or anything, just for future
- use.
-
-2002-05-08 Not Zed <NotZed@Ximian.com>
-
- * rule-context.c (rule_context_delete_uri): Changed to return a
- GList *, a list of the names of the rules affected by the delete,
- fixed all implementors.
- (rule_context_rename_uri): Similarly for delete_uri, for
- api consistency.
- (rule_context_free_uri_list): Util function to free the return
- from above.
-
- * filter-context.c (filter_delete_uri): Actually implement it, fix
- for #18826, and some related bugs.
-
-2002-04-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * Makefile.am: Get rid of ibex stuff, we no longer use it.
-
-2002-04-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * filtertypes.xml: The score "is" rule should have a value of "is"
- and not "less-than".
-
-2002-04-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-rule.c (get_widget): Fixed a grammer mistake, or so
- according to bug #23376. Whatever.
-
-2002-04-11 Russell Steinthal <rms39@columbia.edu>
-
- * filtertypes.xml: Fix "Follow Up" searches by generating a
- boolean, rather than a string result (Fixes #23334)
-
- * vfoldertypes.xml: Ditto
-
-2002-04-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-editor.c (double_click): This needs to return a gboolean
- (TRUE).
- (rule_edit): Using gnome_dialog_set_parent instead of
- gtk_widget_set_parent_window seems to fix bug #23226.
-
-2002-04-10 Not Zed <NotZed@Ximian.com>
-
- * filter-input.c (validate): Check that there is a value to
- setup. Fixes #15470.
-
- * filtertypes.xml: Added closing ) for "not starts with" subject
- rule.
- Added closing ) for all the other broken rules too ...
-
-2002-04-04 Dan Winship <danw@ximian.com>
-
- * filter-folder.c: Remove the #ifndef SHELL part. Use an
- EvolutionFolderSelectorButton. Remove FilterFolder->name since
- it's no longer needed.
-
- * filter-context.c (filter_rename_uri): Update for removal of
- FilterFolder->name.
-
- * filter-element.c (filter_element_copy_value): Likewise.
-
- * vfolder-rule.c (source_add): Update for
- evolution_shell_client_user_select_folder API change.
-
-2002-04-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-editor.c (rule_edit): Set 're' as the parent window rather
- than as the parent widget.
- (add_editor_clicked): Only unref the editor if it is non-NULL.
-
-2002-03-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-source.c (filter_source_get_sources): Free account_name
- so we don't leak. Also after getting the source uri, use camel-url
- to hide unwanted stuff.
- (xml_decode): Use xmlFree on the buffer returned from
- xmlNodeGetContent rather than g_free, as I think they are
- incompatable. Also use camel-url here to hide any params in the
- decoded url (to make things compatable with what older versions
- may have saved).
-
-2002-03-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * filtertypes.xml: Added beep and play-sound actions.
-
-2002-02-26 Not Zed <NotZed@Ximian.com>
-
- * filter-filter.c (option_activate): Copy values across to new
- part.
-
- * filter-rule.c (option_activate): copy values across to new part,
- if they are compatible.
-
- * filter-element.c (filter_element_copy_value): New function to
- copy values (where they can be) from one filter element to another.
-
- * filter-part.c (filter_part_copy_values): New function to copy
- values of a filter part. #1359.
-
-2002-02-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * vfoldertypes.xml:
- * filtertypes.xml: Re-added contains and
- not-contains. Also added filter/vfolder rules for
- Flag-for-Followup.
-
-2002-02-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * vfoldertypes.xml: Same here.
-
- * filtertypes.xml: For mlist matching, we only want "is" and "is
- not" because that is all we really support anyway.
-
-2002-01-27 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am: Use LIBFILTER_CFLAGS.
-
-2002-01-26 Mikael Hallendal <micke@codefactory.se>
-
- * rule-editor.c (add_editor_clicked): check if re->edit != NULL
- before trying to unref it. Fixes a segfault when closing the
- rule editor.
-
-2002-01-15 Not Zed <NotZed@Ximian.com>
-
- * filter-input.c (xml_decode): If we write "" to an xml file, we
- read back NULL. So if we read back NULL, convert it to "".
- Sigh. This makes a fix for #7801, although new gui may also be
- required.
-
-2002-01-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-source.c (filter_source_get_sources): Get the account
- name because that is the string we'd like to use for display.
- (get_widget): Generate the account label the same as we do for the
- composer's From optionmenu.
- (filter_source_finalize): Free the account_name.
- (clone): Pass along the account_name member to filter_add_source
-
-2002-01-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * vfoldertypes.xml: Make the date comparisons read the same as the
- ones in filtertypes.xml
-
-2001-12-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * filtertypes.xml: Add new action to execute a shell command.
-
-2001-12-09 Jon Trowbridge <trow@ximian.com>
-
- * vfoldertypes.xml: Add "Needs Reply" option to different status
- types.
-
- * filtertypes.xml: Add "Needs Reply" option to different status
- types.
-
-2001-11-15 Zbigniew Chyla <cyba@gnome.pl>
-
- * rule-editor.c (set_source): Removed U_. Fixes #15415.
-
-2001-11-21 Not Zed <NotZed@Ximian.com>
-
- * rule-editor.c (rule_edit): Hook onto destroy event.
- (edit_editor_destroyed): IF we get destroyed, fake a -1 click
- event to clean up.
- (rule_add): hook onto destroy of dialogue.
- (add_editor_destroyed): Simulate -1 click event to clean up. Fix
- for #15745.
-
-2001-11-20 Not Zed <NotZed@Ximian.com>
-
- * vfolder-rule.c (source_add): Desensitise button while we're
- running, and if we are destroyed, exit and do nothing when we're
- done. Fixes crash in #15498.
-
- * filter-folder.c (button_clicked): Ref 'ff' around dialogue
- showing incase we go away before it returns. Also desensitise
- button that invoked us while its being processed & remove
- 'is_active' hack. Fixes similar problems to those in #15498.
-
-2001-11-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-rule.c (validate): Force the user to name the filter.
-
- * vfolder-rule.c (validate): Force the user to name the vfolder.
-
-2001-10-29 <NotZed@Ximian.com>
-
- * rule-editor.c: Some debug printf fixes for printf's that dont
- like null %s's.
- Fixed previous fix.
- (rule_editor_play_undo): Need to ref rule since add doesn't. This
- doesn't crash anymore but doesn't seem to do everything right either.
-
-2001-10-28 <NotZed@Ximian.com>
-
- * filter-context.c (filter_rename_uri): Implement, change any
- folder uri's that have been renamed, to the new one.
- (filter_delete_uri): Dont actually do any work (yet).
-
- We could probably put rename_uri on every rule context/filter
- part/filter element, and let their methods handle it, but for now
- its easy enough just to handle the few cases that we have to
- handle manually.
-
- * rule-context.c (rule_context_delete_uri): Update a filter
- context for a deleted uri, e.g. folder removed.
- (rule_context_rename_uri): Update a filter context for a renamed
- uri, e.g.
-
- * filter-folder.c (filter_folder_set_value): New function to set
- the uri of a folder filter.
-
- * rule-editor.c (rule_move): Add undo for move.
- (rule_editor_add_undo): Add extra rank item.
- (rule_editor_play_undo): handle rank case.
- (rule_editor_finalise): Clean up any hanging over undo log.
- (editor_clicked): Only enable 'undo' if we have
- EVOLUTION_RULE_UNDO enabled. Code still a bit flakey.
- (rule_editor_construct): Only enable a cancel button if
- EVOLUTION_RULE_UNDO is set.
- (rule_editor_add_undo): Only add if undo enabled.
- (rule_editor_add_undo): Fix enable undo logic.
-
- * filter-rule.c (filter_rule_set_name): Emit a changed event if it
- changes.
- (filter_rule_set_source): Same.
-
-2001-10-26 <NotZed@Ximian.com>
-
- * rule-context.c (rule_context_find_rank_rule): Find a rule at a
- specific rank/source.
-
- * rule-editor.c (add_editor_clicked): Log the added object.
- (rule_editor_add_undo): New function to add an undo record to the
- rule editor.
- (edit_editor_clicked): Log the changed object.
- (rule_delete): Add undo object.
- (rule_editor_play_undo): Play an undo log back.
-
-2001-10-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-editor.c (rule_add): Desensitize the parent dialog.
- (rule_edit): Same.
- (add_editor_clicked): Re-sensitize it.
- (edit_editor_clicked): Same.
-
-2001-10-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-editor.c: Keep track of the current editor dialog window so
- that on exit, we can close it too.
- (rule_edit): Don't make the dialog modal and set it's parent
- window as well as don't allow more than a single editor window to
- be popped up.
- (rule_add): Same.
-
-2001-10-24 <NotZed@Ximian.com>
-
- * rule-context.c (rule_context_class_init): Add a changed signal.
- Emits if the order changes or if you add or remove a rule.
- (rule_context_rank_rule): Fix rank rule to properly rank based on
- source, not merely on list position.
- (rule_context_add_rule): Also emit changed signal.
- (rule_context_remove_rule): Same.
- (rule_context_rank_rule): Emit changed signal.
-
-2001-10-20 Jon Trowbridge <trow@ximian.com>
-
- * rule-editor.c (set_source): Translate the rule names. (Bug
- #13082)
-
-2001-10-17 Ettore Perazzoli <ettore@ximian.com>
-
- * filter-folder.c (button_clicked): Pass the toplevel to
- `evolution_shell_client_user_select_folder()'.
- * vfolder-rule.c (source_add): Likewise.
-
-2001-10-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-folder.c (button_clicked): Kludge to raise the filter
- dialog when the folder-selection window is closed.
-
-2001-10-15 <NotZed@Ximian.com>
-
- * filter-input.c (xml_decode): If we have no node content, dont
- append any value or try to decode it. Gets rid of a bunch of
- annoying warnings.
-
-2001-10-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * vfolder-rule.c (validate): And again here.
-
- * filter-folder.c (validate): Same.
-
- * filter-datespec.c (validate): Take out the "Oops" part of the
- warning.
-
-2001-10-04 <NotZed@Ximian.com>
-
- * rule-context.c (save): "safe" save code, first save to .#name,
- then rename to name if it worked, also create backups to name~.
- Means filters/etc wont get reset/lost if disk fills up, although
- relies on libxml failing properly.
- (new_rule_clicked): Removed warning, we do now have changed
- signals!
-
-2001-09-28 <NotZed@Ximian.com>
-
- * vfolder-rule.c (vfolder_rule_add_source): Emit changed events
- when we change it.
- (vfolder_rule_remove_source): "
-
-2001-09-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-editor.c (edit_editor_clicked): Set the item label to the
- new rule name, not the old rule name. Fixes bug #11168.
-
-2001-09-27 <NotZed@Ximian.com>
-
- * vfolder-rule.c (xml_decode): Use g_strdup for the uri, not the
- xml memory.
-
- * filter-driver.c, filter-message-search.c: Removed, again, how
- did they come back???
-
-2001-09-13 <NotZed@Ximian.com>
-
- * filter-filter.c (filter_filter_add_action):
- (filter_filter_remove_action):
- (filter_filter_replace_action): Emit changed events.
-
- * filter-rule.c (filter_rule_xml_decode): Emiot a rule changed
- event.
- (filter_rule_copy): Emit a changed event.
- (filter_rule_replace_part): "
- (filter_rule_add_part): "
- (filter_rule_remove_part): "
- (filter_rule_xml_decode): Freeze around decoding, so we only emit
- changed when done.
- (filter_rule_emit_changed): New function to emit changed events if
- not frozen.
-
-2001-09-13 <NotZed@Ximian.com>
-
- * rule-context.c (rule_context_class_init): Added a 'rule_added'
- and 'rule_removed' signal.
- (rule_context_load): Set a (private) frozen flag while we're
- loading.
- (rule_context_add_rule): Emit a rule_added signal if we're not
- frozen.
- (rule_context_remove_rule): Emit a rule_removed signal if we're
- not frozen.
-
-2001-09-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-editor.c (rule_edit): Clone the current rule before editing
- it so that changes can be undone.
- (edit_editor_clicked): If the user hit OK, replace the original
- rule with the new one.
-
- * vfolder-rule.c (vfolder_rule_finalise): Free the sources list.
- (rule_copy): Implemented.
-
- * filter-filter.c (rule_copy): Implemented.
-
- * filter-rule.c (filter_rule_copy): New convenience function to
- copy one rule "into" another.
- (rule_copy): Default implementation.
- (filter_rule_clone): Use filter_rule_copy() internally to get rid
- of the nastiness/slowness of xml encoding and then decoding.
-
-2001-09-12 <NotZed@Ximian.com>
-
- * vfoldertypes.xml: Remove the match-all from the not
- body-contains, so we can use the new vector not function.
-
-2001-09-10 <NotZed@Ximian.com>
-
- * filter-score.c (format_sexp): Encode the score as an integer
- string, not as a string of integers. #5098.
-
-2001-09-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-datespec.c (button_clicked): Allow the dialog's title to
- be translated.
-
-2001-08-19 Chris Toshok <toshok@ximian.com>
-
- * filter-input.c: #include <sys/types.h> for regex_t on freebsd.
-
-2001-08-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter.glade: Added key accelerators.
-
-2001-08-14 Peter Williams <peterw@ximian.com>
-
- * filter-rule.c (xml_decode): Match either "title" or "_title" to
- allow for translations of the title (provided in the default
- files)
-
-2001-08-13 Peter Williams <peterw@ximian.com>
-
- * filter-datespec.c (make_span_editor): Add a gettext around our static
- strings.
- (format_time): New function. Convert a time_t to a gchar * (with i18n)
- (describe_button): Use format_time instead of ctime.
-
-2001-08-10 Peter Williams <peterw@ximian.com>
-
- * rule-context.c (rule_context_add_rule_gui): Make this compile again.
-
-2001-08-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-context.c (rule_context_add_rule_gui): No need to
- gtk_widget_show() the gnome dialog widget twice...
-
- * vfolder-rule.c (get_widget): Unref the glade_xml gui object
- before returning.
-
-2001-08-08 Radek Doulik <rodo@ximian.com>
-
- * filter-folder.c (button_clicked): don't mix g_free and xmlAlloc
- (xml_decode): don't mix g_free and xmlAlloc
-
- * filter-code.c (filter_code_init): use xmlStrdup instead of
- g_strdup
-
- * filter-input.c (filter_input_new_type_name): use xmlStrdup
- instead of g_strdup
- (filter_input_finalise): don't mix g_free and xmlAlloc
-
- * filter-option.c (clone): use xmlStrdup instead of g_strdup
- (free_option): don't mix g_free and xmlAlloc
-
- * filter-source.c (clone): use xmlStrdup rather than g_strdup
-
- * filter-element.c (filter_element_finalise): don't mix g_free and
- xmlAlloc
-
-2001-08-07 Not Zed <NotZed@Ximian.com>
-
- * filter-rule.c (filter_rule_finalise): Properly free the list of
- parts, and the private data.
- (FilterRulePrivate): Remove unused 'parts' member.
-
- * filter-option.c (free_option): For freeing options.
- (filter_option_finalise): Free options list.
-
- * filter-element.c (filter_element_finalise): free name.
-
- * filter-input.c (filter_input_finalise): Free type and values
- list.
-
- * filter-context.c (filter_context_finalise): Free the actions.
-
- * rule-context.c (rule_context_finalise): Remove the totally weird
- arsed *_set_list free code.
- (free_part_set):
- (free_rule_set): Use this to free stuff using g_list_foreach.
- (rule_context_finalise): Free the error string.
- (rule_context_finalise): Free the rules and parts.
-
-2001-08-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * filtertypes.xml: Reverted my previous change, I fixed the filter
- code to handle this the way danw said to handle it in bug #5886
- now.
-
-2001-08-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * filtertypes.xml: Removed the "is" and "is not" rules from the
- xml file for address matching because users are easily confused.
-
-2001-08-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-rule.c (get_widget): Do an evil kludgy hack so that the
- Rule Name entry widget gets focused when the filter editor is
- shown.
-
-2001-08-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-rule.c: Wrap some debug printf's with d().
-
- * rule-context.h: Removed prototype for rule_context_delete_rule()
- since the function doesn't exist.
-
-2001-07-23 Jon Trowbridge <trow@ximian.com>
-
- * vfolder-rule.c (validate): Added a validate function
- that checks to make sure that vfolders that have "specific
- folders" as their source actually have a non-empty list of
- source folders selected. (Bug #4937)
- (get_widget): If fr->source is NULL for some reason, bring
- it into sync with the default in the option menu.
-
-2001-07-23 Peter Williams <peterw@ximian.com>
-
- * filter-datespec.c (make_span_editor): Change the butt-ugly
- UI to a saner (and just as flexible) one. Instead of all those
- spinbuttons, just have one and let the user select the time unit.
- (omenu_item_activated): New function. When the user changes the
- time unit, convert it from the old number. Pretty.
- (adj_value_changed): This function is now simpler.
- (set_adjustments): Also modified for new UI model.
- (button_clicked): Set the selected_type before calling the callback.
- (FilterDatespecPrivate): Members change a bit.
- (filter_datespec_init): No longer need to allocation spinbuttons
- (filter_datespec_finalise): No longer need to free spinbuttons.
-
-2001-07-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * filtertypes.xml: Removed the "Forward To" filter action.
-
-2001-07-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-context.c (rule_context_get_rank_rule): Return -1 if we
- don't find it? This is what most of the code expected but not what
- we were returning on fail.
-
-2001-07-12 Zbigniew Chyla <cyba@gnome.pl>
-
- * filter-datespec.c (stringify_agoness): Marked string for translation.
-
-2001-07-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * filtertypes.xml: Users should not be able to filter on "Status
- is Deleted" since we don't allow that in the filter driver code.
-
-2001-07-11 Jason Leach <jleach@ximian.com>
-
- * vfoldertypes.xml: Copied the "Attachments" rule part over from
- filtertypes.xml, would be a powerful feature for vfolders (see all
- the patches across all folders, or all the attachments you've sent,
- without having to duplicate potentially big files, blah blah, bug
- #1155).
-
-2001-07-10 Peter Williams <peterw@ximian.com>
-
- * vfoldertypes.xml: Put a match-all around the not-body-contains
- to make it work per-message.
-
- * filtertypes.xml: Same.
-
-2001-07-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-rule.c (get_widget): Set the focus on the title of the
- filter rule.
-
-2001-07-09 Anna Marie Dirks <anna@ximian.com>
-
- * rule-context.c (rule_context_add_rule_gui): Increased the size
- of the "Add Filter Rule" dialog to 600 x 400, so that no resizing
- is necessary to use the dialog.
-
-2001-07-09 Jon Trowbridge <trow@ximian.com>
-
- * filter-source.c (filter_source_get_sources): Bonobo-conf-ified.
- Removed /home/trow hard-wiring. :)
- (xml_encode): Encode things properly.
- (xml_decode): Decode things properly.
- (get_widget): Ignore accounts w/o source URLs.
- (clone): Set the ->name in our copy.
-
-2001-07-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-editor.c (rule_delete): Select the most appropriate filter
- rule.
-
- * filtertypes.xml: Fix bug #4043: s/colour/color
-
-2001-07-03 Peter Williams <peterw@ximian.com>
-
- * filter-source.c (get_widget): Prevent crashing while we work
- this out.
-
- * filter-rule.c (get_widget): Don't try to gtk_widget_grab_default
- with a widget that can't be the default. Altough it should be able
- to....
-
-2001-07-02 Sam Creasey <sammy@oh.verio.com>
-
- * filter-int.c: Added an integer type for filtering values. used
- for size.
-
- * Makefile.am (SOURCES): added filter-int.c, filter-int.h
-
- * filtertypes.xml: added a part entry for size based filters
-
-2001-07-02 Anna Marie Dirks <anna@ximian.com>
-
- * filter-rule.c (get_widget): Changed "Add criterion" button to
- have normal button relief in response to complaints of it not
- appearing clickable.
-
- * filter-filter.c: Changed "Add action" button to have normal
- button relief in response to complaints of it not appearing
- clickable.
-
-2001-06-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-editor.c (rule_editor_construct): Set the filter-rule
- dialog to be user-resizable.
-
-2001-06-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * filtertypes.xml: Make "Move" the default action.
-
-2001-05-08 Not Zed <NotZed@Ximian.com>
-
- * filter-rule.c: Deleted Gediminas patch.
-
-2001-05-08 Gediminas Paulauskas <menesis@delfi.lt>
-
- * filter-rule.c (xml_decode): allow "_title" in user
- rules. translate them and encode to utf8.
- (get_rule_part_widget): do not call gettext on part->title. It is
- always translated already.
-
-2001-04-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-editor.c (rule_edit): Set the default size of the dialog to
- 600x400, which seems to be a nice size that fits all the widgets
- into it.
- (rule_add): Same.
-
-2001-04-26 Dan Winship <danw@ximian.com>
-
- * Makefile.am (INCLUDES): Remove UNICODE_CFLAGS
-
-2001-04-26 Not Zed <NotZed@Ximian.com>
-
- * filter-part.c (filter_part_xml_create): Blah blah fix for xml1
- broken utf8 encoding, and use "g" memory for all allocations.
- (filter_part_finalise): Free our data properly.
-
-2001-04-20 Kjartan Maraas <kmaraas@gnome.org>
-
- * filter-rule.c: Pull up fix for translation of filter
- direction drop down menu from the branch.
-
-2001-04-18 Dan Winship <danw@ximian.com>
-
- * filter-colour.c, filter-datespec.c, filter-folder.c,
- filter-input.c, filter-option.c, filter-rule.c, filter-score.c,
- filter-source.c, score-rule.c (xml_decode): Plug memory leaks.
-
- * rule-context.c (rule_context_finalise): Implement. Free stuff.
-
- * filter-element.h: #include <gnome-xml/xmlmemory.h> here for xmlFree
-
- * filter-filter.c, filter-part.c: Remove xmlmemory.h #include
-
-2001-04-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * filtertypes.xml: s/Is/is/ and s/Is Not/is not/ to be more
- consistant with the rest.
-
-2001-04-13 Jon Trowbridge <trow@gnu.org>
-
- * filtertypes.xml: Add XML specs for source account filtering.
-
- * filter-element.c (filter_element_new_type_name): Recognize
- type "source", construct a FilterSource.
-
- * filter-source.c: Added. A FilterElement for the account e-mail
- comes from.
-
-2001-04-04 Kjartan Maraas <kmaraas@gnome.org>
-
- * filter-editor.c: Fix headers.
- * filter-filter.c: Same here.
- * filter-option.c: Same here.
- * filter-part.c: Same here.
- * filter-rule.c: Same here.
- * rule-editor.c: Same here.
- * score-editor.c: Same here.
- * vfolder-editor.c: Same here.
- * vfolder-rule.c: Same here.
-
-2001-04-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-filter.c (option_activate): Set the newpart on the
- container object.
- (less_parts): Remove the rule tht the user wants to remove.
- (attach_rule): Attach a new rule and it's remove button to the end
- of the table.
- (more_parts): Fix to resize the table and such.
- (get_widget): Don't have a remove action button, we are putting
- this next to the rule part now.
-
-2001-03-30 Kjartan Maraas <kmaraas@gnome.org>
-
- * *.*: Fix headers. Remove unneccesary ones and replace
- with more finegrained ones where needed.
-
-2001-03-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-datespec.c (validate): Oops, an unspecified date is '0',
- not -1.
-
-2001-03-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-context.c (new_rule_clicked): Validate the rule before
- closing.
-
-2001-03-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * rule-editor.c (rule_edit): Set the editor dialog modal rather
- than setting the filter dialog insensitive. Also ref re->edit
- since we unref it when the editor closes. This should fix bug
- #1905.
- (edit_editor_clicked): No need to set the filter dialog sensitive
- again.
- (rule_add): Set the add-rule dialog modal and don't set the filter
- dialog insensitive.
- (add_editor_clicked): No need to set the filter dialog sensitive
- again.
-
-2001-03-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-option.c (build_code): Since we are now using
- filter-option widgets in place of system-flag, we do not need a
- "code" part so if there isn't a code part, don't build it.
- (clone): Updated to allow NULL code parts.
-
-2001-03-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-element.c (filter_element_new_type_name): If the filter
- type is a "system-flag", use the optionlist type as type
- system-flag has been removed. This should allow backward
- compatability.
-
- * filter-editor.c (filter_editor_construct): Remove the menu that
- is in the glade file because we want to replace it with our menu,
- not append items to that menu.
-
- * filtertypes.xml: Oops, missed the system-flag action-set.
-
- * vfoldertypes.xml: Update "status" ruleset.
-
-2001-03-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * Makefile.am: Removed filter-url.[c,h] and
- filter-system-flag.[c,h]
-
- * filter-element.c (filter_element_new_type_name): Removed
- references to the url-type and system-flag types.
-
- * filtertypes.xml: Removed "source" type and fixed "status" to use
- the optionmenu.
-
- * filter-url.[c,h]: Removed.
-
- * filter-system-flag.[c,h]: Removed (just use optionmenu).
-
-2001-03-15 Not Zed <NotZed@Ximian.com>
-
- * filter.glade: Changed the edit_filter to be a standalone window
- rather than a widget, so we can get the rule editor part out
- separately. Same for vfolder editor, and new score, and basic rule
- editors.
-
- * score-editor.c (score_editor_new): Turned back on object
- stuff, subclass rule-editor, and removed most of the code.
-
- * filter-editor.c (filter_editor_new): Turned into an object,
- subclass rule-editor, removed most of the code. Now we accept the
- source list during create, and plug that into the glade.
-
- * vfolder-editor.c (vfolder_editor_new): Turned back on object
- stuff, subclass rule-editor, and removed most of the code.
-
- * Makefile.am (libfilter_la_SOURCES): Added rule-editor.[ch].
-
- * filter-filter.c (validate): inherit the validate function and
- also validate the actions part of a filterfilter.
-
- * filter-rule.c (filter_rule_validate): New method so that filter
- rules can validate themselves.
- (validate): Default implementation, validates base rules.
-
- * rule-editor.h: New generic rule editor, to be used for filter
- editor/vfolder editor/score editor/saved searches editor.
-
-2001-03-15 Gediminas Paulauskas <menesis@delfi.lt>
-
- * filter-system-flag.c: translate status flag title.
-
-2001-03-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * filtertypes.xml: Added an "Attachments" filter option where you
- can filter messages that have (or do not have) attachments. This
- does not allow you to filter based on the types of the
- attachments.
-
-2001-03-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * vfolder-editor.c (double_click): Make sure we have something
- selected first ;-)
-
- * filter-editor.c (double_click): And here too.
-
-2001-03-03 Not Zed <NotZed@Ximian.com>
-
- * filter.glade: Added option menu to vfolder editor.
-
-2001-03-02 Not Zed <NotZed@Ximian.com>
-
- * vfolder-rule.c (get_widget): Setup the data on the base source
- opiton menu, and make hte option menu reflect the source.
- (select_source_with): Set the source type for this
- rule. e.g. these folders, "with ..."
-
- * filter-editor.c: Removed the N_() stuff from the source_names
- array, they must not be internationalised!!!
-
-2001-02-28 Not Zed <NotZed@Ximian.com>
-
- * filter-rule.c (filter_rule_clone): New function to clone rules.
-
-2001-02-23 Not Zed <NotZed@Ximian.com>
-
- * filtertypes.xml: Added mailing list matching rules.
- renamed mailing list options to be more meaningful.
-
- * vfoldertypes.xml: Added mailing list rules.
- renamed mailing list options to be more meaningful.
-
-2001-02-11 Gediminas Paulauskas <menesis@delfi.lt>
-
- * filter.glade.h: removed.
- * filter.glade: do not donnt output to above one.
- * Makefile.am: do not include filter.glade.h in EXTRA_DIST.
-
-2001-02-06 Dan Winship <danw@ximian.com>
-
- * filter-option.c (get_widget): Translate the option title.
- (Noticed by Kjartan).
-
-2001-02-05 Kjartan Maraas <kmaraas@gnome.org>
-
- * filter-code.c, filter-colour.c, filter-context.c,
- filter-element.c, filter-input.c, filter-score.c,
- filter-system-flag.c, filter-url.c: Add #include <config.h>
- and mark some strings for translation.
-
-2001-01-22 Not Zed <NotZed@Ximian.com>
-
- * filter-message-search.[ch]: Removed, now lives in
- camel-filter-search.*
-
- * Makefile.am (libfilter_la_SOURCES): Removed filter-driver.[ch]
- and filter-message-search.[ch].
-
- * filter-driver.[ch]: Removed. now lives in camel-filter-driver.*
-
-2001-01-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-driver.c (filter_driver_filter_message): Set the delete
- bit *before* copying to the default folder.
-
-2001-01-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-filter.c (less_parts): Er, don't set the button
- insensitive if there is *1* action, set it insensitive if there
- are less than or equal to *1* actions. Doh!
- (more_parts): Only set the remove button sensitive if there is
- more than 1 action.
- (get_widget): Here too.
-
-2001-01-16 Jason Leach <jasonleach@usa.net>
-
- * e-search-bar.[ch]: Moved ESearchBar to $(toplevel)/widgets/misc,
- a more appropriate home. Bug #1060.
-
-2001-01-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * filter-driver.c (do_copy): Moved p->copied to the inner part of
- the loop so that in the case of a folder not existing, it doesn't
- think that the message was already copied to some place and thus
- not save it to the Inbox.
- (do_move): Same.
-
-2001-01-10 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filtertypes.xml: Changed Priority to Score.
-
- * filter-option.c (get_widget): Attach to the "activate" signal -
- this should now make it so that a filter-option will "remember"
- what a user changed.
-
- * filter-system-flag.c (get_widget): Don't reset fsf->value to the
- first system flag, this should already be defaulted to the
- appropriate flag. This should fix the problem of always defaulting
- to the first menu option and thus "forgetting" the user's settings.
-
-2001-01-04 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-system-flag.c: comment out some of the system flags as we
- don't want to use them.
- (xml_encode): Update the printf
- (get_widget): Use strcmp instead of g_strcasecmp.
-
-2001-01-02 Lauris Kaplinski <lauris@helixcode.com>
-
- * filter-input.c (xml_encode): Encode utf8
- (xml_decode): Decode utf8
-
- * filter-option.c (xml_create): Decode utf8
-
- * filter-part.c (filter_part_xml_create): Decode utf8
-
- * filter_rule.c (xml_encode): Encode utf8
- (xml_decode): Decode utf8
-
-2001-01-02 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (do_flag): Set the 'dirty' flag - this should
- fix the problem of flags not being set (or, more precisely,
- synced).
- (filter_driver_filter_message): Here too.
-
-2000-12-21 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-message-search.c (header_contains): Use
- e_utf8_strstrcase() instead of just strstr().
- (header_starts_with): Make sure that the header contents are
- longer than the starts-with string.
-
- * vfoldertypes.xml: Don't send \"Subject\" to body-contains.
- Also added matches, starts-with, and ends-with xml stuff.
-
-2000-12-28 Dan Winship <danw@helixcode.com>
-
- * filter-message-search.c (handle_multipart, body_contains,
- body_regex): Use CamelContentType rather than GMimeContentField.
-
-2000-12-24 Not Zed <NotZed@HelixCode.com>
-
- * Merge from camel-mt-branch.
-
-2000-12-21 Not Zed <NotZed@HelixCode.com>
-
- * filter-message-search.c (filter_message_search): And here too.
-
- * filter-driver.c (filter_driver_finalise): Kind of revert an
- accidentally commited patch for e_sexp_unref.
-
-2000-12-20 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_filter_message): Oops, slight
- logic error. We want to copy the message to the default folder if
- the message hasn't been Moved (which is the same as Copied &&
- Deleted). This fixes bug #1007.
-
- * filter-rule.c (more_parts): Make sure we have more than 1 part
- before we sensitize the "remove" button.
-
-2000-12-20 Not Zed <NotZed@HelixCode.com>
-
- * filter-message-search.c (filter_message_search): Oops, missed a
- gtk unref of the now-no-longer gtk e_sexp.
-
- * filter-driver.c: Remove mail_tool_lock stuff.
- (filter_driver_finalise): unref e_sexp properly.
-
-2000-12-12 Christopher James Lahey <clahey@helixcode.com>
-
- * e-search-bar.c (esb_pack_menubar): Fixed some warnings.
-
-2000-12-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-folder.c (button_clicked): Added a kludge, 'is_active'
- which is a static variable that holds whether or not there is an
- active shell folder dialog up or not.
-
- * vfolder-editor.c (rule_delete): Autoselect the rule that ends up
- in the same position (or the one above it if the list is shorter
- than the position).
-
-2000-12-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-rule.c (get_widget): Don't highlight the title if it's
- "Untitled" because switching widget focus doesn't cause this
- selection to go away.
-
-2000-12-06 Kjartan Maraas <kmaraas@gnome.org>
-
- * filter-editor.c: Mark some strings for translation.
-
-2000-12-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-element.c (filter_element_new_type_name): Added support
- for the system-flag type.
-
- * Makefile.am: Added filter-system-flag.[c,h].
-
- * filter-system-flag.[c,h]: New type for system flags.
-
- * filtertypes.xml: Oops, looks like we were still using integers
- as arguments to set-flag. Change over to using strings which are
- safer and also change the name to set-system-flag.
-
- * filter-driver.c (do_flag): Use strings instead of integers.
- Instead of set-flag, the callback is now set-system-flag for less
- confusion. Sorry Ettore, but you'll have to change your filters.
-
- * filtertypes.xml: Added system-flags stuff.
-
- * vfoldertypes.xml: And here too.
-
- * filter-message-search.c (system_flag): New ESExp callback for
- filtering on system flags.
-
-2000-11-30 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_filter_message): Use
- camel_message_info_free() instead of freeing everything by hand -
- is this a new function? I don't ever recall seeing this
- before. Also use my new function,
- camel_message_info_new_from_header - ahhh... this code is now so
- beatiful. Okay, I'm done.
-
-2000-11-30 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_filter_message): Update to use
- EStrv in appropriate places (wrapped with #ifdef DOESTRV for the
- moment).
-
-2000-11-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filtertypes.xml: Moved the regex filter rule around - we've
- changed the format a bit.
-
- * filter-option.c (option_activate): Removed.
- (get_widget): Don't connect the activate signal.
-
- * filter-folder.c (validate): Updated.
-
- * filter-datespec.c (validate): Updated.
-
- * filter-part.c (filter_part_validate): Updated.
-
- * filter-input.c (validate): Check the filter-input type - if it's
- of type "regex", then check for regex validity.
-
- * filter-element.c (filter_element_validate): No longer takes a
- gpointer argument.
- (filter_element_new_type_name): Allow type "regex" and create a
- new filter-input with type "regex".
-
-2000-11-24 Michael Meeks <michael@helixcode.com>
-
- * filter-message-search.c (get_full_header): impl.
- (header_full_regex): use it.
-
-2000-11-23 Michael Meeks <michael@helixcode.com>
-
- * filter-message-search.c (header_full_regex): impl.
-
-2000-11-21 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-message-search.c: took out some no longer needed
- printfs.
-
-2000-11-15 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_filter_folder): Sync here
- instead.
- (filter_driver_filter_mbox): And here too.
- (filter_driver_finalise): Don't sync here afterall - it's more
- preferable to sync right after processing.
-
-2000-11-15 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_finalise): Sync the
- defaultfolder.
- (filter_driver_filter_folder): Sync here instead.
- (filter_driver_filter_mbox): And here too.
-
-2000-11-13 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-message-search.c (header_matches): Neglect any leading
- whitespace in the header contents.
- (header_starts_with): Same.
- (header_ends_with): Same.
- (header_soundex): Same.
-
-2000-11-12 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_filter_message): If there is a
- default folder and the message hasn't been deleted then... should
- be: If there is a default folder and the message hasn't been
- copied to another folder and the message hasn't been deleted...
- (filter_driver_filter_message): Make it so that the FILTER_LOG_END
- is only called if filtered were applied to the message so we don't
- get huge gaps of whitespace in the log file.
- (filter_driver_filter_message):
-
-2000-11-10 Christopher James Lahey <clahey@helixcode.com>
-
- * e-search-bar.c: Made the underline show up properly in the main
- menu bar.
-
-2000-11-10 Christopher James Lahey <clahey@helixcode.com>
-
- * e-search-bar.c: Switched from using gtk_menu_item_new_with_label
- for the menu header to using gnome_stock_menu_item.
-
-2000-11-08 Anna Marie Dirks <anna@helixcode.com>
- * e-search-bar.c: Fixed two spacing problems: first, changed
- the spacing around the end of the text-entry widget so that
- the text entry is always aligned with the beginning of the scrollbar;
- second, trimmed down the space between the widgets in the search bar.
-
-
-2000-11-06 Not Zed <NotZed@HelixCode.com>
-
- * filter-driver.c (do_flag): you shouldn't use an integer to
- set the flag. You should use a string, and look it up, because
- the flag bits might change.
- (filter_driver_filter_message): Can som e one PLEASE STOP
- INDENTING THE CODE. Even if i have to come over the and
- beat it into you. YOU DONT INDENT CODE ONCE ITS BEEN CHECKED IN
- TO CVS, otherwise you SCREW UP THE DIFF's. Can't you please
- please learn this?
- (filter_driver_log): Fixes for api changes to mime_message.
-
-2000-11-05 Not Zed <NotZed@HelixCode.com>
-
- * filter-message-search.c (get_sent_date): Fix for date change
- api. No longer need to encode/decode the date, after its been
- encoded/ecoded already.
- (get_received_date): Likewise.
-
-2000-11-06 Christopher James Lahey <clahey@helixcode.com>
-
- * e-search-bar.h: Fixed the argument comment. Removed an old enum
- that's not used here.
-
-2000-11-06 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added e-search-bar.c and e-search-bar.h.
-
- * e-search-bar.c, e-search-bar.h: Moved this from
- e-addressbook-search.
-
-2000-11-02 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_log): Fix for when 'desc' is
- NULL.
- (filter_driver_filter_message): Use a more user-friendly filter
- name in the log file.
-
-2000-11-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_filter_message): Use
- filter_driver_log() where appropriate.
- (do_copy): Use the service url for the path rather than the
- folder->full_name because that'll only get you a "/mbox" which is
- entirely useless. Replace occurences of report_status with
- filter_driver_log.
- (do_move): Same.
- (report_status): Don't use this for logging anymore, use only for
- reporting the status back to the caller.
- (filter_driver_log): Renamed from filter_driver_status_log. Now
- ONLY handles file logging and is for INTERNAL USE ONLY.
- (do_flag): Replace occurences of report_status with
- filter_driver_log.
- (do_score): Same.
- (do_colour): Same.
- (do_stop): Same.
-
-2000-11-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-datespec.c (validate): Check to make sure the user has
- entered a valid date.
-
-2000-10-31 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filtertypes.xml: Updated to allow the user to select "sounds
- like" or "does not sound like" (uses header-soundex).
-
- * filter-message-search.c (header_matches): Oops. Should be using
- !g_strncasecmp. This should fix it so this filter match works
- right.
- (header_starts_with): Same.
- (header_ends_with): Same.
- (header_soundex): New filter callback for soundex matching (yes,
- it's probably a bloated feature but hey, it was fun to code)
-
-2000-10-31 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-folder.c (validate): Override the default validate
- function to only return TRUE if a folder has been selected.
-
- * filter-editor.c (rule_add): Validate that all the rule parts and
- action parts are correctly filled in.
- (rule_edit): Same.
-
-2000-10-31 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filtertypes.xml: Updated to add an action to set message flags.
-
- * filter-driver.c (do_flag): New callback to set message info
- flags.
-
- * filter-element.c (filter_element_set_data): New convenience
- function to set the data on a FilterElement.
-
- * filter-url.c (get_widget): Set the sources list to point to the
- FilterElement data.
-
-2000-10-31 Federico Mena Quintero <federico@helixcode.com>
-
- * filter-rule.c (get_widget): Do not pad around the Name hbox;
- its parent already has spacing.
- Do not pad around the inframe's children; the inframe already has
- spacing.
-
-2000-10-30 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-option.c (option_activate): If a regex option is
- selected, change the FilterElement data to TRUE else set to FALSE.
-
- * filter-rule.c (more_parts): Validate the previously entered
- FilterPart before allowing the user to add a new FilterPart.
-
- * filter-part.c (filter_part_validate): New convenience function
- to validate an entire FilterPart expression.
-
- * filter-input.c (validate): Validate the entry text if it
- contains a regular expression.
-
- * filter-element.[c,h]: New virtual function to validate the
- contents of the FilterElement (useful for regex and sexp).
- (filter_element_validate): You get the idea...
-
-2000-10-30 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-input.c:
- * filter-option.c:
- * filter-part.c: Pure formatting changes, no actual code
- changes. Since I know I'm going to get flamed for this, I'm sorry
- but I'll probably have to modify code in these files and it's
- easier if the code is quickly readable by me.
-
- * filter-rule.c (get_widget): Set the "remove" button insensitive
- for <= 1 instead of == 1.
-
-2000-10-28 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_filter_message): Copy the message
- to the default folder if it wasn't marked as deleted.
-
-2000-10-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filtertypes.xml: Added header-starts-with, header-ends-with, and
- header-exists menu items.
-
- * filter-message-search.c (header_starts_with): New callback to
- match the beginnings of headers.
- (header_ends_with): New callback to match the ends of headers.
- (header_exists): New callback to determine if a header exists
- which is useful when filtering out all those pesky bug-buddy
- emails!
-
-2000-10-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filtertypes.xml: Add header-matches expressions ("is" / "is not").
-
- * filter-message-search.c (header_matches): New callback to match
- headers exactly (aka strcmp rather than strstr).
-
-2000-10-27 Jacob "Ulysses" Berkman <jacob@helixcode.com>
-
- * filter-driver.c (filter_driver_filter_mbox): divide before
- multiple so that we don't overflow.
-
-2000-10-27 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Fixed this to include EXTRA_GNOME_CFLAGS.
-
-2000-10-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (do_move): Don't mark as deleted here, otherwise
- the message will have the DELETED flag set in the folder it's
- being moved to.
- (do_delete): Don't set the DELETED flag here either...we'll only
- set it at the very end of the filtering process.
- (filter_driver_filter_message): Set the DELETED flag after all
- processing is completed.
-
-2000-10-26 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filtertypes.xml: Readded Source url stuff.
-
- * filter-element.c (filter_element_new_type_name): Added url stuff
- back in.
-
- * filter-url.[c,h]: Back from the dead...
-
- * Makefile.am: Re-added filter-url.[c,h].
-
-2000-10-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filtertypes.xml: Added option menu items to allow searching
- based on regular expressions.
-
- * filter-message-search.c (body_regex): New callback to match text
- in the body using regex.
- (body_contains): Modified to only match using strstr.
- (header_regex): New callback to match headers using regex.
- (header_contains): Modified to only match using strstr.
-
-2000-10-24 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filtertypes.xml: Take out the reference to "Source".
-
- * filter-element.c (filter_element_new_type_name): Remove
- filter-url code.
-
- * filter-url.[c,h]: What was I smoking? There's no good reason to
- filter on source urls as there are other ways to get the same
- effect. Thanks to both Zucchi and Miguel for helping me see this
- :-)
-
-2000-10-24 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c: Fixed NULL in fprintf.
-
-2000-10-24 Dan Winship <danw@helixcode.com>
-
- * Makefile.am (libfilter-i18n.h): Build a fake header file with
- the titles from the xml files, for translation purposes.
-
- * filter-rule.c (get_rule_part_widget): Call _() on the rule's
- title.
-
- * filter-option.c (get_widget): Call _() on the option's title.
-
- * filter.glade: Turn on translatable strings.
-
- * libfilter-i18n.h, filter.glade.h: Translatable string files.
-
- * add #include <config.h> to a bunch of C files so that _()
- actually does anything. Undo some UTF8 frobs since we're now
- dealing in localized strings.
-
-2000-10-23 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-filter.c (less_parts): Set the remove button insensitive
- if there is only 1 action left.
- (more_parts): Set the remove button sensitive (since we now have 2
- or more actions).
- (get_widget): If there is only 1 action, disable the remove
- button.
-
- * filter-rule.c (xml_encode): If there is a defined source, don't
- set it to "incoming", set it to whatever the source is!
- (less_parts): Set the remove button insensitive if there is only 1
- criterion left.
- (more_parts): Set the remove button sensitive (since we now have 2
- or more criterion).
- (get_widget): If there is no name for the filter then set it to
- "Untitled", highlight it, and grab the focus. If there is only 1
- criterion, disable the remove button.
-
- * filter-editor.c, vfolder-editor.c: GUI fixes here and there as
- well as some consistancy fixes between them.
-
- * filter-driver.c (filter_driver_filter_mbox): Updated to send the
- source url to filter_driver_filter_message()
- (filter_driver_filter_folder): Updated to send the source url of
- the folder to filter_driver_filter_message()
- (filter_driver_filter_message): Now takes a source_url argument
- that represents the url of the folder the message is coming from
- (so that we may filter based upon that information).
-
-2000-10-23 Christopher James Lahey <clahey@helixcode.com>
-
- * filter.glade: Fixed these widgets to resize properly.
-
-2000-10-23 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-editor.c: Remove the "demand" source from the list.
-
- * filter.glade: Remove the "On Demand" option and replace it with
- an "Outgoing" option.
-
-2000-10-23 Christopher James Lahey <clahey@helixcode.com>
-
- * filter-editor.c, filter-filter.c, filter-folder.c,
- filter-part.c, filter-rule.c, rule-context.c, score-editor.c,
- vfolder-editor.c: Fixed these widgets to resize properly.
-
-2000-10-20 Jeffrey Stedfast <fejj@helixcode.com>
-
- * Makefile.am: Added filter-url.[c,h].
-
- * filter-message-search.c (get_source): New callback to get the
- source url of the message being filtered.
- (filter_message_search): Now takes a source argument.
-
- * filter-element.c (filter_element_new_type_name): Added code to
- handle URL types.
-
- * filter-url.[c,h]: New filter object to handle URLs (ie in the
- case of filtering on source url). FIXME: find a way to populate
- the source combo box (including mail-config.h breaks the build in
- the addressbook - how does including mail-tools.h not break the
- build???)
-
- * filtertypes.xml: Added the source filter type and added the
- move-to action.
-
- * filter-driver.c (do_move): New callback, a "Copy" action should
- just copy the message to another location while a Move should both
- copy the message to a new location and delete it from the source
- location.
- (do_delete): Set the deleted flag on the message info.
- (filter_driver_filter_message): Now returns void as we don't care
- if it was copied or not in the caller functions. Also check the
- CamelMessageInfo being passed in - if the message has been marked
- as deleted prior to being filtered, then return immediately as we
- don't want to apply filter actions to deleted messages.
-
-2000-10-19 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_filter_folder): Start fetching at
- 1, not 0.
-
-2000-10-11 Not Zed <NotZed@HelixCode.com>
-
- * filter-driver.c (filter_driver_filter_mbox): Report the
- percentage of file complete for the filter.
-
-2000-10-10 Not Zed <NotZed@HelixCode.com>
-
- * filter-driver.c (filter_driver_run): Why on earth does this code
- ref all these objects for? This is not right at all.
- (filter_driver_run): Changed source type to a string.
- (filter_driver_run): REmove the very weird exception copying
- stuff - just ref it instead.
- (do_score):
- (do_colour):
- (do_stop):
- (do_copy):
- (mark_forward):
- (do_delete): Removed bogus 'terminated' testing. This is NOT
- NEEDED HERE. It is tested after every rule/action, and
- termination only makes sense at that point.
- (filter_driver_filter_message): new funciton (renamed), filter
- only a message.
- (filter_driver_filter_mbox): Filter a whole mbox.
- (filter_driver_run): If we aren't given an info, create a simple
- one based on the message headers.
- (filter_driver_filter_message): Renamed from filter_driver_run().
- (filter_driver_set_status_func): Set the status callback function.
- (filter_driver_set_default_folder): Set the default folder for
- filtering.
- (report_status): Internal function to report the status of a given
- event.
- (do_copy): Removed a pointless cache lookup - duh, we do it in
- open_folder anyway (infact, we do it in camel too!!).
- (filter_driver_filter_message): Removed pointless re-refing of
- arguments. Why would anyone think this could be any use at all?
- (filter_driver_filter_folder): New function to filter a whole
- folder.
-
- * filter-editor.c (rule_add): api fixes.
- (rule_edit):
- (rule_up):
- (rule_down):
- (set_sensitive): This didn't take into account the source, now it
- does.
- (select_source): Fix for api changes. Changed the rather generic
- 'number' argument to be 'source', and a string.
- (filter_editor_construct): Changed the 'number' to 'source', and
- set the string appropriately. Added a warning for one case where
- the glade file is out of sync.
-
- * score-editor.c (score_editor_construct):
- (rule_edit):
- (rule_delete):
- (rule_up):
- (rule_down):
- (set_sensitive): api fixes.
-
- * vfolder-editor.c (set_sensitive): Api fixes.
- (vfolder_editor_construct):
- (rule_edit):
- (vfolder_editor_construct):
-
- * rule-context.h (RCNextRuleFunc): Added a source argument.
-
- * rule-context.c (rule_context_next_rule): Added source argument.
- (rule_context_find_rule): Added source argument.
- (rule_context_get_rank_rule): Added source argument.
- (rule_context_get_rank_rule_with_source): Removed.
- (save): Fixed for changes to RCNextRuleFunc prototype.
-
- * filter-rule.h: Changed the source to be a string, removed the
- filter_source_t type.
-
- * filter-rule.c (filter_rule_set_source): New function to set the
- source of a rule. What idiot ran this code through indent?
- (filter_rule_find_list): Added a source argument.
- (filter_rule_next_list): Added a source argument.
- (get_widget): Fixed the wording. You dont remove search parts,
- you can only remove the last one. Why you even need to mention
- they are search 'criteria' is beyond me. Whoever added the
- scrolled window needs to be shot, its the single most awful GUI
- feature ever invented (ranks with the close button next to
- maximise).
- (xml_encode): Save source as a string (if present).
- (xml_decode): Likewise for loading & fixed a small memleak.
- (filter_rule_finalise): Free source.
-
-2000-10-06 Not Zed <NotZed@HelixCode.com>
-
- * rule-context.c (load): Remove the stupid on-demand cb shit.
- (rule_context_load): And here too.
-
-2000-09-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_run): Now takes an argument to
- specify the log file (or NULL if logging is not to be performed).
-
-2000-09-19 Dan Winship <danw@helixcode.com>
-
- * Makefile.am (gladedir, filterdir): Use $(datadir), not
- $(prefix)/share.
-
-2000-09-18 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filtertypes.xml: Modified to use more intuitive naming
-
- * score-rule.c (xml_decode): Make sure the score is within our
- range
- (get_widget): Changed range to -3 to +3
-
- * filter-score.c (get_widget): Changed range to -3 to +3
- (xml_decode): Make sure the score is within our range
-
- * filter-rule.c (get_widget): Rearranged widgets.
-
- * filter-filter.c (get_widget): Rearranged widgets.
-
- * filter-editor.c (filter_editor_construct): Updated to allow for
- double-clicking on a rule to edit it.
-
-2000-09-18 Christopher James Lahey <clahey@helixcode.com>
-
- * filter-editor.c, filter-filter.c, filter-folder.c,
- filter-input.c, filter-message-search.c, filter-option.c,
- filter-rule.c, score-editor.c, vfolder-editor.c, vfolder-rule.c:
- Fixed the #include lines to deal properly with gal.
-
-2000-09-13 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-message-search.c (body_contains): Modified to only match
- text MIME parts in the message rather than the entire MIME message
- (header_contains): Added regex matching
-
-2000-09-12 Dan Winship <danw@helixcode.com>
-
- * rule-context.c (d):
- * filter-datespec.c (d): Turn off debugging output.
-
-2000-09-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c: We now use a "copied" variable to record
- whether a message was marked as copied or not instead of trying to
- "guess" by looking at the folders hash table as that won't work at
- all anymore.
- (do_copy): Renamed as this is more appropriate now that it
- actually copies the message rather than marking it for copying
- later. Also fixed a logic error which prevented a message from
- being dumped into a folder if the fodler had been previously
- opened.
-
-2000-09-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_run): No longer takes a
- self_destruct argument.
-
-2000-09-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_run): Don't freeze/thaw the
- default inbox here, let the caller freeze/thaw it. Don't destroy
- the folders hash table here, it's faster if we wait till the
- filter-driver is destroyed.
- (filter_driver_finalise): Destroy the folders hash table here
- (filter_driver_init): Initialize the folders hash table here
-
-2000-09-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filtertypes.xml: Changed "Header" to be "Message header" so it's
- not quite as confusing (??)
-
-2000-09-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filtertypes.xml: Updated to allow the user to specify arbitrary
- headers.
-
-2000-09-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_run): Fixed a logic error. Only
- mark filtered as TRUE if it was successfully copied to another
- folder, this means don't mark true if the default inbox is NULL.
-
-2000-09-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_run): Erm, okay I misunderstood
- what camel_folder_[un]hook_event() did - we don't even need this
- crap in the filter driver so lets take it completely out and let
- the caller handle this junk.
-
-2000-09-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_run): Updated to not emit the
- folder_changed signal when a message is appended to the default
- mailbox - lets leave that up to the caller so we don't queue up a
- bunch of these emits if the caller is downloading messages for
- example.
-
-2000-09-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filtertypes.xml: Added scoring xml stuffs
-
- * Makefile.am: added filter-score.[c,h]
-
- * filter-score.[c,h]: New functions to handle the "score" filter
- type.
-
- * filter-element.c (filter_element_new_type_name): Added support
- for "score" type.
-
- * filter-driver.c (do_score): New ESExp callback for filter
- actions to set the score on a message.
-
- * filter-message-search.c (get_score): New ESExp callback for
- getting the score tag as an integer value.
-
-2000-09-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_run): Now takes a
- CamelMessageInfo argument in preparation for handling scoring
-
-2000-09-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_run): Modified to return a
- boolean value specifying whether or not the message was filtered
- into a folder other than the default. The default mailbox can now
- also be specified as NULL if the message shouldn't be appended to
- it in the case that it's not filtered into some other folder.
-
-2000-09-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_run): Rewrote - this shouldn't
- need to be an async function
-
- * filter-message-search.c (match_all): Modified to look at the
- boolean value being fed to it and just to return that instead of
- always returning TRUE
-
-2000-09-07 Lauris Kaplinski <lauris@helixcode.com>
-
- * filter-editor.c, filter-filter.c, filter-folder.c, filter-option.c:
- * filter-rule.c, score-editor.c, vfolder-editor.c, vfolder-rule.c:
- More UTF-8 wrapping
-
-2000-09-06 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_run): Totally rewritten to filter
- a single message at a time instead of filtering a folder.
-
- * filter-message-search.c (filter_message_search): New convenience
- function for searching a message.
-
-2000-08-24 Lauris Kaplinski <lauris@helixcode.com>
-
- * filter-folder.c: Use e_utf8 wrappers
-
- * filter-input.c: Use e_utf8 wrappers
-
- * filter-rule.c: Use e_utf8 wrappers
-
-2000-08-23 Dan Winship <danw@helixcode.com>
-
- * filter-datespec.c (cal_day_selected): Set seltime.tm_isdst to
- -1, not daylight, because the current dst value is not relevant to
- the selected date.
-
-2000-08-18 Peter Williams <peterw@helixcode.com>
-
- * filter-driver.c (do_filter_mail): Unlink a new parameter, path_to_unlink,
- if it is empty once the mail is filtered. Fixes a race in
- mail_tool_filter_contents_into.
-
- * filter-driver.h: Update the prototype.
-
-2000-08-14 Ettore Perazzoli <ettore@helixcode.com>
-
- * vfolder-editor.c (rule_add): Add translation marks and use stock
- buttons.
- (rule_edit): Likewise.
-
- * score-editor.c (rule_add): Add translation marks and use stock
- buttons.
- (rule_edit): Likewise.
-
- * rule-context.c (rule_context_add_rule_gui): Add translation
- marks and use stock buttons.
-
- * filter-part.c (main): Add translation marks and use
- stock buttons.
-
- * filter-folder.c (button_clicked): Add translation marks and use
- stock buttons.
-
- * filter-editor.c (rule_add): Add translation marks and use stock
- buttons.
- (rule_edit): Likewise.
-
- * filter-rule.c (get_widget): Add translation marks.
-
- * filter-filter.c (get_widget): Add translation marks. Add
- padding to make it look like the buttons in `filter-rule.c'.
-
-2000-08-17 Peter Williams <peterw@helixcode.com>
-
- Implement filtering on demand.
-
- * rule-context.h: Add a new callback to rule_context_load
- that allows the caller to hook on-demand rules into its UI.
-
- * rule-context.c (rule_context_load): Changed to pass the
- extra parameters to load().
- (load): If the rule is successfully loaded, call the provided
- callback so that the UI can be updated.
-
- * filter-editor.c (rule_add): Set the source of the new filter.
- (rule_edit): Use the new rule_context_get_rank_rule_with_source()
- so that we don't get a bad index into the GtkList.
- (rule_delete): Same as above.
- (rule_up): Same as above.
- (rule_down): Same as above.
- (select_source): New function. When the user changes the
- dropdown list to select a new source type, repopulate the
- list with rules of the appropriate type.
- (filter_editor_construct): Code moved from here into
- select_source(). Hook up all the elements of the source optionmenu
- to callbacks to select_source().
-
- * filter-rule.c (xml_encode): Save the rule's source type.
- (xml_decode): Load it. Default to 'incoming' if unspecified.
-
- * filter-rule.h: New enumeration, _filter_source_t, the
- specifies the rule's source. Add it to struct _FilterRule.
-
- * filter-driver.c (filter_driver_run): Add a new input,
- sourcetype, that specifies which rules to run (only ones
- with the same source will be run). struct filter_mail_input_t
- changed to accomodate.
- (do_filter_mail): Skip rules if they're not the specified source.
- If source and dest are the same, don't delete the messages or
- copy unnecessarily.
-
- * filter.glade: Make the optionmenu sensitive. Change "Outgoing"
- to "On Demand" (outgoing should be added later).
-
-2000-08-15 Peter Williams <peterw@curious-george.helixcode.com>
-
- * vfoldertype.xml, filtertypes.xml: Add entries defining the
- date-based message filtering and vfoldering.
-
- * filter-datespec.{c,h}: New files implementing the UI for
- date-based filtering and vfoldering -- specifically, choosing
- what to compare the message to.
-
- * filter-element,c: Hook up to create a datespec filter if
- that's what's called for.
-
- * Makefile.am: Build the new -datespec files.
-
-2000-08-13 Dan Winship <danw@helixcode.com>
-
- * Makefile.am (EXTRA_DIST): remove blank.xpm and check.xpm which
- no longer exist. Add filter.glade.
-
-2000-08-12 Dan Winship <danw@helixcode.com>
-
- * filter-driver.c (describe_filter_mail): Use
- mail_tool_get_folder_name here too. (Hm... this directory really
- shouldn't depend on stuff in mail/, but it already did. We'll have
- to sort this out later.)
-
-2000-08-11 Dan Winship <danw@helixcode.com>
-
- * filter-driver.c (do_filter_mail): Remove an '#if 0' that must
- have been left in accidentally, so that messages which are copied
- to other folders will not also be copied into the Inbox. Also,
- #ifdef out the line that printfs the rule, because the rules are
- often very large.
-
-2000-08-11 Not Zed <NotZed@HelixCode.com>
-
- * filter-driver.c (do_colour): Use proper accessor function
- instead of poking the structure.
-
-2000-08-10 Christopher James Lahey <clahey@helixcode.com>
-
- * filter-driver.c, filter-folder.c, rule-context.c,
- vfolder-editor.c: Fixed some warnings.
-
-2000-08-10 Peter Williams <peterw@helixcode.com>
-
- * filter-driver.c (do_filter_mail): Fix the infinite fetchmail.
-
-2000-08-10 Not Zed <NotZed@HelixCode.com>
-
- * filter-driver.c (filter_driver_run): Save the results of
- searches till we're done. So we dont have to go strduping strings
- agian and again and again and again ... Remove all the unecessary
- strdups.
- (do_colour): Implement.
- (filter_driver_run): Change for append api change.
- (free_key): Removed.
-
-2000-08-09 Not Zed <NotZed@HelixCode.com>
-
- * rule-context.c (rule_context_add_rule_gui): Helper function to
- add a rule, but present a gui first, asking for confirmation/allow
- editing.
- (rule_context_add_rule_gui): Keep track of context so it isn't freed under us.
-
- * filter-context.c (filter_context_create_action): Implement,
- helper to aid filter generation.
-
-2000-08-08 Peter Williams <peterw@helixcode.com>
-
- * filter-driver.c (close_folder): Fix an accidental GTK unref
- of a CamelObject.
-
-2000-08-03 Ettore Perazzoli <ettore@helixcode.com>
-
- * filter-folder.c (button_clicked): Use the base name of the
- Evoluton URI for the button's label.
- (get_widget): Likewise.
-
-2000-08-03 Peter Williams <peterw@helixcode.com>
-
- * filter-driver.c (op_filter_mail): Conform to the new mail-threads
- interface.
-
-2000-08-01 Not Zed <NotZed@HelixCode.com>
-
- * vfolder-editor.c (rule_add): Oops, create a vfolder_rule when we
- add a new one.
-
- * rule-context.c (load): If there are no user rules, dont bomb
- out.
-
-2000-07-31 Not Zed <NotZed@HelixCode.com>
-
- * filter-input.c (filter_input_set_value): Set value of a simple
- type to a new string.
-
- * filter-option.c (filter_option_set_current): New function to set
- the current value of an option.
-
- * filter-rule.c (filter_rule_find_list): New function to find a
- rule in a list, by name.
- (filter_rule_set_name): Let you set the name of a rule.
-
- * rule-context.c (rule_context_find_rule): Find a rule by name.
- (rule_context_create_part): Helper to find and clone a part by
- name.
-
- * filter-folder.c (button_clicked): Fix warning.
-
- * filter.glade: Add new widgets for vfolder rule editor.
-
- * vfolder-context.c (vfolder_context_init): Changed to use vfolder
- rule as the rule type.
-
- * vfolder-rule.c: New class to encode extra information required
- for vfolder rules.
-
-2000-07-30 Not Zed <NotZed@HelixCode.com>
-
- ** Almost a total rewrite of every file, except for filter-driver
- which just had minor updates.
-
- The rule format has changed.
-
-2000-07-24 Dan Winship <danw@helixcode.com>
-
- * filter-driver.c (do_delete, filter_driver_run): Update for
- CamelFolder API changes. (delete_message and get_uids don't take
- exceptions any more.)
-
-2000-07-21 Peter Williams <peterw@helixcode.com>
-
- * filter-driver.c (cleanup_filter_mail): Use the exception
- provided to us by the async manager instead of allocating
- our own; use mail_tool_camel_lock_{up,down} around camel
- operations.
- (filter_driver_run): Make it return void.
-
-2000-07-20 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c: Update to make "async".
-
-2000-07-11 Dan Winship <danw@helixcode.com>
-
- * filter-driver.c: Update for CamelFolder API changes
-
-2000-07-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c (filter_driver_run): Updated to reflect changes to
- camel_folder_append_message ()
-
-2000-07-09 Dan Winship <danw@helixcode.com>
-
- * filter-xml.[ch]: add a "string" type
-
- * filtertype.xml, vfoldertypes.xml: Use type="string" rather than
- "folder" for subject/body matching.
-
- * filter-arg-types.c: Update some strings for "text" input. Fix
- some warnings (including one that pointed out a real bug).
-
- * filter-arg.c, filter-druid.c, filter-format.c: fix warnings
-
-2000-07-07 Dan Winship <danw@helixcode.com>
-
- * filter-driver.c: Update for camel_folder_search_by_expression
- change (GList -> GPtrArray).
-
- * vfoldertypes.xml: sync this to filtertypes.xml (to/cc thing)
-
-2000-07-05 Dan Winship <danw@helixcode.com>
-
- * remove some non-error case debugging messages.
-
- * filtertypes.xml: Fix typos and update the "to-address" rule to
- match To or Cc.
- * vfoldertypes.xml: Fix typos.
-
- * filter-driver.c (do_delete, do_copy, do_stop,
- filter_driver_run): Add uids to the "processed" list only after
- succesfully doing something with them. Fixes the problem where
- copying a message to a folder that didn't exist would result in it
- disapearing.
-
-2000-07-02 Ettore Perazzoli <ettore@helixcode.com>
-
- * filter-driver.c (filter_driver_new): Don't free the ruleset nor
- the xmlDoc. This will make us leak [I think], but at least
- filters work.
-
-2000-07-02 Dan Winship <danw@helixcode.com>
-
- * filter-driver.c (open_folder): freeze the folder to avoid
- multiple folder_changed's
- (close_folder): and thaw it.
-
-2000-07-02 Dan Winship <danw@helixcode.com>
-
- * filter-driver.c (filter_driver_new): kill
- filter_driver_set_session and filter_driver_set_rules and instead
- make filter_driver_new take the rules and a callback function it
- can use to turn URIs into folders.
- (open_folder): Use the callback function rather than calling camel
- directly: some URIs need special handling to turn them into stores
- and folders correctly, so let the mailer do that.
-
-2000-07-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * filter-arg-types.c (arg_folder_edit_value): Only allow type
- "mail" when selecting a folder for the filter.
-
-2000-07-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-driver.c: Updated to reflect changes made to
- camel-folder.
-
-2000-06-30 Peter Williams <peterw@curious-george.helixcode.com>
-
- * filter-xml.c (filter_load_optionset_file): Check for failure
- when loading the filter doc.
-
- * filter-driver.c (filter_driver_set_rules): Ditto.
-
- * filter-editor.c (filter_editor_set_rule_files): Ditto.
-
-2000-06-29 Ettore Perazzoli <ettore@helixcode.com>
-
- * filter-arg-types.c: Replaced `global_shell_interface' with
- `global_shell_client'.
- (arg_folder_edit_value): Use
- `evolution_shell_client_user_select_folder()'.
- (create_listener): Removed.
- (impl_FolderSelectionListener_selected): Removed, together with
- all the ::Listener stuff.
-
-2000-06-29 Arik Devens <arik@helixcode.com>
-
- * vfoldertypes.xml (ruleset type="match"): Changed Cc to CC to be
- the same as the other CC rule. None of this works however, cause
- the CC code is not hooked up to camel... oh well ;-(
-
-2000-06-29 Arik Devens <arik@helixcode.com>
-
- * vfoldertypes.xml (ruleset type="match"): Added a Cc rule to
- vfolders. Works like To except on the Cc of a message ;-)
-
-2000-06-28 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-arg-types.c (arg_string_edit_value): Changed "Filter name"
- to "Option value" as "Filter name" made no sense in the dialog
- (arg_address_edit_value): Same
- (arg_folder_edit_value): What do we want to return??
-
-2000-06-27 Ettore Perazzoli <ettore@helixcode.com>
-
- * filter-xml.c (load_desc): Strdup content before assigning the
- value. Also, no need to check for NULL when g_strdup()ing as
- g_strdup() returns NULL for a NULL arg.
-
-2000-06-27 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am (INCLUDES): `-I$(top_builddir)/shell' so that it
- works with builddir != srcdir. [We need to #include
- "Evolution.h".]
-
-2000-06-27 Michael Zucchi <zucchi@zedzone.mmc.com.au>
-
- * Makefile.am (INCLUDES): Add the shell dir for includes (for
- corba interfaces).
-
- * filter-arg-types.c (impl_FolderSelectionListener_selected):
- Listener for folder query. Sigh.
- (create_listener): Create the listener object for the folder
- dialogue query. Uses a global for linkage to the shell object,
- via the mail component.
- (arg_folder_edit_value): Call the folder selection dialogue to
- edit the value, rather than a simple text widget.
-
-2000-06-26 Jeffrey Stedfast <fejj@helixcode.com>
-
- * filter-editor.c: Added a #include <gnome-xml/parser.h> as this
- was needed (since we used the xml parser...)
- (druid_dialogue_clicked): Do we want to use struct filter_option
- or do we instead want to use struct filter_optionrule as we had before?
- Since the function we pass the data to expects filter_option, I suspect
- that that is what we want.
-
- * filter-format.h (filter_description_html_write): Renamed from
- description_html_write in order to match function name in
- filter-format.c
-
- * filter-druid.c (option_name_changed): Fixed a memory leak (Free'd
- a filter description list).
-
- * filter-arg-types.c (arg_folder_edit_values): Free'd GList data in
- argin->values.
-
- * filter-driver.c (filter_driver_set_rules): Added code to free an
- xmlDoc and some other data.
-
- * filter-arg.h: Add prototypes for filter_arg_write_html() and
- filter_arg_write_text();
-
- * filter-arg-types.c: Lets see if we can't get rid of some of these
- warnings... (use some casts to make warnings go away)
- (arg_address_edit_value): Lets make sure that ad exists before looking
- at member data.
-
-2000-06-16 Dan Winship <danw@helixcode.com>
-
- * filter-driver.c (do_delete, filter_driver_run): Update for Camel
- flag handling changes.
-
-2000-06-15 Dan Winship <danw@helixcode.com>
-
- * filter-driver.c (open_folder, close_folder): Update for
- CamelFolder changes.
-
-2000-06-09 Jacob Berkman <jacob@helixcode.com>
-
- * filter-editor.c (add_or_edit): use stock pixmap buttons
-
- * filter-druid.c (build_druid): remove the border on the notebook,
- put the html widget in a scroll frame, and add some padding
-
-2000-06-06 Dan Winship <danw@helixcode.com>
-
- * filter-driver.c (open_folder): Update for folder
- existence/creation changes.
-
-2000-06-02 Christopher James Lahey <clahey@helixcode.com>
-
- * filter-driver.c: Free the exception and the priv struct.
-
-2000-06-01 Christopher James Lahey <clahey@helixcode.com>
-
- * filter-arg-types.c (arg_address_edit_value): Search for ad in
- arg->values instead of text since it's a list of
- filter_arg_adresses. Also, free the old value in the list.
-
-2000-05-30 Not Zed <NotZed@HelixCode.com>
-
- * filtertypes.xml: And here too.
-
- * vfoldertypes.xml: Add body-contains and not-body-contains
- types.
-
-2000-05-27 Not Zed <NotZed@HelixCode.com>
-
- * vfoldertypes.xml: New file - lists rules appropriate for
- vfolders (no actions, etc).
-
- * Makefile.am (EXTRA_DIST): Add vfoldertypes.xml
-
- * filter-driver.c (filter_driver_expand_option): Made public from
- expand_filter_option.
- (filter_driver_rule_count): find out how many user rules are
- defined.
- (filter_driver_rule_get): Get a user rule by index.
-
-2000-05-21 Ettore Perazzoli <ettore@helixcode.com>
-
- * filter-druid.c: Don't pass an empty URL to `gtk_html_begin()'
- anymore.
-
- * filter-arg-types.c: Updated for the new GtkHTML API which uses
- `GtkHTMLStream *' instead of `GtkHTMLStreamHandle'.
- * filter-arg.c: Likewise.
- * filter-arg.h: Likewise.
- * filter-druid.c: Likewise.
-
- * filter-format.c: Likewise.
- * filter-format.h: Likewise.
-
-2000-05-18 Dan Winship <danw@helixcode.com>
-
- * filter-driver.c (filter_driver_run): update for
- camel_folder_get_uids change
-
-2000-05-17 NotZed <NotZed@HelixCode.com>
-
- * filter-druid.c: Fix some html formatting.
-
-2000-05-16 NotZed <NotZed@HelixCode.com>
-
- * filter-driver.c (filter_driver_run): Delete all processed
- messages. This is probably going to slow it down a bit.
- (filter_driver_run): Close folders before destroying them *sigh*.
- (open_folder): Actually open the folder. Doh.
-
- * filtertypes.xml: Initial filter rules.
-
- * filter-xml.c (filter_write_optionset): Save the description
- also.
- (write_description): Routine to save description - only saves 1
- node of description.
-
- * filter-arg.c (filter_arg_edit_clicked): Dont free edata here,
- let the destroy do it(?)
-
- * filter-editor.c (main): Simple driver program for testing, so i
- can fix all this really broken code *sigh*
-
-2000-05-15 NotZed <NotZed@HelixCode.com>
-
- * filter-editor.c (filter_editor_set_rule_files): filename based
- interface.
- (filter_editor_save_rules): Interface to save the options to a
- filename.
-
- * filter-xml.[ch]: Bunch of cleanup.
-
- * filter-xml.c (filter_*_file): New interfaces to read/write files
- directly, rather than messing with xmldoc crap.
-
- * Makefile.am: Removed filter-driver test program, now just part
- of libfilter.
-
- * filter-driver.c: Made an object, with an api and everything, can
- apply a filter to a given mailbox.
-
-2000-05-10 Christopher James Lahey <clahey@helixcode.com>
-
- * filter-arg.h: Changed tree.h to gnome-xml/tree.h.
-
- * Makefile.am: Added filter-arg-types.h, filter-arg.h,
- filter-xml.h, filter-format.h, filter-druid.h, filter-editor.h.
-
-2000-05-02 Matt Loper <matt@helixcode.com>
-
- * Makefile.am: set G_LOG_DOMAIN.
-
-2000-05-01 NotZed <NotZed@HelixCode.com>
-
- * filter-driver.c (main): Fix for api.
-
-2000-04-30 Dan Winship <danw@helixcode.com>
-
- * filter-driver.c (start): Remove no-longer-necessary call to
- camel_provider_register_as_module.
-
-2000-04-25 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am (INCLUDES): Use `$(GTKHTML_CFLAGS)'.
-
-2000-04-20 NotZed <NotZed@HelixCode.com>
-
- * filter-driver.c: Removed a bunch of crappy unrequired headers.
-
- * Makefile.am (filter_driver_LDADD): Added libibex back again.
-
-2000-04-18 Dan Winship <danw@helixcode.com>
-
- * filter-driver.c: remove unused camel-log.h include
-
-2000-04-12 Matt Loper <matt@helixcode.com>
-
- * filter-arg.c (filter_arg_edit_value): Return a value.
-
-2000-03-27 NotZed <NotZed@HelixCode.com>
-
- * filter-xml.c (tokenise_xmlfreeprop): Free a prop after
- tokenising it.
- (find_node_attr): Free the prop after using it.
- (load_desc): Ditto. I use free() because xmlFree() is nowhere to
- be found.
- (filter_load_optionset): Ditto.
-
- * filter-arg-types.c (arg_address_values_add_xml): free() xml
- stuff, plugs a leak.
- (arg_folder_values_add_xml): Ditto.
-
-2000-03-22 NotZed <NotZed@HelixCode.com>
-
- * filter-driver.c (main): Changed to use async search api.
-
-2000-03-04 NotZed <NotZed@HelixCode.com>
-
- * filter-druid.c (html_write_options): Output 'and' bits between
- the rules.
-
- * filter-driver.c (main): Actually implement filtering, at least,
- from Inbox. Copy messages to folder (in the same store only, so
- far), delete, and stop processing are implemented, and the logic
- to handle default processing.
-
- * filter-xml.c (load_optionvalue): Fix up a bug where we lost the
- name of the arg (ouch).
- * filter-xml.c: Wrapped printf's in debug macros.
-
-2000-03-02 NotZed <NotZed@HelixCode.com>
-
- * filter-druid.c (object_destroy): Disconnect the list signal, so
- we dont get spurious emits during destroy.
- (arg_changed): Callback to update filter arg asynchronously.
- (arg_link_clicked): Edit the value non-modally.
-
- * filter-arg.c (filter_arg_edit_values_1): Changed to use
- non-modal interface.
-
-2000-03-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am: New file.
-
- * Makefile: Removed. I wonder why we are using plain Makefiles
- instead of automake Makefiles at all.
-
-2000-02-29 NotZed <NotZed@HelixCode.com>
-
- * filter-driver.c (main): Remove gui code, this will be actual
- filtering code.
-
- * Makefile: Added filter-editor to the library.
-
- * filter-editor.c (main): Comment out, make it a proper library.
-
-2000-02-28 NotZed <NotZed@HelixCode.com>
-
- * filter-druid.c: Removed unused header.
-
- * Makefile: Removed references to filter-sexp.[ch].
-
- * filter-sexp.[ch]: Removed some unecessary includes. Moved to
- e-util. Renamed callers.
-
-2000-02-24 NotZed <NotZed@HelixCode.com>
-
- * filter-xml.c (filter_description_free):
- (filter_load_ruleset_free):
- (filter_load_optionset_free): Functions for memory management.
-
- * filter-arg.c (filter_arg_copy): Copy the values of one arg into
- another.
-
- * filter-editor.c: New widget, a dialogue which uses filter-druid
- to present the various editing views.
- (druid_dialogue_clicked): On finish, save the user's new filter
- definition where it came from.
-
- * filter-druid.c: Changed to just being a notebook with no tabs,
- rather than a full druid (no next/prev/etc buttons).
- (option_name_changed): Update the option's description as the user
- enters it in.
-
-2000-02-22 NotZed <NotZed@HelixCode.com>
-
- * filter-xml.c (filter_clone_optionrule):
- (filter_clone_optionrule_free):
- (filter_optionrule_new_from_rule): New utility functions for
- working with the internal rule format.
-
- * filter-arg.[ch]: Added new callbacks for editing a single value,
- and a new editor which shows all items in a list, and allows you
- to edit them via the single-edit method. This needs some cleanup
- for some unused/unusable virtual methods (edit_values,
- write_html?).
-
- * Makefile: Add the druid for build.
-
- * filter-druid.c: A 'druid' widget for editing a single filter
- rule.
-
-2000-02-21 Matt Loper <matt@helixcode.com>
-
- * .cvsignore: New file.
-
-2000-02-18 NotZed <NotZed@HelixCode.com>
-
- * blank/check.xpm: Added forgotten files.
-
- * Uh, more changes, lots, its still work in progress.
-
-2000-02-14 NotZed <notzed@helixcode.com>
-
- * Initial import.
-
diff --git a/filter/Makefile.am b/filter/Makefile.am
deleted file mode 100644
index f84be24c73..0000000000
--- a/filter/Makefile.am
+++ /dev/null
@@ -1,63 +0,0 @@
-
-glade_DATA = filter.glade
-
-INCLUDES = \
- -I $(top_srcdir) \
- -I $(top_srcdir)/e-util \
- -I $(top_srcdir)/widgets/misc \
- -DFILTER_GLADEDIR=\"$(gladedir)\" \
- -DG_LOG_DOMAIN=\"filter\" \
- $(LIBFILTER_CFLAGS)
-
-noinst_LTLIBRARIES = \
- libfilter.la
-
-libfilter_la_SOURCES = \
- filter-code.c \
- filter-code.h \
- filter-colour.c \
- filter-colour.h \
- filter-datespec.c \
- filter-datespec.h \
- filter-element.c \
- filter-element.h \
- filter-file.c \
- filter-file.h \
- filter-input.c \
- filter-input.h \
- filter-int.c \
- filter-int.h \
- filter-label.c \
- filter-label.h \
- filter-marshal.c \
- filter-marshal.h \
- filter-option.c \
- filter-option.h \
- filter-part.c \
- filter-part.h \
- filter-rule.c \
- filter-rule.h \
- rule-context.c \
- rule-context.h \
- rule-editor.c \
- rule-editor.h
-
-EXTRA_DIST = \
- $(glade_DATA) \
- $(error_DATA) \
- $(error_i18n) \
- ChangeLog.pre-1-4 \
- filter-marshal.list
-
-# basic rules.
-error_DATA = filter-errors.xml
-error_i18n = $(error_DATA:.xml=.xml.h)
-errordir = $(privdatadir)/errors
-%.xml.h: %.xml
- $(top_builddir)/e-util/e-error-tool $^
-
-MARSHAL_GENERATED = filter-marshal.c filter-marshal.h
-@EVO_MARSHAL_RULE@
-
-BUILT_SOURCES = $(MARSHAL_GENERATED) $(error_i18n)
-CLEANFILES = $(BUILT_SOURCES)
diff --git a/filter/filter-code.c b/filter/filter-code.c
deleted file mode 100644
index 7b308506cc..0000000000
--- a/filter/filter-code.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "filter-code.h"
-
-static void build_code (FilterElement *fe, GString *out, struct _FilterPart *ff);
-static void format_sexp (FilterElement *, GString *);
-
-static void filter_code_class_init (FilterCodeClass *class);
-static void filter_code_init (FilterCode *fc);
-static void filter_code_finalise (GObject *obj);
-
-
-static FilterInputClass *parent_class;
-
-
-GType
-filter_code_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (FilterCodeClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) filter_code_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (FilterCode),
- 0, /* n_preallocs */
- (GInstanceInitFunc) filter_code_init,
- };
-
- type = g_type_register_static (FILTER_TYPE_INPUT, "FilterCode", &info, 0);
- }
-
- return type;
-}
-
-static void
-filter_code_class_init (FilterCodeClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- FilterElementClass *fe_class = FILTER_ELEMENT_CLASS (klass);
-
- parent_class = g_type_class_ref (FILTER_TYPE_INPUT);
-
- object_class->finalize = filter_code_finalise;
-
- /* override methods */
- fe_class->build_code = build_code;
- fe_class->format_sexp = format_sexp;
-}
-
-static void
-filter_code_init (FilterCode *fc)
-{
- ((FilterInput *) fc)->type = xmlStrdup ("code");
-}
-
-static void
-filter_code_finalise (GObject *obj)
-{
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-
-/**
- * filter_code_new:
- *
- * Create a new FilterCode object.
- *
- * Return value: A new #FilterCode object.
- **/
-FilterCode *
-filter_code_new (void)
-{
- return (FilterCode *) g_object_new (FILTER_TYPE_CODE, NULL, NULL);
-}
-
-/* here, the string IS the code */
-static void
-build_code (FilterElement *fe, GString *out, struct _FilterPart *ff)
-{
- GList *l;
- FilterInput *fi = (FilterInput *)fe;
-
- g_string_append(out, "(match-all ");
- l = fi->values;
- while (l) {
- g_string_append(out, (char *)l->data);
- l = g_list_next(l);
- }
- g_string_append(out, ")");
-}
-
-/* and we have no value */
-static void
-format_sexp (FilterElement *fe, GString *out)
-{
- ;
-}
diff --git a/filter/filter-code.h b/filter/filter-code.h
deleted file mode 100644
index 2d590279ee..0000000000
--- a/filter/filter-code.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef _FILTER_CODE_H
-#define _FILTER_CODE_H
-
-#include "filter-input.h"
-
-#define FILTER_TYPE_CODE (filter_code_get_type ())
-#define FILTER_CODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_CODE, FilterCode))
-#define FILTER_CODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_CODE, FilterCodeClass))
-#define IS_FILTER_CODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FILTER_TYPE_CODE))
-#define IS_FILTER_CODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FILTER_TYPE_CODE))
-#define FILTER_CODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FILTER_TYPE_CODE, FilterCodeClass))
-
-typedef struct _FilterCode FilterCode;
-typedef struct _FilterCodeClass FilterCodeClass;
-
-struct _FilterCode {
- FilterInput parent_object;
-};
-
-struct _FilterCodeClass {
- FilterInputClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-GType filter_code_get_type (void);
-FilterCode *filter_code_new (void);
-
-/* methods */
-
-#endif /* ! _FILTER_CODE_H */
diff --git a/filter/filter-colour.c b/filter/filter-colour.c
deleted file mode 100644
index 78db9d848c..0000000000
--- a/filter/filter-colour.c
+++ /dev/null
@@ -1,229 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtksignal.h>
-#include <libgnomeui/gnome-color-picker.h>
-
-#include "libedataserver/e-sexp.h"
-#include "filter-colour.h"
-
-#define d(x)
-
-static int colour_eq (FilterElement *fe, FilterElement *cm);
-static void xml_create (FilterElement *fe, xmlNodePtr node);
-static xmlNodePtr xml_encode (FilterElement *fe);
-static int xml_decode (FilterElement *fe, xmlNodePtr node);
-static GtkWidget *get_widget (FilterElement *fe);
-static void build_code (FilterElement *fe, GString *out, struct _FilterPart *ff);
-static void format_sexp (FilterElement *, GString *);
-
-static void filter_colour_class_init (FilterColourClass *klass);
-static void filter_colour_init (FilterColour *fc);
-static void filter_colour_finalise (GObject *obj);
-
-
-static FilterElementClass *parent_class;
-
-GType
-filter_colour_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (FilterColourClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) filter_colour_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (FilterColour),
- 0, /* n_preallocs */
- (GInstanceInitFunc) filter_colour_init,
- };
-
- type = g_type_register_static (FILTER_TYPE_ELEMENT, "FilterColour", &info, 0);
- }
-
- return type;
-}
-
-static void
-filter_colour_class_init (FilterColourClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- FilterElementClass *fe_class = FILTER_ELEMENT_CLASS (klass);
-
- parent_class = g_type_class_ref (FILTER_TYPE_ELEMENT);
-
- object_class->finalize = filter_colour_finalise;
-
- /* override methods */
- fe_class->eq = colour_eq;
- fe_class->xml_create = xml_create;
- fe_class->xml_encode = xml_encode;
- fe_class->xml_decode = xml_decode;
- fe_class->get_widget = get_widget;
- fe_class->build_code = build_code;
- fe_class->format_sexp = format_sexp;
-}
-
-static void
-filter_colour_init (FilterColour *fc)
-{
- ;
-}
-
-static void
-filter_colour_finalise (GObject *obj)
-{
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * filter_colour_new:
- *
- * Create a new FilterColour object.
- *
- * Return value: A new #FilterColour object.
- **/
-FilterColour *
-filter_colour_new (void)
-{
- return (FilterColour *) g_object_new (FILTER_TYPE_COLOUR, NULL, NULL);
-}
-
-static int
-colour_eq (FilterElement *fe, FilterElement *cm)
-{
- FilterColour *fc = (FilterColour *)fe, *cc = (FilterColour *)cm;
-
- return FILTER_ELEMENT_CLASS (parent_class)->eq (fe, cm)
- && fc->r == cc->r
- && fc->g == cc->g
- && fc->b == cc->b
- && fc->a == cc->a;
-}
-
-static void
-xml_create (FilterElement *fe, xmlNodePtr node)
-{
- /* parent implementation */
- FILTER_ELEMENT_CLASS (parent_class)->xml_create (fe, node);
-}
-
-static xmlNodePtr
-xml_encode (FilterElement *fe)
-{
- xmlNodePtr value;
- FilterColour *fc = (FilterColour *)fe;
- char hex[16];
-
- d(printf("Encoding colour as xml\n"));
- value = xmlNewNode(NULL, "value");
- xmlSetProp(value, "name", fe->name);
- xmlSetProp(value, "type", "colour");
-
- sprintf(hex, "%04x", fc->r);
- xmlSetProp(value, "red", hex);
- sprintf(hex, "%04x", fc->g);
- xmlSetProp(value, "green", hex);
- sprintf(hex, "%04x", fc->b);
- xmlSetProp(value, "blue", hex);
- sprintf(hex, "%04x", fc->a);
- xmlSetProp(value, "alpha", hex);
-
- return value;
-}
-
-static guint16
-get_value (xmlNodePtr node, char *name)
-{
- unsigned int ret;
- char *value;
-
- value = xmlGetProp(node, name);
- sscanf(value, "%04x", &ret);
- xmlFree(value);
- return ret;
-}
-
-
-static int
-xml_decode (FilterElement *fe, xmlNodePtr node)
-{
- FilterColour *fc = (FilterColour *)fe;
-
- xmlFree (fe->name);
- fe->name = xmlGetProp(node, "name");
- fc->r = get_value(node, "red");
- fc->g = get_value(node, "green");
- fc->b = get_value(node, "blue");
- fc->a = get_value(node, "alpha");
-
- return 0;
-}
-
-static void
-set_colour (GnomeColorPicker *cp, guint r, guint g, guint b, guint a, FilterColour *fc)
-{
- fc->r = r;
- fc->g = g;
- fc->b = b;
- fc->a = a;
-}
-
-static GtkWidget *
-get_widget (FilterElement *fe)
-{
- FilterColour *fc = (FilterColour *) fe;
- GnomeColorPicker *cp;
-
- cp = (GnomeColorPicker *) gnome_color_picker_new ();
- gnome_color_picker_set_i16 (cp, fc->r, fc->g, fc->b, fc->a);
- gtk_widget_show ((GtkWidget *) cp);
- g_signal_connect (cp, "color_set", G_CALLBACK (set_colour), fe);
-
- return (GtkWidget *) cp;
-}
-
-static void
-build_code (FilterElement *fe, GString *out, struct _FilterPart *ff)
-{
- return;
-}
-
-static void
-format_sexp (FilterElement *fe, GString *out)
-{
- FilterColour *fc = (FilterColour *)fe;
- char *str;
-
- str = g_strdup_printf ("#%02x%02x%02x", (fc->r >> 8) & 0xff, (fc->g >> 8) & 0xff, (fc->b >> 8) & 0xff);
- e_sexp_encode_string (out, str);
- g_free (str);
-}
diff --git a/filter/filter-colour.h b/filter/filter-colour.h
deleted file mode 100644
index 9e22a2021f..0000000000
--- a/filter/filter-colour.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef _FILTER_COLOUR_H
-#define _FILTER_COLOUR_H
-
-#include "filter-element.h"
-
-#define FILTER_TYPE_COLOUR (filter_colour_get_type ())
-#define FILTER_COLOUR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_COLOUR, FilterColour))
-#define FILTER_COLOUR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_COLOUR, FilterColourClass))
-#define IS_FILTER_COLOUR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FILTER_TYPE_COLOUR))
-#define IS_FILTER_COLOUR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FILTER_TYPE_COLOUR))
-#define FILTER_COLOUR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FILTER_TYPE_COLOUR, FilterColourClass))
-
-typedef struct _FilterColour FilterColour;
-typedef struct _FilterColourClass FilterColourClass;
-
-struct _FilterColour {
- FilterElement parent_object;
-
- guint16 r, g, b, a;
-};
-
-struct _FilterColourClass {
- FilterElementClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-GType filter_colour_get_type (void);
-FilterColour *filter_colour_new (void);
-
-/* methods */
-
-#endif /* ! _FILTER_COLOUR_H */
diff --git a/filter/filter-datespec.c b/filter/filter-datespec.c
deleted file mode 100644
index b190eeebe8..0000000000
--- a/filter/filter-datespec.c
+++ /dev/null
@@ -1,481 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <stdlib.h>
-#include <time.h>
-#include <math.h>
-
-#include <gtk/gtk.h>
-#include <libgnome/gnome-i18n.h>
-#include <glade/glade.h>
-
-#include "filter-datespec.h"
-#include "libedataserver/e-sexp.h"
-#include "widgets/misc/e-error.h"
-
-#define d(x)
-
-static gboolean validate (FilterElement *fe);
-static int date_eq (FilterElement *fe, FilterElement *cm);
-static void xml_create (FilterElement *fe, xmlNodePtr node);
-static xmlNodePtr xml_encode (FilterElement *fe);
-static int xml_decode (FilterElement *fe, xmlNodePtr node);
-static GtkWidget *get_widget (FilterElement *fe);
-static void build_code (FilterElement *fe, GString *out, struct _FilterPart *fds);
-static void format_sexp (FilterElement *, GString *);
-
-static void filter_datespec_class_init (FilterDatespecClass *klass);
-static void filter_datespec_init (FilterDatespec *fd);
-static void filter_datespec_finalise (GObject *obj);
-
-#define PRIV(x) (((FilterDatespec *)(x))->priv)
-
-typedef struct _timespan {
- guint32 seconds;
- const char *singular;
- const char *plural;
- float max;
-} timespan;
-
-#ifdef ngettext
-#undef ngettext
-#endif
-
-/* This is a nasty hack trying to keep both ngettext function and xgettext tool happy */
-/* It *will* cause problems if ngettext is a macro */
-#define ngettext(a, b) a, b
-
-static const timespan timespans[] = {
- { 1, ngettext("1 second ago", "%d seconds ago"), 59.0 },
- { 60, ngettext("1 minute ago", "%d minutes ago"), 59.0 },
- { 3600, ngettext("1 hour ago", "%d hours ago"), 23.0 },
- { 86400, ngettext("1 day ago", "%d days ago"), 31.0 },
- { 604800, ngettext("1 week ago", "%d weeks ago"), 52.0 },
- { 2419200, ngettext("1 month ago", "%d months ago"), 12.0 },
- { 31557600, ngettext("1 year ago", "%d years ago"), 1000.0 },
-};
-
-/* now we let the compiler see the real function call */
-#undef ngettext
-
-#define DAY_INDEX 3
-#define N_TIMESPANS (sizeof (timespans) / sizeof (timespans[0]))
-
-struct _FilterDatespecPrivate {
- GtkWidget *label_button;
- GtkWidget *notebook_type, *option_type, *calendar_specify, *spin_relative, *option_relative;
- FilterDatespec_type type;
- int span;
-};
-
-static FilterElementClass *parent_class;
-
-GType
-filter_datespec_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (FilterDatespecClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) filter_datespec_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (FilterDatespec),
- 0, /* n_preallocs */
- (GInstanceInitFunc) filter_datespec_init,
- };
-
- type = g_type_register_static (FILTER_TYPE_ELEMENT, "FilterDatespec", &info, 0);
- }
-
- return type;
-}
-
-static void
-filter_datespec_class_init (FilterDatespecClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- FilterElementClass *fe_class = FILTER_ELEMENT_CLASS (klass);
-
- parent_class = g_type_class_ref (FILTER_TYPE_ELEMENT);
-
- object_class->finalize = filter_datespec_finalise;
-
- /* override methods */
- fe_class->validate = validate;
- fe_class->eq = date_eq;
- fe_class->xml_create = xml_create;
- fe_class->xml_encode = xml_encode;
- fe_class->xml_decode = xml_decode;
- fe_class->get_widget = get_widget;
- fe_class->build_code = build_code;
- fe_class->format_sexp = format_sexp;
-}
-
-static void
-filter_datespec_init (FilterDatespec *fd)
-{
- fd->priv = g_malloc0 (sizeof (*fd->priv));
- fd->type = FDST_UNKNOWN;
-}
-
-static void
-filter_datespec_finalise (GObject *obj)
-{
- FilterDatespec *fd = (FilterDatespec *) obj;
-
- g_free (fd->priv);
-
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * filter_datespec_new:
- *
- * Create a new FilterDatespec object.
- *
- * Return value: A new #FilterDatespec object.
- **/
-FilterDatespec *
-filter_datespec_new (void)
-{
- return (FilterDatespec *) g_object_new (FILTER_TYPE_DATESPEC, NULL, NULL);
-}
-
-static gboolean
-validate (FilterElement *fe)
-{
- FilterDatespec *fds = (FilterDatespec *) fe;
- gboolean valid;
-
- valid = fds->type != FDST_UNKNOWN;
- if (!valid) {
- /* FIXME: FilterElement should probably have a
- GtkWidget member pointing to the value gotten with
- ::get_widget() so that we can get the parent window
- here. */
- e_error_run(NULL, "filter:no-date", NULL);
- }
-
- return valid;
-}
-
-static int
-date_eq (FilterElement *fe, FilterElement *cm)
-{
- FilterDatespec *fd = (FilterDatespec *)fe, *cd = (FilterDatespec *)cm;
-
- return FILTER_ELEMENT_CLASS (parent_class)->eq(fe, cm)
- && (fd->type == cd->type)
- && (fd->value == cd->value);
-}
-
-static void
-xml_create (FilterElement *fe, xmlNodePtr node)
-{
- /* parent implementation */
- FILTER_ELEMENT_CLASS (parent_class)->xml_create (fe, node);
-}
-
-static xmlNodePtr
-xml_encode (FilterElement *fe)
-{
- xmlNodePtr value, work;
- FilterDatespec *fds = (FilterDatespec *)fe;
- char str[32];
-
- d(printf ("Encoding datespec as xml\n"));
-
- value = xmlNewNode (NULL, "value");
- xmlSetProp (value, "name", fe->name);
- xmlSetProp (value, "type", "datespec");
-
- work = xmlNewChild (value, NULL, "datespec", NULL);
- sprintf (str, "%d", fds->type);
- xmlSetProp (work, "type", str);
- sprintf (str, "%d", (int)fds->value);
- xmlSetProp (work, "value", str);
-
- return value;
-}
-
-static int
-xml_decode (FilterElement *fe, xmlNodePtr node)
-{
- FilterDatespec *fds = (FilterDatespec *)fe;
- xmlNodePtr n;
- char *val;
-
- d(printf ("Decoding datespec from xml %p\n", fe));
-
- xmlFree (fe->name);
- fe->name = xmlGetProp (node, "name");
-
- n = node->children;
- while (n) {
- if (!strcmp (n->name, "datespec")) {
- val = xmlGetProp (n, "type");
- fds->type = atoi (val);
- xmlFree (val);
- val = xmlGetProp (n, "value");
- fds->value = atoi (val);
- xmlFree (val);
- break;
- }
- n = n->next;
- }
-
- return 0;
-}
-
-static int
-get_best_span (time_t val)
-{
- int i;
-
- for (i=N_TIMESPANS-1;i>=0;i--) {
- if (val % timespans[i].seconds == 0)
- return i;
- }
-
- return 0;
-}
-
-/* sets button label */
-static void
-set_button (FilterDatespec *fds)
-{
- char buf[128];
- char *label = buf;
-
- switch (fds->type) {
- case FDST_UNKNOWN:
- label = _("<click here to select a date>");
- break;
- case FDST_NOW:
- label = _("now");
- break;
- case FDST_SPECIFIED: {
- struct tm tm;
-
- localtime_r(&fds->value, &tm);
- /* strftime for date filter display, only needs to show a day date (i.e. no time) */
- strftime(buf, sizeof(buf), _("%d-%b-%Y"), &tm);
- break; }
- case FDST_X_AGO:
- if (fds->value == 0)
- label = _("now");
- else {
- int span, count;
-
- span = get_best_span(fds->value);
- count = fds->value / timespans[span].seconds;
-
- sprintf(buf, ngettext(timespans[span].singular, timespans[span].plural, count), count);
- }
- break;
- }
-
- gtk_label_set_text((GtkLabel *)fds->priv->label_button, label);
-}
-
-static void
-get_values (FilterDatespec *fds)
-{
- struct _FilterDatespecPrivate *p = PRIV(fds);
-
- switch(fds->priv->type) {
- case FDST_SPECIFIED: {
- guint year, month, day;
- struct tm tm;
-
- gtk_calendar_get_date((GtkCalendar *)p->calendar_specify, &year, &month, &day);
- memset(&tm, 0, sizeof(tm));
- tm.tm_mday = day;
- tm.tm_year = year - 1900;
- tm.tm_mon = month;
- fds->value = mktime(&tm);
- /* what about timezone? */
- break; }
- case FDST_X_AGO: {
- int val;
-
- val = gtk_spin_button_get_value_as_int((GtkSpinButton *)p->spin_relative);
- fds->value = timespans[p->span].seconds * val;
- break; }
- case FDST_NOW:
- default:
- break;
- }
-
- fds->type = p->type;
-}
-
-static void
-set_values (FilterDatespec *fds)
-{
- struct _FilterDatespecPrivate *p = PRIV(fds);
-
- p->type = fds->type==FDST_UNKNOWN ? FDST_NOW : fds->type;
-
- switch (p->type) {
- case FDST_NOW:
- case FDST_UNKNOWN:
- /* noop */
- break;
- case FDST_SPECIFIED:
- {
- struct tm tm;
-
- localtime_r(&fds->value, &tm);
- gtk_calendar_select_month((GtkCalendar*)p->calendar_specify, tm.tm_mon, tm.tm_year + 1900);
- gtk_calendar_select_day((GtkCalendar*)p->calendar_specify, tm.tm_mday);
- break;
- }
- case FDST_X_AGO:
- p->span = get_best_span(fds->value);
- gtk_spin_button_set_value((GtkSpinButton*)p->spin_relative, fds->value/timespans[p->span].seconds);
- gtk_option_menu_set_history((GtkOptionMenu*)p->option_relative, p->span);
- break;
- }
-
- gtk_notebook_set_current_page ((GtkNotebook*) p->notebook_type, p->type);
- gtk_option_menu_set_history ((GtkOptionMenu*) p->option_type, p->type);
-}
-
-
-static void
-set_option_type (GtkMenu *menu, FilterDatespec *fds)
-{
- GtkWidget *w;
-
- /* ugh, no other way to 'get_history' */
- w = gtk_menu_get_active (menu);
- fds->priv->type = g_list_index (GTK_MENU_SHELL (menu)->children, w);
- gtk_notebook_set_current_page ((GtkNotebook*) fds->priv->notebook_type, fds->priv->type);
-}
-
-static void
-set_option_relative (GtkMenu *menu, FilterDatespec *fds)
-{
- GtkWidget *w;
-
- w = gtk_menu_get_active (menu);
- fds->priv->span = g_list_index (GTK_MENU_SHELL (menu)->children, w);
-}
-
-static void
-button_clicked (GtkButton *button, FilterDatespec *fds)
-{
- struct _FilterDatespecPrivate *p = PRIV(fds);
- GtkWidget *toplevel;
- GtkDialog *dialog;
- GladeXML *gui;
-
- gui = glade_xml_new (FILTER_GLADEDIR "/filter.glade", "filter_datespec", NULL);
- toplevel = glade_xml_get_widget (gui, "filter_datespec");
-
- dialog = (GtkDialog *) gtk_dialog_new ();
- gtk_window_set_title ((GtkWindow *) dialog, _("Select a time to compare against"));
- gtk_dialog_add_buttons (dialog,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- NULL);
- gtk_dialog_set_has_separator (dialog, FALSE);
-
- p->notebook_type = glade_xml_get_widget (gui, "notebook_type");
- p->option_type = glade_xml_get_widget (gui, "option_type");
- p->calendar_specify = glade_xml_get_widget (gui, "calendar_specify");
- p->spin_relative = glade_xml_get_widget (gui, "spin_relative");
- p->option_relative = glade_xml_get_widget (gui, "option_relative");
-
- set_values (fds);
-
- g_signal_connect (GTK_OPTION_MENU (p->option_type)->menu, "deactivate",
- G_CALLBACK (set_option_type), fds);
- g_signal_connect (GTK_OPTION_MENU (p->option_relative)->menu, "deactivate",
- G_CALLBACK (set_option_relative), fds);
-
- gtk_box_pack_start ((GtkBox *) dialog->vbox, toplevel, TRUE, TRUE, 3);
-
- if (gtk_dialog_run (dialog) == GTK_RESPONSE_OK) {
- get_values (fds);
- set_button (fds);
- }
-
- gtk_widget_destroy ((GtkWidget *)dialog);
-}
-
-static GtkWidget *
-get_widget (FilterElement *fe)
-{
- FilterDatespec *fds = (FilterDatespec *)fe;
- GtkWidget *button;
-
- fds->priv->label_button = gtk_label_new ("");
- gtk_misc_set_alignment (GTK_MISC (fds->priv->label_button), 0.5, 0.5);
- set_button(fds);
-
- button = gtk_button_new();
- gtk_container_add (GTK_CONTAINER (button), fds->priv->label_button);
- g_signal_connect (button, "clicked", G_CALLBACK (button_clicked), fds);
-
- gtk_widget_show (button);
- gtk_widget_show (fds->priv->label_button);
-
- return button;
-}
-
-static void
-build_code (FilterElement *fe, GString *out, struct _FilterPart *fp)
-{
- return;
-}
-
-static void
-format_sexp (FilterElement *fe, GString *out)
-{
- FilterDatespec *fds = (FilterDatespec *)fe;
-
- switch (fds->type) {
- case FDST_UNKNOWN:
- g_warning ("user hasn't selected a datespec yet!");
- /* fall through */
- case FDST_NOW:
- g_string_append (out, "(get-current-date)");
- break;
- case FDST_SPECIFIED:
- g_string_append_printf (out, "%d", (int) fds->value);
- break;
- case FDST_X_AGO:
- g_string_append_printf (out, "(- (get-current-date) %d)", (int) fds->value);
- break;
- }
-}
diff --git a/filter/filter-datespec.h b/filter/filter-datespec.h
deleted file mode 100644
index 6290ab34b5..0000000000
--- a/filter/filter-datespec.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef _FILTER_DATESPEC_H
-#define _FILTER_DATESPEC_H
-
-#include <time.h>
-#include "filter-element.h"
-
-#define FILTER_TYPE_DATESPEC (filter_datespec_get_type ())
-#define FILTER_DATESPEC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_DATESPEC, FilterDatespec))
-#define FILTER_DATESPEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_DATESPEC, FilterDatespecClass))
-#define IS_FILTER_DATESPEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FILTER_TYPE_DATESPEC))
-#define IS_FILTER_DATESPEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FILTER_TYPE_DATESPEC))
-#define FILTER_DATESPEC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FILTER_TYPE_DATESPEC, FilterDatespecClass))
-
-typedef struct _FilterDatespec FilterDatespec;
-typedef struct _FilterDatespecClass FilterDatespecClass;
-
-typedef enum _FilterDatespec_type {
- FDST_UNKNOWN = -1,
- FDST_NOW,
- FDST_SPECIFIED,
- FDST_X_AGO,
-} FilterDatespec_type;
-
-struct _FilterDatespec {
- FilterElement parent;
- struct _FilterDatespecPrivate *priv;
-
- FilterDatespec_type type;
-
- /* either a timespan, an absolute time, or 0
- * depending on type -- the above mapping to
- * (X_AGO, SPECIFIED, NOW)
- */
-
- time_t value;
-};
-
-struct _FilterDatespecClass {
- FilterElementClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-GType filter_datespec_get_type (void);
-FilterDatespec *filter_datespec_new (void);
-
-/* methods */
-
-#endif /* ! _FILTER_DATESPEC_H */
diff --git a/filter/filter-element.c b/filter/filter-element.c
deleted file mode 100644
index 14aef0a015..0000000000
--- a/filter/filter-element.c
+++ /dev/null
@@ -1,341 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <stdlib.h>
-
-#include "filter-element.h"
-
-struct _element_type {
- char *name;
-
- FilterElementFunc create;
- void *data;
-};
-
-static gboolean validate (FilterElement *fe);
-static int element_eq(FilterElement *fe, FilterElement *cm);
-static void xml_create(FilterElement *fe, xmlNodePtr node);
-static FilterElement *clone(FilterElement *fe);
-static void copy_value(FilterElement *de, FilterElement *se);
-
-static void filter_element_class_init (FilterElementClass *klass);
-static void filter_element_init (FilterElement *fe);
-static void filter_element_finalise (GObject *obj);
-
-static GObjectClass *parent_class = NULL;
-static GHashTable *fe_table;
-
-GType
-filter_element_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (FilterElementClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) filter_element_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (FilterElement),
- 0, /* n_preallocs */
- (GInstanceInitFunc) filter_element_init,
- };
- fe_table = g_hash_table_new(g_str_hash, g_str_equal);
- type = g_type_register_static (G_TYPE_OBJECT, "FilterElement", &info, 0);
- }
-
- return type;
-}
-
-static void
-filter_element_class_init (FilterElementClass *klass)
-{
- parent_class = g_type_class_ref (G_TYPE_OBJECT);
-
- ((GObjectClass *)klass)->finalize = filter_element_finalise;
-
- /* override methods */
- klass->validate = validate;
- klass->eq = element_eq;
- klass->xml_create = xml_create;
- klass->clone = clone;
- klass->copy_value = copy_value;
-}
-
-static void
-filter_element_init (FilterElement *fe)
-{
- ;
-}
-
-static void
-filter_element_finalise (GObject *obj)
-{
- FilterElement *o = (FilterElement *)obj;
-
- xmlFree (o->name);
-
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * filter_element_new:
- *
- * Create a new FilterElement object.
- *
- * Return value: A new #FilterElement object.
- **/
-FilterElement *
-filter_element_new (void)
-{
- return (FilterElement *) g_object_new (FILTER_TYPE_ELEMENT, NULL, NULL);
-}
-
-gboolean
-filter_element_validate (FilterElement *fe)
-{
- return FILTER_ELEMENT_GET_CLASS (fe)->validate (fe);
-}
-
-int
-filter_element_eq (FilterElement *fe, FilterElement *cm)
-{
- FilterElementClass *klass;
-
- klass = FILTER_ELEMENT_GET_CLASS (fe);
- return (klass == FILTER_ELEMENT_GET_CLASS (cm)) && klass->eq (fe, cm);
-}
-
-/**
- * filter_element_xml_create:
- * @fe: filter element
- * @node: xml node
- *
- * Create a new filter element based on an xml definition of
- * that element.
- **/
-void
-filter_element_xml_create (FilterElement *fe, xmlNodePtr node)
-{
- FILTER_ELEMENT_GET_CLASS (fe)->xml_create (fe, node);
-}
-
-/**
- * filter_element_xml_encode:
- * @fe: filter element
- *
- * Encode the values of a filter element into xml format.
- *
- * Return value:
- **/
-xmlNodePtr
-filter_element_xml_encode (FilterElement *fe)
-{
- return FILTER_ELEMENT_GET_CLASS (fe)->xml_encode (fe);
-}
-
-/**
- * filter_element_xml_decode:
- * @fe: filter element
- * @node: xml node
- *
- * Decode the values of a fitler element from xml format.
- *
- * Return value:
- **/
-int
-filter_element_xml_decode (FilterElement *fe, xmlNodePtr node)
-{
- return FILTER_ELEMENT_GET_CLASS (fe)->xml_decode (fe, node);
-}
-
-/**
- * filter_element_clone:
- * @fe: filter element
- *
- * Clones the FilterElement @fe.
- *
- * Return value:
- **/
-FilterElement *
-filter_element_clone (FilterElement *fe)
-{
- return FILTER_ELEMENT_GET_CLASS (fe)->clone (fe);
-}
-
-/**
- * filter_element_get_widget:
- * @fe: filter element
- * @node: xml node
- *
- * Create a widget to represent this element.
- *
- * Return value:
- **/
-GtkWidget *
-filter_element_get_widget (FilterElement *fe)
-{
- return FILTER_ELEMENT_GET_CLASS (fe)->get_widget (fe);
-}
-
-/**
- * filter_element_build_code:
- * @fe: filter element
- * @out: output buffer
- * @ff:
- *
- * Add the code representing this element to the output string @out.
- **/
-void
-filter_element_build_code (FilterElement *fe, GString *out, struct _FilterPart *ff)
-{
- FILTER_ELEMENT_GET_CLASS (fe)->build_code (fe, out, ff);
-}
-
-/**
- * filter_element_format_sexp:
- * @fe: filter element
- * @out: output buffer
- *
- * Format the value(s) of this element in a method suitable for the context of
- * sexp where it is used. Usually as space separated, double-quoted strings.
- **/
-void
-filter_element_format_sexp (FilterElement *fe, GString *out)
-{
- FILTER_ELEMENT_GET_CLASS (fe)->format_sexp (fe, out);
-}
-
-void
-filter_element_set_data (FilterElement *fe, gpointer data)
-{
- fe->data = data;
-}
-
-/* default implementations */
-static gboolean
-validate (FilterElement *fe)
-{
- return TRUE;
-}
-
-static int
-element_eq (FilterElement *fe, FilterElement *cm)
-{
- return ((fe->name && cm->name && strcmp (fe->name, cm->name) == 0)
- || (fe->name == NULL && cm->name == NULL));
-}
-
-static void
-xml_create (FilterElement *fe, xmlNodePtr node)
-{
- fe->name = xmlGetProp (node, "name");
-}
-
-static FilterElement *
-clone (FilterElement *fe)
-{
- xmlNodePtr node;
- FilterElement *new;
-
- new = (FilterElement *) g_object_new (G_OBJECT_TYPE (fe), NULL, NULL);
- node = filter_element_xml_encode (fe);
- filter_element_xml_decode (new, node);
- xmlFreeNodeList (node);
-
- return new;
-}
-
-/* This is somewhat hackish, implement all the base cases in here */
-#include "filter-input.h"
-#include "filter-option.h"
-#include "filter-code.h"
-#include "filter-colour.h"
-#include "filter-datespec.h"
-#include "filter-int.h"
-#include "filter-file.h"
-#include "filter-label.h"
-
-static void
-copy_value(FilterElement *de, FilterElement *se)
-{
- if (IS_FILTER_INPUT(se)) {
- if (IS_FILTER_INPUT(de)) {
- if (((FilterInput *)se)->values)
- filter_input_set_value((FilterInput*)de, ((FilterInput *)se)->values->data);
- } else if (IS_FILTER_INT(de)) {
- ((FilterInt *)de)->val = atoi((char *) ((FilterInput *)se)->values->data);
- }
- } else if (IS_FILTER_COLOUR(se)) {
- if (IS_FILTER_COLOUR(de)) {
- FilterColour *s = (FilterColour *)se, *d = (FilterColour *)de;
-
- d->r = s->r;
- d->g = s->g;
- d->b = s->b;
- d->a = s->a;
- }
- } else if (IS_FILTER_DATESPEC(se)) {
- if (IS_FILTER_DATESPEC(de)) {
- FilterDatespec *s = (FilterDatespec *)se, *d = (FilterDatespec *)de;
-
- d->type = s->type;
- d->value = s->value;
- }
- } else if (IS_FILTER_INT(se)) {
- if (IS_FILTER_INT(de)) {
- FilterInt *s = (FilterInt *)se, *d = (FilterInt *)de;
-
- d->val = s->val;
- } else if (IS_FILTER_INPUT(de)) {
- FilterInt *s = (FilterInt *)se;
- FilterInput *d = (FilterInput *)de;
- char *v;
-
- v = g_strdup_printf("%d", s->val);
- filter_input_set_value(d, v);
- g_free(v);
- }
- } else if (IS_FILTER_OPTION(se)) {
- if (IS_FILTER_OPTION(de)) {
- FilterOption *s = (FilterOption *)se, *d = (FilterOption *)de;
-
- if (s->current)
- filter_option_set_current(d, s->current->value);
- }
- }
-}
-
-/* only copies the value, not the name/type */
-void
-filter_element_copy_value (FilterElement *de, FilterElement *se)
-{
- FILTER_ELEMENT_GET_CLASS (de)->copy_value(de, se);
-}
diff --git a/filter/filter-element.h b/filter/filter-element.h
deleted file mode 100644
index 12fb3b9251..0000000000
--- a/filter/filter-element.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef _FILTER_ELEMENT_H
-#define _FILTER_ELEMENT_H
-
-#include <glib.h>
-#include <glib-object.h>
-#include <gtk/gtkwidget.h>
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-
-#define FILTER_TYPE_ELEMENT (filter_element_get_type ())
-#define FILTER_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_ELEMENT, FilterElement))
-#define FILTER_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_ELEMENT, FilterElementClass))
-#define IS_FILTER_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FILTER_TYPE_ELEMENT))
-#define IS_FILTER_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FILTER_TYPE_ELEMENT))
-#define FILTER_ELEMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FILTER_TYPE_ELEMENT, FilterElementClass))
-
-typedef struct _FilterElement FilterElement;
-typedef struct _FilterElementClass FilterElementClass;
-
-typedef FilterElement *(*FilterElementFunc)(void *data);
-
-struct _FilterElement {
- GObject parent_object;
-
- char *name;
- gpointer data;
-};
-
-struct _FilterPart;
-
-struct _FilterElementClass {
- GObjectClass parent_class;
-
- /* virtual methods */
- gboolean (*validate) (FilterElement *fe);
- int (*eq) (FilterElement *fe, FilterElement *cm);
-
- void (*xml_create) (FilterElement *, xmlNodePtr);
- xmlNodePtr (*xml_encode) (FilterElement *);
- int (*xml_decode) (FilterElement *, xmlNodePtr);
-
- FilterElement *(*clone) (FilterElement *fe);
- void (*copy_value)(FilterElement *fe, FilterElement *se);
-
- GtkWidget *(*get_widget) (FilterElement *);
- void (*build_code) (FilterElement *, GString *, struct _FilterPart *ff);
- void (*format_sexp) (FilterElement *, GString *);
-
- /* signals */
-};
-
-GType filter_element_get_type (void);
-FilterElement *filter_element_new (void);
-
-void filter_element_set_data (FilterElement *fe, gpointer data);
-
-/* methods */
-gboolean filter_element_validate (FilterElement *fe);
-int filter_element_eq (FilterElement *fe, FilterElement *cm);
-
-void filter_element_xml_create (FilterElement *fe, xmlNodePtr node);
-
-xmlNodePtr filter_element_xml_encode (FilterElement *fe);
-int filter_element_xml_decode (FilterElement *fe, xmlNodePtr node);
-FilterElement *filter_element_clone (FilterElement *fe);
-void filter_element_copy_value (FilterElement *de, FilterElement *se);
-
-GtkWidget *filter_element_get_widget (FilterElement *fe);
-void filter_element_build_code (FilterElement *fe, GString *out, struct _FilterPart *ff);
-void filter_element_format_sexp (FilterElement *fe, GString *out);
-
-#endif /* ! _FILTER_ELEMENT_H */
diff --git a/filter/filter-errors.xml b/filter/filter-errors.xml
deleted file mode 100644
index 21487f04f7..0000000000
--- a/filter/filter-errors.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<error-list domain="filter">
-
- <error id="no-date" type="error">
- <primary>Missing date.</primary>
- <secondary>You must choose a date.</secondary>
- </error>
-
- <error id="no-file" type="error">
- <primary>Missing file name.</primary>
- <secondary>You must specify a file name.</secondary>
- </error>
-
- <error id="bad-file" type="error">
- <primary>File &quot;{0}&quot; does not exist or is not a regular file.</primary>
- <secondary>You must specify a file name.</secondary>
- </error>
-
- <error id="bad-regexp" type="error">
- <primary>Bad regular expression &quot;{0}&quot;.</primary>
- <secondary>Could not compile regular expression &quot;{1}&quot;.</secondary>
- </error>
-
- <error id="no-name" type="error">
- <primary>Missing name.</primary>
- <secondary>You must name this filter.</secondary>
- </error>
-
- <error id="bad-name-notunique" type="error">
- <primary>Name &quot;{0}&quot; already used.</primary>
- <secondary>Please choose another name.</secondary>
- </error>
-
-</error-list> \ No newline at end of file
diff --git a/filter/filter-errors.xml.h b/filter/filter-errors.xml.h
deleted file mode 100644
index f14c26698b..0000000000
--- a/filter/filter-errors.xml.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* filter:no-date primary */
-char *s = N_("Missing date.");
-/* filter:no-date secondary */
-char *s = N_("You must choose a date.");
-/* filter:no-file primary */
-char *s = N_("Missing file name.");
-/* filter:no-file secondary */
-char *s = N_("You must specify a file name.");
-/* filter:bad-file primary */
-char *s = N_("File \"{0}\" does not exist or is not a regular file.");
-/* filter:bad-file secondary */
-char *s = N_("You must specify a file name.");
-/* filter:bad-regexp primary */
-char *s = N_("Bad regular expression \"{0}\".");
-/* filter:bad-regexp secondary */
-char *s = N_("Could not compile regular expression \"{1}\".");
-/* filter:no-name primary */
-char *s = N_("Missing name.");
-/* filter:no-name secondary */
-char *s = N_("You must name this filter.");
-/* filter:bad-name-notunique primary */
-char *s = N_("Name \"{0}\" already used.");
-/* filter:bad-name-notunique secondary */
-char *s = N_("Please choose another name.");
diff --git a/filter/filter-file.c b/filter/filter-file.c
deleted file mode 100644
index e654c79cc1..0000000000
--- a/filter/filter-file.c
+++ /dev/null
@@ -1,313 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 2002 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <gtk/gtk.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/gnome-file-entry.h>
-
-#include "filter-file.h"
-#include "libedataserver/e-sexp.h"
-#include "widgets/misc/e-error.h"
-
-#define d(x)
-
-static gboolean validate (FilterElement *fe);
-static int file_eq (FilterElement *fe, FilterElement *cm);
-static void xml_create (FilterElement *fe, xmlNodePtr node);
-static xmlNodePtr xml_encode (FilterElement *fe);
-static int xml_decode (FilterElement *fe, xmlNodePtr node);
-static GtkWidget *get_widget (FilterElement *fe);
-static void build_code (FilterElement *fe, GString *out, struct _FilterPart *ff);
-static void format_sexp (FilterElement *, GString *);
-
-static void filter_file_class_init (FilterFileClass *klass);
-static void filter_file_init (FilterFile *ff);
-static void filter_file_finalise (GObject *obj);
-
-
-static FilterElementClass *parent_class = NULL;
-
-
-GType
-filter_file_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (FilterFileClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) filter_file_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (FilterFile),
- 0, /* n_preallocs */
- (GInstanceInitFunc) filter_file_init,
- };
-
- type = g_type_register_static (FILTER_TYPE_ELEMENT, "FilterFile", &info, 0);
- }
-
- return type;
-}
-
-static void
-filter_file_class_init (FilterFileClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- FilterElementClass *fe_class = FILTER_ELEMENT_CLASS (klass);
-
- parent_class = g_type_class_ref (FILTER_TYPE_ELEMENT);
-
- object_class->finalize = filter_file_finalise;
-
- /* override methods */
- fe_class->validate = validate;
- fe_class->eq = file_eq;
- fe_class->xml_create = xml_create;
- fe_class->xml_encode = xml_encode;
- fe_class->xml_decode = xml_decode;
- fe_class->get_widget = get_widget;
- fe_class->build_code = build_code;
- fe_class->format_sexp = format_sexp;
-}
-
-static void
-filter_file_init (FilterFile *ff)
-{
- ;
-}
-
-static void
-filter_file_finalise (GObject *obj)
-{
- FilterFile *ff = (FilterFile *) obj;
-
- xmlFree (ff->type);
- g_free (ff->path);
-
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * filter_file_new:
- *
- * Create a new FilterFile object.
- *
- * Return value: A new #FilterFile object.
- **/
-FilterFile *
-filter_file_new (void)
-{
- return (FilterFile *) g_object_new (FILTER_TYPE_FILE, NULL, NULL);
-}
-
-
-FilterFile *
-filter_file_new_type_name (const char *type)
-{
- FilterFile *file;
-
- file = filter_file_new ();
- file->type = xmlStrdup (type);
-
- return file;
-}
-
-void
-filter_file_set_path (FilterFile *file, const char *path)
-{
- g_free (file->path);
- file->path = g_strdup (path);
-}
-
-static gboolean
-validate (FilterElement *fe)
-{
- FilterFile *file = (FilterFile *) fe;
- struct stat st;
-
- if (!file->path) {
- /* FIXME: FilterElement should probably have a
- GtkWidget member pointing to the value gotten with
- ::get_widget() so that we can get the parent window
- here. */
- e_error_run(NULL, "filter:no-file", NULL);
-
- return FALSE;
- }
-
- /* FIXME: do more to validate command-lines? */
-
- if (strcmp (file->type, "file") == 0) {
- if (stat (file->path, &st) == -1 || !S_ISREG (st.st_mode)) {
- /* FIXME: FilterElement should probably have a
- GtkWidget member pointing to the value gotten with
- ::get_widget() so that we can get the parent window
- here. */
- e_error_run(NULL, "filter:bad-file", file->path, NULL);
-
- return FALSE;
- }
- } else if (strcmp (file->type, "command") == 0) {
- /* only requirements so far is that the command can't
- be an empty string */
- return file->path[0] != '\0';
- }
-
- return TRUE;
-}
-
-static int
-file_eq (FilterElement *fe, FilterElement *cm)
-{
- FilterFile *ff = (FilterFile *)fe, *cf = (FilterFile *)cm;
-
- return FILTER_ELEMENT_CLASS (parent_class)->eq (fe, cm)
- && ((ff->path && cf->path && strcmp (ff->path, cf->path) == 0)
- || (ff->path == NULL && cf->path == NULL))
- && ((ff->type && cf->type && strcmp (ff->type, cf->type) == 0)
- || (ff->type == NULL && cf->type == NULL));
-}
-
-static void
-xml_create (FilterElement *fe, xmlNodePtr node)
-{
- /* parent implementation */
- FILTER_ELEMENT_CLASS (parent_class)->xml_create (fe, node);
-}
-
-static xmlNodePtr
-xml_encode (FilterElement *fe)
-{
- FilterFile *file = (FilterFile *) fe;
- xmlNodePtr cur, value;
- char *type;
-
- type = file->type ? file->type : "file";
-
- d(printf ("Encoding %s as xml\n", type));
-
- value = xmlNewNode (NULL, "value");
- xmlSetProp (value, "name", fe->name);
- xmlSetProp (value, "type", type);
-
- cur = xmlNewChild (value, NULL, type, NULL);
- xmlNodeSetContent (cur, file->path);
-
- return value;
-}
-
-static int
-xml_decode (FilterElement *fe, xmlNodePtr node)
-{
- FilterFile *file = (FilterFile *)fe;
- char *name, *str, *type;
- xmlNodePtr n;
-
- name = xmlGetProp (node, "name");
- type = xmlGetProp (node, "type");
-
- d(printf("Decoding %s from xml %p\n", type, fe));
- d(printf ("Name = %s\n", name));
-
- xmlFree (fe->name);
- fe->name = name;
- xmlFree (file->type);
- file->type = type;
-
- g_free (file->path);
- file->path = NULL;
-
- n = node->children;
- while (n != NULL) {
- if (!strcmp (n->name, type)) {
- str = xmlNodeGetContent (n);
- file->path = g_strdup (str ? str : "");
- xmlFree (str);
-
- d(printf (" '%s'\n", file->path));
- break;
- } else if (n->type == XML_ELEMENT_NODE) {
- g_warning ("Unknown node type '%s' encountered decoding a %s\n", n->name, type);
- }
-
- n = n->next;
- }
-
- return 0;
-}
-
-static void
-entry_changed (GtkEntry *entry, FilterElement *fe)
-{
- FilterFile *file = (FilterFile *) fe;
- const char *new;
-
- new = gtk_entry_get_text (entry);
-
- g_free (file->path);
- file->path = g_strdup (new);
-}
-
-static GtkWidget *
-get_widget (FilterElement *fe)
-{
- FilterFile *file = (FilterFile *) fe;
- GtkWidget *fileentry, *entry;
-
- fileentry = gnome_file_entry_new (NULL, _("Choose a file"));
- g_object_set (G_OBJECT (fileentry), "use_filechooser", TRUE, NULL);
- gnome_file_entry_set_default_path (GNOME_FILE_ENTRY (fileentry), file->path);
- gnome_file_entry_set_modal (GNOME_FILE_ENTRY (fileentry), TRUE);
-
- entry = gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (fileentry));
- gtk_entry_set_text (GTK_ENTRY (entry), file->path);
-
- g_signal_connect (entry, "changed", G_CALLBACK (entry_changed), fe);
-
- return fileentry;
-}
-
-static void
-build_code (FilterElement *fe, GString *out, struct _FilterPart *ff)
-{
- return;
-}
-
-static void
-format_sexp (FilterElement *fe, GString *out)
-{
- FilterFile *file = (FilterFile *) fe;
-
- e_sexp_encode_string (out, file->path);
-}
diff --git a/filter/filter-file.h b/filter/filter-file.h
deleted file mode 100644
index a3e28d0b5c..0000000000
--- a/filter/filter-file.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 2002 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifndef __FILTER_FILE_H__
-#define __FILTER_FILE_H__
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#include "filter-element.h"
-
-#define FILTER_TYPE_FILE (filter_file_get_type ())
-#define FILTER_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_FILE, FilterFile))
-#define FILTER_FILE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_FILE, FilterFileClass))
-#define IS_FILTER_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FILTER_TYPE_FILE))
-#define IS_FILTER_FILE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FILTER_TYPE_FILE))
-#define FILTER_FILE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FILTER_TYPE_FILE, FilterFileClass))
-
-typedef struct _FilterFile FilterFile;
-typedef struct _FilterFileClass FilterFileClass;
-
-struct _FilterFile {
- FilterElement parent_object;
-
- char *type;
- char *path;
-};
-
-struct _FilterFileClass {
- FilterElementClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-
-GType filter_file_get_type (void);
-
-FilterFile *filter_file_new (void);
-
-FilterFile *filter_file_new_type_name (const char *type);
-
-/* methods */
-void filter_file_set_path (FilterFile *file, const char *path);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* ! __FILTER_FILE_H__ */
diff --git a/filter/filter-input.c b/filter/filter-input.c
deleted file mode 100644
index d610d5d872..0000000000
--- a/filter/filter-input.c
+++ /dev/null
@@ -1,366 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <sys/types.h>
-#include <regex.h>
-
-#include <gtk/gtk.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "filter-input.h"
-#include "libedataserver/e-sexp.h"
-#include "widgets/misc/e-error.h"
-
-#define d(x)
-
-static gboolean validate (FilterElement *fe);
-static int input_eq (FilterElement *fe, FilterElement *cm);
-static void xml_create (FilterElement *fe, xmlNodePtr node);
-static xmlNodePtr xml_encode (FilterElement *fe);
-static int xml_decode (FilterElement *fe, xmlNodePtr node);
-static GtkWidget *get_widget (FilterElement *fe);
-static void build_code (FilterElement *fe, GString *out, struct _FilterPart *ff);
-static void format_sexp (FilterElement *, GString *);
-
-static void filter_input_class_init (FilterInputClass *klass);
-static void filter_input_init (FilterInput *fi);
-static void filter_input_finalise (GObject *obj);
-
-
-static FilterElementClass *parent_class = NULL;
-
-
-GType
-filter_input_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (FilterInputClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) filter_input_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (FilterInput),
- 0, /* n_preallocs */
- (GInstanceInitFunc) filter_input_init,
- };
-
- type = g_type_register_static (FILTER_TYPE_ELEMENT, "FilterInput", &info, 0);
- }
-
- return type;
-}
-
-static void
-filter_input_class_init (FilterInputClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- FilterElementClass *fe_class = FILTER_ELEMENT_CLASS (klass);
-
- parent_class = g_type_class_ref (FILTER_TYPE_ELEMENT);
-
- object_class->finalize = filter_input_finalise;
-
- /* override methods */
- fe_class->validate = validate;
- fe_class->eq = input_eq;
- fe_class->xml_create = xml_create;
- fe_class->xml_encode = xml_encode;
- fe_class->xml_decode = xml_decode;
- fe_class->get_widget = get_widget;
- fe_class->build_code = build_code;
- fe_class->format_sexp = format_sexp;
-}
-
-static void
-filter_input_init (FilterInput *fi)
-{
- fi->values = g_list_prepend (NULL, g_strdup (""));
-}
-
-static void
-filter_input_finalise (GObject *obj)
-{
- FilterInput *fi = (FilterInput *) obj;
-
- xmlFree (fi->type);
- g_list_foreach (fi->values, (GFunc)g_free, NULL);
- g_list_free (fi->values);
-
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * filter_input_new:
- *
- * Create a new FilterInput object.
- *
- * Return value: A new #FilterInput object.
- **/
-FilterInput *
-filter_input_new (void)
-{
- return (FilterInput *) g_object_new (FILTER_TYPE_INPUT, NULL, NULL);
-}
-
-FilterInput *
-filter_input_new_type_name (const char *type)
-{
- FilterInput *fi;
-
- fi = filter_input_new ();
- fi->type = xmlStrdup (type);
-
- d(printf("new type %s = %p\n", type, fi));
-
- return fi;
-}
-
-void
-filter_input_set_value (FilterInput *fi, const char *value)
-{
- GList *l;
-
- d(printf("set_value '%s'\n", value));
-
- l = fi->values;
- while (l) {
- g_free (l->data);
- l = g_list_next (l);
- }
- g_list_free (fi->values);
-
- fi->values = g_list_append (NULL, g_strdup (value));
-}
-
-static gboolean
-validate (FilterElement *fe)
-{
- FilterInput *fi = (FilterInput *)fe;
- gboolean valid = TRUE;
-
- if (fi->values && !strcmp (fi->type, "regex")) {
- const char *pattern;
- regex_t regexpat;
- int regerr;
-
- pattern = fi->values->data;
-
- if ((regerr = regcomp (&regexpat, pattern, REG_EXTENDED | REG_NEWLINE | REG_ICASE))) {
- size_t reglen;
- char *regmsg;
-
- /* regerror gets called twice to get the full error string
- length to do proper posix error reporting */
- reglen = regerror (regerr, &regexpat, 0, 0);
- regmsg = g_malloc0 (reglen + 1);
- regerror (regerr, &regexpat, regmsg, reglen);
-
- /* FIXME: FilterElement should probably have a
- GtkWidget member pointing to the value gotten with
- ::get_widget() so that we can get the parent window
- here. */
- e_error_run(NULL, "filter:bad-regexp", pattern, regmsg, NULL);
- g_free (regmsg);
-
- valid = FALSE;
- }
-
- regfree (&regexpat);
- }
-
- return valid;
-}
-
-static int
-list_eq (GList *al, GList *bl)
-{
- int truth = TRUE;
-
- while (truth && al && bl) {
- truth = strcmp ((char *) al->data, (char *) bl->data) == 0;
- al = al->next;
- bl = bl->next;
- }
-
- return truth && al == NULL && bl == NULL;
-}
-
-static int
-input_eq (FilterElement *fe, FilterElement *cm)
-{
- FilterInput *fi = (FilterInput *)fe, *ci = (FilterInput *)cm;
-
- return FILTER_ELEMENT_CLASS (parent_class)->eq (fe, cm)
- && strcmp (fi->type, ci->type) == 0
- && list_eq (fi->values, ci->values);
-}
-
-static void
-xml_create (FilterElement *fe, xmlNodePtr node)
-{
- /* parent implementation */
- FILTER_ELEMENT_CLASS (parent_class)->xml_create (fe, node);
-}
-
-static xmlNodePtr
-xml_encode (FilterElement *fe)
-{
- xmlNodePtr value;
- GList *l;
- FilterInput *fi = (FilterInput *)fe;
- char *type;
-
- type = fi->type ? fi->type : "string";
-
- d(printf ("Encoding %s as xml\n", type));
-
- value = xmlNewNode (NULL, "value");
- xmlSetProp (value, "name", fe->name);
- xmlSetProp (value, "type", type);
- l = fi->values;
- while (l) {
- xmlNodePtr cur;
- char *str = l->data;
-
- cur = xmlNewChild (value, NULL, type, NULL);
-
- str = xmlEncodeEntitiesReentrant (NULL, str);
- xmlNodeSetContent (cur, str);
- xmlFree (str);
-
- l = l->next;
- }
-
- return value;
-}
-
-static int
-xml_decode (FilterElement *fe, xmlNodePtr node)
-{
- FilterInput *fi = (FilterInput *)fe;
- char *name, *str, *type;
- xmlNodePtr n;
- GList *l;
-
- l = fi->values;
- while (l) {
- g_free (l->data);
- l = l->next;
- }
- g_list_free (fi->values);
- fi->values = NULL;
-
- name = xmlGetProp (node, "name");
- type = xmlGetProp (node, "type");
-
- d(printf("Decoding %s from xml %p\n", type, fe));
- d(printf ("Name = %s\n", name));
- xmlFree (fe->name);
- fe->name = name;
- xmlFree (fi->type);
- fi->type = type;
- n = node->children;
- while (n) {
- if (!strcmp (n->name, type)) {
- if (!(str = xmlNodeGetContent (n)))
- str = xmlStrdup ("");
-
- d(printf (" '%s'\n", str));
- fi->values = g_list_append (fi->values, g_strdup (str));
- xmlFree (str);
- } else if (n->type == XML_ELEMENT_NODE) {
- g_warning ("Unknown node type '%s' encountered decoding a %s\n", n->name, type);
- }
- n = n->next;
- }
-
- return 0;
-}
-
-static void
-entry_changed (GtkEntry *entry, FilterElement *fe)
-{
- FilterInput *fi = (FilterInput *) fe;
- const char *new;
- GList *l;
-
- new = gtk_entry_get_text (entry);
-
- d(printf("entry_changed '%s'\n", new));
-
- /* NOTE: entry only supports a single value ... */
- l = fi->values;
- while (l) {
- g_free (l->data);
- l = l->next;
- }
-
- g_list_free (fi->values);
-
- fi->values = g_list_append (NULL, g_strdup (new));
-}
-
-static GtkWidget *
-get_widget (FilterElement *fe)
-{
- GtkWidget *entry;
- FilterInput *fi = (FilterInput *)fe;
-
- entry = gtk_entry_new ();
- if (fi->values && fi->values->data)
- gtk_entry_set_text (GTK_ENTRY (entry), (const char *) fi->values->data);
-
- g_signal_connect (entry, "changed", G_CALLBACK (entry_changed), fe);
-
- return entry;
-}
-
-static void
-build_code (FilterElement *fe, GString *out, struct _FilterPart *ff)
-{
- ;
-}
-
-static void
-format_sexp (FilterElement *fe, GString *out)
-{
- FilterInput *fi = (FilterInput *) fe;
- GList *l;
-
- d(printf("format_sexp, first elem=%p\n", fi->values));
-
- l = fi->values;
- while (l) {
- e_sexp_encode_string (out, l->data);
- l = l->next;
- }
-}
diff --git a/filter/filter-input.h b/filter/filter-input.h
deleted file mode 100644
index 7a7b4761de..0000000000
--- a/filter/filter-input.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef _FILTER_INPUT_H
-#define _FILTER_INPUT_H
-
-#include "filter-element.h"
-
-#define FILTER_TYPE_INPUT (filter_input_get_type ())
-#define FILTER_INPUT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_INPUT, FilterInput))
-#define FILTER_INPUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_INPUT, FilterInputClass))
-#define IS_FILTER_INPUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FILTER_TYPE_INPUT))
-#define IS_FILTER_INPUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FILTER_TYPE_INPUT))
-#define FILTER_INPUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FILTER_TYPE_INPUT, FilterInputClass))
-
-typedef struct _FilterInput FilterInput;
-typedef struct _FilterInputClass FilterInputClass;
-
-struct _FilterInput {
- FilterElement parent_object;
-
- char *type; /* name of type */
- GList *values; /* strings */
-};
-
-struct _FilterInputClass {
- FilterElementClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-GType filter_input_get_type (void);
-FilterInput *filter_input_new (void);
-
-FilterInput *filter_input_new_type_name (const char *type);
-
-/* methods */
-void filter_input_set_value (FilterInput *fi, const char *value);
-
-#endif /* ! _FILTER_INPUT_H */
diff --git a/filter/filter-int.c b/filter/filter-int.c
deleted file mode 100644
index eb14eaa695..0000000000
--- a/filter/filter-int.c
+++ /dev/null
@@ -1,269 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 2002 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <gtk/gtkspinbutton.h>
-
-#include <libedataserver/e-sexp.h>
-#include "filter-int.h"
-
-#define d(x)
-
-static int int_eq (FilterElement *fe, FilterElement *cm);
-static FilterElement *int_clone(FilterElement *fe);
-static void xml_create (FilterElement *fe, xmlNodePtr node);
-static xmlNodePtr xml_encode (FilterElement *fe);
-static int xml_decode (FilterElement *fe, xmlNodePtr node);
-static GtkWidget *get_widget (FilterElement *fe);
-static void build_code (FilterElement *fe, GString *out, struct _FilterPart *ff);
-static void format_sexp (FilterElement *fe, GString *out);
-
-static void filter_int_class_init (FilterIntClass *klass);
-static void filter_int_init (FilterInt *fi);
-static void filter_int_finalise (GObject *obj);
-
-
-static FilterElementClass *parent_class;
-
-
-GType
-filter_int_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (FilterIntClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) filter_int_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (FilterInt),
- 0, /* n_preallocs */
- (GInstanceInitFunc) filter_int_init,
- };
-
- type = g_type_register_static (FILTER_TYPE_ELEMENT, "FilterInt", &info, 0);
- }
-
- return type;
-}
-
-static void
-filter_int_class_init (FilterIntClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- FilterElementClass *fe_class = FILTER_ELEMENT_CLASS (klass);
-
- parent_class = g_type_class_ref (FILTER_TYPE_ELEMENT);
-
- object_class->finalize = filter_int_finalise;
-
- /* override methods */
- fe_class->eq = int_eq;
- fe_class->clone = int_clone;
- fe_class->xml_create = xml_create;
- fe_class->xml_encode = xml_encode;
- fe_class->xml_decode = xml_decode;
- fe_class->get_widget = get_widget;
- fe_class->build_code = build_code;
- fe_class->format_sexp = format_sexp;
-}
-
-static void
-filter_int_init (FilterInt *fi)
-{
- fi->min = 0;
- fi->max = G_MAXINT;
-}
-
-static void
-filter_int_finalise (GObject *obj)
-{
- FilterInt *fi = (FilterInt *) obj;
-
- g_free (fi->type);
-
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * filter_int_new:
- *
- * Create a new FilterInt object.
- *
- * Return value: A new #FilterInt object.
- **/
-FilterInt *
-filter_int_new (void)
-{
- return (FilterInt *) g_object_new (FILTER_TYPE_INT, NULL, NULL);
-}
-
-FilterInt *
-filter_int_new_type (const char *type, int min, int max)
-{
- FilterInt *fi;
-
- fi = filter_int_new ();
-
- fi->type = g_strdup (type);
- fi->min = min;
- fi->max = max;
-
- return fi;
-}
-
-void
-filter_int_set_value (FilterInt *fi, int val)
-{
- fi->val = val;
-}
-
-static int
-int_eq (FilterElement *fe, FilterElement *cm)
-{
- return FILTER_ELEMENT_CLASS (parent_class)->eq (fe, cm)
- && ((FilterInt *)fe)->val == ((FilterInt *)cm)->val;
-}
-
-static FilterElement *
-int_clone(FilterElement *fe)
-{
- FilterInt *fi, *fs;
-
- fs = (FilterInt *)fe;
- fi = filter_int_new_type(fs->type, fs->min, fs->max);
- fi->val = fs->val;
- ((FilterElement *)fi)->name = g_strdup(fe->name);
-
- return (FilterElement *)fi;
-}
-
-static void
-xml_create (FilterElement *fe, xmlNodePtr node)
-{
- /* parent implementation */
- FILTER_ELEMENT_CLASS (parent_class)->xml_create (fe, node);
-}
-
-static xmlNodePtr
-xml_encode (FilterElement *fe)
-{
- xmlNodePtr value;
- FilterInt *fs = (FilterInt *)fe;
- char intval[32];
- const char *type;
-
- type = fs->type?fs->type:"integer";
-
- d(printf("Encoding %s as xml\n", type));
-
- value = xmlNewNode (NULL, "value");
- xmlSetProp (value, "name", fe->name);
- xmlSetProp (value, "type", type);
-
- sprintf(intval, "%d", fs->val);
- xmlSetProp (value, type, intval);
-
- return value;
-}
-
-static int
-xml_decode (FilterElement *fe, xmlNodePtr node)
-{
- FilterInt *fs = (FilterInt *)fe;
- char *name, *type;
- char *intval;
-
- d(printf("Decoding integer from xml %p\n", fe));
-
- name = xmlGetProp (node, "name");
- d(printf ("Name = %s\n", name));
- xmlFree (fe->name);
- fe->name = name;
-
- type = xmlGetProp(node, "type");
- d(printf ("Type = %s\n", type));
- g_free(fs->type);
- fs->type = g_strdup(type);
- xmlFree(type);
-
- intval = xmlGetProp (node, fs->type ? fs->type : "integer");
- if (intval) {
- d(printf ("Value = %s\n", intval));
- fs->val = atoi (intval);
- xmlFree (intval);
- } else {
- d(printf ("Value = ?unknown?\n"));
- fs->val = 0;
- }
-
- return 0;
-}
-
-static void
-spin_changed (GtkWidget *spin, FilterElement *fe)
-{
- FilterInt *fs = (FilterInt *)fe;
-
- fs->val = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
-}
-
-static GtkWidget *
-get_widget (FilterElement *fe)
-{
- GtkWidget *spin;
- GtkObject *adjustment;
- FilterInt *fs = (FilterInt *)fe;
-
- adjustment = gtk_adjustment_new (0.0, (gfloat)fs->min, (gfloat)fs->max, 1.0, 1.0, 1.0);
- spin = gtk_spin_button_new (GTK_ADJUSTMENT (adjustment), fs->max>fs->min+1000?5.0:1.0, 0);
- gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spin), TRUE);
-
- if (fs->val)
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), (gfloat) fs->val);
-
- g_signal_connect (spin, "value-changed", G_CALLBACK (spin_changed), fe);
-
- return spin;
-}
-
-static void
-build_code (FilterElement *fe, GString *out, struct _FilterPart *ff)
-{
- return;
-}
-
-static void
-format_sexp (FilterElement *fe, GString *out)
-{
- FilterInt *fs = (FilterInt *)fe;
-
- g_string_append_printf (out, "%d", fs->val);
-}
diff --git a/filter/filter-int.h b/filter/filter-int.h
deleted file mode 100644
index caba992958..0000000000
--- a/filter/filter-int.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 2002 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifndef _FILTER_INT_H
-#define _FILTER_INT_H
-
-#include "filter-element.h"
-
-#define FILTER_TYPE_INT (filter_int_get_type ())
-#define FILTER_INT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_INT, FilterInt))
-#define FILTER_INT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_INT, FilterIntClass))
-#define IS_FILTER_INT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FILTER_TYPE_INT))
-#define IS_FILTER_INT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FILTER_TYPE_INT))
-#define FILTER_INT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FILTER_TYPE_INT, FilterIntClass))
-
-typedef struct _FilterInt FilterInt;
-typedef struct _FilterIntClass FilterIntClass;
-
-struct _FilterInt {
- FilterElement parent_object;
-
- char *type;
- int val;
- int min;
- int max;
-};
-
-struct _FilterIntClass {
- FilterElementClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-GType filter_int_get_type (void);
-FilterInt *filter_int_new (void);
-FilterInt *filter_int_new_type (const char *type, int min, int max);
-void filter_int_set_value (FilterInt *fi, int val);
-
-/* methods */
-
-#endif /* ! _FILTER_INT_H */
diff --git a/filter/filter-label.c b/filter/filter-label.c
deleted file mode 100644
index 52d6021886..0000000000
--- a/filter/filter-label.c
+++ /dev/null
@@ -1,182 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@ximian.com>
- * Michael Zucchi <notzed@ximian.com>
- *
- * Copyright 2002 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-#include <gconf/gconf.h>
-#include <gconf/gconf-client.h>
-#include <libgnome/gnome-i18n.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <libgnomeui/gnome-dialog-util.h>
-#include <libgnomeui/gnome-file-entry.h>
-
-#include "filter-label.h"
-#include <libedataserver/e-sexp.h>
-
-#define d(x)
-
-static void xml_create (FilterElement *fe, xmlNodePtr node);
-
-static void filter_label_class_init (FilterLabelClass *klass);
-static void filter_label_init (FilterLabel *label);
-static void filter_label_finalise (GObject *obj);
-
-
-static FilterElementClass *parent_class;
-
-
-GType
-filter_label_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (FilterLabelClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) filter_label_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (FilterLabel),
- 0, /* n_preallocs */
- (GInstanceInitFunc) filter_label_init,
- };
-
- type = g_type_register_static (FILTER_TYPE_OPTION, "FilterLabel", &info, 0);
- }
-
- return type;
-}
-
-static void
-filter_label_class_init (FilterLabelClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- FilterElementClass *fe_class = FILTER_ELEMENT_CLASS (klass);
-
- parent_class = g_type_class_ref (FILTER_TYPE_OPTION);
-
- object_class->finalize = filter_label_finalise;
-
- /* override methods */
- fe_class->xml_create = xml_create;
-}
-
-static void
-filter_label_init (FilterLabel *fl)
-{
- ((FilterOption *) fl)->type = "label";
-}
-
-static void
-filter_label_finalise (GObject *obj)
-{
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * filter_label_new:
- *
- * Create a new FilterLabel object.
- *
- * Return value: A new #FilterLabel object.
- **/
-FilterLabel *
-filter_label_new (void)
-{
- return (FilterLabel *) g_object_new (FILTER_TYPE_LABEL, NULL, NULL);
-}
-
-static struct {
- char *title;
- char *value;
-} labels[] = {
- { N_("Important"), "important" },
- { N_("Work"), "work" },
- { N_("Personal"), "personal" },
- { N_("To Do"), "todo" },
- { N_("Later"), "later" },
-};
-
-int filter_label_count (void)
-{
- return sizeof (labels) / sizeof (labels[0]);
-}
-
-const char *
-filter_label_label (int i)
-{
- if (i < 0 || i >= sizeof (labels) / sizeof (labels[0]))
- return NULL;
- else
- return labels[i].value;
-}
-
-int
-filter_label_index (const char *label)
-{
- int i;
-
- for (i = 0; i < sizeof (labels) / sizeof (labels[0]); i++) {
- if (strcmp (labels[i].value, label) == 0)
- return i;
- }
-
- return -1;
-}
-
-static void
-xml_create (FilterElement *fe, xmlNodePtr node)
-{
- FilterOption *fo = (FilterOption *) fe;
- GConfClient *gconf;
- GSList *list, *l;
- char *title, *p;
- int i = 0;
-
- FILTER_ELEMENT_CLASS (parent_class)->xml_create (fe, node);
-
- gconf = gconf_client_get_default ();
-
- l = list = gconf_client_get_list (gconf, "/apps/evolution/mail/labels", GCONF_VALUE_STRING, NULL);
- while (l != NULL) {
- title = (char *) l->data;
- if ((p = strrchr (title, ':')))
- *p++ = '\0';
-
- filter_option_add (fo, i < 5 ? labels[i++].value : (p ? p : "#ffffff"), title, NULL);
- g_free (title);
-
- l = l->next;
- }
- g_slist_free (list);
-
- g_object_unref (gconf);
-}
diff --git a/filter/filter-label.h b/filter/filter-label.h
deleted file mode 100644
index 395ce07d48..0000000000
--- a/filter/filter-label.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 2002 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifndef __FILTER_LABEL__
-#define __FILTER_LABEL__
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#include "filter-option.h"
-
-#define FILTER_TYPE_LABEL (filter_label_get_type ())
-#define FILTER_LABEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_LABEL, FilterLabel))
-#define FILTER_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_LABEL, FilterLabelClass))
-#define IS_FILTER_LABEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FILTER_TYPE_LABEL))
-#define IS_FILTER_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FILTER_TYPE_LABEL))
-#define FILTER_LABEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FILTER_TYPE_LABEL, FilterLabelClass))
-
-typedef struct _FilterLabel FilterLabel;
-typedef struct _FilterLabelClass FilterLabelClass;
-
-struct _FilterLabel {
- FilterOption parent_object;
-
-};
-
-struct _FilterLabelClass {
- FilterOptionClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-GType filter_label_get_type (void);
-
-FilterLabel *filter_label_new (void);
-
-/* Sigh, this is a mess, but its cleaner than the original mess */
-int filter_label_count(void);
-const char *filter_label_label(int i);
-int filter_label_index(const char *label);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __FILTER_LABEL__ */
diff --git a/filter/filter-marshal.list b/filter/filter-marshal.list
deleted file mode 100644
index 9d6744db44..0000000000
--- a/filter/filter-marshal.list
+++ /dev/null
@@ -1,2 +0,0 @@
-NONE:NONE
-NONE:POINTER
diff --git a/filter/filter-option.c b/filter/filter-option.c
deleted file mode 100644
index c1fe0f4caa..0000000000
--- a/filter/filter-option.c
+++ /dev/null
@@ -1,371 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "filter-option.h"
-#include "filter-part.h"
-#include <libedataserver/e-sexp.h>
-
-#define d(x)
-
-static int option_eq (FilterElement *fe, FilterElement *cm);
-static void xml_create (FilterElement *fe, xmlNodePtr node);
-static xmlNodePtr xml_encode (FilterElement *fe);
-static int xml_decode (FilterElement *fe, xmlNodePtr node);
-static FilterElement *clone (FilterElement *fe);
-static GtkWidget *get_widget (FilterElement *fe);
-static void build_code (FilterElement *fe, GString *out, struct _FilterPart *ff);
-static void format_sexp (FilterElement *, GString *);
-
-static void filter_option_class_init (FilterOptionClass *klass);
-static void filter_option_init (FilterOption *fo);
-static void filter_option_finalise (GObject *obj);
-
-
-static FilterElementClass *parent_class;
-
-
-GType
-filter_option_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (FilterOptionClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) filter_option_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (FilterOption),
- 0, /* n_preallocs */
- (GInstanceInitFunc) filter_option_init,
- };
-
- type = g_type_register_static (FILTER_TYPE_ELEMENT, "FilterOption", &info, 0);
- }
-
- return type;
-}
-
-static void
-filter_option_class_init (FilterOptionClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- FilterElementClass *fe_class = FILTER_ELEMENT_CLASS (klass);
-
- parent_class = g_type_class_ref (FILTER_TYPE_ELEMENT);
-
- object_class->finalize = filter_option_finalise;
-
- /* override methods */
- fe_class->eq = option_eq;
- fe_class->xml_create = xml_create;
- fe_class->xml_encode = xml_encode;
- fe_class->xml_decode = xml_decode;
- fe_class->clone = clone;
- fe_class->get_widget = get_widget;
- fe_class->build_code = build_code;
- fe_class->format_sexp = format_sexp;
-}
-
-static void
-filter_option_init (FilterOption *fo)
-{
- fo->type = "option";
-}
-
-static void
-free_option (struct _filter_option *o, void *data)
-{
- g_free (o->title);
- g_free (o->value);
- g_free (o->code);
- g_free (o);
-}
-
-static void
-filter_option_finalise (GObject *obj)
-{
- FilterOption *fo = (FilterOption *) obj;
-
- g_list_foreach (fo->options, (GFunc)free_option, NULL);
- g_list_free (fo->options);
-
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * filter_option_new:
- *
- * Create a new FilterOption object.
- *
- * Return value: A new #FilterOption object.
- **/
-FilterOption *
-filter_option_new (void)
-{
- return (FilterOption *) g_object_new (FILTER_TYPE_OPTION, NULL, NULL);
-}
-
-static struct _filter_option *
-find_option (FilterOption *fo, const char *name)
-{
- GList *l = fo->options;
- struct _filter_option *op;
-
- while (l) {
- op = l->data;
- if (!strcmp (name, op->value)) {
- return op;
- }
- l = g_list_next (l);
- }
-
- return NULL;
-}
-
-void
-filter_option_set_current (FilterOption *option, const char *name)
-{
- g_assert(IS_FILTER_OPTION(option));
-
- option->current = find_option (option, name);
-}
-
-/* used by implementers to add additional options */
-struct _filter_option *
-filter_option_add(FilterOption *fo, const char *value, const char *title, const char *code)
-{
- struct _filter_option *op;
-
- g_assert(IS_FILTER_OPTION(fo));
- g_return_val_if_fail(find_option(fo, value) == NULL, NULL);
-
- op = g_malloc(sizeof(*op));
- op->title = g_strdup(title);
- op->value = g_strdup(value);
- op->code = g_strdup(code);
-
- fo->options = g_list_append(fo->options, op);
- if (fo->current == NULL)
- fo->current = op;
-
- return op;
-}
-
-static int
-option_eq(FilterElement *fe, FilterElement *cm)
-{
- FilterOption *fo = (FilterOption *)fe, *co = (FilterOption *)cm;
-
- return FILTER_ELEMENT_CLASS (parent_class)->eq (fe, cm)
- && ((fo->current && co->current && strcmp(fo->current->value, co->current->value) == 0)
- || (fo->current == NULL && co->current == NULL));
-}
-
-static void
-xml_create (FilterElement *fe, xmlNodePtr node)
-{
- FilterOption *fo = (FilterOption *)fe;
- xmlNodePtr n, work;
-
- /* parent implementation */
- FILTER_ELEMENT_CLASS (parent_class)->xml_create (fe, node);
-
- n = node->children;
- while (n) {
- if (!strcmp (n->name, "option")) {
- char *tmp, *value, *title = NULL, *code = NULL;
-
- value = xmlGetProp (n, "value");
- work = n->children;
- while (work) {
- if (!strcmp (work->name, "title")) {
- if (!title) {
- if (!(tmp = xmlNodeGetContent (work)))
- tmp = xmlStrdup ("");
-
- title = g_strdup (tmp);
- xmlFree (tmp);
- }
- } else if (!strcmp (work->name, "code")) {
- if (!code) {
- if (!(tmp = xmlNodeGetContent (work)))
- tmp = xmlStrdup ("");
-
- code = g_strdup (tmp);
- xmlFree (tmp);
- }
- }
- work = work->next;
- }
-
- filter_option_add (fo, value, title, code);
- xmlFree (value);
- g_free (title);
- g_free (code);
- } else if (n->type == XML_ELEMENT_NODE) {
- g_warning ("Unknown xml node within optionlist: %s\n", n->name);
- }
- n = n->next;
- }
-}
-
-static xmlNodePtr
-xml_encode (FilterElement *fe)
-{
- xmlNodePtr value;
- FilterOption *fo = (FilterOption *)fe;
-
- d(printf ("Encoding option as xml\n"));
- value = xmlNewNode (NULL, "value");
- xmlSetProp (value, "name", fe->name);
- xmlSetProp (value, "type", fo->type);
- if (fo->current)
- xmlSetProp (value, "value", fo->current->value);
-
- return value;
-}
-
-static int
-xml_decode (FilterElement *fe, xmlNodePtr node)
-{
- FilterOption *fo = (FilterOption *)fe;
- char *value;
-
- d(printf ("Decoding option from xml\n"));
- xmlFree (fe->name);
- fe->name = xmlGetProp (node, "name");
- value = xmlGetProp (node, "value");
- if (value) {
- fo->current = find_option (fo, value);
- xmlFree (value);
- } else {
- fo->current = NULL;
- }
- return 0;
-}
-
-static void
-option_changed (GtkWidget *widget, FilterElement *fe)
-{
- FilterOption *fo = (FilterOption *)fe;
-
- fo->current = g_object_get_data ((GObject *) widget, "option");
-}
-
-static GtkWidget *
-get_widget (FilterElement *fe)
-{
- FilterOption *fo = (FilterOption *)fe;
- GtkWidget *menu;
- GtkWidget *omenu;
- GtkWidget *item;
- GtkWidget *first = NULL;
- GList *l = fo->options;
- struct _filter_option *op;
- int index = 0, current = 0;
-
- menu = gtk_menu_new ();
- while (l) {
- op = l->data;
- item = gtk_menu_item_new_with_label (_(op->title));
- g_object_set_data ((GObject *) item, "option", op);
- g_signal_connect (item, "activate", G_CALLBACK (option_changed), fe);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
- gtk_widget_show (item);
- if (op == fo->current) {
- current = index;
- first = item;
- } else if (!first) {
- first = item;
- }
-
- l = g_list_next (l);
- index++;
- }
-
- omenu = gtk_option_menu_new ();
- gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
-
- if (first)
- g_signal_emit_by_name (first, "activate", fe);
-
- gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), current);
-
- return omenu;
-}
-
-static void
-build_code (FilterElement *fe, GString *out, struct _FilterPart *ff)
-{
- FilterOption *fo = (FilterOption *)fe;
-
- d(printf ("building option code %p, current = %p\n", fo, fo->current));
-
- if (fo->current && fo->current->code)
- filter_part_expand_code (ff, fo->current->code, out);
-}
-
-static void
-format_sexp (FilterElement *fe, GString *out)
-{
- FilterOption *fo = (FilterOption *)fe;
-
- if (fo->current)
- e_sexp_encode_string (out, fo->current->value);
-}
-
-static FilterElement *
-clone (FilterElement *fe)
-{
- FilterOption *fo = (FilterOption *)fe, *new;
- GList *l;
- struct _filter_option *op, *newop;
-
- d(printf ("cloning option\n"));
-
- new = FILTER_OPTION (FILTER_ELEMENT_CLASS (parent_class)->clone (fe));
- l = fo->options;
- while (l) {
- op = l->data;
- newop = filter_option_add (new, op->value, op->title, op->code);
- if (fo->current == op)
- new->current = newop;
- l = l->next;
- }
-
- d(printf ("cloning option code %p, current = %p\n", new, new->current));
-
- return (FilterElement *) new;
-}
diff --git a/filter/filter-option.h b/filter/filter-option.h
deleted file mode 100644
index 50c132f775..0000000000
--- a/filter/filter-option.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef _FILTER_OPTION_H
-#define _FILTER_OPTION_H
-
-#include "filter-element.h"
-
-#define FILTER_TYPE_OPTION (filter_option_get_type ())
-#define FILTER_OPTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_OPTION, FilterOption))
-#define FILTER_OPTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_OPTION, FilterOptionClass))
-#define IS_FILTER_OPTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FILTER_TYPE_OPTION))
-#define IS_FILTER_OPTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FILTER_TYPE_OPTION))
-#define FILTER_OPTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FILTER_TYPE_OPTION, FilterOptionClass))
-
-typedef struct _FilterOption FilterOption;
-typedef struct _FilterOptionClass FilterOptionClass;
-
-struct _filter_option {
- char *title; /* button title */
- char *value; /* value, if it has one */
- char *code; /* used to string code segments together */
-};
-
-struct _FilterOption {
- FilterElement parent_object;
-
- const char *type; /* static memory, type name written to xml */
-
- GList *options;
- struct _filter_option *current;
-};
-
-struct _FilterOptionClass {
- FilterElementClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-GType filter_option_get_type (void);
-FilterOption *filter_option_new (void);
-
-/* methods */
-void filter_option_set_current (FilterOption *option, const char *name);
-struct _filter_option *filter_option_add (FilterOption *fo, const char *name, const char *title, const char *code);
-
-#endif /* ! _FILTER_OPTION_H */
diff --git a/filter/filter-part.c b/filter/filter-part.c
deleted file mode 100644
index d09381ae9d..0000000000
--- a/filter/filter-part.c
+++ /dev/null
@@ -1,545 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <gtk/gtkbox.h>
-#include <gtk/gtkhbox.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "filter-part.h"
-#include "rule-context.h"
-
-#define d(x)
-
-static void filter_part_class_init (FilterPartClass *klass);
-static void filter_part_init (FilterPart *fp);
-static void filter_part_finalise (GObject *obj);
-
-
-static GObjectClass *parent_class = NULL;
-
-
-GType
-filter_part_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (FilterPartClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) filter_part_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (FilterPart),
- 0, /* n_preallocs */
- (GInstanceInitFunc) filter_part_init,
- };
-
- type = g_type_register_static (G_TYPE_OBJECT, "FilterPart", &info, 0);
- }
-
- return type;
-}
-
-static void
-filter_part_class_init (FilterPartClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_ref (G_TYPE_OBJECT);
-
- object_class->finalize = filter_part_finalise;
-}
-
-static void
-filter_part_init (FilterPart *fp)
-{
- ;
-}
-
-static void
-filter_part_finalise (GObject *obj)
-{
- FilterPart *fp = (FilterPart *) obj;
- GList *l;
-
- l = fp->elements;
- while (l) {
- g_object_unref (l->data);
- l = l->next;
- }
-
- g_list_free (fp->elements);
- g_free (fp->name);
- g_free (fp->title);
- g_free (fp->code);
-
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * filter_part_new:
- *
- * Create a new FilterPart object.
- *
- * Return value: A new #FilterPart object.
- **/
-FilterPart *
-filter_part_new (void)
-{
- return (FilterPart *) g_object_new (FILTER_TYPE_PART, NULL, NULL);
-}
-
-gboolean
-filter_part_validate (FilterPart *fp)
-{
- gboolean correct = TRUE;
- GList *l;
-
- l = fp->elements;
- while (l && correct) {
- FilterElement *fe = l->data;
-
- correct = filter_element_validate (fe);
-
- l = l->next;
- }
-
- return correct;
-}
-
-int
-filter_part_eq (FilterPart *fp, FilterPart *fc)
-{
- int truth;
- GList *al, *bl;
-
- truth = ((fp->name && fc->name && strcmp(fp->name, fc->name) == 0)
- || (fp->name == NULL && fc->name == NULL))
- && ((fp->title && fc->title && strcmp(fp->title, fc->title) == 0)
- || (fp->title == NULL && fc->title == NULL))
- && ((fp->code && fc->code && strcmp(fp->code, fc->code) == 0)
- || (fp->code == NULL && fc->code == NULL));
-
- al = fp->elements;
- bl = fc->elements;
- while (truth && al && bl) {
- FilterElement *a = al->data, *b = bl->data;
-
- truth = filter_element_eq(a, b);
-
- al = al->next;
- bl = bl->next;
- }
-
- return truth && al == NULL && bl == NULL;
-}
-
-int
-filter_part_xml_create (FilterPart *ff, xmlNodePtr node, RuleContext *rc)
-{
- xmlNodePtr n;
- char *type, *str;
- FilterElement *el;
-
- str = xmlGetProp (node, "name");
- ff->name = g_strdup (str);
- if (str)
- xmlFree (str);
-
- n = node->children;
- while (n) {
- if (!strcmp (n->name, "input")) {
- type = xmlGetProp (n, "type");
- d(printf ("creating new element type input '%s'\n", type));
- if (type != NULL
- && (el = rule_context_new_element(rc, type)) != NULL) {
- filter_element_xml_create (el, n);
- xmlFree (type);
- d(printf ("adding element part %p %s\n", ff, el, el->name));
- ff->elements = g_list_append (ff->elements, el);
- } else {
- g_warning ("Invalid xml format, missing/unknown input type");
- }
- } else if (!strcmp (n->name, "title")) {
- if (!ff->title) {
- str = xmlNodeGetContent (n);
- ff->title = g_strdup (str);
- if (str)
- xmlFree (str);
- }
- } else if (!strcmp (n->name, "code")) {
- if (!ff->code) {
- str = xmlNodeGetContent (n);
- ff->code = g_strdup (str);
- if (str)
- xmlFree (str);
- }
- } else if (n->type == XML_ELEMENT_NODE) {
- g_warning ("Unknown part element in xml: %s\n", n->name);
- }
- n = n->next;
- }
-
- return 0;
-}
-
-xmlNodePtr
-filter_part_xml_encode (FilterPart *fp)
-{
- GList *l;
- FilterElement *fe;
- xmlNodePtr part, value;
-
- g_return_val_if_fail (fp != NULL, NULL);
-
- part = xmlNewNode (NULL, "part");
- xmlSetProp (part, "name", fp->name);
- l = fp->elements;
- while (l) {
- fe = l->data;
- value = filter_element_xml_encode (fe);
- xmlAddChild (part, value);
- l = g_list_next (l);
- }
-
- return part;
-}
-
-
-int
-filter_part_xml_decode (FilterPart *fp, xmlNodePtr node)
-{
- FilterElement *fe;
- xmlNodePtr n;
- char *name;
-
- g_return_val_if_fail (fp != NULL, -1);
- g_return_val_if_fail (node != NULL, -1);
-
- n = node->children;
- while (n) {
- if (!strcmp (n->name, "value")) {
- name = xmlGetProp (n, "name");
- d(printf ("finding element part %p %s = %p\n", name, name, fe));
- fe = filter_part_find_element (fp, name);
- d(printf ("finding element part %p %s = %p\n", name, name, fe));
- xmlFree (name);
- if (fe)
- filter_element_xml_decode (fe, n);
- }
- n = n->next;
- }
-
- return 0;
-}
-
-FilterPart *
-filter_part_clone (FilterPart *fp)
-{
- FilterPart *new;
- GList *l;
- FilterElement *fe, *ne;
-
- new = (FilterPart *) g_object_new (G_OBJECT_TYPE (fp), NULL, NULL);
- new->name = g_strdup (fp->name);
- new->title = g_strdup (fp->title);
- new->code = g_strdup (fp->code);
- l = fp->elements;
- while (l) {
- fe = l->data;
- ne = filter_element_clone (fe);
- new->elements = g_list_append (new->elements, ne);
- l = g_list_next (l);
- }
-
- return new;
-}
-
-/* only copies values of matching parts in the right order */
-void
-filter_part_copy_values (FilterPart *dst, FilterPart *src)
-{
- GList *dstl, *srcl, *dstt;
- FilterElement *de, *se;
-
- /* NOTE: we go backwards, it just works better that way */
-
- /* for each source type, search the dest type for
- a matching type in the same order */
- srcl = g_list_last (src->elements);
- dstl = g_list_last (dst->elements);
- while (srcl && dstl) {
- se = srcl->data;
- dstt = dstl;
- while (dstt) {
- de = dstt->data;
- if (FILTER_PART_GET_CLASS (de) == FILTER_PART_GET_CLASS (se)) {
- filter_element_copy_value (de, se);
- dstl = dstt->prev;
- break;
- }
- dstt = dstt->prev;
- }
-
- srcl = srcl->prev;
- }
-}
-
-FilterElement *
-filter_part_find_element (FilterPart *ff, const char *name)
-{
- GList *l = ff->elements;
- FilterElement *fe;
-
- if (name == NULL)
- return NULL;
-
- while (l) {
- fe = l->data;
- if (fe->name && !strcmp (fe->name, name))
- return fe;
- l = g_list_next (l);
- }
-
- return NULL;
-}
-
-
-GtkWidget *
-filter_part_get_widget (FilterPart *ff)
-{
- GtkWidget *hbox;
- GList *l = ff->elements;
- FilterElement *fe;
- GtkWidget *w;
-
- hbox = gtk_hbox_new (FALSE, 3);
-
- while (l) {
- fe = l->data;
- w = filter_element_get_widget (fe);
- if (w)
- gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 3);
-
- l = g_list_next (l);
- }
-
- gtk_widget_show_all (hbox);
-
- return hbox;
-}
-
-/**
- * filter_part_build_code:
- * @ff:
- * @out:
- *
- * Outputs the code of a part.
- **/
-void
-filter_part_build_code (FilterPart *ff, GString *out)
-{
- GList *l = ff->elements;
- FilterElement *fe;
-
- if (ff->code)
- filter_part_expand_code (ff, ff->code, out);
-
- while (l) {
- fe = l->data;
- filter_element_build_code (fe, out, ff);
- l = l->next;
- }
-}
-
-/**
- * filter_part_build_code_list:
- * @l:
- * @out:
- *
- * Construct a list of the filter parts code into
- * a single string.
- **/
-void
-filter_part_build_code_list (GList *l, GString *out)
-{
- FilterPart *fp;
-
- while (l) {
- fp = l->data;
- filter_part_build_code (fp, out);
- g_string_append (out, "\n ");
- l = l->next;
- }
-}
-
-/**
- * filter_part_find_list:
- * @l:
- * @name:
- *
- * Find a filter part stored in a list.
- *
- * Return value:
- **/
-FilterPart *
-filter_part_find_list (GList *l, const char *name)
-{
- FilterPart *part;
-
- d(printf ("Find part named %s\n", name));
-
- while (l) {
- part = l->data;
- if (!strcmp (part->name, name)) {
- d(printf ("Found!\n"));
- return part;
- }
- l = l->next;
- }
-
- return NULL;
-}
-
-/**
- * filter_part_next_list:
- * @l:
- * @last: The last item retrieved, or NULL to start
- * from the beginning of the list.
- *
- * Iterate through a filter part list.
- *
- * Return value: The next value in the list, or NULL if the
- * list is expired.
- **/
-FilterPart *
-filter_part_next_list (GList *l, FilterPart *last)
-{
- GList *node = l;
-
- if (last != NULL) {
- node = g_list_find (node, last);
- if (node == NULL)
- node = l;
- else
- node = node->next;
- }
-
- if (node)
- return node->data;
-
- return NULL;
-}
-
-/**
- * filter_part_expand_code:
- * @ff:
- * @str:
- * @out:
- *
- * Expands the variables in string @str based on the values of the part.
- **/
-void
-filter_part_expand_code (FilterPart *ff, const char *source, GString *out)
-{
- const char *newstart, *start, *end;
- char *name = alloca (32);
- int len, namelen = 32;
- FilterElement *fe;
-
- start = source;
- while (start && (newstart = strstr (start, "${"))
- && (end = strstr (newstart+2, "}")) ) {
- len = end - newstart - 2;
- if (len + 1 > namelen) {
- namelen = (len + 1) * 2;
- name = g_alloca (namelen);
- }
- memcpy (name, newstart+2, len);
- name[len] = 0;
- fe = filter_part_find_element (ff, name);
- d(printf("expand code: looking up variab le '%s' = %p\n", ff, name, fe));
- if (fe) {
- g_string_append_printf (out, "%.*s", (int)(newstart-start), start);
- filter_element_format_sexp (fe, out);
-#if 0
- } else if ((val = g_hash_table_lookup (ff->globals, name))) {
- g_string_append_printf (out, "%.*s", newstart-start, start);
- e_sexp_encode_string (out, val);
-#endif
- } else {
- g_string_append_printf (out, "%.*s", (int)(end-start+1), start);
- }
- start = end + 1;
- }
- g_string_append (out, start);
-}
-
-#if 0
-int main(int argc, char **argv)
-{
- GtkWidget *dialog, *w;
- xmlDocPtr system;
- xmlNodePtr node;
- FilterPart *ff;
- GString *code;
-
- gnome_init ("test", "0.0", argc, argv);
-
- system = xmlParseFile ("form.xml");
- if (system == NULL) {
- printf("i/o error\n");
- return 1;
- }
-
- ff = filter_part_new ();
- filter_part_xml_create (ff, system->root);
-
- w = filter_part_get_widget (ff);
-
- dialog = gtk_dialog_new ();
- gtk_dialog_add_buttons ((GtkDialog *) dialog, GTK_BUTTONS_OK, NULL);
- gtk_dialog_set_has_separator ((GtkDialog *) dialog, FALSE);
- gtk_window_set_title ((GtkWindow *) dialog, _("Test"));
- gtk_window_set_policy ((GtkWindow *) dialog, FALSE, TRUE, FALSE);
- gtk_box_pack_start ((GtkBox *) dialog->vbox, w, TRUE, TRUE, 0);
-
- gtk_dialog_run ((GtkDialog *) dialog);
- gtk_widget_destroy (dialog);
-
- code = g_string_new ("");
- filter_part_build_code (ff, code);
- printf("code is:\n%s\n", code->str);
-
- return 0;
-}
-#endif
diff --git a/filter/filter-part.h b/filter/filter-part.h
deleted file mode 100644
index 1c7aa7dbb7..0000000000
--- a/filter/filter-part.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef _FILTER_PART_H
-#define _FILTER_PART_H
-
-#include <glib.h>
-#include <glib-object.h>
-
-#include "filter-input.h"
-
-struct _RuleContext;
-
-#define FILTER_TYPE_PART (filter_part_get_type ())
-#define FILTER_PART(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_PART, FilterPart))
-#define FILTER_PART_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_PART, FilterPartClass))
-#define IS_FILTER_PART(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FILTER_TYPE_PART))
-#define IS_FILTER_PART_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FILTER_TYPE_PART))
-#define FILTER_PART_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FILTER_TYPE_PART, FilterElementClass))
-
-typedef struct _FilterPart FilterPart;
-typedef struct _FilterPartClass FilterPartClass;
-
-struct _FilterPart {
- GObject parent_object;
- struct _FilterPartPrivate *priv;
-
- char *name;
- char *title;
- char *code;
- GList *elements;
-};
-
-struct _FilterPartClass {
- GObjectClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-GType filter_part_get_type (void);
-FilterPart *filter_part_new (void);
-
-/* methods */
-gboolean filter_part_validate (FilterPart *fp);
-int filter_part_eq (FilterPart *fp, FilterPart *fc);
-
-int filter_part_xml_create (FilterPart *ff, xmlNodePtr node, struct _RuleContext *rc);
-
-xmlNodePtr filter_part_xml_encode (FilterPart *fe);
-int filter_part_xml_decode (FilterPart *fe, xmlNodePtr node);
-
-FilterPart *filter_part_clone (FilterPart *fp);
-void filter_part_copy_values (FilterPart *dfp, FilterPart *sfp);
-
-FilterElement *filter_part_find_element (FilterPart *ff, const char *name);
-
-GtkWidget *filter_part_get_widget (FilterPart *ff);
-void filter_part_build_code (FilterPart *ff, GString *out);
-void filter_part_expand_code (FilterPart *ff, const char *str, GString *out);
-
-/* static functions */
-void filter_part_build_code_list (GList *l, GString *out);
-FilterPart *filter_part_find_list (GList *l, const char *name);
-FilterPart *filter_part_next_list (GList *l, FilterPart *last);
-
-#endif /* ! _FILTER_PART_H */
diff --git a/filter/filter-rule.c b/filter/filter-rule.c
deleted file mode 100644
index 58d4a44267..0000000000
--- a/filter/filter-rule.c
+++ /dev/null
@@ -1,977 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "widgets/misc/e-error.h"
-#include "filter-rule.h"
-#include "rule-context.h"
-#include "filter-marshal.h"
-
-#define d(x)
-
-static int validate(FilterRule *);
-static int rule_eq(FilterRule *fr, FilterRule *cm);
-static xmlNodePtr xml_encode (FilterRule *);
-static int xml_decode (FilterRule *, xmlNodePtr, RuleContext *);
-static void build_code (FilterRule *, GString * out);
-static void rule_copy (FilterRule *dest, FilterRule *src);
-static GtkWidget *get_widget (FilterRule * fr, struct _RuleContext *f);
-
-static void filter_rule_class_init (FilterRuleClass *klass);
-static void filter_rule_init (FilterRule *fr);
-static void filter_rule_finalise (GObject *obj);
-
-#define _PRIVATE(x) (((FilterRule *)(x))->priv)
-
-struct _FilterRulePrivate {
- int frozen;
-};
-
-static GObjectClass *parent_class = NULL;
-
-enum {
- CHANGED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-GType
-filter_rule_get_type ()
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (FilterRuleClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) filter_rule_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (FilterRule),
- 0, /* n_preallocs */
- (GInstanceInitFunc) filter_rule_init,
- };
-
- type = g_type_register_static (G_TYPE_OBJECT, "FilterRule", &info, 0);
- }
-
- return type;
-}
-
-static void
-filter_rule_class_init (FilterRuleClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_ref (G_TYPE_OBJECT);
-
- object_class->finalize = filter_rule_finalise;
-
- /* override methods */
- klass->validate = validate;
- klass->eq = rule_eq;
- klass->xml_encode = xml_encode;
- klass->xml_decode = xml_decode;
- klass->build_code = build_code;
- klass->copy = rule_copy;
- klass->get_widget = get_widget;
-
- /* signals */
- signals[CHANGED] =
- g_signal_new ("changed",
- FILTER_TYPE_RULE,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (FilterRuleClass, changed),
- NULL,
- NULL,
- filter_marshal_NONE__NONE,
- G_TYPE_NONE, 0);
-}
-
-static void
-filter_rule_init (FilterRule *fr)
-{
- fr->priv = g_malloc0 (sizeof (*fr->priv));
-}
-
-static void
-filter_rule_finalise (GObject *obj)
-{
- FilterRule *fr = (FilterRule *) obj;
-
- g_free (fr->name);
- g_free (fr->source);
- g_list_foreach (fr->parts, (GFunc)g_object_unref, NULL);
- g_list_free (fr->parts);
-
- g_free (fr->priv);
-
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * filter_rule_new:
- *
- * Create a new FilterRule object.
- *
- * Return value: A new #FilterRule object.
- **/
-FilterRule *
-filter_rule_new ()
-{
- return (FilterRule *) g_object_new (FILTER_TYPE_RULE, NULL, NULL);
-}
-
-FilterRule *
-filter_rule_clone (FilterRule *base)
-{
- FilterRule *rule;
-
- g_assert (IS_FILTER_RULE (base));
-
- rule = g_object_new (G_OBJECT_TYPE (base), NULL, NULL);
- filter_rule_copy (rule, base);
-
- return rule;
-}
-
-void
-filter_rule_set_name (FilterRule *fr, const char *name)
-{
- g_assert (IS_FILTER_RULE (fr));
-
- if ((fr->name && name && strcmp (fr->name, name) == 0)
- || (fr->name == NULL && name == NULL))
- return;
-
- g_free (fr->name);
- fr->name = g_strdup (name);
-
- filter_rule_emit_changed (fr);
-}
-
-void
-filter_rule_set_source (FilterRule *fr, const char *source)
-{
- g_assert (IS_FILTER_RULE (fr));
-
- if ((fr->source && source && strcmp (fr->source, source) == 0)
- || (fr->source == NULL && source == NULL))
- return;
-
- g_free (fr->source);
- fr->source = g_strdup (source);
-
- filter_rule_emit_changed (fr);
-}
-
-int
-filter_rule_validate (FilterRule *fr)
-{
- g_assert (IS_FILTER_RULE (fr));
-
- return FILTER_RULE_GET_CLASS (fr)->validate (fr);
-}
-
-static int
-validate (FilterRule *fr)
-{
- int valid = TRUE;
- GList *parts;
-
- if (!fr->name || !*fr->name) {
- /* FIXME: FilterElement should probably have a
- GtkWidget member pointing to the value gotten with
- ::get_widget() so that we can get the parent window
- here. */
- e_error_run(NULL, "filter:no-name", NULL);
-
- return FALSE;
- }
-
- /* validate rule parts */
- parts = fr->parts;
- while (parts && valid) {
- valid = filter_part_validate ((FilterPart *) parts->data);
- parts = parts->next;
- }
-
- return valid;
-}
-
-int
-filter_rule_eq (FilterRule *fr, FilterRule *cm)
-{
- g_assert (IS_FILTER_RULE (fr));
- g_assert (IS_FILTER_RULE (cm));
-
- return (FILTER_RULE_GET_CLASS (fr) == FILTER_RULE_GET_CLASS (cm))
- && FILTER_RULE_GET_CLASS (fr)->eq (fr, cm);
-}
-
-static int
-list_eq(GList *al, GList *bl)
-{
- int truth = TRUE;
-
- while (truth && al && bl) {
- FilterPart *a = al->data, *b = bl->data;
-
- truth = filter_part_eq (a, b);
- al = al->next;
- bl = bl->next;
- }
-
- return truth && al == NULL && bl == NULL;
-}
-
-static int
-rule_eq (FilterRule *fr, FilterRule *cm)
-{
- return fr->grouping == cm->grouping
- && fr->threading == fr->threading
- && ((fr->name && cm->name && strcmp (fr->name, cm->name) == 0)
- || (fr->name == NULL && cm->name == NULL))
- && ((fr->source && cm->source && strcmp (fr->source, cm->source) == 0)
- || (fr->source == NULL && cm->source == NULL) )
- && list_eq (fr->parts, cm->parts);
-}
-
-xmlNodePtr
-filter_rule_xml_encode (FilterRule *fr)
-{
- g_assert (IS_FILTER_RULE (fr));
-
- return FILTER_RULE_GET_CLASS (fr)->xml_encode (fr);
-}
-
-static xmlNodePtr
-xml_encode (FilterRule *fr)
-{
- xmlNodePtr node, set, work;
- GList *l;
-
- node = xmlNewNode (NULL, "rule");
- switch (fr->grouping) {
- case FILTER_GROUP_ALL:
- xmlSetProp (node, "grouping", "all");
- break;
- case FILTER_GROUP_ANY:
- xmlSetProp (node, "grouping", "any");
- break;
- }
-
- switch (fr->threading) {
- case FILTER_THREAD_NONE:
- break;
- case FILTER_THREAD_ALL:
- xmlSetProp(node, "threading", "all");
- break;
- case FILTER_THREAD_REPLIES:
- xmlSetProp(node, "threading", "replies");
- break;
- case FILTER_THREAD_REPLIES_PARENTS:
- xmlSetProp(node, "threading", "replies_parents");
- break;
- }
-
- if (fr->source) {
- xmlSetProp (node, "source", fr->source);
- } else {
- /* set to the default filter type */
- xmlSetProp (node, "source", "incoming");
- }
-
- if (fr->name) {
- work = xmlNewNode (NULL, "title");
- xmlNodeSetContent (work, fr->name);
- xmlAddChild (node, work);
- }
-
- set = xmlNewNode (NULL, "partset");
- xmlAddChild (node, set);
- l = fr->parts;
- while (l) {
- work = filter_part_xml_encode ((FilterPart *) l->data);
- xmlAddChild (set, work);
- l = l->next;
- }
-
- return node;
-}
-
-static void
-load_set (xmlNodePtr node, FilterRule *fr, RuleContext *f)
-{
- xmlNodePtr work;
- char *rulename;
- FilterPart *part;
-
- work = node->children;
- while (work) {
- if (!strcmp (work->name, "part")) {
- rulename = xmlGetProp (work, "name");
- part = rule_context_find_part (f, rulename);
- if (part) {
- part = filter_part_clone (part);
- filter_part_xml_decode (part, work);
- filter_rule_add_part (fr, part);
- } else {
- g_warning ("cannot find rule part '%s'\n", rulename);
- }
- xmlFree (rulename);
- } else if (work->type == XML_ELEMENT_NODE) {
- g_warning ("Unknown xml node in part: %s", work->name);
- }
- work = work->next;
- }
-}
-
-int
-filter_rule_xml_decode (FilterRule *fr, xmlNodePtr node, RuleContext *f)
-{
- int res;
-
- g_assert (IS_FILTER_RULE (fr));
- g_assert (IS_RULE_CONTEXT (f));
- g_assert (node != NULL);
-
- fr->priv->frozen++;
- res = FILTER_RULE_GET_CLASS (fr)->xml_decode (fr, node, f);
- fr->priv->frozen--;
-
- filter_rule_emit_changed (fr);
-
- return res;
-}
-
-static int
-xml_decode (FilterRule *fr, xmlNodePtr node, RuleContext *f)
-{
- xmlNodePtr work;
- char *grouping;
- char *source;
-
- if (fr->name) {
- g_free (fr->name);
- fr->name = NULL;
- }
-
- grouping = xmlGetProp (node, "grouping");
- if (!strcmp (grouping, "any"))
- fr->grouping = FILTER_GROUP_ANY;
- else
- fr->grouping = FILTER_GROUP_ALL;
- xmlFree (grouping);
-
- fr->threading = FILTER_THREAD_NONE;
- if (f->flags & RULE_CONTEXT_THREADING
- && (grouping = xmlGetProp (node, "threading"))) {
- if (!strcmp(grouping, "all"))
- fr->threading = FILTER_THREAD_ALL;
- else if (!strcmp(grouping, "replies"))
- fr->threading = FILTER_THREAD_REPLIES;
- else if (!strcmp(grouping, "replies_parents"))
- fr->threading = FILTER_THREAD_REPLIES_PARENTS;
- xmlFree (grouping);
- }
-
- g_free (fr->source);
- source = xmlGetProp (node, "source");
- if (source) {
- fr->source = g_strdup (source);
- xmlFree (source);
- } else {
- /* default filter type */
- fr->source = g_strdup ("incoming");
- }
-
- work = node->children;
- while (work) {
- if (!strcmp (work->name, "partset")) {
- load_set (work, fr, f);
- } else if (!strcmp (work->name, "title") || !strcmp (work->name, "_title")) {
- if (!fr->name) {
- char *str, *decstr;
-
- str = xmlNodeGetContent (work);
- decstr = g_strdup (str);
- if (str)
- xmlFree (str);
- fr->name = decstr;
- }
- }
- work = work->next;
- }
-
- return 0;
-}
-
-static void
-rule_copy (FilterRule *dest, FilterRule *src)
-{
- GList *node;
-
- g_free (dest->name);
- dest->name = g_strdup (src->name);
-
- g_free (dest->source);
- dest->source = g_strdup (src->source);
-
- dest->grouping = src->grouping;
- dest->threading = src->threading;
-
- if (dest->parts) {
- g_list_foreach (dest->parts, (GFunc) g_object_unref, NULL);
- g_list_free (dest->parts);
- dest->parts = NULL;
- }
-
- node = src->parts;
- while (node) {
- FilterPart *part;
-
- part = filter_part_clone (node->data);
- dest->parts = g_list_append (dest->parts, part);
- node = node->next;
- }
-}
-
-void
-filter_rule_copy (FilterRule *dest, FilterRule *src)
-{
- g_assert (IS_FILTER_RULE (dest));
- g_assert (IS_FILTER_RULE (src));
-
- FILTER_RULE_GET_CLASS (dest)->copy (dest, src);
-
- filter_rule_emit_changed (dest);
-}
-
-void
-filter_rule_add_part (FilterRule *fr, FilterPart *fp)
-{
- g_assert (IS_FILTER_RULE (fr));
- g_assert (IS_FILTER_PART (fp));
-
- fr->parts = g_list_append (fr->parts, fp);
-
- filter_rule_emit_changed (fr);
-}
-
-void
-filter_rule_remove_part (FilterRule *fr, FilterPart *fp)
-{
- g_assert (IS_FILTER_RULE (fr));
- g_assert (IS_FILTER_PART (fp));
-
- fr->parts = g_list_remove (fr->parts, fp);
-
- filter_rule_emit_changed (fr);
-}
-
-void
-filter_rule_replace_part (FilterRule *fr, FilterPart *fp, FilterPart *new)
-{
- GList *l;
-
- g_assert (IS_FILTER_RULE (fr));
- g_assert (IS_FILTER_PART (fp));
- g_assert (IS_FILTER_PART (new));
-
- l = g_list_find (fr->parts, fp);
- if (l) {
- l->data = new;
- } else {
- fr->parts = g_list_append (fr->parts, new);
- }
-
- filter_rule_emit_changed (fr);
-}
-
-void
-filter_rule_build_code (FilterRule *fr, GString *out)
-{
- g_assert (IS_FILTER_RULE (fr));
- g_assert (out != NULL);
-
- FILTER_RULE_GET_CLASS (fr)->build_code (fr, out);
-
- d(printf ("build_code: [%s](%d)", out->str, out->len));
-}
-
-void
-filter_rule_emit_changed(FilterRule *fr)
-{
- g_assert (IS_FILTER_RULE (fr));
-
- if (fr->priv->frozen == 0)
- g_signal_emit (fr, signals[CHANGED], 0);
-}
-
-static void
-build_code (FilterRule *fr, GString *out)
-{
- switch (fr->threading) {
- case FILTER_THREAD_NONE:
- break;
- case FILTER_THREAD_ALL:
- g_string_append(out, " (match-threads \"all\" ");
- break;
- case FILTER_THREAD_REPLIES:
- g_string_append(out, " (match-threads \"replies\" ");
- break;
- case FILTER_THREAD_REPLIES_PARENTS:
- g_string_append(out, " (match-threads \"replies_parents\" ");
- break;
- }
-
- switch (fr->grouping) {
- case FILTER_GROUP_ALL:
- g_string_append (out, " (and\n ");
- break;
- case FILTER_GROUP_ANY:
- g_string_append (out, " (or\n ");
- break;
- default:
- g_warning ("Invalid grouping");
- }
-
- filter_part_build_code_list (fr->parts, out);
- g_string_append (out, ")\n");
-
- if (fr->threading != FILTER_THREAD_NONE)
- g_string_append (out, ")\n");
-}
-
-static void
-fr_grouping_changed(GtkWidget *w, FilterRule *fr)
-{
- fr->grouping = gtk_option_menu_get_history((GtkOptionMenu *)w);
-}
-
-static void
-fr_threading_changed(GtkWidget *w, FilterRule *fr)
-{
- fr->threading = gtk_option_menu_get_history((GtkOptionMenu *)w);
-}
-
-struct _part_data {
- FilterRule *fr;
- RuleContext *f;
- FilterPart *part;
- GtkWidget *partwidget, *container;
-};
-
-static void
-option_activate (GtkMenuItem *item, struct _part_data *data)
-{
- FilterPart *part = g_object_get_data ((GObject *) item, "part");
- FilterPart *newpart;
-
- /* dont update if we haven't changed */
- if (!strcmp (part->title, data->part->title))
- return;
-
- /* here we do a widget shuffle, throw away the old widget/rulepart,
- and create another */
- if (data->partwidget)
- gtk_container_remove (GTK_CONTAINER (data->container), data->partwidget);
-
- newpart = filter_part_clone (part);
- filter_part_copy_values (newpart, data->part);
- filter_rule_replace_part (data->fr, data->part, newpart);
- g_object_unref (data->part);
- data->part = newpart;
- data->partwidget = filter_part_get_widget (newpart);
- if (data->partwidget)
- gtk_box_pack_start (GTK_BOX (data->container), data->partwidget, FALSE, FALSE, 0);
-
- g_object_set_data ((GObject *) data->container, "part", newpart);
-}
-
-static GtkWidget *
-get_rule_part_widget (RuleContext *f, FilterPart *newpart, FilterRule *fr)
-{
- FilterPart *part = NULL;
- GtkWidget *menu;
- GtkWidget *item;
- GtkWidget *omenu;
- GtkWidget *hbox;
- GtkWidget *p;
- int index = 0, current = 0;
- struct _part_data *data;
-
- data = g_malloc0 (sizeof (*data));
- data->fr = fr;
- data->f = f;
- data->part = newpart;
-
- hbox = gtk_hbox_new (FALSE, 0);
- /* only set to automatically clean up the memory */
- g_object_set_data_full ((GObject *) hbox, "data", data, g_free);
-
- p = filter_part_get_widget (newpart);
-
- data->partwidget = p;
- data->container = hbox;
-
- menu = gtk_menu_new ();
- /* sigh, this is a little ugly */
- while ((part = rule_context_next_part (f, part))) {
- item = gtk_menu_item_new_with_label (_(part->title));
- g_object_set_data ((GObject *) item, "part", part);
- g_signal_connect (item, "activate", G_CALLBACK (option_activate), data);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
- gtk_widget_show (item);
- if (!strcmp (newpart->title, part->title))
- current = index;
-
- index++;
- }
-
- omenu = gtk_option_menu_new ();
- gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
- gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), current);
- gtk_widget_show (omenu);
-
- gtk_box_pack_start (GTK_BOX (hbox), omenu, FALSE, FALSE, 0);
- if (p)
- gtk_box_pack_start (GTK_BOX (hbox), p, FALSE, FALSE, 0);
-
- gtk_widget_show_all (hbox);
-
- return hbox;
-}
-
-struct _rule_data {
- FilterRule *fr;
- RuleContext *f;
- GtkWidget *parts;
-};
-
-static void
-less_parts (GtkWidget *button, struct _rule_data *data)
-{
- FilterPart *part;
- GtkWidget *rule;
-
- if (g_list_length (data->fr->parts) < 2)
- return;
-
- rule = g_object_get_data ((GObject *) button, "rule");
- part = g_object_get_data ((GObject *) rule, "part");
-
- /* remove the part from the list */
- filter_rule_remove_part (data->fr, part);
- g_object_unref (part);
-
- /* and from the display */
- gtk_container_remove (GTK_CONTAINER (data->parts), rule);
- gtk_container_remove (GTK_CONTAINER (data->parts), button);
-}
-
-static void
-attach_rule (GtkWidget *rule, struct _rule_data *data, FilterPart *part, int row)
-{
- GtkWidget *remove;
-
- gtk_table_attach (GTK_TABLE (data->parts), rule, 0, 1, row, row + 1,
- GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
- remove = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
- g_object_set_data ((GObject *) remove, "rule", rule);
- g_object_set_data ((GObject *) rule, "part", part);
- /*gtk_button_set_relief (GTK_BUTTON (remove), GTK_RELIEF_NONE);*/
- g_signal_connect (remove, "clicked", G_CALLBACK (less_parts), data);
- gtk_table_attach (GTK_TABLE (data->parts), remove, 1, 2, row, row + 1,
- 0, 0, 0, 0);
-
- gtk_widget_show (remove);
-}
-
-static void
-more_parts (GtkWidget *button, struct _rule_data *data)
-{
- FilterPart *new;
-
- /* first make sure that the last part is ok */
- if (data->fr->parts) {
- FilterPart *part;
- GList *l;
-
- l = g_list_last (data->fr->parts);
- part = l->data;
- if (!filter_part_validate (part))
- return;
- }
-
- /* create a new rule entry, use the first type of rule */
- new = rule_context_next_part (data->f, NULL);
- if (new) {
- GtkWidget *w;
- int rows;
-
- new = filter_part_clone (new);
- filter_rule_add_part (data->fr, new);
- w = get_rule_part_widget (data->f, new, data->fr);
-
- rows = GTK_TABLE (data->parts)->nrows;
- gtk_table_resize (GTK_TABLE (data->parts), rows + 1, 2);
- attach_rule (w, data, new, rows);
- }
-}
-
-static void
-name_changed (GtkEntry *entry, FilterRule *fr)
-{
- g_free (fr->name);
- fr->name = g_strdup (gtk_entry_get_text (entry));
-}
-
-GtkWidget *
-filter_rule_get_widget (FilterRule *fr, RuleContext *rc)
-{
- return FILTER_RULE_GET_CLASS (fr)->get_widget (fr, rc);
-}
-
-static void
-grab_focus (GtkWidget *entry, gpointer data)
-{
- gtk_widget_grab_focus (entry);
-}
-
-static GtkWidget *
-get_widget (FilterRule *fr, struct _RuleContext *f)
-{
- GtkWidget *hbox, *vbox, *parts, *inframe;
- GtkWidget *add, *label, *name, *w;
- GtkWidget *omenu, *menu, *item;
- GtkWidget *scrolledwindow;
- GtkObject *hadj, *vadj;
- GList *l;
- FilterPart *part;
- struct _rule_data *data;
- int rows, i;
-
- /* this stuff should probably be a table, but the
- rule parts need to be a vbox */
- vbox = gtk_vbox_new (FALSE, 6);
-
- label = gtk_label_new_with_mnemonic (_("_Rule name:"));
- name = gtk_entry_new ();
- gtk_label_set_mnemonic_widget (label, name);
-
- if (!fr->name) {
- fr->name = g_strdup (_("Untitled"));
- gtk_entry_set_text (GTK_ENTRY (name), fr->name);
- /* FIXME: do we want the following code in the future? */
- /*gtk_editable_select_region (GTK_EDITABLE (name), 0, -1);*/
- } else {
- gtk_entry_set_text (GTK_ENTRY (name), fr->name);
- }
-
- /* evil kludgy hack because gtk sucks */
- g_signal_connect (name, "realize", G_CALLBACK (grab_focus), name);
-
- hbox = gtk_hbox_new (FALSE, 12);
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (hbox), name, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
- g_signal_connect (name, "changed", G_CALLBACK (name_changed), fr);
- gtk_widget_show (label);
- gtk_widget_show (hbox);
-
- hbox = gtk_hbox_new (FALSE, 12);
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
- gtk_widget_show (hbox);
-
- label = gtk_label_new (_("<b>If</b>"));
- gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
- gtk_widget_show (label);
-
- hbox = gtk_hbox_new (FALSE, 12);
- gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
- gtk_widget_show (hbox);
-
- label = gtk_label_new ("");
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
- gtk_widget_show (label);
-
- inframe = gtk_vbox_new (FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hbox), inframe, TRUE, TRUE, 0);
-
- /* this is the parts table, it should probably be inside a scrolling list */
- rows = g_list_length (fr->parts);
- parts = gtk_table_new (rows, 2, FALSE);
-
- /* data for the parts part of the display */
- data = g_malloc0 (sizeof (*data));
- data->f = f;
- data->fr = fr;
- data->parts = parts;
-
- /* only set to automatically clean up the memory */
- g_object_set_data_full ((GObject *) vbox, "data", data, g_free);
-
- hbox = gtk_hbox_new (FALSE, 3);
-
- add = gtk_button_new_from_stock (GTK_STOCK_ADD);
- g_signal_connect (add, "clicked", G_CALLBACK (more_parts), data);
- gtk_box_pack_start (GTK_BOX (hbox), add, FALSE, FALSE, 0);
-
- if (f->flags & RULE_CONTEXT_GROUPING) {
- const char *thread_types[] = { N_("if all criteria are met"), N_("if any criteria are met") };
-
- label = gtk_label_new (_("Execute actions"));
- menu = gtk_menu_new ();
-
- for (i=0;i<2;i++) {
- item = gtk_menu_item_new_with_label(_(thread_types[i]));
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
- }
-
- omenu = gtk_option_menu_new ();
- gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
- gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), fr->grouping);
- gtk_widget_show (omenu);
-
- gtk_box_pack_end (GTK_BOX (hbox), omenu, FALSE, FALSE, 0);
- gtk_box_pack_end (GTK_BOX (hbox), label, FALSE, FALSE, 0);
-
- g_signal_connect(omenu, "changed", G_CALLBACK(fr_grouping_changed), fr);
- }
-
- if (f->flags & RULE_CONTEXT_THREADING) {
- const char *thread_types[] = { N_("None"), N_("All related"), N_("Replies"), N_("Replies and parents") };
-
- label = gtk_label_new (_("Include threads"));
- menu = gtk_menu_new ();
-
- for (i=0;i<4;i++) {
- item = gtk_menu_item_new_with_label(_(thread_types[i]));
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
- }
-
- omenu = gtk_option_menu_new ();
- gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
- gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), fr->threading);
- gtk_widget_show (omenu);
-
- gtk_box_pack_end (GTK_BOX (hbox), omenu, FALSE, FALSE, 0);
- gtk_box_pack_end (GTK_BOX (hbox), label, FALSE, FALSE, 0);
-
- g_signal_connect(omenu, "changed", G_CALLBACK(fr_threading_changed), fr);
- }
-
- gtk_box_pack_start (GTK_BOX (inframe), hbox, FALSE, FALSE, 3);
-
- l = fr->parts;
- i = 0;
- while (l) {
- part = l->data;
- d(printf ("adding rule %s\n", part->title));
- w = get_rule_part_widget (f, part, fr);
- attach_rule (w, data, part, i++);
- l = g_list_next (l);
- }
-
- hadj = gtk_adjustment_new (0.0, 0.0, 1.0, 1.0, 1.0, 1.0);
- vadj = gtk_adjustment_new (0.0, 0.0, 1.0, 1.0, 1.0, 1.0);
- scrolledwindow = gtk_scrolled_window_new (GTK_ADJUSTMENT (hadj), GTK_ADJUSTMENT (vadj));
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
-
- gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolledwindow), parts);
-
- gtk_box_pack_start (GTK_BOX (inframe), scrolledwindow, TRUE, TRUE, 3);
-
- gtk_widget_show_all (vbox);
-
- return vbox;
-}
-
-FilterRule *
-filter_rule_next_list (GList *l, FilterRule *last, const char *source)
-{
- GList *node = l;
-
- if (last != NULL) {
- node = g_list_find (node, last);
- if (node == NULL)
- node = l;
- else
- node = node->next;
- }
-
- if (source) {
- while (node) {
- FilterRule *rule = node->data;
-
- if (rule->source && strcmp (rule->source, source) == 0)
- break;
- node = node->next;
- }
- }
-
- if (node)
- return node->data;
-
- return NULL;
-}
-
-FilterRule *
-filter_rule_find_list (GList * l, const char *name, const char *source)
-{
- while (l) {
- FilterRule *rule = l->data;
-
- if (strcmp (rule->name, name) == 0)
- if (source == NULL || (rule->source != NULL && strcmp (rule->source, source) == 0))
- return rule;
- l = l->next;
- }
-
- return NULL;
-}
-
-#ifdef FOR_TRANSLATIONS_ONLY
-
-static char *list[] = {
- N_("Incoming"), N_("Outgoing")
-};
-#endif
diff --git a/filter/filter-rule.h b/filter/filter-rule.h
deleted file mode 100644
index 2d5ba8174a..0000000000
--- a/filter/filter-rule.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef _FILTER_RULE_H
-#define _FILTER_RULE_H
-
-#include <glib.h>
-#include <glib-object.h>
-
-#include "filter-part.h"
-
-#define FILTER_TYPE_RULE (filter_rule_get_type ())
-#define FILTER_RULE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_RULE, FilterRule))
-#define FILTER_RULE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_RULE, FilterRuleClass))
-#define IS_FILTER_RULE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FILTER_TYPE_RULE))
-#define IS_FILTER_RULE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FILTER_TYPE_RULE))
-#define FILTER_RULE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FILTER_TYPE_RULE, FilterRuleClass))
-
-struct _RuleContext;
-
-typedef struct _FilterRule FilterRule;
-typedef struct _FilterRuleClass FilterRuleClass;
-
-enum _filter_grouping_t {
- FILTER_GROUP_ALL, /* all rules must match */
- FILTER_GROUP_ANY /* any rule must match */
-};
-
-/* threading, if the context supports it */
-enum _filter_threading_t {
- FILTER_THREAD_NONE, /* don't add any thread matching */
- FILTER_THREAD_ALL, /* add all possible threads */
- FILTER_THREAD_REPLIES, /* add only replies */
- FILTER_THREAD_REPLIES_PARENTS, /* replies plus parents */
-};
-
-#define FILTER_SOURCE_INCOMING "incoming" /* performed on incoming email */
-#define FILTER_SOURCE_DEMAND "demand" /* performed on the selected folder
- * when the user asks for it */
-#define FILTER_SOURCE_OUTGOING "outgoing"/* performed on outgoing mail */
-#define FILTER_SOURCE_JUNKTEST "junktest"/* perform only junktest on incoming mail */
-
-struct _FilterRule {
- GObject parent_object;
- struct _FilterRulePrivate *priv;
-
- char *name;
- char *source;
-
- enum _filter_grouping_t grouping;
- enum _filter_threading_t threading;
-
- unsigned int system:1; /* this is a system rule, cannot be edited/deleted */
- GList *parts;
-};
-
-struct _FilterRuleClass {
- GObjectClass parent_class;
-
- /* virtual methods */
- int (*validate) (FilterRule *);
- int (*eq) (FilterRule *fr, FilterRule *cm);
-
- xmlNodePtr (*xml_encode) (FilterRule *);
- int (*xml_decode) (FilterRule *, xmlNodePtr, struct _RuleContext *);
-
- void (*build_code) (FilterRule *, GString *out);
-
- void (*copy) (FilterRule *dest, FilterRule *src);
-
- GtkWidget *(*get_widget) (FilterRule *fr, struct _RuleContext *f);
-
- /* signals */
- void (*changed) (FilterRule *fr);
-};
-
-
-GType filter_rule_get_type (void);
-FilterRule *filter_rule_new (void);
-
-FilterRule *filter_rule_clone (FilterRule *base);
-
-/* methods */
-void filter_rule_set_name (FilterRule *fr, const char *name);
-void filter_rule_set_source (FilterRule *fr, const char *source);
-
-int filter_rule_validate (FilterRule *fr);
-int filter_rule_eq (FilterRule *fr, FilterRule *cm);
-
-xmlNodePtr filter_rule_xml_encode (FilterRule *fr);
-int filter_rule_xml_decode (FilterRule *fr, xmlNodePtr node, struct _RuleContext *f);
-
-void filter_rule_copy (FilterRule *dest, FilterRule *src);
-
-void filter_rule_add_part (FilterRule *fr, FilterPart *fp);
-void filter_rule_remove_part (FilterRule *fr, FilterPart *fp);
-void filter_rule_replace_part (FilterRule *fr, FilterPart *fp, FilterPart *new);
-
-GtkWidget *filter_rule_get_widget (FilterRule *fr, struct _RuleContext *f);
-
-void filter_rule_build_code (FilterRule *fr, GString *out);
-/*
-void filter_rule_build_action(FilterRule *fr, GString *out);
-*/
-
-void filter_rule_emit_changed (FilterRule *fr);
-
-/* static functions */
-FilterRule *filter_rule_next_list (GList *l, FilterRule *last, const char *source);
-FilterRule *filter_rule_find_list (GList *l, const char *name, const char *source);
-
-
-#endif /* ! _FILTER_RULE_H */
diff --git a/filter/filter.glade b/filter/filter.glade
deleted file mode 100644
index 34cd5855a3..0000000000
--- a/filter/filter.glade
+++ /dev/null
@@ -1,674 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-<requires lib="gnome"/>
-
-<widget class="GtkWindow" id="rule-editor">
- <property name="visible">True</property>
- <property name="title" translatable="yes">window1</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
-
- <child>
- <widget class="GtkVBox" id="rule_editor">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label17">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Show filters for mail:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="filter_source">
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget15">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget16">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Incoming</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="rule_frame">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="rule_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;_Filter Rules&lt;/b&gt;</property>
- <property name="use_underline">True</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox10">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label16">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox4">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="Custom" id="rule_list">
- <property name="visible">True</property>
- <property name="creation_function">rule_editor_treeview_new</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Thu, 12 Dec 2002 23:50:05 GMT</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox5">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkVButtonBox" id="vbuttonbox4">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_DEFAULT_STYLE</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkButton" id="rule_add">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-add</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="rule_edit">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Edit</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="rule_delete">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-remove</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="rule_up">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-go-up</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="rule_down">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-go-down</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">3</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-<widget class="GtkWindow" id="filter_datespec_win">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="title" translatable="yes">window1</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
-
- <child>
- <widget class="GtkVBox" id="filter_datespec">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkHBox" id="hbox5">
- <property name="border_width">4</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Compare against</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="option_type">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget19">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget20">
- <property name="visible">True</property>
- <property name="label" translatable="yes">the current time</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget21">
- <property name="visible">True</property>
- <property name="label" translatable="yes">the time you specify</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget22">
- <property name="visible">True</property>
- <property name="label" translatable="yes">a time relative to the current time</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHSeparator" id="hseparator1">
- <property name="visible">True</property>
- </widget>
- <packing>
- <property name="padding">1</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkNotebook" id="notebook_type">
- <property name="visible">True</property>
- <property name="show_tabs">False</property>
- <property name="show_border">False</property>
- <property name="tab_pos">GTK_POS_TOP</property>
- <property name="scrollable">False</property>
- <property name="enable_popup">False</property>
-
- <child>
- <widget class="GtkVBox" id="vbox9">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="label5">
- <property name="visible">True</property>
- <property name="label" translatable="yes">The message's date will be compared against
-the current time when filtering occurs.</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">label1</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox7">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="label6">
- <property name="visible">True</property>
- <property name="label" translatable="yes">The message's date will be compared against
-12:00am of the date specified.</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCalendar" id="calendar_specify">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="display_options">GTK_CALENDAR_SHOW_HEADING|GTK_CALENDAR_SHOW_DAY_NAMES</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">label2</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox8">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="label7">
- <property name="visible">True</property>
- <property name="label" translatable="yes">The message's date will be compared against
-a time relative to when filtering occurs.</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox6">
- <property name="visible">True</property>
- <property name="homogeneous">True</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkSpinButton" id="spin_relative">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">False</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">1 0 1000 1 10 10</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="option_relative">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget23">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget24">
- <property name="visible">True</property>
- <property name="label" translatable="yes">seconds</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget25">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget26">
- <property name="visible">True</property>
- <property name="label" translatable="yes">hours</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget27">
- <property name="visible">True</property>
- <property name="label" translatable="yes">days</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget28">
- <property name="visible">True</property>
- <property name="label" translatable="yes">weeks</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget29">
- <property name="visible">True</property>
- <property name="label" translatable="yes">months</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget30">
- <property name="visible">True</property>
- <property name="label" translatable="yes">years</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label8">
- <property name="visible">True</property>
- <property name="label" translatable="yes">ago</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">7.45058e-09</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">2</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">label3</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/filter/rule-context.c b/filter/rule-context.c
deleted file mode 100644
index 560e9100a4..0000000000
--- a/filter/rule-context.c
+++ /dev/null
@@ -1,947 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-
-#include <gtk/gtk.h>
-#include <libgnome/gnome-i18n.h>
-#include <gal/util/e-xml-utils.h>
-#include "widgets/misc/e-error.h"
-
-#include "rule-context.h"
-#include "filter-rule.h"
-#include "filter-marshal.h"
-
-#include "filter-input.h"
-#include "filter-option.h"
-#include "filter-code.h"
-#include "filter-colour.h"
-#include "filter-datespec.h"
-#include "filter-int.h"
-#include "filter-file.h"
-#include "filter-label.h"
-
-#define d(x)
-
-static int load(RuleContext *rc, const char *system, const char *user);
-static int save(RuleContext *rc, const char *user);
-static int revert(RuleContext *rc, const char *user);
-static GList *rename_uri(RuleContext *rc, const char *olduri, const char *newuri, GCompareFunc cmp);
-static GList *delete_uri(RuleContext *rc, const char *uri, GCompareFunc cmp);
-static FilterElement *new_element(RuleContext *rc, const char *name);
-
-static void rule_context_class_init(RuleContextClass *klass);
-static void rule_context_init(RuleContext *rc);
-static void rule_context_finalise(GObject *obj);
-
-#define _PRIVATE(x)(((RuleContext *)(x))->priv)
-
-struct _RuleContextPrivate {
- int frozen;
-};
-
-static GObjectClass *parent_class = NULL;
-
-enum {
- RULE_ADDED,
- RULE_REMOVED,
- CHANGED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-
-GType
-rule_context_get_type(void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof(RuleContextClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) rule_context_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof(RuleContext),
- 0, /* n_preallocs */
- (GInstanceInitFunc) rule_context_init,
- };
-
- type = g_type_register_static(G_TYPE_OBJECT, "RuleContext", &info, 0);
- }
-
- return type;
-}
-
-static void
-rule_context_class_init(RuleContextClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS(klass);
-
- parent_class = g_type_class_ref(G_TYPE_OBJECT);
-
- object_class->finalize = rule_context_finalise;
-
- /* override methods */
- klass->load = load;
- klass->save = save;
- klass->revert = revert;
- klass->rename_uri = rename_uri;
- klass->delete_uri = delete_uri;
- klass->new_element = new_element;
-
- /* signals */
- signals[RULE_ADDED] =
- g_signal_new("rule_added",
- RULE_TYPE_CONTEXT,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET(RuleContextClass, rule_added),
- NULL,
- NULL,
- filter_marshal_NONE__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
-
- signals[RULE_REMOVED] =
- g_signal_new("rule_removed",
- RULE_TYPE_CONTEXT,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET(RuleContextClass, rule_removed),
- NULL,
- NULL,
- filter_marshal_NONE__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
-
- signals[CHANGED] =
- g_signal_new("changed",
- RULE_TYPE_CONTEXT,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET(RuleContextClass, changed),
- NULL,
- NULL,
- filter_marshal_NONE__NONE,
- G_TYPE_NONE, 0);
-}
-
-static void
-rule_context_init(RuleContext *rc)
-{
- rc->priv = g_malloc0(sizeof(*rc->priv));
-
- rc->part_set_map = g_hash_table_new(g_str_hash, g_str_equal);
- rc->rule_set_map = g_hash_table_new(g_str_hash, g_str_equal);
-
- rc->flags = RULE_CONTEXT_GROUPING;
-}
-
-static void
-free_part_set(struct _part_set_map *map, void *data)
-{
- g_free(map->name);
- g_free(map);
-}
-
-static void
-free_rule_set(struct _rule_set_map *map, void *data)
-{
- g_free(map->name);
- g_free(map);
-}
-
-static void
-rule_context_finalise(GObject *obj)
-{
- RuleContext *rc =(RuleContext *) obj;
-
- g_list_foreach(rc->rule_set_list, (GFunc)free_rule_set, NULL);
- g_list_free(rc->rule_set_list);
- g_hash_table_destroy(rc->rule_set_map);
-
- g_list_foreach(rc->part_set_list, (GFunc)free_part_set, NULL);
- g_list_free(rc->part_set_list);
- g_hash_table_destroy(rc->part_set_map);
-
- g_free(rc->error);
-
- g_list_foreach(rc->parts, (GFunc)g_object_unref, NULL);
- g_list_free(rc->parts);
- g_list_foreach(rc->rules, (GFunc)g_object_unref, NULL);
- g_list_free(rc->rules);
-
- g_free(rc->priv);
-
- G_OBJECT_CLASS(parent_class)->finalize(obj);
-}
-
-/**
- * rule_context_new:
- *
- * Create a new RuleContext object.
- *
- * Return value: A new #RuleContext object.
- **/
-RuleContext *
-rule_context_new(void)
-{
- return(RuleContext *) g_object_new(RULE_TYPE_CONTEXT, NULL, NULL);
-}
-
-void
-rule_context_add_part_set(RuleContext *rc, const char *setname, GType part_type, RCPartFunc append, RCNextPartFunc next)
-{
- struct _part_set_map *map;
-
- g_assert(g_hash_table_lookup(rc->part_set_map, setname) == NULL);
-
- map = g_malloc0(sizeof(*map));
- map->type = part_type;
- map->append = append;
- map->next = next;
- map->name = g_strdup(setname);
- g_hash_table_insert(rc->part_set_map, map->name, map);
- rc->part_set_list = g_list_append(rc->part_set_list, map);
- d(printf("adding part set '%s'\n", setname));
-}
-
-void
-rule_context_add_rule_set(RuleContext *rc, const char *setname, GType rule_type, RCRuleFunc append, RCNextRuleFunc next)
-{
- struct _rule_set_map *map;
-
- g_assert(g_hash_table_lookup(rc->rule_set_map, setname) == NULL);
-
- map = g_malloc0(sizeof(*map));
- map->type = rule_type;
- map->append = append;
- map->next = next;
- map->name = g_strdup(setname);
- g_hash_table_insert(rc->rule_set_map, map->name, map);
- rc->rule_set_list = g_list_append(rc->rule_set_list, map);
- d(printf("adding rule set '%s'\n", setname));
-}
-
-/**
- * rule_context_set_error:
- * @f:
- * @error:
- *
- * Set the text error for the context, or NULL to clear it.
- **/
-static void
-rule_context_set_error(RuleContext *rc, char *error)
-{
- g_assert(rc);
-
- g_free(rc->error);
- rc->error = error;
-}
-
-/**
- * rule_context_load:
- * @f:
- * @system:
- * @user:
- *
- * Load a rule context from a system and user description file.
- *
- * Return value:
- **/
-int
-rule_context_load(RuleContext *rc, const char *system, const char *user)
-{
- int res;
-
- g_assert(rc);
-
- d(printf("rule_context: loading %s %s\n", system, user));
-
- rc->priv->frozen++;
- res = RULE_CONTEXT_GET_CLASS(rc)->load(rc, system, user);
- rc->priv->frozen--;
-
- return res;
-}
-
-static int
-load(RuleContext *rc, const char *system, const char *user)
-{
- xmlNodePtr set, rule, root;
- xmlDocPtr systemdoc, userdoc;
- struct _part_set_map *part_map;
- struct _rule_set_map *rule_map;
- struct stat st;
-
- rule_context_set_error(rc, NULL);
-
- d(printf("loading rules %s %s\n", system, user));
-
- systemdoc = xmlParseFile(system);
- if (systemdoc == NULL) {
- rule_context_set_error(rc, g_strdup_printf("Unable to load system rules '%s': %s",
- system, g_strerror(errno)));
- return -1;
- }
-
- root = xmlDocGetRootElement(systemdoc);
- if (root == NULL || strcmp(root->name, "filterdescription")) {
- rule_context_set_error(rc, g_strdup_printf("Unable to load system rules '%s': Invalid format", system));
- xmlFreeDoc(systemdoc);
- return -1;
- }
- /* doesn't matter if this doens't exist */
- userdoc = NULL;
- if (stat (user, &st) != -1 && S_ISREG (st.st_mode))
- userdoc = xmlParseFile(user);
-
- /* now parse structure */
- /* get rule parts */
- set = root->children;
- while (set) {
- d(printf("set name = %s\n", set->name));
- part_map = g_hash_table_lookup(rc->part_set_map, set->name);
- if (part_map) {
- d(printf("loading parts ...\n"));
- rule = set->children;
- while (rule) {
- if (!strcmp(rule->name, "part")) {
- FilterPart *part = FILTER_PART(g_object_new(part_map->type, NULL, NULL));
-
- if (filter_part_xml_create(part, rule, rc) == 0) {
- part_map->append(rc, part);
- } else {
- g_object_unref(part);
- g_warning("Cannot load filter part");
- }
- }
- rule = rule->next;
- }
- } else if ((rule_map = g_hash_table_lookup(rc->rule_set_map, set->name))) {
- d(printf("loading system rules ...\n"));
- rule = set->children;
- while (rule) {
- d(printf("checking node: %s\n", rule->name));
- if (!strcmp(rule->name, "rule")) {
- FilterRule *part = FILTER_RULE(g_object_new(rule_map->type, NULL, NULL));
-
- if (filter_rule_xml_decode(part, rule, rc) == 0) {
- part->system = TRUE;
- rule_map->append(rc, part);
- } else {
- g_object_unref(part);
- g_warning("Cannot load filter part");
- }
- }
- rule = rule->next;
- }
- }
- set = set->next;
- }
-
- /* now load actual rules */
- if (userdoc) {
- root = xmlDocGetRootElement(userdoc);
- set = root?root->children:NULL;
- while (set) {
- d(printf("set name = %s\n", set->name));
- rule_map = g_hash_table_lookup(rc->rule_set_map, set->name);
- if (rule_map) {
- d(printf("loading rules ...\n"));
- rule = set->children;
- while (rule) {
- d(printf("checking node: %s\n", rule->name));
- if (!strcmp(rule->name, "rule")) {
- FilterRule *part = FILTER_RULE(g_object_new(rule_map->type, NULL, NULL));
-
- if (filter_rule_xml_decode(part, rule, rc) == 0) {
- rule_map->append(rc, part);
- } else {
- g_object_unref(part);
- g_warning("Cannot load filter part");
- }
- }
- rule = rule->next;
- }
- }
- set = set->next;
- }
- }
-
- xmlFreeDoc(userdoc);
- xmlFreeDoc(systemdoc);
-
- return 0;
-}
-
-/**
- * rule_context_save:
- * @f:
- * @user:
- *
- * Save a rule context to disk.
- *
- * Return value:
- **/
-int
-rule_context_save(RuleContext *rc, const char *user)
-{
- g_assert(rc);
- g_assert(user);
-
- return RULE_CONTEXT_GET_CLASS(rc)->save(rc, user);
-}
-
-static int
-save(RuleContext *rc, const char *user)
-{
- xmlDocPtr doc;
- xmlNodePtr root, rules, work;
- GList *l;
- FilterRule *rule;
- struct _rule_set_map *map;
- int ret;
-
- doc = xmlNewDoc("1.0");
- /* FIXME: set character encoding to UTF-8? */
- root = xmlNewDocNode(doc, NULL, "filteroptions", NULL);
- xmlDocSetRootElement(doc, root);
- l = rc->rule_set_list;
- while (l) {
- map = l->data;
- rules = xmlNewDocNode(doc, NULL, map->name, NULL);
- xmlAddChild(root, rules);
- rule = NULL;
- while ((rule = map->next(rc, rule, NULL))) {
- if (!rule->system) {
- d(printf("processing rule %s\n", rule->name));
- work = filter_rule_xml_encode(rule);
- xmlAddChild(rules, work);
- }
- }
- l = g_list_next(l);
- }
-
- ret = e_xml_save_file(user, doc);
-
- xmlFreeDoc(doc);
-
- return ret;
-}
-
-/**
- * rule_context_revert:
- * @f:
- * @user:
- *
- * Reverts a rule context from a user description file. Assumes the
- * system description file is unchanged from when it was loaded.
- *
- * Return value:
- **/
-int
-rule_context_revert(RuleContext *rc, const char *user)
-{
- g_assert(rc);
-
- d(printf("rule_context: restoring %s\n", user));
-
- return RULE_CONTEXT_GET_CLASS(rc)->revert(rc, user);
-}
-
-struct _revert_data {
- GHashTable *rules;
- int rank;
-};
-
-static void
-revert_rule_remove(void *key, FilterRule *frule, RuleContext *rc)
-{
- rule_context_remove_rule(rc, frule);
- g_object_unref(frule);
-}
-
-static void
-revert_source_remove(void *key, struct _revert_data *rest_data, RuleContext *rc)
-{
- g_hash_table_foreach(rest_data->rules, (GHFunc)revert_rule_remove, rc);
- g_hash_table_destroy(rest_data->rules);
- g_free(rest_data);
-}
-
-static guint
-source_hashf(const char *a)
-{
- if (a)
- return g_str_hash(a);
- return 0;
-}
-
-static int
-source_eqf(const char *a, const char *b)
-{
- return((a && b && strcmp(a, b) == 0))
- || (a == NULL && b == NULL);
-}
-
-static int
-revert(RuleContext *rc, const char *user)
-{
- xmlNodePtr set, rule;
- /*struct _part_set_map *part_map;*/
- struct _rule_set_map *rule_map;
- struct _revert_data *rest_data;
- GHashTable *source_hash;
- xmlDocPtr userdoc;
- FilterRule *frule;
-
- rule_context_set_error(rc, NULL);
-
- d(printf("restoring rules %s\n", user));
-
- userdoc = xmlParseFile(user);
- if (userdoc == NULL)
- /* clear out anythign we have? */
- return 0;
-
- source_hash = g_hash_table_new((GHashFunc)source_hashf, (GCompareFunc)source_eqf);
-
- /* setup stuff we have now */
- /* Note that we assume there is only 1 set of rules in a given rule context,
- although other parts of the code dont assume this */
- frule = NULL;
- while ((frule = rule_context_next_rule(rc, frule, NULL))) {
- rest_data = g_hash_table_lookup(source_hash, frule->source);
- if (rest_data == NULL) {
- rest_data = g_malloc0(sizeof(*rest_data));
- rest_data->rules = g_hash_table_new(g_str_hash, g_str_equal);
- g_hash_table_insert(source_hash, frule->source, rest_data);
- }
- g_hash_table_insert(rest_data->rules, frule->name, frule);
- }
-
- /* make what we have, match what we load */
- set = xmlDocGetRootElement(userdoc);
- set = set?set->children:NULL;
- while (set) {
- d(printf("set name = %s\n", set->name));
- rule_map = g_hash_table_lookup(rc->rule_set_map, set->name);
- if (rule_map) {
- d(printf("loading rules ...\n"));
- rule = set->children;
- while (rule) {
- d(printf("checking node: %s\n", rule->name));
- if (!strcmp(rule->name, "rule")) {
- FilterRule *part = FILTER_RULE(g_object_new(rule_map->type, NULL, NULL));
-
- if (filter_rule_xml_decode(part, rule, rc) == 0) {
- /* use the revert data to keep track of the right rank of this rule part */
- rest_data = g_hash_table_lookup(source_hash, part->source);
- if (rest_data == NULL) {
- rest_data = g_malloc0(sizeof(*rest_data));
- rest_data->rules = g_hash_table_new(g_str_hash, g_str_equal);
- g_hash_table_insert(source_hash, part->source, rest_data);
- }
- frule = g_hash_table_lookup(rest_data->rules, part->name);
- if (frule) {
- if (rc->priv->frozen == 0 && !filter_rule_eq(frule, part))
- filter_rule_copy(frule, part);
-
- g_object_unref(part);
- rule_context_rank_rule(rc, frule, frule->source, rest_data->rank);
- g_hash_table_remove(rest_data->rules, frule->name);
- } else {
- rule_context_add_rule(rc, part);
- rule_context_rank_rule(rc, part, part->source, rest_data->rank);
- }
- rest_data->rank++;
- } else {
- g_object_unref(part);
- g_warning("Cannot load filter part");
- }
- }
- rule = rule->next;
- }
- }
- set = set->next;
- }
-
- xmlFreeDoc(userdoc);
-
- /* remove any we still have that weren't in the file */
- g_hash_table_foreach(source_hash, (GHFunc)revert_source_remove, rc);
- g_hash_table_destroy(source_hash);
-
- return 0;
-}
-
-FilterPart *
-rule_context_find_part(RuleContext *rc, const char *name)
-{
- g_assert(rc);
- g_assert(name);
-
- d(printf("find part : "));
- return filter_part_find_list(rc->parts, name);
-}
-
-FilterPart *
-rule_context_create_part(RuleContext *rc, const char *name)
-{
- FilterPart *part;
-
- g_assert(rc);
- g_assert(name);
-
- if ((part = rule_context_find_part(rc, name)))
- return filter_part_clone(part);
-
- return NULL;
-}
-
-FilterPart *
-rule_context_next_part(RuleContext *rc, FilterPart *last)
-{
- g_assert(rc);
-
- return filter_part_next_list(rc->parts, last);
-}
-
-FilterRule *
-rule_context_next_rule(RuleContext *rc, FilterRule *last, const char *source)
-{
- g_assert(rc);
-
- return filter_rule_next_list(rc->rules, last, source);
-}
-
-FilterRule *
-rule_context_find_rule(RuleContext *rc, const char *name, const char *source)
-{
- g_assert(name);
- g_assert(rc);
-
- return filter_rule_find_list(rc->rules, name, source);
-}
-
-void
-rule_context_add_part(RuleContext *rc, FilterPart *part)
-{
- g_assert(rc);
- g_assert(part);
-
- rc->parts = g_list_append(rc->parts, part);
-}
-
-void
-rule_context_add_rule(RuleContext *rc, FilterRule *new)
-{
- g_assert(rc);
- g_assert(new);
-
- d(printf("add rule '%s'\n", new->name));
-
- rc->rules = g_list_append(rc->rules, new);
-
- if (rc->priv->frozen == 0) {
- g_signal_emit(rc, signals[RULE_ADDED], 0, new);
- g_signal_emit(rc, signals[CHANGED], 0);
- }
-}
-
-static void
-new_rule_response(GtkWidget *dialog, int button, RuleContext *context)
-{
- if (button == GTK_RESPONSE_OK) {
- FilterRule *rule = g_object_get_data((GObject *) dialog, "rule");
- char *user = g_object_get_data((GObject *) dialog, "path");
-
- if (!filter_rule_validate(rule)) {
- /* no need to popup a dialog because the validate code does that. */
- return;
- }
-
- if (rule_context_find_rule (context, rule->name, rule->source)) {
- e_error_run((GtkWindow *)dialog, "filter:bad-name-notunique", rule->name, NULL);
-
- return;
- }
-
- g_object_ref(rule);
- rule_context_add_rule(context, rule);
- if (user)
- rule_context_save(context, user);
- }
-
- gtk_widget_destroy(dialog);
-}
-
-/* add a rule, with a gui, asking for confirmation first ... optionally save to path */
-void
-rule_context_add_rule_gui(RuleContext *rc, FilterRule *rule, const char *title, const char *path)
-{
- GtkDialog *dialog;
- GtkWidget *widget;
-
- d(printf("add rule gui '%s'\n", rule->name));
-
- g_assert(rc);
- g_assert(rule);
-
- widget = filter_rule_get_widget(rule, rc);
- gtk_widget_show(widget);
-
- dialog =(GtkDialog *) gtk_dialog_new();
- gtk_dialog_add_buttons(dialog,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- NULL);
- gtk_dialog_set_has_separator (dialog, FALSE);
-
- gtk_window_set_title((GtkWindow *) dialog, title);
- gtk_window_set_default_size((GtkWindow *) dialog, 600, 400);
- gtk_window_set_resizable((GtkWindow *) dialog, TRUE);
-
- gtk_box_pack_start((GtkBox *) dialog->vbox, widget, TRUE, TRUE, 0);
-
- g_object_set_data_full((GObject *) dialog, "rule", rule, g_object_unref);
- if (path)
- g_object_set_data_full((GObject *) dialog, "path", g_strdup(path), g_free);
-
- g_signal_connect(dialog, "response", G_CALLBACK(new_rule_response), rc);
-
- g_object_ref(rc);
-
- g_object_set_data_full((GObject *) dialog, "context", rc, g_object_unref);
-
- gtk_widget_show((GtkWidget *) dialog);
-}
-
-void
-rule_context_remove_rule(RuleContext *rc, FilterRule *rule)
-{
- g_assert(rc);
- g_assert(rule);
-
- d(printf("remove rule '%s'\n", rule->name));
-
- rc->rules = g_list_remove(rc->rules, rule);
-
- if (rc->priv->frozen == 0) {
- g_signal_emit(rc, signals[RULE_REMOVED], 0, rule);
- g_signal_emit(rc, signals[CHANGED], 0);
- }
-}
-
-void
-rule_context_rank_rule(RuleContext *rc, FilterRule *rule, const char *source, int rank)
-{
- GList *node;
- int i = 0, index = 0;
-
- g_assert(rc);
- g_assert(rule);
-
- if (rule_context_get_rank_rule (rc, rule, source) == rank)
- return;
-
- rc->rules = g_list_remove(rc->rules, rule);
- node = rc->rules;
- while (node) {
- FilterRule *r = node->data;
-
- if (i == rank) {
- rc->rules = g_list_insert(rc->rules, rule, index);
- if (rc->priv->frozen == 0)
- g_signal_emit(rc, signals[CHANGED], 0);
-
- return;
- }
-
- index++;
- if (source == NULL || (r->source && strcmp(r->source, source) == 0))
- i++;
-
- node = node->next;
- }
-
- rc->rules = g_list_append(rc->rules, rule);
- if (rc->priv->frozen == 0)
- g_signal_emit(rc, signals[CHANGED], 0);
-}
-
-int
-rule_context_get_rank_rule(RuleContext *rc, FilterRule *rule, const char *source)
-{
- GList *node;
- int i = 0;
-
- g_assert(rc);
- g_assert(rule);
-
- d(printf("getting rank of rule '%s'\n", rule->name));
-
- node = rc->rules;
- while (node) {
- FilterRule *r = node->data;
-
- d(printf(" checking against rule '%s' rank '%d'\n", r->name, i));
-
- if (r == rule)
- return i;
-
- if (source == NULL || (r->source && strcmp(r->source, source) == 0))
- i++;
-
- node = node->next;
- }
-
- return -1;
-}
-
-FilterRule *
-rule_context_find_rank_rule(RuleContext *rc, int rank, const char *source)
-{
- GList *node;
- int i = 0;
-
- g_assert(rc);
-
- d(printf("getting rule at rank %d source '%s'\n", rank, source?source:"<any>"));
-
- node = rc->rules;
- while (node) {
- FilterRule *r = node->data;
-
- d(printf(" checking against rule '%s' rank '%d'\n", r->name, i));
-
- if (source == NULL || (r->source && strcmp(r->source, source) == 0)) {
- if (rank == i)
- return r;
- i++;
- }
-
- node = node->next;
- }
-
- return NULL;
-}
-
-static GList *
-delete_uri(RuleContext *rc, const char *uri, GCompareFunc cmp)
-{
- return NULL;
-}
-
-GList *
-rule_context_delete_uri(RuleContext *rc, const char *uri, GCompareFunc cmp)
-{
- return RULE_CONTEXT_GET_CLASS(rc)->delete_uri(rc, uri, cmp);
-}
-
-static GList *
-rename_uri(RuleContext *rc, const char *olduri, const char *newuri, GCompareFunc cmp)
-{
- return NULL;
-}
-
-GList *
-rule_context_rename_uri(RuleContext *rc, const char *olduri, const char *newuri, GCompareFunc cmp)
-{
- return RULE_CONTEXT_GET_CLASS(rc)->rename_uri(rc, olduri, newuri, cmp);
-}
-
-void
-rule_context_free_uri_list(RuleContext *rc, GList *uris)
-{
- GList *l = uris, *n;
-
- /* TODO: should be virtual */
-
- while (l) {
- n = l->next;
- g_free(l->data);
- g_list_free_1(l);
- l = n;
- }
-}
-
-static FilterElement *
-new_element(RuleContext *rc, const char *type)
-{
- if (!strcmp (type, "string")) {
- return (FilterElement *) filter_input_new ();
- } else if (!strcmp (type, "address")) {
- /* FIXME: temporary ... need real address type */
- return (FilterElement *) filter_input_new_type_name (type);
- } else if (!strcmp (type, "code")) {
- return (FilterElement *) filter_code_new ();
- } else if (!strcmp (type, "colour")) {
- return (FilterElement *) filter_colour_new ();
- } else if (!strcmp (type, "optionlist")) {
- return (FilterElement *) filter_option_new ();
- } else if (!strcmp (type, "datespec")) {
- return (FilterElement *) filter_datespec_new ();
- } else if (!strcmp (type, "command")) {
- return (FilterElement *) filter_file_new_type_name (type);
- } else if (!strcmp (type, "file")) {
- return (FilterElement *) filter_file_new_type_name (type);
- } else if (!strcmp (type, "integer")) {
- return (FilterElement *) filter_int_new ();
- } else if (!strcmp (type, "regex")) {
- return (FilterElement *) filter_input_new_type_name (type);
- } else if (!strcmp (type, "label")) {
- return (FilterElement *) filter_label_new ();
- } else {
- g_warning("Unknown filter type '%s'", type);
- return NULL;
- }
-}
-
-/**
- * rule_context_new_element:
- * @rc:
- * @name:
- *
- * create a new filter element based on name.
- *
- * Return value:
- **/
-FilterElement *
-rule_context_new_element(RuleContext *rc, const char *name)
-{
- if (name == NULL)
- return NULL;
-
- return RULE_CONTEXT_GET_CLASS(rc)->new_element(rc, name);
-}
-
diff --git a/filter/rule-context.h b/filter/rule-context.h
deleted file mode 100644
index 25b0c0e4c9..0000000000
--- a/filter/rule-context.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef _RULE_CONTEXT_H
-#define _RULE_CONTEXT_H
-
-#include <glib.h>
-#include <glib-object.h>
-#include <libxml/parser.h>
-
-#include "filter-part.h"
-#include "filter-rule.h"
-
-#define RULE_TYPE_CONTEXT (rule_context_get_type ())
-#define RULE_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RULE_TYPE_CONTEXT, RuleContext))
-#define RULE_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RULE_TYPE_CONTEXT, RuleContextClass))
-#define IS_RULE_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RULE_TYPE_CONTEXT))
-#define IS_RULE_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RULE_TYPE_CONTEXT))
-#define RULE_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RULE_TYPE_CONTEXT, RuleContextClass))
-
-typedef struct _RuleContext RuleContext;
-typedef struct _RuleContextClass RuleContextClass;
-
-/* backend capabilities, this is a hack since we don't support nested rules */
-enum {
- RULE_CONTEXT_GROUPING = 1 << 0,
- RULE_CONTEXT_THREADING = 1 << 1,
-};
-
-struct _RuleContext {
- GObject parent_object;
- struct _RuleContextPrivate *priv;
-
- char *error; /* string version of error */
-
- guint32 flags; /* capability flags */
-
- GList *parts;
- GList *rules;
-
- GHashTable *part_set_map; /* map set types to part types */
- GList *part_set_list;
- GHashTable *rule_set_map; /* map set types to rule types */
- GList *rule_set_list;
-};
-
-typedef void (*RCRegisterFunc) (RuleContext *rc, FilterRule *rule, gpointer user_data);
-
-struct _RuleContextClass {
- GObjectClass parent_class;
-
- /* virtual methods */
- int (*load) (RuleContext *rc, const char *system, const char *user);
- int (*save) (RuleContext *rc, const char *user);
- int (*revert) (RuleContext *rc, const char *user);
-
- GList *(*delete_uri) (RuleContext *rc, const char *uri, GCompareFunc cmp);
- GList *(*rename_uri) (RuleContext *rc, const char *olduri, const char *newuri, GCompareFunc cmp);
-
- FilterElement *(*new_element)(RuleContext *rc, const char *name);
-
- /* signals */
- void (*rule_added) (RuleContext *rc, FilterRule *rule);
- void (*rule_removed) (RuleContext *rc, FilterRule *rule);
- void (*changed) (RuleContext *rc);
-};
-
-typedef void (*RCPartFunc) (RuleContext *rc, FilterPart *part);
-typedef void (*RCRuleFunc) (RuleContext *rc, FilterRule *part);
-typedef FilterPart * (*RCNextPartFunc) (RuleContext *rc, FilterPart *part);
-typedef FilterRule * (*RCNextRuleFunc) (RuleContext *rc, FilterRule *rule, const char *source);
-
-struct _part_set_map {
- char *name;
- GType type;
- RCPartFunc append;
- RCNextPartFunc next;
-};
-
-struct _rule_set_map {
- char *name;
- GType type;
- RCRuleFunc append;
- RCNextRuleFunc next;
-};
-
-GType rule_context_get_type (void);
-
-/* methods */
-RuleContext *rule_context_new (void);
-
-/* io */
-int rule_context_load (RuleContext *rc, const char *system, const char *user);
-int rule_context_save (RuleContext *rc, const char *user);
-int rule_context_revert (RuleContext *rc, const char *user);
-
-void rule_context_add_part (RuleContext *rc, FilterPart *new);
-FilterPart *rule_context_find_part (RuleContext *rc, const char *name);
-FilterPart *rule_context_create_part (RuleContext *rc, const char *name);
-FilterPart *rule_context_next_part (RuleContext *rc, FilterPart *last);
-
-FilterRule *rule_context_next_rule (RuleContext *rc, FilterRule *last, const char *source);
-FilterRule *rule_context_find_rule (RuleContext *rc, const char *name, const char *source);
-FilterRule *rule_context_find_rank_rule (RuleContext *rc, int rank, const char *source);
-void rule_context_add_rule (RuleContext *rc, FilterRule *new);
-void rule_context_add_rule_gui (RuleContext *rc, FilterRule *rule, const char *title, const char *path);
-void rule_context_remove_rule (RuleContext *rc, FilterRule *rule);
-
-/* get/set the rank (position) of a rule */
-void rule_context_rank_rule (RuleContext *rc, FilterRule *rule, const char *source, int rank);
-int rule_context_get_rank_rule (RuleContext *rc, FilterRule *rule, const char *source);
-
-/* setup type for set parts */
-void rule_context_add_part_set (RuleContext *rc, const char *setname, GType part_type,
- RCPartFunc append, RCNextPartFunc next);
-void rule_context_add_rule_set (RuleContext *rc, const char *setname, GType rule_type,
- RCRuleFunc append, RCNextRuleFunc next);
-
-/* dynamic element types */
-FilterElement *rule_context_new_element(RuleContext *rc, const char *name);
-
-/* uri's disappear/renamed externally */
-GList *rule_context_delete_uri (RuleContext *rc, const char *uri, GCompareFunc cmp);
-GList *rule_context_rename_uri (RuleContext *rc, const char *olduri, const char *newuri, GCompareFunc cmp);
-
-void rule_context_free_uri_list (RuleContext *rc, GList *uris);
-
-#endif /* ! _RULE_CONTEXT_H */
diff --git a/filter/rule-editor.c b/filter/rule-editor.c
deleted file mode 100644
index f23edec8dc..0000000000
--- a/filter/rule-editor.c
+++ /dev/null
@@ -1,746 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-/* for getenv only, remove when getenv need removed */
-#include <stdlib.h>
-#include <string.h>
-
-#include <libgnome/gnome-i18n.h>
-
-#include "widgets/misc/e-error.h"
-#include "rule-editor.h"
-
-static int enable_undo = 0;
-
-void rule_editor_add_undo (RuleEditor *re, int type, FilterRule *rule, int rank, int newrank);
-void rule_editor_play_undo (RuleEditor *re);
-
-#define d(x)
-
-static void set_source (RuleEditor *re, const char *source);
-static void set_sensitive (RuleEditor *re);
-static FilterRule *create_rule (RuleEditor *re);
-
-static void cursor_changed (GtkTreeView *treeview, RuleEditor *re);
-
-static void rule_editor_class_init (RuleEditorClass *klass);
-static void rule_editor_init (RuleEditor *re);
-static void rule_editor_finalise (GObject *obj);
-static void rule_editor_destroy (GtkObject *obj);
-
-#define _PRIVATE(x)(((RuleEditor *)(x))->priv)
-
-enum {
- BUTTON_ADD,
- BUTTON_EDIT,
- BUTTON_DELETE,
- BUTTON_UP,
- BUTTON_DOWN,
- BUTTON_LAST
-};
-
-struct _RuleEditorPrivate {
- GtkButton *buttons[BUTTON_LAST];
-};
-
-static GtkDialogClass *parent_class = NULL;
-
-
-GtkType
-rule_editor_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (RuleEditorClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) rule_editor_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (RuleEditor),
- 0, /* n_preallocs */
- (GInstanceInitFunc) rule_editor_init,
- };
-
- /* TODO: Remove when it works (or never will) */
- enable_undo = getenv ("EVOLUTION_RULE_UNDO") != NULL;
-
- type = g_type_register_static (gtk_dialog_get_type (), "RuleEditor", &info, 0);
- }
-
- return type;
-}
-
-static void
-rule_editor_class_init (RuleEditorClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
-
- parent_class = g_type_class_ref(gtk_dialog_get_type ());
-
- gobject_class->finalize = rule_editor_finalise;
- object_class->destroy = rule_editor_destroy;
-
- /* override methods */
- klass->set_source = set_source;
- klass->set_sensitive = set_sensitive;
- klass->create_rule = create_rule;
-}
-
-static void
-rule_editor_init (RuleEditor *re)
-{
- re->priv = g_malloc0 (sizeof (*re->priv));
-}
-
-static void
-rule_editor_finalise (GObject *obj)
-{
- RuleEditor *re = (RuleEditor *)obj;
- RuleEditorUndo *undo, *next;
-
- g_object_unref (re->context);
- g_free (re->priv);
-
- undo = re->undo_log;
- while (undo) {
- next = undo->next;
- g_object_unref (undo->rule);
- g_free (undo);
- undo = next;
- }
-
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-static void
-rule_editor_destroy (GtkObject *obj)
-{
- RuleEditor *re = (RuleEditor *) obj;
-
- if (re->dialog) {
- gtk_widget_destroy (GTK_WIDGET (re->dialog));
- re->dialog = NULL;
- }
-
- ((GtkObjectClass *)(parent_class))->destroy (obj);
-}
-
-/**
- * rule_editor_new:
- *
- * Create a new RuleEditor object.
- *
- * Return value: A new #RuleEditor object.
- **/
-RuleEditor *
-rule_editor_new (RuleContext *rc, const char *source, const char *label)
-{
- RuleEditor *re = (RuleEditor *) g_object_new (RULE_TYPE_EDITOR, NULL);
- GladeXML *gui;
-
- gui = glade_xml_new (FILTER_GLADEDIR "/filter.glade", "rule_editor", NULL);
- rule_editor_construct (re, rc, gui, source, label);
- gtk_widget_hide(glade_xml_get_widget (gui, "filter_source"));
- g_object_unref (gui);
-
- return re;
-}
-
-/* used internally by implementations if required */
-void
-rule_editor_set_sensitive (RuleEditor *re)
-{
- RULE_EDITOR_GET_CLASS (re)->set_sensitive (re);
-}
-
-/* used internally by implementations */
-void
-rule_editor_set_source (RuleEditor *re, const char *source)
-{
- RULE_EDITOR_GET_CLASS (re)->set_source (re, source);
-}
-
-/* factory method for "add" button */
-FilterRule *
-rule_editor_create_rule (RuleEditor *re)
-{
- return RULE_EDITOR_GET_CLASS (re)->create_rule (re);
-}
-
-static FilterRule *
-create_rule (RuleEditor *re)
-{
- FilterRule *rule = filter_rule_new ();
- FilterPart *part;
-
- /* create a rule with 1 part in it */
- part = rule_context_next_part (re->context, NULL);
- filter_rule_add_part (rule, filter_part_clone (part));
-
- return rule;
-}
-
-static void
-editor_destroy (RuleEditor *re, GObject *deadbeef)
-{
- if (re->edit) {
- g_object_unref (re->edit);
- re->edit = NULL;
- }
-
- re->dialog = NULL;
-
- gtk_widget_set_sensitive (GTK_WIDGET (re), TRUE);
- rule_editor_set_sensitive (re);
-}
-
-static void
-add_editor_response (GtkWidget *dialog, int button, RuleEditor *re)
-{
- GtkTreeSelection *selection;
- GtkTreePath *path;
- GtkTreeIter iter;
-
- if (button == GTK_RESPONSE_OK) {
- if (!filter_rule_validate (re->edit)) {
- /* no need to popup a dialog because the validate code does that. */
- return;
- }
-
- if (rule_context_find_rule (re->context, re->edit->name, re->edit->source)) {
- e_error_run((GtkWindow *)dialog, "filter:bad-name-notunique", re->edit->name, NULL);
- return;
- }
-
- g_object_ref (re->edit);
-
- gtk_list_store_append (re->model, &iter);
- gtk_list_store_set (re->model, &iter, 0, re->edit->name, 1, re->edit, -1);
- selection = gtk_tree_view_get_selection (re->list);
- gtk_tree_selection_select_iter (selection, &iter);
-
- /* scroll to the newly added row */
- path = gtk_tree_model_get_path ((GtkTreeModel *) re->model, &iter);
- gtk_tree_view_scroll_to_cell (re->list, path, NULL, TRUE, 1.0, 0.0);
- gtk_tree_path_free (path);
-
- re->current = re->edit;
- rule_context_add_rule (re->context, re->current);
-
- g_object_ref (re->current);
- rule_editor_add_undo (re, RULE_EDITOR_LOG_ADD, re->current,
- rule_context_get_rank_rule (re->context, re->current, re->current->source), 0);
- }
-
- gtk_widget_destroy (dialog);
-}
-
-static void
-rule_add (GtkWidget *widget, RuleEditor *re)
-{
- GtkWidget *rules;
-
- if (re->edit != NULL)
- return;
-
- re->edit = rule_editor_create_rule (re);
- filter_rule_set_source (re->edit, re->source);
- rules = filter_rule_get_widget (re->edit, re->context);
-
- re->dialog = gtk_dialog_new ();
- gtk_dialog_add_buttons ((GtkDialog *) re->dialog,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- NULL);
- gtk_dialog_set_has_separator ((GtkDialog *) re->dialog, FALSE);
-
- gtk_window_set_title ((GtkWindow *) re->dialog, _("Add Rule"));
- gtk_window_set_default_size (GTK_WINDOW (re->dialog), 650, 400);
- gtk_window_set_resizable (GTK_WINDOW (re->dialog), TRUE);
- gtk_window_set_transient_for ((GtkWindow *) re->dialog, (GtkWindow *) re);
- gtk_container_set_border_width ((GtkContainer *) re->dialog, 6);
-
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (re->dialog)->vbox), rules, TRUE, TRUE, 3);
-
- g_signal_connect (re->dialog, "response", G_CALLBACK (add_editor_response), re);
- g_object_weak_ref ((GObject *) re->dialog, (GWeakNotify) editor_destroy, re);
-
- gtk_widget_set_sensitive (GTK_WIDGET (re), FALSE);
-
- gtk_widget_show (re->dialog);
-}
-
-static void
-edit_editor_response (GtkWidget *dialog, int button, RuleEditor *re)
-{
- FilterRule *rule;
- GtkTreePath *path;
- GtkTreeIter iter;
- int pos;
-
- if (button == GTK_RESPONSE_OK) {
- if (!filter_rule_validate (re->edit)) {
- /* no need to popup a dialog because the validate code does that. */
- return;
- }
-
- rule = rule_context_find_rule (re->context, re->edit->name, re->edit->source);
- if (rule != NULL && rule != re->current) {
- e_error_run((GtkWindow *)dialog, "filter:bad-name-notunique", rule->name, NULL);
-
- return;
- }
-
- pos = rule_context_get_rank_rule (re->context, re->current, re->source);
- if (pos != -1) {
- path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, pos);
- gtk_tree_model_get_iter (GTK_TREE_MODEL (re->model), &iter, path);
- gtk_tree_path_free (path);
-
- gtk_list_store_set (re->model, &iter, 0, re->edit->name, -1);
-
- rule_editor_add_undo (re, RULE_EDITOR_LOG_EDIT, filter_rule_clone (re->current),
- pos, 0);
-
- /* replace the old rule with the new rule */
- filter_rule_copy (re->current, re->edit);
- }
- }
-
- gtk_widget_destroy (dialog);
-}
-
-static void
-rule_edit (GtkWidget *widget, RuleEditor *re)
-{
- GtkWidget *rules;
-
- if (re->current == NULL || re->edit != NULL)
- return;
-
- re->edit = filter_rule_clone (re->current);
-
- rules = filter_rule_get_widget (re->edit, re->context);
-
- re->dialog = gtk_dialog_new ();
- gtk_dialog_add_buttons ((GtkDialog *) re->dialog,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- NULL);
- gtk_dialog_set_has_separator ((GtkDialog *) re->dialog, FALSE);
-
- gtk_window_set_title ((GtkWindow *) re->dialog, _("Edit Rule"));
- gtk_window_set_default_size (GTK_WINDOW (re->dialog), 650, 400);
- gtk_window_set_resizable (GTK_WINDOW (re->dialog), TRUE);
- gtk_widget_set_parent_window (GTK_WIDGET (re->dialog), GTK_WIDGET (re)->window);
- gtk_container_set_border_width ((GtkContainer *) re->dialog, 6);
-
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (re->dialog)->vbox), rules, TRUE, TRUE, 3);
-
- g_signal_connect (re->dialog, "response", G_CALLBACK (edit_editor_response), re);
- g_object_weak_ref ((GObject *) re->dialog, (GWeakNotify) editor_destroy, re);
-
- gtk_widget_set_sensitive (GTK_WIDGET (re), FALSE);
-
- gtk_widget_show (re->dialog);
-}
-
-static void
-rule_delete (GtkWidget *widget, RuleEditor *re)
-{
- GtkTreeSelection *selection;
- GtkTreePath *path;
- GtkTreeIter iter;
- int pos, len;
-
- d(printf ("delete rule\n"));
- pos = rule_context_get_rank_rule (re->context, re->current, re->source);
- if (pos != -1) {
- rule_context_remove_rule (re->context, re->current);
-
- path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, pos);
- gtk_tree_model_get_iter (GTK_TREE_MODEL (re->model), &iter, path);
- gtk_list_store_remove (re->model, &iter);
- gtk_tree_path_free (path);
-
- rule_editor_add_undo (re, RULE_EDITOR_LOG_REMOVE, re->current,
- rule_context_get_rank_rule (re->context, re->current, re->current->source), 0);
-#if 0
- g_object_unref (re->current);
-#endif
- re->current = NULL;
-
- /* now select the next rule */
- len = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (re->model), NULL);
- pos = pos >= len ? len - 1 : pos;
-
- if (pos >= 0) {
- path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, pos);
- gtk_tree_model_get_iter (GTK_TREE_MODEL (re->model), &iter, path);
- gtk_tree_path_free (path);
-
- /* select the new row */
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (re->list));
- gtk_tree_selection_select_iter (selection, &iter);
-
- /* scroll to the selected row */
- path = gtk_tree_model_get_path ((GtkTreeModel *) re->model, &iter);
- gtk_tree_view_scroll_to_cell (re->list, path, NULL, FALSE, 0.0, 0.0);
- gtk_tree_path_free (path);
-
- /* update our selection state */
- cursor_changed (re->list, re);
- return;
- }
- }
-
- rule_editor_set_sensitive (re);
-}
-
-static void
-rule_move (RuleEditor *re, int from, int to)
-{
- GtkTreeSelection *selection;
- GtkTreePath *path;
- GtkTreeIter iter;
- FilterRule *rule;
-
- g_object_ref (re->current);
- rule_editor_add_undo (re, RULE_EDITOR_LOG_RANK, re->current,
- rule_context_get_rank_rule (re->context, re->current, re->source), to);
-
- d(printf ("moving %d to %d\n", from, to));
- rule_context_rank_rule (re->context, re->current, re->source, to);
-
- path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, from);
- gtk_tree_model_get_iter (GTK_TREE_MODEL (re->model), &iter, path);
- gtk_tree_path_free (path);
-
- gtk_tree_model_get (GTK_TREE_MODEL (re->model), &iter, 1, &rule, -1);
- g_assert (rule != NULL);
-
- /* remove and then re-insert the row at the new location */
- gtk_list_store_remove (re->model, &iter);
- gtk_list_store_insert (re->model, &iter, to);
-
- /* set the data on the row */
- gtk_list_store_set (re->model, &iter, 0, rule->name, 1, rule, -1);
-
- /* select the row */
- selection = gtk_tree_view_get_selection (re->list);
- gtk_tree_selection_select_iter (selection, &iter);
-
- /* scroll to the selected row */
- path = gtk_tree_model_get_path ((GtkTreeModel *) re->model, &iter);
- gtk_tree_view_scroll_to_cell (re->list, path, NULL, FALSE, 0.0, 0.0);
- gtk_tree_path_free (path);
-
- rule_editor_set_sensitive (re);
-}
-
-static void
-rule_up (GtkWidget *widget, RuleEditor *re)
-{
- int pos;
-
- d(printf ("up rule\n"));
- pos = rule_context_get_rank_rule (re->context, re->current, re->source);
- if (pos > 0)
- rule_move (re, pos, pos - 1);
-}
-
-static void
-rule_down (GtkWidget *widget, RuleEditor *re)
-{
- int pos;
-
- d(printf ("down rule\n"));
- pos = rule_context_get_rank_rule (re->context, re->current, re->source);
- if (pos >= 0)
- rule_move (re, pos, pos + 1);
-}
-
-static struct {
- char *name;
- GtkSignalFunc func;
-} edit_buttons[] = {
- { "rule_add", G_CALLBACK (rule_add) },
- { "rule_edit", G_CALLBACK (rule_edit) },
- { "rule_delete", G_CALLBACK (rule_delete) },
- { "rule_up", G_CALLBACK (rule_up) },
- { "rule_down", G_CALLBACK (rule_down) },
-};
-
-static void
-set_sensitive (RuleEditor *re)
-{
- FilterRule *rule = NULL;
- int index = -1, count = 0;
-
- while ((rule = rule_context_next_rule (re->context, rule, re->source))) {
- if (rule == re->current)
- index = count;
- count++;
- }
-
- d(printf("index = %d count=%d\n", index, count));
-
- count--;
-
- gtk_widget_set_sensitive (GTK_WIDGET (re->priv->buttons[BUTTON_EDIT]), index != -1);
- gtk_widget_set_sensitive (GTK_WIDGET (re->priv->buttons[BUTTON_DELETE]), index != -1);
- gtk_widget_set_sensitive (GTK_WIDGET (re->priv->buttons[BUTTON_UP]), index > 0);
- gtk_widget_set_sensitive (GTK_WIDGET (re->priv->buttons[BUTTON_DOWN]), index >= 0 && index < count);
-}
-
-
-static void
-cursor_changed (GtkTreeView *treeview, RuleEditor *re)
-{
- GtkTreeSelection *selection;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- selection = gtk_tree_view_get_selection (re->list);
- if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
- gtk_tree_model_get (GTK_TREE_MODEL (re->model), &iter, 1, &re->current, -1);
-
- g_assert (re->current);
-
- rule_editor_set_sensitive (re);
- }
-}
-
-static void
-double_click (GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, RuleEditor *re)
-{
- if (re->current)
- rule_edit ((GtkWidget *) treeview, re);
-}
-
-static void
-set_source (RuleEditor *re, const char *source)
-{
- FilterRule *rule = NULL;
- GtkTreeIter iter;
-
- gtk_list_store_clear (re->model);
-
- d(printf("Checking for rules that are of type %s\n", source ? source : "<nil>"));
- while ((rule = rule_context_next_rule (re->context, rule, source)) != NULL) {
- d(printf("Adding row '%s'\n", rule->name));
- gtk_list_store_append (re->model, &iter);
- gtk_list_store_set (re->model, &iter, 0, rule->name, 1, rule, -1);
- }
-
- g_free (re->source);
- re->source = g_strdup (source);
- re->current = NULL;
- rule_editor_set_sensitive (re);
-}
-
-void
-rule_editor_add_undo (RuleEditor *re, int type, FilterRule *rule, int rank, int newrank)
-{
- RuleEditorUndo *undo;
-
- if (!re->undo_active && enable_undo) {
- undo = g_malloc0 (sizeof (*undo));
- undo->rule = rule;
- undo->type = type;
- undo->rank = rank;
- undo->newrank = newrank;
-
- undo->next = re->undo_log;
- re->undo_log = undo;
- } else {
- g_object_unref (rule);
- }
-}
-
-void
-rule_editor_play_undo (RuleEditor *re)
-{
- RuleEditorUndo *undo, *next;
- FilterRule *rule;
-
- re->undo_active = TRUE;
- undo = re->undo_log;
- re->undo_log = NULL;
- while (undo) {
- next = undo->next;
- switch (undo->type) {
- case RULE_EDITOR_LOG_EDIT:
- d(printf ("Undoing edit on rule '%s'\n", undo->rule->name));
- rule = rule_context_find_rank_rule (re->context, undo->rank, undo->rule->source);
- if (rule) {
- d(printf (" name was '%s'\n", rule->name));
- filter_rule_copy (rule, undo->rule);
- d(printf (" name is '%s'\n", rule->name));
- } else {
- g_warning ("Could not find the right rule to undo against?");
- }
- break;
- case RULE_EDITOR_LOG_ADD:
- d(printf ("Undoing add on rule '%s'\n", undo->rule->name));
- rule = rule_context_find_rank_rule (re->context, undo->rank, undo->rule->source);
- if (rule)
- rule_context_remove_rule (re->context, rule);
- break;
- case RULE_EDITOR_LOG_REMOVE:
- d(printf ("Undoing remove on rule '%s'\n", undo->rule->name));
- g_object_ref (undo->rule);
- rule_context_add_rule (re->context, undo->rule);
- rule_context_rank_rule (re->context, undo->rule, re->source, undo->rank);
- break;
- case RULE_EDITOR_LOG_RANK:
- rule = rule_context_find_rank_rule (re->context, undo->newrank, undo->rule->source);
- if (rule)
- rule_context_rank_rule (re->context, rule, re->source, undo->rank);
- break;
- }
-
- g_object_unref (undo->rule);
- g_free (undo);
- undo = next;
- }
- re->undo_active = FALSE;
-}
-
-static void
-editor_response (GtkWidget *dialog, int button, RuleEditor *re)
-{
- if (button == GTK_RESPONSE_CANCEL) {
- if (enable_undo)
- rule_editor_play_undo (re);
- else {
- RuleEditorUndo *undo, *next;
-
- undo = re->undo_log;
- re->undo_log = 0;
- while (undo) {
- next = undo->next;
- g_object_unref (undo->rule);
- g_free (undo);
- undo = next;
- }
- }
- }
-}
-
-GtkWidget *rule_editor_treeview_new (char *widget_name, char *string1, char *string2,
- int int1, int int2);
-
-GtkWidget *
-rule_editor_treeview_new (char *widget_name, char *string1, char *string2, int int1, int int2)
-{
- GtkWidget *table, *scrolled;
- GtkTreeSelection *selection;
- GtkCellRenderer *renderer;
- GtkListStore *model;
-
- scrolled = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled), GTK_SHADOW_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-
- model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER);
- table = gtk_tree_view_new_with_model ((GtkTreeModel *) model);
- gtk_tree_view_set_headers_visible ((GtkTreeView *) table, FALSE);
-
- renderer = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes ((GtkTreeView *) table, -1,
- _("Rule name"), renderer,
- "text", 0, NULL);
-
- selection = gtk_tree_view_get_selection ((GtkTreeView *) table);
- gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
-
- gtk_container_add (GTK_CONTAINER (scrolled), table);
-
- g_object_set_data ((GObject *) scrolled, "table", table);
- g_object_set_data ((GObject *) scrolled, "model", model);
-
- gtk_widget_show (scrolled);
- gtk_widget_show (table);
-
- return scrolled;
-}
-
-void
-rule_editor_construct (RuleEditor *re, RuleContext *context, GladeXML *gui, const char *source, const char *label)
-{
- GtkWidget *w;
- int i;
- char *tmp;
-
- re->context = context;
- g_object_ref (context);
-
- gtk_window_set_resizable ((GtkWindow *) re, TRUE);
- gtk_window_set_default_size ((GtkWindow *) re, 350, 400);
- gtk_widget_realize ((GtkWidget *) re);
- gtk_container_set_border_width ((GtkContainer *) ((GtkDialog *) re)->action_area, 12);
-
- w = glade_xml_get_widget(gui, "rule_editor");
- gtk_box_pack_start((GtkBox *)((GtkDialog *)re)->vbox, w, TRUE, TRUE, 3);
-
- for (i = 0; i < BUTTON_LAST; i++) {
- re->priv->buttons[i] = (GtkButton *) (w = glade_xml_get_widget (gui, edit_buttons[i].name));
- g_signal_connect (w, "clicked", edit_buttons[i].func, re);
- }
-
- w = glade_xml_get_widget (gui, "rule_list");
- re->list = (GtkTreeView *) g_object_get_data ((GObject *) w, "table");
- re->model = (GtkListStore *) g_object_get_data ((GObject *) w, "model");
-
- g_signal_connect (re->list, "cursor-changed", G_CALLBACK (cursor_changed), re);
- g_signal_connect (re->list, "row-activated", G_CALLBACK (double_click), re);
-
- w = glade_xml_get_widget (gui, "rule_label");
- tmp = alloca(strlen(label)+8);
- sprintf(tmp, "<b>%s</b>", label);
- gtk_label_set_label((GtkLabel *)w, tmp);
- gtk_label_set_mnemonic_widget ((GtkLabel *) w, (GtkWidget *) re->list);
-
- g_signal_connect (re, "response", G_CALLBACK (editor_response), re);
- rule_editor_set_source (re, source);
-
- gtk_dialog_set_has_separator ((GtkDialog *) re, FALSE);
- gtk_dialog_add_buttons ((GtkDialog *) re,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- NULL);
-}
diff --git a/filter/rule-editor.h b/filter/rule-editor.h
deleted file mode 100644
index be216edf73..0000000000
--- a/filter/rule-editor.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef _RULE_EDITOR_H
-#define _RULE_EDITOR_H
-
-#include <gtk/gtk.h>
-#include <glade/glade.h>
-
-#include "rule-context.h"
-#include "filter-rule.h"
-
-#define RULE_TYPE_EDITOR (rule_editor_get_type ())
-#define RULE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RULE_TYPE_EDITOR, RuleEditor))
-#define RULE_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RULE_TYPE_EDITOR, RuleEditorClass))
-#define IS_RULE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RULE_TYPE_EDITOR))
-#define IS_RULE_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RULE_TYPE_EDITOR))
-#define RULE_EDITOR_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), RULE_TYPE_EDITOR, RuleEditorClass))
-
-typedef struct _RuleEditor RuleEditor;
-typedef struct _RuleEditorClass RuleEditorClass;
-typedef struct _RuleEditorUndo RuleEditorUndo;
-
-struct _RuleEditor {
- GtkDialog parent_object;
-
- GtkListStore *model;
- GtkTreeView *list;
-
- RuleContext *context;
- FilterRule *current;
- FilterRule *edit; /* for editing/adding rules, so we only do 1 at a time */
-
- GtkWidget *dialog;
-
- char *source;
-
- struct _RuleEditorUndo *undo_log; /* cancel/undo log */
- unsigned int undo_active:1; /* we're performing undo */
-
- struct _RuleEditorPrivate *priv;
-};
-
-struct _RuleEditorClass {
- GtkDialogClass parent_class;
-
- /* virtual methods */
- void (*set_sensitive) (RuleEditor *);
- void (*set_source) (RuleEditor *, const char *source);
-
- FilterRule *(*create_rule) (RuleEditor *);
-
- /* signals */
-};
-
-enum {
- RULE_EDITOR_LOG_EDIT,
- RULE_EDITOR_LOG_ADD,
- RULE_EDITOR_LOG_REMOVE,
- RULE_EDITOR_LOG_RANK,
-};
-
-struct _RuleEditorUndo {
- struct _RuleEditorUndo *next;
-
- unsigned int type;
- FilterRule *rule;
- int rank;
- int newrank;
-};
-
-GtkType rule_editor_get_type(void);
-RuleEditor *rule_editor_new(RuleContext *rc, const char *source, const char *label);
-
-void rule_editor_construct(RuleEditor *re, RuleContext *context, GladeXML *gui, const char *source, const char *label);
-
-/* methods */
-void rule_editor_set_source(RuleEditor *re, const char *source);
-/* calculates the sensitivity of the editor */
-void rule_editor_set_sensitive(RuleEditor *re);
-/* used internally to create a new rule appropriate for the editor */
-struct _FilterRule *rule_editor_create_rule(RuleEditor *re);
-
-#endif /* ! _RULE_EDITOR_H */
diff --git a/help/.cvsignore b/help/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/help/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/help/C/.cvsignore b/help/C/.cvsignore
deleted file mode 100644
index c35e90b546..0000000000
--- a/help/C/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Makefile
-Makefile.in
-evolution-*-C.omf.out
-omf_timestamp
diff --git a/help/C/Makefile.am b/help/C/Makefile.am
deleted file mode 100644
index ce7292d8cf..0000000000
--- a/help/C/Makefile.am
+++ /dev/null
@@ -1,80 +0,0 @@
-figs = \
- figures/contacts_mainwindow_a.png \
- figures/evo_account_info_a.png \
- figures/evo_cal_callout_a.gif \
- figures/evo_contacteditor_a.png \
- figures/evo_email_a.png \
- figures/evo_identity_a.png \
- figures/evo_mail_callout_a.gif \
- figures/evo_mail_callout_a.png \
- figures/evo_newmess_a.png \
- figures/evo_receive_setup2_a.png \
- figures/evo_receive_setup_a.png \
- figures/evo_rule_a.png \
- figures/evo_send_setup_a.png \
- figures/evo_timezone_a.png \
- figures/evo_gwreceive_a.png \
- figures/evo_imapreceive_a.png \
- figures/evo_mail_callout_a.eps \
- figures/evo_maildirreceive_a.png \
- figures/evo_mboxreceive_a.png \
- figures/evo_mereceive_a.png \
- figures/evo_mhreceive_a.png \
- figures/evo_popreceive_a.png \
- figures/evo_usereceive_a.png \
- figures/mail_mainwindow_a.png \
- figures/calendar.png \
- figures/config-cal.png \
- figures/config-mail.png \
- figures/contact-editor.png \
- figures/contact.png \
- figures/exchange-identity.png \
- figures/exchange-receive-options.png \
- figures/exchange-receive.png \
- figures/exchange-delegation.png \
- figures/filter-new-fig.png \
- figures/full-1.png \
- figures/full-2.png \
- figures/full-3.png \
- figures/full-4.png \
- figures/full-5.png \
- figures/full-6.png \
- figures/full-7.png \
- figures/mail-druid-pic.png \
- figures/mail-inbox.png \
- figures/mail-threaded.png \
- figures/mainwindow-pic.png \
- figures/newmsg.png \
- figures/replymsg.png \
- figures/schedule.png \
- figures/summary.png \
- figures/vfolder-createrule-fig.png
-figdir = figures
-
-all: $(docname).xml $(omffile)
-
-doc_in_files = evolution.xml
-%-$(BASE_VERSION).xml: $(doc_in_files)
- cp -f $< $@
-
-docname = evolution-$(BASE_VERSION)
-lang = C
-
-omf_in_files = evolution-$(lang).omf
-%-$(BASE_VERSION)-$(lang).omf: $(omf_in_files)
- cp -f $< $@
-omffile = evolution-$(BASE_VERSION)-C.omf
-
-include $(top_srcdir)/help/xmldocs.make
-dist-hook: app-dist-hook
-
-CLEANFILES += \
- $(docname).xml \
- omf_timestamp \
- $(omffile).out \
- $(omffile)
-
-EXTRA_DIST += \
- $(doc_in_files) \
- $(omf_in_files)
-
diff --git a/help/C/evolution-C.omf b/help/C/evolution-C.omf
deleted file mode 100644
index 6a6f462c2d..0000000000
--- a/help/C/evolution-C.omf
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<omf>
- <resource>
- <creator>
- Novell, Inc.
- </creator>
- <title>
- User's Guide to Evolution 2.0
- </title>
- <date>2002-2003</date>
- <subject category="GNOME|Applications"/>
- <description>
- A user's guide to Evolution which explains how to use
- its mail, calendar, addressbook, and task list features.
- </description>
- <type>
- manual
- </type>
- <format mime="text/xml" dtd="-//OASIS//DTD DocBook XML V4.1.2//EN"/>
- <identifier url="/"/>
- <language code="C"/>
- <relation seriesid="83434cc6-71d1-11d7-9b12-ef76b8cf7c8f" />
- <rights type="GNU FDL" license.version="1.1" license="http://www.gnu.org/licenses/fdl.html" holder="Novell, Inc."/>
- </resource>
-</omf>
diff --git a/help/C/evolution.xml b/help/C/evolution.xml
deleted file mode 100644
index c97d9719cd..0000000000
--- a/help/C/evolution.xml
+++ /dev/null
@@ -1,3901 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
- <!ENTITY z-3rdParty "*" >
- <!ENTITY z-SM "(SM)" >
- <!ENTITY z-CM "(CM)" >
- <!ENTITY z-CLM "(CLM)" >
- <!ENTITY z-nbhyph "-" >
- <!ENTITY z-nbspace " " >
-] >
-
-<book lang="en">
-<title>Evolution User Guide 2.0</title>
-
- <bookinfo id="Front">
- <productname>Evolution&trade;</productname>
- <productnumber>2.0</productnumber>
- <invpartnumber>September 9, 2004</invpartnumber>
- <title>User guide</title>
- </bookinfo>
-
- <preface id="preface">
- <title>About This Guide</title>
- <para>This guide describes how to use and manage Evolution&trade; 2.0.x client software. This guide is intended for users and is divided into the following sections:</para>
- <itemizedlist>
- <listitem>
- <para><link linkend="usage-mainwindow">Getting Started</link></para>
- </listitem>
- <listitem>
- <para><link linkend="usage-mail">Getting and Sending E-Mail</link></para>
- </listitem>
- <listitem>
- <para><link linkend="usage-mail-organize">Organizing Your E-Mail</link></para>
- </listitem>
- <listitem>
- <para><link linkend="usage-contact">Evolution Contacts: the Address Book</link></para>
- </listitem>
- <listitem>
- <para><link linkend="usage-calendar">Evolution Calendar</link></para>
- </listitem>
- <listitem>
- <para><link linkend="bs4tmzx">Connecting to GroupWise</link></para>
- </listitem>
- <listitem>
- <para><link linkend="usage-exchange">Connecting to Exchange Servers</link></para>
- </listitem>
- <listitem>
- <para><link linkend="config-prefs">Advanced Configuration</link></para>
- </listitem>
- <listitem>
- <para><link linkend="config-sync">Synchronizing Your Handheld Device</link></para>
- </listitem>
- <listitem>
- <para><link linkend="outlook-migration">Migration from Outlook to Evolution</link></para>
- </listitem>
- <listitem>
- <para><link linkend="menuref">Quick Reference</link></para>
- </listitem>
- <listitem>
- <para><link linkend="bugs">Known Bugs and Limitations</link></para>
- </listitem>
- </itemizedlist>
- <bridgehead>Finding Help</bridgehead>
- <para>You can find additional help in three places. </para>
- <itemizedlist>
- <listitem>
- <para>For information about command line options, open a terminal window and type <command>evolution --help</command>.</para>
- </listitem>
- <listitem>
- <para>For support, late-breaking news, and errata, visit the Novell support center at <ulink url="http://support.novell.com">support.novell.com</ulink>.</para>
- </listitem>
- <listitem>
- <para>In the Evolution interface, click Help &gt; Contents.</para>
- </listitem>
- </itemizedlist>
- <bridgehead>Documentation Updates</bridgehead>
- <para>For the most recent version of the<citetitle> Evolution 2.0 User Guide</citetitle>, see the <ulink url="http://www.novell.com/documentation/ximian.html">Evolution Documentation Web site</ulink>.</para>
- <bridgehead>Documentation Conventions</bridgehead>
- <para>In Novell documentation, a greater-than symbol (&gt;) is used to separate actions within a step and items in a cross-reference path.</para>
- <para>A trademark symbol (&reg;, &trade;, etc.) denotes a Novell trademark. An asterisk (*) denotes a third-party trademark.</para>
- </preface>
-
- <chapter id="usage-mainwindow">
- <title>Getting Started</title>
- <para>Evolution&trade; makes the tasks of storing, organizing, and retrieving your personal information easier, so you can work and communicate more effectively with others. It&apos;s a highly evolved <link linkend="groupware">groupware</link> program, an integral part of the Internet-connected desktop.</para>
- <para>Evolution can help you work in a group by handling e-mail, address, and other contact information, and one or more calendars. It can do that on one or several computers, connected directly or over a network, for one person or for large groups.</para>
- <para>With Evolution, you can accomplish your most common daily tasks faster. For example, it takes only one or two clicks to enter appointment or contact information sent to you by e-mail, or to send e-mail to a contact or appointment. Evolution makes displays faster and more efficient, so searches are faster and memory usage is lower. People who get lots of e-mail will appreciate advanced features like <link linkend="vfolder">vFolders</link>, which let you save searches as though they were ordinary e-mail folders.</para>
- <itemizedlist>
- <listitem>
- <para><link linkend="usage-mainwindow-starting">Starting Evolution for the First Time</link></para>
- </listitem>
- <listitem>
- <para><link linkend="ui-intro">About the Evolution Main Window </link></para>
- </listitem>
- </itemizedlist>
-
- <section id="usage-mainwindow-starting">
- <title>Starting Evolution for the First Time</title>
- <procedure>
- <step id="bs4u1a6">
- <para>Click the Applications Menu icon &gt; Office &gt; Evolution.</para>
- <para>or</para>
- <para>Enter <command>evolution</command> at the command line.</para>
- </step>
- </procedure>
-
- <section id="bse54o0">
- <title>Using the First-Run Assistant</title>
- <para>The first time you run Evolution, it creates a directory called evolution in your home directory, where it stores all of its local data. Then, it opens a first-run assistant to help you set up e-mail accounts and import data from other applications.</para>
- <para>Using the first-run assistant takes approximately two to five minutes.</para>
- <para>Later on, if you want to change this account, or if you want to create a new one, select Tools &gt; Settings, then click Mail Accounts. Select the account you want to change, then click Edit. Alternately, add a new account by clicking Add. See <link linkend="config-prefs-mail">Mail Preferences</link> for details.</para>
-
- <section id="first-step">
- <title>Defining Your Identity</title>
- <informalfigure id="bsj8pww">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/evo_identity_a.png"/></imageobject></mediaobject>
-
- </informalfigure>
- <para>The Identity window is the first step in the assistant. Here, you will enter some basic personal information. You can define multiple identities later by clicking Tools &gt; Settings, then click Mail Accounts. </para>
- <para>In the Identity page, you need to provide the following information:</para>
- <formalpara id="bsj74dl">
- <title>Account Information:</title>
- <para> Type a name for Evolution to use for this account. This is used only for display within Evolution. Some good examples are &ldquo;Work E-mail&rdquo; or &ldquo;IMAP Server.&rdquo;</para>
- </formalpara>
- <formalpara id="bsj74dm">
- <title>Full Name: </title>
- <para>Your full name.</para>
- </formalpara>
- <formalpara id="bsj74dn">
- <title>E-Mail Address:</title>
- <para> Your e-mail address.</para>
- </formalpara>
- <formalpara id="bsj74do">
- <title>Make This My Default Account:</title>
- <para> Select this as the primary account. </para>
- </formalpara>
- <formalpara id="bsj74dp">
- <title> Reply-To:</title>
- <para> (Optional) If you want to have replies sent to another e-mail address, specify it in this space .</para>
- </formalpara>
- <formalpara id="bsj74dq">
- <title>Organization:</title>
- <para> (Optional) The company where you work, or the organization you represent when you send e-mail.</para>
- </formalpara>
- </section>
-
- <section id="second-step">
- <title>Receiving Mail</title>
- <informalfigure id="bsj8qah">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/evo_receive_setup_a.png"/></imageobject></mediaobject>
-
- </informalfigure>
- <para>The Receiving E-mail option lets you determine where you get your e-mail. You need to specify the type of server you want to receive mail with. If you are unsure about the type of server to choose, ask your system administrator or ISP. The following is a list of server types:</para>
- <formalpara id="bsj74dr">
- <title>GroupWise:</title>
- <para> Select this option if you connect to GroupWise&reg;. GroupWise keeps e-mail, calendar, and contact information on the server.</para>
- </formalpara>
- <formalpara id="bsj74ds">
- <title>Microsoft Exchange:</title>
- <para> Available only if you have installed the Connector for Microsoft&z-3rdParty; Exchange. It allows you to connect to a Microsoft Exchange 2000 or 2003 server, which stores e-mail, calendar, and contact information on the server.</para>
- </formalpara>
- <formalpara id="bsj74dt">
- <title>IMAP:</title>
- <para> Keeps the e-mail on your server so you can access your e-mail from multiple systems.</para>
- </formalpara>
- <formalpara id="bsj74du">
- <title>POP:</title>
- <para> Downloads your e-mail to your hard disk for permanent storage, freeing up space on the e-mail server.</para>
- </formalpara>
- <formalpara id="bsj74dv">
- <title>Local Delivery:</title>
- <para> Choose this option if you want to move e-mail from the spool (the location where mail waits for delivery) and store it in your home directory. You need to provide the path to the mail spool you want to use. If you would rather leave e-mail in your system&apos;s spool files, choose the Standard Unix Mbox Spool option instead. </para>
- </formalpara>
- <formalpara id="bsj74dw">
- <title>MH Format Mail Directories:</title>
- <para> If you download your e-mail using mh or another MH-style program, you should use this option. You need to provide the path to the mail directory you want to use.</para>
- </formalpara>
- <formalpara id="bsj74dx">
- <title>Maildir Format Mail Directories:</title>
- <para> If you download your e-mail using Qmail or another maildir-style program, you should use this option. You need to provide the path to the mail directory you want to use.</para>
- </formalpara>
- <formalpara id="bsj74dy">
- <title>Standard Unix Mbox Spool or Directory:</title>
- <para> If you want to read and store e-mail in the mail spool on your local system, choose this option. You need to provide the path to the mail spool you want to use.</para>
- </formalpara>
- <formalpara id="bsj74dz">
- <title>None:</title>
- <para> Select this if you do not plan to check e-mail with this account.</para>
- </formalpara>
- <para>If you selected POP, IMAP, GroupWise, or Microsoft Exchange as your e-mail server, you&rsquo;ll need to specify additional information:</para>
- <itemizedlist>
- <listitem>
- <para>The hostname of your e-mail server. Ask your system administrator if you&apos;re not sure.</para>
- </listitem>
- <listitem>
- <para>The username for the account on that system. </para>
- </listitem>
- <listitem>
- <para>Whether you want to use a secure (SSL) connection. If your server supports it, you should enable this security option. </para>
- </listitem>
- <listitem>
- <para>The authentication options supported by your server. If you&apos;re not sure, ask your system administrator. You can also click Check for Supported Types; when you have done so, the menu limits itself to options your server supports. Some servers do not announce the authentication mechanisms they support, so clicking this button is not a guarantee that available mechanisms actually work. </para>
- </listitem>
- <listitem>
- <para>Choose whether you want Evolution to remember your password. If you have selected this item, you can force Evolution to ask for a password again by clicking Actions &gt; Forget Passwords, or by returning to this section of the accounts tool, which you can find by clickiing Tools &gt; Settings. </para>
- </listitem>
- <listitem>
- <para>If you are connecting to GroupWise, you need your SOAP port number for accessing your Address Book and Calendar.</para>
- </listitem>
- </itemizedlist>
- <tip>
- <para>Connecting to an Exchange Server</para>
- <para>If you have installed the Connector for Microsoft Exchange, you can access Microsoft Exchange 2000 servers natively. If you do not have the Connector, or if you use an older version of Microsoft Exchange, talk to your system administrator about access to standard protocol services like POP and IMAP.</para>
- </tip>
- </section>
-
- <section id="more-mail-options">
- <title>Receiving Mail Options</title>
- <para>After you have selected a mail delivery mechanism, you can set some preferences for its behavior:</para>
-
- <section id="bspcfg3">
- <title>POP Mail Preferences:</title>
- <formalpara id="bsj61c5">
- <title>Checking for New Mail:</title>
- <para> If you want Evolution to check for new e-mail automatically, select the box and specify a frequency in minutes.</para>
- </formalpara>
- <formalpara id="bsj61c6">
- <title>Message Storage:</title>
- <para> If you want to store copies of your e-mail on the server, select this option.</para>
- </formalpara>
- </section>
-
- <section id="bspcfn3">
- <title>Microsoft Exchange Preferences:</title>
- <formalpara id="bsj61c7">
- <title>Checking for New Mail:</title>
- <para> If you want Evolution to check for new e-mail automatically, select the box and specify a frequency in minutes.</para>
- </formalpara>
- <formalpara id="bsj61c8">
- <title>Global Address List/Active Directory:</title>
- <para> Specify the name of your global catalog server. You can also choose to limit the server&apos;s responses and select a maximum number of results for an address search. Limiting the number of results limits the load on your system and on your network.</para>
- </formalpara>
- <formalpara id="bsj61c9">
- <title>Mailbox Name:</title>
- <para> If your Active Directory&z-3rdParty; user name is different from your Exchange mailbox name, specify the mailbox name here.</para>
- </formalpara>
- <formalpara id="bsj61ca">
- <title>Outlook Web Access (OWA) Path:</title>
- <para> In most cases, the URL for Web access is <varname>http://server.company.com/exchange</varname>, but some systems use a different path. </para>
- </formalpara>
- <formalpara id="bsj61cb">
- <title>Public Folder Server:</title>
- <para> Specify the name of your organization&apos;s public folder server, if any.</para>
- </formalpara>
- <formalpara id="bsj61cc">
- <title>Apply Filters to New Messages in Inbox on This Server:</title>
- <para> Select this option to use filters when you visit the Inbox for this account.</para>
- </formalpara>
- </section>
-
- <section id="bspcfys">
- <title>IMAP Preferences</title>
- <formalpara id="bsj5y9b">
- <title>Automatically Check for New Mail Every &hellip; Minutes:</title>
- <para> If you want Evolution to check for new e-mail automatically, select the option and specify a frequency in minutes.</para>
- </formalpara>
- <formalpara id="bsj5y9c">
- <title>Check for New Messages in All Folders:</title>
- <para> If you want Evolution to check for new messages in all your IMAP folders, select the option. This option is normally selected in combination with server-side filtering tools like procmail. </para>
- </formalpara>
- <formalpara id="bsj5y9d">
- <title>Use Custom Command to Connect to Server:</title>
- <para> Some IMAP servers require a specific custom connection sequence. Custom commands are rare; if your server requires one, your system administrator should be able to tell you.</para>
- </formalpara>
- <formalpara id="bsj5y9e">
- <title>Show Only Subscribed Folders:</title>
- <para> Select this option if you have more folders in your IMAP view than you want to read. For more information about IMAP mail and folder subscriptions, see <link linkend="usage-mail-subscriptions">IMAP Subscriptions Manager</link>.</para>
- </formalpara>
- <formalpara id="bsj5y9f">
- <title>Override Server-Supplied Namespace: </title>
- <para>If you specify a specific directory where your server stores e-mail for you. The most common values are &ldquo;mail&rdquo; and &ldquo;Mail.&rdquo;</para>
- </formalpara>
- <formalpara id="bsj5y9g">
- <title>Apply Filters to New Messages in Inbox on This Server:</title>
- <para> If you want your filters to work on this account as well as on locally downloaded e-mail, select this option.</para>
- </formalpara>
- <formalpara id="bsj5y9h">
- <title>Check New Messages for Junk Contents:</title>
- <para> Select this option if you want your IMAP e-mail filtered for junk mail.</para>
- </formalpara>
- <formalpara id="bsj5y9i">
- <title>Only Check for Junk Messages in the Inbox Folder:</title>
- <para> If you have new messages arriving in multiple folders, as you would with server-side filters, Evolution can also filter them for junk mail. This can take extra time, so if you know that those messages are not likely to be junk mail, select this option.</para>
- </formalpara>
- <formalpara id="bsj5y9j">
- <title>Automatically Synchronizing Remote Mail Locally: </title>
- <para>Select this option to have Evolution cache mail locally for offline use.</para>
- </formalpara>
- <note>
- <para>For IMAP mail servers, your system administrator might provide you with a specific namespace, which is the directory where your server stores mail for you. If you check your IMAP mail and your folder list includes files that don&rsquo;t look like mail folders, you probably need to change your mail namespace. Typical values are "mail" and "Mail.&rdquo; If you prefer, you can choose to subscribe to individual mail folders one at a time. For more information about how to use IMAP mail, see <link linkend="usage-mail-subscriptions">IMAP Subscriptions Manager</link>.</para>
- </note>
- </section>
-
- <section id="bspcge6">
- <title>GroupWise Preferences:</title>
- <informalfigure id="bsj8qhd">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/evo_receive_setup2_a.png"/></imageobject></mediaobject>
-
- </informalfigure>
- <formalpara id="bsj6zaj">
- <title>Automatically Check for New Mail Every &hellip; Minutes:</title>
- <para> If you want Evolution to check for new mail automatically, select the option and specify a frequency in minutes.</para>
- </formalpara>
- <formalpara id="bsj6zak">
- <title>Check for New Messages in All Folders:</title>
- <para> If you want Evolution to check for new messages in all your GroupWise folders, select this option. This option is normally selected by default.</para>
- </formalpara>
- <formalpara id="bsj6zal">
- <title>Apply Filters to New Messages in INBOX on This Server:</title>
- <para> If you want your filters to work on this account as well as on locally downloaded mail, select this option.</para>
- </formalpara>
- <formalpara id="bsj6zam">
- <title>Automatically Synchronize Remote Mail Locally:</title>
- <para> Select this option to have Evolution cache mail locally for offline use.</para>
- </formalpara>
- <formalpara id="bsj8r2s">
- <title>Post Ofice Agent: </title>
- <para>The address of the POA server.</para>
- </formalpara>
- <formalpara id="bsj6zan">
- <title>Post Office Agent SOAP Port:</title>
- <para> Type the port number for your SOAP server. If you do not know the port number, contact your system administrator. The default SOAP port is 7181.</para>
- </formalpara>
- </section>
- </section>
-
- <section id="third-step">
- <title>Sending Mail</title>
- <para>Now that you have entered information about how you plan to get mail, Evolution needs to know about how you want to send it. The following is a list of types of servers you can use to send mail:</para>
- <informalfigure id="bsj8ujq">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/evo_send_setup_a.png"/></imageobject></mediaobject>
-
- </informalfigure>
- <formalpara id="bsj6zao">
- <title>SMTP:</title>
- <para> Sends mail using an outbound mail server. This is the most common choice for sending mail.</para>
- </formalpara>
- <formalpara id="bsj6zap">
- <title>Sendmail:</title>
- <para> Uses the Sendmail program to send mail from your system. Sendmail is more flexible, but is not as easy to configure, so you should select this option only if you know how to set up a Sendmail service.</para>
- </formalpara>
- <para>If you choose SMTP, there are a few additional items to enter:</para>
- <formalpara id="bsj6zaq">
- <title>Host:</title>
- <para> Specify your mail sending server&apos;s name or IP address.</para>
- </formalpara>
- <formalpara id="bsj6zar">
- <title>Server Requires Authentication:</title>
- <para> If your server requires you to enter a password to send mail, select this option.</para>
- </formalpara>
- <formalpara id="bsj6zas">
- <title>Authentication Type:</title>
- <para> Unless you&apos;ve been told otherwise, should leave this set to Password. If you&apos;re not sure, ask your system administrator, ISP, or have Evolution check for you by selecting Check for Supported Types.</para>
- </formalpara>
- <formalpara id="bsj6zat">
- <title>Username:</title>
- <para> The account name you use when you log in to check your e-mail. Normally, this is the part of your e-mail address before the @ character. For Exchange servers, it is the username you use to log in to a Windows workstation at your company.</para>
- </formalpara>
- <formalpara id="bsj6zau">
- <title>Remember Password:</title>
- <para> If you prefer to not enter your password every time you check e-mail, select this option.</para>
- </formalpara>
- <para>If you choose Sendmail or GroupWise, there is one additional item to enter:</para>
- <formalpara id="bsj6zav">
- <title>User Secure Connection (SSL):</title>
- <para> You can connect to your server securely. Select one of the following: Always, Whenever Possible, or Never.</para>
- </formalpara>
- </section>
-
- <section id="step-three-b">
- <title>Timezone</title>
- <para>In this step, you need to select your time zone either on the map or select from the time zone drop-down list.</para>
- <informalfigure id="bsj8v15">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/evo_timezone_a.png"/></imageobject></mediaobject>
-
- </informalfigure>
- </section>
-
- <section id="fourth-step">
- <title>Importing Mail (Optional)</title>
- <para>If Evolution finds e-mail or address files from another application, it offers to import them. For a full description of the import feature, see <link linkend="importing-mail">Importing Single Files</link>.</para>
- <para>Microsoft Outlook, and versions of Outlook Express after version 4, use proprietary formats that Evolution cannot read or import. To import information, you may wish to use the Export tool under Windows. See the instructions in <link linkend="outlook-migration-mail">Migrating Local Outlook Mail Folders</link>.</para>
- <para>Before importing e-mail from Netscape, make sure you have selected File &gt; Compact All Folders. If you don&rsquo;t, Evolution will import and undelete the messages in your Trash folders.</para>
- <tip>
- <para>Exporting Files From Evolution</para>
- <para>Evolution uses standard file types for e-mail and calendar information, so you can copy those files from your <command>~/.evolution</command> directory. The file formats used are <command>mbox</command> for e-mail and <command>iCal</command> for calendar information.</para>
- <para>Contacts files are stored in a database, but can be saved as a standard <command>VCard</command>. To export contact data, open your contacts tool and select the contacts you wish to export (press Ctrl+A to select them all). Click File &gt; Save as VCard. </para>
- </tip>
- </section>
- </section>
- </section>
-
- <section id="bsekq8r">
- <title>Command Line Options</title>
- <para>Evolution has a number of command line options that you can use. You can find the full list by typing the command <command>man evolution</command> or <command>evolution --help</command>. The most important command line options are: </para>
- <informaltable>
- <tgroup cols="2">
- <colspec colwidth="2.844in" colname="1" colnum="1"/>
- <colspec colwidth="2.844in" colname="2" colnum="2"/>
- <thead>
- <row id="bsl8i01">
- <entry colname="1">
- <para>Command</para>
- </entry>
- <entry colname="2">
- <para>Discription</para>
- </entry>
- </row>
- </thead>
- <tbody>
- <row id="bsl8i02">
- <entry colname="1">
- <para><command>evolution --offline</command></para>
- </entry>
- <entry colname="2">
- <para>Starts Evolution in offline mode.</para>
- </entry>
- </row>
- <row id="bsl8i03">
- <entry colname="1">
- <para>evolution mailto:<varname>joe@somewhere.net</varname></para>
- </entry>
- <entry colname="2">
- <para>Starts Evolution and begins composing a message to the e-mail address listed.</para>
- </entry>
- </row>
- <row id="bsl8i04">
- <entry colname="1">
- <para><command>evolution -c mail</command></para>
- </entry>
- <entry colname="2">
- <para>Starts Evolution in mail mode.</para>
- </entry>
- </row>
- <row id="bsl8i05">
- <entry colname="1">
- <para><command>evolution -c calendar</command></para>
- </entry>
- <entry colname="2">
- <para>Starts Evolution in calendar mode.</para>
- </entry>
- </row>
- <row id="bsl8i06">
- <entry colname="1">
- <para><command>evolution -c contacts</command></para>
- </entry>
- <entry colname="2">
- <para>Starts Evolution in contacts mode.</para>
- </entry>
- </row>
- <row id="bsl8i07">
- <entry colname="1">
- <para><command>evolution --force-shutdown</command></para>
- </entry>
- <entry colname="2">
- <para>Forces every part of Evolution to shutdown immediately. </para>
- </entry>
- </row>
- <row id="bsl8i08">
- <entry colname="1">
- <para><command>evolution&rdquo;%s&rdquo;</command></para>
- </entry>
- <entry colname="2">
- <para>Makes Evolution your default e-mail handler for your Web browser and in the GNOME Control Center.</para>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </section>
-
- <section id="ui-intro">
- <title>About the Evolution Main Window </title>
- <para>Now that the first-run configuration has finished, you&apos;re ready to begin using Evolution. Here&apos;s a quick explanation of what&apos;s happening in your main Evolution window.</para>
- <informalfigure id="bsaelj0">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/evo_mail_callout_a.png"/></imageobject></mediaobject>
-
- </informalfigure>
- <para> <emphasis>Menu Bar</emphasis></para>
- <para>The menu bar gives you access to nearly all of Evolution features. For additional information, see <link linkend="usage-mainwindow-menubar">The Menu Bar</link>.</para>
- <para><emphasis>Toolbar</emphasis></para>
- <para>The toolbar gives you fast and easy access to the frequently used features in each component.</para>
- <para><emphasis>Shortcut Bar</emphasis></para>
- <para>The shortcut bar lets you switch between folders and between Evolution tools. At the bottom of the shortcut bar there are buttons that let you switch tools, and above that is a list of all the available folders for the current tool. If you have the Evolution Connector for Microsoft Exchange installed, you have an Exchange button in addition to buttons for the other tools. For additional information, see <link linkend="usage-mainwindow-shortcutbar">The Shortcut Bar</link>.</para>
- <para><emphasis>Status Bar</emphasis></para>
- <para>The status bar periodically displays a message, or tells you the progress of a task. This most often happens when you&apos;re checking or sending e-mail. These progress queues are shown here, in the status bar. The Online/Offline indicator is here, too, in the lower left of the window.</para>
- <para><emphasis>Search Tool</emphasis></para>
- <para>The search tool lets you search through your e-mail to easily find what you&rsquo;re looking for.</para>
-
- <section id="usage-mainwindow-shortcutbar">
- <title>The Shortcut Bar</title>
- <para>Evolution&apos;s most important job is to give you access to your information and help you use it quickly. One way it does that is through the shortcut bar, the column on the left side of the main window. The buttons, such as Mail and Contacts, are the shortcuts. Above them is a list of folders for the current Evolution tool.</para>
- <para>The folder list organizes your e-mail, calendars, contact lists, and task lists in a tree, similar to a <link linkend="filetree">file tree</link>. Most people will find one to four folders at the base of the tree, depending on the tool and their system configuration. Each Evolution tool has at least one, called On This Computer, for local information. For example, the folder list for the e-mail tool shows any remote e-mail storage you have set up, plus local folders and vFolders, or virtual folders, discussed in <link linkend="usage-mail-organize-vfolders">Using vFolders</link>. </para>
- <para>If you get large amounts of e-mail, you might want more folders than just your Inbox; you can also create multiple calendar, task, or contacts folders. </para>
- <para>To create a new folder:</para>
- <procedure>
- <step id="bs7fael">
- <para>Right-click on the list of folders, then click New Folder.</para>
- </step>
- <step id="bs7faof">
- <para>Type the name of the folder in the Folder Name field.</para>
- </step>
- <step id="bs7faud">
- <para>Select the location of the new folder.</para>
- </step>
- </procedure>
-
- <section id="subfolders">
- <title>Arranging Folders and Subfolders</title>
- <para>Right-click a folder or subfolder to display a menu with the following options:</para>
- <formalpara id="bs7fblp">
- <title>Copy: </title>
- <para>Copies the folder to a different location. When you select this item, Evolution offers a choice of locations to copy the folder to.</para>
- </formalpara>
- <formalpara id="bs7fc7y">
- <title>Move: </title>
- <para>Moves the folder to another location. </para>
- </formalpara>
- <formalpara id="bs7fcl4">
- <title>Delete: </title>
- <para>Deletes the folder and all its contents. </para>
- </formalpara>
- <formalpara id="bs7fcsr">
- <title>New Folder: </title>
- <para>Creates another folder in the same location. </para>
- </formalpara>
- <formalpara id="bs7fd3u">
- <title>Rename: </title>
- <para>Changes the name of the folder. </para>
- </formalpara>
- <formalpara id="bs7fdb9">
- <title>Deletes: </title>
- <para>Deletes the folder.</para>
- </formalpara>
- <formalpara id="bs7fdja">
- <title>Properties: </title>
- <para>Checks the number of total and unread messages in a folder, and, for remote folders, lets you select whether to copy the folder to your local system for offline operation.</para>
- </formalpara>
- <para>You can also rearrange folders and messages by dragging and dropping them.</para>
- <para>Any time new e-mail arrives in a e-mail folder, that folder label is displayed in bold text, along with the number of new messages in that folder.</para>
- </section>
- </section>
-
- <section id="usage-mainwindow-menubar">
- <title>The Menu Bar</title>
- <para>The menu bar&apos;s contents always provide all the possible actions for any given view of your data. If you&rsquo;re looking at your Inbox, most of the menu items relate to e-mail; some will relate to other components of Evolution and some, especially those in the File menu, relate to the application as a whole. </para>
- <formalpara id="bs7g1fu">
- <title>File: </title>
- <para>Anything related to a file or to the operations of the application usually falls under this menu, such as creating things, saving them to disk, printing them, and quitting the program itself. </para>
- </formalpara>
- <formalpara id="bs7g25f">
- <title>Edit: </title>
- <para>Holds useful tools that help you edit text and move it around.</para>
- </formalpara>
- <formalpara id="bs7g2ew">
- <title>View: </title>
- <para>Lets you decide how Evolution should look. Some of the features control the appearance of Evolution as a whole, and others the way a particular kind of information appears.</para>
- </formalpara>
- <formalpara id="bs7g2jk">
- <title>Actions: </title>
- <para>Holds actions that can be applied to a message. If there is only one target for the action, such as replying to a message, you can normally find it in the Actions menu.</para>
- </formalpara>
- <formalpara id="bs7g2vh">
- <title>Tools: </title>
- <para>Lets you access the settings and configuration options in the Tools menu. You can also find things like filter settings and the Virtual Folder editor.</para>
- </formalpara>
- <formalpara id="bs7g3bu">
- <title>Search: </title>
- <para>Lets you search for messages, or for phrases within a message. You can also see previous searches you have made. In addition to the Search menu, there is a text entry box in the toolbar that you can use to search for messages.</para>
- </formalpara>
- <formalpara id="bs7g3gq">
- <title>Help: </title>
- <para>Opens the Evolution Help files.</para>
- </formalpara>
- </section>
-
- <section id="basics-mail">
- <title>Introducing E-Mail</title>
- <para>Evolution e-mail is like other e-mail programs in several ways:</para>
- <itemizedlist>
- <listitem>
- <para>It can sort and organize your e-maile-mail in a wide variety of ways with folders, searches, and filters. </para>
- </listitem>
- <listitem>
- <para>It can send and receive e-mail in HTML or as plain text, and makes it easy to send and receive multiple file attachments. </para>
- </listitem>
- <listitem>
- <para>It supports multiple e-mail sources, including <link linkend="imap">IMAP</link>, <link linkend="pop">POP3</link>, and local mbox or mh spools and files created by other e-mail programs.</para>
- </listitem>
- <listitem>
- <para>It lets you guard your privacy with encryption.</para>
- </listitem>
- </itemizedlist>
- <para>However, Evolution has some important differences from other e-mail programs. First, it&rsquo;s built to handle very large amounts of e-mail. The <link linkend="usage-mail-organize-spam">junk e-mail</link>, message <link linkend="usage-mail-organize-filters">filtering</link> and <link linkend="usage-mail-organize-search">searching</link> functions were built for speed and efficiency on large volumes of e-mail. There&apos;s also the <link linkend="usage-mail-organize-vfolders">vFolder</link>, an advanced organizational feature not found in some e-mail clients. If you get a lot of e-mail, or if you keep every message you get in case you need to refer to it later, you&apos;ll find this feature especially useful. Here&apos;s a quick explanation of what&apos;s happening in your main Evolution e-mail window. </para>
- <informalfigure id="usage-mail-intro-fig">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/mail_mainwindow_a.png"/></imageobject></mediaobject>
-
- </informalfigure>
- <para><emphasis>E-Mail List</emphasis></para>
- <para>The message list displays all the e-mails that you have. This includes all your read and unread messages, and e-mail that is flagged to be deleted.</para>
- <para><emphasis>E-Mail Preview</emphasis></para>
- <para>This is where your e-mail is displayed.</para>
- <para>If you find the view pane too small, you can resize the pane, enlarge the whole window, or double-click the message in the message list to have it open in a new window. To change the size of a pane, drag on the divider between the two panes. </para>
- <para>As with folders, you can right-click messages in the message list and get a menu of possible actions, including moving or deleting them, creating filters or vFolders based on them, and marking them as junk mail.</para>
- <para>Most of the e-mail-related actions you want to perform are listed in the Actions menu in the menu bar. The most frequently used ones, like Reply and Forward, also appear as buttons in the toolbar. Most of them are also located in the right-click menu and as keyboard shortcuts.</para>
- <para>For an in-depth guide to the e-mail capabilities of Evolution, read <link linkend="usage-mail">Getting and Sending E-Mail</link>.</para>
- </section>
-
- <section id="basics-calendar">
- <title>Introducing the Calendar</title>
- <para>To begin using the calendar, click Calendar in the shortcut bar. By default, the calendar shows today&apos;s schedule on a ruled background. At the upper right, there&apos;s a monthly calendar you can use to switch days. Below that, there&rsquo;s a Task pad, where you can keep a list of tasks separate from your calendar appointments.</para>
- <informalfigure id="usage-calendar-fig">
- <mediaobject><imageobject><imagedata format="GIF" fileref="figures/evo_cal_callout_a.gif"/></imageobject></mediaobject>
-
- </informalfigure>
- <para><emphasis>Appointment List</emphasis></para>
- <para>The appointment list displays all your scheduled appointments.</para>
- <para><emphasis>Task List</emphasis></para>
- <para>Tasks are distinct from appointments because they generally don&rsquo;t have times associated with them. You can see a larger view of your task list by clicking Tasks in the shortcut bar.</para>
- <para><emphasis>Month Pane</emphasis></para>
- <para>The month pane is a small view of a calendar month. To display additional months, drag the column border to the left. You can also select a range of days in the month pane to display a custom range of days in the appointment list.</para>
- <para>For more information about the calendar, see <link linkend="usage-calendar">Evolution Calendar</link>.</para>
- </section>
-
- <section id="basics-contacts">
- <title>Using the Contacts Tool</title>
- <para>The Evolution contacts tool can handle all of the functions of an address book or phone book. However, it&rsquo;s easier to update Evolution than it is to change an actual paper book, in part because Evolution can synchronize with Palm OS devices and use <link linkend="ldap">LDAP</link> directories on a network.</para>
- <para>Another advantage of the Evolution contacts tool is its integration with the rest of the application. For example, you can right-click on an e-mail address in Evolution mail to create a contact entry instantly.</para>
- <para>To use the contacts tool, click Contacts in the shortcut bar. By default, the display shows all your contacts in alphabetical order, in a <link linkend="minicard">minicard</link> view. You can select other views from the View menu, and adjust the width of the columns by clicking and dragging the gray column dividers.</para>
- <para>The contacts tool looks like this:</para>
- <informalfigure id="usage-contact-fig">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/contacts_mainwindow_a.png"/></imageobject></mediaobject>
-
- </informalfigure>
- <para><emphasis>Contact List</emphasis></para>
- <para>The largest section of the contacts display shows a list of individual contacts. You can also search the contacts in the same way that you search e-mail folders, using the search tool on the right side of the toolbar.</para>
- <para>For detailed instructions on how to use the address book, read <link linkend="usage-contact">Evolution Contacts: the Address Book</link></para>
- </section>
- </section>
- </chapter>
-
- <chapter id="usage-mail">
- <title>Getting and Sending E-Mail</title>
- <para>This section, and <link linkend="usage-mail-organize">Organizing Your E-Mail</link>, provides you with an in-depth guide to the capabilities of Evolution&trade; as a mail client. For information about how to customize your mail account, see <link linkend="config-prefs-mail">Mail Preferences</link>.</para>
- <itemizedlist>
- <listitem>
- <para><link linkend="usage-mail-getnsend-read">Reading Mail</link></para>
- </listitem>
- <listitem>
- <para><link linkend="usage-mail-getnsend-get">Checking for New Mail</link></para>
- </listitem>
- <listitem>
- <para><link linkend="usage-mail-getnsend-send">Composing New E-Mail Messages</link></para>
- </listitem>
- <listitem>
- <para><link linkend="rsvp-stuff">Sending Invitations by Mail</link></para>
- </listitem>
- <listitem>
- <para><link linkend="usage-mail-subscriptions">IMAP Subscriptions Manager</link></para>
- </listitem>
- <listitem>
- <para><link linkend="encryption">Encryption</link></para>
- </listitem>
- </itemizedlist>
-
- <section id="usage-mail-getnsend-read">
- <title>Reading Mail</title>
- <para>If you are not already viewing mail, switch to the mail tool by clicking Mail in the shortcut bar. To read a message, select it in the message list; if you&apos;d like to see it in its own window, either double-click it, press Enter, or press Ctrl+O.</para>
- <tip>
- <para>To read mail with the keyboard, you can click the Spacebar to page down while you&rsquo;re reading an e-mail, and press Backspace to page up in an e-mail. </para>
- <para>Navigate the message list by using the arrow keys on the keyboard. To go to the next and previous unread messages, press the period (.) or comma (,) keys. On most keyboards, these keys are also marked with the &gt; and &lt; symbols, which is a convenient way to remember that they move you forward and backward in your message list. You can also use the close bracket (]) for the next unread message, and the open bracket ([) for the previous unread message.</para>
- </tip>
-
- <section id="usage-mail-listorder">
- <title>Sorting the Message List</title>
- <para>Evolution helps you work by letting you sort your e-mail. To sort by sender, subject, or date, click on the bars with those labels at the top of the message list. The direction of the arrow next to the label indicates the direction of the sort. Click again, to sort them in reverse order. For example, click Date to sort messages by date from oldest to newest. Click again, and Evolution sorts the list from newest to oldest. You can also right-click the message header bars to get a set of sorting options, and to add or remove columns from the message list. You can find detailed instructions on how to customize your message display columns in <link linkend="usage-mail-organize-columns">Sorting Mail with Column Headers</link>.</para>
- <para>To look at the complete headers for a message, click View &gt; Message Display &gt; Show Full Headers. To see all message data, click View &gt; Message Display &gt; Show E-Mail Source. </para>
- <para>You can also choose a threaded message view. Click View &gt; Threaded Message List to turn the threaded view on or off. When you select this option, Evolution groups the replies to a message with the original, so you can follow the thread of a conversation from one message to the next.</para>
- <informalfigure id="bs4aw7h">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/mail-threaded.png"/></imageobject></mediaobject>
-
- </informalfigure>
- </section>
-
- <section id="usage-mail-getnsend-delete">
- <title>Deleting Mail</title>
- <para>After you read your mail, you might want to delete it. To delete a message, select it and press the Delete key, click the Trash button, or right-click the message, then click Delete. </para>
- <para>When you press Delete or click the Trash button, your mail isn&rsquo;t actually deleted, but is marked for deletion. Your e-mail is recoverable until you have expunged your mail. When you expunge a folder, you remove all the mail that you have marked for deletion. To show deleted messages, click View &gt; Hide Deleted Messages. You can also find deleted messages in the your Trash folder. </para>
- <para>To permanently erase all the deleted messages in a folder, click Actions &gt; Expunge or press Ctrl+E. To expunge all folders at once, click Actions &gt; Empty Trash.</para>
- <para>The trash is actually a vFolder.Both local and IMAP Trash folders are actually vFolders that display all messages you have marked for later deletion. For more information about vFolders, see <link linkend="usage-mail-organize-vfolders">Using vFolders</link>. Because emptying your trash expunges the messages in your Trash folder, emptying Trash is the same as expunging deleted mail from all your folders.</para>
- <para>This is not, however, true for the Trash folder on Exchange servers, which behaves just the same as it does in Outlook, it is a normal folder with actual messages in it.</para>
- </section>
-
- <section id="usage-mail-getnsend-undelete">
- <title>Undeleting Messages</title>
- <para>You can undelete a message that has been deleted but not expunged. To undelete a message, select the message, then Ctrl+U, or click Edit &gt; Undelete.</para>
- <para>If you have marked a message for deletion, undeleting it unmarks it, and the message is removed from the Trash folder. You cannot undelete messages that have been expunged. </para>
- </section>
- </section>
-
- <section id="usage-mail-getnsend-get">
- <title>Checking for New Mail</title>
- <para>To check your mail, click Send/Receive in the toolbar. If you haven&apos;t created any mail accounts yet, the setup assistant asks you for the information it needs to check your e-mail. For information on creating mail accounts, see <link linkend="usage-mainwindow-starting">Starting Evolution for the First Time</link>.</para>
- <para>If this is your first time checking mail, or you haven&apos;t asked Evolution to store your password, you are prompted for the password. Enter your password download your e-mail.</para>
- <para>If you get an error message instead of mail, you probably need to check your network settings. To learn how to do that, see <link linkend="config-prefs-mail">Mail Preferences</link>, or ask your system administrator. </para>
-
- <section id="bsempjs">
- <title>Sharing Mailboxes with Other Mail Programs</title>
- <para>If you want to use Evolution and another e-mail client, such as Mutt, at the same time, use the following procedure:</para>
- <procedure>
- <step id="bsen3rq">
- <para>Download your mail in the other application as you would normally.</para>
- </step>
- <step id="bsen3u8">
- <para>In Evolution, click Tools &gt; Settings then click Mail Accounts. Select the account you want to use to share mail and click Edit. You might want to create a new account just for this source of mail by clicking New.</para>
- </step>
- <step id="bsen3wh">
- <para>Under the Receiving Mail tab, select the type of mail file that your other mail application uses, then specify the full path to that location. A typical choice would be mbox files, with the path /home/<varname>username</varname>/Mail/.</para>
- </step>
- <step id="bsen3yh">
- <para>Click OK.</para>
- </step>
- </procedure>
- </section>
-
- <section id="usage-mail-getnsend-get-news">
- <title>Using Evolution for News</title>
- <para>USENET newsgroups are similar to mail, so it&apos;s often convenient to read news and mail side by side. You can add a news source, called an NNTP server, the same way you would a new e-mail account, selecting USENET News as the source type. The news server appear as a remote mail server, and each news group works like an IMAP folder. When you click Send/Receive, Evolution also checks for news messages.</para>
- <para>To subscribe to a news group, click Tools &gt; Subscribe To Folders, select your NNTP account, then select the groups you want to subscribe to.</para>
- </section>
-
- <section id="usage-mail-getnsend-get-attach">
- <title>Working with Attachments and HTML Mail</title>
- <para>If someone sends you an <link linkend="attachment">attachment</link>, Evolution displays the file icon at the end of the message to which it&apos;s attached. Text, including HTML formatting and embedded images, appears as part of the message, rather as a separate attachment.</para>
-
- <section id="usage-mail-getnsend-get-attach-actions">
- <title>Saving or Opening Attachments</title>
- <para>If you get an attachment with an e-mail message, Evolution can help you save it or open it with the appropriate applications.</para>
- <para>To save an attachment to disk:</para>
- <procedure>
- <step id="bsen45z">
- <para>Click the down-arrow on the attachment icon, then click Save As.</para>
- </step>
- <step id="bsen4bg">
- <para>Select a location and name for the file.</para>
- </step>
- <step id="bsen4do">
- <para>Click OK.</para>
- </step>
- </procedure>
- <para>To open an attachment using another application: </para>
- <procedure>
- <step id="bsen4ia">
- <para>Click the down-arrow on the attachment icon.</para>
- </step>
- <step id="bsen4kb">
- <para>Select the program to open the attachment.</para>
- </step>
- </procedure>
- <para>The options available for an attachment vary depending on the type of attachment and the applications your system has installed. For example, attached word processor files can be opened in OpenOffice.org or another word processor, while compressed archive files can be opened in the File Roller application.</para>
- </section>
-
- <section id="usage-mail-getnsend-get-attach-html">
- <title>Inline Images in HTML Mail</title>
- <para>When someone sends you HTML mail that includes an image in the body of the message (for example, the welcome message in your Inbox), Evolution displays the image inside the message. You can create messages like this by using the Insert Image tool in the message composer. Alternately, just drag an image into the message composition area.</para>
- <para>Some images are links in a message, rather than being part of the message. Evolution can download those images from the Internet, but does not do so unless you request it specifically. This is because remotely hosted images can be slow to load and display, and can even be used by spammers to track who reads the e-mail. Not loading images automatically helps protect your privacy.</para>
- <para>To load the images for one message:</para>
- <procedure>
- <step id="bsen9jh">
- <para>Click View &gt; Message Display &gt; Load Images.</para>
- </step>
- </procedure>
- <para>To set the default action for loading images:</para>
- <procedure>
- <step id="bsenabn">
- <para>Click Tools &gt; Settings, then click Mail Preference.</para>
- </step>
- <step id="bsenajw">
- <para>Click the HTML Mail tab.</para>
- </step>
- <step id="bsenaou">
- <para>Select one of the items: Never Load Images Off the Net, Load Images in Mail From Contacts, or Always Load Images Off the Net.</para>
- </step>
- <step id="bsenb3x">
- <para>Click Close.</para>
- </step>
- </procedure>
- <para>If you use an HTTP proxy (as in many large organizations), Evolution must be able to find it through the gnome-vfs subsystem before it can load images from the Internet.</para>
- <para> To set your proxy in KDE:</para>
- <procedure>
- <step id="bsenco2">
- <para>Click the menu icon &gt; System &gt; Configuration &gt; Yast.</para>
- </step>
- <step id="bsendck">
- <para>Click Network Services, then click Proxy.</para>
- </step>
- <step id="bsendfs">
- <para>Specify your proxy settings (if you don&apos;t know your proxy settings, contact your ISP or system administrator).</para>
- </step>
- <step id="bsfkfjy">
- <para>Click Finish, then click Close.</para>
- </step>
- </procedure>
- <para>To set your proxy in GNOME:</para>
- <procedure>
- <step id="bsfkg0z">
- <para>Click System &gt; Administrative Settings (enter your root password if needed).</para>
- </step>
- <step id="bsfkyen">
- <para>Click Network Services, then click Proxy.</para>
- </step>
- <step id="bsfkhdi">
- <para>Specify your proxy settings (if you don&apos;t know your proxy settings, contact your ISP or system administrator).</para>
- </step>
- <step id="bsfkhio">
- <para>Click Finish, then click Close.</para>
- </step>
- </procedure>
- </section>
- </section>
- </section>
-
- <section id="usage-mail-getnsend-send">
- <title>Composing New E-Mail Messages</title>
- <para>You can start writing a new e-mail message by clicking File &gt; New &gt; Mail Message, or, while you are in the Mail tool, pressing Ctrl+N, or by clicking New in the toolbar.</para>
- <informalfigure id="usage-mail-newmsg-fig">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/evo_newmess_a.png"/></imageobject></mediaobject>
-
- </informalfigure>
- <para>Enter an address in the To field. If you want, enter a subject in the Subject field, and a message in the box at the bottom of the window. After you have written your message, click Send.</para>
-
- <section id="usage-mail-getnsend-send-charsets">
- <title>Unicode, ASCII, and Non-Latin Alphabets</title>
- <para>If you want to write in a non-Latin alphabet while using a Latin keyboard, try selecting a different input method in the message composer. Right-click in the message composition area and select from the Input Methods menu, then begin typing. The actual keys vary by language and input style. For example, the Cyrillic input method uses transliterated Latin keyboard combinations to get the Cyrillic alphabet, combining letters where necessary. &ldquo;Zh&rdquo; and &ldquo;ya&rdquo; produce the appropriate single Cyrillic letters, and the single-quote (&lsquo;) produces a soft-sign character.</para>
- <para>For greater language display capabilities, click Tools &gt; Settings, then select the character set choices in the Mail Preferences and Composer Preferences sections. If you aren&apos;t sure which one to use, select UTF-8, which offers the greatest range of character displays for the greatest range of languages.</para>
-
- <section id="bsfnqkj">
- <title>Using Character Sets</title>
- <para>A character set is a computer&apos;s version of an alphabet. In the past, the ASCII character set was used almost universally. However, it contains only 128 characters, meaning it is unable to display characters in Cyrillic, Kanjii, or other non-Latin alphabets. To work around language display problems, programmers developed a variety of methods, so many human languages now have their own specific character sets, and items written in other character sets display incorrectly. Eventually, standards organizations developed the Unicode character set UTF-8 to provide a single compatible set of codes for everyone.</para>
- <para>Most e-mail messages state in advance which character set they use, so Evolution usually knows what to display for a given binary number. However, if you find that messages are displayed as rows of incomprehensible characters, try selecting a different character set in the mail settings screen. If your recipients can&apos;t read your messages, try selecting a different character set in the composer options dialog. For some languages, such as Turkish or Korean, it might work best for you to select the language-specific character set. However, the best choice for most users is UTF-8, which offers the widest range of characters for the widest range of languages.</para>
- </section>
- </section>
-
- <section id="usage-mail-getnsend-send-delay">
- <title>Sending Composed Messages Later</title>
- <para>Evolution normally sends mail as soon as you click Send. However, can save a message to be sent later:</para>
- <itemizedlist>
- <listitem>
- <para>If you are offline when you click Send, Evolution adds your message to the Outbox queue. The next time you connect to the Internet and send or receive mail, that message is sent.</para>
- </listitem>
- <listitem>
- <para>Click File &gt; Save Draft to store your messages in the drafts folder for later revision. </para>
- </listitem>
- <listitem>
- <para>If you prefer to save your message as a text file, click File &gt; Save As, then specify a filename. </para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="usage-mail-getnsend-offline">
- <title>Working Offline</title>
- <para>Offline mode is a tool designed for use with remote mail storage systems like GroupWise&reg;, IMAP or Exchange, in situations where you are not connected to the network at all times. The tool keeps a local copy of one or more folders to allow you to compose messages, storing them in your Outbox to be sent the next time you connect.</para>
- <para>POP mail downloads all messages to your local system, but other connections usually download just the headers, and fetch the rest only when you want to read the message. Before you go offline, Evolution downloads the unread messages from the folders you have chosen to store.</para>
- <para>To mark a folder for offline use, right-click the folder, then click Properties. Click Copy Folder Content Locally for Offline Operation.</para>
- <para>Your connection status is shown by the small icon in the lower left border of the Evolution main window. When you are online, it displays two connected cables. When you go offline, the cables separate. </para>
- <para>To cache your selected folders and disconnect from the network, click File &gt; Work Offline, or click the connection status icon in the lower left of the screen. When you want to reconnect, click File &gt; Work Online, or click the connection status icon again.</para>
- </section>
-
- <section id="usage-mail-getnsend-send-compose">
- <title>Attachments</title>
- <para>To attach a file to your e-mail:</para>
- <procedure>
- <step id="bsfnwxr">
- <para>Click the Attach icon in the composer toolbar.</para>
- </step>
- <step id="bsfnx41">
- <para>Select the file you want to attach.</para>
- </step>
- <step id="bsfnx93">
- <para>Click OK.</para>
- </step>
- </procedure>
- <para>You can drag a file into the address area or to the attachment portion of the composer window. If you are attaching an image and want to send it inline rather than attached, drag the image into the text composition area of the composer window. Non-image files cannot be dragged into the text composition area.</para>
- <para>The attachment display area is at the bottom of the composer window; you can expand or shrink it by clicking the small triangle in its upper right corner.</para>
- <para>When you send the message, a copy of the attached file goes with it. Be aware that big attachments can take a long time to send and receive.</para>
- </section>
-
- <section id="usage-mail-getnsend-send-to-types">
- <title>Specifying Extra Recipients for E-Mail</title>
- <para>Evolution, like most e-mail programs, recognizes three types of addressee: primary recipients, secondary recipients, and hidden (blind) recipients. The simplest way to direct a message is to put the e-mail address or addresses in the To: field, which denotes primary recipients. Use the Cc: field to send a message to secondary recipients.</para>
- <para>Addresses on the Bcc: list are hidden from the other recipients of the message. You can use it to send mail to large groups of people, especially if they don&rsquo;t know each other or if privacy is a concern. If your Bcc: field is absent, click View Bcc Field. </para>
- <para>If you frequently write e-mail to the same groups of people, you can create address lists in the contacts tool, and then send them mail as though they have a single address. To learn how to do that, see <link linkend="usage-contact-organize-group-list">Creating a List of Contacts</link>.</para>
- <para>Evolution has the ability to let you specify the Reply-To in an e-mail. Using this, you can setup a special Reply-To for an e-mail. To do this:</para>
- <procedure>
- <step id="bsfnz55">
- <para>Open a compose window.</para>
- </step>
- <step id="bsfnz7w">
- <para>Open the Reply-To field by clicking View &gt; Reply To.</para>
- </step>
- <step id="bsfnziz">
- <para>Specify the address you want as the Reply-To address in the new Reply-To field.</para>
- </step>
- <step id="bsfnzsp">
- <para>Complete the rest of your message. </para>
- </step>
- <step id="bsfo0mh">
- <para>Click Send.</para>
- </step>
- </procedure>
- </section>
-
- <section id="usage-mail-getnsend-send-to">
- <title>Choosing Recipients Quickly</title>
- <para>If you have created address cards in the contacts tool, you can also type nicknames or other portions of address data, and Evolution displays a drop-down list of possible address completions from your contacts. If you type a name or nickname that can go with more than one card, Evolution opens a dialog box to ask you which person you meant.</para>
- <para>If Evolution does not complete addresses automatically, click Tools &gt; Settings then click Autocompletion. There, select the groups of contacts you want to use for address autocompletion in the mailer. </para>
- <para>Alternately, you can click the To:, Cc:, or Bcc: buttons to get a list of the e-mail addresses in your contacts. Select addresses and click the arrows to move them into the appropriate address columns.</para>
- <para>For more information about using e-mail with the contact manager and the calendar, see <link linkend="contact-automation-basic">Send me a Card: Adding New Cards Quickly</link> and <link linkend="usage-calendar-apts">Scheduling With the Evolution Calendar</link>.</para>
- </section>
-
- <section id="usage-mail-getnsend-send-reply">
- <title>Replying to E-Mail Messages</title>
- <para>To reply to a message, click the message to reply to in the e-mail list and click Reply, or right-click within the message and select Reply to Sender. This opens the message composer. The To: and Subject: fields are already filled, although you can alter them if you prefer. In addition, the full text of the old message is inserted into the new message, either in grey with a blue line on one side (for HTML display) or with the &gt; character before each line (in plain text mode), to indicate that it&apos;s part of the previous message.</para>
- <para>If you&apos;re reading a message with several recipients, you can use Reply to All instead of Reply. If there are large numbers of people in the Cc: or To: fields, this can save substantial amounts of time.</para>
-
- <section id="bsfo4jl">
- <title>Using the Reply To All Feature</title>
- <para>Susan sends an e-mail to a client and sends copies to Tim and to an internal company mailing list of co-workers. If Tim wants to make a comment for all of them to read, he uses Reply to All, but if he just wants to tell Susan that he agrees with her, he uses Reply. His reply does not reach anyone that Susan put on her Bcc list, because that list is not shared with anyone.</para>
- <para>If you subscribe to a mailing list, and want your reply to go just to the list, rather than to the sender, select Reply to List instead of Reply or Reply to All. </para>
- </section>
- </section>
-
- <section id="usage-mail-getnsend-send-find">
- <title>Searching and Replacing with the Composer</title>
- <para>The message composer makes several text searching features available to you.</para>
- <formalpara id="bsai5b0">
- <title>Find: </title>
- <para>Enter a word or phrase, and Evolution finds it in your message.</para>
- </formalpara>
- <formalpara id="bsai5pj">
- <title>Find Regex: </title>
- <para>You can search for a complex pattern of characters, called a <link linkend="regular-expression">regular expression</link> or &ldquo;regex&rdquo; in your composer window. If you&rsquo;re not sure what a regular expression is, you should ignore this feature.</para>
- </formalpara>
- <formalpara id="bsai5wk">
- <title>Find Again: </title>
- <para>Select this item to repeat the last search you performed. </para>
- </formalpara>
- <formalpara id="bsai646">
- <title>Replace: </title>
- <para>Find a word or phrase, and replace it with something else.</para>
- </formalpara>
- <para>For all of these menu items, you can choose whether to Search Backwards in the document from the point where your cursor is. You can also determine whether the search is to be case sensitive in determining a match.</para>
- </section>
-
- <section id="usage-mail-getnsend-send-html">
- <title>Enhancing Your E-Mail with HTML</title>
- <para>Normally, you can&rsquo;t set text styles or insert pictures in e-mail. However, most newer e-mail programs can display images and text styles in addition to basic alignment and paragraph formatting. They do this with <link linkend="html">HTML</link>, just like Web pages do.</para>
- <para>Some people do not have HTML-capable mail clients, or prefer not to receive HTML-enhanced mail because it is slower to download and display. Because of this, Evolution sends plain text unless you explicitly ask for HTML. </para>
-
- <section id="bsait28">
- <title>Basic HTML Formatting</title>
- <para>You can change the format of an e-mail message from plain text to HTML by choosing Format HTML.</para>
- <para>To send all your mail as HTML by default, set your mail format preferences in the mail configuration dialog box. See <link linkend="config-prefs-mail-composer">Composer Preferences</link> for more information.</para>
- <para>HTML formatting tools are located in the toolbar just above the space where you actually compose the message. They also appear in the Insert and Format menus.</para>
- <para>The icons in the toolbar are explained in <link linkend="tooltip">tool-tips</link>, which appear when you hold your mouse pointer over the buttons. The buttons fall into four categories: </para>
- <formalpara id="bsai70c">
- <title>Headers and Lists: </title>
- <para>At the left edge of the toolbar, you can choose Normal for a default text style or Header 1 through Header 6 for varying sizes of header from large (1) to tiny (6). Other styles include preformat, to use the HTML tag for preformatted blocks of text, and three types of bullet points for lists.</para>
- </formalpara>
- <para>For instance, instead of using asterisks to mark a bulleted list, you can use the Bulleted List style from the style drop-down list. Evolution uses different bullet styles, and handles word wrap and multiple levels of indentation.</para>
- <formalpara id="bsai86c">
- <title>Text Styles: </title>
- <para>Use these buttons to determine the way your e-mail looks. If you have text selected, the style applies to the selected text. If you do not have text selected, the style applies to whatever you type next.</para>
- </formalpara>
- <informaltable>
- <tgroup cols="2">
- <colspec colwidth="2.729in" colname="1" colnum="1"/>
- <colspec colwidth="2.729in" colname="2" colnum="2"/>
- <thead>
- <row id="bslahtr">
- <entry colname="1">
- <para>Button</para>
- </entry>
- <entry colname="2">
- <para>Description</para>
- </entry>
- </row>
- </thead>
- <tbody>
- <row id="bslahts">
- <entry colname="1">
- <para>TT</para>
- </entry>
- <entry colname="2">
- <para>Typewriter text, which is approximately the same as the Courier monospace serif font.</para>
- </entry>
- </row>
- <row id="bslaiy5">
- <entry colname="1">
- <para>Bold A</para>
- </entry>
- <entry colname="2">
- <para>Bolds the text.</para>
- </entry>
- </row>
- <row id="bslaiw4">
- <entry colname="1">
- <para>Italic A</para>
- </entry>
- <entry colname="2">
- <para>Italizes the text.</para>
- </entry>
- </row>
- <row id="bslaium">
- <entry colname="1">
- <para>Underlined A</para>
- </entry>
- <entry colname="2">
- <para>Underlines the text.</para>
- </entry>
- </row>
- <row id="bslahtt">
- <entry colname="1">
- <para>Strikethrough A</para>
- </entry>
- <entry colname="2">
- <para>Strikesthrough the text.</para>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- <formalpara id="bsaia7u">
- <title>Alignment: </title>
- <para>Located next to the text style buttons, these three paragraph icons should be familiar to users of most word processing software. The life most button aligns your text to the left, the center button centers text, and the right button aligns the text to the right. </para>
- </formalpara>
- <formalpara id="bsaiagc">
- <title>Indentation Rules: </title>
- <para>The button with the arrow pointing left decreases a paragraph&apos;s indentation, and the right arrow increases its indentation.</para>
- </formalpara>
- <formalpara id="bsaialx">
- <title>Color Selection: </title>
- <para>At the far right is the color section tool, where a box displays the current text color. To choose a new color, click the arrow button to the right. If you have text selected, the color applies to the selected text. If you do not have text selected, the color applies to whatever you type next. You can select a background color or image by right-clicking on the message background, then selecting Style Page Style.</para>
- </formalpara>
- </section>
-
- <section id="bsait29">
- <title>Advanced HTML Formatting</title>
- <para>Under the Insert menu, there are several more items you can use to style your e-mail. To use these and other HTML formatting tools, make sure you have enabled HTML mode by using Format HTML.</para>
-
- <section id="bsait2a">
- <title>Inserting a Link</title>
- <para>Use the Insert a Link tool to put hyperlinks in your HTML messages. If you don&apos;t want special link text, you can just enter the address directly, and Evolution recognizes it as a link. </para>
- <procedure>
- <step id="bsaimfe">
- <para>Select the text you wish to link from.</para>
- </step>
- <step id="bsaimoh">
- <para>Right-click in the text, then click Link.</para>
- </step>
- <step id="bsaims2">
- <para>Type the URL in the URL field.</para>
- </step>
- <step id="bsaimvh">
- <para>Click Close.</para>
- </step>
- </procedure>
- </section>
-
- <section id="bsait2b">
- <title>Inserting an Image</title>
- <procedure>
- <step id="bsainv6">
- <para>Click Image.</para>
- </step>
- <step id="bsaio4q">
- <para>Browse to and select the image file.</para>
- </step>
- <step id="bsaioah">
- <para>Click OK.</para>
- </step>
- </procedure>
- </section>
-
- <section id="bsait2c">
- <title>Inserting a Rule</title>
- <para>You can insert a horizontal line into the text to help divide two sections: </para>
- <procedure>
- <step id="bsaiotf">
- <para>Click Rule.</para>
- </step>
- <step id="bsaioxz">
- <para>Select the length, thickness, and alignment.</para>
- </step>
- <step id="bsaipio">
- <para>Select Shaded if necessary.</para>
- </step>
- <step id="bsaiplo">
- <para>Click Close.</para>
- </step>
- </procedure>
- </section>
-
- <section id="bsait2d">
- <title>Inserting a Table</title>
- <para>You can insert a table into the text: </para>
- <procedure>
- <step id="bsaiq2x">
- <para>Click Table.</para>
- </step>
- <step id="bsaiq6r">
- <para>Select the number of rows and columns.</para>
- </step>
- <step id="bsaiqkl">
- <para>Select the type of layout for the table.</para>
- </step>
- <step id="bsaiqp8">
- <para>Select a background for the table.</para>
- <para>To insert a picture for the background, click Browse and select the desired image.</para>
- </step>
- <step id="bsaiqs5">
- <para>Click Close.</para>
- </step>
- </procedure>
- </section>
- </section>
- </section>
-
- <section id="usage-mail-getnsend-fwd">
- <title>Forwarding Mail</title>
- <para>When you receive an e-mail from someone, you can forward it to other individuals or groups that might be interested. You can forward a message as an attachment to a new message (this is the default) or you can send it <link linkend="inline">in line</link> as a quoted portion of the message you are sending. Attachment forwarding is best if you want to send the full, unaltered message to someone else. Inline forwarding is best if you want to send portions of a message, or if you have a large number of comments on different sections of the message you are forwarding. Remember to note from whom the message came, and whether you have removed or altered content.</para>
- <para>To forward a message you are reading, click Forward on the toolbar, click Actions &gt; Forward, or press Ctrl+F. If you prefer to forward the message <link linkend="inline">inline</link> instead of attached, click Actions &gt; Forward Inline from the menu. Select an addressee as you would when sending a new message; the subject is already entered, although you can alter it if you want. Add your comments on the message in the composition frame, then click Send.</para>
- </section>
-
- <section id="usage-mail-getnsend-ettiquette">
- <title>Seven Tips for E-Mail Courtesy</title>
- <itemizedlist>
- <listitem>
- <para>Don&apos;t forward chain letters. If you must, watch out for hoaxes and urban legends, and make sure the message doesn&apos;t have multiple layers of greater-than signs, (&gt;) indicating multiple layers of careless in-line forwarding. </para>
- </listitem>
- <listitem>
- <para>Always begin and close with a salutation. Say &ldquo;please&rdquo; and &ldquo;thank you&rdquo;, just like you do in real life. You can keep your pleasantries short, but be polite. </para>
- </listitem>
- <listitem>
- <para>WRITING IN CAPITAL LETTERS MEANS YOU&apos;RE SHOUTING! Don&apos;t write a whole message in capital letters. It hurts people&apos;s ears. </para>
- </listitem>
- <listitem>
- <para>Check your spelling and use complete sentences. By default, Evolution puts a red line beneath words it doesn&apos;t recognize, as you type them. </para>
- </listitem>
- <listitem>
- <para>Don&apos;t send nasty e-mails (flames). If you get one, don&rsquo;t write back. </para>
- </listitem>
- <listitem>
- <para>When you reply or forward, include enough of the previous message to provide context.</para>
- </listitem>
- <listitem>
- <para>Don&apos;t send spam.</para>
- </listitem>
- </itemizedlist>
- </section>
- </section>
-
- <section id="rsvp-stuff">
- <title>Sending Invitations by Mail</title>
- <para>If you create an event in the calendar component, you can then send invitations to the attendee list through the Evolution e-mail tool. The invitation card is sent as an attachment in iCal format.</para>
- <para>When you receive an invitation, </para>
- <formalpara id="bsaizt9">
- <title>Accept: </title>
- <para>Indicates you will attend the meeting. When you click the OK button, the meeting is entered into your calendar.</para>
- </formalpara>
- <formalpara id="bsaj000">
- <title>Tentatively Accept: </title>
- <para>Indicates you will probably attend the meeting. When you click the OK button, the meeting is entered into your calendar, but is marked as tentative.</para>
- </formalpara>
- <formalpara id="bsaj06a">
- <title>Decline: </title>
- <para>Indicates you will be unable to attend the meeting. The meeting is not entered into your calendar when you click the OK, although your response will be sent to the meeting host if you have selected the RSVP option.</para>
- </formalpara>
- <formalpara id="bsaj0dc">
- <title>RSVP: </title>
- <para>Select this option if you want your response sent to the meeting organizers.</para>
- </formalpara>
- </section>
-
- <section id="usage-mail-subscriptions">
- <title>IMAP Subscriptions Manager</title>
- <para>Because IMAP folders exist on the server, and opening them or checking them takes time, you need fine-grained control over the way that you use IMAP folders. You use the IMAP subscriptions manager to do this. If you prefer to have every mail folder displayed, you can select that option as well. However, if you want to choose specific items in your mailbox, and exclude others, you can use the subscription management tool to do that.</para>
- <procedure>
- <step id="bsmqyfs">
- <para>Select Tools &gt; Subscribe to Folders.</para>
- </step>
- <step id="bsmqyid">
- <para>If you have accounts on multiple IMAP servers, select the server where you want to manage your subscriptions. Evolution displays a list of available files and folders.</para>
- </step>
- <step id="bsmqyky">
- <para>Select a file or folder by clicking it. You should select at least the Inbox folder. Depending upon the way your IMAP server is configured, the list of available files might include non-mail folders. If it does, you can ignore them.</para>
- </step>
- <step id="bsmqz9t">
- <para>Click Subscribe to add a folder to the subscribed list.</para>
- </step>
- <step id="bsmqzlz">
- <para>When you have subscribed to the folders you want, close the window.</para>
- </step>
- </procedure>
- </section>
-
- <section id="encryption">
- <title>Encryption</title>
- <para>Evolution helps you protect your privacy by using GNU Privacy Guard (GPG), an implementation of strong <link linkend="public-key-encryption">Public Key Encryption.</link></para>
- <para>GPG uses two keys: public and private. You can give your public key to anyone you want to receive encrypted messages, or put it on a public key server so that people can look it up before contacting you. Your private key lets you decrypt any message encrypted with your public key. Never give your private key to anyone. </para>
- <para>Using encryption takes a bit of forethought. When you send a message that is encrypted, you must encrypt it using your intended recipient&apos;s public key. To receive an encrypted message, you must make sure that the sender has your public key in advance. For signing messages, you encrypt the signature with your private key, so only your public key can unlock it. When you send the message, the recipient gets your public key and unlocks the signature, verifying your identity.</para>
- <para>You can use encryption in two different ways:</para>
- <itemizedlist>
- <listitem>
- <para>You can encrypt the entire message, so that nobody but the recipient can read it.</para>
- </listitem>
- <listitem>
- <para>You can attach an encrypted signature to a plain text message, so that the recipient can read the message without decrypting it, and only needs decrypting to verify the sender&rsquo;s identity.</para>
- </listitem>
- </itemizedlist>
- <para>For example, suppose that Kevin wants to send an encrypted message to his friend Rachel. He looks up her public key on a general key server, and then tells Evolution to encrypt the message. The message now reads "@#$23ui7yr87#@!48970fsd." When the information gets to Rachel, she decrypts it using her private key, and it appears as plain text for her to read.</para>
- <para>To encrypt a single message:</para>
- <procedure>
- <step id="bsg2p0a">
- <para>Open a Compose a Message window.</para>
- </step>
- <step id="bsg2p9i">
- <para>Click Security &gt; PGP Encrypt.</para>
- </step>
- <step id="bsg2prj">
- <para>Compose your message, then click Send.</para>
- </step>
- </procedure>
- <para>You can set Evolution to always sign your e-mail messages: </para>
- <procedure>
- <step id="bsaj12e">
- <para>Click Tools &gt; Settings, then select Mail Accounts.</para>
- </step>
- <step id="bsaj1aj">
- <para>Select the mail account to encrypt, then click Edit.</para>
- </step>
- <step id="bsaj1es">
- <para>Click the Security tab.</para>
- </step>
- <step id="bsaj1yt">
- <para>Select Always Sign Outgoing Messages When Using This Account.</para>
- </step>
- <step id="bsaj2e0">
- <para>Click OK.</para>
- </step>
- <step id="bsaj2et">
- <para>Click Close.</para>
- </step>
- </procedure>
-
- <section id="encryption-smime">
- <title>S/MIME Encryption</title>
- <para>S/MIME encryption also uses a key-based approach, but it has some significant advantages in convenience and security. S/MIME uses certificates, which are similar to keys. The public portion of each certificate is held by the sender of a message and by one of several certificate authorities, who are paid to guarantee the identity of the sender and the security of the message. Evolution already recognizes a large number of certificate authorities, so when you get a message with an S/MIME certificate, your system automatically receives the public portion of the certificate and decrypts or verifies the message.</para>
- <para>S/MIME is used most often in corporate settings. In these cases, administrators supply certificates that they have purchased from a certificate authority. In some cases, an organization can act as its own certificate authority, with or without a guarantee from a dedicated authority such as Verisign or Thawte. In either case, the system administrator provides you with a certificate file.</para>
- <para>If you want to use S/MIME independently, you can extract an identification certificate from your Mozilla or Netscape Web browser. See the Mozilla help for more information on security certificates.</para>
- <para>The certificate file is a password-protected file on your computer. To use it in Evolution:</para>
- <procedure>
- <step id="bsg2rkq">
- <para>Click Tools &gt; Settings, then click Certificate Tool.</para>
- </step>
- <step id="bsg2rra">
- <para>Click Import.</para>
- </step>
- <step id="bsg2rw3">
- <para>Select the file to import, then click OK.</para>
- </step>
- <step id="bsg2s8y">
- <para>Click Close.</para>
- </step>
- </procedure>
- <para>Similarly, you can add certificates that are sent to you independently of any authority by clicking the Contact Certificates tab and using the same Import tool. You can also add new certificate authorities, which have their own certificate files, in the same way.</para>
- <para>After you have added your certificate, you can sign or encrypt a message by clicking Security &gt; S/MIME Sign or S/MIMe Encrypt in the message composer. </para>
- <para>To have every message signed or encrypted:</para>
- <procedure>
- <step id="bsg2t55">
- <para>Click Tools &gt; Options, then select the account to encrypt the messages in.</para>
- </step>
- <step id="bsg2tam">
- <para>Click Edit, then click Security.</para>
- </step>
- <step id="bsg2tsx">
- <para>Click Select next to Signing Certificate and specify the path to your signing certificate.</para>
- <para>or</para>
- <para>Click Select next to Encryption Certificate and specify the path to your encryption certificate.</para>
- </step>
- <step id="bsg2uuc">
- <para>Select the appropriate options.</para>
- </step>
- <step id="bsg2vi6">
- <para>Click OK.</para>
- </step>
- <step id="bsg2uvy">
- <para>Click Close.</para>
- </step>
- </procedure>
- </section>
-
- <section id="encryption-keygen">
- <title>Making Encryption Keys</title>
- <para>Before you can get or send encrypted mail, you need to generate your public and private keys with GPG. This procedure covers version 1.2.4 of GPG. If your version is different, these steps may vary slightly. You can find out your version number by entering <command>gpg --version</command>.</para>
- <procedure>
- <step id="bsg2zuv">
- <para>Open a terminal and enter <command>gpg --gen-key</command>.</para>
- </step>
- <step id="bsg2zxw">
- <para>Select an algorithm, then press Enter.</para>
- <para>or</para>
- <para>To accept the default algorithm of DSA and ElGamal, press Enter (recommended).</para>
- </step>
- <step id="bsg3011">
- <para>Select a key length, then press Enter. To accept the default, 1024 bits, press Enter.</para>
- </step>
- <step id="bsg3034">
- <para>Enter how long your key should be valid for. </para>
- <para>or</para>
- <para>To accept the default of no expiration, press Enter, then press Y when you are prompted to verify the selection.</para>
- </step>
- <step id="bsg305l">
- <para>Type your real name, then press Enter.</para>
- </step>
- <step id="bsg30bg">
- <para>Type your e-mail address, then press Enter.</para>
- </step>
- <step id="bsg30ec">
- <para>(Optional) Type a comment, then press Enter.</para>
- </step>
- <step id="bsg30lp">
- <para>Review your selected user ID, if it is correct press O.</para>
- </step>
- <step id="bsg317u">
- <para>Type a passphrase, then press Enter.</para>
- </step>
- <step id="bsg31c5">
- <para>Move your mouse randomly to generate the keys.</para>
- </step>
- </procedure>
- <para>After the keys are generated, you can view your key information by entering <command>gpg --list-keys</command>. You should see something similar to this: <computeroutput> /home/you/.gnupg/pubring.gpg ---------------------------- pub 1024D/32j38dk2 2001-06-20 you &lt;you@your-address.com&gt; sub 1024g/289sklj3 2001-06-20 [expires: 2002-11-14] </computeroutput></para>
- <para>GPG creates one list, or keyring, for your public keys and one for your private keys. All the public keys you know are stored in the file ~/.gnupg/pubring.gpg. If you want to give other people your key, send them that file.</para>
- <para>If you want, you can upload your keys to a key server.</para>
- <procedure>
- <step id="bsg3379">
- <para>Check your public key ID with gpg--list-keys. It will be the string after 1024D on the line beginning with pub. In the example above, it is 32j38dk2.</para>
- </step>
- <step id="bsg347p">
- <para>Enter the command <command>gpg --send-keys --keyserverwwwkeys.pgp.net <varname>32j38dk2</varname></command>. Substitute your key ID for <varname>32j38dk2</varname>. You need your password to do this.</para>
- </step>
- </procedure>
- <para>Key servers store your public keys for you so that your friends can decrypt your messages. If you choose not to use a key server, you can manually send your public key, include it in your signature file, or put it on your own Web page. However, it&apos;s easier to publish a key once, and then let people download it from a central place when they want.</para>
- <para>If you don&apos;t have a key to unlock or encrypt a message, you can set your encryption tool to look it up automatically. If it can&apos;t find the key, an error message appears.</para>
- </section>
-
- <section id="encrypt-getting-key">
- <title>Getting and Using Public Keys</title>
- <para>To send an encrypted message, you need to use the recipient&apos;s public key in combination with your private key. Evolution handles the encryption, but you need to get the public key and add it to your keyring.</para>
- <para>To get public keys from a public key server, enter the command<command> gpg --recv-keys --keyserver wwwkeys.pgp.net <varname>keyid</varname></command>, substituting <varname>keyid</varname> for your recipient&apos;s ID. You need to enter your password, and the ID is automatically added to your keyring..</para>
- <para>If someone sends you a public key directly, save it as a plain text file and enter the command <command>gpg <varname>filename</varname></command> to add it to your keyring.</para>
- </section>
-
- <section id="encrypt-evo-integ">
- <title>Setting up Evolution&rsquo;s Encryption</title>
- <procedure>
- <step id="bsg364h">
- <para>Click Tools &gt; Settings, then click Mail Accounts.</para>
- </step>
- <step id="bsg368f">
- <para>Select the account you want to use securely, then click Edit.</para>
- </step>
- <step id="bsg36hg">
- <para>Click the Security tab.</para>
- </step>
- <step id="bsg36jw">
- <para>Specify your key ID in the PGP/GPG Key ID field.</para>
- </step>
- <step id="bsg36pj">
- <para>Click OK.</para>
- </step>
- <step id="bsg36qt">
- <para>Click Close.</para>
- </step>
- </procedure>
- <para>Click Tools &gt; Settings, then click Mail Accounts. Select the account you want to use securely, and click Edit. Click the Security tab. Enter your key ID in the PGP/GPG Key ID field, then click OK. Your key is now integrated into your identity in Evolution.</para>
- <para>Evolution requires that you know your key ID. If you don&rsquo;t remember it, you can find it by typing <command>gpg --list-keys</command> in a console window. Your key ID is an eight-character string with random numbers and letters.</para>
- </section>
-
- <section id="unencrypting">
- <title>Unencrypting a Received Message</title>
- <para>If you receive an encrypted message, you need to decrypt it before you read it. Remember, the sender must have your public key before they can send you an encrypted message.</para>
- <para>When you view the message, Evolution prompts you for your PGP password. Enter it, and the unencrypted message is displayed. </para>
- </section>
- </section>
- </chapter>
-
- <chapter id="usage-mail-organize">
- <title>Organizing Your E-Mail</title>
- <para>Whether you only get a few e-mail messages a day, or you receive hundreds, you probably want to sort and organize them. Evolution&trade; has the tools to help you do it.</para>
-
- <section id="importing-mail-and-settings">
- <title>Importing Your Old E-Mail</title>
- <para>Evolution allows you to import old e-mail and contacts so that you don&rsquo;t need to worry about losing your old information.</para>
-
- <section id="importing-mail">
- <title>Importing Single Files</title>
- <para>Evolution can import the following types of files:</para>
- <formalpara id="bsawbz2">
- <title>vCard (.vcf, .gcrd):</title>
- <para> The address book format used by the GNOME, KDE, and many other contact management applications. You should be able to export to vCard format from any address book application. </para>
- </formalpara>
- <formalpara id="bsawccr">
- <title>iCalendar or iCal (.ics): </title>
- <para>A format for storing calendar files. iCalendar is used by Palm OS handhelds, Evolution, and Microsoft Outlook. </para>
- </formalpara>
- <formalpara id="bsawckg">
- <title>Microsoft Outlook Express 4 (.mbx): </title>
- <para>E-Mail file format used by Microsoft Outlook Express 4. For other versions of Microsoft Outlook and Outlook Express, see the workaround described in <link linkend="bsawgkk">Step 1</link>. </para>
- </formalpara>
- <formalpara id="bsawdfx">
- <title>LDAP Data Interchange Format (.LDIF):</title>
- <para> A standard data format for contact cards. </para>
- </formalpara>
- <formalpara id="bsawdmw">
- <title>MBox (.mbox or null extension): </title>
- <para>The e-mail format used by Mozilla, Netscape, Evolution, Eudora, and many other e-mail clients. </para>
- </formalpara>
- <para>To import your old e-mail: </para>
- <procedure>
- <step id="bsaweb1">
- <para>Click File &gt; Import.</para>
- </step>
- <step id="bsaweiv">
- <para>Click Forward.</para>
- </step>
- <step id="bsawely">
- <para>Select Import a Single File, then click Forward.</para>
- </step>
- <step id="bsawey0">
- <para>Select the file to import, then click Forward.</para>
- </step>
- <step id="bsawf2t">
- <para>Click Import.</para>
- </step>
- </procedure>
- </section>
-
- <section id="importing-preferences">
- <title>Importing Multiple Files</title>
- <para>Evolution automates the import process for several applications it can recognize. </para>
- <procedure>
- <step id="bsawfek">
- <para>Click File &gt; Import.</para>
- </step>
- <step id="bsawfhu">
- <para>Click Forward.</para>
- </step>
- <step id="bsawfiy">
- <para>Select Import Data and Settings From Older Programs, then click Forward.</para>
- <para>Evolution searches for old mail programs and, if possible, import the data from them.</para>
- </step>
- </procedure>
- <para>Microsoft Outlook and versions of Outlook Express after version 4 use proprietary formats that Evolution cannot read or import. One migration method that works well is to use the Outport application. See <ulink url="http://outport.sourceforge.net">outport.sourceforge.net</ulink> for additional information. You can also import data into another Windows mail client such as Mozilla: </para>
- <procedure>
- <step id="bsawgkk">
- <para>While in Windows, import your .pst files into Mozilla Mail (or another mail program such as Netscape or Eudora that uses the standard mbox format).</para>
- <para>Mozilla and Netscape users need to click File &gt; Compact &gt; All Folders from within the Netscape or Mozilla mail tool. Otherwise, Evolution imports and undeletes the messages in your Trash folders.</para>
- </step>
- <step id="bsawh7h">
- <para>Copy the files to the system or partition that Evolution is installed on.</para>
- </step>
- <step id="bsawhdw">
- <para>Use the Evolution import tool to import the files.</para>
- </step>
- </procedure>
- <para>For POP mail, filters are applied as messages are downloaded. For IMAP mail, filters are applied to new messages when you enter the INBOX folder. On Exchange servers, filters are not applied until you select your Inbox folder and click Actions &gt; Apply Filters, or press Ctrl+Y. To force your filters to act on all messages in the folder, select the entire folder by pressing Ctrl+A, then apply the filters by pressing Ctrl+Y. </para>
- </section>
- </section>
-
- <section id="usage-mail-organize-columns">
- <title>Sorting Mail with Column Headers</title>
- <para>The message list normally has columns to indicate whether a message has been read, whether it has attachments, how important it is, and the sender, date, and subject. You can change the column order, or add and remove columns by dragging and dropping them.</para>
- <para>Right-click one of the column headers to get a list of options:</para>
- <formalpara id="bsawhu7">
- <title>Sort Ascending: </title>
- <para>Sorts the messages top to bottom. Similarly, Sort Descending reverses the order, and Unsort removes sorting from this column, reverting to the order of messages as they were added to the folder.</para>
- </formalpara>
- <formalpara id="bsawiat">
- <title>Removing a Column: </title>
- <para>Remove this column from the display. You can also remove columns by dragging the header off the list and letting it drop. </para>
- </formalpara>
- <formalpara id="bsawie2">
- <title>Adding a Column: </title>
- <para>When you select this item, a dialog box appears, listing the possible columns. Drag the column you want into a space between existing column headers. A red arrow shows where the column will be placed.</para>
- </formalpara>
- <formalpara id="bsawiz9">
- <title>Best Fit: </title>
- <para>Automatically adjusts the widths of the columns for the most efficient use of space.</para>
- </formalpara>
- <formalpara id="bsawj3v">
- <title>Customizing the Current View: </title>
- <para>Choose this item to pick a more complex sort order for messages, or to choose which columns of information about your messages you want to display.</para>
- </formalpara>
-
- <section id="usage-mail-organize-columns-followup">
- <title>Using the Follow Up Feature</title>
- <para>One way to make sure you don&apos;t forget about a message is with the Follow Up feature. To use it, select one or more messages, then right-click on one, then click Follow Up. A dialog box opens to allow you to set the type of flag and the due date.</para>
- <para>The Flag itself is the action you want to remind yourself about. Several are provided for you, such as Call, Forward, and Reply, but you can enter your own note or action if you want. You can set a deadline for the flag as well.</para>
- <para>After you have added a flag, you can mark it as complete or remove it entirely by right-clicking the message, then click either Flag Completed or Clear Flag.</para>
- <para>When you read a flagged message, its flag status is displayed at the top, before the message headers. An overdue message might tell you Overdue: Call by April 07, 2003, 5:00 PM.</para>
- <para>Flags can help you organize your work in a number of ways. For example, you might add a Flag Status column to your message list and sort that way. Alternately, you could create a vFolder that displays all your flagged messages, then clear the flags when you&apos;re done, so the vFolder contains only messages with upcoming deadlines.</para>
- <para>If you prefer a simpler way to remind yourself about messages, you can mark them as Important by right-clicking the message, then click Mark Important.</para>
- </section>
- </section>
-
- <section id="usage-mail-organize-folders">
- <title>Getting Organized with Folders</title>
- <para>Evolution, like most other mail systems, stores mail in folders. You start out with a few mail folders, such as Inbox, Outbox, and Drafts, but you can create as many as you like. Create new folders by right clicking the folder list and selecting New Folder.</para>
- <para>When you click OK, your new folder appears in the folder view. You can then put messages in it by dragging and dropping them, or by using the Move button in the toolbar. If you want to move several messages at once, select the ones you want to move while holding down the Ctrl key, or use Shift to select a range of messages. If you create a filter with the filter assistant, you can have mail filed automatically.</para>
- <note>
- <para>The Inbox folder on most IMAP servers cannot contain both subfolders and messages. When you create additional folders on your IMAP mail server, branch them from the root of the IMAP account&apos;s folder tree, not from Inbox. If you create subfolders in your Inbox folder, you lose the ability to read messages that exist in your Inbox until you move the folders out of the way.</para>
- </note>
- </section>
-
- <section id="usage-mail-organize-search">
- <title>Searching for Messages</title>
- <para>Most mail clients can search your messages for you, but Evolution does it faster than most because of its automatic search index.</para>
- <para>To start searching, type a word or phrase in the text area below the toolbar, and choose a search type:</para>
- <formalpara id="bsaz7v9">
- <title>Subject Contains: </title>
- <para>Shows messages where the search text is in the subject line. It does not search in the message body.</para>
- </formalpara>
- <formalpara id="bsaz857">
- <title>Subject Does Not Contain: </title>
- <para>Finds messages that do not contain the search text in the subject.</para>
- </formalpara>
- <formalpara id="bsaz8as">
- <title>Sender Contains: </title>
- <para>Finds messages whose From: header contains a match for your search text.</para>
- </formalpara>
- <formalpara id="bsaz8eu">
- <title>Recipients Contain: </title>
- <para>Finds messages with the search text in the To: and Cc: headers.</para>
- </formalpara>
- <formalpara id="bsaz8kw">
- <title>Body Contains: </title>
- <para>Searches only in message text, not the subject lines.</para>
- </formalpara>
- <formalpara id="bsaz8ps">
- <title>Body Does Not Contain: </title>
- <para>Finds every e-mail message that does not have the search text in the message body. It also show messages that have the search text in the subject line, if it is not also in the body.</para>
- </formalpara>
- <formalpara id="bsaz8uh">
- <title>Body or Subject Contains: </title>
- <para>Searches message subjects and the messages themselves for the word or phrase you&apos;ve specified in the search field.</para>
- </formalpara>
- <formalpara id="bsaz910">
- <title>Message Contains: </title>
- <para>Searches the message body and all headers for the specified text.</para>
- </formalpara>
- <para>When you&rsquo;ve typed your search phrase, press Enter or click the Find Now button. Evolution will show your search results in the message list.</para>
- <para>For more complex search rules, select Advanced from the Search menu. You might want to create a vFolder instead; see <link linkend="usage-mail-organize-vfolders">Using vFolders</link> for more detail.</para>
- <para>When finish searching, go back to seeing all your messages by clicking the Clear button, or by entering a blank search.</para>
- </section>
-
- <section id="usage-mail-organize-spam">
- <title>Stopping Junk Mail (Spam)</title>
- <para>Evolution can check for junk mail for you. When the software detects mail that appears to be junk mail, it will flag it and hide it from your view. Messages that are flagged as junk mail are displayed only in the Junk folder.</para>
- <para>The junk mail filter can learn which kinds of mail are legitimate and which are not if you train it. When you first start using junk mail blocking, check the Junk folder to be sure that legitimate mail doesn&apos;t get flagged as junk mail. If good mail, also known as ham, is incorrectly flagged, remove it from the Junk folder by right-clicking it and selecting Mark as Not Junk. If Evolution misses junk mail, right-click the message, then click Mark as Junk. When you correct it, the filter will be able to recognize similar messages in the future, and will become more accurate as time goes on.</para>
- <para>To change your junk mail filtering preferences, click Tools &gt; Settings, then click Mail Preferences. In the mail preferences tool, click the Junk tab. Here, you have a couple of options: </para>
- <formalpara id="bsaz9zd">
- <title>Checking Incoming Mail for Junk: </title>
- <para>This option turns automatic junk mail filtering on or off.</para>
- </formalpara>
- <formalpara id="bsaza5z">
- <title>Include Remote Tests: </title>
- <para>This option uses tests that require a network connection, such as checking to see if a message is in a list of known junk messages, or if the sender or gateway are blacklisted by anti-spam organizations. Remote tests add to the amount of time it takes to check for junk mail, but increase accuracy.</para>
- </formalpara>
- </section>
-
- <section id="usage-mail-organize-filters">
- <title>Create Rules to Automatically Organize Mail</title>
- <para>Filters work very much like the mail room in a large company. Their purpose is to bundle, sort, and distribute mail to the various folders. In addition, you can have multiple filters performing multiple actions that might effect the same message in several ways. For example, your filters could put copies of one message into multiple folders, or keep one copy and send one to another person, and it can do that quickly.</para>
-
- <section id="usage-mail-org-filters-new">
- <title>Creating New Filter Rules</title>
- <procedure>
- <step id="bsazapz">
- <para>Click Tools &gt; Filters.</para>
- </step>
- <step id="bsazaxn">
- <para>Click Add.</para>
- </step>
- <step id="bsazayr">
- <para>Type a name for the filter in the Rule name field.</para>
- </step>
- <step id="bsazb4y">
- <para>Define the criteria for the filter in the If section.</para>
- <para>For each of the filter criterion, you must first select which parts of the message you want to filter:</para>
- <formalpara id="bsh25ic">
- <title>Sender: </title>
- <para>The sender&apos;s address.</para>
- </formalpara>
- <formalpara id="bsh25ui">
- <title>Recipient: </title>
- <para>The recipients of the message.</para>
- </formalpara>
- <formalpara id="bsh266q">
- <title>Subject:</title>
- <para> The subject line of the message.</para>
- </formalpara>
- <formalpara id="bshk9m6">
- <title>Specific Header: </title>
- <para>Any header including custom ones.</para>
- </formalpara>
- <para>If a message uses a header more than once, Evolution pays attention only to the first instance, even if the message defines the header differently the second time. For example, if a message declares the Resent-From: header as &ldquo;engineering@rupertcorp.com&rdquo; and then restates it as &ldquo;marketing@rupertcorp.com&rdquo;, Evolution filters as though the second declaration did not occur. To filter on messages that use headers multiple times, use a regular expression. </para>
- <formalpara id="bshkazq">
- <title>Message Body: </title>
- <para>Searches in the actual text of the message.</para>
- </formalpara>
- <formalpara id="bshkb9x">
- <title>Expression (For programmers only):</title>
- <para> Match a message according to an expression you write in the Scheme language, used to define filters in Evolution.</para>
- </formalpara>
- <formalpara id="bshkbvl">
- <title>Date Sent: </title>
- <para>Filters messages according to the date on which they were sent. First, choose the conditions you want a message to meet, such as before a given time or after a given time. Then choose the time. The filter compares the message&apos;s time stamp to the system clock when the filter is run, or to a specific time and date you choose from a calendar. You can also have it look for a message within a range of time relative to the filter, such as two to four days ago.</para>
- </formalpara>
- <formalpara id="bshkcq6">
- <title>Date Received: </title>
- <para>This works the same way as the Date Sent option, except that it compares the time you received the message with the dates you specify.</para>
- </formalpara>
- <formalpara id="bshkcwe">
- <title>Label: </title>
- <para>Messages can have labels of Important, Work, Personal, To Do, or Later. You can set tables with other filters or by hand.</para>
- </formalpara>
- <formalpara id="bshkdbe">
- <title>Score: </title>
- <para>Sets the message score to any whole number greater than 0. You can have one filter set or change a message score, and then set up another filter to move the messages you have scored. A message score is not based on anything in particular: it is simply a number you can assign to messages so other filters can process them.</para>
- </formalpara>
- <formalpara id="bshkdqm">
- <title>Size: </title>
- <para>Sorts based on the size of the message in kilobytes.</para>
- </formalpara>
- <formalpara id="bshkdww">
- <title>Status: </title>
- <para>Filters according to the status of a message. The status can be Replied To, Draft, Important, Read, or Junk.</para>
- </formalpara>
- <formalpara id="bshkeb2">
- <title>Flagged: </title>
- <para>Checks whether the message is flagged for follow-up.</para>
- </formalpara>
- <formalpara id="bshkej1">
- <title>Attachments: </title>
- <para>Creates a filter based on whether there is an attachment for the e-mail.</para>
- </formalpara>
- <formalpara id="bshkev3">
- <title>Mailing List: </title>
- <para>Filters based on the mailing list the message came from. This filter might miss messages from some list servers, because it checks for the X-BeenThere header, which is used to identify mailing lists or other redistributors of mail. Mail from list servers that do not set X-BeenThere properly are not be caught by these filters.</para>
- </formalpara>
- <formalpara id="bshkfrd">
- <title>Regex Match: </title>
- <para>If you know your way around a <link linkend="regular-expression">regex</link>, or regular expression, this option allows you to search for complex patterns of letters, so that you can find, for example, all words that start with a and ends with m, and are between six and fifteen letters long, or all messages that declare a particular header twice. For information about how to use regular expressions, check the manual page for the <command>grep</command> command.</para>
- </formalpara>
- <formalpara id="bshkggw">
- <title>Source Account: </title>
- <para>Filters messages according the server you got them from. This is most useful if you use multiple POP mail accounts.</para>
- </formalpara>
- <formalpara id="bshkgpo">
- <title>Pipe to Program: </title>
- <para>Evolution can use an external command to process a message, then process it based on the return value. Commands used in this way must return an integer. This is most commonly used to add an external junk mail filter.</para>
- </formalpara>
- <formalpara id="bshkgwb">
- <title>Junk Test: </title>
- <para>Filters based on the results of the junk mail test.</para>
- </formalpara>
- <formalpara id="bshkh3t">
- <title>Select the Criteria for the Condition: </title>
- <para>If you want multiple criteria for this filter, click Add Criterion and repeat step 4.</para>
- </formalpara>
- <formalpara id="bshkhi8">
- <title>Select the Actions for the Filter in the Then Section: </title>
- <para>Select any of the following options.</para>
- </formalpara>
- <itemizedlist>
- <listitem>
- <formalpara id="bsmr5pj">
- <title>Move to Folder: </title>
- <para>Moves the message into a folder you specify. Click Click Here to select the destination folder.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsmr9sg">
- <title>Copy to Folder: </title>
- <para>Puts a copy of the message into a folder you specify. Click Click Here to select the destination folder.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsmr9wy">
- <title>Delete: </title>
- <para>Marks the message for deletion. The message can be undeleted until you manually expunge or empty the trash.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsmr9zn">
- <title>Stop Processing: </title>
- <para>Select this if you want to have all other filters to ignore this message.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsmra5i">
- <title>Assign Color: </title>
- <para>Marks the message with a color of your choice.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsmraa9">
- <title>Assign Score: </title>
- <para>Assigns the message a numeric score.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsmrd39">
- <title>Adjust Score: </title>
- <para>Changes the numeric score by the amount you set.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsmrd6f">
- <title>Set Status: </title>
- <para>Sets the status of the message. The status can be Replied To, Draft, Important, Read, or Junk.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsmrd9c">
- <title>Unset Status: </title>
- <para>If the message has a status value, unsets it. If a status value is not set, it does nothing.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsmrdcm">
- <title>Beep: </title>
- <para>Makes the system beep.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsmrdey">
- <title>Play Sound: </title>
- <para>Select a sound file, and Evolution will play it.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsmrdip">
- <title>Pipe to Program: </title>
- <para>Sends the message to a program of your choice. No return value is expected. This feature can be used to create automatic Web postings from e-mail messages or to perform additional message post processing not supported by Evolution.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsmrdm5">
- <title>Run Program: </title>
- <para>Evolution will run an application.</para>
- </formalpara>
- </listitem>
- </itemizedlist>
- </step>
- <step id="bsazp1t">
- <para>Click Add Action if you need multiple actions.</para>
- </step>
- <step id="bsazq81">
- <para>Click OK twice.</para>
- </step>
- </procedure>
- <para>There is an easy shortcut for fast filter or vFolder creation. </para>
- <procedure>
- <step id="bsh2232">
- <para>Right-click the message in the e-mail list.</para>
- </step>
- <step id="bsh22bz">
- <para>Select one of the items under the Create Rule from the Message submenu.</para>
- <para>Creating a rule based on a message opens the filter creation tool with some of the information about the message already filled in for your convenience.</para>
- </step>
- </procedure>
- <informalfigure id="usage-mail-filter-fig-createrule">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/filter-new-fig.png"/></imageobject></mediaobject>
-
- </informalfigure>
- <para>If you have several filters that match a single message, they are all applied to the message in order, unless one of the filters has the Stop Processing action. If you use that action in a filter, the messages that it affects are not touched by other filters. </para>
- <para>When you first open the Filters dialog box, you are shown the list of filters sorted in the order in which they will be applied. You can move them up and down in the priority list by clicking the Up and Down buttons. </para>
- </section>
-
- <section id="filters-edit">
- <title>Editing Filters</title>
- <procedure>
- <step id="bsazr7l">
- <para>Click Tools &gt; Filters.</para>
- </step>
- <step id="bsazr9u">
- <para>Select the filter to edit and click Edit.</para>
- </step>
- <step id="bsazrhx">
- <para>Make the desired corrections and click OK twice.</para>
- </step>
- </procedure>
- </section>
-
- <section id="filters-deleting">
- <title>Deleting Filters</title>
- <procedure>
- <step id="bsazrrq">
- <para>Click Tools &gt; Filters.</para>
- </step>
- <step id="bsazrvn">
- <para>Select the filter to remove and click Remove. </para>
- </step>
- <step id="bsazryx">
- <para>Click OK.</para>
- </step>
- </procedure>
- <note>
- <para>Changing Folder Names and Filters</para>
- <para>Incoming e-mail that your filters don&rsquo;t move goes into the Inbox; outgoing mail that they don&rsquo;t move ends up in the Sent folder. So be sure to change the filters that go with it.</para>
- </note>
- </section>
- </section>
-
- <section id="usage-mail-organize-vfolders">
- <title>Using vFolders</title>
- <para>If filters aren&rsquo;t flexible enough for you, or you find yourself performing the same search again and again, consider a vFolder. vFolders, or virtual folders, are an advanced way of viewing your e-mail messages within Evolution. If you get a lot of mail or often forget where you put messages, vFolders can help you keep things organized.</para>
- <para>A vFolder is really a hybrid of all the other organizational tools: it looks like a folder, it acts like a search, and you set it up like a filter. In other words, a conventional folder actually contains messages, but a vFolder is a view of messages that might be in several different folders. The messages it contains are determined on the fly using a set of criteria you choose in advance.</para>
- <para>As messages that meet the vFolder criteria arrive or are deleted, Evolution automatically adjusts the vFolder contents. When you delete a message, it is erased from the folder in which it actually exists, as well as any vFolders that display it.</para>
- <para>The Unmatched vFolder is the opposite of other vFolders: it displays all messages that do not appear in other vFolders.</para>
- <para>If you use remote e-mail storage like IMAP or Microsoft Exchange, and have created vFolders to search through them, the Unmatched vFolder also searches the remote folders. If you do not create any vFolders that search remote mail stores, the Unmatched vFolder does not search in them either.</para>
- <para>As an example of using folders, searches, and vFolders, consider the following example: To organize his mailbox, Jim sets up a virtual folder for e-mails from his friend and co-worker Anna. He has another vFolder for messages that have novell.com in the address and Evolution in the subject line, so he can keep a record of what people from work send him about Evolution. If Anna sends him a message about anything other than Evolution, it only shows up in the &ldquo;Anna&rdquo; vFolder. When Anna sends him mail about the user interface for Evolution, he can see the message both in the &ldquo;Anna&rdquo; vFolder and in the &ldquo;Internal Evolution Discussion&rdquo; vFolder. </para>
-
- <section id="vfolder-create">
- <title>Creating a vFolder</title>
- <procedure>
- <step id="bsazs7h">
- <para>Click Tools &gt; Virtual Folder Editor.</para>
- </step>
- <step id="bsazsav">
- <para>Click Add.</para>
- <informalfigure id="usage-mail-vfolder-fig-createrule">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/evo_rule_a.png"/></imageobject></mediaobject>
-
- </informalfigure>
- </step>
- <step id="bsazsbo">
- <para>Type the name of the vFolder in the Rule Name field.</para>
- </step>
- <step id="bsazsjd">
- <para>Select your search criteria. For each criterion, you must first select which of the following parts of the message you want the search to examine. The criteria are similar to those for filters.</para>
- <formalpara id="bshkrpc">
- <title>Sender: </title>
- <para>Sender&apos;s address.</para>
- </formalpara>
- <formalpara id="bshkrwe">
- <title>Recipients: </title>
- <para>The recipients of the message.</para>
- </formalpara>
- <formalpara id="bshks5p">
- <title>Subject: </title>
- <para>The subject line of the message.</para>
- </formalpara>
- <formalpara id="bshksea">
- <title>Message Body: </title>
- <para>Searches in the actual text of the message.</para>
- </formalpara>
- <formalpara id="bshkzum">
- <title>Expression (For programmers only):</title>
- <para> Match a message according to an expression you write in the Scheme language, used to define filters in Evolution.</para>
- </formalpara>
- <formalpara id="bshkzun">
- <title>Date Sent: </title>
- <para>Filters messages according to the date on which they were sent. First, choose the conditions you want a message to meet, such as before a given time or after a given time. Then choose the time. The filter compares the message&apos;s time stamp to the system clock when the filter is run, or to a specific time and date you choose from a calendar. You can also have it look for a message within a range of time relative to the filter, such as two to four days ago.</para>
- </formalpara>
- <formalpara id="bshkzuo">
- <title>Date Received: </title>
- <para>This works the same way as the Date Sent option, except that it compares the time you received the message with the dates you specify.</para>
- </formalpara>
- <formalpara id="bshkzup">
- <title>Label: </title>
- <para>Messages can have labels of Important, Work, Personal, To Do, or Later. You can set tables with other filters or by hand.</para>
- </formalpara>
- <formalpara id="bshkzuq">
- <title>Score: </title>
- <para>Sets the message score to any whole number greater than 0. You can have one filter set or change a message score, and then set up another filter to move the messages you have scored. A message score is not based on anything in particular: it is simply a number you can assign to messages so other filters can process them.</para>
- </formalpara>
- <formalpara id="bshkzur">
- <title>Size: </title>
- <para>Sorts based on the size of the message in kilobytes.</para>
- </formalpara>
- <formalpara id="bshkzus">
- <title>Status: </title>
- <para>Filters according to the status of a message. The status can be Replied To, Draft, Important, Read, or Junk.</para>
- </formalpara>
- <formalpara id="bshkzut">
- <title>Flagged: </title>
- <para>Checks whether the message is flagged for follow-up.</para>
- </formalpara>
- <formalpara id="bshkzuu">
- <title>Attachments: </title>
- <para>Creates a filter based on whether there is an attachment for the e-mail.</para>
- </formalpara>
- <formalpara id="bshkzuv">
- <title>Mailing List: </title>
- <para>Filters based on the mailing list the message came from. This filter might miss messages from some list servers, because it checks for the X-BeenThere header, which is used to identify mailing lists or other redistributors of mail. Mail from list servers that do not set X-BeenThere properly are not be caught by these filters.</para>
- </formalpara>
- </step>
- <step id="bsazxjk">
- <para>Select the folders in which this vFolder will search. Your options are:</para>
- <formalpara id="bsmr7jw">
- <title>Specific Folders Only: </title>
- <para>Uses individual folders for the vFolder source.</para>
- </formalpara>
- <formalpara id="bsmr82i">
- <title>With All Local Folders: </title>
- <para>Uses all local folders for the vFolder source.</para>
- </formalpara>
- <formalpara id="bsmr8jg">
- <title>With All Active Remote Folders: </title>
- <para>Remote folders are considered active if you are connected to the server; you must be connected to your mail server for the vFolder to include any messages from that source.</para>
- </formalpara>
- <formalpara id="bsmr8zu">
- <title>With All Local and Active Remote Folders: </title>
- <para>Uses all local and active remote folders fo rthe vFolder source.</para>
- </formalpara>
- </step>
- <step id="bsazxwc">
- <para>Click OK.</para>
- </step>
- </procedure>
- </section>
- </section>
- </chapter>
-
- <chapter id="usage-contact">
- <title>Evolution Contacts: the Address Book</title>
- <para>This section shows you how to use the Evolution&trade; contacts tool to organize any amount of contact information, share addresses over a network, and indicates several ways to save time with everyday tasks.</para>
- <itemizedlist>
- <listitem>
- <para><link linkend="usage-contact-cards">The Contact Editor</link></para>
- </listitem>
- <listitem>
- <para><link linkend="contact-search">Searching for Contacts</link></para>
- </listitem>
- <listitem>
- <para><link linkend="usage-contact-organize">Organizing your Contacts</link></para>
- </listitem>
- <listitem>
- <para><link linkend="usage-contact-sharing">LDAP: Shared Contact Groups on a Network</link></para>
- </listitem>
- <listitem>
- <para><link linkend="contact-automation-basic">Send me a Card: Adding New Cards Quickly</link></para>
- </listitem>
- </itemizedlist>
- <para> To learn about configuring the contacts tool, see <link linkend="config-prefs-contact">Directory Servers</link>. You can import contacts from other contact management tools with the Import tool by clicking File &gt; Import, or by mailing them to yourself as vCard attachments.</para>
- <para>A card contains the contact information for an individual in your address book. Double-click on a card to display all its details.</para>
-
- <section id="usage-contact-cards">
- <title>The Contact Editor</title>
- <para>If you want to add or change cards, you&apos;ll use the contact editor. To change a card that already exists, double-click it to open the contact editor window. If you want to create a new card, click the New button in the toolbar to open the same window, with blank entry boxes for you to fill in.</para>
- <informalfigure id="usage-contact-editor-fig">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/evo_contacteditor_a.png"/></imageobject></mediaobject>
-
- </informalfigure>
- <para>The contact editor window has three tabs:</para>
- <formalpara id="bshl614">
- <title>Contact: </title>
- <para>Contains basic contact information.</para>
- </formalpara>
- <formalpara id="bshl6pc">
- <title>Personal: </title>
- <para>Contains a more specific description of the person, including URLs for their calendar and free/busy information.</para>
- </formalpara>
- <formalpara id="bshl7iw">
- <title>Mailing Address: </title>
- <para>Contains the individuals mailing address. </para>
- </formalpara>
- <para>You can also use Actions menu to find Forward Contact, which opens a new message with the card already attached, and Send Message to Contact, which will opens a new message to the contact&apos;s e-mail address.</para>
- <para>From the Contact Editor toolbar, you can save and close, print, close, or delete the contact.</para>
- <para>You can add cards from within an e-mail message or calendar appointment. While looking at an e-mail, right-click any e-mail address or message, and click Create Card for this Address or Create Card for this Sender from the menu.</para>
- <para>Most of the items in the contact editor simply display the information you enter, but some of them have additional features:</para>
- <formalpara id="bsb02hn">
- <title>Full Name: </title>
- <para>Specify the name of your contact here. You can type a name into the Full Name field, but you can also click the Full Name button to bring up a small dialog box with text boxes for first and last names, titles like &ldquo;Mr.&rdquo; or &ldquo;Her Excellency,&rdquo; and suffixes like &ldquo;Jr.&rdquo; The Full Name field also interacts with the File Under box to help you organize your contacts and to handle multi-word surnames.To see how it works, type a name in the Full Name field. As an example, we&rsquo;ll use Miguel de Icaza. You&rsquo;ll notice that the File Under field also fills in, but in reverse: Icaza, Miguel de. If you had entered John Q. Doe, the contacts editor would have correctly guessed that the entry should be filed under &ldquo;Doe, John Q.&rdquo; However, Miguel&rsquo;s surname, &ldquo;de Icaza&rdquo;, has two words, and to sort it correctly you must enter de Icaza, Miguel in the File As entry.</para>
- </formalpara>
- <formalpara id="bsb03ok">
- <title>Where: </title>
- <para>Select one of your address books as the location for this contact. You might not be able to write to all available address books, especially those on a network.</para>
- </formalpara>
- <formalpara id="bsb03se">
- <title>Categories: </title>
- <para>Click the Categories button to select categories for this card. If you assign contact categories, you can then search for contacts using those categories. For more information on contact categories, see <link linkend="usage-contact-organize">Organizing your Contacts</link>.</para>
- </formalpara>
- <formalpara id="bsb042y">
- <title>Free/Busy and Calendar URLs: </title>
- <para>Click the Personal Information tab to enter Web addresses for the contact. If the contact publishes Free/Busy or calendar data online, using a server other than Exchange or GroupWise, you can specify the addresses for those servers here. After you do so, you can check their schedule when creating appointments in the calendar.</para>
- </formalpara>
- </section>
-
- <section id="contact-search">
- <title>Searching for Contacts</title>
- <procedure>
- <step id="bsb04h7">
- <para>Select your search type in the search bar.</para>
- </step>
- <step id="bsb04kf">
- <para>Specify your query.</para>
- </step>
- <step id="bsb04m3">
- <para>Press Enter to begin the search.</para>
- </step>
- </procedure>
- <para>For a more complex search, select Search Advanced and select criteria that describe your desired contact:</para>
- <procedure>
- <step id="bsb04xh">
- <para>Name the rule in the Rule Name field.</para>
- </step>
- <step id="bsb050n">
- <para>Set up your criteria in the If field.</para>
- </step>
- <step id="bsb0546">
- <para>Click Add Criterion to add additional criteria.</para>
- </step>
- <step id="bsb05aw">
- <para>Click Search.</para>
- </step>
- </procedure>
- <para>To show all your contacts, Click Clear in the search bar, press Shift+Ctrl+B, or search with an empty query.</para>
- </section>
-
- <section id="usage-contact-organize">
- <title>Organizing your Contacts</title>
- <para>Just as you can search mail, you can search contacts. You can also create several individual address books, or contact groups. Within a given contact group, you can have several categories of contacts. </para>
-
- <section id="usage-contact-organize-group">
- <title>Contacts Groups</title>
- <para>The simplest way to organize contacts is to create additional groups of contacts. You can create a new one by clicking File &gt; New &gt; Contacts Group. For contacts groups on your computer, you only need to provide a name. For contacts on the network, you need to provide more information about the contacts server you are trying to access. </para>
- <para>To move a card from one group to another, just drag it from the main display of contacts. You cannot change the contents of most network contact groups. </para>
- <note>
- <para>Contacts groups are not the same as contact lists. A contact group is like a folder or address book full of contacts. A contact list is a single contact that contains other contacts, and is most often used to e-mail several people at once.</para>
- </note>
- </section>
-
- <section id="usage-contact-organize-group-list">
- <title>Creating a List of Contacts</title>
- <para>A contact list is a set of contacts with a single nickname that you create. When you send e-mail to the nickname, it is sent to every member of the list. This differs from a network mailing list in that it exists only on your computer as a convenience to you, rather than as an actual e-mail address managed by a mailing list application on a server.</para>
- <para>For example, you could create one card for each family member, then add those cards to a contact list called &ldquo;Family&rdquo;. Then, instead of entering each person&apos;s e-mail address individually, you can send e-mail to &ldquo;Family&rdquo; and the message would go to all of them.</para>
- <para> To create a list of contacts: </para>
- <procedure>
- <step id="bshlf6r">
- <para>Open the list creation dialog box by clicking the New List button or click File &gt; New &gt; Contact List.</para>
- </step>
- <step id="bshlfal">
- <para>Specify a name for the list.</para>
- </step>
- <step id="bshlfcp">
- <para>Specify the names or e-mail addresses of contacts, or just drag contacts from the main window into the list.</para>
- </step>
- <step id="bshlfem">
- <para>Choose whether you want to hide the e-mail addresses when you send a message to the list. Unless it is a very small list, it is recommended that you leave the addresses hidden. This is the same thing as using the &ldquo;Bcc:&rdquo; feature discussed in <link linkend="usage-mail-getnsend-send-to-types">Specifying Extra Recipients for E-Mail</link>.</para>
- </step>
- <step id="bshlfgv">
- <para>When you are finished, click OK. </para>
- </step>
- </procedure>
- <para>The list appears as a contact card, which you can use as you would any other. That includes e-mailing the list to another person, and sending e-mail to the list.</para>
- <para>To mail the list, open a new e-mail and type the name you chose for the list. Evolution will address the message to the entire list when you send it. You can also right-click on the list&rsquo;s address card in the contacts tool and select Send Message to List.</para>
- <para>Evolution cannot store contact lists on Microsoft Exchange servers.</para>
- </section>
-
- <section id="usage-contact-organize-group-category">
- <title>Grouping with Categories</title>
- <para>Anther way to group cards is to mark them as belonging to different categories. You can mark a card as being in several categories or no category at all. For example, you put a friend&apos;s card in the &ldquo;Business&rdquo; category because he works with you, the &ldquo;Friends&rdquo; category because he&apos;s a friend, and the &ldquo;Frequent&rdquo; category because you call him often.</para>
- <para>To mark a card as belonging to a category, click the Categories button at the lower right. In the dialog box that appears, you can check as many or as few categories as you like.</para>
- <para>If the master list of categories doesn&rsquo;t suit you, you can add your own categories. Just specify the new category&apos;s name in the text box, then click Categories and select Edit Master Category List in the window that appears. </para>
- </section>
- </section>
-
- <section id="usage-contact-sharing">
- <title>LDAP: Shared Contact Groups on a Network</title>
- <para>The <link linkend="ldap">LDAP</link> protocol was created to let users share contact information over a network by sharing access to a central directory. LDAP allows a company to maintain a shared set of contact information. Many companies keep a common LDAP address book for all their employees or for client contacts.</para>
- <para>To learn how to add a remote directory to your available contact folders, see <link linkend="config-prefs-contact">Directory Servers</link>. Remote groups of contacts appear under the On LDAP Servers item in the shortcut bar. They work like a local folder of cards, with the following exceptions: </para>
- <itemizedlist>
- <listitem>
- <para>Network folders are only available when you are connected to the network. If you use a laptop or have a modem connection, you might want to copy or cache some of the network directory. You do this by dragging and dropping your desired contacts into the local contacts list.</para>
- </listitem>
- <listitem>
- <para>To prevent excess network traffic, Evolution does not normally load data from the LDAP server immediately upon opening. You must click Display All before contacts are loaded from the network. You can change this behavior in the Contact Preferences window.</para>
- </listitem>
- <listitem>
- <para>Depending on your server settings, you might not be able to edit all the fields in a contact stored on an LDAP server. Some servers prohibit some or all changes, and others use a smaller set of fields than Evolution allows. Check with your system administrator if you need different settings.</para>
- </listitem>
- </itemizedlist>
-
- <section id="usage-contact-sharing-setup">
- <title>Configuring Evolution to use LDAP</title>
- <para>For information about setting up Evolution to use LDAP, refer to <link linkend="config-prefs-contact">Directory Servers</link>.</para>
- </section>
- </section>
-
- <section id="contact-automation-basic">
- <title>Send me a Card: Adding New Cards Quickly</title>
- <para>As noted before, when you get information about a person in the mail or in a calendar entry, you can add it to an address card. To do so, right-click any e-mail address or e-mail message, and click Add Sender to Contacts on the menu that appears. Evolution can also add cards from a hand-held device during HotSync operation. For more information, see <link linkend="config-sync">Synchronizing Your Handheld Device</link>.</para>
- </section>
- </chapter>
-
- <chapter id="usage-calendar">
- <title>Evolution Calendar</title>
- <para>This section shows you how to use the Evolution Calendar to manage your schedule alone or in conjunction with peers. To learn about importing calendar data, see <link linkend="importing-mail">Importing Single Files</link>, which covers the Import tool.</para>
- <itemizedlist>
- <listitem>
- <para><link linkend="usage-calendar-view">Ways of Looking at your Calendar</link></para>
- </listitem>
- <listitem>
- <para><link linkend="usage-calendar-apts">Scheduling With the Evolution Calendar</link></para>
- </listitem>
- <listitem>
- <para><link linkend="bshm4dy">Deleting Old Appointments and Meetings</link></para>
- </listitem>
- <listitem>
- <para><link linkend="usage-calendar-multiple">Multiple Calendars and Web Calendars</link></para>
- </listitem>
- <listitem>
- <para><link linkend="usage-calendar-todo">The Task Pad</link></para>
- </listitem>
- <listitem>
- <para><link linkend="bshlzlu">Configuring Time Zones</link></para>
- </listitem>
- </itemizedlist>
-
- <section id="usage-calendar-view">
- <title>Ways of Looking at your Calendar</title>
- <para>In Evolution&trade;, you can keep multiple calendars and overlay them one over the next. For example, you might have a schedule of events for work, one for home, and one for your favorite sports team. The shortcut bar lists those calendars, and you can select or deselect the boxes next to them to show and hide the appointments in your calendar view. By hiding and showing different sets of appointments, you can be sure to avoid conflicts, while keeping a minimum of clutter in your view at any one time.</para>
- <para>Appointments for each calendar appear as a different color.</para>
- <para>The toolbar offers you four different buttons that can show you different views of your calendar: </para>
- <itemizedlist>
- <listitem>
- <para>Day </para>
- </listitem>
- <listitem>
- <para>Work Week </para>
- </listitem>
- <listitem>
- <para>Week </para>
- </listitem>
- <listitem>
- <para>Month </para>
- </listitem>
- </itemizedlist>
- <para>You can also select an arbitrary range of days in the small calendar at the upper right. To do this, click and drag on the days that you want to view in your calendar.</para>
- <para>The Prev and Next buttons move you forward and back in your calendar pages. If you are using a week or month view, you can move by week or month. To return to today&apos;s listing, click the Today button in the toolbar.</para>
- <para>To visit calendar entries for a specific date, click Go To and select the date in the dialog box that appears.</para>
- </section>
-
- <section id="usage-calendar-apts">
- <title>Scheduling With the Evolution Calendar</title>
- <para>There are two types of scheduling events with Evolution, appointments and meetings. An appointment is an event you schedule for yourself only. Where a meeting is an event that you schedule multiple people for. You can also use the busy/free search for meetings to determine peoples availability.</para>
- <itemizedlist>
- <listitem>
- <para><link linkend="usage-calendar-apts-basic">Creating Appointments</link></para>
- </listitem>
- <listitem>
- <para><link linkend="usage-calendar-rsvp">Sending a Meeting Invitation</link></para>
- </listitem>
- <listitem>
- <para><link linkend="replying-to-rsvp">Accepting and Replying to a Meeting Request</link></para>
- </listitem>
- <listitem>
- <para><link linkend="receiving-rsvp-response">Reading Responses to Meeting Requests</link></para>
- </listitem>
- <listitem>
- <para><link linkend="usage-calendar-freebusy">Using the Free/Busy View</link></para>
- </listitem>
- <listitem>
- <para><link linkend="usage-calendar-freebusy-scheduling">Scheduling an Appointment</link></para>
- </listitem>
- <listitem>
- <para><link linkend="publishing-freebusy">Publishing Free/Busy Data Without a Groupware Server</link></para>
- </listitem>
- <listitem>
- <para><link linkend="accessing-freebusy-offserver">Accessing Free/Busy Data Without a Groupware Server</link></para>
- </listitem>
- </itemizedlist>
-
- <section id="usage-calendar-apts-basic">
- <title>Creating Appointments</title>
- <procedure>
- <step id="bshlods">
- <para>Click File &gt; New Appointment.</para>
- <para>or</para>
- <para>Click Calendars, then click New.</para>
- <para>or</para>
- <para>Double-click in a blank space in the calendar.</para>
- </step>
- <step id="bshlp2i">
- <para>Type a brief summary of the appointment in the Summary field.</para>
- </step>
- <step id="bshlrup">
- <para>Type a location for the appointment in the Location field.</para>
- </step>
- <step id="bshlrzp">
- <para>Select a classification in the Classification drop-down list.</para>
- </step>
- <step id="bshls74">
- <para>Select a calendar in the Calendar drop-down list.</para>
- </step>
- <step id="bshlsdj">
- <para>Type a category in the Categories field.</para>
- </step>
- <step id="bshlsib">
- <para>Type a description in the Descriptions field.</para>
- </step>
- <step id="bshlrir">
- <para>Specify a starting and ending date.</para>
- </step>
- <step id="bshlsv2">
- <para>Select whether you want this appointment to be an all day event.</para>
- </step>
- <step id="bshlt0m">
- <para>If the event is not an all day event, specify a starting and ending time.</para>
- </step>
- <step id="bshltfl">
- <para>Select whether you want to show the time as busy.</para>
- </step>
- <step id="bshlpwz">
- <para>Select if you want an alarm for this appointment. If you select an alarm specify when and how you want to the alarm to notify you.</para>
- </step>
- <step id="bshlu6p">
- <para>Click the Recurrence tab, and specify whether you want the appointment to reoccur and how often.</para>
- </step>
- </procedure>
- <para>An All Day event appears at the top of a day&apos;s appointment list, in the grey header under the date, rather than inside. That makes it easy to have appointments that overlap and fit inside each other. For example, a conference might be an All Day appointment, and the meetings at the conference could be timed appointments. Appointments with specific starting and ending times can also overlap. When they do they&apos;re displayed as multiple columns in the day view of the calendar.</para>
- <para>If you create calendar appointments that overlap, Evolution displays them side by side in your calendar. </para>
-
- <section id="bshly4v">
- <title>Reminders</title>
- <para>You can have several Reminders for individual appointments, any time prior to the appointment you schedule. You can have one reminder of each of the following types: </para>
- <formalpara id="bsb097g">
- <title>Display: </title>
- <para>A window pops up on your screen to remind you of your appointment. </para>
- </formalpara>
- <formalpara id="bsb09dl">
- <title>Audio: </title>
- <para>Your computer delivers a sound alarm. </para>
- </formalpara>
- <formalpara id="bsb09hb">
- <title>Program: </title>
- <para>You can run a program as a reminder. You can enter its name in the text field, or find it with the Browse button. </para>
- </formalpara>
- <para>If you have stored reminders in a local calendar, they work from the moment you log in. However, for reminders stored on an Exchange server, you must run Evolution at least once after logging in. No matter where the reminders are stored, you can quit Evolution and still be reminded of an upcoming appointment. </para>
- <para>If you are using a a calendar on a GroupWise&reg; or Exchange server, select a Classification for the appointment, to determine who can view it. Public is the default category, and a public appointment can be viewed by anyone on the calendar sharing network. Private denotes one level of security, and Confidential an even higher level. The different levels vary depending on your server settings; check with your system administrator or adjust your delegation settings.</para>
- <para>If you are using a GroupWise or Exchange server, other people on the server can check your schedule to see if you are available at any given time. If you have an appointment that is flexible or that you want to designate as Free rather than Busy time, select the Free box in the Show Time As section. Normally, appointments display as Busy. </para>
- <para>You can categorize appointments in the same way you can categorize contacts. Click the Categories button to open a checklist. Select the check box next to each category that matches the appointment you are creating. </para>
- <tip>
- <para>Adding a New Appointment Category</para>
- <para>You can add a new category to your category list by clicking on Edit Master Category List and single-clicking on Click here to add a category.</para>
- </tip>
- <para>After you&apos;ve selected your categories, click OK to assign these categories to the appointment. The categories you selected are now listed in the text box to the right of the Categories button.</para>
- <para>Appointments with categories appear with icons in the calendar display, and you can also search for appointments by category. To display only the appointments in a particular category, select Category Is in the search bar at the top of the calendar, and select a category.</para>
- <para>The Recurrence tab lets you describe repetition in appointments ranging from once every day up to once every 100 years. You can then choose a time and date when the appointment stops recurring, and, under Exceptions, pick individual days when the appointment does not recur. Make your selections from left to right, and you form a sentence: &ldquo;Every two weeks on Monday and Friday until January 3, 2008&rdquo; or &ldquo;Every month on the first Friday for 12 occurrences&rdquo;.</para>
- <para>After you have finished settings, click the disk icon in the toolbar to save and close the appointment editor window. If you want, you can alter an appointment summary in the calendar view by clicking on it and typing. You can change other settings by right-clicking on the appointment then choosing Open, or double-clicking the appointment.</para>
- </section>
- </section>
-
- <section id="usage-calendar-rsvp">
- <title>Sending a Meeting Invitation</title>
- <para>Evolution can be used to schedule group meetings and help you manage responses to meeting requests.</para>
- <para>When you create a meeting or group appointment, you can specify the attendees in several categories, such as &ldquo;chair&rdquo; or &ldquo;required&rdquo;. When you save the appointment listing, each attendee is sent an e-mail with the appointment information, which also gives them the option to respond.</para>
- <para>If you don&apos;t need to collect attendance information when you&apos;re scheduling an event, and would rather just announce it, click Actions &gt; Forward as iCalendar. This opens a new e-mail message with the event notification attached as an announcement. Recipients can add the event to their calendars with one click, but it won&apos;t automatically send you e-mail about whether they plan to attend.</para>
- <para>To schedule a meeting: </para>
- <procedure>
- <step id="bsb0agm">
- <para>Click File &gt; New &gt; Meeting, then click the Invitation tab.</para>
- </step>
- <step id="bsb0ao0">
- <para>If you have multiple e-mail accounts, select the one to use by selecting an item in the Organizer field.</para>
- </step>
- <step id="bsb0b04">
- <para>Click Add to add an attendee to enter the names and e-mail addresses of people you will invite.</para>
- </step>
- <step id="bsb0bjm">
- <para>Click OK.</para>
- </step>
- </procedure>
- <para>An e-mail is sent out to all the recipients, inviting them to your event.</para>
- <note>
- <para>A meeting can have only one organizer, and only the organizer can add participants. You can designate yourself the organizer of the meeting, but unless you coordinate that action with the organizer you are replacing, you could create confusion in the scheduling process. If you want to invite additional people to a meeting without changing the organizer, it&rsquo;s best to forward the first organizer&rsquo;s message to the additional participants.</para>
- </note>
- </section>
-
- <section id="replying-to-rsvp">
- <title>
-Accepting and Replying to a Meeting Request</title>
- <para>Meeting requests are sent as iCal attachments. To view or respond to one, click the attachment icon and view it inline in the mail window. All the details are shown about the event, including time and dates. Then you can choose how to reply to the invitation. Your choices are:</para>
- <itemizedlist>
- <listitem>
- <para>Accept</para>
- </listitem>
- <listitem>
- <para>Tentatively Accept</para>
- </listitem>
- <listitem>
- <para>Decline</para>
- </listitem>
- </itemizedlist>
- <para>Click OK, an e-mail is sent to the organizer with your answer. The event will also be added to your calendar if you accept.</para>
- <para>After you add the meeting to your calendar, you can make changes to the information, but if the original organizer sends out another update, your changes might be overwritten.</para>
- </section>
-
- <section id="receiving-rsvp-response">
- <title>Reading Responses to Meeting Requests</title>
- <para>When you get a reply to a meeting invitation you sent, you can view it inline by clicking the attachment and selecting View Inline. At the bottom, you can click OK to update your attendee list.</para>
- </section>
-
- <section id="usage-calendar-freebusy">
- <title>Using the Free/Busy View</title>
- <para>In addition to the standard meeting scheduling tools, you can use the Free/Busy view to check whether people are available in advance. The Free/Busy feature is normally a function of dedicated groupware servers such as Exchange and Groupwise. However, you can also publish Free/Busy information online, and access Free/Busy information published elsewhere. If not everyone you collaborate with publishes Free/Busy data, you can still use iCal event invitations to coordinate schedules with other people.</para>
- <para>To access the free/busy view: </para>
- <procedure>
- <step id="bsbzmp5">
- <para>Click File &gt; New &gt; Meeting.</para>
- </step>
- <step id="bsb0c7x">
- <para>Click the Scheduling tab.</para>
- <informalfigure id="bs4aw7i">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/schedule.png"/></imageobject></mediaobject>
-
- </informalfigure>
- </step>
- </procedure>
- <formalpara id="bsb0cyw">
- <title>Attendee List: </title>
- <para>The Attendee List shows the people who have been invited to the appointment. It also shows their RSVP status.</para>
- </formalpara>
- <formalpara id="bsb0da3">
- <title>Schedule Grid: </title>
- <para>The Schedule Grid shows the published Free/Busy information for the people you have invited. This is where you compare schedules to find free time to schedule the appointment. Individuals will only have visible scheduling information if they use the same GroupWise or Exchange server you do (that is, if they are in the same organization as you), or if they publish free/busy information at a URL you can reach and you have entered that URL into their contact cards using the contact editor.</para>
- </formalpara>
-
- <section id="usage-calendar-freebusy-scheduling">
- <title>Scheduling an Appointment</title>
- <para>To schedule an appointment, you first need people&apos;s Free/Busy information. If you&rsquo;re using the Evolution Connector for Microsoft Exchange, all of the information is already available to you in the Global Address List. Otherwise, each person needs to e-mail you their schedule files and you need to incorporate them into your calendar.</para>
- <para>Regardless of how you get the information, Evolution will display it in the Scheduling tab. The pending appointment time appears in white with bold black borders. Each attendee&rsquo;s free and busy times appear color-coded next to their names in the attendee list.</para>
- <para>Adjust the meeting time, either by dragging the meeting borders or by using the Autopick buttons to choose a time automatically, then click Save and Close. Attendees on an Exchange server have the appointment updated automatically; others receive e-mail notification of any change in plans.</para>
- <para>Read <link linkend="full-advantage">Scheduling Appointments with Free/Busy</link> to learn about how to use this feature with the Evolution Connector for Microsoft Exchange. </para>
- </section>
-
- <section id="publishing-freebusy">
- <title>Publishing Free/Busy Data Without a Groupware Server</title>
- <para>You can publish Free/Busy information to a WebDAV or other Web server with HTTP PUT support. Check with your system administrator if you are not sure you have this functionality.</para>
- <para>To set up Free/Busy publishing, select Tools &gt; Settings, then click Calendar and Tasks. In the Free/Busy Publishing tab, click Add, then specify the URL for your upload server. Select the frequency with which you wish to upload data, the calendars for which you wish to display data, your username and password, then click OK. </para>
- <para>To have Free/Busy data published immediately, go to the Calendar tool and click Actions &gt; Publish Free/Busy.</para>
- </section>
-
- <section id="accessing-freebusy-offserver">
- <title>Accessing Free/Busy Data Without a Groupware Server</title>
- <para>If someone gives you a URL for Free/Busy data or for their Web calendar, you can enter it as part of the contact information in the Contacts tool. Then, when you schedule a meeting with them, Evolution looks up the schedule and display it in the meeting planner.</para>
- </section>
- </section>
- </section>
-
- <section id="bshm4dy">
- <title>Deleting Old Appointments and Meetings</title>
- <para>Keeping a list of everything you did in the past will eventually slow down your calendar. To delete old events, click Actions &gt; Purge, then enter the number of days of past events you want to keep. </para>
- </section>
-
- <section id="usage-calendar-multiple">
- <title>Multiple Calendars and Web Calendars</title>
- <para>To create a new calendar, click File &gt; New &gt; Calendar. If the calendar is one you plan to store locally, you need only provide a name and color. If it is a remote calendar, enter the name, color, URL, and a refresh frequency. The refresh frequency determines how often Evolution checks to see if the calendar has changed. If you are working with someone who publishes an online calendar, you might want to check for updates every thirty minutes. On the other hand, if you have displayed a sports team schedule in your calendar, you might not need to refresh it more than once a week.</para>
- <para>The <ulink url="http://icalshare.com">icalshare.com</ulink> Web site has an extensive list of shared online calendars, including national and religious holidays, phases of the moon, sports, and local and regional events.</para>
- </section>
-
- <section id="usage-calendar-todo">
- <title>The Task Pad</title>
- <para>The Task Pad, located in the lower right corner of the calendar, lets you keep a list of tasks separate from your calendar appointments. You can use the list in a larger window by clicking the Tasks button in the shortcut bar or in the folder tree.</para>
- <para>To record a new task:</para>
- <procedure>
- <step id="bshmfan">
- <para>Click New.</para>
- </step>
- <step id="bshmlb7">
- <para>Type a summary for the task.</para>
- </step>
- <step id="bshmlf2">
- <para>Select a classification and group for the task.</para>
- </step>
- <step id="bshmlj7">
- <para>Type a category for the task.</para>
- </step>
- <step id="bshmlnu">
- <para>Type a description for the task.</para>
- </step>
- <step id="bshmlr5">
- <para>(Optional) Specify a starting date and ending date for the task.</para>
- </step>
- <step id="bshmlv0">
- <para>(Optional) Specify a starting time and ending time for the task.</para>
- </step>
- <step id="bshmmce">
- <para>(Optional) Click the Status tab, then specify a status for the task.</para>
- </step>
- </procedure>
- <para>After you&apos;ve added a task to your to-do list, its summary appears in the Summary section of the task list. To view or edit a detailed description of an item, double-click it, or right-click it and select Open. You can delete items by selecting them, then click Delete.</para>
- <para>The list of tasks is sorted in a similar way to the list of e-mail messages in Evolution Mail. Click once on the message headers to change the direction and type of sorting, or right-click to add or remove columns from the display.</para>
-
- <section id="task-folders">
- <title>Task Groups</title>
- <para>As with calendars, you can create multiple task groups. Task groups are more easily organized in the dedicated Tasks tool. Each task group is assigned a color, and you can use the Tasks tool shortcut bar to hide and show task groups just like calendars. In the calendar display task pad, tasks from all visible task groups appear, color coded by group. To create a new task group, select New Task Group. You are prompted for a name, color, and location for the task group. If the task group is online, you need to provide the URL for it.</para>
- </section>
- </section>
-
- <section id="bshlzlu">
- <title>Configuring Time Zones</title>
- <para>Evolution supports the use of time zones. If you share calendar files with friends or co-workers, it is possible you will need to configure your time zone. To configure your time zone: </para>
- <procedure>
- <step id="bsb07m1">
- <para>Click Tools &gt; Settings, then click Calendar and Tasks.</para>
- </step>
- <step id="bsb07qx">
- <para>Click the icon next to the Time Zone field, then select your location.</para>
- <para>Each red dot represents a major city.</para>
- </step>
- <step id="bsb08u5">
- <para>Select a city, then click OK.</para>
- </step>
- </procedure>
- <para>You can also configure time zone information specific to the Start and End time in each appointment. To do that, simply create a new appointment and click on a globe to customize the time zone that the time exists in. For example, if you live in New York but have a telephone meeting set for noon with someone in California, you need to make sure that you&apos;re not calling each other at the worst time. Setting time zones on a per-appointment basis helps avoid that potential confusion.</para>
- </section>
- </chapter>
-
- <chapter id="bs4tmzx">
- <title>Connecting to GroupWise</title>
- <para>The GroupWise&reg; Connector enables you to connect Evolution&trade; to a GroupWise e-mail system. The following GroupWise features are supported in Evolution using the GroupWise Connector:</para>
- <itemizedlist>
- <listitem>
- <para>Creation of GroupWise accounts</para>
- </listitem>
- <listitem>
- <para>Access to GroupWise mailboxes</para>
- </listitem>
- <listitem>
- <para>Calendar</para>
- </listitem>
- <listitem>
- <para>Address Book</para>
- </listitem>
- <listitem>
- <para>Tasks</para>
- </listitem>
- <listitem>
- <para>Posted Calendar items</para>
- </listitem>
- <listitem>
- <para>Autocompletion of Contact names</para>
- </listitem>
- </itemizedlist>
-
- <section id="bs4tpft">
- <title>Configuring Evolution for GroupWise</title>
- <para>In order to have the best support for GroupWise in Evolution, you should immediately upgrade Evolution to 2.0.</para>
- <para>If this is your first time starting Evolution, the Evolution Account Assistant window appears. If the Evolution Account Assistant window does not appear, click Tools &gt; Settings, then click Mail Accounts. </para>
- <procedure>
- <step id="brugnl1">
- <para>Click Forward.</para>
- </step>
- <step id="brul5zm">
- <para>Type your full name and e-mail address in the appropriate fields.</para>
- </step>
- <step id="brul6x4">
- <para>(Optional) Type your Reply To address and your organization in the appropriate fields.</para>
- </step>
- <step id="brul75e">
- <para>Select your default signature.</para>
- <para>or</para>
- <para>Click Add New Signature to add a signature.</para>
- </step>
- <step id="brul7u4">
- <para>Select GroupWise as the server type.</para>
- </step>
- <step id="brul803">
- <para>Type your hostname and username in the appropriate fields.</para>
- </step>
- <step id="brul8hd">
- <para>Select your security and authentication options.</para>
- </step>
- <step id="brvz9su">
- <para>Click Forward.</para>
- </step>
- <step id="brvz9uz">
- <para>Select how to check for new mail.</para>
- </step>
- <step id="brvzaky">
- <para>Specify your Post Office Agent address.</para>
- </step>
- <step id="bsj58yl">
- <para>If your POA is configured to use a different port number, specify the correct port number in the appropriate field.</para>
- <para>The Post Office Agent SOAP field displays the port number on which the Evolution client communicates with the Post Office Agent (POA). This is the same port number that the POA uses for HTTP communication, which by default is 7181.</para>
- </step>
- <step id="brvzb06">
- <para>Click Forward.</para>
- </step>
- <step id="bsj5a77">
- <para>Select either SMTP or Sendmail as your sending method.</para>
- </step>
- <step id="bsj5az8">
- <para>If you selected SMTP, specify your host address, specify if your server requires authentication, and specify any security and authentication settings, then click Forward.</para>
- <para>or</para>
- <para>If you selected Sendmail, click Forward.</para>
- </step>
- <step id="brvzhi2">
- <para>Type your Account Name in the Name field.</para>
- </step>
- <step id="brvzhs5">
- <para>Click Forward.</para>
- </step>
- <step id="brvzhvz">
- <para>Click Apply. </para>
- <para>The account screen appears, displaying your new Novell GroupWise account.</para>
- </step>
- <step id="brw11e1">
- <para>Click Close to return to Evolution.</para>
- </step>
- </procedure>
- </section>
- </chapter>
-
- <chapter id="usage-exchange">
- <title>Connecting to Exchange Servers</title>
- <para>The Evolution&trade; Connector for Microsoft Exchange allows Evolution clients to access accounts on Microsoft Exchange 2000 servers. It is available through Red Carpet in its own channel. Like Evolution, it is free software and licensed under the GPL. </para>
- <itemizedlist>
- <listitem>
- <para><link linkend="new-in-connector">What's New in Connector 2.0</link></para>
- </listitem>
- <listitem>
- <para><link linkend="features">Connector Features</link></para>
- </listitem>
- <listitem>
- <para><link linkend="install">Installing the Connector</link></para>
- </listitem>
- <listitem>
- <para><link linkend="exchange-configure">Adding your Exchange Account to Evolution</link></para>
- </listitem>
- <listitem>
- <para><link linkend="access">Accessing the Exchange Server</link></para>
- </listitem>
- <listitem>
- <para><link linkend="exchange-settings">Setting Exclusive to the Exchange Connector</link></para>
- </listitem>
- <listitem>
- <para><link linkend="full-advantage">Scheduling Appointments with Free/Busy</link></para>
- </listitem>
- </itemizedlist>
- <important>
- <para>Evolution Connector works only with Exchange 2000 and later, and requires that Outlook Web Access be enabled. Each user needs a valid Microsoft Exchange server account, including license.</para>
- </important>
-
- <section id="features">
- <title>Connector Features</title>
- <para>Evolution Connector supports the following basic Microsoft Exchange features: </para>
- <itemizedlist>
- <listitem>
- <para>General </para>
- <itemizedlist>
- <listitem>
- <para>Remote Exchange Information Store</para>
- <para>Allows you to access mail, address book (including the Global Address List folder), and calendars, and task folders on an Exchange 2000 server from Evolution.</para>
- </listitem>
- <listitem>
- <para>Palm Synchronization</para>
- <para>Supported for Contacts and Calendars on Exchange.</para>
- </listitem>
- <listitem>
- <para>Password Management</para>
- <para>To change your password, go to the Exchange tool and click Actions &gt; Change Exchange Password. If your password has expired, Evolution asks you to change your password when you start up.</para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>Mail </para>
- <itemizedlist>
- <listitem>
- <para>Viewing Mail in Exchange Folders</para>
- <para>Mail stored on the Exchange server is visible in the Mail and Exchange tools in Evolution. </para>
- </listitem>
- <listitem>
- <para>Sending E-Mail via Exchange Protocols</para>
- <para>You might use the Microsoft Exchange mail transport protocol to send e-mail. Make sure that the address you have entered as your e-mail address is exactly the one that the Exchange server has on file. This may be &ldquo;yourname@exchange-server.your_domain.com&rdquo; rather than &ldquo;yourname@your_domain.com&rdquo;.</para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>Calendar </para>
- <itemizedlist>
- <listitem>
- <para>Meeting Request/Proposal</para>
- <para>Allows Evolution users to schedule meetings and view attendee availability for other users (Evolution or Outlook users) on Exchange.</para>
- </listitem>
- <listitem>
- <para>Adding iCalendar Meeting Requests to the Calendar</para>
- <para>If you receive an iCalendar meeting request and add it to your calendar, it is saved to your Exchange calendar.</para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>Contacts </para>
- <itemizedlist>
- <listitem>
- <para>Address Completion</para>
- <para>Supported for your Exchange Contacts folder. Not yet supported for the Global Address List.</para>
- </listitem>
- <listitem>
- <para>Adding vCards to the Address Book</para>
- <para>If you receive a VCard attachment and click Save in Address Book, it is saved to your Exchange address book.</para>
- <para>New Address Book entries can be created on Exchange from received e-mail messages with a single click</para>
- </listitem>
- </itemizedlist>
- </listitem>
- </itemizedlist>
- <para>There are, however, some features that are not available:</para>
- <itemizedlist>
- <listitem>
- <para>Work Offline (disconnected mode). </para>
- </listitem>
- <listitem>
- <para>Recall Message function. </para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="install">
- <title>Installing the Connector</title>
- <para>To install the Evolution Connector, run Red Carpet by clicking System &gt; Get Software. Subscribe to the Evolution Connector for Microsoft Exchange channel, select the Evolution Connector for Microsoft Exchange 2000, then click the Install button. You can also install the Connector by downloading the individual packages from ftp.ximian.com if you wish.</para>
- </section>
-
- <section id="exchange-configure">
- <title>Adding your Exchange Account to Evolution</title>
- <para>After you have installed the Connector, you need to set up access for your Exchange account on both the Exchange server and within Evolution.</para>
-
- <section id="config-server">
- <title>Exchange Server Settings</title>
- <para>Check with your system administrator to ensure that: </para>
- <itemizedlist>
- <listitem>
- <para> You have a valid account on the Exchange server.</para>
- </listitem>
- <listitem>
- <para>You are permitted to access the account with WebDAV. This is the default setting for the Exchange server, so unless your system administrator has specifically turned it off, no changes should be necessary.</para>
- </listitem>
- </itemizedlist>
- <para>The Novell Web site knowledgebase, at <ulink url="http://support.novell.com">support.novell.com</ulink>, has additional information about checking to make sure that your Exchange server accepts connections from Evolution.</para>
- </section>
-
- <section id="config-client">
- <title>Standard Configuration Tool for Evolution Connector</title>
- <para>When you know that your server is ready for you to connect, you are ready to add your Exchange account to Evolution Connector.</para>
-
- <section id="config-easy">
- <title>Simple Configuration Tool for Evolution Connector</title>
- <para>Evolution Connector 1.4 comes with a simple account creation tool for some installations. Other installations require the standard account tool described in <link linkend="config-client">Standard Configuration Tool for Evolution Connector</link> below.</para>
- <para>If you have no accounts configured, the simple assistant starts when you start Evolution. It asks only for the name of your Outlook Web Access server, and your username and password. Evolution Connector determines the remaining information on its own.</para>
- <para>If the simple account tool does not run automatically, create an account as described below.</para>
- </section>
-
- <section id="config-exchange-new-account">
- <title>Creating a New Exchange Account</title>
- <para>If you would like to create a new account for your Exchange server:</para>
- <procedure>
- <step id="bshnbof">
- <para>Click Tools &gt; Mail Settings.</para>
- </step>
- <step id="bshnbsi">
- <para>Click Accounts List, then click Add.</para>
- </step>
- <step id="bshnbxz">
- <para>Create the account following the procedure in <link linkend="usage-mainwindow-starting">Starting Evolution for the First Time</link>.</para>
- </step>
- </procedure>
- </section>
-
- <section id="config-exchange-existing-account">
- <title>Changing an Existing Account to Work with Exchange</title>
- <para>If you have an existing e-mail account, and want to convert it to use for Exchange, select the account you want to convert and click Edit. </para>
- <procedure>
- <step id="bshngg7">
- <para>Click the Identity tab, change your e-mail address as needed.</para>
- <informalfigure id="bs4aw7j">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/exchange-identity.png"/></imageobject></mediaobject>
-
- </informalfigure>
- </step>
- <step id="bshngsm">
- <para>Click the Receiving Mail tab, then select Microsoft Exchange as your server type. </para>
- </step>
- <step id="bshnh8h">
- <para>Type the name of your mail server, your user name, and select whether to use SSL.</para>
- <informalfigure id="bs4aw7k">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/exchange-receive.png"/></imageobject></mediaobject>
-
- </informalfigure>
- </step>
- <step id="bshnhvg">
- <para>Click the Receiving Options tab, then specify how often to check for new mail, your Global Catalog server name, your Exchange Mailbox name, your OWA path, your public folder server, and whether to apply filters to messages in your Inbox.</para>
- <informalfigure id="bs4aw7l">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/exchange-receive-options.png"/></imageobject></mediaobject>
-
- </informalfigure>
- </step>
- <step id="bshnjw0">
- <para>Click the Sending Mail tab, then select Microsoft Exchange as your server type.</para>
- </step>
- <step id="bshnkd2">
- <para>Specify the server name.</para>
- </step>
- <step id="bshnkk6">
- <para>Click OK.</para>
- </step>
- <step id="bshnkmu">
- <para>Quit Evolution and start it up again. Changes to the Evolution Connector accounts configuration are not active until you have restarted the application.</para>
- </step>
- </procedure>
- </section>
- </section>
- </section>
-
- <section id="access">
- <title>Accessing the Exchange Server</title>
- <para>When you have installed the Connector, an Exchange button is available in the shortcut bar. The Exchange tool is used only to access public folders and to perform certain Exchange actions like delegation and password management. Use the regular Mail tool for mail, the Contacts tool for contacts, and the Calendar tool for your schedule.</para>
- <para>If you are using both an Exchange account and a local mail account, you should be aware that whenever you save an e-mail address or appointment from an e-mail message, it is saved in your Exchange contacts list or calendar, rather than in your local account. The same is true of synchronization with Palm OS devices; tasks, appointments, and addresses from your Palm OS device are synchronized with those in the Exchange folders rather than local folders. </para>
- <para>To avoid unnecessary strain on the server, the GAL will appear empty until you have searched for something in it. If you want to display all the cards in the list, click in the search box and press Enter. This enters a blank search, and every card appears.</para>
- </section>
-
- <section id="exchange-settings">
- <title>Setting Exclusive to the Exchange Connector</title>
- <para>There are two items in the Evolution preferences window that are available only with Evolution Connector. The first is delegation and permissions handling, and the second is the creation of &ldquo;Out of Office&rdquo; messages.</para>
-
- <section id="exchange-delegate">
- <title>Access Delegation</title>
- <para>You can allow other people in your organization&apos;s Global Address List to access your calendar, address book, and messages, and they can let you manage theirs. Delegation allows people to do anything from check on each other&apos;s schedules to completely manage their personal information.</para>
-
- <section id="exchange-delegate-to-others">
- <title>Delegating Access to Others</title>
- <para>To add someone to your list of delegates, click Add and select them from the Global Address List. When delegating you can grant different levels of access to different types of data. You can also decide whether the access you grant applies to items marked Private, or only to public items.</para>
- <informalfigure id="bs4aw7m">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/exchange-delegation.png"/></imageobject></mediaobject>
-
- </informalfigure>
- <para>For each of the four types of folder, you can select one of the following levels of access:</para>
- <formalpara id="bsbg9j6">
- <title>None: </title>
- <para>Do not allow this person to access any folders of this type.</para>
- </formalpara>
- <formalpara id="bsbg9oa">
- <title>Reviewer (read-only): </title>
- <para>Allow the person to see items in this type of folder, but not create new items or edit existing items.</para>
- </formalpara>
- <formalpara id="bsbg9ts">
- <title>Author (read, create): </title>
- <para>The delegate can view items in your folders, and can create new items, but cannot change any existing items.</para>
- </formalpara>
- <formalpara id="bsbg9yy">
- <title>Editor (read, create, edit): </title>
- <para>The delegate can view, create, and change items in your folders.</para>
- </formalpara>
- </section>
-
- <section id="exchange-delegated-to-you">
- <title>Acting as a Delegate for Others</title>
- <para>To see the list of people who have granted you access to their folders, click the Acting as a Delegate tab in the Exchange Delegation settings window. If you plan to send e-mail on behalf of someone, select the check box next to the name, and an e-mail identity is created. You can then select that identity in the From list in your message composer.</para>
- <para>To access the folders delegated to you: </para>
- <procedure>
- <step id="bshok43">
- <para>Click File &gt; Open &gt; Other User&apos;s Folder.</para>
- </step>
- <step id="bshokwk">
- <para>Specify the e-mail address of the user who has delegated to you, or click User to select the user from your address book.</para>
- </step>
- <step id="bshol98">
- <para>Select the folder you want to open.</para>
- </step>
- <step id="bsholc3">
- <para>Click OK.</para>
- </step>
- </procedure>
- <para>Folders delegated to you appear in your folder list inside a folder labeled with the name of its owner. For example, if Martha Thompson delegates folders to you, you will see a folder called Martha Thompson&apos;s Folders in the folder tree at the same level as your Personal Folders and Public Folders. </para>
- <para>If the folder fails to open properly, check with the folder owner to make sure that you have been granted the correct access permissions.</para>
- </section>
- </section>
-
- <section id="exchange-out-of-office">
- <title>Setting an Out of Office Message</title>
- <para>An Out of Office message is an automatic reply that you can send as a reply to e-mails, explaining why you aren&apos;t immediately responding to their messages. For example, if you go on vacation for a week and will be away from e-mail, you can set an automatic reply so that people who write to you know that you aren&rsquo;t ignoring them.</para>
- <procedure>
- <step id="bsbgb7t">
- <para>Click Tools &gt; Settings, then click Out of Office.</para>
- </step>
- <step id="bsbgbe3">
- <para>Click I Am Currently Out of the Office. </para>
- </step>
- <step id="bsbgbi0">
- <para>Type a short message in the text field.</para>
- </step>
- <step id="bsbgbl5">
- <para>Click OK.</para>
- </step>
- </procedure>
- <para>Your message will be sent automatically to anyone who sends you mail until you return and click I Am Currently in the Office.</para>
- </section>
- </section>
-
- <section id="full-advantage">
- <title>Scheduling Appointments with Free/Busy</title>
- <para>When you schedule a meeting with your calendar on the Exchange server, you can check when other local Exchange users are busy according to their Exchange calendars. To do so:</para>
- <informalfigure id="bs4aw7n">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/schedule.png"/></imageobject></mediaobject>
-
- </informalfigure>
- <para>Reminders for appointments in your Exchange calendar do not work until you have run Evolution at least once after logging in. This is different from locally stored reminders, which work from the moment you log in, regardless of whether you have run Evolution in the session. </para>
- <procedure>
- <step id="bsbgc5a">
- <para>Open a new appointment in the calendar.</para>
- </step>
- <step id="bsbgc8b">
- <para>Click Actions &gt; Schedule Meeting.</para>
- </step>
- <step id="bsbgccj">
- <para>Add attendees, either by entering their e-mail addresses into the list, or by clicking the Invite Others button. </para>
- <para>If you choose to do this, it&apos;s best to use the Global Address List (GAL). Choose the GAL from the drop-down list of address sources at the top of the dialog box.</para>
- </step>
- <step id="bsbgcft">
- <para>Click Options, then Update Free/Busy to check participant schedules and, if possible, update the meeting in all participants&apos; calendars.</para>
- </step>
- </procedure>
- <para>If meeting attendees are not available during the times you have scheduled a meeting, you can &ldquo;nudge&rdquo; the meeting forward or backward to the nearest available time. To do so, just click the arrows to the left or right of the Autopick button. The Autopick tool moves the meeting to the nearest time during which all attendees are available. If you aren&rsquo;t satisfied with those results, you can drag the edges of the meeting time to the hours that you want to select.</para>
- </section>
- </chapter>
-
- <chapter id="config-prefs">
- <title>Advanced Configuration</title>
- <para>Perhaps your mail server has changed names. Perhaps you&apos;ve grown tired of a certain layout for your appointments. Whatever the reason, you want to change your Evolution&trade; settings. This section will tell you how to do just that.</para>
- <itemizedlist>
- <listitem>
- <para><link linkend="config-prefs-mail-identity">Working with Mail Accounts</link></para>
- </listitem>
- <listitem>
- <para><link linkend="bshoq5l">Autocompletion</link></para>
- </listitem>
- <listitem>
- <para><link linkend="config-prefs-mail">Mail Preferences</link></para>
- </listitem>
- <listitem>
- <para><link linkend="config-prefs-mail-composer">Composer Preferences</link></para>
- </listitem>
- <listitem>
- <para><link linkend="config-prefs-cal">Calendar and Tasks Settings</link></para>
- </listitem>
- <listitem>
- <para><link linkend="config-prefs-contact">Directory Servers</link></para>
- </listitem>
- <listitem>
- <para><link linkend="bshoty0">Certificates</link></para>
- </listitem>
- </itemizedlist>
- <para>You can reach the Evolution settings window by clicking Tools &gt; Settings, no matter where you are in Evolution. On the left half of the settings window is a column, similar to the Evolution shortcut bar, that lets you choose which portion of Evolution to customize. The right half of the window is where you&rsquo;ll make your actual changes.</para>
- <informalfigure id="config-prefs-mail-fig">
- <mediaobject><imageobject><imagedata format="PNG" fileref="figures/config-mail.png"/></imageobject></mediaobject>
-
- </informalfigure>
- <para>There are six items you can customize. From top to bottom, they are:</para>
- <variablelist>
- <varlistentry>
- <term><emphasis>Mail Accounts</emphasis></term>
- <listitem>
- <para>Add or change information about your e-mail accounts: the servers to which you connect, the way you download mail, your password authentication mode, and so forth. This is the most complex item in the list, and is covered in <link linkend="config-prefs-mail-identity">Working with Mail Accounts</link>.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><emphasis>Autocompletion</emphasis></term>
- <listitem>
- <para>Set the contact groups to be used when completing e-mail addresses in the message composer. For more information, see <link linkend="bshoq5l">Autocompletion</link>.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><emphasis>Mail Preferences</emphasis></term>
- <listitem>
- <para>These are overall mail reading preferences: display settings, notification options, security, and so forth. Settings that vary per account are in the Mail Accounts tool, described in <link linkend="config-prefs-mail-identity">Working with Mail Accounts</link>, but most of the mail settings are in <link linkend="config-prefs-mail">Mail Preferences</link>.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><emphasis>Composer Preferences</emphasis></term>
- <listitem>
- <para>Settings for the way that you use the mail composer: shortcuts, signatures, spelling, and so forth. This includes the ability to substitute graphical smiley-faces for &ldquo;emoticons&rdquo; such as :) that many people use in e-mail. This tool is covered in <link linkend="config-prefs-mail-composer">Composer Preferences</link>.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><emphasis>Calendar and Tasks</emphasis></term>
- <listitem>
- <para>Here, you can set the way the calendar behaves, including your time zone and the length of your work week. For more information, see <link linkend="config-prefs-cal">Calendar and Tasks Settings</link>. </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><emphasis>Certificates</emphasis></term>
- <listitem>
- <para>Certificate handling for S/MIME security systems. For more information, see <link linkend="bshoty0">Certificates</link>.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- <para>Previous versions of Evolution included directory servers, folder settings, and Exchange delegation in the settings tool. Directory servers can now be set up as contacts groups in the Contacts tool, you can change folder settings in the folder right-click menu, and Exchange delegation is available in the Actions menu of the Exchange tool. </para>
-
- <section id="config-prefs-mail-identity">
- <title>Working with Mail Accounts</title>
- <para>Evolution allows you to maintain multiple accounts, or identities. When you are writing an e-mail message, you can which account to use by selecting from the drop-down list next to the From entry in the message composer. </para>
- <para>Clicking Send/Receive checks all mail sources that are not disabled. If you don&apos;t want to check mail for a given account, select it in the Mail Accounts tab and click the Disable button. </para>
- <para>To add a new account, click Add to open the mail configuration assistant. To alter an existing account, select it in the Preferences window, and then click Edit to open the account editor dialog.</para>
- <para>The account editor dialog box has six sections:</para>
- <formalpara id="bsbhdwn">
- <title>Identity: </title>
- <para>Specify the name and e-mail address for this account. You can also choose a default signature to insert into messages sent from this account.</para>
- </formalpara>
- <formalpara id="bsbhe10">
- <title>Receiving Mail: </title>
- <para>Select the way you receive mail: you can download mail from a server (<link linkend="pop">POP</link>), read and keep it on the server (Microsoft Exchange, Novell GroupWise&reg;, or <link linkend="imap">IMAP</link>), or read it from files that already exist on your desktop computer. Your server require you to use a Secure Socket Layer (SSL) connection. You can select Always, Whenever Possible, or Never as your SSL choice. If one doesn&rsquo;t work, try another.</para>
- </formalpara>
- <para>Your system administrator might ask you to connect to a specific port on a mail server. To specify which port you use, just type a colon and the port number after the server name. For example, to connect to port 143 on the server smtp.omniport.com, specify smtp.omniport.com:143 as the server name.</para>
- <formalpara id="bsbhezv">
- <title>Receiving Options: </title>
- <para>Decide you want to check for mail automatically and how often, as well as setting other message retrieval options. </para>
- </formalpara>
- <para>If you select POP as your method of receiving mail:</para>
- <itemizedlist>
- <listitem>
- <formalpara id="bsbhg72">
- <title>Checking for New Mail: </title>
- <para>If you want Evolution to check for new mail automatically, select this option and specify a frequency in minutes.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsbhgbi">
- <title>Leaving Messages on Server: </title>
- <para>If you want to store copies of your mail on the server, select this option.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsbhgg1">
- <title>Disable Support for All POP3 Extensions: </title>
- <para>Some e-mail servers refuse to work with the extended POP3 command set; select this option to have Evolution use a more limited set of interactions with the server. If your server periodically drops your connection, this option may help.</para>
- </formalpara>
- </listitem>
- </itemizedlist>
- <para>If you selected Microsoft Exchange as your method of receiving mail:</para>
- <itemizedlist>
- <listitem>
- <formalpara id="bsbhis9">
- <title>Checking for New Mail: </title>
- <para>If you want Evolution to check for new mail automatically, select this option and specify a frequency in minutes.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsbhivn">
- <title>Global Catalog Server Name: </title>
- <para>Specify the name of your Global Catalog server to create a folder for your organization&apos;s Global Address List.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsbhj13">
- <title>Limit Number of Responses: </title>
- <para>Select a maximum number of results for an address search. Lowering the maximum number decreases the load on your system and on your network. Most servers do not send more than 1000 results, regardless of the value you select here.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsbhj5l">
- <title>Mailbox Name: </title>
- <para>Specify your mailbox name.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsbhj9g">
- <title>OWA Path: </title>
- <para>Specify the path used with Outlook Web Access on your server.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsbhjel">
- <title>Public Folder Server: </title>
- <para>Specify the name of your public folder server, if it differs from your Exchange server.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsbhjj7">
- <title>Apply Filters to New Messages in Inbox on This Server: </title>
- <para>Select this option if you want to apply filters to this account.</para>
- </formalpara>
- </listitem>
- </itemizedlist>
- <para>If you selected IMAP as your method of receiving mail:</para>
- <itemizedlist>
- <listitem>
- <formalpara id="bsbhjt4">
- <title>Checking for New Mail: </title>
- <para>If you want Evolution to check for new mail automatically, select this option and specify a frequency in minutes. </para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsbhjwx">
- <title>Check All IMAP Folders: </title>
- <para>If you want Evolution to check for new messages in all your IMAP folders, select Check for New Messages in All Folders.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsbhkee">
- <title>Show Only Subscribed Folders: </title>
- <para>Select this option if you have more folders in your IMAP view than you want to read.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsbhkj2">
- <title>Override Server-Supplied Namespace: </title>
- <para>You can specify a specific directory where your server stores mail for you. Typical values are &ldquo;mail&rdquo; and &ldquo;Mail&rdquo;. For more information about how to use IMAP mail, see <link linkend="usage-mail-subscriptions">IMAP Subscriptions Manager</link>.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsbhkpi">
- <title>Apply Filters to New Messages in the Inbox on This Server: </title>
- <para>You want your filters to work on this account, select this option.</para>
- </formalpara>
- </listitem>
- </itemizedlist>
- <para>If you chose GroupWise as your method of receiving mail:</para>
- <itemizedlist>
- <listitem>
- <formalpara id="bsbhkxv">
- <title>Checking for New Mail: </title>
- <para>If you want Evolution to check for new mail automatically, select this option and specify a frequency in minutes. </para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsbhl3t">
- <title>Check all GroupWise folders: </title>
- <para>If you want Evolution to check for new messages in all your GroupWise folders, select Check for New Messages in All Folders.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsbhl8n">
- <title>Apply Filters to New Messages in the Inbox on This Server: </title>
- <para>If you want your filters to work on this account, select this option.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsbhljh">
- <title>Automatically Synchronize Remote Mail Locally: </title>
- <para>This setting downloads all mail immediately, instead of waiting until you try to open the message. This setting makes Evolution slower at first, but faster after the download. Not selecting it means that Evolution takes longer to display each additional message, but does not waste time trying to download every single message.</para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsbhlo0">
- <title>Post Office Agent SOAP Port: </title>
- <para>If your post office agent uses a SOAP port other than the default, specify it here. The SOAP port is what allows Evolution to access the GroupWise address book and calendar. Your system administrator knows the port. If there are not many Linux users in your organization, you might also need to request that the SOAP service be enabled.</para>
- </formalpara>
- </listitem>
- </itemizedlist>
- <formalpara id="bsbhltb">
- <title>Sending Mail: </title>
- <para>Use this section to choose and configure a method for sending mail. You can choose <link linkend="smtp">SMTP</link>, Microsoft Exchange (if you have installed the Evolution Connector for Microsoft Exchange) or <link linkend="sendmail">Sendmail</link>.</para>
- </formalpara>
- <para>If you choose Exchange or Sendmail, you&apos;re done with this page. However, SMTP offers you a choice of hostname, connection security level, and authentication type, which you will recognize as similar to those for IMAP and POP servers in the Receiving Mail tab.</para>
- <formalpara id="bsbhn0t">
- <title>Defaults: </title>
- <para>Use this section to set where this account stores the messages that it has sent, and the messages that you save as drafts. If you want to revert to the default settings, click Restore Defaults.</para>
- </formalpara>
- <para>If you want to send someone a copy of every message from this account, select either Always Carbon-Copy (Cc) To: or Always Blind Carbon-Copy (Bcc) To:, and specify one or more addresses.</para>
- <formalpara id="bsbhndi">
- <title>Security: </title>
- <para>Use this section to set the security options for this account. If you use encryption, enter your PGP key ID (see <link linkend="encryption">Encryption</link> for more information) and select among the four options to determine key and signature handling.</para>
- </formalpara>
- </section>
-
- <section id="bshoq5l">
- <title>Autocompletion</title>
- <para>The Autocompletion tool lets you choose address books will auto complete names for you. This fuctionality requires accessibility to each of the address books you want to use. To enable autocompletion, select each of the address books you want to have auto complete in the Autocompletion page.</para>
- </section>
-
- <section id="config-prefs-mail">
- <title>Mail Preferences</title>
- <para>The Mail Preferences tool lets you choose how to display citations, how long to wait before marking a message as read, and other mail display settings. </para>
- <itemizedlist>
- <listitem>
- <para><link linkend="config-prefs-mail-general">General Mail Settings</link></para>
- </listitem>
- <listitem>
- <para><link linkend="mail-prefs-html">HTML Mail Preferences</link></para>
- </listitem>
- <listitem>
- <para><link linkend="mail-prefs-colors">Mail Color Preferences</link></para>
- </listitem>
- <listitem>
- <para><link linkend="mail-prefs-headers">Mail Header Preferences</link></para>
- </listitem>
- <listitem>
- <para><link linkend="mail-prefs-junk">Junk Mail Preferences</link></para>
- </listitem>
- </itemizedlist>
- <para>For information on individual e-mail account settings, see <link linkend="config-prefs-mail-identity">Working with Mail Accounts</link>.</para>
-
- <section id="config-prefs-mail-general">
- <title>General Mail Settings</title>
- <para>The General page has the following options:</para>
- <formalpara id="bsbhnw0">
- <title>Message Fonts: </title>
- <para>Normally, Evolution uses the same fonts as other GNOME applications. To choose different fonts, unselect Use the Same Fonts as Other Applications and select one font for standard typefaces and a second for monospace, terminal, or display. </para>
- </formalpara>
- <formalpara id="bsbho3f">
- <title>Message Display: </title>
- <para>Choose how long you want to wait before marking a message read, how to highlight quotations, and the default encoding.</para>
- </formalpara>
- <formalpara id="bsbhq3y">
- <title>Deleting Mail: </title>
- <para>Choose whether to delete messages automatically when quitting Evolution, and whether you wish to explicitly confirm the final deletion of messages. </para>
- </formalpara>
- <formalpara id="bsbhq7t">
- <title>New Mail Notifications: </title>
- <para>Evolution can alert you to the arrival of new mail with a beep or by playing a sound file. Choose your alert noise, or select none, as you prefer. </para>
- </formalpara>
- </section>
-
- <section id="mail-prefs-html">
- <title>HTML Mail Preferences</title>
- <para>The HTML Mail page has the following options:</para>
- <formalpara id="bsbhqot">
- <title>Show Animated Images: </title>
- <para>Turn animation on or off here. </para>
- </formalpara>
- <formalpara id="bsbhquu">
- <title>Prompt When Sending HTML Messages to Contacts That Don&apos;t Want Them: </title>
- <para>Some people do not like HTML mail, and you can set Evolution to warn you of this preference. This warning appears only when you send HTML mail to people in your contacts who are listed as disliking HTML. </para>
- </formalpara>
- <formalpara id="bsbhr9p">
- <title>Loading Images: </title>
- <para>You can embed a image in an e-mail and have it load only when the message arrives. However, spammers can use image loading patterns to confirm &ldquo;live&rdquo; addresses and invade your privacy. You can elect to never load images automatically, to load images only if the sender is in your contacts, or always load images. </para>
- </formalpara>
- <para>If you have chosen not to load images automatically, you can choose to see the images in one message at a time by selecting View &gt; Message Display Load Images. </para>
- <para>The Colors tab lets you select different color labels for individual messages. You can return to the default settings by clicking Restore Defaults.</para>
- </section>
-
- <section id="mail-prefs-colors">
- <title>Mail Color Preferences</title>
- <para>The Mail Color preferences tool lets you select color labels for different kinds of messages. Click a color to change the color, or change the label associated with that color. </para>
- </section>
-
- <section id="mail-prefs-headers">
- <title>Mail Header Preferences</title>
- <para>The headers on an incoming message are the information about the message that isn&apos;t the content of the message itself, such as the sender, the time it was sent. Select the options here to show or hide different amounts of information about the messages you read. </para>
- </section>
-
- <section id="mail-prefs-junk">
- <title>Junk Mail Preferences</title>
- <para>There are only two items in this section: Check Incoming Mail for Junk and Include Remote Tests. Checking for junk mail uses the SpamAssassin tool with trainable Bayesian filters. It also includes online tests, like checking for blacklisted message senders and ISPs. Online tests can make filtering slower, but more accurate. Select the options here to choose your mail filtering method. </para>
- </section>
- </section>
-
- <section id="config-prefs-mail-composer">
- <title>Composer Preferences</title>
- <para>There are three pages for settings you can change for the message composer. The General page covers shortcuts and assorted behavior, the Signature page controls your signature, and the Spell Checking page controls spell checking. </para>
- <itemizedlist>
- <listitem>
- <para><link linkend="bshpixy">General</link></para>
- </listitem>
- <listitem>
- <para><link linkend="bshpjpl">Signature</link></para>
- </listitem>
- <listitem>
- <para><link linkend="bshpjuj">Spell Checking</link></para>
- </listitem>
- </itemizedlist>
-
- <section id="bshpixy">
- <title>General</title>
- <para>In the General page, you can set the following options:</para>
- <formalpara id="bsbhs8n">
- <title>Default Behavior: </title>
- <para>Choose how you will normally forward and reply messages, what character set they will use, whether they will be in HTML, and whether that HTML can contain graphic emoticons.</para>
- </formalpara>
- <formalpara id="bsbhsf6">
- <title>Alerts: </title>
- <para>There are two optional alerts you can select:</para>
- </formalpara>
- <itemizedlist>
- <listitem>
- <formalpara id="bsbht5d">
- <title>Prompt When Sending Messages With an Empty Subject Line:</title>
- <para> The composer warns you if you try to send a message without a subject. </para>
- </formalpara>
- </listitem>
- <listitem>
- <formalpara id="bsbhto4">
- <title>Prompt When Sending Messages with Only Bcc Recipients Defined:</title>
- <para> The composer warns you if you try to send a message that has only Bcc recipients. This is important because some mail servers fail to transmit blind carbon copy if you do not have at least one recipient that is visible to all readers. </para>
- </formalpara>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="bshpjpl">
- <title>Signature</title>
- <para>The signature editor allows you to create several different signatures in plain text or in HTML, and to specify which of them will be added to e-mail you create in the message composer. If you prefer to use an alternate signature or none at all, you can select it from the mail composer itself.</para>
- </section>
-
- <section id="bshpjuj">
- <title>Spell Checking</title>
- <para>To choose a spell-checking language, select it here. You must install the gnome-spell package, available through Red Carpet, for spell-checking to be available in Evolution. Additional dictionaries are also available through Red Carpet and are detected automatically if you have installed them. To have the composer automatically check your spelling while you type, select Check Spelling While I Type.</para>
- <para>Check the spelling of messages by clicking Edit &gt; Spell Check Document. </para>
- </section>
- </section>
-
- <section id="config-prefs-cal">
- <title>Calendar and Tasks Settings</title>
- <para>The calendar configuration tool has two pages General and Display.</para>
- <itemizedlist>
- <listitem>
- <para><link linkend="bshpskx">General</link></para>
- </listitem>
- <listitem>
- <para><link linkend="bshpsxa">Display</link></para>
- </listitem>
- </itemizedlist>
-
- <section id="bshpskx">
- <title>General</title>
- <para>The General page lets you set the following options:</para>
- <formalpara id="bsbhukf">
- <title>Time Zone: </title>
- <para>The city you&rsquo;re located in, to specify your time zone. </para>
- </formalpara>
- <formalpara id="bsbhup9">
- <title>Time Format: </title>
- <para>Choose between twelve-hour (AM/PM) and twenty-four hour time formats. </para>
- </formalpara>
- <formalpara id="bsbhuut">
- <title>Week Starts: </title>
- <para>Select the day to display as the first in each week.</para>
- </formalpara>
- <formalpara id="bsbhuzl">
- <title>Day Begins: </title>
- <para>For Evolution, a normal work day begins at 9 a.m. and ends at 5 p.m. You can select your preferred hours to make sure that all your events are displayed properly. </para>
- </formalpara>
- <formalpara id="bsbhv3n">
- <title>Day Ends: </title>
- <para>Sets the end of a normal workday. </para>
- </formalpara>
- <formalpara id="bsbhv7r">
- <title>Alerts: </title>
- <para>If you want to be warned before you delete any appointment, or to have a reminder automatically appear for each event, select the options here. </para>
- </formalpara>
- </section>
-
- <section id="bshpsxa">
- <title>Display</title>
- <para>The Display page lets you choose how your appointments and tasks appear in your calendar.</para>
- <formalpara id="bsbhvoy">
- <title>Time Divisions: </title>
- <para>Sets the time increments shown as fine lines on the daily view in the calendar. </para>
- </formalpara>
- <formalpara id="bsbhvt1">
- <title>Show Appointment End Times In Week and Month Views: </title>
- <para>If there is space, Evolution shows the end times in the week and month views for each appointment. </para>
- </formalpara>
- <formalpara id="bsbhw0r">
- <title>Compress Weekends In Month View: </title>
- <para>Select this option to display weekends in one box, instead of one for each day in the month view. </para>
- </formalpara>
- <formalpara id="bsbhw7p">
- <title>Show Week Numbers In Date Navigator: </title>
- <para>Shows the week numbers next to the respective weeks in the calendar. </para>
- </formalpara>
- <formalpara id="bsbhwdz">
- <title>Tasks Due Today: </title>
- <para>Select the color for tasks due today. </para>
- </formalpara>
- <formalpara id="bsbhwj5">
- <title>Overdue Tasks: </title>
- <para>Select the color for overdue tasks. </para>
- </formalpara>
- <formalpara id="bsbhwnw">
- <title>Hide Completed Tasks: </title>
- <para>Select this option to have completed tasks hidden after a period of time measured in days, hours, or minutes. If you don&apos;t select this option, completed tasks remain in your task list, marked as complete. </para>
- </formalpara>
- </section>
- </section>
-
- <section id="config-prefs-contact">
- <title>Directory Servers</title>
- <para>There are two main tasks for configuring contact information. Autocompletion settings are available in the main settings tool. The other major contact configuration task is creating new contact list. </para>
- <para>To add a new contact list, either local or remote:</para>
- <procedure>
- <step id="bsbhwyr">
- <para>Click Contacts.</para>
- </step>
- <step id="bsbhx27">
- <para>Click the down-arrow next to New.</para>
- </step>
- <step id="bsbhxhp">
- <para>Select Contact List.</para>
- </step>
- <step id="bsbhxk3">
- <para>Type a name and location for the contact group.</para>
- </step>
- <step id="bsbhxqx">
- <para>Click Forward.</para>
- <para>If the contact group is stored locally, you do not need to provide any further information. Click OK.</para>
- <para>or</para>
- <para> If you are creating an <link linkend="ldap">LDAP</link> server, enter the server information as requested by the assistant:</para>
- <formalpara id="bsbhyuo">
- <title>Server Name: </title>
- <para>Internet address of the contact server you are using. </para>
- </formalpara>
- <formalpara id="bsbhzhh">
- <title>Login Method: </title>
- <para>Specify whether your login is anonymous, using an e-mail address, or a distinguished name. If the login is not anonymous, specify the e-mail address or distinguished name (DN) required by the server. </para>
- </formalpara>
- <formalpara id="bsbhznl">
- <title>Port: </title>
- <para>The Internet port Evolution connects to in order to access the LDAP database. This is normally 389. </para>
- </formalpara>
- <formalpara id="bsbhzwi">
- <title>Use SSL/TLS: </title>
- <para>SSL and TLS are security mechanisms. If you select Always, Evolution does not connect unless secure connections are available. The default value is Whenever Possible, which uses secure connections if they are available, but does not cause failure if they are not. </para>
- </formalpara>
- <formalpara id="bsbi06q">
- <title>Search Base: </title>
- <para>The <link linkend="search-base">search base</link> is the starting point for a directory search. Contact your network administrator for information about the correct settings. </para>
- </formalpara>
- <formalpara id="bsbi0ns">
- <title>Search Scope: </title>
- <para>The <link linkend="search-scope">search scope</link> is the breadth of a given search. The following options are available: </para>
- </formalpara>
- <formalpara id="bsbi0vz">
- <title>One:</title>
- <para> Searches the Search Base and one entry below it. </para>
- </formalpara>
- <formalpara id="bsbi1af">
- <title>Sub: </title>
- <para>Searches the Search Base and all entries below it. </para>
- </formalpara>
- <formalpara id="bsbi1gc">
- <title>Timeout (minutes): </title>
- <para>The maximum time Evolution attempts to download data from the server before giving up. </para>
- </formalpara>
- <formalpara id="bsbi1os">
- <title>Download Limit: </title>
- <para>The maximum number of results for a given search. Most servers refuse to send more than 500, but you can set the number lower if you want to shorten downloads for very broad searches. </para>
- </formalpara>
- <formalpara id="bsbi1um">
- <title>Display Name: </title>
- <para>The name to label this folder. It can be any name you choose. </para>
- </formalpara>
- </step>
- <step id="bsbi2rh">
- <para>Click Apply.</para>
- </step>
- </procedure>
- </section>
-
- <section id="bshoty0">
- <title>Certificates</title>
- <para>Evolution allows you to add certificates for yourself as well as for contacts. This allows you to communicate with others securely over an encryted connection, or sign a message confirming your identity to the contact. </para>
- <formalpara id="bshov9m">
- <title>Your Certificates: </title>
- <para>The Your Certificates tab displays a list of certificates that you own. You can import, view, backup and delete your certificates from this tab.</para>
- </formalpara>
- <formalpara id="bshovvp">
- <title>Contact Certificates: </title>
- <para>The Contact Certificates tab displays a list of certificates that you have for contacts. These certificates allow you to decrypt messages as well verify signed messages. You can import, view, edit, and delete your contact certificates from this tab.</para>
- </formalpara>
- <formalpara id="bshowu7">
- <title>Authorities: </title>
- <para>The Authorities tab displays a list of trusted certificate authorities who verify that the certificate you have is valid. You can import, view, edit, and delete certificate authorities from this tab.</para>
- </formalpara>
- </section>
- </chapter>
-
- <chapter id="config-sync">
- <title>Synchronizing Your Handheld Device</title>
- <para>Synchronization presents you with two issues you need to address. First, your computer needs to recognize and access your handheld. At this time, Evolution&trade; only supports Palm OS devices like the PalmPilot and the Handspring Visor. Secondly, you should decide what sort of synchronization behavior you want.</para>
- <itemizedlist>
- <listitem>
- <para><link linkend="bshq58g">Enabling Synchronization</link></para>
- </listitem>
- <listitem>
- <para><link linkend="bshq7hl">Selecting Conduits</link></para>
- </listitem>
- <listitem>
- <para><link linkend="bshq2qn">Synchronizing Information</link></para>
- </listitem>
- </itemizedlist>
-
- <section id="bshq58g">
- <title>Enabling Synchronization</title>
- <para>If you haven&rsquo;t used a handheld device with your computer before, you need to run the GNOME Control Center by clicking System &gt; Settings, and make sure that Pilot Link is properly configured. Make sure that you have read and write permissions on the device, which is normally n /dev/pilot. If that does not work, check in /dev/ttyS0 if you have a serial connection, or in /dev/ttyUSB0 for a USB connection. You can do this by becoming root and running the command chmod 777 /dev/ttyUSB0.</para>
- </section>
-
- <section id="bshq7hl">
- <title>Selecting Conduits</title>
- <para>Once your computer and your Palm OS device are communicating, select the <link linkend="conduit">conduits</link> you want under the Pilot Conduits section of the Control Center. You can use conduits to synchronize data with several applications; the Evolution conduits are labeled EAddress, for the contacts in your address book, ECalendar, for your calendar, and ETodo, for your task list.</para>
- <para>Click Enable, then click Settings to change what it does when activated. Your options may vary depending on the conduit, but typically they are as follows:</para>
- <formalpara id="bsbi551">
- <title>Disabled: </title>
- <para>Do nothing.</para>
- </formalpara>
- <formalpara id="bsbi5aa">
- <title>Synchronize: </title>
- <para>Copy new data from the computer to the handheld, and from the handheld to the computer. Remove items that were on both systems but have been deleted on one.</para>
- </formalpara>
- <formalpara id="bsbi5es">
- <title>Copy From Pilot: </title>
- <para>If there is any new data on the handheld device, copy it to the computer.</para>
- </formalpara>
- <formalpara id="bsbi5k1">
- <title>Copy To Pilot: </title>
- <para>Copy new data from the computer to the handheld. </para>
- </formalpara>
- <formalpara id="bsbi5oo">
- <title>Merge From Pilot: </title>
- <para>Copy new data from the computer to the handheld, and remove any information from the handheld that has been deleted on the computer.</para>
- </formalpara>
- <formalpara id="bsbi5z5">
- <title>Merge to Pilot: </title>
- <para>Copy new data from the handheld to the computer, and remove any information from the computer that has been deleted on the handheld.</para>
- </formalpara>
- <para>Select the behavior you want for each conduit you choose to use. If you&apos;re not sure, use with Synchronize.</para>
- </section>
-
- <section id="bshq2qn">
- <title>Synchronizing Information</title>
- <para>Use the following procedure to synchronize the data on your Palm OS device with the data you store in Evolution.</para>
- <para>If you want to backup your information before synchronizing, make a copy of the <command>evolution</command> directory inside your home directory.</para>
-
- <section id="bshq3ip">
- <title>Using HotSync</title>
- <procedure>
- <step id="bshq1vg">
- <para>Put your handheld device in its cradle an press the HotSync button.</para>
- <para>If you use Palm OS v. 4.0 and have password protection turned on for your handheld device, you may encounter trouble synchronizing. If this happens, try turning off password protection on your handheld, synchronize it with your desktop computer, and then re-enable password protection on your handheld.</para>
- </step>
- </procedure>
- <para>If you have followed the setup instructions properly, your Palm OS device will synchronize data with Evolution.</para>
- </section>
- </section>
- </chapter>
-
- <appendix id="outlook-migration">
- <title>Migration from Outlook to Evolution</title>
- <para>If you are using Microsoft Outlook, but not Microsoft Exchange, this section helps you switch to Evolution.</para>
-
- <section id="outlook-migration-mail">
- <title>Migrating Local Outlook Mail Folders</title>
- <para>Exchange and IMAP mail is stored on the server, so you do not need to migrate it to your Linux partition. However, if you have stored mail on your computer, you might want to make it accessible to Evolution.</para>
- <para>First, while using Windows, prepare your messages for import:</para>
- <procedure>
- <step id="bshqe24">
- <para>Clean up your mail. Delete messages and folders you do not need, and click File &gt; Folders &gt; Properties &gt; Advanced &gt; Compact to erase old, deleted messages from your PST file.</para>
- </step>
- <step id="bshqe4g">
- <para>If you nest your folders one inside another, you might want to rename subfolders so that you can tell which folder they belong to. You must re-nest them after you load them into Evolution.</para>
- </step>
- <step id="bshqe6i">
- <para>Import the files into Mozilla Mail (or another mailer, such as Netscape or Eudora, that uses the standard mbox format). Linux mailers cannot do this task, because it requires a library available only under Windows. In Mozilla, import by selecting Window Mail &amp; Newsgroups Tools Import.</para>
- </step>
- <step id="bshqe8a">
- <para>Mozilla creates a set of files in the directory<command> Windows\Application_Data\Mozilla\Profiles\(UserName)\(Random Letters)\Mail\Local Folders\OutlookMail\</command>. The data files are those that have no file extension.</para>
- <para>If you are using Windows XP or Windows 2000, your Windows hard drive is probably in the NTFS format, which some Linux systems cannot read without additional software. You may find it simpler to copy the mail folders to a different drive or to burn a CD.</para>
- </step>
- </procedure>
- <para>To create new folders for your files.</para>
- <para>When you have your mail in a format Evolution can understand, reboot to Linux. Then continue with the following procedure:</para>
- <procedure>
- <step id="bshqeej">
- <para>Mount your Windows drive or the disk where you saved the mail files.</para>
- </step>
- <step id="bshqegg">
- <para>Copy all the mail files into your home directory or another convenient place.</para>
- </step>
- <step id="bshqeia">
- <para>Start Evolution.</para>
- </step>
- <step id="bshqejx">
- <para>Press Shift+Ctrl+F or select File &gt; New Folder to create the folders you want.</para>
- </step>
- </procedure>
- <para>To import the data files:</para>
- <procedure>
- <step id="bshqep7">
- <para>In Evolution, open the File Import assistant by clicking File &gt; Import.</para>
- </step>
- <step id="bshqera">
- <para>Click Next, then select Import a single file.</para>
- </step>
- <step id="bshqesz">
- <para>Leave the file type as Automatic, then click Browse to select the data file. </para>
- <para>Remember, the data files are the files that have no file extension.</para>
- </step>
- <step id="bshqeuv">
- <para>Select the folder where you want to put the imported data file.</para>
- </step>
- <step id="bshqg85">
- <para>Click OK.</para>
- </step>
- <step id="bshqex9">
- <para>Repeat the import steps until you have imported all your mail.</para>
- </step>
- </procedure>
- </section>
- </appendix>
-
- <appendix id="menuref">
- <title>Quick Reference</title>
- <para>You can print this section to use it as a quick reference for most of the things you want to do with Evolution&trade;.</para>
- <itemizedlist>
- <listitem>
- <para><link linkend="quickref-open">Opening or Creating Items</link></para>
- </listitem>
- <listitem>
- <para><link linkend="quickref-mail">Mail Tasks</link></para>
- </listitem>
- <listitem>
- <para><link linkend="quickref-cal">Calendar</link></para>
- </listitem>
- <listitem>
- <para><link linkend="quickref-contact">Address Book</link></para>
- </listitem>
- </itemizedlist>
-
- <section id="quickref-open">
- <title>Opening or Creating Items</title>
- <bridgehead>New Item</bridgehead>
- <para>Press Ctrl+N to open a new item for whatever part of Evolution you&rsquo;re working in. In mail, this means you&rsquo;ll create a new message. If you&rsquo;re looking at your address book, Ctrl+N creates a new contact card, and in the calendar, a new appointment.</para>
- <bridgehead>Creating a New E-Mail Message</bridgehead>
- <para>Use File &gt; New &gt; Mail Message or Ctrl+Shift+M. </para>
- <bridgehead>Creating a New Appointment</bridgehead>
- <para>Use File &gt; New Appointment or Ctrl+Shift+A.</para>
- <bridgehead>Entering a New Contact </bridgehead>
- <para> Double-click in any blank space in the contact manager to create a new address card. You can also use File &gt; New Contact or Ctrl+Shift+C. </para>
- <bridgehead>Creating a New Task</bridgehead>
- <para> File &gt; New Task or Ctrl+Shift+T. </para>
- </section>
-
- <section id="quickref-mail">
- <title>Mail Tasks</title>
- <bridgehead>Send and Receive Mail</bridgehead>
- <para>Press F9, click the Send/Receive button in the toolbar, or choose Actions Send/Receive.</para>
- <bridgehead>Navigating the Message List with the Keyboard</bridgehead>
- <para>Press (]) or (.) to jump to the next unread message. ([) or (,) goes to the previous unread message. Use the arrow keys to move up and down in the list of all messages.</para>
- <bridgehead>Moving the Display Up and Down in the Preview Pane</bridgehead>
- <para>Press the space bar to move down a page. Press Backspace to move up a page.</para>
- <bridgehead>Replying To a Message</bridgehead>
- <para>To reply to the sender of the message only, click Reply in the toolbar, or press Ctrl+R. </para>
- <para>To reply to the sender and all the other visible recipients of the message, click Reply to All or select the message and press Shift+Ctrl+R. </para>
- <bridgehead>Forwarding a Message</bridgehead>
- <para>Select the message or messages you want to forward, then click Forward in the toolbar, or press Ctrl+F.</para>
- <bridgehead>Opening a Message In a New Window</bridgehead>
- <para>Double-click the message you want to view, or select it and press Enter or Ctrl+O. </para>
- <bridgehead>Creating Filters and Virtual Folders</bridgehead>
- <para>Right-click a message and select Create Rule From Message. You can also create filters and virtual folders in the Tools menu. </para>
- <bridgehead>Adding a Sender to the Address Book</bridgehead>
- <para>Right-click a message and select Add Sender to Address Book. You can also right-click on any e-mail address to add it to your address book. </para>
- </section>
-
- <section id="quickref-cal">
- <title>Calendar</title>
- <bridgehead>Creating a New Appointment</bridgehead>
- <para> Use File &gt; New Appointment or Ctrl+Shift+A. </para>
- <para>You can also click on any blank spot in the calendar and start typing to create a new appointment entry.</para>
- <bridgehead>Creating a New Task</bridgehead>
- <para> Use File &gt; New Task or Ctrl+Shift+T. </para>
- </section>
-
- <section id="quickref-contact">
- <title>Address Book</title>
- <bridgehead>Editing a Contact</bridgehead>
- <para>Double-click the contact&apos;s address card to change details. </para>
- <bridgehead>Deleting a Contact</bridgehead>
- <para>Right-click on a contact, then click Delete or select a contact, then click Delete on the toolbar. </para>
- <bridgehead>Sending E-Mail To a Contact</bridgehead>
- <para>Right-click a contact, then click Send Message to Contact.</para>
- <bridgehead>Creating a New Contact </bridgehead>
- <para>Double-click in any blank space in the contact manager to create a new address card, or right-click anywhere in the address book and select New Contact. You can also click File &gt; New Contact or press Ctrl+Shift+C </para>
- </section>
- </appendix>
-
- <appendix id="bugs">
- <title>Known Bugs and Limitations</title>
- <para>A complete list of feature requests and other issues with Evolution&trade; is available online in the Ximian&reg; bug tracking system. You can learn more about the Evolution development process at <ulink url="http://developer.ximian.com">developer.ximian.com</ulink>. </para>
- <para>Evolution bug tracking is done at the <ulink url="http://bugzillaximian.com">Ximian&reg; bug tracking System</ulink>. You can use that, or the GNOME Bug Report Tool (known as bug-buddy at the command line) if you find bugs or would like to request new features.</para>
- <para>If you need additional help with Evolution, visit the Novell support site at <ulink url="http://support.novell.com">Novell support</ulink>.</para>
- </appendix>
-
- <glossary id="apx-gloss">
- <title>Glossary</title>
-
- <glossentry id="assistant">
- <glossterm>Assistant</glossterm>
- <glossdef>
- <para>A tool that guides a user through a series of steps, usually to configure or set up a program. Equivalent to Wizard and Druid.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="attachment">
- <glossterm>attachment</glossterm>
- <glossdef>
- <para>Any file sent with an e-mail. Attachments can be embedded in a message or appended to it.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="automatic-indexing">
- <glossterm>Automatic indexing</glossterm>
- <glossdef>
- <para>Pre-downloading procedure that allows Evolution&trade; to quickly refer to data. It enables faster searches and decreases memory usage for data displays.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="bsi89la">
- <glossterm>Bcc (Blind Carbon Copy)</glossterm>
- <glossdef>
- <para>Blind copy recipients (Bcc) receive a copy of an item. Other recipients receive no information about blind copies. Only the sender and the blind copy recipient know that a blind copy was sent. If a recipient replies and chooses Reply to All, the blind copy recipient will not receive the reply.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="cc">
- <glossterm>Cc (Carbon Copy)</glossterm>
- <glossdef>
- <para>Carbon copy recipients (CC) receive a copy of an item. CC recipients are users who would benefit from the information in an item, but are not affected by or directly responsible for it. All recipients can see that a carbon copy was sent. They can also see the names of the CC recipients.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="conduit">
- <glossterm>conduit</glossterm>
- <glossdef>
- <para>A small application that controls the transfer of data between a handheld device and a desktop computer.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="evolution">
- <glossterm>Evolution</glossterm>
- <glossdef>
- <para>The GNOME groupware application.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="execute">
- <glossterm>execute</glossterm>
- <glossdef>
- <para>To run a program. Any file that can be run is called an executable. Evolution can download executable attachments, but before they can be run, the files must be marked as executable with a shell or file manager. This security precaution prevents the automatic or accidental execution of malicious programs. For more information on executables and file permissions, see the documentation for your file manager or shell.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="expunge">
- <glossterm>expunge</glossterm>
- <glossdef>
- <para>When messages are marked for deletion, they remain till they are expunged. When a message is expunged, it is permanently deleted, as long as it was marked for deletion.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="filetree">
- <glossterm>file tree</glossterm>
- <glossdef>
- <para>A way of describing a group of files on a computer. The top of the tree is called the root directory, and denoted by <command>/</command>. The rest of the branches spread downward from the root. Don&apos;t confuse the root directory with the root account or root&apos;s home directory, normally <command>/root</command>.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="filter">
- <glossterm>filter</glossterm>
- <glossdef>
- <para>Within Evolution, a filter is a method of sorting mail automatically when it&apos;s downloaded. You can create filters to perform one or more actions on a message that meets any (or all) of a wide range of criteria.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="forward">
- <glossterm>forward</glossterm>
- <glossdef>
- <para>Forwards a copy of the message and any additional comments to a different e-mail address. </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="groupware">
- <glossterm>groupware</glossterm>
- <glossdef>
- <para>A term describing an application that helps groups of people work together. Typically, a groupware application has several productivity features built into one program, including e-mail, calendar, and address book tools.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="html">
- <glossterm>HTML</glossterm>
- <glossdef>
- <para>Hypertext Markup Language (HTML) is a language for describing page layout in electronic documents such as Web pages, help files, and e-mail messages. HTML can be used in e-mail and news posts to insert images and apply text treatments.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="hot-key">
- <glossterm>hot key</glossterm>
- <glossdef>
- <para>Hot keys, also called shortcut keys, are keyboard combinations used to do actions on a computer instead of using the mouse. Hot keys can speed up computer usage.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="ical">
- <glossterm>iCal</glossterm>
- <glossdef>
- <para>iCal is the program which Evolution uses to manage the calendar section.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="imap">
- <glossterm>IMAP</glossterm>
- <glossdef>
- <para>Internet Mail Access Protocol. It allows access to e-mail which is typically (although not always) stored remotely on a server rather than on a local hard disk. Often contrasted with POP. </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="inline">
- <glossterm>inline</glossterm>
- <glossdef>
- <para>Displayed as part of a message or other document, rather than attached as a separate file. Contrast with <emphasis>Attachment</emphasis>.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="ldap">
- <glossterm>LDAP</glossterm>
- <glossdef>
- <para>Lightweight Directory Access Protocol. Allows a client to search through a large database of addresses, phone numbers, and people stored on a server.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="mail-client">
- <glossterm>mail client</glossterm>
- <glossdef>
- <para>The application with which a person reads and sends e-mail. Its counterparts are the various types of mail servers, which handle user authentication and direct messages from sender to recipient.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="minicard">
- <glossterm>minicard</glossterm>
- <glossdef>
- <para>A format for the display of contact data. Similar in appearance to a small business card.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="pop">
- <glossterm>POP</glossterm>
- <glossdef>
- <para>Post Office Protocol. A mechanism for e-mail transport. In contrast to IMAP, it is used only to get mail from a server and store it locally on your hard disk.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="protocol">
- <glossterm>protocol</glossterm>
- <glossdef>
- <para>An agreed-upon method of communication, especially one for sending particular types of information between computer systems. Examples include POP (Post Office Protocol), for e-mail, and HTTP (HypterText Transfer Protocol) for Web pages.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="public-key-encryption">
- <glossterm>public key encryption</glossterm>
- <glossdef>
- <para>A strong encryption method that uses a set of two keys, one of which is made public, and one of which is kept private. Data encrypted using the public key can only be decrypted using the private key. The longer the keys, the more difficult it is to break the encryption.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="regular-expression">
- <glossterm>regular expression</glossterm>
- <glossdef>
- <para>A regular expression (regex) is a way of describing a string of text using metacharacters or wildcard symbols. For example, the statement fly.*so[au]p means any phrase beginning with &lsquo;fly&apos; and ending in oup&apos; or &lsquo;soap&apos;. If you searched for that expression, you&rsquo;d find both &ldquo;fly in my soup&rdquo; and &ldquo;fly in my soap&rdquo;. For more information, enter man grep from the command line.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="script">
- <glossterm>script</glossterm>
- <glossdef>
- <para>A program written in an interpreted (rather than compiled) language. Often used as a synonym for macro, to denote a series of pre-recorded commands or actions within an application. Often times, accomplish repetitive and tedious tasks, to save the user time.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="search-base">
- <glossterm>Search Base</glossterm>
- <glossdef>
- <para>LDAP can break contact lists into many groups. The Search Base tells LDAP the top group to use. How much of the Search Base that is searched is set by the Search Scope option.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="search-scope">
- <glossterm>Search Scope</glossterm>
- <glossdef>
- <para>Search Scope states how much of the Search Base to search.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="sendmail">
- <glossterm>Sendmail</glossterm>
- <glossdef>
- <para>A program that sends mail. Evolution can use it instead of SMTP; some people prefer it because it offers more flexibility; however, it is more difficult to set up.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="shortcut-bar">
- <glossterm>shortcut bar</glossterm>
- <glossdef>
- <para>An area of Evolution that offers users fast access to the most frequently used features of the application.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="signature">
- <glossterm>signature</glossterm>
- <glossdef>
- <para>Text placed at the end of every e-mail sent, similar to a hand-written signature at the bottom of a written letter. A signature can be anything from a favorite quotation to a link to a Web page; courtesy dictates that it be fewer than four lines long.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="smtp">
- <glossterm>SMTP</glossterm>
- <glossdef>
- <para>Simple Mail Transfer Protocol. The most common way of transporting mail messages your computer to the server.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="tooltip">
- <glossterm>tooltip</glossterm>
- <glossdef>
- <para>A small box of explanatory text that appears when the mouse pointer is held over a button or other interface element.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="virus">
- <glossterm>virus</glossterm>
- <glossdef>
- <para>A program that inserts itself into other files or programs and which, when executed, spreads to more programs and other computers. A virus can cause substantial damage by clogging networks or disk drives, deleting files, or opening security holes.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="vcard">
- <glossterm>vCard</glossterm>
- <glossdef>
- <para>A file format for the exchange of contact information. When you get an address card attached to an e-mail, it&rsquo;s probably in vCard format. Contrast with vFolder.</para>
- </glossdef>
- </glossentry>
-
- <glossentry id="vfolder">
- <glossterm>vFolder</glossterm>
- <glossdef>
- <para>An e-mail organization tool. vFolders allow you to create a folder that contains the results of a complex search. vFolder contents are are updated dynamically.</para>
- </glossdef>
- </glossentry>
- </glossary>
-
- <appendix>
-<title>Legal Notices</title>
- <simplelist>
- <member>Novell, Inc. makes no representations or warranties with respect to the contents or use of this documentation, and specifically disclaims any express or implied warranties of merchantability or fitness for any particular purpose. Further, Novell, Inc. reserves the right to revise this publication and to make changes to its content, at any time, without obligation to notify any person or entity of such revisions or changes.</member>
- <member>Further, Novell, Inc. makes no representations or warranties with respect to any software, and specifically disclaims any express or implied warranties of merchantability or fitness for any particular purpose. Further, Novell, Inc. reserves the right to make changes to any and all parts of Novell software, at any time, without any obligation to notify any person or entity of such changes.</member>
- </simplelist>
- <simplelist>
- <member>You may not use, export, or re-export this product in violation of any applicable laws or regulations including, without limitation, U.S. export regulations or the laws of the country in which you reside.</member>
- </simplelist>
- <simplelist>
- <member>Copyright &copy; 2004 Novell, Inc. All rights reserved. Permission is granted to copy, distribute, and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.2 or any later version, published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the GFDL can be found at http://www.fsf.org/licenses/fdl.html.</member>
- <member>THIS DOCUMENT AND MODIFIED VERSIONS OF THIS DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT:</member>
- <member>1. THE DOCUMENT IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND</member>
- <member>2. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES.</member>
- </simplelist>
- <simplelist>
- <member>Novell, Inc.</member>
- <member>404 Wyman Street, Suite 500</member>
- <member>Waltham, MA 02451</member>
- <member>U.S.A.</member>
- <member>www.novell.com</member>
- </simplelist>
- <para id="Bktitle">Evolution User Guide 2.0</para>
- <para>September 9, 2004</para>
- <simplelist>
- <member>To access the online documentation for this and other Novell products, and to get updates, see www.novell.com/documentation.</member>
- </simplelist>
- <simplelist>
- <member>Evolution is a trademark of Novell, Inc.</member>
- <member>GroupWise is a registered trademark of Novell, Inc. in the United States and other countries.</member>
- <member>Novell is a registered trademark of Novell, Inc. in the United States and other countries.</member>
- <member>SUSE is a registered trademark of SUSE AG, a Novell company.</member>
- <member>Ximian is a registered trademark of Novell, Inc. in the United States and other countries.</member>
- </simplelist>
- <simplelist>
- <member>All third-party trademarks are the property of their respective owners.</member>
- </simplelist>
- </appendix>
-</book>
diff --git a/help/C/figures/calendar.png b/help/C/figures/calendar.png
deleted file mode 100644
index 58f4520ee4..0000000000
--- a/help/C/figures/calendar.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/config-cal.png b/help/C/figures/config-cal.png
deleted file mode 100644
index 3396ef3a8b..0000000000
--- a/help/C/figures/config-cal.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/config-mail.png b/help/C/figures/config-mail.png
deleted file mode 100644
index 2fc30c6613..0000000000
--- a/help/C/figures/config-mail.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/contact-editor.png b/help/C/figures/contact-editor.png
deleted file mode 100644
index 0fbf3fe168..0000000000
--- a/help/C/figures/contact-editor.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/contact.png b/help/C/figures/contact.png
deleted file mode 100644
index ef224f238e..0000000000
--- a/help/C/figures/contact.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/contacts_mainwindow_a.png b/help/C/figures/contacts_mainwindow_a.png
deleted file mode 100755
index fef0a6b559..0000000000
--- a/help/C/figures/contacts_mainwindow_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_account_info_a.png b/help/C/figures/evo_account_info_a.png
deleted file mode 100755
index 33d5d3a137..0000000000
--- a/help/C/figures/evo_account_info_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_cal_callout_a.gif b/help/C/figures/evo_cal_callout_a.gif
deleted file mode 100755
index fd2797d33f..0000000000
--- a/help/C/figures/evo_cal_callout_a.gif
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_contacteditor_a.png b/help/C/figures/evo_contacteditor_a.png
deleted file mode 100755
index cf1cabc1fa..0000000000
--- a/help/C/figures/evo_contacteditor_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_email_a.png b/help/C/figures/evo_email_a.png
deleted file mode 100755
index 5d1c6d609b..0000000000
--- a/help/C/figures/evo_email_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_gwreceive_a.png b/help/C/figures/evo_gwreceive_a.png
deleted file mode 100644
index 4ab129634e..0000000000
--- a/help/C/figures/evo_gwreceive_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_identity_a.png b/help/C/figures/evo_identity_a.png
deleted file mode 100755
index a2500b783a..0000000000
--- a/help/C/figures/evo_identity_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_imapreceive_a.png b/help/C/figures/evo_imapreceive_a.png
deleted file mode 100644
index 68739a7cff..0000000000
--- a/help/C/figures/evo_imapreceive_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_mail_callout_a.eps b/help/C/figures/evo_mail_callout_a.eps
deleted file mode 100644
index 90334647bb..0000000000
--- a/help/C/figures/evo_mail_callout_a.eps
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_mail_callout_a.gif b/help/C/figures/evo_mail_callout_a.gif
deleted file mode 100755
index 74f8da130d..0000000000
--- a/help/C/figures/evo_mail_callout_a.gif
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_mail_callout_a.png b/help/C/figures/evo_mail_callout_a.png
deleted file mode 100755
index 2f9b438875..0000000000
--- a/help/C/figures/evo_mail_callout_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_maildirreceive_a.png b/help/C/figures/evo_maildirreceive_a.png
deleted file mode 100644
index 213015ebb3..0000000000
--- a/help/C/figures/evo_maildirreceive_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_mboxreceive_a.png b/help/C/figures/evo_mboxreceive_a.png
deleted file mode 100644
index b47055833d..0000000000
--- a/help/C/figures/evo_mboxreceive_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_mereceive_a.png b/help/C/figures/evo_mereceive_a.png
deleted file mode 100644
index 2ab8930e7d..0000000000
--- a/help/C/figures/evo_mereceive_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_mhreceive_a.png b/help/C/figures/evo_mhreceive_a.png
deleted file mode 100644
index 9fb0e058f3..0000000000
--- a/help/C/figures/evo_mhreceive_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_newmess_a.png b/help/C/figures/evo_newmess_a.png
deleted file mode 100755
index 5cd41f1882..0000000000
--- a/help/C/figures/evo_newmess_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_popreceive_a.png b/help/C/figures/evo_popreceive_a.png
deleted file mode 100644
index df1d14ca5f..0000000000
--- a/help/C/figures/evo_popreceive_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_receive_setup2_a.png b/help/C/figures/evo_receive_setup2_a.png
deleted file mode 100755
index 17545ef133..0000000000
--- a/help/C/figures/evo_receive_setup2_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_receive_setup_a.png b/help/C/figures/evo_receive_setup_a.png
deleted file mode 100755
index 260d0d3e3b..0000000000
--- a/help/C/figures/evo_receive_setup_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_rule_a.png b/help/C/figures/evo_rule_a.png
deleted file mode 100755
index c0684fe06d..0000000000
--- a/help/C/figures/evo_rule_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_send_setup_a.png b/help/C/figures/evo_send_setup_a.png
deleted file mode 100755
index 08981edc8d..0000000000
--- a/help/C/figures/evo_send_setup_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_timezone_a.png b/help/C/figures/evo_timezone_a.png
deleted file mode 100755
index b01bb563fb..0000000000
--- a/help/C/figures/evo_timezone_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/evo_usereceive_a.png b/help/C/figures/evo_usereceive_a.png
deleted file mode 100644
index a6a7ce4dab..0000000000
--- a/help/C/figures/evo_usereceive_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/exchange-delegation.png b/help/C/figures/exchange-delegation.png
deleted file mode 100644
index 24664a45c9..0000000000
--- a/help/C/figures/exchange-delegation.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/exchange-identity.png b/help/C/figures/exchange-identity.png
deleted file mode 100644
index ea8f26ff56..0000000000
--- a/help/C/figures/exchange-identity.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/exchange-receive-options.png b/help/C/figures/exchange-receive-options.png
deleted file mode 100644
index 875b948262..0000000000
--- a/help/C/figures/exchange-receive-options.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/exchange-receive.png b/help/C/figures/exchange-receive.png
deleted file mode 100644
index 2b1e26e825..0000000000
--- a/help/C/figures/exchange-receive.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/filter-new-fig.png b/help/C/figures/filter-new-fig.png
deleted file mode 100644
index a37bfd00a0..0000000000
--- a/help/C/figures/filter-new-fig.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/full-1.png b/help/C/figures/full-1.png
deleted file mode 100644
index 84afc9d3e7..0000000000
--- a/help/C/figures/full-1.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/full-2.png b/help/C/figures/full-2.png
deleted file mode 100644
index 929e356db5..0000000000
--- a/help/C/figures/full-2.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/full-3.png b/help/C/figures/full-3.png
deleted file mode 100644
index 175fd1d970..0000000000
--- a/help/C/figures/full-3.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/full-4.png b/help/C/figures/full-4.png
deleted file mode 100644
index 45d66bb193..0000000000
--- a/help/C/figures/full-4.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/full-5.png b/help/C/figures/full-5.png
deleted file mode 100644
index 5fcfd20e45..0000000000
--- a/help/C/figures/full-5.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/full-6.png b/help/C/figures/full-6.png
deleted file mode 100644
index 484eca4903..0000000000
--- a/help/C/figures/full-6.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/full-7.png b/help/C/figures/full-7.png
deleted file mode 100644
index 8a19eaab42..0000000000
--- a/help/C/figures/full-7.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/mail-druid-pic.png b/help/C/figures/mail-druid-pic.png
deleted file mode 100644
index e88dcb78e4..0000000000
--- a/help/C/figures/mail-druid-pic.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/mail-inbox.png b/help/C/figures/mail-inbox.png
deleted file mode 100644
index 77c5b4de97..0000000000
--- a/help/C/figures/mail-inbox.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/mail-threaded.png b/help/C/figures/mail-threaded.png
deleted file mode 100644
index 8239c9e599..0000000000
--- a/help/C/figures/mail-threaded.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/mail_mainwindow_a.png b/help/C/figures/mail_mainwindow_a.png
deleted file mode 100755
index 6f9cd5d868..0000000000
--- a/help/C/figures/mail_mainwindow_a.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/mainwindow-pic.png b/help/C/figures/mainwindow-pic.png
deleted file mode 100644
index 777df026b1..0000000000
--- a/help/C/figures/mainwindow-pic.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/newmsg.png b/help/C/figures/newmsg.png
deleted file mode 100644
index 78b56f2518..0000000000
--- a/help/C/figures/newmsg.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/replymsg.png b/help/C/figures/replymsg.png
deleted file mode 100644
index 6e7fc916c8..0000000000
--- a/help/C/figures/replymsg.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/schedule.png b/help/C/figures/schedule.png
deleted file mode 100644
index de542ce086..0000000000
--- a/help/C/figures/schedule.png
+++ /dev/null
Binary files differ
diff --git a/help/C/figures/vfolder-createrule-fig.png b/help/C/figures/vfolder-createrule-fig.png
deleted file mode 100644
index 2d18741960..0000000000
--- a/help/C/figures/vfolder-createrule-fig.png
+++ /dev/null
Binary files differ
diff --git a/help/COPYING-DOCS b/help/COPYING-DOCS
deleted file mode 100644
index b42936beb3..0000000000
--- a/help/COPYING-DOCS
+++ /dev/null
@@ -1,355 +0,0 @@
- GNU Free Documentation License
- Version 1.1, March 2000
-
- Copyright (C) 2000 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-0. PREAMBLE
-
-The purpose of this License is to make a manual, textbook, or other
-written document "free" in the sense of freedom: to assure everyone
-the effective freedom to copy and redistribute it, with or without
-modifying it, either commercially or noncommercially. Secondarily,
-this License preserves for the author and publisher a way to get
-credit for their work, while not being considered responsible for
-modifications made by others.
-
-This License is a kind of "copyleft", which means that derivative
-works of the document must themselves be free in the same sense. It
-complements the GNU General Public License, which is a copyleft
-license designed for free software.
-
-We have designed this License in order to use it for manuals for free
-software, because free software needs free documentation: a free
-program should come with manuals providing the same freedoms that the
-software does. But this License is not limited to software manuals;
-it can be used for any textual work, regardless of subject matter or
-whether it is published as a printed book. We recommend this License
-principally for works whose purpose is instruction or reference.
-
-
-1. APPLICABILITY AND DEFINITIONS
-
-This License applies to any manual or other work that contains a
-notice placed by the copyright holder saying it can be distributed
-under the terms of this License. The "Document", below, refers to any
-such manual or work. Any member of the public is a licensee, and is
-addressed as "you".
-
-A "Modified Version" of the Document means any work containing the
-Document or a portion of it, either copied verbatim, or with
-modifications and/or translated into another language.
-
-A "Secondary Section" is a named appendix or a front-matter section of
-the Document that deals exclusively with the relationship of the
-publishers or authors of the Document to the Document's overall subject
-(or to related matters) and contains nothing that could fall directly
-within that overall subject. (For example, if the Document is in part a
-textbook of mathematics, a Secondary Section may not explain any
-mathematics.) The relationship could be a matter of historical
-connection with the subject or with related matters, or of legal,
-commercial, philosophical, ethical or political position regarding
-them.
-
-The "Invariant Sections" are certain Secondary Sections whose titles
-are designated, as being those of Invariant Sections, in the notice
-that says that the Document is released under this License.
-
-The "Cover Texts" are certain short passages of text that are listed,
-as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-the Document is released under this License.
-
-A "Transparent" copy of the Document means a machine-readable copy,
-represented in a format whose specification is available to the
-general public, whose contents can be viewed and edited directly and
-straightforwardly with generic text editors or (for images composed of
-pixels) generic paint programs or (for drawings) some widely available
-drawing editor, and that is suitable for input to text formatters or
-for automatic translation to a variety of formats suitable for input
-to text formatters. A copy made in an otherwise Transparent file
-format whose markup has been designed to thwart or discourage
-subsequent modification by readers is not Transparent. A copy that is
-not "Transparent" is called "Opaque".
-
-Examples of suitable formats for Transparent copies include plain
-ASCII without markup, Texinfo input format, LaTeX input format, SGML
-or XML using a publicly available DTD, and standard-conforming simple
-HTML designed for human modification. Opaque formats include
-PostScript, PDF, proprietary formats that can be read and edited only
-by proprietary word processors, SGML or XML for which the DTD and/or
-processing tools are not generally available, and the
-machine-generated HTML produced by some word processors for output
-purposes only.
-
-The "Title Page" means, for a printed book, the title page itself,
-plus such following pages as are needed to hold, legibly, the material
-this License requires to appear in the title page. For works in
-formats which do not have any title page as such, "Title Page" means
-the text near the most prominent appearance of the work's title,
-preceding the beginning of the body of the text.
-
-
-2. VERBATIM COPYING
-
-You may copy and distribute the Document in any medium, either
-commercially or noncommercially, provided that this License, the
-copyright notices, and the license notice saying this License applies
-to the Document are reproduced in all copies, and that you add no other
-conditions whatsoever to those of this License. You may not use
-technical measures to obstruct or control the reading or further
-copying of the copies you make or distribute. However, you may accept
-compensation in exchange for copies. If you distribute a large enough
-number of copies you must also follow the conditions in section 3.
-
-You may also lend copies, under the same conditions stated above, and
-you may publicly display copies.
-
-
-3. COPYING IN QUANTITY
-
-If you publish printed copies of the Document numbering more than 100,
-and the Document's license notice requires Cover Texts, you must enclose
-the copies in covers that carry, clearly and legibly, all these Cover
-Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
-the back cover. Both covers must also clearly and legibly identify
-you as the publisher of these copies. The front cover must present
-the full title with all words of the title equally prominent and
-visible. You may add other material on the covers in addition.
-Copying with changes limited to the covers, as long as they preserve
-the title of the Document and satisfy these conditions, can be treated
-as verbatim copying in other respects.
-
-If the required texts for either cover are too voluminous to fit
-legibly, you should put the first ones listed (as many as fit
-reasonably) on the actual cover, and continue the rest onto adjacent
-pages.
-
-If you publish or distribute Opaque copies of the Document numbering
-more than 100, you must either include a machine-readable Transparent
-copy along with each Opaque copy, or state in or with each Opaque copy
-a publicly-accessible computer-network location containing a complete
-Transparent copy of the Document, free of added material, which the
-general network-using public has access to download anonymously at no
-charge using public-standard network protocols. If you use the latter
-option, you must take reasonably prudent steps, when you begin
-distribution of Opaque copies in quantity, to ensure that this
-Transparent copy will remain thus accessible at the stated location
-until at least one year after the last time you distribute an Opaque
-copy (directly or through your agents or retailers) of that edition to
-the public.
-
-It is requested, but not required, that you contact the authors of the
-Document well before redistributing any large number of copies, to give
-them a chance to provide you with an updated version of the Document.
-
-
-4. MODIFICATIONS
-
-You may copy and distribute a Modified Version of the Document under
-the conditions of sections 2 and 3 above, provided that you release
-the Modified Version under precisely this License, with the Modified
-Version filling the role of the Document, thus licensing distribution
-and modification of the Modified Version to whoever possesses a copy
-of it. In addition, you must do these things in the Modified Version:
-
-A. Use in the Title Page (and on the covers, if any) a title distinct
- from that of the Document, and from those of previous versions
- (which should, if there were any, be listed in the History section
- of the Document). You may use the same title as a previous version
- if the original publisher of that version gives permission.
-B. List on the Title Page, as authors, one or more persons or entities
- responsible for authorship of the modifications in the Modified
- Version, together with at least five of the principal authors of the
- Document (all of its principal authors, if it has less than five).
-C. State on the Title page the name of the publisher of the
- Modified Version, as the publisher.
-D. Preserve all the copyright notices of the Document.
-E. Add an appropriate copyright notice for your modifications
- adjacent to the other copyright notices.
-F. Include, immediately after the copyright notices, a license notice
- giving the public permission to use the Modified Version under the
- terms of this License, in the form shown in the Addendum below.
-G. Preserve in that license notice the full lists of Invariant Sections
- and required Cover Texts given in the Document's license notice.
-H. Include an unaltered copy of this License.
-I. Preserve the section entitled "History", and its title, and add to
- it an item stating at least the title, year, new authors, and
- publisher of the Modified Version as given on the Title Page. If
- there is no section entitled "History" in the Document, create one
- stating the title, year, authors, and publisher of the Document as
- given on its Title Page, then add an item describing the Modified
- Version as stated in the previous sentence.
-J. Preserve the network location, if any, given in the Document for
- public access to a Transparent copy of the Document, and likewise
- the network locations given in the Document for previous versions
- it was based on. These may be placed in the "History" section.
- You may omit a network location for a work that was published at
- least four years before the Document itself, or if the original
- publisher of the version it refers to gives permission.
-K. In any section entitled "Acknowledgements" or "Dedications",
- preserve the section's title, and preserve in the section all the
- substance and tone of each of the contributor acknowledgements
- and/or dedications given therein.
-L. Preserve all the Invariant Sections of the Document,
- unaltered in their text and in their titles. Section numbers
- or the equivalent are not considered part of the section titles.
-M. Delete any section entitled "Endorsements". Such a section
- may not be included in the Modified Version.
-N. Do not retitle any existing section as "Endorsements"
- or to conflict in title with any Invariant Section.
-
-If the Modified Version includes new front-matter sections or
-appendices that qualify as Secondary Sections and contain no material
-copied from the Document, you may at your option designate some or all
-of these sections as invariant. To do this, add their titles to the
-list of Invariant Sections in the Modified Version's license notice.
-These titles must be distinct from any other section titles.
-
-You may add a section entitled "Endorsements", provided it contains
-nothing but endorsements of your Modified Version by various
-parties--for example, statements of peer review or that the text has
-been approved by an organization as the authoritative definition of a
-standard.
-
-You may add a passage of up to five words as a Front-Cover Text, and a
-passage of up to 25 words as a Back-Cover Text, to the end of the list
-of Cover Texts in the Modified Version. Only one passage of
-Front-Cover Text and one of Back-Cover Text may be added by (or
-through arrangements made by) any one entity. If the Document already
-includes a cover text for the same cover, previously added by you or
-by arrangement made by the same entity you are acting on behalf of,
-you may not add another; but you may replace the old one, on explicit
-permission from the previous publisher that added the old one.
-
-The author(s) and publisher(s) of the Document do not by this License
-give permission to use their names for publicity for or to assert or
-imply endorsement of any Modified Version.
-
-
-5. COMBINING DOCUMENTS
-
-You may combine the Document with other documents released under this
-License, under the terms defined in section 4 above for modified
-versions, provided that you include in the combination all of the
-Invariant Sections of all of the original documents, unmodified, and
-list them all as Invariant Sections of your combined work in its
-license notice.
-
-The combined work need only contain one copy of this License, and
-multiple identical Invariant Sections may be replaced with a single
-copy. If there are multiple Invariant Sections with the same name but
-different contents, make the title of each such section unique by
-adding at the end of it, in parentheses, the name of the original
-author or publisher of that section if known, or else a unique number.
-Make the same adjustment to the section titles in the list of
-Invariant Sections in the license notice of the combined work.
-
-In the combination, you must combine any sections entitled "History"
-in the various original documents, forming one section entitled
-"History"; likewise combine any sections entitled "Acknowledgements",
-and any sections entitled "Dedications". You must delete all sections
-entitled "Endorsements."
-
-
-6. COLLECTIONS OF DOCUMENTS
-
-You may make a collection consisting of the Document and other documents
-released under this License, and replace the individual copies of this
-License in the various documents with a single copy that is included in
-the collection, provided that you follow the rules of this License for
-verbatim copying of each of the documents in all other respects.
-
-You may extract a single document from such a collection, and distribute
-it individually under this License, provided you insert a copy of this
-License into the extracted document, and follow this License in all
-other respects regarding verbatim copying of that document.
-
-
-7. AGGREGATION WITH INDEPENDENT WORKS
-
-A compilation of the Document or its derivatives with other separate
-and independent documents or works, in or on a volume of a storage or
-distribution medium, does not as a whole count as a Modified Version
-of the Document, provided no compilation copyright is claimed for the
-compilation. Such a compilation is called an "aggregate", and this
-License does not apply to the other self-contained works thus compiled
-with the Document, on account of their being thus compiled, if they
-are not themselves derivative works of the Document.
-
-If the Cover Text requirement of section 3 is applicable to these
-copies of the Document, then if the Document is less than one quarter
-of the entire aggregate, the Document's Cover Texts may be placed on
-covers that surround only the Document within the aggregate.
-Otherwise they must appear on covers around the whole aggregate.
-
-
-8. TRANSLATION
-
-Translation is considered a kind of modification, so you may
-distribute translations of the Document under the terms of section 4.
-Replacing Invariant Sections with translations requires special
-permission from their copyright holders, but you may include
-translations of some or all Invariant Sections in addition to the
-original versions of these Invariant Sections. You may include a
-translation of this License provided that you also include the
-original English version of this License. In case of a disagreement
-between the translation and the original English version of this
-License, the original English version will prevail.
-
-
-9. TERMINATION
-
-You may not copy, modify, sublicense, or distribute the Document except
-as expressly provided for under this License. Any other attempt to
-copy, modify, sublicense or distribute the Document is void, and will
-automatically terminate your rights under this License. However,
-parties who have received copies, or rights, from you under this
-License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-
-10. FUTURE REVISIONS OF THIS LICENSE
-
-The Free Software Foundation may publish new, revised versions
-of the GNU Free Documentation 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. See
-http://www.gnu.org/copyleft/.
-
-Each version of the License is given a distinguishing version number.
-If the Document specifies that a particular numbered version of this
-License "or any later version" applies to it, you have the option of
-following the terms and conditions either of that specified version or
-of any later version that has been published (not as a draft) by the
-Free Software Foundation. If the Document does not specify a version
-number of this License, you may choose any version ever published (not
-as a draft) by the Free Software Foundation.
-
-
-ADDENDUM: How to use this License for your documents
-
-To use this License in a document you have written, include a copy of
-the License in the document and put the following copyright and
-license notices just after the title page:
-
- Copyright (c) YEAR YOUR NAME.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.1
- or any later version published by the Free Software Foundation;
- with the Invariant Sections being LIST THEIR TITLES, with the
- Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
- A copy of the license is included in the section entitled "GNU
- Free Documentation License".
-
-If you have no Invariant Sections, write "with no Invariant Sections"
-instead of saying which ones are invariant. If you have no
-Front-Cover Texts, write "no Front-Cover Texts" instead of
-"Front-Cover Texts being LIST"; likewise for Back-Cover Texts.
-
-If your document contains nontrivial examples of program code, we
-recommend releasing these examples in parallel under your choice of
-free software license, such as the GNU General Public License,
-to permit their use in free software.
diff --git a/help/ChangeLog b/help/ChangeLog
deleted file mode 100644
index d49a4bc91f..0000000000
--- a/help/ChangeLog
+++ /dev/null
@@ -1,79 +0,0 @@
-2004-10-11 Rodney Dawes <dobey@novell.com>
-
- * C/Makefile.am: Add new images to figures
- * C/figures/*.(png|eps): Update and add new images
-
- * C/evolution.xml: Update to lastest version of docs
-
-2004-10-04 Rodney Dawes <dobey@novell.com>
-
- * C/Makefile.am: Add unversioned xml/omf to EXTRA_DIST
-
-2004-09-13 Rodney Dawes <dobey@novell.com>
-
- * xmldocs.make: Don't requires entities here
-
- * C/Makefile.am: Add new figures to the list of images
- Generate versioned xml/omf files based on $(BASE_VERSION)
- Fix up CLEANFILES to include the stuff we generate
-
- * C/POTFILES.in:
- * C/apx-*.xml:
- * C/config-*.xml:
- * C/evolution-1.5-C.omf:
- * C/evolution-1.5.xml:
- * C/legal.xml:
- * C/menuref.xml:
- * C/preface.xml:
- * C/topic.dat:
- * C/usage-*.xml:
- Remove all of these files from CVS
-
- * C/evolution-C.omf:
- * C/evolution.xml:
- Add these files to replace the removed files above
-
- * C/figure/*_a.(png|gif): Add new screenshots
-
-2004-01-27 Aaron Weber <aaron@ximian.com>
- * C/usage-mail-org.xml: spamfiltering
- * C/usage-mail.xml: charsets and input methods.
- * C/evolution-1.5.xml: assign copyright to Novell, add 2004.
- * C/legal.xml: Novell/XImian switcheroo
-
-
-2004-01-26 David Trowbridge <trowbrds@cs.colorado.edu>
-
- * quick ref docs
-
-2004-01-09 Rodney Dawes <dobey@ximian.com>
-
- * C/Makefile.am (entities): Remove usage-exec-summary.xml
-
-2004-01-07 Aaron Weber <aaron@ximian.com>
- * help/C/Makefile.am: remove old graphic files
- * help/C/evolution-1.5.xml updated style notes, date, version
- * help/C/apx-authors.xml: fix <application> usage
- * help/C/apx-gloss.xml: fix <application> and <guibutton> usage
- * help/C/config-prefs.xml: same
- * help/C/config-sync.xml: same
- * help/C/menuref.xml: same
- * help/C/usage-calendar.xml: same
- * help/C/usage-contact.xml: same
- * help/C/usage-exchange.xml: same
- * help/C/usage-mail-org.xml: same
- * help/C/usage-mail.xml: same
- * help/C/usage-print.xml: same
- * help/C/usage-sync.xml : same
- * help/C/usage-mainwindow.xml same, plus
- * help/C/preface.xml same, plus removed Summary
- * help/C/topic.dat Remove Summary
- * help/C/usage-exec-summary.xml: Remove summary
- * help/C/figures/folder-bar.png: delete
- * help/C/figures/summary.png: delete
-
-
-2003-11-17 JP Rosevear <jpr@ximian.com>
-
- * C/Makefile.am: Switch version to 1.5
-
diff --git a/help/ChangeLog.pre-1-4 b/help/ChangeLog.pre-1-4
deleted file mode 100644
index c983277068..0000000000
--- a/help/ChangeLog.pre-1-4
+++ /dev/null
@@ -1,2072 +0,0 @@
-2003-05-19 Aaron Weber <aaron@ximian.com>
-
- * C/config-prefs.xml: fix glossterms not to be inside
- <guilabel>s. None of these should be inside <term>s anyway.
-
-2003-05-02 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail-org.xml: Filter-new-fig.png
-
- * C/figures/filter-assist-fig.png: removed this figure image. Didn't need it and -new.
- * C/figures/small_desktop.png: removed this figure image. Not sure why we had it.
- * C/Makefile.am: remove filter-assist-fig.png,
-
-2003-04-15 Aaron Weber <aaron@ximian.com>
-
- * C/usage-exchange.xml: delegation
-
-2003-04-27 Rodney Dawes <dobey@ximian.com>
-
- * C/Makefile.am: Add figures/outline.png to $(figs)
-
-2003-04-14 Aaron Weber <aaron@ximian.com>
-
- * C/config-prefs.xml: Validation, mostly. Change in some ref names.
-
-2003-04-10 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail-org.xml: can't vfolder on arbitrary folders.
-
-2003-04-08 Aaron Weber <aaron@ximian.com>
-
- * C/legal.xml: update trademark/copyright hoo-ha.
-
-2003-04-07 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail-org.xml: add flag-for-followup instructions.
-
-2003-03-27 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (EXTRA_DIST): Ooops, add omf.make.
-
-2003-03-26 Ettore Perazzoli <ettore@ximian.com>
-
- * C/evolution-1.4-C.omf: Renamed from evolution-C.omf.
- * C/evolution-1.4.xml: Renamed from evolution.xml.
-
- * Makefile.am (SUBDIRS): Remove "no" for now.
-
- * xmldocs.make: Updated to most recent version on GNOME CVS.
-
- * C/Makefile.am (docname): Add version.
- (omffile): Likewise.
-
-2003-03-19 Aaron Weber <aaron@ximian.com>
-
- * Makefile.am: s/sgml/xml/ (DOH)
-
-2003-02-19 Aaron Weber <aaron@ximian.com>
-
- * C/preface.xml: add a couple "expert tips" that don't really go
- anywhere else.
-
-
-2003-02-18 Aaron Weber <aaron@ximian.com>
-
- * C/usage-exchange.xml: replaced image, updated for 1.2 layout
- (different order, mostly). Changed name of a section for better
- clarity; this may cause filenames to differ in future builds.
-
- * C/figures/exchange-receive-options.png: updated image.
-
-2003-02-04 Aaron Weber <aaron@ximian.com>
-
- * C/apx-authors.xml: thx to Baris, adjust phrasing in assorted
- places. tiny fixes, basically.
-
-2003-01-30 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mainwindow.xml: updates from Baris Cicek.
-
-2003-01-15 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mainwindow.xml: Change links from ghelp links to internal apx-fdl or apx-gpl
-
- * es/evolution.sgml: s/gnome-help/ghelp
-
- * es/preface.sgml: s/gnome-help/ghelp
-
-2003-01-11 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail.xml: "Send Later" feature changed for 1.2 and I
- didn't notice. Shame on me.
-
-2002-12-16 Aaron Weber <aaron@ximian.com>
-
- * C/config-sync.xml: spelling/typos
-
- * C/usage-exchange.xml: spelling/typos
-
- * C/usage-mail.xml: spelling/typos
-
- * C/usage-mainwindow.xml: spelling/typos
-
-2002-12-10 Aaron Weber <aaron@ximian.com>
-
- * C/config-prefs.xml: change directory server description.
-
- * C/preface.xml: typo (bug 35362, "Resend" instead of "Redirect).
- This whole section will need to be redone at some point.
-
-2002-12-06 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail-org.xml: add spam filtering help.
-
-2002-11-19 Aaron Weber <aaron@ximian.com>
-
- * C/config-prefs.xml: fix typo as per bug 34152
-
- * C/legal.xml: redo tags for legalnotice ordering. open/close for
- actual preface is in evolution.xml and the LEGAL entity
- (legal.xml) is now part of the preface. the legalnotice tag itself
- merely says "hey, go look at the preface, legal info is there due
- to rendering issues."
-
- * C/apx-gpl.xml: new file. GPL!
-
- * C/Makefile.am: New file: apx-gpl.xml. Re-alphabetize the files
- listed as entities, and make the \'s line up so it looks pretty.
-
- * C/preface.xml: redo tags for legalnotice ordering. open/close
- for actual preface is in evolution.xml and the LEGAL entity
- (legal.xml) is now part of the preface.
-
- * C/evolution.xml: reorder, add GPL, put legalnotice inside
- preface. Put actual <preface> tags in this file, so that the
- preface could consist of sect1s which are the &LEGAL; and
- &PREFACE; entities.
-
-2002-11-11 Aaron Weber <aaron@ximian.com>
-
- * C/config-prefs.xml: fix bug 27336, which is about how the Search
- Base option description is wrong.
-
-2002-11-04 Aaron Weber <aaron@ximian.com>
-
- * C/*.sgml: All sgml files replaced with xml files. XML files
- validated. Two new XML files-- apx-fdl.xml and legal.xml
-
- * C/evolution-C.omf: Altered to fit the GDP template. This may now
- work with the GNOME 2.0 DTD, although I could be wrong.
-
- * sgmldocs.make: removed and replaced with xmldocs.make. This will
- break all translations until they are also ported to XML. I will
- probably begin doing that tomorrow, since it's just markup and not
- language stuff.
-
- * C/Makefile.am: added two files
-
-2002-10-22 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail.sgml: Edit-->Undelete, not Actions-->Undelete
-
-2002-10-16 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail.sgml: no longer need to enter path.
-
-
-2002-10-15 Aaron Weber <aaron@ximian.com>
-
- * C/usage-exchange.sgml: Update supported/unsupported list.
-
- * C/topic.dat: Change "What is Evolution" to "Introduction"
-
- * C/usage-exchange.sgml: typo.
-
- * C/menuref.sgml: update keycapss.
-
- * C/usage-mainwindow.sgml: add note about command-line options.
-
-2002-10-11 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail-org.sgml: add note about multiple repeated header
- definitions as per 31291.
-
-2002-10-08 Aaron Weber <aaron@ximian.com>
-
- * C/usage-exchange.sgml: fix 1.0/1.2 feature list discrepancies.
-
- * C/preface.sgml: add info about man page and so forth.
-
- * C/usage-mail.sgml: fix 30892, a cosmetic bug.
-
-2002-09-20 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail.sgml: offline usage.
-
- * C/usage-calendar.sgml: linked to wrong image.
-
-2002-09-19 Kjartan Maraas <kmaraas@gnome.org>
-
- * C/evolution-C.omf: Make it validate.
- * es/evolution-es.omf: Same here.
-
-
-2002-09-19 Aaron Weber <aaron@ximian.com>
-
- * C/config-sync.sgml: add item about permissions.
-
- * C/usage-mail-org.sgml: add note about filter applications, tip
- for easy filtering.
-
- * C/usage-mail.sgml: encryption update
-
-2002-08-28 Aaron Weber <aaron@ximian.com>
-
- * C/preface.sgml: nav-by-letters
-
-2002-08-23 Aaron Weber <aaron@ximian.com>
-
- * C/preface.sgml: remove shortcuts that didn't actually get added
- to the app.
-
-2002-08-22 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail-org.sgml: change Exchange description
-
- * C/config-prefs.sgml: add RDF note to newsfeed item.
-
- * C/preface.sgml: update as per Christine's comments in
- http://bugzilla.ximian.com/show_bug.cgi?id=29239
-
-2002-07-09 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-mail-org.sgml: Added note about set status filter action.
-
-2002-06-28 Aaron Weber <aaron@ximian.com>
-
- * C/usage-exec-summary.sgml: change menu item links.
-
-2002-06-27 Aaron Weber <aaron@ximian.com>
-
- * C/evolution-C.omf: apply patch from owen taylor
-
-2002-06-26 Aaron Weber <aaron@ximian.com>
-
- * C/usage-contact.sgml: remove the search-refining feature, which
- isn't actually true, i think.
-
- * C/apx-authors.sgml: update slightly.
-
- * C/apx-bugs.sgml: remove list of 1.1.x features.
-
- * C/usage-mainwindow.sgml: minor tweaks
-
-2002-06-25 Aaron Weber <aaron@ximian.com>
-
- * C/config-prefs.sgml: more improvem,ent.
-
-2002-06-24 Aaron Weber <aaron@ximian.com>
-
- * C/config-prefs.sgml: overhaul. still need to improve examples.
-
- * C/usage-mail.sgml: link to somewhere i have deleted.
-
- * C/usage-contact.sgml: fix sharing section more
-
-2002-06-10 Aaron Weber <aaron@ximian.com>
-
- * C/usage-contact.sgml: some of this was shamefully inaccurate.
-
- * C/preface.sgml: add original location.
-
-2002-06-04 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-mail.sgml: Added a tip mentioning that gpg can
- automagically contact the server for keys without having to use a
- console.
-
-2002-05-30 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-mail.sgml: Reworded the signature introduction
- paragraph. Started work on documenting the new signature editor.
- I am kind of unsure of the full functionality, so I'm going to
- wait a little bit on it.
-
-2002-05-30 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail.sgml: links to conf.
-
- * C/usage-mainwindow.sgml: updated for links to configuration.
-
- * C/preface.sgml: added "What's new?" section with a few entries.
-
- * C/evolution.sgml: Minor stylistic tweaks, updated version
- numbers.
-
- * C/Makefile.am: Removed evolution-faq.sgml and usage-notes.sgml,
- and cvs removed them. These files are vestiges of the distant
- past.
-
-2002-05-06 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mainwindow.sgml: minor feature change in Evolution w/r/t Exchange calendars.
-
- * C/usage-exchange.sgml: minor feature change in Evolution w/r/t Exchange calendars.
-
- * C/usage-calendar.sgml: minor feature change in Evolution w/r/t Exchange calendars.
-
- * C/usage-mainwindow.sgml: validation issue.
-
-2002-04-22 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail.sgml: use gpg --import, as per bug 23113
-
-2002-04-01 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mainwindow.sgml: remove png-variant DTD from comments.
- change should affect nothing.
-
-2002-04-04 Ettore Perazzoli <ettore@ximian.com>
-
- * C/Makefile.am: Remove bogus EXTRA_DIST with sgmldocs.make.
- Problem pointed out by Richard Boulton <richard@tartarus.org>.
-
-2002-03-27 JP Rosevear <jpr@ximian.com>
-
- * C/Makefile.am: end the line properly
-
-2002-03-27 Aaron Weber <aaron@ximian.com>
-
- * C/topic.dat: add from branch.
- * C/figures/*: merge from branch
- * C/usage-calendar.sgml: merge from branch
- * C/usage-mail.sgml: merge from branch
- * C/usage-mail-org.sgml: merge from branch
- * C/Makefile.am: changes from other branch
- * C/usage-print.sgml: merge from branch
- * C/usage-exchange.sgml: merge from branch
- * C/usage-mail.sgml: merge from evolution-1-0-branch branch.
-
-2002-03-25 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-mail.sgml: Added mention that 2048 maybe recommended by
- some people. Fixed a typo.
-
-2002-03-23 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-print.sgml: I fixed a typo which caused the
- documentation to not build.
-
-2002-03-14 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-mail-org.sgml: Did some basic cleanup.
-
- * C/usage-mail.sgml: Linked "expunge" to the glossary.
- Made some basic grammar changes.
- Reindented a whole lot of things.
-
- * C/apx-gloss.sgml: Added Postscript as a glossary definition.
-
- * C/usage-print.sgml: Changed the introduction of this. Do users
- really care about gnome-print? Linked the Postscript line to the
- glossary.
-
- * C/usage-mail.sgml: Pulled warning about the HTML mail stuff.
-
-2002-03-12 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-mail.sgml: Replaced "png" with "PNG". This shouldn't
- break the SGML build and it's a slow start to the XML porting
- process. Included information about how to create an HTML
- signature.
-
-2002-03-11 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-mail.sgml: Redid wording on a title, minute change.
- Fix indenting.
-
-2002-02-10 Kevin Breit <mrproper@ximian.com>
-
- * C/evolution-C.omf: Removed "The" from title.
-
-2002-02-06 Aaron Weber <aaron@ximian.com>
-
- * C/Makefile.am: added
- C/figures/schedule.png,exchange-identity.png exchange-receive.png,
- exchange-receive-options.png
-
- * C/usage-exchange.sgml: expanded note about active directory
- server. added screenshot for Free/Busy feature. Doubled the size
- of the config instructions.
-
- * C/figures/schedule.png: New file, screenshot for free/busy feature.
-
- * C/evolution.sgml: added correct copyright years.
-
- * C/usage-mail-org.sgml: warning about INBOX subfolder brokenness.
-
-2002-01-29 Kevin Breit <mrproper@ximian.com>
-
- * C/config-prefs.sgml: Started writing an LDAP config example
-
-2002-01-27 Kevin Breit <mrproper@ximian.com>
-
- * C/config-prefs.sgml: Added information regarding types of search scopes
-
- * C/usage-contact.sgml: Fixed some linking brokenness
-
- * C/apx-gloss.sgml: Added Search Base as an entry
- Added Search Scope as an entry
-
- * C/config-prefs.sgml: Fixed indenting, I guess.
-
- * C/usage-contact.sgml: Rewrote LDAP introduction paragraph
- Added information about setting up Evolution to use LDAP. It's just a lazy xref.
-
-2002-01-27 Ettore Perazzoli <ettore@ximian.com>
-
- * sgmldocs.make: Use `-f' instead of `-e' so installation of
- topic.dat works on non-GNU systems too.
-
-2002-01-17 Aaron Weber <aaron@ximian.com>
-
- * C/apx-gloss.sgml: typos.
-
-2002-01-15 Aaron Weber <aaron@ximian.com>
-
- * C/config-prefs.sgml: Redo the whole options/account-creation
- thing.
-
- * C/usage-mainwindow.sgml: Redo the whole options/account-creation
- thing.
-
-2002-01-07 Aaron Weber <aaron@ximian.com>
-
- * C/evolution.sgml: Touched this file but don't think I changed
- it.
-
- * C/usage-calendar.sgml: mention the full-advantage section and
- the exchange features. Expand mention of "autopick" and general
- polish on the appointment-scheduling and peer-to-peer groupware
- functions. Also clarify palm-sync location information. All
- features danw mentioned as critical are now docuemnted.
-
- * C/usage-exchange.sgml: Fix and expand as per Danw's notes about
- Features that need to be documented.
-
-2002-01-04 Aaron Weber <aaron@ximian.com>
-
- * C/usage-exchange.sgml: Revised list of supported/unsupported
- features. Changed installation instructions.
-
-2001-12-21 Aaron Weber <aaron@ximian.com>
-
- * C/usage-exchange.sgml: add notes about server/license
- requirements, revise "your previous options" text to flow more
- smoothly.
-
-2002-01-04 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-mail.sgml: Added a tip about reply-to specification stuff
-
- * C/usage-calendar.sgml: Fixed brokenness
-
-2001-12-27 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-exchange.sgml: Small fix
-
-2001-12-24 Kevin Breit <mrproper@ximian.com>
-
- * C/apx-bugs.sgml: Updated indenting
-
- * C/apx-authors.sgml: Updated my email address
-
- * C/usage-print.sgml: Just, ya know, small change
-
- * C/usage-exchange.sgml: Fixed wording, tags, and indenting
-
-2001-12-22 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-mainwindow.sgml: Added information about importing mutt to Evolution.
- Added a bit of info to the above.
-
-2001-12-20 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-exchange.sgml: Added a <sect1> that discusses features of Connector
-
-2001-12-18 Aaron Weber <aaron@ximian.com>
-
- * C/usage-exchange.sgml: add notes about server requirements.
-
- * C/topic.dat: Changed label of "Connecting to Exchange Servers"
-
-2001-12-18 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-mainwindow.sgml: Added information about importing KMail to Evolution.
-
-2001-12-14 Kevin Breit <mrproper@ximian.com>
-
- * C/apx-gloss.sgml: Slight glossary changes in wording
-
- * C/usage-mail.sgml: Indenting changes, minor reorganization.
-
-2001-12-05 Aaron Weber <aaron@ximian.com>
-
- * C/usage-calendar.sgml: added "meeting-announce" note ("Simple
- meeting announcements").
-
- * C/config-prefs.sgml: Additional links to other portions of the
- document.
-
-2001-11-30 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail.sgml: Tiny error fix.
-
-2001-11-29 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-mail.sgml: Added more info about pretty emails.
-
-2001-11-28 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-mail.sgml: Added section about how to make your email pretty. I'll add more each day or something.
-
-2001-11-14 Ettore Perazzoli <ettore@ximian.com>
-
- [Workaround for Nautilus/Scrollkeeper bug that prevents our SGML
- files to generate the docs properly; pointed out by Greg Leblanc.]
-
- * C/evolution-C.omf: Point to index.html instead of
- `evolution.sgml'.
-
- * sgmldocs.make: Install the SGML files in evolution/sgml, and the
- HTML files in evolution.
-
-2001-10-29 Aaron Weber <aaron@ximian.com>
-
- * C/apx-bugs.sgml: typos, redescribe 1.1 bugs. Re-validated.
-
- * C/apx-authors.sgml: Added last few authors, a few more credits,
- etc. Also changed contact info and URL for evolution.
-
- * C/menuref.sgml: did we have only 1 item in the calendar?
- yes. Also, s/Contact Manager/Addressbook/
-
- * C/usage-calendar.sgml: phrasing. UI. Spelling. Validation.
-
- * C/Makefile.am: removed config-encryption and
- usage-encryption. Stray files. Do not use, ship, etc. All
- encryption info is in the mail docs.
-
- * C/config-sync.sgml: call it the addressbook. added : for <terms>
-
- * C/config-prefs.sgml: commented out empty section.
-
- * C/figures/print-preview.png: ch. screenshot
-
- * C/usage-contact.sgml: address book--> addressbook
-
- * C/usage-mail-org.sgml: added "the note below" (duplicate of data
- in mainwindow.sgml, but so is all the import information. The
- import process is available in two places, we should document it
- in two places. Also typos. removed a commented-out section on
- subscription management-- now in usage-mail and mainwindow.
-
- * C/usage-mail.sgml: mdash correction.
-
- * C/usage-mainwindow.sgml: replaced &mdash; with :
-
- * C/apx-gloss.sgml: typo.
-
- * C/preface.sgml: gnome-help-browser doesn't understand &mdash;
-
-2001-10-28 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-mail-org.sgml: Added the iCalendar format to the list of imported types. The .ics importing was added _last minute_.
-
- * C/usage-calendar.sgml: Fixed stupid build bugs
-
- * C/usage-mail.sgml: Fixed a boo-boo
-
- * C/usage-exec-summary.sgml: Touchups, nothing here, run along
-
-2001-10-27 Kevin Breit <mrproper@ximian.com>
-
- * C/config-prefs.sgml: Rewrite of the calendar preferences. I love how I'm having to rewrite this 48 hours before the freeze. Why are we waiting this long? It's beyond me, but oh well. I'll continue writing and listening to The Doors.
-
- * C/figures/calendar.png: Added labels
-
- * C/figures/mail-inbox.png: Added labels and changed which image is used
-
- * C/evolution.sgml: Bumped the version # to 1.0
-
- * C/figures/summary.png: I played with the labels a bit
-
-2001-10-26 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-calendar.sgml: Lots of changes on recommendation from Damon Chaplin. We love you Damon!
-
- * C/usage-contact.sgml: One more FIXME...done
-
- * C/config-prefs.sgml: Fixed a definition, one less FIXME to deal with.
-
- * C/usage-mail-org.sgml: Moved importing information here.
-
- * C/usage-mail.sgml: Moved importing information to -org.sgml
-
- * C/usage-mail-org.sgml: Added a note
-
- * C/usage-mainwindow.sgml: Added screenshot and labels of stuff for summary.
-
-2001-10-24 Kevin Breit <mrproper@ximian.com>
-
- * C/figures/mail-composer.png: I updated this becuase the screenshot was humerously _old_.
-
-2001-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * C/topic.dat: s/usage-exec-summary.html/usage-summary.html.
-
-2001-10-22 Aaron Weber <aaron@ximian.com>
-
- * C/evolution.sgml: validation. SIlly me.
-
-2001-10-19 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail-org.sgml: Many changes w/r/t IMAP and importation and encryption.
-
- * C/usage-contact.sgml: A few changes, w/r/t import.
-
- * C/usage-mainwindow.sgml: IMAP stuff.
-
- * C/usage-exec-summary.sgml: More changes. Update to intro sect.
-
-2001-10-19 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mainwindow.sgml: Assorted fixes. Kevin, there's a FIXME for ya in here.
-
- * C/preface.sgml: Added a few fixes.
-
- * C/apx-bugs.sgml: Added a link to bugzilla, and a list of a few
- 1.1 features.
-
-2001-10-19 Kevin Breit <mrproper@ximian.com>
-
- * C/usage-mail.sgml: Added in import dialogue documentation
-
-2001-10-07 Kjartan Maraas <kmaraas@gnome.org>
-
- * C/usage-mail-org.sgml: Add a missing </orderedlist>
-
- * C/apx-authors.sgml: Fix my name.
-
-2001-10-05 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail-org.sgml: added example to filter bulk mail.
-
-2001-10-01 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail.sgml: missing directory for figure file ref.
-
-2001-09-29 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Slightly improved encryption documentation.
-
-2001-09-26 Aaron Weber <aaron@ximian.com>
-
- * C/config-sync.sgml: Polish, describe names of conduits.
-
- * C/usage-sync.sgml: Minor changes.
-
-2001-09-25 Ettore Perazzoli <ettore@ximian.com>
-
- [Patch for Automake 1.5 compatibility pointed out by Richard
- Boulton <richard@tartarus.org>, as per #9258.]
-
- * sgmldocs.make ($(docname).sgml): Indent the rule with a tab
- instead of 8 spaces.
-
-2001-09-25 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail.sgml: Added Right-click-bginfo a little.
-
- * C/usage-mail-org.sgml: s/virtual folder/vFolder
- also use of criterion/criteria.
-
-2001-09-24 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-calendar.sgml: Fixed some brokenness
-2001-09-24 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Documented Insert -> Link a wee bit more
-
-2001-09-21 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Some grammar changes suggested by my girlfriend Amanda...props to Amanda!
-
- * C/usage-calendar.sgml: Verfied to make sure it was accurate against the calendar in functionality. Also added info about RSVP, scheduling appointments, and the like! Finally did this.
-
-2001-09-20 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mainwindow.sgml: move to DocBook 4.1
-
- * C/usage-mail-org.sgml: move to DocBook 4.1
-
- * C/usage-mail.sgml: move to DocBook 4.1
-
- * C/config-sync.sgml: move to DocBook 4.1
-
- * C/apx-gloss.sgml: move to DocBook 4.1
-
- * C/evolution.sgml: move to DocBook 4.1
-
-2001-09-19 Aaron Weber <aaron@ximian.com>
-
- * C/usage-calendar.sgml: more meetings-by-mail additions. Had no
- idea this needed so much work.
-
- * C/usage-mail.sgml: Added info about meetings-by-mail.
-
- * C/menuref.sgml: added F9 instructions.
-
- * C/config-prefs.sgml: added info on how to connect to an arbitrary port.
-
- * C/usage-mail.sgml: Revised gnome-vfs-http-proxy info.
-
- * C/usage-exec-summary.sgml: added gnome-vfs-http-proxy
- info. Almost the same as the stuff in usage-mail.
-
- * C/usage-mail-org.sgml: removed regex item.
-
-2001-09-18 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Added a tip about the always encrypt button.
-
-2001-09-17 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail.sgml: threaded mailview figure and img. added.
-
- * C/usage-sync.sgml: Note about PalmOS 4 and Password Protection.
-
- * C/figures/* (well, almost): New img.
-
-2001-09-15 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail.sgml: linked to a now-obsolete section. changed link.
-
- * C/config-prefs.sgml: Man, this needed so much more than style
- revision-- the whole mail section had to be redone. Yech.
-
- * C/usage-mail.sgml: moved "sharing mail" tip from config-prefs.
-
- * C/config-prefs.sgml: style.
-
-2001-09-13 Aaron Weber <aaron@ximian.com>
-
- * C/usage-calendar.sgml: Add more info on tasks features.
-
-2001-09-11 Aaron Weber <aaron@ximian.com>
-
- * C/evolution.sgml: Validation issues.
-
-2001-09-10 Aaron Weber <aaron@ximian.com>
-
- * C/usage-contact.sgml: Contact lists.
-
- * C/usage-mail.sgml: Contact Lists.
-
- * C/menuref.sgml: Verified and Corrected.
-
-2001-09-10 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Verified that all functionality is in here, should be!
-
-2001-09-05 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail.sgml: applied patch.
-
-2001-09-04 Aaron Weber <aaron@ximian.com>
-
- * C/evolution.sgml: Validation.
-
- * C/usage-print.sgml: Add .ps information.
-
- * C/usage-mail-org.sgml: Virtual Folder/vFolder, Ximian Evolution/Evolution.
-
-2001-09-04 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mainwindow.sgml: Validate.
-
- * C/usage-mail.sgml: More html stuff.
-
- * C/apx-authors.sgml: Credit kmarass.
-
- * C/usage-contact.sgml: groups-of-contacts-management.
-
- * C/usage-mainwindow.sgml: Add more info, "whatis" section,
- "Ximian Evolution" and "vFolder."
-
- * C/evolution.sgml: "Ximian Evolution" not "Evolution"
-
- * C/preface.sgml: Moved "whatis" section to usage-mainwindow, as
- per new-outline.
-
- * C/usage-mail.sgml: Expand deletion info. Also composer work.
-
-2001-08-30 Aaron Weber <aaron@ximian.com>
-
- * C/apx-gloss.sgml: remove Spam, emoticon, haiku. Revise "Virus"
-
-2001-09-04 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-print.sgml: Added infoa about Windows not handling .ps
-
-2001-09-03 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Fixed brokenness
-
- * C/usage-mainwindow.sgml: Added info on Exchange interaction
-
-2001-08-30 Aaron Weber <aaron@ximian.com>
-
- * C/usage-exec-summary.sgml: revise for style. added info about calendar customizing.
-
-2001-08-29 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mainwindow.sgml: Added info about NS importing.
-
-2001-08-29 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-exec-summary.sgml: Rewrote this file to be...more up to date.
-
-2001-08-28 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Renamed a xref to make it work.
-
- * C/config-prefs.sgml: Updated for new LDAP UI.
-
-2001-08-24 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Added info about tables, rules, and images
-
- * C/usage-calendar.sgml: Rename a few titles
-
-2001-08-22 Aaron Weber <aaron@ximian.com>
-
- * C/apx-gloss.sgml: public key.
-
-2001-08-22 Peter Williams <peterw@ximian.com>
-
- * sgmldocs.make: Oops, we need to take the basename too.
-
-2001-08-22 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail.sgml: Removed NNTP docs. Improved IMAP docs. IMAP
- still needs more work though.
-
- * C/config-prefs.sgml: Removed NNTP docs.
-
- * C/usage-mainwindow.sgml: s/todo/task list/, fix grammar/style.
-
-2001-08-22 Peter Williams <peterw@ximian.com>
-
- * sgmldocs.make (omf_timestamp): Put in a $(srcdir) here for when
- srcdir != builddir.
-
-2001-08-21 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am: Add `sgmldocs.make' to `EXTRA_DIST'.
-
-2001-08-20 Aaron Weber <aaron@ximian.com>
-
- * C/usage-exec-summary.sgml: Moved introductory/basic content to the
- usage-mainwindow.sgml file. Rewrote intro.
-
- * C/usage-contact.sgml: Moved introductory/basic content to the
- usage-mainwindow.sgml file.Rewrote intro.
-
- * C/usage-calendar.sgml: Moved introductory/basic content to the
- usage-mainwindow.sgml file.Rewrote intro.
-
- * C/usage-mail.sgml: Moved introductory/basic content to the
- usage-mainwindow.sgml file.Rewrote intro.
-
- * C/usage-mainwindow.sgml: Put summary-type info into
- this file from other chapters.
-
- * C/topic.dat: New file. Help Menu info.
-
-2001-08-20 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-calendar.sgml: Did more event -> appointment conversions.
-
-2001-08-18 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-calendar.sgml: Renamed events to appointments (please
- review for me as it was a simple regex replace).
-
- * C/usage-mail.sgml: Removed "emoticon" and "root of all evil",
- removed gargantuan, removed instances of "the the", changes
- Virtual Folders to vFolders, renamed "Attachements and HTML Mail"
- section, reworded "Embellish" to say "Enhance"
-
-2001-08-17 Aaron Weber <aaron@ximian.com>
-
- * C/usage-exec-summary.sgml: s/My Evolution/Summary/
-
- * C/preface.sgml: Moved "Quickref" stuff to Menuref file.
-
- * C/usage-mainwindow.sgml: removed reference to faq.
-
- * C/menuref.sgml: Gutted. Filled with "quickref" stuff.
-
- * C/evolution.sgml: Removed FAQ. Re-added menuref. Menuref is now
- the "quick reference" section.
-
-2001-08-17 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Wrote documentation about HTML templates.
-
-2001-08-16 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail.sgml: minor edits. Added <tip> about bug 7428.
-
-2001-08-16 Kjartan Maraas <kmaraas@gnome.org>
-
- * C/evolution-C.omf: Place it under <category="GNOME|Applications"/>
-
-2001-08-16 Kjartan Maraas <kmaraas@gnome.org>
-
- * C/Makefile.am: Small fix to build.
- * C/evolution-C.omf: Small fix. Remove an extra space.
- * no/Makefile.am: Same here.
- * no/evolution-no.omf: And here.
-
-2001-08-15 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Updated one line about bullet points.
-
-2001-08-15 Kjartan Maraas <kmaraas@gnome.org>
-
- * no/*: Added beginnings of a Norwegian translation.
- * sgmldocs.make: Forgot to add this. Kinda important.
- * C/*.sgml: s/fig/figures/
- * C/Makefile.am: Make it use the sgmldocs.make framework.
-
-2001-08-14 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mainwindow.sgml: Commented out menuref.
- * C/usage-contact.sgml: Commented out menuref.
- * C/evolution.sgml: commented out menuref.
- * C/preface.sgml: commented out menuref.
-
-2001-08-12 Kjartan Maraas <kmaraas@gnome.org>
-
- * C/apx-authors.sgml: Added missing ;'s after entities.
- * C/evolution-C.omf: s/en/C in Language.
- * C/usage-mail-org.sgml: Add missing ;.
- * C/usage-mainwindow.sgml: Same here.
-
-2001-08-10 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail.sgml: Switched all images in entire document to
- *not* use file extensions, so that they work properly with
- db2ps. This doesn't completely fix the db2ps issues, but it's
- apparently the right way to do this.
-
-2001-08-09 Aaron Weber <aaron@ximian.com>
-
- * C/config-prefs.sgml: Made sharing tip an orderedlist.
-
-2001-08-08 Kevin Breit <battery841@mediaone.net>
-
- * C/config-prefs.sgml: Add information about sharing mailbox files.
-
-2001-08-03 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-calendar.sgml: Add information about gathering actions.
-
-2001-08-02 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Added a <tip> for scrolling through mails.
-
-2001-07-30 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Fixed some breakage Aaron caused.
-
-2001-07-26 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail-org.sgml: revised.
-
- * C/usage-mail.sgml: revisions and stuff.
-
-2001-07-24 Aaron Weber <aaron@ximian.com>
-
- * C/evolution-faq.sgml: Reworded a few questions.
-
-2001-07-23 Kevin Breit <battery841@mediaone.net>
-
- * C/Makefile.am: Pulled instance of config-setupassist.sgml to make stuff build right.
-
-2001-07-23 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mainwindow.sgml: validated.
-
- * C/config-setupassist.sgml: Removed.
-
- * C/evolution.sgml: removed config-setupassist.
-
- * C/usage-exec-summary.sgml: Minor revisions.
-
- * C/usage-contact.sgml: Added 'format="png"' to all <image> tags
- missing the attribute.
-
- * C/usage-calendar.sgml: Added 'format="png"' to all <image> tags
- missing the attribute.
-
- * C/usage-mail.sgml: Added 'format="png"' to all <image> tags
- missing the attribute.
-
- * C/usage-mainwindow.sgml: Style. Merged info from preface. Added
- 'format="png"' to all <image> tags missing the attribute.
-
- * C/preface.sgml: Style changes. Removed info that was duplicated
- in mainwindow.sgml.
-
-2001-07-20 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mainwindow.sgml: Fixed the first time druid stuff a little more.
-
-2001-07-16 Aaron Weber <aaron@ximian.com>
-
- * C/evolution-faq.sgml: Sepllcheck.
-
-2001-07-15 Kevin Breit <battery841@mediaone.net>
-
- * C/config-sync.sgml: Updated slightly for new design.
-
-2001-07-13 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mainwindow.sgml: Added lots of good stuff with the first time druid.
-
-2001-07-12 Aaron Weber <aaron@ximian.com>
-
- * C/evolution-faq.sgml: TYPO fixing.
-
-2001-07-12 Aaron Weber <aaron@ximian.com>
-
- * C/evolution-faq.sgml: Added "get bt for component-only crash" qandaentry.
-
-2001-07-10 Peter Williams <peterw@ximian.com>
-
- * */Makefile.am (dist-hook): Clean up make dist.
-
-2001-07-11 Aaron Weber <aaron@ximian.com>
-
- * C/evolution.sgml: validation on usage-mainwindow and usage-contact.
-
-2001-07-11 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-calendar.sgml: More edits.
-
- * C/usage-contact.sgml: Sick amounts of changes too!
-
- * C/usage-mail-org.sgml: Heavy editing...touched almost everything.
-
- * C/usage-exec-summary.sgml: Minor change. There was only one change for this chapter, cuz I'm such a 'godly' writer...yeah.
-
- * C/usage-mainwindow.sgml: A bit of editing.
-
- * C/preface.sgml: Screwed with the examples and did some cleanup.
-
-2001-07-10 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mail-org.sgml: validation.
-
-2001-07-10 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Added <application> tags
-
- * C/usage-mail-org.sgml: Added <application> tags
-
- * C/config-prefs.sgml: Added <application> tags
-
-2001-07-09 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-exec-summary.sgml: Editing
-
- * C/usage-mail.sgml: Editing
-
- * C/usage-mail-org.sgml: Editing
-
- * C/usage-calendar.sgml: Editing
-
- * C/usage-contact.sgml: Editing
-
- * C/usage-mail-org.sgml: Mention UNMATCHED
-
- * C/usage-mail.sgml: Commented on trash being a vFolder
-
-2001-07-06 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Spell check
-
- * C/usage-calendar.sgml: Spell check
-
-2001-07-05 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mainwindow.sgml: Added orderedlists.
-
- * C/usage-exec-summary.sgml: Added orderedlists.
-
- * C/usage-contact.sgml: Added orderedlists.
-
- * C/usage-mail-org.sgml: Added orderedlists.
-
-2001-07-03 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Put in lots of orderedlists...more SGML, less
- for the user to read. They'll thank me in droves later.
-
- * C/usage-exec-summary.sgml: Fixed build error
-
-2001-06-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * white-papers/mail/camel.sgml: Updated slightly.
-
- * Camel-Classes: Updated.
-
-2001-07-02 Kevin Breit <battery841@mediaone.net>
-
- * C/apx-common-tasks.sgml: Created its own file.
-
- * C/usage-mainwindow.sgml: You name it.
-
- * C/preface.sgml: Pulled shortcuts from here into its own apx
-
- * C/evolution.sgml: Reordered entities
-
-2001-06-30 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Pulled organizing stuff, made its own file.
-
-2001-06-26 Aaron Weber <aaron@ximian.com>
-
- * C/evolution-faq.sgml: Revised move/rename/copy questions, now
- that these functions work.
-
-2001-06-25 Aaron Weber <aaron@ximian.com>
-
- * C/evolution-faq.sgml: Now that bug-buddy works with our
- bugzilla, update faq to reflect it.
-
-2001-06-25 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Put config-encryption in usage-mail.sgml.
- config-encryption.sgml should be depreciated.
-
- * C/usage-contact.sgml: Fixed typo
-
- * C/usage-mail.sgml: Added info about mailing lists Elaborated on
- mailing lists
-
- * C/usage-exec-summary.sgml: Fixed a few typos
-
- * C/preface.sgml: Added section for importing files
-
- * C/usage-calendar.sgml: Removed some *'s that are causing
- problems.
-
-2001-06-22 Kevin Breit <battery841@mediaone.net>
-
- * C/preface.sgml: Put in Contacts information in the quicktasks.
-
- * C/usage-mail.sgml: Pulled some redundant information.
-
-2001-06-21 battery841 <battery841@mediaone.net>
-
- * C/preface.sgml, C/fig/mail-inbox.png, C/fig/mainwindow-pic.png,
- C/usage-mail.sgml: Updated screenshots and redid layout for
- graphics on pages.
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-contact.sgml: Fixed .gif problem
-
- * C/usage-mail.sgml:
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Specify the file format
-
- * C/usage-contact.sgml, C/usage-mail.sgml:
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Trying to fix the .gif problem
-
- * C/fig/calendar.png, C/fig/contact.png, C/usage-calendar.sgml:
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-calendar.sgml: Redid graphics to add labels to them and
- described the labels in text.
-
- * C/config-encryption.sgml, C/evolution.sgml:
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/evolution.sgml: Added config-encryption.sgml for building
-
- * C/fig/calendar.png, C/fig/config-cal.png, C/fig/config-mail.png,
- C/fig/filter-assist-fig.png, C/fig/filter-new-fig.png,
- C/fig/mail-composer.png, C/fig/mail-druid-pic.png,
- C/fig/mail-inbox.png, C/fig/print-dest.png,
- C/fig/print-preview.png, C/fig/vfolder-createrule-fig.png:
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/fig/*png: Updated graphics for newer UI.
-
- * C/fig/full-1.png, C/fig/full-2.png, C/fig/full-3.png,
- C/fig/full-4.png, C/fig/full-5.png, C/fig/full-6.png,
- C/fig/full-7.png, C/fig/mainwindow-pic.png, C/usage-mail.sgml:
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Redid graphics to add labels to them and
- described in labels in text. Looks good!
-
- * C/usage-encryption.sgml:
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/encryption.sgml: Added file
-
- * C/preface.sgml:
-
-2001-06-20 Kevin Breit <battery841@mediaone.net>
-
- * doc/ChangeLog: Moved my entires to doc/ChangeLog per request of
- danw
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-contact.sgml: Fixed .gif problem
-
- * C/usage-mail.sgml: Specify the file format
-
- * C/usage-mail.sgml: Trying to fix the .gif problem
-
- * C/usage-calendar.sgml: Redid graphics to add labels to them and
- described the labels in text.
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/evolution.sgml: Added config-encryption.sgml for building
-
- * C/fig/*png: Updated graphics for newer UI.
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Redid graphics to add labels to them and
- described in labels in text. Looks good!
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml:
-
-2001-06-21 Kevin Breit <battery841@mediaone.net>
-
- * C/encryption.sgml: Added file
-
-2001-06-20 Kevin Breit <battery841@mediaone.net>
-
- * ChangeLog: Moved my entires to doc/ChangeLog per request of danw
-
-2001-06-20 Kevin Breit <battery841@mediaone.net>
-
- * C/config-setupassist.sgml: Updated for new UI.
-
-2001-06-20 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-sync: Reworded a little bit for more descrip.
-
-2001-06-20 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-calendar.sgml: Documented categorizing an event.
-
-2001-06-20 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Updated Bcc: example
-
-2001-06-19 Aaron Weber <aaron@ximian.com>
-
- * C/usage-mainwindow.sgml: A couple changes to Kevin's update.
-
-2001-06-19 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-mail.sgml: Basic edits
-
-2001-06-19 Kevin Breit <battery841@mediaone.net>
-
- * C/usage-exec-summary: Updated to say "My Evolution"
-
-2001-06-19 Kevin Breit <battery841@mediaone.net>
-
- * C/apx-gloss.sgml: Added definition.
-
- * C/usage-mainwindow.sgml: Routine updates.
-
-2001-06-07 Duncan Mak <duncan@lumox.simplemente.net>
-
- * C/evolution-faq.sgml: Fixed a typo. Thanks to Greg Leblanc for
- pointing this out.
-
-2001-05-23 Ettore Perazzoli <ettore@ximian.com>
-
- * C/evolution-faq.sgml: Re-indented.
-
-2001-05-18 Duncan Mak <duncan@ximian.com>
-
- * C/evolution-faq.sgml: Added two questions about importing
- Outlook (text from Iain). Fixed some tags and cleaned up a bit
- here and there.
-
-2001-05-18 Ettore Perazzoli <ettore@ximian.com>
-
- * C/evolution-faq.sgml: Added a question about the permission
- issues with /var/spool/mail.
-
-2001-05-15 Ettore Perazzoli <ettore@ximian.com>
-
- * C/Makefile.am (SGML_FILES): Renamed to `GUIDE_SGML_FILES'.
- (EXTRA_DIST): Add `$(FAQ_SGML_FILES)'.
- (all): Depend on `evolution-faq' too.
- (evolution-faq): New.
- (install-data-local): Depend on `evolution-faq' too. Install the
- FAQ into `$(evolution_helpdir)/evolution-faq' and the guide into
- `$(evolution_helpdir)/evolution-guide'.
-
- * C/evolution-faq.sgml: New.
-
-2001-04-23 Jon Trowbridge <trow@ximian.com>
-
- * C/Makefile.am (install-data-local): Changed dependency for
- install-data-local from "evolution" to "evolution-guide".
-
-2001-04-23 Ettore Perazzoli <ettore@ximian.com>
-
- * C/Makefile.am (evolution-guide): Use `$(srcdir)' here.
-
-2001-04-23 Ettore Perazzoli <ettore@ximian.com>
-
- * C/Makefile.am (SGML_FILES): Add `evolution.sgml'.
- (evolution-guide): Process `evolution.sgml', not
- `evolution-guide.sgml'.
- (dist-hook): s/evolution-guide/evolution/
- (install-data-local): Likewise.
-
-2001-02-23 Aaron Weber <aaron@helixcode.com>
-
- * C/apx-authors.sgml: s/helixcode/ximian (How I missed this page
- on the first go-round I don't know).
-
-2001-03-14 Gediminas Paulauskas <menesis@delfi.lt>
-
- * C/Makefile.am: there's no apx-fdl.sgml and evolution-guide.sgml
- anymore
-
-2001-02-23 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: IMAP subscriptions stuff.
-
-2001-02-21 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: Advanced search/show all/save search stuff.
-
- * C/evolution.sgml: This file replaces evolution-guide.sgml, for
- Nautilus Readiness.
-
- * C/apx-gloss.sgml: glossterm conduit.
-
- * C/config-sync.sgml: Glossterm conduit.
-
- * C/preface.sgml: Checked over for Keyboard-Shortcut and other
- truthfulness.
-
-2001-02-15 Aaron Weber <aaron@helixcode.com>
-
- * C/evolution-guide.sgml: Validated. Verified. Markup fixed in
- several individual files.
-
- * C/apx-gpl.sgml: cvs-removed for GNOME 1.4 compliance.
-
- * C/apx-fdl.sgml: cvs-removed for GNOME 1.4 compliance.
-
-2001-02-09 Aaron Weber <aaron@helixcode.com>
-
- * C/config-sync.sgml: Overhaul. Now accurate and truthful and
- clear.
-
- * C/usage-calendar.sgml: Minor Changes.
-
-2001-02-08 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: Minor Changes.
-
- * C/usage-mail.sgml: Minor Changes.
-
-2001-02-07 Aaron Weber <aaron@helixcode.com>
-
- * C/menuref.sgml: Added section, but left blank til UI stabilizes.
-
- * C/usage-exec-summary.sgml: A little functionality described.
-
- * C/usage-mainwindow.sgml: Added tasks and Exec-summary.
-
- * C/usage-calendar.sgml: Describe semi-autonomy of task pad.
-
-2001-02-06 Aaron Weber <aaron@ximian.com>
-
- * C/usage-contact.sgml: s/contact manager/address book/ and
- revised text.
-
- * C/usage-exec-summary.sgml: New file. Describes Executive
- Summary.
-
-2001-01-19 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: More of Megan's revisions, and Field Chooser
- functions in the Sort section.
-
- * C/apx-gloss.sgml: added "ToolTip"
-
-2001-01-18 Aaron Weber <aaron@helixcode.com>
-
- * C/preface.sgml: s/Helix Code/Ximian, and Megan's comments.
-
- * C/usage-mainwindow.sgml: s/Helix Code/Ximian/, and Megan's
- comments.
-
- * C/evolution-guide.sgml: s/Helix Code/Ximian/
-
-2000-12-13 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: Revisions as suggested by Dan. Especially to
- filter dialogs... which still need some renaming, IMHO.
-
- * C/usage-mainwindow.sgml: Revisions as suggested by
- Dan. Especially to the Folder Limits thing, which still upsets me
- somehow.
-
- * C/preface.sgml: Revisions as suggested by Dan.
-
-2000-11-29 Aaron Weber <aaron@helixcode.com>
-
- * C/config-setupassist.sgml: added some <glossterms>, added
- linkends to existing glossterms.
-
-2000-11-28 Aaron Weber <aaron@helixcode.com>
-
- * C/evolution-guide.sgml: Changed intro to Config section. Now
- defines what, exactly, "configurable" means.
-
- * C/usage-print.sgml: Stylistic revisions.
-
- * C/usage-calendar.sgml: Stylistic revisions.
-
- * C/usage-contact.sgml: Stylistic revisions.
-
-2000-11-09 Aaron Weber <aaron@helixcode.com>
-
- * C/menuref.sgml: Message heading Right-Click Menu.
-
-2000-11-03 Aaron Weber <aaron@helixcode.com>
-
- * C/apx-gloss.sgml: The regexp example was quite wrong. Props to
- Sasha.
-
-2000-11-02 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: Style and spelling.
-
-2000-11-01 Aaron Weber <aaron@helixcode.com>
-
- * C/config-prefs.sgml: Fixed validation errors.
-
- * C/apx-gloss.sgml: Fixed HTML, style stuff.
-
- * C/usage-mail.sgml: Stylistic overhaul.
-
- * C/usage-mainwindow.sgml: Fixed groups in shortcut bar, fixed
- folder navigation tips.
-
-2000-10-31 Aaron Weber <aaron@helixcode.com>
-
- * C/preface.sgml: Minor stylistic revisions.
-
-2000-10-30 Aaron Weber <aaron@helixcode.com>
-
- * COPYING-DOCS: New file. This is the official place to put the
- FDL now.
-
-
-2000-11-01 Radek Doulik <rodo@helixcode.com>
-
- * Keybindings: added composer keybindings description
-
-2000-10-25 Aaron Weber <aaron@helixcode.com>
-
- * C/menuref.sgml: Actions -> New Directory Server added.
-
- * C/config-prefs.sgml: Actions -> New Directory Server added.
-
- * C/usage-contact.sgml: Actions -> New Directory Server added.
-
- * C/menuref.sgml: Added mail Settings->Manage Subscriptions menu.
-
- * C/usage-mail.sgml: Subscriptions section added. Quite
- incomplete, though.
-
-2000-10-11 Aaron Weber <aaron@helixcode.com>
-
- * C/evolution-guide.sgml: Re-checked validity of all files. Made
- minor changes to menuref.sgml, usage-mail.sgml, usage-print.sgml
- to bring up to spec.
-
- * C/usage-mail.sgml: Redid Filter & Vfolder to match the new &
- improved functionality.
-
- * C/fig/*: Re-did remaining screenshots.
-
-2000-10-10 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-print.sgml: New file, describing printing and
- print-preview.
-
- * C/fig/print-preview.png: New file.
-
- * C/fig/print-dest.png: New file.
-
- * C/evolution-guide.sgml: Added usage-print entity.
-
- * C/menuref.sgml: Fixed calendar menu stuff.
-
- * C/usage-mail.sgml: No more "Actions" menu, other assorted
- menu-related changes.
-
-2000-10-06 Aaron Weber <aaron@helixcode.com>
-
- * C/fig/ * replaced a whole bunch of screenshots.
-
-2000-10-05 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: Described Search features.
-
- * C/menuref.sgml: Contact Manager menus fixed.
-
-2000-10-04 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: Fixed glossterms.
-
- * C/usage-mail.sgml: Fixed glossterms, filenames, spellchecked.
-
- * C/apx-gloss.sgml: Added "Inline," "VCard".
-
- * C/usage-mainwindow.sgml: Fixed glossterms,
- filenames. Spellchecked.
-
- * C/usage-mail.sgml: Fixed glossterms, filenames. Spellchecked.
-
- * C/evolution-guide.sgml: New Legalnotice. Removed FDL and GPL,
- which are now included as part of the gnome-help package.
-
- * C/usage-contact.sgml: Spellcheck. Fixed some wording, and
- responded to clahey's suggestions-- notably, commented out the
- "add to master list" category feature.
-
- * C/usage-calendar.sgml: Spellcheck. Fixed wording, event overlap
- description.
-
- * C/evolution-guide.sgml: Spellcheck. Commented out Notes
- entities.
-
- * C/usage-notes.sgml: Spellchecked, then decided to comment out
- this file/chapter and all references to it, since it's unlikely to
- be implemented any time soon.
-
- * C/config-setupassist.sgml: Spellcheck. Other minor updates. May
- need more work in the near future.
-
- * C/usage-sync.sgml: Now it's really short. And spelled correctly.
-
-2000-10-03 Aaron Weber <aaron@helixcode.com>
-
- * C/config-prefs.sgml: Mostly spelling. Still needs major
- alteration.
-
- * C/menuref.sgml: s/Appintment/Appointment, fixed small errors,
- ran spellcheck. Still needs lots of work, since many menus have
- changed.
-
- * C/apx-gloss.sgml: Added Virus, Protocol, fixed vFolder,
- spellchecked.
-
-2000-09-26 Aaron Weber <aaron@helixcode.com>
-
- * C/apx-gloss.sgml: Added sendmail and SMTP.
-
-2000-09-22 Aaron Weber <aaron@helixcode.com>
-
- * C/menuref.sgml: Changed to reflect new menu layout.
-
- * C/usage-mainwindow.sgml: Changed to reflect new menu
- layout. Again.
-
- * C/usage-contact.sgml: Stop and Display All features.
-
-2000-09-21 Aaron Weber <aaron@helixcode.com>
-
- * C/evolution-guide.sgml: Switched to the "official" FSF markup.
- I will have to make changes to the markup-- adding ids, etc, or
- switch to another version of the markup. Pending discussion by
- GDP.
-
- * C/apx-authors.sgml: Changed Matt Loper's email address to
- loper.org; added Jeff Stedfast and Peter Williams to authors list,
- realphebetized.
-
- * C/config-prefs.sgml: Revision to reflect current options
- labelling.
-
- * C/evolution-guide.sgml: Changes to part intros.
-
- * C/preface.sgml: Spelling and menu fixes. Will need more work
- tomorrow.
-
-2000-09-20 Aaron Weber <aaron@helixcode.com>
-
- * C/config-prefs.sgml: Fixed sig stuff here and in setupassist.
-
- * C/config-sync.sgml: Fixed description of conduit usage.
-
-2000-09-18 Aaron Weber <aaron@helixcode.com>
-
- * C/preface.sgml: Spelling fixes, etc.
-
-2000-09-19 Federico Mena Quintero <federico@helixcode.com>
-
- * C/Makefile.am: Fixed to install the stylesheet-images as well.
-
-2000-09-07 Aaron Weber <aaron@helixcode.com>
-
- * C/fig/ New files: contact-editor.png, mail-composer.png,
- filter-assist-fig.png, mail-inbox.png
-
-2000-09-07 Aaron Weber <aaron@helixcode.com>
-
- * C/preface.sgml: Redid "soft" intro stuff.
-
- * C/evolution-guide.sgml: Accidentally broke docs, now valid.
-
-2000-09-06 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: Editing, proofing.
-
-2000-09-05 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: Grammar, links, screenshots.
-
- * fig/* Re-took most screenshots.
-
- * C/usage-mail.sgml: Filters, proofing.
-
-2000-09-01 Aaron Weber <aaron@helixcode.com>
-
- * C/config-prefs.sgml: Added coverage of news, clarified POP/IMAP
- distinction (there's a theme to these four log entries here).
-
- * C/usage-mail.sgml: Added coverage of news.
-
- * C/config-setupassist.sgml: Revised mail sources content for
- IMAP/POP stuff.
-
- * C/apx-gloss.sgml: Added IMAP and POP.
-
-2000-08-31 Aaron Weber <aaron@helixcode.com>
-
- * C/apx-gloss.sgml: Added regular expressions to glossary.
- Explanation should be removed from other portions of the book now.
-
- * C/usage-mainwindow.sgml: Revisions, minor.
-
- * C/apx-menuref.sgml: Now named menuref.sgml, to reflect its new
- status as a part.
-
- * C/evolution-guide.sgml: Structural alterations: Menuref is now a
- part, not an appendix.
-
- * C/apx-menuref.sgml: Added contextual menus for mail.
-
- * C/preface.sgml: Added "quickref and pointers" sections. Props to
- O'Reilly for the copy of Outlook in a Nutshell which gave me the
- idea.
-
-2000-08-30 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mainwindow.sgml: Minor fixes.
-
- * C/preface.sgml: Corrected grammar, added glossterms, described
- menuref.
-
-2000-08-25 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: Redid filter and vFolder assistant
- descriptions.
-
- * C/fig/filter-new-fig.png: Replaced with new assistant pic.
-
- * C/fig/filter-assist-fig.png: New file, showing only assistant.
-
-
- * C/apx-menuref.sgml: Finished message composer and calendar
- editor menus. Looked at Contact Editor menus and decided to
- document those features after implementation.
-
-2000-08-24 Aaron Weber <aaron@helixcode.com>
-
- * C/apx-menuref.sgml: Message Composer File and Edit menus.
-
-2000-08-23 Aaron Weber <aaron@helixcode.com>
-
- * C/apx-menuref.sgml: Added editor sections.
-
- * C/evolution-guide.sgml: Included Menu Reference Appendix.
-
-2000-08-22 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: Minor markup changes.
-
- * C/apx-menuref.sgml: New File. Menu Reference. Still needs much
- work, but not bad for an evening.
-
-2000-08-21 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: Kevin's diff applied, with minor changes.
-
-2000-08-09 Aaron Weber <aaron@helixcode.com>
-
- * C/evolution-guide.sgml: Fixed bugs in validation. Went home to
- sleep.
-
- * C/usage-mainwindow.sgml: Redid menubar description.
-
-
- * C/config-prefs.sgml: Added coverage of folder config, requested
- that feature be transferred to config section. Switched to
- variablelist in "Other" config section.
-
- * C/usage-mail.sgml: Added coverage of right-click on messages,
- threaded-view.
-
- * C/usage-mainwindow.sgml: Right-click on folder menu reinstated.
-
-2000-08-07 Aaron Weber <aaron@helixcode.com>
-
- * C/config-prefs.sgml: Added news server coverage. Other config
- proofing changes.
-
-
-2000-08-05 Aaron Weber <aaron@helixcode.com>
-
- * C/apx-gpl.sgml: New file. Contains contents of "COPYING", but
- marked up (probably not very well, but valid) as docbook
- (SGML).
-
- * C/evolution-guide.sgml: Subtle change to the legal notice:
- distinguished manual license from software license. Linked to
- apx-gpl.sgml above.
-
- * C/usage-calendar.sgml: I redid all the usage files.
-
-2000-07-21 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: Added password remembering/forgetting
- feature.
-
- * C/config-prefs.sgml: Mostly moved to variablelists, a few
- language changes.
-
- * C/config-setupassist.sgml: Minor changes to formatting, wording.
-
- * C/usage-notes.sgml: Changed trademark references, other minor
- changes.
-
- * C/usage-calendar.sgml: Minor fixes, added additional calendar
- section, removed references to unimplemented features. Spellcheck,
- prep for 0.3 release.
-
-2000-07-19 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mail.sgml: lots of minor fixes to language. added
- desc. of clahey's cool button-address thing.
-
- * C/usage-mainwindow.sgml: fixed itemizedlists, ch. to shortcut
- bar & folder descs, removed refs to trash.
-
-2000-07-18 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: Altered category addition stuff, plus
- suggestions from Kevin.
-
- * C/apx-gloss.sgml: Added ldap and signature definitions (from
- Kevin).
-
- * C/usage-mail.sgml: Move to variablelists from itemizedlists.
-
-2000-07-14 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: moved to variablelists from itemizedlists
- * C/usage-calendar.sgml: moved to variablelists from itemizedlists
-
-2000-06-29 Aaron Weber <aaron@helixcode.com>
-
- * C/preface.sgml: Minor fixes.
-
- * C/usage-notes.sgml: New File for feature that is yet to come.
- * C/evolution-guide.sgml: Added entity for notes chapter.
- * C/usage-mainwindow.sgml: Un-commented references to notes section.
-
- * C/apx-authors.sgml: Removed dcm from author list.
-
- * C/usage-calendar.sgml: Added to-do list features.
-
-2000-06-28 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: commented out future features; redid
- contact editor stuff.
-
- * C/apx-gloss.sgml: Removed "live doc" and added "minicard"
-
-2000-06-27 Aaron Weber <aaron@helixcode.com>
-
- * C/devel-action.sgml: Removed file.
- * C/devel-script.sgml: Same.
- * C/devel-component.sgml: Same.
- * C/preface.sgml: Removed references to devel section.
- * C/evolution-guide.sgml: Removed references to devel section.
-
-2000-06-23 Aaron Weber <aaron@helixcode.com>
-
- * C/evolution-guide.sgml: Made moderate to major stylistic updates
- to this, apx-gloss.sgml, and to all files beginning with "usage,"
- especially wrt HTML mail.
-
-
-2000-06-15 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: Category stuff improved.
-
- * C/usage-calendar.sgml: Now covers how to add an event properly.
-
-2000-07-17 Federico Mena Quintero <federico@helixcode.com>
-
- * Makefile.am (SUBDIRS): Added the devel directory.
-
-2000-06-28 Peter Williams <peterw@curious-george.helixcode.com>
-
- * C/Makefile.am (SGML_FILES): Don't depend on the newly-removed
- devel-*.sgml files.
-
-2000-06-16 Damon Chaplin <damon@helixcode.com>
-
- * C/.cvsignore: added evolution-guide and evolution-guide.junk
- so we don't get the '? doc/C/evolution-guide' messages each time we
- do a cvs update.
-
-2000-06-14 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-mainwindow.sgml: added sect on menubar, other minor changes.
-
- * C/usage-mail.sgml: Improved filter and vfolder
- description, and some minor changes from me and Kevin.
-
-2000-06-07 Aaron Weber <aaron@helixcode.com>
-
- * C/config-prefs.sgml: finished adding calendar prefs. screenshots.
- * C/fig/config-cal.png: new file (screenshot for above)
- * C/fig/config-mail.png: same
-
-2000-06-05 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-calendar.sgml: Incorporated chgs from Kevin.
-
- * C/config-prefs.sgml: began total overhaul of structure and added
- content reflecting new prefs items. needs LOTS more work.
-
- * C/usage-mail.sgml: changed some references to id's in the
- config-prefs section.
-
- * C/fig/config-mail.png: changed filename from config-prefs.png
-
-2000-06-01 Aaron Weber <aaron@helixcode.com>
-
- * C/config-prefs.sgml: filename was wrong, altered.
-
- * C/usage-mail.sgml: improved filter instructions, vFolder
- instructions. still need work though.
-
-
- * C/usage-contact.sgml: added screenshot.
-
- * C/usage-calendar.sgml: added screenshot.
-
- * C/config-prefs.sgml: added screenshots, and now describes the
- actual prefs dialogs.
-
- * C/fig/config-camel.png: new (screenshot) file
- * C/fig/filter-druid.png: same
- * C/fig/vfolder-druid.png: same
- * C/fig/calendar.png: same
- * C/fig/contact.png: same
- * C/fig/vfolder-createrule-fig.png: same
- * C/fig/filter-new-fig.png: same
- * C/fig/config-camel.png: same
-
-2000-06-01 Dan Winship <danw@helixcode.com>
-
- * Makefile.am: recurse into the C directory
-
- * C/Makefile.am: Rules to build and install the docs. Mostly
- stolen from gnomecal. Only works if you have GDP stuff
- (http://www.gnome.org/gdp/) set up on your machine, but won't make
- the build fail if you don't.
-
-2000-05-29 Aaron Weber <aaron@helixcode.com>
-
- * C/usage-contact.sgml: incorporated kevins notes.
- * C/usage-mainwindow.sgml: incorporated kevins notes.
-
-2000-05-27 Aaron Weber <aaron@helixcode.com>
-
- * C/evolution-guide.sgml: added Kevin Breit to author and
- copyright.
-
- * C/apx-authors.sgml: Put app authors in a simplelist.
-
- * C/usage-mail.sgml: Removed USAGE-SETUP insertion, added xref to send
- users to config-setupassist chapter. This and the following changes
- take setup druid coverage out of usage
- section and put it in config section.
- * C/config-setupassist.sgml: Added mail druid coverage from
- usage-setup.sgml.
- * C/usage-setup.sgml: Removed file. contents in
- config-setupassist.sgml.
- * C/evolution-guide.sgml: Removed
- USAGE-SETUP entity (and file usage-setup.sgml.)
-
-
-2000-05-26 Aaron Weber <aaron@helixcode.com>
-
- * C/fig/mainwindow-pic.png: new file
- * C/fig/mail-druid-pic.png: new file
- * C/fig: New directory, for figure graphics.
-
- * C/apx-gloss.sgml: new file. glossary. thx. to kevin from chicago.
-
- * C/usage-setup.sgml: More accurate description of druid, and
- moved to mail section-- see usage-mail.sgml entry. This is a new
- location for this entity, and it may move more later.
-
-
- * C/usage-mainwindow.sgml: altered description of starting
- evolution. added screenshot for main-window picture.
-
- * C/usage-mail.sgml: added screenshots, added coverage of setup
- druid and put it into get-and-send section, which is probably not
- where it should stay. Also started filter druid coverage and
- clarified examples, esp. in Bcc: section.
-
- * C/usage-contact.sgml: Clarified examples.
-
- * C/preface.sgml: rewording of "what is" and "about book" sections.
-
- * C/evolution-guide.sgml: added glossary entity APX-GLOSS, altered
- phrasing in part intros, changed order of Setup-assistant section.
-
- * C/config-prefs.sgml: changed wording, removed ref. to re-running
- setup assistant.
-
-2000-05-18 Aaron Weber <aaron@helixcode.com>
-
- * C/evo_book_0.1.sgml: removed.
-
- * C/apx-authors.sgml: new file.
- * C/apx-bugs.sgml: same.
- * C/apx-fdl.sgml: same.
- * C/config-prefs.sgml: same.
- * C/config-setupassist.sgml: same.
- * C/config-sync.sgml: same.
- * C/devel-action.sgml: same.
- * C/devel-component.sgml: same.
- * C/devel-script.sgml: same.
- * C/evolution-guide.sgml: same.
- * C/preface.sgml: same.
- * C/usage-calendar.sgml: same.
- * C/usage-contact.sgml: same.
- * C/usage-mail.sgml: same.
- * C/usage-mainwindow.sgml: same.
- * C/usage-setup.sgml: same.
- * C/usage-sync.sgml: same.
-
-2000-05-07 Dan Winship <danw@helixcode.com>
-
- * Camel-Classes: sync
-
-2000-04-16 Aaron Weber <aaron@helixcode.com>
-
- * C/evo_book_0.1.sgml: new file (doc sgml)
-
- * C/ : New directory for doc sgml & graphics
-
-2000-03-05 Christopher James Lahey <clahey@helixcode.com>
-
- * white-papers/widgets/e-table.sgml: Added Miguel to the author
- list for ETable.
-
-2000-03-03 Christopher James Lahey <clahey@helixcode.com>
-
- * white-papers/widgets/, white-papers/widgets/e-table.sgml: New
- doc for the ETable widget.
-
- * ChangeLog: Created a ChangeLog file for the docs file and
- integrated the individual ChangeLogs.
-
-2000-03-01 Dan Winship <danw@helixcode.com>
-
- * ibex.sgml: Ibex white paper
-
-2000-02-29 Federico Mena Quintero <federico@helixcode.com>
-
- * calendar.sgml: Sections for the calendar user agent and the
- calendar client library.
-
-2000-02-29 Dan Winship <danw@helixcode.com>
-
- * camel.sgml: Reorg a bit more, make the <PRE> section narrower,
- add more references to graphics (the graphics themselves are
- still in beta), add a section on CamelStream.
-
-2000-02-28 Federico Mena Quintero <federico@helixcode.com>
-
- * calendar.sgml: Section for the personal calendar server.
-
-2000-02-28 Dan Winship <danw@helixcode.com>
-
- * camel.sgml: add Bertrand to authors, edit his additions
-
-2000-02-28 bertrand <bertrand@helixcode.com>
-
- * camel.sgml: add a blurb about camel offering
- uniform interface. needs style and grammar corrections.
- Talk about virtual folders.
- Talk about lightweight messages
- Talk about IMAP.
-
-2000-02-28 Dan Winship <danw@helixcode.com>
-
- * camel.sgml: Beginnings of a Camel white paper
-
-2000-02-25 Federico Mena Quintero <federico@helixcode.com>
-
- * calendar.sgml: New file for the Evolution calendaring white paper.
diff --git a/help/Makefile.am b/help/Makefile.am
deleted file mode 100644
index d2c2869942..0000000000
--- a/help/Makefile.am
+++ /dev/null
@@ -1,8 +0,0 @@
-SUBDIRS = \
- C \
- quickref
-
-EXTRA_DIST = \
- ChangeLog.pre-1-4 \
- xmldocs.make \
- omf.make
diff --git a/help/README_Translations b/help/README_Translations
deleted file mode 100644
index cc02f1aa5e..0000000000
--- a/help/README_Translations
+++ /dev/null
@@ -1,46 +0,0 @@
-The translations for evolution-guide should be placed in
-evolution/doc/<LANG_CODE>
-
-In this directory you'll find two scripts.
- - update_po.pl -- Usage: ./update_po.pl <LANG_CODE>
- Takes the sgml files from the C directory and creates sgml.po files
- in a directory called <LANG_CODE>.po
- You should translate this files as you would any other .po file, but
- you have to make sure you place all tags and don't miss anyone.
-
- - update_translation.pl -- Usage: ./update_translation.pl <LANG_CODE>
- Takes the sgml files from the C directory, the sgml.po files from
- the <LANG_CODE>.po directory and creates the translated sgml files
- and places them on the <LANG_CODE> directory.
- If a paragraph it is not translated the originial paragraph in
- english is used instead (fuzzy paragraph are considered as
- translated for the moment). Doing it this way you can make sure
- you didn't miss any sgml tag on the .po files by compiling the
- evolution guide.
-
-Of course, translations can be done as usual translating the .sgml files
-directly. But let me point out a few advantages of doing it this way.
-
-* You can start translating the guide as soon as you want. Doesn't matter
- if the original files changes. No more waiting for the docu to be called
- stable.
-
-* When a paragraph changes, it is marked as fuzzy, so you don't have to be
- playing with diff to find out if the original sgml file changed and where.
-
-* You don't need to keep several copies of the sgml files (usually you have
- to keep a copy of the file you are translating and an up-to-date copy to
- be able to do a diff, to find out the changes)
-
-
-If you want to make any modification to my scripts, please let me know
-before you do so and send me an explanation of the changes you want to
-make (this is only for learning purposes, I allways like to know how to
-make a better script) Of course, the scripts are under GPL, so you can do
-with them allmost anything you want.
-If you want to use this scripts in any other project different from the
-evolution guide translation, please let me know (just to make me fell good
-because people is using something I wrote ;-) )
-
-
-Héctor García Álvarez <hector@scouts-es.org>
diff --git a/help/devel/executive-summary/evolution-services.hierarchy b/help/devel/executive-summary/evolution-services.hierarchy
deleted file mode 100644
index 37559d819d..0000000000
--- a/help/devel/executive-summary/evolution-services.hierarchy
+++ /dev/null
@@ -1,7 +0,0 @@
-GtkObject
- BonoboObject
- ExecutiveSummaryComponent
- ExecutiveSummaryComponentFactory
- Handle to remote Bonobo::Unknown
- ExecutiveSummaryComponentFactoryClient
- ExecutiveSummaryHtmlView
diff --git a/help/devel/importer/evolution-shell-importer.hierarchy b/help/devel/importer/evolution-shell-importer.hierarchy
deleted file mode 100644
index c46ebdf782..0000000000
--- a/help/devel/importer/evolution-shell-importer.hierarchy
+++ /dev/null
@@ -1,7 +0,0 @@
-GtkObject
- BonoboObject
- BonoboXObject
- EvolutionImporter
- EvolutionImporterListener
- Handle to remote Bonobo::Unknown
- EvolutionImporterClient
diff --git a/help/es/ChangeLog b/help/es/ChangeLog
deleted file mode 100644
index 46ffc8035b..0000000000
--- a/help/es/ChangeLog
+++ /dev/null
@@ -1,10 +0,0 @@
-2003-12-02 Ismael Olea <ismael@olea.org>
-
- * Updating Spanish translation into v1.4, work financed by
- Lambdaux.com.
-
-2003-08-08 Ismael Olea <ismael@olea.org>
-
- * New Spanish translation from scratch of v1.2, work financed by
- Lambdaux.com.
-
diff --git a/help/es/Makefile.am b/help/es/Makefile.am
deleted file mode 100644
index 2b72599994..0000000000
--- a/help/es/Makefile.am
+++ /dev/null
@@ -1,27 +0,0 @@
-figdir = figures
-docname = evolution-1.4
-lang = es
-omffile = evolution-1.4-es.omf
-entities = \
- apx-authors.xml \
- apx-bugs.xml \
- apx-fdl.xml \
- apx-gloss.xml \
- apx-gpl.xml \
- config-prefs.xml \
- config-sync.xml \
- legal.xml \
- menuref.xml \
- preface.xml \
- usage-calendar.xml \
- usage-contact.xml \
- usage-exec-summary.xml \
- usage-exchange.xml \
- usage-mail-org.xml \
- usage-mail.xml \
- usage-mainwindow.xml \
- usage-print.xml \
- usage-sync.xml
-
-include $(top_srcdir)/help/xmldocs.make
-dist-hook: app-dist-hook
diff --git a/help/es/README b/help/es/README
deleted file mode 100644
index 2f000b4bbd..0000000000
--- a/help/es/README
+++ /dev/null
@@ -1,3 +0,0 @@
-
- Added the translation memory EN-ES of the Evo manual for the v1.4:
- evolution-doc-1.4.po \ No newline at end of file
diff --git a/help/es/apx-authors.xml b/help/es/apx-authors.xml
deleted file mode 100644
index 6a9eb52697..0000000000
--- a/help/es/apx-authors.xml
+++ /dev/null
@@ -1,77 +0,0 @@
- <appendix id="authors">
- <title
->Autores</title>
- <para
-> <application
->Evolution</application
-> ha sido creado por el equipo Ximian Evolution y otros muchos programadores dedicados a GNOME. Para ver sus nombres, seleccione <menuchoice
-> <guimenu
->Ayuda</guimenu
-> <guimenuitem
->Acerca de</guimenuitem
-> </menuchoice
-> en cualquiera de las ventanas de Evolution. </para>
- <para
-> El código de <application
->Evolution</application
-> mantiene una gran deuda con las aplicaciones <application
->GNOME-pim</application
-> y <application
->GNOME-Calendar</application
->, así como con <application
->KHTMLW</application
->. Los desarrolladores de <application
->Evolution</application
-> reconocen los esfuerzos y contribuciones de todos los que trabajaron en estos proyectos. </para>
-
- <para
-> Ximian quiere agradecer a todos los que ayudaron en el proceso de depuración de errores del programa, en particular a Miles Lane y al personal de El Pelon Taqueria, en la calle Peterborough, en Boston, por el sustento. </para>
-
- <para
-> Para obtener más información visite por favor la <ulink url="http://www.ximian.com/products/ximian_evolution/" type="http"
->página web</ulink
-> de <application
->Evolution</application
->. Por favor envíenos todos sus comentarios, sugerencias e informes de error a la <ulink url="http://bugzilla.ximian.com" type="http"
->base de datos de partes de Ximian</ulink
->. Encontrará instrucciones sobre cómo se hace en esa misma dirección. También puede utilizar la herramienta de información de errores de GNOME <command
->bug-buddy</command
-> para enviar notificaciones de fallos. </para>
- <para
-> Este manual ha sido escrito por Aaron Weber (<email
->aaron@ximian.com</email
->), Kevin Breit (<email
->mrproper@ximian.com</email
->) Duncan Mak (<email
->duncan@ximian.com</email
->) y Ettore Perazzoli (<email
->ettore@ximian.com</email
->) con la ayuda de los programadores de la aplicación y del Proyecto de Documentación de GNOME. Gracias especialmente a Baris Cicek por la revisión del texto. </para>
- <para
-> Puede enviar comentarios y sugerencias acerca de este manual como partes en el sistema de gestión de partes de Ximian. Si ha contribuido a este proyecto pero no ve su nombre aquí, diríjase a Aaron Weber (<email
->aaron@ximian.com</email
->) y el le añadirá. </para>
- <para
-> Lista parcial de todos los traductores de la documentación (la aplicación está traducida a otras 36 lenguas adicionales): <itemizedlist
-> <listitem
-><para
-> Daniel Persson al sueco. </para
-></listitem
-> <listitem
-><para
-> Héctor García Ãlvarez al español. </para
-></listitem
-> <listitem
-><para
-> Kjartan Maraas al noruego. </para
-></listitem
-> </itemizedlist
-> </para
->
- </appendix>
-
-
-
-
-
-
diff --git a/help/es/apx-bugs.xml b/help/es/apx-bugs.xml
deleted file mode 100644
index 9ad56dcf53..0000000000
--- a/help/es/apx-bugs.xml
+++ /dev/null
@@ -1,28 +0,0 @@
- <appendix id="bugs">
-
- <title
->Fallos conocidos y limitaciones</title>
- <abstract>
- <para
-> El control de calidad de Ximian Evolution se realiza desde la <ulink url="http://bugzilla.ximian.com"
->base de datos de partes de Ximian</ulink
->. Si encuentra algún defecto o si quiere sugerir alguna nueva funcionalidad puede utilizarla o bien optar por la <application
->herramienta de información de errores</application
-> de GNOME (conocida como <command
->bug-buddy</command
-> en la línea de órdenes). </para>
- <para
-> Si necesita ayuda adicional sobre Ximian Evolution, visite la web de asistencia técnica en <ulink url="http://support.ximian.com"
->support.ximian.com</ulink
->. </para>
- </abstract>
-
-
- <para
-> En la web tiene disponible una lista completa de solicitudes de características y otros asuntos en la base de datos de partes de Ximian. Puede aprender más sobre el proceso de desarrollo de Ximian Evolution en <ulink url="http://developer.ximian.com"
->developer.ximian.com</ulink
->. </para>
-
-</appendix>
-
-
diff --git a/help/es/apx-fdl.xml b/help/es/apx-fdl.xml
deleted file mode 100644
index 4af2a495fa..0000000000
--- a/help/es/apx-fdl.xml
+++ /dev/null
@@ -1,667 +0,0 @@
-<!--
- The GNU Free Documentation License 1.1 in DocBook
- Markup by Eric Baudais <baudais@okstate.edu>
- Maintained by the GNOME Documentation Project
- http://developer.gnome.org/projects/gdp
- Version: 1.0.1
- Last Modified: Nov 16, 2000
--->
-
-<appendix id="apx-fdl">
- <appendixinfo>
- <releaseinfo>
- Version 1.1, March 2000
- </releaseinfo>
- <copyright>
- <year>2000</year><holder>Free Software Foundation, Inc.</holder>
- </copyright>
- <legalnotice id="fdl-legalnotice">
- <para>
- <address>Free Software Foundation, Inc. <street>59 Temple Place,
- Suite 330</street>, <city>Boston</city>, <state>MA</state>
- <postcode>02111-1307</postcode> <country>USA</country></address>
- Everyone is permitted to copy and distribute verbatim copies of this
- license document, but changing it is not allowed.
- </para>
- </legalnotice>
- </appendixinfo>
- <title>GNU Free Documentation License</title>
-
- <sect1 id="fdl-preamble">
- <title>0. PREAMBLE</title>
- <para>
- The purpose of this License is to make a manual, textbook, or
- other written document <quote>free</quote> in the sense of
- freedom: to assure everyone the effective freedom to copy and
- redistribute it, with or without modifying it, either
- commercially or noncommercially. Secondarily, this License
- preserves for the author and publisher a way to get credit for
- their work, while not being considered responsible for
- modifications made by others.
- </para>
-
- <para>
- This License is a kind of <quote>copyleft</quote>, which means
- that derivative works of the document must themselves be free in
- the same sense. It complements the GNU General Public License,
- which is a copyleft license designed for free software.
- </para>
-
- <para>
- We have designed this License in order to use it for manuals for
- free software, because free software needs free documentation: a
- free program should come with manuals providing the same
- freedoms that the software does. But this License is not limited
- to software manuals; it can be used for any textual work,
- regardless of subject matter or whether it is published as a
- printed book. We recommend this License principally for works
- whose purpose is instruction or reference.
- </para>
- </sect1>
- <sect1 id="fdl-section1">
- <title>1. APPLICABILITY AND DEFINITIONS</title>
- <para id="fdl-document">
- This License applies to any manual or other work that contains a
- notice placed by the copyright holder saying it can be
- distributed under the terms of this License. The
- <quote>Document</quote>, below, refers to any such manual or
- work. Any member of the public is a licensee, and is addressed
- as <quote>you</quote>.
- </para>
-
- <para id="fdl-modified">
- A <quote>Modified Version</quote> of the Document means any work
- containing the Document or a portion of it, either copied
- verbatim, or with modifications and/or translated into another
- language.
- </para>
-
- <para id="fdl-secondary">
- A <quote>Secondary Section</quote> is a named appendix or a
- front-matter section of the <link
- linkend="fdl-document">Document</link> that deals exclusively
- with the relationship of the publishers or authors of the
- Document to the Document's overall subject (or to related
- matters) and contains nothing that could fall directly within
- that overall subject. (For example, if the Document is in part a
- textbook of mathematics, a Secondary Section may not explain any
- mathematics.) The relationship could be a matter of historical
- connection with the subject or with related matters, or of
- legal, commercial, philosophical, ethical or political position
- regarding them.
- </para>
-
- <para id="fdl-invariant">
- The <quote>Invariant Sections</quote> are certain <link
- linkend="fdl-secondary"> Secondary Sections</link> whose titles
- are designated, as being those of Invariant Sections, in the
- notice that says that the <link
- linkend="fdl-document">Document</link> is released under this
- License.
- </para>
-
- <para id="fdl-cover-texts">
- The <quote>Cover Texts</quote> are certain short passages of
- text that are listed, as Front-Cover Texts or Back-Cover Texts,
- in the notice that says that the <link
- linkend="fdl-document">Document</link> is released under this
- License.
- </para>
-
- <para id="fdl-transparent">
- A <quote>Transparent</quote> copy of the <link
- linkend="fdl-document"> Document</link> means a machine-readable
- copy, represented in a format whose specification is available
- to the general public, whose contents can be viewed and edited
- directly and straightforwardly with generic text editors or (for
- images composed of pixels) generic paint programs or (for
- drawings) some widely available drawing editor, and that is
- suitable for input to text formatters or for automatic
- translation to a variety of formats suitable for input to text
- formatters. A copy made in an otherwise Transparent file format
- whose markup has been designed to thwart or discourage
- subsequent modification by readers is not Transparent. A copy
- that is not <quote>Transparent</quote> is called
- <quote>Opaque</quote>.
- </para>
-
- <para>
- Examples of suitable formats for Transparent copies include
- plain ASCII without markup, Texinfo input format, LaTeX input
- format, SGML or XML using a publicly available DTD, and
- standard-conforming simple HTML designed for human
- modification. Opaque formats include PostScript, PDF,
- proprietary formats that can be read and edited only by
- proprietary word processors, SGML or XML for which the DTD
- and/or processing tools are not generally available, and the
- machine-generated HTML produced by some word processors for
- output purposes only.
- </para>
-
- <para id="fdl-title-page">
- The <quote>Title Page</quote> means, for a printed book, the
- title page itself, plus such following pages as are needed to
- hold, legibly, the material this License requires to appear in
- the title page. For works in formats which do not have any title
- page as such, <quote>Title Page</quote> means the text near the
- most prominent appearance of the work's title, preceding the
- beginning of the body of the text.
- </para>
- </sect1>
-
- <sect1 id="fdl-section2">
- <title>2. VERBATIM COPYING</title>
- <para>
- You may copy and distribute the <link
- linkend="fdl-document">Document</link> in any medium, either
- commercially or noncommercially, provided that this License, the
- copyright notices, and the license notice saying this License
- applies to the Document are reproduced in all copies, and that
- you add no other conditions whatsoever to those of this
- License. You may not use technical measures to obstruct or
- control the reading or further copying of the copies you make or
- distribute. However, you may accept compensation in exchange for
- copies. If you distribute a large enough number of copies you
- must also follow the conditions in <link
- linkend="fdl-section3">section 3</link>.
- </para>
-
- <para>
- You may also lend copies, under the same conditions stated
- above, and you may publicly display copies.
- </para>
- </sect1>
-
- <sect1 id="fdl-section3">
- <title>3. COPYING IN QUANTITY</title>
- <para>
- If you publish printed copies of the <link
- linkend="fdl-document">Document</link> numbering more than 100,
- and the Document's license notice requires <link
- linkend="fdl-cover-texts">Cover Texts</link>, you must enclose
- the copies in covers that carry, clearly and legibly, all these
- Cover Texts: Front-Cover Texts on the front cover, and
- Back-Cover Texts on the back cover. Both covers must also
- clearly and legibly identify you as the publisher of these
- copies. The front cover must present the full title with all
- words of the title equally prominent and visible. You may add
- other material on the covers in addition. Copying with changes
- limited to the covers, as long as they preserve the title of the
- <link linkend="fdl-document">Document</link> and satisfy these
- conditions, can be treated as verbatim copying in other
- respects.
- </para>
-
- <para>
- If the required texts for either cover are too voluminous to fit
- legibly, you should put the first ones listed (as many as fit
- reasonably) on the actual cover, and continue the rest onto
- adjacent pages.
- </para>
-
- <para>
- If you publish or distribute <link
- linkend="fdl-transparent">Opaque</link> copies of the <link
- linkend="fdl-document">Document</link> numbering more than 100,
- you must either include a machine-readable <link
- linkend="fdl-transparent">Transparent</link> copy along with
- each Opaque copy, or state in or with each Opaque copy a
- publicly-accessible computer-network location containing a
- complete Transparent copy of the Document, free of added
- material, which the general network-using public has access to
- download anonymously at no charge using public-standard network
- protocols. If you use the latter option, you must take
- reasonably prudent steps, when you begin distribution of Opaque
- copies in quantity, to ensure that this Transparent copy will
- remain thus accessible at the stated location until at least one
- year after the last time you distribute an Opaque copy (directly
- or through your agents or retailers) of that edition to the
- public.
- </para>
-
- <para>
- It is requested, but not required, that you contact the authors
- of the <link linkend="fdl-document">Document</link> well before
- redistributing any large number of copies, to give them a chance
- to provide you with an updated version of the Document.
- </para>
- </sect1>
-
- <sect1 id="fdl-section4">
- <title>4. MODIFICATIONS</title>
- <para>
- You may copy and distribute a <link
- linkend="fdl-modified">Modified Version</link> of the <link
- linkend="fdl-document">Document</link> under the conditions of
- sections <link linkend="fdl-section2">2</link> and <link
- linkend="fdl-section3">3</link> above, provided that you release
- the Modified Version under precisely this License, with the
- Modified Version filling the role of the Document, thus
- licensing distribution and modification of the Modified Version
- to whoever possesses a copy of it. In addition, you must do
- these things in the Modified Version:
- </para>
-
- <itemizedlist mark="opencircle">
- <listitem>
- <formalpara>
- <title>A</title>
- <para>
- Use in the <link linkend="fdl-title-page">Title
- Page</link> (and on the covers, if any) a title distinct
- from that of the <link
- linkend="fdl-document">Document</link>, and from those of
- previous versions (which should, if there were any, be
- listed in the History section of the Document). You may
- use the same title as a previous version if the original
- publisher of that version gives permission.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>B</title>
- <para>
- List on the <link linkend="fdl-title-page">Title
- Page</link>, as authors, one or more persons or entities
- responsible for authorship of the modifications in the
- <link linkend="fdl-modified">Modified Version</link>,
- together with at least five of the principal authors of
- the <link linkend="fdl-document">Document</link> (all of
- its principal authors, if it has less than five).
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>C</title>
- <para>
- State on the <link linkend="fdl-title-page">Title
- Page</link> the name of the publisher of the <link
- linkend="fdl-modified">Modified Version</link>, as the
- publisher.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>D</title>
- <para>
- Preserve all the copyright notices of the <link
- linkend="fdl-document">Document</link>.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>E</title>
- <para>
- Add an appropriate copyright notice for your modifications
- adjacent to the other copyright notices.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>F</title>
- <para>
- Include, immediately after the copyright notices, a
- license notice giving the public permission to use the
- <link linkend="fdl-modified">Modified Version</link> under
- the terms of this License, in the form shown in the
- Addendum below.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>G</title>
- <para>
- Preserve in that license notice the full lists of <link
- linkend="fdl-invariant"> Invariant Sections</link> and
- required <link linkend="fdl-cover-texts">Cover
- Texts</link> given in the <link
- linkend="fdl-document">Document's</link> license notice.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>H</title>
- <para>
- Include an unaltered copy of this License.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>I</title>
- <para>
- Preserve the section entitled <quote>History</quote>, and
- its title, and add to it an item stating at least the
- title, year, new authors, and publisher of the <link
- linkend="fdl-modified">Modified Version </link>as given on
- the <link linkend="fdl-title-page">Title Page</link>. If
- there is no section entitled <quote>History</quote> in the
- <link linkend="fdl-document">Document</link>, create one
- stating the title, year, authors, and publisher of the
- Document as given on its Title Page, then add an item
- describing the Modified Version as stated in the previous
- sentence.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>J</title>
- <para>
- Preserve the network location, if any, given in the <link
- linkend="fdl-document">Document</link> for public access
- to a <link linkend="fdl-transparent">Transparent</link>
- copy of the Document, and likewise the network locations
- given in the Document for previous versions it was based
- on. These may be placed in the <quote>History</quote>
- section. You may omit a network location for a work that
- was published at least four years before the Document
- itself, or if the original publisher of the version it
- refers to gives permission.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>K</title>
- <para>
- In any section entitled <quote>Acknowledgements</quote> or
- <quote>Dedications</quote>, preserve the section's title,
- and preserve in the section all the substance and tone of
- each of the contributor acknowledgements and/or
- dedications given therein.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>L</title>
- <para>
- Preserve all the <link linkend="fdl-invariant">Invariant
- Sections</link> of the <link
- linkend="fdl-document">Document</link>, unaltered in their
- text and in their titles. Section numbers or the
- equivalent are not considered part of the section titles.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>M</title>
- <para>
- Delete any section entitled
- <quote>Endorsements</quote>. Such a section may not be
- included in the <link linkend="fdl-modified">Modified
- Version</link>.
- </para>
- </formalpara>
- </listitem>
-
- <listitem>
- <formalpara>
- <title>N</title>
- <para>
- Do not retitle any existing section as
- <quote>Endorsements</quote> or to conflict in title with
- any <link linkend="fdl-invariant">Invariant
- Section</link>.
- </para>
- </formalpara>
- </listitem>
- </itemizedlist>
-
- <para>
- If the <link linkend="fdl-modified">Modified Version</link>
- includes new front-matter sections or appendices that qualify as
- <link linkend="fdl-secondary">Secondary Sections</link> and
- contain no material copied from the Document, you may at your
- option designate some or all of these sections as invariant. To
- do this, add their titles to the list of <link
- linkend="fdl-invariant">Invariant Sections</link> in the
- Modified Version's license notice. These titles must be
- distinct from any other section titles.
- </para>
-
- <para>
- You may add a section entitled <quote>Endorsements</quote>,
- provided it contains nothing but endorsements of your <link
- linkend="fdl-modified">Modified Version</link> by various
- parties--for example, statements of peer review or that the text
- has been approved by an organization as the authoritative
- definition of a standard.
- </para>
-
- <para>
- You may add a passage of up to five words as a <link
- linkend="fdl-cover-texts">Front-Cover Text</link>, and a passage
- of up to 25 words as a <link
- linkend="fdl-cover-texts">Back-Cover Text</link>, to the end of
- the list of <link linkend="fdl-cover-texts">Cover Texts</link>
- in the <link linkend="fdl-modified">Modified Version</link>.
- Only one passage of Front-Cover Text and one of Back-Cover Text
- may be added by (or through arrangements made by) any one
- entity. If the <link linkend="fdl-document">Document</link>
- already includes a cover text for the same cover, previously
- added by you or by arrangement made by the same entity you are
- acting on behalf of, you may not add another; but you may
- replace the old one, on explicit permission from the previous
- publisher that added the old one.
- </para>
-
- <para>
- The author(s) and publisher(s) of the <link
- linkend="fdl-document">Document</link> do not by this License
- give permission to use their names for publicity for or to
- assert or imply endorsement of any <link
- linkend="fdl-modified">Modified Version </link>.
- </para>
- </sect1>
-
- <sect1 id="fdl-section5">
- <title>5. COMBINING DOCUMENTS</title>
- <para>
- You may combine the <link linkend="fdl-document">Document</link>
- with other documents released under this License, under the
- terms defined in <link linkend="fdl-section4">section 4</link>
- above for modified versions, provided that you include in the
- combination all of the <link linkend="fdl-invariant">Invariant
- Sections</link> of all of the original documents, unmodified,
- and list them all as Invariant Sections of your combined work in
- its license notice.
- </para>
-
- <para>
- The combined work need only contain one copy of this License,
- and multiple identical <link linkend="fdl-invariant">Invariant
- Sections</link> may be replaced with a single copy. If there are
- multiple Invariant Sections with the same name but different
- contents, make the title of each such section unique by adding
- at the end of it, in parentheses, the name of the original
- author or publisher of that section if known, or else a unique
- number. Make the same adjustment to the section titles in the
- list of Invariant Sections in the license notice of the combined
- work.
- </para>
-
- <para>
- In the combination, you must combine any sections entitled
- <quote>History</quote> in the various original documents,
- forming one section entitled <quote>History</quote>; likewise
- combine any sections entitled <quote>Acknowledgements</quote>,
- and any sections entitled <quote>Dedications</quote>. You must
- delete all sections entitled <quote>Endorsements.</quote>
- </para>
- </sect1>
-
- <sect1 id="fdl-section6">
- <title>6. COLLECTIONS OF DOCUMENTS</title>
- <para>
- You may make a collection consisting of the <link
- linkend="fdl-document">Document</link> and other documents
- released under this License, and replace the individual copies
- of this License in the various documents with a single copy that
- is included in the collection, provided that you follow the
- rules of this License for verbatim copying of each of the
- documents in all other respects.
- </para>
-
- <para>
- You may extract a single document from such a collection, and
- dispbibute it individually under this License, provided you
- insert a copy of this License into the extracted document, and
- follow this License in all other respects regarding verbatim
- copying of that document.
- </para>
- </sect1>
-
- <sect1 id="fdl-section7">
- <title>7. AGGREGATION WITH INDEPENDENT WORKS</title>
- <para>
- A compilation of the <link
- linkend="fdl-document">Document</link> or its derivatives with
- other separate and independent documents or works, in or on a
- volume of a storage or distribution medium, does not as a whole
- count as a <link linkend="fdl-modified">Modified Version</link>
- of the Document, provided no compilation copyright is claimed
- for the compilation. Such a compilation is called an
- <quote>aggregate</quote>, and this License does not apply to the
- other self-contained works thus compiled with the Document , on
- account of their being thus compiled, if they are not themselves
- derivative works of the Document. If the <link
- linkend="fdl-cover-texts">Cover Text</link> requirement of <link
- linkend="fdl-section3">section 3</link> is applicable to these
- copies of the Document, then if the Document is less than one
- quarter of the entire aggregate, the Document's Cover Texts may
- be placed on covers that surround only the Document within the
- aggregate. Otherwise they must appear on covers around the whole
- aggregate.
- </para>
- </sect1>
-
- <sect1 id="fdl-section8">
- <title>8. TRANSLATION</title>
- <para>
- Translation is considered a kind of modification, so you may
- distribute translations of the <link
- linkend="fdl-document">Document</link> under the terms of <link
- linkend="fdl-section4">section 4</link>. Replacing <link
- linkend="fdl-invariant"> Invariant Sections</link> with
- translations requires special permission from their copyright
- holders, but you may include translations of some or all
- Invariant Sections in addition to the original versions of these
- Invariant Sections. You may include a translation of this
- License provided that you also include the original English
- version of this License. In case of a disagreement between the
- translation and the original English version of this License,
- the original English version will prevail.
- </para>
- </sect1>
-
- <sect1 id="fdl-section9">
- <title>9. TERMINATION</title>
- <para>
- You may not copy, modify, sublicense, or distribute the <link
- linkend="fdl-document">Document</link> except as expressly
- provided for under this License. Any other attempt to copy,
- modify, sublicense or distribute the Document is void, and will
- automatically terminate your rights under this License. However,
- parties who have received copies, or rights, from you under this
- License will not have their licenses terminated so long as such
- parties remain in full compliance.
- </para>
- </sect1>
-
- <sect1 id="fdl-section10">
- <title>10. FUTURE REVISIONS OF THIS LICENSE</title>
- <para>
- The <ulink type="http"
- url="http://www.gnu.org/fsf/fsf.html">Free Software
- Foundation</ulink> may publish new, revised versions of the GNU
- Free Documentation 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. See <ulink
- type="http"
- url="http://www.gnu.org/copyleft">http://www.gnu.org/copyleft/</ulink>.
- </para>
-
- <para>
- Each version of the License is given a distinguishing version
- number. If the <link linkend="fdl-document">Document</link>
- specifies that a particular numbered version of this License
- <quote>or any later version</quote> applies to it, you have the
- option of following the terms and conditions either of that
- specified version or of any later version that has been
- published (not as a draft) by the Free Software Foundation. If
- the Document does not specify a version number of this License,
- you may choose any version ever published (not as a draft) by
- the Free Software Foundation.
- </para>
- </sect1>
-
- <sect1 id="fdl-using">
- <title>Addendum</title>
- <para>
- To use this License in a document you have written, include a copy of
- the License in the document and put the following copyright and
- license notices just after the title page:
- </para>
-
- <blockquote>
- <para>
- Copyright YEAR YOUR NAME.
- </para>
- <para>
- Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU Free Documentation
- License, Version 1.1 or any later version published by the
- Free Software Foundation; with the <link
- linkend="fdl-invariant">Invariant Sections</link> being LIST
- THEIR TITLES, with the <link
- linkend="fdl-cover-texts">Front-Cover Texts</link> being LIST,
- and with the <link linkend="fdl-cover-texts">Back-Cover
- Texts</link> being LIST. A copy of the license is included in
- the section entitled <quote>GNU Free Documentation
- License</quote>.
- </para>
- </blockquote>
-
- <para>
- If you have no <link linkend="fdl-invariant">Invariant
- Sections</link>, write <quote>with no Invariant Sections</quote>
- instead of saying which ones are invariant. If you have no
- <link linkend="fdl-cover-texts">Front-Cover Texts</link>, write
- <quote>no Front-Cover Texts</quote> instead of
- <quote>Front-Cover Texts being LIST</quote>; likewise for <link
- linkend="fdl-cover-texts">Back-Cover Texts</link>.
- </para>
-
- <para>
- If your document contains nontrivial examples of program code,
- we recommend releasing these examples in parallel under your
- choice of free software license, such as the <ulink type="http"
- url="http://www.gnu.org/copyleft/gpl.html"> GNU General Public
- License</ulink>, to permit their use in free software.
- </para>
- </sect1>
-</appendix>
-
-
diff --git a/help/es/apx-gloss.xml b/help/es/apx-gloss.xml
deleted file mode 100644
index b65350c962..0000000000
--- a/help/es/apx-gloss.xml
+++ /dev/null
@@ -1,184 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-
-<!-- $Id$ -->
-<!-- Traducción: Ismael -->
-<!-- Revisión: irm 030504/final 030428/rápida -->
-
-
-<glossary id="apx-gloss">
-
- <title>Glosario</title>
-
- <glossentry id="attachment"> <glossterm>Adjunto:</glossterm> <glossdef>
- <para> Cualquier archivo enviado por correo electrónico. Los adjuntos pueden estar empotrados dentro de un mensaje o anexados a él.
- </para> </glossdef> </glossentry>
-
-
- <glossentry id="search-scope"> <glossterm>Ãmbito de búsqueda:</glossterm> <glossdef>
- <para> El ámbito de búsqueda declara en qué parte de la <glossterm
- linkend="search-base">base de búsqueda</glossterm> buscar.
- </para> </glossdef> </glossentry>
-
- <glossentry id="filetree"> <glossterm>Ãrbol de archivos:</glossterm> <glossdef>
- <para> Una descripción imaginaria de los grupos de archivos del sistema. Con la perversidad típica de la nomenclatura informática (especialmente en Unix y Linux), la parte superior de ese árbol se llama el directorio raíz (<quote>root</quote>) y se indica con el carácter <filename>/</filename>. El resto de las <quote>ramas</quote> cuelgan de la raíz. No confunda el directorio raíz con la cuenta del superusuario (<quote>root</quote>) ni con el directorio de inicio del superusuario (<filename>/root</filename>).
- </para> </glossdef> </glossentry>
-
- <glossentry id="assistant"> <glossterm>Asistente:</glossterm> <glossdef>
- <para> Una herramienta que guía al usuario a través de una serie de pasos, normalmente para configurar un programa. Equivalente a un <quote>druida</quote> o un <quote>wizard</quote>.
- </para> </glossdef> </glossentry>
-
- <glossentry id="shortcut-bar"> <glossterm>Barra de atajos:</glossterm> <glossdef>
- <para> Una parte de <application>Evolution</application> que permite a los usuarios acceso rápido a las porciones más usadas de la aplicación.
- </para> </glossdef> </glossentry>
-
- <glossentry id="search-base"> <glossterm>Base de búsqueda:</glossterm> <glossdef>
- <para> LDAP puede dividir las listas de contactos en varios grupos. La base de búsqueda indica la parte superior del grupo utilizado. La opción <glossterm linkend="search-scope">ámbito de búsqueda</glossterm> indica en qué parte de la base de búsqueda se realizará esta.
- </para> </glossdef> </glossentry>
-
- <glossentry id="bcc"> <glossterm>Bcc (Copia oculta del mensaje):</glossterm> <glossdef>
- <para> Del inglés <quote lang="en">Blind Carbon Copy</quote>, una manera de asignar el destinatario de un mensaje. Permite enviar un mensaje a un grupo de destinatarios sin que ninguno pueda ver la dirección de los demás.
- </para> </glossdef> </glossentry>
-
- <glossentry id="cc"> <glossterm>Cc (Con copia):</glossterm> <glossdef>
- <para> Un método para mandar una copia del mensaje a una tercera persona, con el fin de mantenerla al tanto de la conversación, sin que pertenezca a la lista principal de destinatarios.
- </para> </glossdef> </glossentry>
-
-
- <glossentry id="public-key-encryption"> <glossterm>Cifrado de clave pública:</glossterm> <glossdef>
- <para> Un poderoso método de cifrado que usa un par de <quote>claves</quote>; una de ellas es pública y la otra es guardada en privado. Los datos cifrados con la clave pública sólo pueden ser descifrados con la clave privada. Cuanto más largas sean las claves más difícil será romper el cifrado.
- </para> </glossdef> </glossentry>
-
- <glossentry id="mail-client"> <glossterm>Cliente de correo:</glossterm> <glossdef>
- <para> Un cliente de correo es una aplicación con la que una persona lee y envía correo electrónico. Sus interlocutores son los varios tipos de servidores de correo que manejan la autenticación de usuarios y dirigen los mensajes del remitente al destinatario.
- </para> </glossdef> </glossentry>
-
- <glossentry id="conduit"> <glossterm>Conducto:</glossterm> <glossdef>
- <para> Pequeña aplicación que controla la transferencia de datos entre un PDA y su escritorio.
- </para> </glossdef> </glossentry>
-
- <glossentry id="tooltip"> <glossterm>Consejo:</glossterm> <glossdef>
- <para> Un cuadrito con texto explicativo que aparece cuando se mantiene el puntero del ratón sobre un botón u otros elementos del interfaz gráfico.
- </para> </glossdef> </glossentry>
-
- <glossentry id="druid"> <glossterm>Druida:</glossterm> <glossdef>
- <para> Ver <quote>Asistente</quote>.
- </para> </glossdef> </glossentry>
-
- <glossentry id="execute"> <glossterm>Ejecutar:</glossterm> <glossdef>
- <para> Poner en marcha un programa. A cualquier archivo que pueda ser ejecutado se le llama ejecutable. <application>Evolution</application> puede descargar adjuntos ejecutables, pero para poder ejecutarlos es preciso marcarlos antes como ejecutables en el administrador de archivos o en la línea de órdenes. Esta precaución de seguridad previene de la ejecución automática o accidental de programas maliciosos. Para obtener más información acerca de ejecutables y permisos de archivos consulte la documentación de su administrador de archivos o de su intérprete de órdenes.
- </para> </glossdef> </glossentry>
-
- <glossentry id="inline"> <glossterm>En línea:</glossterm> <glossdef>
- <para> Que se muestra empotrado, como parte de un mensaje u otro documento en lugar de estar anexo a un archivo. Alternativo a <glossterm
- linkend="attachment">Adjunto:</glossterm>.
- </para> </glossdef> </glossentry>
-
-
- <glossentry id="regular-expression"> <glossterm>Expresión regular:</glossterm> <glossdef>
- <para> Una expresión regular o <quote>regex</quote> es una manera de describir una cadena de texto mediante meta-caracteres o símbolos comodín. Por ejemplo la sentencia <userinput>fly.*so[au]p</userinput> encuentra <quote>cualquier frase que empiece por <quote>fly</quote> y acabe en <quote>soup</quote> o en <quote>soap</quote></quote>. Si hace una búsqueda con esa expresión podría encontrar tanto <quote>fly in my soup</quote> como <quote>fly in soap</quote>. No hay espacio para profundizar en el tema pero si lo desea puede examinar la documentación de la orden <command>grep</command>: para ello, abra un intérprete de órdenes y escriba <command>man grep</command>.
- </para> </glossdef> </glossentry>
-
- <glossentry id="evolution"> <glossterm>Evolution:</glossterm> <glossdef>
- <para> <application>Evolution</application> es la herramienta de trabajo en grupo de <acronym>GNOME</acronym>.
- </para> </glossdef> </glossentry>
-
- <glossentry id="filter"> <glossterm>Filtro:</glossterm> <glossdef>
- <para> En <application>Evolution</application> un filtro es un método de ordenación automática del correo cuando lo descarga de su buzón. Puede crear filtros para realizar una o más acciones sobre un mensaje que cumpla una (o todas) las condiciones, definidas entre una amplia gama de posibilidades.
- </para> </glossdef> </glossentry>
-
- <glossentry id="signature"> <glossterm>Firma:</glossterm> <glossdef>
- <para> En términos de correo electrónico la firma es un trozo de texto al pie de cada mensaje enviado, como la firma manual al pie de cada carta escrita. Una firma puede ser cualquier cosa desde una cita favorita a un enlace a una página web. La cortesía recomienda que sea menor que cuatro líneas de longitud.
- </para> </glossdef> </glossentry>
-
- <glossentry id="html"> <glossterm>HTML:</glossterm> <glossdef>
- <para> El lenguaje de marcas de hipertexto (<acronym>HTML</acronym>) se utiliza para describir páginas de documentos electrónicos como son las páginas Web, archivos de ayuda y mensajes de correo electrónico. HTML se puede utilizar en el correo y en los envíos a las <quote>news</quote> para insertar imágenes y darle formato al texto.
- </para> </glossdef> </glossentry>
-
- <glossentry id="ical"> <glossterm>iCal:</glossterm> <glossdef>
- <para> <application>iCal</application> es el programa con el que <application>Evolution</application> maneja el calendario.
- </para> </glossdef> </glossentry>
-
- <glossentry id="imap"> <glossterm>IMAP:</glossterm> <glossdef>
- <para> En función de a quién pregunte, IMAP significa protocolo de acceso al correo internet o protocolo interino de acceso a correo. Permite tener acceso al correo electrónico que normalmente (aunque no siempre) se almacena remotamente en el servidor en lugar de en el disco duro local. IMAP suele ser la alternativa a <glossterm>POP:</glossterm>. Pero nadie le va examinar de esto.
- </para> </glossdef> </glossentry>
-
-<glossentry id="automatic-indexing"> <glossterm>Indexación automática:</glossterm> <glossdef>
- <para> Procedimiento de prebúsqueda que permite a <application>Evolution</application> hacer referencia a los datos con rapidez. Permite búsquedas rápidas y disminuye el consumo de memoria al presentar de la información.
- </para> </glossdef> </glossentry>
-
-
- <glossentry id="ldap"> <glossterm>LDAP:</glossterm> <glossdef>
- <para> LDAP, el Protocolo Ligero de Acceso a Directorios, permite a un cliente buscar a través de grandes bases de datos, alojadas en un servidor, de direcciones, números de teléfono y personas.
- </para> </glossdef> </glossentry>
-
-
-
- <glossentry id="minicard"> <glossterm>Minitarjeta:</glossterm> <glossdef>
- <para> Un formato para la presentación de datos de contacto. Es similar en apariencia a una tarjeta de visita.
- </para> </glossdef> </glossentry>
-
- <glossentry id="nautilus"> <glossterm>Nautilus:</glossterm> <glossdef>
- <para> <application>Nautilus</application> es la siguiente generación de administrador de archivos de <acronym>GNOME</acronym>.
- </para> </glossdef> </glossentry>
-
- <glossentry id="pop"> <glossterm>POP:</glossterm> <glossdef>
- <para> POP, el Protocolo de Oficina Postal, es un mecanismo de transporte de correo electrónico. En contraste con IMAP sólo se usa para descargar el correo y almacenarlo localmente en el disco duro.
- </para> </glossdef> </glossentry>
-
- <glossentry id="postscript"> <glossterm>Postscript:</glossterm> <glossdef>
- <para> Un formato estándar de publicación de documentos. Muchas impresoras pueden leer Postscript puro, lo que lo hace bastante versátil.
- </para> </glossdef> </glossentry>
-
- <glossentry id="protocol"> <glossterm>Protocolo:</glossterm> <glossdef>
- <para> Un método acordado de comunicación especialmente para el envío de tipos particulares de información entre diferentes máquinas. Algunos ejemplos son POP (Protocolo de Oficina Postal) para correo electrónico y HTTP (Protocolo de Transferencia de HiperTexto) para páginas web.
- </para> </glossdef> </glossentry>
-
- <glossentry id="expunge"> <glossterm>Purgar:</glossterm> <glossdef>
- <para> Cuando los mensajes están marcados para ser borrados aún permanecen intactos hasta que son purgados. La purga de un mensaje significa eliminarlo definitivamente siempre y cuando esté marcado previamente para ello.
- </para> </glossdef> </glossentry>
-
- <glossentry id="forward"> <glossterm>Reenviar:</glossterm> <glossdef>
- <para> Si recibe un mensaje dirigido a otra persona, puede reenviarlo para que lo reciba la persona adecuada.
-
- </para> </glossdef> </glossentry>
-
- <glossentry id="sendmail"> <glossterm>Sendmail:</glossterm> <glossdef>
- <para> Como su nombre implica, <application>sendmail</application> es un programa que envía correo. <application>Evolution</application> puede utilizarlo en lugar de <glossterm>SMTP:</glossterm>. Algunas personas prefieren utilizarlo por su mayor flexibilidad pero es más difícil de configurar.
- </para> </glossdef> </glossentry>
-
- <glossentry id="smtp"> <glossterm>SMTP:</glossterm> <glossdef>
- <para> Este es el medio de transporte de mensajes de correo más común entre el sistema del cliente (el suyo) y el servidor. SMTP significa Protocolo Sencillo de Transferencia de Correo.
- </para> </glossdef> </glossentry>
-
- <glossentry id="script"> <glossterm>Script:</glossterm> <glossdef>
- <para> Un programa escrito en un lenguaje interpretado (en lugar de uno compilado). Se usa frecuentemente como sinónimo de <quote>macro</quote> para denotar a una serie de órdenes pregrabadas o acciones dentro de una aplicación. Su utilización en tareas tediosas y repetitivas puede ahorrar mucho tiempo al usuario.
- </para> </glossdef> </glossentry>
-
- <glossentry id="hot-key"> <glossterm>Tecla de acceso directo:</glossterm> <glossdef>
- <para> Las teclas de acceso directo son combinaciones de teclas que permiten realizar acciones sin utilizar el ratón. Su utilización puede mejorar la velocidad de trabajo.
- </para> </glossdef> </glossentry>
-
- <glossentry id="groupware"> <glossterm>Trabajo en grupo:</glossterm> <glossdef>
- <para> Expresión que describe una aplicación con la que grupos de personas pueden trabajar juntos. Normalmente una aplicación de trabajo en grupo incluye varias funciones de productividad integradas en un único programa: correo electrónico, calendario y gestión de contactos.
- </para> </glossdef> </glossentry>
-
- <glossentry id="vcard"> <glossterm>VCard:</glossterm> <glossdef>
- <para> Un formato de archivo para el intercambio de información de contacto. Cuando recibe una tarjeta de visita adjunta a un mensaje probablemente está en formato VCard. No debe ser confundido con <glossterm linkend="vfolder">carpeta virtual:</glossterm>.
- </para> </glossdef> </glossentry>
-
- <glossentry id="vfolder"> <glossterm>carpeta virtual:</glossterm> <glossdef>
- <para> Una herramienta de organización de correo electrónico. Las carpetas virtuales permiten crear una carpeta que contiene el resultado de una búsqueda compleja. Los contenidos de carpetas virtuales se actualizan dinámicamente.
- </para> </glossdef> </glossentry>
-
- <glossentry id="virus"> <glossterm>Virus:</glossterm> <glossdef>
- <para> Un programa que se inserta a sí mismo dentro de otros archivos o programas y que, cuando se ejecuta, se propaga a otros programas y sistemas. Un virus puede causar un daño considerable: obstrucción de redes o unidades de disco, borrado de archivos o apertura de agujeros de seguridad.
- </para> </glossdef> </glossentry>
-
-</glossary>
-
-
-
-
-
-
diff --git a/help/es/apx-gpl.xml b/help/es/apx-gpl.xml
deleted file mode 100644
index ffb4930fb0..0000000000
--- a/help/es/apx-gpl.xml
+++ /dev/null
@@ -1,419 +0,0 @@
-
- <appendix id="apx-gpl">
-
-<title>GNU General Public License</title>
-<para>
-Copyright (c) 2000 Free Software Foundation, Inc.
- <address>Free Software Foundation, Inc.
- <street>59 Temple Place, Suite 330</street>,
- <city>Boston</city>,
- <state>MA</state> <postcode>02111-1307</postcode>
- <country>USA</country>
- </address>.
- </para>
-
-<para>
-This is version 2
-</para>
-
- <para>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
- </para>
-
-
- <sect1 id="preamble">
- <title>Preamble</title>
-
- <para>
- The licenses for most software are designed to take away your
- freedom to share and change it. By contrast, the GNU General Public
- License is intended to guarantee your freedom to share and change
- free software - to make sure the software is free for all its users.
- This General Public License applies to most of the Free Software
- Foundation's software and to any other program whose authors commit
- to using it. (Some other Free Software Foundation software is covered
- by the GNU Library General Public License instead.) You can apply it
- to your programs, too.
- </para>
-
- <para>
- 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 this
- service 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.
- </para>
-
- <para>
- To protect your rights, we need to make restrictions that forbid anyone
- to deny you these rights or to ask you to surrender the rights. These
- restrictions translate to certain responsibilities for you if you distribute
- copies of the software, or if you modify it.
- </para>
-
- <para>
- For example, if you distribute copies of such a program, whether gratis or
- for a fee, you must give the recipients all the rights that you have. 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.
- </para>
-
- <para>
- We protect your rights with two steps:
-
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- copyright the software, and
- </para>
- </listitem>
- <listitem>
- <para>
- offer you this license which gives you legal permission to copy,
- distribute and/or modify the software.
- </para>
- </listitem>
- </orderedlist>
- </para>
-
- <para>
- Also, for each author's protection and ours, we want to make certain that
- everyone understands that there is no warranty for this free software. If
- the software is modified by someone else and passed on, we want its
- recipients to know that what they have is not the original, so that any
- problems introduced by others will not reflect on the original authors'
- reputations.
- </para>
-
- <para>
- Finally, any free program is threatened constantly by software patents.
- We wish to avoid the danger that redistributors of a free program will
- individually obtain patent licenses, in effect making the program
- proprietary. To prevent this, we have made it clear that any patent must be
- licensed for everyone's free use or not licensed at all.
- </para>
-
- <para>
- The precise terms and conditions for copying, distribution and modification
- follow.
- </para>
-
- </sect1>
-
- <sect1 id="terms">
- <title>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</title>
-
- <sect2 id="sect0">
- <title>Section 0</title>
- <para>
- This License applies to any program or other work which contains a notice
- placed by the copyright holder saying it may be distributed under the terms
- of this General Public License. The "Program", below, refers to any such
- program or work, and a <quote>work based on the Program</quote> means either
- the Program or any derivative work under copyright law: that is to say, a
- work containing the Program or a portion of it, either verbatim or with
- modifications and/or translated into another language. (Hereinafter, translation
- is included without limitation in the term <quote>modification</quote>.) Each
- licensee is addressed as <quote>you</quote>.
- </para>
-
- <para>
- Activities other than copying, distribution and modification are not covered by
- this License; they are outside its scope. The act of running the Program is not
- restricted, and the output from the Program is covered only if its contents
- constitute a work based on the Program (independent of having been made by running
- the Program). Whether that is true depends on what the Program does.
- </para>
- </sect2>
-
- <sect2 id="sect1">
- <title>Section 1</title>
- <para>
- You may copy and distribute 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 and disclaimer of warranty;
- keep intact all the notices that refer to this License and to the absence of any
- warranty; and give any other recipients of the Program a copy of this License
- along with the Program.
- </para>
-
- <para>
- You may charge a fee for the physical act of transferring a copy, and you may at
- your option offer warranty protection in exchange for a fee.
- </para>
- </sect2>
-
- <sect2 id="sect2">
- <title>Section 2</title>
- <para>
- You may modify your copy or copies of the Program or any portion of it, thus
- forming a work based on the Program, and copy and distribute such modifications
- or work under the terms of <link linkend="sect1">Section 1</link> above, provided
- that you also meet all of these conditions:
-
- <orderedlist numeration="loweralpha">
- <listitem>
- <para>
- You must cause the modified files to carry prominent notices stating that
- you changed the files and the date of any change.
- </para>
- </listitem>
- <listitem>
- <para>
- You must cause any work that you distribute or publish, that in whole or
- in part contains or is derived from the Program or any part thereof, to be
- licensed as a whole at no charge to all third parties under the terms of
- this License.
- </para>
- </listitem>
- <listitem>
- <para>
- If the modified program normally reads commands interactively when run, you
- must cause it, when started running for such interactive use in the most
- ordinary way, to print or display an announcement including an appropriate
- copyright notice and a notice that there is no warranty (or else, saying
- that you provide a warranty) and that users may redistribute the program
- under these conditions, and telling the user how to view a copy of this
- License.
-
- <note>
- <title>Exception:</title>
- <para>
- If the Program itself is interactive but does not normally print such an
- announcement, your work based on the Program is not required to print an
- announcement.)
- </para>
- </note>
-
- </para>
- </listitem>
- </orderedlist>
- </para>
-
- <para>
- These requirements apply to the modified work as a whole. If identifiable sections
- of that work are not derived from the Program, and can be reasonably considered
- independent and separate works in themselves, then this License, and its terms,
- do not apply to those sections when you distribute them as separate works. But when
- you distribute the same sections as part of a whole which is a work based on the
- Program, the distribution of the whole must be on the terms of this License, whose
- permissions for other licensees extend to the entire whole, and thus to each and
- every part regardless of who wrote it.
- </para>
-
- <para>
- Thus, it is not the intent of this section to claim rights or contest your rights
- to work written entirely by you; rather, the intent is to exercise the right to control
- the distribution of derivative or collective works based on the Program.
- </para>
-
- <para>
- In addition, mere aggregation of another work not based on the Program with the Program
- (or with a work based on the Program) on a volume of a storage or distribution medium
- does not bring the other work under the scope of this License.
- </para>
- </sect2>
-
- <sect2 id="sect3">
- <title>Section 3</title>
-
- <para>
- You may copy and distribute the Program (or a work based on it, under
- <link linkend="sect2">Section 2</link> in object code or executable form under the terms of
- <link linkend="sect1">Sections 1</link> and <link linkend="sect2">2</link> above provided that
- you also do one of the following:
-
- <orderedlist numeration="loweralpha">
- <listitem>
- <para>
- Accompany it with the complete corresponding machine-readable source code, which
-
- must be distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
- </para>
- </listitem>
- <listitem>
- <para>
- Accompany it with a written offer, valid for at least three years, to give any
- third party, for a charge no more than your cost of physically performing source
- distribution, a complete machine-readable copy of the corresponding source code,
- to be distributed under the terms of Sections and above on a medium customarily
- used for software interchange; or,
- </para>
- </listitem>
- <listitem>
- <para>
- Accompany it with the information you received as to the offer to distribute
- corresponding source code. (This alternative is allowed only for noncommercial
- distribution and only if you received the program in object code or executable form
- with such an offer, in accord with Subsection b above.)
- </para>
- </listitem>
- </orderedlist>
- </para>
-
- <para>
- The source code for a work means the preferred form of the work for making modifications
- to it. For an executable work, complete source code means all the source code for all modules
- it contains, plus any associated interface definition files, plus the scripts used to control
- compilation and installation of the executable. However, as a special exception, the source
- code distributed need not include anything that is normally distributed (in either source or
- binary form) with the major components (compiler, kernel, and so on) of the operating system
- on which the executable runs, unless that component itself accompanies the executable.
- </para>
-
- <para>
- If distribution of executable or object code is made by offering access to copy from a
- designated place, then offering equivalent access to copy the source code from the same place
- counts as distribution of the source code, even though third parties are not compelled to
- copy the source along with the object code.
- </para>
- </sect2>
-
- <sect2 id="sect4">
- <title>Section 4</title>
-
- <para>
- You may not copy, modify, sublicense, or distribute the Program except as expressly provided
- under this License. Any attempt otherwise to copy, modify, sublicense or distribute the
- Program is void, and will automatically terminate your rights under this License. However,
- parties who have received copies, or rights, from you under this License will not have their
- licenses terminated so long as such parties remain in full compliance.
- </para>
- </sect2>
-
- <sect2 id="sect5">
- <title>Section 5</title>
-
- <para>
- You are not required to accept this License, since you have not signed it. However, nothing
- else grants you permission to modify or distribute the Program or its derivative works.
- These actions are prohibited by law if you do not accept this License. Therefore, by modifying
- or distributing the Program (or any work based on the Program), you indicate your acceptance
- of this License to do so, and all its terms and conditions for copying, distributing or
- modifying the Program or works based on it.
- </para>
- </sect2>
-
- <sect2 id="sect6">
- <title>Section 6</title>
-
- <para>
- Each time you redistribute the Program (or any work based on the Program), the recipient
- automatically receives a license from the original licensor to copy, distribute or modify
- the Program subject to these terms and conditions. You may not impose any further restrictions
- on the recipients' exercise of the rights granted herein. You are not responsible for enforcing
- compliance by third parties to this License.
- </para>
- </sect2>
-
- <sect2 id="sect7">
- <title>Section 7</title>
-
- <para>
- If, as a consequence of a court judgment or allegation of patent infringement or for any other
- reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously
- your obligations under this License and any other pertinent obligations, then as a consequence
- you may not distribute the Program at all. For example, if a patent license would not permit
- royalty-free redistribution of the Program by all those who receive copies directly or
- indirectly through you, then the only way you could satisfy both it and this License would be
- to refrain entirely from distribution of the Program.
- </para>
-
- <para>
- If any portion of this section is held invalid or unenforceable under any particular circumstance,
- the balance of the section is intended to apply and the section as a whole is intended to apply
- in other circumstances.
- </para>
-
- <para>
- It is not the purpose of this section to induce you to infringe any patents or other property
- right claims or to contest validity of any such claims; this section has the sole purpose of
- protecting the integrity of the free software distribution system, which is implemented by public
- license practices. Many people have made generous contributions to the wide range of software
- distributed through that system in reliance on consistent application of that system; it is up
- to the author/donor to decide if he or she is willing to distribute software through any other
- system and a licensee cannot impose that choice.
- </para>
-
- <para>
- This section is intended to make thoroughly clear what is believed to be a consequence of the
- rest of this License.
- </para>
- </sect2>
-
- <sect2 id="sect8">
- <title>Section 8</title>
-
- <para>
- If the distribution and/or use of the Program is restricted in certain countries either by patents
- or by copyrighted interfaces, the original copyright holder who places the Program under this License
- may add an explicit geographical distribution limitation excluding those countries, so that
- distribution is permitted only in or among countries not thus excluded. In such case, this License
- incorporates the limitation as if written in the body of this License.
- </para>
- </sect2>
-
- <sect2 id="sect9">
- <title>Section 9</title>
-
- <para>
- The Free Software Foundation may publish revised and/or new versions of the 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.
- </para>
-
- <para>
- Each version is given a distinguishing version number. If the Program specifies a version number of
- this License which applies to it and "any later version", you have the option of following the terms
- and conditions either of that version or of any later version published by the Free Software
- Foundation. If the Program does not specify a version number of this License, you may choose any
- version ever published by the Free Software Foundation.
- </para>
- </sect2>
-
- <sect2 id="sect10">
- <title>Section 10</title>
-
- <para>
- If you wish to incorporate parts of the Program into other free programs whose distribution
- conditions are different, write to the author to ask for permission. For software which is copyrighted
- by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions
- for this. Our decision will be guided by the two goals of preserving the free status of all
- derivatives of our free software and of promoting the sharing and reuse of software generally.
- </para>
- </sect2>
-
- <sect2 id="sect11">
- <title>NO WARRANTY</title>
- <subtitle>Section 11</subtitle>
-
- <para>
- BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
- </para>
- </sect2>
-
- <sect2 id="sect12">
- <title>Section 12</title>
-
- <para>
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR
- ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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.
- </para>
- </sect2>
- </sect1>
- </appendix> \ No newline at end of file
diff --git a/help/es/config-prefs.xml b/help/es/config-prefs.xml
deleted file mode 100644
index a0e1df45cf..0000000000
--- a/help/es/config-prefs.xml
+++ /dev/null
@@ -1,997 +0,0 @@
-<chapter id="config-prefs">
-
- <title
->Configuración avanzada</title>
- <para
-> Quizás su servidor de correo haya cambiado de nombre. Quizás se cansó de siempre utilizar la misma presentación de citas. Sea cual sea la razón puede, que quiera cambiar sus configuraciones de <application
->Evolution</application
->. Este capítulo le explicará cómo hacerlo. </para>
- <para
-> El cuadro de diálogo de configuración de Evolution 1.2 ha sido rediseñado hasta el último detalle. Puede abrirlo con <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-></menuchoice
-> desde cualquier lugar de Evolution. La parte izquierda de la ventana tiene una columna, parecida a la barra de atajos, donde puede seleccionar la parte de Evolution que desea personalizar. La parte derecha es donde realmente realizará cambios. </para>
-
-
- <!-- ==============Figure===================== -->
- <figure id="config-prefs-mail-fig">
- <title
->Modificación de la configuración del correo</title>
- <screenshot
-> <screeninfo
->Modificación de la configuración del correo</screeninfo
-> <mediaobject
-><imageobject
-><imagedata fileref="figures/config-mail" format="PNG" srccredit="Aaron Weber"/> </imageobject
-></mediaobject
-> </screenshot>
- </figure>
- <!-- ==============End of Figure================-->
-
- <para
-> Es posible personalizar ocho elementos, que describimos de arriba a abajo: <variablelist
-> <varlistentry
-> <term
-><guiicon
->Cuentas de correo</guiicon
-></term
-> <listitem
-> <para
-> Declare o modifique los datos de su cuentas de correo electrónico: los servidores a los que debe acceder, la manera en la que se baje el correo, el modo en que se autentique, etc. Este es el elemento más complejo de la lista y está descrito en <xref linkend="config-prefs-mail-identity"/>. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guiicon
->Carpetas</guiicon
-></term
-> <listitem
-> <para
-> Puede configurar carpetas predeterminadas para varios componentes de Evolution, las carpetas que serán colocadas en caché en el disco local cuando esté en el modo desconectado y las carpetas en dónde se harán las búsquedas para autocompletar direcciones de correo electrónico. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guiicon
->Opciones de correo</guiicon
-></term
-> <listitem
-> <para
-> Estas son las preferencias de lectura de correo generales: opciones para la representación, notificación, seguridad, etc. Las opciones que dependen de cadacuenta están en la herramienta Cuentas de Correo descrita en <xref linkend="config-prefs-mail-identity"/>, pero la mayoría de las opciones de correo están aquí. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guiicon
->Editor de correo</guiicon
-></term
-> <listitem
-> <para
-> Define la manera en la que quiere usar el editor de correo: atajos, firmas, corrección ortográfica, etc. Una función entretenida es la capacidad de sustituir caritas o "emoticones" como :-), que mucha gente utiliza en el correo electrónico. Esta herramienta está descrita en <xref linkend="config-prefs-mail-composer"/>. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guiicon
->Calendario y tareas</guiicon
-></term
-> <listitem
-> <para
-> Puede especificar el funcionamiento del calendario, como la zona horaria y duración de su semana laboral. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guiicon
->Delegación de Exchange</guiicon
-></term
-> <listitem
-> <para
-> Este elemento aparecerá solamente si tiene instalado Ximian Connector for Microsoft Exchange. Permite elegir quién puede tener acceso a su cuenta Exchange. Esta característica está descrita en <xref linkend="exchange-delegate"/>. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guiicon
->Servidores de directorio</guiicon
-></term
-> <listitem
-> <para
-> Este elemento permite introducir los datos de la cuenta necesaria para conectarse con servidores de directorio (LDAP) remotos. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guiicon
->Configuración del resumen</guiicon
-></term
-> <listitem
-> <para
-> Configura qué carpetas, titulares de noticias, longitud del resumen de planificación y qué informes meteorológicos se mostrarán. Para agregar nuevos servidores de titulares de noticias escriba la dirección URL de cualquier archivo RDF. La personalización del resumen se describe en <xref linkend="customizing-summary"/> en lugar de en este capítulo. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guiicon
->Estoy fuera</guiicon
-></term
-> <listitem
-> <para
-> Este elemeno aparecerá solamente si tiene instalado Ximian Connector for Microsoft Exchange. Permite crear y borrar automáticamente mensajes de «fuera por vacaciones». Para saber cómo usar esta característica lea <xref linkend="exchange-out-of-office"/>. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
-
- <sect1 id="config-prefs-mail-identity">
- <title
->Utilización de cuentas de correo</title
->
- <para
-> <application
->Ximian Evolution</application
-> le permite administrar varias cuentas de correo, o identidades, a la vez. Esto es útil cuando desea diferenciar mensajes profesionales y personales, o cuando ejerce varias responsabilidades en su trabajo. Cuando escribe un mensaje de correo puede elegir desde qué cuenta enviarlo en la lista desplegable junto a <guilabel
->De:</guilabel
->. </para>
-
- <para
-> Haga clic en <guibutton
->Enviar/Recibir</guibutton
-> para actualizar todos los listados IMAP, <filename
->mh</filename
-> o <filename
->mbox</filename
-> así como para comprobar y descargar su correo de todos los servidores POP. En otras palabras, <guibutton
->Enviar/Recibir</guibutton
-> trae todo su correo, de todos los orígenes disponibles. Si no desea recibir correo de alguna cuenta, selecciónela en la sección <guilabel
->Cuentas de correo</guilabel
-> y haga clic en <guibutton
->Inhabilitar</guibutton
->. </para>
-
- <para
-> Para agregar una cuenta, haga clic en <guibutton
->Añadir</guibutton
-> para abrir el asistente de configuración del correo. Para modificar una identidad existente, selecciónela y haga clic en <guibutton
->Editar</guibutton
-> para abrir el cuadro de diálogo del editor de cuentas. </para>
-
- <para
-> El cuadro de diálogo del editor de cuentas cuenta con seis secciones: <variablelist
-> <varlistentry
-> <term
-><guilabel
->Identidad</guilabel
-></term
-> <listitem
-> <para
-> Escriba el nombre de la cuenta, la dirección de correo y otra información de identificación de la cuenta. También puede elegir una firma predeterminada para añadirla al final de los mensajes enviados desde esta cuenta. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Recepción de correo</guilabel
-></term
-> <listitem
-> <para
-> Especifique de qué manera desea consultar su correo: puede descargarlo desde un servidor ( <glossterm linkend="pop"
->POP</glossterm
->); puede leerlo y conservarlo en el mismo servidor (Microsoft Exchange o <glossterm linkend="imap"
->IMAP</glossterm
->), así como leer ficheros que ya están en su escritorio. Es posible que el servidor le permita utilizar conexiones cifradas (SSL), que puede activar con <guibutton
->Usar conexiones seguras (SSL)</guibutton
->. <note id="config-arbitrary-port"
-> <title
->Especificación de los números de puerto</title
-> <para
-> Es posible que su administrador de sistemas le indique de debe conectarse a través de un puerto específico de su servidor. Para especificarlo, a continuación del nombre del servidor, escriba un signo de dos puntos y el número de puerto. Por ejemplo, para conectar a través del puerto 143 del servidor smtp.todostuspuertos.com, escriba el nombre de servidor como sigue: <userinput
-> smtp.todostuspuertos.com:143 </userinput
-> . </para
-> </note
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Opciones de recepción</guilabel
-></term
-> <listitem
-> <para
-> Aquí decide si quiere descargar su correo automáticamente y con qué frecuencia, así como otras opciones de recuperación de los mensajes. <variablelist
-> <varlistentry
-> <term
->Si seleccionó el protocolo POP:</term
-> <listitem
-> <para
-> <itemizedlist
-> <listitem
-> <para
->Descargar el correo nuevo: para que <application
->Evolution</application
-> descargue automáticamente su correo nuevo, active esta casilla y elija la frecuencia en minutos. </para
-> </listitem
-> <listitem
-> <para
-> Almacenamiento de mensajes: active esta casilla si quiere almacenar copias de su correo en el servidor. </para
-> </listitem
-> <listitem
-> <para
->Almacenar información de estado en las cabeceras en formato Elm/Pine/Mutt: permite a clientes de correo como Elm, Pine y Mutt, utilizar el formato de cabecera X-Status. Esta opción es útil si tiene previsto examinar su correo de vez en cuando con alguno de estos clientes. </para
-> </listitem
-> </itemizedlist
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Si oligió Microsoft Exchange:</term
-> <listitem
-> <para
-> <itemizedlist
-> <listitem
-> <para
-><guilabel
->Descargar el correo nuevo</guilabel
->: si quiere que <application
->Evolution</application
-> descargue automáticamente su correo nuevo, active esta casilla y elija la frecuencia en minutos. </para
-> </listitem
-> <listitem
-> <para
-> <guilabel
->Global Catalog server name</guilabel
->: escriba el nombre de su servidor Global de Catálogo para crear una carpeta para la Lista Global de Direcciones de su organización. </para
-> </listitem
-> <listitem
-> <para
-><guilabel
->Limitar el número de respuestas</guilabel
->: elija el número máximo de resultados en la búsqueda de una dirección. Este número limita la carga de sistema y de la red. La mayoría de los servidores no envían más de 1000 resultados a pesar del valor que haya elegido aquí. </para
-> </listitem
-> <listitem
-> <para
-><guilabel
->Nombre del buzón</guilabel
->: indique el nombre de su buzón </para
-> </listitem
-> <listitem
-> <para
-> <guilabel
->OWA Path</guilabel
->: indique la ruta usada en su servidor con Outlook Web Access. </para
-> </listitem
-> <listitem
-> <para
-> <guilabel
->Public Folder Server</guilabel
->: escriba el nombre su servidor de carpetas públicas, si es que es diferente de su servidor Exchange. </para
-> </listitem
-> <listitem
-> <para
-> <guilabel
->Aplicar filtros a los mensajes nuevos en el buzón de entrada de este servidor</guilabel
->: active esta casilla si quiere aplicar filtros al correo de esta cuenta. </para
-> </listitem
-> </itemizedlist
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Si oligió IMAP:</term
-> <listitem
-> <para
-> <itemizedlist
-> <listitem
-> <para
-><guilabel
->Descargar el correo nuevo</guilabel
->: si quiere que <application
->Evolution</application
-> descargue automáticamente su correo nuevo, active esta casilla y elija la frecuencia en minutos. </para
-> </listitem
-> <listitem
-> <para
->Si desea que <application
->Evolution</application
-> descargue <emphasis
->todos</emphasis
-> los mensajes nuevos de sus carpetas IMAP, compruebe que la casilla <guilabel
->Comprobar si hay mensajes nuevos en todas las carpeta</guilabel
-> está activada.</para
-> </listitem
-> <listitem
-> <para
-><guilabel
->Mostrar sólo las carpetas suscritas</guilabel
->: active esta opción si la vista IMAP muestra más carpetas que las que desea leer.</para
-> </listitem
-> <listitem
-> <para
-> <guilabel
->Sobreescribir el espacio de nombres proporcionado por el servidor</guilabel
->: si lo desea, especifique el directorio donde su servidor almacena su correo. Los nombres más comunes son «mail» y «Mail». Para obtener más información acerca de cómo utilizar el protocolo de correo IMAP, consulte <xref linkend="usage-mail-subscriptions"/>.</para
-> </listitem
-> <listitem
-> <para
-><guilabel
->Aplicar filtros a los mensajes nuevos en el buzón de entrada</guilabel
->: active esta casilla si desea aplicar sus filtros en el correo de esta cuenta. </para
-> </listitem
-> <listitem
-> <para
-><guilabel
->Almacenar información de estado en las cabeceras en formato Elm/Pine/Mutt</guilabel
->: permite a clientes de correo como Elm, Pine y Mutt, utilizar el formato de cabecera X-Status. Esta opción es útil si tiene previsto examinar su correo de vez en cuando con alguno de estos clientes. </para
-> </listitem
-> </itemizedlist
-> </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Envío de correo</guilabel
-></term
-> <listitem
-> <para
-> Puede elegir y configurar el método de envío de correo. Puede optar entre <glossterm linkend="smtp"
->SMTP</glossterm
->, Microsoft Exchange (si ha comprado Ximian Connector para Microsoft Exchange) o <glossterm linkend="sendmail"
->sendmail</glossterm
->. </para
-> <para
-> Si eligió Exchange o Sendmail ya ha acabado con esta solapa. SMTP le permite elegir un servidor, el nivel de seguridad del servidor y un tipo de autenticación, que podrá reconocer como familiar a la usada por los servidores IMAP y POP en la solapa <guilabel
->Recibiendo correo</guilabel
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Predeterminados</guilabel
-></term
-> <listitem
-> <para
-> Puede decidir dónde quiere que esta cuenta almacene los mensajes enviados y los guardados como borradores. Si quiere restaurar la configuración «de fábrica» pulse sobre el botón <guibutton
->Predeterminados</guibutton
->. </para
-> <para
-> Si quiere mandar copia de cada mensaje de esta cuenta a alguna persona, active la casilla titulada <guilabel
->Siempre Cc</guilabel
-> o <guilabel
-> Siempre Cco</guilabel
-> e introduzca una o más direcciones. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Seguridad</guilabel
-></term
-> <listitem
-> <para
-> Puede definir las opciones de seguridad de esta cuenta. Si usa cifrado escriba su Id. de clave PGP (para más información consulte <xref linkend="encryption"/>)y elija entre las cuatro opciones disponibles la manera de manejar su clave y firma. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
- </sect1>
-
- <sect1 id="config-prefs-folders">
- <title
->Carpetas</title>
- <para
-> Hay tres conjuntos de carpetas. El primero son las <guilabel
->Carpetas predefinidas</guilabel
->, donde puede elegir qué carpetas pueden ser sus carpetas más frecuentes para correo, contactos, agenda y tareas. Estas carpetas son las que se abren desde la barra de atajos y cuando guarda una tarjeta de visita o un evento adjunto. </para>
- <para
-> Las <guilabel
->Carpetas sin conexión</guilabel
-> son de las que se mantienen copias locales cuando activa la función <guibutton
->Trabajar desconectado</guibutton
->. </para>
- <para
-> Elija una o más carpetas de contactos para las <guilabel
->Carpetas para autocompletar</guilabel
->. Cuando escribe unas letras en los campos de los destinatarios de los mensajes, Evolution usará ese texto como patrón de búsquerda en las carpetas que haya especificado. </para>
- </sect1>
-
- <sect1 id="config-prefs-mail">
- <title
->Opciones de correo</title>
- <para
-> La herramienta <guilabel
->Opciones de correo</guilabel
-> sirve para elegir cómo mostrar las citas de otros mensajes, cuánto esperar hasta marcar un mensaje como leído así como otras opciones de representación del correo. Hay tres categorías de opciones: General, Correo en HTML y Colores. </para>
- <para
-> Para saber más sobre opciones individuales de correo electrónico consulte <xref linkend="config-prefs-mail-identity"/>. </para>
-
- <para
-> La solapa <guilabel
->General</guilabel
-> permite establecer los valores siguientes: <variablelist
-> <varlistentry
-> <term
-><guilabel
->Tipografías del mensaje</guilabel
-></term
-> <listitem
-> <para
-> En general Evolution usará las mismas tipografías que el resto de aplicaciones GNOME. Para elegir otras diferentes desactive la casilla <guilabel
->Usar las mismas tipografías que en otras aplicaciones</guilabel
-> y elija una tipografía estándar y otra de tamaño fijo. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Vista de los mensajes</guilabel
-></term
-> <listitem
-> <para
-> Estas tres opciones manejan la manera en la que se le aparecen los mensajes. <variablelist
-> <varlistentry
-> <term
->Marcar los mensajes como leídos</term
-> <listitem
-> <para
-> Normalmente Evolution marcará los mensajes como leídos tan pronto como los muestre en pantalla. Si lo prefiere puede configurarlo para que ocurra tras un pequeño lapso o desactivarlo del todo para que sólo se marquen como leídos cuando lo indique expresamente. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Codificación de caracteres predeterminada</term
-> <listitem
-> <para
-> Esta opción le permite elegir qué juegos .de caracteres quiere que Evolution interprete para poder mostrar diferentes alfabetos. Si no está seguro de cuál elegir, elija Unicode (UTF-8), que sirve para una gran cantidad de lenguas y juegos de caracteres. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Color para resaltar las citas.</term
-> <listitem
-> <para
-> Elija qué color quiere para resaltar las citas de otros mensajes. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Eliminación de correo</term
-> <listitem
-> <para
-> Aquí elige si quiere borrar automáticamente los mensajes al salir de Evolution o si prefiere tener que confirmar explícitamente su borrado definitivo. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Aviso de correo nuevo</term
-> <listitem
-> <para
-> Evolution puede alertarle de la llegada de correo nuevo con un pitido o lanzando un fichero de sonido. Elija el sonido de alerta o ninguno, a placer. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
- <para
-> Las opciones en la sección <guilabel
->Correo en HTML</guilabel
-> son: <variablelist
-> <varlistentry
-> <term
->Cargar imágenes</term
-> <listitem
-> <para
-> Al crear un mensaje puede incluirle una imagen que sólo se descargue solamente cuando el mensaje es leído por el destinatario. Sin embargo los «spammers» pueden usar los patrones de descarga de imágenes para confirmar «direcciones vivas» e invadir la privacidad de sus datos. Puede elegir que nunca se carguen las imágenes automáticamente, hacerlo solamente si el remitente está en su libreta de direcciones o cargarlas todas. </para
-> <para
-> Si ha elegido no descargar imágenes automáticamente puede elegir verlas en cada mensaje con <menuchoice
-> <guimenu
->Ver</guimenu
-><guisubmenu
->Mostrar mensaje</guisubmenu
-> <guimenuitem
->Cargar imágenes</guimenuitem
-></menuchoice
->. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Mostrar imágenes animadas</guilabel
-></term
-> <listitem
-> <para
-> Aquí puede activar o desactivar que se vean las animaciones en algunas imágenes. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Preguntar al mandar mensajes HTML a contactos que no los quieren</guilabel
-></term
-> <listitem
-> <para
-> Como algunas personas no les gusta el correo HTML, puede hacer que Evolution le avise de eso. Dicha advertencia aparecerá solamente cuando envíe correo HTML a personas a las que previamente ha anotado en su libreta de direcciones que no quieren recibirlo. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
- <para
-> La solapa <guilabel
->Colores</guilabel
-> permie elegir colores diferentes para mensajes puntuales. Puede restaurar los valores iniciales de la aplicación pulsando el botón <guibutton
->Valores originales</guibutton
->. </para>
-</sect1>
-
-
- <sect1 id="config-prefs-mail-composer">
- <title
->Preferencias del editor de correo</title>
- <para
-> La configuración del editor de correo tiene tres solapas de opciones. La solapa<guilabel
->General</guilabel
-> permite configurar atajos y acciones asociadas, mientras las dos controlan las firmas y la corrección ortográfica. En <guilabel
->General</guilabel
-> puede configurar los siguientes elementos: <variablelist
-> <varlistentry
-> <term
-><guilabel
->Comportamiento predeterminado</guilabel
-></term
-> <listitem
-> <para
-> Elija cómo reenviará o contestará normalmente los mensajes, qué juego de caracteres usará, si desea utilizar el formato HTML y en ese caso, si desea utilizar emoticones. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Alertas</guilabel
-></term
-> <listitem
-> <para
-> Hay dos alertas opcionales: <variablelist
-> <varlistentry
-> <term
-><guilabel
->Preguntar al mandar mensajes con el asunto vacío</guilabel
-></term
-> <listitem
-> <para
-> El editor muestra una advertencia si intenta enviar un mensaje sin asunto. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Preguntar al mandar mensajes que sólo tengan definido Bcc</guilabel
-></term
-> <listitem
-> <para
-> El editor muestra una advertencia si intenta enviar un mensaje que sólo contenga destinatarios <guilabel
->Bcc</guilabel
->. Esto es importante porque algunos servidores de correo sólo aceptarán copias ocultas cuando el mensaje contiene al menos un destinatario visible para todos los lectores. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
-
- <para
-> El editor de firmas permite crear varias firmas diferentes en formato de texto puro o en HTML así como especificar cuál de ellas debe agregarse a los mensajes que crea en el editor de mensajes. También puede elegir una firma alternativa, o no utilizar ninguna, desde el propio editor de correo. </para>
- <para
-> La herramienta de corrección ortográfica incluye opciones de corrección, en una o varias lenguas. Observe que debe instalar el paquete gnome-spell, disponible en Red Carpet, para tener la corrección ortográfica disponible en Evolution. Red Carpet también incluye diccionarios para diferentes idiomas, que son detectados automáticamente tras su instalación. </para>
- <para
-> Puede comprobar la ortografría de los mensajes con <menuchoice
-><guimenu
->Editar</guimenu
-><guimenuitem
->Comprobar la ortografía del documento</guimenuitem
-></menuchoice
->. También puede hacerlo en la ventana principal de Evolution eligiendo <menuchoice
-><guimenu
->Herramientas</guimenu
-> <guisubmenu
->Configuración</guisubmenu
-></menuchoice
->, pinche en el icono<guiicon
->Preferencias del editor</guiicon
-> y después abra la solapa <guilabel
->Ortografía</guilabel
-> y marque la casilla <guibutton
->Verificar ortografía mientras se escribe</guibutton
-> y elija el color para resaltar las palabras mal escritas. </para>
-</sect1>
-
-<!-- NOT FOR 1.0, see usage-mail.sgml
- <sect1 id="config-prefs-news"
->
- <title
->News Servers</title>
- <para>
- Newsgroups are so much like mailing lists that there's no
- reason not to keep them right next to your mail. When you
- first select the <guilabel
->News Servers</guilabel
-> tab,
- you will see a blank box with the three familiar buttons
- on the right: <guibutton
->Add</guibutton
->,
- <guibutton
->Edit</guibutton
->, and
- <guibutton
->Delete</guibutton
->.
- </para>
- <para>
- Click <guibutton
->Add</guibutton
-> to add a news server; you
- will be prompted for its name. Enter the name, click
- <guibutton
->OK</guibutton
->, and you're done. You can have
- as many news servers as you like, of course. News servers
- will appear next to your IMAP servers in the
- <interface
->folder bar</interface
->.
- </para>
- </sect2>
- </sect1>
--->
-
-
- <sect1 id="config-prefs-cal">
- <title
->Preferencias del calendario y de la lista de tareas</title>
- <para
-> La herramienta de configuración del calendario incluye dos solapas<guilabel
->General</guilabel
-> y <guilabel
->Vista</guilabel
-> y está ilustrada en <xref linkend="config-prefs-cal-fig"/>. <figure id="config-prefs-cal-fig"
-> <title
->Diálogo de preferencias del calendario</title
-> <screenshot
-> <screeninfo
->Configuración del calendario</screeninfo
-> <mediaobject
-><imageobject
-><imagedata fileref="figures/config-cal" format="PNG" srccredit="Aaron Weber"/> </imageobject
-></mediaobject
-> </screenshot
-> </figure
-> </para>
-
- <para
-> La ficha <guilabel
->General</guilabel
-> permite establecer los valores siguientes: <variablelist
-> <varlistentry
-> <term
-><guilabel
->Zona horaria</guilabel
-></term
-> <listitem
-> <para
-> La ciudad en la que se encuentra, para calcular su zona horaria. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Formato de la hora</guilabel
-></term
-> <listitem
-> <para
->Haga clic en el botón radio para elegir el formato de doce horas (AM/PM) o de veinticuatro horas. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Semana laboral</guilabel
-></term
-> <listitem
-> <para
-> ¿Cuándo empieza su jornada laboral y cuándo acaba? Las vistas semanales y diarias del cliente <application
->Evolution</application
-> muestran todas las horas en el rango elegido, incluso si no hay citas programadas. Por supuesto, siempre es posible planificar citas fuera de las horas presentadas, en cuyo caso la vista se amplía para poder mostrarlas. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->La semana empieza en</guilabel
-></term
-> <listitem
-> <para
->Especifique si la semana empieza en domingo o lunes.</para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->El día comienza a las</guilabel
-></term
-> <listitem
-> <para
-> Indica la hora de inicio de jornada laboral normal. Puede que encuentre útil esta opción si tiene horarios de trabajo raros o quiere asegurarse de que aparezcan sus citas más madrugadoras. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->El día acaba a las</guilabel
-></term
-> <listitem
-> <para
-> Indica la hora la que acaba una jornada laboral normal. Puede que encuentre útil esta opción si tiene horarios de trabajo raros o quiere asegurarse de que aparezcan sus citas vespertinas. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Alertas</guilabel
-></term
-> <listitem
-> <para
-> Active las casillas si desea mostrar una advertencia antes de eliminar una cita, o recibir recordatorios automáticos para cada evento. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
-
- <para
-> La sección <interface
->Vista</interface
-> sirve para elegir la presentación de sus citas y tareas dentro del calendario. </para>
- <para
->Las propiedades de la vista que puede establecer son: <variablelist
-> <varlistentry
-> <term
-><guilabel
->Divisiones de horas</guilabel
-></term
-> <listitem
-> <para
-> Especifique lo incrementos mostrados en la vista diaria del calendario. Puede indicar valores entre cinco minutos y una hora, con incrementos de cinco minutos.</para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Mostrar la hora del final de las citas en las vistas semanales y mensuales</guilabel
-></term
-> <listitem
-> <para
-> Si hay espacio suficiente, el cliente <application
->Evolution</application
-> mostrará las horas finales en las vistas semanales y mensajes para cada cita. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Comprimir fines de semana en la vista mensual</guilabel
-></term
-> <listitem
-> <para
-> Con esta opción, la vista mensual agrupa todo el fin de semana en una misma celda, en lugar de una celda para cada día. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Mostrar los números de las semanas en el navegador de fechas</guilabel
-></term
-> <listitem
-> <para
-> Mostrará el número de semana en el calendario. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Tareas que vencen hoy</guilabel
-></term
-> <listitem
-> <para
-> Establece el color de las tareas que deben concluirse en el día de hoy. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Tareas vencidas</guilabel
-></term
-> <listitem
-> <para
-> Establece el color de las tareas cuyo plazo de finalización ha acabado. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
- </sect1>
- <sect1 id="config-prefs-contact">
- <title
->Opciones de los servidores de directorio</title>
- <para
-> La libreta de direcciones sólo permite establecer la utilización y configuración de servidores de directorio (LDAP y Exchange). Para saber cómo configurar las opciones de la función de autocompletado lea <xref linkend="config-prefs-folders"/>. Los demás controles de la libreta de direcciones se muestran en la propia ventana de la libreta. </para>
-
- <para
-> Para agregar un nuevo servidor <glossterm linkend="ldap"
->LDAP</glossterm
-> a la lista de sus carpetas de contactos disponibles: </para>
- <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Elija <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-> </menuchoice
-> y pinche en el botón <guilabel
->Servidores de directorio</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Para abrir el asistente e incluir un servidor de directorio, haga clic en <guibutton
->Agregar</guibutton
-> a la derecha. </para
-> </listitem
-> <listitem
-> <para
-> Escriba los datos del servidor solicitados por el asistente: <variablelist
-> <varlistentry
-> <term
->Nombre del servidor</term
-> <listitem
-> <para
-> Dirección del servidor donde se aloja la libreta de direcciones. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Método de inicio de sesión</term
-> <listitem
-> <para
-> Especifique el método de inicio de sesión: anónimo, con la dirección de correo electrónico o un "nombre distinguido". Si no utiliza un inicio de sesión anónimo, escriba el nombre de usuario solicitado por el servidor. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Puerto</term
-> <listitem
-> <para
-> El puerto Internet utilizado por el cliente <application
->Evolution</application
-> para conectarse a la base de datos LDAP. Normalmente se trata del puerto 389. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Usar SSL/TLS</term
-> <listitem
-> <para
-> Los protocolos SSL y TLS son mecanismos de seguridad. Si elige <guilabel
->Siempre</guilabel
->, el cliente Evolution sólo se conectará cuando estén disponibles conexiones seguras. El valor predeterminado es <guilabel
->Cuando sea posible</guilabel
->, que utiliza conexiones seguras cuando están disponibles, pero también funciona sin problemas en caso contrario. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Base de búsqueda</term
-> <listitem
-> <para
-> La <glossterm linkend="search-base"
->base de búsqueda</glossterm
-> es el punto de partida utilizado para las búsquedas en directorios. Consulte a su administrador para obtener información acerca de las configuraciones adecuadas. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Rango de búsqueda</term
-> <listitem
-> <para
-> La <glossterm linkend="search-scope"
->base de búsqueda</glossterm
-> es la extensión de una búsqueda dada. Las siguientes opciones están disponibles: <variablelist
-> <varlistentry
-> <term
-><guilabel
->Uno</guilabel
-></term
-> <listitem
-> <para
-> Busca dentro de la raíz y un nivel de subdirectorios. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Sub</guilabel
-></term
-> <listitem
-> <para
-> Busca dentro de la raíz y en todos los subdirectorios. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Tiempo de expiración</term
-> <listitem
-> <para
-> Es el tiempo de espera máximo para descargar los datos del servidor, antes de que el cliente Evolution abandone el intento. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Límite de descarga</term
-> <listitem
-> <para
-> El número máximo de resultados para una búsqueda dada. Muchos servidores no aceptan enviar más de 500 respuestas, pero puede fijar un número inferior para reducir el volumen de descargas, en caso de búsquedas muy amplias. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Mostrar nombre</term
-> <listitem
-> <para
-> Este es el nombre que titulará a esta carpeta, y puede ser el nombre que prefiera. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Aceptar</guibutton
->. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Aceptar</guibutton
-> para aplicar permanentemente los cambios o en <guibutton
->Aplicar</guibutton
-> para usarlos temporalmente. </para
-> </listitem
-> </orderedlist>
- <para
-> Editar una cuenta del servidor de directorio significa cambiar la misma información, aunque se muestra en un orden ligeramente diferente. </para>
- </sect1>
-
-
-</chapter>
-
diff --git a/help/es/config-sync.xml b/help/es/config-sync.xml
deleted file mode 100644
index 0c6524d8d8..0000000000
--- a/help/es/config-sync.xml
+++ /dev/null
@@ -1,121 +0,0 @@
- <chapter id="config-sync">
- <title
->Configuración del sistema de sincronización</title
->
- <para
-> Una operación de sincronización plantea dos tipos de problemas que es necesario resolver. <simplelist
-> <member
-> Es necesario que su equipo identifique y tenga acceso al dispositivo de mano. En esta versión, <application
->Ximian Evolution</application
-> sólo reconoce dispositivo Palm-OS, como Palm Pilot y Handspring Visor. </member
-> <member
-> Debe especificar el procedimiento de sincronización que desea utilizar. </member
-> </simplelist
-> </para>
-
- <para
-> Si nunca antes utilizó un dispositivo de mano junto con su equipo, ejecute la herramienta <application
->Centro de control</application
-> de GNOME: seleccione <menuchoice
-><guimenu
->Sistema</guimenu
-><guimenuitem
->Configuración</guimenuitem
-></menuchoice
-> y asegúrese de que la configuración de <application
->Pilot Link</application
-> es correcta. Deberá asegurarse de que dispone de permisos de lectura y escritura para el dispositivo, habitualmente /dev/pilot. Si esto no funciona, compruebe /dev/ttyS0 para saber si tiene una conexión serie, o /dev/ttyUSB0 en el caso de una conexión USB. Para ello, inicie una sesión root y ejecute la orden: <userinput
->chmod 777 /dev/ttyUSB0</userinput
->. </para>
- <para
-> Una vez que su equipo y el dispositivo Palm-OS son capaces de comunicarse con fluidez, seleccione los <glossterm linkend="conduit"
->conductos</glossterm
-> deseados en la sección <guilabel
->Conductos del Pilot</guilabel
-> del centro de control. Los conductos sirven para sincronizar datos de numerosas aplicaciones; los conductos de <application
->Ximian Evolution</application
-> llevan la etiqueta <guilabel
->EAddress</guilabel
-> para los contactos de la libreta de direcciones, <guilabel
->ECalendar</guilabel
->, para el calendario y <guilabel
->ETasks</guilabel
->, para la lista de tareas. </para>
- <para
-> Para habilitar un conducto, haga clic en <guibutton
->Habilitar</guibutton
->, y en <guibutton
->Configuración</guibutton
-> si desea modificar su comportamiento, una vez activado. Las opciones pueden variar en función del conducto, pero son habitualmente las siguientes: <variablelist
-> <varlistentry
-> <term
->Deshabilitado:</term
-> <listitem
-> <para
-> No hacer nada. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Sincronizar:</term
-> <listitem
-> <para
-> Copia los datos nuevos del equipo y del dispositivo de mano en las dos direcciones. Elimina los elementos que se encontraban en los dos sistemas, pero que fueron eliminados en uno de ellos. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Copiar desde Pilot:</term
-> <listitem
-> <para
-> Si el dispositivo de mano contiene datos nuevos, los copia al equipo. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Copiar hacia Pilot:</term
-> <listitem
-> <para
-> Copia los datos nuevos del equipo hacia el dispositivo de mano. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Fusionar desde Pilot:</term
-> <listitem
-> <para
-> Copia los datos nuevos del dispositivo de mano hacia el equipo, y elimina en el equipo la información eliminada en el dispositivo de mano. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Fusionar hacia Pilot:</term
-> <listitem
-> <para
-> Copia los datos nuevos del equipo hacia el dispositivo de mano, y elimina en el dispositivo de mano la información eliminada en el equipo. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
-
- <para
-> Especifique el comportamiento de cada conducto elegido. Si no está seguro, siga adelante, y seleccione <guilabel
->Sincronizar</guilabel
->. A continuación, coloque el dispositivo de mano en su base, y presione el botón HotSync. </para>
- <para
-> <tip
-> <title
->Prevenir la pérdida de datos</title
-> <para
-> Es siempre buena idea hacer una copia de seguridad. Para ello, copie el directorio llamado <filename
->evolution</filename
-> que cuelga de su directorio de inicio. </para
-> </tip
-> </para>
-
- </chapter>
-
-
-
-
-
diff --git a/help/es/evolution-1.4-es.omf b/help/es/evolution-1.4-es.omf
deleted file mode 100644
index 807750e672..0000000000
--- a/help/es/evolution-1.4-es.omf
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<omf>
- <resource>
- <creator>
- Ximian, Inc.
- </creator>
- <title>
- Guía de usuario de Ximian Evolution 1.4
- </title>
- <date>2002-2003</date>
- <subject category="GNOME|Aplicaciones"/>
- <description>
- Una guía de usuario de Ximian Evolution que explica cómo usar
- sus funciones de correo, calendario, libreta de direcciones y
- lista de tareas.
- </description>
- <type>
- manual
- </type>
- <format mime="text/xml" dtd="-//OASIS//DTD DocBook XML V4.1.2//EN"/>
- <identifier url="/"/>
- <language code="es"/>
- <rights type="GNU FDL" license.version="1.1" license="http://www.gnu.org/licenses/fdl.html" holder="Ximian, Inc."/>
- </resource>
-</omf>
diff --git a/help/es/evolution-1.4.xml b/help/es/evolution-1.4.xml
deleted file mode 100644
index 17ffe63a9c..0000000000
--- a/help/es/evolution-1.4.xml
+++ /dev/null
@@ -1,143 +0,0 @@
-<?xml version='1.0' ?>
-
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-
-<!ENTITY GFDL SYSTEM "apx-fdl.xml">
-<!ENTITY LEGAL SYSTEM "legal.xml">
-<!ENTITY GPL SYSTEM "apx-gpl.xml">
-<!ENTITY PREFACE SYSTEM "preface.xml">
-<!ENTITY USAGE-MAINWINDOW SYSTEM "usage-mainwindow.xml">
-<!ENTITY USAGE-EXEC-SUMMARY SYSTEM "usage-exec-summary.xml">
-<!ENTITY USAGE-MAIL SYSTEM "usage-mail.xml">
-<!ENTITY USAGE-MAIL-ORG SYSTEM "usage-mail-org.xml">
-<!ENTITY USAGE-CONTACT SYSTEM "usage-contact.xml">
-<!ENTITY USAGE-CALENDAR SYSTEM "usage-calendar.xml">
-<!ENTITY USAGE-EXCHANGE SYSTEM "usage-exchange.xml">
-<!ENTITY USAGE-SYNC SYSTEM "usage-sync.xml">
-<!ENTITY USAGE-PRINT SYSTEM "usage-print.xml">
-<!ENTITY CONFIG-PREFS SYSTEM "config-prefs.xml">
-<!ENTITY CONFIG-SYNC SYSTEM "config-sync.xml">
-<!ENTITY MENUREF SYSTEM "menuref.xml">
-<!ENTITY APX-GLOSS SYSTEM "apx-gloss.xml">
-<!ENTITY APX-COMMON-TASKS SYSTEM "apx-common-tasks.xml">
-<!ENTITY APX-BUGS SYSTEM "apx-bugs.xml">
-<!ENTITY APX-AUTHORS SYSTEM "apx-authors.xml">
-
-<!ENTITY appversion "1.4">
-<!ENTITY docversion "1.4">
-<!ENTITY pubdate "May, 2003">
-
-]>
-
-<!-- Almost every chapter is an entity. Files, Chapter id's, and
-entity names correspond. APX is for appendix. -->
-
-<book id="index" lang="es">
- <bookinfo>
- <title
->Guía de usuario de Ximian Evolution 1.4</title>
- <authorgroup>
- <author
-><firstname
->Aaron</firstname
-><surname
->Weber</surname
-></author>
- <author
-><firstname
->Kevin</firstname
-><surname
->Breit</surname
-></author>
- <author
-><firstname
->Ettore</firstname
-><surname
->Perazzoli</surname
-></author>
- <author
-><firstname
->Duncan</firstname
-><surname
->Mak</surname
-></author>
- </authorgroup>
- <copyright>
- <year
->2000-2003</year>
- <holder
->Ximian, Inc.</holder>
- </copyright>
-
- <releaseinfo>
- Esta es la &docversion; del manual de Ximian Evolution manual. Describe la versión &appversion; de la herramienta de trabajo en grupo
- Ximian Evolution.
- </releaseinfo>
-
-
- <legalnotice id="legalnotice">
- <para
-> Observe que la información legal y de licencias está en <xref linkend="preface"/> debido a asuntos relativos a la maquetación de su lugar anterior. </para>
- </legalnotice>
- </bookinfo>
-
-
- <preface id="preface">
- <title
->Prefacio</title
->
- &LEGAL;
- &PREFACE;
- </preface>
-
- <part id="usage">
- <title
->Primeros pasos con Ximian Evolution</title>
- <partintro>
- <para
-> La primera parte del manual de <application
->Ximian Evolution</application
-> describe cómo utilizar <application
->Ximian Evolution</application
-> para manejar correo electrónico, gestión de contactos y planificación de citas y de tareas. Conforme avance descubrirá que existen varias formas de hacer las cosas y podrá elegir el método que más le agrade. </para>
- </partintro>
-
- &USAGE-MAINWINDOW;
- &USAGE-EXEC-SUMMARY;
- &USAGE-MAIL;
- &USAGE-MAIL-ORG;
- &USAGE-CONTACT;
- &USAGE-CALENDAR;
- &USAGE-EXCHANGE;
- &USAGE-SYNC;
- &USAGE-PRINT;
- </part>
- <part id="config">
- <title
->Configuración y manejo de Ximian Evolution</title>
- <partintro>
- <para
-> <application
->Ximian Evolution</application
-> es muy configurable. Normalmente cuando un programador dice eso quiere decir que no ha comprobado meticulosamente el sistema y que deben ser otros programadores los que lo <quote
->configuren</quote
-> hasta ponerlo en marcha. En el caso de <application
->Ximian Evolution</application
-> <quote
->configurable</quote
-> significa que, además de poder confiar en la configuración de fábrica del programa, es también muy fácil modificar su comportamiento de múltiples maneras, con el fin de ajustarlo a sus necesidades. Esta parte del libro explica ese proceso, desde una presentación rápida del Asistente de Configuración, hasta una guía paso a paso por la configuración de sus preferencias más peregrinas. </para>
- </partintro>
-
- &CONFIG-PREFS;
- &CONFIG-SYNC;
- </part>
-
- &MENUREF;
- &APX-GLOSS;
- &APX-BUGS;
- &APX-AUTHORS;
- &GPL;
- &GFDL;
-
-</book>
diff --git a/help/es/evolution-doc-1.4.po b/help/es/evolution-doc-1.4.po
deleted file mode 100644
index 210e29ef9b..0000000000
--- a/help/es/evolution-doc-1.4.po
+++ /dev/null
@@ -1,13183 +0,0 @@
-# translation of evolution-doc-1.4.po to español
-# Traducción realizada para LAMBDAUX SOFTWARE SERVICES (http://Lambdaux.com)
-# Ismael Olea <ismael@olea.org>, 2003
-# I.R. Maturana <info@in3activa.com>, 2003
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: evolution-1.4\n"
-"POT-Creation-Date: 2001-02-09 01:25+0100\n"
-"PO-Revision-Date: 2003-10-10 02:54+0200\n"
-"Last-Translator: Ismael Olea <ismael@olea.org>\n"
-"Language-Team: español <es@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.0\n"
-
-#: index.docbook:2
-#, no-c-format
-msgid "Authors"
-msgstr "Autores"
-
-#: index.docbook:2
-#, no-c-format
-msgid "Organizing and Managing your Email"
-msgstr "Organización y administración del correo electrónico"
-
-#: index.docbook:2
-#, no-c-format
-msgid "Printing with Evolution"
-msgstr "Imprimir con Evolution"
-
-#: index.docbook:2
-#, no-c-format
-msgid "Setting up your synchronization system"
-msgstr "Configuración del sistema de sincronización"
-
-#: index.docbook:2
-#, no-c-format
-msgid "Synchronizing Evolution with Hand-Held Devices"
-msgstr "Sincronización de Evolution con dispositivos de mano"
-
-#: index.docbook:2
-#, no-c-format
-msgid "The Ximian Connector for Microsoft Exchange"
-msgstr "Ximian Connector para Microsoft Exchange"
-
-#: index.docbook:2
-#, no-c-format
-msgid "Using Evolution for Email"
-msgstr "Usar el correo electrónico con Evolution"
-
-#: index.docbook:3
-#, no-c-format
-msgid ""
-"<application>Evolution</application> was written by the Ximian Evolution "
-"team and numerous other dedicated GNOME programmers. You can see their names "
-"by selecting <menuchoice> <guimenu>Help</guimenu> <guimenuitem>About</"
-"guimenuitem> </menuchoice> from any Evolution window."
-msgstr ""
-"<application>Evolution</application> ha sido creado por el equipo Ximian "
-"Evolution y otros muchos programadores dedicados a GNOME. Para ver sus "
-"nombres, seleccione <menuchoice> <guimenu>Ayuda</guimenu> "
-"<guimenuitem>Acerca de</guimenuitem> </menuchoice> en cualquiera de las "
-"ventanas de Evolution."
-
-#: index.docbook:3
-#, no-c-format
-msgid "Advanced Configuration"
-msgstr "Configuración avanzada"
-
-#: index.docbook:3
-#, no-c-format
-msgid ""
-"Even if you only get a few email messages a day, you probably want to sort "
-"and organize them. When you get a hundred a day and you want to refer to a "
-"message you received six weeks ago, you <emphasis>need</emphasis> to sort "
-"and organize them. Fortunately, <application>Ximian Evolution</application> "
-"has the tools to help you do it."
-msgstr ""
-"Deseará probablemente organizar sus mensajes, por muy pocos que sean los que "
-"reciba cada día. Cuando cuente con un centenar de ellos, y quiera encontrar "
-"un mensaje de un mes de antig&uuml;edad, le resultará <emphasis>necesario</"
-"emphasis> poner orden y organizar su correo. Afortunadamente, "
-"<application>Ximian Evolution</application> cuenta con las herramientas "
-"necesarias para ayudarle en esta tarea."
-
-#: index.docbook:3
-#, no-c-format
-msgid "Getting Oriented with the Ximian Evolution Summary"
-msgstr "Introducción al Resumen de Ximian Evolution"
-
-#: index.docbook:3 index.docbook:73
-#, no-c-format
-msgid "Getting Started with Ximian Evolution"
-msgstr "Primeros pasos con Ximian Evolution"
-
-#: index.docbook:3
-#, no-c-format
-msgid ""
-"If you've printed from most any other <application>Gnome</application> "
-"application, you should be able to print from <application>Evolution</"
-"application> without much trouble."
-msgstr ""
-"Si ya sabe imprimir con otra aplicación <application>Gnome</application>, "
-"también será capaz de hacerlo con <application>Evolution</application> sin "
-"mayor problema."
-
-#: index.docbook:3
-#, no-c-format
-msgid "Known bugs and limitations"
-msgstr "Fallos conocidos y limitaciones"
-
-#: index.docbook:3
-#, no-c-format
-msgid "Legal Information and Licensing"
-msgstr "Información legal y condiciones de licencia"
-
-#: index.docbook:3
-#, no-c-format
-msgid "Synchronization presents you with two issues you'll need to address."
-msgstr ""
-"Una operación de sincronización plantea dos tipos de problemas que es "
-"necesario resolver."
-
-#: index.docbook:3
-#, no-c-format
-msgid ""
-"The Ximian Connector for Microsoft Exchange allows Ximian Evolution clients "
-"to access accounts on Microsoft Exchange 2000 servers. It is available "
-"through Ximian Red Carpet in its own channel, but cannot be used without a "
-"license file. The license file may be purchased from the Ximian online store "
-"at <ulink url=\"http://store.ximian.com\">store.ximian.com</ulink>. Unlike "
-"the regular Ximian Evolution client, the Ximian Connector for Microsoft "
-"Exchange is proprietary software and source code is not available."
-msgstr ""
-"Ximian Connector para Microsoft Exchange permite a los clientes Ximian "
-"Evolution tener acceso a cuentas de servidores Microsoft Exchange 2000. La "
-"aplicación está disponible, en su propio canal, a través de Ximian Red "
-"Carpet, pero su utilización requiere un archivo de licencia. Puede adquirir "
-"el archivo de licencia en la tienda en línea de Ximian, en la dirección "
-"<ulink url=\"http://store.ximian.com\">store.ximian.com</ulink>. A "
-"diferencia del cliente Ximian Evolution normal, el programa Ximian Connector "
-"para Microsoft Exchange es un software propietario cuyo código fuente no "
-"está disponible."
-
-#: index.docbook:3
-#, no-c-format
-msgid ""
-"This chapter is very short. It describes how to synchronize the data on your "
-"Palm-OS device with the data you store in <application>Ximian Evolution</"
-"application>. If you need information on how to set up handheld "
-"synchronization, consult <xref linkend=\"config-sync\"/>."
-msgstr ""
-"Este capítulo es muy breve. Describe cómo sincronizar los datos almacenados "
-"en su dispositivo Palm-OS y <application>Ximian Evolution</application>, "
-"respectivamente. Si necesita información acerca de cómo configurar la "
-"sincronización de un dispositivo de mano, consulte <xref linkend=\"config-"
-"sync\"/>."
-
-#: index.docbook:3
-#, no-c-format
-msgid ""
-"This chapter, and <xref linkend=\"usage-mail-organize\"/>, will provide you "
-"with an in-depth guide to the capabilities of Evolution as a mail client. "
-"For information about how to set up your mail account, see <xref linkend="
-"\"config-prefs-mail\"/>."
-msgstr ""
-"Este capítulo, así como <xref linkend=\"usage-mail-organize\"/>, le ofrece "
-"una guía en profundidad de las posibilidades de Evolution como cliente de correo. "
-"Para saber más sobre cómo configurar su cuenta de correo consulte "
-"<xref linkend=\"config-prefs-mail\"/>."
-
-#: index.docbook:3
-#, no-c-format
-msgid "You should decide what sort of synchronization behavior you want."
-msgstr "Debe especificar el procedimiento de sincronización que desea utilizar."
-
-#: index.docbook:3
-#, no-c-format
-msgid ""
-"Your computer needs to recognize and access your handheld. At this time, "
-"<application>Ximian Evolution</application> only supports Palm-OS devices "
-"like the Palm Pilot and the Handspring Visor."
-msgstr ""
-"Es necesario que su equipo identifique y tenga acceso al dispositivo de "
-"mano. En esta versión, <application>Ximian Evolution</application> sólo "
-"reconoce dispositivo Palm-OS, como Palm Pilot y Handspring Visor."
-
-#: index.docbook:4
-#, no-c-format
-msgid "Organization"
-msgstr "Organización"
-
-#: index.docbook:4
-#, no-c-format
-msgid ""
-"Perhaps your mail server has changed names. Perhaps you've grown tired of a "
-"certain layout for your appointments. Whatever the reason, you want to "
-"change your <application>Evolution</application> settings. This chapter will "
-"tell you how to do just that."
-msgstr ""
-"Quizás su servidor de correo haya cambiado de nombre. Quizás se cansó de "
-"siempre utilizar la misma presentación de citas. Sea cual sea la razón "
-"puede, que quiera cambiar sus configuraciones de <application>Evolution</"
-"application>. Este capítulo le explicará cómo hacerlo."
-
-#: index.docbook:5
-#, no-c-format
-msgid ""
-"This book is divided into two parts, with several appendices. The first part "
-"is a <link linkend=\"usage\">guided tour</link>, which will explain how to "
-"use <application>Evolution</application>. If you are new to "
-"<application>Evolution</application> or to groupware in general, this "
-"section is for you. The second section, covering <link linkend=\"config"
-"\">configuration</link>, is targeted at more advanced users, but anyone who "
-"wants to change the way <application>Evolution</application> looks or acts "
-"can benefit from reading it."
-msgstr ""
-"Este libro se divide en dos partes, más varios anexos. La primera parte es "
-"una <link linkend=\"usage\">guía paso a paso</link> que le explicará cómo "
-"utilizar <application>Evolution</application>. Si no está familiarizado con "
-"<application>Evolution</application> o las aplicaciones de trabajo en grupo "
-"en general, esta sección es para usted. La segunda parte describe la "
-"configuración y está orientada a usuarios más avanzados, pero cualquiera que "
-"quiera cambiar la apariencia o comportamiento de <application>Evolution</"
-"application> sacará provecho de su lectura."
-
-#: index.docbook:5
-#, no-c-format
-msgid ""
-"Ximian Evolution bug tracking is done at the <ulink url=\"http://bugzilla."
-"ximian.com\">Ximian bug tracking System</ulink>. You may use that, or the "
-"GNOME <application>Bug Report Tool</application> (known as <command>bug-"
-"buddy</command> at the command line) if you find bugs or would like to "
-"request new features."
-msgstr ""
-"El control de calidad de Ximian Evolution se realiza desde la <ulink url="
-"\"http://bugzilla.ximian.com\">base de datos de partes de Ximian</ulink>. Si "
-"encuentra algún defecto o si quiere sugerir alguna nueva funcionalidad puede "
-"utilizarla o bien optar por la <application>herramienta de información de "
-"errores</application> de GNOME (conocida como <command>bug-buddy</command> "
-"en la línea de órdenes)."
-
-#: index.docbook:6
-#, no-c-format
-msgid "Managing your Schedule"
-msgstr "Planificación del horario"
-
-#: index.docbook:6
-#, no-c-format
-msgid "Quick Reference"
-msgstr "Referencia rápida"
-
-#: index.docbook:6
-#, no-c-format
-msgid "Using the Summary"
-msgstr "Uso de la herramienta Resumen"
-
-#: index.docbook:6
-#, no-c-format
-msgid "What is Ximian Evolution, and What Can It Do for Me?"
-msgstr "Qué es Ximian Evolution y qué puede hacer por mí"
-
-#: index.docbook:6
-#, no-c-format
-msgid "Working with Your Contacts"
-msgstr "Trabajar con contactos"
-
-#: index.docbook:7
-#, no-c-format
-msgid ""
-"Information is useless unless it's organized and accessible; it's hardly "
-"even worth the name if you can't look at it and be <emphasis>informed</"
-"emphasis>. The goal of <application>Ximian Evolution</application> is to "
-"make the tasks of storing, organizing, and retrieving your personal "
-"information easier, so you can work and communicate with others. That is, "
-"it's a highly evolved <glossterm linkend=\"groupware\">groupware</glossterm> "
-"program, an integral part of the Internet-connected desktop."
-msgstr ""
-"Una información desorganizada y de difícil acceso es inútil; no puede "
-"llamarse así si tras consultarla no queda <emphasis>informado</emphasis>. El "
-"objetivo de <application>Ximian Evolution</application> es simplificar las "
-"tareas de almacenamiento, organización y recuperación de su información "
-"personal, con el fin de poder trabajar y comunicarse con otras personas. Se "
-"trata por tanto de un programa muy evolucionado de <glossterm linkend="
-"\"groupware\">trabajo en grupo</glossterm>, una parte integral de su "
-"escritorio de trabajo conectado a Internet."
-
-#: index.docbook:7
-#, no-c-format
-msgid ""
-"The Ximian Evolution Summary can show you what you need to know quickly. It "
-"will show you your tasks for that day, how many emails are waiting for you, "
-"and much more."
-msgstr ""
-"El Resumen de Ximian Evolution puede mostrar todo lo que necesite saber con "
-"rapidez. Le mostrará las tareas de la jornada, cuánto correo tiene pendiente "
-"y mucho más."
-
-#: index.docbook:7
-#, no-c-format
-msgid ""
-"This chapter will show you how to use the <application>Evolution</"
-"application> addressbook to organize any amount of contact information, "
-"share addresses over a network, and several ways to save time with everyday "
-"tasks. To learn about configuring the addressbook, see <xref linkend="
-"\"config-prefs-contact\"/>. You can import contacts from other contact "
-"management tools with the Import tool by selecting "
-"<menuchoice><guimenu>File</guimenu><guimenuitem>Import</guimenuitem></"
-"menuchoice>, or by mailing them to yourself as vCard attachments."
-msgstr ""
-"Este capítulo describe la utilización de la libreta de direcciones de "
-"<application>Evolution</application>, y explica cómo organizar cualquier "
-"cantidad de contactos, compartir direcciones a través de una red así como "
-"aprovechar las numerosas soluciones que ofrece para ahorrar tiempo en las "
-"tareas cotidianas. Acerca de la configuración de la libreta de direcciones, "
-"consulte <xref linkend=\"config-prefs-contact\"/>. Para importar los "
-"contactos de otras herramientas, utilice la herramienta Importar: para ello "
-"seleccione <menuchoice><guimenu>Archivo</guimenu><guimenuitem>Importar</"
-"guimenuitem></menuchoice>, o envíeselas por correo como adjuntos en formato "
-"vCard."
-
-#: index.docbook:7
-#, no-c-format
-msgid ""
-"You might want to copy this section and tape it to the wall next to your "
-"computer: it's a very short summary of most of the things you'll want to do "
-"with <application>Ximian Evolution</application>."
-msgstr ""
-"Quizás le convenga imprimir esta sección y pegarla a la pared a proximidad "
-"de su ordenador. Se trata de un resumen muy corto de la mayoría de las "
-"posibilidades que le ofrece <application>Ximian Evolution</application>."
-
-#: index.docbook:8
-#, no-c-format
-msgid ""
-"This chapter will show you how to use the Ximian Evolution Calendar to "
-"manage your schedule alone or in conjunction with peers. To learn about "
-"importing calendar data, see <xref linkend=\"importing-mail\"/>, which "
-"covers the Import tool."
-msgstr ""
-"Este capítulo explica cómo usar el calendario de Ximian Evolution para "
-"planificar su horario individual o en función de sus compañeros. Para saber "
-"cómo importar información del calendario consulte "
-"<xref linkend=\"importing-mail\"/>, que describe la herramienta de importación."
-
-#: index.docbook:9
-#, no-c-format
-msgid ""
-"Whether you're printing a message, a calendar page, or a selection of "
-"address cards, you can choose to print directly to a printer, or save the "
-"print output to a <glossterm linkend=\"postscript\">postscript</glossterm> "
-"file. You can also use the preview feature to see how your printed output "
-"will look."
-msgstr ""
-"Si va a imprimir un mensaje, una página del calendario o una selección de "
-"tarjetas de visita puede elegir entre hacerlo directamente a la impresora o "
-"guardar el resultado de la impresión en un archivo <glossterm linkend="
-"\"postscript\">PostScript</glossterm>. También puede utilizar la función de "
-"vista previa de impresión, para examinar el resultado antes de imprimir."
-
-#: index.docbook:9
-#, no-c-format
-msgid "Ximian Evolution is Free Software"
-msgstr "Ximian Evolution es software libre"
-
-#: index.docbook:9
-#, no-c-format
-msgid ""
-"Ximian Evolution is licensed under the terms of the GNU General Public "
-"License (GPL), and its documentation is licensed separately under the GNU "
-"Free Documentation License (GFDL). You can find a the complete text of the "
-"GPL in <xref linkend=\"apx-gpl\"/>, and of the GFDL in <xref linkend=\"apx-"
-"fdl\"/>. The licenses are also available in the files COPYING and COPYING-"
-"DOCS distributed with this software. The Ximian Connector for Microsoft "
-"Exchange 2000 is proprietary software and is subject to a different license. "
-"Copyright for all three pieces of software and their documentation belongs "
-"to Ximian, Inc."
-msgstr ""
-"Ximian Evolution se licencia según los términos de la Licencia Pública General de GNU "
-"(GPL) y su documentación se licencia separadamente según la Licencia de Documentación "
-"Libre de GNU (GFDL). Encontrará el texto completo de la GPL en "
-"<xref linkend=\"apx-gpl\"/> y el de la GFDL en <xref linkend=\"apx-fdl\"/>. "
-"Los mismos textos están disponibles en los archivos COPYING y COPYING-DOCS "
-"distribuidos con este software. The Ximian Connector for Microsoft "
-"Exchange 2000 es software propietario y está sujeto a una licencia diferente. El "
-"Copyright de ambas piezas de software y de su documentación pertenecen a Ximian, Inc."
-
-#: index.docbook:10
-#, no-c-format
-msgid ""
-"If you chose IMAP mail during the setup process, you must subscribe to your "
-"mail folders before you can read mail in them. Read <xref linkend=\"usage-"
-"mail-subscriptions\"/> to find out how."
-msgstr ""
-"Si durante el proceso de configuración IMAP eligió usar el correo IMAP debe suscribirse "
-"a sus carpetas de correo si quiere poder leer su correo en ellas. Consulte"
-"<xref linkend=\"usage-mail-subscriptions\"/> para saber cómo hacerlo."
-
-#: index.docbook:10
-#, no-c-format
-msgid "If you use IMAP Mail"
-msgstr "S usa correo IMAP"
-
-#: index.docbook:10
-#, no-c-format
-msgid ""
-"The <application>Evolution</application> code owes a great debt to the "
-"<application>GNOME-pim</application> and <application>GNOME-Calendar</"
-"application> applications, and to <application>KHTMLW</application>. The "
-"developers of <application>Evolution</application> acknowledge the efforts "
-"and contributions of all who worked on those projects."
-msgstr ""
-"El código de <application>Evolution</application> mantiene una gran deuda "
-"con las aplicaciones <application>GNOME-pim</application> y "
-"<application>GNOME-Calendar</application>, así como con <application>KHTMLW</"
-"application>. Los desarrolladores de <application>Evolution</application> "
-"reconocen los esfuerzos y contribuciones de todos los que trabajaron en "
-"estos proyectos."
-
-#: index.docbook:11
-#, no-c-format
-msgid ""
-"Evolution 1.2 brings with it a redesigned comprehensive settings window that "
-"you can open by choosing <menuchoice> <guimenu>Tools</guimenu> "
-"<guimenuitem>Settings</guimenuitem></menuchoice>, no matter where you are in "
-"Evolution. On the left half of the settings window is a column, similar to "
-"the Evolution shortcut bar, which lets you choose which portion of Evolution "
-"to customize. The right half of the window is where you'll make your actual "
-"changes."
-msgstr ""
-"El cuadro de diálogo de configuración de Evolution 1.2 ha sido rediseñado "
-"hasta el último detalle. Puede abrirlo con <menuchoice> "
-"<guimenu>Herramientas</guimenu> <guimenuitem>Configuración</guimenuitem></"
-"menuchoice> desde cualquier lugar de Evolution. La parte izquierda de la "
-"ventana tiene una columna, parecida a la barra de atajos, donde puede "
-"seleccionar la parte de Evolution que desea personalizar. La parte derecha "
-"es donde realmente realizará cambios."
-
-#: index.docbook:12
-#, no-c-format
-msgid "Appointments"
-msgstr "Citas"
-
-#: index.docbook:12
-#, no-c-format
-msgid "Mail summary"
-msgstr "Resumen de correo"
-
-#: index.docbook:12
-#, no-c-format
-msgid "News feeds from the Internet"
-msgstr "Titulares periodísticos a través de Internet"
-
-# #-#-#-#-# usage-mainwindow.po (usage-mainwindow) #-#-#-#-#
-# index.docbook:1017, index.docbook:1249
-#: index.docbook:12 index.docbook:1055
-#, no-c-format
-msgid "Tasks"
-msgstr "Tareas"
-
-#: index.docbook:12
-#, no-c-format
-msgid ""
-"To begin using your Summary, click on the <guilabel>Shortcut Bar</guilabel> "
-"or <guilabel>Summary</guilabel> at the top of the <guilabel>Folder Bar</"
-"guilabel>. By default, you will see:"
-msgstr ""
-"Para ver el Resumen haga clic en la barra de <guilabel>Atajos</guilabel> o "
-"en <guilabel>Resumen</guilabel>, al principio de la barra de "
-"<guilabel>Carpetas</guilabel>. La configuración de fábrica incluye:"
-
-#: index.docbook:12
-#, no-c-format
-msgid "Using HotSync"
-msgstr "Uso de la función HotSync"
-
-#: index.docbook:12
-#, no-c-format
-msgid "Weather Reports"
-msgstr "Informe meteorológico"
-
-#: index.docbook:13
-#, no-c-format
-msgid ""
-"If you need additional help with Ximian Evolution, please visit the Ximian "
-"support site at <ulink url=\"http://support.ximian.com\">ximian.com/support</"
-"ulink>."
-msgstr ""
-"Si necesita ayuda adicional sobre Ximian Evolution, visite la web de "
-"asistencia técnica en <ulink url=\"http://support.ximian.com\">support."
-"ximian.com</ulink>."
-
-#: index.docbook:13
-#, no-c-format
-msgid "Importing Your Old Email and Settings"
-msgstr "Importación de la configuración y de los mensajes existentes"
-
-#: index.docbook:13
-#, no-c-format
-msgid "Put your hand-held device in its cradle and press the HotSync button."
-msgstr "Coloque el dispositivo de mano en su base, y presione el botón HotSync."
-
-#: index.docbook:14
-#, no-c-format
-msgid ""
-"<application>Evolution</application> allows you to import old email and data "
-"so that you don't need to worry about losing your old information."
-msgstr ""
-"<application>Evolution</application> permite importar mensajes y otros datos "
-"existentes: no tendrá que preocuparse por la pérdida de información anterior."
-
-#: index.docbook:15
-#, no-c-format
-msgid "Custom Keyboard Shortcuts"
-msgstr "Atajos de teclado personalizados"
-
-#: index.docbook:15
-#, no-c-format
-msgid ""
-"For example, if you have chosen Emacs-style key bindings for your desktop-"
-"wide text editor, the shortcut <keycombo action=\"simul\"> <keycap>Ctrl</"
-"keycap> <keycap>W</keycap> </keycombo> will act as \"Cut region\" rather "
-"than as \"Close Window\" in the message composer."
-msgstr ""
-"Por ejemplo, si ha elegido las combinaciones de teclas al estilo Emacs para "
-"el editor de textos de su escritorio, entonces la combinación de teclas "
-"<keycombo action=\"simul\"> <keycap>Ctrl</keycap> <keycap>W</keycap> </"
-"keycombo> actuará en el editor de mensajes como <quote>cortar área</quote> "
-"en lugar de <quote>cerrar ventana</quote>."
-
-#: index.docbook:15
-#, no-c-format
-msgid ""
-"If you have set custom keyboard shortcuts for your desktop, (you can do this "
-"the control center: select <menuchoice><guimenu>System</"
-"guimenu><guimenuitem>Settings</guimenuitem></menuchoice> from your menu "
-"panel), they may interfere with Evolution keyboard shortcuts."
-msgstr ""
-"Si ha personalizado los atajos de teclado en su escritorio (puede hacerlo a "
-"través del centro de control: elija <menuchoice><guimenu>Sistema</"
-"guimenu><guimenuitem>Configuración</guimenuitem></menuchoice> en el menú del "
-"panel) es posible que éstos interfieran con los de Evolution."
-
-#: index.docbook:16
-#, no-c-format
-msgid "Requirements"
-msgstr "Requisitos"
-
-#: index.docbook:16
-#, no-c-format
-msgid "Ways of Looking at your Calendar"
-msgstr "Opciones de la vista de calendario"
-
-#: index.docbook:17
-#, no-c-format
-msgid "<para> Day </para>"
-msgstr "<para> Día </para>"
-
-#: index.docbook:17
-#, no-c-format
-msgid "Month"
-msgstr "<para> Mes </para>"
-
-#: index.docbook:17
-#, no-c-format
-msgid "The toolbar offers you four different views of your calendar:"
-msgstr "La barra de herramientas ofrece cuatro vistas diferentes para el calendario:"
-
-#: index.docbook:17
-#, no-c-format
-msgid "Week"
-msgstr "Semana"
-
-#: index.docbook:17 index.docbook:763
-#, no-c-format
-msgid "Work Week"
-msgstr "Semana laboral"
-
-#: index.docbook:17
-#, no-c-format
-msgid ""
-"Ximian Connector works only with Exchange 2000, and requires that Outlook "
-"Web Access be enabled. Each user will need a valid Microsoft Exchange 2000 "
-"server account, including license."
-msgstr ""
-"Ximian Connector sólo funciona con Exchange 2000, y requiere habilitar el "
-"componente Outlook Web Access. Cada usuario debe disponer de una cuenta "
-"válida en el servidor Microsoft Exchange 2000, incluida la licencia."
-
-#: index.docbook:18
-#, no-c-format
-msgid ""
-"If you use Palm OS v. 4.0 and have password protection turned on for your "
-"handheld device, you may encounter trouble synchronizing. If this happens, "
-"try turning off password protection on your handheld, synchronize it with "
-"your desktop computer, and then re-enable password protection on your "
-"handheld."
-msgstr ""
-"Si utiliza un dispositivo de mano Palm OS v. 4.0 y activó la protección por "
-"contraseña, es posible que se produzcan problemas durante la sincronización. "
-"En este caso, intente desactivar la protección por contraseña de su "
-"dispositivo de mano, realice la sincronización con su equipo de sobremesa, y "
-"vuelva a habilitar la protección del dispositivo."
-
-#: index.docbook:18
-#, no-c-format
-msgid ""
-"In other words, <application>Ximian Evolution</application> is a tool to "
-"help you get your work done. It can help you work in a group by handling "
-"email, address and other contact information, and one or more calendars. It "
-"can do that on one or several computers, connected directly or over a "
-"network, for one person or for large groups."
-msgstr ""
-"En otras palabras, <application>Ximian Evolution</application> es una herramienta "
-"para ayudarle a hacer su trabajo. Puede ayudarle a trabajar en "
-"grupo manejando su correo electrónico, sus direcciones y otra información de "
-"contacto y uno o más calendarios. Funciona en uno o varios sistemas "
-"conectados en local o en red, para uso individual o en grupos de gran "
-"tamaño."
-
-#: index.docbook:18
-#, no-c-format
-msgid "Palm OS v. 4.0 with Passwords"
-msgstr "Contraseñas de Palm OS v. 4.0"
-
-# index.docbook:18, index.docbook:45, index.docbook:46
-#: index.docbook:18 index.docbook:45 index.docbook:46
-#, no-c-format
-msgid "Print Preview"
-msgstr "Vista previa de impresión"
-
-#: index.docbook:19
-#, no-c-format
-msgid ""
-"<guibutton>Print Preview</guibutton> appears both as a button in the "
-"printing dialog and as an item in the <guimenu>File</guimenu> menu. In both "
-"places, it does the same thing: it opens a new window that shows you what "
-"would happen if you were to print the current message, calendar, "
-"appointment, or address card."
-msgstr ""
-"<guibutton>Previsualizar la impresión</guibutton> aparece tanto como un "
-"botón en el cuadro de diálogo de impresión con un elemento del menú "
-"<guimenu>Archivo</guimenu>. La función es la misma en ambos casos: muestra "
-"una imagen del resultado de impresión del mensaje, hoja de calendario, cita "
-"o tarjeta de visita que tiene en pantalla."
-
-#: index.docbook:19
-#, no-c-format
-msgid ""
-"Ximian would like to thank everyone who helped out with the bug tracking "
-"process, particularly Miles Lane, and also the staff of El Pelon Taqueria, "
-"on Peterborough St. in Boston, for sustenance."
-msgstr ""
-"Ximian quiere agradecer a todos los que ayudaron en el proceso de depuración "
-"de errores del programa, en particular a Miles Lane y al personal de El "
-"Pelon Taqueria, en la calle Peterborough, en Boston, por el sustento."
-
-#: index.docbook:20
-#, no-c-format
-msgid ""
-"Click <guibutton>New Contact</guibutton> to create a new card, or double-"
-"click in a blank space in the contact list."
-msgstr ""
-"Haga clic en <guibutton>Contacto nuevo</guibutton> para crear una nueva "
-"tarjeta, o haga doble-clic en un espacio en blanco dentro de la lista de "
-"contactos."
-
-#: index.docbook:20
-#, no-c-format
-msgid ""
-"Click <guibutton>New List</guibutton> to create a new card, or double-click "
-"in a blank space in the contact list."
-msgstr ""
-"Haga clic en <guibutton>Lista de contactos</guibutton> para crear una nueva "
-"tarjeta, o haga doble-clic en un espacio en blanco de la lista."
-
-#: index.docbook:20
-#, no-c-format
-msgid ""
-"If you haven't used a handheld device with your computer before, you'll need "
-"to run the GNOME <application>Control Center</application> by selecting "
-"<menuchoice><guimenu>System</guimenu><guimenuitem>Settings</guimenuitem></"
-"menuchoice>, and make sure that <application>Pilot Link</application> is "
-"properly configured. You will need to make sure that you have read and write "
-"permissions on the device, which is normally /dev/pilot. If that does not "
-"work, check /dev/ttyS0 if you have a serial connection, or /dev/ttyUSB0 for "
-"a USB connection. You can do this by becoming root and running the command: "
-"<userinput>chmod 777 /dev/ttyUSB0</userinput>."
-msgstr ""
-"Si nunca antes utilizó un dispositivo de mano junto con su equipo, ejecute "
-"la herramienta <application>Centro de control</application> de GNOME: "
-"seleccione <menuchoice><guimenu>Sistema</guimenu><guimenuitem>Configuración</"
-"guimenuitem></menuchoice> y asegúrese de que la configuración de "
-"<application>Pilot Link</application> es correcta. Deberá asegurarse de que "
-"dispone de permisos de lectura y escritura para el dispositivo, "
-"habitualmente /dev/pilot. Si esto no funciona, compruebe /dev/ttyS0 para "
-"saber si tiene una conexión serie, o /dev/ttyUSB0 en el caso de una conexión "
-"USB. Para ello, inicie una sesión root y ejecute la orden: <userinput>chmod "
-"777 /dev/ttyUSB0</userinput>."
-
-#: index.docbook:20
-#, no-c-format
-msgid "Importing Email and Other Data"
-msgstr "Importar correo electrónico y otros datos"
-
-#: index.docbook:20
-#, no-c-format
-msgid ""
-"The <guiicon>printer</guiicon> icon sends one or more of your cards to the "
-"printer."
-msgstr ""
-"El icono de la <guiicon>impresora</guiicon> permite imprimir una o varias "
-"tarjetas."
-
-#: index.docbook:20
-#, no-c-format
-msgid ""
-"The <guiicon>stop sign</guiicon> icon stops loading contact data from the "
-"network. This button is only relevant if you are looking at contact "
-"information on a network."
-msgstr ""
-"El icono con la señal de <guiicon>Stop</guiicon> interrumpe la descarga de "
-"los contactos desde la red. Este botón sólo es relevante si está consultando "
-"los contactos desde una red."
-
-#: index.docbook:20
-#, no-c-format
-msgid "The toolbar for the addressbook is quite simple."
-msgstr "La barra de herramientas de la libreta de direcciones es muy sencilla."
-
-#: index.docbook:21 index.docbook:564
-#, no-c-format
-msgid ""
-"<application>Ximian Evolution</application> can import the following types "
-"of files:"
-msgstr ""
-"<application>Ximian Evolution</application> puede importar los siguientes "
-"tipos de archivos:"
-
-#: index.docbook:21
-#, no-c-format
-msgid ""
-"A complete list of feature requests and other issues with Evolution is "
-"available online in the Ximian bug tracking system. You can learn more about "
-"the Ximian Evolution development process at <ulink url=\"http://developer."
-"ximian.com\">developer.ximian.com</ulink>."
-msgstr ""
-"En la web tiene disponible una lista completa de solicitudes de "
-"características y otros asuntos en la base de datos de partes de Ximian. "
-"Puede aprender más sobre el proceso de desarrollo de Ximian Evolution en "
-"<ulink url=\"http://developer.ximian.com\">developer.ximian.com</ulink>."
-
-#: index.docbook:21
-#, no-c-format
-msgid ""
-"A format for storing calendar files. iCalendar is used by PalmOS based "
-"handhelds, Ximian <application>Evolution</application>, and Microsoft "
-"<application>Outlook</application>."
-msgstr ""
-"Un formato utilizado para almacenar archivos de calendario. iCalendar es el "
-"programa utilizado por equipos de bolsillo PalmOS, así como Ximian "
-"<application>Evolution</application>, y Microsoft <application>Outlook</"
-"application>."
-
-#: index.docbook:21
-#, no-c-format
-msgid "A standard data format for address book cards."
-msgstr "Un formato de datos estándar para tarjetas de visita."
-
-#: index.docbook:21 index.docbook:564
-#, no-c-format
-msgid ""
-"Email file format used by Microsoft Outlook Express 4. For other versions of "
-"Microsoft Outlook and Outlook Express, see the workaround described in the "
-"note below."
-msgstr ""
-"El formato de archivos de Microsoft Outlook Express 4. Para otras versiones "
-"de Microsoft Outlook y Outlook Express, vea la solución descrita en la nota "
-"siguiente."
-
-#: index.docbook:21
-#, no-c-format
-msgid "LDAP Data Interchange Format (LDIF):"
-msgstr "Formato de intercambio de datos de LDAP (LDIF):"
-
-#: index.docbook:21 index.docbook:564
-#, no-c-format
-msgid "MBox (mbox):"
-msgstr "MBox (mbox):"
-
-#: index.docbook:21 index.docbook:564
-#, no-c-format
-msgid "Microsoft Outlook Express 4 (.mbx):"
-msgstr "Microsoft Outlook Express 4 (.mbx):"
-
-#: index.docbook:21 index.docbook:564
-#, no-c-format
-msgid ""
-"The addressbook format used by the GNOME, KDE, and many other contact "
-"management applications. You should be able to export to VCard format from "
-"any address book application."
-msgstr ""
-"El formato de libreta utilizado por los programas GNOME, KDE así como "
-"numerosas aplicaciones de administración de contactos. Será necesario poder "
-"exportar a formato VCard la libreta de direcciones de su otra aplicación."
-
-#: index.docbook:21 index.docbook:564
-#, no-c-format
-msgid ""
-"The email box format used by Mozilla, Netscape, Ximian Evolution, Eudora, "
-"and many other email clients."
-msgstr ""
-"El formato de buzón de correo utilizado por los programas Mozilla, Netscape, "
-"Ximian Evolution, Eudora y muchos otros clientes de correo electrónico."
-
-#: index.docbook:21 index.docbook:564
-#, no-c-format
-msgid "VCard (.vcf, gcrd):"
-msgstr "VCard (.vcf, gcrd):"
-
-#: index.docbook:21
-#, no-c-format
-msgid "iCalendar (.ics):"
-msgstr "iCalendar (.ics):"
-
-# #-#-#-#-# usage-exchange.po #-#-#-#-#
-# index.docbook:342, index.docbook:514
-#: index.docbook:22
-#, no-c-format
-msgid "Reading Mail"
-msgstr "Leer correo electrónico"
-
-#: index.docbook:23
-#, no-c-format
-msgid ""
-"Start the mail client by clicking on the <guibutton>Inbox</guibutton> icon "
-"in the shortcut bar, or by selecting a mail folder in the folder bar. To "
-"read a message, select it in the message list; if you'd like to see it in "
-"its own window, double-click on it or press <keycombo action=\"simul\"> "
-"<keycap>Ctrl</keycap> <keycap>O</keycap> </keycombo>."
-msgstr ""
-"Lance el cliente de correo haciendo clic sobre el icono <guibutton>Bandeja de entrada</guibutton> "
-"en la barra de atajos o eligiendo una carpeta de correo de la barra de carpetas. Para leer "
-"un mensaje elíjalo de la lista de mensajes y si quiere verlo en su propia ventana hágale un "
-"doble clic o pulse <keycombo action=\"simul\"> <keycap>Ctrl</keycap> "
-"<keycap>O</keycap> </keycombo>."
-
-#: index.docbook:25
-#, no-c-format
-msgid ""
-"Permission is granted to copy, distribute and/or modify this document under "
-"the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any "
-"later version published by the Free Software Foundation with no Invariant "
-"Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy "
-"of the GFDL in <xref linkend=\"apx-fdl\"/> or in the file COPYING-DOCS "
-"distributed with this manual."
-msgstr ""
-"Se concede permiso para copiar, distribuir y/o modificar este documento "
-"según los términos de la <quote lang=\"en\">GNU Free Documentation License</"
-"quote> (Licencia GNU de Documentación Libre) versión 1.1 o cualquiera "
-"posterior publicada por la Free Software Foundation sin secciones "
-"invariantes ni textos de portada o contraportada. En el apéndice <xref "
-"linkend=\"apx-fdl\"/> encontrará una copia de la <citetitle>GNU Free "
-"Documentation License</citetitle>. También puede obtener una copia de la "
-"misma en el archivo COPYING-DOCS distribuido con este manual."
-
-#: index.docbook:25
-#, no-c-format
-msgid "What's New in Connector &appversion;"
-msgstr "¿Qué novedades hay en Connector &appversion;?"
-
-# index.docbook:29, index.docbook:30
-#: index.docbook:26 index.docbook:27
-#, no-c-format
-msgid "Changing Mail Settings"
-msgstr "Modificación de la configuración del correo"
-
-#: index.docbook:26
-#, no-c-format
-msgid ""
-"For more information please visit the <application>Evolution</application> "
-"<ulink url=\"http://www.ximian.com/products/ximian_evolution/\" type=\"http"
-"\">Web page</ulink>. Please send all comments, suggestions, and bug reports "
-"to the <ulink url=\"http://bugzilla.ximian.com\" type=\"http\">Ximian bug "
-"tracking database</ulink>. Instructions for submitting bug reports can be "
-"found on-line at the same location. You can also use the GNOME bug report "
-"tool, <command>bug-buddy</command>, to submit your defect reports."
-msgstr ""
-"Para obtener más información visite por favor la <ulink url=\"http://www."
-"ximian.com/products/ximian_evolution/\" type=\"http\">página web</ulink> de "
-"<application>Evolution</application>. Por favor envíenos todos sus "
-"comentarios, sugerencias e informes de error a la <ulink url=\"http://"
-"bugzilla.ximian.com\" type=\"http\">base de datos de partes de Ximian</"
-"ulink>. Encontrará instrucciones sobre cómo se hace en esa misma dirección. "
-"También puede utilizar la herramienta de información de errores de GNOME "
-"<command>bug-buddy</command> para enviar notificaciones de fallos."
-
-#: index.docbook:26
-#, no-c-format
-msgid ""
-"Ximian Connector &appversion; has added the <guilabel>Out of Office</"
-"guilabel> feature and an automatic configuration tool for large Exchange "
-"deployments."
-msgstr ""
-"Ximian Connector &appversion; incluye la función <guilabel>Out of Office</guilabel> y "
-"una herramienta de configuración automática para grandes instalaciones Exchange."
-
-#: index.docbook:27
-#, no-c-format
-msgid ""
-"That window allows you to select which pages you want to see, and how close "
-"you'd like to look at them. Zoom in or out, fit the page to the window (the "
-"<guibutton>Fit</guibutton> button) or match the width of the page and the "
-"window (the <guibutton>Fit Width</guibutton> button). None of these buttons "
-"changes the way the page will be printed, but they do let you get a better "
-"look. If you're satisfied with the way the your paper looks, click "
-"<guibutton>Print</guibutton> to send your document on its way. If you'd like "
-"to change it, just close the <guilabel>Print Preview</guilabel> window and "
-"make the changes you want from your mail, calendar, or addressbook."
-msgstr ""
-"La ventana le permite seleccionar las páginas que desea examinar y con qué "
-"detalle. Puede alejar o acercar la vista, ajustar la página a la ventana "
-"(con <guibutton>Encajar</guibutton>) o ajustar el ancho de la página con el "
-"de la ventana (con <guibutton>Enc. ancho</guibutton>). Ninguno de estos "
-"botones modifican la manera en que la página será impresa pero le permiten "
-"verla mejor. Si le satisface el resultado, haga clic en <guibutton>Imprimir</"
-"guibutton> para imprimir el documento. Para modificarlo, sólo tiene que "
-"cerrar la ventana <guilabel>Previsualizar la impresión</guilabel> y realizar "
-"los cambios que desee en su documento de correo, calendario o libreta de "
-"direcciones."
-
-#: index.docbook:27
-#, no-c-format
-msgid ""
-"With <application>Ximian Evolution</application>, you can accomplish your "
-"most common daily tasks faster. For example, it takes only one or two clicks "
-"to enter an appointment or an address card sent to you by email, or to send "
-"email to a contact or appointment. <application>Ximian Evolution</"
-"application> makes displays faster and more efficient, so searches are "
-"faster and memory usage is lower. People who get lots of mail will "
-"appreciate advanced features like <link linkend=\"usage-mail-organize-"
-"vfolders\"><trademark>VFolders</trademark></link>, which let you save "
-"searches as though they were ordinary mail folders."
-msgstr ""
-"<application>Ximian Evolution</application> permite realizar la mayoría de "
-"las tareas diarias más rápidamente. Por ejemplo, agregar una nueva cita o "
-"enviar una tarjeta de visita por correo electrónico o escribir a un contacto "
-"sólo requiere hacer clic un par de veces. <application>Ximian Evolution</"
-"application> muestra la información en la pantalla más rápida y eficazmente, "
-"las búsquedas son más veloces y el consumo de memoria, menor. Los usuarios "
-"que reciban cantidades ingentes de correo apreciarán características "
-"avanzadas como las <trademark>carpetas virtuales</trademark> que permiten "
-"guardar búsquedas como si fueran carpetas de correo convencionales."
-
-#: index.docbook:28
-#, no-c-format
-msgid ""
-"If you have followed the set up instructions properly, your Palm-OS device "
-"will synchronize data with <application>Ximian Evolution</application>."
-msgstr ""
-"Si siguió las instrucciones de configuración adecuadamente, los datos de su "
-"dispositivo Palm-OS se podrán sincronizar con <application>Ximian Evolution</"
-"application>."
-
-#: index.docbook:32
-#, no-c-format
-msgid ""
-"Previous versions of Ximian Connector for Microsoft Exchange added support "
-"for the <guibutton>Flag for Followup</guibutton> feature, public folders, "
-"delegation, direct booking, and more. For information on setting up "
-"delegation, see <xref linkend=\"exchange-delegate\"/>."
-msgstr ""
-"Las versiones anteriores de Ximian Connector for Microsoft Exchange incluyen la prestación "
-"<guibutton>Marca de seguimiento</guibutton>, carpetas públicas, delegación , reserva "
-"directa, etc. Para saber cómo configurar la delegación examine "
-"<xref linkend=\"exchange-delegate\"/>."
-
-#: index.docbook:33
-#, no-c-format
-msgid ""
-"Once your computer and your Palm-OS device are talking happily to each "
-"other, select the <glossterm linkend=\"conduit\">conduits</glossterm> you "
-"want under the <guilabel>Pilot Conduits</guilabel> section of the Control "
-"Center. You may use conduits to synchronize data with several applications; "
-"the <application>Ximian Evolution</application> conduits are labeled "
-"<guilabel>EAddress</guilabel>, for the contacts in your addressbook, "
-"<guilabel>ECalendar</guilabel>, for your calendar, and <guilabel>ETodo</"
-"guilabel>, for your task list."
-msgstr ""
-"Una vez que su equipo y el dispositivo Palm-OS son capaces de comunicarse "
-"con fluidez, seleccione los <glossterm linkend=\"conduit\">conductos</"
-"glossterm> deseados en la sección <guilabel>Conductos del Pilot</guilabel> "
-"del centro de control. Los conductos sirven para sincronizar datos de "
-"numerosas aplicaciones; los conductos de <application>Ximian Evolution</"
-"application> llevan la etiqueta <guilabel>EAddress</guilabel> para los "
-"contactos de la libreta de direcciones, <guilabel>ECalendar</guilabel>, para "
-"el calendario y <guilabel>ETasks</guilabel>, para la lista de tareas."
-
-#: index.docbook:34
-#, no-c-format
-msgid "That's it."
-msgstr "Eso es todo."
-
-#: index.docbook:35
-#, no-c-format
-msgid "Calendar and Tasks"
-msgstr "Calendario y tareas"
-
-#: index.docbook:35
-#, no-c-format
-msgid "Composer Preferences"
-msgstr "Editor de correo"
-
-#: index.docbook:35
-#, no-c-format
-msgid "Directory Servers"
-msgstr "Servidores de directorio"
-
-#: index.docbook:35
-#, no-c-format
-msgid "Exchange Delegation"
-msgstr "Delegación de Exchange"
-
-#: index.docbook:35 index.docbook:458
-#, no-c-format
-msgid "Folder Settings"
-msgstr "Carpetas"
-
-#: index.docbook:35
-#, no-c-format
-msgid ""
-"Here, add or change information about your email accounts: the servers to "
-"which you connect, the way you download mail, your password authentication "
-"mode, and so forth. This is the most complex item in the list, and is "
-"covered in <xref linkend=\"config-prefs-mail-identity\"/>."
-msgstr ""
-"Declare o modifique los datos de su cuentas de correo electrónico: los "
-"servidores a los que debe acceder, la manera en la que se baje el correo, el "
-"modo en que se autentique, etc. Este es el elemento más complejo de la lista "
-"y está descrito en <xref linkend=\"config-prefs-mail-identity\"/>."
-
-#: index.docbook:35
-#, no-c-format
-msgid ""
-"Here, you can choose the default folders for various components of "
-"Evolution, the folders that will be cached locally when you go to offline "
-"mode, and the folders that Evolution will use when it is searching for "
-"autocompletion information as you address a mail."
-msgstr ""
-"Puede configurar carpetas predeterminadas para varios componentes de "
-"Evolution, las carpetas que serán colocadas en caché en el disco local "
-"cuando esté en el modo desconectado y las carpetas en dónde se harán las "
-"búsquedas para autocompletar direcciones de correo electrónico."
-
-#: index.docbook:35
-#, no-c-format
-msgid ""
-"Here, you can set the way the calendar behaves, including your time zone and "
-"the length of your work-week."
-msgstr ""
-"Puede especificar el funcionamiento del calendario, como la zona horaria y "
-"duración de su semana laboral."
-
-#: index.docbook:35
-#, no-c-format
-msgid "Mail Accounts"
-msgstr "Cuentas de correo"
-
-#: index.docbook:35
-#, no-c-format
-msgid "Mail Preferences"
-msgstr "Opciones de correo"
-
-#: index.docbook:35
-#, no-c-format
-msgid "Out of Office"
-msgstr "Estoy fuera"
-
-#: index.docbook:35
-#, no-c-format
-msgid ""
-"Set the mail folders, news feeds, schedule summary length, and weather "
-"locations to be displayed here. For news feeds, enter the web address of any "
-"RDF file. Summary customization is covered in <xref linkend=\"customizing-"
-"summary\"/> rather than in this chapter."
-msgstr ""
-"Configura qué carpetas, titulares de noticias, longitud del resumen de "
-"planificación y qué informes meteorológicos se mostrarán. Para agregar "
-"nuevos servidores de titulares de noticias escriba la dirección URL de "
-"cualquier archivo RDF. La personalización del resumen se describe en "
-" <xref linkend=\"customizing-summary\"/> en lugar de en este capítulo."
-
-#: index.docbook:35
-#, no-c-format
-msgid ""
-"Settings for the way that you use the mail composer: shortcuts, signatures, "
-"spelling, and so forth. One fun feature here is the ability to substitute "
-"graphical smiley-faces for \"emoticons\" such as :) that many people use in "
-"email. This tool is covered in <xref linkend=\"config-prefs-mail-composer\"/"
-">."
-msgstr ""
-"Define la manera en la que quiere usar el editor de correo: atajos, firmas, "
-"corrección ortográfica, etc. Una función entretenida es la capacidad de "
-"sustituir caritas o \"emoticones\" como :-), que mucha gente utiliza en el "
-"correo electrónico. Esta herramienta está descrita en <xref linkend=\"config-"
-"prefs-mail-composer\"/>."
-
-#: index.docbook:35
-#, no-c-format
-msgid "Summary Preferences"
-msgstr "Configuración del resumen"
-
-#: index.docbook:35
-#, no-c-format
-msgid "There are eight items you can customize. From top to bottom, they are:"
-msgstr "Es posible personalizar ocho elementos, que describimos de arriba a abajo:"
-
-#: index.docbook:35
-#, no-c-format
-msgid ""
-"These are overall mail reading preferences: display settings, notification "
-"options, security, and so forth. Settings that vary per-account are in the "
-"Mail Accounts tool, described in <xref linkend=\"config-prefs-mail-identity"
-"\"/>, but most of the mail settings are here."
-msgstr ""
-"Estas son las preferencias de lectura de correo generales: opciones para la "
-"representación, notificación, seguridad, etc. Las opciones que dependen de cada"
-"cuenta están en la herramienta Cuentas de Correo descrita en "
-"<xref linkend=\"config-prefs-mail-identity\"/>, pero la mayoría de las opciones de correo "
-"están aquí."
-
-#: index.docbook:35
-#, no-c-format
-msgid ""
-"This item allows you to enter account information for connecting to remote "
-"directory (LDAP) servers."
-msgstr ""
-"Este elemento permite introducir los datos de la cuenta necesaria para conectarse "
-"con servidores de directorio (LDAP) remotos."
-
-#: index.docbook:35
-#, no-c-format
-msgid ""
-"This item will only appear if you have Ximian Connector for Microsoft "
-"Exchange installed. It allows you to create and remove automatic \"vacation"
-"\" messages. For information about how to use this feature, read <xref "
-"linkend=\"exchange-out-of-office\"/>."
-msgstr ""
-"Este elemeno aparecerá solamente si tiene instalado Ximian Connector for Microsoft "
-"Exchange. Permite crear y borrar automáticamente mensajes de «fuera por vacaciones». "
-"Para saber cómo usar esta característica lea <xref linkend=\"exchange-out-of-office\"/>."
-
-#: index.docbook:35
-#, no-c-format
-msgid ""
-"This item will only appear if you have Ximian Connector for Microsoft "
-"Exchange installed. It will allow you to choose who has access to your "
-"Exchange account. This feature is covered in <xref linkend=\"exchange-"
-"delegate\"/>."
-msgstr ""
-"Este elemento aparecerá solamente si tiene instalado Ximian Connector for Microsoft "
-"Exchange. Permite elegir quién puede tener acceso a su cuenta Exchange. Esta "
-"característica está descrita en <xref linkend=\"exchange-delegate\"/>."
-
-#: index.docbook:35
-#, no-c-format
-msgid ""
-"This manual is part of a collection of GNOME manuals distributed under the "
-"GFDL. If you want to distribute this manual separately from the collection, "
-"you can do so by adding a copy of the license to the manual, as described in "
-"section 6 of the license."
-msgstr ""
-"Este manual forma parte de la colección de manuales de GNOME distribuidos "
-"según la licencia GFDL. Si quiere distribuirlo independientemente de la colección "
-"puede hacerlo añadiendo al manual una copia de la licencia, según se indica en la sección "
-"6 de la licencia."
-
-#: index.docbook:36
-#, no-c-format
-msgid "Reading Mail with the Keyboard"
-msgstr "Leyendo correo mediante el teclado"
-
-#: index.docbook:36
-#, no-c-format
-msgid ""
-"You can click the space bar to page down while you're reading an email, and "
-"press backspace to page up in an email. This may help to make reading your "
-"email faster."
-msgstr ""
-"Al leer un mensaje puede pulsar la barra de espacio para avanzar y la tecla retroceso "
-"para retroceder una página. Esto le puede ayudar a leer su correo más rápidamente."
-
-#: index.docbook:36
-#, no-c-format
-msgid ""
-"You can navigate the message list by pressing the arrow keys up and down. To "
-"jump to the next unread message, press the <keycap>.</keycap> (period) or "
-"<keycap>]</keycap> (close bracket) key. You can go to the previous unread "
-"message with <keycap>,</keycap> (comma) or <keycap>[</keycap> (open bracket)."
-msgstr ""
-"Puede navegar por la lista de mensajes usando las teclas de las flechas arriba y abajo. "
-"Para saltar al siguiente mensaje pulse la tecla <keycap>.</keycap> (punto) o "
-"<keycap>]</keycap> (cerrar corchete). Puede saltar al mensaje anterior pulsando "
-"<keycap>,</keycap> (coma) o <keycap>[</keycap> (cerrar corechete)."
-
-#: index.docbook:38
-#, no-c-format
-msgid "A User's Guide to Ximian Evolution 1.4"
-msgstr "Guía de usuario de Ximian Evolution 1.4"
-
-#: index.docbook:38
-#, no-c-format
-msgid ""
-"This manual was written by Aaron Weber (<email>aaron@ximian.com</email>), "
-"Kevin Breit (<email>mrproper@ximian.com</email>) Duncan Mak "
-"(<email>duncan@ximian.com</email>) and Ettore Perazzoli "
-"(<email>ettore@ximian.com</email>) with the help of the application "
-"programmers and the GNOME Documentation Project. Special thanks to Baris "
-"Cicek for proofreading."
-msgstr ""
-"Este manual ha sido escrito por Aaron Weber (<email>aaron@ximian.com</"
-"email>), Kevin Breit (<email>mrproper@ximian.com</email>) Duncan Mak "
-"(<email>duncan@ximian.com</email>) y Ettore Perazzoli (<email>ettore@ximian."
-"com</email>) con la ayuda de los programadores de la aplicación y del "
-"Proyecto de Documentación de GNOME. Gracias especialmente a Baris Cicek por "
-"la revisión del texto."
-
-#: index.docbook:40
-#, no-c-format
-msgid "<firstname>Aaron</firstname><surname>Weber</surname>"
-msgstr "<firstname>Aaron</firstname><surname>Weber</surname>"
-
-#: index.docbook:40
-#, no-c-format
-msgid "Opening or Creating Anything"
-msgstr "Apertura y cierre de elementos"
-
-#: index.docbook:41
-#, no-c-format
-msgid "<firstname>Kevin</firstname><surname>Breit</surname>"
-msgstr "<firstname>Kevin</firstname><surname>Breit</surname>"
-
-# index.docbook:41, index.docbook:293
-#: index.docbook:41 index.docbook:293
-#, no-c-format
-msgid ""
-"<menuchoice><guimenu>File</guimenu> <guisubmenu>New</guisubmenu> "
-"<guimenuitem>Appointment</guimenuitem> </menuchoice> or <keycombo action="
-"\"simul\"> <keycap>Ctrl</keycap> <keycap>Shift</keycap> <keycap>A</keycap> </"
-"keycombo>"
-msgstr ""
-"<menuchoice><guimenu>Archivo</guimenu> <guisubmenu>Nuevo</guisubmenu> "
-"<guimenuitem>Cita</guimenuitem> </menuchoice> o <keycombo action=\"simul\"> "
-"<keycap>Ctrl</keycap> <keycap>Mayús</keycap> <keycap>A</keycap> </keycombo>"
-
-#: index.docbook:41
-#, no-c-format
-msgid ""
-"<menuchoice><guimenu>File</guimenu> <guisubmenu>New</guisubmenu> "
-"<guimenuitem>Shortcut</guimenuitem> </menuchoice> or <keycombo action=\"simul"
-"\"> <keycap>Ctrl</keycap> <keycap>Shift</keycap> <keycap>S</keycap> </"
-"keycombo>"
-msgstr ""
-"<menuchoice><guimenu>Archivo</guimenu> <guisubmenu>Nuevo</guisubmenu> "
-"<guimenuitem>Atajo</guimenuitem> </menuchoice> o <keycombo action=\"simul\"> "
-"<keycap>Ctrl</keycap> <keycap>Mayús</keycap> <keycap>S</keycap> "
-"</keycombo>"
-
-# index.docbook:41, index.docbook:293
-#: index.docbook:41 index.docbook:293
-#, no-c-format
-msgid ""
-"<menuchoice><guimenu>File</guimenu> <guisubmenu>New</guisubmenu> "
-"<guimenuitem>Task</guimenuitem> </menuchoice> or <keycombo action=\"simul\"> "
-"<keycap>Ctrl</keycap> <keycap>Shift</keycap> <keycap>T</keycap> </keycombo>"
-msgstr ""
-"<menuchoice><guimenu>Archivo</guimenu> <guisubmenu>Nuevo</guisubmenu> "
-"<guimenuitem>Tarea</guimenuitem> </menuchoice> o <keycombo action=\"simul\"> "
-"<keycap>Ctrl</keycap> <keycap>Mayús</keycap> <keycap>T</keycap> </keycombo>"
-
-#: index.docbook:41
-#, no-c-format
-msgid ""
-"<menuchoice><guimenu>File</guimenu><guisubmenu>New</guisubmenu> "
-"<guimenuitem>Folder</guimenuitem></menuchoice> or <keycombo action=\"simul"
-"\"> <keycap>Ctrl</keycap> <keycap>Shift </keycap> <keycap>E</keycap> </"
-"keycombo>"
-msgstr ""
-"<menuchoice><guimenu>Archivo</guimenu><guisubmenu>Nuevo</guisubmenu> "
-"<guimenuitem>Carpeta</guimenuitem></menuchoice> o <keycombo action=\"simul"
-"\"> <keycap>Ctrl</keycap> <keycap>Mayús</keycap> <keycap>E</keycap> </"
-"keycombo>"
-
-# index.docbook:41, index.docbook:293
-#: index.docbook:41 index.docbook:293
-#, no-c-format
-msgid "Create a new Appointment:"
-msgstr "Creación de una nueva cita:"
-
-#: index.docbook:41
-#, no-c-format
-msgid "Create a new Shortcut in the Evolution Bar:"
-msgstr "Creación de un atajo nuevo en la Barra de Evolution:"
-
-# index.docbook:41, index.docbook:293
-#: index.docbook:41 index.docbook:293
-#, no-c-format
-msgid "Create a new Task:"
-msgstr "Creación de una tarea nueva:"
-
-#: index.docbook:41
-#, no-c-format
-msgid "Create a new email message:"
-msgstr "Creación de un nuevo mensaje de correo electrónico:"
-
-#: index.docbook:41
-#, no-c-format
-msgid "Create a new folder:"
-msgstr "Creación de una carpeta nueva:"
-
-# index.docbook:41, index.docbook:348
-#: index.docbook:41 index.docbook:348
-#, no-c-format
-msgid ""
-"Double-click in any blank space in the contact manager to create a new "
-"address card. You can also use <menuchoice><guimenu>File</guimenu> "
-"<guisubmenu>New</guisubmenu> <guimenuitem>Contact</guimenuitem> </"
-"menuchoice> or <keycombo action=\"simul\"> <keycap>Ctrl</keycap> "
-"<keycap>Shift</keycap> <keycap>C</keycap> </keycombo>"
-msgstr ""
-"Haga doble clic en cualquier lugar vacío del administrador de contactos para "
-"crear una nueva tarjeta de visita. También puede utilizar: "
-"<menuchoice><guimenu>Archivo</guimenu> <guisubmenu>Nuevo</guisubmenu> "
-"<guimenuitem>Contacto</guimenuitem> </menuchoice> o la combinación de teclas "
-"<keycombo action=\"simul\"> <keycap>Ctrl</keycap> <keycap>Mayús</keycap> "
-"<keycap>C</keycap> </keycombo>"
-
-#: index.docbook:41
-#, no-c-format
-msgid "Enter a new Contact:"
-msgstr "Creación de un nuevo contacto:"
-
-#: index.docbook:41
-#, no-c-format
-msgid "New Item:"
-msgstr "Nuevo elemento:"
-
-#: index.docbook:41
-#, no-c-format
-msgid ""
-"Press <keycombo action=\"simul\"> <keycap>Ctrl</keycap> <keycap>N</keycap> </"
-"keycombo> to open a new item for whatever part of <application>Ximian "
-"Evolution</application> you're working on. In mail, that means you'll create "
-"a new message. If you're looking at your addressbook, <keycombo action="
-"\"simul\"> <keycap>Ctrl</keycap> <keycap>N</keycap> </keycombo> creates a "
-"new contact card, and in the calendar, a new appointment."
-msgstr ""
-"Presione la combinación de teclas <keycombo action=\"simul\"> <keycap>Ctrl</"
-"keycap> <keycap>N</keycap> </keycombo> para abrir un elemento nuevo desde "
-"cualquier lugar de la aplicación <application>Ximian Evolution</application> "
-"donde se encuentre. En el contexto del correo, la orden abrirá un mensaje "
-"nuevo. Si consulta su lista de direcciones, la tecla <keycombo action=\"simul"
-"\"> <keycap>Ctrl</keycap> <keycap>N</keycap> </keycombo> creará una nueva "
-"tarjeta para un contacto; y en calendario, se abrirá una nueva cita."
-
-#: index.docbook:41
-#, no-c-format
-msgid ""
-"Use <menuchoice><guimenu>File</guimenu><guisubmenu>New</"
-"guisubmenu><guimenuitem>Mail Message</guimenuitem> </menuchoice> or "
-"<keycombo action=\"simul\"> <keycap>Ctrl</keycap> <keycap>Shift </keycap> "
-"<keycap>M</keycap> </keycombo>"
-msgstr ""
-"<menuchoice><guimenu>Archivo</guimenu><guisubmenu>Nuevo</guisubmenu> "
-"<guimenuitem>Mensaje de correo </guimenuitem> </menuchoice> o <keycap>Ctrl</"
-"keycap> <keycap>Mayús</keycap> <keycap>M</keycap>."
-
-#: index.docbook:42
-#, no-c-format
-msgid "<firstname>Ettore</firstname><surname>Perazzoli</surname>"
-msgstr "<firstname>Ettore</firstname><surname>Perazzoli</surname>"
-
-#: index.docbook:42
-#, no-c-format
-msgid ""
-"Press the calendar-shaped buttons on the right side of the toolbar to switch "
-"between views."
-msgstr ""
-"Para cambiar entre diferentes vistas, haga clic en los botones con formas de "
-"calendario a la derecha de la barra de tareas."
-
-#: index.docbook:42
-#, no-c-format
-msgid ""
-"Ximian is a registered trademark and Ximian Evolution, the dancing monkey "
-"logo and the Ximian capsule logo are trademarks of Ximian, Inc. Other names "
-"may be trademarks or registered trademarks of other companies or "
-"organizations. Where those names appear in any GNOME documentation, and the "
-"members of the GNOME Documentation Project are made aware of those "
-"trademarks, then the names are in capital letters or initial capital letters."
-msgstr ""
-"Ximian es una marca comercial registrada y Ximian Evolution, el logo del chango bailón y el logo "
-"de la cápsula Ximian son marcas comerciales de Ximian, Inc. Otros nombres en el texto "
-"pueden ser marcas comerciales registradas de otras compañías u organizaciones. "
-"Cuando dichos nombres aparezcan en la documentación de GNOME lo harán en mayúsculas, "
-"siempre que los miembros del Proyecto de Documentación de GNOME estén "
-"advertidos de ello."
-
-#: index.docbook:43
-#, no-c-format
-msgid "<firstname>Duncan</firstname><surname>Mak</surname>"
-msgstr "<firstname>Duncan</firstname><surname>Mak</surname>"
-
-#: index.docbook:43
-#, no-c-format
-msgid "Connector Features"
-msgstr "Características del componente Connector"
-
-#: index.docbook:43
-#, no-c-format
-msgid "The First Time you Start Ximian Evolution"
-msgstr "Primeros pasos con Ximian Evolution"
-
-#: index.docbook:43
-#, no-c-format
-msgid ""
-"Your contact information fills the rest of the display. Move through the "
-"cards alphabetically with the buttons and the scrollbar to the right of the "
-"window. Of course, if you have more than a few people listed, you'll want "
-"some way of finding them more quickly, which is why there's a search feature."
-msgstr ""
-"Los datos de sus contactos llenan el resto de la pantalla. Puede desplazarse "
-"de una tarjeta a otra por orden alfabético con la ayuda de los cursores y de "
-"la barra de desplazamiento a la derecha de la ventana. Por supuesto, si la "
-"lista incluye un número importante de entradas, querrá utilizar la función "
-"de búsqueda prevista, para encontrarlas más rápidamente."
-
-#: index.docbook:44 index.docbook:408
-#, no-c-format
-msgid "<para> </para>"
-msgstr "<para> </para>"
-
-#: index.docbook:44
-#, no-c-format
-msgid "<para></para>"
-msgstr "<para></para>"
-
-#: index.docbook:44
-#, no-c-format
-msgid "Adding VCards to Address Book"
-msgstr "Agregar tarjetas de visita a la libreta de direcciones"
-
-#: index.docbook:44
-#, no-c-format
-msgid "Adding iCalendar Meeting Requests to Calendar"
-msgstr "Agregar solicitudes de reuniones iCalendar a Calendar"
-
-#: index.docbook:44
-#, no-c-format
-msgid "Address Completion"
-msgstr "Función autocompletar para direcciones"
-
-#: index.docbook:44
-#, no-c-format
-msgid ""
-"Allows Evolution users to schedule meetings and view attendee availability "
-"for other users (Evolution or Outlook users) on Exchange."
-msgstr ""
-"Permite a los usuarios del cliente <application>Evolution</application> "
-"programar sus reuniones y examinar en <application>Exchange</application> la "
-"disponibilidad de asistencia de otros usuarios (que usen <application>Evolution</application> "
-"o <application>Outlook</application>)."
-
-#: index.docbook:44
-#, no-c-format
-msgid ""
-"Allows you to access mail, address book (including Global Address List "
-"folder), and calendars, and task folders on an Exchange 2000 server from "
-"Evolution."
-msgstr ""
-"El cliente <application>Evolution</application> permite tener acceso al "
-"correo, a la libreta de direcciones (incluso a la carpeta de la lista global "
-"de direcciones) así como a las carpetas de calendarios y tareas en un"
-"servidor <application>Exchange 2000</application>."
-
-#: index.docbook:44 index.docbook:292 index.docbook:1055
-#, no-c-format
-msgid "Calendar"
-msgstr "Calendario"
-
-#: index.docbook:44 index.docbook:1055
-#, no-c-format
-msgid "Contacts"
-msgstr "Contactos"
-
-#: index.docbook:44
-#, no-c-format
-msgid "General"
-msgstr "General"
-
-#: index.docbook:44
-#, no-c-format
-msgid ""
-"If you receive a VCard attachment and click <guibutton>Save in Address Book</"
-"guibutton>, it will be saved to your Exchange address book."
-msgstr ""
-"Si recibe una tarjeta adjunta y hace clic en <guibutton>Guardar en la "
-"libreta de direcciones</guibutton>, se incluirá en su en la libreta de direcciones "
-"<application>Exchange</application>."
-
-#: index.docbook:44
-#, no-c-format
-msgid ""
-"If you receive an iCalendar meeting request and add it to your calendar, it "
-"will be saved to your Exchange calendar."
-msgstr ""
-"Si recibe una solicitud de reunión con iCalendar y la agrega a su "
-"calendario, quedará guardada dentro de su calendario"
-"<application>Exchange</application>."
-
-#: index.docbook:44
-#, no-c-format
-msgid ""
-"In addition to the features listed above, <application>Ximian Connector</"
-"application> supports the following basic <application>Microsoft Exchange</"
-"application> features:"
-msgstr ""
-"Además de las enumeradas, <application>Ximian Connector</application> es "
-"compatible con las siguientes características básicas de "
-"<application>Microsoft Exchange</application>:"
-
-#: index.docbook:44 index.docbook:1055
-#, no-c-format
-msgid "Mail"
-msgstr "Correo"
-
-#: index.docbook:44
-#, no-c-format
-msgid "Meeting Request/Proposal"
-msgstr "Solicitud y convocatoria de reunión"
-
-#: index.docbook:44
-#, no-c-format
-msgid ""
-"New Address Book entries can be created on Exchange from received email "
-"messages with a single click"
-msgstr ""
-"Desde los mensajes recibidos puede crear nuevas entradas en la libreta de direcciones de "
-"<application>Exchange</application> con un sólo clic."
-
-#: index.docbook:44
-#, no-c-format
-msgid "Palm synchronization"
-msgstr "Sincronización con Palm"
-
-#: index.docbook:44
-#, no-c-format
-msgid "Remote <application>Exchange</application> Information Store"
-msgstr "Almacén remoto de información de <application>Exchange</application>"
-
-#: index.docbook:44
-#, no-c-format
-msgid ""
-"Select <menuchoice><guimenu>Programs</guimenu> <guimenuitem>Evolution</"
-"guimenuitem> </menuchoice> from your menu panel."
-msgstr ""
-"Elija <menuchoice><guimenu>Programas</guimenu> <guimenuitem>Evolution</"
-"guimenuitem> </menuchoice> desde el menú del panel."
-
-#: index.docbook:44
-#, no-c-format
-msgid "Sending Email via Exchange Protocols"
-msgstr "Envío de correo mediante protocolos Exchange"
-
-#: index.docbook:44
-#, no-c-format
-msgid "Supported for Contacts and Calendars on Exchange."
-msgstr "Compatibilidad con los contactos y calendarios de Exchange."
-
-#: index.docbook:44
-#, no-c-format
-msgid ""
-"Supported for your Exchange Contacts folder. Not yet supported for the "
-"Global Address List."
-msgstr ""
-"Compatible con la carpeta Contactos de <application>Exchange</application>. "
-"No está disponible aún para la lista global de direcciones."
-
-#: index.docbook:44
-#, no-c-format
-msgid ""
-"To start <application>Ximian Evolution</application>, do either of the "
-"following:"
-msgstr ""
-"Puede iniciar <application>Ximian Evolution</application> de una de estas "
-"maneras:"
-
-#: index.docbook:44
-#, no-c-format
-msgid "Type <command>evolution</command> at the command line."
-msgstr "Escriba <command>evolution</command> en la línea de órdenes."
-
-#: index.docbook:44
-#, no-c-format
-msgid "Viewing Mail in Exchange Folder"
-msgstr "Leer correo en una carpeta <application>Exchange</application>"
-
-#: index.docbook:44
-#, no-c-format
-msgid ""
-"You may use the Microsoft Exchange mail transport protocol to send email. "
-"Make sure that the address you have entered as your email address is exactly "
-"the one that the Exchange server has on file. This may be "
-"\"yourname@exchange-server.ximian.com\" rather than \"yourname@ximian.com.\""
-msgstr ""
-"Puede utilizar el protocolo de transporte de correo de Microsoft Exchange "
-"para enviar correo. Asegúrese de que la dirección de correo electrónico que "
-"utiliza coincide con la que registró en el servidor Exchange. Puede que sea "
-"«minombre@exchange-server.ximian.com» en lugar de «minombre@ximian."
-"com»."
-
-#: index.docbook:45
-#, no-c-format
-msgid "Copy From Pilot:"
-msgstr "Copiar desde Pilot:"
-
-#: index.docbook:45
-#, no-c-format
-msgid "Copy To Pilot:"
-msgstr "Copiar hacia Pilot:"
-
-#: index.docbook:45
-#, no-c-format
-msgid ""
-"Copy new data from the computer to the handheld, and from the handheld to "
-"the computer. Remove items that were on both systems but have been deleted "
-"on one."
-msgstr ""
-"Copia los datos nuevos del equipo y del dispositivo de mano en las dos "
-"direcciones. Elimina los elementos que se encontraban en los dos sistemas, "
-"pero que fueron eliminados en uno de ellos."
-
-#: index.docbook:45
-#, no-c-format
-msgid ""
-"Copy new data from the computer to the handheld, and remove any information "
-"from the handheld that has been deleted on the computer."
-msgstr ""
-"Copia los datos nuevos del equipo hacia el dispositivo de mano, y elimina en "
-"el dispositivo de mano la información eliminada en el equipo."
-
-#: index.docbook:45
-#, no-c-format
-msgid "Copy new data from the computer to the handheld."
-msgstr "Copia los datos nuevos del equipo hacia el dispositivo de mano."
-
-#: index.docbook:45
-#, no-c-format
-msgid ""
-"Copy new data from the handheld to the computer, and remove any information "
-"from the computer that has been deleted on the handheld."
-msgstr ""
-"Copia los datos nuevos del dispositivo de mano hacia el equipo, y elimina en "
-"el equipo la información eliminada en el dispositivo de mano."
-
-#: index.docbook:45
-#, no-c-format
-msgid "Disabled:"
-msgstr "Deshabilitado:"
-
-#: index.docbook:45
-#, no-c-format
-msgid "Do nothing."
-msgstr "No hacer nada."
-
-#: index.docbook:45
-#, no-c-format
-msgid "If there is any new data on the the handheld device, copy it to the computer."
-msgstr "Si el dispositivo de mano contiene datos nuevos, los copia al equipo."
-
-#: index.docbook:45
-#, no-c-format
-msgid "Merge From Pilot:"
-msgstr "Fusionar desde Pilot:"
-
-#: index.docbook:45
-#, no-c-format
-msgid "Merge To Pilot:"
-msgstr "Fusionar hacia Pilot:"
-
-#: index.docbook:45
-#, no-c-format
-msgid "Synchronize:"
-msgstr "Sincronizar:"
-
-#: index.docbook:45
-#, no-c-format
-msgid ""
-"To enable a conduit, click the <guibutton>Enable</guibutton> to enable it, "
-"and click <guibutton>Settings</guibutton> to change what it will do when "
-"activated. Your options may vary depending on the conduit, but typically "
-"they will be:"
-msgstr ""
-"Para habilitar un conducto, haga clic en <guibutton>Habilitar</guibutton>, y "
-"en <guibutton>Configuración</guibutton> si desea modificar su "
-"comportamiento, una vez activado. Las opciones pueden variar en función del "
-"conducto, pero son habitualmente las siguientes:"
-
-#: index.docbook:46
-#, no-c-format
-msgid "Customizing the Summary's Modules"
-msgstr "Personalización de los módulos del Resumen"
-
-#: index.docbook:46
-#, no-c-format
-msgid ""
-"You can also select an arbitrary range of days in the small calendar at the "
-"upper right. To do this, click and drag on the days that you wish to view in "
-"your calendar."
-msgstr ""
-"Puede elegir cualquier rango de días en el pequeño calendario a la derecha "
-"debajo de la barra de tareas. Sólo tiene que hacer clic y agrupar con el "
-"ratón las fechas que desea."
-
-#: index.docbook:47
-#, no-c-format
-msgid ""
-"<application>Evolution's</application> modules can be customized to suit "
-"your needs. For example, you can choose which mail boxes are summarized, and "
-"which news services appear."
-msgstr ""
-"Los módulos de <application>Evolution</application> pueden personalizarse "
-"para satisfacer sus necesidades. Por ejemplo puede elegir qué buzones de "
-"correo resumir y qué servicios de noticias quiere que aparezcan."
-
-#: index.docbook:47
-#, no-c-format
-msgid ""
-"Please file comments and suggestions for this manual as bugs in the Ximian "
-"bug tracking system. If you contributed to this project but do not see your "
-"name here, please contact Aaron Weber (<email>aaron@ximian.com</email>) and "
-"he'll list you."
-msgstr ""
-"Puede enviar comentarios y sugerencias acerca de este manual como partes en el sistema "
-"de gestión de partes de Ximian. Si ha contribuido a este proyecto pero no ve su nombre "
-"aquí, diríjase a Aaron Weber (<email>aaron@ximian.com</email>) y el le añadirá."
-
-#: index.docbook:47
-#, no-c-format
-msgid "Ximian, Inc."
-msgstr "Ximian, Inc."
-
-#: index.docbook:51
-#, no-c-format
-msgid ""
-"The <guibutton>Prev</guibutton> and <guibutton>Next</guibutton> buttons will "
-"move you forward and back in your calendar pages. If you're looking at only "
-"one day, you'll see tomorrow's page, or yesterday's. If you're looking at "
-"your calendar by week or month, you'll move around by just that much. To "
-"come back to today's listing, click the <guibutton>Today</guibutton> button "
-"in the toolbar."
-msgstr ""
-"Los botones <guibutton>Volver</guibutton> y <guibutton>Avanzar</guibutton> "
-"sirven para desplazarse adelante y atrás por las páginas del calendario. Por "
-"ejemplo, en la vista de un único día, se desplazará al día anterior, o al "
-"día siguiente, respectivamente. En el resto de las vistas, el desplazamiento "
-"se realizará en función del número de días correspondiente a cada vista. "
-"Para volver al día de hoy haga clic en <guibutton>Ir a hoy</guibutton> en la "
-"barra de tareas."
-
-#: index.docbook:52
-#, no-c-format
-msgid "The Contact Editor"
-msgstr "El editor de contactos"
-
-#: index.docbook:53
-#, no-c-format
-msgid "Click once on the contact."
-msgstr "Haga clic en el contacto para seleccionarlo."
-
-#: index.docbook:53
-#, no-c-format
-msgid "Daniel Persson for Swedish (.se)"
-msgstr "Daniel Persson al sueco."
-
-#: index.docbook:53
-#, no-c-format
-msgid "Hector Garcia Alvarez for Spanish (.es)"
-msgstr "Héctor García Ãlvarez al español."
-
-#: index.docbook:53
-#, no-c-format
-msgid "Kjartan Maraas for Norwegian (.no)"
-msgstr "Kjartan Maraas al noruego."
-
-#: index.docbook:53
-#, no-c-format
-msgid ""
-"Partial list of Documentation Translators (application translated to 36 "
-"additional languages):"
-msgstr ""
-"Lista parcial de todos los traductores de la documentación (la aplicación está traducida a "
-"otras 36 lenguas adicionales):"
-
-#: index.docbook:53
-#, no-c-format
-msgid "Press the <guibutton>Delete</guibutton> button."
-msgstr "Haga clic en <guibutton>Borrar</guibutton>."
-
-#: index.docbook:53
-#, no-c-format
-msgid "To delete a contact:"
-msgstr "Para eliminar un contacto:"
-
-#: index.docbook:54
-#, no-c-format
-msgid ""
-"If you use an HTTP proxy, <application>Ximian Evolution</application> must "
-"be able to find it through the <systemitem>gnome-vfs</systemitem> subsystem "
-"before it can access news and weather from the Internet. This is also the "
-"case if you wish to load remote images into HTML mail message."
-msgstr ""
-"Si utiliza un «proxy» HTTP, <application>Ximian Evolution</application> debe ser capaz "
-"de encontrarlo a través del subsistema <systemitem>gnome-vfs</systemitem> antes "
-"de poder acceder a los servicios de información meteorológica y de noticias a través de "
-"Internet. Ocurre lo mismo si quiere ver imágenes remotas en un mensaje de "
-"correo HTML."
-
-#: index.docbook:54
-#, no-c-format
-msgid "Using the Summary through an HTTP Proxy"
-msgstr "Uso del Resumen a través de un \"proxy\" HTTP"
-
-#: index.docbook:54
-#, no-c-format
-msgid "You can find the proxy settings tool in the Control Center."
-msgstr "La herramienta de configuración de «proxy» se encuentra en el Centro de Control."
-
-#: index.docbook:56
-#, no-c-format
-msgid "Sorting the message list"
-msgstr "Ordena la lista de mensajes"
-
-#: index.docbook:57
-#, no-c-format
-msgid ""
-"<application>Evolution</application> helps you work by letting you sort your "
-"email. To sort by sender, subject, or date, click on the bars with those "
-"labels at the top of the message list. The direction of the arrow next to "
-"the label indicates the direction of the sort, and if you click again, "
-"you'll sort them in reverse order. For example, click once on "
-"<guilabel>Date</guilabel> to sort messages by date from oldest to newest. "
-"Click again, and <application>Evolution</application> sorts the list from "
-"newest to oldest. You can also right-click on the message header bars to get "
-"a set of sorting options, and add or remove columns from the message list. "
-"You can find detailed instructions on how to customize your message display "
-"columns in <xref linkend=\"usage-mail-organize-columns\"/>."
-msgstr ""
-"<application>Evolution</application> le ayuda en su trabajo permitiéndole ordenar "
-"su correo. Para ordenarlo por destinatario, asunto o fecha haga clic en las barras etiquetadas "
-"encima de la lista de mensajes. La dirección de la flecha en la misma le indicará el sentido "
-"de la ordenación y si vuelve a hacer clic, la ordenación cambiará al sentido inverso. Por "
-"ejemplo haga clic una vez en <guilabel>Fecha</guilabel> para ordenar los mensajes por "
-"la fecha, desde el más viejo al más reciente. Haga clic de nuevo y "
-"<application>Evolution</application> ordenará la lista desde el más nuevo al más antiguo. "
-"También puede hacer clic con el botón derecho sobre la cabecera del mensaje para "
-"disponer de un juego de opciones de ordenación y añadir o borrar columnas de la lista "
-"de mensajes. Puede encontrar instrucciones detalladas sobre cómo personalizar las "
-"columnas de la lista de mensajes en <xref linkend=\"usage-mail-organize-columns\"/>."
-
-#: index.docbook:57
-#, no-c-format
-msgid "File or Printer?"
-msgstr "¿Archivo o impresora?"
-
-#: index.docbook:57
-#, no-c-format
-msgid ""
-"Please note that legal and licensing information is in <xref linkend="
-"\"preface\"/> due to formatting issues with its previous location."
-msgstr ""
-"Observe que la información legal y de licencias está en <xref linkend=\"preface\"/> "
-"debido a asuntos relativos a la maquetación de su lugar anterior."
-
-#: index.docbook:58
-#, no-c-format
-msgid ""
-"PostScript is the file format used by most laser printers, and in UNIX world "
-"is the easiest way to print to a file. However, most systems running "
-"Microsoft Windows can't recognize or handle PostScript files. You'll need to "
-"print to PDF if you want to share your file with Windows users."
-msgstr ""
-"PostScript es el formato de archivo utilizado por la mayoría de las "
-"impresoras láser y es la forma más sencilla de imprimir en un archivo en el "
-"mundo UNIX. Sin embargo muchos sistemas con Microsoft Windows no reconocen "
-"archivos PostScript. Si desea compartir sus archivos con usuarios Windows "
-"deberá imprimir en ficheros PDF."
-
-#: index.docbook:58
-#, no-c-format
-msgid "Printing to PostScript?"
-msgstr "¿Imprimir a PostScript?"
-
-#: index.docbook:58
-#, no-c-format
-msgid ""
-"The printer selection window, shown in <xref linkend=\"print-dest\"/>, lets "
-"you choose the format for printing-- <guilabel>Generic Postscript</"
-"guilabel>, whether to write to a PDF file, and whether to print to a file or "
-"to an actual printer in Generic Postscript. If you choose a printer, you'll "
-"be asked for the printer command (probably <command>lpr</command>) which "
-"your system uses. If you choose to print to a file, you'll need to decide "
-"upon a filename. And of course, you'll want to choose a number of copies, "
-"and whether to collate them."
-msgstr ""
-"La ventana de elección de impresora mostrado en <xref linkend=\"print-dest\"/> "
-"permite elegir el formato de impresión: <guilabel>PostScript genérico</guilabel>, "
-"archivo PDF. El formato PostScript genérico permite enviar el "
-"contenido de la impresión a un archivo o a una impresora real. Si eligió una "
-"impresora, especifique el orden de impresión en su sistema operativo "
-"(probablemente <command>lpr</command>). Si quiere imprimir en un archivo, "
-"indique su nombre. Y por supuesto debe decidir el número de copias y cómo "
-"compaginarlas."
-
-#: index.docbook:60
-#, no-c-format
-msgid ""
-"To visit a specific date's calendar entries, click <guibutton>Go To</"
-"guibutton> and select the date in the dialog box that appears."
-msgstr ""
-"Para visitar la hoja de una fecha específica haga clic en <guibutton>Ir a</"
-"guibutton> para abrir un cuadro de diálogo donde elegir la fecha."
-
-#: index.docbook:64
-#, no-c-format
-msgid "Command Line Options"
-msgstr "Opciones de la línea de órdenes"
-
-#: index.docbook:64
-#, no-c-format
-msgid ""
-"Evolution has a number of command-line options that you may wish to make use "
-"of. You can find the full list by running the commands <userinput>man "
-"evolution</userinput> or <userinput>evolution --help</userinput>. The most "
-"important ones are:"
-msgstr ""
-"Evolution le permite utilizar una serie de opciones de la línea de órdenes. "
-"Para consultar la lista completa, ejecute las órdenes <userinput>man "
-"evolution</userinput> o <userinput>evolution --help</userinput>. Las más "
-"importantes son:"
-
-#: index.docbook:64
-#, no-c-format
-msgid ""
-"To make your web browser use Evolution as the default email client, enter "
-"<userinput>evolution \"%s\"</userinput> as the email handler in your web "
-"browser or in the GNOME Control Center."
-msgstr ""
-"Para que su navegador Web utilice Evolution de manera predeterminada escriba "
-"<userinput>evolution \"%s\"</userinput> en el campo correspondiente al "
-"administrador de correo, en la configuración de su navegador o en el Centro "
-"de control de GNOME."
-
-#: index.docbook:64
-#, no-c-format
-msgid ""
-"To start Evolution and begin composing a message to the email address you "
-"name: <userinput>evolution mailto:joe@somewhere.net</userinput>"
-msgstr ""
-"Para iniciar Evolution y empezar a escribir un mensaje a la dirección de "
-"correo que especifique: <userinput>evolution mailto:paco@porahi.net</"
-"userinput>."
-
-#: index.docbook:64
-#, no-c-format
-msgid ""
-"To start Evolution in offline mode: <userinput>evolution --offline</"
-"userinput>"
-msgstr ""
-"Para iniciar Evolution en modo desconectado: <userinput>evolution --offline</"
-"userinput>"
-
-#: index.docbook:67
-#, no-c-format
-msgid "Preface"
-msgstr "Prefacio"
-
-#: index.docbook:68
-#, no-c-format
-msgid ""
-"If you want to add or change cards, you'll use the contact editor. To change "
-"a card that already exists, double click on it to open the contact editor "
-"window. If you want to create a new card, clicking the <guibutton>New</"
-"guibutton> button in the toolbar will open the same window, with blank entry "
-"boxes for you to fill in."
-msgstr ""
-"Utilice el editor de contactos para desea agregar o modificar tarjetas. Para "
-"modificar una tarjeta existente, haga doble clic en la tarjeta y abrirá la "
-"ventana del editor de contactos. Si desea crear una nueva tarjeta, haga clic "
-"en <guibutton>Nuevo</guibutton> en la barra de herramientas para abrir otra "
-"ventana idéntica, pero con los campos vacíos para ser rellenados."
-
-#: index.docbook:68
-#, no-c-format
-msgid "Scheduling With the Evolution Calendar"
-msgstr "Planificación con el calendario de Evolution"
-
-#: index.docbook:69
-#, no-c-format
-msgid ""
-"Of course, you'll want to use the calendar to do more than find out what day "
-"it is. This section will tell you how to schedule appointments, set alarms, "
-"and determine appointment recurrence. If you have installed the Ximian "
-"Connector for Microsoft Exchange, you can also read <xref linkend=\"full-"
-"advantage\"/> to learn about how to take full advantage of the collaborative "
-"group scheduling functions available on the Microsoft Exchange Server."
-msgstr ""
-"Por supuesto, querrá usar el calendario para algo más que para saber qué día "
-"es hoy. Esta sección explica cómo planificar citas, crear citas periódicas o "
-"fijar alarmas. Si ha instalado Ximian Connector para Microsoft Exchange, "
-"consulte <xref linkend=\"full-advantage\"/> acerca de cómo aprovechar al "
-"máximo las funciones de planificación de grupos en colaboración, disponibles "
-"en Microsoft Exchange Server."
-
-#: index.docbook:71
-#, no-c-format
-msgid "Customizing the Weather Summary"
-msgstr "En el Centro de control encontrará la herramienta de configuración del proxy."
-
-# index.docbook:172, index.docbook:255, index.docbook:287
-#: index.docbook:72 index.docbook:151 index.docbook:184
-#, no-c-format
-msgid ""
-"Choose <menuchoice> <guimenu>Tools</guimenu> <guimenuitem>Settings</"
-"guimenuitem> </menuchoice> and select the <guilabel>Summary Preferences</"
-"guilabel> tool."
-msgstr ""
-"Elija <menuchoice> <guimenu>Herramientas</guimenu> "
-"<guimenuitem>Configuración</guimenuitem> </menuchoice> y elija la herramienta"
-"<guilabel>Configuración del resumen</guilabel>."
-
-# index.docbook:172, index.docbook:216
-#: index.docbook:72 index.docbook:111
-#, no-c-format
-msgid "Click the <guibutton>Add</guibutton> button."
-msgstr "Elija la ciudad en la columna de la izquierda."
-
-#: index.docbook:72
-#, no-c-format
-msgid "Click the <guilabel>Weather</guilabel> tab."
-msgstr ""
-"En <menuchoice> <guimenu>Herramientas</guimenu> <guimenuitem>Configuración</"
-"guimenuitem> </menuchoice> elija <guilabel>Preferencias del Resumen</"
-"guilabel>."
-
-#: index.docbook:72
-#, no-c-format
-msgid "Select the city on the left hand column."
-msgstr "Haga clic en la ficha <guilabel>Meteorología</guilabel>."
-
-#: index.docbook:72
-#, no-c-format
-msgid "To add a city to be displayed in the weather:"
-msgstr "Personalización del Resumen meteorológico"
-
-#: index.docbook:74
-#, no-c-format
-msgid "Email Headers"
-msgstr "Cabeceras de mensajes"
-
-#: index.docbook:74
-#, no-c-format
-msgid ""
-"To look at the complete headers for email messages, select "
-"<menuchoice><guimenu>View</guimenu><guisubmenu>Message Display</"
-"guisubmenu><guimenuitem>Show Full Headers</guimenuitem></menuchoice>. To see "
-"absolutely every bit, choose <menuchoice><guimenu>View</"
-"guimenu><guisubmenu>Message Display</guisubmenu><guimenuitem>Show Email "
-"Source </guimenuitem></menuchoice>."
-msgstr ""
-"Para ver completas las cabeceras de un mensaje elija <menuchoice> "
-"<guimenu>Ver</guimenu><guisubmenu>Mostrar mensaje</guisubmenu> "
-"<guimenuitem>Ver cabeceras completas</guimenuitem></menuchoice>. Para ver "
-"absolutamente todo el mensaje elija <menuchoice><guimenu>Ver</guimenu> "
-"<guisubmenu>Mostrar mensaje</guisubmenu> <guimenuitem>Mostrar el fuente</guimenuitem></menuchoice>."
-
-#: index.docbook:75
-#, no-c-format
-msgid ""
-"Part one of the <application>Ximian Evolution</application> manual describes "
-"how to use <application>Ximian Evolution</application> for email, contact "
-"management, and appointment and task scheduling. You'll find as you go along "
-"that there's more than one way to do things, and you can pick whichever "
-"method you like best."
-msgstr ""
-"La primera parte del manual de <application>Ximian Evolution</application> "
-"describe cómo utilizar <application>Ximian Evolution</application> para "
-"manejar correo electrónico, gestión de contactos y planificación de citas y "
-"de tareas. Conforme avance descubrirá que existen varias formas de hacer las "
-"cosas y podrá elegir el método que más le agrade."
-
-#: index.docbook:77
-#, no-c-format
-msgid ""
-"The contact editor window has three tabs, <guilabel>General</guilabel>, for "
-"basic contact information, <guilabel>Details</guilabel>, for a more specific "
-"description of the person, and <guilabel>Collaboration</guilabel> for "
-"information about scheduling and working closely with them. In addition, it "
-"contains a <guimenu>File</guimenu> menu and an <guimenu>Actions</guimenu> "
-"menu. Under <guimenu>Actions</guimenu> you will find <guimenuitem>Forward "
-"Contact</guimenuitem>, which opens a new message with the card already "
-"attached, and <guimenuitem>Send Message to Contact</guimenuitem>, which will "
-"open a new message to the contact."
-msgstr ""
-"La ventana del editor de contactos cuenta con tres solapas, "
-"<guilabel>General</guilabel>, con la información esencial, "
-"<guilabel>Detalles</guilabel>, con una descripción más precisa de la persona y "
-"<guilabel>Colaboración</guilabel>, para la información de planificación y colaboración de la persona. "
-"Además, contiene un menú <guimenu>Archivo</guimenu> y otro "
-"<guimenu>Acciones</guimenu>, donde encontrará <guimenuitem>Reenviar contacto</guimenuitem>, "
-"que abre un mensaje nuevo con la tarjeta adjuntada y <guimenuitem>Enviar un mensaje al contacto</guimenuitem>, "
-"para abrir un mensaje nuevo dirigido al contacto."
-
-# index.docbook:71, index.docbook:110
-#: index.docbook:80 index.docbook:119
-#, no-c-format
-msgid "Click <guibutton>Import</guibutton>"
-msgstr "Haga clic en <guibutton>Importar</guibutton>"
-
-# index.docbook:71, index.docbook:110
-#: index.docbook:80 index.docbook:119
-#, no-c-format
-msgid "Click <guibutton>Next</guibutton> after reading the Welcome screen."
-msgstr ""
-"Haga clic en <guibutton>Siguiente</guibutton> tras leer la pantalla de "
-"bienvenida."
-
-# index.docbook:71, index.docbook:110
-#: index.docbook:80 index.docbook:119
-#, no-c-format
-msgid ""
-"Click <menuchoice><guimenu>File</guimenu><guimenuitem>Import</guimenuitem></"
-"menuchoice>."
-msgstr ""
-"Haga clic en <menuchoice><guimenu>Archivo</guimenu><guimenuitem>Importar</"
-"guimenuitem></menuchoice>."
-
-#: index.docbook:80
-#, no-c-format
-msgid ""
-"Find the file that you wish to import into <application>Evolution</"
-"application>."
-msgstr ""
-"Busque el archivo que quiere importar en <application>Evolution</"
-"application>."
-
-#: index.docbook:80
-#, no-c-format
-msgid "Select <guibutton>Import a single file</guibutton>."
-msgstr "Seleccione <guibutton>Importar un único archivo</guibutton>."
-
-#: index.docbook:80
-#, no-c-format
-msgid "To import your old email:"
-msgstr "Para importar sus mensajes existentes:"
-
-#: index.docbook:81
-#, no-c-format
-msgid "Creating appointments"
-msgstr "Creación de citas"
-
-#: index.docbook:82
-#, no-c-format
-msgid ""
-"To create a new appointment, select <menuchoice> <guimenu>File</guimenu> "
-"<guisubmenu>New</guisubmenu> <guimenuitem>Appointment</guimenuitem> </"
-"menuchoice> or click the <guibutton>New Appointment</guibutton> button on "
-"the left end of the toolbar. The <interface>New Appointment</interface> "
-"dialog will pop up with the menu bar, tool bar, and window full of choices "
-"for you."
-msgstr ""
-"Para crear una nueva cita elija <menuchoice> <guimenu>Archivo</guimenu> "
-"<guisubmenu>Nuevo</guisubmenu> <guimenuitem>Cita</guimenuitem> </menuchoice> "
-"o haga clic en <guibutton>Nueva cita</guibutton> en la izquierda de la barra "
-"de herramientas. Se abrirá el cuadro de diálogo <interface>Nueva cita</"
-"interface> con una barra de menú, otra de herramientas y una ventana con "
-"varias opciones."
-
-# index.docbook:85, index.docbook:86
-#: index.docbook:85 index.docbook:86
-#, no-c-format
-msgid "Choosing a Printer"
-msgstr "Selección de impresora"
-
-#: index.docbook:88
-#, no-c-format
-msgid ""
-"You can also choose a threaded message view. Select <menuchoice> "
-"<guimenu>View</guimenu> <guimenuitem>Threaded</guimenuitem> </menuchoice> to "
-"turn the threaded view on or off. When you select this option, "
-"<application>Evolution</application> groups the replies to a message with "
-"the original, so you can follow the thread of a conversation from one "
-"message to the next."
-msgstr ""
-"Puede elegir una vista de mensajes por conversaciones. Elija <menuchoice> "
-"<guimenu>Ver</guimenu> <guimenuitem>Lista de mensajes por conversaciones</guimenuitem> "
-"</menuchoice> para activarla o desactivarla. Cuando elije esta opción, "
-"<application>Evolution</application> agrupa las respuestas de un mensaje con el original, "
-"por lo que puede seguir el hilo de la conversación de un mensaje al siguiente."
-
-#: index.docbook:91
-#, no-c-format
-msgid ""
-"The toolbar is relatively simple: <guilabel>Save and Close</guilabel>, "
-"<guilabel>Print</guilabel>, <guilabel>Close</guilabel>, and "
-"<guilabel>Delete</guilabel>."
-msgstr ""
-"La barra de herramientas es relativamente sencilla: <guilabel> Guardar Cerrar</guilabel>, "
-"<guilabel> Imprimir</guilabel>,<guilabel> Cerrar</guilabel> y "
-"<guilabel> Borrar</guilabel>."
-
-#: index.docbook:94
-#, no-c-format
-msgid ""
-"If you don't need to enter more information than the date and time of the "
-"appointment, you just click in any blank space in the calendar and start "
-"typing. You can enter other information later with the appointment editor."
-msgstr ""
-"Si no tiene que añadir más información que la fecha y la hora de la cita, "
-"haga clic en cualquier lugar vacío del calendario y empiece a escribir. "
-"Posteriormente podrá introducir otra información con el editor de citas."
-
-#: index.docbook:94
-#, no-c-format
-msgid ""
-"If you're printing a message that's more than one page, you'll have the "
-"option of choosing which pages to print. If you're printing a calendar "
-"entry, you can decide what range of dates to print. And, if you're printing "
-"contact cards, you can decide whether to print only the selected cards, or "
-"all of them."
-msgstr ""
-"Si desea imprimir un mensaje mayor de una página, puede elegir qué páginas "
-"quiere imprimir. Si se trata de una hoja del calendario puede decidir qué "
-"rango de fechas quiere imprimir. Y si va a imprimir tarjetas de visita, "
-"puede decidir imprimir sólo las elegidas o todas a la vez."
-
-#: index.docbook:94
-#, no-c-format
-msgid "Shortcut"
-msgstr "Atajo"
-
-#: index.docbook:95
-#, no-c-format
-msgid ""
-"The first time you run the program, it will create a directory called "
-"<filename>evolution</filename> in your home directory, where it will store "
-"all of its local data. Then, it will open a first-run assistant to help you "
-"set up mail accounts and import data from other applications."
-msgstr ""
-"La primera vez que los ejecute, el programa crea un directorio llamado "
-"<filename>evolution</filename> en su directorio de inicio de sesión, donde "
-"almacena toda su información local. Después se abrirá un asistente, sólo la "
-"primera vez, con el fin de ayudarle a configurar sus cuentas de correo, así "
-"como para importar datos de otras aplicaciones."
-
-#: index.docbook:96
-#, no-c-format
-msgid "Configuring and Managing Ximian Evolution"
-msgstr "Configuración y manejo de Ximian Evolution"
-
-#: index.docbook:98
-#, no-c-format
-msgid ""
-"<application>Ximian Evolution</application> is highly configurable. Usually, "
-"when developers say that, they mean that they didn't test it out thoroughly "
-"and have left it to other programmers to \"configure\" themselves a working "
-"system. In the case of <application>Ximian Evolution</application>, "
-"\"configurable\" means that, while you can expect the program to work "
-"perfectly well with the default settings, it's also easy to alter its "
-"behavior in a wide variety of ways, so that it fits your needs exactly. This "
-"part of the book will describe that process, from the quickest glimpse of "
-"the Setup Assistant to an in-depth guide to obscure preferences settings."
-msgstr ""
-"<application>Ximian Evolution</application> es muy configurable. Normalmente "
-"cuando un programador dice eso quiere decir que no ha comprobado "
-"meticulosamente el sistema y que deben ser otros programadores los que lo "
-"<quote>configuren</quote> hasta ponerlo en marcha. En el caso de "
-"<application>Ximian Evolution</application> <quote>configurable</quote> "
-"significa que, además de poder confiar en la configuración de fábrica del "
-"programa, es también muy fácil modificar su comportamiento de múltiples "
-"maneras, con el fin de ajustarlo a sus necesidades. Esta parte del libro "
-"explica ese proceso, desde una presentación rápida del Asistente de "
-"Configuración, hasta una guía paso a paso por la configuración de sus "
-"preferencias más peregrinas."
-
-# index.docbook:88, index.docbook:89
-#: index.docbook:99 index.docbook:100
-#, no-c-format
-msgid "Evolution Contact Editor"
-msgstr "Editor de contactos de Evolution"
-
-#: index.docbook:100 index.docbook:101
-#, no-c-format
-msgid "Message Threading In Action"
-msgstr "Las listas de mensajes en conversación en acción"
-
-#: index.docbook:101
-#, no-c-format
-msgid ""
-"When you're ready, click <guibutton>Print</guibutton> to print, "
-"<guibutton>Preview</guibutton> to have a look (or another look) at the "
-"preview, or <guibutton>Cancel</guibutton> to cancel the whole deal."
-msgstr ""
-"Cuando esté preparado para imprimir, haga clic en <guibutton>Imprimir</"
-"guibutton>, <guibutton>Vista preliminar</guibutton> para darle un vistazo (u "
-"otro vistazo) a la pre-impresión o a <guibutton>Cancelar</guibutton> para "
-"anular todo el trato."
-
-#: index.docbook:102
-#, no-c-format
-msgid ""
-"Below the list of cities, you can select the time, in seconds, between "
-"updates, and whether you wish to see temperatures in Celsius or Farenheit."
-msgstr ""
-"Debajo de la lista de ciudades puede elegir el tiempo, en segundos, entre cada "
-"actualización y si quiere ver las temperaturas en grados Celsius o Farenheit."
-
-#: index.docbook:102
-#, no-c-format
-msgid "Using the first-run assistant will take approximately two to five minutes."
-msgstr ""
-"El asistente de primer inicio requiere entre dos y cinco minutos de su "
-"tiempo, aproximadamente."
-
-#: index.docbook:104
-#, no-c-format
-msgid ""
-"Your appointment must have a starting and ending date (by default, today) "
-"but you can choose whether to give it starting and ending times or to mark "
-"it as an <guilabel>All day event</guilabel>. An <guilabel>All day event</"
-"guilabel> appears at the top of a day's appointment list, in the grey header "
-"under the date, rather than inside it. That makes it easy to have "
-"appointments that overlap and fit inside each other. For example, a "
-"conference might be an all day appointment, and the meetings at the "
-"conference would be timed appointments. Of course, appointments with "
-"specific starting and ending times can also overlap. When they do they're "
-"displayed as multiple columns in the day view of the calendar."
-msgstr ""
-"Su cita debe tener una fecha de inicio y otra de final -la fecha "
-"predeterminada es la del día de hpy- pero puede elegir entre las horas de "
-"inicio y final, o seleccionar un <guilabel>Evento para todo el día</guilabel>. "
-"Un <guilabel>Evento para todo el día</guilabel> aparece al "
-"principio de la lista de citas, en una cabecera gris debajo de la fecha y no "
-"en la propia lista. Así se facilita que las citas puedan solaparse o encajar "
-"unas dentro de otras. Por ejemplo, puede definir una conferencia como un "
-"evento para todo el día, y las reuniones durante la conferencia, como citas "
-"con hora. Por supuesto que las citas con horas de inicio y final específicas "
-"también pueden solaparse. Cuando eso ocurre son mostradas con múltiples "
-"columnas en la vista del día del calendario."
-
-#: index.docbook:108
-#, no-c-format
-msgid "Defining Your Identity"
-msgstr "Definición de su identidad"
-
-#: index.docbook:109
-#, no-c-format
-msgid "Email Address: Your email address (Example: john@doe.com)"
-msgstr ""
-"Dirección de correo: su dirección de correo electrónico (por ejemplo: "
-"francisco@lopez.com)."
-
-#: index.docbook:109
-#, no-c-format
-msgid "Full Name: Your full name (Example: John Doe)."
-msgstr "Nombre completo: su nombre completo (por ejemplo Francisco López)."
-
-#: index.docbook:109
-#, no-c-format
-msgid ""
-"Organization: The company where you work, or the organization you represent "
-"when you send email (optional)."
-msgstr ""
-"Organización: la compañía para la que trabaja o la organización a la que "
-"representa cuando escribe correo (opcional)."
-
-#: index.docbook:109
-#, no-c-format
-msgid ""
-"Reply-To: If you want to have replies sent to another email address, enter "
-"it here (optional)."
-msgstr ""
-"Responder A: Si quiere que las respuestas le lleguen a otra dirección de correo, escríbala "
-"aquí (opcional)."
-
-#: index.docbook:109
-#, no-c-format
-msgid ""
-"The <guilabel>General</guilabel> tab has seven sections, each with an icon: "
-"a face, for name and company; a telephone for phone numbers; an envelope for "
-"email address; a globe for web page address; a house for postal address; a "
-"file folder for contacts, and a briefcase for categories."
-msgstr ""
-"La ficha <guilabel>General</guilabel> cuenta siete secciones, con diferentes "
-"iconos: una careta para el nombre y organización; un teléfono para los "
-"números de teléfono; un sobre para la dirección de correo electrónico; un "
-"globo terráqueo para la dirección de la página Web; una casita para la "
-"dirección postal; una carpeta de archivos para los contactos, y por fin, un "
-"maletín para las categorías asociadas."
-
-#: index.docbook:109
-#, no-c-format
-msgid ""
-"The Identity window is the first step in the assistant. Here, you will enter "
-"some basic personal information. You can define multiple identities later on "
-"with the <menuchoice><guimenu>Tools</guimenu> <guimenuitem>Settings</"
-"guimenuitem></menuchoice> tool and clicking the <guibutton>Mail Accounts</"
-"guibutton> button."
-msgstr ""
-"La ventana Identidad es el primer paso del asistente. Aquí debe escribir "
-"algunos datos personales. Más tarde podrá definir más identidades desde el "
-"menú <menuchoice><guimenu>Herramientas</guimenu> <guimenuitem>Configuración</"
-"guimenuitem></menuchoice>, con el botón <guibutton>Cuentas de correo</guibutton>."
-
-#: index.docbook:110
-#, no-c-format
-msgid "Customizing Your News Feeds"
-msgstr ""
-"<application>Evolution</application> implementa los sistemas métricos "
-"internacional y anglosajón para los informes meteorológicos. El sistema "
-"anglosajón corresponde al sistema británico pero se utiliza casi "
-"exclusivamente en EEUU. Gran Bretaña y el resto del mundo utilizan el "
-"sistema métrico."
-
-#: index.docbook:111
-#, no-c-format
-msgid ""
-"Choose <menuchoice> <guimenu>Tools</guimenu> <guimenuitem>Settings</"
-"guimenuitem> </menuchoice> and select the <guilabel>Summary Preferences</"
-"guilabel> tool. Then, choose the <guilabel>News Feeds</guilabel> tab."
-msgstr ""
-"Elija <menuchoice> <guimenu>Herramientas</guimenu> <guimenuitem>Configuración</guimenuitem> "
-"</menuchoice> y lance la herramienta <guilabel>Configuración del resumen</guilabel>. "
-"Entonces elija la solapa <guilabel>Proveedores de noticias</guilabel>."
-
-#: index.docbook:111 index.docbook:365 index.docbook:924 index.docbook:1041
-#, no-c-format
-msgid "Click <guibutton>OK</guibutton>."
-msgstr "Haga clic en <guibutton>Aceptar</guibutton>."
-
-#: index.docbook:111
-#, no-c-format
-msgid "In the left hand column, select the news feed to add to your display."
-msgstr ""
-"<menuchoice> <guimenu>Herramientas</guimenu> <guimenuitem>Configuración</"
-"guimenuitem> </menuchoice> y elija <guilabel>Preferencias del Resumen</"
-"guilabel>. Entonces elija la ficha <guilabel>Fuentes de Noticias</guilabel>."
-
-#: index.docbook:111
-#, no-c-format
-msgid "To customize your news feeds:"
-msgstr "Personalización de la captura de titulares"
-
-#: index.docbook:112 index.docbook:494
-#, no-c-format
-msgid "Deleting Mail"
-msgstr "Eliminación de correo"
-
-#: index.docbook:112
-#, no-c-format
-msgid "Importing Preferences"
-msgstr "Importación de las preferencias"
-
-#: index.docbook:113
-#, no-c-format
-msgid ""
-"<application>Evolution</application> can import all your old mail, contacts, "
-"and other information from other applications, making your transition to "
-"<application>Evolution</application> easy."
-msgstr ""
-"<application>Evolution</application> es capaz de importar sus mensajes, "
-"contactos y otra información existente desde otras aplicaciones, y "
-"facilitarle de este modo su transición a <application>Evolution</"
-"application>."
-
-# index.docbook:668, index.docbook:727
-#: index.docbook:113
-#, no-c-format
-msgid ""
-"Click <menuchoice> <guimenu>Actions</guimenu> <guimenuitem>Expunge</"
-"guimenuitem> </menuchoice> or press <keycombo action=\"simul\"> "
-"<keycap>Ctrl</keycap> <keycap>E</keycap> </keycombo>"
-msgstr ""
-"Abra <menuchoice> <guimenu>Acciones</guimenu> <guimenuitem>Purgar</guimenuitem> "
-" </menuchoice> o presione la combinación de teclas <keycombo "
-"action=\"simul\"> <keycap>Ctrl</keycap> <keycap>E</keycap> </keycombo>"
-
-#: index.docbook:113
-#, no-c-format
-msgid "Click the message to select it"
-msgstr "Haga clic sobre el mensaje para seleccionarlo"
-
-#: index.docbook:113
-#, no-c-format
-msgid ""
-"If you don't like this behavior, select <menuchoice><guimenu>View</"
-"guimenu><guimenuitem>Hide Deleted Messages</guimenuitem></menuchoice>. Then, "
-"you will only see deleted messages when you look in your <guilabel>Trash</"
-"guilabel> folder."
-msgstr ""
-"Si no le gusta este comportamiento, elija<menuchoice><guimenu>Ver</guimenu> "
-"<guimenuitem>Ocultar mensajes borrados</guimenuitem></menuchoice>. Entonces "
-"sólo verá los mensajes eliminados cuando mire en su carpeta <guilabel>Papelera</guilabel>."
-
-#: index.docbook:113
-#, no-c-format
-msgid ""
-"Once you've read your mail, you may want to get rid of it. To delete a "
-"message:"
-msgstr ""
-"Una vez que haya leído su correo puede que quiera desembarazarse de él. "
-"Para borrar un mensaje:"
-
-#: index.docbook:113
-#, no-c-format
-msgid ""
-"Press delete button or right click on the message and choose "
-"<guilabel>Delete</guilabel>."
-msgstr "Pulse el botón suprimir o haga doble clic sobre el mensaje y elija <guilabel>Borrar</guilabel>."
-
-#: index.docbook:113
-#, no-c-format
-msgid ""
-"When you press <guibutton>Delete</guibutton> or click the trash button, your "
-"mail isn't actually deleted, but is marked for deletion. Your email is not "
-"gone until you have expunged it. When you \"Expunge\" a folder, you remove "
-"all the mail that you have marked for deletion."
-msgstr ""
-"Cuando pulsa <guibutton>Borrar</guibutton> o pulse sobre el botón de la papelera "
-"su correo no se borra realmente sino que se marca para ser eliminado. Su correo no "
-"desaparece definitivamente hasta que no lo haya purgado. Cuando «Purga» una "
-"carpeta realmente está elimiando todo el correo marcado como borrado."
-
-#: index.docbook:113
-#, no-c-format
-msgid "Why do I still see deleted mail?"
-msgstr "¿Por qué sigo viendo el correo borrado?"
-
-#: index.docbook:115
-#, no-c-format
-msgid ""
-"Don't enter something entirely different from the actual name, since you "
-"might forget that you've filed Rupert's information under \"F\" for "
-"\"Fictitious Ximian Employee.\""
-msgstr ""
-"No utilice nombres completamente diferentes del nombre real, pues podría "
-"llegar a olvidar que introdujo los datos de Rupert bajo la «E» de «Empleado "
-"ficticio de Ximian», por ejemplo."
-
-#: index.docbook:115
-#, no-c-format
-msgid "Enter an honorific or select one from the menu."
-msgstr "Escriba o seleccione el tratamiento en el menú."
-
-#: index.docbook:115
-#, no-c-format
-msgid "Enter suffixes such as \"Jr.\" or \"III.\""
-msgstr "Escriba el sufijo si lo hay, por ejemplo «Jr.» o «III»."
-
-#: index.docbook:115
-#, no-c-format
-msgid "Enter the first, or given, name."
-msgstr "Escriba el nombre de pila."
-
-#: index.docbook:115
-#, no-c-format
-msgid "Enter the last name (surname)."
-msgstr "Escriba el apellido o los apellidos."
-
-#: index.docbook:115
-#, no-c-format
-msgid "Enter the middle name or initial, if any."
-msgstr "Escriba el segundo nombre, si se precisa."
-
-#: index.docbook:115
-#, no-c-format
-msgid "Filing Suggestion"
-msgstr "Sugerencias para introducir datos"
-
-#: index.docbook:115
-#, no-c-format
-msgid "First:"
-msgstr "Nombre:"
-
-#: index.docbook:115
-#, no-c-format
-msgid "Full Name"
-msgstr "Nombre completo"
-
-#: index.docbook:115
-#, no-c-format
-msgid ""
-"If you click on the downward pointing triangle buttons next to the "
-"<guilabel>Primary Email</guilabel> field, you can also choose "
-"<guilabel>Email 2</guilabel> and <guilabel>Email 3</guilabel>. Although the "
-"contact editor will only display one of those at any given time, "
-"<application>Evolution</application> will store them all. Entries that have "
-"information in them have a check mark next to them. The buttons next to the "
-"telephone and postal address fields work in the same way."
-msgstr ""
-"Si hace clic en los iconos que apuntan hacia abajo junto al campo "
-"<guilabel>Correo electrónico principal</guilabel> puede seleccionar "
-"<guilabel>Correo electrónico 2</guilabel> y <guilabel>Correo electrónico 3</"
-"guilabel>. El cliente <application>Evolution</application> los almacena "
-"todos, aunque el editor de contacto sólo muestre uno de ellos a la vez. Las "
-"entradas con información poseen una marca junto a ellas. Los botones junto a "
-"los campos de teléfono y dirección postal funcionan del mismo modo."
-
-#: index.docbook:115
-#, no-c-format
-msgid "Last:"
-msgstr "Apellido:"
-
-#: index.docbook:115
-#, no-c-format
-msgid "Middle:"
-msgstr "2&ordm; Nombre:"
-
-#: index.docbook:115
-#, no-c-format
-msgid "Multiple Values for Fields:"
-msgstr "Valores múltiples en campos:"
-
-#: index.docbook:115
-#, no-c-format
-msgid "Suffix:"
-msgstr "Sufijo:"
-
-#: index.docbook:115
-#, no-c-format
-msgid ""
-"The <guilabel>Full Name</guilabel> field also interacts with the "
-"<guilabel>File As</guilabel> box to help you organize your contacts."
-msgstr ""
-"El <guilabel>Nombre completo</guilabel> interactúa también con el botón "
-"<guilabel>Guardar como</guilabel> a la hora de organizar sus contactos."
-
-#: index.docbook:115
-#, no-c-format
-msgid "The <guilabel>Full Name</guilabel> field has two major features:"
-msgstr ""
-"El <guilabel>Nombre completo</guilabel> tiene dos características "
-"principales:"
-
-#: index.docbook:115
-#, no-c-format
-msgid "Title:"
-msgstr "Tratamiento:"
-
-#: index.docbook:115
-#, no-c-format
-msgid ""
-"To see how it works, type a name in the <guilabel>Full Name</guilabel> "
-"field. As an example, we'll use the Ximian mascot, <userinput>Rupert T. "
-"Monkey</userinput>. You'll notice that the <guilabel>File As</guilabel> "
-"field also fills in, but in reverse: <computeroutput>Monkey, Rupert</"
-"computeroutput>. You can pick <computeroutput>Rupert Monkey </"
-"computeroutput> from the drop-down, or type in your own, such as <userinput> "
-"T. Rupert Monkey </userinput>."
-msgstr ""
-"Para ver cómo funciona, escriba un nombre en el campo <guilabel>Nombre "
-"completo</guilabel>. Como ejemplo, utilizaremos el nombre de la mascota de "
-"Ximian: <userinput>Rupert T. Monkey</userinput>. Observe cómo este nombre "
-"aparece también en el campo <guilabel>Guardar como</guilabel>, pero al "
-"revés: <computeroutput>Monkey, Rupert</computeroutput>. Puede seleccionar "
-"<computeroutput>Rupert Monkey </computeroutput> en la lista desplegable, o "
-"escribirlo como prefiera, por ejemplo <userinput> T. Rupert Monkey </"
-"userinput>."
-
-#: index.docbook:115
-#, no-c-format
-msgid ""
-"You can enter a name into the <guibutton>Full Name</guibutton> field, but "
-"you can also click the <guibutton>Full Name</guibutton> button to bring up a "
-"small dialog box with a few text boxes"
-msgstr ""
-"Puede escribir un nombre en el campo <guibutton>Nombre completo</guibutton> "
-"pero también puede hacer clic en el botón <guibutton>Nombre completo</"
-"guibutton>: se abre un pequeño cuadro de diálogo con unos pocos campos de "
-"texto"
-
-#: index.docbook:117
-#, no-c-format
-msgid ""
-"<application>Evolution</application> supports the use of timezones. If you "
-"share calendar files with friends or co-workers, it is quite possible you "
-"will need to configure your timezone. To configure your timezone:"
-msgstr ""
-"<application>Evolution</application> es capaz de trabajar con distintas "
-"zonas horarias. Si comparte ficheros de calendario con amigos o compañeros "
-"de trabajo es bastante posible que tenga que configurar su zona horaria. "
-"Para hacerlo:"
-
-#: index.docbook:117
-#, no-c-format
-msgid ""
-"Click the <guibutton>Globe</guibutton> button in the <guilabel>Time</"
-"guilabel> section, located in the <guilabel>General</guilabel> tab."
-msgstr ""
-"Haga clic en el <guibutton>Globo terráqueo</guibutton> en la sección "
-"<guilabel>Hora</guilabel> dentro de la ficha <guilabel>General</guilabel>."
-
-#: index.docbook:117
-#, no-c-format
-msgid ""
-"Each red dot represents a major city. Click a dot and click <guibutton>OK</"
-"guibutton> to select your time zone."
-msgstr ""
-"Cada punto rojo representa a una ciudad importante. Haga clic en un punto y "
-"a continuación en <guibutton>Aceptar</guibutton> para elegir su zona horaria."
-
-#: index.docbook:117
-#, no-c-format
-msgid ""
-"Select <menuchoice> <guimenu>Tools</guimenu> <guimenuitem>Settings</"
-"guimenuitem> </menuchoice>, and click the <guilabel>Calendar And Tasks</"
-"guilabel> icon in the settings dialog."
-msgstr ""
-"Elija <menuchoice> <guimenu>Herramientas</guimenu> "
-"<guimenuitem>Configuración</guimenuitem> </menuchoice> y haga clic en el icono"
-"<guilabel>Agenda y tareas</guilabel>."
-
-#: index.docbook:117
-#, no-c-format
-msgid ""
-"Select the behavior you want for each conduit you choose to use. If you're "
-"not sure, go ahead and stick with <guilabel>Synchronize</guilabel>. Then, "
-"put your handheld on its cradle and press the HotSync button."
-msgstr ""
-"Especifique el comportamiento de cada conducto elegido. Si no está seguro, "
-"siga adelante, y seleccione <guilabel>Sincronizar</guilabel>. A "
-"continuación, coloque el dispositivo de mano en su base, y presione el botón "
-"HotSync."
-
-#: index.docbook:119
-#, no-c-format
-msgid "Click <guibutton>Next</guibutton>"
-msgstr "Haga clic en <guibutton>Siguiente</guibutton>"
-
-#: index.docbook:119
-#, no-c-format
-msgid "Select <guibutton>Import data and settings from older programs</guibutton>."
-msgstr ""
-"Seleccione <guibutton>Importar datos y configuración de programas antiguos</"
-"guibutton>."
-
-#: index.docbook:119
-#, no-c-format
-msgid ""
-"The left-most column shows the application which your information will be "
-"imported from. You then select checkboxes on each component to import "
-"different properties of each application."
-msgstr ""
-"La columna más a la izquierda muestra la aplicación donde se encuentra la "
-"información que desea importar. Seleccione ahora las casillas de cada "
-"componente para importar las distintas propiedades de cada aplicación."
-
-#: index.docbook:119
-#, no-c-format
-msgid "To import your old information:"
-msgstr "Para importar su información existente:"
-
-#: index.docbook:123
-#, no-c-format
-msgid "Data Loss Prevention"
-msgstr "Prevenir la pérdida de datos"
-
-#: index.docbook:123
-#, no-c-format
-msgid ""
-"It's always a good idea to make a backup. To do that, make a copy of the "
-"<filename>evolution</filename> directory inside your home directory."
-msgstr ""
-"Es siempre buena idea hacer una copia de seguridad. Para ello, copie el "
-"directorio llamado <filename>evolution</filename> que cuelga de su "
-"directorio de inicio."
-
-#: index.docbook:142
-#, no-c-format
-msgid ""
-"You can also add your own news feeds. Evolution will display RDF formatted "
-"XML news feeds from the website of your choice. For most sites, it's a file "
-"called \"index.rdf.\""
-msgstr ""
-"También puede añadir sus propios proveedores de noticias. Evolution mostrará "
-"las noticias en RDF-XML del servidor de su elección. En la mayoría de los casos se "
-"trata de un archivo llamado «index.rdf»."
-
-#: index.docbook:145
-#, no-c-format
-msgid "Receiving Email"
-msgstr "Recibiendo mensajes"
-
-#: index.docbook:146
-#, no-c-format
-msgid ""
-"IMAP: Keeps the email on your server so you can access your email from "
-"multiple systems."
-msgstr ""
-"IMAP: conserva su correo en el servidor para que pueda acceder a él con "
-"sistemas diferentes."
-
-#: index.docbook:146
-#, no-c-format
-msgid ""
-"Local Delivery: Choose this option if you want to move mail from the spool "
-"and store it in your home directory. If you would rather leave mail in your "
-"system's spool files, choose the <guimenuitem>Standard Unix mbox spools</"
-"guimenuitem> option instead. You'll need to provide the path to the mail "
-"spool you want to use."
-msgstr ""
-"Entrega local: si desea mover su correo desde el buzón local a su directorio "
-"de inicio. Si en cambio prefiere dejarlo donde está, opte por "
-"<guimenuitem>Mbox estándar de Unix</guimenuitem>. Debe escribir la ruta de "
-"acceso al buzón."
-
-#: index.docbook:146
-#, no-c-format
-msgid ""
-"MH format mail directories: If you download your mail using mh or another MH-"
-"style program, you'll want to use this option. You'll need to provide the "
-"path to the mail directory you want to use."
-msgstr ""
-"Directorios de correo en formato MH: si descarga el correo utilizando "
-"<application>mh</application> u otro programa tipo MH querrá utiliza esta "
-"opción. Debe escribir la ruta de acceso al buzón."
-
-#: index.docbook:146
-#, no-c-format
-msgid ""
-"Maildir format mail directories: If you download your mail using qmail or "
-"another maildir-style program, you'll want to use this option. You'll need "
-"to provide the path to the mail directory you want to use."
-msgstr ""
-"Directorios de correo en formato Maildir: si utiliza <application>qmail</"
-"application> para descargar su correo, u otro programa de tipo maildir, "
-"querrá usar esta opción. Debe escribir la ruta de acceso al buzón."
-
-#: index.docbook:146
-#, no-c-format
-msgid ""
-"Microsoft Exchange: Available only if you have purchased the Ximian "
-"Connector for Microsoft Exchange, this will allow you to connect to a "
-"Microsoft Exchange 2000 server, which stores email, calendar, and contact "
-"information on the server."
-msgstr ""
-"Microsoft Exchange: sólo disponible si ha adquirido Ximian Connector para "
-"Microsoft Exchange, permite conectarse a un servidor Microsoft Exchange "
-"Server 2000, que almacena la información de calendario, contacto y correo "
-"electrónico en el servidor."
-
-#: index.docbook:146
-#, no-c-format
-msgid "None: Select this if you do not plan to check mail with this account."
-msgstr ""
-"Ninguno: elija esta opción si no planea consultar correo electrónico con "
-"esta cuenta."
-
-#: index.docbook:146
-#, no-c-format
-msgid "POP: Downloads your email to your hard disk for permanent storage."
-msgstr "POP: descargará el correo a su disco duro para almacenarlo permanentemente."
-
-#: index.docbook:146
-#, no-c-format
-msgid ""
-"Server Type: There are numerous types of servers from which "
-"<application>Ximian Evolution</application> can fetch your mail. Ask your "
-"system administrator if you're not sure which of the following are available "
-"to you:"
-msgstr ""
-"Tipo de servidor: <application>Ximian Evolution</application> es capaz de "
-"recuperar su correo desde varios tipos de servidores. Si no está seguro cuál "
-"de los siguientes debe elegir, pregunte a su administrador del sistema:"
-
-#: index.docbook:146
-#, no-c-format
-msgid ""
-"Standard Unix mbox spool or directory: If you want to read and store mail in "
-"the mail spool on your local system, choose this option. You'll need to "
-"provide the path to the mail spool you want to use."
-msgstr ""
-"Directorio o buzón mbox estándar de Unix: seleccione esta opción si desea leer y "
-"almacenar su correo en un buzón de correo local en su sistema. Debe proporcionar "
-"la ruta de acceso al buzón."
-
-#: index.docbook:146
-#, no-c-format
-msgid ""
-"The <guilabel>Receiving Email</guilabel> lets you determine which you will "
-"get your email."
-msgstr ""
-"La sección <guilabel>Recibiendo mensajes</guilabel> permite determinar de "
-"dónde obtendrá su correo."
-
-#: index.docbook:147
-#, no-c-format
-msgid ""
-"You can also configure timezone information specific to the Start and End "
-"time in each appointment. To do that, simply create a new appointment and "
-"click on a globe to customize the timezone that the time exists in. For "
-"example, if you live in New York but have a telephone meeting set for noon "
-"with someone in California, you need to make sure that you're not calling "
-"each other a few hours off. Setting time-zones on a per-appointment basis "
-"helps avoid that potential confusion."
-msgstr ""
-"También puede configurar información específica de la zona horaria a la hora "
-"de inicio y fin de cada cita. Abra una nueva cita y haga clic sobre el globo "
-"terráqueo para elegir la zona horaria acordada para la reunión. Por ejemplo, "
-"si vive en Almería, España, y tiene una reunión telefónica para la tarde con "
-"alguien en Veracruz, México, debe asegurarse que no se hacen las llamadas "
-"con varias horas de diferencia. Usar las zonas horarias adecuadas en cada "
-"cita ayuda a evitar esa confusión potencial."
-
-#: index.docbook:150
-#, no-c-format
-msgid "Customizing Your Mail Summary"
-msgstr ""
-"Es posible incluir titulares de orígenes personalizados. Evolution es capaz "
-"de utilizar titulares en formato RDF del sitio Web de su elección."
-
-#: index.docbook:151
-#, no-c-format
-msgid "Click the <guibutton>Mail</guibutton> tab."
-msgstr ""
-"Elija <menuchoice> <guimenu>Herramientas</guimenu> "
-"<guimenuitem>Configuración</guimenuitem> </menuchoice> y a continuación "
-"<guilabel>Preferencias del Resumen</guilabel>."
-
-#: index.docbook:151
-#, no-c-format
-msgid "Click the checkbox to the left of that folder."
-msgstr "Haga clic en la casilla a la izquierda de la carpeta."
-
-#: index.docbook:151
-#, no-c-format
-msgid "Expand the folder tree to the folders you wish to display in the Summary."
-msgstr "Expande el árbol de carpetas para las carpetas que quier ver en el Resumen."
-
-#: index.docbook:151
-#, no-c-format
-msgid "To customize your mail summary:"
-msgstr "Personalización del Resumen del correo"
-
-#: index.docbook:155
-#, no-c-format
-msgid "Working with Mail Accounts"
-msgstr "Utilización de cuentas de correo"
-
-#: index.docbook:156
-#, no-c-format
-msgid ""
-"<application>Ximian Evolution</application> allows you to maintain multiple "
-"accounts, or identities. This is useful want to keep personal and "
-"professional email separate, or if you wear several hats at work. When you "
-"are writing an email message, you can which account to use by selecting from "
-"the drop-down list next to the <guilabel>From</guilabel> entry in the "
-"message composer."
-msgstr ""
-"<application>Ximian Evolution</application> le permite administrar varias "
-"cuentas de correo, o identidades, a la vez. Esto es útil cuando desea "
-"diferenciar mensajes profesionales y personales, o cuando ejerce varias "
-"responsabilidades en su trabajo. Cuando escribe un mensaje de correo puede "
-"elegir desde qué cuenta enviarlo en la lista desplegable junto a "
-"<guilabel>De:</guilabel>."
-
-#: index.docbook:157
-#, no-c-format
-msgid ""
-"If you create calendar appointments that overlap, <application>Evolution</"
-"application> will display them side by side in your calendar. However, "
-"<application>Evolution</application> cannot help you do multiple things at "
-"once."
-msgstr ""
-"Si crea citas que se solapan, <application>Evolution</application> las "
-"mostrará en el calendario lado a lado. Sin embargo <application>Evolution</"
-"application> no tiene cómo ayudarle a hacer varias cosas a una misma vez."
-
-#: index.docbook:157
-#, no-c-format
-msgid "Multiple Simultaneous Appointments"
-msgstr "Múltiples citas simultáneas"
-
-#: index.docbook:158 index.docbook:602
-#, no-c-format
-msgid ""
-"Before importing mail from Netscape, make sure you select "
-"<menuchoice><guimenu>File</guimenu><guimenuitem>Compact All Folders</"
-"guimenuitem></menuchoice>. If you don't, <application>Ximian Evolution</"
-"application> will import and undelete the messages in your Trash folders."
-msgstr ""
-"Antes de importar mensajes desde Netscape, asegúrese de seleccionar "
-"<menuchoice><guimenu>Archivo</guimenu><guimenuitem>Compactar todas las "
-"carpetas</guimenuitem></menuchoice>. Si no lo hace, <application>Ximian "
-"Evolution</application> también importará los mensajes borrados de las "
-"carpetas de mensajes eliminados."
-
-#: index.docbook:158 index.docbook:602
-#, no-c-format
-msgid ""
-"Copy the files to the system or partition you use for <application>Ximian "
-"Evolution</application>."
-msgstr ""
-"Copie los archivos al sistema o a la partición que utiliza para "
-"<application>Ximian Evolution</application>."
-
-#: index.docbook:158 index.docbook:602
-#, no-c-format
-msgid "Microsoft Outlook and Outlook Express Users"
-msgstr "Usuarios expertos de Microsoft Outlook y Outlook Express"
-
-#: index.docbook:158 index.docbook:602
-#, no-c-format
-msgid ""
-"Microsoft Outlook, and versions of Outlook Express after version 4, use "
-"proprietary formats that <application>Ximian Evolution</application> cannot "
-"read or import. For contacts, you may have to email them to yourself and "
-"import them that way. For email, there is a simpler workaround:"
-msgstr ""
-"Microsoft Outlook y las versiones de Outlook Express posteriores a la "
-"versión 4, utilizan formatos propietarios que <application>Ximian Evolution</"
-"application> no puede leer ni importar. En el caso de los contactos, debe "
-"enviárselos por correo a si mismo, e importarlos por este procedimiento. En "
-"el caso de los mensajes, existe una solución más sencilla:"
-
-#: index.docbook:158 index.docbook:602
-#, no-c-format
-msgid "Netscape Users"
-msgstr "Usuarios de Netscape"
-
-#: index.docbook:158
-#, no-c-format
-msgid ""
-"Use the <application>Ximian Evolution</application> import tool to import "
-"the files. There's more information about why this works, and how, at the "
-"Ximian support website."
-msgstr ""
-"Utilice la herramienta de importación del programa <application>Ximian "
-"Evolution</application> para importar estos archivos. Encontrará más "
-"explicaciones acerca del porqué y del cómo de este procedimiento en el sitio "
-"Web de asistencia de Ximian."
-
-#: index.docbook:158 index.docbook:602
-#, no-c-format
-msgid ""
-"While using Windows, import the files into Mozilla Mail (or another mailer, "
-"such as Netscape or Eudora, that uses the standard mbox format)."
-msgstr ""
-"Desde Windows, importe los archivos en el cliente Mozilla Mail (o en otro "
-"cliente de correo que utilice el formato mbox estándar, como Netscape o "
-"Eudora)."
-
-#: index.docbook:163
-#, no-c-format
-msgid ""
-"Both local and IMAP Trash folders are actually vFolders that display all "
-"messages you have marked for later deletion. For more information about "
-"vFolders, see <xref linkend=\"usage-mail-organize-vfolders\"/>. Since "
-"emptying your trash expunges the messages in your Trash folder, choosing "
-"<menuchoice> <guimenu>Actions</guimenu> <guimenuitem>Empty Trash</"
-"guimenuitem> </menuchoice> is the same as expunging deleted mail from "
-"<emphasis>all</emphasis> your folders."
-msgstr ""
-"Tanto la carpeta local Papelera como la IMAP realmente son carpetas virtuales "
-"que muestran todos los mensajes que ha marcado para su posterior eliminación. "
-"Para saber más acerca de las carpetas virtuales consulte <xref linkend=\"usage-mail-organize-vfolders\"/>. "
-"Dado que vaciar su papelera purga los mensajes en su carpeta Papelera, elegir"
-"<menuchoice> <guimenu>Acciones</guimenu> <guimenuitem>Vaciar papelera</guimenuitem> "
-"</menuchoice> es lo mismo que purgar el correo borrado en <emphasis>todas</emphasis> "
-"sus carpetas.."
-
-#: index.docbook:163
-#, no-c-format
-msgid ""
-"This is not, however, true for the Trash folder on Exchange servers, which "
-"behaves just the same as it would in Outlook. That is to say, the Trash "
-"folder on an Exchange server is a normal folder with actual messages in it."
-msgstr ""
-"Sin embargo esto no es cierto paro la carpeta Papelera situada en servidores Exchange, "
-"que se comporta exactamente igual que lo haría en Outlook. Es decir, la carpeta Papelera "
-"en un servidor Exchange es una carpeta normal con verdaderos mensajes dentro."
-
-#: index.docbook:163
-#, no-c-format
-msgid "Trash is Actually a vFolder?"
-msgstr "¿Realmente la Papelera es una carpeta virtual?"
-
-#: index.docbook:165
-#, no-c-format
-msgid "Mail Tasks"
-msgstr "Tareas de correo"
-
-#: index.docbook:166
-#, no-c-format
-msgid "Add Sender to Address Book:"
-msgstr "Incluir un remitente a la lista de contactos:"
-
-#: index.docbook:166
-#, no-c-format
-msgid ""
-"Clicking <guibutton>Send/Receive</guibutton> will refresh any IMAP, "
-"<filename>mh</filename>, or <filename>mbox</filename> listings and check and "
-"download mail from all POP servers. In other words, <guibutton>Send/Receive</"
-"guibutton> gets your mail, no matter how many sources you have, or what "
-"types they are. If you don't want to check mail for a given account, select "
-"it in the <guilabel>Mail Accounts</guilabel> tab and click the "
-"<guibutton>Disable</guibutton> button."
-msgstr ""
-"Haga clic en <guibutton>Enviar/Recibir</guibutton> para actualizar todos los "
-"listados IMAP, <filename>mh</filename> o <filename>mbox</filename> así como "
-"para comprobar y descargar su correo de todos los servidores POP. En otras "
-"palabras, <guibutton>Enviar/Recibir</guibutton> trae todo su correo, de "
-"todos los orígenes disponibles. Si no desea recibir correo de alguna cuenta, "
-"selecciónela en la sección <guilabel>Cuentas de correo</guilabel> y haga "
-"clic en <guibutton>Inhabilitar</guibutton>."
-
-#: index.docbook:166
-#, no-c-format
-msgid "Create Filters and Virtual Folders:"
-msgstr "Creación de filtros y carpetas virtuales:"
-
-#: index.docbook:166
-#, no-c-format
-msgid ""
-"Double-click the message you want to view, or select it and press "
-"<keycap>Return</keycap> <keycombo action=\"simul\"> <keycap>Ctrl</keycap> "
-"<keycap>O</keycap> </keycombo>"
-msgstr ""
-"Haga clic dos veces sobre el mensaje que quiera ver o selecciónelo y "
-"presione <keycap>Intro</keycap> o la combinación de teclas <keycombo action="
-"\"simul\"><keycap>Ctrl</keycap> <keycap>O</keycap></keycombo>."
-
-#: index.docbook:166
-#, no-c-format
-msgid "Forward a Message:"
-msgstr "Reenviar un mensaje:"
-
-#: index.docbook:166
-#, no-c-format
-msgid ""
-"Here are the most frequent email tasks, and shortcuts for navigating your "
-"mailbox with the keyboard instead of the mouse:"
-msgstr ""
-"Las tareas de correo más frecuentes y los atajos para desplazarse por su "
-"buzón con el teclado son los siguientes:"
-
-#: index.docbook:166
-#, no-c-format
-msgid "Move the display up and down in the preview pane:"
-msgstr "Moverse adelante y atrás en el panel de visualización de mensajes:"
-
-#: index.docbook:166
-#, no-c-format
-msgid "Navigating the Message List with the Keyboard:"
-msgstr "Moverse por el buzón mediante el teclado:"
-
-#: index.docbook:166
-#, no-c-format
-msgid "Open a Message in a New Window:"
-msgstr "Abrir un mensaje en una nueva ventana:"
-
-#: index.docbook:166
-#, no-c-format
-msgid ""
-"Press <keycap>F9</keycap>, click the <guibutton>Send/Receive</guibutton> "
-"button in the toolbar, or choose <menuchoice><guimenu>Actions</guimenu> "
-"<guimenuitem>Send/Receive</guimenuitem></menuchoice>."
-msgstr ""
-"Presione la tecla <keycap>F9</keycap> o haga clic en <guibutton>Enviar/"
-"Recibir</guibutton> de la barra de herramientas o elija "
-"<menuchoice><guimenu>Acciones</guimenu> <guimenuitem>Enviar/Recibir</"
-"guimenuitem></menuchoice>."
-
-#: index.docbook:166
-#, no-c-format
-msgid ""
-"Press <keycap>]</keycap> or <keycap>.</keycap> to jump to the next unread "
-"message. <keycap>[</keycap> or <keycap>,</keycap> goes to the previous "
-"unread message. Use the arrow keys to move up and down along the list of all "
-"messages."
-msgstr ""
-"Presione <keycap>]</keycap> o <keycap>.</keycap> para saltar al siguiente "
-"mensaje sin leer. <keycap>[</keycap> o <keycap>,</keycap> salta al anterior "
-"mensaje no leído. Use las teclas del cursor para moverse arriba y abajo por "
-"toda la lista de mensajes."
-
-#: index.docbook:166
-#, no-c-format
-msgid ""
-"Press the space bar to go a page down. Press <keycap>Backspace</keycap> to "
-"go a page up."
-msgstr ""
-"Presione la barra de espacio para avanzar una página. Presione la tecla "
-"<keycap>Retroceso</keycap> para volver hacia atrás."
-
-#: index.docbook:166
-#, no-c-format
-msgid "Reply to a Message:"
-msgstr "Responder un mensaje:"
-
-#: index.docbook:166
-#, no-c-format
-msgid ""
-"Right-click on a message and select <guimenuitem>Add Sender to Address Book</"
-"guimenuitem>. You can also right-click on any email address to add it to "
-"your address book."
-msgstr ""
-"Haga clic con el botón derecho sobre un mensaje y elija <guimenuitem>Añadir "
-"remitente a la libreta de direcciones</guimenuitem>. También puede pulsar el "
-"botón derecho sobre cualquier dirección de correo y agregarla a su lista de "
-"contactos."
-
-#: index.docbook:166
-#, no-c-format
-msgid ""
-"Right-click on a message and select <guimenuitem>Create Rule From Message</"
-"guimenuitem>. You can also create filters and virtual folders in the "
-"<guimenu>Tools</guimenu> menu."
-msgstr ""
-"Haga clic con el botón derecho en un mensaje y elija <guimenuitem>Crear una "
-"regla con el mensaje</guimenuitem>. También puede crear filtros y carpetas "
-"virtuales desde el menú <guimenu>Herramientas</guimenu>."
-
-#: index.docbook:166
-#, no-c-format
-msgid ""
-"Select the message or messages you want to forward, and click "
-"<guibutton>Forward</guibutton> in the toolbar, or press <keycombo action="
-"\"simul\"> <keycap>Ctrl</keycap> <keycap>F</keycap> </keycombo>"
-msgstr ""
-"Seleccione los mensajes que quiera reenviar (uno o varios) y haga clic en "
-"<guibutton>Reenviar</guibutton> en la barra de tareas o presione la "
-"combinación de teclas <keycombo action=\"simul\"><keycap>Ctrl</"
-"keycap><keycap>F</keycap></keycombo>."
-
-#: index.docbook:166
-#, no-c-format
-msgid "Send and Receive Mail:"
-msgstr "Enviar y recibir correo:"
-
-#: index.docbook:166
-#, no-c-format
-msgid ""
-"To reply to the sender and all the other visible recipients of the message, "
-"click <guibutton>Reply to All</guibutton> or select the message and press "
-"<keycombo action=\"simul\"> <keycap>Shift</keycap> <keycap>Ctrl</keycap> "
-"<keycap>R</keycap> </keycombo>"
-msgstr ""
-"Para responder al remitente y a todos los destinatarios visibles haga clic "
-"en <guibutton>Re: Todos</guibutton> o seleccione el mensaje y presione la "
-"combinación de teclas <keycombo action=\"simul\"><keycap>Mayús</"
-"keycap><keycap>Ctrl</keycap><keycap>R</keycap></keycombo>."
-
-#: index.docbook:166
-#, no-c-format
-msgid ""
-"To reply to the sender of the message only: click <guibutton>Reply</"
-"guibutton> in the toolbar, or press <keycombo action=\"simul\"> "
-"<keycap>Ctrl</keycap> <keycap>R</keycap> </keycombo>"
-msgstr ""
-"Para responder al remitente de un mensaje sencillamente haga clic en "
-"<guibutton>Responder</guibutton> en la barra de tareas o presione la "
-"combinación de teclas <keycombo action=\"simul\"> <keycap>Ctrl</keycap> "
-"<keycap>R</keycap> </keycombo>."
-
-#: index.docbook:167
-#, no-c-format
-msgid "A window will pop up on your screen to remind you of your appointment."
-msgstr "Se abrirá una ventana en la pantalla para recordable su cita."
-
-#: index.docbook:167
-#, no-c-format
-msgid "Audio:"
-msgstr "Reproducir un sonido:"
-
-#: index.docbook:167
-#, no-c-format
-msgid "Choose this to have your computer deliver a sound alarm."
-msgstr "Elíjalo si quiere que sus sistema emita un sonido como alarma."
-
-#: index.docbook:167
-#, no-c-format
-msgid "Display:"
-msgstr "Mostrar un mensaje:"
-
-#: index.docbook:167
-#, no-c-format
-msgid "Program:"
-msgstr "Ejecutar un programa:"
-
-#: index.docbook:167
-#, no-c-format
-msgid ""
-"Select this if you would like to run a program as a reminder. You can enter "
-"its name in the text field, or find it with the <guibutton>Browse</"
-"guibutton> button."
-msgstr ""
-"Elija esto si quiere ejecutar un programa como recordatorio. Debe introducir "
-"el nombre en el campo de texto o buscarlo con el botón <guibutton>Explorar</"
-"guibutton>."
-
-#: index.docbook:167
-#, no-c-format
-msgid ""
-"You can have several <guilabel>Reminders</guilabel>, any time prior to the "
-"appointment you've scheduled. You can have one reminder of each of the "
-"following types:"
-msgstr ""
-"Puede tener varios tipos de <guilabel>Alarmas</guilabel> con cualquier antelación "
-"a la cita que ha planificado. Puede tener un recordatorio de cada uno de los siguientes tipos:"
-
-#: index.docbook:169
-#, no-c-format
-msgid "\"Recall Message\" function."
-msgstr "Función «Mensaje de recuperación»."
-
-#: index.docbook:169
-#, no-c-format
-msgid "There are, however, some features which are not available:"
-msgstr "Algunas características no están sin embargo disponibles:"
-
-#: index.docbook:169
-#, no-c-format
-msgid "Work Offline (disconnected mode)."
-msgstr "Función «Trabajar desconectado» (modo desconectado)."
-
-#: index.docbook:178
-#, no-c-format
-msgid ""
-"To add a new account, simply click <guibutton>Add</guibutton> to open the "
-"mail configuration assistant. To alter an existing identity, select it in "
-"the <interface>Preferences</interface> window, and then click "
-"<guibutton>Edit</guibutton> to open the account editor dialog."
-msgstr ""
-"Para agregar una cuenta, haga clic en <guibutton>Añadir</guibutton> para "
-"abrir el asistente de configuración del correo. Para modificar una identidad "
-"existente, selecciónela y haga clic en <guibutton>Editar</guibutton> para "
-"abrir el cuadro de diálogo del editor de cuentas."
-
-#: index.docbook:183
-#, no-c-format
-msgid "Customizing Your Schedule Summary"
-msgstr "Haga clic en <guibutton>Añadir</guibutton>."
-
-#: index.docbook:184
-#, no-c-format
-msgid ""
-"Choose whether you'd like appointments displayed for one day, five days, a "
-"week, or a month."
-msgstr "Elija la ficha <guibutton>Planificación</guibutton>."
-
-#: index.docbook:184
-#, no-c-format
-msgid "Choose whether you'd like to display all tasks, or just the tasks due today."
-msgstr "Indique si desea agrupar sus citas por un día, cinco, una semana o un mes."
-
-#: index.docbook:184
-#, no-c-format
-msgid "Click the <guibutton>Schedule</guibutton> tab."
-msgstr ""
-"Elija <menuchoice> <guimenu>Herramientas</guimenu> "
-"<guimenuitem>Configuración</guimenuitem> </menuchoice> y a continuación "
-"<guilabel>Preferencias del Resumen</guilabel>."
-
-#: index.docbook:184
-#, no-c-format
-msgid "To customize your calendar summary:"
-msgstr "Personalización del Resumen de planificación"
-
-#: index.docbook:185
-#, no-c-format
-msgid "Undeleting Messages"
-msgstr "Recuperar mensajes"
-
-#: index.docbook:186
-#, no-c-format
-msgid ""
-"If you have marked a message for deletion, undeleting it will unmark it, and "
-"the message will be removed from the Trash folder. However, it can't bring "
-"back messages that have been expunged."
-msgstr ""
-"Si ha marcado un mensaje para su eliminación, recuperándolo eliminará la marca y el "
-"mensaje se borrará de la carpeta Papelera. Sin embargo no se pueden recuperar "
-"mensajes que ya han sido purgados."
-
-#: index.docbook:186
-#, no-c-format
-msgid "Installing the Connector"
-msgstr "Instalación de Connector"
-
-#: index.docbook:186
-#, no-c-format
-msgid ""
-"Press <keycombo action=\"simul\"><keycap>Ctrl</keycap><keycap>U</keycap> </"
-"keycombo> or choose <menuchoice> <guimenu>Edit</guimenu> "
-"<guimenuitem>Undelete</guimenuitem> </menuchoice>"
-msgstr ""
-"Pulse <keycombo action=\"simul\"><keycap>Ctrl</keycap><keycap>U</keycap> </keycombo> "
-"o elija <menuchoice> <guimenu>Editar</guimenu> <guimenuitem>Recuperar</guimenuitem> </menuchoice>"
-
-#: index.docbook:186
-#, no-c-format
-msgid "Select a message you have marked for deletion."
-msgstr "Seleccione un mensaje que haya marcado para su eliminación."
-
-#: index.docbook:186
-#, no-c-format
-msgid "To undelete a message:"
-msgstr "Para recuperar un mensaje:"
-
-#: index.docbook:186
-#, no-c-format
-msgid "What does Undelete actually do?"
-msgstr "¿Qué es lo que Recuperar hace realmente?"
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"<guilabel>Apply Filters to new messages in Inbox on this server</guilabel>: "
-"check this box if you wish to apply filters to this account."
-msgstr ""
-"<guilabel>Aplicar filtros a los mensajes nuevos en el buzón de entrada de este "
-"servidor</guilabel>: active esta casilla si quiere aplicar filtros al correo de esta cuenta."
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"<guilabel>Apply filters to new messages in INBOX on this server</guilabel>: "
-"If you'd like your filters to work on this account, check this box."
-msgstr ""
-"<guilabel>Aplicar filtros a los mensajes nuevos en el buzón de entrada</guilabel>: "
-"active esta casilla si desea aplicar sus filtros en el correo de esta cuenta."
-
-# #-#-#-#-# config-prefs.po #-#-#-#-#
-# index.docbook:179, index.docbook:179, index.docbook:179
-# #-#-#-#-# usage-mainwindow.po (usage-mainwindow) #-#-#-#-#
-# index.docbook:321, index.docbook:321, index.docbook:321
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"<guilabel>Checking for new mail</guilabel>: If you would like "
-"<application>Evolution</application> to check for new mail automatically, "
-"check the box and select a frequency in minutes."
-msgstr ""
-"<guilabel>Descargar el correo nuevo</guilabel>: si quiere que "
-"<application>Evolution</application> descargue automáticamente su correo nuevo, "
-"active esta casilla y elija la frecuencia en minutos."
-
-# #-#-#-#-# config-prefs.po #-#-#-#-#
-# index.docbook:179, index.docbook:179, index.docbook:179
-# #-#-#-#-# usage-mainwindow.po (usage-mainwindow) #-#-#-#-#
-# index.docbook:321, index.docbook:321, index.docbook:321
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"<guilabel>Checking for new mail</guilabel>: If you would like Evolution to "
-"check for new mail automatically, check the box and select a frequency in "
-"minutes."
-msgstr ""
-"<guilabel>Descargar el correo nuevo</guilabel>: si quiere que "
-"<application>Evolution</application> descargue automáticamente su correo nuevo, "
-"active esta casilla y elija la frecuencia en minutos."
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"<guilabel>Global Catalog server name</guilabel>: enter the name of your "
-"Global Catalog server to create a folder for your organization's Global "
-"Address List."
-msgstr ""
-"<guilabel>Global Catalog server name</guilabel>: escriba el nombre de su servidor "
-"Global de Catálogo para crear una carpeta para la Lista Global de Direcciones de su "
-"organización."
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"<guilabel>Limit number of Responses</guilabel>: Select a maximum number of "
-"results for an address search. Lowering the maximum number the load on your "
-"system and on your network. Most servers will not send more than 1000 "
-"results, regardless of the value you select here."
-msgstr ""
-"<guilabel>Limitar el número de respuestas</guilabel>: elija el número máximo "
-"de resultados en la búsqueda de una dirección. Este número limita la carga de "
-" sistema y de la red. La mayoría de los servidores no envían más de 1000 resultados "
-"a pesar del valor que haya elegido aquí."
-
-#: index.docbook:187
-#, no-c-format
-msgid "<guilabel>Mailbox Name</guilabel>: Enter your mailbox name."
-msgstr "<guilabel>Nombre del buzón</guilabel>: indique el nombre de su buzón"
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"<guilabel>OWA Path</guilabel>: Enter the path used with Outlook Web Access "
-"on your server."
-msgstr ""
-"<guilabel>OWA Path</guilabel>: indique la ruta usada en su servidor con Outlook Web "
-"Access."
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"<guilabel>Override server-supplied namespace</guilabel>: If you like, enter "
-"a specific directory where your server stores mail for you. Typical values "
-"are \"mail\" and \"Mail.\" For more information about how to use IMAP mail, "
-"see <xref linkend=\"usage-mail-subscriptions\"/>."
-msgstr ""
-"<guilabel>Sobreescribir el espacio de nombres proporcionado por el servidor</guilabel>: "
-" si lo desea, especifique el directorio donde su servidor almacena su correo. Los "
-"nombres más comunes son «mail» y «Mail». Para obtener más información "
-"acerca de cómo utilizar el protocolo de correo IMAP, consulte "
-"<xref linkend=\"usage-mail-subscriptions\"/>."
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"<guilabel>Public Folder Server</guilabel>: Enter the name of your public "
-"folder server, if it differs from your Exchange server."
-msgstr ""
-"<guilabel>Public Folder Server</guilabel>: escriba el nombre su servidor de carpetas "
-"públicas, si es que es diferente de su servidor Exchange."
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"<guilabel>Show only subscribed folders</guilabel>: Check this box if you "
-"have more folders in your IMAP view than you want to read."
-msgstr ""
-"<guilabel>Mostrar sólo las carpetas suscritas</guilabel>: active esta opción si la vista "
-"IMAP muestra más carpetas que las que desea leer."
-
-# index.docbook:179, index.docbook:179
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"<guilabel>Store status headers in Elm/Pine/Mutt format</guilabel>: If you "
-"would like to use the X-Status header format used by the mail clients Elm, "
-"Pine, and Mutt, select this option. This option is useful if you plan to "
-"check your mail with those clients from time to time."
-msgstr ""
-"<guilabel>Almacenar información de estado en las cabeceras en formato "
-"Elm/Pine/Mutt</guilabel>: permite a clientes de correo como Elm, Pine y Mutt, "
-"utilizar el formato de cabecera X-Status. Esta opción es útil si tiene previsto examinar "
-"su correo de vez en cuando con alguno de estos clientes."
-
-# #-#-#-#-# config-prefs.po #-#-#-#-#
-# index.docbook:179, index.docbook:179, index.docbook:179
-# #-#-#-#-# usage-mainwindow.po (usage-mainwindow) #-#-#-#-#
-# index.docbook:321, index.docbook:321, index.docbook:321
-#: index.docbook:187 index.docbook:300
-#, no-c-format
-msgid ""
-"Checking for new mail: If you would like <application>Evolution</"
-"application> to check for new mail automatically, check the box and select a "
-"frequency in minutes."
-msgstr ""
-"Descargar el correo nuevo: para que <application>Evolution</application> "
-"descargue automáticamente su correo nuevo, active esta casilla y elija la "
-"frecuencia en minutos."
-
-#: index.docbook:187
-#, no-c-format
-msgid "Defaults"
-msgstr "Predeterminados"
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"Here, decide whether you'd like to check for mail automatically and how "
-"often, as well as other message retrieval options."
-msgstr ""
-"Aquí decide si quiere descargar su correo automáticamente y con qué "
-"frecuencia, así como otras opciones de recuperación de los mensajes."
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"Here, enter the name, email address, and other identifying information for "
-"the account. You may also choose a default signature to insert into messages "
-"sent from this account."
-msgstr ""
-"Escriba el nombre de la cuenta, la dirección de correo y otra información de "
-"identificación de la cuenta. También puede elegir una firma predeterminada para "
-"añadirla al final de los mensajes enviados desde esta cuenta."
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"Here, select the way you will be getting mail: you may download mail from a "
-"server (<glossterm linkend=\"pop\">POP</glossterm>), read and keep it on the "
-"server (Microsoft Exchange or <glossterm linkend=\"imap\">IMAP</glossterm>), "
-"or read it from files that already exist on your desktop computer. If you "
-"use a server, it may permit or require you to use a Secure Socket Layer "
-"(SSL) connection. To turn SSL connections on, just click the <guibutton>Use "
-"Secure Connection (SSL)</guibutton> button."
-msgstr ""
-"Especifique de qué manera desea consultar su correo: puede descargarlo desde "
-"un servidor ( <glossterm linkend=\"pop\">POP</glossterm>); puede leerlo y "
-"conservarlo en el mismo servidor (Microsoft Exchange o <glossterm linkend="
-"\"imap\">IMAP</glossterm>), así como leer ficheros que ya están en su "
-"escritorio. Es posible que el servidor le permita utilizar conexiones "
-"cifradas (SSL), que puede activar con <guibutton>Usar conexiones seguras "
-"(SSL)</guibutton>."
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"Here, you can decide where this account will store the messages that it has "
-"sent, and the messages that you save as drafts. If you wish to revert to the "
-"\"factory\" settings, click the <guibutton>Restore Defaults</guibutton> "
-"button."
-msgstr ""
-"Puede decidir dónde quiere que esta cuenta almacene los mensajes enviados y "
-"los guardados como borradores. Si quiere restaurar la configuración «de fábrica» "
-"pulse sobre el botón <guibutton>Predeterminados</guibutton>."
-
-# index.docbook:342, index.docbook:514
-#: index.docbook:187 index.docbook:342 index.docbook:539
-#, no-c-format
-msgid "Identity"
-msgstr "Identidad"
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"If you choose Exchange or Sendmail, you're done with this tab. SMTP offers "
-"you a choice of hostname, connection security level, and authentication "
-"type, which you will recognize as similar to those for IMAP and POP servers "
-"in the <guilabel>Receiving Mail</guilabel> tab."
-msgstr ""
-"Si eligió Exchange o Sendmail ya ha acabado con esta solapa. SMTP le permite elegir "
-"un servidor, el nivel de seguridad del servidor y un tipo de autenticación, que podrá "
-"reconocer como familiar a la usada por los servidores IMAP y POP en la solapa "
-"<guilabel>Recibiendo correo</guilabel> "
-
-#: index.docbook:187 index.docbook:300
-#, no-c-format
-msgid "If you chose IMAP:"
-msgstr "Si oligió IMAP:"
-
-#: index.docbook:187 index.docbook:300
-#, no-c-format
-msgid "If you chose Microsoft Exchange:"
-msgstr "Si oligió Microsoft Exchange:"
-
-#: index.docbook:187
-#, no-c-format
-msgid "If you chose POP:"
-msgstr "Si seleccionó el protocolo POP:"
-
-#: index.docbook:187 index.docbook:300
-#, no-c-format
-msgid ""
-"If you want <application>Evolution</application> to check for new messages "
-"in <emphasis>all</emphasis> your IMAP folders, make sure the <guilabel>Check "
-"for new messages in all folders</guilabel> box is selected."
-msgstr ""
-"Si desea que <application>Evolution</application> descargue <emphasis>todos</"
-"emphasis> los mensajes nuevos de sus carpetas IMAP, compruebe que la casilla "
-"<guilabel>Comprobar si hay mensajes nuevos en todas las carpeta</guilabel> "
-"está activada."
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"If you wish to send someone a copy of every message from this account, check "
-"the box labeled <guilabel>Always carbon-copy (Cc) to:</guilabel> or "
-"<guilabel>Always blind carbon-copy (Bcc) to:</guilabel>, and enter one or "
-"more addresses."
-msgstr ""
-"Si quiere mandar copia de cada mensaje de esta cuenta a alguna persona, active la "
-"casilla titulada <guilabel>Siempre Cc</guilabel> o <guilabel> Siempre Cco</guilabel> e "
-"introduzca una o más direcciones."
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"In this section, you will choose and configure a method for sending mail. "
-"You may choose <glossterm linkend=\"smtp\">SMTP</glossterm>, Microsoft "
-"Exchange (if you have purchased the Ximian Connector for Microsoft Exchange) "
-"or <glossterm linkend=\"sendmail\">sendmail</glossterm>."
-msgstr ""
-"Puede elegir y configurar el método de envío de correo. Puede optar entre "
-"<glossterm linkend=\"smtp\">SMTP</glossterm>, Microsoft Exchange (si ha "
-"comprado Ximian Connector para Microsoft Exchange) o <glossterm linkend="
-"\"sendmail\">sendmail</glossterm>."
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"In this section, you will set the security options for this account. If you "
-"use encryption, enter your PGP key id (see <xref linkend=\"encryption\"/> "
-"for more information) and select among the four options below to determine "
-"key and signature handling."
-msgstr ""
-"Puede definir las opciones de seguridad de esta cuenta. Si usa cifrado "
-"escriba su Id. de clave PGP (para más información consulte <xref linkend=\"encryption\"/>)"
-"y elija entre las cuatro opciones disponibles la manera de manejar su clave y firma."
-
-#: index.docbook:187 index.docbook:300
-#, no-c-format
-msgid ""
-"Message Storage: If you'd like to store copies of your mail on the server, "
-"check this option."
-msgstr ""
-"Almacenamiento de mensajes: active esta casilla si quiere almacenar copias "
-"de su correo en el servidor."
-
-# #-#-#-#-# usage-exchange.po #-#-#-#-#
-# index.docbook:342, index.docbook:514
-#: index.docbook:187 index.docbook:342 index.docbook:539
-#, no-c-format
-msgid "Receiving Mail"
-msgstr "Recepción de correo"
-
-#: index.docbook:187 index.docbook:539
-#, no-c-format
-msgid "Receiving Options"
-msgstr "Opciones de recepción"
-
-#: index.docbook:187
-#, no-c-format
-msgid "Security"
-msgstr "Seguridad"
-
-# #-#-#-#-# usage-exchange.po #-#-#-#-#
-# index.docbook:342, index.docbook:514
-#: index.docbook:187 index.docbook:342 index.docbook:539
-#, no-c-format
-msgid "Sending Mail"
-msgstr "Envío de correo"
-
-#: index.docbook:187
-#, no-c-format
-msgid "Specifying Port Numbers"
-msgstr "Especificación de los números de puerto"
-
-# index.docbook:179, index.docbook:179
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"Store Store status headers in Elm/Pine/Mutt format: If you would like to use "
-"the X-Status header format used by the mail clients Elm, Pine, and Mutt, "
-"select this option. This option is useful if you plan to check your mail "
-"with those clients from time to time."
-msgstr ""
-"Almacenar información de estado en las cabeceras en formato Elm/Pine/Mutt: "
-"permite a clientes de correo como Elm, Pine y Mutt, utilizar el formato de "
-"cabecera X-Status. Esta opción es útil si tiene previsto examinar su correo "
-"de vez en cuando con alguno de estos clientes."
-
-#: index.docbook:187
-#, no-c-format
-msgid "The account editor dialog has six sections:"
-msgstr "El cuadro de diálogo del editor de cuentas cuenta con seis secciones:"
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"To install the Ximian Connector, run Ximian Red Carpet by selecting "
-"<menuchoice><guimenu>System</guimenu><guimenuitem>Get Software</"
-"guimenuitem></menuchoice>. Subscribe to the Ximian Connector for Microsoft "
-"Exchange channel, select the Ximian Connector for Microsoft Exchange2000, "
-"and click the <guibutton>Install</guibutton> button. You can also install "
-"the Connector by downloading the individual packages from ftp.ximian.com if "
-"you wish."
-msgstr ""
-"Para instalar Ximian Connector, ejecute la herramienta Ximian Red Carpet: "
-"seleccione <menuchoice><guimenu>Sistema</guimenu><guimenuitem>Obtener "
-"software</guimenuitem></menuchoice>. Suscríbase al canal Ximian Connector "
-"para Microsoft Exchange, seleccione Ximian Connector para Microsoft "
-"<application>Exchange 2000</application> y haga clic en <guibutton>Instalar</"
-"guibutton>. Si lo desea también puede instalar Connector descargando individualmente "
-"los paquetes desde ftp.ximian.com."
-
-#: index.docbook:187
-#, no-c-format
-msgid ""
-"Your system administrator may ask you to connect to a specific port on a "
-"mail server. To specify which port you use, just type a colon and the port "
-"number after the server name. For example, to connect to port 143 on the "
-"server smtp.omniport.com, you would enter as <userinput> smtp.omniport."
-"com:143 </userinput> as the server name."
-msgstr ""
-"Es posible que su administrador de sistemas le indique de debe conectarse a "
-"través de un puerto específico de su servidor. Para especificarlo, a "
-"continuación del nombre del servidor, escriba un signo de dos puntos y el "
-"número de puerto. Por ejemplo, para conectar a través del puerto 143 del "
-"servidor smtp.todostuspuertos.com, escriba el nombre de servidor como sigue: "
-"<userinput> smtp.todostuspuertos.com:143 </userinput> ."
-
-#: index.docbook:198
-#, no-c-format
-msgid ""
-"Once you have installed the software, you will also need to install a "
-"license file. The license file is the verification that you have paid for a "
-"license to use the Ximian Connector. You can get the license file from the "
-"the Ximian online store at <ulink url=\"http://store.ximian.com\">store."
-"ximian.com</ulink>. You will need a browser with strong (128-bit or greater) "
-"encryption to access the store. When you purchase a Ximian Connector "
-"license, the store will mail you the license file with instructions for "
-"installation. Once installed, the license file unlocks the Ximian Connector "
-"functionality and you may connect to an Exchange server."
-msgstr ""
-"Tras el programa, necesitará instalar también un archivo de licencia. El "
-"archivo de licencia es el comprobante de pago de la licencia de uso del "
-"programa Ximian Connector. Puede obtener el archivo de licencia en la tienda "
-"en línea de Ximian, en la dirección <ulink url=\"http://store.ximian.com"
-"\">store.ximian.com</ulink>. Es necesario utilizar un navegador con una "
-"fuerte capacidad de cifrado (128 bits o más) para tener acceso al servicio "
-"en línea. Tras adquirir una licencia Ximian Connector, el servicio le envía "
-"el archivo correspondiente, con instrucciones de instalación. Una vez "
-"instalado, el archivo de licencia desbloquea las funciones operativas de "
-"Ximian Connector y le permite conectarse a un servidor "
-"<application>Exchange</application>."
-
-#: index.docbook:205
-#, no-c-format
-msgid ""
-"If you have stored reminders in a local calendar, they will work from the "
-"moment you log in. However, for reminders stored on an Exchange server, you "
-"must run Evolution at least once after logging in. No matter where the "
-"reminders are stored, you can quit Evolution and still be reminded of an "
-"upcoming appointment."
-msgstr ""
-"Si ha almacenado recordatorios en el calendario local, tendrán efecto desde "
-"el momento en el que inicie su sesión en el sistema. Sin embargo, para "
-"recibir recordatorios almacenados en el servidor Exchange, deberá ejecutar "
-"Evolution al menos una vez tras el inicio de sesión. Con independencia del "
-"modo de almacenamiento, si sale de Evolution recibirá los recordatorios de "
-"las citas próximas."
-
-#: index.docbook:205
-#, no-c-format
-msgid "Reminders Without Evolution"
-msgstr "Recordatorios sin Evolution"
-
-#: index.docbook:211
-#, no-c-format
-msgid "Sorting Mail with Column Headers"
-msgstr "Uso de cabeceras para ordenar los mensajes"
-
-#: index.docbook:212
-#, no-c-format
-msgid ""
-"By default, the message list has columns with the following headings: an "
-"envelope icon indicating whether you have read or replied to a message, an "
-"exclamation point indicating priority, and the <guilabel>From</guilabel>, "
-"<guilabel>Subject</guilabel>, and <guilabel>Date</guilabel> fields. You can "
-"change their order and remove them by dragging and dropping them. To add "
-"columns:"
-msgstr ""
-"De forma predeterminada, la lista de mensajes incluye columnas con las "
-"cabeceras siguientes: el icono de un sobre que indica si el mensaje ha sido "
-"leído o contestado; un signo de admiración que indica la prioridad y los "
-"campos <guilabel>De</guilabel>, <guilabel>Asunto</guilabel> y "
-"<guilabel>Fecha</guilabel>. Puede arrastar las columnas para cambiar su "
-"orden o para eliminarlas. Para agregar columnas:"
-
-#: index.docbook:212
-#, no-c-format
-msgid "Click <guimenuitem>Add a Column</guimenuitem>"
-msgstr "Haga clic en <guimenuitem>Añadir una columna</guimenuitem>"
-
-#: index.docbook:212
-#, no-c-format
-msgid ""
-"Click and drag a column you want into a space between existing column "
-"headers. A red arrow will show you where the column will be placed."
-msgstr ""
-"Arrastre la columna hasta la posición deseada entre dos cabeceras "
-"existentes. Una flecha roja le indica el lugar donde quedará la columna."
-
-#: index.docbook:212
-#, no-c-format
-msgid "Right click on the column header"
-msgstr "Haga clic con el botón derecho sobre las cabeceras de las columnas"
-
-#: index.docbook:214
-#, no-c-format
-msgid ""
-"The last item in the <guilabel>General</guilabel> tab is the "
-"<guilabel>Categories</guilabel> organization tool; for information on that, "
-"read <xref linkend=\"usage-contact-organize\"/>."
-msgstr ""
-"El último elemento de la ficha <guilabel>General</guilabel> es el de la "
-"herramienta de organización de las <guilabel>Categorías</guilabel>. Para "
-"obtener información acerca de esta herramienta, consulte <xref linkend="
-"\"usage-contact-organize\"/>."
-
-#: index.docbook:215
-#, no-c-format
-msgid "Adding your Exchange Account in Ximian Evolution"
-msgstr "Añadir su cuenta Exchange a Ximian Evolution"
-
-#: index.docbook:216
-#, no-c-format
-msgid ""
-"Once you have installed the Connector, you need to set up access for your "
-"Exchange account on both the Exchange server and within Evolution."
-msgstr ""
-"Tras instalar el programa Connector, necesita configurar el acceso a su cuenta "
-"<application>Exchange</application> tanto en el servidor "
-"<application>Exchange</application> como en el programa Evolution."
-
-#: index.docbook:217
-#, no-c-format
-msgid ""
-"<guilabel>Classification</guilabel> only applies to calendars on a network. "
-"<guilabel>Public</guilabel> is the default category, and a public "
-"appointment can be viewed by anyone on the calendar sharing network. "
-"<guilabel>Private</guilabel> denotes one level of security, and "
-"<guilabel>Confidential</guilabel> an even higher level."
-msgstr ""
-"La <guilabel>Clasificación</guilabel> sólo se aplica a los calendarios "
-"compartidos en red. La categoría predeterminada es <guilabel>Publico</"
-"guilabel>, y una cita pública puede ser examinada por cualquier miembro del "
-"calendario compartido. <guilabel>Privado</guilabel> es un nivel de seguridad "
-"y <guilabel>Confidencial</guilabel> es un nivel aún más alto."
-
-#: index.docbook:220
-#, no-c-format
-msgid "Contact Shortcuts"
-msgstr "Atajos asociados a los contactos"
-
-#: index.docbook:220
-#, no-c-format
-msgid "The <guilabel>Details</guilabel> tab is much simpler:"
-msgstr "La ficha <guilabel>Detalles</guilabel> es mucho más sencilla:"
-
-#: index.docbook:220
-#, no-c-format
-msgid "The briefcase - Describes the person's professional life"
-msgstr "El maletín - Para apuntes sobre el historial profesional"
-
-#: index.docbook:220
-#, no-c-format
-msgid "The face - Describes the person's personal life"
-msgstr "La careta - Para apuntes sobre la persona"
-
-#: index.docbook:220
-#, no-c-format
-msgid "The globe - Miscellanious notes"
-msgstr "El globo terráqueo - Para otros apuntes."
-
-#: index.docbook:220
-#, no-c-format
-msgid ""
-"You can add cards from within an email message or calendar appointment. "
-"While looking at an email, right-click on any email address or message, and "
-"choose <guimenuitem>Create Card for this Address</guimenuitem> or "
-"<guimenuitem>Create Card for this Sender</guimenuitem> from the menu."
-msgstr ""
-"Es posible agregar tarjetas a partir de un mensaje de correo o de una cita "
-"del calendario. Con el mensaje abierto, haga clic con el botón derecho en "
-"cualquier dirección o mensaje de correo electrónico, y elija en el menú "
-"<guimenuitem>Añadir remitente a la libreta de direcciones</guimenuitem>."
-
-#: index.docbook:222
-#, no-c-format
-msgid "Checking for New Mail"
-msgstr "Comprobación de correo nuevo"
-
-#: index.docbook:223
-#, no-c-format
-msgid "Exchange Server Settings"
-msgstr "Configuración del servidor Exchange"
-
-#: index.docbook:223
-#, no-c-format
-msgid ""
-"Now that you've had a look around the <interface>Inbox</interface>, it's "
-"time to check for new mail. Click <guibutton>Send/Receive</guibutton> in the "
-"toolbar to check your mail. If you haven't entered any mail settings yet, "
-"the <interface>setup assistant</interface> will ask you for the information "
-"it needs to check your email."
-msgstr ""
-"Ahora que le ha dado un vistazo a la <interface>Bandeja de entrada</interface> "
-"es el momento para comprobar el correo nuevo. Haga clic en"
-"<guibutton>Enviar/Recibir</guibutton> en la barra de herramientas. Si aún no ha "
-"introducido ninguna configuración de correo el <interface>asistente de configuración</interface> "
-"le preguntará la información que necesita para descargar su correo."
-
-#: index.docbook:224
-#, no-c-format
-msgid "Check with your system administrator to ensure that:"
-msgstr "Compruebe con el administrador del sistema los puntos siguientes:"
-
-#: index.docbook:224
-#, no-c-format
-msgid ""
-"You are permitted to access the account with WebDAV. This is the default "
-"setting for the Exchange server, so unless your system administrator has "
-"specifically turned it off, no changes should be necessary."
-msgstr ""
-"Su acceso a la cuenta está autorizado mediante WebDAV. Este es el valor "
-"predeterminado del servidor <application>Exchange</application>, y no debería ser"
-"necesario modificarlo, a menos que su administrador de sistema lo haya "
-"deshabilitado."
-
-#: index.docbook:224
-#, no-c-format
-msgid "You have a valid account on the Exchange server."
-msgstr "Posee una cuenta válida en el servidor <application>Exchange</application>."
-
-#: index.docbook:226
-#, no-c-format
-msgid ""
-"<application>Evolution</application> can handle free/busy scheduling Using "
-"the Ximian Connector on a Microsoft Exchange 2000 server. For more "
-"information about Ximian Connector, see <xref linkend=\"usage-exchange\"/>."
-msgstr ""
-"<application>Evolution</application> puede planificar su disponibilidad si "
-"está usando Ximian Connector en un servidor Microsoft Exchange 2000. Para "
-"obtener más información acerca de Ximian Connector consulte <xref linkend="
-"\"usage-exchange\"/>."
-
-#: index.docbook:231
-#, no-c-format
-msgid "The assistant will give you several dialog boxes where you configure:"
-msgstr "El asistente le presentará una serie de ventanas donde puede configurar:"
-
-#: index.docbook:231
-#, no-c-format
-msgid "your mail account identity name"
-msgstr "el nombre identificativo de su cuenta"
-
-#: index.docbook:231
-#, no-c-format
-msgid "your outgoing email server information"
-msgstr "datos del servidor para el correo saliente"
-
-#: index.docbook:231
-#, no-c-format
-msgid "your personal information"
-msgstr "su información personal"
-
-#: index.docbook:232
-#, no-c-format
-msgid ""
-"To set your appointment to be free or busy, simply click the box in the "
-"<guilabel>Show Time As</guilabel> section in the <guilabel>Appointment "
-"Editor</guilabel>."
-msgstr ""
-"Para fijar su cita como libre u ocupada, haga clic en el cuadro de la "
-"sección <guilabel>Mostrar tiempo como</guilabel> del <guilabel>Editor de "
-"citas</guilabel>."
-
-#: index.docbook:237
-#, no-c-format
-msgid ""
-"<application>Evolution</application> lets you categorize your appointments, "
-"which can help if you lead a busy life. The bottom section of the "
-"<guilabel>Appointment</guilabel> tab is where your categorization is done."
-msgstr ""
-"Si lleva una vida ajetreada, <application>Evolution</application> puede "
-"ayudarle a clasificar sus citas . Esta clasificación se realiza en la "
-"sección al pie de la ficha <guilabel>Cita</guilabel>."
-
-#: index.docbook:237
-#, no-c-format
-msgid ""
-"If you selected POP, Microsoft Exchange, or IMAP as your mail server, you'll "
-"need to enter some more information:"
-msgstr ""
-"Si ha elegido un servidor de correo POP, Microsoft Exchange o IMAP, es "
-"necesario introducir la siguiente información:"
-
-#: index.docbook:241
-#, no-c-format
-msgid "<guimenuitem>Customize Current View</guimenuitem>:"
-msgstr "<guimenuitem>Personalizar vista actual</guimenuitem>:"
-
-#: index.docbook:241
-#, no-c-format
-msgid "<guimenuitem>Remove this Column</guimenuitem>:"
-msgstr "<guimenuitem>Quitar esta columna</guimenuitem>:"
-
-#: index.docbook:241
-#, no-c-format
-msgid "<guimenuitem>Sort Ascending</guimenuitem>:"
-msgstr "<guimenuitem>Orden ascendente</guimenuitem>:"
-
-#: index.docbook:241
-#, no-c-format
-msgid "<guimenuitem>Sort Descending</guimenuitem>:"
-msgstr "<guimenuitem>Orden descendente</guimenuitem>:"
-
-#: index.docbook:241
-#, no-c-format
-msgid ""
-"Choose this item to pick a more complex sort order for messages, or to "
-"choose which columns of information about your messages you wish to display"
-msgstr ""
-"Elija este elemento para escoger un orden de los mensajes más complejo o para "
-"elegir qué columnas quiere ver con la información de sus mensajes."
-
-#: index.docbook:241
-#, no-c-format
-msgid ""
-"Remove this column from the display. You can also remove columns by dragging "
-"the header off the list and letting it drop."
-msgstr ""
-"Retira la columna de la pantalla. Para retirar columnas, también puede "
-"arrastrar y soltar la cabecera fuera de la lista."
-
-#: index.docbook:241
-#, no-c-format
-msgid "Right-click on one of the column headers to get a list of options:"
-msgstr ""
-"Haga clic con el botón derecho en una de las cabeceras de columna para ver "
-"una lista de opciones:"
-
-#: index.docbook:241
-#, no-c-format
-msgid "Sorts the messages bottom to top."
-msgstr "Ordena los mensajes del último al primero."
-
-#: index.docbook:241
-#, no-c-format
-msgid "Sorts the messages top to bottom."
-msgstr "Ordena los mensajes del primero al último."
-
-#: index.docbook:241
-#, no-c-format
-msgid ""
-"The authentication options supported by your server. If you're not sure, "
-"click the <guilabel>Check for supported types</guilabel> button or ask your "
-"system administrator."
-msgstr ""
-"Las opciones de autenticación implementadas en su servidor. Si no está "
-"seguro, haga clic en <guilabel>Comprobar tipos soportados</guilabel> o "
-"pregunte a su administrador de sistemas."
-
-#: index.docbook:241
-#, no-c-format
-msgid ""
-"The host name of your mail server. Ask your system administrator if you're "
-"not sure."
-msgstr ""
-"El nombre del servidor de correo. Si tiene dudas pregunte a su administrador "
-"de sistemas."
-
-#: index.docbook:241
-#, no-c-format
-msgid "The username for the account on that system."
-msgstr "El nombre de usuario para su cuenta en ese sistema."
-
-#: index.docbook:241
-#, no-c-format
-msgid ""
-"Whether you want to use a secure (SSL) connection. If your server supports "
-"it, it's best to enable this security option."
-msgstr ""
-"Si quiere utilizar una conexión segura (SSL). Es mejor activar esta opción "
-"de seguridad, si su servidor la reconoce."
-
-#: index.docbook:241
-#, no-c-format
-msgid "Whether you'd like Evolution to remember your password."
-msgstr "Si quiere que Evolution recuerde su contraseña."
-
-#: index.docbook:243
-#, no-c-format
-msgid ""
-"The Ximian website knowledge base, at <ulink type=\"http\" url=\"http://"
-"support.ximian.com\">support.ximian.com</ulink>, has additional information "
-"about checking to make sure that your Exchange server will accept "
-"connections from Ximian Evolution."
-msgstr ""
-"El con la base de conocimientos de Ximian, en la dirección <ulink type=\"http"
-"\" url=\"http://support.ximian.com\">support.ximian.com</ulink>, contiene"
-"información adicional para asegurar que su servidor "
-"<application>Exchange</application> acepte las conexiones del cliente "
-"Ximian Evolution."
-
-#: index.docbook:244
-#, no-c-format
-msgid "Adding a New Appointment Category"
-msgstr "Añadir una categoría de citas nueva"
-
-#: index.docbook:244
-#, no-c-format
-msgid ""
-"You can add a new category to your category list by clicking on "
-"<guibutton>Edit Master Category List</guibutton> and single-clicking on "
-"<guilabel> Click here to add a category</guilabel>."
-msgstr ""
-"Para agregar una categoría nueva a la lista de categorías, haga clic en "
-"<guibutton>Editar lista maestra de categorías</guibutton> y a continuación "
-"en <guilabel>Pulse aquí para añadir una categoría</guilabel>."
-
-#: index.docbook:253
-#, no-c-format
-msgid ""
-"The purpose of categories is to let you view all appointments which have "
-"similar activities. To do this, in the calendar view, change <guilabel>Any "
-"field contains</guilabel> to <guilabel>Has category</guilabel> and enter "
-"your category at right."
-msgstr ""
-"Las categorías le permiten conocer todas las citas con actividades "
-"parecidas. Para ello, en la vista del calendario, cambie <guilabel>Cualquier "
-"campo contiene</guilabel> a <guilabel>La categoría es</guilabel> e "
-"introduzca a su derecha el nombre de la categoría."
-
-#: index.docbook:254 index.docbook:255
-#, no-c-format
-msgid "Mail Setup Assistant"
-msgstr "Asistente para la configuración del correo"
-
-#: index.docbook:254
-#, no-c-format
-msgid "Standard Configuration Tool for Ximian Connector"
-msgstr "Herramienta estándar de configuración de Ximian Connector"
-
-#: index.docbook:255
-#, no-c-format
-msgid ""
-"Once you know that your server is ready for you to connect, you are ready to "
-"add your Exchange account to Ximian Connector."
-msgstr ""
-"Una vez sepa que su servidor está disponible para conectarse, usted está preparado "
-"para añadir su cuenta Exchange a Ximian Connector."
-
-#: index.docbook:255
-#, no-c-format
-msgid "Searching for Contacts"
-msgstr "Búsqueda de contactos"
-
-#: index.docbook:256
-#, no-c-format
-msgid ""
-"<application>Evolution</application> allows searching through contacts "
-"quickly and easily."
-msgstr ""
-"<application>Evolution</application> es capaz de simplificar la búsqueda de "
-"contactos."
-
-#: index.docbook:260
-#, no-c-format
-msgid ""
-"Clicking on the <guibutton>Categories</guibutton> button opens up the "
-"category list. To associate a category to an appointment, simply click the "
-"check box."
-msgstr ""
-"Haga clic en <guibutton>Categorías</guibutton> para desplegar una lista de "
-"categorías. Para asociar las categorías a la cita sencillamente marque cada "
-"casilla de comprobación."
-
-#: index.docbook:260
-#, no-c-format
-msgid "Enter your query."
-msgstr "Escriba su consulta."
-
-#: index.docbook:260
-#, no-c-format
-msgid "Press return to search."
-msgstr "Presione intro para iniciar la búsqueda."
-
-#: index.docbook:260
-#, no-c-format
-msgid "Select your search focus in the search bar."
-msgstr "Seleccione el elemento de búsqueda en la barra de búsqueda."
-
-#: index.docbook:260
-#, no-c-format
-msgid "To search through contacts:"
-msgstr "Para buscar dentro de los contactos:"
-
-#: index.docbook:262
-#, no-c-format
-msgid "Simple Configuration Tool for Ximian Connector"
-msgstr "Herramienta sencilla de configuración de Ximian Connector"
-
-#: index.docbook:263
-#, no-c-format
-msgid ""
-"Ximian Connector 1.4 comes with a simple account creation tool for some "
-"installations. Other installations will require the standard account tool "
-"described in <xref linkend=\"config-client\"/> below."
-msgstr ""
-"Ximian Connector 1.4 viene de serie con una herramienta sencilla para la creación de "
-"cuentas para ciertas instalaciones. El resto necesitarán de la herramienta estándar "
-"descrita más abajo en <xref linkend=\"config-client\"/>."
-
-#: index.docbook:264
-#, no-c-format
-msgid ""
-"Once you've selected your categories, click <guibutton>OK</guibutton> to "
-"assign these categories to the appointment. The categories you selected are "
-"now listed in the text box to the right of the <guibutton>Categories...</"
-"guibutton> button."
-msgstr ""
-"Una vez que ha elegido las categorías haga clic en <guibutton>Aceptar</"
-"guibutton>. Las categorías elegidas se muestran en un cuadro a la derecha "
-"del botón <guibutton>Categorías</guibutton>"
-
-#: index.docbook:267
-#, no-c-format
-msgid ""
-"To check your email, press the <guibutton>Check Mail</guibutton> button. If "
-"this is your first time checking mail, or you haven't asked "
-"<application>Evolution</application> to store your password, you'll be "
-"prompted for the password. Enter your password and your email will be "
-"downloaded."
-msgstr ""
-"Para comprobar su correo su correo pulse el botón <guibutton>Enviar/Recibir</guibutton>. "
-"Si es la primera vez que lo hace o nunca le pidió a <application>Evolution</application> "
-"que almacenara su contraseña, éste le pedirá que la escriba. Con ella podrá descargar su "
-"correo."
-
-#: index.docbook:269
-#, no-c-format
-msgid ""
-"If you have no accounts configured, and your system administrator has "
-"preinstalled a license key file, the simple assistant will start when you "
-"start Ximian Evolution. It asks only for the name of your Outlook Web Access "
-"server, and your username and password. Ximian Connector will determine the "
-"remaining information on its own."
-msgstr ""
-"Si no tiene configurada ninguna cuenta y su administrador de sistemas ha preinstalado "
-"un archivo de licencia, el asistente sencillo se lanzará en el momento en que lance Ximian "
-"Evolution. Solamente le preguntará por el servidor Outlook Web Access que use, su nombre "
-"de usuario y su contraseña. Ximian Connector determinará por sí mismo el resto de la "
-"información necesaria."
-
-#: index.docbook:269
-#, no-c-format
-msgid ""
-"If you receive your license key in Ximian Evolution, the simple assistant "
-"will start when you click the license file attachment and choose "
-"<guibutton>Open in Ximian Connector</guibutton>."
-msgstr ""
-"Si recibe su clave de licencia en Ximian Evolution, el asistente sencillo se lanzará "
-"cuando pinche sobre el fichero adjunto con la licencia y elija <guibutton>Abrir en Ximian "
-"Connector</guibutton>."
-
-#: index.docbook:269
-#, no-c-format
-msgid "The simple assistant works in the following cases:"
-msgstr "El asistente sencillo funciona en los siguientes casos:"
-
-#: index.docbook:271
-#, no-c-format
-msgid ""
-"The <guilabel>Recurrence</guilabel> tab lets you describe repetition in "
-"appointments ranging from once every day up to once every 100 years. You can "
-"then choose a time and date when the appointment will stop recurring, and, "
-"under <guilabel>Exceptions</guilabel>, pick individual days when the "
-"appointment will <emphasis>not</emphasis> recur. Make your selections from "
-"left to right, and you'll form a sentence: \"Every two weeks on Monday and "
-"Friday until January 3, 2003\" or \"Every month on the first Friday for 12 "
-"occurrences.\""
-msgstr ""
-"La ficha <guilabel>Repetición</guilabel> sirve para describir la "
-"periodicidad de las citas que puede variar desde diaria hasta cada 100 años. "
-"Puede elegir una hora y una fecha a la que quiere que la cita deje de ser "
-"periódica y, en la sección <guilabel>Excepciones</guilabel>, elegir días "
-"individuales en los que la cita <emphasis>no</emphasis> tendrá lugar. Haga "
-"su selección de izquierda a derecha y podrá construir una frase: \"cada dos "
-"semanas en lunes y viernes hasta el 23 de junio de 2004\" o \"de cada mes el "
-"primer viernes en 12 ocasiones\"."
-
-#: index.docbook:274
-#, no-c-format
-msgid "Can't Check Mail?"
-msgstr "¿No puede comprobar su correo?"
-
-#: index.docbook:274
-#, no-c-format
-msgid ""
-"If you get an error message instead of mail, you probably need to check your "
-"network settings. To learn how to do that, have a look at <xref linkend="
-"\"config-prefs-mail\"/>, or ask your system administrator."
-msgstr ""
-"Si recibe un mensaje de error en lugar de correo puede que tenga que revisar su "
-"configuración de acceso a la red. Para saber cómo hacerlo dele un vistazo a "
-"<xref linkend=\"config-prefs-mail\"/> o pregunte a su administrador de sistemas."
-
-#: index.docbook:274
-#, no-c-format
-msgid ""
-"If you have purchased Ximian Connector for Microsoft Exchange, you can "
-"access Microsoft Exchange 2000 servers natively. If you do not have the "
-"Connector, or if you use an older version of Microsoft Exchange, talk to "
-"your system administrator about access to standard protocol services like "
-"POP and IMAP."
-msgstr ""
-"Si ha adquirido Ximian Connector para Microsoft Exchange puede acceder a "
-"servidores Microsoft Exchange 2000 con el protocolo nativo. Si no dispone de "
-"Connector, o si utiliza una versión anterior de Microsoft Exchange, pregunte "
-"a su administrador de sistemas acerca de qué protocolos de acceso estándar "
-"puede usar, como POP o IMAP."
-
-#: index.docbook:274
-#, no-c-format
-msgid "Ximian Evolution Talk to Microsoft Exchange?"
-msgstr "Uso de Ximian Evolution con Microsoft Exchange"
-
-#: index.docbook:280
-#, no-c-format
-msgid "Click <guibutton>Search</guibutton>."
-msgstr "Haga clic en <guibutton>Buscar</guibutton>."
-
-#: index.docbook:280
-#, no-c-format
-msgid ""
-"If you want to add more criteria, click the <guibutton>Add Criterion</"
-"guibutton> button."
-msgstr ""
-"Si desea agregar otros criterios, haga clic en <guibutton>Añadir criterio</"
-"guibutton>."
-
-#: index.docbook:280
-#, no-c-format
-msgid "Name the rule in the <guilabel>Rule Name</guilabel> field."
-msgstr ""
-"Escriba un nombre para la regla en el campo <guilabel>Nombre de la regla</"
-"guilabel>."
-
-#: index.docbook:280
-#, no-c-format
-msgid ""
-"Open <menuchoice> <guimenu>Tools</guimenu> <guimenuitem>Search for contacts</"
-"guimenuitem> </menuchoice>"
-msgstr ""
-"Abra <menuchoice> <guimenu>Herramientas</guimenu> <guimenuitem>Buscar "
-"contactos</guimenuitem> </menuchoice>"
-
-#: index.docbook:280
-#, no-c-format
-msgid "Setup your criteria information in the <guilabel>If</guilabel> section."
-msgstr "Configure el criterio de búsqueda en la sección <guilabel>Si</guilabel>."
-
-#: index.docbook:280
-#, no-c-format
-msgid "To perform a complex search through your contacts:"
-msgstr "Para realizar una búsqueda compleja dentro de los contactos:"
-
-#: index.docbook:283
-#, no-c-format
-msgid "Column Sorting with the Follow Up Feature"
-msgstr "Ordenando la columna con la característica de Marca de seguimiento"
-
-#: index.docbook:283
-#, no-c-format
-msgid ""
-"Once you're done with all those settings, click on the disk icon in the "
-"toolbar to save and close the appointment editor window. If you want, you "
-"can alter an appointment summary in the calendar view by clicking on it and "
-"typing. You can change other settings by right-clicking on the appointment "
-"then choosing <guimenuitem>Open</guimenuitem>."
-msgstr ""
-"Cuando ha terminado con todos los detalles haga clic en el icono del disco "
-"en la barra de tareas para guardar la cita y cerrar la ventana del editor. "
-"Si lo desea, puede modificar el resumen de una cita en la vista del "
-"calendario: haga clic sobre ella y escriba directamente. Para modificar el "
-"resto de detalles, haga clic con el botón derecho sobre la cita y elija "
-"<guimenuitem>Abrir</guimenuitem>."
-
-#: index.docbook:284
-#, no-c-format
-msgid ""
-"One way to make sure you don't forget about a message is with the "
-"<guilabel>Follow Up</guilabel> feature. To use it, select one or more "
-"messages, and then right-click on one and select <guimenuitem>Follow Up</"
-"guimenuitem>. A dialog box will open and allow you to set the type of flag "
-"and the due date."
-msgstr ""
-"Una manera de asegurar de no olvidarse de un mensaje es con la función de "
-"<guilabel>Seguimiento</guilabel>. Para usarla, seleccione uno o más mensajes y pinche "
-"con el botón derecho sobre uno de ellos y elija <guimenuitem>Seguimiento</guimenuitem>. "
-"Se abrirá un diálogo que le servirá para elegir el tipo de marca y la fecha de vencimiento."
-
-# index.docbook:172, index.docbook:216
-#: index.docbook:286
-#, no-c-format
-msgid "Click the <guibutton>OK</guibutton> button."
-msgstr "Pinche en el botón <guibutton>Aceptar</guibutton>."
-
-#: index.docbook:286
-#, no-c-format
-msgid "Download your mail in the other application as you would normally."
-msgstr "Descargar su correo en la otra aplicación como haría con normalidad."
-
-#: index.docbook:286
-#, no-c-format
-msgid ""
-"If you want to use <application>Evolution</application> and another email "
-"client, such as <application>Mutt</application>, at the same time, here's "
-"how:"
-msgstr ""
-"Si quiere usar <application> Evolution</application> y además otro cliente de correo "
-"electrónico, como <application>Mutt</application>, he aquí cómo poder hacerlo:"
-
-#: index.docbook:286
-#, no-c-format
-msgid ""
-"In <application>Evolution</application>, select <menuchoice><guimenu>Tools</"
-"guimenu><guimenuitem> Settings</guimenuitem></menuchoice>, go to the Mail "
-"Accounts configuration tool, and pick the account you'd like to use to share "
-"mail. You may want to create a new account just for this source of mail."
-msgstr ""
-"En <application>Evolution</application> elija <menuchoice> "
-"<guimenu>Herramientas</guimenu> "
-"<guimenuitem> Configuración</guimenuitem></menuchoice>. Lance la herramienta de "
-"configuración de cuentas de correo y elija la cuenta que quiere usar para compartir "
-"correo. Puede que prefiiera crear una cuenta nueva sólo para este propósito."
-
-#: index.docbook:286
-#, no-c-format
-msgid "Sharing Mailboxes with Other Mail Programs"
-msgstr "Compartiendo los buzones de correo con otros programas de correo"
-
-#: index.docbook:286
-#, no-c-format
-msgid ""
-"Under the <guilabel>Receiving Mail</guilabel> tab, select the type of mail "
-"file that your other mail application uses, and then enter the full path to "
-"that location. A typical choice would be mbox files, with the path /home/"
-"username/Mail/."
-msgstr ""
-"Bajo la solapa <guilabel>Recepción de correo</guilabel> elija el tipo de archivo "
-"de correo que usa su otra aplicación y escriba la ruta de directorios completa del archivo. "
-"Una eleción habitual son los ficheros mbox, con la ruta «/home/nombresdelusuario/Mail»."
-
-#: index.docbook:288
-#, no-c-format
-msgid "More Mail Configuration Options"
-msgstr "Opciones de configuración adicionales"
-
-#: index.docbook:289
-#, no-c-format
-msgid ""
-"There are more extensive options for mail preferences, especially if you've "
-"chosen POP, Microsoft Exchange, or IMAP as incoming mail server type. If you "
-"want to set these options after you've created the account, you can select "
-"<menuchoice><guimenu>Tools</guimenu> <guimenuitem>Configure </guimenuitem></"
-"menuchoice>, click the <guibutton>Mail Accounts</guibutton> button. Then, "
-"select the account you want to change and click <guibutton>Edit</guibutton>. "
-"See <xref linkend=\"config-prefs-mail\"/> for details."
-msgstr ""
-"Hay más opciones para las preferencias de correo específicas para tipos de "
-"servidor POP, Microsoft Exchange o IMAP. Si quiere, puede configurarlas más "
-"tarde, después de haber creado su cuenta: abra el menú "
-"<menuchoice><guimenu>Herramientas</guimenu> <guimenuitem>Configuración</"
-"guimenuitem></menuchoice>, y haga clic en <guibutton>Cuentas de correo</"
-"guibutton>. A continuación, elija la cuenta que desea modificar y haga clic "
-"en <guibutton>Editar</guibutton>."
-
-#: index.docbook:291
-#, no-c-format
-msgid ""
-"The <guilabel>Flag</guilabel> itself is the action you want to remind "
-"yourself about. Several are provided for you, such as <guilabel>Call</"
-"guilabel>, <guilabel>Forward</guilabel>, and <guilabel>Reply</guilabel>, but "
-"you can enter your own note or action if you wish. You may set a deadline "
-"date for the flag as well, if you wish."
-msgstr ""
-"Con <guilabel>Marcar</guilabel> especifica qué acción es la que se quiere recordar a sí "
-"mismo. Tiene varias disponibles, como <guilabel>Llamar</guilabel>,"
-"<guilabel> Reenviar</guilabel> y <guilabel> Responder</guilabel>, pero puede "
-"escribir la nota o acción que prefiera. Si lo desea también puede fijar una fecha de "
-"caducidad para la marca."
-
-#: index.docbook:293
-#, no-c-format
-msgid "<term></term>"
-msgstr "<term></term>"
-
-#: index.docbook:293
-#, no-c-format
-msgid ""
-"Click on any blank spot in the calendar and start typing to create a new "
-"appointment entry."
-msgstr ""
-"Para crear una nueva cita simplemente haga clic en cualquier lugar vacío del "
-"calendario y empiece a escribir."
-
-#: index.docbook:293
-#, no-c-format
-msgid ""
-"If the simple account tool does not run automatically, create an account as "
-"described below."
-msgstr ""
-"Si la herramienta sencilla de gestión de cuentas no se ejecuta automáticamente, puede "
-"crear una cuenta como se descibe más abajo."
-
-#: index.docbook:293
-#, no-c-format
-msgid "New Appointments Fast"
-msgstr "Crear una cita nueva de la manera rápida"
-
-#: index.docbook:293
-#, no-c-format
-msgid "Sending an RSVP with the Calendar"
-msgstr "Envío de una confirmación de asistencia (RSVP) con el Calendario"
-
-#: index.docbook:294
-#, no-c-format
-msgid ""
-"<application>Evolution</application> can be used to schedule group meetings "
-"and help you manage responses to meeting requests."
-msgstr ""
-"<application>Evolution</application> sirve para organizar reuniones de "
-"grupos y ayudarle a gestionar las respuestas a las solicitudes de reunión"
-
-#: index.docbook:299
-#, no-c-format
-msgid ""
-"Once you have added a flag, you can mark it as complete or remove it "
-"entirely by right-clicking on the message and selecting <guilabel>Flag "
-"Completed</guilabel> or <guilabel>Clear Flag</guilabel>."
-msgstr ""
-"Una vez que ha añadido una marca, puede remarcar el mensaje como terminado o eliminar "
-"la marca pinchando con el botón derecho sobre el mensaje y eligiendo <guilabel>Marcar "
-"como terminado</guilabel> o <guilabel>Quitar marca</guilabel>."
-
-#: index.docbook:299
-#, no-c-format
-msgid ""
-"When you create a meeting or group appointment, you can specify the "
-"attendees in several categories, such as \"chair\" or \"required.\" When you "
-"save the appointment listing, each attendee will be sent an email with the "
-"appointment information and gives them the option to respond."
-msgstr ""
-"Al crear una reunión o una cita en grupo puede especificar a los asistentes "
-"en varias categorías como \"presidencia\" o \"participante requerido\". "
-"Cuando guarde su lista, cada invitado recibirá un mensaje con los datos de "
-"la cita y tendrán la opción de responder."
-
-#: index.docbook:300
-#, no-c-format
-msgid ""
-"Apply filters to new messages in INBOX on this server: If you'd like your "
-"filters to work on this account as well as on locally downloaded mail, check "
-"this box."
-msgstr ""
-"Aplicar filtros a los mensajes nuevos en el buzón de entrada: active esta "
-"casilla si desea aplicar sus filtros tanto en esta cuenta como en el correo "
-"que se descarga al disco local."
-
-#: index.docbook:300
-#, no-c-format
-msgid ""
-"Apply filters to new messages in Inbox on this server: Check this box to use "
-"filters when you visit the Inbox for this account."
-msgstr ""
-"Aplicar filtros a los mensajes nuevos en el buzón de entrada: active esta "
-"casilla si desea aplicar los filtros cuando visite la Bandeja de entrada de esta cuenta."
-
-#: index.docbook:300
-#, no-c-format
-msgid ""
-"Global Address List/Active Directory: Enter the name of your global catalog "
-"server here. You may also choose to limit the server's responses and select "
-"a maximum number of results for an address search. A maximum number of "
-"results limits the load on your system and on your network."
-msgstr ""
-"<guilabel>Global Address List/Active Directory</guilabel>: ponga aquí el nombre de su servidor global de catálogo. También puede elegir "
-"el límite de respuestas del servidor y elegir el número máximo de resultados para "
-"una búsqueda de direcciones. Usando un máximo puede reducir la carga de trabajo de "
-"su sistema y de su red."
-
-#: index.docbook:300
-#, no-c-format
-msgid "If you chose POP mail:"
-msgstr "Si optó por correo POP:"
-
-#: index.docbook:300
-#, no-c-format
-msgid ""
-"Mailbox Name: If your active directory user name is different from your "
-"Exchange mailbox name, enter the mailbox name here."
-msgstr ""
-"Nombre del buzón: escriba aquí el nombre de su buzón Exchange si es que es diferente de "
-"su nombre de usuario en Active Directory."
-
-#: index.docbook:300
-#, no-c-format
-msgid ""
-"Outlook Web Access (OWA) Path: In most cases, the URL for web access is "
-"\"http://server.company.com/exchange.\" If your system has a path that is "
-"not \"exchange,\" enter the appropriate value here."
-msgstr ""
-"Ruta de acceso de Outlook Web Access (OWA): en muchos casos la URL para acceso "
-"web es <quote>http://server.company.com/exchange</quote>. Si su sistema "
-"usa una ruta que no es <quote>exchange</quote> active esta casilla e "
-"introduzca la ruta correcta."
-
-#: index.docbook:300
-#, no-c-format
-msgid ""
-"Override server-supplied namespace: If you like, enter a specific directory "
-"where your server stores mail for you. Typical values are \"mail\" and "
-"\"Mail.\" For more information about how to use IMAP mail, see <xref linkend="
-"\"usage-mail-subscriptions\"/>."
-msgstr ""
-"Sobreescribir el espacio de nombres proporcionado por el servidor: si lo "
-"desea, especifique el directorio donde su servidor almacena su correo. Los "
-"nombres más comunes son \"mail\" y \"Mail\". Para obtener más información "
-"acerca de cómo utilizar el protocolo de correo IMAP, consulte <xref linkend="
-"\"usage-mail-subscriptions\"/>."
-
-#: index.docbook:300
-#, no-c-format
-msgid ""
-"Public Folder Server: Enter the name of your organization's public folder "
-"server, if any, here."
-msgstr ""
-"Servidor de carpetas públicas: escriba el nombre del servidor de carpetas públicas "
-"de su organización, si es que lo hay."
-
-#: index.docbook:300
-#, no-c-format
-msgid ""
-"Show only subscribed folders: Check this box if you have more folders in "
-"your IMAP view than you want to read."
-msgstr ""
-"Mostrar sólo las carpetas suscritas: active esta opción si la vista IMAP "
-"muestra más carpetas que las que desea leer."
-
-#: index.docbook:301
-#, no-c-format
-msgid "Creating a New Exchange Account"
-msgstr "Creación de una nueva cuenta Exchange"
-
-#: index.docbook:304
-#, no-c-format
-msgid ""
-"If you would like to create a new account for your Exchange server, select "
-"<menuchoice> <guimenu>Tools</guimenu> <guimenuitem>Mail Settings</"
-"guimenuitem> </menuchoice> from any mail view. Then click the "
-"<guibutton>Add</guibutton> button in the accounts list. The account creation "
-"assistant will guide you through the process, which is also described in "
-"<xref linkend=\"usage-mainwindow-starting\"/>. If you're not sure about any "
-"of the information you need, just ask your system administrator."
-msgstr ""
-"Si quisiera crear una nueva cuenta en el servidor Exchange, haga clic, desde cualquier vista "
-"de correo, en <menuchoice> <guimenu>Herramientas</guimenu> "
-"<guimenuitem>Cuentas de correo</guimenuitem></menuchoice>.Pulse el botón "
-"<guibutton>Añadir</guibutton> en la lista de cuentas. El asistente de creación de cuentas "
-"le guiará a lo largo del proceso, que también está descrito en "
-"<xref linkend=\"usage-mainwindow-starting\"/>. Si duda en algo de la información "
-"necesaria pregunte directamente a su administrador del sistema."
-
-#: index.docbook:306
-#, no-c-format
-msgid ""
-"When you read a flagged message, its flag status will be displayed right at "
-"the top, before the message headers. An overdue message might tell you "
-"<guilabel>Overdue: Call by April 07, 2003, 5:00 PM</guilabel>"
-msgstr ""
-"Cuando lea un mensaje marcado, y en la parte superior derecha del mismo, aparcerá una "
-"nota con el estado de la bandera, antes de la cabecera del mensaje. Al ver un mensaje "
-"atrasado podrá decirle algo como <guilabel>Llamar antes del 7 de abril de 2003 a las 5:00 "
-"PM </guilabel>"
-
-#: index.docbook:307
-#, no-c-format
-msgid ""
-"If you don't need to collect attendance information when you're scheduling "
-"an event, and would rather just announce it, select "
-"<menuchoice><guimenu>Actions</guimenu><guimenuitem>Forward as iCalendar</"
-"guimenuitem></menuchoice>. That will open a new email message with the event "
-"notification attached as an announcement. Recipients will be able to add the "
-"event to their calendars with one click, but won't automatically send you "
-"email about whether they'll attend."
-msgstr ""
-"Si no necesita recibir confirmaciones de asistencia al planificar un evento "
-"y sólo necesita anunciarlo seleccione <menuchoice><guimenu>Acciones</"
-"guimenu><guimenuitem>Reenviar como iCalendar</guimenuitem></menuchoice>. Se "
-"abrirá un nuevo mensaje de correo con una notificación del evento adjunta. "
-"Los destinatarios podrán incluir el evento en sus calendarios con un clic, "
-"pero no le enviarán respuesta acerca de si asistirán o no."
-
-#: index.docbook:307
-#, no-c-format
-msgid "Simple Announcements"
-msgstr "Anuncios sencillos"
-
-#: index.docbook:312
-#, no-c-format
-msgid ""
-"Flags can help you organize your work in a number of ways. For example, you "
-"might add a Flag Status column to your message list and sort that way. "
-"Alternately, you could create a vFolder that displays all your flagged "
-"messages, and clear the flags when you're done, so the vFolder contains only "
-"messages with upcoming deadlines."
-msgstr ""
-"Las marcas le pueden ayudar a organizar su correo de varias maneras. Por ejemplo, "
-"puede añadir a la lista de mensajes una columna de <interface>Marca de "
-"seguimiento</interface> y poder ordenarlos por ese campo. También puede crear "
-"una carpeta virtual que muestre todos los mensajes marcados que tiene y quitarles las "
-"marcas cuando haya acabado, de manera que la carpeta sólo contenga mensajes pendientes."
-
-#: index.docbook:315
-#, no-c-format
-msgid ""
-"To show all your contacts, select <guibutton>Show All</guibutton> in the "
-"<guilabel>Search Bar</guilabel> or search with an empty query."
-msgstr "Para mostrar todos los contactos realice una consulta con el campo vacío."
-
-#: index.docbook:318
-#, no-c-format
-msgid ""
-"Be aware that the <systemitem>evolution</systemitem> directory in your home "
-"directory won't exist if you haven't already run Ximian Evolution. If you "
-"have not done so already, start Ximian Evolution and configure an account as "
-"described below. Then, quit the application and place the "
-"<systemitem>connector-key.txt</systemitem> file in your "
-"<systemitem>evolution</systemitem> directory. When you start Evolution "
-"again, the license will be verified and Ximian Connector will work properly."
-msgstr ""
-"Tenga cuidado de que no haya ningún directorio <systemitem>evolution</systemitem> "
-"colgando de su directorio de inicio si previamente no ha ejecutado Ximian Evolution. Si no "
-"lo ha hecho aún, láncelo y configure una cuenta como se explica a continuación. Después "
-"salga de la aplicación y ponga el archivo <systemitem>connector-key.txt</systemitem> en "
-"su directorio <systemitem>evolution</systemitem>. Cuando vuelva a lanzar Evolution, "
-"éste verificará la licencia y Ximian Connector funcionará como es debido."
-
-#: index.docbook:318
-#, no-c-format
-msgid "Installing the License File"
-msgstr "Instalación del archivo de la licencia"
-
-#: index.docbook:318
-#, no-c-format
-msgid ""
-"Your purchase email will contain instructions for installing the license "
-"file: it may be opened with Ximian Evolution and installed automatically "
-"that way, or placed in the <systemitem>evolution</systemitem> directory in "
-"your home directory."
-msgstr ""
-"Su mensaje de compra contendrá instrucciones sobre cómo instalar el archivo con la "
-"licencia: se pude abrir con Ximian Evolution e instalar automáticamente o también situarlo "
-"a mano en el directorio <systemitem>evolution</systemitem> de su directorio de inicio."
-
-#: index.docbook:322
-#, no-c-format
-msgid ""
-"To schedule a meeting: <orderedlist numeration=\"arabic\"> <listitem> <para> "
-"Select <menuchoice> <guimenu>Actions</guimenu> <guimenuitem>Schedule "
-"Meeting</guimenuitem> </menuchoice>. The <guilabel>Scheduling</guilabel> and "
-"<guilabel>Meeting</guilabel> tabs open. </para> </listitem> <listitem> "
-"<para> If you have multiple Evolution email accounts, choose the one you'll "
-"use by selecting an item in the <guilabel>Organizer</guilabel> field. </"
-"para> </listitem> <listitem> <para> Click the space labeled <guilabel>Click "
-"here to add an attendee</guilabel> to enter the names and email addresses of "
-"people you will invite, or click the <guibutton>Invite Others</guibutton> to "
-"select them from your addressbook. </para> </listitem> <listitem> <para> "
-"Save the Appointment. </para> </listitem> </orderedlist> An email is now "
-"sent out to all the recipients, inviting them to your event."
-msgstr ""
-"Para planificar una reunión: <orderedlist numeration=\"arabic\"> <listitem> "
-"<para> Elija <menuchoice> <guimenu>Acciones</guimenu> "
-"<guimenuitem>Planificar una reunión</guimenuitem> </menuchoice>. Abra las "
-"fichas <guilabel>Planificación</guilabel> y <guilabel>Reunión</guilabel>. </"
-"para> </listitem> <listitem> <para> Si tiene varias identidades en Evolution "
-"elija la que quiere usar entre las que se muestran en el campo "
-"<guilabel>Organizador</guilabel>. </para> </listitem> <listitem> <para> Haga "
-"clic en el cuadro de texto <guilabel>Pulse aquí para añadir un asistente</"
-"guilabel> para agregar los nombres y direcciones de correo de las personas a "
-"las que quiere invitar, o haga clic en <guibutton>Invitar a otros</"
-"guibutton> para seleccionarlos a partir de su libreta de direcciones. </"
-"para> </listitem> <listitem> <para> Guarde la cita. </para> </listitem> </"
-"orderedlist> Ahora cada uno de los destinatarios recibirá un mensaje con su "
-"invitación al evento."
-
-#: index.docbook:323
-#, no-c-format
-msgid "Organizing your Addressbook"
-msgstr "Organización de la libreta de direcciones"
-
-#: index.docbook:324
-#, no-c-format
-msgid ""
-"Organizing your addressbook is a lot like organizing your mail. You can have "
-"folders and searches the same way you can with mail, but the addressbook "
-"does not allow Virtual Folders. It does, however, allow each card to fall "
-"under several categories, and allow you to create your own categories. To "
-"learn about categories, read <xref linkend=\"usage-contact-organize-group-"
-"category\"/>."
-msgstr ""
-"La organización de la libreta de direcciones se asemeja mucho a la de sus "
-"mensajes. Puede utilizar carpetas y búsquedas como hace con los mensajes, "
-"pero la libreta de direcciones no admite carpetas virtuales. Sin embargo, sí "
-"permite clasificar cada tarjeta mediante numerosos criterios, así como crear "
-"criterios personales. Acerca de las categorías, consulte <xref linkend="
-"\"usage-contact-organize-group-category\"/>."
-
-#: index.docbook:326
-#, no-c-format
-msgid "Getting Organized with Folders"
-msgstr "Organización básica de carpetas"
-
-#: index.docbook:327
-#, no-c-format
-msgid ""
-"<application>Ximian Evolution</application> keeps mail, as well as address "
-"cards and calendars, in folders. You start out with a few mail folders, such "
-"as <guilabel>Inbox</guilabel>, <guilabel>Outbox</guilabel>, and "
-"<guilabel>Drafts</guilabel>, but you can create as many as you like. Create "
-"new folders by selecting <guisubmenu>New</guisubmenu> and then "
-"<guimenuitem>Folder</guimenuitem> from the <guimenu>File</guimenu> menu. "
-"<application>Ximian Evolution</application> will as you for the name and the "
-"type of the folder, and will provide you with a folder tree so you can pick "
-"where it goes."
-msgstr ""
-"<application>Ximian Evolution</application> utiliza carpetas para conservar "
-"los mensajes de correo, así como las tarjetas de direcciones y los "
-"calendarios. El programa le ofrece al principio unas pocas carpetas, como "
-"<guilabel>Entrada</guilabel>, <guilabel>Salida</guilabel> y "
-"<guilabel>Borradores</guilabel>, pero puede crear tantas otras como desee. "
-"Para crear carpetas nuevas, en el menú <guisubmenu>Archivo</guisubmenu>, "
-"seleccione <guimenuitem>Nuevo</guimenuitem> y a continuación "
-"<guimenu>Carpeta</guimenu>. <application>Ximian Evolution</application> le "
-"solicita el nombre y el tipo de carpeta, y le presenta un árbol de los "
-"directorios donde puede elegir la ubicación de la nueva carpeta."
-
-#: index.docbook:340
-#, no-c-format
-msgid ""
-"When you click <guibutton>OK</guibutton>, your new folder will appear in the "
-"<interface>folder view</interface>. You can then put messages in it by "
-"dragging and dropping them, or by using the <guibutton>Move</guibutton> "
-"button in the toolbar. If you want to move several messages at once, click "
-"on the ones you want to move while holding down the <keycap>Ctrl</keycap> "
-"key, or use <keycap>Shift</keycap> to select a range of messages. If you "
-"create a filter with the <interface>filter assistant</interface>, you can "
-"have mail filed automatically."
-msgstr ""
-"Cuando hace clic en <guibutton>Aceptar</guibutton>, su nueva carpeta aparece "
-"en la <interface>vista de carpetas</interface>. A continuación, puede "
-"arrastrar y colocar mensajes o hacer clic en el icono <guibutton>Mover</"
-"guibutton> de la barra de herramientas. Si desea mover varios mensajes a la "
-"vez, para seleccionarlos haga clic en cada uno con la tecla <keycap>Ctrl</"
-"keycap> presionada, o utilice la tecla <keycap>Mayús</keycap> para "
-"selecciona un grupo de mensajes contiguos. Si crea un filtro con el "
-"<interface>Asistente de filtros</interface>, sus mensajes quedan ordenados "
-"automáticamente."
-
-#: index.docbook:342 index.docbook:529
-#, no-c-format
-msgid "Account Management"
-msgstr "Gestión de la cuenta"
-
-#: index.docbook:342
-#, no-c-format
-msgid ""
-"Apply filters to new messages in Inbox on this server: Check this box to "
-"filter messages in this account."
-msgstr ""
-"Aplicar los filtros a los mensajes nuevos en.la bandeja de entrada para este servidor. "
-"Active esta casilla para filtrar los mensajes de esta cuenta."
-
-#: index.docbook:342
-#, no-c-format
-msgid ""
-"Checking for New Mail: If you would like to check for new mail "
-"automatically, click the checkbox and enter an interval in minutes."
-msgstr ""
-"Comprobación de correo nuevo: para comprobar automáticamente la presencia de "
-"correo nuevo, active la casilla y especifique un intervalo en minutos."
-
-#: index.docbook:342
-#, no-c-format
-msgid ""
-"Enter a name that you will use to remember this account. \"Exchange Account"
-"\" is a good suggestion. Note that you cannot have two accounts with the "
-"same name. If you'd like to make this your default account for sending "
-"email, check the <guilabel>Make this my default account</guilabel> box."
-msgstr ""
-"Escriba un nombre que le servirá para recordar esta cuenta: «Cuenta "
-"Exchange» es una buena sugerencia. Observe que no puede tener dos cuentas "
-"con el mismo nombre. Si desea hacer de ella su cuenta predeterminada para el "
-"envío de correo, active la casilla <guilabel>determinada</guilabel>."
-
-#: index.docbook:342
-#, no-c-format
-msgid ""
-"Enter the name of your Exchange email server, and the user name you would "
-"use to log in to a Windows workstation in your organization."
-msgstr ""
-"Escriba el nombre del servidor Exchange y el nombre de usuario de inicio de "
-"sesión, en una estación de trabajo dentro de su organización."
-
-#: index.docbook:342
-#, no-c-format
-msgid ""
-"Enter your name and email address. If you wish, you may add your "
-"organization and the location of your signature file. Only your name and "
-"email address are required."
-msgstr ""
-"Escriba su nombre y dirección de correo electrónico. Si lo desea, puede "
-"agregar su organización así como la ruta de su archivo de firma. Sólo son "
-"obligatorios su nombre y dirección de correo electrónico."
-
-#: index.docbook:342
-#, no-c-format
-msgid "Exchange Server: There are two options here:"
-msgstr "Servidor Exchange: aquí hay dos opciones posibles:"
-
-#: index.docbook:342
-#, no-c-format
-msgid ""
-"Exchange mailbox name: Enter your exchange mailbox name. The suggested value "
-"is probably correct."
-msgstr ""
-"Nombre del buzón Exchange: escriba el nombre de su buzón exchange; probablemente "
-"el valor sugerido sea correcto."
-
-#: index.docbook:342
-#, no-c-format
-msgid "First, select <guilabel>Microsoft Exchange</guilabel> as your server type."
-msgstr ""
-"En primer lugar, seleccione <guilabel>Microsoft Exchange</guilabel> como "
-"tipo de servidor."
-
-#: index.docbook:342
-#, no-c-format
-msgid ""
-"Global Address List/Active Directory: Enter the name of your global catalog "
-"server (directory server). This will allow you to use the Global Address "
-"List (GAL). Normally, Evolution will fetch a maximum of 500 responses to any "
-"query, but you may increase or decrease this number if you wish. A lower "
-"number decreases load on the server, and many servers will refuse to return "
-"more than 1000 results, no matter how many you ask for."
-msgstr ""
-"Global Address List/Active Directory: escriba el nombre de su servidor global de "
-"catálogos (el servidor de directorio). Será el que le permita usar la lista global de direcciones "
-"(en inglés GAL). En general Evolution se traerá un máximo de 500 respuestas de cualquier "
-"consulta, pero si lo desea puede aumentar o disminuir la cifra. Cuanto más bajo sea el número "
-"menor será la carga de trabajo del servidor y por otro lado muchos servidores sencillamente "
-"no entregan más de 1000 resultados sea cual sea la cantidad que pidió en su consulta."
-
-#: index.docbook:342
-#, no-c-format
-msgid ""
-"If you wish, select the box labeled <guilabel>Use secure connection (SSL)</"
-"guilabel>, to take advantage of a more secure connection method. This may "
-"allow you to connect to the server from outside your firewall."
-msgstr ""
-"Si lo desea, active la casilla <guilabel>Usar conexiones seguras (SSL)</"
-"guilabel>, para reforzar la seguridad de su conexión. Esta opción le permite "
-"conectarse al servidor sin utilizar un cortafuegos."
-
-#: index.docbook:342
-#, no-c-format
-msgid ""
-"If you would like Evolution to remember your password, check the box labeled "
-"<guilabel>Remember this password</guilabel>."
-msgstr ""
-"Si desea que <application>Evolution</application> recuerde su contraseña, "
-"active la casilla <guilabel>Recuerda esta contraseña</guilabel>."
-
-#: index.docbook:342
-#, no-c-format
-msgid "In this step, you'll enter information about the way you check mail:"
-msgstr "En esta etapa, especifique cómo desea comprobar su correo:"
-
-#: index.docbook:342
-#, no-c-format
-msgid ""
-"Outlook Web Access (OWA) Path: In most cases, the URL for Outlook Web Access "
-"is \"http://server.company.com/exchange.\" If your system has a URL that "
-"does not end in \"/exchange,\" enter the custom path here."
-msgstr ""
-"Ruta de acceso a Outlook Web Access (OWA): en muchos casos la URL de acceso a "
-"Outlook Web Access (OWA) es <quote>http://server.company.com/exchange</quote>. "
-"Si su sistema tiene una ruta que no es <quote>exchange</quote> active esta casilla e "
-"introduzca la ruta correcta."
-
-#: index.docbook:342
-#, no-c-format
-msgid "Public Folder Server: Enter the name of your public folder server here."
-msgstr "Servidor de carpetas públicas: escriba el nombre de su servidor de carpetas públicas."
-
-#: index.docbook:342
-#, no-c-format
-msgid "Receiving Mail, Step Two"
-msgstr "Recepción de correo - Etapa dos"
-
-#: index.docbook:342
-#, no-c-format
-msgid ""
-"Select <guilabel>Microsoft Exchange</guilabel> as your email sending method. "
-"There is nothing else to do in this step."
-msgstr ""
-"Seleccione <guilabel>Microsoft Exchange</guilabel> como método de envío del "
-"correo. No es necesario hacer nada más en esta etapa."
-
-#: index.docbook:342
-#, no-c-format
-msgid ""
-"Select the kind of authentication your network uses. You can click the "
-"<guibutton>Check for Supported Types</guibutton> button to see which kinds "
-"will work."
-msgstr ""
-"Elija el tipo de autenticación que se usa en su red: haga clic en <guilabel>Comprobar tipos "
-"soportados</guilabel> para ver cuál funciona."
-
-#: index.docbook:342
-#, no-c-format
-msgid "The Global Catalog Server"
-msgstr "El servidor Global de Catálogo"
-
-#: index.docbook:342
-#, no-c-format
-msgid ""
-"The Global Catalog server provides you with access access to the Global "
-"Address List, free/busy information, and folder delegation features. These "
-"may not work properly if you do not have a Global Catalog server."
-msgstr ""
-"El servidor global de catálogo provee acceso a la lista global de direcciones, a la información "
-"de disponibilidad y a las funciones de delegación de carpetas. Todo esto no funcionará "
-"bien del todo si no tiene un servidor global de catálogo."
-
-#: index.docbook:342
-#, no-c-format
-msgid "There are a few additional options in this step:"
-msgstr "Esta etapa incluye algunas opciones adicionales:"
-
-#: index.docbook:346
-#, no-c-format
-msgid "Groups of contacts"
-msgstr "Grupos de contactos"
-
-#: index.docbook:347
-#, no-c-format
-msgid ""
-"<application>Evolution</application> offers two ways for you to organize "
-"your cards. The first way is to use folders; this works the same way mail "
-"folders do. For more flexibility, you can also mark contacts as elements of "
-"different categories. To better integrate with email tools, you can also "
-"create lists of contacts that you can send mail to as a single person."
-msgstr ""
-"<application>Evolution</application> dispone de dos métodos para organizar "
-"sus tarjetas. El primer método son las carpetas; su funcionamiento es "
-"similar al de las carpetas de mensajes. Para mayor flexibilidad, puede "
-"utilizar marcas para asociar los contactos con diferentes categorías. "
-"Además, para mejorar la integración con las herramientas de correo, es "
-"posible crear listas de contactos a cuya dirección puede escribir mensajes, "
-"como si se tratara de una persona individual."
-
-#: index.docbook:347
-#, no-c-format
-msgid "Addressbook"
-msgstr "Contactos"
-
-#: index.docbook:347
-#, no-c-format
-msgid "Working with Attachments and HTML Mail"
-msgstr "Trabajar con adjuntos y correo HTML"
-
-#: index.docbook:348
-#, no-c-format
-msgid ""
-"Click once on the person's address card and you can edit the person's "
-"properties all in the same window."
-msgstr ""
-"Haga clic en la tarjeta de visita para modificar cualquiera de sus "
-"propiedades visibles."
-
-#: index.docbook:348
-#, no-c-format
-msgid "Creating a New Contact:"
-msgstr "Creación de un contacto nuevo:"
-
-#: index.docbook:348
-#, no-c-format
-msgid "Deleting a Contact:"
-msgstr "Borrar un contacto:"
-
-#: index.docbook:348
-#, no-c-format
-msgid "Double-click on the contact's card and alter their details."
-msgstr "Haga doble clic en la tarjeta de visita para modificar todas las propiedades."
-
-#: index.docbook:348
-#, no-c-format
-msgid "Edit a Contact:"
-msgstr "Modificar un contacto:"
-
-#: index.docbook:348
-#, no-c-format
-msgid "Email a Contact:"
-msgstr "Escribir a un contacto:"
-
-#: index.docbook:348
-#, no-c-format
-msgid "Here are shortcuts for the most frequent addressbook actions:"
-msgstr ""
-"Los atajos para las acciones más frecuentes de los contactos son los "
-"siguientes:"
-
-#: index.docbook:348
-#, no-c-format
-msgid ""
-"If someone sends you an <glossterm linkend=\"attachment\">attachment</"
-"glossterm>, a file attached to an email, <application>Evolution</"
-"application> will display the file at the bottom of the message to which "
-"it's attached. Text, including HTML formatting and embedded images, will "
-"appear as part of the message, rather than at the end of the message as an "
-"attachment."
-msgstr ""
-"Si recibe un mensaje de alguien con un fichero"
-"<glossterm linkend=\"attachment\">adjunto</glossterm>. "
-"<application>Evolution</application> lo mostrará al pie del mensaje al cual está anexado. "
-"Lo que sea texto, incluido formateo HTML e imágenes empotradas, aparecerá como parte "
-"del mensaje, y no en en el pie del mismo como si fueran adjuntos."
-
-#: index.docbook:348
-#, no-c-format
-msgid ""
-"Right click on a contact and click <guilabel>Delete</guilabel> or select a "
-"contact and press the <guibutton>Delete</guibutton> on the toolbar."
-msgstr ""
-"Pinche con el botón derecho sobre un contacto y elija <guilabel>Borrar</guilabel> o "
-"seleccione el contacto y pulse el botón de la <guibutton>papelera</guibutton>.en la "
-"barra de herramientas."
-
-#: index.docbook:348
-#, no-c-format
-msgid ""
-"Right click on a contact and select <guilabel>Send message to contact</"
-"guilabel>."
-msgstr ""
-"Haga clic con el botón derecho y elija <guilabel>Enviar un mensaje al "
-"contacto</guilabel>."
-
-#: index.docbook:348
-#, no-c-format
-msgid "You can edit a contact two ways:"
-msgstr "Es posible modificar un contacto de dos maneras:"
-
-#: index.docbook:354
-#, no-c-format
-msgid "Subfolders in IMAP"
-msgstr "Subcarpetas en IMAP"
-
-#: index.docbook:355
-#, no-c-format
-msgid ""
-"The INBOX folder on most IMAP servers cannot contain both subfolders and "
-"messages. When you create additional folders on your IMAP mail server, "
-"branch them from the root of the IMAP account's folder, tree, not from "
-"INBOX. If you create subfolders in your INBOX folder, you will lose the "
-"ability to read messages that exist in your INBOX until you move the folders "
-"out of the way."
-msgstr ""
-"El buzón de entrada de la mayoría de los servidores IMAP no puede contener a "
-"la vez subcarpetas y mensajes. Cuando crea carpetas adicionales en su "
-"servidor de correo IMAP, debe hacerlas partir de la raíz del árbol de "
-"carpetas de cuentas IMAP, y no desde el buzón de entrada. Si crea "
-"subcarpetas en el buzón de entrada, dejará de poder leer mensajes que "
-"existen en esta carpeta, hasta que las mueva hacia otro lugar."
-
-#: index.docbook:358
-#, no-c-format
-msgid "Grouping with Folders"
-msgstr "Agrupación en carpetas"
-
-#: index.docbook:359
-#, no-c-format
-msgid "Saving or Opening Attachments"
-msgstr "Abriendo o guardando adjuntos"
-
-#: index.docbook:359
-#, no-c-format
-msgid ""
-"The simplest way to group address cards is to use folders. By default, cards "
-"start in the <guilabel>Contacts</guilabel> folder. If you've read <xref "
-"linkend=\"usage-mainwindow\"/> then you already know that you can create a "
-"new folder by selecting <menuchoice> <guimenu>File</guimenu> "
-"<guisubmenu>New</guisubmenu> <guimenuitem>Folder</guimenuitem> </menuchoice> "
-"and that you can put new folders anywhere you like. Just like with mail, "
-"cards must be in a card folder, and no card can be in two places at once. If "
-"you want more flexibility, try <xref linkend=\"usage-contact-organize-group-"
-"category\"/>."
-msgstr ""
-"Las carpetas son la forma más sencilla de agrupar tarjetas de direcciones. "
-"De forma predeterminada, las tarjetas se encuentran originalmente en la "
-"carpeta <guilabel>Contactos</guilabel>. Si se leyó <xref linkend=\"usage-"
-"mainwindow\"/>, ya sabe cómo crear una carpeta nueva, con <menuchoice> "
-"<guimenu>Archivo</guimenu> <guisubmenu>Nuevo</guisubmenu> "
-"<guimenuitem>Carpeta</guimenuitem> </menuchoice>, y que puede ubicarlas "
-"donde prefiera. Como ocurre con los mensajes, las tarjetas pueden colocarse "
-"en una carpeta asociada, y la misma tarjeta no puede aparecer en dos lugares "
-"a la vez. Si desea mayor flexibilidad, consulte <xref linkend=\"usage-"
-"contact-organize-group-category\"/>."
-
-#: index.docbook:360
-#, no-c-format
-msgid ""
-"If you get an attachment with an email message, <application>Ximian "
-"Evolution</application> can help you save it or open it with the appropriate "
-"applications."
-msgstr ""
-"Si recibe un adjunto dentro de un mensaje de correo electrónica, <application>Ximian "
-"Evolution</application> le ayuda a guardarlo o a abrirlo con las aplicaciones adecuadas."
-
-#: index.docbook:361
-#, no-c-format
-msgid "Replying to a Meeting Request"
-msgstr "Respuesta a una solicitud de reunión"
-
-#: index.docbook:362
-#, no-c-format
-msgid ""
-"Meeting requests are sent as iCal attachments. To view or respond to one, "
-"click on the attachment icon and view it inline in the mail window. All the "
-"details are shown about the event including time and dates. Then you can "
-"choose how to reply to the invitation. Your choices are: <itemizedlist> "
-"<listitem> <para> <guilabel>Accept</guilabel> </para> </listitem> <listitem> "
-"<para> <guilabel>Tentatively Accept</guilabel> </para> </listitem> "
-"<listitem> <para> <guilabel>Decline</guilabel> </para> </listitem> </"
-"itemizedlist> Click <guibutton>OK</guibutton> and an email will be sent to "
-"the organizer with your answer. The event will also be added to your "
-"calendar if you accept."
-msgstr ""
-"Las solicitudes de reunión se envían como adjuntos iCal. Para verlos dentro "
-"de la ventana de correo y responder, haga clic en el icono del anexo. Se "
-"mostrarán todos los detalles del evento incluyendo la hora y las fechas. A "
-"continuación, elija su respuesta a la invitación: <itemizedlist> <listitem> "
-"<para> <guilabel>Aceptar</guilabel> </para> </listitem> <listitem> <para> "
-"<guilabel>Aceptar provisionalmente</guilabel> </para> </listitem> <listitem> "
-"<para> <guilabel>Declinar</guilabel> </para> </listitem> </itemizedlist> "
-"Haga clic en <guibutton>Aceptar</guibutton> para enviar un mensaje al "
-"organizador con su respuesta. Si acepta, el evento se incluirá en su "
-"calendario."
-
-#: index.docbook:365
-#, no-c-format
-msgid "Choose a location and name for the file."
-msgstr "Elija dónde quiere guardar el archivo y cómo nombrarlo."
-
-#: index.docbook:365
-#, no-c-format
-msgid ""
-"Click the downward pointing arrow on the attachment icon and select "
-"<guimenuitem>Save to Disk</guimenuitem>."
-msgstr ""
-"Pinche en la flecha apuntando hacia abajo en el icono del adjunto y elija "
-"<guimenuitem>Guardar adjunto</guimenuitem>."
-
-#: index.docbook:365
-#, no-c-format
-msgid "To save an attachment to disk:"
-msgstr "Guardar un adjunto en el disco:"
-
-#: index.docbook:369
-#, no-c-format
-msgid "Searching for Messages"
-msgstr "Búsqueda de mensajes"
-
-#: index.docbook:370
-#, no-c-format
-msgid ""
-"Most mail clients can search through your messages for you, but "
-"<application>Ximian Evolution</application> does it faster. You can search "
-"through just the message subjects, just the message body, or both body and "
-"subject."
-msgstr ""
-"La mayoría de los clientes de correo son capaces de realizar búsquedas en "
-"los mensajes, pero <application>Ximian Evolution</application> lo hace aún "
-"más rápido. Puede realizar búsquedas sólo en el asunto, sólo en el cuerpo "
-"del mensaje, o hacerlo en el asunto y el cuerpo a la vez."
-
-#: index.docbook:376
-#, no-c-format
-msgid ""
-"To put a card into a folder, just drag it there from the folder view. "
-"Remember that contact cards can only go in contact folders, just like mail "
-"can only go in mail folders, and calendars in calendar folders."
-msgstr ""
-"Para colocar una tarjeta dentro de una carpeta, arrástrela desde la vista de "
-"carpetas. Recuerde que las tarjetas de contactos sólo pueden moverse a "
-"carpetas específicas de tarjetas, del mismo modo que las carpetas de "
-"mensajes sólo admiten mensajes, y las carpetas de calendarios, sólo "
-"calendarios."
-
-#: index.docbook:376
-#, no-c-format
-msgid ""
-"To start searching, enter a word or phrase in the text area right below the "
-"toolbar, and choose a search type: <variablelist> <varlistentry> "
-"<term><guilabel>Body or subject contains</guilabel>:</term> <listitem> "
-"<para> This will search message subjects and the messages themselves for the "
-"word or phrase you've entered in the search field. </para> </listitem> </"
-"varlistentry> <varlistentry> <term> <guilabel>Body contains</guilabel>:</"
-"term> <listitem> <para> This will search only in message text, not the "
-"subject lines. </para> </listitem> </varlistentry> <varlistentry> "
-"<term><guilabel>Subject contains:</guilabel></term> <listitem> <para> This "
-"will show you messages where the search text is in the subject line. It will "
-"not search in the message body. </para> </listitem> </varlistentry> "
-"<varlistentry> <term><guilabel>Body does not contain:</guilabel></term> "
-"<listitem> <para> This finds every email message that does not have the "
-"search text in the message body. It will still show messages that have the "
-"search text in the subject line, if it is not also in the body. </para> </"
-"listitem> </varlistentry> <varlistentry> <term><guilabel>Subject does not "
-"contain:</guilabel></term> <listitem> <para> This finds every mail whose "
-"subject does not contain the search text. </para> </listitem> </"
-"varlistentry> </variablelist> When you've entered your search phrase, press "
-"<keycap>Enter</keycap>. <application>Ximian Evolution</application> will "
-"show your search results in the message list."
-msgstr ""
-"Para iniciar la búsqueda, escriba una palabra o una frase en el área de "
-"texto bajo la barra de herramientas, y seleccione un opción de búsqueda: "
-"<variablelist> <varlistentry> <term><guilabel>El cuerpo o el asunto "
-"contiene</guilabel>:</term> <listitem> <para> Esta opción busca en el asunto "
-"y en el cuerpo de los mensajes la palabra o frase especificada en el campo "
-"de búsqueda. </para> </listitem> </varlistentry> <varlistentry> <term> "
-"<guilabel>El cuerpo contiene</guilabel>:</term> <listitem> <para> La "
-"búsqueda se realiza únicamente en el texto del mensaje, no en el asunto. </"
-"para> </listitem> </varlistentry> <varlistentry> <term><guilabel>El asunto "
-"contiene:</guilabel></term> <listitem> <para> Esta opción mostrará los "
-"mensajes cuya línea asunto incluye el texto buscado. La búsqueda no se "
-"realiza en el cuerpo del mensaje. </para> </listitem> </varlistentry> "
-"<varlistentry> <term><guilabel>El cuerpo no contiene:</guilabel></term> "
-"<listitem> <para> Encuentra todos los mensajes que no incluyen el texto "
-"buscado en el cuerpo del mensaje. También mostrará los mensajes en los que "
-"el texto buscado aparece en la línea del asunto, cuando no en el cuerpo del "
-"mensaje. </para> </listitem> </varlistentry> <varlistentry> "
-"<term><guilabel>El asunto no contiene:</guilabel></term> <listitem> <para> "
-"Encuentra todos los mensajes cuyo asunto no contiene el texto buscado. </"
-"para> </listitem> </varlistentry> </variablelist> Tras escribir la frase "
-"buscada, presione <keycap>Intro</keycap>. <application>Ximian Evolution</"
-"application> le muestra los resultados de la búsqueda en la lista de "
-"mensajes."
-
-#: index.docbook:385
-#, no-c-format
-msgid "Grouping with Categories"
-msgstr "Agrupación por categorías"
-
-#: index.docbook:386
-#, no-c-format
-msgid ""
-"The other way to group cards is to mark them as belonging to different "
-"categories. That means that you can mark a card as being in several "
-"categories or no category at all. For example, I put my friend Matthew's "
-"card in the \"Business\" category, because he works with me, the \"Friends\" "
-"category, because he's also my friend, and the \"Frequent\" category, "
-"because I call him all the time and can never remember his phone number."
-msgstr ""
-"El otro método para agrupar tarjetas consiste en marcarlas como "
-"pertenecientes a diferentes categorías. Por tanto, puede asociar una tarjeta "
-"con numerosas categorías, o no asociarla. Por ejemplo, la tarjeta de mi "
-"amigo Mateo tiene asociadas las categorías «Trabajo», porque trabaja "
-"conmigo; «Amigos» porque también es un amigo mío; y «Frecuentes», porque "
-"siempre que le llamo, nunca recuerdo su número de teléfono."
-
-#: index.docbook:387
-#, no-c-format
-msgid "Click the arrow next the attachment icon."
-msgstr "Pinche en la flecha junto el icono del adjunto."
-
-#: index.docbook:387
-#, no-c-format
-msgid "Open the mail message with the attachment you want to read."
-msgstr "Abrir el mensaje de correo que contiene el adjunto que quiere leer."
-
-#: index.docbook:387
-#, no-c-format
-msgid "Select the program you'd like to use. It will start up and open the document."
-msgstr "Elija el programa que quiere usar. Se abrirá y abrirá el documento."
-
-#: index.docbook:387
-#, no-c-format
-msgid "To Open an Attachment in a Program:"
-msgstr "Abrir un anexo en una aplicación:"
-
-#: index.docbook:390
-#, no-c-format
-msgid ""
-"Note, however, that if you add a meeting to your calendar, there are some "
-"limitations: only the organizer of a meeting can add participants in a "
-"meeting. Your only options, as a participant, are to accept the meeting, or "
-"decline it."
-msgstr ""
-"Existen sin embargo algunas limitaciones a la hora de agregar una reunión al "
-"calendario: el organizador de una reunión es el único que puede agregar "
-"participantes. Como asistente, sólo tendrá la opción de aceptar o declinar "
-"la invitación."
-
-#: index.docbook:396
-#, no-c-format
-msgid ""
-"Once you have added the meeting to your calendar, you can make changes to "
-"your copy &mdash;change the description, mark yourself the organizer, invite "
-"more people, and so forth&mdash; but be aware that if the original organizer "
-"sends out another update, your changes may be overwritten."
-msgstr ""
-"Tras incluir una reunión a su calendario, puede hacer cambios en su copia &mdash;cambiar "
-"la descripción, marcarse usted mismo como el organizador, invitar a "
-"más personas, etc&mdash; pero tenga presente que si el autor original envía otra "
-"actualización sus cambios pueden ser sobreescritos."
-
-#: index.docbook:397
-#, no-c-format
-msgid ""
-"To mark a card as belonging to a category, click the <guibutton>Categories</"
-"guibutton> button at the lower right. From the dialog box that appears, you "
-"can check as many or as few categories as you like."
-msgstr ""
-"Para asociar una tarjeta con una categoría, haga clic en "
-"<guibutton>Categorías</guibutton> en la parte inferior derecha. En el cuadro "
-"de diálogo, active las casillas de todas las categorías que prefiera."
-
-#: index.docbook:403
-#, no-c-format
-msgid ""
-"A meeting can have only one organizer. You can designate yourself the "
-"organizer of the meeting, but unless you coordinate that action with the "
-"organizer you are replacing, you could create confusion in the scheduling "
-"process. If you want to invite additional people to a meeting without "
-"changing the organizer, it's best to forward the first organizer's message "
-"to the additional participants."
-msgstr ""
-"Una reunión sólo puede tener un organizador. Puede sustituirse al "
-"organizador, pero a menos de estar de acuerdo con él, corre el riesgo de "
-"provocar confusiones en el proceso de planificación. Si desea invitar a "
-"personas adicionales sin cambiar al organizador, lo mejor es reenviar el "
-"mensaje original del organizador a los nuevos invitados."
-
-#: index.docbook:403
-#, no-c-format
-msgid "There Can Be Only One"
-msgstr "No más de un organizador"
-
-#: index.docbook:413
-#, no-c-format
-msgid "Inline Images in HTML Mail"
-msgstr "Imágenes dentro de mensajes HTML"
-
-#: index.docbook:414
-#, no-c-format
-msgid ""
-"When someone sends you HTML mail that includes an image in the body of the "
-"message (for example, the welcome message in your Inbox when you first start "
-"<application>Ximian Evolution</application>) <application>Evolution</"
-"application> will display the image inside the message. You can create "
-"messages like this by using the <menuchoice><guimenu>Insert</"
-"guimenu><guimenuitem>Image</guimenuitem></menuchoice> tool in the message "
-"composer."
-msgstr ""
-"Cuando alguien le envía un mensaje HTML que una imagen en su interior (por ejemplo el "
-"mensaje de bienvenida que encontrará en la Bandeja de entrada la primera vez que "
-"ejecute <application>Ximian Evolution</application>) <application>Evolution</application> "
-"mostrará la imagen dentro del propio mensaje. Usted también puede crear mensajes como "
-"ese seleccionando en el menú del editor de mensajes <menuchoice> "
-"<guimenu>Insertar</guimenu> <guimenuitem>Imagen</guimenuitem></menuchoice>"
-
-#: index.docbook:418
-#, no-c-format
-msgid "Creating a List of Contacts"
-msgstr "Creación de una lista de contactos"
-
-#: index.docbook:418
-#, no-c-format
-msgid "Getting Responses to Meeting Requests"
-msgstr "Recepción de respuestas a solicitudes de reunión"
-
-#: index.docbook:419
-#, no-c-format
-msgid ""
-"Choose whether you would like to hide the email addresses when you send a "
-"message to the list. Unless it is a very small list, it is recommended that "
-"you leave the addresses hidden. This is the same thing as using the \"Bcc:\" "
-"feature discussed in <xref linkend=\"usage-mail-getnsend-send-to-types\"/>."
-msgstr ""
-"Especifique si prefiere ocultar las direcciones cuando envía un mensaje a la "
-"lista. A menos que se trate de una lista muy pequeña, se recomienda dejar "
-"ocultas estas direcciones. Este funcionamiento es similar al de la "
-"característica «Bcc:», comentada en <xref linkend=\"usage-mail-getnsend-send-"
-"to-types\"/>."
-
-#: index.docbook:419
-#, no-c-format
-msgid "Enter a name for the list."
-msgstr "Escriba un nombre en la lista."
-
-#: index.docbook:419
-#, no-c-format
-msgid ""
-"Enter names or email addresses of contacts, or just drag contacts from the "
-"main window into the list."
-msgstr ""
-"Escriba los nombres o direcciones de correo electrónico de los contactos, o "
-"arrástrelos desde la ventana principal, hasta la lista."
-
-#: index.docbook:419
-#, no-c-format
-msgid ""
-"For IMAP mail servers, your sysadmin may provide you with a specific "
-"namespace, the directory on where your server stores mail for you. If you "
-"check your IMAP mail and your folder list includes files that don't look "
-"like mail folders, you probably need to change your mail namespace. Typical "
-"values are \"mail\" and \"Mail.\" If you prefer, you can choose to subscribe "
-"to individual mail folders one at a time. For more information about how to "
-"use IMAP mail, see <xref linkend=\"usage-mail-subscriptions\"/>."
-msgstr ""
-"En un servidor de correo IMAP el administrador puede proporcionarle un "
-"espacio de nombres específico, el directorio en el que el servidor "
-"almacenará su correo. Si al comprobar su correo IMAP ve que su lista de "
-"carpetas incluye archivos que no se parecen a carpetas de correo "
-"probablemente necesita cambiar su espacio de nombres de correo. Los valores "
-"más normales son <quote>mail</quote> y <quote>Mail</quote>. Si lo prefiere "
-"puede optar por suscribir las carpetas de correo una a una."
-
-#: index.docbook:419
-#, no-c-format
-msgid ""
-"Once you get a reply to your meeting invitation, you'll need to view it "
-"inline in the email. Click the attachment and select <guibutton>View Inline</"
-"guibutton>. At the bottom, you can click <guibutton>OK</guibutton> to update "
-"your attendee list."
-msgstr ""
-"Cuando reciba una respuesta a su invitación de reunión, podrá verla incluida "
-"dentro del mensaje. Haga clic con el botón derecho sobre el adjunto y elija "
-"<guibutton>Ver incluido</guibutton>. Al pie, haga clic en "
-"<guibutton>Aceptar</guibutton> para actualizar su lista de asistentes."
-
-#: index.docbook:419
-#, no-c-format
-msgid ""
-"Open the list creation dialog box by clicking the <guibutton>New List</"
-"guibutton> button or selecting <menuchoice> <guimenu> File </guimenu> "
-"<guisubmenu> New </guisubmenu> <guimenuitem> Contact List </guimenuitem> </"
-"menuchoice>."
-msgstr ""
-"Abra el cuadro de diálogo de creación de lista: haga clic en "
-"<menuchoice><guibutton>New</guibutton><guimenuitem>Lista de contactos</"
-"guimenuitem></menuchoice> o seleccione <menuchoice> <guimenu> Archivo </"
-"guimenu> <guisubmenu> Nuevo </guisubmenu> <guimenuitem> Lista de contactos </"
-"guimenuitem> </menuchoice>."
-
-#: index.docbook:419
-#, no-c-format
-msgid "To create a list of contacts:"
-msgstr "Para crear una lista de contactos:"
-
-#: index.docbook:419
-#, no-c-format
-msgid "What's an IMAP Namespace?"
-msgstr "¿Qué es el espacio de nombres de IMAP?"
-
-#: index.docbook:425
-#, no-c-format
-msgid ""
-"If the image isn't included in the message, but is, instead, a link to an "
-"image, <application>Evolution</application> can download the image from the "
-"Internet for you. However, <application>Evolution</application> will not "
-"display the image unless you ask it to. This is because remotely hosted "
-"images can be slow to load and display, and can even be used by spammers to "
-"track who reads their email. Having images not load automatically helps "
-"protect your privacy."
-msgstr ""
-"Si la imagen no está dentro del mensaje pero es un enlace a una imagen en Internet "
-"<application>Evolution</application> puede descargarla. Sin embargo, no lo hará a "
-"menos que se lo pida explícitamente. Esto se explica porque las "
-"imágenes remotas pueden tardar un poco en set descargadas y mostradas y porque"
-"pueden ser usadas por «spammers» para llevar un control de quién lee sus indeseables "
-"mensajes. Puede proteger un poco más su privacidad si no configura para que las images "
-"se descarguen automáticamente."
-
-#: index.docbook:435
-#, no-c-format
-msgid ""
-"If you want the images to load for one message, select <menuchoice> "
-"<guimenu>View</guimenu> <guisubmenu>Message Display</guisubmenu> "
-"<guimenuitem>Load Images</guimenuitem> </menuchoice>. If you want "
-"<application>Ximian Evolution</application> to load remotely hosted images "
-"more often, select <menuchoice> <guimenu>Tools</guimenu> "
-"<guimenuitem>Settings</guimenuitem> </menuchoice> and go to the mail "
-"settings tool. There, click the <guilabel>HTML Mail</guilabel> tab and "
-"select one of the items there: <guilabel>Never load images off the net</"
-"guilabel>, <guilabel>Load images if sender is in addressbook</guilabel>, or "
-"<guilabel>Always load images off the net.</guilabel>"
-msgstr ""
-"Si quiere ver las imágenes de un mensaje elija <menuchoice><guimenu>Ver</guimenu> "
-"<guisubmenu>Mostrar mensaje</guisubmenu> "
-"<guimenuitem>Cargar imágenes</guimenuitem></menuchoice>. Si quiere que"
-"<application>Ximian Evolution</application> descargue imágenes desde Internet, elija"
-"<menuchoice><guimenu>Herramientas</guimenu> "
-"<guimenuitem>Configuración</guimenuitem></menuchoice> y pinche en la herramienta "
-"de configuración del correo <guilabel>Opciones de correo</guilabel>. Allí abra la "
-"solapa <guilabel>Correo en HTML</guilabel> y elija una de las opciones "
-"<guilabel>No cargar nunca imágenes desde la red</guilabel> "
-"<guilabel>Cargar imágenes si el remitente está en la libreta de direcciones</guilabel> "
-"<guilabel>Cargar siempre las imágenes desde la red</guilabel>."
-
-#: index.docbook:436
-#, no-c-format
-msgid ""
-"If you think you'll want to return to a search again, you can save it and "
-"execute it later. Just click <guilabel> Save Search</guilabel> from the "
-"<guimenu>Search</guimenu> menu. Then, you can run that search on any folder "
-"by selecting it from the <guimenu>Search</guimenu> menu. You may also want "
-"to create a vFolder instead; see <xref linkend=\"usage-mail-organize-vfolders"
-"\"/> for more detail."
-msgstr ""
-"Si cree que va a necesitar la búsqueda más tarde puede guardarla y ejecutarla luego. "
-"Solamente tiene que pinchar en <guimenuitem>Guardar búsqueda</guimenuitem> en el "
-"menú <guimenu>Buscar</guimenu>. Después, podrá ejecutar esa búsqueda en "
-"cualquier carpeta eligiéndola del menú <guimenu>Buscar</guimenu>. En lugar de eso "
-"puede que lo que quiera sea crear una carpeta virtual. Para saber más consulte "
-"<xref linkend=\"usage-mail-organize-vfolders\"/>."
-
-#: index.docbook:439
-#, no-c-format
-msgid "Sending Email"
-msgstr "Enviando correo"
-
-#: index.docbook:440
-#, no-c-format
-msgid ""
-"Microsoft Exchange: Sends mail through a Microsoft Exchange server using the "
-"Microsoft Exchange 2000 protocol. Available only if you have are using the "
-"Ximian Connector for Microsoft Exchange. You must have a valid license key "
-"purchased from <ulink url=\"http://store.ximian.com\">store.ximian.com</"
-"ulink>."
-msgstr ""
-"Microsoft Exchange: envía el correo a través de un servidor Microsoft "
-"Exchange utilizando el protocolo Microsoft Exchange 2000. Sólo está "
-"disponible si adquiere Ximian Connector para Microsoft Exchange. Debe tener "
-"la clave de una licencia válida que haya adquirido en <ulink url=\"http://"
-"store.ximian.com\">store.ximian.com</ulink>."
-
-#: index.docbook:440
-#, no-c-format
-msgid "SMTP: Sends mail directly from your system."
-msgstr "SMTP: envía el correo directamente desde su sistema."
-
-#: index.docbook:440
-#, no-c-format
-msgid ""
-"Sendmail: Uses the Sendmail program to send mail from your system. Sendmail "
-"is more flexible, but is not as easy to configure, so you should only select "
-"this option if you know how to set up a Sendmail service."
-msgstr ""
-"Sendmail: utiliza el programa <application>Sendmail</application> para "
-"enviar el correo desde su sistema. Sendmail es muy flexible pero no es tan "
-"fácil de configurar por lo que sólo debería elegir esta opción si sabe cómo "
-"poner en marcha un servicio Sendmail."
-
-#: index.docbook:440
-#, no-c-format
-msgid ""
-"Server Type: There are numerous server types that <application>Ximian "
-"Evolution</application> supports for sending your mail."
-msgstr ""
-"Tipo de servidor: <application>Ximian Evolution</application> es capaz de "
-"comunicarse con varios tipos de servidor a la hora de enviar su correo."
-
-#: index.docbook:440
-#, no-c-format
-msgid "The <guilabel>Sending Email</guilabel> step lets you configure sending email."
-msgstr ""
-"El paso <guilabel>Enviando correo</guilabel> sirve para configurar el envío "
-"de correo electrónico."
-
-#: index.docbook:446
-#, no-c-format
-msgid ""
-"When you're done with the search, go back to seeing all your messages by "
-"choosing <guimenuitem>Show All</guimenuitem> from the <guilabel>Search</"
-"guilabel> drop-down box, or enter a blank search."
-msgstr ""
-"Cuando haya acabado con la búsqueda y quiera volver para ver de nuevo todos los "
-"mensajes, elija <guimenuitem>Mostrar todos</guimenuitem> en la lista desplegable "
-"<guilabel>Búsqueda</guilabel> o haga una búsqueda sin escribir ningún patrón."
-
-#: index.docbook:451
-#, no-c-format
-msgid ""
-"If you are using GNOME 1.4, you will need to configure this in the Nautilus "
-"<guilabel>Preferences</guilabel> dialog. However, in GNOME 2.0 and later, "
-"you can use the GNOME Control Center. Select <menuchoice><guimenu>System</"
-"guimenu><guimenuitem>Settings</guimenuitem></menuchoice> from your menu "
-"panel or from the GNOME menu, and then click the <guibutton>Network Proxies</"
-"guibutton> button in the <guilabel>System Settings</guilabel> category. "
-"Select the <guilabel>Use an HTTP network proxy</guilabel> check box and then "
-"enter information about your proxy. If you are not sure, check with your ISP "
-"or system administrator."
-msgstr ""
-"Si está usando GNOME 1.4, tendrá que configurar esto en el menú "
-"<guilabel>Preferencias</guilabel> de Nautilus. Sin embargo, en GNOME 2.0 y posteriores "
-"puede usar el Centro de Control de GNOME desde el menú en la parte superior del "
-"escritorio o desde el menú GNOME"
-"<menuchoice><guimenu>Sistema</guimenu> "
-"<guimenuitem>Configuración personal</guimenuitem></menuchoice> desde el "
-"panel-menú o desde el menú GNOME y pinchar en el botón "
-"<guibutton>Configuración del proxy de la red</guibutton> de la sección"
-"<guilabel>Configuración del sistema</guilabel>. Escriba la información de su proxy y si "
-"tiene dudas, consulte a su administrador de red o a su ISP. "
-
-#: index.docbook:451
-#, no-c-format
-msgid ""
-"If you use an HTTP proxy (as in many large organizations), "
-"<application>Evolution</application> must be able to find it through the "
-"<systemitem>gnome-vfs</systemitem> subsystem before it can load images from "
-"the Internet. This is also the case if you wish to access weather and news "
-"information through the Summary tool."
-msgstr ""
-"Si utiliza un «proxy» HTTP (como ocurre en muchas grandes organizaciones) "
-"<application>Ximian Evolution</application> debe poder"
-"encontrarlo a través del subsistema <systemitem>gnome-vfs</systemitem> antes "
-"de poder descargar imágenes desde Internet. Ocurre igual con la información de noticias "
-"y metereología a través de la herramienta Resumen."
-
-#: index.docbook:451
-#, no-c-format
-msgid "Loading Images from the Net through an HTTP Proxy"
-msgstr "Cargar imágenes desde Internet usando un «proxy» HTTP"
-
-#: index.docbook:453
-#, no-c-format
-msgid ""
-"If you'd like to perform a more complex search, open the advanced search "
-"dialog by selecting <guilabel>Advanced...</guilabel> from the "
-"<guilabel>Search</guilabel> drop-down menu. Then, create your search "
-"criteria (each with the same options you saw in the regular search bar), and "
-"decide whether you want to find messages that match all of them, or messages "
-"that match even one. Then, click <guibutton>Search</guibutton> to go and "
-"find those messages."
-msgstr ""
-"Si prefiere realizar una búsqueda más compleja, abra el cuadro de diálogo de "
-"búsqueda avanzada: para ello, seleccione <guilabel>Avanzado...</guilabel> en "
-"la lista desplegable <guilabel>Búsqueda</guilabel>. A continuación, defina "
-"su criterios de búsqueda (cada uno con las mismas opciones que las que ya "
-"vimos en la barra de búsqueda normal), y especifique si desea que los "
-"mensajes encontrados coincidan con todos, o sólo con uno de los criterios. "
-"Haga clic en <guibutton>Buscar</guibutton> para buscar estos mensajes."
-
-#: index.docbook:459
-#, no-c-format
-msgid ""
-"There are three sets of folder options. In the first, <guilabel>Defaults</"
-"guilabel>, select which folders will be your usual mail, contact, calendar, "
-"and task folders. These are the folders opened when you click items in the "
-"shortcut bar, and when you want to save a calendar attachment or address "
-"card."
-msgstr ""
-"Hay tres conjuntos de carpetas. El primero son las <guilabel>Carpetas "
-"predefinidas</guilabel>, donde puede elegir qué carpetas pueden ser sus carpetas "
-"más frecuentes para correo, contactos, agenda y tareas. Estas carpetas son las que se abren "
-"desde la barra de atajos y cuando guarda una tarjeta de visita o un evento adjunto."
-
-#: index.docbook:465
-#, no-c-format
-msgid ""
-"You'll see a similar approach to sorting messages when you create filters "
-"and vFolders in the next few sections."
-msgstr ""
-"Éste es un procedimiento similar al que le permite ordenar mensajes mediante "
-"filtros y carpetas virtuales, que describiremos en secciones siguientes."
-
-#: index.docbook:466
-#, no-c-format
-msgid ""
-"When you are done, click <guibutton>OK</guibutton>. The list will appear as "
-"a contact card, which you can use as you would any other. That includes "
-"emailing the list to another person, and, of course, sending email to the "
-"list."
-msgstr ""
-"Cuando ha terminado, haga clic en <guibutton>Aceptar</guibutton>. La lista "
-"de contactos aparece como una tarjeta más, que puede utilizar como las "
-"demás. Esto incluye la posibilidad de enviar la lista a otra persona y, por "
-"supuesto, la de enviar un mensaje a la lista."
-
-#: index.docbook:467
-#, no-c-format
-msgid ""
-"The <guilabel>Offline Folders</guilabel> are the ones which will be cached "
-"when you activate the <guibutton>Go Offline</guibutton> feature."
-msgstr ""
-"Las <guilabel>Carpetas sin conexión</guilabel> son de las que se mantienen copias locales "
-"cuando activa la función <guibutton>Trabajar desconectado</guibutton>."
-
-#: index.docbook:472
-#, no-c-format
-msgid ""
-"Select one or more folders of contacts for your <guilabel>Autocompletion "
-"Folders</guilabel>. When you type a few letters into the message composer "
-"address fields, Evolution will look for matches in the folders you choose "
-"here."
-msgstr ""
-"Elija una o más carpetas de contactos para las <guilabel>Carpetas para autocompletar</guilabel>. "
-"Cuando escribe unas letras en los campos de los destinatarios de los mensajes, "
-"Evolution usará ese texto como patrón de búsquerda en las carpetas que haya especificado."
-
-#: index.docbook:472
-#, no-c-format
-msgid ""
-"To mail the list, open a new email and type the name you chose for the list. "
-"Ximian Evolution will address the message to the entire list when you send "
-"it. You can also right-click on the list's address card in the Addressbook "
-"and select <guimenuitem>Send Message to List</guimenuitem>."
-msgstr ""
-"Para enviar un mensaje a la lista, abra un mensaje nuevo y escriba el nombre "
-"correspondiente. Al enviarlo, Ximian Evolution transmitirá el mensaje a "
-"todos los miembros de la lista. También puede hacer clic con el botón "
-"derecho en la tarjeta correspondiente en la libreta de direcciones, y "
-"seleccionar <guimenuitem>Enviar un mensaje a la lista</guimenuitem>."
-
-#: index.docbook:473
-#, no-c-format
-msgid "Create Rules to Automatically Organize Mail"
-msgstr "Creación de reglas para organizar automáticamente el correo"
-
-#: index.docbook:474
-#, no-c-format
-msgid ""
-"Filters work very much like the mail room in a large company. Their purpose "
-"is to bundle, sort, and distribute mail to the various folders. In addition, "
-"you can have multiple filters performing multiple actions that may effect "
-"the same message in several ways. For example, your filters could put copies "
-"of one message into multiple folders, or keep a copy and send one to another "
-"person as well, and it can do that quickly. Of course, it's also faster and "
-"more flexible than an actual person with a pile of envelopes."
-msgstr ""
-"Los filtros trabajan de forma muy parecida a la del departamento de correo "
-"de una organización de gran tamaño. Su cometido es el de empaquetar, ordenar "
-"y distribuir el correo en varias carpetas. Además, es posible aplicar sobre "
-"un mismo mensaje filtros múltiples, asociados a acciones múltiples, para "
-"manipularlo de numerosas formas. Por ejemplo, sus filtros pueden crear "
-"copias de un mismo mensaje en múltiples carpetas; pueden también conservar o "
-"incluso mandar una copia a otra persona, y todo de forma rápida. Por "
-"supuesto, estas operaciones son también más rápidas y flexibles que una "
-"persona real colocada ante un montón de sobres."
-
-#: index.docbook:479
-#, no-c-format
-msgid "Ximian Evolution cannot store contact lists on Exchange servers."
-msgstr ""
-"Ximian Evolution no puede almacenar listas de contactos en servidores "
-"Exchange."
-
-#: index.docbook:480
-#, no-c-format
-msgid "Composing New Email Messages"
-msgstr "Escribir nuevos mensajes de correo electrónico"
-
-#: index.docbook:481
-#, no-c-format
-msgid ""
-"Authentication Type: Unless you've been told otherwise, your best bet is to "
-"leave this set at <guilabel>Password</guilabel>. If you're not sure, ask "
-"your system administrator or ISP, or have <application>Ximian Evolution</"
-"application> check for you by clicking <guibutton>Check for supported types</"
-"guibutton>."
-msgstr ""
-"Tipo de autenticación: a menos que haya recibido otras indicaciones, lo "
-"mejor es que deje esta opción en <guilabel>Contraseña</guilabel>. Si no está "
-"seguro pregunte a su administrador de sistemas, a su proveedor de Internet o "
-"deje que <application>Ximian Evolution</application> lo compruebe por usted "
-"mediante la opción <guibutton>Comprobar tipos soportados</guibutton>."
-
-#: index.docbook:481
-#, no-c-format
-msgid "Host: enter your mail sending server's name or IP address here."
-msgstr "Servidor: escriba aquí el nombre o la dirección IP de su servidor para envío de correo."
-
-#: index.docbook:481
-#, no-c-format
-msgid "If you choose SMTP, there are a few additional items to enter:"
-msgstr "Si elije SMTP , hay unas cuantas cosas que debe indicar:"
-
-#: index.docbook:481
-#, no-c-format
-msgid "Mail Options"
-msgstr "Opciones de correo"
-
-#: index.docbook:481
-#, no-c-format
-msgid ""
-"Remember Password: If you prefer to not enter your password every time you "
-"check email, press this button."
-msgstr ""
-"Recordar contraseña: Si no quiere tener que escribir su contraseña cada vez "
-"que descarga su correo pulse este botón."
-
-#: index.docbook:481
-#, no-c-format
-msgid ""
-"Server requires authentication: If your server requires you to enter a "
-"password to send mail, check this box."
-msgstr ""
-"El servidor requiere autenticación: active esta casilla si al enviar su "
-"correo el servidor pide que le escriba una contraseña."
-
-#: index.docbook:481
-#, no-c-format
-msgid ""
-"Username: The account name you use when you login to check your email. "
-"Normally, this is the part of your email address before the '@' character. "
-"For Exchange servers, it is the username you would use to log in to a "
-"Windows workstation at your company."
-msgstr ""
-"Nombre de usuario: el nombre de la cuenta con la que descarga su correo. "
-"Normalmente es la parte de su dirección de correo electrónico que esta antes "
-"de la <quote>@</quote>. Con servidores Exchange, es el nombre de usuario que "
-"usa al ingresar en una estación de trabajo Windows en su compañía."
-
-#: index.docbook:481
-#, no-c-format
-msgid ""
-"You can start writing a new email message by selecting <menuchoice> "
-"<guimenu>File</guimenu> <guisubmenu>New</guisubmenu> <guimenuitem> Mail "
-"Message</guimenuitem></menuchoice>, or by pressing the <guibutton>New</"
-"guibutton> button in the Inbox toolbar. When you do so, the <interface>New "
-"Message</interface> window will open, as shown in <xref linkend=\"usage-mail-"
-"newmsg-fig\"/>."
-msgstr ""
-"Para crear un nuevo mensaje de correo electrónico elija <menuchoice> "
-" <guimenu>Archivo</guimenu> <guisubmenu>Nuevo</guisubmenu> "
-"<guimenuitem>Mensaje de correo</guimenuitem> </menuchoice> "
-"o haga clic en <guibutton>Nuevo</guibutton>, en la izquierda de la barra "
-"de herramientas. Se abrirá el cuadro de diálogo <interface>Redactar un mensaje</"
-"interface> tal y como se muestra en <xref linkend=\"usage-mail-newmsg-fig\"/>."
-
-#: index.docbook:482
-#, no-c-format
-msgid ""
-"The <guilabel>Mail Options</guilabel> tool lets you choose how to display "
-"citations, how long to wait before marking a message as read, and other mail "
-"display settings. There are three categories of settings: General, HTML "
-"Mail, and Colors."
-msgstr ""
-"La herramienta <guilabel>Opciones de correo</guilabel> sirve para elegir cómo "
-"mostrar las citas de otros mensajes, cuánto esperar hasta marcar un mensaje como leído así "
-"como otras opciones de representación del correo. Hay tres categorías de opciones: General, "
-"Correo en HTML y Colores."
-
-#: index.docbook:485
-#, no-c-format
-msgid "Scheduling Meetings and The Free/Busy View"
-msgstr "Planificación de reuniones y vista de disponibilidad"
-
-#: index.docbook:486
-#, no-c-format
-msgid ""
-"In addition to the standard meeting scheduling tools, you can use the Free/"
-"Busy view to check whether people are available in advance. At this time, "
-"the Free/Busy feature only works with Microsoft Exchange servers. However, "
-"you can still use iCal event invitations to coordinate schedules with other "
-"people no matter what server you're using."
-msgstr ""
-"Además de las herramientas estándar de planificación de reuniones puede usar "
-"la vista de disponibilidad para comprobar de antemano si la gente estará "
-"ocupada o no. Por ahora, la vista de disponibilidad sólo funciona con "
-"servidores Microsoft Exchange. Sin embargo puede usar las invitaciones en la "
-"forma de eventos iCal para coordinar las agendas con otras personas sin "
-"importar qué servidor esté usando."
-
-#: index.docbook:487
-#, no-c-format
-msgid "Quick Filter Creation"
-msgstr "Creación rápida de filtros"
-
-#: index.docbook:487
-#, no-c-format
-msgid ""
-"There is an easy shortcut for fast filter or vFolder creation. Right-click "
-"on the message in the message list, and select one of the items under the "
-"<guimenuitem>Create Rule from Message</guimenuitem> submenu."
-msgstr ""
-"Existe un procedimiento rápido y sencillo para crear filtros o carpetas "
-"virtuales. En la lista de mensajes, haga clic con el botón derecho en el "
-"mensaje deseado y en el submenú <guimenuitem>Crear una regla con el mensaje</"
-"guimenuitem> seleccione una de las opciones disponibles."
-
-#: index.docbook:489
-#, no-c-format
-msgid ""
-"For information on individual email account settings, see <xref linkend="
-"\"config-prefs-mail-identity\"/>."
-msgstr ""
-"Para saber más sobre opciones individuales de correo electrónico consulte "
-"<xref linkend=\"config-prefs-mail-identity\"/>."
-
-#: index.docbook:489
-#, no-c-format
-msgid "LDAP: Shared Addressbooks on a Network"
-msgstr "Protocolo LDAP: libretas de direcciones compartidas en red"
-
-#: index.docbook:491
-#, no-c-format
-msgid ""
-"The <glossterm linkend=\"ldap\">LDAP</glossterm> protocol was created to let "
-"users share contact information over a network by sharing access to a "
-"central address book. LDAP allows a company to maintain a shared set of "
-"contact information for a company or department. Many companies keep a "
-"common LDAP address book for all their employees or for client contacts."
-msgstr ""
-"El diseño del protocolo <glossterm linkend=\"ldap\">LDAP</glossterm> permite "
-"a los usuarios compartir información de contactos en red, mediante accesos "
-"compartidos a una libreta de direcciones central. El protocolo LDAP permite "
-"que una organización ponga un conjunto de contactos a la dispocición de sus "
-"miembros, o de un departamento. Numerosas organizaciones conservan en una "
-"libreta LDAP las direcciones de todos sus empleados o los contactos de "
-"clientes."
-
-#: index.docbook:494
-#, no-c-format
-msgid "Choose a color to highlight quotations from other messages."
-msgstr "Elija qué color quiere para resaltar las citas de otros mensajes."
-
-#: index.docbook:494
-#, no-c-format
-msgid ""
-"Click <menuchoice> <guimenu>Actions</guimenu> <guimenuitem>Schedule Meeting</"
-"guimenuitem> </menuchoice>"
-msgstr ""
-"Elija <menuchoice> <guimenu>Acciones</guimenu> <guimenuitem>Planificar una "
-"reunión</guimenuitem> </menuchoice>"
-
-#: index.docbook:494
-#, no-c-format
-msgid "Default Character Encoding"
-msgstr "Codificación de caracteres predeterminada"
-
-#: index.docbook:494
-#, no-c-format
-msgid ""
-"Evolution can alert you to the arrival of new mail with a beep or by playing "
-"a sound file. Choose your alert noise, or select none, as you wish."
-msgstr ""
-"Evolution puede alertarle de la llegada de correo nuevo con un pitido o lanzando "
-"un fichero de sonido. Elija el sonido de alerta o ninguno, a placer."
-
-#: index.docbook:494
-#, no-c-format
-msgid ""
-"Here, choose whether to delete messages automatically when quitting "
-"Evolution, and whether you wish to explicitly confirm the final deletion of "
-"messages."
-msgstr ""
-"Aquí elige si quiere borrar automáticamente los mensajes al salir de Evolution o si "
-"prefiere tener que confirmar explícitamente su borrado definitivo."
-
-#: index.docbook:494
-#, no-c-format
-msgid "In the <guilabel>General</guilabel> tab, your options are:"
-msgstr ""
-"La solapa <guilabel>General</guilabel> permite establecer los valores "
-"siguientes:"
-
-#: index.docbook:494
-#, no-c-format
-msgid "Mark Messages as Read"
-msgstr "Marcar los mensajes como leídos"
-
-#: index.docbook:494
-#, no-c-format
-msgid "Message Display"
-msgstr "Vista de los mensajes"
-
-#: index.docbook:494
-#, no-c-format
-msgid "Message Fonts"
-msgstr "Tipografías del mensaje"
-
-#: index.docbook:494
-#, no-c-format
-msgid "New Mail Notification"
-msgstr "Aviso de correo nuevo"
-
-#: index.docbook:494
-#, no-c-format
-msgid "New Message Window"
-msgstr "Ventana de creación de un mensaje"
-
-#: index.docbook:494
-#, no-c-format
-msgid ""
-"Normally, Evolution will mark a message as read as soon as it is displayed. "
-"If you prefer, you may set this to happen only after a delay, or disable it "
-"entirely and mark messages as read only when you choose to do so."
-msgstr ""
-"Normalmente Evolution marcará los mensajes como leídos tan pronto como los "
-"muestre en pantalla. Si lo prefiere puede configurarlo para que ocurra tras un pequeño "
-"lapso o desactivarlo del todo para que sólo se marquen como leídos cuando lo indique "
-"expresamente."
-
-#: index.docbook:494
-#, no-c-format
-msgid ""
-"Normally, Evolution will use the same fonts as other GNOME applications. To "
-"choose different fonts, uncheck the box <guilabel>Use the same fonts as "
-"other applications</guilabel> and select one font for standard typefaces and "
-"a second for monospace, or terminal, display."
-msgstr ""
-"En general Evolution usará las mismas tipografías que el resto de aplicaciones GNOME. "
-"Para elegir otras diferentes desactive la casilla <guilabel>Usar las mismas tipografías que "
-"en otras aplicaciones</guilabel> y elija una tipografía estándar y otra de tamaño fijo."
-
-#: index.docbook:494
-#, no-c-format
-msgid "Open or create an appointment in the <guilabel>Calendar</guilabel> window."
-msgstr "Abra o cree una cita en la ventana <guilabel>Calendario</guilabel>."
-
-#: index.docbook:494
-#, no-c-format
-msgid "Open the <guilabel>Scheduling</guilabel> tab."
-msgstr "Abra la ficha <guilabel>Planificación</guilabel>."
-
-#: index.docbook:494
-#, no-c-format
-msgid "Quotation Highlight Color"
-msgstr "Color para resaltar las citas."
-
-#: index.docbook:494
-#, no-c-format
-msgid "These three settings handle the way messages appear to you."
-msgstr "Estas tres opciones manejan la manera en la que se le aparecen los mensajes."
-
-#: index.docbook:494
-#, no-c-format
-msgid ""
-"This setting allows you to select character interpretation sets so that "
-"Evolution can display different alphabets. If you are not sure, pick Unicode "
-"(UTF-8), which will work for a large number of languages and character sets."
-msgstr ""
-"Esta opción le permite elegir qué juegos .de caracteres quiere que Evolution interprete "
-"para poder mostrar diferentes alfabetos. Si no está seguro de cuál elegir, elija Unicode "
-"(UTF-8), que sirve para una gran cantidad de lenguas y juegos de caracteres."
-
-#: index.docbook:494
-#, no-c-format
-msgid "To access the free/busy view:"
-msgstr "Para acceder a la vista de disponibilidad:"
-
-#: index.docbook:495
-#, no-c-format
-msgid "Evolution Main Window"
-msgstr "La ventana principal de Ximian Evolution"
-
-#: index.docbook:499
-#, no-c-format
-msgid "Making New Filters"
-msgstr "Creación de filtros"
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Assign Color - Select this item, and <application>Ximian Evolution</"
-"application> will mark the message with whatever color you please."
-msgstr ""
-"Asignar color: seleccione este elemento para que <application>Ximian "
-"Evolution</application> resalte el mensaje con el color especificado."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Assign Score - If you know that all mail with \"important\" somewhere in the "
-"message body line is important, you can give it a high priority score. In a "
-"subsequent filter you can then arrange your messages by their priority score."
-msgstr ""
-"Asignar puntuación: por ejemplo, puede asignar una prioridad mayor a todos "
-"los mensajes que contengan en algún lugar del cuerpo la palabra "
-"«importante». En un filtro posterior, podrá entonces reordenar los mensajes "
-"en función de su valor de prioridad."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Attachments - Create a filter based on whether or not you have an attachment "
-"in the email."
-msgstr "Adjuntos: crea un filtro en función de si el mensaje contiene un adjunto."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Click <menuchoice> <guimenu>Tools</guimenu> <guimenuitem>Filters</"
-"guimenuitem> </menuchoice>"
-msgstr ""
-"Seleccione <menuchoice> <guimenu>Herramientas</guimenu> "
-"<guimenuitem>Filtros</guimenuitem> </menuchoice>"
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Copy to Folder - If you select this item, <application>Ximian Evolution</"
-"application> will put the messages into a folder you specify. Click the "
-"<guibutton>&lt;click here to select a folder&gt;</guibutton> button to "
-"select a folder."
-msgstr ""
-"Copiar a la carpeta: al seleccionar este elemento, <application>Ximian "
-"Evolution</application> colocará los mensajes en la carpeta especificada. "
-"Haga clic en el botón <guibutton>&lt;pulse aquí para seleccionar una "
-"carpeta&gt;</guibutton>."
-
-#: index.docbook:500
-#, no-c-format
-msgid "Creating a Mail Filter"
-msgstr "Creación de filtros de correo"
-
-# index.docbook:458, index.docbook:949
-#: index.docbook:500 index.docbook:1113
-#, no-c-format
-msgid ""
-"Date Received - This works the same way as the <guilabel>Date Sent</"
-"guilabel> option, except that it compares the time you got the message with "
-"the dates you specify."
-msgstr ""
-"Fecha de recepción: funciona del mismo modo que la opción <guilabel>Fecha "
-"de envío</guilabel>, excepto que compara la fecha y hora de recepción del "
-"mensaje con las fechas especificadas."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Date sent - Filter messages according to the date on which they were sent: "
-"First, choose the conditions you want a message to meet -- <guilabel>before</"
-"guilabel> a given time, <guilabel>after</guilabel> it, and so forth. Then, "
-"choose the time. The filter will compare the message's time-stamp to the "
-"system clock when the filter is run, or to a specific time and date you "
-"choose from a calendar. You can even have it look for messages within a "
-"range of time relative to the filter -- perhaps you're looking for messages "
-"less than two days old."
-msgstr ""
-"Fecha de envío: filtra los mensajes en función de la fecha de envío: en "
-"primer lugar, defina las condiciones que desea ver cumplidas con un mensaje: "
-"<guilabel>antes</guilabel> de una hora determinada, <guilabel>después de</"
-"guilabel> de ella, etc. A continuación, especifique la fecha y hora. La "
-"fecha y hora del mensaje se compara con la hora del sistema al ejecutarse el "
-"filtro, o con una hora y fecha específica elegida en el calendario. Es posible"
-"incluso buscar mensajes dentro de un intervalo de tiempo relativo, por ejemplo, "
-"buscar mensajes dentro de los dos últimos días."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Delete - Marks the message for deletion. You can still get the message back, "
-"at least until you <guimenuitem>Expunge</guimenuitem> your mail yourself."
-msgstr ""
-"Borrar: marca el mensaje para borrarlo. Sigue siendo posible recuperar el "
-"mensaje de nuevo, al menos hasta que seleccione <guimenuitem>Purgar</"
-"guimenuitem> el correo."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Expression - For programmers only: match a message according to an "
-"expression you write in the Scheme language, used to define filters in "
-"<application>Ximian Evolution</application>."
-msgstr ""
-"Expresión: sólo para programadores: busca un mensaje que corresponda a una "
-"expresión escrita en lenguaje Scheme, utilizado para definir filtros en "
-"<application>Ximian Evolution</application>."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Expression - If you know your way around a <glossterm linkend=\"regular-"
-"expression\">regex</glossterm>, or regular expression, put your knowledge to "
-"use here. This allows you to search for complex patterns of letters, so that "
-"you can find, for example, all words that start with a and ends with m, and "
-"are between six and fifteen letters long, or all messages that declare a "
-"particular header twice. For information about how to use regular "
-"expressions, check the manual page for the <command>grep</command> command."
-msgstr ""
-"Expresión regular: si sabe lo que se hace con las <glossterm linkend=\"regular-"
-"expression\">expresiones regulares</glossterm>, saque provecho aquí de su poderío. "
-"Con esto puede hacer búsquedas de patrones complejos de letras de manera que, por "
-"ejemplo, podría encontrar todas las palabras que empiezan o acaban con m y tienen entre "
-"seis y quince letras de longitud, o distinguir todos los mensajes que tengan duplicacada una "
-"determinada cabecera. Para saber cómo usar las expresiones regulares examine la "
-"página del manual de la orden <command>grep</command>."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Filtering on mailing list actually looks for a specific mailing-list header "
-"called the <computeroutput>X-BeenThere</computeroutput> header, used to "
-"identify mailing lists or other redistributors of mail."
-msgstr ""
-"Un filtro sobre listas de correo busca en realidad una cabecera específica "
-"llamada <computeroutput>X-BeenThere</computeroutput>, utilizada para "
-"identificar las listas de correo, u otros redistribuidores de correo."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Forward to Address - Select this, enter an address, and the addressee will "
-"get a copy of the message."
-msgstr ""
-"Reenviar a la dirección: seleccione esta opción y escriba la dirección del "
-"destinatario que recibirá una copia del mensaje."
-
-#: index.docbook:500
-#, no-c-format
-msgid "How Does Filtering on Mailing Lists Work?"
-msgstr "¿Cómo funcionan los filtros sobre listas de correo?"
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"If a message uses a header more than once, Evolution will pay attention only "
-"to the first instance, even if the message defines the header differently "
-"the second time. For example, if a message declares the Resent-From: header "
-"as \"engineering@rupertcorp.com\" and then restates it as "
-"\"marketing@rupertcorp.com,\" Evolution will filter as though the second "
-"declaration had not occurred. To filter on messages that use headers "
-"multiple times, use a regular expression."
-msgstr ""
-"Si en un mensaje aparece más de una vez la misma cabecera, Evolution sólo se "
-"fija en la primera, aunque en la segunda el contenido sea diferente. Por "
-"ejemplo, si un mensaje declara la cabecera Resent-From: con "
-"«engineering@rupertcorp.com» y a continuación la redefine como "
-"«marketing@rupertcorp.com», Evolution aplicará el filtro como si la segunda "
-"declaración no apareciera. Para filtrar mensajes que utilizan varias "
-"cabeceras varias veces, utilice una expresión regular."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"If you have several filters that match a single message, they will all be "
-"applied to the message, in order, unless one of the filters has the action "
-"<guibutton>Stop Processing</guibutton>. If you use that action in a filter, "
-"the messages that it affects will not be touched by other filters."
-msgstr ""
-"Cuando varios filtros coinciden con un mismo mensaje, se aplican en "
-"orden, excepto cuando uno de los filtros contiene la acción <guibutton>Parar "
-"el proceso</guibutton>. Cuando un filtro que tiene esta acción se aplica sobre "
-" un mensaje, éste no volverá a ser procesado por ninguno de los filtros que quedan "
-"según el orden establecido."
-
-#: index.docbook:500
-#, no-c-format
-msgid "Mailing List - Filter based on the mailing list it came from."
-msgstr ""
-"Lista de correo: aplica un filtro en función de la lista de correo de donde "
-"proviene el mensaje."
-
-# index.docbook:458, index.docbook:949
-#: index.docbook:500 index.docbook:1113
-#, no-c-format
-msgid "Message Body - Search in the actual text of the message."
-msgstr "Cuerpo del mensaje:busca en el texto efectivo del mensaje."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Move to Folder - If you select this item, <application>Ximian Evolution</"
-"application> will put the messages into a folder you specify. Click the "
-"<guibutton>&lt;click here to select a folder&gt;</guibutton> button to "
-"select a folder."
-msgstr ""
-"Mover a la carpeta: al seleccionar este elemento, <application>Ximian "
-"Evolution</application> colocará los mensajes en la carpeta especificada. "
-"Haga clic en el botón <guibutton>&lt;pulse aquí para seleccionar una "
-"carpeta&gt;</guibutton>."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Name your filter in the <guilabel>Rule name</guilabel> field. For each "
-"filter criterion, you must first select which of the following parts of the "
-"message you want the filter to examine:"
-msgstr ""
-"Escriba el nombre de filtro en el campo <guilabel>Nombre de la regla</"
-"guilabel>. Para cada criterio, seleccione en primer lugar las partes de los "
-"mensajes que desea examinar con el filtro:"
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Network folders are only available when you are connected to the network. If "
-"you use a laptop or have a modem connection, you may wish to copy or cache "
-"the network directory. You do this by dragging and dropping your desired "
-"contacts into the local contacts list."
-msgstr ""
-"Las carpetas de red sólo están disponibles cuando se conecta a la red. Si "
-"utiliza un equipo portátil o una conexión telefónica, conviene hacer una "
-"copia del directorio de red, o colocar éste en caché. Para ello, arrastre "
-"los contactos deseados dentro de la lista de contactos local."
-
-#: index.docbook:500
-#, no-c-format
-msgid "Press <guibutton>OK</guibutton>."
-msgstr "Haga clic en <guibutton>Aceptar</guibutton>."
-
-#: index.docbook:500
-#, no-c-format
-msgid "Press the <guibutton>Add</guibutton> button."
-msgstr "Haga clic en <guibutton>Añadir</guibutton>."
-
-# index.docbook:458, index.docbook:949
-#: index.docbook:500 index.docbook:1113
-#, no-c-format
-msgid "Recipients - The recipients of the message."
-msgstr "Destinatarios: los destinatarios del mensaje."
-
-#: index.docbook:500
-#, no-c-format
-msgid "Repeated Headers"
-msgstr "Cabeceras repetidas"
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Score - Emails have a standard priority range from -3 (least important) to 3 "
-"(most important). You can have filters set the priority of messages you "
-"receive, and then have other filters applied only to those messages which "
-"have a certain priority."
-msgstr ""
-"Puntuación: asigna la puntuación de un mensaje, con un número mayor que cero. "
-"Para poder filtros con puntuación, cree un filtro que asigne una puntuación a un mensaje "
-"y después aplique otro para que filtre los mensajes con las puntuaciones que necesita. "
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Select the actions for the filter in the <guilabel>Then</guilabel> section. "
-"You can select any of the following options."
-msgstr ""
-"Seleccione la acciones del filtro en la sección <guilabel>Entonces</"
-"guilabel>. Puede seleccionar cualquiera las opciones siguientes."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Select the criterion for the condition. If you want multiple criteria for "
-"this filter, press <guibutton>Add criterion</guibutton> and repeat the "
-"previous step."
-msgstr ""
-"Seleccione el criterio de la condición. si quiere utilizar múltiples "
-"criterios haga clic en <guibutton>Añadir criterio</guibutton> y repita el "
-"paso anterior."
-
-# index.docbook:458, index.docbook:949
-#: index.docbook:500 index.docbook:1113
-#, no-c-format
-msgid "Sender - The sender's address."
-msgstr "Remitente: la dirección del remitente."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Set Status - If you want to add multiple actions for this filter, press "
-"<guibutton>Add action</guibutton> and repeat the previous step."
-msgstr ""
-"Poner estado: si desea agregar múltiples acciones al filtro, haga clic en "
-"<guibutton>Añadir acción</guibutton> y repita el paso anterior."
-
-# index.docbook:458, index.docbook:949
-#: index.docbook:500 index.docbook:1113
-#, no-c-format
-msgid "Size (kb) - Sorts based on the size of the message in kilobytes."
-msgstr "Tamaño (Kb): ordena los mensajes en función de su tamaño en kilobytes."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Source Account - Filter messages according the server you got them from. You "
-"can enter a URL or choose one from the drop-down list. This ability is only "
-"relevant if you use more than one mail source."
-msgstr ""
-"Cuenta de origen: aplica un filtro en función del servidor de donde "
-"provienen los mensajes. Puede escribir, o seleccionar la dirección URL en la "
-"lista desplegable. Esta característica sólo tiene interés cuando utiliza más "
-"de un origen de correo."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Specific Header - The filter can look at any header you want, even obscure "
-"or custom ones. Enter the header name in the first text box, and put your "
-"search text in the second one."
-msgstr ""
-"Cabecera específica: el filtro puede examinar cualquier cabecera deseada, "
-"por muy oscura o personalizada que sea. Escriba el nombre de la cabecera en "
-"el primer cuadro de texto, y el texto buscado en el segundo."
-
-#: index.docbook:500
-#, no-c-format
-msgid "Status - Filters according to the status of a message, such as 'New'."
-msgstr ""
-"Estado: ejecuta un filtro en función del estado del mensaje, por ejemplo "
-"«Nuevo»."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"Stop Processing - Select this if you want to tell all other filters to "
-"ignore this message, because whatever you've done with it so far is plenty."
-msgstr ""
-"Parar el proceso: especifique si desea que todos los demás filtros pasen "
-"por alto este mensaje, porque con las acciones definidas es suficiente."
-
-# index.docbook:458, index.docbook:949
-#: index.docbook:500 index.docbook:1113
-#, no-c-format
-msgid "Subject - The subject line of the message."
-msgstr "Asunto: la línea asunto del mensaje."
-
-#: index.docbook:500
-#, no-c-format
-msgid "To create a new filter:"
-msgstr "Para crear un nuevo filtro:"
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"To learn how to add a remote directory to your available contact folders, "
-"see <xref linkend=\"config-prefs-contact\"/>. Once you have a LDAP "
-"connection, the network contacts folder or folders will appear inside the "
-"<guilabel>External Directories</guilabel> folder in the folder bar. It will "
-"work exactly like a local folder of cards, with the following exceptions:"
-msgstr ""
-"Para obtener información acerca de cómo agregar un directorio remoto dentro "
-"de sus carpetas de contactos disponibles, consulte <xref linkend=\"config-"
-"prefs-contact\"/>. Tras establecer una conexión LDAP, la carpeta o las "
-"carpetas de contactos en red aparecerán dentro de la barra de carpetas bajo "
-"<guilabel>Otros contactos</guilabel>. Funciona exactamente como una carpeta "
-"de tarjetas locales, con las excepciones siguientes:"
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"To prevent excess network traffic, <application>Evolution</application> will "
-"not normally load the contents of LDAP folders immediately upon opening. You "
-"must click <guilabel>Display All</guilabel> before LDAP folder cards will be "
-"loaded from the network. You can change this behavior in the "
-"<interface>Contact Preferences</interface> window."
-msgstr ""
-"Para reducir el tráfico de red, <application>Evolution</application> no "
-"descarga normalmente el contenido de las carpetas LDAP en el mismo momento "
-"de conectar. Es necesario hacer clic en <guilabel>Mostrar todo</guilabel> "
-"para descargar todo el contenido de la carpeta LDAP desde la red. Puede "
-"modificar este comportamiento en la ventana <interface>Preferencias de los "
-"contactos</interface>."
-
-#: index.docbook:500
-#, no-c-format
-msgid "What if Multiple Filters Match One Message?"
-msgstr "¿Qué ocurre si varios filtros coinciden con un mismo mensaje?"
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"When you first open the filters dialog, you are shown the list of filters "
-"sorted in the order in which they will be applied. You can move them up and "
-"down in the priority list by clicking the <guibutton>Up</guibutton> and "
-"<guibutton>Down</guibutton> buttons."
-msgstr ""
-"Cuando abre la ventana de gestión de filtros los encontrará una lista ordenados "
-"por el orden de aplicación de los mismos. Puede moverlos arriba y abajo, modificando así "
-"su prioridad, con los botones de <guibutton>Arriba</guibutton> y "
-"<guibutton>Abajo</guibutton>."
-
-#: index.docbook:500
-#, no-c-format
-msgid ""
-"You cannot add, delete, or alter cards on the LDAP server. If you need to "
-"change information there, you will need to speak to your system administrator"
-msgstr ""
-"No puede agregar, eliminar o modificar las tarjetas del propio servidor "
-"LDAP. Si necesita modificar el contenido del servidor, póngase en contacto "
-"con el administrador del sistema."
-
-#: index.docbook:503
-#, no-c-format
-msgid ""
-"Enter an address in the <guilabel>To:</guilabel> field. If you wish, enter a "
-"subject in the <guilabel>Subject:</guilabel>, and a message in the box at "
-"the bottom of the window. Once you have written your message, press "
-"<guibutton>Send</guibutton>."
-msgstr ""
-"Escriba una dirección en el campo <guilabel>Para</guilabel>. Si lo desea, escriba el "
-"asunto en <guilabel>Asunto</guilabel>, y en la caja que hay abajo el texto del mensaje. "
-"Una vez que haya acabado pulse en <guibutton>Enviar</guibutton>."
-
-#: index.docbook:507
-#, no-c-format
-msgid ""
-"You're done. Click <guibutton>Finish</guibutton> and <guibutton>OK</"
-"guibutton>, then quit Evolution and start it again. Now you're ready to get "
-"to work on the Exchange server."
-msgstr ""
-"Ha terminado. Haga clic en <guibutton>Terminar</guibutton> y en "
-"<guibutton>Aceptar</guibutton>; a continuación, cierre y vuelva a iniciar el "
-"programa <application>Evolution</application>. A partir de ahora, está listo "
-"para trabajar con el servidor Exchange."
-
-#: index.docbook:512
-#, no-c-format
-msgid "Sending Composed Messages Later"
-msgstr "Enviar los mensajes nuevos más tarde"
-
-#: index.docbook:513
-#, no-c-format
-msgid ""
-"<application>Evolution</application> will normally send mail as soon as you "
-"click the <guibutton>Send</guibutton> button. However, there are a few ways "
-"you can save a message to be sent later:"
-msgstr ""
-"En general <application>Evolution</application> enviará los mensajes a su destinatario "
-"en cuanto pulse el botón <guibutton>Enviar</guibutton>. Sin embargo hay unas "
-"cuantas maneras de guardar un mensaje para enviarlo más tarde."
-
-#: index.docbook:513
-#, no-c-format
-msgid ""
-"Choose <menuchoice> <guimenu>File</guimenu> <guimenuitem>Save Draft</"
-"guimenuitem> </menuchoice> to store your messages in the drafts folder for "
-"later revision."
-msgstr ""
-"Elija <menuchoice><guimenu>Archivo</guimenu><guimenuitem>Guardar "
-"borrador</guimenuitem></menuchoice> para guardar sus mensajes en la carpeta de "
-"borradores y poder revisarlos después."
-
-#: index.docbook:513
-#, no-c-format
-msgid ""
-"If you are offline, <application>Evolution</application> will add your "
-"messages to the <guilabel>Outbox</guilabel> queue. The next time you connect "
-"to the Internet and send or receive mail, that message will be sent."
-msgstr ""
-"Si está desconectado de la red, <application>Evolution</application> guardará sus "
-"mensajes en la carpeta <guilabel> Bandeja de salida</guilabel>. El mensaje se enviará la "
-"próxima vez que se conecte a Internet y renvíe o reciba correo."
-
-#: index.docbook:513
-#, no-c-format
-msgid ""
-"If you prefer to save your message as a text file, choose <guimenuitem>Save "
-"As</guimenuitem> and then choose a file name."
-msgstr ""
-"Si prefiere guardar el mensaje como un archivo de texto elija <guimenuitem> Guardar "
-"como</guimenuitem> y después escriba el nombre del mismo."
-
-#: index.docbook:519
-#, no-c-format
-msgid "Changing an Existing Account to Work with Exchange"
-msgstr "Modificación de una cuenta existente para utilizarla con Exchange"
-
-#: index.docbook:520
-#, no-c-format
-msgid ""
-"If you have an existing email account, and want to convert it to use for "
-"Exchange, select the account you want to convert and click the "
-"<guibutton>Edit</guibutton> button. You'll want to change settings in the "
-"following tabs of the account dialog:"
-msgstr ""
-"Si ya dispone de una cuenta de correo y desea convertirla para utilizarla "
-"con Exchange, seleccione dicha cuenta y haga clic en <guibutton>Editar</"
-"guibutton>. En el cuadro de diálogo, deberá modificar probablemente la "
-"configuración de las fichas siguientes:"
-
-# index.docbook:513, index.docbook:514
-#: index.docbook:521 index.docbook:522
-#, no-c-format
-msgid "Appointment Scheduling Window"
-msgstr "Ventana de planificación de citas"
-
-# index.docbook:473, index.docbook:474
-#: index.docbook:529
-#, no-c-format
-msgid "Exchange Account Settings: Identity"
-msgstr "Configuración de cuentas Exchange: identidad"
-
-#: index.docbook:530
-#, no-c-format
-msgid "Attendee List"
-msgstr "Lista de asistentes"
-
-# index.docbook:473, index.docbook:474
-#: index.docbook:530
-#, no-c-format
-msgid "Creating an Exchange Account, Step One: Identity"
-msgstr "Creación de una cuenta Exchange - Etapa uno: identificación"
-
-#: index.docbook:530
-#, no-c-format
-msgid ""
-"This is a very short section. You can pick two things: the name for the "
-"account, and whether it is the default account."
-msgstr ""
-"Esta es una sección muy corta. Puede elegir dos opciones: el nombnre de la cuenta "
-"y si es la predeterminada."
-
-#: index.docbook:534
-#, no-c-format
-msgid ""
-"The name you choose for the account is used for display within Evolution, "
-"and is not sent with any emails. The suggested name is your email address, "
-"but you can use other words or phrases, like \"Work,\" \"Personal\" or "
-"\"First Account\" if you like."
-msgstr ""
-"El nombre de cuenta que elija sólo se usa para mostrarlo dentro de Evolution y no se manda "
-"por correo electrónico. Le sugerimos que use como nombre el de su dirección de correo "
-"electrónico, pero puede usar cualquier otra palabra o frase, como «Trabajo», «Personal» o "
-"«Cuenta principal», a placer."
-
-#: index.docbook:538
-#, no-c-format
-msgid ""
-"The <guilabel>Attendee List</guilabel> lists off the people who have been "
-"invited to the respective appointment. It also shows their RSVP status."
-msgstr ""
-"La <guilabel>Lista de asistentes</guilabel> muestra a las personas que han "
-"sido invitadas a la reunión y el estado de sus confirmaciones de asistencia."
-
-#: index.docbook:539
-#, no-c-format
-msgid ""
-"Here, you'll find some additional settings: <variablelist> <varlistentry> "
-"<term>Checking for New Mail</term> <listitem> <para> Select whether you "
-"would like to check for mail automatically, and if so, how often. </para> </"
-"listitem> </varlistentry> <varlistentry> <term>Global Address List/Active "
-"Directory</term> <listitem> <para> The Global Address List (GAL) is an "
-"addressbook for everyone represented in your organization's Exchange "
-"deployment. To use the GAL, click the tab labeled <guilabel>Receiving "
-"Options</guilabel> and enter the name of your Global Catalog Server. The GAL "
-"is maintained by your system administrator and you cannot add, change, or "
-"remove items from it using Ximian Evolution. However, you can use it to "
-"invite people to meetings and to look up addresses and other information. </"
-"para> </listitem> </varlistentry> <varlistentry> <term>Exchange Server</"
-"term> <listitem> <para> If your Exchange server requires you to use a "
-"different mailbox name from the name you use to log in, select the second "
-"check-box and enter the mailbox name. Check with your system administrator "
-"to be sure. </para> <para> In most cases, the URL for web access is \"http://"
-"server.company.com/exchange.\" If your system has a path that is not "
-"\"exchange,\" check the box and enter the custom path here. </para> <para> "
-"If your network uses a different server for Public Folders than for personal "
-"folders, enter its name here. </para> </listitem> </varlistentry> </"
-"variablelist> <figure> <title>Exchange Account Settings: Receiving Mail</"
-"title> <screenshot> <screeninfo>Creating an Exchange Account, Step Three: "
-"Mail Options</screeninfo> <mediaobject><imageobject> <imagedata format=\"PNG"
-"\" fileref=\"figures/exchange-receive-options\" srccredit=\"Aaron Weber\"/> "
-"</imageobject></mediaobject> </screenshot> </figure>"
-msgstr ""
-"Aquí encontrará algunas opciones adicionales:<variablelist> <varlistentry> "
-"<term>Comprobación de correo nuevo</term> <listitem> <para> Elija si quiere "
-"que su correo se compruebe automáticamente y en caso positivo, con qué frecuencia. "
-"</para> </listitem> </varlistentry> <varlistentry> <term>Global Address List/Active "
-"Directory</term> <listitem> <para>La Lista Global de Direcciones (en inglés GAL) "
-"es una libreta de direcciones donde figuran todos los usuarios de una instalación Exchange. "
-"Para usar el GAL pinche en la solapa titulada <guilabel>Receiving "
-"Options</guilabel> y escriba el nombre de su servidor global de catálogo. Dado que el "
-"GAL lo mantiene su administrador de sistemas, usted no puede usar Ximian Evolution para "
-"añadir, modificar o eliminar los elementos almacenados. Sin embargo puede usarlo "
-"para invitar a gente a reuniones y para buscar direcciones y otra información de trabajo "
-"en grupo.</para> </listitem> </varlistentry> <varlistentry> <term>Exchange Server</"
-"term> <listitem> <para> Si su servidor Exchange exige usar un buzón con un nombre que "
-"es diferente a su identificador de usuario, marque la segunda casilla y escriba allí el "
-"nombre del buzón. Si tiene dudas consúlteselo a su administrador de sistema.</para> "
-"<para> En muchos casos la URL para el acceso web es «http://server.company.com/exchange». "
-"Si la ruta en su sistema no es «exchange», active la casille y escriba la ruta adecuada.</para> "
-"<para> Si su red usa un servidor carpetas públicas diferente de el de las personales, "
-"escriba aquí su nombre. </para> </listitem> </varlistentry> </"
-"variablelist> <figure> <title>Configuración de cuentas Exchange: recepción de correo</"
-"title> <screenshot> <screeninfo>Creación de una cuenta Exchange, tercer paso: opciones de correo</screeninfo> <mediaobject><imageobject> <imagedata format=\"PNG"
-"\" fileref=\"figures/exchange-receive-options\" srccredit=\"Aaron Weber\"/> "
-"</imageobject></mediaobject> </screenshot> </figure>"
-
-#: index.docbook:539
-#, no-c-format
-msgid ""
-"If you will use your Exchange server to send as well as receive mail, select "
-"<guilabel>Microsoft Exchange</guilabel> as your server type, and enter the "
-"server name as the <guilabel>Host</guilabel>."
-msgstr ""
-"Si piensa utilizar su servidor Exchange para enviar y recibir correo, "
-"seleccione <guilabel>Microsoft Exchange</guilabel> como tipo de servidor, y "
-"escriba su nombre en el campo <guilabel>Host</guilabel>."
-
-#: index.docbook:539
-#, no-c-format
-msgid ""
-"If your email address will change because you are moving to a new server, "
-"then change it in this tab. Otherwise, move to the next tab."
-msgstr ""
-"Modifique en esta ficha su dirección de correo, si ha cambiado por utilizar "
-"un servidor nuevo. En caso contrario, pase a la ficha siguiente."
-
-#: index.docbook:539
-#, no-c-format
-msgid ""
-"Select <guilabel>Microsoft Exchange</guilabel> as your server type. Enter "
-"your name of your server next to <guilabel>Host</guilabel>, and the user "
-"name for your account next to <guilabel>Username</guilabel>. If your server "
-"supports SSL (Secure Socket Layer) encryption, it you can check the "
-"<guilabel>Use SSL</guilabel> box to take advantage of more secure data "
-"transfers. <figure> <title>Exchange Account Settings: Receiving Mail</title> "
-"<screenshot> <screeninfo>Creating an Exchange Account, Step Two: Receiving "
-"Mail</screeninfo> <mediaobject><imageobject> <imagedata format=\"PNG\" "
-"fileref=\"figures/exchange-receive\" srccredit=\"Aaron Weber\"/> </"
-"imageobject></mediaobject> </screenshot> </figure>"
-msgstr ""
-"Indique <guilabel>Microsoft Exchange</guilabel> como tipo de servidor. "
-"Escriba el nombre del servidor en el campo <guilabel>Host</guilabel> así "
-"como el nombre de usuario de su cuenta, en el campo <guilabel>Nombre de "
-"usuario</guilabel>. Si su servidor admite cifrado SSL (Secure Socket Layer), "
-"puede activar la casilla <guilabel>Utilizar SSL</guilabel> para reforzar la "
-"seguridad en sus intercambios de datos. <figure> <title>Configuración de cuentas: "
-"recepción de correo</title> "
-"<screenshot> <screeninfo>Creación de una cuenta Exchange, segundo paso: Recepción "
-"de correo</screeninfo> <mediaobject><imageobject> <imagedata format=\"PNG\" "
-"fileref=\"figures/exchange-receive\" srccredit=\"Aaron Weber\"/> </"
-"imageobject></mediaobject> </screenshot> </figure>"
-
-#: index.docbook:541
-#, no-c-format
-msgid "Configuring Evolution to use LDAP"
-msgstr "Configuración de Evolution para utilizar LDAP"
-
-#: index.docbook:541
-#, no-c-format
-msgid ""
-"If you check the box next to the label <guilabel>Make this my default "
-"account</guilabel>, Evolution will assume that you will send messages from "
-"this most often, and will set the \"From\" selector to this account whenever "
-"you open a new message. Only one account can be the default."
-msgstr ""
-"Si activa la casilla junto a <guilabel>Hacer que ésta sea mi cuenta predeterminada</guilabel>, "
-" Evolution asumirá que será esta la cuenta con la enviará mensajes con más frecuencia y la "
-"usará en el selector <guilabel>De</guilabel> cada vez que escriba un mensaje nuevo. "
-"Sólo puede tener una cuenta predeterminada a la vez."
-
-#: index.docbook:542
-#, no-c-format
-msgid ""
-"For information about setting up <application>Evolution</application> to use "
-"LDAP, please refer to"
-msgstr ""
-"Para más información acerca de cómo configurar el cliente "
-"<application>Evolution</application> para que utilice el protocolo LDAP, "
-"consulte"
-
-#: index.docbook:543
-#, no-c-format
-msgid "Schedule Grid"
-msgstr "Cuadrícula de planificación"
-
-#: index.docbook:547
-#, no-c-format
-msgid "If you have not done so already, you may also be asked to choose a time zone."
-msgstr "Si todavía no se le ha pedido que especifique su zona horaria, es posible que lo haga ahora."
-
-#: index.docbook:551
-#, no-c-format
-msgid "Send me a Card: Adding New Cards Quickly"
-msgstr "Cómo agregar tarjetas rápidamente"
-
-#: index.docbook:551
-#, no-c-format
-msgid ""
-"The <guilabel>Schedule Grid</guilabel> shows the invitee's published Free/"
-"Busy information. This is where you compare people's schedules to find free "
-"time to schedule the appointment."
-msgstr ""
-"La <guilabel>Cuadrícula de planificación</guilabel> muestra la información "
-"de disponibilidad publicada de los invitados. Aquí es donde puede comparar "
-"las planificaciones de las personas para buscar tiempo libre en el que "
-"encajar la reunión."
-
-#: index.docbook:551
-#, no-c-format
-msgid "Working Offline"
-msgstr "Trabajando desconectado"
-
-#: index.docbook:552
-#, no-c-format
-msgid ""
-"As noted before, when you get information about a person in the mail or in a "
-"calendar entry, you can add it to an address card. To do so, right click on "
-"any email address or email message, and select <guimenuitem>Add Sender to "
-"Address Book</guimenuitem> from the menu that appears. <application> "
-"Evolution</application> can also add cards from a hand-held device during "
-"HotSync operation. For more information about that, see <xref linkend="
-"\"usage-sync\"/>."
-msgstr ""
-"Como se explicó anteriormente, cuando recoje información en un mensaje o en una entrada "
-"en el calendario acerca de una persona, puede añadirla a una tarjeta de visita. Para eso, "
-"pinche con el botón derecho sobre cualquier dirección de correo o sobre cualquier mensaje "
-"y elija la opción <guimenuitem>Añadir remitente a la libreta de direcciones</guimenuitem>. "
-"<application>Evolution</application> también puede añadir tarjetas desde dispositivos "
-"de mano durante la operación de sincronización. Para saber más sobre esto consulte"
-"<xref linkend=\"usage-sync\"/>."
-
-#: index.docbook:553
-#, no-c-format
-msgid ""
-"Offline mode is a tool designed for use with IMAP or Exchange mail accounts "
-"in situations where you will not be connected to the network at all times. "
-"It will keep a local copy of one or more folders, and allow you to compose "
-"messages, storing them in your Outbox to be sent the next time you connect."
-msgstr ""
-"El modo desconectado es una herramienta diseñada para usar cuentas de correo IMAP "
-"o Exchange en situaciones en las que no podrá estar siempre conectado a la red local. "
-"Guarda copia de una o más carpetas y le permite crear nuevos mensajes, guardarlos en la "
-"<guilabel>Bandeja de salida</guilabel> y enviarlo en cuanto vuelva a conectarse. "
-
-#: index.docbook:554
-#, no-c-format
-msgid "Importing Mail (Optional)"
-msgstr "Importar correo (opcional)"
-
-#: index.docbook:555
-#, no-c-format
-msgid ""
-"If <application>Ximian Evolution</application> finds mail or address files "
-"from another application, it will offer to import them. If you're not sure "
-"which file format your mail program uses, ask your system administrator. If "
-"you want, you can skip this step and return to it at a later time by "
-"selecting <menuchoice><guimenu>File</guimenu><guimenuitem>Import</"
-"guimenuitem></menuchoice>."
-msgstr ""
-"Si <application>Ximian Evolution</application> encuentra archivos de "
-"direcciones o de correo electrónico de otra aplicación, ofrecerá "
-"importarlos. Si no está seguro de qué formato usa su programa de correo "
-"pregunte a su administrador de sistemas. Si quiere, puede saltar este paso y "
-"volver con posterioridad eligiendo <menuchoice> <guimenu>Archivo</guimenu> "
-"<guimenuitem>Importar</guimenuitem> </menuchoice>."
-
-#: index.docbook:557
-#, no-c-format
-msgid "Meeting Scheduler"
-msgstr "Planificador de reuniones"
-
-#: index.docbook:561
-#, no-c-format
-msgid ""
-"While POP mail downloads all messages to your local system, IMAP and "
-"Exchange connections usually download just the headers, and fetch the rest "
-"only when you want to read the message. Before you go offline, Evolution "
-"will download the unread messages from the folders you have chosen to store."
-msgstr ""
-"En tanto que el correo POP descarga todos sus mensajes a su escritorio, las conexiones "
-"IMAP y Exchange normalmente sólo descargan las cabeceras y traen el resto solamente "
-"cuando quiere leer el mensaje entero. Antes de desconectar, Evolution descargará "
-"todos los mensajes sin leer desde las carpetas que haya elegido copiar al escritorio."
-
-#: index.docbook:565
-#, no-c-format
-msgid ""
-"The <guilabel>Meeting Scheduler</guilabel> allows you to schedule the "
-"meeting in the <guilabel>Free/Busy</guilabel> window."
-msgstr ""
-"El <guilabel>Planificador de reuniones</guilabel> permite planear la reunión "
-"en la ventana de <guilabel>Disponibilidad</guilabel>."
-
-#: index.docbook:570
-#, no-c-format
-msgid "Scheduling an Appointment"
-msgstr "Planificando una cita"
-
-#: index.docbook:570
-#, no-c-format
-msgid ""
-"To mark a folder for offline use, select <menuchoice> <guimenu>Settings</"
-"guimenu> <guimenuitem>Preferences</guimenuitem> </menuchoice> and then click "
-"the <guilabel>Folders</guilabel> icon. In the <guilabel>Offline Folders</"
-"guilabel> tab, click the check-box next to the folders that you would like "
-"to use while you are offline."
-msgstr ""
-"Para marcar una carpeta para usarla cuando esté desconectado elija "
-"<menuchoice> <guimenu>Herramientas</guimenu> <guimenuitem>Configuración</guimenuitem> </menuchoice> "
-"y pinche en el icono <guilabel>Configuración de carpetas</guilabel>. "
-"Elija la solapa <guilabel>Carpetas sin conexión</guilabel> y active las casilla junto a las "
-"carpetas que quiera poder usar cuando no esté conectado."
-
-#: index.docbook:571
-#, no-c-format
-msgid ""
-"To schedule an appointment, you'll first need people's free/busy "
-"information. If you're using the Ximian Connector for Microsoft Exchange, "
-"all of the information is already available to you in the Global Address "
-"List. Otherwise, each person will have to email you their schedule files and "
-"you will have to incorporate them into your calendar."
-msgstr ""
-"Para planificar una cita primero necesita la información de disponibilidad "
-"de la gente. Si está usando Ximian Connector para Microsoft Exchange toda la "
-"información ya está disponible en la lista global de direcciones. En otro "
-"caso cada persona debe enviarle sus ficheros de planificación para que usted "
-"los incorpore a su calendario."
-
-#: index.docbook:579
-#, no-c-format
-msgid ""
-"If you have chosen not to load images automatically, you can choose to see "
-"the images in one message at a time by selecting <menuchoice> <guimenu>View</"
-"guimenu><guisubmenu>Message Display</guisubmenu> <guimenuitem>Load Images</"
-"guimenuitem></menuchoice>."
-msgstr ""
-"Si ha elegido no descargar imágenes automáticamente puede elegir verlas en cada mensaje "
-"con <menuchoice> <guimenu>Ver</guimenu><guisubmenu>Mostrar mensaje</guisubmenu> "
-"<guimenuitem>Cargar imágenes</guimenuitem></menuchoice>."
-
-#: index.docbook:579
-#, no-c-format
-msgid "Loading Images"
-msgstr "Cargar imágenes"
-
-#: index.docbook:579
-#, no-c-format
-msgid "Prompt when sending HTML messages to contacts that don't want them"
-msgstr "Preguntar al mandar mensajes HTML a contactos que no los quieren"
-
-#: index.docbook:579
-#, no-c-format
-msgid ""
-"Regardless of how you get the information, Ximian Evolution will display it "
-"in the <guilabel>Scheduling</guilabel> tab. The pending appointment time "
-"will appear in white with bold black borders. Each attendee's free and busy "
-"times appear color-coded next to their names in the attendee list."
-msgstr ""
-"Sea de donde sea que haya obtenido su información, Ximian Evolution la "
-"mostrará en la ficha <guilabel>Planificación</guilabel>. La hora de la cita "
-"pendiente aparecerá en blanco con bordes negros. En la lista aparecerá el "
-"tiempo libre y ocupado de cada asistente con un código de color junto a sus "
-"nombres."
-
-#: index.docbook:579
-#, no-c-format
-msgid "Show animated images"
-msgstr "Mostrar imágenes animadas"
-
-#: index.docbook:579
-#, no-c-format
-msgid ""
-"Some people do not like HTML mail, and you can set Evolution to warn you. "
-"This warning will appear only when you send HTML mail to people in your "
-"address book who are listed as disliking HTML."
-msgstr ""
-"Como algunas personas no les gusta el correo HTML, puede hacer que Evolution le avise "
-"de eso. Dicha advertencia aparecerá solamente cuando envíe correo HTML a personas a las "
-"que previamente ha anotado en su libreta de direcciones que no quieren recibirlo."
-
-#: index.docbook:579
-#, no-c-format
-msgid "The options in the <guilabel>HTML Mail</guilabel> section are:"
-msgstr "Las opciones en la sección <guilabel>Correo en HTML</guilabel> son:"
-
-#: index.docbook:579
-#, no-c-format
-msgid "Turn animation on or off here."
-msgstr "Aquí puede activar o desactivar que se vean las animaciones en algunas imágenes."
-
-#: index.docbook:579
-#, no-c-format
-msgid ""
-"You can embed a message in an email and have it load only when the message "
-"arrives. However, spammers can use image loading patterns to confirm \"live"
-"\" addresses and invade your privacy. You may elect never to load images "
-"automatically, to load images only if the sender is in your addressbook, or "
-"always load images."
-msgstr ""
-"Al crear un mensaje puede incluirle una imagen que sólo se descargue solamente cuando "
-"el mensaje es leído por el destinatario. Sin embargo los «spammers» pueden usar "
-"los patrones de descarga de imágenes para confirmar «direcciones vivas» e invadir la "
-"privacidad de sus datos. Puede elegir que nunca se carguen las imágenes automáticamente, "
-"hacerlo solamente si el remitente está en su libreta de direcciones o cargarlas todas."
-
-#: index.docbook:580
-#, no-c-format
-msgid ""
-"Your connection status is shown by the small icon in the lower left border "
-"of the Evolution main window. When you are online, it will display two "
-"connected cables. When you go offline, the cables will separate."
-msgstr ""
-"En la esquina inferior izquierda de la ventana principal de Evolution encontrará el indicador "
-"de estado de la conexión. Cuando está conectado mostrará dos cables enchufados. "
-"Cuando esté desconectado los cables estarán desenchufados."
-
-#: index.docbook:586
-#, no-c-format
-msgid ""
-"Adjust the meeting time, either by dragging the meeting borders or by using "
-"the <guilabel>Autopick</guilabel> buttons to choose a time automatically, "
-"then click <guibutton>Save and Close</guibutton>. Attendees on an Exchange "
-"server will have the appointment updated automatically; others will receive "
-"email notification of any change in plans."
-msgstr ""
-"Para ajustar la hora de reunión, arrastre los bordes de la reunión, o haga "
-"clic en <guilabel>Autoseleccionar</guilabel> para hacer una elección "
-"automática. Los asistentes en un servidor Exchange tendrán sus datos "
-"actualizados automáticamente, el resto recibirá una notificación por correo "
-"de cualquier cambio en los planes."
-
-#: index.docbook:587
-#, no-c-format
-msgid ""
-"To cache your selected folders and disconnect from the network, select "
-"<menuchoice><guimenu>File</guimenu><guimenuitem>Work Offline</guimenuitem></"
-"menuchoice> or click the connection status icon in the lower left of the "
-"screen. When you want to reconnect, choose <menuchoice><guimenu>File</"
-"guimenu><guimenuitem>Work Online</guimenuitem></menuchoice> or click the "
-"connection status icon again."
-msgstr ""
-"Para copiar al disco local las carpetas elegidas y desconectar de la red elija "
-"<menuchoice><guimenu>Archivo</guimenu> <guimenuitem> Trabajar "
-"desconectado</guimenuitem></menuchoice> o pinche en el icono indicador de estado "
-"de conexión en la esquina inferior izquierda de la ventana. Cuando quiera volver a conectar "
-"elija <menuchoice><guimenu>Archivo</guimenu> <guimenuitem> Trabajar"
-"conectado</guimenuitem></menuchoice> o pinche de nuevo en el icono indicador de "
-"conexión."
-
-#: index.docbook:596
-#, no-c-format
-msgid ""
-"Read <xref linkend=\"full-advantage\"/> to learn about how to use this "
-"feature with the Ximian Connector for Microsoft Exchange."
-msgstr ""
-"Para obtener más información acerca de cómo usar esta función con Ximian "
-"Connector para Microsoft Exchange lea <xref linkend=\"full-advantage\"/>."
-
-#: index.docbook:600
-#, no-c-format
-msgid "More About Mail Composition"
-msgstr "Más sobre la redacción de mensajes"
-
-#: index.docbook:601
-#, no-c-format
-msgid ""
-"In the next few sections, you'll see how <application>Evolution</"
-"application> handles advanced email features, including large recipient "
-"lists, attachments, and forwarding."
-msgstr ""
-"Es las próximas secciones veremos cómo <application>Evolution</application>.maneja "
-"sus funciones avanzadas de gestión de correo, incluyendo largas listas de destinatarios, "
-"adjuntos y reenvíos."
-
-#: index.docbook:602
-#, no-c-format
-msgid ""
-"Use the <application>Ximian Evolution</application> import tool to import "
-"the files. There's more information about why this works, and how, at the "
-"Ximian <ulink url=\"http://support.ximian.com\">support website.</ulink>"
-msgstr ""
-"Utilice la herramienta de importación de <application>Ximian Evolution</"
-"application> para importar esos archivos. Encontrará más información acerca "
-"de su funcionamiento en el sitio Web de <ulink url=\"http://support.ximian."
-"com\">asistencia técnica</ulink> de Ximian."
-
-#: index.docbook:607
-#, no-c-format
-msgid "The Task Pad"
-msgstr "La libreta de tareas"
-
-#: index.docbook:608
-#, no-c-format
-msgid "Attachments"
-msgstr "Adjuntos"
-
-#: index.docbook:608
-#, no-c-format
-msgid ""
-"The Task Pad, located in the lower right corner of the calendar, lets you "
-"keep a list of tasks separate from your calendar appointments. You can use "
-"the list in a larger window by choosing the <guibutton>Tasks</guibutton> "
-"button in the shortcut bar or in the folder tree."
-msgstr ""
-"La libreta de tareas, en el ángulo inferior derecho del calendario, permite "
-"mantener la lista de tareas separada de las citas del calendario. Para "
-"mostrar una ventana más grande, haga clic en <guibutton>Tareas</guibutton> "
-"en la barra de atajos o en la lista de carpetas."
-
-#: index.docbook:609
-#, no-c-format
-msgid "Press <guibutton>OK</guibutton>"
-msgstr "Haga clic en <guibutton>Aceptar</guibutton>."
-
-#: index.docbook:609
-#, no-c-format
-msgid "Push the attach button in the composer toolbar"
-msgstr "Pulse el botón Adjuntar en la barra de herramientas del editor."
-
-#: index.docbook:609
-#, no-c-format
-msgid "Select the file you want to attach"
-msgstr "Elija el fichero que quiere adjuntar"
-
-#: index.docbook:609
-#, no-c-format
-msgid "To attach a file to your email:"
-msgstr "Para adjuntar un archivo a su mensaje:"
-
-#: index.docbook:615
-#, no-c-format
-msgid "Classification:"
-msgstr "Clasificación"
-
-#: index.docbook:615
-#, no-c-format
-msgid ""
-"Decide when this item is due. You can either type in a date and time, or "
-"select one from the <guibutton>Calendar</guibutton> and <guibutton>time</"
-"guibutton> drop-down menus."
-msgstr ""
-"Fija cuándo vence esta tarea. Puede escribir la fecha y la hora, o "
-"seleccionarla con los menús <guibutton>calendario</guibutton> y "
-"<guibutton>hora</guibutton>."
-
-#: index.docbook:615
-#, no-c-format
-msgid "Description:"
-msgstr "Descripción"
-
-#: index.docbook:615
-#, no-c-format
-msgid "Due Date:"
-msgstr "Fecha de vencimiento"
-
-#: index.docbook:615
-#, no-c-format
-msgid ""
-"If you wish, you can keep a more detailed description of the item here. For "
-"example, you can note that a task is in progress, and display how close it "
-"is to completion."
-msgstr ""
-"Es posible mantener una descripción más detallada de la tarea. Por ejemplo "
-"puede anotar que una tarea está en marcha y mostrar cuán cerca está de su "
-"conclusión."
-
-#: index.docbook:615
-#, no-c-format
-msgid "Sets who will see it if your calendar is shared."
-msgstr "Define quién podrá leerla si comparte su calendario."
-
-#: index.docbook:615
-#, no-c-format
-msgid "Start Date:"
-msgstr "Fecha de inicio"
-
-#: index.docbook:615
-#, no-c-format
-msgid "Summary:"
-msgstr "Resumen"
-
-#: index.docbook:615
-#, no-c-format
-msgid "The date you intend to start working."
-msgstr "La hora a la que espera empezar a trabajar."
-
-#: index.docbook:615
-#, no-c-format
-msgid "The description you enter here will appear in the To Do list itself."
-msgstr ""
-"La descripción que aquí escriba aparecerá en la lista de tareas "
-"<interface>Para hacer</interface>."
-
-#: index.docbook:615
-#, no-c-format
-msgid ""
-"To record a new task, click the <guibutton>Add</guibutton> button in the "
-"toolbar. <application>Evolution</application> will pop up a small window "
-"with five items in it:"
-msgstr ""
-"Para registrar una tarea nueva pulse en en el botón <guibutton>Añadir</"
-"guibutton> en la barra de tareas. <application>Evolution</application> "
-"abrirá una pequeña ventana con cinco elementos:"
-
-#: index.docbook:625
-#, no-c-format
-msgid ""
-"The <guilabel>Colors</guilabel> tab lets you select different color labels "
-"for individual messages. You can return to the default settings by clicking "
-"the <guibutton>Restore Defaults</guibutton> button."
-msgstr ""
-"La solapa <guilabel>Colores</guilabel> permie elegir colores diferentes para "
-"mensajes puntuales. Puede restaurar los valores iniciales de la aplicación pulsando el botón "
-"<guibutton>Valores originales</guibutton>."
-
-#: index.docbook:629
-#, no-c-format
-msgid ""
-"You can drag a file from your desktop into the composer window to attach it "
-"as well."
-msgstr ""
-"También puede arrastrar un archivo desde su escritorio a la ventana del editor "
-"para adjuntarlo."
-
-#: index.docbook:633
-#, no-c-format
-msgid ""
-"To hide the display of files you've attached to the message, select "
-"<menuchoice> <guimenu>View</guimenu> <guimenuitem>Hide Attachments</"
-"guimenuitem> </menuchoice>; to show them again, choose <guimenuitem>Show "
-"Attachments</guimenuitem>."
-msgstr ""
-"Para esconder la vista de los archivos que ha adjuntado al mensaje desactive"
-"<menuchoice> <guimenu>Ver</guimenu> <guimenuitem>Mostrar adjuntos</"
-"guimenuitem> </menuchoice>; y para verlos de nuevo marque la misma casilla "
-"<guimenuitem>Mostrar adjuntos</guimenuitem>."
-
-#: index.docbook:635
-#, no-c-format
-msgid "Message Composer Preferences"
-msgstr "Preferencias del editor de correo"
-
-# index.docbook:462, index.docbook:594
-#: index.docbook:636 index.docbook:763
-#, no-c-format
-msgid "Alerts"
-msgstr "Alertas"
-
-#: index.docbook:636
-#, no-c-format
-msgid ""
-"Choose how you will normally forward and reply messages, what character set "
-"they will use, whether they will be in HTML, and whether that HTML can "
-"contain smiley face images."
-msgstr ""
-"Elija cómo reenviará o contestará normalmente los mensajes, qué juego de "
-"caracteres usará, si desea utilizar el formato HTML y en ese caso, si desea "
-"utilizar emoticones."
-
-#: index.docbook:636
-#, no-c-format
-msgid "Default Behavior"
-msgstr "Comportamiento predeterminado"
-
-#: index.docbook:636
-#, no-c-format
-msgid "Prompt when sending messages with an empty subject"
-msgstr "Preguntar al mandar mensajes con el asunto vacío"
-
-#: index.docbook:636
-#, no-c-format
-msgid "Prompt when sending messages with only Bcc recipients defined"
-msgstr "Preguntar al mandar mensajes que sólo tengan definido Bcc"
-
-#: index.docbook:636
-#, no-c-format
-msgid ""
-"The composer will warn you if you try to send a message that has only "
-"<guilabel>Bcc</guilabel> recipients. This is important because some mail "
-"servers will fail to honor blind carbon copy if you do not have at least one "
-"recipient that is visible to all readers."
-msgstr ""
-"El editor muestra una advertencia si intenta enviar un mensaje que sólo "
-"contenga destinatarios <guilabel>Bcc</guilabel>. Esto es importante porque "
-"algunos servidores de correo sólo aceptarán copias ocultas cuando el mensaje "
-"contiene al menos un destinatario visible para todos los lectores."
-
-#: index.docbook:636
-#, no-c-format
-msgid "The composer will warn you if you try to send a message without a subject."
-msgstr "El editor muestra una advertencia si intenta enviar un mensaje sin asunto."
-
-#: index.docbook:636
-#, no-c-format
-msgid ""
-"There are three tabs of settings you can change for the message composer. "
-"The General tab covers shortcuts and assorted behavior, and the other two "
-"control signatures and spell checking. In the General tab, you can set:"
-msgstr ""
-"La configuración del editor de correo tiene tres solapas de opciones. La solapa"
-"<guilabel>General</guilabel> permite configurar atajos y acciones asociadas, "
-"mientras las dos controlan las firmas y la corrección ortográfica. En "
-"<guilabel>General</guilabel> puede configurar los siguientes elementos:"
-
-#: index.docbook:636
-#, no-c-format
-msgid "There are two optional alerts here:"
-msgstr "Hay dos alertas opcionales:"
-
-#: index.docbook:640
-#, no-c-format
-msgid ""
-"When you send the message, a copy of the attached file will go with it. Be "
-"aware that big attachments can take a long time to download."
-msgstr ""
-"Cuando mande un mensaje irá con él una copia del archivo. Tenga presente que los "
-"adjuntos de gran tamaño pueden tomar mucho tiempo al ser descargados."
-
-#: index.docbook:648
-#, no-c-format
-msgid "Specifying Recipients for Email"
-msgstr "Especificar destinatarios de correo electrónico"
-
-#: index.docbook:649
-#, no-c-format
-msgid ""
-"<application>Evolution</application>, like most email programs, recognizes "
-"three types of addressee: primary recipients, secondary recipients, and "
-"hidden (\"blind\") recipients."
-msgstr ""
-"<application> Evolution</application>, como la mayoría de los programas de correo "
-"electrónico reconoce tres tipos de destinatarios: los principales, los secundarios y los "
-"ocultos (también llamados «ciegos»)."
-
-#: index.docbook:653
-#, no-c-format
-msgid "Exporting Files From Ximian Evolution"
-msgstr "Exportar archivos desde Ximian Evolution"
-
-#: index.docbook:653
-#, no-c-format
-msgid ""
-"For mail, that's <filename>mbox</filename>, for calendar, <filename>iCal</"
-"filename>, and for the address book, vCards in a <filename>.db3</filename> "
-"database."
-msgstr ""
-"Para el correo se usa <filename>mbox</filename>, para el calendario "
-"<filename>iCal</filename>, y para la libreta de contactos vCards dentro de "
-"una base de datos <filename>.db3</filename>."
-
-#: index.docbook:653
-#, no-c-format
-msgid ""
-"Ximian Evolution uses standard file types for all its information, so you "
-"should have no trouble taking your information elsewhere if you want."
-msgstr ""
-"Ximian Evolution usa tipos de archivos estándar para toda su información por "
-"lo que no debería tener problema para llevarse su información a otro lado, "
-"si es que lo quisiera."
-
-#: index.docbook:655
-#, no-c-format
-msgid ""
-"The simplest way to direct a message is to put the email address or "
-"addresses in the <guilabel>To:</guilabel> field, which denotes primary "
-"recipients. To send mail to more than one or two people, you can use the "
-"<guilabel>Cc:</guilabel> field."
-msgstr ""
-"La manera más sencilla de dirigir un mensaje es escribir las direcciones de correo electrónico "
-"de los destinatarios en los campos <guilabel>Para</guilabel>, indicando que son los "
-"destinatarios principales. Para enviar el mensaje a más de una o dos personas puede usar "
-"el campo <guilabel>Cc:</guilabel> (con copia)."
-
-#: index.docbook:662
-#, no-c-format
-msgid ""
-"Hearkening back to the dark ages when people used typewriters and there were "
-"no copy machines, \"Cc\" stands for \"Carbon Copy.\" Use it whenever you "
-"want to share a message you've written to someone else."
-msgstr ""
-"Al principio de los tiempos, cuando los humanos usaban máquinas de escribir y no había "
-"fotocopiadoras, «Cc:» significaba «copia de carbón». Use esta función siempre que quiera "
-"compartir con otra persona un mensaje destinado a otro. Nota del traductor: en general "
-"en español no es común el uso de la expresión sajona «copia de carbón» o «copia carbón» "
-"sino más bien «copia con calco» o sencillamente «copia». Sin embargo parece que la "
-"expresión está prosperando en la jerga informática en el contexto del correo electrónico."
-
-#: index.docbook:668
-#, no-c-format
-msgid ""
-"<guilabel>Bcc:</guilabel> is a little more complex. You use it like "
-"<guilabel>Cc:</guilabel>, but people on the <guilabel>Bcc:</guilabel> list "
-"are hidden from the other recipients of the message. Use it to send mail to "
-"large groups of people, especially if they don't know each other or if "
-"privacy is a concern. If your <guilabel>Bcc:</guilabel> field is absent, "
-"click <menuchoice> <guimenu>View</guimenu> <guimenuitem>Bcc Field</"
-"guimenuitem> </menuchoice>."
-msgstr ""
-"<guilabel>Cco:</guilabel> es un poco más complicado. Se usa como "
-"<guilabel>Cc:</guilabel> pero la gente que figura en la lista <guilabel>Cco:</guilabel> "
-"estará oculta para los otros destinatarios del mensaje. Use esta función para mandar "
-"mensajes a grandes grupos de personas especialmente si ellos no se conocen entre sí "
-"o si es importante mantener la privacidad. Si el campo <guilabel>Cco:</guilabel> no está "
-"a la vista pinche en <menuchoice> <guimenu>Ver</guimenu> <guimenuitem>Campo "
-"«Cco»</guimenuitem> </menuchoice>."
-
-#: index.docbook:669
-#, no-c-format
-msgid "Once you have made those changes, click the <guibutton>OK</guibutton> button."
-msgstr ""
-"Tras introducir estas modificaciones, haga clic en <guibutton>Aceptar</"
-"guibutton>."
-
-#: index.docbook:669
-#, no-c-format
-msgid ""
-"There are more options in the <guilabel>Details</guilabel> tab such as "
-"priority and progress settings."
-msgstr ""
-"Hay más opciones en la ficha <guilabel>Detalles</guilabel> como las "
-"asignaciones de prioridad o de progreso."
-
-#: index.docbook:670
-#, no-c-format
-msgid "Importing Mail from Other Mail Clients"
-msgstr "Importar correo de otros clientes de correo"
-
-#: index.docbook:671
-#, no-c-format
-msgid ""
-"Chances are, you already have your email in another mail program and don't "
-"want to lose the information. The following section describes how to import "
-"mail from specific mail clients."
-msgstr ""
-"Probablemente ya tenga su correo en otro programa cliente y no querrá perder "
-"la información. La siguiente sección describe cómo importar correo desde "
-"clientes específicos de correo."
-
-#: index.docbook:672
-#, no-c-format
-msgid ""
-"Once you've added a task to your to-do list, its summary appears in the "
-"<guilabel>Summary</guilabel> section of task list. To view or edit a "
-"detailed description of an item, double-click on it, or right click on it "
-"and select <guibutton>Open</guibutton>. You can delete items by selecting "
-"them and clicking on the <guibutton>Delete</guibutton> button."
-msgstr ""
-"Tras agregar tarea a su lista de cosas por hacer, el resumen aparecerá en la "
-"sección <guilabel>Resumen</guilabel> de la lista de tareas. Para ver o "
-"editar una descripción completa del elemento, haga doble clic sobre él, o "
-"haga clic con el botón derecho y elija <guibutton>Abrir</guibutton>. Para "
-"borrar los elementos, selecciónelos y haga clic en <guibutton>Borrar</"
-"guibutton>."
-
-#: index.docbook:674
-#, no-c-format
-msgid ""
-"Then, quit Evolution and start it up again. Changes to the Ximian Connector "
-"accounts configuration are not active until you have restarted the "
-"application."
-msgstr ""
-"A continuación, cierre y vuelva a iniciar el programa "
-"<application>Evolution</application>. Los cambios en la configuración de "
-"cuentas de Ximian Connector no se activarán hasta después de que reinicie la aplicación."
-
-#: index.docbook:677
-#, no-c-format
-msgid "Importing Mail from mutt"
-msgstr "Importar correo desde mutt"
-
-#: index.docbook:678
-#, no-c-format
-msgid ""
-"<application>mutt</application> is a text-based mail client which is shipped "
-"with many Linux and Unix distributions. <application>mutt</application> uses "
-"the standard mbox, maildir, and MH file formats, which makes importing your "
-"mail into <application>Evolution</application> easy. By default, "
-"<application>mutt</application> uses the mbox file format."
-msgstr ""
-"<application>mutt</application> es una aplicación en modo carácter incluida "
-"en muchas distribuciones Linux y Unix. <application>mutt</application> usa "
-"los formatos de archivo estándar mbox, maildir y MH, lo que hace sencilla la "
-"importación de su correo en <application>Evolution</application>. En su "
-"configuración predeterminada <application>mutt</application> uses el formato "
-"mbox."
-
-#: index.docbook:678
-#, no-c-format
-msgid ""
-"Click <guibutton>Browse</guibutton> and select the file you would like to "
-"import from. By default, your email is stored in <filename>~/mbox</filename> "
-"for the mbox format and <filename class=\"directory\">~/Maildir</filename> "
-"for the Maildir format."
-msgstr ""
-"Haga clic en <guibutton>Buscar</guibutton> y elija el archivo que quiere "
-"importar. En general el correo se almacena en en el archivo <filename>~/"
-"mbox</filename> para el formato mbox y en <filename class=\"directory\">~/"
-"Maildir</filename> para el Maildir."
-
-# index.docbook:668, index.docbook:727
-#: index.docbook:678 index.docbook:737
-#, no-c-format
-msgid "Click <guibutton>Next</guibutton>."
-msgstr "Haga clic en <guibutton>Siguiente</guibutton>."
-
-# index.docbook:668, index.docbook:727
-#: index.docbook:678 index.docbook:737
-#, no-c-format
-msgid ""
-"Click <menuchoice> <guimenu>File</guimenu> <guimenuitem>Import</guimenuitem> "
-"</menuchoice> or press <keycombo action=\"simul\"> <keycap>Ctrl</keycap> "
-"<keycap>I</keycap> </keycombo>."
-msgstr ""
-"Abra <menuchoice> <guimenu>Archivo</guimenu> <guimenuitem>Importar</"
-"guimenuitem> </menuchoice> o o presione la combinación de teclas <keycombo "
-"action=\"simul\"> <keycap>Ctrl</keycap> <keycap>I</keycap> </keycombo>."
-
-# index.docbook:668, index.docbook:727
-#: index.docbook:678 index.docbook:737
-#, no-c-format
-msgid "Open <application>Ximian Evolution</application>"
-msgstr "Abra <application>Ximian Evolution</application>."
-
-# index.docbook:668, index.docbook:727
-#: index.docbook:678 index.docbook:737
-#, no-c-format
-msgid "Select <guibutton>Import a Single File</guibutton>"
-msgstr "Elija <guibutton>Importar un único archivo</guibutton>"
-
-# index.docbook:668, index.docbook:727
-#: index.docbook:678 index.docbook:737
-#, no-c-format
-msgid ""
-"When prompted for what folder in <application>Evolution</application> to "
-"import to, select a folder. You can also create a new folder and drop it in "
-"there."
-msgstr ""
-"<application>Evolution</application> preguntará en qué carpeta quiere "
-"importarlo: elija una. También podrá crear una carpeta nueva y volcar ahí la "
-"información."
-
-#: index.docbook:679
-#, no-c-format
-msgid ""
-"The list of tasks is sorted in a similar way to the list of email messages "
-"in <application>Ximian Evolution Mail</application>. Click once on the "
-"message headers to change the direction and type of sorting, or right-click "
-"to add or remove columns from the display."
-msgstr ""
-"La lista de tareas se ordena de manera parecida a la lista de mensajes en la "
-"vista de correo de <application>Ximian Evolution</application>. Haga clic en "
-"el título de la columna para cambiar la ordenación, o haga clic con el botón "
-"derecho para agregar o eliminar columnas."
-
-#: index.docbook:682
-#, no-c-format
-msgid ""
-"If you frequently write email to the same groups of people, you can create "
-"address lists in the Contact Manager, and then send them mail as though they "
-"had a single address. To learn how to do that, read <xref linkend=\"usage-"
-"contact-organize-group-list\"/>."
-msgstr ""
-"Si escribe con frecuencia a los mismos grupos de personas, puede crear listas de "
-"direcciones en el gestor de contactos, y escribirles como si cada grupo tuviera una única "
-"dirección de correo. Para saber cómo hacerlo consulte <xref linkend=\"usage-contact-organize-group-list\"/>."
-
-#: index.docbook:685
-#, no-c-format
-msgid "Accessing the Exchange Server"
-msgstr "Acceder al servidor <application>Exchange</application>"
-
-#: index.docbook:686
-#, no-c-format
-msgid ""
-"Like IMAP and LDAP data, information for Exchange accounts is stored on the "
-"server, not on your desktop computer. This means that you can access it from "
-"multiple locations. It also means that your Microsoft Exchange account "
-"information is in a separate folder tree from the <guilabel>Local</guilabel> "
-"tree in your folder bar. You'll see it below the local tree, with the name "
-"you gave the account. If you have multiple accounts, you will have multiple "
-"folder trees."
-msgstr ""
-"Como ocurre con la información IMAP y LDAP, la información de cuentas de "
-"<application>Exchange</application> se almacena en el servidor, y no en su "
-"equipo de sobremesa. Esto significa que podrá tener acceso a su cuenta desde "
-"múltiples ubicaciones. También significa que la información de su cuenta "
-"Microsoft <application>Exchange</application> se encuentra en un árbol de "
-"carpetas separado del árbol <guilabel>Local</guilabel>, dentro de la barra "
-"de carpetas. Lo podrá ver bajo el árbol local, con el nombre que utilizó "
-"para su cuenta. Si dispone de varias cuentas, también tendrá varios árboles "
-"de carpetas."
-
-#: index.docbook:687
-#, no-c-format
-msgid "Folders for Your Tasks"
-msgstr "Carpetas con tareas"
-
-#: index.docbook:688
-#, no-c-format
-msgid "Click <guibutton>OK</guibutton>"
-msgstr "Haga clic en <guibutton>Aceptar</guibutton>."
-
-#: index.docbook:688
-#, no-c-format
-msgid "Click <guibutton>Tasks</guibutton>."
-msgstr "Seleccione <guibutton>Tareas</guibutton>."
-
-#: index.docbook:688
-#, no-c-format
-msgid "Click <menuchoice><guimenuitem>Create New Folder</guimenuitem></menuchoice>."
-msgstr "Elija <menuchoice><guimenuitem>Crear carpeta</guimenuitem></menuchoice>."
-
-#: index.docbook:688
-#, no-c-format
-msgid "Enter the folder name."
-msgstr "Escriba el nombre de la carpeta."
-
-#: index.docbook:688
-#, no-c-format
-msgid ""
-"Like any other component in <application>Evolution</application>, you can "
-"create a folder to help organize your tasks. To do this:"
-msgstr ""
-"Como en cualquier otro componente de <application>Evolution</application>, "
-"puede crear una carpeta para ayudarle a organizar su tareas. Siga estos "
-"pasos:"
-
-#: index.docbook:688
-#, no-c-format
-msgid "Open the <guilabel>Folders Bar</guilabel>."
-msgstr "Abrir <guilabel>Barra de carpetas</guilabel>."
-
-#: index.docbook:688
-#, no-c-format
-msgid "Right click on <guibutton>Tasks</guibutton>."
-msgstr "Abra el menú asociado con el botón derecho en <guibutton>Tareas</guibutton>."
-
-#: index.docbook:690
-#, no-c-format
-msgid ""
-"<application>Evolution</application> has the ability to let you specify the "
-"Reply-To in an email. Using this, you can setup a special Reply-To for an "
-"email. To do this:"
-msgstr ""
-"<application>Evolution</application> tiene la habilidad de permitirle especificar "
-"el campo «Responder a:» de un mensaje:"
-
-#: index.docbook:690
-#, no-c-format
-msgid ""
-"Enter the address you wish to have be the Reply-To address in the new Reply-"
-"To field."
-msgstr ""
-"Escriba la dirección a la que quiere que le respondan en el nuevo campo «Responder a»"
-"Enter the address you wish to have be the Reply-To address in the new Reply-"
-"To field."
-
-#: index.docbook:690
-#, no-c-format
-msgid "Open a composer window"
-msgstr "Abra una ventana de Nautilus"
-
-#: index.docbook:690
-#, no-c-format
-msgid ""
-"Open the Reply-To field by selecting <menuchoice> <guimenu>View</guimenu> "
-"<guimenuitem>Reply To</guimenuitem> </menuchoice>"
-msgstr ""
-"Para abrir el campo «Responder a» marque la casilla <menuchoice> "
-"<guimenu>Ver</guimenu> <guimenuitem>Responder a</guimenuitem> </menuchoice>"
-
-#: index.docbook:690
-#, no-c-format
-msgid "Setting Reply-to On a Per-Mail Basis"
-msgstr "Configurar «Responder a» mensaje a mensaje"
-
-#: index.docbook:693
-#, no-c-format
-msgid ""
-"The signature editor allows you to create several different signatures in "
-"plain text or in HTML, and to specify which of them will be added to emails "
-"you create in the message composer. If you prefer to use an alternate "
-"signature or none at all, you can select it from the mail composer itself."
-msgstr ""
-"El editor de firmas permite crear varias firmas diferentes en formato de "
-"texto puro o en HTML así como especificar cuál de ellas debe agregarse "
-"a los mensajes que crea en el editor de mensajes. También puede elegir "
-"una firma alternativa, o no utilizar ninguna, desde el propio editor de correo."
-
-#: index.docbook:697
-#, no-c-format
-msgid ""
-"Click on any of the folder tree items to visit them; you may have to enter "
-"your server password. You can now create contact cards, send and receive "
-"email as you would normally. If there are items in your local calendar or "
-"addressbook that you'd like to add to your Exchange stores, you can copy and "
-"paste them over, or just drag items from one folder to another as you would "
-"with two local stores."
-msgstr ""
-"Haga clic en cualquiera de las carpetas para visitarla; tendrá probablemente "
-"que introducir la contraseña de su servidor. A partir de ahora puede crear "
-"contactos, enviar y recibir correo de la forma habitual. Si desea agregar a "
-"los almacenes de <application>Exchange</application> elementos de su "
-"calendario local, o de su propia libreta de direcciones, puede copiarlos y "
-"pegarlos, o simplemente arrastrarlos de una carpeta a otra, como si se "
-"tratara de almacenes locales."
-
-#: index.docbook:700
-#, no-c-format
-msgid ""
-"In the spell-checking tool, you can set spelling options, including the "
-"language or languages you will use. Note that you must install the gnome-"
-"spell package, available through Red Carpet, for spell-checking to be "
-"available in Evolution. Alternate dictionaries are also available through "
-"Red Carpet and are detected automatically if you have installed them."
-msgstr ""
-"La herramienta de corrección ortográfica incluye opciones de corrección, en "
-"una o varias lenguas. Observe que debe instalar el paquete gnome-spell, "
-"disponible en Red Carpet, para tener la corrección ortográfica disponible en "
-"Evolution. Red Carpet también incluye diccionarios para diferentes idiomas, "
-"que son detectados automáticamente tras su instalación."
-
-#: index.docbook:707
-#, no-c-format
-msgid ""
-"If you are using both an Exchange account and a local mail account, you "
-"should be aware that whenever you save an email address or appointment from "
-"an email message, it will be saved in your Exchange contacts list or "
-"calendar, rather than in your local account. The same is true of "
-"synchronization with Palm-OS devices: tasks, appointments, and addresses "
-"from your Palm-OS device will be synchronized with those in the Exchange "
-"folders rather than local folders."
-msgstr ""
-"Cuando utiliza a la vez una cuenta Exchange y una cuenta local, conviene "
-"tener presente que cada vez que guarda una dirección de correo o una cita a "
-"partir de un mensaje, ésta se guardará en la lista de contactos o en el "
-"calendario de Exchange, en lugar de hacerlo en su cuenta local. Lo mismo "
-"ocurre para sincronizar dispositivos Palm-OS: las tareas, citas y "
-"direcciones de Palm-OS se sincronizarán con las carpetas correspondientes en "
-"Exchange, y no en su equipo local."
-
-#: index.docbook:707
-#, no-c-format
-msgid "Saving Attached Addresses and Appointments"
-msgstr "Guardar direcciones y citas adjuntas"
-
-#: index.docbook:709
-#, no-c-format
-msgid ""
-"You can check the spelling of messages by selecting "
-"<menuchoice><guimenu>Edit</guimenu><guimenuitem>Spell Check Document</"
-"guimenuitem></menuchoice>. Alternately, check the <guibutton>Check spelling "
-"while i type</guibutton> box, and choose a color for your misspelled words."
-msgstr ""
-"Puede comprobar la ortografría de los mensajes con "
-"<menuchoice><guimenu>Editar</guimenu><guimenuitem>Comprobar la ortografía "
-"del documento</guimenuitem></menuchoice>. También puede hacerlo en la ventana "
-"principal de Evolution eligiendo <menuchoice><guimenu>Herramientas</guimenu> "
-"<guisubmenu>Configuración</guisubmenu></menuchoice>, pinche en el icono"
-"<guiicon>Preferencias del editor</guiicon> y después abra la solapa "
-"<guilabel>Ortografía</guilabel> y marque la casilla <guibutton>Verificar ortografía "
-"mientras se escribe</guibutton> y elija el color para resaltar las palabras mal escritas."
-
-#: index.docbook:722
-#, no-c-format
-msgid "The Global Address List Appears Empty At First"
-msgstr "Al principio la lista global de direcciones está vacía"
-
-#: index.docbook:722
-#, no-c-format
-msgid ""
-"To avoid unnecessary strain on the server, the GAL will appear empty until "
-"you have searched for something in it. If you want to display all the cards "
-"in the list, click in the search box and press <keycap>Enter</keycap>. This "
-"enters a blank search: since every card contains a blank in it, every card "
-"will appear."
-msgstr ""
-"Para evitar una carga inútil en el servidor, la lista global de direcciones "
-"se muestra vacía hasta que realiza una primera búsqueda. Si desea mostrar "
-"todas las tarjetas de la lista, haga clic en el campo de búsqueda y presione "
-"<keycap>Intro</keycap>. Con esto, ejecuta una búsqueda en blanco: como todas "
-"las tarjetas contienen un blanco, aparecerán todas."
-
-#: index.docbook:723
-#, no-c-format
-msgid "Choosing Recipients Quickly"
-msgstr "Eligiendo los destinatarios rápidamente"
-
-#: index.docbook:724
-#, no-c-format
-msgid ""
-"If you have created address cards in the contact manager, you can also enter "
-"nicknames or other portions of address data, and <application>Evolution</"
-"application> will offer a drop down list of possible address completions "
-"from your address book. If you enter a name or nickname that can go with "
-"more than one card, Evolution will open a dialog box to ask you which person "
-"you meant."
-msgstr ""
-"Si tiene disponibles tarjetas de visita en el gestor de contactos, también puede usar "
-"apodos y otras partes de la información allí guardada para que <application>Evolution</"
-"application> busque y muestra una lista desplegable de todas las posibles direcciones "
-"que encajan con lo escrito. Si escriba un nombe o un apodo que encaja con más de una "
-"ficha, Evolution abrirá un diálogo para que elija la persona a la que quiere escribir."
-
-#: index.docbook:729
-#, no-c-format
-msgid "Multiple Calendars"
-msgstr "Calendarios múltiples"
-
-#: index.docbook:730
-#, no-c-format
-msgid ""
-"<application>Evolution</application> permits you to have and maintain "
-"multiple calendars. This is useful if you maintain schedules for other "
-"people, if you are responsible for resource or room allocation, or if you "
-"have multiple personalities."
-msgstr ""
-"<application>Evolution</application> es capaz de administrar múltiples "
-"calendarios. Esta función es útil cuando administra calendarios de varias "
-"personas, porque es responsable de la asignación de recursos o espacios, o "
-"porque posee personalidad múltiple."
-
-#: index.docbook:736
-#, no-c-format
-msgid "Importing Mail from KMail"
-msgstr "Importar correo desde KMail"
-
-#: index.docbook:737
-#, no-c-format
-msgid ""
-"Click <guibutton>Browse</guibutton> and select the file you would like to "
-"import from. By default, KMail stores its information in the Mail directory "
-"of your home directory."
-msgstr ""
-"Haga clic en <guibutton>Buscar</guibutton> y elija el archivo que quiere "
-"importar. En su configuración predeterminada KMail almacena su información "
-"en el directorio Mail de su directorio de inicio."
-
-#: index.docbook:737
-#, no-c-format
-msgid ""
-"KMail is the mail client which is shipped with the KDE desktop environment. "
-"KMail uses the standard mbox file format, which means that importing your "
-"mail into <application>Evolution</application> is easy."
-msgstr ""
-"KMail es el cliente de correo incluido en el entorno de escritorio KDE. "
-"KMail usa el formato de archivo estándar mbox, por lo que es fácil importar "
-"su correo en <application>Evolution</application>."
-
-#: index.docbook:737
-#, no-c-format
-msgid "Keeping Multiple Calendars"
-msgstr "Uso de calendarios múltiples"
-
-#: index.docbook:737
-#, no-c-format
-msgid ""
-"Lucy, the office manager for a small company, has one calendar for her own "
-"schedule. She maintains one for the conference room, to schedule meetings. "
-"Next to that, she maintains a calendar that reflects when consultants are "
-"going to be on site, and another that keeps track of when the Cubs are "
-"playing."
-msgstr ""
-"Lucía, directora de una pequeña empresa, posee un calendario para su "
-"planificación. Otro para planificar reuniones en la sala de conferencias. "
-"Otro más para saber cuando los consultores visitan a los clientes y otro más "
-"para saber cuándo torea Paquirri."
-
-#: index.docbook:737
-#, no-c-format
-msgid "Special Connector Only Settings"
-msgstr "Opciones especiales exclusivas del Connector"
-
-#: index.docbook:738
-#, no-c-format
-msgid ""
-"There are two items in the Evolution preferences window that are available "
-"only with Ximian Connector. The first is delegation and permissions "
-"handling, and the second is the creation of \"Out of Office\" messages."
-msgstr ""
-"En la herramienta de configuración de Evolution hay dos elementos que que están disponibles "
-"solamente con Ximian Connector. El primero es para el manejo de delegación y permisos y "
-"el segundo es para la creación de mensajes de «estoy fuera»."
-
-#: index.docbook:741
-#, no-c-format
-msgid ""
-"Alternately, you can click on the <guibutton>To:</guibutton>, <guibutton>Cc:"
-"</guibutton>, or <guibutton>Bcc:</guibutton> buttons to get a list -- "
-"potentially a very long one -- of the email addresses in your contact "
-"manager. Select addresses and click on the arrows to move them into the "
-"appropriate address columns."
-msgstr ""
-"También puede pulsar en los botones <guibutton>Para</guibutton>, <guibutton>Cc:"
-"</guibutton>, o <guibutton>Cco:</guibutton> para obtener una lista, que puede llegar a "
-"ser realmente larga, de todas las direcciones de correo de su gestor de contactos. Elija "
-"las direcciones y pinche en las flechas para moverlas en las columnas de direcciones que "
-"desea."
-
-#: index.docbook:744
-#, no-c-format
-msgid "Calendar and Task List Settings"
-msgstr "Preferencias del calendario y de la lista de tareas"
-
-#: index.docbook:745
-#, no-c-format
-msgid ""
-"The calendar configuration tool has two tabs <guilabel>General</guilabel> "
-"and <guilabel>Display</guilabel>, and is illustrated in <xref linkend="
-"\"config-prefs-cal-fig\"/>. <figure id=\"config-prefs-cal-fig\"> "
-"<title>Calendar Preferences Dialog</title> <screenshot> <screeninfo>Calendar "
-"Configuration</screeninfo> <mediaobject><imageobject><imagedata fileref="
-"\"figures/config-cal\" format=\"PNG\" srccredit=\"Aaron Weber\"/> </"
-"imageobject></mediaobject> </screenshot> </figure>"
-msgstr ""
-"La herramienta de configuración del calendario incluye dos solapas"
-"<guilabel>General</guilabel> y <guilabel>Vista</guilabel> y está ilustrada "
-"en <xref linkend=\"config-prefs-cal-fig\"/>. <figure id=\"config-prefs-cal-"
-"fig\"> <title>Diálogo de preferencias del calendario</title> <screenshot> "
-"<screeninfo>Configuración del calendario</screeninfo> "
-"<mediaobject><imageobject><imagedata fileref=\"figures/config-cal\" format="
-"\"PNG\" srccredit=\"Aaron Weber\"/> </imageobject></mediaobject> </"
-"screenshot> </figure>"
-
-#: index.docbook:746
-#, no-c-format
-msgid "Access Delegation"
-msgstr "Delegación de acceso"
-
-#: index.docbook:747
-#, no-c-format
-msgid ""
-"You can allow other people in your organization's Global Address List to "
-"access your calendar, address book, and messages, and they can let you "
-"manage theirs. Delegation allows people to do anything from check on each "
-"other's schedules to completely manage their personal information."
-msgstr ""
-"Puede permitir a otras personas anotadas en la lista gobal de direcciones de su organización "
-"acceso a su calendario, libreta de direcciones y mensajes. Y ellos pueden darle a usted "
-"acceso a los suyos. La delegación permite a los usuarios hacer cualquier cosa, desde "
-"consultarse mutuamente sus planes hasta gestionar completamente toda su información "
-"personal."
-
-#: index.docbook:748
-#, no-c-format
-msgid ""
-"To create a new calendar, select <menuchoice> <guimenu>File</guimenu> "
-"<guisubmenu>New</guisubmenu> <guimenuitem>Folder</guimenuitem> </"
-"menuchoice>. You'll need to tell the <guilabel>New Folder</guilabel> dialog "
-"that the new folder should be of the calendar type. You can place the "
-"calendar in any calendar folder and access it from the folder view."
-msgstr ""
-"Para crear un calendario elija: <menuchoice> <guimenu>Archivo</guimenu> "
-"<guisubmenu>Nuevo</guisubmenu> <guimenuitem>Carpeta</guimenuitem> </"
-"menuchoice>. En el cuadro de diálogo <guilabel>Crear una carpeta nueva</"
-"guilabel> deberá decir que la nueva carpeta es de tipo calendario. Puede "
-"colocar el calendario en cualquier carpeta calendario y consultarla desde la "
-"vista de carpetas."
-
-#: index.docbook:750
-#, no-c-format
-msgid ""
-"For more information about using email together with the contact manager and "
-"the calendar, see <xref linkend=\"contact-automation-basic\"/> and <xref "
-"linkend=\"usage-calendar-apts\"/>."
-msgstr ""
-"Para saber más acerca de cómo usar correo electrónico con el gestor de contactos "
-"y con el calendario consulte <xref linkend=\"contact-automation-basic\"/> y "
-"<xref linkend=\"usage-calendar-apts\"/>."
-
-#: index.docbook:757
-#, no-c-format
-msgid "Delegating Access to Others"
-msgstr "Delegando acceso a terceros"
-
-#: index.docbook:757
-#, no-c-format
-msgid "Each calendar folder can hold only one calendar."
-msgstr "Cada carpeta de calendario sólo puede guardar un único calendario."
-
-#: index.docbook:758
-#, no-c-format
-msgid ""
-"To add someone to your list of delegates, click the <guibutton>Add</"
-"guibutton> button and select them from the Global Address List. When "
-"delegating you can grant different levels of access to different types of "
-"data. You may also decide whether the access you grant applies to items "
-"marked <guilabel>Private</guilabel>, or only to public items."
-msgstr ""
-"Para añadir a alguien en su lista de delegados pulse el botón <guibutton>Añadir</"
-"guibutton> y elíjalo en la lista global de acceso. Al delegar, puede conceder diferentes "
-"niveles de acceso a diferentes tipos de datos. También puede decidir si el acceso concedido "
-"se aplica a los elementos marcados como <guilabel>Privados</guilabel> "
-"o solamente a los marcados como públicos."
-
-#: index.docbook:760
-#, no-c-format
-msgid "Replying to Email Messages"
-msgstr "Responder un mensaje"
-
-#: index.docbook:761
-#, no-c-format
-msgid ""
-"To reply to a message, press the <guibutton>Reply</guibutton> button while "
-"it is selected, or choose <guimenuitem>Reply to Sender</guimenuitem> from "
-"the message's right-click menu. That will open the <interface>message "
-"composer</interface>. The <guilabel>To:</guilabel> and <guilabel>Subject:</"
-"guilabel> fields will already be filled, although you can alter them if you "
-"wish. In addition, the full text of the old message is inserted into the new "
-"message, either in grey with a blue line to one side (for HTML display) or "
-"with the &gt; character before each line (in plain text mode), to indicate "
-"that it's part of the previous message. People often intersperse their "
-"message with the quoted material as shown in <xref linkend=\"usage-mail-"
-"getnsend-reply-fig\"/>. <figure id=\"usage-mail-getnsend-reply-fig\"> "
-"<title>Reply Message Window</title> <screenshot> <screeninfo>Evolution Main "
-"Window</screeninfo> <mediaobject><imageobject><imagedata fileref=\"figures/"
-"replymsg\" format=\"PNG\" srccredit=\"Aaron Weber\"/> </imageobject></"
-"mediaobject> </screenshot> </figure>"
-msgstr ""
-"Para contestar a un mensaje, selecciónelo y pulse el botón "
-"<guibutton>Responder</guibutton> o pínchelo con el botón derecho del ratón y elija "
-"<guimenuitem>Responder al remitente</guimenuitem> y se abrirá la <interface>ventana "
-"del editor de correo</interface>. Los campos <guilabel>Para</guilabel> y "
-" <guilabel>Asunto</guilabel> ya estarán escritos, aunque los puede modificar a placer. "
-"Además, se insertará el texto completo del mensaje original, bien en gris con una línea "
-"azul a un lado (en el modo HTML) o con un signo &gt; delante de cada línea (cuando use"
-"sólo puro texto) para indicar que ese es un mensaje anterior. Mucha gente intercala "
-"su texto entre el material citado, como se muesta en <xref linkend=\"usage-mail-"
-"getnsend-reply-fig\"/>. <figure id=\"usage-mail-getnsend-reply-fig\"> "
-"<title>Contestando un mensaje</title> <screenshot> <screeninfo>Ventana principal de "
-"Evolution</screeninfo> <mediaobject><imageobject><imagedata fileref=\"figures/"
-"replymsg\" format=\"PNG\" srccredit=\"Aaron Weber\"/> </imageobject></"
-"mediaobject> </screenshot> </figure>"
-
-#: index.docbook:763
-#, no-c-format
-msgid "Day Begins"
-msgstr "El día comienza a las"
-
-#: index.docbook:763
-#, no-c-format
-msgid "Day Ends"
-msgstr "El día acaba a las"
-
-#: index.docbook:763
-#, no-c-format
-msgid ""
-"If you'd like to be warned before you delete any appointment, or to have a "
-"reminder automatically appear for each event, select the check boxes here."
-msgstr ""
-"Active las casillas si desea mostrar una advertencia antes de eliminar una "
-"cita, o recibir recordatorios automáticos para cada evento."
-
-#: index.docbook:763
-#, no-c-format
-msgid ""
-"Set the beginning of a normal workday. If you work odd hours, or want to "
-"make sure that your early-morning appointments are displayed, you may find "
-"this option useful."
-msgstr ""
-"Indica la hora de inicio de jornada laboral normal. Puede que encuentre útil esta opción si "
-"tiene horarios de trabajo raros o quiere asegurarse de que aparezcan sus citas más "
-"madrugadoras."
-
-#: index.docbook:763
-#, no-c-format
-msgid ""
-"Set the end of a normal workday. If you work odd hours, or want to make sure "
-"that your evening appointments are displayed, you may find this option "
-"useful."
-msgstr ""
-"Indica la hora la que acaba una jornada laboral normal. Puede que encuentre útil esta "
-"opción si tiene horarios de trabajo raros o quiere asegurarse de que aparezcan sus citas "
-"vespertinas."
-
-#: index.docbook:763
-#, no-c-format
-msgid "The <guilabel>General</guilabel> tab lets you set the following:"
-msgstr ""
-"La ficha <guilabel>General</guilabel> permite establecer los valores "
-"siguientes:"
-
-#: index.docbook:763
-#, no-c-format
-msgid "The city you're located in, to judge your time zone."
-msgstr "La ciudad en la que se encuentra, para calcular su zona horaria."
-
-#: index.docbook:763
-#, no-c-format
-msgid "Time format"
-msgstr "Formato de la hora"
-
-#: index.docbook:763
-#, no-c-format
-msgid "Time zone"
-msgstr "Zona horaria"
-
-#: index.docbook:763
-#, no-c-format
-msgid "Week Starts"
-msgstr "La semana empieza en"
-
-#: index.docbook:763
-#, no-c-format
-msgid ""
-"When does your work day start, and when does it end? In the day and week "
-"views, <application>Evolution</application> displays all the hours in the "
-"range you select here, even if there are no appointments for those times. Of "
-"course, you can still schedule an appointment outside of these hours, and if "
-"you do, the display will be extended to show it."
-msgstr ""
-"¿Cuándo empieza su jornada laboral y cuándo acaba? Las vistas semanales y "
-"diarias del cliente <application>Evolution</application> muestran todas las "
-"horas en el rango elegido, incluso si no hay citas programadas. Por "
-"supuesto, siempre es posible planificar citas fuera de las horas "
-"presentadas, en cuyo caso la vista se amplía para poder mostrarlas."
-
-#: index.docbook:763
-#, no-c-format
-msgid "You can set weeks to start on Sunday or on Monday."
-msgstr "Especifique si la semana empieza en domingo o lunes."
-
-#: index.docbook:763
-#, no-c-format
-msgid ""
-"You may choose between twelve-hour (AM/PM) and twenty-four hour time formats "
-"here by clicking the appropriate radio button."
-msgstr ""
-"Haga clic en el botón radio para elegir el formato de doce horas (AM/PM) o "
-"de veinticuatro horas."
-
-#: index.docbook:769
-#, no-c-format
-msgid "Exchange Account Delegation"
-msgstr "Delegación de cuenta Exchange"
-
-#: index.docbook:770
-#, no-c-format
-msgid "Exchange Account Delegation Settings"
-msgstr "Opciones de delegación de cuenta Exchange"
-
-#: index.docbook:771
-#, no-c-format
-msgid ""
-"If you use Ximian Connector to store your mail on an Exchange server, "
-"filters are not applied until you open your INBOX folder and select "
-"<menuchoice><guimenu>Actions</guimenu><guimenuitem>Apply Filters</"
-"guimenuitem></menuchoice> or press <keycombo><keycap>Ctrl</keycap><keycap>Y</"
-"keycap></keycombo>"
-msgstr ""
-"Si utiliza la herramienta Ximian Connector para almacenar su correo en un "
-"servidor Exchange, los filtros se aplican sólo cuando abre el buzón de "
-"entrada y selecciona <menuchoice><guimenu>Acciones</"
-"guimenu><guimenuitem>Aplicar filtros</guimenuitem></menuchoice>, o presiona "
-"la combinación de teclas <keycombo><keycap>Ctrl</keycap><keycap>Y</keycap></"
-"keycombo>"
-
-#: index.docbook:771
-#, no-c-format
-msgid "When Are Filters Applied?"
-msgstr "¿Cuándo se aplican los filtros?"
-
-#: index.docbook:779
-#, no-c-format
-msgid ""
-"Allow the person to see items in this type of folder, but not create new "
-"items or edit existing items."
-msgstr ""
-"Permite a la persona ver elementos en este tipo de carpeta pero no crearlos nuevos "
-"o modificar los existentes."
-
-#: index.docbook:779
-#, no-c-format
-msgid "Author (read, create)"
-msgstr "Autor (leer, crear)"
-
-#: index.docbook:779
-#, no-c-format
-msgid "Do not allow this person to access any folders of this type."
-msgstr "No permitir a esta persona acceder a ninguna carpeta de este tipo."
-
-#: index.docbook:779
-#, no-c-format
-msgid "Editor (read, create, edit)"
-msgstr "Editor (leer, crear, editar)"
-
-#: index.docbook:779
-#, no-c-format
-msgid ""
-"For each of the four types of folder, you may select one of the following "
-"levels of access:"
-msgstr ""
-"Puede elegir uno de los siguientes niveles de acceso para cada uno de los cuatro "
-"tipos de carpeta:"
-
-#: index.docbook:779
-#, no-c-format
-msgid "None"
-msgstr "Ninguno"
-
-#: index.docbook:779
-#, no-c-format
-msgid "Reviewer (read-only)"
-msgstr "Revisor (sólo lectura)"
-
-#: index.docbook:779
-#, no-c-format
-msgid ""
-"The delegate may view items in your folders, and may create new items, but "
-"may not change any existing items."
-msgstr ""
-"El delegado puede ver elementos en sus carpetas y puede crear otros nuevos pero no "
-"puede modificar ninguno de los existentes."
-
-#: index.docbook:779
-#, no-c-format
-msgid "The delegate may view, create, and change items in your folders."
-msgstr "El delegado puede ver, crear y cambiar elementos en sus carpetas."
-
-#: index.docbook:783
-#, no-c-format
-msgid ""
-"Back in Evolution, create a new filter: Select <menuchoice><guimenu>Tools</"
-"guimenu><guimenuitem>Filters</guimenuitem></menuchoice>, then click "
-"<guibutton>Add</guibutton>."
-msgstr ""
-"Vuelva a Evolution. Cree un nuevo filtro. Seleccione <menuchoice> "
-"<guimenu>Herramientas</guimenu><guimenuitem>Filtros</guimenuitem> "
-"</menuchoice>. y <guibutton>Añadir</guibutton>."
-
-#: index.docbook:783
-#, no-c-format
-msgid "Choose <guilabel>contains</guilabel> at the second drop-down box."
-msgstr ""
-"Seleccione la opción <guilabel>contiene</guilabel> en la segunda lista "
-"desplegable."
-
-#: index.docbook:783
-#, no-c-format
-msgid "Click <guibutton>Add</guibutton>."
-msgstr "Elija la carpeta de correo que quiera ver en la columna de la izquierda."
-
-#: index.docbook:783
-#, no-c-format
-msgid "Click OK. You're done."
-msgstr "Haga clic en Aceptar. Ha terminado."
-
-#: index.docbook:783
-#, no-c-format
-msgid ""
-"Enter \"/home/username/spam-filter.sh\" as the shell command, then select "
-"\"Does Not Return\" and \"0\" as the remaining two items. Substitute your "
-"username for \"username\" so that Evolution can find the script."
-msgstr ""
-"Escriba la orden shell <userentry>/home/username/spam-filter.sh</userentry> y elija "
-"<guilabel>no devuelve</guilabel> y <guilabel>0</guilabel>. En lugar de «username» "
-"escriba su identificador de usuario en su sistema, para que Evolution pueda encontrar el "
-"programa. "
-
-#: index.docbook:783
-#, no-c-format
-msgid "Enter <userinput>X-Spam-Flag</userinput> as the name of the header."
-msgstr "Escriba <userinput>X-Spam-Flag</userinput> como nombre de la cabecera."
-
-#: index.docbook:783
-#, no-c-format
-msgid ""
-"Enter <userinput>YES</userinput> as the content to search for. You're now "
-"working with all email that has the word \"YES\" in the \"X-Spam-Status\" "
-"header."
-msgstr ""
-"Para especificar el contenido a buscar escriba <userinput>YES</userinput>. Ahora está "
-"trabajando con todos los mensajes que contienen la palabra «YES» dentro de "
-"la cabecera «X-Spam-Status»."
-
-#: index.docbook:783
-#, no-c-format
-msgid ""
-"For actions, choose what you'd like to do with the messages. You can delete "
-"the messages automatically, but it's more prudent to place them in a "
-"\"Possible Junk Mail\" folder, and check them over just to make sure a "
-"genuine message didn't get flagged by accident."
-msgstr ""
-"Elija qué acciones quiere realizar con los mensajes. Puede borrarlos automáticamente "
-"pero es más prudente guardarlos en una carpeta de «posible correo basura» y darle "
-"un vistazo para estar seguro de que un mensaje auténtico no ha sido marcado por "
-"accidente."
-
-#: index.docbook:783
-#, no-c-format
-msgid ""
-"If you don't have SpamAssassin or other junk mail filtering on your mail "
-"server, there's still hope, although it's not quite as simple. First, "
-"download and install SpamAssassin from <ulink url=\"http://spamassassin.org"
-"\">http://spamassassin.org</ulink> You'll need to download the \"spamassassin"
-"\" and \"perl-Mail-SpamAssassin\" packages, and you can install them with "
-"Red Carpet by selecting <guimenuitem>Install Local Packages</guimenuitem> "
-"from the <guimenu>File</guimenu> menu. Further instructions are at the "
-"SpamAssassin web site. Once you have the software installed, do the "
-"following:"
-msgstr ""
-"Si en su servidor no tiene SpamAssassin u otra herramienta de filtrado de correo basura, "
-"todavía hay esperanza, aunque no es del todo sencillo. Primero descargue e installe "
-"SpamAssassin desde <ulink url=\"http://spamassassin.org\">http://spamassassin.org</ulink>. "
-"Necesitará descargar los paquetes «spamassassin» y «perl-Mail-SpamAssassin» y puede "
-"instalarlos con Red Carpet eligiendo <guimenuitem>Install Local Packages</guimenuitem> "
-"desde el menú <guimenu>File</guimenu>. Encontrará más instrucciones en el web de "
-"SpamAssassin. Una vez que haya instalado el software haga lo siguiente:"
-
-#: index.docbook:783
-#, no-c-format
-msgid ""
-"If your system administrator or ISP has SpamAssassin, here's how to siphon "
-"off the junk mail:"
-msgstr ""
-"Si su administrador de sistemas o su ISP tiene instalado SpamAssasin, así es como puede "
-"desviar el correo basura:"
-
-#: index.docbook:783
-#, no-c-format
-msgid ""
-"Mark the file as an executable program: Open your home directory in "
-"Nautilus, right-click on spam-filter.sh there, and select "
-"<guimenuitem>Properties</guimenuitem>. Then, click the \"Permissions\" tab "
-"and check the box in the <guilabel>Execute</guilabel> column and the "
-"<guilabel>Owner</guilabel> row. Alternately, open a terminal (<menuchoice> "
-"<guimenu> Programs </guimenu> <guisubmenu> Accessories </guisubmenu> "
-"<guimenuitem> Terminal </guimenuitem> </menuchoice>) and enter the command: "
-"chmod +x spam-filter.sh."
-msgstr ""
-"Marque el archivo como programa ejecutable. Abra su directorio de inicio en "
-"<application>Nautilus</application>, marque el archivo spam-filter.sh con el botón derecho "
-"del ratón y elija <guimenuitem>Propiedades</guimenuitem>. Entonces pinche en "
-"<guilabel>Permisos</guilabel> y marque la casilla en la columna <guilabel>Ejecución</guilabel> "
-"con la fila <guilabel>Propietario</guilabel>. También puede hacer abriendo una terminal "
-"(<menuchoice><guimenu>Programas</guimenu> "
-"<guisubmenu>Accesorios</guisubmenu><guimenuitem>Terminal</guimenuitem> "
-"</menuchoice>) y escribir la orden <command>chmod +x spam-filter.sh</command>."
-
-#: index.docbook:783
-#, no-c-format
-msgid ""
-"Open a new create a text file with any text editor ( <menuchoice> <guimenu> "
-"Programs </guimenu> <guisubmenu> Accessories </guisubmenu> <guimenuitem> "
-"Text Editor </guimenuitem> </menuchoice> is the most convenient) and paste "
-"in the following: <screen>\n"
-" spamassassin -e\n"
-" </screen> This will run the SpamAssassin command and report "
-"back 0 if the message is not junk."
-msgstr ""
-"Cree un nuevo archivo de texto en cualquier editor (el más conveniente es <menuchoice> <guimenu> "
-"Programas </guimenu> <guisubmenu> Accessorios </guisubmenu> <guimenuitem> "
-"Editor de texto</guimenuitem> </menuchoice>) y escriba la siguiente orden: "
-"<command>spamassassin -e</command>, que lanzará la orden SpamAssassin y devolverá "
-"un código 0 si el mensaje no es basura."
-
-#: index.docbook:783
-#, no-c-format
-msgid "Save the file as \"spam-filter.sh\""
-msgstr "Guardar el archivo como <filename>spam-filter.sh</filename>."
-
-#: index.docbook:783
-#, no-c-format
-msgid ""
-"Select \"Pipe Message to Shell Command\" as the first portion of the "
-"criterion."
-msgstr "Como primera parte del criterio elija <guilabel>Redirigir mensaje a Orden de Shell</guilabel>."
-
-#: index.docbook:783
-#, no-c-format
-msgid ""
-"Select <menuchoice><guimenu>Tools</guimenu><guimenuitem>Filters</"
-"guimenuitem></menuchoice>."
-msgstr ""
-"Seleccione <menuchoice><guimenu>Herramientas</guimenu><guimenuitem>Filtros</"
-"guimenuitem></menuchoice>."
-
-#: index.docbook:783
-#, no-c-format
-msgid ""
-"Set the first part of your search criterion to look in a <guilabel>Specific "
-"header</guilabel>."
-msgstr ""
-"Defina la primera parte del criterio para buscar una <guilabel>Cabecera "
-"específica</guilabel>."
-
-#: index.docbook:783
-#, no-c-format
-msgid ""
-"Spam, also known as unsolicited commercial email (UCE), is the bane of many "
-"people's Inboxes, but it doesn't have to be. Using Ximian Evolution filters "
-"and an external Spam detection tool like SpamAssassin (<ulink url=\"http://"
-"spamassassin.org/\">http://spamassassin.org/</ulink>), you can catch the "
-"vast majority of junk mail and drop it directly into the trash."
-msgstr ""
-"El «spam», también conocido como el correo basura o correo comercial no solicitado, es la "
-"ruina de los buzones de correo de mucha gente, pero no tiene porqué ser así. Usando "
-"los filtros de Ximian Evolution y una herramienta externa de detección de spam» como "
-"<application>SpamAssassin</application> (<ulink url=\"http://"
-"spamassassin.org/\">http://spamassassin.org/</ulink>) puede interceptar la mayor "
-"parte del correo basura y enviarlo directamente a la papelera."
-
-#: index.docbook:783
-#, no-c-format
-msgid ""
-"The easiest way to do this is to get your system administrator to install "
-"SpamAssassin (or its equivalent) on your mail server. There, it will flag "
-"messages it suspects of being Spam with the \"X-Spam-Status\" header to your "
-"mail, which you can then search for in a filter. Because SpamAssassin scores "
-"mails based on the likelihood that messages are junk, you can even choose "
-"how strict you want it to be. If you don't have a friendly network "
-"administrator, never fear: you can install SpamAssassin on your own system, "
-"then pipe messages through it before reading them."
-msgstr ""
-"La forma más sencilla de hacerlo es consiguiendo que su administrador de sistemas "
-"instale SpamAssassin (o un equivalente) en su servidor de correo. Allí se encargará "
-"de marcar en su correo los mensajes susceptibles de ser considerados como «spam»"
-"con la cabecera «X-Spam-Status», de manera que a su vez pueda localizarlos con un "
-"filtro. Aprovechando que SpamAssassin puntúa la probabilidad de que un mensaje sea "
-"basura, puede incluso definir lo estricto que quiera ser. Si su administrador de red no es "
-"demasiado amistoso, no se preocupe, puede instalar SpamAssassin en su propio sistema y "
-"redirigirle automáticamente los mensajes antes de llegar a leerlos."
-
-#: index.docbook:783
-#, no-c-format
-msgid "Using a Filter to Avoid Spam"
-msgstr "Utilización de un filtro para evitar el correo basura"
-
-#: index.docbook:783
-#, no-c-format
-msgid ""
-"You're done. Click \"OK\" to close the filter and \"OK\" to close the filter "
-"editor."
-msgstr ""
-"Ya ha acabado. Pinche en <guibutton>Aceptar</guibutton> para cerrar el filtro "
-"y en <guibutton>Aceptar</guibutton> para cerrar el editor de filtros."
-
-#: index.docbook:788
-#, no-c-format
-msgid ""
-"If you're reading a message with several recipients, you may wish to use "
-"<guibutton>Reply to All</guibutton> instead of <guibutton>Reply</guibutton>. "
-"If there are large numbers of people in the <guilabel>Cc:</guilabel> or "
-"<guilabel>To:</guilabel> fields, this can save substantial amounts of time."
-msgstr ""
-"Si está leyendo un mensaje que tiene varios destinatarios puede que desee "
-"<guibutton>Responder a todos</guibutton> en lugar de <guibutton> Responder</guibutton>. "
-"Y es que puede ahorrar mucho tiempo si tiene a muchas personas en los campos "
-"<guilabel>Cc:</guilabel><guilabel>Para:</guilabel>."
-
-#: index.docbook:788
-#, no-c-format
-msgid ""
-"Susan sends an email to a client and sends copies to Tim and to an internal "
-"company mailing list of co-workers. If Tim wants to make a comment for all "
-"of them to read, he uses <guibutton>Reply to All</guibutton>, but if he just "
-"wants to tell Susan that he agrees with her, he uses <guibutton>Reply</"
-"guibutton>. Note that his reply will not reach anyone that Susan put on her "
-"<guilabel>Bcc</guilabel> list, since that list is not shared with anyone."
-msgstr ""
-"Susan envía un mensaje a un cliente y pone copia a Tim y a una lista de correo interna "
-"de la compañía para sus compañeros de trabajo. Si Tim quiere mandar un comentario "
-"para que lo lean todos sus compañeros, él pinchará en <guibutton>Responder a "
-"todos</guibutton> pero si lo que quiere es solamente decirle a Susan que está de "
-"acuerdo con ella, usará <guibutton> Responder</guibutton>. Observe que esta respuesta "
-"no la recibirá nadie a quien Susan haya incluido en la lista de <guilabel> Cco:</guilabel> "
-"de su mensaje original porque tal lista no ha sido compartida con nadie."
-
-#: index.docbook:788
-#, no-c-format
-msgid "Using the Reply to All feature"
-msgstr "Uso de la característica de Responder a todos"
-
-#: index.docbook:794
-#, no-c-format
-msgid "What's What in Ximian Evolution"
-msgstr "Qué es qué en Ximian Evolution"
-
-#: index.docbook:795
-#, no-c-format
-msgid ""
-"Now that you've gotten the first-run configuration out of the way, you're "
-"ready to get down to work. Here's a quick explanation of what's going on in "
-"your main <application>Ximian Evolution</application> window."
-msgstr ""
-"Ahora que ya tiene su configuración, tras la ejecución del asistente del "
-"inicio, ya está listo para empezar a trabajar. Proporcionamos a continuación "
-"una explicación rápida de qué es lo que está ocurriendo en su ventana "
-"principal de <application>Ximian Evolution</application>."
-
-#: index.docbook:803
-#, no-c-format
-msgid "The Ximian Evolution Main Window"
-msgstr "La ventana principal de Ximian Evolution"
-
-#: index.docbook:804
-#, no-c-format
-msgid "Inbox"
-msgstr "Entrada"
-
-#: index.docbook:810
-#, no-c-format
-msgid ""
-"If you're subscribed to a mailing list, and want your reply to go just to "
-"the list, rather than to the sender, choose <guibutton>Reply to List</"
-"guibutton> instead of <guibutton>Reply</guibutton> or <guibutton>Reply to "
-"All</guibutton>."
-msgstr ""
-"Si está suscrito a una lista de correo y quiere que su respuesta sólo vaya a la misma "
-"en lugar de al remitente pinche en <guibutton> Responder la lista</guibutton> en lugar de"
-"<guibutton> Responder</guibutton> o de<guibutton>Responder a todos</guibutton>."
-
-#: index.docbook:810
-#, no-c-format
-msgid ""
-"Mailing Lists are one of the most popular tools for group collaboration on "
-"the Internet. Here's how they work: <simplelist> <member> Someone sends a "
-"message to a single address, like <email>evolution@ximian.com</email>. </"
-"member> <member> That address belongs to a program that distributes the "
-"message to a list of recipients. </member> </simplelist> The mail management "
-"program lets individuals subscribe to or unsubscribe from the list at will, "
-"without requiring the message writers to remember the addresses of every "
-"recipient."
-msgstr ""
-"Las listas de correo son una de las herramientas de trabajo en grupo más populares "
-"de Internet. Así es como funcionan: <simplelist><member>alguien envía un mensaje "
-"a una única dirección de correo, como <email>evolution@ximian.com</email></member> "
-"<member>ea dirección pertenece a un programa que distribuye el mensaje a una lista de "
-"destinatarios</member></simplelist>. El programa de gestión de correo permite "
-"gestionar las altas y bajas de la lista individualmente, sin que el remitente tenga que "
-"recordar todas las direcciones de las personas apuntadas."
-
-#: index.docbook:810
-#, no-c-format
-msgid ""
-"Mailing list servers can also let network administrators control mail flow, "
-"list membership, and even moderate the content of mailing lists."
-msgstr ""
-"Los servidores de listas de correo suelen permitir al administrador de la red controlar "
-"la entrada y salida del correo, la lista de miembros e incluso moderar el contenido de las "
-"listas."
-
-#: index.docbook:810
-#, no-c-format
-msgid "What is a Mailing List?"
-msgstr "¿Qué es una lista de correo?"
-
-#: index.docbook:814
-#, no-c-format
-msgid "Menu Bar"
-msgstr "Barra del menú"
-
-#: index.docbook:821
-#, no-c-format
-msgid ""
-"The <guilabel>menu bar</guilabel> gives you access to nearly all the "
-"features that can be found in <application>Ximian Evolution</application>."
-msgstr ""
-"La <guilabel>barra del menú</guilabel> da acceso a casi todas las "
-"características que pueden encontrarse en <application>Ximian Evolution</"
-"application>."
-
-#: index.docbook:827
-#, no-c-format
-msgid "Acting as a Delegate for Others"
-msgstr "Actuar como un delegado para otros"
-
-#: index.docbook:827
-#, no-c-format
-msgid "Toolbar"
-msgstr "Barra de herramientas"
-
-#: index.docbook:828
-#, no-c-format
-msgid ""
-"To see the list of people who have granted you access to their folders, "
-"click the <guilabel>Acting as a Delegate</guilabel> tab in the Exchange "
-"Delegation settings window. If you plan to send email on behalf of someone, "
-"click the checkbox next to their name, and an email identity will be "
-"created. You can then select that identity in the <guilabel>From</guilabel> "
-"list in your message composer."
-msgstr ""
-"Para ver la lista de las personas que le han dado acceso a sus carpetas pinche en la solapa "
-"<guilabel>Acting as a Delegate</guilabel> en la ventana de opciones de delegación de "
-"Exchane.Si tiene pensado enviar correo en nombre de alguien, marque la casilla próxima "
-"a su nombre y se creará una identidad de correo electrónico. Ahora podrá elegir esa "
-"identidad en la lista <guilabel>De:</guilabel> del editor de mensajes."
-
-#: index.docbook:832
-#, no-c-format
-msgid ""
-"The <guilabel>Toolbar</guilabel> gives you fast and easy access to the most "
-"used features in each component."
-msgstr ""
-"La <guilabel>barra de herramientas</guilabel> da acceso fácil y rápido a las "
-"características más usadas de cada componente."
-
-#: index.docbook:837
-#, no-c-format
-msgid "Shortcut Bar"
-msgstr "Barra de atajos"
-
-#: index.docbook:838
-#, no-c-format
-msgid "Click OK."
-msgstr "Pinche en <guibutton>Aceptar</guibutton>."
-
-#: index.docbook:838
-#, no-c-format
-msgid ""
-"Enter the email address of the user who has delegated to you or click the "
-"<guibutton>User</guibutton> button to select them from your addressbook."
-msgstr ""
-"Escriba la dirección de correo electrónico del usuario que le haya delegado o pinche en el "
-"botón <guibutton>Usuario</guibutton> para eligirlo de su libreta de direcciones."
-
-#: index.docbook:838
-#, no-c-format
-msgid ""
-"Select <menuchoice> <guimenu>File</guimenu> <guimenuitem>Open Other User's "
-"Folder</guimenuitem> </menuchoice>"
-msgstr ""
-"Seleccione <menuchoice><guimenu>Archivo</guimenu> "
-"<guimenuitem>Open Other User's Folder</guimenuitem></menuchoice>"
-
-#: index.docbook:838
-#, no-c-format
-msgid "Select the folder you wish to open."
-msgstr "Seleccione las carpetas que quiere abrir."
-
-#: index.docbook:838
-#, no-c-format
-msgid "To access the folders delegated to you, do the following:"
-msgstr "Siga los siguientes pasos para acceder a las carpetas que le han sido delegadas:"
-
-#: index.docbook:841
-#, no-c-format
-msgid ""
-"The <interface>Display</interface> section lets you choose how your "
-"appointments and tasks will appear in your calendar."
-msgstr ""
-"La sección <interface>Vista</interface> sirve para elegir la presentación de "
-"sus citas y tareas dentro del calendario."
-
-#: index.docbook:842
-#, no-c-format
-msgid ""
-"The <guilabel>Shortcut Bar</guilabel> lets you go to your favorite "
-"components with the click of a click of a button."
-msgstr ""
-"La <guilabel>barra de atajos</guilabel> permite llegar a los componentes "
-"principales con un clic."
-
-#: index.docbook:845
-#, no-c-format
-msgid "Choose the color for overdue tasks."
-msgstr "Establece el color de las tareas cuyo plazo de finalización ha acabado."
-
-#: index.docbook:845
-#, no-c-format
-msgid "Compress weekends in month view"
-msgstr "Comprimir fines de semana en la vista mensual"
-
-#: index.docbook:845
-#, no-c-format
-msgid "Configures what color to set your tasks that are due today to."
-msgstr "Establece el color de las tareas que deben concluirse en el día de hoy."
-
-#: index.docbook:845
-#, no-c-format
-msgid ""
-"If checked, your weekends will be shown in one box, instead of one for each "
-"day in the month view."
-msgstr ""
-"Con esta opción, la vista mensual agrupa todo el fin de semana en una misma "
-"celda, en lugar de una celda para cada día."
-
-#: index.docbook:845
-#, no-c-format
-msgid ""
-"If there is space, <application>Evolution</application> will show the end "
-"times in the week and month views for each appointment."
-msgstr ""
-"Si hay espacio suficiente, el cliente <application>Evolution</application> "
-"mostrará las horas finales en las vistas semanales y mensajes para cada cita."
-
-#: index.docbook:845
-#, no-c-format
-msgid "Overdue tasks"
-msgstr "Tareas vencidas"
-
-#: index.docbook:845
-#, no-c-format
-msgid ""
-"Sets the increments shown on the daily view in the calendar. You can set "
-"this to be anywhere from five minutes to an hour, in five minute increments."
-msgstr ""
-"Especifique lo incrementos mostrados en la vista diaria del calendario. "
-"Puede indicar valores entre cinco minutos y una hora, con incrementos de "
-"cinco minutos."
-
-#: index.docbook:845
-#, no-c-format
-msgid "Show appointment end times in week and month views"
-msgstr "Mostrar la hora del final de las citas en las vistas semanales y mensuales"
-
-#: index.docbook:845
-#, no-c-format
-msgid "Show week numbers in date navigator"
-msgstr "Mostrar los números de las semanas en el navegador de fechas"
-
-#: index.docbook:845
-#, no-c-format
-msgid "Tasks due today"
-msgstr "Tareas que vencen hoy"
-
-#: index.docbook:845
-#, no-c-format
-msgid "The display properties you can set are:"
-msgstr "Las propiedades de la vista que puede establecer son:"
-
-#: index.docbook:845
-#, no-c-format
-msgid "This will show the week numbers next to the respective weeks in the calendar."
-msgstr "Mostrará el número de semana en el calendario."
-
-#: index.docbook:845
-#, no-c-format
-msgid "Time divisions"
-msgstr "Divisiones de horas"
-
-#: index.docbook:846
-#, no-c-format
-msgid "Searching and Replacing with the Composer"
-msgstr "Buscar y sustituir en el editor de mensajes"
-
-#: index.docbook:847
-#, no-c-format
-msgid "Status Bar"
-msgstr "Barra de estado"
-
-#: index.docbook:847
-#, no-c-format
-msgid ""
-"You are probably familiar with search and replace features in any sort of "
-"text-editing software, and if you come from a Linux or Unix background, you "
-"may know what <guimenuitem>Find Regex</guimenuitem> does. If you aren't "
-"among the lucky who already know, here's a quick rundown of the automated "
-"text searching features that the message composer makes available to you."
-msgstr ""
-"Probablemente ya está familiarizado con las funciones de búsqueda y sustitución en "
-"cualquier clase de software de edición de textos. Y si tiene experiencia en Linux o Unix "
-"puede que también sepa qué es lo que hace <guimenuitem>Buscar expresión "
-"regular</guimenuitem>. Si no está entre los afortunados que ya lo conocen, aquí tiene "
-"un rápido resumen de las funciones de búsqueda automática de texto que el editor "
-"de mensajes pone a su disposición."
-
-#: index.docbook:852
-#, no-c-format
-msgid ""
-"Periodically, <application>Ximian Evolution</application> will need to "
-"quietly display a message, or tell you the progress of a task. This most "
-"often happens when you're checking or sending email. These progress queues "
-"are shown here, in the <guilabel>Status Bar</guilabel>."
-msgstr ""
-"Periódicamente <application>Ximian Evolution</application> muestra "
-"discretamente un mensaje o informa del progreso de alguna tarea. Esto ocurre "
-"sobre todo a la hora de descargar o enviar el correo. Esta información se "
-"muestra en la <guilabel>barra de estado</guilabel>."
-
-#: index.docbook:856
-#, no-c-format
-msgid ""
-"Enter a word or phrase, and <application>Evolution</application> will find "
-"it in your message."
-msgstr ""
-"Escriba una palabra o frase y <application>Evolution</application> la encontrará en el "
-"mensaje."
-
-#: index.docbook:856
-#, no-c-format
-msgid "Find"
-msgstr "Buscar"
-
-#: index.docbook:856
-#, no-c-format
-msgid "Find Again"
-msgstr "Buscar siguiente"
-
-#: index.docbook:856
-#, no-c-format
-msgid "Find Regex"
-msgstr "Buscar expresión regular"
-
-#: index.docbook:856
-#, no-c-format
-msgid ""
-"Find a regex, also called a <glossterm linkend=\"regular-expression"
-"\">regular expression</glossterm>, in your composer window."
-msgstr ""
-"Buscar una «regex», también llamada una "
-"<glossterm linkend=\"regular-expression\">expresión regular</glossterm>, en la ventana "
-"de editor."
-
-#: index.docbook:856
-#, no-c-format
-msgid "Find a word or phrase, and replace it with something else."
-msgstr "Buscar una palabra o una frase y sustituirla por otra cosa."
-
-#: index.docbook:856
-#, no-c-format
-msgid "Replace"
-msgstr "Sustituir"
-
-#: index.docbook:856
-#, no-c-format
-msgid "Select this item to repeat the last search you performed."
-msgstr "Seleccionar este elemento para repetir la última búsqueda que haya realizado."
-
-#: index.docbook:859
-#, no-c-format
-msgid "Search Tool"
-msgstr "Herramienta de búsqueda"
-
-#: index.docbook:864
-#, no-c-format
-msgid ""
-"The <guilabel>Search Tool</guilabel> lets you search through your email with "
-"precision so you can easily find what you're looking for."
-msgstr ""
-"La <guilabel>herramienta de búsqueda</guilabel> permite hacer búsquedas en "
-"el correo con precisión y sencillez."
-
-#: index.docbook:872
-#, no-c-format
-msgid ""
-"Folders delegated to you appear in your folder list inside a folder labeled "
-"with the name of their owner. For example, if Martha Thompson delegates "
-"folders to you, you will see a folder called <guilabel>Martha Thompson's "
-"Folders</guilabel> in the folder tree at the same level as your "
-"<guilabel>Personal Folders</guilabel> and <guilabel>Public Folders</"
-"guilabel>."
-msgstr ""
-"Las carpetas que le han sido delegadas aparecerán en su lista de carpetas dentro "
-"de otra titulada con el nombre del propietario. Por ejemplo, si Martha Thompson le ha "
-"delegado algunas carpetas, verá una una carpeta llaamda <guilabel>Martha Thompson's "
-"Folders</guilabel> en el árbol de carpetas, al mismo nivel que sus <guilabel>Carpetas "
-" ocales</guilabel> y <guilabel>Carpetas públicas</guilabel>."
-
-#: index.docbook:872
-#, no-c-format
-msgid "The Shortcut Bar"
-msgstr "La barra de atajos"
-
-#: index.docbook:873
-#, no-c-format
-msgid ""
-"<application>Ximian Evolution</application>'s most important job is to give "
-"you access to your information and help you use it quickly. One way it does "
-"that is through the <interface>shortcut bar</interface>, the column on the "
-"left hand side of the main window. The large buttons with names like "
-"<guilabel>Inbox</guilabel> and <guilabel>Contacts</guilabel> are the "
-"shortcuts, and you can select different groups of shortcuts by clicking the "
-"rectangular group buttons."
-msgstr ""
-"La labor más importante de <application>Ximian Evolution</application> es "
-"facilitar el acceso y simplificar la consulta de su información. Una manera "
-"de conseguirlo es mediante la <interface>barra de atajos</interface>, la "
-"columna a la izquierda de la ventana principal. Los grandes botones con "
-"nombre como <guilabel>Buzón de entrada</guilabel> y <guilabel>Contactos</"
-"guilabel> son atajos y puede elegir varios grupos de atajos pulsando sobre "
-"los botones rectangulares de grupos."
-
-#: index.docbook:882
-#, no-c-format
-msgid "Error Messages"
-msgstr "Mensajes de error"
-
-#: index.docbook:882
-#, no-c-format
-msgid ""
-"If the folder fails to open properly, check with the folder owner that you "
-"have been granted the correct access permissions."
-msgstr ""
-"Si la carpeta no se abre adecuadamente, compruebe con el dueño de la carpeta "
-"que le ha concedido los permisos de acceso correctos."
-
-#: index.docbook:884
-#, no-c-format
-msgid "<guibutton>Calendar</guibutton>:"
-msgstr "<guibutton>Calendario</guibutton>:"
-
-#: index.docbook:884
-#, no-c-format
-msgid "<guibutton>Contacts</guibutton>:"
-msgstr "<guibutton>Contactos</guibutton>:"
-
-#: index.docbook:884
-#, no-c-format
-msgid "<guibutton>Inbox</guibutton>:"
-msgstr "<guibutton>Buzón de entrada</guibutton>:"
-
-#: index.docbook:884
-#, no-c-format
-msgid "<guibutton>Summary</guibutton>:"
-msgstr "<guibutton>Resumen</guibutton>:"
-
-#: index.docbook:884
-#, no-c-format
-msgid "<guibutton>Tasks</guibutton>:"
-msgstr "<guibutton>Tareas</guibutton>:"
-
-#: index.docbook:884
-#, no-c-format
-msgid "A full-size view of your calendar's task pad."
-msgstr "Una vista completa de la libreta de tareas de su calendario."
-
-#: index.docbook:884
-#, no-c-format
-msgid ""
-"Click the <guibutton>Inbox</guibutton> button to start reading your mail. "
-"Your Inbox is also where you can access Ximian Evolution's tools to filter, "
-"sort, organize, and search your mail."
-msgstr ""
-"Haga clic en <guibutton>buzón entrada</guibutton> para comenzar la lectura "
-"de su correo. Su buzón es también el lugar donde las herramientas de Ximian "
-"Evolution filtran, ordenan, organizan y buscan su correo."
-
-#: index.docbook:884
-#, no-c-format
-msgid ""
-"Start your day here. The Ximian Evolution <guilabel>Summary</guilabel> gives "
-"you a quick summary of new or important messages, daily appointments and "
-"urgent tasks. You can customize its appearance and content, and use it to "
-"access Ximian Evolution services."
-msgstr ""
-"Empiece aquí su jornada. El <guilabel>Resumen</guilabel> de Ximian Evolution "
-"ofrece un rápido resumen de los mensajes nuevos o importantes, las citas "
-"diarias y las urgentes. Puede adaptar su apariencia y contenido y usarlo "
-"para acceder a los servicios de Ximian Evolution."
-
-#: index.docbook:884
-#, no-c-format
-msgid ""
-"Take a look at the <guilabel>Shortcut Bar</guilabel>. The shortcut buttons "
-"in that category are:"
-msgstr ""
-"Échele un vistazo a la <guilabel>barra de atajos</guilabel>. Los botones de "
-"atajos en esa categoría son:"
-
-#: index.docbook:884
-#, no-c-format
-msgid ""
-"The Addressbook holds contacts, with address, phone, and other personal "
-"information. Like calendar information, contact data can be synchronized "
-"with hand-held devices and shared over a network."
-msgstr ""
-"La libreta de contactos contiene información de contactos con sus "
-"direcciones, teléfono y otros datos personales. Como la información del "
-"calendario, los datos de contactos pueden sincronizarse con agendas "
-"electrónicas y ser compartidos en red."
-
-#: index.docbook:884
-#, no-c-format
-msgid ""
-"The Calendar can store your appointments and task lists for you. Connected "
-"to a network, you can use it to keep a group of people on schedule and up to "
-"date."
-msgstr ""
-"El Calendario puede almacenar sus listas de citas y tareas. Conectado a la "
-"red puede usarse para mantener al día la planificación de un grupo de "
-"personas."
-
-#: index.docbook:895
-#, no-c-format
-msgid ""
-"For all of these menu items, you can choose whether or not to "
-"<guilabel>Search Backwards</guilabel> in the document from the point where "
-"your cursor is. For all but the regular expression search (which doesn't "
-"need it), you are offered a check box to determine whether the search is to "
-"be <guilabel>Case Sensitive</guilabel> when it determines a match."
-msgstr ""
-"Para todos estas opciones puede elegir si quiere o no <guilabel>Hacia atrás</guilabel>, "
-"desde el punto el que se encuentra el cursor. Para todas, excepto para las búsquedas con "
-"expresiones regulares -que no las necesitan-, tiene disponible una casilla para decidir si "
-"quiere que la búsqueda <guilabel>distinga mayus./minus.</guilabel>."
-
-#: index.docbook:895
-#, no-c-format
-msgid "Setting an Out of Office Message"
-msgstr "Configuración un mensaje de Estoy fuera"
-
-#: index.docbook:896
-#, no-c-format
-msgid ""
-"An <guilabel>Out of Office</guilabel> message is an automatic reply that you "
-"can send to emails, explaining why you aren't going to respond to their "
-"message. For example, if you go on vacation for a week and will be away from "
-"email, you can set an automatic reply so that people who write to you know "
-"that you aren't ignoring them."
-msgstr ""
-"Un mensaje <guilabel>Estoy fuera</guilabel> es una respuesta automática "
-"que puede enviar para los mensajes que reciba explicando porqué no va a responder. "
-"Por ejemplo, si se va una semana de vacaciones sin acceso a su correo electrónico, "
-"puede fijar una respuesta automática para que la gente que le escriba sepa que realmente "
-"no los está ignorando."
-
-#: index.docbook:904
-#, no-c-format
-msgid ""
-"To create an <guilabel>Out of Office</guilabel> message, select <menuchoice> "
-"<guimenu>Tools</guimenu> <guimenuitem>Settings</guimenuitem> </menuchoice> "
-"and then click the <guibutton>Out of Office</guibutton> button."
-msgstr ""
-"Para crear un mensaje de <guilabel>Estoy fuera</guilabel> elija <menuchoice> "
-"<guimenu>Herramientas</guimenu> "
-"<guimenuitem>Configuración</guimenuitem> </menuchoice> y haga clic en el botón"
-"<guibutton>Estoy fuer</guibutton>."
-
-#: index.docbook:907
-#, no-c-format
-msgid "Enhance your email with HTML"
-msgstr "Mejore su correo electrónico con HTML"
-
-#: index.docbook:908
-#, no-c-format
-msgid ""
-"Normally, you can't set text styles or insert pictures in emails, which is "
-"why email is often regarded as uncommunicative and cold, and why people "
-"often resort to using far too many exclamation points to convey their "
-"feelings. However, most newer email programs can display images and text "
-"styles as well as basic alignment and paragraph formatting. They do this "
-"with <glossterm linkend=\"html\">HTML</glossterm>, just like web pages do."
-msgstr ""
-"Normalmente no se pueden aplicar estilos o insertar ilustraciones en mensajes de correo "
-"electrónico, por lo que con frecuencia se le considera poco comunicativo y frío y por lo que "
-"a veces la gente abuse del uso de signos de exclamación para expresar sus sentimientos. "
-"Sin embargo la mayoría de los clientes de correo moderno son capaces de mostrar "
-"imágenes y estilos en el texto, como alineado básico y formateo de los párrafos. Esto es "
-"posible por usar <glossterm linkend=\"html\">HTML</glossterm> de la misma manera "
-"que lo hacen las páginas web."
-
-#: index.docbook:910
-#, no-c-format
-msgid "Directory Server Settings"
-msgstr "Opciones de los servidores de directorio"
-
-#: index.docbook:911
-#, no-c-format
-msgid ""
-"Addressbook settings are limited to the usage and configuration of directory "
-"servers (LDAP and Exchange). To learn how to set autocompletion options, see "
-"<xref linkend=\"config-prefs-folders\"/>. Other addressbook controls are "
-"available in the addressbook window itself."
-msgstr ""
-"La libreta de direcciones sólo permite establecer la utilización y "
-"configuración de servidores de directorio (LDAP y Exchange). Para saber cómo "
-"configurar las opciones de la función de autocompletado lea "
-"<xref linkend=\"config-prefs-folders\"/>. Los demás controles de la libreta de "
-"direcciones se muestran en la propia ventana de la libreta."
-
-#: index.docbook:912
-#, no-c-format
-msgid ""
-"Then, click <guilabel>I am currently out of the office.</guilabel>. Then, "
-"enter a short message in the text entry box. Click <guilabel>OK</guilabel>."
-msgstr ""
-"Entonces pinche en <guilabel>Estoy fuera</guilabel>. Entonces "
-"escriba un corto y descriptivo mensaje en la casilla habilitada. Pulse <guilabel> Aceptar</guilabel>."
-
-#: index.docbook:917
-#, no-c-format
-msgid ""
-"Your message will be sent automatically to anyone who sends you mail until "
-"you return and click <guilabel>I am currently in the office</guilabel>."
-msgstr ""
-"Cada vez que alguien le escriba un mensaje recibirá automáticamente el aviso que ha escrito "
-"hasta que vuelva y pinche en <guilabel>Estoy de vuelta en la oficina</guilabel>."
-
-#: index.docbook:918
-#, no-c-format
-msgid "HTML Mail is not a Default Setting"
-msgstr "El correo HTML no es una opción predeterminada"
-
-#: index.docbook:918
-#, no-c-format
-msgid ""
-"Some people do not have HTML-capable mail clients, or prefer not to receive "
-"HTML-enhanced mail because it is slower to download and display. Because "
-"some people may prefer not to get HTML mail, <application>Evolution</"
-"application> sends plain text unless you explicitly ask for HTML."
-msgstr ""
-"Algunas personas no tienen clientes de correo capaces de leer HTML o prefieren no "
-"recibir mensajes enriquecidos con HTML porque son más lentos de descargar y de mostrar "
-"en pantalla. Por eso <application> Evolution</application> envía mensajes de texto puro "
-"a menos que explícitamente le pida que los componga con HTML."
-
-#: index.docbook:920
-#, no-c-format
-msgid ""
-"To add a new <glossterm linkend=\"ldap\">LDAP</glossterm> server to your "
-"available contact folders:"
-msgstr ""
-"Para agregar un nuevo servidor <glossterm linkend=\"ldap\">LDAP</glossterm> "
-"a la lista de sus carpetas de contactos disponibles:"
-
-#: index.docbook:924
-#, no-c-format
-msgid "<guilabel>One</guilabel>"
-msgstr "<guilabel>Uno</guilabel>"
-
-#: index.docbook:924
-#, no-c-format
-msgid "<guilabel>Sub</guilabel>"
-msgstr "<guilabel>Sub</guilabel>"
-
-#: index.docbook:924
-#, no-c-format
-msgid "Address of the server where the addressbook is located."
-msgstr "Dirección del servidor donde se aloja la libreta de direcciones."
-
-#: index.docbook:924
-#, no-c-format
-msgid ""
-"Click <guibutton>OK</guibutton> to permanently make changes or "
-"<guibutton>Apply</guibutton> to temporarily set the changes."
-msgstr ""
-"Haga clic en <guibutton>Aceptar</guibutton> para aplicar permanentemente los "
-"cambios o en <guibutton>Aplicar</guibutton> para usarlos temporalmente."
-
-#: index.docbook:924
-#, no-c-format
-msgid ""
-"Click the <guibutton>Add</guibutton> button on the right side to open a "
-"Directory Server addition assistant."
-msgstr ""
-"Para abrir el asistente e incluir un servidor de directorio, haga clic en "
-"<guibutton>Agregar</guibutton> a la derecha."
-
-#: index.docbook:924
-#, no-c-format
-msgid "Display name"
-msgstr "Mostrar nombre"
-
-#: index.docbook:924
-#, no-c-format
-msgid "Download Limit"
-msgstr "Límite de descarga"
-
-#: index.docbook:924
-#, no-c-format
-msgid "Enter the server information as requested by the assistant:"
-msgstr "Escriba los datos del servidor solicitados por el asistente:"
-
-#: index.docbook:924
-#, no-c-format
-msgid "Login Method"
-msgstr "Método de inicio de sesión"
-
-#: index.docbook:924
-#, no-c-format
-msgid "Port"
-msgstr "Puerto"
-
-#: index.docbook:924
-#, no-c-format
-msgid ""
-"SSL and TLS are security mechanisms. If you select <guilabel>Always</"
-"guilabel>, Evolution will not connect unless secure connections are "
-"available. The default value is <guilabel>Whenever Possible</guilabel>, "
-"which uses secure connections if they are available, but does not cause "
-"failure if they are not."
-msgstr ""
-"Los protocolos SSL y TLS son mecanismos de seguridad. Si elige "
-"<guilabel>Siempre</guilabel>, el cliente Evolution sólo se conectará cuando "
-"estén disponibles conexiones seguras. El valor predeterminado es "
-"<guilabel>Cuando sea posible</guilabel>, que utiliza conexiones seguras "
-"cuando están disponibles, pero también funciona sin problemas en caso "
-"contrario."
-
-#: index.docbook:924
-#, no-c-format
-msgid "Search base"
-msgstr "Base de búsqueda"
-
-#: index.docbook:924
-#, no-c-format
-msgid "Search scope"
-msgstr "Rango de búsqueda"
-
-#: index.docbook:924
-#, no-c-format
-msgid "Searches the Search Base and all entries below it."
-msgstr "Busca dentro de la raíz y en todos los subdirectorios."
-
-#: index.docbook:924
-#, no-c-format
-msgid "Searches the Search Base and one entry below it."
-msgstr "Busca dentro de la raíz y un nivel de subdirectorios."
-
-#: index.docbook:924
-#, no-c-format
-msgid ""
-"Select <menuchoice> <guimenu>Tools</guimenu> <guimenuitem>Settings</"
-"guimenuitem> </menuchoice> and click the <guibutton>Directory Servers</"
-"guibutton> shortcut button."
-msgstr ""
-"Elija <menuchoice> <guimenu>Herramientas</guimenu> "
-"<guimenuitem>Configuración</guimenuitem> </menuchoice> y pinche en el botón "
-"<guilabel>Servidores de directorio</guilabel>."
-
-#: index.docbook:924
-#, no-c-format
-msgid "Server name"
-msgstr "Nombre del servidor"
-
-#: index.docbook:924
-#, no-c-format
-msgid ""
-"Set the maximum number of results for a given search. Most servers refuse to "
-"send more than 500, but you can set the number lower if you want to shorten "
-"downloads for very broad searches."
-msgstr ""
-"El número máximo de resultados para una búsqueda dada. Muchos servidores no "
-"aceptan enviar más de 500 respuestas, pero puede fijar un número inferior "
-"para reducir el volumen de descargas, en caso de búsquedas muy amplias."
-
-#: index.docbook:924
-#, no-c-format
-msgid ""
-"Specify whether your login is anonymous, using an email address, or a "
-"\"distinguished name.\" If the login is not anonymous, enter the login name "
-"required by the server."
-msgstr ""
-"Especifique el método de inicio de sesión: anónimo, con la dirección de "
-"correo electrónico o un \"nombre distinguido\". Si no utiliza un inicio de "
-"sesión anónimo, escriba el nombre de usuario solicitado por el servidor."
-
-#: index.docbook:924
-#, no-c-format
-msgid ""
-"The <glossterm linkend=\"search-base\">search base</glossterm> is the "
-"starting point for a directory search. Contact your network administrator "
-"for information about the correct settings."
-msgstr ""
-"La <glossterm linkend=\"search-base\">base de búsqueda</glossterm> es el punto de "
-"partida utilizado para las búsquedas en directorios. Consulte a su administrador para "
-"obtener información acerca de las configuraciones adecuadas."
-
-#: index.docbook:924
-#, no-c-format
-msgid ""
-"The <glossterm linkend=\"search-scope\">search scope</glossterm> is the "
-"breadth of a given search. The following options are available:"
-msgstr ""
-"La <glossterm linkend=\"search-scope\">base de búsqueda</glossterm> es la extensión "
-"de una búsqueda dada. Las siguientes opciones están disponibles:"
-
-#: index.docbook:924
-#, no-c-format
-msgid ""
-"The internet port <application>Evolution</application> connects to in order "
-"to access the LDAP database. This is normally 389."
-msgstr ""
-"El puerto Internet utilizado por el cliente <application>Evolution</"
-"application> para conectarse a la base de datos LDAP. Normalmente se trata "
-"del puerto 389."
-
-#: index.docbook:924
-#, no-c-format
-msgid ""
-"This is the maximum time Evolution will attempt to download data from the "
-"server before giving up."
-msgstr ""
-"Es el tiempo de espera máximo para descargar los datos del servidor, antes "
-"de que el cliente Evolution abandone el intento."
-
-#: index.docbook:924
-#, no-c-format
-msgid ""
-"This is the name you will use to label this folder, and may be any name you "
-"choose."
-msgstr "Este es el nombre que titulará a esta carpeta, y puede ser el nombre que prefiera."
-
-#: index.docbook:924
-#, no-c-format
-msgid "Timeout Limit"
-msgstr "Tiempo de expiración"
-
-#: index.docbook:924
-#, no-c-format
-msgid "Use SSL/TLS"
-msgstr "Usar SSL/TLS"
-
-#: index.docbook:929
-#, no-c-format
-msgid "Scheduling Appointments with Free/Busy"
-msgstr "Planificando citas según disponibilidad"
-
-#: index.docbook:930
-#, no-c-format
-msgid ""
-"When you schedule a meeting with your calendar on the Exchange server, you "
-"can check when other local Exchange users are busy according to their "
-"Exchange calendars. To do so:"
-msgstr ""
-"Cuando programe una reunión usando su calendario en el servidor "
-"<application>Exchange</application>, podrá comprobar la disponibilidad de "
-"otros usuarios en el mismo servidor en función de sus respectivos calendarios "
-"<application>Exchange</application>. Proceda como sigue:"
-
-#: index.docbook:930
-#, no-c-format
-msgid ""
-"You can change the format of an email message between plain text and HTML by "
-"choosing <menuchoice> <guimenu>Format</guimenu> <guimenuitem> HTML</"
-"guimenuitem></menuchoice>."
-msgstr ""
-"Puede cambiar el formato de un mensaje de correo de texto puro a HTML a través de "
-"<menuchoice><guimenu>Formato</guimenu> <guimenuitem>HTML</guimenuitem> "
-" </menuchoice>."
-
-#: index.docbook:935
-#, no-c-format
-msgid ""
-"To send all your mail as HTML by default, set your mail format preferences "
-"in the mail configuration dialog. See <xref linkend=\"config-prefs-mail-"
-"composer\"/> for more information."
-msgstr ""
-"Para que todos los mensajes que envíe estén compuestos con HTML predeterminadamente, "
-"asigne sus preferencias de formato del correo en el diálogo de configuración del correo. Para "
-"más información consulte <xref linkend=\"config-prefs-mail-composer\"/>."
-
-#: index.docbook:937
-#, no-c-format
-msgid "Scheduling With Free/Busy Information"
-msgstr "Planificación a partir de información de disponibilidad"
-
-#: index.docbook:938
-#, no-c-format
-msgid "Using the Free/Busy Feature"
-msgstr "Uso de la característica de disponibilidad"
-
-#: index.docbook:941
-#, no-c-format
-msgid ""
-"HTML formatting tools are located in the toolbar just above the space where "
-"you'll actually compose the message, and they also appear in the "
-"<guimenu>Insert</guimenu> and <guimenu>Format</guimenu> menus."
-msgstr ""
-"Las herramientas de formateo HTML se encuentran en la barra de herramientas justo encima "
-"del espacio en el que realmente compone su mensaje y también aparecen en los menús "
-"<guimenu>Insertar</guimenu> y <guimenu>Formato</guimenu>."
-
-#: index.docbook:946
-#, no-c-format
-msgid "Reminders In Exchange"
-msgstr "Recordatorios en Exchange"
-
-#: index.docbook:946
-#, no-c-format
-msgid ""
-"Reminders for appointments in your Exchange calendar will not work until you "
-"have run Evolution at least once after logging in. This is different from "
-"locally stored reminders, which will work from the moment you log in, "
-"regardless of whether you have run Evolution in the session."
-msgstr ""
-"Los recordatorios de citas, en el calendario de Exchange, no funcionarán "
-"hasta que ejecute Evolution una vez al menos después de iniciar la sesión. "
-"Este comportamiento difiere del de los recordatorios administrados en local, "
-"que funcionan desde el mismo momento de iniciar la sesión, sin tener en "
-"cuenta si ejecutó el cliente Evolution durante dicha sesión."
-
-#: index.docbook:947
-#, no-c-format
-msgid "Alignment"
-msgstr "Alineación"
-
-#: index.docbook:947
-#, no-c-format
-msgid ""
-"At the far right is the color section tool. The colored box displays the "
-"current text color; to choose a new one, click the arrow button just to the "
-"right. If you have text selected, the color will apply to the selected text. "
-"If you do not have text selected, the color will apply to whatever you type "
-"next. You can select a background color or image by right-clicking on the "
-"message background and selecting <guilabel>Page</guilabel>."
-msgstr ""
-"En el extremo de la derecha está la herramiente de elección del colo. La caja coloreada "
-"muestra el color actual del texto. Para elegir uno nuevo pinche sobre el botón de la flecha "
-"que está a su derecha. Si tiene un trozo de texto seleccionado el color se aplicará al mismo. "
-"Si no, el color se aplicará a lo que escriba después. Para el fondo puede elegir un color o "
-"una imagen pinchando con el botón derecho sobre el fondo del texto y eligiendo "
-"<menuchoice> <guimenuitem>Estilo</guimenuitem>"
-"<guimenuitem>Estilo de página</guimenuitem></menuchoice>."
-
-#: index.docbook:947
-#, no-c-format
-msgid ""
-"At the left edge of the toolbar, you can choose <guilabel>Normal</guilabel> "
-"for a default text style or <guilabel>Header 1</guilabel> through "
-"<guilabel>Header 6</guilabel> for varying sizes of header from large (1) to "
-"tiny (6). Other styles include <guilabel>preformat</guilabel>, to use the "
-"HTML tag for preformatted blocks of text, and three types of bullet points "
-"for the highly organized."
-msgstr ""
-"A la izquierda de la barra de herramientas, puede elegir el estilo de texto predeterminado"
-"<guilabel>Normal</guilabel> o los diferentes tamaños de cabecera disponibles desde "
-"<guilabel>Cabecera 1</guilabel> (el más grande) hasta <guilabel>Cabecera 6</guilabel> "
-"(el más pequeño). Otros estilos disponibles para los más organizados son "
-"<guilabel>Preformato</guilabel>, la lista de puntos o los tres tipos de listas numeradas."
-
-#: index.docbook:947
-#, no-c-format
-msgid "Color Selection"
-msgstr "Elección de color"
-
-#: index.docbook:947
-#, no-c-format
-msgid "Headers and lists"
-msgstr "Cabeceras y listas"
-
-#: index.docbook:947
-#, no-c-format
-msgid "Indentation rules"
-msgstr "Reglas de sangrado"
-
-#: index.docbook:947
-#, no-c-format
-msgid ""
-"Instead of using asterisks to mark a bulleted list, try the Bulleted List "
-"style from the style dropdown list. <application>Evolution</application> "
-"uses more attractive bullets and handles word wrap and multiple levels of "
-"indentation."
-msgstr ""
-"En lugar de usar asteriscos para marcar una lista de puntos, pruebe el estilo Lista de puntos "
-"desde el menú desplegable de estilos. <application>Evolution</application> usa adornos "
-"más atractivos y maneja varios niveles de sangría y el reformateo de los párrafos. "
-
-#: index.docbook:947
-#, no-c-format
-msgid ""
-"Located next to the text style buttons, these three paragraph icons should "
-"be familiar to users of most word processing software. The leftmost button "
-"will make your text aligned to the left, the center button, centered, and "
-"the right hand button, aligned on the right side."
-msgstr ""
-"Situado próximo a los botones de estilo del texto, estos tres iconos de párrafo deberían "
-"ser familiares para los usuarios de procesadores de textos. El que está más a la izquierda "
-"alinea el texto a la izquierda, el del centro, lo centra y el de la derecha lo alinea hacia el "
-"lado derecho."
-
-#: index.docbook:947
-#, no-c-format
-msgid "Push <guibutton>B</guibutton> for bold text"
-msgstr "Pinche en <guiicon>A en negrita</guiicon> para poner el texto en negrita"
-
-#: index.docbook:947
-#, no-c-format
-msgid "Push <guibutton>I</guibutton> for italics"
-msgstr "Pinche en <guiicon>A en itálica</guiicon> para poner el texto en itálicas"
-
-#: index.docbook:947
-#, no-c-format
-msgid "Push <guibutton>S</guibutton> for a strikethrough."
-msgstr "Pinche en <guiicon>A tachada</guiicon> para poner el texto tachado."
-
-#: index.docbook:947
-#, no-c-format
-msgid "Push <guibutton>U</guibutton> to underline"
-msgstr "Pinche en <guiicon>A subrayada</guiicon> para poner el texto subrayado"
-
-#: index.docbook:947
-#, no-c-format
-msgid "Text style"
-msgstr "Estilo del texto"
-
-#: index.docbook:947
-#, no-c-format
-msgid ""
-"The button with the arrow pointing left will reduce a paragraph's "
-"indentation, and the right arrow will increase its indentation."
-msgstr ""
-"El botón con la flecha que apunta a la izquierda reducirá la sangría de un párrafo "
-"y el de la derecha la incrementará."
-
-#: index.docbook:947
-#, no-c-format
-msgid ""
-"The icons in the toolbar are explained in <glossterm linkend=\"tooltip"
-"\">tool-tips</glossterm>, which appear when you hold your mouse over the "
-"buttons. The buttons fall into four categories:"
-msgstr ""
-"Los iconos de la barra de herramientas se explican en <glossterm linkend=\"tooltip"
-"\">consejos</glossterm> que aparecen cuando mantiene el ratón sobre los botones. "
-"Estos se clasifican en cuatro categorías:"
-
-#: index.docbook:947
-#, no-c-format
-msgid ""
-"Use these buttons to determine the way your letters look. If you have text "
-"selected, the style will apply to the selected text. If you do not have text "
-"selected, the style will apply to whatever you type next. The buttons are:"
-msgstr ""
-"Use estos botones para fijar la apariencia de sus cartas. Si tiene seleccionado un texto, el "
-"estilo se aplicará sobre él. Si no, el estilo se aplicará a lo próximo que escriba. Los botones "
-"son:"
-
-#: index.docbook:947
-#, no-c-format
-msgid "Using Bullets to Make Your Email More Attractive"
-msgstr "Cómo hacer más atractivo su correo electrónico"
-
-#: index.docbook:950
-#, no-c-format
-msgid "Folders and The Folder Bar"
-msgstr "Carpetas y la barra de carpetas"
-
-#: index.docbook:951
-#, no-c-format
-msgid ""
-"The <interface>folder bar</interface> is a more comprehensive way to view "
-"the information you've stored with <application>Ximian Evolution</"
-"application>. It displays all your appointments, address cards, and email in "
-"a tree that's a lot like a <glossterm linkend=\"filetree\">file tree</"
-"glossterm>-- it starts small at the top, and branches downward. On most "
-"computers, there will be three or four folders at the base. First, of "
-"course, is the <guilabel>Summary</guilabel>, a customizable summary of your "
-"information. Below that are your <guilabel>Local Folders</guilabel>, which "
-"hold all the <application>Ximian Evolution</application> data that's stored "
-"on your computer. After that are your network servers: <glossterm linkend="
-"\"ldap\">LDAP</glossterm> servers that host shared contact directories, and "
-"<glossterm linkend=\"imap\">IMAP</glossterm> mail folders to which you "
-"subscribe. Lastly, there are <guilabel>vFolders</guilabel>, or virtual "
-"folders, discussed in <xref linkend=\"usage-mail-organize-vfolders\"/>,"
-msgstr ""
-"La <interface>barra de carpetas</interface> es la manera más amplia de ver "
-"la información que tiene almacenada en <application>Ximian Evolution</"
-"application>. Muestra todas sus citas, tarjetas de visita y correo "
-"electrónico en un árbol que es muy parecido a un <glossterm linkend="
-"\"filetree\">árbol de archivos</glossterm>: es pequeño en la parte superior "
-"y las ramas crecen hacia abajo. En la mayoría de los sistemas habrá tres o "
-"cuatro carpetas en la base. La primera, por supuesto es el "
-"<guilabel>Resumen</guilabel>, un resumen personalizable de su información. "
-"Debajo están las <guilabel>Carpetas locales</guilabel>, que guardan todos "
-"los datos que <application>Ximian Evolution</application> tiene almacenados "
-"en su sistema. Tras esto están sus servidores de red: servidores <glossterm "
-"linkend=\"ldap\">LDAP</glossterm> que alojan directorios compartidos de "
-"contactos y carpetas de correo <glossterm linkend=\"imap\">IMAP</glossterm> "
-"a las que está suscrito. Finalmente están las <guilabel>carpetas virtuales</"
-"guilabel>, las carpetas virtuales."
-
-#: index.docbook:953
-#, no-c-format
-msgid "Editing Filters"
-msgstr "Edición de filtros"
-
-#: index.docbook:954
-#, no-c-format
-msgid "Change the desired settings."
-msgstr "Modifique los parámetros deseados."
-
-#: index.docbook:954
-#, no-c-format
-msgid "Press <guibutton>OK</guibutton> in the filter editor window."
-msgstr ""
-"Haga clic en <guibutton>Aceptar</guibutton> en la ventana del editor de "
-"filtros."
-
-#: index.docbook:954
-#, no-c-format
-msgid "Press <guibutton>OK</guibutton> in the filter manager window."
-msgstr ""
-"Haga clic en <guibutton>Aceptar</guibutton> en la ventana del administrador "
-"de filtros."
-
-#: index.docbook:954
-#, no-c-format
-msgid ""
-"Select <menuchoice> <guimenu>Tools</guimenu> <guimenuitem>Filters</"
-"guimenuitem> </menuchoice>"
-msgstr ""
-"Seleccione <menuchoice> <guimenu>Herramientas</guimenu> "
-"<guimenuitem>Filtros</guimenuitem> </menuchoice>"
-
-#: index.docbook:954
-#, no-c-format
-msgid ""
-"Select the filter in the <guilabel>Filter Rules</guilabel> section and press "
-"<guibutton>Edit</guibutton>."
-msgstr ""
-"Seleccione el filtro dentro de la sección <guilabel>Reglas de filtrado</"
-"guilabel> y haga clic en <guibutton>Modificar</guibutton>."
-
-#: index.docbook:954
-#, no-c-format
-msgid "To edit a filter:"
-msgstr "Para modificar un filtro:"
-
-#: index.docbook:956
-#, no-c-format
-msgid ""
-"Add attendees, either by entering their email addresses into the list, or by "
-"clicking the <guibutton>Invite Others</guibutton> button. If you choose to "
-"so, it's best to use the Global Address List (GAL). Choose the GAL from the "
-"drop-down list of address sources at the top of the dialog box."
-msgstr ""
-"Para agregar asistentes, escriba sus direcciones de correo electrónico, o "
-"haga clic en <guibutton>Invitar a otros...</guibutton>. Si opta por esta "
-"solución, es preferible utilizar la lista global de direcciones (GAL - "
-"Global Address List). Elija la lista global de direcciones en la lista "
-"desplegable de direcciones origen en la parte superior del cuadro de diálogo."
-
-#: index.docbook:956
-#, no-c-format
-msgid ""
-"Choose <guilabel>Options</guilabel> and then <guilabel>Update Free/Busy</"
-"guilabel> to check participant schedules and, if possible, update the "
-"meeting in all participants' calendars."
-msgstr ""
-"Elija <guilabel>Opciones</guilabel> y a continuación <guilabel>Actualizar "
-"disponibilidad</guilabel> para comprobar las agendas de los participantes y, "
-"si es posible, actualizar la reunión en los calendarios de cada uno de los "
-"asistentes."
-
-#: index.docbook:956
-#, no-c-format
-msgid ""
-"Choose <menuchoice> <guimenu>Actions</guimenu> <guimenuitem>Schedule "
-"Meeting</guimenuitem> </menuchoice> in the meeting editor window."
-msgstr ""
-"Elija <menuchoice> <guimenu>Acciones</guimenu> <guimenuitem>Planificar una "
-"reunión</guimenuitem> </menuchoice> en la ventana del editor de reuniones."
-
-#: index.docbook:956
-#, no-c-format
-msgid "Open a new appointment in the calendar."
-msgstr "Abra una nueva cita en el calendario."
-
-#: index.docbook:974
-#, no-c-format
-msgid "Using the Folder Bar"
-msgstr "Uso de la barra de carpetas"
-
-#: index.docbook:975
-#, no-c-format
-msgid "Inbox with Folder Bar"
-msgstr "Carpeta de entrada y la barra de carpetas"
-
-#: index.docbook:985
-#, no-c-format
-msgid "<guilabel>Calendar</guilabel>, for appointments and event listings."
-msgstr "<guilabel>Calendario</guilabel>, para listados de citas y eventos."
-
-#: index.docbook:985
-#, no-c-format
-msgid "<guilabel>Contacts</guilabel>, for address cards."
-msgstr "<guilabel>Contactos</guilabel>, para las tarjetas de visita."
-
-#: index.docbook:985
-#, no-c-format
-msgid "<guilabel>Drafts</guilabel>, for messages you started and didn't finish."
-msgstr ""
-"<guilabel>Borradores</guilabel>, para los mensajes que empezó a escribir y "
-"no acabó."
-
-#: index.docbook:985
-#, no-c-format
-msgid "<guilabel>Inbox</guilabel>, for incoming mail."
-msgstr "<guilabel>Entrada</guilabel>, para el correo entrante."
-
-#: index.docbook:985
-#, no-c-format
-msgid ""
-"<guilabel>Outbox</guilabel>, for messages you have written but not yet sent. "
-"This will be empty unless you use <application>Ximian Evolution</"
-"application> while offline."
-msgstr ""
-"<guilabel>Salida</guilabel>, para mensajes que ha escrito pero que no ha "
-"enviado todavía. Esta carpeta estará vacía a menos que use "
-"<application>Ximian Evolution</application> en modo desconectado."
-
-#: index.docbook:985
-#, no-c-format
-msgid "<guilabel>Sent</guilabel>, for sent mail."
-msgstr "<guilabel>Enviado</guilabel>, para el correo enviado."
-
-#: index.docbook:985
-#, no-c-format
-msgid ""
-"<guilabel>Tasks</guilabel>, for your task list. Portions of your task list "
-"are reflected in the calendar, as well as in the summary folder."
-msgstr ""
-"<guilabel> Tareas</guilabel>, para su lista de tareas. Algunas partes de su lista de tareas "
-"se reflejan también en el calendario, así como en el resumen."
-
-#: index.docbook:985
-#, no-c-format
-msgid ""
-"<guilabel>Trash</guilabel>, a vFolder view of all the messages you have "
-"marked for deletion but not yet <glossterm linkend=\"expunge\">expunged</"
-"glossterm>."
-msgstr ""
-"<guilabel>Papelera</guilabel>, una vista de tipo carpeta virtual con todos "
-"los mensajes que ha marcado para borrar pero que aún no ha <glossterm "
-"linkend=\"expunge\">purgado</glossterm>."
-
-#: index.docbook:985
-#, no-c-format
-msgid "A typical <guilabel>Local</guilabel> folder contains the following folders:"
-msgstr ""
-"Una carpeta <guilabel>Carpetas locales</guilabel> típica contiene las "
-"siguientes carpetas:"
-
-#: index.docbook:986
-#, no-c-format
-msgid ""
-"If meeting attendees are not available during the times you have scheduled a "
-"meeting, you can \"nudge\" the meeting forward or backward to the nearest "
-"available time. To do so, just click the arrows to the left or right of the "
-"<guilabel>Autopick</guilabel> button. The Autopick tool will move the "
-"meeting to the nearest time during which all attendees are available. If you "
-"aren't satisfied with those results, you can drag the edges of the meeting "
-"time to the hours that you want to select."
-msgstr ""
-"Si los asistentes no están disponibles para las horas previstas de reunión, "
-"es posible «empujar» la reunión hacia adelante o hacia atrás, hasta el "
-"momento adecuado más cercano. Para ello, haga clic en las flechas izquierda "
-"o derecha, o haga clic en <guilabel>Autoseleccionar</guilabel>. La "
-"herramienta autoseleccionar mueve la reunión a la fecha/hora más cercana en "
-"la que todos los asistentes estarán disponibles. Si el resultado no le "
-"satisface, arrastre los lados de la reunión hacia las horas que desea "
-"seleccionar."
-
-#: index.docbook:986
-#, no-c-format
-msgid "Using Autopick to Adjust Meeting Times"
-msgstr "Uso de la función Autoseleccionar para ajustar el momento de reunión"
-
-#: index.docbook:992
-#, no-c-format
-msgid "Deleting Filters"
-msgstr "Eliminación de filtros"
-
-#: index.docbook:993
-#, no-c-format
-msgid ""
-"Select <menuchoice> <guimenu>Tools</guimenu> <guimenu>Filters</guimenu> </"
-"menuchoice>"
-msgstr ""
-"Seleccione <menuchoice> <guimenu>Herramientas</guimenu> <guimenu>Filtros</"
-"guimenu> </menuchoice>"
-
-#: index.docbook:993
-#, no-c-format
-msgid "Select the filter and press <guibutton>Delete</guibutton>."
-msgstr "Seleccione el filtro y haga clic en <guibutton>Borrar</guibutton>."
-
-#: index.docbook:993
-#, no-c-format
-msgid "To delete a filter:"
-msgstr "Para eliminar un filtro:"
-
-#: index.docbook:1012
-#, no-c-format
-msgid "Changing Folder Names and Filters"
-msgstr "Cambio de nombres de carpetas y de filtros"
-
-#: index.docbook:1012
-#, no-c-format
-msgid ""
-"Incoming email that your filters don't move goes into the Inbox; outgoing "
-"mail that they don't move ends up in the Sent folder. So be sure to change "
-"the filters that go with it."
-msgstr ""
-"El correo entrante que los filtros no desplazan hacia otro sitio permanecen "
-"en la carpeta de entrada; asimismo, el correo saliente no desplazado acaba "
-"en la carpeta de correo enviado. Debe por tanto asegurarse de cambiar los "
-"filtros asociados."
-
-#: index.docbook:1033
-#, no-c-format
-msgid "Getting Really Organized with vFolders"
-msgstr "Organización avanzada con carpetas virtuales"
-
-#: index.docbook:1034
-#, no-c-format
-msgid ""
-"If filters aren't flexible enough for you, or you find yourself performing "
-"the same search again and again, consider a vFolder. vFolders, or virtual "
-"folders, are an advanced way of viewing your email messages within "
-"<application>Ximian Evolution</application>. If you get a lot of mail or "
-"often forget where you put messages, vFolders can help you stay on top of "
-"things."
-msgstr ""
-"Si los filtros no le resultan lo suficientemente flexibles, o si se "
-"encuentra ejecutando la misma búsqueda una y otra vez, considere la solución "
-"de las carpetas virtuales. Las carpetas virtuales (o «vFolders»), son una "
-"solución avanzada de <application>Ximian Evolution</application> para "
-"consultar los mensajes de correo. Las carpetas virtuales ayudan a controlar "
-"la situación cuando recibe una gran cantidad de correo, o cuando olvida con "
-"frecuencia a dónde mueve los mensajes."
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"<application>Evolution</application> not only allows you to decorate your "
-"email with HTML text and graphics, but provides you with prebuilt templates "
-"for you to use when making these improvements. You can use these to "
-"emphasize a point or frame an image in an attractive manner."
-msgstr ""
-"<application>Evolution</application> no sólo permite decorar su correo con texto HTML "
-"y gráficos sino que también le ofrece plantillas prediseñadas para aprovechar estas mejoras. "
-"Puede usarlas para enfatizar un punto o enmarcar una imagen de una manera vistosa."
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"Choose the alignment and style. For the plain line, you can choose the "
-"thickness of the line, and whether it will be shaded, or solid. For the "
-"other types, you can only choose alignment."
-msgstr ""
-"Elija la alineación y el estilo. Para una línea plana puede elegir su grosor y si será "
-"sombreada o sólida. Para los otros tipos sólo puede elegir cómo alinearlas."
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"Choose the size of the line, as a percentage of the width of the email "
-"window."
-msgstr "Elija el tamaño de la línea, como un porcentaje del ancho de la ventana del mensaje."
-
-# index.docbook:172, index.docbook:216
-#: index.docbook:1041
-#, no-c-format
-msgid "Choose your image by clicking the <guibutton>Browse</guibutton> button."
-msgstr "Elija la imagien pinchando en el botón <guibutton>Examinar</guibutton>."
-
-# index.docbook:71, index.docbook:110
-#: index.docbook:1041
-#, no-c-format
-msgid "Click <guibutton>Insert</guibutton> to insert it where the cursor is."
-msgstr "Pinche en <guibutton>Insertar</guibutton> para insertarlo en la posición del cursor."
-
-# index.docbook:71, index.docbook:110
-#: index.docbook:1041
-#, no-c-format
-msgid "Click <guibutton>Insert</guibutton> to insert the rule."
-msgstr "Pinche en <guibutton>Insertar</guibutton> para insertar la regla."
-
-#: index.docbook:1041
-#, no-c-format
-msgid "Click on the text in the template, and enter the text you want to use."
-msgstr "Pinche sobre el texto en la plantilla y escriba el que quiera que aparezca finalmente."
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"Click the <guibutton>HTML Template</guibutton> button in the "
-"<guilabel>Toolbar</guilabel> or select <menuchoice> <guimenu> Insert </"
-"guimenu> <guimenuitem> HTML Template </guimenuitem> </menuchoice>"
-msgstr ""
-"Pinche en el botón <guibutton>Insertar plantilla HTML</guibutton>que está en la "
-"<guilabel>Barra de herramientas</guilabel> o elija <menuchoice> "
-"<guimenu>Insertar </guimenu> <guimenuitem>Plantilla</guimenuitem> </menuchoice>"
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"Click the <guibutton>Insert Image</guibutton> button in the toolbar, or "
-"select <menuchoice> <guimenu>Insert</guimenu> <guimenuitem>Image</"
-"guimenuitem> </menuchoice>."
-msgstr ""
-"Pinche en el botón <guibutton>Insertar imageb</guibutton> que está en la barra de "
-"herramientas o elija <menuchoice> <guimenu>Insertar</guimenu> "
-"<guimenuitem>Imagen</guimenuitem> </menuchoice>."
-
-# index.docbook:172, index.docbook:216
-#: index.docbook:1041
-#, no-c-format
-msgid "Click the <guibutton>Insert</guibutton> button."
-msgstr "Pinche en el botón <guibutton> Insertar</guibutton>."
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"Click the <guibutton>Rule</guibutton> button in the <guilabel>Toolbar</"
-"guilabel>."
-msgstr ""
-"Pinche en el botón <guibutton>Regla</guibutton> que está en la "
-"<guilabel>Barra de herramientas</guilabel>."
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"Click the <guibutton>Table</guibutton> button in the <guilabel>Toolbar</"
-"guilabel>."
-msgstr ""
-"Pinche en el botón <guibutton>Tabla</guibutton> que está en la "
-"<guilabel>barra de herramientas</guilabel>."
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"If you have selected an image frame template, right-click on the image and "
-"select <guimenuitem>Image</guimenuitem> to select the image you want to "
-"place in the frame."
-msgstr ""
-"Si ha seleccionado una plantilla con marco e imagen, pinche con el botón derecho sobre "
-"la imagen y en <guimenuitem> Imagen</guimenuitem> elija qué imagen quiere "
-"poner en el marco."
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"If you so desire, you may change the number of rows, columns, spacing of "
-"each cell, and so forth."
-msgstr "Si lo desea, puede cambiar el número de filas, columnas, el espaciado entre celdas, etc."
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"If you're typing a web page address to be automatically formatted, keep in "
-"mind that a space terminates the link."
-msgstr ""
-"Si está escribiendo la dirección de una página web para que sea formateada "
-"automáticamente, tenga en cuenta que un espacio da por finalizado el enlace."
-
-#: index.docbook:1041
-#, no-c-format
-msgid "Insert Image"
-msgstr "Insertar imagen"
-
-#: index.docbook:1041
-#, no-c-format
-msgid "Insert Link"
-msgstr "Insertar enlace"
-
-#: index.docbook:1041
-#, no-c-format
-msgid "Insert Rule"
-msgstr "Insertar regla"
-
-#: index.docbook:1041
-#, no-c-format
-msgid "Insert Table"
-msgstr "Insertar tabla"
-
-#: index.docbook:1041
-#, no-c-format
-msgid "Inserts a horizontal line into the text to help divide two sections."
-msgstr "Insertar una línea horizontal en el texto para dividirlo en dos secciones."
-
-#: index.docbook:1041
-#, no-c-format
-msgid "Inserts a table into the text to help divide two sections."
-msgstr "Insertar una tabla en el texto para dividirlo en dos secciones."
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"Lets you link some text to a website. Use this tool to put hyperlinks in "
-"your HTML messages. If you don't want special link text, you can just enter "
-"the address directly, and <application>Evolution</application> will "
-"recognize it as a link. To add a link:"
-msgstr ""
-"Enlace un texto con un sitio web. Ponga hiperenlaces con esta herramienta dentro de sus "
-"mensajes HTML. Si no quiere escribir ningún texto en particular, sólo tiene que escribir "
-"la dirección directamente y <application> Evolution</application>la reconocerá como "
-"un enlace. Para añadir un enlace:"
-
-#: index.docbook:1041
-#, no-c-format
-msgid "Lets you put an image alongside text."
-msgstr "Ponga una imagen junto al texto."
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"Make sure that the <menuchoice> <guimenu> Format </guimenu> <guimenuitem> "
-"HTML </guimenuitem> </menuchoice> selector is checked."
-msgstr ""
-"Asegúrese que el selector <menuchoice> <guimenu>Formato</guimenu> "
-"<guimenuitem>HTML</guimenuitem> </menuchoice>.está marcado."
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"Make sure that you have the <menuchoice> <guimenu>Format</guimenu> "
-"<guimenuitem>HTML</guimenuitem> </menuchoice> selector checked."
-msgstr ""
-"Asegúrese que el selector <menuchoice> <guimenu>Formato</guimenu> "
-"<guimenuitem>HTML</guimenuitem> </menuchoice>.está marcado."
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"Once the table is in place, you can right-click on it and get a list of ways "
-"to alter it, such as changing its background color, expanding it, or "
-"deleting a row or cell."
-msgstr ""
-"Una vez que la tabla está en su lugar, puede pinchar con el botón derecho sobre ella "
-"y obtener la lista de posibilidades de modificarla, como cambiar el color de fondo, "
-"expandirla o borrarle una fila o una celda."
-
-#: index.docbook:1041
-#, no-c-format
-msgid "Press <guibutton>Insert</guibutton> to insert the image."
-msgstr "Para insertar la imagen pulse el botón <guibutton>Insertar</guibutton>."
-
-#: index.docbook:1041
-#, no-c-format
-msgid "Put the URL you want to use in the <guilabel>URL</guilabel> field."
-msgstr "Escriba la dirección que quiere escribir en el campo <guilabel>URL</guilabel>."
-
-#: index.docbook:1041
-#, no-c-format
-msgid "Right click on the text and click on <guibutton>Link</guibutton>."
-msgstr "Pinche con el botón de la derecha y elija <guibutton>Enlace</guibutton>."
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"Select the table <guibutton>Template</guibutton> you wish to use. Each has a "
-"slightly different feel and layout."
-msgstr ""
-"Elija la tabla <guibutton>Plantilla</guibutton> que quiera usar. Cada una tiene una "
-"apariencia y organización ligeramente diferentes."
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"Select the template type in the <guilabel>Template</guilabel> selection box. "
-"Your options are <guilabel>Note</guilabel> and <guilabel>Image Frame</"
-"guilabel>."
-msgstr ""
-"Elija el tipo de plantilla en la caja de selección <guilabel>Plantilla</guilabel>. Puede elegir "
-"entre <guilabel>Nota</guilabel> e <guilabel>Imagen con marco</guilabel>."
-
-#: index.docbook:1041
-#, no-c-format
-msgid "Select the text you wish to link from."
-msgstr "Elija el texto en el que quiere poner el enlace."
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"Select the type of rule. You can use a plain line, a 3D line, or a yellow "
-"line with flowers."
-msgstr "Elija el tipo de regla. Puede usar una línea plana, una 3D o una amarilla con flores."
-
-#: index.docbook:1041
-#, no-c-format
-msgid "Set the size and alignment of the HTML template."
-msgstr "Elija el tamaño y alineación de la plantilla de HTML."
-
-#: index.docbook:1041
-#, no-c-format
-msgid "Templates"
-msgstr "Plantillas"
-
-#: index.docbook:1041
-#, no-c-format
-msgid ""
-"The <guimenu>Insert</guimenu> gives you opinions which let you spruce up "
-"your email to make it more interesting:"
-msgstr ""
-"El menú <guimenu>Insertar</guimenu> le ofrece medios para acicalar su correo "
-"electrónico y hacerlo más atractivo."
-
-#: index.docbook:1041
-#, no-c-format
-msgid "To include a template into your HTML based email:"
-msgstr "Para incluir una plantilla en su correo compuesto con HTML:"
-
-#: index.docbook:1041
-#, no-c-format
-msgid "To insert a rule:"
-msgstr "Para insertar una regla:"
-
-#: index.docbook:1041
-#, no-c-format
-msgid "To insert a table:"
-msgstr "Para insertar una tabla:"
-
-#: index.docbook:1041
-#, no-c-format
-msgid "To insert an image into your email:"
-msgstr "Para insertar una imagen en su correo:"
-
-#: index.docbook:1043
-#, no-c-format
-msgid ""
-"A vFolder is really a hybrid of all the other organizational tools: it looks "
-"like a folder, it acts like a search, and you set it up like a filter. In "
-"other words, while a conventional folder actually contains messages, a "
-"vFolder is a view of messages that may be in several different folders. The "
-"messages it contains are determined on the fly using a set of criteria you "
-"choose in advance."
-msgstr ""
-"Una carpeta virtual es realmente un híbrido de todas las demás herramientas "
-"de organización: es parecido a una carpeta, opera como una función de "
-"búsqueda y se configura como un filtro. En otras palabras, mientras una "
-"carpeta convencional contiene mensajes reales, una carpeta virtual es una "
-"vista de mensajes que pueden estar ubicados en carpetas diferentes. Los "
-"mensajes incluidos son identificados al vuelo mediante un conjunto de "
-"criterios elegidos de antemano."
-
-#: index.docbook:1043
-#, no-c-format
-msgid "Navigating without the Folder Bar or the Shortcut Bar"
-msgstr "Navegar sin la Barra de Carpetas ni la Barra de Atajos"
-
-#: index.docbook:1043
-#, no-c-format
-msgid ""
-"You don't need the folder bar or the shortcut bar to move around the main "
-"window. You can use the <keycap>Tab</keycap> key to switch from one part of "
-"the window to another. When you hide the folder bar, there is a menu on the "
-"left side of the window just below the toolbar to move about the folder "
-"tree, even with the folder and shortcut bars hidden."
-msgstr ""
-"Para moverse por la ventana principal no son necesarias las barras de menú o "
-"de atajos. Puede usar la tecla <keycap>Tabulador</keycap> para saltar en una "
-"ventana de una parte a otra. Cuando oculte la barra de carpetas hay un menú "
-"en la parte izquierda de la ventana, justo debajo de la barra de "
-"herramientas, para moverse a través del árbol de carpetas incluso si las "
-"barras de carpetas y de atajos están escondidas."
-
-#: index.docbook:1053
-#, no-c-format
-msgid ""
-"As messages that meet the vFolder criteria arrive or are deleted, "
-"<application>Ximian Evolution</application> will automatically place them in "
-"and remove them from the vFolder contents list. When you delete a message, "
-"it gets erased from the folder in which it actually exists, as well as any "
-"vFolders which display it."
-msgstr ""
-"A medida que recibe o borra los mensajes que cumplen con los criterios de la "
-"carpeta virtual, <application>Ximian Evolution</application> los incluye o "
-"los borra automáticamente de su lista de contenidos. Cuando borra un "
-"mensaje, queda eliminado de la carpeta donde existe realmente, así como de "
-"cualquier carpeta virtual con la que es posible consultarlo."
-
-#: index.docbook:1055
-#, no-c-format
-msgid "Choose the location of the new folder."
-msgstr "Elija dónde crear la carpeta."
-
-#: index.docbook:1055
-#, no-c-format
-msgid ""
-"If you get large volumes of mail, you'll want more folders than just your "
-"Inbox. To create a new folder:"
-msgstr ""
-"Si tiene grandes cantidades de correo, querrá tener más carpetas, además de "
-"la carpeta de Entrada. Para crear una carpeta nueva:"
-
-#: index.docbook:1055
-#, no-c-format
-msgid ""
-"Select <menuchoice> <guimenu>File</guimenu> <guisubmenu>New</guisubmenu> "
-"<guimenuitem>Folder</guimenuitem></menuchoice> or press the keyboard "
-"shortcut <keycombo action=\"simul\"> <keycap>Shift</keycap> <keycap>Ctrl</"
-"keycap> <keycap>E</keycap> </keycombo>."
-msgstr ""
-"Haga clic en <menuchoice> <guimenu>Archivo</guimenu> <guisubmenu>Nuevo</"
-"guisubmenu> <guimenuitem>Carpeta</guimenuitem></menuchoice> o pulse el atajo de "
-"teclas <keycombo action=\"simul\"> <keycap>Mayús</keycap> "
-"<keycap>Ctrl</keycap> <keycap>E</keycap> </keycombo>."
-
-#: index.docbook:1055
-#, no-c-format
-msgid "Select the folder type. The available options are."
-msgstr "Elija el tipo de carpeta. Los tipos disponibles son:"
-
-#: index.docbook:1055
-#, no-c-format
-msgid "Select the name of the folder in the <guilabel>Folder Name</guilabel> field."
-msgstr ""
-"Escriba el nombre de la carpeta en el campo <guilabel>Nombre de la carpeta</"
-"guilabel>."
-
-#: index.docbook:1062
-#, no-c-format
-msgid ""
-"Imagine a business trying to keep track of mail from hundreds of vendors and "
-"clients, or a university with overlapping and changing groups of faculty, "
-"staff, administrators and students. The more mail you need to organize, the "
-"less you can afford the sort of confusion that stems from an organizational "
-"system that's not flexible enough. vFolders make for better organization "
-"because they can accept overlapping groups in a way that regular folders and "
-"filing systems can't."
-msgstr ""
-"Imagine un negocio donde se intenta administrar el flujo de mensajes "
-"enviados por centenares de distribuidores y clientes; o una universidad con "
-"grupos de cursos, profesores, servicios administrativos y estudiantes que se "
-"solapan y evolucionan. Cuanto mayor sea el número de mensajes que consiga "
-"organizar, menos riesgo corre de sufrir el colapso en un sistema de "
-"organización que no es lo bastante flexible. Las carpetas virtuales "
-"contribuyen a mejorar la organización porque permiten administrar conjuntos "
-"solapados de un modo que resulta imposible de diseñar con sistemas "
-"tradicionales de carpetas y filtros."
-
-#: index.docbook:1075
-#, no-c-format
-msgid ""
-"If you use remote email storage like IMAP or Microsoft Exchange, and have "
-"created vFolders to search through them, the Unmatched vFolder will follow "
-"your lead, and search the remote folders as well. If you do not create any "
-"vFolders that search in remote mail stores, the Unmatched vFolder will not "
-"search in them either."
-msgstr ""
-"Si utiliza un sistema de almacenamiento remoto como IMAP o Microsoft "
-"Exchange, donde las búsquedas se realizan a través de carpetas virtuales, la "
-"carpeta virtual no coincidente se adapta a su vez y también explora las "
-"carpetas remotas. Si no crea ninguna carpeta virtual que busque en almacenes "
-"remotos, la carpeta virtual No coincidente tampoco los buscará."
-
-#: index.docbook:1075
-#, no-c-format
-msgid "The \"Unmatched\" vFolder"
-msgstr "La carpeta virtual «no coincidente»"
-
-#: index.docbook:1075
-#, no-c-format
-msgid ""
-"The Unmatched vFolder is the mirror of all your other vFolders: it displays "
-"whatever messages are not matched by other vFolders."
-msgstr ""
-"La carpeta virtual no coincidente es el espejo de todas las demás carpetas "
-"virtuales: contiene todos los mensajes que no cumplen los criterios "
-"satisfechos por las demás carpetas virtuales."
-
-#: index.docbook:1085
-#, no-c-format
-msgid ""
-"Editing a directory server account means changing that same information, "
-"although it is displayed in a slightly different order."
-msgstr ""
-"Editar una cuenta del servidor de directorio significa cambiar la misma información, aunque "
-"se muestra en un orden ligeramente diferente."
-
-#: index.docbook:1093
-#, no-c-format
-msgid ""
-"To organize his mailbox, Jim sets up a virtual folder for emails from his "
-"friend and co-worker Anna. He has another one for messages that have ximian."
-"com in the address and <application>Ximian Evolution</application> in the "
-"subject line, so he can keep a record of what people from work send him "
-"about <application>evolution</application>. If Anna sends him a message "
-"about anything other than <application>Ximian Evolution</application>, it "
-"only shows up in the \"Anna\" folder. When Anna sends him mail about the "
-"user interface for <application>evolution</application>, he can see that "
-"message both in the \"Anna\" vFolder and in the \"Internal Evolution "
-"Discussion\" vFolder."
-msgstr ""
-"Para organizar su correo, Juan define una carpeta virtual para los mensajes "
-"enviados por su amiga y compañera de trabajo Ana. También tiene otra para "
-"los mensajes que incluyen ximian.com en la dirección, y <application>Ximian "
-"Evolution</application> en la línea del asunto, con el fin de conservar la "
-"traza de las personas que trabajan con él en el desarrollo de "
-"<application>Evolution</application>. Si Ana le manda un mensaje acerca de "
-"cualquier otro tema que <application>Ximian Evolution</application>, éste "
-"sólo aparece en la carpeta llamada «Ana». Cuando Ana le envía un correo "
-"acerca de la interfaz de usuario de <application>Evolution</application>, el "
-"mensaje aparece tanto en la carpeta virtual «Ana», como en la también "
-"carpeta virtual «Debate interno acerca de Evolution»."
-
-#: index.docbook:1093
-#, no-c-format
-msgid "Using Folders, Searches, and vFolders"
-msgstr "Carpetas, búsquedas y carpetas virtuales"
-
-#: index.docbook:1112
-#, no-c-format
-msgid "Creating vFolders"
-msgstr "Creación de carpetas virtuales"
-
-#: index.docbook:1113
-#, no-c-format
-msgid "<guimenu>Tools</guimenu> <guimenuitem>Virtual Folder Editor</guimenuitem>"
-msgstr ""
-"<guimenu>Herramientas</guimenu> <guimenuitem>Editor "
-"de carpetas virtuales</guimenuitem>"
-
-#: index.docbook:1113
-#, no-c-format
-msgid ""
-"Attachments - Create a vFolder based on whether or not you have an "
-"attachment in the email."
-msgstr ""
-"Adjuntos: crea una carpeta virtual en función de si el mensaje contiene un "
-"adjunto."
-
-#: index.docbook:1113
-#, no-c-format
-msgid "Click <guibutton>Add</guibutton>"
-msgstr "Haga clic en <guibutton>Añadir</guibutton>"
-
-#: index.docbook:1113
-#, no-c-format
-msgid ""
-"Date sent - Search messages according to the date on which they were sent: "
-"First, choose the conditions you want a message to meet -- <guilabel>before</"
-"guilabel> a given time, <guilabel>after</guilabel> it, and so forth. Then, "
-"choose the time. The vFolder will compare the message's time-stamp to the "
-"system clock when the filter is run, or to a specific time and date you "
-"choose from a calendar. You can even have it look for messages within a "
-"range of time relative to the filter -- perhaps you're looking for messages "
-"less than two days old."
-msgstr ""
-"Fecha de envío: busca mensajes en función de la fecha de envío: en primer "
-"lugar, defina las condiciones que desea ver cumplidas con un mensaje: "
-"<guilabel>antes</guilabel> una hora determinada, <guilabel>después de</"
-"guilabel> de ella, etc. A continuación, especifique la fecha y hora. La "
-"carpeta virtual compara la fecha y hora del mensaje se compara con la hora "
-"del sistema al ejecutarse el filtro, o con una hora y fecha específica "
-"elegida en el calendario. Es incluso posible buscar mensajes dentro de un "
-"intervalo de tiempo relativo al filtro, por ejemplo, para buscar mensajes "
-"dentro de los dos últimos días."
-
-#: index.docbook:1113
-#, no-c-format
-msgid ""
-"Expression - For programmers only: match a message according to an "
-"expression you write in the Scheme language, used to define vFolders in "
-"<application>Ximian Evolution</application>."
-msgstr ""
-"Expresión: sólo para programadores: busca un mensaje que corresponda a una "
-"expresión escrita en lenguaje Scheme, utilizado para definir carpetas "
-"virtuales en <application>Ximian Evolution</application>."
-
-#: index.docbook:1113
-#, no-c-format
-msgid ""
-"If you select specific folders only, you need to specify the source folders "
-"in the box below."
-msgstr "En este caso, es necesario especificar las carpetas en el campo inferior."
-
-#: index.docbook:1113
-#, no-c-format
-msgid ""
-"Label - This works the same way as the <guilabel>Score</guilabel> option, "
-"although it allows you to select from various labels applied to the message, "
-"such as <guilabel>Important, Personal, To Do, Work</guilabel> or "
-"<guilabel>Later</guilabel>."
-msgstr ""
-"Etiquetar: funciona de la misma manera que la opción <guilabel>Puntuación</guilabel>, "
-"excepto que permite aplicar a cada mensaje una etiqueta, entre varias como "
-"<guilabel>Importante</guilabel> , <guilabel>Personal</guilabel> ,"
-"<guilabel>Tareas pendientes</guilabel>, "
-"<guilabel>Trabajo</guilabel> o "
-"<guilabel>Más tarde</guilabel> ."
-
-#: index.docbook:1113
-#, no-c-format
-msgid "Mailing List - Search based on the mailing list it came from."
-msgstr ""
-"Lista de correo: busca en función de la lista de correo de donde provienen "
-"los mensajes."
-
-#: index.docbook:1113
-#, no-c-format
-msgid "Name your vFolder in the <guilabel>Rule name</guilabel> field."
-msgstr ""
-"Escriba un nombre para la carpeta virtual en el campo <guilabel>Nombre de la "
-"regla</guilabel>."
-
-#: index.docbook:1113
-#, no-c-format
-msgid ""
-"Score - Emails have a standard priority range from -3 (least important) to 3 "
-"(most important). You can have vFolders set the priority of messages you "
-"receive, and then have other vFolders applied only to those messages which "
-"have a certain priority."
-msgstr ""
-"Puntuación: los mensajes utilizan de un rango de prioridades entre -3 "
-"(mínima importancia) y 3 (máxima importancia). Unas Carpetas virtuales "
-"pueden establecer la prioridad de los mensajes recibidos, mientras otras se "
-"aplican únicamente a aquellos mensajes con una prioridad determinada."
-
-#: index.docbook:1113
-#, no-c-format
-msgid "Select the folder sources. You can select:"
-msgstr "Seleccione las carpetas de origen. Puede seleccionar:"
-
-#: index.docbook:1113
-#, no-c-format
-msgid ""
-"Select your search criteria. For each criterion, you must first select which "
-"of the following parts of the message you want the search to examine: "
-"<figure id=\"usage-mail-vfolder-fig-createrule\"> <title>Selecting a vFolder "
-"Rule</title> <screenshot> <screeninfo>Creating a vFolder Rule</screeninfo> "
-"<mediaobject> <imageobject> <imagedata fileref=\"figures/vfolder-createrule-"
-"fig\" format=\"PNG\" srccredit=\"Aaron Weber\"/> </imageobject> </"
-"mediaobject> </screenshot> </figure>"
-msgstr ""
-"Elija los criterios de búsqueda: para cada criterio primero tiene que seleccionar cuál "
-"de las siguientes partes del mensaje quiere que se examinen en la búsqueda:"
-" Select your search criteria. For each criterion, you must first select which "
-"of the following parts of the message you want the search to examine: "
-"<figure id=\"usage-mail-vfolder-fig-createrule\"> <title>Elección de reglas para una carpeta virtual "
-"</title> <screenshot> <screeninfo>Creación de una carpeta virtual</screeninfo> "
-"<mediaobject> <imageobject> <imagedata fileref=\"figures/vfolder-createrule-"
-"fig\" format=\"PNG\" srccredit=\"Aaron Weber\"/> </imageobject> </"
-"mediaobject> </screenshot> </figure>"
-
-#: index.docbook:1113
-#, no-c-format
-msgid ""
-"Source Account - Search messages according the server you got them from. You "
-"can enter a URL or choose one from the drop-down list. This ability is only "
-"relevant if you use more than one mail source."
-msgstr ""
-"Cuenta de origen: busca mensajes en función del servidor de donde "
-"provienen. Puede escribir, o seleccionar la dirección URL en la lista "
-"desplegable. Esta característica sólo tiene interés cuando utiliza más de un "
-"origen de correo."
-
-#: index.docbook:1113
-#, no-c-format
-msgid "Specific folders only"
-msgstr "únicamente carpetas especificadas"
-
-#: index.docbook:1113
-#, no-c-format
-msgid "Status - Searches according to the status of a message, such as 'New'."
-msgstr ""
-"Estado: realiza una búsqueda sobre el estado del mensaje, por ejemplo "
-"«Nuevo»."
-
-#: index.docbook:1113
-#, no-c-format
-msgid "To create a vFolder:"
-msgstr "Para crear una carpeta virtual:"
-
-#: index.docbook:1113
-#, no-c-format
-msgid "With all active remote folders"
-msgstr "con todas las carpetas remotas activas"
-
-#: index.docbook:1113
-#, no-c-format
-msgid "With all local and active folders"
-msgstr "Con todas las carpetas locales y remotas activas"
-
-#: index.docbook:1113
-#, no-c-format
-msgid "With all local folders"
-msgstr "Con todas las carpetas locales"
-
-#: index.docbook:1116
-#, no-c-format
-msgid "Subfolders"
-msgstr "Subcarpetas"
-
-#: index.docbook:1117
-#, no-c-format
-msgid ""
-"<application>Ximian Evolution</application> lets you nest folders inside of "
-"each other, so that you can have a detailed organizational system."
-msgstr ""
-"<application>Ximian Evolution</application> permite anidar carpetas unas "
-"dentro de otras para que pueda tener un detallado sistema organizacional."
-
-#: index.docbook:1123
-#, no-c-format
-msgid ""
-"Calendars must go in calendar folders, mail in mail folders, and contacts in "
-"contact folders."
-msgstr ""
-"Los calendarios deben ir en carpetas específicas para calendario, el correo "
-"en carpetas de correo, y los contactos en carpetas de contactos."
-
-#: index.docbook:1123
-#, no-c-format
-msgid "Folders Have Limits"
-msgstr "Las carpetas tienen un límite"
-
-#: index.docbook:1131
-#, no-c-format
-msgid ""
-"<guimenuitem>Add to Shortcut Bar</guimenuitem>, to add the folder to your "
-"shortcut bar."
-msgstr ""
-"<guimenuitem>Añadir a la barra de atajos</guimenuitem>: agregar la carpeta a "
-"la barra de atajos."
-
-#: index.docbook:1131
-#, no-c-format
-msgid "<guimenuitem>Copy</guimenuitem>, to duplicate the folder."
-msgstr "<guimenuitem>Copiar</guimenuitem>: duplicar la carpeta en otro lugar."
-
-#: index.docbook:1131
-#, no-c-format
-msgid ""
-"<guimenuitem>Create New Folder</guimenuitem>, to create another folder in "
-"the same location."
-msgstr ""
-"<guimenuitem>Crear carpeta nueva</guimenuitem>: crear otra carpeta que "
-"cuelgue de este lugar."
-
-#: index.docbook:1131
-#, no-c-format
-msgid "<guimenuitem>Delete</guimenuitem>, to delete the folder and all its contents."
-msgstr "<guimenuitem>Borrar</guimenuitem>: borrar la carpeta y todo su contenido."
-
-#: index.docbook:1131
-#, no-c-format
-msgid "<guimenuitem>Move</guimenuitem>, to move the folder to another location."
-msgstr "<guimenuitem>Mover</guimenuitem>: mover la carpeta a otro lugar."
-
-#: index.docbook:1131
-#, no-c-format
-msgid ""
-"<guimenuitem>Open in New Window</guimenuitem> to view the folder in another "
-"window."
-msgstr ""
-"<guimenuitem>Abre en una ventana nueva</guimenuitem>: ver la carpeta en una "
-"ventana diferente."
-
-#: index.docbook:1131
-#, no-c-format
-msgid ""
-"<guimenuitem>Properties</guimenuitem>, to view or change the folder "
-"properties."
-msgstr ""
-"<guimenuitem>Propiedades</guimenuitem>: ver o cambiar propiedades de la "
-"carpeta."
-
-#: index.docbook:1131
-#, no-c-format
-msgid "<guimenuitem>Rename</guimenuitem>, to change its name."
-msgstr "<guimenuitem>Renombrar</guimenuitem>: cambiar su nombre."
-
-#: index.docbook:1131
-#, no-c-format
-msgid "<guimenuitem>View</guimenuitem>, to view the folder."
-msgstr "<guimenuitem>Vista</guimenuitem>: ver la carpeta."
-
-#: index.docbook:1131
-#, no-c-format
-msgid ""
-"Right-clicking will bring up a menu for just about anything in "
-"<application>Ximian Evolution</application>. If you right-click on a folder, "
-"you'll have a menu with the following options:"
-msgstr ""
-"Un clic con el botón derecho sobre casi cualquier elemento de "
-"<application>Ximian Evolution</application> permite abrir un menú. Si lo "
-"hace sobre una carpeta obtendrá un menú con las opciones siguientes:"
-
-#: index.docbook:1147
-#, no-c-format
-msgid "You can also rearrange folders and messages by dragging and dropping them."
-msgstr ""
-"También puede reorganizar las carpetas y los mensajes arrastrándolos y "
-"soltándolos donde desee."
-
-#: index.docbook:1152
-#, no-c-format
-msgid ""
-"Any time new mail arrives in a mail folder, that folder label is displayed "
-"in bold text, along with the number of new messages in that folder."
-msgstr ""
-"Siempre que llegue un mensaje nuevo a una carpeta de correo, su nombre se "
-"mostrará en negrita junto al número de mensajes contenidos."
-
-#: index.docbook:1161
-#, no-c-format
-msgid "The Menu Bar"
-msgstr "La barra del menú"
-
-#: index.docbook:1162
-#, no-c-format
-msgid ""
-"The <interface>menu bar</interface>'s contents will always provide all the "
-"possible actions for any given view of your data. If you're looking at your "
-"Inbox, most of the menu items will relate to mail; some will relate to other "
-"components of <application>Ximian Evolution</application> and some, "
-"especially those in the <guimenu>File Menu</guimenu> will relate to the "
-"application as a whole."
-msgstr ""
-"Los contenidos de la <interface>barra del menú</interface> contienen todas "
-"las acciones correspondientes a la vista actual. Si está examinando su buzón "
-"de entrada, la mayoría de los elementos del menú estarán relacionados con el "
-"correo; algunos lo estarán con otros componentes de <application>Ximian "
-"Evolution</application> y algunos, especialmente los del menú "
-"<guimenu>Archivo</guimenu>, lo estarán con la aplicación como un todo."
-
-#: index.docbook:1171
-#, no-c-format
-msgid "<guimenu>Actions</guimenu>:"
-msgstr "<guimenu>Acciones</guimenu>:"
-
-#: index.docbook:1171
-#, no-c-format
-msgid "<guimenu>Edit</guimenu>:"
-msgstr "<guimenu>Editar</guimenu>:"
-
-#: index.docbook:1171
-#, no-c-format
-msgid "<guimenu>File</guimenu>:"
-msgstr "<guimenu>Archivo</guimenu>:"
-
-#: index.docbook:1171
-#, no-c-format
-msgid "<guimenu>Help</guimenu>:"
-msgstr "<guimenu>Ayuda</guimenu>:"
-
-#: index.docbook:1171
-#, no-c-format
-msgid "<guimenu>Search</guimenu>:"
-msgstr "<guimenu>Buscar</guimenu>:"
-
-#: index.docbook:1171
-#, no-c-format
-msgid "<guimenu>Tools</guimenu>:"
-msgstr "<guimenu>Herramientas</guimenu>:"
-
-#: index.docbook:1171
-#, no-c-format
-msgid "<guimenu>View</guimenu>:"
-msgstr "<guimenu>Vista</guimenu>:"
-
-#: index.docbook:1171
-#, no-c-format
-msgid ""
-"Anything related to a file or to the operations of the application generally "
-"falls under this menu: creating things, saving them to disk, printing them, "
-"and quitting the program itself."
-msgstr ""
-"Este menú reúne todas las operaciones relacionadas con archivos o con la "
-"aplicación: crear o guardar elementos a disco, imprimirlos y salir del "
-"propio programa."
-
-#: index.docbook:1171
-#, no-c-format
-msgid ""
-"Holds actions which maybe applied to a message. Normally, if there is only "
-"one target for the action -- for example, replying to a message -- you can "
-"find it in the <guimenu>Actions</guimenu> menu."
-msgstr ""
-"Acciones que pueden aplicarse a un mensaje. Normalmente, si la acción sólo "
-"tiene un objetivo -por ejemplo responder a un mensaje- le encontrará en este "
-"el menú <guimenu>Acciones</guimenu>."
-
-#: index.docbook:1171
-#, no-c-format
-msgid ""
-"Select among these items to open the <application>Help Browser</application> "
-"and read the <application>Ximian Evolution</application> manual."
-msgstr ""
-"Estos elementos permiten abrir el <application>navegador de ayuda</"
-"application> para leer el manual de <application>Ximian Evolution</"
-"application>."
-
-#: index.docbook:1171
-#, no-c-format
-msgid ""
-"Select menu items here to search for messages, or for phrases within a "
-"message. You can also see previous searches you have made. In addition to "
-"the <guimenu>Search</guimenu> menu, there is a text entry box in the toolbar "
-"that you can use to search for messages."
-msgstr ""
-"Elija las opciones del menú para buscar mensajes o para buscar frases dentro de un mensaje. "
-"También puede ver otras búsquedas que haya hecho con anteriorad. Además del menú "
-"<guimenu>Buscar</guimenu> en la barra de herramientas hay una caja donde puede "
-"introducir el texto para las búsquedas de mensajes."
-
-#: index.docbook:1171
-#, no-c-format
-msgid ""
-"The <guimenu>Edit</guimenu> menu holds useful tools that help you edit text "
-"and move it around."
-msgstr ""
-"El menú <guimenu>Editar</guimenu> contiene las herramientas útiles para "
-"modificar y desplazar texto en la aplicación."
-
-#: index.docbook:1171
-#, no-c-format
-msgid ""
-"This menu lets you decide how <application>Ximian Evolution</application> "
-"should look. Some of the features control the appearance of "
-"<application>Ximian Evolution</application> as a whole, and others the way a "
-"particular kind of information appears."
-msgstr ""
-"Este menú permite configurar la apariencia de <application>Ximian Evolution</"
-"application>. Algunas de las opciones afectan la apariencia de todo "
-"<application>Ximian Evolution</application>, mientras otras sólo afectan a "
-"determinados tipos de información."
-
-#: index.docbook:1171
-#, no-c-format
-msgid ""
-"Tools for configuring, changing, and setting up go here. For mail, that "
-"means things like and the <guimenuitem>Virtual Folder Editor</guimenuitem>. "
-"For the <interface>Calendar</interface> and the <interface>Contact Manager</"
-"interface>, it's color, network, and layout configuration."
-msgstr ""
-"Incluye las herramientas de configuración y reconfiguración. En el caso del "
-"correo, se trata de elementos como el <guimenuitem>Editor de carpetas "
-"virtuales</guimenuitem>. Para el <interface>Calendario</interface> y el "
-"<interface>administrador de contactos</interface>, incluye la configuración "
-"del color, de la red y la organización en pantalla."
-
-#: index.docbook:1247
-#, no-c-format
-msgid ""
-"Once you've familiarized yourself with the <interface>main window</"
-"interface> you can start doing things with it. We'll start with the "
-"<guilabel>Summary</guilabel>, which provides a quick overview of your "
-"<application>Ximian Evolution</application> information."
-msgstr ""
-"Cuando esté familiarizado con la <interface>ventana principal</interface> "
-"podrá empezar a hacer cosas con ella. Empezaremos por el <guilabel>Resumen</"
-"guilabel> que proporciona una perspectiva general de su información en "
-"<application>Ximian Evolution</application>."
-
-#: index.docbook:1256
-#, no-c-format
-msgid "Introducing the Summary"
-msgstr "Introducción al Resumen"
-
-#: index.docbook:1257
-#, no-c-format
-msgid ""
-"The Ximian Evolution Summary provides you with a quick run-down of important "
-"information: your appointments for a given day, how much new mail you have, "
-"headlines from selected news services, and so forth. To see the Summary, "
-"click on the <guibutton>Summary</guibutton> button in the shortcut bar, or "
-"select the <guilabel>Summary</guilabel> folder in the folder bar."
-msgstr ""
-"El Resumen de Ximian Evolution ofrece una vista rápida de la información "
-"importante: sus citas para la jornada, su correo pendiente , los titulares "
-"de los servicios de noticias elegidos, etc. Para ver el Resumen haga clic en "
-"<guibutton>Resumen</guibutton> en la barra de atajos o elija la carpeta "
-"<guilabel>Resumen</guilabel> en la barra de carpetas."
-
-#: index.docbook:1268
-#, no-c-format
-msgid "The Evolution Summary"
-msgstr "El Resumen de Evolution"
-
-#: index.docbook:1269
-#, no-c-format
-msgid "The Evolution Summary gives you a quick view of your day"
-msgstr "El Resumen de Evolution le permite un rápido vistazo a su jornada"
-
-#: index.docbook:1279
-#, no-c-format
-msgid "Weather Summary"
-msgstr "Meteorología"
-
-#: index.docbook:1282
-#, no-c-format
-msgid ""
-"Shows you the latest weather updates from hundreds of cities around the "
-"world."
-msgstr ""
-"Muestra las últimas noticias sobre el clima de cientos de ciudades de todo "
-"el mundo."
-
-#: index.docbook:1285
-#, no-c-format
-msgid "News Feeds"
-msgstr "Titulares de noticias"
-
-#: index.docbook:1288
-#, no-c-format
-msgid "Displays up to the minute news from your favorite websites."
-msgstr "Muestra los titulares de las últimas noticias de sus sitios web favoritos."
-
-#: index.docbook:1291
-#, no-c-format
-msgid "Mail Summary"
-msgstr "Resumen de correo"
-
-#: index.docbook:1294
-#, no-c-format
-msgid ""
-"Shows you how many email messages you have in your selected folders, waiting "
-"to be read."
-msgstr ""
-"Muestra cuántos mensajes de correo tiene pendientes de leer en las carpetas "
-"elegidas."
-
-#: index.docbook:1296
-#, no-c-format
-msgid ""
-"Remote folders are considered active if you are connected to the server; you "
-"must be connected to your mail server for the vFolder to include any "
-"messages from that source."
-msgstr ""
-"Las carpetas remotas se consideran activas mientras está conectado al "
-"servidor; debe conectarse al servidor de correo de su carpeta virtual para "
-"poder incluir los mensajes de dicho origen."
-
-#: index.docbook:1297
-#, no-c-format
-msgid "Calendar Summary"
-msgstr "Resumen de citas"
-
-#: index.docbook:1300
-#, no-c-format
-msgid "Shows you your calendar. Tasks are displayed below calendar appointments."
-msgstr "Muestra su calendario. Las tareas se listan debajo de las entradas del calendario."
-
-#: index.docbook:1305
-#, no-c-format
-msgid ""
-"To add additional services to your Summary, or to edit the existing "
-"services, select <menuchoice> <guimenu>Tools</guimenu> "
-"<guimenuitem>Configure</guimenuitem> </menuchoice> and click the "
-"<guibutton>Summary Settings</guibutton> button."
-msgstr ""
-"Para agregar servicios adicionales a su resumen o modificar los actuales "
-"elija <menuchoice> <guimenu>Herramientas</guimenu> "
-"<guimenuitem>Configuración</guimenuitem> </menuchoice> y haga clic en "
-"<guibutton>Configuración del resumen</guibutton>."
-
-# #-#-#-#-# usage-exchange.po #-#-#-#-#
-# index.docbook:342, index.docbook:514
-#: index.docbook:1316
-#, no-c-format
-msgid "Forwarding Mail"
-msgstr "Reenviar correo"
-
-#: index.docbook:1317
-#, no-c-format
-msgid "Introducing Email"
-msgstr "Introducción al correo electrónico"
-
-#: index.docbook:1317
-#, no-c-format
-msgid ""
-"The post office forwards your mail for you when you change addresses, and "
-"you can forward a letter if it comes to you by mistake. The email "
-"<guilabel>Forward</guilabel> button works in much the same way. It's "
-"particularly useful if you have received a message and you think someone "
-"else would like to see it. You can forward a message as an attachment to a "
-"new message (this is the default) or you can send it <glossterm linkend="
-"\"inline\">inline</glossterm> as a quoted portion of the message you are "
-"sending. Attachment forwarding is best if you want to send the full, "
-"unaltered message on to someone else. Inline forwarding is best if you want "
-"to send portions of a message, or if you have a large number of comments on "
-"different sections of the message you are forwarding. Remember to note from "
-"whom the message came, and where, if at all, you have removed or altered "
-"content."
-msgstr ""
-"La oficina de correos le reenvía su correo cuando usted cambia de dirección y usted puede "
-"reenviar una carta que ha llegado hasta usted por error. El botón de correo "
-"The postReenviar</guilabel> funciona de manera parecida. Es particularmente útil "
-"cuando recibe un mensaje que cree que otra persona también debería ver. Puede reenviar "
-"los mensajes como si fueran adjuntos a un mensaje nuevo (este es el comportamiento "
-"predeterminado) o puede enviarlo <glossterm linkend="
-"\"inline\">incluido</glossterm>, como una parte citada en el mensaje que está enviando. "
-"El reenvío en forma de adjunto es el mejor si quiere enviar una copia íntegra del mensaje. "
-"Los envíos incluídos son mejores si sólo quiere enviar partes del mensaje o si tiene que hacer "
-"una gran cantidad de comentarios a diferentes partes del mensaje que reenvía. Recuerde "
-"que es importante citar al autor original del mensaje y diferenciar claramente las partes del "
-"texto que ha modificado, borrado o añadido."
-
-#: index.docbook:1318
-#, no-c-format
-msgid ""
-"<application>Ximian Evolution</application> email is like other email "
-"programs in several ways:"
-msgstr ""
-"En varios aspectos <application>Ximian Evolution</application> es como "
-"cualquier otro programa de correo electrónico:"
-
-#: index.docbook:1318
-#, no-c-format
-msgid ""
-"It can send and receive mail in HTML or as plain text, and makes it easy to "
-"send and receive multiple file attachments."
-msgstr ""
-"Permite enviar y recibir mensajes en HTML o en texto sencillo, y facilita el "
-"envío y recepción de múltiples archivos adjuntos."
-
-#: index.docbook:1318
-#, no-c-format
-msgid ""
-"It can sort and organize your mail in a wide variety of ways with folders, "
-"searches, and filters."
-msgstr ""
-"Puede ordenar y organizar su correo en una amplia gama de maneras con "
-"carpetas, búsquedas y filtros."
-
-#: index.docbook:1318
-#, no-c-format
-msgid "It lets you guard your privacy with encryption."
-msgstr "Permite proteger su privacidad utilizando cifrado."
-
-#: index.docbook:1318
-#, no-c-format
-msgid ""
-"It supports multiple mail sources, including <glossterm linkend=\"imap"
-"\">IMAP</glossterm>, <glossterm linkend=\"pop\">POP3</glossterm>, and local "
-"<filename>mbox</filename> or <filename>mh</filename> spools and files "
-"created by other mail programs."
-msgstr ""
-"Implementa múltiples fuentes de correo, como <glossterm linkend=\"imap"
-"\">IMAP</glossterm>, <glossterm linkend=\"pop\">POP3</glossterm> y archivos "
-"locales <filename>mbox</filename> o <filename>mh</filename> creados por "
-"otros programas de correo."
-
-#: index.docbook:1335
-#, no-c-format
-msgid ""
-"To forward a message you are reading, press <guibutton>Forward</guibutton> "
-"on the toolbar, select <menuchoice> <guimenu>Actions</guimenu> "
-"<guimenuitem>Forward</guimenuitem> </menuchoice>, or press <keycombo action="
-"\"simul\"><keycap>Ctrl</keycap><keycap>J</keycap></keycombo>. If you prefer "
-"to forward the message <glossterm linkend=\"inline\">inline</glossterm> "
-"instead of attached, select <menuchoice> <guimenu>Actions</guimenu> "
-"<guimenuitem>Forward Inline</guimenuitem> </menuchoice> from the menu. "
-"Choose an addressee as you would when sending a new message; the subject "
-"will already be entered, although you can alter it if you wish. Enter your "
-"comments on the message in the <interface>composition frame</interface>, and "
-"press <guibutton>Send</guibutton>."
-msgstr ""
-"Si está leyendo un mensaje y quiere reenviarlo, pulse el botón de la barra de herramientas"
-"<guibutton>Reenviar</guibutton> o <menuchoice><guimenu>Acciones</guimenu> "
-"<guimenuitem>Reenviar</guimenuitem></menuchoice> "
-"<keycombo action=\"simul\"><keycap>Ctrl</keycap><keycap>J</keycap> "
-"</keycombo>. Si prefiere reenviarlo <glossterm linkend=\"inline\">en línea</glossterm> "
-"en lugar de adjunto, elija en el menú:"
-"<menuchoice><guimenu>Acciones</guimenu> "
-" <guisubmenu>Reenviar</guisubmenu><guimenuitem>Incluido en línea</guimenuitem> "
-"</menuchoice>. Escriba el destinatario como haría con un mensaje nuevo. El asunto ya "
-"estará escrito, aunque podrá modificarlo si lo desea. Añada sus comentarios en la"
-"<interface>caja del texo</interface> y pulse <guibutton>Enviar</guibutton> cuando haya "
-"acabado."
-
-#: index.docbook:1351
-#, no-c-format
-msgid ""
-"However, <application>Ximian Evolution</application> has some important "
-"differences. First, it's built to handle very large amounts of mail. Both "
-"the <link linkend=\"usage-mail-organize-filters\">filtering</link> and <link "
-"linkend=\"usage-mail-organize-search\">searching</link> functions were built "
-"for speed and efficiency on large volumes of mail. There's also the "
-"<application>Ximian Evolution</application> <link linkend=\"usage-mail-"
-"organize-vfolders\">vFolder</link>, an advanced organizational feature not "
-"found in mainstream mail clients. If you get a lot of mail, or if you keep "
-"every message you get in case you need to refer to it later, you'll find "
-"this feature especially useful."
-msgstr ""
-"Sin embargo, <application>Ximian Evolution</application> tiene algunas "
-"diferencias importantes. Primero está diseñado para manejar ingentes "
-"cantidades de correo. Las funciones de <link linkend=\"usage-mail-organize-filters\">filtrado</link> "
-"y de <link linkend=\"usage-mail-organize-search\">búsqueda</link> han sido "
-"optimizadas en velocidad y eficiencia para operar con grandes cantidades de "
-"correo. También están las <link linkend=\"usage-mail-organize-vfolders\">carpetas "
-"virtuales </link>de <application>Ximian Evolution</application>, una característica "
-"organizacional avanzada que no está disponible en los clientes de correo más comunes. "
-"Esta característica le resultará especialmente útil si administra un montón de correo o "
-"conserva todos sus mensajes para poder referirse a ellos posteriormente."
-
-#: index.docbook:1356
-#, no-c-format
-msgid "Seven Tips for Email Courtesy"
-msgstr "Siete consejos de cortesía para el correo electrónico"
-
-#: index.docbook:1357
-#, no-c-format
-msgid ""
-"Always begin and close with a salutation. Say \"please\" and \"thank you,\" "
-"just like you do in real life. You can keep your pleasantries short, but be "
-"pleasant!"
-msgstr ""
-"Siempre empiece y acaba con un saludo. Diga «por favor» y «gracias» de la misma "
-"manera que haría en la vida real. Puede ser breve en sus cumplidos ¡pero sea atento!"
-
-#: index.docbook:1357
-#, no-c-format
-msgid ""
-"Check your spelling and use complete sentences. By default, "
-"<application>Evolution</application> will put a red line beneath words it "
-"doesn't recognize, as you type them."
-msgstr ""
-"Compruebe su ortografía y use frases completas. <application>Evolution</application>. "
-"está preconfigurado para destacar las palabras que no reconozca con una línea roja bajo las "
-"palabras conforme las vaya escribiendo."
-
-#: index.docbook:1357
-#, no-c-format
-msgid "Don't send nasty emails (flames). If you get one, don't write back."
-msgstr "No envíe mensajes desagradables. Si recibe alguno, mejor no lo responda."
-
-#: index.docbook:1357
-#, no-c-format
-msgid ""
-"Don't send spam or forward chain mail. If you must, watch out for hoaxes and "
-"urban legends, and make sure the message doesn't have multiple layers of "
-"greater-than signs, (&gt;) indicating multiple layers of careless in-line "
-"forwarding."
-msgstr ""
-"No envíe «spam» o reenvíe los mensajes en cadena. Y si tiene que hacerlo, cuídese de "
-"mensajes en broma o de leyendas urbanas y asegúrese de que el mensaje no tiene "
-"varias capas de signos de mayor que (&gt;) que indican sucesivos reenvíos descuidados."
-
-#: index.docbook:1357
-#, no-c-format
-msgid "Don't send spam."
-msgstr "No envíe spam."
-
-#: index.docbook:1357
-#, no-c-format
-msgid ""
-"WRITING IN CAPITAL LETTERS MEANS YOU'RE SHOUTING! Don't write a whole "
-"message in capital letters. It hurts people's ears."
-msgstr ""
-"¡CUANDO ESCRIBE CON MAYÚSCULAS SIGNIFICA QUE ESTà GRITANDO! No escriba "
-"mensajes enteros con mayúsculas porque a la gente le dolerán los oídos."
-
-#: index.docbook:1357
-#, no-c-format
-msgid ""
-"When you reply or forward, include just enough of the previous message to "
-"provide context: not too much, not too little."
-msgstr ""
-"Cuando conteste o reenvíe un mensaje incluya del mensaje anterior lo justo para "
-"proveer del contexto necesario: ni mucho ni poco."
-
-#: index.docbook:1365
-#, no-c-format
-msgid ""
-"Here's what the mailer looks like: <figure id=\"usage-mail-intro-fig\"> "
-"<title>Ximian Evolution Mail</title> <screenshot> <screeninfo>Inbox</"
-"screeninfo> <mediaobject><imageobject><imagedata fileref=\"figures/mail-inbox"
-"\" format=\"PNG\" srccredit=\"Aaron Weber\"/> </imageobject></mediaobject> </"
-"screenshot> </figure>"
-msgstr ""
-"Este es el aspecto que tiene el editor de correo: <figure id=\"usage-mail-intro-fig\"> "
-"<title>Correo en Ximian Evolution</title> <screenshot> "
-"<screeninfo>Bandeja de entrada</screeninfo> <mediaobject><imageobject><imagedata "
-"fileref=\"figures/mail-inbox\" format=\"PNG\" srccredit=\"Aaron Weber\"/> </"
-"imageobject></mediaobject> </screenshot> </figure>"
-
-#: index.docbook:1380
-#, no-c-format
-msgid "Message List"
-msgstr "Visor de correo"
-
-#: index.docbook:1385
-#, no-c-format
-msgid ""
-"The <guilabel>Message List</guilabel> displays all the emails that you have. "
-"This includes all your read, unread, and email that is flagged to be deleted."
-msgstr "Aquí es donde se presentan los mensajes para su lectura."
-
-#: index.docbook:1391
-#, no-c-format
-msgid "Email Viewer"
-msgstr "Liste de mensajes"
-
-#: index.docbook:1397
-#, no-c-format
-msgid "This is where your email is displayed."
-msgstr ""
-"La <guilabel>lista de mensajes</guilabel> muestra todos los mensajes que "
-"tiene. Esto incluye los que mensajes ya leídos, sin leer o marcados para su "
-"borrado."
-
-#: index.docbook:1401
-#, no-c-format
-msgid ""
-"If you find the <interface>view pane</interface> too small, you can resize "
-"the pane, enlarge the whole window, or double-click on the message in the "
-"<interface>message list</interface> to have it open in a new window. To "
-"change the sizes of a pane, just click and hold on the divider between the "
-"two panes. Then you can drag up and down to select the size of the panes."
-msgstr ""
-"Si le parece que el <interface>panel de previsualización</interface> es "
-"demasiado pequeño, puede cambiar su tamaño, aumentar la ventana "
-"completamente o hacer doble clic sobre el mensaje en la <interface>lista de "
-"mensajes</interface> para abrirlo en una ventana aislada. Para cambiar los "
-"tamaños de un panel sólo hay que hacer clic en la línea divisoria y "
-"arrastrarla arriba y abajo hasta la posición deseada."
-
-#: index.docbook:1410
-#, no-c-format
-msgid ""
-"Just like with folders, you can right-click on messages in the message list "
-"and get a menu of possible actions: you can move, delete, or undelete them, "
-"and create filters or vFolders based on them."
-msgstr ""
-"Como con las carpetas, puede hacer clic con el botón derecho sobre los "
-"mensajes de la lista y obtener un menú con todas las acciones posibles: "
-"mover, borrar o recuperarlo, crear carpetas virtuales y filtros basados en "
-"ellos."
-
-#: index.docbook:1415
-#, no-c-format
-msgid ""
-"Most of the mail-related actions you'll want to perform are listed in the "
-"<guimenu>Actions</guimenu> menu in the menu bar. The most frequently used "
-"ones, like <guimenuitem>Reply</guimenuitem> and <guimenuitem>Forward</"
-"guimenuitem>, also appear as buttons in the toolbar. Almost all of them are "
-"also located in the right-click menu and as keyboard shortcuts, which tend "
-"to be faster once you get the hang of them. You can choose whichever way you "
-"like best; the idea is that the software should work the way you want, "
-"rather than making you work the way the it does."
-msgstr ""
-"Muchas de las acciones más frecuentes relacionadas con los mensajes aparecen "
-"en el menú <guimenu>Acciones</guimenu> de la barra del menú. Los más "
-"frecuentes como <guimenuitem>Responder</guimenuitem> o "
-"<guimenuitem>Reenviar</guimenuitem> también aparecen como botones en la "
-"barra de herramientas. La mayoría de ellos también aparecen también en el "
-"menú contextual (con el botón derecho) y como atajos de teclado, a los que "
-"se acostumbrará pronto por su rapidez. Utilice el método que le resulte más "
-"cómodo: la idea es que el software debe adaptarse al usuario, y no a la "
-"inversa."
-
-# #-#-#-#-# usage-exchange.po #-#-#-#-#
-# index.docbook:342, index.docbook:514
-#: index.docbook:1421
-#, no-c-format
-msgid "RSVPs in Mail"
-msgstr "Envío de confirmaciones de asistencia por correo"
-
-#: index.docbook:1422
-#, no-c-format
-msgid ""
-"If you create an event in the calendar component, you can then send "
-"invitations to the attendee list through the <application>Ximian Evolution</"
-"application> email tool. The invitation card is sent as an attachment in "
-"iCal format."
-msgstr ""
-"Al crear un evento en la agenda puede enviar invitaciones por correo electrónico"
-"a la lista de invitados. Las invitaciones se envían como archivos adjuntos en formato iCal."
-
-#: index.docbook:1428
-#, no-c-format
-msgid ""
-"If you click on the attachment button and click the <guibutton>View Inline</"
-"guibutton>, <application>Ximian Evolution</application> will show you "
-"information about the meeting, and let you respond to the meeting in several "
-"ways. Select the response that you would like, and then click the "
-"<guibutton>OK</guibutton> button."
-msgstr ""
-"Si pincha sobre el botón del adjunto y elije <guimenuitem>Ver incluido</guimenuitem>,"
-"<application>Ximian Evolution</application> mostrará los datos de la reunión y le permitirá "
-" dar su respuesta a la convocatoria. Elija la respuesta y pulse en "
-"<guibutton>Aceptar</guibutton>."
-
-#: index.docbook:1429
-#, no-c-format
-msgid ""
-"For an in-depth guide to the email capabilities of Ximian Evolution, read "
-"<xref linkend=\"usage-mail\"/>."
-msgstr ""
-"Para saber más sobre las posibilidades de uso del correo electrónico de "
-"Ximian Evolution, consulte <xref linkend=\"usage-mail\"/>."
-
-#: index.docbook:1435
-#, no-c-format
-msgid "Introducing the Calendar"
-msgstr "Introducción al Calendario"
-
-#: index.docbook:1436
-#, no-c-format
-msgid "Accept"
-msgstr "Aceptar"
-
-#: index.docbook:1436
-#, no-c-format
-msgid ""
-"Check this box if you would like your response sent to the meeting "
-"organizers."
-msgstr "Marque esta casilla si quiere que su respuesta llegue a los organizadores de la reunión."
-
-#: index.docbook:1436
-#, no-c-format
-msgid "Decline"
-msgstr "Rehusar"
-
-#: index.docbook:1436
-#, no-c-format
-msgid "RSVP"
-msgstr "RSVP (confirmación de asistencia)"
-
-#: index.docbook:1436
-#, no-c-format
-msgid ""
-"Select this entry if you will attend the meeting. When you click the "
-"<guibutton>OK</guibutton> button, the meeting will be entered into your "
-"calendar."
-msgstr ""
-"Elija su respuesta y pulse el botón<guibutton> Aceptar</guibutton> para que la reunión "
-"se apunte en el calendario de su agenda."
-
-#: index.docbook:1436
-#, no-c-format
-msgid ""
-"Select this entry if you will probably attend the meeting. When you click "
-"the <guibutton>OK</guibutton> button, the meeting will be entered into your "
-"calendar, but marked as tentative."
-msgstr ""
-"Elija esta opción si es probable que asista a la reunión. Cuando pulse "
-"<guibutton>Aceptar</guibutton> la reunión se apuntará en su agenda, pero marcada como "
-"provisional."
-
-#: index.docbook:1436
-#, no-c-format
-msgid ""
-"Select this item if you will be unable to attend the meeting. The meeting "
-"will not be entered into your calendar when you click the <guibutton>OK</"
-"guibutton>, although your response will be sent to the meeting host if you "
-"have checked the <guilabel>RSVP</guilabel> box."
-msgstr ""
-"Elija esta opción si no va a poder asistir a la reunión. AL pulsar"
-"<guibutton>Aceptar</guibutton> no se anotará en su agenda pero si ha marcado la casilla "
-"<guilabel>Confirmar</guilabel> se enviará automáticamente un mensaje con su respuesta."
-
-#: index.docbook:1436
-#, no-c-format
-msgid "Tentatively Accept"
-msgstr "Aceptado provisionalmente"
-
-#: index.docbook:1436
-#, no-c-format
-msgid ""
-"To begin using the calendar, select <guibutton>Calendar</guibutton> from the "
-"<interface>shortcut bar</interface>. By default, the calendar starts showing "
-"today's schedule on a ruled background. At the upper right, there's a "
-"monthly calendar you can use to switch days. Below that, there's a "
-"<guilabel>Task</guilabel> pad, where you can keep a list of tasks separate "
-"from your calendar appointments. The day view in the calendar looks like "
-"this: <figure id=\"usage-calendar-fig\"> <title>Ximian Evolution Calendar "
-"View</title> <screenshot> <screeninfo>Ximian Evolution Contact Manager "
-"Window</screeninfo> <mediaobject><imageobject><imagedata fileref=\"figures/"
-"calendar\" format=\"PNG\" srccredit=\"Aaron Weber\"/> </imageobject></"
-"mediaobject> </screenshot> </figure>"
-msgstr ""
-"Para abrir el calendario haga clic en <guibutton>Calendario</guibutton> en "
-"la <interface>barra de atajos</interface>. En la configuración "
-"predeterminada, el calendario muestra la planificación del día sobre un "
-"fondo de renglones. En la parte superior derecha, un calendario mensual "
-"permite cambiar de día. En la parte inferior, una libreta de "
-"<guilabel>Tareas</guilabel> le permite administrar una lista de tareas "
-"separadas de las citas del calendario. La vista del día en el calendario "
-"tiene el aspecto similar al siguiente: <figure id=\"usage-calendar-fig\"> "
-"<title>Vista de contactos de Ximian Evolution</title> <screenshot> "
-"<screeninfo>Ventana del administrador de contactos de Ximian Evolution</"
-"screeninfo> <mediaobject><imageobject><imagedata fileref=\"figures/calendar"
-"\" format=\"PNG\" srccredit=\"Aaron Weber\"/> </imageobject></mediaobject> </"
-"screenshot> </figure>"
-
-#: index.docbook:1436
-#, no-c-format
-msgid "Your options are:"
-msgstr "Sus opciones con:"
-
-#: index.docbook:1459
-#, no-c-format
-msgid "Appointment List"
-msgstr "Lista de citas"
-
-#: index.docbook:1465
-#, no-c-format
-msgid ""
-"The <guilabel>Appointment List</guilabel> is responsible for showing you all "
-"of your scheduled appointments, whether they are all day appointments or "
-"simply one time appointments that last a half an hour."
-msgstr ""
-"La <guilabel>lista de citas</guilabel> es la encargada de mostrar todas las "
-"citas que tiene planificadas, tanto si son de un día completo como si son "
-"citas puntuales de menos de media hora."
-
-#: index.docbook:1471
-#, no-c-format
-msgid "Task List"
-msgstr "Lista de tareas"
-
-#: index.docbook:1476
-#, no-c-format
-msgid ""
-"The <guilabel>Task List</guilabel> compliments the <guilabel>Appointment "
-"List </guilabel> as it keeps track of tasks which don't have a time "
-"associated with them. Tasks can have complex notes associated with them, and "
-"you can also note their completeness on a percentage scale. To display more "
-"information about your notes, drag the column border to the left."
-msgstr ""
-"La <guilabel>lista de tareas</guilabel> complementa a la <guilabel>lista de "
-"citas </guilabel> ya que mantiene las tareas que no tienen una fecha "
-"asociada. Las tareas pueden tener asociadas notas complejas y puede anotar el estado del "
-"avance de cada una usando un porcentaje."
-
-#: index.docbook:1486
-#, no-c-format
-msgid "Month Pane"
-msgstr "Mes"
-
-#: index.docbook:1489
-#, no-c-format
-msgid "Subscription Management"
-msgstr "Gestión de suscripciones"
-
-#: index.docbook:1490
-#, no-c-format
-msgid ""
-"Since IMAP folders exist on the server, and opening them or checking them "
-"takes time, you need fine-grained control over the way that you use IMAP "
-"folders. That's why <application>Evolution</application> has an IMAP "
-"subscriptions manager. If you prefer to have every mail folder displayed, "
-"you can select that option as well. However, if you'd like to choose "
-"specific items in your mailbox, and exclude others, you can use the "
-"subscription management tool to do that."
-msgstr ""
-"Dado que las carpetas IMAP están en el servidor y que abrirlas y cerrarlas toma su tiempo, "
-"necesita un control muy fino en la manera de gestionarlas. Por eso <application>Evolution</application> "
-"tiene un gestor de suscripciones IMAP. Si quiere que se le muestren todas las carpetas "
-"de correo también puede elegir esa opción, sin embargo, si quiere escoger elementos "
-"específicos y excluir el resto, puede usar la herramienta de gestión de suscripciones."
-
-#: index.docbook:1491
-#, no-c-format
-msgid ""
-"The month pane is a small view of your calendar by month. To display more "
-"months here, drag the column border to the left. If you select a range of "
-"days in the month pane they will be displayed <guilabel>Appointment List</"
-"guilabel>."
-msgstr ""
-"En el panel del mes se muestra una pequeña vista mensual de su calendario. Para ver "
-"más meses arrastre hacia la izquierda la columna que lo delimita. Si en este panel selecciona"
-"un rango de días con el ratón, podrá ver a su derecha la lista de eventos que tiene "
-"planificados."
-
-#: index.docbook:1498
-#, no-c-format
-msgid ""
-"For more information about the calendar read <xref linkend=\"usage-calendar"
-"\"/>."
-msgstr "Para saber más acerca del calendario lea <xref linkend=\"usage-calendar\"/>."
-
-#: index.docbook:1500
-#, no-c-format
-msgid "Click the <guibutton>Subscribe</guibutton> to add it to the subscribed list."
-msgstr ""
-"Pinche en <guibutton>Suscribir</guibutton> para añadir el elemento a su lista de "
-"suscripción."
-
-#: index.docbook:1500
-#, no-c-format
-msgid "Here's how:"
-msgstr "He aquí como:"
-
-#: index.docbook:1500
-#, no-c-format
-msgid ""
-"If you have accounts on multiple IMAP servers, select the server where you'd "
-"like to manage your subscriptions. <application>Evolution</application> will "
-"display a list of available files and folders."
-msgstr ""
-"Si tiene cuentas en varios servidores IMAP, elija el servidor donde quiere gestionar sus "
-"suscripciones y <application>Evolution</application> mostrará la lista de carpetas y "
-"archivos disponibles."
-
-#: index.docbook:1500
-#, no-c-format
-msgid ""
-"Select <menuchoice><guimenu>Tools</guimenu><guimenuitem>Subscribe to "
-"Folders</guimenuitem></menuchoice>."
-msgstr ""
-"Seleccione <menuchoice><guimenu>Herramientas</guimenu><guimenuitem>Suscribirse "
-"a carpetas</guimenuitem></menuchoice>."
-
-#: index.docbook:1500
-#, no-c-format
-msgid ""
-"Select a file or folder by clicking on it. You will want to select at least "
-"the <guilabel>INBOX</guilabel> folder. Depending upon the way your IMAP "
-"server is configured, the list of available files may include non-mail "
-"folders. If it does, you can ignore them."
-msgstr ""
-"Para elegir un archivo o una carpeta pínchelos con el ratón. Al menos necesitará "
-"seleccionar la carpeta <guilabel>Bandeja de entrada</guilabel>. En función de cómo "
-"esté configurado su servidor IMAP la lista de ficheros puede incluir carpetas que no "
-"son de correo, que puede ignorar sin más problema. "
-
-#: index.docbook:1500
-#, no-c-format
-msgid "When you have subscribed to the folders you want, close the window."
-msgstr "Cierre la ventana cuando se haya suscrito a las carpetas que desea."
-
-#: index.docbook:1505
-#, no-c-format
-msgid "Introducing the Address Book"
-msgstr "Introducción al administrador de contactos"
-
-#: index.docbook:1506
-#, no-c-format
-msgid ""
-"The <application>Ximian Evolution</application> address book can handle all "
-"of the functions of an address book, phone book, or Rolodex. Of course, it's "
-"a lot easier to update <application>Ximian Evolution</application> than it "
-"is to change an actual paper book. <application>Ximian Evolution</"
-"application> also allows easy synchronization with hand-held devices and "
-"functions with <glossterm linkend=\"ldap\">LDAP</glossterm> directories on a "
-"network."
-msgstr ""
-"La libreta de direcciones de <application>Ximian Evolution</application> "
-"puede manejar todas las funciones de libreta de direcciones, listín "
-"telefónico o tarjetero. Por supuesto es mucho más fácil actualizar "
-"<application>Ximian Evolution</application> que hacerlo en un libro de papel "
-"de verdad. <application>Ximian Evolution</application> también permite la "
-"fácil sincronización con dispositivos de mano y funciona con directorios "
-"<glossterm linkend=\"ldap\">LDAP</glossterm> conectados a la red."
-
-#: index.docbook:1516
-#, no-c-format
-msgid ""
-"Another advantage of the <application>Ximian Evolution</application> address "
-"book is its integration with the rest of the application. For example, you "
-"can create an address card from an email just by right-clicking on the "
-"sender's email address."
-msgstr ""
-"Otra ventaja de la libreta de direcciones de <application>Ximian Evolution</"
-"application> es su integración con el resto de la aplicación. Por ejemplo "
-"puede crear una tarjeta de visita a partir de un mensaje de correo sólo "
-"pinchando con el botón derecho sobre la dirección del remitente del mensaje."
-
-#: index.docbook:1522
-#, no-c-format
-msgid ""
-"To open your address book, click on <guibutton>Contacts</guibutton> in the "
-"shortcut bar, or select one of your contacts folders from the folder bar. "
-"<xref linkend=\"usage-contact-fig\"/> shows the address book in all its "
-"organizational glory. By default, the address book shows all your cards in "
-"alphabetical order, in a <glossterm linkend=\"minicard\">minicard</"
-"glossterm> view. You can select other views from the <guimenu>View</guimenu> "
-"menu, and adjust the width of the columns by clicking and dragging the gray "
-"column dividers."
-msgstr ""
-"Para abrir su libreta de direcciones, haga clic en <guibutton>Contactos</"
-"guibutton> en la barra de atajos o elija una de las carpetas de contactos en "
-"la barra de carpetas. En <xref linkend=\"usage-contact-fig\"/> podrá ver una "
-"reproducción de la libreta de direcciones con todas sus posibilidades de "
-"organización. En su configuración predeterminada, la libreta muestra todas "
-"sus tarjetas en orden alfabético en la vista de <glossterm linkend=\"minicard"
-"\">minitarjetas</glossterm>. Puede elegir otras vistas desde el menú "
-"<guimenu>Vistas</guimenu> y ajustar el ancho de las columnas si hace clic y "
-"arrastra las columnas divisorias grises."
-
-#: index.docbook:1534
-#, no-c-format
-msgid ""
-"The address book looks like this: <figure id=\"usage-contact-fig\"> "
-"<title>Ximian Evolution Contact Interface</title> <screenshot> "
-"<screeninfo>Ximian Evolution Contact List Window</screeninfo> "
-"<mediaobject><imageobject><imagedata fileref=\"figures/contact\" format=\"PNG"
-"\" srccredit=\"Kevin Breit\"/> </imageobject></mediaobject> </screenshot> </"
-"figure>"
-msgstr ""
-"La libreta de direcciones se parece a esto: <figure id="
-"\"usage-contact-fig\"> <title>Interfaz de contactos de Ximian Evolution</"
-"title> <screenshot> <screeninfo>Ventana de lista de contactos de Ximian "
-"Evolution</screeninfo> <mediaobject><imageobject><imagedata fileref="
-"\"figures/contact\" format=\"PNG\" srccredit=\"Kevin Breit\"/> </"
-"imageobject></mediaobject> </screenshot> </figure>"
-
-#: index.docbook:1546
-#, no-c-format
-msgid "Contact List"
-msgstr "Lista de contactos"
-
-#: index.docbook:1548
-#, no-c-format
-msgid "Encryption"
-msgstr "Cifrado"
-
-#: index.docbook:1550
-#, no-c-format
-msgid "What is Encryption?"
-msgstr "¿Qué es el cifrado?"
-
-#: index.docbook:1551
-#, no-c-format
-msgid ""
-"Encryption is an ancient method of keeping information safe from prying "
-"eyes. <application>Evolution</application> helps you you protect your "
-"privacy by using <application>gpg</application>, an implementation of strong "
-"<glossterm linkend=\"public-key-encryption\">Public Key Encryption.</"
-"glossterm>"
-msgstr ""
-"El cifrado es un antiguo método para proteger la información de las miradas curiosas. "
-"<application>Evolution</application> le ayuda a proteger su privacidad haciendo uso de "
-"la aplicación <application>gpg</application>, que es una implementación "
-"del poderoso algoritmo de <glossterm linkend=\"public-key-encryption\">cifrado de clave pública.</"
-"glossterm>"
-
-#: index.docbook:1552
-#, no-c-format
-msgid ""
-"The <guilabel>Contact List</guilabel> lists your contact cards. You can also "
-"search through the cards in the same way that you search email folders, with "
-"the search bar just above the contact list."
-msgstr ""
-"La <guilabel>Lista de contactos</guilabel> muestra todas las tarjetas de visita que tiene. "
-"También le permite buscar entre ellas de la misma manera que con las carpetas de correo, "
-"usando la barra de búsqueda que está justo encima."
-
-#: index.docbook:1559
-#, no-c-format
-msgid "Alphanumeric Shortcuts"
-msgstr "Atajos alfanuméricos"
-
-#: index.docbook:1560
-#, no-c-format
-msgid ""
-"GPG uses two keys: public and private. You can give your public key to "
-"anyone you want to receive encrypted messages, or put it on a public key "
-"server so that people can look it up before contacting you. <emphasis>Never "
-"give your private key to anyone, ever</emphasis>. Your private key lets you "
-"decrypt any message encrypted with your public key."
-msgstr ""
-"GPG usa dos claves: una pública y otra privada. Puede darle su clave pública a cualquiera "
-"del que quiera recibir mensajes cifrados o puede ponerla en un servidor de claves públicas "
-"para que cualquiera pueda mirar allí antes de escribirle. <emphasis>Nunca jamás le de a "
-"nadie su clave privada</emphasis>. La clave privada es la que le permite descifrar "
-"cualquier mensaje cifrado con su clave pública."
-
-#: index.docbook:1560
-#, no-c-format
-msgid "Public Key? Private Key? What is the difference?"
-msgstr "¿Clave pública? ¿Privada? ¿Cuál es la diferencia?"
-
-#: index.docbook:1563
-#, no-c-format
-msgid ""
-"Click one of the buttons along the right side of the window to view contacts "
-"that begin with the letter or number you click."
-msgstr ""
-"Haga clic en uno de los botones a lo largo del lado derecho de la ventana para ver "
-"los contactos que empiezan por la letra o el número elegido."
-
-#: index.docbook:1569
-#, no-c-format
-msgid ""
-"For detailed instructions on how to use the address book, read <xref linkend="
-"\"usage-contact\"/>."
-msgstr ""
-"For detailed instructions on how to use the address book, read <xref linkend="
-"\"usage-contact\"/>."
-
-#: index.docbook:1573
-#, no-c-format
-msgid ""
-"Using encryption takes a bit of forethought. When you send a message that is "
-"encrypted, you must encrypt it using your intended recipient's public key. "
-"To <emphasis>get</emphasis> an encrypted message, you must make sure that "
-"the sender has your public key in advance. For signing messages, it's "
-"reversed: you encrypt the signature with your private key, so only your "
-"public key can unlock it. When you send it, the recipient gets your public "
-"key and unlocks the signature, verifying your identity."
-msgstr ""
-"Enviar correo cifrado exige un poco de previsión. Para mandar un mensaje cifrado "
-"necesita usar la clave pública del destinatario a quien pretende enviarlo. Para poder recibir y"
-"<emphasis>leer</emphasis> un mensaje es preciso que el remitente tenga su clave "
-"pública (la suya, de usted). Para firmar mensajes ocurre el inverso: usted cifra la firma "
-"del mensaje con su clave privada de manera que solamente su clave pública puede "
-"desvelar la firma. Cuando envía el mensaje, el destinatario toma su clave pñublica, "
-"desvela la firma y verifica su identidad."
-
-#: index.docbook:1585
-#, no-c-format
-msgid ""
-"Attach an encrypted signature to a plain text message, so that the recipient "
-"can read the message without decrypting it, and only needs decryption to "
-"verify the sender's identity."
-msgstr ""
-"Adjuntar una firma cifrada a un mensaje de puro texto, para que el recipiente "
-"pueda leer el mensaje sin tener que descifrarlo. Sólo necesitaría descifrar la firma "
-"cuando quiera verificar la identidad del remitente."
-
-#: index.docbook:1585
-#, no-c-format
-msgid "Encrypt the entire message, so that nobody but the recipient can read it."
-msgstr "Cifre el mensaje entero para que nadie, excepto el destinatario, pueda leerlo."
-
-#: index.docbook:1585
-#, no-c-format
-msgid "You can use encryption in two different ways:"
-msgstr "El cifrado puede usarse de dos maneras diferentes:"
-
-#: index.docbook:1600
-#, no-c-format
-msgid ""
-"Kevin wants to send an encrypted message to his friend Rachel. He looks up "
-"her public key on a general key server, and then tells "
-"<application>Evolution</application> to encrypt the message. The message now "
-"reads \"@#$23ui7yr87#@!48970fsd.\" When the information gets to Rachel, she "
-"decrypts it using her private key, and it appears as plain text for her to "
-"read."
-msgstr ""
-"Kevin quiere enviar un mensaje cifrado a su amiga Rachel. Él busca su clave pública en "
-"un servidor público y entonces le pide a <application>Evolution</application> que cifra "
-"el mensaje. El mensaje ahora tiene una apariencia del estilo «@#$23ui7yr87#@!48970fsd». "
-"Cuando llega a Rachel, ella usa su clave privada para descifrarlo y el mensaje quedará listo "
-"para su lectura."
-
-#: index.docbook:1600
-#, no-c-format
-msgid "Sending an Encrypted Message"
-msgstr "Enviar un mensaje cifrado"
-
-#: index.docbook:1613
-#, no-c-format
-msgid "Always Sign"
-msgstr "Firme siempre"
-
-# index.docbook:172, index.docbook:216
-#: index.docbook:1613
-#, no-c-format
-msgid ""
-"Click the <guibutton>Always sign outgoing messages when using this account</"
-"guibutton> button."
-msgstr ""
-"Pinche en el botón <guibutton>Firmar siempre el correo saliente al usar esta cuenta "
-"</guibutton>. "
-
-#: index.docbook:1613
-#, no-c-format
-msgid "Open the <guilabel>Security</guilabel> tab."
-msgstr "Abra la solapa<guilabel>Seguridad</guilabel>."
-
-#: index.docbook:1613
-#, no-c-format
-msgid ""
-"Select <menuchoice> <guimenu>Tools</guimenu> <guimenuitem>Settings</"
-"guimenuitem> </menuchoice>, go to the Mail Account settings, and select the "
-"account with which you want to use encryption."
-msgstr ""
-"Elija <menuchoice> <guimenu>Herramientas</guimenu> "
-"<guimenuitem>Configuración</guimenuitem> </menuchoice>, vaya a <guiicon>Cuentas "
-"de correo</guiicon> y elija la cuenta en la que quiere usar las funciones de cifrado."
-
-#: index.docbook:1613
-#, no-c-format
-msgid ""
-"You can set <application>Evolution</application> to always sign your email "
-"messages:"
-msgstr ""
-"Puede configurar <application>Evolution</application> para que firme siempre "
-"sus mensajes de correo electrónico:"
-
-#: index.docbook:1646
-#, no-c-format
-msgid "Making Encryption Keys"
-msgstr "Crear claves de cifrado"
-
-#: index.docbook:1647
-#, no-c-format
-msgid ""
-"Before you can get or send encrypted mail, you need to generate your public "
-"and private keys with GPG. Here's how:"
-msgstr ""
-"Antes de poder enviar o recibir correo cifrado necesita generar sus claves privada "
-"y pública usando GPG. He aquí cómo:"
-
-#: index.docbook:1651
-#, no-c-format
-msgid "GPG Versions"
-msgstr "Versiones de GPG"
-
-#: index.docbook:1651
-#, no-c-format
-msgid ""
-"This manual covers version 1.0.6 of GPG. If your version is different, this "
-"may not be entirely accurate. You may find out your version number by typing "
-"in the command: <command>gpg --version</command>."
-msgstr ""
-"Este manual describe la versión 1.0.6 de <application>GPG</application>. Si su "
-"versión es diferente puede que este texto no sea completamente exacto. Puede "
-"averiguar la versión exacta usando la orden <command>gpg --version</command>."
-
-#: index.docbook:1660
-#, no-c-format
-msgid "Choose a key length. The default, 1024 bits, should be long enough."
-msgstr ""
-"Elija el tamaño de su clave. La predeterminada es de 1024 bits, lo que debería ser "
-"suficiente."
-
-#: index.docbook:1660
-#, no-c-format
-msgid "Choose the default algorithm, \"DSA and ElGamal.\""
-msgstr "Elija el algoritmo predeterminado, «DSA y ElGamal»."
-
-#: index.docbook:1660
-#, no-c-format
-msgid "Decide if you want your key to expire automatically, and if so, when."
-msgstr "Especifique si quiere que su clave caduque, y en caso positivo, cuándo."
-
-#: index.docbook:1660
-#, no-c-format
-msgid ""
-"Enter your name, email address, and any additional personal information you "
-"think is appropriate. Do not falsify this information, because it will be "
-"needed to verify your identity later on."
-msgstr ""
-"Escriba su nombre, su dirección de correo y cualquier otro dato personal que "
-"crea que es apropiado. No falsifique esta información porque será necesaria "
-"para poder identificar después su identidad."
-
-#: index.docbook:1660
-#, no-c-format
-msgid ""
-"Next, enter your passphrase. It does not have to be the same as your email "
-"password or your login password. In fact, it probably shouldn't. Don't "
-"forget it. If you lose it, your keys will be useless and you will be unable "
-"to decrypt messages sent to you with those keys."
-msgstr ""
-"Siguiente, escriba el santo y seña. No tiene por qué ser igual que la contraseña de su "
-"buzón de correo o la que usa para identificar en el sistema. En realidad, probablemente "
-"debería ser diferente. No la olvide. Si la pierde, sus claves serán inútiles del todo y no podrá "
-"descifrar los mensajes que le manden usando esas claves."
-
-#: index.docbook:1660
-#, no-c-format
-msgid ""
-"Now, GPG will generate your keys. This may take awhile, so feel free to do "
-"something else while it's happening. In fact, using your computer for "
-"something else actually helps to generate better keys, because it increases "
-"the randomness in the key generation seeds."
-msgstr ""
-"Ahora GPG generará sus claves. Esto puede tardar un rato, así que aproveche para "
-"hacer alguna otra cosa mientras. En realidad, usar el sistema para otros asuntos genera "
-"mejores claves porque el uso aumenta la aleatoriedad matemática en la semilla del "
-"generador de claves."
-
-#: index.docbook:1660
-#, no-c-format
-msgid "Open a terminal and type <command>gpg --gen-key</command>."
-msgstr "Abra una terminal y escriba la orden <command>gpg --gen-key</command>."
-
-#: index.docbook:1718
-#, no-c-format
-msgid ""
-"/home/you/.gnupg/pubring.gpg\n"
-" ----------------------------\n"
-" pub 1024D/32j38dk2 2001-06-20 you &lt;you@your-address.com&gt;\n"
-" sub 1024g/289sklj3 2001-06-20 [expires: 2002-11-14]"
-msgstr ""
-"/home/you/.gnupg/pubring.gpg\n"
-" ----------------------------\n"
-" pub 1024D/32j38dk2 2001-06-20 you &lt;you@your-address.com&gt;\n"
-" sub 1024g/289sklj3 2001-06-20 [expires: 2002-11-14]"
-
-#: index.docbook:1718
-#, no-c-format
-msgid ""
-"Once the keys are generated, you can view your key information by typing "
-"<command>gpg --list-keys</command>. You should see something similar to this:"
-msgstr ""
-"Una vez que las claves están generadas puede ver los datos de las mismas con"
-"<command>gpg --list-keys</command>. Verá algo parecido a esto:"
-
-#: index.docbook:1729
-#, no-c-format
-msgid ""
-"GPG will create one list, or keyring, for your public keys and one for your "
-"private keys. All the public keys you know are stored in the file "
-"<filename>~/.gnupg/pubring.gpg</filename>. If you want to give other people "
-"your key, send them that file."
-msgstr ""
-"GPG creará una lista, o llavero, con todas las claves públicas que tenga y otra para las "
-"privadas. Todas las claves públicas que conoce están guardadas en en "
-"<filename>~/.gnupg/pubring.gpg</filename>. Si quiere darle a alguien su clave, envíele "
-"este fichero."
-
-#: index.docbook:1736
-#, no-c-format
-msgid ""
-"Check your public key ID with <command>gpg --list-keys</command>. It will be "
-"the string after 1024D on the line beginning with \"pub.\" In this example, "
-"it's 32j38dk2."
-msgstr ""
-"Compruebe su identificador de clave pública con"
-"<command>gpg --list-keys</command>. Su identificador será la cadena "
-"que está detras de 1024D en la línea que empieza con «pub». En estte ejemplo "
-"es 32j38dk2."
-
-#: index.docbook:1736
-#, no-c-format
-msgid ""
-"Enter the command <command>gpg --send-keys --keyserver wwwkeys.pgp.net "
-"32j38dk2</command>. Substitute your key ID for 32j38dk2. You will need your "
-"password to do this."
-msgstr ""
-"Escirba la orden <command>gpg --send-keys --keyserver wwwkeys.pgp.net "
-"32j38dk2</command>. Substituya el identificador de su clave por "
-" 32j38dk2. Necesitará su contraseña para poder hacerlo."
-
-#: index.docbook:1736
-#, no-c-format
-msgid ""
-"If you don't have a key you need to unlock or encrypt a message, you can "
-"have your encryption tool set to look it up automatically. If it can't find "
-"the key, then you'll get an error message."
-msgstr ""
-
-#: index.docbook:1736
-#, no-c-format
-msgid "If you wish, you can upload your keys to a key server. Here's how:"
-msgstr "Si lo desea puede subir sus claves a un servidor de claves:"
-
-#: index.docbook:1736
-#, no-c-format
-msgid ""
-"Key servers store your public keys for you so that your friends can decrypt "
-"your messages. If you choose not to use a key server, you can manually send "
-"your people public key, include it in your signature file, or put it on your "
-"own web page. However, it's easier to publish them once, and then let people "
-"download them from a central place when they want."
-msgstr ""
-"Los servidores de claves almacenan sus claves públicas para que sus amigos "
-"puedan descifrar sus mensajes. Si opta por no usar un servidor de claves, entonces "
-"puede enviarlas manualmente, incluyéndola en el adjunto con la firma, o publicándola en su "
-"propia página web. Sin embargo es más fácil publicarla de una vez y permitir a los demás "
-"descargarlas desde un servidor central cuando ellos quieran."
-
-#: index.docbook:1736
-#, no-c-format
-msgid "Why Use a Key Server?"
-msgstr "¿Por qué usar un servidor de claves?"
-
-#: index.docbook:1779
-#, no-c-format
-msgid "Getting and Using Public Keys"
-msgstr "Obteniendo y usando claves públicas"
-
-#: index.docbook:1780
-#, no-c-format
-msgid ""
-"To encrypt a message to your someone else you'll need to use their public "
-"key in combination with your private key. <application>Evolution</"
-"application> does that for you, but you still need to get their key and add "
-"it to your keyring."
-msgstr ""
-"Para cifrar un mensaje para quien sea, necesitará usar su clave pública en combinación "
-"con su clave privada. <application>Evolution</application> lo hace por usted, pero con todo "
-"necesitará obtener su clave y añadirla a su llavero."
-
-#: index.docbook:1786
-#, no-c-format
-msgid ""
-"To get public keys from a public key server, enter the command: <command> "
-"gpg --recv-keys --keyserver wwwkeys.pgp.net keyid </command>, substituting "
-"\"keyid\" for your recipient's ID. You will need to type in your password, "
-"and then their ID will automatically be added to your keyring. When you send "
-"mail to them, <application>Evolution</application> will allow you to encrypt "
-"your messages."
-msgstr ""
-"Para obtener claves públicas desde un servidor de claves públicas escriba la orden "
-"<command> gpg --recv-keys --keyserver wwwkeys.pgp.net keyid </command>, "
-"substituyendo «keyid» por el identificador del destinatario. Necesitará escribir "
-"su contraseña y su identificador se añadirá automáticamente a su llavero. Cuando le envíe "
-"un mensaje, <application>Evolution</application> le permitirá cifrar sus mensajes."
-
-#: index.docbook:1797
-#, no-c-format
-msgid ""
-"If someone sends you their public key directly, save it as a plain text file "
-"and enter the command <command>gpg filename</command>. This will add it to "
-"your keyring."
-msgstr ""
-"Si alguien le envía directamente su clave pública, guárdela como un fichero de texto puro y "
-"en la terminal escriba la orden <command>gpg nombredelfichero</command>. Así la "
-"añadirá a su llavero."
-
-#: index.docbook:1805
-#, no-c-format
-msgid "Setting up Evolution's Encryption"
-msgstr "Configuración del cifrado en Evolution"
-
-#: index.docbook:1806
-#, no-c-format
-msgid ""
-"You'll need to open <menuchoice> <guimenu>Tools</guimenu> "
-"<guimenuitem>Settings</guimenuitem> </menuchoice> and select the "
-"<guilabel>Mail Accounts</guilabel> button, then select the account you want "
-"to use securely, and click the <guibutton>Edit</guibutton> button. Then, "
-"select the <guilabel>Security</guilabel> tab in the account dialog. In the "
-"<guilabel>Security</guilabel> tab is a section labeled <guilabel>Pretty Good "
-"Privacy</guilabel>. Enter your key ID and click <guibutton>OK</guibutton>. "
-"Your key is now integrated into your identity in <application>Evolution</"
-"application>."
-msgstr ""
-"Tiene que abrir <menuchoice> <guimenu>Herramientas</guimenu> "
-"<guimenuitem>Configuración</guimenuitem> </menuchoice> y pulsar el botón"
-"<guilabel>Cuentas de correo</guilabel>; elija la cuenta que quiere usar con seguridad y "
-"pulse el botón <guibutton>Editar</guibutton>. Abra la solapa <guilabel>Seguridad "
-"</guilabel> y verá una sección llamada <guilabel>Pretty Good "
-"Privacy</guilabel>. Escriba su identificador (ID) y pulse en <guibutton>Aceptar</guibutton>. "
-"Ahora su clave está integrada en su identidad en<application>Evolution</"
-"application>."
-
-#: index.docbook:1822
-#, no-c-format
-msgid ""
-"<application>Evolution</application> requires that you know your key ID. If "
-"you don't remember it, you can find it by typing <command>gpg --list-keys</"
-"command> in a console window. Your key ID will be an eight character string "
-"with random numbers and letters."
-msgstr ""
-"<application> Evolution</application> necesita que usted sepa su identificador (ID) de "
-"clave. Si no lo recuerda puede encontrarlo con la orden <command>gpg --list-keys</"
-"command> en una terminal. El identificador de clave es una cadena de 8 caracteres con "
-"números y letras aleatorios."
-
-#: index.docbook:1822
-#, no-c-format
-msgid "What is my Key ID again?"
-msgstr "De nuevo ¿Qué es mi identificador de clave?"
-
-#: index.docbook:1831
-#, no-c-format
-msgid "Sending Encrypted Messages"
-msgstr "Enviar mensajes cifrados"
-
-#: index.docbook:1832
-#, no-c-format
-msgid ""
-"As you know, you can use encryption to hide the entire message, or just to "
-"verify your signature. Once you've generated your public and private keys, "
-"and have the public keys of the people to whom you want to send mail, here's "
-"what to do:"
-msgstr ""
-"Como sabe, puede cifrar un mensaje para ocultarlo completamente o sólo para verificar "
-"su firma. Una vez que ha generado sus claves privada y pública y dispone de las claves "
-"públicas de la gente a la que quiere mandar mensajes, he aquí lo que hacer:"
-
-#: index.docbook:1842
-#, no-c-format
-msgid "Signing a Message"
-msgstr "Firmar un mensaje"
-
-#: index.docbook:1843
-#, no-c-format
-msgid ""
-"To sign a message, choose: <menuchoice> <guimenu>Security</guimenu> "
-"<guimenuitem>PGP Sign</guimenuitem> </menuchoice> . You will be prompted for "
-"your encryption password. Once you enter it, click <guibutton>OK</guibutton> "
-"and your message will be signed."
-msgstr ""
-"Para firmar un mensaje elija <menuchoice> <guimenu>Seguridad</guimenu> "
-"<guimenuitem>Firmar con PGP</guimenuitem> </menuchoice> . Tendrá que introducir "
-"su contraseña de cifrado. Después pulse <guibutton>Aceptar</guibutton> y su mensaje "
-"será firmado."
-
-#: index.docbook:1856
-#, no-c-format
-msgid "Encrypting a Message"
-msgstr "Cifrar un mensaje"
-
-#: index.docbook:1857
-#, no-c-format
-msgid ""
-"Encrypting a message is very similar to signing a message. Just choose the "
-"menu item <menuchoice> <guimenu>Security</guimenu> <guimenuitem>PGP Encrypt</"
-"guimenuitem> </menuchoice>"
-msgstr ""
-"Cifrar un mensaje es muy parecido a firmarlo. Simplemente abra en el menú "
-"<menuchoice> <guimenu>Seguridad</guimenu> <guimenuitem>Cifrar con PGP</"
-"guimenuitem> </menuchoice>"
-
-#: index.docbook:1867
-#, no-c-format
-msgid "Unencrypting a Received Message"
-msgstr "Descifrar un mensaje recibido"
-
-#: index.docbook:1868
-#, no-c-format
-msgid ""
-"If you get an encrypted message, you will need to decrypt it before you read "
-"it. Remember, the sender has to have your public key before they can send "
-"you an encrypted message."
-msgstr ""
-"Si recibe un mensaje cifrado necesita descifrarlo antes de poder leerlo. Recuerde que "
-"el remitente tiene que tener su clave pública (la suya, de usted) antes de enviarle un "
-"mensaje cifrado."
-
-#: index.docbook:1873
-#, no-c-format
-msgid ""
-"When you view the message, <application>Evolution</application> will ask you "
-"for your PGP password. Enter it, and the message will be displayed properly."
-msgstr ""
-"Cuando vea el mensaje <application>Evolution</application> le pedirá que escriba "
-"su contraseña PGP. Escríbala y el mensaje será mostrado apropiadamente."
-
-#~ msgid "Introduction"
-#~ msgstr "Introducción"
-
-#~ msgid ""
-#~ "Welcome to the users guide for Ximian Evolution and Ximian Connector for "
-#~ "Microsoft Exchange 2000. This section of the manual will tell you a bit "
-#~ "about what you've got waiting for you. First, however, we have some legal "
-#~ "information."
-#~ msgstr ""
-#~ "Bienvenido a la guía de usuario de Ximian Evolution y Ximian Connector "
-#~ "para Microsoft Exchange 2000. Esta sección del manual es una introducción "
-#~ "sobre un producto cuyo nombre adivina. Sin embargo, comenzaremos con algo "
-#~ "información legal."
-
-#~ msgid "Importing Email"
-#~ msgstr "Importación de los mensajes de correo"
-
-#~ msgid ""
-#~ "<application>Ximian Evolution</application> is Free Software. The program "
-#~ "and its source code are released under the terms of the <xref linkend="
-#~ "\"apx-gpl\"/> (GPL) and the documentation falls under the <xref linkend="
-#~ "\"apx-fdl\"/> (FDL). For more information about the GPL and the FDL, "
-#~ "visit the Free Software Foundation's website at <ulink url=\"http://www."
-#~ "fsf.org\">http://www.fsf.org</ulink>."
-#~ msgstr ""
-#~ "<application>Ximian Evolution</application> es software libre. El "
-#~ "programa y su código fuente han sido liberados acogiéndose a los términos "
-#~ "de la licencia <xref linkend=\"apx-gpl\"/> (GPL) y la documentación lo "
-#~ "hace a la <xref linkend=\"apx-fdl\"/> (FDL). Para obtener más información "
-#~ "acerca de ambas licencias puede visitar la web de la Free Software "
-#~ "Foundation en <ulink url=\"http://www.fsf.org\">http://www.fsf.org</"
-#~ "ulink>."
-
-#~ msgid ""
-#~ "Ximian Connector 1.2 has added some of the most frequently requested "
-#~ "features of Microsoft Exchange clients, including Public Folder access "
-#~ "and calendar delegation."
-#~ msgstr ""
-#~ "Ximian Connector 1.2 incluye algunas de las características más "
-#~ "solicitadas de los clientes Microsoft Exchange, como el acceso a carpetas "
-#~ "públicas y la delegación de calendarios."
-
-#~ msgid ""
-#~ "The actual application Ximian Evolution is covered by the GNU General "
-#~ "Public License (GPL), and its source code is available from the GNOME cvs "
-#~ "repository at <ulink url=\"http://cvs.gnome.org\">cvs.gnome.org</ulink>. "
-#~ "You will find a copy of the GPL attached to this document in <xref "
-#~ "linkend=\"apx-gpl\"/>. You may also obtain a copy of the license from the "
-#~ "Free Software Foundation by visiting <ulink type=\"http\" url=\"http://"
-#~ "www.fsf.org\">their Web site</ulink> or by writing to: Free Software "
-#~ "Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA."
-#~ msgstr ""
-#~ "La propia aplicación Ximian Evolution está bajo los auspicios de la "
-#~ "<foreignphrase>GNU General Public License (GPL)</foreignphrase> (Licencia "
-#~ "Pública General de GNU) y su código fuente está disponible en el "
-#~ "repositorio cvs de GNOME en <ulink url=\"http://cvs.gnome.org\">cvs.gnome."
-#~ "org</ulink>. En el apéndice <xref linkend=\"apx-gpl\"/> encontrará una "
-#~ "copia de la misma. También puede obtener una copia en el sitio web de la "
-#~ "<ulink type=\"http\" url=\"http://www.fsf.org\">Free Software Foundation</"
-#~ "ulink> o escriba a: <foreignphrase>Free Software Foundation, Inc., 59 "
-#~ "Temple Place - Suite 330, Boston, MA 02111-1307, USA.</foreignphrase>."
-
-#~ msgid "Direct Booking"
-#~ msgstr "Reserva directa"
-
-#~ msgid "Flag for Followup"
-#~ msgstr "Marca para seguimiento"
-
-#~ msgid ""
-#~ "Flag for Followup now works properly in both Outlook and Evolution, even "
-#~ "when set in one and read in the other."
-#~ msgstr ""
-#~ "La marca para seguimiento no funciona adecuadamente ni en Outlook ni en "
-#~ "Evolution, incluso cuando está activada en uno y se lee en el otro."
-
-#~ msgid "Improved vFolder Support"
-#~ msgstr "Compatibilidad mejorada para carpetas virtuales"
-
-#~ msgid "Preferences Dialogs"
-#~ msgstr "Cuadros de diálogo de preferencias"
-
-#~ msgid "Public Folders, Posting, and Delegation"
-#~ msgstr "Carpetas públicas, exposición y delegación"
-
-#~ msgid ""
-#~ "Public folders, posting to folders, and delegation functions have been "
-#~ "added. You may now set permissions on folders to which you have "
-#~ "appropriate access, and view the folders of other users who have granted "
-#~ "you permission to view them."
-#~ msgstr ""
-#~ "Se incluyen carpetas públicas, exposición y delegación. Es posible "
-#~ "establecer permisos en carpetas si dispone del nivel de acceso apropiado, "
-#~ "así como consultar las carpetas de otros usuarios que le concedieron "
-#~ "permisos para ello."
-
-#~ msgid ""
-#~ "The \"Notes\" and \"Journal\" folders in Exchange accounts are now "
-#~ "readable, and you can drag items into them from other folders. Creating "
-#~ "new Notes or Journal entries is not yet supported."
-#~ msgstr ""
-#~ "Ahora es posible leer las carpetas «Notas» y «Diario» de las cuentas de "
-#~ "Exchange, así como mover elementos entre éstas y otras carpetas. La "
-#~ "función de creación de nuevas Notas o de un nuevo Diario sigue sin "
-#~ "funcionar."
-
-#~ msgid ""
-#~ "The preferences dialogs have been completely overhauled for Evolution and "
-#~ "Connector 1.2. Select <menuchoice><guimenu>Tools</"
-#~ "guimenu><guimenuitem>Preferences</guimenuitem></menuchoice> from the main "
-#~ "Evolution window to change your settings."
-#~ msgstr ""
-#~ "Los cuadros de diálogo de preferencias han sido completamente revisados "
-#~ "para el cliente Evolution y el programa Connector 1.2. Seleccione "
-#~ "<menuchoice><guimenu>Herramientas</guimenu><guimenuitem>Preferencias</"
-#~ "guimenuitem></menuchoice> en la ventana principal de Evolution para "
-#~ "modificar sus preferencias."
-
-#~ msgid ""
-#~ "When creating a meeting request, resources such as rooms and equipment "
-#~ "can be checked and reserved without waiting for a reply."
-#~ msgstr ""
-#~ "Cuando crea una solicitud de reunión, es posible comprobar la "
-#~ "disponibilidad y reservar recursos (salas o equipos, por ejemplo) sin "
-#~ "esperar respuesta."
-
-#~ msgid "vFolders now function better with Exchange accounts."
-#~ msgstr ""
-#~ "Las carpetas virtuales ahora funcionan mejor con las cuentas Exchange."
-
-#~ msgid "Choose the fonts that Evolution will use to display email here."
-#~ msgstr ""
-#~ "Para definir qué tipos de letras usará Evolution al mostrarle el correo."
-
-#~ msgid "Font Preferences"
-#~ msgstr "Tipografías"
-
-#~ msgid ""
-#~ "If you want to use a shared directory server (LDAP server), this is the "
-#~ "place to set it up."
-#~ msgstr ""
-#~ "Si desea utilizar un directorio compartido (un servidor LDAP), este es el "
-#~ "lugar donde configurarlo."
-
-#~ msgid ""
-#~ "Ximian Connector for Microsoft Exchange 2000 is not Free Software. There "
-#~ "are certain restrictions on its usage, and it may not be redistributed. "
-#~ "Before downloading it you must agree to the terms of license, which will "
-#~ "be (or have been) presented to you upon download. You may review the "
-#~ "terms of license for Ximian Connector at <ulink url=\"http://support."
-#~ "ximian.com/q?92\">http://support.ximian.com/q?92</ulink>."
-#~ msgstr ""
-#~ "Ximian Connector para Microsoft Exchange 2000 no es software libre. "
-#~ "Existen ciertas restricciones de uso y no puede redistribuirse. Antes de "
-#~ "descargárselo debe estar de acuerdo con los términos de la licencia que "
-#~ "le serán (o habrán sido) presentados en la descarga. Si quiere revisar "
-#~ "los términos de la licencia de Ximian Connector puede hacerlo en <ulink "
-#~ "url=\"http://support.ximian.com/q?92\">http://support.ximian.com/q?92</"
-#~ "ulink>."
-
-#~ msgid ""
-#~ "See the preface for legal information regarding the GNU General Public "
-#~ "License and Free Documentation License."
-#~ msgstr ""
-#~ "En el prefacio encontrará información acerca de la Licencia Pública "
-#~ "General de GNU y la Licencia de Documentación Libre."
-
-#~ msgid ""
-#~ "This product has been translated into many languages. Some of the "
-#~ "translators are listed here:"
-#~ msgstr ""
-#~ "Este producto ha sido traducido a muchas lenguas. Aquí listamos a algunos "
-#~ "de los traductores:"
-
-#~ msgid ""
-#~ "Click the <guilabel>Use HTTP Proxy</guilabel> checkbox and enter the "
-#~ "location of your HTTP proxy in the <guilabel>Location</guilabel> field."
-#~ msgstr ""
-#~ "Active la casilla <guilabel>Usar proxy HTTP</guilabel> y escriba la "
-#~ "dirección del proxy HTTP en el cuadro de texto <guilabel>Dirección</"
-#~ "guilabel>."
-
-#~ msgid "Configure it with Nautilus"
-#~ msgstr "Configuración con Nautilus"
-
-#~ msgid "Configure it with the gconftool command"
-#~ msgstr "Configuración con la orden gconftool"
-
-#~ msgid ""
-#~ "Enter the command <command> gconftool --type=bool --set /system/gnome-vfs/"
-#~ "use-http-proxy \"TRUE\" </command>"
-#~ msgstr ""
-#~ "Escriba la orden <command> gconftool --type=bool --set /system/gnome-vfs/"
-#~ "use-http-proxy \"TRUE\" </command>"
-
-#~ msgid ""
-#~ "Enter the command <command> gconftool --type=int --set /system/gnome-vfs/"
-#~ "http-proxy-port \"8080\" </command>"
-#~ msgstr ""
-#~ "Escriba la orden <command> gconftool --type=int --set /system/gnome-vfs/"
-#~ "http-proxy-port \"8080\" </command>"
-
-#~ msgid ""
-#~ "Enter the command <command> gconftool --type=string --set /system/gnome-"
-#~ "vfs/http-proxy-host \"your-proxy-url\" </command>"
-#~ msgstr ""
-#~ "Escriba la orden <command> gconftool --type=string --set /system/gnome-"
-#~ "vfs/http-proxy-host \"mi-proxy-url\" </command>"
-
-#~ msgid ""
-#~ "For more information about the gconftool command, read the gconftool man "
-#~ "page."
-#~ msgstr ""
-#~ "Para obtener más información acerca de la orden gconftool, consulte la "
-#~ "página man correspondiente."
-
-#~ msgid "Go to the <guilabel>Navigation</guilabel> tab."
-#~ msgstr "Vaya a la sección <guilabel>Navigación</guilabel>."
-
-#~ msgid "How This Book is Organized"
-#~ msgstr "Cómo está organizado este libro"
-
-#~ msgid "Open a terminal."
-#~ msgstr "Abra una ventana de terminal."
-
-#~ msgid ""
-#~ "Run the command \"gnome-vfs-proxy-capplet\" or select the GNOME VFS Proxy "
-#~ "Configuration tool from your Desktop Preferences menu in the menu panel."
-#~ msgstr ""
-#~ "Ejecute la orden \"gnome-vfs-proxy-capplet\" o elija la herramienta de "
-#~ "configuración de HTTP Proxy en la Configuración de su escritorio en el "
-#~ "menú panel."
-
-#~ msgid ""
-#~ "Select <menuchoice> <guimenu>Preferences</guimenu> <guimenuitem>Edit "
-#~ "Preferences</guimenuitem> </menuchoice>."
-#~ msgstr ""
-#~ "Abra el menú <menuchoice> <guimenu>Preferencias</guimenu> "
-#~ "<guimenuitem>Editar preferencias</guimenuitem> </menuchoice>."
-
-#~ msgid "Use the VFS Proxy Tool"
-#~ msgstr "Uso de la herramienta VFS Proxy"
-
-#~ msgid "Typographical Conventions"
-#~ msgstr "Convenciones tipográficas"
-
-#~ msgid "<command>Commands</command> you type at the command line"
-#~ msgstr "<command>Órdenes</command> que se escriben en la línea de órdenes"
-
-#~ msgid ""
-#~ "<glossterm linkend=\"apx-gloss\">Words</glossterm> that are defined in "
-#~ "the <xref linkend=\"apx-gloss\"/>."
-#~ msgstr ""
-#~ "<glossterm linkend=\"apx-gloss\">Palabras</glossterm> que puedan estar "
-#~ "definidas en el <xref linkend=\"apx-gloss\"/>."
-
-#~ msgid "<guibutton>Buttons</guibutton> you can click"
-#~ msgstr "<guibutton>Botones</guibutton> en los que puede hacer clic"
-
-#~ msgid ""
-#~ "<guilabel>Labels</guilabel> for buttons and other portions of the "
-#~ "graphical interface"
-#~ msgstr ""
-#~ "<guilabel>Etiquetas</guilabel> para botones y otras partes del interfaz "
-#~ "gráfico"
-
-#~ msgid "Anything you type in"
-#~ msgstr "Cualquier cosa que pueda escribir"
-
-#~ msgid "Applications"
-#~ msgstr "Aplicaciones"
-
-#~ msgid "In this book, we'll mark some words with special typography:"
-#~ msgstr ""
-#~ "Determinadas palabras de este documento utilizan una tipografía "
-#~ "particular:"
-
-#~ msgid ""
-#~ "Menu selections look like this: <menuchoice> <guimenu>Menu</guimenu> "
-#~ "<guisubmenu>Submenu</guisubmenu> <guimenuitem>Menu Item</guimenuitem> </"
-#~ "menuchoice>"
-#~ msgstr ""
-#~ "Las referencias a menús se parecerán a esto: <menuchoice> <guimenu>Menú</"
-#~ "guimenu> <guisubmenu>Submenú</guisubmenu> <guimenuitem>Elemento del menú</"
-#~ "guimenuitem> </menuchoice>"
-
-#~ msgid "Text output from a computer"
-#~ msgstr "Texto escrito en la pantalla"
-
-#~ msgid "<title>Tip</title>"
-#~ msgstr "<title>Consejo</title>"
-
-#~ msgid "Tips and bits of extra information will look like this."
-#~ msgstr ""
-#~ "Los consejos y detalles de información adicionales tendrán una apariencia "
-#~ "como esta."
-
-#~ msgid ""
-#~ "We'll provide assorted bits of additional information in tips set off "
-#~ "from the rest of the book, as well."
-#~ msgstr ""
-#~ "También se ofrecen numerosos detalles adicionales en consejos "
-#~ "diferenciados del resto del libro."
-
-#~ msgid "Example Example"
-#~ msgstr "Ejemplo de ejemplo"
-
-#~ msgid ""
-#~ "Examples are also set off from the rest of the text. They look like this:"
-#~ msgstr ""
-#~ "Los ejemplos también se diferencian del resto del libro. Tienen una "
-#~ "apariencia como esta:"
-
-#~ msgid ""
-#~ "This is what an example looks like. We'll provide examples for some of "
-#~ "the more complicated tasks you might be performing."
-#~ msgstr ""
-#~ "Este es el aspecto de un ejemplo. Ofreceremos ejemplos para algunas de "
-#~ "las tareas más complicadas que podría realizar."
-
-#~ msgid ""
-#~ "Click <menuchoice> <guimenu>Tools</guimenu> <guimenuitem>Calendar "
-#~ "Settings</guimenuitem> </menuchoice>"
-#~ msgstr ""
-#~ "Haga clic en <menuchoice> <guimenu>Herramientas</guimenu> "
-#~ "<guimenuitem>Calendario y tareas</guimenuitem> </menuchoice>"
-
-#~ msgid ""
-#~ "Lastly, we'll have warnings, in cases where you should be careful: "
-#~ "<warning id=\"example-warning\"> <title>Example Warning</title> <para> "
-#~ "This is what a warning looks like. If there's a chance you'll run into "
-#~ "trouble, we'll warn you beforehand. </para> </warning>"
-#~ msgstr ""
-#~ "Finalmente, encontrará advertencias para casos en los es necesario "
-#~ "prestar especial atención: <warning id=\"example-warning\"> "
-#~ "<title>Ejemplo de advertencia</title> <para> Este es el aspecto de una "
-#~ "advertencia. Si existe algún riesgo de problema, se lo avisamos de "
-#~ "antemano. </para> </warning>"
-
-#~ msgid "Additional Help Sources"
-#~ msgstr "Fuentes adicionales de ayuda"
-
-#~ msgid ""
-#~ "You can find additional help in three places. For information about "
-#~ "command-line options, open a terminal window and type <command> man "
-#~ "evolution</command> or <command>evolution --help</command>. For support, "
-#~ "late-breaking news, and errata, visit the Ximian support center at <ulink "
-#~ "url=\"http://support.ximian.com\">support.ximian.com</ulink>."
-#~ msgstr ""
-#~ "Dispone de tres fuentes de ayuda. Para informarse de las opciones de la "
-#~ "línea de órdenes, abra una ventana de una terminal y escriba <command> "
-#~ "man evolution</command> o <command>evolution --help</command>. Para "
-#~ "acceder a la asistencia técnica, noticias de última hora y erratas, "
-#~ "visite el centro de asistencia de Ximian en <ulink url=\"http://support."
-#~ "ximian.com\">support.ximian.com</ulink>."
-
-#~ msgid ""
-#~ "The first few tools, with the exception of the folder tool, cover mail "
-#~ "tasks:"
-#~ msgstr ""
-#~ "Las primeras herramientas, exceptuando la herramienta de carpetas, cubren "
-#~ "tareas de correo:"
-
-#~ msgid "What's New in Evolution 1.2"
-#~ msgstr "Novedades de Evolution 1.2"
-
-#~ msgid "Added Functionality for the \"New\" Button"
-#~ msgstr "Característica mejorada del botón <quote>Nuevo</quote>"
-
-#~ msgid ""
-#~ "All unmodified letter keys have changed function-- the <keycap>N</keycap> "
-#~ "and <keycap>P</keycap> keys, for example, no longer take you to the next "
-#~ "you to the next or previous message. Pressing a letter will now take you "
-#~ "to the nearest message whose data in the sort column begins with that "
-#~ "letter. That is, if you press N and you are sorting your list by sender, "
-#~ "you will move to a message from Nadine. If you are sorting by subject, "
-#~ "you'll move to the message about nectarines. This should also work in the "
-#~ "folder list for folder navigation."
-#~ msgstr ""
-#~ "Todas las letras empleadas aisladamente cambian de función. Por ejemplo "
-#~ "las teclas <keycap>N</keycap> y <keycap>P</keycap> ya no sirven para "
-#~ "avanzar o retroceder en los mensajes. La presión de una letra ahora le "
-#~ "conduce al mensaje más próximo cuyo contenido en la columna de ordenación "
-#~ "empiece por esa letra. Así, si pulsa N y tiene ordenados los mensajes por "
-#~ "remitentes podrá moverse al mensaje enviado por Natalia. Si la ordenación "
-#~ "es por asunto podrá saltar al que habla de nectarinas. El desplazamiento "
-#~ "en la lista de carpetas es similar."
-
-#~ msgid "Digest-mode Display of Forwarded Messages"
-#~ msgstr "Vista resumen de mensajes reenviados"
-
-#~ msgid ""
-#~ "Email addresses in the message composer can now work with LDAP address "
-#~ "books. Add your LDAP address book to the list of folders searched for "
-#~ "address completion in the <guilabel>Folder Settings</guilabel> section of "
-#~ "the Settings dialog."
-#~ msgstr ""
-#~ "Las direcciones de correo electrónico en el editor de mensajes pueden "
-#~ "obtenerse de libretas de direcciones LDAP. En la sección "
-#~ "<guilabel>Carpetas</guilabel> del diálogo de Configuración se puede "
-#~ "agregar su libreta de direcciones a la lista de carpetas en donde harán "
-#~ "las búsquedas de direcciones para la función de autocompleto."
-
-#~ msgid "Evolution Settings Interface"
-#~ msgstr "Interfaz de configuración de Evolution"
-
-#~ msgid "Executive Summary now Reads IMAP"
-#~ msgstr "El resumen ejecutivo ahora lee IMAP"
-
-#~ msgid "Filters and vFolders Notice Moved or Missing Folders"
-#~ msgstr ""
-#~ "Los filtros y las carpetas virtuales reconocen correctamente las carpetas "
-#~ "borradas o renombradas"
-
-#~ msgid "Folder Naming Internationalization"
-#~ msgstr "Internacionalización de los nombres de las carpetas"
-
-#~ msgid "Folder Selection for Offline Mode"
-#~ msgstr "Selección de carpetas para el modo desconectado"
-
-#~ msgid ""
-#~ "If you're already familiar with Ximian Evolution 1.0, our new version has "
-#~ "a lot to add. Here are some of the new and changed features. Ximian "
-#~ "Connector for Microsoft Exchange also has new features, which are covered "
-#~ "in \"new-in-connector-one-two\">."
-#~ msgstr ""
-#~ "Si ya está familiarizado con Ximian Evolution 1.0, la nueva versión "
-#~ "aporta numerosas novedades. Aquí están algunas de las prestaciones nuevas "
-#~ "o modificadas. Ximian Connector para Microsoft Exchange también tiene "
-#~ "nuevas características."
-
-#~ msgid "Import Tool Now Imports Netscape Filters"
-#~ msgstr "La herramienta de importación ahora importa los filtros de Netscape"
-
-#~ msgid "Keyboard Navigation Overhaul"
-#~ msgstr "Revisión de la navegación con teclado"
-
-#~ msgid "Mail Composer Autocomplete"
-#~ msgstr "Función autocompletar del editor de correo"
-
-#~ msgid "Mail Composer HTML Improvements"
-#~ msgstr "Mejoras HTML en el editor de correo"
-
-#~ msgid ""
-#~ "Messages that contain multiple forwarded messages are now displayed as a "
-#~ "digest rather than inline or as a series of attachments."
-#~ msgstr ""
-#~ "Los mensajes que contienen varios mensajes reenviados se muestran ahora "
-#~ "como un resumen en lugar de dentro o que series de adjuntos."
-
-#~ msgid "New Criteria and Actions"
-#~ msgstr "Nuevas condiciones y acciones"
-
-#~ msgid ""
-#~ "Pasting into the mail composer from another message or from a web page "
-#~ "preserves the HTML formatting of the source document. Multiple levels of "
-#~ "reply quotation in messages are clearer and use a vertical blue line on "
-#~ "the left side to indicate quotation. Text \"smileys\" are now "
-#~ "automatically converted to small images displaying the appropriate "
-#~ "emotion. You can turn this option off in the <guilabel>Composer</"
-#~ "guilabel> section of the Settings dialog."
-#~ msgstr ""
-#~ "Al pegar al editor de correo desde otro mensaje o desde una página web se "
-#~ "mantiene el formato HTML del documento original. Ahora se ven más claros "
-#~ "cuando hay varios niveles de mensajes citados y una línea vertical azul "
-#~ "señala las citas. Las <quote>caritas</quote> de texto ahora son "
-#~ "convertidas a pequeñas imágenes automáticamente que reproducen el "
-#~ "emoticón apropiado. Puede desactivar esta opción en la sección "
-#~ "<guilabel>Editor de correo</guilabel> de la Configuración."
-
-#~ msgid "Performance Improvements"
-#~ msgstr "Mejoras de rendimiento"
-
-#~ msgid "Redirect (Bounce) Feature Added"
-#~ msgstr "Nueva prestación para redirigir (rechazar) mensajes"
-
-#~ msgid "Signature Editor"
-#~ msgstr "Editor de firmas"
-
-#~ msgid ""
-#~ "Startup time has decreased, POP server interactions are more efficient, "
-#~ "and indexing of locally cached mail is now faster."
-#~ msgstr ""
-#~ "El tiempo de arranque ha disminuido, las interacciones con el servidor "
-#~ "POP ahora son más eficientes y la indexación del correo local es ahora "
-#~ "más rápida."
-
-#~ msgid ""
-#~ "The <guibutton>New</guibutton> now has a menu next to it. As in Evolution "
-#~ "1.0, you can click the button once to get a new item for the Evolution "
-#~ "tool you're using. However, if you click the small arrow menu to the "
-#~ "right of the button, you will find a menu that allows you to create new "
-#~ "items for the rest of Evolution: All day appointments, regular "
-#~ "appointments, tasks and meetings for the calendar; mail messages for the "
-#~ "mail tool; and contacts and contact lists for the address book."
-#~ msgstr ""
-#~ "El botón <guibutton>Nuevo</guibutton> ahora tiene un menú junto a él. "
-#~ "Como en Evolution 1.0, si hace clic en este botón, se abre un nuevo "
-#~ "elemento, el que corresponda al tipo de herramienta Evolution utilizado "
-#~ "en aquel momento. Sin embargo, si hace clic en el pequeño menú de la "
-#~ "flecha a la derecha del botón, encontrará opciones que le permitirán "
-#~ "crear nuevos elementos para el resto de Evolution: citas para todo el "
-#~ "día, citas normales, tareas y reuniones en el calendario; mensajes en la "
-#~ "herramienta de correo y contactos, y listas de contactos en el "
-#~ "administrador de contactos."
-
-#~ msgid ""
-#~ "The Executive Summary tool in Evolution now displays email messages in "
-#~ "IMAP as well as local mail folders."
-#~ msgstr ""
-#~ "La herramienta de resumen ejecutivo de Evolution ahora muestra mensajes "
-#~ "en carpetas IMAP al igual que las carpetas locales de correo."
-
-#~ msgid ""
-#~ "The preferences dialogs have been completely overhauled. There is now a "
-#~ "single configuration dialog window for all components of the program, and "
-#~ "you can access it from anywhere. To change your preferences, select "
-#~ "<menuchoice> <guimenu> Tools </guimenu> <guimenuitem> Preferences </"
-#~ "guimenuitem> </menuchoice>. Detailed help for the preferences dialogs has "
-#~ "been added to <xref linkend=\"config-prefs\"/>."
-#~ msgstr ""
-#~ "Los diálogos de preferencias han sido completamente revisados. Ahora hay "
-#~ "una única ventana de diálogo para la configuración de todos los "
-#~ "componentes del programa a la que puede acceder desde cualquier parte. "
-#~ "Para cambiar sus preferencias elija <menuchoice> <guimenu>Herramientas</"
-#~ "guimenu> <guimenuitem>Preferencias</guimenuitem></menuchoice>."
-
-#~ msgid ""
-#~ "There are many new filter criteria and actions, including additional "
-#~ "message flags such as Flag for Followup."
-#~ msgstr ""
-#~ "Ahora hay nuevas condiciones y acciones que incluyen marcas para los "
-#~ "mensajes, por ejemplo, la <guilabel>Marca de seguimiento</guilabel>."
-
-#~ msgid ""
-#~ "There is now a signature editor, which can be used to create plain text "
-#~ "or HTML signatures. click the the <guilabel>Signatures</guilabel> tab in "
-#~ "the Composer Settings section of the Evolution Settings window."
-#~ msgstr ""
-#~ "Ahora existe un editor de firmas para crear firmas en formato de texto "
-#~ "puro o HTML. Elija la ficha <guilabel>Firmas</guilabel> en la sección "
-#~ "<guilabel>Editor de correo</guilabel> de la Configuración."
-
-#~ msgid ""
-#~ "This feature is also sometimes known as \"Bounce\" or \"Resend.\" To "
-#~ "resend a message with all its headers instead of merely forwarding it, "
-#~ "select the message and choose <menuchoice> <guimenu> Actions </guimenu> "
-#~ "<guisubmenu> Forward </guisubmenu> <guimenuitem> Redirect </guimenuitem> "
-#~ "</menuchoice>."
-#~ msgstr ""
-#~ "Esta característica es conocida con frecuencia como <quote>Rechazar</"
-#~ "quote> o <quote>Reenviar</quote>. Para redirigir un mensaje con todas sus "
-#~ "cabeceras internas intactas en lugar de reenviarlo normalmente, "
-#~ "seleccione el mensaje y elija el menú <menuchoice> <guimenu> Acciones </"
-#~ "guimenu> <guisubmenu> Reenviar </guisubmenu> <guimenuitem> Redirigir </"
-#~ "guimenuitem> </menuchoice>."
-
-#~ msgid ""
-#~ "This means that the old single letter shortcuts have changed as well. The "
-#~ "new shortcuts: <simplelist> <member> <keycap>,</keycap> (comma) and "
-#~ "<keycap>.</keycap> (period) are now the keyboard shortcuts for Next and "
-#~ "Previous unread messages. You can also use the square brackets <keycap>]</"
-#~ "keycap> and <keycap>[</keycap>. </member> <member> <keycap>`</keycap> "
-#~ "(backtick) toggles the message preview pane. </member> </simplelist> "
-#~ "Shortcuts that use the <keycap>Control</keycap> key have not changed."
-#~ msgstr ""
-#~ "Esto significa que los antiguos atajos de una sola letra han cambiado "
-#~ "también. Los atajos nuevos son: <simplelist> <member> <keycap>,</keycap> "
-#~ "(coma) y <keycap>.</keycap> (punto) son los nuevos atajos de teclado para "
-#~ "avanzar a los mensajes sin leer siguiente y anterior. También puede "
-#~ "utilizar los corchetes <keycap>]</keycap> y <keycap>[</keycap>. </member> "
-#~ "<member> <keycap>`</keycap> cambia la vista del panel de "
-#~ "previsualización. </member> </simplelist> Los atajos que utilizan la "
-#~ "tecla <keycap>Ctrl</keycap> no han sido modificados."
-
-#~ msgid ""
-#~ "When new mail arrives, you may opt to have Evolution beep or play a sound "
-#~ "file that you specify."
-#~ msgstr ""
-#~ "Cuando llega correo nuevo, Evolution puede emitir un pitido o reproducir "
-#~ "el fichero de audio que especifique."
-
-#~ msgid ""
-#~ "You can now import your filters, as well as your email messages, from the "
-#~ "Netscape mail client."
-#~ msgstr ""
-#~ "Ahora puede importar los filtros así como sus mensajes de correo "
-#~ "electrónico desde su cliente de correo Netscape."
-
-#~ msgid ""
-#~ "You can now use Unicode (UTF-8) characters in the names for IMAP folders."
-#~ msgstr ""
-#~ "Ahora puede utilizar caracteres Unicode (UTF-8) en los nombres de "
-#~ "carpetas IMAP."
-
-#~ msgid ""
-#~ "You may now select which network folders which will be cached locally "
-#~ "when you go into Offline mode. This setting may be changed from the "
-#~ "Folders section of the Evolution Settings window."
-#~ msgstr ""
-#~ "Ahora puede elegir qué carpetas remotas quiere tener en <quote>caché</"
-#~ "quote>, para trabajar con ellas en modo desconectado. Puede modificar "
-#~ "esta configuración en la sección Carpetas de la ventana Configuración de "
-#~ "Evolution."
-
-#~ msgid "vFolder \"Original Location\" Feature"
-#~ msgstr ""
-#~ "Característica de <quote>Ubicación original</quote> de las carpetas "
-#~ "virtuales"
-
-#~ msgid ""
-#~ "vFolders and filters now notice if you move or delete a folder that they "
-#~ "use."
-#~ msgstr ""
-#~ "Las carpetas virtuales y los filtros son actualizados cuando mueve o "
-#~ "borra alguna carpeta utilizada por ellos."
-
-#~ msgid ""
-#~ "vFolders can now display the actual folder location for each message they "
-#~ "contain. To do so, right click on the column headers in the message list "
-#~ "of any vFolder, select <guimenuitem>Add a Column</guimenuitem>, and drag "
-#~ "the <guibutton>Original Location</guibutton> item into position."
-#~ msgstr ""
-#~ "Las carpetas virtuales (vFolder) ahora pueden mostrar la carpeta real de "
-#~ "cada mensaje que contienen. Para conseguirlo, haga clic con el botón "
-#~ "derecho sobre los encabezados de columnas en la lista de mensajes de "
-#~ "cualquier carpeta virtual, elija <guimenuitem>Añadir una columna</"
-#~ "guimenuitem> y arrastre el elemento <guibutton>Ubicación original</"
-#~ "guibutton> a la posición deseada."
-
-#~ msgid ""
-#~ "<application>Evolution</application> supports both Imperial and Metric "
-#~ "measurement for weather reports. Imperial units are sometimes called "
-#~ "British units, but are used almost exclusively in the United States. "
-#~ "Britain, and most of the rest of the world, use metric units."
-#~ msgstr "¿Sistema métrico o anglosajón?"
-
-#~ msgid "Metric or Imperial?"
-#~ msgstr "Haga clic en <guibutton>Añadir</guibutton>."
-
-#~ msgid ""
-#~ "Active Directory Server Name: In most organizations, the Active Directory "
-#~ "server will be different from the Exchange mail server. If so, check the "
-#~ "box and enter the Active Directory server name here."
-#~ msgstr ""
-#~ "Nombre de servidor Active Directory: la mayoría de las organizaciones "
-#~ "utilizan servidores diferentes para Active Directory y Exchange. En ese "
-#~ "caso active la casilla y escriba el nombre del servidor Active Directory."
-
-#~ msgid ""
-#~ "Create a Global Address List folder: If you would like to have a separate "
-#~ "folder for the Active Directory's Global Address List, leave this box "
-#~ "checked."
-#~ msgstr ""
-#~ "Crear una carpeta lista global de direcciones: active esta casilla si "
-#~ "quiere tener una carpeta separada para la lista global de direcciones de "
-#~ "Active Directory."
-
-#~ msgid ""
-#~ "Exchange Server: If your active directory user name is different from "
-#~ "your Exchange mail user name, check this box and enter your mail username "
-#~ "here."
-#~ msgstr ""
-#~ "Exchange Server: si su nombre de usuario es diferente en Active Directory "
-#~ "y en Exchange, active esta casilla y escriba el nombre de su buzón."
-
-#~ msgid "Identity:"
-#~ msgstr "Identidad"
-
-#~ msgid "Special Folders"
-#~ msgstr "Carpetas especiales"
-
-#~ msgid "Creation of an automatic \"out-of-office\" reply messages."
-#~ msgstr ""
-#~ "Creación de mensajes automáticos de respuesta «Fuera de la oficina»."
-
-#~ msgid "<guimenuitem>Group By this Field</guimenuitem>:"
-#~ msgstr "<guimenuitem>Agrupar por campo</guimenuitem>:"
-
-#~ msgid ""
-#~ "Groups messages instead of sorting them. This makes each contact with "
-#~ "identical properties in the specified field to be placed in its own group "
-#~ "and physically separated from others."
-#~ msgstr ""
-#~ "Agrupa los mensajes en lugar de ordenarlos. Esta operación coloca los "
-#~ "contactos que comparten propiedades idénticas, dentro de un campo "
-#~ "especificado, en un grupo independiente, separado físicamente de los "
-#~ "demás."
-
-#~ msgid ""
-#~ "When you choose this item, a list of column headers will appear; just "
-#~ "drag and drop them into place between two existing headers. A red arrow "
-#~ "will appear to show you where you're about to put the column."
-#~ msgstr ""
-#~ "Cuando selecciona este elemento, aparece un listado de cabeceras "
-#~ "posibles; arrastre simplemente la que desee entre dos cabeceras "
-#~ "existentes. Una flecha roja le muestra el lugar donde quedará colocada la "
-#~ "columna."
-
-#~ msgid "Select the mail folder you want to see in the preview on the left."
-#~ msgstr "Haga clic en la ficha <guibutton>Correo</guibutton>."
-
-#~ msgid "Configuration"
-#~ msgstr "Configuración"
-
-#~ msgid ""
-#~ "Evolution Settings for Connecting to an <application>Exchange</"
-#~ "application>Server"
-#~ msgstr ""
-#~ "Configuración de Evolution para conectarse con un servidor "
-#~ "<application>Exchange</application>"
-
-#~ msgid ""
-#~ "Once you know that your server is ready for you to connect, start Ximian "
-#~ "Evolution and select <menuchoice> <guimenu>Tools</guimenu> "
-#~ "<guimenuitem>Mail Settings</guimenuitem> </menuchoice> from any mail view."
-#~ msgstr ""
-#~ "Tras asegurarse de que está preparado para conectar con el servidor, "
-#~ "inicie Ximian Evolution y seleccione <menuchoice> <guimenu>Herramientas</"
-#~ "guimenu> <guimenuitem>Configuración del correo</guimenuitem> </"
-#~ "menuchoice> desde cualquier vista de correo."
-
-#~ msgid ""
-#~ "Active Directory Server Name: Enter the Active Directory server name here."
-#~ msgstr ""
-#~ "Nombre del servidor Active Directory: escriba aquí el nombre del servidor "
-#~ "Active Directory."
-
-#~ msgid ""
-#~ "Create a Global Address List folder: If you want to use your "
-#~ "organization's Active Directory or Global Address List, leave this box "
-#~ "checked."
-#~ msgstr ""
-#~ "Crear una carpeta con la lista global de direcciones: active esta casilla "
-#~ "si va a utilizar Active Directory o la lista global de direcciones de su "
-#~ "organización."
-
-#~ msgid ""
-#~ "Active Directory: If you would like to use the Global Address List (GAL), "
-#~ "check the box labeled <guilabel>Create a Global Address List folder</"
-#~ "guilabel> and enter the name of the directory server. To avoid strain on "
-#~ "the server, the maximum number of responses to any Active Directory query "
-#~ "has been set to 500. If you would like to change that, you may do so here "
-#~ "as well."
-#~ msgstr ""
-#~ "Active Directory: Si desea poder utilizar la Lista global de direcciones "
-#~ "(lista global de direcciones), active la casilla <guilabel>Crear una "
-#~ "carpeta para la lista global de direcciones</guilabel> y escriba el "
-#~ "nombre del servidor del directorios. Para reducir la carga del servidor, "
-#~ "se establece en 500 el número máximo de respuestas a una consulta Active "
-#~ "Directory. Si desea modificar este valor, puede hacerlo aquí también."
-
-#~ msgid ""
-#~ "Exchange Server: If your Exchange mailbox name is different from your "
-#~ "Windows name, enter your mailbox name here."
-#~ msgstr ""
-#~ "Exchange Server: si el nombre de su buzón Exchange y su nombre de usuario "
-#~ "Windows son diferentes, especifique el nombre de su buzón en este campo."
-
-#~ msgid ""
-#~ "If you think you'll want to return to a search again, you can save it as "
-#~ "a virtual folder by selecting <guilabel>Store Search as vFolder</"
-#~ "guilabel>."
-#~ msgstr ""
-#~ "Si piensa volver a repetir la búsqueda, puede conservarla en una carpeta "
-#~ "virtual: para ello, seleccione <guilabel>Guardar búsqueda como carpeta "
-#~ "virtual</guilabel>."
-
-#~ msgid ""
-#~ "In this tab you can decide how you would like <application>Ximian "
-#~ "Evolution</application> to display your mail: how to display citations, "
-#~ "how long to wait before marking a message as read, and so forth."
-#~ msgstr ""
-#~ "Aquí puede decidir cómo desea que <application>Ximian Evolution</"
-#~ "application> muestre su correo o citas, así como el tiempo de espera "
-#~ "antes de marcar un mensaje como leído, etc."
-
-#~ msgid ""
-#~ "This is also where you can decide how you would like <application>Ximian "
-#~ "Evolution</application> to handle inline images in HTML mail that you "
-#~ "get. There is a detailed discussion of the issues surrounding these "
-#~ "options in <xref linkend=\"usage-mail-getnsend-get-attach-html\"/>."
-#~ msgstr ""
-#~ "Puede también decidir cómo desea que <application>Ximian Evolution</"
-#~ "application> maneje las imágenes recibidas en mensajes en formato HTML. "
-#~ "Puede consultar una descripción detallada de todo lo relacionado con "
-#~ "estas opciones en <xref linkend=\"usage-mail-getnsend-get-attach-html\"/>."
-
-#~ msgid "Choose the font and font size you would like to use."
-#~ msgstr "Elija el tipo de letra y el tamaño deseados."
-
-#~ msgid ""
-#~ "Select the <guilabel>Font Settings</guilabel> portion of the settings "
-#~ "dialog."
-#~ msgstr "Elija la opción <guilabel>Tipografías</guilabel>."
-
-#~ msgid ""
-#~ "To change the font which <application>Ximian Evolution</application> uses "
-#~ "to display mail, do the following:"
-#~ msgstr ""
-#~ "Para cambiar la tipografía que <application>Ximian Evolution</"
-#~ "application> utiliza para mostrar el correo, siga estos pasos:"
-
-#~ msgid ""
-#~ "Host: If you chose <guilabel>SMTP</guilabel> or <guilabel>Microsoft "
-#~ "Exchange</guilabel>, enter the server's name or IP address here."
-#~ msgstr ""
-#~ "Servidor: si eligió <guilabel>SMTP</guilabel> o <guilabel>Microsoft "
-#~ "Exchange</guilabel> escriba el nombre del servidor o su dirección IP."
-
-#~ msgid ""
-#~ "Choose a keyboard shortcut scheme: do you prefer keyboard shortcuts "
-#~ "similar to those of Microsoft Windows, XEmacs, or Emacs?"
-#~ msgstr ""
-#~ "Elija un esquema de atajos de teclado: ¿prefiere que sean similares a los "
-#~ "de Microsoft Windows, XEmacs o Emacs?"
-
-#~ msgid "Shortcuts Type"
-#~ msgstr "Tipo de atajos"
-
-# index.docbook:483, index.docbook:484
-#~ msgid "Creating an Exchange Account, Step Two: Receiving Mail"
-#~ msgstr "Creación de una cuenta Exchange- Etapa dos: recepción de correo"
-
-# index.docbook:493, index.docbook:494
-#~ msgid "Creating an Exchange Account, Step Three: Mail Options"
-#~ msgstr "Creación de una cuenta Exchange- Etapa tres: opciones de correo"
-
-#~ msgid "Active Directory"
-#~ msgstr "Active Directory"
-
-#~ msgid "Here, tab, you'll find some additional settings:"
-#~ msgstr "Encontrará en esta ficha opciones de configuración adicionales:"
-
-#~ msgid ""
-#~ "If you would like to use the Global Address List (GAL) maintained on your "
-#~ "Exchange server, click the tab labeled <guilabel>Receiving Options</"
-#~ "guilabel> and check the box labeled <guilabel>Create a Global Address "
-#~ "List folder</guilabel>. The GAL is maintained by your system "
-#~ "administrator and you cannot add, change, or remove items from it using "
-#~ "Ximian Evolution. However, you can use it to invite people to meetings "
-#~ "and to look up addresses and other information. In many organizations, "
-#~ "the GAL is stored on a different server from email. If this is the case, "
-#~ "you should also specify the directory server name here."
-#~ msgstr ""
-#~ "Si desea utilizar la lista global de direcciones que administra el "
-#~ "servidor Exchange, haga clic en la ficha <guilabel>ñOpciones de "
-#~ "recepción</guilabel> y active la casilla <guilabel>Crear una carpeta para "
-#~ "la lista global de direcciones</guilabel>. La administración de la lista "
-#~ "global de direcciones corre a cargo del administrador del sistema: no "
-#~ "puede agregar, modificar o eliminar elementos de esta lista con Ximian "
-#~ "Evolution. Sin embargo, puede utilizarla para convocar reuniones con "
-#~ "otras personas, buscar sus direcciones e información similar. En "
-#~ "numerosas organizaciones, la lista global de direcciones se almacena un "
-#~ "servidor diferente del servidor de correo. Si es el caso, deberá también "
-#~ "especificar el nombre del servidor de directorios."
-
-#~ msgid ""
-#~ "If your Exchange server requires you to use a different mailbox name from "
-#~ "the name you use to log in, select the second check-box and enter the "
-#~ "mailbox name. Check with your system administrator to be sure."
-#~ msgstr ""
-#~ "Si el servidor Exchange utiliza un nombre de buzón distinto al nombre "
-#~ "utilizado para iniciar la sesión, active la segunda casilla y escriba "
-#~ "dicho nombre. Consulte con el administrador del sistema para asegurarse."
-
-#~ msgid ""
-#~ "In most cases, the URL for web access is \"http://server.company.com/"
-#~ "exchange.\" If your system has a path that is not \"exchange,\" check the "
-#~ "box and enter the custom path here."
-#~ msgstr ""
-#~ "En la mayoría de los casos, la dirección URL para tener acceso por Web es "
-#~ "«http://server.company.com/exchange». Si la ruta en su sistema no es "
-#~ "«exchange», active la casilla y escriba la ruta específica en el campo "
-#~ "correspondiente."
-
-#~ msgid "Mailbox Name and Web Access Path"
-#~ msgstr "Nombre de buzón y ruta de Web Access"
-
-#~ msgid "End of day"
-#~ msgstr "El día acaba"
-
-#~ msgid "First day of the week"
-#~ msgstr "Primer día de la semana"
-
-#~ msgid ""
-#~ "Says what time of the day your weekday starts. This will show all times "
-#~ "till the end of the day, regardless of there is an appointment during the "
-#~ "time period."
-#~ msgstr ""
-#~ "Especifique la hora a la que empieza su jornada laboral. Esta mostrará "
-#~ "todas las horas hasta el final del día, haya o no citas durante ese "
-#~ "espacio de tiempo."
-
-#~ msgid "Sets the time the day ends at."
-#~ msgstr "Especifique la hora a la que acaba la jornada laboral."
-
-#~ msgid "Start of day"
-#~ msgstr "El día comienza"
-
-#~ msgid ""
-#~ "Taking Full Advantage of the Exchange Server When Scheduling Appointments"
-#~ msgstr "Utilización del servidor Exchange para programar citas"
-
-#~ msgid ""
-#~ "If you move mail from your server into your local system using POP mail, "
-#~ "filters are applied to incoming mail every time you check for mail."
-#~ msgstr ""
-#~ "Si utiliza el protocolo POP para transferir el correo desde su servidor "
-#~ "hacia su equipo local, los filtros se aplican sobre los mensajes "
-#~ "entrantes cada vez que comprueba la presencia de correo nuevo."
-
-#~ msgid ""
-#~ "If you store your mail on the mail server and check your mail with IMAP, "
-#~ "filters are applied to the INBOX when you open it. In some cases, you "
-#~ "will see a number of unread messages in the INBOX, click the INBOX, and "
-#~ "then have the messages move elsewhere as they are filtered out."
-#~ msgstr ""
-#~ "Si almacena su correo en el servidor y utiliza el protocolo IMAP para "
-#~ "comprobarlos, los filtros intervienen cada vez que abre el buzón de "
-#~ "entrada. En algunos casos, cierto número de mensajes sin leer aparecen en "
-#~ "el buzón de entrada; cuando hace clic en el buzón de entrada, los filtros "
-#~ "se aplican y a continuación los mensajes se mueven hacia otro lugar."
-
-#~ msgid ""
-#~ "A good deal of bulk mail is eventually tagged with the "
-#~ "<computeroutput>Precedence: Bulk</computeroutput> header at one point or "
-#~ "another. Not all of it is, of course, and there are \"good\" messages "
-#~ "(mailing lists you subscribe to, for example) that are also considered "
-#~ "\"Bulk\" mail. However, if you filter out all the mail with that header, "
-#~ "you'll catch a lot of the mail you don't want to get."
-#~ msgstr ""
-#~ "Un buen indicador de «spam» o envíos masivos (en inglés «bulk») suele ser "
-#~ "la presencia de un encabezado <computeroutput>Precedence: Bulk</"
-#~ "computeroutput> en algún punto del mensaje. Por supuesto, no todos lo "
-#~ "envíos masivos son «spam», y existen mensajes aceptables (como las listas "
-#~ "de correo a las que se suscribe, por ejemplo) que también se califican "
-#~ "como «bulk». Sin embargo, si opta por filtrar dicha cabecera, podrá "
-#~ "interceptar un gran número de mensajes que no desea recibir."
-
-#~ msgid "Click <guibutton>New</guibutton>."
-#~ msgstr "Haga clic en <guibutton>Nuevo</guibutton>."
-
-#~ msgid ""
-#~ "For actions, select \"Move to Folder\" and choose the folder where you'd "
-#~ "like to place bulk mail."
-#~ msgstr ""
-#~ "Para aplicar acciones, seleccione «Mover a la carpeta» y elija la carpeta "
-#~ "donde desea colocar el correo encontrado."
-
-#~ msgid "Managing the Addressbook"
-#~ msgstr "Administración de la libreta de direcciones"
-
-#~ msgid "Adding Directory Servers"
-#~ msgstr "Especifación de servidores de directorio"
-
-#~ msgid "<term>One</term>"
-#~ msgstr "<term>Uno</term>"
-
-#~ msgid "<term>Sub</term>"
-#~ msgstr "<term>Sub</term>"
-
-#~ msgid ""
-#~ "How broad the search is in the directory. The following options are "
-#~ "available:"
-#~ msgstr ""
-#~ "Especifique el nivel de subdirectorios explorados. Están disponibles las "
-#~ "siguientes opciones:"
-
-#~ msgid ""
-#~ "The name that you see on the screen. This could be anything you wish."
-#~ msgstr "El nombre que ve en pantalla. Este puede ser cualquiera que desee."
-
-#~ msgid ""
-#~ "Select your search criteria. For each criterion, you must first select "
-#~ "which of the following parts of the message you want the search to "
-#~ "examine:"
-#~ msgstr ""
-#~ "Seleccione el criterio de búsqueda. Para cada criterio, seleccione en "
-#~ "primer lugar qué partes de los mensajes desea examinar durante la "
-#~ "búsqueda:"
-
-#~ msgid ""
-#~ "Specific Header - The vFolder can look at any header you want, even "
-#~ "obscure or custom ones. Enter the header name in the first text box, and "
-#~ "put your search text in the second one."
-#~ msgstr ""
-#~ "Cabecera específica - La carpeta virtual puede examinar cualquier "
-#~ "cabecera deseada, por muy oscura o personalizada que sea. Escriba el "
-#~ "nombre de la cabecera en el primer cuadro de texto, y el texto buscado en "
-#~ "el segundo."
-
-#~ msgid "Creating a vFolder Rule"
-#~ msgstr "Creación de una regla de carpeta virtual"
-
-#~ msgid "Selecting a vFolder Rule"
-#~ msgstr "Selección de una regla de carpeta virtual"
-
-#~ msgid "Shows you your calendar."
-#~ msgstr "Muestra su agenda."
-
-#~ msgid "Shows your pending tasks"
-#~ msgstr "Muestra sus tareas pendientes."
-
-#~ msgid "Calendar Window"
-#~ msgstr "Ventana del calendario"
-
-#~ msgid ""
-#~ "The <guilabel>Calendar Window</guilabel> has a graphical representation "
-#~ "of the calendar, so you can select what days to view in the "
-#~ "<guilabel>Appointment List</guilabel>."
-#~ msgstr ""
-#~ "La <guilabel>ventana del calendario</guilabel> contiene una "
-#~ "representación gráfica del calendario en la que puede elegir qué días "
-#~ "quiere ver en la <guilabel>lista de citas</guilabel>."
-
-#~ msgid "The <guilabel>Contact List</guilabel> lists your contacts."
-#~ msgstr "La <guilabel>lista de contactos</guilabel> lista sus contactos."
-
diff --git a/help/es/legal.xml b/help/es/legal.xml
deleted file mode 100644
index 9adc63db13..0000000000
--- a/help/es/legal.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-
- <sect1 id="legal-info-note">
- <title
->Información legal y condiciones de licencia</title>
-
-<!-- normally this content belongs in the actual "legalnotice" tag,
- but for formatting reasons putting it in a sect1, inside the
- Preface, and adding a paragraph to the beginning of it -->
-
- <note id="evo-is-free-software"
-> <title
->Ximian Evolution es software libre</title
-> <para
-> Ximian Evolution se licencia según los términos de la Licencia Pública General de GNU (GPL) y su documentación se licencia separadamente según la Licencia de Documentación Libre de GNU (GFDL). Encontrará el texto completo de la GPL en <xref linkend="apx-gpl"/> y el de la GFDL en <xref linkend="apx-fdl"/>. Los mismos textos están disponibles en los archivos COPYING y COPYING-DOCS distribuidos con este software. Ximian Connector for Microsoft Exchange 2000 es software propietario y está sujeto a una licencia diferente. El Copyright de ambas piezas de software y de su documentación pertenecen a Ximian, Inc. </para
-> </note>
- <para
-> Se concede permiso para copiar, distribuir y/o modificar este documento según los términos de la <quote lang="en"
->GNU Free Documentation License</quote
-> (Licencia GNU de Documentación Libre) versión 1.1 o cualquiera posterior publicada por la Free Software Foundation sin secciones invariantes ni textos de portada o contraportada. En el apéndice <xref linkend="apx-fdl"/> encontrará una copia de la <citetitle
->GNU Free Documentation License</citetitle
->. También puede obtener una copia de la misma en el archivo COPYING-DOCS distribuido con este manual. </para>
- <para
-> Este manual forma parte de la colección de manuales de GNOME distribuidos según la licencia GFDL. Si quiere distribuirlo independientemente de la colección puede hacerlo añadiendo al manual una copia de la licencia, según se indica en la sección 6 de la licencia. </para>
-
- <para
-> Ximian es una marca comercial registrada y Ximian Evolution, el logo del chango bailón y el de la cápsula Ximian son marcas comerciales de Ximian, Inc. Otros nombres en el texto pueden ser marcas comerciales registradas de otras compañías u organizaciones. Cuando dichos nombres aparezcan en la documentación de GNOME lo harán en mayúsculas, siempre que los miembros del Proyecto de Documentación de GNOME estén advertidos de ello. </para>
-
- <para
-> </para>
- <orderedlist
-> <listitem
-> <para
-> </para
-> </listitem
-> <listitem
-> <para
-> </para
-> </listitem
-> </orderedlist>
- </sect1>
-
diff --git a/help/es/menuref.xml b/help/es/menuref.xml
deleted file mode 100644
index 2728d9b9ec..0000000000
--- a/help/es/menuref.xml
+++ /dev/null
@@ -1,497 +0,0 @@
-<!--
-<!DOCTYPE Appendix PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-
-<appendix id="menuref">
- <title
->Referencia rápida</title>
- <para
-> Quizás le convenga imprimir esta sección y pegarla a la pared a proximidad de su ordenador. Se trata de un resumen muy corto de la mayoría de las posibilidades que le ofrece <application
->Ximian Evolution</application
->. </para>
-
-
-<note id="shortcuts"
-> <title
->Atajos de teclado personalizados</title
-> <para
-> Si ha personalizado los atajos de teclado en su escritorio (puede hacerlo a través del centro de control: elija <menuchoice
-><guimenu
->Sistema</guimenu
-><guimenuitem
->Configuración</guimenuitem
-></menuchoice
-> en el menú del panel) es posible que éstos interfieran con los de Evolution. </para
-> <para
-> Por ejemplo, si ha elegido las combinaciones de teclas al estilo Emacs para el editor de textos de su escritorio, entonces la combinación de teclas <keycombo action="simul"
-> <keycap
->Ctrl</keycap
-> <keycap
->W</keycap
-> </keycombo
-> actuará en el editor de mensajes como <quote
->cortar área</quote
-> en lugar de <quote
->cerrar ventana</quote
->. </para
-> </note>
-
-
-
-
- <sect1 id="quickref-open">
- <title
->Apertura y cierre de elementos</title>
- <para
-> <variablelist
-> <varlistentry
-> <term
->Nuevo elemento:</term
-> <listitem
-> <para
-> Presione la combinación de teclas <keycombo action="simul"
-> <keycap
->Ctrl</keycap
-> <keycap
->N</keycap
-> </keycombo
-> para abrir un elemento nuevo desde cualquier lugar de la aplicación <application
->Ximian Evolution</application
-> donde se encuentre. En el contexto del correo, la orden abrirá un mensaje nuevo. Si consulta su lista de direcciones, la tecla <keycombo action="simul"
-> <keycap
->Ctrl</keycap
-> <keycap
->N</keycap
-> </keycombo
-> creará una nueva tarjeta para un contacto; y en calendario, se abrirá una nueva cita. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Creación de una carpeta nueva:</term
-> <listitem
-> <para
-> <menuchoice
-><guimenu
->Archivo</guimenu
-><guisubmenu
->Nuevo</guisubmenu
-> <guimenuitem
->Carpeta</guimenuitem
-></menuchoice
-> o <keycombo action="simul"
-> <keycap
->Ctrl</keycap
-> <keycap
->Mayús</keycap
-> <keycap
->E</keycap
-> </keycombo
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Creación de un atajo nuevo en la Barra de Evolution:</term
-> <listitem
-> <para
-> <menuchoice
-><guimenu
->Archivo</guimenu
-> <guisubmenu
->Nuevo</guisubmenu
-> <guimenuitem
->Atajo</guimenuitem
-> </menuchoice
-> o <keycombo action="simul"
-> <keycap
->Ctrl</keycap
-> <keycap
->Mayús</keycap
-> <keycap
->S</keycap
-> </keycombo
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Creación de un nuevo mensaje de correo electrónico:</term
-> <listitem
-> <para
-> <menuchoice
-><guimenu
->Archivo</guimenu
-><guisubmenu
->Nuevo</guisubmenu
-> <guimenuitem
->Mensaje de correo </guimenuitem
-> </menuchoice
-> o <keycap
->Ctrl</keycap
-> <keycap
->Mayús</keycap
-> <keycap
->M</keycap
->. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Creación de una nueva cita:</term
-> <listitem
-> <para
-> <menuchoice
-><guimenu
->Archivo</guimenu
-> <guisubmenu
->Nuevo</guisubmenu
-> <guimenuitem
->Cita</guimenuitem
-> </menuchoice
-> o <keycombo action="simul"
-> <keycap
->Ctrl</keycap
-> <keycap
->Mayús</keycap
-> <keycap
->A</keycap
-> </keycombo
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Creación de un nuevo contacto:</term
-> <listitem
-> <para
-> Haga doble clic en cualquier lugar vacío del administrador de contactos para crear una nueva tarjeta de visita. También puede utilizar: <menuchoice
-><guimenu
->Archivo</guimenu
-> <guisubmenu
->Nuevo</guisubmenu
-> <guimenuitem
->Contacto</guimenuitem
-> </menuchoice
-> o la combinación de teclas <keycombo action="simul"
-> <keycap
->Ctrl</keycap
-> <keycap
->Mayús</keycap
-> <keycap
->C</keycap
-> </keycombo
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Creación de una tarea nueva:</term
-> <listitem
-> <para
-> <menuchoice
-><guimenu
->Archivo</guimenu
-> <guisubmenu
->Nuevo</guisubmenu
-> <guimenuitem
->Tarea</guimenuitem
-> </menuchoice
-> o <keycombo action="simul"
-> <keycap
->Ctrl</keycap
-> <keycap
->Mayús</keycap
-> <keycap
->T</keycap
-> </keycombo
-> </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
- </sect1
->
- <sect1 id="quickref-mail">
- <title
->Tareas de correo</title>
- <para
-> Las tareas de correo más frecuentes y los atajos para desplazarse por su buzón con el teclado son los siguientes: <variablelist
-> <varlistentry
-> <term
->Enviar y recibir correo:</term
-> <listitem
-> <para
-> Presione la tecla <keycap
->F9</keycap
-> o haga clic en <guibutton
->Enviar/Recibir</guibutton
-> de la barra de herramientas o elija <menuchoice
-><guimenu
->Acciones</guimenu
-> <guimenuitem
->Enviar/Recibir</guimenuitem
-></menuchoice
->. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Moverse por el buzón mediante el teclado:</term
-> <listitem
-> <para
-> Presione <keycap
->]</keycap
-> o <keycap
->.</keycap
-> para saltar al siguiente mensaje sin leer. <keycap
->[</keycap
-> o <keycap
->,</keycap
-> salta al anterior mensaje no leído. Use las teclas del cursor para moverse arriba y abajo por toda la lista de mensajes. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Moverse adelante y atrás en el panel de visualización de mensajes:</term
-> <listitem
-> <para
-> Presione la barra de espacio para avanzar una página. Presione la tecla <keycap
->Retroceso</keycap
-> para volver hacia atrás. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Responder un mensaje:</term
-> <listitem
-> <para
-> Para responder al remitente de un mensaje sencillamente haga clic en <guibutton
->Responder</guibutton
-> en la barra de tareas o presione la combinación de teclas <keycombo action="simul"
-> <keycap
->Ctrl</keycap
-> <keycap
->R</keycap
-> </keycombo
->. </para
-> <para
-> Para responder al remitente y a todos los destinatarios visibles haga clic en <guibutton
->Re: Todos</guibutton
-> o seleccione el mensaje y presione la combinación de teclas <keycombo action="simul"
-><keycap
->Mayús</keycap
-><keycap
->Ctrl</keycap
-><keycap
->R</keycap
-></keycombo
->. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Reenviar un mensaje:</term
-> <listitem
-> <para
-> Seleccione los mensajes que quiera reenviar (uno o varios) y haga clic en <guibutton
->Reenviar</guibutton
-> en la barra de tareas o presione la combinación de teclas <keycombo action="simul"
-><keycap
->Ctrl</keycap
-><keycap
->F</keycap
-></keycombo
->. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Abrir un mensaje en una nueva ventana:</term
-> <listitem
-> <para
-> Haga clic dos veces sobre el mensaje que quiera ver o selecciónelo y presione <keycap
->Intro</keycap
-> o la combinación de teclas <keycombo action="simul"
-><keycap
->Ctrl</keycap
-> <keycap
->O</keycap
-></keycombo
->. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Creación de filtros y carpetas virtuales:</term
-> <listitem
-> <para
-> Haga clic con el botón derecho en un mensaje y elija <guimenuitem
->Crear una regla con el mensaje</guimenuitem
->. También puede crear filtros y carpetas virtuales desde el menú <guimenu
->Herramientas</guimenu
->. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Incluir un remitente a la lista de contactos:</term
-> <listitem
-> <para
-> Haga clic con el botón derecho sobre un mensaje y elija <guimenuitem
->Añadir remitente a la libreta de direcciones</guimenuitem
->. También puede pulsar el botón derecho sobre cualquier dirección de correo y agregarla a su lista de contactos. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
- </sect1>
- <sect1 id="quickref-cal">
- <title
->Calendario</title>
- <para
-> <variablelist
-> <varlistentry
-> <term
->Creación de una nueva cita:</term
-> <listitem
-> <para
-> <menuchoice
-><guimenu
->Archivo</guimenu
-> <guisubmenu
->Nuevo</guisubmenu
-> <guimenuitem
->Cita</guimenuitem
-> </menuchoice
-> o <keycombo action="simul"
-> <keycap
->Ctrl</keycap
-> <keycap
->Mayús</keycap
-> <keycap
->A</keycap
-> </keycombo
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Creación de una tarea nueva:</term
-> <listitem
-> <para
-> <menuchoice
-><guimenu
->Archivo</guimenu
-> <guisubmenu
->Nuevo</guisubmenu
-> <guimenuitem
->Tarea</guimenuitem
-> </menuchoice
-> o <keycombo action="simul"
-> <keycap
->Ctrl</keycap
-> <keycap
->Mayús</keycap
-> <keycap
->T</keycap
-> </keycombo
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-></term
-> <listitem
-> <para
-> <tip id="new-appt"
-> <title
->Crear una cita nueva de la manera rápida</title
-> <para
-> Para crear una nueva cita simplemente haga clic en cualquier lugar vacío del calendario y empiece a escribir. </para
-> </tip
-> </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
- </sect1>
- <sect1 id="quickref-contact">
- <title
->Contactos</title>
- <para
-> Los atajos para las acciones más frecuentes de los contactos son los siguientes: <variablelist
-> <varlistentry
-> <term
->Modificar un contacto:</term
-> <listitem
-> <para
-> Es posible modificar un contacto de dos maneras: <itemizedlist
-> <listitem
-> <para
-> Haga clic en la tarjeta de visita para modificar cualquiera de sus propiedades visibles. </para
-> </listitem
-> <listitem
-> <para
-> Haga doble clic en la tarjeta de visita para modificar todas las propiedades. </para
-> </listitem
-> </itemizedlist
-> </para
-> </listitem
-> </varlistentry
-> </variablelist
-> <variablelist
-> <varlistentry
-> <term
->Borrar un contacto:</term
-> <listitem
-> <para
-> Pinche con el botón derecho sobre un contacto y elija <guilabel
->Borrar</guilabel
-> o seleccione el contacto y pulse el botón de la <guibutton
->papelera</guibutton
->.en la barra de herramientas. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> <variablelist
-> <varlistentry
-> <term
->Escribir a un contacto:</term
-> <listitem
-> <para
-> Haga clic con el botón derecho y elija <guilabel
->Enviar un mensaje al contacto</guilabel
->. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> <variablelist
-> <varlistentry
-> <term
->Creación de un contacto nuevo:</term
-> <listitem
-> <para
-> Haga doble clic en cualquier lugar vacío del administrador de contactos para crear una nueva tarjeta de visita. También puede utilizar: <menuchoice
-><guimenu
->Archivo</guimenu
-> <guisubmenu
->Nuevo</guisubmenu
-> <guimenuitem
->Contacto</guimenuitem
-> </menuchoice
-> o la combinación de teclas <keycombo action="simul"
-> <keycap
->Ctrl</keycap
-> <keycap
->Mayús</keycap
-> <keycap
->C</keycap
-> </keycombo
-> </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
- </sect1>
-</appendix>
diff --git a/help/es/preface.xml b/help/es/preface.xml
deleted file mode 100644
index ecd882da5b..0000000000
--- a/help/es/preface.xml
+++ /dev/null
@@ -1,181 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- The actual preface tag is in the evolution.xml file -->
- <sect1 id="organization">
- <title>Organización</title>
- <para> Este libro se divide en dos partes, más varios anexos. La primera parte es una <link linkend="usage">guía paso a paso</link> que le explicará cómo utilizar <application>Evolution</application>. Si no está familiarizado con <application>Evolution</application> o las aplicaciones de trabajo en grupo en general, esta sección es para usted. La segunda parte describe la configuración y está orientada a usuarios más avanzados, pero cualquiera que quiera cambiar la apariencia o comportamiento de <application>Evolution</application> sacará provecho de su lectura.
- </para>
- </sect1>
-
- <sect1 id="typography">
- <title>Convenciones tipográficas</title>
- <para> Determinadas palabras de este documento utilizan una tipografía particular:
- <simplelist>
- <member><application>Aplicaciones</application></member>
- <member><command>Órdenes</command> que se escriben en la línea de órdenes</member>
- <member><guilabel>Etiquetas</guilabel> para botones y otras partes del interfaz gráfico</member>
-
- <member>Las referencias a menús se parecerán a esto: <menuchoice> <guimenu>Menú</guimenu> <guisubmenu>Submenú</guisubmenu> <guimenuitem>Elemento del menú</guimenuitem> </menuchoice>
- </member> <member><guibutton>Botones</guibutton> en los que puede hacer clic</member> <member><userinput>Cualquier cosa que pueda escribir</userinput></member> <member> <computeroutput> Texto escrito en la pantalla</computeroutput></member>
- <member><glossterm linkend="apx-gloss">Palabras</glossterm> que puedan estar definidas en el <xref linkend="apx-gloss" />.</member>
- </simplelist>
-</para>
-<para> También se ofrecen numerosos detalles adicionales en consejos diferenciados del resto del libro.
-
- <tip id="example-tip">
- <title>Consejo</title>
- <para> Los consejos y detalles de información adicionales tendrán una apariencia como esta.
- </para>
- </tip>
-</para>
-
-<para> Los ejemplos también se diferencian del resto del libro. Tienen una apariencia como esta:
-
- <example>
- <title>Ejemplo de ejemplo</title>
- <para> Este es el aspecto de un ejemplo. Ofreceremos ejemplos para algunas de las tareas más complicadas que podría realizar.
- </para>
- </example>
-</para>
-<para> Finalmente, encontrará advertencias para casos en los es necesario prestar especial atención:
-
- <warning id="example-warning">
- <title>Ejemplo de advertencia</title>
- <para> Este es el aspecto de una advertencia. Si existe algún riesgo de problema, se lo avisamos de antemano.
- </para> </warning>
- </para>
- </sect1>
-
- <sect1 id="other-help">
- <title>Fuentes adicionales de ayuda </title>
- <para> Dispone de tres fuentes de ayuda. Para informarse de las opciones de la línea de órdenes, abra una ventana de una terminal y escriba <command> man evolution</command> o <command>evolution --help</command>. Para acceder a la asistencia técnica, noticias de última hora y erratas, visite el centro de asistencia de Ximian en <ulink url="http://support.ximian.com">support.ximian.com</ulink>.
-
- </para>
- </sect1>
-
-
-
-
-
-
-
-
-
-
-
-
- <sect1 id="whats-new-in-one-two">
- <title>Novedades en Evolution &appversion;</title>
- <para>
-
- Si ya está familiarizado con Ximian Evolution 1.2, hay algunas novedades en esta versión
- La mayoría, sin embargo, son entre bambalinas, ya que hemos migrado a la plataforma
- GNOME 2. Ximian Connector for Microsoft Exchange tiene algunas funciones nuevas que se
- describen en <xref linkend="new-in-connector" />. Puede encontrar una lista completa
- de todos los fallos resueltos y las funciones incorporadas en las notas de publicación de Evolution
- en el <ulink url="http://developer.ximian.com">web de desarrolladores de Ximian</ulink>. Algunas de
- las funciones son:
- </para>
- <variablelist>
- <varlistentry>
- <term>Mejor tipografía</term>
- <listitem>
- <para>
- Ximian Evolution &appversion; usa la misma técnica de suavizado que el resto del escritorio GNOME 2.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Paradas más limpias</term>
- <listitem>
- <para>
- Hemos resueslto algunos fallos que causaban que Evolution continuara consumiendo
- recursos del sistema cuando ya no se estaba ejecutando.
- </para>
- </listitem>
- </varlistentry>
-
-
- <varlistentry>
- <term>Mejoras en el editor de correo HTML</term>
- <listitem>
- <para>
- El editor de mensajes sigue siendo mejorado.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Nuevos gráficos y nuevos iconos</term>
- <listitem>
- <para>
- Hemos añadido nuevos gráficos y nuevos iconos.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect1>
-
-
-
-
-
-
-
-
-
-
-
- <sect1 id="preface-for-experts">
- <title>Notas introductorias para usuarios avanzados</title>
- <para>
- Esta sección tiene algunos trucos para usuarios avanzados de sistemas Linux o UNIX:
- </para>
- <variablelist>
- <varlistentry>
- <term>Copias de seguridad y localización de archivos</term>
- <listitem>
- <para>
- Para hacer una copia de seguridad de sus datos en Evolution copie el directorio
- <guilabel>~/evolution/local/</guilabel> a su unidad de respaldo. Para acceder
- desde Evolution a la información respaldada use la herramienta <guilabel>Importar</guilabel> para
- restaurar ficheros individuales según los necesite.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Navegadores predeterminados</term>
- <listitem>
- <para>
- Para definir qué navegador debe abrirse cuando pinche sobre un enlace en un mensaje de correo, abra
- la herramienta de configuración de GNOME (<menuchoice><guimenu>Sistema</guimenu><guimenuitem>Configuración</guimenuitem></menuchoice>
- <guilabel>World wide web (http)</guilabel>
- y elija el navegador de su elección. Si quiere usar otro que no está listado, tendrá que escribir la orden shell completa.
- Por ejemplo, puede usar <userinput>mybrowser "%s"</userinput> para lanzar la aplicación mybrowser y ver la página en cuestión.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Hacer de Evolution su cliente de correo predeterminado</term>
- <listitem>
- <para>
- En los escritorios GNOME puede configurar que sea
- <application>Evolution</application> el cliente de correo predeterminado, de manera que se abra cuando en una página web o
- en una de ayuda pinche en un enlace mailto:. Para conseguirlo, abra la herramienta de configuración de GNOME
- y lance la herramienta <guilabel>Asociación de ficheros</guilabel>. Aquí, mire dentro de <guilabel>Servicios de
- Internet</guilabel>, elija <guilabel>Transmisión de correo electrónico (mailto)</guilabel>, y elija
- <application>Evolution</application> de la lista desplegable.
- </para>
- <para>
- Para aplicaciones como Mozilla y Netscape, que no usan las herramientas de configuración de GNOME, necesitará
- localizar la herramienta de gestión de preferencias para los protocolos e introducir <userinput>evolution
- "%s"</userinput> como su preferencia para manejar enlaces de tipo mailto:.
- </para>
- </listitem>
- </varlistentry>
-
- </variablelist>
- </sect1>
-
diff --git a/help/es/topic.dat b/help/es/topic.dat
deleted file mode 100644
index bd7a3b64a6..0000000000
--- a/help/es/topic.dat
+++ /dev/null
@@ -1,11 +0,0 @@
-index.html Tabla de contenidos
-introduction.html Introducción
-usage-mainwindow.html Primeros pasos
-usage-summary.html Introducción al resumen
-usage-mail.html Uso del cliente de correo
-usage-contact.html Trabajar con contactos
-usage-calendar.html Planificacion del horario
-usage-exchange.html Conexión a un servidor Exchange
-config-prefs.html Configurando Evolution
-menuref.html Referencia rápida
-apx-gloss.html Glosario \ No newline at end of file
diff --git a/help/es/usage-calendar.xml b/help/es/usage-calendar.xml
deleted file mode 100644
index f366ad556e..0000000000
--- a/help/es/usage-calendar.xml
+++ /dev/null
@@ -1,715 +0,0 @@
-<!--
-<!DOCTYPE Chapter PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-
-<chapter id="usage-calendar">
- <title
->Planificación del horario</title>
-
- <para
-> Este capítulo explica cómo usar el calendario de Ximian Evolution para planificar su horario individual o en función de sus compañeros. Para saber cómo importar información del calendario consulte <xref linkend="importing-mail"/>, que describe la herramienta de importación. </para>
-
- <sect1 id ="usage-calendar-view"
->
- <title
->Opciones de la vista de calendario</title>
- <para
-> La barra de herramientas ofrece cuatro vistas diferentes para el calendario: <itemizedlist
-> <listitem
-> <para
-> Día </para
-> </listitem
-> <listitem
-> <para
-> Semana laboral </para
-> </listitem
-> <listitem
-> <para
-> Semana </para
-> </listitem
-> <listitem
-> <para
-> Mes </para
-> </listitem
-> </itemizedlist
-> </para>
-<para
-> Para cambiar entre diferentes vistas, haga clic en los botones con formas de calendario a la derecha de la barra de tareas. </para>
-<para
-> Puede elegir cualquier rango de días en el pequeño calendario a la derecha debajo de la barra de tareas. Sólo tiene que hacer clic y agrupar con el ratón las fechas que desea. </para>
- <para
-> Los botones <guibutton
->Volver</guibutton
-> y <guibutton
->Avanzar</guibutton
-> sirven para desplazarse adelante y atrás por las páginas del calendario. Por ejemplo, en la vista de un único día, se desplazará al día anterior, o al día siguiente, respectivamente. En el resto de las vistas, el desplazamiento se realizará en función del número de días correspondiente a cada vista. Para volver al día de hoy haga clic en <guibutton
->Ir a hoy</guibutton
-> en la barra de tareas. </para>
- <para
-> Para visitar la hoja de una fecha específica haga clic en <guibutton
->Ir a</guibutton
-> para abrir un cuadro de diálogo donde elegir la fecha. </para>
-
- </sect1>
- <sect1 id="usage-calendar-apts">
- <title
->Planificación con el calendario de Evolution</title>
- <para
-> Por supuesto, querrá usar el calendario para algo más que para saber qué día es hoy. Esta sección explica cómo planificar citas, crear citas periódicas o fijar alarmas. Si ha instalado Ximian Connector para Microsoft Exchange, consulte <xref linkend="full-advantage"/> acerca de cómo aprovechar al máximo las funciones de planificación de grupos en colaboración, disponibles en Microsoft Exchange Server. </para>
-
- <sect2 id="usage-calendar-apts-basic">
- <title
->Creación de citas</title>
- <para
-> Para crear una nueva cita elija <menuchoice
-> <guimenu
->Archivo</guimenu
-> <guisubmenu
->Nuevo</guisubmenu
-> <guimenuitem
->Cita</guimenuitem
-> </menuchoice
-> o haga clic en <guibutton
->Nueva cita</guibutton
-> en la izquierda de la barra de herramientas. Se abrirá el cuadro de diálogo <interface
->Nueva cita</interface
-> con una barra de menú, otra de herramientas y una ventana con varias opciones. </para>
- <tip id="new-appointment-shortcut"
-> <title
->Atajo</title
-> <para
-> Si no tiene que añadir más información que la fecha y la hora de la cita, haga clic en cualquier lugar vacío del calendario y empiece a escribir. Posteriormente podrá introducir otra información con el editor de citas. </para
-> </tip>
-
- <para
-> Su cita debe tener una fecha de inicio y otra de final -la fecha predeterminada es la del día de hpy- pero puede elegir entre las horas de inicio y final, o seleccionar un <guilabel
->Evento para todo el día</guilabel
->. Un <guilabel
->Evento para todo el día</guilabel
-> aparece al principio de la lista de citas, en una cabecera gris debajo de la fecha y no en la propia lista. Así se facilita que las citas puedan solaparse o encajar unas dentro de otras. Por ejemplo, puede definir una conferencia como un evento para todo el día, y las reuniones durante la conferencia, como citas con hora. Por supuesto que las citas con horas de inicio y final específicas también pueden solaparse. Cuando eso ocurre son mostradas con múltiples columnas en la vista del día del calendario. </para>
- <para
-> <application
->Evolution</application
-> es capaz de trabajar con distintas zonas horarias. Si comparte ficheros de calendario con amigos o compañeros de trabajo es bastante posible que tenga que configurar su zona horaria. Para hacerlo: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Elija <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-> </menuchoice
-> y haga clic en el icono<guilabel
->Agenda y tareas</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en el <guibutton
->Globo terráqueo</guibutton
-> en la sección <guilabel
->Hora</guilabel
-> dentro de la ficha <guilabel
->General</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Cada punto rojo representa a una ciudad importante. Haga clic en un punto y a continuación en <guibutton
->Aceptar</guibutton
-> para elegir su zona horaria. </para
-> </listitem
-> </orderedlist
-> </para>
- <para
-> También puede configurar información específica de la zona horaria a la hora de inicio y fin de cada cita. Abra una nueva cita y haga clic sobre el globo terráqueo para elegir la zona horaria acordada para la reunión. Por ejemplo, si vive en Almería, España, y tiene una reunión telefónica para la tarde con alguien en Veracruz, México, debe asegurarse que no se hacen las llamadas con varias horas de diferencia. Usar las zonas horarias adecuadas en cada cita ayuda a evitar esa confusión potencial. </para>
- <note
-> <title
->Múltiples citas simultáneas</title
-> <para
-> Si crea citas que se solapan, <application
->Evolution</application
-> las mostrará en el calendario lado a lado. Sin embargo <application
->Evolution</application
-> no tiene cómo ayudarle a hacer varias cosas a una misma vez. </para
-> </note>
- <para
-> Puede tener varios tipos de <guilabel
->Alarmas</guilabel
-> con cualquier antelación a la cita que ha planificado. Puede tener un recordatorio de cada uno de los siguientes tipos: <variablelist
-> <varlistentry
-> <term
-><guilabel
->Mostrar un mensaje:</guilabel
-></term
-> <listitem
-> <para
-> Se abrirá una ventana en la pantalla para recordable su cita. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Reproducir un sonido:</guilabel
-></term
-> <listitem
-> <para
-> Elíjalo si quiere que sus sistema emita un sonido como alarma. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Ejecutar un programa:</guilabel
-></term
-> <listitem
-> <para
-> Elija esto si quiere ejecutar un programa como recordatorio. Debe introducir el nombre en el campo de texto o buscarlo con el botón <guibutton
->Explorar</guibutton
->. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
-
-
- <note id="reminders-when-not-running-evo"
-> <title
->Recordatorios sin Evolution</title
-> <para
-> Si ha almacenado recordatorios en el calendario local, tendrán efecto desde el momento en el que inicie su sesión en el sistema. Sin embargo, para recibir recordatorios almacenados en el servidor Exchange, deberá ejecutar Evolution al menos una vez tras el inicio de sesión. Con independencia del modo de almacenamiento, si sale de Evolution recibirá los recordatorios de las citas próximas. </para
-> </note>
-
- <para
-> La <guilabel
->Clasificación</guilabel
-> sólo se aplica a los calendarios compartidos en red. La categoría predeterminada es <guilabel
->Publico</guilabel
->, y una cita pública puede ser examinada por cualquier miembro del calendario compartido. <guilabel
->Privado</guilabel
-> es un nivel de seguridad y <guilabel
->Confidencial</guilabel
-> es un nivel aún más alto. </para>
- <para
-> <application
->Evolution</application
-> puede planificar su disponibilidad si está usando Ximian Connector en un servidor Microsoft Exchange 2000. Para obtener más información acerca de Ximian Connector consulte <xref linkend="usage-exchange"/>. </para>
- <para
-> Para fijar su cita como libre u ocupada, haga clic en el cuadro de la sección <guilabel
->Mostrar tiempo como</guilabel
-> del <guilabel
->Editor de citas</guilabel
->. </para>
- <para
-> Si lleva una vida ajetreada, <application
->Evolution</application
-> puede ayudarle a clasificar sus citas . Esta clasificación se realiza en la sección al pie de la ficha <guilabel
->Cita</guilabel
->. </para>
-
- <tip
-> <title
->Añadir una categoría de citas nueva</title
-> <para
-> Para agregar una categoría nueva a la lista de categorías, haga clic en <guibutton
->Editar lista maestra de categorías</guibutton
-> y a continuación en <guilabel
->Pulse aquí para añadir una categoría</guilabel
->. </para
-> </tip>
-
- <para
-> Las categorías le permiten conocer todas las citas con actividades parecidas. Para ello, en la vista del calendario, cambie <guilabel
->Cualquier campo contiene</guilabel
-> a <guilabel
->La categoría es</guilabel
-> e introduzca a su derecha el nombre de la categoría. </para>
-
- <para
-> Haga clic en <guibutton
->Categorías</guibutton
-> para desplegar una lista de categorías. Para asociar las categorías a la cita sencillamente marque cada casilla de comprobación. </para>
- <para
-> Una vez que ha elegido las categorías haga clic en <guibutton
->Aceptar</guibutton
->. Las categorías elegidas se muestran en un cuadro a la derecha del botón <guibutton
->Categorías</guibutton
-> </para>
-
- <para
-> La ficha <guilabel
->Repetición</guilabel
-> sirve para describir la periodicidad de las citas que puede variar desde diaria hasta cada 100 años. Puede elegir una hora y una fecha a la que quiere que la cita deje de ser periódica y, en la sección <guilabel
->Excepciones</guilabel
->, elegir días individuales en los que la cita <emphasis
->no</emphasis
-> tendrá lugar. Haga su selección de izquierda a derecha y podrá construir una frase: "cada dos semanas en lunes y viernes hasta el 23 de junio de 2004" o "de cada mes el primer viernes en 12 ocasiones". </para>
-
- <para
-> Cuando ha terminado con todos los detalles haga clic en el icono del disco en la barra de tareas para guardar la cita y cerrar la ventana del editor. Si lo desea, puede modificar el resumen de una cita en la vista del calendario: haga clic sobre ella y escriba directamente. Para modificar el resto de detalles, haga clic con el botón derecho sobre la cita y elija <guimenuitem
->Abrir</guimenuitem
->. </para>
- </sect2>
- <sect2 id="usage-calendar-rsvp">
- <title
->Envío de una confirmación de asistencia (RSVP) con el Calendario</title>
- <para
-> <application
->Evolution</application
-> sirve para organizar reuniones de grupos y ayudarle a gestionar las respuestas a las solicitudes de reunión </para>
- <para
-> Al crear una reunión o una cita en grupo puede especificar a los asistentes en varias categorías como "presidencia" o "participante requerido". Cuando guarde su lista, cada invitado recibirá un mensaje con los datos de la cita y tendrán la opción de responder. </para>
-
- <note id="meeting-announce"
-> <title
->Anuncios sencillos</title
-> <para
-> Si no necesita recibir confirmaciones de asistencia al planificar un evento y sólo necesita anunciarlo seleccione <menuchoice
-><guimenu
->Acciones</guimenu
-><guimenuitem
->Reenviar como iCalendar</guimenuitem
-></menuchoice
->. Se abrirá un nuevo mensaje de correo con una notificación del evento adjunta. Los destinatarios podrán incluir el evento en sus calendarios con un clic, pero no le enviarán respuesta acerca de si asistirán o no. </para
-> </note>
-
- <para
-> Para planificar una reunión: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Elija <menuchoice
-> <guimenu
->Acciones</guimenu
-> <guimenuitem
->Planificar una reunión</guimenuitem
-> </menuchoice
->. Abra las fichas <guilabel
->Planificación</guilabel
-> y <guilabel
->Reunión</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Si tiene varias identidades en Evolution elija la que quiere usar entre las que se muestran en el campo <guilabel
->Organizador</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en el cuadro de texto <guilabel
->Pulse aquí para añadir un asistente</guilabel
-> para agregar los nombres y direcciones de correo de las personas a las que quiere invitar, o haga clic en <guibutton
->Invitar a otros</guibutton
-> para seleccionarlos a partir de su libreta de direcciones. </para
-> </listitem
-> <listitem
-> <para
-> Guarde la cita. </para
-> </listitem
-> </orderedlist
-> Ahora cada uno de los destinatarios recibirá un mensaje con su invitación al evento. </para>
- </sect2>
- <sect2 id="replying-to-rsvp">
- <title
->Respuesta a una solicitud de reunión</title>
- <para
-> Las solicitudes de reunión se envían como adjuntos iCal. Para verlos dentro de la ventana de correo y responder, haga clic en el icono del anexo. Se mostrarán todos los detalles del evento incluyendo la hora y las fechas. A continuación, elija su respuesta a la invitación: <itemizedlist
-> <listitem
-> <para
-> <guilabel
->Aceptar</guilabel
-> </para
-> </listitem
-> <listitem
-> <para
-> <guilabel
->Aceptar provisionalmente</guilabel
-> </para
-> </listitem
-> <listitem
-> <para
-> <guilabel
->Declinar</guilabel
-> </para
-> </listitem
-> </itemizedlist
-> Haga clic en <guibutton
->Aceptar</guibutton
-> para enviar un mensaje al organizador con su respuesta. Si acepta, el evento se incluirá en su calendario. </para>
-
- <para
-> Existen sin embargo algunas limitaciones a la hora de agregar una reunión al calendario: el organizador de una reunión es el único que puede agregar participantes. Como asistente, sólo tendrá la opción de aceptar o declinar la invitación. </para>
- <para
-> Tras incluir una reunión a su calendario, puede hacer cambios en su copia &mdash;cambiar la descripción, marcarse usted mismo como el organizador, invitar a más personas, etc&mdash; pero tenga presente que si el autor original envía otra actualización sus cambios pueden ser sobreescritos. </para>
- <note id="organizer-only-one"
-> <title
->No más de un organizador</title
-> <para
-> Una reunión sólo puede tener un organizador. Puede sustituirse al organizador, pero a menos de estar de acuerdo con él, corre el riesgo de provocar confusiones en el proceso de planificación. Si desea invitar a personas adicionales sin cambiar al organizador, lo mejor es reenviar el mensaje original del organizador a los nuevos invitados. </para
-> </note>
- </sect2>
-
- <sect2 id="receiving-rsvp-response">
- <title
->Recepción de respuestas a solicitudes de reunión</title>
- <para
-> Cuando reciba una respuesta a su invitación de reunión, podrá verla incluida dentro del mensaje. Haga clic con el botón derecho sobre el adjunto y elija <guibutton
->Ver incluido</guibutton
->. Al pie, haga clic en <guibutton
->Aceptar</guibutton
-> para actualizar su lista de asistentes. </para>
- </sect2>
-
-<!-- ############UNIMPLEMENTED FEATURES ###################
-
- <sect2 id="usage-calendar-apts-group">
- <title
->Appointments for Groups</title>
- <para>
- You can use <application
->Evolution</application
-> to mark a
- meeting request on another person's calendar. To do it, click
- <guibutton
->New</guibutton
-> in the calendar toolbar, or select
- <menuchoice
-> <guimenu
->File</guimenu>
- <guisubmenu
->New</guisubmenu>
- <guimenuitem
->Appointment</guimenuitem
-> </menuchoice
-> to bring
- up the <interface
->new appointment</interface
-> window. Then
- describe the appointment as you would any other. When you are
- ready to send the invitation <guibutton
->OK</guibutton>
- <application
->Evolution</application
-> will automatically send
- email to each person on the request list, notifying of the
- time and date of the meeting you have requested with them. In
- addition, it will mark the appointment on your calendar and on
- theirs as tentative, rather than a confirmed, appointment.
- </para>
- <para>
- To mark a tentative appointment as confirmed, click once on the
- appointment in the <interface
->calendar view</interface
-> to select
- it, and then choose <guimenuitem
->Appointment
- Properties</guimenuitem
-> from the <guimenu
->Settings</guimenu>
- menu. In the <interface
->Appointment Properties</interface
-> dialog
- window, click the "tentative" button to De-select the
- appointment.
- </para>
- <para>
- When your meeting attendees get the email inviting them to the
- meeting, they'll be able to enter the information into their
- calendars and let you know if they'll be able to attend; if
- they use <application
->Ximian Evolution</application
-> or
- another iCal compliant mail client, they can do this with just
- one click. When you get a response from them, it will include
- an iCal attachment. Opening and accepting this attachment will
- change the meeting data in your calendar to indicate that they
- have responded to your invitation, and whether they will be in
- attendance.
- </para>
- </sect2>
-
-
- <sect2 id="usage-calendar-apts-privs">
- <title
->Scheduling privileges</title>
- <para>
- There are several levels of scheduling privileges. You
- can set whether people can see your calendar, whether they
- can request meetings or appointments, and whether they can
- create appointments. This section may have to be deleted,
- because I don't know if we are going to support privileges
- at all.
- </para>
- </sect2>
- ########## END UNIMPLEMENTED FEATURESET ############ -->
- <sect2 id="usage-calendar-freebusy">
- <title
->Planificación de reuniones y vista de disponibilidad</title>
- <para
-> Además de las herramientas estándar de planificación de reuniones puede usar la vista de disponibilidad para comprobar de antemano si la gente estará ocupada o no. Por ahora, la vista de disponibilidad sólo funciona con servidores Microsoft Exchange. Sin embargo puede usar las invitaciones en la forma de eventos iCal para coordinar las agendas con otras personas sin importar qué servidor esté usando. </para>
- <para
-> Para acceder a la vista de disponibilidad: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Abra o cree una cita en la ventana <guilabel
->Calendario</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Elija <menuchoice
-> <guimenu
->Acciones</guimenu
-> <guimenuitem
->Planificar una reunión</guimenuitem
-> </menuchoice
-> </para
-> </listitem
-> <listitem
-> <para
-> Abra la ficha <guilabel
->Planificación</guilabel
->. </para
-> </listitem
-> </orderedlist
-> </para>
-
- <figure>
- <title
->Ventana de planificación de citas</title>
- <screenshot
-> <screeninfo
->Ventana de planificación de citas</screeninfo
-> <mediaobject
-><imageobject
-> <imagedata format="PNG" fileref="figures/schedule" srccredit="Kevin Breit"/> </imageobject
-></mediaobject
-> </screenshot>
- </figure>
-
- <para
-> <inlinemediaobject
-> <imageobject
-> <imagedata fileref="figures/full-1" format="PNG"/> </imageobject
-> </inlinemediaobject
-> <guilabel
->Lista de asistentes</guilabel
-> </para>
- <para
-> La <guilabel
->Lista de asistentes</guilabel
-> muestra a las personas que han sido invitadas a la reunión y el estado de sus confirmaciones de asistencia. </para>
- <para
-> <inlinemediaobject
-> <imageobject
-> <imagedata fileref="figures/full-2" format="PNG"/> </imageobject
-> </inlinemediaobject
-> <guilabel
->Cuadrícula de planificación</guilabel
-> </para>
- <para
-> La <guilabel
->Cuadrícula de planificación</guilabel
-> muestra la información de disponibilidad publicada de los invitados. Aquí es donde puede comparar las planificaciones de las personas para buscar tiempo libre en el que encajar la reunión. </para>
- <para
-> <inlinemediaobject
-> <imageobject
-> <imagedata fileref="figures/full-3" format="PNG"/> </imageobject
-> </inlinemediaobject
-> <guilabel
->Planificador de reuniones</guilabel
-> </para>
- <para
-> El <guilabel
->Planificador de reuniones</guilabel
-> permite planear la reunión en la ventana de <guilabel
->Disponibilidad</guilabel
->. </para>
- <sect3 id="usage-calendar-freebusy-scheduling">
- <title
->Planificando una cita</title>
- <para
-> Para planificar una cita primero necesita la información de disponibilidad de la gente. Si está usando Ximian Connector para Microsoft Exchange toda la información ya está disponible en la lista global de direcciones. En otro caso cada persona debe enviarle sus ficheros de planificación para que usted los incorpore a su calendario. </para>
- <para
-> Sea de donde sea que haya obtenido su información, Ximian Evolution la mostrará en la ficha <guilabel
->Planificación</guilabel
->. La hora de la cita pendiente aparecerá en blanco con bordes negros. En la lista aparecerá el tiempo libre y ocupado de cada asistente con un código de color junto a sus nombres. </para>
- <para
-> Para ajustar la hora de reunión, arrastre los bordes de la reunión, o haga clic en <guilabel
->Autoseleccionar</guilabel
-> para hacer una elección automática. Los asistentes en un servidor Exchange tendrán sus datos actualizados automáticamente, el resto recibirá una notificación por correo de cualquier cambio en los planes. </para>
-
- <para
-> Para obtener más información acerca de cómo usar esta función con Ximian Connector para Microsoft Exchange lea <xref linkend="full-advantage"/>. </para>
- </sect3>
- </sect2>
-
- </sect1>
-
- <sect1 id="usage-calendar-todo">
- <title
->La libreta de tareas</title>
- <para
-> La libreta de tareas, en el ángulo inferior derecho del calendario, permite mantener la lista de tareas separada de las citas del calendario. Para mostrar una ventana más grande, haga clic en <guibutton
->Tareas</guibutton
-> en la barra de atajos o en la lista de carpetas. </para>
- <para
-> Para registrar una tarea nueva pulse en en el botón <guibutton
->Añadir</guibutton
-> en la barra de tareas. <application
->Evolution</application
-> abrirá una pequeña ventana con cinco elementos: <variablelist
-> <varlistentry
-> <term
-> <guilabel
->Resumen</guilabel
-></term
-> <listitem
-> <para
-> La descripción que aquí escriba aparecerá en la lista de tareas <interface
->Para hacer</interface
->. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-> <guilabel
->Fecha de vencimiento</guilabel
-></term
-> <listitem
-> <para
-> Fija cuándo vence esta tarea. Puede escribir la fecha y la hora, o seleccionarla con los menús <guibutton
->calendario</guibutton
-> y <guibutton
->hora</guibutton
->. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Fecha de inicio</guilabel
-></term
-> <listitem
-> <para
-> La hora a la que espera empezar a trabajar. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-> <guilabel
->Descripción</guilabel
-></term
-> <listitem
-> <para
-> Es posible mantener una descripción más detallada de la tarea. Por ejemplo puede anotar que una tarea está en marcha y mostrar cuán cerca está de su conclusión. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Clasificación</guilabel
-></term
-> <listitem
-> <para
-> Define quién podrá leerla si comparte su calendario. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
- <para
-> Hay más opciones en la ficha <guilabel
->Detalles</guilabel
-> como las asignaciones de prioridad o de progreso. </para>
- <para
-> Tras agregar tarea a su lista de cosas por hacer, el resumen aparecerá en la sección <guilabel
->Resumen</guilabel
-> de la lista de tareas. Para ver o editar una descripción completa del elemento, haga doble clic sobre él, o haga clic con el botón derecho y elija <guibutton
->Abrir</guibutton
->. Para borrar los elementos, selecciónelos y haga clic en <guibutton
->Borrar</guibutton
->. </para>
- <para
-> La lista de tareas se ordena de manera parecida a la lista de mensajes en la vista de correo de <application
->Ximian Evolution</application
->. Haga clic en el título de la columna para cambiar la ordenación, o haga clic con el botón derecho para agregar o eliminar columnas. </para>
- <sect2 id="task-folders">
- <title
->Carpetas con tareas</title>
- <para
-> Como en cualquier otro componente de <application
->Evolution</application
->, puede crear una carpeta para ayudarle a organizar su tareas. Siga estos pasos: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Abrir <guilabel
->Barra de carpetas</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Seleccione <guibutton
->Tareas</guibutton
->. </para
-> </listitem
-> <listitem
-> <para
-> Abra el menú asociado con el botón derecho en <guibutton
->Tareas</guibutton
->. </para
-> </listitem
-> <listitem
-> <para
-> Elija <menuchoice
-><guimenuitem
->Crear carpeta</guimenuitem
-></menuchoice
->. </para
-> </listitem
-> <listitem
-> <para
-> Escriba el nombre de la carpeta. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Aceptar</guibutton
->. </para
-> </listitem
-> </orderedlist
-> </para>
- </sect2>
- </sect1>
-
- <sect1 id="usage-calendar-multiple">
- <title
->Calendarios múltiples</title>
- <para
-> <application
->Evolution</application
-> es capaz de administrar múltiples calendarios. Esta función es útil cuando administra calendarios de varias personas, porque es responsable de la asignación de recursos o espacios, o porque posee personalidad múltiple. </para>
-
- <example
-> <title
->Uso de calendarios múltiples</title
-> <para
-> Lucía, directora de una pequeña empresa, posee un calendario para su planificación. Otro para planificar reuniones en la sala de conferencias. Otro más para saber cuando los consultores visitan a los clientes y otro más para saber cuándo torea Paquirri. </para
-> </example>
- <para
-> Para crear un calendario elija: <menuchoice
-> <guimenu
->Archivo</guimenu
-> <guisubmenu
->Nuevo</guisubmenu
-> <guimenuitem
->Carpeta</guimenuitem
-> </menuchoice
->. En el cuadro de diálogo <guilabel
->Crear una carpeta nueva</guilabel
-> deberá decir que la nueva carpeta es de tipo calendario. Puede colocar el calendario en cualquier carpeta calendario y consultarla desde la vista de carpetas. </para>
- <para
-> Cada carpeta de calendario sólo puede guardar un único calendario. </para>
- </sect1>
-</chapter>
-
diff --git a/help/es/usage-contact.xml b/help/es/usage-contact.xml
deleted file mode 100644
index 6963b33814..0000000000
--- a/help/es/usage-contact.xml
+++ /dev/null
@@ -1,542 +0,0 @@
-<!--
-<!DOCTYPE Chapter PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-
-<chapter id="usage-contact">
- <title
->Trabajar con contactos</title>
- <para
-> Este capítulo describe la utilización de la libreta de direcciones de <application
->Evolution</application
->, y explica cómo organizar cualquier cantidad de contactos, compartir direcciones a través de una red así como aprovechar las numerosas soluciones que ofrece para ahorrar tiempo en las tareas cotidianas. Acerca de la configuración de la libreta de direcciones, consulte <xref linkend="config-prefs-contact"/>. Para importar los contactos de otras herramientas, utilice la herramienta Importar: para ello seleccione <menuchoice
-><guimenu
->Archivo</guimenu
-><guimenuitem
->Importar</guimenuitem
-></menuchoice
->, o envíeselas por correo como adjuntos en formato vCard. </para>
-
- <para
-> La barra de herramientas de la libreta de direcciones es muy sencilla. <itemizedlist
-> <listitem
-><para
-> Haga clic en <guibutton
->Contacto nuevo</guibutton
-> para crear una nueva tarjeta, o haga doble-clic en un espacio en blanco dentro de la lista de contactos. </para
-></listitem
-> <listitem
-><para
-> Haga clic en <guibutton
->Lista de contactos</guibutton
-> para crear una nueva tarjeta, o haga doble-clic en un espacio en blanco de la lista. </para
-></listitem
-> <listitem
-><para
-> El icono de la <guiicon
->impresora</guiicon
-> permite imprimir una o varias tarjetas. </para
-></listitem
-> <listitem
-><para
-> El icono con la señal de <guiicon
->Stop</guiicon
-> interrumpe la descarga de los contactos desde la red. Este botón sólo es relevante si está consultando los contactos desde una red. </para
-></listitem
-> </itemizedlist
-> </para>
-
- <para
-> Los datos de sus contactos llenan el resto de la pantalla. Puede desplazarse de una tarjeta a otra por orden alfabético con la ayuda de los cursores y de la barra de desplazamiento a la derecha de la ventana. Por supuesto, si la lista incluye un número importante de entradas, querrá utilizar la función de búsqueda prevista, para encontrarlas más rápidamente. </para>
-
- <sect1 id="usage-contact-cards">
- <title
->El editor de contactos</title>
- <para
-> Para eliminar un contacto: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Haga clic en el contacto para seleccionarlo. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Borrar</guibutton
->. </para
-> </listitem
-> </orderedlist
-> </para>
- <para
-> Utilice el editor de contactos para desea agregar o modificar tarjetas. Para modificar una tarjeta existente, haga doble clic en la tarjeta y abrirá la ventana del editor de contactos. Si desea crear una nueva tarjeta, haga clic en <guibutton
->Nuevo</guibutton
-> en la barra de herramientas para abrir otra ventana idéntica, pero con los campos vacíos para ser rellenados. </para>
-
- <para
-> La ventana del editor de contactos cuenta con tres solapas, <guilabel
->General</guilabel
->, con la información esencial, <guilabel
->Detalles</guilabel
->, con una descripción más precisa de la persona y <guilabel
->Colaboración</guilabel
->, para la información de planificación y colaboración de la persona. Además, contiene un menú <guimenu
->Archivo</guimenu
-> y otro <guimenu
->Acciones</guimenu
->, donde encontrará <guimenuitem
->Reenviar contacto</guimenuitem
->, que abre un mensaje nuevo con la tarjeta adjuntada y <guimenuitem
->Enviar un mensaje al contacto</guimenuitem
->, para abrir un mensaje nuevo dirigido al contacto. </para>
- <para
-> La barra de herramientas es relativamente sencilla: <guilabel
-> Guardar Cerrar</guilabel
->, <guilabel
-> Imprimir</guilabel
->,<guilabel
-> Cerrar</guilabel
-> y <guilabel
-> Borrar</guilabel
->. </para>
-
-
- <figure id="usage-contact-editor-fig">
- <title
->Editor de contactos de Evolution</title>
- <screenshot
-> <screeninfo
->Editor de contactos de Evolution</screeninfo
-> <mediaobject
-><imageobject
-><imagedata fileref="figures/contact-editor" format="PNG" srccredit="Aaron Weber"/> </imageobject
-></mediaobject
-> </screenshot>
- </figure>
-
- <para
-> La ficha <guilabel
->General</guilabel
-> cuenta siete secciones, con diferentes iconos: una careta para el nombre y organización; un teléfono para los números de teléfono; un sobre para la dirección de correo electrónico; un globo terráqueo para la dirección de la página Web; una casita para la dirección postal; una carpeta de archivos para los contactos, y por fin, un maletín para las categorías asociadas. </para>
- <para
-> <variablelist
-> <varlistentry
-> <term
->Nombre completo</term
-> <listitem
-> <para
-> El <guilabel
->Nombre completo</guilabel
-> tiene dos características principales: <itemizedlist
-> <listitem
-> <para
-> Puede escribir un nombre en el campo <guibutton
->Nombre completo</guibutton
-> pero también puede hacer clic en el botón <guibutton
->Nombre completo</guibutton
->: se abre un pequeño cuadro de diálogo con unos pocos campos de texto <variablelist
-> <varlistentry
-> <term
-><guilabel
->Tratamiento: </guilabel
-></term
-> <listitem
-> <para
-> Escriba o seleccione el tratamiento en el menú. </para
-></listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Nombre: </guilabel
-></term
-> <listitem
-> <para
-> Escriba el nombre de pila. </para
-></listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->2&ordm; Nombre: </guilabel
-></term
-> <listitem
-> <para
-> Escriba el segundo nombre, si se precisa. </para
-></listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Apellido: </guilabel
-></term
-> <listitem
-> <para
-> Escriba el apellido o los apellidos. </para
-></listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->Sufijo: </guilabel
-></term
-> <listitem
-> <para
-> Escriba el sufijo si lo hay, por ejemplo «Jr.» o «III». </para
-></listitem
-> </varlistentry
-> </variablelist
-> </para
-> </listitem
-> </itemizedlist
-> </para
-> <para
-> El <guilabel
->Nombre completo</guilabel
-> interactúa también con el botón <guilabel
->Guardar como</guilabel
-> a la hora de organizar sus contactos. </para
-> <para
-> Para ver cómo funciona, escriba un nombre en el campo <guilabel
->Nombre completo</guilabel
->. Como ejemplo, utilizaremos el nombre de la mascota de Ximian: <userinput
->Rupert T. Monkey</userinput
->. Observe cómo este nombre aparece también en el campo <guilabel
->Guardar como</guilabel
->, pero al revés: <computeroutput
->Monkey, Rupert</computeroutput
->. Puede seleccionar <computeroutput
->Rupert Monkey </computeroutput
-> en la lista desplegable, o escribirlo como prefiera, por ejemplo <userinput
-> T. Rupert Monkey </userinput
->. </para
-> <tip
-> <title
->Sugerencias para introducir datos</title
-> <para
-> No utilice nombres completamente diferentes del nombre real, pues podría llegar a olvidar que introdujo los datos de Rupert bajo la «E» de «Empleado ficticio de Ximian», por ejemplo. </para
-> </tip
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Valores múltiples en campos:</term
-> <listitem
-> <para
-> Si hace clic en los iconos que apuntan hacia abajo junto al campo <guilabel
->Correo electrónico principal</guilabel
-> puede seleccionar <guilabel
->Correo electrónico 2</guilabel
-> y <guilabel
->Correo electrónico 3</guilabel
->. El cliente <application
->Evolution</application
-> los almacena todos, aunque el editor de contacto sólo muestre uno de ellos a la vez. Las entradas con información poseen una marca junto a ellas. Los botones junto a los campos de teléfono y dirección postal funcionan del mismo modo. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
- <para
-> El último elemento de la ficha <guilabel
->General</guilabel
-> es el de la herramienta de organización de las <guilabel
->Categorías</guilabel
->. Para obtener información acerca de esta herramienta, consulte <xref linkend="usage-contact-organize"/>. </para>
- <para
-> La ficha <guilabel
->Detalles</guilabel
-> es mucho más sencilla: <itemizedlist
-> <listitem
-> <para
-> El maletín - Para apuntes sobre el historial profesional </para
-> </listitem
-> <listitem
-> <para
-> La careta - Para apuntes sobre la persona </para
-> </listitem
-> <listitem
-> <para
-> El globo terráqueo - Para otros apuntes. </para
-> </listitem
-> </itemizedlist
-> <tip
-> <title
->Atajos asociados a los contactos</title
-> <para
-> Es posible agregar tarjetas a partir de un mensaje de correo o de una cita del calendario. Con el mensaje abierto, haga clic con el botón derecho en cualquier dirección o mensaje de correo electrónico, y elija en el menú <guimenuitem
->Añadir remitente a la libreta de direcciones</guimenuitem
->. </para
-> </tip
-> </para>
- </sect1>
-
- <sect1 id="contact-search">
- <title
->Búsqueda de contactos</title>
- <para
-> <application
->Evolution</application
-> es capaz de simplificar la búsqueda de contactos. </para>
- <para
-> Para buscar dentro de los contactos: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Seleccione el elemento de búsqueda en la barra de búsqueda. </para
-> </listitem
-> <listitem
-> <para
-> Escriba su consulta. </para
-> </listitem
-> <listitem
-> <para
-> Presione intro para iniciar la búsqueda. </para
-> </listitem
-> </orderedlist
-> </para>
- <para
-> Para realizar una búsqueda compleja dentro de los contactos: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Abra <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Buscar contactos</guimenuitem
-> </menuchoice
-> </para
-> </listitem
-> <listitem
-> <para
-> Escriba un nombre para la regla en el campo <guilabel
->Nombre de la regla</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Configure el criterio de búsqueda en la sección <guilabel
->Si</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Si desea agregar otros criterios, haga clic en <guibutton
->Añadir criterio</guibutton
->. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Buscar</guibutton
->. </para
-> </listitem
-> </orderedlist
-> </para>
- <para
-> Para mostrar todos los contactos realice una consulta con el campo vacío. </para>
-
- </sect1>
-
- <sect1 id="usage-contact-organize">
- <title
->Organización de la libreta de direcciones</title>
- <para
-> La organización de la libreta de direcciones se asemeja mucho a la de sus mensajes. Puede utilizar carpetas y búsquedas como hace con los mensajes, pero la libreta de direcciones no admite carpetas virtuales. Sin embargo, sí permite clasificar cada tarjeta mediante numerosos criterios, así como crear criterios personales. Acerca de las categorías, consulte <xref linkend="usage-contact-organize-group-category"/>. </para>
-
-<!-- UNIMPLEMENTED FEATURE
- <para>
- Another useful <application
->Evolution</application
-> feature is
- its ability to recognize when people live or work together. If
- several people in your addressbook share an address, and you
- change the address for one of them,
- <application
->Evolution</application
-> will ask you if you wish to
- change the address for all of them, or just for one.
- </para>
--->
-
- <sect2 id="usage-contact-organize-group">
- <title
->Grupos de contactos</title>
- <para
-> <application
->Evolution</application
-> dispone de dos métodos para organizar sus tarjetas. El primer método son las carpetas; su funcionamiento es similar al de las carpetas de mensajes. Para mayor flexibilidad, puede utilizar marcas para asociar los contactos con diferentes categorías. Además, para mejorar la integración con las herramientas de correo, es posible crear listas de contactos a cuya dirección puede escribir mensajes, como si se tratara de una persona individual. </para>
-
- <sect3 id="usage-contact-organize-group-folder">
- <title
->Agrupación en carpetas</title>
- <para
-> Las carpetas son la forma más sencilla de agrupar tarjetas de direcciones. De forma predeterminada, las tarjetas se encuentran originalmente en la carpeta <guilabel
->Contactos</guilabel
->. Si se leyó <xref linkend="usage-mainwindow"/>, ya sabe cómo crear una carpeta nueva, con <menuchoice
-> <guimenu
->Archivo</guimenu
-> <guisubmenu
->Nuevo</guisubmenu
-> <guimenuitem
->Carpeta</guimenuitem
-> </menuchoice
->, y que puede ubicarlas donde prefiera. Como ocurre con los mensajes, las tarjetas pueden colocarse en una carpeta asociada, y la misma tarjeta no puede aparecer en dos lugares a la vez. Si desea mayor flexibilidad, consulte <xref linkend="usage-contact-organize-group-category"/>. </para>
- <para
-> Para colocar una tarjeta dentro de una carpeta, arrástrela desde la vista de carpetas. Recuerde que las tarjetas de contactos sólo pueden moverse a carpetas específicas de tarjetas, del mismo modo que las carpetas de mensajes sólo admiten mensajes, y las carpetas de calendarios, sólo calendarios. </para>
- </sect3>
-
- <sect3 id="usage-contact-organize-group-category">
- <title
->Agrupación por categorías</title>
- <para
-> El otro método para agrupar tarjetas consiste en marcarlas como pertenecientes a diferentes categorías. Por tanto, puede asociar una tarjeta con numerosas categorías, o no asociarla. Por ejemplo, la tarjeta de mi amigo Mateo tiene asociadas las categorías «Trabajo», porque trabaja conmigo; «Amigos» porque también es un amigo mío; y «Frecuentes», porque siempre que le llamo, nunca recuerdo su número de teléfono. </para>
- <para
-> Para asociar una tarjeta con una categoría, haga clic en <guibutton
->Categorías</guibutton
-> en la parte inferior derecha. En el cuadro de diálogo, active las casillas de todas las categorías que prefiera. </para>
-
- <!-- Feature Not Implemented
- <para>
-
- If the master list of categories doesn't suit you, you can
- add your own. Just enter the new category's name in the
- text box, then click <guibutton
->Categories</guibutton
-> and
- choose <guilabel
->Add to Master List</guilabel
-> in the
- window that appears.
- </para>
- -->
-
- </sect3>
-
- <sect3 id="usage-contact-organize-group-list">
- <title
->Creación de una lista de contactos</title>
- <para
-> Para crear una lista de contactos: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Abra el cuadro de diálogo de creación de lista: haga clic en <menuchoice
-><guibutton
->New</guibutton
-><guimenuitem
->Lista de contactos</guimenuitem
-></menuchoice
-> o seleccione <menuchoice
-> <guimenu
-> Archivo </guimenu
-> <guisubmenu
-> Nuevo </guisubmenu
-> <guimenuitem
-> Lista de contactos </guimenuitem
-> </menuchoice
->. </para
-> </listitem
-> <listitem
-> <para
-> Escriba un nombre en la lista. </para
-> </listitem
-> <listitem
-> <para
-> Escriba los nombres o direcciones de correo electrónico de los contactos, o arrástrelos desde la ventana principal, hasta la lista. </para
-> </listitem
-> <listitem
-> <para
-> Especifique si prefiere ocultar las direcciones cuando envía un mensaje a la lista. A menos que se trate de una lista muy pequeña, se recomienda dejar ocultas estas direcciones. Este funcionamiento es similar al de la característica «Bcc:», comentada en <xref linkend="usage-mail-getnsend-send-to-types"/>. </para
-> </listitem
-> </orderedlist
-> </para>
- <para
-> Cuando ha terminado, haga clic en <guibutton
->Aceptar</guibutton
->. La lista de contactos aparece como una tarjeta más, que puede utilizar como las demás. Esto incluye la posibilidad de enviar la lista a otra persona y, por supuesto, la de enviar un mensaje a la lista. </para>
- <para
-> Para enviar un mensaje a la lista, abra un mensaje nuevo y escriba el nombre correspondiente. Al enviarlo, Ximian Evolution transmitirá el mensaje a todos los miembros de la lista. También puede hacer clic con el botón derecho en la tarjeta correspondiente en la libreta de direcciones, y seleccionar <guimenuitem
->Enviar un mensaje a la lista</guimenuitem
->. </para>
- <para
-> Ximian Evolution no puede almacenar listas de contactos en servidores Exchange. </para>
-
- </sect3>
- </sect2>
- </sect1>
-
- <sect1 id="usage-contact-sharing">
- <title
->Protocolo LDAP: libretas de direcciones compartidas en red</title>
-
- <para
-> El diseño del protocolo <glossterm linkend="ldap"
->LDAP</glossterm
-> permite a los usuarios compartir información de contactos en red, mediante accesos compartidos a una libreta de direcciones central. El protocolo LDAP permite que una organización ponga un conjunto de contactos a la dispocición de sus miembros, o de un departamento. Numerosas organizaciones conservan en una libreta LDAP las direcciones de todos sus empleados o los contactos de clientes. </para>
-
- <para
-> Para obtener información acerca de cómo agregar un directorio remoto dentro de sus carpetas de contactos disponibles, consulte <xref linkend="config-prefs-contact"/>. Tras establecer una conexión LDAP, la carpeta o las carpetas de contactos en red aparecerán dentro de la barra de carpetas bajo <guilabel
->Otros contactos</guilabel
->. Funciona exactamente como una carpeta de tarjetas locales, con las excepciones siguientes: <itemizedlist
-> <listitem
-> <para
-> Las carpetas de red sólo están disponibles cuando se conecta a la red. Si utiliza un equipo portátil o una conexión telefónica, conviene hacer una copia del directorio de red, o colocar éste en caché. Para ello, arrastre los contactos deseados dentro de la lista de contactos local. </para
-> </listitem
-> <listitem
-> <para
-> Para reducir el tráfico de red, <application
->Evolution</application
-> no descarga normalmente el contenido de las carpetas LDAP en el mismo momento de conectar. Es necesario hacer clic en <guilabel
->Mostrar todo</guilabel
-> para descargar todo el contenido de la carpeta LDAP desde la red. Puede modificar este comportamiento en la ventana <interface
->Preferencias de los contactos</interface
->. </para
-> </listitem
-> <listitem
-> <para
-> No puede agregar, eliminar o modificar las tarjetas del propio servidor LDAP. Si necesita modificar el contenido del servidor, póngase en contacto con el administrador del sistema. </para
-> </listitem
-> </itemizedlist
-> </para>
- <sect2 id="usage-contact-sharing-setup">
- <title
->Configuración de Evolution para utilizar LDAP</title>
- <para
-> Para más información acerca de cómo configurar el cliente <application
->Evolution</application
-> para que utilice el protocolo LDAP, consulte <xref linkend="config-prefs-contact" /> </para>
- </sect2>
- </sect1>
-
- <sect1 id="contact-automation-basic">
- <title
->Cómo agregar tarjetas rápidamente</title>
- <para
-> Como se explicó anteriormente, cuando recoje información en un mensaje o en una entrada en el calendario acerca de una persona, puede añadirla a una tarjeta de visita. Para eso, pinche con el botón derecho sobre cualquier dirección de correo o sobre cualquier mensaje y elija la opción <guimenuitem
->Añadir remitente a la libreta de direcciones</guimenuitem
->. <application
->Evolution</application
-> también puede añadir tarjetas desde dispositivos de mano durante la operación de sincronización. Para saber más sobre esto consulte<xref linkend="usage-sync"/>. </para>
- </sect1>
-
-<!-- Unimplemented features:
- <para>
- You can also use the addressbook to print postal addresses
- on mailing labels. Future versions of
- <application
->Evolution</application
-> will allow you to you
- export a group of cards to a spreadsheet, database, or word
- processor so you can print address labels or prepare large
- mailings.
- </para>
- <para>
- Need a map or directions? Click <guibutton
->MapIt</guibutton
-> from
- within the addressbook, and <application
->Evolution</application>
- will map the address for you online.
- </para>
- -->
-</chapter
->
-
-
-
-
diff --git a/help/es/usage-exchange.xml b/help/es/usage-exchange.xml
deleted file mode 100644
index 4cc208e751..0000000000
--- a/help/es/usage-exchange.xml
+++ /dev/null
@@ -1,849 +0,0 @@
- <chapter id="usage-exchange">
- <title
->Ximian Connector para Microsoft Exchange</title>
- <para
-> Ximian Connector para Microsoft Exchange permite a los clientes Ximian Evolution tener acceso a cuentas de servidores Microsoft Exchange 2000. La aplicación está disponible, en su propio canal, a través de Ximian Red Carpet, pero su utilización requiere un archivo de licencia. Puede adquirir el archivo de licencia en la tienda en línea de Ximian, en la dirección <ulink url="http://store.ximian.com"
->store.ximian.com</ulink
->. A diferencia del cliente Ximian Evolution normal, el programa Ximian Connector para Microsoft Exchange es un software propietario cuyo código fuente no está disponible. </para>
-
- <warning id="licensing">
- <title
->Requisitos</title>
- <para
-> Ximian Connector sólo funciona con Exchange 2000, y requiere habilitar el componente Outlook Web Access. Cada usuario debe disponer de una cuenta válida en el servidor Microsoft Exchange 2000, incluida la licencia. </para>
- </warning>
-
- <sect1 id="new-in-connector">
-<title
->¿Qué novedades hay en Connector &appversion;?</title>
- <para
-> Ximian Connector &appversion; incluye la función <guilabel
->Out of Office</guilabel
-> y una herramienta de configuración automática para grandes instalaciones Exchange. </para>
-
- <para
-> Las versiones anteriores de Ximian Connector for Microsoft Exchange incluyen la prestación <guibutton
->Marca de seguimiento</guibutton
->, carpetas públicas, delegación , reserva directa, etc. Para saber cómo configurar la delegación examine <xref linkend="exchange-delegate"/>. </para>
-
-</sect1>
-
- <sect1 id="features">
- <title
->Características del componente Connector</title>
- <para
-> Además de las enumeradas, <application
->Ximian Connector</application
-> es compatible con las siguientes características básicas de <application
->Microsoft Exchange</application
->: <itemizedlist
-> <listitem
-> <para
-> General </para
-> <variablelist
-> <varlistentry
-> <term
->Almacén remoto de información de <application
->Exchange</application
-></term
-> <listitem
-> <para
-> El cliente <application
->Evolution</application
-> permite tener acceso al correo, a la libreta de direcciones (incluso a la carpeta de la lista global de direcciones) así como a las carpetas de calendarios y tareas en unservidor <application
->Exchange 2000</application
->. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Sincronización con Palm</term
-> <listitem
-> <para
-> Compatibilidad con los contactos y calendarios de Exchange. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </listitem
-> <listitem
-> <para
-> Correo </para
-> <variablelist
-> <varlistentry
-> <term
->Leer correo en una carpeta <application
->Exchange</application
-></term
-> <listitem
-> <para
-></para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Envío de correo mediante protocolos Exchange</term
-> <listitem
-> <para
-> Puede utilizar el protocolo de transporte de correo de Microsoft Exchange para enviar correo. Asegúrese de que la dirección de correo electrónico que utiliza coincide con la que registró en el servidor Exchange. Puede que sea «minombre@exchange-server.ximian.com» en lugar de «minombre@ximian.com». </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </listitem
-> <listitem
-> <para
-> Calendario </para
-> <variablelist
-> <varlistentry
-> <term
->Solicitud y convocatoria de reunión</term
-> <listitem
-> <para
-> Permite a los usuarios del cliente <application
->Evolution</application
-> programar sus reuniones y examinar en <application
->Exchange</application
-> la disponibilidad de asistencia de otros usuarios (que usen <application
->Evolution</application
-> o <application
->Outlook</application
->). </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Agregar solicitudes de reuniones iCalendar a Calendar</term
-> <listitem
-> <para
-> Si recibe una solicitud de reunión con iCalendar y la agrega a su calendario, quedará guardada dentro de su calendario<application
->Exchange</application
->. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </listitem
-> <listitem
-> <para
-> Contactos </para
-> <variablelist
-> <varlistentry
-> <term
->Función autocompletar para direcciones</term
-> <listitem
-> <para
-> Compatible con la carpeta Contactos de <application
->Exchange</application
->. No está disponible aún para la lista global de direcciones. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Agregar tarjetas de visita a la libreta de direcciones</term
-> <listitem
-> <para
-> Si recibe una tarjeta adjunta y hace clic en <guibutton
->Guardar en la libreta de direcciones</guibutton
->, se incluirá en su en la libreta de direcciones <application
->Exchange</application
->. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Desde los mensajes recibidos puede crear nuevas entradas en la libreta de direcciones de <application
->Exchange</application
-> con un sólo clic.</term
-> <listitem
-> <para
-> </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </listitem
-> </itemizedlist
-> </para>
-
-<para
-> Algunas características no están sin embargo disponibles: <itemizedlist
-> <listitem
-> <para
-> Función «Trabajar desconectado» (modo desconectado). </para
-> </listitem
-> <listitem
-> <para
-> Función «Mensaje de recuperación». </para
-> </listitem
-> </itemizedlist
-> </para>
- </sect1>
- <sect1 id="install">
- <title
->Instalación de Connector</title>
- <para
-> Para instalar Ximian Connector, ejecute la herramienta Ximian Red Carpet: seleccione <menuchoice
-><guimenu
->Sistema</guimenu
-><guimenuitem
->Obtener software</guimenuitem
-></menuchoice
->. Suscríbase al canal Ximian Connector para Microsoft Exchange, seleccione Ximian Connector para Microsoft <application
->Exchange 2000</application
-> y haga clic en <guibutton
->Instalar</guibutton
->. Si lo desea también puede instalar Connector descargando individualmente los paquetes desde ftp.ximian.com. </para>
- <para
-> Tras el programa, necesitará instalar también un archivo de licencia. El archivo de licencia es el comprobante de pago de la licencia de uso del programa Ximian Connector. Puede obtener el archivo de licencia en la tienda en línea de Ximian, en la dirección <ulink url="http://store.ximian.com"
->store.ximian.com</ulink
->. Es necesario utilizar un navegador con una fuerte capacidad de cifrado (128 bits o más) para tener acceso al servicio en línea. Tras adquirir una licencia Ximian Connector, el servicio le envía el archivo correspondiente, con instrucciones de instalación. Una vez instalado, el archivo de licencia desbloquea las funciones operativas de Ximian Connector y le permite conectarse a un servidor <application
->Exchange</application
->. </para>
- </sect1>
-
- <sect1 id="exchange-configure">
- <title
->Añadir su cuenta Exchange a Ximian Evolution</title>
- <para
-> Tras instalar el programa Connector, necesita configurar el acceso a su cuenta <application
->Exchange</application
-> tanto en el servidor <application
->Exchange</application
-> como en el programa Evolution. </para>
-
- <sect2 id="config-server">
- <title
->Configuración del servidor Exchange</title>
- <para
-> Compruebe con el administrador del sistema los puntos siguientes: <itemizedlist
-> <listitem
-> <para
-> Posee una cuenta válida en el servidor <application
->Exchange</application
->. </para
-> </listitem
-> <listitem
-> <para
-> Su acceso a la cuenta está autorizado mediante WebDAV. Este es el valor predeterminado del servidor <application
->Exchange</application
->, y no debería sernecesario modificarlo, a menos que su administrador de sistema lo haya deshabilitado. </para
-> </listitem
-> </itemizedlist
-> </para>
-
- <para
-> El con la base de conocimientos de Ximian, en la dirección <ulink type="http" url="http://support.ximian.com"
->support.ximian.com</ulink
->, contieneinformación adicional para asegurar que su servidor <application
->Exchange</application
-> acepte las conexiones del cliente Ximian Evolution. </para>
- </sect2>
-
-
- <sect2 id="config-client">
- <title
->Herramienta estándar de configuración de Ximian Connector</title>
- <para
-> Una vez sepa que su servidor está disponible para conectarse, usted está preparado para añadir su cuenta Exchange a Ximian Connector. </para>
-
-
- <sect3 id="config-easy">
- <title
->Herramienta sencilla de configuración de Ximian Connector</title>
- <para
-> Ximian Connector 1.4 viene de serie con una herramienta sencilla para la creación de cuentas para ciertas instalaciones. El resto necesitarán de la herramienta estándar descrita más abajo en <xref linkend="config-client"/>. </para>
- <para
-> El asistente sencillo funciona en los siguientes casos: <itemizedlist
-> <listitem
-> <para
-> Si recibe su clave de licencia en Ximian Evolution, el asistente sencillo se lanzará cuando pinche sobre el fichero adjunto con la licencia y elija <guibutton
->Abrir en Ximian Connector</guibutton
->. </para
-> </listitem
-> <listitem
-> <para
-> Si no tiene configurada ninguna cuenta y su administrador de sistemas ha preinstalado un archivo de licencia, el asistente sencillo se lanzará en el momento en que lance Ximian Evolution. Solamente le preguntará por el servidor Outlook Web Access que use, su nombre de usuario y su contraseña. Ximian Connector determinará por sí mismo el resto de la información necesaria. </para
-> </listitem
-> </itemizedlist
-> </para>
- <para
-> Si la herramienta sencilla de gestión de cuentas no se ejecuta automáticamente, puede crear una cuenta como se descibe más abajo. </para>
- </sect3>
-
-
- <sect3 id="config-exchange-new-account">
- <title
->Creación de una nueva cuenta Exchange</title>
-
-
- <para
-> Si quisiera crear una nueva cuenta en el servidor Exchange, haga clic, desde cualquier vista de correo, en <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Cuentas de correo</guimenuitem
-></menuchoice
->.Pulse el botón <guibutton
->Añadir</guibutton
-> en la lista de cuentas. El asistente de creación de cuentas le guiará a lo largo del proceso, que también está descrito en <xref linkend="usage-mainwindow-starting"/>. Si duda en algo de la información necesaria pregunte directamente a su administrador del sistema. </para>
-
- <note id="license-file-issues"
-> <title
->Instalación del archivo de la licencia</title
-> <para
-> Su mensaje de compra contendrá instrucciones sobre cómo instalar el archivo con la licencia: se pude abrir con Ximian Evolution e instalar automáticamente o también situarlo a mano en el directorio <systemitem
->evolution</systemitem
-> de su directorio de inicio. </para
-> <para
-> Tenga cuidado de que no haya ningún directorio <systemitem
->evolution</systemitem
-> colgando de su directorio de inicio si previamente no ha ejecutado Ximian Evolution. Si no lo ha hecho aún, láncelo y configure una cuenta como se explica a continuación. Después salga de la aplicación y ponga el archivo <systemitem
->connector-key.txt</systemitem
-> en su directorio <systemitem
->evolution</systemitem
->. Cuando vuelva a lanzar Evolution, éste verificará la licencia y Ximian Connector funcionará como es debido. </para
-> </note>
-
-
- <variablelist
-> <varlistentry
-> <term
->Identidad</term
-> <listitem
-> <para
->Escriba su nombre y dirección de correo electrónico. Si lo desea, puede agregar su organización así como la ruta de su archivo de firma. Sólo son obligatorios su nombre y dirección de correo electrónico. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Recepción de correo</term
-> <listitem
-> <para
-> En esta etapa, especifique cómo desea comprobar su correo: <orderedlist
-> <listitem
-> <para
-> En primer lugar, seleccione <guilabel
->Microsoft Exchange</guilabel
-> como tipo de servidor. </para
-> </listitem
-> <listitem
-> <para
-> Escriba el nombre del servidor Exchange y el nombre de usuario de inicio de sesión, en una estación de trabajo dentro de su organización. </para
-> </listitem
-> <listitem
-> <para
-> Si lo desea, active la casilla <guilabel
->Usar conexiones seguras (SSL)</guilabel
->, para reforzar la seguridad de su conexión. Esta opción le permite conectarse al servidor sin utilizar un cortafuegos. </para
-> </listitem
-> <listitem
-> <para
-> Elija el tipo de autenticación que se usa en su red: haga clic en <guilabel
->Comprobar tipos soportados</guilabel
-> para ver cuál funciona. </para
-> </listitem
-> <listitem
-> <para
-> Si desea que <application
->Evolution</application
-> recuerde su contraseña, active la casilla <guilabel
->Recuerda esta contraseña</guilabel
->. </para
-> </listitem
-> </orderedlist
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Recepción de correo - Etapa dos</term
-> <listitem
-> <para
->Esta etapa incluye algunas opciones adicionales: <orderedlist
-> <listitem
-> <para
-> Comprobación de correo nuevo: para comprobar automáticamente la presencia de correo nuevo, active la casilla y especifique un intervalo en minutos. </para
-> </listitem
-> <listitem
-> <para
-> Global Address List/Active Directory: escriba el nombre de su servidor global de catálogos (el servidor de directorio). Será el que le permita usar la lista global de direcciones (en inglés GAL). En general Evolution se traerá un máximo de 500 respuestas de cualquier consulta, pero si lo desea puede aumentar o disminuir la cifra. Cuanto más bajo sea el número menor será la carga de trabajo del servidor y por otro lado muchos servidores sencillamente no entregan más de 1000 resultados sea cual sea la cantidad que pidió en su consulta. <note id="why-you-need-gal"
-> <title
->El servidor Global de Catálogo</title
-> <para
-> El servidor global de catálogo provee acceso a la lista global de direcciones, a la información de disponibilidad y a las funciones de delegación de carpetas. Todo esto no funcionará bien del todo si no tiene un servidor global de catálogo. </para
-> </note
-> </para
-> </listitem
-> <listitem
-> <para
-> Servidor Exchange: aquí hay dos opciones posibles: <itemizedlist
-> <listitem
-> <para
-> Nombre del buzón Exchange: escriba el nombre de su buzón exchange; probablemente el valor sugerido sea correcto. </para
-> </listitem
-> <listitem
-> <para
-> Ruta de acceso a Outlook Web Access (OWA): en muchos casos la URL de acceso a Outlook Web Access (OWA) es <quote
->http://server.company.com/exchange</quote
->. Si su sistema tiene una ruta que no es <quote
->exchange</quote
-> active esta casilla e introduzca la ruta correcta. </para
-> </listitem
-> <listitem
-> <para
-> Servidor de carpetas públicas: escriba el nombre de su servidor de carpetas públicas. </para
-> </listitem
-> </itemizedlist
-> </para
-> </listitem
-> <listitem
-> <para
-> Aplicar los filtros a los mensajes nuevos en.la bandeja de entrada para este servidor. Active esta casilla para filtrar los mensajes de esta cuenta. </para
-> </listitem
-> </orderedlist
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Envío de correo</term
-> <listitem
-> <para
->Seleccione <guilabel
->Microsoft Exchange</guilabel
-> como método de envío del correo. No es necesario hacer nada más en esta etapa.</para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Gestión de la cuenta</term
-> <listitem
-> <para
->Escriba un nombre que le servirá para recordar esta cuenta: «Cuenta Exchange» es una buena sugerencia. Observe que no puede tener dos cuentas con el mismo nombre. Si desea hacer de ella su cuenta predeterminada para el envío de correo, active la casilla <guilabel
->determinada</guilabel
->.</para
-> </listitem
-> </varlistentry
-> </variablelist>
- <para
-> Ha terminado. Haga clic en <guibutton
->Terminar</guibutton
-> y en <guibutton
->Aceptar</guibutton
->; a continuación, cierre y vuelva a iniciar el programa <application
->Evolution</application
->. A partir de ahora, está listo para trabajar con el servidor Exchange. </para>
-
-
-
- </sect3>
-
- <sect3 id="config-exchange-existing-account">
- <title
->Modificación de una cuenta existente para utilizarla con Exchange</title>
- <para
-> Si ya dispone de una cuenta de correo y desea convertirla para utilizarla con Exchange, seleccione dicha cuenta y haga clic en <guibutton
->Editar</guibutton
->. En el cuadro de diálogo, deberá modificar probablemente la configuración de las fichas siguientes: </para>
-
- <figure>
- <title
->Configuración de cuentas Exchange: identidad</title>
- <screenshot
-> <screeninfo
->Creación de una cuenta Exchange - Etapa uno: identificación</screeninfo
-> <mediaobject
-><imageobject
-> <imagedata format="PNG" fileref="figures/exchange-identity" srccredit="Aaron Weber"/> </imageobject
-></mediaobject
-> </screenshot>
- </figure>
-
-
- <variablelist
-> <varlistentry
-> <term
->Identidad</term
-> <listitem
-> <para
-> Modifique en esta ficha su dirección de correo, si ha cambiado por utilizar un servidor nuevo. En caso contrario, pase a la ficha siguiente. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Recepción de correo</term
-> <listitem
-> <para
-> Indique <guilabel
->Microsoft Exchange</guilabel
-> como tipo de servidor. Escriba el nombre del servidor en el campo <guilabel
->Host</guilabel
-> así como el nombre de usuario de su cuenta, en el campo <guilabel
->Nombre de usuario</guilabel
->. Si su servidor admite cifrado SSL (Secure Socket Layer), puede activar la casilla <guilabel
->Utilizar SSL</guilabel
-> para reforzar la seguridad en sus intercambios de datos. <figure
-> <title
->Configuración de cuentas: recepción de correo</title
-> <screenshot
-> <screeninfo
->Creación de una cuenta Exchange, segundo paso: Recepción de correo</screeninfo
-> <mediaobject
-><imageobject
-> <imagedata format="PNG" fileref="figures/exchange-receive" srccredit="Aaron Weber"/> </imageobject
-></mediaobject
-> </screenshot
-> </figure
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Opciones de recepción</term
-> <listitem
-> <para
-> Aquí encontrará algunas opciones adicionales:<variablelist
-> <varlistentry
-> <term
->Comprobación de correo nuevo</term
-> <listitem
-> <para
-> Elija si quiere que su correo se compruebe automáticamente y en caso positivo, con qué frecuencia. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Global Address List/Active Directory</term
-> <listitem
-> <para
->La Lista Global de Direcciones (en inglés GAL) es una libreta de direcciones donde figuran todos los usuarios de una instalación Exchange. Para usar el GAL pinche en la solapa titulada <guilabel
->Receiving Options</guilabel
-> y escriba el nombre de su servidor global de catálogo. Dado que el GAL lo mantiene su administrador de sistemas, usted no puede usar Ximian Evolution para añadir, modificar o eliminar los elementos almacenados. Sin embargo puede usarlo para invitar a gente a reuniones y para buscar direcciones y otra información de trabajo en grupo.</para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Exchange Server</term
-> <listitem
-> <para
-> Si su servidor Exchange exige usar un buzón con un nombre que es diferente a su identificador de usuario, marque la segunda casilla y escriba allí el nombre del buzón. Si tiene dudas consúlteselo a su administrador de sistema.</para
-> <para
-> En muchos casos la URL para el acceso web es «http://server.company.com/exchange». Si la ruta en su sistema no es «exchange», active la casille y escriba la ruta adecuada.</para
-> <para
-> Si su red usa un servidor carpetas públicas diferente de el de las personales, escriba aquí su nombre. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> <figure
-> <title
->Configuración de cuentas Exchange: recepción de correo</title
-> <screenshot
-> <screeninfo
->Creación de una cuenta Exchange, tercer paso: opciones de correo</screeninfo
-> <mediaobject
-><imageobject
-> <imagedata format="PNG" fileref="figures/exchange-receive-options" srccredit="Aaron Weber"/> </imageobject
-></mediaobject
-> </screenshot
-> </figure
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Envío de correo</term
-> <listitem
-> <para
-> Si piensa utilizar su servidor Exchange para enviar y recibir correo, seleccione <guilabel
->Microsoft Exchange</guilabel
-> como tipo de servidor, y escriba su nombre en el campo <guilabel
->Host</guilabel
->. </para
-> </listitem
-> </varlistentry
-> </variablelist>
- <para
-> Tras introducir estas modificaciones, haga clic en <guibutton
->Aceptar</guibutton
->. </para>
- <para
-> A continuación, cierre y vuelva a iniciar el programa <application
->Evolution</application
->. Los cambios en la configuración de cuentas de Ximian Connector no se activarán hasta después de que reinicie la aplicación. </para>
- </sect3
->
- </sect2>
- </sect1>
-
- <sect1 id="access">
- <title
->Acceder al servidor <application
->Exchange</application
-></title>
- <para
-> Como ocurre con la información IMAP y LDAP, la información de cuentas de <application
->Exchange</application
-> se almacena en el servidor, y no en su equipo de sobremesa. Esto significa que podrá tener acceso a su cuenta desde múltiples ubicaciones. También significa que la información de su cuenta Microsoft <application
->Exchange</application
-> se encuentra en un árbol de carpetas separado del árbol <guilabel
->Local</guilabel
->, dentro de la barra de carpetas. Lo podrá ver bajo el árbol local, con el nombre que utilizó para su cuenta. Si dispone de varias cuentas, también tendrá varios árboles de carpetas. </para>
- <para
-> Haga clic en cualquiera de las carpetas para visitarla; tendrá probablemente que introducir la contraseña de su servidor. A partir de ahora puede crear contactos, enviar y recibir correo de la forma habitual. Si desea agregar a los almacenes de <application
->Exchange</application
-> elementos de su calendario local, o de su propia libreta de direcciones, puede copiarlos y pegarlos, o simplemente arrastrarlos de una carpeta a otra, como si se tratara de almacenes locales. </para>
-
- <note id="save-to-local-or-exchange"
-> <title
->Guardar direcciones y citas adjuntas</title
-> <para
-> Cuando utiliza a la vez una cuenta Exchange y una cuenta local, conviene tener presente que cada vez que guarda una dirección de correo o una cita a partir de un mensaje, ésta se guardará en la lista de contactos o en el calendario de Exchange, en lugar de hacerlo en su cuenta local. Lo mismo ocurre para sincronizar dispositivos Palm-OS: las tareas, citas y direcciones de Palm-OS se sincronizarán con las carpetas correspondientes en Exchange, y no en su equipo local. </para
-> </note>
-
- <tip id="gal-empty"
-> <title
->Al principio la lista global de direcciones está vacía</title
-> <para
-> Para evitar una carga inútil en el servidor, la lista global de direcciones se muestra vacía hasta que realiza una primera búsqueda. Si desea mostrar todas las tarjetas de la lista, haga clic en el campo de búsqueda y presione <keycap
->Intro</keycap
->. Con esto, ejecuta una búsqueda en blanco: como todas las tarjetas contienen un blanco, aparecerán todas. </para
-> </tip>
-
- </sect1>
-
- <sect1 id="exchange-settings">
- <title
->Opciones especiales exclusivas del Connector</title>
- <para
-> En la herramienta de configuración de Evolution hay dos elementos que que están disponibles solamente con Ximian Connector. El primero es para el manejo de delegación y permisos y el segundo es para la creación de mensajes de «estoy fuera». </para>
-
- <sect2 id="exchange-delegate">
- <title
->Delegación de acceso</title>
- <para
-> Puede permitir a otras personas anotadas en la lista gobal de direcciones de su organización acceso a su calendario, libreta de direcciones y mensajes. Y ellos pueden darle a usted acceso a los suyos. La delegación permite a los usuarios hacer cualquier cosa, desde consultarse mutuamente sus planes hasta gestionar completamente toda su información personal. </para>
-
- <sect3 id="exchange-delegate-to-others">
- <title
->Delegando acceso a terceros</title>
- <para
-> Para añadir a alguien en su lista de delegados pulse el botón <guibutton
->Añadir</guibutton
-> y elíjalo en la lista global de acceso. Al delegar, puede conceder diferentes niveles de acceso a diferentes tipos de datos. También puede decidir si el acceso concedido se aplica a los elementos marcados como <guilabel
->Privados</guilabel
-> o solamente a los marcados como públicos. </para>
-
-
- <figure>
- <title
->Delegación de cuenta Exchange</title>
- <screenshot
-> <screeninfo
->Opciones de delegación de cuenta Exchange</screeninfo
-> <mediaobject
-><imageobject
-> <imagedata format="PNG" fileref="figures/exchange-delegation" srccredit="Aaron Weber"/> </imageobject
-></mediaobject
-> </screenshot>
- </figure>
-
-
- <para
-> Puede elegir uno de los siguientes niveles de acceso para cada uno de los cuatro tipos de carpeta: <variablelist
-> <varlistentry
-> <term
->Ninguno</term
-> <listitem
-> <para
-> No permitir a esta persona acceder a ninguna carpeta de este tipo. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Revisor (sólo lectura)</term
-> <listitem
-> <para
-> Permite a la persona ver elementos en este tipo de carpeta pero no crearlos nuevos o modificar los existentes. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Autor (leer, crear)</term
-> <listitem
-> <para
-> El delegado puede ver elementos en sus carpetas y puede crear otros nuevos pero no puede modificar ninguno de los existentes. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Editor (leer, crear, editar)</term
-> <listitem
-> <para
-> El delegado puede ver, crear y cambiar elementos en sus carpetas. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
- </sect3>
- <sect3 id="exchange-delegated-to-you">
- <title
->Actuar como un delegado para otros</title>
- <para
-> Para ver la lista de las personas que le han dado acceso a sus carpetas pinche en la solapa <guilabel
->Acting as a Delegate</guilabel
-> en la ventana de opciones de delegación de Exchane.Si tiene pensado enviar correo en nombre de alguien, marque la casilla próxima a su nombre y se creará una identidad de correo electrónico. Ahora podrá elegir esa identidad en la lista <guilabel
->De:</guilabel
-> del editor de mensajes. </para>
-
- <para
-> Siga los siguientes pasos para acceder a las carpetas que le han sido delegadas: <orderedlist
-> <listitem
-> <para
-> Seleccione <menuchoice
-><guimenu
->Archivo</guimenu
-> <guimenuitem
->Open Other User's Folder</guimenuitem
-></menuchoice
-> </para
-> </listitem
-> <listitem
-> <para
-> Escriba la dirección de correo electrónico del usuario que le haya delegado o pinche en el botón <guibutton
->Usuario</guibutton
-> para eligirlo de su libreta de direcciones. </para
-> </listitem
-> <listitem
-> <para
-> Seleccione las carpetas que quiere abrir. </para
-> </listitem
-> <listitem
-> <para
-> Pinche en <guibutton
->Aceptar</guibutton
->. </para
-> </listitem
-> </orderedlist
-> </para>
- <para
-> Las carpetas que le han sido delegadas aparecerán en su lista de carpetas dentro de otra titulada con el nombre del propietario. Por ejemplo, si Martha Thompson le ha delegado algunas carpetas, verá una una carpeta llaamda <guilabel
->Martha Thompson's Folders</guilabel
-> en el árbol de carpetas, al mismo nivel que sus <guilabel
->Carpetas ocales</guilabel
-> y <guilabel
->Carpetas públicas</guilabel
->. </para>
-
- <note id="error"
-> <title
->Mensajes de error</title
-> <para
-> Si la carpeta no se abre adecuadamente, compruebe con el dueño de la carpeta que le ha concedido los permisos de acceso correctos. </para
-> </note>
- </sect3>
- </sect2>
-
-
- <sect2 id="exchange-out-of-office">
- <title
->Configuración un mensaje de Estoy fuera</title>
- <para
-> Un mensaje <guilabel
->Estoy fuera</guilabel
-> es una respuesta automática que puede enviar para los mensajes que reciba explicando porqué no va a responder. Por ejemplo, si se va una semana de vacaciones sin acceso a su correo electrónico, puede fijar una respuesta automática para que la gente que le escriba sepa que realmente no los está ignorando. </para>
- <para
-> Para crear un mensaje de <guilabel
->Estoy fuera</guilabel
-> elija <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-> </menuchoice
-> y haga clic en el botón<guibutton
->Estoy fuer</guibutton
->. </para>
-
- <para
-> Entonces pinche en <guilabel
->Estoy fuera</guilabel
->. Entonces escriba un corto y descriptivo mensaje en la casilla habilitada. Pulse <guilabel
-> Aceptar</guilabel
->. </para>
- <para
-> Cada vez que alguien le escriba un mensaje recibirá automáticamente el aviso que ha escrito hasta que vuelva y pinche en <guilabel
->Estoy de vuelta en la oficina</guilabel
->. </para>
- </sect2>
-
-
- </sect1>
-
-
- <sect1 id="full-advantage">
- <title
->Planificando citas según disponibilidad</title>
- <para
-> Cuando programe una reunión usando su calendario en el servidor <application
->Exchange</application
->, podrá comprobar la disponibilidad de otros usuarios en el mismo servidor en función de sus respectivos calendarios <application
->Exchange</application
->. Proceda como sigue: </para>
- <figure>
- <title
->Planificación a partir de información de disponibilidad</title>
- <screenshot
-> <screeninfo
->Uso de la característica de disponibilidad</screeninfo
-> <mediaobject
-><imageobject
-> <imagedata format="PNG" fileref="figures/schedule" srccredit="Aaron Weber"/> </imageobject
-></mediaobject
-> </screenshot>
- </figure>
-
- <note id="reminders-in-exchange"
-> <title
->Recordatorios en Exchange</title
-> <para
-> Los recordatorios de citas, en el calendario de Exchange, no funcionarán hasta que ejecute Evolution una vez al menos después de iniciar la sesión. Este comportamiento difiere del de los recordatorios administrados en local, que funcionan desde el mismo momento de iniciar la sesión, sin tener en cuenta si ejecutó el cliente Evolution durante dicha sesión. </para
-> </note>
- <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Abra una nueva cita en el calendario. </para
-> </listitem
-> <listitem
-> <para
-> Elija <menuchoice
-> <guimenu
->Acciones</guimenu
-> <guimenuitem
->Planificar una reunión</guimenuitem
-> </menuchoice
-> en la ventana del editor de reuniones. </para
-> </listitem
-> <listitem
-> <para
-> Para agregar asistentes, escriba sus direcciones de correo electrónico, o haga clic en <guibutton
->Invitar a otros...</guibutton
->. Si opta por esta solución, es preferible utilizar la lista global de direcciones (GAL - Global Address List). Elija la lista global de direcciones en la lista desplegable de direcciones origen en la parte superior del cuadro de diálogo. </para
-> </listitem
-> <listitem
-> <para
-> Elija <guilabel
->Opciones</guilabel
-> y a continuación <guilabel
->Actualizar disponibilidad</guilabel
-> para comprobar las agendas de los participantes y, si es posible, actualizar la reunión en los calendarios de cada uno de los asistentes. </para
-> </listitem
-> </orderedlist>
- <tip id="autopick"
-> <title
->Uso de la función Autoseleccionar para ajustar el momento de reunión</title
-> <para
-> Si los asistentes no están disponibles para las horas previstas de reunión, es posible «empujar» la reunión hacia adelante o hacia atrás, hasta el momento adecuado más cercano. Para ello, haga clic en las flechas izquierda o derecha, o haga clic en <guilabel
->Autoseleccionar</guilabel
->. La herramienta autoseleccionar mueve la reunión a la fecha/hora más cercana en la que todos los asistentes estarán disponibles. Si el resultado no le satisface, arrastre los lados de la reunión hacia las horas que desea seleccionar. </para
-> </tip>
- </sect1>
-</chapter>
-
-
diff --git a/help/es/usage-exec-summary.xml b/help/es/usage-exec-summary.xml
deleted file mode 100644
index 44ec9a00b6..0000000000
--- a/help/es/usage-exec-summary.xml
+++ /dev/null
@@ -1,246 +0,0 @@
-
-<chapter id="usage-summary">
- <title
->Introducción al Resumen de Ximian Evolution</title>
-
- <sect1 id="summary-intro">
- <title
->Uso de la herramienta Resumen</title>
- <para
-> El Resumen de Ximian Evolution puede mostrar todo lo que necesite saber con rapidez. Le mostrará las tareas de la jornada, cuánto correo tiene pendiente y mucho más. </para>
- <para
-> Para ver el Resumen haga clic en la barra de <guilabel
->Atajos</guilabel
-> o en <guilabel
->Resumen</guilabel
->, al principio de la barra de <guilabel
->Carpetas</guilabel
->. La configuración de fábrica incluye: <itemizedlist
-> <listitem
-> <para
-> Informe meteorológico </para
-> </listitem
-> <listitem
-> <para
-> Titulares periodísticos a través de Internet </para
-> </listitem
-> <listitem
-> <para
-> Resumen de correo </para
-> </listitem
-> <listitem
-> <para
-> Citas </para
-> </listitem
-> <listitem
-> <para
-> Tareas </para
-> </listitem
-> </itemizedlist
-> </para>
- </sect1>
- <sect1 id="customizing-summary">
- <title
->Personalización de los módulos del Resumen</title>
- <para
-> Los módulos de <application
->Evolution</application
-> pueden personalizarse para satisfacer sus necesidades. Por ejemplo puede elegir qué buzones de correo resumir y qué servicios de noticias quiere que aparezcan. </para>
-
-
- <note id="summary-http-proxy"
-> <title
->Uso del Resumen a través de un "proxy" HTTP</title
-> <para
-> Si utiliza un «proxy» HTTP, <application
->Ximian Evolution</application
-> debe ser capaz de encontrarlo a través del subsistema <systemitem
->gnome-vfs</systemitem
-> antes de poder acceder a los servicios de información meteorológica y de noticias a través de Internet. Ocurre lo mismo si quiere ver imágenes remotas en un mensaje de correo HTML. </para
-> <para
-> La herramienta de configuración de «proxy» se encuentra en el Centro de Control. </para
-> </note>
-
-
- <sect2 id="customizing-summary-weather">
- <title
->En el Centro de control encontrará la herramienta de configuración del proxy.</title>
- <para
-> Personalización del Resumen meteorológico <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Elija <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-> </menuchoice
-> y elija la herramienta<guilabel
->Configuración del resumen</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> En <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-> </menuchoice
-> elija <guilabel
->Preferencias del Resumen</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en la ficha <guilabel
->Meteorología</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Elija la ciudad en la columna de la izquierda. </para
-> </listitem
-> </orderedlist
-> </para>
- <para
-> Debajo de la lista de ciudades puede elegir el tiempo, en segundos, entre cada actualización y si quiere ver las temperaturas en grados Celsius o Farenheit. </para>
-
- </sect2>
- <sect2 id="customizing-feeds">
- <title
-><application
->Evolution</application
-> implementa los sistemas métricos internacional y anglosajón para los informes meteorológicos. El sistema anglosajón corresponde al sistema británico pero se utiliza casi exclusivamente en EEUU. Gran Bretaña y el resto del mundo utilizan el sistema métrico.</title>
- <para
-> Personalización de la captura de titulares <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Elija <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-> </menuchoice
-> y lance la herramienta <guilabel
->Configuración del resumen</guilabel
->. Entonces elija la solapa <guilabel
->Proveedores de noticias</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-> </menuchoice
-> y elija <guilabel
->Preferencias del Resumen</guilabel
->. Entonces elija la ficha <guilabel
->Fuentes de Noticias</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Elija la ciudad en la columna de la izquierda. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Aceptar</guibutton
->. </para
-> </listitem
-> </orderedlist
-> </para>
- <para
-> También puede añadir sus propios proveedores de noticias. Evolution mostrará las noticias en RDF-XML del servidor de su elección. En la mayoría de los casos se trata de un archivo llamado «index.rdf». </para>
-
- </sect2>
- <sect2 id="customizing-mail">
- <title
->Es posible incluir titulares de orígenes personalizados. Evolution es capaz de utilizar titulares en formato RDF del sitio Web de su elección.</title>
- <para
-> Personalización del Resumen del correo <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Elija <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-> </menuchoice
-> y elija la herramienta<guilabel
->Configuración del resumen</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Elija <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-> </menuchoice
-> y a continuación <guilabel
->Preferencias del Resumen</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Expande el árbol de carpetas para las carpetas que quier ver en el Resumen. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en la casilla a la izquierda de la carpeta. </para
-> </listitem
-> </orderedlist
-> </para>
- </sect2>
- <sect2 id="customizing-cal">
- <title
->Haga clic en <guibutton
->Añadir</guibutton
->.</title>
- <para
-> Personalización del Resumen de planificación <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Elija <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-> </menuchoice
-> y elija la herramienta<guilabel
->Configuración del resumen</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Elija <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-> </menuchoice
-> y a continuación <guilabel
->Preferencias del Resumen</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Elija la ficha <guibutton
->Planificación</guibutton
->. </para
-> </listitem
-> <listitem
-> <para
-> Indique si desea agrupar sus citas por un día, cinco, una semana o un mes. </para
-> </listitem
-> </orderedlist
-> </para>
- </sect2>
- </sect1>
-</chapter>
diff --git a/help/es/usage-mail-org.xml b/help/es/usage-mail-org.xml
deleted file mode 100644
index 80932df89f..0000000000
--- a/help/es/usage-mail-org.xml
+++ /dev/null
@@ -1,1152 +0,0 @@
-<chapter id="usage-mail-organize">
- <title
->Organización y administración del correo electrónico</title>
- <para
-> Deseará probablemente organizar sus mensajes, por muy pocos que sean los que reciba cada día. Cuando cuente con un centenar de ellos, y quiera encontrar un mensaje de un mes de antigüedad, le resultará <emphasis
->necesario</emphasis
-> poner orden y organizar su correo. Afortunadamente, <application
->Ximian Evolution</application
-> cuenta con las herramientas necesarias para ayudarle en esta tarea. </para>
-
- <sect1 id="importing-mail-and-settings">
- <title
->Importación de la configuración y de los mensajes existentes</title>
- <para
-> <application
->Evolution</application
-> permite importar mensajes y otros datos existentes: no tendrá que preocuparse por la pérdida de información anterior. </para>
- <sect2 id="importing-mail">
- <title
->Importar correo electrónico y otros datos</title>
- <para
-> <application
->Ximian Evolution</application
-> puede importar los siguientes tipos de archivos: <variablelist
-> <varlistentry
-> <term
->VCard (.vcf, gcrd):</term
-> <listitem
-> <para
-> El formato de libreta utilizado por los programas GNOME, KDE así como numerosas aplicaciones de administración de contactos. Será necesario poder exportar a formato VCard la libreta de direcciones de su otra aplicación. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->iCalendar (.ics):</term
-> <listitem
-> <para
-> Un formato utilizado para almacenar archivos de calendario. iCalendar es el programa utilizado por equipos de bolsillo PalmOS, así como Ximian <application
->Evolution</application
->, y Microsoft <application
->Outlook</application
->. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Microsoft Outlook Express 4 (.mbx):</term
-> <listitem
-> <para
-> El formato de archivos de Microsoft Outlook Express 4. Para otras versiones de Microsoft Outlook y Outlook Express, vea la solución descrita en la nota siguiente. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Formato de intercambio de datos de LDAP (LDIF):</term
-> <listitem
-> <para
-> Un formato de datos estándar para tarjetas de visita. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->MBox (mbox):</term
-> <listitem
-> <para
-> El formato de buzón de correo utilizado por los programas Mozilla, Netscape, Ximian Evolution, Eudora y muchos otros clientes de correo electrónico. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
- <para
-> Para importar sus mensajes existentes: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Haga clic en <menuchoice
-><guimenu
->Archivo</guimenu
-><guimenuitem
->Importar</guimenuitem
-></menuchoice
->. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Siguiente</guibutton
-> tras leer la pantalla de bienvenida. </para
-> </listitem
-> <listitem
-> <para
-> Seleccione <guibutton
->Importar un único archivo</guibutton
->. </para
-> </listitem
-> <listitem
-> <para
-> Busque el archivo que quiere importar en <application
->Evolution</application
->. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Importar</guibutton
-> </para
-> </listitem
-> </orderedlist
-> </para>
- </sect2>
- <sect2 id="importing-preferences">
- <title
->Importación de las preferencias</title>
- <para
-> <application
->Evolution</application
-> es capaz de importar sus mensajes, contactos y otra información existente desde otras aplicaciones, y facilitarle de este modo su transición a <application
->Evolution</application
->. </para>
- <para
-> Para importar su información existente: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Haga clic en <menuchoice
-><guimenu
->Archivo</guimenu
-><guimenuitem
->Importar</guimenuitem
-></menuchoice
->. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Siguiente</guibutton
-> tras leer la pantalla de bienvenida. </para
-> </listitem
-> <listitem
-> <para
-> Seleccione <guibutton
->Importar datos y configuración de programas antiguos</guibutton
->. </para
-> </listitem
-> <listitem
-> <para
-> La columna más a la izquierda muestra la aplicación donde se encuentra la información que desea importar. Seleccione ahora las casillas de cada componente para importar las distintas propiedades de cada aplicación. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Siguiente</guibutton
-> </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Importar</guibutton
-> </para
-> </listitem
-> </orderedlist
-> </para>
-
- <para
-> <note
-> <title
->Usuarios expertos de Microsoft Outlook y Outlook Express</title
-> <para
-> Microsoft Outlook y las versiones de Outlook Express posteriores a la versión 4, utilizan formatos propietarios que <application
->Ximian Evolution</application
-> no puede leer ni importar. En el caso de los contactos, debe enviárselos por correo a si mismo, e importarlos por este procedimiento. En el caso de los mensajes, existe una solución más sencilla: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Desde Windows, importe los archivos en el cliente Mozilla Mail (o en otro cliente de correo que utilice el formato mbox estándar, como Netscape o Eudora). </para
-> </listitem
-> <listitem
-> <para
-> Copie los archivos al sistema o a la partición que utiliza para <application
->Ximian Evolution</application
->. </para
-> </listitem
-> <listitem
-> <para
-> Utilice la herramienta de importación del programa <application
->Ximian Evolution</application
-> para importar estos archivos. Encontrará más explicaciones acerca del porqué y del cómo de este procedimiento en el sitio Web de asistencia de Ximian. </para
-> </listitem
-> </orderedlist
-> </para
-> </note
-> <note
-> <title
->Usuarios de Netscape</title
-> <para
-> Antes de importar mensajes desde Netscape, asegúrese de seleccionar <menuchoice
-><guimenu
->Archivo</guimenu
-><guimenuitem
->Compactar todas las carpetas</guimenuitem
-></menuchoice
->. Si no lo hace, <application
->Ximian Evolution</application
-> también importará los mensajes borrados de las carpetas de mensajes eliminados. </para
-> </note
-> </para>
-
- </sect2>
- </sect1>
- <sect1 id="usage-mail-organize-columns">
- <title
->Uso de cabeceras para ordenar los mensajes</title>
- <para
-> De forma predeterminada, la lista de mensajes incluye columnas con las cabeceras siguientes: el icono de un sobre que indica si el mensaje ha sido leído o contestado; un signo de admiración que indica la prioridad y los campos <guilabel
->De</guilabel
->, <guilabel
->Asunto</guilabel
-> y <guilabel
->Fecha</guilabel
->. Puede arrastar las columnas para cambiar su orden o para eliminarlas. Para agregar columnas: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Haga clic con el botón derecho sobre las cabeceras de las columnas </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guimenuitem
->Añadir una columna</guimenuitem
-> </para
-> </listitem
-> <listitem
-> <para
-> Arrastre la columna hasta la posición deseada entre dos cabeceras existentes. Una flecha roja le indica el lugar donde quedará la columna. </para
-> </listitem
-> </orderedlist
-> </para>
- <para
-> Haga clic con el botón derecho en una de las cabeceras de columna para ver una lista de opciones: <variablelist
-> <varlistentry
-> <term
-><guimenuitem
->Orden ascendente</guimenuitem
->:</term
-> <listitem
-><para
-> Ordena los mensajes del primero al último. </para
-></listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guimenuitem
->Orden descendente</guimenuitem
->:</term
-> <listitem
-><para
-> Ordena los mensajes del último al primero. </para
-></listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guimenuitem
->Quitar esta columna</guimenuitem
->:</term
-> <listitem
-> <para
-> Retira la columna de la pantalla. Para retirar columnas, también puede arrastrar y soltar la cabecera fuera de la lista. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guimenuitem
->Personalizar vista actual</guimenuitem
->:</term
-> <listitem
-><para
-> Elija este elemento para escoger un orden de los mensajes más complejo o para elegir qué columnas quiere ver con la información de sus mensajes. </para
-></listitem
-> </varlistentry
-> </variablelist
-> </para>
-
- <sect2 id="usage-mail-organize-columns-followup">
- <title
->Ordenando la columna con la característica de Marca de seguimiento</title>
- <para
-> Una manera de asegurar de no olvidarse de un mensaje es con la función de <guilabel
->Seguimiento</guilabel
->. Para usarla, seleccione uno o más mensajes y pinche con el botón derecho sobre uno de ellos y elija <guimenuitem
->Seguimiento</guimenuitem
->. Se abrirá un diálogo que le servirá para elegir el tipo de marca y la fecha de vencimiento. </para>
- <para
-> Con <guilabel
->Marcar</guilabel
-> especifica qué acción es la que se quiere recordar a sí mismo. Tiene varias disponibles, como <guilabel
->Llamar</guilabel
->,<guilabel
-> Reenviar</guilabel
-> y <guilabel
-> Responder</guilabel
->, pero puede escribir la nota o acción que prefiera. Si lo desea también puede fijar una fecha de caducidad para la marca. </para>
- <para
-> Una vez que ha añadido una marca, puede remarcar el mensaje como terminado o eliminar la marca pinchando con el botón derecho sobre el mensaje y eligiendo <guilabel
->Marcar como terminado</guilabel
-> o <guilabel
->Quitar marca</guilabel
->. </para>
-
- <para
-> Cuando lea un mensaje marcado, y en la parte superior derecha del mismo, aparcerá una nota con el estado de la bandera, antes de la cabecera del mensaje. Al ver un mensaje atrasado podrá decirle algo como <guilabel
->Llamar antes del 7 de abril de 2003 a las 5:00 PM </guilabel
-> </para>
-
- <para
-> Las marcas le pueden ayudar a organizar su correo de varias maneras. Por ejemplo, puede añadir a la lista de mensajes una columna de <interface
->Marca de seguimiento</interface
-> y poder ordenarlos por ese campo. También puede crear una carpeta virtual que muestre todos los mensajes marcados que tiene y quitarles las marcas cuando haya acabado, de manera que la carpeta sólo contenga mensajes pendientes. </para>
-
- </sect2>
-
- </sect1>
-
- <sect1 id="usage-mail-organize-folders">
- <title
->Organización básica de carpetas</title>
- <para
-> <application
->Ximian Evolution</application
-> utiliza carpetas para conservar los mensajes de correo, así como las tarjetas de direcciones y los calendarios. El programa le ofrece al principio unas pocas carpetas, como <guilabel
->Entrada</guilabel
->, <guilabel
->Salida</guilabel
-> y <guilabel
->Borradores</guilabel
->, pero puede crear tantas otras como desee. Para crear carpetas nuevas, en el menú <guisubmenu
->Archivo</guisubmenu
->, seleccione <guimenuitem
->Nuevo</guimenuitem
-> y a continuación <guimenu
->Carpeta</guimenu
->. <application
->Ximian Evolution</application
-> le solicita el nombre y el tipo de carpeta, y le presenta un árbol de los directorios donde puede elegir la ubicación de la nueva carpeta. </para>
- <para
-> Cuando hace clic en <guibutton
->Aceptar</guibutton
->, su nueva carpeta aparece en la <interface
->vista de carpetas</interface
->. A continuación, puede arrastrar y colocar mensajes o hacer clic en el icono <guibutton
->Mover</guibutton
-> de la barra de herramientas. Si desea mover varios mensajes a la vez, para seleccionarlos haga clic en cada uno con la tecla <keycap
->Ctrl</keycap
-> presionada, o utilice la tecla <keycap
->Mayús</keycap
-> para selecciona un grupo de mensajes contiguos. Si crea un filtro con el <interface
->Asistente de filtros</interface
->, sus mensajes quedan ordenados automáticamente. </para>
-
- <warning id="imap-subfolders">
- <title
->Subcarpetas en IMAP</title>
- <para
-> El buzón de entrada de la mayoría de los servidores IMAP no puede contener a la vez subcarpetas y mensajes. Cuando crea carpetas adicionales en su servidor de correo IMAP, debe hacerlas partir de la raíz del árbol de carpetas de cuentas IMAP, y no desde el buzón de entrada. Si crea subcarpetas en el buzón de entrada, dejará de poder leer mensajes que existen en esta carpeta, hasta que las mueva hacia otro lugar. </para>
- </warning>
-
- </sect1
->
-
- <sect1 id="usage-mail-organize-search">
- <title
->Búsqueda de mensajes</title>
- <para
-> La mayoría de los clientes de correo son capaces de realizar búsquedas en los mensajes, pero <application
->Ximian Evolution</application
-> lo hace aún más rápido. Puede realizar búsquedas sólo en el asunto, sólo en el cuerpo del mensaje, o hacerlo en el asunto y el cuerpo a la vez. </para>
- <para
-> Para iniciar la búsqueda, escriba una palabra o una frase en el área de texto bajo la barra de herramientas, y seleccione un opción de búsqueda: <variablelist
-> <varlistentry
-> <term
-><guilabel
->El cuerpo o el asunto contiene</guilabel
->:</term
-> <listitem
-> <para
-> Esta opción busca en el asunto y en el cuerpo de los mensajes la palabra o frase especificada en el campo de búsqueda. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-> <guilabel
->El cuerpo contiene</guilabel
->:</term
-> <listitem
-> <para
-> La búsqueda se realiza únicamente en el texto del mensaje, no en el asunto. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->El asunto contiene:</guilabel
-></term
-> <listitem
-> <para
-> Esta opción mostrará los mensajes cuya línea asunto incluye el texto buscado. La búsqueda no se realiza en el cuerpo del mensaje. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->El cuerpo no contiene:</guilabel
-></term
-> <listitem
-> <para
-> Encuentra todos los mensajes que no incluyen el texto buscado en el cuerpo del mensaje. También mostrará los mensajes en los que el texto buscado aparece en la línea del asunto, cuando no en el cuerpo del mensaje. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guilabel
->El asunto no contiene:</guilabel
-></term
-> <listitem
-> <para
-> Encuentra todos los mensajes cuyo asunto no contiene el texto buscado. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> Tras escribir la frase buscada, presione <keycap
->Intro</keycap
->. <application
->Ximian Evolution</application
-> le muestra los resultados de la búsqueda en la lista de mensajes. </para>
-
- <para
-> Si cree que va a necesitar la búsqueda más tarde puede guardarla y ejecutarla luego. Solamente tiene que pinchar en <guimenuitem
->Guardar búsqueda</guimenuitem
-> en el menú <guimenu
->Buscar</guimenu
->. Después, podrá ejecutar esa búsqueda en cualquier carpeta eligiéndola del menú <guimenu
->Buscar</guimenu
->. En lugar de eso puede que lo que quiera sea crear una carpeta virtual. Para saber más consulte <xref linkend="usage-mail-organize-vfolders"/>. </para>
-
- <para
-> Cuando haya acabado con la búsqueda y quiera volver para ver de nuevo todos los mensajes, elija <guimenuitem
->Mostrar todos</guimenuitem
-> en la lista desplegable <guilabel
->Búsqueda</guilabel
-> o haga una búsqueda sin escribir ningún patrón. </para>
-
- <para
-> Si prefiere realizar una búsqueda más compleja, abra el cuadro de diálogo de búsqueda avanzada: para ello, seleccione <guilabel
->Avanzado...</guilabel
-> en la lista desplegable <guilabel
->Búsqueda</guilabel
->. A continuación, defina su criterios de búsqueda (cada uno con las mismas opciones que las que ya vimos en la barra de búsqueda normal), y especifique si desea que los mensajes encontrados coincidan con todos, o sólo con uno de los criterios. Haga clic en <guibutton
->Buscar</guibutton
-> para buscar estos mensajes. </para>
-
- <para
-> Éste es un procedimiento similar al que le permite ordenar mensajes mediante filtros y carpetas virtuales, que describiremos en secciones siguientes. </para>
-
- </sect1>
-
- <sect1 id="usage-mail-organize-filters">
- <title
->Creación de reglas para organizar automáticamente el correo</title>
- <para
-> Los filtros trabajan de forma muy parecida a la del departamento de correo de una organización de gran tamaño. Su cometido es el de empaquetar, ordenar y distribuir el correo en varias carpetas. Además, es posible aplicar sobre un mismo mensaje filtros múltiples, asociados a acciones múltiples, para manipularlo de numerosas formas. Por ejemplo, sus filtros pueden crear copias de un mismo mensaje en múltiples carpetas; pueden también conservar o incluso mandar una copia a otra persona, y todo de forma rápida. Por supuesto, estas operaciones son también más rápidas y flexibles que una persona real colocada ante un montón de sobres. </para>
-
-
- <tip id="easy-filter"
-> <title
->Creación rápida de filtros</title
-> <para
-> Existe un procedimiento rápido y sencillo para crear filtros o carpetas virtuales. En la lista de mensajes, haga clic con el botón derecho en el mensaje deseado y en el submenú <guimenuitem
->Crear una regla con el mensaje</guimenuitem
-> seleccione una de las opciones disponibles. </para
-> </tip>
-
- <sect2 id="usage-mail-org-filters-new">
- <title
->Creación de filtros</title>
- <para
-> Para crear un nuevo filtro: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Seleccione <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Filtros</guimenuitem
-> </menuchoice
-> </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Añadir</guibutton
->. </para
-> </listitem
-> <listitem
-> <para
-> Escriba el nombre de filtro en el campo <guilabel
->Nombre de la regla</guilabel
->. Para cada criterio, seleccione en primer lugar las partes de los mensajes que desea examinar con el filtro: <itemizedlist
-> <listitem
-><para
-> Remitente: la dirección del remitente. </para
-></listitem
-> <listitem
-><para
-> Destinatarios: los destinatarios del mensaje. </para
-></listitem
-> <listitem
-><para
-> Asunto: la línea asunto del mensaje. </para
-></listitem
-> <listitem
-><para
-> Cabecera específica: el filtro puede examinar cualquier cabecera deseada, por muy oscura o personalizada que sea. Escriba el nombre de la cabecera en el primer cuadro de texto, y el texto buscado en el segundo. <note id="multiple-repeated-headers"
-> <title
->Cabeceras repetidas</title
-> <para
-> Si en un mensaje aparece más de una vez la misma cabecera, Evolution sólo se fija en la primera, aunque en la segunda el contenido sea diferente. Por ejemplo, si un mensaje declara la cabecera Resent-From: con «engineering@rupertcorp.com» y a continuación la redefine como «marketing@rupertcorp.com», Evolution aplicará el filtro como si la segunda declaración no apareciera. Para filtrar mensajes que utilizan varias cabeceras varias veces, utilice una expresión regular. </para
-> </note
-> </para
-></listitem
-> <listitem
-><para
-> Cuerpo del mensaje:busca en el texto efectivo del mensaje. </para
-></listitem
-> <listitem
-> <para
-> Expresión: sólo para programadores: busca un mensaje que corresponda a una expresión escrita en lenguaje Scheme, utilizado para definir filtros en <application
->Ximian Evolution</application
->. </para
-> <para
-> <figure id="usage-mail-filter-fig-createrule"
-> <title
->Creación de filtros de correo</title
-> <screenshot
-> <screeninfo
->Creación de filtros de correo</screeninfo
-> <mediaobject
-> <imageobject
-> <imagedata fileref="figures/filter-new-fig" format="PNG" srccredit="Aaron Weber"/> </imageobject
-> </mediaobject
-> </screenshot
-> </figure
-> <note id="lots-of-filters"
-> <title
->¿Qué ocurre si varios filtros coinciden con un mismo mensaje?</title
-> <para
-> Cuando varios filtros coinciden con un mismo mensaje, se aplican en orden, excepto cuando uno de los filtros contiene la acción <guibutton
->Parar el proceso</guibutton
->. Cuando un filtro que tiene esta acción se aplica sobre un mensaje, éste no volverá a ser procesado por ninguno de los filtros que quedan según el orden establecido. </para
-> <para
-> Cuando abre la ventana de gestión de filtros los encontrará una lista ordenados por el orden de aplicación de los mismos. Puede moverlos arriba y abajo, modificando así su prioridad, con los botones de <guibutton
->Arriba</guibutton
-> y <guibutton
->Abajo</guibutton
->. </para
-> </note
-> </para
-> </listitem
-> <listitem
-><para
-> Fecha de envío: filtra los mensajes en función de la fecha de envío: en primer lugar, defina las condiciones que desea ver cumplidas con un mensaje: <guilabel
->antes</guilabel
-> de una hora determinada, <guilabel
->después de</guilabel
-> de ella, etc. A continuación, especifique la fecha y hora. La fecha y hora del mensaje se compara con la hora del sistema al ejecutarse el filtro, o con una hora y fecha específica elegida en el calendario. Es posibleincluso buscar mensajes dentro de un intervalo de tiempo relativo, por ejemplo, buscar mensajes dentro de los dos últimos días. </para
-></listitem
-> <listitem
-><para
-> Fecha de recepción: funciona del mismo modo que la opción <guilabel
->Fecha de envío</guilabel
->, excepto que compara la fecha y hora de recepción del mensaje con las fechas especificadas. </para
-></listitem
-> <listitem
-><para
-> Puntuación: asigna la puntuación de un mensaje, con un número mayor que cero. Para poder filtros con puntuación, cree un filtro que asigne una puntuación a un mensaje y después aplique otro para que filtre los mensajes con las puntuaciones que necesita. </para
-></listitem
-> <listitem
-> <para
-> Tamaño (Kb): ordena los mensajes en función de su tamaño en kilobytes. </para
-> </listitem
-> <listitem
-> <para
-> Estado: ejecuta un filtro en función del estado del mensaje, por ejemplo «Nuevo». </para
-> </listitem
-> <listitem
-> <para
-> Adjuntos: crea un filtro en función de si el mensaje contiene un adjunto. </para
-> </listitem
-> <listitem
-> <para
-> Lista de correo: aplica un filtro en función de la lista de correo de donde proviene el mensaje. </para
-> <note
-> <title
->¿Cómo funcionan los filtros sobre listas de correo?</title
-> <para
-> Un filtro sobre listas de correo busca en realidad una cabecera específica llamada <computeroutput
->X-BeenThere</computeroutput
->, utilizada para identificar las listas de correo, u otros redistribuidores de correo. </para
-> </note
-> </listitem
-> <listitem
-> <para
-> Expresión regular: si sabe lo que se hace con las <glossterm linkend="regular-expression"
->expresiones regulares</glossterm
->, saque provecho aquí de su poderío. Con esto puede hacer búsquedas de patrones complejos de letras de manera que, por ejemplo, podría encontrar todas las palabras que empiezan o acaban con m y tienen entre seis y quince letras de longitud, o distinguir todos los mensajes que tengan duplicacada una determinada cabecera. Para saber cómo usar las expresiones regulares examine la página del manual de la orden <command
->grep</command
->. </para
-> </listitem
-> <listitem
-> <para
-> Cuenta de origen: aplica un filtro en función del servidor de donde provienen los mensajes. Puede escribir, o seleccionar la dirección URL en la lista desplegable. Esta característica sólo tiene interés cuando utiliza más de un origen de correo. </para
-> </listitem
-> </itemizedlist
-> </para
-> </listitem
-> <listitem
-> <para
-> Seleccione el criterio de la condición. si quiere utilizar múltiples criterios haga clic en <guibutton
->Añadir criterio</guibutton
-> y repita el paso anterior. </para
-> </listitem
-> <listitem
-> <para
-> Seleccione la acciones del filtro en la sección <guilabel
->Entonces</guilabel
->. Puede seleccionar cualquiera las opciones siguientes. <itemizedlist
-> <listitem
-><para
-> Mover a la carpeta: al seleccionar este elemento, <application
->Ximian Evolution</application
-> colocará los mensajes en la carpeta especificada. Haga clic en el botón <guibutton
->&lt;pulse aquí para seleccionar una carpeta&gt;</guibutton
->. </para
-></listitem
-> <listitem
-><para
-> Copiar a la carpeta: al seleccionar este elemento, <application
->Ximian Evolution</application
-> colocará los mensajes en la carpeta especificada. Haga clic en el botón <guibutton
->&lt;pulse aquí para seleccionar una carpeta&gt;</guibutton
->. </para
-></listitem
-> <listitem
-><para
-> Reenviar a la dirección: seleccione esta opción y escriba la dirección del destinatario que recibirá una copia del mensaje. </para
-></listitem
-> <listitem
-><para
-> Borrar: marca el mensaje para borrarlo. Sigue siendo posible recuperar el mensaje de nuevo, al menos hasta que seleccione <guimenuitem
->Purgar</guimenuitem
-> el correo. </para
-></listitem
-> <listitem
-><para
-> Parar el proceso: especifique si desea que todos los demás filtros pasen por alto este mensaje, porque con las acciones definidas es suficiente. </para
-></listitem
-> <listitem
-><para
-> Asignar color: seleccione este elemento para que <application
->Ximian Evolution</application
-> resalte el mensaje con el color especificado. </para
-></listitem
-> <listitem
-><para
-> Asignar puntuación: por ejemplo, puede asignar una prioridad mayor a todos los mensajes que contengan en algún lugar del cuerpo la palabra «importante». En un filtro posterior, podrá entonces reordenar los mensajes en función de su valor de prioridad. </para
-></listitem
-> </itemizedlist
-> </para
-> </listitem
-> <listitem
-> <para
-> Poner estado: si desea agregar múltiples acciones al filtro, haga clic en <guibutton
->Añadir acción</guibutton
-> y repita el paso anterior. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Aceptar</guibutton
->. </para
-> </listitem
-> </orderedlist
-> </para>
-
- <note id="when-filters-go-wrong"
-> <title
->¿Cuándo se aplican los filtros?</title
-> <para
-> Si utiliza la herramienta Ximian Connector para almacenar su correo en un servidor Exchange, los filtros se aplican sólo cuando abre el buzón de entrada y selecciona <menuchoice
-><guimenu
->Acciones</guimenu
-><guimenuitem
->Aplicar filtros</guimenuitem
-></menuchoice
->, o presiona la combinación de teclas <keycombo
-><keycap
->Ctrl</keycap
-><keycap
->Y</keycap
-></keycombo
-> </para
-> </note>
-
- <example id="filter-example"
-> <title
->Utilización de un filtro para evitar el correo basura</title
-> <para
-> El «spam», también conocido como el correo basura o correo comercial no solicitado, es la ruina de los buzones de correo de mucha gente, pero no tiene porqué ser así. Usando los filtros de Ximian Evolution y una herramienta externa de detección de spam» como <application
->SpamAssassin</application
-> (<ulink url="http://spamassassin.org/"
->http://spamassassin.org/</ulink
->) puede interceptar la mayor parte del correo basura y enviarlo directamente a la papelera. </para
-> <para
-> La forma más sencilla de hacerlo es consiguiendo que su administrador de sistemas instale SpamAssassin (o un equivalente) en su servidor de correo. Allí se encargará de marcar en su correo los mensajes susceptibles de ser considerados como «spam»con la cabecera «X-Spam-Status», de manera que a su vez pueda localizarlos con un filtro. Aprovechando que SpamAssassin puntúa la probabilidad de que un mensaje sea basura, puede incluso definir lo estricto que quiera ser. Si su administrador de red no es demasiado amistoso, no se preocupe, puede instalar SpamAssassin en su propio sistema y redirigirle automáticamente los mensajes antes de llegar a leerlos. </para
-> <para
-> Si su administrador de sistemas o su ISP tiene instalado SpamAssasin, así es como puede desviar el correo basura: <orderedlist
-> <listitem
-><para
-> Seleccione <menuchoice
-><guimenu
->Herramientas</guimenu
-><guimenuitem
->Filtros</guimenuitem
-></menuchoice
->. </para
-></listitem
-> <listitem
-><para
-> Elija la carpeta de correo que quiera ver en la columna de la izquierda. </para
-></listitem
-> <listitem
-><para
-> Defina la primera parte del criterio para buscar una <guilabel
->Cabecera específica</guilabel
->. </para
-></listitem
-> <listitem
-><para
-> Escriba <userinput
->X-Spam-Flag</userinput
-> como nombre de la cabecera. </para
-></listitem
-> <listitem
-><para
-> Seleccione la opción <guilabel
->contiene</guilabel
-> en la segunda lista desplegable. </para
-></listitem
-> <listitem
-><para
-> Para especificar el contenido a buscar escriba <userinput
->YES</userinput
->. Ahora está trabajando con todos los mensajes que contienen la palabra «YES» dentro de la cabecera «X-Spam-Status». </para
-></listitem
-> <listitem
-><para
-> Elija qué acciones quiere realizar con los mensajes. Puede borrarlos automáticamente pero es más prudente guardarlos en una carpeta de «posible correo basura» y darle un vistazo para estar seguro de que un mensaje auténtico no ha sido marcado por accidente. </para
-></listitem
-> <listitem
-><para
-> Haga clic en Aceptar. Ha terminado. </para
-></listitem
-> </orderedlist
-> </para
-> <para
-> Si en su servidor no tiene SpamAssassin u otra herramienta de filtrado de correo basura, todavía hay esperanza, aunque no es del todo sencillo. Primero descargue e installe SpamAssassin desde <ulink url="http://spamassassin.org"
->http://spamassassin.org</ulink
->. Necesitará descargar los paquetes «spamassassin» y «perl-Mail-SpamAssassin» y puede instalarlos con Red Carpet eligiendo <guimenuitem
->Install Local Packages</guimenuitem
-> desde el menú <guimenu
->File</guimenu
->. Encontrará más instrucciones en el web de SpamAssassin. Una vez que haya instalado el software haga lo siguiente: <orderedlist
-> <listitem
-> <para
-> Cree un nuevo archivo de texto en cualquier editor (el más conveniente es <menuchoice
-> <guimenu
-> Programas </guimenu
-> <guisubmenu
-> Accessorios </guisubmenu
-> <guimenuitem
-> Editor de texto</guimenuitem
-> </menuchoice
->) y escriba la siguiente orden: <command
->spamassassin -e</command
->, que lanzará la orden SpamAssassin y devolverá un código 0 si el mensaje no es basura. </para
-> </listitem
-> <listitem
-> <para
-> Guardar el archivo como <filename
->spam-filter.sh</filename
->. </para
-> </listitem
-> <listitem
-> <para
-> Marque el archivo como programa ejecutable. Abra su directorio de inicio en <application
->Nautilus</application
->, marque el archivo spam-filter.sh con el botón derecho del ratón y elija <guimenuitem
->Propiedades</guimenuitem
->. Entonces pinche en <guilabel
->Permisos</guilabel
-> y marque la casilla en la columna <guilabel
->Ejecución</guilabel
-> con la fila <guilabel
->Propietario</guilabel
->. También puede hacer abriendo una terminal (<menuchoice
-><guimenu
->Programas</guimenu
-> <guisubmenu
->Accesorios</guisubmenu
-><guimenuitem
->Terminal</guimenuitem
-> </menuchoice
->) y escribir la orden <command
->chmod +x spam-filter.sh</command
->. </para
-> </listitem
-> <listitem
-> <para
-> Vuelva a Evolution. Cree un nuevo filtro. Seleccione <menuchoice
-> <guimenu
->Herramientas</guimenu
-><guimenuitem
->Filtros</guimenuitem
-> </menuchoice
->. y <guibutton
->Añadir</guibutton
->. </para
-> </listitem
-> <listitem
-><para
-> Como primera parte del criterio elija <guilabel
->Redirigir mensaje a Orden de Shell</guilabel
->. </para
-></listitem
-> <listitem
-><para
-> Escriba la orden shell <userinput
->/home/username/spam-filter.sh</userinput
-> y elija <guilabel
->no devuelve</guilabel
-> y <guilabel
->0</guilabel
->. En lugar de «username» escriba su identificador de usuario en su sistema, para que Evolution pueda encontrar el programa. </para
-></listitem
-> <listitem
-><para
-> Elija qué acciones quiere realizar con los mensajes. Puede borrarlos automáticamente pero es más prudente guardarlos en una carpeta de «posible correo basura» y darle un vistazo para estar seguro de que un mensaje auténtico no ha sido marcado por accidente. </para
-></listitem
-> <listitem
-> <para
-> Ya ha acabado. Pinche en <guibutton
->Aceptar</guibutton
-> para cerrar el filtro y en <guibutton
->Aceptar</guibutton
-> para cerrar el editor de filtros. </para
-> </listitem
-> </orderedlist
-> </para
-> </example>
- </sect2>
-
- <sect2 id="filters-edit">
- <title
->Edición de filtros</title>
- <para
-> Para modificar un filtro: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Seleccione <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Filtros</guimenuitem
-> </menuchoice
-> </para
-> </listitem
-> <listitem
-> <para
-> Seleccione el filtro dentro de la sección <guilabel
->Reglas de filtrado</guilabel
-> y haga clic en <guibutton
->Modificar</guibutton
->. </para
-> </listitem
-> <listitem
-> <para
-> Modifique los parámetros deseados. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Aceptar</guibutton
-> en la ventana del editor de filtros. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Aceptar</guibutton
-> en la ventana del administrador de filtros. </para
-> </listitem
-> </orderedlist
-> </para>
- </sect2>
-
- <sect2 id="filters-deleting">
- <title
->Eliminación de filtros</title>
- <para
-> Para eliminar un filtro: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Seleccione <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenu
->Filtros</guimenu
-> </menuchoice
-> </para
-> </listitem
-> <listitem
-> <para
-> Seleccione el filtro y haga clic en <guibutton
->Borrar</guibutton
->. </para
-> </listitem
-> </orderedlist
-> </para>
- <para
-> <note
-> <title
->Cambio de nombres de carpetas y de filtros</title
-> <para
-> <itemizedlist
-> <listitem
-> <para
-> El correo entrante que los filtros no desplazan hacia otro sitio permanecen en la carpeta de entrada; asimismo, el correo saliente no desplazado acaba en la carpeta de correo enviado. Debe por tanto asegurarse de cambiar los filtros asociados. </para
-> </listitem
-> </itemizedlist
-> </para
-> </note
-> </para>
- </sect2>
- </sect1>
-
- <sect1 id="usage-mail-organize-vfolders">
- <title
->Organización avanzada con carpetas virtuales</title>
- <para
-> Si los filtros no le resultan lo suficientemente flexibles, o si se encuentra ejecutando la misma búsqueda una y otra vez, considere la solución de las carpetas virtuales. Las carpetas virtuales (o «vFolders»), son una solución avanzada de <application
->Ximian Evolution</application
-> para consultar los mensajes de correo. Las carpetas virtuales ayudan a controlar la situación cuando recibe una gran cantidad de correo, o cuando olvida con frecuencia a dónde mueve los mensajes. </para>
- <para
-> Una carpeta virtual es realmente un híbrido de todas las demás herramientas de organización: es parecido a una carpeta, opera como una función de búsqueda y se configura como un filtro. En otras palabras, mientras una carpeta convencional contiene mensajes reales, una carpeta virtual es una vista de mensajes que pueden estar ubicados en carpetas diferentes. Los mensajes incluidos son identificados al vuelo mediante un conjunto de criterios elegidos de antemano. </para>
-
- <para
-> A medida que recibe o borra los mensajes que cumplen con los criterios de la carpeta virtual, <application
->Ximian Evolution</application
-> los incluye o los borra automáticamente de su lista de contenidos. Cuando borra un mensaje, queda eliminado de la carpeta donde existe realmente, así como de cualquier carpeta virtual con la que es posible consultarlo. </para>
-
- <para
-> Imagine un negocio donde se intenta administrar el flujo de mensajes enviados por centenares de distribuidores y clientes; o una universidad con grupos de cursos, profesores, servicios administrativos y estudiantes que se solapan y evolucionan. Cuanto mayor sea el número de mensajes que consiga organizar, menos riesgo corre de sufrir el colapso en un sistema de organización que no es lo bastante flexible. Las carpetas virtuales contribuyen a mejorar la organización porque permiten administrar conjuntos solapados de un modo que resulta imposible de diseñar con sistemas tradicionales de carpetas y filtros. </para>
-
-
- <note id="unmatched-vfolder"
-> <title
->La carpeta virtual «no coincidente»</title
-> <para
-> La carpeta virtual no coincidente es el espejo de todas las demás carpetas virtuales: contiene todos los mensajes que no cumplen los criterios satisfechos por las demás carpetas virtuales. </para
-> <para
-> Si utiliza un sistema de almacenamiento remoto como IMAP o Microsoft Exchange, donde las búsquedas se realizan a través de carpetas virtuales, la carpeta virtual no coincidente se adapta a su vez y también explora las carpetas remotas. Si no crea ninguna carpeta virtual que busque en almacenes remotos, la carpeta virtual No coincidente tampoco los buscará. </para
-> </note>
-
-
- <example id="usage-mail-organize-vfolders-ex"
-> <title
->Carpetas, búsquedas y carpetas virtuales</title
-> <para
-> Para organizar su correo, Juan define una carpeta virtual para los mensajes enviados por su amiga y compañera de trabajo Ana. También tiene otra para los mensajes que incluyen ximian.com en la dirección, y <application
->Ximian Evolution</application
-> en la línea del asunto, con el fin de conservar la traza de las personas que trabajan con él en el desarrollo de <application
->Evolution</application
->. Si Ana le manda un mensaje acerca de cualquier otro tema que <application
->Ximian Evolution</application
->, éste sólo aparece en la carpeta llamada «Ana». Cuando Ana le envía un correo acerca de la interfaz de usuario de <application
->Evolution</application
->, el mensaje aparece tanto en la carpeta virtual «Ana», como en la también carpeta virtual «Debate interno acerca de Evolution». </para
-> </example>
-
- <!-- (INSERT SCREENSHOT HERE: vFolders in action) -->
-
- <sect2 id="vfolder-create">
- <title
->Creación de carpetas virtuales</title>
- <para
-> Para crear una carpeta virtual: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Editor de carpetas virtuales</guimenuitem
-> </menuchoice
-> </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Añadir</guibutton
-> </para
-> </listitem
-> <listitem
-> <para
-> Escriba un nombre para la carpeta virtual en el campo <guilabel
->Nombre de la regla</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Elija los criterios de búsqueda: para cada criterio primero tiene que seleccionar cuál de las siguientes partes del mensaje quiere que se examinen en la búsqueda: Select your search criteria. For each criterion, you must first select which of the following parts of the message you want the search to examine: <figure id="usage-mail-vfolder-fig-createrule"
-> <title
->Elección de reglas para una carpeta virtual </title
-> <screenshot
-> <screeninfo
->Creación de una carpeta virtual</screeninfo
-> <mediaobject
-> <imageobject
-> <imagedata fileref="figures/vfolder-createrule-fig" format="PNG" srccredit="Aaron Weber"/> </imageobject
-> </mediaobject
-> </screenshot
-> </figure
-> </para
-> <para
-> <itemizedlist
-> <listitem
-><para
-> Remitente: la dirección del remitente. </para
-></listitem
-> <listitem
-><para
-> Destinatarios: los destinatarios del mensaje. </para
-></listitem
-> <listitem
-><para
-> Asunto: la línea asunto del mensaje. </para
-></listitem
-> <listitem
-><para
-> Cuerpo del mensaje:busca en el texto efectivo del mensaje. </para
-></listitem
-> <listitem
-> <para
-> Expresión: sólo para programadores: busca un mensaje que corresponda a una expresión escrita en lenguaje Scheme, utilizado para definir carpetas virtuales en <application
->Ximian Evolution</application
->. </para
-> </listitem
-> <listitem
-><para
-> Fecha de envío: busca mensajes en función de la fecha de envío: en primer lugar, defina las condiciones que desea ver cumplidas con un mensaje: <guilabel
->antes</guilabel
-> una hora determinada, <guilabel
->después de</guilabel
-> de ella, etc. A continuación, especifique la fecha y hora. La carpeta virtual compara la fecha y hora del mensaje se compara con la hora del sistema al ejecutarse el filtro, o con una hora y fecha específica elegida en el calendario. Es incluso posible buscar mensajes dentro de un intervalo de tiempo relativo al filtro, por ejemplo, para buscar mensajes dentro de los dos últimos días. </para
-></listitem
-> <listitem
-><para
-> Fecha de recepción: funciona del mismo modo que la opción <guilabel
->Fecha de envío</guilabel
->, excepto que compara la fecha y hora de recepción del mensaje con las fechas especificadas. </para
-></listitem
-> <listitem
-><para
-> Etiquetar: funciona de la misma manera que la opción <guilabel
->Puntuación</guilabel
->, excepto que permite aplicar a cada mensaje una etiqueta, entre varias como <guilabel
->Importante</guilabel
-> , <guilabel
->Personal</guilabel
-> ,<guilabel
->Tareas pendientes</guilabel
->, <guilabel
->Trabajo</guilabel
-> o <guilabel
->Más tarde</guilabel
-> . </para
-></listitem
-> <listitem
-><para
-> Puntuación: los mensajes utilizan de un rango de prioridades entre -3 (mínima importancia) y 3 (máxima importancia). Unas Carpetas virtuales pueden establecer la prioridad de los mensajes recibidos, mientras otras se aplican únicamente a aquellos mensajes con una prioridad determinada. </para
-></listitem
-> <listitem
-> <para
-> Tamaño (Kb): ordena los mensajes en función de su tamaño en kilobytes. </para
-> </listitem
-> <listitem
-> <para
-> Estado: realiza una búsqueda sobre el estado del mensaje, por ejemplo «Nuevo». </para
-> </listitem
-> <listitem
-> <para
-> Adjuntos: crea una carpeta virtual en función de si el mensaje contiene un adjunto. </para
-> </listitem
-> <listitem
-> <para
-> Lista de correo: busca en función de la lista de correo de donde provienen los mensajes. </para
-> </listitem
-> <listitem
-> <para
-> Cuenta de origen: busca mensajes en función del servidor de donde provienen. Puede escribir, o seleccionar la dirección URL en la lista desplegable. Esta característica sólo tiene interés cuando utiliza más de un origen de correo. </para
-> </listitem
-> </itemizedlist
-> </para
-> </listitem
-> <listitem
-> <para
-> Seleccione las carpetas de origen. Puede seleccionar: <itemizedlist
-> <listitem
-> <para
-> únicamente carpetas especificadas <note
-> <para
-> En este caso, es necesario especificar las carpetas en el campo inferior. </para
-> </note
-> </para
-> </listitem
-> <listitem
-> <para
-> Con todas las carpetas locales </para
-> </listitem
-> <listitem
-> <para
-> con todas las carpetas remotas activas </para
-> </listitem
-> <listitem
-> <para
-> Con todas las carpetas locales y remotas activas </para
-> </listitem
-> </itemizedlist
-> </para
-> </listitem
-> </orderedlist
-> </para>
- <para
-> Las carpetas remotas se consideran activas mientras está conectado al servidor; debe conectarse al servidor de correo de su carpeta virtual para poder incluir los mensajes de dicho origen. </para>
-
- </sect2>
- </sect1>
-</chapter>
-
diff --git a/help/es/usage-mail.xml b/help/es/usage-mail.xml
deleted file mode 100644
index c0ce327e5d..0000000000
--- a/help/es/usage-mail.xml
+++ /dev/null
@@ -1,1901 +0,0 @@
-<chapter id="usage-mail"
->
- <title
->Usar el correo electrónico con Evolution</title
->
- <para
-> Este capítulo, así como <xref linkend="usage-mail-organize"/>, le ofrece una guía en profundidad de las posibilidades de Evolution como cliente de correo. Para saber más sobre cómo configurar su cuenta de correo consulte <xref linkend="config-prefs-mail"/>. </para
->
-
- <note
-> <title
->S usa correo IMAP</title
-> <para
-> Si durante el proceso de configuración IMAP eligió usar el correo IMAP debe suscribirse a sus carpetas de correo si quiere poder leer su correo en ellas. Consulte<xref linkend="usage-mail-subscriptions"/> para saber cómo hacerlo. </para
-> </note
->
-
-
- <sect1 id="usage-mail-getnsend-read"
->
- <title
->Leer correo electrónico</title
->
- <para
-> Lance el cliente de correo haciendo clic sobre el icono <guibutton
->Bandeja de entrada</guibutton
-> en la barra de atajos o eligiendo una carpeta de correo de la barra de carpetas. Para leer un mensaje elíjalo de la lista de mensajes y si quiere verlo en su propia ventana hágale un doble clic o pulse <keycombo action="simul"
-> <keycap
->Ctrl</keycap
-> <keycap
->O</keycap
-> </keycombo
->. </para
->
-
-
- <tip id="spaceandbs"
-> <title
->Leyendo correo mediante el teclado</title
-> <para
-> Al leer un mensaje puede pulsar la barra de espacio para avanzar y la tecla retroceso para retroceder una página. Esto le puede ayudar a leer su correo más rápidamente. </para
-> <para
-> Puede navegar por la lista de mensajes usando las teclas de las flechas arriba y abajo. Para saltar al siguiente mensaje pulse la tecla <keycap
->.</keycap
-> (punto) o <keycap
->]</keycap
-> (cerrar corchete). Puede saltar al mensaje anterior pulsando <keycap
->,</keycap
-> (coma) o <keycap
->[</keycap
-> (cerrar corechete). </para
-> </tip
->
-
- <sect2 id="usage-mail-listorder"
->
- <title
->Ordena la lista de mensajes</title
->
- <para
-> <application
->Evolution</application
-> le ayuda en su trabajo permitiéndole ordenar su correo. Para ordenarlo por destinatario, asunto o fecha haga clic en las barras etiquetadas encima de la lista de mensajes. La dirección de la flecha en la misma le indicará el sentido de la ordenación y si vuelve a hacer clic, la ordenación cambiará al sentido inverso. Por ejemplo haga clic una vez en <guilabel
->Fecha</guilabel
-> para ordenar los mensajes por la fecha, desde el más viejo al más reciente. Haga clic de nuevo y <application
->Evolution</application
-> ordenará la lista desde el más nuevo al más antiguo. También puede hacer clic con el botón derecho sobre la cabecera del mensaje para disponer de un juego de opciones de ordenación y añadir o borrar columnas de la lista de mensajes. Puede encontrar instrucciones detalladas sobre cómo personalizar las columnas de la lista de mensajes en <xref linkend="usage-mail-organize-columns"/>. </para
->
-
- <tip id="view-headers"
-> <title
->Cabeceras de mensajes</title
-> <para
-> Para ver completas las cabeceras de un mensaje elija <menuchoice
-> <guimenu
->Ver</guimenu
-><guisubmenu
->Mostrar mensaje</guisubmenu
-> <guimenuitem
->Ver cabeceras completas</guimenuitem
-></menuchoice
->. Para ver absolutamente todo el mensaje elija <menuchoice
-><guimenu
->Ver</guimenu
-> <guisubmenu
->Mostrar mensaje</guisubmenu
-> <guimenuitem
->Mostrar el fuente</guimenuitem
-></menuchoice
->. </para
-> </tip
->
-
- <para
-> Puede elegir una vista de mensajes por conversaciones. Elija <menuchoice
-> <guimenu
->Ver</guimenu
-> <guimenuitem
->Lista de mensajes por conversaciones</guimenuitem
-> </menuchoice
-> para activarla o desactivarla. Cuando elije esta opción, <application
->Evolution</application
-> agrupa las respuestas de un mensaje con el original, por lo que puede seguir el hilo de la conversación de un mensaje al siguiente. </para
->
- <figure
->
- <title
->Las listas de mensajes en conversación en acción</title
->
- <screenshot
-> <screeninfo
->Las listas de mensajes en conversación en acción</screeninfo
-> <mediaobject
-><imageobject
-> <imagedata format="PNG" fileref="figures/mail-threaded" srccredit="Aaron Weber"/> </imageobject
-></mediaobject
-> </screenshot
->
- </figure
->
-
- </sect2
->
-
- <sect2 id="usage-mail-getnsend-delete"
->
- <title
->Eliminación de correo</title
->
- <para
-> Una vez que haya leído su correo puede que quiera desembarazarse de él. Para borrar un mensaje: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Haga clic sobre el mensaje para seleccionarlo </para
-> </listitem
-> <listitem
-> <para
-> Pulse el botón suprimir o haga doble clic sobre el mensaje y elija <guilabel
->Borrar</guilabel
->. </para
-> <note
-> <title
->¿Por qué sigo viendo el correo borrado?</title
-> <para
-> Cuando pulsa <guibutton
->Borrar</guibutton
-> o pulse sobre el botón de la papelera su correo no se borra realmente sino que se marca para ser eliminado. Su correo no desaparece definitivamente hasta que no lo haya purgado. Cuando «Purga» una carpeta realmente está elimiando todo el correo marcado como borrado. </para
-> <para
-> Si no le gusta este comportamiento, elija<menuchoice
-><guimenu
->Ver</guimenu
-> <guimenuitem
->Ocultar mensajes borrados</guimenuitem
-></menuchoice
->. Entonces sólo verá los mensajes eliminados cuando mire en su carpeta <guilabel
->Papelera</guilabel
->. </para
-> </note
-> </listitem
-> <listitem
-> <para
-> Abra <menuchoice
-> <guimenu
->Acciones</guimenu
-> <guimenuitem
->Purgar</guimenuitem
-> </menuchoice
-> o presione la combinación de teclas <keycombo action="simul"
-> <keycap
->Ctrl</keycap
-> <keycap
->E</keycap
-> </keycombo
-> </para
-> </listitem
-> </orderedlist
-> </para
->
- <note
-> <title
->¿Realmente la Papelera es una carpeta virtual?</title
-> <para
-> Tanto la carpeta local Papelera como la IMAP realmente son carpetas virtuales que muestran todos los mensajes que ha marcado para su posterior eliminación. Para saber más acerca de las carpetas virtuales consulte <xref linkend="usage-mail-organize-vfolders"/>. Dado que vaciar su papelera purga los mensajes en su carpeta Papelera, elegir<menuchoice
-> <guimenu
->Acciones</guimenu
-> <guimenuitem
->Vaciar papelera</guimenuitem
-> </menuchoice
-> es lo mismo que purgar el correo borrado en <emphasis
->todas</emphasis
-> sus carpetas.. </para
-> <para
-> Sin embargo esto no es cierto paro la carpeta Papelera situada en servidores Exchange, que se comporta exactamente igual que lo haría en Outlook. Es decir, la carpeta Papelera en un servidor Exchange es una carpeta normal con verdaderos mensajes dentro. </para
-> </note
->
- </sect2
->
- <sect2 id="usage-mail-getnsend-undelete"
->
- <title
->Recuperar mensajes</title
->
- <para
-> Para recuperar un mensaje: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Seleccione un mensaje que haya marcado para su eliminación. </para
-> </listitem
-> <listitem
-> <para
-> Pulse <keycombo action="simul"
-><keycap
->Ctrl</keycap
-><keycap
->U</keycap
-> </keycombo
-> o elija <menuchoice
-> <guimenu
->Editar</guimenu
-> <guimenuitem
->Recuperar</guimenuitem
-> </menuchoice
-> </para
-> <note
-> <title
->¿Qué es lo que Recuperar hace realmente?</title
-> <para
-> Si ha marcado un mensaje para su eliminación, recuperándolo eliminará la marca y el mensaje se borrará de la carpeta Papelera. Sin embargo no se pueden recuperar mensajes que ya han sido purgados. </para
-> </note
-> </listitem
-> </orderedlist
-> </para
->
- </sect2
->
- </sect1
->
-
- <sect1 id="usage-mail-getnsend-get"
->
- <title
->Comprobación de correo nuevo</title
->
- <para
-> Ahora que le ha dado un vistazo a la <interface
->Bandeja de entrada</interface
-> es el momento para comprobar el correo nuevo. Haga clic en<guibutton
->Enviar/Recibir</guibutton
-> en la barra de herramientas. Si aún no ha introducido ninguna configuración de correo el <interface
->asistente de configuración</interface
-> le preguntará la información que necesita para descargar su correo. </para
->
- <para
-> El asistente le presentará una serie de ventanas donde puede configurar: <itemizedlist
-> <listitem
-> <para
-> su información personal </para
-> </listitem
-> <listitem
-> <para
-> datos del servidor para el correo saliente </para
-> </listitem
-> <listitem
-> <para
-> el nombre identificativo de su cuenta </para
-> </listitem
-> </itemizedlist
-> </para
->
-
-
- <figure id="usage-mail-druid-pic"
->
- <title
->Asistente para la configuración del correo</title
->
- <screenshot
-> <screeninfo
->Asistente para la configuración del correo</screeninfo
-> <mediaobject
-> <imageobject
-> <imagedata fileref="figures/mail-druid-pic" format="PNG" srccredit="Aaron Weber"/> </imageobject
-> </mediaobject
-> </screenshot
->
- </figure
->
-
-
- <para
-> Para comprobar su correo su correo pulse el botón <guibutton
->Enviar/Recibir</guibutton
->. Si es la primera vez que lo hace o nunca le pidió a <application
->Evolution</application
-> que almacenara su contraseña, éste le pedirá que la escriba. Con ella podrá descargar su correo. </para
->
- <note id="badmailsettings"
-> <title
->¿No puede comprobar su correo?</title
-> <para
-> Si recibe un mensaje de error en lugar de correo puede que tenga que revisar su configuración de acceso a la red. Para saber cómo hacerlo dele un vistazo a <xref linkend="config-prefs-mail"/> o pregunte a su administrador de sistemas. </para
-> </note
->
-
-
-
- <tip
-> <title
->Compartiendo los buzones de correo con otros programas de correo</title
-> <para
-> Si quiere usar <application
-> Evolution</application
-> y además otro cliente de correo electrónico, como <application
->Mutt</application
->, he aquí cómo poder hacerlo: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Descargar su correo en la otra aplicación como haría con normalidad. </para
-> </listitem
-> <listitem
-> <para
-> En <application
->Evolution</application
-> elija <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
-> Configuración</guimenuitem
-></menuchoice
->. Lance la herramienta de configuración de cuentas de correo y elija la cuenta que quiere usar para compartir correo. Puede que prefiiera crear una cuenta nueva sólo para este propósito. </para
-> </listitem
-> <listitem
-> <para
-> Bajo la solapa <guilabel
->Recepción de correo</guilabel
-> elija el tipo de archivo de correo que usa su otra aplicación y escriba la ruta de directorios completa del archivo. Una eleción habitual son los ficheros mbox, con la ruta «/home/nombresdelusuario/Mail». </para
-> </listitem
-> <listitem
-> <para
-> Pinche en el botón <guibutton
->Aceptar</guibutton
->. </para
-> </listitem
-> </orderedlist
-> </para
-> </tip
->
-
-
-<!-- NOT FOR 1.0
- <sect2 id="usage-mail-getnsend-get-news"
->
- <title
->Using Evolution for News</title
->
- <para
->
- Newsgroups are so similar to email that there's no reason not
- to read them side by side. If you want to do that, add a
- news source to your configuration (see <xref
- linkend="config-prefs-network-news"/>). The news server will
- appear as a remote server, and will look quite similar to an
- IMAP folder. When you click <guibutton
->Send/Receive</guibutton
->,
- <application
->Evolution</application
-> will also check for news
- messages.
- </para
->
- </sect2
->
--->
-
- <sect2 id="usage-mail-getnsend-get-attach"
->
- <title
->Trabajar con adjuntos y correo HTML</title
->
- <para
-> Si recibe un mensaje de alguien con un fichero<glossterm linkend="attachment"
->adjunto</glossterm
->. <application
->Evolution</application
-> lo mostrará al pie del mensaje al cual está anexado. Lo que sea texto, incluido formateo HTML e imágenes empotradas, aparecerá como parte del mensaje, y no en en el pie del mismo como si fueran adjuntos. </para
->
-
- <sect3 id="usage-mail-getnsend-get-attach-actions"
->
- <title
->Abriendo o guardando adjuntos</title
->
- <para
-> Si recibe un adjunto dentro de un mensaje de correo electrónica, <application
->Ximian Evolution</application
-> le ayuda a guardarlo o a abrirlo con las aplicaciones adecuadas. </para
->
- <para
-> Guardar un adjunto en el disco: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Pinche en la flecha apuntando hacia abajo en el icono del adjunto y elija <guimenuitem
->Guardar adjunto</guimenuitem
->. </para
-> </listitem
-> <listitem
-> <para
-> Elija dónde quiere guardar el archivo y cómo nombrarlo. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Aceptar</guibutton
->. </para
-> </listitem
-> </orderedlist
-> </para
->
-
- <para
-> Abrir un anexo en una aplicación: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Abrir el mensaje de correo que contiene el adjunto que quiere leer. </para
-> </listitem
-> <listitem
-> <para
-> Pinche en la flecha junto el icono del adjunto. </para
-> </listitem
-> <listitem
-> <para
-> Elija el programa que quiere usar. Se abrirá y abrirá el documento. </para
-> </listitem
-> </orderedlist
-> </para
->
- <para
-> </para
->
- </sect3
->
-
- <sect3 id="usage-mail-getnsend-get-attach-html"
->
- <title
->Imágenes dentro de mensajes HTML</title
->
- <para
-> Cuando alguien le envía un mensaje HTML que una imagen en su interior (por ejemplo el mensaje de bienvenida que encontrará en la Bandeja de entrada la primera vez que ejecute <application
->Ximian Evolution</application
->) <application
->Evolution</application
-> mostrará la imagen dentro del propio mensaje. Usted también puede crear mensajes como ese seleccionando en el menú del editor de mensajes <menuchoice
-> <guimenu
->Insertar</guimenu
-> <guimenuitem
->Imagen</guimenuitem
-></menuchoice
-> </para
->
-
- <para
-> Si la imagen no está dentro del mensaje pero es un enlace a una imagen en Internet <application
->Evolution</application
-> puede descargarla. Sin embargo, no lo hará a menos que se lo pida explícitamente. Esto se explica porque las imágenes remotas pueden tardar un poco en set descargadas y mostradas y porquepueden ser usadas por «spammers» para llevar un control de quién lee sus indeseables mensajes. Puede proteger un poco más su privacidad si no configura para que las images se descarguen automáticamente. </para
->
- <para
-> Si quiere ver las imágenes de un mensaje elija <menuchoice
-><guimenu
->Ver</guimenu
-> <guisubmenu
->Mostrar mensaje</guisubmenu
-> <guimenuitem
->Cargar imágenes</guimenuitem
-></menuchoice
->. Si quiere que<application
->Ximian Evolution</application
-> descargue imágenes desde Internet, elija<menuchoice
-><guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-></menuchoice
-> y pinche en la herramienta de configuración del correo <guilabel
->Opciones de correo</guilabel
->. Allí abra la solapa <guilabel
->Correo en HTML</guilabel
-> y elija una de las opciones <guilabel
->No cargar nunca imágenes desde la red</guilabel
-> <guilabel
->Cargar imágenes si el remitente está en la libreta de direcciones</guilabel
-> <guilabel
->Cargar siempre las imágenes desde la red</guilabel
->. </para
->
- <note id="http-proxy"
-> <title
->Cargar imágenes desde Internet usando un «proxy» HTTP</title
-> <para
-> Si utiliza un «proxy» HTTP (como ocurre en muchas grandes organizaciones) <application
->Ximian Evolution</application
-> debe poderencontrarlo a través del subsistema <systemitem
->gnome-vfs</systemitem
-> antes de poder descargar imágenes desde Internet. Ocurre igual con la información de noticias y metereología a través de la herramienta Resumen. </para
-> <para
-> Si está usando GNOME 1.4, tendrá que configurar esto en el menú <guilabel
->Preferencias</guilabel
-> de Nautilus. Sin embargo, en GNOME 2.0 y posteriores puede usar el Centro de Control de GNOME desde el menú en la parte superior del escritorio o desde el menú GNOME<menuchoice
-><guimenu
->Sistema</guimenu
-> <guimenuitem
->Configuración personal</guimenuitem
-></menuchoice
-> desde el panel-menú o desde el menú GNOME y pinchar en el botón <guibutton
->Configuración del proxy de la red</guibutton
-> de la sección<guilabel
->Configuración del sistema</guilabel
->. Escriba la información de su proxy y si tiene dudas, consulte a su administrador de red o a su ISP. </para
-> </note
->
- </sect3
->
- </sect2
->
- </sect1
->
-
- <sect1 id="usage-mail-getnsend-send"
->
- <title
->Escribir nuevos mensajes de correo electrónico</title
->
- <para
-> Para crear un nuevo mensaje de correo electrónico elija <menuchoice
-> <guimenu
->Archivo</guimenu
-> <guisubmenu
->Nuevo</guisubmenu
-> <guimenuitem
->Mensaje de correo</guimenuitem
-> </menuchoice
-> o haga clic en <guibutton
->Nuevo</guibutton
->, en la izquierda de la barra de herramientas. Se abrirá el cuadro de diálogo <interface
->Redactar un mensaje</interface
-> tal y como se muestra en <xref linkend="usage-mail-newmsg-fig"/>. </para
->
-
-<!-- ==============Figure=================================== -->
- <figure id="usage-mail-newmsg-fig"
->
- <title
->Ventana de creación de un mensaje</title
->
- <screenshot
-> <screeninfo
->La ventana principal de Ximian Evolution</screeninfo
-> <mediaobject
-><imageobject
-><imagedata fileref="figures/newmsg" format="PNG" srccredit="Aaron Weber"/> </imageobject
-></mediaobject
-> </screenshot
->
- </figure
->
-<!-- ==============End of Figure=================================== -->
-
- <para
-> Escriba una dirección en el campo <guilabel
->Para</guilabel
->. Si lo desea, escriba el asunto en <guilabel
->Asunto</guilabel
->, y en la caja que hay abajo el texto del mensaje. Una vez que haya acabado pulse en <guibutton
->Enviar</guibutton
->. </para
->
-
- <sect2 id="usage-mail-getnsend-send-delay"
->
- <title
->Enviar los mensajes nuevos más tarde</title
->
- <para
-> En general <application
->Evolution</application
-> enviará los mensajes a su destinatario en cuanto pulse el botón <guibutton
->Enviar</guibutton
->. Sin embargo hay unas cuantas maneras de guardar un mensaje para enviarlo más tarde. <itemizedlist
-> <listitem
-> <para
-> Si está desconectado de la red, <application
->Evolution</application
-> guardará sus mensajes en la carpeta <guilabel
-> Bandeja de salida</guilabel
->. El mensaje se enviará la próxima vez que se conecte a Internet y renvíe o reciba correo. </para
-> </listitem
-> <listitem
-><para
-> Elija <menuchoice
-><guimenu
->Archivo</guimenu
-><guimenuitem
->Guardar borrador</guimenuitem
-></menuchoice
-> para guardar sus mensajes en la carpeta de borradores y poder revisarlos después. </para
-></listitem
-> <listitem
-><para
-> Si prefiere guardar el mensaje como un archivo de texto elija <guimenuitem
-> Guardar como</guimenuitem
-> y después escriba el nombre del mismo. </para
-> </listitem
-> </itemizedlist
-> </para
->
- </sect2
->
-
- <sect2 id="usage-mail-getnsend-offline"
->
- <title
->Trabajando desconectado</title
->
-
- <para
-> El modo desconectado es una herramienta diseñada para usar cuentas de correo IMAP o Exchange en situaciones en las que no podrá estar siempre conectado a la red local. Guarda copia de una o más carpetas y le permite crear nuevos mensajes, guardarlos en la <guilabel
->Bandeja de salida</guilabel
-> y enviarlo en cuanto vuelva a conectarse. </para
->
-
- <para
-> En tanto que el correo POP descarga todos sus mensajes a su escritorio, las conexiones IMAP y Exchange normalmente sólo descargan las cabeceras y traen el resto solamente cuando quiere leer el mensaje entero. Antes de desconectar, Evolution descargará todos los mensajes sin leer desde las carpetas que haya elegido copiar al escritorio. </para
->
-
- <para
-> Para marcar una carpeta para usarla cuando esté desconectado elija <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-> </menuchoice
-> y pinche en el icono <guilabel
->Configuración de carpetas</guilabel
->. Elija la solapa <guilabel
->Carpetas sin conexión</guilabel
-> y active las casilla junto a las carpetas que quiera poder usar cuando no esté conectado. </para
->
-
- <para
-> En la esquina inferior izquierda de la ventana principal de Evolution encontrará el indicador de estado de la conexión. Cuando está conectado mostrará dos cables enchufados. Cuando esté desconectado los cables estarán desenchufados. </para
->
-
- <para
-> Para copiar al disco local las carpetas elegidas y desconectar de la red elija <menuchoice
-><guimenu
->Archivo</guimenu
-> <guimenuitem
-> Trabajar desconectado</guimenuitem
-></menuchoice
-> o pinche en el icono indicador de estado de conexión en la esquina inferior izquierda de la ventana. Cuando quiera volver a conectar elija <menuchoice
-><guimenu
->Archivo</guimenu
-> <guimenuitem
-> Trabajarconectado</guimenuitem
-></menuchoice
-> o pinche de nuevo en el icono indicador de conexión. </para
->
-
- </sect2
->
- <sect2 id="usage-mail-getnsend-send-compose"
->
- <title
->Más sobre la redacción de mensajes</title
->
- <para
-> Es las próximas secciones veremos cómo <application
->Evolution</application
->.maneja sus funciones avanzadas de gestión de correo, incluyendo largas listas de destinatarios, adjuntos y reenvíos. </para
->
- <sect3 id="usage-mail-getnsend-send-attach"
->
- <title
->Adjuntos</title
->
- <para
-> Para adjuntar un archivo a su mensaje: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Pulse el botón Adjuntar en la barra de herramientas del editor. </para
-> </listitem
-> <listitem
-> <para
-> Elija el fichero que quiere adjuntar </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Aceptar</guibutton
->. </para
-> </listitem
-> </orderedlist
-> </para
->
- <para
-> También puede arrastrar un archivo desde su escritorio a la ventana del editor para adjuntarlo. </para
->
- <para
-> Para esconder la vista de los archivos que ha adjuntado al mensaje desactive<menuchoice
-> <guimenu
->Ver</guimenu
-> <guimenuitem
->Mostrar adjuntos</guimenuitem
-> </menuchoice
->; y para verlos de nuevo marque la misma casilla <guimenuitem
->Mostrar adjuntos</guimenuitem
->. </para
->
- <para
-> Cuando mande un mensaje irá con él una copia del archivo. Tenga presente que los adjuntos de gran tamaño pueden tomar mucho tiempo al ser descargados. </para
->
- </sect3
->
-
- <sect3 id="usage-mail-getnsend-send-to-types"
->
- <title
->Especificar destinatarios de correo electrónico</title
->
- <para
-> <application
-> Evolution</application
->, como la mayoría de los programas de correo electrónico reconoce tres tipos de destinatarios: los principales, los secundarios y los ocultos (también llamados «ciegos»). </para
->
- <para
-> La manera más sencilla de dirigir un mensaje es escribir las direcciones de correo electrónico de los destinatarios en los campos <guilabel
->Para</guilabel
->, indicando que son los destinatarios principales. Para enviar el mensaje a más de una o dos personas puede usar el campo <guilabel
->Cc:</guilabel
-> (con copia). </para
->
- <para
-> Al principio de los tiempos, cuando los humanos usaban máquinas de escribir y no había fotocopiadoras, «Cc:» significaba «copia de carbón». Use esta función siempre que quiera compartir con otra persona un mensaje destinado a otro. Nota del traductor: en general en español no es común el uso de la expresión sajona «copia de carbón» o «copia carbón» sino más bien «copia con calco» o sencillamente «copia». Sin embargo parece que la expresión está prosperando en la jerga informática en el contexto del correo electrónico. </para
->
- <para
-> <guilabel
->Cco:</guilabel
-> es un poco más complicado. Se usa como <guilabel
->Cc:</guilabel
-> pero la gente que figura en la lista <guilabel
->Cco:</guilabel
-> estará oculta para los otros destinatarios del mensaje. Use esta función para mandar mensajes a grandes grupos de personas especialmente si ellos no se conocen entre sí o si es importante mantener la privacidad. Si el campo <guilabel
->Cco:</guilabel
-> no está a la vista pinche en <menuchoice
-> <guimenu
->Ver</guimenu
-> <guimenuitem
->Campo «Cco»</guimenuitem
-> </menuchoice
->. </para
->
-
- <para
-> Si escribe con frecuencia a los mismos grupos de personas, puede crear listas de direcciones en el gestor de contactos, y escribirles como si cada grupo tuviera una única dirección de correo. Para saber cómo hacerlo consulte <xref linkend="usage-contact-organize-group-list"/>. </para
->
-
- <tip id="reply-to-per-mail"
-> <title
->Configurar «Responder a» mensaje a mensaje</title
-> <para
-> <application
->Evolution</application
-> tiene la habilidad de permitirle especificar el campo «Responder a:» de un mensaje: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Abra una ventana de Nautilus </para
-> </listitem
-> <listitem
-> <para
-> Para abrir el campo «Responder a» marque la casilla <menuchoice
-> <guimenu
->Ver</guimenu
-> <guimenuitem
->Responder a</guimenuitem
-> </menuchoice
-> </para
-> </listitem
-> <listitem
-> <para
-> Escriba la dirección a la que quiere que le respondan en el nuevo campo «Responder a»Enter the address you wish to have be the Reply-To address in the new Reply-To field. </para
-> </listitem
-> </orderedlist
-> </para
-> </tip
->
- </sect3
->
-
- <sect3 id="usage-mail-getnsend-send-to"
->
- <title
->Eligiendo los destinatarios rápidamente</title
->
- <para
-> Si tiene disponibles tarjetas de visita en el gestor de contactos, también puede usar apodos y otras partes de la información allí guardada para que <application
->Evolution</application
-> busque y muestra una lista desplegable de todas las posibles direcciones que encajan con lo escrito. Si escriba un nombe o un apodo que encaja con más de una ficha, Evolution abrirá un diálogo para que elija la persona a la que quiere escribir. </para
->
-
- <para
-> También puede pulsar en los botones <guibutton
->Para</guibutton
->, <guibutton
->Cc:</guibutton
->, o <guibutton
->Cco:</guibutton
-> para obtener una lista, que puede llegar a ser realmente larga, de todas las direcciones de correo de su gestor de contactos. Elija las direcciones y pinche en las flechas para moverlas en las columnas de direcciones que desea. </para
->
- <para
-> Para saber más acerca de cómo usar correo electrónico con el gestor de contactos y con el calendario consulte <xref linkend="contact-automation-basic"/> y <xref linkend="usage-calendar-apts"/>. </para
->
- </sect3
->
- </sect2
->
-
- <sect2 id="usage-mail-getnsend-send-reply"
->
- <title
->Responder un mensaje</title
->
- <para
-> Para contestar a un mensaje, selecciónelo y pulse el botón <guibutton
->Responder</guibutton
-> o pínchelo con el botón derecho del ratón y elija <guimenuitem
->Responder al remitente</guimenuitem
-> y se abrirá la <interface
->ventana del editor de correo</interface
->. Los campos <guilabel
->Para</guilabel
-> y <guilabel
->Asunto</guilabel
-> ya estarán escritos, aunque los puede modificar a placer. Además, se insertará el texto completo del mensaje original, bien en gris con una línea azul a un lado (en el modo HTML) o con un signo &gt; delante de cada línea (cuando usesólo puro texto) para indicar que ese es un mensaje anterior. Mucha gente intercala su texto entre el material citado, como se muesta en <xref linkend="usage-mail-getnsend-reply-fig"/>. <figure id="usage-mail-getnsend-reply-fig"
-> <title
->Contestando un mensaje</title
-> <screenshot
-> <screeninfo
->Ventana principal de Evolution</screeninfo
-> <mediaobject
-><imageobject
-><imagedata fileref="figures/replymsg" format="PNG" srccredit="Aaron Weber"/> </imageobject
-></mediaobject
-> </screenshot
-> </figure
-> </para
->
- <para
-> Si está leyendo un mensaje que tiene varios destinatarios puede que desee <guibutton
->Responder a todos</guibutton
-> en lugar de <guibutton
-> Responder</guibutton
->. Y es que puede ahorrar mucho tiempo si tiene a muchas personas en los campos <guilabel
->Cc:</guilabel
-><guilabel
->Para:</guilabel
->. <example
-> <title
->Uso de la característica de Responder a todos</title
-> <para
-> Susan envía un mensaje a un cliente y pone copia a Tim y a una lista de correo interna de la compañía para sus compañeros de trabajo. Si Tim quiere mandar un comentario para que lo lean todos sus compañeros, él pinchará en <guibutton
->Responder a todos</guibutton
-> pero si lo que quiere es solamente decirle a Susan que está de acuerdo con ella, usará <guibutton
-> Responder</guibutton
->. Observe que esta respuesta no la recibirá nadie a quien Susan haya incluido en la lista de <guilabel
-> Cco:</guilabel
-> de su mensaje original porque tal lista no ha sido compartida con nadie. </para
-> </example
-> </para
->
- <para
-> Si está suscrito a una lista de correo y quiere que su respuesta sólo vaya a la misma en lugar de al remitente pinche en <guibutton
-> Responder la lista</guibutton
-> en lugar de<guibutton
-> Responder</guibutton
-> o de<guibutton
->Responder a todos</guibutton
->. <note
-> <title
->¿Qué es una lista de correo?</title
-> <para
-> Las listas de correo son una de las herramientas de trabajo en grupo más populares de Internet. Así es como funcionan: <simplelist
-><member
->alguien envía un mensaje a una única dirección de correo, como <email
->evolution@ximian.com</email
-></member
-> <member
->ea dirección pertenece a un programa que distribuye el mensaje a una lista de destinatarios</member
-></simplelist
->. El programa de gestión de correo permite gestionar las altas y bajas de la lista individualmente, sin que el remitente tenga que recordar todas las direcciones de las personas apuntadas. </para
-> <para
-> Los servidores de listas de correo suelen permitir al administrador de la red controlar la entrada y salida del correo, la lista de miembros e incluso moderar el contenido de las listas. </para
-> </note
-> </para
->
- </sect2
->
-
- <sect2 id="usage-mail-getnsend-send-find"
->
- <title
->Buscar y sustituir en el editor de mensajes</title
->
- <para
-> Probablemente ya está familiarizado con las funciones de búsqueda y sustitución en cualquier clase de software de edición de textos. Y si tiene experiencia en Linux o Unix puede que también sepa qué es lo que hace <guimenuitem
->Buscar expresión regular</guimenuitem
->. Si no está entre los afortunados que ya lo conocen, aquí tiene un rápido resumen de las funciones de búsqueda automática de texto que el editor de mensajes pone a su disposición. </para
->
- <para
-> <variablelist
-> <varlistentry
-> <term
-><guimenuitem
->Buscar</guimenuitem
-></term
-> <listitem
-><para
-> Escriba una palabra o frase y <application
->Evolution</application
-> la encontrará en el mensaje. </para
-></listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guimenuitem
->Buscar expresión regular</guimenuitem
-></term
-> <listitem
-> <para
-> Buscar una «regex», también llamada una <glossterm linkend="regular-expression"
->expresión regular</glossterm
->, en la ventana de editor. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guimenuitem
->Buscar siguiente</guimenuitem
-></term
-> <listitem
-><para
-> Seleccionar este elemento para repetir la última búsqueda que haya realizado. </para
-></listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guimenuitem
->Sustituir</guimenuitem
-></term
-> <listitem
-><para
-> Buscar una palabra o una frase y sustituirla por otra cosa. </para
-></listitem
-> </varlistentry
-> </variablelist
-> </para
->
-
- <para
-> Para todos estas opciones puede elegir si quiere o no <guilabel
->Hacia atrás</guilabel
->, desde el punto el que se encuentra el cursor. Para todas, excepto para las búsquedas con expresiones regulares -que no las necesitan-, tiene disponible una casilla para decidir si quiere que la búsqueda <guilabel
->distinga mayus./minus.</guilabel
->. </para
->
- </sect2
->
-
- <sect2 id="usage-mail-getnsend-send-html"
->
- <title
->Mejore su correo electrónico con HTML</title
->
- <para
-> Normalmente no se pueden aplicar estilos o insertar ilustraciones en mensajes de correo electrónico, por lo que con frecuencia se le considera poco comunicativo y frío y por lo que a veces la gente abuse del uso de signos de exclamación para expresar sus sentimientos. Sin embargo la mayoría de los clientes de correo moderno son capaces de mostrar imágenes y estilos en el texto, como alineado básico y formateo de los párrafos. Esto es posible por usar <glossterm linkend="html"
->HTML</glossterm
-> de la misma manera que lo hacen las páginas web. </para
->
- <note
-> <title
->El correo HTML no es una opción predeterminada</title
-> <para
-> Algunas personas no tienen clientes de correo capaces de leer HTML o prefieren no recibir mensajes enriquecidos con HTML porque son más lentos de descargar y de mostrar en pantalla. Por eso <application
-> Evolution</application
-> envía mensajes de texto puro a menos que explícitamente le pida que los componga con HTML. </para
-> </note
->
-
- <para
-> Puede cambiar el formato de un mensaje de correo de texto puro a HTML a través de <menuchoice
-><guimenu
->Formato</guimenu
-> <guimenuitem
->HTML</guimenuitem
-> </menuchoice
->. </para
->
- <para
-> Para que todos los mensajes que envíe estén compuestos con HTML predeterminadamente, asigne sus preferencias de formato del correo en el diálogo de configuración del correo. Para más información consulte <xref linkend="config-prefs-mail-composer"/>. </para
->
- <para
-> Las herramientas de formateo HTML se encuentran en la barra de herramientas justo encima del espacio en el que realmente compone su mensaje y también aparecen en los menús <guimenu
->Insertar</guimenu
-> y <guimenu
->Formato</guimenu
->. </para
->
- <para
-> Los iconos de la barra de herramientas se explican en <glossterm linkend="tooltip"
->consejos</glossterm
-> que aparecen cuando mantiene el ratón sobre los botones. Estos se clasifican en cuatro categorías: <variablelist
-> <varlistentry
-> <term
->Cabeceras y listas</term
-> <listitem
-> <para
-> A la izquierda de la barra de herramientas, puede elegir el estilo de texto predeterminado<guilabel
->Normal</guilabel
-> o los diferentes tamaños de cabecera disponibles desde <guilabel
->Cabecera 1</guilabel
-> (el más grande) hasta <guilabel
->Cabecera 6</guilabel
-> (el más pequeño). Otros estilos disponibles para los más organizados son <guilabel
->Preformato</guilabel
->, la lista de puntos o los tres tipos de listas numeradas. </para
-> <tip
-> <title
->Cómo hacer más atractivo su correo electrónico</title
-> <para
-> En lugar de usar asteriscos para marcar una lista de puntos, pruebe el estilo Lista de puntos desde el menú desplegable de estilos. <application
->Evolution</application
-> usa adornos más atractivos y maneja varios niveles de sangría y el reformateo de los párrafos. </para
-> </tip
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Estilo del texto</term
-> <listitem
-> <para
-> Use estos botones para fijar la apariencia de sus cartas. Si tiene seleccionado un texto, el estilo se aplicará sobre él. Si no, el estilo se aplicará a lo próximo que escriba. Los botones son: <itemizedlist mark="none"
-> <listitem
-><para
->Pinche en <guiicon
->A en negrita</guiicon
-> para poner el texto en negrita</para
-></listitem
-> <listitem
-><para
->Pinche en <guiicon
->A en itálica</guiicon
-> para poner el texto en itálicas</para
-></listitem
-> <listitem
-><para
->Pinche en <guiicon
->A subrayada</guiicon
-> para poner el texto subrayado</para
-></listitem
-> <listitem
-><para
->Pinche en <guiicon
->A tachada</guiicon
-> para poner el texto tachado.</para
-></listitem
-> </itemizedlist
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Alineación</term
-> <listitem
-> <para
-> Situado próximo a los botones de estilo del texto, estos tres iconos de párrafo deberían ser familiares para los usuarios de procesadores de textos. El que está más a la izquierda alinea el texto a la izquierda, el del centro, lo centra y el de la derecha lo alinea hacia el lado derecho. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Reglas de sangrado</term
-> <listitem
-> <para
-> El botón con la flecha que apunta a la izquierda reducirá la sangría de un párrafo y el de la derecha la incrementará. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Elección de color</term
-> <listitem
-> <para
-> En el extremo de la derecha está la herramiente de elección del colo. La caja coloreada muestra el color actual del texto. Para elegir uno nuevo pinche sobre el botón de la flecha que está a su derecha. Si tiene un trozo de texto seleccionado el color se aplicará al mismo. Si no, el color se aplicará a lo que escriba después. Para el fondo puede elegir un color o una imagen pinchando con el botón derecho sobre el fondo del texto y eligiendo <menuchoice
-> <guimenuitem
->Estilo</guimenuitem
-><guimenuitem
->Estilo de página</guimenuitem
-></menuchoice
->. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para
->
- <para
-> El menú <guimenu
->Insertar</guimenu
-> le ofrece medios para acicalar su correo electrónico y hacerlo más atractivo. <variablelist
-> <varlistentry
-> <term
-><guimenuitem
->Insertar enlace</guimenuitem
-></term
-> <listitem
-> <para
-> Enlace un texto con un sitio web. Ponga hiperenlaces con esta herramienta dentro de sus mensajes HTML. Si no quiere escribir ningún texto en particular, sólo tiene que escribir la dirección directamente y <application
-> Evolution</application
->la reconocerá como un enlace. Para añadir un enlace: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Elija el texto en el que quiere poner el enlace. </para
-> </listitem
-> <listitem
-> <para
-> Pinche con el botón de la derecha y elija <guibutton
->Enlace</guibutton
->. </para
-> </listitem
-> <listitem
-> <para
-> Escriba la dirección que quiere escribir en el campo <guilabel
->URL</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Aceptar</guibutton
->. </para
-> </listitem
-> </orderedlist
-> </para
-> <note
-> <para
-> Si está escribiendo la dirección de una página web para que sea formateada automáticamente, tenga en cuenta que un espacio da por finalizado el enlace. </para
-> </note
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guimenuitem
->Insertar imagen</guimenuitem
-></term
-> <listitem
-> <para
-> Ponga una imagen junto al texto. </para
-> <para
-> Para insertar una imagen en su correo: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Asegúrese que el selector <menuchoice
-> <guimenu
->Formato</guimenu
-> <guimenuitem
->HTML</guimenuitem
-> </menuchoice
->.está marcado. </para
-> </listitem
-> <listitem
-> <para
-> Pinche en el botón <guibutton
->Insertar imageb</guibutton
-> que está en la barra de herramientas o elija <menuchoice
-> <guimenu
->Insertar</guimenu
-> <guimenuitem
->Imagen</guimenuitem
-> </menuchoice
->. </para
-> </listitem
-> <listitem
-> <para
-> Elija la imagien pinchando en el botón <guibutton
->Examinar</guibutton
->. </para
-> </listitem
-> <listitem
-> <para
-> Para insertar la imagen pulse el botón <guibutton
->Insertar</guibutton
->. </para
-> </listitem
-> </orderedlist
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guimenuitem
->Insertar regla</guimenuitem
-></term
-> <listitem
-> <para
-> Insertar una línea horizontal en el texto para dividirlo en dos secciones. </para
-> <para
-> Para insertar una regla: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Asegúrese que el selector <menuchoice
-> <guimenu
->Formato</guimenu
-> <guimenuitem
->HTML</guimenuitem
-> </menuchoice
->.está marcado. </para
-> </listitem
-> <listitem
-> <para
-> Pinche en el botón <guibutton
->Regla</guibutton
-> que está en la <guilabel
->Barra de herramientas</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Elija el tipo de regla. Puede usar una línea plana, una 3D o una amarilla con flores. </para
-> </listitem
-> <listitem
-> <para
-> Elija el tamaño de la línea, como un porcentaje del ancho de la ventana del mensaje. </para
-> </listitem
-> <listitem
-> <para
-> Elija la alineación y el estilo. Para una línea plana puede elegir su grosor y si será sombreada o sólida. Para los otros tipos sólo puede elegir cómo alinearlas. </para
-> </listitem
-> <listitem
-> <para
-> Pinche en <guibutton
->Insertar</guibutton
-> para insertar la regla. </para
-> </listitem
-> </orderedlist
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Insertar tabla</term
-> <listitem
-> <para
-> Insertar una tabla en el texto para dividirlo en dos secciones. </para
-> <para
-> Para insertar una tabla: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Asegúrese que el selector <menuchoice
-> <guimenu
->Formato</guimenu
-> <guimenuitem
->HTML</guimenuitem
-> </menuchoice
->.está marcado. </para
-> </listitem
-> <listitem
-> <para
-> Pinche en el botón <guibutton
->Tabla</guibutton
-> que está en la <guilabel
->barra de herramientas</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Elija la tabla <guibutton
->Plantilla</guibutton
-> que quiera usar. Cada una tiene una apariencia y organización ligeramente diferentes. </para
-> </listitem
-> <listitem
-> <para
-> Si lo desea, puede cambiar el número de filas, columnas, el espaciado entre celdas, etc. </para
-> </listitem
-> <listitem
-> <para
-> Pinche en el botón <guibutton
-> Insertar</guibutton
->. </para
-> </listitem
-> </orderedlist
-> </para
-> <para
-> Una vez que la tabla está en su lugar, puede pinchar con el botón derecho sobre ella y obtener la lista de posibilidades de modificarla, como cambiar el color de fondo, expandirla o borrarle una fila o una celda. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Plantillas</term
-> <listitem
-> <para
-> <application
->Evolution</application
-> no sólo permite decorar su correo con texto HTML y gráficos sino que también le ofrece plantillas prediseñadas para aprovechar estas mejoras. Puede usarlas para enfatizar un punto o enmarcar una imagen de una manera vistosa. </para
-> <para
-> Para incluir una plantilla en su correo compuesto con HTML: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Asegúrese que el selector <menuchoice
-> <guimenu
->Formato</guimenu
-> <guimenuitem
->HTML</guimenuitem
-> </menuchoice
->.está marcado. </para
-> </listitem
-> <listitem
-> <para
-> Pinche en el botón <guibutton
->Insertar plantilla HTML</guibutton
->que está en la <guilabel
->Barra de herramientas</guilabel
-> o elija <menuchoice
-> <guimenu
->Insertar </guimenu
-> <guimenuitem
->Plantilla</guimenuitem
-> </menuchoice
-> </para
-> </listitem
-> <listitem
-> <para
-> Elija el tipo de plantilla en la caja de selección <guilabel
->Plantilla</guilabel
->. Puede elegir entre <guilabel
->Nota</guilabel
-> e <guilabel
->Imagen con marco</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Elija el tamaño y alineación de la plantilla de HTML. </para
-> </listitem
-> <listitem
-> <para
-> Pinche en <guibutton
->Insertar</guibutton
-> para insertarlo en la posición del cursor. </para
-> </listitem
-> <listitem
-> <para
-> Pinche sobre el texto en la plantilla y escriba el que quiera que aparezca finalmente. </para
-> <para
-> Si ha seleccionado una plantilla con marco e imagen, pinche con el botón derecho sobre la imagen y en <guimenuitem
-> Imagen</guimenuitem
-> elija qué imagen quiere poner en el marco. </para
-> </listitem
-> </orderedlist
-> </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para
->
-</sect2
->
-
- <sect2 id="usage-mail-getnsend-fwd"
->
- <title
->Reenviar correo</title
->
- <para
-> La oficina de correos le reenvía su correo cuando usted cambia de dirección y usted puede reenviar una carta que ha llegado hasta usted por error. El botón de correo <guilabel
->Reenviar</guilabel
-> funciona de manera parecida. Es particularmente útil cuando recibe un mensaje que cree que otra persona también debería ver. Puede reenviar los mensajes como si fueran adjuntos a un mensaje nuevo (este es el comportamiento predeterminado) o puede enviarlo <glossterm linkend="inline"
->incluido</glossterm
->, como una parte citada en el mensaje que está enviando. El reenvío en forma de adjunto es el mejor si quiere enviar una copia íntegra del mensaje. Los envíos incluídos son mejores si sólo quiere enviar partes del mensaje o si tiene que hacer una gran cantidad de comentarios a diferentes partes del mensaje que reenvía. Recuerde que es importante citar al autor original del mensaje y diferenciar claramente las partes del texto que ha modificado, borrado o añadido. </para
->
- <para
-> Si está leyendo un mensaje y quiere reenviarlo, pulse el botón de la barra de herramientas<guibutton
->Reenviar</guibutton
-> o <menuchoice
-><guimenu
->Acciones</guimenu
-> <guimenuitem
->Reenviar</guimenuitem
-></menuchoice
-> <keycombo action="simul"
-><keycap
->Ctrl</keycap
-><keycap
->J</keycap
-> </keycombo
->. Si prefiere reenviarlo <glossterm linkend="inline"
->en línea</glossterm
-> en lugar de adjunto, elija en el menú:<menuchoice
-><guimenu
->Acciones</guimenu
-> <guisubmenu
->Reenviar</guisubmenu
-><guimenuitem
->Incluido en línea</guimenuitem
-> </menuchoice
->. Escriba el destinatario como haría con un mensaje nuevo. El asunto ya estará escrito, aunque podrá modificarlo si lo desea. Añada sus comentarios en la<interface
->caja del texo</interface
-> y pulse <guibutton
->Enviar</guibutton
-> cuando haya acabado. </para
->
- </sect2
->
-
- <sect2 id="usage-mail-getnsend-ettiquette"
->
- <title
->Siete consejos de cortesía para el correo electrónico</title
->
- <para
-> <itemizedlist
-> <listitem
-> <para
-> No envíe «spam» o reenvíe los mensajes en cadena. Y si tiene que hacerlo, cuídese de mensajes en broma o de leyendas urbanas y asegúrese de que el mensaje no tiene varias capas de signos de mayor que (&gt;) que indican sucesivos reenvíos descuidados. </para
-> </listitem
-> <listitem
-> <para
-> Siempre empiece y acaba con un saludo. Diga «por favor» y «gracias» de la misma manera que haría en la vida real. Puede ser breve en sus cumplidos ¡pero sea atento! </para
-> </listitem
-> <listitem
-> <para
-> ¡CUANDO ESCRIBE CON MAYÚSCULAS SIGNIFICA QUE ESTà GRITANDO! No escriba mensajes enteros con mayúsculas porque a la gente le dolerán los oídos. </para
-> </listitem
-> <listitem
-> <para
-> Compruebe su ortografía y use frases completas. <application
->Evolution</application
->. está preconfigurado para destacar las palabras que no reconozca con una línea roja bajo las palabras conforme las vaya escribiendo. </para
-> </listitem
-> <listitem
-> <para
-> No envíe mensajes desagradables. Si recibe alguno, mejor no lo responda. </para
-> </listitem
-> <listitem
-> <para
-> Cuando conteste o reenvíe un mensaje incluya del mensaje anterior lo justo para proveer del contexto necesario: ni mucho ni poco. </para
-> </listitem
-> <listitem
-> <para
-> No envíe spam. </para
-> </listitem
-> </itemizedlist
-> </para
->
- </sect2
->
- </sect1
->
- <sect1 id="rsvp-stuff"
->
- <title
->Envío de confirmaciones de asistencia por correo</title
->
- <para
-> Al crear un evento en la agenda puede enviar invitaciones por correo electrónicoa la lista de invitados. Las invitaciones se envían como archivos adjuntos en formato iCal. </para
->
- <para
-> Si pincha sobre el botón del adjunto y elije <guimenuitem
->Ver incluido</guimenuitem
->,<application
->Ximian Evolution</application
-> mostrará los datos de la reunión y le permitirá dar su respuesta a la convocatoria. Elija la respuesta y pulse en <guibutton
->Aceptar</guibutton
->. </para
->
- <para
-> Sus opciones con: <variablelist
-> <varlistentry
-> <term
->Aceptar</term
-> <listitem
-> <para
-> Elija su respuesta y pulse el botón<guibutton
-> Aceptar</guibutton
-> para que la reunión se apunte en el calendario de su agenda. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Aceptado provisionalmente</term
-> <listitem
-> <para
-> Elija esta opción si es probable que asista a la reunión. Cuando pulse <guibutton
->Aceptar</guibutton
-> la reunión se apuntará en su agenda, pero marcada como provisional. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Rehusar</term
-> <listitem
-> <para
-> Elija esta opción si no va a poder asistir a la reunión. AL pulsar<guibutton
->Aceptar</guibutton
-> no se anotará en su agenda pero si ha marcado la casilla <guilabel
->Confirmar</guilabel
-> se enviará automáticamente un mensaje con su respuesta. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->RSVP (confirmación de asistencia)</term
-> <listitem
-> <para
-> Marque esta casilla si quiere que su respuesta llegue a los organizadores de la reunión. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para
->
- </sect1
->
-
- <sect1 id="usage-mail-subscriptions"
->
- <title
->Gestión de suscripciones</title
->
- <para
-> Dado que las carpetas IMAP están en el servidor y que abrirlas y cerrarlas toma su tiempo, necesita un control muy fino en la manera de gestionarlas. Por eso <application
->Evolution</application
-> tiene un gestor de suscripciones IMAP. Si quiere que se le muestren todas las carpetas de correo también puede elegir esa opción, sin embargo, si quiere escoger elementos específicos y excluir el resto, puede usar la herramienta de gestión de suscripciones. </para
->
- <para
-> He aquí como: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Seleccione <menuchoice
-><guimenu
->Herramientas</guimenu
-><guimenuitem
->Suscribirse a carpetas</guimenuitem
-></menuchoice
->. </para
-> </listitem
-> <listitem
-> <para
-> Si tiene cuentas en varios servidores IMAP, elija el servidor donde quiere gestionar sus suscripciones y <application
->Evolution</application
-> mostrará la lista de carpetas y archivos disponibles. </para
-> </listitem
-> <listitem
-> <para
-> Para elegir un archivo o una carpeta pínchelos con el ratón. Al menos necesitará seleccionar la carpeta <guilabel
->Bandeja de entrada</guilabel
->. En función de cómo esté configurado su servidor IMAP la lista de ficheros puede incluir carpetas que no son de correo, que puede ignorar sin más problema. </para
-> </listitem
-> <listitem
-> <para
-> Pinche en <guibutton
->Suscribir</guibutton
-> para añadir el elemento a su lista de suscripción. </para
-> </listitem
-> <listitem
-> <para
-> Cierre la ventana cuando se haya suscrito a las carpetas que desea. </para
-> </listitem
-> </orderedlist
-> </para
->
- </sect1
->
-
- <sect1 id="encryption"
->
- <title
->Cifrado</title
->
- <sect2 id="encryption-whatis"
->
- <title
->¿Qué es el cifrado?</title
->
- <para
-> El cifrado es un antiguo método para proteger la información de las miradas curiosas. <application
->Evolution</application
-> le ayuda a proteger su privacidad haciendo uso de la aplicación <application
->gpg</application
->, que es una implementación del poderoso algoritmo de <glossterm linkend="public-key-encryption"
->cifrado de clave pública.</glossterm
-> </para
->
-
- <note id="pub-priv"
-> <title
->¿Clave pública? ¿Privada? ¿Cuál es la diferencia?</title
-> <para
-> GPG usa dos claves: una pública y otra privada. Puede darle su clave pública a cualquiera del que quiera recibir mensajes cifrados o puede ponerla en un servidor de claves públicas para que cualquiera pueda mirar allí antes de escribirle. <emphasis
->Nunca jamás le de a nadie su clave privada</emphasis
->. La clave privada es la que le permite descifrar cualquier mensaje cifrado con su clave pública. </para
-> </note
->
-
- <para
-> Enviar correo cifrado exige un poco de previsión. Para mandar un mensaje cifrado necesita usar la clave pública del destinatario a quien pretende enviarlo. Para poder recibir y<emphasis
->leer</emphasis
-> un mensaje es preciso que el remitente tenga su clave pública (la suya, de usted). Para firmar mensajes ocurre el inverso: usted cifra la firma del mensaje con su clave privada de manera que solamente su clave pública puede desvelar la firma. Cuando envía el mensaje, el destinatario toma su clave pñublica, desvela la firma y verifica su identidad. </para
->
-
- <para
-> El cifrado puede usarse de dos maneras diferentes: <simplelist
-> <member
-> Cifre el mensaje entero para que nadie, excepto el destinatario, pueda leerlo. </member
-> <member
-> Adjuntar una firma cifrada a un mensaje de puro texto, para que el recipiente pueda leer el mensaje sin tener que descifrarlo. Sólo necesitaría descifrar la firma cuando quiera verificar la identidad del remitente. </member
-> </simplelist
-> </para
->
-
- <example
-> <title
->Enviar un mensaje cifrado</title
-> <para
-> Kevin quiere enviar un mensaje cifrado a su amiga Rachel. Él busca su clave pública en un servidor público y entonces le pide a <application
->Evolution</application
-> que cifra el mensaje. El mensaje ahora tiene una apariencia del estilo «@#$23ui7yr87#@!48970fsd». Cuando llega a Rachel, ella usa su clave privada para descifrarlo y el mensaje quedará listo para su lectura. </para
-> </example
->
- <tip id="always-sign"
-> <title
->Firme siempre</title
-> <para
-> Puede configurar <application
->Evolution</application
-> para que firme siempre sus mensajes de correo electrónico: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Elija <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-> </menuchoice
->, vaya a <guiicon
->Cuentas de correo</guiicon
-> y elija la cuenta en la que quiere usar las funciones de cifrado. </para
-> </listitem
-> <listitem
-> <para
-> Abra la solapa<guilabel
->Seguridad</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Pinche en el botón <guibutton
->Firmar siempre el correo saliente al usar esta cuenta </guibutton
->. </para
-> </listitem
-> </orderedlist
-> </para
-> </tip
->
- </sect2
->
-
-
-
- <sect2 id="encryption-keygen"
->
- <title
->Crear claves de cifrado</title
->
- <para
-> Antes de poder enviar o recibir correo cifrado necesita generar sus claves privada y pública usando GPG. He aquí cómo: </para
->
- <tip
-> <title
->Versiones de GPG</title
-> <para
-> Este manual describe la versión 1.0.6 de <application
->GPG</application
->. Si su versión es diferente puede que este texto no sea completamente exacto. Puede averiguar la versión exacta usando la orden <command
->gpg --version</command
->. </para
-> </tip
->
- <para
-> <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Abra una terminal y escriba la orden <command
->gpg --gen-key</command
->. </para
-> </listitem
-> <listitem
-> <para
-> Elija el algoritmo predeterminado, «DSA y ElGamal». </para
-> </listitem
-> <listitem
-> <para
-> Elija el tamaño de su clave. La predeterminada es de 1024 bits, lo que debería ser suficiente. </para
-> </listitem
-> <listitem
-> <para
-> Especifique si quiere que su clave caduque, y en caso positivo, cuándo. </para
-> </listitem
-> <listitem
-> <para
-> Escriba su nombre, su dirección de correo y cualquier otro dato personal que crea que es apropiado. No falsifique esta información porque será necesaria para poder identificar después su identidad. </para
-> </listitem
-> <listitem
-> <para
-> Siguiente, escriba el santo y seña. No tiene por qué ser igual que la contraseña de su buzón de correo o la que usa para identificar en el sistema. En realidad, probablemente debería ser diferente. No la olvide. Si la pierde, sus claves serán inútiles del todo y no podrá descifrar los mensajes que le manden usando esas claves. </para
-> </listitem
-> <listitem
-> <para
-> Ahora GPG generará sus claves. Esto puede tardar un rato, así que aproveche para hacer alguna otra cosa mientras. En realidad, usar el sistema para otros asuntos genera mejores claves porque el uso aumenta la aleatoriedad matemática en la semilla del generador de claves. </para
-> </listitem
-> </orderedlist
-> </para
->
- <para
-> Una vez que las claves están generadas puede ver los datos de las mismas con<command
->gpg --list-keys</command
->. Verá algo parecido a esto: <programlisting
->
-
- </programlisting
-> </para
->
- <para
-> GPG creará una lista, o llavero, con todas las claves públicas que tenga y otra para las privadas. Todas las claves públicas que conoce están guardadas en en <filename
->~/.gnupg/pubring.gpg</filename
->. Si quiere darle a alguien su clave, envíele este fichero. </para
->
- <para
-> Si lo desea puede subir sus claves a un servidor de claves: <orderedlist
-> <listitem
-> <para
-> Compruebe su identificador de clave pública con<command
->gpg --list-keys</command
->. Su identificador será la cadena que está detras de 1024D en la línea que empieza con «pub». En estte ejemplo es 32j38dk2. </para
-> </listitem
-> <listitem
-> <para
-> Escirba la orden <command
->gpg --send-keys --keyserver wwwkeys.pgp.net 32j38dk2</command
->. Substituya el identificador de su clave por 32j38dk2. Necesitará su contraseña para poder hacerlo. </para
-> </listitem
-> </orderedlist
-> <note id="why-keyserver"
-> <title
->¿Por qué usar un servidor de claves?</title
-> <para
-> Los servidores de claves almacenan sus claves públicas para que sus amigos puedan descifrar sus mensajes. Si opta por no usar un servidor de claves, entonces puede enviarlas manualmente, incluyéndola en el adjunto con la firma, o publicándola en su propia página web. Sin embargo es más fácil publicarla de una vez y permitir a los demás descargarlas desde un servidor central cuando ellos quieran. </para
-> <para
-> </para
-> </note
-> </para
->
- </sect2
->
-
- <sect2 id="encrypt-getting-key"
->
- <title
->Obteniendo y usando claves públicas</title
->
- <para
-> Para cifrar un mensaje para quien sea, necesitará usar su clave pública en combinación con su clave privada. <application
->Evolution</application
-> lo hace por usted, pero con todo necesitará obtener su clave y añadirla a su llavero. </para
->
- <para
-> Para obtener claves públicas desde un servidor de claves públicas escriba la orden <command
-> gpg --recv-keys --keyserver wwwkeys.pgp.net keyid </command
->, substituyendo «keyid» por el identificador del destinatario. Necesitará escribir su contraseña y su identificador se añadirá automáticamente a su llavero. Cuando le envíe un mensaje, <application
->Evolution</application
-> le permitirá cifrar sus mensajes. </para
->
- <para
-> Si alguien le envía directamente su clave pública, guárdela como un fichero de texto puro y en la terminal escriba la orden <command
->gpg nombredelfichero</command
->. Así la añadirá a su llavero. </para
->
- </sect2
->
-
- <sect2 id="encrypt-evo-integ"
->
- <title
->Configuración del cifrado en Evolution</title
->
- <para
-> Tiene que abrir <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-> </menuchoice
-> y pulsar el botón<guilabel
->Cuentas de correo</guilabel
->; elija la cuenta que quiere usar con seguridad y pulse el botón <guibutton
->Editar</guibutton
->. Abra la solapa <guilabel
->Seguridad </guilabel
-> y verá una sección llamada <guilabel
->Pretty Good Privacy</guilabel
->. Escriba su identificador (ID) y pulse en <guibutton
->Aceptar</guibutton
->. Ahora su clave está integrada en su identidad en<application
->Evolution</application
->. </para
->
- <note
-> <title
->De nuevo ¿Qué es mi identificador de clave?</title
-> <para
-> <application
-> Evolution</application
-> necesita que usted sepa su identificador (ID) de clave. Si no lo recuerda puede encontrarlo con la orden <command
->gpg --list-keys</command
-> en una terminal. El identificador de clave es una cadena de 8 caracteres con números y letras aleatorios. </para
-> </note
->
- </sect2
->
-
- <sect2 id="encrypt-sending"
->
- <title
->Enviar mensajes cifrados</title
->
- <para
-> Como sabe, puede cifrar un mensaje para ocultarlo completamente o sólo para verificar su firma. Una vez que ha generado sus claves privada y pública y dispone de las claves públicas de la gente a la que quiere mandar mensajes, he aquí lo que hacer: </para
->
- </sect2
->
-
- <sect2 id="sign-msg"
->
- <title
->Firmar un mensaje</title
->
- <para
-> Para firmar un mensaje elija <menuchoice
-> <guimenu
->Seguridad</guimenu
-> <guimenuitem
->Firmar con PGP</guimenuitem
-> </menuchoice
-> . Tendrá que introducir su contraseña de cifrado. Después pulse <guibutton
->Aceptar</guibutton
-> y su mensaje será firmado. </para
->
- </sect2
->
-
- <sect2 id="encrypt-msg"
->
- <title
->Cifrar un mensaje</title
->
- <para
-> Cifrar un mensaje es muy parecido a firmarlo. Simplemente abra en el menú <menuchoice
-> <guimenu
->Seguridad</guimenu
-> <guimenuitem
->Cifrar con PGP</guimenuitem
-> </menuchoice
-> </para
->
- </sect2
->
- <sect2 id="unencrypting"
->
- <title
->Descifrar un mensaje recibido</title
->
- <para
-> Si recibe un mensaje cifrado necesita descifrarlo antes de poder leerlo. Recuerde que el remitente tiene que tener su clave pública (la suya, de usted) antes de enviarle un mensaje cifrado. </para
->
- <para
-> Cuando vea el mensaje <application
->Evolution</application
-> le pedirá que escriba su contraseña PGP. Escríbala y el mensaje será mostrado apropiadamente. </para
->
- </sect2
->
- </sect1
->
-</chapter
->
-
diff --git a/help/es/usage-mainwindow.xml b/help/es/usage-mainwindow.xml
deleted file mode 100644
index 4a0e62d463..0000000000
--- a/help/es/usage-mainwindow.xml
+++ /dev/null
@@ -1,1524 +0,0 @@
-<chapter id="usage-mainwindow">
-
- <title
->Primeros pasos con Ximian Evolution</title>
-
- <sect1 id="what"
->
- <title
->Qué es Ximian Evolution y qué puede hacer por mí</title>
- <para
-> Una información desorganizada y de difícil acceso es inútil; no puede llamarse así si tras consultarla no queda <emphasis
->informado</emphasis
->. El objetivo de <application
->Ximian Evolution</application
-> es simplificar las tareas de almacenamiento, organización y recuperación de su información personal, con el fin de poder trabajar y comunicarse con otras personas. Se trata por tanto de un programa muy evolucionado de <glossterm linkend="groupware"
->trabajo en grupo</glossterm
->, una parte integral de su escritorio de trabajo conectado a Internet. </para>
- <para
-> En otras palabras, <application
->Ximian Evolution</application
-> es una herramienta para ayudarle a hacer su trabajo. Puede ayudarle a trabajar en grupo manejando su correo electrónico, sus direcciones y otra información de contacto y uno o más calendarios. Funciona en uno o varios sistemas conectados en local o en red, para uso individual o en grupos de gran tamaño. </para>
-
- <para
-> <application
->Ximian Evolution</application
-> permite realizar la mayoría de las tareas diarias más rápidamente. Por ejemplo, agregar una nueva cita o enviar una tarjeta de visita por correo electrónico o escribir a un contacto sólo requiere hacer clic un par de veces. <application
->Ximian Evolution</application
-> muestra la información en la pantalla más rápida y eficazmente, las búsquedas son más veloces y el consumo de memoria, menor. Los usuarios que reciban cantidades ingentes de correo apreciarán características avanzadas como las <trademark
->carpetas virtuales</trademark
-> que permiten guardar búsquedas como si fueran carpetas de correo convencionales. </para>
- </sect1>
-
- <sect1 id="usage-mainwindow-starting">
- <title
->Primeros pasos con Ximian Evolution</title>
- <para
-> Puede iniciar <application
->Ximian Evolution</application
-> de una de estas maneras: <itemizedlist
-> <listitem
-> <para
-> Elija <menuchoice
-><guimenu
->Programas</guimenu
-> <guimenuitem
->Evolution</guimenuitem
-> </menuchoice
-> desde el menú del panel. </para
-> </listitem
-> <listitem
-> <para
-> Escriba <command
->evolution</command
-> en la línea de órdenes. </para
-> </listitem
-> </itemizedlist
-> </para>
-
- <para
-> <note
-> <title
->Opciones de la línea de órdenes</title
-> <para
-> Evolution le permite utilizar una serie de opciones de la línea de órdenes. Para consultar la lista completa, ejecute las órdenes <userinput
->man evolution</userinput
-> o <userinput
->evolution --help</userinput
->. Las más importantes son: <itemizedlist
-> <listitem
-> <para
-> Para iniciar Evolution en modo desconectado: <userinput
->evolution --offline</userinput
-> </para
-> </listitem
-> <listitem
-> <para
-> Para iniciar Evolution y empezar a escribir un mensaje a la dirección de correo que especifique: <userinput
->evolution mailto:paco@porahi.net</userinput
->. </para
-> </listitem
-> <listitem
-> <para
-> Para que su navegador Web utilice Evolution de manera predeterminada escriba <userinput
->evolution "%s"</userinput
-> en el campo correspondiente al administrador de correo, en la configuración de su navegador o en el Centro de control de GNOME. </para
-> </listitem
-> </itemizedlist
-> </para
-> </note
-> </para>
- <para
-> La primera vez que los ejecute, el programa crea un directorio llamado <filename
->evolution</filename
-> en su directorio de inicio de sesión, donde almacena toda su información local. Después se abrirá un asistente, sólo la primera vez, con el fin de ayudarle a configurar sus cuentas de correo, así como para importar datos de otras aplicaciones. </para>
- <para
-> El asistente de primer inicio requiere entre dos y cinco minutos de su tiempo, aproximadamente. </para>
-
- <sect2 id="first-step">
- <title
->Definición de su identidad</title>
- <para
-> La ventana Identidad es el primer paso del asistente. Aquí debe escribir algunos datos personales. Más tarde podrá definir más identidades desde el menú <menuchoice
-><guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-></menuchoice
->, con el botón <guibutton
->Cuentas de correo</guibutton
->. <itemizedlist
-> <listitem
-> <para
-> Nombre completo: su nombre completo (por ejemplo Francisco López). </para
-> </listitem
-> <listitem
-> <para
-> Dirección de correo: su dirección de correo electrónico (por ejemplo: francisco@lopez.com). </para
-> </listitem
-> <listitem
-> <para
-> Responder A: Si quiere que las respuestas le lleguen a otra dirección de correo, escríbala aquí (opcional). </para
-> </listitem
-> <listitem
-> <para
-> Organización: la compañía para la que trabaja o la organización a la que representa cuando escribe correo (opcional). </para
-> </listitem
-> </itemizedlist
-> </para>
- </sect2>
-
- <sect2 id="second-step">
- <title
->Recibiendo mensajes</title>
- <para
-> La sección <guilabel
->Recibiendo mensajes</guilabel
-> permite determinar de dónde obtendrá su correo. <itemizedlist
-> <listitem
-> <para
-> Tipo de servidor: <application
->Ximian Evolution</application
-> es capaz de recuperar su correo desde varios tipos de servidores. Si no está seguro cuál de los siguientes debe elegir, pregunte a su administrador del sistema: <itemizedlist
-> <listitem
-> <para
-> POP: descargará el correo a su disco duro para almacenarlo permanentemente. </para
-> </listitem
-> <listitem
-> <para
-> Microsoft Exchange: sólo disponible si ha adquirido Ximian Connector para Microsoft Exchange, permite conectarse a un servidor Microsoft Exchange Server 2000, que almacena la información de calendario, contacto y correo electrónico en el servidor. </para
-> </listitem
-> <listitem
-> <para
-> IMAP: conserva su correo en el servidor para que pueda acceder a él con sistemas diferentes. </para
-> </listitem
-> <listitem
-> <para
-> Directorio o buzón mbox estándar de Unix: seleccione esta opción si desea leer y almacenar su correo en un buzón de correo local en su sistema. Debe proporcionar la ruta de acceso al buzón. </para
-> </listitem
-> <listitem
-> <para
-> Directorios de correo en formato Maildir: si utiliza <application
->qmail</application
-> para descargar su correo, u otro programa de tipo maildir, querrá usar esta opción. Debe escribir la ruta de acceso al buzón. </para
-> </listitem
-> <listitem
-> <para
-> Directorios de correo en formato MH: si descarga el correo utilizando <application
->mh</application
-> u otro programa tipo MH querrá utiliza esta opción. Debe escribir la ruta de acceso al buzón. </para
-> </listitem
-> <listitem
-> <para
-> Entrega local: si desea mover su correo desde el buzón local a su directorio de inicio. Si en cambio prefiere dejarlo donde está, opte por <guimenuitem
->Mbox estándar de Unix</guimenuitem
->. Debe escribir la ruta de acceso al buzón. </para
-> </listitem
-> <listitem
-> <para
-> Ninguno: elija esta opción si no planea consultar correo electrónico con esta cuenta. </para
-> </listitem
-> </itemizedlist
-> </para
-> </listitem
-> </itemizedlist
-> </para>
- <para
-> Si ha elegido un servidor de correo POP, Microsoft Exchange o IMAP, es necesario introducir la siguiente información: </para>
- <itemizedlist
-> <listitem
-> <para
->El nombre del servidor de correo. Si tiene dudas pregunte a su administrador de sistemas.</para
-> </listitem
-> <listitem
-> <para
->El nombre de usuario para su cuenta en ese sistema. </para
-> </listitem
-> <listitem
-> <para
->Si quiere utilizar una conexión segura (SSL). Es mejor activar esta opción de seguridad, si su servidor la reconoce. </para
-> </listitem
-> <listitem
-> <para
->Las opciones de autenticación implementadas en su servidor. Si no está seguro, haga clic en <guilabel
->Comprobar tipos soportados</guilabel
-> o pregunte a su administrador de sistemas. </para
-> </listitem
-> <listitem
-> <para
->Si quiere que Evolution recuerde su contraseña. </para
-> </listitem
-> </itemizedlist>
- <tip id="exchange-info"
-> <title
->Uso de Ximian Evolution con Microsoft Exchange</title
-> <para
-> Si ha adquirido Ximian Connector para Microsoft Exchange puede acceder a servidores Microsoft Exchange 2000 con el protocolo nativo. Si no dispone de Connector, o si utiliza una versión anterior de Microsoft Exchange, pregunte a su administrador de sistemas acerca de qué protocolos de acceso estándar puede usar, como POP o IMAP. </para
-> </tip
->
-
- </sect2>
- <sect2 id="more-mail-options">
- <title
->Opciones de configuración adicionales</title>
- <para
-> Hay más opciones para las preferencias de correo específicas para tipos de servidor POP, Microsoft Exchange o IMAP. Si quiere, puede configurarlas más tarde, después de haber creado su cuenta: abra el menú <menuchoice
-><guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-></menuchoice
->, y haga clic en <guibutton
->Cuentas de correo</guibutton
->. A continuación, elija la cuenta que desea modificar y haga clic en <guibutton
->Editar</guibutton
->. </para>
- <variablelist
-> <varlistentry
-> <term
->Si optó por correo POP:</term
-> <listitem
-><para
-> <itemizedlist
-> <listitem
-> <para
->Descargar el correo nuevo: para que <application
->Evolution</application
-> descargue automáticamente su correo nuevo, active esta casilla y elija la frecuencia en minutos. </para
-> </listitem
-> <listitem
-> <para
-> Almacenamiento de mensajes: active esta casilla si quiere almacenar copias de su correo en el servidor. </para
-> </listitem
-> </itemizedlist
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Si oligió Microsoft Exchange:</term
-> <listitem
-><para
-> <itemizedlist
-> <listitem
-> <para
->Descargar el correo nuevo: para que <application
->Evolution</application
-> descargue automáticamente su correo nuevo, active esta casilla y elija la frecuencia en minutos. </para
-> </listitem
-> <listitem
-> <para
-> <guilabel
->Global Address List/Active Directory</guilabel
->: ponga aquí el nombre de su servidor global de catálogo. También puede elegir el límite de respuestas del servidor y elegir el número máximo de resultados para una búsqueda de direcciones. Usando un máximo puede reducir la carga de trabajo de su sistema y de su red. </para
-> </listitem
-> <listitem
-> <para
->Nombre del buzón: escriba aquí el nombre de su buzón Exchange si es que es diferente de su nombre de usuario en Active Directory. </para
-> </listitem
-> <listitem
-> <para
-> Ruta de acceso de Outlook Web Access (OWA): en muchos casos la URL para acceso web es <quote
->http://server.company.com/exchange</quote
->. Si su sistema usa una ruta que no es <quote
->exchange</quote
-> active esta casilla e introduzca la ruta correcta. </para
-> </listitem
-> <listitem
-> <para
->Servidor de carpetas públicas: escriba el nombre del servidor de carpetas públicas de su organización, si es que lo hay.</para
-> </listitem
-> <listitem
-> <para
->Aplicar filtros a los mensajes nuevos en el buzón de entrada: active esta casilla si desea aplicar los filtros cuando visite la Bandeja de entrada de esta cuenta. </para
-> </listitem
-> </itemizedlist
-> </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Si oligió IMAP:</term
-> <listitem
-> <para
-> <itemizedlist
-> <listitem
-> <para
->Descargar el correo nuevo: para que <application
->Evolution</application
-> descargue automáticamente su correo nuevo, active esta casilla y elija la frecuencia en minutos. </para
-> </listitem
-> <listitem
-> <para
->Si desea que <application
->Evolution</application
-> descargue <emphasis
->todos</emphasis
-> los mensajes nuevos de sus carpetas IMAP, compruebe que la casilla <guilabel
->Comprobar si hay mensajes nuevos en todas las carpeta</guilabel
-> está activada.</para
-> </listitem
-> <listitem
-> <para
->Mostrar sólo las carpetas suscritas: active esta opción si la vista IMAP muestra más carpetas que las que desea leer.</para
-> </listitem
-> <listitem
-> <para
-> Sobreescribir el espacio de nombres proporcionado por el servidor: si lo desea, especifique el directorio donde su servidor almacena su correo. Los nombres más comunes son "mail" y "Mail". Para obtener más información acerca de cómo utilizar el protocolo de correo IMAP, consulte <xref linkend="usage-mail-subscriptions"/>.</para
-> </listitem
-> <listitem
-> <para
->Aplicar filtros a los mensajes nuevos en el buzón de entrada: active esta casilla si desea aplicar sus filtros tanto en esta cuenta como en el correo que se descarga al disco local.</para
-> </listitem
-> </itemizedlist
-> </para
-> </listitem
-> </varlistentry
-> </variablelist>
-
- <note id="imap-namespace"
-> <title
->¿Qué es el espacio de nombres de IMAP?</title
-> <para
-> En un servidor de correo IMAP el administrador puede proporcionarle un espacio de nombres específico, el directorio en el que el servidor almacenará su correo. Si al comprobar su correo IMAP ve que su lista de carpetas incluye archivos que no se parecen a carpetas de correo probablemente necesita cambiar su espacio de nombres de correo. Los valores más normales son <quote
->mail</quote
-> y <quote
->Mail</quote
->. Si lo prefiere puede optar por suscribir las carpetas de correo una a una. </para
-> </note>
-
- </sect2>
-
- <sect2 id="third-step">
- <title
->Enviando correo</title>
- <para
-> El paso <guilabel
->Enviando correo</guilabel
-> sirve para configurar el envío de correo electrónico. <itemizedlist
-> <listitem
-> <para
-> Tipo de servidor: <application
->Ximian Evolution</application
-> es capaz de comunicarse con varios tipos de servidor a la hora de enviar su correo. <itemizedlist
-> <listitem
-> <para
-> SMTP: envía el correo directamente desde su sistema. </para
-> </listitem
-> <listitem
-> <para
-> Microsoft Exchange: envía el correo a través de un servidor Microsoft Exchange utilizando el protocolo Microsoft Exchange 2000. Sólo está disponible si adquiere Ximian Connector para Microsoft Exchange. Debe tener la clave de una licencia válida que haya adquirido en <ulink url="http://store.ximian.com"
->store.ximian.com</ulink
->. </para
-> </listitem
-> <listitem
-> <para
-> Sendmail: utiliza el programa <application
->Sendmail</application
-> para enviar el correo desde su sistema. Sendmail es muy flexible pero no es tan fácil de configurar por lo que sólo debería elegir esta opción si sabe cómo poner en marcha un servicio Sendmail. </para
-> </listitem
-> </itemizedlist
-> </para
-> </listitem
-> </itemizedlist
-> </para>
- <para
-> Si elije SMTP , hay unas cuantas cosas que debe indicar: <itemizedlist
-> <listitem
-> <para
-> Servidor: escriba aquí el nombre o la dirección IP de su servidor para envío de correo. </para
-> </listitem
-> <listitem
-> <para
-> El servidor requiere autenticación: active esta casilla si al enviar su correo el servidor pide que le escriba una contraseña. </para
-> </listitem
-> <listitem
-> <para
-> Tipo de autenticación: a menos que haya recibido otras indicaciones, lo mejor es que deje esta opción en <guilabel
->Contraseña</guilabel
->. Si no está seguro pregunte a su administrador de sistemas, a su proveedor de Internet o deje que <application
->Ximian Evolution</application
-> lo compruebe por usted mediante la opción <guibutton
->Comprobar tipos soportados</guibutton
->. </para
-> </listitem
-> <listitem
-> <para
-> Nombre de usuario: el nombre de la cuenta con la que descarga su correo. Normalmente es la parte de su dirección de correo electrónico que esta antes de la <quote
->@</quote
->. Con servidores Exchange, es el nombre de usuario que usa al ingresar en una estación de trabajo Windows en su compañía. </para
-> </listitem
-> <listitem
-> <para
-> Recordar contraseña: Si no quiere tener que escribir su contraseña cada vez que descarga su correo pulse este botón. </para
-> </listitem
-> </itemizedlist
-> </para>
- </sect2>
-
- <sect2 id="step-three-b">
- <title
->Gestión de la cuenta</title>
- <para
-> Esta es una sección muy corta. Puede elegir dos opciones: el nombnre de la cuenta y si es la predeterminada. </para>
- <para
-> El nombre de cuenta que elija sólo se usa para mostrarlo dentro de Evolution y no se manda por correo electrónico. Le sugerimos que use como nombre el de su dirección de correo electrónico, pero puede usar cualquier otra palabra o frase, como «Trabajo», «Personal» o «Cuenta principal», a placer. </para>
- <para
-> Si activa la casilla junto a <guilabel
->Hacer que ésta sea mi cuenta predeterminada</guilabel
->, Evolution asumirá que será esta la cuenta con la enviará mensajes con más frecuencia y la usará en el selector <guilabel
->De</guilabel
-> cada vez que escriba un mensaje nuevo. Sólo puede tener una cuenta predeterminada a la vez. </para>
- <para
-> Si todavía no se le ha pedido que especifique su zona horaria, es posible que lo haga ahora. </para>
- </sect2>
-
- <sect2 id="fourth-step">
- <title
->Importar correo (opcional)</title>
- <para
-> Si <application
->Ximian Evolution</application
-> encuentra archivos de direcciones o de correo electrónico de otra aplicación, ofrecerá importarlos. Si no está seguro de qué formato usa su programa de correo pregunte a su administrador de sistemas. Si quiere, puede saltar este paso y volver con posterioridad eligiendo <menuchoice
-> <guimenu
->Archivo</guimenu
-> <guimenuitem
->Importar</guimenuitem
-> </menuchoice
->. </para>
- <para
-> <application
->Ximian Evolution</application
-> puede importar los siguientes tipos de archivos: <variablelist
-> <varlistentry
-> <term
->VCard (.vcf, gcrd):</term
-> <listitem
-> <para
-> El formato de libreta utilizado por los programas GNOME, KDE así como numerosas aplicaciones de administración de contactos. Será necesario poder exportar a formato VCard la libreta de direcciones de su otra aplicación. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->Microsoft Outlook Express 4 (.mbx):</term
-> <listitem
-> <para
-> El formato de archivos de Microsoft Outlook Express 4. Para otras versiones de Microsoft Outlook y Outlook Express, vea la solución descrita en la nota siguiente. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
->MBox (mbox):</term
-> <listitem
-> <para
-> El formato de buzón de correo utilizado por los programas Mozilla, Netscape, Ximian Evolution, Eudora y muchos otros clientes de correo electrónico. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
-<para
-> <note
-> <title
->Usuarios expertos de Microsoft Outlook y Outlook Express</title
-> <para
-> Microsoft Outlook y las versiones de Outlook Express posteriores a la versión 4, utilizan formatos propietarios que <application
->Ximian Evolution</application
-> no puede leer ni importar. En el caso de los contactos, debe enviárselos por correo a si mismo, e importarlos por este procedimiento. En el caso de los mensajes, existe una solución más sencilla: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Desde Windows, importe los archivos en el cliente Mozilla Mail (o en otro cliente de correo que utilice el formato mbox estándar, como Netscape o Eudora). </para
-> </listitem
-> <listitem
-> <para
-> Copie los archivos al sistema o a la partición que utiliza para <application
->Ximian Evolution</application
->. </para
-> </listitem
-> <listitem
-> <para
-> Utilice la herramienta de importación de <application
->Ximian Evolution</application
-> para importar esos archivos. Encontrará más información acerca de su funcionamiento en el sitio Web de <ulink url="http://support.ximian.com"
->asistencia técnica</ulink
-> de Ximian. </para
-> </listitem
-> </orderedlist
-> </para
-> </note
-> <note
-> <title
->Usuarios de Netscape</title
-> <para
-> Antes de importar mensajes desde Netscape, asegúrese de seleccionar <menuchoice
-><guimenu
->Archivo</guimenu
-><guimenuitem
->Compactar todas las carpetas</guimenuitem
-></menuchoice
->. Si no lo hace, <application
->Ximian Evolution</application
-> también importará los mensajes borrados de las carpetas de mensajes eliminados. </para
-> </note
-> </para>
-
- <tip
-> <title
->Exportar archivos desde Ximian Evolution</title
-> <para
-> Ximian Evolution usa tipos de archivos estándar para toda su información por lo que no debería tener problema para llevarse su información a otro lado, si es que lo quisiera. </para
-> <para
-> Para el correo se usa <filename
->mbox</filename
->, para el calendario <filename
->iCal</filename
->, y para la libreta de contactos vCards dentro de una base de datos <filename
->.db3</filename
->. </para
-> </tip>
- </sect2>
- </sect1>
-
- <sect1 id="importing-mail-from-clients">
- <title
->Importar correo de otros clientes de correo</title>
- <para
-> Probablemente ya tenga su correo en otro programa cliente y no querrá perder la información. La siguiente sección describe cómo importar correo desde clientes específicos de correo. </para>
- <sect2 id="mutt">
- <title
->Importar correo desde mutt</title>
- <para
-> <application
->mutt</application
-> es una aplicación en modo carácter incluida en muchas distribuciones Linux y Unix. <application
->mutt</application
-> usa los formatos de archivo estándar mbox, maildir y MH, lo que hace sencilla la importación de su correo en <application
->Evolution</application
->. En su configuración predeterminada <application
->mutt</application
-> uses el formato mbox. <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Abra <application
->Ximian Evolution</application
->. </para
-> </listitem
-> <listitem
-> <para
-> Abra <menuchoice
-> <guimenu
->Archivo</guimenu
-> <guimenuitem
->Importar</guimenuitem
-> </menuchoice
-> o o presione la combinación de teclas <keycombo action="simul"
-> <keycap
->Ctrl</keycap
-> <keycap
->I</keycap
-> </keycombo
->. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Siguiente</guibutton
->. </para
-> </listitem
-> <listitem
-> <para
-> Elija <guibutton
->Importar un único archivo</guibutton
-> </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Buscar</guibutton
-> y elija el archivo que quiere importar. En general el correo se almacena en en el archivo <filename
->~/mbox</filename
-> para el formato mbox y en <filename class="directory"
->~/Maildir</filename
-> para el Maildir. </para
-> </listitem
-> <listitem
-> <para
-> <application
->Evolution</application
-> preguntará en qué carpeta quiere importarlo: elija una. También podrá crear una carpeta nueva y volcar ahí la información. </para
-> </listitem
-> </orderedlist
-> </para>
- </sect2>
- <sect2 id="kmail">
- <title
->Importar correo desde KMail</title>
- <para
-> KMail es el cliente de correo incluido en el entorno de escritorio KDE. KMail usa el formato de archivo estándar mbox, por lo que es fácil importar su correo en <application
->Evolution</application
->. <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Abra <application
->Ximian Evolution</application
->. </para
-> </listitem
-> <listitem
-> <para
-> Abra <menuchoice
-> <guimenu
->Archivo</guimenu
-> <guimenuitem
->Importar</guimenuitem
-> </menuchoice
-> o o presione la combinación de teclas <keycombo action="simul"
-> <keycap
->Ctrl</keycap
-> <keycap
->I</keycap
-> </keycombo
->. </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Siguiente</guibutton
->. </para
-> </listitem
-> <listitem
-> <para
-> Elija <guibutton
->Importar un único archivo</guibutton
-> </para
-> </listitem
-> <listitem
-> <para
-> Haga clic en <guibutton
->Buscar</guibutton
-> y elija el archivo que quiere importar. En su configuración predeterminada KMail almacena su información en el directorio Mail de su directorio de inicio. </para
-> </listitem
-> <listitem
-> <para
-> <application
->Evolution</application
-> preguntará en qué carpeta quiere importarlo: elija una. También podrá crear una carpeta nueva y volcar ahí la información. </para
-> </listitem
-> </orderedlist
-> </para>
- </sect2>
- </sect1>
-
- <sect1 id="ui-intro">
- <title
->Qué es qué en Ximian Evolution</title>
- <para
-> Ahora que ya tiene su configuración, tras la ejecución del asistente del inicio, ya está listo para empezar a trabajar. Proporcionamos a continuación una explicación rápida de qué es lo que está ocurriendo en su ventana principal de <application
->Ximian Evolution</application
->. </para>
-
- <figure id="preface-basic-interface">
- <title
->La ventana principal de Ximian Evolution</title>
- <screenshot
-> <screeninfo
->Entrada</screeninfo
-> <mediaobject
-> <imageobject
-> <imagedata fileref="figures/mainwindow-pic" format="PNG" srccredit="Aaron Weber"/> </imageobject
-> </mediaobject
-> </screenshot>
- </figure>
-
- <para
-> <inlinemediaobject
-> <imageobject
-> <imagedata fileref="figures/full-1" format="PNG"/></imageobject
-></inlinemediaobject
-> <guilabel
->Barra del menú</guilabel
-> </para>
-
- <para
-> La <guilabel
->barra del menú</guilabel
-> da acceso a casi todas las características que pueden encontrarse en <application
->Ximian Evolution</application
->. </para>
-
- <para
-> <inlinemediaobject
-><imageobject
-><imagedata fileref="figures/full-2" format="PNG"/></imageobject
-></inlinemediaobject
-> <guilabel
->Barra de herramientas</guilabel
-> </para>
-
- <para
-> La <guilabel
->barra de herramientas</guilabel
-> da acceso fácil y rápido a las características más usadas de cada componente. </para>
-
- <para
-> <inlinemediaobject
-><imageobject
-><imagedata fileref="figures/full-3" format="PNG"/></imageobject
-></inlinemediaobject
-> <guilabel
->Barra de atajos</guilabel
-> </para>
-
- <para
-> La <guilabel
->barra de atajos</guilabel
-> permite llegar a los componentes principales con un clic. </para>
-
- <para
-> <inlinemediaobject
-><imageobject
-><imagedata fileref="figures/full-4" format="PNG"/></imageobject
-></inlinemediaobject
-> <guilabel
->Barra de estado</guilabel
-> </para>
-
- <para
-> Periódicamente <application
->Ximian Evolution</application
-> muestra discretamente un mensaje o informa del progreso de alguna tarea. Esto ocurre sobre todo a la hora de descargar o enviar el correo. Esta información se muestra en la <guilabel
->barra de estado</guilabel
->. </para>
-
- <para
-> <inlinemediaobject
-><imageobject
-><imagedata fileref="figures/full-5" format="PNG"/></imageobject
-></inlinemediaobject
-> <guilabel
->Herramienta de búsqueda</guilabel
-> </para>
-
- <para
-> La <guilabel
->herramienta de búsqueda</guilabel
-> permite hacer búsquedas en el correo con precisión y sencillez. </para>
-
-
-
- <sect2 id="usage-mainwindow-shortcutbar">
- <title
->La barra de atajos</title>
- <para
-> La labor más importante de <application
->Ximian Evolution</application
-> es facilitar el acceso y simplificar la consulta de su información. Una manera de conseguirlo es mediante la <interface
->barra de atajos</interface
->, la columna a la izquierda de la ventana principal. Los grandes botones con nombre como <guilabel
->Buzón de entrada</guilabel
-> y <guilabel
->Contactos</guilabel
-> son atajos y puede elegir varios grupos de atajos pulsando sobre los botones rectangulares de grupos. </para>
- <para
-> Échele un vistazo a la <guilabel
->barra de atajos</guilabel
->. Los botones de atajos en esa categoría son: <variablelist
-> <varlistentry
-> <term
-> <guibutton
->Resumen</guibutton
->:</term
-> <listitem
-> <para
-> Empiece aquí su jornada. El <guilabel
->Resumen</guilabel
-> de Ximian Evolution ofrece un rápido resumen de los mensajes nuevos o importantes, las citas diarias y las urgentes. Puede adaptar su apariencia y contenido y usarlo para acceder a los servicios de Ximian Evolution. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-> <guibutton
->Buzón de entrada</guibutton
->:</term
-> <listitem
-> <para
-> Haga clic en <guibutton
->buzón entrada</guibutton
-> para comenzar la lectura de su correo. Su buzón es también el lugar donde las herramientas de Ximian Evolution filtran, ordenan, organizan y buscan su correo. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guibutton
->Calendario</guibutton
->:</term
-> <listitem
-> <para
-> El Calendario puede almacenar sus listas de citas y tareas. Conectado a la red puede usarse para mantener al día la planificación de un grupo de personas. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guibutton
->Tareas</guibutton
->:</term
-> <listitem
-> <para
-> Una vista completa de la libreta de tareas de su calendario. </para
-> </listitem
-> </varlistentry
-> <varlistentry
-> <term
-><guibutton
->Contactos</guibutton
->:</term
-> <listitem
-> <para
-> La libreta de contactos contiene información de contactos con sus direcciones, teléfono y otros datos personales. Como la información del calendario, los datos de contactos pueden sincronizarse con agendas electrónicas y ser compartidos en red. </para
-> </listitem
-> </varlistentry
-> </variablelist
-> </para>
- </sect2>
- <sect2 id="usage-mainwindow-folderbar">
- <title
->Carpetas y la barra de carpetas</title>
- <para
-> La <interface
->barra de carpetas</interface
-> es la manera más amplia de ver la información que tiene almacenada en <application
->Ximian Evolution</application
->. Muestra todas sus citas, tarjetas de visita y correo electrónico en un árbol que es muy parecido a un <glossterm linkend="filetree"
->árbol de archivos</glossterm
->: es pequeño en la parte superior y las ramas crecen hacia abajo. En la mayoría de los sistemas habrá tres o cuatro carpetas en la base. La primera, por supuesto es el <guilabel
->Resumen</guilabel
->, un resumen personalizable de su información. Debajo están las <guilabel
->Carpetas locales</guilabel
->, que guardan todos los datos que <application
->Ximian Evolution</application
-> tiene almacenados en su sistema. Tras esto están sus servidores de red: servidores <glossterm linkend="ldap"
->LDAP</glossterm
-> que alojan directorios compartidos de contactos y carpetas de correo <glossterm linkend="imap"
->IMAP</glossterm
-> a las que está suscrito. Finalmente están las <guilabel
->carpetas virtuales</guilabel
->, las carpetas virtuales. </para>
-
-
- <figure id="mainwin-folderbar">
- <title
->Uso de la barra de carpetas</title>
- <screenshot
-> <screeninfo
->Carpeta de entrada y la barra de carpetas</screeninfo
-> <mediaobject
-> <imageobject
-> <imagedata fileref="figures/folder-bar" format="PNG" srccredit="Aaron Weber"/> </imageobject
-> </mediaobject
-> </screenshot>
- </figure>
-
- <para
-> Una carpeta <guilabel
->Carpetas locales</guilabel
-> típica contiene las siguientes carpetas: <itemizedlist
-> <listitem
-> <para
-> <guilabel
->Calendario</guilabel
->, para listados de citas y eventos. </para
-> </listitem
-> <listitem
-> <para
-> <guilabel
->Contactos</guilabel
->, para las tarjetas de visita. </para
-> </listitem
-> <listitem
-> <para
-> <guilabel
->Borradores</guilabel
->, para los mensajes que empezó a escribir y no acabó. </para
-> </listitem
-> <listitem
-> <para
-> <guilabel
->Entrada</guilabel
->, para el correo entrante. </para
-> </listitem
-> <listitem
-> <para
-> <guilabel
->Salida</guilabel
->, para mensajes que ha escrito pero que no ha enviado todavía. Esta carpeta estará vacía a menos que use <application
->Ximian Evolution</application
-> en modo desconectado. </para
-> </listitem
-> <listitem
-> <para
-> <guilabel
->Enviado</guilabel
->, para el correo enviado. </para
-> </listitem
-> <listitem
-> <para
-> <guilabel
-> Tareas</guilabel
->, para su lista de tareas. Algunas partes de su lista de tareas se reflejan también en el calendario, así como en el resumen. </para
-> </listitem
-> <listitem
-> <para
-> <guilabel
->Papelera</guilabel
->, una vista de tipo carpeta virtual con todos los mensajes que ha marcado para borrar pero que aún no ha <glossterm linkend="expunge"
->purgado</glossterm
->. </para
-> </listitem
-> </itemizedlist
-> </para>
- <tip id="foldertips"
-> <title
->Navegar sin la Barra de Carpetas ni la Barra de Atajos</title
-> <para
-> Para moverse por la ventana principal no son necesarias las barras de menú o de atajos. Puede usar la tecla <keycap
->Tabulador</keycap
-> para saltar en una ventana de una parte a otra. Cuando oculte la barra de carpetas hay un menú en la parte izquierda de la ventana, justo debajo de la barra de herramientas, para moverse a través del árbol de carpetas incluso si las barras de carpetas y de atajos están escondidas. </para
-> </tip>
-
- <para
-> Si tiene grandes cantidades de correo, querrá tener más carpetas, además de la carpeta de Entrada. Para crear una carpeta nueva: <orderedlist numeration="arabic"
-> <listitem
-> <para
-> Haga clic en <menuchoice
-> <guimenu
->Archivo</guimenu
-> <guisubmenu
->Nuevo</guisubmenu
-> <guimenuitem
->Carpeta</guimenuitem
-></menuchoice
-> o pulse el atajo de teclas <keycombo action="simul"
-> <keycap
->Mayús</keycap
-> <keycap
->Ctrl</keycap
-> <keycap
->E</keycap
-> </keycombo
->. </para
-> </listitem
-> <listitem
-> <para
-> Escriba el nombre de la carpeta en el campo <guilabel
->Nombre de la carpeta</guilabel
->. </para
-> </listitem
-> <listitem
-> <para
-> Elija el tipo de carpeta. Los tipos disponibles son: <itemizedlist
-> <listitem
-> <para
-> Calendario </para
-> </listitem
-> <listitem
-> <para
-> Contactos </para
-> </listitem
-> <listitem
-> <para
-> Correo </para
-> </listitem
-> <listitem
-> <para
-> Tareas </para
-> </listitem
-> </itemizedlist
-> </para
-> </listitem
-> <listitem
-> <para
-> Elija dónde crear la carpeta. </para
-> </listitem
-> </orderedlist
-> </para>
-
- <sect3 id="subfolders">
- <title
->Subcarpetas</title>
- <para
-> <application
->Ximian Evolution</application
-> permite anidar carpetas unas dentro de otras para que pueda tener un detallado sistema organizacional. </para>
-
- <note
-> <title
->Las carpetas tienen un límite</title
-> <para
-> Los calendarios deben ir en carpetas específicas para calendario, el correo en carpetas de correo, y los contactos en carpetas de contactos. </para
-> </note>
-
- <para
-> Un clic con el botón derecho sobre casi cualquier elemento de <application
->Ximian Evolution</application
-> permite abrir un menú. Si lo hace sobre una carpeta obtendrá un menú con las opciones siguientes: <itemizedlist
-> <listitem
-><para
-><guimenuitem
->Vista</guimenuitem
->: ver la carpeta. </para
-></listitem
-> <listitem
-><para
-><guimenuitem
->Abre en una ventana nueva</guimenuitem
->: ver la carpeta en una ventana diferente. </para
-></listitem
-> <listitem
-><para
-><guimenuitem
->Mover</guimenuitem
->: mover la carpeta a otro lugar. </para
-></listitem
-> <listitem
-><para
-><guimenuitem
->Copiar</guimenuitem
->: duplicar la carpeta en otro lugar. </para
-></listitem
-> <listitem
-><para
-><guimenuitem
->Borrar</guimenuitem
->: borrar la carpeta y todo su contenido. </para
-></listitem
-> <listitem
-><para
-><guimenuitem
->Renombrar</guimenuitem
->: cambiar su nombre. </para
-></listitem
-> <listitem
-><para
-><guimenuitem
->Crear carpeta nueva</guimenuitem
->: crear otra carpeta que cuelgue de este lugar. </para
-></listitem
-> <listitem
-><para
-><guimenuitem
->Añadir a la barra de atajos</guimenuitem
->: agregar la carpeta a la barra de atajos. </para
-></listitem
-> <listitem
-><para
-><guimenuitem
->Propiedades</guimenuitem
->: ver o cambiar propiedades de la carpeta. </para
-></listitem
-> </itemizedlist
-> </para>
- <para
-> También puede reorganizar las carpetas y los mensajes arrastrándolos y soltándolos donde desee. </para>
-
- <para
-> Siempre que llegue un mensaje nuevo a una carpeta de correo, su nombre se mostrará en negrita junto al número de mensajes contenidos. </para>
- </sect3>
- </sect2>
-
- <sect2 id="usage-mainwindow-menubar">
- <title
->La barra del menú</title>
- <para
-> Los contenidos de la <interface
->barra del menú</interface
-> contienen todas las acciones correspondientes a la vista actual. Si está examinando su buzón de entrada, la mayoría de los elementos del menú estarán relacionados con el correo; algunos lo estarán con otros componentes de <application
->Ximian Evolution</application
-> y algunos, especialmente los del menú <guimenu
->Archivo</guimenu
->, lo estarán con la aplicación como un todo. </para
->
- <para
-> <variablelist
-> <varlistentry
-> <term
-> <guimenu
->Archivo</guimenu
->:</term
-> <listitem
-><para
-> Este menú reúne todas las operaciones relacionadas con archivos o con la aplicación: crear o guardar elementos a disco, imprimirlos y salir del propio programa. </para
-></listitem
-> </varlistentry
-> <varlistentry
-> <term
-> <guimenu
->Editar</guimenu
->:</term
-> <listitem
-><para
-> El menú <guimenu
->Editar</guimenu
-> contiene las herramientas útiles para modificar y desplazar texto en la aplicación. </para
-></listitem
-> </varlistentry
-> <varlistentry
-> <term
-> <guimenu
->Vista</guimenu
->:</term
-> <listitem
-><para
-> Este menú permite configurar la apariencia de <application
->Ximian Evolution</application
->. Algunas de las opciones afectan la apariencia de todo <application
->Ximian Evolution</application
->, mientras otras sólo afectan a determinados tipos de información. </para
-></listitem
-> </varlistentry
-> <varlistentry
-> <term
-> <guimenu
->Acciones</guimenu
->:</term
-> <listitem
-><para
-> Acciones que pueden aplicarse a un mensaje. Normalmente, si la acción sólo tiene un objetivo -por ejemplo responder a un mensaje- le encontrará en este el menú <guimenu
->Acciones</guimenu
->. </para
-></listitem
-> </varlistentry
-> <varlistentry
-> <term
-> <guimenu
->Herramientas</guimenu
->:</term
-> <listitem
-><para
-> Incluye las herramientas de configuración y reconfiguración. En el caso del correo, se trata de elementos como el <guimenuitem
->Editor de carpetas virtuales</guimenuitem
->. Para el <interface
->Calendario</interface
-> y el <interface
->administrador de contactos</interface
->, incluye la configuración del color, de la red y la organización en pantalla. </para
-></listitem
-> </varlistentry
-> <varlistentry
-> <term
-> <guimenu
->Buscar</guimenu
->:</term
-> <listitem
-><para
-> Elija las opciones del menú para buscar mensajes o para buscar frases dentro de un mensaje. También puede ver otras búsquedas que haya hecho con anteriorad. Además del menú <guimenu
->Buscar</guimenu
-> en la barra de herramientas hay una caja donde puede introducir el texto para las búsquedas de mensajes. </para
-></listitem
-> </varlistentry
-> <varlistentry
-> <term
-> <guimenu
->Ayuda</guimenu
->:</term
-> <listitem
-><para
-> Estos elementos permiten abrir el <application
->navegador de ayuda</application
-> para leer el manual de <application
->Ximian Evolution</application
->. </para
-></listitem
-> </varlistentry
-> </variablelist
-> </para>
-
- <para
-> Cuando esté familiarizado con la <interface
->ventana principal</interface
-> podrá empezar a hacer cosas con ella. Empezaremos por el <guilabel
->Resumen</guilabel
-> que proporciona una perspectiva general de su información en <application
->Ximian Evolution</application
->. </para>
- </sect2>
- <sect2 id="basics-summary">
- <title
->Introducción al Resumen</title>
- <para
-> El Resumen de Ximian Evolution ofrece una vista rápida de la información importante: sus citas para la jornada, su correo pendiente , los titulares de los servicios de noticias elegidos, etc. Para ver el Resumen haga clic en <guibutton
->Resumen</guibutton
-> en la barra de atajos o elija la carpeta <guilabel
->Resumen</guilabel
-> en la barra de carpetas. </para>
-
- <figure>
- <title
->El Resumen de Evolution</title>
- <screenshot
-> <screeninfo
->El Resumen de Evolution le permite un rápido vistazo a su jornada</screeninfo
-> <mediaobject
-> <imageobject
-> <imagedata format="PNG" fileref="figures/summary" srccredit="Kevin Breit"/> </imageobject
-> </mediaobject
-> </screenshot>
- </figure>
-
-<para
-> <inlinemediaobject
-><imageobject
-><imagedata fileref="figures/full-1" format="PNG"/></imageobject
-></inlinemediaobject
-> <guilabel
->Meteorología</guilabel
-> </para>
-<para
-> Muestra las últimas noticias sobre el clima de cientos de ciudades de todo el mundo. </para>
-<para
-> <inlinemediaobject
-><imageobject
-><imagedata fileref="figures/full-2" format="PNG"/></imageobject
-></inlinemediaobject
-> <guilabel
->Titulares de noticias</guilabel
-> </para>
-<para
-> Muestra los titulares de las últimas noticias de sus sitios web favoritos. </para>
-<para
-> <inlinemediaobject
-><imageobject
-><imagedata fileref="figures/full-3" format="PNG"/></imageobject
-></inlinemediaobject
-> <guilabel
->Resumen de correo</guilabel
-> </para>
-<para
-> Muestra cuántos mensajes de correo tiene pendientes de leer en las carpetas elegidas. </para>
-<para
-> <inlinemediaobject
-><imageobject
-><imagedata fileref="figures/full-4" format="PNG"/></imageobject
-></inlinemediaobject
-> <guilabel
->Resumen de citas</guilabel
-> </para>
-<para
-> Muestra su calendario. Las tareas se listan debajo de las entradas del calendario. </para>
-
-
- <para
-> Para agregar servicios adicionales a su resumen o modificar los actuales elija <menuchoice
-> <guimenu
->Herramientas</guimenu
-> <guimenuitem
->Configuración</guimenuitem
-> </menuchoice
-> y haga clic en <guibutton
->Configuración del resumen</guibutton
->. </para>
-
- </sect2>
-
- <sect2 id="basics-mail">
- <title
->Introducción al correo electrónico</title>
- <para
-> En varios aspectos <application
->Ximian Evolution</application
-> es como cualquier otro programa de correo electrónico: <itemizedlist
-> <listitem
-> <para
-> Puede ordenar y organizar su correo en una amplia gama de maneras con carpetas, búsquedas y filtros. </para
-> </listitem
-> <listitem
-> <para
-> Permite enviar y recibir mensajes en HTML o en texto sencillo, y facilita el envío y recepción de múltiples archivos adjuntos. </para
-> </listitem
-> <listitem
-> <para
-> Implementa múltiples fuentes de correo, como <glossterm linkend="imap"
->IMAP</glossterm
->, <glossterm linkend="pop"
->POP3</glossterm
-> y archivos locales <filename
->mbox</filename
-> o <filename
->mh</filename
-> creados por otros programas de correo. </para
-> </listitem
-> <listitem
-> <para
-> Permite proteger su privacidad utilizando cifrado. </para
-> </listitem
-> </itemizedlist
-> </para>
- <para
-> Sin embargo, <application
->Ximian Evolution</application
-> tiene algunas diferencias importantes. Primero está diseñado para manejar ingentes cantidades de correo. Las funciones de <link linkend="usage-mail-organize-filters"
->filtrado</link
-> y de <link linkend="usage-mail-organize-search"
->búsqueda</link
-> han sido optimizadas en velocidad y eficiencia para operar con grandes cantidades de correo. También están las <link linkend="usage-mail-organize-vfolders"
->carpetas virtuales </link
->de <application
->Ximian Evolution</application
->, una característica organizacional avanzada que no está disponible en los clientes de correo más comunes. Esta característica le resultará especialmente útil si administra un montón de correo o conserva todos sus mensajes para poder referirse a ellos posteriormente. </para>
- <para
-> Este es el aspecto que tiene el editor de correo: <figure id="usage-mail-intro-fig"
-> <title
->Correo en Ximian Evolution</title
-> <screenshot
-> <screeninfo
->Bandeja de entrada</screeninfo
-> <mediaobject
-><imageobject
-><imagedata fileref="figures/mail-inbox" format="PNG" srccredit="Aaron Weber"/> </imageobject
-></mediaobject
-> </screenshot
-> </figure
-> </para>
- <para
-> <inlinemediaobject
-><imageobject
-><imagedata fileref="figures/full-1" format="PNG"/></imageobject
-></inlinemediaobject
-> <guilabel
->Visor de correo</guilabel
-> </para>
-
- <para
-> Aquí es donde se presentan los mensajes para su lectura. </para>
-
- <para
-> <inlinemediaobject
-><imageobject
-><imagedata fileref="figures/full-2" format="PNG"/></imageobject
-></inlinemediaobject
-> <guilabel
->Liste de mensajes</guilabel
-> </para>
-
- <para
-> La <guilabel
->lista de mensajes</guilabel
-> muestra todos los mensajes que tiene. Esto incluye los que mensajes ya leídos, sin leer o marcados para su borrado. </para>
-
- <para
-> Si le parece que el <interface
->panel de previsualización</interface
-> es demasiado pequeño, puede cambiar su tamaño, aumentar la ventana completamente o hacer doble clic sobre el mensaje en la <interface
->lista de mensajes</interface
-> para abrirlo en una ventana aislada. Para cambiar los tamaños de un panel sólo hay que hacer clic en la línea divisoria y arrastrarla arriba y abajo hasta la posición deseada. </para>
-<para
-> Como con las carpetas, puede hacer clic con el botón derecho sobre los mensajes de la lista y obtener un menú con todas las acciones posibles: mover, borrar o recuperarlo, crear carpetas virtuales y filtros basados en ellos. </para>
- <para
-> Muchas de las acciones más frecuentes relacionadas con los mensajes aparecen en el menú <guimenu
->Acciones</guimenu
-> de la barra del menú. Los más frecuentes como <guimenuitem
->Responder</guimenuitem
-> o <guimenuitem
->Reenviar</guimenuitem
-> también aparecen como botones en la barra de herramientas. La mayoría de ellos también aparecen también en el menú contextual (con el botón derecho) y como atajos de teclado, a los que se acostumbrará pronto por su rapidez. Utilice el método que le resulte más cómodo: la idea es que el software debe adaptarse al usuario, y no a la inversa. </para>
-
- <para
-> Para saber más sobre las posibilidades de uso del correo electrónico de Ximian Evolution, consulte <xref linkend="usage-mail"/>. </para>
- </sect2>
- <sect2 id="basics-calendar">
- <title
->Introducción al Calendario</title>
- <para
-> Para abrir el calendario haga clic en <guibutton
->Calendario</guibutton
-> en la <interface
->barra de atajos</interface
->. En la configuración predeterminada, el calendario muestra la planificación del día sobre un fondo de renglones. En la parte superior derecha, un calendario mensual permite cambiar de día. En la parte inferior, una libreta de <guilabel
->Tareas</guilabel
-> le permite administrar una lista de tareas separadas de las citas del calendario. La vista del día en el calendario tiene el aspecto similar al siguiente: <figure id="usage-calendar-fig"
-> <title
->Vista de contactos de Ximian Evolution</title
-> <screenshot
-> <screeninfo
->Ventana del administrador de contactos de Ximian Evolution</screeninfo
-> <mediaobject
-><imageobject
-><imagedata fileref="figures/calendar" format="PNG" srccredit="Aaron Weber"/> </imageobject
-></mediaobject
-> </screenshot
-> </figure
-> </para>
-
- <para
-> <inlinemediaobject
-><imageobject
-><imagedata fileref="figures/full-1" format="PNG"/></imageobject
-></inlinemediaobject
-> <guilabel
->Lista de citas</guilabel
-> </para>
-
- <para
-> La <guilabel
->lista de citas</guilabel
-> es la encargada de mostrar todas las citas que tiene planificadas, tanto si son de un día completo como si son citas puntuales de menos de media hora. </para>
-
- <para
-> <inlinemediaobject
-><imageobject
-><imagedata fileref="figures/full-2" format="PNG"/></imageobject
-></inlinemediaobject
-> <guilabel
->Lista de tareas</guilabel
-> </para>
-
- <para
-> La <guilabel
->lista de tareas</guilabel
-> complementa a la <guilabel
->lista de citas </guilabel
-> ya que mantiene las tareas que no tienen una fecha asociada. Las tareas pueden tener asociadas notas complejas y puede anotar el estado del avance de cada una usando un porcentaje. </para>
-
- <para
-> <inlinemediaobject
-><imageobject
-><imagedata fileref="figures/full-3" format="PNG"/></imageobject
-></inlinemediaobject
-> <guilabel
->Mes</guilabel
-> </para>
-
- <para
-> En el panel del mes se muestra una pequeña vista mensual de su calendario. Para ver más meses arrastre hacia la izquierda la columna que lo delimita. Si en este panel seleccionaun rango de días con el ratón, podrá ver a su derecha la lista de eventos que tiene planificados. </para>
-
- <para
-> Para saber más acerca del calendario lea <xref linkend="usage-calendar"/>. </para>
-
- </sect2>
- <sect2 id="basics-contacts">
- <title
->Introducción al administrador de contactos</title>
- <para
-> La libreta de direcciones de <application
->Ximian Evolution</application
-> puede manejar todas las funciones de libreta de direcciones, listín telefónico o tarjetero. Por supuesto es mucho más fácil actualizar <application
->Ximian Evolution</application
-> que hacerlo en un libro de papel de verdad. <application
->Ximian Evolution</application
-> también permite la fácil sincronización con dispositivos de mano y funciona con directorios <glossterm linkend="ldap"
->LDAP</glossterm
-> conectados a la red. </para>
- <para
-> Otra ventaja de la libreta de direcciones de <application
->Ximian Evolution</application
-> es su integración con el resto de la aplicación. Por ejemplo puede crear una tarjeta de visita a partir de un mensaje de correo sólo pinchando con el botón derecho sobre la dirección del remitente del mensaje. </para>
- <para
-> Para abrir su libreta de direcciones, haga clic en <guibutton
->Contactos</guibutton
-> en la barra de atajos o elija una de las carpetas de contactos en la barra de carpetas. En <xref linkend="usage-contact-fig"/> podrá ver una reproducción de la libreta de direcciones con todas sus posibilidades de organización. En su configuración predeterminada, la libreta muestra todas sus tarjetas en orden alfabético en la vista de <glossterm linkend="minicard"
->minitarjetas</glossterm
->. Puede elegir otras vistas desde el menú <guimenu
->Vistas</guimenu
-> y ajustar el ancho de las columnas si hace clic y arrastra las columnas divisorias grises. </para>
- <para
-> La libreta de direcciones se parece a esto: <figure id="usage-contact-fig"
-> <title
->Interfaz de contactos de Ximian Evolution</title
-> <screenshot
-> <screeninfo
->Ventana de lista de contactos de Ximian Evolution</screeninfo
-> <mediaobject
-><imageobject
-><imagedata fileref="figures/contact" format="PNG" srccredit="Kevin Breit"/> </imageobject
-></mediaobject
-> </screenshot
-> </figure
-> </para>
- <para
-> <inlinemediaobject
-><imageobject
-><imagedata fileref="figures/full-1" format="PNG"/></imageobject
-></inlinemediaobject
-> <guilabel
->Lista de contactos</guilabel
-> </para>
-
- <para
-> La <guilabel
->Lista de contactos</guilabel
-> muestra todas las tarjetas de visita que tiene. También le permite buscar entre ellas de la misma manera que con las carpetas de correo, usando la barra de búsqueda que está justo encima. </para>
-
- <para
-> <inlinemediaobject
-><imageobject
-><imagedata fileref="figures/full-2" format="PNG"/></imageobject
-></inlinemediaobject
-> <guilabel
->Atajos alfanuméricos</guilabel
-> </para>
- <para
-> Haga clic en uno de los botones a lo largo del lado derecho de la ventana para ver los contactos que empiezan por la letra o el número elegido. </para>
-
-
- <para
-> For detailed instructions on how to use the address book, read <xref linkend="usage-contact"/>. </para>
- </sect2>
- </sect1>
-</chapter>
diff --git a/help/es/usage-print.xml b/help/es/usage-print.xml
deleted file mode 100644
index c929d23a58..0000000000
--- a/help/es/usage-print.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-<chapter id="usage-print">
- <title
->Imprimir con Evolution</title>
- <para
-> Si ya sabe imprimir con otra aplicación <application
->Gnome</application
->, también será capaz de hacerlo con <application
->Evolution</application
-> sin mayor problema. </para>
- <para
-> Si va a imprimir un mensaje, una página del calendario o una selección de tarjetas de visita puede elegir entre hacerlo directamente a la impresora o guardar el resultado de la impresión en un archivo <glossterm linkend="postscript"
->PostScript</glossterm
->. También puede utilizar la función de vista previa de impresión, para examinar el resultado antes de imprimir. </para>
-
- <sect1 id="printpreview">
- <title
->Vista previa de impresión</title>
- <para
-> <guibutton
->Previsualizar la impresión</guibutton
-> aparece tanto como un botón en el cuadro de diálogo de impresión con un elemento del menú <guimenu
->Archivo</guimenu
->. La función es la misma en ambos casos: muestra una imagen del resultado de impresión del mensaje, hoja de calendario, cita o tarjeta de visita que tiene en pantalla. </para>
- <para
-> La ventana le permite seleccionar las páginas que desea examinar y con qué detalle. Puede alejar o acercar la vista, ajustar la página a la ventana (con <guibutton
->Encajar</guibutton
->) o ajustar el ancho de la página con el de la ventana (con <guibutton
->Enc. ancho</guibutton
->). Ninguno de estos botones modifican la manera en que la página será impresa pero le permiten verla mejor. Si le satisface el resultado, haga clic en <guibutton
->Imprimir</guibutton
-> para imprimir el documento. Para modificarlo, sólo tiene que cerrar la ventana <guilabel
->Previsualizar la impresión</guilabel
-> y realizar los cambios que desee en su documento de correo, calendario o libreta de direcciones. </para>
-
-
- <!-- ==============Figure=================================== -->
-
- <figure id="print-preview">
- <title
->Vista previa de impresión</title>
- <screenshot
-> <screeninfo
->Vista previa de impresión</screeninfo
-> <mediaobject
-><imageobject
-><imagedata fileref="figures/print-preview" format="PNG" srccredit="Aaron Weber"/> </imageobject
-></mediaobject
-> </screenshot>
- </figure>
-<!-- ==============End of Figure============================== -->
-
- </sect1>
-
- <sect1 id="print-destination">
- <title
->¿Archivo o impresora?</title>
- <para
-> La ventana de elección de impresora mostrado en <xref linkend="print-dest"/> permite elegir el formato de impresión: <guilabel
->PostScript genérico</guilabel
->, archivo PDF. El formato PostScript genérico permite enviar el contenido de la impresión a un archivo o a una impresora real. Si eligió una impresora, especifique el orden de impresión en su sistema operativo (probablemente <command
->lpr</command
->). Si quiere imprimir en un archivo, indique su nombre. Y por supuesto debe decidir el número de copias y cómo compaginarlas. <note id="windows-ps"
-> <title
->¿Imprimir a PostScript?</title
-> <para
-> PostScript es el formato de archivo utilizado por la mayoría de las impresoras láser y es la forma más sencilla de imprimir en un archivo en el mundo UNIX. Sin embargo muchos sistemas con Microsoft Windows no reconocen archivos PostScript. Si desea compartir sus archivos con usuarios Windows deberá imprimir en ficheros PDF. </para
-> </note
-> </para>
-
- <!-- ==============Figure=================================== -->
-
- <figure id="print-dest">
- <title
->Selección de impresora</title>
- <screenshot
-> <screeninfo
->Selección de impresora</screeninfo
-> <mediaobject
-><imageobject
-><imagedata fileref="figures/print-dest" format="PNG" srccredit="Aaron Weber"/> </imageobject
-></mediaobject
-> </screenshot>
- </figure>
-<!-- ==============End of Figure============================== -->
-
- <para
-> Si desea imprimir un mensaje mayor de una página, puede elegir qué páginas quiere imprimir. Si se trata de una hoja del calendario puede decidir qué rango de fechas quiere imprimir. Y si va a imprimir tarjetas de visita, puede decidir imprimir sólo las elegidas o todas a la vez. </para>
- <para
-> Cuando esté preparado para imprimir, haga clic en <guibutton
->Imprimir</guibutton
->, <guibutton
->Vista preliminar</guibutton
-> para darle un vistazo (u otro vistazo) a la pre-impresión o a <guibutton
->Cancelar</guibutton
-> para anular todo el trato. </para>
- </sect1>
-</chapter>
-
-
-
-
-
-
-
-
diff --git a/help/es/usage-sync.xml b/help/es/usage-sync.xml
deleted file mode 100644
index d06210770f..0000000000
--- a/help/es/usage-sync.xml
+++ /dev/null
@@ -1,31 +0,0 @@
- <chapter id="usage-sync">
- <title
->Sincronización de Evolution con dispositivos de mano</title>
- <para
-> Este capítulo es muy breve. Describe cómo sincronizar los datos almacenados en su dispositivo Palm-OS y <application
->Ximian Evolution</application
->, respectivamente. Si necesita información acerca de cómo configurar la sincronización de un dispositivo de mano, consulte <xref linkend="config-sync"/>. </para>
-
- <sect1 id="hotsync">
- <title
->Uso de la función HotSync</title>
- <para
-> Coloque el dispositivo de mano en su base, y presione el botón HotSync. </para>
-
-<tip id="sync-tip"
-> <title
->Contraseñas de Palm OS v. 4.0</title
-> <para
-> Si utiliza un dispositivo de mano Palm OS v. 4.0 y activó la protección por contraseña, es posible que se produzcan problemas durante la sincronización. En este caso, intente desactivar la protección por contraseña de su dispositivo de mano, realice la sincronización con su equipo de sobremesa, y vuelva a habilitar la protección del dispositivo. </para
-> </tip>
- <para
-> Si siguió las instrucciones de configuración adecuadamente, los datos de su dispositivo Palm-OS se podrán sincronizar con <application
->Ximian Evolution</application
->. </para>
-
- <para
-> Eso es todo. </para>
-
- </sect1>
- </chapter>
-
diff --git a/help/no/.cvsignore b/help/no/.cvsignore
deleted file mode 100644
index 11bc8ea04b..0000000000
--- a/help/no/.cvsignore
+++ /dev/null
@@ -1,9 +0,0 @@
-Makefile
-Makefile.in
-*.log
-*.ps
-*.dvi
-*.tex
-evolution
-index.html
-omf_timestamp \ No newline at end of file
diff --git a/help/no/ChangeLog b/help/no/ChangeLog
deleted file mode 100644
index e69de29bb2..0000000000
--- a/help/no/ChangeLog
+++ /dev/null
diff --git a/help/no/ChangeLog.pre-1-4 b/help/no/ChangeLog.pre-1-4
deleted file mode 100644
index 31603e8eab..0000000000
--- a/help/no/ChangeLog.pre-1-4
+++ /dev/null
@@ -1,13 +0,0 @@
-2002-06-27 Aaron Weber <aaron@ximian.com>
-
- * evolution-no.omf: apply patch from otaylor
-
-2001-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * topic.dat: s/usage-exec-summary.html/usage-summary.html/.
-
-2001-08-21 Kjartan Maraas <kmaraas@gnome.org>
-
- * ChangeLog: Added this here.
- * topic.dat:: Norwegian version.
- \ No newline at end of file
diff --git a/help/no/Makefile.am b/help/no/Makefile.am
deleted file mode 100644
index 97f50baeb7..0000000000
--- a/help/no/Makefile.am
+++ /dev/null
@@ -1,51 +0,0 @@
-figs = \
- figures/calendar.png \
- figures/config-cal.png \
- figures/config-mail.png \
- figures/contact-editor.png \
- figures/contact.png \
- figures/filter-assist-fig.png \
- figures/filter-new-fig.png \
- figures/full-1.png \
- figures/full-2.png \
- figures/full-3.png \
- figures/full-4.png \
- figures/full-5.png \
- figures/full-6.png \
- figures/full-7.png \
- figures/mail-composer.png \
- figures/mail-druid-pic.png \
- figures/mail-inbox.png \
- figures/mainwindow-pic.png \
- figures/newmsg.png \
- figures/print-dest.png \
- figures/print-preview.png \
- figures/replymsg.png \
- figures/vfolder-createrule-fig.png
-docname = evolution
-lang = no
-omffile = evolution-no.omf
-sgml_ents = \
- apx-authors.sgml \
- apx-bugs.sgml \
- apx-gloss.sgml \
- config-encryption.sgml \
- config-prefs.sgml \
- config-sync.sgml \
- evolution-faq.sgml \
- menuref.sgml \
- preface.sgml \
- usage-calendar.sgml \
- usage-contact.sgml \
- usage-encryption.sgml \
- usage-exec-summary.sgml \
- usage-mail-org.sgml \
- usage-mail.sgml \
- usage-mainwindow.sgml \
- usage-print.sgml \
- usage-sync.sgml
-
-include $(top_srcdir)/help/sgmldocs.make
-dist-hook: app-dist-hook
-
-EXTRA_DIST = ChangeLog.pre-1-4 \ No newline at end of file
diff --git a/help/no/apx-authors.sgml b/help/no/apx-authors.sgml
deleted file mode 100644
index a48a8c30ff..0000000000
--- a/help/no/apx-authors.sgml
+++ /dev/null
@@ -1,98 +0,0 @@
- <appendix id="authors">
- <title>Forfattere</title>
- <para>
- <application>Evolution</application> er skrevet av:
-<simplelist>
- <member>Seth Alves: <email>alves@ximian.com</email></member>
- <member>Anders Carlsson: <email>andersca@gnu.org</email></member>
- <member>Damon Chaplin: <email>damon@ximian.com</email></member>
- <member>Clifford R. Conover: <email>rusty@zootweb.com</email></member>
- <member>Anna Dirks: <email>anna@ximian.com</email></member>
- <member>Miguel De Icaza: <email>miguel@ximian.com</email></member>
- <member>Radek Doulik: <email>rodo@ximian.com</email></member>
- <member>Arturo Espinoza: <email>arturo@nucleu.unam.mx</email></member>
- <member>Larry Ewing: <email>lewing@ximian.com</email></member>
- <member>Nat Friedman: <email>nat@ximian.com</email></member>
- <member>Bertrand Guiheneuf: <email>bertrand@ximian.com</email></member>
- <member>Iain Holmes: <email>iain@ximian.com</email></member>
- <member>Tuomas Kuosmanen: <email>tigert@gimp.org</email></member>
- <member>Christopher J. Lahey: <email>clahey@ximian.com</email></member>
- <member>Jason Leach: <email>jleach@usa.net</email></member>
- <member>Matthew Loper: <email>matt@loper.org</email></member>
- <member>Federico Mena: <email>federico@ximian.com</email></member>
- <member>Rodrigo Moya: <email>rodrigo@ximian.com</email></member>
- <member>Eskil Heyn Olsen: <email>deity@eski.dk</email></member>
- <member>Jesse Pavel: <email>jpavel@ximian.com</email></member>
- <member>Ettore Perazzoli: <email>ettore@ximian.com</email></member>
- <member>Jeffrey Stedfast: <email>jeff@ximian.com</email></member>
- <member>Jakub Steiner: <email>jimmac@ximian.com</email></member>
- <member>Russell Steinthal: <email>rms39@columbia.edu</email></member>
- <member>Peter Teichman: <email>peter@ximian.com</email></member>
- <member>Chris Toshok: <email>toshok@ximian.com</email></member>
- <member>Peter Williams: <email>peter@newton.cx</email></member>
- <member>Dan Winship: <email>danw@ximian.com</email></member>
- <member>Michael Zucchi: <email>notzed@ximian.com</email></member>
-</simplelist>
-og andre dedikerte GNOME-programmerere.
-</para>
- <para>
- <application>Evolution</application>-koden står i stor gjeld
- til <application>GNOME-pim</application> og
- <application>GNOME-Calendar</application> applikasjonene, og til
- <application>KHTMLW</application>. <application>Evolution</application>-
- utviklerene er takknemlige for innsatsen og bidragene fra alle
- som har arbeidet på disse prosjektene.
- </para>
-
-
- <para>
- Ximian ønsker å takke Miles Lane for sin innsats med
- kvalitetssikring av produktet og staben på El Pelon Taqueria,
- på Peterborough st. i Boston for substans.
- </para>
-
-
- <para>
- For mer informasjon vennligst besøk
- <application>Evolution</application> <ulink
- url="http://www.ximian.com/products/ximian_evolution/"
- type="http">nettsiden</ulink>. Vær vennlig og send alle
- kommentarer, forslag og feilrapporter til <ulink
- url="http://bugzilla.gnome.org" type="http">GNOME feilrapporterings-
- databasen</ulink>. Instruksjoner for innsending av feilrapporter kan
- finnes på nettet på <ulink
- url="http://bugzilla.gnome.org/bugwritinghelp.html" type="http">
- http://bugzilla.gnome.org/bugwritinghelp.html</ulink>. Du kan også bruke
- kommandoen <command>bug-buddy</command> for å sende inn feilrapporter.
- </para>
-
- <para>
- Denne brukerhåndboken er skrevet av Aaron Weber
- (<email>aaron@ximian.com</email>), Kevin Breit
- (<email>battery841@mypad.com</email>) Duncan Mak
- (<email>duncan@ximian.com</email>) og Ettore Perazzoli
- (<email>ettore@ximian.com</email>) med hjelp fra
- applikasjonsprogrammererene og GNOME Documentation Project.
- Vennligst legg inn alle kommentarer og forslag angående brukerhåndboken
- som feilrapporter i Ximian's feilhåndteringssystem. Hvis du har
- hjulpet dette prosjektet, men ikke ser ditt navn nevnt her, kan
- du kontakte Aaron Weber (<email>aaron@ximian.com</email>), så vil
- han legge deg til i listen.
- </para>
- <para>
- Oversettelser:
- <itemizedlist>
- <listitem><para>
- Daniel Persson for .se
- </para></listitem>
-
- <listitem><para>
- Hector Garcia Alvarez for .es
- </para></listitem>
-
- <listitem><para>
- Kjartan Maraas for .no
- </para></listitem>
- </itemizedlist>
- </para>
- </appendix>
diff --git a/help/no/apx-bugs.sgml b/help/no/apx-bugs.sgml
deleted file mode 100644
index aae4fde936..0000000000
--- a/help/no/apx-bugs.sgml
+++ /dev/null
@@ -1,38 +0,0 @@
- <appendix id="bugs">
-
- <title>Kjente feil og begrensninger</title>
- <abstract>
- <para>
- Feilhåndtering for Ximian Evolution gjøres i <ulink
- url="http://bugzilla.ximian.com">Ximian's feilhåndteringssystem
- </ulink> Du kan bruke dette, eller GNOME's <application>
- feilrapporteringsverktøy</application> (kjent som
- <command>bug-buddy</command> på kommandolinjen) hvis du finner feil
- eller ønsker å be om nye funksjoner.
- </para>
- <para>
- Hvis du trenger mer hjelp med Ximian Evolution kan du besøke
- Ximian's nettsted for brukerstøtte på <ulink
- url="http://support.ximian.com">ximian.com/support</ulink>.
- </para>
- </abstract>
-
- <para>
- Et antall ofte etterspurte funksjoner vil ikke bli inkludert i
- Ximian Evolution 1.0, men vi planlegger å inkludere dem i versjon
- 1.1. Noen av dem er:
- <simplelist>
- <member>Direkte import av kontakter fra Microsoft Outlook</member>
- <member>Synkronisering av epost med håndholdte enheter</member>
- <member>Støtte for S/MIME</member>
- <member>Lesing av eksterne e-postmapper uten å importere dem</member>
- <member>Import av WINMAIL.DAT vedlegg</member>
- <member>Avspilling av en lyd for å indikere innkommende meldinger</member>
- </simplelist>
- </para>
- <para>
- En mer komplett liste over forespørsler etter funksjoner og andre
- saker er tilgjengelig på nett i Ximian's feilhåndteringssystem.
- </para>
- </appendix>
-
diff --git a/help/no/apx-gloss.sgml b/help/no/apx-gloss.sgml
deleted file mode 100644
index e81f906ce3..0000000000
--- a/help/no/apx-gloss.sgml
+++ /dev/null
@@ -1,419 +0,0 @@
-<glossary id="apx-gloss">
-
- <title>Ordliste</title>
-
- <glossentry id="attachment">
- <glossterm>Vedlegg:</glossterm>
- <glossdef>
- <para>
- Enhver fil som sendes med en melding. Vedlegg kan ligge i selve
- meldingen eller ligge som et tillegg.
- </para>
- </glossdef>
- </glossentry>
-
-<glossentry id="automatic-indexing">
- <glossterm>Automatsk indeksering:</glossterm>
- <glossdef>
- <para>
- Forhåndssorteringsprosedyre som lar
- <application>Evolution</application> referere til data raskt.
- Det muliggjøre raskere søk og reduserer minnebruk for
- datavisninger.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="bcc">
- <glossterm>Bcc (Blind Carbon Copy):</glossterm>
- <glossdef>
- <para>
- En måte å adressere en melding. Bcc brukes for å sende en melding
- til en gruppe mennesker, men samtidig skjule deres navn og e-postadresser
- fra hverandre.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="cc">
- <glossterm>Cc (Carbon Copy):</glossterm>
- <glossdef>
- <para>
- Karbonkopier brukes for å sende en tredjepart en kopi av en melding
- slik at de kan holdes oppdatert i konversasjonen uten å være på
- mottakerlisten.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="conduit">
- <glossterm>Conduit:</glossterm>
- <glossdef>
- <para>
- En synkroniseringskomponent er en liten applikasjon som kontrollerer
- overføring av data mellom en håndholdt enhet og en annen datamaskin.
- </para>
- </glossdef>
- </glossentry>
-
-
- <glossentry id="druid">
- <glossterm>Druide:</glossterm>
- <glossdef>
- <para>
- Et verktøy som leder en bruker gjennom en serie steg, vanligvis for
- å konfigurere eller sette opp et program. Samme som "Assisten" og
- "Veiviser".
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="evolution">
- <glossterm>Evolution:</glossterm>
- <glossdef>
- <para>
- <application>Evolution</application> er <acronym> GNOME's
- </acronym> gruppevareapplikasjon.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="execute">
- <glossterm>Kjør:</glossterm>
- <glossdef>
- <para>
- Det å kjøre et program. Enhver fil som kan kjøres kalles
- kjørbar fil. <application>Evolution</application> kan laste ned
- kjørbare vedlegg, men før disse kan kjøres, må filene merkes som
- kjørbare via skallet eller en filhåndterer. Dette er gjort som
- et sikkerhetstiltak for å hindre automatisk eller tilfeldig kjøring
- av ondsinnede programmer. For mer informasjon om kjørbare filer og
- filrettigheter, se dokumentasjonen for din filhåndterer eller skall.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="expunge">
- <glossterm>Tøm:</glossterm>
- <glossdef>
- <para>
- Når meldinger merkes for sletting vil de bli værende til de tømmes.
- Når en melding tømmes vil den bli slettet permanent hvis den var merket
- for sletting.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="filetree">
- <glossterm>Filtre:</glossterm>
- <glossdef>
- <para>
- En måte å beskrive en gruppe med filer på en datamaskin. Som et
- resultat av datamaskinens litt fordreide syn på virkeligheten
- blir toppen av treet kalt rotkatalogen, og vises med
- <filename>/</filename>.
- Resten av grenene sprer seg nedover fra roten. Ikke forveksle
- rotkatalogen med kontoen til root (superbruker),
- eller hjemmekatalogen til root,
- <filename>/root</filename>.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="filter">
- <glossterm>Filter:</glossterm>
- <glossdef>
- <para>
- I <application>Evolution</application>, er et filter en metode
- for automatisk sortering av meldinger. Du kan opprette filtre for å utføre
- en eller flere handlinger på en melding som møter ethvert (eller alle)
- av et bredt utvalg av kriterier.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="forward">
- <glossterm>Videresend:</glossterm>
- <glossdef>
- <para>
- Hvis du mottar en melding som var ment for noen andre kan du bruke
- videresending for å sende den til riktig person.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="groupware">
- <glossterm>Gruppevare:</glossterm>
- <glossdef>
- <para>
- Gruppevare er et uttrykk som beskriver en applikasjon som hjelper grupper
- av mennesker å arbeide sammen. En gruppevareapplikasjon vil typisk
- ha flere produktivitetsfunksjoner innebygget i ett program,
- inkludert e-post, kalender, og adressebok.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="html">
- <glossterm>HTML:</glossterm>
- <glossdef>
- <para>
- Hyper-text Markup Language (<acronym>HTML</acronym>) er et språk
- for å beskrive utseende i elektroniske dokumenter som nettsider,
- hjelpfiler, og e-postmeldinger. HTML kan brukes til å sette inn
- bilder og endre utseende på tekst i e-post og diskusjonsgruppeinnlegg.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="hot-key">
- <glossterm>Hurtigtast:</glossterm>
- <glossdef>
- <para>
- Hurtigtaster er tastaturkombinasjoner som brukes for å utføre handlinger
- på datamaskinen uten å bruke musen for å gjøre samme handling.
- Hurtigtaster kan gjøre bruken av datamaskinen raskere.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="ical">
- <glossterm>iCal:</glossterm>
- <glossdef>
- <para>
- <application>iCal</application> er programmet som
- <application>Evolution</application> bruker for å håndtere kalenderen
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="imap">
- <glossterm>IMAP:</glossterm>
- <glossdef>
- <para>
- Avhengig av hvem du spør, vil du høre at IMAP står for Internet
- Mail Access Protocol, eller Interim Mail Access Protocol. Uansett hva det
- står for gir det tilgang til e-post, vanligvis (men ikke
- alltid) lagret eksternt på en tjener i stedet for på en lokal
- harddisk. I motsetning til <glossterm>POP:</glossterm>.
- Dette vil ikke komme på prøven.
- </para>
- </glossdef>
- </glossentry>
-
-
- <glossentry id="inline">
- <glossterm>Innfelt:</glossterm>
- <glossdef>
- <para>
- Vises som en del av en melding eller annet dokument, i stedet for som
- en separat fil. I motsetning til <glossterm
- linkend="attachment">Vedlegg:</glossterm>.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="ldap">
- <glossterm>LDAP:</glossterm>
- <glossdef>
- <para>
- LDAP, Lightweight Directory Access Protocol, lar en klient
- søke gjennom en stor database med adresser, telefonnummer, og
- mennesker, som er lagret på en tjener.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="mail-client">
- <glossterm>E-postklient:</glossterm>
- <glossdef>
- <para>
- En e-postklient er applikasjonen som en person bruker for å lese og
- sende e-post. I motsetning til forskjellige typer e-posttjenere,
- som håndterer autentisering av brukere og dirigerer meldinger fra
- avsender til mottaker.
- </para>
- </glossdef>
- </glossentry>
-
-
- <glossentry id="minicard">
- <glossterm>Minikort:</glossterm>
- <glossdef>
- <para>
- Et format for visning av kontaktdata. Likt i utseende til et lite
- visittkort.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="nautilus">
- <glossterm>Nautilus:</glossterm>
- <glossdef>
- <para>
- <application>Nautilus</application> er neste generasjon
- filhåndterer for <acronym>GNOME</acronym> skrevet av tidligere Eazel
- med flere.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="pop">
- <glossterm>POP:</glossterm>
- <glossdef>
- <para>
- POP, Post Office Protocol, er en mekanisme for transport
- av e-post. I motsetning til IMAP, brukes denne kun for å hente meldinger
- fra en tjener og lagre den lokalt på din egen harddisk.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="protocol">
- <glossterm>Protokoll:</glossterm>
- <glossdef>
- <para>
- En akseptert kommunikasjonsmetode, spesielt for sending av
- bestemte typer informasjon mellom datamaskinsystemer.
- Eksempler inkluderer POP (Post Office Protocol), for e-post, og HTTP
- (HypterText Transfer Protocol), for nettsider.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="public-key-encryption">
- <glossterm>Public Key Encryption:</glossterm>
- <glossdef>
- <para>
- En sterk krypteringsmetode som bruker et sett med to "nøkler", en
- offentlig og en som holdes privat. Data som krypteres med den
- offentlige nøkkelen kan kun dekrypteres med den private nøkkelen.
- Dess lengre nøklene er jo vanskeligere er det å bryte krypteringen.
- </para>
- </glossdef>
- </glossentry>
-
-
-
- <glossentry id="regular-expression">
- <glossterm>Vanlig uttrykk:</glossterm>
- <glossdef>
- <para>
- Et regulært uttrykk, eller "regex", er en måte å beskrive en
- tekststreng ved bruk av metategn eller jokertegn. For eksempel,
- uttrykket <userinput>fly.*so[a|u]p</userinput> betyr
- "enhver frase som begynner med 'fly' og slutter med 'soup' eller
- 'soap'". Hvis du søker etter dette uttrykket, vil du finne både
- "fly in my soup" og "fly in my soap." Det er ikke tid til å gå
- i dybden her, men hvis du ønsker det kan du se på dokumentasjonen
- for <command>grep</command>-kommandoen.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="script">
- <glossterm>Skript:</glossterm>
- <glossdef>
- <para>
- Et program skrevet i et fortolket (ikke kompilert)
- språk. Brukes ofte som et synonym for "makro," for å beskrive en rekke
- med forhåndsinspilte kommandoer eller handlinger i en applikasjon.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="sendmail">
- <glossterm>Sendmail:</glossterm>
- <glossdef>
- <para>
- Som navnet hentyder, er <application>sendmail</application> et
- program som sender e-post. <application>Evolution</application>
- kan bruke dette istedet for <glossterm>SMTP:</glossterm>; noen
- foretrekker dette fordi det gir større grad av fleksibilitet, men
- det er vanskeligere å konfigurere.
- </para>
- </glossdef>
- </glossentry>
-
-
- <glossentry id="shortcut-bar">
- <glossterm>Snarveilinje:</glossterm>
- <glossdef>
- <para>
- En del av <application>Evolution</application> som gir brukere
- rask tilgang til de mest brukte delene av applikasjonen.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="signature">
- <glossterm>Signatur:</glossterm>
- <glossdef>
- <para>
- I e-post-terminologien er en signatur et stykke tekst plassert ved
- slutten av alle meldinger som sendes, på samme måte som en håndskrevet
- signatur i et brev. En signatur kan være alt fra et favorittsitat
- til en lenke til en nettside; av hensyn til andre er normen at den
- ikke skal være lengre enn fire linjer.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="SMTP">
- <glossterm>SMTP:</glossterm>
- <glossdef>
- <para>
- Dette er den vanligste måten å transportere e-postmeldinger fra
- klientens datamskin (deg) til tjeneren. SMTP står for
- Simple Mail Transfer Protocol.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="tooltip">
- <glossterm>Verktøytips:</glossterm>
- <glossdef>
- <para>
- En liten boks med forklarende tekst som vises når muspekeren
- holdes i ro over en knapp eller en annen del av
- brukergrensesnittet.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="virus">
- <glossterm>Virus:</glossterm>
- <glossdef>
- <para>
- Et program som legger seg selv til andre filer eller programmer og
- som, når det kjøres, sprer seg til flere programmer og andre
- datamaskiner. Et virus kan forårsake stor skade ved å bruke
- båndbredde, diskplass, slette filer, eller åpne sikkerhetshull.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="vcard">
- <glossterm>vCard:</glossterm>
- <glossdef>
- <para>
- Et filformat for utveksling av kontaktinformasjon. Når du mottar
- et adressekort vedlagt i en melding, er det sannsynligvis i vCard-
- format. Ikke til forveksling med <glossterm
- linkend="vfolder">vFolder:</glossterm>.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="vfolder">
- <glossterm>vFolder:</glossterm>
- <glossdef>
- <para>
- Et verktøy for organisering av meldinger. vFoldere lar deg opprette en
- mappe som inneholder resultatet av et komplekst søk. vFolder-innhold
- oppdateres dynamisk.
- </para>
- </glossdef>
- </glossentry>
-
-</glossary>
diff --git a/help/no/config-encryption.sgml b/help/no/config-encryption.sgml
deleted file mode 100644
index e36f17c652..0000000000
--- a/help/no/config-encryption.sgml
+++ /dev/null
@@ -1,147 +0,0 @@
-<!DOCTYPE article PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN"[]>
-
-<article>
-
- <sect1 id="encryption-intro">
- <title>What is Encryption?</title>
- <para>
- Encryption is an ancient method of changing readable text to unreadable
- text that dates back to Egyptian times. Encryption takes the statement
- "Evolution" and turns it into something which cannot be read without help
- through decryption.
- <example>
- <title>Encryption Example</title>
- <para>
- Kevin orders an <application>Evolution</application> t-shirt from
- Ximian, Inc. over the internet. He puts in his credit card number
- which is 1234-567-8901. For security, his computer encrypts the
- credit card number so it can be safely transmitted over the internet.
- The number now is @#$23ui7yr87#@!48970fsd, which holds no intentional
- resemblance to the inital number. When the information gets to
- Ximian, Inc. it'll be decrypted into the inital number.
- </para>
- </example>
- Encryption can be used in email in two ways: to verify that the sender is
- the real sender, and to hide the message while in transmission.
- <application>Evolution</application> has the capability to do both.
- </para>
- </sect1>
- <sect1 id="generating-key">
- <title>Generating your PGP key</title>
- <para>
- First, you need to create a PGP key. To do this, you'll need GPG
- installed.
- </para>
- <tip>
- <title>GPG Versions</title>
- <para>
- This manual covers version 1.0.6 of GPG. If your version is different,
- this may not be entirely accurate. You may find out your version number
- by typing in: <command>gpg --version</command>.
- </para>
- </tip>
- <para>
- You can start by typing in: <command>gpg --gen-key</command>. At the
- first question, select 1. The next question asks you about key length.
- The longer the key, more stronger it is. However, the longer the key, the
- longer it takes to generate. This is your choice. However, 1024 bits
- (default) should be adequate. The next question asks you if you want your
- key to expire. Expiring keys make your key invalid after a certain amount
- of time, so old keys don't float around active. This is the same concept
- as a coupon at a supermarket. Next, you'll type in your Real name, your
- email address, and a comment. You should not forge this information, as
- it is used later to verify who you are. Assuming that all your
- information is correct, press "O" to continue. GPG now asks you for a
- passphrase. This is a password which you will need to decrypt and encrypt
- messages. This can be any length, with any characters in it. It is case
- sensitive, which means that it does know the difference between capital
- letters and lower-case. Now your key is generated. It is recommend you
- surf the internet, read your email, or write a letter in a word
- processor. This help creates randomness in the key.
- </para>
- <para>
- Once this is completed, you'll be dropped back to the command line.
- Now you can view your key information by typing <command>gpg
- --list-keys</command>. You should see something similar to this:
- <example id="gpg-list-keys">
- <title>GPG Listing Keys</title>
- <para>
- /home/bob/.gnupg/pubring.gpg
- ----------------------------
- pub 1024D/32j38dk2 2001-06-20 bob &lt;bob@bob.com&gt;
- sub 1024g/289sklj3 2001-06-20 [expires: 2002-11-14]
- </para>
- </example>
- You'll now need to upload your public key to a keyserver, so that your
- friends can use your key. You'll need to know the ID of your key, which
- is after the 1024D on the line beginning with pub. For this example, it
- is 32j38dk2. You now type in <command>gpg --send-keys --keyserver
- wwwkeys.pgp.net 32j38dk2</command>. Substitute your key ID for 32j38dk2.
- You will be prompted to type in your password <!-- verify that you need to
- enter your password here --> and your key will be uploaded for your
- friends to download.
- </para>
- </sect1>
- <sect1 id="encrypt-evo-integ">
- <title>Setting up Evolution's Encryption</title>
- <para>
- You'll need to open
- <menuchoice>
- <guimenu>Tools</guimenu>
- <guimenuitem>Mail Settings</guimenuitem>
- </menuchoice>
- Once there, select the account you'd like to associate the key to and click
- the <guibutton>Edit</guibutton> button. In the
- <guilabel>Security</guilabel> tab is a section labeled <guilabel>Pretty
- Goog Privacy</guilabel>. Enter your key ID and click
- <guibutton>OK</guibutton>. Your key is now integrated into your identity
- in <application>Evolution</application>.
- </para>
- </sect1>
- <sect1 id="encrypt-sending">
- <title>Sending Encrypted Messages</title>
- <para>
- You can either sign or encrypt a message. When you sign a message, verify
- that you were the one who sent it, and that no one is forging your
- identity. Encrypting a message makes it impossible for someone with
- prying eyes to view it while it's in tranmission.
- </para>
- <para>
- <sect2 id="sign-msg">
- <title>Signing a Message</title>
- <para>
- To sign a message, you simply click
- <menuchoice>
- <guimenu>Security</guimenu>
- <guimenuitem>PGP Sign</guimenuitem>
- </menuchoice>
- . You will be prompted for your PGP password. Once you enter it,
- click <guibutton>OK</guibutton> and your message will be signed.
- </para>
- </sect2>
- <sect2 id="encrypt-msg">
- <title>Encrypting a Message</title>
- <para>
- Encrypting a message is very similar to signing a message. You simply
- click the menu item
- <menuchoice>
- <guimenu>Security</guimenu>
- <guimenuitem>PGP Encrypt</guimenuitem>
- </menuchoice>
- </para>
- </sect2>
- </para>
- </sect1>
- <sect1 id="unencrypting">
- <title>Unencrypting a Recieved Message</title>
- <para>
- Sometimes, a friend will send you a message which is encrypted. In order
- for you to read it, you need to unencrypt it.
- </para>
- <para>
- When you view the encrypted message, <application>Evolution</application>
- will prompt you for your PGP password. You type in your PGP password and
- the message is then decrypted.
- </para>
- </sect1>
- </article>
diff --git a/help/no/config-prefs.sgml b/help/no/config-prefs.sgml
deleted file mode 100644
index 77ebe4e807..0000000000
--- a/help/no/config-prefs.sgml
+++ /dev/null
@@ -1,744 +0,0 @@
-<!--
-<!DOCTYPE Chapter PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-<chapter id="config-prefs">
-
- <title>Advanced Configuration</title>
- <para>
- Perhaps your mail server has changed names. Perhaps you've
- grown tired of a certain layout for your appointments.
- Whatever the reason, you want to change your
- <application>Evolution</application> settings. This chapter
- will tell you how to do just that.
- </para>
-
- <sect1 id="config-prefs-mail">
- <title>Mail Settings</title>
- <para>
- To change your mail settings, select <menuchoice>
- <guimenu>Tools</guimenu> <guimenuitem>Mail
- Settings</guimenuitem></menuchoice> in the Inbox. This
- will open the <interface>mail preferences window</interface>,
- illustrated in <xref linkend="config-prefs-mail-fig">. Mail
- preferences are separated into several categories:
- <variablelist>
- <varlistentry>
- <term><guilabel>Accounts</guilabel></term>
- <listitem>
- <para>
- This allows you to create and alter one or more identities for your
- email.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Display</guilabel></term>
- <listitem>
- <para>
- Allows you to edit how email appears.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Composer</guilabel></term>
- <listitem>
- <para>
- Customizes the behavior of the email message composer.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Other</guilabel></term>
- <listitem>
- <para>
- Configures miscellanious aspects of
- <application>Evolution</application> such as character
- set and encryption tools.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- </para>
-
- <!-- ==============Figure===================== -->
- <figure id="config-prefs-mail-fig">
- <title>Mail Preferences Dialog</title>
- <screenshot>
- <screeninfo>Setting mail preferences</screeninfo>
- <mediaobject><imageobject><imagedata fileref="figures/config-mail" format="png" srccredit="Aaron Weber">
- </imageobject></mediaobject>
- </screenshot>
- </figure>
- <!-- ==============End of Figure================-->
-
-
- <sect2 id="config-prefs-mail-identity">
- <title>Working with the Accounts Tab</title>
- <para>
- <application>Ximian Evolution</application> allows you to
- maintain multiple accounts, or identities. This is useful
- want to keep personal and professional email separate, or if
- you wear several hats at work. When you are writing an email
- message, you can which account to use by selecting from the
- drop-down list next to the <guilabel>From</guilabel> entry in
- the message composer.
- </para>
-
- <para>
- Clicking <guibutton>Get Mail</guibutton> will refresh any
- IMAP, <filename>mh</filename>, or
- <filename>mbox</filename> listings
- and check and download mail from all POP servers. In other
- words, <guibutton>Get Mail</guibutton> gets your mail, no
- matter how many sources you have, or what types they are. If
- you don't want to check mail for a given account, select it
- in the <guilabel>Accounts</guilabel> tab and click the
- <guibutton>Disable</guibutton> button.
- </para>
-
- <para>
- To add a new account, simply click <guibutton>Add</guibutton>
- to open the mail configuration assistant. To alter an
- existing identity, select it in the
- <interface>Preferences</interface> window, and then click
- <guibutton>Edit</guibutton> to open the account editor
- dialog.
- </para>
- <para>
- The account editor dialog has six sections:
- <variablelist>
-
- <varlistentry>
- <term>Identity:</term>
- <listitem>
- <para>
- Here, enter the name,
- email address, and other identifying information for the
- account.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Receiving Mail</term>
- <listitem>
- <para>
- Here, select the way you will be getting mail: you may
- download mail from a server (<glossterm
- linkend="pop">POP</glossterm> or <glossterm
- linkend="imap">IMAP</glossterm>) or access it from files
- on your local system. If you use a server, it may permit
- or require you to use a Secure Socket Layer (SSL)
- connection. To turn SSL connections on, just click the
- <guibutton>Use Secure Connection (SSL)</guibutton>
- button.
-
-<note id="config-arbitrary-port">
-<title>Specifying Port Numbers</title>
-<para>
-Your system administrator may ask you to connect to a specific port on
-a mail server. To specify which port you use, just type a colon and
-the port number after the server name. For example, to connect to port
-143 on the server smtp.omniport.com, you would enter
-as
-<userinput>
-smtp.omniport.com:143
-</userinput> as the server name.
-</para>
-</note>
-
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Receiving Options</term>
- <listitem>
- <para>
- Here, decide whether you'd like to check for mail
- automatically, and set other options related to the
- behavior of your server. If you use POP mail, you can
- decide whether to leave mail on the server, and if you
- use IMAP, you can set folder subscription options here.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Sending Mail</term>
- <listitem>
- <para>
- In this section, you will choose and configure a method
- for sending mail. You may choose <glossterm
- linkend="smtp">SMTP</glossterm> or <glossterm
- linkend="sendmail">sendmail</glossterm>.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Special Folders</term>
- <listitem>
- <para>
- Here, you can decide where this account will store the
- messages that it has sent, and the messages that you
- save as drafts.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Security</term>
- <listitem>
- <para>
- In this section, you will set the security options for
- this account. Enter your PGP Key ID and decide how
- frequently to encrypt and sign your messages.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </sect2>
-
- <sect2 id="config-prefs-mail-display">
- <title>Mail Display Options</title>
- <para>
- In this tab you can decide how you would like
- <application>Ximian Evolution</application> to display your
- mail: how to display citations, how long to wait before
- marking a message as read, and so forth.
- </para>
- <para>
- This is also where you can decide how you would like
- <application>Ximian Evolution</application> to handle inline
- images in HTML mail that you get. There is a detailed
- discussion of the issues surrounding these options in <xref
- linkend="usage-mail-getnsend-get-attach-html">.
- </para>
- <para>
- To hange the font which <application>Ximian
- Evolution</application> uses to display mail, do the
- following:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Open the Control Center by selecting <menuchoice>
- <guimenu>System</guimenu>
- <guimenuitem>Settings</guimenuitem> </menuchoice> from
- the menu panel.
- </para>
- </listitem>
- <listitem>
- <para>
- Select the HTML Viewer settings tool.
- </para>
- </listitem>
- <listitem>
- <para>Choose the font and font size you would like to use.
- </para>
- </listitem>
- </orderedlist>
-
- Alternately, open a terminal and run the
- <command>gtkhtml-properties-capplet</command> command. This
- will open the GNOME HTML Display Properties tool, and you can
- select a font and other attributes of your HTML display,
- including that in <application>Ximian Evolution</application>.
- </para>
- </sect2>
-
- <sect2 id="config-prefs-mail-composer">
- <title>Message Composer Preferences</title>
-
- <para>
- Mercifully, there are only four preferences you can prefer in
- the message composer preferences dialog:
- <variablelist>
- <varlistentry>
- <term>Send mail in HTML format by default </term>
- <listitem>
- <para>
- If you would like all email messages that you compose
- to begin in HTML format, leave this box checked. You
- can convert messages between HTML and plain text by
- selecting the <menuchoice> <guimenu>Format</guimenu>
- <guimenuitem>HTML</guimenuitem> </menuchoice> toggle
- in the message composer.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Default Forward style</term>
- <listitem>
- <para>
- Select from:
- <simplelist>
- <member><guilabel>Attachment:</guilabel> the
- message you forward appended to the message you send
- as a seperate file.</member>
-
- <member> <guilabel>Inline:</guilabel> The message
- you forward is included at the end of the message
- you send.</member>
-
- <member>
- <guilabel>Quoted:</guilabel> The message
- you forward is included at the end of the message
- you send, and a greater-than symbol (&gt;) is
- inserted at the beginning of each line to
- indicate that it is quoted.
- </member>
- </simplelist>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Prompt when sending messages with an empty subject</term>
- <listitem>
- <para>
- The composer will warn you if you try to send a
- message without a subject.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Prompt when sending messages with only Bcc recipients defined</term>
- <listitem>
- <para>
- The composer will warn you if you try to send a
- message that has only <guilabel>Bcc</guilabel>
- recipients. This is important because some mail
- servers will fail to honor blind carbon copy if you
- do not have at least one recipient that is visible to
- all readers.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </sect2>
- <sect2 id="config-prefs-mail-other">
- <title>Other Mail Preferences</title>
- <para>
- Not everything fits neatly into categories. This tab
- contains some miscellaneous configuration options that
- didn't fit anywhere else.
- <variablelist>
-
- <varlistentry>
- <term>
- <guilabel>PGP binary path</guilabel>
- </term>
- <listitem>
- <para>
- The complete path to your external encryption tool On
- most Linux systems, this will be
- <filename>/usr/bin/gpg</filename>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <guilabel>Remember PGP Passphrase until Exit</guilabel>
- </term>
- <listitem>
- <para> Check this box if you want <application>Ximian
- Evolution</application> to remember your PGP
- passphrase for as long as it is running. You will
- still have to enter your passphrase again each time
- you start <application>Ximian Evolution</application>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <guilabel>Default Character Encoding</guilabel>
- </term>
- <listitem> <para> Choose a default character encoding for
- your messages.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <guilabel>Empty Trash Folders on Exit</guilabel>
- </term>
- <listitem> <para> If you would like to expunge all deleted
- mail when you quit <application>Ximian
- Evolution</application>, check this box.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <guilabel>Log filter actions to:</guilabel>
- </term>
- <listitem> <para> If you like, you can have
- <application>Ximian Evolution</application> write all
- its message filter actions to a log file. Select a log
- file here.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </sect2>
- </sect1>
-
-
-<!-- NOT FOR 1.0, see usage-mail.sgml
- <sect1 id="config-prefs-news">
- <title>News Servers</title>
- <para>
- Newsgroups are so much like mailing lists that there's no
- reason not to keep them right next to your mail. When you
- first select the <guilabel>News Servers</guilabel> tab,
- you will see a blank box with the three familiar buttons
- on the right: <guibutton>Add</guibutton>,
- <guibutton>Edit</guibutton>, and
- <guibutton>Delete</guibutton>.
- </para>
- <para>
- Click <guibutton>Add</guibutton> to add a news server; you
- will be prompted for its name. Enter the name, click
- <guibutton>OK</guibutton>, and you're done. You can have
- as many news servers as you like, of course. News servers
- will appear next to your IMAP servers in the
- <interface>folder bar</interface>.
- </para>
- </sect2>
--->
-
-
- <sect1 id="config-prefs-cal">
- <title>Configuring the Calendar</title>
- <para>
- To set your calendar preferences, select
- <menuchoice><guimenu>Settings</guimenu>
- <guimenuitem>Calendar
- Settings</guimenuitem></menuchoice> from the Calendar
- view. This will open up the
- <interface>Preferences</interface> window. It contains four
- tabs: <guilabel>General</guilabel>, <guilabel>Display</guilabel>, <guilabel>Task List</guilabel>, and <guilabel>Other</guilabel>. The <interface>calendar
- preferences window</interface> is illustrated in <xref
- linkend="config-prefs-cal-fig">.
-
- <!-- ==============Figure===================== -->
- <figure id="config-prefs-cal-fig">
- <title>Calendar Preferences Dialog</title>
- <screenshot>
- <screeninfo>If this worked on my job as well as my calendar...</screeninfo>
- <mediaobject><imageobject><imagedata fileref="figures/config-cal" format="png" srccredit="Aaron Weber">
- </imageobject></mediaobject>
- </screenshot>
- </figure>
- <!-- ==============End of Figure================-->
- </para>
-
- <sect2 id="config-prefs-cal-general">
- <title>Calendar's General Settings</title>
- <para>
- The <guilabel>Time display</guilabel> tab lets you set the
- following:
- <variablelist>
- <varlistentry>
- <term>Time zone</term>
- <listitem>
- <para>
- The city you're located in, to judge your time zone.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Time format</term>
- <listitem>
- <para>You may choose between twelve-hour (AM/PM) and
- twenty-four hour time formats here by clicking the
- appropriate radio button.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Work Week</term>
- <listitem>
- <para>
- When does your work day start, and when does it end?
- In the day and week views,
- <application>Evolution</application> displays all the
- hours in the range you select here, even if there are
- no appointments for those times. Of course, you can
- still schedule an appointment outside of these hours,
- and if you do, the display will be extended to show
- it.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>First day of the week</term>
- <listitem>
- <para>You can set weeks to start on Sunday or on Monday.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Start of day</term>
- <listitem>
- <para>
- Says what time of the day your weekday starts. This will show all times till the end of the day, regardless of there is an appointment during the time period.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>End of day</term>
- <listitem>
- <para>
- Sets the time the day ends at.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </sect2>
- <sect2 id="config-prefs-cal-display">
- <title>Display</title>
- <para>
- The <interface>Display</interface> section lets you configure some visual properties of the calendar.
- </para>
- <para>The display properties you can set are:
-
- <variablelist>
- <varlistentry>
- <term>Time divisions</term>
- <listitem>
- <para>
- Sets the increments shown on the daily view in the calendar. You can set this to be:
- <itemizedlist>
- <listitem>
- <para>
- 5 minutes
- </para>
- </listitem>
- <listitem>
- <para>
- 10 minutes
- </para>
- </listitem>
- <listitem>
- <para>
- 15 minutes
- </para>
- </listitem>
- <listitem>
- <para>
- 30 minutes
- </para>
- </listitem>
- <listitem>
- <para>
- 60 minutes
- </para>
- </listitem>
- </itemizedlist>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Show appointment end times in week and month views</term>
- <listitem>
- <para>
- If there is space, <application>Evolution</application> will show the end times in the week and month views for each appointment.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Compress weekends in month view</term>
- <listitem>
- <para>
- If checked, your weekends will be shown in one box, instead of one for each day in the month view.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Show week numbers in date navigator</term>
- <listitem>
- <para>
- This will show the week numbers next to the respective weeks in the calendar.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </sect2>
-
- <sect2 id="config-prefs-cal-tasklist">
- <title>Task List Settings</title>
- <para>
- You can choose what information the To Do list displays and the
- way it is displayed.
- <variablelist>
- <varlistentry>
- <term>Tasks due today</term>
- <listitem>
- <para>
- Configures what color to set your tasks that are due today to.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Overdue tasks</term>
- <listitem>
- <para>
- Configures what color to set your overdue items to.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </sect2>
-
- <sect2 id="config-prefs-cal-other">
- <title>Other Calendar Settings</title>
- <para>
- This configures miscellaneous items for the calendar and todo list's functionality.
- <variablelist>
- <varlistentry>
- <term>Ask for confirmation when deleting items</term>
- <listitem>
- <para>
- When you delete an item in either the Task List or the Calendar, you will be prompted to confirm that you want to delete the item.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Create new appointments with a default reminder</term>
- <listitem>
- <para>
- All your appointments will be created using a default reminder enabled. You can still change what way you are reminded though. If enabled, you can then set the time before your appointment to be reminded.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </sect2>
- </sect1>
-
- <sect1 id="config-prefs-contact">
- <title>Managing the Addressbook</title>
- <para>
- The addressbook does not have a large list of configuration
- settings, but those that are there can be found in the
- <guimenu>Tools</guimenu> menu.
- </para>
-
- <sect2 id="config-prefs-contact-ldap-add">
- <title>Adding Directory Servers</title>
- <para>
- To add a new LDAP server to your available contact
- folders:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Select
- <menuchoice>
- <guimenu>Tools</guimenu>
- <guimenuitem>Addressbook Sources</guimenuitem>
- </menuchoice>
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guibutton>Add</guibutton>.
- </para>
- </listitem>
- <listitem>
- <para>
- Enter the server information.
- <variablelist>
- <varlistentry>
- <term>Account name</term>
- <listitem>
- <para>
- The name that you see on the screen. This could be anything you wish.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Server name</term>
- <listitem>
- <para>
- Address of the server where the addressbook is located.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>My server requires authentication</term>
- <listitem>
- <para>
- Select this if the server needs a password to access the addressbook.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Port</term>
- <listitem>
- <para>
- The internet port to connect to in order to access the database. This is normally 389.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Search base</term>
- <listitem>
- <para>
- The base node to use for all your searches. Contact your administrator for information about setting this up.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Search scope</term>
- <listitem>
- <para>
-How broad the search is in the directory.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guibutton>OK</guibutton>.
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guibutton>OK</guibutton> to permanenty make changes or <guibutton>Apply</guibutton> to temporarily set the changes.
- </para>
- </listitem>
- </orderedlist>
- </para>
- </sect2>
- </sect1>
-
-
-<!--
- <sect1 id="config-prefs-general">
- <title>General Preferences</title>
- <para>
- Additional configuration options will be covered here, as
- they become available.
- </para>
- </sect1>
--->
-</chapter>
-
-
-
-
-
-
diff --git a/help/no/config-sync.sgml b/help/no/config-sync.sgml
deleted file mode 100644
index c6bd2c684c..0000000000
--- a/help/no/config-sync.sgml
+++ /dev/null
@@ -1,126 +0,0 @@
- <chapter id="config-sync">
- <title>Oppsett av synkronisering</title>
- <para>
- Synkronisering presenterer to problemer du må håndtere.
- <simplelist>
- <member>
- Din datamaskin må gjenkjenne og godta din håndholdte.
- For tiden støtter, <application>Ximian Evolution</application>
- kun Palm-OS enheter som PalmPilot og Handspring Visor.
- </member>
- <member>
- Du må bestemme hvilken oppførsel du ønsker for synkroniseringen.
- </member>
- </simplelist>
- </para>
-
- <para>
- Hvis du ikke har brukt en håndholdt enhet mot din datamaskin
- før må du kjøre GNOME <application>kontrollsenter</application>
- ved å velge <menuchoice><guimenu>System</guimenu><guimenuitem>
- Innstillinger</guimenuitem></menuchoice>,
- og sørge for at <application>Pilot Link</application> er
- konfigurert på en korrekt måte.
- </para>
- <para>
- Når din datamaskin og din Palm-OS-enhet snakker med hverandre,
- velg <glossterm
- linkend="conduit">komponenter</glossterm> du ønsker under
- <guilabel>Pilot-komponenter</guilabel> seksjonen i kontrollsenteret
- Du kan bruke komponenter for synkronisering av data mot flere
- applikasjoner; <application>Ximian Evolution</application>
- komponentene er merket <guilabel>EAdresse</guilabel>, for
- kontaktene i din adressebok, <guilabel>EKalender</guilabel>,
- for din kalender, og <guilabel>EOppgave</guilabel>, for din
- oppgaveliste.
- </para>
- <para>
- For å aktivere en komponent klikker du
- <guibutton>Aktiver</guibutton>. Klikk så
- <guibutton>Innstillinger</guibutton> for å endre oppførsel ved
- aktivering. Dine valg vil variere avhengig av komponent,
- men vil typisk være:
-
- <variablelist>
- <varlistentry>
- <term>Deaktivert:</term>
- <listitem>
- <para>
- Ikke gjør noe.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Synkroniser:</term>
- <listitem>
- <para>
- Kopier nye data fra datamaskinen til den håndholdte og
- fra den håndholdte til datamaskinen. Fjern oppføringer
- som var på begge systemene men har blitt slettet på
- en av dem.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Kopier fra pilot:</term>
- <listitem>
- <para>
- Hvis det finnes nye data på den håndholdte enheten,
- kopier disse til datamaskinen.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Kopier til pilot:</term>
- <listitem>
- <para>
- Kopier nye data fra datamaskinen til den håndholdte.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Flett fra pilot:</term>
- <listitem>
- <para>
- Kopier nye data fra den håndholdte til datamaskinen, og
- fjern all informasjon fra datamaskinen som også er slettet
- på den håndholdte.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Flett til pilot:</term>
- <listitem>
- <para>
- Kopier nye data fra datamaskinen til den håndtholdte og
- fjern all informasjon fra den håndholdte hvis den også
- er slettet på datamaskinen.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
-
- <para>
- Velg oppførselen du ønsker for hver komponent du velger å bruke.
- Hvis du er usikker kan du bruke
- <guilabel>Synkroniser</guilabel>. Plasser så din håndholdte i
- dokken og trykk på HotSync knappen.
- </para>
- <para>
- <tip>
- <title>Forhindring av datatap</title>
- <para>
- Det er alltid lurt å ta en sikkerhetskopi. For å gjøre dette
- lager du en kopi av katalogen <filename>evolution</filename>
- i din hjemmekatalog.
- </para>
- </tip>
- </para>
-
- </chapter>
diff --git a/help/no/evolution-faq.sgml b/help/no/evolution-faq.sgml
deleted file mode 100644
index 8e658ff308..0000000000
--- a/help/no/evolution-faq.sgml
+++ /dev/null
@@ -1,973 +0,0 @@
-<!--
-<!DOCTYPE appendix PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-<appendix id="evolution-faq">
- <title>Frequently Asked Questions About Ximian Evolution</title>
- <para>
- Here are some frequently asked questions about the
- <application>Evolution</application> groupware suite from
- Ximian. If you have a question that's not listed, you can
- contact us at evolve@ximian.com.
- </para>
-
- <sect1 id="faq-features">
- <title>Features</title>
-
- <qandaset>
-
- <qandaentry>
- <question>
- <para>
- How can I use Evolution with Microsoft Exchange or Lotus Notes?
- </para>
- </question>
- <answer>
- <para>
- If your server uses standard open protocols like IMAP,
- LDAP, POP, and SMTP, you can use Evolution with it. You
- can share addresses with vCards and calendar items with
- iCal appointments.
- </para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>
- Can I use Evolution with KDE?
- </para>
- </question>
- <answer>
- <para>
- Evolution will work fine in KDE. You will need to
- install all of the GNOME libraries that it depends on.
- Also, certain configuration options, such as default
- fonts and the message editor keybinding behavior, must be
- changed using the GNOME Control Center application (this
- will also run from within KDE).
- </para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>
- How can I remove or rename a folder?
- </para>
- </question>
- <answer>
- <para>
- Right-click on the folder and select the
- <guimenuitem>Delete</guimenuitem> or
- <guimenuitem>Rename</guimenuitem> items.
- </para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>
- Why doesn't drag and drop between folders seem to work?
- </para>
- </question>
- <answer>
- <para>
- The implementation isn't finished, although it's nearly done.
- </para>
-
- <para>
- In the meantime, right-click on the folders or messages
- you want to move, and select the
- <guimenuitem>Move</guimenuitem> or
- <guimenuitem>Copy</guimenuitem> options.
- </para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>
- Can I read mail from a mailbox file created by some other
- application (e.g. Mutt) without importing mail from it?
- </para>
- </question>
- <answer>
- <para>
- No, but it's a planned feature.
- </para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>
- Can Evolution sync with my Palm OS (tm) device?
- </para>
- </question>
- <answer>
- <para>
- Yes. However, it is not yet stable enough for general
- release and we do not yet ship Evolution with Palm
- synchronization enabled default. Until we do, you will
- need to compile this in yourself. Check the
- <filename>README</filename> file for additional
- information on the requirements. Full compatibility and
- synchronization for calendar and addressbook applications
- on Palm devices will be implemented and shipped soon.
- </para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question>
- <para>
- What is the difference between a virtual folder (vfolder)
- and a regular folder?
- </para>
- </question>
- <answer>
- <para>
- A virtual folder is like a saved search: it is a view of
- your mail. Regular folders actually contain the mail
- messages. You can have one message be in multiple virtual
- folders, but only in one regular folder. See the section
- in the Evolution manual about virtual folders for more
- information.
- </para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question>
- <para>
- Can Evolution spell-check messages while I compose them?
- </para>
- </question>
- <answer>
- <para>
- Yes. The Evolution composer is able to highlight
- mis-spelled word on the fly as you type them, and also
- give you suggestions for possible corrections. In order
- for this to work you need the
- <filename>gnome-spell</filename> component, which is not
- shipped with Ximian GNOME yet.
- </para>
-
- <para>
- If you are brave enough, you can check out module
- <filename>gnome-spell</filename> from the GNOME CVS and
- compile it yourself. Check out its README file for a list
- of <filename>gnome-spell</filename>'s requirements for
- compilation.
- </para>
-
- <para>
- Note that you don't need to recompile Evolution after
- installing <filename>gnome-spell</filename>; it will be
- picked up automatically.
- </para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>
- Why can't I see the images that are contained in some HTML
- mail messages.
- </para>
- </question>
- <answer>
- <para>
- Evolution currently doesn't support this, but it's a
- planned feature. It will be an option: many people like
- to turn off the images because they use up bandwidth and can
- be used to spy on your email reading habits.
- </para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>
- Can I change the font that Evolution uses to compose and
- display mail messages?
- </para>
- </question>
- <answer>
- <para>
- You have to change the GtkHTML settings for that: in the
- GNOME Control Center, go to the "HTML Viewer"
- configuration page, which is under the "Document Handlers"
- category.
- </para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question>
- <para>
- How do I import my Outlook <filename>.pst</filename> files into Evolution?
- </para>
- </question>
- <answer>
- <para>
- You cannot import these files directly into Evolution
- because the <filename>.pst</filename> format is a
- proprietary format. However, Mozilla Mail on Windows can
- convert them into the <type>mbox</type> format, which can
- then be imported by Evolution.
- </para>
-
- <para>
- To start importing your Outlook mail to Evolution, run
- Mozilla Mail on Windows and select the
- <menuchoice><guimenu>File</guimenu><guimenuitem>Import...</guimenuitem></menuchoice>
- to begin. Then select that you wish to import Mail from
- Outlook. Once Mozilla has imported all your mail, reboot
- your computer into Linux.
- </para>
-
- <para>
- Mount your Windows partition in Linux and run Evolution to
- begin importing your mail. Select
- <menuchoice><guimenu>File</guimenu><guimenuitem>Import
- File...</guimenuitem></menuchoice> to start importing. Set
- the file type to MBox (mbox) and click on
- <guibutton>Browse</guibutton> to select the mail you want
- to import.
- </para>
-
- <para>
- If you are the only user on Windows, the mail files will
- be stored in <filename>/mnt/c/windows/Application
- Data/Mozilla/Profiles/default/XXXX/Mail/imported.mail/</filename>
- where <filename>/mnt/c/</filename> is your windows
- partition mount point and XXXX is some collection of
- numbers and digits ending in <filename>.slt</filename>.
- </para>
-
- <para>
- If there is more than one user, the file will be in
- <filename>/mnt/c/windows/Profiles/USERNAME/XXXX/Mail/imported.mail/</filename>
- where USERNAME is your Windows username.
- </para>
-
- <para>
- For each mail folder in Outlook, Mozilla will convert the
- folder into one mbox file. To import all your mail, import
- all the files without a <filename>.msf</filename>
- extension.
- </para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>
- If Mozilla can import <filename>.pst</filename> files, why can't Evolution?
- </para>
- </question>
- <answer>
- <para>
- Mozilla on Windows accesses the <filename>.pst</filename>
- files through the <filename>MAPI.DLL</filename>, which is
- only available on Windows. <filename>MAPI.DLL</filename>
- is the only way to access <filename>.pst</filename> files
- and Evolution cannot use this DLL in Linux.
- </para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question>
- <para>
- Will there be an Evolution server? How about a text-based or web-based front end?
- </para>
- </question>
- <answer>
- <para>
- Of course, we can't comment on unannounced future product
- plans, but Evolution's architecture would permit the
- existence of that kind of software. If there is enough
- demand for such software we will consider moving in that
- direction.
- </para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>
- Will Evolution make a good mocha?
- </para>
- </question>
- <answer>
- <para>
- Only espresso is planned, but you can easily plug in a chocolate component.
- </para>
- </answer>
- </qandaentry>
-
- </qandaset>
- </sect1>
-
-
- <!-- Section: Getting and compiling -->
-
- <sect1 id="faq-get-and-compile">
- <title>
- Getting and Compiling Evolution
- </title>
- <qandaset>
- <qandaentry>
- <question>
- <para>
- Where can I get the latest Evolution release?
- </para>
- </question>
- <answer>
- <para>
- There are two ways to install the latest Evolution
- release:
- <itemizedlist>
- <listitem>
- <para>
- If you have Ximian GNOME installed, you can start
- Red Carpet, Ximian's software updating system, and
- subscribe to the Evolution channel. This will let
- you install a binary for the latest release, and
- will also warn you when a new version has been made
- available.
- </para>
- </listitem>
-
- <listitem>
- <para>
- If you want to compile from source, you can
- download the latest official Evolution tarball
- from:
- </para>
-
- <para>
- <ulink url="ftp://ftp.gnome.org/pub/GNOME/unstable/sources/evolution">
- ftp://ftp.gnome.org/pub/GNOME/unstable/sources/evolution</ulink>
- </para>
- </listitem>
- </itemizedlist>
- </para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question>
- <para>
- Are binary snapshots available?
- </para>
- </question>
- <answer>
- <para>
- Yes, if you have Ximian GNOME installed. Just run Red
- Carpet and subscribe to the Evolution Snapshot channel.
- </para>
-
- <para>
- You can check the status of snapshots at
- <ulink url="http://primates.ximian.com/~snapshot">http://primates.ximian.com/~snapshot</ulink>.
- </para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question>
- <para>
- Why isn't a new snapshot available today?
- </para>
- </question>
- <answer>
- <para>
- Sometimes the build might fail because of problems with
- the source on CVS. In this case, just wait for next day's
- snapshot.
- </para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question>
- <para>
- How do I get Evolution from CVS?
- </para>
- </question>
- <answer>
- <para>
- If you already have
- <ulink url="http://cvs.gnome.org">GNOME CVS</ulink> access,
- simply check out the following modules: evolution,
- gtkhtml, gal.
- </para>
- <para>
- If you don't have a CVS account, you can use anoncvs
- instead. Bear in mind that anoncvs is only synchronized once
- a day, and code received from anoncvs may not be latest
- version available.
- </para>
-
- <para>
- Before using the anoncvs server, you have to log into it.
- This only needs to be done once. Use this command:
- </para>
-
- <programlisting>
- cvs -z3 -d :pserver:anonymous@anoncvs.gnome.org:/cvs/gnome login
- </programlisting>
-
- <para>
- Then you can retrieve the modules needed to compile Evolution
- using the following command:
- </para>
-
- <programlisting>
- cvs -z3 -d :pserver:anonymous@anoncvs.gnome.org:/cvs/gnome co evolution gtkhtml gal
- </programlisting>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>
- How should I compile Evolution avoiding conflicts with my
- existing GNOME installation?
- </para>
- </question>
- <answer>
- <para>
- The best way is to install Evolution into a separate prefix.
- In order to specify a non-default installation prefix, you
- can pass the <parameter>--prefix</parameter> option to
- <filename>configure</filename> or
- <filename>autogen.sh</filename>. For example:
- </para>
-
- <programlisting>
- cd /cvs/evolution
- ./autogen.sh --prefix=/opt/gnome
- </programlisting>
-
- <para>
- If you install Evolution and the Evolution libraries in a
- non-standard prefix, make sure you set the appropriate
- environment variables in the startup script for Evolution:
- </para>
-
- <programlisting>
- export PATH=/opt/gnome:$PATH
- export GNOME_PATH=/opt/gnome:/usr
- </programlisting>
-
- <para>
- You may also need to add <filename>$prefix/lib</filename>
- (e.g. <filename>/opt/gnome/lib</filename>) to your
- <filename>/etc/ld.so.conf</filename>. Of course, this will
- not work for systems which do not use ld.so.conf, such as
- HP-UX.
- </para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question>
- <para>
- I get the error message: <computeroutput>make: *** No rule
- to make target
- `all-no-@BUILD_INCLUDED_LIBINTL@'</computeroutput>
- </para>
- </question>
- <answer>
- <para>
- You probably have <filename>gettext</filename> 0.10.36 or
- later installed. Try downgrading to 0.10.35;
- unfortunately, 0.10.36 introduced some incompatibilities
- with the current <filename>xml-i18n-tools</filename>.
- </para>
- </answer>
- </qandaentry>
- </qandaset>
- </sect1>
-
- <sect1 id="faq-trouble">
- <title>Troubleshooting</title>
- <qandaset>
- <qandaentry>
- <question>
- <para>
- I get <computeroutput>Cannot initialize the Evolution
- shell</computeroutput>.
- </para>
- </question>
- <answer>
- <para>
- There are a number of things that can cause this error.
- Check that:
- </para>
-
- <itemizedlist>
- <listitem>
- <para>
- <filename>oafd</filename> is listed in your <envar>PATH</envar>
- environment variable.
- </para>
- </listitem>
-
- <listitem>
- <para>
- <filename>GNOME_Evolution_Shell.oaf</filename> and
- the other      
- <filename>GNOME_Evolution_*.oaf</filename> files are
- readable and installed in
- <filename>$prefix/share/oaf</filename>, where
- <filename>$prefix</filename> is one of the prefixes
- listed in <envar>GNOME_PATH</envar> or
- <envar>OAF_INFO_PATH</envar>.  (These variables are
- supposed to contain $PATH-like colon-separated lists of
- paths.  If the installation prefix for Evolution is
- different from that). Run `oaf-slay' once before running
- `evolution' again if you change $GNOME_PATH or
- $OAF_INFO_PATH.
- </para>
- </listitem>
-
- <listitem>
- <para>
- <filename>evolution</filename>,
- <filename>evolution-mail</filename> and the other
- <filename>evolution-*</filename> executables are in your
- $PATH.
- </para>
- </listitem>
- </itemizedlist>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>
- I get <computeroutput>Cannot open composer window</computeroutput>.
- </para>
- </question>
- <answer>
- <para>
- This actually means that Evolution cannot activate the HTML
- editor component from GtkHTML. The comments in the previous
- answer still apply; also make sure that
- <command>gnome-gtkhtml-editor</command> is in your
- <envar>PATH</envar>.
- </para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>
- The address suggestion list steals focus from the "To:"
- entry box when I'm typing. How can I make it keep focus?
- </para>
- </question>
- <answer>
- <para>
- This is a bug in GTK version 1.2.10. To avoid it, downgrade
- to GTK version 1.2.9, or install the Ximian version of GTK
- 1.2.10.
- </para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>
- I updated Evolution and now my addressbook information is gone!
- What should I do?
- </para>
- </question>
- <answer>
- <para>
- Evolution uses the <filename>libdb</filename> library to
- handle the addressbook database. Two versions of
- <filename>libdb</filename> can be used with Evolution: version
- 1.88 and version 2.
- </para>
-
- <para>
- Unfortunately, an Evolution executable that is linked against
- a certain version of <filename>libdb</filename> will only be
- able to read addressbook files written by another Evolution
- executable that is linked with the same version of the
- library. If your addressbook is not readable by Evolution
- anymore, it probably means that you used to have Evolution
- linked with a certain version of <filename>libdb</filename>,
- but now it gets linked to a different version.
- </para>
-
- <para>
- Because of the way <filename>libdb</filename> is designed, it
- is not easy for Evolution to automatically do the conversion
- between the two formats. But, if your Evolution used to be
- linked against version 1.85 and now is linked to version 2,
- there is a very simple way to convert the database and recover
- your data.
- </para>
-
- <itemizedlist>
-
- <listitem>
- <para>
- First of all, check the format of the database using the
- <command>file</command> command:
- </para>
-
- <programlisting>
- file ~/evolution/local/Contacts/addressbook.db
- </programlisting>
-
- <para>
- You want version 1.85 there. If your version is 2, then
- your current Evolution is probably linked against
- version 1.85 and you cannot convert the database to the
- old format. To do that, follow these instructions:
- </para>
- </listitem>
-
- <listitem>
- <para>
- Quit Evolution.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Make a copy of the addressbook database for backup
- purposes, then move the original out of the way.
- </para>
-
- <programlisting>
- cd ~/evolution/local/Contacts
- cp addressbook.db addressbook.db.backup
- mv addressbook.db addressbook.db.tmp
- </programlisting>
- </listitem>
-
- <listitem>
- <para>
- Convert the contacts to the new format using
- <command>db_dump185</command> and
- <command>db_load</command>:
- </para>
-
- <programlisting>
- db_dump185 addressbook.db.tmp | db_load ~/evolution/local/Contacts/addressbook.db
- </programlisting>
- </listitem>
-
- <listitem>
- <para>
- Restart Evolution.
- </para>
- </listitem>
-
- </itemizedlist>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>
- Evolution reported an error when trying to retrieve from my
- local spool in <filename>/var/spool/mail/username</filename>. Why?
- </para>
- </question>
- <answer>
- <para>
- Evolution doesn't have an external helper for moving mail,
- so <filename>/var/spool/mail/</filename> must be writable
- by you. Try this:
- </para>
-
- <programlisting>
- chmod 1777 /var/spool/mail
- </programlisting>
-
- <para>
- We're working on a solution to this problem now.
- </para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>
- Evolution crashes reporting that it couldn't allocate N
- billion bytes; how do I fix this?
- </para>
- </question>
- <answer>
- <para>
- This usually happens when a component tries talking a
- certain version of a CORBA interface to another component
- that supports a different version. For example, this can
- happen when you recompile and install a single component
- without recompiling/installing the rest of Evolution.
- </para>
-
- <para>
- If you run into this problem, make sure all the components
- are compiled and installed at the same time. This also
- applies to GtkHTML upgrades; after upgrading and
- installing a newer GtkHTML, always re-compile and
- re-install Evolution against it.
- </para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>
- What is <command>killev</command> and why do I need to use it?
- </para>
- </question>
- <answer>
- <para>
- Evolution is actually made up of several components that run
- as separate processes. Evolution's shell is not very good
- at cleaning up stale processes, so it is possible that
- sometimes already-running components cause unexpected and/or
- broken behavior.
- </para>
-
- <para>
- It's always a good idea to run <command>killev</command>
- after a crash in Evolution, especially if the Evolution
- shell itself crashed. (If a component crashes instead, you
- should try to exit the shell cleanly first, so you give a
- chance to the other components to clean things up properly.)
- </para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>
- What is <command>oaf-slay</command> and why do I need to use it?
- </para>
- </question>
- <answer>
- <para>
- <command>oaf-slay</command> is an utility which comes with
- OAF, the Object Activation Framework that is used in the
- GNOME Desktop to activate components. It will kill the
- object activation daemon (<command>oafd</command>) as well
- as all the active components on the system.
- </para>
-
- <para>
- Using <command>oaf-slay</command>
- <command>oaf-slay</command> is quite drastic and can cause
- problems with other programs that use oaf, especially with
- <application>Nautilus</application>. To avoid problems, do
- not run <command>oaf-slay</command> while you are in GNOME.
- </para>
- </answer>
- </qandaentry>
- </qandaset>
- </sect1>
-
- <sect1 id="faq-debugging">
- <title>Questions about Bugs and Debugging</title>
- <para>
- Find a bug? Here's how to help us fix it!
- </para>
-
- <qandaset>
- <qandaentry>
- <question>
- <para>
- Where should I report bugs for Evolution?
- </para>
- </question>
- <answer>
- <para>
- You can use the GNOME Bug Report Tool
- (<command>bug-buddy</command>), or report bugs to the
- Ximian bug reporting system (Bugzilla), located at <ulink
- url="http://bugzilla.ximian.com">http://bugzilla.ximian.com</ulink>.
- </para>
-
- <para>
- Please use the query function to check if a bug has been
- submitted already, so that we avoid duplicate reports.
- </para>
- </answer>
- </qandaentry>
-
-
- <qandaentry>
- <question>
- <para>
- What is a stack trace (backtrace) and how do I get one?
- </para>
- </question>
- <answer>
- <para>
- A stack trace is a list of the chain of function calls
- that lead to some point in the program. Typically, you
- want to get a stack trace when Evolution crashes or
- hangs and you want to try to figure out where in the
- code that happened and why. For this reason, stack
- traces are extremely useful for the Evolution
- developers, so it's important that you learn how to get
- them, and include them in crash reports. The
- <application>bug-buddy</application> tool can get and
- submit a stack trace for you. If you want to do it by
- yourself, here's how:
- </para>
- <para>
- First of all, in order to get a stack trace, your
- executable (and possibly the libraries) must be compiled
- with debugging symbols. Debugging symbols are created by
- default if you compile from CVS, and are included in the
- snapshot builds. If you decide to compile by yourself
- with some custom CFLAGS value, make sure -g is included
- in them.
- </para>
- <para>
- Finally, you must put the component that crashes through
- <application>gdb</application>, the GNU debugging tool.
- To do so, make sure all the components are dead (exit
- Evolution and run <command>killev</command>), then run the
- following command:
- <programlisting>
- <command>gdb name-of-component</command>
- </programlisting>
-
- Where "name-of-component" is the name of the component that
- crashed.
- </para>
- <para>
- Then, at the gdb prompt, type r (for "run") and wait a
- few seconds to make sure the component has registered
- with the name service. Then start
- <application>Evolution</application> normally from a
- different terminal.
- </para>
- <para>
- When you have started
- <application>Evolution</application>, reproduce the
- crash, and go back to the terminal where you ran gdb. If
- the component crashed, you should have a prompt there;
- otherwise, just hit Control+C. At the prompt, type
- <command>info threads</command>. This will give you a
- screen that looks like this:
- </para>
- <para>
- <programlisting>
-(gdb) info threads
- 8 Thread 6151 (LWP 14908) 0x409778fe in sigsuspend () from /lib/libc.so.6
- 7 Thread 5126 (LWP 14907) 0x409778fe in sigsuspend () from /lib/libc.so.6
- 6 Thread 4101 (LWP 1007) 0x409778fe in sigsuspend () from /lib/libc.so.6
- 5 Thread 3076 (LWP 1006) 0x409778fe in sigsuspend () from /lib/libc.so.6
- 4 Thread 2051 (LWP 1005) 0x409778fe in sigsuspend () from /lib/libc.so.6
- 3 Thread 1026 (LWP 1004) 0x409778fe in sigsuspend () from /lib/libc.so.6
- 2 Thread 2049 (LWP 1003) 0x40a10d90 in poll () from /lib/libc.so.6
- 1 Thread 1024 (LWP 995) 0x40a10d90 in poll () from /lib/libc.so.6
- </programlisting>
-
- For the most part, only
- <application>evolution-mail</application> will have more
- than one thread.
- </para>
- <para>
- Now, for each of the threads listed, type the following commands:
-<programlisting>
-thread N
-bt
-</programlisting>
- Where 'N' is the number of the thread (in this example, 1
- through 8).
- </para>
- <para>
- Cut and paste all the output gdb gives you into a text
- file. You can quit gdb by typing
- <userinput>quit</userinput>
- </para>
- <para>
- If you prefer, you can start gdb while a process is
- running. You'll want to do this right after a crash dialog
- appears, but before hitting "OK" or "Submit bug report".
- Start <application>gdb</application> as above, but instead
- of using <userinput>r</userinput>, type <userinput>attach
- PID</userinput> where PID is the process ID of the
- component you want to debug.
- </para>
- <para>
- If that sounds too complicated, you can always use
- <command>bug-buddy</command> to get and submit the stack
- trace.
- </para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question>
- <para>
- A component of evolution crashed, but since the rest of
- evolution stayed up, I couldn't use bug-buddy to get a
- stack trace. How can I use gdb to get a stack trace of
- the component?
- </para>
- </question>
- <answer>
- <para>
- To trace a failing component (in this example, evolution-mail):
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Open two terminals.
- </para>
- </listitem>
- <listitem>
- <para>
- In one, type <command>gdb evolution-mail</command>
- . Replace "evolution-mail" with the name of the
- component that is crashing: evolution-addressbook,
- evolution-calendar, etc.)
- </para>
- </listitem>
- <listitem>
- <para>
- Once gdb starts, type <userinput>r</userinput> and
- hit enter. Give it a few seconds, to make sure it
- starts up completely.
- </para>
- </listitem>
- <listitem>
- <para>
- In the second terminal, type
- <command>evolution</command>. Do whatever you did
- to cause the crash in the component you used in
- step two.
- </para>
- </listitem>
- <listitem>
- <para>
- When the crash occurs, type 'bt' in the first
- terminal.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Cut and paste the output into your bug report.
- </para>
- </listitem>
- </orderedlist>
- </para>
- </answer>
- </qandaentry>
- </qandaset>
- </sect1>
- </appendix>
-
-<!-- Local Variables: --> <!-- indent-tabs-mode:nil --> <!-- End: -->
-
-
-
-
diff --git a/help/no/evolution-no.omf b/help/no/evolution-no.omf
deleted file mode 100644
index 3f8c797af6..0000000000
--- a/help/no/evolution-no.omf
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<omf>
- <resource>
- <creator>
- Ximian, Inc.
- </creator>
- <title>
- Evolution brukerhåndbok
- </title>
- <date>2002</date>
- <subject category="GNOME|Applikasjoner"/>
- <format mime="text/sgml"/>
- <identifier url="index.html"/>
- <language code="no"/>
- </resource>
-</omf>
diff --git a/help/no/evolution.sgml b/help/no/evolution.sgml
deleted file mode 100644
index 348c30c3a8..0000000000
--- a/help/no/evolution.sgml
+++ /dev/null
@@ -1,128 +0,0 @@
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V4.1//EN"[
-
-<!ENTITY PREFACE SYSTEM "preface.sgml">
-<!ENTITY USAGE-MAINWINDOW SYSTEM "usage-mainwindow.sgml">
-<!ENTITY USAGE-EXEC-SUMMARY SYSTEM "usage-exec-summary.sgml">
-<!ENTITY USAGE-MAIL SYSTEM "usage-mail.sgml">
-<!ENTITY USAGE-MAIL-ORG SYSTEM "usage-mail-org.sgml">
-<!ENTITY USAGE-CONTACT SYSTEM "usage-contact.sgml">
-<!ENTITY USAGE-CALENDAR SYSTEM "usage-calendar.sgml">
-<!ENTITY USAGE-SYNC SYSTEM "usage-sync.sgml">
-<!ENTITY USAGE-PRINT SYSTEM "usage-print.sgml">
-<!ENTITY CONFIG-PREFS SYSTEM "config-prefs.sgml">
-<!ENTITY CONFIG-SYNC SYSTEM "config-sync.sgml">
-<!ENTITY MENUREF SYSTEM "menuref.sgml">
-<!ENTITY APX-GLOSS SYSTEM "apx-gloss.sgml">
-<!ENTITY APX-COMMON-TASKS SYSTEM "apx-common-tasks.sgml">
-<!ENTITY APX-BUGS SYSTEM "apx-bugs.sgml">
-<!ENTITY APX-AUTHORS SYSTEM "apx-authors.sgml">
-
-]>
-
-
-<!-- Almost every chapter is an entity. Files, Chapter id's, and
-entity names correspond. APX is for appendix. Note that there is no
-entity for apx-notes.sgml, which is still included in the file
-set. Reinstate the entity if and when the Notes feature is
-implemented. -->
-
-<book id="index">
- <bookinfo>
- <title>En brukers håndbok for Evolution</title>
- <authorgroup>
- <author><firstname>Aaron</firstname><surname>Weber</surname></author>
- <author><firstname>Kevin</firstname><surname>Breit</surname></author>
- <author><firstname>Ettore</firstname><surname>Perazzoli</surname></author>
- <author><firstname>Duncan</firstname><surname>Mak</surname></author>
- </authorgroup>
- <copyright>
- <year>2001</year>
- <holder>Ximian, Inc.</holder>
- </copyright>
-
- <legalnotice id="legalnotice">
-
- <para>
- Det gis herved rett til å kopiere, distribuere og/eller endre
- dette dokumentet under betingelsene gitt i <ulink type="help"
- url="gnome-help:fdl"><citetitle>GNU Free Documentation
- License</citetitle></ulink>, versjon 1.1 eller enhver senere versjon
- publisert av Free Software Foundation uten "Invariant
- Sections", uten forsidetekst, og uten baksidetekst. Du kan få en kopi av
- <citetitle>GNU Free Documentation License</citetitle> fra Free Software
- foundation ved å gå til <ulink type="http" url="http://www.fsf.org">deres
- nettside</ulink> eller ved å skrive til: Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA..
- </para>
-
- <para>
- Mange av navnene som brukes av firmaer for å gjøre sine
- produkter og tjenester unik er tatt som merkenavn. Der hvor disse
- navnene brukes i GNOME's dokumentasjon, og disse merkenavnene gjøres
- kjent for medlemmer av GNOME Documentation Project, har disse navnene
- blitt skrevet med store bokstaver eller de begynner med stor bokstav.
- </para>
-
- </legalnotice>
-
- <releaseinfo>
- Dette er versjon 1.0 av Evolution's brukerhåndbok.
- </releaseinfo>
-
- </bookinfo>
-
- &PREFACE;
-
- <part id="usage">
- <title>Kom i gang med Ximian Evolution</title>
- <partintro>
- <para>
- Første del av <application>Evolution</application> håndboken
- beskriver hvordan du bruker <application>Evolution</application>
- for e-post, kontakthåndtering, og styring av avtaler og oppgaver.
- Du vil etterhvert finne ut at det er flere måter
- å gjøre ting på, og du kan velge den metoden du liker best
- selv.
- </para>
- </partintro>
-
- &USAGE-MAINWINDOW;
- &USAGE-EXEC-SUMMARY;
- &USAGE-MAIL;
- &USAGE-MAIL-ORG;
- &USAGE-CONTACT;
- &USAGE-CALENDAR;
-<!-- &USAGE-NOTES; -->
- &USAGE-SYNC;
- &USAGE-PRINT;
- </part>
-
- <part id="config">
- <title>Konfigurasjon og håndtering av Ximian Evolution</title>
- <partintro>
- <para>
- <application>Ximian Evolution</application> er meget konfigurerbart.
- Når utviklere sier dette mener de vanligvis at de ikke testet
- det grundig og har overlatt det til andre programmerere å
- "konfigurere" seg til et fungerende system. I tilfellet med
- <application>Ximian Evolution</application>, betyr "konfigurerbart",
- at, mens du kan forvente at programmet fungerer helt greit med
- standardinstillingene, er det også lett å endre oppførselen på
- en rekke forskjellige måter, slik at det møter dine behov fullt ut.
- Denne delen av boken vil beskrive denne prosessen, fra et lite
- glimt av assistenten for oppsett til en omvisning i dialoger for
- brukervalg som går mer i dybden.
- </para>
- </partintro>
-
- &CONFIG-PREFS;
- &CONFIG-SYNC;
- </part>
-
-<!-- &FAQ; Just link to the webpage -->
- &MENUREF;
- &APX-GLOSS;
- &APX-BUGS;
- &APX-AUTHORS;
-
-</book>
diff --git a/help/no/figures/calendar.png b/help/no/figures/calendar.png
deleted file mode 100644
index 1266f7b21b..0000000000
--- a/help/no/figures/calendar.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/config-cal.png b/help/no/figures/config-cal.png
deleted file mode 100644
index 5be44dc68d..0000000000
--- a/help/no/figures/config-cal.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/config-mail.png b/help/no/figures/config-mail.png
deleted file mode 100644
index 5fb06c705c..0000000000
--- a/help/no/figures/config-mail.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/contact-editor.png b/help/no/figures/contact-editor.png
deleted file mode 100644
index 988ad2f918..0000000000
--- a/help/no/figures/contact-editor.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/contact.png b/help/no/figures/contact.png
deleted file mode 100644
index 0748b30d69..0000000000
--- a/help/no/figures/contact.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/filter-assist-fig.png b/help/no/figures/filter-assist-fig.png
deleted file mode 100644
index 3240196307..0000000000
--- a/help/no/figures/filter-assist-fig.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/filter-new-fig.png b/help/no/figures/filter-new-fig.png
deleted file mode 100644
index 51fc680df9..0000000000
--- a/help/no/figures/filter-new-fig.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/full-1.png b/help/no/figures/full-1.png
deleted file mode 100644
index 84afc9d3e7..0000000000
--- a/help/no/figures/full-1.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/full-2.png b/help/no/figures/full-2.png
deleted file mode 100644
index 929e356db5..0000000000
--- a/help/no/figures/full-2.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/full-3.png b/help/no/figures/full-3.png
deleted file mode 100644
index 175fd1d970..0000000000
--- a/help/no/figures/full-3.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/full-4.png b/help/no/figures/full-4.png
deleted file mode 100644
index 45d66bb193..0000000000
--- a/help/no/figures/full-4.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/full-5.png b/help/no/figures/full-5.png
deleted file mode 100644
index 5fcfd20e45..0000000000
--- a/help/no/figures/full-5.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/full-6.png b/help/no/figures/full-6.png
deleted file mode 100644
index 484eca4903..0000000000
--- a/help/no/figures/full-6.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/full-7.png b/help/no/figures/full-7.png
deleted file mode 100644
index 8a19eaab42..0000000000
--- a/help/no/figures/full-7.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/mail-composer.png b/help/no/figures/mail-composer.png
deleted file mode 100644
index d85f632b64..0000000000
--- a/help/no/figures/mail-composer.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/mail-druid-pic.png b/help/no/figures/mail-druid-pic.png
deleted file mode 100644
index 18e29aa49d..0000000000
--- a/help/no/figures/mail-druid-pic.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/mail-inbox.png b/help/no/figures/mail-inbox.png
deleted file mode 100644
index 7659cb003a..0000000000
--- a/help/no/figures/mail-inbox.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/mainwindow-pic.png b/help/no/figures/mainwindow-pic.png
deleted file mode 100644
index 18b68c96a5..0000000000
--- a/help/no/figures/mainwindow-pic.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/newmsg.png b/help/no/figures/newmsg.png
deleted file mode 100644
index 9f2c15d025..0000000000
--- a/help/no/figures/newmsg.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/print-dest.png b/help/no/figures/print-dest.png
deleted file mode 100644
index fb1faf7d70..0000000000
--- a/help/no/figures/print-dest.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/print-preview.png b/help/no/figures/print-preview.png
deleted file mode 100644
index 51ab5e795e..0000000000
--- a/help/no/figures/print-preview.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/replymsg.png b/help/no/figures/replymsg.png
deleted file mode 100644
index 0952ba3805..0000000000
--- a/help/no/figures/replymsg.png
+++ /dev/null
Binary files differ
diff --git a/help/no/figures/vfolder-createrule-fig.png b/help/no/figures/vfolder-createrule-fig.png
deleted file mode 100644
index cc0a7abf66..0000000000
--- a/help/no/figures/vfolder-createrule-fig.png
+++ /dev/null
Binary files differ
diff --git a/help/no/menuref.sgml b/help/no/menuref.sgml
deleted file mode 100644
index 340a408847..0000000000
--- a/help/no/menuref.sgml
+++ /dev/null
@@ -1,421 +0,0 @@
-<!--
-<!DOCTYPE Appendix PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-
-<appendix id="menuref">
- <title>Quick Reference</title>
- <para>
- You might want to copy this section and tape it to the wall
- next to your computer: it's a very short summary of most of
- the things you'll want to do with
- <application>Ximian Evolution</application>.
- </para>
-
-
-<note id="shortcuts">
-<title>Custom Keyboard Shortcuts</title>
-<para>
- If you have set custom keyboard shortcuts for your desktop, (you can
- do this the control center: select
- <menuchoice><guimenu>System</guimenu><guimenuitem>Settings</guimenuitem></menuchoice>
- from your menu panel), they may interfere with Evolution keyboard
- shortcuts.
-</para>
-<para>
- For example, if you have chosen Emacs-style key bindings for your
- desktop-wide text editor, the shortcut
- <keycombo action="simul">
- <keycap>Ctrl</keycap>
- <keycap>W</keycap>
- </keycombo>
- will act as "Cut region" rather than as "Close Window" in the
- message composer.
-</para>
-</note>
-
-
-
-
- <sect1 id="quickref-open">
- <title>Opening or Creating Anything</title>
- <para>
- <variablelist>
-
-
- <varlistentry>
- <term>New Item:</term>
- <listitem>
- <para>
- Press <keycombo action="simul"> <keycap>Ctrl</keycap>
- <keycap>N</keycap> </keycombo> to open a new item
- for whatever part of <application>Ximian
- Evolution</application> you're working on. In mail,
- that means you'll create a new message. If you're
- looking at your addressbook, <keycombo
- action="simul"> <keycap>Ctrl</keycap>
- <keycap>N</keycap> </keycombo> creates a new contact
- card, and in the calendar, a new appointment.
- </para>
- </listitem>
- </varlistentry>
-
-
- <varlistentry>
- <term>Create a new folder:</term>
- <listitem>
- <para>
- <menuchoice><guimenu>File</guimenu><guisubmenu>New</guisubmenu>
- <guimenuitem>Folder</guimenuitem></menuchoice> or
- <keycombo action="simul">
- <keycap>Ctrl</keycap>
- <keycap>Shift </keycap>
- <keycap>E</keycap>
- </keycombo>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Create a new Shortcut in the Evolution Bar:</term>
- <listitem>
- <para>
- <menuchoice><guimenu>File</guimenu>
- <guisubmenu>New</guisubmenu>
- <guimenuitem>Evolution Bar Shortcut</guimenuitem> </menuchoice> or
- <keycombo action="simul">
- <keycap>Ctrl</keycap>
- <keycap>Shift</keycap>
- <keycap>S</keycap>
- </keycombo>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Create a new email message:</term>
- <listitem>
- <para>
- Use
- <menuchoice><guimenu>File</guimenu><guisubmenu>New</guisubmenu><guimenuitem>Mail
- Message</guimenuitem> </menuchoice> or
- <keycombo action="simul">
- <keycap>Ctrl</keycap>
- <keycap>Shift </keycap>
- <keycap>M</keycap>
- </keycombo>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Create a new Appointment:</term>
- <listitem>
- <para>
- <menuchoice><guimenu>File</guimenu>
- <guisubmenu>New</guisubmenu>
- <guimenuitem>Appointment</guimenuitem> </menuchoice> or
- <keycombo action="simul">
- <keycap>Ctrl</keycap>
- <keycap>Shift</keycap>
- <keycap>A</keycap>
- </keycombo>
- </para>
- </listitem>
- </varlistentry>
-
-
- <varlistentry>
- <term>Enter a new Contact:</term>
- <listitem>
- <para>
- Double-click in any blank space in the contact
- manager to create a new address card. You can also
- use
- <menuchoice><guimenu>File</guimenu>
- <guisubmenu>New</guisubmenu>
- <guimenuitem>Contact</guimenuitem> </menuchoice> or
- <keycombo action="simul">
- <keycap>Ctrl</keycap>
- <keycap>Shift</keycap>
- <keycap>C</keycap>
- </keycombo>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Create a new Task:</term>
- <listitem>
- <para>
- <menuchoice><guimenu>File</guimenu>
- <guisubmenu>New</guisubmenu>
- <guimenuitem>Task</guimenuitem> </menuchoice> or
- <keycombo action="simul">
- <keycap>Ctrl</keycap>
- <keycap>Shift</keycap>
- <keycap>T</keycap>
- </keycombo>
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </sect1>
- <sect1 id="quickref-mail">
- <title>Mail Tasks</title>
- <para>
- Here are the most frequent email tasks, and shortcuts for
- navigating your mailbox with the keyboard instead of the
- mouse:
- <variablelist>
-
-
- <varlistentry>
- <term>Send and Receive Mail:</term>
- <listitem>
- <para>
- Press <keycap>F9</keycap>, click the
- <guibutton>Send/Receive</guibutton> button in the
- toolbar, or choose
- <menuchoice><guimenu>Actions</guimenu>
- <guimenuitem>Send/Receive</guimenuitem></menuchoice>.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Navigating the Message List with the Keyboard:</term>
- <listitem>
- <para>
- Press <keycap>N</keycap> to jump to the next unread
- message. <keycap>P</keycap> goes to the previous
- unread message. Use the arrow keys to move up
- and down along the list of all messages.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Move the display up and down in the preview pane:</term>
- <listitem>
- <para>
- Press the space bar to go a page down. Press
- <keycap>Backspace</keycap> to go a page up.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Reply to a Message:</term>
- <listitem>
- <para>
- To reply to the sender of the message only:
- click <guibutton>Reply</guibutton> in the
- toolbar, or press
- <keycombo action="simul">
- <keycap>Ctrl</keycap>
- <keycap>R</keycap>
- </keycombo>
- </para>
- <para>
- To reply to the sender and all the other visible
- recipients of the message, click <guibutton>Reply to
- All</guibutton> or select the message and press
- <keycombo action="simul">
- <keycap>Shift</keycap>
- <keycap>Ctrl</keycap>
- <keycap>R</keycap>
- </keycombo>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Forward a Message:</term>
- <listitem>
- <para>
- Select the message or messages you want to forward,
- and click <guibutton>Forward</guibutton> in the
- toolbar, or press
- <keycombo action="simul">
- <keycap>Ctrl</keycap>
- <keycap>F</keycap>
- </keycombo>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Open a Message in a New Window:</term>
- <listitem>
- <para>
- Double-click the message you want to view, or select
- it and press
- <keycombo action="simul">
- <keycap>Ctrl</keycap>
- <keycap>O</keycap>
- </keycombo>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Create Filters and Virtual Folders:</term>
- <listitem>
- <para>
- Right-click on a message and select
- <guimenuitem>Create Rule From
- Message</guimenuitem>. You can also create filters and
- virtual folders in the <guimenu>Tools</guimenu> menu.
- </para>
- </listitem>
- </varlistentry>
-
-
- <varlistentry>
- <term>Add Sender to Address Book:</term>
- <listitem>
- <para>
- Right-click on a message and select <guimenuitem>Add
- Sender to Address Book</guimenuitem>. You can also
- right-click on any email address to add it to your
- address book.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
-
-
- </para>
- </sect1>
- <sect1 id="quickref-cal">
- <title>Calendar</title>
- <para>
- <variablelist>
-
- <varlistentry>
- <term>Create a new Appointment:</term>
- <listitem>
- <para>
- <menuchoice><guimenu>File</guimenu>
- <guisubmenu>New</guisubmenu>
- <guimenuitem>Appointment</guimenuitem> </menuchoice> or
- <keycombo action="simul">
- <keycap>Ctrl</keycap>
- <keycap>Shift</keycap>
- <keycap>A</keycap>
- </keycombo>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Create a new Task:</term>
- <listitem>
- <para>
- <menuchoice><guimenu>File</guimenu>
- <guisubmenu>New</guisubmenu>
- <guimenuitem>Task</guimenuitem> </menuchoice> or
- <keycombo action="simul">
- <keycap>Ctrl</keycap>
- <keycap>Shift</keycap>
- <keycap>T</keycap>
- </keycombo>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term></term>
- <listitem>
- <para>
- <tip id="new-appt">
- <title>New Appointments Fast</title>
- <para>
- Click on any blank spot in the calendar and start
- typing to create a new appointment entry.
- </para>
- </tip>
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- </para>
- </sect1>
- <sect1 id="quickref-contact">
- <title>Addressbook</title>
- <para>
- Here are shortcuts for the most frequent addressbook actions:
- <variablelist>
- <varlistentry>
- <term>Edit a Contact:</term>
- <listitem>
- <para>
- You can edit a contact two ways:
- <itemizedlist>
- <listitem>
- <para>
- Click once on the person's address card and you can
- edit the person's properties all in the same window.
- </para>
- </listitem>
- <listitem>
- <para>
- Double-click on the contact's card and alter their details.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <variablelist>
- <varlistentry>
- <term>Deleting a Contact:</term>
- <listitem>
- <para>
- Right click on a contact and click <guilabel>Delete</guilabel>
- or select a contact and press the <guibutton>Delete</guibutton>
- on the <guilabel>toolbar</guilabel>.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
-
- <variablelist>
- <varlistentry>
- <term>Email a Contact:</term>
- <listitem>
- <para>
- Right click on a contact and select
- <guilabel>Send message to contact</guilabel>.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <variablelist>
- <varlistentry>
- <term>Creating a New Contact:</term>
- <listitem>
- <para>
- Double-click in any blank space in the contact
- manager to create a new address card. You can also
- use <menuchoice><guimenu>File</guimenu>
- <guisubmenu>New</guisubmenu>
- <guimenuitem>Contact</guimenuitem> </menuchoice> or
- <keycombo action="simul">
- <keycap>Ctrl</keycap>
- <keycap>Shift</keycap>
- <keycap>C</keycap>
- </keycombo>
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </sect1>
-</appendix> \ No newline at end of file
diff --git a/help/no/preface.sgml b/help/no/preface.sgml
deleted file mode 100644
index 9637beaf4c..0000000000
--- a/help/no/preface.sgml
+++ /dev/null
@@ -1,83 +0,0 @@
-<!--
-<!DOCTYPE preface PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
- <preface id="introduction">
- <title>About this Book</title>
- <sect1 id="organization">
- <title>Organization</title>
- <para>
- This book is divided into two parts, with several
- appendices. The first part is a <link linkend="usage">guided
- tour</link>, which will explain how to use
- <application>Evolution</application>. If you are new to
- <application>Evolution</application> or to groupware in
- general, this section is for you. The second section, covering
- <link linkend="config">configuration</link>, is targeted at
- more advanced users, but anyone who wants to change the way
- <application>Evolution</application> looks or acts can benefit
- from reading it.
- </para>
- </sect1>
-
- <sect1 id="typography">
- <title>Typographical conventions</title>
- <para>
- In this book, we'll mark some words with special typography:
- <simplelist>
- <member><application>Applications</application></member>
- <member><command>Commands</command> you type at the command line</member>
- <member><guilabel>Labels</guilabel> for buttons and other portions of the graphical interface</member>
-
- <member> Menu selections look like this:
- <menuchoice>
- <guimenu>Menu</guimenu>
- <guisubmenu>Submenu</guisubmenu>
- <guimenuitem>Menu Item</guimenuitem>
- </menuchoice>
- </member>
- <member><guibutton>Buttons</guibutton> you can
- click</member> <member><userinput>Anything you type
- in</userinput></member> <member><computeroutput>Text
- output from a computer</computeroutput></member>
- <member><glossterm linkend="apx-gloss">Words</glossterm>
- that are defined in the <xref linkend="apx-gloss">.</member>
- </simplelist>
-</para>
-<para>
-We'll provide assorted bits of additional information in tips set off from the rest of the book, as well.
-
- <tip id="example-tip">
- <title>Tip</title>
- <para>
- Tips and bits of extra information will look like
- this.
- </para>
- </tip>
-</para>
-
-<para>
-Examples are also set off from the rest of the text. They look like this:
-
- <example>
- <title>Example Example</title>
- <para>
- This is what an example looks like. We'll provide
- examples for some of the more complicated tasks you
- might be performing.
- </para>
- </example>
-</para>
-<para>
-Lastly, we'll have warnings, in cases where you should be careful:
-
- <warning id="example-warning">
- <title>Example Warning</title>
- <para>
- This is what a warning looks like. If there's a chance
- you'll run into trouble, we'll warn you beforehand.
- </para>
- </warning>
- </para>
- </sect1>
-</preface>
-
diff --git a/help/no/topic.dat b/help/no/topic.dat
deleted file mode 100644
index 6e9afad2ef..0000000000
--- a/help/no/topic.dat
+++ /dev/null
@@ -1,10 +0,0 @@
-index.html Innholdsfortegnelse
-introduction.html Hva er Evolution?
-usage-mainwindow.html Kom i gang
-usage-summary.html Evolution sammendrag
-usage-mail.html Å hente og sende e-post
-usage-contact.html Bruk av kontakter
-usage-calendar.html Håndtering av avtaler
-config-prefs.html Konfigurasjon av Evolution
-menuref.html Hurtigreferanse
-apx-gloss.html Ordliste
diff --git a/help/no/usage-calendar.sgml b/help/no/usage-calendar.sgml
deleted file mode 100644
index 4a1745e55a..0000000000
--- a/help/no/usage-calendar.sgml
+++ /dev/null
@@ -1,561 +0,0 @@
-<!--
-<!DOCTYPE Chapter PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-
-<chapter id="usage-calendar">
- <title>Managing your Schedule</title>
-
- <para>
- This chapter will show you how to use the Ximian Evolution
- Calendar to manage your schedule alone or in conjunction with
- peers.
- </para>
-
- <sect1 id ="usage-calendar-view">
- <title>Ways of Looking at your Calendar</title>
- <para>
- The toolbar offers you four different views of your calendar:
- <itemizedlist>
- <listitem>
- <para>
- Day
- </para>
- </listitem>
- <listitem>
- <para>
- Work Week
- </para>
- </listitem>
- <listitem>
- <para>
- Week
- </para>
- </listitem>
- <listitem>
- <para>
- Month
- </para>
- </listitem>
- </itemizedlist>
-
- Press the calendar-shaped buttons on the right side of the toolbar to
- switch between views.
-
- You can also select a range of
- days&mdash; three days, ten days, or a fortnight if you want
- &mdash; in the small calendar at the upper right. To do this, simply click and drag on the days that you wish to view in your calendar.
-
- </para>
- <para>
- The <guibutton>Prev</guibutton> and <guibutton>Next</guibutton>
- buttons will move you forward and back in your calendar pages.
- If you're looking at only one day, you'll see tomorrow's page,
- or yesterday's. If you're looking at your calendar by week or
- month, you'll move around by just that much.
- To come back to today's listing, click the
- <guibutton>Today</guibutton> button in the toolbar.
- </para>
- <para>
- To visit a specific date's calendar entries, click
- <guibutton>Go To</guibutton> and select the date in the dialog
- box that appears.
- </para>
-
- </sect1>
- <sect1 id="usage-calendar-apts">
- <title>Scheduling With the Evolution Calendar</title>
- <para>
- Of course, you'll want to use the calendar to do more than find
- out what day it is. This section will tell you how to schedule
- appointments, set alarms, and determine appointment recurrence.
- </para>
-
- <sect2 id="usage-calendar-apts-basic">
- <title>Creating appointments</title>
- <para>
- To create a new appointment, select
- <menuchoice>
- <guimenu>File</guimenu>
- <guisubmenu>New</guisubmenu>
- <guimenuitem>Appointment</guimenuitem>
- </menuchoice>
- or click the <guibutton>New Appointment</guibutton> button on the left end
- of the toolbar. The <interface>New Appointment</interface>
- dialog will pop up with the menu bar, tool bar, and
- window full of choices for you.
- </para>
- <tip id="new-appointment-shortcut">
- <title>Shortcut</title>
- <para>
- If you don't need to enter more information than the date
- and time of the appointment, you just click in any blank
- space in the calendar and start typing. You can enter other
- information later with the appointment editor.
- </para>
- </tip>
-
- <para>
- Your appointment must have a starting and ending date &mdash; by
- default, today &mdash; but you can choose whether to give it
- starting and ending times or to mark it as an <guilabel>All
- day event</guilabel>. An <guilabel>All day event</guilabel>
- appears at the top of a day's appointment list, in the grey header under the date, rather than inside
- it. That makes it easy to have appointments that overlap and fit
- inside each other. For example, a conference might be an all
- day appointment, and the meetings at the conference would be timed
- appointments. Of course, appointments with specific starting and ending
- times can also overlap. When they do they're displayed as
- multiple columns in the day view of the calendar.
- </para>
- <para>
- <application>Evolution</application> supports the use of timezones. If you share calendar files with friends or co-workers, it is quite possible you will need to configure your timezone. To configure your timezone:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Click
- <menuchoice>
- <guimenu>Tools</guimenu>
- <guimenuitem>Calendar Settings</guimenuitem>
- </menuchoice>
- </para>
- </listitem>
- <listitem>
- <para>
- Click the <guibutton>Globe</guibutton> button in the <guilabel>Time</guilabel> section, located in the <guilabel>General</guilabel> tab.
- </para>
- </listitem>
- <listitem>
- <para>
- Each red dot represents a major city. Click a dot and click <guibutton>OK</guibutton> to select your time zone.
- </para>
- </listitem>
- </orderedlist>
- </para>
- <para>
- You can also configure timezone information specific to Start and End time in each appointment. To do that, simply create a new appointment and click on a globe to customize the timezone that the time exists in.
- </para>
- <note>
- <title>Multiple Simultanious Appointments</title>
- <para>
- If you create calendar appointments that overlap,
- <application>Evolution</application> will display them side
- by side in your calendar. However,
- <application>Evolution</application> cannot help you do
- multiple things at once.
- </para>
- </note>
- <para>
- You can have as many
- <guilabel>Alarms</guilabel>, any time prior to the appointment
- you've scheduled. You can have one alarm of each of the following types:
- <variablelist>
- <varlistentry>
- <term><guilabel>Display:</guilabel></term>
- <listitem>
- <para>
- A window will pop up on your screen to remind you of
- your appointment.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Audio:</guilabel></term>
- <listitem>
- <para>
- Choose this to have your computer deliver a sound
- alarm.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Program:</guilabel></term>
- <listitem>
- <para>
- Select this if you would like to run a program as a
- reminder. You can enter its name in the text field,
- or find it with the <guibutton>Browse</guibutton>
- button.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- </para>
- <para>
- <guilabel>Classification</guilabel>
- only applies to calendars on a
- network. <guilabel>Public</guilabel> is the default category,
- and a public appointment can be viewed by anyone on the calendar
- sharing network. <guilabel>Private</guilabel> denotes one
- level of security, and <guilabel>Confidential</guilabel> an even
- higher level.
- </para>
- <para>
- <application>Evolution</application> can handle not only time that you're busy, but free time. This can be useful if you're on a network sharing calendar files. You can easily compare schedules with other people, allowing easy setup of a RSVP.
- </para>
- <para>
- To set your appointment to be free or busy, simply click the box in the <guilabel>Show Time As</guilabel> section in the <guilabel>Appointment Editor</guilabel>.
- </para>
- <para>
- <application>Evolution</application> lets you categorize your
- appointments, which can help if you lead a busy life. The bottom
- section of the <guilabel>Appointment</guilabel> tab is where your
- categorization is done.
- </para>
-
- <tip>
- <title>Adding a New Appointment Category</title>
- <para>
- You can add a new category to your category list by clicking on
- <guibutton>Edit Master Category List</guibutton> and single-clicking
- on <guilabel> Click here to add a category</guilabel>.
- </para>
- </tip>
-
- <para>
- The purpose of categories is to let you view all appointments which have
- similar activities. To do this, change <guilabel>Any field contains</guilabel>
- to <guilabel>Has category</guilabel> and enter your category at right.
- </para>
-
- <para>
- Clicking on the <guibutton>Categories</guibutton> button opens up the category
- list. To associate a category to an appointment, simply click the check box.
- </para>
- <para>
- Once you've selected your categories, click <guibutton>OK</guibutton> to
- assign these categories to the appointment. The categories you selected are now
- listed in the text box to the right of the <guibutton>Categories...</guibutton>
- button.
- </para>
-
- <para>
- The <guilabel>Recurrence</guilabel> tab lets you describe
- repetition in appointments ranging from once every day up to once
- every 100 years. You can then choose a time and date when the
- appointment will stop recurring, and, under
- <guilabel>Exceptions</guilabel>, pick individual days when the
- appointment will <emphasis>not</emphasis> recur. Make your
- selections from left to right, and you'll form a sentence:
- "Every two weeks on Monday and Friday until January 3, 2003"
- or "Every month on the first Friday for 12 occurrences."
- </para>
-
- <para>
- Once you're done with all those settings, click on the disk
- icon in the toolbar to save and close the appointment editor window.
- If you want, you can alter an appointment
- summary in the calendar view by clicking on it and typing. You
- can change other settings by right-clicking on the appointment then
- choosing <guimenuitem>Edit this Appointment</guimenuitem>.
- </para>
- </sect2>
- <sect2 id="usage-calendar-rsvp">
- <title>Sending an RSVP with the Calendar</title>
- <para>
- <application>Evolution</application> can be used to schedule
- group meetings and help you manage responses to meeting
- requests.
- </para>
- <para>
- When you create a meeting or group appointment, you can
- specify the attendees in several categories, such as "chair"
- or "required." When you save the appointment listing, each
- attendee will be sent an email with the appointment
- information and gives them the option to respond.
- </para>
- <para>
- To schedule a meeting:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Select
- <menuchoice>
- <guimenu>Actions</guimenu> <guimenuitem>Schedule
- Meeting</guimenuitem> </menuchoice>. The
- <guilabel>Scheduling</guilabel> and
- <guilabel>Meeting</guilabel> tabs open.
- </para>
- </listitem>
- <listitem>
- <para>
- If you have multiple Evolution identities, choose the
- one you'll use by selecting an item in the
- <guilabel>Sent By</guilabel> field.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the space labelled <guilabel>Click here to add an
- attendee</guilabel> to enter the names and email
- addresses of people you will invite, or click the
- <guibutton>Invite Others</guibutton> to select them from
- your addressbook.
- </para>
- </listitem>
- <listitem>
- <para>
- Save the Appointment.
- </para>
- </listitem>
- </orderedlist>
- An email is now sent out to all the recipients, inviting them to your event.
- </para>
- </sect2>
- <sect2 id="replying-to-rsvp">
- <title>Replying to a Meeting Request</title>
- <para>
- Meeting requests are sent as iCal attachments. To view or
- respond to one, click on the attachment icon and view it
- inline in the mail window. All the details are shown about
- the event including time and dates. Then you can choose how
- to reply to the RSVP. Your choices are:
- <itemizedlist>
- <listitem>
- <para>
- Accept
- </para>
- </listitem>
- <listitem>
- <para>
- Tentatively Accept
- </para>
- </listitem>
- <listitem>
- <para>
- Decline
- </para>
- </listitem>
- </itemizedlist>
- Click <guibutton>OK</guibutton> and an email will be sent to
- the organizer with your answer. The event will also be added
- to your calendar if you accept.
- </para>
- </sect2>
-
- <sect2 id="recieving-rsvp-response">
- <title>Getting Responses to Meeting Requests</title>
- <para>
- Once you get a reply to your meeting invitation, you'll need
- to view it inline in the email. Click the attachment and
- select <guibutton>View Inline</guibutton>. At the bottom, you
- can click <guibutton>OK</guibutton> to update your attendee
- list.
- </para>
- </sect2>
-
-<!-- ############UNIMPLEMENTED FEATURES ###################
-
- <sect2 id="usage-calendar-apts-group">
- <title>Appointments for Groups</title>
- <para>
- You can use <application>Evolution</application> to mark a
- meeting request on another person's calendar. To do it, click
- <guibutton>New</guibutton> in the calendar toolbar, or select
- <menuchoice> <guimenu>File</guimenu>
- <guisubmenu>New</guisubmenu>
- <guimenuitem>Appointment</guimenuitem> </menuchoice> to bring
- up the <interface>new appointment</interface> window. Then
- describe the appointment as you would any other. When you are
- ready to send the invitation <guibutton>OK</guibutton>
- <application>Evolution</application> will automatically send
- email to each person on the request list, notifying of the
- time and date of the meeting you have requested with them. In
- addition, it will mark the appointment on your calendar and on
- theirs as tentative, rather than a confirmed, appointment.
- </para>
- <para>
- To mark a tentative appointment as confirmed, click once on the
- appointment in the <interface>calendar view</interface> to select
- it, and then choose <guimenuitem>Appointment
- Properties</guimenuitem> from the <guimenu>Settings</guimenu>
- menu. In the <interface>Appointment Properties</interface> dialog
- window, click the "tentative" button to De-select the
- appointment.
- </para>
- <para>
- When your meeting attendees get the email inviting them to the
- meeting, they'll be able to enter the information into their
- calendars and let you know if they'll be able to attend; if
- they use <application>Ximian Evolution</application> or
- another iCal compliant mail client, they can do this with just
- one click. When you get a response from them, it will include
- an iCal attachment. Opening and accepting this attachment will
- change the meeting data in your calendar to indicate that they
- have responded to your invitation, and whether they will be in
- attendance.
- </para>
- </sect2>
-
-
- <sect2 id="usage-calendar-apts-privs">
- <title>Scheduling privileges</title>
- <para>
- There are several levels of scheduling privileges. You
- can set whether people can see your calendar, whether they
- can request meetings or appointments, and whether they can
- create appointments. This section may have to be deleted,
- because I don't know if we are going to support privileges
- at all.
- </para>
- </sect2>
- ########## END UNIMPLEMENTED FEATURESET ############ -->
-
- </sect1>
-
- <sect1 id="usage-calendar-todo">
- <title>The Task Pad</title>
- <para>
- The Task Pad, located in the lower right corner of the
- calendar, lets you keep a list of tasks separate from your
- calendar appointments. You can use the list
- in a larger window by choosing the <guibutton>Tasks</guibutton>
- button in the shortcut bar or in the folder tree.
- </para>
- <para>
- To record a new task, click the <guibutton>Add</guibutton>
- button in the toolbar. <application>Evolution</application>
- will pop up a small window with five items in it:
-
- <variablelist>
- <varlistentry>
- <term> <guilabel>Summary:</guilabel></term>
- <listitem>
- <para>
- The description you enter here will appear in the To Do
- list itself.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guilabel>Due Date:</guilabel></term>
- <listitem>
- <para>
- Decide when this item is
- due. You can either type in a date and time, or select one from
- the <guibutton>Calendar</guibutton> and time drop-down menus.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Start Date:</guilabel></term>
- <listitem>
- <para>
- The date you intend to start working.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term> <guilabel>Description:</guilabel></term>
- <listitem>
- <para>
- If you wish, you can keep a more detailed description of
- the item here. For example, you can note that a task is
- in progress, and display how close it is to completion.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Classification:</guilabel></term>
- <listitem>
- <para>
- Sets who will see it if your calendar is shared.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- <para>
- There are more options in the <guilabel>Details</guilabel> tab such as priority and progress settings.
- </para>
- <para>
- Once you've added a task to your to-do list, its summary
- appears in the <guilabel>Summary</guilabel> section of task
- list. To view or edit a detailed description of an item,
- double-click on it, or right click on it and select <guibutton>Open</guibutton>. You can delete items by selecting
- them and clicking on the <guibutton>Delete</guibutton> button.
- </para>
- <para>
- The list of tasks is sorted in a similar way to the list of
- email messages in <application>Ximian Evolution
- Mail</application>. Click once on the message headers to change
- the direction and type of sorting, or right-click to add or
- remove columns from the display.
- </para>
- <sect2 id="task-folders">
- <title>Folders for Your Tasks</title>
- <para>
- Like any other component in
- <application>Evolution</application>, you can create a folder
- to help organize your tasks. To do this:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Open the <guilabel>Folders Bar</guilabel>.
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guibutton>Tasks</guibutton>.
- </para>
- </listitem>
- <listitem>
- <para>
- Right click on <guibutton>Tasks</guibutton>.
- </para>
- </listitem>
- <listitem>
- <para>
- Click <menuchoice><guimenuitem>Create New Folder</guimenuitem></menuchoice>.
- </para>
- </listitem>
- <listitem>
- <para>
- Enter the folder name.
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guibutton>OK</guibutton>
- </para>
- </listitem>
- </orderedlist>
- </para>
- </sect2>
- </sect1>
-
- <sect1 id="usage-calendar-multiple">
- <title>Multiple Calendars</title>
- <para>
- <application>Evolution</application> permits you to have and
- maintain multiple calendars. This is useful if you maintain
- schedules for other people, if you are responsible for resource
- or room allocation, or if you have multiple personalities.
- </para>
-
- <example>
- <title>Keeping Multiple Calendars</title>
- <para>
- Lucy, the office manager for a small company, has one calendar
- for her own schedule. She maintains one for the conference
- room, to schedule meetings. Next to that, she maintains a
- calendar that reflects when consultants are going to be on
- site, and another that keeps track of when the Cubs are
- playing.
- </para>
- </example>
- <para>
- To create a new calendar, select
- <menuchoice>
- <guimenu>File</guimenu> <guisubmenu>New</guisubmenu>
- <guimenuitem>Folder</guimenuitem>
- </menuchoice>.
- You'll need to tell the <guilabel>New Folder</guilabel> dialog that the new folder should be of the calendar type. You can place the calendar in any calendar folder and access it
- from the folder view.
- </para>
- <para>
- Each calendar folder can hold only one calendar.
- </para>
- </sect1>
-</chapter>
diff --git a/help/no/usage-contact.sgml b/help/no/usage-contact.sgml
deleted file mode 100644
index dc11b4bd0a..0000000000
--- a/help/no/usage-contact.sgml
+++ /dev/null
@@ -1,609 +0,0 @@
-<!--
-<!DOCTYPE Chapter PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-<chapter id="usage-contact">
- <title>Working with Your Contacts</title>
- <para>
- This chapter will show you how to use the
- <application>Evolution</application> addressbook to organize
- any amount of contact information, share addresses over a
- network, and several ways to save time with everyday tasks. To
- learn about configuring the addressbook, see <xref
- linkend="config-prefs-contact">. You can import contacts from
- other contact management tools with the Import tool by
- selecting
- <menuchoice><guimenu>File</guimenu><guimenuitem>Import</guimenuitem></menuchoice>,
- or by mailing them to yourself as vCard attachments.
- </para>
-
- <para>
- The toolbar for the addressbook is quite simple.
- <itemizedlist>
- <listitem><para>
- Click <guibutton>New Contact</guibutton> to create a new card, or double-click
- in a blank space in the contact list.
- </para></listitem>
-
- <listitem><para>
- Click <guibutton>New List</guibutton> to create a new card, or double-click
- in a blank space in the contact list.
- </para></listitem>
-
- <listitem><para> The <guiicon>printer</guiicon> icon sends one
- or more of your cards to the printer. </para></listitem>
-
- <listitem><para> The <guiicon>stop sign</guiicon> icon stops loading
- contact data from the network. This button is only
- relevant if you are looking at contact information on a
- network. </para></listitem>
- </itemizedlist>
- </para>
-
- <para>
- Your contact information fills the rest of the display. Move
- through the cards alphabetically with the buttons and the
- scrollbar to the right of the window. Of course, if you have
- more than a few people listed, you'll want some way of finding
- them more quickly, which is why there's a search feature.
- </para>
-
- <sect1 id="usage-contact-cards">
- <title>The Contact Editor</title>
- <para>
- To delete a contact:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Click once on the contact.
- </para>
- </listitem>
- <listitem>
- <para>
- Press the <guibutton>Delete</guibutton> button.
- </para>
- </listitem>
- </orderedlist>
- </para>
- <para>
- If you want to add or change cards, you'll use the contact
- editor. To change a card that already exists, double click on
- it to open the contact editor window. If you want to create a new
- card, clicking the <guibutton>New</guibutton> button in the
- toolbar will open the same window, with blank entry boxes for
- you to fill in.
- </para>
-
- <para>
- The contact editor window has two tabs,
- <guilabel>General</guilabel>, for basic contact information, and
- <guilabel>Details</guilabel>, for a more specific description of
- the person. In addition, it contains a <guimenu>File</guimenu>
- menu and a toolbar with three items: <guilabel>Save and
- Close</guilabel>, <guilabel>Print</guilabel>, and
- <guilabel>Delete</guilabel>.
- </para>
-
- <figure id="usage-contact-editor-fig">
- <title>Evolution Contact Editor</title>
- <screenshot>
- <screeninfo>Evolution Contact Editor</screeninfo>
- <mediaobject><imageobject><imagedata
- fileref="figures/contact-editor" format="png" srccredit="Aaron
- Weber">
- </imageobject></mediaobject>
- </screenshot>
- </figure>
-
- <para> The <guilabel>General</guilabel> tab has seven sections,
- each with an icon: a face, for name and company; a telephone
- for phone numbers; an envelope for email address; a globe for
- web page address; a house for postal address; a file folder
- for contacts, and a briefcase for categories.
- </para>
- <para>
- <variablelist>
-
- <varlistentry>
- <term>Full Name</term>
- <listitem>
- <para>
- The <guilabel>Full Name</guilabel> field has two
- major features:
- <itemizedlist>
- <listitem>
- <para>
- You can enter a name into the <guibutton>Full
- Name</guibutton> field, but you can also click the
- <guibutton>Full Name</guibutton> button to bring
- up a small dialog box with a few text boxes
- <variablelist>
- <varlistentry>
- <term><guilabel>Title: </guilabel></term>
- <listitem> <para>
- Enter an honorific or select one from the menu.
- </para></listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>First: </guilabel></term>
- <listitem> <para>
- Enter the first, or given, name.
- </para></listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Middle: </guilabel></term>
- <listitem> <para>
- Enter the middle name or initial, if any.
- </para></listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Last: </guilabel></term>
- <listitem> <para>
- Enter the last name (surname).
- </para></listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Suffix: </guilabel></term>
- <listitem> <para>
- Enter suffixes such as "Jr." or "III."
- </para></listitem>
- </varlistentry>
- </variablelist>
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- The <guilabel>Full Name</guilabel> field also
- interacts with the <guilabel>File As</guilabel>
- box to help you organize your contacts.
- </para>
- <para>
- To see how it works, type a name in the
- <guilabel>Full Name</guilabel> field. As an example,
- we'll use the Ximian mascot, <userinput>Rupert
- T. Monkey</userinput>. You'll notice that the
- <guilabel>File As</guilabel> field also fills in,
- but in reverse: <computeroutput>Monkey,
- Rupert</computeroutput>. You can pick
- <computeroutput>Rupert Monkey </computeroutput> from
- the drop-down, or type in your own, such as
- <userinput> T. Rupert Monkey </userinput>.
- </para>
- <tip>
- <title>Filing Suggestion</title>
- <para>
- Don't enter something entirely different from the
- actual name, since you might forget that you've filed
- Rupert's information under "F" for "Fictitious Ximian
- Employee."
- </para>
- </tip>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Multiple Values for Fields:</term>
- <listitem>
- <para>
- If you click on the downward pointing triangle buttons
- next to the <guilabel>Primary Email</guilabel> field,
- you can also choose <guilabel>Email 2</guilabel> and
- <guilabel>Email 3</guilabel>. Although the contact
- editor will only display one of those at any given
- time, <application>Evolution</application> will store
- them all. Entries that have information in them have
- a check mark next to them. The buttons next to the
- telephone and postal address fields work in the same
- way.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- <para>
- The last item in the <guilabel>General</guilabel> tab is the
- <guilabel>Categories</guilabel> organization tool; for
- information on that, read <xref
- linkend="usage-contact-organize">.
- </para>
- <para>
- The <guilabel>Details</guilabel> tab is much simpler:
- <itemizedlist>
- <listitem>
- <para>
- The briefcase - Describes the person's professional life
- </para>
- </listitem>
- <listitem>
- <para>
- The face - Describes the person's personal life
- </para>
- </listitem>
- <listitem>
- <para>
- The globe - Miscellanious notes
- </para>
- </listitem>
- </itemizedlist>
-
- <tip>
- <title>Contact Shortcuts</title>
- <para>
- You can add cards from within an email message or calendar
- appointment. While looking at an email, right-click on
- any email address or message, and choose
- <guimenuitem>Create Card for this Address</guimenuitem> or
- <guimenuitem>Create Card for this Sender</guimenuitem>
- from the menu.
- </para>
- </tip>
- </para>
- </sect1>
-
- <sect1 id="contact-search">
- <title>Searching for Contacts</title>
- <para>
- <application>Evolution</application> allows searching through contacts
- quickly and easily.
- </para>
- <para>
- To search through contacts:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Select your search focus in the search bar.
- </para>
- </listitem>
- <listitem>
- <para>
- Enter your query.
- </para>
- </listitem>
- <listitem>
- <para>
- Press return to search.
- </para>
- </listitem>
- </orderedlist>
- </para>
- <para>
- You can refine searches by doing several in
- succession, or start over by pressing the <guibutton>Show
- All</guibutton> button.
- </para>
- <para>
- If there are no matches, the card display will be
- blank. When you'd like to see all the cards again, press
- <guilabel>Show All</guilabel>.
- </para>
- <example id="contact-quicksearch-ex">
- <title>Refining a Quick Search</title>
- <para>
- Tom comes back from lunch and finds a note on his
- keyboard: "Curtis in sales called for you, but he didn't
- leave a number, and I forgot to write down the name of the
- company he works for. He said it was important, though."
- Tom is not at all annoyed.
- </para>
- <para>
- He opens his contacts folder, and runs a quick search for
- "Curtis." There are eighteen different people with that name
- in the file. He then enters "Sales," and
- <application>Evolution</application> narrows it down to the
- right Curtis. He only becomes annoyed when he discovers that
- the call was not actually important.
- </para>
- </example>
-
- <para>
- To perform a complex search through your contacts:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Open
- <menuchoice>
- <guimenu>Tools</guimenu>
- <guimenuitem>Search for contacts</guimenuitem>
- </menuchoice>
- </para>
- </listitem>
- <listitem>
- <para>
- Name the rule in the <guilabel>Rule Name</guilabel> field.
- </para>
- </listitem>
- <listitem>
- <para>
- Setup your criteria information in the <guilabel>If</guilabel> section.
- </para>
- </listitem>
- <listitem>
- <para>
- If you want to add more critera, click the <guibutton>Add
- Criterion</guibutton> button.
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guibutton>Search</guibutton>.
- </para>
- </listitem>
- </orderedlist>
- </para>
- <para>
- To show all your contacts, select <guibutton>Show All</guibutton> in the
- <guilabel>Search Bar</guilabel> or search with an empty query.
- </para>
-
- </sect1>
-
- <sect1 id="usage-contact-organize">
- <title>Organizing your Addressbook</title>
- <para>
- Organizing your addressbook is a lot like organizing your
- mail. You can have folders and searches the same way you can
- with mail, but the addressbook does not allow Virtual Folders. It
- does, however, allow each card to fall under several
- categories, and allow you to create your own categories. To
- learn about categories, read <xref
- linkend="usage-contact-organize-group-category">.
- </para>
-
-<!-- UNIMPLEMENTED FEATURE
- <para>
- Another useful <application>Evolution</application> feature is
- its ability to recognize when people live or work together. If
- several people in your addressbook share an address, and you
- change the address for one of them,
- <application>Evolution</application> will ask you if you wish to
- change the address for all of them, or just for one.
- </para>
--->
-
- <sect2 id="usage-contact-organize-group">
- <title>Groups of contacts</title>
- <para>
- <application>Evolution</application> offers two ways for you
- to organize your cards. The first way is to use folders;
- this works the same way mail folders do. For more
- flexibility, you can also mark contacts as elements of
- different categories. To better integrate with email tools,
- you can also create lists of contacts that you can send mail
- to as a single person.
- </para>
-
- <sect3 id="usage-contact-organize-group-folder">
- <title>Grouping with Folders</title>
- <para>
- The simplest way to group address cards is to use folders.
- By default, cards start in the
- <guilabel>Contacts</guilabel> folder. If you've read <xref
- linkend="usage-mainwindow"> then you already know that you
- can create a new folder by selecting
- <menuchoice>
- <guimenu>File</guimenu>
- <guisubmenu>New</guisubmenu>
- <guimenuitem>Folder</guimenuitem>
- </menuchoice>
- and that you can put new folders anywhere you like. Just
- like with mail, cards must be in a card folder, and no card
- can be in two places at once. If you want more
- flexibility, try <xref
- linkend="usage-contact-organize-group-category">.
- </para>
- <para>
- To put a card into a folder, just drag it there from the
- folder view. Remember that contact cards can only go in
- contact folders, just like mail can only go in mail folders,
- and calendars in calendar folders.
- </para>
- </sect3>
-
- <sect3 id="usage-contact-organize-group-category">
- <title>Grouping with Categories</title>
- <para>
- The other way to group cards is to mark them as belonging
- to different categories.
- That means that you
- can mark a card as being in several categories or no
- category at all. For example, I put my friend Matthew's
- card in the "Business" category, because he works with me,
- the "Friends" category, because he's also my friend, and
- the "Frequent" category, because I call him all the time
- and can never remember his phone number.
- </para>
- <para>
- To mark a card as belonging to a category, click the
- <guibutton>Categories</guibutton> button at the lower
- right. From the dialog box that appears, you can check as
- many or as few categories as you like.
- </para>
-
- <!-- Feature Not Implemented
- <para>
-
- If the master list of categories doesn't suit you, you can
- add your own. Just enter the new category's name in the
- text box, then click <guibutton>Categories</guibutton> and
- choose <guilabel>Add to Master List</guilabel> in the
- window that appears.
- </para>
- -->
-
- </sect3>
-
- <sect3 id="usage-contact-organize-group-list">
- <title>Creating a List of Contacts</title>
- <para>
- To create a list of contacts:
-
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Open the list creation dialog box by clicking the
- <guibutton>New List</guibutton> button or selecting
- <menuchoice>
- <guimenu>
- File
- </guimenu>
- <guisubmenu>
- New
- </guisubmenu>
- <guimenuitem>
- Contact List
- </guimenuitem>
- </menuchoice>.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Enter a name for the list.
- </para>
- </listitem>
- <listitem>
- <para>
- Enter names or email addresses of contacts, or just
- drag contacts from the main window into the list.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Choose whether you would like to hide the email
- addresses when you send a message to the list.
- Unless it is a very small list, it is recommended
- that you leave the addresses hidden. This is the
- same thing as using the "Bcc:" feature discussed in
- <xref linkend="usage-mail-getnsend-send-to-types">.
- </para>
- </listitem>
-
- </orderedlist>
- </para>
- <para>
- When you are done, click <guibutton>OK</guibutton>. The
- list will appear as a contact card, which you can use as
- you would any other. That includes emailing the list to
- another person, and, of course, sending email to the list.
- </para>
- <para>
- To mail the list, open a new email and type the name you
- chose for the list. Ximian Evolution will address the
- message to the entire list when you send it. You can also
- right-click on the list's address card in the Addressbook
- and select <guimenuitem>Send Message to List</guimenuitem>.
- </para>
- </sect3>
-
-
- </sect2>
- </sect1>
-
-<!-- we need a LDAP server up for me to test this -->
- <sect1 id="usage-contact-sharing">
- <title>Sharing your Cards</title>
- <para>
- If you keep your cards on a network using an <glossterm
- linkend="ldap">LDAP</glossterm> server, you can share access to
- them, browse other peoples addressbooks, or maintain a shared set of
- contact information for your company or your department. This
- is the sort of feature you'll want to use if your company has a
- list of vendors and clients that needs constant updating. If
- you share calendars as well as addressbooks, people can avoid
- duplicating work and keep up to date on developments within
- their workgroup or across the entire company.
- </para>
-
- <example id="usage-contact-sharing-ex">
- <title>Sharing Address Cards and Calendar Data</title>
- <para>
- Ray wants to schedule a meeting with Company X, so he
- checks the network for the Company X address card so he
- knows whom to call there. Since his company also shares
- calendars, he then learns that his co-worker Deanna has
- already scheduled a meeting with Company X next Thursday.
- He can either go to the meeting himself or ask Deanna to
- discuss his concerns for him. Either way, he avoids
- scheduling an extra meeting with Company X.
- </para>
- </example>
- <para>
- Of course, you don't want to share all of your cards&mdash; why
- overload the network with a list of babysitters or tell
- everyone in the office you're talking to new job prospects? If
- you keep cards on your own computer, you can decide which items
- you want to make accessible to others.
- </para>
- <para>
- To learn how to add a remote directory to your available
- contact folders, see <xref linkend="config-prefs-contact">.
- Once you have a connection, the network contacts folder or
- folders will appear inside the <guilabel>External
- Directories</guilabel> folder in the folder bar. It will work
- exactly like a local folder of cards, with the following
- exceptions:
- <itemizedlist>
-
- <listitem>
- <para>
- Network folders are only available when you are
- connected to the network. If you use a laptop or have a
- modem connection, you may wish to copy or cache the
- network directory. You do this by dragging and dropping your desired contacts into the local contacts list.
- </para>
- </listitem>
-
- <listitem>
- <para>
- To prevent excess network traffic,
- <application>Evolution</application> will not normally
- load the contents of LDAP folders immediately upon
- opening. You must click <guilabel>Display
- All</guilabel> before LDAP folder cards will be loaded
- from the network. You can change this behavior in the
- <interface>Contact Preferences</interface> window.
- </para>
- </listitem>
- <listitem>
- <para>
- Your ability to view, change, add, and delete contacts
- depends on the settings of the LDAP server.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- </sect1>
-
- <sect1 id="contact-automation-basic">
- <title>Send me a Card: Adding New Cards Quickly</title>
- <para>
- As noted before, when you get information about a person in
- the mail or in a calendar entry, you can add it to an address
- card. To do so, right click on any email address or email
- message, and select <guimenuitem>Add Address
- Card</guimenuitem> from the menu that appears. Of course,
- <application> Evolution</application> can also add cards from a
- hand-held device during HotSync operation. For more
- information about that, see <xref linkend="usage-sync">.
- </para>
- </sect1>
-
-<!-- Unimplemented features:
- <para>
- You can also use the addressbook to print postal addresses
- on mailing labels. Future versions of
- <application>Evolution</application> will allow you to you
- export a group of cards to a spreadsheet, database, or word
- processor so you can print address labels or prepare large
- mailings.
- </para>
- <para>
- Need a map or directions? Click <guibutton>MapIt</guibutton> from
- within the addressbook, and <application>Evolution</application>
- will map the address for you online.
- </para>
- -->
-
-
-
-</chapter>
diff --git a/help/no/usage-encryption.sgml b/help/no/usage-encryption.sgml
deleted file mode 100644
index e36f17c652..0000000000
--- a/help/no/usage-encryption.sgml
+++ /dev/null
@@ -1,147 +0,0 @@
-<!DOCTYPE article PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN"[]>
-
-<article>
-
- <sect1 id="encryption-intro">
- <title>What is Encryption?</title>
- <para>
- Encryption is an ancient method of changing readable text to unreadable
- text that dates back to Egyptian times. Encryption takes the statement
- "Evolution" and turns it into something which cannot be read without help
- through decryption.
- <example>
- <title>Encryption Example</title>
- <para>
- Kevin orders an <application>Evolution</application> t-shirt from
- Ximian, Inc. over the internet. He puts in his credit card number
- which is 1234-567-8901. For security, his computer encrypts the
- credit card number so it can be safely transmitted over the internet.
- The number now is @#$23ui7yr87#@!48970fsd, which holds no intentional
- resemblance to the inital number. When the information gets to
- Ximian, Inc. it'll be decrypted into the inital number.
- </para>
- </example>
- Encryption can be used in email in two ways: to verify that the sender is
- the real sender, and to hide the message while in transmission.
- <application>Evolution</application> has the capability to do both.
- </para>
- </sect1>
- <sect1 id="generating-key">
- <title>Generating your PGP key</title>
- <para>
- First, you need to create a PGP key. To do this, you'll need GPG
- installed.
- </para>
- <tip>
- <title>GPG Versions</title>
- <para>
- This manual covers version 1.0.6 of GPG. If your version is different,
- this may not be entirely accurate. You may find out your version number
- by typing in: <command>gpg --version</command>.
- </para>
- </tip>
- <para>
- You can start by typing in: <command>gpg --gen-key</command>. At the
- first question, select 1. The next question asks you about key length.
- The longer the key, more stronger it is. However, the longer the key, the
- longer it takes to generate. This is your choice. However, 1024 bits
- (default) should be adequate. The next question asks you if you want your
- key to expire. Expiring keys make your key invalid after a certain amount
- of time, so old keys don't float around active. This is the same concept
- as a coupon at a supermarket. Next, you'll type in your Real name, your
- email address, and a comment. You should not forge this information, as
- it is used later to verify who you are. Assuming that all your
- information is correct, press "O" to continue. GPG now asks you for a
- passphrase. This is a password which you will need to decrypt and encrypt
- messages. This can be any length, with any characters in it. It is case
- sensitive, which means that it does know the difference between capital
- letters and lower-case. Now your key is generated. It is recommend you
- surf the internet, read your email, or write a letter in a word
- processor. This help creates randomness in the key.
- </para>
- <para>
- Once this is completed, you'll be dropped back to the command line.
- Now you can view your key information by typing <command>gpg
- --list-keys</command>. You should see something similar to this:
- <example id="gpg-list-keys">
- <title>GPG Listing Keys</title>
- <para>
- /home/bob/.gnupg/pubring.gpg
- ----------------------------
- pub 1024D/32j38dk2 2001-06-20 bob &lt;bob@bob.com&gt;
- sub 1024g/289sklj3 2001-06-20 [expires: 2002-11-14]
- </para>
- </example>
- You'll now need to upload your public key to a keyserver, so that your
- friends can use your key. You'll need to know the ID of your key, which
- is after the 1024D on the line beginning with pub. For this example, it
- is 32j38dk2. You now type in <command>gpg --send-keys --keyserver
- wwwkeys.pgp.net 32j38dk2</command>. Substitute your key ID for 32j38dk2.
- You will be prompted to type in your password <!-- verify that you need to
- enter your password here --> and your key will be uploaded for your
- friends to download.
- </para>
- </sect1>
- <sect1 id="encrypt-evo-integ">
- <title>Setting up Evolution's Encryption</title>
- <para>
- You'll need to open
- <menuchoice>
- <guimenu>Tools</guimenu>
- <guimenuitem>Mail Settings</guimenuitem>
- </menuchoice>
- Once there, select the account you'd like to associate the key to and click
- the <guibutton>Edit</guibutton> button. In the
- <guilabel>Security</guilabel> tab is a section labeled <guilabel>Pretty
- Goog Privacy</guilabel>. Enter your key ID and click
- <guibutton>OK</guibutton>. Your key is now integrated into your identity
- in <application>Evolution</application>.
- </para>
- </sect1>
- <sect1 id="encrypt-sending">
- <title>Sending Encrypted Messages</title>
- <para>
- You can either sign or encrypt a message. When you sign a message, verify
- that you were the one who sent it, and that no one is forging your
- identity. Encrypting a message makes it impossible for someone with
- prying eyes to view it while it's in tranmission.
- </para>
- <para>
- <sect2 id="sign-msg">
- <title>Signing a Message</title>
- <para>
- To sign a message, you simply click
- <menuchoice>
- <guimenu>Security</guimenu>
- <guimenuitem>PGP Sign</guimenuitem>
- </menuchoice>
- . You will be prompted for your PGP password. Once you enter it,
- click <guibutton>OK</guibutton> and your message will be signed.
- </para>
- </sect2>
- <sect2 id="encrypt-msg">
- <title>Encrypting a Message</title>
- <para>
- Encrypting a message is very similar to signing a message. You simply
- click the menu item
- <menuchoice>
- <guimenu>Security</guimenu>
- <guimenuitem>PGP Encrypt</guimenuitem>
- </menuchoice>
- </para>
- </sect2>
- </para>
- </sect1>
- <sect1 id="unencrypting">
- <title>Unencrypting a Recieved Message</title>
- <para>
- Sometimes, a friend will send you a message which is encrypted. In order
- for you to read it, you need to unencrypt it.
- </para>
- <para>
- When you view the encrypted message, <application>Evolution</application>
- will prompt you for your PGP password. You type in your PGP password and
- the message is then decrypted.
- </para>
- </sect1>
- </article>
diff --git a/help/no/usage-exec-summary.sgml b/help/no/usage-exec-summary.sgml
deleted file mode 100644
index e16da21579..0000000000
--- a/help/no/usage-exec-summary.sgml
+++ /dev/null
@@ -1,315 +0,0 @@
-<!--
-<!DOCTYPE Chapter PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-<chapter id="usage-summary">
- <title>Getting Oriented with the Ximian Evolution Summary</title>
-
- <sect1 id="summary-intro">
- <title>Using the Summary</title>
- <para>
- The Ximian Evolution Summary can show you what you need to know
- quickly. It will show you your tasks for that day, how many
- emails are waiting for you, and much more.
- </para>
- <para>
- To begin using your Summary, click on the <guilabel>Shortcut
- Bar</guilabel> or <guilabel>Summary</guilabel> at the top of the
- <guilabel>Folder Bar</guilabel>. By default, you will see:
- <itemizedlist>
- <listitem>
- <para>
- Weather Reports
- </para>
- </listitem>
- <listitem>
- <para>
- News feeds from the Internet
- </para>
- </listitem>
- <listitem>
- <para>
- Mail summary
- </para>
- </listitem>
- <listitem>
- <para>
- Appointments
- </para>
- </listitem>
- <listitem>
- <para>
- Tasks
- </para>
- </listitem>
- </itemizedlist>
- </para>
- </sect1>
- <sect1 id="customizing-summary">
- <title>Customizing the Summary's Modules</title>
- <para>
- <application>Evolution's</application> modules can be customized
- to suit your needs. For example, you can choose which mail
- boxes are summarized, and which news services appear.
- </para>
-
-
- <note id="summary-http-proxy">
- <title>Using the Summary through an HTTP Proxy</title>
- <para>
- If you use an HTTP proxy, <application>Ximian
- Evolution</application> must be able to find it through the
- <systemitem>gnome-vfs</systemitem> subsystem before it can
- access news and weather from the Internet. This is also
- the case if you wish to load remote images into HTML mail
- message. You can tell the GNOME Virtual File System about
- your HTTP proxy in one of two ways:
- <variablelist>
- <varlistentry>
- <term>Configure it with Nautilus</term>
- <listitem>
- <para>
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Open a Nautilus window
- </para>
- </listitem>
- <listitem>
- <para>
- Select <menuchoice>
- <guimenu>Preferences</guimenu>
- <guimenuitem>Edit Preferences</guimenuitem>
- </menuchoice>.
- </para>
- </listitem>
- <listitem>
- <para>
- Go to the <guilabel>Navigation</guilabel> tab.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the <guilabel>Use HTTP Proxy</guilabel>
- checkbox and enter the location of your HTTP
- proxy in the <guilabel>Location</guilabel> field.
- </para>
- </listitem>
- </orderedlist>
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Configure it with the gconftool command</term>
- <listitem>
- <para>
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Open a terminal.
- </para>
- </listitem>
- <listitem>
- <para>
- Enter the command
- <command>
- gconftool --type=bool --set /system/gnome-vfs/use-http-proxy "TRUE"
- </command>
- </para>
- </listitem>
- <listitem>
- <para>
- Enter the command
- <command>
- gconftool --type=string --set /system/gnome-vfs/http-proxy-host "your-proxy-url"
- </command>
- </para>
- </listitem>
- <listitem>
- <para>
- Enter the command
- <command>
- gconftool --type=int --set /system/gnome-vfs/http-proxy-port "8080"
- </command>
- </para>
- </listitem>
- </orderedlist>
- </para>
- <para>
- For more information about the gconftool command,
- read the gconftool man page.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </note>
-
-
- <sect2 id="customizing-summary-weather">
- <title>Customizing the Weather Summary</title>
- <para>
- To add a city to be displayed in the weather:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Click <guilabel>Summary</guilabel> in the <guilabel>Shortcut Bar</guilabel>.
- </para>
- </listitem>
- <listitem>
- <para>
- Click
- <menuchoice>
- <guimenu>Tools</guimenu>
- <guimenuitem>Summary Settings</guimenuitem>
- </menuchoice>.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the <guilabel>Weather</guilabel> tab.
- </para>
- </listitem>
- <listitem>
- <para>
- Select the city on the left hand column.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the <guibutton>Add</guibutton> button.
- </para>
- </listitem>
- </orderedlist>
- <tip id="measurments">
- <title>Metric or Imperial?</title>
- <para>
- <application>Evolution</application> supports both
- Imperial and Metric measurement for weather
- reports. Imperial units are sometimes called British
- units, but are used almost exclusively in the United
- States. Britain, and most of the rest of the world, use
- metric units.
- </para>
- </tip>
- </para>
- </sect2>
- <sect2 id="customizing-feeds">
- <title>Customizing Your News Feeds</title>
- <para>
- To customize your news feeds:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Click <guilabel>Summary</guilabel> in the <guilabel>Shortcut Bar</guilabel>.
- </para>
- </listitem>
- <listitem>
- <para>
- Click
- <menuchoice>
- <guimenu>Tools</guimenu>
- <guimenuitem>Summary Settings</guimenuitem>
- </menuchoice>.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the <guilabel>News Feeds</guilabel> tab.
- </para>
- </listitem>
- <listitem>
- <para>
- Select the news news feed on the left column.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the <guibutton>Add</guibutton> button.
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guibutton>OK</guibutton>.
- </para>
- </listitem>
- </orderedlist>
- </para>
- </sect2>
- <sect2 id="customizing-mail">
- <title>Customizing Your Mail Summary</title>
- <para>
- To customize your mail summary:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Click <guilabel>Summary</guilabel> in the <guilabel>Shortcut Bar</guilabel>.
- </para>
- </listitem>
- <listitem>
- <para>
- Click
- <menuchoice>
- <guimenu>Tools</guimenu>
- <guimenuitem>Summary Settings</guimenuitem>
- </menuchoice>.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the <guibutton>Mail</guibutton> tab.
- </para>
- </listitem>
- <listitem>
- <para>
- Select the mail folder you want to see in the preview on the left.
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guibutton>Add</guibutton>.
- </para>
- </listitem>
- </orderedlist>
- </para>
- </sect2>
- <sect2 id="customizing-cal">
- <title>Customizing Your Schedule Summary</title>
- <para>
- To customize your calendar summary:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Click <guilabel>Summary</guilabel> in the <guilabel>Shortcut Bar</guilabel>.
- </para>
- </listitem>
- <listitem>
- <para>
- Click
- <menuchoice>
- <guimenu>Tools</guimenu>
- <guimenuitem>Summary Settings</guimenuitem>
- </menuchoice>.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the <guibutton>Schedule</guibutton> tab.
- </para>
- </listitem>
- <listitem>
- <para>
- Choose whether you'd like appointments displayed for one
- day, five days, a week, or a month.
- </para>
- </listitem>
- <listitem>
- <para>
- Choose whether you'd like to display all tasks, or just
- the tasks due today.
- </para>
- </listitem>
- </orderedlist>
- </para>
- </sect2>
- </sect1>
-</chapter> \ No newline at end of file
diff --git a/help/no/usage-mail-org.sgml b/help/no/usage-mail-org.sgml
deleted file mode 100644
index ce6f75e69c..0000000000
--- a/help/no/usage-mail-org.sgml
+++ /dev/null
@@ -1,1021 +0,0 @@
-<chapter id="usage-mail-organize">
- <title>Organizing and Managing your Email</title>
- <para>
- Even if you only get a few email messages a day, you probably
- want to sort and organize them. When you get a hundred a day
- and you want to refer to a message you received six weeks ago,
- you <emphasis>need</emphasis> to sort and organize them.
- Fortunately, <application>Ximian Evolution</application> has the tools
- to help you do it.
- </para>
-
- <sect1 id="importing-mail-and-settings">
- <title>Importing Your Old Email and Settings</title>
- <para>
- <application>Evolution</application> allows you to import old email and data so that you don't need to worry about losing your old information.
- </para>
- <sect2 id="importing-mail">
- <title>Importing Email</title>
- <para>
- <application>Ximian Evolution</application> can import the following types of
- files:
- <variablelist>
- <varlistentry>
- <term>VCard (.vcf, gcrd):</term>
- <listitem>
- <para>
- The addressbook format used by the GNOME, KDE, and
- many other contact management applications. You
- should be able to export to VCard format from any
- address book application.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>iCalendar (.ics):</term>
- <listitem>
- <para>
- A format for storing calendar files. iCalendar is used by
- PalmOS based handhelds, Ximian <application>Evolution</application>, and Microsoft <application>Outlook</application>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Microsoft Outlook Express 4 (.mbx):</term>
- <listitem>
- <para>
- Email file format used by Microsoft Outlook Express
- 4. For other versions of Microsoft Outlook and Outlook Express, see
- the workaround described in the note below.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>MBox (mbox):</term>
- <listitem>
- <para>
- The email box format used by Mozilla, Netscape,
- Ximian Evolution, Eudora, and many other email clients.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- <para>
- To import your old email:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Click <menuchoice><guimenu>File</guimenu><guimenuitem>Import</guimenuitem></menuchoice>.
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guibutton>Next</guibutton> after reading the Welcome screen.
- </para>
- </listitem>
- <listitem>
- <para>
- Select <guibutton>Import a single file</guibutton>.
- </para>
- </listitem>
- <listitem>
- <para>
- Find the file that you wish to import into <application>Evolution</application>.
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guibutton>Import</guibutton>
- </para>
- </listitem>
- </orderedlist>
- </para>
- </sect2>
- <sect2 id="importing-preferences">
- <title>Importing Preferences</title>
- <para>
- <application>Evolution</application> can import all your old mail, contacts, and other information from other applications, making your transition to <application>Evolution</application> even easier.
- </para>
- <para>
- To import your old information:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Click <menuchoice><guimenu>File</guimenu><guimenuitem>Import</guimenuitem></menuchoice>.
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guibutton>Next</guibutton> after reading the Welcome screen.
- </para>
- </listitem>
- <listitem>
- <para>
- Select <guibutton>Import data and settings from older programs</guibutton>.
- </para>
- </listitem>
- <listitem>
- <para>
- The left-most column shows the application which your information will be imported from. You then select checkboxes on each component to import different properties of each application.
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guibutton>Next</guibutton>
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guibutton>Import</guibutton>
- </para>
- </listitem>
- </orderedlist>
- </para>
-
-<para>
- <note>
- <title>Microsoft Outlook and Outlook Express Users</title>
- <para>
- Microsoft Outlook, and versions of Outlook Express after
- version 4, use proprietary formats that <application>Ximian
- Evolution</application> cannot read or import. For contacts,
- you may have to email them to yourself and import them that
- way. For email, there is a simpler workaround:
- <orderedlist numeration="arabic">
-
- <listitem>
- <para>
- While using Windows, import the files into Mozilla Mail (or
- another mailer, such as Netscape or Eudora, that uses the
- standard mbox format).
- </para>
- </listitem>
-
- <listitem>
- <para>
- Copy the files to the system or partition you use for
- <application>Ximian Evolution</application>.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Use the <application>Ximian Evolution</application> import
- tool to import the files. There's more information about
- why this works, and how, at the Ximian support website.
- </para>
- </listitem>
- </orderedlist>
- </para>
- </note>
-
- <note>
- <title>Netscape Users</title>
- <para>
- Before importing mail from Netscape, make sure you select
- <menuchoice><guimenu>File</guimenu><guimenuitem>Compact All
- Folders</guimenuitem></menuchoice>. If you don't,
- <application>Ximian Evolution</application> will import and undelete
- the messages in your Trash folders.
- </para>
- </note>
-
- </para>
-
- </sect2>
- </sect1>
- <sect1 id="usage-mail-organize-columns">
- <title>Sorting Mail with Column Headers</title>
- <para>
- By default, the message list has columns with the following
- headings: an envelope icon indicating whether you have read
- or replied to a message, an exclamation point indicating priority, and the
- <guilabel>From</guilabel>, <guilabel>Subject</guilabel>, and
- <guilabel>Date</guilabel> fields. You can change their order
- and remove them by dragging and dropping them.
-
- To add columns:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Right click on the column header
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guimenuitem>Add a Column</guimenuitem>
- </para>
- </listitem>
- <listitem>
- <para>
- Click and drag a column you want into a space between
- existing column headers. A red arrow will show you where
- the column will be placed.
- </para>
- </listitem>
- </orderedlist>
- </para>
- <para>
- Right-click on one of the column headers to get a list of
- options:
- <variablelist>
- <varlistentry>
- <term><guimenuitem>Sort Ascending</guimenuitem>:</term>
- <listitem><para>
- Sorts the messages top to bottom.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Sort Descending</guimenuitem>:</term>
- <listitem><para>
- Sorts the messages bottom to top.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Group By this Field</guimenuitem>:</term>
- <listitem><para>
- Groups messages instead of sorting them. This makes each contact
- with identical properties in the specified field to be placed in
- its own group and physically separated from others.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Remove this
- Column</guimenuitem>:</term> <listitem><para> Remove
- this column from the display. You can also remove
- columns by dragging the header off the list and
- letting it drop. </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Field
- Chooser</guimenuitem>:</term> <listitem><para>
- When you choose this item, a list
- of column headers will appear; just drag and drop them into
- place between two existing headers. A red arrow will
- appear to show you where you're about to put the
- column.
- </para></listitem>
- </varlistentry>
- </variablelist>
- </para>
- </sect1>
-
- <sect1 id="usage-mail-organize-folders">
- <title>Getting Organized with Folders</title>
- <para>
- <application>Ximian Evolution</application> keeps mail, as well as
- address cards and calendars, in folders. You start out with a
- few, like <guilabel>Inbox</guilabel>,
- <guilabel>Outbox</guilabel>, and <guilabel>Drafts</guilabel>,
- but you can create as many as you like. Create new folders by
- selecting <guisubmenu>New</guisubmenu> and then
- <guimenuitem>Folder</guimenuitem> from the
- <guimenu>File</guimenu> menu.
- <application>Ximian Evolution</application> will as you for the name
- and the type of the folder, and will provide you with a folder
- tree so you can pick where it goes.
- </para>
- <para>
- When you click <guibutton>OK</guibutton>, your new folder will
- appear in the <interface>folder view</interface>. You can
- then put messages in it by dragging and dropping them, or by
- using the <guibutton>Move</guibutton> button in the
- toolbar. If you want to move several messages at once, click
- on the ones you want to move while holding down the
- <keycap>Ctrl</keycap> key, or use <keycap>Shift</keycap> to
- select a range of messages. If you create a filter with the
- <interface>filter assistant</interface>, you can have mail
- filed automatically.
- </para>
- </sect1>
-
- <sect1 id="usage-mail-organize-search">
- <title>Searching for Messages</title>
- <para>
- Most mail clients can search through your messages for you,
- but <application>Ximian Evolution</application> does it faster. You
- can search through just the message subjects, just the message
- body, or both body and subject.
- </para>
- <para>
- To start searching, enter a word or phrase in the text area
- right below the toolbar, and choose a search type:
- <variablelist>
- <varlistentry>
- <term><guilabel>Body or subject contains</guilabel>:</term>
- <listitem>
- <para>
- This will search message subjects and the messages
- themselves for the word or phrase you've entered in
- the search field.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term> <guilabel>Body contains</guilabel>:</term>
- <listitem>
- <para>
- This will search only in message text, not the subject
- lines.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Subject contains:</guilabel></term>
- <listitem>
- <para>
- This will show you messages where the search text is
- in the subject line. It will not search in the
- message body.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Body does not contain:</guilabel></term>
- <listitem>
- <para>
- This finds every email message that does not have the
- search text in the message body. It will still show
- messages that have the search text in the subject
- line, if it is not also in the body.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guilabel>Subject does not contain:</guilabel></term>
- <listitem>
- <para>
- This finds every mail whose subject does not contain
- the search text.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- When you've entered your search phrase, press
- <keycap>Enter</keycap>. <application>Ximian Evolution</application>
- will show your search results in the message list.
- </para>
-
- <para>
- If you think you'll want to return to a search again, you can
- save it as a virtual folder by selecting <guilabel>Store
- Search as vFolder</guilabel>.
- </para>
-
- <para>
- When you're done with the search, go back to seeing all your
- messages by choosing <guimenuitem>Show All</guimenuitem> from
- the <guilabel>Search</guilabel> drop-down box. If you're
- sneaky, just enter a blank search: since every message has at
- least one space in it, you'll see every message in the
- folder.
- </para>
-
- <para>
- If you'd like to perform a more complex search, open the
- advanced search dialog by selecting
- <guilabel>Advanced...</guilabel> from the
- <guilabel>Search</guilabel> drop-down menu. Then, create your
- search criteria (each with the same options you saw in the
- regular search bar), and decide whether you want to find
- messages that match all of them, or messages that match even
- one. Then, click <guibutton>Search</guibutton> to go and find
- those messages.
- </para>
-
- <para>
- You'll see a similar approach to sorting messages when you
- create filters and vFolders in the next few sections.
- </para>
-
- </sect1>
-
- <sect1 id="usage-mail-organize-filters">
- <title>Create Rules to Automatically Organize Mail</title>
- <para>
- Filters work very much like the mail room in a large company.
- Their purpose is to bundle, sort, and distribute mail to the
- various folders. In addition, you can have multiple filters
- performing multiple actions that may effect the same message
- in several ways. For example, your filters could put copies
- of one message into multiple folders, or keep a copy and send
- one to another person as well, and it can do that quickly. Of
- course, it's also faster and more flexible than an actual
- person with a pile of envelopes.
- </para>
-
- <sect2 id="usage-mail-org-filters-new">
- <title>Making New Filters</title>
- <para>
- To create a new filter:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Click
- <menuchoice>
- <guimenu>Tools</guimenu>
- <guimenuitem>Filters</guimenuitem>
- </menuchoice>
- </para>
- </listitem>
- <listitem>
- <para>
- Press the <guibutton>Add</guibutton> button.
- </para>
- </listitem>
- <listitem>
- <para>
- Name your filter in the <guilabel>Rule name</guilabel> field.
- For each filter criterion, you must first select
- which of the following parts of the message you want the filter to
- examine:
-
- <itemizedlist>
- <listitem><para>
- Sender - The sender's address.
- </para></listitem>
-
-
- <listitem><para>
- Recipients - The recipients of the message.
- </para></listitem>
-
- <listitem><para>
- Subject - The subject line of the message.
- </para></listitem>
-
- <listitem><para>
- Specific Header - The filter can look at any header you
- want, even obscure or custom ones. Enter the header name
- in the first text box, and put your search text in the
- second one.
- </para></listitem>
-
- <listitem><para>
- Message Body - Search in the actual text of the message.
- </para></listitem>
-
- <listitem>
- <para>
- Expression - For programmers only: match a message according to an
- expression you write in the Scheme language, used to
- define filters in <application>Ximian Evolution</application>.
- </para>
- </listitem>
-
- <listitem><para> Date sent - Filter messages according to the date on
- which they were sent: First, choose the conditions you
- want a message to meet &mdash; <guilabel>before</guilabel>
- a given time, <guilabel>after</guilabel> it, and so forth.
- Then, choose the time. The filter will compare the
- message's time-stamp to the system clock when the filter
- is run, or to a specific time and date you choose from a
- calendar. You can even have it look for messages within a
- range of time relative to the filter &mdash; perhaps you're
- looking for messages less than two days old.
- </para></listitem>
-
- <listitem><para>
- Date Recieved - This works the same way as the <guilabel>Date Sent</guilabel>
- option, except that it compares the time you got the message
- with the dates you specify.
- </para></listitem>
-
- <listitem><para>
- Score - Emails have a standard priority range from -3 (least
- important) to 3 (most important). You can have filters set the
- priority of messages you recieve, and then have other filters
- applied only to those messages which have a certain priority.
- </para></listitem>
-
- <listitem>
- <para>
- Size (kb) - Sorts based on the size of the message in kilobytes.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Status - Filters according to the status of a message, such as
- 'New'.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Attachments - Create a filter based on whether or not you
- have an attachment in the email.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Mailing List - Filter based on the mailing list it came from.
- </para>
- <note>
- <title>How Does Filtering on Mailing Lists Work?</title>
- <para>
- Filtering on mailing list actually looks for a
- specific mailing-list header called the
- <computeroutput>X-BeenThere</computeroutput>
- header, used to identify mailing lists or other
- redistributors of mail.
- </para>
- </note>
- </listitem>
-
- <listitem>
- <para>
- Regex Match - If you know your way around a
- <glossterm
- linkend="regular-expression">regex</glossterm>, or
- regular expression, put your knowledge to use
- here.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Source Account - Filter messages according the server you got them from.
- You can enter a URL or choose one from the drop-down
- list. This ability is only relevant if you use more
- than one mail source.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- </listitem>
- <listitem>
- <para>
- Select the criterion for the condition. If you want multiple
- criteria for this filter, press <guibutton>Add
- criterion</guibutton> and repeat the previous step.
- </para>
- </listitem>
- <listitem>
- <para>
- Select the actions for the filter in the <guilabel>Then</guilabel>
- section. You can select any of the following options.
- <itemizedlist>
- <listitem><para>
- Move to Folder - If you select this item, <application>Ximian Evolution</application>
- will put the messages into a folder you specify. Click the
- <guibutton>&lt;click here to select a folder&gt;</guibutton> button
- to select a folder.
- </para></listitem>
-
- <listitem><para>
- Copy to Folder - If you select this item, <application>Ximian Evolution</application>
- will put the messages into a folder you specify. Click the
- <guibutton>&lt;click here to select a folder&gt;</guibutton> button
- to select a folder.
- </para></listitem>
-
- <listitem><para>
- Forward to Address - Select this, enter an address, and the addressee will
- get a copy of the message.
- </para></listitem>
-
- <listitem><para>
- Delete - Marks the message for deletion. You can still get the message
- back, at least until you <guimenuitem>Expunge</guimenuitem> your
- mail yourself.
- </para></listitem>
-
- <listitem><para>
- Stop Processing - Select this if you want to tell all other filters to ignore
- this message, because whatever you've done with it so far
- is plenty.
- </para></listitem>
-
- <listitem><para>
- Assign Color - Select this item, and <application>Ximian Evolution</application>
- will mark the message with whatever color you please.
- </para></listitem>
-
- <listitem><para>
- Assign Score - If you know that all mail with
- "important" somewhere in the message body line is
- important, you can give it a high priority score. In a subsequent filter you can
- then arrange your messages by their priority score.
- </para></listitem>
- </itemizedlist>
- </para>
- </listitem>
- <listitem>
- <para>
- Set Status - If you want to add multiple actions for this filter, press
- <guibutton>Add filter</guibutton> and repeat the previous step.
- </para>
- </listitem>
- <listitem>
- <para>
- Press <guibutton>OK</guibutton>.
- </para>
- </listitem>
- </orderedlist>
- </para>
- <example id="filter-example">
- <title>Using a Filter to Avoid Spam</title>
- <para>
- A good deal of bulk mail is eventually tagged with the
- <computeroutput>Precedence: Bulk</computeroutput> header at
- one point or another. Not all of it is, of course, and
- there are "good" messages (mailing lists you subscribe to,
- for example) that are also considered "Bulk" mail.
- However, if you filter out all the mail with that header,
- you'll catch a lot of the mail you don't want to get.
- </para>
- <para>
- To catch them and automatically mark them for deletion, do
- the following:
- <orderedlist>
-
- <listitem><para>
- Select <menuchoice><guimenu>Tools</guimenu><guimenuitem>Filters</guimenuitem></menuchoice>.
- </para></listitem>
-
- <listitem><para>
- Click <guibutton>New</guibutton>.
- </para></listitem>
-
- <listitem><para>
- Set the first part of your search critera to look in a <guilabel>Specific header</guilabel>.
- </para></listitem>
-
- <listitem><para>
- Enter <userinput>Precedence</userinput> as the name of the header.
- </para></listitem>
-
- <listitem><para>
- Choose <guilabel>contains</guilabel> at the second drop-down box.
- </para></listitem>
-
- <listitem><para>
- Enter <userinput>Bulk</userinput> as the content to search for.
- You're now working with all email that has the word "Bulk" in the
- "Precedence" header.
- </para></listitem>
-
- <listitem><para>
- For actions, select "Move to Folder" and choose the
- folder where you'd like to place bulk mail.
- </para></listitem>
-
- <listitem><para> If you like, add another action and
- choose <guilabel>Delete</guilabel>.
- </para></listitem>
-
- <listitem><para>
- Click OK. You're done.
- </para></listitem>
- </orderedlist>
- </para>
- </example>
- </sect2>
-
-
-
- <sect2 id="filters-edit">
- <title>Editing Filters</title>
- <para>
- To edit a filter:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Select
- <menuchoice>
- <guimenu>Tools</guimenu>
- <guimenuitem>Filters</guimenuitem>
- </menuchoice>
- </para>
- </listitem>
- <listitem>
- <para>
- Select the filter in the <guilabel>Filter Rules</guilabel> section
- and press <guibutton>Edit</guibutton>.
- </para>
- </listitem>
- <listitem>
- <para>
- Change the desired settings.
- </para>
- </listitem>
- <listitem>
- <para>
- Press <guibutton>OK</guibutton> in the filter editor window.
- </para>
- </listitem>
- <listitem>
- <para>
- Press <guibutton>OK</guibutton> in the filter manager window.
- </para>
- </listitem>
- </orderedlist>
- </para>
- </sect2>
-
- <sect2 id="filters-deleting">
- <title>Deleting Filters</title>
- <para>
- To delete a filter:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Select
- <menuchoice>
- <guimenu>Tools</guimenu>
- <guimenu>Filters</guimenu>
- </menuchoice>
- </para>
- </listitem>
- <listitem>
- <para>
- Select the filter and press <guibutton>Delete</guibutton>.
- </para>
- </listitem>
- </orderedlist>
- </para>
- <para>
- <note>
- <title>Changing Folder Names and Filters</title>
- <para>
- <itemizedlist>
- <listitem>
- <para>
- Incoming email that your filters don't move goes into the Inbox;
- outgoing mail that they don't move ends up in the Sent
- folder. So be sure to change the filters that go with it.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- </note>
- </para>
- </sect2>
- </sect1>
-
- <sect1 id="usage-mail-organize-vfolders">
- <title>Getting Really Organized with vFolders</title>
- <para>
- If filters aren't flexible enough for you, or you find
- yourself performing the same search again and again, consider
- a vFolder. vFolders, or virtual folders, are an advanced way
- of viewing your email messages within
- <application>Ximian Evolution</application>. If you get a lot of
- mail or often forget where you put messages, vFolders
- can help you stay on top of things.
- </para>
- <para>
- A vFolder is really a hybrid of all the other organizational
- tools: it looks like a folder, it acts like a search, and you
- set it up like a filter. In other words, while a conventional
- folder actually contains messages, a vFolder is a view of
- messages that may be in several different folders. The
- messages it contains are determined on the fly using a set of
- criteria you choose in advance.
- </para>
-
- <para>
- As messages that meet the vFolder criteria arrive or are
- deleted, <application>Ximian Evolution</application> will
- automatically place them in and remove them from the
- vFolder contents list. When you delete a message, it gets
- erased from the folder in which it actually exists, as well as
- any vFolders which display it.
- </para>
-
- <para>
- Imagine a business trying to keep track of mail from hundreds
- of vendors and clients, or a university with overlapping and
- changing groups of faculty, staff, administrators and
- students. The more mail you need to organize, the less you
- can afford the sort of confusion that stems from an
- organizational system that's not flexible enough. vFolders
- make for better organization because they can accept
- overlapping groups in a way that regular folders and filing
- systems can't.
- </para>
-
-
- <note id="unmatched-vfolder">
- <title>The "Unmatched" vFolder</title>
- <para>
- Obviously, not all messages will fit into all your Virtual
- Folders. That's why <application>Ximian
- Evolution</application> includes an Unmatched vFolder. The
- Unmatched vFolder displays messages that are not matched by
- other rules. If you have no vFolders, the Unmatched folder
- will contain all of your mail.
- </para>
- </note>
-
-
- <example id="usage-mail-organize-vFolders-ex">
- <title>Using Folders, Searches, and vFolders</title>
- <para>
- To organize his mailbox, Jim sets up a virtual volder for emails from
- his friend and co-worker Anna. He has another one for messages that
- have ximian.com in the address and <application>Ximian Evolution</application> in the subject line, so he
- can keep a record of what people from work send him about
- <application>evolution</application>. If Anna sends him a message about
- anything other than <application>Ximian Evolution</application>, it only shows up in the "Anna" folder.
- When Anna sends him mail about the user interface for
- <application>evolution</application>, he can see that message both in
- the "Anna" vFolder and in the "Internal Evolution Discussion"
- vFolder.
- </para>
- </example>
-
- <!-- (INSERT SCREENSHOT HERE: vFolders in action) -->
-
- <sect2 id="vfolder-create">
- <title>Creating vFolders</title>
- <para>
- To create a vFolder:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- <menuchoice>
- <guimenu>Tools</guimenu>
- <guimenuitem>vFolder Editor</guimenuitem>
- </menuchoice>
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guibutton>Add</guibutton>
- </para>
- </listitem>
- <listitem>
- <para>
- Name your vFolder in the <guilabel>Rule name</guilabel> field.
-
- </para>
- </listitem>
- <listitem>
- <para>
- Select your search criteria. For each criterion, you
- must first select which of the following parts of the
- message you want the search to examine:
- <itemizedlist>
- <listitem><para>
- Sender - The sender's address.
- </para></listitem>
-
-
- <listitem><para>
- Recipients - The recipients of the message.
- </para></listitem>
-
- <listitem><para>
- Subject - The subject line of the message.
- </para></listitem>
-
- <listitem><para>
- Specific Header - The vFolder can look at any header you
- want, even obscure or custom ones. Enter the header name
- in the first text box, and put your search text in the
- second one.
- </para></listitem>
-
- <listitem><para>
- Message Body - Search in the actual text of the message.
- </para></listitem>
-
- <listitem>
- <para>
- Expression - For programmers only: match a message according to an
- expression you write in the Scheme language, used to
- define vFolders in <application>Ximian Evolution</application>.
- </para>
- </listitem>
-
- <listitem><para> Date sent - Search messages according to the date on
- which they were sent: First, choose the conditions you
- want a message to meet &mdash; <guilabel>before</guilabel>
- a given time, <guilabel>after</guilabel> it, and so forth.
- Then, choose the time. The vFolder will compare the
- message's time-stamp to the system clock when the filter
- is run, or to a specific time and date you choose from a
- calendar. You can even have it look for messages within a
- range of time relative to the filter &mdash; perhaps you're
- looking for messages less than two days old.
- </para></listitem>
-
- <listitem><para>
- Date Recieved - This works the same way as the <guilabel>Date Sent</guilabel>
- option, except that it compares the time you got the message
- with the dates you specify.
- </para></listitem>
-
- <listitem><para>
- Score - Emails have a standard priority range from -3 (least
- important) to 3 (most important). You can have vFolders set the
- priority of messages you recieve, and then have other
- vFolders
- applied only to those messages which have a certain priority.
- </para></listitem>
-
- <listitem>
- <para>
- Size (kb) - Sorts based on the size of the message in kilobytes.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Status - Searches according to the status of a message, such as
- 'New'.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Attachments - Create a vFolder based on whether or not you have an
- attachment in the email.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Mailing List - Search based on the mailing list it came from.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Source Account - Search messages according the server you got them from.
- You can enter a URL or choose one from the drop-down
- list. This ability is only relevant if you use more
- than one mail source.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- </listitem>
- <listitem>
- <para>
- Select the folder sources. You can select:
- <itemizedlist>
- <listitem>
- <para>
- Specific folders only
- <note>
- <para>
- If you select specific folders only, you need to specify the
- source folders in the box below.
- </para>
- </note>
- </para>
- </listitem>
- <listitem>
- <para>
- All local folders
- </para>
- </listitem>
- <listitem>
- <para>
- With all active remote folders
- </para>
- </listitem>
- <listitem>
- <para>
- With all local and active folders
- </para>
- </listitem>
- </itemizedlist>
-
- </para>
- </listitem>
- </orderedlist>
-</para>
-<para>
-Remote folders are considered active if you are connected to the
-server; you must be connected to your mail server for the vFolder to
-include any messages from that source.
-</para>
-<para>
- <figure id="usage-mail-vfolder-fig-createrule">
- <title>Selecting a vFolder Rule</title>
- <screenshot>
- <screeninfo>Creating a vFolder Rule</screeninfo>
- <mediaobject><imageobject><imagedata
- fileref="figures/vfolder-createrule-fig" format="png"
- srccredit="Aaron Weber">
- </imageobject></mediaobject>
- </screenshot>
- </figure>
- </para>
- </sect2>
- </sect1>
-</chapter>
diff --git a/help/no/usage-mail.sgml b/help/no/usage-mail.sgml
deleted file mode 100644
index 2a1958805e..0000000000
--- a/help/no/usage-mail.sgml
+++ /dev/null
@@ -1,2005 +0,0 @@
-<chapter id="usage-mail">
- <title>Using Evolution for Email</title>
- <para>
- This chapter, and <xref linkend="usage-mail-organize">, will
- provide you with an in-depth guide to the capabilities of
- Evolution as a mail client. For information about how to set up
- your mail account, see <xref linkend="config-prefs-mail">.
- </para>
-
- <note>
- <title>If you use IMAP Mail</title>
- <para>
- If you chose IMAP mail during the setup process, you must
- subscribe to your mail folders before you can read mail in
- them. Read <xref linkend="usage-mail-subscriptions"> to find out
- how.
- </para>
- </note>
-
-
- <sect1 id="usage-mail-getnsend-read">
- <title>Reading Mail</title>
- <para>
- Start the mail client by clicking on the
- <guibutton>Inbox</guibutton> icon in the shortcut bar, or by
- selecting a mail folder in the folder bar. To read a message,
- select it in the message list; if you'd like to see it in its
- own window, double-click on it or press
- <keycombo action="simul">
- <keycap>Ctrl</keycap>
- <keycap>O</keycap>
- </keycombo>.
- </para>
-
- <tip id="spaceandbs">
- <title>Reading Mail with the Keyboard</title>
- <para>
- You can click the spacebar to page down while you're reading
- an email, and press backspace to page up in an email. This
- may help to make reading your email faster.
- </para>
- </tip>
-
- <sect2 id="usage-mail-listorder">
- <title>Sorting the message list</title>
- <para>
- <application>Evolution</application> helps you work by letting you sort
- your email. To sort by sender, subject, or date, click
- on the bars with those labels at the top of the message
- list. The direction of the arrow next to the label indicates
- the direction of the sort, and if you click again, you'll
- sort them in reverse order. For example, click once on
- <guilabel>Date</guilabel> to sort messages by date from
- oldest to newest. Click again, and
- <application>Evolution</application> sorts the list from
- newest to oldest. You can also right-click on the message
- header bars to get a set of sorting options, and add or
- remove columns from the message list. You can find detailed
- instructions on how to customize your message display
- columns in <xref linkend="usage-mail-organize-columns">.
- </para>
-
- <tip id="view-headers">
- <title>Email Headers</title>
- <para>
- To look at the complete headers for email messages, select
- <menuchoice><guimenu>View</guimenu><guisubmenu>Message
- Display</guisubmenu><guimenuitem>Show Full
- Headers</guimenuitem></menuchoice>. To see absolutely every
- bit, choose
- <menuchoice><guimenu>View</guimenu><guisubmenu>Message
- Display</guisubmenu><guimenuitem>Show Email Source
- </guimenuitem></menuchoice>.
- </para>
- </tip>
-
- <para>
- You can also choose a threaded message view. Select
- <menuchoice>
- <guimenu>View</guimenu>
- <guimenuitem>Threaded</guimenuitem>
- </menuchoice>
- to turn the threaded view on or off. When you select this option,
- <application>Evolution</application> groups the replies to a
- message with the original, so you can follow the thread of a
- conversation from one message to the next.
- </para>
-<figure>
- <title>Threaded Mail View</title>
-<screenshot>
-<screeninfo>Threaded Mail View</screeninfo>
-<mediaobject><imageobject><imagedata format="png" fileref="figures/mail-threaded" srccredit="Aaron Weber">
-</imageobject></mediaobject>
-</screenshot>
-</figure>
-
- </sect2>
-
- <sect2 id="usage-mail-getnsend-delete">
- <title>Deleting Mail</title>
- <para>
- Once you've read your mail, you may want to get rid of
- it.
- To delete a message:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Click the message to select it
- </para>
- </listitem>
- <listitem>
- <para>
- Press delete button or right click on the message and
- choose <guilabel>Delete</guilabel>.
- </para>
- <note>
- <title>Why do I still see deleted mail?</title>
- <para>
- When you press <guibutton>Delete</guibutton> or click
- the trash button, your mail isn't actually deleted,
- but is marked for deletion. Your email is not gone
- until you have expunged it. When you "Expunge" a
- folder, you remove all the mail that you have marked
- for deletion.
- </para>
- <para>
- If you don't like this behavior, select
- <menuchoice><guimenu>View</guimenu><guimenuitem>Hide
- Deleted Messages</guimenuitem></menuchoice>. Then,
- you will only see deleted messages when you look in
- your <guilabel>Trash</guilabel> folder.
- </para>
- </note>
- </listitem>
- <listitem>
- <para>
- Click
- <menuchoice>
- <guimenu>Actions</guimenu>
- <guimenuitem>Expunge</guimenuitem>
- </menuchoice>
- or press
- <keycombo action="simul">
- <keycap>Ctrl</keycap>
- <keycap>E</keycap>
- </keycombo>
- </para>
- </listitem>
- </orderedlist>
- </para>
- <note>
- <title>Trash is Actually a vFolder?</title>
- <para>
- Your trash folder is actually a vFolder that displays all
- messages you have marked for later deletion. For more
- information about vFolders, see <xref
- linkend="usage-mail-organize-vfolders">. If you choose
- <menuchoice> <guimenu>Actions</guimenu> <guimenuitem>Empty
- Trash</guimenuitem> </menuchoice> you will expunge
- <emphasis>all</emphasis> your folders.
- </para>
- </note>
- </sect2>
- <sect2 id="usage-mail-getnsend-undelete">
- <title>Undeleting Messages</title>
- <para>
- To undelete a message:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Select a message you have marked for deletion.
- </para>
- </listitem>
- <listitem>
- <para>
- Press <keycombo
- action="simul"><keycap>Ctrl</keycap><keycap>U</keycap>
- </keycombo>
- or choose
- <menuchoice>
- <guimenu>Actions</guimenu>
- <guimenuitem>Undelete</guimenuitem>
- </menuchoice>
-
- </para>
- <note>
- <title>What does Undelete actually do?</title>
- <para>
- If you have marked a message for deletion, undeleting
- it will unmark it, and the message will be removed
- from the Trash folder. However, it can't bring back
- messages that have been expunged.
- </para>
- </note>
- </listitem>
- </orderedlist>
- </para>
- </sect2>
- </sect1>
-
- <sect1 id="usage-mail-getnsend-get">
- <title>Checking for New Mail</title>
- <para>
- Now that you've had a look around the
- <interface>Inbox</interface>, it's time to check for new mail.
- Click <guibutton>Get Mail</guibutton> in the toolbar to check
- your mail. If you haven't entered any mail settings yet, the
- <interface>setup assistant</interface> will ask you for the
- information it needs to check your email.
- </para>
- <para>
- The assistant will give you several dialog boxes where you configure:
- <itemizedlist>
- <listitem>
- <para>
- your personal information
- </para>
- </listitem>
- <listitem>
- <para>
- your outgoing email server information
- </para>
- </listitem>
- <listitem>
- <para>
- your mail account identity name
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- To check your email, press the <guibutton>Check Mail</guibutton>
- button. If this is your first time checking mail, or you
- haven't asked <application>Evolution</application> to store your
- password, you'll be prompted for the password. Enter your
- password and your email will be downloaded.
- </para>
- <note id="badmailsettings">
- <title>Can't Check Mail?</title>
- <para>
- If you get an error message instead of mail, you probably need
- to check your network settings. To learn how to do that, have
- a look at <xref linkend="config-prefs-mail">, or ask your
- system administrator.
- </para>
- </note>
-
-
-
- <tip>
- <title>Sharing Mailboxes with Other Mail Programs</title>
- <para>
- If you want to use <application>Evolution</application>
- and another email client, such as
- <application>Mutt</application>, at the same time,
- here's how:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Download your mail in the other application as
- you would normally.
- </para>
- </listitem>
- <listitem>
- <para>
- In <application>Evolution</application>
- <menuchoice><guimenu>Tools</guimenu><guimenuitem>Mail
- Settings</guimenuitem></menuchoice>, and pick the account
- you'd like to use to share mail. You may want to
- create a new account just for this source of
- mail.
- </para>
- </listitem>
- <listitem>
- <para>
- Under the <guilabel>Receiving Mail</guilabel>
- tab, select the type of mail file that your
- other mail application uses, and then enter the
- full path to that file.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the <guibutton>OK</guibutton> button.
- </para>
- </listitem>
- </orderedlist>
- </para>
- </tip>
-
-
-<!-- NOT FOR 1.0
- <sect2 id="usage-mail-getnsend-get-news">
- <title>Using Evolution for News</title>
- <para>
- Newsgroups are so similar to email that there's no reason not
- to read them side by side. If you want to do that, add a
- news source to your configuration (see <xref
- linkend="config-prefs-network-news">). The news server will
- appear as a remote server, and will look quite similar to an
- IMAP folder. When you click <guibutton>Get Mail</guibutton>,
- <application>Evolution</application> will also check for news
- messages.
- </para>
- </sect2>
--->
-
- <sect2 id="usage-mail-getnsend-get-attach">
- <title>Working with Attachments and HTML Mail</title>
- <para>
- If someone sends you an <glossterm linkend="attachment">attachment</glossterm>,
- a file attached to an email,
- <application>Evolution</application> will display the file
- at the bottom of the message to which it's attached. Text,
- including HTML formatting and embedded images, will appear
- as part of the message, rather than at the end of the
- message as an attachment.
- </para>
-
- <sect3 id="usage-mail-getnsend-get-attach-actions">
- <title>Saving or Opening Attachments</title>
- <para>
- If you get an attachment with an email message,
- <application>Ximian Evolution</application> can help you save
- it or open it with the appropriate applications.
- </para>
- <para>
- To save an attachment to disk:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Click the downward pointing arrow on the attachment icon
- and select <guimenuitem>Save to Disk</guimenuitem>.
- </para>
- </listitem>
- <listitem>
- <para>
- Choose a location and name for the file.
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guibutton>OK</guibutton>.
- </para>
- </listitem>
- </orderedlist>
- </para>
-
- <para>
- To Open an Attachment in a Program:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Open the mail message with the attachment you want to read.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the arrow next the attachment icon.
- </para>
- </listitem>
- <listitem>
- <para>
- Select the program you'd like to use. It will start up
- and open the document.
- </para>
- </listitem>
- </orderedlist>
- </para>
- <para>
- </para>
- </sect3>
-
- <sect3 id="usage-mail-getnsend-get-attach-html">
- <title>Inline Images in HTML Mail</title>
- <para>
- When someone sends you HTML mail that includes an image in
- the body of the message (for example, the welcome message in your
- Inbox when you first start <application>Ximian
- Evolution</application>) <application>Evolution</application>
- will display the image inside the message. You can create
- messages like this by using the
- <menuchoice><guimenu>Insert</guimenu><guimenuitem>Image</guimenuitem></menuchoice>
- tool in the message composer.
- </para>
-
- <para>
- If the image isn't included in the message, but is, instead,
- a link to an image, <application>Evolution</application> can
- download the image from the Internet for you. However,
- <application>Evolution</application> will not display the
- image unless you ask it to. This is because remotely hosted
- images can be slow to load and display, and can even be used
- by spammers to track who reads their email. Having images
- not load automatically helps protect your privacy.
- </para>
- <para>
- If you want the images to load for one message, select
- <menuchoice>
- <guimenu>View</guimenu>
- <guisubmenu>Message Display</guisubmenu>
- <guimenuitem>Load Images</guimenuitem>
- </menuchoice>.
-
- If you want <application>Ximian Evolution</application> to
- load remotely hosted images more often, go to the
- <guilabel>Display</guilabel> tab of the
- <menuchoice>
- <guimenu>Tools</guimenu>
- <guimenuitem>Mail Settings</guimenuitem>
- </menuchoice> dialog.
- </para>
- <note id="http-proxy">
- <title>Loading Images from the Net through an HTTP Proxy</title>
- <para>
- If you use an HTTP proxy,
- <application>Evolution</application> must be able to find
- it through the <systemitem>gnome-vfs</systemitem> subsystem
- before it can load images from the Internet. This is also
- the case if you wish to access weather and news information
- through the Summary tool. You can tell the GNOME Virtual
- File System about your HTTP proxy in one of two ways:
- <variablelist>
- <varlistentry>
- <term>Configure it with Nautilus</term>
- <listitem>
- <para>
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Open a Nautilus window
- </para>
- </listitem>
- <listitem>
- <para>
- Select <menuchoice>
- <guimenu>Preferences</guimenu>
- <guimenuitem>Edit Preferences</guimenuitem>
- </menuchoice>.
- </para>
- </listitem>
- <listitem>
- <para>
- Go to the <guilabel>Navigation</guilabel> tab.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the <guilabel>Use HTTP Proxy</guilabel>
- checkbox and enter the location of your HTTP
- proxy in the <guilabel>Location</guilabel> field.
- </para>
- </listitem>
- </orderedlist>
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Configure it with the gconftool command</term>
- <listitem>
- <para>
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Open a terminal.
- </para>
- </listitem>
- <listitem>
- <para>
- Enter the command
- <command>
- gconftool --type=bool --set /system/gnome-vfs/use-http-proxy "TRUE"
- </command>
- </para>
- </listitem>
- <listitem>
- <para>
- Enter the command
- <command>
- gconftool --type=string --set /system/gnome-vfs/http-proxy-host "your-proxy-url"
- </command>
- </para>
- </listitem>
- <listitem>
- <para>
- Enter the command
- <command>
- gconftool --type=int --set /system/gnome-vfs/http-proxy-port "8080"
- </command>
- </para>
- </listitem>
- </orderedlist>
- </para>
- <para>
- For more information about the gconftool command,
- read the gconftool man page.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </note>
- </sect3>
- </sect2>
- </sect1>
-
- <sect1 id="usage-mail-getnsend-send">
- <title>Composing New Email Messages</title>
- <para>
- You can start writing a new email message by selecting
- <menuchoice> <guimenu>File</guimenu>
- <guisubmenu>New</guisubmenu> <guimenuitem>
- Mail Message</guimenuitem></menuchoice>, or by pressing the
- <guibutton>Compose</guibutton> button in the Inbox toolbar.
- When you do so, the <interface>New Message</interface> window
- will open, as shown in <xref
- linkend="usage-mail-newmsg-fig">.
- </para>
-
-<!-- ==============Figure=================================== -->
- <figure id="usage-mail-newmsg-fig">
- <title>New Message Window</title>
- <screenshot>
- <screeninfo>Evolution Main Window</screeninfo>
- <mediaobject><imageobject><imagedata fileref="figures/newmsg" format="png" srccredit="Aaron Weber">
- </imageobject></mediaobject>
- </screenshot>
- </figure>
-<!-- ==============End of Figure=================================== -->
-
- <para>
- Enter an address in the <guilabel>To:</guilabel> field. If you
- wish, enter a subject in the <guilabel>Subject:</guilabel>, and
- a message in the box at the bottom of the window.
- Once you have written your message, press
- <guibutton>Send</guibutton>.
- </para>
-
- <sect2 id="usage-mail-getnsend-send-delay">
- <title>Sending Composed Messages Later</title>
- <para>
- <application>Evolution</application> will send mail
- immediately unless you tell it to do otherwise by selecting
- <menuchoice> <guimenu>File</guimenu> <guimenuitem>Send
- Later</guimenuitem></menuchoice>. This will add your
- messages to the <guilabel>Outbox</guilabel> queue. The
- "Send Later" feature is particularly useful if you use a
- modem to connect to the Internet and pay per-minute
- charges: you can remain offline until you need to send
- mail, then connect and send all your mail at once. Mail in
- the outbox is sent when you click
- <guibutton>Send/Recieve</guibutton> in the main window.
- </para>
- <para>
- To learn more about how you can specify message queue and
- filter behavior, see <xref linkend="config-prefs-mail">.
- </para>
- <note>
- <title>Working Offline</title>
- <para>
- Select
- <menuchoice><guimenu>File</guimenu><guimenuitem>Work
- Offline</guimenuitem></menuchoice> to have
- <application>Ximian Evolution</application> disconnect
- from the Internet while you work. When you want to
- reconnect, choose
- <menuchoice><guimenu>File</guimenu><guimenuitem>Work
- Online</guimenuitem></menuchoice>. Alternativly, you can click the connection button at the bottom left side of the window.
- </para>
- </note>
-
- <para>
- You can also choose to save messages as drafts or as text
- files. Your options are:
- <itemizedlist>
- <listitem><para>
- Choose
- <menuchoice>
- <guimenu>File</guimenu>
- <guimenuitem>Save Draft</guimenuitem>
- </menuchoice>
- to store your messages in the drafts folder for later
- revision.
- </para></listitem>
-
- <listitem><para>
- If you'd like to have the message sent later, you
- can choose <guimenuitem>Send Later</guimenuitem>. That way,
- the message will be added to the queue, and you can send a
- batch of messages all at once.
- </para></listitem>
-
- <listitem><para>
- If you prefer to save your message as a text file,
- choose <guimenuitem>Save As</guimenuitem> and then choose a
- file name.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- </sect2>
-
- <sect2 id="usage-mail-getnsend-send-compose">
- <title>More About Mail Composition</title>
- <para>
- In the next few sections, you'll see how
- <application>Evolution</application> handles advanced email
- features, including large recipient lists, attachments, and
- forwarding.
- </para>
- <sect3 id="usage-mail-getnsend-send-attach">
- <title>Attachments</title>
- <para>
- To attach a file to your email:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Push the attach button in the composer toolbar
- </para>
- </listitem>
- <listitem>
- <para>
- Select the file you want to attach
- </para>
- </listitem>
- <listitem>
- <para>
- Press <guibutton>OK</guibutton>
- </para>
- </listitem>
- </orderedlist>
- </para>
- <para>
- You can drag a file from your desktop into the composer window to
- attach it as well.
- </para>
- <para>
- To hide the display of files you've attached to the
- message, select <menuchoice>
- <guimenu>View</guimenu> <guimenuitem>Hide
- Attachments</guimenuitem> </menuchoice>; to show them
- again, choose <guimenuitem>Show Attachments</guimenuitem>.
- </para>
- <para>
- When you send the message, a copy of the attached file
- will go with it. Be aware that big attachments can take a
- long time to download.
- </para>
- </sect3>
-
- <sect3 id="usage-mail-getnsend-send-to-types">
- <title>Specifying Recipients for Email</title>
- <para>
- <application>Evolution</application>, like most email
- programs, recognizes three types of addressee: primary
- recipients, secondary recipients, and hidden ("blind")
- recipients.
- </para>
- <para>
- The simplest way to direct a message is to put the email
- address or addresses in the <guilabel>To:</guilabel>
- field, which denotes primary recipients. To send mail to
- more than one or two people, you can use the
- <guilabel>Cc:</guilabel> field.
- </para>
- <para>
- Hearkening back to the dark ages when people used
- typewriters and there were no copy machines, "Cc" stands
- for "Carbon Copy." Use it whenever you want to share a
- message you've written to someone else.
- </para>
- <para>
- <guilabel>Bcc:</guilabel> is a little more complex. You
- use it like <guilabel>Cc:</guilabel>, but people on the
- <guilabel>Bcc:</guilabel> list are hidden from the other
- recipients of the message. Use it to send mail to large
- groups of people, especially if they don't know each other
- or if privacy is a concern. If your <guilabel>Bcc:</guilabel> field is absent, click
- <menuchoice>
- <guimenu>View</guimenu>
- <guimenuitem>Bcc Field</guimenuitem>
- </menuchoice>.
-
- </para>
-
- <para>
- If you frequently write email to the same groups of people,
- you can create address lists in the Contact Manager, and
- then send them mail as though they had a single address.
- To learn how to do that, read <xref
- linkend="usage-contact-organize-group-list">.
- </para>
-
- </sect3>
-
- <sect3 id="usage-mail-getnsend-send-to">
- <title>Choosing Recipients Quickly</title>
- <para>
- If you have created address cards in the contact manager,
- you can also enter nicknames or other portions of address
- data, and <application>Evolution</application> will offer a
- drop down list of possible address completions from your
- address book. If you enter a name or nickname that can go
- with more than one card, Evolution will open a dialog box to
- ask you which person you meant.
-
-<!-- Also, <application>Evolution</application> will add a
- domain to any unqualified addresses. By default, this is
- your domain, but you can choose which one mail preferences
- dialog. NOTE: Bug filed on this: it's not available now,
- but may be in the future.
--->
-
- </para>
-
- <para>
- Alternately, you can click on the
- <guibutton>To:</guibutton>, <guibutton>Cc:</guibutton>, or
- <guibutton>Bcc:</guibutton> buttons to get a list --
- potentially a very long one -- of the email addresses
- in your contact manager. Select addresses and click on
- the arrows to move them into the appropriate address
- columns.
- </para>
- <para>
- For more information about using email together with the
- contact manager and the calendar, see <xref
- linkend="contact-automation-basic"> and <xref
- linkend="usage-calendar-apts">.
- </para>
- </sect3>
- </sect2>
-
- <sect2 id="usage-mail-getnsend-send-reply">
- <title>Replying to Email Messages</title>
- <para>
- To reply to a message, press the
- <guibutton>Reply:</guibutton> button while it is selected,
- or choose <guimenuitem>Reply to Sender:</guimenuitem> from
- the message's right-click menu. That will open the
- <interface>message composer</interface>. The
- <guilabel>To:</guilabel> and <guilabel>Subject:</guilabel>
- fields will already be filled, although you can alter them
- if you wish. In addition, the full text of the old message
- is inserted into the new message, either grey (for
- HTML display) or with the &gt; character before each line
- (in plain text mode), to indicate that it's part of the
- previous message. People often intersperse their message
- with the quoted material as shown in <xref
- linkend="usage-mail-getnsend-reply-fig">.
-
- <!-- ==============Figure=================================== -->
- <figure id="usage-mail-getnsend-reply-fig">
- <title>Reply Message Window</title>
- <screenshot>
- <screeninfo>Evolution Main Window</screeninfo>
- <mediaobject><imageobject><imagedata fileref="figures/replymsg" format="png" srccredit="Aaron Weber">
- </imageobject></mediaobject>
- </screenshot>
- </figure>
-<!-- ==============End of Figure=================================== -->
- </para>
- <para>
- If you're reading a message with several recipients, you may
- wish to use <guibutton>Reply to All</guibutton> instead of
- <guibutton>Reply</guibutton>. If there are large numbers
- of people in the <guilabel>Cc:</guilabel> or
- <guilabel>To:</guilabel> fields, this can save substantial
- amounts of time.
- <example>
- <title>Using the Reply to All feature</title>
- <para>
- Susan sends an email to a client and sends copies to Tim
- and to an internal company mailing list of co-workers.
- If Tim wants to make a comment for all of them to read,
- he uses <guibutton>Reply to All</guibutton>, but if he
- just wants to tell Susan that he agrees with her, he
- uses <guibutton>Reply</guibutton>. Note that his reply
- will not reach anyone that Susan put on her
- <guilabel>Bcc</guilabel> list, since that list is not
- shared with anyone.
- </para>
- </example>
- </para>
- <para>
- If you're subscribed to a mailing list, and want your reply
- to go just to the list, rather than to the sender, choose
- <guibutton>Reply to List</guibutton> instead of
- <guibutton>Reply</guibutton> or <guibutton>Reply to
- All</guibutton>.
- <note>
- <title>What is a Mailing List?</title>
- <para>
- Mailing Lists are one of the most popular tools for
- group collaboration on the Internet. Here's how they work:
- <simplelist>
- <member>
- Someone sends a message to a single address, like
- <email>evolution@ximian.com</email>.
- </member>
- <member>
- That address belongs to a program that distributes
- the message to a list of recipients.
- </member>
- </simplelist>
- The mail management program lets individuals subscribe
- to or unsubscribe from the list at will, without
- requiring the message writers to remember the addresses
- of every recipient.
- </para>
- <para>
- Mailing list servers can also let network administrators
- control mail flow, list membership, and even moderate
- the content of mailing lists.
- </para>
- </note>
- </para>
- </sect2>
-
- <sect2 id="usage-mail-getnsend-send-find">
- <title>Searching and Replacing with the Composer</title>
- <para>
- You are probably familiar with search and replace features
- in any sort of text-editing software, and if you come from
- a Linux or Unix background, you may know what
- <guimenuitem>Find Regex</guimenuitem> does. If you aren't
- among the lucky who already know, here's a quick rundown of
- the automated text searching features that the message
- composer makes available to you.
- </para>
- <para>
- <variablelist>
- <varlistentry>
- <term><guimenuitem>Find:</guimenuitem></term>
- <listitem><para> Enter a word or phrase, and
- <application>Evolution</application> will find it
- in your message.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Find Regex:</guimenuitem></term>
- <listitem>
- <para>
- Find a regex, also called a
- <glossterm linkend="regular-expression">regular
- expression</glossterm>, in your composer window.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Find Again:</guimenuitem></term>
- <listitem><para>
- Select this item to repeat the last search you performed.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guimenuitem>Replace:</guimenuitem></term>
- <listitem><para>
- Find a word or phrase, and replace it with
- something else.
- </para></listitem>
- </varlistentry>
-
- </variablelist>
- </para>
-
- <para>
- For all of these menu items, you can choose whether or not
- to <guilabel>Search Backwards</guilabel> in the document
- from the point where your cursor is. For all but the
- regular expression search (which doesn't need it), you are
- offered a check box to determine whether the search is to
- be <guilabel>Case Sensitive</guilabel> when it determines
- a match.
- </para>
- </sect2>
-
- <sect2 id="usage-mail-getnsend-send-html">
- <title>Enhance your email with HTML</title>
- <para>
- Normally, you can't set text styles or insert pictures in
- emails, which is why email is often regarded as
- uncommunicative and cold, and why people often resort to
- using far too many exclamation points to convey their
- feelings. However, most newer email programs can display
- images and text styles as well as basic alignment and
- paragraph formatting. They do this with <glossterm
- linkend="html">HTML</glossterm>, just like web pages do.
- </para>
- <note>
- <title>HTML Mail is not a Default Setting</title>
- <para>
- Some people do not have HTML-capable mail clients, or
- prefer not to receive HTML-enhanced mail because it is
- slower to download and display. Because some people may
- prefer not to get HTML mail,
- <application>Evolution</application> sends plain text
- unless you explicitly ask for HTML.
- </para>
- </note>
-
- <para> You can change the format of an email message between
- plain text and HTML by choosing <menuchoice>
- <guimenu>Format</guimenu> <guimenuitem>
- HTML</guimenuitem></menuchoice>.
- </para>
- <para>
- To send all your mail as HTML by default, set your mail
- format preferences in the mail configuration dialog. See
- <xref linkend="config-prefs-mail-other"> for more
- information.
- </para>
- <para>
- HTML formatting tools are located in the toolbar just above
- the space where you'll actually compose the message, and
- they also appear in the <guimenu>Insert</guimenu> and
- <guimenu>Format</guimenu> menus.
- </para>
- <para>
- The icons in the toolbar are explained in <glossterm
- linkend="tooltip">tool-tips</glossterm>, which appear when
- you hold your mouse over the buttons. The buttons fall
- into four categories:
- <variablelist>
- <varlistentry>
- <term>Headers and lists:</term>
- <listitem>
- <para>
- At the left edge of the toolbar, you can choose
- <guilabel>Normal</guilabel> for a default text style
- or <guilabel>Header 1</guilabel> through
- <guilabel>Header 6</guilabel> for varying sizes of
- header from large (1) to tiny (6). Other styles
- include <guilabel>preformat</guilabel>, to use the HTML
- tag for preformatted blocks of text, and three types
- of bullet points for the highly
- organized.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Text style:</term>
- <listitem>
- <para>
- Use these buttons to determine the way your letters
- look. If you have text selected, the style will
- apply to the selected text. If you do not have text
- selected, the style will apply to whatever you type
- next. The buttons are:
- <itemizedlist mark="none">
- <listitem><para>Push <guibutton>B</guibutton> for bold text</para></listitem>
- <listitem><para>Push <guibutton>I</guibutton> for italics</para></listitem>
- <listitem><para>Push <guibutton>U</guibutton> to underline</para></listitem>
- <listitem><para>Push <guibutton>S</guibutton> for a strikethrough.</para></listitem>
- </itemizedlist>
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Alignment:</term>
- <listitem>
- <para>
- Located next to the text style buttons, these three
- paragraph icons should be familiar to users of most
- word processing software. The leftmost button will
- make your text aligned to the left, the center
- button, centered, and the right hand button,
- aligned on the right side.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Indentation rules:</term>
- <listitem>
- <para>
- The button with the arrow pointing left will reduce
- a paragraph's indentation, and the right arrow will
- increase its indentation.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Color Selection:</term>
- <listitem>
- <para>
- At the far right is the color section tool. The
- colored box displays the current text color; to
- choose a new one, click the arrow button just to the
- right. If you have text selected, the color will
- apply to the selected text. If you do not have text
- selected, the color will apply to whatever you type
- next. You can select a background color or image by
- right-clicking on the message background and
- selecting <guilabel>Page</guilabel>.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- <para>
- The <guimenu>Insert</guimenu> gives you opinions which let you
- spruce up your email to make it more interesting:
- <variablelist>
- <varlistentry>
- <term><guimenuitem>Link:</guimenuitem></term>
- <listitem>
- <para>
- Lets you link some text to a website. Use this tool to put hyperlinks in your HTML
- messages. If you don't want special link text, you can just enter the address
- directly, and <application>Evolution</application>
- will recognize it as a link. To add a link:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Select the text you wish to link from.
- </para>
- </listitem>
- <listitem>
- <para>
- Right click on the text and click on <guibutton>Link</guibutton>.
- </para>
- </listitem>
- <listitem>
- <para>
- Put the URL you want to use in the <guilabel>URL</guilabel> field.
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guibutton>OK</guibutton>.
- </para>
- </listitem>
- </orderedlist>
- </para>
- <note>
- <para>
- If you're typing a webpage address to be automatically formatted, keep in mind that a space terminates the link.
- </para>
- </note>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guimenuitem>Image:</guimenuitem></term>
- <listitem>
- <para>
- Lets you put an image alongside text.
- </para>
- <para>
- To insert an image into your email:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Open a new email by clicking <guibutton>New Message</guibutton>
- </para>
- </listitem>
- <listitem>
- <para>
- Make sure that you have the
- <menuchoice>
- <guimenu>Format</guimenu>
- <guimenuitem>HTML</guimenuitem>
- </menuchoice>
- selector checked.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the <guibutton>Insert Image</guibutton> button in the toolbar, or select
- <menuchoice>
- <guimenu>Insert</guimenu>
- <guimenuitem>Image</guimenuitem>
- </menuchoice>.
- </para>
- </listitem>
- <listitem>
- <para>
- Choose your image by clicking the <guibutton>Browse</guibutton> button.
- </para>
- </listitem>
- <listitem>
- <para>
- Press <guibutton>Insert</guibutton> to insert the image.
- </para>
- </listitem>
- </orderedlist>
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><guimenuitem>Rule:</guimenuitem></term>
- <listitem>
- <para>
- Inserts a horizontal line into the text to help divide two
- sections.
- </para>
- <para>
- To insert a rule:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Open a new email by clicking <guibutton>New Message</guibutton>
- </para>
- </listitem>
- <listitem>
- <para>
- Make sure that you have the
- <menuchoice>
- <guimenu>Format</guimenu>
- <guimenuitem>HTML</guimenuitem>
- </menuchoice>
- selector checked.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the <guibutton>Rule</guibutton> button in the <guilabel>Toolbar</guilabel>.
- </para>
- </listitem>
- <listitem>
- <para>
- Select the type of rule. You can use a plain
- line, a 3D line, or a yellow line with flowers.
- </para>
- </listitem>
- <listitem>
- <para>
- Choose the size of the line, as a percentage of the width of the email window.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Choose the alignment and style. For the plain
- line, you can choose the thickness of the line,
- and whether it will be shaded, or solid. For the
- other types, you can only choose alignment.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Click <guibutton>Insert</guibutton> to insert the rule.
- </para>
- </listitem>
- </orderedlist>
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Table:</term>
- <listitem>
- <para>
- Inserts a table into the text to help divide two
- sections.
- </para>
- <para>
- To insert a rule:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Open a new email by clicking <guibutton>New Message</guibutton>
- </para>
- </listitem>
- <listitem>
- <para>
- Make sure that you have the
- <menuchoice>
- <guimenu>Format</guimenu>
- <guimenuitem>HTML</guimenuitem>
- </menuchoice>
- selector checked.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the <guibutton>Table</guibutton> button in the <guilabel>Toolbar</guilabel>.
- </para>
- </listitem>
- <listitem>
- <para>
- Select the <guibutton>Template</guibutton> you wish to use. Each template has a slightly different feel and layout.
- </para>
- </listitem>
- <listitem>
- <para>
- If you so desire, you may change the other options such as: number of rows, columns, spacing of each cell, and more.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the <guibutton>Insert</guibutton> button.
- </para>
- </listitem>
- </orderedlist>
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- To add a hyperlink to your HTML message:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Select the text you want to display as a link.
- </para>
- </listitem>
- <listitem>
- <para>
- Right click on text and select
- <guimenuitem>Link</guimenuitem>
- </para>
- </listitem>
- <listitem>
- <para>
- Enter the address you wish to link to in the
- <guilabel>URL</guilabel> field.
- </para>
- </listitem>
- <listitem>
- <para>
- Press <guibutton>OK</guibutton>.
- </para>
- </listitem>
- </orderedlist>
- </para>
-
- <para>
- To add an image to your HTML message:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Select
- <menuchoice>
- <guimenu>Insert</guimenu>
- <guimenuitem>Image</guimenuitem>
- </menuchoice>.
- </para>
- </listitem>
- <listitem>
- <para>
- Click <guibutton>Browse</guibutton> to select the image
- you want to include in your email.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Along the right side of the window, choose the alignment,
- border, and other attributes of the image. If you change
- the size attributes, the image will be shrunk or stretched
- to fit the size you have chosen.
- </para>
- </listitem>
-
- <listitem>
- <para>
- If you would like to make the image a clickable link,
- enter a URL in the <guilabel>Link</guilabel> tab of the
- window.
- </para>
- </listitem>
-
- <listitem>
- <para>
- When you are finished, press
- <guibutton>Insert</guibutton> to include the image in
- your message.
- </para>
- </listitem>
- </orderedlist>
- </para>
- <para>
- You can insert an image into the background of your message by
- right-clicking on the message background and selecting
- <guimenuitem>Page</guimenuitem>. From that dialog, you may
- also select background color and set other general options
- about the html message you are composing.
- </para>
- <sect3 id="html-templates">
- <title>HTML Templates</title>
- <para>
- <application>Evolution</application> not only allows you to
- decorate your email with HTML text and graphics, but
- provides you with prebuilt templates for you to use when
- making these improvements. You can use these to emphasize a
- point or frame an image in an attractive manner.
- </para>
- <para>
- To include a template into your HTML based email:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Create a new email by clicking <guibutton>New Message</guibutton>.
- </para>
- </listitem>
- <listitem>
- <para>
- Make sure that the
- <menuchoice>
- <guimenu>
- Format
- </guimenu>
- <guimenuitem>
- HTML
- </guimenuitem>
- </menuchoice>
- selector is checked.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the <guibutton>HTML Template</guibutton> button in the
- <guilabel>Toolbar</guilabel> or select
- <menuchoice>
- <guimenu>
- Insert
- </guimenu>
- <guimenuitem>
- HTML Template
- </guimenuitem>
- </menuchoice>
- </para>
- </listitem>
- <listitem>
- <para>
- Select the template type in the
- <guilabel>Template</guilabel> selection box. Your
- options are <guilabel>Note</guilabel> and
- <guilabel>Image Frame</guilabel>.
- </para>
- </listitem>
- <listitem>
- <para>
- Set the size and alignment of the HTML template.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Click <guibutton>Insert</guibutton> to insert it where the
- cursor is.
- </para>
- </listitem>
- <listitem>
- <para>
- Once you have inserted the template, click on the text
- in the template, and enter the text you want to use.
- </para>
- <para>
- If you have selected an image frame template,
- right-click on the image and select
- <guimenuitem>Image</guimenuitem> to select the image
- you want to place in the frame.
- </para>
- </listitem>
- </orderedlist>
- </para>
- </sect3>
- <sect3 id="composer-tables">
- <title>Tables in Email</title>
- <para>
- <application>Evolution</application> allows you to put
- tables in your HTML email to help organize your thoughts.
- These tables are a simplified version of what you might find
- in a spreadsheet program like
- <application>Gnumeric</application>.
- </para>
- <para>
- To include a table in your email:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Create a new email by clicking <guibutton>New Message</guibutton>.
- </para>
- </listitem>
- <listitem>
- <para>
- Make sure you have the
- <menuchoice>
- <guimenu>
- Format
- </guimenu>
- <guimenuitem>
- HTML
- </guimenuitem>
- </menuchoice>
- selector checked.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Select
- <menuchoice>
- <guimenu>
- Insert
- </guimenu>
- <guimenuitem>
- Table
- </guimenuitem>
- </menuchoice>
- or click the <guiicon>Table</guiicon> button in the
- toolbar.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Select the template, or style, you want to use for the
- table.
- </para>
- </listitem>
- <listitem>
- <para>
- Set the number of rows and columns you want.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the <guibutton>Insert</guibutton> button.
- </para>
- </listitem>
- <listitem>
- <para>
- Click in a cell and type to insert text into the table.
- </para>
- </listitem>
- </orderedlist>
- </para>
- <para>
- You can also edit a table after creation. Just right-click
- on it and select <guimenuitem>Table</guimenuitem> to open
- the table editing window again. Or, you can select items
- from the <guimenu>Table Delete</guimenu> and <guimenu>Table
- Insert</guimenu> menus.
- </para>
-
- <para>
- <tip id="table-tip">
- <title>Deleting an Entire Table</title>
- <para>
- You can delete an entire table by right-clicking on
- a table or other HTML object in a message, and selecting
- <menuchoice>
- <guimenu>Table Delete</guimenu>
- <guimenuitem>Table</guimenuitem> </menuchoice>. In an
- HMTL message, your signature, templates, and image
- inclusions all have tables around them, and you can remove
- them completely and quickly with this shortcut.
- </para>
- </tip>
- </para>
-
- </sect3>
- </sect2>
-
- <sect2 id="usage-mail-getnsend-fwd">
- <title>Forwarding Mail</title>
- <para>
- The post office forwards your mail for you when you change
- addresses, and you can forward a letter if it comes to you by mistake.
- The email <guilabel>Forward</guilabel> button
- works in much the same way. It's particularly useful if you
- have received a message and you think someone else would
- like to see it. You can forward a message as an attachment
- to a new message (this is the default) or
- you can send it <glossterm linkend="inline">inline</glossterm> as a quoted
- portion of the message you are sending. Attachment
- forwarding is best if you want to send the full, unaltered
- message on to someone else. Inline forwarding is best if
- you want to send portions of a message, or if you have a
- large number of comments on different sections of the
- message you are forwarding. Remember to note from whom the
- message came, and where, if at all, you have removed or
- altered content.
- </para>
- <para>
- To forward a message you are reading, press
- <guibutton>Forward</guibutton> on the toolbar, or select
- <menuchoice> <guimenu>Message</guimenu>
- <guimenuitem>Forward</guimenuitem> </menuchoice>. If you
- prefer to forward the message <glossterm linkend="inline">inline</glossterm>
- instead of attached, select <menuchoice>
- <guimenu>Message</guimenu> <guimenuitem>Forward
- Inline</guimenuitem> </menuchoice> from the menu. Choose an
- addressee as you would when sending a new message; the
- subject will already be entered, but you can alter it.
- Enter your comments on the message in the
- <interface>composition frame</interface>, and press
- <guibutton>Send</guibutton>.
- </para>
- </sect2>
-
- <sect2 id="usage-mail-getnsend-ettiquette">
- <title>Seven Tips for Email Courtesy</title>
- <para>
-
- <itemizedlist>
-
- <listitem>
- <para>
- Don't send spam or forward chain mail. If you must,
- watch out for hoaxes and urban legends, and make sure
- the message doesn't have multiple layers of
- greater-than signs, (&gt;) indicating multiple layers
- of careless in-line forwarding.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Always begin and close with a salutation. Say "please"
- and "thank you," just like you do in real life. You
- can keep your pleasantries short, but be pleasant!
- </para>
- </listitem>
-
- <listitem>
- <para>
- WRITING IN CAPITAL LETTERS MEANS YOU'RE SHOUTING!
- Don't write a whole message in capital letters. It
- hurts people's ears.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Check your spelling and use complete sentences. By
- default, <application>Evolution</application> will put
- a red line beneath words it doesn't recognize, as you
- type them.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Don't send nasty emails (flames). If you get one,
- don't write back.
- </para>
- </listitem>
-
- <listitem>
- <para>
- When you reply or forward, include just enough of
- the previous message to provide context: not too
- much, not too little.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Don't send spam.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para> Happy mailing! </para>
- </sect2>
- </sect1>
- <sect1 id="rsvp-stuff">
- <title>RSVPs in Mail</title>
- <para>
- If you create an event in the calendar component, you can then
- send invitations to the attendee list through the
- <application>Ximian Evolution</application> email tool. The
- invitation card is sent as an attachment in iCal format.
- </para>
- <para>
- If you click on the attachment button and click the
- <guibutton>View Inline</guibutton>, <application>Ximian
- Evolution</application> will show you information about the
- meeting, and let you respond to the meeting in several ways.
- Select the response that you would like, and then click the
- <guibutton>OK</guibutton> button.
- </para>
- <para>
- Your options are:
- <variablelist>
- <varlistentry>
- <term>Accept:</term>
- <listitem>
- <para>
- Select this entry if you will attend the meeting. When you
- click the <guibutton>OK</guibutton> button, the meeting will
- be entered into your calendar.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Tentatively Accept:</term>
- <listitem>
- <para>
- Select this entry if you will probably attend the meeting.
- When you click the <guibutton>OK</guibutton> button, the
- meeting will be entered into your calendar, but marked as
- tentative.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Decline:</term>
- <listitem>
- <para>
- Select this item if you will be unable to attend the
- meeting. The meeting will not be entered into your calendar
- when you click the <guibutton>OK</guibutton>, although your
- response will be sent to the meeting host if you have
- checked the <guilabel>RSVP</guilabel> box.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>RSVP:</term>
- <listitem>
- <para>
- Check this box if you would like your response sent to
- the meeting organizers.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </sect1>
-
- <sect1 id="usage-mail-subscriptions">
- <title>Subscription Management</title>
- <para>
- Since IMAP folders exist on the server, and opening them or
- checking them takes time, you need fine-grained control over the
- way that you use IMAP folders. That's why
- <application>Evolution</application> has an IMAP subscriptions
- manager. If you prefer to have every mail folder displayed, you
- can select that option as well. However, if you'd like to choose
- specific items in your mailbox, and exclude others, you can use
- the subscription management tool to do that.
- </para>
- <para>
- Here's how:
- <orderedlist numeration="arabic">
-
- <listitem>
- <para>
- Select
- <menuchoice><guimenu>Tools</guimenu><guimenuitem>Subscribe
- to Folders</guimenuitem></menuchoice>.
- </para>
- </listitem>
-
- <listitem>
- <para>
- If you have accounts on multiple IMAP servers, select the
- server where you'd like to manage your
- subscriptions. <application>Evolution</application> will
- display a list of available files and folders.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Select a file or folder by clicking on it. You will want
- to select at least the <guilabel>INBOX</guilabel>
- folder. Depending upon the way your IMAP server is
- configured, the list of available files may include
- non-mail folders. If it does, you can ignore them.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Click the <guibutton>Subscribe</guibutton> to add it to
- the subscribed list.
- </para>
- </listitem>
- <listitem>
- <para>
- When you have subscribed to the folders you want, close
- the window.
- </para>
- </listitem>
- </orderedlist>
- </para>
- </sect1>
-
- <sect1 id="encryption">
- <title>Encryption</title>
- <sect2 id="encryption-whatis">
- <title>What is Encryption?</title>
- <para>
- Encryption is an ancient method of keeping information safe
- from prying eyes. <application>Evolution</application> helps
- you you protect your privacy by using
- <application>gpg</application>, an implementation of strong
- <glossterm linkend="public-key-encryption">Public Key
- Encryption.</glossterm>
- </para>
-
- <note id="pub-priv">
- <title>Public Key? Private Key? What is the difference?</title>
- <para>
- GPG uses two keys: public and private. You can give your
- public key to anyone you want to recieve
- encrypted messages, or put it on a public key server so
- that people can look it up before contacting you.
- <emphasis>Never give your private key to anyone,
- ever</emphasis>. Your private key lets you decrypt any
- message encrypted with your public key.
- </para>
- </note>
-
- <para>
- Using encryption takes a bit of forethought. When you send a
- message that is encrypted, you must encrypt it using your
- intended recipient's public key. To <emphasis>get</emphasis>
- an encrypted message, you must make sure that the sender has
- your public key in advance.
- </para>
-
- <para>
- You can use encryption in two different ways:
- <simplelist>
- <member>
- Encrypt the entire message, so that nobody but the recipient can read it.
- </member>
- <member>
- Attach an encrypted signature to a plain text message, so
- that the recipient can read the message without decrypting it, and
- only needs decryption to verify the sender's identity.
- </member>
- </simplelist>
- </para>
-
- <example>
- <title>Sending an Encrypted Messagee</title>
- <para>
- Kevin wants to send an encrypted message to his friend
- Rachel. He looks up her public key on a general key
- server, and then tells
- <application>Evolution</application> to encrypt the
- message. The message now reads "@#$23ui7yr87#@!48970fsd."
- When the information gets to Rachel, she decrypts it using
- her private key, and it appears as plain text for her to
- read.
- </para>
- </example>
- <tip id="always-sign">
- <title>Always Sign</title>
- <para>
- You can set <application>Evolution</application> to always sign your email messages:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Open your account preferences.
- </para>
- </listitem>
- <listitem>
- <para>
- Open the <guilabel>Security</guilabel> tab.
- </para>
- </listitem>
- <listitem>
- <para>
- Click the <guibutton>Always sign outgoing messages when using this account</guibutton> button.
- </para>
- </listitem>
- </orderedlist>
- </para>
- </tip>
- </sect2>
-
- <sect2 id="encryption-keygen">
- <title>Making Encryption Keys</title>
- <para>
- Before you can get or send encrypted mail, you need to
- generate your public and private keys with GPG. Here's how:
- </para>
- <tip>
- <title>GPG Versions</title>
- <para>
- This manual covers version 1.0.6 of GPG. If your version is
- different, this may not be entirely accurate. You may find
- out your version number by typing in: <command>gpg
- --version</command>.
- </para>
- </tip>
- <para>
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Open a terminal and type <command>gpg --gen-key</command>.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Choose the default algorythm, "DSA and ElGamal."
- </para>
- </listitem>
-
- <listitem>
- <para>
- Choose a key length. The default, 1024 bits, should be
- long enough.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Decide if you want your key to expire automatically, and if so, when.
- </para>
- </listitem>
-
-
- <listitem>
- <para>
- Enter your name, email address, and any additional
- personal information you think is appropriate. Do not
- falsify this information, because it will be needed to
- verify your identity later on.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Next, enter your passphrase. It does not have to be the
- same as your email password or your login password. In
- fact, it probably shouldn't. Don't forget it. If you lose
- it, your keys will be useless and you will be unable to
- decrypt messages sent to you with those keys.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Now, GPG will generate your keys. This may take awhile,
- so feel free to do something else while it's
- happening. In fact, using your computer for something
- else actually helps to generate better keys, because it
- increases the randomness in the key generation seeds.
- </para>
- </listitem>
- </orderedlist>
- </para>
- <para>
- Once the keys are generated, you can view your key information
- by typing <command>gpg --list-keys</command>. You should see
- something similar to this:
- <programlisting>
- /home/you/.gnupg/pubring.gpg
- ----------------------------
- pub 1024D/32j38dk2 2001-06-20 you &lt;you@your-address.com&gt;
- sub 1024g/289sklj3 2001-06-20 [expires: 2002-11-14]
- </programlisting>
- </para>
- <para>
- GPG will create one list, or keyring, for your public keys
- and one for your private keys. All the public keys you know
- are stored in the file
- <filename>~/.gnupg/pubring.gpg</filename>. If you want to
- give other people your key, send them that file.
- </para>
- <para>
- If you wish, you can upload your keys to a keyserver. Here's
- how:
- <orderedlist>
- <listitem>
- <para>
- Check your public key ID with <command>gpg
---list-keys</command>. It will be the string after 1024D on the line
-beginning with "pub." In this example, it's 32j38dk2.
- </para>
- </listitem>
- <listitem>
- <para>
- Enter the command <command>gpg --send-keys --keyserver
-wwwkeys.pgp.net 32j38dk2</command>. Substitute your key ID for
-32j38dk2. You will need your password to do this.
- </para>
- </listitem>
- </orderedlist>
-
- <note id="why-keyserver">
- <title>Why Use a Keyserver?</title>
- <para>
- Keyservers store your public keys for you so that your
- friends can decrypt your messages. If you choose not to
- use a keyserver, you can manually send your people public
- key, include it in your signature file, or put it on your
- own web page. However, it's easier to publish them once,
- and then let people download them from the keyserver when
- they want.
- </para>
- </note>
-
- </para>
- </sect2>
-
- <sect2 id="encrypt-getting-key">
- <title>Getting and Using Public Keys</title>
- <para>
- To encrypt a message to your someone else you'll need to use
- their public key in combination with your private key.
- <application>Evolution</application> does that for you, but
- you still need to get their key and add it to your keyring.
- </para>
- <para>
- To get public keys from a public key server, enter the
- command:
- <command>
- gpg --recv-keys --keyserver wwwkeys.pgp.net keyid
- </command>, substituting "keyid" for your recipient's ID. You
- will need to type in your password, and then their ID will
- automatically be added to your keyring. When you send mail to
- them, <application>Evolution</application> will allow you to
- encrypt your messages.
- </para>
- <para>
- If someone sends you their public key directly, save it as a
- plain text file and enter the command <command>gpg
- filename</command>. This will add it to your keyring.
- </para>
- </sect2>
-
- <sect2 id="encrypt-evo-integ">
- <title>Setting up Evolution's Encryption</title>
- <para>
- You'll need to open
- <menuchoice>
- <guimenu>Tools</guimenu>
- <guimenuitem>Mail Settings</guimenuitem>
- </menuchoice>
- Once there, select the account with which you'd like to send
- and recieve encrypted mail, and click the
- <guibutton>Edit</guibutton> button. In the
- <guilabel>Security</guilabel> tab is a section labeled
- <guilabel>Pretty Good Privacy</guilabel>. Enter your key ID
- and click <guibutton>OK</guibutton>. Your key is now
- integrated into your identity in
- <application>Evolution</application>.
- </para>
- <note>
- <title>What is my Key ID again?</title>
- <para>
- <application>Evolution</application> requires that you know your key ID. If you don't remember it, you can find it by typing <command>gpg --list-keys</command> in a console window. Your key ID will be an eight character string with random numbers and letters.
- </para>
- </note>
- </sect2>
-
- <sect2 id="encrypt-sending">
- <title>Sending Encrypted Messages</title>
- <para>
- As you know, you can use encryption to hide the entire
- message, or just to verify your signature. Once you've
- generated your public and private keys, and have the public
- keys of the people to whom you want to send mail, here's what
- to do:
- </para>
- </sect2>
-
- <sect2 id="sign-msg">
- <title>Signing a Message</title>
- <para>
- To sign a message, choose:
- <menuchoice>
- <guimenu>Security</guimenu>
- <guimenuitem>PGP Sign</guimenuitem>
- </menuchoice>
- . You will be prompted for your PGP password. Once you enter it,
- click <guibutton>OK</guibutton> and your message will be signed.
- </para>
- </sect2>
-
- <sect2 id="encrypt-msg">
- <title>Encrypting a Message</title>
- <para>
- Encrypting a message is very similar to signing a message.
- Just choose the menu item
- <menuchoice>
- <guimenu>Security</guimenu>
- <guimenuitem>PGP Encrypt</guimenuitem>
- </menuchoice>
- </para>
- </sect2>
- <sect2 id="unencrypting">
- <title>Unencrypting a Recieved Message</title>
- <para>
- If you get an encrypted message, you will need to decrypt it
- before you read it. Remember, the sender has to have your
- public key before they can send you an encrypted message.
- </para>
- <para>
- When you view the message,
- <application>Evolution</application> will ask you for your
- PGP password. Enter it, and the message will be displayed
- properly.
- </para>
- </sect2>
- </sect1>
-</chapter>
diff --git a/help/no/usage-mainwindow.sgml b/help/no/usage-mainwindow.sgml
deleted file mode 100644
index b7ff02ecf7..0000000000
--- a/help/no/usage-mainwindow.sgml
+++ /dev/null
@@ -1,1174 +0,0 @@
-<!--
-<!DOCTYPE Chapter PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN">
--->
-<chapter id="usage-mainwindow">
-
- <title>Getting Started with Ximian Evolution</title>
-
- <sect1 id="what">
- <title>What is Ximian Evolution, and What Can It Do for Me?</title>
- <para>
- Information is useless unless it's organized and accessible;
- it's hardly even worth the name if you can't look at it and be
- <emphasis>informed</emphasis>. The goal of
- <application>Ximian Evolution</application> is to make the
- tasks of storing, organizing, and retrieving your personal
- information easier, so you can work and communicate with
- others. That is, it's a highly evolved <glossterm
- linkend="groupware">groupware</glossterm> program, an integral
- part of the Internet-connected desktop.
- </para>
- <para>
- In other words, <application>Ximian Evolution</application> is
- a tool to help you get your work done.
- </para>
- <para>
- <application>Ximian Evolution</application> is Free Software. The
- program and its source code are released under the terms of
- the GNU <ulink type="help"
- url="gnome-help:gpl"><citetitle>General Public License
- (GPL)</citetitle></ulink>, and the documentation falls under
- the <ulink type="help" url="gnome-help:fdl"><citetitle>Free
- Documentation License</citetitle></ulink> (FDL). For more
- information about the GPL and the FDL, visit the Free Software
- Foundation's website at <ulink
- url="http://www.fsf.org">http://www.fsf.org</ulink>.
- </para>
-
- <para>
- <application>Ximian Evolution</application> can help you work in a
- group by handling email, address and other contact
- information, and one or more calendars. It can do that on one
- or several computers, connected directly or over a network,
- for one person or for large groups.
- </para>
-
- <para>
- With <application>Ximian Evolution</application>, you can
- accomplish your most common daily tasks faster. For example, it
- takes only one or two clicks to enter an appointment or an
- address card sent to you by email, or to send email to a contact
- or appointment. <application>Ximian Evolution</application>
- makes displays faster and more efficient, so searches are faster
- and memory usage is lower. People who get lots of mail will
- appreciate advanced features like <link
- linkend="usage-mail-organize-vFolders"> Virtual Folders</link>,
- which let you save searches as though they were ordinary mail
- folders.
- </para>
- </sect1>
-
- <sect1 id="usage-mainwindow-starting">
- <title>The First Time you Start Ximian Evolution</title>
- <para>
- To start <application>Ximian Evolution</application>, do either
- of the following:
- <itemizedlist>
- <listitem>
- <para>
- Select <menuchoice><guimenu>Programs</guimenu>
- <guimenuitem>Evolution</guimenuitem> </menuchoice> from your
- menu panel.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Type <command>evolution</command> at the command line.
- </para>
- </listitem>
- </itemizedlist>
- </para>
-
- <para>
- The first time you run the program, it will create a directory
- called <filename>evolution</filename> in your home directory,
- where it will store all of its local data. Then, it will open a
- first-run assistant to help you set up mail accounts and import
- data from other applications.
- </para>
- <para>
- Using the first-run assistant will take approximately two to
- five minutes.
- </para>
-
- <sect2 id="first-step">
- <title>Defining Your Identity</title>
- <para>
- The Identity window is the first of four steps in the
- assistant. The identity step will ask you to enter your basic
- personal information. You can define multiple identities
- later on with the <menuchoice><guimenu>Tools</guimenu>
- <guimenuitem>Mail Settings</guimenuitem></menuchoice> tool.
- <itemizedlist>
- <listitem>
- <para>
- Full Name: Your full name (Example: John Doe).
- </para>
- </listitem>
- <listitem>
- <para>
- Email Address: Your email address (Example: john@doe.com)
- </para>
- </listitem>
- <listitem>
- <para>
- Organization: The company where you work (optional).
- </para>
- </listitem>
- <listitem>
- <para>
- Signature file: If you'd like to use an email
- <glossterm linkend="signature">signature</glossterm>,
- select your signature file here. Normally, the
- signature will be the contents of the
- <filename>.signature</filename> file in your home
- directory.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- </sect2>
-
- <sect2 id="second-step">
- <title>Recieving Email</title>
- <para>
- The <guilabel>Recieving Email</guilabel> step lets you configure
- receving email people have sent you.
- <itemizedlist>
- <listitem>
- <para>
- Server Type: There are numerous types of servers
- from which <application>Ximian Evolution</application>
- can fetch your mail. Ask your system administrator if
- you're not sure which of the following are available to
- you:
- <itemizedlist>
- <listitem>
- <para>
- POP: Downloads your email to your hard disk for
- permanent storage.
- </para>
- </listitem>
- <listitem>
- <para>
- IMAP: Keeps the email on your server so you
- can access your email from multiple systems.
- </para>
- </listitem>
- <listitem>
- <para>
- Unix mail spool file: If you run a mail
- server on your desktop computer, choose this
- option.
- </para>
- </listitem>
- <listitem>
- <para>
- Standard Unix .mbox file: If you want
- <application>Ximian Evolution</application> to
- read mail from a specific file, or if you download
- mail with another application, choose this option.
- </para>
- </listitem>
- <listitem>
- <para>
- Qmail maildir format files: If you download your
- mail using qmail, you'll want to use this.
- </para>
- </listitem>
- <listitem>
- <para>
- None: Select this if you do not plan to
- check mail with this account.
- </para>
- </listitem>
- </itemizedlist>
-
- <note id="imap-note-one">
- <title>What's an IMAP Namespace?</title>
- <para>
- For IMAP mail servers, your sysadmin may provide
- you with a specific namespace, the path on the
- IMAP server where you check for mail. If you
- check your IMAP mail and your folder list includes
- files that don't look like mail folders, you
- probably need to change your mail
- namespace. Typical values are "mail" and "Mail."
- If you prefer, you can choose to subscribe to
- individual mail folders one at a time. For more
- information about how to use IMAP mail, see <xref
- linkend="usage-mail-subscriptions">.
- </para>
- </note>
- </para>
- </listitem>
- <listitem>
- <para>
- Email Server: This is the address of the server you're
- downloading from.
- </para>
- </listitem>
- <listitem>
- <para>
- Username: The username that you login to your email. That
- is often the part before the @ in your email.
- </para>
- <para>
- Authentication Type: Chances are you are using
- <guilabel>Password</guilabel>. Ask your administrator
- for more details. You can have <application>Ximian
- Evolution</application> make sure you've chosen
- correctly by clicking <guibutton>Check for supported
- types</guibutton>.
- </para>
- <para>
- Remember Password: If you prefer to not enter your
- password every time you check email, press this button.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <tip id="exchange-info">
- <title>Can Ximian Evolution Talk to Exchange?</title>
- <para>
- <application>Ximian Evolution</application> can work with the
- <application>Microsoft Exchange</application> server over
- standard protocols such as POP or IMAP. Check with your
- system administrator to see if you can get POP or IMAP
- access to your email server.
- </para>
- </tip>
- </sect2>
- <sect2 id="third-step">
- <title>Sending Email</title>
- <para>
- The <guilabel>Sending Email</guilabel> step lets you configure sending
- email.
- <itemizedlist>
- <listitem>
- <para>
- Server Type: There are numerous server types that
- <application>Ximian Evolution</application> supports for sending your
- mail.
- <itemizedlist>
- <listitem>
- <para>
- SMTP: Downloads mail into your mailbox file.
- </para>
- </listitem>
- <listitem>
- <para>
- Sendmail: Uses another program to download your mail
- to your mailbox files.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- </listitem>
- <listitem>
- <para>
- Host: If you chose SMTP, enter the server's name
- or IP address here.
- </para>
- </listitem>
- <listitem>
- <para>
- Server requires authentication: If your server
- requires you to enter a password to send mail, check
- this box.
- </para>
- </listitem>
- <listitem>
- <para>
- Authentication Type: Chances are you are using
- <guilabel>Password</guilabel>. If you're not sure, ask
- your system administrator or ISP, or have
- <application>Ximian Evolution</application> check for you by
- clicking <guibutton>Check for supported
- types</guibutton>.
- </para>
- </listitem>
- <listitem>
- <para>
- Username: The account name you use when you login
- to check your email. Normally, this is the part of your
- email address before the '@' character.
- </para>
- </listitem>
- <listitem>
- <para>
- Remember Password: If you prefer to not enter
- your password every time you check email, press this
- button.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- </sect2>
-
- <sect2 id="fourth-step">
- <title>Importing Mail (Optional)</title>
- <para>
- If <application>Ximian Evolution</application> finds mail or
- address files from another application, it will offer to
- import them. If you're not sure which file format your mail
- program uses, ask your system administrator. If you want, you
- can skip this step and return to it at a later time by
- selecting
- <menuchoice><guimenu>File</guimenu><guimenuitem>Import</guimenuitem></menuchoice>.
- </para>
- <para>
- <application>Ximian Evolution</application> can import the following types of
- files:
- <variablelist>
- <varlistentry>
- <term>VCard (.vcf, gcrd):</term>
- <listitem>
- <para>
- The addressbook format used by the GNOME, KDE, and
- many other contact management applications. You
- should be able to export to VCard format from any
- address book application.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Microsoft Outlook Express 4 (.mbx):</term>
- <listitem>
- <para>
- Email file format used by Microsoft Outlook Express
-4. For other versions of Microsoft Outlook and Outlook Express, see
-the workaround described in the note below.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>MBox (mbox):</term>
- <listitem>
- <para>
- The email box format used by Mozilla, Netscape,
- Ximian Evolution, Eudora, and many other email clients.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-</para>
-<para>
- <note>
- <title>Microsoft Outlook and Outlook Express Users</title>
- <para>
- Microsoft Outlook, and versions of Outlook Express after
- version 4, use proprietary formats that <application>Ximian
- Evolution</application> cannot read or import. For contacts,
- you may have to email them to yourself and import them that
- way. For email, there is a simpler workaround:
- <orderedlist numeration="arabic">
-
- <listitem>
- <para>
- While using Windows, import the files into Mozilla Mail (or
- another mailer, such as Netscape or Eudora, that uses the
- standard mbox format).
- </para>
- </listitem>
-
- <listitem>
- <para>
- Copy the files to the system or partition you use for
- <application>Ximian Evolution</application>.
- </para>
- </listitem>
-
- <listitem>
- <para>
- Use the <application>Ximian Evolution</application> import
- tool to import the files. There's more information about
- why this works, and how, at the Ximian support website.
- </para>
- </listitem>
- </orderedlist>
- </para>
- </note>
-
- <note>
- <title>Netscape Users</title>
- <para>
- Before importing mail from Netscape, make sure you select
- <menuchoice><guimenu>File</guimenu><guimenuitem>Compact All
- Folders</guimenuitem></menuchoice>. If you don't,
- <application>Ximian Evolution</application> will import and undelete
- the messages in your Trash folders.
- </para>
- </note>
-
- </para>
-
- <tip>
- <title>Exporting Files From Ximian Evolution</title>
- <para>
- Ximian Evolution uses standard file types for all its information,
- so you should have no trouble taking your information
- elsewhere if you want.
- </para>
- <para>
- For mail, that's <filename>mbox</filename>, for calendar,
- <filename>iCal</filename>, and for the address book, vCards
- in a <filename>.db3</filename> database.
- </para>
- </tip>
- </sect2>
- </sect1>
-
- <sect1 id="ui-intro">
- <title>What's What in Ximian Evolution</title>
- <para>
- Now that you've gotten the first-run configuration out of the
- way, you're ready to get down to work. Here's a quick
- explanation of what's going on in your main
- <application>Ximian Evolution</application> window.
- </para>
-
- <figure id="preface-basic-interface">
- <title>The Ximian Evolution Main Window</title>
- <screenshot>
- <screeninfo>Inbox</screeninfo>
- <mediaobject><imageobject><imagedata
- fileref="figures/mainwindow-pic" format="png" srccredit="Kevin
- Breit"> </imageobject></mediaobject>
- </screenshot>
- </figure>
-
- <para>
- <inlinemediaobject><imageobject><imagedata fileref="figures/full-1" format="png"></imageobject></inlinemediaobject>
- <guilabel>Menubar</guilabel>
- </para>
-
- <para>
- The <guilabel>Menubar</guilabel> gives you access to nearly all the
- features that can be found in <application>Ximian Evolution</application>.
- </para>
-
- <para>
- <inlinemediaobject><imageobject><imagedata fileref="figures/full-2" format="png"></imageobject></inlinemediaobject>
- <guilabel>Toolbar</guilabel>
- </para>
-
- <para>
- The <guilabel>Toolbar</guilabel> gives you fast and easy access to the
- most used features in each component.
- </para>
-
- <para>
- <inlinemediaobject><imageobject><imagedata fileref="figures/full-3" format="png"></imageobject></inlinemediaobject>
- <guilabel>Shortcut Bar</guilabel>
- </para>
-
- <para>
- The <guilabel>Shortcut Bar</guilabel> lets you go to your favorite
- components with the click of a click of a button.
- </para>
-
- <para>
- <inlinemediaobject><imageobject><imagedata fileref="figures/full-4" format="png"></imageobject></inlinemediaobject>
- <guilabel>Status Bar</guilabel>
- </para>
-
- <para>
- Periodically, <application>Ximian Evolution</application> will need to quietly
- display a message, or tell you the progress of a task. This most
- often happens when you're checking or sending email. These progress
- queues are shown here, in the <guilabel>Status Bar</guilabel>.
- </para>
-
- <para>
- <inlinemediaobject><imageobject><imagedata fileref="figures/full-5" format="png"></imageobject></inlinemediaobject>
- <guilabel>Search Tool</guilabel>
- </para>
-
- <para>
- The <guilabel>Search Tool</guilabel> lets you search through your email
- with precision so you can easily find what you're looking for.
- </para>
-
-
- <sect2 id="usage-mainwindow-shortcutbar">
- <title>The Shortcut Bar</title>
- <para>
- <application>Ximian Evolution</application>'s most important job is
- to give you access to your information and help you use it
- quickly. One way it does that is through the
- <interface>shortcut bar</interface>, the column on the left
- hand side of the main window. The large buttons with names
- like <guilabel>Inbox</guilabel> and
- <guilabel>Contacts</guilabel> are the shortcuts, and you can
- select different groups of shortcuts by clicking the
- rectangular group buttons.
- </para>
- <para>
- Take a look at the <guilabel>Shortcut Bar</guilabel>
- The shortcut buttons in that category are:
-
- <variablelist>
- <varlistentry>
- <term> <guibutton>Summary</guibutton>:</term>
- <listitem>
- <para>
- Start your day here. The Ximian Evolution
- <guilabel>Summary</guilabel> gives you a quick
- summary of new or important messages, daily
- appointments and urgent tasks. You can customize
- its appearance and content, and use it to access
- Ximian Evolution services.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guibutton>Inbox</guibutton>:</term>
- <listitem>
- <para>
- Click the <guibutton>Inbox</guibutton> button to start
- reading your mail. Your Inbox is also where you can
- access Ximian Evolution's tools to filter, sort, organize, and
- search your mail.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guibutton>Calendar</guibutton>:</term>
- <listitem>
- <para>
- The Calendar can store your appointments and task lists
- for you. Connected to a network, you can use it to keep
- a group of people on schedule and up to date.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guibutton>Tasks</guibutton>:</term>
- <listitem>
- <para>
- A full-size view of your calendar's task pad.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><guibutton>Contacts</guibutton>:</term>
- <listitem>
- <para>
- The Addressbook holds contacts, with address, phone, and
- other personal information. Like calendar information,
- contact data can be synchronized with hand-held devices
- and shared over a network.
- </para>
- </listitem>
- </varlistentry>
-
-<!-- NOT IMPLEMENTED YET
-
-
- <varlistentry>
- <term> <guibutton>Notes:</guibutton></term>
- <listitem>
- <para> The note pad is your catch-all tool: use it to take
- messages from phone conversations, keep small things
- organized, write <glossterm linkend="haiku">haiku</glossterm>, or whatever
- you like. This feature is not yet implemented, but will be
- soon. See <xref linkend="usage-notes"> for more
- information.
- </para>
- </listitem>
- </varlistentry>
--->
-
- </variablelist>
- </para>
- </sect2>
- <sect2 id="usage-mainwindow-folderbar">
- <title>Folders and The Folder Bar</title>
- <para>
- The <interface>folder bar</interface> is a more comprehensive
- way to view the information you've stored with
- <application>Ximian Evolution</application>. It displays all your
- appointments, address cards, and email in a tree that's a lot
- like a <glossterm linkend="filetree">file
- tree</glossterm>-- it starts small at the top, and branches
- downwards. On most computers, there will be three or four
- folders at the base. First, of course, is the
- <guilabel>Summary</guilabel>, a customizable summary of your
- information. Below that are your <guilabel>Local
- Folders</guilabel>, which hold all the
- <application>Ximian Evolution</application> data that's stored on your
- computer. After that are your network servers: <glossterm
- linkend="ldap">LDAP</glossterm> servers that host shared contact
- directories, and <glossterm linkend="imap">IMAP</glossterm> mail
- folders to which you subscribe. Lastly, there are
- <guilabel>vFolders</guilabel>, or virtual folders, discussed in
- <xref linkend="usage-mail-organize-vfolders">,
- </para>
- <para>
-
- A typical <guilabel>Local</guilabel> folder contains the following folders:
- <itemizedlist>
- <listitem>
- <para>
- <guilabel>Calendar</guilabel>, for appointments and
- event listings.
- </para>
- </listitem>
- <listitem>
- <para>
- <guilabel>Contacts</guilabel>, for address cards.
- </para>
- </listitem>
- <listitem>
- <para>
- <guilabel>Drafts</guilabel>, for messages you started and didn't finish.
- </para>
- </listitem>
- <listitem>
- <para>
- <guilabel>Inbox</guilabel>, for incoming mail.
- </para>
- </listitem>
-
- <listitem>
- <para>
- <guilabel>Outbox</guilabel>, for messages you have written
- but not yet sent. This will be empty unless you use
- <application>Ximian Evolution</application> while offline.
- </para>
- </listitem>
-
- <listitem>
- <para>
- <guilabel>Sent</guilabel>, for sent mail.
- </para>
- </listitem>
-
- <listitem>
- <para>
- <guilabel>Trash</guilabel>, a vFolder view of all the
- messages you have marked for deletion but not yet
- <glossterm linkend="expunge">expunged</glossterm>.
- </para>
- </listitem>
- </itemizedlist>
-
- </para>
- <tip id="foldertips">
- <title>Navigating without the Folder Bar or the Shortcut Bar</title>
- <para>
- You don't need the folder bar or the shortcut bar to move
- around the main window. You can use the <keycap>Tab</keycap>
- key to switch from one part of the window to another. When
- you hide the folder bar, there is a menu on the left side of
- the window just below the toolbar to move about the folder
- tree, even with the folder and shortcut bars hidden.
- </para>
- </tip>
-
- <para>
- If you get large volumes of mail, you'll want more folders than
- just your Inbox. To create a new folder:
- <orderedlist numeration="arabic">
- <listitem>
- <para>
- Select
- <menuchoice> <guimenu>File</guimenu>
- <guisubmenu>New</guisubmenu>
- <guimenuitem>Folder</guimenuitem></menuchoice>
- <keycombo action="simul">
- <keycap>Shift</keycap>
- <keycap>Ctrl</keycap>
- <keycap>E</keycap>
- </keycombo>.
- </para>
- </listitem>
- <listitem>
- <para>
- Select the name of the folder in the <guilabel>Folder
- Name</guilabel> field.
- </para>
- </listitem>
- <listitem>
- <para>
- Select the folder type. The available options are.
- <itemizedlist>
- <listitem>
- <para>
- Calendar
- </para>
- </listitem>
- <listitem>
- <para>
- Contacts
- </para>
- </listitem>
- <listitem>
- <para>
- Mail
- </para>
- </listitem>
- <listitem>
- <para>
- Tasks
- </para>
- </listitem>
- </itemizedlist>
-
- </para>
- </listitem>
- <listitem>
- <para>
- Choose the location of the new folder.
- </para>
- </listitem>
- </orderedlist>
- </para>
-
- <sect3 id="subfolders">
- <title>Subfolders</title>
- <para>
- <application>Ximian Evolution</application> lets you nest folders
- inside of each other, so that you can have a detailed
- organizational system.
- </para>
-
- <note>
- <title>Folders Have Limits</title>
- <para>
- Calendars must go in calendar folders, mail in mail
- folders, and contacts in contact folders.
- </para>
- </note>
-
- <para>
- Right-clicking will bring up a menu for just about anything in
- <application>Ximian Evolution</application>. If you right-click on a
- folder, you'll have a menu with the following options:
- <itemizedlist>
- <listitem><para><guimenuitem>View</guimenuitem>, to view the folder. </para></listitem>
- <listitem><para><guimenuitem>Open in New Window</guimenuitem> to view the folder in another window. </para></listitem>
- <listitem><para><guimenuitem>Move</guimenuitem>, to move the folder to another location. </para></listitem>
- <listitem><para><guimenuitem>Copy</guimenuitem>, to duplicate the folder. </para></listitem>
- <listitem><para><guimenuitem>Delete</guimenuitem>, to delete the folder and all its contents. </para></listitem>
- <listitem><para><guimenuitem>Rename</guimenuitem>, to change its name. </para></listitem>
- <listitem><para><guimenuitem>Create New Folder</guimenuitem>, to create another folder in the same location. </para></listitem>
- <listitem><para><guimenuitem>Add to Shortcut Bar</guimenuitem>, to add the folder to your shortcut bar. </para></listitem>
- <listitem><para><guimenuitem>Properties</guimenuitem>, to view or change the folder properties. </para></listitem>
- </itemizedlist>
- </para>
- <para>
- You can also rearrange folders and messages by dragging and
- dropping them.
- </para>
-
- <para>
- Any time new mail arrives in a mail folder, that folder
- label is displayed in bold text, along with the number of
- new messages in that folder.
- </para>
- </sect3>
- </sect2>
-
- <sect2 id="usage-mainwindow-menubar">
- <title>The Menu Bar</title>
- <para>
- The <interface>menu bar</interface>'s contents will always
- provide all the possible actions for any given view of your
- data. If you're looking at your Inbox, most of the menu items
- will relate to mail; some will relate to other components of
- <application>Ximian Evolution</application> and some, especially those
- in the <guimenu>File Menu</guimenu> will relate to the
- application as a whole.
- </para>
- <para>
- <variablelist>
- <varlistentry>
- <term> <guimenu>File</guimenu>:</term>
-
- <listitem><para> Anything related to a file or to the
- operations of the application generally falls under this
- menu: creating things, saving them to disk, printing them,
- and quitting the program itself. </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guimenu>Edit</guimenu>:</term>
- <listitem><para>
- The <guimenu>Edit</guimenu> menu holds
- useful tools that help you edit text and move it around.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guimenu>View</guimenu>:</term>
- <listitem><para>
- This menu lets you decide how <application>Ximian Evolution</application>
- should look. Some of the features control the appearance of
- <application>Ximian Evolution</application> as a whole, and others
- the way a particular kind of information appears.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guimenu>Actions</guimenu>:</term>
- <listitem><para>
- Holds actions which maybe applied to a message. Normally,
- if there is only one target for the action -- for
- example, replying to a message -- you can find it in
- the <guimenu>Actions</guimenu> menu.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guimenu>Tools</guimenu>:</term>
- <listitem><para>
- Tools for configuring, changing, and
- setting up preferences go here. For mail, that means things like
- <guimenuitem>Mail Configuration</guimenuitem> and the
- <guimenuitem>Virtual Folder Editor</guimenuitem>. For the
- <interface>Calendar</interface> and the <interface>Contact
- Manager</interface>, it's color, network, and layout
- configuration.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term> <guimenu>Help</guimenu>:</term>
- <listitem><para>
- Select among these items to open the
- <application>Help Browser</application>
- and read the <application>Ximian Evolution</application> manual.
- </para></listitem>
- </varlistentry>
- </variablelist>
- </para>
-
- <para>
- Once you've familiarized yourself with the <interface>main
- window</interface> you can start doing things with it. We'll
- start with the <guilabel>Summary</guilabel>, which provides a
- quick overview of your <application>Ximian
- Evolution</application> information.
- </para>
- </sect2>
- <sect2 id="basics-summary">
- <title>Introducing the Summary</title>
- <para>
- The Ximian Evolution Summary provides you with a quick
- run-down of important information: your appointments for a
- given day, how much new mail you have, headlines from
- selected news services, and so forth. To see the Summary,
- click on the <guibutton>Summary</guibutton> button in the
- shortcut bar, or select the <guilabel>Summary</guilabel>
- folder in the folder bar.
- </para>
-
- <para>
-<figure>
- <title>The Evolution Summary</title>
-
-<screenshot>
-<graphic format="png" fileref="figures/summary" srccredit="Kevin Breit">
-</screenshot>
-</figure>
- </para>
-
-<para>
-<inlinemediaobject><imageobject><imagedata fileref="figures/full-1" format="png"></imageobject></inlinemediaobject> <guilabel>Weather Summary</guilabel>
-</para>
-<para>
-Shows you the latest weather updates from hundreds of cities around the world.
-</para>
-<para>
-<inlinemediaobject><imageobject><imagedata fileref="figures/full-2" format="png"></imageobject></inlinemediaobject> <guilabel>News Feeds</guilabel>
-</para>
-<para>
-Displays up to the minute news from your favorite websites.
-</para>
-<para>
-<inlinemediaobject><imageobject><imagedata fileref="figures/full-3" format="png"></imageobject></inlinemediaobject> <guilabel>Mail Summary</guilabel>
-</para>
-<para>
-Shows you how many email messages you have in your selected folders, waiting to be read.
-</para>
-<para>
-<inlinemediaobject><imageobject><imagedata fileref="figures/full-4" format="png"></imageobject></inlinemediaobject> <guilabel>Calendar Summary</guilabel>
-</para>
-<para>
-Shows you your calendar.
-</para>
-<para>
-<inlinemediaobject><imageobject><imagedata fileref="figures/full-5" format="png"></imageobject></inlinemediaobject> <guilabel>Tasks</guilabel>
-</para>
-<para>
-Shows your pending tasks
-</para>
-
-
- <para>
- To add additional services to your Summary, or to edit the
- existing services, select
- <menuchoice>
- <guimenu>Tools</guimenu>
- <guimenuitem>Summary Settings</guimenuitem>
- </menuchoice>.
- </para>
-
- </sect2>
-
- <sect2 id="basics-mail">
- <title>Introducing Email</title>
- <para>
- <application>Ximian Evolution</application> email is like other
- email programs in several ways:
- <itemizedlist>
- <listitem>
- <para>
- It can sort and organize your mail in a wide variety of
- ways with folders, searches, and filters.
- </para>
- </listitem>
- <listitem>
- <para>
- It can send and receive mail in HTML or as plain text,
- and makes it easy to send and recieve multiple file
- attachments.
- </para>
- </listitem>
- <listitem>
- <para>
- It supports multiple mail sources, including <glossterm
- linkend="imap">IMAP</glossterm>, <glossterm
- linkend="pop">POP3</glossterm>, local
- <filename>mbox</filename> and <filename>mh</filename>
- spools and files created by other mail programs.
-
-<!-- NOT FOR 1.0, but maybe later
- and even NNTP messages (newsgroups), which aren't
- technically email.
--->
- </para>
- </listitem>
- <listitem>
- <para>
- It lets you guard your privacy with encryption.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- However, <application>Ximian Evolution</application> has some
- important differences. First, it's built to handle very large
- amounts of mail. Both the <link
- linkend="usage-mail-organize-filters">filtering</link> and
- <link linkend="usage-mail-organize-search">searching</link>
- functions were built for speed and efficiency on large volumes
- of mail. There's also the <application>Ximian Evolution</application>
- <link linkend="usage-mail-organize-vFolders">vFolder</link>,
- an advanced organizational feature not found in mainstream
- mail clients. If you get a lot of mail, or if you keep every
- message you get in case you need to refer to it later, you'll
- find this feature especially useful.
- </para>
- <para>
- Here's what the mailer looks like:
-
- <!-- ==============Figure=================================== -->
-
- <figure id="usage-mail-intro-fig">
- <title>Ximian Evolution Mail</title>
- <screenshot>
- <screeninfo>Inbox</screeninfo>
- <mediaobject><imageobject><imagedata fileref="figures/mail-inbox" format="png" srccredit="Kevin Breit">
- </imageobject></mediaobject>
- </screenshot>
- </figure>
-<!-- ==============End of Figure============================== -->
-</para>
- <para>
- <inlinemediaobject><imageobject><imagedata fileref="figures/full-1"
- format="png"></imageobject></inlinemediaobject> <guilabel>Email
- Viewer</guilabel>
- </para>
-
- <para>
- This is where your email is displayed.
- </para>
-
- <para>
- <inlinemediaobject><imageobject><imagedata fileref="figures/full-2"
- format="png"></imageobject></inlinemediaobject> <guilabel>Message List</guilabel>
- </para>
-
- <para>
- The <guilabel>Message List</guilabel> displays all the emails
- that you have. This includes all your read, unread, and email
- that is flagged to be deleted.
- </para>
-
- <para>
- If you find the <interface>view pane</interface> too small, you can resize
- the pane, enlarge the whole window, or double-click on the
- message in the <interface>message list</interface> to have it
- open in a new window. To change the sizes of a pane, just click
- and hold on the divider between the two panes. Then you can drag
- up and down to select the size of the panes.
-
-</para>
-<para> Just like with folders, you can right-click on messages in the
- message list and get a menu of possible actions: you can move,
- delete, or undelete them, and create filters or vFolders based
- on them.
- </para>
- <para>
- Most of the mail-related actions you'll want to perform are
- listed in the <guimenu>Message</guimenu> menu in the menu bar.
- The most frequently used ones, like
- <guimenuitem>Reply</guimenuitem> and
- <guimenuitem>Forward</guimenuitem>, also appear as buttons in
- the toolbar. Almost all of them are also located in the
- right-click menu and as keyboard shortcuts, which tend to be
- faster once you get the hang of them. You can choose
- whichever way you like best; the idea is that the software
- should work the way you want, rather than making you work the
- way the it does.
- </para>
-
- <para>
- For an in-depth guide to the email capabilities of Ximian
- Evolution, read <xref linkend="usage-mail">.
- </para>
- </sect2>
- <sect2 id="basics-calendar">
- <title>Introducing the Calendar</title>
- <para>
- To begin using the calendar, select
- <guibutton>Calendar</guibutton> from the <interface>shortcut
- bar</interface>. By default, the calendar starts showing
- today's schedule on a ruled background. At the upper right,
- there's a monthly calendar you can use to switch days. Below
- that, there's a <guilabel>Task</guilabel> pad, where you can
- keep a list of tasks separate from your calendar appointments.
- The day view in the calendar looks like this:
-
- <!-- ============== Figure ============================= -->
- <figure id="usage-calendar-fig">
- <title>Ximian Evolution Calendar View</title>
- <screenshot>
- <screeninfo>Ximian Evolution Contact Manager Window</screeninfo>
- <mediaobject><imageobject><imagedata fileref="figures/calendar" format="png" srccredit="Aaron Weber">
- </imageobject></mediaobject>
- </screenshot>
- </figure>
- <!-- ============== End of Figure ============================= -->
-
- </para>
-
- <para>
- <inlinemediaobject><imageobject><imagedata fileref="figures/full-1"
- format="png"></imageobject></inlinemediaobject> <guilabel>Appointment
- List</guilabel>
- </para>
-
- <para>
- The <guilabel>Appointment List</guilabel> is responsible for showing you all of
- your scheduled appointments, whether they are all day appointments or simply one time
- appointments that last a half an hour.
- </para>
-
- <para>
- <inlinemediaobject><imageobject><imagedata fileref="figures/full-2" format="png"></imageobject></inlinemediaobject>
- <guilabel>Task List</guilabel>
- </para>
-
- <para>
- The <guilabel>Task List</guilabel> compliments the
- <guilabel>Appointment List </guilabel> as it keeps track of
- tasks which don't have a time associated with them. Tasks can
- have complex notes associated with them, and you can also note
- their completeness on a percentage scale.
- </para>
-
- <para>
- <inlinemediaobject><imageobject><imagedata fileref="figures/full-3" format="png"></imageobject></inlinemediaobject>
- <guilabel>Calendar Window</guilabel>
- </para>
-
- <para>
- The <guilabel>Calendar Window</guilabel> has a graphical representation of
- the calendar, so you can select what days to view in the <guilabel>Appointment
- List</guilabel>.
- </para>
-
- <para>
- For more information about the calendar
- read <xref linkend="usage-calendar">.
- </para>
-
- </sect2>
- <sect2 id="basics-contacts">
- <title>Introducing the Address Book</title>
- <para>
- The <application>Ximian Evolution</application> address book
- can handle all of the functions of an address book, phone
- book, or Rolodex. Of course, it's a lot easier to update
- <application>Ximian Evolution</application> than it is to
- change an actual paper book. <application>Ximian
- Evolution</application> also allows easy synchronization with
- hand-held devices and functions with <glossterm
- linkend="ldap">LDAP</glossterm> directories on a network.
- </para>
- <para>
- Another advantage of the <application>Ximian Evolution</application>
- address book is its integration with the rest of the
- application. For example, you can create an address card from
- an email just by right-clicking on the sender's email address.
- </para>
- <para>
- To open your address book, click on
- <guibutton>Contacts</guibutton> in the shortcut bar, or select
- one of your contacts folders from the folder bar. <xref
- linkend="usage-contact-fig"> shows the address book in all its
- organizational glory. By default, the address book shows all
- your cards in alphabetical order, in a <glossterm
- linkend="minicard">minicard</glossterm> view. You can select
- other views from the <guimenu>View</guimenu> menu, and adjust
- the width of the columns by clicking and dragging the grey
- column dividers.
- </para>
- <para>
- The address book looks like this:
-
- <figure id="usage-contact-fig">
- <title>Ximian Evolution Contact Interface</title>
- <screenshot>
- <screeninfo>Ximian Evolution Contact List Window</screeninfo>
- <mediaobject><imageobject><imagedata fileref="figures/contact" format="png" srccredit="Kevin Breit">
- </imageobject></mediaobject>
- </screenshot>
- </figure>
- </para>
- <para>
- <inlinemediaobject><imageobject><imagedata fileref="figures/full-1"
- format="png"></imageobject></inlinemediaobject> <guilabel>Contact
- List</guilabel>
- </para>
- <para>
- The <guilabel>Contact List</guilabel> lists your contacts.
- </para>
- <para>
- For detailed instructions on how to use the address book,
- read <xref linkend="usage-contact">.
- </para>
- </sect2>
- </sect1>
-</chapter> \ No newline at end of file
diff --git a/help/no/usage-notes.sgml b/help/no/usage-notes.sgml
deleted file mode 100644
index 1ff2283128..0000000000
--- a/help/no/usage-notes.sgml
+++ /dev/null
@@ -1,49 +0,0 @@
-<chapter id="usage-notes">
- <title>Evolution Notes</title>
- <abstract>
- <title> An Overview of the Evolution Notes</title>
- <para>
- In the dark ages before email was invented, there were little
- scraps of people which people used for short-term information
- storage. These scraps of paper were called notes. Now, notes
- are an almost necessary part of our lives, albeit in electronic
- form. It only makes sense, then, that
- <application>Evolution</application> will eventually have a
- Notes feature. <application>Evolution</application> can help
- you take notes in the following ways:
- <itemizedlist>
- <listitem>
- <para>
- Take down phone numbers, take school notes, take phone
- messages, or even write poetry.
- </para>
- </listitem>
- <listitem>
- <para>
- Color code notes to organize them, or just to
- make them look good.
- </para>
- </listitem>
- <listitem>
- <para>
- Turn a note into an email or a text file.
- </para>
- </listitem>
- <listitem>
- <para>
- Write <glossterm>Haiku</glossterm>
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- You can start writing notes by clicking
- <guibutton>Notes</guibutton> in the shortcut bar. Of course,
- it's not there yet. But when it is, it'll take you to the
- notepad.
- </para>
- </abstract>
-</chapter>
-
-
-
diff --git a/help/no/usage-print.sgml b/help/no/usage-print.sgml
deleted file mode 100644
index e611b97b00..0000000000
--- a/help/no/usage-print.sgml
+++ /dev/null
@@ -1,115 +0,0 @@
-<chapter id="usage-print">
-<title>Printing with Evolution</title>
-<para>
- Like most GNOME applications, <application>Evolution</application> uses
- the gnome-print system, so if you've used any other GNOME
- application to print, you should be able to print from
- <application>Evolution</application> immediately.
-</para>
-<para>
- Whether you're printing a message, a calendar page, or a selection
- of address cards, you can choose to print directly to a printer, or
- save the print output to a postscript file. You can also use the
- preview feature to see how your printed output will look.
-</para>
-
-
- <sect1 id="printpreview">
- <title>Print Preview</title>
- <para>
- <guibutton>Print Preview</guibutton> appears both as a button in
- the printing dialog and as an item in the
- <guimenu>File</guimenu> menu. In both places, it does the same
- thing: it opens a new window that shows you what would happen if
- you were to print the current message, calendar, appointment, or
- address card.
- </para>
- <para>
- That window allows you to select which pages you want to see,
- and how close you'd like to look at them. Zoom in or out, fit
- the page to the window (the <guibutton>Fit</guibutton> button)
- or match the width of the page and the window (the
- <guibutton>Fit Width</guibutton> button). None of these buttons
- changes the way the page will be printed, but they do let you
- get a better look. If you're satisfied with the way the things
- look, click <guibutton>Print</guibutton> to send your document
- on its way. If you'd like to change it, just close the
- <guilabel>Print Preview</guilabel> window and make the changes
- you want from your mail, calendar, or addressbook.
- </para>
-
-
- <!-- ==============Figure=================================== -->
-
- <figure id="print-preview">
- <title>Print Preview</title>
- <screenshot>
- <screeninfo>Print Preview</screeninfo>
- <mediaobject><imageobject><imagedata fileref="figures/print-preview" format="png" srccredit="Aaron Weber">
- </imageobject></mediaobject>
- </screenshot>
- </figure>
-<!-- ==============End of Figure============================== -->
-
- </sect1>
-
- <sect1 id="print-destination">
- <title>File or Printer?</title>
- <para>
- The printer selection window, shown in <xref
- linkend="print-dest">, lets you choose the format for
- printing&mdash; <guilabel>Generic Postscript</guilabel>,
- whether to write to a PDF file, and whether to print to a file
- or to an actual printer in Generic Postscript. If you choose a
- printer, you'll be asked for the printer command (probably
- <guilabel>lpr</guilabel>) which your system uses. If you
- choose to print to a file, you'll need to decide upon a
- filename. And of course, you'll want to choose a number of
- copies, and whether to collate them.
-
- <note id="windows-ps">
- <title>Printing to PostScript?</title>
- <para>
- PostScript is the file format used by most laser printers,
- and in UNIX world is the easiest way to print to a file.
- However, most systems running Microsoft Windows can't
- recognize or handle PostScript files. You'll need to print
- to PDF if you want to share your file with Windows users.
- </para>
- </note>
- </para>
-
- <!-- ==============Figure=================================== -->
-
- <figure id="print-dest">
- <title>Choosing a Printer</title>
- <screenshot>
- <screeninfo>Choosing a Printer</screeninfo>
- <mediaobject><imageobject><imagedata fileref="figures/print-dest" format="png" srccredit="Aaron Weber">
- </imageobject></mediaobject>
- </screenshot>
- </figure>
-<!-- ==============End of Figure============================== -->
-
- <para>
- If you're printing a message that's more than one page, you'll
- have the option of choosing which pages to print. If you're
- printing a calendar entry, you can decide what range of dates to
- print. And, if you're printing contact cards, you can decide
- whether to print only the selected cards, or all of them.
- </para>
- <para>
- When you're ready, click <guibutton>Print</guibutton> to print,
- <guibutton>Preview</guibutton> to have a look (or another look)
- at the preview, or <guibutton>Cancel</guibutton> to cancel the
- whole deal.
- </para>
- </sect1>
-</chapter>
-
-
-
-
-
-
-
diff --git a/help/no/usage-sync.sgml b/help/no/usage-sync.sgml
deleted file mode 100644
index 5b93a65736..0000000000
--- a/help/no/usage-sync.sgml
+++ /dev/null
@@ -1,39 +0,0 @@
- <chapter id="usage-sync">
- <title>Synchronizing Evolution with Hand-Held Devices</title>
- <para>
- This chapter is very short. It describes how to synchronize
- the data on your Palm-OS device with the data you store in
- <application>Ximian Evolution</application>. If you need
- information on how to set up handheld synchronization, consult
- <xref linkend="config-sync">.
- </para>
-
- <sect1 id="hotsync">
- <title>Using HotSync</title>
- <para>
- Put your hand-held device in its cradle and press the
- HotSync button.
- </para>
-
-<tip id="sync-tip">
-<title>Palm OS v. 4.0 with Passwords</title>
-<para>
-If you use Palm OS v. 4.0 and have password protection turned on for
-your handheld device, you may encounter trouble synchronizing. If
-this happens, try turning off password protection on your handheld,
-synchronize it with your desktop computer, and then re-enable password
-protection on your handheld.
-</para>
-</tip>
- <para>
- If you have followed the set up instructions properly, your
- Palm-OS device will synchronize data with <application>Ximian
- Evolution</application>.
- </para>
-
- <para>
- That's it.
- </para>
-
- </sect1>
- </chapter>
diff --git a/help/omf.make b/help/omf.make
deleted file mode 100644
index 3261e00158..0000000000
--- a/help/omf.make
+++ /dev/null
@@ -1,53 +0,0 @@
-#
-# No modifications of this Makefile should be necessary.
-#
-# This file contains the build instructions for installing OMF files. It is
-# generally called from the makefiles for particular formats of documentation.
-#
-# Note that you must configure your package with --localstatedir=/var/lib
-# so that the scrollkeeper-update command below will update the database
-# in the standard scrollkeeper directory.
-#
-# If it is impossible to configure with --localstatedir=/var/lib, then
-# modify the definition of scrollkeeper_localstate_dir so that
-# it points to the correct location. Note that you must still use
-# $(localstatedir) in this or when people build RPMs it will update
-# the real database on their system instead of the one under RPM_BUILD_ROOT.
-#
-# Note: This make file is not incorporated into xmldocs.make because, in
-# general, there will be other documents install besides XML documents
-# and the makefiles for these formats should also include this file.
-#
-# About this file:
-# This file was taken from scrollkeeper_example2, a package illustrating
-# how to install documentation and OMF files for use with ScrollKeeper
-# 0.3.x and 0.4.x. For more information, see:
-# http://scrollkeeper.sourceforge.net/
-# Version: 0.1.2 (last updated: March 20, 2002)
-#
-
-omf_dest_dir=$(datadir)/omf/@PACKAGE@
-scrollkeeper_localstate_dir = $(localstatedir)/scrollkeeper
-
-omf: omf_timestamp
-
-omf_timestamp: $(omffile)
- -for file in $(omffile); do \
- scrollkeeper-preinstall $(docdir)/$(docname).xml $(srcdir)/$$file $$file.out; \
- done
- touch omf_timestamp
-
-install-data-hook-omf:
- $(mkinstalldirs) $(DESTDIR)$(omf_dest_dir)
- for file in $(omffile); do \
- $(INSTALL_DATA) $$file.out $(DESTDIR)$(omf_dest_dir)/$$file; \
- done
- -scrollkeeper-update -p $(scrollkeeper_localstate_dir) -o $(DESTDIR)$(omf_dest_dir)
-
-uninstall-local-omf:
- -for file in $(srcdir)/*.omf; do \
- basefile=`basename $$file`; \
- rm -f $(omf_dest_dir)/$$basefile; \
- done
- -rmdir $(omf_dest_dir)
- -scrollkeeper-update -p $(scrollkeeper_localstate_dir)
diff --git a/help/quickref/.cvsignore b/help/quickref/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/help/quickref/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/help/quickref/C/.cvsignore b/help/quickref/C/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/help/quickref/C/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/help/quickref/C/Makefile.am b/help/quickref/C/Makefile.am
deleted file mode 100644
index c7b02ca607..0000000000
--- a/help/quickref/C/Makefile.am
+++ /dev/null
@@ -1,8 +0,0 @@
-HELP_FILES = quickref.pdf
-
-quickrefdir = $(evolutionhelpdir)/quickref/C
-quickref_DATA = $(HELP_FILES)
-
-EXTRA_DIST = \
- $(HELP_FILES) \
- quickref.tex
diff --git a/help/quickref/C/quickref.pdf b/help/quickref/C/quickref.pdf
deleted file mode 100644
index db334d3e24..0000000000
--- a/help/quickref/C/quickref.pdf
+++ /dev/null
Binary files differ
diff --git a/help/quickref/C/quickref.tex b/help/quickref/C/quickref.tex
deleted file mode 100644
index 739316e87a..0000000000
--- a/help/quickref/C/quickref.tex
+++ /dev/null
@@ -1,111 +0,0 @@
-% To rebuild the .pdf from this source, use something like the following
-% latex quickref.tex
-% dvips -t letter -f -Pcmz < quickref.dvi >| quickref.ps
-% ps2pdf -sPAPERSIZE=letter quickref.ps
-\documentclass[12pt]{article}
-\usepackage[latin1]{inputenc}
-\usepackage{lscape}
-\usepackage{setspace}
-\usepackage{graphicx}
-\usepackage{multicol}
-\usepackage[normalem]{ulem}
-\usepackage[english]{babel}
-\usepackage{color}
-\usepackage{hyperref}
-
-\textheight=9in
-\textwidth=7.5in
-\headheight=0pt
-\headsep=0pt
-\topmargin=0in
-\oddsidemargin=-0.4in
-\evensidemargin=-0.6in
-\parindent=0pt
-\parsep=1pt
-\pagestyle{empty}
-
-\date {}
-
-\makeatother
-
-\begin{document}
- \begin{landscape}
-
-% \textit{Dan Kuester's all-leather}
-
- \begin{center}
- \begin{minipage}[m]
- {1in}\includegraphics[height=1in]{../evolution-logo.eps}\hspace{5mm}
- \end{minipage}
- \hspace{8mm}
- \textbf{\Huge{Ximian Evolution Quick Reference Card}}
- \end{center}
-
- \begin{center}
- \begin{multicols}{2}
- \section*{Global}
- \begin{tabular*}{4in}{rp{1.5in}}
- \textit{\textbf{Controls}} & \\
- New item in current mode & \textbf{Ctrl+N} \\
- Clear search bar & \textbf{Shift+Ctrl+B} \\
-% Import* & \textbf{Ctrl+I} \\
- Close window & \textbf{Ctrl+W} \\
- Open new window & \textbf{Shift+Ctrl+W} \\
- \vspace{1.5mm}
- Quit evolution & \textbf{Ctrl+Q} \\
- \textit{\textbf{Selection(s)}} & \\
- Print selection(s) & \textbf{Ctrl+P} \\
- Move selection(s) to folder & \textbf{Shift+Ctrl+V} \\
- Copy selection(s) to folder & \textbf{Shift+Ctrl+Y} \\
- Delete selection(s) & \textbf{Del} or \textbf{Backspace} \\
- \end{tabular*}
- \section*{Calendar/Task Components}
- \begin{tabular*}{4in}{rp{1.5in}}
- \textit{\textbf{Schedule Manipulation}} & \\
- New appointment & \textbf{Ctrl+Shift+A} \\
- New all-day appointment* & \textbf{Ctrl+Shift+D} \\
- New meeting* & \textbf{Ctrl+Shift+E} \\
- New task & \textbf{Ctrl+Shift+T} \\
- \vspace{1.5mm}
- Purge old schedules & \textbf{Ctrl+E} \\
- \textit{\textbf{Navigation}} & \\
- Go to today & \textbf{Ctrl+Alt+T} \\
- Go to date & \textbf{Ctrl+Alt+G} \\
- \end{tabular*}
- {\\ \vspace{5mm} \footnotesize \textit{* denotes the feature may not be implemented yet}}
- \section*{Mail Component}
- \begin{tabular*}{4in}{rp{1.5in}}
- \textit{\textbf{General Commands}} & \\
- New message & \textbf{Ctrl+Shift+M} \\
- \vspace{1.5mm}
- Send/Recieve messages & \textbf{F9} \\
- \textit{\textbf{Selection(s)}} & \\
- Apply filters & \textbf{Ctrl+Y} \\
- Open in new window & \textbf{Return Ctrl+O} \\
- \vspace{1.5mm}
- Forward selection(s) & \textbf{Ctrl+F} \\
- \textit{\textbf{Message List Pane}} & \\
- Next unread message & \textbf{.} or \textbf{]} \\
- \vspace{1.5mm}
- Prev. unread message & \textbf{,} or \textbf{[} \\
- \textit{\textbf{Preview Pane}} & \\
- Reply to list & \textbf{Ctrl+L} \\
- Reply to sender & \textbf{Ctrl+R} \\
- Reply to all recipients & \textbf{Shift+Ctrl+R} \\
- Scroll up & \textbf{Backspace} \\
- Scroll down & \textbf{Space} \\
- \end{tabular*}
- \section*{Contacts Component}
- \begin{tabular*}{4in}{rp{1.5in}}
- \textit{\textbf{General Commands}} & \\
- New contact* & \textbf{Ctrl+Shift+C} \\
- \vspace{1.5mm}
- New contact list* & \textbf{Ctrl+Shift+L} \\
- \textit{\textbf{Selection(s)}} & \\
- View selection(s)* & \textbf{Ctrl+Shift+O} \\
- Save as VCard* & \textbf{Ctrl+Alt+S} \\
- \end{tabular*}
- \end{multicols}
- \end{center}
- \end{landscape}
- \end{document}
diff --git a/help/quickref/Makefile.am b/help/quickref/Makefile.am
deleted file mode 100644
index 1c1a47d72b..0000000000
--- a/help/quickref/Makefile.am
+++ /dev/null
@@ -1,3 +0,0 @@
-SUBDIRS = C
-
-EXTRA_DIST = evolution-logo.eps
diff --git a/help/quickref/evolution-logo.eps b/help/quickref/evolution-logo.eps
deleted file mode 100644
index 33bb5aa345..0000000000
--- a/help/quickref/evolution-logo.eps
+++ /dev/null
@@ -1,18472 +0,0 @@
-%!PS-Adobe-2.0 EPSF-1.2
-%%Title:
-%%Creator: Gnome Print Version 2.4.2
-%%CreationDate: D:20031214181311
-%%For:jupiter jupiter
-%%Pages: 1
-%%DocumentFonts:
-%%BoundingBox: 0 0 344 344
-%%BeginPreview: 344 344 8 3096
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00002244444444444444444444444444444444443300000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000000000003344778888bbbbbbee
-% ffffffffffffffffffffffffffffffffffffffffffffffffbbbbbb88888844440000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000044668899bbeeffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbb88884411
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000225588aaccffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% eebb8866440000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000114488bbffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffcc996622000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000226688ccffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffeeaa77440000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000115599ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffaa772200000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00003377bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffdd885500000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000055
-% 99ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffaa6611000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000000000005599eeff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffaa6611000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000003388eeffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6611000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000002288ddffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff994400000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000055aaffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd772200000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000002288ddffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa550000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000044bbffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd77
-% 11000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000066ccffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ee882200000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000001188ddffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffff99330000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000002288eeffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffbb44000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000001188eeffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffbb4400000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000001188eeffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffbb440000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000001188eeffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffbb44000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000088eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffff992200000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000055ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffff88110000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000022bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffee6600000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000001188ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffcc440000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000077eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffaa11000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 33bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffee770000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000088
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffd9cccccca5a5a6a6a6a6a6a6a6a6a6a6a6cdcdcdcdffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffbb22000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000000000000044ccff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2cbbea49770703c3c
-% 3d3d3d3d3d3e3e3e3e3f3f3f3f3f4040404141414141414141687481a7a7cddaffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffee880000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000001188ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffe5cba37c613a3a3b3b3b3b3b3c3c3c
-% 3c3c3c3d3d3d3d3e3e3e3e3f3f3f3f3f40404041414141414141424242424343435076a8b5ceffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffcc33000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000000033ddffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffe5b0956e393939393a3a3a3a3a3a3a3b3b3b3b3b
-% 3c3c3c3c3c3d3d3d3d3e3e3e3e3f3f3f3f404040404141414141414142424243434344444445456a
-% 83a8ceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffff880000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000088ffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffd8a27a523838383839393939393939393a3a3a3a3a3a3b3b
-% 3b3b3c3c3c3c3c3d3d3d3d3e3e3e3e3f3f3f3f404040414141414141414242424343434444444545
-% 4545454677a9c2f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc22000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000022ccffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffe5af7a44373738383838383838383838393939393939393a3a3a3a3a
-% 3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e3e3e3f3f3f3f40404041414141414141424242434343444444
-% 45454545464646466ca9dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee660000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000066eeffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffca945e36363637373737373737373738383838383838383939393939393a3a
-% 3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e3e3e3f3f3f404040414141414141414242424343434444
-% 44454545454646464647475486b6e7ffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa11000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000011aaffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffbc864336363636363636363636363636373737373737383838383838383939393939
-% 3a3a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3e3e3e3e3f3f3f3f40404041414141414142424243434344
-% 4444454545454646464647474849496eabe7ffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd440000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000033ccffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffbc864235353535353535353535363636363636363636363637373737373838383838383939
-% 3939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3e3e3e3e3f3f3f404040414141414141424242434343
-% 444444454545454646464647474849494a4a6eabf4ffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7700000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000066eeffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% d7864235353535353535353535353535353535353535363636363636363637373737373838383838
-% 39393939393a3a3a3a3b3b3b3b3c3c3c3d3d3d3d3e3e3e3f3f3f4040404141414141414142424343
-% 43444444454545454646464647474849494a4a4a4b88b8ffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99110000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000088ffffffffffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2ae5c
-% 34343434343434343434343434343434353535353535353535353536363636363637373737383838
-% 383839393939393a3a3a3a3b3b3b3c3c3c3c3d3d3d3e3e3e3f3f3f3f404040414141414141424242
-% 4343444444454545454646464647484849494a4a4b4b4c59a0e8ffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc3300
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000011bbffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd785413434
-% 33333333333333333333333334343434343434343434353535353535353536363636363637373737
-% 3838383838393939393a3a3a3a3b3b3b3c3c3c3d3d3d3d3e3e3e3f3f3f4040404141414141414242
-% 424343444444454545454646464647484849494a4a4b4b4c4d4d7cb8f4ffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee55
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000033eeffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffae693333333333
-% 33333333333333333333333333333333333333333434343434343435353535353536363636363637
-% 37373838383838393939393a3a3a3a3b3b3c3c3c3c3d3d3d3e3e3e3f3f3f40404041414141414142
-% 42424343444444454545454646464647484849494a4a4b4c4c4d4d4d5aadf4ffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% 88000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000066ffffffffffffffffffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2ae4e33333333333333
-% 32323232323232323232323232333333333333333333333333343434343435353535353536363636
-% 3637373738383838393939393a3a3a3a3b3b3b3c3c3c3d3d3d3e3e3e3f3f3f404040414141414141
-% 4242424343444444454545454646464647484849494a4a4b4c4c4d4d4e4e4f96e8ffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ff991100000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000077ffffffffffffffb1ffffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffffffff2a040333232323232323232
-% 32323232323232323232323232323232323232323333333333333333333434343435353535353636
-% 36363637373738383838393939393a3a3a3a3b3b3c3c3c3c3d3d3d3e3e3e3f3f3f40404141414141
-% 4142424243434444444545454546464646474849494a4a4a4b4c4d4d4d4e4e4f508ad1ffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffcc11000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000099ffffffffffffb2b2b2b1ffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffff2a03f3232323232323232313131
-% 31313131313131313131313131313132323232323232323232333333333333333434343435353535
-% 353636363637373738383838393939393a3a3a3b3b3b3c3c3c3d3d3d3e3e3e3f3f3f404041414141
-% 414142424243434444444545454546464647474849494a4a4b4b4c4d4d4d4e4f5050507fd1ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffdd330000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000011bbffffffffffffb3b3b2b2b2ffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffff29f3f32323232313131313131303030
-% 30303030303030303030303030303031313131313132323232323232323333333333333434343535
-% 35353536363636373737383838383939393a3a3a3b3b3b3c3c3c3d3d3d3e3e3e3f3f3f4040414141
-% 41414142424243434444444545454546464647474849494a4a4b4c4c4d4d4d4e4f5050505180d1ff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffee3300000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000011ccffffffffffffb4b4b3b3b3ffffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffff29f3f323231313131303030303030303030
-% 30303030303030303030303030303030303030303031313131313232323232323333333333343434
-% 353535353536363636373738383838393939393a3a3a3b3b3c3c3c3d3d3d3e3e3e3f3f3f40404141
-% 4141414142424243434444444545454646464647484849494a4a4b4c4c4d4d4e4e4f50505051528c
-% e9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffff66000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000033eeffffffffffffb5b4b4b4ffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffad3f313131313030303030303030302f2f2f2f
-% 2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f3030303030303030303131313232323232333333333334
-% 34343535353535363636373737383838383939393a3a3a3b3b3b3c3c3c3d3d3e3e3e3f3f3f404041
-% 414141414142424343434444454545454646464647484849494a4a4b4c4d4d4d4e4f4f5050515252
-% 5398f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffff660000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000033eeffffffffffb6b6b5b5b5b4ffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffc95a3131313030303030302f2f2f2f2f2f2f2f2f2f
-% 2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f303030303030303131313232323232333333
-% 3334343435353535363636363737373838383939393a3a3a3b3b3b3c3c3c3d3d3e3e3e3f3f3f4040
-% 414141414141424243434344444545454546464646474849494a4a4b4b4c4d4d4d4e4f5050505152
-% 53535fafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffff8800000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000033eeffffffffffb7b6b6b6b6b5ffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffe476313130303030302f2f2f2f2f2f2f2f2f2e2e2e2e2e
-% 2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2f2f2f2f2f2f2f2f2f3030303030303131313232323233
-% 333333343434353535353636363637373838383939393a3a3a3a3b3b3c3c3c3d3d3e3e3e3f3f3f40
-% 40414141414141424243434444444545454546464647474849494a4a4b4c4c4d4d4e4e4f50505051
-% 525354546bc7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffff99000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000033eeffffffffffb8b7b7b7b6b6ffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffff9f3e30303030302f2f2f2f2f2f2f2e2e2e2e2e2e2e2e2e2e
-% 2e2e2e2d2d2d2d2d2d2e2e2e2e2e2e2e2e2e2e2e2e2e2f2f2f2f2f2f2f3030303030313131323232
-% 3233333333343434353535353636363737383838383939393a3a3a3b3b3c3c3c3d3d3e3e3e3f3f3f
-% 4040414141414142424243434444444545454646464647484849494a4a4b4c4d4d4d4e4f50505051
-% 52525354545482e9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffff990000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000055eeffffffffffb8b8b8b8b7b7ffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffc84c303030302f2f2f2f2f2f2e2e2e2e2e2e2e2e2d2d2d2d2d2d
-% 2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2e2e2e2e2e2e2e2e2f2f2f2f2f2f3030303030313132
-% 323232333333333434343535353636363737373838383939393a3a3a3b3b3c3c3c3d3d3e3e3e3f3f
-% 3f40404141414141424242434344444445454546464646474849494a4a4b4b4c4d4d4d4e4f505050
-% 5152535454545556b0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffff9900000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000066ffffffffffffb9b9b9b8b8b8ffffffffffffffffffffffffffffffffff
-% fffffffffffffffffffffffff291303030302f2f2f2f2f2e2e2e2e2e2e2d2d2d2d2d2d2d2d2d2d2d
-% 2d2d2c2c2c2c2c2c2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2e2e2e2e2e2e2f2f2f2f2f2f3030303031
-% 31323232323333333334343535353636363637373838383939393a3a3a3b3b3c3c3c3d3d3e3e3e3f
-% 3f3f40404141414141424242434344444545454546464646474849494a4a4b4c4c4d4d4e4e4f5050
-% 51515253545454555678deffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffff99000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000066ffffffffffffbabab9b9b9b9ffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffbb4b3030302f2f2f2f2e2e2e2e2e2e2d2d2d2d2d2d2d2d2c2c2c2c2c2c
-% 2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2d2d2d2d2d2d2d2d2d2e2e2e2e2e2f2f2f2f2f303030
-% 3031313232323333333334343435353536363637373838383939393a3a3a3b3b3c3c3c3d3d3e3e3e
-% 3f3f3f40404141414141424243434344444545454546464647484849494a4a4b4c4d4d4d4e4f5050
-% 5051525353545455565656a6f4ffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffff990000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000044ffffffffffffbbbabababab9ffffffffffffffffffffffffffffffffffffff
-% fffffffffffffffffff27530302f2f2f2f2f2e2e2e2e2e2d2d2d2d2d2d2c2c2c2c2c2c2c2c2c2c2b
-% 2b2b2b2b2b2b2b2b2b2b2b2b2b2c2c2c2c2c2c2c2c2c2c2d2d2d2d2d2d2d2e2e2e2e2f2f2f2f2f30
-% 303030313132323233333333343435353536363637373838383939393a3a3a3b3b3c3c3c3d3d3e3e
-% 3e3f3f40404041414141414242434344444445454546464646474849494a4a4b4b4c4d4d4e4e4f50
-% 5050515253545454555656576dd3ffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffff9900000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000033eeffffffffbcbbbbbbbbbabaffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffc84b30302f2f2f2f2e2e2e2e2d2d2d2d2d2d2c2c2c2c2c2c2c2b2b2b2b2b2b2b
-% 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2c2c2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f
-% 2f303030313132323232333333343435353536363637373738383939393a3a3a3b3b3c3c3c3d3d3e
-% 3e3e3f3f40404041414141424242434344444545454546464646474849494a4a4b4c4d4d4d4e4f50
-% 5050515252535454555656565758b2ffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffff99000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000033eeffffffffbdbcbcbcbbbbbbffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffff9f30302f2f2f2f2e2e2e2e2d2d2d2d2d2c2c2c2c2c2c2b2b2b2b2b2b2b2b2b2b2a
-% 2a2a2a2a2a2a2a2a2a2a2a2a2a2a2b2b2b2b2b2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2d2e2e2e2e2f
-% 2f2f2f3030303131323232333333343434353535363636373738383939393a3a3a3b3b3c3c3c3d3d
-% 3e3e3e3f3f40404141414141424242434344444545454546464647484849494a4a4b4c4d4d4d4e4f
-% 5050505152535454545556565757587ae9ffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffff990000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000033eeffffffffbdbdbdbcbcbcbcffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffe459302f2f2f2f2e2e2e2e2d2d2d2d2c2c2c2c2c2b2b2b2b2b2b2b2b2a2a2a2a2a2a2a
-% 2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2b2b2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e
-% 2e2f2f2f3030303031323232333333333434353535363636373738383939393a3a3a3b3b3c3c3c3d
-% 3d3e3e3f3f3f404041414141414242434344444445454546464646474849494a4a4b4c4c4d4d4e4f
-% 4f50505152525354545556565657585964bdffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffff8800000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000033eeffffffffbebebdbdbdbdbcffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffac3e2f2f2f2f2e2e2e2e2d2d2d2d2c2c2c2c2c2b2b2b2b2b2b2a2a2a2a2a2a2a2a2a2a29
-% 29292929292929292929292929292a2a2a2a2a2a2a2a2a2a2b2b2b2b2b2b2c2c2c2c2d2d2d2d2d2e
-% 2e2e2f2f2f2f30303031313232323333333434353535363636373738383939393a3a3a3b3b3c3c3d
-% 3d3d3e3e3f3f3f404041414141414242434344444545454546464647474849494a4a4b4c4d4d4d4e
-% 4f505050515253545454555656575758595a9cf4ffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffff66000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000011ddffffffffbfbebebebebdbdbdffffffffffffffffffffffffffffffffffffffffffffff
-% ffffff91302f2f2f2f2e2e2e2d2d2d2d2c2c2c2c2b2b2b2b2b2b2a2a2a2a2a2a2a29292929292929
-% 29292929292929292929292929292929292929292a2a2a2a2a2a2a2b2b2b2b2b2c2c2c2c2d2d2d2d
-% 2d2e2e2e2f2f2f30303030313232323333333434353535363636373738383939393a3a3a3b3b3c3c
-% 3d3d3d3e3e3f3f404040414141414242424343444445454545464646474849494a4a4b4c4c4d4d4e
-% 4e4f505051525253545455565656575859595a7bdfffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffff660000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000011ccffffffffffbfbfbfbebebebeffffffffffffffffffffffffffffffffffffffffffffffff
-% fff267302f2f2f2e2e2e2d2d2d2d2c2c2c2c2b2b2b2b2b2a2a2a2a2a2a2929292929292929282828
-% 2828282828282828282828282828282929292929292929292a2a2a2a2a2a2b2b2b2b2c2c2c2c2d2d
-% 2d2d2e2e2e2f2f2f2f303030313232323333333434353535363636373738383939393a3a3a3b3b3c
-% 3c3d3d3e3e3e3f3f404041414141414242434344444445454546464646474849494a4a4b4c4d4d4d
-% 4e4f505050515253545454555656575758595a5a66c9ffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffff3300000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000099ffffffffffc0c0bfbfbfbfbeffffffffffffffffffffffffffffffffffffffffffffffffff
-% d63e2f2f2f2f2e2e2e2d2d2d2c2c2c2c2b2b2b2b2b2a000000000000000000292828282828282828
-% 2828282828282828282828282828282828282828292929292929292a2a2a2a2a2b2b2b2b2c2c2c2c
-% 2d2d2d2d2e2e2e2f2f2f303030313132323333333434353535363636373738383939393a3a3b3b3c
-% 3c3c3d3d3e3e3f3f3f4040414141414142424343444445454545464646474848494a4a4b4c4c4d4d
-% 4e4e4f505051525253545455565656575859595a5a5bb3ffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffee33000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0099ffffffffffc1c1c0c0c0bfbfffffffffffffffffffffffffffffffffffffffffffffffffffac
-% 302f2f2f2e2e2e2d2d2d2d2c2c2c2b2b010101010101000000000000000000002828282828272727
-% 27272727272727272727272727272727282828282828282829292929292a2a2a2a2a2b2b2b2b2c2c
-% 2c2c2d2d2d2e2e2e2f2f2f2f3030313132323333333434353535363636373738383939393a3a3b3b
-% 3c3c3c3d3d3e3e3f3f3f4040414141414242424343444445454546464646474849494a4a4b4c4d4d
-% 4d4e4f505050515253545454555656575858595a5a5b5c88f5ffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffdd110000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 66ffffffffffc1c1c1c1c1c0c0ffffffffffffffffffffffffffffffffffffffffffffffffff9130
-% 2f2f2f2e2e2e2d2d2d2c2c2c2b2b2b01010101010101010000000000000000282727272727272727
-% 27272727272726272727272727272727272727272828282828282829292929292a2a2a2a2b2b2b2b
-% 2c2c2c2d2d2d2d2e2e2e2f2f2f30303031323232333334343535353636363738383839393a3a3a3b
-% 3b3c3c3d3d3d3e3e3f3f4040414141414142424343444444454545464646474848494a4a4b4b4c4d
-% 4d4e4e4f505051525253545455565657575859595a5a5b5c7deaffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffcc1100000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000055
-% ffffffffffc2c2c2c1c1c1c1fffffffffffffffffffffffffffffffffffffffffffffffff283302f
-% 2f2f2e2e2d2d2d2d2c2c2c2b2b2b0101010101010101010101000000000000276f9a272726262626
-% 262626262626262626262626262626262627272727272727282828282828292929292a2a2a2a2b2b
-% 2b2b2c2c2c2d2d2d2e2e2e2f2f2f30303031323232333334343535353636373738383839393a3a3a
-% 3b3b3c3c3d3d3e3e3e3f3f4040414141414142424343444445454546464646474849494a4a4b4c4d
-% 4d4d4e4f505050515253545454555656575858595a5a5b5c5d69dfffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff9900000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000000000000000000000000033ee
-% ffffffffc3c3c2c2c2c2c1fffffffffffffffffffffffffffffffffffffffffffffffff2592f2f2f
-% 2e2e2e2d2d2d2c2c2c2b2b2b0101010101010101010101010101010000002734f1ffd45126262626
-% 2626262625252525252626262626262626262626262727272727272828282828292929292a2a2a2a
-% 2b2b2b2c2c2c2d2d2d2e2e2e2f2f2f30303031323232333334343535353636373738383839393a3a
-% 3b3b3c3c3c3d3d3e3e3f3f3f40404141414142424343444444454545464646474848494a4a4b4b4c
-% 4d4d4e4f4f5050515253535454555656575758595a5a5a5c5d5d69caffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffff88000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000000000000011ddff
-% ffffffffc3c3c3c3c2c2c2ffffffffffffffffffffffffffffffffffffffffffffffd6592f2f2f2e
-% 2e2e2d2d2d2c2c2c2b2b2b0302010101010101010101010101010101002626b7ffffffff99252525
-% 252525252525252525252525252525252526262626262626272727272728282828282929292a2a2a
-% 2a2b2b2b2b2c2c2d2d2d2d2e2e2f2f2f30303031323232333334343535353636373738383939393a
-% 3a3b3b3c3c3d3d3d3e3e3f3f4040414141414142424343444445454545464646474849494a4a4b4c
-% 4d4d4d4e4f505050515253545454555656575859595a5a5b5c5d5e5fbfffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffff550000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000aaffff
-% ffffffc4c4c4c3c3c3c3ffffffffffffffffffffffffffffffffffffffffffffffd63e2f2f2f2e2e
-% 2e2d2d2d2c2c2c2b2b2b030303030201010101010101010101010101262660ffffffffffffd45f25
-% 2524242424242424242424242525252525252525252626262626262727272728282828282929292a
-% 2a2a2a2b2b2b2c2c2c2d2d2d2e2e2f2f2f303030313232333333343435353636363737383839393a
-% 3a3a3b3b3c3c3d3d3e3e3f3f3f40404141414142424243434444454545464646474848494a4a4b4c
-% 4c4d4d4e4f505050515253545454555656575758595a5a5b5c5d5e5e5fa0ffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffee3300000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000088ffffff
-% ffffc5c5c5c4c4c4c3ffffffffffffffffffffffffffffffffffffffffffffffd63e2f2f2f2e2e2e
-% 2d2d2d2c2c2b2b2b03030303030303020201010101010101010101262533e2ffffffffffffffff99
-% 32242424242424242424242424242424242425252525252526262626262727272728282828292929
-% 292a2a2a2b2b2b2c2c2c2d2d2d2e2e2f2f2f30303031323233333334343535363636373838383939
-% 3a3a3a3b3c3c3c3d3d3e3e3f3f4040414141414142424343444445454545464646474849494a4a4b
-% 4c4d4d4d4e4f505051525253545455565657575859595a5a5b5c5d5e5f60a0ffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffcc11000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000000000000000000055ffffffff
-% ffc7c5c5c5c5c5c4ffffffffffffffffffffffffffffffffffffffffffffffd63e2f2f2f2e2e2e2d
-% 2d2c2c2c2b2b2b0404040303030303030302010101010101010125252599ffffffffffffffffffff
-% e25e2323232323232323232324242424242424242424252525252526262626262727272828282829
-% 29292a2a2a2b2b2b2c2c2c2d2d2d2e2e2f2f2f3030303132323333bec04135353636373738383839
-% 393a3a3b3b3c3c3d3d3e3e3e3f3f40404141414142424243434444454545464646474848494a4a4b
-% 4c4c4d4d4e4f505050515253545454555656575858595a5a5b5c5d5e5f5f60a0ffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffaa000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000000022eeffffffff
-% c7c7c6c6c5c5c5ffffffffffffffffffffffffffffffffffffffffffffffac302f2f2f2e2e2d2d2d
-% 2c2c2c2b2b2b040404040403030303030303020201010101012525255effffffffffffffffffffff
-% ffff9831232323232323232323232323232324242424242424252525252626262627272727282828
-% 2929292a2a2a2a2b2b2b2c2c2d2d2d2e2e2f2f2f30303131323265fffff87f353536363737383839
-% 39393a3a3b3b3c3c3d3d3e3e3f3f3f40404141414142424343444445454545464646474849494a4a
-% 4b4c4d4d4e4e4f5050515252535454555656575758595a5a5b5c5d5e5e5f6061a1ffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffff770000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000011ccffffffffff
-% c8c8c6c6c6c6ffffffffffffffffffffffffffffffffffffffffffffffac302f2f2f2e2e2d2d2d2c
-% 2c2c2b2b2b0505050404040404030303030303030202010125242432e2ffffffffffffffffffffff
-% ffffffe25d2222222222222223232323232323232324242424242425252525262626262727272828
-% 28282929292a2a2a2b2b2b2c2c2d2d2d2e2e2f2f2f3030313132f1ffffffffd44236363637373838
-% 39393a3a3b3b3c3c3c3d3d3e3e3f3f40404141414142424243434444454545464646474848494a4a
-% 4b4c4d4d4d4e4f505050515253545455555656575859595a5a5b5c5d5e5f606162a1ffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4400000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000088ffffffffffc9
-% c8c8c7c7c6c6ffffffffffffffffffffffffffffffffffffffffffffac30302f2f2e2e2e2d2d2c2c
-% 2c2b2b2b050505050505040404040403030303030202022424242499ffffffffffffffffffffffff
-% ffffffffff9830222222222222222222222223232323232324242424242525252526262626272727
-% 2828282929292a2a2a2b2b2b2c2c2d2d2d2e2e2f2f2f303031b7fffffffffffffd93363636373838
-% 3839393a3a3b3b3c3c3d3d3e3e3f3f3f40404141414142424343444445454546464646474849494a
-% 4a4b4c4d4d4e4f4f5050515253545454555656575858595a5a5b5c5d5e5f5f606162a2ffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee11000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000000000000044ffffffffffc9c9
-% c9c9c8c7c7ffffffffffffffffffffffffffffffffffffffffffffad30302f2f2e2e2e2d2d2c2c2c
-% 2b2b2b06050505050505050404040403030303030303022424245effffffffffffffffffffffffff
-% fffffffffffff16b2121212121212222222222222223232323232324242424252525252626262727
-% 272828282929292a2a2a2b2b2b2c2c2d2d2d2e2e2f2f2f304bffffffffffffffffffe65c36373738
-% 3839393a3a3a3b3c3c3c3d3d3e3e3f3f40404141414142424243434444454545464646474849494a
-% 4a4b4c4d4d4d4e4f5050515252535454555656575758595a5a5b5c5d5e5e5f60616262a2ffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000011eeffffffffcacaca
-% c9c9c8c8ffffffffffffffffffffffffffffffffffffffffffffd63e302f2f2e2e2e2d2d2c2c2c2b
-% 2b2a060606060505050505040404040403030303030324242331e2ffffffffffffffffffffffffff
-% ffffffffffffffffb52f212121212121212121222222222223232323232424242425252526262626
-% 27272728282829292a2a2a2b2b2b2c2c2d2d2d2e2e2f2f2fe8fffffffffffffffffffffeb1363738
-% 383839393a3a3b3b3c3c3d3d3e3e3f3f3f404041414141424243434444454545464646474748494a
-% 4a4b4c4c4d4d4e4f505050515253545454555656575859595a5a5b5c5d5e5f6061626263a2ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff770000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000aaffffffffffcbcaca
-% cacac9ffffffffffffffffffffffffffffffffffffffffffffd63e302f2f2f2e2e2d2d2c2c2c2b2b
-% 2a06060606060505050505050504040404040303032423232398ffffffffffffffffffffffffffff
-% fffffffffffffffffff16a2020202020212121212121222222222323232323242424242525252626
-% 2627272728282829292a2a2a2b2b2b2c2c2d2d2d2e2e2f99ffffffffffffffffffffffffffee6937
-% 38383939393a3a3b3b3c3c3d3d3e3e3f3f4040414141414242424344444445454546464647484949
-% 4a4a4b4c4d4d4e4e4f5050515253545454555656575858595a5a5b5c5d5e5f5f6162626364a3ffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee2200000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000077ffffffffffcccbcbcb
-% cbcaffffffffffffffffffffffffffffffffffffffffffffd63e302f2f2f2e2e2d2d2d2c2c2b2b2b
-% 0707060606060605050505050505040404040404232323235dffffffffffffffffffffaaffffffff
-% ffffffffffffffffffffffb52f202020202020202121212122222222232323232424242425252526
-% 262627272728282829292a2a2a2b2b2b2c2c2d2d2e2e49fcffffffffffffffffffffffffffffffc7
-% 37383839393a3a3b3b3c3c3d3d3e3e3f3f3f40404141414142424343444445454546464647484849
-% 4a4a4b4c4d4d4d4e4f5050515252535454555656575758595a5a5b5c5d5e5e5f606162626465a3ff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc00000000000000
-% 000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000000033eeffffffffcdcccccccb
-% cbcbffffffffffffffffffffffffffffffffffffffffffe43e30302f2f2e2e2d2d2d2c2c2b2b2b07
-% 070706060606060606050505050505050404042323232230e2ffffffffffffffffffcc0033ccffff
-% fffffffffffffffffffffffff16a1f1f202020202020202121212122222223232323242424252525
-% 26262627272728282829292a2a2a2b2b2c2c2c2d2d2ed2ffffffffffffffffffffffffffffffffff
-% f880383939393a3a3b3b3c3c3d3d3e3e3f3f40404141414142424343444445454545464646474849
-% 494a4a4b4c4d4d4e4f505050515253545454555656575859595a5a5b5c5d5e5f60616262636465c2
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88000000000000
-% 000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000ccffffffffffcdcdcdcccc
-% ccfffffffffffffffffffffffffffffffffffffffffff25a30302f2f2e2e2e2d2d2c2c2b2b2b0808
-% 070707070606060606060605050505050505232322222298ffffffffffffffffffff3300000077ee
-% ffffffffffffffffffffffffffffc43d1f1f1f1f2020202020212121212222222323232324242425
-% 2525262627272728282829292a2a2a2b2b2c2c2d2d79ffffffffffffffffffffffffffffffffffff
-% ffffd44539393a3a3b3b3c3c3d3d3e3e3f3f3f404141414141424243434444454545464646474849
-% 494a4a4b4c4d4d4e4e4f5050515253545454555656575858595a5a5b5c5d5e5f5f61626263646566
-% c2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff440000000000
-% 000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000088ffffffffffcececdcdcdcd
-% ffffffffffffffffffffffffffffffffffffffffffff5a30302f2f2f2e2e2d2d2c2c2b2b2b090808
-% 080807070706060606060606050505050523232222224dffffffffffffffffffff88000000000022
-% bbfffffffffffffffffffffffffffff0881f1f1f1f1f202020202021212122222222232323242424
-% 252525262626272728282829292a2a2a2b2b2c2c2df7ffffffffffffffffffffffffffffffffffff
-% fffffffd9539393a3a3b3b3c3c3d3d3e3e3f3f404041414141424243434444454545464646474848
-% 494a4a4b4c4d4d4d4e4f5050515252535454555656575758595a5a5b5c5d5e5e5f60616263646565
-% 70e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd0000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000022eeffffffffcfcececececdcd
-% ffffffffffffffffffffffffffffffffffffffffff833130302f2f2e2e2d2d2d2c2c2b2b09090909
-% 08080807070707060606060606060505052322222221d3ffffffffffffffffffcc00000000000000
-% 0077eeffffffffffffffffffffffffffffc33c1f1f1f1f1f1f202020202121212222222323232424
-% 24252525262626272728282829292a2a2b2b2b2cd2ffffffffffffffffffffffffffffffffffffff
-% ffffffffffe15f3a3a3b3b3c3c3d3d3e3e3f3f404041414141424242434444444545454646464748
-% 49494a4a4b4c4d4d4e4f505050515253545455555656575859595a5a5c5d5e5e5f60616262636465
-% 6671ebffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8800000000
-% 000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000bbffffffffffcfcfcfcececeff
-% ffffffffffffffffffffffffffffffffffffffff9f3130302f2f2e2e2d2d2d2c2c2b2b0a0a0a0909
-% 09080808080707070706060606060606222222212197ffffffffffffffffffff3300000000000000
-% 000022bbfffffffffffffffffffffffffffff0871e1e1f1f1f1f1f20202020212122222223232324
-% 2424252525262627272728282929292a2a2b2b5fffffffffffffffffffffcaeaffffffffffffffff
-% fffffffffffffeb23a3a3b3b3c3c3d3d3e3e3f3f4040414141414242434344444545454646464748
-% 49494a4a4b4c4d4d4e4e4f5050515253545454555656575859595a5a5b5c5d5e5f60616262636465
-% 666786f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff33000000
-% 000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000077ffffffffffd0d0d0cfcfcfffff
-% ffffffffffffffffffffffffffffffffffffffad3130302f2f2f2e2e2d2d2c2c2b2b0b0a0a0a0a09
-% 09090908080808070707060606060622222221214cffffffffffffffffffff880000000000000000
-% 0000000077eeffffffffffffffffffffffffffffc33c1e1e1f1f1f1f202020202121212222222323
-% 2424242525252626272727282829292a2a2a2bf1ffffffffffffffffffe0606bb5ffffffffffffff
-% ffffffffffffffffee6c3b3b3c3c3d3d3e3e3f3f4040414141414242434344444545454646464748
-% 48494a4a4b4c4d4d4d4e4f5050515252535454555656575758595a5a5b5c5d5e5f5f616262636465
-% 66666791ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb000000
-% 000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000011eeffffffffd1d1d0d0d0d0cfffff
-% ffffffffffffffffffffffffffffffffffffd63f3130302f2f2e2e2d2d2c2c2c2b2b0b0b0b0a0a0a
-% 0a09090909080808070707070606222222212120d3ffffffffffffffffffcc000000000000000000
-% 0000000055ffffffffffffffffffffffffffffffffff961e1e1e1f1f1f1f20202021212122222223
-% 232324242525252626272728282829292a2ab2ffffffffffffffffffff806060608aeaffffffffff
-% ffffffffffffffffffffc83b3c3c3c3d3e3e3e3f3f40414141414142424343444445454546464647
-% 4849494a4a4b4c4d4d4e4f5050505152535454555656575758595a5a5b5c5d5e5e5f606162636465
-% 65666768afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff770000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000aaffffffffffd1d1d1d1d0d0ffffff
-% fffffffffffffffffffffffffffffffffff24d3130302f2f2f2e2e2d2d2c2c2b2b0c0c0b0b0b0b0a
-% 0a0a090909090808080807070722222121212097ffffffffffffffffffff33000000000000000000
-% 00000000ddffffffffffffffffffffffffffffffffffffd24a1e1e1e1f1f1f1f2020202121222222
-% 232323242425252526262727282828292945ffffffffffffffffffffb5606060606060b5ffffffff
-% fffffffffffffffffffffff5823c3c3d3d3e3e3f3f40404141414142424343444445454546464647
-% 4849494a4a4b4c4d4d4e4e4f5050515253545454555656575859595a5a5c5d5e5e5f606162626465
-% 6566676869cdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee2200
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000055ffffffffffd2d2d2d2d1d1ffffffff
-% ffffffffffffffffffffffffffffffffff76323130302f2f2e2e2d2d2c2c2b2b0d0c0c0c0c0b0b0b
-% 0a0a0a0a09090909080808080722212121204cffffffffffffffffffff8800000000000000000000
-% 00000055ffffffffffffffffffffffffffffffffffffffffff961d1e1e1e1f1f1f20202021212222
-% 2223232424242525262626272728282929e3ffffffffffffffffffea6b6060606060606080d5ffff
-% ffffffffffffffffffffffffffd5493d3d3e3e3f3f40404141414142424343444445454546464647
-% 4848494a4a4b4c4d4d4d4e4f5050515253545454555656575859595a5a5b5c5d5e5f606162626364
-% 656667686973e2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb00
-% 000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000ddffffffffffd3d3d2d2d2ffffffffff
-% ffffffffffffffffffffffffffffffff9f323130302f2f2e2e2d2d2d2c2c2b0d0d0d0c0c0c0c0b0b
-% 0b0b0a0a0a0a090909080808222121202020d3ffffffffffffffffffcc0000000000000000000000
-% 000000aaffffffffffffffffffffffffffffffffffffffffffffd24a1d1e1e1f1f1f202020212122
-% 2222232324242425252626262727282896ffffffffffffffffffff8a60606060606060606060aaf5
-% fffffffffffffffffffffffffffffa973d3d3e3e3f3f404041414141424243434444454545464646
-% 474849494a4b4c4c4d4d4e4f5050515252535454555656575758595a5a5b5c5d5e5f5f6162626364
-% 65666667696988f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff44
-% 000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000088ffffffffffd4d3d3d3d3d2ffffffffff
-% ffffffffffffffffffffffffffffffbb32323130302f2f2e2e2d2d2c2c2b0e0e0d0d0d0d0c0c0c0c
-% 0b0b0b0b0a0a0a0909090922212120202097ffffffffffffffffffff330000000000000000000000
-% 000022fffffffffffffffffff0571a1a1a1a1b1b1b1b1b1c77fffff0861d1e1e1f1f1f2020202121
-% 22222223232424242525262627272843fcffffffffffffffffffc060606060606060606060606075
-% caffffffffffffffffffffffffffffffe1563e3e3f3f404041414141424243434444454545464646
-% 474849494a4a4b4c4d4d4e4f5050505152535454555656575758595a5a5b5c5d5e5e5f6061626364
-% 6565666768696a9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd
-% 000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000011eeffffffffffd4d4d4d3d3ffffffffffff
-% fffffffffffffffffffffffffffff23f323130302f2f2e2e2d2d2d2c2c0f0e0e0e0e0d0d0d0d0c0c
-% 0c0b0b0b0b0a0a0a0a092221212020203dffffffffffffffffffff88000000000000000000000000
-% 000077ffffffffffffffffff471919191a1a1a1a1b1b1b1b95ffffffffc33b1e1e1f1f1f20202021
-% 212222232323242425252526262727d1fffffffffffffffffff56b60606060606060606060606060
-% 6095f5fffffffffffffffffffffffffffffeb33e3f3f404041414141424243434444454545464646
-% 474849494a4a4b4c4d4d4e4e4f5050515253545454555656575859595a5a5c5d5e5e5f6061626264
-% 656566676869696abbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% 770000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000099ffffffffffd5d5d4d4d4d4ffffffffffff
-% ffffffffffffffffffffffffffff6932323130302f2f2e2e2d2d2c2c2b0f0f0f0e0e0e0e0d0d0d0c
-% 0c0c0c0b0b0b0b0a0a0a21212120201fc4ffffffffffffffffffdd11000000000000000000000000
-% 0000aaffffffffffffffffb2181919191919191a1a1a1b1bc2fffffffffff0961e1e1e1f1f202020
-% 212122222323232424252526262680ffffffffffffffffffff956060606060606060606060606060
-% 60606bb5ffffffffffffffffffffffffffffffee633f3f4040414141414242434444454545454646
-% 464748494a4a4b4c4d4d4d4e4f5050515253545454555656575859595a5a5b5c5d5e5f6061626263
-% 646566676869696a76e2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ee1100000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000033ffffffffffd5d5d5d5d5d4ffffffffffffff
-% ffffffffffffffffffffffffffa033323130302f2f2f2e2d2d2d2c2c10100f0f0f0e0e0e0e0d0d0d
-% 0d0c0c0c0c0b0b0b0a22212120201f88ffffffffffffffffffff4400000000000000000000000000
-% 0000bbffffffffffffffff651818181819191919191a1a1af0ffffffffffffffd24a1e1e1f1f2020
-% 2021212222232324242425252626f7ffffffffffffffffffd5606060606060606060606060606060
-% 606060608aeaffffffffffffffffffffffffffffffca3f4040414141414242434344444545454646
-% 46474849494a4b4c4c4d4d4e4f5050515252535454555656575858595a5a5b5c5d5e5f6061626263
-% 646566676869696a6b89ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ff8800000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000bbffffffffffd6d6d6d5d5ffffffffffffffff
-% ffffffffffffffffffffffffd74032323130302f2f2e2e2d2d2c2c111010100f0f0f0f0e0e0e0e0d
-% 0d0d0d0c0c0c0b0b22212120201f3df1ffffffffffffffffff880000000000000000000000000000
-% 0000bbffffffffffffffff17171818181818181919191929ffffffffffffffffffff961e1e1f1f20
-% 20202121222223232424242525c9fffffffffffffffffff575606060606060606060606060606060
-% 606060606060b5fffffffffffffffffffffffffffffff58540414141414242434344444545454646
-% 46474849494a4a4b4c4d4d4e4f5050505152535454555656575758595a5a5b5c5d5e5f5f61626263
-% 646566666769696a6b6cb1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffff22000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000055ffffffffffd7d7d6d6d6d6ffffffffffffffff
-% ffffffffffffffffffffffff5c3332323130302f2f2e2e2d2d2c2c1111111010100f0f0f0f0e0e0e
-% 0d0d0d0d0c0c0c2221212020201fc4ffffffffffffffffffdd110000000000000000000000000000
-% 0000bbffffffffffffffff17171717171818181818191956ffffffffffffffffffffffd24b1f1f1f
-% 2020212122222223232424255bffffffffffffffffffffb560606060606060606060606060606060
-% 6060606060606080d5ffffffffffffffffffffffffffffffd64d4141414242434344444545454646
-% 46474849494a4a4b4c4d4d4e4f5050505152535454555656575758595a5a5b5c5d5e5e5f60616263
-% 646566666769696a6b6c6dd9ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffbb000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000ddffffffffffd7d7d7d7d6ffffffffffffffffff
-% ffffffffffffffffffffff923332323130302f2f2e2e2d2d2c2c12121211111110100f0f0f0f0e0e
-% 0e0e0d0d0d0d0c21212020201f88ffffffffffffffffffff44000000000000000000000000000000
-% 0000bbffffffffffffffff25161616171717181818181894ffffffffffffffffffffffffff961f1f
-% 1f2020212122222323242424ecffffffffffffffffffffffca6b6060606060606060606060606060
-% 606060606060606060aaf5fffffffffffffffffffffffffffffa9a41414142424343444445454546
-% 46464748494a4a4b4c4d4d4d4e4f5050515253545454555656575859595a5a5c5d5e5e5f60616262
-% 646565666768696a6b6c6d80f6ffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffff440000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000066ffffffffffd8d8d8d7d7d7ffffffffffffffffff
-% ffffffffffffffffffffd7333332323130302f2f2e2e2d2d2c13131312121211111010100f0f0f0f
-% 0e0e0e0e0d0d22212120201f3df0ffffffffffffffffff8800000000000000000000000000000000
-% 0000bbffffffffffffffff831616161616171717181818c2ffffffffffffffffffffffffffffd24c
-% 1f20202021212222232324b1fffffffffffffffffffffffffff5a060606060606060606060606060
-% 6060606060606060606075d5ffffffffffffffffffffffffffffffe2594142424343444445454546
-% 4646474849494a4b4c4c4d4d4e4f5050515253545454555656575859595a5a5b5c5d5e5f60616262
-% 64656566676869696a6c6d6db2ffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffbb0000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000ddffffffffffd8d8d8d8d8ffffffffffffffffffff
-% ffffffffffffffffffff5c3333323231302f2f2e2e2d2d2c2c141313131212121111111010100f0f
-% 0f0f0e0e0e22212120201f1fc4ffffffffffffffffffdd1100000000000000000000000000000000
-% 000099ffffffffffffffffe01515151616161617171755ffffffffffffffffffffffffffffffffff
-% 972e202020212222232331faffffffffffffffffffffffffffffffd5756060606060606060606060
-% 60606060606060606060606095f5fffffffffffffffffffffffffffffeac42424343444445454546
-% 4646474849494a4a4b4c4d4d4e4f5050515252535454555656575858595a5a5b5c5d5e5f60616262
-% 63646566676869696a6b6d6d6ed9ffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffff4400000000000000000000000000000000000000
-% 00000000000000000000000000000000000066ffffffffffd9d9d9d9d8d8ffffffffffffffffffff
-% ffffffffffffffffffa0333332323130302f2f2e2e2d2d2c1514141413131312121211111110100f
-% 0f0f0f0e0e22212020201f88ffffffffffffffffffff440000000000000000000000000000000000
-% 000066ffffffffffffffffffa1141515151616161645f0ffffffffffffffffffffffffffffffffff
-% ffe25b2020212122222398fffffffffffffffffffffffffffffffffff5b560606060606060606060
-% 606060606060606060606060606bc0ffffffffffffffffffffffffffffffef654343444445454546
-% 4646474849494a4a4b4c4d4d4e4f5050505152535454555656575758595a5a5b5c5d5e5f60616262
-% 63646566676869696a6b6c6d6e82ffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffbb00000000000000000000000000000000000000
-% 000000000000000000000000000000000000ddffffffffffdadad9d9d9ffffffffffffffffffffff
-% ffffffffffffffffe434333332323130302f2f2e2e2d2d1515151514141313131312121111111010
-% 100f0f0f22212120201f3df0ffffffffffffffffff88000000000000000000000000000000000000
-% 000000eeffffffffffffffffffa133141515151654f0ffffffffffffffffffffffffffffffffffff
-% ffffff972f202122225effffffffffffffffffffffffffffffffffffffffe0806060606060606060
-% 6060606060606060606060606060608aeaffffffffffffffffffffffffffffffcb43444445454546
-% 4646474848494a4a4b4c4d4d4e4f5050505152535454555656575758595a5a5b5c5d5e5f5f616262
-% 63646566676869696a6b6c6d6e6fbdffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffff44000000000000000000000000000000000000
-% 000000000000000000000000000000000066ffffffffffdadadadadad9ffffffffffffffffffffff
-% ffffffffffffffff6a343333323231302f2f2e2e2d2d161615151515141414131313121212111111
-% 1010100f212120201f1fc4ffffffffffffffffffee11000000000000000000000000000000000000
-% 00000088ffffffffffffffffffffffb1919192e0ffffffffffffffffffffffffffffffffffffffff
-% ffffffffe25b212122e2ffffffffffffffffffffffffffffffffffffffffffffb56b606060606060
-% 606060606060606060606060606060606bb5fffffffffffffffffffffffffffffff57d4444454545
-% 4646464748494a4a4b4c4d4d4e4e4f50505152535454545556575758595a5a5b5c5d5e5e5f606162
-% 63646566666769696a6b6c6d6e6f70e3ffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffbb000000000000000000000000000000000000
-% 0000000000000000000000000000000000ddffffffffffdbdbdbdadaffffffffffffffffffffffff
-% ffffffffffffffae34333332323130302f2f2e2e2d2d161616161515151514141413131312121211
-% 11111022212120201f6affffffffffffffffffff5500000000000000000000000000000000000000
-% 00000022ffffffffffffffffffffffffffffffffffffffffffffffffffffddffffffffffffffffff
-% ffffffffffff972f98fffffffffffffffffffeffffffffffffffffffffffffffffea8a6060606060
-% 60606060606060606060606060606060606080e0ffffffffffffffffffffffffffffffd750454545
-% 4646464748494a4a4b4c4d4d4d4e4f5050515253545454555656575859595a5a5c5d5e5e5f606162
-% 63646565666768696a6b6c6d6e6e6f97ffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffff550000000000000000000000000000000000
-% 0000000000000000000000000000000066ffffffffffdcdbdbdbdbdbffffffffffffffffffffffff
-% fffffffffffff24234333332323130302f2f2e2e2d17171716161616151515141414131313121212
-% 111122222120201f2ef1ffffffffffffffffffaa0000000000000000000000000000000000000000
-% 0000000088ffffffffffffffffffffffffffffffffffffffffffffffffff4433ccffffffffffffff
-% ffffffffffffffe6ffffffffffffffffffff89bbffffffffffffffffffffffffffffffca6b606060
-% 6060606060606060606060606060606060606060aaf5fffffffffffffffffffffffffffffb924545
-% 464646474849494a4b4c4c4d4d4e4f5050515253545454555656575859595a5a5c5d5e5e5f606162
-% 62646565666768696a6b6c6d6d6e6f71c6ffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffbb0000000000000000000000000000000000
-% 00000000000000000000000000000000ddffffffffffdcdcdcdcdbffffffffffffffffffffffffff
-% ffffffffffffa13534333332323130302f2f2e2d2d18181717161616161515151514141413131312
-% 121222212120201fb5ffffffffffffffffffee110000000000000000000000000000000000000000
-% 0000000011ccffffffffffffffffffffffffffffffffffffffffffffff9900000088ffffffffffff
-% ffffffffffffffffffffffffffffffffffbb000066eefffffffffffffffffffffffffffff5a06060
-% 60606060606060606060606060606060606060606075d5ffffffffffffffffffffffffffffffe25c
-% 464646474849494a4a4b4c4d4d4e4f5050515252535454555656575859595a5a5b5c5d5e5f606162
-% 6264656566676869696b6c6d6d6e6f7084f6ffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffff4400000000000000000000000000000000
-% 00000000000000000000000000000055ffffffffffdddddddcdcdcffffffffffffffffffffffffff
-% ffffffffffe43534343333323231302f2f2e2e2d1918181817171716161616151515151414141313
-% 1322222120201f6affffffffffffffffffff55000000000000000000000000000000000000000000
-% 000000000011ccffffffffffffffffffffffffffffffffffffffffff99000000000033ccffffffff
-% ffffffffffffffffffffffffffffffffff3300000011aaffffffffffffffffffffffffffffffd575
-% 606060606060606060606060606060606060606060606095f5fffffffffffffffffffffffffffffe
-% ae4646474849494a4a4b4c4d4d4e4f5050505152535454555656575858595a5a5b5c5d5e5f606162
-% 6263646566676869696a6c6d6d6e6f7071bdffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffaa00000000000000000000000000000000
-% 000000000000000000000000000000bbffffffffffdddddddddddcffffffffffffffffffffffffff
-% ffffffffff783534343333323130302f2f2e2e1a1919191818181717171616161615151514141413
-% 2222212120202ef1ffffffffffffffffffaa00000000000000000000000000000000000000000000
-% 00000000000011ccffffffffffffffffffffffffffffffffffffff99000000000000000088ffffff
-% ffffffffffffffffffffffffffffffff8800000000000044ddfffffffffffffffffffffffffffff5
-% b560606060606060606060606060606060606060606060606bc0ffffffffffffffffffffffffffff
-% ffef69474848494a4a4b4c4d4d4e4f5050505152535454555656575758595a5a5b5c5d5e5f606162
-% 6263646566676869696a6c6d6d6e6f70717bedffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffff22000000000000000000000000000000
-% 000000000000000000000000000033ffffffffffdededededdddffffffffffffffffffffffffffff
-% ffffffffca353534333332323130302f2f2e2e1a1a19191918181817171716161616151515151414
-% 222221212020b5ffffffffffffffffffee1100000000000000000000000000000000000000000000
-% 0000000000000011ccffffffffffffffffffffffffffffffffff880000000000000000000033ccff
-% ffffffffffffffffffffffffffffffdd00000000000000001188ffffffffffffffffffffffffffff
-% ffe08060606060606060606060606060606060606060606060608aeaffffffffffffffffffffffff
-% ffffffcc4848494a4a4b4c4d4d4e4f5050505152535454555656575758595a5a5b5c5d5e5f606162
-% 6263646566676869696a6b6c6d6e6f707172abffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffff99000000000000000000000000000000
-% 000000000000000000000000000099ffffffffffdfdfdedededeffffffffffffffffffffffffffff
-% ffffffff5e353534333332323130302f2f2e1b1b1a1a1a1919191818181717171616161615151523
-% 22222120206affffffffffffffffffff550000000000000000000000000000000000000000000000
-% 00000000000000001177ddffffffffffffffffffffffffffaa330000000000000000000000000088
-% eeffffffffffffffffffffffffffffc11100000000000000000033ccffffffffffffffffffffffff
-% ffffffb56b606060606060606060606060606060606060606060606bb5ffffffffffffffffffffff
-% fffffffff680494a4a4b4c4d4d4e4e4f50505152535454555656575758595a5a5b5c5d5e5f5f6162
-% 6263646566676869696a6b6c6d6e6f70717272daffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffff110000000000000000000000000000
-% 0000000000000000000000000022ffffffffffffdfdfdfdfdeffffffffffffffffffffffffffffff
-% ffffffaf363535343333323231302f2f2e2e1c1b1b1b1a1a1a191919181818171717161616151522
-% 222121202ff1ffffffffffffffffffaa000000000000000000000000000000000000000000000000
-% 000000000000000000000055aaffffffffffffffffee882200000000000000000000000000000000
-% 22bbffffffffffffffffffffffffffffee550000000000000000000088eeffffffffffffffffffff
-% ffffffffea8a606060606060606060606060606060606060606060606080e0ffffffffffffffffff
-% ffffffffffffd8564a4b4c4d4d4d4e4f50505152535454545556575758595a5a5b5c5d5e5f5f6162
-% 6263646566676869696a6b6c6d6e6f7071727298ffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffff880000000000000000000000000000
-% 0000000000000000000000000088ffffffffffe0e0e0dfdfdfffffffffffffffffffffffffffffff
-% ffffff51353534343333323231302f2f2e1d1c1c1c1b1b1a1a1a1919191818181717171616162322
-% 22212120b5ffffffffffffffffffee11000000000000000000000000000000000000000000000000
-% 00000000000000000000000000224488888888774400000000000000000000000000000000000000
-% 000077eeffffffffffffffffffffffffffffbb2200000000000000000022bbffffffffffffffffff
-% ffffffffffffca6b6060606060606060606060606060606060606060606060b5f5ffffffffffffff
-% fffffffffffffffb954b4c4d4d4d4e4f50505152535454545556565758595a5a5b5c5d5e5e5f6062
-% 6263646566666769696a6b6c6d6e6f7071727273daffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffee0000000000000000000000000000
-% 00000000000000000000000000eeffffffffffe0e0e0e0e0dfffffffffffffffffffffffffffffff
-% ffffaf36353534343333323130302f2f2e1d1d1d1c1c1b1b1b1a1a1a191919181818171717162322
-% 2221206affffffffffffffffffff6600000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000022bbffffffffffffffffffffffffffffee770000000000000000000066eeffffffffffffff
-% fffffffffffffff5a0606060606060606060606060606060606060606060606075d5ffffffffffff
-% ffffffffffffffffffde634c4d4d4e4f5050515253545454555656575859595a5a5c5d5e5e5f6061
-% 6263646566666769696a6b6c6d6e6f707171727399ffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffff6600000000000000000000000000
-% 00000000000000000000000066ffffffffffe1e1e1e1e0e0ffffffffffffffffffffffffffffffff
-% ffff5136353534333332323130302f2f1e1e1e1d1d1c1c1c1b1b1b1a1a1a19191818181817232322
-% 22212ff1ffffffffffffffffffbb0000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000077eeffffffffffffffffffffffffffffbb2200000000000000000011aaffffffffffff
-% ffffffffffffffffffd5756060606060606060606060606060606060606060606060a0f5ffffffff
-% fffffffffffffffffffffea84d4d4e4f5050515253545454555656575859595a5a5c5d5e5e5f6061
-% 6263646565666769696a6b6c6d6e6f707171727374dbffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffbb00000000000000000000000000
-% 000000000000000000000000bbffffffffffe2e2e1e1e1e1ffffffffffffffffffffffffffffffff
-% ffaf3636353534333332323130302f2f1f1f1e1e1d1d1d1c1c1b1b1b1a1a1a191919181824232322
-% 212197ffffffffffffffffffee220000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000022bbffffffffffffffffffffffffffffee770000000000000000000044ddffffffff
-% fffffffffffffffffffff5b560606060606060606060606060606060606060606060606bcaffffff
-% fffffffffffffffffffffffff06f4e4f5050515252535454555656575859595a5a5c5d5e5e5f6061
-% 6263646565666768696a6b6c6d6e6e6f71717273749affffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffff22000000000000000000000000
-% 000000000000000000000022ffffffffffe2e2e2e2e2e1e1ffffffffffffffffffffffffffffffff
-% ff513636353534333332323130302f20201f1f1e1e1e1d1d1d1c1c1b1b1b1a1a1a19191923232222
-% 215cffffffffffffffffffff77000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000077eeffffffffffffffffffffffffffffbb220000000000000000001188ffffff
-% ffffffffffffffffffffffffe08060606060606060606060606060606060606060606060608aeaff
-% ffffffffffffffffffffffffffffc74f5050515252535454555656575859595a5a5c5d5e5e5f6061
-% 6262646565666768696a6b6c6d6e6e6f717172737475dbffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffff88000000000000000000000000
-% 000000000000000000000088ffffffffffe3e3e3e2e2e2ffffffffffffffffffffffffffffffffff
-% b0373636353534333332323130302f2120201f1f1f1e1e1e1d1d1c1c1c1b1b1b1a1a192423232222
-% 2fe2ffffffffffffffffffbb00000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000011aaffffffffffffffffffffffffffffee770000000000000000000033ccff
-% ffffffffffffffffffffffffffffb56b606060606060606060606060606060606060606060606bb5
-% fffffffffffffffffffffffffffffff68550505252535454555656575859595a5a5b5c5d5e5f6061
-% 6262646565666768696a6b6c6d6e6e6f7171727374759affffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffee000000000000000000000000
-% 0000000000000000000000eeffffffffffe3e3e3e3e3e3ffffffffffffffffffffffffffffffffff
-% 5f373636353534333332323130302221212020201f1f1f1e1e1d1d1d1c1c1b1b1b1a1a2423232222
-% 97ffffffffffffffffffee2200000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000055eeffffffffffffffffffffffffffffcc330000000000000000000088
-% eeffffffffffffffffffffffffffffea8a6060606060606060606060606060606060606060606060
-% 80e0ffffffffffffffffffffffffffffffda5c5152535454555656575859595a5a5b5c5d5e5f6061
-% 6262646565666768696a6b6c6d6d6e6f71717273747575e4ffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffff550000000000000000000000
-% 0000000000000000000055ffffffffffe4e4e4e4e3e3e3ffffffffffffffffffffffffffffffffca
-% 373736363535343333323231302f22222121212020201f1f1e1e1e1d1d1d1c1c1b1b24242323225d
-% ffffffffffffffffffff770000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000011aaffffffffffffffffffffffffffffff8800000000000000000000
-% 22bbffffffffffffffffffffffffffffffca6b606060606060606060606060606060606060606060
-% 6060b5fffffffffffffffffffffffffffffffb9952535454555656575858595a5a5b5c5d5e5f6061
-% 6262646565666768696a6b6c6d6d6e6f71717273747575adffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffaa0000000000000000000000
-% 00000000000000000000aaffffffffffe5e5e5e4e4e4e4ffffffffffffffffffffffffffffffff6d
-% 37373636353534333332323130232322222221212120201f1f1f1e1e1e1d1d1c1c1c2424232330e2
-% ffffffffffffffffffbb000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000055eeffffffffffffffffffffffffffffcc330000000000000000
-% 000066eefffffffffffffffffffffffffffff5a06060606060606060606060606060606060606060
-% 60606075d5ffffffffffffffffffffffffffffffda695454555656575858595a5a5b5c5d5e5f6061
-% 6262646565666768696a6b6c6d6d6e6f7171727374757576edffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffff2200000000000000000000
-% 00000000000000000011ffffffffffffe5e5e5e5e5e4e4ffffffffffffffffffffffffffffffe538
-% 373736363535343333323231302424232322222221212020201f1f1f1e1e1d1d1d252424232398ff
-% ffffffffffffffffee22000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000011aaffffffffffffffffffffffffffffff8800000000000000
-% 00000011aaffffffffffffffffffffffffffffffd575606060606060606060606060606060606060
-% 6060606060aaf5fffffffffffffffffffffffffffffeac54555656575858595a5a5b5c5d5e5f6061
-% 6262646565666768696a6b6c6d6d6e6f7071727374757576b6ffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffff7700000000000000000000
-% 00000000000000000066ffffffffffe6e6e6e6e5e5e5ffffffffffffffffffffffffffffffff8838
-% 3737363635353433333232312525242423232322222121212020201f1f1e1e1e1d252424235effff
-% ffffffffffffffff7700000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000055ddffffffffffffffffffffffffffffcc330000000000
-% 000000000044ddfffffffffffffffffffffffffffff5b56060606060606060606060606060606060
-% 6060606060606bcaffffffffffffffffffffffffffffffec755656575858595a5a5b5c5d5e5f6061
-% 626264656566676869696b6c6d6d6e6f70717273747575767ff6ffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffcc00000000000000000000
-% 000000000000000000aaffffffffffe7e7e6e6e6e6e6fffffffffffffffffffffffffffffff23838
-% 373736363534343333323231262525242424232322222221212120201f1f1f1e1e25242431e2ffff
-% ffffffffffffffbb0000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000001188ffffffffffffffffffffffffffffff8811000000
-% 0000000000001188fffffffffffdffffffffffffffffffe080606060606060606060606060606060
-% 606060606060606095eaffffffffffffffffffffffffffffffc956575858595a5a5b5c5d5e5f6061
-% 626264656566676869696b6c6d6d6e6f707172737475757676c0ffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffff22000000000000000000
-% 000000000000000011ffffffffffffe8e8e7e7e7e6e6ffffffffffffffffffffffffffffffa33838
-% 3737363635343433333232312626252525242423232322222221212020201f1f2525242498ffffff
-% ffffffffffffff330000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000011ddffffffffffffffffffffffffffee6600000000
-% 0000000000000022ffffffffffffffffffffffffffffffffffb56b60606060606060606060606060
-% 6060606060606060606bb5fffffffffffffffffffffffffffffff38a5858595a5a5b5c5d5e5f6061
-% 626263656566676869696a6c6d6d6e6f7071727374757576768affffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffff77000000000000000000
-% 000000000000000066ffffffffffe8e8e8e8e8e8e7e7ffffffffffffffffffffffffffffff603838
-% 373736363534343333323227272626262525242424232322222221212120201f25252450ffffffff
-% ffffffffffff880000000000000000000000000000000d2404000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000099ffffffffffffffffffffffffff99110000000000
-% 00000000000000bbffffffffffffffffffffffffffffffffffffea8a606060606060606060606060
-% 60606060606060606060608ae0ffffffffffffffffffffffffffffffdb58595a5a5b5c5d5e5f6061
-% 626263656566676869696b6c6d6d6e6f70717273747575767678e5ffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffcc000000000000000000
-% 0000000000000000aaffffffffffe9e9e9e9e8e8e8ffffffffffffffffffffffffffffffd8393838
-% 3737363635343433333232282727272626252525242424232322222221212026252524d4ffffffff
-% ffffffffffcc0000000000000000000000000000000036443b120000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000022ffffffffffffffffffffffffcc4400000000000022
-% 44000000000066ffffffffffffffffffffffffffffffffffffffffffca6b60606060606060606060
-% 60606060606060606060606060b5fffffffffffffffffffffffffffffffb9e5a5a5b5c5d5e5f6061
-% 626264656566676869696b6c6d6d6e6f70717273747575767678afffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffff220000000000000000
-% 0000000000000011ffffffffffffeae9e9e9e9e9e8ffffffffffffffffffffffffffffff88393838
-% 3737363635353433333229282828272726262625252524242323232222212126252599ffffffffff
-% ffffffffff330000000000000000000000000000001f444444442404000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000088ffffffffffffffffffffee77000000000000000055
-% ff8811000011eefffffffffffffffffffffffffffffffffffffffffffff5a0606060606060606060
-% 606060606060606060606060606075d5ffffffffffffffffffffffffffffffdb6f5b5c5d5e5f6061
-% 626264656566676869696b6c6d6d6e6f7071727374757576767882f7ffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffff770000000000000000
-% 0000000000000066ffffffffffeaeaeaeaeae9e9e9fffffffffffffffffffffffffffff246393838
-% 37373636353534333332292929282827272726262625252424242323222222262550ffffffffffff
-% ffffffff88000000000000000000000000000000093f44444444443b120000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000ddffffffffffffffffffaa1100000000000000000088
-% ffffdd4400aafffffffffffffffffff4ffffffffffffffffffffffffffffffd57560606060606060
-% 60606060606060606060606060606060aaf5fffffffffffffffffffffffffffffeaf5c5d5e5f6061
-% 6262646565666768696a6b6c6d6d6e6f7071727374757576767879caffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffcc0000000000000000
-% 00000000000000aaffffffffffebebebeaeaeaeae9ffffffffffffffffffffffffffffb039393838
-% 373736363535343333322a2a292928282827272726262525252424242323262625d4ffffffffffff
-% ffffffcc000000000000000000000000000000003344444444444444442404000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000055ffffffffffffffffff99000000000000000000000099
-% ffffffffa8ffffffffffffffffffff4444ddfffffffffffffffffffffffffffff5b5606060606060
-% 60606060606060606060606060606060606bcaffffffffffffffffffffffffffffffed7c5e5f6061
-% 6262646565666768696a6b6c6d6d6e6f717172737475757677787995ffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffff1100000000000000
-% 00000000000000eeffffffffffebebebebebeaeaeaffffffffffffffffffffffffffff7c39393838
-% 3737363635353433332b2b2a2a2929292828282727262626252525242423262699ffffffffffffff
-% ffffff330000000000000000000000000000001f444444444444444444443b120000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000088ffffffffffffffffdd000000000000000000000000bb
-% ffffffffffffffffffffffffffff9900001188ffffffffffffffffffffffffffffffe08060606060
-% 6060606060606060606060606060606060606095f5ffffffffffffffffffffffffffffffcc5f6061
-% 6262646565666768696a6b6c6d6d6e6f71717273747575767778797aeeffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffff6600000000000000
-% 00000000000044ffffffffffffecececebebebebffffffffffffffffffffffffffffe53a3a393938
-% 3737363635353433332c2b2b2a2a2a2929292828272727262626252524272651ffffffffffffffff
-% ffff88000000000000000000000000000000093f4444444444444444444444442404000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000bbffffffffffffffff88000000000000000000000000ff
-% ffffffffffffffffffffffffffee110000000033ccffffffffffffffffffffffffffffffb56b6060
-% 60606060606060606060606060606060606060606bb5fffffffffffffffffffffffffffffff48761
-% 6262646565666768696a6b6c6d6e6e6f71717273747575767778797ac1ffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffff9900000000000000
-% 00000000000088ffffffffffededececececffffffffffffffffffffffffffffffffa43a3a393938
-% 38373636353534332d2d2c2c2b2b2a2a2a2929282828272727262625252727d4ffffffffffffffff
-% ffcc000000000000000000000000000000002844444444444444444444444444443b160000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000bbffffffffffffffff22000000000000000000000011ff
-% ffffffffffffffffffffffffff660000000000000088eeffffffffffffffffffffffffffffea8a60
-% 606060606060606060606060606060606060606060608aeaffffffffffffffffffffffffffffffdd
-% 6262646565666768696a6b6c6d6e6e6f71717273747575767778797a95ffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffee00000000000000
-% 000000000000ccffffffffffedededededffffffffffffffffffffffffffffffffff623a3a393938
-% 38373636353534332e2e2d2d2c2c2b2b2a2a2929292828282727262626279affffffffffffffffff
-% ff330000000000000000000000000000000000244444444444444444444444444444442d04000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000bbffffffffffffffff00000000000000000000000044ff
-% ffffffffffffffffffffffffbb00000000000000000022bbffffffffffffffffffffffffffffffca
-% 6b6060606060606060606060606060606060606060606060b5ffffffffffffffffffffffffffffff
-% f9a3646565666768696a6b6c6d6e6e6f71717273747575767778797a7aeeffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffff33000000000000
-% 000000000022ffffffffffffeeeeeeedffffffffffffffffffffffffffffffffffe53b3a3a393938
-% 38373636353534332f2e2e2d2d2c2c2b2b2a2a2a29292928282727272652ffffffffffffffffffff
-% 88000000000000000000000000000000000000000d3644444444444444444444444444443f160000
-% 00000000000000000000000000000000000000000000000000000000000000000700000000000000
-% 0000000000000000000000000000000000bbffffffffffffffff00000000000000000000000066ff
-% fffffffffffffffffffffffe6c000000000000000000000066eeffffffffffffffffffffffffffff
-% f5a0606060606060606060606060606060606060606060606080d5ffffffffffffffffffffffffff
-% ffffde7965666769696a6b6c6d6e6e7071717273747575767778797a7ac2ffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffff88000000000000
-% 000000000066ffffffffffffeeeeeeffffffffffffffffffffffffffffffffffffa43b3a3a393938
-% 3837363635353430302f2f2e2e2d2d2c2c2b2b2a2a2929292828282728c6ffffffffffffffffffdd
-% 11000000000000000000000000000000000000000000244444444444444444444444444444442d04
-% 000000000000000000000000000000000000000000000000000000000000001e733d000000000000
-% 0000000000000000000000000000000000bbffffffffffffffff44000000000000000000000088ff
-% ffffffffffffffffffffffffffaa110000000000000000000011aaffffffffffffffffffffffffff
-% ffffd5756060606060606060606060606060606060606060606060aaf5ffffffffffffffffffffff
-% fffffffdb5666769696a6b6c6d6e6f7071717273747575767778797a7a8effffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffcc000000000000
-% 0000000000aaffffffffffffefefefffffffffffffffffffffffffffffffffffff703b3a3a393938
-% 38373636353534313030302f2f2e2e2d2d2c2b2b2a2a2a29292928288cffffffffffffffffffff44
-% 00000000000000000000000000000000000000000000000d3244444444444444444444444444443f
-% 160000000000000000000000000000000000000000000000000000000000076473735c1700000000
-% 0000000000000000000000000000000000bbffffffffffffffff990000000000000000000011eeff
-% ffffffffffffffffffffffffffffee55000000000000000000000044ddffffffffffffffffffffff
-% fffffff5b5606060606060606060606060606060606060606060606075caffffffffffffffffffff
-% ffffffffffee7a69696a6b6c6d6e6f7071717273747575767778797a7a7ce5ffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffff110000000000
-% 0000000000ddfffffffffff0efefeffffffffffffffffffffffffffffffffffff23c3b3a3a393938
-% 3837373636353532313130302f2f2e2e2d2d2c2c2b2b2a2a2a292944f1ffffffffffffffffff8800
-% 0000000000000000000000000000041f0000000000000000001f3f44444444444444444444444444
-% 442d040000000000000000000000000000000000000000000000000000003d73737373733d000000
-% 000000000000000000000000000000000088ffffffffffffffffff3300000000000000000099ffff
-% ffffffffffffffffffffffffffffffffaa11000000000000000000001188ffffffffffffffffffff
-% ffffffffffe080606060606060606060606060606060606060606060606095f5ffffffffffffffff
-% ffffffffffffffcf696a6b6c6d6e6f7071727273747575767778797a7a7cc3ffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffff550000000000
-% 0000000022fffffffffffff0f0f0f0ffffffffffffffffffffffffffffffffffbe3c3b3a3a393938
-% 38373736363535333232313130302f2f2e2e2d2d2c2c2b2b2a2a29c6ffffffffffffffffffdd1100
-% 00000000000000000000000000002844360d00000000000000000932444444444444444444444444
-% 44443f16000000000000000000000000000000000000000000000000001e73737373737373641e00
-% 000000000000000000000000000000000022ffffffffffffffffffee330000000000000099ffffff
-% ffffffffffffffffffffffffffffffffffee55000000000000000000000033ccffffffffffffffff
-% ffffffffffffffb56b606060606060606060606060606060606060606060606bb5ffffffffffffff
-% fffffffffffffffff58f6b6c6d6e6f7071727273757575767778797a7a7ca0ffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffff880000000000
-% 0000000066fffffffffffff1f0f0f0ffffffffffffffffffffffffffffffffff8a3c3b3b3a3a3939
-% 3837373636353433333232313130302f2f2e2e2d2d2c2c2b2b2a8dffffffffffffffffffff440000
-% 000000000000000000000000001244444444240000000000000000001f3f44444444444444444444
-% 444444442d090000000000000000000000000000000000000000000007647373737373737373733d
-% 070000000000000000000000000000000000bbffffffffffffffffffee993300000066bbffffffff
-% ffffffffffffffffffffffffffffffffffffffbb22000000000000000000000088eeffffffffffff
-% ffffffffffffffffea8a60606060606060606060606060606060606060606060608aeaffffffffff
-% ffffffffffffffffffffdf6c6d6e6f7071727274757575767778797a7b7c7dffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffbb0000000000
-% 0000000088fffffffffffff1f1f1f1ffffffffffffffffffffffffffffffffff563c3b3b3a3a3939
-% 38383736363534343333333232313130302f2f2e2e2d2d2c2c47f1ffffffffffffffffff88000000
-% 000000000000000000000000043b4444444444361200000000000000000932444444444444444444
-% 44444444443f1f0000000000000000000000000000000000000000003d7373737373737373737373
-% 641e0000000000000000000000000000000055ffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffee77000000000000000000000022bbffffffffff
-% ffffffffffffffffffffca6b6060606060606060606060606060606060606060606060b5ffffffff
-% fffffffffffffffffffffffaa96e6f7071727274757575767778797a7b7c7dd4ffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffff0000000000
-% 00000000ccfffffffffffff2f2f1ffffffffffffffffffffffffffffffffffd93c3c3b3b3a3a3939
-% 383837363635353434343333333232313030302f2f2e2e2d2dc7ffffffffffffffffffdd11000000
-% 000000000000000000000000264444444444444444240400000000000000001f3f44444444444444
-% 4444444444444432090000000000000000000000000000000000001e737373737373737373737373
-% 73733d07000000000000000000000000000000ddffffffffffffffffffffffffffffffffffffffff
-% ffffffffff8877eeffffffffffffffffffffffffffffbb22000000000000000000000066eeffffff
-% fffffffffffffffffffffff5a0606060606060606060606060606060606060606060606080e0ffff
-% ffffffffffffffffffffffffffe0827071727374757575767778797a7b7c7dbaffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffff4400000000
-% 00000011fffffffffffff2f2f2f2ffffffffffffffffffffffffffffffffffa53d3c3c3b3a3a3939
-% 38383736363536353534343433333232313130302f2f2e2e8fffffffffffffffffffff4400000000
-% 000000000000000000000012444444444444444444443b1200000000000000000932444444444444
-% 44444444444444443f1f0000000000000000000000000000000000175c7373737373737373737373
-% 737373641e000000000000000000000000000044ffffffffffffffffffffffffffffffffffffffff
-% ffffffffee110022bbffffffffffffffffffffffffffffee77000000000000000000000011aaffff
-% ffffffffffffffffffffffffffd5756060606060606060606060606060606060606060606060aaf5
-% fffffffffffffffffffffffffffffdb271727374757576767879797a7b7c7d8fffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffff7700000000
-% 00000044fffffffffffff3f3f3f2ffffffffffffffffffffffffffffffffff713d3c3c3b3a3a3939
-% 383837373637363635353434343333333232313130302f4bf2ffffffffffffffffff880000000000
-% 00000000000000000000043b444444444444444444444444240400000000000000001b3f44444444
-% 44444444444444444444320900000000000000000000000000000000003d73737373737373737373
-% 73737373733d070000000000000000000000000066ffffffffffffffffffffffffffffffffffffff
-% ffffffee330000000077eeffffffffffffffffffffffffffffbb22000000000000000000000044dd
-% fffffffffffffffffffffffffffff5b5606060606060606060606060606060606060606060606075
-% d5fffffffffffffffffffffffffffffff08473747575767678797a7a7b7d7d7eeeffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffaa00000000
-% 00000088fffffffffffff3f3f3f3ffffffffffffffffffffffffffffffffff3d3d3c3c3b3b3a3a39
-% 3938383736373736363635353434343333323231313030c8ffffffffffffffffffdd110000000000
-% 000000000000000000002444444444444444444444444444443b120000000000000000042d444444
-% 44444444444444444444443f1f0000000000000000000000000000000000175c7373737373737373
-% 737373737373641e0000000000000000000000000066ffffffffffffffffffffffffffffffffffff
-% ffffee3300000000000011aaffffffffffffffffffffffffffffee77000000000000000000000011
-% 88ffffffffffffffffffffffffffffffe08060606060606060606060606060606060606060606060
-% 6095f5ffffffffffffffffffffffffffffffcd747575767778797a7a7b7d7d7eccffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffee00000000
-% 000000bbfffffffffffff4f4f3ffffffffffffffffffffffffffffffffffd93d3d3c3c3b3b3a3a39
-% 3938383736383837373636363535343433333332323183ffffffffffffffffffff55000000000000
-% 00000000000000000000002444444444444444444444444444444424040000000000000000163f44
-% 44444444444444444444444444320900000000000000000000000000000000003d73737373737373
-% 7373737373737373450700000000000000000000000066ffffffffffffffffffffffffffffffffff
-% ffee3300000000000000000055eeffffffffffffffffffffffffffff220000000000000000000000
-% 0033ccfffffffffffffffffbffffffffffffb56b6060606060606060606060606060606060606060
-% 60606bc0fffffffffffffffffffffffffffffff69775767778797a7a7c7d7e7eb3ffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffff22000000
-% 000000ddfffffffffffff4f4ffffffffffffffffffffffffffffffffffffa53e3d3c3c3b3b3a3a39
-% 3938383739393938383737363635353434343333333ff2ffffffffffffffffffaa00000000000000
-% 0000000000000000000000000d3644444444444444444444444444443b120000000000000000042d
-% 44444444444444444444444444443f240000000000000000000000000000000000175c7373737373
-% 7373737373737373736b2600000000000000000000000066eeffffffffffffffffffffffffffffff
-% aa11000000000000000000000011aaffffffffffffffffffffffff88000000000000000000000000
-% 00000088eeffffffffffffffffffffffffffffea8a60606060606060606060606060606060606060
-% 606060608aeaffffffffffffffffffffffffffffffe2767778797a7a7c7d7e7f99ffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffff44000000
-% 000011ffffffffffffffffffffffffffffffffffffffffffffffffffffff7e3e3d3d3c3c3b3a3a39
-% 393838373a3a393938383737363636353534343433bbffffffffffffffffffee1100000000000000
-% 00000000000000000000000000002444444444444444444444444444444428040000000000000000
-% 163f4444444444444444444444444444360d00000000000000000000000000000000003d73737373
-% 73737373737373737373734c0700000000000000000000000066ccffffffffffffffffffffff9933
-% 00000000000000000000000000000055ffffffffffffffffffffcc00000000000000000000000000
-% 0000000030fbffffffffffffffffffffffffffffffca6b6060606060606060606060606060606060
-% 60606060606bb5fffffffffffffffffffffffffffffffaa878797a7a7c7d7e7f80f7ffffffffffff
-% ffffffffffffffffffffffffffffffffffffffff88000000
-% 000044ffffffffffffffffffffffffffffffffffffffffffffffffffffff583e3d3d3c3c3b3b3a3a
-% 393938383b3b3a3a39393838373736363535343478ffffffffffffffffffff550000000000000000
-% 0000000000000000000000000000000d3644444444444444444444444444443f1600000000000000
-% 00042d444444444444444444444444444444240000000000000000000000000000000000175c7373
-% 7373737373737373737373736b26000000000000000000000000003399bbffffffffeebb77110000
-% 00000000000000000000000000000088ffffffffffffffffffff3300000000000000000000000000
-% 0000000088fffffffffffffffffffffffffffffffffff5a060606060606060606060606060606060
-% 6060606060606080e0ffffffffffffffffffffffffffffffe28a7a7b7c7d7e7f80d5ffffffffffff
-% ffffffffffffffffffffffffffffffffffffffff99000000
-% 000077ffffffffffffffffffffffffffffffffffffffffffffffffffffe63e3e3d3d3c3c3b3b3a3a
-% 393938383c3b3b3a3a3939383837373636363542f2ffffffffffffffffffee330000000000000000
-% 0000000000000000000000000000000000244444b4a850444444444444444444442d040000000000
-% 000000163f4444444444444444444444444444360d0000000000000000000000000000000000356b
-% 73737373737373737373737373734c07000000000000000000000000000000000000000000000000
-% 000000000000000000000000000033ffffffffffffffffffff880000000000000000000000000000
-% 00000044ffffffffffffffffffffffffffffffffffffffffd5756060606060606060606060606060
-% 606060606060606060aaf5fffffffffffffffffffffffffffffdb87b7c7d7e7f80c4ffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffcc000000
-% 000088ffffffffffffffffffffffffffffffffffffffffffffffffffffbf3f3e3e3d3c3c3b3b3a3a
-% 393938383d3c3c3b3b3a3a3939383837373636bcffffffffffffffffffffffff8800000000000000
-% 0000000000000000000000000000000000000d6cffffe676444444444444444444443f1600000000
-% 0000000004244444444444444444444444444444442400000000000000000000000000000000000f
-% 5473737373737373737373737373736b260000000000000000000000000000000000000000000000
-% 0000000000000000000000000000ccffffffffffffffffffcc000000000000000000000000000000
-% 000000ccfffffffffffffffffffffffffffffffffffffffffff5b560606060606060606060606060
-% 6060606060606060606075d5fffffffffffffffffffffffffffffd7b7c7d7e7f80a3ffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffff000000
-% 0000bbffffffffffffffffffffffffffffffffffffffffffffffffffffa63f3e3e3d3d3c3c3b3a3a
-% 3939383e3d3d3d3c3c3b3b3a3a39393838377affffffffffffffffffffffffffffdd440000000000
-% 00000000000000000000000000000000000011ddffffffffc150444444444444444444442d040000
-% 000000000000123b4444444444444444444444444444360d00000000000000000000000000000000
-% 00356b73737373737373737373737373734c07000000000000000000000000000000000000000000
-% 0000000000000000000000000088ffffffffffffffffffff33000000000000000000000000000000
-% 000088ffffffffffffffffffffffffffffffffffffffffffffffffe0806060606060606060606060
-% 606060606060606060606060a0f5ffffffffffffffffffffffffb87b7d7d7e7f8189ffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffff330000
-% 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff723f3e3e3d3d3c3c3b3b3a
-% 3a39393f3e3e3d3d3c3c3b3b3a3a3939383844a2ffffffffffffffffffffffffffffff8811000000
-% 00000000000000000000000000000000000088fffffffffffff38f444444444444444444443f1600
-% 00000000000000042444444444444444444444444444444424000000000000000000000000000000
-% 00000f5473737373737373737373737373736b260000000000000000000000000000000000000000
-% 00000000000000000000000033ffffffffffffffffffff8800000000000000000000000000000000
-% 0022ffffffffffffffffffff92ccffffffffffffffffffffffffffffffb56b606060606060606060
-% 606060606060606060606060606bcafffffffffffffffffffff17a7c7d7e7e808181f7ffffffffff
-% ffffffffffffffffffffffffffffffffffffffffff660000
-% 0022ffffffffffffffffffffffffffffffffffffffffffffffffffffff583f3e3e3d3d3c3c3b3b3a
-% 3a3939403f3f3e3e3d3d3c3c3b3b3a3a393938386ce5ffffffffffffffffffffffffffffdd440000
-% 000000000000000000000000000000000033ffffffffffffffffffcd5d444444444444444444442d
-% 040000000000000000123b44444444444444444444444444443b1200000000000000000000000000
-% 00000000356b7373737373737373737373737373540f000000000000000000000000000000000000
-% 000000000000000000000000ccffffffffffffffffffcc0000000000000000000000000000000000
-% 00bbffffffffffffffffffbb000088eeffffffffffffffffffffffffffffea8a6060606060606060
-% 6060606060606060606060606060b5ffffffffffffffffffff8b7a7c7d7e7e808181deffffffffff
-% ffffffffffffffffffffffffffffffffffffffffff880000
-% 0044ffffffffffffffffffffffffffffffffffffffffffffffffffffff403f3f3e3e3d3d3c3c3b3a
-% 3a393940403f3f3e3e3d3d3c3c3b3b3a3a3939393845a2ffffffffffffffffffffffffffffff8811
-% 0000000000000000000000000000000000ccfffffffffffffffffffff3a844444444444444444444
-% 3f1f0000000000000000042444444444444444444444444444444424040000000000000000000000
-% 00000000000f5473737373737373737373737373736b350000000000000000000000000000000000
-% 000000000000000000000088ffffffffffffffffffff330000000000000000000000000000000000
-% 66ffffffffffffffffffff3300000022bbffffffffffffffffffffffffffffffca6b606060606060
-% 6060606060606060606060606080ffffffffffffffffffffcf7a7a7c7d7e7f808181c5ffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffaa0000
-% 0066ffffffffffffffffffffffffffffffffffffffffffffffffffffcc403f3f3e3e3d3d3c3c3b3b
-% 3a3a39414140403f3f3e3e3d3d3c3c3b3b3a3a3939383866d5ffffffffffffffffffffffffffffdd
-% 4400000000000000000000000000000077ffffffffffffffffffffffffffda694444444444444444
-% 444432090000000000000000123b44444444444444444444444444443b1200000000000000000000
-% 00000000000000356b7373737373737373737373737373540f000000000000000000000000000000
-% 0000000000000000000033ffffffffffffffffffff88000000000000000000000000000000000011
-% eeffffffffffffffffff8800000000000066eefffffffffffffffffffffffffffff5a06060606060
-% 60606060606060606060606060e0fffffffffffffffffff6797a7b7c7d7e7f808182b5ffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffbb0000
-% 0088ffffffffffffffffffffffffffffffffffffffffffffffffffffa6403f3f3e3e3d3d3c3c3b3b
-% 3a3a394242414140403f3f3e3d3d3d3c3c3b3b3a3a39392e2e9dffffffffffffffffffffffffffff
-% ff881100000000000000000000000022eeffffffffffffffffffffffffffffffa850444444444444
-% 4444443f1f0000000000000000042444444444444444444444444444444424040000000000000000
-% 00000000000000000f5473737373737373737373737373736b350000000000000000000000000000
-% 00000000000000000000bbffffffffffffffffffdd11000000000000000000000000000000000099
-% ffffffffffffffffffdd110000000000000011aaffffffffffffffffffffffffffffffd575606060
-% 606060606060606060606060b5ffffffffffffffffffff9b797a7b7c7d7e7f8081829cffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffee0000
-% 0099ffffffffffffffffffffffffffffffffffffffffffffffffffff9a40403f3f3e3e3d3d3c3c3b
-% 3a3a3a434242414140403f3f3e3e3d3d3c3c3b3b302f2f2e2e2d57d5ffffffffffffffffffffffff
-% ffffdd440000000000000000000000bbffffffffffffffffffffffffffffffffffe6764444444444
-% 444444444432090000000000000000123644444444444444444444444444443b1200000000000000
-% 00000000000000000000266b7373737373737373737373737373540f000000000000000000000000
-% 00000000000000000077ffffffffffffffffffff44000000000000000000000000000000000044ff
-% ffffffffffffffffff440000000000000000000044ddfffffffffffffffffffffffffffff5b56060
-% 606060606060606060606075f5ffffffffffffffffffe2797a7a7b7d7d7e7f81818283ffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffff0000
-% 00bbffffffffffffffffffffffffffffffffffffffffffffffffffff7440403f3f3e3e3d3d3c3c3b
-% 3b3a3a4443434242414140403f3f3e3e3332323130302f2f2e2e2d2d9dffffffffffffffffffffff
-% ffffffffaa11000000000000000055ffffffffffffffffffffffffffffffffffffffffc150444444
-% 4444444444443f1f0000000000000000002444444444444444444444444444444424040000000000
-% 0000000000000000000000074c73737373737373737373737373736b350000000000000000000000
-% 000000000000000022eeffffffffffffffffff88000000000000000000000000000000000011ddff
-% ffffffffffffffff990000000000000000000000001188ffffffffffffffffffffffffffffffe080
-% 6060606060606060606060d5fffffffffffffffffffa78797a7a7c7d7e7e8081818284efffffffff
-% ffffffffffffffffffffffffffffffffffffffffffff3300
-% 00ddffffffffffffffffffffffffffffffffffffffffffffffffffff6741403f3f3e3e3e3d3c3c3c
-% 3b3a45444443434242414140403f3f333332323130302f2f2e2e2d2d2d56d5ffffffffffffffffff
-% ffffffffffee5500000000000011eefffffffffffffffffffffffffffffffffffffffffff3824444
-% 4444444444444444320900000000000000000d3644444444444444444444444444443b1200000000
-% 00000000000000000000000000266b7373737373737373737373737373540f000000000000000000
-% 0000000000000000bbfffffffffffffffffffd60000000000000000000000000000000000088ffff
-% ffffffffffffffee11000000000000000000000000000033ccffffffffffffffffffffffffffffff
-% b56b6060606060606060a0ffffffffffffffffffffaf78797a7a7c7d7e7f8081818384dfffffffff
-% ffffffffffffffffffffffffffffffffffffffffffff4400
-% 00ffffffffffffffffffffffffffffffffffffffffffffffffffffff414140403f3f3e3e3d3d3c3c
-% 3b3b4645454444434342424141353433333332323130302f2f2e2e2d2d2c2c9cffffffffffffffff
-% ffffffffffffffaa110000000099ffffffffffffffffffffffffffffffffffffffffffffffffcd5d
-% 4444444444444444443f1f0000000000000000002444444444444444444444444444444428040000
-% 0000000000000000000000000000074c73737373737373737373737373736b3d0000000000000000
-% 0000000000000077ffffffffffffffffffffffffbb22000000000000000000000000000033ffffff
-% ffffffffffffff66000000000000000000000000000000000088eeffffffffffffffffffffffffff
-% ffea8a6060606060606bf5ffffffffffffffffffe27778797a7b7c7d7e7f8081828384cfffffffff
-% ffffffffffffffffffffffffffffffffffffffffffff7700
-% 22fffffffffffffffffffffffffffffffffffffffffffffffffffff3414140403f3f3e3e3d3d3c3c
-% 3b3b4646464545444443434235353434333332323130302f2f2f2e2e2d2d2c2c55d5ffffffffffff
-% ffffffffffffffffee55000044ffffffffffffffffffff88ddfffffffffffffffffffffffffffff3
-% 9b44444444444444444444320d00000000000000000d3644444444444444444444444444443f1600
-% 00000000000000000000000000000000266b73737373737373737373737373735c07000000000000
-% 00000000000022eeffffffffffffffffffffffffffee8800000000000000000000000000bbffffff
-% ffffffffffffbb0000000000000000000000000000000000000022bbffffffffffffffffffffffff
-% ffffffca6b60606060cafffffffffffffffffffd887779797a7b7c7d7e7f8081828384c6ffffffff
-% ffffffffffffffffffffffffffffffffffffffffffff8800
-% 44ffffffffffffffffffffffffffffffffffffffffffffffffffffcd41414140403f3f3e3e3d3d3c
-% 3c3b474746464545444436363635353433333332323130302f2f2e2e2d2d2d2c2c2b8ef1ffffffff
-% ffffffffffffffffffffaa20ddffffffffffffffffffaa001188ffffffffffffffffffffffffffff
-% ffda694444444444444444444424000000000000000000244444444444444444444444444444442d
-% 0400000000000000000000000000000000074c737373737373737373737373734c00000000000000
-% 000000000000bbffffffffffffffffffffffffffffffffdd440000000000000000000077ffffffff
-% ffffffffffff2200000000000000000000000000000000000000000066eeffffffffffffffffffff
-% fffffffff5a060608affffffffffffffffffffbd7778797a7a7b7d7d7e7f8181828385b6ffffffff
-% ffffffffffffffffffffffffffffffffffffffffffff9900
-% 44ffffffffffffffffffffffffffffffffffffffffffffffffffffc041414140403f3f3e3e3d3d3c
-% 3c3b484747474646453737363635353434333332323130302f2f2f2e2e2d2d2c2c2b2b47c6ffffff
-% fffffffffffffffffffffff8ffffffffffffffffffee1100000033ccffffffffffffffffffffffff
-% ffffffa850444444444444444444360d00000000000000000d364444444444444444444444444444
-% 3f160000000000000000000000000000000000266b737373737373737373736b0700000000000000
-% 000000000077ffffffffffffffffffffffffffffffffffffff99110000000000000011eeffffffff
-% ffffffffff88000000000000000000000000000000000000000000000011aaffffffffffffffffff
-% ffffffffffffd580eafffffffffffffffffff0767778797a7a7c7d7e7e808181828485a6ffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffbb00
-% 66ffffffffffffffffffffffffffffffffffffffffffffffffffffa641414140403f3f3e3e3e3d3d
-% 3c3c48484847473938383737363635353434333332323130302f2f2e2e2e2d2d2c2c2b2b2b8df1ff
-% ffffffffffffffffffffffffffffffffffffffffff7700000000000088eeffffffffffffffffffff
-% ffffffffe67644444444444444444444240000000000000000001f3f444444444444444444444444
-% 44442d0400000000000000000000000000000000073d737373737373737373260000000000000000
-% 0000000022eeffffffffffffffffffffffffffffffffffffffffee66000000000000aaffffffffff
-% ffffffffcc000000000000000000000000000000000000000000000000000044ddffffffffffffff
-% ffffffffffffffffffffffffffffffffffff87767778797a7a7c7d7e7f80818183848595ffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffbb00
-% 88ffffffffffffffffffffffffffffffffffffffffffffffffffffa74141414140403f3f3e3e3d3d
-% 3c3c4949483a39393838383736363535353433333232323130302f2f2e2e2d2d2d2c2c2b2b2a46c6
-% fffffffffffffffffffffffffffffff2ffffffffbb000000000000000022bbffffffffffffffffff
-% ffffffffffffb450444444444444444444360d000000000000000009324444444444444444444444
-% 4444443f1600000000000000000000000000000000001e647373737373734c000000000000000000
-% 00000000bbffffffffffffffffffffffffffffffffffffffffffffffbb2200000055ffffffffffff
-% ffffffff440000000000000000000000000000000000000000000000000000001188ffffffffffff
-% ffffffffffffffffffffffffffffffffffd475767778797a7b7c7d7e7f80818283848586ffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffcc00
-% 88ffffffffffffffffffffffffffffffffffffffffffffffffffff8e4141414140403f3f3e3e3e3d
-% 3d3c3c3b3a3a3a393938383737363635353434333332323130302f2f2f2e2e2d2d2d2c2c2b2b2a2a
-% 8df1ffffffffffffffffffffffffffffffffffff6c0000000000000000000066eeffffffffffffff
-% fffffffffffffff38244444444444444444444240000000000000000001f3f444444444444444444
-% 44444444442d0400000000000000000000000000000000073d737373736b0f000000000000000000
-% 00000066fffffffffffffffffffff4ffffffffffffffffffffffffffffff880011ddffffffffffff
-% ffffff8800000000000000000000000000000000000000000000000000000000000033ccffffffff
-% fffffffffffffffffffffffffffffffff67576767879797a7b7c7d7e7f80818283848586ffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff00
-% 88ffffffffffffffffffffffffffffffffffffffffffffffffffff74424141414140403f3f3e3e3d
-% 3d3c3c3b3b3a3a39393838383736363535353433333332323130302f2f2f2e2e2d2d2c2c2c2b2b2a
-% 2a46c6ffffffffffffffffffffffffffffffffff99000000000000000000000011aaffffffffffff
-% ffffffffffffffffffcd5d444444444444444444360d000000000000000009324444444444444444
-% 4444444444443f1f00000000000000000000000000000000001e6473733500000000000000000000
-% 000011eeffffffffffffffffffaa11aaffffffffffffffffffffffffffffffdda8ffffffffffffff
-% ffffee11000000000000000000000000000000000000000000000000000000000000000088eeffff
-% ffffffffffffffffffffffffffffffffa075767778797a7a7b7d7d7e7f81818283858586f7ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff00
-% bbffffffffffffffffffffffffffffffffffffffffffffffffffff74424141414140403f3f3e3e3e
-% 3d3d3c3c3b3a3a3a39393838373736363535343433333232323130302f2f2e2e2e2d2d2c2c2b2b2b
-% 2a2a2a8df1ffffffffffffffffffffffffffffffee0000000000000000000000000044ddffffffff
-% fffffffffffffffffffff39b44444444444444444444240400000000000000001f3f444444444444
-% 4444444444444444320900000000000000000000000000000000073d540000000000000000000000
-% 0000aaffffffffffffffffffee11000044ddffffffffffffffffffffffffffffffffffffffffffff
-% ffff550000000000000000000000000000000000000000000000000000000000000000000022bbff
-% ffffffffffffffffffffffffffffffe27575767778797a7a7c7d7e7e8081818284858586e0ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff00
-% bbffffffffffffffffffffffffffffffffffffffffffffffffffff6842414141414140403f3f3e3e
-% 3d3d3c3c3b3b3a3a3939393838373636363535343433333232313030302f2f2e2e2d2d2d2c2c2b2b
-% 2b2a2a2a37b8ffffffffffffffffffffffffffffff55000000000000000000000000001188ffffff
-% ffffffffffffffffffffffffda694444444444444444443b12000000000000000009324444444444
-% 4444444444444444443f1f0000000000000000000000000000000000000000000000000000000000
-% 0055ffffffffffffffffffff55000000001188ffffffffffffffffffffffffffffffffffffffffff
-% ffbb0000000000000000000000000000000000000000000000000000000000000000000000000066
-% eefffffffffffffffffffffffffffc757575767778797a7b7c7d7e7f8081828384858587e0ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff44
-% bbffffffffffffffffffffffffffffffffffffffffffffffffffff4342424141414140403f3f3e3e
-% 3e3d3d3c3c3b3b3a3a39393838373736363535353433333332323130302f2f2f2e2e2d2d2d2c2c2b
-% 2b2b2a2a2a297affffffffffffffffffffffffffff9900000000000000000000000000000044ccff
-% ffffffffffffffffffffffffffffa844444444444444444444240400000000000000001f3f444444
-% 44444444444444444444443209000000000000000000000000000000000000000000000000000000
-% 11eeffffffffffffffffffaa0000000000000033bbffffffffffffffffffffffffffffffffffffff
-% ee220000000000000000000000000000000000000000000000000000000000000000000000000000
-% 11aaffffffffffffffffffffffffae757576767879797a7b7c7d7e7f8081828384858687e0ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff44
-% bbffffffffffffffffffffffffffffffffffffffffffffffffffff434242414141414140403f3f3e
-% 3e3d3d3c3c3b3b3a3a3939393838373736363535343433333332323130302f2f2f2e2e2d2d2d2c2c
-% 2b2b2b2a2a2aaaffffffffffffffffffffffffffffee000000000000000000000000000000000088
-% ffffffffffffffffffffffffffffffe6764444444444444444443b120000000000000000042d4444
-% 4444444444444444444444443f1f0000000000000000000000000000000000000000000000000000
-% aaffffffffffffffffffee1100000000000000000077eeffffffffffffffffffffffffffffffffff
-% 77000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000050fbffffffffffffffffffe1747575767778797a7a7b7d7d7e7f8181828385858687c8ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff44
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffff434342424141414140403f3f3e
-% 3e3e3d3d3c3c3b3b3a3a3939383838373636363535343433333232323130302f2f2f2e2e2d2d2d2c
-% 2c2b2b2b2a63ffffffffffffffffffffffffffffffff550000000000000000000000000000000000
-% 22bbffffffffffffffffffffffffffffffa85044444444444444444424040000000000000000163f
-% 44444444444444444444444444443209000000000000000000000000000000000000000000000055
-% ffffffffffffffffffff5500000000000000000000001199fffffffffffffffffffffffffffffff9
-% 44000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000088fffffffffffffffffffe86757575767778797a7a7c7d7e7e808181828485858688c8ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff44
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffff43434242414141414140403f3f
-% 3e3e3d3d3c3c3c3b3a3a3a3939383837373636353535343433333232313130302f2f2f2e2e2d2d2d
-% 2c2c2c2b39e3ffffffffffffffffffffffffffffffff990000000000000000000000000000000000
-% 000077eefffffffffffffffffffffffffffff3824444444444444444443b12000000000000000004
-% 2d44444444444444444444444444443f1f00000000000000000000000000000000000000000011ee
-% ffffffffffffffffffaa000000000000000000000000000044ddffffffffffffffffffffffffffff
-% ffaa1100000000000000000000000000000000000000000000000000000000000000000000000000
-% 0044ffffffffffffffffffffbb74757575767778797a7b7c7d7e7f808182838485858788c8ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff44
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffff44434342424141414140403f3f
-% 3f3e3e3d3d3c3c3b3b3a3a393939383837373636353535343333333232313130302f2f2f2e2e2d2d
-% 2d2c2c2c9cffffffffffffffffffffffffffffffffffee0000000000000000000000000000000000
-% 00000011aaffffffffffffffffffffffffffffffc15d444444444444444444240400000000000000
-% 00163f4444444444444444444444444444360d00000000000000000000000000000000000000aaff
-% ffffffffffffffffee110000000000000000000000000000000088ffffffffffffffffffffffffff
-% ffffee77000000000000000000000000000000000000000000000000000000000000000000000000
-% 00ccfffffffffffffffffff373747575767778797a7a7b7c7d7e7f808182838485868788c8ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff44
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffcd4443434242414141414140403f
-% 3f3e3e3d3d3d3c3c3b3b3a3a393938383837373636353534343333333232313030302f2f2f2e2e2d
-% 2d2d2c56ffffffffffffffffffffffffffffffffffffff5500000000000000000000000000000000
-% 000000000055ddfffffffffffffffffffffffffffff39b4444444444444444443f16000000000000
-% 0000042d44444444444444444444444444444424000000000000000000000000000000000055ffff
-% ffffffffffffffff5500000000000000000000000000000000000098ffffffffffffffffffffffff
-% ffffffffbb3300000000000000000000000000000000000000000000000000000000000000000000
-% 88ffffffffffffffffffff8d74757575767778797a7a7c7d7e7e80818182838585868788c8ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff44
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffce4444434342424141414140403f
-% 3f3f3e3e3d3d3c3c3b3b3a3a3a393938383837363636353534343333333232313030302f2f2f2e2e
-% 2d2d2dd5ffffffffffffffffffbbaaffffffffffffffffaa00000000000000000000000000000000
-% 0000000000001188ffffffffffffffffffffffffffffffcd694444444444444444442d0400000000
-% 00000000163f4444444444444444444444444444360d000000000000000000000000000011eeffff
-% ffffffffffffffbb00000000000000000000000000000000000044ffffffffffffffffffffffffff
-% ffffffffffff88110000000000000000000000000000000000000000000000000000000000000022
-% eeffffffffffffffffffbe7374757575767778797a7a7c7d7e7f80818183848585868888c8ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff88
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffce44444343424242414141414040
-% 3f3f3e3e3e3d3d3c3c3b3b3a3a39393938383737363636353534343333333232313030302f2f2f2e
-% 2e2d8fffffffffffffffffffff2266ffffffffffffffffff11000000000000000000000000000000
-% 000000000000000044ccffffffffffffffffffffffffffffffa84444444444444444443f16000000
-% 0000000000042d4444444444444444444444444444441f0000000000000000000000000088ffffff
-% ffffffffffffee22000000000000000000000000000000000000ddffffffffffffffffffffffffff
-% ffffffffffffffdd55000000000000000000000000000000000000000000000000000000000000bb
-% ffffffffffffffffffe3727374757576767879797a7b7c7d7e7f80818283848586878888c9ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff88
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffce45444443434242414141414140
-% 403f3f3e3e3d3d3c3c3c3b3b3a3a39393938383737363635353534343333333232313030302f2f2f
-% 2e4af2ffffffffffffffffff880011ffffffffffffffffff66000000000000000000000000000000
-% 0000000000000000000088ffffffffffffffffffffffffffffffe6764444444444444444442d0400
-% 00000000000000123b444444444444444444444444441f00000000000000000000000044ffffffff
-% ffffffffffff7700000000000000000000000000000000000088ffffffffffffffffffffffffffff
-% ffffffffffffffffffaa2200000000000000000000000000000000000000000000000000000066ff
-% ffffffffffffffffff8e7273747575767778797a7a7b7d7d7e7f81818283848586878889c9ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff88
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffce45444443434242424141414140
-% 403f3f3f3e3e3d3d3c3c3c3b3b3a3a39393838383737363635353534343333333232313030302f2f
-% 2fc8ffffffffffffffffffcc000000aaffffffffffffffffaa000000000000000000000000000000
-% 000000000000000000000022bbffffffffffffffffffffffffffffffa85044444444444444443f16
-% 0000000000000000042444444444444444444444443200000000000000000000000011ddffffffff
-% ffffffffffbb00000000000000000000000000000000000022fffffffffffffffffffff6ffffffff
-% ffffffffffffffffffffee770000000000000000000000000000000000000000000000000011eeff
-% ffffffffffffffffbd727374757575767778797a7a7c7d7e7e8081818284858586888889b1ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff88
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffce45454444434342424141414141
-% 40403f3f3e3e3e3d3d3c3c3b3b3a3a3a39393838383737363635353534343333333232313130302f
-% 74ffffffffffffffffffff4400000066ffffffffffffffffff110000000000000000000000000000
-% 0000000000000000000000000077eefffffffffffffffffffffffffffff382444444444444444444
-% 2d040000000000000000123b4444444444444444440900000000000000000000000088ffffffffff
-% ffffffffee22000000000000000000000000000000000000bbffffffffffffffffffbb22bbffffff
-% ffffffffffffffffffffffffcc330000000000000000000000000000000000000000000000aaffff
-% ffffffffffffffec7a727374757576767879797a7b7c7d7e7f8081828384858587888889c9ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff88
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffce45454444444343424241414141
-% 4140403f3f3e3e3d3d3d3c3c3b3b3a3a3a393938383837363636353535343433333332323131303e
-% f2ffffffffffffffffff880000000011ffffffffffffffffff660000000000000000000000000000
-% 000000000000000000000000000022aaffffffffffffffffffffffffffffffc15044444444444444
-% 443f1600000000000000000424444444444444442600000000000000000000000044ffffffffffff
-% ffffffff7700000000000000000000000000000000000066ffffffffffffffffffff33000055eeff
-% ffffffffffffffffffffffffffff8811000000000000000000000000000000000000000044ffffff
-% ffffffffffffff97727273747575767778797a7a7b7d7d7e7f808182838485868788898ac9ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff88
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffce45454544444343424242414141
-% 4140403f3f3f3e3e3d3d3c3c3c3b3b3a3a39393938383837363636353535343433333332323131ac
-% ffffffffffffffffffdd110000000000aaffffffffffffffffaa0000000000000000000000000000
-% 0000000000000000000000000000000055eefffffffffffffffffffffffffffff39b444444444444
-% 44444432090000000000000000123b444444443600000000000000000000000011ddffffffffffff
-% ffffffbb00000000000000000000000000000000000011eeffffffffffffffffff88000000001188
-% ffffffffffffffffffffffffffffffdd5500000000000000000000000000000000000011ddffffff
-% ffffffffffffd071727374757575767778797a7a7c7d7e7e80818182848585868788898ac9ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff88
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffda45454545444443434242414141
-% 414140403f3f3e3e3e3d3d3c3c3c3b3b3a3a393939383837373636363535353434333333323269ff
-% ffffffffffffffffff5500000000000066ffffffffffffffffff1100000000000000000000000000
-% 00000000000000000000000000000000001188ffffffffffffffffffffffffffffffcd5d44444444
-% 444444443f1f000000000000000004244444440d00000000000000000000000088ffffffffffffff
-% ffffee22000000000000000000000000000000000000aaffffffffffffffffffdd00000000000000
-% 44ccffffffffffffffffffffffffffffffaa220000000000000000000000000000000088ffffffff
-% fffffffffff67a71727374757576767879797a7b7c7d7e7f80818183848585878888898ac9ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff44
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffff46454545444443434342424141
-% 41414140403f3f3e3e3e3d3d3c3c3b3b3a3a3a3939393838373736363635353534343333333fe4ff
-% ffffffffffffffffaa0000000000000011ffffffffffffffffff6600000000000000000000000000
-% 0000000000000000000000000000000000000044ddffffffffffffffffffffffffffffffa8444444
-% 44444444444432090000000000000000123b2400000000000000000000000044ffffffffffffffff
-% ffff7700000000000000000000000000000000000044ffffffffffffffffffff4400000000000000
-% 000088eeffffffffffffffffffffffffffffee77000000000000000000000000000033ffffffffff
-% ffffffffffa971727274757575767778797a7a7b7d7d7e7f808182838485868788888a8bc9ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff44
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffff46454545454444434342424241
-% 4141414040403f3f3e3e3d3d3d3c3c3b3b3a3a3a3939393838373736363635353534343333a0ffff
-% ffffffffffffffee110000000000000000aaffffffffffffffffaa00000000000000000000000000
-% 00000000000000000000000000000000000000000088ffffffffffffffffffffffffffffffda7644
-% 444444444444443f1f00000000000000000000000000000000000000000011ddffffffffffffffff
-% ffbb00000000000000000000000000000000000011ddffffffffffffffffff990000000000000000
-% 00000022bbffffffffffffffffffffffffffffffcc44000000000000000000000000ccffffffffff
-% ffffffffd97171727374757575767778797a7a7c7d7e7e80818182848585868788898a8bc9ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff44
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffff46464545454444444343424241
-% 4141414140403f3f3f3e3e3d3d3d3c3c3b3b3a3a3a3939393838373736363635353534345cffffff
-% ffffffffffffff7700000000000000000066ffffffffffffffffff11000000000000000000000000
-% 0000000000000000000000000000000000000000000033bbffffffffffffffffffffffffffffffa8
-% 50444444444444444432090000000000000000000000000000000000000088ffffffffffffffffff
-% ff2200000000000000000000000000000000000088ffffffffffffffffffee110000000000000000
-% 000000000055eeffffffffffffffffffffffffffffff881100000000000000000077ffffffffffff
-% fffffff6837172727374757576777879797a7b7c7d7e7f80818183848585878888898a8bc9ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff44
-% bbffffffffffffffffffffffffffffffffffffffffffffffffffff46464645454544444343434242
-% 414141414140403f3f3f3e3e3d3d3c3c3c3b3b3a3a3a3939393838373736363635353534d7ffffff
-% ffffffffffffbb0000000000000000000011ffffffffffffffffff66000000000000000000000000
-% 00000000000000000000000000000000000000000000000077eeffffffffffffffffffffffffffff
-% e68244444444444444443f1f000000000000000000000000000000000044ffffffffffffffffffff
-% 8800000000000000000000000000000000000033ffffffffffffffffffff66000000000000000000
-% 0000000000001188ffffffffffffffffffffffffffffffee550000000000000022eeffffffffffff
-% ffffffbc7071727374757575767778797a7a7b7d7d7e7f818182838485868788888a8b8bc9ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff44
-% bbffffffffffffffffffffffffffffffffffffffffffffffffffff46464645454545444443434242
-% 42414141414140403f3f3e3e3e3d3d3c3c3c3b3b3a3a3a39393938383837373636363593ffffffff
-% ffffffffffff220000000000000000000000aaffffffffffffffffaa000000000000000000000000
-% 0000000000000000000000000000000000000000000000000022aaffffffffffffffffffffffffff
-% ffffc15044444444444444443209000000000000000000000000000000ccffffffffffffffffffcc
-% 00000000000000000000000000000000000000ccffffffffffffffffffbb00000000000000000000
-% 000000000000000033ccffffffffffffffffffffffffffffffbb220000000000bbffffffffffffff
-% ffffe3707171727374757576767778797a7a7c7d7e7f80818182848585868788898a8b8be0ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff44
-% bbffffffffffffffffffffffffffffffffffffffffffffffffffff77464646454545444444434342
-% 4241414141414040403f3f3e3e3e3d3d3c3c3c3b3b3a3a3a3939393838383737363651f2ffffffff
-% ffffffffff8800000000000000000000000066ffffffffffffffffff110000000000000000000000
-% 00000000000000000000000000000000000000000000000000000055eeffffffffffffffffffffff
-% fffffff39b444444444444444444240000000000000000000000000088ffffffffffffffffffff33
-% 00000000000000000000000000000000000077ffffffffffffffffffee2200000000000000000000
-% 0000000000000000000077eeffffffffffffffffffffffffffffee8800000055ffffffffffffffff
-% ffff957071727273747575767778797a7a7b7c7d7e7f80818283848585878888898a8b8be0ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff33
-% bbffffffffffffffffffffffffffffffffffffffffffffffffffff78464646464545454444444343
-% 424241414141414040403f3f3e3e3e3d3d3c3c3c3b3b3a3a3a393939383838373736caffffffffff
-% ffffffffcc0000000000000000000000000011eeffffffffffffffff660000000000000000000000
-% 000000000000000000000000000000000000000000000000000000001199ffffffffffffffffffff
-% ffffffffffcd5d444444444444442400000000000000000000000033ffffffffffffffffffff8800
-% 000000000000000000000000000000000022eeffffffffffffffffff880000000000000000000000
-% 000000000000000000000022aaffffffffffffffffffffffffffffffcc4411eeffffffffffffffff
-% ffbc707171727374757575767778797a7a7c7d7e7e7f818182838485868788888a8b8b8be0ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff00
-% 88ffffffffffffffffffffffffffffffffffffffffffffffffffff79474646464545454544444343
-% 434242414141414140403f3f3f3e3e3e3d3d3c3c3c3b3b3a3a3a393939383838377affffffffffff
-% ffffffff44000000000000000000000000000099ffffffffffffffffaa0000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000044ddffffffffffffffff
-% fffffffffffff3a844444444443b04000000000000000000000000ccffffffffffffffffffffaa11
-% 0000000000000000000000000000000000aaffffffffffffffffffcc000000000000000000000000
-% 0000000000000000000000000055ddffffffffffffffffffffffffffffffc8ffffffffffffffffff
-% ec79707172727374757576767879797a7b7c7d7e7f80818182848585868788898a8b8b8bffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff00
-% 88ffffffffffffffffffffffffffffffffffffffffffffffffffff91474646464645454545444443
-% 43424242414141414140403f3f3f3e3e3e3d3d3c3c3c3b3b3a3a3a393939383845f2ffffffffffff
-% ffffff8800000000000000000000000000000055ffffffffffffffffff1100000000000000000000
-% 000000000000000000000000000000000000000000000000000000000000001188ffffffffffffff
-% ffffffffffffffffda694444441600000000000000000000000088ffffffffffffffffffffffffee
-% 7700000000000000000000000000000055ffffffffffffffffffff44000000000000000000000000
-% 00000000000000000000000000001188ffffffffffffffffffffffffffffffffffffffffffffffff
-% 9e6f7171727374757575767778797a7a7b7d7d7e7f80818283848586878888898a8b8b8bffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff00
-% 88ffffffffffffffffffffffffffffffffffffffffffffffffffffaa484746464646454545444444
-% 4343424242414141414140403f3f3f3e3e3e3d3d3c3c3c3b3b3a3a3a39393938b0ffffffffffffff
-% ffffdd1100000000000000000000000000000000eeffffffffffffffff6600000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000033ccffffffffff
-% ffffffffffffffffffffa8502e00000000000000000000000033ffffffffffffffffffffffffffff
-% ffcc3300000000000000000000000011ddffffffffffffffffff8800000000000000000000000000
-% 0000000000000000000000000000000033ccffffffffffffffffffffffffffffffffffffffffffcf
-% 6f707171727374757576767778797a7a7c7d7e7e80818182838585868788898a8b8b8b8bffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffbb00
-% 66ffffffffffffffffffffffffffffffffffffffffffffffffffffaa484847464646454545454444
-% 444343424242414141414140403f3f3f3e3e3e3d3d3c3c3c3b3b3b3a3a3a396effffffffffffffff
-% ffff55000000000000000000000000000000000099ffffffffffffffffaa00000000000000000000
-% 000000000000000000000000000000000000000000000000000000000000000000000077eeffffff
-% ffffffffffffffffffffffe647000000000000000000000000ccffffffffffffffffffffffffffff
-% ffffff88110000000000000000000088ffffffffffffffffffee1100000000000000000000000000
-% 00000000000000000000000000000000000077eefffffffffffffffffffffffffffffffffffff678
-% 6f7071727274757575767778797a7a7b7c7d7e7f80818183848585868888898a8b8b8ba2ffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffbb00
-% 44ffffffffffffffffffffffffffffffffffffffffffffffffffffcf494847474646464545454544
-% 44444343424241414141414140403f3f3f3e3e3e3d3d3c3c3c3b3b3b3a3a47e5ffffffffffffffff
-% ffaa00000000000000000000000000000000000055ffffffffffffffffff11000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000022bbffff
-% ffffffffffffffffffffffffffaa1100000000000000000088ffffffffffffffffffffffffffffff
-% ffffffffdd55000000000000000044ffffffffffffffffffff550000000000000000000000000000
-% 0000000000000000000000000000000000000011aaffffffffffffffffffffffffffffffffffb26f
-% 707171727374757575767778797a7a7c7d7d7e7f81818283848586878888898a8b8b8baaffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffbb00
-% 44ffffffffffffffffffffffffffffffffffffffffffffffffffffcf494948474646464645454545
-% 4444434343424241414141414140403f3f3f3e3e3e3d3d3c3c3c3b3b3b3aa3ffffffffffffffffff
-% ee1100000000000000000000000000000000000000eeffffffffffffffff66000000000000000000
-% 000000000000000000000000000000000000000000000000000000000000000000000000000055ee
-% ffffffffffffffffffffffffffffee660000000000000033ffffffffffffffffffffffffffffffff
-% ffffffffffffaa22000000000000ccffffffffffffffffffaa000000000000000000000000000000
-% 00000000000000000000000000000000000000000044ddffffffffffffffffffffffffffffd96e6f
-% 707172727374757576777879797a7b7c7d7e7f80818182848585868788898a8b8b8b8bc1ffffffff
-% ffffffffffffffffffffffffffffffffffffffffffff8800
-% 22ffffffffffffffffffffffffffffffffffffffffffffffffffffff494948484746464646454545
-% 454444434343424241414141414140403f3f3f3e3e3e3d3d3d3c3c3c3b62ffffffffffffffffffff
-% 77000000000000000000000000000000000000000099ffffffffffffffffcc000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000011
-% 99ffffffffffffffffffffffffffffffbb220000000000ccffffffffffffffffffffffffffffffff
-% ffffffffffffffee770000000088ffffffffffffffffffee22000000000000000000000000000000
-% 000000000000000000000000000000000000000000001188ffffffffffffffffffffffffff8b6f70
-% 7171727374757575767778797a7a7b7d7d7e7f80818283848585878888898a8b8b8b8bc9ffffffff
-% ffffffffffffffffffffffffffffffffffffffffffff8800
-% 00ffffffffffffffffffffffffffffffffffffffffffffffffffffff4a4949484847464646464545
-% 45454444434343424241414141414140403f3f3f3e3e3e3d3d3d3c3c3cd8ffffffffffffffffffbb
-% 00000000000000000000000000000000000000000055ffffffffffffffffff220000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0044ddffffffffffffffffffffffffffffee8800000077ffffffffffffffffffffcdffffffffffff
-% ffffffffffffffffffcc330022eeffffffffffffffffff7700000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000033c0fffffffffffffeffffffbc6e6f70
-% 7172727374757576767879797a7b7c7d7e7e80818182838585868788888a8b8b8b8b8bd9ffffffff
-% ffffffffffffffffffffffffffffffffffffffffffff6600
-% 00ddffffffffffffffffffffffffffffffffffffffffffffffffffff7a4a49494847474646464645
-% 4545444444434342424241414141414140403f3f3f3e3e3e3d3d3d3c97ffffffffffffffffffff22
-% 00000000000000000000000000000000000000000000eeffffffffffffffff770000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00001188ffffffffffffffffffffffffffffffcc3322eeffffffffffffffffff880055eeffffffff
-% ffffffffffffffffffffff88c0ffffffffffffffffffcc0000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000aaffffffffffffffffffec6e6f7071
-% 71727374757575767778797a7a7b7c7d7e7f80818283848585868888898a8b8b8b8b8be0ffffffff
-% ffffffffffffffffffffffffffffffffffffffffffff4400
-% 00bbffffffffffffffffffffffffffffffffffffffffffffffffffff7b4a4a494948474746464645
-% 454545444444434342424241414141414140403f3f3f3e3e3e3e3d57f2ffffffffffffffffff8800
-% 0000000000000000000000000000000000000000000099ffffffffffffffffcc0000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000033ccffffffffffffffffffffffffffffffe0ffffffffffffffffffdd1100001188ffffff
-% ffffffffffffffffffffffffffffffffffffffffffff330000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000055ffffffffffffffffffff956e6f7071
-% 72727374757576767878797a7a7c7d7e7e8081818283848586878888898a8b8b8b8b8bf8ffffffff
-% ffffffffffffffffffffffffffffffffffffffffffff2200
-% 0088ffffffffffffffffffffffffffffffffffffffffffffffffffffab4a4a4a4949484746464646
-% 4545454544444443434242424141414141414040403f3f3f3e3e3eccffffffffffffffffffcc0000
-% 0000000000000000000000000000000000000000000055ffffffffffffffffff2200000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000088eeffffffffffffffffffffffffffffffffffffffffffffff44000000000044ccff
-% ffffffffffffffffffffffffffffffffffffffffff88000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000011ddffffffffffffffffffbb6e6f707171
-% 727374757575767778797a7a7b7c7d7e7f80818183848585868788898a8b8b8b8b8b8bffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffff0000
-% 0088ffffffffffffffffffffffffffffffffffffffffffffffffffffb84b4a4a4949484847464646
-% 464545454544444443434242424141414141414040403f3f3f3e7effffffffffffffffffff440000
-% 0000000000000000000000000000000000000000000000eeffffffffffffffff7700000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000022bbffffffffffffffffffffffffffffffffffffffffff88000000000000000088
-% eeffffffffffffffffffffffffffffffffffffffdd11000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000088fffffffffffffffffff6786e6f707172
-% 727374757576767778797a7a7c7d7e7e7f81818283848586878888898a8b8b8b8b8baaffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffdd0000
-% 0055ffffffffffffffffffffffffffffffffffffffffffffffffffffd04c4b4a4a49494848474646
-% 46464545454544444443434242424141414141414040403f3f4cf3ffffffffffffffffff88000000
-% 000000000000000000000000000000000000000000000099ffffffffffffffffcc00000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000066eeffffffffffffffffffffffffffffffffffffdd11000000000000000000
-% 22aaffffffffffffffffffffffffffffffffffff4400000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000044ffffffffffffffffffff9e6e6f70717172
-% 7374757575767778797a7a7b7c7d7e7f80818182848585868788898a8b8b8b8b8b8bc1ffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffbb0000
-% 0044ffffffffffffffffffffffffffffffffffffffffffffffffffffff4c4b4b4a4a494948484746
-% 4646464545454544444443434342424141414141414040403fb2ffffffffffffffffffdd11000000
-% 000000000000000000000000000000000000000000000055ffffffffffffffffff22000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000011aaffffffffffffffffffffffffffffffffff4400000000000000000000
-% 000055ddffffffffffffffffffffffffffffffd81100000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000ccffffffffffffffffffd86e6e6f70717272
-% 7374757576767778797a7a7c7d7e7e7f80818283848585878888898a8b8b8b8b8b8bc9ffffffffff
-% ffffffffffffffffffffffffffffffffffffffffff990000
-% 0011ffffffffffffffffffffffffffffffffffffffffffffffffffffff714c4b4b4a4a4949484847
-% 46464646454545454444444343434242424141414141414073ffffffffffffffffffff5500000000
-% 000000000000000000000000000000000000000000000000eeffffffffffffffff77000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000044ddfffffffffffffffffffffffffffff87700000000000000000000
-% 0000001188ffffffffffffffffffffffffffffffee55000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000088fffffffffffffffffff6806e6f7071717273
-% 74757575767778797a7a7b7c7d7e7f80818182848585868788888a8b8b8b8b8b8b8be0ffffffffff
-% ffffffffffffffffffffffffffffffffffffffffff880000
-% 0000eeffffffffffffffffffffffffffffffffffffffffffffffffffff884d4c4b4a4a4a49494848
-% 47464646464545454544444443434342424241414141414de6ffffffffffffffffffaa0000000000
-% 00000000000000000000000000000000000000000000000099ffffffffffffffffcc000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000001188ffffffffffffffffffffffffffffffcc330000000000000000
-% 000000000033ccffffffffffffffffffffffffffffffbb2200000000000000000000000000000000
-% 000000000000000000000000000000000000000022eeffffffffffffffffffb16e6e6f7071727273
-% 74757576767778797a7a7c7d7d7e7f80818283848585878888898a8b8b8b8b8b8b8bf8ffffffffff
-% ffffffffffffffffffffffffffffffffffffffffff550000
-% 0000bbffffffffffffffffffffffffffffffffffffffffffffffffffffac4d4d4c4b4a4a4a494948
-% 4847464646464545454544444443434342424241414141a6ffffffffffffffffffee110000000000
-% 00000000000000000000000000000000000000000000000055ffffffffffffffffff220000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000033ccffffffffffffffffffffffffffffff8811000000000000
-% 00000000000000dbffffffffffffffffffffffffffffffee88000000000000000000000000000000
-% 0000000000000000000000000000000000000000bbffffffffffffffffffe26d6e6f707171727374
-% 757575767778797a7a7b7c7d7e7f80818182838585868788888a8a8b8b8b8b8b8b9bffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffff220000
-% 000088ffffffffffffffffffffffffffffffffffffffffffffffffffffd04d4d4c4c4b4a4a4a4949
-% 4847474646464645454545444444434343424242414167ffffffffffffffffffff77000000000000
-% 00000000000000000000000000000000000000000000000000eeffffffffffffffff770000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000088eeffffffffffffffffffffffffffffdd440000000000
-% 00000000000077ffffffffffffffffffffffffffffffffffffdd4400000000000000000000000000
-% 0000000000000000000000000000000000000066ffffffffffffffffffff8a6e6f6f717172727374
-% 757576767878797a7a7c7d7d7e7f80818283848585868888898a8b8b8b8b8b8b8bb2ffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffff000000
-% 000066fffffffffffffffffffffffffffffffffffffffffffffffffffff44d4d4d4c4c4b4a4a4a49
-% 49484747464646464545454545444444434342424241d9ffffffffffffffffffbb00000000000000
-% 0000000000000000000000000000000000000000000000000099ffffffffffffffffcc0000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000022bbffffffffffffffffffffffffffffff9911000000
-% 000000000011eeffffffffffffffffffffffffffffffffffffffff99110000000000000000000000
-% 00000000000000000000000000000000000011eeffffffffffffffffffbb6d6e6f70717272737475
-% 7575767778797a7a7b7c7d7e7f8081818283858586878888898a8b8b8b8b8b8b8bc9ffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffbb000000
-% 000044ffffffffffffffffffffffffffffffffffffffffffffffffffffff654d4d4d4c4c4b4a4a4a
-% 4949484847464646464545454545444444434343429affffffffffffffffffff2200000000000000
-% 0000000000000000000000000000000000000000000000000055ffffffffffffffffff2200000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000066eeffffffffffffffffffffffffffffee550000
-% 0000000000aaffffffffffffffffffffffffffffffffffffffffffffee6600000000000000000000
-% 000000000000000000000000000000000000aaffffffffffffffffffec776e6f7071717273747475
-% 7576767878797a7a7c7d7d7e7f80818283848585868888898a8b8b8b8b8b8b8b8be0ffffffffffff
-% ffffffffffffffffffffffffffffffffffffffff99000000
-% 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff954e4d4d4d4c4c4b4a4a
-% 4a494948484746464646454545454544444443435cf3ffffffffffffffffff880000000000000000
-% 0000000000000000000000000000000000000000000000000000ddffffffffffffffff7700000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000011aaffffffffffffffffffffffffffffffbb22
-% 0000000044ffffffffffffffffffffffffffffffffffffffffffffffffffbb220000000000000000
-% 000000000000000000000000000000000044ffffffffffffffffffff946e6e6f7071727273747575
-% 75767778797a7a7b7c7d7e7f8081818283858586878888898a8b8b8b8b8b8b8b8bffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffff77000000
-% 000000ccffffffffffffffffffffffffffffffffffffffffffffffffffffb94f4e4d4d4d4c4c4b4a
-% 4a4a494948484746464646464545454544444443cdffffffffffffffffffcc000000000000000000
-% 000000000000000000000000000000000000000000000000000088ffffffffffffffffcc00000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000055ddffffffffffffffffffffffffffffee
-% 77000011ddffffffffffffffffff9977eeffffffffffffffffffffffffffffff8800000000000000
-% 0000000000000000000000000000000011ddffffffffffffffffffcf6d6e6f707171727374757575
-% 76777879797a7a7c7d7e7e7f80818283848585868888898a8b8b8b8b8b8b8b8baaffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffff44000000
-% 000000aaffffffffffffffffffffffffffffffffffffffffffffffffffffdc4f4e4e4d4d4d4c4c4b
-% 4a4a4a4949484847464646464645454545444482ffffffffffffffffffff44000000000000000000
-% 000000000000000000000000000000000000000000000000000033ffffffffffffffffff22000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000001188ffffffffffffffffffffffffffff
-% ffbb3388ffffffffffffffffffee110011aaffffffffffffffffffffffffffffffdd440000000000
-% 0000000000000000000000000000000088fffffffffffffffffff6776e6f6f707172727374757576
-% 767778797a7a7b7c7d7e7f8081818283858586878888898a8b8b8b8b8b8b8b8bc1ffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffff11000000
-% 00000088ffffffffffffffffffffffffffffffffffffffffffffffffffffff5c4f4e4e4d4d4d4c4c
-% 4b4a4a4a494948484746464646464545454551f3ffffffffffffffffff8800000000000000000000
-% 000000000000000000000000000000000000000000000000115588f9ffffffffffffffff77000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000044ccffffffffffffffffffffffff
-% ffffffffffffffffffffffffff550000000044ddffffffffffffffffffffffffffffff9911000000
-% 00000000000000000000000000000033ffffffffffffffffffffa86e6e6f70717172737475757576
-% 777879797a7b7c7d7e7e7f81818283848585868888898a8b8b8b8b8b8b8b8b8bd9ffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffdd00000000
-% 00000044ffffffffffffffffffffffffffffffffffffffffffffffffffffff8a504f4e4e4d4d4d4c
-% 4c4b4a4a4a49494848474746464646454545b5ffffffffffffffffffdd1100000000000000000000
-% 0000000000000000000000000000000000000000115588ccffffffffffffffffffffffffcc000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000088ffffffffffffffffffffff
-% ffffffffffffffffffffffffbb0000000000001188ffffffffffffffffffffffffffffffee660000
-% 000000000000000000000000000000ccffffffffffffffffffd86d6e6f7071717272747475757676
-% 7778797a7a7b7d7d7e7f8081818284858586878888898a8b8b8b8b8b8b8b8b8bf8ffffffffffffff
-% ffffffffffffffffffffffffffffffffffffff9900000000
-% 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffae50504f4e4e4d4d4d
-% 4c4c4b4a4a4a494948484747464646464677ffffffffffffffffffff440000000000000000000000
-% 00000000000000000000000000000000004488ccffffffffffffffffffffffffffffffffff220000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000000022bbffffffffffffffffff
-% ffffffffffffffffffffffee22000000000000000033bbffffffffffffffffffffffffffffffbb33
-% 000000000000000000000000000077fffffffffffffffffff6806e6e6f7071727273747575757677
-% 78797a7a7b7c7d7e7e8081818283848585878888898a8b8b8b8b8b8b8b8b8ba2ffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffff7700000000
-% 00000000bbffffffffffffffffffffffffffffffffffffffffffffffffffffe85050504f4e4e4d4d
-% 4d4c4c4b4b4a4a49494948474746464652e7ffffffffffffffffffaa000000000000000000000000
-% 000000000000000000000000004488bbfffffffffffffffffffffffffffffffffbffffffff770000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000077eeffffffffffffff
-% ffffffffffffffffffffff88000000000000000000000077eeffffffffffffffffffffffffffffff
-% 8811000000000000000000000022eeffffffffffffffffffbb6d6e6f707171727374757575767778
-% 78797a7a7c7d7d7e7f80818183848585868788888a8a8b8b8b8b8b8b8b8b8bc1ffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffff3300000000
-% 0000000088ffffffffffffffffffffffffffffffffffffffffffffffffffffff685050504f4e4e4d
-% 4d4d4c4c4b4b4a4a4949494848474646a9ffffffffffffffffffee11000000000000000000000000
-% 0000000000000000003388bbffffffffffffffffffffffffffffffffffffffffffffffffffdd0000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000000000000011aaffffffffffff
-% ffffffffffffffffffffd3000000000000000000000000001199ffffffffffffffffffffffffffff
-% ffdd4400000000000000000000bbffffffffffffffffffe26d6e6f70717172727374757576767778
-% 797a7a7b7c7d7e7f8081818283848586878888898a8b8b8b8b8b8b8b8b8b8be0ffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffee0000000000
-% 0000000055ffffffffffffffffffffffffffffffffffffffffffffffffffffffa2515050504f4f4e
-% 4d4d4d4d4c4b4b4a4a4a49494848476cffffffffffffffffffff6600000000000000000000000000
-% 00000000003377aaeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3300
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000000055ddffffffff
-% fffffffffffffffffffff277000000000000000000000000000044ddffffffffffffffffffffffff
-% ffffffaa110000000000000055ffffffffffffffffffff946e6e6f70717272737475757576777879
-% 797a7a7c7d7e7e7f80818283848585868788888a8a8b8b8b8b8b8b8b8b8b93ffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffbb0000000000
-% 0000000011ffffffffffffffffffffffffffffffffffffffffffffffffffffffc651515050504f4f
-% 4e4d4d4d4d4c4c4b4a4a4a49494848dbffffffffffffffffffbb0000000000000000000000000000
-% 003377aaeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8800
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000001188ffffff
-% ffffffffffffffffffffffffbb33000000000000000000000000000088ffffffffffffffffffffff
-% ffffffffee77000000000011eeffffffffffffffffffbb6e6e6f7071717273747575757676777879
-% 7a7a7b7c7d7e7f8081818283848586878888898a8b8b8b8b8b8b8b8b8b8bb2ffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffff880000000000
-% 0000000000ddffffffffffffffffffffffffffffffffffffffffffffffffffffff5251515050504f
-% 4f4e4e4d4d4d4c4c4b4a4a4a49499effffffffffffffffffee220000000000000000000000226699
-% eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd00
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000000000000044ccff
-% ffffffffffffffffffffffffffff88000000000000000000000000000022bbffffffffffffffffff
-% ffffffffffffbb3300000088ffffffffffffffffffec776e6f70717172727374757575767778797a
-% 7a7b7c7d7e7e7f81818283848585868788898a8b8b8b8b8b8b8b8b8b8b8bd1ffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffff440000000000
-% 000000000099ffffffffffffffffffffffffffffffffffffffffffffffffffffff8c525151505050
-% 4f4f4e4e4d4d4d4c4c4b4b4a4a61f3ffffffffffffffffff880000000000000000226699ddffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd7ffffffffffffffffff33
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000088
-% ffffffffffffffffffffffffffffffdd44000000000000000000000000000066eeffffffffffffff
-% ffffffffffffffff881144ffffffffffffffffffff9e6e6e6f70717272737475757576777879797a
-% 7a7c7d7d7e7f8081818283858586878888898a8b8b8b8b8b8b8b8b8b8b8bf0ffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffff000000000000
-% 000000000055ffffffffffffffffffffffffffffffffffffffffffffffffffffffba535252515050
-% 50504f4e4e4d4d4d4c4c4b4b4acfffffffffffffffffffcc0000000000226699ddffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffdd99661100ddffffffffffffffff88
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 33bbffffffffffffffffffffffffffffff8811000000000000000000000000001199ffffffffffff
-% ffffffffffffffffffdde9ffffffffffffffffffcf6e6e6f70717172737475757576767778797a7a
-% 7b7c7d7e7f8081818283848585868888898a8b8b8b8b8b8b8b8b8b8b8ba2ffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffbb000000000000
-% 000000000011fffffffffffffffffffffffffffffffffffffffffffffffffffffff4535352525150
-% 5050504f4e4e4d4d4d4d4c4c87ffffffffffffffffffff3300115588ccffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffdd996622000000000088ffffffffffffffffdd
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000077eeffffffffffffffffffffffffffffdd55000000000000000000000000000044ddffffffff
-% fffffffffffffffffffffffffffffffffffffff6776e6f7071717272737475757576777879797a7b
-% 7c7d7e7e7f8081828384858586878888898a8b8b8b8b8b8b8b8b8b8b8bc9ffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffff77000000000000
-% 000000000000bbffffffffffffffffffffffffffffffffffffffffffffffffffffff8d5453525251
-% 505050504f4f4e4d4d4d4d58f4ffffffffffffffffffb088ccffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffee99662200000000000000000033ffffffffffffffffff
-% 33000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000022aaffffffffffffffffffffffffffffbb0000000000000000000000000000000088eeffff
-% ffffffffffffffffffffffffffffffffffffffb16e6f6f71717272737475757576777879797a7a7c
-% 7d7d7e7f8081818283848586878888898a8b8b8b8b8b8b8b8b8b8b8b8bf0ffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffff33000000000000
-% 00000000000077ffffffffffffffffffffffffffffffffffffffffffffffffffffffbb5454535252
-% 51515050504f4f4e4e4d4db8ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffeeaa77330000000000000000000000000000ddffffffffffffffff
-% 88000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000055eeffffffffffffffffffffffff22000000000000000000000000000000000022bbff
-% ffffffffffffffffffffffffffffffffffffd86e6e6f70717272737475757576767778797a7a7b7c
-% 7d7e7f8081818283848585868788898a8a8b8b8b8b8b8b8b8b8b8b8ba2ffffffffffffffffffffff
-% ffffffffffffdfdfffffffffffffffffdd00000000000000
-% 00000000000033fffffffffffffffffffffffffffffffffffffffffffffffffffffff45454545352
-% 5251515050504f4f4e4e7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffeeaa773300000000000000000000000000000000000088ffffffffffffffff
-% dd000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000001199ffffffffffffffffffff88000000000000000000000000000000000000000055
-% eeffffffffffffffffffffffffffffffffff8b6e6f70717172737474757576767778797a7a7b7c7d
-% 7e7e7f8081818384858586878888898a8b8b8b8b8b8b8b8b8b8b8b8bd1ffffffffffffffffffffff
-% ffffdfdfdfdfdfdfffffffffffffffff9900000000000000
-% 00000000000000ddffffffffffffffffffffffffffffffffffffffffffffffffffffff8d54545453
-% 53525151505050504f5ae8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffbb88330000000000000000000000000000000000000000000033ffffffffffffffff
-% ff330000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000bbffffffffffffffffffcc00000000000000000000000000000000000000000000
-% 1188ffffffffffffffffffffffffffffffbb6e6f7071717272737475757576777879797a7a7c7d7d
-% 7e7f8081818283848585878888898a8b8b8b8b8b8b8b8b8b8b8b8b8bf8ffffffffffffffffffffff
-% ffdfdfdfdfdfdfdfffffffffffffffff5500000000000000
-% 0000000000000099ffffffffffffffffffffffffffffffffffffffffffffffffffffffc755545454
-% 535352525150505050adffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffbb8844000000000000000000000000000000000000000000000000000000ddffffffffffffff
-% ff880000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000055ffffffffffffffffffff4400000000000000000000000000000000000000000000
-% 000044ccfffffffffffffbffffffffffec6e6f7071717272737475757576777878797a7a7b7c7d7e
-% 7f808181828384858586878888898a8b8b8b8b8b8b8b8b8b8b8b8bb2ffffffffffffffffffffffff
-% ffdfdfdfdfdfdfffffffffffffffffff1100000000000000
-% 0000000000000066ffffffffffffffffffffffffffffffffffffffffffffffffffffffff60555454
-% 545353525251515073ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb88
-% 440000000000000000000000000000000000000000000000000000000000000088ffffffffffffff
-% ffdd0000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000011eeffffffffffffffffff880000000000000000000000000000000000000000000000
-% 0000000088f4ffffffffffffffffffff956f6f70717272737475757576767778797a7a7b7c7d7e7e
-% 7f8081818284858586878888898a8b8b8b8b8b8b8b8b8b8b8b8b8bd1ffffffffffffffffffffffff
-% dfdfdfdfdfdfdfffffffffffffffffaa0000000000000000
-% 0000000000000011ffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5555554
-% 5454545352525151c5ffffffffffffffffffffffffffffffffffffffffffffffffffcc8855110000
-% 000000000000000000000000000000000000000000000000000000000000000033ffffffffffffff
-% ffff3300000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000099ffffffffffffffffffdd110000000000000000000000000000000000000000000000
-% 0000000011e2ffffffffffffffffffbc6e6f7071717273747475757576777879797a7a7c7d7d7e7f
-% 8081818283848585868888898a8b8b8b8b8b8b8b8b8b8b8b8b8b93ffffffffffffffffffffffffff
-% e0dfdfdfdfdfdfffffffffffffffff660000000000000000
-% 000000000000000099ffffffffffffffffffffffffffffffffffffffffffffffffffffffe9565655
-% 5454545453535252d1ffffffffffffffffffffffffffffffffffffffffffcc885511000000000000
-% 000000000000000000000000000000000000000000000000000000000000000000ddffffffffffff
-% ffff8800000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000044ffffffffffffffffffff55000000000000000000000000000000000000000000000000
-% 0000000088fffffffffffffffffff6786f7071717272737475757576777879797a7a7b7c7d7e7f80
-% 8181828384858586878888898a8b8b8b8b8b8b8b8b8b8b8b8b8bc1ffffffffffffffffffffffffff
-% e0e0dfdfdfdfffffffffffffffffff110000000000000000
-% 000000000000000055ffffffffffffffffffffffffffffffffffffffffffffffffffffffff835656
-% 5555545454535352d1ffffffffffffffffffffffffffffffffffdd99551100000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000077ffffffffffff
-% ffffdd00000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000011ddffffffffffffffffffaa00000000000000000000000000000000000000000000000000
-% 00000044ffffffffffffffffffff9e6f7071717272737475757576777878797a7a7b7c7d7e7e7f80
-% 81818384858586878888898a8b8b8b8b8b8b8b8b8b8b8b8b8b8bf0ffffffffffffffffffffffffe0
-% e0e0dfdfdfdfffffffffffffffffaa000000000000000000
-% 000000000000000000eeffffffffffffffffffffffffffffffffffffffffffffffffffffffbc5656
-% 5655555454545453d1ffffffffffffffffffffffffffffd070220000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000022ffffffffffff
-% ffffff33000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000011444444444444888888
-% 888888d8ffffffffffffffffffee1100000000000000000000000000000000000000000000000000
-% 000000ccffffffffffffffffffd96f7071717272737475757576767778797a7a7b7c7d7d7e7f8081
-% 818283848585868888898a8b8b8b8b8b8b8b8b8b8b8b8b8b8baaffffffffffffffffffffffffffe0
-% e0e0e0dfdfdfffffffffffffffff66000000000000000000
-% 00000000000000000099ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6256
-% 565656555454545498f4ffffffffffffffffffffffffffffee550000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000ccffffffffff
-% ffffff88000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000011444444444444888888888888aabbbbbbbbbbddffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffff770000000000000000000000000000000000000000000000000000
-% 000088fffffffffffffffffff6826f7071727273747575757676777879797a7a7c7d7d7e7f808181
-% 828384858586878888898a8b8b8b8b8b8b8b8b8b8b8b8b8b8bd1ffffffffffffffffffffffffe0e0
-% e0e0e0dfdfffffffffffffffffff11000000000000000000
-% 00000000000000000055ffffffffffffffffffffffffffffffffffffffffffffffffffffffffb157
-% 5756565655555454545fc6ffffffffffffffffffffffffffffffaa22000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000000077ffffffffff
-% ffffffdd0000000000000000000000000000000011444444444444888888888888aabbbbbbbbbbdd
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffbb000000000000000000000000000000000000000000000000000000
-% 0022eeffffffffffffffffffb26f7071717273747475757576777879797a7a7b7c7d7e7f80818182
-% 8384858586878888898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b9bffffffffffffffffffffffffffe0e0
-% e0e0e0e0dfffffffffffffffffaa00000000000000000000
-% 00000000000000000000eeffffffffffffffffffffffffffffffffffffffffffffffffffffffe958
-% 57575656565555545454548cf4ffffffffffffffffffffffffffffee770000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000000022ffffffffff
-% ffffffff88888888aabbbbbbbbbbddffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffff22000000000000000000000000000000000000000000000000000000
-% 00bbffffffffffffffffffe36f7071717273747475757576777878797a7a7b7c7d7e7e7f80818182
-% 83848586878888898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bc9ffffffffffffffffffffffffffe0e0
-% e0e0e0e0e0ffffffffffffffff6600000000000000000000
-% 0000000000000000000099ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9b
-% 5857575656565655545454545fafffffffffffffffffffffffffffffffbb33000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000000000ccffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% fffffffffffff3ffffffff8800000000000000000000000000000000000000000000000000000000
-% 66ffffffffffffffffffff8c7071717272737475757576777778797a7a7b7c7d7e7e7f8081818283
-% 84858586878888898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b93f8ffffffffffffffffffffffffe0e0e0
-% e0e0e0e0ffffffffffffffffff1100000000000000000000
-% 0000000000000000000044ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9
-% 585857575756565655555454545481e8ffffffffffffffffffffffffffffff880000000000000000
-% 000000000000000000000000000000000000000000000000000000000000000000000077ffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffcc0000000000000000000000000000000000000000000000000000000011
-% eeffffffffffffffffffbc7071717272737475757576767778797a7a7b7c7d7d7e7f808181828384
-% 858586878888898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bc1ffffffffffffffffffffffffffe0e0e0
-% e0e0e0e0ffffffffffffffff990000000000000000000000
-% 0000000000000000000000ddffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% 85595858575756565656555454545454afffffffffffffffffffffffffffffffdd44000000000000
-% 000000000000000000000000000000000000000000000000000000000000000000000022ffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffff4400000000000000000000000000000000000000000000000000000000aa
-% ffffffffffffffffffec7a7171727273747575757676777879797a7a7c7d7d7e7f80818182838485
-% 8586878888898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bf0ffffffffffffffffffffffffe1e0e0e0
-% e0e0e0e0ffffffffffffffff440000000000000000000000
-% 000000000000000000000077ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% d35959585857575756565655555454545475d1ffffffffffffffffffffffffffffff881100000000
-% 000000000000000000000000000000000000000000000000000000000000000000000000ccffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffffdffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffff880000000000000000000000000000000000000000000000000000000044ff
-% ffffffffffffffffff967171727273747575757676777879797a7a7b7c7d7e7e7f80818182838485
-% 85868888898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bbaffffffffffffffffffffffffffe1e0e0e0
-% e0e0e0ffffffffffffffffdd000000000000000000000000
-% 000000000000000000000011ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ff865959595858575756565656555554545454a3f4ffffffffffffffffffffffffffffee55000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000077ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffdd1100000000000000000000000000000000000000000000000000000011ddff
-% ffffffffffffffffd07171727273747575757576777879797a7a7b7c7d7e7e7f8081818283848585
-% 86878888898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8be0ffffffffffffffffffffffffe1e1e1e0e0
-% e0e0e0ffffffffffffffff77000000000000000000000000
-% 00000000000000000000000099ffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffd35a5a595958585757575656565555545454546bc6ffffffffffffffffffffffffffffffaa2200
-% 00000000000000000000000000000000000000000000000000000000000000000000000022ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffeebbbbbbbbbbbb888888a8ffff
-% ffffffffffffffff550000000000000000000000000000000000000000000000000000000088ffff
-% fffffffffffffff67a71727273747575757576777878797a7a7b7c7d7e7e7f808181828384858586
-% 878888898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bbaffffffffffffffffffffffffffe1e1e1e0e0
-% e0e0ffffffffffffffffff11000000000000000000000000
-% 00000000000000000000000044ffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffff865a5a59595858585757565656565555545454548df4ffffffffffffffffffffffffffffee77
-% 00000000000000000000000000000000000000000000000000000000000000000000000000ccffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffeebbbbbbbbbbbb88888888888855444444444422000000000000000000000000000011ddffff
-% ffffffffffffffaa0000000000000000000000000000000000000000000000000000000033ffffff
-% ffffffffffffffaa71727273747475757576777878797a7a7b7c7d7d7e7f80818182838485858687
-% 8888898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bf0ffffffffffffffffffffffffe1e1e1e1e1e0
-% e0e0ffffffffffffffff9900000000000000000000000000
-% 00000000000000000000000000ddffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffd45a5a5a5a595958585757575656565655555454545fafffffffffffffffffffffffffffffff
-% bb33000000000000000000000000000000000000000000000000000000000000000000000077ffff
-% ffffffffffffffffffffffffffffffffffeebbbbbbbbbbf6ffffffffffffffff8f44444422000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000088ffffff
-% ffffffffffffffe044000000000000000000000000000000000000000000000000000000ccffffff
-% ffffffffffffd971727273747475757576777878797a7a7b7c7d7d7e7f8081818283848585868788
-% 88898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bbaffffffffffffffffffffffffffe1e1e1e1e1e1
-% e0ffffffffffffffffff5500000000000000000000000000
-% 0000000000000000000000000077ffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffff875b5a5a5a595959585857575756565656555554545482e9ffffffffffffffffffffffffff
-% ffff8800000000000000000000000000000000000000000000000000000000000000000000228888
-% 888888888855444444444422000000000000000000000088ffffffffffffffffaa00000000000000
-% 000000000000000000000000000000000000000000000000000000000000000000000033ffffffff
-% ffffffffffffffffff881100000000000000000000000000000000000000000000000077ffffffff
-% fffffffffff684727273747475757576777778797a7a7a7c7d7d7e7f808081818283848585868788
-% 88898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bf0ffffffffffffffffffffffffe1e1e1e1e1e1e1
-% e0ffffffffffffffffdd0000000000000000000000000000
-% 0000000000000000000000000011eeffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffd45c5b5a5a5a5a5959585858575756565656555554545454afffffffffffffffffffffffff
-% ffffffdd440000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000055ffffffffffffffffee00000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000000000ccffffffff
-% ffffffffffffffffffffee550000000000000000000000000000000000000000000022eeffffffff
-% ffffffffffbd72727374747575757676777879797a7a7c7d7d7e7e7f808181828384858586878888
-% 898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bbaffffffffffffffffffffffffffe1e1e1e1e1e1e1
-% e1ffffffffffffffff660000000000000000000000000000
-% 000000000000000000000000000088ffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffff875c5b5b5a5a5a595959585857575756565656555554545476d2ffffffffffffffffffff
-% ffffffffff8811000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000ffffffffffffffffff44000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000000077ffffffffff
-% ffffffffffffffffffffffffaa220000000000000000000000000000000000000000bbffffffffff
-% ffffffffe372727374747575757676777879797a7a7b7c7d7e7e7f80818182838485858687888889
-% 8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bf0ffffffffffffffffffffffffe1e1e1e1e1e1e1e1
-% ffffffffffffffffee110000000000000000000000000000
-% 000000000000000000000000000022ffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffea5d5c5c5b5a5a5a5a5959595858575757565656565555555454a4f4ffffffffffffffff
-% ffffffffffffee550000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000aaffffffffffffffff88000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000022eeffffffffff
-% ffffffffffffffffffffffffffee7700000000000000000000000000000000000055ffffffffffff
-% ffffffff98727374747575757676777879797a7a7b7c7d7e7e7f808181828384858586878888898a
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bc9ffffffffffffffffffffffffffe1e1e1e1e1e1e1e1
-% ffffffffffffffff88000000000000000000000000000000
-% 00000000000000000000000000000099ffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffa95d5c5c5b5b5a5a5a5a595958585857575756565656555555546bc6ffffffffffffff
-% ffffffffffffffffaa22000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000077ffffffffffffffffcc000000000000
-% 000000000000000000000000000000000000000000000000000000000000000000bbffffffffffff
-% ffffffffffffffffffffffffffffffbb3300000000000000000000000000000011eeffffffffffff
-% ffffffbd727374747575757676777879797a7a7b7c7d7e7e7f808181828384858586878888898a8a
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b93f8ffffffffffffffffffffffffe2e2e1e1e1e1e1e1ff
-% ffffffffffffffff11000000000000000000000000000000
-% 00000000000000000000000000000033ffffffffffffffffffffffffffffffffffffffffffffffff
-% fffffffffff5695d5d5c5c5b5b5a5a5a59595958585857575756565656565555548df4ffffffffff
-% ffffffffffffffffffee770000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000022ffffffffffffffffff220000000000
-% 000000000000000000000000000000000000000000000000000000000000000055ffffffffffffff
-% ffffffffffffffffffffffffffffffffff88000000000000000000000000000088ffffffffffffff
-% ffffed7b7374747575757676777879797a7a7b7c7d7e7e7f80818182838485858687888888898a8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bd1ffffffffffffffffffffffffe2e2e2e1e1e1e1e1e1ff
-% ffffffffffffff9900000000000000000000000000000000
-% 00000000000000000000000000000000bbffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffb45e5e5d5d5c5c5b5a5a5a5a595959585858575757565656565655555fafffffffff
-% ffffffffffffffffffffffbb22000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000ddffffffffffffffff660000000000
-% 0000000000000000000000000000000000000000000000000000000000000011eeffffffffffffff
-% ffffdcffffffffffffffffffffffffffffffdd44000000000000000000000044ffffffffffffffff
-% ffffa17374757575757676777879797a7a7b7c7d7e7e7f80818182838485858586878888898a8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8ba2ffffffffffffffffffffffffffe2e2e2e2e1e1e1e1ffff
-% ffffffffffffff2200000000000000000000000000000000
-% 0000000000000000000000000000000055ffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffff745e5e5e5d5c5c5b5b5a5a5a5a5959595858585757575656565656555582e9ffff
-% ffffffffffffffffffffffffff880000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000088ffffffffffffffffaa0000000000
-% 0000000000000000000000000000000000000000000000000000000000000099ffffffffffffffff
-% ffea697ed4ffffffffffffffffffffffffffffff8811000000000000000000ddffffffffffffffff
-% ffd07374757575757676777879797a7a7b7c7d7e7e7f80818182838384858586878888898a8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8be0ffffffffffffffffffffffffe2e2e2e2e2e2e1e1e1ffff
-% ffffffffffffaa0000000000000000000000000000000000
-% 0000000000000000000000000000000000bbffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffd55f5f5e5e5d5d5c5c5b5b5a5a5a5a59595958585857575757565656565655b0ff
-% ffffffffffffffffffffffffffffcc44000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000055ffffffffffffffffee0000000000
-% 00000000000000000000000000000000000000000000000000000000000044ffffffffffffffffff
-% ff895e5f5faaf5ffffffffffffffffffffffffffffee550000000000000088ffffffffffffffffff
-% f67c74757575757677777879797a7a7b7c7d7d7e7f80818182828384858586878888898a8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bb2ffffffffffffffffffffffffffe2e2e2e2e2e2e1e1ffffff
-% ffffffffffff440000000000000000000000000000000000
-% 000000000000000000000000000000000044ffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffa05f5f5e5e5e5d5d5c5c5b5b5a5a5a5a59595959585857575757565656565678
-% d2ffffffffffffffffffffffffffffff881100000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000ffffffffffffffffff4400000000
-% 000000000000000000000000000000000000000000000000000000000011ddffffffffffffffffff
-% ca5f5f5f606176cbffffffffffffffffffffffffffffffaa220000000033ffffffffffffffffffff
-% b574757575757677777879797a7a7b7c7d7d7e7f80818181828384858586878888898a8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b93f8ffffffffffffffffffffffffe2e2e2e2e2e2e2e2e1ffffff
-% ffffffffffbb000000000000000000000000000000000000
-% 000000000000000000000000000000000000bbffffffffffffffffffffffffffffffffffffffffff
-% fffffffffffffffff56b605f5f5e5e5e5d5d5c5c5b5b5a5a5a5a5959595958585857575757565656
-% 56a5f4ffffffffffffffffffffffffffffdd55000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000aaffffffffffffffff8800000000
-% 000000000000000000000000000000000000000000000000000000000088fffffffffffffffffff5
-% 6a5f60616162626296f5ffffffffffffffffffffffffffffee77000000bbffffffffffffffffffda
-% 74757575757677787879797a7a7b7c7d7d7e7f80818181828384858586878888898a8a8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8bc9ffffffffffffffffffffffffe2e2e2e2e2e2e2e2e2ffffffff
-% ffffffffff33000000000000000000000000000000000000
-% 00000000000000000000000000000000000044ffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffcb61605f5f5f5e5e5e5d5d5c5c5b5b5a5a5a5a5a5959595858585757575756
-% 56566cc7ffffffffffffffffffffffffffffffaa1100000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000077ffffffffffffffffcc00000000
-% 0000000000000000000000000000000000000000000000000000000033ffffffffffffffffffff9f
-% 6060616162626263636eb7ffffffffffffffffffffffffffffffbb3377ffffffffffffffffffff90
-% 757575767677787879797a7a7b7c7d7e7e7f80818181828384858586878888898a8a8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8baaffffffffffffffffffffffffffe2e2e2e2e2e2e2e2e2ffffffff
-% ffffffff9900000000000000000000000000000000000000
-% 00000000000000000000000000000000000000bbffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffff8c6161605f5f5f5e5e5e5d5d5c5c5b5b5a5a5a5a5a595959595858585757
-% 575756568ef4ffffffffffffffffffffffffffffee77000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000022ffffffffffffffffff22000000
-% 00000000000000000000000000000000000000000000000000000000ccffffffffffffffffffd560
-% 61616262626363646465658febffffffffffffffffffffffffffffffeeffffffffffffffffffbe75
-% 75757676777878797a7a7a7b7c7d7e7e7f80818181828384858586878888898a8a8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b93f0ffffffffffffffffffffffffe3e3e2e2e2e2e2e2e2ffffffffff
-% ffffffff2200000000000000000000000000000000000000
-% 0000000000000000000000000000000000000044ffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffea6c616160605f5f5f5e5e5e5d5d5c5c5b5b5a5a5a5a5a5a595959585858
-% 585757575761b0ffffffffffffffffffffffffffffffbb2200000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000ddffffffffffffffff77000000
-% 00000000000000000000000000000000000000000000000000000077fffffffffffffffffff57661
-% 62626262636464656565666667b8ffffffffffffffffffffffffffffffffffffffffffffffed7575
-% 757676777878797a7a7a7b7c7d7e7e7f80818181828384858586878888898a8a8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8bc9ffffffffffffffffffffffffffe3e3e2e2e2e2e2e2e2ffffffffff
-% ffffff990000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000bbffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffb66262616160605f5f5f5e5e5e5d5d5c5c5c5b5b5a5a5a5a5a59595959
-% 5858585857575784e9ffffffffffffffffffffffffffffff88000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000088ffffffffffffffffaa000000
-% 000000000000000000000000000000000000000000000000000022eeffffffffffffffffffb56262
-% 626263636465656566666767686887d7ffffffffffffffffffffffffffffffffffffffffff9a7575
-% 7676777879797a7a7a7c7c7d7e7e7f8081818182838485858687888889898a8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8ba2ffffffffffffffffffffffffffe3e3e3e3e2e2e2e2e2ffffffffffff
-% ffffff220000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000044ffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffff96626262616160605f5f5f5e5e5e5d5d5d5c5c5b5b5a5a5a5a5a5a59
-% 595959585858585757b1ffffffffffffffffffffffffffffffcc4400000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000044ffffffffffffffffff000000
-% 0000000000000000000000000000000000000000000000000000bbffffffffffffffffffe0626262
-% 6363646465656666666767686969696ab0f6ffffffffffffffffffffffffffffffffffffbf757576
-% 76777879797a7a7b7c7c7d7e7e7f8081818182838485858687888889898a8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b93f0ffffffffffffffffffffffffe3e3e3e3e3e3e2e2e2e2ffffffffffff
-% ffff99000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000099ffffffffffffffffffffffffffffffffffff
-% fffffffffffffffffffffffff56d62626262616160605f5f5f5e5e5e5d5d5d5c5c5c5b5b5a5a5a5a
-% 5a5a595959595958585879d3ffffffffffffffffffffffffffffff88110000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000eeffffffffffffffff550000
-% 0000000000000000000000000000000000000000000000000055ffffffffffffffffffff81626363
-% 64646565656666676768696969696a6a6b80cefffffffffffffffffffffffffffffffff67e757677
-% 777879797a7a7b7c7d7d7e7e7f8081818282838485858687888888898a8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8bc9ffffffffffffffffffffffffffe3e3e3e3e3e3e2e2e2ffffffffffffff
-% ffee11000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000011eeffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffcc646362626262616161605f5f5f5e5e5e5e5d5d5d5c5c5b5b5b5a
-% 5a5a5a5a5a59595959595858a6f4ffffffffffffffffffffffffffffdd5500000000000000000000
-% 00000000000000000000000000000000000000000000000000000000aaffffffffffffffff880000
-% 00000000000000000000000000000000000000000000000011eeffffffffffffffffffb663636464
-% 6565656666676768686969696a6a6b6c6c6d6d9ef6ffffffffffffffffffffffffffffa376767778
-% 7879797a7a7b7c7d7d7e7e7f8081818282838485858687888888898a8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8bb2ffffffffffffffffffffffffffe3e3e3e3e3e3e3e3e2e2ffffffffffffff
-% ff8800000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000088ffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffad6463636262626261616160605f5f5f5e5e5e5e5d5d5c5c5c5b
-% 5b5b5a5a5a5a5a5a5a595959596fc8ffffffffffffffffffffffffffffffaa110000000000000000
-% 0000000000000000000000000000000000000000000000000000000066ffffffffffffffffdd0000
-% 000000000000000000000000000000000000000000000000aaffffffffffffffffffeb6d64646565
-% 65666666676768696969696a6b6b6c6c6d6d6e6e79bcffffffffffffffffffffffffdb7676777878
-% 79797a7a7b7c7d7d7e7e7f8081818283838485858687888888898a8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b93f8ffffffffffffffffffffffffe3e3e3e3e3e3e3e3e3e2ffffffffffffffff
-% dd0000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000ddffffffffffffffffffffffffffffffff
-% fffffffffffffffffffffffffffff584646464636262626262616160605f5f5f5e5e5e5e5d5d5d5c
-% 5c5c5b5b5b5a5a5a5a5a5a5a5a595990f4ffffffffffffffffffffffffffffee7700000000000000
-% 0000000000000000000000000000000000000000000000000000000022ffffffffffffffffff2200
-% 000000000000000000000000000000000000000000000044ffffffffffffffffffff8d6465656566
-% 6666676768696969696a6a6b6c6c6d6d6d6e6e6f6f7097ecfffffffffffffffffff6887677787979
-% 7a7a7a7b7c7d7d7e7e7f8081818283838485858687888889898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8be0ffffffffffffffffffffffffffe3e3e3e3e3e3e3e3e3ffffffffffffffffff
-% 550000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000055ffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffe16f6564646463636262626261616160605f5f5f5e5e5e5e5d
-% 5d5d5c5c5c5c5b5b5b5a5a5a5a5a5a5a65bdffffffffffffffffffffffffffffffbb220000000000
-% 0000000000000000000000000000000000000000000000000000000000ccffffffffffffffff7700
-% 0000000000000000000000000000000000000000000011ddffffffffffffffffffcc656565666666
-% 676768686969696a6a6b6b6c6c6d6d6e6e6f6f7070717172bdffffffffffffffffb677777879797a
-% 7a7a7c7c7d7d7e7f7f8081818283848485858687888889898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8bc9ffffffffffffffffffffffffffe4e4e3e3e3e3e3e3e3e3ffffffffffffffffbb
-% 000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000bbffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffc265656564646463636262626261616160605f5f5f5f5e5e
-% 5e5e5d5d5d5d5c5c5c5b5b5b5b5a5a5a5a5a86e9ffffffffffffffffffffffffffffff8800000000
-% 000000000000000000000000000000000000000000000000000000000088ffffffffffffffffaa00
-% 0000000000000000000000000000000000000000000088fffffffffffffffffff56f656666666767
-% 68686969696a6a6b6b6c6c6d6d6d6e6e6f6f7071717272727390daffffffffffe477787879797a7a
-% 7b7c7c7d7e7e7f808081818283848485858687888889898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8baaffffffffffffffffffffffffffe4e4e4e3e3e3e3e3e3e3ffffffffffffffffff33
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000033ffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffae666565656564646363626262626261616160605f5f5f
-% 5f5e5e5e5e5e5d5d5d5c5c5c5c5c5b5b5b5a5a65b2ffffffffffffffffffffffffffffffcc440000
-% 000000000000000000000000000000000000000000000000000000000044ffffffffffffffffff00
-% 00000000000000000000000000000000000000000033ffffffffffffffffffffa366666667676868
-% 696969696a6a6b6c6c6d6d6d6e6e6f6f7071717172727373747475b6f6ffffff92787879797a7a7b
-% 7c7d7d7e7e7f8081818182838485858586878888898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b9bf8ffffffffffffffffffffffffe4e4e4e4e4e3e3e3e3e3e3ffffffffffffffff8800
-% 000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000088ffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffff90666666656565646464636362626262626161616060
-% 5f5f5f5f5e5e5e5e5e5d5d5d5d5d5c5c5c5c5b5b5b7cdfffffffffffffffffffffffffffffff8811
-% 000000000000000000000000000000000000000000000000000000000000eeffffffffffffffff55
-% 000000000000000000000000000000000000000000ccffffffffffffffffffd76666676768686969
-% 69696a6a6b6c6c6d6d6d6e6e6f6f707071717272727374747575757588d2ffc07879797a7a7a7b7c
-% 7d7d7e7e7f8081818182838485858586878888898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b93e8ffffffffffffffffffffffffffe4e4e4e4e4e3e3e3e3e3ffffffffffffffffdd1100
-% 000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000011ddffffffffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffff5716766666665656564646463636262626262626161
-% 6160605f5f5f5f5f5e5e5e5e5e5e5d5d5d5d5c5c5c5c5ca8f5ffffffffffffffffffffffffffffdd
-% 550000000000000000000000000000000000000000000000000000000000aaffffffffffffffff88
-% 000000000000000000000000000000000000000088fffffffffffffffffff57a6767686869696969
-% 6a6a6b6b6c6c6d6d6e6e6e6f6f7071717172727373747475757575767677a58179797a7a7b7c7c7d
-% 7d7e7e7f8081818282838485858686878888898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8bd1ffffffffffffffffffffffffffe4e4e4e4e4e4e4e3e3e3ffffffffffffffffff550000
-% 000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000044ffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffe16867676666666565656564646463636262626262
-% 626161616060605f5f5f5f5f5e5e5e5e5e5e5d5d5d5d5d5d72d4ffffffffffffffffffffffffffff
-% ffaa1100000000000000000000000000000000000000000000000000000066ffffffffffffffffdd
-% 0000000000000000000000000000000000000022eeffffffffffffffffffb8676868696969696a6a
-% 6b6b6c6c6d6d6d6e6e6f6f7070717172727273747475757575767677777879797a7a7a7b7c7d7d7e
-% 7e7f7f8081818283838485858686878888898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8bbaffffffffffffffffffffffffffe4e4e4e4e4e4e4e4e4e3e3ffffffffffffffffaa000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000088ffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffc368686767676666666565656564646463636262
-% 62626262616161616060605f5f5f5f5f5e5e5e5e5e5e5e5e5d5d93f5ffffffffffffffffffffffff
-% ffffee77000000000000000000000000000000000000000000000000000022ffffffffffffffffff
-% 22000000000000000000000000000000000000bbffffffffffffffffffe16869696969696a6a6b6b
-% 6c6c6d6d6d6e6e6f6f707071717172727373747475757575767677787879797a7a7a7b7c7d7d7e7e
-% 7f808181818283848485858687878888898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8baaffffffffffffffffffffffffffe4e4e4e4e4e4e4e4e4e4e3ffffffffffffffffee11000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000011eeffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffb9696868676767666666656565656464646463
-% 6362626262626262616161616060605f5f5f5f5f5f5f5e5e5e5e5e69bfffffffffffffffffffffff
-% ffffffffbb2200000000000000000000000000000000000000000000000000ccffffffffffffffff
-% 77000000000000000000000000000000000066ffffffffffffffffffff876969696a6a6a6b6b6c6c
-% 6d6d6d6e6e6f6f70707171717272727374747575757576767777787879797a7a7b7c7c7d7d7e7e7f
-% 808181818283848585858687888888898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8ba2f8ffffffffffffffffffffffffffe4e4e4e4e4e4e4e4e4e4ffffffffffffffffff6600000000
-% 000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000055ffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffa56969696868676767666666656565656564
-% 6464636363626262626262626161616160606060605f5f5f5f5f5f5f5f89eaffffffffffffffffff
-% ffffffffffff8800000000000000000000000000000000000000000000000088ffffffffffffffff
-% aa0000000000000000000000000000000011eeffffffffffffffffffb969696a6a6a6b6c6c6c6d6d
-% 6d6e6e6f6f6f707171717272727374747575757575767677787879797a7a7a7b7c7d7d7e7e7f7f80
-% 8181828283848585858687888888898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 93f8ffffffffffffffffffffffffffe4e4e4e4e4e4e4e4e4e4e4ffffffffffffffffbb0000000000
-% 000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000aaffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffff9269696969686868676767666666656565
-% 656564646463636362626262626262626261616161616060606060605f5f6ab5ffffffffffffffff
-% ffffffffffffffcc440000000000000000000000000000000000000000000044ffffffffffffffff
-% ff00000000000000000000000000000000aaffffffffffffffffffeb736a6a6b6b6c6c6c6d6d6d6e
-% 6e6f6f6f70717171727272737374747575757576767777787879797a7a7a7b7c7d7d7e7e7f808081
-% 81828383848585858687888889898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b93
-% e8ffffffffffffffffffffffffffe5e5e4e4e4e4e4e4e4e4e4ffffffffffffffffee220000000000
-% 000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000000011eeffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffff6886a6969696969686867676766666666
-% 656565656564646464636363636262626262626262626161616161616160606080e0ffffffffffff
-% ffffffffffffffffff8811000000000000000000000000000000000000000000eeffffffffffffff
-% ff55000000000000000000000000000044ffffffffffffffffffff926a6b6b6c6c6d6d6d6d6e6e6f
-% 6f6f70717171727272737374747575757576767677787879797a7a7a7b7c7d7d7d7e7e7f80818181
-% 8283848485858686878888898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bd9
-% ffffffffffffffffffffffffffe5e5e5e4e4e4e4e4e4e4e4ffffffffffffffffff66000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000044ffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffff6896a6a6a6969696969686867676767
-% 66666666656565656564646464646363636362626262626262626262626261616161abf5ffffffff
-% ffffffffffffffffffffdd550000000000000000000000000000000000000000aaffffffffffffff
-% ff880000000000000000000000000011ddffffffffffffffffffce6b6b6c6c6d6d6d6d6e6e6f6f6f
-% 7071717172727273737474757575757576767777787979797a7a7a7b7c7d7d7e7e7f808081818282
-% 83848585858687888888898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bd1ff
-% ffffffffffffffffffffffffe5e5e5e5e5e4e4e4e4e4e4e4ffffffffffffffffaa00000000000000
-% 000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000088ffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffff67f6b6b6a6a696969696969686868
-% 676767666666666665656565656564646464646363636363626262626262626262626277d5ffffff
-% ffffffffffffffffffffffffaa1100000000000000000000000000000000000066ffffffffffffff
-% ffdd0000000000000000000000000088fffffffffffffffffff6766c6c6d6d6d6e6e6e6f6f6f7071
-% 717172727273737474757575757576767777787879797a7a7a7b7c7d7d7d7e7e7f80818181828383
-% 848585858687888888898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bd1ffff
-% ffffffffffffffffffffffe5e5e5e5e5e5e5e4e4e4e4e4ffffffffffffffffdd1100000000000000
-% 000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000ccffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffe2766c6b6b6a6a6a696969696969
-% 6868686767676766666666666565656565656564646464646463636363636363626262626296f5ff
-% ffffffffffffffffffffffffffee77000000000000000000000000000000000022ffffffffffffff
-% ffff22000000000000000000000033ffffffffffffffffffffa76d6d6d6d6e6e6e6f6f7070717171
-% 72727272737474757575757576767677787879797a7a7a7b7b7c7d7d7e7e7f7f8081818182838484
-% 8585868687888889898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bd1ffffff
-% ffffffffffffffffffffffe5e5e5e5e5e5e5e4e4e4e4ffffffffffffffffff440000000000000000
-% 000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000000000000033eeffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffe2776c6c6c6b6b6a6a6a696969
-% 69696969686868676767676666666666666565656565656565646464646464646464646363636dc1
-% ffffffffffffffffffffffffffffffbb2200000000000000000000000000000000ccffffffffffff
-% ffff770000000000000000000000ccffffffffffffffffffd86d6d6e6e6e6e6f6f70707171717272
-% 727373747475757575757676767777787979797a7a7a7b7c7d7d7d7e7e7f80808181828283848585
-% 858687878888898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bc9ffffffff
-% ffffffffffffffffffffe5e5e5e5e5e5e5e5e5e4e4ffffffffffffffffff88000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000077ffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2776d6d6c6c6c6b6b6a6a6a
-% 6a696969696969696868686767676767666666666666666565656565656565656565656464646464
-% 8debffffffffffffffffffffffffffffff8800000000000000000000000000000088ffffffffffff
-% ffffbb0000000000000000000088fffffffffffffffffff6806e6e6e6f6f6f707071717172727273
-% 73747475757575757576767777787879797a7a7a7b7c7c7d7d7e7e7f7f8081818182838384858585
-% 8687888888898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bbaffffffffff
-% ffffffffffffffffffe5e5e5e5e5e5e5e5e5e5e4ffffffffffffffffffcc00000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000aaffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2776d6d6d6d6c6c6c6b6b
-% 6b6a6a6a696969696969696968686868676767676766666666666666666666656565656565656565
-% 656fb7ffffffffffffffffffffffffffffffcc330000000000000000000000000044ffffffffffff
-% ffffff11000000000000000022eeffffffffffffffffffbc6e6f6f6f707071717171727272737374
-% 7475757575757576767777787879797a7a7a7b7b7c7d7d7e7e7e7f80808181828283848485858686
-% 87888888898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bbaffffffffffff
-% ffffffffffffffffe5e5e5e5e5e5e5e5e5e5e5e5ffffffffffffffffee3300000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000000011ccffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2786e6d6d6d6d6d6c6c
-% 6c6b6b6b6a6a6a6a6969696969696969696868686867676767676767676666666666666666666666
-% 66666685e1ffffffffffffffffffffffffffffff8811000000000000000000000000eeffffffffff
-% ffffff550000000000000000bbffffffffffffffffffe26f6f6f7070717171727272727373747475
-% 75757575757676777778787979797a7a7a7b7c7d7d7d7e7e7f808081818182838384858585868787
-% 888889898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bd1ffffffffffffff
-% ffffffffffffffe6e5e5e5e5e5e5e5e5e5e5e5ffffffffffffffffff550000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000000000000000000033eeffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3796e6e6e6e6d6d6d
-% 6d6c6c6c6c6b6b6b6a6a6a6a6a696969696969696969696868686868686767676767676767676767
-% 6767676767aef5ffffffffffffffffffffffffffffdd44000000000000000000000099ffffffffff
-% ffffff990000000000000066ffffffffffffffffffff8c7070717171717272727273737474757575
-% 7575757676777778787979797a7a7a7b7c7c7d7d7e7e7f7f80818181828283848485858686878888
-% 88898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bd1ffffffffffffffff
-% ffffffffffffe6e6e6e5e5e5e5e5e5e5e5e5ffffffffffffffffff88000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000055ffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff68c6f6f6e6e6e6e
-% 6d6d6d6d6d6c6c6c6c6b6b6b6b6a6a6a6a6a69696969696969696969696969686868686868686868
-% 6868686868687cd7ffffffffffffffffffffffffffffffaa1100000000000000000066ffffffffff
-% ffffffdd00000000000011eeffffffffffffffffffbd717171717272727273737474747575757575
-% 767676777778787979797a7a7a7b7c7c7d7d7e7e7e7f808081818182838384858585868787888889
-% 898a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bd1ffffffffffffffffff
-% ffffffffffe6e6e6e6e6e5e5e5e5e5e5e5ffffffffffffffffffbb00000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000000000000088ffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff68d706f6f6f6e
-% 6e6e6e6d6d6d6d6d6d6c6c6c6c6c6b6b6b6b6a6a6a6a6a6a69696969696969696969696969696969
-% 69696969696969699bf5ffffffffffffffffffffffffffffee66000000000000000011ffffffffff
-% ffffffff330000000000aaffffffffffffffffffec7a717172727272737374747575757575757676
-% 76777778787979797a7a7a7b7b7c7d7d7d7e7e7f7f8081818182828384848585868687888888898a
-% 8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bd1ffffffffffffffffffff
-% ffffffffe6e6e6e6e6e6e5e5e5e5e5e5ffffffffffffffffffdd1100000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000000000000000bbff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6977070706f
-% 6f6f6f6e6e6e6e6d6d6d6d6d6d6d6c6c6c6c6c6b6b6b6b6b6b6a6a6a6a6a6a6a6a6a696969696969
-% 69696969696969696973c3ffffffffffffffffffffffffffffffbb2200000000000000ccffffffff
-% ffffffff770000000044ffffffffffffffffffff9772727272737374747475757575757576767677
-% 7778787979797a7a7a7b7b7c7d7d7d7e7e7f7f808181818282838484858585868787888888898a8a
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b93e8ffffffffffffffffffffff
-% ffffffe6e6e6e6e6e6e6e6e5e5e5e5e5ffffffffffffffffee330000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000000000000000000000000011dd
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa717171
-% 7070706f6f6f6f6e6e6e6e6e6d6d6d6d6d6d6d6c6c6c6c6c6c6c6b6b6b6b6b6b6b6b6a6a6a6a6a6a
-% 6a6a6a6a6a6a6a6a6a6a6a92ecffffffffffffffffffffffffffffee8800000000000088ffffffff
-% ffffffffbb00000011ddffffffffffffffffffd07272737374747475757575757575767676777778
-% 787979797a7a7a7b7b7c7d7d7d7e7e7f7f808081818182838384858585868687888888898a8a8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b9be8ffffffffffffffffffffffff
-% ffffe6e6e6e6e6e6e6e6e6e5e5e5e5ffffffffffffffffff66000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000033
-% eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbd7171
-% 717171707070706f6f6f6f6e6e6e6e6e6e6d6d6d6d6d6d6d6d6d6c6c6c6c6c6c6c6c6c6c6c6c6b6b
-% 6b6b6b6b6b6b6b6b6b6b6b6b75baffffffffffffffffffffffffffffffcc330000000033ffffffff
-% ffffffffff11000088fffffffffffffffffff67c7374747475757575757575767676777778787879
-% 79797a7a7a7b7b7c7d7d7d7e7e7e7f80808181818282838484858585868787888889898a8a8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8ba2f8ffffffffffffffffffffffffff
-% ffe6e6e6e6e6e6e6e6e6e6e6e5e5ffffffffffffffffff8800000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 33ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc772
-% 72727171717171707070706f6f6f6f6f6e6e6e6e6e6e6e6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6c6c
-% 6c6c6c6c6c6c6c6c6c6c6c6c6c6c8ae2ffffffffffffffffffffffffffffff8811000000eeffffff
-% ffffffffff550033ffffffffffffffffffffac74747475757575757575767676777778787979797a
-% 7a7a7a7b7b7c7d7d7d7e7e7e7f80808181818282838484858585868687888888898a8a8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bbaf8ffffffffffffffffffffffffffff
-% e6e6e6e6e6e6e6e6e6e6e6e6e6ffffffffffffffffff990000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0066ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3
-% 7b7272727272717171717171707070706f6f6f6f6f6f6e6e6e6e6e6e6e6e6e6e6e6d6d6d6d6d6d6d
-% 6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6db1f6ffffffffffffffffffffffffffffdd44000099ffffff
-% ffffffffff9900ccffffffffffffffffffda757575757575757576767677777878787979797a7a7a
-% 7a7b7c7c7d7d7d7e7e7e7f8080818181828283838485858586868788888889898a8a8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bc1ffffffffffffffffffffffffffffffe7
-% e7e6e6e6e6e6e6e6e6e6e6e6ffffffffffffffffffcc000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000088ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% f68f73737272727272727171717171717170707070706f6f6f6f6f6f6f6f6f6e6e6e6e6e6e6e6e6e
-% 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e81d9ffffffffffffffffffffffffffffffaa1166ffffff
-% ffffffffffdd88fffffffffffffffffff68775757575757676767777777878797979797a7a7a7a7b
-% 7c7c7d7d7d7e7e7e7f8080818181818283838485858585868787888888898a8a8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b93d9ffffffffffffffffffffffffffffffe7e7
-% e7e7e6e6e6e6e6e6e6e6e6ffffffffffffffffffcc11000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000099ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffb5747473737372727272727272717171717171717171707070707070706f6f6f6f6f6f6f6f6f
-% 6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f9ff6ffffffffffffffffffffffffffffee70ffffff
-% fffffffffffff2ffffffffffffffffffbf7575757676767677777878787979797a7a7a7a7b7b7c7c
-% 7d7d7d7e7e7f7f808081818181828383848485858586878788888889898a8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8ba2e8ffffffffffffffffffffffffffffffe7e7e7
-% e7e7e6e6e6e6e6e6e6e6ffffffffffffffffffee3300000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffc87e7474747473737373727272727272727271717171717171717171717170707070707070
-% 70707070707070707070707070707070707070717ac6fffffffffffffffffffffffffffffff2ffff
-% ffffffffffffffffffffffffffffffe475767676767777787878797979797a7a7a7a7b7c7c7d7d7d
-% 7e7e7e7f7f808081818181828383848485858586868788888889898a8a8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bb2f8ffffffffffffffffffffffffffffffe7e7e7e7
-% e7e7e7e6e6e6e6e6e6ffffffffffffffffffee330000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000011ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffe48775757574747474747373737373727272727272727272727171717171717171717171
-% 7171717171717171717171717171717171717171717197edffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffff9176777777787878797979797a7a7a7a7b7b7c7c7d7d7d7e7e
-% 7e7f7f808081818181828383848485858586868788888888898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bc9ffffffffffffffffffffffffffffffe7e7e7e7e7e7
-% e7e7e7e6e6e6e6e6ffffffffffffffffffff66000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000011ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% fffffffffff6b6757575757575757474747474747373737373737272727272727272727272727272
-% 72727272727272727272727272727272727272727272727bbdffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffc07777787878797979797a7a7a7a7a7b7c7c7c7d7d7d7e7e7e7f
-% 7f808081818182828383848485858586868787888888898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8ba2e8ffffffffffffffffffffffffffffffe7e7e7e7e7e7e7
-% e7e7e7e7e6e6e6ffffffffffffffffffff6600000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000011ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffd17e75757575757575757575757474747474747474737373737373737373737272
-% 7272727272727272727272727272727373737373737373737390e4ffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffed817878797979797a7a7a7a7a7b7b7c7c7d7d7d7e7e7e7f7f8080
-% 818181818282838384848585858686878788888889898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bc1f8ffffffffffffffffffffffffffffffe7e7e7e7e7e7e7e7
-% e7e7e7e7e7e6ffffffffffffffffffff660000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000011ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% fffffffffffffffff69b767675757575757575757575757575757575747474747474747474747474
-% 747474747474747474747474747474747474747474747474747575bff6ffffffffffffffffffffff
-% ffffffffffffffffffffffffff9d797979797a7a7a7a7a7b7b7c7c7d7d7d7d7e7e7e7f7f80808181
-% 81818282838384848585858686878788888889898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b93d9ffffffffffffffffffffffffffffffffe8e8e7e7e7e7e7e7e7
-% e7e7e7e7e7ffffffffffffffffffff66000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000033eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffc07f76767676767675757575757575757575757575757575757575757575
-% 7575757575757575757575757575757575757575757575757575757587dbffffffffffffffffffff
-% ffffffffffffffffffffffffd3797a7a7a7a7a7a7b7b7c7c7d7d7d7d7e7e7e7f7f80808081818181
-% 8282838384848585858686878788888889898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8baaf8ffffffffffffffffffffffffffffffffe8e8e8e8e7e7e7e7e7e7
-% e7e7e7e7ffffffffffffffffffff6600000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000033eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffed9b777777777676767676767676757575757575757575757575757575
-% 757575757575757575757575757575757575757575757575757575757676adf6ffffffffffffffff
-% fffffffffffffffffffffff7837a7a7a7b7b7c7c7c7d7d7d7d7e7e7e7f7f7f808081818181828283
-% 838484858585858686878788888889898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b93d9ffffffffffffffffffffffffffffffffe8e8e8e8e8e8e7e7e7e7e7e7
-% e7e7e7ffffffffffffffffffff880000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000033eeffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffc98178787877777777777676767676767676767676767675757575
-% 7575757575757575757575757575757575767676767676767676767676777780d2ffffffffffffff
-% ffffffffffffffffffffffaf7a7b7b7c7c7c7d7d7d7d7e7e7e7e7f7f808081818181818282838384
-% 84858585858686878788888889898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8bb2f8ffffffffffffffffffffffffffffffffe8e8e8e8e8e8e8e8e7e7e7e7e7
-% e7e7ffffffffffffffffffff77000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000033ccffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% fffffffffffffffffffffffffffff7a6797978787878787878777777777777777776767676767676
-% 7676767676767676767676767676767676767677777777777777777878787878789cedffffffffff
-% ffffffffffffffffffffdc7c7c7c7d7d7d7d7e7e7e7e7f7f7f808081818181818282838384848485
-% 8585858686878888888889898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b9be0ffffffffffffffffffffffffffffffffffe8e8e8e8e8e8e8e8e8e7e7e7e7e7
-% e7ffffffffffffffffffff6600000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000011ccffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffd38b79797979797979787878787878787878787878777777
-% 7777777777777777777777777777777778787878787878787878787979797979797982c1ffffffff
-% fffffffffffffffffff78e7d7d7d7d7e7e7e7e7f7f7f808081818181818282828383848485858585
-% 868687878888888889898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8bc9f8ffffffffffffffffffffffffffffffffe9e9e8e8e8e8e8e8e8e8e8e8e7e7e7e7
-% ffffffffffffffffffff660000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000011ccffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffc1837a7a7a7a79797979797979797979797979787878
-% 78787878787878787878787878787878797979797979797979797979797a7a7a7a7a7a7a95e5ffff
-% fffffffff2ffffffffc37d7e7e7e7e7e7f7f7f808081818181818282828383848485858585858686
-% 87878888888889898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8bb2f0ffffffffffffffffffffffffffffffffffe9e9e9e9e8e8e8e8e8e8e8e8e8e8e7e7ff
-% ffffffffffffffffff66000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000011ccffffffffffffffffffffffffffffffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffff7af7a7a7a7a7a7a7a7a7a7a7a7a7a797979797979
-% 7979797979797979797979797979797979797a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7b7b7b7b7cc2f7
-% ffffffffffffffffe67e7e7e7f7f7f80808081818181818282828383848484858585858686878788
-% 88888888898a8a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b9be0ffffffffffffffffffffffffffffffffffe9e9e9e9e9e9e8e8e8e8e8e8e8e8e8e8ffffff
-% ffffffffffffffff6600000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000011ccffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffe59e7b7b7b7b7a7a7a7a7a7a7a7a7a7a7a7a7a
-% 7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7b7b7b7b7b7c7c7c7c7c7d7d7d7d8e
-% ddffffffffffffff997f7f8080808181818181818282828383848484858585858586868787888888
-% 8889898a8a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 93c9ffffffffffffffffffffffffffffffffffffe9e9e9e9e9e9e9e9e8e8e8e8e8e8e8e8ffffffff
-% ffffffffffffee550000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000099ffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffdd9f7c7c7c7c7c7c7c7b7b7b7b7b7b7b7b
-% 7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7c7c7c7c7c7c7c7d7d7d7d7d7d7d7d7d7e7e7e
-% 7eb2f7ffffffffc48080818181818181818282838383848484858585858586868787888888888889
-% 898a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b93c9
-% f8ffffffffffffffffffffffffffffffffffffe9e9e9e9e9e9e9e9e9e9e8e8e8e8e8e8ffffffffff
-% ffffffffffee33000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000088ffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffdd8e7d7d7d7d7d7d7d7d7c7c7c7c7c
-% 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d7d7d7d7d7d7d7d7d7d7d7d7d7e7e7e7e7e7e7e7e7f7f
-% 7f7f88d5ffffef898181818181828282838383848484858585858586868787878888888889898a8a
-% 8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b93c9f8ff
-% ffffffffffffffffffffffffffffffffffeaeae9e9e9e9e9e9e9e9e9e9e8e8e8e8e8ffffffffffff
-% ffffffffcc2200000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000066ffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffcc8f7e7e7e7e7d7d7d7d7d7d7d
-% 7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7e7e7e7e7e7e7e7e7e7e7e7f7f7f7f7f80808080
-% 80818181a3efa381818282828383838484848585858585858686878787888888888989898a8a8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b93c9f8ffffff
-% ffffffffffffffffffffffffffffffeaeaeaeaeae9e9e9e9e9e9e9e9e9e9e8e8e8ffffffffffffff
-% ffffffbb110000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000033eeffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5a17e7e7e7e7e7e7e7e7e
-% 7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7f7f7f7f7f7f7f7f80808080808181818181
-% 8181818182828282838383848484858585858585868686878787888888888889898a8a8a8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b93c9f8ffffffffff
-% ffffffffffffffffffffffffffffeaeaeaeaeaeaeae9e9e9e9e9e9e9e9e9e8ffffffffffffffffff
-% ffff9900000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000033ddffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffddb37f7f7f7f7f7f7f
-% 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f808080808080808080818181818181818181818182
-% 8282828383838384848485858585858585868686878788888888888889898a8a8a8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b9bd1ffffffffffffffff
-% ffffffffffffffffffffffffeaeaeaeaeaeaeaeaeae9e9e9e9e9e9e9e9e9ffffffffffffffffffff
-% ff880000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000011bbffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefb48981808080
-% 80808080808080808080808080808080818181818181818181818181818181818282828282838383
-% 8383848484848585858585858586868687878788888888888989898a8a8a8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8baad9ffffffffffffffffffff
-% ffffffffffffffffffffebeaeaeaeaeaeaeaeaeaeaeae9e9e9e9e9e9ffffffffffffffffffffffee
-% 55000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000088ffffffffffffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7cd9a8181
-% 81818181818181818181818181818181818181818181818182828282828282838383838384848484
-% 8485858585858585858686868787878888888888888989898a8a8a8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b93c1e8ffffffffffffffffffffffff
-% ffffffffffffffffffebebebeaeaeaeaeaeaeaeaeaeae9e9e9e9e9ffffffffffffffffffffffcc33
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000055eeffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6b4
-% 8a828282828282828282828282828282828282828283838383838383838484848484848585858585
-% 85858585868686868787878888888888888889898a8a8a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8baad1ffffffffffffffffffffffffffffff
-% ffffffffffffffebebebebebeaeaeaeaeaeaeaeaeaeaeae9e9e9ffffffffffffffffffffffaa1100
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000033ccffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% f7cead83838383838383838383838383838384848484848484848485858585858585858585858686
-% 86868687878787888888888888888989898a8a8a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b9bc1f0ffffffffffffffffffffffffffffffffff
-% ffffffffffebebebebebebebebeaeaeaeaeaeaeaeaeaeaeaffffffffffffffffffffffff77000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000011aaffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% fffffff7c69d84848484848484848585858585858585858585858585858585858686868686878787
-% 878788888888888888888989898a8a8a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b9bc1e8ffffffffffffffffffffffffffffffffffffffff
-% ffffffebebebebebebebebebebeaeaeaeaeaeaeaeaeaeaffffffffffffffffffffffee4400000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000000077eeffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffefc69e85858585858585858585858585858686868686868687878787878788888888
-% 8888888888898989898a8a8a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b9bc1e8ffffffffffffffffffffffffffffffffffffffffffffff
-% ffecebebebebebebebebebebebebeaeaeaeaeaeaeaffffffffffffffffffffffffbb110000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000033ccffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% fffffffffffffffffff7cfb78e868686868686868787878787878787888888888888888888888889
-% 898989898a8a8a8a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8baac9e8ffffffffffffffffffffffffffffffffffffffffffffffffffec
-% ecececebebebebebebebebebebebebeaeaeaeaeaffffffffffffffffffffffff7700000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000000000000088ffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffe7c7a7888888888888888888888888888888888889898989898a8a
-% 8a8a8a8a8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b9bbad9f8ffffffffffffffffffffffffffffffffffffffffffffffffffffececec
-% ecececebebebebebebebebebebebebeaeaeaffffffffffffffffffffffffcc330000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000044eeffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffe0c8b090888888898989898989898a8a8a8a8a8a8a8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b
-% 8b8b8baac1d9f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffececececec
-% ececececebebebebebebebebebebebebffffffffffffffffffffffffff8811000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000000011aaffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffe8d1c1a9928a8a8a8a8a8b8b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8ba2ba
-% c9e0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffececececececec
-% ecececececebebebebebebebebebebffffffffffffffffffffffffee550000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000055eeffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffff8e0c9baaa938b8b8b8b8b8b8b8b
-% 8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8baaaac9d9e8ffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffededededecececececec
-% ecececececebebebebebebebebffffffffffffffffffffffffff9911000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000000000000000000000001188ff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8e0c9c9baaaaa
-% a28b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b93aaaaaac9c9d9e0ffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffededededededecececececec
-% ececececececebebebebebffffffffffffffffffffffffffdd440000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000044
-% ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffe0e0e0e0e0e0e0e0e0e0e0e0e0e0e0f0ffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffededededededededededececececec
-% ececececececebebebffffffffffffffffffffffffffff8811000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 1188ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffeeeeedededededededededededececececec
-% ecececececececffffffffffffffffffffffffffffcc330000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000033bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffeeeeeeeeeeededededededededededededecececec
-% ecececececffffffffffffffffffffffffffffee8800000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000055ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffeeeeeeeeeeeeeeeeeeedededededededededededecececec
-% ecececffffffffffffffffffffffffffffff99110000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000001188eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffefeeeeeeeeeeeeeeeeeeeeeeeeedededededededededededececec
-% ecffffffffffffffffffffffffffffffbb3300000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000002299ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffefefefefefeeeeeeeeeeeeeeeeeeeeeeeeededededededededededededecff
-% ffffffffffffffffffffffffffffdd55000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000044bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffefefefefefefefefefefeeeeeeeeeeeeeeeeeeeeeeeeededededededededededffffff
-% ffffffffffffffffffffffffee881100000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000044bbffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% f0f0f0f0efefefefefefefefefefefefeeeeeeeeeeeeeeeeeeeeeeedededededededffffffffffff
-% ffffffffffffffffffffee8811000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000044bbffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f0f0
-% f0f0f0f0f0efefefefefefefefefefefeeeeeeeeeeeeeeeeeeeeeeeeedededffffffffffffffffff
-% ffffffffffffffffee88110000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000044ddffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f1f1f1f1f0f0f0f0
-% f0f0f0f0f0f0efefefefefefefefefefefeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffff
-% ffffffffffffff881100000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000055bbffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffff2f2f2f1f1f1f1f1f1f1f1f1f1f1f1f0f0f0f0
-% f0f0f0f0f0f0efefefefefefefefefefefeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffffff
-% ffffffffee8822000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000004499ffffffffffffffffffffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4f4f4f4f4f4f4f4f4f4f4
-% f3f3f3f3f3f3f3f3f3f3f3f3f3f2f2f2f2f2f2f2f2f2f2f2f2f1f1f1f1f1f1f1f1f1f1f1f1f0f0f0
-% f0f0f0f0f0f0f0efefefefefefefefefefefeeeeeeeeeeffffffffffffffffffffffffffffffffff
-% ffffdd77110000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000002299eeffffffffffffffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffffffff4f4f4f4f4f4f4f4f4f4f4f4
-% f4f3f3f3f3f3f3f3f3f3f3f3f3f2f2f2f2f2f2f2f2f2f2f2f2f1f1f1f1f1f1f1f1f1f1f1f1f1f0f0
-% f0f0f0f0f0f0f0efefefefefefefefefefefefffffffffffffffffffffffffffffffffffffffffff
-% cc660000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000001188ddffffffffffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffffff4f4f4f4f4f4f4f4f4f4f4f4f4
-% f4f4f3f3f3f3f3f3f3f3f3f3f3f3f2f2f2f2f2f2f2f2f2f2f2f2f1f1f1f1f1f1f1f1f1f1f1f1f0f0
-% f0f0f0f0f0f0f0f0efefefefefefefffffffffffffffffffffffffffffffffffffffffffffffaa44
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000055aaffffffffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffffff4f4f4f4f4f4f4f4f4f4f4f4f4
-% f4f4f3f3f3f3f3f3f3f3f3f3f3f3f2f2f2f2f2f2f2f2f2f2f2f2f2f1f1f1f1f1f1f1f1f1f1f1f1f0
-% f0f0f0f0f0f0f0f0f0efefefffffffffffffffffffffffffffffffffffffffffffffffdd88220000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000002277ddffffffffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffff4f4f4f4f4f4f4f4f4f4f4f4f4f4
-% f4f4f4f3f3f3f3f3f3f3f3f3f3f3f3f2f2f2f2f2f2f2f2f2f2f2f2f1f1f1f1f1f1f1f1f1f1f1f1f0
-% f0f0f0f0f0f0f0ffffffffffffffffffffffffffffffffffffffffffffffffffff99550000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000000000004499eeffffffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffff4f4f4f4f4f4f4f4f4f4f4f4f4f4
-% f4f4f4f3f3f3f3f3f3f3f3f3f3f3f3f3f2f2f2f2f2f2f2f2f2f2f2f2f1f1f1f1f1f1f1f1f1f1f1f1
-% f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd771100000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000001166aaffffffff
-% fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4f4f4f4f4f4f4
-% f4f4f4f4f3f3f3f3f3f3f3f3f3f3f3f3f2f2f2f2f2f2f2f2f2f2f2f2f1f1f1f1f1f1f1ffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffdd883300000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000000000000000000000000001166aaff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffdd883300000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000011
-% 66aaeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffcc883300000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000004488ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffeeaa662200000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000116699ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffcc88440000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000226688ccffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffeebb8844000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000114488bbeeffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-% ffffffffffcc99773300000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000011448899bbffffffffffffffffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee
-% bb886633000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000000000000000000000000000000000000000033447788aabbffffffffffffffffff
-% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffddbb998866441100
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000000000000000000000444466888888bb
-% bbbbffffffffffffffffffffffffffffffffffffffddbbbbaa888888444422000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 00000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000000000000
-%%EndImage
-%%EndPreview
-save countdictstack mark newpath /showpage {} def /setpagedevice {pop} def
-%%EndProlog
-%%Page: 1 1
-%%BeginDocument: output.ps
-/B {load def} bind def
-/n /newpath B /m /moveto B /l /lineto B /c /curveto B /h /closepath B
-/q /gsave B /Q /grestore B
-/J /setlinecap B /j /setlinejoin B /w /setlinewidth B /M /setmiterlimit B
-/d /setdash B
-/rg /setrgbcolor B
-/W /clip B /W* /eoclip B
-/f /fill B /f* /eofill B
-/S /stroke B
-/cm /concat B
-/SP /showpage B
-/FF /findfont B /F {scalefont setfont} bind def
-<<
-/PageSize [595 841]
-/ImagingBBox null
->> setpagedevice
-n
-0 0 m
-595.276 0 l
-595.276 841.89 l
-0 841.89 l
-0 0 l
-h
-W
-q
-q
-n
-12.3 171.2 m
-12.3 83.2 83.7 11.8 171.7 11.8 c
-259.7 11.8 331.1 83.1 331.1 171.2 c
-331.1 259.2 259.7 330.5 171.7 330.5 c
-83.7 330.5 12.3 259.2 12.3 171.2 c
-12.3 171.2 l
-h
-W*
-q
-q
-n
-12 75 m
-76 75 l
-76 11 l
-12 11 l
-12 75 l
-h
-W
-q
-q
-[64 0 0 64 12 11]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-c06f11c17011c17111c17211c27211c27311c37411c37511c47511c47611c57711c57811c67912c6
-7912c67a12c77a12c77b12c77c12c87c12c87d12c97d12c97e12c97e12ca7f12ca8012ca8012cb80
-12cb8012cc8112cc8112cc8212cd8312cd8312cd8412ce8412ce8512ce8513ce8613cf8613cf8713
-cf8713d08813d08813d08913d18913d18a13d18a13d28b13d28b13d28b13d28c13d38c13d38d13d3
-8d13d48e13d48e13d48f13d48f13d58f13d59013d59013d59113d69113d69113
-
-c06e11c06f11c07011c17111c17111c27211c27311c37411c37411c47511c47611c47711c57711c5
-7811c67912c67912c67a12c77a12c77b12c87c12c87c12c87d12c97e12c97e12c97f12ca7f12ca80
-12cb8012cb8012cb8112cc8112cc8212cc8212cd8312cd8312cd8412ce8412ce8512ce8513ce8613
-cf8613cf8713cf8713d08813d08813d08913d18913d18a13d18a13d28b13d28b13d28b13d28c13d3
-8c13d38d13d38d13d38d13d48e13d48e13d48f13d48f13d58f13d59013d59013
-
-bf6d10bf6e11c06f11c07011c17011c17111c27211c27311c37311c37411c37511c47511c47611c5
-7711c57811c67912c67912c67a12c77a12c77b12c77b12c87c12c87c12c87d12c97e12c97e12ca7f
-12ca7f12ca8012cb8012cb8012cb8112cc8112cc8212cc8212cd8312cd8312cd8412ce8412ce8512
-ce8513ce8613cf8613cf8713cf8713d08813d08813d08913d18913d18913d18a13d18a13d28b13d2
-8b13d28c13d28c13d38c13d38d13d38d13d48e13d48e13d48e13d48f13d48f13
-
-be6c10bf6d10bf6e11c06f11c06f11c17011c17111c17211c27211c27311c37411c37411c47511c4
-7611c47611c57711c57811c67912c67912c67a12c77a12c77b12c77c12c87c12c87d12c97d12c97e
-12c97e12ca7f12ca8012ca8012cb8012cb8012cb8112cc8112cc8212cc8212cd8312cd8312cd8412
-ce8412ce8512ce8513ce8613cf8613cf8713cf8713d08713d08813d08813d08913d18913d18a13d1
-8a13d28b13d28b13d28b13d28c13d38c13d38d13d38d13d38d13d48e13d48e13
-
-be6b10be6c10bf6d10bf6e11c06e11c06f11c07011c17011c17111c27211c27311c37311c37411c3
-7511c47511c47611c57711c57711c57811c67912c67912c67a12c77b12c77b12c87c12c87c12c87d
-12c97d12c97e12c97e12ca7f12ca8012ca8012cb8012cb8012cb8112cc8112cc8212cc8212cd8312
-cd8312cd8412ce8412ce8512ce8512ce8513cf8613cf8713cf8713d08713d08813d08813d08913d1
-8913d18913d18a13d18a13d28b13d28b13d28b13d28c13d38c13d38d13d38d13
-
-bd6a10bd6b10be6c10be6c10bf6d10bf6e11c06f11c06f11c17011c17111c17211c27211c27311c3
-7411c37411c47511c47611c47611c57711c57811c67912c67912c67a12c77a12c77b12c77b12c87c
-12c87c12c87d12c97e12c97e12c97f12ca7f12ca8012ca8012cb8012cb8012cb8112cc8112cc8212
-cc8212cd8312cd8312cd8412ce8412ce8512ce8512ce8513cf8613cf8613cf8713cf8713d08813d0
-8813d08813d08913d18913d18a13d18a13d18a13d28b13d28b13d28b13d28c13
-
-bc6910bd6a10bd6b10be6b10be6c10bf6d10bf6e11c06e11c06f11c07011c17011c17111c27211c2
-7311c27311c37411c37511c47511c47611c47711c57711c57811c67912c67912c67a12c77a12c77b
-12c77b12c87c12c87c12c87d12c97e12c97e12c97f12ca7f12ca8012ca8012cb8012cb8012cb8112
-cc8112cc8212cc8212cd8312cd8312cd8312cd8412ce8412ce8512ce8513ce8613cf8613cf8713cf
-8713cf8713d08813d08813d08913d18913d18913d18a13d18a13d18a13d28b13
-
-bc6810bc6910bd6a10bd6a10be6b10be6c10be6d10bf6d10bf6e11c06f11c06f11c17011c17111c1
-7111c27211c27311c37411c37411c37511c47611c47611c57711c57711c57811c67912c67912c67a
-12c77a12c77b12c77c12c87c12c87d12c87d12c97e12c97e12c97f12ca7f12ca8012ca8012cb8012
-cb8012cb8112cc8112cc8112cc8212cc8212cd8312cd8312cd8412ce8412ce8512ce8512ce8513cf
-8613cf8613cf8713cf8713d08713d08813d08813d08913d18913d18913d18a13
-
-bb6710bc6810bc6910bd6910bd6a10bd6b10be6b10be6c10bf6d10bf6e11c06e11c06f11c07011c1
-7011c17111c27211c27211c27311c37411c37411c47511c47611c47611c57711c57811c57811c679
-12c67912c67a12c77a12c77b12c77c12c87c12c87d12c87d12c97e12c97e12c97f12ca7f12ca8012
-ca8012cb8012cb8012cb8112cc8112cc8112cc8212cc8212cd8312cd8312cd8312cd8412ce8412ce
-8512ce8513ce8613cf8613cf8613cf8713cf8713d08713d08813d08813d08913
-
-bb6610bb6710bb6810bc6810bc6910bd6a10bd6a10be6b10be6c10be6d10bf6d10bf6e11c06f11c0
-6f11c07011c17111c17111c27211c27311c37311c37411c37511c47511c47611c47611c57711c578
-11c67912c67912c67a12c67a12c77a12c77b12c77c12c87c12c87d12c87d12c97e12c97e12c97e12
-ca7f12ca8012ca8012cb8012cb8012cb8012cb8112cc8112cc8212cc8212cd8312cd8312cd8312cd
-8412ce8412ce8512ce8512ce8513ce8613cf8613cf8613cf8713cf8713d08713
-
-ba6510ba6610bb6610bb6710bc6810bc6910bd6910bd6a10bd6b10be6b10be6c10bf6d10bf6e11bf
-6e11c06f11c07011c17011c17111c17211c27211c27311c37311c37411c37511c47511c47611c477
-11c57711c57811c67912c67912c67a12c67a12c77a12c77b12c77c12c87c12c87c12c87d12c97e12
-c97e12c97e12ca7f12ca7f12ca8012ca8012cb8012cb8012cb8112cc8112cc8112cc8212cc8212cd
-8312cd8312cd8312cd8412ce8412ce8512ce8512ce8513ce8613cf8613cf8613
-
-b96410ba6510ba6510bb6610bb6710bb6810bc6810bc6910bd6a10bd6a10be6b10be6c10be6c10bf
-6d10bf6e11c06e11c06f11c07011c17011c17111c17211c27211c27311c37411c37411c37511c475
-11c47611c47711c57711c57811c67912c67912c67a12c67a12c77a12c77b12c77c12c87c12c87c12
-c87d12c97d12c97e12c97e12ca7f12ca7f12ca8012ca8012cb8012cb8012cb8012cb8112cc8112cc
-8212cc8212cc8212cd8312cd8312cd8312cd8412ce8412ce8512ce8512ce8513
-
-b96310b96410ba6410ba6510ba6610bb6710bb6710bc6810bc6910bd6910bd6a10bd6b10be6b10be
-6c10be6d10bf6d10bf6e11c06f11c06f11c07011c17111c17111c27211c27311c27311c37411c374
-11c37511c47611c47611c47711c57711c57811c67912c67912c67a12c67a12c77a12c77b12c77b12
-c87c12c87c12c87d12c97d12c97e12c97e12c97f12ca7f12ca8012ca8012ca8012cb8012cb8012cb
-8112cc8112cc8112cc8212cc8212cc8212cd8312cd8312cd8312cd8412ce8412
-
-b96310b96310b96310b96410ba6510ba6510bb6610bb6710bb6810bc6810bc6910bd6a10bd6a10bd
-6b10be6c10be6c10bf6d10bf6e11bf6e11c06f11c07011c17011c17111c17111c27211c27311c273
-11c37411c37411c37511c47611c47611c47711c57711c57811c67912c67912c67a12c67a12c77a12
-c77b12c77b12c87c12c87c12c87d12c87d12c97e12c97e12c97e12ca7f12ca7f12ca8012ca8012cb
-8012cb8012cb8012cb8112cc8112cc8112cc8212cc8212cc8212cd8312cd8312
-
-b96310b96310b96310b96310b96410ba6410ba6510ba6610bb6610bb6710bc6810bc6910bc6910bd
-6a10bd6b10be6b10be6c10be6c10bf6d10bf6e11c06e11c06f11c07011c17011c17111c17111c272
-11c27311c37311c37411c37411c47511c47611c47611c47711c57711c57811c67912c67912c67912
-c67a12c77a12c77b12c77b12c77c12c87c12c87c12c87d12c97d12c97e12c97e12c97f12ca7f12ca
-7f12ca8012ca8012cb8012cb8012cb8012cb8112cc8112cc8112cc8212cc8212
-
-b96310b96310b96310b96310b96310b96310b96410ba6510ba6510bb6610bb6710bb6710bc6810bc
-6910bd6910bd6a10bd6b10be6b10be6c10be6d10bf6d10bf6e11c06f11c06f11c07011c17011c171
-11c17211c27211c27311c37311c37411c37411c37511c47611c47611c47711c57711c57811c57811
-c67912c67912c67a12c77a12c77b12c77b12c77c12c87c12c87c12c87d12c87d12c97e12c97e12c9
-7e12c97f12ca7f12ca8012ca8012ca8012cb8012cb8012cb8012cb8112cc8112
-
-b96310b96310b96310b96310b96310b96310b96310b96410ba6410ba6510ba6610bb6610bb6710bb
-6810bc6810bc6910bd6a10bd6a10bd6b10be6c10be6c10bf6d10bf6d10bf6e11c06f11c06f11c070
-11c17011c17111c17211c27211c27311c37311c37411c37411c37511c47511c47611c47711c57711
-c57811c57811c67912c67912c67a12c67a12c77a12c77b12c77b12c77c12c87c12c87c12c87d12c9
-7d12c97e12c97e12c97e12c97f12ca7f12ca8012ca8012ca8012cb8012cb8012
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96410ba6510ba6510ba6610bb
-6710bb6710bc6810bc6910bc6910bd6a10bd6a10be6b10be6c10be6c10bf6d10bf6d10bf6e11c06f
-11c06f11c07011c17011c17111c17211c27211c27311c27311c37411c37411c37511c47511c47611
-c47611c57711c57711c57811c67912c67912c67912c67a12c77a12c77b12c77b12c77b12c87c12c8
-7c12c87d12c87d12c97d12c97e12c97e12c97e12c97f12ca7f12ca7f12ca8012
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96410ba6510ba
-6510bb6610bb6710bb6710bc6810bc6910bd6910bd6a10bd6b10be6b10be6c10be6c10bf6d10bf6e
-11bf6e11c06f11c06f11c07011c17011c17111c17211c27211c27311c27311c37411c37411c37511
-c47511c47611c47611c47711c57711c57811c57811c67912c67912c67a12c67a12c77a12c77b12c7
-7b12c77c12c87c12c87c12c87d12c87d12c97d12c97e12c97e12c97e12c97f12
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96410ba
-6410ba6510ba6610bb6610bb6710bb6810bc6810bc6910bd6910bd6a10bd6b10be6b10be6c10be6c
-10bf6d10bf6e11bf6e11c06f11c06f11c07011c17011c17111c17111c27211c27311c27311c37411
-c37411c37511c47511c47611c47611c47711c57711c57711c57811c67912c67912c67912c67a12c6
-7a12c77a12c77b12c77b12c77c12c87c12c87c12c87d12c87d12c97d12c97e12
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96410ba6510ba6510ba6610bb6610bb6710bb6810bc6810bc6910bd6910bd6a10bd6b10be6b
-10be6c10be6c10bf6d10bf6e11bf6e11c06f11c06f11c07011c17011c17111c17111c27211c27211
-c27311c37311c37411c37411c37511c47511c47611c47611c47711c57711c57811c57811c67912c6
-7912c67912c67a12c67a12c77a12c77b12c77b12c77c12c87c12c87c12c87c12
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96410ba6510ba6510ba6610bb6710bb6710bc6810bc6810bc6910bd6a10bd6a
-10bd6b10be6b10be6c10be6c10bf6d10bf6e11bf6e11c06f11c06f11c07011c17011c17111c17111
-c17211c27211c27311c27311c37411c37411c37511c47511c47611c47611c47611c57711c57711c5
-7811c57811c67912c67912c67912c67a12c67a12c77a12c77b12c77b12c77b12
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96410b96410ba6510ba6510bb6610bb6710bb6710bc6810bc6810bc69
-10bd6a10bd6a10bd6b10be6b10be6c10be6c10bf6d10bf6d10bf6e11c06e11c06f11c07011c17011
-c17111c17111c17211c27211c27211c27311c37311c37411c37411c37511c47511c47611c47611c4
-7711c57711c57711c57811c57811c67912c67912c67912c67a12c67a12c77a12
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96410ba6410ba6510ba6510bb6610bb6710bb6710bc68
-10bc6810bc6910bd6a10bd6a10bd6b10be6b10be6c10be6c10bf6d10bf6d10bf6e11c06e11c06f11
-c06f11c07011c17011c17111c17111c27211c27211c27311c27311c37411c37411c37411c37511c4
-7511c47611c47611c47711c57711c57711c57811c57811c67912c67912c67912
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96410ba6410ba6510ba6610bb6610bb67
-10bb6710bc6810bc6810bc6910bd6910bd6a10bd6b10be6b10be6c10be6c10be6d10bf6d10bf6e11
-bf6e11c06f11c06f11c07011c17011c17111c17111c17111c27211c27211c27311c37311c37411c3
-7411c37511c37511c47511c47611c47611c47711c57711c57711c57811c57811
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96410ba6410ba6510ba66
-10bb6610bb6710bb6710bc6810bc6810bc6910bd6910bd6a10bd6a10bd6b10be6b10be6c10be6c10
-bf6d10bf6d10bf6e11c06e11c06f11c06f11c07011c17011c17111c17111c17211c27211c27211c2
-7311c37311c37411c37411c37511c37511c47511c47611c47611c47611c57711
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96410ba64
-10ba6510ba6610bb6610bb6710bb6710bb6810bc6810bc6910bd6910bd6a10bd6a10bd6b10be6b10
-be6c10be6c10bf6d10bf6d10bf6e11bf6e11c06f11c06f11c07011c07011c17011c17111c17111c1
-7211c27211c27311c27311c37311c37411c37411c37411c37511c47511c47611
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96410ba6410ba6510ba6510ba6610bb6710bb6710bb6810bc6810bc6910bc6910bd6a10bd6a10
-bd6b10be6b10be6c10be6c10be6d10bf6d10bf6d10bf6e11c06e11c06f11c06f11c07011c17011c1
-7011c17111c17111c17211c27211c27211c27311c27311c37411c37411c37411
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96410ba6410ba6510ba6510ba6610bb6610bb6710bb6710bc6810bc6810bc6910
-bd6910bd6a10bd6a10bd6b10be6b10be6c10be6c10be6d10bf6d10bf6e11bf6e11c06e11c06f11c0
-6f11c07011c17011c17011c17111c17111c17211c27211c27211c27311c27311
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96410b96410ba6510ba6510ba6610bb6610bb6710bb6710bc6810
-bc6810bc6910bc6910bd6a10bd6a10bd6b10be6b10be6b10be6c10be6c10bf6d10bf6d10bf6e11bf
-6e11c06e11c06f11c06f11c07011c17011c17011c17111c17111c17111c27211
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96410b96410ba6510ba6510ba6610bb6610bb6710
-bb6710bb6810bc6810bc6810bc6910bd6910bd6a10bd6a10bd6b10be6b10be6c10be6c10be6c10bf
-6d10bf6d10bf6e11bf6e11c06e11c06f11c06f11c07011c07011c17011c17111
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96410ba6410ba6510ba6510
-ba6610bb6610bb6710bb6710bb6810bc6810bc6910bc6910bd6a10bd6a10bd6a10bd6b10be6b10be
-6c10be6c10be6c10bf6d10bf6d10bf6e11bf6e11c06e11c06f11c06f11c06f11
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96410b96410
-ba6510ba6510ba6610bb6610bb6710bb6710bb6710bc6810bc6810bc6910bc6910bd6a10bd6a10bd
-6a10bd6b10be6b10be6c10be6c10be6c10be6d10bf6d10bf6d10bf6e11bf6e11
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96410ba6410ba6510ba6510ba6610bb6610bb6710bb6710bb6810bc6810bc6810bc6910bc
-6910bd6a10bd6a10bd6a10bd6b10be6b10be6b10be6c10be6c10be6d10bf6d10
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96410b96410ba6510ba6510ba6510ba6610bb6610bb6710bb6710bb6810bc
-6810bc6810bc6910bc6910bd6a10bd6a10bd6a10bd6b10bd6b10be6b10be6c10
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96410ba6410ba6510ba6510ba6610ba6610bb6610bb
-6710bb6710bb6810bc6810bc6810bc6910bc6910bd6910bd6a10bd6a10bd6a10
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96410ba6410ba6510ba6510ba
-6610ba6610bb6610bb6710bb6710bb6710bc6810bc6810bc6810bc6910bc6910
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96410b96410ba
-6410ba6510ba6510ba6510ba6610bb6610bb6710bb6710bb6710bb6810bc6810
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96410b96410ba6510ba6510ba6510ba6610bb6610bb6610bb6710
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96410b96410ba6410ba6510ba6510ba6510
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96410b96410b96410
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-Q
-Q
-Q
-Q
-q
-q
-n
-76 75 m
-140 75 l
-140 11 l
-76 11 l
-76 75 l
-h
-W
-q
-q
-[64 0 0 64 76 11]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-d69213d69213d79213d79313d79314d79314d79414d79414d89414d89514d89514d89514d89514d9
-9614d99614d99614d99614d99714d99714d99714da9714da9714da9814da9814da9814da9814da99
-14db9914db9914db9914db9914db9914db9914db9a14db9a14db9a14db9a14db9a14db9a14db9a14
-dc9a14dc9a14dc9a14dc9a14dc9b14dc9b14dc9b14dc9b14dc9b14dc9b14dc9b14dc9b14dc9b14dc
-9b14dc9b14dc9b14dc9b14dc9a14dc9a14dc9a14db9a14db9a14db9a14db9a14
-
-d59113d69113d69113d69113d69213d69213d79313d79313d79314d79314d79414d79414d89414d8
-9514d89514d89514d89514d89514d99614d99614d99614d99614d99714d99714d99714da9714da97
-14da9814da9814da9814da9814da9814da9814da9814da9914da9914db9914db9914db9914db9914
-db9914db9914db9914db9914db9914db9914db9914db9914db9914db9914db9914db9914db9914db
-9914db9914db9914db9914db9914db9914db9914db9914db9914db9914db9914
-
-d58f13d59013d59013d59013d69113d69113d69113d69213d69213d79213d79313d79313d79314d7
-9314d79414d79414d89414d89414d89514d89514d89514d89514d89514d99614d99614d99614d996
-14d99614d99714d99714d99714d99714da9714da9714da9714da9714da9814da9814da9814da9814
-da9814da9814da9814da9814da9814da9814da9814da9814da9814da9814da9814da9814da9814da
-9814da9814da9814da9814da9814da9814da9814da9814da9814da9814da9814
-
-d48e13d48f13d48f13d58f13d59013d59013d59013d59113d69113d69113d69113d69213d69213d7
-9213d79313d79313d79314d79314d79314d79414d79414d89414d89414d89514d89514d89514d895
-14d89514d89514d99614d99614d99614d99614d99614d99614d99614d99714d99714d99714d99714
-d99714d99714d99714d99714d99714da9714da9714da9714da9714da9714da9714da9714da9714da
-9714da9714d99714d99714d99714d99714d99714d99714d99714d99714d99714
-
-d38d13d48e13d48e13d48e13d48f13d48f13d58f13d58f13d59013d59013d59013d59113d69113d6
-9113d69113d69213d69213d69213d79213d79313d79313d79314d79314d79314d79414d79414d894
-14d89414d89414d89514d89514d89514d89514d89514d89514d89514d89514d89514d89514d99614
-d99614d99614d99614d99614d99614d99614d99614d99614d99614d99614d99614d99614d99614d9
-9614d99614d99614d99614d99614d99614d99614d99614d99614d89514d89514
-
-d38c13d38d13d38d13d38d13d38d13d48e13d48e13d48e13d48f13d48f13d58f13d58f13d59013d5
-9013d59013d59113d69113d69113d69113d69113d69213d69213d69213d79213d79313d79313d793
-13d79314d79314d79314d79314d79414d79414d79414d89414d89414d89414d89414d89414d89514
-d89514d89514d89514d89514d89514d89514d89514d89514d89514d89514d89514d89514d89514d8
-9514d89514d89514d89514d89514d89514d89514d89514d89514d89414d89414
-
-d28b13d28b13d28c13d38c13d38c13d38d13d38d13d38d13d48e13d48e13d48e13d48e13d48f13d4
-8f13d58f13d58f13d59013d59013d59013d59013d59113d69113d69113d69113d69113d69213d692
-13d69213d69213d79213d79213d79313d79313d79313d79313d79314d79314d79314d79314d79314
-d79314d79314d79414d79414d79414d79414d79414d79414d79414d79414d79414d79414d79414d7
-9414d79414d79414d79414d79414d79314d79314d79314d79314d79314d79314
-
-d18a13d18a13d28b13d28b13d28b13d28c13d28c13d38c13d38d13d38d13d38d13d38d13d48e13d4
-8e13d48e13d48e13d48f13d48f13d48f13d58f13d58f13d59013d59013d59013d59013d59113d591
-13d69113d69113d69113d69113d69113d69113d69213d69213d69213d69213d69213d69213d79213
-d79213d79213d79213d79313d79313d79313d79313d79313d79313d79313d79313d79313d79313d7
-9313d79313d79313d79313d79313d79213d79213d79213d69213d69213d69213
-
-d08913d18913d18913d18a13d18a13d28b13d28b13d28b13d28b13d28c13d28c13d38c13d38d13d3
-8d13d38d13d38d13d38d13d48e13d48e13d48e13d48e13d48f13d48f13d48f13d58f13d58f13d58f
-13d59013d59013d59013d59013d59013d59013d59113d59113d69113d69113d69113d69113d69113
-d69113d69113d69113d69113d69113d69113d69113d69113d69113d69113d69113d69113d69113d6
-9113d69113d69113d69113d69113d69113d69113d69113d69113d69113d69113
-
-d08813d08813d08913d08913d18913d18913d18a13d18a13d18a13d28b13d28b13d28b13d28b13d2
-8c13d28c13d38c13d38c13d38d13d38d13d38d13d38d13d38d13d48e13d48e13d48e13d48e13d48e
-13d48f13d48f13d48f13d48f13d58f13d58f13d58f13d58f13d59013d59013d59013d59013d59013
-d59013d59013d59013d59013d59013d59013d59013d59013d59013d59013d59013d59013d59013d5
-9013d59013d59013d59013d59013d59013d59013d59013d59013d59013d59013
-
-cf8713cf8713d08713d08813d08813d08813d08913d18913d18913d18913d18a13d18a13d18a13d2
-8b13d28b13d28b13d28b13d28b13d28c13d28c13d38c13d38c13d38d13d38d13d38d13d38d13d38d
-13d38d13d48e13d48e13d48e13d48e13d48e13d48e13d48e13d48f13d48f13d48f13d48f13d48f13
-d48f13d48f13d48f13d48f13d48f13d58f13d58f13d58f13d58f13d58f13d58f13d58f13d58f13d5
-8f13d58f13d58f13d48f13d48f13d48f13d48f13d48f13d48f13d48f13d48f13
-
-ce8613cf8613cf8613cf8713cf8713cf8713d08713d08813d08813d08813d08913d18913d18913d1
-8913d18a13d18a13d18a13d18a13d28b13d28b13d28b13d28b13d28b13d28c13d28c13d28c13d38c
-13d38c13d38c13d38d13d38d13d38d13d38d13d38d13d38d13d38d13d38d13d38d13d48e13d48e13
-d48e13d48e13d48e13d48e13d48e13d48e13d48e13d48e13d48e13d48e13d48e13d48e13d48e13d4
-8e13d48e13d48e13d48e13d48e13d48e13d48e13d48e13d48e13d48e13d38d13
-
-ce8512ce8512ce8513ce8513cf8613cf8613cf8613cf8713cf8713cf8713d08713d08813d08813d0
-8813d08913d08913d18913d18913d18913d18a13d18a13d18a13d18a13d28b13d28b13d28b13d28b
-13d28b13d28b13d28b13d28c13d28c13d28c13d28c13d38c13d38c13d38c13d38c13d38d13d38d13
-d38d13d38d13d38d13d38d13d38d13d38d13d38d13d38d13d38d13d38d13d38d13d38d13d38d13d3
-8d13d38d13d38d13d38d13d38d13d38d13d38d13d38d13d38d13d38c13d38c13
-
-cd8312cd8412ce8412ce8412ce8512ce8512ce8513ce8613cf8613cf8613cf8613cf8713cf8713cf
-8713d08713d08813d08813d08813d08813d08913d08913d18913d18913d18913d18913d18a13d18a
-13d18a13d18a13d18a13d28b13d28b13d28b13d28b13d28b13d28b13d28b13d28b13d28b13d28b13
-d28b13d28b13d28c13d28c13d28c13d28c13d28c13d28c13d28c13d28c13d28c13d28c13d28c13d2
-8c13d28c13d28c13d28c13d28c13d28c13d28b13d28b13d28b13d28b13d28b13
-
-cc8212cd8312cd8312cd8312cd8412cd8412ce8412ce8512ce8512ce8512ce8513ce8613cf8613cf
-8613cf8613cf8713cf8713cf8713cf8713d08713d08813d08813d08813d08813d08813d08913d089
-13d18913d18913d18913d18913d18913d18a13d18a13d18a13d18a13d18a13d18a13d18a13d18a13
-d18a13d18a13d28b13d28b13d28b13d28b13d28b13d28b13d28b13d28b13d28b13d28b13d28b13d2
-8b13d28b13d28b13d28b13d28b13d18a13d18a13d18a13d18a13d18a13d18a13
-
-cc8112cc8212cc8212cc8212cd8312cd8312cd8312cd8312cd8412cd8412ce8412ce8512ce8512ce
-8512ce8513ce8513ce8613cf8613cf8613cf8613cf8713cf8713cf8713cf8713cf8713d08713d088
-13d08813d08813d08813d08813d08813d08913d08913d08913d08913d08913d18913d18913d18913
-d18913d18913d18913d18913d18913d18913d18913d18913d18913d18913d18913d18913d18913d1
-8913d18913d18913d18913d18913d18913d18913d18913d18913d18913d18913
-
-cb8012cb8112cb8112cc8112cc8112cc8212cc8212cc8212cd8312cd8312cd8312cd8312cd8412cd
-8412ce8412ce8412ce8512ce8512ce8512ce8513ce8513ce8613cf8613cf8613cf8613cf8613cf87
-13cf8713cf8713cf8713cf8713cf8713cf8713d08713d08713d08813d08813d08813d08813d08813
-d08813d08813d08813d08813d08813d08813d08813d08813d08813d08813d08813d08813d08813d0
-8813d08813d08813d08813d08813d08813d08813d08813d08813d08813d08813
-
-ca8012cb8012cb8012cb8012cb8012cb8112cc8112cc8112cc8112cc8212cc8212cc8212cd8312cd
-8312cd8312cd8312cd8312cd8412cd8412ce8412ce8412ce8512ce8512ce8512ce8512ce8513ce85
-13ce8513ce8613cf8613cf8613cf8613cf8613cf8613cf8613cf8713cf8713cf8713cf8713cf8713
-cf8713cf8713cf8713cf8713cf8713cf8713cf8713cf8713cf8713cf8713cf8713cf8713cf8713cf
-8713cf8713cf8713cf8713cf8713cf8713cf8713cf8713cf8713cf8713cf8713
-
-ca7f12ca7f12ca8012ca8012ca8012cb8012cb8012cb8012cb8012cb8112cb8112cc8112cc8112cc
-8212cc8212cc8212cc8212cd8312cd8312cd8312cd8312cd8312cd8312cd8412cd8412ce8412ce84
-12ce8412ce8512ce8512ce8512ce8512ce8512ce8513ce8513ce8513ce8513ce8613ce8613ce8613
-cf8613cf8613cf8613cf8613cf8613cf8613cf8613cf8613cf8613cf8613cf8613cf8613cf8613cf
-8613cf8613cf8613cf8613cf8613cf8613cf8613ce8613ce8613ce8613ce8513
-
-c97e12c97e12c97e12ca7f12ca7f12ca7f12ca8012ca8012ca8012cb8012cb8012cb8012cb8012cb
-8112cb8112cc8112cc8112cc8112cc8212cc8212cc8212cc8212cc8212cd8312cd8312cd8312cd83
-12cd8312cd8312cd8312cd8412cd8412cd8412ce8412ce8412ce8412ce8412ce8412ce8512ce8512
-ce8512ce8512ce8512ce8512ce8512ce8512ce8512ce8512ce8512ce8512ce8512ce8512ce8512ce
-8512ce8512ce8512ce8512ce8512ce8512ce8512ce8512ce8512ce8512ce8412
-
-c87d12c87d12c97d12c97e12c97e12c97e12c97f12ca7f12ca7f12ca7f12ca8012ca8012ca8012cb
-8012cb8012cb8012cb8012cb8012cb8112cb8112cc8112cc8112cc8112cc8112cc8212cc8212cc82
-12cc8212cc8212cc8212cd8312cd8312cd8312cd8312cd8312cd8312cd8312cd8312cd8312cd8312
-cd8312cd8412cd8412cd8412cd8412cd8412cd8412cd8412cd8412cd8412cd8412cd8412cd8412cd
-8412cd8412cd8412cd8412cd8412cd8412cd8312cd8312cd8312cd8312cd8312
-
-c87c12c87c12c87c12c87d12c87d12c87d12c97e12c97e12c97e12c97e12c97e12ca7f12ca7f12ca
-7f12ca8012ca8012ca8012ca8012cb8012cb8012cb8012cb8012cb8012cb8012cb8112cb8112cb81
-12cc8112cc8112cc8112cc8112cc8112cc8212cc8212cc8212cc8212cc8212cc8212cc8212cc8212
-cc8212cc8212cd8312cd8312cd8312cd8312cd8312cd8312cd8312cd8312cd8312cd8312cd8312cd
-8312cd8312cd8312cd8312cd8312cd8312cc8212cc8212cc8212cc8212cc8212
-
-c77b12c77b12c77b12c77c12c87c12c87c12c87c12c87d12c87d12c87d12c97d12c97e12c97e12c9
-7e12c97e12c97f12ca7f12ca7f12ca7f12ca8012ca8012ca8012ca8012ca8012cb8012cb8012cb80
-12cb8012cb8012cb8012cb8012cb8012cb8112cb8112cb8112cb8112cc8112cc8112cc8112cc8112
-cc8112cc8112cc8112cc8112cc8112cc8112cc8112cc8112cc8112cc8112cc8112cc8112cc8112cc
-8112cc8112cc8112cc8112cc8112cc8112cc8112cc8112cc8112cc8112cc8112
-
-c67a12c67a12c77a12c77a12c77b12c77b12c77b12c77c12c87c12c87c12c87c12c87d12c87d12c8
-7d12c97d12c97e12c97e12c97e12c97e12c97e12c97e12c97f12ca7f12ca7f12ca7f12ca7f12ca80
-12ca8012ca8012ca8012ca8012ca8012cb8012cb8012cb8012cb8012cb8012cb8012cb8012cb8012
-cb8012cb8012cb8012cb8012cb8012cb8012cb8012cb8012cb8012cb8012cb8012cb8012cb8012cb
-8012cb8012cb8012cb8012cb8012cb8012cb8012cb8012cb8012cb8012cb8012
-
-c67912c67912c67912c67912c67a12c67a12c77a12c77a12c77b12c77b12c77b12c77c12c87c12c8
-7c12c87c12c87c12c87d12c87d12c87d12c97d12c97d12c97e12c97e12c97e12c97e12c97e12c97e
-12c97f12c97f12ca7f12ca7f12ca7f12ca7f12ca7f12ca8012ca8012ca8012ca8012ca8012ca8012
-ca8012ca8012ca8012ca8012ca8012ca8012ca8012ca8012ca8012ca8012ca8012ca8012ca8012ca
-8012ca8012ca8012ca8012ca8012ca8012ca8012ca8012ca8012ca8012ca8012
-
-c57711c57711c57811c57811c67912c67912c67912c67912c67a12c67a12c67a12c77a12c77b12c7
-7b12c77b12c77b12c77c12c87c12c87c12c87c12c87c12c87c12c87d12c87d12c87d12c87d12c97d
-12c97e12c97e12c97e12c97e12c97e12c97e12c97e12c97e12c97e12c97e12c97f12c97f12c97f12
-ca7f12ca7f12ca7f12ca7f12ca7f12ca7f12ca7f12ca7f12ca7f12ca7f12ca7f12ca7f12ca7f12ca
-7f12ca7f12ca7f12ca7f12ca7f12ca7f12ca7f12ca7f12c97f12c97f12c97f12
-
-c47611c47611c47711c57711c57711c57811c57811c57811c67912c67912c67912c67912c67a12c6
-7a12c67a12c77a12c77a12c77b12c77b12c77b12c77b12c77b12c77c12c87c12c87c12c87c12c87c
-12c87c12c87c12c87d12c87d12c87d12c87d12c87d12c87d12c97d12c97d12c97e12c97e12c97e12
-c97e12c97e12c97e12c97e12c97e12c97e12c97e12c97e12c97e12c97e12c97e12c97e12c97e12c9
-7e12c97e12c97e12c97e12c97e12c97e12c97e12c97e12c97e12c97e12c97d12
-
-c37511c37511c47511c47611c47611c47611c47711c57711c57711c57711c57811c57811c67912c6
-7912c67912c67912c67912c67a12c67a12c67a12c67a12c77a12c77a12c77b12c77b12c77b12c77b
-12c77b12c77b12c77c12c77c12c87c12c87c12c87c12c87c12c87c12c87c12c87c12c87c12c87c12
-c87c12c87d12c87d12c87d12c87d12c87d12c87d12c87d12c87d12c87d12c87d12c87d12c87d12c8
-7d12c87d12c87d12c87d12c87d12c87d12c87d12c87c12c87c12c87c12c87c12
-
-c37311c37411c37411c37411c37511c47511c47511c47611c47611c47611c47611c57711c57711c5
-7711c57811c57811c57811c67912c67912c67912c67912c67912c67912c67a12c67a12c67a12c67a
-12c67a12c77a12c77a12c77a12c77b12c77b12c77b12c77b12c77b12c77b12c77b12c77b12c77b12
-c77b12c77c12c77c12c77c12c77c12c77c12c87c12c87c12c87c12c87c12c87c12c87c12c87c12c8
-7c12c77c12c77c12c77c12c77c12c77c12c77c12c77b12c77b12c77b12c77b12
-
-c27211c27311c27311c27311c37311c37411c37411c37411c37511c37511c47511c47611c47611c4
-7611c47611c47711c57711c57711c57711c57711c57811c57811c57811c67912c67912c67912c679
-12c67912c67912c67912c67912c67a12c67a12c67a12c67a12c67a12c67a12c67a12c77a12c77a12
-c77a12c77a12c77a12c77a12c77a12c77a12c77a12c77a12c77b12c77b12c77b12c77b12c77b12c7
-7a12c77a12c77a12c77a12c77a12c77a12c77a12c77a12c77a12c67a12c67a12
-
-c17111c17111c17211c27211c27211c27311c27311c27311c37311c37411c37411c37411c37511c3
-7511c47511c47511c47611c47611c47611c47611c47611c47711c57711c57711c57711c57711c578
-11c57811c57811c57811c57811c67912c67912c67912c67912c67912c67912c67912c67912c67912
-c67912c67912c67912c67912c67912c67912c67912c67912c67912c67912c67912c67912c67912c6
-7912c67912c67912c67912c67912c67912c67912c67912c67912c67912c67912
-
-c07011c17011c17011c17111c17111c17111c17211c27211c27211c27211c27311c27311c37311c3
-7411c37411c37411c37411c37411c37511c37511c47511c47511c47611c47611c47611c47611c476
-11c47611c47711c47711c57711c57711c57711c57711c57711c57711c57811c57811c57811c57811
-c57811c57811c57811c57811c57811c57811c57811c57811c57811c57811c57811c57811c57811c5
-7811c57811c57811c57811c57811c57811c57811c57811c57811c57811c57811
-
-c06e11c06f11c06f11c06f11c07011c17011c17011c17111c17111c17111c17111c27211c27211c2
-7211c27311c27311c27311c27311c37311c37411c37411c37411c37411c37411c37511c37511c375
-11c47511c47511c47511c47611c47611c47611c47611c47611c47611c47611c47611c47611c47711
-c47711c47711c47711c57711c57711c57711c57711c57711c57711c57711c57711c57711c57711c5
-7711c57711c57711c57711c47711c47711c47711c47711c47611c47611c47611
-
-bf6d10bf6e11bf6e11bf6e11c06f11c06f11c06f11c06f11c07011c07011c17011c17111c17111c1
-7111c17111c17211c17211c27211c27211c27211c27311c27311c27311c27311c37311c37411c374
-11c37411c37411c37411c37411c37411c37511c37511c37511c37511c37511c47511c47511c47511
-c47511c47511c47511c47511c47611c47611c47611c47611c47611c47611c47611c47611c47611c4
-7611c47611c47611c47611c47511c47511c47511c47511c47511c47511c47511
-
-be6c10be6c10be6d10bf6d10bf6d10bf6e11bf6e11bf6e11c06e11c06f11c06f11c06f11c07011c0
-7011c17011c17011c17011c17111c17111c17111c17111c17211c17211c27211c27211c27211c272
-11c27311c27311c27311c27311c27311c37311c37311c37411c37411c37411c37411c37411c37411
-c37411c37411c37411c37411c37411c37411c37411c37411c37411c37411c37411c37411c37411c3
-7411c37411c37411c37411c37411c37411c37411c37411c37411c37411c37411
-
-bd6b10be6b10be6b10be6c10be6c10be6c10be6d10bf6d10bf6d10bf6d10bf6e11bf6e11bf6e11c0
-6f11c06f11c06f11c06f11c06f11c07011c07011c17011c17011c17011c17111c17111c17111c171
-11c17111c17111c17211c27211c27211c27211c27211c27211c27211c27211c27311c27311c27311
-c27311c27311c27311c27311c27311c27311c27311c27311c27311c27311c27311c27311c27311c2
-7311c27311c27311c27311c27311c27311c27311c27311c27311c27311c27211
-
-bd6a10bd6a10bd6a10bd6a10bd6b10be6b10be6b10be6c10be6c10be6c10be6c10be6d10bf6d10bf
-6d10bf6d10bf6e11bf6e11bf6e11c06e11c06f11c06f11c06f11c06f11c06f11c07011c07011c070
-11c17011c17011c17011c17011c17111c17111c17111c17111c17111c17111c17111c17111c17111
-c17111c17211c17211c17211c17211c17211c27211c27211c27211c27211c27211c27211c27211c2
-7211c17211c17211c17211c17211c17211c17211c17111c17111c17111c17111
-
-bc6810bc6910bc6910bc6910bd6a10bd6a10bd6a10bd6a10bd6b10bd6b10be6b10be6b10be6c10be
-6c10be6c10be6c10be6d10bf6d10bf6d10bf6d10bf6e11bf6e11bf6e11bf6e11c06e11c06e11c06f
-11c06f11c06f11c06f11c06f11c06f11c06f11c07011c07011c07011c07011c07011c17011c17011
-c17011c17011c17011c17011c17011c17011c17011c17011c17111c17111c17111c17111c17111c1
-7011c17011c17011c17011c17011c17011c17011c17011c17011c17011c07011
-
-bb6710bb6710bb6810bc6810bc6810bc6910bc6910bc6910bd6910bd6a10bd6a10bd6a10bd6a10bd
-6b10bd6b10be6b10be6b10be6c10be6c10be6c10be6c10be6c10be6d10bf6d10bf6d10bf6d10bf6d
-10bf6e11bf6e11bf6e11bf6e11bf6e11bf6e11c06e11c06e11c06f11c06f11c06f11c06f11c06f11
-c06f11c06f11c06f11c06f11c06f11c06f11c06f11c06f11c06f11c06f11c06f11c06f11c06f11c0
-6f11c06f11c06f11c06f11c06f11c06f11c06f11c06f11c06f11c06f11c06f11
-
-ba6610bb6610bb6610bb6710bb6710bb6710bb6810bc6810bc6810bc6810bc6910bc6910bc6910bd
-6910bd6a10bd6a10bd6a10bd6a10bd6b10bd6b10be6b10be6b10be6b10be6c10be6c10be6c10be6c
-10be6c10be6c10be6d10be6d10bf6d10bf6d10bf6d10bf6d10bf6d10bf6d10bf6d10bf6d10bf6e11
-bf6e11bf6e11bf6e11bf6e11bf6e11bf6e11bf6e11bf6e11bf6e11bf6e11bf6e11bf6e11bf6e11bf
-6e11bf6e11bf6e11bf6e11bf6e11bf6e11bf6e11bf6e11bf6e11bf6d10bf6d10
-
-ba6510ba6510ba6510ba6510ba6610bb6610bb6610bb6710bb6710bb6710bb6710bb6810bc6810bc
-6810bc6810bc6910bc6910bc6910bd6910bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd6b10bd6b
-10bd6b10be6b10be6b10be6b10be6c10be6c10be6c10be6c10be6c10be6c10be6c10be6c10be6c10
-be6c10be6c10be6c10be6d10be6d10be6d10be6d10be6d10be6d10be6d10be6d10be6d10be6d10be
-6d10be6d10be6d10be6d10be6d10be6c10be6c10be6c10be6c10be6c10be6c10
-
-b96310b96410b96410b96410ba6510ba6510ba6510ba6510ba6610ba6610bb6610bb6610bb6710bb
-6710bb6710bb6710bb6810bc6810bc6810bc6810bc6810bc6910bc6910bc6910bc6910bd6910bd6a
-10bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd6b10bd6b10bd6b10bd6b10bd6b10be6b10
-be6b10be6b10be6b10be6b10be6b10be6b10be6b10be6b10be6b10be6b10be6b10be6b10be6b10be
-6b10be6b10be6b10be6b10be6b10be6b10be6b10be6b10bd6b10bd6b10bd6b10
-
-b96310b96310b96310b96310b96310b96410b96410b96410ba6410ba6510ba6510ba6510ba6510ba
-6610ba6610bb6610bb6610bb6710bb6710bb6710bb6710bb6710bb6810bc6810bc6810bc6810bc68
-10bc6810bc6910bc6910bc6910bc6910bc6910bc6910bd6910bd6910bd6910bd6a10bd6a10bd6a10
-bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd
-6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96410b96410b96410ba
-6410ba6510ba6510ba6510ba6510ba6610ba6610ba6610bb6610bb6610bb6610bb6710bb6710bb67
-10bb6710bb6710bb6710bb6810bb6810bc6810bc6810bc6810bc6810bc6810bc6810bc6810bc6810
-bc6910bc6910bc6910bc6910bc6910bc6910bc6910bc6910bc6910bc6910bc6910bc6910bc6910bc
-6910bc6910bc6910bc6910bc6910bc6910bc6910bc6810bc6810bc6810bc6810
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96410b96410b96410ba6410ba6410ba6510ba6510ba6510ba6510ba6510ba6610ba66
-10ba6610bb6610bb6610bb6610bb6610bb6710bb6710bb6710bb6710bb6710bb6710bb6710bb6710
-bb6710bb6710bb6710bb6710bb6710bb6710bb6810bb6810bb6810bb6810bb6810bb6810bb6810bb
-6810bb6710bb6710bb6710bb6710bb6710bb6710bb6710bb6710bb6710bb6710
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96410b96410b96410b96410ba6410ba64
-10ba6510ba6510ba6510ba6510ba6510ba6510ba6510ba6510ba6610ba6610ba6610ba6610ba6610
-ba6610bb6610bb6610bb6610bb6610bb6610bb6610bb6610bb6610bb6610bb6610bb6610bb6610bb
-6610bb6610bb6610bb6610bb6610bb6610ba6610ba6610ba6610ba6610ba6610
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96410b96410b96410b96410b96410b96410ba6410ba6410ba6410ba6510ba6510
-ba6510ba6510ba6510ba6510ba6510ba6510ba6510ba6510ba6510ba6510ba6510ba6510ba6510ba
-6510ba6510ba6510ba6510ba6510ba6510ba6510ba6510ba6510ba6510ba6410
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96410b96410b96410b96410b96410b96410b96410b96410b96410b96410b96410b9
-6410b96410b96410b96410b96410b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-Q
-Q
-Q
-Q
-q
-q
-n
-140 75 m
-204 75 l
-204 11 l
-140 11 l
-140 75 l
-h
-W
-q
-q
-[64 0 0 64 140 11]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-db9a14db9a14db9a14db9914db9914db9914db9914db9914db9914da9914da9814da9814da9814da
-9814da9814da9714da9714d99714d99714d99714d99614d99614d99614d89514d89514d89514d895
-14d89414d89414d79414d79314d79314d79313d79213d69213d69213d69113d69113d59113d59013
-d59013d58f13d58f13d48f13d48e13d48e13d38d13d38d13d38d13d38c13d28c13d28b13d28b13d1
-8a13d18a13d18913d18913d08913d08813d08713cf8713cf8713cf8613ce8513
-
-db9914da9914da9914da9814da9814da9814da9814da9814da9814da9714da9714da9714d99714d9
-9714d99714d99614d99614d99614d99614d89514d89514d89514d89514d89414d89414d79414d793
-14d79314d79314d79313d79213d69213d69213d69113d69113d59113d59013d59013d59013d58f13
-d48f13d48e13d48e13d48e13d38d13d38d13d38c13d38c13d28c13d28b13d28b13d18a13d18a13d1
-8913d18913d08813d08813d08713cf8713cf8713cf8613ce8513ce8512ce8512
-
-da9814da9714da9714da9714d99714d99714d99714d99714d99714d99614d99614d99614d99614d9
-9614d89514d89514d89514d89514d89514d89414d89414d79414d79314d79314d79314d79313d792
-13d69213d69213d69113d69113d69113d59113d59013d59013d59013d58f13d48f13d48f13d48e13
-d48e13d38d13d38d13d38d13d38c13d28c13d28b13d28b13d28b13d18a13d18a13d18913d08913d0
-8813d08813d08713cf8713cf8713cf8613ce8513ce8512ce8512cd8412cd8312
-
-d99714d99614d99614d99614d99614d99614d99614d89514d89514d89514d89514d89514d89514d8
-9514d89414d89414d79414d79414d79314d79314d79314d79313d79213d69213d69213d69213d691
-13d69113d69113d59013d59013d59013d58f13d58f13d48f13d48f13d48e13d48e13d38d13d38d13
-d38d13d38c13d28c13d28b13d28b13d28b13d18a13d18a13d18913d18913d08913d08813d08813cf
-8713cf8713cf8613cf8613ce8513ce8512ce8512cd8412cd8312cd8312cd8312
-
-d89514d89514d89514d89514d89514d89514d89514d89414d89414d89414d79414d79414d79314d7
-9314d79314d79314d79313d79313d79213d69213d69213d69213d69113d69113d69113d59113d590
-13d59013d59013d58f13d48f13d48f13d48e13d48e13d48e13d38d13d38d13d38d13d38c13d28c13
-d28c13d28b13d28b13d28b13d18a13d18a13d18913d08913d08813d08813d08813cf8713cf8713cf
-8613ce8613ce8513ce8512ce8412cd8412cd8312cd8312cc8212cc8212cc8112
-
-d89414d89414d79414d79414d79414d79414d79314d79314d79314d79314d79313d79313d79213d7
-9213d69213d69213d69213d69113d69113d69113d69113d59113d59013d59013d59013d58f13d58f
-13d48f13d48f13d48e13d48e13d48e13d38d13d38d13d38d13d38c13d28c13d28c13d28b13d28b13
-d28b13d18a13d18a13d18913d18913d08913d08813d08813d08713cf8713cf8713cf8613ce8613ce
-8513ce8512ce8412cd8412cd8312cd8312cc8212cc8212cc8112cc8112cb8012
-
-d79314d79314d79313d79313d79313d79313d79213d69213d69213d69213d69213d69113d69113d6
-9113d69113d69113d59113d59013d59013d59013d59013d58f13d48f13d48f13d48f13d48e13d48e
-13d48e13d38d13d38d13d38d13d38d13d38c13d28c13d28c13d28b13d28b13d28b13d18a13d18a13
-d18913d18913d08913d08813d08813d08713cf8713cf8713cf8613cf8613ce8513ce8512ce8512ce
-8412cd8412cd8312cd8312cc8212cc8212cc8112cb8112cb8012cb8012cb8012
-
-d69213d69213d69213d69213d69113d69113d69113d69113d69113d69113d59113d59013d59013d5
-9013d59013d59013d58f13d58f13d48f13d48f13d48f13d48e13d48e13d48e13d38d13d38d13d38d
-13d38d13d38c13d38c13d28c13d28b13d28b13d28b13d28b13d18a13d18a13d18913d18913d08913
-d08813d08813d08813cf8713cf8713cf8713cf8613ce8613ce8513ce8512ce8412cd8412cd8312cd
-8312cd8312cc8212cc8212cc8112cb8112cb8012cb8012cb8012ca8012ca7f12
-
-d69113d69113d59113d59013d59013d59013d59013d59013d59013d59013d58f13d58f13d48f13d4
-8f13d48f13d48f13d48e13d48e13d48e13d48e13d38d13d38d13d38d13d38d13d38c13d38c13d28c
-13d28b13d28b13d28b13d28b13d18a13d18a13d18a13d18913d18913d08913d08813d08813d08813
-cf8713cf8713cf8713cf8613cf8613ce8513ce8512ce8512ce8412cd8412cd8312cd8312cd8312cc
-8212cc8212cc8112cb8112cb8012cb8012ca8012ca8012ca7f12ca7f12c97e12
-
-d59013d58f13d58f13d58f13d58f13d48f13d48f13d48f13d48f13d48f13d48e13d48e13d48e13d4
-8e13d38d13d38d13d38d13d38d13d38d13d38d13d38c13d38c13d28c13d28b13d28b13d28b13d28b
-13d18a13d18a13d18a13d18913d18913d18913d08913d08813d08813d08813cf8713cf8713cf8713
-cf8613cf8613ce8513ce8512ce8512ce8412cd8412cd8312cd8312cd8312cc8212cc8212cc8112cc
-8112cb8112cb8012cb8012ca8012ca8012ca7f12c97f12c97e12c97e12c97d12
-
-d48f13d48e13d48e13d48e13d48e13d48e13d48e13d48e13d38d13d38d13d38d13d38d13d38d13d3
-8d13d38c13d38c13d38c13d28c13d28c13d28b13d28b13d28b13d28b13d18a13d18a13d18a13d18a
-13d18913d18913d08913d08913d08813d08813d08713cf8713cf8713cf8713cf8613cf8613ce8513
-ce8513ce8512ce8412ce8412cd8412cd8312cd8312cd8312cc8212cc8212cc8112cb8112cb8012cb
-8012cb8012ca8012ca8012ca7f12c97f12c97e12c97e12c97d12c87d12c87c12
-
-d38d13d38d13d38d13d38d13d38d13d38d13d38d13d38d13d38c13d38c13d38c13d28c13d28c13d2
-8b13d28b13d28b13d28b13d28b13d28b13d18a13d18a13d18a13d18913d18913d18913d08913d089
-13d08813d08813d08813d08713cf8713cf8713cf8613cf8613cf8613ce8513ce8512ce8512ce8412
-ce8412cd8412cd8312cd8312cd8312cc8212cc8212cc8112cc8112cb8112cb8012cb8012ca8012ca
-8012ca7f12ca7f12c97e12c97e12c97e12c87d12c87d12c87c12c87c12c77b12
-
-d38c13d38c13d38c13d28c13d28c13d28c13d28b13d28b13d28b13d28b13d28b13d28b13d28b13d1
-8a13d18a13d18a13d18a13d18a13d18913d18913d18913d08913d08813d08813d08813d08813d087
-13cf8713cf8713cf8713cf8613cf8613ce8613ce8513ce8512ce8512ce8412ce8412cd8412cd8312
-cd8312cd8312cc8212cc8212cc8112cc8112cb8112cb8012cb8012cb8012ca8012ca8012ca7f12ca
-7f12c97e12c97e12c97e12c87d12c87d12c87c12c87c12c77b12c77b12c77a12
-
-d28b13d28b13d28b13d28b13d28b13d28b13d18a13d18a13d18a13d18a13d18a13d18a13d18913d1
-8913d18913d08913d08913d08913d08813d08813d08813d08813cf8713cf8713cf8713cf8713cf86
-13cf8613ce8613ce8513ce8513ce8512ce8512ce8412cd8412cd8412cd8312cd8312cd8312cc8212
-cc8212cc8112cc8112cb8112cb8012cb8012cb8012ca8012ca8012ca8012ca7f12c97f12c97e12c9
-7e12c97d12c87d12c87c12c87c12c77c12c77b12c77b12c77a12c67a12c67912
-
-d18a13d18a13d18a13d18a13d18913d18913d18913d18913d18913d08913d08913d08913d08813d0
-8813d08813d08813d08713d08713cf8713cf8713cf8713cf8613cf8613cf8613ce8613ce8513ce85
-13ce8512ce8512ce8412ce8412cd8412cd8312cd8312cd8312cd8312cc8212cc8212cc8112cc8112
-cb8112cb8112cb8012cb8012cb8012ca8012ca8012ca7f12ca7f12c97e12c97e12c97e12c87d12c8
-7d12c87c12c87c12c77b12c77b12c77a12c67a12c67a12c67912c67912c57811
-
-d08913d08913d08913d08913d08813d08813d08813d08813d08813d08813d08713d08713cf8713cf
-8713cf8713cf8713cf8613cf8613cf8613cf8613ce8613ce8513ce8512ce8512ce8512ce8412ce84
-12cd8412cd8312cd8312cd8312cd8312cc8212cc8212cc8212cc8112cc8112cb8112cb8012cb8012
-cb8012cb8012ca8012ca8012ca7f12ca7f12c97e12c97e12c97e12c97d12c87d12c87c12c87c12c7
-7c12c77b12c77b12c77a12c67a12c67a12c67912c67912c57811c57711c57711
-
-d08813d08813d08713d08713cf8713cf8713cf8713cf8713cf8713cf8713cf8613cf8613cf8613cf
-8613ce8613ce8513ce8513ce8512ce8512ce8512ce8412ce8412cd8412cd8412cd8312cd8312cd83
-12cd8312cc8212cc8212cc8212cc8212cc8112cc8112cb8112cb8012cb8012cb8012ca8012ca8012
-ca8012ca7f12ca7f12c97f12c97e12c97e12c97d12c87d12c87d12c87c12c87c12c77b12c77b12c7
-7b12c77a12c67a12c67912c67912c67912c57811c57711c57711c47611c47611
-
-cf8713cf8713cf8613cf8613cf8613cf8613cf8613ce8613ce8613ce8513ce8513ce8512ce8512ce
-8512ce8512ce8412ce8412cd8412cd8412cd8312cd8312cd8312cd8312cd8312cc8212cc8212cc82
-12cc8212cc8112cc8112cb8112cb8112cb8012cb8012cb8012ca8012ca8012ca8012ca7f12ca7f12
-c97f12c97e12c97e12c97e12c87d12c87d12c87c12c87c12c77c12c77b12c77b12c77a12c67a12c6
-7a12c67912c67912c57811c57811c57711c47711c47611c47611c47511c37511
-
-ce8513ce8513ce8513ce8513ce8512ce8512ce8512ce8512ce8512ce8412ce8412cd8412cd8412cd
-8412cd8312cd8312cd8312cd8312cd8312cc8212cc8212cc8212cc8212cc8112cc8112cc8112cb81
-12cb8112cb8012cb8012cb8012cb8012ca8012ca8012ca8012ca7f12ca7f12c97e12c97e12c97e12
-c97e12c87d12c87d12c87c12c87c12c87c12c77b12c77b12c77a12c77a12c67a12c67912c67912c6
-7912c57811c57711c57711c47611c47611c47511c37511c37411c37411c37311
-
-ce8412ce8412ce8412cd8412cd8412cd8412cd8412cd8312cd8312cd8312cd8312cd8312cd8312cd
-8312cc8212cc8212cc8212cc8212cc8112cc8112cc8112cb8112cb8112cb8012cb8012cb8012cb80
-12cb8012ca8012ca8012ca8012ca7f12ca7f12c97f12c97e12c97e12c97e12c97d12c87d12c87d12
-c87c12c87c12c87c12c77b12c77b12c77b12c77a12c67a12c67a12c67912c67912c57811c57811c5
-7711c57711c47611c47611c47511c37511c37411c37411c37311c27311c27211
-
-cd8312cd8312cd8312cd8312cd8312cd8312cd8312cc8212cc8212cc8212cc8212cc8212cc8212cc
-8112cc8112cc8112cb8112cb8112cb8012cb8012cb8012cb8012cb8012ca8012ca8012ca8012ca80
-12ca7f12ca7f12c97f12c97e12c97e12c97e12c97e12c97d12c87d12c87d12c87c12c87c12c77c12
-c77b12c77b12c77b12c77a12c67a12c67a12c67912c67912c67912c57811c57711c57711c47711c4
-7611c47611c47511c37511c37411c37411c27311c27311c27211c17211c17111
-
-cc8212cc8212cc8212cc8212cc8212cc8112cc8112cc8112cc8112cc8112cb8112cb8112cb8012cb
-8012cb8012cb8012cb8012cb8012ca8012ca8012ca8012ca8012ca7f12ca7f12ca7f12c97f12c97e
-12c97e12c97e12c97e12c97d12c87d12c87d12c87c12c87c12c87c12c77c12c77b12c77b12c77a12
-c77a12c67a12c67a12c67912c67912c67912c57811c57811c57711c47711c47611c47611c47511c3
-7511c37411c37411c37311c27311c27211c27211c17111c17111c17011c07011
-
-cb8112cb8112cb8112cb8112cb8112cb8012cb8012cb8012cb8012cb8012cb8012cb8012ca8012ca
-8012ca8012ca8012ca8012ca7f12ca7f12ca7f12c97f12c97e12c97e12c97e12c97e12c97e12c97d
-12c87d12c87d12c87c12c87c12c87c12c77c12c77b12c77b12c77b12c77a12c77a12c67a12c67a12
-c67912c67912c67912c57811c57811c57711c47711c47611c47611c47511c47511c37511c37411c3
-7411c27311c27311c27211c27211c17111c17111c17011c07011c06f11c06f11
-
-cb8012cb8012cb8012cb8012ca8012ca8012ca8012ca8012ca8012ca8012ca8012ca7f12ca7f12ca
-7f12ca7f12c97f12c97e12c97e12c97e12c97e12c97e12c97d12c87d12c87d12c87d12c87c12c87c
-12c87c12c87c12c77b12c77b12c77b12c77b12c77a12c67a12c67a12c67912c67912c67912c67912
-c57811c57811c57711c57711c47611c47611c47611c47511c37511c37411c37411c37311c27311c2
-7211c27211c17211c17111c17111c17011c07011c06f11c06f11bf6e11bf6e11
-
-ca8012ca8012ca7f12ca7f12ca7f12ca7f12ca7f12ca7f12c97f12c97e12c97e12c97e12c97e12c9
-7e12c97e12c97e12c97d12c87d12c87d12c87d12c87c12c87c12c87c12c87c12c77c12c77b12c77b
-12c77b12c77b12c77a12c67a12c67a12c67a12c67912c67912c67912c57811c57811c57711c57711
-c47711c47611c47611c47611c47511c37511c37411c37411c37311c27311c27311c27211c17211c1
-7111c17111c17011c07011c06f11c06f11c06e11bf6e11bf6d10bf6d10be6c10
-
-c97e12c97e12c97e12c97e12c97e12c97e12c97e12c97e12c97e12c97d12c97d12c87d12c87d12c8
-7d12c87d12c87c12c87c12c87c12c87c12c77c12c77b12c77b12c77b12c77b12c77a12c77a12c67a
-12c67a12c67a12c67912c67912c67912c67912c57811c57811c57711c57711c47711c47611c47611
-c47511c47511c37511c37411c37411c37411c27311c27311c27211c27211c17111c17111c17111c1
-7011c07011c06f11c06f11bf6e11bf6e11bf6d10be6d10be6c10be6c10be6b10
-
-c97d12c97d12c87d12c87d12c87d12c87d12c87d12c87c12c87c12c87c12c87c12c87c12c87c12c7
-7c12c77c12c77b12c77b12c77b12c77b12c77a12c77a12c67a12c67a12c67a12c67912c67912c679
-12c67912c67912c57811c57811c57711c57711c47711c47611c47611c47611c47511c37511c37511
-c37411c37411c37311c27311c27311c27211c27211c17111c17111c17111c17011c07011c06f11c0
-6f11c06e11bf6e11bf6d10bf6d10be6d10be6c10be6c10be6b10bd6b10bd6a10
-
-c87c12c87c12c87c12c87c12c87c12c87c12c77c12c77b12c77b12c77b12c77b12c77b12c77b12c7
-7a12c77a12c77a12c67a12c67a12c67a12c67912c67912c67912c67912c67912c57811c57811c578
-11c57711c57711c47711c47611c47611c47611c47511c47511c37511c37411c37411c37411c37311
-c27311c27311c27211c27211c17111c17111c17111c17011c07011c06f11c06f11c06f11bf6e11bf
-6e11bf6d10bf6d10be6c10be6c10be6b10bd6b10bd6a10bd6a10bd6910bc6910
-
-c77b12c77b12c77b12c77b12c77b12c77a12c77a12c77a12c77a12c67a12c67a12c67a12c67a12c6
-7912c67912c67912c67912c67912c67912c57811c57811c57811c57711c57711c57711c47711c476
-11c47611c47611c47511c47511c37511c37511c37411c37411c37411c27311c27311c27311c27211
-c27211c17111c17111c17111c17011c07011c06f11c06f11c06f11bf6e11bf6e11bf6d10bf6d10be
-6c10be6c10be6c10be6b10bd6b10bd6a10bd6a10bc6910bc6910bc6810bb6810
-
-c67a12c67a12c67a12c67a12c67a12c67912c67912c67912c67912c67912c67912c67912c67912c5
-7811c57811c57811c57811c57711c57711c57711c47711c47611c47611c47611c47611c47511c475
-11c37511c37511c37411c37411c37411c37311c27311c27311c27211c27211c17211c17111c17111
-c17111c17011c07011c06f11c06f11c06f11bf6e11bf6e11bf6d10bf6d10be6d10be6c10be6c10be
-6b10bd6b10bd6a10bd6a10bd6910bc6910bc6810bc6810bb6810bb6710bb6710
-
-c67912c67912c67912c67912c67912c57811c57811c57811c57811c57811c57711c57711c57711c5
-7711c47711c47611c47611c47611c47611c47611c47511c47511c37511c37511c37411c37411c374
-11c37411c37311c27311c27311c27211c27211c27211c17111c17111c17111c17011c17011c07011
-c06f11c06f11c06f11bf6e11bf6e11bf6d10bf6d10be6d10be6c10be6c10be6b10bd6b10bd6b10bd
-6a10bd6a10bc6910bc6910bc6810bc6810bb6710bb6710bb6610ba6610ba6510
-
-c57811c57711c57711c57711c57711c57711c57711c47711c47611c47611c47611c47611c47611c4
-7611c47511c47511c47511c37511c37511c37411c37411c37411c37411c37311c27311c27311c273
-11c27211c27211c17211c17111c17111c17111c17111c17011c07011c07011c06f11c06f11c06e11
-bf6e11bf6e11bf6d10bf6d10be6d10be6c10be6c10be6b10be6b10bd6b10bd6a10bd6a10bd6910bc
-6910bc6810bc6810bb6810bb6710bb6710bb6610ba6610ba6510ba6510b96410
-
-c47611c47611c47611c47611c47611c47611c47611c47511c47511c47511c37511c37511c37511c3
-7411c37411c37411c37411c37411c37311c27311c27311c27311c27211c27211c27211c17211c171
-11c17111c17111c17011c17011c07011c07011c06f11c06f11c06f11c06e11bf6e11bf6e11bf6d10
-bf6d10be6d10be6c10be6c10be6b10bd6b10bd6b10bd6a10bd6a10bd6910bc6910bc6910bc6810bb
-6810bb6710bb6710bb6610ba6610ba6510ba6510ba6410b96410b96310b96310
-
-c37511c37511c37511c37511c37411c37411c37411c37411c37411c37411c37411c37311c37311c2
-7311c27311c27311c27211c27211c27211c27211c17211c17111c17111c17111c17111c17011c170
-11c07011c07011c06f11c06f11c06f11c06e11bf6e11bf6e11bf6d10bf6d10be6d10be6c10be6c10
-be6c10be6b10bd6b10bd6b10bd6a10bd6a10bd6910bc6910bc6910bc6810bb6810bb6710bb6710bb
-6610bb6610ba6610ba6510ba6510b96410b96410b96310b96310b96310b96310
-
-c37411c37411c37311c37311c27311c27311c27311c27311c27311c27311c27211c27211c27211c2
-7211c17211c17111c17111c17111c17111c17111c17011c17011c07011c07011c06f11c06f11c06f
-11c06f11c06e11bf6e11bf6e11bf6d10bf6d10bf6d10be6c10be6c10be6c10be6b10be6b10bd6b10
-bd6a10bd6a10bd6a10bd6910bc6910bc6910bc6810bc6810bb6710bb6710bb6710bb6610ba6610ba
-6510ba6510ba6410b96410b96310b96310b96310b96310b96310b96310b96310
-
-c27211c27211c27211c27211c27211c27211c17211c17211c17111c17111c17111c17111c17111c1
-7111c17011c17011c07011c07011c07011c06f11c06f11c06f11c06f11c06e11bf6e11bf6e11bf6e
-11bf6d10bf6d10bf6d10be6c10be6c10be6c10be6c10be6b10bd6b10bd6b10bd6a10bd6a10bd6a10
-bc6910bc6910bc6810bc6810bb6810bb6710bb6710bb6710bb6610ba6610ba6510ba6510ba6410b9
-6410b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c17111c17111c17111c17111c17111c17111c17011c17011c17011c07011c07011c07011c06f11c0
-6f11c06f11c06f11c06f11c06e11c06e11bf6e11bf6e11bf6e11bf6d10bf6d10bf6d10be6d10be6c
-10be6c10be6c10be6c10be6b10bd6b10bd6b10bd6a10bd6a10bd6a10bd6910bc6910bc6910bc6810
-bc6810bb6810bb6710bb6710bb6610bb6610ba6610ba6510ba6510ba6510b96410b96410b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c07011c07011c07011c07011c06f11c06f11c06f11c06f11c06f11c06f11c06f11c06e11bf6e11bf
-6e11bf6e11bf6e11bf6d10bf6d10bf6d10bf6d10be6d10be6c10be6c10be6c10be6c10be6b10be6b
-10bd6b10bd6b10bd6a10bd6a10bd6a10bd6910bc6910bc6910bc6810bc6810bc6810bb6710bb6710
-bb6710bb6610bb6610ba6610ba6510ba6510ba6510b96410b96410b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c06f11c06e11c06e11bf6e11bf6e11bf6e11bf6e11bf6e11bf6e11bf6d10bf6d10bf6d10bf6d10be
-6d10be6d10be6c10be6c10be6c10be6c10be6c10be6b10be6b10bd6b10bd6b10bd6a10bd6a10bd6a
-10bd6a10bd6910bc6910bc6910bc6810bc6810bc6810bb6810bb6710bb6710bb6710bb6610ba6610
-ba6510ba6510ba6510ba6410b96410b96410b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bf6d10bf6d10bf6d10bf6d10bf6d10be6d10be6d10be6c10be6c10be6c10be6c10be6c10be6c10be
-6b10be6b10be6b10bd6b10bd6b10bd6a10bd6a10bd6a10bd6a10bd6a10bd6910bc6910bc6910bc69
-10bc6810bc6810bc6810bb6710bb6710bb6710bb6710bb6610ba6610ba6610ba6510ba6510ba6510
-ba6410b96410b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-be6c10be6c10be6c10be6c10be6c10be6b10be6b10be6b10be6b10bd6b10bd6b10bd6b10bd6a10bd
-6a10bd6a10bd6a10bd6a10bd6910bc6910bc6910bc6910bc6910bc6810bc6810bc6810bb6810bb67
-10bb6710bb6710bb6710bb6610ba6610ba6610ba6510ba6510ba6510ba6410b96410b96410b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bd6b10bd6b10bd6b10bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd6a10bd6910bd6910bc6910bc
-6910bc6910bc6910bc6810bc6810bc6810bb6810bb6810bb6710bb6710bb6710bb6710bb6610bb66
-10ba6610ba6610ba6510ba6510ba6510ba6410b96410b96410b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bd6910bd6910bc6910bc6910bc6910bc6910bc6910bc6910bc6810bc6810bc6810bc6810bc6810bb
-6810bb6710bb6710bb6710bb6710bb6710bb6610bb6610bb6610ba6610ba6610ba6510ba6510ba65
-10ba6510ba6410b96410b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bc6810bc6810bc6810bc6810bb6810bb6810bb6710bb6710bb6710bb6710bb6710bb6710bb6710bb
-6610bb6610bb6610ba6610ba6610ba6510ba6510ba6510ba6510ba6510ba6410b96410b96410b964
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bb6710bb6710bb6710bb6710bb6610bb6610bb6610bb6610ba6610ba6610ba6610ba6510ba6510ba
-6510ba6510ba6510ba6510ba6410b96410b96410b96410b96410b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-ba6610ba6610ba6510ba6510ba6510ba6510ba6510ba6510ba6510ba6510ba6410b96410b96410b9
-6410b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-ba6410b96410b96410b96410b96410b96410b96410b96410b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-Q
-Q
-Q
-Q
-q
-q
-n
-204 75 m
-268 75 l
-268 11 l
-204 11 l
-204 75 l
-h
-W
-q
-q
-[64 0 0 64 204 11]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-ce8512ce8512cd8412cd8312cd8312cc8212cc8212cc8112cb8112cb8012cb8012ca8012ca7f12c9
-7f12c97e12c97e12c87d12c87c12c87c12c77b12c77a12c67a12c67912c67912c57811c57711c476
-11c47611c47511c37411c37411c27311c27211c17111c17111c07011c06f11bf6e11bf6d10be6d10
-be6c10be6b10bd6a10bd6a10bc6910bc6810bb6710bb6610ba6510ba6510b96410b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cd8412cd8312cd8312cc8212cc8212cc8112cb8112cb8012cb8012ca8012ca8012ca7f12c97e12c9
-7e12c87d12c87d12c87c12c77b12c77b12c77a12c67a12c67912c67912c57811c57711c47611c475
-11c37511c37411c27311c27211c27211c17111c17011c06f11c06f11bf6e11bf6d10be6c10be6c10
-bd6b10bd6a10bd6910bc6810bb6810bb6710bb6610ba6510ba6410b96410b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cd8312cc8212cc8212cc8112cb8112cb8012cb8012ca8012ca8012ca7f12c97e12c97e12c97d12c8
-7d12c87c12c77c12c77b12c77a12c67a12c67912c67912c57811c57711c47611c47611c47511c374
-11c37411c27311c27211c17111c17111c07011c06f11c06e11bf6e11bf6d10be6c10be6b10bd6b10
-bd6a10bc6910bc6810bb6710bb6710ba6610ba6510ba6410b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cc8212cc8112cc8112cb8012cb8012ca8012ca8012ca7f12c97f12c97e12c97e12c87d12c87c12c8
-7c12c77b12c77b12c67a12c67a12c67912c57811c57811c57711c47611c47511c37511c37411c373
-11c27311c27211c17111c17011c07011c06f11bf6e11bf6d10be6d10be6c10be6b10bd6a10bd6a10
-bc6910bc6810bb6710bb6610ba6610ba6510b96410b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cc8112cb8012cb8012cb8012ca8012ca7f12c97f12c97e12c97e12c87d12c87d12c87c12c77b12c7
-7b12c77a12c67a12c67912c67912c57811c57711c47611c47611c47511c37411c37411c27311c272
-11c17211c17111c17011c06f11c06f11bf6e11bf6d10be6c10be6c10bd6b10bd6a10bd6910bc6910
-bc6810bb6710bb6610ba6510ba6510b96410b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cb8012cb8012ca8012ca7f12ca7f12c97e12c97e12c97d12c87d12c87c12c77c12c77b12c77a12c6
-7a12c67912c67912c57811c57711c47711c47611c47511c37511c37411c37311c27311c27211c171
-11c17011c07011c06f11c06e11bf6e11bf6d10be6c10be6b10bd6b10bd6a10bc6910bc6810bb6810
-bb6710bb6610ba6510ba6410b96410b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-ca8012ca7f12ca7f12c97e12c97e12c97d12c87d12c87c12c87c12c77b12c77b12c67a12c67a12c6
-7912c57811c57811c57711c47611c47611c37511c37411c37411c27311c27211c17211c17111c170
-11c06f11c06f11bf6e11bf6d10be6d10be6c10be6b10bd6a10bd6a10bc6910bc6810bb6710bb6710
-ba6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-ca7f12c97e12c97e12c97d12c87d12c87c12c87c12c77b12c77b12c77a12c67a12c67912c67912c5
-7811c57711c47611c47611c47511c37511c37411c27311c27211c27211c17111c17011c07011c06f
-11c06e11bf6e11bf6d10be6c10be6b10bd6b10bd6a10bd6910bc6910bc6810bb6710bb6610ba6610
-ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c97e12c97d12c87d12c87c12c87c12c77b12c77b12c77a12c67a12c67912c67912c57811c57711c4
-7711c47611c47511c37511c37411c37311c27311c27211c17111c17111c17011c06f11c06f11bf6e
-11bf6d10be6d10be6c10be6b10bd6a10bd6a10bc6910bc6810bb6710bb6710ba6610ba6510ba6410
-b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c87d12c87c12c87c12c77b12c77b12c77a12c67a12c67912c67912c57811c57711c57711c47611c4
-7611c37511c37411c37411c27311c27211c17211c17111c17011c07011c06f11c06e11bf6e11bf6d
-10be6c10be6b10bd6b10bd6a10bd6910bc6910bc6810bb6710bb6610ba6610ba6510b96410b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c87c12c77b12c77b12c77a12c67a12c67912c67912c57811c57811c57711c47611c47611c47511c3
-7411c37411c27311c27311c27211c17111c17111c07011c06f11c06f11bf6e11bf6d10be6d10be6c
-10be6b10bd6a10bd6a10bc6910bc6810bb6810bb6710bb6610ba6510ba6510b96410b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c77b12c77a12c67a12c67912c67912c57811c57811c57711c47611c47611c47511c37511c37411c3
-7311c27311c27211c17111c17111c17011c06f11c06f11bf6e11bf6d10bf6d10be6c10be6b10bd6b
-10bd6a10bd6910bc6910bc6810bb6710bb6710ba6610ba6510ba6410b96410b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c67a12c67912c67912c57811c57811c57711c47611c47611c47511c37511c37411c37311c27311c2
-7211c17211c17111c17011c07011c06f11c06e11bf6e11bf6d10be6c10be6c10be6b10bd6a10bd6a
-10bc6910bc6810bb6810bb6710bb6610ba6510ba6510b96410b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c67912c57811c57811c57711c47611c47611c47511c37511c37411c37411c27311c27211c17211c1
-7111c17011c07011c06f11c06f11bf6e11bf6d10be6d10be6c10be6b10bd6b10bd6a10bd6910bc69
-10bc6810bb6710bb6610ba6610ba6510ba6410b96410b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c57811c57711c47611c47611c47511c37511c37411c37411c27311c27211c27211c17111c17111c0
-7011c06f11c06f11bf6e11bf6d10bf6d10be6c10be6b10bd6b10bd6a10bd6a10bc6910bc6810bb67
-10bb6710bb6610ba6510ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c47611c47611c47511c37511c37411c37411c27311c27211c27211c17111c17111c17011c06f11c0
-6f11bf6e11bf6e11bf6d10be6c10be6c10be6b10bd6a10bd6a10bc6910bc6810bb6810bb6710bb66
-10ba6610ba6510ba6410b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c47511c37511c37411c37411c27311c27211c27211c17111c17111c17011c07011c06f11c06e11bf
-6e11bf6d10be6c10be6c10be6b10bd6b10bd6a10bd6910bc6910bc6810bb6710bb6710ba6610ba65
-10ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c37411c37311c27311c27211c27211c17111c17111c17011c07011c06f11c06e11bf6e11bf6d10be
-6d10be6c10be6b10bd6b10bd6a10bd6910bc6910bc6810bb6810bb6710bb6610ba6610ba6510b964
-10b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c27311c27211c27211c17111c17111c17011c07011c06f11c06e11bf6e11bf6d10be6d10be6c10be
-6b10bd6b10bd6a10bd6a10bc6910bc6810bb6810bb6710bb6610ba6610ba6510ba6410b96410b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c17211c17111c17111c17011c07011c06f11c06e11bf6e11bf6d10be6d10be6c10be6c10bd6b10bd
-6a10bd6a10bc6910bc6810bc6810bb6710bb6710ba6610ba6510ba6510b96410b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c17111c17011c06f11c06f11c06e11bf6e11bf6d10be6d10be6c10be6c10bd6b10bd6a10bd6a10bc
-6910bc6910bc6810bb6710bb6710bb6610ba6510ba6510b96410b96410b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c06f11c06f11c06e11bf6e11bf6d10be6d10be6c10be6c10bd6b10bd6a10bd6a10bc6910bc6910bc
-6810bb6710bb6710bb6610ba6610ba6510ba6410b96410b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bf6e11bf6e11bf6d10be6d10be6c10be6c10bd6b10bd6a10bd6a10bd6910bc6910bc6810bb6810bb
-6710bb6610ba6610ba6510ba6410b96410b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bf6d10be6d10be6c10be6b10bd6b10bd6a10bd6a10bc6910bc6910bc6810bb6810bb6710bb6610ba
-6610ba6510ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-be6c10be6b10bd6b10bd6a10bd6a10bc6910bc6910bc6810bb6810bb6710bb6610ba6610ba6510ba
-6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bd6b10bd6a10bd6a10bc6910bc6910bc6810bb6710bb6710bb6610ba6610ba6510ba6510b96410b9
-6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bd6a10bc6910bc6810bc6810bb6710bb6710bb6610ba6610ba6510ba6510b96410b96410b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bc6810bc6810bb6710bb6710bb6610ba6610ba6510ba6510b96410b96410b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bb6710bb6710bb6610ba6610ba6510ba6510b96410b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bb6610ba6510ba6510ba6410b96410b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-ba6510ba6410b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-Q
-Q
-Q
-Q
-q
-q
-n
-268 75 m
-332 75 l
-332 11 l
-268 11 l
-268 75 l
-h
-W
-q
-q
-[64 0 0 64 268 11]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-Q
-Q
-Q
-Q
-q
-q
-n
-12 139 m
-76 139 l
-76 75 l
-12 75 l
-12 139 l
-h
-W
-q
-q
-[64 0 0 64 12 75]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-e1a315e1a415e2a515e2a515e3a615e3a715e4a715e4a815e4a915e5aa15e5aa15e6ab15e6ac15e6
-ac15e7ad15e7ae16e8ae16e8af16e8b016e9b016e9b116e9b216eab216eab316ebb416ebb416ebb5
-16ecb616ecb616ecb716edb716edb816edb916eeb916eeba16efbb17efbb17efbb17efbc17efbc17
-f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1bf17f1bf17f2bf17f2c017f2c017f2c017f2
-c017f3c117f3c117f3c117f3c217f3c217f4c217f4c217f4c317f4c317f4c317
-
-e1a315e1a315e2a415e2a515e2a515e3a615e3a715e4a815e4a815e4a915e5aa15e5aa15e6ab15e6
-ac15e6ac15e7ad15e7ae16e8ae16e8af16e8b016e9b116e9b116e9b216eab216eab316ebb416ebb4
-16ebb516ecb616ecb616ecb716edb716edb816edb916eeb916eeba16efbb17efbb17efbb17efbc17
-efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1be17f1bf17f2bf17f2bf17f2c017f2
-c017f2c017f3c117f3c117f3c117f3c117f3c217f3c217f4c217f4c317f4c317
-
-e0a215e1a315e1a415e2a415e2a515e2a615e3a615e3a715e4a815e4a815e4a915e5aa15e5aa15e6
-ab15e6ac15e6ac15e7ad15e7ae16e8af16e8af16e8b016e9b116e9b116e9b216eab216eab316ebb4
-16ebb416ebb516ecb616ecb616ecb716edb716edb816edb916eeb916eeba16efbb17efbb17efbb17
-efbc17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf17f2bf17f2
-c017f2c017f2c017f2c017f3c117f3c117f3c117f3c217f3c217f4c217f4c217
-
-e0a115e0a215e1a315e1a415e2a415e2a515e2a615e3a615e3a715e4a815e4a915e5a915e5aa15e5
-aa15e6ab15e6ac15e6ad15e7ad15e7ae16e8af16e8af16e8b016e9b116e9b116e9b216eab216eab3
-16ebb416ebb416ebb516ecb616ecb616ecb716edb716edb816edb916eeb916eeba16eeba16efbb17
-efbb17efbb17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1bf17f1bf17f2
-bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c117f3c117f3c217f3c217
-
-e0a115e0a215e1a215e1a315e1a415e2a415e2a515e3a615e3a715e3a715e4a815e4a915e5a915e5
-aa15e5ab15e6ab15e6ac15e6ad15e7ad15e7ae16e8af16e8af16e8b016e9b116e9b116e9b216eab2
-16eab316ebb416ebb416ebb516ecb616ecb616ecb716edb716edb816edb916eeb916eeba16eeba16
-efbb17efbb17efbb17efbc17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1be17f1
-bf17f2bf17f2bf17f2c017f2c017f2c017f2c017f3c117f3c117f3c117f3c117
-
-dfa014e0a115e0a215e1a215e1a315e1a415e2a515e2a515e3a615e3a715e3a715e4a815e4a915e5
-a915e5aa15e5ab15e6ab15e6ac15e6ad15e7ad15e7ae16e8af16e8af16e8b016e9b116e9b116e9b2
-16eab216eab316eab416ebb416ebb516ecb516ecb616ecb716edb716edb816edb816eeb916eeba16
-eeba16efbb17efbb17efbb17efbc17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1
-be17f1bf17f1bf17f2bf17f2bf17f2c017f2c017f2c017f2c017f3c117f3c117
-
-dfa014e0a115e0a115e0a215e1a215e1a315e1a415e2a515e2a515e3a615e3a715e3a715e4a815e4
-a915e5a915e5aa15e5ab15e6ab15e6ac15e6ad15e7ad15e7ae16e8af16e8af16e8b016e9b116e9b1
-16e9b216eab216eab316eab416ebb416ebb516ecb516ecb616ecb716edb716edb816edb816eeb916
-eeb916eeba16efbb17efbb17efbb17efbb17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f1be17f1
-be17f1be17f1be17f1bf17f1bf17f2bf17f2c017f2c017f2c017f2c017f3c117
-
-de9f14dfa014e0a115e0a115e0a215e1a315e1a315e2a415e2a515e2a515e3a615e3a715e4a715e4
-a815e4a915e5a915e5aa15e5ab15e6ab15e6ac15e6ad15e7ad15e7ae16e8af16e8af16e8b016e9b0
-16e9b116e9b216eab216eab316eab316ebb416ebb516ebb516ecb616ecb616ecb716edb716edb816
-edb916eeb916eeba16eeba16efbb17efbb17efbb17efbc17efbc17f0bc17f0bd17f0bd17f0bd17f0
-bd17f1be17f1be17f1be17f1be17f1bf17f2bf17f2bf17f2c017f2c017f2c017
-
-de9e14df9f14dfa014e0a115e0a115e0a215e1a315e1a315e2a415e2a515e2a515e3a615e3a715e4
-a715e4a815e4a915e5a915e5aa15e5ab15e6ab15e6ac15e6ad15e7ad15e7ae16e8af16e8af16e8b0
-16e9b016e9b116e9b216eab216eab316eab316ebb416ebb416ebb516ecb616ecb616ecb716edb716
-edb816edb916eeb916eeba16eeba16efbb17efbb17efbb17efbc17efbc17f0bc17f0bc17f0bd17f0
-bd17f0bd17f0bd17f1be17f1be17f1be17f1bf17f1bf17f2bf17f2bf17f2c017
-
-de9d14de9e14df9f14dfa014e0a115e0a115e0a215e1a315e1a415e2a415e2a515e2a515e3a615e3
-a715e4a715e4a815e4a915e5a915e5aa15e5ab15e6ab15e6ac15e6ad15e7ad15e7ae16e8ae16e8af
-16e8b016e9b016e9b116e9b116eab216eab316eab316ebb416ebb416ebb516ecb616ecb616ecb716
-edb716edb816edb816eeb916eeb916eeba16efbb17efbb17efbb17efbb17efbc17efbc17f0bc17f0
-bd17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1be17f1bf17f1bf17f2bf17
-
-dd9d14de9d14de9e14df9f14dfa014e0a115e0a215e0a215e1a315e1a415e2a415e2a515e2a515e3
-a615e3a715e4a715e4a815e4a915e5a915e5aa15e5ab15e6ab15e6ac15e6ad15e7ad15e7ae16e8ae
-16e8af16e8b016e9b016e9b116e9b116eab216eab216eab316ebb416ebb416ebb516ecb516ecb616
-ecb716edb716edb816edb816edb916eeb916eeba16eeba16efbb17efbb17efbb17efbc17efbc17f0
-bc17f0bc17f0bd17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1be17f1bf17
-
-dd9c14dd9d14de9e14de9f14df9f14dfa014e0a115e0a215e1a215e1a315e1a415e2a415e2a515e2
-a515e3a615e3a715e4a715e4a815e4a915e5a915e5aa15e5ab15e6ab15e6ac15e6ac15e7ad15e7ae
-16e7ae16e8af16e8af16e9b016e9b116e9b116e9b216eab216eab316eab416ebb416ebb516ebb516
-ecb616ecb616ecb716edb716edb816edb816eeb916eeb916eeba16efbb17efbb17efbb17efbb17ef
-bc17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f0bd17f1be17f1be17f1be17
-
-dc9b14dd9c14dd9d14de9e14de9f14df9f14dfa014e0a115e0a215e1a215e1a315e1a415e2a415e2
-a515e2a515e3a615e3a715e4a715e4a815e4a915e5a915e5aa15e5ab15e6ab15e6ac15e6ac15e7ad
-15e7ae16e7ae16e8af16e8af16e8b016e9b116e9b116e9b216eab216eab316eab316ebb416ebb416
-ebb516ecb616ecb616ecb716edb716edb816edb816edb916eeb916eeba16eeba16efbb17efbb17ef
-bb17efbb17efbc17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f0bd17f1be17
-
-dc9a14dc9b14dd9c14dd9d14de9e14de9f14df9f14dfa014e0a115e0a215e1a215e1a315e1a415e2
-a415e2a515e2a515e3a615e3a715e4a715e4a815e4a915e5a915e5aa15e5aa15e6ab15e6ac15e6ac
-15e7ad15e7ae16e7ae16e8af16e8af16e8b016e9b016e9b116e9b216eab216eab316eab316ebb416
-ebb416ebb516ecb516ecb616ecb616ecb716edb716edb816edb916eeb916eeb916eeba16eeba16ef
-bb17efbb17efbb17efbc17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f0bd17
-
-db9a14dc9b14dc9b14dd9c14dd9d14de9e14de9f14df9f14dfa014e0a115e0a215e1a215e1a315e1
-a415e2a415e2a515e2a515e3a615e3a715e4a715e4a815e4a915e5a915e5aa15e5aa15e6ab15e6ac
-15e6ac15e7ad15e7ad15e7ae16e8af16e8af16e8b016e9b016e9b116e9b116eab216eab216eab316
-eab416ebb416ebb516ebb516ecb616ecb616ecb716edb716edb816edb816edb916eeb916eeba16ee
-ba16efbb17efbb17efbb17efbb17efbc17efbc17f0bc17f0bc17f0bd17f0bd17
-
-db9914db9a14dc9b14dc9b14dd9c14dd9d14de9e14de9f14df9f14dfa014e0a115e0a215e1a215e1
-a315e1a415e2a415e2a515e2a515e3a615e3a715e3a715e4a815e4a915e5a915e5aa15e5aa15e6ab
-15e6ac15e6ac15e6ad15e7ad15e7ae16e8ae16e8af16e8b016e9b016e9b116e9b116e9b216eab216
-eab316eab316ebb416ebb416ebb516ecb516ecb616ecb616ecb716edb716edb816edb816eeb916ee
-b916eeba16eeba16efbb17efbb17efbb17efbb17efbc17efbc17f0bc17f0bc17
-
-da9814db9914db9a14dc9b14dc9b14dd9c14dd9d14de9e14de9f14dfa014dfa014e0a115e0a215e1
-a215e1a315e1a415e2a415e2a515e2a515e3a615e3a715e3a715e4a815e4a915e4a915e5aa15e5aa
-15e5ab15e6ab15e6ac15e6ad15e7ad15e7ae16e7ae16e8af16e8af16e8b016e9b116e9b116e9b216
-eab216eab316eab316ebb416ebb416ebb516ebb516ecb616ecb616ecb716edb716edb816edb816ed
-b916eeb916eeb916eeba16eeba16efbb17efbb17efbb17efbb17efbc17efbc17
-
-da9714da9814db9914db9a14dc9b14dc9b14dd9c14dd9d14de9e14de9f14dfa014dfa014e0a115e0
-a215e1a215e1a315e1a415e2a415e2a515e2a515e3a615e3a715e3a715e4a815e4a815e4a915e5aa
-15e5aa15e5ab15e6ab15e6ac15e6ac15e7ad15e7ae16e7ae16e8af16e8af16e8b016e9b016e9b116
-e9b116e9b216eab216eab316eab316ebb416ebb416ebb516ecb516ecb616ecb616ecb716edb716ed
-b816edb816edb916eeb916eeba16eeba16eeba16efbb17efbb17efbb17efbb17
-
-d99714da9714da9814db9914db9a14dc9b14dc9b14dd9c14dd9d14de9e14de9f14df9f14dfa014e0
-a115e0a215e1a215e1a315e1a415e2a415e2a515e2a515e3a615e3a715e3a715e4a815e4a815e4a9
-15e5a915e5aa15e5ab15e6ab15e6ac15e6ac15e7ad15e7ad15e7ae16e8ae16e8af16e8af16e8b016
-e9b116e9b116e9b216eab216eab316eab316eab416ebb416ebb516ebb516ecb616ecb616ecb616ec
-b716edb716edb816edb816edb916eeb916eeba16eeba16eeba16efbb17efbb17
-
-d99614d99714da9714da9814db9914db9a14dc9b14dc9b14dd9c14dd9d14de9e14de9f14df9f14df
-a014e0a115e0a215e0a215e1a315e1a315e2a415e2a515e2a515e3a615e3a615e3a715e4a815e4a8
-15e4a915e5a915e5aa15e5aa15e6ab15e6ac15e6ac15e6ad15e7ad15e7ae16e7ae16e8af16e8af16
-e8b016e9b016e9b116e9b116eab216eab216eab316eab316ebb416ebb416ebb516ebb516ecb616ec
-b616ecb716edb716edb716edb816edb816edb916eeb916eeba16eeba16eeba16
-
-d89514d99614d99714da9714da9814db9914db9a14dc9b14dc9b14dd9c14dd9d14de9e14de9f14df
-9f14dfa014e0a115e0a215e0a215e1a315e1a315e1a415e2a415e2a515e2a615e3a615e3a715e4a7
-15e4a815e4a915e5a915e5aa15e5aa15e5ab15e6ab15e6ac15e6ac15e7ad15e7ae16e7ae16e8af16
-e8af16e8b016e9b016e9b116e9b116e9b216eab216eab216eab316eab416ebb416ebb416ebb516ec
-b516ecb616ecb616ecb716edb716edb716edb816edb816edb916eeb916eeba16
-
-d89414d89514d99614d99714da9714da9814db9914db9a14dc9b14dc9b14dd9c14dd9d14de9e14de
-9f14df9f14dfa014e0a115e0a115e0a215e1a315e1a315e1a415e2a415e2a515e2a515e3a615e3a7
-15e3a715e4a815e4a815e4a915e5aa15e5aa15e5ab15e6ab15e6ac15e6ac15e7ad15e7ad15e7ae16
-e8ae16e8af16e8af16e8b016e9b016e9b116e9b116e9b216eab216eab316eab316ebb416ebb416eb
-b516ebb516ecb616ecb616ecb616ecb716edb716edb716edb816edb816edb916
-
-d79314d89414d89514d99614d99714da9714da9814db9914db9a14dc9b14dc9b14dd9c14dd9d14de
-9e14de9f14df9f14dfa014e0a115e0a115e0a215e1a215e1a315e1a415e2a415e2a515e2a515e3a6
-15e3a715e3a715e4a815e4a815e4a915e5a915e5aa15e5aa15e6ab15e6ac15e6ac15e6ad15e7ad15
-e7ae16e7ae16e8af16e8af16e8b016e8b016e9b116e9b116e9b116eab216eab216eab316eab316eb
-b416ebb416ebb516ebb516ecb616ecb616ecb616ecb716edb716edb716edb816
-
-d79313d79314d89414d89514d99614d99714da9714da9814db9914db9a14dc9b14dc9b14dd9c14dd
-9d14de9e14de9f14df9f14dfa014e0a115e0a115e0a215e1a215e1a315e1a415e2a415e2a515e2a5
-15e3a615e3a615e3a715e4a715e4a815e4a915e5a915e5aa15e5aa15e5ab15e6ab15e6ac15e6ac15
-e7ad15e7ad15e7ae16e8ae16e8af16e8af16e8b016e9b016e9b116e9b116e9b216eab216eab216ea
-b316eab316ebb416ebb416ebb516ebb516ecb616ecb616ecb616ecb716edb716
-
-d69213d79313d79314d89414d89514d99614d99714da9714da9814db9914db9a14dc9b14dc9b14dd
-9c14dd9d14de9e14de9e14df9f14dfa014e0a115e0a115e0a215e1a215e1a315e1a415e2a415e2a5
-15e2a515e2a615e3a615e3a715e3a715e4a815e4a815e4a915e5a915e5aa15e5aa15e6ab15e6ac15
-e6ac15e6ad15e7ad15e7ae16e7ae16e8af16e8af16e8af16e8b016e9b016e9b116e9b116e9b216ea
-b216eab316eab316eab316ebb416ebb416ebb516ebb516ecb616ecb616ecb616
-
-d69113d69213d79313d79314d89414d89514d99614d99714da9714da9814db9914db9a14dc9b14dc
-9b14dd9c14dd9d14de9d14de9e14df9f14dfa014e0a115e0a115e0a215e0a215e1a315e1a315e1a4
-15e2a415e2a515e2a515e3a615e3a715e3a715e4a815e4a815e4a915e5a915e5aa15e5aa15e5ab15
-e6ab15e6ac15e6ac15e7ad15e7ad15e7ae16e7ae16e8af16e8af16e8b016e8b016e9b116e9b116e9
-b116e9b216eab216eab316eab316eab316ebb416ebb416ebb516ebb516ecb516
-
-d59013d69113d69213d79313d79314d89414d89514d99614d99714da9714da9814db9914db9a14dc
-9a14dc9b14dd9c14dd9d14de9d14de9e14de9f14dfa014dfa014e0a115e0a115e0a215e1a315e1a3
-15e1a415e2a415e2a515e2a515e3a615e3a615e3a715e4a715e4a815e4a915e4a915e5aa15e5aa15
-e5aa15e6ab15e6ac15e6ac15e6ac15e7ad15e7ae16e7ae16e8ae16e8af16e8af16e8b016e9b016e9
-b116e9b116e9b116e9b216eab216eab316eab316eab316ebb416ebb416ebb516
-
-d58f13d59013d69113d69213d79313d79314d89414d89514d99614d99714da9714da9814db9914db
-9914dc9a14dc9b14dd9c14dd9d14dd9d14de9e14de9f14df9f14dfa014e0a115e0a115e0a215e1a2
-15e1a315e1a415e2a415e2a515e2a515e2a615e3a615e3a715e3a715e4a815e4a815e4a915e5a915
-e5aa15e5aa15e5ab15e6ab15e6ac15e6ac15e6ad15e7ad15e7ae16e7ae16e8ae16e8af16e8af16e8
-b016e9b016e9b116e9b116e9b116e9b216eab216eab316eab316eab316ebb416
-
-d48f13d58f13d59013d69113d69213d79313d79314d89414d89514d99614d99614da9714da9814db
-9914db9914db9a14dc9b14dc9c14dd9c14dd9d14de9e14de9f14df9f14dfa014e0a115e0a115e0a2
-15e1a215e1a315e1a315e1a415e2a415e2a515e2a515e3a615e3a715e3a715e4a715e4a815e4a915
-e4a915e5a915e5aa15e5aa15e5ab15e6ab15e6ac15e6ac15e7ad15e7ad15e7ae16e7ae16e8af16e8
-af16e8af16e8b016e9b016e9b116e9b116e9b116e9b216eab216eab216eab316
-
-d48e13d48f13d58f13d59013d69113d69213d79313d79314d89414d89514d99614d99614d99714da
-9814da9914db9914db9a14dc9b14dc9b14dd9c14dd9d14de9e14de9e14df9f14dfa014dfa014e0a1
-15e0a215e0a215e1a315e1a315e1a415e2a415e2a515e2a515e2a615e3a615e3a715e3a715e4a815
-e4a815e4a915e5a915e5aa15e5aa15e5ab15e6ab15e6ac15e6ac15e6ac15e7ad15e7ad15e7ae16e7
-ae16e8af16e8af16e8af16e8b016e9b016e9b116e9b116e9b116e9b216eab216
-
-d38d13d48e13d48f13d58f13d59013d69113d69213d79313d79314d79414d89514d89514d99614d9
-9714da9814da9814db9914db9a14dc9b14dc9b14dd9c14dd9d14de9d14de9e14de9f14df9f14dfa0
-14e0a115e0a115e0a215e1a215e1a315e1a315e1a415e2a415e2a515e2a515e3a615e3a715e3a715
-e4a715e4a815e4a815e4a915e5a915e5aa15e5aa15e5ab15e6ab15e6ac15e6ac15e6ac15e7ad15e7
-ad15e7ae16e7ae16e8af16e8af16e8af16e8b016e9b016e9b116e9b116e9b116
-
-d38c13d38d13d48e13d48f13d58f13d59013d69113d69213d79213d79314d79414d89514d89514d9
-9614d99714da9814da9814db9914db9a14dc9a14dc9b14dd9c14dd9d14dd9d14de9e14de9f14df9f
-14dfa014e0a115e0a115e0a215e0a215e1a315e1a315e1a415e2a415e2a515e2a515e2a615e3a615
-e3a715e3a715e4a815e4a815e4a915e4a915e5a915e5aa15e5aa15e5ab15e6ab15e6ac15e6ac15e6
-ac15e7ad15e7ad15e7ae16e7ae16e8af16e8af16e8af16e8b016e8b016e9b016
-
-d28b13d38c13d38d13d48e13d48f13d58f13d59013d69113d69113d79213d79314d79414d89514d8
-9514d99614d99714da9714da9814db9914db9914dc9a14dc9b14dc9c14dd9c14dd9d14de9e14de9e
-14df9f14dfa014dfa014e0a115e0a115e0a215e1a215e1a315e1a415e1a415e2a415e2a515e2a515
-e3a615e3a615e3a715e3a715e4a815e4a815e4a915e4a915e5aa15e5aa15e5aa15e5ab15e6ab15e6
-ac15e6ac15e6ac15e7ad15e7ad15e7ae16e7ae16e8ae16e8af16e8af16e8af16
-
-d28b13d28b13d38c13d38d13d48e13d48e13d58f13d59013d59113d69113d69213d79314d79414d8
-9414d89514d99614d99714da9714da9814da9914db9914db9a14dc9b14dc9b14dd9c14dd9d14de9d
-14de9e14de9f14df9f14dfa014e0a115e0a115e0a215e0a215e1a315e1a315e1a415e2a415e2a515
-e2a515e2a615e3a615e3a715e3a715e4a715e4a815e4a815e4a915e5a915e5aa15e5aa15e5aa15e5
-ab15e6ab15e6ac15e6ac15e6ac15e7ad15e7ad15e7ae16e7ae16e8ae16e8af16
-
-d18a13d28b13d28b13d38c13d38d13d38d13d48e13d48f13d59013d59113d69113d69213d79313d7
-9314d89414d89514d99614d99614d99714da9814da9914db9914db9a14dc9b14dc9b14dd9c14dd9d
-14dd9d14de9e14de9f14df9f14dfa014dfa014e0a115e0a115e0a215e1a215e1a315e1a315e1a415
-e2a415e2a515e2a515e2a615e3a615e3a715e3a715e4a715e4a815e4a815e4a915e5a915e5aa15e5
-aa15e5aa15e5ab15e6ab15e6ac15e6ac15e6ac15e7ad15e7ad15e7ae16e7ae16
-
-d08913d18a13d18a13d28b13d28c13d38d13d38d13d48e13d48f13d59013d59013d69113d69213d7
-9313d79314d89414d89514d89514d99614d99714da9714da9814db9914db9a14dc9a14dc9b14dc9c
-14dd9c14dd9d14de9e14de9e14de9f14df9f14dfa014e0a115e0a115e0a215e0a215e1a315e1a315
-e1a415e2a415e2a415e2a515e2a515e3a615e3a615e3a715e3a715e4a815e4a815e4a915e4a915e5
-a915e5aa15e5aa15e5aa15e5ab15e6ab15e6ac15e6ac15e6ac15e6ad15e7ad15
-
-d08813d08913d18a13d18a13d28b13d28c13d38d13d38d13d48e13d48f13d58f13d59013d69113d6
-9213d79213d79314d79414d89514d89514d99614d99714da9714da9814db9914db9914db9a14dc9b
-14dc9b14dd9c14dd9d14dd9d14de9e14de9f14df9f14dfa014dfa014e0a115e0a115e0a215e1a215
-e1a315e1a315e1a415e2a415e2a515e2a515e2a515e3a615e3a615e3a715e3a715e4a815e4a815e4
-a915e4a915e5a915e5aa15e5aa15e5aa15e5ab15e6ab15e6ac15e6ac15e6ac15
-
-cf8713d08813d08913d18913d18a13d28b13d28c13d38d13d38d13d48e13d48f13d58f13d59013d6
-9113d69113d79213d79314d79414d89414d89514d99614d99614d99714da9814da9814db9914db9a
-14dc9a14dc9b14dc9c14dd9c14dd9d14de9e14de9e14de9f14df9f14dfa014e0a115e0a115e0a215
-e0a215e1a215e1a315e1a315e1a415e2a415e2a515e2a515e2a515e3a615e3a615e3a715e3a715e4
-a815e4a815e4a815e4a915e5a915e5aa15e5aa15e5aa15e5ab15e6ab15e6ab15
-
-cf8613cf8713d08813d08913d18913d18a13d28b13d28c13d38c13d38d13d48e13d48f13d58f13d5
-9013d59113d69113d69213d79313d79314d89414d89514d89514d99614d99714da9714da9814db99
-14db9914db9a14dc9b14dc9b14dd9c14dd9d14dd9d14de9e14de9f14df9f14dfa014dfa014e0a115
-e0a115e0a215e0a215e1a315e1a315e1a415e1a415e2a415e2a515e2a515e2a515e3a615e3a615e3
-a715e3a715e4a815e4a815e4a815e4a915e4a915e5a915e5aa15e5aa15e5aa15
-
-ce8513cf8613cf8713d08813d08913d18913d18a13d28b13d28b13d38c13d38d13d48e13d48e13d4
-8f13d59013d59113d69113d69213d79313d79314d79414d89514d89514d99614d99714da9714da98
-14da9914db9914db9a14dc9a14dc9b14dc9c14dd9c14dd9d14de9d14de9e14de9f14df9f14dfa014
-dfa014e0a115e0a115e0a215e1a215e1a315e1a315e1a415e1a415e2a415e2a515e2a515e2a515e3
-a615e3a615e3a715e3a715e4a715e4a815e4a815e4a915e4a915e5a915e5aa15
-
-ce8512ce8513cf8613cf8713d08813d08813d18913d18a13d28b13d28b13d38c13d38d13d38d13d4
-8e13d48f13d59013d59013d69113d69213d79213d79314d79414d89414d89514d99614d99614d997
-14da9814da9814db9914db9914db9a14dc9b14dc9b14dd9c14dd9d14dd9d14de9e14de9e14de9f14
-df9f14dfa014e0a115e0a115e0a115e0a215e1a215e1a315e1a315e1a415e1a415e2a415e2a515e2
-a515e2a515e3a615e3a615e3a715e3a715e4a715e4a815e4a815e4a915e4a915
-
-cd8412ce8512ce8513cf8613cf8713d08713d08813d18913d18a13d18a13d28b13d28c13d38d13d3
-8d13d48e13d48f13d58f13d59013d69113d69113d69213d79313d79314d89414d89514d89514d996
-14d99714da9714da9814da9914db9914db9a14dc9a14dc9b14dc9c14dd9c14dd9d14dd9d14de9e14
-de9f14df9f14dfa014dfa014e0a115e0a115e0a115e0a215e1a215e1a315e1a315e1a415e1a415e2
-a415e2a515e2a515e2a515e3a615e3a615e3a715e3a715e3a715e4a815e4a815
-
-cd8312cd8412ce8412ce8513cf8613cf8713d08713d08813d08913d18913d18a13d28b13d28c13d3
-8c13d38d13d48e13d48f13d58f13d59013d59113d69113d69213d79313d79314d79414d89414d895
-14d99614d99614d99714da9814da9814db9914db9914db9a14dc9b14dc9b14dc9c14dd9c14dd9d14
-de9d14de9e14de9f14df9f14dfa014dfa014e0a115e0a115e0a215e0a215e1a215e1a315e1a315e1
-a415e1a415e2a415e2a515e2a515e2a515e2a615e3a615e3a615e3a715e3a715
-
-cc8212cd8312cd8412ce8412ce8512ce8613cf8713cf8713d08813d08913d18913d18a13d28b13d2
-8b13d38c13d38d13d38d13d48e13d48f13d59013d59013d69113d69113d69213d79313d79314d894
-14d89514d89514d99614d99714da9714da9814da9814db9914db9a14db9a14dc9b14dc9b14dd9c14
-dd9d14dd9d14de9e14de9e14de9f14df9f14dfa014dfa014e0a115e0a115e0a215e0a215e1a215e1
-a315e1a315e1a315e1a415e2a415e2a515e2a515e2a515e2a515e3a615e3a615
-
-cc8112cc8212cd8312cd8312ce8412ce8512ce8613cf8613cf8713d08813d08913d18913d18a13d2
-8b13d28b13d28c13d38d13d38d13d48e13d48f13d58f13d59013d59113d69113d69213d79313d793
-14d79414d89414d89514d99614d99614d99714da9714da9814da9914db9914db9a14dc9a14dc9b14
-dc9b14dd9c14dd9d14dd9d14de9e14de9e14de9f14df9f14dfa014dfa014e0a115e0a115e0a115e0
-a215e1a215e1a315e1a315e1a315e1a415e2a415e2a415e2a515e2a515e2a515
-
-cb8012cc8112cc8212cd8312cd8312ce8412ce8512ce8513cf8613cf8713d08813d08813d18913d1
-8a13d18a13d28b13d28c13d38c13d38d13d48e13d48e13d48f13d59013d59013d69113d69213d792
-13d79313d79314d89414d89514d89514d99614d99714d99714da9814da9814db9914db9914db9a14
-dc9b14dc9b14dc9c14dd9c14dd9d14dd9d14de9e14de9e14de9f14df9f14dfa014dfa014e0a115e0
-a115e0a115e0a215e0a215e1a215e1a315e1a315e1a415e1a415e2a415e2a515
-
-cb8012cb8012cc8112cc8212cc8212cd8312cd8412ce8512ce8513cf8613cf8713d08713d08813d0
-8913d18913d18a13d28b13d28b13d38c13d38d13d38d13d48e13d48f13d58f13d59013d59113d691
-13d69213d79313d79314d79414d89414d89514d89514d99614d99714da9714da9814da9814db9914
-db9914db9a14dc9b14dc9b14dc9c14dd9c14dd9d14dd9d14de9e14de9e14de9f14df9f14dfa014df
-a014e0a115e0a115e0a115e0a215e0a215e1a215e1a315e1a315e1a315e1a415
-
-ca8012cb8012cb8012cb8112cc8112cc8212cd8312cd8412ce8412ce8512ce8613cf8713cf8713d0
-8813d08913d18913d18a13d28b13d28b13d28c13d38d13d38d13d48e13d48e13d48f13d59013d590
-13d69113d69113d69213d79313d79314d79414d89514d89514d99614d99614d99714da9714da9814
-da9914db9914db9a14db9a14dc9b14dc9b14dc9c14dd9c14dd9d14dd9d14de9e14de9e14de9f14df
-9f14dfa014dfa014e0a115e0a115e0a115e0a215e0a215e0a215e1a215e1a315
-
-c97f12ca8012ca8012cb8012cb8112cc8112cc8212cd8312cd8312ce8412ce8512ce8613cf8613cf
-8713d08813d08813d18913d18a13d18a13d28b13d28c13d38c13d38d13d38d13d48e13d48f13d58f
-13d59013d59113d69113d69213d79213d79314d79414d89414d89514d89514d99614d99614d99714
-da9714da9814da9914db9914db9a14db9a14dc9b14dc9b14dc9c14dd9c14dd9d14dd9d14de9e14de
-9e14de9f14df9f14df9f14dfa014dfa014e0a115e0a115e0a115e0a215e0a215
-
-c97e12c97f12ca7f12ca8012cb8012cb8112cc8112cc8212cd8312cd8312cd8412ce8512ce8513cf
-8613cf8713d08713d08813d08913d18913d18a13d28b13d28b13d28c13d38d13d38d13d48e13d48e
-13d48f13d59013d59013d69113d69113d69213d79313d79314d79414d89414d89514d89514d99614
-d99714d99714da9814da9814da9914db9914db9a14db9a14dc9b14dc9b14dc9c14dd9c14dd9d14dd
-9d14de9d14de9e14de9e14de9f14df9f14dfa014dfa014e0a115e0a115e0a115
-
-c87d12c97e12c97e12ca7f12ca8012cb8012cb8012cc8112cc8212cc8212cd8312cd8412ce8412ce
-8512ce8613cf8613cf8713d08813d08813d18913d18a13d18a13d28b13d28c13d38c13d38d13d38d
-13d48e13d48f13d58f13d59013d59013d69113d69213d69213d79313d79314d79414d89414d89514
-d89514d99614d99714d99714da9814da9814da9914db9914db9a14db9a14dc9b14dc9b14dc9b14dd
-9c14dd9d14dd9d14de9d14de9e14de9e14de9f14df9f14df9f14dfa014dfa014
-
-c87c12c87d12c97e12c97e12ca7f12ca8012cb8012cb8012cb8112cc8112cc8212cd8312cd8312ce
-8412ce8512ce8513cf8613cf8713d08713d08813d08913d18913d18a13d28b13d28b13d28c13d38d
-13d38d13d48e13d48e13d48f13d58f13d59013d59113d69113d69213d79213d79313d79314d79414
-d89514d89514d89514d99614d99714d99714da9814da9814da9914db9914db9914db9a14dc9b14dc
-9b14dc9b14dd9c14dd9c14dd9d14dd9d14de9e14de9e14de9e14de9f14df9f14
-
-c77b12c87c12c87d12c97d12c97e12ca7f12ca8012ca8012cb8012cb8112cc8112cc8212cd8312cd
-8312cd8412ce8512ce8513cf8613cf8713cf8713d08813d08813d18913d18a13d18a13d28b13d28b
-13d38c13d38d13d38d13d48e13d48f13d48f13d59013d59013d69113d69113d69213d79213d79314
-d79314d89414d89514d89514d99614d99614d99714d99714da9714da9814da9914db9914db9914db
-9a14dc9a14dc9b14dc9b14dc9c14dd9c14dd9d14dd9d14dd9d14de9e14de9e14
-
-c77a12c77b12c87c12c87c12c87d12c97e12c97f12ca7f12ca8012cb8012cb8012cc8112cc8212cc
-8212cd8312cd8412ce8412ce8512ce8613cf8613cf8713d08713d08813d08913d18913d18a13d28b
-13d28b13d28c13d38c13d38d13d38d13d48e13d48f13d58f13d59013d59013d69113d69113d69213
-d79313d79314d79314d89414d89514d89514d89514d99614d99714d99714da9714da9814da9814db
-9914db9914db9a14db9a14dc9b14dc9b14dc9b14dd9c14dd9c14dd9d14dd9d14
-
-c67a12c77a12c77b12c77c12c87c12c87d12c97e12c97e12ca7f12ca8012cb8012cb8012cb8112cc
-8112cc8212cd8312cd8312cd8412ce8512ce8513cf8613cf8713cf8713d08813d08813d18913d18a
-13d18a13d28b13d28b13d28c13d38d13d38d13d48e13d48e13d48f13d58f13d59013d59013d69113
-d69113d69213d79313d79314d79314d89414d89514d89514d89514d99614d99614d99714da9714da
-9814da9814db9914db9914db9914db9a14dc9a14dc9b14dc9b14dc9c14dd9c14
-
-c67912c67912c67a12c77b12c77b12c87c12c87d12c97e12c97e12ca7f12ca8012ca8012cb8012cb
-8112cc8112cc8212cc8212cd8312cd8412ce8412ce8512ce8613cf8613cf8713d08713d08813d089
-13d18913d18a13d18a13d28b13d28b13d38c13d38d13d38d13d48e13d48e13d48f13d58f13d59013
-d59113d69113d69113d69213d79313d79314d79314d79414d89514d89514d89514d99614d99614d9
-9714da9714da9814da9814da9914db9914db9914db9a14db9a14dc9b14dc9b14
-
-c57811c67912c67912c67a12c77a12c77b12c87c12c87c12c87d12c97e12c97e12ca7f12ca8012cb
-8012cb8012cb8112cc8112cc8212cd8312cd8312cd8412ce8512ce8513cf8613cf8713cf8713d088
-13d08813d08913d18913d18a13d28b13d28b13d28c13d38c13d38d13d38d13d48e13d48e13d48f13
-d58f13d59013d59113d69113d69113d69213d79313d79314d79314d79414d89414d89514d89514d9
-9614d99614d99714d99714da9714da9814da9814da9914db9914db9914db9a14
-
-c47711c57711c57811c67912c67a12c77a12c77b12c77c12c87c12c87d12c97e12c97e12ca7f12ca
-8012ca8012cb8012cb8112cc8112cc8212cc8212cd8312cd8412ce8412ce8512ce8513cf8613cf87
-13cf8713d08813d08813d18913d18a13d18a13d28b13d28b13d28c13d38c13d38d13d38d13d48e13
-d48e13d48f13d58f13d59013d59113d69113d69113d69213d79213d79313d79314d79414d89414d8
-9514d89514d89514d99614d99614d99714da9714da9814da9814da9814db9914
-
-c47611c47611c57711c57811c67912c67912c67a12c77b12c77b12c87c12c87d12c97d12c97e12c9
-7f12ca7f12ca8012cb8012cb8012cb8112cc8112cc8212cd8312cd8312cd8412ce8512ce8512ce86
-13cf8613cf8713d08713d08813d08913d18913d18a13d18a13d28b13d28b13d28c13d38c13d38d13
-d38d13d48e13d48e13d48f13d58f13d59013d59013d69113d69113d69213d79213d79313d79314d7
-9414d89414d89514d89514d89514d99614d99614d99714d99714da9714da9814
-
-c37411c47511c47611c57711c57811c67912c67912c67a12c77a12c77b12c87c12c87c12c87d12c9
-7e12c97e12ca7f12ca8012ca8012cb8012cb8112cc8112cc8212cc8212cd8312cd8312ce8412ce85
-12ce8513cf8613cf8713cf8713d08813d08813d08913d18913d18a13d18a13d28b13d28b13d28c13
-d38c13d38d13d38d13d48e13d48e13d48f13d58f13d59013d59013d69113d69113d69213d69213d7
-9313d79314d79314d79414d89414d89514d89514d89514d99614d99614d99714
-
-c37311c37411c47511c47611c47711c57711c57811c67912c67a12c77a12c77b12c77c12c87c12c8
-7d12c97d12c97e12c97f12ca7f12ca8012cb8012cb8012cb8112cc8112cc8212cd8312cd8312cd84
-12ce8412ce8512ce8513cf8613cf8713cf8713d08813d08813d08913d18913d18a13d18a13d28b13
-d28b13d28c13d38c13d38d13d38d13d48e13d48e13d48f13d58f13d59013d59013d59113d69113d6
-9113d69213d79213d79313d79314d79414d79414d89414d89514d89514d89514
-
-c27211c27311c37411c37511c47611c47611c57711c57811c67912c67912c67a12c77a12c77b12c8
-7c12c87c12c87d12c97e12c97e12ca7f12ca8012ca8012cb8012cb8012cc8112cc8212cc8212cd83
-12cd8312cd8412ce8512ce8512ce8613cf8613cf8713cf8713d08813d08813d08913d18913d18a13
-d18a13d28b13d28b13d28c13d38c13d38d13d38d13d48e13d48e13d48f13d58f13d59013d59013d5
-9113d69113d69113d69213d69213d79313d79314d79314d79414d89414d89514
-
-c17111c27211c27311c37411c37511c47511c47611c57711c57711c57811c67912c67a12c77a12c7
-7b12c77c12c87c12c87d12c97d12c97e12c97f12ca7f12ca8012cb8012cb8012cb8112cc8112cc82
-12cc8212cd8312cd8312ce8412ce8512ce8513ce8613cf8613cf8713cf8713d08813d08813d08913
-d18913d18a13d18a13d28b13d28b13d28c13d38c13d38d13d38d13d48e13d48e13d48f13d48f13d5
-8f13d59013d59013d59113d69113d69113d69213d79213d79313d79314d79314
-
-c17011c17111c27211c27311c37311c37411c37511c47611c47611c57711c57811c67912c67912c6
-7a12c77b12c77b12c87c12c87c12c87d12c97e12c97e12ca7f12ca8012ca8012cb8012cb8012cb81
-12cc8112cc8212cd8312cd8312cd8412ce8412ce8512ce8513ce8613cf8613cf8713cf8713d08813
-d08813d08913d18913d18a13d18a13d28b13d28b13d28c13d38c13d38d13d38d13d38d13d48e13d4
-8e13d48f13d58f13d59013d59013d59013d69113d69113d69113d69213d79213
-
-Q
-Q
-Q
-Q
-q
-q
-n
-76 139 m
-140 139 l
-140 75 l
-76 75 l
-76 139 l
-h
-W
-q
-q
-[64 0 0 64 76 75]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-f5c418f5c419f5c41af5c41bf5c51cf5c51cf5c51ef5c51ef5c51ff5c620f5c621f5c622f5c623f5
-c724f5c724f5c725f5c726f5c727f5c827f5c828f5c829f5c829f5c82af5c82bf5c92bf5c92cf5c9
-2cf5c92df5c92df5c92ef5c92ef5c92ff5ca2ff5ca2ff5ca30f5ca30f5ca31f5ca31f5ca31f5ca31
-f5ca32f5ca32f5ca32f5ca32f5ca32f5ca33f5ca33f5ca33f5ca33f5ca33f5ca33f5ca33f5ca33f5
-ca33f5ca33f5ca33f5ca32f5ca32f5ca32f5ca32f5ca31f5ca31f5ca31f5ca31
-
-f4c317f4c317f5c418f5c419f5c41af5c41bf5c51cf5c51cf5c51df5c51ef5c51ff5c620f5c621f5
-c622f5c622f5c723f5c724f5c724f5c725f5c726f5c727f5c827f5c828f5c829f5c829f5c82af5c8
-2af5c92bf5c92bf5c92cf5c92cf5c92df5c92df5c92df5c92ef5c92ef5c92ff5ca2ff5ca2ff5ca2f
-f5ca2ff5ca30f5ca30f5ca30f5ca30f5ca31f5ca31f5ca31f5ca31f5ca31f5ca31f5ca31f5ca31f5
-ca31f5ca31f5ca30f5ca30f5ca30f5ca30f5ca30f5ca2ff5ca2ff5ca2ff5c92f
-
-f4c317f4c317f4c317f4c317f5c418f5c419f5c41af5c41bf5c51cf5c51cf5c51df5c51ef5c51ff5
-c620f5c620f5c621f5c622f5c622f5c723f5c724f5c724f5c725f5c726f5c727f5c827f5c828f5c8
-28f5c829f5c829f5c82af5c82af5c82bf5c92bf5c92bf5c92cf5c92cf5c92df5c92df5c92df5c92d
-f5c92df5c92ef5c92ef5c92ef5c92ef5c92ef5c92ff5c92ff5c92ff5c92ff5c92ff5c92ff5c92ff5
-c92ff5c92ff5c92ef5c92ef5c92ef5c92ef5c92ef5c92df5c92df5c92df5c92d
-
-f4c217f4c217f4c317f4c317f4c317f4c317f5c418f5c419f5c41af5c41af5c41bf5c51cf5c51df5
-c51ef5c51ef5c51ff5c620f5c621f5c621f5c622f5c623f5c723f5c724f5c724f5c725f5c726f5c7
-26f5c727f5c827f5c828f5c828f5c829f5c829f5c829f5c82af5c82af5c82bf5c82bf5c92bf5c92b
-f5c92bf5c92cf5c92cf5c92cf5c92cf5c92cf5c92df5c92df5c92df5c92df5c92df5c92df5c92df5
-c92df5c92cf5c92cf5c92cf5c92cf5c92cf5c92cf5c92bf5c92bf5c92bf5c82b
-
-f3c217f3c217f4c217f4c217f4c317f4c317f4c317f4c317f5c418f5c419f5c41af5c41af5c41bf5
-c51cf5c51cf5c51df5c51ef5c51ff5c51ff5c620f5c621f5c621f5c622f5c622f5c723f5c724f5c7
-24f5c725f5c725f5c726f5c726f5c727f5c727f5c827f5c828f5c828f5c829f5c829f5c829f5c829
-f5c829f5c82af5c82af5c82af5c82af5c82af5c82af5c82bf5c82bf5c82bf5c82bf5c82bf5c82bf5
-c82bf5c82af5c82af5c82af5c82af5c82af5c829f5c829f5c829f5c829f5c829
-
-f3c117f3c117f3c217f3c217f4c217f4c217f4c317f4c317f4c317f4c317f5c418f5c418f5c419f5
-c41af5c41bf5c41bf5c51cf5c51df5c51ef5c51ef5c51ff5c51ff5c620f5c620f5c621f5c622f5c6
-22f5c623f5c723f5c724f5c724f5c724f5c725f5c725f5c726f5c726f5c727f5c727f5c727f5c827
-f5c827f5c828f5c828f5c828f5c828f5c828f5c828f5c828f5c829f5c829f5c829f5c829f5c829f5
-c828f5c828f5c828f5c828f5c828f5c828f5c827f5c827f5c727f5c727f5c727
-
-f3c117f3c117f3c117f3c117f3c217f3c217f4c217f4c217f4c317f4c317f4c317f4c317f4c317f5
-c418f5c419f5c41af5c41af5c41bf5c51cf5c51cf5c51df5c51ef5c51ef5c51ef5c51ff5c620f5c6
-20f5c621f5c621f5c622f5c622f5c622f5c623f5c723f5c724f5c724f5c724f5c724f5c725f5c725
-f5c725f5c725f5c726f5c726f5c726f5c726f5c726f5c726f5c726f5c727f5c727f5c727f5c726f5
-c726f5c726f5c726f5c726f5c726f5c726f5c725f5c725f5c725f5c724f5c724
-
-f2c017f3c117f3c117f3c117f3c117f3c117f3c217f3c217f4c217f4c217f4c217f4c317f4c317f4
-c317f4c317f5c418f5c418f5c419f5c41af5c41af5c41bf5c51cf5c51cf5c51cf5c51df5c51ef5c5
-1ef5c51ff5c51ff5c620f5c620f5c620f5c621f5c621f5c622f5c622f5c622f5c622f5c623f5c623
-f5c723f5c723f5c724f5c724f5c724f5c724f5c724f5c724f5c724f5c724f5c724f5c724f5c724f5
-c724f5c724f5c724f5c724f5c724f5c724f5c723f5c723f5c623f5c622f5c622
-
-f2c017f2c017f2c017f3c117f3c117f3c117f3c117f3c117f3c217f3c217f4c217f4c217f4c217f4
-c317f4c317f4c317f4c317f4c317f5c418f5c418f5c419f5c41af5c41af5c41bf5c41bf5c51cf5c5
-1cf5c51df5c51df5c51ef5c51ef5c51ef5c51ff5c51ff5c620f5c620f5c620f5c620f5c621f5c621
-f5c621f5c621f5c622f5c622f5c622f5c622f5c622f5c622f5c622f5c622f5c622f5c622f5c622f5
-c622f5c622f5c622f5c622f5c622f5c621f5c621f5c621f5c621f5c620f5c620
-
-f2bf17f2c017f2c017f2c017f2c017f3c117f3c117f3c117f3c117f3c117f3c217f3c217f3c217f4
-c217f4c217f4c217f4c317f4c317f4c317f4c317f4c317f5c418f5c418f5c419f5c419f5c41af5c4
-1af5c41bf5c41bf5c51cf5c51cf5c51cf5c51df5c51df5c51ef5c51ef5c51ef5c51ef5c51ff5c51f
-f5c51ff5c51ff5c620f5c620f5c620f5c620f5c620f5c620f5c620f5c620f5c620f5c620f5c620f5
-c620f5c620f5c620f5c620f5c620f5c51ff5c51ff5c51ff5c51ff5c51ef5c51e
-
-f1bf17f2bf17f2bf17f2c017f2c017f2c017f2c017f2c017f3c117f3c117f3c117f3c117f3c117f3
-c217f3c217f3c217f4c217f4c217f4c217f4c317f4c317f4c317f4c317f4c317f4c317f5c418f5c4
-18f5c419f5c419f5c41af5c41af5c41af5c41bf5c41bf5c51cf5c51cf5c51cf5c51cf5c51cf5c51d
-f5c51df5c51df5c51df5c51ef5c51ef5c51ef5c51ef5c51ef5c51ef5c51ef5c51ef5c51ef5c51ef5
-c51ef5c51ef5c51ef5c51ef5c51ef5c51df5c51df5c51df5c51df5c51cf5c51c
-
-f1be17f1bf17f1bf17f2bf17f2bf17f2c017f2c017f2c017f2c017f2c017f3c117f3c117f3c117f3
-c117f3c117f3c217f3c217f3c217f3c217f4c217f4c217f4c217f4c317f4c317f4c317f4c317f4c3
-17f4c317f4c317f5c418f5c418f5c418f5c419f5c419f5c41af5c41af5c41af5c41af5c41af5c41b
-f5c41bf5c41bf5c41bf5c51cf5c51cf5c51cf5c51cf5c51cf5c51cf5c51cf5c51cf5c51cf5c51cf5
-c51cf5c51cf5c51cf5c51cf5c51cf5c41bf5c41bf5c41bf5c41bf5c41af5c41a
-
-f1be17f1be17f1be17f1bf17f1bf17f2bf17f2bf17f2c017f2c017f2c017f2c017f2c017f2c017f3
-c117f3c117f3c117f3c117f3c117f3c217f3c217f3c217f3c217f4c217f4c217f4c217f4c217f4c3
-17f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f5c418f5c418f5c418f5c418f5c419
-f5c419f5c419f5c419f5c41af5c41af5c41af5c41af5c41af5c41af5c41af5c41af5c41af5c41af5
-c41af5c41af5c41af5c41af5c419f5c419f5c419f5c419f5c419f5c418f5c418
-
-f0bd17f1be17f1be17f1be17f1be17f1bf17f1bf17f2bf17f2bf17f2bf17f2c017f2c017f2c017f2
-c017f2c017f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c217f3c217f3c217f3c217f4c2
-17f4c217f4c217f4c217f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317
-f4c317f4c317f4c317f5c418f5c418f5c418f5c418f5c418f5c418f5c418f5c418f5c418f5c418f5
-c418f5c418f5c418f5c418f4c317f4c317f4c317f4c317f4c317f4c317f4c317
-
-f0bd17f0bd17f0bd17f1be17f1be17f1be17f1be17f1be17f1bf17f1bf17f2bf17f2bf17f2c017f2
-c017f2c017f2c017f2c017f2c017f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c2
-17f3c217f3c217f3c217f4c217f4c217f4c217f4c217f4c217f4c217f4c317f4c317f4c317f4c317
-f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4
-c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317
-
-f0bd17f0bd17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1be17f1be17f1bf17f1bf17f2bf17f2
-bf17f2bf17f2c017f2c017f2c017f2c017f2c017f2c017f2c017f3c117f3c117f3c117f3c117f3c1
-17f3c117f3c117f3c117f3c217f3c217f3c217f3c217f3c217f3c217f4c217f4c217f4c217f4c217
-f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4
-c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217
-
-f0bc17f0bc17f0bd17f0bd17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1be17f1be17f1be17f1
-bf17f1bf17f2bf17f2bf17f2bf17f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f3c1
-17f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c217f3c217f3c217f3c217
-f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3
-c217f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3c217
-
-efbc17efbc17f0bc17f0bc17f0bc17f0bd17f0bd17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1
-be17f1be17f1be17f1bf17f1bf17f2bf17f2bf17f2bf17f2bf17f2c017f2c017f2c017f2c017f2c0
-17f2c017f2c017f2c017f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117
-f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3
-c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117
-
-efbb17efbb17efbc17efbc17f0bc17f0bc17f0bc17f0bd17f0bd17f0bd17f0bd17f0bd17f1be17f1
-be17f1be17f1be17f1be17f1be17f1be17f1bf17f1bf17f1bf17f2bf17f2bf17f2bf17f2bf17f2c0
-17f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f3c117f3c117f3c117f3c117
-f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3
-c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117
-
-efbb17efbb17efbb17efbb17efbc17efbc17efbc17f0bc17f0bc17f0bc17f0bd17f0bd17f0bd17f0
-bd17f0bd17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1bf17f1bf17f1bf17f1bf17f2bf
-17f2bf17f2bf17f2bf17f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017
-f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2
-c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017
-
-eeba16eeba16efbb17efbb17efbb17efbb17efbb17efbc17efbc17f0bc17f0bc17f0bc17f0bd17f0
-bd17f0bd17f0bd17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1bf
-17f1bf17f1bf17f1bf17f2bf17f2bf17f2bf17f2bf17f2bf17f2bf17f2bf17f2c017f2c017f2c017
-f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2
-c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017
-
-eeb916eeb916eeba16eeba16efbb17efbb17efbb17efbb17efbb17efbc17efbc17efbc17f0bc17f0
-bc17f0bc17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1be17f1be
-17f1be17f1be17f1be17f1be17f1be17f1bf17f1bf17f1bf17f1bf17f1bf17f2bf17f2bf17f2bf17
-f2bf17f2bf17f2bf17f2bf17f2bf17f2bf17f2bf17f2bf17f2bf17f2bf17f2bf17f2bf17f2bf17f2
-bf17f2bf17f2bf17f2bf17f2bf17f2bf17f2bf17f2bf17f2bf17f2bf17f2bf17
-
-edb816edb916eeb916eeb916eeba16eeba16efbb17efbb17efbb17efbb17efbb17efbb17efbc17ef
-bc17efbc17f0bc17f0bc17f0bc17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f1be
-17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1bf17
-f1bf17f1bf17f1bf17f1bf17f1bf17f1bf17f1bf17f1bf17f1bf17f1bf17f1bf17f1bf17f1bf17f1
-bf17f1bf17f1bf17f1bf17f1bf17f1bf17f1bf17f1bf17f1bf17f1be17f1be17
-
-edb716edb816edb816edb916eeb916eeb916eeba16eeba16eeba16efbb17efbb17efbb17efbb17ef
-bb17efbb17efbc17efbc17efbc17f0bc17f0bc17f0bc17f0bc17f0bd17f0bd17f0bd17f0bd17f0bd
-17f0bd17f0bd17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17
-f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1
-be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17
-
-ecb716ecb716edb716edb816edb816edb816edb916eeb916eeb916eeba16eeba16eeba16efbb17ef
-bb17efbb17efbb17efbb17efbb17efbc17efbc17efbc17efbc17f0bc17f0bc17f0bc17f0bc17f0bd
-17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f1be17
-f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1
-be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17
-
-ecb616ecb616ecb716ecb716edb716edb716edb816edb816edb916eeb916eeb916eeb916eeba16ee
-ba16eeba16efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbc17efbc17efbc17efbc17f0bc
-17f0bc17f0bc17f0bc17f0bc17f0bc17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17
-f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0
-bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17
-
-ebb516ecb516ecb616ecb616ecb616ecb716ecb716edb716edb816edb816edb816edb916eeb916ee
-b916eeb916eeba16eeba16eeba16efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb
-17efbc17efbc17efbc17efbc17efbc17f0bc17f0bc17f0bc17f0bc17f0bc17f0bc17f0bc17f0bc17
-f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0
-bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bc17f0bc17f0bc17
-
-ebb416ebb416ebb516ebb516ecb616ecb616ecb616ecb616ecb716edb716edb716edb816edb816ed
-b816edb916eeb916eeb916eeb916eeba16eeba16eeba16eeba16efbb17efbb17efbb17efbb17efbb
-17efbb17efbb17efbb17efbb17efbb17efbc17efbc17efbc17efbc17efbc17efbc17efbc17efbc17
-f0bc17f0bc17f0bc17f0bc17f0bc17f0bc17f0bc17f0bc17f0bc17f0bc17f0bc17f0bc17f0bc17f0
-bc17f0bc17f0bc17f0bc17f0bc17f0bc17f0bc17f0bc17efbc17efbc17efbc17
-
-eab316eab416ebb416ebb416ebb516ebb516ecb516ecb616ecb616ecb616ecb716ecb716edb716ed
-b716edb816edb816edb816edb916edb916eeb916eeb916eeb916eeba16eeba16eeba16eeba16eeba
-16efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17
-efbc17efbc17efbc17efbc17efbc17efbc17efbc17efbc17efbc17efbc17efbc17efbc17efbc17ef
-bc17efbc17efbc17efbc17efbc17efbc17efbc17efbb17efbb17efbb17efbb17
-
-eab216eab316eab316eab416ebb416ebb416ebb416ebb516ebb516ecb516ecb616ecb616ecb616ec
-b716ecb716edb716edb716edb816edb816edb816edb816edb916edb916eeb916eeb916eeb916eeb9
-16eeba16eeba16eeba16eeba16eeba16efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17
-efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17ef
-bb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17
-
-e9b216eab216eab216eab316eab316eab316eab416ebb416ebb416ebb416ebb516ebb516ecb516ec
-b616ecb616ecb616ecb616ecb716ecb716edb716edb716edb816edb816edb816edb816edb816edb9
-16edb916eeb916eeb916eeb916eeb916eeba16eeba16eeba16eeba16eeba16eeba16eeba16eeba16
-eeba16efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17ef
-bb17efbb17efbb17efbb17efbb17efbb17efbb17eeba16eeba16eeba16eeba16
-
-e9b116e9b116e9b116e9b216eab216eab216eab316eab316eab316ebb416ebb416ebb416ebb416eb
-b516ebb516ecb516ecb616ecb616ecb616ecb616ecb716ecb716ecb716edb716edb716edb716edb8
-16edb816edb816edb816edb816edb916edb916edb916eeb916eeb916eeb916eeb916eeb916eeb916
-eeb916eeba16eeba16eeba16eeba16eeba16eeba16eeba16eeba16eeba16eeba16eeba16eeba16ee
-ba16eeba16eeba16eeba16eeba16eeba16eeba16eeb916eeb916eeb916eeb916
-
-e8b016e9b016e9b116e9b116e9b116e9b216eab216eab216eab216eab316eab316eab316ebb416eb
-b416ebb416ebb416ebb516ebb516ebb516ecb516ecb616ecb616ecb616ecb616ecb616ecb716ecb7
-16ecb716edb716edb716edb716edb816edb816edb816edb816edb816edb816edb816edb816edb916
-edb916edb916edb916edb916eeb916eeb916eeb916eeb916eeb916eeb916eeb916eeb916eeb916ee
-b916eeb916eeb916edb916edb916edb916edb916edb916edb916edb816edb816
-
-e8af16e8af16e8b016e8b016e9b016e9b116e9b116e9b116e9b216eab216eab216eab216eab316ea
-b316eab316eab416ebb416ebb416ebb416ebb416ebb516ebb516ebb516ecb516ecb616ecb616ecb6
-16ecb616ecb616ecb616ecb716ecb716ecb716ecb716edb716edb716edb716edb716edb716edb816
-edb816edb816edb816edb816edb816edb816edb816edb816edb816edb816edb816edb816edb816ed
-b816edb816edb816edb816edb816edb816edb816edb816edb716edb716edb716
-
-e7ae16e8af16e8af16e8af16e8af16e8b016e9b016e9b116e9b116e9b116e9b116e9b216eab216ea
-b216eab216eab316eab316eab316eab316eab416ebb416ebb416ebb416ebb416ebb516ebb516ebb5
-16ebb516ecb516ecb616ecb616ecb616ecb616ecb616ecb616ecb616ecb616ecb716ecb716ecb716
-ecb716ecb716ecb716ecb716ecb716edb716edb716edb716edb716edb716edb716edb716edb716ed
-b716edb716ecb716ecb716ecb716ecb716ecb716ecb716ecb716ecb716ecb616
-
-e7ad15e7ae16e7ae16e8ae16e8af16e8af16e8af16e8b016e8b016e9b016e9b116e9b116e9b116e9
-b116e9b216e9b216eab216eab216eab216eab316eab316eab316eab316eab416ebb416ebb416ebb4
-16ebb416ebb416ebb516ebb516ebb516ebb516ebb516ecb516ecb516ecb616ecb616ecb616ecb616
-ecb616ecb616ecb616ecb616ecb616ecb616ecb616ecb616ecb616ecb616ecb616ecb616ecb616ec
-b616ecb616ecb616ecb616ecb616ecb616ecb616ecb616ecb616ecb616ecb616
-
-e6ac15e7ad15e7ad15e7ae16e7ae16e7ae16e8ae16e8af16e8af16e8af16e8b016e8b016e9b016e9
-b016e9b116e9b116e9b116e9b116e9b216eab216eab216eab216eab216eab316eab316eab316eab3
-16eab316eab416ebb416ebb416ebb416ebb416ebb416ebb416ebb416ebb516ebb516ebb516ebb516
-ebb516ebb516ebb516ebb516ebb516ebb516ebb516ecb516ecb516ecb516ecb516ecb516ecb516ec
-b516ebb516ebb516ebb516ebb516ebb516ebb516ebb516ebb516ebb516ebb516
-
-e6ac15e6ac15e6ac15e6ad15e7ad15e7ad15e7ae16e7ae16e7ae16e8ae16e8af16e8af16e8af16e8
-b016e8b016e8b016e9b016e9b116e9b116e9b116e9b116e9b116e9b216e9b216eab216eab216eab2
-16eab216eab316eab316eab316eab316eab316eab316eab416eab416ebb416ebb416ebb416ebb416
-ebb416ebb416ebb416ebb416ebb416ebb416ebb416ebb416ebb416ebb416ebb416ebb416ebb416eb
-b416ebb416ebb416ebb416ebb416ebb416ebb416ebb416ebb416ebb416ebb416
-
-e5ab15e6ab15e6ac15e6ac15e6ac15e6ac15e7ad15e7ad15e7ad15e7ae16e7ae16e7ae16e8ae16e8
-af16e8af16e8af16e8af16e8b016e8b016e9b016e9b016e9b116e9b116e9b116e9b116e9b116e9b1
-16e9b216e9b216eab216eab216eab216eab216eab216eab316eab316eab316eab316eab316eab316
-eab316eab316eab316eab316eab316eab316eab316eab316eab316eab416eab416eab416eab316ea
-b316eab316eab316eab316eab316eab316eab316eab316eab316eab316eab316
-
-e5aa15e5aa15e5ab15e6ab15e6ab15e6ac15e6ac15e6ac15e6ac15e7ad15e7ad15e7ad15e7ae16e7
-ae16e7ae16e7ae16e8af16e8af16e8af16e8af16e8af16e8b016e8b016e8b016e9b016e9b016e9b1
-16e9b116e9b116e9b116e9b116e9b116e9b116e9b216e9b216e9b216eab216eab216eab216eab216
-eab216eab216eab216eab216eab216eab216eab216eab216eab216eab216eab216eab216eab216ea
-b216eab216eab216eab216eab216eab216eab216eab216eab216eab216eab216
-
-e4a915e5a915e5aa15e5aa15e5aa15e5ab15e6ab15e6ab15e6ac15e6ac15e6ac15e6ac15e6ad15e7
-ad15e7ad15e7ae16e7ae16e7ae16e7ae16e8ae16e8af16e8af16e8af16e8af16e8af16e8af16e8b0
-16e8b016e8b016e9b016e9b016e9b016e9b116e9b116e9b116e9b116e9b116e9b116e9b116e9b116
-e9b116e9b116e9b116e9b116e9b216e9b216e9b216e9b216e9b216e9b216e9b216e9b216e9b216e9
-b216e9b216e9b216e9b116e9b116e9b116e9b116e9b116e9b116e9b116e9b116
-
-e4a815e4a915e4a915e5a915e5aa15e5aa15e5aa15e5aa15e5ab15e6ab15e6ab15e6ac15e6ac15e6
-ac15e6ac15e6ad15e7ad15e7ad15e7ad15e7ae16e7ae16e7ae16e7ae16e7ae16e8ae16e8af16e8af
-16e8af16e8af16e8af16e8af16e8af16e8b016e8b016e8b016e8b016e8b016e9b016e9b016e9b016
-e9b016e9b116e9b116e9b116e9b116e9b116e9b116e9b116e9b116e9b116e9b116e9b116e9b116e9
-b116e9b116e9b116e9b116e9b116e9b116e9b016e9b016e9b016e9b016e9b016
-
-e4a715e4a815e4a815e4a815e4a915e4a915e5a915e5aa15e5aa15e5aa15e5aa15e5ab15e5ab15e6
-ab15e6ab15e6ac15e6ac15e6ac15e6ac15e6ad15e7ad15e7ad15e7ad15e7ad15e7ae16e7ae16e7ae
-16e7ae16e7ae16e8ae16e8ae16e8af16e8af16e8af16e8af16e8af16e8af16e8af16e8af16e8af16
-e8af16e8b016e8b016e8b016e8b016e8b016e8b016e8b016e8b016e8b016e8b016e8b016e8b016e8
-b016e8b016e8b016e8b016e8b016e8b016e8af16e8af16e8af16e8af16e8af16
-
-e3a715e3a715e3a715e4a715e4a815e4a815e4a815e4a915e4a915e5a915e5aa15e5aa15e5aa15e5
-aa15e5aa15e5ab15e6ab15e6ab15e6ab15e6ac15e6ac15e6ac15e6ac15e6ac15e6ad15e7ad15e7ad
-15e7ad15e7ad15e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e8ae16e8ae16e8af16
-e8af16e8af16e8af16e8af16e8af16e8af16e8af16e8af16e8af16e8af16e8af16e8af16e8af16e8
-af16e8af16e8af16e8af16e8af16e8af16e8af16e8af16e8ae16e8ae16e7ae16
-
-e2a615e3a615e3a615e3a715e3a715e3a715e4a815e4a815e4a815e4a815e4a915e4a915e5a915e5
-a915e5aa15e5aa15e5aa15e5aa15e5aa15e5ab15e6ab15e6ab15e6ab15e6ac15e6ac15e6ac15e6ac
-15e6ac15e6ac15e6ac15e6ad15e7ad15e7ad15e7ad15e7ad15e7ad15e7ad15e7ae16e7ae16e7ae16
-e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7
-ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7ad15
-
-e2a515e2a515e2a515e3a615e3a615e3a615e3a715e3a715e3a715e4a715e4a815e4a815e4a815e4
-a915e4a915e4a915e5a915e5a915e5aa15e5aa15e5aa15e5aa15e5aa15e5ab15e5ab15e6ab15e6ab
-15e6ab15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ad15e6ad15e6ad15
-e7ad15e7ad15e7ad15e7ad15e7ad15e7ad15e7ad15e7ad15e7ad15e7ad15e7ad15e7ad15e7ad15e7
-ad15e7ad15e7ad15e7ad15e7ad15e7ad15e7ad15e7ad15e6ad15e6ad15e6ac15
-
-e2a415e2a415e2a515e2a515e2a515e2a515e3a615e3a615e3a615e3a715e3a715e3a715e4a715e4
-a815e4a815e4a815e4a815e4a915e4a915e4a915e5a915e5a915e5aa15e5aa15e5aa15e5aa15e5aa
-15e5aa15e5ab15e5ab15e5ab15e6ab15e6ab15e6ab15e6ab15e6ab15e6ac15e6ac15e6ac15e6ac15
-e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6
-ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15
-
-e1a315e1a415e1a415e2a415e2a415e2a515e2a515e2a515e2a515e3a615e3a615e3a615e3a715e3
-a715e3a715e3a715e4a715e4a815e4a815e4a815e4a815e4a915e4a915e4a915e4a915e5a915e5a9
-15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5ab15e5ab15e5ab15e5ab15
-e6ab15e6ab15e6ab15e6ab15e6ab15e6ab15e6ab15e6ab15e6ab15e6ab15e6ab15e6ab15e6ab15e6
-ab15e6ab15e6ab15e6ab15e6ab15e6ab15e6ab15e5ab15e5ab15e5ab15e5ab15
-
-e1a215e1a315e1a315e1a315e1a415e1a415e2a415e2a415e2a515e2a515e2a515e2a515e2a615e3
-a615e3a615e3a615e3a715e3a715e3a715e3a715e4a715e4a815e4a815e4a815e4a815e4a815e4a9
-15e4a915e4a915e4a915e4a915e5a915e5a915e5a915e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15
-e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5
-aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15
-
-e0a115e0a215e0a215e1a215e1a315e1a315e1a315e1a415e1a415e2a415e2a415e2a515e2a515e2
-a515e2a515e2a515e2a615e3a615e3a615e3a615e3a715e3a715e3a715e3a715e3a715e4a715e4a8
-15e4a815e4a815e4a815e4a815e4a815e4a815e4a915e4a915e4a915e4a915e4a915e4a915e4a915
-e4a915e5a915e5a915e5a915e5a915e5a915e5a915e5a915e5a915e5a915e5a915e5a915e5a915e5
-a915e5a915e5a915e5a915e5a915e5a915e5a915e4a915e4a915e4a915e4a915
-
-e0a115e0a115e0a115e0a115e0a215e0a215e1a215e1a315e1a315e1a315e1a315e1a415e1a415e2
-a415e2a415e2a515e2a515e2a515e2a515e2a515e2a615e3a615e3a615e3a615e3a615e3a715e3a7
-15e3a715e3a715e3a715e3a715e4a715e4a715e4a815e4a815e4a815e4a815e4a815e4a815e4a815
-e4a815e4a815e4a815e4a815e4a815e4a915e4a915e4a915e4a915e4a915e4a915e4a915e4a915e4
-a915e4a915e4a915e4a815e4a815e4a815e4a815e4a815e4a815e4a815e4a815
-
-dfa014dfa014dfa014e0a115e0a115e0a115e0a115e0a215e0a215e1a215e1a215e1a315e1a315e1
-a315e1a415e1a415e1a415e2a415e2a415e2a515e2a515e2a515e2a515e2a515e2a515e2a615e3a6
-15e3a615e3a615e3a615e3a615e3a615e3a715e3a715e3a715e3a715e3a715e3a715e3a715e3a715
-e3a715e3a715e4a715e4a715e4a715e4a715e4a815e4a815e4a815e4a815e4a815e4a815e4a815e4
-a815e4a815e4a715e4a715e4a715e4a715e3a715e3a715e3a715e3a715e3a715
-
-de9f14de9f14df9f14dfa014dfa014dfa014e0a115e0a115e0a115e0a115e0a215e0a215e0a215e1
-a215e1a315e1a315e1a315e1a315e1a415e1a415e1a415e2a415e2a415e2a415e2a515e2a515e2a5
-15e2a515e2a515e2a515e2a515e2a515e2a615e3a615e3a615e3a615e3a615e3a615e3a615e3a615
-e3a615e3a615e3a715e3a715e3a715e3a715e3a715e3a715e3a715e3a715e3a715e3a715e3a715e3
-a715e3a715e3a715e3a715e3a715e3a715e3a615e3a615e3a615e3a615e3a615
-
-de9d14de9e14de9e14de9f14df9f14df9f14dfa014dfa014dfa014e0a115e0a115e0a115e0a115e0
-a115e0a215e0a215e0a215e1a215e1a315e1a315e1a315e1a315e1a315e1a415e1a415e1a415e1a4
-15e2a415e2a415e2a415e2a515e2a515e2a515e2a515e2a515e2a515e2a515e2a515e2a515e2a515
-e2a515e2a515e2a615e2a615e2a615e2a615e2a615e3a615e3a615e3a615e3a615e3a615e3a615e2
-a615e2a615e2a615e2a615e2a615e2a515e2a515e2a515e2a515e2a515e2a515
-
-dd9c14dd9d14dd9d14de9d14de9e14de9e14de9f14de9f14df9f14df9f14dfa014dfa014dfa014e0
-a115e0a115e0a115e0a115e0a115e0a215e0a215e0a215e1a215e1a215e1a315e1a315e1a315e1a3
-15e1a315e1a315e1a415e1a415e1a415e1a415e1a415e2a415e2a415e2a415e2a415e2a415e2a415
-e2a515e2a515e2a515e2a515e2a515e2a515e2a515e2a515e2a515e2a515e2a515e2a515e2a515e2
-a515e2a515e2a515e2a515e2a515e2a515e2a515e2a515e2a415e2a415e2a415
-
-dc9b14dc9c14dd9c14dd9c14dd9d14dd9d14de9d14de9e14de9e14de9e14de9f14df9f14df9f14df
-a014dfa014dfa014dfa014e0a115e0a115e0a115e0a115e0a115e0a215e0a215e0a215e0a215e0a2
-15e1a215e1a215e1a315e1a315e1a315e1a315e1a315e1a315e1a315e1a315e1a315e1a415e1a415
-e1a415e1a415e1a415e1a415e1a415e1a415e1a415e1a415e1a415e1a415e1a415e1a415e1a415e1
-a415e1a415e1a415e1a415e1a415e1a415e1a415e1a415e1a415e1a415e1a315
-
-db9a14dc9b14dc9b14dc9b14dc9c14dd9c14dd9c14dd9d14dd9d14dd9d14de9e14de9e14de9e14de
-9f14de9f14df9f14df9f14df9f14dfa014dfa014dfa014e0a115e0a115e0a115e0a115e0a115e0a1
-15e0a115e0a215e0a215e0a215e0a215e0a215e0a215e1a215e1a215e1a215e1a215e1a315e1a315
-e1a315e1a315e1a315e1a315e1a315e1a315e1a315e1a315e1a315e1a315e1a315e1a315e1a315e1
-a315e1a315e1a315e1a315e1a315e1a315e1a315e1a315e1a315e1a315e1a215
-
-db9914db9914db9a14db9a14dc9b14dc9b14dc9b14dc9b14dd9c14dd9c14dd9d14dd9d14dd9d14de
-9d14de9e14de9e14de9e14de9e14de9f14df9f14df9f14df9f14dfa014dfa014dfa014dfa014dfa0
-14e0a115e0a115e0a115e0a115e0a115e0a115e0a115e0a115e0a115e0a215e0a215e0a215e0a215
-e0a215e0a215e0a215e0a215e0a215e0a215e0a215e0a215e0a215e0a215e0a215e0a215e0a215e0
-a215e0a215e0a215e0a215e0a215e0a215e0a215e0a215e0a215e0a215e0a215
-
-da9814da9814db9914db9914db9914db9a14db9a14dc9b14dc9b14dc9b14dc9b14dc9c14dd9c14dd
-9c14dd9d14dd9d14dd9d14dd9d14de9e14de9e14de9e14de9e14de9f14de9f14de9f14df9f14df9f
-14df9f14dfa014dfa014dfa014dfa014dfa014dfa014e0a115e0a115e0a115e0a115e0a115e0a115
-e0a115e0a115e0a115e0a115e0a115e0a115e0a115e0a115e0a115e0a115e0a115e0a115e0a115e0
-a115e0a115e0a115e0a115e0a115e0a115e0a115e0a115e0a115e0a115e0a115
-
-d99714da9714da9814da9814da9814db9914db9914db9914db9a14db9a14dc9a14dc9b14dc9b14dc
-9b14dc9b14dc9c14dd9c14dd9c14dd9c14dd9d14dd9d14dd9d14de9d14de9e14de9e14de9e14de9e
-14de9e14de9f14de9f14de9f14df9f14df9f14df9f14df9f14df9f14dfa014dfa014dfa014dfa014
-dfa014dfa014dfa014dfa014dfa014dfa014dfa014dfa014dfa014dfa014dfa014dfa014dfa014df
-a014dfa014dfa014dfa014dfa014dfa014dfa014dfa014dfa014dfa014dfa014
-
-d99614d99614d99714d99714da9714da9814da9814da9814da9914db9914db9914db9914db9a14db
-9a14dc9a14dc9b14dc9b14dc9b14dc9b14dc9c14dd9c14dd9c14dd9c14dd9c14dd9d14dd9d14dd9d
-14dd9d14de9d14de9d14de9e14de9e14de9e14de9e14de9e14de9e14de9e14de9f14de9f14de9f14
-de9f14de9f14df9f14df9f14df9f14df9f14df9f14df9f14df9f14df9f14df9f14df9f14df9f14df
-9f14df9f14df9f14df9f14df9f14df9f14de9f14de9f14de9f14de9f14de9f14
-
-d89514d89514d89514d99614d99614d99714d99714da9714da9714da9814da9814da9814da9914db
-9914db9914db9914db9a14db9a14db9a14dc9b14dc9b14dc9b14dc9b14dc9b14dc9b14dc9c14dd9c
-14dd9c14dd9c14dd9c14dd9d14dd9d14dd9d14dd9d14dd9d14dd9d14dd9d14de9d14de9d14de9e14
-de9e14de9e14de9e14de9e14de9e14de9e14de9e14de9e14de9e14de9e14de9e14de9e14de9e14de
-9e14de9e14de9e14de9e14de9e14de9e14de9e14de9e14de9d14de9d14de9d14
-
-d79414d89414d89414d89514d89514d89514d99614d99614d99614d99714d99714da9714da9814da
-9814da9814da9814da9914db9914db9914db9914db9a14db9a14db9a14db9a14dc9a14dc9b14dc9b
-14dc9b14dc9b14dc9b14dc9b14dc9c14dc9c14dd9c14dd9c14dd9c14dd9c14dd9c14dd9c14dd9d14
-dd9d14dd9d14dd9d14dd9d14dd9d14dd9d14dd9d14dd9d14dd9d14dd9d14dd9d14dd9d14dd9d14dd
-9d14dd9d14dd9d14dd9d14dd9d14dd9d14dd9d14dd9d14dd9c14dd9c14dd9c14
-
-d79313d79314d79314d79414d89414d89414d89514d89514d89514d99614d99614d99614d99714d9
-9714d99714da9714da9714da9814da9814da9814da9814da9914db9914db9914db9914db9914db9a
-14db9a14db9a14db9a14dc9a14dc9a14dc9b14dc9b14dc9b14dc9b14dc9b14dc9b14dc9b14dc9b14
-dc9b14dc9b14dc9b14dc9c14dc9c14dc9c14dc9c14dc9c14dc9c14dc9c14dc9c14dc9c14dc9c14dc
-9c14dc9c14dc9c14dc9c14dc9b14dc9b14dc9b14dc9b14dc9b14dc9b14dc9b14
-
-Q
-Q
-Q
-Q
-q
-q
-n
-140 139 m
-204 139 l
-204 75 l
-140 75 l
-140 139 l
-h
-W
-q
-q
-[64 0 0 64 140 75]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-f5ca30f5ca30f5ca30f5ca2ff5ca2ff5c92ff5c92ef5c92df5c92df5c92df5c92cf5c92bf5c92bf5
-c82af5c82af5c829f5c828f5c828f5c727f5c726f5c725f5c724f5c724f5c623f5c622f5c621f5c6
-20f5c620f5c51ff5c51ef5c51df5c51cf5c41bf5c41af5c419f5c418f4c317f4c317f4c317f4c317
-f4c217f4c217f3c217f3c117f3c117f3c117f3c117f2c017f2c017f2c017f2bf17f2bf17f1bf17f1
-be17f1be17f1be17f0bd17f0bd17f0bd17f0bc17f0bc17efbc17efbb17efbb17
-
-f5c92ef5c92ef5c92ef5c92df5c92df5c92df5c92cf5c92bf5c92bf5c82bf5c82af5c829f5c829f5
-c828f5c828f5c727f5c727f5c726f5c725f5c724f5c724f5c623f5c622f5c621f5c620f5c620f5c5
-1ff5c51ef5c51df5c51cf5c41bf5c41af5c419f5c418f4c317f4c317f4c317f4c317f4c217f4c217
-f3c217f3c217f3c117f3c117f3c117f2c017f2c017f2c017f2c017f2bf17f2bf17f1bf17f1be17f1
-be17f1be17f0bd17f0bd17f0bd17f0bc17f0bc17efbc17efbb17efbb17efbb17
-
-f5c92cf5c92cf5c92cf5c92bf5c92bf5c82bf5c82af5c829f5c829f5c829f5c828f5c827f5c727f5
-c726f5c726f5c725f5c724f5c724f5c623f5c622f5c622f5c621f5c620f5c51ff5c51ef5c51ef5c5
-1df5c51cf5c41bf5c41af5c419f5c418f5c418f4c317f4c317f4c317f4c217f4c217f3c217f3c217
-f3c117f3c117f3c117f3c117f2c017f2c017f2c017f2bf17f2bf17f1bf17f1be17f1be17f1be17f1
-be17f0bd17f0bd17f0bd17f0bc17f0bc17efbc17efbb17efbb17efbb17eeba16
-
-f5c82af5c82af5c82af5c829f5c829f5c829f5c828f5c827f5c727f5c727f5c726f5c725f5c725f5
-c724f5c724f5c623f5c622f5c622f5c621f5c620f5c620f5c51ff5c51ef5c51df5c51cf5c51cf5c4
-1bf5c41af5c419f5c418f5c418f4c317f4c317f4c317f4c217f4c217f3c217f3c217f3c117f3c117
-f3c117f3c117f2c017f2c017f2c017f2c017f2bf17f2bf17f1bf17f1be17f1be17f1be17f0bd17f0
-bd17f0bd17f0bd17f0bc17efbc17efbc17efbb17efbb17efbb17eeba16eeb916
-
-f5c828f5c828f5c827f5c827f5c727f5c727f5c726f5c725f5c725f5c724f5c724f5c723f5c623f5
-c622f5c622f5c621f5c620f5c620f5c51ff5c51ef5c51ef5c51df5c51cf5c51cf5c41bf5c41af5c4
-19f5c418f4c317f4c317f4c317f4c317f4c217f4c217f4c217f3c217f3c217f3c117f3c117f3c117
-f3c117f2c017f2c017f2c017f2bf17f2bf17f1bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0
-bd17f0bc17f0bc17efbc17efbc17efbb17efbb17efbb17eeba16eeb916edb916
-
-f5c726f5c726f5c725f5c725f5c725f5c724f5c724f5c723f5c623f5c622f5c622f5c621f5c621f5
-c620f5c620f5c51ff5c51ef5c51ef5c51df5c51cf5c51cf5c41bf5c41af5c41af5c419f5c418f4c3
-17f4c317f4c317f4c317f4c217f4c217f4c217f3c217f3c217f3c117f3c117f3c117f3c117f2c017
-f2c017f2c017f2c017f2bf17f2bf17f1bf17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0
-bc17f0bc17efbc17efbb17efbb17efbb17eeba16eeba16eeb916edb916edb816
-
-f5c724f5c724f5c723f5c623f5c623f5c622f5c622f5c621f5c621f5c620f5c620f5c51ff5c51ff5
-c51ef5c51ef5c51df5c51cf5c51cf5c41bf5c41af5c41af5c419f5c418f5c418f4c317f4c317f4c3
-17f4c317f4c217f4c217f4c217f3c217f3c217f3c117f3c117f3c117f3c117f2c017f2c017f2c017
-f2c017f2bf17f2bf17f1bf17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bd17f0bc17ef
-bc17efbc17efbb17efbb17efbb17eeba16eeba16eeb916edb916edb816edb716
-
-f5c622f5c622f5c621f5c621f5c621f5c620f5c620f5c51ff5c51ff5c51ef5c51ef5c51df5c51df5
-c51cf5c51cf5c41bf5c41af5c41af5c419f5c418f5c418f4c317f4c317f4c317f4c317f4c317f4c2
-17f4c217f3c217f3c217f3c217f3c117f3c117f3c117f3c117f2c017f2c017f2c017f2c017f2bf17
-f2bf17f1bf17f1bf17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bc17f0bc17efbc17ef
-bc17efbb17efbb17efbb17eeba16eeb916eeb916edb816edb816edb716ecb716
-
-f5c620f5c620f5c51ff5c51ff5c51ef5c51ef5c51ef5c51df5c51df5c51cf5c51cf5c51cf5c41bf5
-c41af5c41af5c419f5c418f5c418f4c317f4c317f4c317f4c317f4c317f4c217f4c217f4c217f3c2
-17f3c217f3c217f3c117f3c117f3c117f3c117f2c017f2c017f2c017f2c017f2bf17f2bf17f2bf17
-f1bf17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bd17f0bc17efbc17efbc17efbb17ef
-bb17efbb17eeba16eeba16eeb916edb916edb816edb816edb716ecb716ecb616
-
-f5c51ef5c51ef5c51df5c51df5c51cf5c51cf5c51cf5c41bf5c41bf5c41af5c41af5c41af5c419f5
-c418f5c418f4c317f4c317f4c317f4c317f4c317f4c317f4c217f4c217f4c217f3c217f3c217f3c1
-17f3c117f3c117f3c117f3c117f2c017f2c017f2c017f2c017f2c017f2bf17f2bf17f1bf17f1be17
-f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bd17f0bc17f0bc17efbc17efbc17efbb17efbb17ef
-bb17eeba16eeba16eeb916edb916edb816edb716ecb716ecb616ecb616ecb516
-
-f5c51cf5c51cf5c41bf5c41bf5c41af5c41af5c41af5c419f5c419f5c418f5c418f5c418f4c317f4
-c317f4c317f4c317f4c317f4c317f4c217f4c217f4c217f3c217f3c217f3c217f3c117f3c117f3c1
-17f3c117f3c117f2c017f2c017f2c017f2c017f2c017f2bf17f2bf17f1bf17f1be17f1be17f1be17
-f1be17f1be17f0bd17f0bd17f0bd17f0bc17f0bc17efbc17efbc17efbb17efbb17efbb17efbb17ee
-ba16eeb916eeb916edb816edb816edb716ecb716ecb616ecb616ebb516ebb516
-
-f5c41af5c41af5c419f5c419f5c418f5c418f5c418f4c317f4c317f4c317f4c317f4c317f4c317f4
-c317f4c317f4c217f4c217f4c217f3c217f3c217f3c217f3c117f3c117f3c117f3c117f3c117f3c1
-17f2c017f2c017f2c017f2c017f2bf17f2bf17f2bf17f1bf17f1be17f1be17f1be17f1be17f1be17
-f0bd17f0bd17f0bd17f0bd17f0bc17f0bc17efbc17efbc17efbb17efbb17efbb17eeba16eeba16ee
-b916edb916edb816edb816edb716ecb716ecb616ecb616ebb516ebb416ebb416
-
-f5c418f5c418f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c217f4c217f4
-c217f4c217f3c217f3c217f3c217f3c117f3c117f3c117f3c117f3c117f3c117f2c017f2c017f2c0
-17f2c017f2c017f2bf17f2bf17f2bf17f1bf17f1be17f1be17f1be17f1be17f1be17f0bd17f0bd17
-f0bd17f0bd17f0bc17f0bc17efbc17efbc17efbb17efbb17efbb17efbb17eeba16eeb916eeb916ed
-b916edb816edb716ecb716ecb616ecb616ecb516ebb516ebb416ebb416eab316
-
-f4c317f4c317f4c317f4c317f4c317f4c317f4c217f4c217f4c217f4c217f4c217f3c217f3c217f3
-c217f3c217f3c117f3c117f3c117f3c117f3c117f3c117f2c017f2c017f2c017f2c017f2c017f2c0
-17f2bf17f2bf17f1bf17f1bf17f1be17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bd17
-f0bc17f0bc17efbc17efbc17efbb17efbb17efbb17efbb17eeba16eeba16eeb916edb916edb816ed
-b816edb716ecb716ecb616ecb616ebb516ebb516ebb416eab416eab316eab216
-
-f4c217f4c217f4c217f4c217f4c217f4c217f3c217f3c217f3c217f3c217f3c217f3c117f3c117f3
-c117f3c117f3c117f3c117f3c117f2c017f2c017f2c017f2c017f2c017f2c017f2bf17f2bf17f2bf
-17f1bf17f1bf17f1be17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bd17f0bc17f0bc17
-efbc17efbc17efbb17efbb17efbb17efbb17eeba16eeba16eeb916eeb916edb816edb816edb716ec
-b716ecb616ecb616ecb516ebb516ebb416ebb416eab316eab316eab216e9b216
-
-f3c217f3c217f3c217f3c217f3c217f3c217f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3
-c117f3c117f2c017f2c017f2c017f2c017f2c017f2c017f2bf17f2bf17f2bf17f1bf17f1bf17f1be
-17f1be17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bd17f0bc17f0bc17efbc17efbc17
-efbc17efbb17efbb17efbb17efbb17eeba16eeba16eeb916edb916edb816edb816edb716ecb716ec
-b616ecb616ebb516ebb516ebb416eab416eab316eab216eab216e9b116e9b116
-
-f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f2c017f2c017f2
-c017f2c017f2c017f2c017f2c017f2bf17f2bf17f2bf17f1bf17f1bf17f1bf17f1be17f1be17f1be
-17f1be17f1be17f0bd17f0bd17f0bd17f0bd17f0bd17f0bc17f0bc17efbc17efbc17efbc17efbb17
-efbb17efbb17efbb17eeba16eeba16eeb916edb916edb816edb816edb716ecb716ecb616ecb616ec
-b516ebb516ebb416ebb416eab316eab316eab216e9b216e9b116e9b116e9b016
-
-f3c117f3c117f3c117f3c117f3c117f3c117f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2
-c017f2c017f2bf17f2bf17f2bf17f1bf17f1bf17f1bf17f1be17f1be17f1be17f1be17f1be17f1be
-17f0bd17f0bd17f0bd17f0bd17f0bd17f0bc17f0bc17efbc17efbc17efbc17efbb17efbb17efbb17
-efbb17eeba16eeba16eeb916eeb916edb816edb816edb716edb716ecb716ecb616ecb616ebb516eb
-b516ebb416eab416eab316eab316eab216e9b216e9b116e9b116e8b016e8af16
-
-f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2bf17f2bf17f2
-bf17f2bf17f1bf17f1bf17f1bf17f1be17f1be17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd
-17f0bd17f0bd17f0bc17f0bc17f0bc17efbc17efbc17efbb17efbb17efbb17efbb17efbb17eeba16
-eeba16eeb916eeb916edb916edb816edb816edb716ecb716ecb616ecb616ecb516ebb516ebb416eb
-b416eab316eab316eab216eab216e9b116e9b116e9b016e8b016e8af16e8af16
-
-f2c017f2c017f2c017f2c017f2c017f2c017f2bf17f2bf17f2bf17f2bf17f2bf17f1bf17f1bf17f1
-bf17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd
-17f0bc17f0bc17f0bc17efbc17efbc17efbb17efbb17efbb17efbb17efbb17eeba16eeba16eeb916
-eeb916edb916edb816edb816edb716ecb716ecb616ecb616ecb616ebb516ebb416ebb416eab416ea
-b316eab316eab216e9b216e9b116e9b116e9b016e8b016e8af16e8af16e7ae16
-
-f2bf17f2bf17f2bf17f2bf17f2bf17f2bf17f1bf17f1bf17f1bf17f1bf17f1be17f1be17f1be17f1
-be17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bc17f0bc17f0bc
-17efbc17efbc17efbc17efbb17efbb17efbb17efbb17efbb17eeba16eeba16eeb916eeb916edb916
-edb816edb816edb716ecb716ecb616ecb616ecb616ebb516ebb516ebb416ebb416eab316eab316ea
-b216e9b216e9b116e9b116e9b016e8b016e8af16e8af16e7ae16e7ae16e7ad15
-
-f1bf17f1bf17f1bf17f1bf17f1bf17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1
-be17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bc17f0bc17f0bc17efbc17efbc17efbc
-17efbb17efbb17efbb17efbb17efbb17eeba16eeba16eeba16eeb916eeb916edb916edb816edb816
-edb716ecb716ecb716ecb616ecb616ebb516ebb516ebb416ebb416eab316eab316eab216eab216e9
-b216e9b116e9b116e9b016e8b016e8af16e8af16e7ae16e7ae16e7ad15e6ac15
-
-f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0
-bd17f0bd17f0bd17f0bd17f0bd17f0bc17f0bc17f0bc17efbc17efbc17efbc17efbb17efbb17efbb
-17efbb17efbb17efbb17eeba16eeba16eeba16eeb916eeb916edb916edb816edb816edb716ecb716
-ecb716ecb616ecb616ecb516ebb516ebb416ebb416eab416eab316eab316eab216e9b216e9b116e9
-b116e9b016e8b016e8af16e8af16e8ae16e7ae16e7ad15e7ad15e6ac15e6ac15
-
-f1be17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0
-bd17f0bc17f0bc17f0bc17f0bc17efbc17efbc17efbc17efbb17efbb17efbb17efbb17efbb17efbb
-17eeba16eeba16eeba16eeb916eeb916edb916edb816edb816edb816edb716ecb716ecb616ecb616
-ecb616ecb516ebb516ebb416ebb416eab416eab316eab316eab216e9b216e9b116e9b116e9b116e8
-b016e8af16e8af16e8af16e7ae16e7ae16e7ad15e6ad15e6ac15e6ac15e6ab15
-
-f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bd17f0bc17f0bc17f0bc17f0
-bc17efbc17efbc17efbc17efbc17efbb17efbb17efbb17efbb17efbb17efbb17efbb17eeba16eeba
-16eeba16eeb916eeb916edb916edb816edb816edb716edb716ecb716ecb616ecb616ecb616ecb516
-ebb516ebb416ebb416ebb416eab316eab316eab216eab216e9b116e9b116e9b116e9b016e8b016e8
-af16e8af16e7ae16e7ae16e7ad15e7ad15e6ac15e6ac15e6ab15e5ab15e5aa15
-
-f0bd17f0bd17f0bd17f0bd17f0bd17f0bc17f0bc17f0bc17f0bc17f0bc17efbc17efbc17efbc17ef
-bc17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17eeba16eeba16eeba16eeb916eeb9
-16edb916edb816edb816edb816edb716ecb716ecb716ecb616ecb616ecb616ebb516ebb516ebb416
-ebb416ebb416eab316eab316eab216eab216e9b216e9b116e9b116e9b016e8b016e8af16e8af16e8
-ae16e7ae16e7ae16e7ad15e6ac15e6ac15e6ac15e6ab15e5aa15e5aa15e5aa15
-
-f0bc17f0bc17f0bc17f0bc17f0bc17efbc17efbc17efbc17efbc17efbc17efbb17efbb17efbb17ef
-bb17efbb17efbb17efbb17efbb17eeba16eeba16eeba16eeba16eeb916eeb916edb916edb816edb8
-16edb816edb716edb716ecb716ecb716ecb616ecb616ecb616ebb516ebb516ebb416ebb416eab416
-eab316eab316eab216eab216e9b216e9b116e9b116e9b016e8b016e8af16e8af16e8af16e7ae16e7
-ae16e7ad15e7ad15e6ac15e6ac15e6ab15e5ab15e5aa15e5aa15e5a915e4a915
-
-efbc17efbc17efbc17efbc17efbc17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17ef
-bb17eeba16eeba16eeba16eeba16eeb916eeb916eeb916edb916edb816edb816edb816edb716edb7
-16ecb716ecb716ecb616ecb616ecb616ecb516ebb516ebb516ebb416ebb416eab416eab316eab316
-eab216eab216e9b216e9b116e9b116e9b016e8b016e8af16e8af16e8af16e7ae16e7ae16e7ad15e7
-ad15e6ac15e6ac15e6ab15e6ab15e5aa15e5aa15e5aa15e4a915e4a915e4a815
-
-efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17efbb17eeba16eeba16eeba16ee
-ba16eeb916eeb916eeb916eeb916edb916edb816edb816edb816edb716edb716ecb716ecb716ecb6
-16ecb616ecb616ecb616ebb516ebb516ebb416ebb416ebb416eab316eab316eab316eab216eab216
-e9b216e9b116e9b116e9b016e8b016e8b016e8af16e8af16e7ae16e7ae16e7ae16e7ad15e6ad15e6
-ac15e6ac15e6ab15e5ab15e5aa15e5aa15e5a915e4a915e4a815e4a815e3a715
-
-efbb17efbb17efbb17efbb17eeba16eeba16eeba16eeba16eeba16eeba16eeb916eeb916eeb916ee
-b916edb916edb816edb816edb816edb816edb716edb716ecb716ecb716ecb616ecb616ecb616ecb6
-16ebb516ebb516ebb516ebb416ebb416eab416eab316eab316eab316eab216eab216e9b116e9b116
-e9b116e9b016e8b016e8b016e8af16e8af16e8ae16e7ae16e7ae16e7ad15e6ad15e6ac15e6ac15e6
-ab15e5ab15e5aa15e5aa15e5a915e4a915e4a915e4a815e4a715e3a715e3a715
-
-eeba16eeba16eeba16eeba16eeb916eeb916eeb916eeb916eeb916edb916edb916edb816edb816ed
-b816edb816edb716edb716edb716ecb716ecb716ecb616ecb616ecb616ecb616ecb516ebb516ebb5
-16ebb416ebb416ebb416eab316eab316eab316eab216eab216e9b216e9b116e9b116e9b116e9b016
-e8b016e8af16e8af16e8af16e8ae16e7ae16e7ae16e7ad15e6ad15e6ac15e6ac15e6ab15e6ab15e5
-aa15e5aa15e5aa15e4a915e4a915e4a815e4a815e3a715e3a715e3a615e2a615
-
-eeb916eeb916eeb916edb916edb916edb816edb816edb816edb816edb816edb816edb716edb716ed
-b716ecb716ecb716ecb616ecb616ecb616ecb616ecb616ebb516ebb516ebb516ebb416ebb416ebb4
-16eab416eab316eab316eab316eab216eab216e9b216e9b116e9b116e9b116e9b016e8b016e8af16
-e8af16e8af16e8ae16e7ae16e7ae16e7ad15e7ad15e6ac15e6ac15e6ab15e6ab15e5ab15e5aa15e5
-aa15e5a915e4a915e4a815e4a815e4a715e3a715e3a615e3a615e2a515e2a515
-
-edb816edb816edb816edb816edb816edb716edb716edb716edb716ecb716ecb716ecb716ecb616ec
-b616ecb616ecb616ecb616ecb516ebb516ebb516ebb516ebb416ebb416ebb416eab416eab316eab3
-16eab316eab216eab216e9b216e9b116e9b116e9b116e9b016e8b016e8b016e8af16e8af16e8af16
-e7ae16e7ae16e7ae16e7ad15e7ad15e6ac15e6ac15e6ac15e6ab15e5ab15e5aa15e5aa15e5a915e4
-a915e4a915e4a815e4a715e3a715e3a715e3a615e2a615e2a515e2a515e2a415
-
-edb716edb716edb716ecb716ecb716ecb716ecb716ecb616ecb616ecb616ecb616ecb616ecb616ec
-b516ebb516ebb516ebb516ebb416ebb416ebb416ebb416eab316eab316eab316eab316eab216eab2
-16e9b216e9b116e9b116e9b116e9b116e9b016e8b016e8b016e8af16e8af16e8af16e7ae16e7ae16
-e7ae16e7ad15e6ad15e6ac15e6ac15e6ac15e6ab15e5ab15e5aa15e5aa15e5a915e4a915e4a915e4
-a815e4a815e3a715e3a715e3a615e3a615e2a515e2a515e2a415e1a415e1a315
-
-ecb616ecb616ecb616ecb616ecb616ecb616ecb616ecb616ecb516ebb516ebb516ebb516ebb516eb
-b416ebb416ebb416ebb416eab416eab316eab316eab316eab216eab216eab216e9b216e9b116e9b1
-16e9b116e9b116e9b016e8b016e8b016e8af16e8af16e8af16e8ae16e7ae16e7ae16e7ad15e7ad15
-e6ad15e6ac15e6ac15e6ac15e6ab15e5ab15e5aa15e5aa15e5a915e4a915e4a915e4a815e4a815e3
-a715e3a715e3a615e3a615e2a515e2a515e2a515e2a415e1a415e1a315e1a315
-
-ecb616ecb516ebb516ebb516ebb516ebb516ebb516ebb516ebb416ebb416ebb416ebb416ebb416ea
-b416eab316eab316eab316eab316eab216eab216eab216e9b216e9b116e9b116e9b116e9b116e9b0
-16e8b016e8b016e8af16e8af16e8af16e8af16e7ae16e7ae16e7ae16e7ad15e7ad15e6ac15e6ac15
-e6ac15e6ab15e6ab15e5ab15e5aa15e5aa15e5a915e4a915e4a915e4a815e4a815e4a715e3a715e3
-a715e3a615e2a615e2a515e2a515e2a415e1a415e1a315e1a315e1a215e0a215
-
-ebb516ebb416ebb416ebb416ebb416ebb416ebb416ebb416eab416eab316eab316eab316eab316ea
-b316eab216eab216eab216e9b216e9b216e9b116e9b116e9b116e9b116e9b016e8b016e8b016e8af
-16e8af16e8af16e8af16e7ae16e7ae16e7ae16e7ad15e7ad15e6ad15e6ac15e6ac15e6ac15e6ab15
-e6ab15e5aa15e5aa15e5aa15e5a915e4a915e4a915e4a815e4a815e4a715e3a715e3a715e3a615e2
-a615e2a515e2a515e2a415e1a415e1a415e1a315e1a215e0a215e0a215e0a115
-
-ebb416eab416eab316eab316eab316eab316eab316eab316eab316eab216eab216eab216eab216e9
-b216e9b116e9b116e9b116e9b116e9b116e9b016e9b016e8b016e8b016e8af16e8af16e8af16e8af
-16e8ae16e7ae16e7ae16e7ae16e7ad15e7ad15e6ac15e6ac15e6ac15e6ac15e6ab15e5ab15e5aa15
-e5aa15e5aa15e5a915e4a915e4a915e4a815e4a815e4a715e3a715e3a715e3a615e2a615e2a515e2
-a515e2a415e2a415e1a415e1a315e1a315e1a215e0a215e0a115e0a115dfa014
-
-eab316eab316eab216eab216eab216eab216eab216e9b216e9b216e9b216e9b116e9b116e9b116e9
-b116e9b116e9b016e9b016e8b016e8b016e8af16e8af16e8af16e8af16e8af16e7ae16e7ae16e7ae
-16e7ae16e7ad15e7ad15e6ad15e6ac15e6ac15e6ac15e6ab15e6ab15e5ab15e5aa15e5aa15e5aa15
-e5a915e4a915e4a915e4a815e4a815e4a715e3a715e3a715e3a615e3a615e2a515e2a515e2a515e2
-a415e1a415e1a315e1a315e1a215e0a215e0a115e0a115e0a115dfa014df9f14
-
-e9b216e9b216e9b216e9b116e9b116e9b116e9b116e9b116e9b116e9b116e9b116e9b016e9b016e8
-b016e8b016e8af16e8af16e8af16e8af16e8af16e8ae16e7ae16e7ae16e7ae16e7ad15e7ad15e7ad
-15e6ad15e6ac15e6ac15e6ac15e6ab15e6ab15e5ab15e5aa15e5aa15e5aa15e5a915e4a915e4a915
-e4a815e4a815e4a815e3a715e3a715e3a715e3a615e3a615e2a515e2a515e2a515e2a415e1a415e1
-a315e1a315e1a215e0a215e0a215e0a115e0a115dfa014dfa014df9f14de9e14
-
-e9b116e9b116e9b116e9b116e9b116e9b016e9b016e8b016e8b016e8b016e8b016e8af16e8af16e8
-af16e8af16e8af16e8ae16e7ae16e7ae16e7ae16e7ae16e7ad15e7ad15e7ad15e6ad15e6ac15e6ac
-15e6ac15e6ab15e6ab15e5ab15e5aa15e5aa15e5aa15e5aa15e5a915e4a915e4a915e4a815e4a815
-e4a815e3a715e3a715e3a715e3a615e2a615e2a515e2a515e2a515e2a415e1a415e1a315e1a315e1
-a215e0a215e0a215e0a115e0a115dfa014dfa014df9f14de9f14de9e14de9d14
-
-e8b016e8b016e8b016e8b016e8b016e8af16e8af16e8af16e8af16e8af16e8af16e8af16e8ae16e7
-ae16e7ae16e7ae16e7ae16e7ad15e7ad15e7ad15e6ad15e6ac15e6ac15e6ac15e6ac15e6ab15e6ab
-15e5ab15e5ab15e5aa15e5aa15e5aa15e5a915e4a915e4a915e4a915e4a815e4a815e4a715e3a715
-e3a715e3a615e3a615e2a615e2a515e2a515e2a415e2a415e1a415e1a315e1a315e1a215e0a215e0
-a215e0a115e0a115dfa014dfa014df9f14de9f14de9e14de9e14dd9d14dd9d14
-
-e8af16e8af16e8af16e8af16e8af16e8af16e8ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7
-ad15e7ad15e7ad15e6ad15e6ac15e6ac15e6ac15e6ac15e6ac15e6ab15e6ab15e5ab15e5aa15e5aa
-15e5aa15e5aa15e5a915e4a915e4a915e4a915e4a815e4a815e4a815e3a715e3a715e3a715e3a615
-e3a615e2a515e2a515e2a515e2a415e2a415e1a415e1a315e1a315e1a215e0a215e0a215e0a115e0
-a115e0a115dfa014df9f14de9f14de9e14de9e14dd9d14dd9d14dd9c14dc9b14
-
-e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7ae16e7ad15e7ad15e7ad15e7ad15e7ad15e6ad15e6
-ac15e6ac15e6ac15e6ac15e6ac15e6ab15e6ab15e5ab15e5ab15e5aa15e5aa15e5aa15e5aa15e5a9
-15e4a915e4a915e4a915e4a815e4a815e4a815e3a715e3a715e3a715e3a615e3a615e2a615e2a515
-e2a515e2a515e2a415e1a415e1a415e1a315e1a315e1a215e0a215e0a215e0a115e0a115e0a115df
-a014df9f14df9f14de9e14de9e14dd9d14dd9d14dd9c14dc9c14dc9b14dc9b14
-
-e7ad15e7ad15e7ad15e7ad15e7ad15e7ad15e6ad15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6
-ab15e6ab15e6ab15e5ab15e5ab15e5aa15e5aa15e5aa15e5aa15e5aa15e5a915e4a915e4a915e4a9
-15e4a815e4a815e4a815e4a715e3a715e3a715e3a715e3a615e3a615e2a515e2a515e2a515e2a515
-e2a415e1a415e1a415e1a315e1a315e1a215e0a215e0a215e0a115e0a115e0a115dfa014df9f14df
-9f14de9f14de9e14de9d14dd9d14dd9c14dc9c14dc9b14dc9b14db9a14db9914
-
-e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ac15e6ab15e6ab15e6ab15e5ab15e5ab15e5
-aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5a915e4a915e4a915e4a915e4a815e4a815e4a815e4a8
-15e4a715e3a715e3a715e3a715e3a615e3a615e2a615e2a515e2a515e2a515e2a415e2a415e1a415
-e1a315e1a315e1a315e1a215e0a215e0a215e0a115e0a115e0a115dfa014df9f14df9f14de9f14de
-9e14de9d14dd9d14dd9c14dd9c14dc9b14dc9b14db9a14db9a14db9914da9914
-
-e6ac15e6ab15e6ab15e6ab15e6ab15e5ab15e5ab15e5ab15e5aa15e5aa15e5aa15e5aa15e5aa15e5
-aa15e5a915e5a915e4a915e4a915e4a915e4a915e4a815e4a815e4a815e4a715e3a715e3a715e3a7
-15e3a715e3a615e3a615e2a615e2a515e2a515e2a515e2a415e2a415e1a415e1a415e1a315e1a315
-e1a215e0a215e0a215e0a115e0a115e0a115dfa014dfa014df9f14df9f14de9f14de9e14de9d14dd
-9d14dd9c14dd9c14dc9b14dc9b14dc9a14db9a14db9914da9914da9814da9714
-
-e5ab15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5aa15e5a915e5a915e4a915e4a915e4
-a915e4a915e4a815e4a815e4a815e4a815e4a815e3a715e3a715e3a715e3a715e3a615e3a615e3a6
-15e2a615e2a515e2a515e2a515e2a515e2a415e1a415e1a415e1a315e1a315e1a315e1a215e0a215
-e0a215e0a115e0a115e0a115dfa014dfa014df9f14de9f14de9e14de9e14de9d14dd9d14dd9c14dd
-9c14dc9b14dc9b14dc9a14db9a14db9914db9914da9814da9814da9714d99714
-
-e5aa15e5aa15e5a915e5a915e5a915e4a915e4a915e4a915e4a915e4a915e4a815e4a815e4a815e4
-a815e4a815e4a715e3a715e3a715e3a715e3a715e3a615e3a615e3a615e3a615e2a515e2a515e2a5
-15e2a515e2a415e2a415e1a415e1a415e1a315e1a315e1a315e1a215e0a215e0a215e0a215e0a115
-e0a115e0a115dfa014dfa014df9f14de9f14de9e14de9e14de9d14dd9d14dd9c14dd9c14dc9b14dc
-9b14dc9a14db9a14db9914db9914da9814da9814da9714d99714d99614d99614
-
-e4a915e4a915e4a915e4a915e4a815e4a815e4a815e4a815e4a815e4a815e4a715e3a715e3a715e3
-a715e3a715e3a715e3a615e3a615e3a615e3a615e2a515e2a515e2a515e2a515e2a515e2a415e2a4
-15e1a415e1a415e1a315e1a315e1a315e1a215e0a215e0a215e0a215e0a115e0a115e0a115dfa014
-dfa014df9f14df9f14de9f14de9e14de9e14dd9d14dd9d14dd9c14dd9c14dc9b14dc9b14dc9a14db
-9a14db9914db9914da9814da9814da9714d99714d99614d99614d89514d89514
-
-e4a815e4a815e4a815e4a815e4a715e3a715e3a715e3a715e3a715e3a715e3a715e3a615e3a615e3
-a615e3a615e2a615e2a515e2a515e2a515e2a515e2a515e2a415e2a415e2a415e1a415e1a415e1a3
-15e1a315e1a315e1a215e0a215e0a215e0a215e0a115e0a115e0a115e0a115dfa014dfa014df9f14
-de9f14de9e14de9e14de9d14dd9d14dd9d14dd9c14dc9c14dc9b14dc9b14dc9a14db9a14db9914db
-9914da9814da9814da9714d99714d99614d99614d89514d89514d89414d79414
-
-e3a715e3a715e3a715e3a715e3a715e3a615e3a615e3a615e3a615e3a615e2a615e2a515e2a515e2
-a515e2a515e2a515e2a515e2a415e2a415e2a415e1a415e1a415e1a315e1a315e1a315e1a315e1a2
-15e0a215e0a215e0a215e0a115e0a115e0a115e0a115dfa014dfa014df9f14df9f14de9f14de9e14
-de9e14de9d14dd9d14dd9d14dd9c14dc9c14dc9b14dc9b14dc9a14db9a14db9914db9914da9814da
-9814da9714d99714d99614d99614d89514d89514d89414d79414d79314d79313
-
-e3a615e3a615e3a615e2a615e2a615e2a515e2a515e2a515e2a515e2a515e2a515e2a515e2a415e2
-a415e2a415e1a415e1a415e1a415e1a315e1a315e1a315e1a315e1a215e1a215e0a215e0a215e0a2
-15e0a115e0a115e0a115e0a115dfa014dfa014df9f14df9f14de9f14de9e14de9e14de9d14dd9d14
-dd9d14dd9c14dd9c14dc9b14dc9b14dc9b14db9a14db9a14db9914db9914da9814da9814da9714d9
-9714d99614d99614d89514d89514d89414d79414d79314d79313d69213d69213
-
-e2a515e2a515e2a515e2a515e2a515e2a515e2a415e2a415e2a415e2a415e1a415e1a415e1a415e1
-a315e1a315e1a315e1a315e1a315e1a215e1a215e0a215e0a215e0a215e0a115e0a115e0a115e0a1
-15dfa014dfa014dfa014df9f14df9f14de9f14de9e14de9e14de9e14dd9d14dd9d14dd9d14dd9c14
-dc9c14dc9b14dc9b14dc9a14db9a14db9914db9914da9914da9814da9814da9714d99714d99614d9
-9614d89514d89514d89414d79414d79314d79313d69213d69213d69113d59113
-
-e2a415e2a415e2a415e1a415e1a415e1a415e1a415e1a315e1a315e1a315e1a315e1a315e1a315e1
-a215e1a215e0a215e0a215e0a215e0a215e0a115e0a115e0a115e0a115e0a115dfa014dfa014dfa0
-14df9f14df9f14de9f14de9e14de9e14de9e14dd9d14dd9d14dd9d14dd9c14dc9c14dc9b14dc9b14
-dc9b14db9a14db9a14db9914db9914da9914da9814da9814da9714d99714d99614d99614d89514d8
-9514d89414d79414d79314d79313d79213d69213d69113d69113d59013d59013
-
-e1a315e1a315e1a315e1a315e1a315e1a315e1a315e1a215e1a215e1a215e0a215e0a215e0a215e0
-a215e0a115e0a115e0a115e0a115e0a115e0a115dfa014dfa014dfa014df9f14df9f14de9f14de9f
-14de9e14de9e14de9e14dd9d14dd9d14dd9d14dd9c14dd9c14dc9b14dc9b14dc9b14dc9a14db9a14
-db9914db9914db9914da9814da9814da9714d99714d99714d99614d99614d89514d89514d89414d7
-9414d79314d79313d79213d69213d69113d69113d59013d59013d58f13d48f13
-
-e1a215e1a215e1a215e0a215e0a215e0a215e0a215e0a215e0a115e0a115e0a115e0a115e0a115e0
-a115e0a115dfa014dfa014dfa014dfa014df9f14df9f14de9f14de9f14de9e14de9e14de9e14de9d
-14dd9d14dd9d14dd9d14dd9c14dd9c14dc9b14dc9b14dc9b14dc9a14db9a14db9a14db9914db9914
-da9914da9814da9814da9714d99714d99614d99614d89514d89514d89514d89414d79414d79314d7
-9313d69213d69213d69113d69113d59013d59013d58f13d48f13d48e13d48e13
-
-e0a215e0a115e0a115e0a115e0a115e0a115e0a115e0a115e0a115e0a115dfa014dfa014dfa014df
-a014df9f14df9f14df9f14de9f14de9f14de9e14de9e14de9e14de9d14dd9d14dd9d14dd9d14dd9c
-14dd9c14dc9c14dc9b14dc9b14dc9b14dc9a14db9a14db9a14db9914db9914da9914da9814da9814
-da9714d99714d99714d99614d99614d89514d89514d89414d79414d79314d79314d79313d69213d6
-9213d69113d69113d59013d59013d58f13d48f13d48e13d48e13d38d13d38d13
-
-e0a115e0a115dfa014dfa014dfa014dfa014dfa014dfa014df9f14df9f14df9f14df9f14de9f14de
-9f14de9e14de9e14de9e14de9e14de9d14dd9d14dd9d14dd9d14dd9c14dd9c14dd9c14dc9b14dc9b
-14dc9b14dc9b14dc9a14db9a14db9a14db9914db9914da9914da9814da9814da9714d99714d99714
-d99614d99614d89514d89514d89514d89414d79414d79314d79314d79313d69213d69213d69113d5
-9113d59013d59013d58f13d48f13d48e13d48e13d38d13d38d13d38c13d28c13
-
-df9f14df9f14df9f14df9f14df9f14de9f14de9f14de9f14de9e14de9e14de9e14de9e14de9e14de
-9d14dd9d14dd9d14dd9d14dd9d14dd9c14dd9c14dd9c14dc9b14dc9b14dc9b14dc9b14dc9a14db9a
-14db9a14db9914db9914db9914da9914da9814da9814da9714da9714d99714d99614d99614d99614
-d89514d89514d89514d89414d79414d79314d79313d79213d69213d69113d69113d59113d59013d5
-9013d58f13d48f13d48e13d48e13d38d13d38d13d38c13d28c13d28b13d28b13
-
-de9e14de9e14de9e14de9e14de9e14de9e14de9e14de9d14dd9d14dd9d14dd9d14dd9d14dd9d14dd
-9c14dd9c14dd9c14dc9c14dc9b14dc9b14dc9b14dc9b14dc9b14db9a14db9a14db9a14db9914db99
-14db9914da9814da9814da9814da9714da9714d99714d99614d99614d99614d89514d89514d89514
-d89414d79414d79314d79314d79313d69213d69213d69113d69113d59013d59013d58f13d48f13d4
-8f13d48e13d48e13d38d13d38d13d38c13d28c13d28b13d28b13d18a13d18a13
-
-dd9d14dd9d14dd9d14dd9d14dd9d14dd9d14dd9d14dd9c14dd9c14dd9c14dd9c14dc9c14dc9b14dc
-9b14dc9b14dc9b14dc9b14dc9a14db9a14db9a14db9a14db9914db9914db9914da9914da9814da98
-14da9814da9714d99714d99714d99614d99614d99614d89514d89514d89514d89414d79414d79314
-d79314d79313d79213d69213d69113d69113d59113d59013d59013d58f13d48f13d48f13d48e13d3
-8d13d38d13d38d13d38c13d28c13d28b13d28b13d18a13d18a13d18913d08913
-
-dd9c14dd9c14dd9c14dc9c14dc9c14dc9b14dc9b14dc9b14dc9b14dc9b14dc9b14dc9b14dc9a14db
-9a14db9a14db9a14db9914db9914db9914db9914da9914da9814da9814da9814da9714da9714d997
-14d99714d99614d99614d99614d89514d89514d89514d89414d79414d79314d79314d79313d79213
-d69213d69213d69113d69113d59013d59013d59013d58f13d48f13d48e13d48e13d38d13d38d13d3
-8d13d38c13d28b13d28b13d28b13d18a13d18a13d18913d08913d08813d08713
-
-dc9b14dc9b14dc9b14dc9b14dc9b14dc9a14db9a14db9a14db9a14db9a14db9914db9914db9914db
-9914db9914da9914da9814da9814da9814da9814da9714da9714d99714d99714d99614d99614d996
-14d89514d89514d89514d89514d89414d79414d79314d79314d79313d79313d69213d69213d69113
-d69113d59113d59013d59013d58f13d48f13d48f13d48e13d48e13d38d13d38d13d38c13d28c13d2
-8b13d28b13d28b13d18a13d18913d18913d08913d08813d08713cf8713cf8713
-
-Q
-Q
-Q
-Q
-q
-q
-n
-204 139 m
-268 139 l
-268 75 l
-204 75 l
-204 139 l
-h
-W
-q
-q
-[64 0 0 64 204 75]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-efbb17eeba16eeba16eeb916edb916edb816edb716ecb716ecb616ecb516ebb516ebb416eab316ea
-b316eab216e9b116e9b116e8b016e8af16e8af16e7ae16e7ad15e6ad15e6ac15e6ab15e5ab15e5aa
-15e5a915e4a915e4a815e3a715e3a615e2a615e2a515e2a415e1a415e1a315e0a215e0a115e0a115
-dfa014de9f14de9e14dd9d14dd9c14dc9b14dc9a14db9914da9814da9714d99714d89514d89514d7
-9414d79313d69213d69113d59013d48f13d48e13d38d13d38c13d28b13d18a13
-
-eeba16eeba16eeb916edb816edb816edb716ecb716ecb616ecb516ebb516ebb416eab316eab316ea
-b216e9b116e9b116e9b016e8af16e8af16e7ae16e7ae16e7ad15e6ac15e6ab15e5ab15e5aa15e5a9
-15e4a915e4a815e3a715e3a715e3a615e2a515e2a415e1a415e1a315e1a215e0a215e0a115dfa014
-df9f14de9e14dd9d14dd9c14dc9b14dc9b14db9a14da9914da9814d99714d99614d89514d79414d7
-9314d69213d69113d59013d58f13d48e13d38d13d38c13d28b13d18a13d18913
-
-eeba16eeb916edb816edb816edb716ecb716ecb616ecb516ebb516ebb416eab316eab316eab216e9
-b116e9b116e9b016e8af16e8af16e7ae16e7ae16e7ad15e6ac15e6ab15e5ab15e5aa15e5a915e4a9
-15e4a815e3a715e3a715e3a615e2a515e2a515e1a415e1a315e1a215e0a215e0a115dfa014df9f14
-de9e14de9d14dd9d14dc9c14dc9b14db9a14db9914da9814d99714d99614d89514d89414d79314d7
-9213d69113d59113d58f13d48f13d48e13d38d13d28c13d28b13d18a13d08913
-
-eeb916edb816edb816edb716ecb616ecb616ebb516ebb516ebb416eab316eab316eab216e9b116e9
-b116e9b016e8af16e8af16e7ae16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e5a915e4a915e4a8
-15e4a715e3a715e3a615e2a515e2a515e1a415e1a315e1a215e0a215e0a115dfa014df9f14de9f14
-de9e14dd9d14dd9c14dc9b14db9a14db9914da9814da9714d99614d89514d89514d79414d79313d6
-9213d69113d59013d48f13d48e13d38d13d38c13d28b13d18a13d18913d08813
-
-edb816edb816ecb716ecb616ecb616ebb516ebb516ebb416eab316eab316eab216e9b116e9b116e9
-b016e8af16e8af16e7ae16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e5aa15e4a915e4a815e4a7
-15e3a715e3a615e2a515e2a515e2a415e1a315e1a315e0a215e0a115e0a115dfa014de9f14de9e14
-dd9d14dd9c14dc9b14dc9a14db9914da9914da9814d99714d99614d89514d79414d79314d69213d6
-9113d59013d58f13d48e13d38d13d38c13d28b13d28b13d18913d08913d08813
-
-edb716ecb716ecb616ecb616ebb516ebb416ebb416eab316eab316eab216e9b116e9b116e9b016e8
-af16e8af16e7ae16e7ae16e7ad15e6ac15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e4a815e3a7
-15e3a615e2a515e2a515e2a415e1a415e1a315e0a215e0a115e0a115dfa014df9f14de9e14dd9d14
-dd9c14dc9b14dc9b14db9a14db9914da9814d99714d99614d89514d89414d79314d79213d69113d5
-9013d58f13d48f13d48e13d38d13d28c13d28b13d18a13d18913d08813cf8713
-
-ecb716ecb616ecb616ebb516ebb416ebb416eab316eab316eab216e9b116e9b116e9b016e8af16e8
-af16e7ae16e7ae16e7ad15e6ac15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e4a815e3a715e3a6
-15e2a615e2a515e2a415e1a415e1a315e0a215e0a115e0a115dfa014df9f14de9e14de9d14dd9d14
-dc9c14dc9b14db9a14db9914da9814d99714d99614d89514d89414d79314d79313d69213d69113d5
-9013d48f13d48e13d38d13d38c13d28b13d18a13d18913d08813d08713cf8613
-
-ecb616ecb616ebb516ebb416ebb416eab316eab216eab216e9b116e9b116e8b016e8af16e8af16e7
-ae16e7ae16e7ad15e6ac15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e4a815e3a715e3a615e2a6
-15e2a515e2a415e1a415e1a315e1a215e0a215e0a115dfa014df9f14de9e14de9d14dd9d14dc9c14
-dc9b14db9a14db9914da9814da9714d99614d89514d89514d79414d79313d69213d69113d59013d4
-8f13d48e13d38d13d38c13d28b13d28b13d18913d08913d08813cf8713ce8613
-
-ecb516ebb516ebb416eab416eab316eab216e9b216e9b116e9b116e8b016e8af16e8af16e7ae16e7
-ae16e7ad15e6ac15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e4a815e3a715e3a615e2a615e2a5
-15e2a415e1a415e1a315e1a215e0a215e0a115dfa014df9f14de9f14de9e14dd9d14dd9c14dc9b14
-db9a14db9914da9814da9714d99714d99614d89514d79414d79314d69213d69113d59013d58f13d4
-8e13d38d13d38d13d28c13d28b13d18a13d08913d08813cf8713cf8613ce8513
-
-ebb516ebb416eab416eab316eab216e9b216e9b116e9b116e8b016e8af16e8af16e7ae16e7ae16e7
-ad15e6ac15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e4a815e3a715e3a615e3a615e2a515e2a4
-15e1a415e1a315e1a215e0a215e0a115dfa014df9f14de9f14de9e14dd9d14dd9c14dc9b14dc9a14
-db9914da9914da9814d99714d99614d89514d89414d79314d79213d69113d59113d59013d48f13d4
-8e13d38d13d28c13d28b13d18a13d18913d08813cf8713cf8613ce8513ce8512
-
-ebb416eab316eab316eab216e9b216e9b116e9b116e8b016e8af16e8af16e7ae16e7ae16e7ad15e6
-ac15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e4a815e3a715e3a615e3a615e2a515e2a415e1a4
-15e1a315e1a215e0a215e0a115e0a115dfa014de9f14de9e14dd9d14dd9c14dc9b14dc9b14db9a14
-db9914da9814d99714d99614d89514d89414d79314d79313d69213d69113d59013d48f13d48e13d3
-8d13d38c13d28b13d18a13d18913d08913d08813cf8713ce8613ce8512cd8412
-
-eab316eab316eab216e9b216e9b116e9b016e8b016e8af16e8af16e7ae16e7ad15e7ad15e6ac15e6
-ac15e5ab15e5aa15e5aa15e4a915e4a815e4a815e3a715e3a715e3a615e2a515e2a515e1a415e1a3
-15e1a215e0a215e0a115e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14dc9b14db9a14db9914
-da9814da9714d99614d89514d89514d79414d79313d69213d69113d59013d58f13d48e13d38d13d3
-8c13d28b13d28b13d18a13d08913d08813cf8713cf8613ce8512ce8412cd8312
-
-eab216eab216e9b116e9b116e9b016e8b016e8af16e8af16e7ae16e7ad15e6ad15e6ac15e6ac15e5
-ab15e5aa15e5aa15e4a915e4a815e4a815e3a715e3a715e3a615e2a515e2a515e1a415e1a315e1a3
-15e0a215e0a115e0a115dfa014df9f14de9e14dd9d14dd9c14dc9c14dc9b14db9a14db9914da9814
-da9714d99614d89514d89514d79414d79313d69213d69113d59013d58f13d48e13d38d13d38d13d2
-8c13d28b13d18a13d18913d08813cf8713cf8613ce8513ce8412cd8312cd8312
-
-e9b216e9b116e9b116e9b016e8af16e8af16e8ae16e7ae16e7ad15e6ad15e6ac15e6ab15e5ab15e5
-aa15e5aa15e4a915e4a815e4a815e3a715e3a615e3a615e2a515e2a515e1a415e1a315e1a315e0a2
-15e0a115e0a115dfa014df9f14de9e14de9d14dd9d14dc9c14dc9b14db9a14db9914da9814da9714
-d99714d99614d89514d79414d79314d69213d69113d59013d58f13d48f13d48e13d38d13d28c13d2
-8b13d18a13d18913d08813d08713cf8713ce8513ce8512cd8412cd8312cc8212
-
-e9b116e9b116e8b016e8af16e8af16e7ae16e7ae16e7ad15e6ac15e6ac15e6ab15e5ab15e5aa15e5
-aa15e4a915e4a815e4a815e3a715e3a615e3a615e2a515e2a515e1a415e1a315e1a315e0a215e0a1
-15e0a115dfa014df9f14de9e14de9d14dd9d14dc9c14dc9b14db9a14db9914da9814da9714d99714
-d99614d89514d89414d79314d79213d69113d59113d59013d48f13d48e13d38d13d38c13d28b13d1
-8a13d18913d08913d08813cf8713cf8613ce8512cd8412cd8312cc8212cc8112
-
-e9b016e8b016e8af16e8af16e7ae16e7ae16e7ad15e6ac15e6ac15e6ab15e5ab15e5aa15e5a915e4
-a915e4a815e4a815e3a715e3a615e3a615e2a515e2a415e1a415e1a315e1a315e0a215e0a115e0a1
-15dfa014df9f14de9e14de9d14dd9d14dd9c14dc9b14db9a14db9914da9914da9814d99714d99614
-d89514d89414d79314d79313d69213d69113d59013d48f13d48e13d38d13d38c13d28b13d28b13d1
-8a13d08913d08813cf8713cf8613ce8512ce8412cd8312cc8212cc8112cb8112
-
-e8b016e8af16e8af16e7ae16e7ae16e7ad15e6ac15e6ac15e6ab15e5aa15e5aa15e5a915e4a915e4
-a815e4a815e3a715e3a615e2a615e2a515e2a415e1a415e1a315e1a315e0a215e0a115e0a115dfa0
-14df9f14de9e14de9d14dd9d14dd9c14dc9b14db9a14db9914da9914da9814d99714d99614d89514
-d89414d79314d79313d69213d69113d59013d48f13d48e13d38d13d38d13d28c13d28b13d18a13d1
-8913d08813cf8713cf8613ce8513ce8412cd8312cd8312cc8212cb8112cb8012
-
-e8af16e8ae16e7ae16e7ad15e6ad15e6ac15e6ac15e6ab15e5aa15e5aa15e5a915e4a915e4a815e4
-a715e3a715e3a615e2a615e2a515e2a415e1a415e1a315e1a315e0a215e0a115e0a115dfa014df9f
-14de9e14de9d14dd9d14dd9c14dc9b14dc9a14db9914da9914da9814d99714d99614d89514d89414
-d79314d79313d69213d69113d59013d58f13d48e13d38d13d38d13d28c13d28b13d18a13d18913d0
-8813cf8713cf8613ce8513ce8512cd8412cd8312cc8212cc8112cb8012ca8012
-
-e7ae16e7ae16e7ad15e6ad15e6ac15e6ab15e5ab15e5aa15e5aa15e4a915e4a915e4a815e4a715e3
-a715e3a615e2a515e2a515e2a415e1a415e1a315e1a215e0a215e0a115e0a115dfa014df9f14de9e
-14de9d14dd9d14dd9c14dc9b14dc9a14db9914da9914da9814d99714d99614d89514d89514d79414
-d79313d69213d69113d59013d58f13d48f13d48e13d38d13d28c13d28b13d18a13d18913d08813d0
-8713cf8713ce8613ce8512cd8412cd8312cc8212cc8112cb8012cb8012ca8012
-
-e7ae16e7ad15e6ac15e6ac15e6ab15e5ab15e5aa15e5aa15e4a915e4a815e4a815e3a715e3a715e3
-a615e2a515e2a515e2a415e1a415e1a315e1a215e0a215e0a115e0a115dfa014df9f14de9e14de9d
-14dd9d14dd9c14dc9b14dc9a14db9914db9914da9814d99714d99614d89514d89514d79414d79313
-d69213d69113d59013d58f13d48f13d48e13d38d13d38c13d28b13d18a13d18913d08913d08813cf
-8713cf8613ce8512ce8412cd8312cc8212cc8112cb8112cb8012ca8012ca7f12
-
-e7ad15e6ac15e6ac15e6ab15e5aa15e5aa15e5a915e4a915e4a815e4a815e3a715e3a715e3a615e2
-a515e2a515e2a415e1a415e1a315e1a215e0a215e0a115e0a115dfa014df9f14de9e14de9d14dd9d
-14dd9c14dc9b14dc9a14db9914db9914da9814d99714d99614d89514d89514d79414d79314d69213
-d69113d59013d59013d48f13d48e13d38d13d38c13d28b13d18a13d18a13d08913d08813cf8713cf
-8613ce8513ce8412cd8312cd8312cc8212cb8112cb8012ca8012ca7f12c97e12
-
-e6ac15e6ab15e5ab15e5aa15e5aa15e5a915e4a915e4a815e4a815e3a715e3a615e3a615e2a515e2
-a515e2a415e1a415e1a315e1a215e0a215e0a115e0a115dfa014df9f14de9e14de9d14dd9d14dd9c
-14dc9b14dc9a14db9914db9914da9814d99714d99614d89514d89514d79414d79314d69213d69113
-d59113d59013d48f13d48e13d38d13d38c13d28b13d28b13d18a13d08913d08813cf8713cf8613ce
-8513ce8512cd8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c97d12
-
-e6ab15e5ab15e5aa15e5aa15e4a915e4a915e4a815e4a715e3a715e3a615e2a615e2a515e2a515e2
-a415e1a315e1a315e1a215e0a215e0a115e0a115dfa014df9f14de9e14de9d14dd9d14dd9c14dc9b
-14dc9a14db9914db9914da9814d99714d99614d89514d89514d79414d79314d69213d69113d59113
-d59013d48f13d48e13d38d13d38c13d28b13d28b13d18a13d18913d08813cf8713cf8613ce8513ce
-8512cd8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c97e12c87d12
-
-e5aa15e5aa15e5a915e4a915e4a815e4a815e3a715e3a715e3a615e2a515e2a515e2a415e1a415e1
-a315e1a315e0a215e0a215e0a115dfa014dfa014de9f14de9e14dd9d14dd9d14dd9c14dc9b14dc9a
-14db9914da9914da9814d99714d99614d89514d89514d79414d79314d79213d69113d59113d59013
-d48f13d48e13d38d13d38c13d28c13d28b13d18a13d18913d08813cf8713cf8713ce8613ce8512cd
-8412cd8312cc8212cc8112cb8012cb8012ca8012c97f12c97e12c87d12c87c12
-
-e5aa15e5a915e4a915e4a815e4a815e3a715e3a715e3a615e2a515e2a515e2a415e1a415e1a315e1
-a315e0a215e0a115e0a115dfa014df9f14de9f14de9e14dd9d14dd9d14dc9c14dc9b14db9a14db99
-14da9914da9814d99714d99614d89514d89514d79414d79314d79213d69113d59113d59013d48f13
-d48e13d38d13d38d13d28c13d28b13d18a13d18913d08813d08713cf8713ce8613ce8512ce8412cd
-8312cc8212cc8112cb8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12
-
-e4a915e4a915e4a815e4a715e3a715e3a615e3a615e2a515e2a515e2a415e1a415e1a315e1a215e0
-a215e0a115e0a115dfa014df9f14de9f14de9e14dd9d14dd9c14dc9c14dc9b14db9a14db9914da99
-14da9814d99714d99614d89514d89514d79414d79314d79213d69113d59113d59013d48f13d48e13
-d38d13d38d13d28c13d28b13d18a13d18913d08813d08713cf8713cf8613ce8512ce8412cd8312cc
-8212cc8112cb8112cb8012ca8012ca7f12c97e12c97d12c87c12c77c12c77b12
-
-e4a815e4a815e3a715e3a715e3a615e2a615e2a515e2a515e1a415e1a315e1a315e1a215e0a215e0
-a115e0a115dfa014df9f14de9f14de9e14dd9d14dd9c14dc9b14dc9b14db9a14db9914da9914da98
-14d99714d99614d89514d89514d79414d79314d79213d69113d59113d59013d48f13d48e13d38d13
-d38d13d28c13d28b13d18a13d18913d08813d08813cf8713cf8613ce8512ce8412cd8312cd8312cc
-8212cb8112cb8012ca8012ca7f12c97e12c97d12c87d12c87c12c77b12c67a12
-
-e4a715e3a715e3a615e3a615e2a515e2a515e2a415e1a415e1a315e1a315e0a215e0a215e0a115e0
-a115dfa014df9f14de9e14de9e14dd9d14dd9c14dc9b14dc9b14db9a14db9914da9814da9814d997
-14d99614d89514d89514d79414d79314d69213d69113d59113d59013d48f13d48e13d38d13d38d13
-d28c13d28b13d18a13d18913d08913d08813cf8713cf8613ce8513ce8412cd8312cd8312cc8212cc
-8112cb8012ca8012ca7f12c97e12c97e12c87d12c87c12c77b12c67a12c67912
-
-e3a715e3a615e2a615e2a515e2a515e2a415e1a415e1a315e1a215e0a215e0a115e0a115dfa014df
-a014de9f14de9e14de9d14dd9d14dd9c14dc9b14dc9b14db9a14db9914da9814da9814d99714d996
-14d89514d89514d79414d79314d69213d69113d59113d59013d48f13d48e13d38d13d38d13d28c13
-d28b13d18a13d18913d08913d08813cf8713cf8613ce8513ce8412cd8312cd8312cc8212cc8112cb
-8012ca8012ca7f12c97f12c97e12c87d12c87c12c77b12c77a12c67912c67912
-
-e3a615e2a515e2a515e2a415e1a415e1a315e1a315e1a215e0a215e0a115e0a115dfa014df9f14de
-9f14de9e14dd9d14dd9d14dd9c14dc9b14dc9a14db9a14db9914da9814da9714d99714d99614d895
-14d89414d79414d79314d69213d69113d59113d59013d48f13d48e13d38d13d38d13d28c13d28b13
-d18a13d18913d08913d08813cf8713cf8613ce8513ce8512cd8412cd8312cc8212cc8112cb8012cb
-8012ca8012c97f12c97e12c87d12c87c12c77b12c77a12c67a12c67912c57811
-
-e2a515e2a515e2a415e1a415e1a315e1a315e0a215e0a215e0a115e0a115dfa014df9f14de9f14de
-9e14dd9d14dd9c14dc9c14dc9b14dc9a14db9914db9914da9814da9714d99714d99614d89514d894
-14d79414d79313d69213d69113d59113d59013d48f13d48e13d38d13d38d13d28c13d28b13d18a13
-d18913d08913d08813cf8713cf8613ce8513ce8512cd8412cd8312cc8212cc8112cb8012cb8012ca
-8012ca7f12c97e12c87d12c87c12c77b12c77a12c67a12c67912c57811c57711
-
-e2a415e1a415e1a315e1a315e1a215e0a215e0a115e0a115dfa014dfa014df9f14de9e14de9e14dd
-9d14dd9c14dc9b14dc9b14db9a14db9914da9914da9814da9714d99714d99614d89514d89414d793
-14d79313d69213d69113d59113d59013d48f13d48e13d38d13d38d13d28c13d28b13d18a13d18913
-d08913d08813cf8713cf8613ce8513ce8512cd8412cd8312cc8212cc8112cb8012cb8012ca8012ca
-7f12c97e12c87d12c87c12c77c12c77b12c67a12c67912c57811c57711c47611
-
-e1a415e1a315e1a315e0a215e0a215e0a115e0a115dfa014df9f14de9f14de9e14de9d14dd9d14dd
-9c14dc9b14dc9b14db9a14db9914da9914da9814d99714d99614d99614d89514d89414d79314d793
-13d69213d69113d59013d59013d48f13d48e13d38d13d38d13d28c13d28b13d18a13d18913d08913
-d08813cf8713cf8613ce8513ce8512cd8412cd8312cc8212cc8112cb8112cb8012ca8012ca7f12c9
-7e12c97d12c87c12c77c12c77b12c67a12c67912c57811c57711c47611c47511
-
-e1a315e1a215e0a215e0a115e0a115dfa014dfa014df9f14de9f14de9e14dd9d14dd9c14dc9c14dc
-9b14dc9a14db9a14db9914da9814da9814d99714d99614d89514d89514d79414d79314d79313d692
-13d69113d59013d58f13d48f13d48e13d38d13d38d13d28c13d28b13d18a13d18913d08913d08813
-cf8713cf8613ce8513ce8512cd8412cd8312cc8212cc8112cb8112cb8012ca8012ca7f12c97e12c9
-7d12c87c12c77c12c77b12c67a12c67912c57811c57711c47611c47511c37411
-
-e0a215e0a215e0a115e0a115dfa014df9f14de9f14de9e14de9d14dd9d14dd9c14dc9b14dc9b14db
-9a14db9914db9914da9814da9714d99714d99614d89514d89514d79414d79314d79213d69213d691
-13d59013d58f13d48f13d48e13d38d13d38c13d28c13d28b13d18a13d18913d08913d08813cf8713
-cf8613ce8513ce8512cd8412cd8312cc8212cc8112cb8112cb8012ca8012ca7f12c97e12c97d12c8
-7d12c87c12c77b12c67a12c67912c67912c57711c47611c47511c37411c37311
-
-e0a115e0a115dfa014dfa014df9f14de9f14de9e14dd9d14dd9d14dd9c14dc9b14dc9b14db9a14db
-9914da9914da9814da9714d99714d99614d89514d89414d79414d79314d79213d69113d69113d590
-13d58f13d48f13d48e13d38d13d38c13d28b13d28b13d18a13d18913d08913d08813cf8713cf8613
-ce8513ce8512cd8412cd8312cc8212cc8112cb8112cb8012ca8012ca7f12c97e12c97e12c87d12c8
-7c12c77b12c77a12c67912c67912c57711c47611c47611c37511c37411c27311
-
-e0a115dfa014df9f14de9f14de9e14de9e14dd9d14dd9c14dc9c14dc9b14dc9a14db9a14db9914da
-9814da9814d99714d99614d99614d89514d89414d79314d79313d69213d69113d59113d59013d58f
-13d48e13d48e13d38d13d38c13d28b13d28b13d18a13d18913d08813d08813cf8713cf8613ce8513
-ce8512cd8412cd8312cc8212cc8112cb8112cb8012ca8012ca7f12c97e12c97e12c87d12c87c12c7
-7b12c77a12c67912c67912c57811c47711c47611c37511c37411c27311c27211
-
-dfa014df9f14de9f14de9e14dd9d14dd9d14dd9c14dc9b14dc9b14db9a14db9914db9914da9814da
-9714d99714d99614d89514d89514d89414d79314d79313d69213d69113d59113d59013d48f13d48e
-13d48e13d38d13d38c13d28b13d28b13d18a13d18913d08813d08813cf8713cf8613ce8513ce8512
-cd8412cd8312cc8212cc8112cb8112cb8012ca8012ca7f12c97e12c97e12c87d12c87c12c77b12c7
-7a12c67912c67912c57811c47711c47611c37511c37411c27311c27211c17111
-
-de9f14de9e14de9d14dd9d14dd9c14dc9c14dc9b14dc9a14db9a14db9914da9914da9814da9714d9
-9714d99614d89514d89514d79414d79314d79213d69213d69113d59013d59013d48f13d48e13d38d
-13d38d13d28c13d28b13d28b13d18a13d18913d08813d08713cf8713cf8613ce8513ce8412cd8412
-cd8312cc8212cc8112cb8112cb8012ca8012ca7f12c97e12c97e12c87d12c87c12c77b12c77a12c6
-7912c67912c57811c47711c47611c37511c37411c27311c27211c17111c17011
-
-de9e14dd9d14dd9d14dd9c14dc9b14dc9b14db9a14db9914db9914da9814da9714d99714d99614d9
-9614d89514d89414d79414d79313d69213d69113d69113d59013d58f13d48f13d48e13d38d13d38d
-13d28c13d28b13d18a13d18a13d08913d08813d08713cf8713cf8613ce8512ce8412cd8412cd8312
-cc8212cc8112cb8112cb8012ca8012ca7f12c97e12c97e12c87d12c87c12c77b12c77a12c67a12c6
-7912c57811c57711c47611c37511c37411c27311c27211c17111c17011c06f11
-
-dd9d14dd9c14dc9c14dc9b14dc9a14db9a14db9914da9914da9814da9714d99714d99614d89514d8
-9514d79414d79314d79313d69213d69113d59113d59013d58f13d48f13d48e13d38d13d38c13d28c
-13d28b13d18a13d18913d08913d08813cf8713cf8713ce8613ce8512ce8412cd8312cd8312cc8212
-cc8112cb8012cb8012ca8012ca7f12c97e12c97e12c87d12c87c12c77b12c77a12c67a12c67912c5
-7811c57711c47611c37511c37411c27311c27211c17111c17011c06f11c06e11
-
-dd9c14dc9b14dc9b14db9a14db9914db9914da9814da9814d99714d99614d99614d89514d89414d7
-9414d79314d79213d69213d69113d59013d59013d48f13d48e13d48e13d38d13d38c13d28b13d28b
-13d18a13d18913d08913d08813cf8713cf8613ce8613ce8512ce8412cd8312cd8312cc8212cc8112
-cb8012cb8012ca8012ca7f12c97e12c97e12c87d12c87c12c77b12c77a12c67a12c67912c57811c5
-7711c47611c37511c37411c27311c27211c17111c17011c06f11c06e11bf6e11
-
-dc9b14dc9a14db9a14db9914da9914da9814da9714d99714d99614d89514d89514d89414d79314d7
-9313d69213d69113d69113d59013d58f13d48f13d48e13d38d13d38d13d38c13d28b13d28b13d18a
-13d18913d08913d08813cf8713cf8613ce8513ce8512ce8412cd8312cd8312cc8212cc8112cb8012
-cb8012ca8012ca7f12c97e12c97d12c87d12c87c12c77b12c77a12c67a12c67912c57811c57711c4
-7611c47511c37411c27311c27211c17111c17011c06f11c06f11bf6e11be6d10
-
-db9a14db9914db9914da9814da9714d99714d99614d99614d89514d89414d79414d79314d79313d6
-9213d69113d59113d59013d58f13d48f13d48e13d38d13d38d13d28c13d28b13d18a13d18a13d189
-13d08813d08813cf8713cf8613ce8513ce8512cd8412cd8312cd8312cc8212cc8112cb8012cb8012
-ca8012ca7f12c97e12c97d12c87d12c87c12c77b12c77a12c67a12c67912c57811c57711c47611c4
-7511c37411c27311c27211c17111c17011c07011c06f11bf6e11be6d10be6c10
-
-db9914da9814da9814da9714d99714d99614d89514d89514d89414d79314d79313d69213d69213d6
-9113d59013d59013d48f13d48e13d48e13d38d13d38c13d28c13d28b13d18a13d18913d08913d088
-13d08713cf8713cf8613ce8513ce8512cd8412cd8312cc8212cc8212cb8112cb8012cb8012ca8012
-ca7f12c97e12c97d12c87c12c87c12c77b12c77a12c67912c67912c57811c57711c47611c47511c3
-7411c27311c27211c17111c17011c07011c06f11bf6e11bf6d10be6c10bd6b10
-
-da9814da9714d99714d99614d99614d89514d89414d79414d79314d79313d69213d69113d59113d5
-9013d58f13d48f13d48e13d38d13d38d13d38c13d28b13d28b13d18a13d18913d08913d08813cf87
-13cf8713cf8613ce8512ce8412cd8412cd8312cc8212cc8112cb8112cb8012ca8012ca8012c97f12
-c97e12c87d12c87c12c87c12c77b12c77a12c67912c67912c57811c57711c47611c37511c37411c2
-7311c27211c17111c17011c07011c06f11bf6e11bf6d10be6c10bd6b10bd6a10
-
-d99714d99614d99614d89514d89514d89414d79314d79313d69213d69213d69113d59013d59013d4
-8f13d48e13d48e13d38d13d38c13d28c13d28b13d18a13d18a13d18913d08813d08813cf8713cf86
-13ce8613ce8512ce8412cd8312cd8312cc8212cc8112cb8112cb8012ca8012ca7f12c97f12c97e12
-c87d12c87c12c77c12c77b12c67a12c67912c67912c57811c47711c47611c37511c37411c27311c2
-7211c17111c17011c07011c06f11bf6e11bf6d10be6c10bd6b10bd6a10bc6910
-
-d99614d89514d89514d89414d79414d79314d79313d69213d69113d59113d59013d58f13d48f13d4
-8e13d38d13d38d13d38c13d28b13d28b13d18a13d18913d08913d08813d08713cf8713cf8613ce85
-13ce8512ce8412cd8312cd8312cc8212cc8112cb8012cb8012ca8012ca7f12c97e12c97e12c87d12
-c87c12c77c12c77b12c67a12c67912c67912c57811c47711c47611c37511c37411c27311c27211c1
-7111c17011c07011c06f11bf6e11bf6d10be6c10be6b10bd6a10bc6910bc6810
-
-d89514d89414d79414d79314d79313d69213d69113d69113d59013d59013d48f13d48e13d48e13d3
-8d13d38d13d28c13d28b13d28b13d18a13d18913d08913d08813cf8713cf8713cf8613ce8513ce85
-12cd8412cd8312cc8212cc8212cc8112cb8012cb8012ca8012ca7f12c97e12c97e12c87d12c87c12
-c77b12c77b12c67a12c67912c67912c57711c47711c47611c37511c37411c27311c27211c17111c1
-7011c07011c06f11bf6e11bf6d10be6c10be6b10bd6a10bc6910bc6810bb6710
-
-d89414d79314d79313d79213d69213d69113d59113d59013d58f13d48f13d48e13d38d13d38d13d3
-8c13d28c13d28b13d18a13d18a13d18913d08813d08813cf8713cf8613ce8613ce8512ce8412cd84
-12cd8312cc8212cc8112cb8112cb8012cb8012ca8012ca7f12c97e12c97e12c87d12c87c12c77b12
-c77a12c67a12c67912c57811c57711c47711c47611c37511c37411c27311c27211c17111c17011c0
-7011c06f11bf6e11bf6d10be6c10be6b10bd6a10bc6910bc6810bb6710bb6610
-
-d79314d79313d69213d69113d69113d59013d58f13d48f13d48e13d48e13d38d13d38d13d28c13d2
-8b13d28b13d18a13d18913d08913d08813d08713cf8713cf8613ce8513ce8512ce8412cd8312cd83
-12cc8212cc8112cb8112cb8012ca8012ca8012ca7f12c97e12c97d12c87d12c87c12c77b12c77a12
-c67a12c67912c57811c57711c47611c47611c37511c37411c27311c27211c17111c17011c06f11c0
-6f11bf6e11bf6d10be6c10be6b10bd6a10bc6910bc6810bb6710bb6710ba6610
-
-d69213d69113d69113d59013d59013d58f13d48f13d48e13d38d13d38d13d38c13d28b13d28b13d1
-8a13d18a13d18913d08813d08813cf8713cf8713cf8613ce8513ce8512cd8412cd8312cd8312cc82
-12cc8112cb8012cb8012ca8012ca7f12c97f12c97e12c87d12c87c12c87c12c77b12c77a12c67a12
-c67912c57811c57711c47611c47511c37511c37411c27311c27211c17111c17011c06f11c06f11bf
-6e11bf6d10be6c10be6b10bd6a10bc6910bc6810bb6710bb6710ba6610ba6510
-
-d69113d59113d59013d58f13d48f13d48e13d48e13d38d13d38c13d28c13d28b13d28b13d18a13d1
-8913d08913d08813d08713cf8713cf8613ce8513ce8512ce8412cd8412cd8312cc8212cc8212cb81
-12cb8012cb8012ca8012ca7f12c97e12c97e12c87d12c87c12c77c12c77b12c77a12c67912c67912
-c57811c57711c47611c47511c37411c37411c27311c27211c17111c17011c06f11c06e11bf6e11be
-6d10be6c10bd6b10bd6a10bc6910bc6810bb6710bb6710ba6610ba6510b96410
-
-d59013d58f13d48f13d48e13d48e13d38d13d38d13d38c13d28b13d28b13d18a13d18a13d18913d0
-8813d08813cf8713cf8713cf8613ce8513ce8512cd8412cd8312cd8312cc8212cc8112cb8112cb80
-12ca8012ca8012ca7f12c97e12c97e12c87d12c87c12c77b12c77b12c67a12c67912c67912c57811
-c57711c47611c47511c37411c37411c27311c27211c17111c17011c06f11c06e11bf6e11be6d10be
-6c10bd6b10bd6a10bc6910bc6810bb6710bb6610ba6610ba6510b96410b96310
-
-d48f13d48f13d48e13d38d13d38d13d38c13d28c13d28b13d28b13d18a13d18913d08913d08813d0
-8713cf8713cf8613ce8613ce8512ce8412cd8412cd8312cc8212cc8212cc8112cb8012cb8012ca80
-12ca7f12c97f12c97e12c97d12c87d12c87c12c77b12c77a12c67a12c67912c67912c57711c47711
-c47611c47511c37411c37311c27311c17211c17111c17011c06f11c06e11bf6d10be6d10be6c10bd
-6b10bd6a10bc6910bc6810bb6710bb6610ba6610ba6510b96410b96310b96310
-
-d48e13d38d13d38d13d38c13d28c13d28b13d28b13d18a13d18913d18913d08813d08813cf8713cf
-8713cf8613ce8513ce8512cd8412cd8312cd8312cc8212cc8112cb8112cb8012cb8012ca8012ca7f
-12c97e12c97e12c87d12c87c12c87c12c77b12c77a12c67a12c67912c57811c57711c47711c47611
-c37511c37411c27311c27211c17211c17111c07011c06f11bf6e11bf6d10be6d10be6c10bd6b10bd
-6a10bc6910bc6810bb6710bb6610ba6610ba6510b96410b96310b96310b96310
-
-d38d13d38d13d28c13d28b13d28b13d18a13d18a13d18913d08913d08813d08713cf8713cf8613ce
-8513ce8512ce8412cd8412cd8312cc8212cc8212cc8112cb8112cb8012ca8012ca8012ca7f12c97e
-12c97e12c87d12c87c12c77c12c77b12c77a12c67912c67912c57811c57711c47611c47611c37511
-c37411c27311c27211c17111c17111c07011c06f11bf6e11bf6d10be6c10be6c10bd6b10bd6a10bc
-6910bc6810bb6710bb6610ba6510ba6510b96410b96310b96310b96310b96310
-
-d38c13d28b13d28b13d18a13d18a13d18913d08913d08813d08713cf8713cf8613ce8613ce8513ce
-8512cd8412cd8312cd8312cc8212cc8112cb8112cb8012cb8012ca8012ca7f12c97f12c97e12c97d
-12c87d12c87c12c77b12c77b12c67a12c67912c67912c57811c57711c47611c47511c37511c37411
-c27311c27211c17111c17011c07011c06f11bf6e11bf6d10be6c10be6b10bd6b10bd6a10bc6910bc
-6810bb6710bb6610ba6510ba6510b96410b96310b96310b96310b96310b96310
-
-d28b13d28b13d18a13d18913d08913d08813d08813cf8713cf8713cf8613ce8513ce8512ce8412cd
-8412cd8312cc8212cc8212cc8112cb8112cb8012ca8012ca8012ca7f12c97e12c97e12c87d12c87c
-12c87c12c77b12c77a12c67a12c67912c57811c57711c47711c47611c47511c37411c37411c27311
-c27211c17111c17011c06f11c06f11bf6e11bf6d10be6c10be6b10bd6a10bd6a10bc6910bc6810bb
-6710bb6610ba6510ba6410b96410b96310b96310b96310b96310b96310b96310
-
-d18a13d18913d18913d08813d08813cf8713cf8713cf8613ce8613ce8512ce8412cd8412cd8312cd
-8312cc8212cc8112cb8112cb8012cb8012ca8012ca7f12c97f12c97e12c97d12c87d12c87c12c77b
-12c77b12c67a12c67912c67912c57811c57711c47611c47611c37511c37411c37311c27311c17211
-c17111c17011c06f11c06e11bf6e11bf6d10be6c10be6b10bd6a10bd6a10bc6910bc6810bb6710bb
-6610ba6510ba6410b96410b96310b96310b96310b96310b96310b96310b96310
-
-d18913d08913d08813d08713cf8713cf8613ce8613ce8513ce8512ce8412cd8312cd8312cc8212cc
-8212cc8112cb8112cb8012ca8012ca8012ca7f12c97e12c97e12c87d12c87c12c87c12c77b12c77a
-12c67a12c67912c67912c57811c57711c47611c47511c37511c37411c27311c27211c17111c17111
-c07011c06f11c06e11bf6d10be6d10be6c10be6b10bd6a10bd6910bc6910bb6810bb6710bb6610ba
-6510ba6410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d08813d08713cf8713cf8613cf8613ce8513ce8512ce8412cd8412cd8312cd8312cc8212cc8112cb
-8112cb8012cb8012ca8012ca7f12c97f12c97e12c97d12c87d12c87c12c77c12c77b12c77a12c67a
-12c67912c57811c57711c47711c47611c47511c37411c37411c27311c27211c17111c17011c07011
-c06f11bf6e11bf6d10be6c10be6c10bd6b10bd6a10bc6910bc6810bb6810bb6710ba6610ba6510b9
-6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cf8713cf8713cf8613ce8513ce8512ce8412cd8412cd8312cd8312cc8212cc8112cc8112cb8012cb
-8012ca8012ca8012ca7f12c97e12c97e12c87d12c87c12c87c12c77b12c77b12c67a12c67912c679
-12c57811c57711c47611c47611c37511c37411c37311c27311c27211c17111c17011c06f11c06f11
-bf6e11bf6d10be6c10be6b10bd6b10bd6a10bc6910bc6810bb6710bb6710ba6610ba6510b96410b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cf8613ce8513ce8512ce8412cd8412cd8312cd8312cc8212cc8212cc8112cb8112cb8012cb8012ca
-8012ca7f12c97f12c97e12c97d12c87d12c87c12c77c12c77b12c77a12c67a12c67912c67912c578
-11c57711c47611c47511c37511c37411c27311c27211c17211c17111c17011c06f11c06e11bf6e11
-bf6d10be6c10be6b10bd6b10bd6a10bc6910bc6810bb6710bb6610ba6610ba6510b96410b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-Q
-Q
-Q
-Q
-q
-q
-n
-268 139 m
-332 139 l
-332 75 l
-268 75 l
-268 139 l
-h
-W
-q
-q
-[64 0 0 64 268 75]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-d18913d08813cf8713cf8613ce8513ce8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c9
-7d12c87c12c77b12c77a12c67912c67912c57711c47611c37511c37411c27311c17211c17011c06f
-11bf6e11bf6d10be6c10bd6b10bd6a10bc6810bb6710bb6610ba6510b96410b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d08913d08713cf8713ce8613ce8512cd8412cd8312cc8212cb8112cb8012ca8012c97f12c97e12c8
-7d12c87c12c77b12c67a12c67912c57811c47711c47511c37411c27311c27211c17111c07011c06f
-11bf6e11be6c10be6b10bd6a10bc6910bc6810bb6710ba6610ba6410b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d08813cf8713cf8613ce8512ce8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c8
-7c12c77b12c77a12c67912c57811c57711c47611c37511c37411c27311c17111c17011c06f11bf6e
-11bf6d10be6c10bd6b10bd6a10bc6810bb6710bb6610ba6510b96410b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cf8713cf8613ce8513ce8412cd8312cd8312cc8112cb8112cb8012ca8012c97f12c97e12c87d12c7
-7c12c77b12c67a12c67912c57811c47611c47511c37411c27311c27211c17111c07011c06f11bf6d
-10be6c10be6b10bd6a10bc6910bc6810bb6710ba6610ba6410b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cf8713ce8613ce8512cd8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c7
-7b12c67a12c67912c57811c57711c47611c37511c37411c27211c17111c17011c06f11bf6e11bf6d
-10be6c10bd6b10bd6910bc6810bb6710bb6610ba6510b96410b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cf8613ce8512ce8412cd8312cc8212cc8112cb8012cb8012ca7f12c97e12c97d12c87c12c77c12c7
-7a12c67a12c67912c57711c47611c47511c37411c27311c27211c17111c07011c06e11bf6d10be6c
-10be6b10bd6a10bc6910bb6810bb6710ba6510ba6410b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-ce8513ce8512cd8312cd8312cc8212cb8112cb8012ca8012c97f12c97e12c87d12c87c12c77b12c6
-7a12c67912c57811c47711c47611c37511c37311c27211c17111c17011c06f11bf6e11be6d10be6c
-10bd6a10bd6910bc6810bb6710bb6610ba6510b96410b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-ce8512cd8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c77a12c6
-7912c67912c57711c47611c37511c37411c27311c17211c17111c06f11c06e11bf6d10be6c10bd6b
-10bd6a10bc6910bb6810bb6710ba6510ba6410b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-ce8412cd8312cc8212cc8112cb8012cb8012ca8012c97e12c97e12c87d12c77c12c77b12c67a12c6
-7912c57811c47711c47511c37411c27311c27211c17111c07011c06f11bf6e11be6d10be6b10bd6a
-10bc6910bc6810bb6710ba6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cd8312cd8312cc8212cb8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c5
-7811c57711c47611c37511c37411c27311c17111c17011c06f11bf6e11bf6d10be6c10bd6b10bd6a
-10bc6910bb6710bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c97d12c87c12c77b12c77a12c67a12c67912c5
-7711c47611c47511c37411c27311c27211c17111c07011c06f11bf6e11be6c10be6b10bd6a10bc69
-10bc6810bb6710ba6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cc8212cc8112cb8012cb8012ca8012c97e12c97e12c87d12c87c12c77b12c67a12c67912c57811c4
-7711c47611c37411c37311c27211c17111c17011c06f11bf6e11bf6d10be6c10bd6b10bd6a10bc68
-10bb6710bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cc8212cb8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c77a12c67912c57811c57711c4
-7611c37511c37411c27311c17211c17111c06f11c06e11bf6d10be6c10be6b10bd6a10bc6910bc68
-10bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cc8112cb8012ca8012ca7f12c97e12c97d12c87c12c77b12c77a12c67a12c67912c57711c47611c4
-7511c37411c27311c27211c17111c07011c06f11bf6e11be6d10be6c10bd6a10bd6910bc6810bb67
-10bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cb8012cb8012ca7f12c97e12c97e12c87d12c87c12c77b12c67a12c67912c57811c47711c47611c3
-7511c37311c27211c17111c17011c06f11bf6e11bf6d10be6c10bd6b10bd6a10bc6910bb6810bb66
-10ba6510ba6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cb8012ca8012c97f12c97e12c87d12c87c12c77b12c67a12c67912c57811c57711c47611c37511c3
-7411c27311c17211c17111c07011c06e11bf6d10be6c10be6b10bd6a10bc6910bc6810bb6710ba66
-10ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-ca8012ca7f12c97e12c87d12c87c12c77b12c77a12c67a12c67912c57711c47611c47511c37411c2
-7311c27211c17111c07011c06f11bf6e11be6d10be6c10bd6b10bd6910bc6810bb6710bb6610ba65
-10b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-ca7f12c97e12c97d12c87c12c77c12c77b12c67a12c67912c57811c47711c47611c37511c37311c2
-7211c17111c17011c06f11bf6e11bf6d10be6c10bd6b10bd6a10bc6910bb6810bb6710ba6610ba64
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c97f12c97e12c87d12c87c12c77b12c67a12c67912c57811c57711c47611c37511c37411c27311c1
-7211c17111c07011c06f11bf6d10be6c10be6b10bd6a10bc6910bc6810bb6710ba6610ba6510b964
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c97e12c87d12c87c12c77b12c77a12c67912c67912c57711c47611c47511c37411c27311c27211c1
-7111c07011c06f11bf6e11bf6d10be6c10bd6b10bd6a10bc6810bb6710bb6610ba6510b96410b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c87d12c87c12c77b12c77a12c67a12c67912c57811c47711c47511c37411c37311c27211c17111c1
-7011c06f11bf6e11bf6d10be6c10bd6b10bd6a10bc6910bc6810bb6710ba6610ba6510b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c87c12c77c12c77b12c67a12c67912c57811c57711c47611c37511c37411c27311c17211c17111c0
-7011c06e11bf6d10be6c10be6b10bd6a10bc6910bc6810bb6710ba6610ba6510b96410b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c87c12c77b12c67a12c67912c57811c57711c47611c47511c37411c27311c27211c17111c07011c0
-6f11bf6e11be6d10be6c10bd6b10bd6a10bc6810bb6710bb6610ba6510b96410b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c77b12c77a12c67912c67912c57711c47611c47511c37411c27311c27211c17111c17011c06f11bf
-6e11bf6d10be6c10bd6b10bd6a10bc6910bc6810bb6710ba6610ba6510b96410b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c77a12c67a12c67912c57811c47711c47611c37511c37311c27211c17111c17011c06f11c06e11bf
-6d10be6c10be6b10bd6a10bc6910bc6810bb6710ba6610ba6510b96410b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c67a12c67912c57811c57711c47611c37511c37411c27311c17211c17111c07011c06f11bf6e11be
-6d10be6c10bd6a10bd6910bc6810bb6710bb6610ba6510b96410b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c67912c57811c57711c47611c37511c37411c27311c27211c17111c07011c06f11bf6e11bf6d10be
-6c10bd6b10bd6a10bc6910bb6810bb6710ba6610ba6510b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c57811c57711c47611c47511c37411c27311c27211c17111c17011c06f11bf6e11bf6d10be6c10be
-6b10bd6a10bc6910bc6810bb6710ba6610ba6510b96410b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c57711c47611c47511c37411c37311c27211c17111c17011c06f11c06e11bf6d10be6c10be6b10bd
-6a10bc6910bc6810bb6710bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c47711c47611c37511c37411c27311c17211c17111c07011c06f11bf6e11be6d10be6c10bd6b10bd
-6a10bc6810bb6710bb6610ba6510ba6410b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c47611c37511c37411c27311c27211c17111c07011c06f11bf6e11bf6d10be6c10bd6b10bd6a10bc
-6910bb6810bb6710ba6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c37511c37411c27311c27211c17111c17011c06f11bf6e11bf6d10be6c10bd6b10bd6a10bc6910bc
-6810bb6710ba6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c37411c27311c27211c17111c17011c06f11bf6e11bf6d10be6c10be6b10bd6a10bc6910bc6810bb
-6710bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c37311c27211c17111c17011c06f11c06e11bf6d10be6c10be6b10bd6a10bd6910bc6810bb6710bb
-6610ba6510ba6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c27211c17211c17111c07011c06f11bf6e11be6d10be6c10bd6b10bd6a10bc6910bb6810bb6710ba
-6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c17211c17111c07011c06f11bf6e11bf6d10be6c10bd6b10bd6a10bc6910bc6810bb6710ba6610ba
-6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c17111c07011c06f11bf6e11bf6d10be6c10bd6b10bd6a10bc6910bc6810bb6710bb6610ba6510b9
-6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c07011c06f11bf6e11bf6d10be6c10be6b10bd6a10bc6910bc6810bb6710bb6610ba6510b96410b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c06f11bf6e11bf6d10be6c10be6b10bd6a10bd6910bc6810bb6710bb6610ba6510ba6410b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-c06e11bf6d10be6c10be6b10bd6a10bd6910bc6810bb6810bb6710ba6610ba6510b96410b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bf6d10be6c10be6c10bd6b10bd6a10bc6910bb6810bb6710ba6610ba6510b96410b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-be6d10be6c10bd6b10bd6a10bc6910bc6810bb6710ba6610ba6510b96410b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-be6c10bd6b10bd6a10bc6910bc6810bb6710ba6610ba6510b96410b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bd6b10bd6a10bc6910bc6810bb6710bb6610ba6510b96410b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bd6a10bc6910bc6810bb6710bb6610ba6510ba6410b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bc6910bc6810bb6710bb6610ba6510ba6410b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bc6810bb6710bb6610ba6510ba6410b96410b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bb6710bb6610ba6510ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-bb6610ba6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-ba6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b963
-10b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-Q
-Q
-Q
-Q
-q
-q
-n
-12 203 m
-76 203 l
-76 139 l
-12 139 l
-12 203 l
-h
-W
-q
-q
-[64 0 0 64 12 139]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4
-c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c727f5c829f5c82af5c9
-2cf5c92ef5ca30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5ce3ef5ce41f5cf43f5cf44f5d046
-f5d048f5d14af6d14cf6d24ef6d250f6d352f6d354f6d456f6d458f6d55af6d55cf6d65ef6d660f6
-d762f6d764f6d866f6d868f6d96af6d96cf6da6df6da6ff6db71f6db73f6dc75
-
-efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f2bf17f2c017f2c017f3c117f3c117f3c217f4
-c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c9
-2cf5c92ef5ca30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42f5cf44f5cf46
-f5d048f5d04af5d14bf6d14ef6d250f6d252f6d354f6d355f6d457f6d459f6d55bf6d55df6d65ff6
-d661f6d763f6d765f6d867f6d869f6d96bf6d96cf6da6ef6da70f6db72f6db74
-
-efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3
-c217f4c217f4c317f4c317f5c419f5c41bf5c51df5c51ff5c621f5c723f5c725f5c827f5c829f5c9
-2bf5c92df5ca2ff5ca31f5cb33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45
-f5d047f5d049f5d14bf6d14df6d24ff6d251f6d353f6d355f6d456f6d458f6d55bf6d55df6d65ef6
-d660f6d762f6d764f6d866f6d868f6d96af6d96cf6da6ef6da6ff6db71f6db73
-
-efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3
-c217f4c217f4c317f4c317f5c419f5c41bf5c51df5c51ff5c621f5c623f5c724f5c727f5c829f5c8
-2bf5c92df5c92ff5ca31f5ca33f5cb35f5cc37f5cc38f5cc3af5cd3cf5ce3ef5ce41f5cf43f5cf44
-f5d046f5d048f5d14af6d14cf6d14ef6d250f6d352f6d354f6d456f6d458f6d55af6d55cf6d55df6
-d65ff6d761f6d763f6d765f6d867f6d869f6d96bf6d96df6da6ef6da70f6db72
-
-efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3
-c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c8
-2af5c92cf5c92ef5ca30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42f5cf44
-f5cf45f5d047f5d049f5d14bf6d14ef6d24ff6d251f6d353f6d355f6d457f6d459f6d55bf6d55df6
-d65ff6d661f6d762f6d764f6d866f6d868f6d96af6d96cf6da6ef6da6ff6db71
-
-efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f2bf17f2c017f2c017f3c117f3c117f3
-c117f3c217f4c217f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c723f5c725f5c827f5c8
-29f5c92bf5c92df5ca2ff5ca31f5cb33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43
-f5cf45f5d047f5d049f5d14bf6d14df6d24ef6d250f6d352f6d354f6d456f6d458f6d55af6d55cf6
-d65ef6d65ff6d761f6d763f6d765f6d867f6d869f6d96bf6d96cf6da6ef6da70
-
-efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3
-c117f3c217f4c217f4c317f4c317f5c419f5c41bf5c51df5c51ff5c621f5c623f5c725f5c727f5c8
-29f5c82bf5c92df5c92ff5ca31f5ca33f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42
-f5cf44f5d046f5d048f5d04af5d14cf6d14ef6d250f6d252f6d353f6d355f6d457f6d459f6d55bf6
-d55df6d65ff6d661f6d762f6d764f6d866f6d868f6d96af6d96cf6da6df6da6f
-
-efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3
-c117f3c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c8
-28f5c82af5c92cf5c92ef5ca30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce3ff5ce41
-f5cf43f5cf45f5d047f5d049f5d14bf6d14df6d24ff6d251f6d352f6d354f6d456f6d458f6d55af6
-d55cf6d65ef6d65ff6d761f6d763f6d765f6d867f6d869f6d96af6d96cf6da6e
-
-efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1be17f2bf17f2c017f2c017f3c117f3
-c117f3c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c723f5c725f5c8
-27f5c829f5c92bf5c92df5ca2ff5ca31f5cb33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ef5ce41
-f5cf43f5cf45f5d046f5d048f5d14af5d14cf6d14ef6d250f6d252f6d354f6d355f6d457f6d459f6
-d55bf6d55df6d65ff6d661f6d762f6d764f6d866f6d868f6d96af6d96bf6d96d
-
-eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3
-c117f3c117f3c217f4c217f4c317f4c317f5c419f5c41bf5c51df5c51ff5c621f5c623f5c724f5c7
-27f5c829f5c82bf5c92df5c92ef5ca30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40
-f5ce42f5cf43f5cf45f5d047f5d049f5d14bf6d14df6d24ff6d251f6d352f6d354f6d456f6d458f6
-d55af6d55cf6d65ef6d65ff6d661f6d763f6d765f6d867f6d868f6d96af6d96c
-
-eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3
-c117f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c7
-26f5c828f5c82af5c92cf5c92ef5ca2ff5ca31f5cb34f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3f
-f5ce41f5cf43f5cf45f5d047f5d048f5d14af5d14cf6d14ef6d250f6d252f6d354f6d355f6d457f6
-d459f6d55bf6d55df6d65ef6d660f6d762f6d764f6d865f6d867f6d869f6d96b
-
-eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3
-c117f3c117f3c217f4c217f4c217f4c317f5c418f5c41af5c51cf5c51df5c51ff5c621f5c723f5c7
-25f5c727f5c829f5c92bf5c92df5c92ff5ca31f5ca33f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3e
-f5ce40f5ce42f5cf44f5cf45f5d047f5d049f5d14bf6d14df6d24ff6d251f6d352f6d354f6d456f6
-d458f6d55af6d55bf6d55df6d65ff6d661f6d763f6d764f6d866f6d868f6d96a
-
-eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2
-c017f3c117f3c117f3c217f4c217f4c317f4c317f5c419f5c41bf5c51df5c51ef5c620f5c622f5c7
-24f5c726f5c828f5c82af5c92cf5c92ef5ca30f5ca32f5cb34f5cb36f5cc38f5cc39f5cd3bf5cd3d
-f5ce3ff5ce41f5cf43f5cf45f5d047f5d048f5d14af5d14cf6d14ef6d250f6d252f6d353f6d355f6
-d457f6d458f6d55bf6d55cf6d65ef6d660f6d761f6d763f6d765f6d867f6d868
-
-eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2
-c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c7
-24f5c725f5c827f5c829f5c92bf5c92df5ca2ff5ca31f5ca33f5cb35f5cc37f5cc38f5cc3af5cd3c
-f5cd3ef5ce40f5ce42f5cf44f5cf45f5d047f5d049f5d14bf6d14df6d24ff6d250f6d352f6d354f6
-d356f6d458f6d459f6d55bf6d55df6d65ff6d660f6d762f6d764f6d865f6d867
-
-eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1be17f2bf17f2c017f2
-c017f3c117f3c117f3c117f3c217f4c217f4c317f4c317f5c419f5c41bf5c51df5c51ff5c621f5c6
-23f5c724f5c727f5c829f5c82af5c92cf5c92ef5ca30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3b
-f5cd3df5ce3ff5ce41f5cf43f5cf45f5d046f5d048f5d04af5d14cf6d14ef6d250f6d251f6d353f6
-d355f6d456f6d458f6d55af6d55cf6d55df6d65ff6d661f6d763f6d764f6d866
-
-edb916eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2
-c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c6
-22f5c724f5c726f5c828f5c829f5c92bf5c92df5ca2ff5ca31f5ca33f5cb35f5cc37f5cc38f5cc3a
-f5cd3cf5cd3ef5ce40f5ce42f5cf43f5cf45f5d047f5d049f5d14bf6d14df6d24ef6d250f6d352f6
-d354f6d355f6d457f6d459f6d55bf6d55cf6d65ef6d660f6d761f6d763f6d765
-
-edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2
-c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51df5c51ff5c6
-21f5c623f5c725f5c727f5c829f5c82bf5c92cf5c92ef5ca30f5ca32f5cb34f5cb36f5cc38f5cc39
-f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf44f5d046f5d048f5d04af5d14bf6d14df6d24ff6d251f6
-d352f6d354f6d456f6d458f6d459f6d55bf6d55df6d65ff6d660f6d762f6d763
-
-edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f2bf17f2
-bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c419f5c41af5c51cf5c51ef5c6
-20f5c622f5c724f5c726f5c828f5c82af5c92bf5c92df5ca2ff5ca31f5ca33f5cb35f5cb36f5cc38
-f5cc3af5cd3cf5cd3ef5ce40f5ce41f5cf43f5cf45f5d047f5d049f5d14af5d14cf6d14ef6d250f6
-d251f6d353f6d355f6d456f6d458f6d55af6d55bf6d55df6d65ff6d661f6d762
-
-edb816edb916eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2
-bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c5
-1ff5c621f5c623f5c725f5c727f5c829f5c82bf5c92cf5c92ef5ca30f5ca32f5cb34f5cb36f5cc37
-f5cc39f5cd3bf5cd3df5ce3ef5ce41f5ce42f5cf44f5cf46f5d047f5d049f5d14bf6d14df6d24ef6
-d250f6d352f6d354f6d355f6d457f6d458f6d55af6d55cf6d55df6d65ff6d661
-
-edb716edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2
-bf17f2c017f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c419f5c41bf5c51cf5c5
-1ef5c620f5c622f5c724f5c726f5c828f5c829f5c92bf5c92df5ca2ff5ca31f5ca33f5cb34f5cb36
-f5cc38f5cc3af5cd3cf5cd3ef5ce3ff5ce41f5cf43f5cf45f5d046f5d048f5d04af5d14bf6d14df6
-d24ff6d251f6d352f6d354f6d356f6d457f6d459f6d55bf6d55cf6d65ef6d65f
-
-edb716edb816edb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1
-bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c5
-1ef5c51ff5c621f5c623f5c725f5c727f5c829f5c82bf5c92cf5c92ef5ca30f5ca31f5cb34f5cb35
-f5cc37f5cc39f5cd3bf5cd3cf5cd3ef5ce40f5ce42f5cf43f5cf45f5d047f5d049f5d14af5d14cf6
-d14ef6d250f6d251f6d353f6d354f6d456f6d458f6d459f6d55bf6d55df6d65e
-
-ecb716edb816edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1
-bf17f2bf17f2c017f2c017f3c117f3c117f3c117f3c217f4c217f4c317f4c317f5c419f5c41bf5c5
-1cf5c51ef5c620f5c622f5c724f5c726f5c828f5c829f5c92bf5c92df5ca2ff5ca31f5ca32f5cb34
-f5cb36f5cc38f5cc3af5cd3bf5cd3df5ce3ff5ce41f5ce42f5cf44f5cf46f5d047f5d049f5d14bf6
-d14df6d24ef6d250f6d252f6d353f6d355f6d456f6d458f6d55af6d55bf6d55d
-
-ecb616edb716edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0bc17f0bd17f0bd17f1be17f1
-be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c5
-1cf5c51ef5c51ff5c621f5c623f5c725f5c727f5c829f5c82af5c92cf5c92ef5ca2ff5ca31f5cb33
-f5cb35f5cc37f5cc38f5cc3af5cd3cf5cd3ef5ce3ff5ce41f5cf43f5cf45f5d046f5d048f5d049f5
-d14bf6d14df6d24ff6d250f6d352f6d354f6d355f6d456f6d458f6d55af6d55b
-
-ecb616ecb716edb816edb916eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1
-be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c117f3c217f4c217f4c317f4c317f5c419f5c4
-1bf5c51cf5c51ef5c620f5c622f5c724f5c726f5c827f5c829f5c92bf5c92df5c92ff5ca30f5ca32
-f5cb34f5cb36f5cc37f5cc39f5cd3bf5cd3cf5cd3ef5ce40f5ce42f5cf43f5cf45f5d047f5d048f5
-d04af5d14bf6d14df6d24ff6d250f6d352f6d354f6d355f6d457f6d458f6d55a
-
-ecb616ecb716edb716edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1
-be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c4
-1af5c51cf5c51df5c51ff5c621f5c623f5c724f5c726f5c828f5c82af5c92cf5c92df5ca2ff5ca31
-f5ca33f5cb34f5cb36f5cc38f5cc3af5cd3bf5cd3df5ce3ff5ce41f5ce42f5cf44f5cf45f5d047f5
-d049f5d14af5d14cf6d14ef6d24ff6d251f6d352f6d354f6d356f6d457f6d458
-
-ecb516ecb616ecb716edb816edb916eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1
-be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c117f3c217f4c217f4c317f4c317f5c4
-19f5c41af5c51cf5c51ef5c620f5c622f5c723f5c725f5c727f5c829f5c82bf5c92cf5c92ef5ca30
-f5ca31f5cb33f5cb35f5cc37f5cc38f5cc3af5cd3cf5cd3ef5ce3ff5ce41f5cf43f5cf44f5cf46f5
-d047f5d049f5d14bf6d14cf6d14ef6d250f6d251f6d352f6d354f6d356f6d457
-
-ebb516ecb616ecb716edb716edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f0
-bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c4
-18f5c41af5c41bf5c51df5c51ff5c620f5c622f5c724f5c726f5c828f5c829f5c92bf5c92df5c92f
-f5ca30f5ca32f5cb34f5cb36f5cc37f5cc39f5cc3af5cd3cf5cd3ef5ce40f5ce41f5cf43f5cf45f5
-d046f5d048f5d049f5d14bf6d14cf6d14ef6d250f6d251f6d353f6d354f6d356
-
-ebb516ecb616ecb616edb716edb816edb916eeba16eeba16efbb17efbb17efbc17f0bc17f0bd17f0
-bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c117f3c217f4c217f4c317f4c3
-17f5c418f5c41af5c51cf5c51ef5c620f5c621f5c623f5c725f5c727f5c828f5c82af5c92cf5c92d
-f5ca2ff5ca31f5ca33f5cb34f5cb36f5cc38f5cc39f5cd3bf5cd3df5ce3ef5ce40f5ce42f5cf43f5
-cf45f5d046f5d048f5d049f5d14bf6d14df6d24ef6d250f6d251f6d353f6d354
-
-ebb416ebb516ecb616ecb716edb716edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0
-bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c3
-17f5c418f5c419f5c41bf5c51df5c51ef5c620f5c622f5c724f5c725f5c827f5c829f5c82bf5c92c
-f5c92ef5ca30f5ca31f5cb33f5cb35f5cb36f5cc38f5cc3af5cd3bf5cd3df5ce3ef5ce40f5ce42f5
-cf43f5cf45f5d047f5d048f5d04af5d14bf6d14df6d24ef6d250f6d251f6d353
-
-ebb416ebb516ecb616ecb616edb716edb816edb916eeba16efbb17efbb17efbb17efbc17f0bc17f0
-bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c217f4c217f4c3
-17f4c317f5c418f5c41af5c51cf5c51df5c51ff5c621f5c622f5c724f5c726f5c828f5c829f5c92b
-f5c92df5c92ff5ca30f5ca32f5cb34f5cb35f5cc37f5cc38f5cc3af5cd3cf5cd3df5ce3ff5ce41f5
-ce42f5cf44f5cf45f5d047f5d048f5d04af5d14bf6d14df6d24ef6d250f6d251
-
-eab316ebb416ebb516ecb616ecb716edb816edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0
-bd17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f3c217f4c2
-17f4c317f4c317f5c419f5c41af5c51cf5c51ef5c620f5c621f5c723f5c725f5c727f5c828f5c82a
-f5c92cf5c92df5ca2ff5ca31f5ca32f5cb34f5cb36f5cc37f5cc39f5cc3af5cd3cf5cd3ef5ce3ff5
-ce41f5ce42f5cf44f5cf45f5d047f5d048f5d04af5d14bf6d14df6d24ef6d250
-
-eab316ebb416ebb516ecb616ecb616edb716edb816edb916eeba16eeba16efbb17efbb17efbc17f0
-bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c217f4c2
-17f4c317f4c317f5c418f5c419f5c41bf5c51df5c51ef5c620f5c622f5c724f5c725f5c727f5c829
-f5c82af5c92cf5c92ef5ca2ff5ca31f5ca33f5cb34f5cb36f5cc38f5cc39f5cd3bf5cd3cf5cd3ef5
-ce3ff5ce41f5cf43f5cf44f5cf45f5d047f5d048f5d04af5d14bf6d14df6d24e
-
-eab316eab416ebb416ebb516ecb616ecb716edb716edb816eeb916eeba16efbb17efbb17efbc17f0
-bc17f0bd17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c117f3c2
-17f4c217f4c317f4c317f5c418f5c41af5c51cf5c51df5c51ff5c621f5c622f5c724f5c726f5c827
-f5c829f5c82bf5c92df5c92ef5ca30f5ca31f5cb33f5cb34f5cb36f5cc38f5cc39f5cd3bf5cd3cf5
-cd3ef5ce3ff5ce41f5cf43f5cf44f5cf45f5d047f5d048f5d04af5d14bf6d14d
-
-eab216eab316ebb416ebb516ecb616ecb616edb716edb816edb916eeba16eeba16efbb17efbb17ef
-bc17f0bc17f0bd17f0bd17f1be17f1be17f1be17f2bf17f2bf17f2c017f2c017f3c117f3c117f3c2
-17f4c217f4c217f4c317f4c317f5c419f5c41af5c51cf5c51ef5c620f5c621f5c623f5c724f5c726
-f5c828f5c829f5c92bf5c92df5c92ef5ca30f5ca31f5cb33f5cb35f5cb36f5cc38f5cc3af5cd3bf5
-cd3cf5cd3ef5ce40f5ce41f5cf43f5cf44f5cf45f5d047f5d048f5d04af5d14b
-
-e9b216eab316eab416ebb416ebb516ecb616ecb716edb716edb816eeb916eeba16efbb17efbb17ef
-bc17f0bc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c1
-17f3c217f4c217f4c317f4c317f5c418f5c419f5c41bf5c51df5c51ef5c620f5c622f5c723f5c725
-f5c727f5c828f5c82af5c92bf5c92df5c92ff5ca30f5ca32f5cb34f5cb35f5cb36f5cc38f5cc3af5
-cd3bf5cd3cf5cd3ef5ce40f5ce41f5cf43f5cf44f5cf45f5d047f5d048f5d049
-
-e9b116eab216eab316ebb416ebb516ecb616ecb616edb716edb816edb916eeb916eeba16efbb17ef
-bb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c1
-17f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51df5c51ff5c620f5c622f5c724
-f5c725f5c727f5c829f5c82af5c92cf5c92df5ca2ff5ca30f5ca32f5cb34f5cb35f5cc37f5cc38f5
-cc3af5cd3bf5cd3cf5cd3ef5ce40f5ce41f5cf43f5cf44f5cf45f5d047f5d048
-
-e9b116e9b216eab316eab316ebb416ebb516ecb616ecb716edb716edb816eeb916eeba16efbb17ef
-bb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2bf17f2c017f2c017f3c1
-17f3c117f3c217f4c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c51ff5c621f5c622
-f5c724f5c726f5c827f5c829f5c82bf5c92cf5c92df5ca2ff5ca31f5ca32f5cb34f5cb35f5cc37f5
-cc38f5cc3af5cd3bf5cd3cf5cd3ef5ce3ff5ce41f5ce42f5cf44f5cf45f5d046
-
-e9b116e9b116eab216eab316ebb416ebb516ecb516ecb616ecb716edb816edb916eeb916eeba16ef
-bb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c0
-17f3c117f3c117f3c217f4c217f4c317f4c317f4c317f5c419f5c41af5c51cf5c51ef5c620f5c621
-f5c623f5c724f5c726f5c827f5c829f5c82bf5c92cf5c92ef5ca2ff5ca31f5ca32f5cb34f5cb35f5
-cc37f5cc38f5cc3af5cd3bf5cd3cf5cd3ef5ce3ff5ce41f5ce42f5cf43f5cf45
-
-e9b016e9b116e9b216eab216eab316ebb416ebb516ecb616ecb716edb716edb816eeb916eeba16ef
-bb17efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf17f2c017f2c0
-17f3c117f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c419f5c41bf5c51cf5c51ef5c620
-f5c621f5c623f5c724f5c726f5c828f5c829f5c82bf5c92cf5c92ef5ca2ff5ca31f5ca32f5cb34f5
-cb35f5cc37f5cc38f5cc3af5cd3bf5cd3cf5cd3ef5ce3ff5ce41f5ce42f5cf43
-
-e8b016e9b116e9b116eab216eab316ebb416ebb416ecb516ecb616ecb716edb816edb816eeb916ee
-ba16efbb17efbb17efbc17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2bf17f2c0
-17f2c017f3c117f3c117f3c217f3c217f4c217f4c317f4c317f5c418f5c41af5c41bf5c51df5c51e
-f5c620f5c622f5c723f5c725f5c726f5c828f5c829f5c92bf5c92cf5c92ef5ca2ff5ca31f5ca32f5
-cb34f5cb35f5cc37f5cc38f5cc3af5cd3bf5cd3cf5cd3ef5ce3ff5ce40f5ce42
-
-e8af16e8b016e9b116e9b216eab216eab316ebb416ebb516ecb616ecb616edb716edb816edb916ee
-b916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c0
-17f2c017f2c017f3c117f3c117f3c217f4c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51d
-f5c51ff5c620f5c622f5c723f5c725f5c727f5c828f5c829f5c92bf5c92cf5c92ef5ca2ff5ca31f5
-ca32f5cb34f5cb35f5cb36f5cc38f5cc39f5cc3af5cd3cf5cd3df5ce3ef5ce40
-
-e8af16e8b016e9b016e9b116eab216eab316eab416ebb416ebb516ecb616ecb716edb716edb816ee
-b916eeba16efbb17efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf
-17f2c017f2c017f3c117f3c117f3c117f3c217f4c217f4c317f4c317f4c317f5c419f5c41af5c51c
-f5c51df5c51ff5c620f5c622f5c723f5c725f5c727f5c828f5c829f5c92bf5c92cf5c92ef5ca2ff5
-ca31f5ca32f5cb34f5cb35f5cb36f5cc38f5cc39f5cc3af5cd3cf5cd3df5ce3e
-
-e8ae16e8af16e8b016e9b116e9b216eab216eab316ebb416ebb516ecb516ecb616ecb716edb816ed
-b916eeb916eeba16efbb17efbb17efbc17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1be17f1bf
-17f2bf17f2c017f2c017f3c117f3c117f3c117f3c217f4c217f4c317f4c317f4c317f5c419f5c41a
-f5c51cf5c51ef5c51ff5c620f5c622f5c724f5c725f5c727f5c828f5c829f5c92bf5c92cf5c92ef5
-ca2ff5ca31f5ca32f5cb34f5cb35f5cb36f5cc38f5cc39f5cc3af5cd3bf5cd3c
-
-e7ae16e8af16e8af16e9b016e9b116e9b216eab316eab316ebb416ebb516ecb616ecb616edb716ed
-b816edb916eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1bf
-17f2bf17f2bf17f2c017f2c017f3c117f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c419
-f5c41af5c51cf5c51ef5c51ff5c620f5c622f5c724f5c725f5c727f5c828f5c829f5c92bf5c92cf5
-c92ef5ca2ff5ca30f5ca32f5cb33f5cb34f5cb36f5cc37f5cc38f5cc3af5cd3b
-
-e7ae16e7ae16e8af16e8b016e9b116e9b116eab216eab316ebb416ebb416ebb516ecb616ecb716ed
-b716edb816eeb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be
-17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c217f3c217f4c217f4c317f4c317f5c418
-f5c419f5c41bf5c51cf5c51ef5c51ff5c620f5c622f5c724f5c725f5c727f5c828f5c829f5c82bf5
-c92cf5c92df5ca2ff5ca30f5ca31f5ca33f5cb34f5cb36f5cc37f5cc38f5cc39
-
-e7ad15e7ae16e8af16e8af16e8b016e9b116e9b216eab216eab316ebb416ebb516ecb616ecb616ec
-b716edb816edb916eeb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be
-17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c217f3c217f4c217f4c317f4c317
-f5c418f5c419f5c41bf5c51cf5c51ef5c51ff5c620f5c622f5c724f5c725f5c727f5c828f5c829f5
-c82bf5c92cf5c92df5c92ff5ca30f5ca31f5ca33f5cb34f5cb35f5cb36f5cc38
-
-e6ac15e7ad15e7ae16e8af16e8b016e9b016e9b116eab216eab316eab316ebb416ebb516ecb616ec
-b616edb716edb816edb916eeb916eeba16efbb17efbb17efbc17f0bc17f0bc17f0bd17f0bd17f1be
-17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c217f4c217f4c217f4c317
-f4c317f5c418f5c419f5c41bf5c51cf5c51ef5c51ff5c620f5c622f5c723f5c725f5c726f5c828f5
-c829f5c82af5c92cf5c92df5c92ef5ca30f5ca31f5ca32f5cb34f5cb35f5cb36
-
-e6ac15e7ad15e7ae16e8ae16e8af16e8b016e9b116e9b116eab216eab316ebb416ebb416ebb516ec
-b616ecb716edb716edb816eeb916eeba16eeba16efbb17efbb17efbc17f0bc17f0bc17f0bd17f0bd
-17f1be17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c117f3c217f4c217f4c217
-f4c317f4c317f5c418f5c419f5c41bf5c51cf5c51ef5c51ff5c620f5c622f5c723f5c724f5c726f5
-c827f5c829f5c82af5c92bf5c92df5c92ef5ca2ff5ca31f5ca32f5cb33f5cb34
-
-e6ac15e6ac15e7ad15e7ae16e8af16e8af16e9b016e9b116e9b216eab216eab316ebb416ebb516ec
-b516ecb616ecb716edb816edb816eeb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bd17f0bd
-17f0bd17f1be17f1be17f1bf17f2bf17f2bf17f2c017f2c017f3c117f3c117f3c117f3c217f4c217
-f4c217f4c317f4c317f5c418f5c419f5c41bf5c51cf5c51ef5c51ff5c620f5c622f5c723f5c724f5
-c726f5c827f5c829f5c82af5c92bf5c92cf5c92ef5ca2ff5ca30f5ca31f5ca33
-
-e6ab15e6ac15e6ad15e7ad15e7ae16e8af16e8b016e9b016e9b116eab216eab316eab316ebb416eb
-b516ecb616ecb616edb716edb816edb916eeb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bd
-17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2bf17f2c017f2c017f3c117f3c117f3c117f3c217
-f4c217f4c217f4c317f4c317f5c418f5c419f5c41bf5c51cf5c51ef5c51ff5c620f5c622f5c623f5
-c724f5c726f5c727f5c828f5c829f5c82bf5c92cf5c92df5c92ff5ca30f5ca31
-
-e5aa15e6ab15e6ac15e7ad15e7ae16e8ae16e8af16e8b016e9b116e9b116eab216eab316eab416eb
-b416ebb516ecb616ecb716edb716edb816edb916eeb916eeba16efbb17efbb17efbc17efbc17f0bc
-17f0bd17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2bf17f2c017f2c017f3c117f3c117f3c117
-f3c217f4c217f4c217f4c317f4c317f5c418f5c419f5c41af5c51cf5c51df5c51ff5c620f5c621f5
-c622f5c724f5c725f5c727f5c828f5c829f5c82af5c92bf5c92df5c92ef5ca2f
-
-e5aa15e5ab15e6ac15e6ac15e7ad15e7ae16e8af16e8af16e8b016e9b116e9b216eab216eab316eb
-b416ebb416ebb516ecb616ecb716edb716edb816eeb916eeba16eeba16efbb17efbb17efbc17efbc
-17f0bc17f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117
-f3c117f3c217f4c217f4c217f4c317f4c317f5c418f5c419f5c41af5c51cf5c51df5c51ef5c620f5
-c621f5c622f5c724f5c725f5c726f5c827f5c829f5c82af5c92bf5c92cf5c92d
-
-e5aa15e5aa15e6ab15e6ac15e6ad15e7ad15e7ae16e8af16e8b016e9b016e9b116e9b216eab216ea
-b316ebb416ebb516ecb516ecb616ecb716edb716edb816eeb916eeba16eeba16efbb17efbb17efbc
-17f0bc17f0bc17f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117
-f3c117f3c117f3c217f4c217f4c217f4c317f4c317f5c418f5c419f5c41af5c51cf5c51df5c51ef5
-c51ff5c621f5c622f5c723f5c724f5c726f5c727f5c828f5c829f5c82bf5c92c
-
-e4a915e5aa15e5aa15e6ab15e6ac15e7ad15e7ae16e7ae16e8af16e8b016e9b116e9b116eab216ea
-b316eab316ebb416ebb516ecb616ecb616ecb716edb816edb816eeb916eeba16efbb17efbb17efbb
-17efbc17f0bc17f0bc17f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c017
-f3c117f3c117f3c117f3c217f4c217f4c217f4c317f4c317f4c317f5c419f5c41af5c41bf5c51cf5
-c51ef5c51ff5c620f5c622f5c623f5c724f5c725f5c727f5c828f5c829f5c82a
-
-e4a915e5a915e5aa15e5ab15e6ac15e6ac15e7ad15e7ae16e8ae16e8af16e8b016e9b116e9b116ea
-b216eab316eab416ebb416ebb516ecb616ecb616edb716edb816edb916eeb916eeba16efbb17efbb
-17efbb17efbc17f0bc17f0bc17f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf17f2c017f2c017
-f2c017f3c117f3c117f3c117f3c217f3c217f4c217f4c317f4c317f4c317f5c418f5c41af5c41bf5
-c51cf5c51ef5c51ff5c620f5c621f5c622f5c724f5c725f5c726f5c727f5c828
-
-e4a815e4a915e5aa15e5aa15e6ab15e6ac15e6ac15e7ad15e7ae16e8af16e8af16e9b016e9b116e9
-b216eab216eab316ebb416ebb416ebb516ecb616ecb716edb716edb816edb916eeb916eeba16efbb
-17efbb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf17f2c017
-f2c017f2c017f3c117f3c117f3c117f3c217f3c217f4c217f4c317f4c317f4c317f5c418f5c419f5
-c41af5c51cf5c51df5c51ef5c620f5c621f5c622f5c623f5c724f5c725f5c727
-
-e4a715e4a815e4a915e5aa15e5aa15e6ab15e6ac15e6ad15e7ad15e7ae16e8af16e8b016e9b016e9
-b116e9b216eab216eab316ebb416ebb516ebb516ecb616ecb716edb716edb816edb916eeb916eeba
-16efbb17efbb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf17
-f2bf17f2c017f2c017f3c117f3c117f3c117f3c217f3c217f4c217f4c317f4c317f4c317f5c418f5
-c419f5c41af5c41bf5c51cf5c51ef5c51ff5c620f5c621f5c622f5c724f5c725
-
-e3a715e4a815e4a915e5a915e5aa15e5ab15e6ab15e6ac15e7ad15e7ae16e7ae16e8af16e8b016e9
-b016e9b116e9b216eab216eab316ebb416ebb516ecb516ecb616ecb716edb716edb816edb916eeb9
-16eeba16efbb17efbb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1bf17
-f2bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c117f3c217f4c217f4c217f4c317f4c317f4
-c317f5c418f5c41af5c41bf5c51cf5c51df5c51ef5c620f5c621f5c622f5c623
-
-e3a615e3a715e4a815e4a915e5a915e5aa15e5ab15e6ac15e6ac15e7ad15e7ae16e8ae16e8af16e8
-b016e9b116e9b116eab216eab316eab316ebb416ebb516ecb616ecb616ecb716edb716edb816eeb9
-16eeb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1be17
-f1bf17f2bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c117f3c217f4c217f4c217f4c317f4
-c317f4c317f5c418f5c419f5c41af5c51cf5c51df5c51ef5c51ff5c620f5c621
-
-e3a615e3a715e4a715e4a815e4a915e5aa15e5aa15e6ab15e6ac15e6ac15e7ad15e7ae16e8af16e8
-af16e8b016e9b116e9b116eab216eab316eab316ebb416ebb516ecb616ecb616ecb716edb716edb8
-16eeb916eeb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17
-f1be17f1bf17f2bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c117f3c217f3c217f4c217f4
-c317f4c317f4c317f5c418f5c419f5c41af5c41bf5c51cf5c51df5c51ef5c620
-
-e2a515e3a615e3a715e4a815e4a815e4a915e5aa15e5aa15e6ab15e6ac15e6ad15e7ad15e7ae16e8
-af16e8af16e9b016e9b116e9b116eab216eab316eab416ebb416ebb516ecb616ecb616ecb716edb7
-16edb816eeb916eeba16eeba16efbb17efbb17efbb17efbc17f0bc17f0bc17f0bd17f0bd17f1be17
-f1be17f1be17f1bf17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c117f3c217f3c217f4
-c217f4c217f4c317f4c317f4c317f5c418f5c419f5c41af5c51cf5c51df5c51e
-
-e2a515e2a515e3a615e3a715e4a815e4a915e5a915e5aa15e5ab15e6ab15e6ac15e7ad15e7ad15e7
-ae16e8af16e8af16e9b016e9b116e9b216eab216eab316eab416ebb416ebb516ecb616ecb616ecb7
-16edb816edb816eeb916eeba16eeba16efbb17efbb17efbb17efbc17f0bc17f0bc17f0bd17f0bd17
-f0bd17f1be17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c117f3c117f3
-c217f4c217f4c217f4c317f4c317f4c317f5c418f5c419f5c41af5c41bf5c51c
-
-e2a415e2a515e2a615e3a615e3a715e4a815e4a915e5a915e5aa15e5ab15e6ab15e6ac15e7ad15e7
-ae16e7ae16e8af16e8b016e9b016e9b116e9b216eab216eab316ebb416ebb416ebb516ecb616ecb6
-16ecb716edb816edb816eeb916eeb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bc17f0bd17
-f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3
-c117f3c217f3c217f4c217f4c217f4c317f4c317f4c317f5c418f5c419f5c41a
-
-e1a415e2a415e2a515e3a615e3a715e3a715e4a815e4a915e5a915e5aa15e5ab15e6ac15e6ac15e7
-ad15e7ae16e8ae16e8af16e8b016e9b016e9b116e9b216eab216eab316ebb416ebb416ebb516ecb6
-16ecb616ecb716edb816edb816eeb916eeb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bc17
-f0bd17f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf17f2bf17f2c017f2c017f2c017f3c117f3
-c117f3c117f3c117f3c217f4c217f4c217f4c317f4c317f4c317f4c317f5c418
-
-Q
-Q
-Q
-Q
-q
-q
-n
-76 203 m
-140 203 l
-140 139 l
-76 139 l
-76 203 l
-h
-W
-q
-q
-[64 0 0 64 76 139]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-f6dc77f6dc79f6dd7bf6de7df6de7ef6de80f7df81f7df83f7e085f7e087f7e188f7e18af7e28cf7
-e28ef7e38ff7e391f7e393f7e494f7e496f7e598f7e599f7e69bf7e69df7e69ef7e7a0f7e7a1f7e8
-a3f7e8a4f7e8a5f7e9a7f7e9a8f7e9aaf7eaabf7eaacf7eaadf7ebaef7ebb0f7ebb0f7ebb1f7ecb2
-f7ecb3f7ecb4f8ecb5f8ecb5f8ecb6f8edb6f8edb7f8edb7f8edb7f8edb7f8edb7f8edb7f8edb7f8
-edb7f8edb6f8ecb6f8ecb5f8ecb5f8ecb4f7ecb3f7ecb3f7ebb2f7ebb1f7ebb0
-
-f6dc76f6dc78f6dd7af6dd7bf6de7df6de7ff7df80f7df82f7e084f7e085f7e087f7e189f7e18bf7
-e28cf7e28ef7e390f7e392f7e493f7e495f7e496f7e598f7e59af7e69bf7e69df7e69ef7e7a0f7e7
-a1f7e8a3f7e8a4f7e8a5f7e9a7f7e9a8f7e9a9f7eaaaf7eaacf7eaadf7eaaef7ebaef7ebb0f7ebb0
-f7ebb1f7ecb2f7ecb2f7ecb3f7ecb4f8ecb4f8ecb5f8ecb5f8ecb5f8ecb5f8ecb5f8ecb5f8ecb5f8
-ecb5f8ecb4f7ecb4f7ecb3f7ecb3f7ecb2f7ebb2f7ebb1f7ebb0f7ebaff7eaae
-
-f6dc75f6dc77f6dc79f6dd7bf6dd7cf6de7ef6de80f7df81f7df83f7e084f7e086f7e188f7e189f7
-e18bf7e28df7e28ff7e390f7e392f7e494f7e495f7e597f7e598f7e59af7e69bf7e69df7e69ef7e7
-a0f7e7a1f7e7a2f7e8a4f7e8a5f7e8a6f7e9a8f7e9a9f7e9aaf7eaabf7eaacf7eaadf7eaaef7ebae
-f7ebaff7ebb0f7ebb0f7ebb1f7ebb2f7ecb2f7ecb2f7ecb2f7ecb3f7ecb3f7ecb3f7ecb3f7ecb3f7
-ecb2f7ecb2f7ebb2f7ebb1f7ebb1f7ebb0f7ebb0f7ebaff7eaaef7eaadf7eaac
-
-f6db74f6dc76f6dc78f6dd79f6dd7bf6de7df6de7ff7df80f7df81f7df83f7e085f7e087f7e188f7
-e18af7e28bf7e28ef7e38ff7e391f7e392f7e494f7e495f7e597f7e598f7e59af7e69bf7e69df7e6
-9ef7e79ff7e7a1f7e7a2f7e8a3f7e8a5f7e8a6f7e9a7f7e9a8f7e9a9f7e9aaf7eaabf7eaacf7eaac
-f7eaadf7eaaef7ebaef7ebaff7ebb0f7ebb0f7ebb0f7ebb0f7ebb1f7ebb1f7ebb1f7ebb1f7ebb1f7
-ebb0f7ebb0f7ebb0f7ebaff7ebaff7ebaef7eaaef7eaadf7eaacf7eaabf7eaaa
-
-f6db73f6dc75f6dc77f6dc79f6dd7af6dd7cf6de7ef6de7ff7df80f7df82f7e084f7e085f7e087f7
-e189f7e18af7e28cf7e28ef7e38ff7e391f7e392f7e494f7e495f7e597f7e598f7e59af7e69bf7e6
-9df7e69ef7e79ff7e7a1f7e7a2f7e8a3f7e8a4f7e8a5f7e8a6f7e9a7f7e9a8f7e9a9f7e9aaf7eaab
-f7eaabf7eaacf7eaacf7eaadf7eaaef7eaaef7ebaef7ebaef7ebaff7ebaff7ebaff7ebaff7ebaef7
-ebaef7eaaef7eaaef7eaadf7eaadf7eaacf7eaacf7eaabf7eaaaf7e9aaf7e9a9
-
-f6db72f6db74f6dc76f6dc77f6dd79f6dd7bf6de7df6de7ef6de80f7df81f7df83f7e084f7e086f7
-e187f7e189f7e18bf7e28cf7e28ef7e390f7e391f7e392f7e494f7e495f7e597f7e598f7e59af7e6
-9bf7e69cf7e69df7e69ff7e7a0f7e7a1f7e7a2f7e8a3f7e8a4f7e8a5f7e8a6f7e9a7f7e9a8f7e9a9
-f7e9aaf7e9aaf7eaabf7eaabf7eaacf7eaacf7eaacf7eaacf7eaacf7eaadf7eaadf7eaadf7eaacf7
-eaacf7eaacf7eaacf7eaabf7eaabf7eaaaf7e9aaf7e9a9f7e9a8f7e9a8f7e9a7
-
-f6da71f6db73f6db75f6dc76f6dc78f6dd7af6dd7bf6de7df6de7ff7df80f7df81f7df83f7e085f7
-e086f7e188f7e189f7e18bf7e28cf7e28ef7e390f7e391f7e392f7e494f7e495f7e597f7e598f7e5
-99f7e59bf7e69cf7e69df7e69ef7e79ff7e7a1f7e7a1f7e8a3f7e8a3f7e8a4f7e8a5f7e8a6f7e9a7
-f7e9a8f7e9a8f7e9a9f7e9a9f7e9aaf7e9aaf7e9aaf7eaaaf7eaaaf7eaabf7eaabf7eaabf7eaaaf7
-eaaaf7e9aaf7e9aaf7e9a9f7e9a9f7e9a8f7e9a8f7e9a7f7e8a6f7e8a5f7e8a5
-
-f6da70f6db72f6db73f6dc75f6dc77f6dc79f6dd7af6dd7cf6de7ef6de7ff7df80f7df82f7df83f7
-e085f7e087f7e188f7e189f7e18bf7e28df7e28ef7e390f7e391f7e392f7e494f7e495f7e496f7e5
-98f7e599f7e59af7e69bf7e69df7e69ef7e69ff7e7a0f7e7a1f7e7a1f7e8a3f7e8a3f7e8a4f7e8a5
-f7e8a5f7e8a6f7e9a7f7e9a7f7e9a8f7e9a8f7e9a8f7e9a8f7e9a8f7e9a8f7e9a9f7e9a8f7e9a8f7
-e9a8f7e9a8f7e9a8f7e9a7f7e9a7f7e8a6f7e8a6f7e8a5f7e8a4f7e8a3f7e8a3
-
-f6da6ff6da70f6db72f6db74f6dc76f6dc77f6dd79f6dd7bf6dd7cf6de7ef6de80f7df81f7df82f7
-df83f7e085f7e087f7e188f7e189f7e18bf7e28df7e28ef7e390f7e391f7e392f7e494f7e495f7e4
-96f7e597f7e598f7e59af7e69bf7e69cf7e69df7e69ef7e79ff7e7a0f7e7a1f7e7a1f7e7a2f7e8a3
-f7e8a3f7e8a4f7e8a5f7e8a5f7e8a5f7e8a6f7e8a6f7e8a6f7e8a6f7e8a6f7e8a6f7e8a6f7e8a6f7
-e8a6f7e8a6f7e8a5f7e8a5f7e8a5f7e8a4f7e8a4f7e8a3f7e7a2f7e7a2f7e7a1
-
-f6da6ef6da6ff6db71f6db73f6db75f6dc76f6dc78f6dd79f6dd7bf6de7df6de7ef6de80f7df81f7
-df82f7e084f7e085f7e087f7e188f7e189f7e18bf7e28cf7e28ef7e38ff7e390f7e392f7e493f7e4
-94f7e496f7e597f7e598f7e599f7e59af7e69bf7e69cf7e69df7e69ef7e69ff7e79ff7e7a0f7e7a1
-f7e7a1f7e7a2f7e8a3f7e8a3f7e8a3f7e8a4f7e8a4f7e8a4f7e8a4f7e8a4f7e8a4f7e8a4f7e8a4f7
-e8a4f7e8a4f7e8a3f7e8a3f7e8a3f7e7a2f7e7a2f7e7a1f7e7a1f7e7a0f7e79f
-
-f6d96cf6da6ef6da70f6db72f6db73f6dc75f6dc77f6dc78f6dd7af6dd7bf6de7df6de7ff6de80f7
-df81f7df82f7e084f7e085f7e087f7e188f7e189f7e18bf7e28cf7e28ef7e28ff7e390f7e392f7e3
-93f7e494f7e495f7e496f7e597f7e598f7e599f7e59af7e69bf7e69cf7e69df7e69df7e69ef7e79f
-f7e79ff7e7a0f7e7a1f7e7a1f7e7a1f7e7a1f7e7a2f7e7a2f7e7a2f7e7a2f7e7a2f7e7a2f7e7a2f7
-e7a2f7e7a2f7e7a1f7e7a1f7e7a1f7e7a0f7e7a0f7e79ff7e69ff7e69ef7e69d
-
-f6d96bf6d96df6da6ff6da70f6db72f6db74f6dc75f6dc77f6dc79f6dd7af6dd7cf6de7df6de7ff6
-de80f7df81f7df82f7e084f7e085f7e087f7e188f7e189f7e18bf7e28cf7e28df7e28ff7e390f7e3
-91f7e392f7e493f7e494f7e495f7e496f7e597f7e598f7e599f7e59af7e69bf7e69bf7e69cf7e69d
-f7e69df7e69ef7e69ff7e79ff7e79ff7e79ff7e7a0f7e7a0f7e7a0f7e7a0f7e7a0f7e7a0f7e7a0f7
-e7a0f7e7a0f7e79ff7e79ff7e69ff7e69ef7e69ef7e69df7e69df7e69cf7e69b
-
-f6d96af6d96cf6da6ef6da6ff6da71f6db72f6db74f6dc76f6dc77f6dc79f6dd7af6dd7cf6de7df6
-de7ff6de80f7df81f7df82f7e084f7e085f7e087f7e188f7e189f7e18af7e28bf7e28df7e28ef7e3
-8ff7e390f7e392f7e392f7e494f7e494f7e496f7e496f7e597f7e598f7e599f7e59af7e59af7e69b
-f7e69bf7e69cf7e69df7e69df7e69df7e69df7e69ef7e69ef7e69ef7e69ef7e69ef7e69ef7e69ef7
-e69ef7e69ef7e69df7e69df7e69df7e69cf7e69cf7e69bf7e59bf7e59af7e599
-
-f6d869f6d96af6d96cf6da6ef6da6ff6da71f6db72f6db74f6dc76f6dc77f6dd79f6dd7bf6dd7cf6
-de7df6de7ff6de80f7df81f7df82f7df83f7e085f7e086f7e187f7e189f7e18af7e18bf7e28cf7e2
-8ef7e28ff7e390f7e391f7e392f7e393f7e494f7e494f7e495f7e496f7e597f7e598f7e598f7e599
-f7e599f7e59af7e59bf7e69bf7e69bf7e69bf7e69cf7e69cf7e69cf7e69cf7e69cf7e69cf7e69cf7
-e69cf7e69bf7e69bf7e69bf7e59bf7e59af7e59af7e599f7e598f7e598f7e597
-
-f6d868f6d869f6d96bf6d96cf6da6ef6da70f6db71f6db73f6db75f6dc76f6dc77f6dd79f6dd7bf6
-dd7cf6de7df6de7ff6de80f7df81f7df82f7df83f7e085f7e086f7e087f7e188f7e189f7e18bf7e2
-8cf7e28df7e28ef7e28ff7e390f7e391f7e392f7e392f7e494f7e494f7e495f7e496f7e496f7e597
-f7e597f7e598f7e598f7e599f7e599f7e599f7e59af7e59af7e59af7e59af7e59af7e59af7e59af7
-e59af7e599f7e599f7e599f7e598f7e598f7e598f7e597f7e496f7e496f7e495
-
-f6d866f6d868f6d96af6d96bf6d96df6da6ef6da70f6db72f6db73f6db75f6dc76f6dc77f6dd79f6
-dd7bf6dd7cf6de7df6de7ff6de80f7df80f7df82f7df83f7e084f7e085f7e087f7e188f7e189f7e1
-8af7e18bf7e28cf7e28df7e28ef7e38ff7e390f7e391f7e392f7e392f7e393f7e494f7e494f7e495
-f7e495f7e496f7e496f7e597f7e597f7e597f7e598f7e598f7e598f7e598f7e598f7e598f7e598f7
-e598f7e597f7e597f7e597f7e496f7e496f7e496f7e495f7e494f7e494f7e493
-
-f6d765f6d867f6d868f6d96af6d96cf6d96df6da6ef6da70f6db72f6db73f6db75f6dc76f6dc77f6
-dd79f6dd7af6dd7cf6de7df6de7ef6de7ff7df80f7df81f7df83f7e084f7e085f7e086f7e087f7e1
-88f7e189f7e18af7e18bf7e28cf7e28df7e28ef7e28ff7e390f7e390f7e391f7e392f7e392f7e393
-f7e493f7e494f7e494f7e494f7e495f7e495f7e495f7e496f7e496f7e496f7e496f7e496f7e496f7
-e496f7e495f7e495f7e495f7e494f7e494f7e494f7e493f7e392f7e392f7e391
-
-f6d764f6d865f6d867f6d868f6d96af6d96cf6da6df6da6ff6da70f6db72f6db73f6db75f6dc76f6
-dc77f6dc79f6dd7af6dd7bf6de7df6de7ef6de7ff7df80f7df81f7df82f7df83f7e084f7e085f7e0
-86f7e187f7e188f7e189f7e18af7e18bf7e28cf7e28df7e28ef7e28ef7e38ff7e390f7e390f7e391
-f7e391f7e392f7e392f7e392f7e393f7e493f7e493f7e494f7e494f7e494f7e494f7e494f7e494f7
-e494f7e493f7e493f7e393f7e392f7e392f7e392f7e391f7e390f7e390f7e38f
-
-f6d762f6d764f6d865f6d867f6d869f6d96af6d96cf6da6df6da6ff6da70f6db72f6db73f6db75f6
-dc76f6dc77f6dc79f6dd7af6dd7bf6dd7cf6de7df6de7ff6de80f7df80f7df81f7df83f7df83f7e0
-85f7e085f7e087f7e187f7e188f7e189f7e18af7e18bf7e28bf7e28cf7e28df7e28ef7e28ef7e28f
-f7e38ff7e390f7e390f7e390f7e391f7e391f7e391f7e392f7e392f7e392f7e392f7e392f7e392f7
-e391f7e391f7e391f7e391f7e390f7e390f7e390f7e38ff7e28ef7e28ef7e28e
-
-f6d661f6d763f6d764f6d866f6d867f6d869f6d96af6d96cf6da6df6da6ff6da70f6db71f6db73f6
-db74f6dc76f6dc77f6dc78f6dd79f6dd7bf6dd7cf6de7df6de7ef6de7ff7df80f7df81f7df82f7df
-83f7e084f7e085f7e086f7e087f7e187f7e188f7e189f7e18af7e18af7e18bf7e28bf7e28cf7e28d
-f7e28df7e28ef7e28ef7e28ef7e28ff7e38ff7e38ff7e390f7e390f7e390f7e390f7e390f7e390f7
-e38ff7e38ff7e28ff7e28ff7e28ef7e28ef7e28ef7e28df7e28df7e28cf7e28b
-
-f6d660f6d761f6d763f6d764f6d866f6d867f6d869f6d96af6d96cf6da6df6da6ef6da70f6db71f6
-db72f6db74f6dc75f6dc77f6dc78f6dd79f6dd7af6dd7bf6de7df6de7ef6de7ff6de80f7df80f7df
-81f7df82f7df83f7e084f7e085f7e085f7e086f7e087f7e188f7e189f7e189f7e18af7e18af7e18b
-f7e18bf7e28bf7e28cf7e28cf7e28df7e28df7e28df7e28df7e28ef7e28ef7e28ef7e28ef7e28ef7
-e28df7e28df7e28df7e28df7e28cf7e28cf7e28bf7e18bf7e18bf7e18af7e189
-
-f6d65ef6d660f6d761f6d763f6d764f6d866f6d867f6d869f6d96af6d96cf6d96df6da6ef6da70f6
-da71f6db72f6db74f6dc75f6dc76f6dc77f6dc79f6dd7af6dd7bf6dd7cf6de7df6de7ef6de7ff6de
-80f7df80f7df81f7df82f7df83f7df83f7e084f7e085f7e086f7e087f7e087f7e188f7e188f7e189
-f7e189f7e189f7e18af7e18af7e18bf7e18bf7e18bf7e18bf7e28bf7e28bf7e28bf7e28bf7e18bf7
-e18bf7e18bf7e18bf7e18bf7e18af7e18af7e189f7e189f7e189f7e188f7e187
-
-f6d55df6d65ff6d660f6d761f6d763f6d764f6d866f6d867f6d869f6d96af6d96cf6d96df6da6ef6
-da6ff6da71f6db72f6db73f6db75f6dc76f6dc77f6dc78f6dd79f6dd7af6dd7bf6dd7cf6de7df6de
-7ef6de7ff6de80f7df80f7df81f7df82f7df83f7df83f7e084f7e085f7e085f7e086f7e086f7e087
-f7e087f7e187f7e188f7e188f7e189f7e189f7e189f7e189f7e189f7e189f7e189f7e189f7e189f7
-e189f7e189f7e189f7e188f7e188f7e188f7e187f7e087f7e087f7e086f7e085
-
-f6d55bf6d55df6d65ff6d660f6d761f6d763f6d764f6d866f6d867f6d868f6d96af6d96bf6d96cf6
-da6ef6da6ff6da70f6db72f6db73f6db74f6dc75f6dc76f6dc77f6dc79f6dd79f6dd7bf6dd7bf6dd
-7cf6de7df6de7ef6de7ff6de80f7df80f7df81f7df81f7df82f7df83f7df83f7e084f7e084f7e085
-f7e085f7e085f7e086f7e086f7e087f7e087f7e087f7e087f7e087f7e087f7e087f7e087f7e087f7
-e087f7e087f7e087f7e086f7e086f7e086f7e085f7e085f7e085f7e084f7df83
-
-f6d55af6d55bf6d55df6d65ff6d660f6d761f6d763f6d764f6d865f6d867f6d868f6d96af6d96bf6
-d96cf6da6df6da6ff6da70f6da71f6db72f6db73f6db75f6dc75f6dc77f6dc78f6dc79f6dd79f6dd
-7bf6dd7bf6dd7cf6de7df6de7ef6de7ff6de7ff6de80f7df80f7df81f7df81f7df82f7df82f7df83
-f7df83f7df83f7e084f7e084f7e085f7e085f7e085f7e085f7e085f7e085f7e085f7e085f7e085f7
-e085f7e085f7e085f7e084f7e084f7e084f7df83f7df83f7df83f7df82f7df81
-
-f6d458f6d55af6d55bf6d55df6d65ff6d660f6d661f6d763f6d764f6d865f6d867f6d868f6d869f6
-d96af6d96cf6d96df6da6ef6da6ff6da70f6db72f6db72f6db74f6dc75f6dc76f6dc77f6dc78f6dc
-79f6dd79f6dd7bf6dd7bf6dd7cf6de7df6de7df6de7ef6de7ff6de7ff6de80f7df80f7df80f7df81
-f7df81f7df81f7df82f7df82f7df83f7df83f7df83f7df83f7df83f7df83f7df83f7df83f7df83f7
-df83f7df83f7df83f7df82f7df82f7df82f7df81f7df81f7df81f7df80f6de80
-
-f6d457f6d458f6d55af6d55bf6d55df6d65ef6d660f6d661f6d762f6d764f6d765f6d866f6d868f6
-d869f6d96af6d96bf6d96cf6da6ef6da6ff6da70f6da71f6db72f6db73f6db74f6dc75f6dc76f6dc
-77f6dc78f6dc79f6dd79f6dd7af6dd7bf6dd7bf6dd7cf6de7df6de7df6de7ef6de7ff6de7ff6de7f
-f6de80f6de80f7df80f7df80f7df80f7df81f7df81f7df81f7df81f7df81f7df81f7df81f7df81f7
-df81f7df81f7df81f7df80f7df80f7df80f6de80f6de80f6de7ff6de7ff6de7e
-
-f6d356f6d457f6d458f6d55af6d55bf6d55df6d65ef6d65ff6d661f6d762f6d763f6d765f6d866f6
-d867f6d868f6d96af6d96bf6d96cf6d96df6da6ef6da6ff6da70f6db71f6db72f6db73f6db74f6dc
-75f6dc76f6dc77f6dc77f6dc78f6dd79f6dd7af6dd7af6dd7bf6dd7bf6dd7cf6de7df6de7df6de7d
-f6de7ef6de7ef6de7ff6de7ff6de7ff6de7ff6de7ff6de80f6de80f6de80f6de80f6de80f6de80f6
-de7ff6de7ff6de7ff6de7ff6de7ff6de7ff6de7ef6de7ef6de7df6de7df6dd7c
-
-f6d354f6d356f6d457f6d458f6d55af6d55bf6d55df6d65ef6d65ff6d661f6d762f6d763f6d764f6
-d865f6d867f6d868f6d869f6d96af6d96bf6d96cf6da6df6da6ef6da6ff6da70f6db71f6db72f6db
-73f6db74f6db75f6dc75f6dc76f6dc77f6dc78f6dc78f6dd79f6dd79f6dd7af6dd7bf6dd7bf6dd7b
-f6dd7cf6dd7cf6de7df6de7df6de7df6de7df6de7df6de7df6de7ef6de7ef6de7ef6de7ef6de7ef6
-de7df6de7df6de7df6de7df6de7df6de7df6dd7cf6dd7cf6dd7bf6dd7bf6dd7a
-
-f6d353f6d354f6d356f6d457f6d458f6d55af6d55bf6d55cf6d55df6d65ff6d660f6d761f6d763f6
-d764f6d765f6d866f6d867f6d868f6d96af6d96af6d96cf6d96cf6da6ef6da6ef6da6ff6da70f6db
-71f6db72f6db73f6db74f6db74f6dc75f6dc76f6dc76f6dc77f6dc77f6dc78f6dc79f6dd79f6dd79
-f6dd7af6dd7af6dd7bf6dd7bf6dd7bf6dd7bf6dd7bf6dd7bf6dd7cf6dd7cf6dd7cf6dd7cf6dd7bf6
-dd7bf6dd7bf6dd7bf6dd7bf6dd7bf6dd7af6dd7af6dd7af6dd79f6dd79f6dc78
-
-f6d251f6d352f6d354f6d355f6d456f6d458f6d459f6d55bf6d55cf6d55df6d65ff6d660f6d661f6
-d762f6d763f6d764f6d865f6d867f6d868f6d869f6d96af6d96bf6d96cf6d96cf6da6ef6da6ef6da
-6ff6da70f6da71f6db72f6db72f6db73f6db74f6db75f6dc75f6dc75f6dc76f6dc77f6dc77f6dc77
-f6dc78f6dc78f6dc79f6dc79f6dd79f6dd79f6dd79f6dd79f6dd79f6dd7af6dd7af6dd7af6dd79f6
-dd79f6dd79f6dd79f6dd79f6dc79f6dc78f6dc78f6dc78f6dc77f6dc77f6dc76
-
-f6d250f6d251f6d352f6d354f6d355f6d456f6d458f6d459f6d55af6d55bf6d55df6d65ef6d65ff6
-d660f6d761f6d763f6d764f6d765f6d866f6d867f6d868f6d869f6d96af6d96bf6d96cf6d96cf6da
-6df6da6ef6da6ff6da70f6da70f6db71f6db72f6db72f6db73f6db74f6db74f6db75f6dc75f6dc75
-f6dc76f6dc76f6dc77f6dc77f6dc77f6dc77f6dc77f6dc77f6dc77f6dc77f6dc77f6dc77f6dc77f6
-dc77f6dc77f6dc77f6dc77f6dc77f6dc76f6dc76f6dc76f6dc75f6dc75f6db74
-
-f6d14ef6d250f6d251f6d352f6d354f6d355f6d456f6d457f6d458f6d55af6d55bf6d55cf6d55df6
-d65ff6d660f6d661f6d762f6d763f6d764f6d765f6d866f6d867f6d868f6d869f6d96af6d96bf6d9
-6cf6d96cf6d96df6da6ef6da6ef6da6ff6da70f6da70f6da71f6db72f6db72f6db72f6db73f6db73
-f6db74f6db74f6db75f6db75f6dc75f6dc75f6dc75f6dc75f6dc75f6dc75f6dc75f6dc75f6dc75f6
-dc75f6dc75f6dc75f6dc75f6db75f6db74f6db74f6db74f6db73f6db73f6db72
-
-f6d14cf6d14ef6d24ff6d250f6d352f6d353f6d354f6d356f6d457f6d458f6d459f6d55bf6d55cf6
-d55df6d65ef6d65ff6d660f6d661f6d762f6d763f6d764f6d765f6d866f6d867f6d868f6d869f6d9
-6af6d96af6d96bf6d96cf6d96cf6da6df6da6ef6da6ef6da6ff6da70f6da70f6da70f6da71f6db71
-f6db72f6db72f6db72f6db72f6db73f6db73f6db73f6db73f6db73f6db73f6db73f6db73f6db73f6
-db73f6db73f6db73f6db72f6db72f6db72f6db72f6db72f6db71f6da71f6da70
-
-f5d14bf6d14cf6d14ef6d24ff6d250f6d252f6d353f6d354f6d355f6d456f6d458f6d459f6d55af6
-d55bf6d55cf6d55df6d65ef6d65ff6d660f6d761f6d762f6d763f6d764f6d765f6d866f6d867f6d8
-68f6d868f6d869f6d96af6d96af6d96bf6d96cf6d96cf6d96df6da6ef6da6ef6da6ef6da6ff6da6f
-f6da70f6da70f6da70f6da70f6da71f6da71f6da71f6db71f6db71f6db71f6db71f6db71f6db71f6
-db71f6da71f6da71f6da70f6da70f6da70f6da70f6da6ff6da6ff6da6ff6da6e
-
-f5d049f5d14bf5d14cf6d14df6d24ff6d250f6d251f6d352f6d354f6d355f6d456f6d457f6d458f6
-d459f6d55bf6d55bf6d55df6d55df6d65ff6d65ff6d661f6d761f6d762f6d763f6d764f6d765f6d8
-65f6d866f6d867f6d868f6d868f6d869f6d96af6d96af6d96bf6d96cf6d96cf6d96cf6d96df6da6d
-f6da6ef6da6ef6da6ef6da6ef6da6ff6da6ff6da6ff6da6ff6da6ff6da6ff6da6ff6da6ff6da6ff6
-da6ff6da6ff6da6ff6da6ef6da6ef6da6ef6da6ef6da6df6da6df6d96df6d96c
-
-f5d048f5d049f5d14af5d14bf6d14df6d24ef6d250f6d251f6d352f6d353f6d354f6d355f6d456f6
-d458f6d458f6d55af6d55bf6d55cf6d55df6d65ef6d65ff6d65ff6d660f6d761f6d762f6d763f6d7
-64f6d764f6d765f6d866f6d867f6d867f6d868f6d868f6d869f6d96af6d96af6d96af6d96bf6d96b
-f6d96cf6d96cf6d96cf6d96cf6d96cf6d96df6d96df6da6df6da6df6da6df6da6df6da6df6da6df6
-d96df6d96df6d96df6d96cf6d96cf6d96cf6d96cf6d96bf6d96bf6d96af6d96a
-
-f5d046f5d047f5d049f5d04af5d14bf6d14cf6d14ef6d24ff6d250f6d251f6d352f6d354f6d355f6
-d356f6d457f6d458f6d459f6d55af6d55bf6d55cf6d55df6d65ef6d65ff6d65ff6d660f6d661f6d7
-62f6d763f6d763f6d764f6d765f6d765f6d866f6d866f6d867f6d868f6d868f6d868f6d869f6d869
-f6d96af6d96af6d96af6d96af6d96af6d96bf6d96bf6d96bf6d96bf6d96bf6d96bf6d96bf6d96bf6
-d96bf6d96bf6d96bf6d96af6d96af6d96af6d96af6d869f6d869f6d868f6d868
-
-f5cf45f5cf46f5d047f5d048f5d049f5d14bf5d14cf6d14df6d24ef6d250f6d251f6d352f6d353f6
-d354f6d355f6d456f6d457f6d458f6d459f6d55af6d55bf6d55cf6d55df6d55df6d65ef6d65ff6d6
-60f6d661f6d761f6d762f6d763f6d763f6d764f6d764f6d765f6d865f6d866f6d866f6d867f6d867
-f6d868f6d868f6d868f6d868f6d868f6d869f6d869f6d869f6d869f6d869f6d869f6d869f6d869f6
-d869f6d869f6d868f6d868f6d868f6d868f6d868f6d867f6d867f6d866f6d866
-
-f5cf43f5cf44f5cf45f5d047f5d048f5d049f5d14af5d14bf6d14df6d14ef6d24ff6d250f6d251f6
-d352f6d353f6d354f6d355f6d456f6d457f6d458f6d459f6d55af6d55bf6d55cf6d55cf6d55df6d6
-5ef6d65ff6d65ff6d660f6d661f6d661f6d762f6d762f6d763f6d763f6d764f6d764f6d765f6d765
-f6d865f6d865f6d866f6d866f6d866f6d867f6d867f6d867f6d867f6d867f6d867f6d867f6d867f6
-d867f6d867f6d866f6d866f6d866f6d866f6d865f6d765f6d765f6d764f6d764
-
-f5ce41f5cf43f5cf44f5cf45f5d046f5d047f5d049f5d04af5d14bf5d14cf6d14df6d24ef6d24ff6
-d250f6d252f6d352f6d353f6d354f6d355f6d456f6d457f6d458f6d459f6d55af6d55bf6d55bf6d5
-5cf6d55df6d55df6d65ef6d65ff6d65ff6d660f6d660f6d661f6d761f6d762f6d762f6d763f6d763
-f6d763f6d763f6d764f6d764f6d764f6d764f6d765f6d765f6d765f6d765f6d765f6d765f6d765f6
-d765f6d765f6d764f6d764f6d764f6d764f6d763f6d763f6d763f6d762f6d762
-
-f5ce40f5ce41f5ce42f5cf43f5cf45f5cf46f5d047f5d048f5d049f5d14af5d14bf6d14cf6d14ef6
-d24ff6d250f6d251f6d252f6d352f6d354f6d354f6d355f6d456f6d457f6d458f6d458f6d459f6d5
-5af6d55bf6d55bf6d55cf6d55df6d55df6d65ef6d65ef6d65ff6d65ff6d660f6d660f6d661f6d661
-f6d661f6d761f6d762f6d762f6d762f6d762f6d763f6d763f6d763f6d763f6d763f6d763f6d763f6
-d763f6d763f6d762f6d762f6d762f6d762f6d761f6d661f6d661f6d660f6d660
-
-f5cd3ef5ce3ff5ce41f5ce42f5cf43f5cf44f5cf45f5d046f5d047f5d049f5d049f5d14bf5d14cf6
-d14df6d14ef6d24ff6d250f6d251f6d252f6d352f6d353f6d354f6d355f6d356f6d456f6d457f6d4
-58f6d459f6d459f6d55af6d55bf6d55bf6d55cf6d55cf6d55df6d55df6d65ef6d65ef6d65ff6d65f
-f6d65ff6d65ff6d660f6d660f6d660f6d660f6d661f6d661f6d661f6d661f6d661f6d661f6d661f6
-d661f6d660f6d660f6d660f6d660f6d65ff6d65ff6d65ff6d65ff6d65ef6d65e
-
-f5cd3cf5cd3ef5ce3ff5ce40f5ce41f5ce42f5cf43f5cf45f5cf46f5d047f5d048f5d049f5d04af5
-d14bf5d14cf6d14df6d14ef6d24ff6d250f6d250f6d252f6d352f6d353f6d354f6d354f6d355f6d4
-56f6d457f6d457f6d458f6d458f6d459f6d55af6d55af6d55bf6d55bf6d55cf6d55cf6d55df6d55d
-f6d55df6d55df6d65ef6d65ef6d65ef6d65ef6d65ef6d65ff6d65ff6d65ff6d65ff6d65ff6d65ff6
-d65ff6d65ef6d65ef6d65ef6d65ef6d55df6d55df6d55df6d55df6d55cf6d55c
-
-f5cc3af5cd3cf5cd3df5cd3ef5ce3ff5ce41f5ce42f5cf43f5cf44f5cf45f5d046f5d047f5d048f5
-d049f5d14af5d14bf5d14cf6d14df6d14ef6d24ff6d250f6d250f6d251f6d352f6d353f6d353f6d3
-54f6d355f6d355f6d456f6d456f6d457f6d458f6d458f6d459f6d459f6d55af6d55af6d55bf6d55b
-f6d55bf6d55bf6d55cf6d55cf6d55cf6d55cf6d55cf6d55df6d55df6d55df6d55df6d55df6d55df6
-d55cf6d55cf6d55cf6d55cf6d55cf6d55bf6d55bf6d55bf6d55bf6d55af6d55a
-
-f5cc39f5cc3af5cd3bf5cd3cf5cd3ef5ce3ff5ce40f5ce41f5ce42f5cf43f5cf44f5cf45f5d046f5
-d047f5d048f5d049f5d14af5d14bf5d14cf6d14df6d14ef6d24ef6d24ff6d250f6d251f6d252f6d3
-52f6d353f6d354f6d354f6d354f6d355f6d356f6d456f6d457f6d457f6d458f6d458f6d458f6d458
-f6d459f6d459f6d459f6d55af6d55af6d55af6d55af6d55af6d55bf6d55bf6d55bf6d55bf6d55bf6
-d55af6d55af6d55af6d55af6d55af6d459f6d459f6d459f6d458f6d458f6d458
-
-f5cc37f5cc38f5cc3af5cd3bf5cd3cf5cd3df5cd3ef5ce3ff5ce41f5ce41f5cf43f5cf43f5cf45f5
-cf45f5d046f5d047f5d048f5d049f5d04af5d14bf5d14bf6d14cf6d14df6d14ef6d24ff6d250f6d2
-50f6d251f6d252f6d352f6d353f6d353f6d354f6d354f6d355f6d355f6d356f6d456f6d456f6d456
-f6d457f6d457f6d457f6d458f6d458f6d458f6d458f6d458f6d458f6d458f6d458f6d458f6d458f6
-d458f6d458f6d458f6d458f6d458f6d457f6d457f6d457f6d456f6d456f6d356
-
-f5cb36f5cc37f5cc38f5cc39f5cc3af5cd3bf5cd3cf5cd3df5ce3ef5ce40f5ce41f5ce42f5cf43f5
-cf44f5cf45f5cf45f5d046f5d047f5d048f5d049f5d04af5d14bf5d14bf5d14cf6d14df6d14ef6d2
-4ef6d24ff6d250f6d250f6d251f6d251f6d252f6d352f6d353f6d353f6d354f6d354f6d354f6d354
-f6d355f6d355f6d355f6d356f6d356f6d456f6d456f6d456f6d456f6d456f6d456f6d456f6d456f6
-d456f6d456f6d356f6d356f6d356f6d355f6d355f6d355f6d354f6d354f6d354
-
-f5cb34f5cb35f5cb36f5cc37f5cc38f5cc3af5cc3af5cd3cf5cd3df5cd3ef5ce3ff5ce40f5ce41f5
-ce42f5cf43f5cf44f5cf45f5cf45f5d046f5d047f5d048f5d049f5d049f5d14af5d14bf5d14bf6d1
-4cf6d14df6d14ef6d14ef6d24ff6d24ff6d250f6d250f6d251f6d251f6d252f6d352f6d352f6d352
-f6d353f6d353f6d353f6d354f6d354f6d354f6d354f6d354f6d354f6d354f6d354f6d354f6d354f6
-d354f6d354f6d354f6d354f6d353f6d353f6d353f6d353f6d352f6d352f6d252
-
-f5ca32f5cb33f5cb34f5cb36f5cc37f5cc38f5cc39f5cc3af5cd3bf5cd3cf5cd3df5cd3ef5ce3ff5
-ce40f5ce41f5ce42f5cf43f5cf43f5cf44f5cf45f5cf46f5d047f5d047f5d048f5d049f5d049f5d1
-4af5d14bf5d14bf5d14cf6d14df6d14df6d14ef6d14ef6d24ff6d24ff6d250f6d250f6d250f6d250
-f6d251f6d251f6d251f6d252f6d252f6d252f6d352f6d352f6d352f6d352f6d352f6d352f6d352f6
-d352f6d352f6d252f6d252f6d251f6d251f6d251f6d251f6d250f6d250f6d250
-
-f5ca30f5ca31f5ca33f5cb34f5cb35f5cb36f5cc37f5cc38f5cc39f5cc3af5cd3bf5cd3cf5cd3df5
-cd3ef5ce3ff5ce40f5ce41f5ce42f5cf43f5cf43f5cf44f5cf45f5cf45f5d046f5d047f5d047f5d0
-48f5d049f5d049f5d04af5d14bf5d14bf5d14bf5d14cf6d14df6d14df6d14ef6d14ef6d14ef6d24e
-f6d24ff6d24ff6d24ff6d250f6d250f6d250f6d250f6d250f6d250f6d250f6d250f6d250f6d250f6
-d250f6d250f6d250f6d250f6d24ff6d24ff6d24ff6d24ef6d24ef6d14ef6d14e
-
-f5c92ff5ca30f5ca31f5ca32f5cb33f5cb34f5cb35f5cb36f5cc37f5cc38f5cc39f5cc3af5cd3bf5
-cd3cf5cd3df5cd3ef5ce3ff5ce40f5ce41f5ce41f5ce42f5cf43f5cf43f5cf44f5cf45f5cf46f5d0
-46f5d047f5d047f5d048f5d049f5d049f5d049f5d04af5d14bf5d14bf5d14bf5d14bf5d14cf6d14c
-f6d14df6d14df6d14df6d14df6d14ef6d14ef6d14ef6d14ef6d14ef6d14ef6d14ef6d14ef6d14ef6
-d14ef6d14ef6d14ef6d14ef6d14df6d14df6d14df6d14cf6d14cf5d14cf5d14b
-
-f5c92df5c92ef5ca2ff5ca30f5ca31f5ca32f5cb34f5cb34f5cb36f5cb36f5cc38f5cc38f5cc39f5
-cc3af5cd3bf5cd3cf5cd3df5cd3ef5ce3ef5ce3ff5ce40f5ce41f5ce42f5ce42f5cf43f5cf44f5cf
-44f5cf45f5cf45f5d046f5d047f5d047f5d047f5d048f5d049f5d049f5d049f5d049f5d04af5d14a
-f5d14bf5d14bf5d14bf5d14bf5d14bf5d14bf5d14bf5d14cf5d14cf5d14cf5d14cf5d14cf5d14cf5
-d14bf5d14bf5d14bf5d14bf5d14bf5d14bf5d14bf5d14af5d14af5d04af5d049
-
-f5c92bf5c92cf5c92df5c92ff5ca2ff5ca31f5ca31f5ca33f5cb34f5cb35f5cb36f5cb36f5cc38f5
-cc38f5cc39f5cc3af5cd3bf5cd3cf5cd3cf5cd3df5cd3ef5ce3ff5ce40f5ce41f5ce41f5ce42f5ce
-42f5cf43f5cf43f5cf44f5cf45f5cf45f5cf45f5cf46f5d047f5d047f5d047f5d047f5d048f5d048
-f5d049f5d049f5d049f5d049f5d049f5d049f5d049f5d049f5d04af5d04af5d04af5d04af5d04af5
-d049f5d049f5d049f5d049f5d049f5d049f5d049f5d048f5d048f5d048f5d047
-
-f5c829f5c82bf5c92bf5c92df5c92ef5c92ff5ca30f5ca31f5ca32f5ca33f5cb34f5cb35f5cb36f5
-cb36f5cc38f5cc38f5cc39f5cc3af5cd3bf5cd3cf5cd3cf5cd3df5cd3ef5ce3ef5ce3ff5ce40f5ce
-40f5ce41f5ce41f5ce42f5cf43f5cf43f5cf43f5cf44f5cf45f5cf45f5cf45f5cf45f5cf46f5d046
-f5d046f5d047f5d047f5d047f5d047f5d047f5d047f5d047f5d047f5d048f5d048f5d048f5d047f5
-d047f5d047f5d047f5d047f5d047f5d047f5d047f5d046f5cf46f5cf46f5cf45
-
-f5c828f5c829f5c82af5c92bf5c92cf5c92df5c92ef5ca2ff5ca30f5ca31f5ca32f5ca33f5cb34f5
-cb35f5cb36f5cb36f5cc37f5cc38f5cc39f5cc3af5cc3af5cd3bf5cd3cf5cd3cf5cd3df5cd3ef5ce
-3ef5ce3ff5ce3ff5ce40f5ce41f5ce41f5ce41f5ce42f5ce42f5cf43f5cf43f5cf43f5cf44f5cf44
-f5cf44f5cf45f5cf45f5cf45f5cf45f5cf45f5cf45f5cf45f5cf45f5cf45f5cf45f5cf45f5cf45f5
-cf45f5cf45f5cf45f5cf45f5cf45f5cf45f5cf45f5cf44f5cf44f5cf44f5cf43
-
-f5c726f5c727f5c828f5c829f5c82af5c92bf5c92cf5c92df5c92ef5ca2ff5ca30f5ca31f5ca32f5
-ca33f5cb34f5cb34f5cb35f5cb36f5cc37f5cc38f5cc38f5cc39f5cc3af5cc3af5cd3bf5cd3cf5cd
-3cf5cd3df5cd3df5cd3ef5ce3ef5ce3ff5ce3ff5ce40f5ce40f5ce41f5ce41f5ce41f5ce42f5ce42
-f5ce42f5cf43f5cf43f5cf43f5cf43f5cf43f5cf43f5cf43f5cf43f5cf43f5cf43f5cf43f5cf43f5
-cf43f5cf43f5cf43f5cf43f5cf43f5cf43f5cf43f5ce42f5ce42f5ce42f5ce41
-
-f5c724f5c725f5c726f5c827f5c828f5c829f5c82af5c92bf5c92cf5c92df5c92ef5ca2ff5ca30f5
-ca31f5ca32f5ca33f5cb34f5cb34f5cb35f5cb36f5cb36f5cc37f5cc38f5cc38f5cc39f5cc3af5cc
-3af5cd3bf5cd3bf5cd3cf5cd3cf5cd3df5cd3df5cd3ef5cd3ef5ce3ef5ce3ff5ce3ff5ce40f5ce40
-f5ce40f5ce41f5ce41f5ce41f5ce41f5ce41f5ce41f5ce41f5ce41f5ce41f5ce41f5ce41f5ce41f5
-ce41f5ce41f5ce41f5ce41f5ce41f5ce41f5ce40f5ce40f5ce40f5ce3ff5ce3f
-
-f5c622f5c723f5c724f5c725f5c727f5c827f5c829f5c829f5c82bf5c92bf5c92cf5c92df5c92ef5
-ca2ff5ca30f5ca31f5ca31f5ca32f5cb33f5cb34f5cb34f5cb35f5cb36f5cb36f5cc37f5cc38f5cc
-38f5cc39f5cc3af5cc3af5cc3af5cd3bf5cd3bf5cd3cf5cd3cf5cd3cf5cd3df5cd3df5cd3ef5cd3e
-f5cd3ef5ce3ef5ce3ef5ce3ff5ce3ff5ce3ff5ce3ff5ce3ff5ce3ff5ce3ff5ce3ff5ce3ff5ce3ff5
-ce3ff5ce3ff5ce3ff5ce3ff5ce3ef5ce3ef5cd3ef5cd3ef5cd3ef5cd3df5cd3d
-
-f5c620f5c622f5c622f5c724f5c725f5c726f5c727f5c828f5c829f5c829f5c82bf5c92bf5c92cf5
-c92df5c92ef5c92ff5ca2ff5ca30f5ca31f5ca32f5ca32f5cb33f5cb34f5cb34f5cb35f5cb36f5cb
-36f5cc37f5cc38f5cc38f5cc38f5cc39f5cc39f5cc3af5cc3af5cc3af5cd3bf5cd3bf5cd3cf5cd3c
-f5cd3cf5cd3cf5cd3cf5cd3df5cd3df5cd3df5cd3df5cd3df5cd3df5cd3df5cd3df5cd3df5cd3df5
-cd3df5cd3df5cd3df5cd3df5cd3cf5cd3cf5cd3cf5cd3cf5cd3cf5cd3bf5cd3b
-
-f5c51ff5c620f5c621f5c622f5c623f5c724f5c725f5c726f5c727f5c828f5c829f5c829f5c82af5
-c92bf5c92cf5c92df5c92df5c92ef5ca2ff5ca30f5ca31f5ca31f5ca32f5ca32f5cb33f5cb34f5cb
-34f5cb35f5cb36f5cb36f5cb36f5cc37f5cc37f5cc38f5cc38f5cc38f5cc39f5cc39f5cc3af5cc3a
-f5cc3af5cc3af5cc3af5cc3af5cd3bf5cd3bf5cd3bf5cd3bf5cd3bf5cd3bf5cd3bf5cd3bf5cd3bf5
-cd3bf5cd3bf5cd3bf5cd3bf5cc3af5cc3af5cc3af5cc3af5cc3af5cc39f5cc39
-
-f5c51df5c51ef5c51ff5c620f5c621f5c622f5c623f5c724f5c725f5c726f5c727f5c827f5c829f5
-c829f5c82af5c92bf5c92cf5c92cf5c92df5c92ef5c92ff5ca2ff5ca30f5ca31f5ca31f5ca32f5ca
-32f5ca33f5cb34f5cb34f5cb34f5cb35f5cb35f5cb36f5cb36f5cb36f5cc37f5cc37f5cc38f5cc38
-f5cc38f5cc38f5cc38f5cc38f5cc39f5cc39f5cc39f5cc39f5cc39f5cc39f5cc39f5cc39f5cc39f5
-cc39f5cc39f5cc39f5cc39f5cc38f5cc38f5cc38f5cc38f5cc38f5cc37f5cc37
-
-f5c41bf5c51cf5c51df5c51ef5c51ff5c620f5c621f5c622f5c623f5c724f5c725f5c726f5c727f5
-c827f5c828f5c829f5c82af5c82bf5c92bf5c92cf5c92df5c92df5c92ef5c92ff5ca2ff5ca30f5ca
-30f5ca31f5ca31f5ca32f5ca32f5ca33f5cb33f5cb34f5cb34f5cb34f5cb35f5cb35f5cb35f5cb36
-f5cb36f5cb36f5cb36f5cb36f5cc37f5cc37f5cc37f5cc37f5cc37f5cc37f5cc37f5cc37f5cc37f5
-cc37f5cc37f5cc37f5cb36f5cb36f5cb36f5cb36f5cb36f5cb36f5cb35f5cb35
-
-f5c41af5c41af5c51cf5c51cf5c51df5c51ef5c51ff5c620f5c621f5c622f5c623f5c724f5c724f5
-c725f5c726f5c727f5c828f5c829f5c829f5c82af5c82bf5c92bf5c92cf5c92df5c92df5c92ef5c9
-2ef5c92ff5ca2ff5ca30f5ca30f5ca31f5ca31f5ca31f5ca32f5ca32f5ca33f5cb33f5cb33f5cb34
-f5cb34f5cb34f5cb34f5cb34f5cb34f5cb35f5cb35f5cb35f5cb35f5cb35f5cb35f5cb35f5cb35f5
-cb35f5cb35f5cb35f5cb34f5cb34f5cb34f5cb34f5cb34f5cb34f5cb33f5ca33
-
-Q
-Q
-Q
-Q
-q
-q
-n
-140 203 m
-204 203 l
-204 139 l
-140 139 l
-140 203 l
-h
-W
-q
-q
-[64 0 0 64 140 139]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-f7ebaff7eaaef7eaadf7eaacf7eaaaf7e9a9f7e9a8f7e8a6f7e8a5f7e8a3f7e7a2f7e7a1f7e79ff7
-e69df7e69cf7e59af7e598f7e597f7e495f7e494f7e392f7e390f7e28ef7e28df7e18bf7e189f7e1
-87f7e085f7e084f7df82f7df80f6de7ff6de7df6dd7bf6dd7af6dc78f6dc76f6db74f6db72f6da70
-f6da6ef6d96cf6d96af6d869f6d867f6d765f6d763f6d661f6d65ff6d55df6d55bf6d459f6d457f6
-d355f6d353f6d251f6d24ff6d14df5d14bf5d049f5d047f5cf45f5cf43f5ce41
-
-f7eaadf7eaacf7eaabf7e9aaf7e9a9f7e9a7f7e8a6f7e8a5f7e8a3f7e7a2f7e7a1f7e79ff7e69df7
-e69cf7e59bf7e599f7e597f7e496f7e494f7e392f7e391f7e28ff7e28df7e28bf7e18af7e188f7e0
-86f7e085f7df83f7df81f6de80f6de7ef6dd7cf6dd7bf6dc79f6dc77f6dc75f6db73f6db71f6da6f
-f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6d65ef6d55cf6d55af6d458f6d456f6
-d354f6d352f6d250f6d24ff6d14df5d14bf5d049f5d047f5cf45f5cf43f5ce41
-
-f7eaabf7eaaaf7e9a9f7e9a8f7e9a7f7e8a5f7e8a4f7e8a3f7e7a2f7e7a0f7e79ff7e69df7e69cf7
-e59bf7e599f7e597f7e496f7e494f7e393f7e391f7e390f7e28ef7e28cf7e18af7e189f7e087f7e0
-85f7df83f7df82f7df80f6de7ff6de7df6dd7bf6dd79f6dc78f6dc76f6db74f6db72f6da70f6da6e
-f6d96cf6d96bf6d869f6d867f6d765f6d763f6d661f6d65ff6d55df6d55bf6d55af6d458f6d356f6
-d354f6d252f6d250f6d14ef5d14cf5d04af5d048f5cf46f5cf44f5ce42f5ce40
-
-f7e9aaf7e9a8f7e9a8f7e8a6f7e8a5f7e8a4f7e8a3f7e7a1f7e7a0f7e79ff7e69df7e69cf7e59bf7
-e599f7e598f7e496f7e494f7e393f7e391f7e390f7e28ef7e28cf7e18bf7e189f7e187f7e086f7e0
-84f7df82f7df81f6de80f6de7ef6dd7cf6dd7af6dc79f6dc77f6dc75f6db73f6db71f6da6ff6da6e
-f6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6d65ff6d55df6d55bf6d459f6d457f6d355f6
-d353f6d251f6d24ff6d14df5d14bf5d049f5d047f5cf45f5cf43f5ce41f5ce3f
-
-f7e9a8f7e9a7f7e8a5f7e8a5f7e8a3f7e7a2f7e7a1f7e7a0f7e69ff7e69df7e69cf7e59bf7e599f7
-e598f7e496f7e495f7e493f7e392f7e390f7e28ef7e28df7e18bf7e189f7e188f7e086f7e085f7df
-83f7df81f6de80f6de7ff6de7df6dd7bf6dd79f6dc77f6dc76f6db74f6db72f6da70f6da6ef6d96c
-f6d96bf6d869f6d867f6d765f6d763f6d761f6d65ff6d65ef6d55cf6d55af6d458f6d456f6d354f6
-d352f6d250f6d24ef6d14cf5d14af5d049f5d047f5cf45f5cf43f5ce41f5ce3f
-
-f7e8a6f7e8a5f7e8a4f7e8a3f7e7a2f7e7a1f7e79ff7e69ef7e69df7e69cf7e59af7e599f7e598f7
-e496f7e495f7e493f7e392f7e390f7e28ff7e28df7e28bf7e18af7e188f7e087f7e085f7df83f7df
-82f7df80f6de7ff6de7df6dd7cf6dd7af6dc78f6dc77f6db75f6db73f6db71f6da6ff6da6ef6d96c
-f6d96af6d868f6d866f6d764f6d762f6d661f6d65ff6d55df6d55bf6d459f6d457f6d355f6d353f6
-d251f6d250f6d14ef5d14bf5d049f5d048f5cf46f5cf44f5ce42f5ce40f5cd3e
-
-f7e8a4f7e8a3f7e7a2f7e7a1f7e7a0f7e79ff7e69ef7e69df7e69bf7e59af7e598f7e597f7e496f7
-e494f7e493f7e392f7e390f7e28ff7e28df7e28cf7e18af7e189f7e087f7e085f7e084f7df82f7df
-81f6de80f6de7ef6dd7cf6dd7bf6dd79f6dc77f6dc75f6db74f6db72f6da70f6da6ef6d96cf6d96b
-f6d869f6d867f6d765f6d763f6d761f6d65ff6d65ef6d55cf6d55af6d458f6d456f6d354f6d352f6
-d250f6d24ff6d14df5d14bf5d049f5d047f5cf45f5cf43f5ce41f5ce3ff5cd3d
-
-f7e7a2f7e7a1f7e7a0f7e79ff7e69ef7e69df7e69cf7e69bf7e59af7e598f7e597f7e496f7e494f7
-e493f7e392f7e390f7e28ff7e28df7e28cf7e18af7e189f7e087f7e086f7e084f7df83f7df81f6de
-80f6de7ff6de7df6dd7bf6dd79f6dc78f6dc76f6db74f6db72f6da71f6da6ff6da6df6d96cf6d96a
-f6d868f6d866f6d764f6d762f6d661f6d65ff6d55df6d55bf6d459f6d457f6d355f6d354f6d252f6
-d250f6d14ef5d14cf5d04af5d048f5d046f5cf44f5ce42f5ce41f5ce3ef5cd3c
-
-f7e7a0f7e79ff7e69ef7e69df7e69cf7e69bf7e59af7e599f7e598f7e496f7e495f7e494f7e393f7
-e392f7e390f7e28ff7e28df7e28cf7e18af7e189f7e187f7e086f7e084f7df83f7df81f6de80f6de
-7ff6de7df6dd7bf6dd7af6dc78f6dc77f6dc75f6db73f6db71f6da70f6da6ef6d96cf6d96af6d868
-f6d867f6d765f6d763f6d761f6d65ff6d65ef6d55cf6d55af6d458f6d456f6d354f6d352f6d251f6
-d24ff6d14df5d14bf5d049f5d047f5cf45f5cf43f5ce41f5ce40f5cd3ef5cd3c
-
-f7e69ef7e69df7e69df7e69bf7e59bf7e599f7e598f7e597f7e496f7e495f7e494f7e392f7e391f7
-e390f7e28ef7e28df7e28cf7e18af7e189f7e187f7e086f7e085f7df83f7df81f7df80f6de7ff6de
-7df6dd7cf6dd7af6dc79f6dc77f6dc75f6db74f6db72f6da70f6da6ef6d96df6d96bf6d869f6d868
-f6d865f6d764f6d762f6d660f6d65ff6d55df6d55bf6d459f6d457f6d355f6d354f6d252f6d250f6
-d14ef5d14cf5d14af5d048f5d046f5cf45f5cf43f5ce41f5ce3ff5cd3df5cd3b
-
-f7e69cf7e69bf7e59bf7e59af7e598f7e598f7e496f7e496f7e494f7e493f7e392f7e391f7e390f7
-e28ef7e28df7e28bf7e18af7e189f7e187f7e086f7e085f7df83f7df81f7df80f6de7ff6de7ef6dd
-7cf6dd7bf6dd79f6dc77f6dc76f6db74f6db72f6da71f6da6ff6da6df6d96cf6d96af6d868f6d866
-f6d765f6d763f6d661f6d65ff6d55df6d55cf6d55af6d458f6d456f6d354f6d352f6d251f6d24ff6
-d14df5d14bf5d049f5d047f5cf45f5cf44f5ce42f5ce40f5cd3ef5cd3cf5cc3a
-
-f7e59bf7e59af7e599f7e598f7e597f7e496f7e495f7e494f7e393f7e392f7e390f7e38ff7e28ef7
-e28df7e28bf7e18af7e189f7e187f7e086f7e085f7df83f7df81f7df80f6de7ff6de7ef6de7df6dd
-7bf6dd79f6dc78f6dc76f6db75f6db73f6db71f6da70f6da6ef6d96cf6d96af6d869f6d867f6d765
-f6d763f6d762f6d660f6d65ef6d55df6d55bf6d459f6d457f6d355f6d353f6d252f6d250f6d14ef5
-d14cf5d14af5d048f5d047f5cf45f5cf43f5ce41f5ce3ff5cd3df5cd3bf5cc39
-
-f7e598f7e598f7e597f7e496f7e495f7e494f7e493f7e392f7e391f7e390f7e28ff7e28ef7e28cf7
-e18bf7e18af7e188f7e087f7e086f7e084f7df83f7df81f7df80f6de7ff6de7ef6de7df6dd7bf6dd
-79f6dc78f6dc77f6dc75f6db73f6db72f6da70f6da6ef6d96cf6d96bf6d869f6d868f6d866f6d764
-f6d762f6d661f6d65ff6d55df6d55bf6d55af6d458f6d456f6d354f6d352f6d250f6d24ff6d14df5
-d14bf5d049f5d047f5cf45f5cf44f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc38
-
-f7e496f7e496f7e495f7e494f7e493f7e392f7e391f7e390f7e38ff7e28ef7e28df7e28cf7e18bf7
-e189f7e188f7e087f7e085f7e084f7df83f7df81f7df80f6de7ff6de7ef6de7df6dd7bf6dd7af6dc
-78f6dc77f6dc75f6db73f6db72f6da70f6da6ef6d96df6d96bf6d96af6d868f6d866f6d765f6d763
-f6d661f6d65ff6d65ef6d55cf6d55af6d458f6d457f6d355f6d353f6d251f6d250f6d14ef5d14cf5
-d04af5d048f5d046f5cf45f5cf43f5ce41f5ce3ff5cd3df5cd3bf5cc39f5cc38
-
-f7e494f7e494f7e393f7e392f7e391f7e390f7e390f7e28ef7e28ef7e28cf7e18bf7e18af7e189f7
-e188f7e086f7e085f7e084f7df83f7df81f7df80f6de7ff6de7ef6de7df6dd7bf6dd7af6dc78f6dc
-77f6dc75f6db74f6db72f6da70f6da6ff6da6df6d96cf6d96af6d868f6d867f6d765f6d763f6d762
-f6d660f6d65ef6d55df6d55bf6d459f6d457f6d356f6d354f6d352f6d250f6d24ef6d14df5d14bf5
-d049f5d047f5cf45f5cf43f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cc37
-
-f7e393f7e392f7e391f7e390f7e390f7e28ef7e28ef7e28df7e28bf7e18bf7e189f7e188f7e087f7
-e086f7e085f7df83f7df82f7df81f7df80f6de7ff6de7ef6de7df6dd7bf6dd7af6dc78f6dc77f6dc
-75f6db74f6db72f6da71f6da6ff6da6ef6d96cf6d96af6d869f6d867f6d865f6d764f6d762f6d661
-f6d65ff6d55df6d55bf6d55af6d458f6d456f6d354f6d353f6d251f6d24ff6d14ef5d14bf5d04af5
-d048f5d046f5cf45f5cf43f5ce41f5ce3ff5cd3df5cd3bf5cc39f5cc38f5cb36
-
-f7e391f7e390f7e38ff7e28ef7e28ef7e28df7e28bf7e18bf7e18af7e189f7e187f7e087f7e085f7
-e084f7df83f7df82f7df81f6de80f6de7ff6de7ef6dd7cf6dd7bf6dd79f6dc78f6dc77f6dc75f6db
-74f6db72f6da71f6da6ff6da6ef6d96cf6d96bf6d869f6d868f6d866f6d764f6d763f6d661f6d65f
-f6d65ef6d55cf6d55af6d458f6d457f6d355f6d353f6d252f6d250f6d14ef6d14cf5d14bf5d049f5
-d047f5cf45f5cf43f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cc37f5cb35
-
-f7e28ff7e28ef7e28df7e28cf7e28bf7e18bf7e18af7e189f7e188f7e087f7e086f7e085f7e084f7
-df83f7df81f7df80f6de80f6de7ff6de7df6dd7cf6dd7bf6dd79f6dc78f6dc77f6dc75f6db74f6db
-72f6da71f6da6ff6da6ef6d96cf6d96bf6d869f6d868f6d866f6d765f6d763f6d761f6d660f6d65e
-f6d55cf6d55bf6d459f6d457f6d356f6d354f6d352f6d250f6d24ff6d14df5d14bf5d049f5d048f5
-cf46f5cf44f5ce42f5ce41f5ce3ff5cd3df5cd3bf5cc39f5cc38f5cb36f5cb34
-
-f7e28df7e28cf7e18bf7e18bf7e18af7e189f7e188f7e087f7e086f7e085f7e084f7df83f7df82f7
-df81f7df80f6de7ff6de7ef6de7df6dd7cf6dd7bf6dd79f6dc78f6dc77f6dc75f6db74f6db72f6da
-71f6da6ff6da6ef6d96cf6d96bf6d96af6d868f6d866f6d765f6d763f6d761f6d660f6d65ef6d55d
-f6d55bf6d459f6d458f6d456f6d354f6d353f6d251f6d24ff6d14ef5d14cf5d04af5d048f5d047f5
-cf45f5cf43f5ce41f5ce3ff5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb35f5ca33
-
-f7e18bf7e18af7e189f7e189f7e188f7e087f7e086f7e085f7e084f7df83f7df82f7df81f7df80f6
-de80f6de7ff6de7ef6de7df6dd7bf6dd7af6dd79f6dc77f6dc76f6dc75f6db74f6db72f6da71f6da
-6ff6da6ef6d96cf6d96bf6d96af6d868f6d866f6d765f6d763f6d762f6d660f6d65ff6d55df6d55b
-f6d55af6d458f6d456f6d355f6d353f6d252f6d250f6d14ef6d14cf5d14bf5d049f5d047f5cf45f5
-cf44f5ce42f5ce40f5ce3ef5cd3cf5cd3bf5cc39f5cc37f5cb36f5cb34f5ca32
-
-f7e189f7e188f7e187f7e087f7e086f7e085f7e084f7df83f7df83f7df81f7df81f6de80f6de7ff6
-de7ef6de7df6dd7cf6dd7bf6dd7af6dc79f6dc77f6dc76f6db75f6db73f6db72f6da70f6da6ff6da
-6ef6d96cf6d96bf6d96af6d868f6d867f6d765f6d763f6d762f6d661f6d65ff6d55df6d55cf6d55a
-f6d458f6d457f6d355f6d354f6d352f6d250f6d24ff6d14df5d14bf5d049f5d048f5d046f5cf44f5
-cf43f5ce41f5ce3ff5cd3df5cd3cf5cc3af5cc38f5cb36f5cb34f5ca33f5ca31
-
-f7e087f7e086f7e085f7e085f7e084f7df83f7df82f7df81f7df81f7df80f6de7ff6de7ff6de7df6
-de7df6dd7bf6dd7af6dd79f6dc78f6dc77f6dc75f6db74f6db73f6db72f6da70f6da6ff6da6ef6d9
-6cf6d96bf6d96af6d868f6d867f6d765f6d763f6d762f6d661f6d65ff6d55df6d55cf6d55bf6d459
-f6d457f6d356f6d354f6d352f6d251f6d24ff6d14ef5d14bf5d04af5d048f5d047f5cf45f5cf43f5
-ce41f5ce40f5cd3ef5cd3cf5cc3af5cc39f5cc37f5cb35f5cb33f5ca31f5ca30
-
-f7e085f7e084f7df83f7df83f7df82f7df81f7df81f7df80f6de7ff6de7ff6de7ef6de7df6dd7cf6
-dd7bf6dd7af6dc79f6dc77f6dc76f6dc75f6db74f6db72f6db71f6da70f6da6ff6da6ef6d96cf6d9
-6bf6d869f6d868f6d866f6d765f6d763f6d762f6d661f6d65ff6d65ef6d55cf6d55bf6d459f6d457
-f6d356f6d354f6d353f6d251f6d250f6d14ef5d14cf5d14af5d049f5d047f5cf45f5cf44f5ce42f5
-ce40f5ce3ef5cd3df5cd3bf5cc39f5cc38f5cb36f5cb34f5ca32f5ca30f5c92f
-
-f7df83f7df82f7df81f7df81f7df80f6de80f6de7ff6de7ff6de7ef6de7df6dd7cf6dd7bf6dd7af6
-dd79f6dc78f6dc77f6dc76f6db75f6db73f6db72f6da71f6da70f6da6ef6da6df6d96cf6d96af6d8
-69f6d868f6d866f6d765f6d763f6d762f6d661f6d65ff6d65ef6d55cf6d55bf6d459f6d458f6d456
-f6d354f6d353f6d251f6d250f6d14ef6d14cf5d14bf5d049f5d047f5cf46f5cf44f5cf43f5ce41f5
-ce3ff5cd3df5cd3cf5cc3af5cc38f5cb36f5cb35f5cb33f5ca31f5ca2ff5c92d
-
-f7df81f7df80f7df80f6de80f6de7ff6de7ef6de7df6de7df6dd7cf6dd7bf6dd7af6dd79f6dc78f6
-dc77f6dc76f6dc75f6db74f6db73f6db72f6da70f6da6ff6da6ef6d96df6d96cf6d96af6d869f6d8
-68f6d866f6d765f6d763f6d762f6d661f6d65ff6d65ef6d55cf6d55bf6d459f6d458f6d456f6d355
-f6d353f6d252f6d250f6d24ef6d14df5d14bf5d049f5d048f5d046f5cf45f5cf43f5ce41f5ce40f5
-cd3ef5cd3cf5cc3af5cc39f5cc37f5cb35f5cb34f5ca32f5ca30f5c92ef5c92d
-
-f6de80f6de7ff6de7ff6de7ef6de7df6dd7cf6dd7cf6dd7bf6dd7af6dd79f6dc78f6dc77f6dc76f6
-dc75f6db74f6db73f6db72f6da71f6da70f6da6ff6da6ef6d96cf6d96bf6d96af6d869f6d867f6d8
-66f6d765f6d763f6d762f6d661f6d65ff6d65ef6d55cf6d55bf6d459f6d458f6d456f6d355f6d353
-f6d252f6d250f6d24ff6d14df5d14bf5d04af5d048f5d047f5cf45f5cf43f5ce42f5ce40f5ce3ef5
-cd3cf5cd3bf5cc39f5cc38f5cb36f5cb34f5ca32f5ca31f5ca2ff5c92df5c92b
-
-f6de7ef6de7df6de7df6dd7cf6dd7bf6dd7bf6dd7af6dd79f6dc78f6dc77f6dc76f6dc75f6db75f6
-db73f6db72f6db71f6da70f6da6ff6da6ef6d96df6d96cf6d96bf6d96af6d868f6d867f6d865f6d7
-64f6d763f6d762f6d660f6d65ff6d55df6d55cf6d55bf6d459f6d458f6d456f6d355f6d353f6d352
-f6d250f6d24ff6d14df5d14bf5d14af5d049f5d047f5cf45f5cf44f5ce42f5ce41f5ce3ff5cd3df5
-cd3bf5cc3af5cc38f5cb36f5cb35f5cb33f5ca31f5ca2ff5c92ef5c92cf5c82a
-
-f6dd7cf6dd7bf6dd7bf6dd7af6dd79f6dc79f6dc78f6dc77f6dc76f6dc75f6db75f6db74f6db72f6
-db72f6da70f6da70f6da6ef6da6ef6d96cf6d96bf6d96af6d869f6d868f6d866f6d765f6d764f6d7
-63f6d761f6d660f6d65ff6d55df6d55cf6d55bf6d459f6d458f6d456f6d355f6d353f6d352f6d250
-f6d24ff6d14ef5d14cf5d14af5d049f5d047f5cf45f5cf44f5cf43f5ce41f5ce3ff5cd3ef5cd3cf5
-cc3af5cc38f5cc37f5cb35f5cb34f5ca32f5ca30f5c92ef5c92df5c92bf5c829
-
-f6dd7af6dd79f6dc79f6dc78f6dc77f6dc77f6dc76f6dc75f6db74f6db73f6db72f6db72f6da71f6
-da70f6da6ff6da6ef6d96df6d96cf6d96bf6d96af6d868f6d867f6d866f6d765f6d763f6d762f6d6
-61f6d660f6d65ff6d55df6d55cf6d55bf6d459f6d458f6d456f6d355f6d353f6d352f6d250f6d24f
-f6d14ef5d14cf5d14af5d049f5d047f5cf46f5cf44f5cf43f5ce41f5ce3ff5cd3ef5cd3cf5cc3af5
-cc39f5cc37f5cb36f5cb34f5ca32f5ca31f5ca2ff5c92df5c92bf5c82af5c828
-
-f6dc78f6dc77f6dc77f6dc76f6dc75f6db75f6db74f6db73f6db72f6db72f6da71f6da70f6da6ff6
-da6ef6d96df6d96cf6d96bf6d96af6d869f6d868f6d867f6d865f6d764f6d763f6d762f6d661f6d6
-5ff6d65ef6d55df6d55cf6d55af6d459f6d458f6d456f6d355f6d353f6d352f6d250f6d24ff6d14e
-f5d14cf5d14bf5d049f5d047f5cf46f5cf45f5cf43f5ce41f5ce40f5cd3ef5cd3cf5cd3bf5cc39f5
-cc38f5cb36f5cb34f5ca33f5ca31f5ca2ff5c92ef5c92cf5c82af5c829f5c727
-
-f6dc76f6dc75f6db75f6db74f6db73f6db72f6db72f6db71f6da70f6da70f6da6ff6da6ef6da6df6
-d96cf6d96bf6d96af6d869f6d868f6d867f6d866f6d765f6d764f6d763f6d761f6d660f6d65ff6d6
-5ef6d55df6d55bf6d55af6d458f6d457f6d456f6d354f6d353f6d352f6d250f6d24ff6d14ef5d14c
-f5d14bf5d049f5d047f5d046f5cf45f5cf43f5ce41f5ce40f5ce3ef5cd3df5cd3bf5cc3af5cc38f5
-cb36f5cb35f5cb33f5ca31f5ca30f5c92ef5c92df5c82bf5c829f5c827f5c726
-
-f6db74f6db73f6db72f6db72f6db71f6da71f6da70f6da6ff6da6ef6da6ef6d96df6d96cf6d96bf6
-d96af6d869f6d868f6d868f6d866f6d765f6d764f6d763f6d762f6d661f6d660f6d65ff6d55df6d5
-5cf6d55bf6d55af6d458f6d457f6d356f6d354f6d353f6d252f6d250f6d24ff6d14ef5d14cf5d14b
-f5d049f5d047f5d046f5cf45f5cf43f5ce42f5ce40f5ce3ef5cd3df5cd3bf5cc3af5cc38f5cc37f5
-cb35f5cb34f5ca32f5ca30f5c92ff5c92df5c92bf5c829f5c828f5c726f5c724
-
-f6db72f6db71f6da70f6da70f6da6ff6da6ff6da6ef6da6df6d96cf6d96cf6d96bf6d96af6d869f6
-d868f6d868f6d866f6d865f6d765f6d763f6d762f6d761f6d660f6d65ff6d65ef6d55df6d55cf6d5
-5bf6d459f6d458f6d456f6d355f6d354f6d353f6d252f6d250f6d24ff6d14df5d14cf5d14bf5d049
-f5d047f5d046f5cf45f5cf43f5ce42f5ce40f5ce3ef5cd3df5cd3cf5cc3af5cc38f5cc37f5cb35f5
-cb34f5ca32f5ca31f5ca2ff5c92df5c92bf5c82af5c828f5c727f5c725f5c723
-
-f6da70f6da6ff6da6ff6da6ef6da6ef6d96df6d96cf6d96cf6d96bf6d96af6d869f6d868f6d868f6
-d866f6d865f6d765f6d764f6d763f6d762f6d661f6d65ff6d65ff6d55df6d55cf6d55bf6d55af6d4
-59f6d458f6d456f6d355f6d354f6d352f6d251f6d250f6d24ef6d14df5d14cf5d14af5d049f5d047
-f5d046f5cf45f5cf43f5ce42f5ce40f5ce3ff5cd3df5cd3cf5cc3af5cc39f5cc37f5cb36f5cb34f5
-ca32f5ca31f5ca2ff5c92df5c92cf5c82af5c829f5c727f5c725f5c724f5c622
-
-f6da6ef6da6df6d96df6d96cf6d96cf6d96bf6d96af6d96af6d869f6d868f6d867f6d866f6d865f6
-d765f6d764f6d763f6d762f6d661f6d660f6d65ff6d65ef6d55df6d55cf6d55bf6d459f6d458f6d4
-57f6d356f6d354f6d353f6d352f6d251f6d250f6d24ef6d14df5d14bf5d14af5d049f5d047f5d046
-f5cf45f5cf43f5ce42f5ce40f5ce3ff5cd3df5cd3cf5cc3af5cc39f5cc37f5cb36f5cb34f5ca33f5
-ca31f5ca2ff5c92ef5c92cf5c82bf5c829f5c827f5c726f5c724f5c622f5c621
-
-f6d96cf6d96bf6d96bf6d96af6d96af6d869f6d868f6d868f6d867f6d866f6d765f6d764f6d763f6
-d763f6d762f6d661f6d660f6d65ff6d65ef6d55df6d55cf6d55bf6d55af6d459f6d458f6d456f6d3
-55f6d354f6d353f6d252f6d250f6d24ff6d14ef6d14df5d14bf5d04af5d049f5d047f5cf46f5cf45
-f5cf43f5ce42f5ce40f5ce3ff5cd3df5cd3cf5cc3af5cc39f5cc37f5cb36f5cb34f5ca33f5ca31f5
-ca2ff5c92ef5c92df5c92bf5c829f5c828f5c726f5c724f5c623f5c621f5c620
-
-f6d96af6d869f6d869f6d868f6d868f6d867f6d866f6d865f6d765f6d764f6d763f6d763f6d762f6
-d661f6d660f6d65ff6d65ef6d55df6d55cf6d55bf6d55af6d459f6d458f6d457f6d456f6d355f6d3
-54f6d352f6d251f6d250f6d24ff6d14ef6d14cf5d14bf5d04af5d048f5d047f5cf46f5cf44f5cf43
-f5ce42f5ce40f5ce3ff5cd3df5cd3cf5cc3af5cc39f5cc38f5cb36f5cb34f5ca33f5ca31f5ca30f5
-c92ef5c92df5c92bf5c829f5c828f5c727f5c725f5c723f5c622f5c620f5c51e
-
-f6d868f6d867f6d867f6d866f6d865f6d765f6d764f6d763f6d763f6d762f6d761f6d661f6d660f6
-d65ff6d65ef6d55df6d55cf6d55bf6d55bf6d459f6d458f6d457f6d456f6d355f6d354f6d353f6d3
-52f6d251f6d250f6d24ef6d14df5d14cf5d14bf5d049f5d048f5d047f5cf45f5cf44f5cf43f5ce41
-f5ce40f5ce3ef5cd3df5cd3cf5cc3af5cc39f5cc38f5cb36f5cb34f5cb33f5ca31f5ca30f5c92ef5
-c92df5c92bf5c82af5c828f5c727f5c725f5c723f5c622f5c620f5c51ef5c51d
-
-f6d865f6d765f6d765f6d764f6d763f6d763f6d762f6d761f6d661f6d660f6d65ff6d65ff6d65ef6
-d55df6d55cf6d55bf6d55bf6d459f6d458f6d458f6d456f6d356f6d354f6d354f6d352f6d251f6d2
-50f6d24ff6d14ef6d14df5d14bf5d14af5d049f5d048f5d046f5cf45f5cf44f5cf43f5ce41f5ce40
-f5ce3ef5cd3df5cd3cf5cc3af5cc39f5cc38f5cb36f5cb34f5cb33f5ca31f5ca30f5c92ff5c92df5
-c92bf5c82af5c829f5c727f5c725f5c724f5c622f5c620f5c51ff5c51df5c51c
-
-f6d763f6d763f6d763f6d762f6d761f6d661f6d660f6d660f6d65ff6d65ef6d55df6d55df6d55cf6
-d55bf6d55af6d459f6d458f6d458f6d457f6d356f6d355f6d354f6d353f6d252f6d250f6d250f6d2
-4ef6d14df5d14cf5d14bf5d04af5d049f5d047f5d046f5cf45f5cf43f5ce42f5ce41f5ce40f5cd3e
-f5cd3df5cd3cf5cc3af5cc39f5cc37f5cb36f5cb34f5cb33f5ca31f5ca30f5c92ff5c92df5c92bf5
-c82af5c829f5c727f5c725f5c724f5c622f5c621f5c51ff5c51ef5c51cf5c41a
-
-f6d761f6d661f6d661f6d660f6d65ff6d65ff6d65ef6d65ef6d55df6d55cf6d55cf6d55bf6d55af6
-d459f6d458f6d458f6d456f6d356f6d355f6d354f6d353f6d352f6d251f6d250f6d24ff6d14ef6d1
-4df5d14bf5d14af5d049f5d048f5d047f5cf45f5cf44f5cf43f5ce42f5ce41f5ce3ff5cd3ef5cd3c
-f5cd3bf5cc3af5cc38f5cc37f5cb36f5cb34f5cb33f5ca31f5ca30f5c92ff5c92df5c92cf5c82af5
-c829f5c727f5c726f5c724f5c622f5c621f5c51ff5c51ef5c51cf5c41bf5c419
-
-f6d65ff6d65ff6d65ff6d65ef6d55df6d55df6d55cf6d55cf6d55bf6d55af6d55af6d459f6d458f6
-d457f6d456f6d356f6d355f6d354f6d353f6d352f6d251f6d250f6d24ff6d14ef6d14df5d14cf5d1
-4bf5d04af5d049f5d047f5d046f5cf45f5cf44f5cf43f5ce41f5ce40f5ce3ff5cd3ef5cd3cf5cd3b
-f5cc3af5cc38f5cc37f5cb36f5cb34f5ca33f5ca31f5ca30f5c92ff5c92df5c92cf5c82af5c829f5
-c827f5c726f5c724f5c622f5c621f5c620f5c51ef5c51cf5c41bf5c419f5c418
-
-f6d55df6d55df6d55df6d55cf6d55bf6d55bf6d55af6d55af6d459f6d458f6d458f6d457f6d456f6
-d355f6d354f6d354f6d353f6d352f6d251f6d250f6d24ff6d24ef6d14df6d14cf5d14bf5d14af5d0
-49f5d048f5d047f5cf46f5cf45f5cf43f5ce42f5ce41f5ce40f5ce3ef5cd3df5cd3cf5cd3bf5cc39
-f5cc38f5cc37f5cb36f5cb34f5ca33f5ca31f5ca30f5c92ff5c92df5c92cf5c82af5c829f5c827f5
-c726f5c724f5c623f5c621f5c620f5c51ef5c51df5c41bf5c41af5c418f4c317
-
-f6d55bf6d55bf6d55bf6d55af6d459f6d459f6d458f6d458f6d457f6d456f6d356f6d355f6d354f6
-d354f6d353f6d352f6d251f6d250f6d24ff6d24ef6d14ef6d14cf5d14bf5d14af5d049f5d048f5d0
-47f5d046f5cf45f5cf44f5cf43f5ce42f5ce41f5ce3ff5cd3ef5cd3df5cd3cf5cc3af5cc39f5cc38
-f5cb36f5cb35f5cb34f5ca32f5ca31f5ca30f5c92ef5c92df5c92bf5c82af5c829f5c827f5c726f5
-c724f5c623f5c621f5c620f5c51ef5c51df5c41bf5c41af5c418f4c317f4c317
-
-f6d459f6d459f6d458f6d458f6d457f6d457f6d456f6d356f6d355f6d354f6d354f6d353f6d352f6
-d252f6d251f6d250f6d24ff6d24ef6d14ef6d14cf5d14bf5d14bf5d049f5d049f5d047f5d047f5cf
-45f5cf45f5cf43f5ce42f5ce41f5ce40f5ce3ff5cd3ef5cd3cf5cd3bf5cc3af5cc39f5cc38f5cb36
-f5cb35f5cb34f5ca32f5ca31f5ca2ff5c92ef5c92df5c92bf5c82af5c829f5c827f5c726f5c724f5
-c623f5c621f5c620f5c51ef5c51df5c51cf5c41af5c418f4c317f4c317f4c317
-
-f6d457f6d457f6d456f6d456f6d356f6d355f6d354f6d354f6d353f6d352f6d252f6d251f6d250f6
-d250f6d24ff6d14ef6d14df6d14cf5d14bf5d14bf5d049f5d049f5d048f5d047f5cf46f5cf45f5cf
-44f5cf43f5ce42f5ce41f5ce3ff5cd3ef5cd3df5cd3cf5cd3bf5cc3af5cc38f5cc37f5cb36f5cb34
-f5cb33f5ca32f5ca31f5ca2ff5c92ef5c92df5c92bf5c82af5c829f5c727f5c726f5c724f5c623f5
-c621f5c620f5c51ef5c51df5c51cf5c41af5c418f4c317f4c317f4c317f4c217
-
-f6d355f6d355f6d354f6d354f6d354f6d353f6d352f6d252f6d251f6d250f6d250f6d24ff6d24ef6
-d14ef6d14df5d14cf5d14bf5d14af5d049f5d049f5d048f5d047f5cf46f5cf45f5cf44f5cf43f5ce
-42f5ce41f5ce40f5ce3ef5cd3ef5cd3cf5cd3bf5cc3af5cc39f5cc38f5cc37f5cb36f5cb34f5ca33
-f5ca31f5ca30f5ca2ff5c92ef5c92cf5c92bf5c82af5c828f5c727f5c726f5c724f5c623f5c621f5
-c620f5c51ef5c51df5c51cf5c41af5c418f4c317f4c317f4c317f4c217f3c217
-
-f6d353f6d353f6d352f6d352f6d252f6d251f6d250f6d250f6d24ff6d24ef6d14ef6d14df6d14cf5
-d14cf5d14bf5d14af5d049f5d049f5d048f5d047f5cf46f5cf45f5cf44f5cf43f5ce42f5ce41f5ce
-40f5ce3ff5cd3ef5cd3df5cd3cf5cd3bf5cc3af5cc38f5cc37f5cb36f5cb35f5cb34f5ca32f5ca31
-f5ca30f5c92ff5c92df5c92cf5c82bf5c829f5c828f5c727f5c725f5c724f5c622f5c621f5c620f5
-c51ef5c51df5c51cf5c41af5c419f4c317f4c317f4c317f4c217f3c217f3c117
-
-f6d251f6d251f6d250f6d250f6d250f6d24ff6d24ef6d14ef6d14df6d14df5d14cf5d14bf5d14bf5
-d04af5d049f5d048f5d047f5d047f5cf46f5cf45f5cf44f5cf43f5ce42f5ce41f5ce40f5ce3ff5cd
-3ef5cd3df5cd3cf5cd3bf5cc3af5cc39f5cc38f5cc37f5cb36f5cb34f5cb33f5ca32f5ca31f5ca2f
-f5c92ef5c92df5c92cf5c82bf5c829f5c828f5c727f5c725f5c724f5c622f5c621f5c620f5c51ef5
-c51df5c51cf5c41af5c418f4c317f4c317f4c317f4c217f3c217f3c217f3c117
-
-f6d24ff6d24ff6d24ef6d14ef6d14ef6d14df6d14cf5d14cf5d14bf5d14bf5d04af5d049f5d049f5
-d048f5d047f5d046f5cf45f5cf45f5cf44f5cf43f5ce42f5ce41f5ce41f5ce3ff5ce3ef5cd3df5cd
-3cf5cd3bf5cc3af5cc39f5cc38f5cc37f5cb36f5cb35f5cb34f5ca33f5ca31f5ca30f5ca2ff5c92e
-f5c92df5c92bf5c82af5c829f5c827f5c726f5c725f5c724f5c622f5c621f5c620f5c51ef5c51df5
-c41bf5c41af5c418f4c317f4c317f4c317f4c217f3c217f3c217f3c117f3c117
-
-f6d14df6d14df6d14cf5d14cf5d14bf5d14bf5d14af5d04af5d049f5d049f5d048f5d047f5d047f5
-cf46f5cf45f5cf44f5cf44f5cf43f5ce42f5ce41f5ce40f5ce3ff5ce3ef5cd3ef5cd3cf5cd3cf5cc
-3af5cc3af5cc38f5cc38f5cb36f5cb36f5cb34f5cb33f5ca32f5ca31f5ca30f5c92ff5c92df5c92c
-f5c92bf5c82af5c829f5c827f5c726f5c724f5c723f5c622f5c620f5c51ff5c51ef5c51cf5c41bf5
-c41af5c418f4c317f4c317f4c317f4c217f3c217f3c217f3c117f3c117f2c017
-
-f5d14bf5d14bf5d14af5d04af5d049f5d049f5d048f5d048f5d047f5d047f5cf46f5cf45f5cf45f5
-cf44f5cf43f5cf43f5ce42f5ce41f5ce40f5ce3ff5ce3ef5cd3ef5cd3cf5cd3cf5cd3bf5cc3af5cc
-39f5cc38f5cc37f5cb36f5cb35f5cb34f5ca33f5ca31f5ca30f5ca2ff5c92ef5c92df5c92cf5c82b
-f5c829f5c828f5c727f5c726f5c724f5c623f5c622f5c620f5c51ff5c51ef5c51cf5c41bf5c41af5
-c418f4c317f4c317f4c317f4c217f3c217f3c217f3c117f3c117f2c017f2c017
-
-f5d049f5d049f5d048f5d048f5d047f5d047f5d046f5cf46f5cf45f5cf45f5cf44f5cf43f5cf43f5
-ce42f5ce41f5ce41f5ce40f5ce3ff5cd3ef5cd3df5cd3cf5cd3cf5cd3bf5cc3af5cc39f5cc38f5cc
-37f5cb36f5cb35f5cb34f5ca33f5ca32f5ca31f5ca30f5c92ff5c92df5c92cf5c92bf5c82af5c829
-f5c828f5c727f5c725f5c724f5c622f5c621f5c620f5c51ff5c51ef5c51cf5c41bf5c41af5c418f4
-c317f4c317f4c317f4c217f3c217f3c217f3c117f3c117f2c017f2c017f2c017
-
-f5d047f5d047f5d046f5cf46f5cf45f5cf45f5cf44f5cf44f5cf43f5cf43f5ce42f5ce41f5ce41f5
-ce40f5ce3ff5ce3ef5cd3ef5cd3df5cd3cf5cd3bf5cc3af5cc3af5cc39f5cc38f5cc37f5cb36f5cb
-35f5cb34f5cb33f5ca32f5ca31f5ca30f5ca2ff5c92ef5c92df5c92cf5c82bf5c829f5c828f5c727
-f5c726f5c724f5c723f5c622f5c621f5c620f5c51ef5c51df5c51cf5c41af5c419f5c418f4c317f4
-c317f4c317f4c217f3c217f3c117f3c117f3c117f2c017f2c017f2c017f2bf17
-
-f5cf45f5cf45f5cf44f5cf44f5cf43f5cf43f5ce42f5ce42f5ce41f5ce41f5ce40f5ce3ff5ce3ef5
-cd3ef5cd3df5cd3cf5cd3cf5cd3bf5cc3af5cc3af5cc39f5cc38f5cc37f5cb36f5cb35f5cb34f5cb
-33f5ca32f5ca31f5ca30f5ca2ff5c92ef5c92df5c92cf5c92bf5c82af5c829f5c828f5c727f5c725
-f5c724f5c623f5c622f5c620f5c51ff5c51ef5c51df5c51cf5c41af5c419f5c418f4c317f4c317f4
-c217f4c217f3c217f3c117f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17
-
-f5cf43f5cf43f5ce42f5ce42f5ce41f5ce41f5ce40f5ce40f5ce3ff5ce3ef5cd3ef5cd3df5cd3df5
-cd3cf5cd3bf5cd3bf5cc3af5cc39f5cc38f5cc38f5cc37f5cb36f5cb35f5cb34f5cb33f5ca32f5ca
-31f5ca30f5ca2ff5c92ff5c92df5c92df5c92bf5c82af5c829f5c828f5c727f5c726f5c725f5c724
-f5c622f5c621f5c620f5c51ff5c51ef5c51cf5c41bf5c41af5c419f4c317f4c317f4c317f4c217f4
-c217f3c217f3c117f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1bf17
-
-f5ce41f5ce41f5ce40f5ce40f5ce3ff5ce3ff5cd3ef5cd3ef5cd3df5cd3cf5cd3cf5cd3bf5cd3bf5
-cc3af5cc39f5cc39f5cc38f5cc37f5cb36f5cb36f5cb35f5cb34f5cb33f5ca32f5ca31f5ca31f5ca
-2ff5c92ff5c92ef5c92df5c92cf5c82bf5c82af5c829f5c827f5c727f5c725f5c724f5c623f5c622
-f5c621f5c620f5c51ef5c51df5c51cf5c41bf5c41af5c418f4c317f4c317f4c317f4c217f4c217f3
-c217f3c117f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1bf17f1be17
-
-f5ce3ff5ce3ef5cd3ef5cd3ef5cd3df5cd3df5cd3cf5cd3cf5cd3bf5cc3af5cc3af5cc39f5cc39f5
-cc38f5cc38f5cc37f5cb36f5cb35f5cb34f5cb34f5cb33f5ca32f5ca31f5ca30f5ca2ff5c92ff5c9
-2ef5c92df5c92cf5c92bf5c82af5c829f5c828f5c727f5c726f5c724f5c724f5c622f5c621f5c620
-f5c51ff5c51ef5c51df5c51cf5c41af5c419f5c418f4c317f4c317f4c317f4c217f3c217f3c217f3
-c117f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f1be17
-
-f5cd3df5cd3cf5cd3cf5cd3cf5cd3bf5cd3bf5cc3af5cc3af5cc39f5cc38f5cc38f5cc38f5cc37f5
-cb36f5cb36f5cb35f5cb34f5cb34f5ca33f5ca32f5ca31f5ca30f5ca2ff5c92ff5c92df5c92df5c9
-2cf5c92bf5c82af5c829f5c828f5c727f5c726f5c725f5c724f5c623f5c622f5c621f5c620f5c51e
-f5c51df5c51cf5c41bf5c41af5c419f5c418f4c317f4c317f4c217f4c217f3c217f3c217f3c117f3
-c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f1be17f0bd17
-
-f5cd3bf5cc3af5cc3af5cc3af5cc39f5cc39f5cc38f5cc38f5cc37f5cc37f5cb36f5cb36f5cb35f5
-cb34f5cb34f5ca33f5ca32f5ca31f5ca31f5ca30f5ca2ff5c92ef5c92df5c92df5c92cf5c92bf5c8
-2af5c829f5c828f5c827f5c726f5c725f5c724f5c723f5c622f5c621f5c620f5c51ff5c51ef5c51d
-f5c51cf5c41af5c419f5c418f4c317f4c317f4c317f4c217f4c217f3c217f3c117f3c117f3c117f3
-c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17
-
-f5cc39f5cc38f5cc38f5cc38f5cc37f5cc37f5cb36f5cb36f5cb35f5cb35f5cb34f5cb34f5ca33f5
-ca32f5ca31f5ca31f5ca30f5ca2ff5c92ff5c92ef5c92df5c92cf5c92bf5c82bf5c82af5c829f5c8
-28f5c827f5c726f5c725f5c724f5c723f5c622f5c621f5c620f5c51ff5c51ef5c51df5c51cf5c41b
-f5c41af5c419f5c418f4c317f4c317f4c317f4c217f3c217f3c217f3c117f3c117f3c117f2c017f2
-c017f2c017f2bf17f2bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bd17
-
-f5cc37f5cb36f5cb36f5cb36f5cb35f5cb35f5cb34f5cb34f5cb33f5ca33f5ca32f5ca31f5ca31f5
-ca30f5ca2ff5ca2ff5c92ef5c92df5c92df5c92cf5c92bf5c82bf5c82af5c829f5c828f5c727f5c7
-26f5c725f5c724f5c723f5c622f5c622f5c620f5c620f5c51ef5c51ef5c51cf5c41bf5c41af5c419
-f5c418f4c317f4c317f4c317f4c217f4c217f3c217f3c217f3c117f3c117f3c117f2c017f2c017f2
-c017f2bf17f2bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bc17
-
-f5cb35f5cb34f5cb34f5cb34f5cb33f5ca33f5ca32f5ca31f5ca31f5ca31f5ca30f5ca2ff5c92ff5
-c92ef5c92df5c92df5c92cf5c92bf5c92bf5c82af5c829f5c829f5c828f5c727f5c726f5c725f5c7
-24f5c723f5c622f5c622f5c621f5c620f5c51ff5c51ef5c51df5c51cf5c41bf5c41af5c418f5c418
-f4c317f4c317f4c317f4c217f4c217f3c217f3c117f3c117f3c117f3c117f2c017f2c017f2c017f2
-bf17f1bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17
-
-f5ca32f5ca32f5ca32f5ca31f5ca31f5ca31f5ca30f5ca2ff5ca2ff5c92ff5c92ef5c92df5c92df5
-c92cf5c92bf5c92bf5c82af5c829f5c829f5c828f5c827f5c727f5c726f5c725f5c724f5c723f5c6
-22f5c622f5c621f5c620f5c51ff5c51ef5c51df5c51cf5c41bf5c41af5c419f5c418f4c317f4c317
-f4c317f4c217f4c217f3c217f3c217f3c117f3c117f3c117f2c017f2c017f2c017f2c017f2bf17f1
-bf17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbc17
-
-Q
-Q
-Q
-Q
-q
-q
-n
-204 203 m
-268 203 l
-268 139 l
-204 139 l
-204 203 l
-h
-W
-q
-q
-[64 0 0 64 204 139]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-f5ce3ff5cd3df5cd3bf5cc39f5cc38f5cb36f5cb34f5ca31f5ca2ff5c92df5c92bf5c829f5c827f5
-c725f5c723f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c117f3c117f2c0
-17f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916
-edb816edb716ecb616ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8ae16e7ae16e6
-ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a415e1a415
-
-f5ce3ff5cd3df5cd3bf5cc39f5cc37f5cb35f5ca33f5ca31f5c92ff5c92df5c92bf5c829f5c727f5
-c725f5c623f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c117f3c117f2c0
-17f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916
-edb816edb716ecb616ecb516ebb416eab416eab316e9b216e9b116e8b016e8af16e7ae16e7ad15e6
-ac15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a415e1a315
-
-f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5c82af5c828f5c726f5
-c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c0
-17f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16edb916
-edb816ecb716ecb616ebb516ebb416eab316eab216e9b216e9b116e8b016e8af16e7ae16e7ad15e6
-ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a515e2a415e1a315
-
-f5cd3df5cd3cf5cc3af5cc38f5cb36f5cb34f5ca31f5ca2ff5c92df5c92cf5c82af5c828f5c726f5
-c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c217f4c217f3c217f3c117f3c117f2c0
-17f2c017f2bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb916
-edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b116e8b016e8af16e7ae16e7ad15e6
-ac15e6ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a515e2a415e1a315
-
-f5cd3df5cd3bf5cc39f5cc37f5cb35f5cb33f5ca31f5ca2ff5c92df5c92bf5c829f5c727f5c725f5
-c623f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c0
-17f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816
-edb716ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8af16e7ae16e7ad15e6
-ac15e6ab15e5aa15e5a915e4a815e4a715e3a715e2a615e2a515e1a415e1a315
-
-f5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5c82af5c829f5c727f5c724f5
-c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c0
-17f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816
-edb716ecb616ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8ae16e7ae16e6ad15e6
-ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a515e1a415e1a315
-
-f5cd3bf5cc39f5cc38f5cb36f5cb34f5ca31f5ca2ff5c92ef5c92cf5c82af5c828f5c726f5c724f5
-c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c0
-17f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16edb916edb816
-ecb716ecb616ebb516ebb416eab316eab216e9b216e9b116e8b016e8af16e7ae16e7ad15e6ac15e6
-ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a415e1a315e1a215
-
-f5cc3af5cc39f5cc37f5cb35f5ca33f5ca31f5ca2ff5c92df5c92bf5c829f5c727f5c725f5c723f5
-c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf
-17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb916edb816
-ecb716ecb616ebb516ebb416eab316eab216e9b116e9b116e8b016e8af16e7ae16e7ad15e6ac15e6
-ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a515e2a415e1a315e1a215
-
-f5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5c82af5c828f5c727f5c724f5c622f5
-c620f5c51ef5c51cf5c41bf5c419f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf
-17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716
-ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6
-ab15e5aa15e5a915e4a815e4a715e3a715e2a615e2a515e1a415e1a315e0a215
-
-f5cc39f5cc37f5cb35f5cb33f5ca31f5ca2ff5c92df5c92bf5c829f5c828f5c726f5c724f5c622f5
-c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf
-17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716
-ecb616ecb516ebb516ebb416eab316eab216e9b116e9b016e8af16e8ae16e7ae16e6ad15e6ac15e5
-ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a515e1a415e1a315e0a215
-
-f5cc38f5cb36f5cb34f5ca32f5ca31f5c92ff5c92df5c82bf5c829f5c727f5c725f5c623f5c621f5
-c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2c017f2bf
-17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17efbb17eeba16edb916edb816ecb716
-ecb616ebb516ebb416eab316eab216e9b216e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ac15e5
-ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a415e1a415e1a315e0a215
-
-f5cc37f5cb36f5cb34f5ca31f5ca30f5c92ef5c92cf5c82af5c828f5c726f5c724f5c622f5c620f5
-c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf
-17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb716
-ecb616ebb516ebb416eab316eab216e9b116e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ab15e5
-aa15e5a915e4a915e4a815e3a715e3a615e2a515e2a415e1a315e1a215e0a215
-
-f5cb36f5cb35f5ca33f5ca31f5ca2ff5c92df5c92bf5c829f5c827f5c725f5c723f5c621f5c620f5
-c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf
-17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb616
-ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ab15e5
-aa15e5a915e4a815e4a715e3a715e2a615e2a515e1a415e1a315e0a215e0a115
-
-f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5c82af5c828f5c727f5c724f5c622f5c621f5c51ff5
-c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f2bf17f1be
-17f1be17f0bd17f0bd17f0bc17efbc17efbc17efbb17efbb17eeba16edb916edb816ecb716ecb616
-ecb516ebb416eab416eab316e9b216e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5
-aa15e4a915e4a815e3a715e3a615e2a515e2a515e1a415e1a315e0a215e0a115
-
-f5cb35f5ca33f5ca31f5ca2ff5c92df5c92bf5c829f5c827f5c726f5c724f5c622f5c620f5c51ef5
-c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be
-17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb916edb816ecb716ecb616
-ebb516ebb416eab316eab216e9b116e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5
-aa15e4a915e4a815e3a715e3a615e2a515e2a415e1a415e1a315e0a215e0a115
-
-f5cb34f5ca32f5ca30f5c92ef5c92cf5c82bf5c829f5c727f5c725f5c623f5c621f5c51ff5c51df5
-c41bf5c419f5c418f4c317f4c217f3c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be
-17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb616ecb616
-ebb516ebb416eab316eab216e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5
-a915e4a915e4a815e3a715e3a615e2a515e2a415e1a315e1a215e0a115e0a115
-
-f5ca33f5ca31f5ca2ff5c92df5c92bf5c829f5c828f5c726f5c724f5c622f5c620f5c51ef5c51cf5
-c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be
-17f0bd17f0bd17f0bc17efbc17efbb17efbb17efbb17eeba16edb916edb816ecb716ecb616ecb516
-ebb416eab416eab316e9b216e9b116e9b016e8af16e8ae16e7ae16e6ad15e6ac15e5ab15e5aa15e4
-a915e4a815e4a715e3a715e2a615e2a515e1a415e1a315e0a215e0a115dfa014
-
-f5ca32f5ca30f5c92ef5c92cf5c82bf5c829f5c727f5c725f5c623f5c621f5c51ff5c51df5c51cf5
-c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be
-17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb816ecb716ecb616ebb516
-ebb416eab316eab216e9b216e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e4
-a915e4a815e3a715e3a615e2a515e2a415e1a415e1a315e0a215e0a115dfa014
-
-f5ca31f5ca2ff5c92df5c92bf5c829f5c828f5c726f5c724f5c622f5c620f5c51ef5c51cf5c41bf5
-c419f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2c017f2bf17f1be17f1be17f1be
-17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb616ecb616ebb516
-ebb416eab316eab216e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5a915e4
-a915e4a815e3a715e3a615e2a515e2a415e1a315e1a215e0a215e0a115dfa014
-
-f5ca30f5c92ef5c92cf5c82bf5c829f5c727f5c725f5c623f5c621f5c51ff5c51ef5c51cf5c41af5
-c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd
-17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb916edb816ecb716ecb616ebb516ebb416
-eab416eab316e9b216e9b116e8b016e8af16e8ae16e7ae16e6ad15e6ac15e5ab15e5aa15e5a915e4
-a815e4a715e3a715e2a615e2a515e1a415e1a315e1a215e0a115e0a115df9f14
-
-f5ca2ff5c92df5c92bf5c829f5c828f5c726f5c724f5c622f5c620f5c51ef5c51cf5c41bf5c419f4
-c317f4c317f4c217f3c217f3c117f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd
-17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416
-eab316eab216e9b116e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e4a915e4
-a815e3a715e3a615e2a515e2a515e1a415e1a315e0a215e0a115dfa014df9f14
-
-f5c92ef5c92cf5c82af5c829f5c727f5c725f5c623f5c621f5c51ff5c51ef5c51cf5c41af5c418f4
-c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd
-17f0bc17efbc17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb616ecb616ebb516ebb416
-eab316eab216e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5a915e4a915e4
-a815e3a715e3a615e2a515e2a415e1a315e1a215e0a215e0a115dfa014de9f14
-
-f5c92df5c92bf5c829f5c827f5c726f5c724f5c622f5c620f5c51ef5c51cf5c41bf5c419f4c317f4
-c317f4c217f3c217f3c117f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd
-17f0bc17efbc17efbb17efbb17eeba16eeb916edb916edb816ecb716ecb616ebb516ebb416eab316
-eab216e9b216e9b116e8b016e8af16e7ae16e7ae16e6ad15e6ac15e5ab15e5aa15e5a915e4a815e4
-a715e3a715e2a615e2a515e1a415e1a315e1a215e0a115e0a115df9f14de9e14
-
-f5c92cf5c82af5c828f5c727f5c724f5c623f5c621f5c51ff5c51df5c51cf5c41af5c418f4c317f4
-c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bd
-17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb616ecb616ebb516ebb416eab316
-eab216e9b116e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3
-a715e3a615e2a515e2a515e1a415e1a315e0a215e0a115dfa014df9f14de9e14
-
-f5c82bf5c829f5c827f5c725f5c724f5c622f5c620f5c51ef5c51cf5c41af5c419f4c317f4c317f4
-c217f3c217f3c117f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc
-17efbc17efbb17efbb17eeba16eeb916edb916edb816ecb716ecb616ecb516ebb416eab416eab316
-eab216e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5a915e4a915e4a815e3
-a715e3a615e2a515e2a415e1a315e1a215e0a215e0a115dfa014de9f14de9e14
-
-f5c82af5c828f5c726f5c724f5c622f5c621f5c51ff5c51df5c41bf5c41af5c418f4c317f4c317f4
-c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bd17f0bc
-17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416eab316eab216
-e9b216e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3
-a715e2a615e2a515e1a415e1a315e1a215e0a115e0a115df9f14de9e14dd9d14
-
-f5c829f5c727f5c725f5c723f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3
-c217f3c117f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc
-17efbb17efbb17eeba16eeba16edb916edb816edb716ecb616ecb516ebb516ebb416eab316eab216
-e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3
-a615e2a515e2a415e1a415e1a315e0a215e0a115dfa014df9f14de9e14dd9d14
-
-f5c827f5c726f5c724f5c622f5c620f5c51ef5c51df5c41bf5c419f5c418f4c317f4c317f4c217f3
-c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc
-17efbb17efbb17eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416eab316eab216e9b216
-e9b116e8b016e8af16e8ae16e7ae16e6ad15e6ac15e6ab15e5aa15e5a915e4a815e4a815e3a715e3
-a615e2a515e2a415e1a315e1a215e0a215e0a115dfa014de9f14de9e14dd9d14
-
-f5c726f5c724f5c623f5c621f5c51ff5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3
-c117f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb
-17efbb17eeba16eeba16edb916edb816edb716ecb616ecb616ebb516ebb416eab316eab216e9b116
-e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ab15e5ab15e5aa15e4a915e4a815e3a715e3a615e2
-a515e2a515e1a415e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14
-
-f5c725f5c723f5c622f5c620f5c51ef5c51cf5c41bf5c419f4c317f4c317f4c217f4c217f3c217f3
-c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbb
-17efbb17eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416eab316eab316e9b216e9b116
-e9b016e8af16e8ae16e7ae16e7ad15e6ac15e6ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2
-a515e2a415e1a415e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dc9c14
-
-f5c724f5c622f5c620f5c51ff5c51df5c41bf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3
-c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb
-17eeba16eeba16edb916edb816edb716ecb616ecb616ebb516ebb416eab316eab216e9b116e9b116
-e8b016e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e4a915e4a815e4a715e3a715e2a615e2
-a515e2a415e1a315e1a215e0a115e0a115dfa014de9f14de9d14dd9c14dc9b14
-
-f5c623f5c621f5c51ff5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c217f3c117f3
-c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbb17efbb
-17eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416eab316eab316e9b216e9b116e9b016
-e8af16e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a515e2
-a415e1a415e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14
-
-f5c622f5c620f5c51ef5c51cf5c41bf5c419f4c317f4c317f4c317f4c217f3c217f3c117f3c117f2
-c017f2c017f2bf17f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba
-16eeba16edb916edb816edb716ecb616ecb616ebb516ebb416eab316eab216e9b116e9b116e8b016
-e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e5a915e4a815e4a715e3a715e3a615e2a515e2
-a415e1a315e1a215e0a215e0a115dfa014de9f14de9e14dd9d14dc9c14dc9b14
-
-f5c620f5c51ff5c51df5c41bf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f3c117f2
-c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17f0bc17efbc17efbb17efbb17eeba
-16eeb916edb816edb716ecb716ecb616ebb516ebb416eab416eab316e9b216e9b116e9b016e8af16
-e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a515e2a515e1
-a415e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14
-
-f5c51ff5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c217f3c117f3c117f2c017f2
-c017f2bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb9
-16edb916edb816edb716ecb616ecb616ebb516ebb416eab316eab216e9b116e9b116e8b016e8af16
-e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e5a915e4a815e4a815e3a715e3a615e2a515e2a415e1
-a315e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14
-
-f5c51ef5c51cf5c41af5c419f4c317f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2
-c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbc17efbb17efbb17eeba16eeb9
-16edb816edb716ecb716ecb616ebb516ebb416eab316eab316e9b216e9b116e9b016e8af16e8af16
-e7ae16e7ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a515e2a515e1a415e1
-a315e1a215e0a115e0a115df9f14de9f14de9d14dd9c14dc9b14dc9a14db9914
-
-f5c51df5c41bf5c419f5c418f4c317f4c317f4c217f3c217f3c117f3c117f3c117f2c017f2c017f2
-bf17f1bf17f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb9
-16edb816ecb716ecb616ecb516ebb516ebb416eab316eab216e9b116e9b116e8b016e8af16e7ae16
-e7ad15e6ad15e6ac15e5ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a515e2a415e1a415e1
-a315e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914
-
-f5c41bf5c41af5c418f4c317f4c317f4c217f3c217f3c217f3c117f3c117f2c017f2c017f2bf17f1
-bf17f1be17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17efbb17eeba16eeb916edb8
-16edb716ecb716ecb616ebb516ebb416eab316eab316e9b216e9b116e9b016e8af16e8af16e7ae16
-e7ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a515e2a515e1a415e1a315e1
-a215e0a115e0a115dfa014de9f14de9e14dd9d14dc9b14dc9b14db9914da9814
-
-f5c41af5c418f4c317f4c317f4c217f4c217f3c217f3c117f3c117f2c017f2c017f2c017f2bf17f1
-bf17f1be17f1be17f0bd17f0bd17f0bc17f0bc17efbc17efbb17efbb17eeba16eeb916edb916edb8
-16ecb716ecb616ecb516ebb416ebb416eab316eab216e9b116e9b116e8b016e8af16e7ae16e7ad15
-e6ac15e6ac15e5ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a515e2a415e1a415e1a315e0
-a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814
-
-f5c419f4c317f4c317f4c317f4c217f3c217f3c117f3c117f3c117f2c017f2c017f2bf17f1bf17f1
-be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeba16edb916edb816edb7
-16ecb616ecb616ebb516ebb416eab316eab216e9b216e9b116e9b016e8af16e8af16e7ae16e7ad15
-e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a615e2a515e1a415e1a315e1a215e0
-a215e0a115dfa014de9f14de9e14dd9d14dc9c14dc9b14db9914da9914da9714
-
-f5c418f4c317f4c317f4c217f3c217f3c117f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1
-be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17efbb17eeba16eeb916edb816edb716ecb7
-16ecb616ebb516ebb416eab416eab316eab216e9b116e9b116e8b016e8af16e7ae16e7ad15e6ac15
-e6ac15e5ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a515e2a415e1a415e1a315e0a215e0
-a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714
-
-f4c317f4c317f4c217f3c217f3c217f3c117f3c117f2c017f2c017f2bf17f2bf17f1bf17f1be17f1
-be17f0bd17f0bd17f0bc17f0bc17efbc17efbb17efbb17eeba16eeb916edb916edb816edb716ecb6
-16ecb616ebb516ebb416eab316eab216e9b216e9b116e8b016e8af16e8ae16e7ae16e7ad15e6ac15
-e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a615e2a515e1a415e1a315e1a215e0a215e0
-a115dfa014de9f14de9e14dd9d14dc9c14dc9b14db9a14da9914da9714d99714
-
-f4c317f4c217f3c217f3c217f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f0
-bd17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeba16eeb916edb816edb716ecb716ecb6
-16ebb516ebb416eab316eab316eab216e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ac15
-e5ab15e5aa15e5a915e4a815e4a815e3a715e3a615e2a515e2a415e1a415e1a315e0a215e0a115df
-a014df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714d99614
-
-f4c217f4c217f3c217f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f1be17f0
-bd17f0bd17f0bc17efbc17efbb17efbb17efbb17eeba16eeb916edb816edb816ecb716ecb616ecb5
-16ebb416ebb416eab316eab216e9b116e9b116e8b016e8af16e7ae16e7ae16e7ad15e6ac15e6ab15
-e5aa15e5aa15e4a915e4a815e3a715e3a615e2a515e2a515e1a415e1a315e1a215e0a215e0a115df
-a014de9f14de9e14dd9d14dc9c14dc9b14db9a14da9914da9814d99714d89514
-
-f4c217f3c217f3c117f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f1be17f0bd17f0
-bd17f0bc17efbc17efbc17efbb17efbb17eeba16eeb916edb916edb816edb716ecb616ecb616ebb5
-16ebb416eab316eab216e9b216e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ac15e5ab15
-e5aa15e4a915e4a815e4a715e3a715e3a615e2a515e2a415e1a415e1a315e0a215e0a115dfa014df
-9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814da9714d99614d89514
-
-f3c217f3c117f3c117f3c117f2c017f2c017f2bf17f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0
-bd17f0bc17efbc17efbb17efbb17eeba16eeba16eeb916edb816edb716ecb716ecb616ebb516ebb4
-16eab416eab316eab216e9b116e9b116e8b016e8af16e7ae16e7ad15e6ad15e6ac15e6ab15e5aa15
-e5a915e4a915e4a815e3a715e3a615e2a515e2a515e1a415e1a315e1a215e0a115e0a115dfa014de
-9f14de9e14dd9d14dc9c14dc9b14db9a14da9914da9814d99714d99614d89514
-
-f3c117f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bd17f0
-bc17efbc17efbb17efbb17efbb17eeba16eeb916edb816edb716ecb716ecb616ecb516ebb516ebb4
-16eab316eab216e9b116e9b116e8b016e8af16e8ae16e7ae16e7ad15e6ac15e6ab15e5aa15e5aa15
-e4a915e4a815e4a715e3a715e3a615e2a515e2a415e1a315e1a315e0a215e0a115dfa014df9f14de
-9e14dd9d14dd9c14dc9b14db9a14db9914da9814da9714d99614d89514d89414
-
-f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bd17f0bc17ef
-bc17efbb17efbb17efbb17eeba16eeb916edb916edb816ecb716ecb616ecb616ebb516ebb416eab3
-16eab216e9b216e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e5a915
-e4a915e4a815e3a715e3a615e2a515e2a515e1a415e1a315e0a215e0a115e0a115dfa014de9f14de
-9e14dd9d14dc9c14dc9b14db9a14da9914da9814d99714d99614d89514d79314
-
-f3c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bc17efbc17ef
-bc17efbb17efbb17eeba16eeb916edb916edb816edb716ecb616ecb616ebb516ebb416eab416eab3
-16eab216e9b116e9b116e8b016e8af16e7ae16e7ae16e6ad15e6ac15e6ab15e5aa15e5aa15e4a915
-e4a815e3a715e3a615e2a615e2a515e2a415e1a315e1a215e0a215e0a115dfa014df9f14de9e14dd
-9d14dd9c14dc9b14db9a14db9914da9814d99714d99614d89514d89414d79314
-
-f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bc17f0bc17efbc17ef
-bb17efbb17eeba16eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416ebb416eab316eab2
-16e9b116e9b116e8b016e8af16e8ae16e7ae16e7ad15e6ac15e6ab15e5ab15e5aa15e4a915e4a815
-e4a815e3a715e3a615e2a515e2a415e1a415e1a315e0a215e0a115e0a115df9f14de9f14de9e14dd
-9d14dc9c14dc9b14db9a14da9914da9814d99714d89514d89514d79314d79313
-
-f2c017f2c017f2bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbb17ef
-bb17efbb17eeba16eeb916edb816edb816ecb716ecb616ecb516ebb516ebb416eab316eab216e9b2
-16e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e5a915e4a915e4a815
-e3a715e3a615e2a515e2a515e1a415e1a315e1a215e0a215e0a115dfa014df9f14de9e14dd9d14dd
-9c14dc9b14db9a14db9914da9814d99714d99614d89514d89414d79314d69213
-
-f2c017f2bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbb17efbb17ef
-bb17eeba16eeb916edb916edb816edb716ecb616ecb616ebb516ebb416eab316eab316eab216e9b1
-16e9b116e8b016e8af16e7ae16e7ae16e6ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715
-e3a715e3a615e2a515e2a415e1a415e1a315e0a215e0a115dfa014df9f14de9e14de9d14dd9c14dc
-9b14dc9b14db9914da9914da9714d99714d89514d89514d79314d79313d69113
-
-f2bf17f1bf17f1bf17f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbb17efbb17efbb17ee
-ba16eeb916edb916edb816edb716ecb616ecb616ebb516ebb416eab416eab316eab216e9b116e9b1
-16e8b016e8af16e8ae16e7ae16e7ad15e6ac15e6ab15e5ab15e5aa15e5a915e4a815e4a815e3a715
-e3a615e2a515e2a515e1a415e1a315e1a215e0a115e0a115dfa014de9f14de9e14dd9d14dd9c14dc
-9b14db9a14db9914da9814d99714d99614d89514d79414d79314d69213d69113
-
-f1bf17f1bf17f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbc17efbb17efbb17eeba16ee
-b916edb916edb816edb716ecb716ecb616ebb516ebb416ebb416eab316eab216e9b216e9b116e9b0
-16e8af16e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e5a915e4a915e4a815e3a715e3a615
-e2a615e2a515e2a415e1a315e1a215e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14dc
-9a14db9914da9814da9714d99614d89514d89414d79314d79213d69113d59013
-
-f1bf17f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbc17efbb17efbb17eeba16eeba16ee
-b916edb816edb716ecb716ecb616ecb516ebb516ebb416eab316eab216e9b216e9b116e9b016e8b0
-16e8af16e7ae16e7ad15e6ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e4a715e3a715e3a615
-e2a515e2a415e1a415e1a315e0a215e0a115e0a115dfa014de9f14de9e14dd9d14dc9c14dc9b14db
-9a14db9914da9814d99714d99614d89514d79414d79313d69213d69113d59013
-
-f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbc17efbb17efbb17eeba16eeba16eeb916ed
-b816edb716ecb716ecb616ecb616ebb516ebb416eab316eab316eab216e9b116e9b116e8b016e8af
-16e7ae16e7ae16e7ad15e6ac15e6ab15e5ab15e5aa15e4a915e4a815e4a815e3a715e3a615e2a515
-e2a515e1a415e1a315e1a215e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14db
-9914da9814da9714d99614d89514d89414d79314d79213d69113d59013d58f13
-
-f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbc17efbb17efbb17eeba16eeba16eeb916edb816ed
-b816ecb716ecb616ecb616ebb516ebb416eab416eab316eab216e9b116e9b116e8b016e8af16e8ae
-16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a615e2a515
-e2a415e1a315e1a315e0a215e0a115dfa014df9f14de9e14de9d14dd9c14dc9b14dc9b14db9914da
-9914da9814d99714d99614d89514d79414d79313d69213d69113d59013d48f13
-
-f0bd17f0bd17f0bd17f0bc17efbc17efbc17efbb17efbb17efbb17eeba16eeb916edb816edb816ed
-b716ecb616ecb616ebb516ebb416eab416eab316eab216e9b116e9b116e8b016e8af16e8af16e7ae
-16e7ad15e6ac15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a715e3a615e2a515e2a415
-e1a415e1a315e0a215e0a115e0a115dfa014de9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da
-9814d99714d99614d89514d89414d79314d69213d69113d59013d58f13d48e13
-
-f0bd17f0bd17f0bc17efbc17efbc17efbb17efbb17efbb17eeba16eeb916edb916edb816edb716ec
-b616ecb616ebb516ebb416ebb416eab316eab216e9b216e9b116e9b016e8af16e8af16e7ae16e7ad
-15e6ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e4a715e3a715e3a615e2a515e2a515e1a415
-e1a315e1a215e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14dc9a14db9914da9814da
-9714d99614d89514d89514d79314d79313d69113d59113d59013d48f13d48e13
-
-f0bd17f0bc17efbc17efbc17efbb17efbb17efbb17eeba16eeb916edb916edb816edb716ecb716ec
-b616ebb516ebb416ebb416eab316eab216e9b216e9b116e9b016e8b016e8af16e7ae16e7ae16e7ad
-15e6ac15e6ab15e5ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a515e2a515e2a415e1a315
-e1a215e0a215e0a115dfa014df9f14de9e14de9d14dd9d14dc9b14dc9b14db9a14db9914da9814d9
-9714d99614d89514d79414d79314d69213d69113d59013d48f13d48e13d38d13
-
-f0bc17efbc17efbc17efbb17efbb17efbb17eeba16eeb916edb916edb816edb716ecb716ecb616eb
-b516ebb516ebb416eab316eab216e9b216e9b116e9b016e8b016e8af16e8ae16e7ae16e7ad15e6ac
-15e6ac15e5ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a615e2a515e2a415e1a415e1a315
-e0a215e0a115e0a115dfa014de9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714d9
-9614d89514d89414d79314d79213d69113d59013d58f13d48e13d38d13d38d13
-
-efbc17efbc17efbb17efbb17efbb17eeba16eeb916edb916edb816edb716ecb716ecb616ecb516eb
-b516ebb416eab316eab216eab216e9b116e9b116e8b016e8af16e8ae16e7ae16e7ad15e6ac15e6ac
-15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a715e3a615e2a515e2a415e1a415e1a315e1a215
-e0a115e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14dc9a14db9914da9814da9714d99714d8
-9514d89514d79414d79313d69213d69113d59013d48f13d48e13d38d13d28c13
-
-efbc17efbb17efbb17efbb17eeba16eeb916edb916edb816edb716ecb716ecb616ecb516ebb516eb
-b416eab316eab316eab216e9b116e9b116e8b016e8af16e8af16e7ae16e7ad15e6ac15e6ac15e6ab
-15e5aa15e5aa15e4a915e4a815e4a715e3a715e3a615e2a515e2a515e1a415e1a315e1a215e0a215
-e0a115dfa014df9f14de9e14de9d14dd9d14dc9b14dc9b14db9a14db9914da9814d99714d99614d8
-9514d79414d79314d69213d69113d59013d58f13d48e13d38d13d38c13d28b13
-
-efbb17efbb17eeba16eeba16eeb916edb916edb816edb716ecb716ecb616ecb516ebb516ebb416ea
-b316eab316eab216e9b116e9b116e8b016e8af16e8af16e7ae16e7ad15e6ad15e6ac15e6ab15e5aa
-15e5aa15e4a915e4a815e4a815e3a715e3a615e2a515e2a515e2a415e1a315e1a315e0a215e0a115
-dfa014df9f14de9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814da9714d99614d89514d8
-9414d79314d79213d69113d59113d58f13d48f13d48e13d38d13d28c13d28b13
-
-Q
-Q
-Q
-Q
-q
-q
-n
-268 203 m
-332 203 l
-332 139 l
-268 139 l
-268 203 l
-h
-W
-q
-q
-[64 0 0 64 268 139]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-e1a315e0a215e0a115dfa014de9f14de9e14dd9d14dc9b14dc9a14db9914da9814d99714d99614d8
-9514d79314d79213d69113d59013d48f13d48e13d38d13d28c13d28b13d18913d08813cf8713cf86
-13ce8512cd8412cd8312cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67912c57811
-c57711c47611c37411c27311c27211c17111c06f11bf6e11bf6d10be6c10bd6a10bc6910bb6810bb
-6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a215e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d99714d99614d8
-9514d79314d69213d69113d59013d48f13d48e13d38d13d28b13d18a13d18913d08813cf8713cf86
-13ce8512cd8412cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c77c12c77a12c67912c57811
-c57711c47611c37411c27311c17211c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bb6810bb
-6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a215e0a115e0a115df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714d89514d8
-9414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d18913d08813cf8713ce86
-13ce8512cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c77a12c67912c57811
-c47711c47511c37411c27311c17211c17011c06f11bf6e11be6c10be6b10bd6a10bc6910bb6710bb
-6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14da9914da9714d99614d89514d8
-9414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d08913d08813cf8713ce85
-13ce8412cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c67a12c67912c57811
-c47611c47511c37411c27311c17111c17011c06f11bf6e11be6c10be6b10bd6a10bc6810bb6710ba
-6610ba6510b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a215e0a115dfa014df9f14de9e14dd9d14dc9c14dc9b14db9914da9814da9714d99614d89514d7
-9414d79313d69213d59113d58f13d48e13d38d13d38c13d28b13d18a13d08913d08713cf8613ce85
-13ce8412cd8312cc8212cb8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12c67912c57711
-c47611c37511c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc6810bb6710ba
-6610ba6410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a215e0a115dfa014de9f14de9e14dd9d14dc9b14dc9a14db9914da9814d99714d99614d89514d7
-9414d79313d69113d59013d58f13d48e13d38d13d28c13d28b13d18a13d08913d08713cf8613ce85
-12cd8412cd8312cc8212cb8112cb8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711
-c47611c37511c37411c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6910bc6810bb6710ba
-6610ba6410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d99714d99614d89514d7
-9314d79213d69113d59013d48f13d48e13d38d13d28c13d28b13d18913d08813cf8713cf8613ce85
-12cd8412cd8312cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711
-c47611c37511c37311c27211c17111c07011bf6e11bf6d10be6c10bd6a10bc6910bc6810bb6710ba
-6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a115e0a115df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714d89514d89414d7
-9314d69213d69113d59013d48f13d48e13d38d13d28b13d18a13d18913d08813cf8713cf8613ce85
-12cd8412cd8312cc8112cb8012ca8012ca7f12c97e12c87d12c77c12c77a12c67912c57811c57711
-c47611c37411c27311c27211c17111c06f11bf6e11bf6d10be6c10bd6a10bc6910bb6810bb6610ba
-6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14da9914da9714d99614d89514d89414d7
-9314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d18913d08813cf8713ce8613ce85
-12cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c77a12c67912c57811c47711
-c47511c37411c27311c17211c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bb6810bb6610ba
-6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a115dfa014df9f14de9e14dd9d14dc9c14dc9b14db9914da9814da9714d99614d89514d79414d7
-9313d69213d59113d58f13d48e13d38d13d38c13d28b13d18a13d08913d08813cf8713ce8513ce84
-12cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c67a12c67912c57811c47611
-c47511c37411c27311c17111c17011c06f11bf6e11be6c10be6b10bd6a10bc6910bb6710bb6610ba
-6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a115dfa014de9f14de9e14dd9d14dc9b14dc9a14db9914da9814d99714d99614d89514d79414d7
-9313d69113d59013d58f13d48e13d38d13d28c13d28b13d18a13d08913d08713cf8613ce8513ce84
-12cd8312cc8212cb8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12c67912c57711c47611
-c37511c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc6810bb6710ba6610ba
-6510b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d99714d99614d89514d79314d7
-9213d69113d59013d48f13d48e13d38d13d28c13d28b13d18913d08813cf8713cf8613ce8512cd84
-12cd8312cc8212cb8112cb8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711c47611
-c37511c37311c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6910bc6810bb6710ba6610ba
-6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a115df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714d89514d89414d79314d6
-9213d69113d59013d48f13d48e13d38d13d28b13d18a13d18913d08813cf8713cf8613ce8512cd84
-12cd8312cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77a12c67912c57811c57711c47611
-c37411c27311c27211c17111c06f11bf6e11bf6d10be6c10bd6a10bc6910bc6810bb6710ba6510b9
-6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dfa014df9f14de9e14dd9d14dc9c14dc9b14db9914da9814da9714d99614d89514d89414d79314d6
-9213d69113d59013d48f13d38d13d38c13d28b13d18a13d18913d08813cf8713ce8613ce8512cd83
-12cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c77b12c77a12c67912c57811c47711c47511
-c37411c27311c17211c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bb6810bb6610ba6510b9
-6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dfa014de9f14de9e14dd9d14dc9b14dc9a14db9914da9814d99714d99614d89514d79414d79313d6
-9113d59013d58f13d48e13d38d13d28c13d28b13d18a13d08913d08713cf8613ce8513ce8412cd83
-12cc8212cb8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12c67912c57811c47611c47511
-c37411c27311c17111c17011c06f11bf6e11be6c10be6b10bd6a10bc6910bb6710bb6610ba6510b9
-6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d99714d99614d89514d79314d79213d6
-9113d59013d48f13d48e13d38d13d28c13d28b13d18913d08813cf8713cf8613ce8512cd8412cd83
-12cc8212cb8112cb8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711c47611c37511
-c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc6810bb6710ba6610ba6510b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714d89514d89414d79314d69213d6
-9113d59013d48f13d48e13d38d13d28b13d18a13d18913d08813cf8713cf8613ce8512cd8412cd83
-12cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711c47611c37511
-c37311c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6910bc6810bb6710ba6610ba6410b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-df9f14de9e14dd9d14dc9c14dc9b14db9914da9814da9714d99614d89514d79414d79314d69213d6
-9113d59013d48f13d38d13d38c13d28b13d18a13d18913d08813cf8713ce8613ce8512cd8312cc82
-12cc8112cb8012ca8012ca7f12c97e12c87d12c77c12c77a12c67912c57811c57711c47611c37411
-c27311c27211c17111c06f11bf6e11bf6d10be6c10bd6a10bc6910bc6810bb6710ba6510b96410b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-de9f14de9e14dd9d14dc9b14dc9a14db9914da9814d99714d99614d89514d79414d79313d69113d5
-9013d58f13d48e13d38d13d28c13d28b13d18a13d08913d08813cf8713ce8513ce8412cd8312cc82
-12cc8112cb8012ca8012c97f12c97e12c87c12c77b12c77a12c67912c57811c47711c47511c37411
-c27311c17211c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bb6810bb6610ba6510b96410b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714d99614d89514d79314d79213d69113d5
-9013d48f13d48e13d38d13d28c13d28b13d18913d08813cf8713cf8613ce8512cd8412cd8312cc82
-12cb8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12c67912c57811c47611c47511c37411
-c27311c17111c17011c06f11bf6e11be6c10be6b10bd6a10bc6910bb6710bb6610ba6510b96410b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-de9e14dd9d14dd9c14dc9b14db9a14da9914da9714d99614d89514d89414d79314d69213d69113d5
-9013d48f13d48e13d38d13d28b13d18a13d18913d08813cf8713cf8613ce8512cd8412cd8312cc81
-12cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711c47611c37511c37411
-c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc6810bb6710ba6610ba6510b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-de9e14dd9d14dc9b14dc9a14db9914da9814da9714d99614d89514d79414d79313d69213d59113d5
-8f13d48e13d38d13d38c13d28b13d18a13d18913d08813cf8713ce8613ce8512cd8312cc8212cc81
-12cb8012ca8012ca7f12c97e12c87d12c77c12c77a12c67912c57811c57711c47611c37411c27311
-c27211c17111c06f11bf6e11bf6d10be6c10bd6b10bd6910bc6810bb6710ba6610ba6410b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dd9d14dd9c14dc9b14db9a14db9914da9814d99714d99614d89514d79314d79213d69113d59013d5
-8f13d48e13d38d13d28c13d28b13d18a13d08913d08713cf8613ce8513ce8412cd8312cc8212cc81
-12cb8012ca8012c97f12c97e12c87c12c77b12c77a12c67912c57811c47711c47511c37411c27311
-c17211c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bb6810bb6610ba6510b96410b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dd9d14dd9c14dc9b14db9a14da9914da9714d99714d89514d89414d79314d69213d69113d59013d4
-8f13d48e13d38d13d28c13d28b13d18913d08813cf8713cf8613ce8512cd8412cd8312cc8212cb81
-12cb8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57811c47611c47511c37411c27311
-c17111c17011c06f11bf6e11be6c10be6b10bd6a10bc6910bb6710bb6610ba6510b96410b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dd9d14dc9b14dc9a14db9914da9814da9714d99614d89514d79414d79313d69213d69113d59013d4
-8f13d38d13d38c13d28b13d18a13d18913d08813cf8713ce8613ce8512cd8412cd8312cc8112cb80
-12ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711c47611c37511c37411c27211
-c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc6810bb6710ba6610ba6510b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dd9c14dc9b14db9a14db9914da9814d99714d99614d89514d79414d79313d69113d59013d58f13d4
-8e13d38d13d28c13d28b13d18a13d08913d08813cf8713ce8513ce8412cd8312cc8212cc8112cb80
-12ca8012ca7f12c97e12c87d12c77c12c77a12c67912c57811c57711c47611c37411c27311c27211
-c17111c06f11bf6e11bf6d10be6c10bd6b10bd6910bc6810bb6710ba6610ba6410b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dd9c14dc9b14db9a14da9914da9714d99714d89514d89414d79314d69213d69113d59013d48f13d4
-8e13d38d13d28c13d28b13d18913d08813cf8713cf8613ce8513ce8412cd8312cc8212cb8112cb80
-12ca8012c97e12c97d12c87c12c77b12c67a12c67912c57811c47711c47511c37411c27311c17211
-c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bb6810bb6610ba6510b96410b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dc9b14dc9a14db9914da9814da9714d99614d89514d79414d79313d69213d69113d59013d48f13d3
-8d13d38c13d28b13d18a13d18913d08813cf8713cf8613ce8512cd8412cd8312cc8112cb8012cb80
-12ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711c47611c37511c37411c27211c17111
-c17011c06f11bf6e11be6c10be6b10bd6a10bc6910bb6710bb6610ba6510b96410b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dc9b14db9a14db9914da9814d99714d99614d89514d79414d79313d69113d59013d58f13d48e13d3
-8d13d38c13d28b13d18a13d08913d08813cf8713ce8513ce8412cd8312cc8212cc8112cb8012ca80
-12ca7f12c97e12c87d12c77c12c77a12c67a12c67912c57711c47611c37511c37311c27211c17111
-c07011c06e11bf6d10be6c10bd6b10bd6a10bc6810bb6710ba6610ba6510b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dc9b14db9a14da9914da9714d99614d89514d89414d79314d69213d69113d59013d48f13d48e13d3
-8d13d28c13d28b13d18913d08813d08713cf8613ce8513ce8412cd8312cc8212cb8112cb8012ca80
-12c97f12c97e12c87c12c77b12c77a12c67912c57811c47711c47511c37411c27311c27211c17111
-c06f11bf6e11bf6d10be6c10bd6a10bc6910bc6810bb6710ba6510b96410b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dc9a14db9914da9814d99714d99614d89514d79414d79313d69213d69113d59013d48f13d38d13d3
-8c13d28b13d18a13d18913d08813cf8713cf8613ce8512cd8412cd8312cc8212cb8112cb8012ca7f
-12c97e12c87d12c87c12c77b12c67a12c67912c57811c47611c47511c37411c27311c17111c17011
-c06f11bf6e11be6d10be6b10bd6a10bc6910bb6810bb6610ba6510b96410b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-db9a14db9914da9814d99714d99614d89514d79314d79213d69113d59013d58f13d48e13d38d13d2
-8c13d28b13d18a13d08913d08813cf8713ce8513ce8512cd8312cc8212cc8112cb8012ca8012ca7f
-12c97e12c87d12c87c12c77b12c67a12c67912c57711c47611c37511c37411c27211c17111c07011
-c06f11bf6d10be6c10bd6b10bd6a10bc6810bb6710ba6610ba6510b96410b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-db9914da9814da9714d99614d89514d89414d79314d69213d69113d59013d48f13d48e13d38d13d2
-8c13d28b13d18913d08813cf8713cf8613ce8513ce8412cd8312cc8212cb8112cb8012ca8012c97f
-12c97e12c87c12c77b12c77a12c67912c57811c57711c47611c37411c27311c27211c17111c06f11
-bf6e11bf6d10be6c10bd6b10bd6910bc6810bb6710ba6610ba6410b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-db9914da9814d99714d99614d89514d79414d79313d69213d59113d58f13d48e13d38d13d38c13d2
-8b13d18a13d18913d08813cf8713cf8613ce8512cd8412cd8312cc8212cb8112cb8012ca7f12c97e
-12c87d12c87c12c77b12c67a12c67912c57811c47611c47511c37411c27311c17211c17011c06f11
-bf6e11be6d10be6b10bd6a10bc6910bb6810bb6610ba6510b96410b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-da9914da9814d99714d89514d89414d79314d79213d69113d59013d48f13d48e13d38d13d28c13d2
-8b13d18a13d08913d08813cf8713ce8513ce8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e
-12c87d12c87c12c77b12c67a12c67912c57711c47611c37511c37411c27211c17111c07011c06f11
-bf6d10be6c10be6b10bd6a10bc6910bb6710bb6610ba6510b96410b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-da9814da9714d99614d89514d79414d79314d69213d69113d59013d48f13d48e13d38d13d28b13d1
-8a13d18913d08813cf8713cf8613ce8512ce8412cd8312cc8212cb8112cb8012ca8012c97f12c97e
-12c87c12c77b12c77a12c67912c57811c57711c47611c37411c27311c27211c17111c07011c06e11
-bf6d10be6c10bd6b10bd6910bc6810bb6710ba6610ba6510b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-da9814d99714d99614d89514d79314d79313d69113d59013d58f13d48e13d38d13d38c13d28b13d1
-8a13d18913d08813cf8713ce8613ce8512cd8412cd8312cc8112cb8012cb8012ca7f12c97e12c87d
-12c87c12c77b12c67a12c67912c57811c47611c47511c37411c27311c17211c17011c06f11bf6e11
-be6d10be6b10bd6a10bc6910bc6810bb6710ba6510b96410b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-da9714d99614d89514d89414d79314d69213d69113d59013d48f13d48e13d38d13d28c13d28b13d1
-8a13d08913d08713cf8613ce8513ce8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d
-12c87c12c77b12c67a12c67912c57711c47611c37511c37411c27211c17111c07011c06f11bf6d10
-be6c10be6b10bd6a10bc6910bb6710bb6610ba6510b96410b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d99714d99614d89514d79414d79313d69213d59113d58f13d48f13d38d13d38c13d28b13d18a13d1
-8913d08813cf8713cf8613ce8512cd8412cd8312cc8212cb8112cb8012ca8012c97e12c97d12c87c
-12c77b12c77a12c67912c57811c57711c47611c37411c27311c27211c17111c07011c06e11bf6d10
-be6c10bd6b10bd6910bc6810bb6710ba6610ba6510b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d99614d89514d89414d79314d79213d69113d59013d48f13d48e13d38d13d28c13d28b13d18a13d0
-8913d08813cf8713ce8613ce8512cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c87c
-12c77b12c67a12c67912c57811c47611c47511c37411c27311c17111c17011c06f11bf6e11be6d10
-be6b10bd6a10bc6910bc6810bb6710ba6510b96410b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d99614d89514d79414d79313d69213d69113d59013d48f13d48e13d38d13d28b13d18a13d18913d0
-8813cf8713cf8613ce8513ce8412cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87d12c77c
-12c77a12c67912c67912c57711c47611c37511c37311c27211c17111c07011c06f11bf6d10be6c10
-be6b10bd6a10bc6910bb6710bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d89514d89414d79314d79213d69113d59013d58f13d48e13d38d13d38c13d28b13d18a13d18913d0
-8813cf8713cf8613ce8512cd8412cd8312cc8212cb8112cb8012ca7f12c97e12c97d12c87c12c77b
-12c67a12c67912c57811c47711c47511c37411c27311c27211c17111c06f11bf6e11bf6d10be6c10
-bd6b10bd6910bc6810bb6710ba6610ba6510b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d89514d79414d79314d69213d69113d59013d48f13d48e13d38d13d28c13d28b13d18a13d08913d0
-8713cf8613ce8513ce8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b
-12c67a12c67912c57711c47611c37511c37411c27311c17111c17011c06f11bf6e11be6d10be6b10
-bd6a10bc6910bc6810bb6710ba6510b96410b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d89514d79314d79313d69113d59013d58f13d48e13d38d13d38c13d28b13d18a13d18913d08813cf
-8713cf8613ce8512cd8412cd8312cc8212cb8112cb8012ca8012c97f12c97e12c87c12c77b12c77a
-12c67912c57811c57711c47611c37511c37311c27211c17111c07011c06f11bf6d10be6c10bd6b10
-bd6a10bc6910bb6710bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d89414d79314d69213d69113d59013d48f13d48e13d38d13d28c13d28b13d18a13d08913d08813cf
-8713ce8513ce8512cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a
-12c67912c57811c47611c47511c37411c27311c17211c17011c06f11bf6e11bf6d10be6c10bd6a10
-bd6910bc6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d79314d79313d69113d59113d58f13d48e13d38d13d38c13d28b13d18a13d18913d08813cf8713cf
-8613ce8512ce8412cd8312cc8212cb8112cb8012ca8012c97f12c97e12c87d12c77c12c77a12c67a
-12c67912c57711c47611c37511c37411c27211c17111c17011c06f11bf6e11be6c10be6b10bd6a10
-bc6910bb6810bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d79314d69213d69113d59013d48f13d48e13d38d13d28c13d28b13d18a13d08913d08813cf8713ce
-8613ce8512cd8412cd8312cc8112cb8012cb8012ca7f12c97e12c97d12c87c12c77b12c67a12c679
-12c57811c47711c47511c37411c27311c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6a10
-bc6810bb6710ba6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d79313d69113d59113d58f13d48f13d38d13d38c13d28b13d18a13d18913d08813cf8713cf8613ce
-8513ce8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c679
-12c57711c47611c47511c37411c27311c17111c17011c06f11bf6e11be6d10be6c10bd6a10bc6910
-bc6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d69213d69113d59013d48f13d48e13d38d13d28c13d28b13d18a13d08913d08813cf8713ce8613ce
-8512cd8412cd8312cc8212cb8112cb8012ca8012c97e12c97d12c87c12c77b12c77a12c67912c578
-11c57711c47611c37511c37311c27211c17111c07011c06f11bf6d10be6c10be6b10bd6a10bc6910
-bb6710bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d69113d59113d58f13d48f13d38d13d38c13d28b13d18a13d18913d08813cf8713cf8613ce8513ce
-8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c578
-11c47611c47511c37411c27311c17211c17011c06f11bf6e11bf6d10be6c10bd6b10bd6910bc6810
-bb6710ba6610ba6510b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d69113d59013d48f13d48e13d38d13d28c13d28b13d18a13d08913d08813cf8713cf8613ce8512cd
-8412cd8312cc8212cb8112cb8012ca8012c97e12c97e12c87c12c77b12c77a12c67912c57811c577
-11c47611c37511c37411c27211c17111c07011c06f11bf6e11be6c10be6b10bd6a10bc6910bb6810
-bb6710ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d59113d58f13d48e13d38d13d38c13d28b13d18a13d18913d08813cf8713cf8613ce8513ce8412cd
-8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57811c477
-11c47511c37411c27311c27211c17111c06f11c06e11bf6d10be6c10bd6b10bd6a10bc6810bb6710
-bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d59013d48f13d48e13d38d13d28c13d28b13d18a13d08913d08813cf8713cf8613ce8512cd8412cd
-8312cc8212cb8112cb8012ca8012c97f12c97e12c87c12c77c12c77a12c67912c67912c57711c476
-11c37511c37411c27211c17111c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bc6810bb6710
-ba6610ba6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d58f13d48e13d38d13d38c13d28b13d18a13d18913d08813cf8713cf8613ce8513ce8412cd8312cc
-8212cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57811c47711c475
-11c37411c27311c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6a10bc6910bb6710bb6610
-ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d48f13d48e13d38d13d28c13d28b13d18a13d08913d08813cf8713cf8613ce8512cd8412cd8312cc
-8212cb8112cb8012ca8012c97f12c97e12c87d12c77c12c77a12c67a12c67912c57711c47611c375
-11c37411c27311c17111c17011c06f11bf6e11bf6d10be6c10bd6a10bc6910bc6810bb6710ba6610
-ba6510b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d48e13d38d13d38c13d28b13d18a13d18913d08813cf8713cf8613ce8513ce8412cd8312cc8212cc
-8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57811c47711c47611c374
-11c27311c27211c17111c07011c06f11bf6d10be6c10be6b10bd6a10bc6910bb6810bb6610ba6510
-b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d48e13d38d13d28c13d28b13d18a13d08913d08813cf8713ce8613ce8512cd8412cd8312cc8212cb
-8112cb8012ca8012c97f12c97e12c87d12c77c12c77b12c67a12c67912c57711c47611c37511c374
-11c27311c17211c17011c06f11bf6e11bf6d10be6c10bd6b10bd6910bc6810bb6710ba6610ba6510
-b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d38d13d38c13d28b13d18a13d18913d08813cf8713cf8613ce8513ce8412cd8312cc8212cc8112cb
-8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57811c47711c47611c37411c373
-11c27211c17111c07011c06f11bf6d10be6c10be6b10bd6a10bc6910bb6810bb6710ba6510b96410
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d38d13d28c13d28b13d18a13d08913d08813cf8713ce8613ce8512cd8412cd8312cc8212cb8112cb
-8012ca8012c97f12c97e12c87d12c77c12c77b12c67a12c67912c57711c47611c47511c37411c273
-11c17211c17011c06f11bf6e11bf6d10be6c10bd6b10bd6910bc6810bb6710ba6610ba6510b96410
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d38c13d28b13d18a13d18913d08813cf8713cf8613ce8513ce8412cd8312cc8212cc8112cb8012ca
-8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57811c57711c47611c37411c37311c272
-11c17111c07011c06f11bf6e11be6c10be6b10bd6a10bc6910bc6810bb6710ba6510ba6410b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d28b13d28b13d18913d08913d08713cf8713ce8513ce8512cd8412cd8312cc8212cb8112cb8012ca
-8012c97f12c97e12c87c12c77c12c77a12c67a12c67912c57711c47611c47511c37411c27311c172
-11c17011c06f11bf6e11bf6d10be6c10bd6b10bd6a10bc6810bb6710bb6610ba6510b96410b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d28b13d18a13d18913d08813cf8713cf8613ce8512cd8412cd8312cc8212cc8112cb8012ca8012ca
-7f12c97e12c87d12c87c12c77b12c67a12c67912c57811c47711c47611c37411c37311c27211c171
-11c07011c06f11bf6e11be6c10be6b10bd6a10bc6910bc6810bb6710ba6610ba6410b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d18a13d18913d08813d08713cf8613ce8513ce8412cd8312cc8212cc8112cb8112cb8012ca8012c9
-7e12c97e12c87c12c77c12c77a12c67a12c67912c57711c47611c47511c37411c27311c17211c170
-11c06f11bf6e11bf6d10be6c10bd6b10bd6a10bc6810bb6710bb6610ba6510b96410b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d18a13d08913d08813cf8713cf8613ce8512cd8412cd8312cc8212cb8112cb8012ca8012ca7f12c9
-7e12c87d12c87c12c77b12c67a12c67912c57811c47711c47611c37411c37311c27211c17111c070
-11c06f11bf6e11be6c10be6b10bd6a10bc6910bc6810bb6710ba6610ba6410b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-Q
-Q
-Q
-Q
-q
-q
-n
-12 267 m
-76 267 l
-76 203 l
-12 203 l
-12 267 l
-h
-W
-q
-q
-[64 0 0 64 12 203]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2
-c017f2c017f3c117f3c117f3c217f3c217f4c217f4c317f4c317f5c419f5c41bf5c51df5c51ff5c6
-21f5c622f5c724f5c727f5c828f5c82af5c92cf5c92ef5ca30f5ca31f5cb34f5cb35f5cc37f5cc39
-f5cd3bf5cd3df5ce3ef5ce40f5ce42f5cf44f5cf46f5d047f5d049f5d14bf6d14df6d24ff6d250f6
-d352f6d354f6d356f6d457f6d459f6d55bf6d55cf6d65ef6d660f6d761f6d763
-
-edb916eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2
-c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c6
-22f5c724f5c725f5c827f5c829f5c92bf5c92df5c92ff5ca31f5ca33f5cb34f5cb36f5cc38f5cc3a
-f5cd3cf5cd3ef5ce3ff5ce41f5cf43f5cf45f5d047f5d049f5d14af6d14cf6d14ef6d250f6d252f6
-d353f6d355f6d457f6d458f6d55af6d55cf6d55df6d65ff6d661f6d763f6d764
-
-edb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f2bf17f2bf17f2
-c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c419f5c41bf5c51df5c51ff5c620f5c6
-22f5c724f5c726f5c828f5c82af5c92cf5c92ef5ca30f5ca31f5cb34f5cb36f5cc37f5cc39f5cd3b
-f5cd3df5ce3ef5ce41f5ce42f5cf44f5cf46f5d048f5d049f5d14bf6d14df6d24ff6d251f6d352f6
-d354f6d456f6d458f6d55af6d55bf6d55df6d65ff6d661f6d762f6d764f6d865
-
-eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2
-c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c621f5c7
-23f5c725f5c727f5c829f5c92bf5c92df5c92ff5ca31f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3c
-f5cd3ef5ce40f5ce41f5cf43f5cf45f5d047f5d049f5d14bf6d14cf6d24ef6d250f6d352f6d354f6
-d355f6d457f6d459f6d55bf6d55df6d65ef6d660f6d762f6d763f6d765f6d867
-
-eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2
-c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c7
-24f5c726f5c828f5c82af5c92cf5c92ef5ca2ff5ca31f5cb34f5cb35f5cc37f5cc39f5cd3bf5cd3d
-f5ce3ef5ce41f5cf43f5cf44f5d046f5d048f5d04af5d14bf6d14ef6d24ff6d251f6d353f6d355f6
-d456f6d458f6d55af6d55cf6d65ef6d65ff6d661f6d763f6d765f6d866f6d868
-
-eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f2bf17f2c017f2c017f3
-c117f3c117f3c117f3c217f4c217f4c317f4c317f5c419f5c41bf5c51df5c51ff5c621f5c623f5c7
-25f5c727f5c829f5c82bf5c92df5c92ff5ca30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3e
-f5ce40f5ce41f5cf43f5cf45f5d047f5d049f5d14bf6d14df6d24ef6d250f6d352f6d354f6d356f6
-d458f6d459f6d55bf6d55df6d65ff6d661f6d762f6d764f6d866f6d868f6d869
-
-eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3
-c117f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c7
-26f5c828f5c829f5c92bf5c92df5ca2ff5ca31f5cb33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3e
-f5ce41f5cf43f5cf44f5d046f5d048f5d04af5d14cf6d14ef6d250f6d251f6d353f6d355f6d457f6
-d458f6d55bf6d55cf6d65ef6d660f6d761f6d763f6d765f6d867f6d869f6d96a
-
-eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3
-c117f3c117f3c217f4c217f4c317f4c317f5c419f5c41bf5c51df5c51ef5c620f5c622f5c724f5c7
-27f5c828f5c82af5c92cf5c92ef5ca30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce3f
-f5ce41f5cf43f5cf45f5d047f5d049f5d14bf6d14df6d24ef6d250f6d352f6d354f6d456f6d458f6
-d55af6d55bf6d55df6d65ff6d661f6d763f6d764f6d866f6d868f6d96af6d96c
-
-efbb17efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f2bf17f2c017f2c017f3c117f3
-c117f3c117f3c217f4c217f4c317f5c418f5c41af5c41bf5c51df5c51ff5c621f5c723f5c725f5c7
-27f5c829f5c92bf5c92df5ca2ff5ca31f5ca33f5cb35f5cc37f5cc38f5cc3af5cd3cf5ce3ef5ce40
-f5ce42f5cf44f5cf46f5d048f5d04af5d14bf6d14ef6d250f6d251f6d353f6d355f6d457f6d459f6
-d55bf6d55df6d65ef6d660f6d762f6d764f6d865f6d867f6d869f6d96bf6d96c
-
-efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3
-c117f3c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c8
-28f5c82af5c92cf5c92ef5ca2ff5ca31f5cb34f5cb36f5cc38f5cc39f5cd3bf5cd3df5ce3ff5ce41
-f5cf43f5cf45f5d047f5d049f5d14bf6d14df6d24ef6d250f6d352f6d354f6d456f6d458f6d55af6
-d55cf6d55df6d65ff6d661f6d763f6d765f6d867f6d868f6d96af6d96cf6da6e
-
-efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3
-c117f3c217f4c217f4c317f4c317f5c419f5c41bf5c51df5c51ff5c620f5c622f5c724f5c727f5c8
-29f5c82bf5c92df5c92ef5ca30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42
-f5cf44f5cf46f5d048f5d049f5d14bf6d14ef6d24ff6d251f6d353f6d355f6d457f6d459f6d55bf6
-d55df6d65ef6d660f6d762f6d764f6d866f6d868f6d96af6d96bf6d96df6da6f
-
-efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3
-c117f3c217f4c217f4c317f5c418f5c419f5c41bf5c51df5c51ff5c621f5c723f5c725f5c827f5c8
-29f5c92bf5c92df5ca2ff5ca31f5cb33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43
-f5cf45f5d047f5d048f5d14af6d14cf6d24ef6d250f6d352f6d354f6d356f6d458f6d55af6d55bf6
-d55df6d65ff6d661f6d763f6d765f6d867f6d869f6d96af6d96cf6da6ef6da70
-
-efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3
-c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c8
-2af5c92cf5c92ef5ca30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce3ff5ce41f5cf43
-f5cf45f5d047f5d049f5d14bf6d14df6d24ff6d251f6d353f6d355f6d457f6d458f6d55bf6d55df6
-d65ef6d660f6d762f6d764f6d866f6d868f6d96af6d96bf6da6df6da6ff6da71
-
-efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3
-c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c727f5c829f5c8
-2bf5c92df5c92ef5ca30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42f5cf44
-f5d046f5d048f5d04af5d14cf6d14ef6d250f6d252f6d354f6d356f6d458f6d459f6d55bf6d55df6
-d65ff6d661f6d763f6d765f6d867f6d869f6d96af6d96cf6da6ef6da70f6db72
-
-efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3
-c217f4c217f4c317f4c317f5c419f5c41bf5c51df5c51ff5c621f5c623f5c725f5c727f5c829f5c9
-2bf5c92df5ca2ff5ca31f5cb33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45
-f5d047f5d049f5d14bf6d14df6d24ff6d250f6d352f6d354f6d456f6d458f6d55af6d55cf6d65ef6
-d660f6d762f6d764f6d866f6d868f6d96af6d96bf6da6df6da6ff6da71f6db73
-
-efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3
-c217f4c217f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c9
-2cf5c92ef5ca2ff5ca31f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce41f5cf43f5cf45
-f5d047f5d049f5d14bf6d14ef6d24ff6d251f6d353f6d355f6d457f6d459f6d55bf6d55df6d65ff6
-d661f6d763f6d765f6d867f6d868f6d96af6d96cf6da6ef6da70f6db72f6db74
-
-efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f2bf17f2c017f2c017f3c117f3c117f3c217f4
-c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c9
-2cf5c92ef5ca30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42f5cf44f5d046
-f5d048f5d14af5d14cf6d14ef6d250f6d352f6d354f6d456f6d458f6d55af6d55cf6d65ef6d660f6
-d761f6d763f6d865f6d868f6d869f6d96bf6da6df6da6ff6da71f6db73f6db75
-
-efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4
-c217f4c317f4c317f5c419f5c41bf5c51df5c51ff5c621f5c622f5c724f5c727f5c829f5c82bf5c9
-2df5c92ff5ca31f5ca33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d047
-f5d049f5d14bf6d14df6d24ff6d251f6d353f6d354f6d456f6d458f6d55bf6d55df6d65ff6d660f6
-d762f6d764f6d866f6d868f6d96af6d96cf6da6ef6da70f6db72f6db74f6dc76
-
-efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4
-c217f4c317f4c317f5c419f5c41bf5c51df5c51ff5c621f5c723f5c725f5c827f5c829f5c92bf5c9
-2df5ca2ff5ca31f5cb33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d047
-f5d049f5d14bf6d14ef6d24ff6d251f6d353f6d355f6d457f6d459f6d55bf6d55df6d65ff6d661f6
-d763f6d765f6d867f6d869f6d96bf6d96df6da6ff6da70f6db72f6db75f6dc77
-
-efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4
-c217f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c92cf5c9
-2ef5ca30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42f5cf44f5cf46f5d048
-f5d04af5d14cf6d14ef6d250f6d352f6d354f6d456f6d458f6d55af6d55cf6d65ef6d660f6d762f6
-d764f6d866f6d868f6d96af6d96cf6da6ef6da70f6db71f6db73f6dc75f6dc77
-
-efbc17f0bc17f0bd17f0bd17f1be17f1be17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4
-c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c92cf5c9
-2ef5ca30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5ce3ef5ce41f5cf43f5cf45f5d047f5d049
-f5d14bf6d14df6d24ef6d250f6d352f6d354f6d456f6d458f6d55bf6d55df6d65ff6d661f6d763f6
-d764f6d866f6d868f6d96af6d96cf6da6ef6da70f6db72f6db74f6dc76f6dc78
-
-efbc17f0bc17f0bd17f0bd17f1be17f1be17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4
-c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c727f5c829f5c82bf5c92df5c9
-2ff5ca31f5ca33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d047f5d049
-f5d14bf6d14df6d24ff6d251f6d353f6d355f6d457f6d459f6d55bf6d55df6d65ff6d661f6d763f6
-d765f6d867f6d869f6d96bf6d96df6da6ff6da71f6db73f6dc75f6dc77f6dc79
-
-f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4
-c317f4c317f5c419f5c41bf5c51df5c51ff5c621f5c623f5c725f5c727f5c829f5c92bf5c92df5ca
-2ff5ca31f5cb33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d047f5d049
-f5d14bf6d14ef6d250f6d252f6d354f6d356f6d458f6d55af6d55cf6d65ef6d660f6d762f6d764f6
-d865f6d868f6d96af6d96cf6da6ef6da70f6db72f6db74f6dc76f6dc77f6dd79
-
-f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4
-c317f4c317f5c419f5c41bf5c51df5c51ff5c621f5c723f5c725f5c827f5c829f5c92bf5c92df5ca
-2ff5ca31f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42f5cf44f5cf46f5d048f5d04a
-f5d14cf6d14ef6d250f6d352f6d354f6d456f6d458f6d55af6d55cf6d65ef6d660f6d762f6d764f6
-d866f6d868f6d96af6d96cf6da6ef6da70f6db72f6db74f6dc76f6dc78f6dd7a
-
-f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4
-c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c92cf5c92ef5ca
-30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42f5cf44f5d046f5d048f5d14a
-f6d14df6d24ff6d251f6d353f6d355f6d456f6d458f6d55bf6d55df6d65ff6d661f6d763f6d765f6
-d867f6d869f6d96bf6d96df6da6ff6da71f6db73f6dc75f6dc77f6dd79f6dd7b
-
-f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4
-c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c92cf5c92ef5ca
-30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5ce3ef5ce41f5cf43f5cf45f5d047f5d049f5d14b
-f6d14df6d24ff6d251f6d353f6d355f6d457f6d459f6d55bf6d55df6d65ff6d761f6d763f6d865f6
-d868f6d96af6d96bf6da6df6da6ff6db71f6db73f6dc75f6dc77f6dd79f6dd7b
-
-f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f3c117f3c117f3c217f4c217f4c317f4
-c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c727f5c829f5c82bf5c92df5c92ff5ca
-31f5ca33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d047f5d049f5d14b
-f6d14ef6d250f6d252f6d354f6d356f6d458f6d55af6d55cf6d65ef6d660f6d762f6d764f6d866f6
-d868f6d96af6d96cf6da6ef6da70f6db72f6db74f6dc76f6dc78f6dd7af6dd7c
-
-f0bc17f0bd17f0bd17f1be17f1be17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4
-c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c727f5c829f5c82bf5c92df5ca2ff5ca
-31f5cb33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d047f5d049f5d14b
-f6d14ef6d250f6d352f6d354f6d456f6d458f6d55af6d55cf6d65ef6d660f6d762f6d764f6d866f6
-d868f6d96af6d96cf6da6ef6da70f6db72f6db75f6dc77f6dc79f6dd7bf6de7d
-
-f0bc17f0bd17f0bd17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4
-c317f5c418f5c41bf5c51df5c51ff5c621f5c623f5c725f5c727f5c829f5c92bf5c92df5ca2ff5ca
-31f5cb33f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42f5cf44f5cf46f5d048f5d04af5d14c
-f6d14ef6d250f6d352f6d354f6d456f6d458f6d55bf6d55df6d65ff6d661f6d763f6d765f6d867f6
-d869f6d96bf6d96df6da6ff6da71f6db73f6dc75f6dc77f6dd79f6dd7bf6de7d
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4
-c317f5c419f5c41bf5c51df5c51ff5c621f5c623f5c725f5c827f5c829f5c92bf5c92df5ca2ff5ca
-31f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42f5cf44f5d046f5d048f5d14af6d14c
-f6d24ef6d250f6d352f6d354f6d456f6d458f6d55bf6d55df6d65ff6d661f6d763f6d765f6d867f6
-d869f6d96bf6da6df6da6ff6db71f6db73f6dc75f6dc77f6dd79f6dd7bf6de7d
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4
-c317f5c419f5c41bf5c51df5c51ff5c621f5c723f5c725f5c827f5c829f5c92bf5c92ef5ca30f5ca
-32f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42f5cf45f5d047f5d049f5d14bf6d14d
-f6d24ff6d251f6d353f6d355f6d457f6d459f6d55bf6d55df6d65ff6d761f6d763f6d865f6d868f6
-d96af6d96cf6da6ef6da70f6db72f6db74f6dc76f6dc78f6dd7af6dd7cf6de7e
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4
-c317f5c419f5c41bf5c51df5c51ff5c621f5c724f5c726f5c828f5c82af5c92cf5c92ef5ca30f5ca
-32f5cb34f5cb36f5cc38f5cc3af5cd3cf5ce3ef5ce41f5cf43f5cf45f5d047f5d049f5d14bf6d14d
-f6d24ff6d251f6d353f6d355f6d457f6d459f6d55bf6d55df6d65ff6d761f6d763f6d865f6d868f6
-d96af6d96cf6da6ef6da70f6db72f6db74f6dc76f6dc78f6dd7af6dd7cf6de7e
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4
-c317f5c419f5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c92cf5c92ef5ca30f5ca
-32f5cb34f5cb36f5cc38f5cc3af5cd3cf5ce3ef5ce41f5cf43f5cf45f5d047f5d049f5d14bf6d14d
-f6d24ff6d251f6d353f6d355f6d458f6d55af6d55cf6d65ef6d660f6d762f6d764f6d866f6d868f6
-d96af6d96cf6da6ef6da70f6db72f6db75f6dc77f6dc79f6dd7bf6de7df6de7f
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f5
-c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c92cf5c92ef5ca30f5ca
-32f5cb34f5cb36f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d047f5d049f5d14bf6d14e
-f6d250f6d252f6d354f6d356f6d458f6d55af6d55cf6d65ef6d660f6d762f6d764f6d866f6d868f6
-d96af6d96cf6da6ef6da70f6db72f6db75f6dc77f6dd79f6dd7bf6de7df6de7f
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f5
-c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c92cf5c92ef5ca31f5ca
-33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d047f5d049f5d14bf6d14e
-f6d250f6d252f6d354f6d356f6d458f6d55af6d55cf6d65ef6d660f6d762f6d764f6d866f6d868f6
-d96bf6d96df6da6ff6da71f6db73f6dc75f6dc77f6dd79f6dd7bf6de7df6de7f
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f5
-c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c92df5c92ff5ca31f5ca
-33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d047f5d049f5d14bf6d14e
-f6d250f6d352f6d354f6d456f6d458f6d55af6d55cf6d65ef6d660f6d763f6d765f6d867f6d869f6
-d96bf6d96df6da6ff6da71f6db73f6dc75f6dc77f6dd79f6dd7bf6de7df6de7f
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f5
-c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c829f5c82bf5c92df5c92ff5ca31f5ca
-33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d047f5d04af5d14cf6d14e
-f6d250f6d352f6d354f6d456f6d458f6d55af6d55df6d65ff6d661f6d763f6d765f6d867f6d869f6
-d96bf6da6df6da6ff6db71f6db73f6dc75f6dc77f6dd79f6dd7bf6de7df6de80
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c317f4c317f5
-c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c727f5c829f5c82bf5c92df5c92ff5ca31f5ca
-33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf46f5d048f5d04af5d14cf6d14e
-f6d250f6d352f6d354f6d456f6d458f6d55bf6d55df6d65ff6d661f6d763f6d765f6d867f6d869f6
-d96bf6da6df6da6ff6db71f6db73f6dc75f6dc77f6dd7af6dd7cf6de7ef6de80
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f4c217f4c317f4c317f5
-c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c727f5c829f5c82bf5c92df5c92ff5ca31f5cb
-33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf44f5cf46f5d048f5d04af5d14cf6d14e
-f6d250f6d352f6d354f6d456f6d458f6d55bf6d55df6d65ff6d661f6d763f6d765f6d867f6d869f6
-d96bf6da6df6da6ff6db71f6db73f6dc76f6dc78f6dd7af6dd7cf6de7ef6de80
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c217f4c217f4c317f4c317f5
-c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c727f5c829f5c82bf5c92df5c92ff5ca31f5cb
-33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce42f5cf44f5cf46f5d048f5d04af5d14cf6d14e
-f6d250f6d352f6d354f6d456f6d458f6d55bf6d55df6d65ff6d661f6d763f6d765f6d867f6d869f6
-d96bf6da6df6da6ff6db71f6db74f6dc76f6dc78f6dd7af6dd7cf6de7ef6de80
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c217f4c217f4c317f4c317f5
-c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c727f5c829f5c82bf5c92df5c92ff5ca31f5cb
-33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce42f5cf44f5cf46f5d048f5d04af5d14cf6d14e
-f6d250f6d352f6d354f6d456f6d458f6d55bf6d55df6d65ff6d661f6d763f6d765f6d867f6d869f6
-d96bf6da6df6da6ff6db72f6db74f6dc76f6dc78f6dd7af6dd7cf6de7ef6de80
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c217f4c217f4c317f4c317f5
-c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c727f5c829f5c82bf5c92df5c92ff5ca31f5cb
-33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce42f5cf44f5cf46f5d048f5d04af5d14cf6d14e
-f6d250f6d352f6d354f6d456f6d458f6d55bf6d55df6d65ff6d661f6d763f6d765f6d867f6d869f6
-d96bf6da6df6da6ff6db71f6db74f6dc76f6dc78f6dd7af6dd7cf6de7ef6de80
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c217f4c217f4c317f4c317f5
-c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c727f5c829f5c82bf5c92df5c92ff5ca31f5cb
-33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce42f5cf44f5cf46f5d048f5d04af5d14cf6d14e
-f6d250f6d352f6d354f6d456f6d458f6d55bf6d55df6d65ff6d661f6d763f6d765f6d867f6d869f6
-d96bf6da6df6da6ff6db71f6db73f6dc76f6dc78f6dd7af6dd7cf6de7ef6de80
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f4c217f4c317f4c317f5
-c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c727f5c829f5c82bf5c92df5c92ff5ca31f5ca
-33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf46f5d048f5d04af5d14cf6d14e
-f6d250f6d352f6d354f6d456f6d458f6d55bf6d55df6d65ff6d661f6d763f6d765f6d867f6d869f6
-d96bf6da6df6da6ff6db71f6db73f6dc75f6dc78f6dd7af6dd7cf6de7ef6de80
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f5
-c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c727f5c829f5c82bf5c92df5c92ff5ca31f5ca
-33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d048f5d04af5d14cf6d14e
-f6d250f6d352f6d354f6d456f6d458f6d55bf6d55df6d65ff6d661f6d763f6d765f6d867f6d869f6
-d96bf6da6df6da6ff6db71f6db73f6dc75f6dc77f6dd79f6dd7bf6de7ef6de80
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f5
-c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82bf5c92df5c92ff5ca31f5ca
-33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d047f5d049f5d14bf6d14e
-f6d250f6d352f6d354f6d456f6d458f6d55af6d55cf6d65ef6d661f6d763f6d765f6d867f6d869f6
-d96bf6d96df6da6ff6da71f6db73f6dc75f6dc77f6dd79f6dd7bf6de7df6de7f
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f5
-c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c92cf5c92ff5ca31f5ca
-33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d047f5d049f5d14bf6d14e
-f6d250f6d252f6d354f6d456f6d458f6d55af6d55cf6d65ef6d660f6d762f6d764f6d866f6d869f6
-d96bf6d96df6da6ff6da71f6db73f6dc75f6dc77f6dd79f6dd7bf6de7df6de7f
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f5
-c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c92cf5c92ef5ca30f5ca
-32f5cb34f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d047f5d049f5d14bf6d14e
-f6d250f6d252f6d354f6d356f6d458f6d55af6d55cf6d65ef6d660f6d762f6d764f6d866f6d868f6
-d96af6d96cf6da6ef6da70f6db73f6dc75f6dc77f6dd79f6dd7bf6de7df6de7f
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f5
-c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c92cf5c92ef5ca30f5ca
-32f5cb34f5cb36f5cc38f5cc3af5cd3cf5ce3ff5ce41f5cf43f5cf45f5d047f5d049f5d14bf6d14d
-f6d24ff6d251f6d354f6d356f6d458f6d55af6d55cf6d65ef6d660f6d762f6d764f6d866f6d868f6
-d96af6d96cf6da6ef6da70f6db72f6db75f6dc77f6dc79f6dd7bf6de7df6de7f
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4
-c317f5c419f5c41bf5c51df5c620f5c622f5c724f5c726f5c828f5c82af5c92cf5c92ef5ca30f5ca
-32f5cb34f5cb36f5cc38f5cc3af5cd3cf5ce3ef5ce41f5cf43f5cf45f5d047f5d049f5d14bf6d14d
-f6d24ff6d251f6d353f6d355f6d457f6d459f6d55bf6d55df6d65ff6d762f6d764f6d866f6d868f6
-d96af6d96cf6da6ef6da70f6db72f6db74f6dc76f6dc78f6dd7af6dd7cf6de7e
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4
-c317f5c419f5c41bf5c51df5c51ff5c621f5c723f5c725f5c827f5c82af5c92cf5c92ef5ca30f5ca
-32f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce41f5cf43f5cf45f5d047f5d049f5d14bf6d14d
-f6d24ff6d251f6d353f6d355f6d457f6d459f6d55bf6d55df6d65ff6d761f6d763f6d865f6d868f6
-d96af6d96cf6da6ef6da70f6db72f6db74f6dc76f6dc78f6dd7af6dd7cf6de7e
-
-f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4
-c317f5c419f5c41bf5c51df5c51ff5c621f5c723f5c725f5c827f5c829f5c92bf5c92df5ca2ff5ca
-31f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42f5cf44f5d046f5d048f5d14af6d14c
-f6d24ef6d251f6d353f6d355f6d457f6d459f6d55bf6d55df6d65ff6d661f6d763f6d765f6d867f6
-d869f6d96bf6da6df6da6ff6db71f6db73f6dc75f6dc77f6dd7af6dd7cf6de7e
-
-f0bc17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4
-c317f5c419f5c41bf5c51df5c51ff5c621f5c623f5c725f5c727f5c829f5c92bf5c92df5ca2ff5ca
-31f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42f5cf44f5cf46f5d048f5d14af6d14c
-f6d24ef6d250f6d352f6d354f6d456f6d458f6d55bf6d55df6d65ff6d661f6d763f6d765f6d867f6
-d869f6d96bf6d96df6da6ff6da71f6db73f6dc75f6dc77f6dd79f6dd7bf6de7d
-
-f0bc17f0bd17f0bd17f1be17f1be17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4
-c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c727f5c829f5c92bf5c92df5ca2ff5ca
-31f5cb33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf44f5cf46f5d048f5d04af5d14c
-f6d14ef6d250f6d352f6d354f6d456f6d458f6d55af6d55cf6d65ef6d660f6d762f6d764f6d866f6
-d868f6d96af6d96cf6da6ef6da70f6db72f6db75f6dc77f6dc79f6dd7bf6de7d
-
-f0bc17f0bd17f0bd17f1be17f1be17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4
-c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c727f5c829f5c82bf5c92df5c92ff5ca
-31f5ca33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d047f5d049f5d14b
-f6d14ef6d250f6d252f6d354f6d356f6d458f6d55af6d55cf6d65ef6d660f6d762f6d764f6d866f6
-d868f6d96af6d96cf6da6ef6da70f6db72f6db74f6dc76f6dc78f6dd7af6dd7c
-
-f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4
-c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c92cf5c92ef5ca
-30f5ca32f5cb34f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d047f5d049f5d14b
-f6d14df6d24ff6d251f6d353f6d355f6d457f6d459f6d55bf6d55df6d65ff6d761f6d763f6d865f6
-d868f6d96af6d96cf6da6ef6da70f6db72f6db74f6dc76f6dc78f6dd7af6dd7c
-
-f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4
-c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c92cf5c92ef5ca
-30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5ce3ef5ce41f5cf43f5cf45f5d047f5d049f5d14b
-f6d14df6d24ff6d251f6d353f6d355f6d457f6d459f6d55bf6d55df6d65ff6d661f6d763f6d765f6
-d867f6d869f6d96bf6da6df6da6ff6da71f6db73f6dc75f6dc77f6dd79f6dd7b
-
-f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4
-c317f4c317f5c419f5c41bf5c51df5c51ff5c621f5c723f5c725f5c827f5c829f5c92bf5c92ef5ca
-30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42f5cf44f5d046f5d048f5d14a
-f6d14cf6d24ef6d250f6d352f6d354f6d456f6d458f6d55bf6d55df6d65ff6d661f6d763f6d764f6
-d866f6d868f6d96af6d96cf6da6ef6da70f6db72f6db75f6dc77f6dc79f6dd7a
-
-f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4
-c317f4c317f5c419f5c41bf5c51df5c51ff5c621f5c623f5c725f5c727f5c829f5c92bf5c92df5ca
-2ff5ca31f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42f5cf44f5cf46f5d048f5d04a
-f5d14cf6d14ef6d250f6d352f6d354f6d356f6d458f6d55af6d55cf6d65ef6d660f6d762f6d764f6
-d866f6d868f6d96af6d96cf6da6ef6da70f6db72f6db74f6dc76f6dc78f6dd7a
-
-f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4
-c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c727f5c829f5c82bf5c92df5c9
-2ff5ca31f5cb33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d047f5d049
-f5d14bf6d14df6d24ff6d251f6d353f6d355f6d457f6d459f6d55bf6d55df6d65ff6d761f6d763f6
-d865f6d867f6d869f6d96bf6da6df6da6ff6db71f6db73f6dc75f6dc77f6dd79
-
-efbc17f0bc17f0bd17f0bd17f1be17f1be17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4
-c317f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c92cf5c9
-2ef5ca30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5ce3ef5ce41f5cf43f5cf45f5d047f5d049
-f5d14bf6d14df6d24ff6d251f6d353f6d355f6d457f6d459f6d55bf6d55df6d65ff6d661f6d763f6
-d765f6d867f6d869f6d96bf6d96cf6da6ef6da70f6db72f6db75f6dc76f6dc78
-
-efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4
-c217f4c317f5c418f5c41af5c51cf5c51ef5c620f5c622f5c724f5c726f5c828f5c82af5c92cf5c9
-2ef5ca30f5ca32f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42f5cf44f5d046f5d048
-f5d14af6d14cf6d24ef6d250f6d352f6d354f6d456f6d458f6d55af6d55cf6d65ef6d660f6d762f6
-d764f6d866f6d868f6d96af6d96cf6da6ef6da70f6db72f6db74f6dc76f6dc77
-
-efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4
-c217f4c317f4c317f5c419f5c41bf5c51df5c51ff5c621f5c723f5c725f5c827f5c829f5c92bf5c9
-2df5ca2ff5ca31f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce42f5cf44f5cf45f5d047
-f5d049f5d14bf6d14ef6d250f6d252f6d354f6d356f6d458f6d459f6d55bf6d55df6d65ff6d761f6
-d763f6d765f6d867f6d869f6d96bf6da6df6da6ff6da71f6db73f6dc75f6dc77
-
-efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4
-c217f4c317f4c317f5c419f5c41bf5c51df5c51ff5c621f5c623f5c725f5c727f5c829f5c92bf5c9
-2df5ca2ff5ca31f5cb33f5cb35f5cc37f5cc39f5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf45f5d047
-f5d049f5d14bf6d14df6d24ff6d251f6d353f6d355f6d457f6d459f6d55bf6d55df6d65ff6d661f6
-d763f6d765f6d866f6d868f6d96af6d96cf6da6ef6da70f6db72f6db74f6dc76
-
-Q
-Q
-Q
-Q
-q
-q
-n
-76 267 m
-140 267 l
-140 203 l
-76 203 l
-76 267 l
-h
-W
-q
-q
-[64 0 0 64 76 203]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-f6d765f6d866f6d868f6d96af6d96bf6d96cf6da6ef6da70f6db71f6db72f6db74f6dc75f6dc77f6
-dc78f6dd7af6dd7bf6de7df6de7ef6de7ff6de80f7df81f7df82f7df83f7e084f7e085f7e087f7e1
-87f7e189f7e189f7e18bf7e28bf7e28cf7e28df7e28ef7e28ff7e390f7e390f7e391f7e392f7e392
-f7e393f7e493f7e494f7e494f7e494f7e494f7e495f7e495f7e495f7e495f7e495f7e495f7e495f7
-e495f7e494f7e494f7e494f7e494f7e493f7e393f7e392f7e392f7e391f7e391
-
-f6d866f6d868f6d869f6d96bf6d96cf6da6ef6da6ff6da71f6db72f6db74f6dc75f6dc77f6dc79f6
-dd7af6dd7bf6de7df6de7ef6de7ff7df80f7df81f7df82f7df83f7e085f7e086f7e087f7e188f7e1
-89f7e18af7e28bf7e28cf7e28ef7e28ef7e38ff7e390f7e391f7e392f7e392f7e393f7e494f7e494
-f7e495f7e495f7e496f7e496f7e496f7e496f7e597f7e597f7e597f7e597f7e597f7e597f7e597f7
-e597f7e496f7e496f7e496f7e496f7e495f7e495f7e494f7e494f7e493f7e392
-
-f6d867f6d869f6d96af6d96cf6da6ef6da6ff6da71f6db72f6db74f6dc75f6dc77f6dc79f6dd7af6
-dd7bf6de7df6de7ef6de7ff7df80f7df81f7df83f7e084f7e085f7e087f7e188f7e189f7e18af7e1
-8bf7e28cf7e28df7e28ef7e38ff7e390f7e391f7e392f7e393f7e494f7e494f7e495f7e496f7e496
-f7e597f7e597f7e598f7e598f7e598f7e598f7e599f7e599f7e599f7e599f7e599f7e599f7e599f7
-e599f7e599f7e598f7e598f7e598f7e597f7e597f7e496f7e496f7e495f7e494
-
-f6d868f6d96af6d96cf6da6df6da6ff6da70f6db72f6db74f6dc75f6dc77f6dc79f6dd7af6dd7bf6
-de7df6de7ef6de80f7df80f7df82f7df83f7e084f7e085f7e087f7e188f7e189f7e18bf7e28cf7e2
-8df7e28ef7e38ff7e390f7e391f7e392f7e393f7e494f7e495f7e495f7e496f7e597f7e598f7e598
-f7e598f7e599f7e59af7e59af7e59bf7e59bf7e69bf7e69bf7e69bf7e69bf7e69bf7e69bf7e69bf7
-e69bf7e69bf7e59bf7e59af7e59af7e599f7e599f7e598f7e598f7e597f7e496
-
-f6d96af6d96bf6d96df6da6ff6da70f6db72f6db74f6dc75f6dc77f6dc78f6dd7af6dd7bf6de7df6
-de7ef6de80f7df80f7df82f7df83f7e085f7e086f7e087f7e189f7e18af7e18bf7e28cf7e28ef7e2
-8ff7e390f7e391f7e392f7e393f7e494f7e495f7e496f7e496f7e597f7e598f7e599f7e59af7e59a
-f7e59bf7e69bf7e69cf7e69cf7e69df7e69df7e69df7e69df7e69df7e69df7e69df7e69df7e69df7
-e69df7e69df7e69df7e69cf7e69cf7e69bf7e69bf7e59bf7e59af7e599f7e598
-
-f6d96bf6d96cf6da6ef6da70f6db72f6db73f6dc75f6dc77f6dc78f6dd7af6dd7bf6de7df6de7ef6
-de80f7df80f7df82f7df83f7e085f7e086f7e187f7e189f7e18af7e28bf7e28df7e28ef7e38ff7e3
-90f7e392f7e393f7e494f7e495f7e496f7e597f7e598f7e598f7e599f7e59af7e69bf7e69bf7e69c
-f7e69df7e69df7e69ef7e69ef7e69ff7e79ff7e79ff7e79ff7e79ff7e79ff7e79ff7e79ff7e79ff7
-e79ff7e79ff7e69ff7e69ef7e69ef7e69df7e69df7e69df7e69cf7e69bf7e59b
-
-f6d96cf6da6ef6da70f6db71f6db73f6db75f6dc76f6dc78f6dd79f6dd7bf6de7df6de7ef6de7ff7
-df80f7df82f7df83f7e085f7e086f7e187f7e189f7e18af7e28cf7e28df7e28ef7e390f7e391f7e3
-92f7e493f7e494f7e496f7e496f7e598f7e598f7e599f7e59bf7e69bf7e69cf7e69df7e69df7e69e
-f7e69ff7e79ff7e7a0f7e7a0f7e7a1f7e7a1f7e7a1f7e7a1f7e7a1f7e7a1f7e7a1f7e7a1f7e7a1f7
-e7a1f7e7a1f7e7a1f7e7a0f7e7a0f7e79ff7e79ff7e69ff7e69ef7e69df7e69d
-
-f6da6df6da6ff6da70f6db72f6db74f6dc76f6dc77f6dd79f6dd7bf6dd7cf6de7ef6de7ff7df80f7
-df82f7df83f7e085f7e086f7e188f7e189f7e18bf7e28cf7e28df7e28ff7e390f7e391f7e392f7e4
-94f7e495f7e496f7e597f7e598f7e599f7e59bf7e69bf7e69cf7e69df7e69ef7e69ff7e79ff7e7a0
-f7e7a1f7e7a1f7e7a2f7e7a2f7e8a3f7e8a3f7e8a3f7e8a3f7e8a3f7e8a3f7e8a3f7e8a3f7e8a3f7
-e8a3f7e8a3f7e8a3f7e7a2f7e7a2f7e7a1f7e7a1f7e7a0f7e7a0f7e79ff7e69e
-
-f6da6ef6da70f6db72f6db74f6dc75f6dc77f6dc79f6dd7af6dd7cf6de7df6de7ff7df80f7df81f7
-df83f7e085f7e086f7e187f7e189f7e18bf7e28cf7e28ef7e28ff7e390f7e392f7e393f7e494f7e4
-96f7e597f7e598f7e599f7e59af7e69bf7e69cf7e69df7e69ef7e79ff7e7a0f7e7a1f7e7a1f7e7a2
-f7e8a3f7e8a3f7e8a4f7e8a4f7e8a5f7e8a5f7e8a5f7e8a5f7e8a5f7e8a6f7e8a6f7e8a5f7e8a5f7
-e8a5f7e8a5f7e8a5f7e8a4f7e8a4f7e8a3f7e8a3f7e7a2f7e7a2f7e7a1f7e7a0
-
-f6da70f6db71f6db73f6db75f6dc77f6dc78f6dd7af6dd7bf6de7df6de7ff7df80f7df81f7df83f7
-e084f7e086f7e187f7e189f7e18bf7e28cf7e28ef7e38ff7e390f7e392f7e493f7e494f7e496f7e5
-97f7e598f7e59af7e69bf7e69cf7e69df7e69ef7e79ff7e7a0f7e7a1f7e7a2f7e8a3f7e8a3f7e8a4
-f7e8a5f7e8a5f7e8a6f7e8a6f7e9a7f7e9a7f7e9a8f7e9a8f7e9a8f7e9a8f7e9a8f7e9a8f7e9a8f7
-e9a8f7e9a7f7e9a7f7e8a6f7e8a6f7e8a5f7e8a5f7e8a4f7e8a4f7e8a3f7e7a2
-
-f6da70f6db72f6db74f6dc76f6dc78f6dd79f6dd7bf6de7df6de7ef6de80f7df81f7df83f7e084f7
-e086f7e187f7e189f7e18af7e28cf7e28ef7e38ff7e390f7e392f7e493f7e495f7e496f7e597f7e5
-99f7e59af7e69bf7e69df7e69ef7e69ff7e7a0f7e7a1f7e7a2f7e8a3f7e8a4f7e8a5f7e8a5f7e8a6
-f7e9a7f7e9a7f7e9a8f7e9a8f7e9a9f7e9a9f7e9aaf7e9aaf7e9aaf7e9aaf7e9aaf7e9aaf7e9aaf7
-e9aaf7e9a9f7e9a9f7e9a9f7e9a8f7e9a8f7e9a7f7e8a6f7e8a5f7e8a5f7e8a4
-
-f6db72f6db73f6dc75f6dc77f6dc79f6dd7bf6dd7cf6de7ef6de7ff7df81f7df82f7e084f7e085f7
-e087f7e189f7e18af7e28cf7e28ef7e28ff7e390f7e392f7e494f7e495f7e496f7e598f7e599f7e5
-9bf7e69cf7e69df7e69ef7e79ff7e7a1f7e7a1f7e8a3f7e8a4f7e8a5f7e8a5f7e8a6f7e9a7f7e9a8
-f7e9a9f7e9a9f7e9aaf7eaaaf7eaabf7eaabf7eaacf7eaacf7eaacf7eaacf7eaacf7eaacf7eaacf7
-eaacf7eaabf7eaabf7eaabf7e9aaf7e9aaf7e9a9f7e9a8f7e9a8f7e9a7f7e8a6
-
-f6db72f6db75f6dc76f6dc78f6dd7af6dd7bf6de7df6de7ff7df80f7df82f7df83f7e085f7e087f7
-e188f7e18af7e28bf7e28df7e28ff7e390f7e392f7e493f7e495f7e496f7e598f7e599f7e59bf7e6
-9cf7e69df7e69ff7e7a0f7e7a1f7e7a2f7e8a3f7e8a4f7e8a5f7e8a6f7e9a8f7e9a8f7e9a9f7e9aa
-f7eaabf7eaabf7eaacf7eaacf7eaadf7eaadf7eaaef7eaaef7eaaef7eaaef7eaaef7eaaef7eaaef7
-eaaef7eaadf7eaadf7eaadf7eaacf7eaacf7eaabf7eaaaf7e9aaf7e9a9f7e9a8
-
-f6db74f6dc75f6dc77f6dd79f6dd7bf6de7df6de7ff6de80f7df81f7df83f7e085f7e086f7e188f7
-e189f7e18bf7e28df7e28ef7e390f7e392f7e493f7e495f7e496f7e598f7e599f7e69bf7e69cf7e6
-9ef7e79ff7e7a0f7e7a1f7e8a3f7e8a4f7e8a5f7e8a6f7e9a7f7e9a8f7e9a9f7eaaaf7eaabf7eaac
-f7eaacf7eaadf7eaaef7ebaef7ebaff7ebaff7ebb0f7ebb0f7ebb0f7ebb0f7ebb0f7ebb0f7ebb0f7
-ebb0f7ebaff7ebaff7ebaff7eaaef7eaaef7eaadf7eaacf7eaacf7eaabf7e9aa
-
-f6db75f6dc77f6dc78f6dd7af6dd7cf6de7ef6de7ff7df81f7df82f7e084f7e086f7e187f7e189f7
-e18bf7e28cf7e28ef7e390f7e392f7e493f7e495f7e496f7e598f7e599f7e69bf7e69cf7e69ef7e7
-9ff7e7a1f7e7a2f7e8a3f7e8a4f7e8a5f7e9a7f7e9a8f7e9a9f7e9aaf7eaabf7eaacf7eaadf7eaae
-f7ebaef7ebaff7ebb0f7ebb0f7ebb1f7ebb1f7ebb2f7ecb2f7ecb2f7ecb2f7ecb2f7ecb2f7ecb2f7
-ebb2f7ebb2f7ebb1f7ebb1f7ebb0f7ebb0f7ebaff7eaaef7eaadf7eaacf7eaac
-
-f6dc76f6dc77f6dd79f6dd7bf6de7df6de7ff7df80f7df81f7df83f7e085f7e087f7e189f7e18af7
-e28cf7e28ef7e390f7e391f7e393f7e494f7e496f7e598f7e599f7e59bf7e69cf7e69ef7e79ff7e7
-a1f7e7a2f7e8a3f7e8a5f7e8a6f7e9a8f7e9a9f7e9aaf7eaabf7eaacf7eaadf7eaaef7ebaff7ebb0
-f7ebb0f7ebb1f7ebb2f7ecb2f7ecb3f7ecb3f7ecb4f8ecb4f8ecb4f8ecb4f8ecb4f8ecb4f8ecb4f7
-ecb4f7ecb4f7ecb3f7ecb3f7ecb2f7ebb2f7ebb1f7ebb0f7ebaff7ebaef7eaae
-
-f6dc77f6dc79f6dd7af6dd7cf6de7ef6de80f7df81f7df83f7e084f7e086f7e188f7e189f7e28bf7
-e28df7e28ff7e391f7e392f7e494f7e496f7e597f7e599f7e59bf7e69cf7e69ef7e79ff7e7a1f7e7
-a2f7e8a3f7e8a5f7e8a6f7e9a8f7e9a9f7eaaaf7eaacf7eaadf7eaaef7ebaff7ebb0f7ebb1f7ebb2
-f7ecb2f7ecb3f7ecb4f8ecb5f8ecb5f8ecb5f8ecb6f8edb6f8edb6f8edb6f8edb7f8edb6f8edb6f8
-ecb6f8ecb6f8ecb5f8ecb5f8ecb4f7ecb4f7ecb3f7ecb2f7ebb1f7ebb0f7ebaf
-
-f6dc77f6dd79f6dd7bf6de7df6de7ff7df80f7df82f7df83f7e085f7e087f7e189f7e18bf7e28cf7
-e28ef7e390f7e392f7e494f7e495f7e597f7e598f7e59af7e69cf7e69df7e79ff7e7a1f7e7a2f7e8
-a3f7e8a5f7e9a7f7e9a8f7e9a9f7eaabf7eaacf7eaadf7ebaef7ebb0f7ebb0f7ebb2f7ecb2f7ecb4
-f8ecb5f8ecb5f8ecb6f8edb7f8edb7f8edb7f8edb8f8edb8f8edb8f8edb9f8edb9f8edb9f8edb8f8
-edb8f8edb8f8edb7f8edb7f8edb6f8ecb5f8ecb5f8ecb4f7ecb3f7ecb2f7ebb1
-
-f6dc78f6dd7af6dd7cf6de7ef6de80f7df81f7df83f7e085f7e086f7e188f7e18af7e28cf7e28ef7
-e390f7e391f7e393f7e495f7e496f7e598f7e59af7e69bf7e69df7e69ff7e7a0f7e7a2f7e8a3f7e8
-a5f7e9a7f7e9a8f7e9aaf7eaabf7eaacf7eaaef7ebaff7ebb0f7ebb1f7ecb2f7ecb3f8ecb5f8ecb5
-f8edb6f8edb7f8edb8f8edb9f8edb9f8edb9f8edbaf8eebaf8eebaf8eebbf8eebbf8eebbf8eebaf8
-eebaf8edbaf8edb9f8edb9f8edb8f8edb7f8edb7f8ecb6f8ecb5f8ecb4f7ecb3
-
-f6dd79f6dd7bf6de7df6de7ff7df80f7df82f7df83f7e085f7e187f7e189f7e18bf7e28df7e28ff7
-e390f7e392f7e494f7e496f7e598f7e599f7e69bf7e69df7e69ef7e7a0f7e7a2f7e8a3f7e8a5f7e8
-a6f7e9a8f7e9aaf7eaabf7eaacf7eaaef7ebaff7ebb0f7ebb2f7ecb3f8ecb4f8ecb5f8edb6f8edb7
-f8edb8f8edb9f8edbaf8eebbf8eebbf8eebbf8eebcf8eebcf8eebdf8eebdf8eebdf8eebdf8eebcf8
-eebcf8eebcf8eebbf8eebbf8eebaf8edb9f8edb9f8edb8f8edb7f8ecb6f8ecb5
-
-f6dd7af6dd7cf6de7ef6de80f7df81f7df83f7e085f7e086f7e188f7e18af7e28cf7e28ef7e390f7
-e392f7e493f7e495f7e597f7e598f7e59bf7e69cf7e69ef7e79ff7e7a1f7e8a3f7e8a5f7e8a6f7e9
-a8f7e9aaf7eaabf7eaacf7eaaef7ebaff7ebb1f7ecb2f7ecb3f8ecb5f8ecb6f8edb7f8edb8f8edb9
-f8eebaf8eebbf8eebcf8eebcf8eebdf8eebdf8efbef8efbef8efbff8efbff8efbff8efbff8efbef8
-efbef8efbef8eebdf8eebdf8eebcf8eebbf8eebbf8edb9f8edb9f8edb7f8edb7
-
-f6dd7bf6de7df6de7ff7df80f7df81f7df83f7e085f7e087f7e189f7e18bf7e28df7e28ff7e390f7
-e392f7e494f7e496f7e598f7e59af7e69bf7e69df7e79ff7e7a1f7e8a3f7e8a4f7e8a6f7e9a8f7e9
-a9f7eaabf7eaacf7eaaef7ebaff7ebb1f7ecb2f7ecb4f8ecb5f8edb6f8edb8f8edb9f8edbaf8eebb
-f8eebcf8eebdf8eebdf8efbef8efbff8efbff8efc0f8efc0f8efc1f8efc1f8efc1f8efc1f8efc1f8
-efc0f8efc0f8efbff8efbff8efbef8eebdf8eebcf8eebbf8eebbf8edb9f8edb8
-
-f6dd7bf6de7df6de7ff7df80f7df82f7e084f7e086f7e188f7e18af7e28cf7e28ef7e390f7e392f7
-e493f7e495f7e597f7e599f7e69bf7e69df7e69ef7e7a0f7e7a2f7e8a3f7e8a5f7e9a7f7e9a9f7ea
-aaf7eaacf7eaaef7ebaff7ebb1f7ecb2f7ecb4f8ecb5f8edb7f8edb8f8edb9f8eebbf8eebcf8eebd
-f8efbef8efbff8efbff8efc0f8efc1f8efc2f8f0c2f8f0c2f8f0c3f8f0c3f8f0c3f8f0c3f8f0c3f8
-f0c2f8f0c2f8efc1f8efc1f8efc0f8efbff8efbef8eebdf8eebcf8eebbf8edba
-
-f6dd7cf6de7ef6de80f7df81f7df83f7e085f7e087f7e189f7e18bf7e28df7e28ff7e390f7e392f7
-e494f7e496f7e598f7e59af7e69cf7e69df7e79ff7e7a1f7e8a3f7e8a5f7e9a7f7e9a8f7e9aaf7ea
-acf7eaadf7ebaff7ebb0f7ecb2f7ecb4f8ecb5f8edb7f8edb8f8edb9f8eebbf8eebcf8eebdf8efbf
-f8efbff8efc1f8efc2f8f0c2f8f0c3f8f0c4f8f0c4f8f0c4f8f0c5f8f0c5f8f0c5f8f0c5f8f0c5f8
-f0c4f8f0c4f8f0c3f8f0c3f8f0c2f8efc1f8efc0f8efbff8efbef8eebdf8eebb
-
-f6de7df6de7ff7df80f7df82f7e084f7e086f7e187f7e189f7e28bf7e28ef7e390f7e391f7e493f7
-e495f7e597f7e599f7e69bf7e69df7e69ff7e7a0f7e7a2f7e8a4f7e8a6f7e9a8f7e9aaf7eaabf7ea
-adf7ebaef7ebb0f7ecb2f7ecb4f8ecb5f8edb7f8edb8f8edbaf8eebbf8eebdf8efbef8efbff8efc0
-f8efc2f8f0c2f8f0c4f8f0c4f8f0c5f8f1c6f8f1c6f8f1c6f8f1c7f8f1c7f8f1c7f8f1c7f8f1c7f8
-f1c6f8f1c6f8f0c5f8f0c5f8f0c4f8f0c3f8f0c2f8efc1f8efbff8efbef8eebd
-
-f6de7df6de7ff7df81f7df83f7e084f7e086f7e188f7e18af7e28cf7e28ef7e390f7e392f7e494f7
-e496f7e598f7e59af7e69cf7e69ef7e79ff7e7a1f7e8a3f7e8a5f7e9a7f7e9a9f7eaaaf7eaacf7ea
-aef7ebb0f7ebb2f7ecb3f8ecb5f8edb7f8edb8f8edbaf8eebbf8eebdf8efbef8efbff8efc1f8f0c2
-f8f0c3f8f0c4f8f0c5f8f1c6f8f1c7f8f1c8f8f1c8f8f1c8f8f1c9f8f1c9f8f1c9f8f1c9f8f1c9f8
-f1c8f8f1c8f8f1c7f8f1c6f8f1c6f8f0c5f8f0c4f8f0c3f8efc2f8efc0f8efbf
-
-f6de7ef6de80f7df81f7df83f7e085f7e087f7e189f7e18bf7e28df7e28ff7e391f7e393f7e495f7
-e597f7e598f7e59bf7e69df7e69ff7e7a0f7e7a2f7e8a4f7e8a6f7e9a8f7e9aaf7eaacf7eaadf7eb
-aff7ebb1f7ecb2f8ecb5f8edb6f8edb8f8edb9f8eebbf8eebdf8efbef8efbff8efc1f8f0c2f8f0c4
-f8f0c5f8f1c6f8f1c7f8f1c8f8f1c9f8f2caf8f2caf8f2caf8f2cbf8f2cbf8f2cbf8f2cbf8f2cbf8
-f2caf8f2caf8f1c9f8f1c8f8f1c8f8f1c6f8f1c6f8f0c4f8f0c3f8efc2f8efc0
-
-f6de7ff7df80f7df82f7e084f7e085f7e187f7e189f7e28bf7e28ef7e390f7e392f7e494f7e496f7
-e597f7e599f7e69bf7e69df7e79ff7e7a1f7e8a3f7e8a5f7e9a7f7e9a9f7eaabf7eaacf7ebaef7eb
-b0f7ecb2f7ecb4f8ecb6f8edb7f8edb9f8eebbf8eebcf8efbef8efbff8efc1f8f0c3f8f0c4f8f0c5
-f8f1c6f8f1c8f8f1c9f8f2caf8f2cbf8f2ccf8f2ccf8f2ccf8f2cdf8f3cdf8f3cdf8f3cdf8f2cdf8
-f2ccf8f2ccf8f2cbf8f2caf8f1c9f8f1c8f8f1c7f8f1c6f8f0c5f8f0c3f8f0c2
-
-f6de7ff7df80f7df82f7e084f7e086f7e188f7e18af7e28cf7e28ef7e390f7e392f7e494f7e496f7
-e598f7e59af7e69cf7e69ef7e7a0f7e7a2f7e8a4f7e8a6f7e9a8f7e9aaf7eaacf7eaaef7ebaff7eb
-b1f7ecb3f8ecb5f8edb7f8edb9f8eebaf8eebcf8eebdf8efbff8efc1f8f0c2f8f0c4f8f1c6f8f1c7
-f8f1c8f8f2caf8f2cbf8f2ccf8f2ccf8f3cef8f3cef8f3cff8f3cff8f3cff8f3cff8f3cff8f3cff8
-f3cff8f3cef8f3cdf8f2ccf8f2cbf8f2caf8f1c9f8f1c8f8f1c6f8f0c5f8f0c3
-
-f6de7ff7df81f7df83f7e085f7e087f7e189f7e18bf7e28df7e28ff7e391f7e393f7e495f7e597f7
-e599f7e69bf7e69df7e69ff7e7a1f7e8a3f7e8a5f7e9a7f7e9a8f7eaaaf7eaacf7ebaef7ebb0f7ec
-b2f8ecb4f8ecb6f8edb8f8edb9f8eebbf8eebdf8efbff8efc1f8f0c2f8f0c4f8f1c6f8f1c7f8f1c8
-f8f2caf8f2cbf8f2ccf8f3cef8f3cff8f3cff8f3d0f8f3d1f8f4d1f8f4d1f8f4d1f8f4d1f8f3d1f8
-f3d1f8f3d0f8f3cff8f3cef8f2cdf8f2ccf8f2caf8f1c9f8f1c8f8f1c6f8f0c5
-
-f6de80f7df81f7df83f7e085f7e087f7e189f7e18bf7e28df7e38ff7e391f7e493f7e495f7e597f7
-e599f7e69bf7e69df7e79ff7e7a1f7e8a3f7e8a5f7e9a7f7e9a9f7eaabf7eaadf7ebaff7ebb1f7ec
-b3f8ecb5f8edb7f8edb9f8eebbf8eebcf8efbef8efc0f8efc2f8f0c4f8f0c5f8f1c7f8f1c8f8f2ca
-f8f2cbf8f2cdf8f3cef8f3cff8f3d1f8f4d1f8f4d2f8f4d3f8f4d3f8f4d3f8f4d3f8f4d3f8f4d3f8
-f4d3f8f4d2f8f3d1f8f3d0f8f3cff8f3cdf8f2ccf8f2caf8f1c9f8f1c8f8f1c6
-
-f6de80f7df81f7df83f7e085f7e187f7e189f7e28bf7e28ef7e390f7e392f7e494f7e496f7e598f7
-e59af7e69cf7e69ef7e7a0f7e7a2f7e8a4f7e8a6f7e9a8f7e9aaf7eaacf7eaaef7ebb0f7ebb2f7ec
-b4f8ecb6f8edb8f8edb9f8eebbf8eebdf8efbff8efc1f8f0c3f8f0c4f8f1c6f8f1c8f8f2caf8f2cb
-f8f2cdf8f3cff8f3d0f8f3d1f8f4d2f8f4d3f8f4d4f8f4d5f8f5d5f8f5d5f8f5d5f8f5d5f8f4d5f8
-f4d5f8f4d4f8f4d3f8f4d2f8f3d1f8f3cff8f3cef8f2ccf8f2caf8f1c9f8f1c7
-
-f7df80f7df82f7e084f7e086f7e188f7e18af7e28cf7e28ef7e390f7e392f7e494f7e496f7e598f7
-e59bf7e69df7e69ff7e7a1f7e8a3f7e8a4f7e8a6f7e9a8f7eaaaf7eaacf7ebaef7ebb0f7ecb2f8ec
-b5f8edb7f8edb8f8eebaf8eebcf8efbef8efc0f8f0c2f8f0c4f8f1c6f8f1c8f8f1c9f8f2cbf8f2cc
-f8f3cef8f3d0f8f4d1f8f4d3f8f4d4f8f4d5f8f5d6f8f5d7f8f5d7f8f5d7f8f5d8f8f5d7f8f5d7f8
-f5d6f8f5d5f8f4d5f8f4d3f8f4d2f8f3d1f8f3cff8f3cdf8f2ccf8f2caf8f1c8
-
-f7df80f7df82f7e084f7e086f7e188f7e18af7e28cf7e28ef7e390f7e392f7e494f7e597f7e599f7
-e69bf7e69df7e79ff7e7a1f7e8a3f7e8a5f7e9a7f7e9a9f7eaabf7eaadf7ebaff7ebb1f7ecb3f8ec
-b5f8edb7f8edb9f8eebbf8eebdf8efbff8efc1f8f0c3f8f0c5f8f1c6f8f1c8f8f2caf8f2ccf8f3ce
-f8f3cff8f4d1f8f4d3f8f4d4f8f5d5f8f5d7f8f5d8f8f5d9f8f6d9f8f6daf8f6daf8f6d9f8f6d9f8
-f5d8f8f5d7f8f5d6f8f4d5f8f4d3f8f4d2f8f3d0f8f3cff8f2cdf8f2cbf8f1c9
-
-f7df81f7df83f7e085f7e087f7e189f7e18bf7e28df7e28ff7e391f7e393f7e495f7e597f7e599f7
-e69bf7e69df7e79ff7e7a1f7e8a3f7e8a5f7e9a8f7e9aaf7eaacf7eaaef7ebb0f7ebb2f7ecb4f8ec
-b6f8edb8f8edbaf8eebcf8eebdf8efbff8efc2f8f0c4f8f1c6f8f1c8f8f1c9f8f2cbf8f2cdf8f3cf
-f8f3d1f8f4d3f8f4d4f8f5d6f8f5d7f8f5d9f8f6d9f8f6dbf8f6dcf8f6dcf8f6dcf8f6dcf8f6dbf8
-f6daf8f6d9f8f5d8f8f5d6f8f4d5f8f4d3f8f4d1f8f3d0f8f3cef8f2ccf8f2ca
-
-f7df81f7df83f7e085f7e087f7e189f7e18bf7e28df7e38ff7e391f7e493f7e495f7e597f7e599f7
-e69bf7e69df7e79ff7e7a2f7e8a4f7e8a6f7e9a8f7e9aaf7eaacf7eaaef7ebb0f7ecb2f8ecb4f8ed
-b6f8edb8f8eebaf8eebcf8efbef8efc0f8f0c2f8f0c4f8f1c6f8f1c8f8f2caf8f2ccf8f3cef8f3d0
-f8f4d2f8f4d3f8f5d5f8f5d7f8f5d9f8f6daf8f6dcf8f6dcf8f7ddf8f7def8f7def8f7def8f7ddf8
-f6dcf8f6dbf8f6d9f8f5d8f8f5d6f8f4d5f8f4d3f8f3d1f8f3cff8f2cdf8f2cb
-
-f7df81f7df83f7e085f7e087f7e189f7e18bf7e28df7e38ff7e391f7e494f7e496f7e598f7e59af7
-e69cf7e69ef7e7a0f7e7a2f7e8a4f7e8a6f7e9a8f7eaaaf7eaacf7ebaef7ebb0f7ecb2f8ecb5f8ed
-b7f8edb9f8eebbf8eebdf8efbff8efc1f8f0c3f8f0c5f8f1c7f8f1c9f8f2cbf8f2cdf8f3cff8f3d1
-f8f4d3f8f4d5f8f5d6f8f5d8f8f6daf8f6dcf8f7ddf8f7def8f7dff8f7e0f8f7e0f8f7e0f8f7dff8
-f7def8f6dcf8f6dbf8f6d9f8f5d7f8f5d5f8f4d3f8f4d2f8f3d0f8f3cef8f2cc
-
-f7df81f7df83f7e085f7e087f7e189f7e28bf7e28ef7e390f7e392f7e494f7e496f7e598f7e59af7
-e69cf7e69ef7e7a0f7e7a2f7e8a4f7e8a6f7e9a8f7eaaaf7eaacf7ebaef7ebb0f7ecb3f8ecb5f8ed
-b7f8edb9f8eebbf8eebdf8efbff8efc1f8f0c3f8f0c5f8f1c7f8f1c9f8f2cbf8f3cdf8f3cff8f4d1
-f8f4d3f8f5d5f8f5d7f8f6d9f8f6dbf8f6ddf8f7def8f7e0f8f8e1f8f8e2f8f8e2f8f8e2f8f8e1f8
-f7dff8f7def8f6dcf8f6daf8f5d8f8f5d6f8f4d4f8f4d2f8f3d1f8f3cff8f2cc
-
-f7df81f7df83f7e085f7e187f7e189f7e28bf7e28ef7e390f7e392f7e494f7e496f7e598f7e59af7
-e69cf7e69ef7e7a0f7e7a2f7e8a4f7e8a6f7e9a9f7eaabf7eaadf7ebaff7ebb1f7ecb3f8ecb5f8ed
-b7f8edb9f8eebbf8eebdf8efbff8efc2f8f0c4f8f1c6f8f1c8f8f2caf8f2ccf8f3cef8f3d0f8f4d2
-f8f4d4f8f5d6f8f5d8f8f6daf8f6dcf8f7def8f7e0f8f8e2f8f8e3f8f8e4f8f8e4f8f8e4f8f8e2f8
-f7e0f8f7dff8f6ddf8f6dbf8f6d9f8f5d7f8f4d5f8f4d3f8f3d1f8f3cff8f2cd
-
-f7df81f7df83f7e085f7e187f7e189f7e28bf7e28ef7e390f7e392f7e494f7e496f7e598f7e59af7
-e69cf7e69ef7e7a0f7e7a2f7e8a5f7e9a7f7e9a9f7eaabf7eaadf7ebaff7ebb1f7ecb3f8ecb5f8ed
-b7f8edb9f8eebbf8eebdf8efbff8efc2f8f0c4f8f1c6f8f1c8f8f2caf8f2ccf8f3cef8f3d0f8f4d2
-f8f4d4f8f5d6f8f5d8f8f6daf8f6dcf8f7def8f7e0f8f8e2f8f8e4f8f9e6f8f9e6f8f9e5f8f8e3f8
-f8e2f8f7e0f8f7def8f6dcf8f6d9f8f5d7f8f5d5f8f4d3f8f3d1f8f3cff8f2cd
-
-f7df81f7df83f7e085f7e187f7e189f7e28bf7e28ef7e390f7e392f7e494f7e496f7e598f7e59af7
-e69cf7e69ef7e7a0f7e8a3f7e8a5f7e9a7f7e9a9f7eaabf7eaadf7ebaff7ebb1f7ecb3f8ecb5f8ed
-b7f8edb9f8eebbf8eebdf8efbff8efc2f8f0c4f8f1c6f8f1c8f8f2caf8f2ccf8f3cef8f3d0f8f4d2
-f8f4d5f8f5d7f8f5d9f8f6dbf8f6ddf8f7dff8f8e1f8f8e3f8f9e5f8f9e7f8f9e8f8f9e6f8f8e4f8
-f8e2f8f7e0f8f7def8f6dcf8f6d9f8f5d7f8f5d5f8f4d3f8f4d1f8f3cff8f3cd
-
-f7df81f7df83f7e085f7e187f7e189f7e28bf7e28ef7e390f7e392f7e494f7e496f7e598f7e59af7
-e69cf7e69ef7e7a0f7e7a2f7e8a5f7e9a7f7e9a9f7eaabf7eaadf7ebaff7ebb1f7ecb3f8ecb5f8ed
-b7f8edb9f8eebbf8eebdf8efbff8efc2f8f0c4f8f1c6f8f1c8f8f2caf8f2ccf8f3cef8f3d0f8f4d2
-f8f4d4f8f5d6f8f5d9f8f6dbf8f6ddf8f7dff8f8e1f8f8e3f8f9e5f8f9e6f8f9e7f8f9e6f8f8e4f8
-f8e2f8f7e0f8f7def8f6dcf8f6d9f8f5d7f8f5d5f8f4d3f8f4d1f8f3cff8f2cd
-
-f7df81f7df83f7e085f7e187f7e189f7e28bf7e28ef7e390f7e392f7e494f7e496f7e598f7e59af7
-e69cf7e69ef7e7a0f7e7a2f7e8a4f7e9a7f7e9a9f7eaabf7eaadf7ebaff7ebb1f7ecb3f8ecb5f8ed
-b7f8edb9f8eebbf8eebdf8efbff8efc2f8f0c4f8f1c6f8f1c8f8f2caf8f2ccf8f3cef8f3d0f8f4d2
-f8f4d4f8f5d6f8f5d8f8f6daf8f6dcf8f7def8f7e0f8f8e2f8f8e4f8f8e4f8f9e5f8f8e4f8f8e3f8
-f8e1f8f7dff8f7ddf8f6dbf8f6d9f8f5d7f8f4d5f8f4d3f8f3d1f8f3cff8f2cd
-
-f7df81f7df83f7e085f7e087f7e189f7e28bf7e28ef7e390f7e392f7e494f7e496f7e598f7e59af7
-e69cf7e69ef7e7a0f7e7a2f7e8a4f7e8a6f7e9a8f7eaaaf7eaacf7ebaff7ebb1f7ecb3f8ecb5f8ed
-b7f8edb9f8eebbf8eebdf8efbff8efc1f8f0c3f8f0c5f8f1c8f8f2caf8f2ccf8f3cef8f3d0f8f4d2
-f8f4d4f8f5d5f8f5d7f8f6d9f8f6dcf8f7ddf8f7dff8f7e0f8f8e2f8f8e3f8f8e3f8f8e2f8f8e1f8
-f7e0f8f7def8f6dcf8f6daf8f5d9f8f5d7f8f4d5f8f4d3f8f3d1f8f3cff8f2cc
-
-f7df81f7df83f7e085f7e087f7e189f7e18bf7e28df7e390f7e392f7e494f7e496f7e598f7e59af7
-e69cf7e69ef7e7a0f7e7a2f7e8a4f7e8a6f7e9a8f7eaaaf7eaacf7ebaef7ebb0f7ecb2f8ecb5f8ed
-b7f8edb9f8eebbf8eebdf8efbff8efc1f8f0c3f8f0c5f8f1c7f8f1c9f8f2cbf8f2cdf8f3cff8f3d1
-f8f4d3f8f4d5f8f5d7f8f5d9f8f6daf8f6dcf8f7def8f7dff8f7e0f8f8e1f8f8e1f8f7e0f8f7e0f8
-f7def8f6ddf8f6dbf8f6d9f8f5d7f8f5d6f8f4d4f8f4d2f8f3d0f8f3cef8f2cc
-
-f7df81f7df83f7e085f7e087f7e189f7e18bf7e28df7e38ff7e391f7e493f7e495f7e597f7e599f7
-e69cf7e69ef7e7a0f7e7a2f7e8a4f7e8a6f7e9a8f7e9aaf7eaacf7eaaef7ebb0f7ecb2f8ecb4f8ed
-b6f8edb8f8eebaf8eebcf8efbef8efc0f8f0c2f8f0c4f8f1c6f8f1c8f8f2caf8f2ccf8f3cef8f3d0
-f8f4d2f8f4d4f8f5d6f8f5d7f8f6d9f8f6dbf8f6dcf8f7ddf8f7def8f7def8f7dff8f7def8f7def8
-f6ddf8f6dcf8f6daf8f5d8f8f5d7f8f4d5f8f4d3f8f3d1f8f3cff8f3cdf8f2cb
-
-f7df81f7df83f7e085f7e087f7e189f7e18bf7e28df7e28ff7e391f7e493f7e495f7e597f7e599f7
-e69bf7e69df7e79ff7e7a1f7e8a3f7e8a5f7e9a8f7e9aaf7eaacf7eaaef7ebb0f7ebb2f7ecb4f8ec
-b6f8edb8f8edbaf8eebcf8efbef8efc0f8f0c2f8f0c4f8f1c6f8f1c8f8f2caf8f2ccf8f3cdf8f3cf
-f8f3d1f8f4d3f8f4d5f8f5d6f8f5d8f8f6d9f8f6daf8f6dcf8f6dcf8f6dcf8f6ddf8f6dcf8f6dcf8
-f6dbf8f6daf8f5d8f8f5d7f8f5d5f8f4d4f8f4d2f8f3d0f8f3cff8f2ccf8f2ca
-
-f7df80f7df82f7e084f7e086f7e188f7e18af7e28df7e28ff7e391f7e393f7e495f7e597f7e599f7
-e69bf7e69df7e79ff7e7a1f7e8a3f7e8a5f7e9a7f7e9a9f7eaabf7eaadf7ebaff7ebb1f7ecb3f8ec
-b5f8edb7f8edb9f8eebbf8eebdf8efbff8efc1f8f0c3f8f0c5f8f1c7f8f1c9f8f2caf8f2ccf8f3ce
-f8f3d0f8f4d2f8f4d3f8f4d5f8f5d6f8f5d7f8f5d9f8f6d9f8f6daf8f6daf8f6dbf8f6daf8f6daf8
-f6d9f8f5d8f8f5d7f8f5d5f8f4d4f8f4d3f8f3d1f8f3cff8f3cdf8f2ccf8f2ca
-
-f7df80f7df82f7e084f7e086f7e188f7e18af7e28cf7e28ef7e390f7e392f7e494f7e496f7e598f7
-e59bf7e69df7e69ff7e7a1f7e8a3f7e8a5f7e9a7f7e9a9f7eaabf7eaadf7ebaff7ebb1f7ecb2f8ec
-b5f8edb7f8edb9f8eebbf8eebdf8efbef8efc0f8f0c2f8f0c4f8f1c6f8f1c8f8f2caf8f2cbf8f2cd
-f8f3cff8f3d0f8f4d2f8f4d3f8f4d5f8f5d6f8f5d7f8f5d7f8f5d8f8f5d8f8f5d8f8f5d8f8f5d8f8
-f5d7f8f5d6f8f4d5f8f4d4f8f4d3f8f3d1f8f3cff8f3cef8f2ccf8f2caf8f1c9
-
-f7df80f7df82f7e084f7e086f7e188f7e18af7e28cf7e28ef7e390f7e392f7e494f7e496f7e598f7
-e59af7e69cf7e69ef7e7a0f7e7a2f7e8a4f7e8a6f7e9a8f7e9aaf7eaacf7eaaef7ebb0f7ecb2f8ec
-b4f8ecb6f8edb8f8edbaf8eebcf8eebdf8efbff8efc1f8f0c3f8f0c5f8f1c7f8f1c8f8f2caf8f2cc
-f8f3cdf8f3cff8f3d0f8f4d2f8f4d3f8f4d4f8f4d5f8f5d5f8f5d6f8f5d6f8f5d6f8f5d6f8f5d6f8
-f4d5f8f4d4f8f4d3f8f4d2f8f3d1f8f3d0f8f3cef8f2ccf8f2cbf8f1c9f8f1c8
-
-f6de80f7df81f7df83f7e085f7e187f7e189f7e28bf7e28ef7e390f7e392f7e494f7e496f7e598f7
-e59af7e69bf7e69df7e79ff7e7a1f7e8a3f7e8a5f7e9a8f7e9aaf7eaacf7eaadf7ebaff7ebb1f7ec
-b3f8ecb5f8edb7f8edb9f8eebbf8eebdf8efbff8efc0f8f0c2f8f0c4f8f1c6f8f1c7f8f1c9f8f2ca
-f8f2ccf8f3cdf8f3cff8f3d0f8f3d1f8f4d2f8f4d3f8f4d3f8f4d4f8f4d4f8f4d4f8f4d4f8f4d4f8
-f4d3f8f4d3f8f4d1f8f3d1f8f3cff8f3cef8f2ccf8f2cbf8f2caf8f1c8f8f1c6
-
-f6de80f7df81f7df83f7e085f7e087f7e189f7e18bf7e28df7e28ff7e391f7e393f7e495f7e597f7
-e599f7e69bf7e69df7e79ff7e7a1f7e8a3f7e8a5f7e9a7f7e9a9f7eaabf7eaadf7ebaef7ebb0f7ec
-b2f8ecb4f8edb6f8edb8f8edbaf8eebcf8eebdf8efbff8efc1f8f0c3f8f0c4f8f1c6f8f1c8f8f1c9
-f8f2caf8f2ccf8f2cdf8f3cef8f3cff8f3d0f8f3d1f8f4d1f8f4d2f8f4d2f8f4d2f8f4d2f8f4d2f8
-f4d1f8f3d1f8f3d0f8f3cff8f3cef8f2ccf8f2cbf8f2caf8f1c8f8f1c7f8f0c5
-
-f6de7ff7df80f7df82f7e084f7e086f7e188f7e18af7e28cf7e28ef7e390f7e392f7e494f7e496f7
-e598f7e59bf7e69cf7e69ef7e7a0f7e7a2f7e8a4f7e8a6f7e9a8f7e9aaf7eaacf7eaaef7ebb0f7eb
-b2f7ecb3f8ecb5f8edb7f8edb9f8eebbf8eebcf8efbef8efc0f8efc2f8f0c3f8f0c4f8f1c6f8f1c8
-f8f1c9f8f2caf8f2cbf8f2ccf8f3cdf8f3cef8f3cff8f3cff8f3d0f8f3d0f8f3d0f8f3d0f8f3d0f8
-f3cff8f3cff8f3cef8f2cdf8f2ccf8f2cbf8f2caf8f1c8f8f1c7f8f0c5f8f0c4
-
-f6de7ff7df80f7df82f7e084f7e086f7e188f7e18af7e28cf7e28ef7e390f7e392f7e494f7e496f7
-e598f7e59af7e69cf7e69df7e79ff7e7a1f7e8a3f7e8a5f7e9a7f7e9a9f7eaabf7eaadf7ebaff7eb
-b0f7ecb2f8ecb4f8edb6f8edb8f8edb9f8eebbf8eebdf8efbef8efc0f8efc2f8f0c3f8f0c4f8f1c6
-f8f1c7f8f1c8f8f2caf8f2caf8f2cbf8f2ccf8f2cdf8f3cdf8f3cef8f3cef8f3cef8f3cef8f3cef8
-f3cdf8f2ccf8f2ccf8f2cbf8f2caf8f1c9f8f1c8f8f1c6f8f0c5f8f0c4f8f0c2
-
-f6de7ef6de80f7df81f7df83f7e085f7e087f7e189f7e18bf7e28df7e38ff7e391f7e493f7e495f7
-e597f7e599f7e69bf7e69df7e69ff7e7a1f7e8a3f7e8a4f7e8a6f7e9a8f7e9aaf7eaacf7eaaef7eb
-b0f7ebb1f7ecb3f8ecb5f8edb7f8edb8f8edbaf8eebbf8eebdf8efbff8efc0f8efc2f8f0c3f8f0c4
-f8f1c6f8f1c7f8f1c8f8f1c9f8f2caf8f2caf8f2cbf8f2cbf8f2ccf8f2ccf8f2ccf8f2ccf8f2ccf8
-f2cbf8f2caf8f2caf8f1c9f8f1c8f8f1c7f8f1c6f8f0c5f8f0c4f8f0c2f8efc1
-
-f6de7df6de7ff7df81f7df83f7e085f7e087f7e189f7e18bf7e28cf7e28ef7e390f7e392f7e494f7
-e496f7e598f7e59af7e69cf7e69ef7e7a0f7e7a2f7e8a3f7e8a5f7e9a7f7e9a9f7eaabf7eaadf7eb
-aef7ebb0f7ecb2f7ecb4f8ecb5f8edb7f8edb9f8eebaf8eebcf8eebdf8efbff8efc0f8efc2f8f0c3
-f8f0c4f8f0c5f8f1c6f8f1c7f8f1c8f8f1c8f8f1c9f8f1c9f8f2caf8f2caf8f2caf8f2caf8f2caf8
-f1c9f8f1c8f8f1c8f8f1c7f8f1c6f8f1c6f8f0c4f8f0c3f8f0c2f8efc1f8efbf
-
-f6de7df6de7ff7df80f7df82f7e084f7e086f7e188f7e18af7e28cf7e28ef7e390f7e392f7e494f7
-e495f7e597f7e599f7e69bf7e69df7e79ff7e7a1f7e8a3f7e8a4f7e8a6f7e9a8f7e9aaf7eaacf7ea
-adf7ebaff7ebb1f7ecb2f8ecb4f8ecb6f8edb7f8edb9f8eebaf8eebcf8eebdf8efbef8efc0f8efc1
-f8f0c2f8f0c3f8f0c4f8f0c5f8f1c6f8f1c6f8f1c7f8f1c7f8f1c8f8f1c8f8f1c8f8f1c8f8f1c8f8
-f1c7f8f1c7f8f1c6f8f0c5f8f0c4f8f0c4f8f0c3f8efc2f8efc0f8efbff8efbe
-
-f6dd7cf6de7ef6de80f7df81f7df83f7e085f7e087f7e189f7e18bf7e28df7e28ff7e391f7e393f7
-e494f7e496f7e598f7e59af7e69cf7e69ef7e7a0f7e7a1f7e8a3f7e8a5f7e9a7f7e9a9f7eaaaf7ea
-acf7eaaef7ebb0f7ebb1f7ecb3f8ecb4f8ecb6f8edb7f8edb9f8eebaf8eebbf8eebdf8efbef8efbf
-f8efc0f8efc1f8f0c2f8f0c3f8f0c4f8f0c4f8f0c5f8f0c5f8f1c6f8f1c6f8f1c6f8f1c6f8f1c6f8
-f0c5f8f0c5f8f0c4f8f0c4f8f0c3f8efc2f8efc1f8efc0f8efbff8eebdf8eebc
-
-f6dd7cf6de7df6de7ff7df81f7df83f7e085f7e086f7e188f7e18af7e28cf7e28ef7e390f7e392f7
-e494f7e496f7e597f7e599f7e69bf7e69df7e69ff7e7a1f7e7a2f7e8a4f7e8a6f7e9a8f7e9a9f7ea
-abf7eaacf7eaaef7ebb0f7ebb1f7ecb3f8ecb5f8ecb6f8edb7f8edb9f8edbaf8eebbf8eebcf8eebd
-f8efbef8efbff8efc0f8efc1f8f0c2f8f0c2f8f0c3f8f0c3f8f0c4f8f0c4f8f0c4f8f0c4f8f0c3f8
-f0c3f8f0c3f8f0c2f8efc2f8efc1f8efc0f8efbff8efbef8eebdf8eebcf8eebb
-
-f6dd7bf6de7df6de7ff7df80f7df82f7e084f7e085f7e187f7e189f7e18bf7e28df7e38ff7e391f7
-e393f7e494f7e496f7e598f7e59af7e69cf7e69ef7e79ff7e7a1f7e8a3f7e8a5f7e8a6f7e9a8f7e9
-aaf7eaabf7eaadf7ebaef7ebb0f7ebb1f7ecb3f8ecb4f8ecb6f8edb7f8edb8f8edb9f8eebbf8eebb
-f8eebdf8eebdf8efbef8efbff8efc0f8efc0f8efc1f8efc1f8efc2f8efc2f8efc2f8efc2f8efc1f8
-efc1f8efc1f8efc0f8efbff8efbff8efbef8eebdf8eebcf8eebbf8edbaf8edb9
-
-f6dd7af6dd7cf6de7ef6de80f7df81f7df83f7e085f7e087f7e189f7e18af7e28cf7e28ef7e390f7
-e392f7e494f7e495f7e597f7e599f7e69bf7e69df7e69ef7e7a0f7e7a2f7e8a3f7e8a5f7e9a7f7e9
-a8f7e9aaf7eaacf7eaadf7ebaef7ebb0f7ebb1f7ecb3f8ecb4f8ecb5f8edb7f8edb8f8edb9f8edba
-f8eebbf8eebbf8eebcf8eebdf8efbef8efbef8efbff8efbff8efbff8efbff8efbff8efbff8efbff8
-efbff8efbff8efbef8eebdf8eebdf8eebcf8eebbf8eebaf8edb9f8edb8f8edb7
-
-f6dd79f6dd7bf6de7df6de7ff7df80f7df82f7e084f7e086f7e187f7e189f7e28bf7e28df7e38ff7
-e391f7e392f7e494f7e496f7e598f7e59af7e69bf7e69df7e79ff7e7a1f7e7a2f7e8a4f7e8a5f7e9
-a7f7e9a8f7e9aaf7eaacf7eaadf7ebaef7ebb0f7ebb1f7ecb2f7ecb4f8ecb5f8ecb6f8edb7f8edb8
-f8edb9f8edbaf8eebbf8eebbf8eebcf8eebcf8eebdf8eebdf8eebdf8eebdf8eebdf8eebdf8eebdf8
-eebdf8eebdf8eebcf8eebbf8eebbf8eebaf8edb9f8edb9f8edb7f8edb7f8ecb5
-
-f6dc79f6dd7bf6dd7cf6de7ef6de80f7df81f7df83f7e085f7e087f7e189f7e18af7e28cf7e28ef7
-e390f7e392f7e493f7e495f7e597f7e598f7e59af7e69cf7e69ef7e79ff7e7a1f7e8a3f7e8a4f7e8
-a5f7e9a7f7e9a9f7e9aaf7eaacf7eaadf7eaaef7ebb0f7ebb1f7ecb2f7ecb3f8ecb4f8ecb5f8edb6
-f8edb7f8edb8f8edb9f8edb9f8edbaf8eebaf8eebbf8eebbf8eebbf8eebbf8eebbf8eebbf8eebbf8
-eebbf8eebbf8edbaf8edb9f8edb9f8edb8f8edb7f8edb7f8ecb6f8ecb5f7ecb4
-
-f6dc78f6dd7af6dd7bf6de7df6de7ff7df80f7df82f7e084f7e086f7e187f7e189f7e18bf7e28df7
-e28ff7e390f7e392f7e494f7e496f7e597f7e599f7e59bf7e69cf7e69ef7e79ff7e7a1f7e8a3f7e8
-a4f7e8a5f7e9a7f7e9a8f7e9aaf7eaabf7eaacf7eaaef7ebaff7ebb0f7ebb1f7ecb2f7ecb3f8ecb4
-f8ecb5f8ecb6f8edb7f8edb7f8edb8f8edb8f8edb9f8edb9f8edb9f8edb9f8edb9f8edb9f8edb9f8
-edb9f8edb8f8edb8f8edb7f8edb7f8edb6f8ecb5f8ecb5f7ecb4f7ecb3f7ebb2
-
-Q
-Q
-Q
-Q
-q
-q
-n
-140 267 m
-204 267 l
-204 203 l
-140 203 l
-140 267 l
-h
-W
-q
-q
-[64 0 0 64 140 203]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-f7e390f7e38ff7e28ef7e28ef7e28df7e28cf7e18bf7e18af7e189f7e188f7e087f7e086f7e085f7
-e084f7df83f7df81f7df80f6de80f6de7ef6de7df6dd7cf6dd7af6dd79f6dc78f6dc76f6dc75f6db
-73f6db72f6da70f6da6ff6da6df6d96cf6d96af6d869f6d867f6d865f6d764f6d762f6d661f6d65f
-f6d55df6d55bf6d55af6d458f6d456f6d355f6d353f6d251f6d250f6d14ef5d14cf5d14af5d048f5
-d047f5cf45f5cf43f5ce41f5ce3ff5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34
-
-f7e392f7e391f7e390f7e390f7e28ff7e28ef7e28df7e28cf7e18bf7e18af7e189f7e188f7e087f7
-e085f7e084f7df83f7df82f7df81f6de80f6de7ff6de7df6dd7cf6dd7bf6dd79f6dc78f6dc76f6dc
-75f6db73f6db72f6da70f6da6ff6da6df6d96cf6d96af6d868f6d867f6d765f6d763f6d762f6d660
-f6d65ef6d55df6d55bf6d459f6d458f6d356f6d354f6d352f6d250f6d24ff6d14df5d14bf5d049f5
-d048f5cf46f5cf44f5ce42f5ce41f5ce3ef5cd3df5cd3bf5cc39f5cc37f5cb35
-
-f7e494f7e493f7e392f7e392f7e391f7e390f7e28ff7e28ef7e28df7e28bf7e18bf7e189f7e188f7
-e087f7e086f7e085f7df83f7df82f7df81f6de80f6de7ff6de7df6dd7cf6dd7bf6dd79f6dc78f6dc
-76f6db75f6db73f6db72f6da70f6da6ef6d96df6d96bf6d96af6d868f6d866f6d765f6d763f6d761
-f6d65ff6d65ef6d55cf6d55bf6d458f6d457f6d355f6d353f6d252f6d250f6d14ef6d14cf5d14bf5
-d049f5d047f5cf45f5cf43f5ce41f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36
-
-f7e496f7e495f7e494f7e493f7e392f7e392f7e390f7e390f7e28ef7e28ef7e28cf7e18bf7e18af7
-e189f7e187f7e086f7e085f7e084f7df82f7df81f6de80f6de7ff6de7df6dd7cf6dd7bf6dd79f6dc
-78f6dc76f6db75f6db73f6db71f6da70f6da6ef6d96cf6d96bf6d869f6d868f6d866f6d764f6d763
-f6d661f6d65ff6d55df6d55cf6d55af6d458f6d456f6d354f6d353f6d251f6d24ff6d14ef5d14bf5
-d04af5d048f5d046f5cf44f5ce42f5ce41f5ce3ef5cd3df5cd3bf5cc39f5cc37
-
-f7e598f7e597f7e496f7e495f7e494f7e493f7e392f7e391f7e390f7e38ff7e28ef7e28df7e28bf7
-e18af7e189f7e188f7e087f7e085f7e084f7df83f7df81f7df80f6de7ff6de7df6dd7cf6dd7bf6dd
-79f6dc77f6dc76f6db74f6db72f6da71f6da6ff6da6ef6d96cf6d96af6d869f6d867f6d865f6d763
-f6d762f6d660f6d65ff6d55df6d55bf6d459f6d457f6d356f6d354f6d352f6d250f6d24ef6d14df5
-d14bf5d049f5d047f5cf45f5cf43f5ce41f5ce40f5cd3ef5cd3cf5cc3af5cc38
-
-f7e59af7e599f7e598f7e597f7e496f7e495f7e494f7e493f7e392f7e391f7e390f7e28ff7e28df7
-e28cf7e18bf7e189f7e188f7e087f7e085f7e084f7df83f7df81f7df80f6de7ff6de7df6dd7cf6dd
-7af6dd79f6dc77f6dc76f6db74f6db72f6da71f6da6ff6da6df6d96cf6d96af6d868f6d867f6d765
-f6d763f6d761f6d65ff6d65ef6d55cf6d55af6d458f6d456f6d355f6d353f6d251f6d24ff6d14ef5
-d14bf5d04af5d048f5d046f5cf44f5cf43f5ce41f5ce3ef5cd3df5cd3bf5cc39
-
-f7e69cf7e69bf7e59af7e599f7e598f7e597f7e496f7e495f7e494f7e393f7e392f7e390f7e38ff7
-e28ef7e28cf7e18bf7e18af7e188f7e087f7e085f7e084f7df83f7df81f6de80f6de7ff6de7df6dd
-7cf6dd7af6dc79f6dc77f6dc75f6db74f6db72f6da70f6da6ef6d96df6d96bf6d96af6d868f6d866
-f6d764f6d762f6d661f6d65ff6d55df6d55bf6d459f6d458f6d356f6d354f6d352f6d250f6d24ef6
-d14df5d14bf5d049f5d047f5cf45f5cf43f5ce41f5ce3ff5cd3ef5cd3cf5cc3a
-
-f7e69df7e69df7e69cf7e69bf7e59af7e599f7e598f7e597f7e496f7e494f7e493f7e392f7e391f7
-e38ff7e28ef7e28df7e18bf7e18af7e188f7e087f7e085f7e084f7df83f7df81f6de80f6de7ff6de
-7df6dd7bf6dd7af6dc78f6dc77f6dc75f6db73f6db72f6da70f6da6ef6d96cf6d96bf6d869f6d867
-f6d765f6d763f6d762f6d660f6d65ef6d55cf6d55bf6d458f6d457f6d355f6d353f6d251f6d250f6
-d14ef5d14bf5d04af5d048f5d046f5cf44f5ce42f5ce41f5ce3ef5cd3cf5cc3a
-
-f7e79ff7e69ff7e69ef7e69df7e69cf7e59bf7e59af7e598f7e597f7e496f7e495f7e494f7e392f7
-e391f7e390f7e28ef7e28df7e28bf7e18af7e188f7e087f7e085f7e084f7df82f7df81f6de80f6de
-7ef6de7df6dd7bf6dd79f6dc78f6dc76f6db75f6db72f6da71f6da6ff6da6ef6d96cf6d96af6d868
-f6d866f6d765f6d763f6d661f6d65ff6d55df6d55bf6d55af6d458f6d456f6d354f6d352f6d250f6
-d24ef6d14df5d14bf5d049f5d047f5cf45f5cf43f5ce41f5ce3ff5cd3df5cd3b
-
-f7e7a1f7e7a1f7e79ff7e69ff7e69df7e69df7e69bf7e59af7e599f7e598f7e496f7e495f7e494f7
-e392f7e391f7e390f7e28ef7e28df7e28bf7e18af7e188f7e087f7e085f7df83f7df82f7df81f6de
-7ff6de7ef6dd7cf6dd7bf6dd79f6dc77f6dc76f6db74f6db72f6da70f6da6ef6d96df6d96bf6d869
-f6d868f6d865f6d764f6d762f6d660f6d65ef6d55df6d55bf6d459f6d457f6d355f6d353f6d251f6
-d24ff6d14ef5d14bf5d049f5d048f5cf46f5cf44f5ce42f5ce40f5cd3ef5cd3c
-
-f7e8a3f7e7a2f7e7a1f7e7a0f7e79ff7e69ef7e69df7e69cf7e59bf7e599f7e598f7e597f7e495f7
-e494f7e393f7e391f7e390f7e28ef7e28df7e18bf7e189f7e188f7e087f7e085f7df83f7df82f7df
-80f6de7ff6de7df6dd7cf6dd7af6dc79f6dc77f6dc75f6db73f6db71f6da70f6da6ef6d96cf6d96a
-f6d868f6d867f6d765f6d763f6d661f6d65ff6d55df6d55bf6d55af6d458f6d456f6d354f6d352f6
-d250f6d24ef6d14cf5d14bf5d049f5d047f5cf45f5cf43f5ce41f5ce3ff5cd3d
-
-f7e8a5f7e8a4f7e8a3f7e7a2f7e7a1f7e7a0f7e69ff7e69df7e69cf7e69bf7e59af7e598f7e597f7
-e496f7e494f7e393f7e391f7e390f7e28ef7e28df7e18bf7e189f7e188f7e086f7e085f7df83f7df
-81f6de80f6de7ff6de7df6dd7bf6dd79f6dc78f6dc76f6db74f6db72f6da71f6da6ff6da6df6d96b
-f6d96af6d868f6d866f6d764f6d762f6d660f6d65ef6d55df6d55bf6d458f6d457f6d355f6d353f6
-d251f6d24ff6d14df5d14bf5d049f5d047f5cf45f5cf44f5ce42f5ce40f5cd3e
-
-f7e9a7f7e8a6f7e8a5f7e8a4f7e8a3f7e7a2f7e7a1f7e79ff7e69ef7e69df7e69bf7e59af7e598f7
-e597f7e496f7e494f7e393f7e391f7e390f7e28ef7e28cf7e18bf7e189f7e187f7e086f7e084f7df
-83f7df81f6de80f6de7ef6de7df6dd7bf6dd79f6dc77f6dc75f6db74f6db72f6da70f6da6ef6d96c
-f6d96af6d869f6d867f6d765f6d763f6d661f6d65ff6d55df6d55bf6d55af6d458f6d356f6d354f6
-d352f6d250f6d14ef5d14cf5d14af5d048f5d046f5cf44f5cf43f5ce41f5ce3e
-
-f7e9a9f7e9a8f7e9a7f7e8a5f7e8a5f7e8a3f7e7a2f7e7a1f7e79ff7e69ef7e69df7e69bf7e59af7
-e598f7e597f7e496f7e494f7e392f7e391f7e38ff7e28ef7e28cf7e18af7e189f7e087f7e085f7e0
-84f7df82f7df80f6de7ff6de7df6dd7cf6dd7af6dc78f6dc77f6db75f6db73f6da71f6da6ff6da6d
-f6d96bf6d96af6d868f6d866f6d764f6d762f6d660f6d65ef6d55cf6d55bf6d458f6d456f6d354f6
-d353f6d251f6d24ff6d14df5d14bf5d049f5d047f5cf45f5cf43f5ce41f5ce3f
-
-f7eaabf7e9aaf7e9a9f7e9a8f7e8a6f7e8a5f7e8a4f7e8a3f7e7a1f7e7a0f7e69ff7e69df7e69bf7
-e59af7e598f7e597f7e495f7e494f7e392f7e391f7e28ff7e28df7e28bf7e18af7e188f7e087f7e0
-85f7df83f7df81f6de80f6de7ff6de7df6dd7bf6dd79f6dc77f6dc76f6db74f6db72f6da70f6da6e
-f6d96cf6d96af6d868f6d867f6d765f6d763f6d661f6d65ff6d55df6d55bf6d459f6d457f6d355f6
-d354f6d252f6d250f6d14ef5d14bf5d04af5d048f5cf46f5cf44f5ce42f5ce40
-
-f7eaacf7eaacf7eaaaf7e9a9f7e9a8f7e9a7f7e8a5f7e8a4f7e8a3f7e7a1f7e7a0f7e69ff7e69df7
-e69bf7e59af7e598f7e597f7e495f7e494f7e392f7e390f7e28ef7e28df7e18bf7e189f7e187f7e0
-86f7e084f7df82f7df81f6de7ff6de7ef6dd7cf6dd7af6dc78f6dc77f6db75f6db73f6da71f6da6f
-f6da6df6d96bf6d96af6d868f6d865f6d763f6d762f6d660f6d65ef6d55cf6d55af6d458f6d456f6
-d354f6d352f6d250f6d24ef6d14cf5d14af5d048f5d047f5cf45f5cf43f5ce41
-
-f7ebaef7eaadf7eaacf7eaabf7e9aaf7e9a8f7e9a7f7e8a5f7e8a4f7e8a3f7e7a1f7e7a0f7e69ff7
-e69df7e69bf7e59af7e598f7e496f7e495f7e493f7e392f7e390f7e28ef7e28cf7e18bf7e189f7e0
-87f7e085f7df83f7df81f7df80f6de7ff6de7df6dd7bf6dd79f6dc77f6dc76f6db74f6db72f6da70
-f6da6ef6d96cf6d96af6d868f6d866f6d764f6d763f6d661f6d65ff6d55df6d55bf6d459f6d457f6
-d355f6d353f6d251f6d24ff6d14df5d14bf5d049f5d047f5cf45f5cf43f5ce41
-
-f7ebb0f7ebaff7eaaef7eaacf7eaabf7e9aaf7e9a9f7e9a7f7e8a6f7e8a4f7e8a3f7e7a1f7e7a0f7
-e69ef7e69df7e69bf7e599f7e598f7e496f7e494f7e392f7e391f7e38ff7e28ef7e28bf7e18af7e1
-88f7e086f7e084f7df83f7df81f6de80f6de7ef6dd7cf6dd7af6dc78f6dc77f6db75f6db72f6da71
-f6da6ff6d96df6d96bf6d869f6d867f6d765f6d763f6d761f6d65ff6d55df6d55bf6d55af6d458f6
-d356f6d354f6d252f6d250f6d14ef5d14cf5d04af5d048f5cf46f5cf44f5ce42
-
-f7ebb2f7ebb1f7ebb0f7eaaef7eaadf7eaacf7eaaaf7e9a9f7e9a7f7e8a6f7e8a4f7e8a3f7e7a1f7
-e79ff7e69ef7e69cf7e59bf7e599f7e597f7e496f7e494f7e392f7e390f7e28ef7e28df7e18bf7e1
-89f7e087f7e085f7df83f7df82f7df80f6de7ff6de7df6dd7bf6dd79f6dc77f6dc75f6db73f6db72
-f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6d65ef6d55cf6d55af6d458f6
-d456f6d354f6d352f6d250f6d24ef6d14cf5d14af5d048f5d046f5cf44f5ce42
-
-f7ecb4f7ecb2f7ebb1f7ebb0f7ebaef7eaadf7eaacf7eaaaf7e9a9f7e9a7f7e8a5f7e8a4f7e8a3f7
-e7a1f7e79ff7e69df7e69cf7e59af7e598f7e496f7e495f7e493f7e391f7e390f7e28ef7e28cf7e1
-8af7e188f7e086f7e085f7df83f7df81f6de80f6de7ef6dd7cf6dd7af6dc78f6dc76f6db74f6db72
-f6da70f6da6ef6d96cf6d96bf6d869f6d867f6d765f6d763f6d661f6d65ff6d55df6d55bf6d459f6
-d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049f5d047f5cf45f5cf43
-
-f8ecb5f8ecb4f7ecb3f7ebb1f7ebb0f7ebaff7eaadf7eaacf7e9aaf7e9a9f7e9a7f7e8a5f7e8a4f7
-e7a2f7e7a1f7e69ff7e69df7e69bf7e599f7e598f7e496f7e494f7e392f7e390f7e28ff7e28df7e1
-8bf7e189f7e087f7e085f7df83f7df81f7df80f6de7ff6de7df6dd7bf6dd79f6dc77f6dc75f6db73
-f6db71f6da6ff6da6df6d96bf6d869f6d868f6d865f6d763f6d761f6d65ff6d55df6d55bf6d459f6
-d458f6d356f6d354f6d252f6d250f6d14ef5d14bf5d049f5d047f5cf45f5cf43
-
-f8edb7f8ecb6f8ecb5f7ecb3f7ebb2f7ebb0f7ebaff7eaadf7eaacf7e9aaf7e9a8f7e9a7f7e8a5f7
-e8a3f7e7a1f7e7a0f7e69ef7e69df7e59bf7e599f7e597f7e495f7e493f7e392f7e390f7e28ef7e2
-8cf7e18af7e188f7e086f7e084f7df83f7df81f6de7ff6de7df6dd7cf6dd7af6dc78f6dc76f6db74
-f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6d65ef6d55cf6d55af6
-d458f6d456f6d354f6d352f6d250f6d14ef5d14cf5d04af5d048f5cf46f5cf44
-
-f8edb9f8edb7f8ecb6f8ecb5f7ecb3f7ebb2f7ebb0f7ebaef7eaadf7eaabf7e9aaf7e9a8f7e8a6f7
-e8a5f7e8a3f7e7a1f7e79ff7e69df7e69cf7e59af7e598f7e496f7e494f7e392f7e390f7e28ff7e2
-8df7e18bf7e189f7e087f7e085f7df83f7df81f6de80f6de7ef6dd7cf6dd7bf6dc79f6dc77f6db75
-f6db72f6da70f6da6ef6d96df6d96bf6d869f6d867f6d765f6d763f6d661f6d65ff6d55df6d55bf6
-d458f6d456f6d354f6d352f6d251f6d24ff6d14df5d14bf5d049f5d047f5cf45
-
-f8eebaf8edb9f8edb7f8edb6f8ecb5f7ecb3f7ebb1f7ebb0f7eaaef7eaacf7eaabf7e9a9f7e9a8f7
-e8a5f7e8a4f7e7a2f7e7a0f7e69ff7e69df7e69bf7e599f7e597f7e495f7e493f7e392f7e390f7e2
-8ef7e28bf7e18af7e188f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7bf6dd79f6dc77f6dc75
-f6db73f6db71f6da6ff6da6df6d96bf6d869f6d867f6d765f6d763f6d661f6d65ff6d55df6d55bf6
-d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049f5d047f5cf45
-
-f8eebcf8eebbf8edb9f8edb7f8ecb6f8ecb5f7ecb3f7ebb1f7ebaff7eaaef7eaacf7eaaaf7e9a8f7
-e9a7f7e8a5f7e8a3f7e7a1f7e79ff7e69ef7e69cf7e59af7e598f7e496f7e494f7e392f7e390f7e2
-8ef7e28cf7e18bf7e189f7e087f7e085f7df83f7df81f6de80f6de7ef6dd7cf6dd7af6dc78f6dc76
-f6db74f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6d65ef6d55cf6
-d55af6d458f6d356f6d354f6d252f6d250f6d14ef5d14bf5d049f5d047f5cf45
-
-f8eebdf8eebcf8eebaf8edb9f8edb7f8ecb6f8ecb4f7ecb2f7ebb0f7ebaff7eaadf7eaabf7e9aaf7
-e9a8f7e8a6f7e8a4f7e7a2f7e7a0f7e69ff7e69df7e59bf7e599f7e597f7e495f7e493f7e391f7e3
-8ff7e28df7e18bf7e189f7e187f7e085f7df83f7df81f6de80f6de7ef6dd7cf6dd7af6dc79f6dc77
-f6db75f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6d65ef6d55cf6
-d55af6d458f6d456f6d354f6d352f6d250f6d14ef5d14cf5d04af5d048f5cf46
-
-f8efbff8eebdf8eebcf8eebaf8edb9f8edb7f8ecb5f7ecb4f7ebb2f7ebb0f7eaaef7eaacf7eaabf7
-e9a9f7e9a7f7e8a5f7e8a3f7e7a1f7e79ff7e69df7e69bf7e59af7e598f7e496f7e494f7e392f7e3
-90f7e28ef7e28cf7e18af7e188f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7bf6dd79f6dc77
-f6dc75f6db73f6da71f6da6ff6d96df6d96bf6d869f6d867f6d765f6d763f6d661f6d65ff6d55df6
-d55bf6d458f6d456f6d354f6d352f6d250f6d24ef6d14cf5d14af5d048f5d046
-
-f8efc0f8efbff8eebdf8eebbf8edbaf8edb8f8edb7f8ecb5f7ecb3f7ebb1f7ebaff7eaadf7eaacf7
-e9aaf7e9a8f7e8a6f7e8a4f7e7a2f7e7a0f7e69ef7e69cf7e59bf7e598f7e496f7e494f7e392f7e3
-90f7e28ef7e28df7e18bf7e189f7e087f7e085f7df83f7df81f6de7ff6de7df6dd7bf6dd79f6dc77
-f6dc75f6db73f6db71f6da6ff6da6df6d96bf6d869f6d867f6d765f6d763f6d661f6d65ff6d55df6
-d55bf6d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049f5d047
-
-f8efc2f8efc0f8efbef8eebdf8eebbf8edb9f8edb7f8ecb6f7ecb4f7ecb2f7ebb0f7ebaef7eaacf7
-eaaaf7e9a9f7e9a7f7e8a5f7e8a3f7e7a1f7e79ff7e69df7e69bf7e599f7e597f7e495f7e493f7e3
-91f7e38ff7e28df7e18bf7e189f7e087f7e085f7df83f7df81f6de80f6de7ef6dd7cf6dd7af6dc78
-f6dc76f6db74f6db72f6da70f6da6ef6d96cf6d96af6d868f6d865f6d763f6d761f6d65ff6d55df6
-d55bf6d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049f5d047
-
-f8f0c3f8efc2f8efbff8efbef8eebcf8eebaf8edb9f8edb7f8ecb5f7ecb3f7ebb1f7ebaff7eaadf7
-eaabf7e9aaf7e9a8f7e8a5f7e8a3f7e7a1f7e7a0f7e69ef7e69cf7e59af7e598f7e496f7e494f7e3
-92f7e390f7e28ef7e28bf7e18af7e188f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7bf6dc79
-f6dc77f6db75f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6d65ef6
-d55cf6d55af6d458f6d356f6d354f6d252f6d250f6d14ef5d14bf5d049f5d047
-
-f8f0c4f8f0c2f8efc1f8efbff8eebdf8eebbf8edb9f8edb8f8ecb6f7ecb4f7ecb2f7ebb0f7eaaef7
-eaacf7eaaaf7e9a8f7e8a6f7e8a4f7e7a2f7e7a0f7e69ef7e69cf7e59af7e598f7e496f7e494f7e3
-92f7e390f7e28ef7e28cf7e18af7e188f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7bf6dd79
-f6dc77f6db75f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6d65ef6
-d55cf6d55af6d458f6d456f6d354f6d252f6d250f6d14ef5d14bf5d049f5d047
-
-f8f1c6f8f0c4f8f0c2f8efc0f8efbef8eebcf8eebaf8edb9f8edb7f8ecb5f7ecb3f7ebb1f7ebaff7
-eaadf7eaabf7e9a9f7e9a7f7e8a5f7e8a3f7e7a1f7e79ff7e69df7e69bf7e599f7e597f7e495f7e3
-93f7e391f7e28ff7e28df7e18bf7e189f7e087f7e085f7df83f7df81f6de7ff6de7df6dd7bf6dd79
-f6dc77f6dc75f6db73f6da71f6da6ff6d96df6d96bf6d869f6d867f6d765f6d763f6d661f6d65ff6
-d55df6d55af6d458f6d456f6d354f6d352f6d250f6d14ef5d14cf5d04af5d048
-
-f8f1c6f8f0c5f8f0c3f8efc1f8efbff8eebdf8eebbf8edb9f8edb7f8ecb5f7ecb3f7ebb1f7ebb0f7
-eaaef7eaacf7e9aaf7e9a8f7e8a5f7e8a3f7e7a1f7e79ff7e69df7e69bf7e599f7e597f7e495f7e4
-93f7e391f7e38ff7e28df7e18bf7e189f7e087f7e085f7df83f7df81f6de7ff6de7df6dd7bf6dd79
-f6dc77f6dc75f6db73f6db71f6da6ff6da6df6d96bf6d869f6d867f6d765f6d763f6d661f6d65ff6
-d55df6d55bf6d458f6d456f6d354f6d352f6d250f6d24ef5d14cf5d04af5d048
-
-f8f1c8f8f1c6f8f0c4f8f0c2f8efc0f8efbef8eebcf8edbaf8edb8f8edb6f8ecb4f7ecb2f7ebb0f7
-eaaef7eaacf7e9aaf7e9a8f7e8a6f7e8a4f7e7a2f7e7a0f7e69ef7e69cf7e59af7e598f7e496f7e4
-94f7e392f7e390f7e28ef7e28bf7e189f7e187f7e085f7df83f7df81f6de80f6de7ef6dd7cf6dd7a
-f6dc78f6dc76f6db74f6db72f6da70f6da6ef6d96bf6d869f6d867f6d765f6d763f6d661f6d65ff6
-d55df6d55bf6d459f6d456f6d354f6d352f6d250f6d24ef6d14cf5d14af5d048
-
-f8f1c8f8f1c6f8f0c4f8f0c3f8efc1f8efbff8eebdf8eebbf8edb9f8edb7f8ecb5f7ecb2f7ebb0f7
-ebaef7eaacf7eaaaf7e9a8f7e8a6f7e8a4f7e7a2f7e7a0f7e69ef7e69cf7e59af7e598f7e496f7e4
-94f7e392f7e390f7e28ef7e28bf7e189f7e187f7e085f7df83f7df81f6de80f6de7ef6dd7cf6dd7a
-f6dc78f6dc76f6db74f6db72f6da70f6da6ef6d96cf6d96af6d868f6d865f6d763f6d661f6d65ff6
-d55df6d55bf6d459f6d457f6d355f6d353f6d251f6d24ff6d14cf5d14af5d048
-
-f8f1c9f8f1c7f8f0c5f8f0c3f8efc1f8efbff8eebdf8eebbf8edb9f8edb7f8ecb5f7ecb3f7ebb1f7
-ebaff7eaadf7eaabf7e9a9f7e9a7f7e8a5f7e8a3f7e7a1f7e69ff7e69df7e59bf7e598f7e496f7e4
-94f7e392f7e390f7e28ef7e28cf7e18af7e188f7e086f7e084f7df82f7df80f6de7ef6dd7cf6dd7a
-f6dc78f6dc76f6db74f6db72f6da70f6da6ef6d96cf6d96af6d868f6d865f6d763f6d761f6d65ff6
-d55df6d55bf6d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049
-
-f8f2caf8f1c8f8f1c6f8f0c4f8efc2f8efbff8eebdf8eebbf8edb9f8edb7f8ecb5f7ecb3f7ebb1f7
-ebaff7eaadf7eaabf7e9a9f7e9a7f7e8a5f7e8a3f7e7a1f7e79ff7e69df7e59bf7e598f7e496f7e4
-94f7e392f7e390f7e28ef7e28cf7e18af7e188f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7b
-f6dc79f6dc76f6db74f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d763f6d761f6d65ff6
-d55df6d55bf6d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049
-
-f8f2caf8f1c8f8f1c6f8f0c4f8f0c2f8efc0f8efbef8eebcf8edbaf8edb8f8ecb6f7ecb4f7ebb2f7
-ebb0f7eaaef7eaacf7e9aaf7e9a7f7e8a5f7e8a3f7e7a1f7e79ff7e69df7e69bf7e599f7e597f7e4
-94f7e392f7e390f7e28ef7e28cf7e18af7e188f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7b
-f6dc79f6dc77f6db75f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d65ff6
-d55df6d55bf6d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049
-
-f8f2cbf8f1c8f8f1c6f8f0c4f8f0c2f8efc0f8efbef8eebcf8eebaf8edb8f8edb6f8ecb4f7ebb2f7
-ebb0f7eaaef7eaacf7e9aaf7e9a8f7e8a5f7e8a3f7e7a1f7e79ff7e69df7e69bf7e599f7e597f7e4
-95f7e393f7e391f7e28ef7e28cf7e18af7e188f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7b
-f6dc79f6dc77f6db75f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6
-d65ef6d55bf6d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049
-
-f8f2cbf8f1c9f8f1c7f8f0c5f8f0c3f8efc1f8efbef8eebcf8eebaf8edb8f8edb6f8ecb4f7ecb2f7
-ebb0f7eaaef7eaacf7e9aaf7e9a8f7e8a5f7e8a3f7e7a1f7e79ff7e69df7e69bf7e599f7e597f7e4
-95f7e393f7e391f7e28ff7e28df7e18af7e188f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7b
-f6dc79f6dc77f6db75f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6
-d65ef6d55cf6d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049
-
-f8f2cbf8f1c9f8f1c7f8f0c5f8f0c3f8efc1f8efbff8eebdf8eebaf8edb8f8edb6f8ecb4f7ecb2f7
-ebb0f7eaaef7eaacf7e9aaf7e9a8f7e8a5f7e8a3f7e7a1f7e79ff7e69df7e69bf7e599f7e597f7e4
-95f7e393f7e391f7e28ff7e28df7e18bf7e188f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7b
-f6dc79f6dc77f6db75f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6
-d65ef6d55cf6d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049
-
-f8f2cbf8f1c9f8f1c7f8f0c5f8f0c3f8efc1f8efbff8eebcf8eebaf8edb8f8edb6f8ecb4f7ecb2f7
-ebb0f7eaaef7eaacf7e9aaf7e9a8f7e8a5f7e8a3f7e7a1f7e79ff7e69df7e69bf7e599f7e597f7e4
-95f7e393f7e391f7e28ff7e28df7e18af7e188f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7b
-f6dc79f6dc77f6db75f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6
-d65ef6d55cf6d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049
-
-f8f2cbf8f1c9f8f1c7f8f0c5f8f0c2f8efc0f8efbef8eebcf8eebaf8edb8f8edb6f8ecb4f7ecb2f7
-ebb0f7eaaef7eaacf7e9aaf7e9a8f7e8a5f7e8a3f7e7a1f7e79ff7e69df7e69bf7e599f7e597f7e4
-95f7e393f7e391f7e28ff7e28cf7e18af7e188f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7b
-f6dc79f6dc77f6db75f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6
-d65ef6d55bf6d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049
-
-f8f2caf8f1c8f8f1c6f8f0c4f8f0c2f8efc0f8efbef8eebcf8edbaf8edb8f8ecb6f7ecb4f7ebb2f7
-ebb0f7eaaef7eaacf7e9aaf7e9a8f7e8a5f7e8a3f7e7a1f7e79ff7e69df7e69bf7e599f7e597f7e4
-95f7e393f7e390f7e28ef7e28cf7e18af7e188f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7b
-f6dc79f6dc77f6db75f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6
-d55df6d55bf6d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049
-
-f8f2caf8f1c8f8f1c6f8f0c4f8f0c2f8efc0f8efbef8eebcf8edbaf8edb8f8ecb6f7ecb4f7ebb1f7
-ebaff7eaadf7eaabf7e9a9f7e9a7f7e8a5f7e8a3f7e7a1f7e79ff7e69df7e69bf7e598f7e496f7e4
-94f7e392f7e390f7e28ef7e28cf7e18af7e188f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7b
-f6dc79f6dc77f6db74f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d761f6d65ff6
-d55df6d55bf6d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049
-
-f8f1c9f8f1c7f8f1c6f8f0c4f8efc2f8efbff8eebdf8eebbf8edb9f8edb7f8ecb5f7ecb3f7ebb1f7
-ebaff7eaadf7eaabf7e9a9f7e9a7f7e8a5f7e8a3f7e7a1f7e69ff7e69df7e59bf7e598f7e496f7e4
-94f7e392f7e390f7e28ef7e28cf7e18af7e188f7e086f7e084f7df82f7df80f6de7ff6dd7cf6dd7a
-f6dc78f6dc76f6db74f6db72f6da70f6da6ef6d96cf6d96af6d868f6d865f6d763f6d761f6d65ff6
-d55df6d55bf6d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049
-
-f8f1c9f8f1c7f8f0c5f8f0c3f8efc1f8efbff8eebdf8eebbf8edb9f8edb7f8ecb5f7ecb3f7ebb1f7
-ebaff7eaadf7eaabf7e9a9f7e9a7f7e8a4f7e7a2f7e7a0f7e69ef7e69cf7e59af7e598f7e496f7e4
-94f7e392f7e390f7e28ef7e28cf7e18af7e188f7e085f7df83f7df81f6de80f6de7ef6dd7cf6dd7a
-f6dc78f6dc76f6db74f6db72f6da70f6da6ef6d96cf6d96af6d868f6d865f6d763f6d761f6d65ff6
-d55df6d55bf6d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14af5d048
-
-f8f1c8f8f1c6f8f0c4f8f0c2f8efc0f8efbef8eebcf8eebaf8edb8f8edb6f8ecb4f7ecb2f7ebb0f7
-eaaef7eaacf7eaaaf7e9a8f7e8a6f7e8a4f7e7a2f7e7a0f7e69ef7e69cf7e59af7e598f7e496f7e4
-94f7e392f7e390f7e28ef7e28bf7e189f7e187f7e085f7df83f7df81f6de80f6de7ef6dd7cf6dd7a
-f6dc78f6dc76f6db74f6db72f6da70f6da6ef6d96cf6d96af6d867f6d765f6d763f6d661f6d65ff6
-d55df6d55bf6d459f6d457f6d355f6d352f6d250f6d24ef6d14cf5d14af5d048
-
-f8f1c7f8f0c5f8f0c3f8efc1f8efbff8eebdf8eebbf8edb9f8edb8f8ecb6f7ecb4f7ebb2f7ebb0f7
-eaaef7eaacf7e9aaf7e9a8f7e8a5f7e8a3f7e7a1f7e79ff7e69df7e69bf7e599f7e597f7e495f7e4
-93f7e391f7e38ff7e28df7e18bf7e189f7e087f7e085f7df83f7df81f6de80f6de7ef6dd7cf6dd7a
-f6dc77f6dc75f6db73f6db71f6da6ff6da6df6d96bf6d869f6d867f6d765f6d763f6d661f6d65ff6
-d55df6d55bf6d458f6d456f6d354f6d352f6d250f6d24ef6d14cf5d14af5d048
-
-f8f1c6f8f0c4f8f0c2f8efc0f8efbff8eebdf8eebbf8edb9f8edb7f8ecb5f7ecb3f7ebb1f7ebaff7
-eaadf7eaabf7e9a9f7e9a7f7e8a5f7e8a3f7e7a1f7e79ff7e69df7e69bf7e599f7e597f7e495f7e3
-93f7e391f7e28ff7e28df7e18bf7e189f7e087f7e085f7df83f7df81f6de7ff6de7df6dd7bf6dd79
-f6dc77f6dc75f6db73f6db71f6da6ff6d96df6d96bf6d869f6d867f6d765f6d763f6d661f6d65ff6
-d55df6d55bf6d458f6d456f6d354f6d352f6d250f6d14ef5d14cf5d04af5d048
-
-f8f0c5f8f0c3f8efc1f8efbff8eebdf8eebcf8edbaf8edb8f8edb6f8ecb4f7ecb2f7ebb0f7ebaef7
-eaacf7eaaaf7e9a8f7e8a6f7e8a5f7e8a3f7e7a1f7e69ff7e69df7e59bf7e598f7e496f7e494f7e3
-92f7e390f7e28ef7e28cf7e18af7e188f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7bf6dd79
-f6dc77f6dc75f6db73f6da71f6da6ff6d96df6d96bf6d868f6d866f6d764f6d762f6d660f6d65ef6
-d55cf6d55af6d458f6d456f6d354f6d352f6d250f6d14ef5d14bf5d049f5d047
-
-f8f0c4f8f0c2f8efc0f8efbef8eebdf8eebbf8edb9f8edb7f8ecb5f7ecb3f7ebb1f7ebb0f7eaaef7
-eaacf7e9aaf7e9a8f7e8a6f7e8a4f7e7a2f7e7a0f7e69ef7e69cf7e59af7e598f7e496f7e494f7e3
-92f7e390f7e28ef7e28cf7e18af7e188f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7bf6dc79
-f6dc77f6db75f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6d65ef6
-d55cf6d55af6d458f6d356f6d354f6d252f6d250f6d14ef5d14bf5d049f5d047
-
-f8f0c2f8efc1f8efbff8eebdf8eebbf8edbaf8edb8f8edb6f8ecb4f7ecb2f7ebb0f7ebaff7eaadf7
-eaabf7e9a9f7e9a7f7e8a5f7e8a3f7e7a1f7e79ff7e69df7e69bf7e599f7e597f7e495f7e493f7e3
-91f7e390f7e28ef7e28bf7e189f7e187f7e085f7df83f7df81f6de80f6de7ef6dd7cf6dd7af6dc78
-f6dc76f6db74f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6d55df6
-d55bf6d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049f5d047
-
-f8efc1f8efbff8eebdf8eebcf8eebaf8edb9f8edb7f8ecb5f7ecb3f7ebb1f7ebb0f7eaaef7eaacf7
-e9aaf7e9a8f7e8a6f7e8a4f7e7a2f7e7a1f7e69ff7e69df7e59bf7e598f7e597f7e495f7e393f7e3
-91f7e28ff7e28df7e18bf7e189f7e087f7e085f7df83f7df81f6de80f6de7ef6dd7cf6dd7af6dc78
-f6dc76f6db74f6db72f6da70f6da6ef6d96cf6d96af6d868f6d865f6d763f6d761f6d65ff6d55df6
-d55bf6d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049f5d047
-
-f8efbff8efbef8eebcf8eebbf8edb9f8edb7f8ecb6f8ecb4f7ecb2f7ebb0f7ebaef7eaadf7eaabf7
-e9a9f7e9a7f7e8a5f7e8a3f7e7a1f7e7a0f7e69ef7e69cf7e59af7e598f7e496f7e494f7e392f7e3
-90f7e28ef7e28cf7e18af7e188f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7bf6dd79f6dc77
-f6dc75f6db73f6db71f6da6ff6da6df6d96bf6d869f6d867f6d765f6d763f6d661f6d65ff6d55df6
-d55bf6d459f6d456f6d354f6d352f6d250f6d24ef6d14cf5d14af5d048f5d046
-
-f8efbef8eebcf8eebbf8edb9f8edb8f8edb6f8ecb5f7ecb3f7ebb1f7ebaff7eaaef7eaacf7e9aaf7
-e9a8f7e8a6f7e8a4f7e8a3f7e7a1f7e79ff7e69df7e69bf7e599f7e597f7e495f7e493f7e391f7e3
-90f7e28ef7e28bf7e189f7e187f7e085f7e084f7df82f7df80f6de7ff6de7df6dd7bf6dc79f6dc77
-f6db75f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6d65ef6d55cf6
-d55af6d458f6d456f6d354f6d352f6d250f6d14ef5d14cf5d04af5d048f5cf46
-
-f8eebcf8eebbf8edb9f8edb8f8edb7f8ecb5f7ecb3f7ebb2f7ebb0f7eaaef7eaacf7eaabf7e9a9f7
-e9a7f7e8a5f7e8a3f7e7a1f7e7a0f7e69ef7e69cf7e59af7e598f7e496f7e494f7e392f7e391f7e2
-8ff7e28df7e18bf7e189f7e087f7e085f7df83f7df81f6de80f6de7ef6dd7cf6dd7af6dc78f6dc76
-f6db74f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6d65ef6d55cf6
-d55af6d458f6d356f6d354f6d252f6d250f6d14ef5d14bf5d049f5d047f5cf45
-
-f8eebbf8edb9f8edb8f8edb7f8ecb5f7ecb3f7ecb2f7ebb0f7ebaef7eaadf7eaabf7e9aaf7e9a8f7
-e8a6f7e8a4f7e8a3f7e7a1f7e79ff7e69df7e69bf7e599f7e597f7e496f7e494f7e392f7e390f7e2
-8ef7e28cf7e18af7e188f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7bf6dd79f6dc77f6dc75
-f6db73f6db71f6da70f6da6ef6d96cf6d96af6d868f6d865f6d763f6d761f6d65ff6d55df6d55bf6
-d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049f5d047f5cf45
-
-f8edb9f8edb8f8edb7f8ecb5f7ecb4f7ecb2f7ebb0f7ebaff7eaadf7eaacf7e9aaf7e9a8f7e9a7f7
-e8a5f7e8a3f7e7a1f7e79ff7e69ef7e69cf7e59af7e598f7e496f7e494f7e393f7e391f7e28ff7e2
-8df7e18bf7e189f7e187f7e085f7df83f7df81f7df80f6de7ff6de7df6dd7bf6dc79f6dc77f6dc75
-f6db73f6da71f6da6ff6d96df6d96bf6d869f6d867f6d765f6d763f6d661f6d65ff6d55df6d55bf6
-d459f6d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049f5d047f5cf45
-
-f8edb7f8edb6f8ecb5f7ecb4f7ecb2f7ebb0f7ebaff7eaaef7eaacf7eaaaf7e9a9f7e9a7f7e8a5f7
-e8a4f7e7a2f7e7a0f7e69ff7e69df7e69bf7e599f7e597f7e496f7e494f7e392f7e390f7e28ef7e2
-8cf7e18af7e188f7e087f7e085f7df83f7df81f6de80f6de7ef6dd7cf6dd7af6dc78f6dc76f6db74
-f6db72f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6d65ef6d55cf6d55af6
-d458f6d456f6d354f6d352f6d250f6d24ef6d14cf5d14af5d048f5d046f5cf44
-
-f8ecb6f8ecb5f7ecb3f7ecb2f7ebb0f7ebaff7eaaef7eaacf7eaabf7e9a9f7e9a8f7e8a6f7e8a4f7
-e8a3f7e7a1f7e79ff7e69df7e69cf7e59af7e598f7e496f7e494f7e393f7e391f7e38ff7e28df7e1
-8bf7e189f7e187f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7bf6dd79f6dc77f6dc75f6db73
-f6db71f6da70f6da6ef6d96cf6d96af6d868f6d865f6d763f6d762f6d660f6d65ef6d55cf6d55af6
-d458f6d356f6d354f6d252f6d250f6d14ef5d14bf5d04af5d048f5cf46f5cf44
-
-f8ecb4f7ecb3f7ebb2f7ebb0f7ebaff7eaaef7eaacf7eaabf7e9a9f7e9a8f7e8a6f7e8a5f7e8a3f7
-e7a1f7e7a0f7e69ef7e69cf7e59bf7e599f7e597f7e495f7e494f7e392f7e390f7e28ef7e28cf7e1
-8af7e189f7e087f7e085f7df83f7df81f6de80f6de7ef6dd7cf6dd7af6dc79f6dc77f6db75f6db72
-f6da71f6da6ff6d96df6d96bf6d869f6d867f6d765f6d763f6d661f6d65ff6d55df6d55bf6d459f6
-d457f6d355f6d353f6d251f6d24ff6d14df5d14bf5d049f5d047f5cf45f5cf43
-
-f7ecb2f7ebb1f7ebb0f7ebaff7eaaef7eaacf7eaabf7e9a9f7e9a8f7e8a6f7e8a5f7e8a3f7e7a1f7
-e7a0f7e69ef7e69df7e69bf7e599f7e598f7e496f7e494f7e392f7e391f7e28ff7e28df7e18bf7e1
-89f7e187f7e086f7e084f7df82f7df80f6de7ff6de7df6dd7bf6dd79f6dc78f6dc76f6db74f6db72
-f6da70f6da6ef6d96cf6d96af6d868f6d866f6d764f6d762f6d660f6d65ef6d55df6d55bf6d458f6
-d456f6d354f6d352f6d250f6d24ef6d14df5d14bf5d049f5d047f5cf45f5cf43
-
-f7ebb1f7ebb0f7ebaef7eaadf7eaacf7eaaaf7e9a9f7e9a8f7e8a6f7e8a5f7e8a3f7e7a2f7e7a0f7
-e69ff7e69df7e69bf7e59af7e598f7e496f7e495f7e393f7e391f7e390f7e28ef7e28cf7e18af7e1
-88f7e087f7e085f7df83f7df81f6de80f6de7ef6dd7cf6dd7bf6dc79f6dc77f6dc75f6db73f6da71
-f6da6ff6da6df6d96bf6d96af6d868f6d865f6d763f6d761f6d660f6d65ef6d55cf6d55af6d458f6
-d356f6d354f6d352f6d250f6d14ef5d14cf5d04af5d048f5cf46f5cf44f5ce42
-
-Q
-Q
-Q
-Q
-q
-q
-n
-204 267 m
-268 267 l
-268 203 l
-204 203 l
-204 267 l
-h
-W
-q
-q
-[64 0 0 64 204 203]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-f5ca33f5ca31f5c92ff5c92df5c92bf5c829f5c827f5c725f5c724f5c622f5c620f5c51ef5c51cf5
-c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be
-17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb916edb816ecb716ecb616ebb516
-ebb416eab316eab316e9b216e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e4
-a915e4a815e3a715e3a615e2a515e2a515e1a415e1a315e0a215e0a115dfa014
-
-f5cb34f5ca31f5ca30f5c92ef5c92cf5c82af5c828f5c727f5c724f5c622f5c621f5c51ff5c51df5
-c41bf5c419f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2c017f2bf17f1be17f1be
-17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb616ecb616
-ebb516ebb416eab316eab216e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5
-a915e4a815e4a815e3a715e3a615e2a515e2a415e1a315e1a215e0a115e0a115
-
-f5cb34f5ca33f5ca31f5c92ff5c92df5c92bf5c829f5c827f5c725f5c723f5c622f5c620f5c51ef5
-c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be
-17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb716ecb616
-ebb516ebb416eab316eab216e9b116e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5
-aa15e4a915e4a815e3a715e3a615e2a515e2a415e1a315e1a215e0a215e0a115
-
-f5cb35f5cb34f5ca31f5ca2ff5c92ef5c92cf5c82af5c828f5c726f5c724f5c622f5c620f5c51ef5
-c51cf5c41bf5c419f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be
-17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb916edb816ecb716ecb616
-ebb516ebb416eab316eab216e9b216e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5
-aa15e4a915e4a815e3a715e3a615e2a515e2a515e1a415e1a315e0a215e0a115
-
-f5cb36f5cb34f5ca32f5ca31f5c92ff5c92df5c82bf5c829f5c727f5c725f5c723f5c621f5c51ff5
-c51df5c51cf5c41af5c418f4c317f4c217f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf
-17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb616
-ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8ae16e7ae16e6ad15e6ac15e6ab15e5
-aa15e5a915e4a815e4a715e3a715e2a615e2a515e1a415e1a315e0a215e0a115
-
-f5cc37f5cb35f5cb33f5ca31f5ca2ff5c92df5c92bf5c82af5c828f5c726f5c724f5c622f5c620f5
-c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf
-17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb716
-ecb616ebb516ebb416eab316eab216e9b116e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ab15e5
-aa15e5a915e4a915e4a815e3a715e3a615e2a515e2a415e1a315e1a215e0a115
-
-f5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5c82bf5c829f5c727f5c724f5c623f5c621f5
-c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf
-17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb916edb816ecb716
-ecb616ebb516ebb416eab316eab216e9b216e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ab15e5
-aa15e5aa15e4a915e4a815e3a715e3a615e2a515e2a415e1a315e1a215e0a215
-
-f5cc39f5cc37f5cb35f5cb33f5ca31f5ca2ff5c92df5c92bf5c829f5c827f5c725f5c723f5c622f5
-c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf
-17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716
-ecb616ecb516ebb416eab416eab316e9b216e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ac15e5
-ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a515e1a415e1a315e0a215
-
-f5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5c82af5c828f5c726f5c724f5c622f5
-c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf
-17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716
-ecb616ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6
-ab15e5aa15e5a915e4a815e4a715e3a715e2a615e2a515e1a415e1a315e0a215
-
-f5cc3af5cc38f5cb36f5cb34f5ca33f5ca31f5c92ff5c92df5c82bf5c829f5c727f5c725f5c623f5
-c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf
-17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb816
-ecb716ecb616ebb516ebb416eab316eab216e9b116e9b116e8b016e8af16e7ae16e7ad15e6ac15e6
-ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a515e2a415e1a315e1a215
-
-f5cd3bf5cc39f5cc37f5cb35f5cb33f5ca31f5ca2ff5c92df5c92bf5c829f5c827f5c726f5c724f5
-c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c0
-17f2bf17f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16edb916edb816
-ecb716ecb616ebb516ebb416eab316eab216e9b216e9b116e8b016e8af16e7ae16e7ad15e6ac15e6
-ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a515e2a415e1a315e1a215
-
-f5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5c82af5c828f5c726f5c724f5
-c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c0
-17f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816
-edb716ecb616ecb516ebb416eab416eab316e9b216e9b116e8b016e8af16e7ae16e7ad15e6ac15e6
-ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a415e1a415e1a315
-
-f5cd3cf5cc3af5cc38f5cc37f5cb35f5ca33f5ca31f5c92ff5c92df5c82bf5c829f5c727f5c725f5
-c623f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c0
-17f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816
-edb716ecb616ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8ae16e7ae16e6ad15e6
-ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a515e1a415e1a315
-
-f5cd3df5cd3bf5cc39f5cc37f5cb35f5cb34f5ca31f5ca2ff5c92df5c92bf5c829f5c827f5c725f5
-c723f5c621f5c620f5c51ef5c51cf5c41af5c418f4c317f4c217f3c217f3c117f3c117f2c017f2c0
-17f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816
-edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8af16e7ae16e7ad15e6
-ac15e6ab15e5aa15e5a915e4a815e4a715e3a715e2a615e2a515e1a415e1a315
-
-f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5c82af5c828f5c726f5
-c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c0
-17f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16edb916
-edb816ecb716ecb616ebb516ebb416eab316eab216e9b216e9b116e8b016e8af16e7ae16e7ad15e6
-ac15e6ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a515e2a415e1a315
-
-f5ce3ef5cd3cf5cc3af5cc38f5cc37f5cb35f5ca33f5ca31f5c92ff5c92df5c82bf5c829f5c727f5
-c724f5c622f5c620f5c51ef5c51cf5c41af5c419f4c317f4c317f4c217f3c217f3c117f3c117f2c0
-17f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916
-edb816edb716ecb616ecb516ebb416eab416eab316e9b216e9b116e8b016e8af16e7ae16e7ad15e6
-ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a515e2a415e1a315
-
-f5ce3ff5cd3df5cd3bf5cc39f5cc37f5cb35f5cb33f5ca31f5ca2ff5c92df5c92bf5c829f5c827f5
-c725f5c723f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c117f3c117f2c0
-17f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916
-edb816edb716ecb616ecb616ebb516ebb416eab316eab216e9b116e8b016e8af16e7ae16e7ad15e6
-ac15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a415e1a415
-
-f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5c82af5c828f5
-c726f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c217f3c217f3c117f3c117f2c0
-17f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916
-edb816edb716ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8ae16e7ae16e6
-ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a515e1a415
-
-f5ce41f5ce3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5c82af5c828f5
-c726f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c1
-17f2c017f2c017f2bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916
-edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8af16e7ae16e7
-ad15e6ac15e6ab15e5aa15e5a915e4a815e4a715e3a715e2a615e2a515e1a415
-
-f5ce41f5ce3ff5cd3df5cd3bf5cc39f5cc37f5cb35f5ca33f5ca31f5c92ff5c92df5c82bf5c829f5
-c727f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c1
-17f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16
-edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b116e8b016e8af16e7ae16e7
-ad15e6ac15e6ab15e5aa15e5a915e4a915e4a815e3a715e2a615e2a515e1a415
-
-f5ce41f5ce3ff5cd3df5cd3bf5cc39f5cc37f5cb35f5cb33f5ca31f5ca2ff5c92df5c92bf5c829f5
-c727f5c725f5c623f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c117f3c1
-17f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16
-eeb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b216e9b116e8b016e8af16e7ae16e7
-ad15e6ac15e6ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a515e2a415
-
-f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5c82af5
-c827f5c725f5c723f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c117f3c1
-17f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16
-eeb916edb816edb716ecb616ecb516ebb416eab416eab316e9b216e9b116e8b016e8af16e7ae16e7
-ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a515e2a415
-
-f5cf43f5ce41f5ce3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5c82af5
-c828f5c726f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c217f3c217f3c117f3c1
-17f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16
-eeb916edb816edb716ecb616ecb616ebb516ebb416eab316eab216e9b116e8b016e8af16e7ae16e7
-ad15e6ac15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a415
-
-f5cf43f5ce41f5ce3ff5cd3df5cd3bf5cc39f5cc37f5cb35f5ca33f5ca31f5c92ff5c92df5c82bf5
-c828f5c726f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c1
-17f3c117f2c017f2c017f2bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16
-eeb916edb816edb716ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8ae16e7
-ae16e6ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a415
-
-f5cf43f5ce41f5ce3ff5cd3df5cd3bf5cc39f5cc37f5cb35f5cb33f5ca31f5ca2ff5c92df5c82bf5
-c829f5c727f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c1
-17f3c117f2c017f2c017f2bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16
-eeb916edb916edb716ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8af16e7
-ae16e6ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a515
-
-f5cf44f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca31f5ca2ff5c92df5c92bf5
-c829f5c727f5c725f5c623f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c1
-17f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17eeba16
-eeb916edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8af16e7
-ae16e7ad15e6ac15e6ab15e5aa15e5a915e4a815e4a715e3a615e2a515e2a515
-
-f5cf44f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca31f5ca2ff5c92df5c92bf5
-c829f5c827f5c725f5c723f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c1
-17f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b116e8b016e8af16e7
-ae16e7ad15e6ac15e6ab15e5aa15e5a915e4a815e4a715e3a715e2a615e2a515
-
-f5cf45f5cf43f5ce41f5ce3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5
-c82af5c828f5c726f5c724f5c622f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c1
-17f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b216e9b116e8b016e8af16e7
-ae16e7ad15e6ac15e6ab15e5aa15e5a915e4a915e4a815e3a715e2a615e2a515
-
-f5cf45f5cf43f5ce41f5ce3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5
-c82af5c828f5c726f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c217f3c217f3c1
-17f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb816edb716ecb616ecb516ebb416eab316eab216e9b216e9b116e8b016e8af16e7
-ae16e7ad15e6ac15e6ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a515
-
-f5cf45f5cf43f5ce41f5ce3ff5cd3df5cd3bf5cc39f5cc37f5cb35f5ca33f5ca30f5c92ef5c92cf5
-c82af5c828f5c726f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c217f3c217f3c1
-17f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb816edb716ecb616ecb516ebb416eab416eab316e9b216e9b116e8b016e8af16e7
-ae16e7ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5cf45f5cf43f5ce41f5ce3ff5cd3df5cd3bf5cc39f5cc37f5cb35f5ca33f5ca31f5c92ff5c92df5
-c82bf5c829f5c727f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c2
-17f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb816edb716ecb616ecb616ebb416eab416eab316e9b216e9b116e8b016e8af16e7
-ae16e7ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5cf46f5cf44f5ce41f5ce3ff5cd3df5cd3bf5cc39f5cc37f5cb35f5cb33f5ca31f5ca2ff5c92df5
-c82bf5c829f5c727f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb816edb716ecb616ecb616ebb516ebb416eab316e9b216e9b116e8b016e8af16e7
-ae16e7ad15e6ac15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5cf46f5cf44f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc37f5cb35f5cb33f5ca31f5ca2ff5c92df5
-c92bf5c829f5c727f5c725f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb816edb716ecb616ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e7
-ae16e7ad15e6ac15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5d046f5cf44f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca31f5ca2ff5c92df5
-c92bf5c829f5c727f5c725f5c623f5c621f5c51ff5c51cf5c41af5c418f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8
-ae16e7ae16e6ac15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5d046f5cf44f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca31f5ca2ff5c92df5
-c92bf5c829f5c727f5c725f5c623f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8
-ae16e7ae16e6ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5d046f5cf44f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca31f5ca2ff5c92df5
-c92bf5c829f5c827f5c725f5c623f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8
-ae16e7ae16e6ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5d047f5cf45f5cf43f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca2ff5c92df5
-c92bf5c829f5c827f5c725f5c723f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8
-ae16e7ae16e6ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5d047f5cf45f5cf43f5ce41f5ce3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5
-c92bf5c829f5c827f5c725f5c723f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17efbc17efbb17efbb17
-eeba16eeb916edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8
-ae16e7ae16e6ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5d047f5cf45f5cf43f5ce41f5ce3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5
-c92cf5c829f5c827f5c725f5c723f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbb17efbb17
-eeba16eeb916edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8
-af16e7ae16e6ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5d047f5cf45f5cf43f5ce41f5ce3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5
-c92cf5c82af5c827f5c725f5c723f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17
-eeba16eeb916edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8
-af16e7ae16e6ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5d047f5cf45f5cf43f5ce41f5ce3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5
-c92cf5c82af5c827f5c725f5c723f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17
-eeba16eeb916edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8
-af16e7ae16e6ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5d047f5cf45f5cf43f5ce41f5ce3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5
-c92cf5c82af5c827f5c725f5c723f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17
-eeba16eeb916edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8
-af16e7ae16e6ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5d047f5cf45f5cf43f5ce41f5ce3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5
-c92cf5c829f5c827f5c725f5c723f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbb17efbb17
-eeba16eeb916edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8
-af16e7ae16e6ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5d047f5cf45f5cf43f5ce41f5ce3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5
-c92bf5c829f5c827f5c725f5c723f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbb17efbb17
-eeba16eeb916edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8
-af16e7ae16e6ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5d047f5cf45f5cf43f5ce41f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92df5
-c92bf5c829f5c827f5c725f5c723f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8
-ae16e7ae16e6ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5d047f5cf44f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca31f5ca2ff5c92df5
-c92bf5c829f5c827f5c725f5c723f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb916edb716ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8
-ae16e7ae16e6ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5d046f5cf44f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca31f5ca2ff5c92df5
-c92bf5c829f5c827f5c725f5c623f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8
-ae16e7ae16e6ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5d046f5cf44f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca31f5ca2ff5c92df5
-c92bf5c829f5c727f5c725f5c623f5c621f5c51ff5c51df5c41af5c418f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8
-ae16e7ae16e6ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5cf46f5cf44f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb33f5ca31f5ca2ff5c92df5
-c92bf5c829f5c727f5c725f5c623f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e7
-ae16e7ad15e6ac15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5cf46f5cf44f5ce42f5ce40f5cd3df5cd3bf5cc39f5cc37f5cb35f5cb33f5ca31f5ca2ff5c92df5
-c92bf5c829f5c727f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c2
-17f3c117f3c117f2c017f2c017f2bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb816edb716ecb616ecb616ebb516ebb416eab316eab216e9b116e8b016e8af16e7
-ae16e7ad15e6ac15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5cf45f5cf43f5ce41f5ce3ff5cd3df5cd3bf5cc39f5cc37f5cb35f5ca33f5ca31f5c92ff5c92df5
-c82bf5c829f5c727f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c2
-17f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb816edb716ecb616ecb616ebb516eab416eab316e9b216e9b116e8b016e8af16e7
-ae16e7ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5cf45f5cf43f5ce41f5ce3ff5cd3df5cd3bf5cc39f5cc37f5cb35f5ca33f5ca31f5c92ff5c92df5
-c82af5c828f5c726f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c217f3c217f3c1
-17f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb816edb716ecb616ecb516ebb416eab416eab316e9b216e9b116e8b016e8af16e7
-ae16e7ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a515
-
-f5cf45f5cf43f5ce41f5ce3ff5cd3df5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5
-c82af5c828f5c726f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c217f3c217f3c1
-17f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb816edb716ecb616ecb516ebb416eab416eab216e9b216e9b116e8b016e8af16e7
-ae16e7ad15e6ac15e6ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a515
-
-f5cf45f5cf43f5ce41f5ce3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5
-c82af5c828f5c726f5c724f5c622f5c620f5c51ef5c51cf5c419f4c317f4c317f4c217f3c217f3c1
-17f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16eeb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b216e9b116e8b016e8af16e7
-ae16e7ad15e6ac15e6ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a515
-
-f5cf44f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92bf5
-c829f5c827f5c725f5c723f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c1
-17f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b116e8b016e8af16e7
-ae16e7ad15e6ac15e6ab15e5aa15e5a915e4a815e4a715e3a715e2a615e2a515
-
-f5cf44f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca31f5ca2ff5c92df5c92bf5
-c829f5c827f5c725f5c623f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c1
-17f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17
-eeba16edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b116e8b016e8af16e7
-ae16e7ad15e6ac15e6ab15e5aa15e5a915e4a815e4a715e3a715e2a615e2a515
-
-f5cf43f5ce41f5ce3ff5cd3df5cd3bf5cc39f5cc37f5cb35f5cb33f5ca31f5ca2ff5c92df5c92bf5
-c829f5c727f5c725f5c623f5c621f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c1
-17f3c117f2c017f2c017f2bf17f1bf17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16
-eeb916edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8af16e7
-ae16e7ad15e6ac15e6ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a515
-
-f5cf43f5ce41f5ce3ff5cd3df5cd3bf5cc39f5cc37f5cb35f5ca33f5ca31f5c92ff5c92df5c82bf5
-c829f5c727f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c1
-17f3c117f2c017f2c017f2bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16
-eeb916edb816edb716ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8ae16e7
-ae16e6ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a415
-
-f5cf43f5ce41f5ce3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5c82af5
-c828f5c726f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c217f3c217f3c117f3c1
-17f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16
-eeb916edb816edb716ecb616ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8ae16e7
-ad15e6ac15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a415
-
-f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5c82af5
-c828f5c726f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c217f3c217f3c117f3c1
-17f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16
-eeb916edb816edb716ecb616ecb516ebb416eab416eab316e9b216e9b116e8b016e8af16e7ae16e7
-ad15e6ac15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a415
-
-f5ce42f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca31f5ca2ff5c92df5c92bf5c829f5
-c827f5c725f5c723f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c117f3c1
-17f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16
-eeb916edb816edb716ecb616ecb516ebb416eab316eab216e9b216e9b116e8b016e8af16e7ae16e7
-ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a515e2a415
-
-f5ce41f5ce3ff5cd3df5cd3bf5cc39f5cc37f5cb35f5cb33f5ca31f5ca2ff5c92df5c92bf5c829f5
-c727f5c725f5c623f5c621f5c51ff5c51df5c41bf5c419f4c317f4c317f4c217f3c217f3c117f3c1
-17f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16
-edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b216e9b116e8b016e8af16e7ae16e7
-ad15e6ac15e6ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a515e2a415
-
-f5ce41f5ce3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5c82af5c829f5
-c727f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c1
-17f2c017f2c017f2bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916
-edb916edb816ecb716ecb616ebb516ebb416eab316eab216e9b116e9b116e8b016e8af16e7ae16e7
-ad15e6ac15e6ab15e5aa15e5a915e4a815e4a715e3a715e2a615e2a515e1a415
-
-f5ce40f5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32f5ca30f5c92ef5c92cf5c82af5c828f5
-c726f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4c217f3c217f3c117f3c117f2c0
-17f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916
-edb816edb716ecb716ecb616ebb516ebb416eab316eab216e9b116e9b016e8af16e8af16e7ae16e7
-ad15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2a515e1a415
-
-Q
-Q
-Q
-Q
-q
-q
-n
-268 267 m
-332 267 l
-332 203 l
-268 203 l
-268 267 l
-h
-W
-q
-q
-[64 0 0 64 268 203]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-df9f14de9e14dd9d14dd9c14dc9b14db9a14da9914da9714d99614d89514d89414d79314d69213d6
-9113d59013d48f13d48e13d38d13d28b13d18a13d18913d08813cf8713cf8613ce8512cd8412cd83
-12cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711c47611c37511
-c37311c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6910bc6810bb6710ba6610ba6410b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714d99614d89514d79314d79213d6
-9113d59013d48f13d48e13d38d13d28c13d28b13d18913d08813cf8713cf8613ce8512cd8412cd83
-12cc8212cb8112cb8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711c47611c37511
-c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc6810bb6710ba6610ba6510b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dfa014de9f14de9e14dd9d14dc9b14dc9a14db9914da9814d99714d99614d89514d79414d79313d6
-9113d59013d58f13d48e13d38d13d28c13d28b13d18a13d08913d08713cf8613ce8513ce8412cd83
-12cc8212cb8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12c67912c57811c47611c47511
-c37411c27311c17111c17011c06f11bf6e11be6c10be6b10bd6a10bc6910bb6710bb6610ba6510b9
-6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dfa014df9f14de9e14dd9d14dc9c14dc9b14db9914da9814da9714d99614d89514d79414d79313d6
-9213d59113d58f13d48e13d38d13d38c13d28b13d18a13d08913d08813cf8713ce8513ce8412cd83
-12cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c77a12c67912c57811c47711c47511
-c37411c27311c17211c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bb6810bb6610ba6510b9
-6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14da9914da9714d99614d89514d89414d79314d6
-9213d69113d59013d48f13d38d13d38c13d28b13d18a13d18913d08813cf8713ce8613ce8512cd83
-12cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c77c12c77a12c67912c57811c57711c47611
-c37411c27311c27211c17111c06f11bf6e11bf6d10be6c10bd6a10bc6910bc6810bb6710ba6510b9
-6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a115df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714d89514d89414d79314d6
-9213d69113d59013d48f13d48e13d38d13d28b13d18a13d18913d08813cf8713cf8613ce8512cd84
-12cd8312cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711c47611
-c37511c37311c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6910bc6810bb6710ba6610b9
-6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a115dfa014de9f14de9e14dd9d14dc9b14dc9a14db9914da9814d99714d99614d89514d79414d7
-9313d69113d59013d58f13d48e13d38d13d28c13d28b13d18913d08813cf8713cf8613ce8512cd84
-12cd8312cc8212cb8112cb8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711c47611
-c37511c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc6810bb6710ba6610ba
-6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a115dfa014df9f14de9e14dd9d14dc9c14dc9b14db9914da9814da9714d99614d89514d79414d7
-9313d69213d59113d58f13d48e13d38d13d38c13d28b13d18a13d08913d08713cf8613ce8513ce84
-12cd8312cc8212cb8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12c67912c57811c47611
-c47511c37411c27311c17111c17011c06f11bf6e11be6c10be6b10bd6a10bc6810bb6710ba6610ba
-6510b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14da9914da9714d99614d89514d89414d7
-9314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d18913d08813cf8713ce8513ce84
-12cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c77a12c67912c57811c47711
-c47511c37411c27311c17211c17011c06f11bf6e11be6c10be6b10bd6a10bc6910bb6710bb6610ba
-6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a115e0a115df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714d89514d89414d7
-9314d69213d69113d59013d48f13d48e13d38d13d28b13d18a13d18913d08813cf8713ce8613ce85
-12cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c77c12c77a12c67912c57811c57711
-c47611c37411c27311c27211c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bb6810bb6610ba
-6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d99714d99614d89514d7
-9314d79213d69113d59013d48f13d48e13d38d13d28b13d18a13d18913d08813cf8713cf8613ce85
-12cd8412cd8312cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711
-c47611c37411c27311c27211c17111c06f11bf6e11bf6d10be6c10bd6a10bc6910bc6810bb6710ba
-6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a215e0a115dfa014de9f14de9e14dd9d14dc9b14dc9a14db9914da9814d99714d99614d89514d7
-9414d79313d69113d59013d58f13d48e13d38d13d28c13d28b13d18913d08813cf8713cf8613ce85
-12cd8412cd8312cc8212cb8112cb8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711
-c47611c37511c37311c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6910bc6810bb6710ba
-6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a215e0a115dfa014df9f14de9e14dd9d14dc9c14dc9b14db9914da9814da9714d99614d89514d7
-9414d79313d69213d59113d58f13d48e13d38d13d28c13d28b13d18a13d08913d08713cf8613ce85
-13ce8412cd8312cc8212cb8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12c67912c57711
-c47611c37511c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6910bc6810bb6710ba
-6610ba6410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14da9914da9714d99614d89514d8
-9414d79313d69213d59113d58f13d48e13d38d13d38c13d28b13d18a13d08913d08813cf8713ce85
-13ce8412cd8312cc8212cc8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12c67912c57811
-c47611c47511c37411c27311c17111c17011c06f11bf6d10be6c10bd6b10bd6a10bc6810bb6710ba
-6610ba6510b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a215e0a115e0a115df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714d89514d8
-9414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d18913d08813cf8713ce86
-13ce8512cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c77a12c67912c57811
-c47711c47511c37411c27311c17111c17011c06f11bf6e11be6c10be6b10bd6a10bc6910bb6710bb
-6610ba6510b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a215e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d99714d89514d8
-9414d79314d69213d69113d59013d48f13d48e13d38d13d28b13d18a13d18913d08813cf8713ce86
-13ce8512cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c77c12c77a12c67912c57811
-c47711c47511c37411c27311c17211c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bb6710bb
-6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a315e0a215e0a115dfa014de9f14de9e14dd9c14dc9b14db9a14db9914da9814d99714d99614d8
-9514d79314d79213d69113d59013d48f13d48e13d38d13d28c13d18a13d18913d08813cf8713cf86
-13ce8512cd8412cd8312cc8112cb8012ca8012ca7f12c97e12c87d12c77c12c77a12c67912c57811
-c57711c47611c37411c27311c27211c17111c06f11bf6e11be6d10be6b10bd6a10bc6910bb6810bb
-6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a315e0a215e0a115dfa014de9f14de9e14dd9d14dc9b14dc9a14db9914da9814d99714d99614d8
-9514d79414d79313d69113d59013d48f13d48e13d38d13d28c13d28b13d18913d08813cf8713cf86
-13ce8512cd8412cd8312cc8212cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912
-c57711c47611c37511c27311c27211c17111c06f11bf6e11bf6d10be6c10bd6a10bc6910bc6810bb
-6710ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dc9c14dc9b14db9914da9814da9714d99614d8
-9514d79414d79313d69113d59013d58f13d48e13d38d13d28c13d28b13d18a13d08913d08713cf86
-13ce8512cd8412cd8312cc8212cb8112cb8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912
-c57711c47611c37511c37311c27211c17111c07011c06e11bf6d10be6c10bd6a10bc6910bc6810bb
-6710ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14da9914da9714d99614d8
-9514d79414d79313d69213d59113d58f13d48e13d38d13d38c13d28b13d18a13d08913d08713cf86
-13ce8513ce8412cd8312cc8212cb8112cb8012ca8012c97e12c87d12c87c12c77b12c67a12c67912
-c57711c47611c37511c37411c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6910bc6810bb
-6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a315e1a215e0a115e0a115df9f14de9e14dd9d14dd9c14dc9b14db9a14da9914da9714d99614d8
-9514d89414d79314d69213d69113d59013d48e13d38d13d38c13d28b13d18a13d08913d08813cf87
-13ce8513ce8412cd8312cc8212cb8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12c67912
-c57811c47611c37511c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6910bc6810bb
-6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a315e1a215e0a215e0a115df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714d8
-9514d89414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d18913d08813cf87
-13ce8513ce8412cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c67a12c67912
-c57811c47611c47511c37411c27311c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc6810bb
-6710ba6610ba6510b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a315e1a215e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d99714d8
-9514d89414d79314d69213d69113d59013d48f13d48e13d38c13d28b13d18a13d18913d08813cf87
-13ce8613ce8512cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c77a12c67912
-c57811c47711c47511c37411c27311c17111c17011c06f11bf6e11be6c10be6b10bd6a10bc6810bb
-6710ba6610ba6510b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a415e1a315e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d99714d9
-9614d89514d79314d69213d69113d59013d48f13d48e13d38d13d28b13d18a13d18913d08813cf87
-13ce8613ce8512cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c77b12c77a12c67912
-c57811c47711c47511c37411c27311c17211c17011c06f11bf6e11be6c10be6b10bd6a10bc6910bb
-6710bb6610ba6510b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a415e1a315e0a215e0a115dfa014de9f14de9e14dd9d14dc9b14dc9a14db9914da9814d99714d9
-9614d89514d79314d79213d69113d59013d48f13d48e13d38d13d28b13d18a13d18913d08813cf87
-13cf8613ce8512cd8412cd8312cc8112cb8012ca8012ca7f12c97e12c87d12c77c12c77a12c67912
-c57811c47711c47511c37411c27311c17211c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bb
-6710bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e1a415e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dc9b14dc9a14db9914da9814d99714d9
-9614d89514d79414d79313d69113d59013d48f13d48e13d38d13d28c13d28b13d18913d08813cf87
-13cf8613ce8512cd8412cd8312cc8112cb8012ca8012ca7f12c97e12c87d12c77c12c77a12c67912
-c57811c57711c47611c37411c27311c17211c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bb
-6810bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e1a415e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dc9c14dc9b14db9914da9814d99714d9
-9614d89514d79414d79313d69113d59013d58f13d48e13d38d13d28c13d28b13d18913d08813cf87
-13cf8613ce8512cd8412cd8312cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12
-c57811c57711c47611c37411c27311c27211c17111c06f11bf6e11be6d10be6b10bd6a10bc6910bb
-6810bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e1a415e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dc9c14dc9b14db9914da9814da9714d9
-9614d89514d79414d79313d69113d59013d58f13d48e13d38d13d28c13d28b13d18a13d08813cf87
-13cf8613ce8512cd8412cd8312cc8212cb8112cb8012ca7f12c97e12c87d12c87c12c77b12c67a12
-c67912c57711c47611c37411c27311c27211c17111c06f11bf6e11bf6d10be6c10bd6a10bc6910bb
-6810bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14da9814da9714d9
-9614d89514d79414d79313d69213d59113d58f13d48e13d38d13d28c13d28b13d18a13d08913d087
-13cf8613ce8513cd8412cd8312cc8212cb8112cb8012ca7f12c97e12c87d12c87c12c77b12c67a12
-c67912c57711c47611c37511c37311c27211c17111c06f11bf6e11bf6d10be6c10bd6a10bc6910bc
-6810bb6710ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a315e1a215e0a115e0a115df9f14de9e14dd9d14dd9c14dc9b14db9a14da9914da9714d9
-9614d89514d79414d79313d69213d59113d58f13d48e13d38d13d38c13d28b13d18a13d08913d087
-13cf8613ce8513ce8412cd8312cc8212cb8112cb8012ca7f12c97e12c87d12c87c12c77b12c67a12
-c67912c57711c47611c37511c37311c27211c17111c07011c06e11bf6d10be6c10bd6a10bc6910bc
-6810bb6710ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a315e1a215e0a115e0a115df9f14de9e14dd9d14dd9c14dc9b14db9a14da9914da9714d9
-9614d89514d89414d79314d69213d59113d58f13d48e13d38d13d38c13d28b13d18a13d08913d087
-13cf8613ce8513ce8412cd8312cc8212cb8112cb8012ca7f12c97e12c87d12c87c12c77b12c67a12
-c67912c57711c47611c37511c37311c27211c17111c07011c06e11bf6d10be6c10bd6a10bc6910bc
-6810bb6710ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a315e1a215e0a115e0a115df9f14de9e14dd9d14dd9c14dc9b14db9a14da9914da9714d9
-9614d89514d89414d79314d69213d69113d59013d48e13d38d13d38c13d28b13d18a13d08913d088
-13cf8713ce8513ce8412cd8312cc8212cb8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12
-c67912c57711c47611c37511c37411c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6910bc
-6810bb6710ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a315e1a215e0a215e0a115df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d9
-9714d89514d89414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d08913d088
-13cf8713ce8513ce8412cd8312cc8212cb8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12
-c67912c57711c47611c37511c37411c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6910bc
-6810bb6710ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a315e1a215e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d9
-9714d89514d89414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d08913d088
-13cf8713ce8513ce8412cd8312cc8212cb8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12
-c67912c57711c47611c37511c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6910bc
-6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a315e1a215e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d9
-9714d89514d89414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d18913d088
-13cf8713ce8513ce8412cd8312cc8212cc8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12
-c67912c57811c47611c37511c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6910bc
-6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a415e1a315e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d9
-9714d89514d89414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d18913d088
-13cf8713ce8513ce8412cd8312cc8212cc8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12
-c67912c57811c47611c37511c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6910bc
-6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a415e1a315e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d9
-9714d89514d89414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d18913d088
-13cf8713ce8513ce8412cd8312cc8212cc8112cb8012ca8012c97f12c97d12c87c12c77b12c67a12
-c67912c57811c47611c47511c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6910bc
-6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a415e1a315e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d9
-9714d89514d89414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d18913d088
-13cf8713ce8613ce8412cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c67a12
-c67912c57811c47611c47511c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc
-6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a415e1a315e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d9
-9714d89514d89414d79314d69213d69113d59013d48f13d48e13d38c13d28b13d18a13d18913d088
-13cf8713ce8613ce8512cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c67a12
-c67912c57811c47611c47511c37411c27311c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc
-6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a415e1a315e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d9
-9714d89514d89414d79314d69213d69113d59013d48f13d48e13d38c13d28b13d18a13d18913d088
-13cf8713ce8613ce8512cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c67a12
-c67912c57811c47611c47511c37411c27311c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc
-6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a415e1a315e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d9
-9714d99614d89414d79314d69213d69113d59013d48f13d48e13d38d13d28b13d18a13d18913d088
-13cf8713ce8613ce8512cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c67a12
-c67912c57811c47611c47511c37411c27311c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc
-6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a415e1a315e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d9
-9714d99614d89414d79314d69213d69113d59013d48f13d48e13d38c13d28b13d18a13d18913d088
-13cf8713ce8613ce8512cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c67a12
-c67912c57811c47611c47511c37411c27311c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc
-6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a415e1a315e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d9
-9714d89514d89414d79314d69213d69113d59013d48f13d48e13d38c13d28b13d18a13d18913d088
-13cf8713ce8613ce8512cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c67a12
-c67912c57811c47611c47511c37411c27311c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc
-6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a415e1a315e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d9
-9714d89514d89414d79314d69213d69113d59013d48f13d48e13d38c13d28b13d18a13d18913d088
-13cf8713ce8613ce8512cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c67a12
-c67912c57811c47611c47511c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc
-6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a415e1a315e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d9
-9714d89514d89414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d18913d088
-13cf8713ce8613ce8412cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c67a12
-c67912c57811c47611c47511c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc
-6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a415e1a315e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d9
-9714d89514d89414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d18913d088
-13cf8713ce8513ce8412cd8312cc8212cc8112cb8012ca8012c97f12c97d12c87c12c77b12c67a12
-c67912c57811c47611c47511c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6910bc
-6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a415e1a215e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d9
-9714d89514d89414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d18913d088
-13cf8713ce8513ce8412cd8312cc8212cc8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12
-c67912c57811c47611c37511c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6910bc
-6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a315e1a215e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d9
-9714d89514d89414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d08913d088
-13cf8713ce8513ce8412cd8312cc8212cc8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12
-c67912c57711c47611c37511c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6910bc
-6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a315e1a215e0a215e0a115dfa014de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d9
-9714d89514d89414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d08913d088
-13cf8713ce8513ce8412cd8312cc8212cb8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12
-c67912c57711c47611c37511c37411c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6910bc
-6810bb6710ba6610b96410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a315e1a215e0a215e0a115df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9714d9
-9614d89514d89414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d08913d088
-13cf8713ce8513ce8412cd8312cc8212cb8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12
-c67912c57711c47611c37511c37411c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6910bc
-6810bb6710ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a315e1a215e0a115e0a115df9f14de9e14dd9d14dd9c14dc9b14db9a14da9914da9714d9
-9614d89514d89414d79314d69213d59113d58f13d48e13d38d13d38c13d28b13d18a13d08913d088
-13cf8613ce8513ce8412cd8312cc8212cb8112cb8012ca8012c97e12c87d12c87c12c77b12c67a12
-c67912c57711c47611c37511c37311c27211c17111c07011c06e11bf6d10be6c10bd6b10bc6910bc
-6810bb6710ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a315e1a215e0a115e0a115df9f14de9e14dd9d14dd9c14dc9b14db9a14da9914da9714d9
-9614d89514d79414d79313d69213d59113d58f13d48e13d38d13d38c13d28b13d18a13d08913d087
-13cf8613ce8513ce8412cd8312cc8212cb8112cb8012ca7f12c97e12c87d12c87c12c77b12c67a12
-c67912c57711c47611c37511c37311c27211c17111c07011c06e11bf6d10be6c10bd6a10bc6910bc
-6810bb6710ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e2a415e1a315e1a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14da9914da9714d9
-9614d89514d79414d79313d69213d59113d58f13d48e13d38d13d28c13d28b13d18a13d08913d087
-13cf8613ce8513ce8412cd8312cc8212cb8112cb8012ca7f12c97e12c87d12c87c12c77b12c67a12
-c67912c57711c47611c37511c37311c27211c17111c06f11bf6e11bf6d10be6c10bd6a10bc6910bc
-6810bb6710ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e1a415e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dc9c14dc9b14db9914da9814da9714d9
-9614d89514d79414d79313d69113d59013d58f13d48e13d38d13d28c13d28b13d18a13d08913d087
-13cf8613ce8512cd8412cd8312cc8212cb8112cb8012ca7f12c97e12c87d12c87c12c77b12c67a12
-c67912c57711c47611c37511c27311c27211c17111c06f11bf6e11bf6d10be6c10bd6a10bc6910bb
-6810bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e1a415e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dc9c14dc9b14db9914da9814da9714d9
-9614d89514d79414d79313d69113d59013d58f13d48e13d38d13d28c13d28b13d18913d08813cf87
-13cf8613ce8512cd8412cd8312cc8212cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12
-c67912c57711c47611c37411c27311c27211c17111c06f11bf6e11bf6d10be6b10bd6a10bc6910bb
-6810bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e1a415e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dc9c14dc9a14db9914da9814d99714d9
-9614d89514d79414d79313d69113d59013d48f13d48e13d38d13d28c13d28b13d18913d08813cf87
-13cf8613ce8512cd8412cd8312cc8112cb8012ca8012ca7f12c97e12c87d12c77c12c77a12c67912
-c57811c57711c47611c37411c27311c27211c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bb
-6810bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e1a415e1a315e0a215e0a115dfa014de9f14de9e14dd9d14dc9b14dc9a14db9914da9814d99714d9
-9614d89514d79314d79213d69113d59013d48f13d48e13d38d13d28c13d28b13d18913d08813cf87
-13cf8613ce8512cd8412cd8312cc8112cb8012ca8012ca7f12c97e12c87d12c77c12c77a12c67912
-c57811c57711c47611c37411c27311c17211c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bb
-6710bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e1a415e1a315e0a215e0a115dfa014de9f14de9e14dd9d14dc9b14db9a14db9914da9814d99714d9
-9614d89514d79314d79213d69113d59013d48f13d48e13d38d13d28b13d18a13d18913d08813cf87
-13cf8613ce8512cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c77c12c77a12c67912
-c57811c47711c47511c37411c27311c17211c17011c06f11bf6e11be6c10be6b10bd6a10bc6910bb
-6710bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-
-e1a415e1a215e0a215e0a115dfa014de9f14de9d14dd9c14dc9b14db9a14db9914da9814d99714d8
-9514d89414d79314d69213d69113d59013d48f13d48e13d38d13d28b13d18a13d18913d08813cf87
-13ce8613ce8512cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c77a12c67912
-c57811c47711c47511c37411c27311c17111c17011c06f11bf6e11be6c10be6b10bd6a10bc6910bb
-6710ba6610ba6510b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a315e1a215e0a215e0a115dfa014de9f14dd9d14dd9c14dc9b14db9a14db9914da9814d99714d8
-9514d89414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d18913d08813cf87
-13ce8613ce8412cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87c12c77b12c67a12c67912
-c57811c47611c47511c37411c27311c17111c17011c06f11bf6d10be6c10bd6b10bd6a10bc6810bb
-6710ba6610ba6510b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a315e1a215e0a115e0a115df9f14de9e14dd9d14dd9c14dc9b14db9a14da9914da9714d99614d8
-9514d89414d79314d69213d69113d59013d48f13d38d13d38c13d28b13d18a13d08913d08813cf87
-13ce8513ce8412cd8312cc8212cc8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12c67912
-c57811c47611c47511c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc6810bb
-6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14da9914da9714d99614d8
-9514d79414d79313d69213d59113d58f13d48e13d38d13d38c13d28b13d18a13d08913d08813cf86
-13ce8513ce8412cd8312cc8212cb8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12c67912
-c57711c47611c37511c37411c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6910bc6810bb
-6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dc9c14dc9b14db9914da9814da9714d99614d8
-9514d79414d79313d69213d59113d58f13d48e13d38d13d28c13d28b13d18a13d08913d08713cf86
-13ce8513ce8412cd8312cc8212cb8112cb8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912
-c57711c47611c37511c37311c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6910bc6810bb
-6710ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310
-
-e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dc9c14dc9a14db9914da9814d99714d99614d8
-9514d79414d79313d69113d59013d58f13d48e13d38d13d28c13d28b13d18913d08813cf8713cf86
-13ce8512cd8412cd8312cc8212cb8112cb8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912
-c57711c47611c37511c37311c27211c17111c06f11bf6e11bf6d10be6c10bd6a10bc6910bc6810bb
-6710ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310
-
-Q
-Q
-Q
-Q
-q
-q
-n
-12 331 m
-76 331 l
-76 267 l
-12 267 l
-12 331 l
-h
-W
-q
-q
-[64 0 0 64 12 267]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-da9814db9914db9914dc9a14dc9b14dd9c14dd9d14de9e14de9f14df9f14dfa014e0a115e0a115e0
-a215e1a315e1a315e1a415e2a515e2a515e3a615e3a615e3a715e4a815e4a815e4a915e5a915e5aa
-15e5ab15e6ab15e6ac15e6ac15e7ad15e7ae16e7ae16e8af16e8af16e8b016e9b016e9b116e9b116
-e9b216eab216eab316eab316ebb416ebb416ebb516ecb516ecb616ecb616ecb716edb716edb816ed
-b816edb916eeb916eeba16eeba16efbb17efbb17efbb17efbb17efbb17efbc17
-
-da9914db9914dc9a14dc9b14dd9c14dd9d14de9e14de9e14df9f14dfa014e0a115e0a115e0a215e1
-a315e1a315e1a415e2a515e2a515e3a615e3a615e3a715e4a815e4a815e4a915e5aa15e5aa15e5ab
-15e6ab15e6ac15e6ac15e7ad15e7ae16e7ae16e8af16e8af16e8b016e9b016e9b116e9b116eab216
-eab216eab316eab416ebb416ebb516ebb516ecb616ecb616ecb716edb716edb816edb816edb916ee
-b916eeb916eeba16eeba16efbb17efbb17efbb17efbb17efbc17efbc17f0bc17
-
-db9914dc9a14dc9b14dd9c14dd9d14de9e14de9e14df9f14dfa014e0a115e0a115e0a215e1a315e1
-a315e2a415e2a515e2a515e3a615e3a715e3a715e4a815e4a815e4a915e5aa15e5aa15e5ab15e6ab
-15e6ac15e6ad15e7ad15e7ae16e8ae16e8af16e8af16e8b016e9b116e9b116e9b216eab216eab316
-eab316ebb416ebb416ebb516ecb516ecb616ecb616ecb716edb716edb816edb816eeb916eeb916ee
-ba16eeba16efbb17efbb17efbb17efbb17efbc17efbc17f0bc17f0bc17f0bd17
-
-db9a14dc9b14dd9c14dd9d14de9d14de9e14df9f14dfa014e0a115e0a115e0a215e1a315e1a315e2
-a415e2a515e2a515e3a615e3a715e3a715e4a815e4a815e4a915e5aa15e5aa15e5ab15e6ac15e6ac
-15e6ad15e7ad15e7ae16e8ae16e8af16e8b016e9b016e9b116e9b116e9b216eab216eab316eab416
-ebb416ebb516ebb516ecb616ecb616ecb716edb716edb816edb816edb916eeb916eeba16eeba16ef
-bb17efbb17efbb17efbb17efbc17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17
-
-dc9b14dc9c14dd9d14de9d14de9e14df9f14dfa014e0a115e0a115e0a215e1a315e1a315e2a415e2
-a515e2a515e3a615e3a715e3a715e4a815e4a915e4a915e5aa15e5aa15e6ab15e6ac15e6ac15e7ad
-15e7ad15e7ae16e8af16e8af16e8b016e9b016e9b116e9b116eab216eab216eab316ebb416ebb416
-ebb516ecb516ecb616ecb616ecb716edb716edb816edb816eeb916eeb916eeba16efbb17efbb17ef
-bb17efbb17efbc17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f0bd17f1be17
-
-dc9c14dd9d14de9d14de9e14df9f14dfa014e0a115e0a115e0a215e1a315e1a315e1a415e2a515e2
-a515e3a615e3a715e3a715e4a815e4a915e4a915e5aa15e5aa15e6ab15e6ac15e6ac15e7ad15e7ae
-16e7ae16e8af16e8af16e8b016e9b016e9b116e9b216eab216eab316eab316ebb416ebb416ebb516
-ecb616ecb616ecb716edb716edb816edb816edb916eeb916eeba16eeba16efbb17efbb17efbb17ef
-bb17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f0bd17f1be17f1be17f1be17
-
-dd9c14dd9d14de9e14df9f14dfa014e0a115e0a115e0a215e1a315e1a315e1a415e2a515e2a515e3
-a615e3a715e3a715e4a815e4a915e5a915e5aa15e5aa15e6ab15e6ac15e6ac15e7ad15e7ae16e7ae
-16e8af16e8af16e8b016e9b116e9b116e9b216eab216eab316eab316ebb416ebb516ebb516ecb616
-ecb616ecb716edb716edb816edb816eeb916eeb916eeba16efbb17efbb17efbb17efbb17efbc17ef
-bc17f0bc17f0bc17f0bd17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1be17
-
-dd9d14de9e14de9f14dfa014e0a115e0a115e0a215e1a315e1a315e1a415e2a515e2a515e3a615e3
-a715e3a715e4a815e4a915e5a915e5aa15e5aa15e6ab15e6ac15e6ac15e7ad15e7ae16e7ae16e8af
-16e8af16e8b016e9b116e9b116e9b216eab216eab316eab416ebb416ebb516ecb516ecb616ecb616
-ecb716edb716edb816edb916eeb916eeba16eeba16efbb17efbb17efbb17efbc17efbc17f0bc17f0
-bc17f0bd17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1be17f1bf17f2bf17
-
-de9e14de9f14dfa014e0a115e0a115e0a215e1a215e1a315e1a415e2a515e2a515e3a615e3a715e3
-a715e4a815e4a915e5a915e5aa15e5aa15e6ab15e6ac15e6ac15e7ad15e7ae16e7ae16e8af16e8af
-16e9b016e9b116e9b116eab216eab216eab316ebb416ebb416ebb516ecb616ecb616ecb716edb716
-edb816edb816edb916eeb916eeba16eeba16efbb17efbb17efbb17efbc17efbc17f0bc17f0bd17f0
-bd17f0bd17f0bd17f1be17f1be17f1be17f1be17f1bf17f1bf17f2bf17f2bf17
-
-de9f14df9f14dfa014e0a115e0a215e1a215e1a315e1a415e2a415e2a515e3a615e3a715e3a715e4
-a815e4a915e4a915e5aa15e5aa15e6ab15e6ac15e6ac15e7ad15e7ae16e7ae16e8af16e8af16e9b0
-16e9b116e9b116eab216eab316eab316ebb416ebb416ebb516ecb616ecb616ecb716edb716edb816
-edb816eeb916eeba16eeba16efbb17efbb17efbb17efbc17efbc17f0bc17f0bc17f0bd17f0bd17f0
-bd17f0bd17f1be17f1be17f1be17f1bf17f1bf17f2bf17f2bf17f2c017f2c017
-
-df9f14dfa014e0a115e0a215e1a215e1a315e1a415e2a415e2a515e2a615e3a615e3a715e4a815e4
-a915e4a915e5aa15e5aa15e6ab15e6ac15e6ac15e7ad15e7ae16e8ae16e8af16e8b016e9b016e9b1
-16e9b116eab216eab316eab316ebb416ebb416ebb516ecb616ecb616ecb716edb716edb816edb916
-eeb916eeba16eeba16efbb17efbb17efbb17efbc17efbc17f0bc17f0bd17f0bd17f0bd17f0bd17f1
-be17f1be17f1be17f1be17f1bf17f2bf17f2bf17f2c017f2c017f2c017f2c017
-
-dfa014e0a115e0a215e1a215e1a315e1a415e2a415e2a515e2a615e3a615e3a715e4a815e4a815e4
-a915e5aa15e5aa15e6ab15e6ac15e6ac15e7ad15e7ae16e8ae16e8af16e8b016e9b016e9b116e9b1
-16eab216eab316eab316ebb416ebb516ebb516ecb616ecb616ecb716edb716edb816edb916eeb916
-eeba16efbb17efbb17efbb17efbb17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1
-be17f1be17f1bf17f2bf17f2bf17f2c017f2c017f2c017f2c017f3c117f3c117
-
-e0a115e0a115e0a215e1a315e1a415e2a415e2a515e2a615e3a615e3a715e4a815e4a815e4a915e5
-aa15e5aa15e6ab15e6ac15e6ac15e7ad15e7ae16e8ae16e8af16e8b016e9b016e9b116e9b216eab2
-16eab316eab316ebb416ebb516ecb516ecb616ecb616edb716edb816edb816eeb916eeb916eeba16
-efbb17efbb17efbb17efbc17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1
-bf17f1bf17f2bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c117f3c117
-
-e0a115e0a215e1a315e1a315e2a415e2a515e2a515e3a615e3a715e4a815e4a815e4a915e5aa15e5
-aa15e6ab15e6ac15e6ac15e7ad15e7ae16e7ae16e8af16e8b016e9b016e9b116e9b216eab216eab3
-16eab316ebb416ebb516ecb516ecb616ecb716edb716edb816edb816eeb916eeba16eeba16efbb17
-efbb17efbb17efbc17efbc17f0bc17f0bd17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1bf17f2
-bf17f2bf17f2c017f2c017f2c017f2c017f3c117f3c117f3c117f3c117f3c217
-
-e0a215e1a215e1a315e1a415e2a515e2a515e3a615e3a715e4a715e4a815e4a915e5aa15e5aa15e5
-ab15e6ac15e6ac15e7ad15e7ae16e7ae16e8af16e8b016e9b016e9b116e9b216eab216eab316eab4
-16ebb416ebb516ecb516ecb616ecb716edb716edb816edb816eeb916eeba16eeba16efbb17efbb17
-efbb17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1be17f1bf17f2bf17f2
-bf17f2c017f2c017f2c017f3c117f3c117f3c117f3c117f3c217f3c217f4c217
-
-e1a215e1a315e1a415e2a515e2a515e3a615e3a715e4a715e4a815e4a915e5a915e5aa15e5ab15e6
-ac15e6ac15e7ad15e7ae16e7ae16e8af16e8b016e9b016e9b116e9b216eab216eab316eab416ebb4
-16ebb516ecb516ecb616ecb716edb716edb816edb916eeb916eeba16eeba16efbb17efbb17efbb17
-efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf17f2bf17f2c017f2
-c017f2c017f2c017f3c117f3c117f3c117f3c217f3c217f4c217f4c217f4c317
-
-e1a315e1a415e2a415e2a515e3a615e3a715e3a715e4a815e4a915e5a915e5aa15e5ab15e6ab15e6
-ac15e7ad15e7ae16e7ae16e8af16e8af16e9b016e9b116e9b216eab216eab316eab416ebb416ebb5
-16ecb516ecb616ecb716edb716edb816edb916eeb916eeba16eeba16efbb17efbb17efbc17efbc17
-f0bc17f0bd17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf17f2bf17f2c017f2c017f2
-c017f3c117f3c117f3c117f3c117f3c217f3c217f4c217f4c317f4c317f4c317
-
-e1a415e2a415e2a515e2a615e3a615e3a715e4a815e4a915e5a915e5aa15e5ab15e6ab15e6ac15e7
-ad15e7ad15e7ae16e8af16e8af16e9b016e9b116e9b116eab216eab316eab316ebb416ebb516ecb5
-16ecb616ecb716edb716edb816edb916eeb916eeba16efbb17efbb17efbb17efbc17efbc17f0bc17
-f0bd17f0bd17f0bd17f1be17f1be17f1be17f1bf17f1bf17f2bf17f2c017f2c017f2c017f2c017f3
-c117f3c117f3c117f3c217f3c217f4c217f4c217f4c317f4c317f4c317f5c418
-
-e2a415e2a515e2a515e3a615e3a715e4a815e4a815e4a915e5aa15e5aa15e6ab15e6ac15e6ad15e7
-ad15e7ae16e8af16e8af16e8b016e9b116e9b116eab216eab316eab316ebb416ebb516ecb516ecb6
-16ecb716edb716edb816edb916eeb916eeba16efbb17efbb17efbb17efbc17efbc17f0bc17f0bd17
-f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3
-c117f3c117f3c217f4c217f4c217f4c317f4c317f4c317f5c418f5c418f5c41a
-
-e2a515e2a515e3a615e3a715e4a715e4a815e4a915e5aa15e5aa15e6ab15e6ac15e6ac15e7ad15e7
-ae16e8af16e8af16e8b016e9b116e9b116eab216eab316eab316ebb416ebb516ecb516ecb616ecb7
-16edb716edb816edb916eeb916eeba16efbb17efbb17efbb17efbc17efbc17f0bc17f0bd17f0bd17
-f0bd17f1be17f1be17f1be17f1bf17f2bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c117f3
-c217f3c217f4c217f4c217f4c317f4c317f4c317f5c418f5c419f5c41af5c41b
-
-e2a515e3a615e3a715e3a715e4a815e4a915e5aa15e5aa15e6ab15e6ac15e6ac15e7ad15e7ae16e8
-af16e8af16e8b016e9b116e9b116eab216eab316eab316ebb416ebb516ecb516ecb616ecb716edb7
-16edb816edb916eeb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17
-f1be17f1be17f1be17f1bf17f2bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c117f3c217f3
-c217f4c217f4c317f4c317f4c317f5c418f5c419f5c41af5c41bf5c51cf5c51d
-
-e2a615e3a615e3a715e4a815e4a915e5a915e5aa15e5ab15e6ac15e6ac15e7ad15e7ae16e8ae16e8
-af16e8b016e9b116e9b116e9b216eab216eab316ebb416ebb516ecb516ecb616ecb716edb716edb8
-16edb916eeb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f1be17
-f1be17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c117f3c117f3c217f4c217f4
-c217f4c317f4c317f4c317f5c418f5c419f5c41af5c51cf5c51df5c51ef5c51f
-
-e3a615e3a715e4a815e4a915e5a915e5aa15e5ab15e6ab15e6ac15e7ad15e7ae16e7ae16e8af16e8
-b016e9b016e9b116e9b216eab216eab316ebb416ebb416ebb516ecb616ecb716edb716edb816edb9
-16eeb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17
-f1bf17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c117f3c217f3c217f4c217f4c317f4
-c317f4c317f5c418f5c419f5c41af5c41bf5c51cf5c51df5c51ef5c620f5c620
-
-e3a715e4a715e4a815e4a915e5aa15e5aa15e6ab15e6ac15e6ad15e7ad15e7ae16e8af16e8af16e9
-b016e9b116e9b216eab216eab316ebb416ebb416ebb516ecb616ecb716edb716edb816edb916eeb9
-16eeba16efbb17efbb17efbb17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1bf17
-f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c117f3c217f3c217f4c217f4c317f4c317f4
-c317f5c418f5c419f5c41af5c51cf5c51df5c51ef5c51ff5c620f5c621f5c622
-
-e3a715e4a815e4a915e5aa15e5aa15e6ab15e6ac15e6ac15e7ad15e7ae16e8af16e8af16e8b016e9
-b116e9b216eab216eab316eab416ebb416ebb516ecb616ecb616edb716edb816edb916eeb916eeba
-16efbb17efbb17efbb17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1bf17f2bf17
-f2bf17f2c017f2c017f2c017f3c117f3c117f3c117f3c217f4c217f4c217f4c317f4c317f4c317f5
-c418f5c41af5c41bf5c51cf5c51df5c51ef5c620f5c621f5c622f5c623f5c724
-
-e4a815e4a915e5a915e5aa15e5ab15e6ac15e6ac15e7ad15e7ae16e8ae16e8af16e8b016e9b116e9
-b116eab216eab316eab416ebb416ebb516ecb616ecb616ecb716edb816edb816eeb916eeba16efbb
-17efbb17efbb17efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2bf17
-f2c017f2c017f2c017f3c117f3c117f3c117f3c217f4c217f4c217f4c317f4c317f5c418f5c419f5
-c41af5c41bf5c51cf5c51ef5c51ff5c620f5c621f5c622f5c724f5c725f5c726
-
-e4a815e4a915e5aa15e5ab15e6ab15e6ac15e7ad15e7ae16e7ae16e8af16e8b016e9b116e9b116ea
-b216eab316eab316ebb416ebb516ecb616ecb616ecb716edb816edb816eeb916eeba16eeba16efbb
-17efbb17efbc17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2bf17f2c017
-f2c017f2c017f3c117f3c117f3c117f3c217f4c217f4c317f4c317f4c317f5c418f5c419f5c41af5
-c51cf5c51df5c51ef5c51ff5c620f5c622f5c623f5c724f5c725f5c727f5c828
-
-e4a915e5aa15e5aa15e6ab15e6ac15e6ad15e7ad15e7ae16e8af16e8b016e9b016e9b116e9b216ea
-b216eab316ebb416ebb516ecb516ecb616ecb716edb716edb816eeb916eeba16eeba16efbb17efbb
-17efbc17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2bf17f2c017f2c017
-f2c017f3c117f3c117f3c217f3c217f4c217f4c317f4c317f4c317f5c418f5c419f5c41bf5c51cf5
-c51df5c51ef5c620f5c621f5c622f5c723f5c724f5c726f5c727f5c828f5c829
-
-e5a915e5aa15e5ab15e6ac15e6ac15e7ad15e7ae16e8af16e8af16e9b016e9b116e9b216eab216ea
-b316ebb416ebb416ebb516ecb616ecb716edb716edb816edb916eeb916eeba16efbb17efbb17efbc
-17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2bf17f2c017f2c017f2c017
-f3c117f3c117f3c217f3c217f4c217f4c317f4c317f4c317f5c418f5c41af5c41bf5c51cf5c51ef5
-c51ff5c620f5c621f5c623f5c724f5c725f5c727f5c828f5c829f5c82af5c92b
-
-e5aa15e5ab15e6ab15e6ac15e7ad15e7ae16e8ae16e8af16e8b016e9b116e9b116eab216eab316ea
-b416ebb416ebb516ecb616ecb616edb716edb816edb916eeb916eeba16efbb17efbb17efbb17efbc
-17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2bf17f2c017f2c017f2c017f3c117
-f3c117f3c217f3c217f4c217f4c317f4c317f4c317f5c418f5c41af5c41bf5c51cf5c51ef5c51ff5
-c620f5c622f5c623f5c724f5c726f5c727f5c828f5c829f5c82bf5c92cf5c92d
-
-e5aa15e6ab15e6ac15e6ad15e7ad15e7ae16e8af16e8b016e9b016e9b116eab216eab316eab316eb
-b416ebb516ecb616ecb616edb716edb816edb916eeb916eeba16efbb17efbb17efbb17efbc17f0bc
-17f0bd17f0bd17f0bd17f1be17f1be17f1bf17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117
-f3c217f3c217f4c217f4c317f4c317f4c317f5c419f5c41af5c41bf5c51df5c51ef5c51ff5c621f5
-c622f5c723f5c724f5c726f5c827f5c829f5c82af5c92bf5c92cf5c92df5c92f
-
-e5ab15e6ac15e6ac15e7ad15e7ae16e8af16e8af16e9b016e9b116e9b216eab216eab316ebb416eb
-b516ecb516ecb616ecb716edb816edb816eeb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bd
-17f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c217
-f3c217f4c217f4c317f4c317f4c317f5c419f5c41af5c51cf5c51df5c51ef5c620f5c621f5c622f5
-c724f5c725f5c726f5c828f5c829f5c82af5c92bf5c92df5c92ef5ca2ff5ca30
-
-e6ab15e6ac15e7ad15e7ae16e8ae16e8af16e8b016e9b116e9b116eab216eab316ebb416ebb416eb
-b516ecb616ecb716edb716edb816eeb916eeba16eeba16efbb17efbb17efbc17f0bc17f0bc17f0bd
-17f0bd17f1be17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c217f3c217
-f4c217f4c317f4c317f4c317f5c419f5c41af5c51cf5c51df5c51ef5c620f5c621f5c622f5c724f5
-c725f5c727f5c828f5c829f5c82bf5c92cf5c92df5c92ef5ca2ff5ca31f5ca32
-
-e6ac15e6ad15e7ad15e7ae16e8af16e8b016e9b116e9b116eab216eab316eab416ebb416ebb516ec
-b616ecb616edb716edb816edb916eeb916eeba16efbb17efbb17efbc17efbc17f0bc17f0bd17f0bd
-17f1be17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c217f3c217f4c217
-f4c317f4c317f4c317f5c419f5c41af5c51cf5c51df5c51ef5c620f5c621f5c623f5c724f5c725f5
-c727f5c828f5c829f5c92bf5c92cf5c92df5c92ff5ca30f5ca31f5ca32f5cb34
-
-e6ac15e7ad15e7ae16e8af16e8af16e9b016e9b116e9b216eab216eab316ebb416ebb516ecb616ec
-b616ecb716edb816edb916eeb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be
-17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c217f3c217f4c217f4c317
-f4c317f4c317f5c419f5c41af5c51cf5c51df5c51ff5c620f5c622f5c623f5c724f5c726f5c727f5
-c829f5c82af5c92bf5c92df5c92ef5ca2ff5ca30f5ca31f5ca33f5cb34f5cb36
-
-e7ad15e7ae16e8ae16e8af16e8b016e9b116e9b116eab216eab316ebb416ebb416ecb516ecb616ec
-b716edb716edb816eeb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1be
-17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c117f3c217f4c217f4c317f4c317
-f4c317f5c419f5c41af5c51cf5c51df5c51ff5c620f5c622f5c623f5c724f5c726f5c827f5c829f5
-c82af5c92bf5c92df5c92ef5ca2ff5ca31f5ca32f5cb33f5cb35f5cb36f5cc37
-
-e7ad15e7ae16e8af16e8b016e9b016e9b116eab216eab316eab416ebb416ebb516ecb616ecb716ed
-b716edb816edb916eeba16eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be
-17f1bf17f2bf17f2bf17f2c017f2c017f3c117f3c117f3c117f3c217f4c217f4c317f4c317f4c317
-f5c419f5c41af5c51cf5c51df5c51ff5c620f5c622f5c623f5c724f5c726f5c827f5c829f5c82af5
-c92bf5c92df5c92ef5ca30f5ca31f5ca32f5cb34f5cb35f5cb36f5cc38f5cc39
-
-e7ae16e8af16e8af16e9b016e9b116e9b216eab216eab316ebb416ebb516ecb616ecb616edb716ed
-b816edb916eeb916eeba16efbb17efbb17efbc17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1be
-17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c117f3c217f4c217f4c317f4c317f4c317f5c418
-f5c41af5c51cf5c51df5c51ef5c620f5c622f5c623f5c724f5c726f5c827f5c829f5c82af5c92cf5
-c92df5c92ff5ca30f5ca31f5ca33f5cb34f5cb35f5cc37f5cc38f5cc39f5cc3a
-
-e7ae16e8af16e8b016e9b116e9b116eab216eab316ebb416ebb416ebb516ecb616ecb716edb716ed
-b816eeb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1be17f1bf
-17f2bf17f2c017f2c017f2c017f3c117f3c117f3c217f4c217f4c217f4c317f4c317f5c418f5c41a
-f5c51cf5c51df5c51ef5c620f5c622f5c623f5c724f5c726f5c827f5c829f5c82af5c92cf5c92df5
-c92ff5ca30f5ca31f5ca33f5cb34f5cb36f5cc37f5cc38f5cc3af5cd3bf5cd3c
-
-e8af16e8af16e9b016e9b116e9b216eab316eab316ebb416ebb516ecb616ecb616edb716edb816ed
-b916eeba16eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1bf17f2bf
-17f2c017f2c017f2c017f3c117f3c117f3c217f4c217f4c217f4c317f4c317f5c418f5c41af5c41b
-f5c51df5c51ef5c620f5c621f5c623f5c724f5c726f5c827f5c829f5c82bf5c92cf5c92df5c92ff5
-ca30f5ca31f5cb33f5cb34f5cb36f5cc37f5cc38f5cc3af5cd3bf5cd3cf5cd3e
-
-e8af16e8b016e9b116e9b116eab216eab316ebb416ebb516ecb516ecb616ecb716edb816edb916ee
-b916eeba16efbb17efbb17efbc17f0bc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2bf
-17f2c017f2c017f3c117f3c117f3c217f3c217f4c217f4c317f4c317f5c418f5c41af5c41bf5c51d
-f5c51ef5c620f5c621f5c623f5c724f5c726f5c827f5c829f5c82bf5c92cf5c92df5c92ff5ca30f5
-ca32f5cb33f5cb35f5cb36f5cc37f5cc39f5cc3af5cd3bf5cd3df5cd3ef5ce3f
-
-e8b016e9b016e9b116eab216eab316eab416ebb416ebb516ecb616ecb716edb716edb816eeb916ee
-ba16efbb17efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf17f2c0
-17f2c017f3c117f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c419f5c41bf5c51cf5c51e
-f5c620f5c621f5c622f5c724f5c726f5c827f5c829f5c82af5c92cf5c92df5c92ff5ca30f5ca32f5
-cb33f5cb35f5cb36f5cc38f5cc39f5cc3af5cd3cf5cd3df5ce3ef5ce40f5ce41
-
-e8b016e9b116e9b216eab216eab316ebb416ebb516ecb616ecb616edb716edb816edb916eeb916ee
-ba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c0
-17f2c017f3c117f3c117f3c217f4c217f4c317f4c317f4c317f5c419f5c41af5c51cf5c51ef5c51f
-f5c621f5c622f5c724f5c726f5c827f5c829f5c82af5c92cf5c92df5c92ff5ca30f5ca32f5cb33f5
-cb35f5cb36f5cc38f5cc39f5cc3af5cd3cf5cd3df5ce3ef5ce40f5ce41f5cf43
-
-e9b016e9b116eab216eab316eab416ebb416ebb516ecb616ecb716edb816edb816eeb916eeba16ef
-bb17efbb17efbc17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c0
-17f3c117f3c117f3c217f4c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51df5c51ff5c620
-f5c622f5c724f5c725f5c727f5c829f5c82af5c92cf5c92df5c92ff5ca30f5ca32f5cb33f5cb35f5
-cb36f5cc38f5cc39f5cc3af5cd3cf5cd3df5ce3ff5ce40f5ce41f5cf43f5cf44
-
-e9b116e9b216eab216eab316ebb416ebb516ecb616ecb616edb716edb816eeb916eeba16efbb17ef
-bb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c1
-17f3c117f3c217f3c217f4c217f4c317f4c317f5c418f5c41af5c41bf5c51df5c51ff5c620f5c622
-f5c724f5c725f5c727f5c828f5c82af5c92bf5c92df5c92ff5ca30f5ca31f5cb33f5cb35f5cb36f5
-cc38f5cc39f5cc3af5cd3cf5cd3ef5ce3ff5ce40f5ce42f5cf43f5cf45f5cf46
-
-e9b116eab216eab316ebb416ebb416ecb516ecb616ecb716edb816edb916eeb916eeba16efbb17ef
-bb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c1
-17f3c117f3c217f4c217f4c317f4c317f5c418f5c419f5c41bf5c51df5c51ef5c620f5c622f5c723
-f5c725f5c727f5c828f5c82af5c92bf5c92df5c92ef5ca30f5ca31f5cb33f5cb35f5cb36f5cc38f5
-cc39f5cc3af5cd3cf5cd3ef5ce3ff5ce41f5ce42f5cf43f5cf45f5d046f5d047
-
-e9b216eab216eab316ebb416ebb516ecb616ecb716edb716edb816eeb916eeba16efbb17efbb17ef
-bb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c1
-17f3c217f4c217f4c317f4c317f4c317f5c419f5c41af5c51cf5c51ef5c620f5c621f5c623f5c724
-f5c726f5c828f5c829f5c92bf5c92df5c92ef5ca30f5ca31f5ca33f5cb34f5cb36f5cc38f5cc39f5
-cc3af5cd3cf5cd3ef5ce3ff5ce41f5ce42f5cf43f5cf45f5d046f5d047f5d049
-
-eab216eab316ebb416ebb516ecb516ecb616ecb716edb816edb916eeb916eeba16efbb17efbb17ef
-bc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c2
-17f3c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c51ff5c621f5c622f5c724f5c726
-f5c827f5c829f5c82bf5c92cf5c92ef5ca2ff5ca31f5ca33f5cb34f5cb36f5cc38f5cc39f5cc3af5
-cd3cf5cd3ef5ce3ff5ce41f5ce42f5cf43f5cf45f5d046f5d048f5d049f5d14b
-
-eab216eab316ebb416ebb516ecb616ecb716edb716edb816eeb916eeba16efbb17efbb17efbc17ef
-bc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c2
-17f4c217f4c317f4c317f5c418f5c41af5c41bf5c51df5c51ef5c620f5c622f5c724f5c725f5c727
-f5c829f5c82af5c92cf5c92df5ca2ff5ca31f5ca32f5cb34f5cb36f5cc37f5cc39f5cc3af5cd3cf5
-cd3df5ce3ff5ce41f5ce42f5cf43f5cf45f5d046f5d048f5d049f5d14bf5d14c
-
-eab316ebb416ebb516ecb516ecb616ecb716edb816edb916eeb916eeba16efbb17efbb17efbc17f0
-bc17f0bd17f0bd17f1be17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c2
-17f4c317f4c317f4c317f5c419f5c41bf5c51cf5c51ef5c620f5c622f5c723f5c725f5c727f5c828
-f5c82af5c92bf5c92df5ca2ff5ca31f5ca32f5cb34f5cb36f5cc37f5cc38f5cc3af5cd3cf5cd3df5
-ce3ff5ce41f5ce42f5cf43f5cf45f5d046f5d048f5d049f5d14bf6d14cf6d14e
-
-eab316ebb416ebb516ecb616ecb716edb716edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0
-bc17f0bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c117f3c217f4c2
-17f4c317f4c317f5c418f5c41af5c51cf5c51ef5c51ff5c621f5c623f5c724f5c726f5c828f5c829
-f5c92bf5c92df5c92ff5ca30f5ca32f5cb34f5cb35f5cc37f5cc38f5cc3af5cd3cf5cd3df5ce3ef5
-ce40f5ce42f5cf43f5cf45f5d046f5d048f5d049f5d14bf6d14cf6d14ef6d24f
-
-ebb416ebb516ecb516ecb616ecb716edb816edb916eeb916eeba16efbb17efbb17efbc17f0bc17f0
-bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c217f4c217f4c3
-17f4c317f5c418f5c41af5c41bf5c51df5c51ff5c620f5c622f5c724f5c726f5c827f5c829f5c82b
-f5c92cf5c92ef5ca30f5ca31f5cb33f5cb35f5cb36f5cc38f5cc3af5cd3bf5cd3df5ce3ef5ce40f5
-ce42f5cf43f5cf45f5d046f5d048f5d049f5d14bf6d14cf6d14ef6d24ff6d251
-
-ebb416ebb516ecb616ecb716edb716edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0bc17f0
-bd17f0bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f3c217f4c217f4c3
-17f4c317f5c419f5c41af5c51cf5c51ef5c620f5c622f5c723f5c725f5c727f5c829f5c82af5c92c
-f5c92df5ca2ff5ca31f5ca33f5cb34f5cb36f5cc38f5cc39f5cd3bf5cd3cf5cd3ef5ce40f5ce41f5
-cf43f5cf45f5d046f5d048f5d049f5d14bf6d14cf6d14ef6d24ff6d251f6d352
-
-ebb416ecb516ecb616ecb716edb816edb916eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0
-bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c3
-17f5c418f5c41af5c51cf5c51df5c51ff5c621f5c622f5c724f5c726f5c828f5c82af5c92bf5c92d
-f5c92ff5ca31f5ca32f5cb34f5cb36f5cc37f5cc39f5cc3af5cd3cf5cd3ef5ce3ff5ce41f5cf43f5
-cf44f5cf46f5d047f5d049f5d14bf6d14cf6d14ef6d24ff6d251f6d352f6d354
-
-ebb516ecb616ecb716edb716edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0bc17f0bd17f0
-bd17f1be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c217f4c317f4c3
-17f5c419f5c41bf5c51df5c51ef5c620f5c622f5c724f5c726f5c827f5c829f5c82bf5c92df5c92e
-f5ca30f5ca32f5cb34f5cb35f5cc37f5cc38f5cc3af5cd3cf5cd3ef5ce3ff5ce41f5cf43f5cf44f5
-cf46f5d047f5d049f5d14af5d14cf6d14ef6d24ff6d251f6d352f6d354f6d355
-
-ebb516ecb616ecb716edb816edb916eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1
-be17f1be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c4
-18f5c41af5c51cf5c51ef5c620f5c621f5c623f5c725f5c727f5c829f5c82af5c92cf5c92ef5ca2f
-f5ca31f5ca33f5cb35f5cb36f5cc38f5cc3af5cd3bf5cd3df5ce3ff5ce41f5ce42f5cf44f5cf45f5
-d047f5d049f5d14af5d14cf6d14ef6d24ff6d250f6d352f6d354f6d355f6d456
-
-ecb616ecb616edb716edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0bc17f0bd17f0bd17f1
-be17f1be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c4
-19f5c41bf5c51df5c51ff5c620f5c622f5c724f5c726f5c828f5c829f5c92bf5c92df5c92ff5ca31
-f5ca32f5cb34f5cb36f5cc38f5cc39f5cd3bf5cd3cf5ce3ef5ce40f5ce42f5cf43f5cf45f5d047f5
-d048f5d04af5d14bf6d14df6d24ff6d250f6d352f6d354f6d355f6d456f6d458
-
-ecb616ecb716edb816edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1
-be17f1bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c4
-1af5c51cf5c51ef5c620f5c622f5c723f5c725f5c727f5c829f5c82bf5c92cf5c92ef5ca30f5ca31
-f5cb34f5cb35f5cc37f5cc39f5cc3af5cd3cf5cd3ef5ce40f5ce41f5cf43f5cf45f5d046f5d048f5
-d049f5d14bf6d14df6d24ef6d250f6d252f6d353f6d355f6d456f6d458f6d459
-
-ecb616edb716edb816edb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1
-be17f1bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c4
-1bf5c51df5c51ff5c621f5c622f5c724f5c726f5c828f5c82af5c92cf5c92df5ca2ff5ca31f5ca33
-f5cb34f5cb36f5cc38f5cc3af5cd3cf5cd3df5ce3ff5ce41f5cf43f5cf44f5cf46f5d047f5d049f5
-d14bf6d14cf6d14ef6d250f6d251f6d353f6d354f6d456f6d458f6d459f6d55b
-
-ecb716edb716edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1
-bf17f2bf17f2c017f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c5
-1cf5c51ef5c620f5c622f5c724f5c725f5c827f5c829f5c92bf5c92df5c92ff5ca30f5ca32f5cb34
-f5cb36f5cc38f5cc39f5cd3bf5cd3df5ce3ef5ce40f5ce42f5cf44f5cf45f5d047f5d049f5d14af5
-d14cf6d14ef6d250f6d251f6d353f6d354f6d456f6d458f6d459f6d55bf6d55c
-
-ecb716edb816edb916eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1
-bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c41bf5c5
-1df5c51ff5c621f5c623f5c724f5c727f5c828f5c82af5c92cf5c92ef5ca2ff5ca31f5cb33f5cb35
-f5cc37f5cc38f5cc3af5cd3cf5cd3ef5ce40f5ce41f5cf43f5cf45f5d047f5d048f5d04af5d14bf6
-d14df6d24ff6d251f6d352f6d354f6d356f6d457f6d459f6d55bf6d55cf6d65e
-
-edb716edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f0bd17f1be17f1be17f2
-bf17f2bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c5
-1ef5c620f5c622f5c724f5c726f5c827f5c829f5c92bf5c92df5c92ff5ca31f5ca32f5cb34f5cb36
-f5cc38f5cc3af5cd3bf5cd3df5ce3ff5ce41f5cf43f5cf44f5cf46f5d048f5d049f5d14bf6d14df6
-d24ef6d250f6d352f6d354f6d355f6d457f6d458f6d55af6d55cf6d55df6d65f
-
-edb816edb816eeb916eeba16efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2
-bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c41bf5c51df5c5
-1ff5c621f5c623f5c724f5c727f5c828f5c82af5c92cf5c92ef5ca30f5ca31f5cb34f5cb35f5cc37
-f5cc39f5cc3af5cd3cf5cd3ef5ce40f5ce42f5cf43f5cf45f5d047f5d049f5d14bf6d14cf6d14ef6
-d250f6d252f6d353f6d355f6d456f6d458f6d55af6d55bf6d55df6d65ff6d660
-
-edb816edb916eeba16efbb17efbb17efbb17efbc17f0bc17f0bd17f0bd17f1be17f1be17f1bf17f2
-bf17f2c017f2c017f3c117f3c117f3c217f4c217f4c317f4c317f5c418f5c41af5c51cf5c51ef5c6
-20f5c622f5c724f5c726f5c827f5c829f5c92bf5c92df5c92ff5ca31f5ca33f5cb34f5cb36f5cc38
-f5cc3af5cd3cf5cd3df5ce3ff5ce41f5cf43f5cf45f5d046f5d048f5d04af5d14cf6d14ef6d24ff6
-d251f6d353f6d354f6d456f6d458f6d459f6d55bf6d55df6d65ef6d660f6d762
-
-Q
-Q
-Q
-Q
-q
-q
-n
-76 331 m
-140 331 l
-140 267 l
-76 267 l
-76 331 l
-h
-W
-q
-q
-[64 0 0 64 76 267]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-efbc17f0bc17f0bc17f0bd17f0bd17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1be17f1be17f1
-be17f1bf17f1bf17f2bf17f2bf17f2bf17f2c017f2c017f2c017f2c017f2c017f2c017f2c017f2c0
-17f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c217
-f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3
-c217f3c217f3c217f3c217f3c217f3c217f3c217f3c217f3c117f3c117f3c117
-
-f0bc17f0bd17f0bd17f0bd17f0bd17f0bd17f1be17f1be17f1be17f1be17f1be17f1bf17f1bf17f2
-bf17f2bf17f2bf17f2c017f2c017f2c017f2c017f2c017f2c017f2c017f3c117f3c117f3c117f3c1
-17f3c117f3c117f3c117f3c117f3c117f3c217f3c217f3c217f3c217f3c217f3c217f3c217f4c217
-f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4
-c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217f3c217f3c217f3c217
-
-f0bd17f0bd17f0bd17f1be17f1be17f1be17f1be17f1be17f1bf17f1bf17f2bf17f2bf17f2bf17f2
-c017f2c017f2c017f2c017f2c017f2c017f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c1
-17f3c217f3c217f3c217f3c217f3c217f4c217f4c217f4c217f4c217f4c217f4c217f4c217f4c317
-f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4
-c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c217f4c217
-
-f0bd17f1be17f1be17f1be17f1be17f1be17f1bf17f1bf17f2bf17f2bf17f2bf17f2c017f2c017f2
-c017f2c017f2c017f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c217f3c217f3c217f3c2
-17f4c217f4c217f4c217f4c217f4c217f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317
-f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4
-c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317
-
-f1be17f1be17f1be17f1be17f1bf17f1bf17f2bf17f2bf17f2c017f2c017f2c017f2c017f2c017f3
-c117f3c117f3c117f3c117f3c117f3c117f3c117f3c217f3c217f3c217f4c217f4c217f4c217f4c2
-17f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f5c418f5c418f5c418
-f5c418f5c418f5c418f5c419f5c419f5c419f5c419f5c419f5c419f5c419f5c419f5c419f5c419f5
-c419f5c419f5c419f5c419f5c419f5c418f5c418f5c418f5c418f5c418f4c317
-
-f1be17f1be17f1bf17f1bf17f2bf17f2bf17f2c017f2c017f2c017f2c017f2c017f3c117f3c117f3
-c117f3c117f3c117f3c117f3c217f3c217f3c217f4c217f4c217f4c217f4c317f4c317f4c317f4c3
-17f4c317f4c317f4c317f4c317f5c418f5c418f5c418f5c419f5c419f5c419f5c41af5c41af5c41a
-f5c41af5c41af5c41bf5c41bf5c41bf5c41bf5c41bf5c41bf5c41bf5c41bf5c41bf5c41bf5c41bf5
-c41bf5c41bf5c41bf5c41bf5c41bf5c41af5c41af5c41af5c41af5c41af5c41a
-
-f1bf17f2bf17f2bf17f2bf17f2c017f2c017f2c017f2c017f3c117f3c117f3c117f3c117f3c117f3
-c117f3c217f3c217f3c217f4c217f4c217f4c217f4c317f4c317f4c317f4c317f4c317f4c317f5c4
-18f5c418f5c418f5c419f5c419f5c41af5c41af5c41af5c41bf5c41bf5c41bf5c51cf5c51cf5c51c
-f5c51cf5c51cf5c51df5c51df5c51df5c51df5c51df5c51df5c51df5c51df5c51df5c51df5c51df5
-c51df5c51df5c51df5c51df5c51df5c51cf5c51cf5c51cf5c51cf5c51cf5c51c
-
-f2bf17f2bf17f2c017f2c017f2c017f2c017f3c117f3c117f3c117f3c117f3c117f3c217f3c217f3
-c217f4c217f4c217f4c217f4c317f4c317f4c317f4c317f4c317f4c317f5c418f5c418f5c419f5c4
-1af5c41af5c41af5c41bf5c41bf5c51cf5c51cf5c51cf5c51df5c51df5c51df5c51ef5c51ef5c51e
-f5c51ef5c51ef5c51ff5c51ff5c51ff5c51ff5c51ff5c51ff5c51ff5c51ff5c51ff5c51ff5c51ff5
-c51ff5c51ff5c51ff5c51ff5c51ff5c51ff5c51ef5c51ef5c51ef5c51ef5c51e
-
-f2c017f2c017f2c017f2c017f3c117f3c117f3c117f3c117f3c117f3c217f3c217f4c217f4c217f4
-c217f4c317f4c317f4c317f4c317f4c317f5c418f5c418f5c419f5c419f5c41af5c41af5c41bf5c5
-1cf5c51cf5c51cf5c51df5c51df5c51ef5c51ef5c51ef5c51ff5c51ff5c51ff5c620f5c620f5c620
-f5c620f5c620f5c621f5c621f5c621f5c621f5c621f5c621f5c621f5c621f5c621f5c621f5c621f5
-c621f5c621f5c621f5c621f5c621f5c621f5c620f5c620f5c620f5c620f5c620
-
-f2c017f2c017f3c117f3c117f3c117f3c117f3c217f3c217f3c217f4c217f4c217f4c317f4c317f4
-c317f4c317f4c317f5c418f5c418f5c419f5c41af5c41af5c41bf5c41bf5c51cf5c51cf5c51df5c5
-1ef5c51ef5c51ef5c51ff5c51ff5c620f5c620f5c620f5c621f5c621f5c622f5c622f5c622f5c622
-f5c622f5c623f5c623f5c623f5c723f5c723f5c723f5c723f5c724f5c724f5c724f5c724f5c723f5
-c723f5c723f5c723f5c723f5c623f5c623f5c622f5c622f5c622f5c622f5c622
-
-f3c117f3c117f3c117f3c117f3c217f3c217f3c217f4c217f4c217f4c317f4c317f4c317f4c317f4
-c317f5c418f5c419f5c41af5c41af5c41bf5c51cf5c51cf5c51df5c51df5c51ef5c51ef5c51ff5c6
-20f5c620f5c620f5c621f5c621f5c622f5c622f5c622f5c623f5c723f5c724f5c724f5c724f5c724
-f5c724f5c725f5c725f5c725f5c725f5c725f5c725f5c726f5c726f5c726f5c726f5c726f5c726f5
-c725f5c725f5c725f5c725f5c725f5c725f5c724f5c724f5c724f5c724f5c724
-
-f3c117f3c117f3c217f3c217f3c217f4c217f4c217f4c317f4c317f4c317f4c317f5c418f5c418f5
-c419f5c41af5c41bf5c51cf5c51cf5c51df5c51ef5c51ef5c51ff5c51ff5c620f5c620f5c621f5c6
-22f5c622f5c622f5c623f5c723f5c724f5c724f5c724f5c725f5c725f5c726f5c726f5c726f5c727
-f5c727f5c727f5c727f5c827f5c827f5c827f5c827f5c828f5c828f5c828f5c828f5c828f5c828f5
-c828f5c827f5c827f5c827f5c727f5c727f5c727f5c727f5c726f5c726f5c726
-
-f3c217f3c217f3c217f4c217f4c217f4c317f4c317f4c317f4c317f5c418f5c419f5c41af5c41af5
-c41bf5c51cf5c51df5c51df5c51ef5c51ff5c51ff5c620f5c621f5c621f5c622f5c622f5c623f5c7
-24f5c724f5c724f5c725f5c725f5c726f5c726f5c727f5c727f5c827f5c828f5c828f5c828f5c829
-f5c829f5c829f5c829f5c829f5c829f5c829f5c82af5c82af5c82af5c82af5c82af5c82af5c82af5
-c82af5c829f5c829f5c829f5c829f5c829f5c829f5c829f5c828f5c828f5c828
-
-f3c217f4c217f4c217f4c317f4c317f4c317f4c317f5c418f5c419f5c41af5c41bf5c51cf5c51cf5
-c51df5c51ef5c51ef5c51ff5c620f5c621f5c621f5c622f5c622f5c723f5c724f5c724f5c725f5c7
-26f5c726f5c727f5c727f5c827f5c828f5c828f5c829f5c829f5c829f5c82af5c82af5c82af5c82b
-f5c82bf5c92bf5c92bf5c92bf5c92bf5c92bf5c92cf5c92cf5c92cf5c92cf5c92cf5c92cf5c92cf5
-c92cf5c92cf5c92bf5c92bf5c92bf5c92bf5c92bf5c82bf5c82bf5c82af5c82a
-
-f4c217f4c317f4c317f4c317f4c317f5c418f5c419f5c41af5c41bf5c51cf5c51cf5c51df5c51ef5
-c51ff5c620f5c620f5c621f5c622f5c622f5c723f5c724f5c724f5c725f5c726f5c727f5c727f5c8
-27f5c828f5c829f5c829f5c829f5c82af5c82af5c82bf5c92bf5c92bf5c92cf5c92cf5c92cf5c92d
-f5c92df5c92df5c92df5c92df5c92df5c92ef5c92ef5c92ef5c92ef5c92ef5c92ef5c92ef5c92ef5
-c92ef5c92ef5c92df5c92df5c92df5c92df5c92df5c92df5c92df5c92cf5c92c
-
-f4c317f4c317f4c317f5c418f5c419f5c41af5c41bf5c51cf5c51df5c51ef5c51ef5c51ff5c620f5
-c621f5c622f5c622f5c723f5c724f5c724f5c725f5c726f5c727f5c827f5c828f5c829f5c829f5c8
-29f5c82af5c82bf5c92bf5c92bf5c92cf5c92cf5c92df5c92df5c92df5c92ef5c92ef5c92ef5c92f
-f5ca2ff5ca2ff5ca2ff5ca2ff5ca2ff5ca30f5ca30f5ca30f5ca30f5ca30f5ca30f5ca30f5ca30f5
-ca30f5ca30f5ca30f5ca2ff5ca2ff5ca2ff5ca2ff5c92ff5c92ff5c92ef5c92e
-
-f4c317f5c418f5c419f5c41af5c41bf5c51cf5c51df5c51ef5c51ef5c620f5c620f5c621f5c622f5
-c623f5c724f5c724f5c725f5c726f5c727f5c827f5c828f5c829f5c829f5c82af5c82bf5c92bf5c9
-2bf5c92cf5c92df5c92df5c92df5c92ef5c92ef5c92ff5ca2ff5ca2ff5ca30f5ca30f5ca30f5ca31
-f5ca31f5ca31f5ca31f5ca31f5ca32f5ca32f5ca32f5ca32f5ca32f5ca32f5ca32f5ca32f5ca32f5
-ca32f5ca32f5ca32f5ca31f5ca31f5ca31f5ca31f5ca31f5ca31f5ca30f5ca30
-
-f5c419f5c41af5c41bf5c51cf5c51df5c51ef5c51ff5c620f5c620f5c621f5c622f5c623f5c724f5
-c725f5c726f5c726f5c727f5c828f5c829f5c829f5c82af5c82bf5c92bf5c92cf5c92df5c92df5c9
-2df5c92ef5c92ff5ca2ff5ca2ff5ca30f5ca30f5ca31f5ca31f5ca31f5ca32f5ca32f5ca33f5ca33
-f5cb33f5cb33f5cb34f5cb34f5cb34f5cb34f5cb34f5cb34f5cb34f5cb34f5cb34f5cb34f5cb34f5
-cb34f5cb34f5cb34f5cb34f5cb34f5cb34f5cb33f5cb33f5ca33f5ca32f5ca32
-
-f5c41af5c51cf5c51cf5c51ef5c51ef5c620f5c620f5c621f5c622f5c723f5c724f5c725f5c726f5
-c727f5c827f5c828f5c829f5c82af5c82bf5c92bf5c92cf5c92df5c92df5c92ef5c92ef5ca2ff5ca
-2ff5ca30f5ca31f5ca31f5ca31f5ca32f5ca32f5ca33f5cb33f5cb34f5cb34f5cb34f5cb35f5cb35
-f5cb35f5cb35f5cb36f5cb36f5cb36f5cb36f5cb36f5cb36f5cb36f5cb36f5cb36f5cb36f5cb36f5
-cb36f5cb36f5cb36f5cb36f5cb36f5cb36f5cb35f5cb35f5cb35f5cb34f5cb34
-
-f5c51cf5c51df5c51ef5c51ff5c620f5c621f5c622f5c723f5c724f5c725f5c726f5c727f5c828f5
-c829f5c829f5c82af5c92bf5c92cf5c92df5c92df5c92ef5c92ff5ca2ff5ca30f5ca30f5ca31f5ca
-31f5ca32f5ca33f5cb33f5cb34f5cb34f5cb34f5cb35f5cb35f5cb36f5cb36f5cb36f5cc37f5cc37
-f5cc37f5cc38f5cc38f5cc38f5cc38f5cc38f5cc38f5cc38f5cc38f5cc38f5cc38f5cc38f5cc38f5
-cc38f5cc38f5cc38f5cc38f5cc38f5cc38f5cc37f5cc37f5cc37f5cb36f5cb36
-
-f5c51ef5c51ff5c620f5c621f5c622f5c723f5c724f5c725f5c726f5c727f5c828f5c829f5c82af5
-c82bf5c92bf5c92cf5c92df5c92ef5c92ef5ca2ff5ca30f5ca31f5ca31f5ca32f5ca32f5cb33f5cb
-34f5cb34f5cb35f5cb35f5cb36f5cb36f5cc37f5cc37f5cc38f5cc38f5cc38f5cc38f5cc39f5cc39
-f5cc39f5cc3af5cc3af5cc3af5cc3af5cc3af5cc3af5cc3af5cc3af5cc3af5cc3af5cc3af5cc3af5
-cc3af5cc3af5cc3af5cc3af5cc3af5cc3af5cc39f5cc39f5cc39f5cc38f5cc38
-
-f5c620f5c621f5c622f5c623f5c724f5c725f5c726f5c727f5c828f5c829f5c82af5c82bf5c92bf5
-c92cf5c92df5c92ef5c92ff5ca2ff5ca30f5ca31f5ca32f5ca32f5cb33f5cb34f5cb34f5cb35f5cb
-36f5cb36f5cc37f5cc37f5cc38f5cc38f5cc39f5cc39f5cc3af5cc3af5cc3af5cc3af5cd3bf5cd3b
-f5cd3bf5cd3cf5cd3cf5cd3cf5cd3cf5cd3cf5cd3cf5cd3cf5cd3cf5cd3cf5cd3cf5cd3cf5cd3cf5
-cd3cf5cd3cf5cd3cf5cd3cf5cd3cf5cd3cf5cd3bf5cd3bf5cd3bf5cd3bf5cc3a
-
-f5c622f5c623f5c724f5c725f5c726f5c727f5c828f5c829f5c82af5c82bf5c92cf5c92df5c92df5
-c92ef5ca2ff5ca30f5ca31f5ca31f5ca32f5cb33f5cb34f5cb34f5cb35f5cb36f5cb36f5cc37f5cc
-38f5cc38f5cc39f5cc39f5cc3af5cc3af5cd3bf5cd3bf5cd3cf5cd3cf5cd3cf5cd3cf5cd3df5cd3d
-f5cd3df5cd3ef5cd3ef5cd3ef5cd3ef5ce3ef5ce3ef5ce3ef5ce3ef5ce3ef5ce3ef5ce3ef5ce3ef5
-ce3ef5ce3ef5cd3ef5cd3ef5cd3ef5cd3ef5cd3ef5cd3df5cd3df5cd3df5cd3c
-
-f5c723f5c724f5c726f5c727f5c828f5c829f5c82af5c82bf5c92cf5c92df5c92df5c92ef5ca2ff5
-ca30f5ca31f5ca32f5ca33f5cb34f5cb34f5cb35f5cb36f5cb36f5cc37f5cc38f5cc38f5cc39f5cc
-3af5cc3af5cd3bf5cd3bf5cd3cf5cd3cf5cd3df5cd3df5cd3ef5cd3ef5cd3ef5ce3ef5ce3ff5ce3f
-f5ce3ff5ce40f5ce40f5ce40f5ce40f5ce41f5ce41f5ce41f5ce41f5ce41f5ce41f5ce41f5ce41f5
-ce41f5ce41f5ce41f5ce40f5ce40f5ce40f5ce40f5ce3ff5ce3ff5ce3ff5ce3e
-
-f5c725f5c727f5c827f5c829f5c829f5c82bf5c92bf5c92df5c92df5c92ef5ca2ff5ca30f5ca31f5
-ca32f5cb33f5cb34f5cb35f5cb36f5cb36f5cc37f5cc38f5cc38f5cc39f5cc3af5cc3af5cd3bf5cd
-3cf5cd3cf5cd3df5cd3df5cd3ef5cd3ef5ce3ff5ce3ff5ce40f5ce40f5ce41f5ce41f5ce41f5ce41
-f5ce41f5ce42f5ce42f5ce42f5ce42f5cf43f5cf43f5cf43f5cf43f5cf43f5cf43f5cf43f5cf43f5
-cf43f5cf43f5cf43f5ce42f5ce42f5ce42f5ce42f5ce41f5ce41f5ce41f5ce41
-
-f5c727f5c828f5c829f5c82af5c92bf5c92cf5c92df5c92ef5ca2ff5ca30f5ca31f5ca32f5cb33f5
-cb34f5cb35f5cb36f5cb36f5cc37f5cc38f5cc39f5cc3af5cc3af5cd3bf5cd3cf5cd3cf5cd3df5cd
-3ef5cd3ef5ce3ff5ce3ff5ce40f5ce40f5ce41f5ce41f5ce42f5ce42f5cf43f5cf43f5cf43f5cf43
-f5cf44f5cf44f5cf44f5cf44f5cf45f5cf45f5cf45f5cf45f5cf45f5cf45f5cf45f5cf45f5cf45f5
-cf45f5cf45f5cf45f5cf44f5cf44f5cf44f5cf44f5cf43f5cf43f5cf43f5cf43
-
-f5c829f5c82af5c92bf5c92cf5c92df5c92ef5ca2ff5ca30f5ca31f5ca32f5cb33f5cb34f5cb35f5
-cb36f5cc37f5cc38f5cc38f5cc39f5cc3af5cd3bf5cd3cf5cd3cf5cd3df5cd3ef5ce3ef5ce3ff5ce
-40f5ce40f5ce41f5ce41f5ce42f5ce42f5cf43f5cf43f5cf44f5cf44f5cf45f5cf45f5cf45f5cf45
-f5cf46f5cf46f5d046f5d046f5d047f5d047f5d047f5d047f5d047f5d047f5d047f5d047f5d047f5
-d047f5d047f5d047f5d046f5d046f5d046f5cf46f5cf45f5cf45f5cf45f5cf45
-
-f5c82bf5c92cf5c92df5c92ef5ca2ff5ca30f5ca31f5ca32f5cb33f5cb34f5cb35f5cb36f5cc37f5
-cc38f5cc39f5cc3af5cc3af5cd3bf5cd3cf5cd3df5cd3ef5cd3ef5ce3ff5ce40f5ce40f5ce41f5ce
-42f5ce42f5cf43f5cf43f5cf44f5cf44f5cf45f5cf45f5cf46f5d046f5d047f5d047f5d047f5d047
-f5d048f5d048f5d048f5d048f5d049f5d049f5d049f5d049f5d049f5d049f5d049f5d049f5d049f5
-d049f5d049f5d049f5d049f5d048f5d048f5d048f5d047f5d047f5d047f5d047
-
-f5c92cf5c92df5c92ff5ca2ff5ca31f5ca32f5ca33f5cb34f5cb35f5cb36f5cc37f5cc38f5cc39f5
-cc3af5cc3af5cd3bf5cd3cf5cd3df5cd3ef5ce3ef5ce3ff5ce40f5ce41f5ce42f5ce42f5cf43f5cf
-43f5cf44f5cf45f5cf45f5cf46f5d046f5d047f5d047f5d048f5d048f5d049f5d049f5d049f5d049
-f5d04af5d04af5d14af5d14af5d14bf5d14bf5d14bf5d14bf5d14bf5d14bf5d14bf5d14bf5d14bf5
-d14bf5d14bf5d14bf5d14bf5d14af5d14af5d04af5d049f5d049f5d049f5d049
-
-f5c92ef5ca2ff5ca30f5ca31f5ca32f5cb34f5cb35f5cb36f5cc37f5cc38f5cc39f5cc3af5cc3af5
-cd3cf5cd3cf5cd3df5cd3ef5ce3ff5ce40f5ce41f5ce41f5ce42f5cf43f5cf43f5cf44f5cf45f5cf
-45f5d046f5d047f5d047f5d048f5d048f5d049f5d049f5d04af5d14af5d14bf5d14bf5d14bf5d14b
-f5d14cf6d14cf6d14cf6d14df6d14df6d14df6d14df6d14df6d14df6d14df6d14df6d14df6d14df6
-d14df6d14df6d14df6d14df6d14cf6d14cf5d14cf5d14cf5d14bf5d14bf5d14b
-
-f5ca30f5ca31f5ca32f5cb33f5cb34f5cb35f5cb36f5cc38f5cc38f5cc3af5cc3af5cd3cf5cd3cf5
-cd3df5cd3ef5ce3ff5ce40f5ce41f5ce42f5cf43f5cf43f5cf44f5cf45f5cf45f5d046f5d047f5d0
-47f5d048f5d049f5d049f5d04af5d14af5d14bf5d14bf5d14cf6d14cf6d14df6d14df6d14ef6d14e
-f6d14ef6d24ef6d24ef6d24ff6d24ff6d24ff6d24ff6d24ff6d24ff6d24ff6d24ff6d24ff6d24ff6
-d24ff6d24ff6d24ff6d24ff6d24ef6d24ef6d14ef6d14ef6d14ef6d14df6d14d
-
-f5ca31f5ca33f5cb34f5cb35f5cb36f5cc37f5cc38f5cc39f5cc3af5cd3bf5cd3cf5cd3df5cd3ef5
-ce3ff5ce40f5ce41f5ce42f5cf43f5cf44f5cf45f5cf45f5cf46f5d047f5d047f5d048f5d049f5d0
-49f5d14af5d14bf5d14bf5d14cf6d14cf6d14df6d14ef6d14ef6d24ef6d24ff6d24ff6d250f6d250
-f6d250f6d250f6d250f6d251f6d251f6d251f6d251f6d251f6d251f6d251f6d251f6d251f6d251f6
-d251f6d251f6d251f6d251f6d251f6d250f6d250f6d250f6d250f6d24ff6d24f
-
-f5cb33f5cb34f5cb36f5cc37f5cc38f5cc39f5cc3af5cd3bf5cd3cf5cd3df5cd3ef5ce3ff5ce40f5
-ce41f5ce42f5cf43f5cf44f5cf45f5cf45f5d046f5d047f5d048f5d049f5d049f5d14af5d14bf5d1
-4bf6d14cf6d14df6d14ef6d14ef6d24ef6d24ff6d250f6d250f6d250f6d251f6d251f6d252f6d252
-f6d352f6d352f6d352f6d353f6d353f6d353f6d353f6d353f6d353f6d353f6d354f6d353f6d353f6
-d353f6d353f6d353f6d353f6d353f6d352f6d352f6d352f6d252f6d251f6d251
-
-f5cb35f5cb36f5cc37f5cc38f5cc3af5cd3bf5cd3cf5cd3df5cd3ef5ce3ff5ce40f5ce41f5ce42f5
-cf43f5cf44f5cf45f5cf46f5d047f5d047f5d048f5d049f5d04af5d14bf5d14bf6d14cf6d14df6d1
-4ef6d14ef6d24ff6d24ff6d250f6d250f6d251f6d252f6d352f6d352f6d353f6d353f6d354f6d354
-f6d354f6d354f6d354f6d355f6d355f6d355f6d355f6d355f6d356f6d356f6d356f6d356f6d355f6
-d355f6d355f6d355f6d355f6d355f6d354f6d354f6d354f6d354f6d353f6d353
-
-f5cc37f5cc38f5cc39f5cc3af5cd3bf5cd3cf5cd3ef5ce3ef5ce40f5ce41f5ce42f5cf43f5cf44f5
-cf45f5cf46f5d047f5d047f5d049f5d049f5d14af5d14bf5d14cf6d14df6d14ef6d14ef6d24ff6d2
-50f6d250f6d251f6d251f6d352f6d352f6d353f6d354f6d354f6d354f6d355f6d355f6d356f6d456
-f6d456f6d456f6d457f6d457f6d457f6d457f6d457f6d457f6d458f6d458f6d458f6d458f6d458f6
-d457f6d457f6d457f6d457f6d457f6d456f6d456f6d456f6d356f6d355f6d355
-
-f5cc38f5cc3af5cd3bf5cd3cf5cd3df5cd3ef5ce3ff5ce41f5ce41f5cf43f5cf44f5cf45f5cf46f5
-d047f5d047f5d049f5d049f5d14af5d14bf5d14cf6d14df6d14ef6d24ef6d24ff6d250f6d251f6d2
-52f6d352f6d353f6d353f6d354f6d354f6d355f6d356f6d456f6d456f6d457f6d457f6d458f6d458
-f6d458f6d458f6d459f6d459f6d459f6d459f6d459f6d55af6d55af6d55af6d55af6d55af6d55af6
-d459f6d459f6d459f6d459f6d459f6d458f6d458f6d458f6d458f6d457f6d457
-
-f5cc3af5cd3bf5cd3cf5cd3ef5ce3ff5ce40f5ce41f5ce42f5cf43f5cf44f5cf45f5d047f5d047f5
-d048f5d049f5d14af5d14bf6d14cf6d14df6d14ef6d24ff6d250f6d250f6d251f6d352f6d353f6d3
-53f6d354f6d355f6d355f6d456f6d456f6d457f6d458f6d458f6d458f6d459f6d459f6d55af6d55a
-f6d55af6d55bf6d55bf6d55bf6d55bf6d55bf6d55bf6d55cf6d55cf6d55cf6d55cf6d55cf6d55cf6
-d55cf6d55bf6d55bf6d55bf6d55bf6d55bf6d55bf6d55af6d55af6d459f6d459
-
-f5cd3cf5cd3df5cd3ef5ce3ff5ce41f5ce42f5cf43f5cf44f5cf45f5d046f5d047f5d048f5d049f5
-d14af5d14bf6d14cf6d14df6d14ef6d24ff6d250f6d251f6d252f6d352f6d353f6d354f6d355f6d3
-55f6d456f6d457f6d457f6d458f6d458f6d459f6d55af6d55af6d55bf6d55bf6d55bf6d55cf6d55c
-f6d55df6d55df6d55df6d55df6d55df6d55df6d65ef6d65ef6d65ef6d65ef6d65ef6d65ef6d65ef6
-d65ef6d55df6d55df6d55df6d55df6d55df6d55df6d55cf6d55cf6d55bf6d55b
-
-f5cd3df5ce3ef5ce40f5ce41f5ce42f5cf43f5cf45f5cf46f5d047f5d048f5d049f5d04af5d14bf5
-d14cf6d14df6d14ef6d24ff6d250f6d251f6d252f6d353f6d354f6d354f6d355f6d456f6d456f6d4
-57f6d458f6d458f6d459f6d55af6d55bf6d55bf6d55cf6d55cf6d55df6d55df6d55df6d65ef6d65e
-f6d65ff6d65ff6d65ff6d65ff6d65ff6d65ff6d660f6d660f6d660f6d660f6d660f6d660f6d660f6
-d660f6d660f6d65ff6d65ff6d65ff6d65ff6d65ff6d65ef6d65ef6d55df6d55d
-
-f5ce3ff5ce40f5ce41f5cf43f5cf44f5cf45f5d046f5d047f5d049f5d049f5d14bf5d14cf6d14df6
-d14ef6d24ff6d250f6d251f6d352f6d353f6d354f6d354f6d355f6d456f6d457f6d458f6d458f6d4
-59f6d55af6d55bf6d55bf6d55cf6d55df6d55df6d65ef6d65ef6d65ff6d65ff6d65ff6d660f6d660
-f6d661f6d661f6d661f6d761f6d761f6d762f6d762f6d762f6d762f6d762f6d762f6d762f6d762f6
-d762f6d762f6d761f6d761f6d661f6d661f6d661f6d660f6d660f6d660f6d65f
-
-f5ce41f5ce42f5cf43f5cf45f5cf46f5d047f5d048f5d049f5d14af5d14bf6d14df6d14ef6d24ff6
-d250f6d251f6d252f6d353f6d354f6d354f6d356f6d456f6d457f6d458f6d459f6d55af6d55bf6d5
-5bf6d55cf6d55df6d55df6d65ef6d65ff6d65ff6d660f6d660f6d661f6d661f6d761f6d762f6d762
-f6d763f6d763f6d763f6d763f6d763f6d764f6d764f6d764f6d764f6d764f6d764f6d764f6d764f6
-d764f6d764f6d763f6d763f6d763f6d763f6d763f6d762f6d762f6d762f6d761
-
-f5ce42f5cf43f5cf45f5d046f5d047f5d049f5d04af5d14bf5d14cf6d14df6d24ef6d250f6d250f6
-d252f6d352f6d354f6d354f6d356f6d456f6d457f6d458f6d459f6d55af6d55bf6d55cf6d55df6d5
-5df6d65ef6d65ff6d65ff6d660f6d661f6d661f6d761f6d762f6d763f6d763f6d763f6d764f6d764
-f6d765f6d765f6d765f6d865f6d865f6d866f6d866f6d866f6d866f6d866f6d866f6d866f6d866f6
-d866f6d866f6d866f6d865f6d865f6d765f6d765f6d764f6d764f6d764f6d763
-
-f5cf44f5cf45f5d047f5d048f5d049f5d14af5d14bf6d14df6d14ef6d24ff6d250f6d251f6d352f6
-d353f6d354f6d355f6d456f6d457f6d458f6d459f6d55af6d55bf6d55cf6d55df6d65ef6d65ef6d6
-5ff6d660f6d661f6d761f6d762f6d763f6d763f6d763f6d764f6d765f6d765f6d865f6d866f6d866
-f6d867f6d867f6d867f6d868f6d868f6d868f6d868f6d868f6d868f6d868f6d868f6d868f6d868f6
-d868f6d868f6d868f6d868f6d868f6d867f6d867f6d866f6d866f6d866f6d865
-
-f5cf45f5d047f5d048f5d049f5d14bf5d14cf6d14df6d24ef6d250f6d251f6d352f6d353f6d354f6
-d355f6d456f6d457f6d458f6d459f6d55af6d55bf6d55cf6d55df6d65ef6d65ff6d65ff6d660f6d6
-61f6d762f6d763f6d763f6d764f6d765f6d765f6d865f6d866f6d867f6d867f6d868f6d868f6d868
-f6d869f6d869f6d869f6d96af6d96af6d96af6d96af6d96af6d96af6d96af6d96af6d96af6d96af6
-d96af6d96af6d96af6d96af6d96af6d869f6d869f6d869f6d868f6d868f6d868
-
-f5d047f5d049f5d04af5d14bf6d14cf6d14ef6d24ff6d250f6d251f6d352f6d354f6d355f6d356f6
-d457f6d458f6d459f6d55af6d55bf6d55cf6d55df6d65ef6d65ff6d660f6d661f6d761f6d762f6d7
-63f6d764f6d765f6d765f6d866f6d866f6d867f6d868f6d868f6d869f6d869f6d96af6d96af6d96a
-f6d96bf6d96bf6d96bf6d96cf6d96cf6d96cf6d96cf6d96cf6d96cf6d96cf6d96cf6d96cf6d96cf6
-d96cf6d96cf6d96cf6d96cf6d96cf6d96bf6d96bf6d96bf6d96af6d96af6d96a
-
-f5d049f5d04af5d14bf6d14df6d14ef6d24ff6d250f6d252f6d353f6d354f6d355f6d456f6d458f6
-d458f6d55af6d55bf6d55cf6d55df6d65ef6d65ff6d660f6d661f6d761f6d763f6d763f6d764f6d7
-65f6d866f6d866f6d867f6d868f6d868f6d869f6d96af6d96af6d96bf6d96bf6d96cf6d96cf6d96c
-f6d96df6da6df6da6ef6da6ef6da6ef6da6ef6da6ef6da6ef6da6ef6da6ef6da6ef6da6ef6da6ef6
-da6ef6da6ef6da6ef6da6ef6da6ef6da6df6d96df6d96df6d96cf6d96cf6d96c
-
-f5d14af5d14bf6d14df6d24ef6d250f6d251f6d352f6d353f6d354f6d356f6d457f6d458f6d459f6
-d55bf6d55bf6d55df6d65ef6d65ff6d660f6d661f6d762f6d763f6d763f6d764f6d765f6d866f6d8
-67f6d868f6d868f6d869f6d96af6d96af6d96bf6d96cf6d96cf6d96df6da6df6da6ef6da6ef6da6e
-f6da6ff6da6ff6da70f6da70f6da70f6da70f6da70f6da70f6da70f6da70f6da70f6da70f6da70f6
-da70f6da70f6da70f6da70f6da70f6da6ff6da6ff6da6ff6da6ef6da6ef6da6e
-
-f5d14cf6d14df6d24ff6d250f6d251f6d352f6d354f6d355f6d456f6d458f6d459f6d55af6d55bf6
-d55cf6d55df6d65ff6d65ff6d661f6d761f6d763f6d763f6d764f6d865f6d866f6d867f6d868f6d8
-69f6d96af6d96af6d96bf6d96cf6d96cf6da6df6da6ef6da6ef6da6ff6da6ff6da70f6da70f6da70
-f6da71f6db71f6db72f6db72f6db72f6db72f6db72f6db72f6db72f6db72f6db72f6db72f6db72f6
-db72f6db72f6db72f6db72f6db72f6db71f6db71f6da71f6da70f6da70f6da70
-
-f6d14ef6d24ff6d250f6d252f6d353f6d354f6d356f6d457f6d458f6d459f6d55bf6d55cf6d55df6
-d65ef6d65ff6d660f6d761f6d762f6d763f6d764f6d865f6d866f6d867f6d868f6d869f6d96af6d9
-6bf6d96cf6d96cf6da6df6da6ef6da6ef6da6ff6da70f6da70f6da71f6db71f6db72f6db72f6db72
-f6db73f6db73f6db74f6db74f6db74f6db74f6db75f6db75f6db75f6db75f6dc75f6db75f6db75f6
-db75f6db75f6db74f6db74f6db74f6db73f6db73f6db73f6db72f6db72f6db72
-
-f6d24ff6d250f6d252f6d353f6d354f6d356f6d457f6d458f6d55af6d55bf6d55cf6d55df6d65ff6
-d660f6d661f6d762f6d763f6d764f6d765f6d866f6d867f6d868f6d869f6d96af6d96bf6d96cf6d9
-6df6da6ef6da6ef6da6ff6da70f6da70f6da71f6db72f6db72f6db73f6db73f6db74f6db74f6db75
-f6dc75f6dc75f6dc76f6dc76f6dc76f6dc77f6dc77f6dc77f6dc77f6dc77f6dc77f6dc77f6dc77f6
-dc77f6dc77f6dc76f6dc76f6dc76f6dc75f6dc75f6dc75f6db75f6db74f6db74
-
-f6d250f6d352f6d353f6d355f6d456f6d457f6d459f6d55af6d55bf6d55df6d65ef6d65ff6d660f6
-d761f6d763f6d764f6d765f6d866f6d867f6d868f6d869f6d96af6d96bf6d96cf6d96df6da6ef6da
-6ef6da6ff6da70f6da71f6db72f6db72f6db73f6db74f6db74f6dc75f6dc75f6dc76f6dc76f6dc77
-f6dc77f6dc77f6dc78f6dc78f6dc78f6dc79f6dc79f6dc79f6dd79f6dd79f6dd79f6dd79f6dd79f6
-dc79f6dc79f6dc78f6dc78f6dc78f6dc78f6dc77f6dc77f6dc77f6dc76f6dc76
-
-f6d352f6d354f6d355f6d456f6d458f6d459f6d55bf6d55cf6d55df6d65ef6d65ff6d661f6d762f6
-d763f6d764f6d865f6d867f6d868f6d869f6d96af6d96bf6d96cf6d96df6da6ef6da6ff6da70f6da
-70f6db71f6db72f6db73f6db74f6db74f6dc75f6dc76f6dc76f6dc77f6dc77f6dc78f6dc78f6dc79
-f6dd79f6dd79f6dd7af6dd7af6dd7af6dd7bf6dd7bf6dd7bf6dd7bf6dd7bf6dd7bf6dd7bf6dd7bf6
-dd7bf6dd7bf6dd7bf6dd7af6dd7af6dd7af6dd79f6dd79f6dc79f6dc78f6dc78
-
-f6d354f6d355f6d456f6d458f6d459f6d55bf6d55cf6d55df6d65ff6d660f6d661f6d762f6d763f6
-d765f6d866f6d867f6d868f6d96af6d96af6d96cf6d96df6da6ef6da6ff6da70f6da70f6db71f6db
-72f6db73f6db74f6dc75f6dc76f6dc76f6dc77f6dc78f6dc78f6dd79f6dd79f6dd7af6dd7af6dd7b
-f6dd7bf6dd7bf6dd7cf6dd7cf6dd7cf6de7df6de7df6de7df6de7df6de7df6de7df6de7df6de7df6
-de7df6de7df6de7df6dd7cf6dd7cf6dd7cf6dd7bf6dd7bf6dd7bf6dd7af6dd7a
-
-f6d355f6d456f6d458f6d459f6d55bf6d55cf6d55df6d65ff6d660f6d761f6d763f6d764f6d865f6
-d867f6d868f6d869f6d96af6d96bf6d96cf6da6df6da6ef6da70f6da70f6db71f6db72f6db73f6db
-74f6dc75f6dc76f6dc77f6dc77f6dc78f6dd79f6dd79f6dd7af6dd7bf6dd7bf6dd7cf6dd7cf6de7d
-f6de7df6de7df6de7ef6de7ef6de7ff6de7ff6de7ff6de7ff6de7ff6de7ff6de7ff6de7ff6de7ff6
-de7ff6de7ff6de7ff6de7ef6de7ef6de7ef6de7df6de7df6de7df6dd7cf6dd7b
-
-f6d456f6d458f6d459f6d55bf6d55cf6d65ef6d65ff6d661f6d762f6d763f6d764f6d866f6d867f6
-d868f6d96af6d96bf6d96cf6d96df6da6ef6da6ff6da70f6db71f6db72f6db73f6db74f6dc75f6dc
-76f6dc77f6dc78f6dc79f6dd79f6dd7af6dd7bf6dd7bf6dd7cf6de7df6de7df6de7ef6de7ef6de7f
-f6de7ff6de7ff6de80f6de80f7df80f7df80f7df80f7df80f7df80f7df80f7df80f7df80f7df80f7
-df80f7df80f7df80f6de80f6de80f6de80f6de7ff6de7ff6de7ff6de7ef6de7d
-
-f6d458f6d55af6d55bf6d55df6d65ef6d65ff6d661f6d762f6d763f6d765f6d866f6d868f6d869f6
-d96af6d96bf6d96cf6da6ef6da6ff6da70f6da71f6db72f6db73f6db74f6dc75f6dc76f6dc77f6dc
-78f6dd79f6dd7af6dd7bf6dd7bf6dd7cf6de7df6de7df6de7ef6de7ff6de7ff6de80f6de80f7df80
-f7df81f7df81f7df81f7df81f7df82f7df82f7df82f7df82f7df82f7df82f7df82f7df82f7df82f7
-df82f7df82f7df82f7df81f7df81f7df81f7df81f7df80f7df80f6de80f6de7f
-
-f6d55af6d55bf6d55df6d65ef6d65ff6d661f6d762f6d763f6d765f6d866f6d868f6d869f6d96af6
-d96cf6d96df6da6ef6da6ff6da70f6db72f6db73f6db74f6dc75f6dc76f6dc77f6dc78f6dd79f6dd
-7af6dd7bf6dd7cf6de7df6de7df6de7ef6de7ff6de7ff6de80f7df80f7df81f7df81f7df81f7df82
-f7df83f7df83f7df83f7df83f7e084f7e084f7e084f7e084f7e084f7e085f7e085f7e084f7e084f7
-e084f7e084f7e084f7df83f7df83f7df83f7df83f7df82f7df82f7df81f7df81
-
-f6d55bf6d55df6d65ef6d65ff6d661f6d762f6d764f6d765f6d867f6d868f6d869f6d96bf6d96cf6
-da6df6da6ef6da70f6da71f6db72f6db73f6db75f6dc76f6dc77f6dc78f6dd79f6dd7af6dd7bf6dd
-7cf6de7df6de7df6de7ef6de7ff6de80f7df80f7df81f7df81f7df82f7df83f7df83f7df83f7e084
-f7e085f7e085f7e085f7e085f7e086f7e086f7e086f7e086f7e086f7e087f7e087f7e087f7e086f7
-e086f7e086f7e086f7e086f7e085f7e085f7e085f7e084f7e084f7df83f7df83
-
-f6d55df6d65ef6d65ff6d661f6d762f6d764f6d765f6d867f6d868f6d96af6d96bf6d96cf6da6ef6
-da6ff6da70f6db71f6db72f6db74f6dc75f6dc76f6dc77f6dc79f6dd79f6dd7bf6dd7bf6de7df6de
-7df6de7ff6de7ff6de80f7df80f7df81f7df82f7df83f7df83f7e084f7e085f7e085f7e085f7e086
-f7e087f7e087f7e087f7e187f7e188f7e188f7e188f7e188f7e189f7e189f7e189f7e189f7e189f7
-e188f7e188f7e188f7e188f7e187f7e087f7e087f7e086f7e086f7e085f7e085
-
-f6d65ef6d65ff6d661f6d762f6d764f6d865f6d867f6d868f6d96af6d96bf6d96cf6da6ef6da6ff6
-da70f6db72f6db73f6db74f6dc75f6dc77f6dc78f6dd79f6dd7af6dd7bf6dd7cf6de7df6de7ef6de
-7ff6de80f7df80f7df81f7df82f7df83f7e084f7e085f7e085f7e086f7e086f7e087f7e187f7e188
-f7e189f7e189f7e189f7e189f7e18af7e18af7e18af7e18af7e18bf7e18bf7e18bf7e18bf7e18bf7
-e18af7e18af7e18af7e18af7e189f7e189f7e189f7e188f7e188f7e187f7e087
-
-f6d65ff6d661f6d762f6d764f6d865f6d867f6d868f6d96af6d96bf6d96cf6da6ef6da6ff6da71f6
-db72f6db73f6db75f6dc76f6dc77f6dc79f6dd7af6dd7bf6dd7cf6de7df6de7ef6de7ff6de80f7df
-80f7df81f7df82f7df83f7e084f7e085f7e085f7e086f7e087f7e188f7e188f7e189f7e189f7e18a
-f7e18bf7e18bf7e28bf7e28bf7e28cf7e28cf7e28cf7e28df7e28df7e28df7e28df7e28df7e28df7
-e28cf7e28cf7e28cf7e28cf7e28bf7e18bf7e18bf7e18af7e18af7e189f7e189
-
-f6d661f6d762f6d764f6d765f6d867f6d868f6d96af6d96bf6d96df6da6ef6da70f6da71f6db72f6
-db74f6dc75f6dc76f6dc78f6dd79f6dd7af6dd7bf6de7df6de7ef6de7ff6de80f7df80f7df81f7df
-82f7df83f7e084f7e085f7e086f7e087f7e187f7e188f7e189f7e18af7e18af7e18bf7e28bf7e28c
-f7e28df7e28df7e28ef7e28ef7e28ef7e28ef7e28ef7e28ff7e28ff7e28ff7e28ff7e28ff7e28ff7
-e28ff7e28ef7e28ef7e28ef7e28ef7e28df7e28df7e28cf7e28cf7e18bf7e18b
-
-f6d762f6d763f6d765f6d867f6d868f6d96af6d96bf6d96df6da6ef6da70f6da71f6db72f6db74f6
-dc75f6dc77f6dc78f6dd79f6dd7bf6dd7cf6de7df6de7ef6de7ff7df80f7df81f7df82f7df83f7e0
-84f7e085f7e086f7e087f7e188f7e189f7e189f7e18af7e18bf7e28bf7e28cf7e28df7e28ef7e28e
-f7e28ff7e38ff7e390f7e390f7e390f7e390f7e390f7e391f7e391f7e391f7e391f7e391f7e391f7
-e391f7e390f7e390f7e390f7e390f7e38ff7e28ff7e28ef7e28ef7e28df7e28d
-
-f6d763f6d765f6d866f6d868f6d96af6d96bf6d96df6da6ef6da70f6db71f6db72f6db74f6dc75f6
-dc77f6dc78f6dd79f6dd7bf6dd7cf6de7df6de7ff6de80f7df80f7df81f7df83f7e084f7e085f7e0
-86f7e087f7e188f7e189f7e189f7e18bf7e28bf7e28cf7e28df7e28ef7e28ef7e38ff7e390f7e390
-f7e391f7e391f7e392f7e392f7e392f7e392f7e393f7e393f7e393f7e393f7e393f7e393f7e393f7
-e393f7e392f7e392f7e392f7e392f7e391f7e391f7e390f7e390f7e38ff7e28f
-
-Q
-Q
-Q
-Q
-q
-q
-n
-140 331 m
-204 331 l
-204 267 l
-140 267 l
-140 331 l
-h
-W
-q
-q
-[64 0 0 64 140 267]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f2c017f2c017f2c017f2c017f2
-c017f2c017f2c017f2c017f2bf17f2bf17f2bf17f1bf17f1bf17f1bf17f1be17f1be17f1be17f1be
-17f1be17f0bd17f0bd17f0bd17f0bd17f0bd17f0bc17f0bc17f0bc17efbc17efbc17efbb17efbb17
-efbb17efbb17eeba16eeba16eeb916eeb916edb916edb816edb716edb716ecb716ecb616ecb616eb
-b516ebb516ebb416eab416eab316eab316eab216e9b216e9b116e9b116e8b016
-
-f3c217f3c217f3c217f3c217f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f3c117f2
-c017f2c017f2c017f2c017f2c017f2c017f2c017f2bf17f2bf17f2bf17f1bf17f1bf17f1bf17f1be
-17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bd17f0bc17f0bc17f0bc17efbc17efbc17
-efbb17efbb17efbb17efbb17eeba16eeba16eeb916edb916edb816edb816edb716ecb716ecb616ec
-b616ecb516ebb516ebb416ebb416eab316eab316eab216e9b216e9b116e9b116
-
-f4c217f4c217f4c217f4c217f3c217f3c217f3c217f3c217f3c217f3c117f3c117f3c117f3c117f3
-c117f3c117f3c117f3c117f2c017f2c017f2c017f2c017f2c017f2c017f2bf17f2bf17f2bf17f1bf
-17f1bf17f1be17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bd17f0bd17f0bc17f0bc17
-efbc17efbc17efbb17efbb17efbb17efbb17eeba16eeba16eeb916edb916edb816edb816edb716ec
-b716ecb616ecb616ebb516ebb516ebb416eab416eab316eab216eab216e9b116
-
-f4c317f4c317f4c317f4c317f4c217f4c217f4c217f4c217f4c217f3c217f3c217f3c217f3c217f3
-c117f3c117f3c117f3c117f3c117f3c117f3c117f2c017f2c017f2c017f2c017f2c017f2c017f2bf
-17f2bf17f1bf17f1bf17f1be17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bd17f0bc17
-f0bc17f0bc17efbc17efbc17efbb17efbb17efbb17eeba16eeba16eeb916eeb916edb816edb816ed
-b716ecb716ecb616ecb616ecb516ebb516ebb416ebb416eab316eab316eab216
-
-f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4c217f4c217f4c217f4c217f3
-c217f3c217f3c217f3c217f3c117f3c117f3c117f3c117f3c117f3c117f2c017f2c017f2c017f2c0
-17f2c017f2bf17f2bf17f2bf17f1bf17f1bf17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17
-f0bd17f0bc17f0bc17efbc17efbc17efbb17efbb17efbb17efbb17eeba16eeba16eeb916edb916ed
-b816edb816edb716ecb716ecb616ecb616ebb516ebb416ebb416eab316eab316
-
-f5c419f5c419f5c418f5c418f5c418f5c418f4c317f4c317f4c317f4c317f4c317f4c317f4c317f4
-c217f4c217f4c217f4c217f3c217f3c217f3c217f3c117f3c117f3c117f3c117f3c117f3c117f2c0
-17f2c017f2c017f2c017f2c017f2bf17f2bf17f1bf17f1bf17f1be17f1be17f1be17f1be17f0bd17
-f0bd17f0bd17f0bd17f0bc17f0bc17efbc17efbc17efbb17efbb17efbb17efbb17eeba16eeb916ee
-b916edb816edb816edb716ecb716ecb616ecb616ebb516ebb516ebb416eab416
-
-f5c41bf5c41bf5c41af5c41af5c41af5c41af5c419f5c419f5c418f5c418f4c317f4c317f4c317f4
-c317f4c317f4c317f4c317f4c217f4c217f4c217f3c217f3c217f3c217f3c117f3c117f3c117f3c1
-17f3c117f2c017f2c017f2c017f2c017f2c017f2bf17f2bf17f1bf17f1bf17f1be17f1be17f1be17
-f1be17f0bd17f0bd17f0bd17f0bd17f0bc17f0bc17efbc17efbc17efbb17efbb17efbb17eeba16ee
-ba16eeb916edb916edb816edb816edb716ecb716ecb616ecb516ebb516ebb416
-
-f5c51df5c51df5c51cf5c51cf5c51cf5c51cf5c41bf5c41bf5c41af5c41af5c419f5c419f5c418f5
-c418f4c317f4c317f4c317f4c317f4c317f4c317f4c217f4c217f4c217f3c217f3c217f3c117f3c1
-17f3c117f3c117f3c117f2c017f2c017f2c017f2c017f2c017f2bf17f2bf17f1bf17f1bf17f1be17
-f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bc17f0bc17efbc17efbc17efbb17efbb17efbb17ef
-bb17eeba16eeb916eeb916edb816edb816edb716ecb716ecb616ecb616ebb516
-
-f5c51ff5c51ff5c51ef5c51ef5c51ef5c51ef5c51df5c51df5c51cf5c51cf5c41bf5c41bf5c41af5
-c41af5c419f5c418f5c418f4c317f4c317f4c317f4c317f4c317f4c317f4c217f4c217f3c217f3c2
-17f3c217f3c117f3c117f3c117f3c117f2c017f2c017f2c017f2c017f2c017f2bf17f2bf17f1bf17
-f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bd17f0bc17f0bc17efbc17efbc17efbb17ef
-bb17efbb17eeba16eeba16eeb916edb916edb816edb716ecb716ecb616ecb616
-
-f5c621f5c621f5c621f5c620f5c620f5c620f5c51ff5c51ff5c51ef5c51ef5c51df5c51df5c51cf5
-c51cf5c41bf5c41af5c41af5c419f5c418f5c418f4c317f4c317f4c317f4c317f4c317f4c217f4c2
-17f4c217f3c217f3c217f3c117f3c117f3c117f3c117f2c017f2c017f2c017f2c017f2c017f2bf17
-f2bf17f1bf17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bd17f0bc17efbc17efbc17ef
-bb17efbb17efbb17eeba16eeba16eeb916edb916edb816edb816ecb716ecb616
-
-f5c723f5c623f5c623f5c622f5c622f5c622f5c621f5c621f5c620f5c620f5c51ff5c51ff5c51ef5
-c51ef5c51df5c51cf5c51cf5c41bf5c41af5c41af5c419f5c418f5c418f4c317f4c317f4c317f4c3
-17f4c217f4c217f4c217f3c217f3c217f3c117f3c117f3c117f3c117f2c017f2c017f2c017f2c017
-f2bf17f2bf17f1bf17f1bf17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bc17f0bc17ef
-bc17efbb17efbb17efbb17efbb17eeba16eeb916eeb916edb816edb816edb716
-
-f5c725f5c725f5c725f5c724f5c724f5c724f5c723f5c623f5c622f5c622f5c621f5c621f5c620f5
-c620f5c51ff5c51ef5c51ef5c51df5c51cf5c51cf5c41bf5c41af5c41af5c419f5c418f4c317f4c3
-17f4c317f4c317f4c317f4c217f4c217f3c217f3c217f3c117f3c117f3c117f3c117f2c017f2c017
-f2c017f2c017f2bf17f2bf17f1bf17f1be17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bc17f0
-bc17efbc17efbc17efbb17efbb17efbb17eeba16eeba16eeb916edb816edb816
-
-f5c827f5c827f5c727f5c727f5c726f5c726f5c725f5c725f5c724f5c724f5c723f5c623f5c622f5
-c622f5c621f5c620f5c620f5c51ff5c51ef5c51ef5c51df5c51cf5c51cf5c41bf5c41af5c419f5c4
-18f5c418f4c317f4c317f4c317f4c317f4c217f4c217f3c217f3c217f3c117f3c117f3c117f3c117
-f2c017f2c017f2c017f2c017f2bf17f2bf17f1bf17f1be17f1be17f1be17f1be17f0bd17f0bd17f0
-bd17f0bc17efbc17efbc17efbb17efbb17efbb17eeba16eeba16eeb916edb916
-
-f5c829f5c829f5c829f5c829f5c828f5c828f5c827f5c727f5c726f5c726f5c725f5c725f5c724f5
-c724f5c623f5c622f5c622f5c621f5c620f5c620f5c51ff5c51ef5c51ef5c51df5c51cf5c41bf5c4
-1af5c419f5c418f5c418f4c317f4c317f4c317f4c317f4c217f4c217f3c217f3c217f3c117f3c117
-f3c117f3c117f2c017f2c017f2c017f2bf17f2bf17f1bf17f1bf17f1be17f1be17f1be17f0bd17f0
-bd17f0bd17f0bc17f0bc17efbc17efbb17efbb17efbb17eeba16eeba16eeb916
-
-f5c92bf5c92bf5c92bf5c82bf5c82af5c82af5c829f5c829f5c828f5c828f5c827f5c727f5c726f5
-c726f5c725f5c724f5c724f5c623f5c622f5c622f5c621f5c620f5c51ff5c51ef5c51ef5c51df5c5
-1cf5c41bf5c41af5c41af5c419f5c418f4c317f4c317f4c317f4c317f4c217f4c217f3c217f3c217
-f3c117f3c117f3c117f2c017f2c017f2c017f2c017f2bf17f2bf17f1bf17f1be17f1be17f1be17f0
-bd17f0bd17f0bd17f0bd17f0bc17efbc17efbc17efbb17efbb17efbb17eeba16
-
-f5c92ef5c92df5c92df5c92df5c92cf5c92cf5c92bf5c92bf5c82af5c82af5c829f5c829f5c828f5
-c827f5c727f5c726f5c726f5c725f5c724f5c724f5c623f5c622f5c621f5c620f5c620f5c51ff5c5
-1ef5c51df5c51cf5c41bf5c41af5c41af5c419f5c418f4c317f4c317f4c317f4c217f4c217f3c217
-f3c217f3c117f3c117f3c117f3c117f2c017f2c017f2c017f2bf17f2bf17f1bf17f1be17f1be17f1
-be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbc17efbb17efbb17efbb17
-
-f5ca30f5ca2ff5ca2ff5c92ff5c92ef5c92ef5c92df5c92df5c92cf5c92cf5c92bf5c82bf5c82af5
-c829f5c829f5c828f5c828f5c727f5c726f5c725f5c725f5c724f5c723f5c622f5c622f5c621f5c6
-20f5c51ff5c51ef5c51df5c51cf5c41bf5c41af5c41af5c418f5c418f4c317f4c317f4c317f4c217
-f4c217f3c217f3c217f3c117f3c117f3c117f2c017f2c017f2c017f2c017f2bf17f1bf17f1bf17f1
-be17f1be17f1be17f0bd17f0bd17f0bd17f0bc17f0bc17efbc17efbb17efbb17
-
-f5ca32f5ca31f5ca31f5ca31f5ca30f5ca30f5ca2ff5ca2ff5c92ef5c92ef5c92df5c92df5c92cf5
-c92bf5c92bf5c82af5c829f5c829f5c828f5c827f5c727f5c726f5c725f5c724f5c723f5c622f5c6
-22f5c621f5c620f5c51ff5c51ef5c51df5c51cf5c41bf5c41af5c419f5c418f4c317f4c317f4c317
-f4c317f4c217f4c217f3c217f3c117f3c117f3c117f3c117f2c017f2c017f2c017f2bf17f2bf17f1
-bf17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bc17f0bc17efbc17efbb17
-
-f5cb34f5cb34f5cb33f5ca33f5ca32f5ca32f5ca31f5ca31f5ca30f5ca30f5ca2ff5c92ff5c92ef5
-c92df5c92df5c92cf5c92bf5c92bf5c82af5c829f5c829f5c828f5c727f5c726f5c725f5c724f5c7
-24f5c623f5c622f5c621f5c620f5c51ff5c51ef5c51df5c51cf5c41bf5c41af5c419f5c418f4c317
-f4c317f4c317f4c217f4c217f3c217f3c217f3c117f3c117f3c117f2c017f2c017f2c017f2bf17f2
-bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bc17f0bc17efbc17
-
-f5cb36f5cb36f5cb35f5cb35f5cb34f5cb34f5cb34f5ca33f5ca32f5ca32f5ca31f5ca31f5ca30f5
-ca2ff5c92ff5c92ef5c92df5c92df5c92cf5c92bf5c82bf5c82af5c829f5c828f5c827f5c727f5c7
-26f5c724f5c724f5c623f5c622f5c621f5c620f5c51ff5c51ef5c51df5c51cf5c41bf5c41af5c419
-f5c418f4c317f4c317f4c317f4c217f4c217f3c217f3c117f3c117f3c117f3c117f2c017f2c017f2
-c017f2bf17f1bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bc17f0bc17
-
-f5cc38f5cc38f5cc37f5cc37f5cb36f5cb36f5cb36f5cb35f5cb34f5cb34f5cb33f5ca33f5ca32f5
-ca31f5ca31f5ca30f5ca2ff5c92ff5c92ef5c92df5c92df5c92cf5c92bf5c82af5c829f5c828f5c8
-27f5c727f5c726f5c724f5c724f5c623f5c622f5c621f5c620f5c51ff5c51ef5c51cf5c51cf5c41a
-f5c419f5c418f4c317f4c317f4c317f4c217f4c217f3c217f3c217f3c117f3c117f3c117f2c017f2
-c017f2c017f2bf17f1bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bd17
-
-f5cc3af5cc3af5cc39f5cc39f5cc38f5cc38f5cc38f5cc37f5cb36f5cb36f5cb35f5cb35f5cb34f5
-cb34f5ca33f5ca32f5ca31f5ca31f5ca30f5ca2ff5c92ef5c92df5c92df5c92cf5c92bf5c82af5c8
-29f5c829f5c827f5c727f5c726f5c724f5c724f5c622f5c622f5c620f5c51ff5c51ef5c51df5c51c
-f5c41bf5c41af5c419f5c418f4c317f4c317f4c317f4c217f3c217f3c217f3c117f3c117f3c117f2
-c017f2c017f2c017f2bf17f2bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17
-
-f5cd3cf5cd3cf5cd3bf5cd3bf5cc3af5cc3af5cc3af5cc39f5cc38f5cc38f5cc37f5cc37f5cb36f5
-cb36f5cb35f5cb34f5cb34f5ca33f5ca32f5ca31f5ca30f5ca2ff5c92ff5c92ef5c92df5c92cf5c9
-2bf5c82af5c829f5c828f5c827f5c727f5c725f5c724f5c723f5c622f5c621f5c620f5c51ff5c51e
-f5c51df5c51cf5c41af5c419f5c418f4c317f4c317f4c317f4c217f4c217f3c217f3c117f3c117f3
-c117f2c017f2c017f2c017f2bf17f2bf17f1bf17f1be17f1be17f1be17f0bd17
-
-f5cd3ef5cd3ef5cd3df5cd3df5cd3cf5cd3cf5cd3cf5cd3bf5cc3af5cc3af5cc39f5cc39f5cc38f5
-cc38f5cc37f5cb36f5cb35f5cb35f5cb34f5cb33f5ca32f5ca31f5ca31f5ca30f5c92ff5c92ef5c9
-2df5c92cf5c92bf5c82af5c829f5c828f5c827f5c726f5c725f5c724f5c623f5c622f5c621f5c620
-f5c51ef5c51df5c51cf5c41bf5c41af5c418f4c317f4c317f4c317f4c217f4c217f3c217f3c117f3
-c117f3c117f3c117f2c017f2c017f2bf17f2bf17f1bf17f1be17f1be17f1be17
-
-f5ce40f5ce40f5ce3ff5ce3ff5ce3ef5cd3ef5cd3ef5cd3df5cd3cf5cd3cf5cd3bf5cd3bf5cc3af5
-cc39f5cc39f5cc38f5cc37f5cb36f5cb36f5cb35f5cb34f5cb34f5ca32f5ca31f5ca31f5ca30f5ca
-2ff5c92ef5c92df5c92cf5c92bf5c82af5c829f5c828f5c727f5c726f5c724f5c724f5c622f5c621
-f5c620f5c51ff5c51ef5c51cf5c41bf5c41af5c419f5c418f4c317f4c317f4c317f4c217f3c217f3
-c217f3c117f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17
-
-f5ce42f5ce42f5ce41f5ce41f5ce41f5ce40f5ce40f5ce3ff5ce3ef5cd3ef5cd3df5cd3cf5cd3cf5
-cd3bf5cd3bf5cc3af5cc39f5cc38f5cc38f5cc37f5cb36f5cb35f5cb34f5cb34f5ca33f5ca31f5ca
-31f5ca30f5c92ff5c92ef5c92df5c92cf5c82bf5c82af5c829f5c827f5c727f5c725f5c724f5c623
-f5c622f5c621f5c620f5c51ef5c51df5c51cf5c41af5c419f5c418f4c317f4c317f4c317f4c217f3
-c217f3c217f3c117f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1be17
-
-f5cf44f5cf44f5cf43f5cf43f5cf43f5ce42f5ce42f5ce41f5ce41f5ce40f5ce3ff5ce3ef5cd3ef5
-cd3df5cd3cf5cd3cf5cd3bf5cc3af5cc3af5cc39f5cc38f5cc37f5cb36f5cb36f5cb34f5cb34f5ca
-33f5ca31f5ca31f5ca2ff5c92ff5c92df5c92df5c92bf5c82bf5c829f5c828f5c727f5c726f5c725
-f5c724f5c622f5c621f5c620f5c51ff5c51ef5c51cf5c41bf5c41af5c418f4c317f4c317f4c317f4
-c217f3c217f3c217f3c117f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17
-
-f5d046f5cf46f5cf45f5cf45f5cf45f5cf44f5cf43f5cf43f5cf43f5ce42f5ce41f5ce41f5ce40f5
-ce3ff5ce3ef5cd3ef5cd3df5cd3cf5cd3cf5cd3bf5cc3af5cc39f5cc38f5cc37f5cb36f5cb36f5cb
-34f5cb34f5ca32f5ca31f5ca30f5ca2ff5c92ef5c92df5c92cf5c92bf5c82af5c829f5c828f5c727
-f5c725f5c724f5c623f5c622f5c620f5c51ff5c51ef5c51cf5c41bf5c41af5c419f4c317f4c317f4
-c317f4c217f4c217f3c217f3c117f3c117f3c117f2c017f2c017f2c017f2bf17
-
-f5d048f5d048f5d047f5d047f5d047f5d046f5cf45f5cf45f5cf45f5cf44f5cf43f5cf43f5ce42f5
-ce41f5ce41f5ce40f5ce3ff5cd3ef5cd3df5cd3cf5cd3cf5cd3bf5cc3af5cc39f5cc38f5cc37f5cb
-36f5cb35f5cb34f5cb33f5ca32f5ca31f5ca30f5ca2ff5c92ef5c92df5c92cf5c82bf5c829f5c828
-f5c727f5c726f5c724f5c723f5c622f5c621f5c620f5c51ef5c51df5c51cf5c41af5c419f5c418f4
-c317f4c317f4c217f4c217f3c217f3c117f3c117f3c117f2c017f2c017f2c017
-
-f5d14af5d04af5d049f5d049f5d049f5d048f5d047f5d047f5d047f5cf46f5cf45f5cf45f5cf44f5
-cf43f5cf43f5ce42f5ce41f5ce40f5ce3ff5ce3ef5cd3ef5cd3df5cd3cf5cd3bf5cc3af5cc39f5cc
-38f5cc37f5cb36f5cb35f5cb34f5cb33f5ca32f5ca31f5ca30f5c92ff5c92df5c92cf5c92bf5c82a
-f5c829f5c827f5c726f5c725f5c724f5c622f5c621f5c620f5c51ef5c51df5c51cf5c41af5c419f5
-c418f4c317f4c317f4c217f4c217f3c217f3c117f3c117f3c117f2c017f2c017
-
-f6d14cf5d14cf5d14bf5d14bf5d14bf5d14af5d049f5d049f5d049f5d048f5d047f5d047f5cf46f5
-cf45f5cf45f5cf44f5cf43f5ce42f5ce41f5ce41f5ce40f5ce3ef5cd3ef5cd3df5cd3cf5cd3bf5cc
-3af5cc39f5cc38f5cc37f5cb36f5cb35f5cb34f5ca33f5ca31f5ca30f5ca2ff5c92ef5c92df5c92b
-f5c82af5c829f5c828f5c727f5c725f5c724f5c623f5c621f5c620f5c51ff5c51df5c51cf5c41bf5
-c419f5c418f4c317f4c317f4c217f4c217f3c217f3c117f3c117f3c117f2c017
-
-f6d24ef6d14ef6d14ef6d14df6d14df6d14cf5d14bf5d14bf5d14af5d04af5d049f5d049f5d048f5
-d047f5d046f5cf46f5cf45f5cf44f5cf43f5ce42f5ce41f5ce41f5ce40f5ce3ff5cd3ef5cd3df5cd
-3cf5cd3bf5cc3af5cc39f5cc38f5cb36f5cb36f5cb34f5cb33f5ca32f5ca31f5ca30f5c92ff5c92d
-f5c92cf5c82bf5c829f5c828f5c727f5c726f5c724f5c623f5c622f5c620f5c51ff5c51ef5c51cf5
-c41bf5c41af5c418f4c317f4c317f4c217f4c217f3c217f3c117f3c117f3c117
-
-f6d250f6d250f6d250f6d24ff6d24ff6d24ef6d14ef6d14df6d14cf5d14cf5d14bf5d14bf5d04af5
-d049f5d048f5d047f5d047f5cf46f5cf45f5cf44f5cf43f5cf43f5ce41f5ce41f5ce40f5ce3ef5cd
-3ef5cd3cf5cd3cf5cc3af5cc39f5cc38f5cc37f5cb36f5cb35f5cb34f5ca33f5ca31f5ca30f5ca2f
-f5c92ef5c92df5c92bf5c82af5c829f5c827f5c726f5c724f5c723f5c622f5c620f5c51ff5c51ef5
-c51cf5c41bf5c41af5c418f4c317f4c317f4c217f4c217f3c217f3c117f3c117
-
-f6d352f6d352f6d252f6d251f6d251f6d250f6d250f6d24ff6d24ef6d14ef6d14df6d14cf5d14cf5
-d14bf5d14af5d049f5d049f5d048f5d047f5d046f5cf45f5cf44f5cf43f5cf43f5ce41f5ce41f5ce
-3ff5ce3ef5cd3df5cd3cf5cd3bf5cc3af5cc39f5cc38f5cc37f5cb36f5cb34f5cb33f5ca32f5ca31
-f5ca2ff5c92ef5c92df5c92bf5c82af5c829f5c827f5c726f5c725f5c723f5c622f5c620f5c51ff5
-c51ef5c51cf5c41bf5c41af5c418f4c317f4c317f4c217f4c217f3c217f3c117
-
-f6d354f6d354f6d354f6d353f6d353f6d352f6d252f6d251f6d250f6d250f6d24ff6d24ef6d14ef6
-d14df6d14cf5d14bf5d14bf5d04af5d049f5d048f5d047f5d046f5cf45f5cf44f5cf43f5ce42f5ce
-41f5ce40f5ce3ff5cd3ef5cd3df5cd3cf5cd3bf5cc3af5cc38f5cc37f5cb36f5cb35f5cb34f5ca32
-f5ca31f5ca30f5c92ef5c92df5c92cf5c82bf5c829f5c828f5c727f5c725f5c724f5c622f5c621f5
-c51ff5c51ef5c51cf5c41bf5c41af5c418f4c317f4c317f4c217f4c217f3c217
-
-f6d456f6d456f6d356f6d355f6d355f6d354f6d354f6d353f6d352f6d252f6d251f6d250f6d250f6
-d24ff6d14ef6d14df6d14cf5d14bf5d14bf5d04af5d049f5d048f5d047f5d046f5cf45f5cf44f5cf
-43f5ce42f5ce41f5ce40f5ce3ff5cd3ef5cd3cf5cd3bf5cc3af5cc39f5cc38f5cb36f5cb35f5cb34
-f5ca33f5ca31f5ca30f5c92ff5c92df5c92cf5c82bf5c829f5c828f5c727f5c725f5c724f5c622f5
-c621f5c51ff5c51ef5c51cf5c41bf5c41af5c418f4c317f4c317f4c217f4c217
-
-f6d458f6d458f6d458f6d457f6d457f6d456f6d356f6d355f6d354f6d354f6d353f6d352f6d252f6
-d251f6d250f6d24ff6d24ef6d14ef6d14df5d14cf5d14bf5d04af5d049f5d048f5d047f5cf46f5cf
-45f5cf44f5cf43f5ce42f5ce41f5ce3ff5cd3ef5cd3df5cd3cf5cc3af5cc39f5cc38f5cc37f5cb36
-f5cb34f5cb33f5ca31f5ca30f5ca2ff5c92df5c92cf5c92bf5c829f5c828f5c727f5c725f5c724f5
-c622f5c621f5c51ff5c51ef5c51cf5c41bf5c41af5c418f4c317f4c317f4c217
-
-f6d55bf6d55af6d55af6d459f6d459f6d458f6d458f6d457f6d456f6d356f6d355f6d354f6d354f6
-d353f6d352f6d251f6d250f6d250f6d24ef6d14ef6d14df5d14cf5d14bf5d04af5d049f5d048f5d0
-47f5cf45f5cf45f5cf43f5ce42f5ce41f5ce40f5ce3ef5cd3df5cd3cf5cd3bf5cc3af5cc38f5cc37
-f5cb36f5cb35f5cb33f5ca32f5ca31f5ca2ff5c92ef5c92cf5c92bf5c829f5c828f5c727f5c725f5
-c724f5c622f5c621f5c51ff5c51ef5c51cf5c41bf5c419f5c418f4c317f4c317
-
-f6d55df6d55cf6d55cf6d55bf6d55bf6d55af6d55af6d459f6d458f6d458f6d457f6d456f6d356f6
-d355f6d354f6d353f6d352f6d251f6d250f6d250f6d24ff6d14ef6d14df5d14bf5d14bf5d049f5d0
-48f5d047f5d046f5cf45f5cf44f5cf43f5ce42f5ce41f5ce3ff5cd3ef5cd3df5cd3bf5cc3af5cc39
-f5cc38f5cb36f5cb35f5cb34f5ca32f5ca31f5ca2ff5c92ef5c92df5c92bf5c82af5c828f5c727f5
-c725f5c724f5c622f5c621f5c51ff5c51ef5c51cf5c41bf5c419f5c418f4c317
-
-f6d65ff6d65ef6d65ef6d55df6d55df6d55cf6d55cf6d55bf6d55af6d55af6d459f6d458f6d457f6
-d456f6d356f6d355f6d354f6d353f6d352f6d251f6d250f6d250f6d24ef6d14ef6d14cf5d14bf5d1
-4af5d049f5d048f5d047f5cf46f5cf45f5cf43f5ce42f5ce41f5ce40f5ce3ef5cd3df5cd3cf5cc3a
-f5cc39f5cc38f5cb36f5cb35f5cb34f5ca32f5ca31f5ca2ff5c92ef5c92df5c92bf5c82af5c828f5
-c727f5c725f5c724f5c622f5c620f5c51ff5c51ef5c51cf5c41af5c419f4c317
-
-f6d661f6d660f6d660f6d65ff6d65ff6d65ef6d65ef6d55df6d55cf6d55cf6d55bf6d55af6d459f6
-d458f6d458f6d457f6d456f6d355f6d354f6d353f6d352f6d251f6d250f6d24ff6d14ef6d14df5d1
-4cf5d14bf5d04af5d049f5d047f5d046f5cf45f5cf44f5cf43f5ce41f5ce40f5ce3ef5cd3df5cd3c
-f5cd3bf5cc39f5cc38f5cc37f5cb35f5cb34f5ca32f5ca31f5ca2ff5c92ef5c92df5c92bf5c82af5
-c828f5c727f5c725f5c724f5c622f5c620f5c51ff5c51df5c51cf5c41af5c419
-
-f6d763f6d762f6d762f6d761f6d661f6d660f6d65ff6d65ff6d65ef6d55df6d55df6d55cf6d55bf6
-d55bf6d55af6d459f6d458f6d457f6d456f6d355f6d354f6d353f6d352f6d251f6d250f6d24ff6d1
-4ef6d14df5d14bf5d14af5d049f5d048f5d047f5cf45f5cf44f5cf43f5ce42f5ce40f5ce3ff5cd3e
-f5cd3cf5cd3bf5cc3af5cc38f5cc37f5cb35f5cb34f5ca32f5ca31f5ca2ff5c92ef5c92df5c92bf5
-c829f5c828f5c727f5c725f5c723f5c622f5c620f5c51ff5c51df5c51cf5c41a
-
-f6d765f6d764f6d764f6d763f6d763f6d762f6d761f6d661f6d660f6d65ff6d65ff6d65ef6d55df6
-d55cf6d55bf6d55bf6d55af6d459f6d458f6d457f6d456f6d355f6d354f6d353f6d252f6d251f6d2
-50f6d24ef6d14df5d14cf5d14bf5d049f5d048f5d047f5cf46f5cf45f5cf43f5ce42f5ce41f5ce3f
-f5cd3ef5cd3cf5cd3bf5cc3af5cc38f5cc37f5cb36f5cb34f5ca32f5ca31f5ca2ff5c92ef5c92df5
-c92bf5c829f5c828f5c727f5c725f5c723f5c622f5c620f5c51ef5c51df5c41b
-
-f6d867f6d866f6d866f6d865f6d765f6d764f6d763f6d763f6d762f6d761f6d661f6d660f6d65ff6
-d65ef6d55df6d55df6d55cf6d55bf6d55af6d459f6d458f6d457f6d356f6d354f6d354f6d352f6d2
-51f6d250f6d24ff6d14ef6d14cf5d14bf5d04af5d049f5d047f5d046f5cf45f5cf43f5ce42f5ce41
-f5ce3ff5cd3ef5cd3cf5cd3bf5cc3af5cc38f5cc37f5cb36f5cb34f5ca32f5ca31f5ca2ff5c92ef5
-c92cf5c92bf5c829f5c828f5c726f5c724f5c623f5c621f5c620f5c51ef5c51c
-
-f6d869f6d868f6d868f6d868f6d867f6d866f6d865f6d765f6d764f6d763f6d763f6d762f6d661f6
-d660f6d65ff6d65ef6d55df6d55df6d55bf6d55bf6d55af6d458f6d457f6d456f6d355f6d354f6d3
-53f6d252f6d251f6d250f6d24ef6d14df5d14bf5d14af5d049f5d048f5d047f5cf45f5cf44f5cf43
-f5ce41f5ce40f5cd3ef5cd3df5cd3bf5cc3af5cc38f5cc37f5cb36f5cb34f5ca32f5ca31f5ca2ff5
-c92ef5c92cf5c82bf5c829f5c827f5c726f5c724f5c623f5c621f5c620f5c51e
-
-f6d96bf6d96af6d96af6d96af6d869f6d868f6d868f6d867f6d866f6d865f6d765f6d764f6d763f6
-d762f6d661f6d660f6d65ff6d65ef6d55df6d55df6d55bf6d55af6d459f6d458f6d457f6d356f6d3
-55f6d354f6d352f6d251f6d250f6d24ff6d14df5d14cf5d14bf5d049f5d048f5d047f5cf45f5cf44
-f5cf43f5ce41f5ce40f5cd3ef5cd3df5cd3bf5cc3af5cc38f5cc37f5cb35f5cb34f5ca32f5ca31f5
-ca2ff5c92df5c92cf5c82bf5c829f5c827f5c726f5c724f5c622f5c621f5c51f
-
-f6d96df6d96cf6d96cf6d96bf6d96bf6d96af6d96af6d869f6d868f6d867f6d866f6d865f6d765f6
-d764f6d763f6d762f6d661f6d660f6d65ff6d65ef6d55df6d55cf6d55bf6d55af6d459f6d458f6d4
-56f6d355f6d354f6d353f6d252f6d250f6d24ff6d14ef6d14cf5d14bf5d049f5d048f5d047f5cf45
-f5cf44f5cf43f5ce41f5ce40f5cd3ef5cd3df5cd3bf5cc3af5cc38f5cc37f5cb35f5cb34f5ca32f5
-ca31f5ca2ff5c92df5c92cf5c82af5c829f5c727f5c725f5c724f5c622f5c620
-
-f6da6ff6da6ef6da6ef6da6df6d96df6d96cf6d96cf6d96bf6d96af6d869f6d868f6d868f6d867f6
-d866f6d765f6d764f6d763f6d762f6d661f6d660f6d65ff6d65ef6d55df6d55cf6d55bf6d459f6d4
-58f6d457f6d356f6d354f6d353f6d352f6d250f6d24ff6d14ef6d14df5d14bf5d04af5d048f5d047
-f5cf45f5cf44f5cf43f5ce41f5ce40f5cd3ef5cd3df5cd3bf5cc3af5cc38f5cc37f5cb35f5cb34f5
-ca32f5ca30f5c92ff5c92df5c92bf5c82af5c828f5c727f5c725f5c723f5c622
-
-f6da71f6da70f6da70f6da6ff6da6ff6da6ef6da6df6d96df6d96cf6d96bf6d96af6d96af6d869f6
-d868f6d867f6d866f6d765f6d764f6d763f6d762f6d661f6d660f6d65ff6d55df6d55cf6d55bf6d5
-5af6d458f6d457f6d456f6d355f6d354f6d352f6d251f6d250f6d24ef6d14df5d14bf5d04af5d049
-f5d047f5cf46f5cf44f5cf43f5ce41f5ce40f5cd3ef5cd3cf5cd3bf5cc3af5cc38f5cb36f5cb35f5
-cb33f5ca31f5ca30f5c92ef5c92df5c92bf5c829f5c828f5c726f5c724f5c623
-
-f6db73f6db72f6db72f6db71f6da71f6da70f6da6ff6da6ef6da6ef6da6df6d96cf6d96bf6d96af6
-d96af6d869f6d868f6d867f6d865f6d765f6d763f6d763f6d761f6d660f6d65ff6d65ef6d55df6d5
-5bf6d55af6d459f6d458f6d456f6d355f6d354f6d352f6d251f6d250f6d24ef6d14df5d14bf5d04a
-f5d049f5d047f5cf46f5cf44f5cf43f5ce41f5ce40f5cd3ef5cd3cf5cd3bf5cc39f5cc38f5cb36f5
-cb35f5cb33f5ca31f5ca30f5c92ef5c92cf5c82bf5c829f5c827f5c726f5c724
-
-f6dc75f6db75f6db74f6db73f6db72f6db72f6db71f6da70f6da70f6da6ff6da6ef6da6df6d96cf6
-d96cf6d96af6d96af6d868f6d868f6d866f6d865f6d764f6d763f6d762f6d661f6d660f6d65ff6d5
-5df6d55cf6d55bf6d459f6d458f6d457f6d355f6d354f6d353f6d251f6d250f6d24ef6d14df5d14b
-f5d04af5d049f5d047f5cf45f5cf44f5cf43f5ce41f5ce3ff5cd3ef5cd3cf5cd3bf5cc39f5cc38f5
-cb36f5cb34f5ca33f5ca31f5ca2ff5c92ef5c92cf5c82af5c829f5c727f5c725
-
-f6dc77f6dc77f6dc76f6dc75f6db75f6db74f6db73f6db72f6db72f6da71f6da70f6da6ff6da6ef6
-da6df6d96cf6d96bf6d96af6d869f6d868f6d867f6d866f6d765f6d764f6d763f6d761f6d660f6d6
-5ff6d55df6d55cf6d55bf6d55af6d458f6d457f6d356f6d354f6d353f6d251f6d250f6d24ef6d14d
-f5d14bf5d04af5d049f5d047f5cf45f5cf44f5cf43f5ce41f5ce3ff5cd3ef5cd3cf5cc3af5cc39f5
-cc37f5cb36f5cb34f5ca32f5ca31f5ca2ff5c92df5c92bf5c82af5c828f5c727
-
-f6dd79f6dc79f6dc78f6dc77f6dc77f6dc76f6dc75f6db75f6db74f6db73f6db72f6da71f6da70f6
-da6ff6da6ef6da6df6d96cf6d96bf6d96af6d869f6d868f6d867f6d865f6d764f6d763f6d762f6d6
-61f6d65ff6d65ef6d55df6d55bf6d55af6d458f6d457f6d356f6d354f6d353f6d252f6d250f6d24e
-f6d14df5d14bf5d04af5d048f5d047f5cf45f5cf44f5ce42f5ce41f5ce3ff5cd3df5cd3cf5cc3af5
-cc38f5cc37f5cb35f5cb34f5ca32f5ca30f5c92ef5c92df5c92bf5c829f5c828
-
-f6dd7bf6dd7bf6dd7af6dd79f6dc79f6dc78f6dc77f6dc76f6dc75f6db75f6db74f6db73f6db72f6
-da71f6da70f6da6ff6da6ef6d96df6d96cf6d96bf6d96af6d868f6d867f6d866f6d765f6d763f6d7
-62f6d661f6d65ff6d65ef6d55df6d55bf6d55af6d458f6d457f6d356f6d354f6d353f6d252f6d250
-f6d24ef6d14df5d14bf5d04af5d048f5d047f5cf45f5cf43f5ce42f5ce40f5ce3ef5cd3df5cd3bf5
-cc3af5cc38f5cb36f5cb35f5cb33f5ca31f5ca2ff5c92ef5c92cf5c82bf5c829
-
-f6de7df6de7df6dd7cf6dd7bf6dd7bf6dd7af6dd79f6dc78f6dc77f6dc77f6dc76f6dc75f6db74f6
-db73f6db72f6da71f6da70f6da6ef6da6ef6d96cf6d96bf6d96af6d869f6d868f6d866f6d765f6d7
-64f6d762f6d661f6d660f6d65ff6d55df6d55cf6d55af6d459f6d457f6d356f6d354f6d353f6d251
-f6d250f6d24ef6d14df5d14bf5d049f5d048f5d047f5cf45f5cf43f5ce42f5ce40f5ce3ef5cd3cf5
-cd3bf5cc39f5cc38f5cb36f5cb34f5ca33f5ca31f5ca2ff5c92df5c92cf5c82a
-
-f6de7ff6de7ff6de7ef6de7df6de7df6dd7cf6dd7bf6dd7af6dd79f6dc79f6dc77f6dc77f6dc76f6
-db75f6db74f6db72f6db72f6da70f6da6ff6da6ef6d96df6d96cf6d96af6d869f6d868f6d867f6d8
-65f6d764f6d763f6d761f6d660f6d65ff6d55df6d55cf6d55af6d459f6d457f6d356f6d354f6d353
-f6d251f6d250f6d14ef6d14df5d14bf5d049f5d048f5d046f5cf45f5cf43f5ce41f5ce40f5cd3ef5
-cd3cf5cc3af5cc39f5cc37f5cb36f5cb34f5ca32f5ca30f5c92ff5c92df5c92b
-
-f7df80f6de80f6de80f6de7ff6de7ef6de7ef6de7df6dd7cf6dd7bf6dd7af6dd79f6dc79f6dc77f6
-dc77f6dc75f6db75f6db73f6db72f6da71f6da70f6da6ef6da6df6d96cf6d96bf6d96af6d868f6d8
-67f6d865f6d764f6d763f6d761f6d660f6d65ff6d55df6d55cf6d55af6d459f6d457f6d356f6d354
-f6d353f6d251f6d250f6d14ef6d14cf5d14bf5d049f5d047f5cf46f5cf44f5cf43f5ce41f5ce3ff5
-cd3df5cd3cf5cc3af5cc38f5cc37f5cb35f5cb33f5ca31f5ca2ff5c92ef5c92c
-
-f7df82f7df81f7df81f7df80f6de80f6de7ff6de7ff6de7ef6de7df6dd7cf6dd7bf6dd7af6dd79f6
-dc78f6dc77f6dc76f6dc75f6db74f6db73f6db72f6da70f6da6ff6da6ef6d96cf6d96bf6d96af6d8
-69f6d867f6d866f6d764f6d763f6d761f6d660f6d65ff6d55df6d55cf6d55af6d458f6d457f6d356
-f6d354f6d352f6d251f6d24ff6d14ef5d14cf5d14af5d049f5d047f5cf45f5cf44f5ce42f5ce41f5
-ce3ef5cd3df5cd3bf5cc3af5cc38f5cb36f5cb34f5ca33f5ca31f5ca2ff5c92d
-
-f7e084f7df83f7df83f7df82f7df81f7df81f7df80f6de80f6de7ff6de7ef6de7df6dd7cf6dd7bf6
-dd7af6dd79f6dc78f6dc77f6dc76f6db75f6db73f6db72f6da71f6da70f6da6ef6d96df6d96cf6d9
-6af6d869f6d868f6d866f6d765f6d763f6d761f6d660f6d65ff6d55df6d55cf6d55af6d458f6d457
-f6d355f6d354f6d352f6d250f6d24ff6d14df5d14bf5d04af5d048f5d047f5cf45f5cf43f5ce42f5
-ce40f5cd3ef5cd3cf5cd3bf5cc39f5cc37f5cb36f5cb34f5ca32f5ca30f5c92e
-
-f7e086f7e085f7e085f7e084f7df83f7df83f7df82f7df81f7df80f6de80f6de7ff6de7ef6de7df6
-dd7cf6dd7bf6dd7af6dc79f6dc77f6dc76f6dc75f6db74f6db72f6db71f6da70f6da6ef6da6df6d9
-6cf6d96af6d869f6d868f6d866f6d765f6d763f6d761f6d660f6d65ff6d55df6d55bf6d55af6d458
-f6d457f6d355f6d354f6d352f6d250f6d24ff6d14df5d14bf5d049f5d048f5d046f5cf45f5cf43f5
-ce41f5ce3ff5cd3ef5cd3cf5cc3af5cc38f5cb36f5cb35f5cb33f5ca31f5ca2f
-
-f7e188f7e187f7e087f7e086f7e085f7e084f7df83f7df83f7df82f7df81f7df80f6de80f6de7ff6
-de7df6de7df6dd7bf6dd7af6dd79f6dc78f6dc77f6dc75f6db74f6db73f6db71f6da70f6da6ff6da
-6df6d96cf6d96af6d869f6d868f6d866f6d765f6d763f6d761f6d660f6d65ef6d55df6d55bf6d55a
-f6d458f6d456f6d355f6d353f6d252f6d250f6d14ef6d14cf5d14bf5d049f5d047f5cf46f5cf44f5
-ce42f5ce41f5ce3ef5cd3df5cd3bf5cc39f5cc38f5cb36f5cb34f5ca32f5ca30
-
-f7e18af7e189f7e189f7e188f7e087f7e086f7e085f7e085f7df83f7df83f7df82f7df81f6de80f6
-de7ff6de7ef6de7df6dd7cf6dd7bf6dd79f6dc78f6dc77f6dc76f6db74f6db73f6db72f6da70f6da
-6ff6da6df6d96cf6d96af6d869f6d868f6d866f6d764f6d763f6d761f6d660f6d65ef6d55df6d55b
-f6d459f6d458f6d456f6d354f6d353f6d251f6d24ff6d14ef5d14cf5d14af5d049f5d047f5cf45f5
-cf43f5ce41f5ce40f5cd3ef5cd3cf5cc3af5cc39f5cc37f5cb35f5cb33f5ca31
-
-f7e28cf7e28bf7e18bf7e18af7e189f7e188f7e187f7e086f7e085f7e085f7df83f7df82f7df81f7
-df80f6de80f6de7ff6de7df6dd7cf6dd7bf6dd7af6dc79f6dc77f6dc76f6db75f6db73f6db72f6da
-70f6da6ff6da6df6d96cf6d96af6d869f6d868f6d866f6d764f6d763f6d661f6d65ff6d65ef6d55c
-f6d55bf6d459f6d457f6d356f6d354f6d352f6d250f6d24ff6d14df5d14bf5d049f5d048f5d046f5
-cf45f5cf43f5ce41f5ce3ff5cd3df5cd3cf5cc3af5cc38f5cb36f5cb34f5ca32
-
-f7e28ef7e28df7e28df7e28cf7e18bf7e18af7e189f7e188f7e187f7e086f7e085f7e084f7df83f7
-df82f7df81f7df80f6de7ff6de7ef6de7df6dd7bf6dd7af6dd79f6dc77f6dc76f6db75f6db73f6db
-72f6da70f6da6ff6da6df6d96cf6d96af6d869f6d867f6d865f6d764f6d762f6d661f6d65ff6d55d
-f6d55cf6d55af6d458f6d457f6d355f6d354f6d252f6d250f6d24ef6d14df5d14bf5d049f5d047f5
-cf45f5cf44f5ce42f5ce40f5ce3ef5cd3cf5cd3bf5cc39f5cc37f5cb35f5cb34
-
-Q
-Q
-Q
-Q
-q
-q
-n
-204 331 m
-268 331 l
-268 267 l
-204 267 l
-204 331 l
-h
-W
-q
-q
-[64 0 0 64 204 267]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-e8af16e8af16e7ae16e7ae16e7ad15e6ad15e6ac15e6ab15e5ab15e5aa15e5aa15e4a915e4a915e4
-a815e3a715e3a715e3a615e2a515e2a515e2a415e1a415e1a315e1a215e0a215e0a115e0a115dfa0
-14de9f14de9e14dd9d14dd9c14dc9c14dc9b14db9a14db9914da9814da9714d99714d99614d89514
-d89414d79314d79213d69113d59113d59013d48f13d48e13d38d13d38c13d28b13d28b13d18a13d0
-8913d08813cf8713cf8613ce8512ce8412cd8312cc8212cc8112cb8112cb8012
-
-e9b016e8b016e8af16e8ae16e7ae16e7ad15e7ad15e6ac15e6ac15e6ab15e5aa15e5aa15e5a915e4
-a915e4a815e4a715e3a715e3a615e2a515e2a515e2a415e1a415e1a315e1a215e0a215e0a115e0a1
-15dfa014de9f14de9e14dd9d14dd9c14dc9b14dc9b14db9a14db9914da9814da9714d99714d99614
-d89514d79414d79314d69213d69113d59113d59013d48f13d48e13d38d13d38c13d28b13d18a13d1
-8913d08913d08813cf8713ce8613ce8512cd8412cd8312cc8212cc8112cb8012
-
-e9b116e9b016e8b016e8af16e8af16e7ae16e7ae16e7ad15e6ac15e6ac15e6ab15e5aa15e5aa15e5
-a915e4a915e4a815e4a715e3a715e3a615e2a515e2a515e2a415e1a415e1a315e1a215e0a215e0a1
-15e0a115dfa014de9f14de9e14dd9d14dd9c14dc9b14dc9b14db9a14db9914da9814da9714d99614
-d89514d89514d79414d79314d69213d69113d59013d58f13d48f13d48e13d38d13d28c13d28b13d1
-8a13d18913d08813d08713cf8713ce8513ce8512cd8412cd8312cc8212cc8112
-
-e9b216e9b116e9b016e8b016e8af16e8af16e7ae16e7ae16e7ad15e6ac15e6ac15e6ab15e5aa15e5
-aa15e5a915e4a915e4a815e4a715e3a715e3a615e2a615e2a515e2a415e1a415e1a315e1a215e0a2
-15e0a115dfa014dfa014de9f14de9e14dd9d14dd9c14dc9b14dc9b14db9a14db9914da9814da9714
-d99614d89514d89514d79414d79313d69213d69113d59013d58f13d48e13d38d13d38d13d28c13d2
-8b13d18a13d18913d08813cf8713cf8613ce8513ce8412cd8312cd8312cc8212
-
-eab216e9b216e9b116e9b116e8b016e8af16e8af16e7ae16e7ae16e7ad15e6ac15e6ac15e6ab15e5
-ab15e5aa15e5a915e4a915e4a815e4a715e3a715e3a615e2a615e2a515e2a415e1a415e1a315e1a2
-15e0a215e0a115dfa014df9f14de9f14de9e14dd9d14dd9c14dc9b14dc9b14db9a14db9914da9814
-d99714d99614d89514d89414d79314d79313d69213d69113d59013d48f13d48e13d38d13d38c13d2
-8b13d28b13d18a13d08913d08813cf8713cf8613ce8512ce8412cd8312cc8212
-
-eab316eab216e9b216e9b116e9b116e9b016e8af16e8af16e8ae16e7ae16e7ad15e6ad15e6ac15e6
-ab15e5ab15e5aa15e5a915e4a915e4a815e4a715e3a715e3a615e2a615e2a515e2a415e1a415e1a3
-15e1a215e0a215e0a115dfa014df9f14de9f14de9e14dd9d14dd9c14dc9b14dc9a14db9914da9914
-da9814d99714d99614d89514d89414d79314d79313d69213d59113d59013d48f13d48e13d38d13d3
-8c13d28b13d18a13d18913d08913d08813cf8713ce8613ce8512cd8412cd8312
-
-ebb416eab316eab216eab216e9b116e9b116e9b016e8b016e8af16e8ae16e7ae16e7ad15e6ad15e6
-ac15e6ab15e5ab15e5aa15e5a915e4a915e4a815e4a715e3a715e3a615e2a615e2a515e2a415e1a4
-15e1a315e1a215e0a215e0a115dfa014df9f14de9f14de9e14dd9d14dd9c14dc9b14db9a14db9914
-da9914da9814d99714d99614d89514d89414d79314d79213d69113d59113d59013d48f13d48e13d3
-8d13d28c13d28b13d18a13d18913d08813cf8713cf8613ce8513ce8512cd8412
-
-ebb416ebb416eab316eab316eab216e9b216e9b116e9b016e8b016e8af16e8af16e7ae16e7ad15e6
-ad15e6ac15e6ab15e5ab15e5aa15e5a915e4a915e4a815e4a715e3a715e3a615e2a515e2a515e2a4
-15e1a415e1a315e1a215e0a215e0a115dfa014df9f14de9e14de9e14dd9d14dd9c14dc9b14db9a14
-db9914da9814da9714d99714d99614d89514d79414d79314d69213d69113d59013d58f13d48e13d3
-8d13d38d13d28c13d28b13d18a13d18913d08813cf8713cf8613ce8513ce8412
-
-ebb516ebb516ebb416eab316eab316eab216e9b216e9b116e9b016e8b016e8af16e8af16e7ae16e7
-ad15e6ad15e6ac15e6ab15e5ab15e5aa15e5a915e4a915e4a815e4a715e3a715e3a615e2a515e2a5
-15e2a415e1a415e1a315e0a215e0a115e0a115dfa014df9f14de9e14de9d14dd9d14dc9c14dc9b14
-db9a14db9914da9814da9714d99614d89514d89514d79414d79313d69213d69113d59013d48f13d4
-8e13d38d13d38c13d28b13d28b13d18a13d08913d08813cf8713cf8613ce8512
-
-ecb616ecb516ebb516ebb416eab416eab316eab216e9b216e9b116e9b116e8b016e8af16e8af16e7
-ae16e7ad15e6ad15e6ac15e6ab15e5ab15e5aa15e5a915e4a915e4a815e4a715e3a715e3a615e2a5
-15e2a515e2a415e1a315e1a315e0a215e0a115e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14
-dc9b14db9a14db9914da9814d99714d99614d89514d89414d79314d79313d69213d69113d59013d4
-8f13d48e13d38d13d38c13d28b13d18a13d18913d08813d08713cf8713ce8513
-
-ecb716ecb616ecb516ebb516ebb416eab416eab316eab216e9b216e9b116e9b116e8b016e8af16e8
-af16e7ae16e7ad15e6ad15e6ac15e6ab15e5ab15e5aa15e5a915e4a915e4a815e4a715e3a715e3a6
-15e2a515e2a515e2a415e1a315e1a315e0a215e0a115e0a115dfa014de9f14de9e14dd9d14dd9c14
-dc9b14dc9b14db9a14da9914da9814d99714d99614d89514d89414d79314d79213d69113d59113d5
-8f13d48f13d48e13d38d13d28c13d28b13d18a13d18913d08813cf8713cf8613
-
-edb716ecb716ecb616ecb616ebb516ebb416ebb416eab316eab216e9b216e9b116e9b116e8b016e8
-af16e8af16e7ae16e7ad15e6ad15e6ac15e6ab15e5ab15e5aa15e5a915e4a915e4a815e4a715e3a7
-15e3a615e2a515e2a515e1a415e1a315e1a315e0a215e0a115e0a115dfa014de9f14de9e14dd9d14
-dd9c14dc9b14dc9a14db9914da9914da9714d99714d99614d89514d79414d79314d69213d69113d5
-9013d58f13d48e13d38d13d38d13d28b13d28b13d18a13d08913d08813cf8713
-
-edb816edb716ecb716ecb616ecb616ebb516ebb416ebb416eab316eab216e9b216e9b116e9b116e8
-b016e8af16e8af16e7ae16e7ad15e6ad15e6ac15e6ab15e5ab15e5aa15e5a915e4a915e4a815e3a7
-15e3a715e3a615e2a515e2a515e1a415e1a315e1a215e0a215e0a115dfa014df9f14de9f14de9e14
-dd9d14dd9c14dc9b14db9a14db9914da9814da9714d99614d89514d89514d79414d79313d69213d6
-9113d59013d48f13d48e13d38d13d38c13d28b13d18a13d18913d08813d08713
-
-edb916edb816edb716ecb716ecb616ecb616ebb516ebb416ebb416eab316eab216e9b216e9b116e9
-b116e8b016e8af16e8af16e7ae16e7ad15e6ad15e6ac15e6ab15e5ab15e5aa15e5a915e4a915e4a8
-15e3a715e3a715e3a615e2a515e2a415e1a415e1a315e1a215e0a215e0a115dfa014df9f14de9e14
-de9d14dd9d14dc9c14dc9b14db9a14db9914da9814d99714d99614d89514d89414d79314d79213d6
-9113d59113d59013d48f13d48e13d38d13d28c13d28b13d18a13d18913d08813
-
-eeb916edb916edb816edb716ecb716ecb616ecb616ebb516ebb416ebb416eab316eab216e9b216e9
-b116e9b116e8b016e8af16e8af16e7ae16e7ad15e6ad15e6ac15e6ab15e5aa15e5aa15e5a915e4a9
-15e4a815e3a715e3a615e2a615e2a515e2a415e1a415e1a315e0a215e0a115e0a115dfa014df9f14
-de9e14dd9d14dd9c14dc9b14dc9b14db9a14da9914da9814d99714d99614d89514d89414d79314d6
-9213d69113d59013d58f13d48e13d38d13d38d13d28b13d28b13d18a13d08913
-
-eeba16eeb916edb916edb816edb816ecb716ecb616ecb616ebb516ebb416ebb416eab316eab216e9
-b216e9b116e9b116e8b016e8af16e8af16e7ae16e7ad15e6ad15e6ac15e6ab15e5aa15e5aa15e4a9
-15e4a815e4a815e3a715e3a615e2a615e2a515e2a415e1a415e1a315e0a215e0a115e0a115dfa014
-de9f14de9e14dd9d14dd9c14dc9b14dc9a14db9914da9814da9714d99714d99614d89514d79414d7
-9313d69213d69113d59013d48f13d48e13d38d13d38c13d28b13d18a13d18913
-
-efbb17eeba16eeb916eeb916edb816edb816ecb716ecb616ecb616ebb516ebb416ebb416eab316ea
-b216e9b216e9b116e9b116e8b016e8af16e8af16e7ae16e7ad15e6ac15e6ac15e6ab15e5aa15e5aa
-15e4a915e4a815e4a815e3a715e3a615e2a515e2a515e2a415e1a315e1a315e0a215e0a115dfa014
-df9f14de9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814da9714d99614d89514d89414d7
-9314d79313d69113d59113d59013d48f13d48e13d38d13d28c13d28b13d18a13
-
-efbb17efbb17eeba16eeba16eeb916edb816edb816ecb716ecb616ecb616ebb516ebb416ebb416ea
-b316eab216e9b216e9b116e9b116e8b016e8af16e8ae16e7ae16e7ad15e6ac15e6ac15e6ab15e5aa
-15e5aa15e4a915e4a815e4a715e3a715e3a615e2a515e2a515e1a415e1a315e1a215e0a215e0a115
-dfa014df9f14de9e14de9d14dd9d14dc9c14dc9b14db9a14db9914da9814d99714d99614d89514d8
-9414d79314d69213d69113d59013d58f13d48e13d38d13d38c13d28b13d28b13
-
-efbb17efbb17efbb17eeba16eeba16eeb916edb816edb816ecb716ecb616ecb616ebb516ebb416eb
-b416eab316eab216e9b216e9b116e9b016e8b016e8af16e8ae16e7ae16e7ad15e6ac15e6ac15e5ab
-15e5aa15e5a915e4a915e4a815e3a715e3a715e3a615e2a515e2a415e1a415e1a315e1a215e0a215
-e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14dc9a14db9914da9914da9714d99714d99614d8
-9514d79414d79313d69213d69113d59013d48f13d48e13d38d13d38c13d28b13
-
-efbc17efbb17efbb17efbb17eeba16eeba16eeb916edb816edb816ecb716ecb616ecb616ebb516eb
-b416ebb416eab316eab216e9b216e9b116e9b016e8b016e8af16e7ae16e7ae16e7ad15e6ac15e6ab
-15e5ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a615e2a515e2a415e1a415e1a315e0a215
-e0a115e0a115dfa014de9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814da9714d99614d8
-9514d89414d79314d79213d69113d59113d58f13d48f13d48e13d38d13d28c13
-
-f0bc17efbc17efbb17efbb17efbb17eeba16eeba16eeb916edb816edb816ecb716ecb616ecb616eb
-b516ebb416ebb416eab316eab216e9b216e9b116e9b016e8af16e8af16e7ae16e7ae16e7ad15e6ac
-15e6ab15e5ab15e5aa15e5a915e4a815e4a815e3a715e3a615e2a515e2a515e2a415e1a315e1a315
-e0a215e0a115dfa014df9f14de9f14de9d14dd9d14dc9c14dc9b14db9a14db9914da9814d99714d9
-9614d89514d89414d79314d69213d69113d59013d58f13d48e13d38d13d38c13
-
-f0bd17f0bc17efbc17efbb17efbb17efbb17eeba16eeba16eeb916edb816edb816ecb716ecb616ec
-b616ebb516ebb416eab416eab316eab216e9b116e9b116e9b016e8af16e8af16e7ae16e7ad15e6ad
-15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e4a715e3a715e3a615e2a515e2a515e1a415e1a315
-e1a215e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14dc9a14db9914da9914da9714d9
-9714d99614d89514d79414d79313d69213d69113d59013d48f13d48e13d38d13
-
-f0bd17f0bd17f0bc17efbc17efbb17efbb17efbb17eeba16eeba16eeb916edb816edb816ecb716ec
-b616ecb616ebb516ebb416eab416eab316eab216e9b116e9b116e8b016e8af16e8af16e7ae16e7ad
-15e6ac15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a715e3a615e2a515e2a415e1a415
-e1a315e0a215e0a115e0a115dfa014de9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814da
-9714d99614d89514d89414d79314d79213d69113d59013d58f13d48e13d38d13
-
-f0bd17f0bd17f0bd17f0bc17efbc17efbb17efbb17efbb17eeba16eeba16eeb916edb816edb716ec
-b716ecb616ecb616ebb516ebb416eab316eab316eab216e9b116e9b116e8b016e8af16e8ae16e7ae
-16e7ad15e6ac15e6ac15e5ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a615e2a515e2a415
-e1a315e1a315e0a215e0a115dfa014df9f14de9f14de9d14dd9d14dc9c14dc9b14db9a14db9914da
-9814d99714d99614d89514d79414d79313d69213d69113d59013d48f13d48e13
-
-f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbb17efbb17efbb17eeba16eeb916edb916edb816ed
-b716ecb716ecb616ecb516ebb516ebb416eab316eab216e9b216e9b116e9b016e8b016e8af16e7ae
-16e7ae16e7ad15e6ac15e6ab15e5ab15e5aa15e5a915e4a815e4a815e3a715e3a615e2a515e2a515
-e1a415e1a315e1a215e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14dc9a14db9914da
-9814da9714d99614d89514d89414d79314d79313d69113d59113d58f13d48f13
-
-f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbb17efbb17efbb17eeba16eeb916edb916ed
-b816edb716ecb716ecb616ecb516ebb516ebb416eab316eab216e9b216e9b116e9b016e8af16e8af
-16e7ae16e7ad15e6ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e4a715e3a715e3a615e2a515
-e2a415e1a415e1a315e0a215e0a115e0a115dfa014de9f14de9e14dd9d14dd9c14dc9b14db9a14db
-9914da9814d99714d99614d89514d89414d79314d69213d69113d59013d48f13
-
-f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbb17efbb17efbb17eeba16eeb916ed
-b916edb816edb716ecb716ecb616ebb516ebb416ebb416eab316eab216e9b216e9b116e9b016e8af
-16e8af16e7ae16e7ad15e6ac15e6ac15e6ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a615
-e2a515e2a415e1a315e1a315e0a215e0a115dfa014df9f14de9e14de9d14dd9d14dc9b14dc9b14db
-9914da9914da9814d99714d99614d89514d79414d79313d69213d59113d59013
-
-f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbb17efbb17efbb17eeba16ee
-b916edb916edb816edb716ecb616ecb616ebb516ebb416eab416eab316eab216e9b116e9b116e8b0
-16e8af16e8ae16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e5a915e4a915e4a815e3a715e3a615
-e2a515e2a515e1a415e1a315e1a215e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db
-9a14db9914da9814da9714d99614d89514d89414d79314d69213d69113d59013
-
-f2bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bc17f0bc17efbc17efbb17efbb17efbb17ee
-ba16eeb916edb816edb816ecb716ecb616ecb616ebb516ebb416eab316eab316eab216e9b116e9b1
-16e8b016e8af16e7ae16e7ae16e7ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e4a715e3a715
-e3a615e2a515e2a415e1a415e1a315e0a215e0a115e0a115dfa014de9f14de9e14dd9d14dc9c14dc
-9b14db9a14db9914da9814d99714d99614d89514d79414d79313d69213d69113
-
-f2c017f2bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bc17f0bc17efbc17efbb17efbb17ee
-ba16eeba16eeb916edb816edb716ecb716ecb616ecb516ebb516ebb416eab316eab216e9b216e9b1
-16e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ac15e6ab15e5aa15e5a915e4a915e4a815e3a715
-e3a615e2a615e2a515e2a415e1a315e1a215e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc
-9b14dc9a14db9914da9814da9714d99614d89514d89414d79314d79213d69113
-
-f2c017f2c017f2bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bc17f0bc17efbc17efbb17ef
-bb17eeba16eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416ebb416eab316eab216e9b2
-16e9b116e8b016e8af16e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e5a915e4a915e4a815
-e3a715e3a615e2a515e2a515e1a415e1a315e1a215e0a115e0a115dfa014de9f14de9e14dd9d14dd
-9c14dc9b14db9a14db9914da9814d99714d99614d89514d79414d79313d69213
-
-f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbc17ef
-bb17efbb17eeba16eeb916edb916edb816edb716ecb616ecb616ebb516ebb416eab416eab316eab2
-16e9b116e9b116e8b016e8af16e7ae16e7ae16e7ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815
-e4a715e3a715e3a615e2a515e2a415e1a415e1a315e0a215e0a115dfa014df9f14de9e14de9d14dd
-9c14dc9b14dc9a14db9914da9814da9714d99614d89514d89414d79314d79213
-
-f3c117f2c017f2c017f2bf17f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17ef
-bb17efbb17efbb17eeba16eeb916edb916edb816edb716ecb616ecb616ebb516ebb416eab316eab2
-16e9b216e9b116e9b016e8b016e8af16e7ae16e7ad15e6ac15e6ac15e6ab15e5aa15e5a915e4a915
-e4a815e3a715e3a615e2a515e2a515e1a415e1a315e1a215e0a215e0a115dfa014df9f14de9e14dd
-9d14dd9c14dc9b14db9a14db9914da9814d99714d99614d89514d79414d79313
-
-f3c117f3c117f2c017f2c017f2bf17f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bd17f0bc17ef
-bc17efbb17efbb17efbb17eeba16eeb916edb816edb816ecb716ecb616ecb516ebb516ebb416eab3
-16eab216e9b216e9b116e8b016e8af16e8af16e7ae16e7ad15e6ac15e6ab15e5ab15e5aa15e4a915
-e4a815e4a815e3a715e3a615e2a515e2a415e1a415e1a315e0a215e0a115e0a115df9f14de9f14de
-9d14dd9d14dc9b14dc9b14db9914da9814da9714d99614d89514d89414d79314
-
-f3c117f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bc17f0
-bc17efbc17efbb17efbb17eeba16eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416eab4
-16eab316eab216e9b116e9b116e8b016e8af16e7ae16e7ae16e7ad15e6ac15e6ab15e5aa15e5aa15
-e4a915e4a815e3a715e3a615e2a615e2a515e2a415e1a315e1a215e0a215e0a115dfa014df9f14de
-9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714d99614d89514d79414
-
-f3c217f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0
-bc17efbc17efbc17efbb17efbb17eeba16eeb916edb916edb816edb716ecb616ecb616ebb516ebb4
-16eab316eab316e9b216e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15
-e5a915e4a915e4a815e3a715e3a615e2a515e2a415e1a415e1a315e0a215e0a115e0a115df9f14de
-9f14de9d14dd9d14dc9b14dc9b14db9914da9914da9714d99614d89514d89414
-
-f3c217f3c217f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f1be17f0bd17f0
-bd17f0bc17efbc17efbb17efbb17efbb17eeba16eeb916edb816edb816ecb716ecb616ecb516ebb5
-16ebb416eab316eab216e9b216e9b116e8b016e8af16e8ae16e7ae16e7ad15e6ac15e6ab15e5aa15
-e5aa15e4a915e4a815e3a715e3a715e2a615e2a515e2a415e1a315e1a215e0a215e0a115dfa014df
-9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714d99614d89514
-
-f4c217f3c217f3c217f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0
-bd17f0bd17f0bc17efbc17efbb17efbb17efbb17eeba16eeb916edb816edb716ecb716ecb616ebb5
-16ebb416eab416eab316eab216e9b116e9b116e8b016e8af16e7ae16e7ad15e6ad15e6ac15e6ab15
-e5aa15e5a915e4a915e4a815e3a715e3a615e2a515e2a515e1a415e1a315e0a215e0a115e0a115df
-a014de9f14de9e14dd9d14dc9b14dc9b14db9914da9914da9714d99614d89514
-
-f4c317f4c217f3c217f3c117f3c117f3c117f2c017f2c017f2bf17f2bf17f1bf17f1be17f1be17f0
-bd17f0bd17f0bc17f0bc17efbc17efbb17efbb17eeba16eeb916edb916edb816edb716ecb616ecb6
-16ebb516ebb416eab316eab216e9b216e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ab15
-e5ab15e5aa15e4a915e4a815e4a715e3a715e3a615e2a515e2a415e1a315e1a315e0a215e0a115df
-a014df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714d99614
-
-f4c317f4c317f4c217f3c217f3c117f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f1
-be17f0bd17f0bd17f0bc17efbc17efbc17efbb17efbb17eeba16eeb916edb816edb816ecb716ecb6
-16ecb516ebb516ebb416eab316eab216e9b116e9b116e8b016e8af16e7ae16e7ae16e6ad15e6ac15
-e6ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a515e2a515e1a415e1a315e0a215e0a115e0
-a115dfa014de9f14de9d14dd9d14dc9b14dc9b14db9914da9814da9714d99614
-
-f4c317f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1
-be17f0bd17f0bd17f0bd17f0bc17efbc17efbb17efbb17efbb17eeba16eeb916edb816edb716ecb7
-16ecb616ebb516ebb416eab316eab316eab216e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15
-e6ac15e5ab15e5aa15e4a915e4a815e4a715e3a715e3a615e2a515e2a415e1a315e1a315e0a215e0
-a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714
-
-f5c418f4c317f4c317f4c217f4c217f3c217f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1
-be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb916edb816edb7
-16ecb616ecb616ebb516ebb416eab316eab216e9b216e9b116e8b016e8af16e8ae16e7ae16e7ad15
-e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a515e2a515e1a415e1a315e0a215e0
-a115e0a115dfa014de9f14de9d14dd9d14dc9b14dc9a14db9914da9814da9714
-
-f5c41af5c418f4c317f4c317f4c217f3c217f3c217f3c117f3c117f2c017f2c017f2bf17f2bf17f1
-be17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17efbb17eeba16eeb916edb816edb7
-16ecb716ecb616ebb516ebb416eab416eab316eab216e9b116e9b016e8b016e8af16e7ae16e7ad15
-e6ac15e6ac15e5ab15e5aa15e4a915e4a815e4a715e3a715e3a615e2a515e2a415e1a315e1a315e0
-a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914da9814
-
-f5c41bf5c419f5c418f4c317f4c317f4c217f3c217f3c117f3c117f3c117f2c017f2c017f2bf17f1
-bf17f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeba16edb916edb8
-16edb716ecb616ecb616ebb516ebb416eab316eab216e9b216e9b116e8b016e8af16e8ae16e7ae16
-e7ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a515e2a515e1a415e1a315e0
-a215e0a115e0a115df9f14de9f14de9d14dd9c14dc9b14dc9a14db9914da9814
-
-f5c51cf5c41af5c419f4c317f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2c017f2
-bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17f0bc17efbc17efbb17efbb17eeba16eeb916edb8
-16edb816ecb716ecb616ecb516ebb416ebb416eab316eab216e9b116e9b116e8b016e8af16e7ae16
-e7ad15e6ac15e6ac15e5ab15e5aa15e4a915e4a815e4a715e3a715e3a615e2a515e2a415e1a315e1
-a215e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14da9914
-
-f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c217f3c117f3c117f2c017f2c017f2
-bf17f2bf17f1be17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17efbb17eeba16eeb9
-16edb816edb716ecb716ecb616ebb516ebb416eab316eab216e9b216e9b116e8b016e8af16e8ae16
-e7ae16e7ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2a515e2a515e1a415e1
-a315e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14db9914
-
-f5c51ff5c51df5c41bf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f3c117f2c017f2
-c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb9
-16edb916edb816ecb716ecb616ecb516ebb416ebb416eab316eab216e9b116e9b116e8b016e8af16
-e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e4a915e4a815e4a715e3a715e3a615e2a515e2a415e1
-a315e1a215e0a215e0a115dfa014de9f14de9e14dd9d14dc9c14dc9b14db9914
-
-f5c620f5c51ef5c51cf5c41bf5c419f5c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2
-c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17efbb17eeba
-16eeb916edb816edb716ecb716ecb616ebb516ebb416eab316eab216e9b216e9b116e8b016e8af16
-e8ae16e7ae16e7ad15e6ac15e6ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a515e2a415e1
-a415e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14db9a14
-
-f5c621f5c620f5c51ef5c51cf5c41af5c419f4c317f4c317f4c217f4c217f3c217f3c117f3c117f2
-c017f2c017f2bf17f1bf17f1be17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba
-16eeb916edb916edb816ecb716ecb616ecb516ebb516ebb416eab316eab216e9b116e9b116e8b016
-e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3a715e2a615e2a515e2
-a415e1a315e1a215e0a115e0a115dfa014de9f14de9e14dd9d14dc9b14dc9a14
-
-f5c622f5c620f5c51ff5c51df5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3c117f3
-c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbc17efbb17efbb
-17eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416eab316eab216e9b216e9b116e8b016
-e8af16e8ae16e7ae16e7ad15e6ac15e6ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2a515e2
-a415e1a415e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14dc9b14
-
-f5c724f5c622f5c620f5c51ef5c51df5c41bf5c419f5c418f4c317f4c317f4c217f3c217f3c117f3
-c117f2c017f2c017f2bf17f2bf17f1be17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb17efbb
-17eeba16eeb916edb916edb816ecb716ecb616ecb516ebb516ebb416eab316eab216e9b116e9b016
-e8b016e8af16e7ae16e7ad15e6ac15e6ab15e5ab15e5aa15e4a915e4a815e3a715e3a615e2a515e2
-a515e1a415e1a315e0a215e0a115e0a115df9f14de9e14de9d14dd9c14dc9b14
-
-f5c724f5c623f5c621f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3c217f3c117f3
-c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17f0bc17efbc17efbb
-17efbb17eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416eab316eab216e9b216e9b116
-e8b016e8af16e7ae16e7ae16e6ad15e6ac15e6ab15e5aa15e5a915e4a915e4a815e3a715e3a615e2
-a515e2a415e1a315e1a215e0a215e0a115dfa014de9f14de9e14dd9d14dc9c14
-
-f5c726f5c724f5c622f5c620f5c51ff5c51df5c41bf5c41af5c418f4c317f4c317f4c217f3c217f3
-c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc17efbb
-17efbb17eeba16eeb916edb916edb816ecb716ecb616ecb516ebb416ebb416eab316eab216e9b116
-e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3a715e3a615e2
-a515e2a515e1a415e1a315e0a215e0a115dfa014df9f14de9e14dd9d14dd9c14
-
-f5c727f5c725f5c724f5c622f5c620f5c51ef5c51cf5c41bf5c419f4c317f4c317f4c217f4c217f3
-c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17f0bc17efbc
-17efbb17efbb17eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416eab316eab216e9b216
-e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e4a915e4a815e4a715e3a715e2
-a615e2a515e2a415e1a315e1a215e0a115e0a115dfa014de9f14de9d14dd9c14
-
-f5c828f5c727f5c724f5c623f5c621f5c51ff5c51ef5c51cf5c41af5c418f4c317f4c317f4c217f3
-c217f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17efbc
-17efbb17efbb17eeba16eeb916edb916edb816ecb716ecb616ecb516ebb416eab416eab316eab216
-e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5a915e4a915e4a815e3a715e3
-a615e2a515e2a415e1a415e1a315e0a215e0a115dfa014df9f14de9e14dd9d14
-
-f5c829f5c827f5c726f5c724f5c622f5c620f5c51ef5c51df5c41bf5c419f5c418f4c317f4c317f4
-c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc17f0bc
-17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb616ecb616ebb516ebb416eab316eab216
-e9b116e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e4a915e4a815e3a715e3
-a615e2a515e2a515e1a415e1a315e0a215e0a115dfa014df9f14de9e14dd9d14
-
-f5c82af5c829f5c727f5c725f5c723f5c621f5c620f5c51ef5c51cf5c41af5c418f4c317f4c317f4
-c217f3c217f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc
-17efbc17efbb17efbb17eeba16eeb916edb916edb816ecb716ecb616ebb516ebb416eab316eab316
-e9b216e9b116e8b016e8af16e8ae16e7ae16e6ad15e6ac15e6ab15e5aa15e5a915e4a815e4a815e3
-a715e3a615e2a515e2a415e1a315e1a215e0a215e0a115dfa014de9f14de9d14
-
-f5c92bf5c82af5c828f5c726f5c724f5c622f5c620f5c51ff5c51df5c41bf5c41af5c418f4c317f4
-c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd17f0bc
-17efbc17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb616ecb616ebb516ebb416eab316
-eab216e9b116e9b016e8b016e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5aa15e4a915e4a815e3
-a715e3a615e2a515e2a415e1a415e1a315e0a215e0a115dfa014df9f14de9e14
-
-f5c92df5c82bf5c829f5c727f5c725f5c723f5c622f5c620f5c51ef5c51cf5c41af5c418f4c317f4
-c317f4c217f3c217f3c117f3c117f2c017f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd
-17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416eab316
-eab216e9b216e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e4a915e4a815e3
-a715e3a615e2a615e2a515e1a415e1a315e0a215e0a115dfa014df9f14de9e14
-
-f5c92df5c92cf5c82af5c828f5c726f5c724f5c622f5c621f5c51ff5c51df5c41bf5c41af5c418f4
-c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd17f0bd
-17f0bc17efbc17efbb17efbb17eeba16eeba16edb916edb816ecb716ecb616ecb516ebb416eab416
-eab316eab216e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5a915e4a915e4
-a815e3a715e3a615e2a515e2a415e1a315e1a215e0a215e0a115dfa014de9f14
-
-f5c92ff5c92df5c92bf5c829f5c827f5c725f5c724f5c622f5c620f5c51ef5c51cf5c41af5c418f4
-c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2c017f2bf17f1be17f1be17f1be17f0bd
-17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb716ecb616ebb516ebb416
-eab316eab216e9b116e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5aa15e4a915e4
-a815e3a715e3a615e2a515e2a415e1a415e1a315e0a215e0a115dfa014df9f14
-
-f5ca2ff5c92ef5c92cf5c82af5c828f5c727f5c724f5c623f5c621f5c51ff5c51df5c41bf5c41af5
-c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd
-17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb916edb816ecb716ecb616ebb516ebb416
-eab316eab216e9b216e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ac15e5ab15e5aa15e4a915e4
-a815e3a715e3a615e2a615e2a515e1a415e1a315e0a215e0a115dfa014df9f14
-
-f5ca31f5c92ff5c92df5c92bf5c829f5c827f5c725f5c724f5c622f5c620f5c51ef5c51cf5c41af5
-c418f4c317f4c317f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be17f0bd
-17f0bd17f0bc17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb616ecb616ebb516
-ebb416eab316eab216e9b116e9b016e8af16e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5a915e4
-a915e4a815e3a715e3a615e2a515e2a415e1a315e1a215e0a215e0a115dfa014
-
-f5ca31f5ca30f5c92ef5c92cf5c82af5c828f5c727f5c724f5c623f5c621f5c51ff5c51df5c41bf5
-c419f5c418f4c317f4c217f4c217f3c217f3c117f3c117f2c017f2c017f2bf17f1bf17f1be17f1be
-17f0bd17f0bd17f0bc17efbc17efbb17efbb17eeba16eeb916edb816edb716ecb716ecb616ebb516
-ebb416eab316eab216e9b116e9b116e8b016e8af16e7ae16e7ad15e6ac15e6ab15e5aa15e5aa15e4
-a915e4a815e3a715e3a615e2a515e2a415e1a415e1a315e0a215e0a115dfa014
-
-Q
-Q
-Q
-Q
-q
-q
-n
-268 331 m
-332 331 l
-332 267 l
-268 267 l
-268 331 l
-h
-W
-q
-q
-[64 0 0 64 268 267]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-ca8012ca7f12c97e12c87d12c87c12c77b12c77a12c67912c57811c57711c47611c47511c37411c2
-7311c27211c17111c07011c06f11bf6e11be6c10be6b10bd6a10bc6910bc6810bb6710ba6610ba65
-10b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cb8012ca8012c97e12c97e12c87d12c87c12c77b12c67a12c67912c57811c57711c47611c37511c3
-7411c27311c17111c17011c06f11bf6e11bf6d10be6c10be6b10bd6a10bc6910bb6810bb6710ba66
-10ba6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cb8012ca8012ca7f12c97e12c97d12c87c12c77c12c77a12c67a12c67912c57811c47611c47511c3
-7411c27311c27211c17111c17011c06f11bf6e11bf6d10be6c10bd6b10bd6a10bc6810bb6710bb66
-10ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cb8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c77a12c67912c57811c57711c47611c4
-7511c37411c27311c27211c17111c07011c06f11bf6d10be6c10be6b10bd6a10bc6910bc6810bb67
-10ba6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cc8112cb8012cb8012ca8012c97f12c97e12c87d12c87c12c77b12c67a12c67912c57811c57711c4
-7611c37511c37411c27211c17111c17011c06f11bf6e11bf6d10be6c10bd6b10bd6a10bc6910bb68
-10bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cc8212cc8112cb8012ca8012ca7f12c97e12c97d12c87c12c77c12c77a12c67a12c67912c57711c4
-7611c47511c37411c27311c27211c17111c07011c06f11bf6e11be6d10be6c10bd6a10bd6910bc68
-10bb6710ba6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cd8312cc8212cb8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c77a12c67912c57811c5
-7711c47611c37511c37411c27311c17211c17111c06f11c06e11bf6d10be6c10be6b10bd6a10bc69
-10bb6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cd8312cc8212cc8112cb8112cb8012ca8012c97f12c97e12c87d12c87c12c77b12c67a12c67912c5
-7811c47711c47611c37511c37311c27211c17111c17011c06f11bf6e11bf6d10be6c10bd6b10bd69
-10bc6810bb6710bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cd8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c97d12c87c12c77b12c77a12c67a12c6
-7912c57711c47611c47511c37411c27311c27211c17111c07011c06f11bf6d10be6c10be6b10bd6a
-10bc6910bc6810bb6710ba6610ba6510b96310b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-ce8512cd8412cd8312cc8212cb8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c6
-7912c57811c57711c47611c37511c37411c27311c17111c17011c06f11bf6e11bf6d10be6c10bd6b
-10bd6a10bc6910bb6710bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-ce8513ce8412cd8312cc8212cc8112cb8012cb8012ca8012c97e12c97e12c87d12c77c12c77b12c6
-7a12c67912c57811c47611c47511c37411c27311c27211c17111c07011c06f11bf6e11be6d10be6b
-10bd6a10bc6910bc6810bb6710ba6610ba6510b96410b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cf8613ce8512cd8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c7
-7a12c67912c67912c57711c47611c37511c37411c27311c17211c17011c06f11c06e11bf6d10be6c
-10bd6b10bd6a10bc6910bb6810bb6610ba6510b96410b96310b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cf8713ce8513ce8512cd8412cd8312cc8212cb8112cb8012ca8012ca7f12c97e12c87d12c87c12c7
-7b12c67a12c67912c57811c47711c47611c37411c37311c27211c17111c17011c06f11bf6e11be6d
-10be6c10bd6a10bd6910bc6810bb6710ba6610ba6510b96410b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-cf8713cf8613ce8513ce8412cd8312cc8212cc8112cb8012cb8012ca7f12c97e12c97d12c87c12c7
-7c12c77a12c67a12c67912c57711c47611c47511c37411c27311c17211c17111c07011c06e11bf6d
-10be6c10bd6b10bd6a10bc6910bb6810bb6610ba6510b96410b96310b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d08813cf8713ce8613ce8512cd8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c8
-7c12c77b12c67a12c67912c57811c57711c47611c37511c37311c27211c17111c17011c06f11bf6e
-11be6d10be6c10bd6a10bd6910bc6810bb6710ba6610ba6510b96410b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d08813cf8713cf8613ce8513ce8412cd8312cd8312cc8112cb8112cb8012ca8012c97f12c97e12c8
-7d12c77c12c77b12c67a12c67912c57711c47611c47511c37411c27311c27211c17111c07011c06e
-11bf6d10be6c10be6b10bd6a10bc6910bb6810bb6710ba6510b96410b96310b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d18913d08813cf8713cf8613ce8512ce8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c8
-7d12c87c12c77b12c77a12c67912c57811c57711c47611c37511c37411c27211c17111c17011c06f
-11bf6e11bf6d10be6c10bd6b10bd6910bc6810bb6710ba6610ba6510b96410b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d18913d08913d08713cf8713ce8613ce8512cd8412cd8312cc8212cb8112cb8012ca8012c97f12c9
-7e12c87d12c87c12c77b12c67a12c67912c57811c47611c47511c37411c27311c27211c17111c070
-11c06f11bf6d10be6c10be6b10bd6a10bc6910bb6810bb6710ba6510b96410b96310b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d18a13d18913d08813cf8713cf8613ce8513ce8412cd8312cc8212cc8112cb8012ca8012ca7f12c9
-7e12c97d12c87c12c77b12c77a12c67912c57811c57711c47611c37511c37411c27311c17111c170
-11c06f11bf6e11bf6d10be6c10bd6b10bd6910bc6810bb6710ba6610ba6510b96410b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d28b13d18a13d08913d08813cf8713ce8613ce8512cd8412cd8312cc8212cb8112cb8012ca8012ca
-7f12c97e12c87d12c87c12c77b12c67a12c67912c57811c47711c47511c37411c27311c27211c171
-11c07011c06f11bf6d10be6c10be6b10bd6a10bc6910bb6810bb6610ba6510b96410b96310b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d28b13d18a13d18913d08813cf8713cf8613ce8513ce8412cd8312cc8212cc8112cb8012cb8012ca
-7f12c97e12c97d12c87c12c77b12c77a12c67912c57811c57711c47611c37511c37411c27311c171
-11c17011c06f11bf6e11bf6d10be6c10bd6a10bd6910bc6810bb6710ba6610ba6510b96410b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d28c13d28b13d18a13d08913d08813cf8713cf8613ce8512cd8412cd8312cc8212cc8112cb8012ca
-8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57811c47711c47511c37411c27311c272
-11c17111c07011c06f11bf6d10be6c10be6b10bd6a10bc6910bb6810bb6610ba6510b96410b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d38c13d28b13d18a13d18913d08913d08713cf8713ce8513ce8512cd8312cd8312cc8112cb8112cb
-8012ca7f12c97e12c97d12c87c12c77b12c77a12c67912c67912c57711c47611c37511c37411c273
-11c17111c17011c06f11bf6e11bf6d10be6c10bd6a10bd6910bc6810bb6710ba6610ba6510b96310
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d38d13d28c13d28b13d18a13d18913d08813cf8713cf8613ce8512ce8412cd8312cc8212cc8112cb
-8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57811c47711c47511c37411c273
-11c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6a10bc6910bb6710bb6610ba6510b96410
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d38d13d38d13d28b13d28b13d18a13d08913d08813cf8713ce8513ce8512cd8312cd8312cc8112cb
-8112cb8012ca8012c97e12c97e12c87c12c77b12c77a12c67912c67912c57711c47611c37511c374
-11c27211c17111c17011c06f11bf6e11be6d10be6c10bd6a10bc6910bc6810bb6710ba6610ba6510
-b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d48e13d38d13d38c13d28b13d18a13d18913d08813cf8713cf8613ce8512ce8412cd8312cc8212cc
-8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57811c47711c47511c374
-11c27311c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6a10bc6910bb6710bb6610ba6510
-b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d48f13d48e13d38d13d28c13d28b13d18a13d08913d08813cf8713ce8613ce8512cd8412cd8312cc
-8112cb8112cb8012ca8012c97e12c97d12c87c12c77b12c77a12c67912c57811c57711c47611c375
-11c37411c27211c17111c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bc6810bb6710ba6610
-ba6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d58f13d48e13d38d13d38c13d28b13d18a13d18913d08813cf8713cf8613ce8512ce8412cd8312cc
-8212cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57811c47611c475
-11c37411c27311c27211c17111c06f11c06e11bf6d10be6c10bd6b10bd6a10bc6810bb6710bb6610
-ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d59013d48f13d48e13d38d13d28c13d28b13d18a13d08913d08813cf8713ce8613ce8512cd8412cd
-8312cc8112cb8112cb8012ca8012c97e12c97d12c87c12c77b12c77a12c67912c57811c57711c476
-11c37511c37311c27211c17111c07011c06f11bf6e11be6c10be6b10bd6a10bc6910bb6810bb6710
-ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d59013d58f13d48e13d38d13d38c13d28b13d18a13d18913d08813cf8713cf8613ce8512ce8412cd
-8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57811c476
-11c47511c37411c27311c17211c17011c06f11bf6e11bf6d10be6c10bd6b10bd6910bc6810bb6710
-ba6610ba6510b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d69113d59013d48f13d48e13d38d13d28c13d28b13d18a13d08913d08813cf8713ce8613ce8512cd
-8312cd8312cc8112cb8112cb8012ca7f12c97e12c97d12c87c12c77b12c77a12c67912c57811c577
-11c47611c37511c37311c27211c17111c07011c06f11bf6d10be6c10be6b10bd6a10bc6910bb6810
-bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d69113d59013d58f13d48e13d38d13d38c13d28b13d18a13d18913d08813cf8713cf8613ce8512ce
-8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c577
-11c47611c47511c37411c27311c17111c17011c06f11bf6e11be6d10be6c10bd6a10bc6910bc6810
-bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d69213d69113d59013d48f13d48e13d38d13d28c13d28b13d18a13d08913d08813cf8713ce8513ce
-8512cd8312cd8312cc8112cb8012cb8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c578
-11c47711c47611c37411c27311c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6a10bc6810
-bb6710bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d79213d69113d59013d58f13d48e13d38d13d38c13d28b13d18a13d18913d08813cf8713cf8613ce
-8512cd8412cd8312cc8212cb8112cb8012ca8012c97f12c97e12c87d12c77c12c77a12c67a12c679
-12c57711c47611c37511c37411c27211c17111c17011c06f11bf6e11be6d10be6b10bd6a10bc6910
-bc6810bb6710ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d79313d69213d69113d59013d48f13d48e13d38d13d28c13d28b13d18a13d08913d08713cf8713ce
-8513ce8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c679
-12c57811c47711c47511c37411c27311c27211c17111c06f11bf6e11bf6d10be6c10bd6b10bd6910
-bc6810bb6710ba6610ba6510b96310b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d79314d79213d69113d59013d58f13d48e13d38d13d38c13d28b13d18a13d18913d08813cf8713cf
-8613ce8512cd8412cd8312cc8212cb8112cb8012ca8012c97f12c97e12c87c12c77b12c77a12c679
-12c57811c57711c47611c37511c37311c27211c17111c07011c06f11bf6d10be6c10be6b10bd6a10
-bc6910bb6710bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d79414d79313d69213d69113d59013d48f13d48e13d38d13d28c13d28b13d18913d08913d08713cf
-8613ce8513ce8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a
-12c67912c57711c47611c47511c37411c27311c17211c17011c06f11bf6e11be6d10be6c10bd6a10
-bc6910bc6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d89414d79314d79213d69113d59013d58f13d48e13d38d13d38c13d28b13d18a13d18913d08813cf
-8713cf8613ce8512cd8412cd8312cc8212cb8112cb8012ca8012c97e12c97d12c87c12c77b12c77a
-12c67912c57811c47711c47611c37411c27311c27211c17111c07011c06e11bf6d10be6c10bd6b10
-bd6a10bc6810bb6710ba6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d89514d79414d79313d69213d69113d59013d48f13d48e13d38d13d28b13d18a13d18913d08813cf
-8713cf8613ce8513ce8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c77c12c77b
-12c67a12c67912c57711c47611c37511c37411c27211c17111c17011c06f11bf6e11be6c10be6b10
-bd6a10bc6910bb6810bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d89514d89414d79314d69213d69113d59013d48f13d48e13d38d13d28c13d28b13d18a13d08913d0
-8813cf8713ce8613ce8512cd8312cd8312cc8112cb8012ca8012ca7f12c97e12c87d12c87c12c77b
-12c67a12c67912c57811c47611c47511c37411c27311c17211c17011c06f11bf6e11bf6d10be6c10
-bd6a10bc6910bc6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d99614d89514d79414d79313d69213d59113d58f13d48f13d38d13d38c13d28b13d18a13d18913d0
-8813cf8713cf8613ce8512cd8412cd8312cc8212cb8112cb8012ca8012c97f12c97e12c87c12c77b
-12c77a12c67912c57811c57711c47611c37511c37311c27211c17111c07011c06e11bf6d10be6c10
-bd6b10bd6a10bc6810bb6710bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d99614d89514d89414d79314d69213d69113d59013d48f13d48e13d38d13d28c13d28b13d18a13d0
-8913d08813cf8713ce8513ce8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d12c87c
-12c77b12c67a12c67912c57711c47611c37511c37411c27311c17111c17011c06f11bf6e11be6d10
-be6b10bd6a10bc6910bb6810bb6610ba6510b96410b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-d99714d99614d89514d79414d79313d69113d59013d58f13d48e13d38d13d38c13d28b13d18a13d1
-8913d08813cf8713cf8613ce8512cd8412cd8312cc8212cb8112cb8012ca7f12c97e12c97d12c87c
-12c77b12c67a12c67912c57811c47711c47511c37411c27311c27211c17111c06f11bf6e11bf6d10
-be6c10bd6b10bd6910bc6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-da9714d99614d89514d89414d79314d69213d69113d59013d48f13d48e13d38d13d28c13d28b13d1
-8913d08813d08713cf8613ce8513ce8412cd8312cc8212cc8112cb8012ca8012c97f12c97e12c87d
-12c77c12c77a12c67912c57811c57711c47611c37511c37311c27211c17111c07011c06f11bf6d10
-be6c10bd6b10bd6a10bc6810bb6710bb6610ba6510b96410b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-da9814d99714d89514d89514d79314d79213d69113d59013d58f13d48e13d38d13d28c13d28b13d1
-8a13d08913d08813cf8713ce8613ce8512cd8312cc8212cc8112cb8012ca8012ca7f12c97e12c87d
-12c87c12c77b12c67a12c67912c57711c47611c47511c37411c27311c17111c17011c06f11bf6e11
-be6d10be6b10bd6a10bc6910bb6810bb6610ba6510b96410b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-da9814d99714d99614d89514d79414d79313d69213d59113d59013d48f13d38d13d38c13d28b13d1
-8a13d18913d08813cf8713cf8613ce8512cd8412cd8312cc8212cb8112cb8012ca8012c97e12c97d
-12c87c12c77b12c77a12c67912c57811c47711c47511c37411c27311c27211c17111c06f11bf6e11
-bf6d10be6c10bd6a10bd6910bc6810bb6710ba6610ba6410b96310b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-da9914da9714d99614d89514d89414d79314d69213d69113d59013d48f13d48e13d38d13d28c13d2
-8b13d18a13d08913d08713cf8613ce8513ce8412cd8312cc8212cc8112cb8012ca8012ca7f12c97e
-12c87d12c77c12c77a12c67912c67912c57711c47611c37511c37311c27211c17111c07011c06f11
-bf6d10be6c10bd6b10bd6a10bc6810bb6710ba6610ba6510b96410b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-db9914da9814d99714d99614d89514d79414d79313d69113d59013d58f13d48e13d38d13d38c13d2
-8b13d18a13d18913d08813cf8713ce8613ce8512cd8412cd8312cc8112cb8012ca8012ca7f12c97e
-12c87d12c87c12c77b12c67a12c67912c57711c47611c47511c37411c27311c17111c17011c06f11
-bf6e11be6c10be6b10bd6a10bc6910bb6810bb6610ba6510b96410b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-db9914da9814da9714d99614d89514d89414d79314d69213d69113d59013d48f13d48e13d38d13d2
-8b13d18a13d18913d08813cf8713cf8613ce8512cd8412cd8312cc8212cb8112cb8012ca8012c97e
-12c97d12c87c12c77b12c77a12c67912c57811c47711c47511c37411c27311c27211c17111c06f11
-bf6e11bf6d10be6c10bd6a10bc6910bc6810bb6710ba6610ba6410b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-db9a14db9914da9814d99714d89514d89414d79314d79213d69113d59013d48f13d48e13d38d13d2
-8c13d28b13d18a13d08913d08813cf8713ce8513ce8412cd8312cc8212cc8112cb8012ca8012ca7f
-12c97e12c87d12c77c12c77a12c67912c67912c57711c47611c37511c37311c27211c17111c07011
-c06e11bf6d10be6c10bd6b10bd6a10bc6810bb6710ba6610ba6510b96310b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-db9a14db9914da9814d99714d99614d89514d79414d79313d69213d59113d58f13d48e13d38d13d3
-8c13d28b13d18a13d18913d08813cf8713ce8613ce8512cd8412cd8312cc8112cb8012ca8012ca7f
-12c97e12c87d12c87c12c77b12c67a12c67912c57711c47611c37511c37411c27311c17111c17011
-c06f11bf6e11be6c10be6b10bd6a10bc6910bb6710bb6610ba6510b96410b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dc9b14db9914da9814da9714d99614d89514d89414d79314d69213d69113d59013d48f13d48e13d3
-8d13d28b13d28b13d18913d08813cf8713cf8613ce8512cd8412cd8312cc8212cb8112cb8012ca80
-12c97e12c97d12c87c12c77b12c67a12c67912c57811c47711c47511c37411c27311c17211c17011
-c06f11bf6e11be6d10be6c10bd6a10bc6910bc6810bb6710ba6510b96410b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dc9b14db9a14db9914da9814d99714d99614d89514d79314d79213d69113d59013d58f13d48e13d3
-8d13d28c13d28b13d18a13d08913d08813cf8713ce8513ce8412cd8312cc8212cc8112cb8012ca80
-12ca7f12c97e12c87d12c77c12c77a12c67912c57811c57711c47611c37411c27311c27211c17111
-c07011c06e11bf6d10be6c10bd6b10bd6910bc6810bb6710ba6610ba6410b96310b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dc9b14dc9a14db9914da9814d99714d99614d89514d79414d79313d69213d59113d58f13d48e13d3
-8d13d38c13d28b13d18a13d18913d08813cf8713ce8613ce8512cd8412cd8312cc8112cb8012ca80
-12ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711c47611c37511c37411c27211c17111
-c07011c06f11bf6d10be6c10bd6b10bd6a10bc6810bb6710bb6610ba6510b96410b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dc9c14dc9b14db9a14da9914da9714d99614d89514d89414d79314d69213d69113d59013d48f13d4
-8e13d38d13d28b13d18a13d18913d08813cf8713cf8613ce8512cd8412cd8312cc8212cb8112cb80
-12ca8012c97e12c97d12c87c12c77b12c67a12c67912c57811c47611c47511c37411c27311c17111
-c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bb6810bb6610ba6510b96410b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dd9c14dc9b14db9a14db9914da9814d99714d99614d89514d79314d79213d69113d59013d58f13d4
-8e13d38d13d28c13d28b13d18a13d08913d08713cf8613ce8513ce8412cd8312cc8212cc8112cb80
-12ca8012c97f12c97e12c87c12c77b12c77a12c67912c57811c57711c47611c37411c27311c27211
-c17111c06f11bf6e11bf6d10be6c10bd6a10bc6910bc6810bb6710ba6510b96410b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dd9d14dc9b14dc9a14db9914da9814d99714d99614d89514d79414d79313d69213d59113d58f13d4
-8e13d38d13d38c13d28b13d18a13d18913d08813cf8713ce8613ce8512cd8312cc8212cc8112cb80
-12ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711c47611c37511c37311c27211
-c17111c07011c06e11bf6d10be6c10bd6b10bd6910bc6810bb6710ba6610ba6510b96310b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dd9d14dc9c14dc9b14db9a14da9914da9714d99614d89514d89414d79314d69213d69113d59013d4
-8f13d48e13d38d13d28b13d18a13d18913d08813cf8713cf8613ce8512cd8412cd8312cc8212cb81
-12cb8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711c47611c37511c37411c27211
-c17111c07011c06f11bf6e11be6c10be6b10bd6a10bc6910bb6710bb6610ba6510b96410b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-dd9d14dd9c14dc9b14db9a14db9914da9814d99714d99614d89514d79314d79213d69113d59013d4
-8f13d48e13d38d13d28c13d28b13d18a13d08913d08713cf8613ce8513ce8412cd8312cc8212cb81
-12cb8012ca8012c97e12c97d12c87c12c77b12c67a12c67912c57811c47711c47511c37411c27311
-c17211c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bb6810bb6610ba6510b96410b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-de9d14dd9d14dc9b14dc9a14db9914da9814d99714d99614d89514d79414d79313d69113d59113d5
-8f13d48e13d38d13d38c13d28b13d18a13d08913d08813cf8713ce8513ce8412cd8312cc8212cc81
-12cb8012ca8012ca7f12c97e12c87d12c77c12c77a12c67912c57811c57711c47611c37411c27311
-c27211c17111c06f11bf6e11bf6d10be6c10bd6a10bc6910bc6810bb6710ba6510b96410b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-de9e14dd9d14dc9c14dc9b14db9914da9814da9714d99614d89514d89414d79314d69213d69113d5
-9013d48f13d38d13d38c13d28b13d18a13d18913d08813cf8713cf8613ce8512cd8412cd8312cc81
-12cb8012ca8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711c47611c37511c37311
-c27211c17111c07011c06e11bf6d10be6c10bd6b10bd6910bc6810bb6710ba6610ba6410b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-de9e14dd9d14dd9c14dc9b14db9a14db9914da9814d99714d89514d89414d79314d69213d69113d5
-9013d48f13d48e13d38d13d28c13d28b13d18913d08813cf8713cf8613ce8512cd8412cd8312cc82
-12cb8112cb8012ca7f12c97e12c87d12c87c12c77b12c67a12c67912c57711c47611c37511c37411
-c27211c17111c07011c06f11bf6d10be6c10bd6b10bd6a10bc6810bb6710ba6610ba6510b96310b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-de9f14de9d14dd9c14dc9b14db9a14db9914da9814d99714d99614d89514d79414d79313d69113d5
-9013d58f13d48e13d38d13d28c13d28b13d18a13d08913d08713cf8613ce8513ce8412cd8312cc82
-12cb8112cb8012ca8012c97e12c97d12c87c12c77b12c67a12c67912c57811c47711c47511c37411
-c27311c17211c17011c06f11bf6e11be6d10be6b10bd6a10bc6910bb6810bb6610ba6510b96410b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-de9f14de9e14dd9d14dc9c14dc9b14db9914da9814da9714d99614d89514d79414d79313d69213d5
-9113d58f13d48e13d38d13d38c13d28b13d18a13d08913d08813cf8713ce8513ce8512cd8312cc82
-12cc8112cb8012ca8012ca7f12c97e12c87d12c77c12c77a12c67912c57811c57711c47611c37411
-c27311c27211c17111c06f11bf6e11bf6d10be6c10bd6a10bc6910bc6810bb6710ba6510b96410b9
-6310b96310b96310b96310b96310b96310b96310b96310b96310b96310b96310
-
-Q
-Q
-Q
-Q
-Q
-0.0471 0.0431 0.0431 rg
-0.1157 w 0 J 0 j 11 M
-[]0 d
-n
-166.4 167.9 m
-166.4 167.6 l
-S
-0 0 0 rg
-n
-26.7 171.6 m
-26.7 91.5 91.6 26.6 171.7 26.6 c
-251.8 26.6 316.7 91.5 316.7 171.6 c
-316.7 251.7 251.8 316.6 171.7 316.6 c
-91.6 316.6 26.7 251.7 26.7 171.6 c
-26.7 171.6 l
-h
-0 171.6 m
-0 266.4 76.9 343.3 171.7 343.3 c
-266.5 343.3 343.4 266.4 343.4 171.6 c
-343.4 76.8 266.5 -0.1 171.7 -0.1 c
-76.9 0 0 76.8 0 171.6 c
-h
-f*
-q
-n
-97.4 283.4 m
-73 267.5 44.7 229.5 42.2 185.2 c
-49.4 186.5 53.5 194.8 62.5 194.5 c
-67 214.3 69 238.7 111.3 283.4 c
-108.4 286.7 100.2 282.6 97.4 283.4 c
-97.4 283.4 l
-h
-W*
-q
-q
-n
-42 249 m
-106 249 l
-106 185 l
-42 185 l
-42 249 l
-h
-W
-q
-q
-[64 0 0 64 42 185]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-fbe0a2fbe0a3fce1a5fce1a6fce1a7fce2a8fce2a9fde3abfde4acfde4adfde4aefde5affde5b0fd
-e5b1fde6b2fde6b3fde7b4fde7b5fde7b6fde8b7fde8b8fde8b9fde9bafde9bbfde9bcfdeabefdea
-befdeac0fdebc1fdebc2fdebc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeefcc
-feefcdfeefcefeefcefef0cffef0d0fef0d1fef0d2fef1d2fef1d3fef1d4fef2d5fef2d6fef2d7fe
-f2d8fef3d8fef3d9fef3dafef3dbfef4dcfef4ddfef4ddfef4defef5dffef5e0
-
-fbdfa0fbdfa1fbe0a3fbe0a4fce1a5fce1a6fde2a8fde3a9fde3aafde3abfde4acfde4adfde4aefd
-e5affde5b0fde6b1fde6b2fde6b3fde7b4fde7b6fde7b7fde8b8fde8b9fde8bafde9bbfde9bcfde9
-bdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeeca
-fdeecbfeefccfeefcdfeefcefeefcffef0d0fef0d0fef0d1fef1d2fef1d3fef1d4fef1d4fef2d5fe
-f2d6fef2d7fef2d8fef3d9fef3d9fef3dafef4dbfef4dcfef4ddfef4defef5df
-
-fbde9efbdf9ffbdfa1fbe0a2fbe0a3fbe0a4fde2a6fde2a7fde3a8fde3a9fde3abfde4abfde4adfd
-e4aefde5affde5b0fde5b1fde6b2fde6b3fde6b4fde7b5fde7b6fde7b7fde8b8fde8b9fde9bafde9
-bbfde9bcfdeabdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc6fdedc6fdedc8fdedc9
-fdeecafdeecbfeefccfeefcdfeefcdfeefcefef0cffef0d0fef0d1fef0d2fef1d2fef1d3fef1d4fe
-f1d5fef2d6fef2d6fef2d7fef3d8fef3d9fef3dafef3dbfef4dbfef4dcfef4dd
-
-fbde9cfbde9dfbdf9efbdfa0fbdfa1fce1a3fce1a4fde2a6fde2a7fde2a8fde3a9fde3aafde3abfd
-e4acfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde7b4fde7b5fde7b6fde8b7fde8b8fde8
-b9fde9bbfde9bbfde9bdfdeabefdeabffdeac0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7
-fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefeefcefef0cffef0d0fef0d1fef0d2fef1d3fe
-f1d4fef1d4fef2d5fef2d6fef2d7fef2d8fef3d8fef3d9fef3dafef3dbfef4dc
-
-fbdd9afbde9bfbde9cfbde9dfce09ffce0a1fce1a2fce1a4fce1a5fde2a6fde2a7fde2a8fde3a9fd
-e3aafde3abfde4acfde4adfde5aefde5affde5b0fde6b1fde6b3fde6b3fde7b5fde7b6fde7b7fde8
-b8fde8b9fde8bafde9bbfde9bcfde9bdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5
-fdedc6fdedc7fdedc8fdeec9fdeecafeefccfeefccfeefcdfeefcefef0cffef0d0fef0d0fef0d1fe
-f1d2fef1d3fef1d4fef1d5fef2d5fef2d6fef2d7fef2d8fef3d9fef3dafef3db
-
-fbdd98fbdd99fbdd9afbde9cfcdf9efce09ffce0a0fce0a2fce1a3fce1a4fde2a6fde2a6fde2a8fd
-e3a8fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde6b4fde7b5fde7
-b6fde8b7fde8b8fde8b9fde9bafde9bbfde9bcfdeabdfdeabefdeabffdebc1fdebc1fdebc3fdecc3
-fdecc5fdecc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefeefcefef0cffef0d0fe
-f0d1fef0d2fef1d2fef1d3fef1d4fef1d5fef2d6fef2d7fef2d7fef3d8fef3d9
-
-fbdc96fbdc97fbdd98fcde9afcdf9cfcdf9dfcdf9efce0a0fce0a1fce0a2fce1a3fce1a5fde2a6fd
-e2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde7
-b4fde7b5fde7b6fde8b7fde8b8fde8bafde9bbfde9bcfde9bdfdeabefdeabffdebc0fdebc1fdebc2
-fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefeefcffe
-f0cffef0d0fef0d1fef1d2fef1d3fef1d4fef1d4fef2d5fef2d6fef2d7fef2d8
-
-fbdb93fbdc95fbdc96fcde98fcde9afcde9bfcdf9cfcdf9dfcdf9ffce0a0fce0a1fce1a2fce1a4fc
-e1a5fde2a6fde2a7fde2a8fde3a9fde3aafde4abfde4acfde4aefde5aefde5b0fde5b0fde6b2fde6
-b3fde6b4fde7b5fde7b6fde7b7fde8b8fde8b9fde8bafde9bbfde9bcfdeabdfdeabefdeabffdebc0
-fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc9fdeec9fdeecbfeefccfeefccfeefcdfe
-efcefef0cffef0d0fef0d1fef0d1fef1d2fef1d3fef1d4fef1d5fef2d6fef2d6
-
-fbdb91fbdb93fcdd95fcdd96fcdd97fcde99fcde9afcde9bfcdf9dfcdf9efce09ffce0a0fce0a2fc
-e1a3fce1a4fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde5
-b1fde6b2fde6b3fde7b4fde7b5fde7b6fde8b7fde8b8fde8b9fde9bafde9bbfde9bcfdeabefdeabe
-fdeac0fdebc1fdebc2fdebc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfe
-efcdfeefcefeefcefef0cffef0d0fef0d1fef0d2fef1d2fef1d3fef1d4fef2d5
-
-fbda8ffbdb92fcdc93fcdc94fcdd95fcdd97fcdd98fcde99fcde9bfcdf9cfcdf9dfcdf9efce0a0fc
-e0a1fce0a2fce1a4fce1a5fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde4aefde5
-affde5b0fde6b1fde6b2fde6b3fde7b4fde7b6fde7b6fde8b8fde8b9fde8bafde9bbfde9bcfde9bd
-fdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafd
-eecbfeefccfeefcdfeefcefeefcffef0d0fef0d0fef0d1fef1d2fef1d3fef1d4
-
-fbda8dfcdb90fcdb91fcdc92fcdc93fcdc95fcdd96fcdd97fcde99fcde9afcde9bfcdf9cfcdf9efc
-df9ffce0a0fce0a1fce1a3fce1a4fce1a5fde2a6fde2a7fde3a8fde3a9fde3abfde4abfde4adfde4
-aefde5affde5b0fde5b1fde6b2fde6b3fde6b4fde7b5fde7b6fde7b7fde8b8fde8b9fde9bafde9bb
-fde9bcfdeabdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc6fdedc6fdedc8fdedc9fd
-eecafdeecbfeefccfeefccfeefcdfeefcefef0cffef0d0fef0d1fef0d2fef1d2
-
-fad98cfcda8dfcdb8ffcdb90fcdb91fcdc93fcdc94fcdd95fcdd96fcdd98fcde99fcde9afcde9bfc
-df9dfcdf9efce09ffce0a1fce0a2fce1a3fce1a4fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4
-acfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde7b4fde7b5fde7b6fde8b7fde8b8fde8b9
-fde9bafde9bbfde9bcfdeabefdeabffdeac0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fd
-edc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefeefcefef0cffef0d0fef0d1
-
-fbd98afbda8bfcda8dfcda8efcdb8ffcdb90fcdc92fcdc93fcdc94fcdd95fcdd97fcdd98fcde99fc
-de9bfcdf9cfcdf9dfcdf9efce0a0fce0a1fce1a2fce1a4fce1a5fde2a6fde2a7fde2a8fde3a9fde3
-aafde3abfde4acfde4adfde5aefde5affde5b0fde6b1fde6b3fde6b3fde7b5fde7b6fde7b7fde8b8
-fde8b9fde8bafde9bbfde9bcfde9bdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5fd
-edc6fdedc7fdedc8fdeec9fdeecafeefccfeefccfeefcdfeefcefef0cffef0d0
-
-fbd988fbd989fbd98bfbda8cfcda8dfcdb8efcdb90fcdb91fcdc92fcdc94fcdd95fcdd96fcdd97fc
-de99fcde9afcde9bfcdf9dfcdf9efce09ffce0a0fce0a2fce1a3fce1a4fde2a6fde2a6fde2a8fde3
-a8fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde6b4fde7b5fde7b6
-fde8b7fde8b8fde8b9fde9bafde9bbfde9bcfdeabdfdeabefdeabffdebc0fdebc1fdebc3fdecc3fd
-ecc5fdecc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcdfeefce
-
-fbd886fbd887fbd989fbd98afbda8bfbda8cfcda8efcdb8ffcdb90fcdc92fcdc93fcdc94fcdd95fc
-dd97fcdd98fcde99fcde9afcdf9cfcdf9dfcdf9efce0a0fce0a1fce0a2fce1a3fce1a5fde2a6fde2
-a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde7b4
-fde7b5fde7b6fde8b7fde8b8fde8b9fde9bbfde9bbfde9bdfdeabefdeabffdebc0fdebc1fdebc2fd
-ecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcd
-
-fbd784fbd885fbd886fbd988fbd989fbd98afbda8cfcda8dfcdb8efcdb8ffcdb91fcdc92fcdc93fc
-dc94fcdd96fcdd97fcde98fcde9afcde9bfcdf9cfcdf9dfcdf9ffce0a0fce0a1fce1a2fce1a4fce1
-a5fde2a6fde2a7fde2a8fde3a9fde3aafde4abfde4acfde4aefde5aefde5b0fde5b0fde6b2fde6b3
-fde6b4fde7b5fde7b6fde7b7fde8b8fde8b9fde8bafde9bbfde9bcfdeabdfdeabefdeabffdebc0fd
-ebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc9fdeec9fdeecbfeefcc
-
-fbd782fbd783fbd884fbd886fbd887fbd988fbd989fbd98bfbda8cfcda8dfcdb8efcdb90fcdb91fc
-dc92fcdc94fcdd95fcdd96fcdd97fcde99fcde9afcde9bfcdf9dfcdf9efce09ffce0a0fce0a2fce1
-a3fce1a4fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde5b1
-fde6b2fde6b3fde7b4fde7b5fde7b6fde8b7fde8b8fde8b9fde9bafde9bbfde9bcfdeabdfdeabefd
-eabffdebc1fdebc2fdebc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeeca
-
-fbd680fbd781fbd782fbd784fbd885fbd886fbd887fbd989fbd98afbda8bfbda8cfcda8efcdb8ffc
-db90fcdc92fcdc93fcdc94fcdd95fcdd97fcdd98fcde99fcde9bfcdf9cfcdf9dfcdf9efce0a0fce0
-a1fce0a2fce1a4fce1a5fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde4aefde5af
-fde5b0fde6b1fde6b2fde6b3fde7b4fde7b6fde7b6fde8b8fde8b8fde8bafde9bbfde9bcfde9bdfd
-eabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8
-
-fbd67efbd67ffbd680fbd782fbd783fbd784fbd885fbd887fbd988fbd989fbd98bfbda8cfcda8dfc
-db8efcdb90fcdb91fcdc92fcdc93fcdc95fcdd96fcdd97fcde98fcde9afcde9bfcdf9cfcdf9efcdf
-9ffce0a0fce0a1fce1a3fce1a4fce1a5fde2a6fde2a7fde2a8fde3a9fde3abfde4abfde4adfde4ae
-fde5affde5b0fde5b1fde6b2fde6b3fde6b4fde7b5fde7b6fde7b7fde8b8fde8b9fde9bafde9bbfd
-e9bcfdeabdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc6fdedc6
-
-fbd57cfbd57dfbd67efbd67ffbd681fbd782fbd783fbd885fbd886fbd887fbd988fbd98afbd98bfb
-da8cfcda8dfcdb8ffcdb90fcdb91fcdc92fcdc94fcdd95fcdd96fcdd98fcde99fcde9afcde9bfcdf
-9dfcdf9efce09ffce0a0fce0a2fce1a3fce1a4fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4ac
-fde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde7b4fde7b5fde7b6fde8b7fde8b8fde8b9fd
-e9bafde9bbfde9bcfdeabefdeabefdeac0fdebc1fdebc2fdecc3fdecc4fdecc5
-
-fbd479fbd57bfbd57cfbd57dfbd67ffbd680fbd781fbd782fbd784fbd885fbd886fbd887fbd989fb
-d98afbda8bfbda8cfcda8efcdb8ffcdb90fcdc92fcdc93fcdc94fcdd95fcdd97fcdd98fcde99fcde
-9bfcdf9cfcdf9dfcdf9efce0a0fce0a1fce1a2fce1a4fce1a5fde2a6fde2a7fde2a8fde3a9fde3aa
-fde3abfde4acfde4adfde5aefde5affde5b0fde6b1fde6b3fde6b3fde7b5fde7b6fde7b7fde8b8fd
-e8b9fde8bafde9bbfde9bcfde9bdfdeabefdeabffdebc0fdebc1fdebc2fdecc3
-
-fbd477fbd479fbd47afbd57bfbd57cfbd67efbd67ffbd680fbd782fbd783fbd784fbd885fbd887fb
-d988fbd989fbd98bfbda8cfcda8dfcdb8efcdb90fcdb91fcdc92fcdc94fcdc95fcdd96fcdd97fcde
-99fcde9afcde9bfcdf9dfcdf9efce09ffce0a0fce0a2fce1a3fce1a4fce1a5fde2a6fde2a7fde3a8
-fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde6b4fde7b5fde7b6fd
-e8b7fde8b8fde8b9fde9bafde9bbfde9bcfdeabdfdeabefdeabffdebc0fdebc1
-
-fbd375fbd377fbd478fbd479fbd57bfbd57cfbd57dfbd67efbd680fbd681fbd782fbd784fbd885fb
-d886fbd887fbd989fbd98afbda8bfbda8cfcda8efcdb8ffcdb90fcdb91fcdc93fcdc94fcdd95fcdd
-97fcdd98fcde99fcde9afcdf9cfcdf9dfcdf9efce09ffce0a1fce0a2fce1a3fce1a5fde2a6fde2a7
-fde2a8fde3a9fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde7b4fd
-e7b5fde7b6fde8b7fde8b8fde8b9fde9bbfde9bbfde9bdfdeabefdeabffdeac0
-
-fad273fbd375fbd376fbd477fbd478fbd47afbd57bfbd57cfbd67efbd67ffbd680fbd781fbd783fb
-d784fbd885fbd886fbd988fbd989fbd98afbda8bfcda8dfcdb8efcdb8ffcdb91fcdc92fcdc93fcdc
-94fcdd96fcdd97fcde98fcde99fcde9bfcdf9cfcdf9dfcdf9ffce0a0fce0a1fce1a2fce1a4fce1a5
-fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4aefde5aefde5b0fde5b0fde6b2fde6b3fd
-e6b4fde7b5fde7b6fde7b7fde8b8fde8b9fde8bafde9bbfde9bcfdeabdfdeabe
-
-fad271fad272fbd374fbd375fbd376fbd478fbd479fbd57afbd57bfbd57dfbd67efbd67ffbd680fb
-d782fbd783fbd884fbd885fbd887fbd988fbd989fbd98bfbda8cfcda8dfcdb8efcdb90fcdb91fcdc
-92fcdc94fcdd95fcdd96fcdd97fcde99fcde9afcde9bfcdf9dfcdf9efce09ffce0a0fce0a2fce1a3
-fce1a4fde2a6fde2a6fde2a8fde3a9fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde5b1fd
-e6b2fde6b3fde6b4fde7b5fde7b6fde8b7fde8b8fde8b9fde9bafde9bbfde9bc
-
-fad16efad170fad272fad273fbd374fbd375fbd477fbd478fbd479fbd57bfbd57cfbd57dfbd67efb
-d680fbd781fbd782fbd784fbd885fbd886fbd887fbd989fbd98afbda8bfbda8cfcda8efcdb8ffcdb
-90fcdc92fcdc93fcdc94fcdd95fcdd97fcdd98fcde99fcde9bfcdf9cfcdf9dfcdf9efce0a0fce0a1
-fce0a2fce1a3fce1a5fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde4aefde5affd
-e5b0fde5b1fde6b2fde6b3fde7b4fde7b6fde7b6fde8b8fde8b8fde8bafde9bb
-
-fad06cfad16efad16ffad271fad272fbd374fbd375fbd376fbd477fbd479fbd47afbd57bfbd57cfb
-d67efbd67ffbd680fbd782fbd783fbd784fbd885fbd887fbd988fbd989fbd98afbda8cfcda8dfcdb
-8efcdb90fcdb91fcdc92fcdc93fcdc95fcdd96fcdd97fcde98fcde9afcde9bfcdf9cfcdf9dfcdf9f
-fce0a0fce0a1fce1a3fce1a4fce1a5fde2a6fde2a7fde2a8fde3a9fde3aafde4abfde4acfde4aefd
-e5affde5b0fde5b1fde6b2fde6b3fde6b4fde7b5fde7b6fde7b7fde8b8fde8b9
-
-facf6afad06bfad06dfad16efad170fad271fad273fbd374fbd375fbd377fbd478fbd479fbd57afb
-d57cfbd57dfbd67efbd67ffbd681fbd782fbd783fbd884fbd886fbd887fbd988fbd98afbd98bfbda
-8cfcda8dfcdb8ffcdb90fcdb91fcdc92fcdc94fcdd95fcdd96fcdd97fcde99fcde9afcde9bfcdf9d
-fcdf9efce09ffce0a0fce0a2fce1a3fce1a4fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfd
-e4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde7b4fde7b5fde7b6fde8b7
-
-face67facf69facf6afad06cfad06dfad16ffad170fad272fad273fbd374fbd376fbd477fbd478fb
-d479fbd57bfbd57cfbd57dfbd67efbd680fbd781fbd782fbd784fbd885fbd886fbd887fbd989fbd9
-8afbda8bfbda8cfcda8efcdb8ffcdb90fcdc92fcdc93fcdc94fcdd95fcdd97fcdd98fcde99fcde9b
-fcdf9cfcdf9dfcdf9efce0a0fce0a1fce0a2fce1a4fce1a5fde2a6fde2a7fde2a8fde3a9fde3aafd
-e3abfde4acfde4adfde4aefde5affde5b0fde6b1fde6b3fde6b3fde7b5fde7b6
-
-face65face66facf68facf69fad06bfad06cfad16efad16ffad271fad272fbd374fbd375fbd376fb
-d477fbd479fbd47afbd57bfbd57cfbd67efbd67ffbd680fbd782fbd783fbd784fbd885fbd887fbd9
-88fbd989fbd98bfbda8cfcda8dfcdb8efcdb90fcdb91fcdc92fcdc94fcdc95fcdd96fcdd97fcde99
-fcde9afcde9bfcdf9cfcdf9efce09ffce0a0fce0a2fce1a3fce1a4fce1a5fde2a6fde2a7fde3a8fd
-e3a9fde3abfde4abfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde6b4
-
-facd63facd64face65face67facf68facf6afad06bfad06dfad16efad170fad271fad273fbd374fb
-d375fbd377fbd478fbd479fbd57bfbd57cfbd57dfbd67efbd680fbd681fbd782fbd783fbd885fbd8
-86fbd887fbd989fbd98afbda8bfbda8cfcda8efcdb8ffcdb90fcdb91fcdc93fcdc94fcdd95fcdd96
-fcdd98fcde99fcde9afcdf9cfcdf9dfcdf9efce09ffce0a1fce0a2fce1a3fce1a4fde2a6fde2a7fd
-e2a8fde3a9fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde5b1fde6b2
-
-facc60facd62facd63facd64face66face67facf69facf6afad06cfad06dfad16ffad170fad272fa
-d273fbd375fbd376fbd477fbd478fbd47afbd57bfbd57cfbd57dfbd67ffbd680fbd781fbd783fbd7
-84fbd885fbd886fbd988fbd989fbd98afbda8bfcda8dfcda8efcdb8ffcdb90fcdc92fcdc93fcdc94
-fcdd96fcdd97fcde98fcde99fcde9bfcdf9cfcdf9dfcdf9efce0a0fce0a1fce1a2fce1a4fce1a5fd
-e2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde5aefde5affde5b0
-
-facb5efacc5ffacc61facd62facd64face65face66facf68facf69fad06bfad06cfad16efad16ffa
-d271fad272fbd374fbd375fbd376fbd477fbd479fbd47afbd57bfbd57dfbd67efbd67ffbd680fbd7
-82fbd783fbd884fbd885fbd887fbd988fbd989fbd98bfbda8cfcda8dfcdb8efcdb90fcdb91fcdc92
-fcdc94fcdd95fcdd96fcdd97fcde99fcde9afcde9bfcdf9dfcdf9efce09ffce0a0fce0a2fce1a3fc
-e1a4fde2a6fde2a6fde2a8fde3a8fde3aafde3abfde4acfde4adfde4aefde5af
-
-faca5bfacb5dfacb5efacc60facc61facd63facd64face65face67facf68facf6afad06bfad06dfa
-d16efad170fad271fad273fbd374fbd375fbd477fbd478fbd479fbd57bfbd57cfbd57dfbd67efbd6
-80fbd781fbd782fbd784fbd885fbd886fbd887fbd989fbd98afbda8bfbda8cfcda8efcdb8ffcdb90
-fcdc92fcdc93fcdc94fcdd95fcdd97fcdd98fcde99fcde9bfcdf9cfcdf9dfcdf9efce0a0fce0a1fc
-e0a2fce1a3fce1a5fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4ad
-
-faca59faca5afacb5cfacb5dfacc5ffacc60facd62facd63facd64face66face67facf69facf6afa
-d06cfad06dfad16ffad271fad272fbd374fbd375fbd376fbd477fbd479fbd47afbd57bfbd57cfbd6
-7efbd67ffbd680fbd782fbd783fbd784fbd885fbd887fbd988fbd989fbd98afbda8cfcda8dfcdb8e
-fcdb8ffcdb91fcdc92fcdc93fcdc95fcdd96fcdd97fcde98fcde9afcde9bfcdf9cfcdf9dfcdf9ffc
-e0a0fce0a1fce1a3fce1a4fce1a5fde2a6fde2a7fde2a8fde3a9fde3aafde4ab
-
-fac956fac958faca59faca5bfacb5cfacb5efacc5ffacc61facd62facd64face65face66facf68fa
-cf6afad06bfad06dfad16efad170fad271fad273fbd374fbd375fbd376fbd478fbd479fbd57afbd5
-7cfbd57dfbd67efbd67ffbd681fbd782fbd783fbd884fbd886fbd887fbd988fbd989fbd98bfbda8c
-fcda8dfcdb8ffcdb90fcdb91fcdc92fcdc94fcdd95fcdd96fcdd97fcde99fcde9afcde9bfcdf9dfc
-df9efce09ffce0a0fce0a2fce1a3fce1a4fde2a6fde2a7fde2a8fde3a9fde3aa
-
-fac854fac855fac957fac958faca5afaca5bfacb5dfacb5efacc60facc61facd63facd64face66fa
-ce67facf69facf6afad06cfad06dfad16ffad170fad272fad273fbd374fbd376fbd477fbd478fbd4
-79fbd57bfbd57cfbd57dfbd67efbd680fbd781fbd782fbd784fbd885fbd886fbd887fbd989fbd98a
-fbda8bfbda8cfcda8efcdb8ffcdb90fcdc92fcdc93fcdc94fcdd95fcdd97fcdd98fcde99fcde9bfc
-df9cfcdf9dfcdf9efce0a0fce0a1fce0a2fce1a4fce1a5fde2a6fde2a7fde2a8
-
-fac752fac853fac855fac956fac957faca59faca5afacb5cfacb5dfacc5ffacc60facd62facd63fa
-ce65face66facf68facf69fad06bfad06cfad16efad16ffad271fad272fbd374fbd375fbd376fbd4
-77fbd479fbd47afbd57bfbd57cfbd67efbd67ffbd680fbd782fbd783fbd784fbd885fbd887fbd988
-fbd989fbd98bfbda8cfcda8dfcdb8efcdb90fcdb91fcdc92fcdc94fcdc95fcdd96fcdd97fcde99fc
-de9afcde9bfcdf9cfcdf9efcdf9ffce0a0fce0a1fce1a3fce1a4fce1a5fde2a6
-
-fac64ffac751fac752fac854fac855fac956fac958faca59faca5bfacb5cfacb5efacc5ffacc61fa
-cd62facd64face65face67facf68facf6afad06bfad06dfad16efad170fad271fad273fbd374fbd3
-75fbd377fbd478fbd479fbd57bfbd57cfbd57dfbd67efbd680fbd681fbd782fbd783fbd885fbd886
-fbd887fbd988fbd98afbda8bfbda8cfcda8efcdb8ffcdb90fcdb91fcdc93fcdc94fcdd95fcdd96fc
-dd98fcde99fcde9afcde9bfcdf9dfcdf9efce09ffce0a1fce0a2fce1a3fce1a4
-
-fac64dfac64efac750fac751fac853fac854fac855fac957fac958faca5afaca5bfacb5dfacb5efa
-cc60facd62facd63facd64face66face67facf69facf6afad06cfad06dfad16ffad170fad272fad2
-73fbd375fbd376fbd477fbd478fbd47afbd57bfbd57cfbd57dfbd67ffbd680fbd781fbd782fbd784
-fbd885fbd886fbd988fbd989fbd98afbda8bfcda8dfcda8efcdb8ffcdb90fcdc92fcdc93fcdc94fc
-dd95fcdd97fcde98fcde99fcde9bfcdf9cfcdf9dfcdf9efce0a0fce0a1fce1a2
-
-fac54afac54cfac64dfac64ffac750fac752fac853fac855fac956fac957faca59faca5bfacb5cfa
-cb5efacc5ffacc61facd62facd64face65face66facf68facf69fad06bfad06cfad16efad16ffad2
-71fad272fbd374fbd375fbd376fbd477fbd479fbd47afbd57bfbd57cfbd67efbd67ffbd680fbd782
-fbd783fbd884fbd885fbd887fbd988fbd989fbd98bfbda8cfcda8dfcdb8efcdb90fcdb91fcdc92fc
-dc94fcdd95fcdd96fcdd97fcde99fcde9afcde9bfcdf9dfcdf9efce09ffce0a0
-
-fac448fac449fac54bfac54cfac64efac64ffac751fac752fac854fac855fac957fac958faca5afa
-ca5bfacb5dfacb5efacc60facc61facd63facd64face65face67facf68facf6afad06bfad06dfad1
-6efad170fad271fad273fbd374fbd375fbd377fbd478fbd479fbd57bfbd57cfbd57dfbd67efbd680
-fbd781fbd782fbd784fbd885fbd886fbd887fbd989fbd98afbda8bfbda8cfcda8efcdb8ffcdb90fc
-dc92fcdc93fcdc94fcdd95fcdd97fcdd98fcde99fcde9afcdf9cfcdf9dfcdf9e
-
-fac346fac447fac448fac54afac54bfac64dfac64efac750fac751fac853fac854fac956fac957fa
-ca59faca5afacb5cfacb5dfacc5ffacc60facd62facd63facd64face66face67facf69facf6afad0
-6cfad06dfad16ffad170fad272fad273fbd375fbd376fbd477fbd479fbd47afbd57bfbd57cfbd67e
-fbd67ffbd680fbd781fbd783fbd784fbd885fbd887fbd988fbd989fbd98afbda8cfcda8dfcdb8efc
-db8ffcdb91fcdc92fcdc93fcdc94fcdd96fcdd97fcde98fcde9afcde9bfcdf9c
-
-fac243fac345fac346fac447fac449fac54afac54cfac64dfac64ffac750fac752fac853fac855fa
-c956fac958faca59faca5bfacb5cfacb5efacc5ffacc61facd62facd64face65face66facf68facf
-69fad06bfad06cfad16efad170fad271fad273fbd374fbd375fbd376fbd478fbd479fbd57afbd57b
-fbd57dfbd67efbd67ffbd681fbd782fbd783fbd884fbd886fbd887fbd988fbd989fbd98bfbda8cfc
-da8dfcdb8efcdb90fcdb91fcdc92fcdc94fcdd95fcdd96fcdd97fcde99fcde9a
-
-fac241fac242fac344fac345fac346fac448fac449fac54bfac54cfac64efac64ffac751fac853fa
-c854fac855fac957fac958faca5afaca5bfacb5dfacb5efacc60facc61facd63facd64face65face
-67facf69facf6afad06cfad06dfad16ffad170fad272fad273fbd374fbd375fbd477fbd478fbd479
-fbd57bfbd57cfbd57dfbd67efbd680fbd781fbd782fbd784fbd885fbd886fbd887fbd989fbd98afb
-da8bfbda8cfcda8efcdb8ffcdb90fcdc92fcdc93fcdc94fcdd95fcdd97fcdd98
-
-fac13efac140fac241fac243fac344fac346fac447fac448fac54afac54cfac64dfac64ffac750fa
-c752fac853fac855fac956fac957faca59faca5afacb5cfacb5dfacc5ffacc60facd62facd63face
-65face66facf68facf69fad06bfad06cfad16efad16ffad271fad272fbd374fbd375fbd376fbd477
-fbd479fbd47afbd57bfbd57cfbd67efbd67ffbd680fbd782fbd783fbd784fbd885fbd887fbd988fb
-d989fbd98bfbda8cfcda8dfcdb8efcdb90fcdb91fcdc92fcdc93fcdc95fcdd96
-
-fac03cfac03dfac13ffac140fac242fac243fac345fac346fac448fac449fac54bfac54cfac64efa
-c64ffac751fac752fac854fac855fac956fac958faca59faca5bfacb5cfacb5efacc5ffacc61facd
-62facd64face65face67facf68facf6afad06bfad06dfad16efad170fad271fad273fbd374fbd375
-fbd377fbd478fbd479fbd57afbd57cfbd57dfbd67efbd680fbd681fbd782fbd783fbd885fbd886fb
-d887fbd988fbd98afbd98bfbda8cfcda8dfcdb8ffcdb90fcdb91fcdc93fcdc94
-
-fabf39fac03bfac03cfac13efac13ffac241fac242fac344fac345fac447fac448fac54afac54bfa
-c64dfac64efac750fac751fac853fac854fac855fac957fac958faca5afaca5bfacb5dfacb5efacc
-60facc61facd63facd64face66face67facf69facf6afad06cfad06dfad16ffad170fad272fad273
-fbd374fbd376fbd477fbd478fbd47afbd57bfbd57cfbd57dfbd67ffbd680fbd781fbd782fbd784fb
-d885fbd886fbd887fbd989fbd98afbda8bfcda8dfcda8efcdb8ffcdb90fcdc92
-
-f9be37fabf38fabf3afac03bfac03dfac13efac140fac241fac243fac344fac346fac447fac449fa
-c54afac54cfac64dfac64ffac750fac752fac853fac855fac956fac957faca59faca5afacb5cfacb
-5dfacc5ffacc61facd62facd64face65face66facf68facf69fad06bfad06cfad16efad16ffad271
-fad272fbd374fbd375fbd376fbd477fbd479fbd47afbd57bfbd57cfbd67efbd67ffbd680fbd782fb
-d783fbd884fbd885fbd887fbd988fbd989fbd98bfbda8cfcda8dfcdb8efcdb90
-
-f9be34f9be36fabf38fabf39fabf3afac03cfac03dfac13ffac140fac242fac243fac345fac346fa
-c448fac449fac54bfac54cfac64efac64ffac751fac752fac854fac855fac956fac958faca5afaca
-5bfacb5dfacb5efacc60facc61facd63facd64face65face67facf68facf6afad06bfad06dfad16e
-fad170fad271fad273fbd374fbd375fbd377fbd478fbd479fbd57bfbd57cfbd57dfbd67efbd680fb
-d781fbd782fbd784fbd885fbd886fbd887fbd989fbd98afbda8bfbda8cfcda8e
-
-f9bd32f9bd33f9be35f9be36fabf38fabf39fac03bfac03cfac13efac140fac241fac243fac344fa
-c346fac447fac448fac54afac54bfac64dfac64efac750fac751fac853fac854fac956fac957faca
-59faca5afacb5cfacb5dfacc5ffacc60facd62facd63facd64face66face67facf69facf6afad06c
-fad06dfad16ffad170fad272fad273fbd375fbd376fbd477fbd479fbd47afbd57bfbd57cfbd67efb
-d67ffbd680fbd781fbd783fbd784fbd885fbd886fbd988fbd989fbd98afbda8c
-
-f9bc2ff9bc31f9bd32f9bd34f9be35f9be37fabf39fabf3afac03cfac03dfac13ffac140fac242fa
-c243fac345fac346fac447fac449fac54afac54cfac64dfac64ffac750fac752fac853fac855fac9
-56fac958faca59faca5bfacb5cfacb5efacc5ffacc61facd62facd64face65face66facf68facf69
-fad06bfad06cfad16efad16ffad271fad273fbd374fbd375fbd376fbd478fbd479fbd57afbd57bfb
-d57dfbd67efbd67ffbd680fbd782fbd783fbd884fbd886fbd887fbd988fbd989
-
-f9bb2cf9bc2ef9bc30f9bd31f9bd33f9be35f9be36fabf38fabf39fac03bfac03cfac13efac13ffa
-c241fac242fac344fac345fac346fac448fac449fac54bfac54cfac64efac64ffac751fac752fac8
-54fac855fac957fac958faca5afaca5bfacb5dfacb5efacc60facc61facd63facd64face65face67
-facf68facf6afad06cfad06dfad16ffad170fad272fad273fbd374fbd375fbd477fbd478fbd479fb
-d57bfbd57cfbd57dfbd67efbd680fbd781fbd782fbd784fbd885fbd886fbd887
-
-f9ba2af9bb2bf9bb2df9bc2ff9bc30f9bd32f9bd34f9be35f9be37fabf38fabf3afac03bfac03dfa
-c13efac140fac241fac243fac344fac346fac447fac448fac54afac54bfac64dfac64efac750fac7
-52fac853fac855fac956fac957faca59faca5afacb5cfacb5dfacc5ffacc60facd62facd63face65
-face66facf68facf69fad06bfad06cfad16efad16ffad271fad272fbd374fbd375fbd376fbd477fb
-d479fbd47afbd57bfbd57cfbd67efbd67ffbd680fbd782fbd783fbd784fbd885
-
-f9b927f9ba29f9ba2af9bb2cf9bb2df9bc2ff9bc31f9bd32f9bd34f9be36fabf38fabf39fabf3afa
-c03cfac03dfac13ffac140fac242fac243fac345fac346fac447fac449fac54bfac54cfac64efac6
-4ffac751fac752fac854fac855fac956fac958faca59faca5bfacb5cfacb5efacc5ffacc61facd62
-facd64face65face67facf68facf6afad06bfad06dfad16efad170fad271fad273fbd374fbd375fb
-d377fbd478fbd479fbd57afbd57cfbd57dfbd67efbd67ffbd681fbd782fbd783
-
-f9b925f9b926f9ba28f9ba29f9bb2bf9bb2cf9bc2ef9bc30f9bd31f9bd33f9be35f9be36fabf38fa
-bf39fac03bfac03cfac13efac13ffac241fac242fac344fac345fac447fac448fac54afac54bfac6
-4dfac64efac750fac751fac853fac854fac855fac957fac958faca5afaca5bfacb5dfacb5efacc60
-facc61facd63facd64face66face67facf69facf6afad06cfad06dfad16ffad170fad272fad273fb
-d374fbd376fbd477fbd478fbd479fbd57bfbd57cfbd57dfbd67ffbd680fbd781
-
-f9b822f9b823f9b925f9b927f9ba28f9ba2af9bb2cf9bb2df9bc2ff9bc30f9bd32f9bd34f9be35f9
-be37fabf38fabf3afac03bfac03dfac13efac140fac241fac243fac344fac346fac447fac449fac5
-4afac54cfac64dfac64ffac750fac752fac853fac855fac956fac957faca59faca5afacb5cfacb5d
-facc5ffacc60facd62facd63face65face66facf68facf69fad06bfad06cfad16efad16ffad271fa
-d272fbd374fbd375fbd376fbd477fbd479fbd47afbd57bfbd57cfbd67efbd67f
-
-f9b71ff9b821f9b822f9b924f9b926f9ba27f9ba29f9bb2bf9bb2cf9bc2ef9bc2ff9bd31f9bd32f9
-be34f9be36fabf38fabf39fabf3afac03cfac03dfac13ffac140fac242fac243fac345fac346fac4
-48fac449fac54bfac54cfac64efac64ffac751fac752fac854fac855fac956fac958faca59faca5b
-facb5cfacb5efacc60facc61facd63facd64face65face67facf68facf6afad06bfad06dfad16efa
-d170fad271fad273fbd374fbd375fbd377fbd478fbd479fbd57bfbd57cfbd57d
-
-f9b61df9b71ef9b720f9b821f9b823f9b925f9b926f9ba28f9ba2af9bb2bf9bb2df9bc2ff9bc30f9
-bd32f9bd33f9be35f9be36fabf38fabf39fac03bfac03cfac13efac13ffac241fac242fac344fac3
-46fac447fac448fac54afac54bfac64dfac64efac750fac751fac853fac854fac855fac957faca59
-faca5afacb5cfacb5dfacc5ffacc60facd62facd63facd64face66face67facf69facf6afad06cfa
-d06dfad16ffad170fad272fad273fbd375fbd376fbd477fbd478fbd47afbd57b
-
-f9b51af9b61cf9b61df9b71ff9b720f9b822f9b823f9b925f9b927f9ba28f9ba2af9bb2cf9bb2df9
-bc2ff9bc31f9bd32f9bd34f9be35f9be37fabf38fabf3afac03bfac03dfac13ffac140fac242fac2
-43fac345fac346fac447fac449fac54afac54cfac64dfac64ffac750fac752fac853fac855fac956
-fac958faca59faca5bfacb5cfacb5efacc5ffacc61facd62facd64face65face66facf68facf69fa
-d06bfad06cfad16efad16ffad271fad272fbd374fbd375fbd376fbd478fbd479
-
-f9b517f9b519f9b61bf9b61cf9b71ef9b720f9b821f9b823f9b924f9b926f9ba27f9ba29f9bb2bf9
-bb2cf9bc2ef9bc30f9bd31f9bd33f9be34f9be36fabf38fabf39fac03bfac03cfac13efac13ffac2
-41fac242fac344fac345fac346fac448fac449fac54bfac54cfac64efac64ffac751fac752fac854
-fac855fac957fac958faca5afaca5bfacb5dfacb5efacc60facc61facd63facd64face65face67fa
-cf68facf6afad06bfad06dfad16efad170fad272fad273fbd374fbd375fbd477
-
-f9b414f9b416f9b518f9b519f9b61bf9b61df9b71ef9b720f9b822f9b823f9b925f9b926f9ba28f9
-ba2af9bb2bf9bb2df9bc2ff9bc30f9bd32f9bd34f9be35f9be37fabf38fabf3afac03bfac03dfac1
-3efac140fac241fac243fac344fac346fac447fac448fac54afac54bfac64dfac64efac750fac751
-fac853fac854fac956fac957faca59faca5afacb5cfacb5dfacc5ffacc60facd62facd63facd64fa
-ce66face67facf69fad06bfad06cfad16efad16ffad271fad272fbd374fbd375
-
-f9b312f9b314f9b415f9b417f9b518f9b51af9b61cf9b61df9b71ff9b721f9b822f9b824f9b925f9
-b927f9ba29f9ba2af9bb2cf9bb2df9bc2ff9bc31f9bd32f9bd34f9be36f9be37fabf39fabf3afac0
-3cfac03dfac13ffac140fac242fac243fac345fac346fac447fac449fac54afac54cfac64dfac64f
-fac751fac752fac854fac855fac956fac958faca59faca5bfacb5cfacb5efacc5ffacc61facd62fa
-cd64face65face67facf68facf6afad06bfad06dfad16efad170fad271fad273
-
-f9b311f9b311f9b313f9b414f9b416f9b517f9b519f9b61bf9b61cf9b71ef9b720f9b821f9b823f9
-b925f9b926f9ba28f9ba29f9bb2bf9bb2cf9bc2ef9bc30f9bd31f9bd33f9be35f9be36fabf38fabf
-39fac03bfac03cfac13efac13ffac241fac242fac344fac345fac346fac448fac54afac54bfac64d
-fac64efac750fac751fac853fac854fac855fac957fac958faca5afaca5bfacb5dfacb5efacc60fa
-cc61facd63facd64face66face67facf69facf6afad06cfad06dfad16ffad170
-
-Q
-Q
-Q
-Q
-q
-q
-n
-106 249 m
-170 249 l
-170 185 l
-106 185 l
-106 249 l
-h
-W
-q
-q
-[64 0 0 64 106 185]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-fef5e1fef6e1fef6e2fef6e3fef6e4fef7e5fef7e6fef7e6fef7e7fef8e8fef8e9fef8e9fef8eafe
-f8eafef8ebfef9ebfef9ecfef9edfef9edfef9eefef9eefefaeffefaeffefaf0fefaf1fefaf1fefb
-f2fefbf2fefbf3fefbf4fefbf4fefbf5fefcf5fefcf6fefcf6fefcf7fefcf8fefcf8fffdf9fffdf9
-fffdf9fffdf9fffdfafffdfafffdfafffdfbfffdfbfffdfbfffdfbfffefcfffefcfffefcfffefcff
-fefdfffefdfffefdfffefefffefefffefefffefefffefefffefefffefefffefe
-
-fef5dffef5e0fef5e1fef6e2fef6e3fef6e3fef6e4fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fe
-f8e9fef8eafef8eafef9ebfef9ecfef9ecfef9edfef9edfef9eefefaeffefaeffefaf0fefaf0fefa
-f1fefaf1fefbf2fefbf3fefbf3fefbf4fefbf4fefbf5fefcf5fefcf6fefcf7fefcf7fefcf8fefcf8
-fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffdfbfffdfbfffdfbfffdfbfffefcfffefcff
-fefcfffefdfffefdfffefdfffefdfffefefffefefffefefffefefffefefffefe
-
-fef4defef5dffef5e0fef5e0fef5e1fef6e2fef6e3fef6e4fef7e5fef7e5fef7e6fef7e7fef8e8fe
-f8e8fef8e9fef8eafef8eafef8ebfef9ebfef9ecfef9ecfef9edfef9eefef9eefefaeffefaeffefa
-f0fefaf0fefaf1fefaf2fefbf2fefbf3fefbf3fefbf4fefbf5fefcf5fefcf6fefcf6fefcf7fefcf7
-fefcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffdfbfffdfbfffdfbfffefcff
-fefcfffefcfffefcfffefdfffefdfffefdfffefdfffefefffefefffefefffefe
-
-fef4ddfef4ddfef5defef5dffef5e0fef5e1fef6e2fef6e2fef6e3fef6e4fef7e5fef7e6fef7e7fe
-f7e7fef8e8fef8e9fef8e9fef8eafef8eafef9ebfef9ebfef9ecfef9edfef9edfef9eefefaeefefa
-effefaf0fefaf0fefaf1fefaf1fefbf2fefbf2fefbf3fefbf4fefbf4fefbf5fefcf5fefcf6fefcf6
-fefcf7fefcf8fefcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfbfffdfbfffdfbff
-fdfbfffefcfffefcfffefcfffefcfffefdfffefdfffefdfffefefffefefffefe
-
-fef4dbfef4dcfef4ddfef4defef5dffef5dffef5e0fef5e1fef6e2fef6e3fef6e3fef6e4fef7e5fe
-f7e6fef7e7fef8e8fef8e8fef8e9fef8e9fef8eafef8ebfef9ebfef9ecfef9ecfef9edfef9edfef9
-eefefaeffefaeffefaf0fefaf0fefaf1fefaf1fefbf2fefbf3fefbf3fefbf4fefbf4fefbf5fefcf6
-fefcf6fefcf7fefcf7fefcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffdfbff
-fdfbfffdfbfffdfbfffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefe
-
-fef3dafef3dbfef4dcfef4dcfef4ddfef4defef5dffef5e0fef5e1fef5e1fef6e2fef6e3fef6e4fe
-f7e5fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8eafef8eafef8ebfef9ebfef9ecfef9ecfef9
-edfef9eefef9eefefaeffefaeffefaf0fefaf1fefaf1fefbf2fefbf2fefbf3fefbf4fefbf4fefbf5
-fefcf5fefcf6fefcf6fefcf7fefcf7fefcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfaff
-fdfafffdfbfffdfbfffdfbfffefcfffefcfffefcfffefcfffefdfffefdfffefd
-
-fef3d8fef3d9fef3dafef3dbfef4dcfef4ddfef4ddfef5defef5dffef5e0fef5e1fef6e2fef6e3fe
-f6e3fef6e4fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8e9fef8eafef8eafef9ebfef9ecfef9
-ecfef9edfef9edfef9eefefaeefefaeffefaf0fefaf0fefaf1fefaf1fefbf2fefbf2fefbf3fefbf4
-fefbf4fefbf5fefcf5fefcf6fefcf7fefcf7fefcf8fefcf8fffdf9fffdf9fffdf9fffdfafffdfaff
-fdfafffdfafffdfbfffdfbfffdfbfffdfbfffefcfffefcfffefcfffefdfffefd
-
-fef2d7fef2d8fef3d9fef3dafef3dbfef4dbfef4dcfef4ddfef4defef5dffef5dffef5e0fef5e1fe
-f6e2fef6e3fef6e4fef6e4fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8e9fef8eafef8ebfef9
-ebfef9ecfef9ecfef9edfef9eefef9eefefaeffefaeffefaf0fefaf0fefaf1fefaf2fefbf2fefbf3
-fefbf3fefbf4fefbf4fefbf5fefcf6fefcf6fefcf7fefcf7fefcf8fffdf9fffdf9fffdf9fffdf9ff
-fdfafffdfafffdfafffdfafffdfbfffdfbfffdfbfffdfbfffefcfffefcfffefc
-
-fef2d6fef2d7fef2d8fef3d8fef3d9fef3dafef3dbfef4dcfef4ddfef4ddfef4defef5dffef5e0fe
-f5e1fef6e1fef6e2fef6e3fef6e4fef7e5fef7e6fef7e6fef7e7fef8e8fef8e9fef8e9fef8eafef8
-eafef8ebfef9ebfef9ecfef9edfef9edfef9eefef9eefefaeffefaeffefaf0fefaf1fefaf1fefbf2
-fefbf2fefbf3fefbf4fefbf4fefbf5fefcf5fefcf6fefcf6fefcf7fefcf8fefcf8fffdf9fffdf9ff
-fdf9fffdf9fffdfafffdfafffdfafffdfbfffdfbfffdfbfffdfbfffefcfffefc
-
-fef1d4fef2d5fef2d6fef2d7fef2d8fef3d9fef3d9fef3dafef3dbfef4dcfef4ddfef4defef5dffe
-f5dffef5e0fef5e1fef6e2fef6e3fef6e3fef6e4fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8
-e9fef8eafef8eafef9ebfef9ecfef9ecfef9edfef9edfef9eefefaeffefaeffefaf0fefaf0fefaf1
-fefaf1fefbf2fefbf3fefbf3fefbf4fefbf4fefbf5fefcf5fefcf6fefcf7fefcf7fefcf8fefcf8ff
-fdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffdfbfffdfbfffdfbfffdfb
-
-fef1d3fef1d4fef1d5fef2d6fef2d6fef2d7fef3d8fef3d9fef3dafef3dbfef4dbfef4dcfef4ddfe
-f4defef5dffef5e0fef5e0fef5e1fef6e2fef6e3fef6e4fef7e5fef7e5fef7e6fef7e7fef8e8fef8
-e8fef8e9fef8eafef8eafef8ebfef9ebfef9ecfef9ecfef9edfef9eefef9eefefaeffefaeffefaf0
-fefaf0fefaf1fefaf2fefbf2fefbf3fefbf3fefbf4fefbf5fefcf5fefcf6fefcf6fefcf7fefcf7fe
-fcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffdfbfffdfb
-
-fef0d2fef1d3fef1d3fef1d4fef2d5fef2d6fef2d7fef2d8fef3d8fef3d9fef3dafef3dbfef4dcfe
-f4ddfef4ddfef4defef5dffef5e0fef5e1fef6e2fef6e2fef6e3fef6e4fef7e5fef7e6fef7e7fef7
-e7fef8e8fef8e9fef8e9fef8eafef8eafef9ebfef9ebfef9ecfef9edfef9edfef9eefefaeefefaef
-fefaf0fefaf0fefaf1fefaf1fefbf2fefbf2fefbf3fefbf4fefbf4fefbf5fefcf5fefcf6fefcf6fe
-fcf7fefcf8fefcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfb
-
-fef0d0fef0d1fef1d2fef1d3fef1d4fef1d5fef2d5fef2d6fef2d7fef2d8fef3d9fef3dafef3dafe
-f4dbfef4dcfef4ddfef4defef5dffef5dffef5e0fef5e1fef6e2fef6e3fef6e3fef6e4fef7e5fef7
-e6fef7e7fef8e8fef8e8fef8e9fef8e9fef8eafef8ebfef9ebfef9ecfef9ecfef9edfef9edfef9ee
-fefaeffefaeffefaf0fefaf0fefaf1fefaf1fefbf2fefbf3fefbf3fefbf4fefbf4fefbf5fefcf6fe
-fcf6fefcf7fefcf7fefcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfa
-
-fef0cffef0d0fef0d1fef0d2fef1d2fef1d3fef1d4fef1d5fef2d6fef2d6fef2d7fef3d8fef3d9fe
-f3dafef3dbfef4dcfef4dcfef4ddfef4defef5dffef5e0fef5e1fef5e1fef6e2fef6e3fef6e4fef7
-e5fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8eafef8eafef8ebfef9ebfef9ecfef9ecfef9ed
-fef9eefef9eefefaeffefaeffefaf0fefaf1fefaf1fefbf2fefbf2fefbf3fefbf3fefbf4fefbf5fe
-fcf5fefcf6fefcf6fefcf7fefcf7fefcf8fffdf9fffdf9fffdf9fffdf9fffdfa
-
-feefcefeefcffef0cffef0d0fef0d1fef1d2fef1d3fef1d4fef1d4fef2d5fef2d6fef2d7fef2d8fe
-f3d8fef3d9fef3dafef3dbfef4dcfef4ddfef4ddfef5defef5dffef5e0fef5e1fef6e2fef6e3fef6
-e3fef6e4fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8e9fef8eafef8eafef9ebfef9ecfef9ec
-fef9edfef9edfef9eefefaeefefaeffefaf0fefaf0fefaf1fefaf1fefbf2fefbf2fefbf3fefbf4fe
-fbf4fefbf5fefcf5fefcf6fefcf7fefcf7fefcf8fefcf8fffdf9fffdf9fffdf9
-
-feefccfeefcdfeefcefef0cffef0d0fef0d0fef0d1fef1d2fef1d3fef1d4fef1d5fef2d6fef2d6fe
-f2d7fef2d8fef3d9fef3dafef3dbfef4dbfef4dcfef4ddfef4defef5dffef5dffef5e0fef5e1fef6
-e2fef6e3fef6e4fef6e4fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8e9fef8eafef8ebfef9eb
-fef9ecfef9ecfef9edfef9eefef9eefefaeffefaeffefaf0fefaf0fefaf1fefaf2fefbf2fefbf3fe
-fbf3fefbf4fefbf4fefbf5fefcf6fefcf6fefcf7fefcf7fefcf8fffdf9fffdf9
-
-fdeecbfeefccfeefcdfeefcefeefcefef0cffef0d0fef0d1fef0d2fef1d2fef1d3fef1d4fef2d5fe
-f2d6fef2d7fef2d7fef3d8fef3d9fef3dafef3dbfef4dcfef4ddfef4ddfef4defef5dffef5e0fef5
-e1fef6e1fef6e2fef6e3fef6e4fef7e5fef7e6fef7e6fef7e7fef8e8fef8e9fef8e9fef8eafef8ea
-fef8ebfef9ebfef9ecfef9ecfef9edfef9eefef9eefefaeffefaeffefaf0fefaf1fefaf1fefbf2fe
-fbf2fefbf3fefbf4fefbf4fefbf5fefcf5fefcf6fefcf6fefcf7fefcf8fefcf8
-
-fdeec9fdeecafdeecbfeefccfeefcdfeefcefeefcffef0d0fef0d0fef0d1fef1d2fef1d3fef1d4fe
-f1d4fef2d5fef2d6fef2d7fef2d8fef3d9fef3d9fef3dafef3dbfef4dcfef4ddfef4defef5defef5
-dffef5e0fef5e1fef6e2fef6e3fef6e3fef6e4fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8e9
-fef8eafef8eafef9ebfef9ecfef9ecfef9edfef9edfef9eefefaeffefaeffefaf0fefaf0fefaf1fe
-faf1fefbf2fefbf3fefbf3fefbf4fefbf4fefbf5fefcf5fefcf6fefcf7fefcf7
-
-fdedc8fdedc9fdeecafdeecbfeefccfeefccfeefcdfeefcefef0cffef0d0fef0d1fef0d2fef1d2fe
-f1d3fef1d4fef1d5fef2d6fef2d6fef2d7fef3d8fef3d9fef3dafef3dbfef4dbfef4dcfef4ddfef4
-defef5dffef5e0fef5e0fef5e1fef6e2fef6e3fef6e4fef7e5fef7e5fef7e6fef7e7fef8e8fef8e8
-fef8e9fef8eafef8eafef8ebfef9ebfef9ecfef9ecfef9edfef9eefef9eefefaeffefaeffefaf0fe
-faf0fefaf1fefaf2fefbf2fefbf3fefbf3fefbf4fefbf5fefbf5fefcf6fefcf6
-
-fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefeefcefef0cffef0d0fef0d1fe
-f0d2fef1d3fef1d3fef1d4fef2d5fef2d6fef2d7fef2d8fef3d8fef3d9fef3dafef3dbfef4dcfef4
-ddfef4ddfef4defef5dffef5e0fef5e1fef6e1fef6e2fef6e3fef6e4fef7e5fef7e6fef7e7fef7e7
-fef8e8fef8e9fef8e9fef8eafef8eafef8ebfef9ebfef9ecfef9edfef9edfef9eefefaeefefaeffe
-faf0fefaf0fefaf1fefaf1fefbf2fefbf2fefbf3fefbf4fefbf4fefbf5fefcf5
-
-fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafeefccfeefccfeefcdfeefcefef0cffef0d0fe
-f0d0fef0d1fef1d2fef1d3fef1d4fef1d4fef2d5fef2d6fef2d7fef2d8fef3d9fef3dafef3dafef4
-dbfef4dcfef4ddfef4defef5dffef5dffef5e0fef5e1fef6e2fef6e3fef6e3fef6e4fef7e5fef7e6
-fef7e7fef8e8fef8e8fef8e9fef8e9fef8eafef8ebfef9ebfef9ecfef9ecfef9edfef9edfef9eefe
-faeffefaeffefaf0fefaf0fefaf1fefaf1fefbf2fefbf3fefbf3fefbf4fefbf4
-
-fdebc2fdecc3fdecc4fdecc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcdfeefcefe
-f0cffef0d0fef0d1fef0d2fef1d2fef1d3fef1d4fef1d5fef2d6fef2d6fef2d7fef3d8fef3d9fef3
-dafef3dbfef4dbfef4dcfef4ddfef4defef5dffef5e0fef5e1fef5e1fef6e2fef6e3fef6e4fef7e5
-fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8eafef8eafef8ebfef9ebfef9ecfef9ecfef9edfe
-f9eefef9eefefaeffefaeffefaf0fefaf1fefaf1fefbf2fefbf2fefbf3fefbf3
-
-fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfe
-efcefeefcffef0cffef0d0fef0d1fef1d2fef1d3fef1d4fef1d4fef2d5fef2d6fef2d7fef2d8fef3
-d8fef3d9fef3dafef3dbfef4dcfef4ddfef4ddfef5defef5dffef5e0fef5e1fef6e2fef6e2fef6e3
-fef6e4fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8e9fef8eafef8eafef9ebfef9ebfef9ecfe
-f9edfef9edfef9eefefaeefefaeffefaf0fefaf0fefaf1fefaf1fefbf2fefbf2
-
-fdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecbfeefccfe
-efccfeefcdfeefcefef0cffef0d0fef0d0fef0d1fef1d2fef1d3fef1d4fef1d5fef2d6fef2d6fef2
-d7fef2d8fef3d9fef3dafef3dbfef4dbfef4dcfef4ddfef4defef5dffef5dffef5e0fef5e1fef6e2
-fef6e3fef6e4fef6e4fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8e9fef8eafef8ebfef9ebfe
-f9ecfef9ecfef9edfef9eefef9eefefaeffefaeffefaf0fefaf0fefaf1fefaf1
-
-fdeabdfdeabefdeabffdebc1fdebc1fdebc3fdecc3fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafd
-eecbfeefccfeefcdfeefcefeefcefef0cffef0d0fef0d1fef0d2fef1d2fef1d3fef1d4fef2d5fef2
-d6fef2d7fef2d7fef3d8fef3d9fef3dafef3dbfef4dcfef4ddfef4ddfef4defef5dffef5e0fef5e1
-fef6e1fef6e2fef6e3fef6e4fef7e5fef7e5fef7e6fef7e7fef8e8fef8e9fef8e9fef8eafef8eafe
-f8ebfef9ebfef9ecfef9ecfef9edfef9eefef9eefefaeffefaeffefaf0fefaf1
-
-fde9bcfde9bdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fd
-eec9fdeecafdeecbfeefccfeefcdfeefcefeefcffef0d0fef0d0fef0d1fef1d2fef1d3fef1d4fef1
-d4fef2d5fef2d6fef2d7fef2d8fef3d9fef3d9fef3dafef3dbfef4dcfef4ddfef4defef5defef5df
-fef5e0fef5e1fef6e2fef6e3fef6e3fef6e4fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8e9fe
-f8eafef8eafef9ebfef9ecfef9ecfef9edfef9edfef9eefefaeffefaeffefaf0
-
-fde8bafde9bbfde9bcfdeabdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fd
-edc7fdedc9fdeecafdeecbfeefccfeefccfeefcdfeefcefef0cffef0d0fef0d1fef0d1fef1d2fef1
-d3fef1d4fef1d5fef2d6fef2d6fef2d7fef3d8fef3d9fef3dafef3dbfef4dbfef4dcfef4ddfef4de
-fef5dffef5e0fef5e0fef5e1fef6e2fef6e3fef6e4fef7e5fef7e5fef7e6fef7e7fef8e8fef8e8fe
-f8e9fef8e9fef8eafef8ebfef9ebfef9ecfef9ecfef9edfef9eefef9eefefaef
-
-fde8b8fde8b9fde9bafde9bbfde9bcfdeabefdeabefdeac0fdebc1fdebc2fdebc3fdecc4fdecc5fd
-edc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefeefcefef0cffef0d0fef0d1fef0
-d2fef1d3fef1d3fef1d4fef2d5fef2d6fef2d7fef2d8fef3d8fef3d9fef3dafef3dbfef4dcfef4dd
-fef4ddfef4defef5dffef5e0fef5e1fef6e1fef6e2fef6e3fef6e4fef7e5fef7e6fef7e6fef7e7fe
-f8e8fef8e9fef8e9fef8eafef8eafef8ebfef9ebfef9ecfef9edfef9edfef9ee
-
-fde7b7fde8b8fde8b9fde8bafde9bbfde9bcfde9bdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fd
-ecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefef0cffef0d0fef0
-d0fef0d1fef1d2fef1d3fef1d4fef1d4fef2d5fef2d6fef2d7fef2d8fef3d9fef3dafef3dafef4db
-fef4dcfef4ddfef4defef5dffef5dffef5e0fef5e1fef6e2fef6e3fef6e3fef6e4fef7e5fef7e6fe
-f7e7fef8e8fef8e8fef8e9fef8e9fef8eafef8eafef9ebfef9ecfef9ecfef9ed
-
-fde7b5fde7b6fde7b7fde8b8fde8b9fde9bafde9bbfde9bcfdeabdfdeabefdeabffdebc0fdebc1fd
-ebc2fdecc3fdecc4fdecc6fdedc6fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcdfeefcefef0
-cffef0d0fef0d1fef0d2fef1d2fef1d3fef1d4fef1d5fef2d6fef2d6fef2d7fef3d8fef3d9fef3da
-fef3dbfef4dbfef4dcfef4ddfef4defef5dffef5e0fef5e1fef5e1fef6e2fef6e3fef6e4fef7e5fe
-f7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8eafef8eafef8ebfef9ebfef9ec
-
-fde6b3fde7b4fde7b5fde7b6fde8b7fde8b8fde8b9fde9bbfde9bbfde9bdfdeabefdeabffdeac0fd
-ebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeef
-cefeefcefef0cffef0d0fef0d1fef1d2fef1d3fef1d4fef1d4fef2d5fef2d6fef2d7fef2d8fef3d8
-fef3d9fef3dafef3dbfef4dcfef4ddfef4ddfef5defef5dffef5e0fef5e1fef6e2fef6e2fef6e3fe
-f6e4fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8e9fef8eafef8eafef9eb
-
-fde6b2fde6b3fde6b4fde7b5fde7b6fde7b7fde8b8fde8b9fde8bafde9bbfde9bcfde9bdfdeabefd
-eabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafeefccfeef
-ccfeefcdfeefcefef0cffef0d0fef0d0fef0d1fef1d2fef1d3fef1d4fef1d5fef2d5fef2d6fef2d7
-fef2d8fef3d9fef3dafef3dbfef4dbfef4dcfef4ddfef4defef5dffef5dffef5e0fef5e1fef6e2fe
-f6e3fef6e4fef6e4fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8e9fef8ea
-
-fde5b0fde5b1fde6b2fde6b3fde6b4fde7b5fde7b6fde8b7fde8b8fde8b9fde9bafde9bbfde9bcfd
-eabdfdeabefdeabffdebc1fdebc1fdebc3fdecc3fdecc5fdecc6fdedc7fdedc8fdeec9fdeecafdee
-cbfeefccfeefcdfeefcefeefcefef0cffef0d0fef0d1fef0d2fef1d2fef1d3fef1d4fef2d5fef2d6
-fef2d7fef2d7fef3d8fef3d9fef3dafef3dbfef4dcfef4dcfef4ddfef4defef5dffef5e0fef5e1fe
-f6e1fef6e2fef6e3fef6e4fef7e5fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9
-
-fde4aefde5affde5b0fde5b1fde6b2fde6b3fde7b4fde7b6fde7b6fde8b8fde8b8fde8bafde9bbfd
-e9bcfde9bdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdee
-c9fdeecafdeecbfeefccfeefcdfeefcefeefcffef0cffef0d0fef0d1fef1d2fef1d3fef1d4fef1d4
-fef2d5fef2d6fef2d7fef2d8fef3d8fef3d9fef3dafef3dbfef4dcfef4ddfef4defef5defef5dffe
-f5e0fef5e1fef6e2fef6e3fef6e3fef6e4fef7e5fef7e6fef7e7fef8e8fef8e8
-
-fde4acfde4aefde5aefde5b0fde5b0fde6b2fde6b3fde6b4fde7b5fde7b6fde7b7fde8b8fde8b9fd
-e8bafde9bbfde9bcfdeabdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fded
-c7fdedc9fdeec9fdeecbfeefccfeefccfeefcdfeefcefef0cffef0d0fef0d1fef0d1fef1d2fef1d3
-fef1d4fef1d5fef2d6fef2d6fef2d7fef3d8fef3d9fef3dafef3dbfef4dbfef4dcfef4ddfef4defe
-f5dffef5dffef5e0fef5e1fef6e2fef6e3fef6e4fef7e5fef7e5fef7e6fef7e7
-
-fde3abfde4acfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde7b4fde7b5fde7b6fde8b7fd
-e8b8fde8b9fde9bafde9bbfde9bcfdeabefdeabefdeac0fdebc1fdebc2fdebc3fdecc4fdecc5fded
-c6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefeefcefef0cffef0d0fef0d1fef0d2
-fef1d2fef1d3fef1d4fef2d5fef2d6fef2d7fef2d8fef3d8fef3d9fef3dafef3dbfef4dcfef4ddfe
-f4ddfef4defef5dffef5e0fef5e1fef6e1fef6e2fef6e3fef6e4fef7e5fef7e6
-
-fde3a9fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde6b1fde6b2fde6b3fde7b4fde7b6fd
-e7b7fde8b8fde8b9fde8bafde9bbfde9bcfde9bdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdec
-c4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefeefcffef0d0fef0d0
-fef0d1fef1d2fef1d3fef1d4fef1d4fef2d5fef2d6fef2d7fef2d8fef3d9fef3d9fef3dafef4dbfe
-f4dcfef4ddfef4defef5dffef5dffef5e0fef5e1fef6e2fef6e3fef6e3fef6e4
-
-fde2a7fde3a8fde3a9fde3abfde4abfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde6b4fd
-e7b5fde7b6fde7b7fde8b8fde8b9fde9bafde9bbfde9bcfdeabdfdeabefdeabffdebc0fdebc1fdeb
-c2fdecc3fdecc4fdecc6fdedc6fdedc8fdedc9fdeecafdeecbfeefccfeefcdfeefcdfeefcefef0cf
-fef0d0fef0d1fef0d2fef1d2fef1d3fef1d4fef1d5fef2d6fef2d6fef2d7fef3d8fef3d9fef3dafe
-f3dbfef4dbfef4dcfef4ddfef4defef5dffef5e0fef5e0fef5e1fef6e2fef6e3
-
-fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde5b1fde6b2fd
-e6b3fde7b4fde7b5fde7b6fde8b7fde8b8fde8b9fde9bbfde9bbfde9bdfdeabefdeabffdeac0fdeb
-c1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefce
-feefcefef0cffef0d0fef0d1fef0d2fef1d3fef1d4fef1d4fef2d5fef2d6fef2d7fef2d8fef3d8fe
-f3d9fef3dafef3dbfef4dcfef4ddfef4ddfef4defef5dffef5e0fef5e1fef6e2
-
-fce1a4fce1a5fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde5aefde5affde5b0fd
-e6b1fde6b3fde6b3fde7b5fde7b6fde7b7fde8b8fde8b9fde8bafde9bbfde9bcfde9bdfdeabefdea
-bffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafeefccfeefcc
-feefcdfeefcefef0cffef0d0fef0d0fef0d1fef1d2fef1d3fef1d4fef1d5fef2d5fef2d6fef2d7fe
-f2d8fef3d9fef3dafef3dafef4dbfef4dcfef4ddfef4defef5dffef5dffef5e0
-
-fce0a2fce1a3fce1a4fde2a6fde2a6fde2a8fde3a8fde3aafde3abfde4acfde4adfde4aefde5affd
-e5b0fde5b1fde6b2fde6b3fde6b4fde7b5fde7b6fde8b7fde8b8fde8b9fde9bafde9bbfde9bcfdea
-bdfdeabefdeabffdebc1fdebc1fdebc3fdecc3fdecc5fdecc6fdedc7fdedc8fdeec9fdeecafdeecb
-feefccfeefcdfeefcefeefcefef0cffef0d0fef0d1fef0d2fef1d2fef1d3fef1d4fef1d5fef2d6fe
-f2d6fef2d7fef3d8fef3d9fef3dafef3dbfef4dcfef4dcfef4ddfef4defef5df
-
-fce0a0fce0a1fce0a2fce1a3fce1a5fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfd
-e4aefde5affde5b0fde5b1fde6b2fde6b3fde7b4fde7b5fde7b6fde8b7fde8b8fde8bafde9bbfde9
-bcfde9bdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9
-fdeecafdeecbfeefccfeefcdfeefcefeefcffef0cffef0d0fef0d1fef1d2fef1d3fef1d4fef1d4fe
-f2d5fef2d6fef2d7fef2d8fef3d8fef3d9fef3dafef3dbfef4dcfef4ddfef4dd
-
-fcdf9dfcdf9ffce0a0fce0a1fce1a2fce1a4fce1a5fde2a6fde2a7fde2a8fde3a9fde3aafde4abfd
-e4acfde4aefde5aefde5b0fde5b0fde6b2fde6b3fde6b4fde7b5fde7b6fde7b7fde8b8fde8b9fde8
-bafde9bbfde9bcfdeabdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7
-fdedc9fdeec9fdeecbfeefccfeefccfeefcdfeefcefef0cffef0d0fef0d1fef0d1fef1d2fef1d3fe
-f1d4fef1d5fef2d6fef2d6fef2d7fef2d8fef3d9fef3dafef3dbfef4dbfef4dc
-
-fcde9bfcdf9dfcdf9efce09ffce0a0fce0a2fce1a3fce1a4fde2a6fde2a7fde2a8fde3a9fde3aafd
-e3abfde4acfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde7b4fde7b5fde7b6fde8b7fde8
-b8fde8b9fde9bafde9bbfde9bcfdeabdfdeabefdeac0fdebc1fdebc2fdebc3fdecc4fdecc5fdedc6
-fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefeefcefef0cffef0d0fef0d1fef0d2fe
-f1d2fef1d3fef1d4fef2d5fef2d6fef2d7fef2d8fef3d8fef3d9fef3dafef3db
-
-fcde99fcde9bfcdf9cfcdf9dfcdf9efce0a0fce0a1fce0a2fce1a4fce1a5fde2a6fde2a7fde2a8fd
-e3a9fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde6b1fde6b2fde6b3fde7b4fde7b6fde7
-b6fde8b8fde8b8fde8bafde9bbfde9bcfde9bdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4
-fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefeefcffef0d0fef0d0fe
-f0d1fef1d2fef1d3fef1d4fef1d4fef2d5fef2d6fef2d7fef2d8fef3d9fef3d9
-
-fcdd97fcde99fcde9afcde9bfcdf9cfcdf9efcdf9ffce0a0fce0a1fce1a3fce1a4fce1a5fde2a6fd
-e2a7fde3a8fde3a9fde3abfde4abfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde6b4fde7
-b5fde7b6fde7b7fde8b8fde8b9fde9bafde9bbfde9bcfdeabdfdeabefdeabffdebc0fdebc1fdebc2
-fdecc3fdecc4fdecc6fdedc6fdedc8fdedc9fdeecafdeecbfeefccfeefccfeefcdfeefcefef0cffe
-f0d0fef0d1fef0d2fef1d2fef1d3fef1d4fef1d5fef2d6fef2d6fef2d7fef3d8
-
-fcdd95fcdd96fcdd98fcde99fcde9afcde9bfcdf9dfcdf9efce09ffce0a1fce0a2fce1a3fce1a4fd
-e2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde5b1fde6b2fde6
-b3fde7b4fde7b5fde7b6fde8b7fde8b8fde8b9fde9bafde9bbfde9bcfdeabefdeabffdeac0fdebc1
-fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefe
-efcefef0cffef0d0fef0d1fef0d2fef1d3fef1d3fef1d4fef2d5fef2d6fef2d7
-
-fcdc93fcdc94fcdd95fcdd97fcdd98fcde99fcde9bfcdf9cfcdf9dfcdf9efce0a0fce0a1fce1a2fc
-e1a4fce1a5fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde5aefde5affde5b0fde6
-b1fde6b3fde6b3fde7b5fde7b6fde7b7fde8b8fde8b9fde8bafde9bbfde9bcfde9bdfdeabefdeabf
-fdebc0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafeefccfeefccfe
-efcdfeefcefef0cffef0d0fef0d0fef0d1fef1d2fef1d3fef1d4fef1d5fef2d5
-
-fcdb91fcdc92fcdc94fcdd95fcdd96fcdd97fcde99fcde9afcde9bfcdf9dfcdf9efce09ffce0a0fc
-e0a2fce1a3fce1a4fce1a5fde2a6fde2a8fde3a8fde3aafde3abfde4acfde4adfde4aefde5affde5
-b0fde5b1fde6b2fde6b3fde6b4fde7b5fde7b6fde8b7fde8b8fde8b9fde9bafde9bbfde9bcfdeabd
-fdeabefdeabffdebc0fdebc1fdebc3fdecc3fdecc5fdecc6fdedc7fdedc8fdeec9fdeecafdeecbfe
-efccfeefcdfeefcdfeefcefef0cffef0d0fef0d1fef0d2fef1d2fef1d3fef1d4
-
-fcdb8ffcdb90fcdc92fcdc93fcdc94fcdd95fcdd97fcdd98fcde99fcde9afcdf9cfcdf9dfcdf9efc
-e09ffce0a1fce0a2fce1a3fce1a5fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde4
-aefde5affde5b0fde5b1fde6b2fde6b3fde7b4fde7b5fde7b6fde8b7fde8b8fde8b9fde9bbfde9bb
-fde9bdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fd
-eecafdeecbfeefccfeefcdfeefcefeefcffef0cffef0d0fef0d1fef1d2fef1d3
-
-fcda8dfcdb8efcdb8ffcdb91fcdc92fcdc93fcdc94fcdd96fcdd97fcde98fcde99fcde9bfcdf9cfc
-df9dfcdf9ffce0a0fce0a1fce1a2fce1a4fce1a5fde2a6fde2a7fde2a8fde3a9fde3aafde4abfde4
-acfde4aefde5aefde5b0fde5b0fde6b2fde6b3fde6b4fde7b5fde7b6fde7b7fde8b8fde8b9fde8ba
-fde9bbfde9bcfdeabdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fd
-edc9fdeec9fdeecbfeefccfeefccfeefcdfeefcefef0cffef0d0fef0d0fef0d1
-
-fbd98bfbda8cfcda8dfcdb8efcdb90fcdb91fcdc92fcdc94fcdd95fcdd96fcdd97fcde99fcde9afc
-de9bfcdf9dfcdf9efce09ffce0a0fce0a2fce1a3fce1a4fde2a6fde2a7fde2a8fde3a9fde3aafde3
-abfde4acfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde7b4fde7b5fde7b6fde8b7fde8b8
-fde8b9fde9bafde9bbfde9bcfdeabdfdeabefdeabffdebc1fdebc2fdebc3fdecc4fdecc5fdedc6fd
-edc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefeefcefef0cffef0d0
-
-fbd989fbd98afbda8bfbda8cfcda8efcdb8ffcdb90fcdc92fcdc93fcdc94fcdd95fcdd97fcdd98fc
-de99fcde9bfcdf9cfcdf9dfcdf9efce0a0fce0a1fce0a2fce1a4fce1a5fde2a6fde2a7fde2a8fde3
-a9fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde6b1fde6b2fde6b3fde7b4fde7b6fde7b6
-fde8b8fde8b8fde8bafde9bbfde9bcfde9bdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fd
-ecc5fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefeefcf
-
-fbd887fbd988fbd989fbd98bfbda8cfcda8dfcdb8efcdb90fcdb91fcdc92fcdc93fcdc95fcdd96fc
-dd97fcde98fcde9afcde9bfcdf9cfcdf9efcdf9ffce0a0fce0a1fce1a3fce1a4fce1a5fde2a6fde2
-a7fde2a8fde3a9fde3abfde4abfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde6b4fde7b5
-fde7b6fde7b7fde8b8fde8b9fde9bafde9bbfde9bcfdeabdfdeabefdeabffdebc0fdebc1fdebc2fd
-ecc3fdecc4fdecc5fdedc6fdedc8fdedc9fdeecafdeecbfeefccfeefccfeefcd
-
-fbd885fbd886fbd887fbd988fbd98afbd98bfbda8cfcda8dfcdb8ffcdb90fcdb91fcdc92fcdc94fc
-dd95fcdd96fcdd98fcde99fcde9afcde9bfcdf9dfcdf9efce09ffce0a0fce0a2fce1a3fce1a4fde2
-a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3
-fde7b4fde7b5fde7b6fde8b7fde8b8fde8b9fde9bafde9bbfde9bcfdeabefdeabefdeac0fdebc1fd
-ebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeefcc
-
-fbd782fbd784fbd885fbd886fbd887fbd989fbd98afbda8bfbda8cfcda8efcdb8ffcdb90fcdc92fc
-dc93fcdc94fcdd95fcdd97fcdd98fcde99fcde9bfcdf9cfcdf9dfcdf9efce0a0fce0a1fce1a2fce1
-a4fce1a5fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde5aefde5affde5b0fde6b1
-fde6b3fde6b3fde7b5fde7b6fde7b7fde8b8fde8b9fde8bafde9bbfde9bcfde9bdfdeabefdeabffd
-ebc0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeeca
-
-fbd680fbd782fbd783fbd784fbd885fbd887fbd988fbd989fbd98bfbda8cfcda8dfcdb8efcdb90fc
-db91fcdc92fcdc94fcdc95fcdd96fcdd97fcde99fcde9afcde9bfcdf9dfcdf9efce09ffce0a0fce0
-a2fce1a3fce1a4fce1a5fde2a6fde2a7fde3a8fde3aafde3abfde4acfde4adfde4aefde5affde5b0
-fde5b1fde6b2fde6b3fde6b4fde7b5fde7b6fde7b7fde8b8fde8b9fde9bafde9bbfde9bcfdeabdfd
-eabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc6fdedc7fdedc8fdeec9
-
-fbd67efbd680fbd681fbd782fbd784fbd885fbd886fbd887fbd989fbd98afbda8bfbda8cfcda8efc
-db8ffcdb90fcdb91fcdc93fcdc94fcdd95fcdd97fcdd98fcde99fcde9afcdf9cfcdf9dfcdf9efce0
-9ffce0a1fce0a2fce1a3fce1a5fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde4ae
-fde5affde5b0fde5b1fde6b2fde6b3fde7b4fde7b5fde7b6fde8b7fde8b8fde8b9fde9bbfde9bbfd
-e9bdfdeabefdeabffdeac0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7
-
-fbd57cfbd67efbd67ffbd680fbd781fbd783fbd784fbd885fbd886fbd988fbd989fbd98afbda8bfc
-da8dfcdb8efcdb8ffcdb91fcdc92fcdc93fcdc94fcdd96fcdd97fcde98fcde99fcde9bfcdf9cfcdf
-9dfcdf9efce0a0fce0a1fce1a2fce1a4fce1a5fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4ac
-fde4adfde5aefde5b0fde5b0fde6b2fde6b3fde6b4fde7b5fde7b6fde7b7fde8b8fde8b9fde8bafd
-e9bbfde9bcfdeabdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5
-
-fbd57afbd57bfbd57dfbd67efbd67ffbd680fbd782fbd783fbd884fbd885fbd887fbd988fbd989fb
-d98bfbda8cfcda8dfcdb8efcdb90fcdb91fcdc92fcdc94fcdd95fcdd96fcdd97fcde99fcde9afcde
-9bfcdf9dfcdf9efce09ffce0a0fce0a2fce1a3fce1a4fde2a6fde2a6fde2a8fde3a8fde3aafde3ab
-fde4acfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde6b4fde7b5fde7b6fde8b7fde8b8fd
-e8b9fde9bafde9bbfde9bcfdeabdfdeabefdeabffdebc1fdebc1fdebc3fdecc3
-
-fbd478fbd479fbd57bfbd57cfbd57dfbd67efbd680fbd781fbd782fbd784fbd885fbd886fbd887fb
-d989fbd98afbda8bfbda8cfcda8efcdb8ffcdb90fcdc92fcdc93fcdc94fcdd95fcdd97fcdd98fcde
-99fcde9bfcdf9cfcdf9dfcdf9efce0a0fce0a1fce0a2fce1a3fce1a5fde2a6fde2a7fde2a8fde3a9
-fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fde7b4fde7b6fde7b6fd
-e8b8fde8b8fde8bafde9bbfde9bcfde9bdfdeabefdeabffdebc0fdebc1fdebc2
-
-fbd376fbd477fbd479fbd47afbd57bfbd57cfbd67efbd67ffbd680fbd782fbd783fbd784fbd885fb
-d887fbd988fbd989fbd98afbda8cfcda8dfcdb8efcdb90fcdb91fcdc92fcdc93fcdc95fcdd96fcdd
-97fcde98fcde9afcde9bfcdf9cfcdf9dfcdf9ffce0a0fce0a1fce1a3fce1a4fce1a5fde2a6fde2a7
-fde2a8fde3a9fde3aafde4abfde4acfde4aefde5affde5b0fde5b1fde6b2fde6b3fde6b4fde7b5fd
-e7b6fde7b7fde8b8fde8b9fde8bafde9bbfde9bcfdeabdfdeabefdeabffdebc0
-
-fbd374fbd375fbd377fbd478fbd479fbd57afbd57cfbd57dfbd67efbd67ffbd681fbd782fbd783fb
-d884fbd886fbd887fbd988fbd98afbd98bfbda8cfcda8dfcdb8ffcdb90fcdb91fcdc92fcdc94fcdd
-95fcdd96fcdd97fcde99fcde9afcde9bfcdf9dfcdf9efce09ffce0a0fce0a2fce1a3fce1a4fde2a6
-fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde5b1fde6b2fde6b3fd
-e7b4fde7b5fde7b6fde8b7fde8b8fde8b9fde9bafde9bbfde9bcfdeabefdeabe
-
-fad272fad273fbd374fbd376fbd477fbd478fbd479fbd57bfbd57cfbd57dfbd67efbd680fbd781fb
-d782fbd784fbd885fbd886fbd887fbd989fbd98afbda8bfbda8cfcda8efcdb8ffcdb90fcdc92fcdc
-93fcdc94fcdd95fcdd97fcdd98fcde99fcde9bfcdf9cfcdf9dfcdf9efce0a0fce0a1fce0a2fce1a4
-fce1a5fde2a6fde2a7fde2a8fde3a9fde3aafde3abfde4acfde4adfde4aefde5affde5b0fde6b1fd
-e6b3fde6b3fde7b5fde7b6fde7b7fde8b8fde8b9fde8bafde9bbfde9bcfde9bd
-
-Q
-Q
-Q
-Q
-q
-q
-n
-42 313 m
-106 313 l
-106 249 l
-42 249 l
-42 313 l
-h
-W
-q
-q
-[64 0 0 64 42 249]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-fffdf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffefbfffefbfffefbfffefcff
-fefcfffefcfffefcfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-
-fffdf8fffdf8fffdf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffefbfffefbff
-fefbfffefcfffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-
-fefcf7fffdf8fffdf8fffdf8fffdf8fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffefbff
-fefbfffefbfffefbfffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-
-fefcf6fefcf7fefcf7fffdf8fffdf8fffdf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfaff
-fdfafffefbfffefbfffefbfffefcfffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefdfffe
-fdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-
-fefcf5fefcf6fefcf6fefcf7fffdf8fffdf8fffdf8fffdf8fffdf9fffdf9fffdf9fffdf9fffdfaff
-fdfafffdfafffefbfffefbfffefbfffefbfffefcfffefcfffefcfffefcfffefdfffefdfffefdfefd
-fdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-
-fefcf4fefcf5fefcf5fefcf6fefcf7fefcf7fffdf8fffdf8fffdf8fffdf8fffdf9fffdf9fffdf9ff
-fdfafffdfafffdfafffdfafffefbfffefbfffefbfffefbfffefcfffefcfffefcfffefdfefdfdfefd
-fdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-
-fefbf3fefbf4fefcf5fefcf5fefcf6fefcf6fefcf7fffdf8fffdf8fffdf8fffdf8fffdf9fffdf9ff
-fdf9fffdf9fffdfafffdfafffdfafffdfafffefbfffefbfffefbfffefcfffdfcfefdfcfefdfcfefd
-fdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-
-fefbf2fefbf3fefbf4fefcf4fefcf5fefcf5fefcf6fefcf6fefcf7fffdf8fffdf8fffdf8fffdf8ff
-fdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffefbfffefbfefdfbfefdfbfefdfcfefdfcfefd
-fcfefdfcfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-
-fefbf1fefbf2fefbf3fefbf3fefbf4fefcf4fefcf5fefcf6fefcf6fefcf7fefcf7fffdf8fffdf8ff
-fdf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafefcfafefdfbfefdfbfefdfbfefdfbfefd
-fcfefdfcfefdfcfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-
-fefaf1fefbf1fefbf2fefbf2fefbf3fefbf3fefbf4fefcf5fefcf5fefcf6fefcf6fefcf7fffdf8ff
-fdf8fffdf8fffdf8fffdf9fffdf9fffdf9fffdf9fefcfafefcfafefcfafefcfafefdfbfefdfbfefd
-fbfefdfcfefdfcfefdfcfefdfcfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-
-fefaf0fefaf0fefbf1fefbf1fefbf2fefbf3fefbf3fefbf4fefcf4fefcf5fefcf5fefcf6fefcf7fe
-fcf7fffdf8fffdf8fffdf8fffdf8fffdf9fefcf9fefcf9fefcfafefcfafefcfafefcfafefdfbfefd
-fbfefdfbfefdfbfefdfcfefdfcfefdfcfefdfcfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-
-fefaeffefaeffefaf0fefaf0fefbf1fefbf2fefbf2fefbf3fefbf3fefbf4fefcf4fefcf5fefcf6fe
-fcf6fefcf7fefcf7fffdf8fefcf8fefcf8fefcf9fefcf9fefcf9fefcf9fefcfafefcfafefcfafefc
-fafefdfbfefdfbfefdfbfefdfcfefdfcfefdfcfefdfcfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-
-fefaeefefaeefefaeffefaeffefaf0fefaf1fefbf1fefbf2fefbf2fefbf3fefbf4fefbf4fefcf5fe
-fcf5fefcf6fefcf6fdfbf7fefcf8fefcf8fefcf8fefcf8fefcf9fefcf9fefcf9fefcf9fefcfafefc
-fafefcfafefdfbfefdfbfefdfbfefdfbfefdfcfefdfcfefdfcfefdfcfefdfdfefdfdfefdfdfefdfd
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfd
-
-fef9edfefaedfefaeefefaeffefaeffefaf0fefaf0fefbf1fefbf1fefbf2fefbf3fefbf3fefbf4fe
-fcf4fefcf5fdfbf5fdfbf6fdfbf7fdfbf7fefcf8fefcf8fefcf8fefcf8fefcf9fefcf9fefcf9fefc
-fafefcfafefcfafefcfafefdfbfefdfbfefdfbfefdfbfefdfcfefdfcfefdfcfefdfdfefdfdfefdfd
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfffdfdfffefdfffefd
-
-fef9ecfef9ecfef9edfefaeefefaeefefaeffefaeffefaf0fefaf0fefbf1fefbf2fefbf2fefbf3fe
-fbf3fdfaf4fdfbf5fdfbf5fdfbf6fdfbf6fdfbf7fdfbf7fefcf8fefcf8fefcf8fefcf9fefcf9fefc
-f9fefcf9fefcfafefcfafefcfafefcfafefdfbfefdfbfefdfbfefdfcfefdfcfefdfcfefdfcfefdfd
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfffefdfffefdfffefdfffefd
-
-fef9ebfef9ebfef9ecfef9edfef9edfefaeefefaeefefaeffefaf0fefaf0fefbf1fefbf1fefbf2fd
-faf2fdfaf3fdfaf4fdfbf4fdfbf5fdfbf5fdfbf6fdfbf6fdfbf7fefcf8fefcf8fefcf8fefcf8fefc
-f9fefcf9fefcf9fefcf9fefcfafefcfafefcfafefdfbfefdfbfefdfbfefdfbfefdfcfefdfcfefdfc
-fefdfcfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fef9eafef9eafef9ebfef9ecfef9ecfef9edfefaedfefaeefefaeffefaeffefaf0fefaf0fdfaf1fd
-faf1fdfaf2fdfaf3fdfaf3fdfaf4fdfbf4fdfbf5fdfbf6fdfbf6fdfbf7fdfbf7fefcf8fefcf8fefc
-f8fefcf8fefcf9fefcf9fefcf9fefcfafefcfafefcfafefcfafefdfbfefdfbfefdfbfefdfbfefdfc
-fefdfcfefdfcfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fef8e9fef8eafef9eafef9ebfef9ebfef9ecfef9edfef9edfefaeefefaeefefaeffdf9effdf9f0fd
-f9f1fdfaf1fdfaf2fdfaf2fdfaf3fdfaf3fdfaf4fdfbf5fdfbf5fdfbf6fdfbf6fdfbf7fefcf8fefc
-f8fefcf8fefcf8fefcf9fefcf9fefcf9fefcf9fefcfafefcfafefcfafefcfafefdfbfefdfbfefdfb
-fefdfcfefdfcfefdfcfefdfcfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fef8e8fef8e9fef8e9fef8eafef9eafef9ebfef9ebfef9ecfef9edfef9edfdf9eefdf9eefdf9effd
-f9f0fdf9f0fdfaf1fdfaf1fdfaf2fdfaf3fdfaf3fdfaf4fdfbf4fdfbf5fdfbf5fdfbf6fdfbf7fdfb
-f7fefcf8fefcf8fefcf8fefcf8fefcf9fefcf9fefcf9fefcf9fefcfafefcfafefcfafefdfbfefdfb
-fefdfbfefdfbfefdfcfefdfcfefdfcfefdfcfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fef8e7fef8e8fef8e8fef8e9fef8e9fef9eafef9ebfef9ebfef9ecfdf8ecfdf8edfdf9eefdf9eefd
-f9effdf9effdf9f0fdf9f0fdfaf1fdfaf1fdfaf2fdfaf3fdfaf3fdfaf4fdfbf4fdfbf5fdfbf6fdfb
-f6fdfbf7fdfbf7fefcf8fefcf8fefcf8fefcf9fefcf9fefcf9fefcf9fefcfafefcfafefcfafefcfa
-fefdfbfefdfbfefdfbfefdfcfefdfcfefdfcfefdfcfefdfdfefdfdfefdfdfefdfdfffdfdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fef7e6fef8e7fef8e7fef8e8fef8e9fef8e9fef8eafef9eafdf8ebfdf8ebfdf8ecfdf8edfdf8edfd
-f9eefdf9eefdf9effdf9effdf9f0fdf9f1fdfaf1fdfaf2fdfaf2fdfaf3fdfaf4fdfaf4fdfbf5fdfb
-f5fdfbf6fdfbf6fdfbf7fefcf8fefcf8fefcf8fefcf8fefcf9fefcf9fefcf9fefcf9fefcfafefcfa
-fefcfafefcfafefdfbfefdfbfefdfbfefdfcfefdfcfefdfcfefdfcfefdfdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fef7e5fef7e6fef7e6fef8e7fef8e8fef8e8fef8e9fdf7e9fdf7eafdf8eafdf8ebfdf8ecfdf8ecfd
-f8edfdf9edfdf9eefdf9effdf9effdf9f0fdf9f0fdfaf1fdfaf1fdfaf2fdfaf3fdfaf3fdfaf4fdfb
-f4fdfbf5fdfbf5fdfbf6fdfbf7fdfbf7fefcf8fefcf8fefcf8fefcf8fefcf9fefcf9fefcf9fefcfa
-fefcfafefcfafefcfafefdfbfefdfbfefdfbfefdfbfefdfcfffefcfffefcfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fef6e3fef7e4fef7e5fef7e6fef8e7fef8e7fdf7e8fdf7e8fdf7e9fdf7e9fdf8eafdf8ebfdf8ebfd
-f8ecfdf8ecfdf8edfdf9eefdf9eefdf9effdf9effdf9f0fdf9f0fdfaf1fdfaf2fdfaf2fdfaf3fdfa
-f3fdfaf4fdfbf5fdfbf5fdfbf6fdfbf6fdfbf7fdfbf7fefcf8fefcf8fefcf8fefcf9fefcf9fefcf9
-fefcf9fefcfafefcfafefcfafefcfafefdfbfefdfbfffefbfffefcfffefcfffefcfffefcfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fef6e2fef6e3fef7e4fef7e4fef7e5fdf6e6fdf7e7fdf7e7fdf7e8fdf7e9fdf7e9fdf7eafdf8eafd
-f8ebfdf8ebfdf8ecfdf8edfdf8edfdf9eefdf9eefdf9effdf9effdf9f0fdfaf1fdfaf1fdfaf2fdfa
-f2fdfaf3fdfaf4fdfbf4fdfbf5fdfbf5fdfbf6fdfbf6fdfbf7fefcf8fefcf8fefcf8fefcf8fefcf9
-fefcf9fefcf9fefcf9fefcfafefcfafefcfafffefbfffefbfffefbfffefbfffefcfffefcfffefcff
-fefcfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fef6e1fef6e1fef6e2fef6e3fdf6e4fdf6e5fdf6e6fdf7e7fdf7e7fdf7e8fdf7e8fdf7e9fdf7e9fd
-f8eafdf8eafdf8ebfdf8ecfdf8ecfdf8edfdf9edfdf9eefdf9effdf9effdf9f0fdf9f0fdfaf1fdfa
-f1fdfaf2fdfaf3fdfaf3fdfaf4fdfbf4fdfbf5fdfbf6fdfbf6fdfbf7fdfbf7fefcf8fefcf8fefcf8
-fefcf8fefcf9fefcf9fefcf9fffdfafffdfafffdfafffdfafffefbfffefbfffefbfffefbfffefcff
-fefcfffefcfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fef5dffef5e0fef6e1fdf5e2fdf5e3fdf5e3fdf6e4fdf6e5fdf6e6fdf7e7fdf7e7fdf7e8fdf7e8fd
-f7e9fdf7eafdf8eafdf8ebfdf8ebfdf8ecfdf8edfdf8edfdf9eefdf9eefdf9effdf9effdf9f0fdf9
-f0fdfaf1fdfaf2fdfaf2fdfaf3fdfaf3fdfaf4fdfbf5fdfbf5fdfbf6fdfbf6fdfbf7fefcf8fefcf8
-fefcf8fefcf8fefcf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffefbfffefbfffefbff
-fefcfffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fef5defef5dffdf4e0fdf5e0fdf5e1fdf5e2fdf5e3fdf6e4fdf6e4fdf6e5fdf6e6fdf7e7fdf7e7fd
-f7e8fdf7e9fdf7e9fdf7eafdf8eafdf8ebfdf8ebfdf8ecfdf8edfdf8edfdf9eefdf9eefdf9effdf9
-f0fdf9f0fdfaf1fdfaf1fdfaf2fdfaf3fdfaf3fdfaf4fdfbf4fdfbf5fdfbf5fdfbf6fdfbf6fdfbf7
-fefcf8fffcf8fffdf8fffdf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffefbfffefbff
-fefbfffefbfffefcfffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefd
-
-fef4ddfdf4ddfdf4defdf4dffdf4e0fdf5e1fdf5e2fdf5e2fdf5e3fdf6e4fdf6e5fdf6e6fdf7e7fd
-f7e7fdf7e8fdf7e8fdf7e9fdf7e9fdf8eafdf8ebfdf8ebfdf8ecfdf8ecfdf8edfdf9eefdf9eefdf9
-effdf9effdf9f0fdf9f0fdfaf1fdfaf1fdfaf2fdfaf3fdfaf3fdfaf4fdfbf4fdfbf5fdfbf6fdfbf6
-fefcf7fefcf7fffdf8fffdf8fffdf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfaff
-fefbfffefbfffefbfffefcfffefcfffefcfffefcfffefdfffefdfffefdfffefd
-
-fdf3dbfdf3dcfdf3ddfdf4defdf4defdf4dffdf4e0fdf5e1fdf5e2fdf5e3fdf6e4fdf6e4fdf6e5fd
-f6e6fdf7e7fdf7e7fdf7e8fdf7e8fdf7e9fdf7eafdf8eafdf8ebfdf8ebfdf8ecfdf8edfdf8edfdf9
-eefdf9eefdf9effdf9effdf9f0fdf9f1fdfaf1fdfaf2fdfaf2fdfaf3fdfaf4fdfaf4fdfbf5fefcf5
-fefcf6fefcf6fefcf7fffdf8fffdf8fffdf8fffdf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfaff
-fdfafffdfafffefbfffefbfffefbfffefcfffefcfffefcfffefcfffefdfffefd
-
-fdf2dafdf3dbfdf3dcfdf3dcfdf3ddfdf4defdf4dffdf4e0fdf5e0fdf5e1fdf5e2fdf5e3fdf6e4fd
-f6e5fdf6e5fdf6e6fdf7e7fdf7e8fdf7e8fdf7e9fdf7e9fdf7eafdf8eafdf8ebfdf8ecfdf8ecfdf8
-edfdf8edfdf9eefdf9eefdf9effdf9f0fdf9f0fdfaf1fdfaf1fdfaf2fdfaf3fdfaf3fefbf4fefcf4
-fefcf5fefcf5fefcf6fefcf7fefcf7fffdf8fffdf8fffdf8fffdf8fffdf9fffdf9fffdf9fffdfaff
-fdfafffdfafffdfafffefbfffefbfffefbfffefbfffefcfffefcfffefcfffefd
-
-fdf2d8fdf2d9fdf3dafdf3dbfdf3dcfdf3ddfdf4defdf4defdf4dffdf4e0fdf5e1fdf5e2fdf5e2fd
-f5e3fdf6e4fdf6e5fdf6e6fdf7e7fdf7e7fdf7e8fdf7e8fdf7e9fdf7e9fdf8eafdf8ebfdf8ebfdf8
-ecfdf8ecfdf8edfdf9eefdf9eefdf9effdf9effdf9f0fdf9f0fdfaf1fefbf2fefbf2fefbf3fefbf3
-fefbf4fefcf5fefcf5fefcf6fefcf6fefcf7fefcf7fffdf8fffdf8fffdf8fffdf9fffdf9fffdf9ff
-fdf9fffdfafffdfafffdfafffdfafffefbfffefbfffefbfffefcfffefcfffefc
-
-fdf2d7fdf2d8fdf2d9fdf2dafdf3dafdf3dbfdf3dcfdf3ddfdf4defdf4dffdf4dffdf4e0fdf5e1fd
-f5e2fdf5e3fdf6e4fdf6e4fdf6e5fdf6e6fdf7e7fdf7e7fdf7e8fdf7e9fdf7e9fdf7eafdf8eafdf8
-ebfdf8ebfdf8ecfdf8edfdf8edfdf9eefdf9eefdf9effdf9effefaf0fefaf1fefbf1fefbf2fefbf2
-fefbf3fefbf4fefcf4fefcf5fefcf5fefcf6fefcf6fefcf7fffdf8fffdf8fffdf8fffdf8fffdf9ff
-fdf9fffdf9fffdf9fffdfafffdfafffdfafffefbfffefbfffefbfffefbfffefc
-
-fdf1d6fdf1d7fdf2d7fdf2d8fdf2d9fdf2dafdf3dbfdf3dcfdf3dcfdf4ddfdf4defdf4dffdf4e0fd
-f5e1fdf5e1fdf5e2fdf5e3fdf6e4fdf6e5fdf6e6fdf6e6fdf7e7fdf7e8fdf7e8fdf7e9fdf7e9fdf8
-eafdf8eafdf8ebfdf8ecfdf8ecfdf8edfdf9edfdf9eefefaeffefaeffefaf0fefaf0fefbf1fefbf1
-fefbf2fefbf3fefbf3fefbf4fefcf4fefcf5fefcf5fefcf6fefcf7fefcf7fffdf8fffdf8fffdf8ff
-fdf8fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffefbfffefbfffefb
-
-fdf1d4fdf1d5fdf1d6fdf1d7fdf2d8fdf2d9fdf2dafdf3dafdf3dbfdf3dcfdf3ddfdf4defdf4defd
-f4dffdf4e0fdf5e1fdf5e2fdf5e2fdf5e3fdf6e4fdf6e5fdf6e6fdf7e7fdf7e7fdf7e8fdf7e8fdf7
-e9fdf7eafdf8eafdf8ebfdf8ebfdf8ecfdf8edfef9edfefaeefefaeefefaeffefaeffefaf0fefaf0
-fefbf1fefbf2fefbf2fefbf3fefbf3fefbf4fefcf5fefcf5fefcf6fefcf6fefcf7fffdf8fffdf8ff
-fdf8fffdf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffefb
-
-fdf0d3fdf0d4fdf1d5fdf1d6fdf1d6fdf2d7fdf2d8fdf2d9fdf2dafdf3dbfdf3dbfdf3dcfdf3ddfd
-f4defdf4dffdf4e0fdf5e0fdf5e1fdf5e2fdf5e3fdf6e4fdf6e4fdf6e5fdf6e6fdf7e7fdf7e7fdf7
-e8fdf7e9fdf7e9fdf7eafdf8eafdf8ebfef9ebfef9ecfef9edfef9edfefaeefefaeefefaeffefaf0
-fefaf0fefbf1fefbf1fefbf2fefbf3fefbf3fefbf4fefcf4fefcf5fefcf5fefcf6fefcf6fefcf7ff
-fdf8fffdf8fffdf8fffdf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfa
-
-fdf0d2fdf0d3fdf0d3fdf1d4fdf1d5fdf1d6fdf1d7fdf2d7fdf2d8fdf2d9fdf2dafdf3dbfdf3dcfd
-f3ddfdf4ddfdf4defdf4dffdf4e0fdf5e1fdf5e2fdf5e2fdf5e3fdf6e4fdf6e5fdf6e6fdf7e7fdf7
-e7fdf7e8fdf7e8fdf7e9fdf7e9fef9eafef9ebfef9ebfef9ecfef9ecfef9edfefaedfefaeefefaef
-fefaeffefaf0fefaf0fefbf1fefbf1fefbf2fefbf3fefbf3fefbf4fefcf4fefcf5fefcf6fefcf6fe
-fcf7fefcf7fffdf8fffdf8fffdf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfa
-
-fdefd0fdf0d1fdf0d2fdf0d3fdf0d4fdf1d5fdf1d5fdf1d6fdf1d7fdf2d8fdf2d9fdf2dafdf3dafd
-f3dbfdf3dcfdf3ddfdf4defdf4defdf4dffdf4e0fdf5e1fdf5e2fdf5e3fdf5e3fdf6e4fdf6e5fdf6
-e6fdf7e7fdf7e7fdf7e8fef8e8fef8e9fef8eafef9eafef9ebfef9ebfef9ecfef9edfef9edfefaee
-fefaeefefaeffefaeffefaf0fefaf1fefbf1fefbf2fefbf2fefbf3fefbf3fefbf4fefcf5fefcf5fe
-fcf6fefcf6fefcf7fffdf8fffdf8fffdf8fffdf8fffdf9fffdf9fffdf9fffdf9
-
-fdefcffdefd0fdefd1fdf0d1fdf0d2fdf0d3fdf1d4fdf1d5fdf1d6fdf1d7fdf2d7fdf2d8fdf2d9fd
-f2dafdf3dbfdf3dcfdf3dcfdf3ddfdf4defdf4dffdf4e0fdf5e0fdf5e1fdf5e2fdf5e3fdf6e4fdf6
-e5fdf6e5fdf6e6fef8e7fef8e8fef8e8fef8e9fef8e9fef8eafef9eafef9ebfef9ecfef9ecfef9ed
-fef9edfefaeefefaeefefaeffefaf0fefaf0fefbf1fefbf1fefbf2fefbf3fefbf3fefbf4fefcf4fe
-fcf5fefcf5fefcf6fefcf7fefcf7fffdf8fffdf8fffdf8fffdf8fffdf9fffdfa
-
-fdeecefdefcffdefcffdefd0fdf0d1fdf0d2fdf0d3fdf0d3fdf1d4fdf1d5fdf1d6fdf1d7fdf2d8fd
-f2d8fdf2d9fdf2dafdf3dbfdf3dcfdf3ddfdf4defdf4defdf4dffdf4e0fdf5e1fdf5e2fdf5e2fdf5
-e3fdf6e4fef7e5fef7e6fef8e7fef8e7fef8e8fef8e8fef8e9fef8e9fef9eafef9ebfef9ebfef9ec
-fef9ecfef9edfefaeefefaeefefaeffefaeffefaf0fefaf0fefbf1fefbf2fefbf2fefbf3fefbf3fe
-fbf4fefcf4fefcf5fefcf6fefcf6fefcf7fefcf8fffdf9fffdf9fffdf9fffdfa
-
-fdeeccfdeecdfdefcefdefcffdefd0fdefd1fdf0d1fdf0d2fdf0d3fdf0d4fdf1d5fdf1d5fdf1d6fd
-f2d7fdf2d8fdf2d9fdf2dafdf3dafdf3dbfdf3dcfdf3ddfdf4defdf4dffdf4dffdf4e0fdf5e1fdf5
-e2fef6e3fef7e4fef7e4fef7e5fef7e6fef8e7fef8e7fef8e8fef8e9fef8e9fef8eafef9eafef9eb
-fef9ebfef9ecfef9edfef9edfefaeefefaeefefaeffefaeffefaf0fefaf1fefbf1fefbf2fefbf2fe
-fbf4fefbf5fefcf5fefcf6fefcf6fefcf7fefcf7fefcf8fffdf9fffdf9fffdf9
-
-fdeecbfdeeccfdeecdfdeecdfdefcefdefcffdefd0fdefd1fdf0d2fdf0d2fdf0d3fdf1d4fdf1d5fd
-f1d6fdf1d7fdf2d7fdf2d8fdf2d9fdf2dafdf3dbfdf3dcfdf3dcfdf3ddfdf4defdf4dffdf4e0fef6
-e1fef6e1fef6e2fef6e3fef7e4fef7e5fef7e6fef7e6fef8e7fef8e8fef8e8fef8e9fef8e9fef9ea
-fef9eafef9ebfef9ecfef9ecfef9edfefaedfefaeefefaeffefaeffefaf0fefaf1fefbf2fefbf2fe
-fbf3fefbf4fefbf4fefbf5fefcf5fefcf6fefcf6fefcf7fefcf8fefcf8fffdf9
-
-fcedc9fdeecbfdeecbfdeeccfdeecdfdefcefdefcffdefcffdefd0fdf0d1fdf0d2fdf0d3fdf0d4fd
-f1d4fdf1d5fdf1d6fdf1d7fdf2d8fdf2d9fdf2d9fdf3dafdf3dbfdf3dcfdf3ddfdf4defef5defef5
-dffef5e0fef6e1fef6e2fef6e2fef6e3fef7e4fef7e5fef7e6fef8e7fef8e7fef8e8fef8e8fef8e9
-fef8eafef9eafef9ebfef9ebfef9ecfef9edfef9eefefaeffefaeffefaf0fefaf0fefaf1fefaf1fe
-fbf2fefbf3fefbf3fefbf4fefbf4fefbf5fefcf6fefcf6fefcf7fefcf7fefcf8
-
-fcedc8fcedc9fcedcafdeecbfdeeccfdeeccfdeecdfdefcefdefcffdefd0fdefd1fdf0d1fdf0d2fd
-f0d3fdf0d4fdf1d5fdf1d5fdf1d6fdf2d7fdf2d8fdf2d9fdf2dafdf3dbfdf3dbfef4dcfef4ddfef5
-defef5dffef5e0fef5e0fef6e1fef6e2fef6e3fef7e4fef7e4fef7e5fef7e6fef8e7fef8e7fef8e8
-fef8e9fef8e9fef8eafef9ebfef9ecfef9ecfef9edfef9eefef9eefefaeffefaeffefaf0fefaf1fe
-faf1fefbf2fefbf2fefbf3fefbf3fefbf4fefbf5fefcf5fefcf6fefcf6fefcf7
-
-fcecc6fcecc7fcedc8fcedc9fcedcafdeecbfdeeccfdeecdfdeecefdefcefdefcffdefd0fdf0d1fd
-f0d2fdf0d3fdf0d3fdf1d4fdf1d5fdf1d6fdf1d7fdf2d7fdf2d8fdf2d9fef3dafef4dbfef4dcfef4
-dcfef5ddfef5defef5dffef5e0fef6e1fef6e2fef6e2fef6e3fef7e4fef7e5fef7e6fef8e7fef8e7
-fef8e9fef8e9fef8eafef8eafef9ebfef9ecfef9ecfef9edfef9edfef9eefefaeefefaeffefaf0fe
-faf0fefaf1fefaf1fefbf2fefbf2fefbf3fefbf4fefbf4fefbf5fefcf5fefcf6
-
-fcebc4fcecc5fcecc6fcecc8fcedc8fcedcafdeecbfdeecbfdeeccfdeecdfdefcefdefcffdefcffd
-efd0fdf0d1fdf0d2fdf0d3fdf0d4fdf1d5fdf1d5fdf1d6fdf1d7fef3d8fef3d9fef3dafef4dafef4
-dbfef4dcfef4ddfef5defef5defef5dffef5e0fef6e1fef6e2fef6e3fef6e4fef7e5fef7e6fef7e7
-fef8e8fef8e8fef8e9fef8e9fef8eafef8ebfef9ebfef9ecfef9ecfef9edfef9eefef9eefefaeffe
-faeffefaf0fefaf0fefaf1fefaf2fefbf2fefbf3fefbf3fefbf4fefbf4fefbf5
-
-fcebc3fcebc4fcecc5fcecc6fcecc7fcedc8fcedc9fcedcafdeecbfdeeccfdeecdfdeecdfdefcefd
-efcffdefd0fdefd1fdf0d1fdf0d2fdf0d3fdf1d4fdf1d5fef2d6fef2d6fef3d7fef3d8fef3d9fef3
-dafef4dbfef4dcfef4dcfef4ddfef5defef5dffef5e1fef6e1fef6e2fef6e3fef6e4fef7e5fef7e6
-fef7e6fef7e7fef8e8fef8e9fef8e9fef8eafef8eafef8ebfef9ebfef9ecfef9ecfef9edfef9eefe
-f9eefefaeffefaeffefaf0fefaf1fefaf1fefbf2fefbf2fefbf3fefbf4fefbf4
-
-fceac1fcebc2fcebc3fcebc4fcecc5fcecc6fcecc7fcedc8fcedc9fcedcafdeecbfdeeccfdeecdfd
-eecefdefcffdefcffdefd0fdf0d1fdf0d2fdf0d3fef1d3fef2d4fef2d5fef2d6fef2d7fef3d8fef3
-d8fef3d9fef3dafef4dbfef4ddfef4defef5defef5dffef5e0fef5e1fef6e2fef6e3fef6e3fef6e4
-fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8e9fef8eafef8eafef9ebfef9ecfef9ecfef9edfe
-f9edfef9eefefaeffefaeffefaf0fefaf0fefaf1fefaf1fefbf2fefbf3fefbf3
-
-fceabffceac0fceac1fcebc2fcebc3fcebc5fcecc5fcecc7fcecc8fcedc9fcedcafdeecbfdeecbfd
-eeccfdeecdfdefcefdefcffdefd0fdefd1fef1d1fef1d2fef1d3fef1d4fef2d5fef2d5fef2d6fef3
-d7fef3d9fef3dafef3dbfef4dbfef4dcfef4ddfef4defef5dffef5e0fef5e0fef5e1fef6e2fef6e3
-fef6e4fef7e5fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8eafef8eafef8ebfef9ebfef9ecfe
-f9ecfef9edfef9eefef9eefefaeffefaeffefaf0fefaf0fefaf1fefaf2fefbf2
-
-fce9bdfce9bffceac0fceac1fcebc2fcebc3fcebc4fcecc5fcecc6fcecc7fcedc8fcedc9fcedcafd
-eecbfdeeccfdeecdfdeecdfdefcefef0cffef0d0fef0d1fef1d2fef1d2fef1d3fef2d5fef2d6fef2
-d7fef2d8fef3d8fef3d9fef3dafef3dbfef4dcfef4ddfef4ddfef4defef5dffef5e0fef5e1fef6e1
-fef6e2fef6e3fef6e4fef7e5fef7e6fef7e7fef7e7fef8e8fef8e9fef8e9fef8eafef8eafef8ebfe
-f9ebfef9ecfef9edfef9edfef9eefefaeefefaeffefaf0fefaf0fefaf1fefaf1
-
-fce8bcfce9bdfce9befceabffceac0fceac1fcebc2fcebc3fcebc4fcecc5fcecc6fcecc7fcedc8fc
-edc9fdeecbfdeecbfdeeccfdeecdfef0cefef0cffef0cffef0d1fef1d2fef1d3fef1d4fef1d5fef2
-d5fef2d6fef2d7fef2d8fef3d9fef3dafef3dafef4dbfef4dcfef4ddfef4defef5dffef5dffef5e0
-fef5e1fef6e2fef6e3fef6e3fef6e4fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8e9fef8eafe
-f8ebfef9ebfef9ecfef9ecfef9edfef9edfef9eefefaeffefaeffefaf0fefaf0
-
-fce8bafce8bbfce9bcfce9bdfce9befceabffceac0fceac1fcebc2fcebc4fcebc5fcecc6fcecc7fc
-edc8fcedc9fcedcafdeecbfeefccfeefcdfeefcefef0cffef0d0fef0d1fef0d2fef1d2fef1d3fef1
-d4fef1d5fef2d6fef2d6fef2d7fef3d8fef3d9fef3dafef3dbfef4dbfef4dcfef4ddfef4defef5df
-fef5e0fef5e1fef5e1fef6e2fef6e3fef6e4fef7e5fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fe
-f8eafef8eafef8ebfef9ebfef9ecfef9ecfef9edfef9eefef9eefefaeffefaef
-
-fce7b8fce8bafce8bafce8bcfce9bdfce9befceabffceac0fceac1fcebc2fcebc3fcebc4fcecc5fc
-ecc6fcecc7fcedc8fdeec9fdeecbfeefccfeefcdfeefcefeefcffef0cffef0d0fef0d1fef1d2fef1
-d3fef1d4fef1d4fef2d5fef2d6fef2d7fef2d8fef3d8fef3d9fef3dafef3dbfef4dcfef4ddfef4dd
-fef5defef5dffef5e0fef5e1fef6e2fef6e2fef6e3fef6e4fef7e5fef7e6fef7e7fef8e8fef8e8fe
-f8e9fef8e9fef8eafef8eafef9ebfef9ebfef9ecfef9edfef9edfef9eefefaee
-
-fce7b7fce7b8fce7b9fce8bafce8bbfce9bcfce9bdfce9befceabffceac0fceac1fcebc2fcebc3fc
-ebc4fcecc5fdedc6fdedc8fdeec9fdeecbfeefccfeefccfeefcdfeefcefef0cffef0d0fef0d0fef0
-d1fef1d2fef1d3fef1d4fef1d5fef2d6fef2d6fef2d7fef2d8fef3d9fef3dafef3dbfef4dbfef4dc
-fef4ddfef4defef5dffef5dffef5e0fef5e1fef6e2fef6e3fef6e4fef6e4fef7e5fef7e6fef7e7fe
-f8e8fef8e8fef8e9fef8e9fef8eafef8ebfef9ebfef9ecfef9ecfef9edfef9ee
-
-fce6b5fce7b6fce7b7fce7b8fce8b9fce8bafce8bbfce9bcfce9bdfce9befceac0fceac0fceac2fc
-ebc2fcebc4fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefeefcefef0cffef0
-d0fef0d1fef0d2fef1d2fef1d3fef1d4fef2d5fef2d6fef2d7fef2d7fef3d8fef3d9fef3dafef3db
-fef4dcfef4ddfef4ddfef4defef5dffef5e0fef5e1fef6e1fef6e2fef6e3fef6e4fef7e5fef7e5fe
-f7e6fef7e7fef8e8fef8e9fef8e9fef8eafef8eafef8ebfef9ebfef9ecfef9ec
-
-fce6b3fce6b5fce6b5fce7b7fce7b7fce7b9fce8bafce8bbfce8bcfce9bdfce9befceabffceac0fc
-eac1fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefeef
-cffef0d0fef0d0fef0d1fef1d2fef1d3fef1d4fef1d4fef2d5fef2d6fef2d7fef2d8fef3d9fef3d9
-fef3dafef3dbfef4dcfef4ddfef4defef5defef5dffef5e0fef5e1fef6e2fef6e3fef6e3fef6e4fe
-f7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8e9fef8eafef8eafef9ebfef9ec
-
-fce5b2fce5b3fce6b4fce6b5fce6b6fce7b7fce7b8fce7b9fce8bafce8bbfce9bcfce9bdfce9befd
-ebbffdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc9fdeecafdeecbfeefccfeefccfeef
-cdfeefcefef0cffef0d0fef0d1fef0d1fef1d2fef1d3fef1d4fef1d5fef2d6fef2d6fef2d7fef3d8
-fef3d9fef3dafef3dbfef4dbfef4dcfef4ddfef4defef5dffef5e0fef5e0fef5e1fef6e2fef6e3fe
-f6e4fef7e5fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8eafef8eafef8eb
-
-fce4b0fce5b1fce5b2fce6b3fce6b4fce6b5fce7b6fce7b7fce7b8fce8b9fce8bafce8bbfdeabdfd
-eabefdeac0fdebc1fdebc2fdebc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeef
-ccfeefcdfeefcefeefcefef0cffef0d0fef0d1fef0d2fef1d3fef1d3fef1d4fef2d5fef2d6fef2d7
-fef2d8fef3d8fef3d9fef3dafef3dbfef4dcfef4ddfef4ddfef4defef5dffef5e0fef5e1fef6e1fe
-f6e2fef6e3fef6e4fef7e5fef7e6fef7e7fef7e7fef8e8fef8e9fef8e9fef8ea
-
-fce4aefce4affce5b0fce5b2fce5b2fce6b4fce6b5fce6b6fce7b7fce7b8fce7b9fce8bafde9bcfd
-e9bdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdee
-cafdeecbfeefccfeefcdfeefcefef0cffef0d0fef0d0fef0d1fef1d2fef1d3fef1d4fef1d4fef2d5
-fef2d6fef2d7fef2d8fef3d9fef3dafef3dafef4dbfef4dcfef4ddfef4defef5dffef5dffef5e0fe
-f5e1fef6e2fef6e3fef6e3fef6e4fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9
-
-fce3adfce4aefce4affce4b0fce5b1fce5b2fce5b3fce6b4fce6b5fce6b6fce7b7fde8b9fde9bafd
-e9bbfde9bcfdeabdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdecc6fdedc6fdedc8fdee
-c9fdeecafdeecbfeefccfeefcdfeefcdfeefcefef0cffef0d0fef0d1fef0d2fef1d2fef1d3fef1d4
-fef1d5fef2d6fef2d6fef2d7fef3d8fef3d9fef3dafef3dbfef4dbfef4dcfef4ddfef4defef5dffe
-f5e0fef5e1fef5e1fef6e2fef6e3fef6e4fef7e5fef7e5fef7e6fef7e7fef8e8
-
-fce3abfce3acfce3adfce4aefce4affce4b0fce5b1fce5b2fce6b3fce6b4fde7b6fde8b7fde8b8fd
-e8b9fde9bbfde9bbfde9bdfdeabefdeabffdeac0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fded
-c7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefeefcefef0cffef0d0fef0d1fef1d2fef1d3
-fef1d4fef1d4fef2d5fef2d6fef2d7fef2d8fef3d8fef3d9fef3dafef3dbfef4dcfef4ddfef4ddfe
-f5defef5dffef5e0fef5e1fef6e2fef6e2fef6e3fef6e4fef7e5fef7e6fef7e7
-
-fce2a9fce2aafce3abfce3acfce4adfce4aefce4affce5b1fce5b2fde6b3fde7b5fde7b6fde7b7fd
-e8b8fde8b9fde8bafde9bbfde9bcfde9bdfdeabefdeabffdebc0fdebc1fdebc2fdecc3fdecc4fdec
-c5fdedc6fdedc7fdedc8fdeec9fdeecafeefccfeefccfeefcdfeefcefef0cffef0d0fef0d0fef0d1
-fef1d2fef1d3fef1d4fef1d5fef2d5fef2d6fef2d7fef2d8fef3d9fef3dafef3dbfef4dbfef4dcfe
-f4ddfef4defef5dffef5dffef5e0fef5e1fef6e2fef6e3fef6e4fef6e4fef7e5
-
-fce2a7fce2a9fce2aafce3abfce3acfce3adfce4aefce4affce4b0fde6b2fde6b3fde6b4fde7b5fd
-e7b6fde8b7fde8b8fde8b9fde9bafde9bbfde9bcfdeabdfdeabefdeabffdebc1fdebc1fdebc3fdec
-c3fdecc5fdecc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefeefcefef0cffef0d0
-fef0d1fef0d2fef1d2fef1d3fef1d4fef2d5fef2d6fef2d7fef2d7fef3d8fef3d9fef3dafef3dbfe
-f4dcfef4dcfef4ddfef4defef5dffef5e0fef5e1fef6e1fef6e2fef6e3fef6e4
-
-fce1a6fce1a7fce2a8fce2a9fce2aafce3abfce3acfce3adfde5affde5b0fde5b1fde6b2fde6b3fd
-e7b4fde7b6fde7b6fde8b8fde8b8fde8bafde9bbfde9bcfde9bdfdeabefdeabffdebc0fdebc1fdeb
-c2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc8fdeec9fdeecafdeecbfeefccfeefcdfeefcefeefcf
-fef0cffef0d0fef0d1fef1d2fef1d3fef1d4fef1d4fef2d5fef2d6fef2d7fef2d8fef3d8fef3d9fe
-f3dafef3dbfef4dcfef4ddfef4defef5defef5dffef5e0fef5e1fef6e2fef6e3
-
-fbe0a4fce1a5fce1a6fce1a7fce2a8fce2a9fce3aafce3abfde4aefde5aefde5b0fde5b1fde6b2fd
-e6b3fde6b4fde7b5fde7b6fde7b7fde8b8fde8b9fde8bafde9bbfde9bcfdeabdfdeabefdeabffdeb
-c0fdebc1fdebc2fdecc3fdecc4fdecc5fdedc6fdedc7fdedc9fdeec9fdeecbfeefccfeefccfeefcd
-feefcefef0cffef0d0fef0d1fef0d1fef1d2fef1d3fef1d4fef1d5fef2d6fef2d6fef2d7fef3d8fe
-f3d9fef3dafef3dbfef4dbfef4dcfef4ddfef4defef5dffef5dffef5e0fef5e1
-
-Q
-Q
-Q
-Q
-q
-q
-n
-106 313 m
-170 313 l
-170 249 l
-106 249 l
-106 313 l
-h
-W
-q
-q
-[64 0 0 64 106 249]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefd
-fdfefdfdfefdfdfefdfdfefdfdfefdfdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefd
-fdfefdfdfffdfdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfffdfdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfefdfdfefdfdfffdfdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfe
-fdfdfefdfdfefdfdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefdfdfefdfdfefdfdfefdfdfefdfdfefdfdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefdfdfefdfdfefdfdfefdfdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefdfdfefdfdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefcfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefbfffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefbfffefbfffefcfffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffefbfffefbfffefbfffefbfffefcfffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffdfafffdfafffefbfffefbfffefbfffefcfffefcfffefcfffefcfffefdfffefdfffefdfffefdff
-fefdfffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffe
-fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffdfafffdfafffdfafffdfafffefbfffefcfffefcfffefdfffefdfffefdfffefdfffefefffefeff
-fefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffe
-fefffefefffefefffefefffefefffefefffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffdfafffdfbfffdfbfffdfbfffdfbfffefcfffefcfffefcfffefcfffefdfffefdfffefdfffefeff
-fefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffe
-fefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefdfffefdfffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffdfafffdfafffdfafffdfbfffdfbfffdfbfffdfbfffefcfffefcfffefcfffefdfffefdfffefdff
-fefdfffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffe
-fefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefdfffefd
-fffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffdf9fffdfafffdfafffdfafffdfafffdfbfffdfbfffdfbfffefcfffefcfffefcfffefcfffefdff
-fefdfffefdfffefdfffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffe
-fefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefe
-fffefefffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfbfffdfbfffdfbfffdfbfffefcfffefcfffefcff
-fefcfffefdfffefdfffefdfffefefffefefffefefffefefffefefffefefffefefffefefffefefffe
-fefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefe
-fffefefffefefffefefffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffdfbfffdfbfffdfbfffdfbfffefcff
-fefcfffefcfffefdfffefdfffefdfffefdfffefefffefefffefefffefefffefefffefefffefefffe
-fefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefe
-fffefefffefefffefefffefefffefefffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefcf7fefcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffdfbfffdfbfffdfbff
-fefcfffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefefffefefffefefffefefffefefffe
-fefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefe
-fffefefffefefffefefffefefffefefffefefffefefffefdfffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefcf7fefcf7fefcf8fefcf8fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffdfbfffdfbff
-fdfbfffdfbfffefcfffefcfffefcfffefcfffefdfffefdfffefdfffefefffefefffefefffefefffe
-fefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefe
-fffefefffefefffefefffefefffefefffefefffefefffefefffefdfffefdfffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefcf6fefcf6fefcf7fefcf7fefcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfaff
-fdfbfffdfbfffdfbfffdfbfffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefefffefefffe
-fefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefe
-fffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefdfffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefbf5fefcf5fefcf6fefcf6fefcf7fefcf8fefcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfaff
-fdfafffdfbfffdfbfffdfbfffdfbfffefcfffefcfffefcfffefcfffefdfffefdfffefdfffefdfffe
-fefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefe
-fffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefdfffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefbf4fefbf4fefbf5fefcf5fefcf6fefcf7fefcf7fefcf8fefcf8fffdf9fffdf9fffdf9fffdfaff
-fdfafffdfafffdfafffdfbfffdfbfffdfbfffdfbfffefcfffefcfffefcfffefdfffefdfffefdfffe
-fdfffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefe
-fffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefdff
-fefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefbf3fefbf3fefbf4fefbf5fefbf5fefcf6fefcf6fefcf7fefcf7fefcf8fffdf9fffdf9fffdf9ff
-fdf9fffdfafffdfafffdfafffdfafffdfbfffdfbfffdfbfffefcfffefcfffefcfffefcfffefdfffe
-fdfffefdfffefdfffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefe
-fffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefeff
-fefefffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefbf2fefbf2fefbf3fefbf4fefbf4fefbf5fefcf5fefcf6fefcf6fefcf7fefcf8fefcf8fffdf9ff
-fdf9fffdf9fffdf9fffdfafffdfafffdfafffdfbfffdfbfffdfbfffdfbfffefcfffefcfffefcfffe
-fcfffefdfffefdfffefdfffefefffefefffefefffefefffefefffefefffefefffefefffefefffefe
-fffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefeff
-fefefffefefffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefaf1fefaf1fefbf2fefbf3fefbf3fefbf4fefbf4fefbf5fefcf6fefcf6fefcf7fefcf7fefcf8fe
-fcf8fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffdfbfffdfbfffdfbfffdfbfffefcfffe
-fcfffefcfffefdfffefdfffefdfffefdfffefefffefefffefefffefefffefefffefefffefefffefe
-fffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefeff
-fefefffefefffefefffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefaf0fefaf1fefaf1fefbf2fefbf2fefbf3fefbf3fefbf4fefbf5fefcf5fefcf6fefcf6fefcf7fe
-fcf7fefcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffdfbfffdfbfffdfbfffe
-fcfffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefefffefefffefefffefefffefefffefe
-fffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefeff
-fefefffefefffefefffefefffefdfffefdfffefdfffefdfffefdfffefdfffefd
-
-fefaeffefaf0fefaf0fefaf1fefaf1fefbf2fefbf2fefbf3fefbf4fefbf4fefbf5fefcf5fefcf6fe
-fcf7fefcf7fefcf8fefcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfbfffdfbfffd
-fbfffdfbfffefcfffefcfffefcfffefcfffefdfffefdfffefdfffefefffefefffefefffefefffefe
-fffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefeff
-fefefffefefffefefffefefffefefffefdfffefdfffefdfffefdfffefdfffefd
-
-fef9eefefaeffefaeffefaf0fefaf0fefaf1fefaf2fefbf2fefbf3fefbf3fefbf4fefbf4fefbf5fe
-fcf6fefcf6fefcf7fefcf7fefcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffd
-fbfffdfbfffdfbfffdfbfffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefefffefefffefe
-fffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefeff
-fefefffefefffefefffefefffefefffefefffefdfffefdfffefdfffefdfffefd
-
-fef9edfef9eefef9eefefaeffefaeffefaf0fefaf1fefaf1fefbf2fefbf2fefbf3fefbf4fefbf4fe
-fbf5fefcf5fefcf6fefcf6fefcf7fefcf8fefcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffd
-fafffdfafffdfbfffdfbfffdfbfffefcfffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefe
-fffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefeff
-fefefffefefffefefffefefffefefffefefffefefffefdfffefdfffefdfffefd
-
-fef9ecfef9edfef9edfef9eefefaeffefaeffefaf0fefaf0fefaf1fefaf1fefbf2fefbf2fefbf3fe
-fbf4fefbf4fefbf5fefcf5fefcf6fefcf7fefcf7fefcf8fefcf8fffdf9fffdf9fffdf9fffdfafffd
-fafffdfafffdfafffdfbfffdfbfffdfbfffdfbfffefcfffefcfffefcfffefdfffefdfffefdfffefd
-fffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefeff
-fefefffefefffefefffefefffefefffefefffefefffefdfffefdfffefdfffefd
-
-fef9ebfef9ecfef9ecfef9edfef9eefef9eefefaeffefaeffefaf0fefaf0fefaf1fefaf2fefbf2fe
-fbf3fefbf3fefbf4fefbf5fefbf5fefcf6fefcf6fefcf7fefcf7fefcf8fffdf9fffdf9fffdf9fffd
-f9fffdfafffdfafffdfafffdfafffdfbfffdfbfffdfbfffdfbfffefcfffefcfffefcfffefdfffefd
-fffefdfffefdfffefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefeff
-fefefffefefffefefffefefffefefffefefffefefffefefffefdfffefdfffefd
-
-fef8eafef8ebfef9ebfef9ecfef9edfef9edfef9eefef9eefefaeffefaf0fefaf0fefaf1fefaf1fe
-fbf2fefbf2fefbf3fefbf4fefbf4fefbf5fefcf5fefcf6fefcf6fefcf7fefcf8fefcf8fffdf9fffd
-f9fffdf9fffdf9fffdfafffdfafffdfafffdfbfffdfbfffdfbfffdfbfffefcfffefcfffefcfffefc
-fffefdfffefdfffefdfffefefffefefffefefffefefffefefffefefffefefffefefffefefffefeff
-fefefffefefffefefffefefffefefffefefffefefffefefffefefffefdfffefd
-
-fef8e9fef8eafef8eafef9ebfef9ecfef9ecfef9edfef9edfef9eefefaeffefaeffefaf0fefaf0fe
-faf1fefaf1fefbf2fefbf3fefbf3fefbf4fefbf4fefbf5fefcf6fefcf6fefcf7fefcf7fefcf8fefc
-f8fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffdfbfffdfbfffdfbfffdfbfffefcfffefc
-fffefcfffefdfffefdfffefdfffefdfffefefffefefffefefffefefffefefffefefffefefffefeff
-fefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefd
-
-fef8e8fef8e9fef8eafef8eafef8ebfef9ebfef9ecfef9ecfef9edfef9eefef9eefefaeffefaeffe
-faf0fefaf0fefaf1fefbf2fefbf2fefbf3fefbf3fefbf4fefbf5fefcf5fefcf6fefcf6fefcf7fefc
-f7fefcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffdfbfffdfbfffdfbfffefc
-fffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefefffefefffefefffefefffefefffefeff
-fefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefd
-
-fef8e8fef8e8fef8e9fef8e9fef8eafef8eafef9ebfef9ebfef9ecfef9edfef9edfef9eefefaeefe
-faeffefaf0fefaf0fefaf1fefaf1fefbf2fefbf2fefbf3fefbf4fefbf4fefbf5fefcf5fefcf6fefc
-f7fefcf7fefcf8fefcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfbfffdfbfffdfb
-fffdfbfffefcfffefcfffefcfffefcfffefdfffefdfffefdfffefefffefefffefefffefefffefeff
-fefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefe
-
-fef7e6fef7e7fef8e8fef8e8fef8e9fef8e9fef8eafef8ebfef9ebfef9ecfef9ecfef9edfef9eefe
-f9eefefaeffefaeffefaf0fefaf0fefaf1fefaf1fefbf2fefbf3fefbf3fefbf4fefbf4fefbf5fefc
-f6fefcf6fefcf7fefcf7fefcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfafffdfafffdfb
-fffdfbfffdfbfffdfbfffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefefffefefffefeff
-fefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefe
-
-fef7e5fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8eafef8eafef8ebfef9ebfef9ecfef9ecfe
-f9edfef9eefef9eefefaeffefaeffefaf0fefaf1fefaf1fefbf2fefbf2fefbf3fefbf4fefbf4fefb
-f5fefcf5fefcf6fefcf6fefcf7fefcf7fefcf8fffdf9fffdf9fffdf9fffdf9fffdfafffdfafffdfa
-fffdfafffdfbfffdfbfffdfbfffefcfffefcfffefcfffefcfffefdfffefdfffefdfffefdfffefeff
-fefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefe
-
-fef6e3fef6e4fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8e9fef8eafef8eafef9ebfef9ecfe
-f9ecfef9edfef9edfef9eefefaeffefaeffefaf0fefaf0fefaf1fefaf1fefbf2fefbf2fefbf3fefb
-f4fefbf4fefbf5fefcf5fefcf6fefcf7fefcf7fefcf8fefcf8fffdf9fffdf9fffdf9fffdfafffdfa
-fffdfafffdfafffdfbfffdfbfffdfbfffdfbfffefcfffefcfffefcfffefdfffefdfffefdfffefdff
-fefefffefefffefefffefefffefefffefefffefefffefefffefefffefefffefe
-
-fef6e2fef6e3fef6e4fef7e5fef7e5fef7e6fef7e7fef8e8fef8e8fef8e9fef8e9fef8eafef8ebfe
-f9ebfef9ecfef9ecfef9edfef9eefef9eefefaeffefaeffefaf0fefaf0fefaf1fefaf2fefbf2fefb
-f3fefbf3fefbf4fefbf5fefbf5fefcf6fefcf6fefcf7fefcf7fefcf8fffdf9fffdf9fffdf9fffdf9
-fffdfafffdfafffdfafffdfafffdfbfffdfbfffdfbfffdfbfffefcfffefcfffefcfffefdfffefdff
-fefdfffefdfffefefffefefffefefffefefffefefffefefffefefffefefffefe
-
-Q
-Q
-Q
-Q
-Q
-q
-n
-327.5 124.1 m
-306.1 50.1 234.1 -2.9 146.3 10.8 c
-149.6 15.4 l
-235.5 10.2 297.7 57.7 322.4 123.5 c
-327.5 124.2 l
-327.5 124.1 l
-h
-W*
-q
-q
-n
-146 72 m
-210 72 l
-210 8.00001 l
-146 8.00001 l
-146 72 l
-h
-W
-q
-q
-[64 0 0 64 146 8.00001]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-100e0d100e0d100e0d100e0d100e0e100f0e100f0e100f0e110f0e110f0e110f0e110f0e110f0e11
-0f0e110f0e110f0f110f0f110f0f12100f12100f12100f12100f12100f12100f12100f12100f1210
-0f131010131010131010131010131010131010131010131010131010131010141010141010141011
-14101114101114111114111114111114111114111115111115111115111115111215111215111215
-1112151212151212151212161212161212161212161212161212161213161213
-
-100e0d100e0d100e0d100e0d100e0e100e0e100f0e100f0e110f0e110f0e110f0e110f0e110f0e11
-0f0e110f0e110f0e110f0f110f0f12100f12100f12100f12100f12100f12100f12100f12100f120f
-0f120f10130f10130f10131010131010131010131010131010131010131010131010141010141011
-14101114101114101114111114111114111114111114111115111115111115111115111215111215
-1112151112151212151212161212161212161212161212161212161213161213
-
-100e0d100e0d100e0d100e0d100e0d100e0e100f0e100f0e100f0e110f0e110f0e110f0e110f0e11
-0f0e110f0e110f0e110f0f110f0f110f0f12100f12100f12100f12100f120f0f120f0f120f0f120f
-0f120f0f120f10130f10130f10131010131010131010131010131010131010131010141010141010
-14101114101114101114111114111114111114111114111115111115111115111115111215111215
-1112151112151112151212151212161212161212161212161212161212161213
-
-100e0d100e0d100e0d100e0d100e0d100e0e100e0e100f0e100f0e110f0e110f0e110f0e110f0e11
-0f0e110f0e110f0e110f0e110f0f110f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f
-0f120f0f120f0f130f10130f10130f10131010131010131010131010131010131010131010141010
-14101114101114101114101114111114111114111114111114111115111115111115111115111215
-1112151112151112151212151212151212161212161212161212161212161212
-
-100e0d100e0d100e0d100e0d100e0d100e0d100e0e100e0e100f0e100f0e110f0e110f0e110f0e11
-0f0e110f0e110f0e110f0e110f0e110e0f110e0f120f0f120f0f120f0f120f0f120f0f120f0f120f
-0f120f0f120f0f120f10130f10130f10131010131010131010131010131010131010131010131010
-14101014101114101114101114111114111114111114111114111115111115111115111115111115
-1112151112151112151112151212151212161212161212161212161212161212
-
-0f0e0d100e0d100e0d100e0d100e0d100e0d100e0d100e0e100f0e100f0e100f0e110f0e110f0e11
-0f0e110e0e110e0e110e0e110e0e110e0f110e0f120f0f120f0f120f0f120f0f120f0f120f0f120f
-0f120f0f120f0f120f0f130f10130f10130f10131010131010131010131010131010131010131010
-14101014101014101114101114101114111114111114111114111114111115111115111115111115
-1112151112151112151112151212151212151212161212161212161212161212
-
-0f0e0d100e0d100e0d100e0d100e0d100e0d100e0d100e0e100e0e100e0e100e0e110e0e110e0e11
-0e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f120f0f120f0f120f0f120f0f120f0f120f
-0f120f0f120f0f120f0f120f10130f10130f10131010131010131010131010131010131010131010
-13101014101014101114101114101114101114111114111114111114111114111115111115111115
-1111151112151112151112151112151212151212161212161212161212161212
-
-0f0e0d0f0e0d100e0d100e0d100e0d100e0d100e0d100e0d100d0e100e0e100e0e100e0e110e0e11
-0e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f110e0f120f0f120f0f120f0f120f0f120f
-0f120f0f120f0f120f0f120f0f120f10130f10130f10131010131010131010131010131010131010
-13101014101014101014101114101114101114111114111114111114111114111115111115111115
-1111151112151112151112151112151112151212151212161212161212161212
-
-0f0e0d0f0e0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0e100d0e100e0e100e0e110e0e11
-0e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f120f0f120f0f120f0f120f0f120f
-0f120f0f120f0f120f0f120f0f120f0f130f10130f10131010131010131010131010131010131010
-13101013101014101014101114101114101114101114111114111114111114111114111115111115
-1111151111151112151112151112151112151212151212151212161212161212
-
-0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0d100d0e100d0e100e0e100e0e11
-0e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f110e0f120f0f120f0f120f0f120f
-0f120f0f120f0f120f0f120f0f120f0f120f10130f10130f10131010131010131010131010131010
-13101013101013101014101014101114101114101114111114111114111114111114111115111115
-1111151111151111151112151112151112151112151212151212161212161212
-
-0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0d100d0e100e0e100e0e10
-0e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f120f0f120f0f120f0f120f
-0f120f0f120f0f120f0f120f0f120f0f120f0f130f10130f10130f10131010131010131010131010
-13101013101013101014101014101014101114101114101114111114111114111114111114111115
-1111151111151111151112151112151112151112151212151212151212161212
-
-0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0d100d0e100d0e100e0e10
-0e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f120f0f120f0f120f
-0f120f0f120f0f120f0f120f0f120f0f120f0f120f10130f10130f10131010131010131010131010
-13101013101013101013101014101014101114101114101114111114111114111114111114111114
-1111151111151111151111151112151112151112151112151212151212161212
-
-0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0d100d0e100e0e10
-0e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f110e0f120f0f120f
-0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f130f10130f10130f10131010131010131010
-13101013101013101013101014101014101014101114101114101114111114111114111114111114
-1111151111151111151111151112151112151112151112151112151212151212
-
-0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0e100d0e10
-0e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f120f0f120f
-0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f130f10130f10131010131010131010
-13101013101013101013101013101014101014101114101114101114101114111114111114111114
-1111141111151111151111151111151112151112151112151112151212151212
-
-0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0d100d0e10
-0d0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f110e0f120f
-0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f10130f10130f10131010131010
-13101013101013101013101013101013101014101014101114101114101114111114111114111114
-1111141111151111151111151111151111151112151112151112151112151212
-
-0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0d10
-0d0e100e0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f120f
-0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f130f10130f10130f10131010
-13101013101013101013101013101013101014101014101014101114101114101114111114111114
-1111141111141111151111151111151111151112151112151112151112151212
-
-0f0c0c0f0c0d0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0d10
-0d0e100d0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e
-0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f10130f10130f10131010
-13101013101013101013101013101013101013101014101014101114101114101114111114111114
-1111141111141111141111151111151111151111151112151112151112151112
-
-0f0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d10
-0d0d100d0e100e0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e
-0f110e0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f130f10130f10130f10
-13101013101013101013101013101013101013101014101014101014101114101114101114111114
-1111141111141111141111151111151111151111151112151112151112151112
-
-0f0c0c0f0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d10
-0d0d100d0e100d0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e
-0f110e0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f130f10130f10
-13101013101013101013101013101013101013101013101014101014101114101114101114101114
-1111141111141111141111141111151111151111151111151112151112151112
-
-0f0c0c0f0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d10
-0d0d100d0d100d0e100d0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e
-0f110e0f110e0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f10130f10
-130f1013101013101013101013101013101013101013101014101014101014101114101114101114
-1111141111141111141111141111151111151111151111151111151112151112
-
-0f0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d10
-0d0d100d0d100d0d100d0e100e0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e
-0e110e0f110e0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f130f10
-130f10130f1013101013101013101013101013101013101013101014101014101014101114101114
-1011141111141111141111141111141111151111151111151111151112151112
-
-0e0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d10
-0d0d100d0d100d0d100d0e100d0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e
-0e110e0e110e0f110e0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f10
-130f10130f1013101013101013101013101013101013101013101013101014101014101114101114
-1011141111141111141111141111141111141111151111151111151111151112
-
-0e0c0c0f0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d10
-0d0d100d0d100d0d100d0d100d0e100e0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e
-0e110e0e110e0f110e0f110e0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f
-130f10130f10130f1013101013101013101013101013101013101013101014101014101014101114
-1011141011141111141111141111141111141111151111151111151111151112
-
-0e0c0c0e0c0c0f0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d10
-0d0d100d0d100d0d100d0d100d0e100d0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e
-0e110e0e110e0e110e0f110e0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f
-120f0f130f10130f1013101013101013101013101013101013101013101013101014101014101114
-1011141011141011141111141111141111141111141111151111151111151111
-
-0e0c0c0e0c0c0f0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d10
-0d0d100d0d100d0d100d0d100d0d100d0e100d0e100e0e100e0e110e0e110e0e110e0e110e0e110e
-0e110e0e110e0e110e0f110e0f110e0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f
-120f0f120f10130f10130f1013101013101013101013101013101013101013101014101014101014
-1011141011141011141111141111141111141111141111151111151111151111
-
-0e0c0c0e0c0c0e0c0c0f0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d10
-0d0d100d0d100d0d100d0d100d0d100d0d100d0e100e0e100e0e100e0e110e0e110e0e110e0e110e
-0e110e0e110e0e110e0e110e0f110e0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f
-120f0f120f0f130f10130f10130f1013101013101013101013101013101013101013101014101014
-1010141011141011141011141111141111141111141111141111151111151111
-
-0e0c0c0e0c0c0e0c0c0e0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d10
-0d0d100d0d100d0d100d0d100d0d100d0d100d0e100d0e100e0e100e0e110e0e110e0e110e0e110e
-0e110e0e110e0e110e0e110e0e110e0f110e0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f
-120f0f120f0f120f10130f10130f1013101013101013101013101013101013101013101013101014
-1010141011141011141011141111141111141111141111141111151111151111
-
-0e0c0c0e0c0c0e0c0c0e0c0c0f0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f
-0d0d100d0d100d0d100d0d100d0d100d0d100d0d100d0e100e0e100e0e100e0e110e0e110e0e110e
-0e110e0e110e0e110e0e110e0e110e0f110e0f110e0f120f0f120f0f120f0f120f0f120f0f120f0f
-120f0f120f0f120f0f130f10130f10130f1013101013101013101013101013101013101013101014
-1010141010141011141011141011141111141111141111141111141111151111
-
-0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0f0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f
-0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0e100d0e100e0e100e0e110e0e110e0e110e
-0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f120f0f120f0f120f0f120f0f120f0f120f0f
-120f0f120f0f120f0f120f0f130f10130f1013101013101013101013101013101013101013101013
-1010141010141011141011141011141011141111141111141111141111141111
-
-0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0f0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f
-0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0d100d0e100d0e100e0e100e0e110e0e110e
-0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f110e0f120f0f120f0f120f0f120f0f120f0f
-120f0f120f0f120f0f120f0f120f10130f10130f1013101013101013101013101013101013101013
-1010141010141010141011141011141011141111141111141111141111141111
-
-0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0f0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f
-0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0d100d0e100e0e100e0e100e0e110e
-0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f120f0f120f0f120f0f120f0f120f0f
-120f0f120f0f120f0f120f0f120f0f130f10130f10130f1013101013101013101013101013101013
-1010131010141010141010141011141011141011141111141111141111141111
-
-0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f0c0d0f0d0d0f
-0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0d100d0e100d0e100e0e100e0e110e
-0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f120f0f120f0f120f0f120f0f
-120f0f120f0f120f0f120f0f120f0f120f10130f10130f1013101013101013101013101013101013
-1010131010131010141010141011141011141011141111141111141111141111
-
-0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0f0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f0d0d0f
-0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0d100d0e100e0e100e0e100e
-0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f110e0f120f0f120f0f120f0f
-120f0f120f0f120f0f120f0f120f0f120f0f130f10130f10130f1013101013101013101013101013
-1010131010131010141010141010141011141011141011141111141111141111
-
-0e0b0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0f0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f
-0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0e100d0e100e0e100e
-0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f120f0f120f0f120f0f
-120f0f120f0f120f0f120f0f120f0f120f0f120f0f130f10130f1013101013101013101013101013
-1010131010131010131010141010141011141011141011141011141111141111
-
-0e0b0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0f0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f
-0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0d100d0e100d0e100e
-0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f110e0f120f0f120f0f
-120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f10130f10130f1013101013101013101013
-1010131010131010131010141010141010141011141011141011141111141111
-
-0e0b0b0e0b0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0f0c0c0f0c0c0f0c0c0f0c0c0f
-0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0d100d0e100e
-0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f120f0f120f0f
-120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f130f10130f10130f1013101013101013
-1010131010131010131010131010141010141010141011141011141011141111
-
-0e0b0b0e0b0b0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0f0c0c0f0c0c0f0c0c0f
-0c0d0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0d100d0e100d
-0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f120f0f
-120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f10130f10130f1013101013101013
-1010131010131010131010131010131010141010141011141011141011141111
-
-0e0b0b0e0b0b0e0b0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0f0c0c0f0c0c0f0c0c0f
-0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d0d100d
-0e100e0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f110e0f
-120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f130f10130f10130f1013101013
-1010131010131010131010131010131010141010141010141011141011141011
-
-0d0b0b0e0b0b0e0b0b0e0b0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0f0c0c0f0c0c0f
-0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d
-0e100d0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f
-120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f130f10130f1013101013
-1010131010131010131010131010131010131010141010141011141011141011
-
-0d0b0b0d0b0b0e0b0b0e0b0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0f0c0c0f0c0c0f
-0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d0d100d
-0d100d0e100d0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f110e0f
-110e0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f10130f10130f1013
-1010131010131010131010131010131010131010141010141010141011141011
-
-0d0b0b0d0b0b0e0b0b0e0b0b0e0b0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0f0c0c0f
-0c0c0f0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d
-0d100d0d100d0e100e0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0f
-110e0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f130f10130f1013
-0f10131010131010131010131010131010131010131010131010131011131011
-
-0d0b0b0d0b0b0d0b0b0e0b0b0e0b0b0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0f
-0c0c0f0c0c0f0c0c0f0c0d0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d0d100d
-0d100d0d100d0e100d0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e
-110e0f110e0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f10130f1013
-0f10131010131010131010131010121010121010121010121010131010131011
-
-0d0b0b0d0b0b0d0b0b0e0b0b0e0b0b0e0b0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0f
-0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d0d100d
-0d100d0d100d0d100d0e100e0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e
-110e0f110e0f110e0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f120f0f130f1012
-0f10120f10121010121010121010121010121010121010121010131010131010
-
-0c0b0b0c0b0b0c0b0b0c0b0b0d0b0b0e0b0b0e0b0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e
-0c0c0f0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d
-0d100d0d100d0d100d0e100d0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e110e0e110e0e
-110e0e110e0f110e0f120f0f120f0f120f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f12
-0f10120f10121010121010121010121010121010121010121010121010131010
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0d0b0b0d0b0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0e0c0c0e
-0c0c0f0c0c0f0c0c0f0c0c0f0c0c0f0c0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d100d0d100d0d100d
-0d100d0d100d0d100d0d100d0e100d0e100e0e100e0e110e0e110e0e110e0e110e0e110e0e100e0e
-100e0e100e0f100e0f100e0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f11
-0f10120f10120f10121010121010121010121010121010121010121010131010
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0d0b0b0d0b0b0d0b0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d
-0c0c0d0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0d0e0d0d0e0d0d0e0d0d0e0d0d0e0d0d0f0d0d0f0d
-0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0e0f0e0e0f0e0e0f0e0e100e0e100e0e100e0e100e0e100e0e
-100e0e100e0e100e0f100e0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f11
-0f0f120f10120f10120f10121010121010121010121010121010121010121010
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0d0b0b0d0b0b0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d
-0c0c0d0c0c0d0c0c0e0c0c0e0c0c0e0c0c0e0c0d0e0c0d0e0d0d0e0d0d0e0d0d0e0d0d0f0d0d0f0d
-0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0e0f0d0e0f0e0e0f0e0e100e0e100e0e100e0e100e0e100e0e
-100e0e100e0e100e0e100e0f100e0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f11
-0f0f110f10120f10120f10121010121010121010121010121010121010121010
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0d0b0b0d0b0b0d0b0c0d0c0c0d0c0c0d0c0c0d0c0c0d
-0c0c0d0c0c0d0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0d0e0d0d0e0d0d0e0d0d0e0d0d0e0d0d0f0d
-0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0e0f0e0e0f0e0e0f0e0e100e0e100e0e100e0e100e0e
-100e0e100e0e100e0e100e0f100e0f100e0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f11
-0f0f110f0f120f10120f10120f10121010121010121010121010121010121010
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0d0b0b0d0b0b0d0b0c0d0c0c0d0c0c0d0c0c0d
-0c0c0d0c0c0d0c0c0d0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0d0e0d0d0e0d0d0e0d0d0e0d0d0e0d
-0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0e0f0d0e0f0e0e0f0e0e100e0e100e0e100e0e100e0e
-100e0e100e0e100e0e100e0e100e0f100e0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f11
-0f0f110f0f110f0f120f10120f10121010121010121010121010121010121010
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0d0b0b0d0b0c0d0c0c0d0c0c0d0c0c0d
-0c0c0d0c0c0d0c0c0d0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0d0e0d0d0e0d0d0e0d0d0e0d0d0e0d
-0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0e0f0d0e0f0e0e0f0e0e100e0e100e0e100e0e
-100e0e100e0e100e0e100e0e100e0f100e0f100e0f110f0f110f0f110f0f110f0f110f0f110f0f11
-0f0f110f0f110f0f110f10120f10120f10121010121010121010121010121010
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0d0b0b0d0b0b0d0b0c0d0c0c0d0c0c0d
-0c0c0d0c0c0d0c0c0d0c0c0d0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0d0e0d0d0e0d0d0e0d0d0e0d
-0d0e0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0e0f0e0e0f0e0e0f0e0e100e0e100e0e
-100e0e100e0e100e0e100e0e100e0e100e0f100e0f110f0f110f0f110f0f110f0f110f0f110f0f11
-0f0f110f0f110f0f110f0f120f10120f10120f10121010121010121010121010
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0d0b0b0d0b0b0d0c0c0d0c0c0d
-0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0e0c0c0e0c0c0e0c0c0e0c0d0e0c0d0e0d0d0e0d0d0e0d
-0d0e0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0e0f0d0e0f0e0e0f0e0e100e0e100e0e
-100e0e100e0e100e0e100e0e100e0e100e0e100e0f100e0f110f0f110f0f110f0f110f0f110f0f11
-0f0f110f0f110f0f110f0f110f10120f10120f10121010121010121010121010
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0d0b0b0d0b0b0d0b0c0d0c0c0d
-0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0d0e0d0d0e0d0d0e0d
-0d0e0d0d0e0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0e0f0e0e0f0e0e0f0e0e100e0e
-100e0e100e0e100e0e100e0e100e0e100e0e100e0f100e0f100e0f110f0f110f0f110f0f110f0f11
-0f0f110f0f110f0f110f0f110f0f120f10120f10120f10121010121010121010
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0d0b0b0d0b0b0d0b0c0d
-0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0d0e0d0d0e0d
-0d0e0d0d0e0d0d0e0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0e0f0d0e0f0e0e0f0e0e100e0e
-100e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0f100e0f110f0f110f0f110f0f110f0f11
-0f0f110f0f110f0f110f0f110f0f110f0f120f10120f10121010121010121010
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0d0b0b0d0b0c0d
-0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0d0e0d0d0e0d
-0d0e0d0d0e0d0d0e0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0e0f0d0e0f0e0e0f0e0e
-100e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0f100e0f100e0f110f0f110f0f110f0f11
-0f0f110f0f110f0f110f0f110f0f110f0f110f10120f10120f10121010121010
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0d0b0b0d0b0b0d
-0b0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c0d0e0d
-0d0e0d0d0e0d0d0e0d0d0e0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0e0f0e0e0f0e0e
-0f0e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0f100e0f110f0f110f0f110f0f11
-0f0f110f0f110f0f110f0f110f0f110f0f110f0f120f10120f10120f10121010
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0d0b0b0d
-0b0b0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0e0c0c0e0c0c0e0c0c0e0c0d0e0c
-0d0e0d0d0e0d0d0e0d0d0e0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0e0f0d0e0f0e0e
-0f0e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0f100e0f110f0f110f0f11
-0f0f110f0f110f0f110f0f110f0f110f0f110f0f110f10120f10120f10121010
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0d0b0b0d
-0b0b0d0b0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0e0c0c0e0c0c0e0c0c0e0c0c0e0c
-0d0e0d0d0e0d0d0e0d0d0e0d0d0e0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0e0f0e0e
-0f0e0e0f0e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0f100e0f100e0f110f0f11
-0f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f120f10120f10120f10
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0d
-0b0b0d0b0b0d0b0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0e0c0c0e0c0c0e0c0c0e0c
-0c0e0c0d0e0d0d0e0d0d0e0d0d0e0d0d0e0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0e0f0d0e
-0f0e0e0f0e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0f100e0f110f0f11
-0f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f120f10120f10
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c
-0b0b0d0b0b0d0b0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0e0c0c0e0c0c0e0c0c0e0c
-0c0e0c0d0e0d0d0e0d0d0e0d0d0e0d0d0e0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0e
-0f0d0e0f0e0e0f0e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0f100e0f100e0f11
-0f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f110f10120f10
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c
-0b0b0d0b0b0d0b0b0d0b0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0e0c0c0e0c0c0e0c
-0c0e0c0c0e0c0d0e0d0d0e0d0d0e0d0d0e0d0d0e0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d
-0f0d0e0f0e0e0f0e0e0f0e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0f100e0f11
-0f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f120f10
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c
-0b0b0c0b0b0d0b0b0d0b0b0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0e0c0c0e0c
-0c0e0c0c0e0c0d0e0c0d0e0d0d0e0d0d0e0d0d0e0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d
-0f0d0e0f0d0e0f0e0e0f0e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0f10
-0e0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f110f10
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c
-0b0b0c0b0b0d0b0b0d0b0b0d0b0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0e0c0c0e0c
-0c0e0c0c0e0c0c0e0c0d0e0d0d0e0d0d0e0d0d0e0d0d0e0d0d0f0d0d0f0d0d0f0d0d0f0d0d0f0d0d
-0f0d0d0f0d0e0f0e0e0f0e0e0f0e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0f10
-0e0f100e0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f
-
-0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c0b0b0c
-0b0b0c0b0b0c0b0b0d0b0b0d0b0b0d0b0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0d0c0c0e0c
-0c0e0c0c0e0c0c0e0c0c0e0c0d0e0d0d0e0d0d0e0d0d0e0d0d0e0d0d0f0d0d0f0d0d0f0d0d0f0d0d
-0f0d0d0f0d0e0f0d0e0f0e0e0f0e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0e100e0e10
-0e0f100e0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f110f0f
-
-Q
-Q
-Q
-Q
-q
-q
-n
-210 72 m
-274 72 l
-274 8.00001 l
-210 8.00001 l
-210 72 l
-h
-W
-q
-q
-[64 0 0 64 210 8.00001]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-16121316121316121317131317131317131317131317131317131317131317131417131418131418
-13141813141814141814141814141814141814141814141814151914151914151914151914151914
-151915151915151915151915151915151a15151a15161a15161a15161a15161a15161a15161a1616
-1a16161a16161b16161b16161b16171b16171b16171b16171b16171b16171b16171b17171c17171c
-17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d1718
-
-16121316121316121317131317131317131317131317131317131317131317131417131417131418
-13141813141814141814141814141814141814141814141814141814151914151914151914151914
-151914151915151915151915151915151915151a15161a15161a15161a15161a15161a15161a1516
-1a16161a16161b16161b16161b16161b16171b16171b16171b16171b16171b16171b16171c17171c
-17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d1718
-
-16121316121316121316121317131317131317131317131317131317131317131317131417131417
-13141813141813141814141814141814141814141814141814141814151914151914151914151914
-151914151915151915151915151915151915151a15151a15161a15161a15161a15161a15161a1516
-1a16161a16161a16161b16161b16161b16161b16171b16171b16171b16171b16171b16171b16171c
-17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d1718
-
-16121316121316121316121317131317131317131317131317131317131317131317131417131417
-13141813141813141813141814141814141814141814141814141814141814151914151914151914
-151914151914151915151915151915151915151915151a15151a15161a15161a15161a15161a1516
-1a15161a16161a16161a16161b16161b16161b16171b16171b16171b16171b16171b16171b16171c
-17171c17171c17171c17171c17171c17181c17181c17181c17181c17181c1718
-
-16121316121316121316121316121317131317131317131317131317131317131317131317131417
-13141713141813141813141814141814141814141814141814141814141814141814151914151914
-151914151914151915151915151915151915151915151a15151a15161a15161a15161a15161a1516
-1a15161a15161a16161a16161b16161b16161b16161b16171b16171b16171b16171b16171b16171b
-16171c17171c17171c17171c17171c17171c17181c17181c17181b17181b1718
-
-16121216121316121316121316121316121317131317131317131317131317131317131317131317
-13141713141813141813141813141814141814141814141814141814141814141814151914151914
-151914151914151914151915151915151915151915151915151a15151a15161a15161a15161a1516
-1a15161a15161a16161a16161a16161b16161b16161b16171b16171b16171b16171b16171b16171b
-16171b17171c17171c17171c17171c17171c17181c17181b17181b17181b1718
-
-16121216121316121316121316121316121317131317131317131317131317131317131317131317
-13141713141713141813141813141814141814141814141814141814141814141814141814151914
-151914151914151914151914151915151915151915151915151915151a15161a15161a15161a1516
-1a15161a15161a15161a16161a16161b16161b16161b16161b16171b16171b16171b16171b16171b
-16171b16171c17171c17171c17171c17171c17171b17181b17181b17181b1718
-
-16121216121216121316121316121316121316121317131317131317131317131317131317131317
-13131713141713141713141813141813141814141814141814141814141814141814141814151914
-151914151914151914151914151915151915151915151915151915151a15151a15161a15161a1516
-1a15161a15161a15161a16161a16161a16161b16161b16161b16161b16171b16171b16171b16171b
-16171b16171b16171c17171c17171c17171b17171b17181b17181b17181b1718
-
-16121216121216121216121316121316121316121317131317131317131317131317131317131317
-13131713141713141713141813141813141813141814141814141814141814141814141814141814
-151914151914151914151914151914151915151915151915151915151915151a15151a15161a1516
-1a15161a15161a15161a15161a16161a16161a16161b16161b16161b16171b16171b16171b16171b
-16171b16171b16171c17171c17171b17171b17171b17171b17181b17181b1718
-
-16121216121216121216121316121316121316121316121317131317131317131317131317131317
-13131713131713141713141713141813141813141814141814141814141814141814141814141814
-141814151914151914151914151914151915151915151915151915151915151a15151a15161a1516
-1a15161a15161a15161a15161a15161a16161a16161b16161b16161b16161b16171b16171b16171b
-16171b16171b16171b16171b17171b17171b17171b17171b17171b17181b1718
-
-16121216121216121216121216121316121316121316121316121317131317131317131317131317
-13131713131713141713141713141813141813141813141814141814141814141814141814141814
-141814151914151914151914151914151914151915151915151915151915151915151a15151a1516
-1a15161a15161a15161a15161a15161a16161a16161a16161b16161b16161b16171b16171b16171b
-16171b16171a16171a16171a17171b17171b17171b17171b17171b17181b1718
-
-16121216121216121216121216121316121316121316121316121317131317131317131317131317
-13131713131713131713141713141713141813141813141814141814141814141814141814141814
-141814141814151914151914151914151914151914151915151915151915151915151915151a1516
-1a15161a15161a15161a15161a15161a15161a16161a16161b16161b16161b16161b16171b16171b
-16171a16171a16171a16171a16171b17171b17171b17171b17171b17171b1718
-
-16121216121216121216121216121216121316121316121316121316121317131317131317131317
-13131713131713131713131713141713141713141813141813141814141814141814141814141814
-141814141814151914151914151914151914151914151915151915151915151915151915151a1515
-1a15161a15161a15161a15161a15161a15161a16161a16161a16161b16161b16161b16161b16171a
-16171a16171a16171a16171a16171a16171b17171b17171b17171b17171b1718
-
-15121216121216121216121216121216121216121316121316121316121317131317131317131317
-13131713131713131713131713141713141713141813141813141813141814141814141814141814
-14181414181414181415191415191415191415191415191415191515191515191515191515191515
-1a15151a15161a15161a15161a15161a15161a15161a16161a16161a16161b16161b16161a16171a
-16171a16171a16171a16171a16171a16171b17171b17171b17171b17171b1717
-
-15121216121216121216121216121216121216121316121316121316121316121317131317131317
-13131713131713131713131713131713141713141713141813141813141814141814141814141814
-14181414181414181414181415191415191415191415191415191515191515191515191515191515
-1a15151a15161a15161a15161a15161a15161a15161a15161a16161a16161a16161a16161a16161a
-16171a16171a16171a16171a16171a16171a16171b17171b17171b17171b1717
-
-15121215121216121216121216121216121216121216121316121316121316121316121317131317
-13131713131713131713131713131713141713141713141813141813141813141814141814141814
-14181414181414181414181415191415191415191415191415191415191515191515191515191515
-1915151a15151a15161a15161a15161a15161a15161a15161a16161916161916161a16161a16161a
-16171a16171a16171a16171a16171a16171a16171a17171b17171b17171b1717
-
-15121215121216121216121216121216121216121216121316121316121316121316121317131317
-13131713131713131713131713131713131713141713141713141813141813141814141814141814
-14181414181414181414181414181415191415191415191415191415191415191515191515191515
-1915151915151a15161a15161a15161a15161a15161a15161915161916161916161a16161a16161a
-16161a16171a16171a16171a16171a16171a16171a16171b17171b17171b1717
-
-15111215121215121216121216121216121216121216121216121316121316121316121316121317
-13131713131713131713131713131713131713131713141713141713141813141813141814141814
-14181414181414181414181414181415191415191415191415191415191415191515191515191515
-1915151915151a15151a15161a15161a15161915161915161915161916161916161916161a16161a
-16161a16161a16171a16171a16171a16171a16171a16171a16171b17171b1717
-
-15111215121215121215121216121216121216121216121216121216121316121316121316121317
-13131713131713131713131713131713131713131713141713141713141813141813141813141814
-14181414181414181414181414181414181415191415191415191415191415191415191515191515
-1915151915151915151a15151a15161915161915161915161915161915161916161916161916161a
-16161a16161a16171a16171a16171a16171a16171a16171a16171b17171b1717
-
-15111215111215121215121216121216121216121216121216121216121316121316121316121316
-12131713131713131713131713131713131713131713131713141713141713141813141813141814
-14181414181414181414181414181414181414181415191415191415191415191415191515191515
-1915151915151915151a15151915161915161915161915161915161915161915161916161916161a
-16161a16161a16161a16171a16171a16171a16171a16171a16171a16171b1717
-
-15111215111215121215121215121216121216121216121216121216121216121316121316121316
-12131612131713131713131713131713131713131713131713141713141713141813141813141813
-14181414181414181414181414181414181414181415191415191415191415191415191415191515
-19151519151518151518151519151519151619151619151619151619151619151619161619161619
-16161a16161a16161a16171a16171a16171a16171a16171a16171a16171a1717
-
-15111215111215111215121215121216121216121216121216121216121216121316121316121316
-12131612131713131713131713131713131713131713131713131713141713141713141813141813
-14181414181414181414181414181414181414181414181415191415191415191415191415191415
-19151518151518151518151518151519151619151619151619151619151619151619151619161619
-16161a16161a16161a16161a16171a16171a16171a16171a16171a16171a1617
-
-15111215111215111215111215121215121216121216121216121216121216121216121316121316
-12131612131612131713131713131713131713131713131713131713131713141713141713141813
-14181314181414181414181414181414181414181414181415191415191415191415191415181415
-18151518151518151518151518151519151519151619151619151619151619151619151619161619
-16161916161a16161a16161a16161a16171a16171a16171a16171a16171a1617
-
-15111215111215111215111215121215121215121216121216121216121216121216121216121316
-12131612131612131713131713131713131713131713131713131713131713141713141713141813
-14181314181314181414181414181414181414181414181414181415191415191415181415181415
-18141518151518151518151518151518151519151619151619151619151619151619151619151619
-16161916161916161a16161a16161a16171a16171a16171a16171a16171a1617
-
-15111115111215111215111215111215121215121216121216121216121216121216121216121316
-12131612131612131612131713131713131713131713131713131713131713131713141713141713
-14181314181314181414181414181414181414181414181414181414171415181415181415181415
-18141518151518151518151518151518151519151519151619151619151619151619151619151619
-15161916161916161a16161a16161a16161a16171a16171a16171a16171a1617
-
-15111115111215111215111215111215121215121215121216121216121216121216121216121216
-12131612131612131612131612131713131713131713131713131713131713131713141713141713
-14181314181314181314181414181414181414181414171414171414171415181415181415181415
-18141518141518151518151518151518151518151519151519151619151619151619151619151619
-15161916161916161916161a16161a16161a16171a16171a16171a16171a1617
-
-15111115111115111215111215111215111215121215121216121216121216121216121216121216
-12131612131612131612131612131713131713131713131713131713131713131713131713141713
-14171314181314181314181414181414181414171414171414171414171414171415181415181415
-18141518141518141518151518151518151518151518151519151619151619151619151619151619
-15161915161916161916161a16161a16161a16161a16171a16171a16171a1617
-
-15111115111115111215111215111215111215111215121215121216121216121216121216121216
-12121612131612131612131612131612131713131713131713131713131713131713131713131713
-14171314171314181314181314171414171414171414171414171414171414171415181415181415
-18141518141518141518151518151518151518151518151519151519151619151619151619151619
-15161915161916161916161916161a16161a16161a16161a16171a16171a1617
-
-15111115111115111115111215111215111215111215121215121215121216121216121216121216
-12121612121612131612131612131612131713131713131713131713131713131713131713131713
-14171314171314171314171314171314171414171414171414171414171414171414171415181415
-18141518141518141518141518151518151518151518151518151519151619151619151619151619
-15161915161915161916161916161916161a16161a16161a16171a16171a1617
-
-15111115111115111115111115111215111215111215111215121215121216121216121216121216
-12121612121612131612131612131612131612131713131713131713131713131713131713131713
-13161314161314161314171314171314171414171414171414171414171414171414171414171415
-18141518141518141518141518151518151518151518151518151519151519151619151619151619
-15161915161915161915161916161916161a16161a16161a16161a16171a1617
-
-14111115111115111115111115111215111215111215111215121215121215121216121216121216
-12121612121612121612131612131612131612131612131713131713131713131713131613131613
-13161314161314161314171314171314171314171414171414171414171414171414171414171415
-18141518141518141518141518141518151518151518151518151518151519151519151619151619
-15161915161915161915161916161916161916161a16161a16161a16171a1617
-
-14111115111115111115111115111115111215111215111215111215121215121216121216121216
-12121612121612121612131612131612131612131612131713131713131613131613131613131613
-13161313161314161314161314171314171314171414171414171414171414171414171414171414
-17141518141518141518141518141518141518151518151518151518151518151519151619151619
-15161915161915161915161915161916161916161a16161a16161a16161a1617
-
-14111114111115111115111115111115111215111215111215111215111215121215121216121216
-12121612121612121612121612131612131612131612131512131613131613131613131613131613
-13161313161313161314161314161314171314171314171414171414171414171414171414171414
-17141518141518141518141518141518141518151518151518151518151518151519151519151619
-15161915161915161915161915161916161916161916161a16161a16161a1616
-
-14111114111114111115111115111115111115111215111215111215111215121215121216121216
-12121612121612121612121612121612131512131512131512131613131613131613131613131613
-13161313161313161314161314161314171314171314171314171414171414171414171414171414
-17141417141518141518141518141518141518141518151518151518151518151518151519151619
-15161915161915161915161915161915161916161916161916161a16161a1616
-
-14111114111114111115111115111115111115111115111215111215111215111215121215121216
-12121612121612121512121512121512131512131512131512131512131613131613131613131613
-13161313161313161313161314161314161314171314171314171414171414171414171414171414
-17141417141417141518141518141518141518141518151518151518151518151518151519151519
-15161915161915161915161915161915161915161916161916161a16161a1616
-
-14111114111114111114111115111115111115111115111215111215111215111215121215121214
-12121512121512121512121512121512121512131512131512131512131512131613131613131613
-13161313161313161313161314161314161314171314171314171314171414171414171414171414
-17141417141417141518141518141518141518141518141518151518151518151518151518151519
-15151915161915161915161915161915161915161916161916161916161a1616
-
-14111114111114111114111115111115111115111115111115111215111215111214111214121214
-12121512121512121512121512121512121512131512131512131512131512131613131613131613
-13161313161313161313161313161314161314161314171314171314171414171414171414171414
-17141417141417141417141518141518141518141518141518141518151518151518151518151518
-15151915161915161915161915161915161915161915161916161916161a1616
-
-14111114111114111114111114111115111115111115111114111214111214111214111214121214
-12121412121512121512121512121512121512121512131512131512131512131512131613131613
-13161313161313161313161313161313161314161314161314171314171314171414171414171414
-17141417141417141417141518141518141518141518141518141518151518151518151518151518
-1515191515191516191516191516191516191516191516191616191616191616
-
-14101114111114111114111114111113111114111114111114111114111214111214111214111214
-12121412121512121512121512121512121512121512121512131512131512131512131613131613
-13161313161313161313161313161313161314161314161314171314171314171314171414171414
-17141417141417141417141417141518141518141518141518141518141518151518151518151518
-1515181515191516191516191516191516191516191516191516191616191616
-
-14101113111113111113111113111113111114111114111114111114111114111214111214111214
-11121412121412121512121512121512121512121512121512131512131512131512131512131613
-13161313161313161313161313161313161313161314161314161314171314171314171414171414
-17141417141417141417141417141417141518141518141518141518141518151518151518151518
-15151815151915151915161915161915161915161915161915161915161a1616
-
-13101113101113111113111113111113111113111114111114111114111114111214111214111214
-11121412121412121412121512121512121512121512121512121512131512131512131512131613
-13161313161313161313161313161313161313161314161314161314171314171314171314171414
-17141417141417141417141417141417141518141518141518141518141518141518151518151518
-15151815151815151915151915161915161915161915161a15161a15161a1616
-
-13101113101113111113111113111113111113111114111114111114111114111114111214111214
-11121411121412121412121512121512121512121512121512121512131512131512131512131512
-13161313161313161313161313161313161313161313161314161314161314171314171314171414
-17141417141417141417141417141417141417141518141518141518141518141518141518151518
-15151815151815151815151915161915161915161a15161a15161a15161a1516
-
-13101113101113101113111113111113111113111113111114111114111114111114111214111214
-11121411121412121412121412121512121512121512121512121512121512131512131512131512
-13151213161313161313161313161313161313161313161313161314161314161314171314171314
-17141417141417141417141417141417141417141518141518141518141518141518141518151518
-15151815151815151815151915151a15161a15161a15161a15161a15161a1516
-
-13101113101113101113101113111113111113111113111113111114111114111114111114111214
-11121411121411121412121412121512121512121512121512121512121512121512131512131512
-13151213161313161313161313161313161313161313161313161314161314161314171314171314
-17131417141417141417141417141417141417141417141518141518141518141518141518141518
-15151815151815151815151915151a15161a15161a15161a15161a15161a1516
-
-13101013101113101113101113111113111113111113111113111114111114111114111114111114
-11121411121411121411121412121412121512121512121512121512121512121512131512131512
-13151213151213161313161313161313161313161313161313161313161314161314161314171314
-17131417141417141417141417141417141417141417141417141518141518141518141518141518
-15151815151815151915151915151a15151a15161a15161a15161a15161a1516
-
-13101013101113101113101113101113111113111113111113111113111114111114111114111114
-11121411121411121411121412121412121412121512121512121512121512121512121512131512
-13151213151213161313161313161313161313161313161313161313161314161314161314171314
-17131417131417141417141417141417141417141417141417141518141518141518141518141518
-14151915151915151915151915151915151a15151a15161a15161a15161a1516
-
-12101013101013101113101113101113111113111113111113111113111114111114111114111114
-11111411121411121411121411121412121412121512121512121512121512121512121512131512
-13151213151213151213161313161313161313161313161313161313161313161314161314161314
-17131417131417141417141417141417141417141417141417141417141518141518141519141519
-14151914151915151915151915151915151915151a15161a15161a15161a1516
-
-12101013101013101013101113101113101113111113111113111113111113111114111114111114
-11111411121411121411121411121412121412121412121512121512121512121512121512121512
-13151213151213151213151213161313161313161313161313161313161313161313161314161314
-16131417131417131417141417141417141417141417141417141417141518141519141519141519
-14151914151915151915151915151915151915151a15151a15161a15161a1516
-
-12101012101013101013101113101113101113101113111113111113111113111113111114111114
-11111411111411121411121411121411121412121412121512121512121512121512121512121512
-13151213151213151213151213161313161313161313161313161313161313161313161314161314
-16131417131417131417141417141417141417141417141417141418141418141519141519141519
-14151914151914151915151915151915151915151915151a15161a15161a1516
-
-12101012101013101013101013101113101113101113111113111113111113111113111114111114
-11111411111411111411121411121411121411121412121412121512121512121512121512121512
-12151213151213151213151213151213161313161313161313161313161313161313161313161314
-16131416131417131417131417141417141417141418141418141418141418141418141519141519
-14151914151914151915151915151915151915151915151a15151a15161a1516
-
-12101012101012101013101013101113101113101113101113111113111113111113111113111114
-11111411111411111411121411121411121411121412121412121412121512121512121512121512
-12151212151213151213151213151213161313161313161313161313161313161313161313161314
-16131416131417131417131417131417141418141418141418141418141418141418141519141519
-14151914151914151914151915151915151915151915151915151a15151a1516
-
-12101012101012101012101013101013101113101113101113111113111113111113111113111114
-11111411111411111411111411121411121411121411121412121412121512121512121512121512
-12151212151213151213151213151213151213161313161313161313161313161313161313161313
-16131416131416131417131418131418141418141418141418141418141418141418141418141519
-14151914151914151914151915151915151915151915151915151915151a1516
-
-12101012101012101012101013101013101013101113101113101113111113111113111113111113
-11111411111411111411111411121411121411121411121412121412121412121512121512121512
-12151212151212151213151213151213151213151213161313161313161313161313161313161313
-16131316131417131418131418131418131418141418141418141418141418141418141418141519
-14151914151914151914151914151915151915151915151915151915151a1515
-
-12101012101012101012101012101013101013101113101113101113101113111113111113111113
-11111311111411111411111411111411121411121411121411121412121412121512121512121512
-12151212151212151213151213151213151213151213161313161313161313161313161313161313
-17131317131417131417131418131418131418141418141418141418141418141418141418141418
-1415191415191415191415191415191415191515191515191515191515191515
-
-12101012101012101012101012101013101013101013101113101113101113111113111113111113
-11111311111411111411111411111411111411121411121411121411121412121412121512121512
-12151212151212151212151213151213151213151213151213161313161313161313171313171313
-17131317131317131417131417131418131418131418141418141418141418141418141418141418
-1414181415191415191415191415191415191515191515191515191515191515
-
-12101012101012101012101012101012101013101013101113101113101113101113111113111113
-11111311111311111411111411111411111411121411121411121411121412121412121412121512
-12151212151212151212151212151213151213151213151213161313171313171313171313171313
-17131317131317131417131417131418131418131418131418141418141418141418141418141418
-1414181415191415191415191415191415191415191515191515191515191515
-
-12101012101012101012101012101012101012101013101013101113101113101113111113111113
-11111311111311111411111411111411111411111411121411121411121411121412121412121512
-12151212151212151212151212151213151213151213161213161213171313171313171313171313
-17131317131317131317131417131417131418131418131418141418141418141418141418141418
-1414181414181415191415191415191415191415191515191515191515191515
-
-12101012101012101012101012101012101012101013101013101013101113101113101113111113
-11111311111311111311111411111411111411111411121411121411121411121412121412121412
-12151212151212151212151212151212161213161213161213161213161213171313171313171313
-17131317131317131317131317131417131418131418131418131418141418141418141418141418
-1414181414181415191415191415191415191415191415191515191515191515
-
-12101012101012101012101012101012101012101012101013101013101113101113101113101113
-11111311111311111311111311111411111411111411111411121411121411121411121412121412
-12151212151212161212161212161212161213161213161213161213161213171313171313171313
-17131317131317131317131317131417131417131418131418131418141418141418141418141418
-1414181414181414181415191415191415191415191415191415191515191515
-
-120f1012101012101012101012101012101012101012101013101013101013101113101113101113
-11111311111311111311111311111411111411111411111411111411121411121411121411121412
-12151212161212161212161212161212161212161213161213161213161213161213171313171313
-17131317131317131317131317131317131417131417131418131418131418141418141418141418
-1414181414181414181414191415191415191415191415191415191515191515
-
-120f10120f1012101012101012101012101012101012101012101013101013101113101113101113
-10111311111311111311111311111311111411111411111411111411121411121511121511121512
-12151212151212161212161212161212161212161212161213161213161213161213171313171313
-17131317131317131317131317131317131417131417131418131418131418131418141418141418
-1414181414181414181414181415191415191415191415191415191415191515
-
-120f10120f1012101012101012101012101012101012101012101012101013101013101113101113
-10111311111311111311111311111311111411111411111512121512121512131512131512131512
-13151313151313161313161313161313161313161313161314161314161314161314161314171414
-17141417141417141417141417141417141417141517141517141518141518141518151518151518
-1515181515181515181515181515181516191516191516191516191516191616
-
-120f10120f10120f1012101012101012101012101012101012101012101013101013101013101113
-10111310111311111311111311111312121412121512121512121512121512131512131512131512
-13151313151313151313161313161313161313161313161313161314161314161314161314161314
-17141417141417141417141417141417141417141417141517141518141518141518141518151518
-1515181515181515181515181515181516191516191516191516191516191516
-
-110f0f120f10120f1012101012101012101012101012101012101012101012101013101013101113
-10111310111310111412121412121412121412121412121512121512121512121512131512131512
-13151213151313151313161313161313161313161313161313161314161314161314161314161314
-17141417141417141417141417141417141417141417141517141517141518141518141518151518
-1515181515181515181515181515181515181516191516191516191516191516
-
-Q
-Q
-Q
-Q
-q
-q
-n
-274 72 m
-338 72 l
-338 8.00001 l
-274 8.00001 l
-274 72 l
-h
-W
-q
-q
-[64 0 0 64 274 8.00001]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-1d18181d18181c18181c18181c18191c18191c18191d18191d18191d18191d18191d18191d19191d
-19191d19191d191a1d191a1e191a1e191a1e191a1e191a1e191a1e191a1e191a1e1a1a1e1a1a1e1a
-1a1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b201b1b201b1b211b1b211b1c
-211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221b1c221c1c221c1c221c1d221c1d22
-1c1d221c1d221c1d231c1d231c1d231d1e231d1e231d1e231e1e231e1f231e1f
-
-1d18181c18181c18181c18181c18181c18191c18191c18191d18191d18191d18191d18191d18191d
-19191d19191d19191d191a1e191a1e191a1e191a1e191a1e191a1e191a1e191a1e191a1e1a1a1e1a
-1a1f1a1a1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b211b1b211b1b211b1c
-211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221c1c221c1c221c1d221c1d22
-1c1d221c1d221c1d221c1d231c1d231d1e231d1e231d1e231e1e231e1e231e1f
-
-1c17181c18181c18181c18181c18181c18191c18191c18191d18191d18191d18191d18191d18191d
-19191d19191d19191d19191d191a1e191a1e191a1e191a1e191a1e191a1e191a1e191a1e1a1a1e1a
-1a1e1a1a1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b201a1b201a1b211b1b211b1b
-211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221b1c221c1c221c1c221c1d22
-1c1d221c1d221c1d221c1d231c1d231d1e231d1e231d1e231d1e231e1e231e1f
-
-1c17181c17181c18181c18181c18181c18181c18191c18191c18191d18191d18191d18191d18191d
-18191d19191d19191d19191d191a1d191a1e191a1e191a1e191a1e191a1e191a1e191a1e191a1e1a
-1a1e1a1a1f1a1a1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b201a1b201a1b201a1b211b1b211b1b
-211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221c1c221c1c221c1d22
-1c1d221c1d221c1d221c1d221c1d231d1e231d1e231d1e231d1e231d1e231e1e
-
-1c17181c17181c18181c18181c18181c18181c18191c18191c18191d18191d18191d18191d18191d
-18191d19191d19191d19191d19191d191a1e191a1e191a1e191a1e191a1e191a1e191a1e191a1e19
-1a1e1a1a1e1a1a1f1a1a1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b201a1b201a1b201a1b201a1b211b1b
-211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221c1c221c1c22
-1c1d221c1d221c1d221c1d221c1d231d1e231d1e231d1e231d1e231d1e231e1e
-
-1c17181c17181c17181c18181c18181c18181c18181c18191c18191c18191d18191d18191d18191d
-18191d18191d19191d19191d19191d191a1d191a1e191a1e191a1e191a1e191a1e191a1e191a1e19
-1a1e1a1a1e1a1a1e1a1a1f1a1b1f1a1b1f1a1b1f1a1b201a1b201a1b201a1b201a1b201a1b211b1b
-211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221b1c221c1c22
-1c1c221c1d221c1d221c1d221c1d221d1e231d1e231d1e231d1e231d1e231d1e
-
-1b17181c17181c17181c18181c18181c18181c18181c18181c18191c18191c18191d18191d18191d
-18191d18191d18191d19191d19191d19191d191a1e191a1e191a1e191a1e191a1e191a1e191a1e19
-1a1e191a1e1a1a1e1a1a1f1a1a1f1a1b1f1a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b
-211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221c1c22
-1c1c221c1d221c1d221c1d221c1d221d1e221d1e231d1e231d1e231d1e231d1e
-
-1b17181c17181c17181c17181c18181c18181c18181c18181c18191c18191c18191d18191d18191d
-18191d18191d18191d19191d19191d19191d19191d191a1e191a1e191a1e191a1e191a1e191a1e19
-1a1e191a1e1a1a1e1a1a1e1a1a1f1a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b
-201a1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221b1c22
-1c1c221c1c221c1d221c1d221c1d221d1e221d1e231d1e231d1e231d1e231d1e
-
-1b17181b17181c17181c17181c17181c18181c18181c18181c18181c18191c18191c18191d18191d
-18191d18191d18191d18191d19191d19191d19191d191a1d191a1e191a1e191a1e191a1e191a1e19
-1a1e191a1e191a1e1a1a1e1a1a201a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b
-201a1b211b1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c22
-1c1c221c1c221c1d221c1d221c1d221d1e221d1e221d1e231d1e231d1e231d1e
-
-1b17181b17181b17181c17181c17181c18181c18181c18181c18181c18191c18191c18191d18191d
-18191d18191d18191d18191d19191d19191d19191d19191d191a1e191a1e191a1e191a1e191a1e19
-1a1e191a1e191a1e191a1e1a1a1f1a1a201a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b
-201a1b201a1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c22
-1b1c221c1c221c1c221c1d221c1d221d1e221d1e221d1e231d1e231d1e231d1e
-
-1b17181b17181b17181c17181c17181c17181c18181c18181c18181c18181c18191c18191c18191d
-18191d18191d18191d18191d18191d19191d19191d19191d191a1d191a1e191a1e191a1e191a1e19
-1a1e191a1e191a1e191a1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b
-201a1b201a1b211b1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c22
-1b1c221b1c221c1c221c1c221c1d221d1e221d1e221d1e221d1e231d1e231d1e
-
-1b17181b17181b17181b17181c17181c17181c18181c18181c18181c18181c18181c18191c18191c
-18191d18191d18191d18191d18191d18191d19191d19191d19191d191a1e191a1e191a1e191a1e19
-1a1e191a1e191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b201a1b201a1b201a1b201a1b201a1b
-201a1b201a1b201a1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c211b1c22
-1b1c221b1c221c1c221c1c221c1d221d1e221d1e221d1e221d1e221d1e231d1e
-
-1b17181b17181b17181b17181c17181c17181c17181c18181c18181c18181c18181c18191c18191c
-18191d18191d18191d18191d18191d18191d19191d19191d19191d19191d191a1e191a1e191a1e19
-1a1e191a1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b
-201a1b201a1b201a1b201a1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c22
-1b1c221b1c221b1c221c1c221c1c221d1e221d1e221d1e221d1e221d1e231d1e
-
-1b17181b17181b17181b17181b17181c17181c17181c17181c18181c18181c18181c18181c18191c
-18191c18191d18191d18191d18191d18191d18191d19191d19191d19191d191a1d191a1e191a1e19
-1a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b201a1b201a1b201a1b201a1b
-201a1b201a1b201a1b201a1b211b1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c21
-1b1c221b1c221b1c221c1c221c1c221d1e221d1e221d1e221d1e221d1e221d1e
-
-1b17171b17181b17181b17181b17181b17181c17181c17181c18181c18181c18181c18181c18191c
-18191c18191d18191d18191d18191d18191d18191d19191d19191d19191d19191d191a1e191a1f19
-1a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b201a1b201a1b201a1b
-201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c21
-1b1c211b1c221b1c221b1c221c1c221d1d221d1e221d1e221d1e221d1e221d1e
-
-1b17171b17181b17181b17181b17181b17181c17181c17181c17181c18181c18181c18181c18181c
-18191c18191c18191d18191d18191d18191d18191d18191d19191d19191d19191d191a1e191a1f19
-1a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b201a1b
-201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c21
-1b1c211b1c221b1c221b1c221b1c221d1d221d1d221d1e221d1e221d1e221d1e
-
-1b17171b17171b17181b17181b17181b17181b17181c17181c17181c18181c18181c18181c18181c
-18191c18191c18191c18191d18191d18191d18191d18191d18191d19191d19191d19191e191a1f19
-1a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b201a1b201a1b
-201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c21
-1b1c211b1c211b1c221b1c221b1c221d1d221d1d221d1e221d1e221d1e221d1e
-
-1b17171b17171b17181b17181b17181b17181b17181c17181c17181c17181c18181c18181c18181c
-18181c18191c18191c18191d18191d18191d18191d18191d18191d19191d19191e19191e19191e19
-1a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b
-201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1c211b1c211b1c211b1c21
-1b1c211b1c211b1c221b1c221b1c221c1d221d1d221d1d221d1e221d1e221d1e
-
-1b17171b17171b17171b17181b17181b17181b17181b17181c17181c17181c17181c18181c18181c
-18181c18181c18191c18191c18191d18191d18191d18191d18191d18191e19191e19191e19191e19
-1a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b201a1b
-201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1b211b1c211b1c211b1c21
-1b1c211b1c211b1c211b1c221b1c221c1d221d1d221d1d221d1e221d1e221d1e
-
-1b17171b17171b17171b17171b17181b17181b17181b17181b17181c17181c17181c18181c18181c
-18181c18181c18191c18191c18191d18191d18191d18191d18191e18191e19191e19191e19191e19
-191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b
-201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1c211b1c211b1c21
-1b1c211b1c211b1c211b1c211b1c221c1d221c1d221d1d221d1d221d1e221d1e
-
-1b17171b17171b17171b17171b17181b17181b17181b17181b17181c17181c17181c17181c18181c
-18181c18181c18181c18191c18191c18191d18191d18191e18191e18191e18191e19191e19191e19
-191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b
-201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1b211b1c211b1c21
-1b1c211b1c211b1c211b1c211b1c221c1d221c1d221c1d221d1d221d1d221d1e
-
-1b17171b17171b17171b17171b17171b17181b17181b17181b17181b17181c17181c17181c18181c
-18181c18181c18181c18191c18191c18191c18191e18191e18191e18191e18191e18191e19191e19
-191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a
-201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1c211b1c21
-1b1c211b1c211b1c211b1c211b1c211c1d221c1d221c1d221d1d221d1d221d1e
-
-1a16171b17171b17171b17171b17171b17181b17181b17181b17181b17181c17181c17181c17181c
-18181c18181c18181c18181c18191c18191d18191e18191e18191e18191e18191e18191e19191e19
-191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a
-201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1c21
-1b1c211b1c211b1c211b1c211b1c211c1d221c1d221c1d221c1d221d1d221d1d
-
-1a16171b17171b17171b17171b17171b17171b17181b17181b17181b17181b17181c17181c17181c
-17181c18181c18181c18181c18181d18191d18191d18191e18191e18191e18191e18191e18191e19
-191e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a
-201a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1b21
-1b1c211b1c211b1c211b1c211b1c211c1d211c1d221c1d221c1d221d1d221d1d
-
-1a16171a16171b17171b17171b17171b17171b17171b17181b17181b17181b17181b17181c17181c
-17181c18181c18181c18181d18181d18191d18191d18191e18191e18191e18191e18191e18191e19
-191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a
-1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b21
-1b1c211b1c211b1c211b1c211b1c211c1d211c1d211c1d221c1d221c1d221d1d
-
-1a16171a16171a17171b17171b17171b17171b17171b17181b17181b17181b17181b17181c17181c
-17181c17181c18181d18181d18181d18181d18191d18191d18191e18191e18191e18191e18191e18
-191e19191e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a
-1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b21
-1b1b211b1c211b1c211b1c211b1c211c1d211c1d211c1d221c1d221c1d221c1d
-
-1a16171a16171a16171b17171b17171b17171b17171b17171b17181b17181b17181b17181b17181c
-17181c17181d18181d18181d18181d18181d18191d18191d18191d18191e18191e18191e18191e18
-191e18191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a
-1f1a1a1f1a1a201a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b21
-1b1b211b1c211b1c211b1c211b1c211c1d211c1d211c1d211c1d221c1d221c1d
-
-1a16171a16171a16171a16171b17171b17171b17171b17171b17181b17181b17181b17181b17181c
-17181d17181d17181d18181d18181d18181d18181d18191d18191d18191e18191e18191e18191e18
-191e18191e19191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a
-1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b21
-1b1b211b1b211b1c211b1c211b1c211c1d211c1d211c1d211c1d221c1d221c1d
-
-1a16171a16171a16171a16171b17171b17171b17171b17171b17171b17181b17181b17181c17181c
-17181d17181d17181d17181d18181d18181d18181d18181d18191d18191d18191e18191e18191e18
-191e18191e18191e19191e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a
-1f191a1f1a1a1f1a1a201a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b21
-1b1b211b1b211b1b211b1c211b1c211c1d211c1d211c1d211c1d211c1d221c1d
-
-1a16171a16171a16171a16171a16171b17171b17171b17171b17171b17171b17181c17181c17181c
-17181c17181d17181d17181d18181d18181d18181d18181d18191d18191d18191e18191e18191e18
-191e18191e18191e19191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a
-1f191a1f191a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b20
-1a1b211b1b211b1b211b1c211b1c211c1d211c1d211c1d211c1d211c1d211c1d
-
-1a16171a16171a16171a16171a16171a17171b17171b17171b17171b17171c17181c17181c17181c
-17181c17181d17181d17181d17181d18181d18181d18181d18181d18191d18191d18191e18191e18
-191e18191e18191e18191e19191e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a
-1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b20
-1a1b211b1b211b1b211b1b211b1c211c1d211c1d211c1d211c1d211c1d211c1d
-
-1a16171a16171a16171a16171a16171a16171b17171b17171b17171c17171c17171c17181c17181c
-17181c17181c17181d17181d17181d18181d18181d18181d18181d18191d18191d18191d18191e18
-191e18191e18191e18191e18191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a
-1f191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b20
-1a1b201a1b211b1b211b1b211b1c211c1d211c1d211c1d211c1d211c1d211c1d
-
-1a16171a16171a16171a16171a16171a16171a16171b17171c17171c17171c17171c17181c17181c
-17181c17181c17181d17181d17181d17181d18181d18181d18181d18181d18191d18191d18191e18
-191e18191e18191e18191e18191e19191e19191e19191e19191e191a1f191a1f191a1f191a1f191a
-1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b20
-1a1b201a1b201a1b211b1b211b1b211c1d211c1d211c1d211c1d211c1d211c1d
-
-1a16171a16171a16171a16171a16171a16171a16171c17171c17171c17171c17171c17171c17181c
-17181c17181c17181c17181d17181d17181d17181d18181d18181d18181d18181d18191d18191d18
-191e18191e18191e18191e18191e18191e19191e19191e19191e191a1e191a1f191a1f191a1f191a
-1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b201a1b201a1b201a1b201a1b201a1b20
-1a1b201a1b201a1b211b1b211b1b211c1c211c1d211c1d211c1d211c1d211c1d
-
-1a16161a16171a16171a16171a16171b16171b16171b16171c17171c17171c17171c17171c17171c
-17181c17181c17181c17181c17181d17181d17181d18181d18181d18181d18181d18191d18191d18
-191e18191e18191e18191e18191e18191e19191e19191e19191e19191e191a1f191a1f191a1f191a
-1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b20
-1a1b201a1b201a1b201a1b211b1b211c1c211c1d211c1d211c1d211c1d211c1d
-
-1a16161a16171a16171a16171b16171b16171b16171b16171b17171c17171c17171c17171c17171c
-17181c17181c17181c17181c17181d17181d17181d17181d18181d18181d18181d18181d18191d18
-191d18191e18191e18191e18191e18191e18191e19191e19191e19191e191a1e191a1f191a1f191a
-1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b20
-1a1b201a1b201a1b201a1b211b1b211c1c211c1c211c1d211c1d211c1d211c1d
-
-1a16161a16161a16171b16171b16171b16171b16171b16171b16171c17171c17171c17171c17171c
-17171c17181c17181c17181c17181c17181d17181d17181d18181d18181d18181d18181d18191d18
-191d18191d18191e18191e18191e18191e18191e18191e19191e19191e19191e191a1f191a1f191a
-1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b201a1b201a1b201a1b20
-1a1b201a1b201a1b201a1b201a1b211c1c211c1c211c1d211c1d211c1d211c1d
-
-1a16161a16161b16161b16171b16171b16171b16171b16171b16171b16171c17171c17171c17171c
-17171c17181c17181c17181c17181c17181d17181d17181d17181d18181d18181d18181d18181d18
-191d18191d18191e18191e18191e18191e18191e18191e19191e19191e19191e19191e191a1f191a
-1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b201a1b20
-1a1b201a1b201a1b201a1b201a1b201b1c211c1c211c1c211c1d211c1d211c1d
-
-1a16161b16161b16161b16171b16171b16171b16171b16171b16171b16171c17171c17171c17171c
-17171c17171c17181c17181c17181c17181c17181d17181d17181d17181d18181d18181d18181d18
-181d18191d18191d18191e18191e18191e18191e18191e18191e19191e19191e19191e191a1e191a
-1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b201a1b201a1b20
-1a1b201a1b201a1b201a1b201a1b201b1c211c1c211c1c211c1c211c1d211c1d
-
-1a16161b16161b16161b16161b16171b16171b16171b16171b16171b16171b16171c17171c17171c
-17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d18181d18181d18181d18
-181d18191d18191d18191e18191e18191e18191e18191e18191e19191e19191e19191e19191e191a
-1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1b201a1b201a1b20
-1a1b201a1b201a1b201a1b201a1b201b1c201b1c211c1c211c1c211c1d211c1d
-
-1a16161a16161b16161b16161b16171b16171b16171b16171b16171b16171b16171b17171c17171c
-17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d17181d18181d18181d18
-181d18181d18191d18191d18191e18191e18191e18191e18191e18191e19191e19191e19191e191a
-1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b201a1b20
-1a1b201a1b201a1b201a1b201a1b201b1c201b1c211c1c211c1c211c1c211c1d
-
-1a16161a16161b16161b16161b16161b16171b16171b16171b16171b16171b16171b16171c17171c
-17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d18181d18181d18
-181d18181d18191d18191d18191d18191e18191e18191e18191e18191e18191e19191e19191e1919
-1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b20
-1a1b201a1b201a1b201a1b201a1b201b1c201b1c201b1c211c1c211c1c211c1d
-
-1a16161a16161a16161b16161b16161b16161b16171b16171b16171b16171b16171b16171b16171c
-17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d17181d18181d18
-181d18181d18181d18191d18191d18191e18191e18191e18191e18191e18191e19191e19191e1919
-1e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b20
-1a1b201a1b201a1b201a1b201a1b201b1c201b1c201b1c201b1c211c1c211c1c
-
-1a15161a16161a16161a16161b16161b16161b16171b16171b16171b16171b16171b16171b16171c
-17171c17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d17181d18
-181d18181d18181d18181d18191d18191d18191e18191e18191e18191e18191e18191e19191e1919
-1e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a20
-1a1b201a1b201a1b201a1b201a1b201b1c201b1c201b1c201b1c211c1c211c1c
-
-1a15161a15161a16161a16161b16161b16161b16161b16171b16171b16171b16171b16171b16171b
-16171c17171c17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d18
-181d18181d18181d18181d18191d18191d18191e18191e18191e18191e18191e18191e19191e1919
-1e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a20
-1a1b201a1b201a1b201a1b201a1b201b1c201b1c201b1c201b1c201b1c211c1c
-
-1a15161a15161a16161a16161a16161b16161b16161b16171b16171b16171b16171b16171b16171b
-16171b17171c17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d17
-181d18181d18181d18181d18181d18191d18191d18191e18191e18191e18191e18191e18191e1919
-1e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f
-1a1a201a1b201a1b201a1b201a1b201b1c201b1c201b1c201b1c201b1c211c1c
-
-1a15161a15161a15161a16161a16161b16161b16161b16161b16171b16171b16171b16171b16171b
-16171b16171c17171c17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d17
-181d18181d18181d18181d18181d18191d18191d18191d18191e18191e18191e18191e18191e1819
-1e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f
-1a1a201a1a201a1b201a1b201a1b201b1c201b1c201b1c201b1c201b1c201b1c
-
-1a15161a15161a15161a16161a16161a16161b16161b16161b16161b16171b16171b16171b16171b
-16171b16171b16171c17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d17
-181d17181d18181d18181d18181d18181d18191d18191d18191e18191e18191e18191e18191e1819
-1e19191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f
-1a1a1f1a1a201a1b201a1b201a1b201b1c201b1c201b1c201b1c201b1c201b1c
-
-1a15161a15161a15161a15161a16161a16161a16161b16161b16161b16171b16171b16171b16171b
-16171b16171b16171c17171c17171c17171c17171c17171c17181c17181c17181c17181c17181d17
-181d17181d17181d18181d18181d18181d18181d18191d18191d18191e18191e18191e18191e1819
-1e18191e19191e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f
-1a1a1f1a1a201a1a201a1b201a1b201b1c201b1c201b1c201b1c201b1c201b1c
-
-1a15161a15161a15161a15161a15161a16161a16161b16161b16161b16161b16171b16171b16171b
-16171b16171b16171b16171c17171c17171c17171c17171c17171c17181c17181c17181c17181c17
-181d17181d17181d18181d18181d18181d18181d18191d18191d18191e18191e18191e18191e1819
-1e18191e19191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f
-191a1f1a1a1f1a1a201a1b201a1b201b1c201b1c201b1c201b1c201b1c201b1c
-
-1a15161a15161a15161a15161a15161a16161a16161a16161b16161b16161b16171b16171b16171b
-16171b16171b16171b16171b17171c17171c17171c17171c17171c17181c17181c17181c17181c17
-181d17181d17181d17181d18181d18181d18181d18181d18191d18191d18191e18191e18191e1819
-1e18191e18191e19191e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f
-191a1f1a1a1f1a1a1f1a1a201a1b201b1c201b1c201b1c201b1c201b1c201b1c
-
-1a15161a15161a15161a15161a15161a15161a16161a16161b16161b16161b16161b16171b16171b
-16171b16171b16171b16171b16171c17171c17171c17171c17171c17171c17181c17181c17181c17
-181c17181d17181d17181d18181d18181d18181d18181d18191d18191d18191d18191e18191e1819
-1e18191e18191e18191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f
-191a1f191a1f1a1a1f1a1a201a1a201b1c201b1c201b1c201b1c201b1c201b1c
-
-1a15161a15161a15161a15161a15161a15161a16161a16161a16161b16161b16161b16161b16171b
-16171b16171b16171b16171b16171b16171c17171c17171c17171c17171c17181c17181c17181c17
-181c17181d17181d17181d17181d18181d18181d18181d18181d18191d18191d18191e18191e1819
-1e18191e18191e18191e19191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f
-191a1f191a1f1a1a1f1a1a1f1a1a201b1c201b1c201b1c201b1c201b1c201b1c
-
-1a15161a15161a15161a15161a15161a15161a15161a16161a16161a16161b16161b16161b16171b
-16171b16171b16171b16171b16171b16171c17171c17171c17171c17171c17171c17181c17181c17
-181c17181c17181d17181d17181d17181d18181d18181d18181d18181d18191d18191d18191e1819
-1e18191e18191e18191e18191e19191e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f
-191a1f191a1f191a1f1a1a1f1a1a201b1b201b1c201b1c201b1c201b1c201b1c
-
-1a15151a15161a15161a15161a15161a15161a15161a16161a16161a16161b16161b16161b16161b
-16171b16171b16171b16171b16171b16171b16171c17171c17171c17171c17171c17181c17181c17
-181c17181c17181c17181d17181d17181d18181d18181d18181d18181d18191d18191d18191e1819
-1e18191e18191e18191e18191e19191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f
-191a1f191a1f191a1f191a1f1a1a1f1b1b201b1c201b1c201b1c201b1c201b1c
-
-1915151a15151a15161a15161a15161a15161a15161a15161a16161a16161a16161b16161b16161b
-16171b16171b16171b16171b16171b16171b16171b17171c17171c17171c17171c17171c17181c17
-181c17181c17181c17181d17181d17181d17181d18181d18181d18181d18181d18191d18191d1819
-1e18191e18191e18191e18191e18191e19191e19191e19191e191a1e191a1f191a1f191a1f191a1f
-191a1f191a1f191a1f191a1f1a1a1f1b1b1f1b1b201b1c201b1c201b1c201b1c
-
-1915151915151a15161a15161a15161a15161a15161a15161a15161a16161a16161b16161b16161b
-16161b16171b16171b16171b16171b16171b16171b16171c17171c17171c17171c17171c17171c17
-181c17181c17181c17181c17181d17181d17181d18181d18181d18181d18181d18191d18191d1819
-1d18191e18191e18191e18191e18191e18191e19191e19191e19191e191a1f191a1f191a1f191a1f
-191a1f191a1f191a1f191a1f191a1f1b1b1f1b1b201b1b201b1c201b1c201b1c
-
-1915151915151a15151a15161a15161a15161a15161a15161a15161a16161a16161a16161b16161b
-16161b16161b16171b16171b16171b16171b16171b16171b17171c17171c17171c17171c17171c17
-181c17181c17181c17181c17181d17181d17181d17181d18181d18181d18181d18181d18191d1819
-1d18191e18191e18191e18191e18191e18191e19191e19191e19191e19191e191a1f191a1f191a1f
-191a1f191a1f191a1f191a1f191a1f1b1b1f1b1b1f1b1b201b1c201b1c201b1c
-
-1915151915151915151a15161a15161a15161a15161a15161a15161a15161a16161a16161a16161b
-16161b16161b16171b16171b16171b16171b16171b16171b16171c17171c17171c17171c17171c17
-171c17181c17181c17181c17181c17181d17181d17181d17181d18181d18181d18181d18181d1819
-1d18191d18191e18191e18191e18191e18191e18191e19191e19191e19191e191a1e191a1f191a1f
-191a1f191a1f191a1f191a1f191a1f1a1b1f1b1b1f1b1b201b1b201b1c201b1c
-
-1915151915151915151a15151a15161a15161a15161a15161a15161a15161a16161a16161a16161b
-16161b16161b16161b16171b16171b16171b16171b16171b16171b16171c17171c17171c17171c17
-171c17181c17181c17181c17181c17181c17181d17181d17181d18181d18181d18181d18181d1819
-1d18191d18191e18191e18191e18191e18191e18191e19191e19191e19191e19191e191a1f191a1f
-191a1f191a1f191a1f191a1f191a1f1a1b1f1a1b1f1b1b1f1b1b201b1c201b1c
-
-1915151915151915151915151a15151a15161a15161a15161a15161a15161a15161a16161a16161a
-16161b16161b16161b16171b16171b16171b16171b16171b16171b16171b17171c17171c17171c17
-171c17171c17181c17181c17181c17181c17181d17181d17181d17181d18181d18181d18181d1818
-1d18191d18191d18191e18191e18191e18191e18191e18191e19191e19191e19191e191a1e191a1f
-191a1f191a1f191a1f191a1f191a1f1a1b1f1a1b1f1b1b1f1b1b1f1b1b201b1c
-
-1916161916161916161916161916161a16171a16171a16171a16171a16171a16171a16171a17171a
-17171b17171b17171b17171b17181b17181b17181b17181b17181b17181b17181c18181c18181c18
-181c18181c18181c18191c18191c18191c18191c18191d18191d18191d19191d19191d19191d1919
-1d191a1d191a1d191a1d191a1e191a1e191a1e191a1e191a1e191a1e1a1a1e1a1a1e1a1a1e1a1b1f
-1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1b1b1f1b1b201b1b
-
-1916161916161916161916161916161a16161a16171a16171a16171a16171a16171a16171a17171a
-17171a17171b17171b17171b17171b17181b17181b17181b17181b17181b17181b18181c18181c18
-181c18181c18181c18191c18191c18191c18191c18191d18191d18191d18191d19191d19191d1919
-1d19191d191a1d191a1d191a1e191a1e191a1e191a1e191a1e191a1e1a1a1e1a1a1e1a1a1e1a1b1e
-1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1b1b1f1b1b1f1b1b
-
-1915161916161916161916161916161916161a16171a16171a16171a16171a16171a16171a16171a
-17171a17171a17171b17171b17171b17181b17181b17181b17181b17181b17181b17181c18181c18
-181c18181c18181c18181c18191c18191c18191c18191c18191d18191d18191d18191d19191d1919
-1d19191d19191d191a1d191a1d191a1e191a1e191a1e191a1e191a1e191a1e1a1a1e1a1a1e1a1a1e
-1a1b1e1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1b1b1f1b1b
-
-Q
-Q
-Q
-Q
-q
-q
-n
-146 136 m
-210 136 l
-210 72 l
-146 72 l
-146 136 l
-h
-W
-q
-q
-[64 0 0 64 146 72]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-14111114111114111114111114121114121114121114121114121115121115121115121115121215
-12121512121512121513121513121613121613121613121613121613121613121613131613131613
-13161313171413171413171413171413171413171413171413171414171414171414181414181414
-18141418151418151418151418151418151418151418151519151519151519151519151519151519
-16151916151916151916151916151a16161a16161a16161a16161a16161a1616
-
-14111014111114111114111114121114121114121114121114121115121115121115121115121115
-12121512121512121512121513121513121613121613121613121613121613121613131613131613
-13161313161313171413171413171413171413171413171413171413171414171414171414181414
-18141418151418151418151418151418151418151418151418151519151519151519151519151519
-16151916151916151916151916151a16151a16161a16161a16161a16161a1616
-
-14111014111114111114111114111114121114121114121114121114121115121115121115121115
-12121512121512121512121513121513121513121613121613121613121613121613121613131613
-13161313161313171413171413171413171413171413171413171413171414171414171414181414
-18141418141418151418151418151418151418151418151418151519151519151519151519151519
-15151916151916151916151916151916151a16151a16161a16161a16161a1616
-
-13111014111014111114111114111114121114121114121114121114121115121115121115121115
-12111512121512121512121512121513121513121613121613121613121613121613121613131613
-13161313161313161313171413171413171413171413171413171413171413171414171414171414
-18141418141418151418151418151418151418151418151418151418151519151519151519151519
-15151915151916151916151916151916151916151a16161a16161a16161a1616
-
-13111014111014111014111114111114111114121114121114121114121114121115121115121115
-12111512121512121512121512121513121513121513121613121613121613121613121613121613
-13161313161313161313161313171413171413171413171413171413171413171413171414171414
-17141418141418141418151418151418151418151418151418151418151519151519151519151519
-15151915151916151916151916151916151916151a16151a16161a16161a1616
-
-13111013111014111014111114111114111114111114121114121114121114121114121115121115
-12111512111512121512121512121512121513121513121613121613121613121613121613121613
-13161313161313161313161313171413171413171413171413171413171413171413171414171414
-17141418141418141418151418151418151418151418151418151418151418151519151519151519
-15151915151915151916151916151916151916151916151a16161a16161a1616
-
-13111013111014111014111014111114111114111114121114121114121114121114121115121115
-12111512111512111512121512121512121512121513121513121613121613121613121613121613
-12161313161313161313161313161313171413171413171413171413171413171413171413171414
-17141417141418141418141418151418151418151418151418151418151418151418151519151519
-15151915151915151916151916151916151916151916151a16151a16161a1616
-
-13111013111013111014111014111114111114111114111114121114121114121114121114121115
-12111512111512111512121512121512121512121513121513121513121613121613121613121613
-12161312161313161313161313161313171413171413171413171413171413171413171413171414
-17141417141418141418141418141418151418151418151418151418151418151418151519151519
-15151915151915151915151916151916151916151916151916151a16151a1616
-
-13111013111013111013111014111014111114111114111114121114121114121114121114121115
-12111512111512111512111512121512121512121512121513121513121613121613121613121613
-12161312161313161313161313161313161313171413171413171413171413171413171413171413
-17141417141417141418141418141418151418151418151418151418151418151418151418151519
-15151915151915151915151916151916151916151916151916151916151a1616
-
-13111013111013111013111014111014111014111114111114111114121114121114121114121114
-12111512111512111512111512121512121512121512121513121513121513121613121613121613
-12161312161312161313161313161313161313161313171413171413171413171413171413171413
-17141317141417141418141418141418141418151418151418151418151418151418151418151519
-15151915151915151915151915151916151916151916151916151916151a1615
-
-13111013111013111013111013111014111014111114111114111114111114121114121114121114
-12111412111512111512111512111512121512121512121512121513121513121613121613121613
-12161312161312161313161313161313161313161313171413171413171413171413171413171413
-17141317141417141417141418141418141418151418151418151418151418151418151418151418
-1515191515191515191515191515191515191615191615191615191615191615
-
-13111013111013111013111013111014111014111014111114111114111114121114121114121114
-12111412111512111512111512111512111512121512121512121512121513121513121613121613
-12161312161312161312161313161313161313161313161313171413171413171413171413171413
-17141317141317141417141417141418141418141418151418151418151418151418151418151418
-1514181515191515191515191515191515191615191615191615191615191615
-
-13111013111013111013111013111013111014111014111114111114111114111114121114121114
-12111412111412111512111512111512111512121512121512121512121513121513121513121613
-12161312161312161312161312161313161313161313161313171413171413171413171413171413
-17141317141317141417141417141418141418141418141418151418151418151418151418151418
-1514181515191515191515191515191515191515191615191615191615191615
-
-13111013111013111013111013111013111013111014111014111114111114111114121114121114
-12111412111412111512111512111512111512111512121512121512121512121513121513121613
-12161312161312161312161312161313161313161313161313161313171413171413171413171413
-17141317141317141317141417141417141418141418141418151418151418151418151418151418
-1514181514181515191515191515191515191515191615191615191615191615
-
-13111013111013111013111013111013111013111014111014111014111114111114111114121114
-12111412111412111412111512111512111512111512121512121512121512121513121513121513
-12161312161312161312161312161312161313161313161313161313161313171413171413171413
-17141317141317141317141317141417141418141418141418141418151418151418151418151418
-1514181514181515191515191515191515191515191515191615191615191615
-
-13111013111013111013111013111013111013111013111014111014111114111114111114111114
-12111412111412111412111412111512111512111512111512121512121512121512121513121513
-12161312161312161312161312161312161313161313161313161313161313171413171413171413
-17141317141317141317141317141417141417141418141418141418151418151418151418151418
-1514181514181514181515191515191515191515191515191515191615191615
-
-13101013111013111013111013111013111013111013111014111014111014111114111114111114
-12111412111412111412111412111512111512111512111512111512121512121512121512121513
-12151312161312161312161312161312161312161313161313161313161313161313171413171413
-17141317141317141317141317141317141417141417141418141418141418151418151418151418
-1514181514181514181514191515191515191515191515191515191615191615
-
-13101013101013111013111013111013111013111013111013111014111014111114111114111114
-11111412111412111412111412111412111512111512111512111512121512121512121512121513
-12151312151312161312161312161312161312161312161313161313161313161313171413171413
-17141317141317141317141317141317141417141417141418141418141418141418151418151418
-1514181514181514181514181515191515191515191515191515191515191615
-
-13101013101013111013111013111013111013111013111013111013111014111014111114111114
-11111412111412111412111412111412111512111512111512111512111512121512121512121512
-12151312151312161312161312161312161312161312161313161313161313161313161313171413
-17141317141317141317141317141317141317141417141417141418141418141418151418151418
-1514181514181514181514181514181515191515191515191515191515191615
-
-13101013101013101013111013111013111013111013111013111013111014111014111014111114
-11111411111412111412111412111412111412111512111512111512111512121512121512121512
-12151312151312151312161312161312161312161312161312161313161313161313161313161313
-17141317141317141317141317141317141317141317141417141418141418141418141418151418
-1514181514181514181514181514181515191515191515191515191515191515
-
-12100f13101013101013111013111013111013111013111013111013111013111014111014111114
-11111411111411111412111412111412111412111412111512111512111512111512121512121512
-12151212151312151312161312161312161312161312161312161313161313161313161313161313
-17141317141317141317141317141317141317141317141417141417141418141418141418151418
-1514181514181514181514181514181514181515191515191515191515191515
-
-12100f12101013101013101013111013111013111013111013111013111013111014111014111014
-11111411111411111412111412111412111412111412111512111512111512111512111512121512
-12151212151212151312151312161312161312161312161312161312161313161313161313161313
-16131317141317141317141317141317141317141317141317141417141417141418141418141418
-1514181514181514181514181514181514181514191515191515191515191515
-
-12100f12100f13101013101013101013111013111013111013111013111013111013111014111014
-11111411111411111411111412111412111412111412111412111512111512111512111512121512
-12151212151212151312151312151312161312161312161312161312161312161313161313161313
-16131317141317141317141317141317141317141317141317141417141417141418141418141418
-1414181514181514181514181514181514181514181515191515191515191515
-
-12100f12100f12101013101013101013111013111013111013111013111013111013111013111014
-11101411111411111411111412111412111412111412111412111512111512111512111512111512
-12151212151212151212151312151312161312161312161312161312161312161313161313161313
-16131316131317141317141317141317141317141317141317141317141417141417141418141418
-1414181514181514181514181514181514181514181514181515191515191515
-
-12100f12100f12100f13101013101013101013111013111013111013111013111013111013111014
-11101411101411111411111411111412111412111412111412111412111512111512111512111512
-12151212151212151212151312151312151312161312161312161312161312161312161313161313
-16131316131316131317141317141317141317141317141317141317141317141417141418141418
-1414181414181514181514181514181514181514181514181515191515191515
-
-12100f12100f12100f12100f13101013101013111013111013111013111013111013111013111013
-11101411101411111411111411111411111412111412111412111412111412111512111512111512
-11151212151212151212151212151312151312161312161312161312161312161312161313161313
-16131316131316131317141317141317141317141317141317141317141317141417141417141418
-1414181414181514181514181514181514181514181514181514181515191515
-
-12100f12100f12100f12100f12101013101013101013111013111013111013111013111013111013
-11101411101411101411111411111411111412111412111412111412111412111512111512111512
-11151211151212151212151212151212151312151312161312161312161312161312161312161313
-16131316131316131316131317141317141317141317141317141317141317141317141417141417
-1414181414181414181514181514181514181514181514181514181514191515
-
-12100f12100f12100f12100f12100f13101013101013101013111013111013111013111013111013
-11101311101411101411111411111411111411111412111412111412111412111412111512111512
-11151211151212151212151212151212151312151312151312161312161312161312161312161312
-16131316131316131316131317141317141317141317141317141317141317141317141417141417
-1414181414181414181414181514181514181514181514181514181514181515
-
-12100f12100f12100f12100f12100f12101013101013101013111013111013111013111013111013
-11101311101311101411101411111411111411111412111412111412111412111412111512111512
-11151211151211151212151212151212151212151312151312161312161312161312161312161312
-16131316131316131316131316131317141317141317141317141317141317141317141317141417
-1414171414181414181414181514181514181514181514181514181514181514
-
-12100f12100f12100f12100f12100f12100f13101013101013101013111013111013111013111013
-11101311101311101411101411101411111411111411111412111412111412111412111412111512
-11151211151211151212151212151212151212151312151312151312161312161312161312161312
-16131216131316131316131316131316131317141317141317141317141317141317141317141317
-1414171414181414181414181414181514181514181514181514181514181514
-
-12100f12100f12100f12100f12100f12100f12100f13101013101013111013111013111013111013
-11101311101311101311101411101411111411111411111411111412111412111412111412111412
-11151211151211151211151212151212151212151212151312151312161312161312161312161312
-16131216131316131316131316131316131317141317141317141317141317141317141317141317
-1414171414171414181414181414181514181514181514181514181514181514
-
-12100f12100f12100f12100f12100f12100f12100f12101013101013101013111013111013111013
-11101311101311101311101411101411101411111411111411111412111412111412111412111412
-11151211151211151211151211151212151212151212151212151312151312161312161312161312
-16131216131216131316131316131316131316131317141317141317141317141317141317141317
-1413171414171414171414181414181414181514181514181514181514181514
-
-12100f12100f12100f12100f12100f12100f12100f12100f13101013101013101013111013111013
-11101311101311101311101311101411101411111411111411111411111412111412111412111412
-11141211151211151211151211151212151212151212151212151312151312151312161312161312
-16131216131216131216131316131316131316131317141317141317141317141317141317141317
-1413171414171414171414181414181414181414181514181514181514181514
-
-12100f12100f12100f12100f12100f12100f12100f12100f12101013101013101013111013111013
-11101311101311101311101311101311101411101411111411111411111412111412111412111412
-11141211151211151211151211151211151212151212151212151212151312151312161312161312
-16131216131216131216131316131316131316131316131317141317141317141317141317141317
-1413171413171414171414171414181414181414181514181514181514181514
-
-12100f12100f12100f12100f12100f12100f12100f12100f12100f13101013101013101013111013
-11101311101311101311101311101311101411101411101411111411111411111412111412111412
-11141211141211151211151211151211151212151212151212151212151312151312151312161312
-16131216131216131216131216131316131316131316131316131317141317141317141317141317
-1413171413171413171414171414181414181414181414181514181514181514
-
-12100f12100f12100f12100f12100f12100f12100f12100f12100f12101013101013101013111013
-11101311101311101311101311101311101311101411101411111411111411111411111412111412
-11141211141211141211151211151211151211151212151212151212151212151312151312161312
-16131216131216131216131216131316131316131316131316131317141317141317141317141317
-1413171413171413171414171414171414181414181414181514181514181514
-
-110f0f12100f12100f12100f12100f12100f12100f12100f12100f12100f12101013101013101013
-11101311101311101311101311101311101311101411101411101411111411111411111412111412
-11141211141211141211151211151211151211151211151212151212151212151212151312151312
-16131216131216131216131216131216131316131316131316131316131317141317141317141317
-1413171413171413171413171414171414171414181414181414181514181514
-
-110f0f12100f12100f12100f12100f12100f12100f12100f12100f12100f12100f13101013101013
-10101311101311101311101311101311101311101311101411101411111411111411111411111412
-11141211141211141211141211151211151211151211151212151212151212151212151312151312
-15131216131216131216131216131216131216131316131316131316131317141317141317141317
-1413171413171413171413171414171414171414181414181414181414181514
-
-110f0f110f0f12100f12100f12100f12100f12100f12100f12100f12100f12100f12101013101013
-10101311101311101311101311101311101311101311101311101411101411111411111411111412
-11141211141211141211141211151211151211151211151211151212151212151212151212151312
-15131216131216131216131216131216131216131316131316131316131316131317141317141317
-1413171413171413171413171413171414171414171414181414181414181514
-
-110f0f110f0f110f0f12100f12100f12100f12100f12100f12100f12100f12100f12100f13101013
-10101310101311101311101311101311101311101311101311101411101411101411111411111411
-11141211141211141211141211141211151211151211151211151212151212151212151212151312
-15131215131216131216131216131216131216131216131316131316131316131316131317141317
-1413171413171413171413171413171413171414171414181414181414181414
-
-110f0e110f0f110f0f12100f12100f12100f12100f12100f12100f12100f12100f12100f12101013
-10101310101311101311101311101311101311101311101311101311101411101411111411111411
-11141111141211141211141211141211141211151211151211151211151212151212151212151212
-15131215131216131216131216131216131216131216131316131316131316131316131317141317
-1413171413171413171413171413171413171414171414171414181414181414
-
-110f0e110f0f110f0f110f0f12100f12100f12100f12100f12100f12100f12100f12100f12100f12
-10101310101310101311101311101311101311101311101311101311101411101411101411111411
-11141111141211141211141211141211141211151211151211151211151211151212151212151212
-15121215131215131216131216131216131216131216131216131316131316131316131316131317
-1413171413171413171413171413171413171413171414171414171414181414
-
-110f0e110f0e110f0f110f0f12100f12100f12100f12100f12100f12100f12100f12100f12100f12
-100f1310101310101310101311101311101311101311101311101311101311101411101411111411
-11141111141111141211141211141211141211141211151211151211151211151212151212151212
-15121215131215131215131216131216131216131216131216131216131316131316131316131317
-1413171413171413171413171413171413171413171414171414171414181414
-
-110f0e110f0e110f0e110f0f110f0f12100f12100f12100f12100f12100f12100f12100f12100f12
-100f1210101310101310101311101311101311101311101311101311101311101311101411101411
-11141111141111141211141211141211141211141211151211151211151211151211151212151212
-15121215121215131215131216131216131216131216131216131216131316131316131316131316
-1313171413171413171413171413171413171413171413171414171414171414
-
-110f0e110f0e110f0e110f0f110f0f110f0f12100f12100f12100f12100f12100f12100f12100f12
-100f12100f1310101310101310101311101311101311101311101311101311101311101411101411
-10141111141111141111141211141211141211141211141211151211151211151211151212151212
-15121215121215131215131215131216131216131216131216131216131216131316131316131316
-1313161313171413171413171413171413171413171413171413171414171414
-
-110f0e110f0e110f0e110f0e110f0f110f0f12100f12100f12100f12100f12100f12100f12100f12
-100f12100f1210101310101310101311101311101311101311101311101311101311101311101411
-10141111141111141111141111141211141211141211141211141211151211151211151211151212
-15121215121215121215131215131216131216131216131216131216131216131316131316131316
-1313161313171413171413171413171413171413171413171413171414171314
-
-110f0e110f0e110f0e110f0e110f0f110f0f110f0f12100f12100f12100f12100f12100f12100f12
-100f12100f12100f1210101310101310101311101311101311101311101311101311101311101411
-10141110141111141111141111141211141211141211141211141211151211151211151211151211
-15121215121215121215121215131215131216131216131216131216131216131216131316131316
-1313161313161313171413171413171413171413171413171313171313171314
-
-110f0e110f0e110f0e110f0e110f0e110f0f110f0f12100f12100f12100f12100f12100f12100f12
-100f12100f12100f12100f1310101310101310101311101311101311101311101311101311101311
-10141110141111141111141111141111141211141211141211141211141211151211151211151211
-15121215121215121215121215131215131215131216131216131216131216131216131216131316
-1313161313161313171413171413171413171413171313171313171313171314
-
-110f0e110f0e110f0e110f0e110f0e110f0e110f0f110f0f12100f12100f12100f12100f12100f12
-100f12100f12100f12100f1210101310101310101311101311101311101311101311101311101311
-10131110141110141111141111141111141211141211141211141211141211151211151211151211
-15121115121215121215121215121215131215131216131216131216131216131216131216131316
-1313161313161313161313171413171313171313171313171313171313171313
-
-110f0e110f0e110f0e110f0e110f0e110f0e110f0f110f0f110f0f12100f12100f12100f12100f12
-100f12100f12100f12100f12100f1310101310101310101311101311101311101311101311101311
-10131110141110141110141111141111141111141211141211141211141211141211151211151211
-15121115121215121215121215121215131215131215131216131216131216131216131216131216
-1313161313161313161313161313171313171313171313171313171313171313
-
-110f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0f110f0f12100f12100f12100f12100f12
-100f12100f12100f12100f12100f1210101310101310101311101311101311101311101311101311
-10131110131110141110141111141111141111141111141211141211141211141211141211151211
-15121115121115121215121215121215121215131215131216131216131216131216131216131216
-1313161313161313161213161213171313171313171313171313171313171313
-
-110f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0f110f0f110f0f12100f12100f12100f12
-100f12100f12100f12100f12100f12100f1210101310101310101311101311101311101311101311
-10131110131110141110141110141111141111141111141211141211141211141211141211151211
-15121115121115121115121215121215121215121215131215131216131216131216131216131216
-1312161213161213161213161213161213171313171313171313171313171313
-
-100f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0f110f0f12100f12100f12100f12
-100f12100f12100f12100f12100f12100f12100f1310101310101310101311101311101311101311
-10131110131110131110141110141111141111141111141111141211141211141211141211141211
-15121115121115121115121215121215121215121215131215131215131216131216131216121216
-1212161212161213161213161213161213171313171313171313171313171313
-
-100f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0f110f0f12100f12100f12
-100f12100f12100f12100f12100f12100f12100f1210101310101310101311101311101311101311
-10131110131110131110131110141110141111141111141111141211141211141211141211141211
-15121115121115121115121115121215121215121215121215131215131216121216121216121216
-1212161212161213161213161213161213161213171313171313171313171313
-
-100f0e100f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0f110f0f110f0f12100f12
-100f12100f12100f12100f12100f12100f12100f12100f1310101310101310101311101311101311
-10131110131110131110131110141110141110141111141111141111141211141211141211141211
-14121115121115121115121115121215121215121215121215121215121215121216121216121216
-1212161212161212161213161213161213161213161213171313171313171313
-
-100f0e100f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0f110f0f12100f12
-100f12100f12100f12100f12100f12100f12100f12100f1210101310101310101311101311101311
-10131110131110131110131110131110141110141111141111141111141111141211141211141211
-14121114121115121115121115121115121215121215121215111215121215121216121216121216
-1212161212161212161213161213161213161213161213171313171313171313
-
-100e0e100f0e100f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0f110f0f110f0f12
-100f12100f12100f12100f12100f12100f12100f12100f12100f1210101310101310101311101311
-10131110131110131110131110131110141110141110141111141111141111141211141211141211
-14121114121115121115121115121115121115111215111215111215111215121215121216121216
-1212161212161212161212161213161213161213161213161213171313171313
-
-100e0e100f0e100f0e100f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0f110f0f12
-100f12100f12100f12100f12100f12100f12100f12100f12100f12100f1310101310101310101311
-10131110131110131110131110131110131110141110141111141111141111141111141211141211
-14121114121114121115111115111115111115111215111215111215111215121215121215121216
-1212161212161212161212161212161213161213161213161213171313171313
-
-100e0e100e0e100f0e100f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0f11
-0f0f12100f12100f12100f12100f12100f12100f12100f12100f12100f1210101310101310101311
-10131110131110131110131110131110131110131110141110141111141111141111141211141211
-14121114111114111115111115111115111115111115111215111215111215111215121215121216
-1212161212161212161212161212161213161213161213161213161213171313
-
-100e0d100e0e100f0e100f0e100f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0f11
-0f0f110f0f12100f12100f12100f12100f12100f12100f12100f12100f12100f1310101310101310
-10131110131110131110131110131110131110131110141110141110141111141111141111141111
-14111114111114111114111115111115111115111115111215111215111215111215121215121215
-1212161212161212161212161212161212161213161213161213161213161213
-
-100e0d100e0e100e0e100f0e100f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0e11
-0f0f110f0f12100f12100f12100f12100f12100f12100f12100f12100f12100f1210101310101310
-10131110131110131110131110131110131110131110131110141110141111141111141011141011
-14111114111114111114111114111115111115111115111115111215111215111215111215121215
-1212161212161212161212161212161212161213161213161213161213161213
-
-100e0d100e0d100e0e100e0e100f0e100f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0e11
-0f0f110f0f110f0f12100f12100f12100f12100f12100f12100f12100f12100f12100f1210101310
-10131010131110131110131110131110131110131110131110141010141010141011141011141011
-14111114111114111114111114111115111115111115111115111115111215111215111215111215
-1212151212161212161212161212161212161212161213161213161213161213
-
-100e0d100e0d100e0e100e0e100f0e100f0e110f0e110f0e110f0e110f0e110f0e110f0e110f0e11
-0f0e110f0f110f0f12100f12100f12100f12100f12100f12100f12100f12100f12100f12100f1310
-10131010131010131110131110131110131110131010131010131010141010141011141011141011
-14101114111114111114111114111114111115111115111115111115111215111215111215111215
-1212151212151212161212161212161212161212161212161213161213161213
-
-100e0d100e0d100e0d100e0e100e0e100f0e100f0e110f0e110f0e110f0e110f0e110f0e110f0e11
-0f0e110f0e110f0f110f0f12100f12100f12100f12100f12100f12100f12100f12100f12100f1210
-10131010131010131110131010131010131010131010131010131010131010141010141011141011
-14101114111114111114111114111114111115111115111115111115111115111215111215111215
-1112151212151212161212161212161212161212161212161213161213161213
-
-Q
-Q
-Q
-Q
-q
-q
-n
-210 136 m
-274 136 l
-274 72 l
-210 72 l
-210 136 l
-h
-W
-q
-q
-[64 0 0 64 210 72]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-1a16161a17161a17161a17161b17161b17161b17171b17171b17171b17171b17171b17171b17171c
-18171c18171c18171c18171c18171c18181c18181c18181c18181c18181d18181d18181d18181d19
-181d19181d19181d19181d19191d19191d19191e19191e19191e19191e19191e19191e1a191e1a19
-1e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a20
-1a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b
-
-1a16161a16161a17161a17161b17161b17161b17161b17171b17171b17171b17171b17171b17171b
-17171c18171c18171c18171c18171c18171c18181c18181c18181c18181c18181d18181d18181d19
-181d19181d19181d19181d19191d19191d19191e19191e19191e19191e19191e19191e1a191e1a19
-1e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a20
-1a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b
-
-1a16161a16161a17161a17161a17161b17161b17161b17171b17171b17171b17171b17171b17171b
-17171b18171c18171c18171c18171c18171c18181c18181c18181c18181c18181d18181d18181d18
-181d19181d19181d19181d19181d19191d19191d19191e19191e19191e19191e19191e19191e1919
-1e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f
-1a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b
-
-1a16161a16161a16161a17161a17161b17161b17161b17161b17171b17171b17171b17171b17171b
-17171b17171c18171c18171c18171c18171c18171c18181c18181c18181c18181c18181d18181d18
-181d19181d19181d19181d19181d19191d19191d19191d19191e19191e19191e19191e19191e1819
-1e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f
-1a1a201a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b
-
-1a16161a16161a16161a17161a17161a17161b17161b17161b17161b17171b17171b17171b17171b
-17171b17171b17171c18171c18171c18171c18171c18181c18181c18181c18181c18181d18181d18
-181d18181d19181d19181d19181d19181d19191d19191d19191e19191e19191e19191e18191e1819
-1e19191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f
-1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b
-
-1a16161a16161a16161a16161a17161a17161a17161b17161b17161b17171b17171b17171b17171b
-17171b17171b17171c18171c18171c18171c18171c18171c18181c18181c18181c18181c18181d18
-181d18181d18181d19181d19181d19181d19181d19191d19191d19191e19191e18191e18191e1819
-1e18191e19191e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f
-1a1a1f1a1a201a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b
-
-1a16161a16161a16161a16161a16161a17161a17161b17161b17161b17161b17171b17171b17171b
-17171b17171b17171b17171c18171c18171c18171c18171c18171c18181c18181c18181c18181c18
-181d18181d18181d19181d19181d19181d19181d19191d19191d19191e19191e18191e18191e1819
-1e18191e19191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f
-191a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b
-
-1a16161a16161a16161a16161a16161a17161a17161a17161b17161b17161b17171b17171b17171b
-17171b17171b17171b17171b18171c18171c18171c18171c18171c18181c18181c18181c18181c18
-181d18181d18181d18181d19181d19181d19181d19181d19191d19191d18191e18191e18191e1819
-1e18191e18191e19191e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f
-191a1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b
-
-1a16161a16161a16161a16161a16161a16161a17161a17161b17161b17161b17161b17171b17171b
-17171b17171b17171b17171b17171c18171c18171c18171c18171c18171c18181c18181c18181c18
-181c18181d18181d18181d19181d19181d19181d19181d19191d18191d18191d18191e18191e1819
-1e18191e18191e18191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f
-191a1f191a1f1a1a1f1a1a201a1a201a1b201a1b201a1b201a1b201a1b201a1b
-
-1a16161a16161a16161a16161a16161a16161a17161a17161a17161b17161b17161b17161b17171b
-17171b17171b17171b17171b17171b17171c18171c18171c18171c18171c18181c18181c18181c18
-181c18181d18181d18181d18181d19181d19181d19181d18181d18191d18191d18191e18191e1819
-1e18191e18191e18191e19191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f
-191a1f191a1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b
-
-1a16161a16161a16161a16161a16161a16161a16161a17161a17161a17161b17161b17161b17171b
-17171b17171b17171b17171b17171b17171c18171c18171c18171c18171c18171c18181c18181c18
-181c18181c18181d18181d18181d18181d19181d18181d18181d18181d18191d18191d18191e1819
-1e18191e18191e18191e18191e19191e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f
-191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b201a1b201a1b201a1b201a1b
-
-1a16151a16161a16161a16161a16161a16161a16161a17161a17161a17161b17161b17161b17161b
-17171b17171b17171b17171b17171b17171b17171c18171c18171c18171c18171c18181c18181c18
-181c18181c18181c18181d18181d18181d18181d18181d18181d18181d18191d18191d18191e1819
-1e18191e18191e18191e18191e19191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f
-191a1f191a1f191a1f191a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b
-
-1916151a16151a16161a16161a16161a16161a16161a16161a17161a17161a17161b17161b17161b
-17171b17171b17171b17171b17171b17171b17171b18171c18171c18171c18171c18171c18181c18
-181c18181c18181c18181d18181d18181d18181d18181d18181d18181d18181d18191d18191d1819
-1e18191e18191e18191e18191e18191e19191e19191e19191e191a1e191a1f191a1f191a1f191a1f
-191a1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b201a1b
-
-1916151916151a16161a16161a16161a16161a16161a16161a16161a17161a17161b17161b17161b
-17161b17171b17171b17171b17171b17171b17171b17171c18171c18171c18171c18171c18171c18
-181c18181c18181c18181c18181d18181d17181d18181d18181d18181d18181d18191d18191d1819
-1d18191e18191e18191e18191e18191e18191e19191e19191e19191e191a1f191a1f191a1f191a1f
-191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b201a1b201a1b
-
-1916151916151a16151a16161a16161a16161a16161a16161a16161a17161a17161a17161b17161b
-17161b17161b17171b17171b17171b17171b17171b17171b18171c18171c18171c18171c18171c18
-181c18181c18181c18181c18181d17181d17181d17181d18181d18181d18181d18181d18191d1819
-1d18191e18191e18191e18191e18191e18191e19191e19191e19191e19191e191a1f191a1f191a1f
-191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b
-
-1916151916151916151a16161a16161a16161a16161a16161a16161a16161a17161a17161a17161b
-17161b17161b17171b17171b17171b17171b17171b17171b17171c18171c18171c18171c18171c18
-171c18181c18181c18181c17181c17181d17181d17181d17181d18181d18181d18181d18181d1819
-1d18191d18191e18191e18191e18191e18191e18191e19191e19191e19191e191a1e191a1f191a1f
-191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b201a1b
-
-1916151916151916151a16151a16161a16161a16161a16161a16161a16161a17161a17161a17161b
-17161b17161b17161b17171b17171b17171b17171b17171b17171b17171c18171c18171c18171c18
-171c18181c18181c17181c17181c17181c17181d17181d17181d18181d18181d18181d18181d1819
-1d18191d18191e18191e18191e18191e18191e18191e19191e19191e19191e19191e191a1f191a1f
-191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1b201a1b
-
-1916151916151916151916151a16151a16161a16161a16161a16161a16161a16161a17161a17161a
-17161b17161b17161b17171b17171b17171b17171b17171b17171b17171b18171c18171c18171c18
-171c18171c17181c17181c17181c17181c17181d17181d17181d17181d18181d18181d18181d1818
-1d18191d18191d18191e18191e18191e18191e18191e18191e19191e19191e19191e191a1e191a1f
-191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b
-
-1916151916151916151916151916151a16161a16161a16161a16161a16161a16161a16161a17161a
-17161b17161b17161b17161b17171b17171b17171b17171b17171b17171b17171c18171c18171c18
-171c17171c17171c17181c17181c17181c17181c17181d17181d17181d18181d18181d18181d1818
-1d18191d18191d18191d18191e18191e18191e18191e18191e18191e19191e19191e19191e191a1f
-191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a
-
-1916151916151916151916151916151a16151a16161a16161a16161a16161a16161a16161a17161a
-17161a17161b17161b17161b17161b17171b17171b17171b17171b17171b17171b18171c18171c17
-171c17171c17171c17181c17181c17181c17181c17181d17181d17181d17181d18181d18181d1818
-1d18181d18191d18191d18191e18191e18191e18191e18191e18191e19191e19191e19191e191a1e
-191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a
-
-1915151916151916151916151916151916151a16161a16161a16161a16161a16161a16161a16161a
-17161a17161a17161b17161b17161b17171b17171b17171b17171b17171b17171b17171c17171c17
-171c17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d17181d18181d1818
-1d18181d18181d18191d18191d18191e18191e18191e18191e18191e18191e19191e19191e19191e
-191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a
-
-1915151916151916151916151916151916151a16151a16161a16161a16161a16161a16161a16161a
-17161a17161a17161b17161b17161b17161b17171b17171b17171b17171b17171b17171b16171c17
-171c17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d17181d18181d1818
-1d18181d18181d18191d18191d18191e18191e18191e18191e18191e18191e19191e19191e19191e
-19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a
-
-1915151915151916151916151916151916151916151a16151a16161a16161a16161a16161a16161a
-16161a17161a17161a17161b17161b17161b17171b17171b17171b17171b17171b16171b16171b17
-171c17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d17181d1818
-1d18181d18181d18181d18191d18191d18191e18191e18191e18191e18191e18191e19191e19191e
-19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a
-
-1915151915151916151916151916151916151916151a16151a16161a16161a16161a16161a16161a
-16161a16161a17161a17161b17161b17161b17161b17171b17171b17171b16171b16171b16171b16
-171c17171c17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d1818
-1d18181d18181d18181d18191d18191d18191d18191e18191e18191e18191e18191e18191e19191e
-19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a
-
-1915151915151915151916151916151916151916151916151a16151a16161a16161a16161a16161a
-16161a16161a17161a17161a17161b17161b17161b17161b17171b16171b16171b16171b16171b16
-171b17171c17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d1718
-1d18181d18181d18181d18181d18191d18191d18191e18191e18191e18191e18191e18191e19191e
-19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a
-
-1915151915151915151915151916151916151916151916151916151a16161a16161a16161a16161a
-16161a16161a16161a17161a17161a17161b17161b17161b16171b16171b16171b16171b16171b16
-171b16171c17171c17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d1718
-1d17181d18181d18181d18181d18181d18191d18191d18191e18191e18191e18191e18191e18191e
-19191e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a
-
-1915151915151915151915151916151916151916151916151916151a16151a16161a16161a16161a
-16161a16161a16161a17161a17161a17161b17161b16161b16161b16171b16171b16171b16171b16
-171b16171b16171c17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d1718
-1d17181d18181d18181d18181d18181d18191d18191d18191e18191e18191e18191e18191e18191e
-19191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a
-
-1915151915151915151915151915151916151916151916151916151916151a16151a16161a16161a
-16161a16161a16161a16161a17161a17161a16161b16161b16161b16171b16171b16171b16171b16
-171b16171b16171b17171c17171c17171c17171c17171c17181c17181c17181c17181c17181d1718
-1d17181d17181d18181d18181d18181d18181d18191d18191d18191e18191e18191e18191e18191e
-18191e19191e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a
-
-1815151915151915151915151915151916151916151916151916151916151a16151a16161a16161a
-16161a16161a16161a16161a16161a16161a16161b16161b16161b16161b16171b16171b16171b16
-171b16171b16171b16171c17171c17171c17171c17171c17171c17181c17181c17181c17181c1718
-1d17181d17181d18181d18181d18181d18181d18191d18191d18191d18191e18191e18191e18191e
-18191e18191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a
-
-1815151915151915151915151915151915151916151916151916151916151916151a16151a16161a
-16161a16161a16161a16161a16161a16161a16161a16161b16161b16161b16161b16171b16171b16
-171b16171b16171b16171b17171c17171c17171c17171c17171c17181c17181c17181c17181c1718
-1d17181d17181d17181d18181d18181d18181d18181d18191d18191d18191e18191e18191e18191e
-18191e18191e19191e19191e19191e191a1e191a1f191a1f191a1f191a1f191a
-
-1815141815151915151915151915151915151915151916151916151916151916151916151a16161a
-16161a16161a16161a16161a15161a15161a16161a16161b16161b16161b16161b16171b16171b16
-171b16171b16171b16171b16171c17171c17171c17171c17171c17171c17181c17181c17181c1718
-1c17181d17181d17181d17181d18181d18181d18181d18181d18191d18191d18191e18191e18191e
-18191e18191e18191e19191e19191e19191e191a1e191a1f191a1f191a1f191a
-
-1815141815141915151915151915151915151915151916151916151916151916151916151a16151a
-16161a16161a16161a15161a15161a15161a16161a16161a16161b16161b16161b16161b16171b16
-171b16171b16171b16171b16171b16171c17171c17171c17171c17171c17181c17181c17181c1718
-1c17181d17181d17181d17181d18181d18181d18181d18181d18191d18191d18191e18191e18191e
-18191e18191e18191e19191e19191e19191e19191e191a1f191a1f191a1f191a
-
-1815141815141815151915151915151915151915151915151916151916151916151916151916151a
-16151a15161a15161a15161a15161a15161a15161a16161a16161a16161b16161b16161b16171b16
-171b16171b16171b16171b16171b16171b17171c17171c17171c17171c17171c17181c17181c1718
-1c17181c17181d17181d17181d17181d18181d18181d18181d18181d18191d18191d18191e18191e
-18191e18191e18191e18191e19191e19191e19191e191a1e191a1f191a1f191a
-
-1815141815141815141815151915151915151915151915151916151916151916151916151916151a
-15151a15161a15161a15161a15161a15161a15161a15161a16161a16161b16161b16161b16161b16
-171b16171b16171b16171b16171b16171b16171c17171c17171c17171c17171c17171c17181c1718
-1c17181c17181c17181d17181d17181d18181d18181d18181d18181d18191d18191d18191e18191e
-18191e18191e18191e18191e18191e19191e19191e19191e191a1f191a1f191a
-
-18151418151418151418151519151519151519151519151519151519161519161519161519151519
-15151a15151a15161a15161a15161a15161a15161a15161a16161a16161a16161b16161b16161b16
-161b16171b16171b16171b16171b16171b16171b17171c17171c17171c17171c17171c17181c1718
-1c17181c17181c17181d17181d17181d17181d18181d18181d18181d18181d18191d18191d18191e
-18191e18191e18191e18191e18191e19191e19191e19191e191a1e191a1f191a
-
-18151418151418151418151418151519151519151519151519151519151519161519151519151519
-15151915151a15161a15161a15161a15161a15161a15161a15161a16161a16161b16161b16161b16
-161b16171b16171b16171b16171b16171b16171b16171c17171c17171c17171c17171c17171c1718
-1c17181c17181c17181c17181d17181d17181d17181d18181d18181d18181d18181d18191d18191d
-18191e18191e18191e18191e18191e18191e19191e19191e19191e191a1e191a
-
-18151418151418151418151418151519151519151519151519151519151519151519151519151519
-15151915151a15151a15161a15161a15161a15161a15161a15161a16161a16161a16161b16161b16
-161b16161b16171b16171b16171b16171b16171b16171b16171c17171c17171c17171c17171c1718
-1c17181c17181c17181c17181d17181d17181d17181d18181d18181d18181d18181d18191d18191d
-18191e18191e18191e18191e18191e18191e19191e19191e19191e19191e191a
-
-18151418151418151418151418151418151519151519151519151519141519141519151519151519
-15151915151915151a15151a15161a15161a15161a15161a15161a15161a16161a16161a16161b16
-161b16161b16171b16171b16171b16171b16171b16171b16171c17171c17171c17171c17171c1717
-1c17181c17181c17181c17181c17181d17181d17181d17181d18181d18181d18181d18181d18191d
-18191d18191e18191e18191e18191e18191e18191e19191e19191e19191e191a
-
-18151418151418151418151418151418151418151519151519141519141519141519151519151519
-15151915151915151a15151a15161a15161a15161a15161a15161a15161a15161a16161a16161b16
-161b16161b16161b16171b16171b16171b16171b16171b16171b16171c17171c17171c17171c1717
-1c17171c17181c17181c17181c17181c17181d17181d17181d18181d18181d18181d18181d18191d
-18191d18191e18191e18191e18191e18191e18191e18191e19191e19191e1919
-
-18151418151418151418151418151418151418141519141519141519141519141519141519151519
-15151915151915151915151a15151a15161a15161a15161a15161a15161a15161a16161a16161a16
-161b16161b16161b16161b16171b16171b16171b16171b16171b16171b17171c17171c17171c1717
-1c17171c17181c17181c17181c17181c17181d17181d17181d17181d18181d18181d18181d18181d
-18191d18191d18191e18191e18191e18191e18191e18191e19191e19191e1919
-
-18151418151418151418151418151418141418141418141519141519141519141519141519141519
-15151915151915151915151915151a15161a15161a15161a15161a15161a15161a15161a16161a16
-161b16161b16161b16161b16171b16171b16171b16171b16171b16171b16171c17171c17171c1717
-1c17171c17171c17181c17181c17181c17181c17181d17181d17181d18181d18181d18181d18181d
-18181d18191d18191d18191e18191e18191e18191e18191e18191e19191e1919
-
-18141418151418151418141418141418141418141418141519141519141519141519141519141519
-15151915151915151915151915151a15151a15161a15161a15161a15161a15161a15161a16161a16
-161a16161b16161b16161b16161b16171b16171b16171b16171b16171b16171b16171c17171c1717
-1c17171c17171c17181c17181c17181c17181c17181d17181d17181d17181d18181d18181d18181d
-18181d18191d18191d18191e18191e18191e18191e18191e18191e19191e1919
-
-18141418141418141418141418141418141418141418141418141519141519141519141519141519
-14151915151915151915151915151915151a15151a15161a15161a15161a15161a15161a15161a16
-161a16161a16161b16161b16161b16171b16171b16171b16171b16171b16171b16171c17171c1717
-1c17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d17181d18181d18181d
-18181d18181d18191d18191d18191e18191e18191e18191e18191e18191e1919
-
-18141418141418141418141418141418141418141418141418141418141519141519141519141519
-14151915151915151915151915151915151a15151a15161a15161a15161a15161a15161a15161a15
-161a16161a16161b16161b16161b16161b16171b16171b16171b16171b16171b16171b16171c1717
-1c17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d18181d18181d
-18181d18181d18191d18191d18191e18191e18191e18191e18191e18191e1919
-
-18141418131418131418141418141418141418141418141418141418141519141519141519141519
-14151914151915151915151915151915151915151a15151a15161a15161a15161a15161a15161a15
-161a16161a16161a16161b16161b16161b16161b16171b16171b16171b16171b16171b16171b1717
-1c17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d17181d18181d
-18181d18181d18181d18191d18191d18191e18191e18191e18191e18191e1819
-
-17131418131418131418141418141418141418141418141418141418141418141519141519141519
-14151914151914151915151915151915151915151915151a15161a15161a15161a15161a15161a15
-161a15161a16161a16161b16161b16161b16161b16171b16171b16171b16171b16171b16171b1617
-1c17171c17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d18181d
-18181d18181d18181d18181d18191d18191d18191e18191e18191e18191e1819
-
-17131417131418131418131418141418141418141418141418141418141418141519141519141519
-14151914151914151915151915151915151915151915151a15151a15161a15161a15161a15161a15
-161a15161a16161a16161a16161b16161b16161b16161b16171b16171b16171b16171b16171b1617
-1b16171c17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d17181d
-18181d18181d18181d18181d18191d18191d18191e18191e18191e18191e1819
-
-17131417131418131418131418131418141418141418141418141418141418141418141519141519
-14151914151914151914151915151915151915151915151915151a15151a15161a15161a15161a15
-161a15161a15161a16161a16161a16161b16161b16161b16171b16171b16171b16171b16171b1617
-1b16171c17171c17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d
-17181d18181d18181d18181d18181d18191d18191d18191e18191e18191e1819
-
-17131417131417131418131418131418141418141418141418141418141418141418141418141519
-14151914151914151914151915151915151915151915151915151a15151a15161a15161a15161a15
-161a15161a15161a15161a16161a16161b16161b16161b16161b16171b16171b16171b16171b1617
-1b16171b16171c17171c17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d
-17181d18181d18181d18181d18181d18191d18191d18191e18191e18191e1819
-
-17131317131417131418131418131418131418141418141418141418141418141418141418141519
-14151914151914151914151914151915151915151915151915151915151a15151a15161a15161a15
-161a15161a15161a15161a16161a16161a16161b16161b16161b16171b16171b16171b16171b1617
-1b16171b16171b17171c17171c17171c17171c17171c17181c17181c17181c17181c17181d17181d
-17181d17181d18181d18181d18181d18181d18191d18191d18191e18191e1819
-
-17131317131417131417131418131418131418141418141418141418141418141418141418141418
-14151914151914151914151914151914151915151915151915151915151915151a15161a15161a15
-161a15161a15161a15161a15161a16161a16161b16161b16161b16161b16171b16171b16171b1617
-1b16171b16171b16171c17171c17171c17171c17171c17171c17181c17181c17181c17181c17181d
-17181d17181d18181d18181d18181d18181d18181d18191d18191d18191e1819
-
-17131317131317131417131417131418131418131418141418141418141418141418141418141418
-14151914151914151914151914151914151915151915151915151915151915151a15151a15161a15
-161a15161a15161a15161a15161a16161a16161a16161b16161b16161b16161b16171b16171b1617
-1b16171b16171b16171b16171c17171c17171c17171c17171c17181c17181c17181c17181c17181d
-17181d17181d17181d18181d18181d18181d18181d18191d18191d18191e1819
-
-17131317131317131417131417131418131418131418131418141418141418141418141418141418
-14141814151914151914151914151914151914151915151915151915151915151915151a15151a15
-161a15161a15161a15161a15161a15161a16161a16161a16161b16161b16161b16171b16171b1617
-1b16171b16171b16171b16171c17171c17171c17171c17171c17171c17181c17181c17181c17181c
-17181d17181d17181d17181d18181d18181d18181d18181d18191d18191d1819
-
-17131317131317131317131417131417131418131418131418141418141418141418141418141418
-14141814141814151914151914151914151914151915151915151915151915151915151a15151a15
-161a15161a15161a15161a15161a15161a15161a16161a16161b16161b16161b16161b16171b1617
-1b16171b16171b16171b16171b16171c17171c17171c17171c17171c17171c17181c17181c17181c
-17181c17181d17181d17181d18181d18181d18181d18181d18191d18191d1819
-
-17131317131317131317131317131417131418131418131418131418141418141418141418141418
-14141814141814151914151914151914151914151914151915151915151915151915151915151a15
-151a15161a15161a15161a15161a15161a15161a16161a16161a16161b16161b16161b16171b1617
-1b16171b16171b16171b16171b16171b17171c17171c17171c17171c17171c17181c17181c17181c
-17181c17181d17181d17181d17181d18181d18181d18181d18181d18191d1819
-
-17131317131317131317131317131417131417131418131418131418141418141418141418141418
-14141814141814141814151914151914151914151914151914151915151915151915151915151915
-151a15161a15161a15161a15161a15161a15161a15161a16161a16161b16161b16161b16161b1617
-1b16171b16171b16171b16171b16171b16171c17171c17171c17171c17171c17171c17181c17181c
-17181c17181c17181d17181d17181d18181d18181d18181d18181d18181d1819
-
-17131317131317131317131317131317131417131417131418131418131418141418141418141418
-14141814141814141814151914151914151914151914151914151915151915151915151915151915
-151a15151a15161a15161a15161a15161a15161a15161a16161a16161a16161b16161b16161b1616
-1b16171b16171b16171b16171b16171b16171b16171c17171c17171c17171c17171c17181c17181c
-17181c17181c17181d17181d17181d17181d18181d18181d18181d18181d1819
-
-17131317131317131317131317131317131417131417131418131418131418131418141418141418
-14141814141814141814141814151914151914151914151914151914151915151915151915151915
-151915151a15151a15161a15161a15161a15161a15161a15161a16161a16161a16161b16161b1616
-1b16171b16171b16171b16171b16171b16171b16171c17171c17171c17171c17171c17171c17181c
-17181c17181c17181c17181d17181d17181d17181d18181d18181d18181d1818
-
-17131317131317131317131317131317131317131417131417131418131418131418141418141418
-14141814141814141814141814141814151914151914151914151914151915151915151915151915
-151915151a15151a15161a15161a15161a15161a15161a15161a15161a16161a16161b16161b1616
-1b16161b16171b16171b16171b16171b16171b16171b16171c17171c17171c17171c17171c17171c
-17181c17181c17181c17181c17181d17181d17181d18181d18181d18181d1818
-
-17131317131317131317131317131317131317131317131417131418131418131418131418141418
-14141814141814141814141814141814151914151914151914151914151914151915151915151915
-151915151915151a15151a15161a15161a15161a15161a15161a15161a16161a16161a16161b1616
-1b16161b16171b16171b16171b16171b16171b16171b16171b17171c17171c17171c17171c17171c
-17181c17181c17181c17181c17181d17181d17181d17181d18181d18181d1818
-
-17131317131317131317131317131317131317131317131417131417131418131418131418141418
-14141814141814141814141814141814141814151914151914151914151914151914151915151915
-151915151915151915151a15161a15161a15161a15161a15161a15161a15161a16161a16161b1616
-1b16161b16161b16171b16171b16171b16171b16171b16171b16171c17171c17171c17171c17171c
-17171c17181c17181c17181c17181c17181d17181d17181d18181d18181d1818
-
-16121317131317131317131317131317131317131317131317131417131417131418131418131418
-14141814141814141814141814141814141814151914151914151914151914151914151915151915
-151915151915151915151a15151a15161a15161a15161a15161a15161a15161a16161a16161a1616
-1b16161b16161b16161b16171b16171b16171b16171b16171b16171b16171c17171c17171c17171c
-17171c17181c17181c17181c17181c17181d17181d17181d17181d18181d1818
-
-16121317131317131317131317131317131317131317131317131417131417131418131418131418
-13141814141814141814141814141814141814141814151914151914151914151914151914151915
-151915151915151915151915151a15151a15161a15161a15161a15161a15161a15161a16161a1616
-1a16161b16161b16161b16171b16171b16171b16171b16171b16171b16171c17171c17171c17171c
-17171c17171c17181c17181c17181c17181c17181d17181d17181d17181d1818
-
-16121316121317131317131317131317131317131317131317131317131417131417131418131418
-13141814141814141814141814141814141814141814141814151914151914151914151914151915
-151915151915151915151915151a15151a15161a15161a15161a15161a15161a15161a15161a1616
-1a16161b16161b16161b16161b16171b16171b16171b16171b16171b16171b16171c17171c17171c
-17171c17171c17171c17181c17181c17181c17181c17181d17181d17181d1818
-
-Q
-Q
-Q
-Q
-q
-q
-n
-274 136 m
-338 136 l
-338 72 l
-274 72 l
-274 136 l
-h
-W
-q
-q
-[64 0 0 64 274 72]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221c1c221c1c221c1d22
-1c1d221c1d221c1d221c1d221c1d231c1d231c1d231c1d231c1d231c1d231d1d231d1e231d1e231d
-1e231d1e241d1e241d1e241d1e241d1e241d1e241d1e241d1e241e1e241e1f251e1f241e1f241e1f
-241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f
-
-211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221c1c221c1c22
-1c1d221c1d221c1d221c1d221c1d231c1d231c1d231c1d231c1d231c1d231d1d231d1e231d1e231d
-1e231d1e241d1e241d1e241d1e241d1e241d1e241d1e241d1e241d1e241e1f231e1f241e1f241e1f
-241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f
-
-211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221b1c221c1c22
-1c1c221c1d221c1d221c1d221c1d221c1d231c1d231c1d231c1d231c1d231c1d231d1d231d1e231d
-1e231d1e231d1e241d1e241d1e241d1e241d1e241d1e241d1e241d1e241e1e231e1f231e1f241e1f
-241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f
-
-211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221c1c22
-1c1c221c1d221c1d221c1d221c1d221c1d221c1d231c1d231c1d231c1d231c1d231d1d231d1d231d
-1e231d1e231d1e241d1e241d1e241d1e241d1e241d1e241d1e241d1e241d1e231e1f231e1f241e1f
-241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f
-
-201a1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221b1c22
-1c1c221c1c221c1d221c1d221c1d221c1d221c1d231c1d231c1d231c1d231c1d231c1d231d1d231d
-1e231d1e231d1e231d1e241d1e241d1e241d1e241d1e241d1e241d1e241d1e231e1e231e1f231e1f
-241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f
-
-201a1b211b1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c22
-1c1c221c1c221c1d221c1d221c1d221c1d221c1d221c1d231c1d231c1d231c1d231c1d231c1d231d
-1d231d1e231d1e231d1e231d1e241d1e241d1e241d1e241d1e241d1e231d1e231d1e231e1e231e1f
-241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f
-
-201a1b201a1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c22
-1b1c221c1c221c1c221c1d221c1d221c1d221c1d221c1d231c1d231c1d231c1d231c1d231c1d231d
-1d231d1e231d1e231d1e231d1e241d1e241d1e241d1e241d1e241d1e231d1e231d1e231d1e231e1f
-231e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f
-
-201a1b201a1b211b1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c22
-1b1c221b1c221c1c221c1c221c1d221c1d221c1d221c1d221c1d231c1d231c1d231c1d231c1d231c
-1d231d1d231d1e231d1e231d1e231d1e241d1e241d1e241d1e241d1e231d1e231d1e231d1e231e1e
-231e1f231e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f
-
-201a1b201a1b201a1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c211b1c22
-1b1c221b1c221c1c221c1c221c1d221c1d221c1d221c1d221c1d221c1d231c1d231c1d231c1d231c
-1d231d1d231d1d231d1e231d1e231d1e241d1e241d1e241d1e231d1e231d1e231d1e231d1e231d1e
-231e1f231e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f
-
-201a1b201a1b201a1b201a1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c22
-1b1c221b1c221b1c221c1c221c1c221c1d221c1d221c1d221c1d221c1d231c1d231c1d231c1d231c
-1d231c1d231d1d231d1e231d1e231d1e231d1e241d1e241d1e231d1e231d1e231d1e231d1e231d1e
-231e1e231e1f231e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241f20
-
-201a1b201a1b201a1b201a1b211b1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c21
-1b1c221b1c221b1c221c1c221c1c221c1d221c1d221c1d221c1d221c1d221c1d231c1d231c1d231c
-1d231c1d231c1d231d1d231d1e231d1e231d1e231d1e241d1e231d1e231d1e231d1e231d1e231d1e
-231d1e231e1e231e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f251f20
-
-201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c21
-1b1c211b1c221b1c221b1c221c1c221c1c221c1d221c1d221c1d221c1d221c1d231c1d231c1d231c
-1d231c1d231c1d231d1d231d1e231d1e231d1e231d1e231d1e231d1e231d1e231d1e231d1e231d1e
-231d1e231d1e231e1f231e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f251f20
-
-201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c21
-1b1c211b1c221b1c221b1c221b1c221c1c221c1d221c1d221c1d221c1d221c1d221c1d231c1d231c
-1d231c1d231c1d231c1d231d1d231d1e231d1e231d1e221d1e231d1e231d1e231d1e231d1e231d1e
-231d1e231d1e231e1e231e1f231e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f251f20
-
-201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c21
-1b1c211b1c211b1c221b1c221b1c221c1c221c1c221c1d221c1d221c1d221c1d221c1d221c1d231c
-1d231c1d231c1d231c1d231d1d231d1d231d1e231d1e221d1e231d1e231d1e231d1e231d1e231d1e
-231d1e231d1e231d1e231e1f231e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f251f20251f20
-
-201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1c211b1c211b1c211b1c21
-1b1c211b1c211b1c221b1c221b1c221b1c221c1c221c1c221c1d221c1d221c1d221c1d221c1d231c
-1d231c1d231c1d231c1d231c1d231d1d231d1e221d1e221d1e221d1e231d1e231d1e231d1e231d1e
-231d1e231d1e231d1e231e1e231e1f231e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f251f20251f20
-
-201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1b211b1c211b1c211b1c21
-1b1c211b1c211b1c211b1c221b1c221b1c221c1c221c1c221c1d221c1d221c1d221c1d221c1d221c
-1d231c1d231c1d231c1d231c1d231c1d231d1d221d1e221d1e221d1e221d1e231d1e231d1e231d1e
-231d1e231d1e231d1e231d1e231e1e231e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f251f20251f20
-
-201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1c211b1c211b1c21
-1b1c211b1c211b1c211b1c211b1c221b1c221b1c221c1c221c1c221c1d221c1d221c1d221c1d221c
-1d231c1d231c1d231c1d231c1d231c1d231d1d221d1e221d1e221d1e221d1e231d1e231d1e231d1e
-231d1e231d1e231d1e231d1e231d1e231e1f231e1f241e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f251f20251f20251f20
-
-201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1b211b1c211b1c21
-1b1c211b1c211b1c211b1c211b1c221b1c221b1c221b1c221c1c221c1d221c1d221c1d221c1d221c
-1d221c1d231c1d231c1d231c1d231c1d221c1d221d1d221d1e221d1e221d1e221d1e231d1e231d1e
-231d1e231d1e231d1e231d1e231d1e231e1e231e1f231e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f251f20251f20251f20
-
-201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1c211b1c21
-1b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221c1c221c1c221c1d221c1d221c1d221c
-1d221c1d221c1d231c1d231c1d231c1d221c1d221d1d221d1d221d1e221d1e221d1e231d1e231d1e
-231d1e231d1e231d1e231d1e231d1e231d1e231e1f231e1f241e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f241e1f251f20251f20251f20
-
-201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1c21
-1b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221b1c221c1c221c1c221c1d221c1d221c
-1d221c1d221c1d231c1d231c1d221c1d221c1d221c1d221d1d221d1e221d1e221d1e221d1e231d1e
-231d1e231d1e231d1e231d1e231d1e231d1e231e1e231e1f231e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f251f20251f20251f20251f20
-
-201a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1b21
-1b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221c1c221c1c221c1d221c1d221c
-1d221c1d221c1d221c1d231c1d221c1d221c1d221c1d221c1d221d1d221d1e221d1e221d1e221d1e
-231d1e231d1e231d1e231d1e231d1e231d1e231d1e231e1f231e1f241e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f251f20251f20251f20251f20
-
-1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b21
-1b1c211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221c1c221c1c221c1d221c
-1d221c1d221c1d221c1d231c1d221c1d221c1d221c1d221c1d221d1d221d1e221d1e221d1e221d1e
-231d1e231d1e231d1e231d1e231d1e231d1e231d1e231d1e231e1f231e1f241e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f241e1f251f20251f20251f20251f20
-
-1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b21
-1b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221b1c221c1c221c1d221c
-1d221c1d221c1d221c1d211c1d221c1d221c1d221c1d221c1d221c1d221d1d221d1e221d1e221d1e
-221d1e231d1e231d1e231d1e231d1e231d1e231d1e231d1e231e1e231e1f231e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f251f20251f20251f20251f20251f20
-
-1f1a1a1f1a1a201a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b21
-1b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221c1c221c1c221c
-1d221c1d221c1d221c1d211c1d211c1d221c1d221c1d221c1d221c1d221d1d221d1d221d1e221d1e
-221d1e231d1e231d1e231d1e231d1e231d1e231d1e231d1e231d1e231e1f231e1f241e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f251f20251f20251f20251f20251f20
-
-1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b21
-1b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221b1c221c1c221c
-1c221c1d221c1d211c1d211c1d211c1d221c1d221c1d221c1d221c1d221c1d221d1d221d1e221d1e
-221d1e221d1e231d1e231d1e231d1e231d1e231d1e231d1e231d1e231e1e231e1f231e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f241e1f251f20251f20251f20251f20251f20
-
-1f191a1f1a1a1f1a1a201a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b21
-1b1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221c1c221c
-1c221c1d221c1d211c1d211c1d211c1d211c1d221c1d221c1d221c1d221c1d221c1d221d1d221d1e
-221d1e221d1e221d1e231d1e231d1e231d1e231d1e231d1e231d1e231d1e231e1f231e1f241e1f24
-1e1f241e1f241e1f241e1f241e1f251f20251f20251f20251f20251f20251f20
-
-1f191a1f191a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b20
-1a1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221c
-1c221c1c211c1d211c1d211c1d211c1d211c1d221c1d221c1d221c1d221c1d221c1d221d1d221d1e
-221d1e221d1e221d1e231d1e231d1e231d1e231d1e231d1e231d1e231d1e231d1e231e1f231e1f24
-1e1f241e1f241e1f241e1f241e1f251f20251f20251f20251f20251f20251f20
-
-1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b20
-1a1b211b1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221b
-1c221c1c211c1d211c1d211c1d211c1d211c1d211c1d221c1d221c1d221c1d221c1d221c1d221d1d
-221d1e221d1e221d1e221d1e231d1e231d1e231d1e231d1e231d1e231d1e231d1e231e1e231e1f23
-1e1f241e1f241e1f241e1f241e1f251f20251f20251f20251f20251f20251f20
-
-1f191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b20
-1a1b201a1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b
-1c211c1c211c1c211c1d211c1d211c1d211c1d211c1d211c1d221c1d221c1d221c1d221c1d221d1d
-221d1d221d1e221d1e221d1e231d1e231d1e231d1e231d1e231d1e231d1e231d1e231d1e231e1f23
-1e1f241e1f241e1f241e1f251e1f251f20251f20251f20251f20251f20251f20
-
-1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b201a1b20
-1a1b201a1b201a1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b
-1c211b1c211c1c211c1c211c1d211c1d211c1d211c1d211c1d221c1d221c1d221c1d221c1d221c1d
-221d1d221d1e221d1e221d1e221d1e231d1e231d1e231d1e231d1e231d1e231d1e231d1e231e1e23
-1e1f231e1f241e1f241e1f251e1f251f20251f20251f20251f20251f20251f20
-
-1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b201a1b201a1b201a1b201a1b201a1b20
-1a1b201a1b201a1b211b1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c211b
-1c211b1c211c1c211c1c211c1d211c1d211c1d211c1d211c1d211c1d221c1d221c1d221c1d221c1d
-221c1d221d1d221d1e221d1e221d1e221d1e231d1e231d1e231d1e231d1e231d1e231d1e231d1e23
-1e1f231e1f241e1f241e1f251e1f251f20251f20251f20251f20251f20251f20
-
-1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b201a1b20
-1a1b201a1b201a1b201a1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c211b1c211b1c201b
-1c211b1c211b1c211c1c211c1c211c1d211c1d211c1d211c1d211c1d221c1d221c1d221c1d221c1d
-221c1d221d1d221d1e221d1e221d1e221d1e231d1e231d1e231d1e231d1e231d1e231d1e231d1e23
-1d1e231e1f231e1f251e1f251e1f251f20251f20251f20251f20251f20251f20
-
-1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b201a1b201a1b20
-1a1b201a1b201a1b201a1b211b1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c201b1c201b
-1c211b1c211b1c211b1c211c1c211c1d211c1d211c1d211c1d211c1d211c1d221c1d221c1d221c1d
-221c1d221c1d221d1d221d1e221d1e221d1e221d1e231d1e231d1e231d1e231d1e231d1e231d1e23
-1d1e231e1e231e1f241e1f251e1f251f20251f20251f20251f20251f20251f20
-
-1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b201a1b201a1b201a1b20
-1a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1c211b1c211b1c211b1c211b1c201b1c201b
-1c201b1c211b1c211b1c211c1c211c1c211c1d211c1d211c1d211c1d211c1d211c1d221c1d221c1d
-221c1d221c1d221d1d221d1d221d1e221d1e221d1e231d1e231d1e231d1e231d1e231d1e231d1e23
-1d1e231d1e241e1f241e1f251e1f251f20251f20251f20251f20251f20251f20
-
-1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b201a1b201a1b201a1b20
-1a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1c211b1c211b1c201b1c201b1c201b
-1c201b1c211b1c211b1c211b1c211c1c211c1c211c1d211c1d211c1d211c1d211c1d221c1d221c1d
-221c1d221c1d221c1d221d1d221d1e221d1e221d1e221d1e231d1e231d1e231d1e231d1e231d1e23
-1d1e231d1e241e1e241e1f241e1f251f20251f20251f20251f20251f20251f20
-
-1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b201a1b201a1b20
-1a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1b211b1c211b1c201b1c201b1c201b
-1c201b1c201b1c211b1c211b1c211c1c211c1c211c1d211c1d211c1d211c1d211c1d211c1d221c1d
-221c1d221c1d221c1d221c1d221d1d221d1e221d1e221d1e221d1e231d1e231d1e231d1e231d1e23
-1d1e241d1e241d1e241e1f241e1f251f20251f20251f20251f20251f20251f20
-
-1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1b201a1b201a1b20
-1a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b211b1c201b1c201b1c201b1c201b
-1c201b1c201b1c201b1c211b1c211b1c211c1c211c1c211c1d211c1d211c1d211c1d211c1d221c1d
-221c1d221c1d221c1d221c1d221d1d221d1e221d1e221d1e221d1e231d1e231d1e231d1e231d1e23
-1d1e241d1e241d1e241d1e241e1f241f20251f20251f20251f20251f20251f20
-
-1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b201a1b20
-1a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b211b1b201b1b201b1c201b1c201b1c201b
-1c201b1c201b1c201b1c211b1c211b1c211b1c211c1c211c1d211c1d211c1d211c1d211c1d211c1d
-221c1d221c1d221c1d221c1d221c1d221d1d221d1e221d1e221d1e221d1e231d1e231d1e231d1e24
-1d1e241d1e241d1e241d1e241e1e241f20241f20251f20251f20251f20251f20
-
-1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a201a1b20
-1a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b211b1b201b1b201b1c201b1c201b1c201b
-1c201b1c201b1c201b1c201b1c211b1c211b1c211c1c211c1c211c1d211c1d211c1d211c1d211c1d
-211c1d221c1d221c1d221c1d221c1d221d1d221d1d221d1e221d1e221d1e231d1e231d1e231d1e24
-1d1e241d1e241d1e241d1e241d1e241f20241f20251f20251f20251f20251f20
-
-1e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f1a1a201a1b20
-1a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b1f1a1b201b1b201b1b201b1c201b1c201b
-1c201b1c201b1c201b1c201b1c211b1c211b1c211b1c211c1c211c1c211c1d211c1d211c1d211c1d
-211c1d221c1d221c1d221c1d221c1d221c1d221d1d221d1e221d1e221d1e221d1e231d1e231d1e24
-1d1e241d1e241d1e241d1e241d1e241f1f241f20241f20251f20251f20251f20
-
-1e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a201a1a20
-1a1b201a1b201a1b201a1b201a1b201a1b201a1b201a1b1f1a1b201b1b201b1b201b1b201b1c201b
-1c201b1c201b1c201b1c201b1c201b1c211b1c211b1c211c1c211c1c211c1d211c1d211c1d211c1d
-211c1d211c1d221c1d221c1d221c1d221c1d221c1d221d1d221d1e221d1e221d1e221d1e241d1e24
-1d1e241d1e241d1e241d1e241d1e241e1f241f20241f20251f20251f20251f20
-
-1e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a20
-1a1b201a1b201a1b201a1b201a1b201a1b201a1b1f1a1b1f1a1b1f1a1b201b1b201b1b201b1c201b
-1c201b1c201b1c201b1c201b1c201b1c201b1c211b1c211b1c211c1c211c1c211c1d211c1d211c1d
-211c1d211c1d221c1d221c1d221c1d221c1d221c1d221d1d221d1e221d1e221d1e231d1e241d1e24
-1d1e241d1e241d1e241d1e241d1e241e1f241e1f241f20241f20251f20251f20
-
-1e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f1a1a1f
-1a1a201a1b201a1b201a1b201a1b201a1b1f1a1b1f1a1b1f1a1b1f1a1b201b1b201b1b201b1b201b
-1c201b1c201b1c201b1c201b1c201b1c201b1c211b1c211b1c211b1c211c1c211c1d211c1d211c1d
-211c1d211c1d211c1d221c1d221c1d221c1d221c1d221c1d221d1d221d1e221d1e231d1e231d1e24
-1d1e241d1e241d1e241d1e241d1e241e1f241e1f241f1f241f20241f20251f20
-
-1e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f
-1a1a201a1a201a1b201a1b201a1b201a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b201b1b201b1b201b
-1c201b1c201b1c201b1c201b1c201b1c201b1c201b1c211b1c211b1c211c1c211c1c211c1d211c1d
-211c1d211c1d211c1d211c1d221c1d221c1d221c1d221c1d221d1d221d1d231d1e231d1e231d1e24
-1d1e241d1e241d1e241d1e241d1e241e1f241e1f241e1f241f20241f20251f20
-
-1e19191e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f1a1a1f
-1a1a1f1a1a201a1b201a1b201a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b201b1b201b
-1b201b1c201b1c201b1c201b1c201b1c201b1c201b1c211b1c211b1c211b1c211c1c211c1c211c1d
-211c1d211c1d211c1d211c1d221c1d221c1d221c1d221c1d221c1d221d1d231d1e231d1e231d1e23
-1d1e241d1e241d1e241d1e241d1e241e1f241e1f241e1f241f1f241f20241f20
-
-1e18191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f
-1a1a1f1a1a201a1a201a1b201a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b201b1b201b
-1b201b1b201b1c201b1c201b1c201b1c201b1c201b1c201b1c211b1c211b1c211c1c211c1c211c1d
-211c1d211c1d211c1d211c1d211c1d221c1d221c1d221c1d221c1d231c1d231d1d231d1e231d1e23
-1d1e231d1e241d1e241d1e241d1e241e1f241e1f241e1f241e1f241f20241f20
-
-1e18191e19191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f191a1f
-191a1f1a1a1f1a1a201a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b201b
-1b201b1b201b1c201b1c201b1c201b1c201b1c201b1c201b1c201b1c211b1c211b1c211c1c211c1c
-211c1d211c1d211c1d211c1d211c1d221c1d221c1d221c1d221c1d231c1d231d1d231d1e231d1e23
-1d1e231d1e241d1e241d1e241d1e241e1f241e1f241e1f241e1f241e1f241f20
-
-1e18191e18191e19191e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f191a1f
-191a1f1a1a1f1a1a1f1a1a1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b201b
-1b201b1b201b1b201b1c201b1c201b1c201b1c201b1c201b1c201b1c211b1c211b1c211b1c211c1c
-211c1d211c1d211c1d211c1d211c1d211c1d221c1d221c1d231c1d231c1d231c1d231d1d231d1e23
-1d1e231d1e231d1e241d1e241d1e241e1f241e1f241e1f241e1f241e1f241f1f
-
-1e18191e18191e19191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f191a1f
-191a1f191a1e1a1a1e1a1a1f1a1a1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a
-1b201b1b201b1b201b1c201b1c201b1c201b1c201b1c201b1c201b1c201b1c211b1c211b1c211c1c
-211c1c211c1d211c1d211c1d211c1d211c1d211c1d221c1d231c1d231c1d231c1d231d1d231d1d23
-1d1e231d1e231d1e241d1e241d1e241e1f241e1f241e1f241e1f241e1f241e1f
-
-1e18191e18191e18191e19191e19191e19191e191a1e191a1f191a1f191a1f191a1f191a1f191a1f
-191a1f191a1e1a1a1e1a1a1e1a1a1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a
-1b1f1a1b201b1b201b1b201b1c201b1c201b1c201b1c201b1c201b1c201b1c211b1c211b1c211b1c
-211c1c211c1c211c1d211c1d211c1d211c1d211c1d231c1d231c1d231c1d231c1d231c1d231d1d23
-1d1e231d1e231d1e231d1e241d1e241e1f241e1f241e1f241e1f241e1f241e1f
-
-1e18191e18191e18191e18191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1f191a1f
-191a1e191a1e191a1e1a1a1e1a1a1f1a1a1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a
-1b1f1a1b201b1b201b1b201b1c201b1c201b1c201b1c201b1c201b1c201b1c201b1c211b1c211b1c
-211c1c211c1c211c1d211c1d211c1d211c1d211c1d221c1d231c1d231c1d231c1d231c1d231c1d23
-1d1d231d1e231d1e231d1e231d1e241e1f241e1f241e1f241e1f241e1f241e1f
-
-1e18191e18191e18191e18191e19191e19191e19191e19191e191a1f191a1f191a1f191a1f191a1e
-191a1e191a1e191a1e1a1a1e1a1a1e1a1a1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a
-1b1f1a1b1f1a1b201b1b201b1b201b1c201b1c201b1c201b1c201b1c201b1c201b1c201b1c211b1c
-211b1c211c1c211c1c211c1d211c1d211c1d221c1d221c1d231c1d231c1d231c1d231c1d231c1d23
-1d1d231d1e231d1e231d1e231d1e241e1f241e1f241e1f241e1f241e1f241e1f
-
-1e18191e18191e18191e18191e18191e19191e19191e19191e191a1e191a1f191a1f191a1e191a1e
-191a1e191a1e191a1e191a1e1a1a1e1a1a1f1a1a1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a
-1b1f1a1b1f1a1b201b1b201b1b201b1b201b1c201b1c201b1c201b1c201b1c201b1c201b1c211b1c
-211b1c211b1c211c1c211c1d211c1d221c1d221c1d221c1d221c1d231c1d231c1d231c1d231c1d23
-1c1d231d1d231d1e231d1e231d1e231e1f241e1f241e1f241e1f241e1f241e1f
-
-1e18191e18191e18191e18191e18191e19191e19191e19191e19191e191a1f191a1f191a1e191a1e
-191a1e191a1e191a1e191a1e191a1e1a1a1e1a1a1f1a1a1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a
-1b1f1a1b1f1a1b1f1a1b201b1b201b1b201b1c201b1c201b1c201b1c201b1c201b1c201b1c201b1c
-211b1c211b1c211c1c211c1c211c1d221c1d221c1d221c1d221c1d221c1d231c1d231c1d231c1d23
-1c1d231d1d231d1d231d1e231d1e231e1f241e1f241e1f241e1f241e1f241e1f
-
-1d18191e18191e18191e18191e18191e18191e19191e19191e19191e191a1e191a1e191a1e191a1e
-191a1e191a1e191a1e191a1e191a1e1a1a1e1a1a1e1a1a1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a
-1b1f1a1b1f1a1b1f1a1b201b1b201b1b201b1b201b1c201b1c201b1c201b1c201b1c201b1c201b1c
-211b1c211b1c211b1c211c1c221c1c221c1d221c1d221c1d221c1d221c1d231c1d231c1d231c1d23
-1c1d231c1d231d1d231d1e231d1e231e1f231e1f241e1f241e1f241e1f241e1f
-
-1d18191d18191e18191e18191e18191e18191e18191e19191e19191e19191d191a1e191a1e191a1e
-191a1e191a1e191a1e191a1e191a1e191a1e1a1a1e1a1a1f1a1a1f1a1b1f1a1b1f1a1b1f1a1b1f1a
-1b1f1a1b1f1a1b1f1a1b1f1a1b201b1b201b1b201b1c201b1c201b1c201b1c201b1c201b1c201b1c
-201b1c211b1c211b1c211c1c221c1c221c1d221c1d221c1d221c1d221c1d221c1d231c1d231c1d23
-1c1d231c1d231c1d231d1d231d1e231e1f231e1f231e1f241e1f241e1f241e1f
-
-1d18191d18191e18191e18191e18191e18191e18191e19191e19191d19191d19191d191a1e191a1e
-191a1e191a1e191a1e191a1e191a1e191a1e1a1a1e1a1a1e1a1a1f1a1b1f1a1b1f1a1b1f1a1b1f1a
-1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b201b1b201b1b201b1c201b1c201b1c201b1c201b1c201b1c
-201b1c201b1c211b1c221b1c221c1c221c1c221c1d221c1d221c1d221c1d221c1d231c1d231c1d23
-1c1d231c1d231c1d231d1d231d1e231e1f231e1f231e1f241e1f241e1f241e1f
-
-1d18191d18191d18191e18191e18191e18191e18191e18191d19191d19191d19191d191a1d191a1e
-191a1e191a1e191a1e191a1e191a1e191a1e191a1e1a1a1e1a1a1f1a1a1f1a1b1f1a1b1f1a1b1f1a
-1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b201b1b201b1b201b1b201b1c201b1c201b1c201b1c201b1c
-201b1c201b1c221b1c221b1c221c1c221c1c221c1d221c1d221c1d221c1d221c1d221c1d231c1d23
-1c1d231c1d231c1d231c1d231d1d231e1f231e1f231e1f231e1f241e1f241e1f
-
-1d18191d18191d18191e18191e18191e18191e18191d18191d19191d19191d19191d19191d191a1e
-191a1e191a1e191a1e191a1e191a1e191a1e191a1e191a1e1a1a1e1a1a1f1a1a1f1a1b1f1a1b1f1a
-1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b201b1b201b1b201b1c201b1c201b1c201b1c201b1c
-201b1c201b1c211b1c221b1c221b1c221c1c221c1c221c1d221c1d221c1d221c1d221c1d221c1d23
-1c1d231c1d231c1d231c1d231d1d231e1f231e1f231e1f231e1f241e1f241e1f
-
-1d18181d18191d18191d18191e18191e18191e18191d18191d18191d19191d19191d19191d191a1d
-191a1e191a1e191a1e191a1e191a1e191a1e191a1e191a1e1a1a1e1a1a1e1a1a1f1a1b1f1a1b1f1a
-1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b201b1b201b1b201b1b201b1c201b1c201b1c201b1c
-201b1c211b1c211b1c221b1c221b1c221b1c221c1c221c1c221c1d221c1d221c1d221c1d221c1d23
-1c1d231c1d231c1d231c1d231c1d231e1e231e1f231e1f231e1f231e1f241e1f
-
-1d18181d18181d18191d18191d18191e18191d18191d18191d18191d18191d19191d19191d19191d
-191a1e191a1e191a1e191a1e191a1e191a1e191a1e191a1e191a1e1a1a1e1a1a1f1a1a1f1a1b1f1a
-1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b201b1b201b1b201b1c201b1c201b1c201b1c
-211b1c211b1c211b1c211b1c221b1c221b1c221c1c221c1c221c1d221c1d221c1d221c1d221c1d22
-1c1d231c1d231c1d231c1d231c1d231e1e231e1e231e1f231e1f231e1f231e1f
-
-1d18181d18181d18191d18191d18191d18191d18191d18191d18191d18191d19191d19191d19191d
-19191d191a1e191a1e191a1e191a1e191a1e191a1e191a1e191a1e1a1a1e1a1a1e1a1a1f1a1b1f1a
-1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b201b1b201b1b201b1c201b1c201b1c
-211b1c211b1c211b1c211b1c221b1c221b1c221b1c221c1c221c1c221c1d221c1d221c1d221c1d22
-1c1d231c1d231c1d231c1d231c1d231d1e231e1e231e1f231e1f231e1f231e1f
-
-1d18181d18181d18181d18191c18191c18191d18191d18191d18191d18191d18191d19191d19191d
-19191d191a1d191a1e191a1e191a1e191a1e191a1e191a1e191a1e191a1e1a1a1e1a1a1f1a1a1f1a
-1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b201b1b201b1b201b1b201b1c211b1c
-211b1c211b1c211b1c211b1c211b1c221b1c221b1c221c1c221c1c221c1d221c1d221c1d221c1d22
-1c1d221c1d231c1d231c1d231c1d231d1e231d1e231e1e231e1f231e1f231e1f
-
-1d18181d18181d18181c18191c18191c18191d18191d18191d18191d18191d18191d19191d19191d
-19191d19191d191a1e191a1e191a1e191a1e191a1e191a1e191a1e191a1e191a1e1a1a1e1a1a1f1a
-1a1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b1f1a1b201b1b201b1b211b1c211b1c
-211b1c211b1c211b1c211b1c211b1c211b1c221b1c221b1c221c1c221c1c221c1d221c1d221c1d22
-1c1d221c1d221c1d231c1d231c1d231d1e231d1e231e1e231e1f231e1f231e1f
-
-Q
-Q
-Q
-Q
-Q
-q
-n
-68.8 302.4 m
-44.4 286.5 16.1 246.6 10 204.1 c
-17.2 205.4 10.7 219.8 19.7 219.5 c
-24.2 239.3 24.2 253.9 66.6 298.6 c
-66.6 299.4 71.7 301.6 68.9 302.4 c
-68.8 302.4 l
-h
-W*
-q
-q
-n
-10 268 m
-74 268 l
-74 204 l
-10 204 l
-10 268 l
-h
-W
-q
-q
-[64 0 0 64 10 204]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-342f2f342f2f342f2e342f2e342f2e342f2e342f2e342f2e342f2e342f2f352f2f352f2f352f2f35
-2f2f35302f35302f35302f353030363030352f30352f303530303530303630313630313630313631
-313731313731323731323732323832323933343933343934343a34343a34353a34353b35353b3536
-3b35363c35363c36363c36373d36373d37373d37383e37383e38383f38393f38393f393940393a40
-3a3a413a3b413a3b413b3b423b3c423b3c433c3d433c3d443d3d443d3e443d3e
-
-332e2f332e2f332e2e332e2e332e2e342e2e342e2e342e2e342e2e342f2e342f2e342f2e342f2e34
-2f2e342f2f352f2f352f2f352f2f342f2f342f2f342f2f352f30352f30352f303530303530303630
-313630313630313631313731323731323833333933333933343933343a34343a34343a34353a3435
-3b35353b35363c35363c36363c36373d36373d37373d37383e37383e38383f38393f38393f393940
-393a403a3a413a3b413a3b413b3b423b3c423b3c433c3c433c3d443d3d443d3e
-
-332e2e332e2e332e2d332e2d332e2d332e2d332e2d332e2d332e2d332e2d332e2e332e2e342e2e34
-2e2e342e2e342f2e342f2e342f2e332e2f342e2f342e2f342f2f342f2f342f2f352f30352f303530
-303530303630313630313630313631313832333832333833333933333933343933343a34343a3435
-3a34353b35353b35363b35363c36363c36373c36373d37373d37383e37383e38383e38393f38393f
-393940393a40393a413a3b413a3b413b3b423b3c423b3c433c3c433c3d443d3d
-
-322d2d322d2e322d2d322d2d322d2d322d2d322d2d322d2d322d2d332d2d332d2d332e2d332e2d33
-2e2d332e2d332e2e332e2e332d2e332e2e332e2e332e2e332e2f342e2f342e2f342f2f342f2f352f
-30352f30352f30353030363031363031373132373232383233383233383333393333393334393434
-3a34343a34353a34353b35353b35363c35363c36363c36373d36373d37373e37383e38383e38393f
-38393f393940393a40393a403a3a413a3b413b3b423b3c423b3c433c3c433c3d
-
-322c2d322c2d322c2c322c2c322d2c322d2c322d2c322d2c322d2c322d2c322d2c322d2d322d2d32
-2d2d332d2d332d2d322d2d322d2d322d2d322d2e332d2e332e2e332e2e332e2e332e2f342e2f342f
-2f342f2f342f30352f30352f30353030373132373132373232383232383233383233393333393334
-3933343a34343a34353a34353b35353b35363b35363c36363c36373d36373d37373d37383e37383e
-38393f38393f393940393a40393a403a3a413a3b413b3b423b3c423b3c433c3d
-
-312c2c312c2c312c2b312c2b312c2b312c2c312c2c312c2c312c2c312c2c312c2c322c2c322d2c32
-2d2c322d2c322d2c312c2d312c2d322c2d322d2d322d2d322d2d322d2e332d2e332e2e332e2e332e
-2f342e2f342e2f342f2f342f30352f30363131363131373132373132373232383233383233383333
-3933333933343934343a34343a34353b35353b35353b35363c36363c36373d36373d37373d37383e
-37383e38383f38393f393940393a40393a403a3a413a3b413b3b423b3c423b3c
-
-302b2c302b2c302b2b302b2b302b2b302b2b302c2b312c2b312c2b312c2b312c2b312c2b312c2c31
-2c2c312c2c302b2c312c2c312c2c312c2c312c2d312c2d322c2d322d2d322d2d322d2e332d2e332e
-2e332e2e332e2e342e2f342e2f342f2f363031363031363131363131373132373132383232383233
-3832333933333933343933343a34343a34353a34353b35353b35363c35363c36373d36373d37373d
-37383e37383e38383f38393f393940393a40393a403a3a413a3b413b3b423b3c
-
-302b2b302b2b302b2a302b2a302b2a302b2a302b2a302b2a302b2b302b2b302b2b302b2b302b2b31
-2c2b312b2b302b2b302b2c302b2c302b2c312c2c312c2c312c2c312c2d312c2d322d2d322d2d322d
-2e332d2e332e2e332e2e332e2f342e2f353030353030363031363031363131373132373132373232
-3832333832333833333933343933343a34343a34353a34353b35353b35363c35363c36363c36373d
-37373d37383e37383e38383f38393f393940393a40393a413a3b413a3b413b3b
-
-2f2a2b2f2a2b2f2a2a2f2a2a2f2a2a2f2a2a2f2a2a2f2a2a2f2b2a2f2b2a302b2a302b2a302b2a30
-2b2b2f2a2b2f2a2b2f2b2b302b2b302b2b302b2c302b2c302b2c312c2c312c2c312c2d312c2d322c
-2d322d2d322d2e332d2e332e2e332e2e342f30352f30353030353030363031363131363131373132
-3731323832323832333833333933333933343a34343a34353a34353b35353b35363c35363c36363c
-36373d37373d37383e37383e38383f38393f393940393a40393a413a3b413a3b
-
-2e2a2a2e2a2a2e2a292e2a292e2a292f2a292f2a292f2a292f2a292f2a2a2f2a2a2f2a2a2f2a2a2e
-2a2a2e2a2a2f2a2a2f2a2a2f2a2b2f2a2b2f2a2b302b2b302b2b302b2c302b2c312c2c312c2c312c
-2c312c2d322c2d322d2d322d2e332d2e342f2f342f2f352f30352f30353030363031363031363131
-3731323731323732323832333832333933333933343934343a34353a34353b35353b35363c35363c
-36363c36373d37373d37383e37383e38383f38393f393940393a403a3a413a3b
-
-2e292a2e292a2e29292e29292e29292e29292e29292e29292e29292e29292e2a292e2a292f2a292e
-29292e292a2e292a2e292a2e2a2a2f2a2a2f2a2a2f2a2b2f2a2b302b2b302b2b302b2c302b2c312b
-2c312c2c312c2c312c2d322d2d322d2d332e2f342e2f342f2f342f30352f30353030353031363031
-3631313731313731323732323832333832333933333933343933343a34343a34353b35353b35363c
-35363c36363c36373d37373d37383e37383e38393f38393f393940393a403a3a
-
-2d29292d29292d29282d29282d29282d29282d29282d29282d29282e29282e29282e29292d28292d
-28292d29292d29292e29292e292a2e292a2e292a2e2a2a2f2a2a2f2a2a2f2a2b2f2b2b302b2b302b
-2b302b2c312b2c312c2c312c2d312c2d332e2e332e2e332e2f342f2f342f2f352f30352f30353030
-3630313631313631313731323732323832333832333933333933343933343a34343a34353b35353b
-35363c35363c36363d36373d37373d37383e37383e38393f38393f393940393a
-
-2c28282c28282c28272d28272d28282d28282d28282d28282d28282d28282d29282d29282c28282d
-28282d28282d28292d28292d29292d29292e29292e292a2e292a2e2a2a2f2a2a2f2a2a2f2a2b2f2a
-2b302b2b302b2c302b2c312c2c312c2c322d2e332d2e332e2e332e2f342e2f342f2f342f30352f30
-3530303630313630313631313731323731323832323832333833333933343933343a34343a34353b
-35353b35363c35363c36373d36373d37373d37383e38383e38393f38393f3939
-
-2c27282c27282c27272c27272c28272c28272c28272c28272c28272c28272c28272c27282c27282c
-27282c27282c28282c28282d28282d28292d28292d29292e29292e29292e292a2e2a2a2f2a2a2f2a
-2a2f2a2b2f2b2b302b2b302b2c302b2c322d2d322d2d322d2e332e2e332e2e342e2f342f2f342f2f
-352f303530303530313630313631313731323731323832323832333833333933343933343a34343a
-34353b35353b35363c35363c36373d36373d37373e37383e38383f38393f3839
-
-2b27272b27272b27262b27262b27262b27262b27262c27272c27272c27272c26272b27272b27272b
-27272b27272c27282c27282c27282c28282c28282d28282d28292d28292d29292e29292e292a2e2a
-2a2f2a2a2f2a2a2f2a2b302b2b302b2b312c2c322d2d322d2d322d2e332d2e332e2e332e2f342f2f
-342f2f352f303530303530303630313631313731323731323832323832333833333933343933343a
-34343a34353b35353b35363c35363c36373d36373d37373e37383e38383f3839
-
-2b26272b26272b26262b26262b26262b26262b27262b27262b27262b27262a26262a26262b26272b
-26272b26272b27272b27272b27272c27282c27282c28282c28282d28282d28292d28292d29292e29
-292e292a2e2a2a2f2a2a2f2a2b2f2a2b312c2b312c2c312c2c322d2d322d2e332d2e332e2e332e2f
-342e2f342f2f352f3035303035303036303136313137313237313238323238323338333339333439
-33343a34353a34353b35353b35363c36363c36373d36373d37383e37383e3838
-
-2a26262a26262a26252a26252a26252a26252a26252a26252a26262a25262a25262a25262a26262a
-26262a26262a26262b26272b26272b27272b27272c27272c27282c27282c28282d28282d28292d28
-292e29292e292a2e292a2e2a2a2f2a2a302b2b312c2b312c2b312c2c322d2d322d2d322d2e332e2e
-332e2f342e2f342f2f342f30352f3035303036303136313137313237313238323238323339333339
-33343934343a34353a34353b35353b35363c36363c36373d37373d37383e3738
-
-2925262925262925252925252925252925252a25252a25252a262529252529252529252529252529
-25262a25262a26262a26262a26262a26262b26272b27272b27272b27272c27282c27282c28282d28
-282d28292d29292e29292e292a2e2a2a302b2a302b2b302b2b312c2b312c2c322c2c322d2d322d2e
-332e2e332e2e342e2f342f2f342f30352f3035303036303136313137313237313238323238323339
-33333933343a34343a34353b34353b35353b35363c36363c36373d37373e3738
-
-29252529252529252429252429252429252429252429252429242428242428242529242529242529
-25252925252925252925262a25262a26262a26262a26262b26272b26272b27272b27272c27282c28
-282c28282d28292d28292d29292e29292f2a2a302b2a302b2a302b2b312c2b312c2c312c2c322d2c
-322d2e332d2e332e2e342e2f342f2f342f30352f3035303036303136313137313237313238323338
-32333933333933343a34343a34353b35353b35363c35363c36373d36373d3737
-
-28242428242428242328242328242428242428242428242428232428242428242428242428242428
-24242824252924252925252925252925252a25262a26262a26262a26262b26272b27272b27272c27
-272c27282c28282d28282d28292d29292f2a292f2a2a2f2b2a302b2a302b2b312c2b312c2b312c2c
-322d2d322d2e332d2e332e2e342e2f342f2f342f30352f3035303036303136313137313237323238
-32333832333933333933343a34343a34353b35353b35363c36363c36373d3637
-
-27242427242427242328242328242328242328242328232327232327232327232427232427232428
-24242824242824242824242824252925252925252925252a25262a25262a26262a26262b26272b27
-272b27272c27282c27282c28282d28292e29292f2a292f2a2a2f2b2a302b2a302b2b312c2b312c2b
-312c2c322d2c322d2d332d2e332e2e342e2f342f2f342f3035303035303136303136313137313237
-32323832333833333933343933343a34343a34353b35353b35363c36363c3637
-
-27232327232327232227232227232227232227232326222326222326222327232327232327232327
-23232723242723242824242824242824242824252924252925252925252a25262a26262a26262a26
-262b26272b27272c27272c27282c28282e29282e29292e2a292f2a2a2f2a2a302b2a302b2b302c2b
-312c2b312c2c322d2c322d2d332d2e332e2e342e2f342f2f352f3035303036303136303136313137
-31323732323832333833333933343934343a34353b34353b35363c35363c3636
-
-26222326222326222226222226232226232226222226222226222226222226222226222326222326
-23232723232723232723232723242823242824242824242824252924252925252925252a25262a26
-262a26262b26272b27272b27272c27282d29282e29282e29292e2a292f2a292f2a2a302b2a302b2b
-302c2b312c2b312c2c322d2c322d2d332e2d332e2e342e2f342f2f352f3035303036303136313137
-31323731323832323832333933333933343a34343a34353b35353b35363c3636
-
-26222226222226222126222126222126222125212125212225212225212225222225222226222226
-22222622222622232623232723232723232723242823242824242824242824252925252925252925
-262a25262a26262a26262b26272b27272d28282d28282d29282e29292e2a292f2a292f2a2a302b2a
-302b2b302c2b312c2b312c2c322d2c322d2d332e2d332e2e342e2e342f2f352f3035303036303136
-31313731323731323832333832333933333933343a34343a34353b35353b3536
-
-25212225212225212125212125212125202124202124212124212125212125212125212125212225
-21222522222622222622222622232622232723232723232723242823242824242824242924252925
-252925252a25262a26262a26262b26272c28272d28272d28282d29282e29292e2a292f2a292f2a2a
-302b2a302b2b302c2b312c2b312c2c322d2c322d2d332e2d332e2e342f2e342f2f352f3035303036
-30313631313731323732323832333833333933343934343a34353b34353b3536
-
-24212124212124212024212024212023202024202024202024202024202124202124212124212125
-21212521212521222522222622222622222622232622232723232723232723242824242824242824
-252925252925252925262a26262a26262c27272c28272c28272d28282d29282e29292e2a292f2a29
-2f2a2a302b2a302b2b312c2b312c2b312c2c322d2c322d2d332e2d332e2e342f2e342f2f35302f35
-30303630313631313731323832323832333933333933343a34343a34353b3535
-
-24202024202024201f242020242020231f20231f2023202023202023202024202024202024202124
-20212421212521212521212521222521222622222622222622232623232723232723242723242824
-242824242924252925252925262a25262b27262c27272c28272c28272d28282d29282e29292e2a29
-2f2a292f2a2a302b2a302b2b312c2b312c2c322c2c322d2c332d2d332e2d342e2e342f2e352f2f35
-302f3630303631313731313731323832333832333933333933343a34343a3435
-
-23202023202023201f23201f221f1f221f1f221f1f221f1f231f1f231f20231f20231f2023202023
-20202420202420212420212421212521212521222522222622222622222622232723232723232723
-242824242824242824252925252925252b26262b27262c27272c28272c28272d28282d29282e2929
-2e2a292f2a292f2a2a302b2a302b2b312c2b312c2c322d2c322d2d332d2d332e2d342e2e342f2e35
-2f2f35302f3630303631303731313732323832333833333933343a34343a3435
-
-221f1f221f1f221f1e221f1e221e1e221e1e221e1f221e1f221f1f221f1f221f1f221f1f231f1f23
-1f202320202320202420202420212420212421212521212521222522222622222622232623232723
-232723242824242824242824252925252a26252b26262b27262c27272c28272c28272d28282d2928
-2e29292e2a292f2a2a2f2b2a302b2a302b2b312c2b312c2c322d2c322d2d332e2d332e2e342f2e34
-2f2f352f2f3530303630303731303731313832313832323933333933343a3434
-
-221e1f221e1f221e1e211d1e211e1e211e1e211e1e211e1e211e1e221e1e221e1f221e1f221f1f22
-1f1f231f1f231f20231f202320202420202420212420212521212521212521222622222622222622
-232723232723232823242824242824252a26252a26252b26262b27262c27272c28272c28272d2828
-2d29282e29292e2a292f2a2a2f2b2a302b2a302b2b312c2b312c2c322d2c322d2d332e2d342e2e34
-2f2e352f2f35302f363030363130373131373231383232383332393333393434
-
-211e1e211e1e211e1d201d1d201d1d201d1d201d1d211d1e211d1e211e1e211e1e211e1e211e1e22
-1e1f221f1f221f1f221f1f231f20231f202320202420202420212421212521212521222522222622
-222622232723232723232723242824242925252a26252a26252b26262b27262c27272c28272d2827
-2d28282e29282e29292f2a292f2a2a302b2a302b2b312c2b312c2c322d2c322d2c332d2d332e2d34
-2e2e342f2e352f2f35302f363030363130373131383231383232393332393333
-
-211d1e211d1e211c1d201c1d201c1d201d1d201d1d201d1d201d1d201d1d201d1d211d1e211e1e21
-1e1e211e1e221e1e221e1f221f1f221f1f231f202320202320202420202420212521212521222522
-222622222622232723232723232723242925242925252a26252a26252b26262b27262c27272c2827
-2d28282d29282e29282e29292f2a292f2a2a302b2a302b2b312c2b312c2c322d2c322d2d332e2d33
-2e2e342f2e342f2f35302f363030363130373131373231383232383332393333
-
-201d1d201d1d1f1c1c1f1c1c1f1c1c1f1c1c1f1c1c1f1c1c201c1d201c1d201d1d201d1d201d1d21
-1d1e211d1e211e1e211e1e221e1e221f1f221f1f231f1f231f202320202420202420212421212521
-212521222622222622232723232723232824242925242925252a26252a26252b26262b27262c2727
-2c28272d28282d29282e29292e2a292f2a2a2f2b2a302b2a302b2b312c2b312c2c322d2c332d2d33
-2e2d342e2e342f2e352f2f35302f363030363130373131373231383232393332
-
-1f1c1c1f1c1c1e1b1c1e1b1c1e1b1c1f1b1c1f1c1c1f1c1c1f1c1c1f1c1c1f1c1c1f1c1d201d1d20
-1d1d201d1d201d1d211d1e211e1e211e1e221e1f221f1f221f1f231f202320202420202420212421
-212521212521222622222622232824232824232824242925242925252a26252a26262b27262b2726
-2c27272c28272d28282d29282e29292e2a292f2a2a302b2a302b2b312c2b312c2c322d2c322d2d33
-2e2d332e2e342f2e342f2f35302f363030363130373131373131383232383332
-
-1f1c1c1e1b1b1e1b1b1e1b1b1e1b1b1e1b1b1e1b1b1e1b1b1e1b1c1e1b1c1f1c1c1f1c1c1f1c1c1f
-1c1c201c1d201d1d201d1d211d1e211e1e211e1e221e1e221e1f221f1f231f1f2320202320202420
-212421212521212521222622222723232824232824232924242925242925252a26252a26262b2726
-2c27272c28272d28272d28282e29282e29292f2a292f2a2a302b2a302b2b312c2b312c2c322d2c32
-2d2d332e2d342e2e342f2e352f2f35302f363030363130373131373231383232
-
-1e1b1b1d1a1a1d1a1a1d1a1a1d1a1a1d1a1b1d1a1b1e1b1b1e1b1b1e1b1b1e1b1b1e1b1c1f1b1c1f
-1c1c1f1c1c1f1c1c201c1d201d1d201d1d211d1e211e1e211e1e221e1f221f1f231f1f231f202320
-202420212421212521212621222723222723232824232824232925242925242a25252a26252b2626
-2b27262c27272c28272d28282d29282e29292e2a292f2a2a2f2b2a302b2b302c2b312c2c322d2c32
-2d2c332d2d332e2e342f2e342f2f35302f363030363130373131373231383232
-
-1d1b1b1c1a1a1c1a1a1c1a1a1d1a1a1d1a1a1d1a1a1d1a1a1d1a1a1d1a1b1e1b1b1e1b1b1e1b1b1e
-1b1b1f1b1c1f1c1c1f1c1c1f1c1d201d1d201d1d211d1e211e1e211e1e221e1f221f1f231f1f231f
-202320202420212421212622212622222723222723232824232824242925242925242a26252a2625
-2b26262b27262c27272c28272d28282d29282e29292f2a292f2a2a302b2a302b2b312c2b312c2c32
-2d2c322d2d332e2d342e2e342f2e352f2f35302f363030363130373131383231
-
-1c19191c19191c19191c19191c19191c19191c191a1c191a1c1a1a1d1a1a1d1a1a1d1a1a1d1a1b1e
-1b1b1e1b1b1e1b1b1f1c1c1f1c1c1f1c1c201c1d201d1d201d1d211d1e211e1e221e1f221f1f231f
-1f231f202320202520212522212622212623222723222723232824232824242925242925252a2625
-2a26262b27262b27262c28272d28282d29282e29282e2a292f2a292f2b2a302b2a302c2b312c2c32
-2d2c322d2c332d2d332e2e342f2e342f2f35302f363030363130373131373231
-
-1b18191b18191b18191b19191b19191b19191c19191c19191c19191c191a1c191a1d1a1a1d1a1a1d
-1a1a1d1a1b1e1b1b1e1b1b1e1b1c1f1c1c1f1c1c201c1d201d1d201d1d211d1e211e1e221e1f221f
-1f231f1f231f202421202521212522212622222623222723222724232824232924242925242a2525
-2a26252b26262b27262c27272c28272d28282d29282e29292e2a292f2a2a302b2a302b2b312c2b31
-2c2c322d2c322d2d332e2d342e2e342f2e352f2f35302f363030363130373131
-
-1a18181a18181b18181b18181b18181b18181b18181b18191b19191c19191c19191c19191c191a1d
-1a1a1d1a1a1d1a1a1e1b1b1e1b1b1e1b1b1f1c1c1f1c1c1f1c1d201d1d201d1d211d1e211e1e221e
-1f221f1f241f1f242120252120252121262221262222272322272323282423282424292524292524
-2a26252a26252b27262b27262c28272d28272d28282e29282e29292f2a292f2b2a302b2a302c2b31
-2c2c322d2c322d2d332e2d332e2e342f2e352f2f35302f363030363130373131
-
-1a17171a17181a17181a17181a17181a18181a18181b18181b18181b18181b18191b19191c19191c
-19191c191a1d1a1a1d1a1a1d1a1b1e1b1b1e1b1b1f1c1c1f1c1c1f1c1c201d1d201d1d211d1e211e
-1e221e1f23201f24201f242120252120252121262221262222272322272323282423282424292524
-2925252a26252b26262b27262c27272c28272d28282d29282e29292e2a292f2a2a302b2a302b2b31
-2c2b312c2c322d2c332d2d332e2d342e2e342f2e352f2f353030363030373131
-
-1917171917171917171917171917171a17171a17171a17181a18181a18181b18181b18181b18191b
-19191c19191c191a1d1a1a1d1a1a1d1a1b1e1b1b1e1b1b1f1b1c1f1c1c1f1c1d201d1d201d1d211d
-1e211e1e231f1f23201f242020242120252120252221262221262322272322282423282423292524
-2925242a25252a26252b27262b27262c28272d28272d29282e29282e2a292f2a2a2f2b2a302b2b31
-2c2b312c2c322d2c322d2d332e2d332e2e342f2e352f2f35302f363030363130
-
-1916161916161916161916161916171917171917171917171a17171a17171a17181a18181b18181b
-18181b19191c19191c19191c1a1a1d1a1a1d1a1b1e1b1b1e1b1b1f1b1c1f1c1c1f1c1d201d1d201d
-1d221f1e221f1e23201f23201f242020242120252121262221262222272322272323282423282424
-2925242925252a26252b26262b27262c27272c28272d28282d29282e29292f2a292f2a2a302b2a30
-2b2b312c2b312c2c322d2c332d2d332e2e342f2e342f2f35302f363030363130
-
-1816161816161816161816161816161816161916161916161917171917171917171a17171a17181a
-18181b18181b18191c19191c19191c191a1d1a1a1d1a1a1e1b1b1e1b1b1f1c1c1f1c1c201c1d201d
-1d221e1e221f1e231f1e23201f24201f242120252120252221262221262322272322272423282423
-2924242925242a25252a26252b27262b27262c28272d28272d29282e29292e2a292f2a2a2f2b2a30
-2b2b312c2b312c2c322d2c322d2d332e2d342e2e342f2e352f2f35302f363030
-
-1715151715151715151715151815151815161816161816161816161916161916171917171a17171a
-17181a18181b18181b18191b19191c19191c191a1d1a1a1d1a1b1e1b1b1e1b1b1f1c1c1f1c1c201c
-1d211e1d221e1e221f1e231f1f23201f242020242120252121252221262222272322272323282423
-2824242925242925252a26252b26262b27262c27272c28272d28282d29282e29292f2a292f2a2a30
-2b2a302c2b312c2c322d2c322d2d332e2d332e2e342f2e352f2f35302f363030
-
-17141517151517151517151517151517151517151518151518151618161618161619161619171719
-17171a17171a18181b18181b18181b19191c19191c191a1d1a1a1d1a1b1e1b1b1e1b1b1f1c1c201d
-1c211e1d211e1d221f1e221f1e23201f24201f242020252120252121262221262322272322272423
-2824232925242925242a26252a26252b27262c27272c28272d28282d29282e29292e2a292f2a2a30
-2b2a302b2b312c2b312c2c322d2c332d2d332e2e342f2e342f2f35302f363030
-
-16141416141416141416141416141417141417151517151517151517151518151618161618161619
-16171917171a17171a18181b18181b18181b19191c19191c1a1a1d1a1a1d1a1b1e1b1b1e1b1c201d
-1c201d1d211e1d221e1e221f1e231f1f23201f242020242120252121252221262222272322272323
-2824232824242925242a25252a26252b26262b27262c27272c28272d28282e29282e2a292f2a2a2f
-2b2a302b2b312c2b312c2c322d2c322d2d332e2d342e2e342f2e352f2f353030
-
-15131415131416131416141416141416141416141416141417141517151517151518151518161618
-16161916161917171a17171a18181b18181b18191c19191c19191d1a1a1d1a1a1e1b1b1f1b1b201d
-1c201d1c211d1d211e1d221e1e221f1e23201f23201f242020252120252121262221262322272322
-2824232824232925242925252a26252a26262b27262c27272c28272d28282d29282e29292f2a292f
-2a2a302b2a302c2b312c2c322d2c322d2d332e2d342e2e342f2e352f2f35302f
-
-15131315131315131315131315131315131316131416141416141416141417151517151517151518
-16161816161916161917171a17171a18181b18181b18191c19191c191a1d1a1a1d1a1b1f1c1b1f1c
-1c201d1c201d1c211e1d221e1e221f1e231f1f23201f242020242120252121262221262222272322
-2723232824232824242925242a25252a26252b27262b27262c28272d28282d29282e29292e2a292f
-2a2a302b2a302b2b312c2b322c2c322d2c332e2d332e2e342f2e352f2f35302f
-
-14121214121214121214121315131315131315131315131316131416141416141417141517151517
-15151815161816161916161917171a17171a18181b18181b19191c19191c191a1d1a1a1e1c1b1f1c
-1b201c1c201d1c211d1d211e1d221e1e221f1e23201f24201f242120252120252221262221272322
-2723232824232824242925242925252a26252b26262b27262c27272d28272d29282e29282e2a292f
-2a2a302b2a302b2b312c2b312c2c322d2c332d2d332e2d342f2e342f2f35302f
-
-14121214121214121214121214121214121214121315131315131315131316141416141417141417
-15151715151816161816161916171917171a17181a18181b18181b19191c19191e1b1a1e1b1a1f1c
-1b1f1c1b201d1c201d1c211e1d221e1e221f1e231f1f23201f242020252120252121262221262322
-2723222724232824232925242925252a26252b26262b27262c27272c28272d28282e29282e29292f
-2a292f2b2a302b2b312c2b312c2c322d2c322d2d332e2d342e2e342f2e352f2f
-
-13111113111113111113111113111214121214121214121214131315131315131316141416141417
-14141715151715151816161916161917171a17171a18181b18181b18191c19191d1a1a1e1b1a1e1c
-1b1f1c1b201d1c201d1c211e1d211e1d221f1e231f1e23201f24201f242120252121262221262222
-2723222723232824232924242925242a26252a26252b27262c27272c28272d28282d29282e29292f
-2a292f2a2a302b2a302c2b312c2c322d2c322d2d332e2d342e2e342f2e352f2f
-
-12111112111112111113111113111113111113111214121214121214121215131315131316141416
-14141714151715151815151816161916161917171a17171a18181b18181b19191d1a191e1b1a1e1b
-1a1f1c1b1f1c1c201d1c211d1d211e1d221e1e221f1e231f1f24201f242120252120252221262222
-2723222723232824232824242925242a25252a26252b27262b27262c28272d28282d29282e29292e
-2a292f2a2a302b2a302b2b312c2b322d2c322d2d332e2d332e2e342f2e352f2f
-
-12101012101012101012101012101112111113111113111113121214121214121215131315131316
-14141614141715151715151815161816161916171917171a17181b18181c19191d1a191d1b1a1e1b
-1a1f1c1b1f1c1b201d1c201d1c211e1d221e1e221f1e231f1f23201f242020252120252121262221
-2623222723222824232824242925242925252a26252b26262b27262c27272d28272d29282e29292e
-2a292f2a2a302b2a302b2b312c2b312c2c322d2c332e2d332e2e342f2e352f2f
-
-110f10110f1011101011101012101012101012101113111113111113121214121214121215131315
-13131614141614141715151815151816161916161917171a17171a18181c19181d1a191d1a1a1e1b
-1a1e1b1b1f1c1b201c1c201d1c211e1d211e1d221f1e231f1e23201f242020242120252121262221
-2622222723222724232824232925242925252a26252b26262b27262c27272c28272d28282e29282e
-2a292f2a2a302b2a302b2b312c2b312c2c322d2c332d2d332e2e342f2e342f2f
-
-100f0f100f0f110f0f110f0f110f1011101012101012101013111113111113121214121214131315
-13131613141614141714151715151815161816161917171a17171a18181c19181c1a191d1a191e1b
-1a1e1b1a1f1c1b1f1c1c201d1c211d1d211e1d221e1e221f1e23201f24201f242120252121252221
-2622222723222723232824232925242925242a26252a26262b27262c27272c28272d28282e29282e
-29292f2a2a2f2b2a302b2b312c2b312c2c322d2c332d2d332e2d342e2e342f2f
-
-100e0e100e0e100f0f100f0f100f0f110f0f11101012101012101013111113111114121214121215
-13131513131614141614141715151815151816161916161917171a17181c19181c19191d1a191d1b
-1a1e1b1a1f1c1b1f1c1b201d1c201d1d211e1d221e1e221f1e231f1f24201f242120252120252221
-2622222723222723232824232824242925242a26252a26252b27262c27272c28272d28282d29282e
-29292f2a292f2b2a302b2b312c2b312c2c322d2c322d2d332e2d342e2e342f2e
-
-0f0e0e0f0e0e0f0e0e100e0e100e0e100f0f110f0f11101012101012101113111113111214121214
-12131513131614141614141715151715151816161916161917171b18171b19181c19181d1a191d1a
-1a1e1b1a1e1c1b1f1c1b201d1c201d1c211e1d221e1e221f1e231f1f23201f242020252120252221
-2622212723222723232824232824242925242a25252a26252b27262c27272c28272d28282d29282e
-29292f2a292f2a2a302b2a312c2b312c2c322d2c322d2d332e2d342e2e342f2e
-
-0f0d0d0f0d0d0f0d0d0f0e0e0f0e0e100e0e100f0f110f0f11101012101012111113111114121214
-12121513131513131614141714151715151815161816161917171b18171b19181c19181c1a191d1a
-1a1e1b1a1e1b1b1f1c1b201d1c201d1c211e1d211e1d221f1e231f1f23201f242020252120252121
-2622212623222723222824232824242925242a25252a26252b27262b27262c28272d28282d29282e
-29292f2a292f2a2a302b2a302c2b312c2c322d2c322d2d332e2d342e2e342f2e
-
-0e0d0d0e0d0d0e0d0d0f0d0d0f0e0e0f0e0e100f0f100f0f110f1012101012101113111113121214
-12121513131513131614141614141715151815161816161916171b18171b19181c19181c1a191d1a
-191e1b1a1e1b1b1f1c1b1f1c1c201d1c211e1d211e1d221f1e231f1e23201f242020242120252121
-2622212623222723222824232824242925242925252a26252b26262b27262c28272d28282d29282e
-29292f2a292f2a2a302b2a302b2b312c2c322d2c322d2d332e2d342e2e342f2e
-
-0d0c0c0d0c0c0e0c0c0e0d0d0f0d0d0f0e0e100e0e100f0f110f0f11101012101013111113111114
-12121413131513131614141614141715151815151816161a16161a18171b18181c19181c1a191d1a
-191e1b1a1e1b1a1f1c1b1f1c1c201d1c211d1d211e1d221f1e231f1e23201f242020242120252121
-2622212623222723222824232824242925242925252a26252b26262b27262c28272d28282d29282e
-29292e2a292f2a2a302b2a302b2b312c2b322d2c322d2d332e2d342e2e342f2e
-
-0d0c0c0d0c0c0d0c0c0e0c0c0e0d0d0f0d0e0f0e0e100f0f110f0f11101012101012111113111114
-12121412121513131614141614141715151715151816161a17161a18171b18181c19181c1a191d1a
-191d1b1a1e1b1a1f1c1b1f1c1c201d1c211d1d211e1d221f1e231f1e23201f242020242120252121
-2622212622222723222824232824242925242925252a26252b26262b27262c28272d28272d29282e
-29292e2a292f2a2a302b2a302b2b312c2b322d2c322d2d332e2d332e2e342f2e
-
-0c0b0b0c0b0b0d0c0c0d0c0c0e0d0d0f0d0d0f0e0e100e0e110f0f11101012101012111113111114
-12121412121513131613141614141715151715151816161a17161a18171b18181c19181c19191d1a
-191d1b1a1e1b1a1f1c1b1f1c1c201d1c211d1d211e1d221e1e221f1e23201f242020242120252121
-2622212622222723222824232824232925242925252a26252b26262b27262c27272d28272d29282e
-29292e2a292f2a2a302b2a302b2b312c2b322d2c322d2d332e2d332e2e342f2e
-
-0c0b0b0c0b0b0d0c0c0d0c0c0e0d0d0f0d0d0f0e0e100e0e100f0f11101012101012111113111114
-12121412121513131613141614141715151715151816161a17161a18171b18181c19181c19191d1a
-191d1b1a1e1b1a1f1c1b1f1c1c201d1c211d1d211e1d221e1e221f1e23201f242020242120252121
-2622212622222723222824232824232925242925252a26252b26262b27262c27272d28272d29282e
-29292e2a292f2a2a302b2a302b2b312c2b322d2c322d2d332e2d332e2e342f2e
-
-Q
-Q
-Q
-Q
-q
-q
-n
-10 332 m
-74 332 l
-74 268 l
-10 268 l
-10 332 l
-h
-W
-q
-q
-[64 0 0 64 10 268]cm
-/buf 192 string def
-64 64 8
-[64 0 0 -64 0 64]
-{ currentfile buf readhexstring pop }
-false 3 colorimage
-554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d55
-4c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c
-4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d
-554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d55
-4c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d
-
-554c4d554c4d554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b
-4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-554c4d554c4d554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b
-4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-554c4d554c4d554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b
-4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-554c4d554c4d554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b
-4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-554c4d554c4d554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b
-4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-554c4d554c4d554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b
-4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-554c4d554c4d554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b
-4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-554c4d554c4d554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b
-4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-554c4d554c4d554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b
-4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-554c4d554c4d554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b
-4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-554c4d554c4d554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b
-4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-554c4d554c4d554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b
-4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-544b4c544b4c544a4b544a4b544a4b544a4b544a4b544a4b544a4b544a4b544a4b544b4c544b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b
-4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-534b4c534b4c534a4b534a4b534a4b544a4b544a4b544a4b544a4b544a4b544a4b544a4b544a4b54
-4a4b544a4b544a4b544a4b544a4b544a4b544b4c554b4c554b4c554b4c554b4c554b4c554b4c554b
-4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-534a4b534a4b53494a53494a53494a53494a53494a53494a53494a53494a53494a53494a53494a53
-4a4a534a4b534a4b544a4b544a4b544a4b544a4b544a4b544a4b544a4b544a4b544b4c554b4c554b
-4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-524a4b524a4b52494a52494a52494a52494a52494a52494a52494a52494a52494a53494a53494a53
-494a53494a53494a53494a53494a53494a53494a534a4b534a4b544a4b544a4b544a4b544a4b544a
-4b544a4b544b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-52494a52494a52484952484952484952484952484952484952484952484952484952484952484952
-484952494952494a52494a52494a52494a53494a53494a53494a53494a53494a53494a534a4b534a
-4b544a4b544a4b544a4b544a4b544a4b544b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-51484951484951474851474851474851474851484851484851484951484951484951484951484951
-484951484952484952484952484952484952484952484952494a52494a52494a53494a53494a5349
-4a53494a53494a534a4b534a4b544a4b544a4b544a4b544a4b544b4c554b4c554b4c554b4c554b4c
-554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c55
-4b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c554b4c
-
-50484950484950474850474850474850474850474850474850474851474851474851474851474851
-47485147485147485148485148495148495148495148495248495248495248495248495249495249
-4a52494a53494a53494a53494a53494a534a4b534b4c544b4c544b4c544b4c544b4c544c4d554c4d
-554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d55
-4c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d
-
-50474850474850464750464750464750464750464750464750464750474750474850474850474850
-47485047485047485047485147485147485147485147485147485148485148495148495148495248
-4952484952484952494952494a52494a534a4b534a4b534a4b534a4b534b4c544b4c544b4c544b4c
-544b4c544c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d55
-4c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d
-
-4f47484f47484f46474f46474f46474f46474f46474f46474f46474f46474f46474f46474f464750
-46475046475046475046475047475047485047485047485047485047485147485147485147485148
-4851484951484951484952484952484952494a524a4b524a4b534a4b534a4b534a4b534a4b534b4c
-544b4c544b4c544b4c544b4c554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d55
-4c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d
-
-4e46474e46474e45464e45464e45464e45464f45464f45464f45464f45464f45464f46464f46464f
-46474f46474f46474f46474f46474f46474f46475046475046475046475047485047485047485047
-4851474851474851474851484851484951494a52494a52494a52494a524a4b524a4b534a4b534a4b
-534a4b534b4b534b4c544b4c544b4c544b4c544c4d554c4d554c4d554c4d554c4d554c4d554c4d55
-4c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d
-
-4e46474e46474e45464e45464e45464e45464e45464e45464e45464e45464e45464e45464e45464e
-45464e45464e45464f45464f45464f46464f46464f46474f46474f46474f46474f46475046475046
-4750474850474850474850474851474851484951484951494a51494a52494a52494a52494a524a4b
-524a4b534a4b534a4b534a4b534b4c544b4c544b4c544b4c544c4d554c4d554c4d554c4d554c4d55
-4c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d
-
-4d45464d45464d44454d44454d44454d44454d44454d44454d44454d44454d44454e44454e45454e
-45454e45464e45464e45464e45464e45464e45464e45464e45464f45464f46464f46474f46474f46
-474f46474f464750464750464750474850484950484951484951484951484951494a51494a52494a
-52494a524a4a524a4b534a4b534a4b534a4b534b4c544b4c544b4c544b4c544c4d554c4d554c4d55
-4c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d
-
-4d45454d45454d44444d44444d44444d44444d44444d44454d44454d44454d44454d44454d44454d
-44454d44454d44454d44454d44454e44454e45454e45464e45464e45464e45464e45464e45464f45
-464f46464f46474f46474f46474f4647504748504748504849504849504849514849514849514949
-51494a52494a52494a52494a524a4b524a4b534a4b534a4b534b4b544b4c544b4c544b4c544c4d55
-4c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d
-
-4c44454c44454c43444c43444c43444c43444c43444c43444c43444c43444c43444c43444c43444c
-43444d43444d44444d44454d44454d44454d44454d44454d44454d44454e44454e45454e45464e45
-464e45464e45464e45464f45464f46464f47484f47484f4748504748504748504849504849504849
-51484951484951494a51494a52494a52494a524a4b524a4b534a4b534a4b534b4b544b4c544b4c54
-4b4c544c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d
-
-4b43444b43444b42434b42434b42434b42434b43434b43434c43434c43444c43444c43444c43444c
-43444c43444c43444c43444c43444c43444c43444d43444d44444d44454d44454d44454d44454d44
-454e44454e45454e45464e45464e45464e46474f46474f47474f47484f47484f4748504748504848
-50484950484951484951484951494a51494a52494a52494a524a4a524a4b534a4b534a4b534b4b54
-4b4c544b4c544b4c544c4d554c4d554c4d554c4d554c4d554c4d554c4d554c4d
-
-4b43444b43444b42434b42434b42434b42434b42434b42434b42434b42434b42434b42434b42434b
-42434b42434b42434c43434c43444c43444c43444c43444c43444c43444c43444c43444d44444d44
-454d44454d44454d44454d44454e45454e46474e46474e46474e46474f46474f47474f47484f4748
-50474850474850484950484951484951484951494951494a52494a52494a524a4a524a4b534a4b53
-4a4b534b4c544b4c544b4c544b4c554c4d554c4d554c4d554c4d554c4d554c4d
-
-4a42434a42434a41424a41424a41424a41424a41424a41424a41424a42424a42424a42424b42434b
-42434b42434b42434b42434b42434b42434b42434b42434b43434c43444c43444c43444c43444c43
-444c43444d43444d44444d44454d44454d45464d45464e46464e46474e46474e46474e46474f4647
-4f47484f47484f474850474850484950484950484951484951494951494a52494a52494a524a4b52
-4a4b534a4b534a4b534b4c544b4c544b4c544b4c554c4d554c4d554c4d554c4d
-
-4942434942434941424941424941424a41424a41424a41424a41424a41424a41424a41424a41424a
-41424a41424a41424a41424a42424a42424b42434b42434b42434b42434b42434b42434b43434c43
-444c43444c43444c43444c43444c43444d45454d45464d45464d45464d45464e46464e46474e4647
-4e46474f46474f47474f47484f474850474850484850484950484951484951494951494a52494a52
-494a524a4b534a4b534a4b534a4b534b4c544b4c544b4c544c4d554c4d554c4d
-
-49414249414249404149404149404149404149404149404149404149404149404149414149414149
-41414941424a41424a41424a41424a41424a41424a41424a41424a42424b42434b42434b42434b42
-434b42434b42434c43434c43444c43444c44454c44454c44454d45454d45464d45464d45464e4546
-4e46474e46474e46474f46474f47474f47484f474850474850484850484950484951484951494951
-494a52494a52494a524a4b534a4b534a4b534b4b544b4c544b4c544b4c554c4d
-
-48414148414148404048404048404048404048404148404148404148404149404149404149404149
-40414940414940414940414940414941414941424941424a41424a41424a41424a41424a41424a42
-424b42434b42434b42434b42434b42434b44444c44454c44454c44454c44454d44454d45464d4546
-4d45464d45464e46464e46474e46474e46474f47474f47484f474850474850484850484950484951
-484951494a51494a52494a52494a524a4b534a4b534a4b534b4c544b4c544b4c
-
-484041484041483f40483f40483f40483f40483f40483f40483f40483f40483f40483f40483f4048
-40404840404840414840414940414940414940414940414940414941414941414941424a41424a41
-424a41424a41424a42424a42424b42434b43444b43444b43444c44444c44454c44454c44454c4445
-4d45454d45464d45464d45464e46464e46474e46474e46474f47474f47484f474850474850484950
-484951484951484951494a52494a52494a524a4b534a4b534a4b534a4b544b4c
-
-473f40473f40473e3f473f3f473f3f473f3f473f3f473f3f473f3f473f40473f40473f40473f4047
-3f40483f40483f40483f40483f40483f404840404840404840414940414940414940414940414941
-414941414a41424a41424a41424a41424a43434a43434b43444b43444b43444b43444c44454c4445
-4c44454c44454d45454d45464d45464d45464e46464e46474e46474e46474f47474f47484f474850
-474850484950484951484951484951494a52494a52494a524a4b534a4b534a4b
-
-463f40463f40463e3f463e3f463e3f463e3f463e3f463e3f473e3f473e3f473e3f473e3f473e3f47
-3e3f473f3f473f3f473f40473f40473f40483f40483f40483f40483f40483f404840404840414940
-414940414940414940414941414941424a42434a42434a42434a43434b43444b43444b43444b4344
-4c44444c44454c44454c44454d45454d45464d45464d45464e46464e46474e46474f46474f47474f
-47484f474850474850484950484951484951494a51494a52494a524a4b534a4b
-
-463e3f463e3f463d3e463d3e463d3e463d3e463d3e463e3e463e3e463e3e463e3e463e3f463e3f46
-3e3f463e3f463e3f473e3f473e3f473e3f473e3f473f3f473f40473f40473f40483f40483f40483f
-404840404840414840414940414940414941424942424a42434a42434a42434a42434a43434b4344
-4b43444b43444b44444c44454c44454c44454d44454d45464d45464d45464e46464e46474e46474f
-46474f47484f474850474850484850484951484951484951494a52494a52494a
-
-453e3f453e3f453d3e453d3e453d3e453d3e453d3e453d3e453d3e453d3e453d3e453d3e463d3e46
-3d3e463d3e463e3e463e3e463e3e463e3f463e3f463e3f473e3f473e3f473e3f473f3f473f40473f
-40483f40483f404840404840404840414941424941424941424942424942434a42434a42434a4243
-4a43434b43444b43444b43444b44444c44454c44454c44454d45454d45464d45464d45464e46474e
-46474e46474f46474f47484f474850474850484950484951484951494a51494a
-
-443d3e443d3e443c3d443c3d443c3d443c3d453c3d453c3d453c3d453d3d453d3d453d3d453d3d45
-3d3e453d3e453d3e453d3e453d3e463d3e463d3e463e3e463e3e463e3f463e3f463e3f473e3f473f
-3f473f3f473f3f4740404740404840404840414841414841424941424941424941424942424a4243
-4a42434a42434a43434b43444b43444b43444b44444c44454c44454c44454d45454d45464d45464e
-45464e46474e46474f46474f47474f4748504748504848504849514849514849
-
-443d3d443d3d443c3c443c3c443c3c443c3c443c3d443c3d443c3d443c3d443c3d443c3d443c3d44
-3c3d443c3d453c3d453d3d453d3d453d3d453d3e453d3e453d3e453d3e463e3e463e3e463f3e463f
-3f463f3f473f3f473f3f473f3f47403f474041484041484041484041484141484142494142494142
-4942424942434a42434a42434a43434b43444b43444b43444b44444c44454c44454c44454d45464d
-45464d45464e46464e46474e46474f46474f47484f4748504748504849504849
-
-433c3d433c3d433b3c433b3c433b3c433b3c433b3c433b3c433b3c433b3c433b3c443c3c443c3c44
-3c3c443c3c443c3d443c3d443c3d443c3d443c3d453d3d453d3d453e3d453e3e453e3e453e3e463e
-3e463e3e463f3e463f3f463f3f473f3f473f40474040474041474041484041484041484141484142
-4941424941424942424942434a42434a42434a43434b43444b43444b43444c44444c44454c44454d
-44454d45464d45464d45464e46474e46474e46474f47474f4748504748504849
-
-433c3c433c3c433b3b433b3b433b3b433b3b433b3b433b3b433b3c433b3c433b3c433b3c433b3c43
-3b3c433b3c433b3c433b3c443c3c443c3c443d3c443d3d443d3d443d3d443d3d453d3d453e3d453e
-3e453e3e453e3e463e3e463e3e463f3e463f40463f40473f40473f40474040474041484041484041
-4841414841424941424941424942424942434a42434a42434a43434b43444b43444b43444c44454c
-44454c44454d45454d45464d45464e46464e46474e46474f46474f47484f4748
-
-423b3c423b3c423a3b423a3b423a3b423a3b423a3b423a3b423a3b423a3b423a3b423a3b423a3b43
-3b3b433b3b433b3b433c3c433c3c433c3c433c3c433c3c433c3c443d3c443d3c443d3d443d3d443d
-3d453d3d453e3d453e3d453e3e453e3e463e3f463e3f463f3f463f40463f40473f40474040474041
-4840414840414840414841424941424941424942424a42434a42434a42434a43434b43444b43444b
-44444c44454c44454c44454d45464d45464d45464e46474e46474f46474f4748
-
-413a3b413a3b41393a41393a413a3a413a3a413a3a413a3a413a3a423a3a423a3a423a3b423a3b42
-3a3b423a3b423b3b423b3b423b3b423c3b433c3b433c3c433c3c433c3c433c3c433c3c443c3c443d
-3c443d3d443d3d443d3d453d3d453e3d453e3f453e3f453e3f463e3f463f3f463f40463f40473f40
-4740404740414740414840414841414841424941424941424942424a42434a42434a42434b43444b
-43444b43444c44454c44454c44454d45454d45464d45464e46464e46474e4647
-
-413a3b413a3b41393a41393a41393a41393a41393a41393a41393a41393a41393a41393a41393a41
-3a3a413b3a413b3a423b3a423b3b423b3b423b3b423b3b423b3b423b3b433c3b433c3c433c3c433c
-3c433c3c443c3c443d3c443d3d443d3d443d3e453d3e453e3e453e3f453e3f463e3f463f3f463f40
-463f40473f404740404740414840414840414841414841424941424941424942434a42434a42434a
-43434b43444b43444b43444c44454c44454c44454d45464d45464e45464e4647
-
-40393a40393a403839403839403839403839403839403939403939403939403939403939413a3a41
-3a3a413a3a413a3a413a3a413a3a413a3a413b3a423b3a423b3b423b3b423b3b423b3b423b3b433c
-3b433c3c433c3c433c3c433c3c443c3c443d3d443d3e443d3e453d3e453e3e453e3f453e3f463e3f
-463f3f463f40463f40473f404740404740414840414840414841414941424941424942424a42434a
-42434a42434b43444b43444b43444c44454c44454c44454d45464d45464d4546
-
-3f39393f39393f38383f38383f38383f38393f383940383940383940383940393940393940393940
-3939403939403a39403a39403a39413a3a413a3a413a3a413a3a413a3a413b3a423b3a423b3b423b
-3b423b3b423b3b433c3b433c3c433c3c433c3d433c3d443d3d443d3e443d3e443d3e453e3e453e3f
-453e3f463e3f463f3f463f40463f40473f4047404047404148404148404148414249414249414249
-42424a42434a42434a43434b43444b43444b44444c44454c44454d45454d4546
-
-3f38393f38393f37383f37383f37383f37383f37383f37383f38383f38383f39383f39383f39383f
-39383f3939403939403939403939403939403939403a39403a39413a3a413a3a413a3a413a3a413b
-3a423b3a423b3b423b3b423b3b423b3b433c3c433c3d433c3d433c3d443d3d443d3e443d3e443d3e
-453e3e453e3f453e3f463e3f463f3f463f40463f40473f4047404047404148404148414148414249
-41424942424942434a42434a42434b43444b43444b43444c44454c44454c4445
-
-3e38383e38383e37373e37373e37373e37373e37373e37383e38383e38383e38383f38383f38383f
-38383f38383f38383f39383f39383f3938403939403939403939403939403a39403a39413a3a413a
-3a413a3a413a3a413b3a423b3a413a3b423b3c423b3c433c3c433c3d433c3d433c3d443c3d443d3d
-443d3e443d3e453e3e453e3f453e3f463e3f463f3f463f40473f40473f4047404148404148404148
-41414941424941424942424a42434a42434a43434b43444b43444c44454c4445
-
-3d37383d37383d36373e36373e36373e36373e37373e37373e37373e37373e37373e38373e38373e
-38373e38373e38383e38383f38383f38383f38383f38383f39383f39384039394039394039394039
-39403a39413a3a413a3a40393a40393a413b3b423b3c423b3c423b3c423c3c433c3d433c3d433c3d
-443c3d443d3d443d3e443d3e453e3e453e3f453e3f463e3f463f3f463f40473f4047404047404148
-40414841414841424941424942424a42434a42434a43434b43444b43444c4444
-
-3d37373d37373d36363d36363d36363d36363d37363d37363d37363d37363d37373d37373d37373e
-37373e37373e37373e37373e38373e38373e38383e38383f38383f38383f38383f39383f39384039
-394039394039394039393f393940393a413a3b413a3b413b3b423b3b423b3c423b3c423c3c433c3c
-433c3d433c3d443d3d443d3e443d3e453d3e453e3e453e3f463e3f463f3f463f40473f40473f4047
-40414840414840414841424941424941424942434a42434a42434b43444b4344
-
-3c36373c36373c35363c35363c36363c36363c36363c36363c36363d36363d36363d36363d37363d
-37363d37363d37363d37373d37373e37373e37373e37373e38373e38373e38383f38383f38383f38
-383f39383f38383f38393f38393f3839403a3a413a3b413a3b413a3b413b3b423b3b423b3c423b3c
-423c3c433c3d433c3d433c3d443d3d443d3e443d3e453d3e453e3f453e3f463e3f463f3f463f4047
-3f404740404740414840414841414941424941424942424a42434a42434b4344
-
-3c35363c35363c35353c35353c35353c35353c36353c36353c36353c36353c36353c36363c36363c
-36363c36363d36363d36363d36363d37363d37363d37373d37373e37373e37373e38373e38373e38
-383f38383e37383e37383e38383e383940393a40393a403a3a403a3a413a3b413a3b413b3b423b3b
-423b3c423b3c423c3c433c3d433c3d433c3d443d3d443d3e443d3e453e3e453e3f453e3f463f3f46
-3f40473f404740404740414840414840414841424941424942424a42434a4243
-
-3b35353b35353b35343b35343b35353b35353b35353b35353b35353b35353b35353b35353c35353c
-35353c36353c36353c36353c36363c36363c36363d36363d37363d37363d37363d37373e37373e37
-373d37373d37373d37383e37383e37383f39393f393940393a40393a403a3a403a3a413a3b413a3b
-413b3b423b3b423b3c423b3c433c3c433c3d433c3d443c3d443d3e443d3e453d3e453e3f453e3f46
-3e3f463f3f463f40473f404740414840414840414841424941424942424a4243
-
-3a34353a34353a34343a34343a34343a34343a34343b34343b35343b35343b35343b35343b35343b
-35353b35353b35353b35353c35353c35353c36353c36353c36363c36363d36363d36363d37363c36
-363c36373d36373d36373d37373d37383f38393f38393f38393f393940393a40393a403a3a403a3a
-413a3b413a3b413b3b423b3c423b3c423b3c433c3c433c3d433c3d443d3d443d3e443d3e453e3e45
-3e3f463e3f463f3f463f40473f40474040474041484041484141494142494142
-
-3a34343a34343a34333a34333a34333a34333a34333a34343a34343a34343a34343a34343a34343a
-34343b34343b35343b35343b35343b35353b35353b35353c35353c36353c36353c36363c35363c35
-363c35363c36363c36373c36373d36373e38383e38383f38393f38393f38393f393940393a40393a
-403a3a413a3b413a3b413a3b413b3b423b3c423b3c433c3c433c3d433c3d443c3d443d3e443d3e45
-3e3e453e3f453e3f463f3f463f40473f40474040474041484041484141494142
-
-3933343933343933333933333933333933333933333933333933333933333a34333a34333a34333a
-34333a34343a34343a34343a34343a34343b35343b35343b35343b35353b35353c34353b35353b35
-353b35363b35363c35363c36363c36363d37383e37383e38383e38383e38393f38393f39393f3939
-40393a40393a403a3a413a3b413a3b413b3b423b3b423b3c423b3c433c3c433c3d433c3d443d3d44
-3d3e453d3e453e3e453e3f463e3f463f40473f40473f40474041484041484141
-
-38333338333338333238333239333239333239333239333239333239333339333339333339333339
-33333933333934333a34333a34333a34343a34343a34343a34343b34343b35343a34343a34353a34
-353b34353b35353b35363b35363c35363d37373d37373d37383e37383e38383e38383f38393f3839
-3f39393f393a40393a40393a403a3a413a3b413a3b413b3b423b3c423b3c433c3c433c3d433c3d44
-3d3d443d3e443d3e453e3e453e3f463e3f463f3f463f40473f40474041484041
-
-38323338323338323238323238323238323238323238323238323238323238323238333238333239
-33323933323933333933333933333933333933333a34333a34333a34343933343933343a34343a34
-343a34353a34353a34353b35353b35353c36373d36373d37373d37373d37383e37383e38383e3838
-3f38393f38393f393940393a40393a403a3a413a3b413a3b413b3b423b3c423b3c423b3c433c3d43
-3c3d443c3d443d3e443d3e453e3e453e3f463e3f463f3f463f40473f40474041
-
-37313237313237313137323137323137323137323137323137323138323138323138323238323238
-32323832323832323833323833323933323933333933333933333932333933333933333933343933
-343933343a34343a34343a34353a34353c35363c36363c36373d36373d37373d37373d37383e3738
-3e38383e38393f38393f38393f393940393a40393a403a3a413a3b413a3b423b3b423b3c423b3c43
-3c3c433c3d433c3d443d3d443d3e453e3e453e3f453e3f463f3f463f40473f40
-
-37313137313137313037313137313137313137313137313137313137313137313137313137323137
-32313732313832313832323832323832323832323833323933323832323832333832333832333933
-333933333933343933343a34343a34343b35363b35363c35363c36363c36373d36373d37373d3737
-3e37383e37383e38383e38393f38393f393940393a40393a403a3a413a3b413a3b413b3b423b3c42
-3b3c433c3c433c3d433c3d443d3d443d3e453d3e453e3f453e3f463f3f463f40
-
-36303136303136303036303036303036303036313036313036313036313036313036313037313137
-31313731313731313731313732313732313832313832323731323731323732323832323832333832
-333832333933333933333933343933343b34353b35353b35363b35363c35363c36363c36373d3637
-3d37373d37383e37383e38383e38393f38393f38393f393940393a40393a413a3b413a3b413a3b42
-3b3c423b3c423c3c433c3d433c3d443d3d443d3e453d3e453e3f453e3f463f3f
-
-35303035303035302f35302f35302f35302f35303036303036303036303036303036303036303036
-31303631303631303731303731313731313731313630313631313731313731323731323731323732
-323832323832333832333833333933333a34353a34353b34353b35353b35363b35363c36363c3637
-3c36373d36373d37373d37383e37383e38383f38393f38393f393940393a40393a403a3a413a3b41
-3a3b423b3b423b3c423b3c433c3d433c3d443d3d443d3e453d3e453e3f453e3f
-
-352f30352f30352f2f352f2f352f2f352f2f352f2f352f2f35302f35302f35302f35302f35302f35
-30303630303630303630303630303631303630303630313630313630313630313631313731313731
-323731323732323832323832333832333933343a34343a34353a34353b35353b35353b35363c3536
-3c36363c36373d36373d37373d37383e37383e38383e38393f38393f393940393a40393a403a3a41
-3a3b413a3b423b3b423b3c423b3c433c3d433c3d443d3d443d3e443d3e453e3e
-
-Q
-Q
-Q
-Q
-Q
-1 1 1 rg
-n
-117.6 157.8 m
-229.5 86.6 l
-301 199.5 l
-189.1 270.7 l
-117.6 157.8 l
-h
-f
-0 0 0 rg
-8.7396 w 0 J 0 j 11 M
-[]0 d
-n
-117.6 157.8 m
-229.5 86.6 l
-301 199.5 l
-189.1 270.7 l
-117.6 157.8 l
-h
-S
-0.624 0.624 0.624 rg
-n
-301 199.5 m
-289.1 180.8 l
-177.2 252 l
-189.2 270.8 l
-301 199.5 l
-h
-f
-0 0 0 rg
-[]0 d
-n
-301 199.5 m
-289.1 180.8 l
-177.2 252 l
-189.2 270.8 l
-301 199.5 l
-h
-S
-0.624 0.624 0.624 rg
-n
-251.5 205.4 m
-192.9 112.4 l
-251.5 205.4 l
-h
-f
-0 0 0 rg
-[]0 d
-n
-251.5 205.4 m
-192.9 112.4 l
-S
-0.624 0.624 0.624 rg
-n
-213.9 227.7 m
-155.3 134.7 l
-213.9 227.7 l
-h
-f
-0 0 0 rg
-[]0 d
-n
-213.9 227.7 m
-155.3 134.7 l
-S
-0.624 0.624 0.624 rg
-n
-273 152.8 m
-159.9 223.2 l
-273 152.8 l
-h
-f
-0 0 0 rg
-[]0 d
-n
-273 152.8 m
-159.9 223.2 l
-S
-0.624 0.624 0.624 rg
-n
-250.9 121.8 m
-137.8 192.2 l
-250.9 121.8 l
-h
-f
-0 0 0 rg
-[]0 d
-n
-250.9 121.8 m
-137.8 192.2 l
-S
-1 1 1 rg
-n
-132.6 263.5 m
-130.9 262.7 129.3 261.4 128.2 259.7 c
-124.9 254.7 126.3 247.9 131.3 244.6 c
-136.3 241.3 143.1 242.7 146.4 247.7 c
-147.5 249.4 148.1 251.4 148.2 253.3 c
-187.9 227.2 l
-186 226.4 184.4 225.1 183.2 223.2 c
-179.9 218.2 181.3 211.4 186.3 208.1 c
-191.3 204.8 198.1 206.2 201.4 211.2 c
-202.6 213 203.2 215.1 203.2 217.1 c
-222.2 204.6 l
-172.6 129.3 l
-64.6 200.4 l
-114.2 275.7 l
-132.8 263.5 l
-132.6 263.5 l
-h
-f
-0 0 0 rg
-[]0 d
-n
-132.6 263.5 m
-130.9 262.7 129.3 261.4 128.2 259.7 c
-124.9 254.7 126.3 247.9 131.3 244.6 c
-136.3 241.3 143.1 242.7 146.4 247.7 c
-147.5 249.4 148.1 251.4 148.2 253.3 c
-187.9 227.2 l
-186 226.4 184.4 225.1 183.2 223.2 c
-179.9 218.2 181.3 211.4 186.3 208.1 c
-191.3 204.8 198.1 206.2 201.4 211.2 c
-202.6 213 203.2 215.1 203.2 217.1 c
-222.2 204.6 l
-172.6 129.3 l
-64.6 200.4 l
-114.2 275.7 l
-132.8 263.5 l
-132.6 263.5 l
-h
-S
-1 1 1 rg
-n
-190.7 185.6 m
-149.9 212.5 l
-190.7 185.6 l
-h
-f
-0.549 0.549 0.549 rg
-n
-193.1 189.3 m
-188.3 182 l
-147.5 208.9 l
-152.3 216.2 l
-193.1 189.3 l
-193.1 189.3 l
-h
-f
-0.733 0.733 0.729 rg
-n
-180.4 169.5 m
-100.7 222 l
-180.4 169.5 l
-h
-f
-n
-182.8 173.2 m
-178 165.9 l
-98.3 218.4 l
-103.1 225.7 l
-182.8 173.2 l
-182.8 173.2 l
-h
-f
-n
-172.5 157.5 m
-92.8 210 l
-172.5 157.5 l
-h
-f
-n
-174.9 161.1 m
-170.1 153.8 l
-90.4 206.3 l
-95.2 213.6 l
-174.9 161.1 l
-h
-f
-1 1 1 rg
-n
-52.7 118.2 m
-164.5 47 l
-213.9 124.6 l
-102.1 195.9 l
-52.7 118.3 l
-52.7 118.2 l
-h
-f
-0 0 0 rg
-[]0 d
-n
-52.7 118.2 m
-164.5 47 l
-213.9 124.6 l
-102.1 195.9 l
-52.7 118.3 l
-52.7 118.2 l
-h
-S
-1 1 1 rg
-n
-95.4 185.1 m
-121.1 108.9 l
-206.2 112.3 l
-95.4 185.1 l
-h
-f
-0 0 0 rg
-[]0 d
-n
-95.4 185.1 m
-121.1 108.9 l
-206.2 112.3 l
-S
-1 1 1 rg
-n
-164.6 46.9 m
-146.5 109.9 l
-164.6 46.9 l
-h
-f
-0 0 0 rg
-[]0 d
-n
-164.6 46.9 m
-146.5 109.9 l
-S
-1 1 1 rg
-n
-52.7 118.2 m
-112.8 133.6 l
-52.7 118.2 l
-h
-f
-0 0 0 rg
-[]0 d
-n
-52.7 118.2 m
-112.8 133.6 l
-S
-Q
-SP
-%%EndDocument
-%%Trailer
-cleartomark countdictstack exch sub { end } repeat restore
-%%EOF
diff --git a/help/update_po.pl b/help/update_po.pl
deleted file mode 100755
index 7fa054e721..0000000000
--- a/help/update_po.pl
+++ /dev/null
@@ -1,212 +0,0 @@
-#!/usr/bin/perl -w
-#
-# Script for translators that extract .sgml files into .sgml.po ones
-#
-# Copyright (C) 2001 Héctor García Álvarez.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of the
-# License, or (at your option) any later version.
-#
-# This script is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this library; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-#
-#
-# Authors: Héctor García Álvarez <hector@scouts-es.org>
-
-## Loaded modules
-use strict;
-use File::Basename;
-use Getopt::Long;
-
-my $LANG = $ARGV[0];
-#my $OUTFILE = "./tmp/$FILE.h";
-
-my %string = ();
-my @elements;
-my @items;
-my $n=0;
-
-if (! $LANG){
- print "Usage: update_po.pl LANGCODE\n";
- exit;
-} else { $LANG .=".po"; }
-
-if ( !(-d "./$LANG") ){ mkdir ("./$LANG", 0755) ; }
-
-chdir ("./C");
-if ( !(-d "./tmp") ) { mkdir ("./tmp", 0755) ; }
-
-my $comand="";
-
-open FILES, "<POTFILES.in" ;
-#open POTFILE, ">POTFILES.in.h";
-while (<FILES>) {
- undef (%string);
- s/\n//g;
- my $Original_file = $_ ;
- s/.\///g;
- my $Converted_file = "./tmp/".$_.".h";
- # print $Original_file."\n";
- # print $Translated_file."\n";
- print "Converting ".$Original_file."\n" ;
- system "rm -f $Converted_file";
- &Convert ($Original_file);
- open OUT, ">>$Converted_file";
- &addMessages;
- close OUT;
- $comand = "xgettext --default-domain=$Original_file ";
- $comand .="--directory=. --add-comments --keyword=_ --keyword=N_ ";
- $comand .="$Converted_file ";
- system ( $comand );
- print ("Updating $Original_file.po\n");
- system ("mv $Original_file.po ../$LANG/$Original_file.pot");
-
- if ( -f "../$LANG/$Original_file.po") {
- system ("cp ../$LANG/$Original_file.po ../$LANG/$Original_file.po.old");
- system ("msgmerge ../$LANG/$Original_file.po.old ../$LANG/$Original_file.pot -o ../$LANG/$Original_file.po");
- } else {
- system ("mv ../$LANG/$Original_file.pot ../$LANG/$Original_file.po");
- }
-
- system ("msgfmt --statistics ../$LANG/$Original_file.po");
- system ("rm -f ../$LANG/$Original_file.pot");
-# print POTFILE $Converted_file."\n";
- print ".\n";
-}
-close FILES;
-
-system ("rm -rf ./tmp ");
-exit 0;
-
-
-sub Convert() {
-
- ## Reading the file
- open (IN, "<$_[0]") || die "can't open $_[0]: $!";
-
- ### For translatable Sgml files ###
- while (<IN>) {
- if ( /<!--/ ) {
- my $Salida = $_ ;
- if ( (/-->/) ) {
- $string{$Salida} = [];
- } else {
- while (<IN>) {
- $Salida .= $_ ;
- if ( /-->/ ) { last ; }
- }
- $string{$Salida} = [];
- }
- }
- elsif ( /<para>/ ) {
- my $number_of_para = 1;
- my $Salida = $_ ;
- if ( /<\/para>/ ) {
- $string{$Salida} = [];
- } else {
- while (<IN>) {
- if ( /<para>/ ) { $number_of_para++; }
- $Salida .= $_ ;
- if ( /<\/para>/ ) {
- $number_of_para--;
- if ( $number_of_para==0) {last ; }
- }
- }
- $string{$Salida} = [];
- }
- }
- elsif ( /<title>/ ) {
- my $Salida = $_ ;
- if ( /<\/title>/ ) {
- $string{$Salida} = [];
- } else {
- while (<IN>) {
- $Salida .= $_ ;
- if ( /<\/title>/ ) { last ; }
- }
- $string{$Salida} = [];
- }
- }
- elsif ( /<glossterm>/ ) {
- my $Salida = $_ ;
- if ( /<\/glossterm>/ ) {
- $string{$Salida} = [];
- } else {
- while (<IN>) {
- $Salida .= $_ ;
- if ( /<\/glossterm>/ ) { last ; }
- }
- $string{$Salida} = [];
- }
- }
- elsif ( /<guilabel>/ ) {
- my $Salida = $_ ;
- if ( /<\/guilabel>/ ) {
- $string{$Salida} = [];
- } else {
- while (<IN>) {
- $Salida .= $_ ;
- if ( /<\/guilabel>/ ) { last ; }
- }
- $string{$Salida} = [];
- }
- }
- }
- close (IN);
-}
-
-sub addMessages{
-
- foreach my $theMessage (sort keys %string) {
-
- my ($tag) = $string{$theMessage} ;
-
- # Replace XML codes for special chars to
- # geniune gettext syntax
- #---------------------------------------
- $theMessage =~ s/"/\\"/mg;
- $theMessage =~ s/\n/\\n\n/mg;
-
-# $theMessage =~ s/&lt;/</mg;
-# $theMessage =~ s/&gt;/>/mg;
-
- if ($theMessage =~ /\n/) {
- #if ($tag) { print OUT "/* $tag */\n"; }
- @elements = split (/\n/, $theMessage);
- for ($n = 0; $n < @elements; $n++) {
-
- if ($n == 0) {
- print OUT "gchar *s = N_";
- print OUT "(\"$elements[$n]\"";
- if ($n == @elements - 1) { print OUT ");\n"; }
- print OUT "\n";
- }
-
- elsif ($n == @elements - 1) {
- print OUT " ";
- print OUT "\"$elements[$n]\");\n\n";
- }
-
- elsif ($n > 0) {
- print OUT " ";
- print OUT "\"$elements[$n]\"\n";
- }
- }
-
- } else {
-
-# if ($tag) { print OUT "/* $tag */\n"; }
- print OUT "gchar *s = N_(\"$theMessage\");\n";
- }
-
- }
-}
-
diff --git a/help/update_translation.pl b/help/update_translation.pl
deleted file mode 100755
index 0023b069d1..0000000000
--- a/help/update_translation.pl
+++ /dev/null
@@ -1,240 +0,0 @@
-#!/usr/bin/perl -w
-#
-# Script that translates .sgml files using the .po files generated from
-# the script update_po.pl
-#
-# Copyright (C) 2001 Héctor García Álvarez.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of the
-# License, or (at your option) any later version.
-#
-# This script is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this library; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-#
-#
-# Authors: Héctor García Álvarez <hector@scouts-es.org>
-
-## Loaded modules
-use File::Basename;
-use Getopt::Long;
-
-my $LANG = $ARGV[0];
-
-my %string;
-my $texto_original="";
-my $texto_traducido="";
-
-if (! $LANG){
- print "Usage: update_translation.pl LANGCODE\n";
- exit;
-}
-
-chdir ("./C");
-
-## Reading the po file
-#print "Loading ".$LANG.".po\n";
-#&load_translated_strings ($LANG.".po");
-
-## Checking for the lang dir
-if ( !(-d "../".$LANG) ) { mkdir ("../".$LANG, 0755) ; }
-
-open FILES, "<POTFILES.in" ;
-while (<FILES>) {
- undef %string;
- s/\n//g;
- $Original_file = $_ ;
- s/.\///g;
- $Translated_file = "../".$LANG."/".$_;
-# print $Original_file."\n";
-# print $Translated_file."\n";
- &load_translated_strings ("../".$LANG.".po/".$_.".po");
- print "Translating ".$Original_file ;
- system "rm -f $Translated_file";
- &translate_file ($Translated_file , $Original_file);
- print ".\n";
-}
-close FILES;
-
-exit 0;
-
-
-
-
-sub load_translated_strings ()
-{
- my $FILE=$_[0];
- open (IN, "<$FILE") || die "I can't find $FILE";
-
- while (<IN>) {
- if ( /#: /) {
- &original;
- &traduccion;
-# print "Original \n##".$texto_original."##\n";
-# print "Traducción \n##".$texto_traducido."##\n";
- $string{$texto_original} = $texto_traducido;
- }
- }
- close (IN);
-}
-
-sub translate_file ()
-{
- my $OUTFILE=$_[0];
- my $INFILE=$_[1];
-
- open OUT, ">>$OUTFILE";
- open (IN, "<$INFILE") || die "can't open $INFILE: $!";
-
- while (<IN>) {
- my $imprimir = 0;
- if ( /<!--/ ) {
- $Salida = $_ ;
- if ( !(/-->/) ) {
- while (<IN>) {
- $Salida .= $_ ;
- if ( /-->/ ) { last ; }
- }
- }
- $imprimir = 1;
- }
- elsif ( /<para>/ ) {
- my $number_of_para = 1;
- $Salida = $_ ;
- if ( !(/<\/para>/) ) {
- while (<IN>) {
- if ( /<para>/ ) { $number_of_para++; }
- $Salida .= $_ ;
- if ( /<\/para>/ ) {
- $number_of_para--;
- if ( $number_of_para==0) {last ; }
- }
- }
- }
- $imprimir = 1;
- }
- elsif ( /<title>/ ) {
- $Salida = $_ ;
- if ( !(/<\/title>/) ) {
- while (<IN>) {
- $Salida .= $_ ;
- if ( /<\/title>/ ) { last ; }
- }
- }
- $imprimir = 1;
- }
- elsif ( /<glossterm>/ ) {
- $Salida = $_ ;
- if ( !(/<\/glossterm>/) ) {
- while (<IN>) {
- $Salida .= $_ ;
- if ( /<\/glossterm>/ ) { last ; }
- }
- }
- $imprimir = 1;
- }
- elsif ( /<guilabel>/ ) {
- $Salida = $_ ;
- if ( !(/<\/guilabel>/) ) {
- while (<IN>) {
- $Salida .= $_ ;
- if ( /<\/guilabel>/ ) { last ; }
- }
- }
- $imprimir = 1;
- }
- if ( $imprimir == 0 ) { print (OUT $_); }
- else {
- my $impreso=0;
- foreach my $theMessage (sort keys %string) {
- if (!($theMessage cmp $Salida)) {
- my $tag = $string{$Salida} ;
-
- if ( $tag cmp "") {
- $tag =~ s/\\"/"/mg ;
- print (OUT $tag);
- }
- else {
- print (OUT $Salida);
- }
- $impreso=1;
- }
- }
- if ( $impreso == 0) {
- print "No lo encuentro\n##".$Salida."##\n";
- $impreso=0;
- }
- $imprimir = 0;
- }
- }
- close IN;
- close OUT;
-}
-#exit 0;
-
-sub original ()
-{
- my $tmp = "";
- while (<IN>) {
- if ( !(/^#: /) ) {
- if ( /msgid ""/) { s/msgid ""\n//; }
- if ( /msgstr/) {
- $tmp =~ s/\\n/\n/sg ;
- $tmp =~ s/\\t/\t/sg ;
- $tmp =~ s/\\"/"/sg ;
- $texto_original = $tmp;
- last ;
- }
- s/msgid "//;
- s/\s*"// ;
- s/"\n// ;
- s/\n// ;
- $tmp .= $_;
- }
- }
-}
-
-sub traduccion ()
-{
- my $tmp = "";
- my $first = 0;
- if ( /msgstr "/) {
- if ( /msgstr ""/) {
- $tmp = "";
- $first = 1;
- } else {
- $tmp = $_;
- $tmp =~ s/msgstr "//;
- $tmp =~ s/"\n// ;
- }
- }
- while (<IN>) {
-
- if ( !($_ cmp "\n") ) {
- $tmp =~ s/\\n/\n/sg ;
- $tmp =~ s/\\t/\t/sg ;
- $tmp =~ s/\"/"/sg ;
- if ( $first == 1 ) { $texto_traducido = "" ; }
- else { $texto_traducido = $tmp; }
- last ;
- }
- $first = 0;
- s/msgstr "//;
- s/"\n// ;
- s/\s*"// ;
- $tmp .= $_;
- }
- if ( eof IN ) {
- $tmp =~ s/\\n/\n/sg ;
- $tmp =~ s/\\t/\t/sg ;
- $tmp =~ s/\"/"/sg ;
- $texto_traducido = $tmp;
- }
-}
diff --git a/help/xmldocs.make b/help/xmldocs.make
deleted file mode 100644
index fdf1ed1e64..0000000000
--- a/help/xmldocs.make
+++ /dev/null
@@ -1,96 +0,0 @@
-#
-# No modifications of this Makefile should be necessary.
-#
-# To use this template:
-# 1) Define: figdir, docname, lang, omffile, and entities in
-# your Makefile.am file for each document directory,
-# although figdir, omffile, and entities may be empty
-# 2) Make sure the Makefile in (1) also includes
-# "include $(top_srcdir)/xmldocs.make" and
-# "dist-hook: app-dist-hook".
-# 3) Optionally define 'entities' to hold xml entities which
-# you would also like installed
-# 4) Figures must go under $(figdir)/ and be in PNG format
-# 5) You should only have one document per directory
-# 6) Note that the figure directory, $(figdir)/, should not have its
-# own Makefile since this Makefile installs those figures.
-#
-# example Makefile.am:
-# figdir = figures
-# docname = scrollkeeper-manual
-# lang = C
-# omffile=scrollkeeper-manual-C.omf
-# entities = fdl.xml
-# include $(top_srcdir)/xmldocs.make
-# dist-hook: app-dist-hook
-#
-# About this file:
-# This file was taken from scrollkeeper_example2, a package illustrating
-# how to install documentation and OMF files for use with ScrollKeeper
-# 0.3.x and 0.4.x. For more information, see:
-# http://scrollkeeper.sourceforge.net/
-# Version: 0.1.2 (last updated: March 20, 2002)
-#
-
-
-# ************* Begin of section some packagers may need to modify **************
-# This variable (docdir) specifies where the documents should be installed.
-# This default value should work for most packages.
-# docdir = $(datadir)/@PACKAGE@/doc/$(docname)/$(lang)
-docdir = $(datadir)/gnome/help/$(docname)/$(lang)
-
-# ************** You should not have to edit below this line *******************
-xml_files = $(docname).xml
-
-EXTRA_DIST = $(xml_files) $(omffile)
-CLEANFILES = omf_timestamp
-
-# If the following file is in a subdir (like help/) you need to add that to the path
-include $(top_srcdir)/help/omf.make
-
-all: omf
-
-#$(docname).xml: $(entities)
-# -ourdir=`pwd`; \
-# cd $(srcdir); \
-# cp $(entities) $$ourdir
-
-app-dist-hook:
- if test "$(figdir)"; then \
- $(mkinstalldirs) $(distdir)/$(figdir); \
- for file in $(srcdir)/$(figdir)/*.png; do \
- basefile=`echo $$file | sed -e 's,^.*/,,'`; \
- $(INSTALL_DATA) $$file $(distdir)/$(figdir)/$$basefile; \
- done \
- fi
-
-install-data-local: omf
- $(mkinstalldirs) $(DESTDIR)$(docdir)
- for file in $(xml_files); do \
- cp $(srcdir)/$$file $(DESTDIR)$(docdir); \
- done
- if test "$(figdir)"; then \
- $(mkinstalldirs) $(DESTDIR)$(docdir)/$(figdir); \
- for file in $(srcdir)/$(figdir)/*.png; do \
- basefile=`echo $$file | sed -e 's,^.*/,,'`; \
- $(INSTALL_DATA) $$file $(DESTDIR)$(docdir)/$(figdir)/$$basefile; \
- done \
- fi
-
-install-data-hook: install-data-hook-omf
-
-uninstall-local: uninstall-local-doc uninstall-local-omf
-
-uninstall-local-doc:
- -if test "$(figdir)"; then \
- for file in $(srcdir)/$(figdir)/*.png; do \
- basefile=`echo $$file | sed -e 's,^.*/,,'`; \
- rm -f $(docdir)/$(figdir)/$$basefile; \
- done; \
- rmdir $(DESTDIR)$(docdir)/$(figdir); \
- fi
- -for file in $(xml_files); do \
- rm -f $(DESTDIR)$(docdir)/$$file; \
- done
- -rmdir $(DESTDIR)$(docdir)
-
diff --git a/mail/.cvsignore b/mail/.cvsignore
deleted file mode 100644
index ed5262270b..0000000000
--- a/mail/.cvsignore
+++ /dev/null
@@ -1,24 +0,0 @@
-*.bb
-*.bbg
-*.da
-*.gcov
-.deps
-.libs
-GNOME_Evolution_Mail*.server
-GNOME_Evolution_Mail*.server.in
-Makefile
-Makefile.in
-Spell-common.c
-Spell-skels.c
-Spell-stubs.c
-Spell.h
-em-marshal.c
-em-marshal.h
-evolution-mail-1.5.schemas
-evolution-mail-2.2.schemas
-evolution-mail-1.5.schemas.in
-mail-config.gladep
-mail-errors.xml
-test-mail
-test-sources
-test-thread
diff --git a/mail/ChangeLog b/mail/ChangeLog
deleted file mode 100644
index b3214b4a98..0000000000
--- a/mail/ChangeLog
+++ /dev/null
@@ -1,8987 +0,0 @@
-2005-02-04 Not Zed <NotZed@Ximian.com>
-
- * em-subscribe-editor.c (sub_folderinfo_get): reverted jeff's
- patch for the subscribed hint.
-
- ** See bug #65329
-
- * em-folder-properties.c (emfp_dialog_got_folder): translate
- local-store special folders.
-
- * mail-session.c (alert_user, do_user_message): if we aren't
- waiting for cancel, then don't worry about waiting on the reply
- port, otherwise we could block when we don't need to, if there is
- another window already up.
-
-2005-02-03 Jeffrey Stedfast <fejj@novell.com>
-
- * message-list.c (message_list_set_folder): Use
- g_hash_table_foreach_remove() instead so the keys don't point to
- free'd values.
- (normalised_free): Return TRUE.
-
-2005-02-02 Rodney Dawes <dobey@novell.com>
-
- * em-subscribe-editor.c (em_subscribe_editor_new): Use the
- gtk_widget_ensure_style method instead of gtk_widget_realize when
- setting the border widths of the dialog containers for HIG compliance
-
- Fixes #68743
-
-2005-02-02 Jeffrey Stedfast <fejj@novell.com>
-
- Fixes bug #70454
-
- * em-subscribe-editor.c (sub_folderinfo_get): Request subscription
- info (new flag).
- (sub_fill_level): Fixed the FIXME here (imap4 now implements
- CAMEL_FOLDER_SUBSCRIBED flag properly).
-
-2005-02-01 Rodney Dawes <dobey@novell.com>
-
- * em-folder-browser.c: Replace "_Virtual Folder" with "_vFolder" for
- the search menu to create a vfolder from a search
-
- * em-folder-tree-model.c (sort_cb): s/VFolders/vFolders/ for sorting
- in the folder tree
- (em_folder_tree_model_load_state): s/VFolders/vFolders/ in a comment
-
- * em-folder-view.c: s/VFolder/vFolder/ for the popup menu
-
- * em-vfolder-editor.c (em_vfolder_editor_new): Replace the string
- "Virtual _Folders" with "v_Folders" for the label
-
- * em-vfolder-rule.c (em_vfolder_editor_sourcelist_new): Repalce the
- string "VFolder source" with "vFolder source"
-
- * mail-errors.xml:
- * mail-errors.xml.h: Replace "virtual folder" with "vFolder" in an
- error string
-
- * mail-vfolder.c (vfolder_setup_desc): s/vfolder/vFolder/
- (vfolder_setup_do): s/vfolder/vFolder/
- (vfolder_load_storage): s/VFolders/vFolders/
- (vfolder_edit_rule): s/VFolder/vFolder/
- (vfolder_gui_add_rule): s/VFolder/vFolder/
-
- Fixes #68137
-
-2005-02-01 Not Zed <NotZed@Ximian.com>
-
- ** See bug #65329.
-
- * mail-component.c (view_changed_cb): translate special names on
- the local store.
-
- * em-folder-tree-model.c (sort_cb): use the type hint to sort for
- inbox, not the name.
- (emft_is_special_local_folder): removed.
- (em_folder_tree_model_set_folder_info): special-case the
- local-store case, handle translated names and the name hints.
-
- * em-folder-tree.c (render_pixbuf): use the camel folderinfo
- folder type to determine the icon, don't hardcode based on name.
-
- ** See bug #71310
-
- * em-composer-prefs.c (sig_add_script_response): force a save of
- the signatures as soon as they change. Also save the script name
- if we were just editing it, not just the signature name.
-
- ** See bug #71312.
-
- * em-folder-view.c (em_folder_view_open_selected): if we're
- looking at a vfolder, then look open the original folder if we need
- to perform any edits.
-
-2005-01-31 Hans Petter Jansson <hpj@novell.com>
-
- * importers/mail-importer.h (mc): Remove unused global symbol.
-
-2005-01-28 Jeffrey Stedfast <fejj@novell.com>
-
- * message-list.c (message_list_set_folder): Reset the normalised
- string sort table.
-
-2005-01-31 JP Rosevear <jpr@novell.com>
-
- Fixes #71937
-
- * evolution-mail.schemas.in.in: fix spelling error
-
- * mail-errors.xml: fix two spelling errors
-
-2005-01-31 Not Zed <NotZed@Ximian.com>
-
- ** See bug #67083
-
- * em-format-html.c (efh_format_text_header): no-wrap the header line.
-
- ** See bug #69850
-
- * mail-autofilter.c (rule_from_message): dont crash if we're
- missing the requested headers.
-
- ** See bug #71521.
-
- * em-account-editor.c (emae_url_set_hostport): dont ever set a
- NULL host.
-
-2005-01-28 Not Zed <NotZed@Ximian.com>
-
- * em-account-editor.c (emae_service_provider_changed): handle
- 'hide' bits, don't get/set values from the widgets at all.
-
- * em-account-editor.c: put some tables back into the
- druid and editor, since econfig supports tables now.
-
- * em-account-editor.c (emae_service_provider_changed): handle
- 'hide' bits, don't get/set values from the widgets at all.
-
- * em-account-editor.c: put some tables back into the
- druid and editor, since econfig supports tables now.
-
- * em-account-editor.c (emae_service_provider_changed): handle
- 'hide' bits, don't get/set values from the widgets at all.
-
- * em-account-editor.c: put some tables back into the
- druid and editor, since econfig supports tables now.
-
- ** See bug #71520.
-
- * em-account-prefs.c (account_edit_clicked): repeat the nasty hack
- from account_edit, to refresh the list after edit.
-
-2005-01-27 Not Zed <NotZed@Ximian.com>
-
- * See bug #69815.
-
- * mail-component.c (impl_quit): shutdown vfolders as first step.
-
- * mail-vfolder.c (vfolder_setup_do): if we're shutdown during
- processing, just noop.
- (vfolder_adduri_do): same.
- (mail_vfolder_shutdown): set the shutdown flag.
-
-2005-01-27 Rodney Dawes <dobey@novell.com>
-
- * mail-config.glade: Fix the labels in the account druid to be
- left aligned, and justified left
- Fix the border and spacing for all the vboxes in the account druid
- pages to be HIG compliant
- Fix the account naming info label to be more concise
-
- Fixes #68696
-
-2005-01-27 Rodney Dawes <dobey@novell.com>
-
- * mail-send-recv.c (build_dialog): Fix the dialog to have borders
- that are HIG-compliant and fix up the spacing and padding of the
- internal widgets to do the right thing to be HIG compliant
-
-2005-01-27 JP Rosevear <jpr@novell.com>
-
- * em-format-hook.c: add a d(x) debugging define and default to off
-
-2005-01-26 Mengjie Yu <meng-jie.yu@sun.com>
-
- Fixes #71774
-
- * em-folder-tree.c (emft_popup_rename_folder): we should check
- whether the 'new_name' is a NULL pointer to avoid Evolution
- crashes.
-
-2005-01-25 Mengjie Yu <meng-jie.yu@sun.com>
-
- * em-mailer-prefs.c: (restore_labels_clicked),
- (em_mailer_prefs_construct):
- add a11y names for color pickers.
-
-2005-01-24 Hans Petter Jansson <hpj@novell.com>
-
- * Makefile.am (libevolution_mail_la_LIBADD): Pull in the contact
- editors, so we can pass pointers to their creation functions to
- ENameSelectorEntry.
-
-2005-01-24 JP Rosevear <jpr@novell.com>
-
- * searchtypes.xml: add back body contains
-
-2005-01-21 JP Rosevear <jpr@novell.com>
-
- Fixes #46287
-
- * mail-config.glade: remove enable/disable button
-
- * em-composer-prefs.h: remove unused button
-
- * em-composer-prefs.c (spell_language_toggled): handle the cell
- being toggled
- (spell_setup): enable/disable button is gone
- (em_composer_prefs_construct): setup a listener for the toggle
- cell
-
-2005-01-24 Radek Doulik <rodo@ximian.com>
-
- * em-popup.[ch]: removed EM_POPUP_SELECT_MARK_[NO]JUNK masks
-
-2005-01-20 Radek Doulik <rodo@ximian.com>
-
- * em-folder-view.c: patch from Chris Lahey, makes Mark as Junk/not
- Junk items active on all messages, removes calls to
- message_list_get_selected where not needed
-
-2005-01-24 Not Zed <NotZed@Ximian.com>
-
- * searchtypes.xml: changed for 69122.
-
-2005-01-21 JP Rosevear <jpr@novell.com>
-
- Fixes #46404
-
- * em-folder-view.c (emfv_print_response): use the config in the
- print data and free it
- (em_folder_view_print): load the config from e_print and use the
- dialog from e_print
-
-2005-01-21 Not Zed <NotZed@Ximian.com>
-
- ** See bug #60664.
-
- * em-format-html-display.c (efhd_init, efhd_gtkhtml_style_set): if
- the style changes, re-calculate the page colours, and redraw.
-
-2005-01-20 Jeffrey Stedfast <fejj@novell.com>
-
- * em-folder-tree.c (emft_copy_folders__desc): Added a description
- function for copying folders (so we don't get a "Working 0x..."
- status message).
-
- * mail-mt.c (do_op_status): Always g_free(what) since we always
- strdup it.
-
-2005-01-20 Not Zed <NotZed@Ximian.com>
-
- ** See bug #55831.
-
- * evolution-mail.schemas.in.in: added open_many prompt key.
-
- * mail-errors.xml: added ask-open-many
-
- * em-folder-view.c (em_folder_view_open_selected): put back the
- 'you're opening too many are you sure' thing.
-
-2005-01-19 Jeffrey Stedfast <fejj@novell.com>
-
- * em-folder-properties.c (emfp_get_folder_item): Increment i each
- time thru the loop or we lose widgets.
-
-2005-01-19 Not Zed <NotZed@Ximian.com>
-
- ** See bug #66943.
-
- * em-composer-utils.c (save_draft_done): check if the
- editor_engine is still there before trying to invoke a method on
- it.
- (em_utils_composer_save_draft_cb): grab resources before getting
- the folder, so the composer doesn't go away.
-
-2005-01-18 Rodrigo Moya <rodrigo@novell.com>
-
- * em-filter-source-element.c:
- * mail-config.c: removed e-url.h include.
-
-2005-01-18 Not Zed <NotZed@Ximian.com>
-
- ** See bug #70768.
-
- * em-folder-browser.c (emfb_mark_all_read): get the uid list from
- the message-list (view) rather than folder (model).
-
- * message-list.c (message_list_foreach): removed, no longer used.
- (message_list_get_uids): new function replacing ml_foreach, get
- visible uids's of messages.
-
-2005-01-18 Not Zed <NotZed@Ximian.com>
-
- ** See bug #71105.
-
- * em-folder-tree.c (emft_popup_rename_folder): dont let a user
- rename a folder to one including '/'.
-
- * em-format-html.c (emfh_gethttp): kill old 'load http 0 now=0' debug.
-
- ** See bug #70563.
-
- * em-utils.c (emu_set_proxy, emu_proxy_setup)
- (em_utils_get_proxy_uri): make sure the init code is called from
- main thread (gconf usage), and add locking for data consistency.
-
-2005-01-14 Not Zed <NotZed@Ximian.com>
-
- ** Related to changes for #65178.
-
- * mail-vfolder.c (mv_find_folder): changed from my_list_find, take
- store arg and use camel_Store_Folder_uri_equal() instead of wrong
- uri_cmp function.
- (mail_vfolder_delete_uri): same.
- (mail_vfolder_rename_uri): same.
- (uri_is_ignore): take store arg, and same as above. use the right
- uri for checking sent folder.
- (mail_vfolder_*): convert to storing uri's in camel form.
-
-2005-01-13 Not Zed <NotZed@Ximian.com>
-
- ** See bug #71029.
-
- * em-account-editor.c (emae_option_toggle): revert menjie's patch
- and do it using object args.
-
-2005-01-12 Not Zed <NotZed@Ximian.com>
-
- ** See bug #70990.
-
- * em-account-editor.c (emae_service_url_changed): if the value is
- "" then don't set it
-
- ** See bug #70018.
-
- * mail-signature-editor.c (mail_signature_editor): use the right
- version for the gtkhtml editor control.
-
-2005-01-11 Vivek Jain <jvivek@novell.com>
-
- * em-folder-tree.c (render_pixbuf): Added conditions to check for
- shared folders to display different icon if it is a shard folder.
-
-2005-01-07 Not Zed <NotZed@Ximian.com>
-
- * em-account-prefs.c (account_add_clicked): remove old code, setup
- transient parent and weak ref for refresh.
-
-2005-01-06 JP Rosevear <jpr@novell.com>
-
- * Makefile.am: install schemas properly
-
-2005-01-06 Jeffrey Stedfast <fejj@novell.com>
-
- * mail-folder-cache.c (mail_note_store): Handle the
- CamelOfflineStore case just like the CamelDiscoStore case.
-
- * mail-ops.c (prep_offline_do): Since we can't kill off
- CamelDisco* (groupwise is using it), we have to handle both
- CamelOfflineFolder and CamelDiscoFolder for now.
- (set_offline_do): Same.
-
-2005-01-05 Not Zed <NotZed@Ximian.com>
-
- * em-menu.c: (emph_targets[]): Add the widget target, missed this.
-
-2005-01-05 Not Zed <NotZed@Ximian.com>
-
- * em-menu.c (em_menu_target_new_widget): add a semi-dummy target
- for widget target.
-
- * mail-component.c (handleuri_got_folder): handle the "reply"
- parameter, if set.
-
- * em-composer-utils.c (em_utils_reply_to_message): only ref the
- source if supplied.
- (reply_to_message): only unref the source if supplied.
-
-2004-12-28 Mengjie Yu <meng-jie.yu@sun.com>
-
- * em-folder-tree.c: (em_folder_tree_new_with_model):
- add atk name for the treeview.
-
-2004-12-22 Not Zed <NotZed@Ximian.com>
-
- * em-account-editor.c (emae_needs_auth): moved to after
- emae_authtype_changed to fix warning.
-
-2004-12-17 Not Zed <NotZed@Ximian.com>
-
- * em-format-html-display.c (efhd_attachment_popup):
-
- * message-list.c (ml_tree_drag_data_received):
-
- * em-folder-view.c (emfv_popup, emfv_format_popup_event):
-
- * em-folder-tree.c (tree_drag_data_received): api changes.
- (emft_popup):
-
- * em-popup.c (emp_standard_menu_factory)
- (emp_standard_menu_factory): api changes.
-
-2004-12-21 Not Zed <NotZed@Ximian.com>
-
- * em-account-editor.c (emae_needs_auth): if we're turned on, then
- record the current authtype setting on the widgets, if we're
- turned off, clear the authmech setting.
- (emae_setup_service): setup the needs auth after the authtype, and
- get setting from url->authmech.
- (emae_service_provider_changed): only clear the url->authmech if
- we don't have the current one in our list.
-
-2004-12-20 Takeshi AIHANA <aihana@gnome.gr.jp>
-
- * default/Makefile.am: Added 'ja' and 'nl' to install.
-
-2004-12-14 Rodney Dawes <dobey@novell.com>
-
- * mail-account-gui.c: Remove this from CVS
-
- * mail-config.glade: Use em_account_editor_folder_selector_button_new
- instead of mail_account_gui_folder_selector_button_new
-
-2004-12-14 JP Rosevear <jpr@novell.com>
-
- Fixes #68759
-
- * mail-account-gui.c (service_check_supported): fix typo in
- routine name
-
-2004-12-08 Hans Petter Jansson <hpj@novell.com>
-
- * importers/pine-importer.c: Include <libebook/e-destination.h> from
- evolution-data-server.
-
-2004-12-08 Rodney Dawes <dobey@novell.com>
-
- * em-folder-tree.c:
- * mail-component.c (impl__get_userCreatableItems):
- Use stock_new-dir instead of stock_folder for "New Folder" creation
-
-2004-12-07 Mengjie Yu <meng-jie.yu@sun.com>
-
- * mail-config.glade: add mnemonic for buttons, labels, etc.
- * mail-dialogs.glade:add mnemonic for buttons, labels, etc.
- * message-tags.glade:add mnemonic for buttons, labels, etc.
-
-2004-12-08 Not Zed <NotZed@Ximian.com>
-
- * mail-component-factory.c (make_factory): and put them here
- instead so they're available even when the mailer isn't activated
- yet.
-
- * mail-component.c (mc_startup): remove plugin hook registrations.
-
-2004-11-22 Not Zed <NotZed@Ximian.com>
-
- * em-account-editor.c (emae_receive_options_extra_item): dont
- track containee widgets anymore, they are automagically destroyed
- by the container if required.
-
-2004-11-25 Radek Doulik <rodo@ximian.com>
-
- * em-junk-filter.c (em_junk_sa_test_spamd): do not call gconf here
- as we may be called from worker thread
- (em_junk_filter_get_plugin): read alternative spam[cd] binaries
- paths here, use init lock to be sure no one is accessing spam[cd]
- binaries paths
-
- Fixes #69623
-
-2004-12-01 Mengjie Yu <meng-jie.yu@sun.com>
-
- * em-account-editor.c:according to the HIG, remove accelerators in
- the notebook tab labels
-
-2004-12-01 Mengjie Yu <meng-jie.yu@sun.com>
-
- * em-account-editor.c: (emae_option_toggle),
- (emae_receive_options_item):add mnemonic for buttons.
- * em-format-html-display.c: (efhd_attachment_button):add atk name
- for the popup button.
- * mail-account-gui.c: (mail_account_gui_build_extra_conf):add
- access key for checkbox.
- * message-list.c: (message_list_construct):add a atk name for the
- message list.
-
-2004-11-22 Not Zed <NotZed@Ximian.com>
-
- ** See bug #69339.
-
- * em-format-html.c (efh_format_do): after closing the base output
- stream, re-loop if more jobs were queued.
-
-2004-11-19 Not Zed <NotZed@Ximian.com>
-
- ** See bug #69339.
-
- * em-format-html.c (efh_format_do): close the stream/html after we're
- finished, since the multipart/related stuff may write more content
- for orphaned attachments.
-
-2004-11-23 Not Zed <NotZed@Ximian.com>
-
- ** See bug #69579.
-
- * em-folder-properties.c (em_folder_properties_show): check to see
- if the vfolder is the unmatched folder before letting the user try
- to see its properties.
-
-2004-11-30 Not Zed <NotZed@Ximian.com>
-
- ** See bug #68958.
-
- * em-folder-browser.c (emfb_list_built): if the pending selected
- uid isn't in the folder (yet), don't clear it, just keep it
- around. Hook/unhook folder_changed events.
- (emfb_folder_changed, emfb_gui_folder_changed): if a select_uid is
- set, and the message is now available, then select it.
-
-2004-11-28 S.Çağlar Onur <caglar@uludag.org.tr>
-
- ** See bug #69446.
-
- * evolution-2.0.2/mail/mail-account-gui.c (mail_account_gui_setup):
- some strcasecmp() calls changed with g_ascii_strcasecmp() for Turkish
- character conversiton problems [ http://www.i18nguy.com/unicode/turkish-i18n.html ]
-
-2004-11-26 JP Rosevear <jpr@novell.com>
-
- * em-format.c: wrap printf's in debug defines
-
-2004-11-26 JP Rosevear <jpr@novell.com>
-
- * em-format-html-display.c (efhd_xpkcs7mime_button): get image
- widget directly from icon factory
-
- * mail-send-recv.c (build_dialog): ditto
-
-2004-10-12 Radek Doulik <rodo@ximian.com>
-
- * em-junk-filter.c: when starting new spamd, call it with
- --socketpath parameter to use unix sockets instead of opening TCP
- port. kill such started daemon in finalize callback which is
- installed by atexit. also try to respawn spamd in case spamc
- returns error, if respawning is too fast (8 restarts in last 5
- minutes) fallback to spamassassin
-
- * mail-component.c (impl_quit): call mail_session_quit
-
- * mail-session.c (mail_session_init): call junk plugin init
- (mail_session_quit): new method, called on evo exit
-
-2004-11-22 Joan Sanfeliu <joan@fibranet.com>
-
- * mail-config.glade : Evolution word spelled with an uppercase E
-
- Fixes #61065
-
-2004-11-16 Not Zed <NotZed@Ximian.com>
-
- * Makefile.am:
- * importers/Makefile.am: Removed camel linking.
-
-2004-11-15 Not Zed <NotZed@Ximian.com>
-
- * *.c: Moved various things from e-util to libedataserver.
-
- * GNOME_Evolution_Mail.server.in.in: remove the startup wizard stuff.
-
- * mail-config-druid.[ch]:
- * mail-account-editor.[ch]:
- * mail-account-gui.[ch]: removed & deleted.
-
- * mail-session.c (mail_session_init): and here too.
- * em-migrate.c (em_migrate_1_4): init camel-provider library too.
- (e_path_to_physical): copy from e-util/e-path.c.
-
- * Makefile.am (libevolution_mail_la_LIBADD): link to new libcamel
- provider too.
-
-2004-11-12 Not Zed <NotZed@Ximian.com>
-
- * filtertypes.xml:
- * vfoldertypes.xml:
- * searchtypes.xml: Added 'match all' rules.
-
- ** Merge in notzed-messageinfo-branch.
-
-2004-11-11 Radek Doulik <rodo@ximian.com>
-
- * em-format-hook.c (emfh_enable): l = g_list_next (l); in inner
- loop instead of g = g_list_next (l).. probably typo after c'n'p
-
- * em-format.c (em_format_class_remove_handler): in case the old
- handler doesn't exist, remove 'info' handler from type_handler
- table
-
-2004-11-03 Not Zed <NotZed@Ximian.com>
-
- * em-folder-view.c (emfv_popup): Fix the popup id.
-
-2004-11-03 Not Zed <NotZed@Ximian.com>
-
- * em-folder-view.c (emfv_list_done_message_selected): revert
- jeff's last change - we do actually want to know when we couldn't
- load a message. the crash he was fixing was fixed elsewhere.
- also fix the unref ordering stuff.
-
- * em-format-html.c (efh_format_timeout): removed the fixme i
- added.
-
-2004-11-01 Not Zed <NotZed@Ximian.com>
-
- ** See bug #67496.
-
- * em-format-html.c (efh_text_html): use the base on the emformat
- to calculate our absolute iframe uri.
- (efh_multipart_related): same as emf_multipart_related.
-
- * em-format.c (emf_multipart_related): remove content-location
- handling, now done in format_part_as.
- (em_format_part_as): track content-base (& absolute
- content-location) of all parts here.
-
-2004-11-02 Not Zed <NotZed@Ximian.com>
-
- * em-event.c (eme_target_free, em_event_target_new_message):
- handle NULL folder or message.
-
-2004-11-02 Jeffrey Stedfast <fejj@novell.com>
-
- * em-folder-view.c (emfv_list_done_message_selected): Check for
- NULL messages (happens if the message isn't available).
-
-2004-11-02 Radek Doulik <rodo@ximian.com>
-
- * em-format-html.c: replace 3 nested html tables used to create
- this gray border around parts content with div block with border
- style
- use shorthand border: property
-
-2004-11-01 Jeffrey Stedfast <fejj@novell.com>
-
- * em-account-editor.c: Change the labels back to the same as they
- were in 2.0
-
-2004-11-12 Not Zed <NotZed@Ximian.com>
-
- * mail-send-recv.c (auto_account_finalised): fix the callback
- signature.
-
-2004-11-11 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (mc_add_store):
- (mc_add_store_done): Let the counters know about the junk/trash
- folders that have already been opened.
-
- * em-vfs-stream.[ch]: Added stream class to read/write gnome-vfs
- data from camel. NFI if this will work, depends on how
- thread-safe gnome-vfs is.
-
-2004-11-08 Not Zed <NotZed@Ximian.com>
-
- * mail-vfolder.c (uri_is_spethal): fix the special check for local
- folders.
-
-2004-10-30 Not Zed <NotZed@Ximian.com>
-
- * */*.c, *.c: camel api changes.
-
-2004-10-28 Not Zed <NotZed@Ximian.com>
-
- * mail-folder-cache.c (real_flush_updates):
- * em-message-browser.c (em_message_browser_new):
- * em-mailer-prefs.c (em_mailer_prefs_construct):
- * em-format-html-display.c (efhd_attachment_popup):
- * em-folder-view.c (emfv_popup, emfv_list_done_message_selected)
- (emfv_format_popup_event):
- * em-folder-tree.c (emft_popup):
- * em-folder-properties.c (emfp_dialog_got_folder):
- * em-folder-browser.c (em_folder_browser_new):
- * em-composer-utils.c (em_utils_reply_to_message):
- * em-composer-prefs.c (em_composer_prefs_construct):
- * em-account-editor.c (em_account_editor_construct): added hook
- docs, and cleaned up some of the hook point names.
-
-2004-10-22 Jeffrey Stedfast <fejj@novell.com>
-
- * em-folder-tree.c: Give the Rename item a different path than the
- Delete item.
-
-2004-10-22 Not Zed <NotZed@Ximian.com>
-
- * em-event.c (eme_target_free): duh, they're camel not gobjects.
-
- * em-folder-view.c (emfv_list_done_message_selected): added a
- message.reading event.
-
-2004-10-22 Nat Friedman <nat@novell.com>
-
- * em-event.c: Add a REPLY_ALL flag to the Message target.
- * em-composer-utils.c (em_utils_reply_to_message): Set the
- REPLY_ALL flag when appropriate.
-
-2004-10-21 Not Zed <NotZed@Ximian.com>
-
- * em-composer-utils.c (em_utils_reply_to_message): emit a
- 'message.replying' event with a message target.
-
-2004-10-21 Nat Friedman <nat@novell.com>
-
- * em-event.c (em_event_target_new_message): new target type for
- message-related events.
-
-2004-10-21 Not Zed <NotZed@Ximian.com>
-
- * em-folder-view.c (emfv_format_popup_event): put 'evolution' back
- in the popup hook names.
-
-2004-10-19 JP Rosevear <jpr@novell.com>
-
- * em-account-editor.c, em-composer-prefs.c, em-config.c,
- em-event.c, em-folder-browser.c, em-folder-properties.c,
- em-folder-tree.c, em-folder-view.c, em-format-hook.c,
- em-format-html-display.c, em-mailer-prefs.c, em-menu.c,
- em-message-browser.c, em-popup.c, message-list.c: convert to
- org.gnome hook names
-
-2004-10-19 JP Rosevear <jpr@novell.com>
-
- * message-list.c: convert to G_DEFINE_TYPE
-
-2004-10-11 Not Zed <NotZed@Ximian.com>
-
- ** See bug #67014.
-
- * mail-errors.xml: added "checking-service" error.
-
- * em-account-editor.c (em_account_editor_construct): keep track of
- the dialogue
- (emae_editor_destroyed): , and clean up when destroyed.
-
- * em-account-editor.c (emae_check_authtype)
- (emae_check_authtype_response, emae_check_authtype_done): handle
- checking authtype gui here.
-
- * mail-config.c (check_service_describe, check_service_check)
- (check_response, mail_config_check_service): removed.
-
- * mail-ops.c (mail_check_service): moved here from mail-config,
- and modified to be a re-usable threaded function.
-
-2004-10-18 Not Zed <NotZed@Ximian.com>
-
- ** See bug #68006.
-
- * em-folder-view.c (emfv_init): dont ref/sink the invisible.
- (emfv_destroy): just destroy it here.
-
-2004-10-15 Not Zed <NotZed@Ximian.com>
-
- * em-composer-utils.c (create_new_composer):
- (em_utils_compose_new_message, forward_non_attached): do noting if
- the composer couldn't be created. We get a popup from elsewhere
- to let the user know.
-
-2004-10-14 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * mail-errors.xml : Remove Pango markup from groupwise
- account setup error message
-
-2004-10-12 Not Zed <NotZed@Ximian.com>
-
- * em-format-html-display.c (efhd_find_handler): use builtin
- handlers (and plugins) always overriding bonobo ones.
-
-2004-10-11 Not Zed <NotZed@Ximian.com>
-
- ** See bug #67408.
-
- * em-folder-view.c (emfv_gui_folder_changed): noop if we were
- destroyed.
- (emfv_destroy): set destroyed bit.
-
-2004-10-11 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (mc_startup): register the formatter types
- before registering the formatter hook.
-
-2004-10-08 JP Rosevear <jpr@novell.com>
-
- * mail-account-gui.c (browse_clicked): use "Select a file"
-
-2004-10-08 Harry Lu <harry.lu@sun.com>
-
- * em-folder-tree.c: (em_folder_tree_class_init), (real_popup_menu),
- (emft_popup_menu), (emft_tree_button_press): implement popup_menu
- so that popup menu can be shown with Shift+F10 on folder tree.
- * em-folder-view.c: (emfv_popup), (emfv_list_key_press):
- same as above.
-
-2004-10-07 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (mc_startup): dont init the base plugin system
- here anymore, only register the hook types for mail hooks.
-
-2004-09-28 Not Zed <NotZed@Ximian.com>
-
- * em-composer-utils.c (forward_non_attached): put back in the
- attachment attaching code. Doesn't work for s/mime and pgp, but
- why bother arguing about it.
-
-2004-10-06 Not Zed <NotZed@Ximian.com>
-
- * em-folder-tree.c (emft_get_folder_info__desc): fix busted cast.
-
- * *.c: e-popup api changes.
-
-2004-10-06 Not Zed <NotZed@Ximian.com>
-
- * em-folder-tree.c (emft_tree_button_press): remove some debug
- that made it in accidentally.
-
-2004-10-05 Not Zed <NotZed@Ximian.com>
-
- * em-folder-tree.c (emft_popup_copy_folder_selected): remove old
- debug which no longer works.
-
- ** See bug #66991 (related to #64377).
-
- * em-folder-tree.c (em_folder_tree_set_selected): if we get a NULL
- uri or "", just clear the list.
- (emft_tree_button_press): select the new path as well as move the
- cursor there, otherwise emft_tree_user_event clears the selection.
-
-2004-09-30 David Malcolm <dmalcolm@redhat.com>
-
- * em-migrate.c (upgrade_passwords_1_2): fix uninitialised pointer.
-
-2004-09-27 Jeffrey Stedfast <fejj@novell.com>
-
- * em-account-editor.c: Changed the SSL option menu labels.
-
-2004-09-21 Not Zed <NotZed@Ximian.com>
-
- ** See bug #63521.
-
- * mail-ops.c (fetch_mail_fetch): delete all the messages on the
- server if we're not in keep on server mode and everything worked.
- uncancel ourselves before saving the cache uid since it could be
- cancelled otherwise.
-
-2004-09-24 Not Zed <NotZed@Ximian.com>
-
- ** See bug #66706.
-
- * em-subscribe-editor.c: add a sequence number to EMSubscribe and
- the subscribe_msg structures. NOOP if the sequence has changed in
- all callbacks. up the sequence number when we refresh.
-
-2004-09-20 Not Zed <NotZed@Ximian.com>
-
- ** See bug #65329.
-
- * em-folder-tree-model.c (emft_is_special_local_folder): added
- helper for finding local folders for translation.
- (em_folder_tree_model_set_folder_info): translate the special
- local folder names.
-
- * mail-component.c: mark standard folder names for translation.
-
-2004-09-23 Not Zed <NotZed@Ximian.com>
-
- ** See bug #65058 (again again).
-
- * em-format-html.c (efh_text_html): calculate our location uri
- ourselves (content id).
-
- * em-format.c (em_format_add_puri): if we have no content-location
- key, don't fallback to any container's location.
-
-2004-09-23 Not Zed <NotZed@Ximian.com>
-
- * em-folder-tree.c (emft_get_folder_info__desc): describe the
- get-folder process. This also makes it cancellable.
-
- ** See bug #64972.
-
- * em-composer-utils.c (em_utils_reply_to_message): pass the folder
- to guess_account.
-
-2004-09-03 Not Zed <NotZed@Ximian.com>
-
- ** See bug #65058.
-
- * em-format-html.c (efh_image): use the content-id rather than
- the uri for tracking our image reference. Makes more
- sense anyway, its guaranteed unique.
-
-2004-09-21 David Malcolm <dmalcolm@redhat.com>
-
- * em-folder-tree-model.c (em_folder_tree_model_set_selected): Fix
- a typo setting the root node.
-
-2004-09-09 Jeffrey Stedfast <fejj@novell.com>
-
- * em-message-browser.c (emmb_set_message): Ignore the
- emfv->mark_seen for deciding whether or not to mark the message as
- seen. Fixes bug #65448.
-
-2004-09-09 Jeffrey Stedfast <fejj@novell.com>
-
- * mail-account-gui.c (mail_account_gui_new): If built with
- gtkfilechooser support, we need to add a checkbox in the chooser
- so that the user can select files or folders (allowing him to
- choose - otherwise they won't be able to setup certain types of
- accounts). Fixes bug #64974.
-
-2004-09-12 JP Rosevear <jpr@novell.com>
-
- Fixes #65703
-
- * em-popup.c: use proper stock icon name
-
-2004-09-08 Not Zed <NotZed@Ximian.com>
-
- ** See bug #60515.
-
- * mail-account-gui.c (sig_fill_menu): connect to the activate
- signal for the none item.
-
-2004-09-03 Not Zed <NotZed@Ximian.com>
-
- ** See bug #59717.
-
- * mail-config.c (mail_config_check_service): Make the dialog
- modal. Not ideal but a problem with the way the function works,
- it should be fully async instead.
-
-2004-09-01 Jeffrey Stedfast <fejj@novell.com>
-
- Fix for bug #63377 and prevention of similar cases.
-
- * em-format.c (emf_finalise): Free the default_charset.
- (emf_format_clone): Clone the default_charset - this prevents the
- particular crash described in bug #63377.
-
- * em-utils.c (em_utils_message_to_html): If source is NULL, set
- our own default charset (from the user's gconf key) on the
- formatter to make sure there's always a source charset for
- conversion to UTF-8.
-
-2004-08-30 Jeffrey Stedfast <fejj@novell.com>
-
- * em-folder-tree.c (emft_popup_delete_folder): Set the store and
- full_name info on the dialog.
- (emft_popup_delete_response): Use the requisite data stored on the
- dialog object rather than examining the selection again. Fixes bug
- #62665.
-
-2004-08-30 Not Zed <NotZed@Ximian.com>
-
- ** See bug #64377.
-
- * em-folder-selector.c (emfs_response): only set the uri if we
- have one to set.
-
- * em-folder-tree.c (em_folder_tree_finalize): Removed
- cose using selected_path and selected_uri strings.
- (emft_popup_new_folder): "
- (emft_popup_copy_folder_selected): "
- (emft_tree_selection_changed):
- (emft_tree_row_activated): ", free paths after use.
-
- * em-folder-selector.c (emfs_create_name_changed): free
- get_selected_uri return.
- (emfs_create_name_activate): "
- (em_folder_selector_get_selected_path): handle api change, store
- the selected_path too.
-
- * em-folder-tree.c (em_folder_tree_get_selected_uri):
- de-constify,and get the selection directly from the tree.
- (em_folder_tree_get_selected_path): same.
-
-2004-08-27 Not Zed <NotZed@Ximian.com>
-
- ** See bug #63456.
-
- * message-list.c (main_folder_changed): noop if the async_event
- pointer is NULL which can happen during destroy.
-
-2004-08-27 JP Rosevear <jpr@novell.com>
-
- * importers/mail-importer.c (import_folders_rec): utf8_filename
- should be char * not char
-
-2004-08-27 Hans Petter Jansson <hpj@ximian.com>
-
- * em-utils.c (emu_can_save): Don't crash if we're passed a NULL
- path. GtkFileChooser can return NULL filenames that get passed
- to this function.
-
-2004-08-26 Christian Neumair <chris@gnome-de.org>
-
- * GNOME_Evolution_Mail.server.in.in:
- Don't mark component menu accel for translation.
-
-2004-08-24 Jeffrey Stedfast <fejj@novell.com>
-
- Fix for bug #63177
-
- * em-folder-tree.c (emft_drop_async_drop): Check full_name == NULL
- rather than full_name[0] since store's have NULL full_names, not
- empty string (like they used to).
- (emft_drop_folder): Same.
- (tree_drag_data_received): Don't abort the drop if the user
- dropped on a store, this is allowed (depending on the store).
-
-2004-08-25 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (store_info_new): only open the trash or junk
- if they're vfolders here. Some stores that implement their own
- trash folders are unacceptably slow to open otherwise.
-
-2004-08-25 Frederic Crozat <fcrozat@mandrakesoft.com>
-
- * importers/evolution-mbox-importer.c (load_file_fn):
-
- * importers/evolution-outlook-importer.c (load_file_fn):
-
- * importers/mail-importer.c (import_folders_rec): Convert filename
- to UTF-8 from local encoding before displaying it.
-
-2004-08-23 Not Zed <NotZed@Ximian.com>
-
- * em-folder-tree.c (em_folder_tree_set_selected): store the
- select-uri on the view not in the thread message.
- (emft_get_folder_info__free):
- (emft_get_folder_info__got): select_uri removed.
- (em_folder_tree_set_selected_list): don't set each selected
- separately, do it as a list.
- (emft_maybe_expand_row): if this is a selected row, select it too.
- (emft_get_folder_info__got): do no pending set selection stuff
- here.
- (em_folder_tree_set_selected): just call set_selected_list with
- one item.
- (emft_expand_node): if this is a selected row, select it too.
- (emft_get_folder_info__got): no longer need to track lost folders.
- (emft_tree_row_activated): clear the pending select list.
- (emft_tree_selection_changed): and here too.
- (em_folder_tree_get_selected_uris): get the lost folders from the
- un-applied selected ones now. also fixes a list appending error.
- (emft_tree_user_event): find out when the user hits a key or mouse
- button to override any pending single-user select and don't
- override the cursor setting either.
- (emft_tree_row_expanded): set the 'load subdirs' false before we
- load it, so we don't try to load it again if its still being
- loaded.
- (emft_get_folder_info__got): don't check the loaded flag here, it
- should be set by the callee, also check the exception return.
-
-2004-08-13 Jeffrey Stedfast <fejj@novell.com>
-
- Fix for bug #62812
-
- * em-format-html-display.c (em_format_html_display_search): Set
- the search_dialog to be transient for the parent window and make
- sure to destroy the search_dialog when the parent gets destroyed.
-
-2004-08-21 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * mail-erros.xml: changed the groupwise account setup error
- message
-
-2004-08-16 Not Zed <NotZed@Ximian.com>
-
- ** See bug #62963.
-
- * message-list.c (build_tree, build_flat): define selected in
- declaration block, not inline. Spotted by Vincent Noel
- <vnoel@cox.net>
-
-2004-08-13 Not Zed <NotZed@Ximian.com>
-
- * em-utils.c (em_utils_message_to_html): don't include the
- terminating NUL in the data length.
- (em_utils_part_to_html): nor here.
-
-2004-08-12 Carlos Garnacho Parro <carlosg@gnome.org>
-
- * em-utils.c: Optionally use GtkFileChooser if compiled against
- Gtk+ >= 2.4.0
-
- * mail-config.glade: added the "use_filechooser" property to the
- various GnomeFileEntries
-
-2004-08-10 Jeffrey Stedfast <fejj@novell.com>
-
- Partial fix for bug #62771
-
- * em-format-quote.c (emfq_format_header): Same.
-
- * em-format-html.c (efh_format_header): Decode the
- X-Mailer/User-Agent headers.
-
-2004-08-10 Not Zed <NotZed@Ximian.com>
-
- * mail-session.c (get_password): just call
- e_passwords_ask_password directly.
- (pass_activate, pass_response, request_password, do_get_pass)
- (do_free_pass, main_forget_password): no longer required as
- e_password now handles the magic, and is thread safe.
-
- * mail-config.c (mail_config_write_on_exit): epasswords api
- change.
-
-2004-08-06 Jeffrey Stedfast <fejj@novell.com>
-
- * em-folder-tree-model.c (em_folder_tree_model_get_selected):
- Return NULL not FALSE on error.
-
-2004-06-08 Karsten Bräckelmann <guenther@rudersport.de>
-
- * em-format-html-display.c (smime_encrypt_table[4]): minor typo,
- uppercase 'the' corrected.
-
-2004-08-03 Jeffrey Stedfast <fejj@novell.com>
-
- * em-composer-utils.c (format_sender): If type="{Sender}" and name
- is an empty string, use the addr. Fixes bug #62377
-
-2004-08-01 JP Rosevear <jpr@novell.com>
-
- * default/C/Inbox: Update to just call us "Evolution" and be more
- accurate about the new features included
-
-2004-07-29 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * mail-errors.xml: add the error message needed for groupwise
- account setup
-
-2004-07-28 Not Zed <NotZed@Ximian.com>
-
- ** See #61958.
-
- * mail-folder-cache.c (real_flush_updates): remove the soreinfo
- lookup, it isn't used anywhere anymore.
- (mail_note_folder): hook onto the events outside of the lock, and
- don't pass the mfi pointer anymore.
- (mail_note_store): hook onto the events outside of the lock.
- (folder_changed, folder_finalised, folder_renamed): lookup the mfi
- if needed, it is no longer passed to the callback.
- (unset_folder_info): change unhook calls for new parameters.
-
-2004-07-28 Not Zed <NotZed@Ximian.com>
-
- ** See #61940.
-
- * em-composer-utils.c (composer_set_body): add emformat source arg.
- (em_utils_reply_to_message): take source arg. Fixed callers.
-
- * em-utils.c (em_utils_message_to_html): take a source formatter
- argument, so we can copy/honour settings from it.
- (em_utils_part_to_html): similar.
-
-2004-07-27 Not Zed <NotZed@Ximian.com>
-
- ** See #57972.
-
- * message-list.c (search_func): removed.
- (ml_search_path): new function to just search, not actually change
- the cursor like e_tree_find does.
- (message_list_can_select): new function, returns true if the
- selection specified is possible without changing the selection.
- (message_list_select): rewritten.
- (select_path): helper to select a path in a way that 'works
- reliably'.
- (message_list_select_next_thread): rewritten to use the
- table-adapter, so it properly handles arbitrary sorting.
-
- * em-folder-view.c (em_folder_view_get_popup_target): setup
- next/prev flags as appropriate.
- (emfv_enable_map[]): setup next/prev flags.
-
- * em-folder-view.h: added last and first message status bits to
- folder view select mask.
-
-2004-07-23 Radek Doulik <rodo@ximian.com>
-
- * added len parameter to em_utils_part_to_html and
- em_utils_message_to_html. it is used to return length of returned
- buffer. we use that info later when setting composer body content.
-
-2004-07-22 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (impl_createControls): dont call
- e_error_default parent here, we dont have access to the toplevel
- yet.
-
-2004-07-23 Not Zed <NotZed@Ximian.com>
-
- ** See bug #61824.
-
- * em-popup.c (emp_part_popup_reply_sender)
- (emp_part_popup_reply_list, emp_part_popup_reply_all): use new
- api. We have no uid/folder to update here.
-
- * em-folder-view.c (emfv_message_reply): use new api for replying
- so we can supply the message content and have flags updated.
-
- * em-composer-utils.c (em_utils_reply_to_message): added optional
- folder and uid.
- (em_utils_reply_to_message_by_uid): removed, use the other
- interface instead.
- (reply_to_message): just call reply_to_message if we get a message
- to reply to.
- (em_utils_reply_to_message): if no message supplied, load it via
- the uid.
-
-2004-07-22 Not Zed <NotZed@Ximian.com>
-
- * em-utils.c (em_utils_part_to_html, em_utils_message_to_html):
- set the session on the formatter. See #61767.
-
-2004-07-22 Not Zed <NotZed@Ximian.com>
-
- ** See bug #61747.
-
- * message-list.c (search_func): don't emit a message_selected here
- (god knows why we did?). Don't update cursor_uid either, just
- clear it.
- (message_list_select): select the path if we find it here, causing
- the cascade of selection action.
-
-2004-07-19 Jeffrey Stedfast <fejj@novell.com>
-
- * em-migrate.c (em_migrate_folder): Free uri and name
- strings. Fixes a leak.
-
-2004-07-13 Jeffrey Stedfast <fejj@novell.com>
-
- * em-folder-view.c (emfv_message_reply): Chck that the selection
- is active. Hopefully this will fix bug #61427.
-
-2004-07-13 Dan Winship <danw@novell.com>
-
- * em-utils.c (em_utils_selection_set_urilist,
- em_utils_temp_save_part): free return value from e_mkdtemp
-
-2004-07-09 Not Zed <NotZed@Ximian.com>
-
- * em-folder-browser.c (emfb_folder_expunge): only call expunge if
- the folder is set.
- (emfb_enable_map[]): only enable expunge menu item if we have a
- valid folder set.
-
- ** See bug #60900.
-
- * em-format-html.c: convert the text_inline_parts hash to be keyed
- off the partid.
- (efh_free_inline_parts): -> efh_free_cache and fix to do it.
-
- * em-format.c (emf_free_cache): make the inline table cache other
- info too based on partid, this frees the structure.
- (emf_clone_inlines): copy all of the cache data.
- (em_format_is_inline): use the new data structure to determine
- state.
- (em_format_set_inline): same for setting.
- (emf_multipart_signed): cache/lookup the cached part.
- (emf_insert_cache): helper to add a cache entry.
- (emf_multipart_encrypted): cache decrypted part.
- (emf_application_xpkcs7mime): same.
-
-2004-07-08 Not Zed <NotZed@Ximian.com>
-
- ** See bug #60900 (related only).
-
- * em-format-html-display.c (efhd_attachment_show): let set_inline
- do the redraw itself if required. kill some dead code.
-
- * em-format.c (em_format_set_inline): trigger a redraw here like
- the other em_format_set methods, if the state changed.
-
- * em-format.c (emf_format_clone): free inline table keys & setup
- string hash table.
-
- * em-format-quote.c (emfq_format_attachment):
- * em-format-html-display.c (efhd_format_attachment):
- * em-format-html.c (efh_format_attachment): is_inline api changes.
-
- * em-format-html-display.c (efhd_attachment_show): set_inline api
- changes.
-
- * em-format.c (em_format_is_inline): make this use the partid
- rather than the part address as a key, which may change.
- (emf_init): make the inline talbe a string hashtable.
- (emf_finalise): free inline keys.
- (emf_clone_inlines): copy the key string.
-
-2004-07-07 Jeffrey Stedfast <fejj@novell.com>
-
- Fix for bug #61199.
-
- * em-format-html.c (efh_format_address): Same.
-
- * em-format-quote.c (emfq_format_address): Make sure 'real' isn't
- NULL before using.
-
-2004-07-08 Frederic Crozat <fcrozat@mandrakesoft.com>
-
- * Makefile.am:
- tarball should ship .schemas.in.in files, not generated files.
-
-2004-07-02 JP Rosevaer <jpr@novell.com>
-
- * Makefile.am (SUBDIRS): Revert previous error change
-
-2004-09-10 Not Zed <NotZed@Ximian.com>
-
- * em-*: various doco updates.
-
- * em-format-quote.c (emfq_builtin_init): instead of removing the
- type, just add an override noop. Changed api's.
-
-2004-09-09 Not Zed <NotZed@Ximian.com>
-
- * em-format.c (em_format_class_remove_handler): Change this to use
- the original structure only, not by type.
-
- * em-format-hook.c (emfh_enable): implement hook enablation.
-
-2004-09-07 Not Zed <NotZed@Ximian.com>
-
- * em-account-editor.c (emae_setup_providers): set the provider
- shown selected on the store as well.
-
- * mail-config.glade: moved the druid 'help text' directly into the
- glade file.
-
- * em-account-editor.c (emae_check_complete): add pre-load for
- management page options.
-
- * em-utils.c (em_utils_configure_account): remove use of
- mail-config-druid.
-
- * em-account-editor.c (emae_remove_childen): removed.
- (*): removed service->url, always get it from/set it to the
- e-account so it doesn't have side-effects with plugins.
-
- * mail-dialogs.glade: fix up the names of the various license
- dialog fields.
-
-2004-09-06 Not Zed <NotZed@Ximian.com>
-
- * em-account-editor.c (emae_receive_options_extra_item): store the
- config widgets in the item entry itself.
- (emae_auto_detect): wasted a whole lot of time on this crap.
-
- * em-account-prefs.c (account_able_clicked): removed some redundant logic.
-
- * mail-send-recv.c (mail_autoreceive_setup): renamed to
- mail_autoreceive_init and rewrote all the callbacks. now it
- listens to events on the accountlist directly and doesn't need
- invoking manually. It also runs relative to the account always,
- rather than copying the uri. Removed all callers except the mail
- component one.
-
- * em-account-editor.c (em_account_editor_provider_selector_new):
- removed becaus eof below.
- (em_account_editor_construct): copy the account to a working
- object if supplied, else create a new one.
-
- * mail-config.glade: make the provider selectors just use
- em_account_editor_dropdown new for the dropdown menu.
-
- * em-account-editor.c (prepare_signatures): removed, merged into
- the identity page code.
- (sig_fill_menu): removed.
- (emae_setup_signatures): new function to setup signatures on a
- gtkcombobox.
- (clear_menu): removed.
- (signature_changed): removed.
- (emae_signature_changed): new function for changed.
- (signature_removed): removed.
- (emae_signature_removed): new function for removed.
- (emae_signature_get_iter): helper for finding the right row for
- this signature.
- (signature_added): removed.
- (emae_signature_added): new function for added.
- (sig_activate): removed.
- (emae_signaturetype_changed): new function to update the account
- info immediately.
- (sig_add_new_signature): renamed to emae_signature_new.
- (select_account_signature): no longer needed, this happens in the
- setup.
-
- * mail-config.glade: changed the signature thing to a custom
- widget (gtkcombobox).
-
- * em-account-editor.c (em_account_editor_construct): updates for
- api change, table sections require table items.
- (emae_setup_service): handle host:port hostname syntax.
- (emae_hostname_changed): and here too.
- (emae_commit): fill this out, and implement it.
-
-2004-09-04 Not Zed <NotZed@Ximian.com>
-
- * *.c: include gnome i18.h if needed since camel-object.h was
- fixed.
-
- * em-format.c (em_format_class_add_handler): if a handler is
- already set for type, link it in.
-
- * em-format.h: added a link pointer to EMFormatHanlder, so that
- overrides can also fallback. remove applications member - not
- used anymore.
-
-2004-09-01 Not Zed <NotZed@Ximian.com>
-
- * em-popup.h: added some docs.
-
- * em-popup.c (emp_standard_menu_factory):
- * em-folder-tree.c (tree_drag_data_received): popup api changes.
-
-2004-08-31 Not Zed <NotZed@Ximian.com>
-
- * em-format-html-display.c (efhd_attachment_button_show): use a
- wrapper for the button event since the popup event has changed
- signature.
-
-2004-08-30 Not Zed <NotZed@Ximian.com>
-
- * em-popup.c (emp_standard_menu_factory): changed args.
- (struct _open_in_item): removed, use user data instead.
- (*): fix callbacks for new apis.
- (emp_popup_open): Removed some dead popup callbacks never invoked.
- (em_popup_target_new_attachments): new target type for attachment
- bar in composer.
-
- * em-folder-tree.c (emft_popup*): convert to new e-popup apis.
-
- * em-folder-view.c: emfv_popup_*: convert to new e-poup callback
- signatures.
- (EMFV_MAP_CALLBACK): fix for e-popup callback change.
- (EMFV_POPUP_AUTO_TYPE): same.
- (emfv_popup): dont bother setting item callback data.
- (emfv_popup_labels_free): api changes.
- (emfv_popup_items_free): new free method.
- (EMFVPopupItem): No longer needed.
- (emfv_uri_popup_free): api changes.
- (emfv_format_popup_event): new api's == simpler code.
-
- * em-account-editor.c (emae_receive_options_extra_item): add a
- hack for the label item, which is only used by connector to
- override the hostname and username labels.
-
-2004-08-24 Not Zed <NotZed@Ximian.com>
-
- * em-account-editor.c (em_account_editor_construct): create the
- window rather than the widget here.
-
- * mail-config.glade: remove the extra_page from the druid, it is
- autogenerated now. renamed the "Receiving options" notebook page
- to "Receiving Email" since it isn't hte options page.
-
- * em-account-editor.c (emae_receive_options_page): no longer
- needed, autogenerated.
- (emae_receive_options_item): setup the auto-receive time values.
- (emae_receive_page): don't setup the auto check time values here.
-
- * mail-config.glade: Remove the Receiving Mail tab, it is now
- completely auto-generated.
-
-2004-08-17 Not Zed <NotZed@Ximian.com>
-
- * em-event.[ch]: mail event dispatcher.
-
- * mail-component.c (mc_startup): hook into events.
-
- * mail-folder-cache.c (update_1folder): always set the uri field.
- (real_flush_updates): emit a folder.changed:new event if we have new
- mail.
-
-2004-08-13 Not Zed <NotZed@Ximian.com>
-
- * mail-config.glade: replaced ssl selector with custom widget
- (gtkcombobox). Giv the preferences, composer toplevel unique
- names.
-
-2004-07-29 Not Zed <NotZed@Ximian.com>
-
- * mail-config.glade: replaced source and transport selector with
- custom widget (gtkcombobox).
-
- * em-account-editor.[ch]: copy over mail-account-gui.[ch] and
- rename stuff. Make a gobject. Move most internals, internal.
-
-2004-07-28 Not Zed <NotZed@Ximian.com>
-
- * em-composer-prefs.c (em_composer_prefs_construct): get the
- toplevel tab as the root.
- (em_composer_prefs_construct): setup plugin metadata for composer
- prefs.
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): setup plugin
- metadata for mail preferences.
-
- * em-config.c (em_config_target_new_prefs): new target for 'prefs'
- mode, everything global via gconf.
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): get the gui from
- the preferences_toplevel not the preferences_tab window which we
- don't need.
-
- * mail-config.glade: rename the preferences 'toplevel' to
- preferences_toplevel so we can get it unparented. And the
- composer toplevel to composer_toplevel.
-
- * em-folder-properties.c (em_folder_properties_show): remove test
- code.
-
- * em-format.h (struct _EMFormatPURI): add a free function
- callback.
-
- * em-format.c (emf_clear_puri_node): if the free function is set,
- call it.
-
-2004-07-01 Rodney Dawes <dobey@novell.com>
-
- * Makefile.am (BUILT_SOURCES): Remove $(error_i18n)
- (CLEANFILES): Put $(error_i18n) in here
-
-2004-06-29 Not Zed <NotZed@Ximian.com>
-
- * em-folder-tree-model.c (folder_created_cb): call
- folder_subscribed directly from the async function not
- foldre_subscribed_cb, otherwise we run out of order. Part of
- #60775.
-
- * em-vfolder-rule.c (source_add): setup exclusion for vfolder
- sources, noselect folders. Bug #60794.
-
-2004-06-23 Jeffrey Stedfast <fejj@novell.com>
-
- * em-folder-selector.c (em_folder_selector_get_selected_path):
- Don't prepend the path string with a '/'.
-
- * em-folder-tree.c (em_folder_tree_create_folder): This takes a
- full_name so update the argument to make that clear.
- (emft_create_folder): Same and also don't strip a leading '/'
-
-2004-06-25 Not Zed <NotZed@Ximian.com>
-
- * em-folder-tree.c (folder_tree_new): set search column. #60152.
-
-2004-06-24 Rodney Dawes <dobey@novell.com>
-
- * em-utils.c (em_utils_add_address): Add code to set the parent,
- position, and type hint of the "Add address" dialog
-
- Fixes #60030
-
-2004-06-23 Not Zed <NotZed@Ximian.com>
-
- ** See #54030.
-
- * e-searching-tokenizer.c (e_searching_tokenizer_match_count):
- only return a count if we're using the primary search string.
-
- * em-format-html-display.c (efhd_search_response): set the primary
- search string to NULL instead of resetting it.
- (efhd_update_search): dont noop if we have a null search text,
- just set an empty search.
-
- * e-searching-tokenizer.c (e_searching_tokenizer_reset): remove
- this, revert jeff's fixes for 54030. this is incomplete and so
- doesn't work either (search text stays remembered and secondary
- search text lost too).
-
- ** See #60523.
-
- * em-folder-view.c (emfv_finalise): unhook the folder changed
- before destroying the async thing, and move it all to destroy
- event anyway.
- (emfv_destroy): as above.
-
-2004-06-22 Jeffrey Stedfast <fejj@novell.com>
-
- * em-folder-tree-model.c (sort_cb): Same as below.
- (em_folder_tree_model_remove_folders): Same.
-
- * em-folder-tree.c (emft_maybe_expand_row): As toshok discovered,
- gtk_tree_model_get() strdup's string arguments, *sigh*, so we need
- to free them.
- (tree_drag_data_delete): Same.
- (tree_drag_data_get): Same.
- (tree_drag_data_received): Same.
- (emft_drop_target): Same
- (em_folder_tree_get_selected_uris): Same.
- (get_selected_uris_path_iterate): Same.
- (emft_update_model_expanded_state): Same.
- (emft_tree_row_expanded): Same.
- (emft_tree_row_activated): Same.
- (emft_popup_delete_response): Same.
- (emft_popup_delete_folder): Same.
- (emft_popup_rename_folder): Same.
- (emft_popup_properties): Same.
- (emft_tree_button_press): Same.
- (emft_tree_selection_changed): Same.
-
-2004-06-22 Chris Toshok <toshok@ximian.com>
-
- * em-folder-tree.c (render_pixbuf): gtk_tree_model_get on a string
- field allocates the return value. free path.
-
-2004-06-22 Jeffrey Stedfast <fejj@novell.com>
-
- * em-popup.c (emp_apps_open_in): If the app requires a terminal to
- run, give it a bloody terminal (who uses vi in an xterm to view
- attached text files? *sigh*). Fixes bug #51259.
-
-2004-06-21 Chris Toshok <toshok@ximian.com>
-
- * em-folder-tree.c (render_display_name): gtk_tree_model_get on a
- string field allocates the return value. free name.
-
-2004-06-21 Radek Doulik <rodo@ximian.com>
-
- * em-junk-filter.c (em_junk_sa_test_spamd): make sure we test for
- -p and --port only and not for other options as --pidfile
-
- Fixes #60260
-
- (em_junk_sa_test_spamd): try to get spamd/spamc binaries from
- gconf
-
- Implements #59368
-
-2004-06-18 Not Zed <NotZed@Ximian.com>
-
- ** See #31027.
-
- * em-vfolder-editor.c (em_vfolder_editor_new): make sure we
- construct the rule editor with a source of 'incoming', otherwise
- newly created rules have no source in the current session.
-
- * em-vfolder-rule.c (em_vfolder_rule_init): init the vfolder
- source to 'incoming' always.
-
- * mail-vfolder.c (uri_is_ignore): fix debug statement.
-
- ** See #60214.
-
- * em-folder-view.c (em_folder_view_print): re-arrange code to make
- the dialogue async. We also now load the message every time
- before printing.
- (emfv_print_response): handle response to print.
-
- * em-format-html-print.c (em_format_html_print_message): new api
- to print a specific uid on a specific folder.
-
-2004-06-18 Not Zed <NotZed@Ximian.com>
-
- * em-vfolder-rule.c (get_widget): use mail dialogs.glade.
-
- * mail-dialogs.glade: move the vfolder-source window here from
- mail-config.glade.
-
- * Makefile.am (glade_DATA): fix the glade list.
-
- * mail-license.glade, subscribe-dialog.glade, mail-security.glade,
- * mail-search.glade: Merged into mail-dialogs.glade. Should be
- easier to manage.
-
- * message-tag-followup.c (construct): use mail dialogs glade file.
-
- * mail-account-gui.c (display_license): use mail dialogs glade file.
-
- * em-subscribe-editor.c (em_subscribe_editor_new): use new glade
- file.
-
- * em-format-html-display.c (em_format_html_display_search): use
- merged glade file.
- (efhd_xpkcs7mime_validity_clicked): same.
-
- * mail-dialogs.glade: merge various glade files into here.
-
-2004-06-17 Not Zed <NotZed@Ximian.com>
-
- ** See #59885.
-
- ** Moved all of the mail specific filtering stuff from filter/* to
- here. Renamed appropriately into em* space, etc.
-
- * em-filter-folder-element.c (emff_copy_value): implement for folders.
-
- * em-vfolder-rule.c (get_widget): read the vfolder glade from
- mail-config.glade.
-
- * mail-config.glade: moved the vfolder source selector here.
-
- * em-search-context.c: new mail search specific rule context.
-
- * mail-component.c (setup_search_context): use the new
- em_search_context.
-
- * vfolder-rule.c (validate): change error to mail context.
-
- * filter-folder.c (validate): change error to mail context.
-
- * Makefile.am (em-filter-i18n.h): added rule for i18n of mail
- filter type stuff.
- (libevolution_mail_la_SOURCES): added in the filter and vfolder
- rule stuff specific to mail.
-
- ** See #59885.
-
- * em-format-html-quote.[ch]: remove and remove from build, not
- used.
-
- * Makefile.am (libevolution_mail_la_LIBADD): add libeabutil and
- evolutionsmime.
-
- * mail-component-factory.c (factory): there is no mail_config
- anymore.
-
-2004-06-16 Rodney Dawes <dobey@novell.com>
-
- * em-folder-properties.c: Include gtk[hv]box.h so we can use them
- (emfp_dialog_got_folder): Fix the border widths and spacings for
- the internal widgets and the dialog's vbox and action area to be
- compliant with the HIG
- Fix the general layout of the dialog to be HIG-compliant as well
- Use ngettext for the row labels for number of messages
- Add a cancel button, since we are not instant-apply
- Align the message counts to the right
- Part of this patch is from Christian Neumair <chris@gnome-de.org>
-
- * mail-component.c (view_changed_cb): Fix a typo for the sent folder
- send is not a pluralization of sent
-
-2004-06-16 JP Rosevear <jpr@novell.com>
-
- * em-composer-prefs.c (spell_set_ui): clear the error, don't free
- it, so NULL is handled properly
-
-2004-06-16 Not Zed <NotZed@Ximian.com>
-
- * em-utils.c (em_utils_selection_get_urilist): handle comments in
- the urilist. Can't remember the rfc for it.
-
- ** See #56479.
-
- * em-utils.c (em_utils_in_addressbook): use the main thread to
- setup the addressbook list.
- (em_utils_in_addressbook): only check against the "completion"
- sources, not all of them.
-
-2004-06-15 Not Zed <NotZed@Ximian.com>
-
- * em-folder-browser.c (emfb_mail_stop): call mail_cancel_all to
- implement the stop button.
-
- * em-utils.c (emu_addr_sources_refresh): don't unref the group
- list, otherwise the sources become broken now (?).
- (em_utils_in_addressbook): add some locking. add cancellation.
- this is almost certainly going to cause issues.
-
- * mail-mt.c (mail_cancel_hook_add, mail_cancel_hook_remove)
- (mail_cancel_all): new functions to implement a global mailer stop
- button.
-
-2004-06-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (save_part_save): This code no longer needs to do
- charset conversion. Yay. Fixes bug #60225.
-
- * em-utils.c (em_utils_save_part_to_file): Use the proper e-error
- namespace.
-
-2004-06-15 Jeffrey Stedfast <fejj@novell.com>
-
- * em-folder-tree.c (emft_popup_copy_folder_selected): frombase is
- simply the select_path, since selected_path is now just the
- full_name rather than the path. Fixes bug #60075.
-
- * em-composer-utils.c (attribution_format): New function to format
- an attribution string (won't crash if translators were sloppy with
- their strftime/printf-style formatters). Also nice/extendable for
- future feature enhancements such as user-customisable attribution
- strings.
- (composer_set_body): Use above function rather than using
- e_strftime/etc ourselves.
-
-2004-06-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-view.c (emfv_init): Changed the second
- gtk_selection_add_target() to use GDK_SELECTION_CLIPBOARD rather
- than GDK_SELECTION_PRIMARY again. This should fix bug #60022.
-
-2004-06-14 Radek Doulik <rodo@ximian.com>
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): the check button
- label has now opposite meaning (after UI changes), call
- toggle_button_init with 'not' parameter set to TRUE
- (toggle_button_toggled_not): new helper function, sets negative
- value to gconf bool key
-
-2004-06-14 Not Zed <NotZed@Ximian.com>
-
- * mail-vfolder.c (rule_changed): don't check rule->source, its
- irrelevent to vfolder sources, and clean up the logic a bit.
- #59158.
-
- * em-folder-tree.c (emft_popup_new_folder_response): destroy the
- create dialogue if we're firing up the vfolder creation window.
-
- * em-composer-utils.c (get_reply_all): if we removed all of the
- addresses because they were 'us', add the first to
- address back. otherwise reply-to-all behaves strange.
-
-2004-06-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (em_folder_tree_set_selected): Free any old
- select_uri string we may have.
- (emft_tree_row_expanded): Remove the gross hack that was here.
- (emft_get_folder_info__got): Check for priv->select_uri and try
- selecting it (if we can't select it yet, it'll just be re-queued
- for later).
- (emft_tree_row_activated): Clear the select_uri if set, the user's
- selection overrules any auto-selection.
- (emft_tree_selection_changed): Same.
-
-2004-06-11 Not Zed <NotZed@Ximian.com>
-
- * em-folder-tree.c (emft_tree_button_press): rearrange the setting
- up of the target flags, stores can have a null path.
-
- * em-folder-selector.c (emfs_create_name_changed): use
- get_selected_uri rather than path. a valid uri may have a null
- path now.
- (emfs_create_name_activate): and here too.
- (em_folder_selector_get_selected_path): check the uri is null for
- a selected path, and then handle a null path.
-
- * em-folder-tree-model.c (em_folder_tree_model_add_store): revert
- previous change. Stupid emftm.
-
- * em-utils.c (em_uri_from_camel): handle a null path or fragment.
-
- * em-folder-tree-model.c (em_folder_tree_model_add_store): set the
- full name of the store to "". Fixes #59925 and probably other
- issues. Related to the removal of folderinfo->path.
-
-2004-06-10 Jeffrey Stedfast <fejj@novell.com>
-
- Fixes bug #58825. Ugh. Really Gross Hack (tm).
-
- * em-folder-tree.c (emft_tree_row_expanded): If the store that we
- are expanding matches the uri that we've been requested to select
- (e.g. from before the store was added to the tree), then give the
- uri to the get_folder_info_op.
- (em_folder_tree_set_selected): If the store for the uri isn't in
- the tree yet, save the uri for later.
-
- * mail-component.c (folder_selected_cb): Set the selected state of
- the folder-tree and save it.
- (impl_createControls): Restore the selected state on the
- folder-tree.
-
- * em-folder-tree-model.c (em_folder_tree_model_set_selected): New
- function to set the selected-uri saved state.
- (em_folder_tree_model_get_selected): New function to get the
- selected uri saved state.
- (em_folder_tree_model_save_state): Renamed.
-
- * em-folder-tree.c (emft_update_model_expanded_state): Don't let
- path be NULL if the node is a store node (path == NULL for any
- other case is a bug).
- (emft_maybe_expand_row): Same.
-
-2004-06-10 Not Zed <NotZed@Ximian.com>
-
- * message-list.c (message_list_set_selected): use new
- etreeselectionmodel api to select paths in one call. Fixes
- #59546.
-
- * em-folder-view.c (emfv_message_reply): check that we have
- content selected, not just a selection, before trying to reply to
- that content. #59146.
- (emfv_message_reply): strip call content-* headers (fixme), and
- set transfer-encoding to 8bit.
-
-2004-06-08 Rodney Dawes <dobey@ximian.com>
-
- * mail-config.glade: Fix for SSL options appearing for sendmail
-
-2004-06-08 Jeffrey Stedfast <fejj@novell.com>
-
- * em-folder-tree.c (em_folder_tree_set_selected): Scroll to the
- selected folder if needed. Fixes bug #59609.
-
- * em-folder-selector.c (em_folder_selector_construct): Make the
- chooser non-modal. Fixes bug #53735.
-
- * em-folder-tree.c (emft_tree_row_collapsed): Only change the
- cursor if the currently selected folder is a subfolder of the
- folder collapsed. Fixes bug #59801 without breaking bug #57665.
- (emft_tree_test_collapse_row): Renamed from
- emft_tree_collapse_row() to match the new signal we are connected
- to.
-
-2004-06-07 Jeffrey Stedfast <fejj@novell.com>
-
- * em-folder-tree-model.c (em_folder_tree_model_add_store): Set the
- store's FULL_NAME to NULL here. Fixes the crash in bug #59713.
-
-2004-06-07 Dan Winship <danw@novell.com>
-
- * em-folder-view.c (emfv_popup_menu, emfv_message_pixmaps):
- s/stock_save_as/stock_save-as/
-
- * em-popup.c (emp_standard_select_popups,
- emp_standard_object_popups): Likewise
-
-2004-06-05 Christian Neumair <chris@gnome-de.org>
-
- * em-folder-tree.c: Shuffle usage of trailing "..." in menus according
- to the HIG.
-
-2004-06-05 Christian Neumair <chris@gnome-de.org>
-
- * mail-component.c (view_changed_cb): Use ngettext for message count
- information.
-
-2004-06-04 Radek Doulik <rodo@ximian.com>
-
- * default/C/Inbox (Content-Type): added size info to IMG tags so
- that it loads the message smoother
-
-2004-06-03 William Jon McCann <mccann@jhu.edu>
-
- * mail-session.c (request_password): Don't pack entry and checkbox
- widgets directly into the dialog vbox so that they line up
- correctly with the action area buttons.
-
-2004-06-02 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (mc_add_local_store_done): put this back in,
- local folders not being noted properly all the time.
-
-2004-06-01 Jeffrey Stedfast <fejj@novell.com>
-
- * em-composer-utils.c (forward_non_attached): Don't attach
- anything ever. This is confusing way too many users who expect it
- to attach all or nothing. Since Forward-Attached is what users
- should be using to forward a message and all attachments, make
- these not attach anything (which is what other mailers do
- anyway). This wlso makes Forward-Quoted consistant with
- Reply-Quoted which is a Good Thing (tm).
-
-2004-06-01 Not Zed <NotZed@Ximian.com>
-
- * em-folder-selector.c (em_folder_selector_get_selected_uri): set
- the right path on the url.
-
- * mail-signature-editor.c (load_signature): ugh, unlike camel
- exceptions, you can't pass NULL to CORBA calls.
- (mail_signature_editor): ditto. See bug #58815.
-
-2004-05-28 Jeffrey Stedfast <fejj@novell.com>
-
- * em-folder-tree.c (d): Disable debug here too - all this code has
- been working fine.
-
- * em-folder-selector.c (d): Disable debug spew here too (not that
- this debug was ever seen since it never hit those conditions).
-
- * mail-folder-cache.c (d): Disable debug here too.
-
- * em-folder-tree-model.c: Disable debug spewage that we don't need
- anymore. The amount of debug spewage on the console is getting to
- be too much to find anything.
-
- * em-folder-tree.c (emft_expand_node): Use p+1 as the full_name
- rather than p. Fixes bug #59187.
-
-2004-05-27 Jeffrey Stedfast <fejj@novell.com>
-
- * em-folder-tree.c (emft_get_folder_info__got): Instead of
- removing the "Loading..." row for toplevel folder nodes on failure
- (which indicates a failure conenct to the server, most likely),
- collapse the store node so that if the user expands the store
- node, it will automagically try connecting again. Fixes bug #57493.
-
-2004-05-27 Rodney Dawes <dobey@novell.com>
-
- * Makefile.am (EXTRA_DIST): Add $(error_i18n)
-
-2004-05-26 Not Zed <NotZed@Ximian.com>
-
- * mail-vfolder.c (vfolder_adduri_desc): initialise desc to NULL
- before using it later on. gcc doesn't warn on this if you're not
- optimising. Sigh. Probably fix #59070, #59060, #58972 and
- friends.
-
- * importers/evolution-mbox-importer.c (create_control_fn): set the
- default selection to inbox.
-
- * importers/evolution-outlook-importer.c (folder_selected)
- (create_control_fn): copied from mbox importer. fixes a crash &
- lets you choose the target folder.
-
-2004-05-25 Jeffrey Stedfast <fejj@novell.com>
-
- * mail-errors.xml: a few fixes.
-
- * em-format-quote.c (emfq_text_plain): Only strip the signature if
- we are in some wy modifying the content (we don't want to remove
- the signature if we are editing the message as a new
- message). Fixes bug #58826.
-
-2004-05-25 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (mc_add_local_store_done): removed, now
- redundant.
-
- * em-folder-tree.c (em_folder_tree_set_selected): fix for path changes.
-
- * em-folder-tree-model.c (em_folder_tree_model_set_unread_count):
- change to use full name rather than path name.
-
- * em-folder-tree-model.h: renamed path_hash to full_hash.
-
- * em-folder-tree-model.c (folder_subscribed): dont use
- g_path_get_dirname here, it is os dependent, we want / always.
- (full_hash_free): rename from path_hash free.
-
- * em-folder-view.c (emfv_popup_menu[]): disable add sender to
- addressbook bar if it is also disabled. #58955.
-
-2004-05-24 Not Zed <NotZed@Ximian.com>
-
- * mail-account-gui.c (mail_account_gui_build_extra_conf): don't
- enable the widget based on its writability if it is a dependent
- option which is now disable.
- (setup_toggle): return whether the widget is sensitive too.
- #57171.
-
- * em-popup.c (em_popup_target_new_select): only enable add sender
- if we also have 1 selected. #56663.
-
- * em-folder-view.c (emfv_enable_menus): remove some debug.
-
- * em-format-html.c (efh_format_header): output commas between
- newsgroups, and also append_printf.
-
-2004-05-24 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * mail-account-gui.c (mail_account_gui_build_extra_conf): added
- empty handling for CAMEL_PROVIDER_CONF_HIDDEN
- (extract_values): added handling for CAMEL_PROVIDER_CONF_HIDDEN
-
-2004-05-24 Not Zed <NotZed@Ximian.com>
-
- * em-folder-tree.c (em_folder_tree_set_selected): use set_cursor
- instead of scroll_to_row. See #58383.
- (get_selected_uris_iterate): removed.
- (em_folder_tree_get_selected_uris): use an interative call based
- on gtk_tree_selection_get_selected_rows rather than
- selected_foreach, as the gtk+ docs suggest. was trying to fix a
- bug but it seems gtktreeselection bug (shift-select rows using
- keyboard only)
-
- * message-list.c (regen_list_regened): pull the message from the
- regen list before we check the list and pending uid.
-
- * em-folder-view.c (emfv_enable_menus): remove the hack for
- enabling select delete from here and put it in the right place.
- (em_folder_view_get_popup_target): put it here so its consistent.
-
-2004-05-22 Not Zed <NotZed@Ximian.com>
-
- * mail-tools.c (mail_tool_uri_to_folder): put note_store back in.
- Quick hack to fix the issue of folders being opened before we hook
- onto folder_created.
-
- * mail-folder-cache.c: remove 'name' from update struct, not used
- anymore
-
- ** Another unread count bug, #58814.
-
- * mail-vfolder.c (context_rule_added):
- * mail-tools.c (mail_tool_uri_to_folder):
- * mail-component.c (mc_add_local_store_done): don't call mail note
- folder anymore, fix up headers.
-
- * mail-folder-cache.c (store_folder_opened)
- (mail_note_store_remove, mail_note_store): handle the new
- store:folder_opened signal. Don't need the mail_note_folder hack
- anymore, mail_tool_uri_to_folder slowly does less.
-
-2004-05-21 Not Zed <NotZed@Ximian.com>
-
- * mail-mt.c (do_call): add marshaller for p_ppppp call.
-
- * mail-session.c (get_password): fix for camel api changes.
- (forget_password): same.
-
- ** See #58376.
-
- * message-list.c (mail_regen_list): do some timeout foo so we
- don't keep doing list regnerations if we're getting called too
- often. God knows what this will break.
- (message_list_set_selected): removede bug printf.
- (regen_list_free): move the message-list poking stuff into
- regen_list_regened.
- (message_list_set_folder): call mail_regen_cancel to cancel any
- regen stuff.
- (mail_regen_cancel): cancel/clear outstanding regenerations.
- (message_list_destroy): do it here too.
- (message_list_select_uid): also set the pending select uid if we
- have a timeout pending.
-
- * mail-component.c (impl_createControls): set the defualt parent
- to the main folderview as soon as its created.
-
- * em-folder-tree.c (emft_popup_copy_folder_selected): use
- get_toplevel rather than get_ancestor. seems the more reliable
- one. also we're always parented so we shoudl always find a
- toplevel window.
- (em_folder_tree_create_folder): same.
- (emft_popup_delete_response): set error parent.
- (emft_popup_delete_folder, emft_popup_rename_folder)
- (emft_popup_rename_folder, emft_popup_rename_folder):
-
- * em-migrate.c (update_passwords_1_2): finally put the 1.2
- password upgrade patch in. Untested. #42721.
-
-2004-05-20 Jeffrey Stedfast <fejj@novell.com>
-
- Fixes for bug #57305.
-
- * mail-account-gui.c (sig_add_new_signature): Updated for changes
- below.
-
- * em-composer-prefs.c (em_composer_prefs_new_signature): No longer
- takes a script argument (makes no sense to edit a script with an
- HTML editor if we require that the script already exist before we
- let the user add it anyway).
- (sig_add_cb): Updated for above change.
- (sig_add_script_response): Don't pop up an editor window for the
- newly added script, the script has already been created! Instead
- simply create a new ESignature object, set the sig->name, and add
- it to the signature list.
-
-2004-05-20 Radek Doulik <rodo@ximian.com>
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): remove "use
- daemon" handling code
-
- Fixes #56909
-
-2004-05-20 Not Zed <NotZed@Ximian.com>
-
- ** See #58388.
-
- * mail-mt.c (mail_msg_check_error): surpress any errors about
- messages not found because of invalid uid's. They're really just
- internal errors.
-
- ** See #57583.
-
- * message-list.c (build_tree): save/restore the selection when we
- update.
- (message_list_set_selected): util to set the selected messages
- from a list of uids.
- (build_flat): same. I wonder if etree's unbroken enough to use it
- more directly?
-
- ** See #58693.
-
- * mail-send-recv.c (mail_autoreceive_setup): add bounds checking
- so sloppy ui work wont break it again.
-
- * mail-config.glade: put the minimum for autocheck back to 1
- minute. Naughty jeff.
-
-2004-05-19 Chris Toshok <toshok@ximian.com>
-
- * importers/pine-importer.c (import_contacts): use the new
- e_book_new_* and e_book_open apis.
-
- * em-utils.c (em_utils_in_addressbook): use the new e_book_new_*
- and e_book_open apis.
-
-2004-05-19 Jeffrey Stedfast <fejj@novell.com>
-
- * message-tags.glade: Fixed the icon name to get the right one.
-
- * message-list.c (message_list_init_images): Changed to load an
- empty pixbuf manually rather than relying on the pixbuf returned
- for "" from e_icon_factory_get_icon() since it has changed to
- return a broken image icon.
-
-2004-05-19 JP Rosevear <jpr@novell.com>
-
- * Makefile.am: don't dist the error .h file
-
-2004-05-19 Not Zed <NotZed@Ximian.com>
-
- * mail-ops.c (send_queue_send): set seen when we set deleted. ?
- #56549.
-
- * em-inline-filter.c (emif_add_part): if we end up with an
- application/octet-stream part, pre-snoop it so we set the right
- mime type to start with. Fixes #58554.
-
- * em-format.c (emf_snoop_part): removed, now in em-utils.
-
- * em-utils.c (em_utils_snoop_type): rah rah, snoop a mime part's
- type.
-
- * em-format-html.c (efh_text_plain): Revert jeff's fix for #56290.
- Ugh, we already have all the citation info in local data. Removed
- the need for gconf too.
-
-2004-05-19 Not Zed <NotZed@Ximian.com>
-
- * em-format-html.c (efh_format_secure): make this match the efhd
- stuff.
-
- * em-format-html-display.c: removed stock_signature-nokey since it
- doesn't exist in gnome-icon-theme.
- (efhd_xpkcs7mime_button): if there is no signing, but encryption,
- use its icon. if there's no encryption too, use a broken icon
- (?).
-
-2004-05-05 William Jon McCann <mccann@jhu.edu>
-
- * GNOME_Evolution_Mail.server.in.in: Add menu_label and
- menu_accelerator.
-
-2004-05-19 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (mc_quit_sync): fixed up the empty trash on
- exit thing, to update for all stores, not update the timestamp on
- the first store synced.
-
-2004-05-18 Cantona Su <paradisetux@hotmail.com>
-
- * em-format-html.c: Added header "X-Newsreader" for handle Outlook
- Express as Mailer.
-
-2004-05-18 Not Zed <NotZed@Ximian.com>
-
- * em-folder-browser.c (em_folder_browser_show_preview): don't
- nomarkseen when we restore the message when we show the preview.
- #58387.
-
- * mail-folder-cache.c (folder_changed): no new message test if its
- the drafts folder too.
-
- * mail-vfolder.c (vfolder_adduri_desc): use a nicer, account-based
- formatter for folder names. Hmm, that was a good waste of time.
- For #55412.
-
- * em-folder-view.c (emfv_list_selection_change): Listen to the
- tree selection change event directly & proxy out, so we can update
- the status bar properly. Blah. For #58600.
-
- ** Quick fix for #57434
-
- * em-format.c (emf_format_clone): fix the FIXME about cloning
- headers shown.
-
- * em-format-html.c (efh_format_headers): only show rupert if we're
- showing rupert.
-
- * em-format-html-print.c (efhp_init): default show_rupert to off.
-
- * em-format-html.c (efh_init): default show_rupert to on.
-
- * em-format-html.h: added show_rupert bit.
-
- * mail-folder-cache.c (folder_changed): don't emit new mail if its
- any vfolder, not just vtrash folder. #56350.
-
- * em-folder-view.c (emfv_list_done_message_selected): run
- enable_menu's to make sure we're up to date. #58352.
-
- ** crappy hacks for #58385.
-
- * em-folder-selection-button.c
- (em_folder_selection_button_clicked): leave Ok button for this
- selection.
-
- * em-folder-selection.c (em_select_folder): added oklabel here too.
-
- * em-folder-selector.c (em_folder_selector_new)
- (em_folder_selector_construct, em_folder_selector_create_new):
- Added oklabel- text for ok label.
- (em_folder_selector_create_new): Set the ok label to Create.
-
- * em-message-browser.c (emmb_set_message): don't mark message seen
- if user has disabled auto-mark seen feature. #58629.
-
- * em-format.c (em_format_part): if we have no content-type header,
- then we get no mime-type set, so assume text/plain. #58470.
-
-2004-05-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-mailer-prefs.c: #include <gtk/gtkliststore.h>. Fixes bug
- #58407.
-
-2004-05-17 Not Zed <NotZed@Ximian.com>
-
- * mail-account-gui.c (mail_account_gui_setup): put the None item
- at the head of the providers list.
- (mail_account_gui_setup): only set the transport default fallback
- if it is not a STORE_AND_TRANSPORT type provider (since that was
- just disabled). #57939.
-
- * message-list.c (on_selection_changed_cmd): only NOOP if we have
- no selection and no uid, if we have a selection and no uid, then
- always update. Fixes #58267 without breaking the double-load
- thing.
-
- * em-folder-view.c (em_folder_view_open_selected): keep the hide
- deleted status. Makes #51082 work at last.
-
- ** Bug #6556.
-
- * message-list.c (ml_drop_async_desc, ml_drop_async_drop)
- (ml_drop_async_done, ml_drop_async_free, ml_drag_data_action)
- (ml_drop_popup_copy, ml_drop_popup_move, ml_drop_popup_cancel)
- (ml_tree_drag_data_received): implement async drop operations and
- the ask drop option menu.
-
-2004-05-14 Not Zed <NotZed@Ximian.com>
-
- ** Bug #6556.
-
- * message-list.c (ml_selection_received_uidlist): removed, not
- needed anymore.
- (ml_selection_received): call get_uidlist to paste the selection.
- (ml_tree_drag_data_received): same here.
-
- * em-folder-tree.c (emft_drop_uid_list): removed, not needed
- because of below change.
-
- * em-utils.c (em_utils_selection_get_uidlist): actually do the
- copy now, don't just decode the data.
-
- * em-folder-tree.c (tree_drag_data_received): just copy the
- selection data data itself, dont decode yet.
- (emft_import_message_rfc822): removed, not needed, use em utils
- stuff instead.
- (emft_drop_message_rfc822): same.
- (emft_drop_text_uri_list): same.
- (emft_drop_async_free): simply free stuff.
- (emft_drop_async_drop): call em_utils stuff where they exist to do
- the drop.
-
- * message-list.c (ml_tree_drag_data_get): send x-mailbox instead
- of message/rfc822 for the mailbox.
- (ml_tree_drag_data_received): handle drop of x-mailbox differently
- to message/rfc822.
- (ml_tree_drag_motion): implement so proper options are setup
- whilst dragging.
- (message_list_construct): seutp the drag src/dest types for
- changes typs and with ASK action.
-
- * em-utils.c (em_utils_read_messages_from_stream): dont unref the
- stream when we get it.
- (em_utils_selection_get_mailbox): add an argument to scan from or
- not, for message/rfc822 vs x-mailbox drops.
- (em_utils_read_messages_from_stream): Same.
-
- * em-folder-tree.c (tree_drag_motion): default to move properly.
-
- * message-list.c (ml_selection_received_uidlist): take a move flag.
- (ml_tree_drag_data_received): handle move action.
-
- * em-folder-tree.c (em_folder_tree_new_with_model): got sick of
- this bloody warning.
-
- * em-format.c (default_headers[]): just remove x-mailer from the
- header list, if it isn't on by default. This is the default list.
- (em_format_default_headers): loop through everything.
-
-2004-05-14 Jeffrey Stedfast <fejj@novell.com>
-
- * em-popup.h: s/RESEND/EDIT/
-
- * em-popup.c (em_popup_target_new_select): s/RESEND/EDIT/
-
- * em-folder-view.c: s/RESEND/EDIT/
- (emfv_popup_edit): Renamed from emfv_popup_resend. Part of the fix
- for bug #58358 (The main fix was just a change to the ui file).
-
- * mail-config.c (mail_config_init): Build the path to the gtkrc
- filename and store it on the config struct so we don't have to
- keep rebuilding it.
- (config_write_style): Reuse config->gtkrc string instead of
- constructing the path again.
- (mail_config_write_on_exit): Free the gtkrc path.
- (config_write_style): fflush the gtkrc file.
-
- * em-popup.c (emp_popup_resend): Updated the #if 0'd code for the
- API chanegs made to em_utils_edit_messages().
-
- * em-folder-view.c (em_folder_view_open_selected): Pass TRUE as
- the replace argument to em_utils_edit_messages() here.
- (emfv_popup_resend): Pass FALSE here. Fixes bug #58357.
-
- * em-composer-utils.c (em_utils_edit_messages): Now takes a
- 'replace' argument specifying whether or not the original message
- should be deleted when the edited message is sent or saved.
-
- * em-format-html.c (efh_format_secure): Same. Also changed the
- "Valid signature, cannot verify sender" string to "Valid signature
- but cannot verify sender" as I think it reads nicer.
-
- * em-format-html-display.c (efhd_format_secure): Since signature
- status is a tri-state, use 3 different colours too (yellow for
- valid sig but unknown sender).
-
-2004-05-13 Jeffrey Stedfast <fejj@novell.com>
-
- * em-format.c (em_format_default_headers): Don't include the last
- default_header when setting the default headers. If the user has
- configured Evolution to display the Mailer header, then it will be
- set in em-folder-view.c as appropriate when it checks the gconf
- settings. Fixes bug #58217.
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): Default
- "x-evolution-mailer" header to disabled.
-
- * em-format-quote.c (emfq_text_plain): Add a stripsig
- filter. Fixes bug #52767.
-
- * em-stripsig-filter.[c,h]: New filter class to strip
- signatures. Useful when generating forwards/replies.
-
-2004-05-13 Not Zed <NotZed@Ximian.com>
-
- * em-migrate.c (em_migrate_folder): move ignore case outside of
- block. Stupid c language.
-
- * em-folder-view.c (emfv_format_popup_event): fix warning with
- cast.
-
- ** See bug #58304.
-
- * em-junk-filter.c (em_junk_sa_setting_notify): listen to sa
- settings changes, update some globals.
- (em_junk_filter_get_plugin): setup the gconf client here and
- listen to changes.
- (em_junk_sa_get_local_only, em_junk_sa_get_use_daemon)
- (em_junk_sa_get_daemon_port): removed, use globals instead.
-
-2004-05-13 Not Zed <NotZed@Ximian.com>
-
- * em-folder-view.c (emfv_message_reply): re-enabled the reply to
- selection stuff. I worked out how to make it work; I think.
-
- * em-format-html-display.c (efhd_html_button_press_event): if we
- aren't on a clickable object, do a null popup event instead.
-
- * em-folder-view.c (emfv_format_popup_event): do the full popup if
- we aren't on anything (not on a uri or part). See #8414.
-
- * GNOME_Evolution_Mail.server.in.in: added "email" to the
- uri_schema's attribute.
-
- * mail-component.c (impl_handleURI): handle email: uri's, specify
- opening a message on a folder.
- (handleuri_got_folder): open the message. For some 1337 s3Kr3t
- ha0x.
-
-2004-05-12 Not Zed <NotZed@Ximian.com>
-
- ** See bug #58302.
-
- * em-composer-utils.c (em_utils_post_to_folder):
- * em-composer-utils.c (em_utils_compose_new_message_with_mailto):
- poke the composer headers from account directly, don't call set
- headers which overwrites stuff.
-
-2004-05-12 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (setup_search_context): enable threading option
- type on the search bar.
-
- * mail-errors.xml.h: add for translators.
-
- * Makefile.am (%.xml.h): fix for xml i18n stuff.
-
- * mail-errors.xml: moved from the .xml.in file.
-
-2004-05-11 Not Zed <NotZed@Ximian.com>
-
- * em-utils.c (em_uri_from_camel): pass an exception to
- provider_get, it relies on one.
-
- * em-migrate.c (em_migrate_1_4): fix some error messages, and fail
- with fatal errors properly.
- (em_migrate_local_folders_1_4): EEP! Who cares if this fails!
- Well I do. Setup exceptions and return codes.
- (em_migrate_dir): and here too. Sloppy!
- (em_migrate_dir): change the code slightly, 1.4 would recurse all
- folders, even if the parent folder doesn't have a
- folder-metadata.xml. Make sure we copy that mode.
- (get_local_store_uri): Make it copy the 1.4 behaviour properly.
- Any error -> use defaults.
- (em_migrate_dir): lots of changes.
- (mbox_build_filename): take the output string as an arg.
- (cp): add an argument to overwrite/append or require a unique
- empty file.
- (cp_r): add mode arg here too.
- (em_migrate_folder): split the folder copy stuff from em_migrate
- dir entirely. blah.
- (em_upgrade_accounts_1_4): can't fail, remove return code, etc.
- (em_upgrade_xml_1_4): removed this rather redundant odd api.
- (upgrade_xml_uris): this can't fail, remove return codes etc.
- (em_upgrade_xml_1_0): another oddly redundant function.
- (em_migrate_pop_uid_caches_1_4): error messages, blah blah.
- (em_migrate_folder_expand_state_1_4): no fatal states here.
- (em_migrate_folder_view_settings_1_4): nor here.
- (emm_setup_initial): do i18n 'better', using
- gnome_i18n_get_language_list, rather than hacky code.
-
-2004-05-10 Not Zed <NotZed@Ximian.com>
-
- * mail-tools.c: remove e-meta.h, not used anymore.
-
-2004-05-11 Dan Winship <danw@ximian.com>
-
- * GNOME_Evolution_Mail.server.in.in: Remove the mail folder
- control factory
-
- * mail-component-factory.c (factory): Remove support for the mail
- folder control
-
- * mail-component.c: Remove the property bag stuff
- (mail_control_new): Gone
-
-2004-05-10 David Malcolm <dmalcolm@redhat.com>
-
- * em-subscribe-editor.c (sub_queue_fill_level): Fixed warning
-
-2004-05-10 Jeffrey Stedfast <fejj@novell.com>
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): Default the
- Mailer header to enabled. Fixes bug #58217.
-
-2004-05-10 JP Rosevear <jpr@ximian.com>
-
- * mail-ops.c (mail_send_message): set header to just Evolution
- (mail_append_mail): ditto
-
- * em-message-browser.c (em_message_browser_window_new): set title
- to just Evolution
-
-2004-05-10 Not Zed <NotZed@Ximian.com>
-
- * em-folder-view.c (emfv_activate): cleanup the view menus if they
- were created.
-
- * em-folder-view.h: added list_active bit, means the view is
- showing the list and needs e.g. view menus.
-
- * em-folder-view.c (emfv_setup_view_instance): was
- create_view_instance. Now also setup the menu's if we're showing the list.
-
- * em-folder-browser.c (emfb_create_view_menus): removed. moved
- functionality into emfolderview.
-
-2004-05-07 Jeffrey Stedfast <fejj@ximian.com>
-
- Fix for bug #57152.
-
- * em-folder-tree.c (emft_get_folder_info__got): If we queried for
- a recursive folder-info listing, then pass fully_loaded as TRUE to
- set_folder_info().
- (emft_get_folder_info__got): If we find that a folder doesn't have
- children, set the expanded state to FALSE.
-
- * em-folder-tree-model.c (em_folder_tree_model_set_folder_info):
- Now takes a "fully_loaded" argument to hint to set_folder_info
- whether or not folder-info's without child nodes can possibly have
- children (eg. if fully_loaded is set and fi->child is NULL, then
- 'load' will be FALSE no matter what fi->flags contains).
-
-2004-05-07 Radek Doulik <rodo@ximian.com>
-
- * mail-config.c (config_write_style): set cite_color property of
- gtkhtml widgets
- (mail_config_init): add /apps/evolution/mail/display dir to gconf
- client and watch for mark_citations and citation_colour changes
-
- See bug #57587
-
-2004-05-07 Not Zed <NotZed@Ximian.com>
-
- * mail-account-editor.c: include missing header.
-
- ** See bug #57935.
-
- * em-folder-view.c (emfv_set_message): add new arg, nomarkseen,
- don't mark the selected message seen once its loaded.
- (emfv_list_message_selected): clear the nomarkseen flag once we've
- processed the selection.
- (emfv_list_done_message_selected): handle the nomarkseen flag,
- don't mark a message seen if it was explictly selected.
-
- * em-folder-browser.c (emfb_list_built): use
- em_folder_view_select_message rather than doing it via the
- messagelist directly.
-
- ** Dunno why i bothered, but see bug #58090.
-
- * importers/netscape-importer.c
- (netscape_filter_parse_conditions): check for custom headers
- properly.
- (netscape_filter_flatfile_get_entry): put in some validate checks.
- (netscape_filter_to_evol_filter): implement custom headers properly.
- (ns_filter_condition_types): add missing "status" string.
-
- ** See #58017.
-
- * message-list.c (mail_regen_list): use thread_queued, so we don't
- regen out of order.
-
- * em-folder-view.c (emfv_list_message_selected): use the queue
- thread so we don't get messages out of order.
-
- * mail-ops.c (mail_transfer_messages): use thread_queued_slow.
- (mail_prep_offline): and here too.
-
-2004-05-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-component.c (folder_selected_cb): Check that the folder is
- selectable using the new flags argument.
-
- * em-folder-selector.c (folder_selected_cb): Updated for below
- changes.
-
- * em-folder-tree.c (emft_tree_selection_changed): Updated to pass
- a flags argument to the folder_selected signal.
- (emft_tree_row_activated): Same.
-
-2004-05-06 Radek Doulik <rodo@ximian.com>
-
- * em-composer-prefs.c (sig_selection_changed): reset the preview
- if no signature is selected
-
- Fixes #57167
-
-2004-05-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (emft_tree_row_collapsed): Select the row that
- was just collapsed. Fixes bug #57665.
-
- * mail-autofilter.c (rule_match_thread): Removed.
- (rule_from_message): Removed the AUTO_THREAD bit.
-
- * em-folder-view.c: Removed vFolder/Filter on Thread. These were
- both broken.
- (struct _filter_data): Removed a bunch of data members since most
- of them weren't used.
-
-2004-05-05 Not Zed <NotZed@Ximian.com>
-
- ** See bug #57720.
-
- * em-folder-browser.c (emfb_create_view_menus): removed some stuff
- done in create_view_instance in the superclass.
-
- * em-folder-view.c (emfv_create_view_instance): moved here from
- em-folder-browser, setup the view instance for the folder.
- (emfv_set_folder): if the folder is set, create the view instance.
-
- * em-folder-browser.c: moved the galview instance and menu
- pointers to EMFolderView, since they're basically meta-data on the
- messagelist @ to fix issues.
-
- * em-folder-view.c (em_folder_view_open_selected): copy over the
- threaded list value when the message browser is brought up.
-
- ** some clean up
-
- * evolution-mail.schemas.in.in: removed xmailer_mask stuff.
-
- * em-migrate.c (mail_display_map[]): Removed xmailer_mask stuff.
-
- * em-folder-view.c (emfv_setting_notify): removed xmailer_mask stuff.
-
- * em-format-html.c (em_format_html_set_xmailer_mask): removed.
- This isn't used anymore.
-
- ** Fixes the double-draw on separate mail view.
-
- * message-list.c (on_cursor_activated_cmd): noop if the cursor and
- uid match for all cases (clearing uid).
- (on_selection_changed_cmd): noop if the cursor and new selection
- hasn't changed & fix a memleak.
-
-2004-05-04 Jeffrey Stedfast <fejj@ximian.com>
-
- Fix for bug #55303, but ideally there would be a nicer way of
- doing this - likely with some added ETree API but that's not
- likely to happen anytime soon.
-
- * em-folder-browser.c (scroll_idle_cb): Recall the saved scrollbar
- position state and set it, then reconnect to the
- message_list_scrolled signal.
- (emfb_list_built): Calculate a default scrollbar position for
- scroll_idle_cb to use if there's no saved state.
- (emfb_set_folder): Disconnect from the message_list_scrolled
- signal and the idle_scroll_id.
- (emfb_list_scrolled): Save the scrollbar position state.
- (emfb_destroy): Disconnect from list_scrolled_id and
- idle_scroll_id.
-
- Fix for bug #58004.
-
- * mail-account-gui.c (display_license): Fixed to compile.
- (select_account_signature): Activate the signature menu item.
- (signature_added): Connect to the activate signal for each item.
- (sig_changed): Removed.
- (prepare_signatures): Don't bother connecting to the
- "selection-done" signal, it doesn't seem to work the way we
- expected it to work.
-
-2004-05-04 Sarfraaz Ahmed <asarfraaz@novell.com>
-
- * mail-account-gui.c (display_license): This now takes CamelProvider
- as argument. Made the display message more generic. Removed the signal
- connects for buttons and replaced those with proper gtk_reponses.
- (mail_account_gui_check_for_license): Modified the gconf key for
- licenses to be a string list.
- * evolution-mail.schemas.in.in: Added the gconf schema entry for a
- string list to handle the component names whose licenses are accepted.
- * mail-license.glade: Modified the display string and added the
- appropriate gtk_response types for the buttons.
-
-2004-05-03 Jeffrey Stedfast <fejj@ximian.com>
-
- Fix for bug #57968
-
- * message-list.c (message_list_set_folder): Save the tree/hide
- state of the current folder before clearing the message-list.
- (message_list_set_folder): Note that a new folder has just been
- set (now needed by the regen code to tell whether or not it should
- save the tree state before clearing the tree).
- (message_list_destroy): Save the tree/hide state before destroying
- the message-info's, not after.
- (regen_list_regened): If the regen is being performed in response
- to a message_list_set_folder, don't save the tree state before
- clearing the tree or we'll clobber the real state with bogus data.
-
-2004-05-03 William Jon McCann <mccann@jhu.edu>
-
- * mail-account-gui.c: Add gtkdialog header to fix build.
-
-2004-05-03 Not Zed <NotZed@Ximian.com>
-
- * em-composer-utils.c (create_new_composer): take fromuri and
- subject to set the basic headers/account.
- (em_utils_compose_new_message)
- (em_utils_compose_new_message_with_mailto, forward_attached)
- (em_utils_forward_attached, forward_non_attached)
- (em_utils_forward_inline, em_utils_forward_quoted)
- (em_utils_forward_message, em_utils_forward_messages): Take the
- from folder uri to set the from account if it can. Fixed all
- callers. For #57964.
-
- * mail-send-recv.c (receive_update_done): removed.
-
- * em-mailer-prefs.h:
- * message-tag-followup.h:
- * mail-config-druid.h:
- * mail-tools.h: clean up & use forward decls. Fix users with
- busted includes.
-
- * em-composer-utils.c (em_utils_compose_new_message)
- (em_utils_compose_new_message_with_mailto)
- (em_utils_post_to_folder, em_utils_post_to_url)
- (em_utils_edit_message, em_utils_edit_messages)
- (em_utils_forward_attached, em_utils_forward_inline)
- (em_utils_forward_quoted, em_utils_forward_message)
- (em_utils_forward_messages, em_utils_redirect_message)
- (em_utils_redirect_message_by_uid) :
- (em_utils_reply_to_message, em_utils_reply_to_message_by_uid)
- (em_utils_post_reply_to_message_by_uid): Moved these here from
- em-utils.c.
-
-2004-04-30 Priit Laes <amd@tt.ee>
-
- * mail-config.glade: fix typo. #53466.
-
- * evolution-mail.schemas.in.in: use American English instead of
- British. #53466.
-
-2004-04-30 Jeffrey Stedfast <fejj@ximian.com>
-
- Fix for bug #56645
-
- * em-folder-tree.c (tree_drag_motion): If the row the cursor is
- hovering over has children and is not expanded already, setup a
- timer to auto-expand it if the user hovers there long enough.
- (tree_autoexpand): Callback to expand the row.
- (tree_drag_leave): Disconnect the timer.
- (tree_drag_drop): Same.
- (em_folder_tree_destroy): Same.
-
-2004-04-30 Enver ALTIN <enver.altin@frontsite.com.tr>
-
- * evolution-mail.schemas.in.in: Fixed a type-o.
-
-2004-04-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (message_list_set_folder): Properly initialise
- the strikeout column for both types of folders (trash and not
- trash). Completes the fix for bug #57304.
-
-2004-04-30 Not Zed <NotZed@Ximian.com>
-
- * em-utils.c (emu_can_save): fix the overwrite? question. #57822.
-
-2004-04-29 Not Zed <NotZed@Ximian.com>
-
- * mail-errors.xml.in: change all the session-message-* things to
- just be secondary, otherwise they look awful all big fonted.
-
- * mail-session.c (error_type[]): forgot to prefix error type with
- "mail:"
-
- * em-account-prefs.c (account_delete_clicked): duh, use the right
- error id.
-
- * mail-send-recv.c (receive_update_got_store): call
- mail_note_store rather than get_folder_info so that unread counts
- are propagated to the ui too.
-
- * mail-errors.xml.in: fix the password dialogue text.
-
-2004-04-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree-model.c (sort_cb): Sort the VFolders. Fixes bug
- #56636.
-
- * em-mailer-prefs.c (citation_color_set): We only want 8bits per
- color. Fixes bug #57588.
-
- * em-folder-tree-model.c (em_folder_tree_model_remove_store):
- Duh. If the lookup of si fails, don't use si->display_name in the
- warning message. Actually, don't bother with a warning message at
- all, this is a perfectly valid situation. Fixes bug #57746.
-
- * mail-ops.c (mail_send_message): Don't set the Date header here
- anymore. It has either already been set (when written to the
- Outbox) or will automagially be set to the current time if a Date
- hasn't already been set when the transport sends it. Fixes bug
- #57599.
-
- * em-composer-prefs.c (sig_add_script_response): Use
- g_shell_parse_argv() to get the actual script path and then check
- that we can exec argv[0] rather than treating the entire
- command-line as the signature script. Fixes bug #57305.
-
-2004-04-28 Not Zed <NotZed@Ximian.com>
-
- * message-list.c (ml_selection_clear_event): return the right
- type, related to #53839.
-
- ** Changed error messages to use EError.
-
-2004-04-27 Not Zed <NotZed@Ximian.com>
-
- ** See bug #57659.
-
- * mail-ops.c (fix_unmatched_info): removed, done in camel now.
-
- ** See bug #57511.
-
- * mail-config.glade: gave the whole smime frame (vbox) a name so
- we can use it from code.
-
- * mail-account-gui.c (mail_account_gui_new): get the smime_vbox
- widget if we have no NSS, the name changed and the HIG patches
- didn't fix it.
-
-2004-04-26 Radek Doulik <rodo@ximian.com>
-
- * em-format-html.c (efh_format_timeout): set gtk_html_begin's
- flags to avoid scroll to top of the message and
- reloading+flickering of images
-
- * em-html-stream.c: added GtkHTMLBeginFlags flags field
- (em_html_stream_set_flags): new helper function to set new flags
- field
- (emhs_sync_write): use gtk_html_begin_full with new flags field
- (em_html_stream_new): zero flags field
-
- Fixes #51654
-
-2004-04-23 Sarfraaz Ahmed <asarfraaz@novell.com>
-
- * mail/mail-license.glade: Glade file for displaying the license.
-
-2004-04-23 Not Zed <NotZed@Ximian.com>
-
- * em-format-html.c (em_format_html_load_http): fix the check to
- see if we've already loaded the images. #57450.
-
-2004-04-23 Sarfraaz Ahmed <asarfraaz@novell.com>
-
- * mail-account-gui.c (mail_account_gui_source_complete): Added a
- check for HAS_LICENSE flag.
- (mail_account_gui_check_for_license)(display_license)
- (populate_text_entry)(check_button_state)(set_license_accepted)
- (set_license_rejected): Implemented
-
-2004-04-22 Not Zed <NotZed@Ximian.com>
-
- * em-migrate.c (em_migrate_imap_cmeta_1_4): do the imap cmeta
- files, it just does the sync offline stuff. #56674.
- (em_migrate_1_4): non-fatalise some of the options, call above.
-
- * mail-component.c (view_changed_cb): display selected count
- instead of unread if we have >1 selected. Also don't do special
- case drafts/sent/outbox stuff if folders are inbox or re-used.
- (view_control_activate_cb): force check of autosaved messages as
- soon as the mailer starts up (well, after a delay, this seems
- wrong). #57093.
-
-2004-04-21 Not Zed <NotZed@Ximian.com>
-
- * em-inline-filter.c (emif_scan): use a better test for non-full
- lines.
-
- * em-folder-browser.c (emfb_activate): dont desensitise
- HideDeleted just 'cause we have no folder, it needs to depend on
- Trash folder only.
- (emfb_set_folder): set the hidedeleted sensitivity based on
- whether we have a trash folder or not. Fixed #57226.
-
- * em-folder-view.c (emfv_class_init): use the right signal
- callback for the changed signal. Fixes #57246.
-
- * mail-component.c (impl_createControls): fix for
- e_user_creatable_items api changes.
- (create_item): split out the code to create the item.
- (create_local_item_cb): new callback for local item creation.
- (impl_requestCreateItem): call create_item to do the work.
-
-2004-04-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-browser.c: Use E_ICON_SIZE_* enums for the menu icon
- sizes.
-
- * em-folder-view.c: Use E_ICON_SIZE_* enums for the menu/toolbar
- icon sizes.
-
- * message-tag-followup.c (construct): Same.
-
- * message-list.c (message_list_init_images): Same.
-
- * mail-send-recv.c (build_dialog): Same.
-
- * mail-mt.c (do_op_status): Same.
-
- * mail-config-druid.c (evolution_mail_config_wizard_new): Same.
-
- * em-popup.c (em_popup_create_menu): Same.
-
- * em-format-html-display.c (efhd_format_prefix): Same.
-
- * em-format-html.c (efh_format_secure): Same as below.
-
- * em-folder-tree.c (render_pixbuf): Don't use absolute icon sizes,
- use the e-icon-factory enums.
-
-2004-04-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-composer-prefs.h: Removed variables that got re-added with
- the icon-theme patch somehow.
-
- * em-account-prefs.c: Don't bother keeping global references to
- the enable_pixbuf anymore, since it's unnecessary.
-
-2004-04-19 Michael Terry <mike@mterry.name>
-
- * GNOME_Evolution_Mail.server.in.in:
- * em-account-prefs.[ch]:
- * em-composer-prefs.[ch]:
- * em-folder-browser.c:
- * em-folder-tree.c:
- * em-folder-view.c:
- * em-format-html-display.c:
- * em-format-html.[ch]:
- * em-popup.c:
- * mail-component.c
- * mail-config-druid.c:
- * mail-config.glade:
- * mail-mt.c:
- * mail-send-recv.c:
- * message-list.c:
- * message-tag-followup.c:
- * message-tags.glade: Update the mailer to use icon themes through the
- EIconFactory object in e-util
-
-2004-04-16 David Malcolm <dmalcolm@redhat.com>
-
- * importers/netscape-importer.c (netscape_import_accounts):
- Removed unused and uninitialised "url" local that gets g_free-ed
-
-2004-04-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (config_write_style): Change the message display
- widget names to match the ones we are using in 1.5 (rather than
- the ones from earlier versions). Fixes bug #57070.
-
-2004-04-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c: Added a new "message_list_scrolled" signal so
- our users can listen to this event in order to update saved state.
- (message_list_get_scrollbar_position): Simplified.
- (message_list_set_scrollbar_position): Simplified.
-
- * em-format.c: Don't complain about message errors ("Internal
- Error: ..."), instead silently fall back to display the message as
- source. Fixes bug #56876.
-
-2004-04-14 Not Zed <NotZed@Ximian.com>
-
- * em-folder-view.c (emfv_set_folder_uri): ugh, use the queued
- thread to get the folder, otherwise we can get folders set on the
- display out of order.
-
- * message-list.c (message_list_set_search): if we set this while
- frozen, save the search elsewhere.
- (message_list_thaw): if we had a frozen-time search, use it when
- we regenerate.
-
- * em-folder-browser.c (emfb_set_folder): freeze/thaw the
- messagelist around changes so we don't have multiple updates fire
- off changing folders.
- (emfb_activate): remove an unused variable i never used.
-
- * message-list.c (message_list_freeze, message_list_thaw): lock
- some updates to the ui, so you can do things like set folder and
- search atomically.
- (message_list_set_threaded, message_list_set_hidedeleted)
- (message_list_set_search, message_list_hide_uids)
- (message_list_hide_clear, message_list_set_folder): dont refresh
- the list if we're frozen.
-
- * mail-component.c (impl_createControls): remove debug comment.
-
- ** See #56641.
-
- * em-format-html-display.c (efhd_format_secure): fix a small
- memleak.
- (efhd_bonobo_unknown, efhd_format_attachment): close the <object>
- tag properly, and <br> it as well to make sure its separated.
-
- * em-sync-stream.c: add some runtime and compile time stream
- logging stuff.
-
- ** See bug #56149.
-
- * em-folder-view.c (emfv_edit_cut): similar to below, use focus to
- determine who we select from.
- (emfv_edit_copy): ditto.
-
- * message-list.c: Remove primary selection stuff. It just annoys.
-
- * em-folder-browser.c (emfb_edit_copy): use focus rather than
- selection owner to determine who to copy from.
- (emfb_edit_cut): similarly.
-
- * em-format.c (emf_multipart_related): hmm, use the right pointer
- when iterating the pending uri list.
-
-2004-04-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-component.c (impl_createControls): We don't actually want
- to disallow clicking on \NoSelect folders. Fixes a bug campd has
- been complaining to me about :-)
-
- * mail-config.c (mail_config_signature_run_script): If we get an
- empty charset string from gconf, don't try to use the result to
- create a charset filter. Real fix for bug #51924.
-
- * mail-config.glade: Removed crackrock usage of GtkFixed as
- fillter. Also HIGified some other stuff.
-
-2004-04-13 Not Zed <NotZed@Ximian.com>
-
- * em-folder-view.c (emfv_set_folder): track the messagelist
- hidedeleted value since it looks it up when we set the folder.
-
- * em-folder-browser.c (emfb_hide_deleted): use new method below to
- propagate change.
- (emfb_activate): same.
-
- * em-folder-view.c (em_folder_view_set_hide_deleted): accessor to
- set the hide_deleted state, emits a view_changed event.
-
- * mail-component.c (view_changed_cb): use VISIBLE rather than
- TOTAL for the displayed total count. Also deleted if we're not in
- hide deleted mode. And do spethal things with spethal folders,
- etc.
-
- * mail-ops.c (mail_refresh_folder): run this in the
- thread_queued_slow, so it runs in sequence and after folder_sync.
-
- * em-folder-view.c (emfv_set_folder): fire off a refresh_folder
- once the folder is loaded. Addresses #56871.
-
- * em-format-html.c (efh_format_headers): use %% for %%.
- (efh_format_done): reset load_http_now once we've done, should
- fix #56338 finally.
-
- * em-folder-view.c (emfv_init, emfv_finalise, emfv_activate):
- revert dans' creatable items handler patch, moved to
- mail-component instead (which deals with the actual menu's).
-
- * mail-component.c (impl_createControls): setup a user creatable
- items handler on the view widget.
- (view_control_activate_cb): activate the user creatable items
- handler on the view widget.
-
- * em-folder-view.c (emfv_init): add a comment about jeff's last
- fix.
-
- * em-utils.c (forward_non_attached): Set attachments from
- forwardee before we set the body, otherwise images wont resolve
- properly. Related to #56566.
-
-2004-04-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-view.c (emfv_init): Need to set the session on the
- preview object. Fixes bug #56862.
-
- * em-folder-tree.c (em_folder_tree_set_selected): Scroll to the
- auto-selected folder. Fixes bug #56707.
-
- * message-list.c (message_list_get_scrollbar_position): New
- function.
- (message_list_set_scrollbar_position): New function.
-
- * em-utils.c (em_uri_to_camel): If the provider is unavailable,
- return euri like the other fail cases. Fixes bug #56846.
-
-2004-04-10 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
-
- * evolution-mail.schemas.in.in.h: Correct typo s/hight/height/ at
- "Subscribe dialog default hight"
-
-2004-04-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_init): Don't bother adding the
- autogen sig here, e-signature-list.c handles this now.
-
- * em-migrate.c (em_upgrade_accounts_1_4): Migrate the signature
- uids. Fixes bug #56726.
-
-2004-04-09 Chris Toshok <toshok@ximian.com>
-
- * importers/pine-importer.c (import_contact): use
- e_destination_export_to_vcard_attribute instead of exporting to
- xml, and use e_contact_set_attributes.
-
- * em-utils.c (em_utils_camel_address_to_destination):
- EABDestination -> EDestination.
- (reply_get_composer): same
- (post_reply_to_message): same.
-
- * em-composer-utils.c (ask_confirm_for_unwanted_html_mail):
- EABDestination -> EDestination.
- (composer_get_message): same.
-
-2004-04-09 Radek Doulik <rodo@ximian.com>
-
- * em-format-html.c (efh_format_headers): add width=16 height=16 to
- rupert's image so that it doesn't flicker/move
-
-2004-04-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-selection.c (em_select_folder): Set the excluded bits
- on the folder-tree. Don't allow the user to xfer messages into
- folders which are: NoSelect, Virtual, nor vTrash. Fixes bug
- #56229.
-
-2004-04-09 Dan Winship <danw@ximian.com>
-
- * em-folder-view.c (emfv_init): Create an
- EUserCreatableItemsHandler for the view.
- (emfv_finalise): Unref it.
- (emfv_activate): Activate it
-
- * mail-component.c (impl__get_userCreatableItems): add
- object/folder flags to the items
-
-2004-04-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-migrate.c (cp_r): Now takes a pattern argument to limit files
- that get copied over (so we can limit imap cache to only the
- summary files - makes it faster).
-
- * mail-account-gui.c (mail_account_gui_build_extra_conf): Fixed up
- a bit to look nicer and make it closer to HIG compliant.
-
- * em-folder-tree.c (emft_drop_folder): We need to recursively copy
- the dragged folder tree over to the drop location, not just the
- parent folder. We also need to subscribe to the newly created
- folder in some cases.
-
-2004-04-08 Not Zed <NotZed@Ximian.com>
-
- * em-format-html.c (efh_format_headers): add the monkey button if
- we're from evolution. See #52977.
- (emfh_gethttp): cast away a warning.
-
- * mail-folder-cache.c:
- (update_1folder): VJUNK_FOLDER's dont exist, they're VTRASH
- folders now.
-
- * em-folder-view.c: remove message_changed stuff from camel folder
- stuff.
-
- * mail-component.c (mail_component_init): don't setup the search
- context here, wait till its requested. Fixes #56672.
-
-2004-04-07 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (view_changed_cb): hook to update the info
- label when the folderview changes.
-
- * em-folder-view.c (emfv_class_init): added 2 signals 'loaded' and
- 'changed'. For when a folder is set/cleared or when some state
- changes.
- (emfv_set_folder): emit LOADED signal when we set the folder.
- (emfv_list_message_selected): emit changed event.
- (emfv_gui_folder_changed): emit changed event.
-
-2004-04-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (emft_tree_button_press): Check that
- emft_selection_get_selected() returns TRUE before we try to use
- the iter. Fixes bug #56652.
- (emft_popup_delete_response): Same idea here.
- (emft_popup_delete_folder): Same.
- (emft_popup_rename_folder): Same.
- (emft_popup_properties): Same.
-
- Fix for bug #56538
-
- * em-folder-view.c (emfv_set_folder_uri): Don't set the preview
- empty here.
- (emfv_set_folder): If the folder is the same as the folder already
- on the emfv, just return. Otherwise clear the preview and continue
- setting the folder as normal.
-
-2004-04-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-account-prefs.c (em_account_prefs_apply): Removed.
-
- * em-mailer-prefs.c (em_mailer_prefs_apply): Removed.
-
- * em-composer-prefs.c (em_composer_prefs_apply): Removed.
-
- * mail-config-factory.c (mail_config_control_factory_cb): No
- longer need the Apply stuff.
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): Don't call a
- function that doesn't exist anymore.
-
-2004-04-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): Changed to save
- the settings in the signal callbacks.
- (em_mailer_prefs_apply): Don't save the settings here.
-
- * em-composer-prefs.c (em_composer_prefs_apply): Don't save the
- settings here.
- (em_composer_prefs_construct): Changed to save the settings in the
- signal callbacks.
-
-2004-04-06 Not Zed <NotZed@Ximian.com>
-
- * em-folder-tree.c (emft_tree_row_expanded): ref the emfoldertree
- in our thread message.
- (em_folder_tree_set_selected): same.
- (emft_get_folder_info__free): unref it.
-
- * mail-folder-cache.c (ping_store): use thread_queued_slow not
- thread_queued - we dont care when it runs.
-
- * em-folder-view.c (emfv_set_folder_uri): use thread_new for
- getting the folder, we do elsewhere, and it aids interactivity.
-
-2004-04-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-migrate.c (em_migrate_dir): Migrate the thread_list
- setting. Fixes bug #56297.
-
-2004-04-05 Not Zed <NotZed@Ximian.com>
-
- * em-format-html-display.c (efhd_xpkcs7mime_button): if we have no
- sign status, use signed-nokey, rather than no icon.
- (efhd_xpkcs7mime_viewcert_clicked): show the certificate viewer
- since certificate_viewer_show doesn't show it.
- (efhd_xpkcs7mime_viewcert_foad): foad foad foad. The api changed
- and we need to foad it ourselves.
-
- ** See bug #52822.
-
- * em-format-html-display.c (efhd_xpkcs7mime_add_cert_table): if we
- can't find the cert, then desensitise the cert button.
-
- ** See bug # 56402.
-
- * mail-folder-cache.c (update_folders): if we're cancelled, noop.
- (mail_note_store_remove): mark the update data cancelled.
-
- * mail-ops.c (add_special_info): removed, this is done in camel
- now.
- (fix_unmatched_info): renamed from add_unmatched_info.
- (get_folderinfo_got): Removed the meaningless comment here.
-
-2004-04-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-migrate.c (cp_r): Revert my "fix" from yesterday. We can't
- necessarily show progress (progress window may have been destroyed
- already).
-
- Fixes bug #53851
-
- * em-folder-view.c (emfv_popup_move_cb): Save the uri as the
- default for copy/move.
- (emfv_popup_move): Use the default copy/move uri.
- (emfv_popup_copy): Same.
-
- * em-folder-selection.c (em_select_folder): Select the uri *after*
- the dialog gets shown.
-
-2004-04-02 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes bug #37416
-
- * mail-folder-cache.c (update_1folder): Same as below. Also add
- vJunk fodlers to the list of folders that we display the total
- count for (as discussed on the mailing lists).
-
- * em-folder-tree-model.c (em_folder_tree_model_set_folder_info):
- Use 'total - deleted' as the count for Outbox rather than just the
- total count.
-
-2004-04-02 Not Zed <NotZed@Ximian.com>
-
- * em-inline-filter.c: do a per-line validation of the uuencoded
- stuff, based on the length byte.
-
- ** See bug #56338.
-
- * em-format-html.c (emfh_gethttp): fix the fugly "load http if"
- that doesn't work to be a fugly "load http if" that does work.
- (efh_format_timeout): dont set load_http_now here, its only an
- override now.
-
-2004-04-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-migrate.c (cp_r): Report progress. "Fixes" bug #56355.
-
- * mail-account-gui.c (signature_changed): Set the updated
- sig->name on the menu item.
-
- * importers/netscape-importer.c (netscape_import_accounts):
- Updated for signature API changes.
-
- * mail-account-gui.c: Same.
-
- * mail-signature-editor.c: Same.
-
- * em-composer-prefs.c: Same.
-
- * mail-config.c: Rewrote the signature stuff to use ESignatureList
- instead. Much cleaner and less broken.
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): Always make the
- Add/Remove Header buttons de-sensitised at the start. Fixes bug
- #56284.
-
-2004-04-01 Eric Zhao <eric.zhao@sun.com>
-
- * mail-account-gui.c (transport_type_changed): Commented grabbing
- focus on hostname edit, fix the focus issue of Account Assistant.
-
-2004-03-31 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-format-html.c (efh_text_plain): Only do citation colouring if
- the user has specified to do so and use the user's specified
- colour when appropriate. Fixes bug #56290.
-
- * em-subscribe-editor.c (em_subscribe_editor_new): Save/restore
- the subscribe dialog's window size. Fixes bug #56230.
-
-2004-03-31 Not Zed <NotZed@Ximian.com>
-
- * mail.h: REMOVED! And there was much rejoicing.
-
- * *.[ch]: Cleaned up header inclusions and added plenty of forward
- declarations. Sped up complete re-compilation by upto 20%.
-
- ** See bug #55950.
-
- * em-utils.c (em_utils_in_addressbook): utility for checking if an
- email address is in the addressbook. I can't tell if it works
- 'cause it crashes eds.
-
- * em-format-html.c (emfh_gethttp): handle addressbook checking.
-
-2004-03-30 Not Zed <NotZed@Ximian.com>
-
- * mail-config.h: clean up the headers and use some forward decl's
- instead.
-
- * em-format-html.c (em_format_html_set_load_http): change state to
- an int 'style' instead.
-
- * em-folder-view.c (emfv_setting_notify): set the format load http
- option to the config value directly.
-
- ** See bug #56147.
-
- * message-list.c (clear_info): set the node data to NULL when we
- unref its data.
- (ml_get_save_id): use a different test for the root node, and
- return NULL if we don't have any data on the node (because we're
- cleaing it).
-
- ** See bug #54962.
-
- * em-folder-tree.c (emft_popup_new_folder_response): put back the
- old hack to open the vfolder editor if you try to create a folder
- under vfolders.
-
- ** See bug #55940.
-
- * mail-autofilter.c (mail_filter_rename_uri): map the uri to an
- email uri before passing to filter code.
- (mail_filter_delete_uri): same here.
-
-2004-03-30 Radek Doulik <rodo@ximian.com>
-
- * mail-config.glade: add spellLiveToggled signal
-
- * em-composer-prefs.c (em_composer_prefs_construct): fix typo,
- call toggle_button_init on prefs->spell_check instead of againg on
- prefs->auto_smileys
- (spell_setup): connect spellLiveToggled signal
-
- Fixes #55964
-
-2004-03-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (emft_create_folder__free): Free the
- folder-info.
-
- * em-folder-browser.c (emfb_activate): Instead of comparing
- sstate[0] to '1', compare it against '0' like all the other code
- does.
-
-2004-03-25 Sivaiah Nallagatla <snallagatla@novell.com>
-
- * Makefile.am : remove local-config.glade from glade_DATA as it
- is removed from CVS
-
-2004-03-25 Rodney Dawes <dobey@ximian.com>
-
- * em-composer-prefs.c (sig_edit_cb):
- (sig_add_script_cb): Use gtk_window_present instead of doing a show
- then raise, as this also puts the window on the current workspace
- (em_composer_prefs_construct): Fix the border widths for the dialog
- vbox and action area to be HIG-compliant, and realize the window
- Remove the dialog separator
- Use a box_pack_start, rather than box_pack_start_defaults which causes
- some weird behaviour when changing the border widths
- * em-subscribe-editor.c (em_subscribe_editor_new): Realize the dialog
- and set the border widths for its vbox and action area to be compliant
- with the HIG
- * local-config.glade: Removed this file as it is no longer used
- * mail-account-editor.c (construct): Realize the dialog, remove its
- separator, and set the border widths for its vbox and action area to
- be HIG-compliant
- * mail-account-editor.c (source_type_changed):
- (transport_type_changed): Fix the showing and hiding of the widgets
- related to the SSL options
- (mail_account_gui_new): Get the transport/source frames for the SSL
- options, and hide them by default
- Show the default folder buttons by default here
- (mail_account_gui_setup): Only call _show not _show_all here, so we
- don't mess up the shown/hidden state of things
- * mail-account-gui.h: Add ssl_frame widget to the MailAccountGuiService
- * mail-config.glade:
- * mail-search.glade:
- * mail-security.glade: HIG-compliance fixes for the glade dialogs
- * message-tag-followup.c (construct): Don't set border_width on the
- dialog itself
- Remove the separator from the dialog
- Set the border_widths for the dialog's vbox and action areas to be
- compliant with the HIG
- * message-tags.glade:
- * subscribe-dialog.glade: HIG-compliance fixes for these dialogs
-
- Original patch from Martyn Russell
-
-2004-03-24 Danilo Å egan <dsegan@gmx.net>
-
- * mail-ops.c (get_messages_desc): Use ngettext for handling plural
- forms (fixes bug #53464).
-
-2004-03-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-format-html.c (emfh_gethttp): Use sizeof() to decide how big
- buffer is so that in the future, if we change the length of
- bufefr, things will Just Work (tm).
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): Fixed the key to
- fetch the value from the correct location. It's
- junk/check_incoming, not junk/sa/check_incoming. Fixes bug #55903.
-
- * em-folder-tree-model.c (em_folder_tree_model_set_expanded):
- Fixed some logic bugs.
-
-2004-03-23 Radek Doulik <rodo@ximian.com>
-
- * em-format-html-display.c (efhd_format_attachment): use
- EM_FORMAT_HTML_VPAD
-
- * em-format-html.h (EM_FORMAT_HTML_VPAD): added new define for
- vertical padding
-
- * em-format-html.c (efh_format_message): change padding table so
- that it works OK with fixed gtkhtml
-
-2004-03-23 Not Zed <NotZed@Ximian.com>
-
- * em-format-html-display.c (efhd_attachment_popup): dont add the
- show/hide menu items if we can't ever show it inline.
- (efhd_attachment_button): disable the ">" button if we can't view
- the content inline. See #52086.
-
- * em-format-quote.c (emfq_format_attachment): format inline(d)
- parts automatically into the reply. Part of #55702.
-
- * em-utils.c (em_uri_from_camel): if we get an email uri passed in,
- just pass it out again, without first going to camel to do it.
-
-2004-03-22 Not Zed <NotZed@Ximian.com>
-
- * em-format.c:
- * em-mailer-prefs.c: Add Newsgroups to the default header list.
-
- * em-format-html.c (efh_format_header): handle the newsgroups
- header, output news: url's. For bug #??? i can't recall, i closed
- it already!
-
-2004-03-19 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes bug #54800.
-
- * em-folder-tree.c (tree_drag_drop): Remove the autoscroll
- timeout.
- (tree_drag_leave): Remove the autoscroll timeout.
- (tree_autoscroll): New autoscroll timeout callback - automagically
- scrolls the treeview if appropriate.
- (tree_drag_motion): Setup the autoscroll timeout.
-
-2004-03-19 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (mail_component_remove_store): ref the store
- before running the async disconnect, otherwise we unref one too
- many times.
-
-2004-03-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_setup): Don't set the
- account source/transport types to disabled simply because the
- provider is NULL (think of the "None" option).
- (source_type_changed): Need to update widget sensitivity based on
- locked'ness here.
- (transport_type_changed): Same.
-
- * em-utils.c (em_utils_add_address): rfc2047 decode the address
- here before passing it off to the addressbook (which expects it to
- be in human-readable form, not encoded). Fixes bug #55591.
-
-2004-03-18 Not Zed <NotZed@Ximian.com>
-
- * mail-account-gui.c (mail_account_gui_new): save the source and
- transport vbox's to enable/disable the whole lot easier.
- (mail_account_gui_setup): enable above based on perms.
- (mail_account_gui_build_extra_conf): also disable extra page, as
- above.
-
- * em-account-prefs.c (account_cursor_change): disable the whole
- account editor if accounts are ro.
-
-2004-03-17 Not Zed <NotZed@Ximian.com>
-
- * em-format-html.c (efh_message_deliverystatus): format as plain
- text too.
-
- * em-format.c (emf_message_deliverystatus): format delivery
- status messages as plain text, rather than as messages. since
- they wont be CamelMimeMessages. Maybe they should be silently
- hidden.
-
- * mail-offline-handler.c (store_go_online): split this, only call
- add_store/note_store once we've actually set the store online.
- (store_went_online): set the store up once we're fully online.
- Works around a deadlock in #55618.
-
- * em-account-prefs.c (account_cursor_change): disable
- editing/adding/removing accounts etc if accounts aren't editable.
- (em_account_prefs_construct): call above after setup.
-
- * mail-component.c (mc_quit_sync): if we have empty on exit days,
- check that. keep track of the last empty on exit time.
-
- * em-mailer-prefs.c (emmp_empty_trash_init): init the trash stuff
- here.
- (em_mailer_prefs_apply): save empty trash on exit frequency.
-
-2004-03-16 Not Zed <NotZed@Ximian.com>
-
- * mail-account-gui.c (mail_account_gui_auto_detect_extra_conf):
- check extra conf items are writable.
- (mail_account_gui_build_extra_conf): same.
- (setup_service): add gui arg, and do above for auth and ssl args.
-
-2004-03-16 Jeffrey Stedfast <fejj@ximian.com>
-
- Fix for bug #55358.
-
- * em-folder-tree.c (emft_expand_node): Changed to be the callback
- function for em_folder_tree_model_expand_foreach().
- (emft_maybe_expand_row): Renamed from emft_loading_row_cb(). We
- now handle both "loading-row" an "loaded-row" signals. Also
- updated for slight change in key generation.
- (em_folder_tree_new_with_model): Connect to the "loaded-row"
- signal.
- (emft_update_model_expanded_state): Updated for slight change in
- key generation.
-
- * em-folder-tree-model.c (em_folder_tree_model_add_store): Emit
- the "loaded-row" signal for the newly added store.
- (em_folder_tree_model_set_folder_info): Emit "loaded-row" for the
- row we've just set the info on (but only after we've added a child
- node if there is one, so the signal handler can expand the newly
- added row if appropriate).
- (em_folder_tree_model_class_init): Setup the "loaded-row" signal.
- (em_folder_tree_model_finalize): The tree-state is now an xml file
- and not a binary file, so change the expanded free func.
- (em_folder_tree_model_load_state): Load the expand-state xml
- file. If one doesn't exist, setup some defaults.
- (em_folder_tree_model_get_expanded): Scan the XML tree for the
- node.
- (em_folder_tree_model_set_expanded): Same.
- (em_folder_tree_model_save_expanded): Save the expand-state xml
- tree to disk.
- (em_folder_tree_model_expand_foreach): New function to iterate
- over all xml nodes and call the callback if the expand state is
- "true".
-
-2004-03-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-component.c (impl_requestCreateItem): Don't focus the
- name_entry widget here.
-
- * em-folder-selector.c (em_folder_selector_create_new): Focus the
- name_entry widget here rather than in mail-component.c
-
- * em-folder-tree.c (emft_drop_async_desc): New function to return
- a description of the async drop operation. Fixes bug #54808.
-
-2004-03-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-utils.c (reply_to_message): If the mail_get_message() async
- op fails, it will still call us with a NULL message to check for
- that. Fixes bug #55612.
- (post_reply_to_message): Same.
-
- * em-folder-tree.c (emft_copy_folders__copy): Use
- camel_store_rename_folder() when appropriate (m->tostore ==
- m->fromstore && m->delete)
-
-2004-03-15 Not Zed <NotZed@Ximian.com>
-
- * em-format.c (em_format_format_error): make this a varags
- function, which then calls the virtual method to do the work.
- (emf_multipart_appledouble, emf_multipart_mixed)
- (emf_multipart_alternative, emf_multipart_related)
- (emf_message_rfc822): print an error to explain why you're getting
- source content displayed.
- (em_format_format_secure): make this a function. and if we're
- done formatting a secure part, and we dont have a parent anymore,
- null out the validity. See #55541.
-
-2004-03-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-browser.c (emfb_search_search_activated): No-op if
- emfv->folder is NULL (this means we are looking at a store folder?
- or else the folder hasn't loaded yet). Fixes bug #55293.
-
-2004-03-11 Radek Doulik <rodo@ximian.com>
-
- * mail-ops.c: remove junk learning thread, it's handled in
- camel-folder.c:folder_changed now
-
- * em-folder-view.c (emfv_popup_mark_junk): use
- em_folder_view_mark_selected, set junk, junk-learn and seen flags
- (emfv_popup_mark_nojunk): similar, reset junk, set junk-learn flags
-
-2004-03-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (mail_send_mail): Removed. No longer in use (hasn't
- been since before 1.2).
- (send_queue_send): Before enetring the main send loop, create a
- temporary uid array containing ONLY the messages we will send
- (ie. not any that have been marked deleted) so that we can more
- accurately report the number of messages total that we are
- sending. Also continue sending even if we encounter an exeption in
- mail_send_message() (unless, of course, it is a
- user-cancel). Merge any exceptions we get into the master
- exception variable and ALWAYS sync/expunge the queue folder.
-
-2004-03-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-browser.c (emfb_set_folder): Reverted signal blocking
- stuff. Doesn't work and is unneeded with the proper fix.
-
- * em-format-html.c (efh_format_header): Fixed a bug where txt
- wasn't being properly initialised in all cases for Date
- headers. Also fixed the x-evolution-mailer code to simply use the
- ehader->value that was passed in.
- (efh_format_headers): Fixed to handle the special
- X-Evolution-Mailer header.
-
-2004-03-11 Not Zed <NotZed@Ximian.com>
-
- * em-folder-browser.c (emfb_set_folder): a really gross hack,
- disable all search handlers before setting the search and set hte
- search manually rather than going through the callbacks. Partial
- fix for #55267, and ugly as it is.
- (emfb_init): save the search signal id's.
- (emfb_set_folder): ugh, properly set the defaults if the settings
- haven't been stored on the folder, and properly move them upstream
- to the bonobo menus.
-
- * em-folder-tree-model.c (sort_cb): when we sort, handle not
- having the node in the tree. otherwise we always compare against
- "" which puts it at the head of the branch, rather than the tail.
- See #55428.
-
- * em-folder-tree.c (tree_drag_motion): make dnd look funny for
- joe. #55246.
-
- * mail-component.c: change stores hash to point to a structure, in
- which we maintain the vtrash and vjunk folders for the entirety of
- the session. memory use be damned i guess. #55417 and partially
- #55391.
-
-2004-03-11 Not Zed <NotZed@Ximian.com>
-
- * em-format-html.c (efh_format_header): pass the raw header in
- instead of name and value.
- (efh_format_headers): if we have specific headers to show, iterate
- over all headers and print out all matching ones, so duplicate
- headers are properly displayed. Related to #55298.
-
- * em-folder-selector.c (em_folder_selector_construct): dont set
- this to be modal. otherwise you can't click on error popups. duh.
-
-2004-03-08 Not Zed <NotZed@Ximian.com>
-
- * em-folder-selection-button.c
- (em_folder_selection_button_clicked): don't let the user select
- virtual/vtrash folders or non-selectable folders.
-
- * mail-component.c (impl_createControls): disable selection of
- non-select rows.
-
- * em-folder-selector.c (em_folder_selector_create_new): exclude
- folders with noinferiors set.
-
- * em-folder-tree.c (folder_tree_new): add folder tree arg, hook
- onto the selection funciton for the tree selection.
- (emft_select_func): selection override function. allow certain
- things to be excluded.
- (em_folder_tree_set_excluded): api to set what is excluded from
- the selectability.
- (emft_tree_row_activated): call emft_select_func check to see if
- this row is excluded before emitting an activated signal.
-
- * em-folder-tree-model.c (em_folder_tree_model_set_folder_info):
- save folder info->flags in the tree store.
-
- * mail-folder-cache.c (create_folders): use tail recursion.
- (get_folders): tail recurse.
-
- * (*): Fixed for api changes in camel.
-
-2004-03-10 Jeffrey Stedfast <fejj@ximian.com>
-
- Fix for bug #55298.
-
- * em-format-html.c (efh_format_header): Now takes a default txt
- argument (header value). For address/date headers, if this isn't
- set, default back to the old behaviour of looking it up.
- (efh_format_headers): If we are iterating thru the camel raw
- headers, always pas the header value as the txt argument,
- otherwise always pass NULL.
-
-2004-03-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-format-html-display.c (efhd_xpkcs7mime_validity_clicked):
- Removed an unused variable left over from an old attempted fix.
-
- * em-folder-selector.c (emfs_response): Select the same folder in
- the create-folder dialog as is selected in the parent selector
- dialog. Fixes the rest of bug #53862.
-
- Partial fix for bug #53862.
-
- * em-folder-selector.c (emfs_response): Connect to the newly added
- "folder-added" signal and save a created_uri string so that we can
- be sure to only listen for the creation of the folder the user
- created in *our* create-folder dilog (and not from some other
- place).
-
- * em-folder-tree-model.c (folder_subscribed): Emit a new
- "folder-added" signal.
-
- * mail-session.c (request_password): Focus the entry widget. Fixes
- bug #55330.
-
-2004-03-10 Radek Doulik <rodo@ximian.com>
-
- * em-junk-filter.c (pipe_to_sa_with_error): call
- camel_stream_close and close the fds[1]
- (pipe_to_sa_with_error): do not call close, camel_stream_close
- should be enough to be sure the fd was closed
-
-2004-03-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (emft_create_folder): New async function to
- create a folder.
- (em_folder_tree_create_folder): Partly moved into
- emft_create_folder. Might be able to remove this code, but lewing
- might be using it in Connector or something? Need to ask him...
- (emft_popup_new_folder_response): Use emft_create_folder()
- instead.
-
-2004-03-08 Radek Doulik <rodo@ximian.com>
-
- * mail-ops.c (mail_filter_junk): new method, filter folder with
- FILTER_SOURCE_JUNKTEST type filter
-
- * em-folder-view.c: added Filter Junk command and junk icons to
- menus, added apply filters icon to popup menu
- (emfv_popup_filter_junk): new helper method, calls
- mail_filter_junk
-
-2004-03-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-format-html-display.c (em_format_html_display_search): Don't
- set our parent window as the efhd, ehfd isn't even a widget.
-
- Fixes bug #54030
-
- * em-format-html-display.c (efhd_search_response): Reset the
- searching tokeniser on Cancel.
-
- * e-searching-tokenizer.c (e_searching_tokenizer_reset): New
- function to reset a search tokeniser.
-
-2004-03-05 Not Zed <NotZed@Ximian.com>
-
- ** See bug #55096.
-
- * importers/evolution-mbox-importer.c (process_item_fn): hack,
- unref when complete
-
- * importers/evolution-outlook-importer.c (outlook_importer_new):
- init status lock.
- (process_item_fn): hack, unref ourselves when we're complete. i
- think the shell leaks the ref.
-
-2004-03-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-view.c (emfv_popup): If event == NULL, don't try to
- use event->key.time
-
- * em-migrate.c (upgrade_vfolder_sources_1_4): New function to
- upgrade vfolder sources.
- (em_upgrade_xml_1_4): If the doc is vfolders.xml, upgrade the
- sources nodes.
-
-2004-03-03 Not Zed <NotZed@Ximian.com>
-
- ** See bug #53738.
-
- * mail-ops.c (fetch_mail_fetch): if we've been cancelled, uncancel
- so syncing can work. and always sync the folder (with expunge if
- deleting).
-
- ** See bug #54924.
-
- * em-utils.c (em_utils_selection_set_urilist): Try to get the drop
- filename from the message subject, or folder name.
- (em_utils_empty_trash): kill warning.
-
- ** See bug #54121.
-
- * mail-component.c (impl_requestCreateItem)
- (emc_new_folder_response): Hack in a nastish implementation of
- create folder for the new menu.
- (impl__get_userCreatableItems): add 'new mail folder' to new
- button.
-
-2004-03-03 Not Zed <NotZed@Ximian.com>
-
- * em-folder-tree-model.c (em_folder_tree_model_set_folder_info):
- if we have the folder opened already, and its the outbox, then use
- the total count instead of unread count. Bit of hack, but copies
- mail-folder-cache stuff.
-
- * mail-component.c (mc_add_store): renamed from
- mail_component_add_store, internal call. Added a done callback.
- (mc_add_local_store): renamed from mc_add_store, callback for
- local store.
- (mail_component_add_store): call mc_add_store to do the work.
- (mc_add_local_store_done): ugh, the target of all this shit - note
- all the default folders now they should be setup.
-
- * mail-folder-cache.c (mail_note_folder): clean up the logic a
- bit. was gonna do osmething else but it didn't work.
-
-2004-03-02 Not Zed <NotZed@Ximian.com>
-
- * mail-send-recv.c (mail_send): if we're already sending, up the
- again count to tell it we need to re-send again.
- (receive_done): if we've been asked to run a send again while we
- were already running it, run it again to make sure we didn't miss
- any new messages. See bug #46839.
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): update
- check_incoming_imap changes for merge conflicts.
- (settings_changed): i have no idea what these changes jeff did do,
- but check_incoming_imap is no longer needed, so i've deleted most
- of it.
-
-2004-02-27 Not Zed <NotZed@Ximian.com>
-
- * em-format.c (emf_multipart_encrypted, emf_multipart_signed): If
- validation fails, display as multipart/mixed rather than unkown
- attachment type, and make the error a little clearer that its an
- error. See #52939.
-
-2004-02-26 Not Zed <NotZed@Ximian.com>
-
- * message-list.c (regen_list_regened): NOOP if the folder has
- changed.
-
- * mail-session.c (mail_session_check_junk_notify): remove
- check_incoming_imap test.
- (mail_session_init): "
-
- * evolution-mail.schemas.in.in: Remove check_incoming_imap option.
-
- * mail-config.glade: Remove check incoming imap checkbox.
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): remove
- check_incoming_imap test.
- (em_mailer_prefs_apply): "
- (settings_changed): "
-
-2004-03-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (emft_tree_button_press): s/||/&&/. Fixes a
- dumb bug I introduced yesterday.
-
-2004-03-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-selector.c (em_folder_selector_construct): Connect to
- the folder-activated signal.
- (folder_activated_cb): Call gtk_dialog_response() with
- GTK_RESPONSE_OK. Fixes bug #54793.
-
- * em-folder-tree.c (emft_tree_row_activated): New callback to emit
- the "folder-activated" signal which is needed to fix bug #54793.
- (emft_tree_button_press): Handle button1 double-clicks too (also
- for bug #54793).
- (emft_tree_button_press): On right-click, we also want to select
- the folder the user right-clicked on. Fixes bug #54772.
-
-2004-02-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): Fixed some
- console warnings from my last commit.
-
- * em-folder-view.c (emfv_setting_notify): If
- gconf_entry_get_value() returns NULL, then it means the key was
- unset or something. Don't use g_return_if_fail() for that.
-
- First of the lockdown fixes...
-
- * em-composer-prefs.c (em_composer_prefs_construct): Same as
- below.
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): Respect
- locked-down keys by disabling their sensitivity to the user.
- (settings_changed): Don't re-enable check_incoming_imap if the key
- is locked.
-
-2004-02-26 Rodney Dawes <dobey@ximian.com>
-
- * em-format-html-display.c (efhd_attachment_button): Create the
- arrows in these widgets as GTK_SHADOW_NONE, since the default arrow
- type in GTK+ 2.x is flat triangle arrows, and shadow types are
- generally ignored for arrows anyway, and so we don't look ugly with
- themes that handle shadow types on arrows correctly
-
-2004-02-26 Jeffrey Stedfast <fejj@ximian.com>
-
- Fix for bug #54352
-
- * em-message-browser.c (emmb_class_init): Set update_message_style
- to FALSE.
-
- * em-folder-view.c (emfv_setting_notify): Only update message
- display style if our subclass wants us to.
- (emfv_class_init): Set update_message_style to TRUE.
- (emfv_view_mode): Don't save the gconf key unless our class allows
- us to.
-
-2004-02-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-utils.c (em_utils_folder_name_from_uri): Make sure url->path
- is non-NULL before setting folder_name to url->path + 1. Could
- possibly fix bug #54853.
-
-2004-02-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-format-html-display.c (efhd_attachment_button): Protect
- against using NULL pixbufs. Gets rid of a lot of console warning
- spewage on my system.
-
- * em-folder-view.c (emfv_list_key_press): Removed Delete/KP_Delete
- from here. Now handled via the bonobo-ui menu accels. Fixes bug #53504.
-
-2004-02-25 Radek Doulik <rodo@ximian.com>
-
- * mail-session.c (main_get_filter_driver): set seen flag for junk
- messages
-
- * em-folder-view.c (emfv_popup_mark_junk): do not set DELETED
-
-2004-02-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-editor.c (construct): Removed Apply button. As
- discussed on IRC, UI doesn't feel we should have an Apply button
- here.
-
-2004-02-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-editor.c (construct): Need to listen for changes to
- S/MIME options, the signature option menu, and any extra
- provider-specific config options. Fixes bug #54036.
-
- * em-folder-view.c (emfv_popup_mark_junk): Set the SEEN flag as
- well.
- (emfv_list_key_press): Removed the skip-to-next-message logic as
- this was already being handled in emfv_popup_delete(). Fixes bug
- #54471.
- (emfv_enable_menus): Re-enable MessageDelete here. Fixes bug
- #54770.
-
- * em-utils.c (em_utils_folder_is_drafts): Use the new
- camel_store_folder_uri_equal() function.
- (em_utils_folder_is_sent): Same.
-
-2004-02-23 Jeffrey Stedfast <fejj@ximian.com>
-
- Fix for bug #54057
-
- * em-utils.c (em_utils_folder_is_sent): Use provider->url_equal()
- rather than camel_store_uri_cmp() since that function did not do
- anything close to what it claimed to do. Also use
- em_uri_to_camel() here on the account sent_folder_uri.
- (em_utils_folder_is_drafts): Same.
-
-2004-02-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-message-browser.c (emmb_list_message_selected): Protect
- against NULL uids.
- (emmb_set_message): Same.
-
- * em-format-quote.c (emfq_format_message): Print the headers when
- forwarding inline/quoted. Fixes bug #53916.
-
- * em-folder-tree.c (tree_drag_motion): We want UID_LISTs to drop
- with the MOVE action by default. Fixes a common complaint from
- IRC.
-
-2004-02-23 Not Zed <NotZed@Ximian.com>
-
- * em-format.c (emf_multipart_signed): check mps->protocol != NULL
- before dereferencing it. See #54406.
-
-2004-02-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-view.c (emfv_list_key_press): Delete key should always
- delete, never undelete (bug #53215). Also fixes a bug where
- uids->len was being accessed after uids had been free'd.
-
- Fix for bug #53997
-
- * em-folder-view.c (emfv_list_message_selected): Ref the emfv
- before spawning the async event.
- (emfv_list_done_message_selected): Check emfv->preview !=
- NULL. Also unref the emfv when done.
-
-2004-02-20 Dan Winship <danw@ximian.com>
-
- * mail-component.c (set_prop): Remove the debug message here.
-
-2004-02-20 Not Zed <NotZed@Ximian.com>
-
- * mail-vfolder.c (mail_vfolder_add_uri): fix for vfolder-rule api
- changes.
-
- * mail-folder-cache.c (unset_folder_info, setup_folder)
- (rename_folders): switch the sense of the no select checks. TEST!
-
-2004-02-19 Chris Toshok <toshok@ximian.com>
-
- * em-format.c (emf_application_xpkcs7mime): wrap code with
- ENABLE_SMIME instead of HAVE_NSS.
- (emf_multipart_signed): same.
- (type_builtin_table): same.
-
-2004-02-19 Rodney Dawes <dobey@ximian.com>
-
- * em-folder-tree.c (emft_save_state): Revert previous change, doh
-
-2004-02-19 Rodney Dawes <dobey@ximian.com>
-
- * em-folder-tree.c (emft_save_state): Don't set the timeout id to 0
- and then immediately return FALSE, which tries to remove the timeout
-
-2004-02-19 Not Zed <NotZed@Ximian.com>
-
- * mail-send-recv.c (get_receive_type):
- * mail-config.c (mail_config_get_account_by_source_url)
- (mail_config_get_account_by_transport_url):
- * mail-component.c (mail_component_load_store_by_uri):
- * mail-account-gui.c (mail_account_gui_setup)
- (mail_account_gui_save):
- * em-utils.c (em_utils_empty_trash, em_uri_from_camel):
- * em-folder-tree-model.c (account_changed):
- * em-folder-selector.c (em_folder_selector_get_selected_uri): fix
- camel provider api changes.
-
-2004-02-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-composer-prefs.c (sig_fill_list): Changed the name to not
- imply we are working with a GtkCList widget (since we are using a
- GtkTreeView).
-
- * em-folder-tree.c (emft_tree_button_press): Pass flags to
- em_popup_target_new_folder() instead of just an isstore arg.
- (emft_tree_button_press): Fake the fi flags for vTrash/vJunk so
- that em-popup.c can disable the delete flag for these.
-
- * em-popup.c (em_popup_target_new_folder): Instead of taking an
- isstore argument, take a flags argument so that our caller can
- give us hints about the selected folder/store. Also fixed a logic
- bug from my previous commit.
-
-2004-02-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (emft_tree_button_press): Updated for em-popup
- API change (altho currently passes a dummy value).
-
- * em-popup.c (em_popup_target_new_folder): Check for vTrash/vJunk
- by checking the CAMEL_FOLDER_VIRTUAL info flags bit. (perhaps this
- flag should be renamed to SPECIAL? VIRTUAL might not have been a
- good name). Also changed to check flags & CAMEL_FOLDER_NOSELECT
- rather than checking the uri string for a noselect param.
-
- * mail-folder-cache.c (unset_folder_info): Instead of checking for
- ";noselect" in the uri, check for a CAMEL_FOLDER_NOSELECT flag on
- mfi->flags.
- (setup_folder): Copy the fi->flags to mfi->flags here.
- (rename_folders): Same.
- (setup_folder): Check fi->flags for CAMEL_FOLDER_NOSELECT here
- instead.
- (rename_folders): Same. Also gets rid of a FIXME.
-
-2004-02-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-format-html-display.c (efhd_xpkcs7mime_validity_clicked):
- Revert change from yesterday.
- (efhd_xpkcs7mime_button): Use the icon from the table.
-
-2004-02-18 Not Zed <NotZed@Ximian.com>
-
- ** See bug #54492.
-
- * em-folder-tree.c (emft_popup_copy_folder_selected): check the
- store flags, not the fragment presence to find out if we use the
- fragment as the path.
-
-2004-02-17 Jeffrey Stedfast <fejj@ximian.com>
-
- Fix for bug #54060 (except for the "don't let users copy/move
- messages to Outbox" bit).
-
- * em-folder-tree.c (emft_drop_target): Rearranged a little. We can
- check for special dest folders right away. Also added a check for
- the default local folders (Drafts/Inbox/Outbox/Sent) since we
- don't want to be able to move them anywhere else (copying is ok).
- (emft_popup_copy_folder_selected): Don't allow moving any of the
- default local folders to be consistant with drag&drop changes.
- (emft_popup_rename_folder): Don't allow the user to rename a
- default local folder.
- (emft_popup_delete_folder): Don't allow deletion of special local
- folders.
-
- * mail-component.c (mail_component_peek_local_store): New function
- to peek the local store.
-
-2004-02-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-format-html-display.c (efhd_xpkcs7mime_validity_clicked):
- Display an alternate description based on the trust value if we
- have a trust to work with.
-
- * em-folder-browser.c (emfb_hide_deleted): Set the hide_deleted
- bool on EMFolderView.
-
- * em-folder-view.c (emfv_popup_delete): Fix Sarfraaz Ahmed's fix
- to only jump to the previous message if hide_deleted is
- set. Otherwise his fix gets extremely irritating.
- (emfv_list_key_press): Same.
-
-2004-02-17 Not Zed <NotZed@Ximian.com>
-
- ** See bug #53914.
-
- * em-utils.c (guess_account): do some extra checks, message
- source, and source folder.
- (guess_account_folder): helper to guess account based on folder.
-
- ** See bug #54200.
-
- * em-popup.c (em_popup_target_new_select): add
- EM_POPUP_SELECT_FOLDER - to find out if we have a folder at
- all. Handle getting a NULL folder passed in.
-
- * em-folder-view.c (em_folder_view_get_popup_target): Added
- EM_FOLDER_VIEW_SELECT_FOLDER - to detect when we dont have a
- folder set on the emfolderview.
-
- * em-folder-browser.c (emfb_mark_all_read): if we don't have a
- folder, dont try and run.
- (emfb_enable_map[]): Disable a bunch of stuff we have no
- folder set.
-
- * importers/pine-importer.c (import_contact): fix for the
- weird-arsed e-contact list api. and fix a small memleak.
-
-2004-02-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (emft_drop_folder): Make sure the drop-target
- folder doesn't already contain a folder named identical to the one
- we are dropping by using the new CAMEL_STORE_FOLDER_EXCL
- flag. Fixes bug #53810.
-
-2004-02-13 Radek Doulik <rodo@ximian.com>
-
- * evolution-mail.schemas.in.in: added defaults for composer
- width/height
-
-2004-02-13 Sarfraaz Ahmed <asarfraaz@novell.com>
-
- * em-folder-view.c (emfv_popup_delete): added the code to get
- the previous mail in a list, if get_next_mail fails. This is a
- fix for #54195
- (emfv_list_key_press): Same as above
-
-2004-02-13 Not Zed <NotZed@Ximian.com>
-
- * importers/netscape-importer.c: use mail-importer to import the
- mail tree, fix the account stuff to talk directly to mail config.
- Added cancel button. etc. This is completely untested apart from
- compiling with no warnings.
-
- * importers/mail-importer.c (import_mbox_import): dont re-use the
- exception for syncing.
-
- * importers/evolution-outlook-importer.c: major reworking. Some
- platform fixes, runs in another thread, simpler/cleaner main loop.
- This is completely untested apart from compiling with no warnings.
-
- * importers/evolution-mbox-importer.c (support_format_fn): we dont
- want to check the From_ line case insensitive!
- (create_control_fn): implement this weird api.
-
-2004-02-12 Not Zed <NotZed@Ximian.com>
-
- * importers/elm-importer.c: rewrote all importing stuff.
-
- * importers/mail-importer.c (mail_importer_import_folders_sync):
- split out into a recursive function & entry. Now handles mozilla
- format stuff with a flag.
- (import_mbox_import): made the cameloperation properly
- save/restore multiple registrations.
-
-2004-02-12 Radek Doulik <rodo@ximian.com>
-
- * em-junk-filter.c (pipe_to_sa_with_error): use
- g_find_program_in_path to avoid fork in case program is not
- available
-
-2004-02-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-component.c (mail_control_new): Disable the
- bonobo-ui-component statusbar when using the EMFolderBrowser
- outside of the mail component. This prevents the Connector
- component from having 2 status bars.
-
- * em-popup.c: #include <libgnomevfs/gnome-vfs-mime.h>
- (em_popup_create_menu): Wrap item->label with _() so
- that the strings get translated properly.
-
-2004-02-11 Christian Neumair <chris@gnome-de.org>
-
- * em-folder-tree-model.c (sort_cb): "On this Computer" -> "On This
- Computer".
-
- * mail-component.c (mc_setup_local_store): Ditto.
-
-2004-02-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-format-html-print.c: Same.
-
- * em-junk-filter.c: #include <config.h>
-
- * em-popup.c: Add license & config.h
-
-2004-02-11 Radek Doulik <rodo@ximian.com>
-
- * em-junk-filter.c (em_junk_sa_test_spamd): if spamc is not
- available, try /usr/sbin/spamc
-
-2004-02-10 Radek Doulik <rodo@ximian.com>
-
- * em-junk-filter.c (em_junk_sa_test_spamd): try to check if system
- wide spamd has --local parameter set according to our setting
- (em_junk_sa_test_spamd): in case we were unable to start our own
- spamd, try to run it from /usr/sbin before giving up
-
-2004-02-11 Not Zed <NotZed@Ximian.com>
-
- * importers/mail-importer.c (mail_importer_import_folders_sync):
- call the right recursive function, oops.
-
- * importers/mail-importer.h: don't include camel-operation.h, but
- fix up the forward decl usage.
-
-2004-02-11 JP Rosevear <jpr@ximian.com>
-
- * importers/mail-importer.h: include camel-operation.h
-
-2004-02-11 Not Zed <NotZed@Ximian.com>
-
- * importers/pine-importer.c: Basically rewrote this, the import
- tasks run in another thread. It tells you more about what's going
- on, and its cancellable.
- (pine_store_settings): changed the meaning of the settings
- slightly, if set it means we've processed them already.
-
- * mail-component-factory.c (factory): hook in importer factory
- callback.
-
-2004-02-10 Not Zed <NotZed@Ximian.com>
-
- * importers/*-importer.c: removed module init, just provide a new
- method. Updates for api changes.
-
- * Makefile.am: link mail importers in directly.
-
- * mail-importer.c: changed to do stuff in-memory with linked
- stuff, moved to importers/.
-
- * importers/GNOME_Evolution_Mail_Importers.server.in.in: merge all
- importer .server info's here, point them all to the mailer
- factory. Removed the others.
-
- * importers/Makefile.am: remove Mailer.idl stuff. Move all
- importers to a single library.
-
-2004-02-09 Not Zed <NotZed@Ximian.com>
-
- * em-folder-tree.c (tree_drag_data_delete): merged in code from
- em_folder_tree_model_drag_data_delete.
- (tree_drag_data_get): similar.
- (tree_drag_data_received): similar.
- (drag_text_uri_list): removed, use em_utils_selection_set_urilist
- in tree_drag_data_get instead.
- (em_folder_tree_enable_drag_and_drop): merged in
- em_folder_tree_model_set_drag_drop_types.
- (tree_drag_motion): merge in drop_possible, handle qualifiers, and
- return the right type.
- (em_folder_tree_model_row_drop_target): rename to
- emft_drop_target, and make private. Beefed up substantially,
- handles illogical drops, dropping on to special folders and
- properly handling vfolder uri's (at least within the same tree
- instance).
-
- * em-folder-tree-model.c: Moved all of the DND stuff to
- em-folder-tree, where it belongs, made it all static. Should
- allow for some sharing of code too.
-
- * em-format-quote.c (emfq_format_message): just print the \n after
- the credits in the same printf, rather than adding an else. Add a
- <br> too, otherwise it has no effect.
-
-2004-02-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-format-html.c (efh_format_headers): Make private (only
- EMFormatHTMLQuote used it and that class is no longer in use).
- (efh_format_message): Updated for above change.
-
- * em-format-quote.c (emfq_format_message): Always write a \n after
- the credits line.
-
- * em-subscribe-editor.c (sub_folderinfo_get): Set the NO_VIRTUAL
- flag bit for get_folder_info(). Fixes bug #51887.
-
-2004-02-06 Radek Doulik <rodo@ximian.com>
-
- * em-folder-view.c (emfv_popup_mark_nojunk): move to the next
- message after mark not junk as well
-
- * em-junk-filter.c (em_junk_sa_test_spamd): split into
- spamassassin and spamd tests
- (em_junk_sa_is_available): test spamd only if spamd usage enabled
- (pipe_to_sa_with_error): extended pipe_to_sa, last added parametr
- specifies return value if an error occured
- (em_junk_sa_check_junk): don't use /bin/sh -c when running
- spamassassin, it's not needed and we need to avoid getting 126,127
- exit codes from the shell
- (em_junk_sa_check_junk): pass 0 rv_err to pipe_to_sa_with_error to
- avoid false positives in case someone removes/uninstalls SA while
- evolution runs
-
-2004-02-06 Not Zed <NotZed@Ximian.com>
-
- ** See bug #53258.
-
- * em-format-html-display.c (efhd_find_handler): force any bonobo
- handler types to always be inline, even attachments.
-
- * em-format.c (em_format_is_inline): use handler flags for special
- cases, removing all hard-coded types.
-
- * em-format.h (EMFormatHandler): add a flags field, so far a flag
- to set default inline viewing of the content.
-
-2004-02-06 Not Zed <NotZed@Ximian.com>
-
- * em-folder-properties.c: include string.h to kill warning.
-
- ** See bug #53627.
-
- * em-folder-view.c (emfv_popup_mark_junk): changed to work like
- delete does, jumping to the next message if required, and marking
- things immediately, then queuing up the junk marking job if
- required.
-
- * mail-ops.c (mail_mark_junk): ugh, this stuff totally can't go
- accessing messagelist from another thread!!!! Changed so this
- code only does the junk reporting, not setting flags. UGH! It
- should be doing this implictly on the folder when you set the
- flags, or at least when you sync the folder!!! Changed ot use the
- queued thread.
-
- * message-list.c (find_next_undeleted): changed to find
- next-unhidden, i.e. junk as well as deleted, if we're in
- hide-deleted mode.
- (build_tree): always call find_next_undeleted if we have a cursor.
- (build_flat): same.
-
-2004-02-05 Rodney Dawes <dobey@ximian.com>
-
- * em-message-browser.c (emmb_list_message_selected): Grab focus on
- the HTML widget when we display
-
- Fixes #52942
-
-2004-02-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-message-browser.c (emmb_list_message_selected): Set the new
- title.
- (em_message_browser_window_new): Connect to the message_selected
- signal in the message-list widget. Fixes bug #52232.
-
- * em-folder-tree-model.c (em_folder_tree_model_row_drop_target):
- Now takes a GdkContext arg... will need this later when we want to
- re-enable dnd of vfolders.
-
- * em-folder-browser.c (emfb_set_folder): Always set the
- search_state, even if it is NULL (NULL means default/unset state).
-
- * em-folder-view.c (emfv_mail_next_flagged): Pass TRUE as
- wraparound (to both be consistant with prev_flagged and to fix bug
- #48681.
-
-2004-02-05 Not Zed <NotZed@Ximian.com>
-
- * em-folder-tree.c (emft_copy_folders__copy): sync the from folder
- if we're going to delete it, otherwise we can't because its not
- empty. See #53815.
-
-2004-02-05 Not Zed <NotZed@Ximian.com>
-
- * em-folder-tree-model.c
- (em_folder_tree_model_drag_data_received): hmm, another well
- tested bit of code ... if you launch another thread you gotta copy
- the selection since it wont hang around until we're done with it.
- So copy/parse the selection data into appropriate structures.
- (drop_folder): just take the async message as an argument, rather
- than copying half of it to the stack.
- (drop_text_uri_list, drop_uid_list): replace most args with the
- thread message.
- (drop_message_rfc822): removed, now trivial.
- (emftm_drag_data_received_async__drop): change for changed args,
- and fix a memleak.
- (emftm_drag_data_received_async__free): fixed for changed
- structure.
-
- * em-folder-tree.c (em_folder_tree_create_folder): call abort
- before we unref, aid debugging if we hit it.
-
- * mail-vfolder.c (uri_is_spethal): check for vfolder/vtrash
- folders. Based on name check and store options.
-
-2004-02-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree-model.c (em_folder_tree_model_row_drop_target):
- Don't allow dropping into a vfolder (store). Fixes bug #53757.
-
-2004-02-04 Not Zed <NotZed@Ximian.com>
-
- ** See bug #53683.
-
- * mail-ops.c (mail_sync_store): new async op to call
- CamelStore::sync.
-
- * mail-component.c (impl_requestQuit): implement, check to see if
- we can quit, or have open or unsent messages (and are in online
- mode).
- (impl_quit): implement. Trigger off a sync of all open stores,
- and return FALSE until its done.
- (impl_upgradeFromVersion): fixed the signature to match the idl,
- killed that warning at last.
-
- ** See bug #53832.
-
- * em-folder-browser.c (emfb_folder_properties): only show this if
- we have a uri set. Strictly, the menu item shouldn't be
- activated.
-
- ** See bug #53131.
-
- * em-folder-browser.c (em_folder_browser_show_preview): copy the
- message list's cursor_uid before calling set_message, since it can
- get freed during setting the message.
-
-2004-02-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (tree_drag_data_received): Modified
- slightly. The model now calls gtk_drag_finish() for us when it is
- done.
-
- * em-folder-tree-model.c
- (em_folder_tree_model_drag_data_received): Make this perform camel
- operations in another thread so we don't block.
- (em_folder_tree_model_drag_data_get): Updated args to be
- consistant with drag_data_received.
-
-2004-02-03 Radek Doulik <rodo@ximian.com>
-
- * em-junk-filter.c: handle the sa prefs here, have own gconf
- client with sa dir added
-
- * mail-session.c: removed sa prefs
-
-2004-02-02 Jeffrey Stedfast <fejj@ximian.com>
-
- Fix for bug #52941
-
- * em-message-browser.c (em_message_browser_window_new): Set window
- size based on previous size; load from gconf if necessary.
- (window_size_allocate): Save window size changes.
-
-2004-02-02 Not Zed <NotZed@Ximian.com>
-
- ** See bug #53549.
-
- * em-folder-selector.c: Fix handling a parent path of "/".
-
- * mail-ops.c (mark_junk_mark): removed the really innacurate cut and
- paste comment. This has nothing to do with filter_folder.
-
- ** See bug #52994.
-
- * em-folder-properties.c (em_folder_properties_show): redirect
- vFolder uri's to the vFolder editor.
-
- ** See bug #53502.
-
- * em-folder-browser.c (emfb_folder_properties): implement.
-
- * em-folder-tree.c (emft_popup_properties): fixed for change
- below.
-
- * em-folder-properties.[ch]: Moved the folder properties window
- from em-folder-tree.c to its own file.
-
-2004-02-02 Not Zed <NotZed@Ximian.com>
-
- ** See bug #53559.
-
- * em-folder-tree.c (folder_tree_new): set CAN_FOCUS flag on the
- folder tree content widget.
-
- * em-folder-selector.c (em_folder_selector_construct): Don't wrap
- the folder tree in a scrolled window. Its already in one ????.
- (em_folder_selector_construct): dont set can_focus on the folder
- tree.
-
-2004-02-01 Bill Zhu <bill.zhu@sun.com>
-
- Fixes for bug #53530
-
- * em-utils.c (em_utils_redirect_message): Removed the duplicate
- adding of attachments
-
-2004-01-30 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes for bug #53348
-
- * mail-account-gui.c (mail_account_gui_save): Only add the new
- store to the mail-component if the mail-component doesn't already
- know about it (ie. only if we are adding a new account).
-
- * em-folder-tree-model.c (em_folder_tree_model_add_store): Hash
- our store-info based on account here.
- (em_folder_tree_model_init): Listen for
- account_changed/account_removed signals.
- (em_folder_tree_model_finalize): Disconnect above handlers.
- (account_changed): Tear down the account store node and replace it
- with the new store (assuming it belongs in the tree after the
- changes).
- (account_removed): Remove the account store from the tree.
-
-2004-01-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (emft_tree_row_expanded): Get recursive folder
- listing (needed or folders that have as-of-yet-unloaded-subfolders
- that contain unread mail will not be bolded). Fixes bug #51045.
-
- Fix for bug #53195.
-
- * em-folder-browser.c (emfb_set_folder): Restore search_state.
- (emfb_search_search_activated): Save search_state.
-
-2004-01-30 Not Zed <NotZed@Ximian.com>
-
- ** See bug #53549, partial fix.
-
- * em-folder-selector.c (emfs_create_name_activate): only emit the
- ok response if the ok button would be active (i.e. entered a valid
- path).
-
- ** See bug #52992.
-
- * message-list.c (message_list_hide_clear): save the hide state
- after its been cleared, so any popup windows inherit it.
- (message_list_hide_uids): same.
-
- ** See bug #53123.
-
- * em-folder-tree-model.c (drop_folder): changed to take store and
- dest folder as arg, to handle the case of the parent folder being
- "" properly.
- (em_folder_tree_model_drag_data_received): special case dropping a
- folder, and don't allow dropping to "" for any other types.
-
-2004-01-30 Not Zed <NotZed@Ximian.com>
-
- ** See bug #53558 (plus other fixes/cleanups)
-
- * em-format.c (emf_format_secure): default implementation, handle
- output of inner part, but dont output any sign/encrypt info.
- (emf_multipart_signed, emf_multipart_encrypted): replaced with
- implementations from em-format-html.c, which now call
- em_format_format_secure to output guts.
- (emf_class_init): hook-up virtual method format_secure.
-
- * em-format.[ch]: add a virtual method for outputing secured
- parts. Moved all validity stuff from em-format-html.[ch] to here.
-
- * mail-component.c (impl_createControls): set the session
- interactive too.
-
- * em-format-html-display.c: make smime stuff dependent on
- HAVE_NSS.
- (efhd_multipart_signed, efhd_application_xpkcs7mime): removed, now
- handled by root class.
- (efhd_output_secure): renamed to efhd_format_secure, and use
- EMFormat::format_secure to kick off.
- (efhd_class_init): setup format_secure virtual method.
-
- * em-format-html.c (efh_multipart_encrypted): We need to handle
- this here so we can properly keep track of the ciphervalidity
- stuff. Also do it directly using the context, not
- multipartencrypted part.
- (efh_multipart_signed): with unsupported signature format, format
- as multipart/mixed, not as an attachment.
- (efh_multipart_signed): make the smime stuff optional.
- (efh_multipart_signed, efh_multipart_encrypted): Moved to
- em-format.c.
- (efh_application_xpkcs7mime): moved to em-format.c
- (efh_output_secure): renamed to efh_format_secure, linked into
- virtual method. call parent class to do the validation foo then
- output the info if needed.
- (efh_format_message): fixed access to validity stuff to parent
- object.
- (efh_class_init): hook up format_secure virtual method.
- (*): removed some now-unused headers.
-
-2004-01-29 Nicel KM <mnicel@novell.com>
-
- * mail-component.c: removed CAMEL_PROVIDER_IS_EXTERNAL check
- * mail-account-gui.c: likewise
- * mail-offline-handler.c: likewise
-
-2004-01-29 Not Zed <NotZed@Ximian.com>
-
- * em-format-html-display.c (efhd_attachment_button): check the
- snooped type for the icon/etc.
- (efhd_format_attachment): save the snooped type in the
- attach_puri.
-
- * em-format-html.c (efh_text_plain): If we had a snooped type, use
- that as the base type, rather than octet-stream, which will cause
- an attachment in attachment loop.
-
- * em-format.c (em_format_part_as): save the current snooped mime
- type in a stack if we had any.
-
-2004-01-29 Not Zed <NotZed@Ximian.com>
-
- ** See bug #53320 and probably others
-
- * message-list.c (message_list_set_folder): NULL out
- message_list->folder when we clear it so it isn't left for another
- free when we switch again.
-
-2004-01-29 Not Zed <NotZed@Ximian.com>
-
- ** See bug #52190.
-
- * message-list.c: Added folder/folder uri to the data stored for
- primary/secondary selection, uses a struct to store the data now.
- This is needed so when you cut/copy messages, and paste them, it
- doesn't end up 'pasting' the messages from the current folder, but
- from the one where the copy/cut took place.
- (clear_selection): helper to free data inside selection struct.
-
-2004-01-29 Not Zed <NotZed@Ximian.com>
-
- ** See bug #53506.
-
- * mail-tools.c (mail_tools_folder_to_url): use a camelurl to do
- this properly, and handle fragment folder-paths.
-
- * em-composer-utils.c (em_utils_composer_send_cb): removed
- outbox_folder local, not necessary.
-
-2004-01-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree-model.c (em_folder_tree_model_add_store): If the
- store is already in the model, remove it and then re-add it. Fixes
- bug #53422.
-
-2004-01-28 Jeffrey Stedfast <fejj@ximian.com>
-
- And thus completes the fixes for bug #52766.
-
- * em-folder-tree.c (tree_drag_drop): Don't call
- gtk_drag_get_data() manually here or we end up getting 2
- drag-data-received callbacks which is Not Good (tm).
-
- * em-folder-tree-model.c (drop_folder): Now takes a moved argument
- to specify whether or not the contents were moved (the move
- argument is just a hint).
- (drop_uid_list): Same.
- (em_folder_tree_model_drag_data_received): Updated for the above
- api changes.
-
-2004-01-28 Not Zed <NotZed@Ximian.com>
-
- ** See bug #53179
-
- * mail-tools.c (mail_tool_get_local_movemail_path): Fix the
- movemail path.
-
- * mail-component.c (load_accounts): hack alert!
- * mail-send-recv.c (get_receive_type): hack alert! hardcode mbox:
- to be a movemail source.
-
-2004-01-28 Not Zed <NotZed@Ximian.com>
-
- * mail-send-recv.c (setup_send_data): ref folder from
- mail_component_get_folder.
-
- * mail-ops.c (fetch_mail_fetch): ref the folder we get from
- mail_component_get_folder since it doesn't ref it.
-
-2004-01-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-migrate.c (cp): Removed unneeded debug printfs.
-
- * em-folder-tree.c (tree_drag_data_received): Use
- gtk_tree_view_get_dest_row_at_pos() instead of
- gtk_tree_view_get_path_at_pos() since this is what Nautilus
- uses. Unfortunately, it still gives us back the wrong GtkTreePath
- so it looks to me like Gtk+ is borked. Apparently you need the
- latest and greatest gtk+-2.3.x cvs snapshot for this to work.
-
- * em-migrate.c (em_migrate_imap_caches_1_4): Copy the imap cache
- into the right place. Duh.
-
-2004-01-27 Not Zed <NotZed@Ximian.com>
-
- ** See bug #53084 and others.
-
- * em-migrate.c (em_migrate): remove the vfolder_revert hack.
-
- * em-composer-utils.c (ask_confirm_for_only_bcc): removed unused
- vars.
-
- * mail-tools.c (mail_tool_get_local_inbox): removed, handled by
- mail_component_get_folder now.
-
- * mail-component.c (mail_component_*): Changed the api slightly.
- Using NULL as the component argument automatically implies you
- want the default component.
- (em_uri_from_camel, em_uri_to_camel): moved to em-utils.[ch]. Ok
- so it isn't namespaced right ... *shrug*.
- (mail_component_get_local_inbox): removed.
- (mail_component_get_folder): single entry point for getting
- standard folders. This is MT-Safe.
- (mail_component_get_folder_uri): single entry point for getting
- standard folder uri's. This is MT-Safe.
- (add_store): removed, moved to mail_component_add_store.
- (mail_component_load_store_by_uri): call mail_component_add_store
- directly rather than copying its code.
- (default_*_folder*): Removed, use accessor methods instead, fixed
- all callers.
- (setup_local_store): renamed to mc_setup_local_store, use proper
- url encoding too. make run-once and thread-safe.
- (MailComponentPrivate): Added a lock.
- (mail_control_new): exported properly to kill warnings.
- (mail_component_init): dont setup_local_store or add accounts
- here.
- (impl_createControls): setup local store/accounts here.
- (mail_component_peek): dont setup vfolder storage here.
- (mc_startup): internal function to startup stuff needed for gui
- operation.
- (setup_search_context): make run-once.
- (mail_component_peek_search_context): call setup_search_context
- incase it isn't setup yet.
- (impl_upgradeFromVersion): remove the local store setup hack.
-
-2004-01-27 Not Zed <NotZed@Ximian.com>
-
- * em-folder-tree-model.c (folder_renamed): fix the parent-finding
- logic.
-
-2004-01-23 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (mail_component_init): add the offline handler
- interface to the component.
- (store_go_online, go_online): removed, handled by the offline
- handler.
-
- * mail-offline-handler.c (store_go_online): add the store to the
- tree model when we go online.
-
-2004-01-26 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes for bug #53251.
-
- * mail-account-gui.c (mail_account_gui_new): Convert the account
- drafts/sent folder uris to camel uris.
- (mail_account_gui_save): Convert drafts/sent camel uris into
- mailer uris when setting them on the account. Also, don't compare
- against file: anymore since those uris don't exist anymore.
-
- * em-migrate.c (em_upgrade_accounts_1_4): Update the drafts/sent
- folder uris.
-
-2004-01-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (tree_drag_begin): Set priv->drag_row.
-
-2004-01-26 Aaron Weber <aaron@ximian.com>
-
- * mail/default/C/Inbox: edited default message
-
-2004-01-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (emft_copy_folders__copy): Use FOLDER_INFO_FAST
- bitflag here, since we don't care about unread counts when copying
- folders around.
- (emft_popup_delete_folders): Same.
- (emft_tree_row_expanded): Don't use FOLDER_INFO_FAST here.
-
-2004-01-26 Radek Doulik <rodo@ximian.com>
-
- * mail-session.c (main_get_filter_driver): translate DEMAND to
- INCOMING to get the right rules
-
- * mail-ops.c (mail_filter_on_demand): use FILTER_SOURCE_DEMAND
-
- Fixes #53266
-
-2004-01-25 Rodney Dawes <dobey@ximian.com>
-
- * em-folder-selector.c (em_folder_selector_create_new): Cast the
- name entry to a GtkWidget to avoid a compiler warning
- * em-folder-tree.c (emft_popup_new_folder): Grab focus on the name
- entry when we show the dialog (#53089)
-
- Fixes #53089
-
-2004-01-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree-model.c (em_folder_tree_model_get_type): Removed
- the drag & drop interfaces, apparently these aren't good enough
- for what we need. Gotta implement this all the Hard Way (tm).
- (em_folder_tree_model_drag_data_received): Helper function called
- by the drag_data_received signal callback in em-folder-tree.c
- (em_folder_tree_model_row_drop_possible): Same idea.
- (em_folder_tree_model_row_drop_target): Again.
- (em_folder_tree_model_row_draggable): You get the idea...
- (em_folder_tree_model_drag_data_get): And again.
- (em_folder_tree_model_drag_data_delete): Same.
- (em_folder_tree_model_set_drag_drop_types): Setup the drag & drop
- types on the widget (since the target drag & drop types are now
- internal to the model code rathr than the tree code).
-
- * em-folder-tree.c (em_folder_tree_enable_drag_and_drop):
- Rewritten. Connect to all the drag & drop signals and implemnent
- them.
-
-2004-01-23 Larry Ewing <lewing@ximian.com>
-
- * mail-component-factory.c (factory): add the control id to the
- factory.
-
-2004-01-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-migrate.c (upgrade_xml_uris_1_4): Handle where the file: url
- is roken (ie, points to a location out of the evolution
- namespace).
-
-2004-01-23 Rodney Dawes <dobey@ximian.com>
-
- * em-folder-selector.c: Set the mnemonic widget for "Folder _name:"
-
- Fixes #53088
-
-2004-01-23 Radek Doulik <rodo@ximian.com>
-
- * em-junk-filter.c: use mail_session_get_sa_daemon_port
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): added
- check_incoming_imap
- (em_mailer_prefs_apply): ditto
- (settings_changed): set check_incoming_imap sensitivity by
- check_incoming state
-
- * mail-session.c: add sa_daemon_port
- (mail_session_init): init sa_daemon_port and check_junk_for_imap
- (mail_session_check_junk_notify): watch for sa_daemon_port and
- check_junk_for_imap
- (mail_session_get_sa_daemon_port): new wrapper
- (mail_session_set_sa_daemon_port): ditto
-
-2004-01-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-junk-filter.c (em_junk_sa_test_spamd): Oops, when calling
- spamassassin rather than spamc, we need to invoke /bin/sh -c
- since spamassassin is a shell script.
- (em_junk_sa_check_junk): Same.
-
- Fixes bug #53175.
-
- * em-junk-filter.c (pipe_to_sa): Don't need an argc (we don't even
- seem to use it??).
- (em_junk_sa_test_spamd_running): Don't invoke /bin/sh.
- (em_junk_sa_test_spamd): Simplified, also don't invoke /bin/sh.
- (em_junk_sa_check_junk): Cleaned up/simplified. Also don't invoke
- /bin/sh.
- (em_junk_sa_report_junk): Same.
- (em_junk_sa_report_notjunk): Same.
- (em_junk_sa_commit_reports): Same.
-
-2004-01-22 Gary Ekker <gekker@novell.com>
-
- ** See bug #53051
-
- * em-subscribe-editor.c (subscribe_set_store): fix typo in label
-
-2004-01-22 Radek Doulik <rodo@ximian.com>
-
- * em-junk-filter.c (em_junk_sa_test_spamd): uncomment system wide
- spamd test
-
-2004-01-20 Radek Doulik <rodo@ximian.com>
-
- * em-junk-filter.c: lock report calls by em_junk_sa_report_lock
- mutex
-
-2004-01-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-migrate.c (em_migrate_1_4): Migrate the ETree expanded state
- files as well as the GalView files.
-
- * message-list.c: s/hide_save_state/save_hide_state/g and
- s/hide_load_state/load_hide_state/g to be more consistant with the
- other state saving function names.
-
-2004-01-21 Not Zed <NotZed@Ximian.com>
-
- * em-migrate.c (cp_r): use camel_mkdir(0777) rather than 0777 &
- st.st_mode which isn't set anyway.
- (cp): use simple 0666 for the mode open, and then chmod after.
- (cp): check the return code of close, not just fsync.
- (cp): dont use fd[0] and fd[1] when we really just want simple
- variables, rename to readfd and writefd.
-
- ** See bug #53159.
-
- * em-format.c (emf_message_rfc822): removed incorrect comment,
- this is not a fallback.
-
- * em-format-html.c (efh_text_plain): check the content-type of the
- containee object, not the holder.
-
- ** See bug #52979.
-
- * em-format-html.c: take out text/x-patch and put in text/* for a
- text/plain fallback handler instead.
-
- * em-format-html-display.c (efhd_find_handler): allow the bonobo
- handlers to override the builtin ones.
-
-2004-01-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-migrate.c (em_migrate_imap_caches_1_4): New function to
- migrate the imap cache.
- (em_migrate_1_4): Migrate the IMAP cache. Fixes bug #52985.
- (em_migrate_1_4): Copy over the searches.xml file. Fixes bug
- #52980.
-
- * mail-session.c (request_password): Changed the logic of the
- visibility of the passwd text so that we hid ethe passwd if the
- flags have the SECRET bit set.
-
-2004-01-20 Not Zed <NotZed@Ximian.com>
-
- ** See Bug #52817.
-
- * mail-session.c (request_password, do_get_pass, get_password):
- Fix for api changes to camel_session_get_password.
- (request_password): if we have a STATIC password, don't show any
- 'remember' checkbox.
-
-2004-01-20 Not Zed <NotZed@Ximian.com>
-
- * em-folder-view.c (EMFolderView): Make displayed_uid public.
-
- * em-folder-browser.c (em_folder_browser_show_preview): use
- em_folder_view_set_message rather than message_list_select_uid.
- When clearing, clear view->displayed_uid too.
-
-2004-01-20 Not Zed <NotZed@Ximian.com>
-
- ** See bug #52965.
-
- * mail-component.c (mail_component_init): removed an epfixme, it
- already is an object.
- (impl_upgradeFromVersion): call mail_note_store after running the
- upgrade for local folders.
-
- * em-migrate.c (em_migrate): revert the vfolders.xml after we've
- imported them.
-
- * mail-vfolder.c (vfolder_revert): new api to re-load the vfolders
- file.
-
- ** See bug #52885.
-
- * em-folder-browser.c (emfb_create_view_menus): unref the view
- instance/menu's rather than asserting, if they exist.
- (emfb_set_folder): call create_view_menu's rather than
- create_view_instance, so the view menu's are properly setup.
- (emfb_set_folder): call superclass first.
-
- ** See bug #53028.
-
- * message-list.c (on_selection_changed_cmd): emit the
- cursor_activated if more than 1 item is selected also.
-
-2004-01-20 Not Zed <NotZed@Ximian.com>
-
- ** See bug #52990.
-
- * mail-component.c (mail_component_init): re-enable auto-send-recv
- setup.
-
- ** See bug #52989.
-
- * message-list.c (hide_load_state): clear the hidden table if
- setup, before loading.
-
-2004-01-19 Radek Doulik <rodo@ximian.com>
-
- * mail-config.c (MAIL_CONFIG_RC_DIR): path to gtkhtml's rc file
- (config_write_style): use MAIL_CONFIG_RC_DIR
- (mail_config_init): ditto
-
- * see http://bugzilla.ximian.com/show_bug.cgi?id=52969
-
-2004-01-19 Not Zed <NotZed@Ximian.com>
-
- * mail-ops.c (add_vjunk_info, add_vtrash_info): removed this like
- i asked radek to ages ago, just call the parent directly.
- (add_vtrash_or_vjunk_info): renamed to something saner.
- add_special_info.
- (add_special_info): removed the 'unread count' parameter & return
- the added info.
-
- ** See bug #52854.
-
- * em-folder-tree.c (emft_tree_button_press): setup a FOLDER target
- for the popup menu.
-
- * em-popup.c (em_popup_target_free): implement free for
- TARGET_FOLDER, changed the target options somewhat.
- (em_popup_target_new_folder): implement folder selection target.
- Total Hack(tm) alert.
- (emp_standard_menu_factory): removed the stupid
- g_assert_if_not_reached() call.
-
- * message-list.c (message_list_destroy): NULL out the uid_nodemap
- when we destroy it.
-
-2004-01-19 Not Zed <NotZed@Ximian.com>
-
- * em-folder-browser.c (emfb_folder_expunge): get the toplevel
- widget here too, similar to bug 52161.
-
- ** See bug #52956
-
- * em-composer-prefs.c (sig_edit_cb): The
- fileentry_add_script_script widget is a GnomeFileEntry not a
- GtkEntry.
- (sig_add_script_response): use get_full_path rather than snooping
- the gtkentry. Also, don't close/quit the script dialogue on a bad
- name.
-
-2004-01-19 Not Zed <NotZed@Ximian.com>
-
- * em-migrate.c (em_upgrade_pop_uid_caches_1_4): if we can't open
- the pop3 cache dir, because it doesn't exist, it is not an error.
-
- ** See bug #52983.
-
- * mail-component.c (em_uri_from_camel, em_uri_to_camel): Handle
- vfolder: uri's properly. And make sure local uri's are properly
- encoded.
- (mail_component_get_folder_from_evomail_uri)
- (mail_component_evomail_uri_from_folder): removed, no longer used.
- (em_uri_from_camel): don't leak the camelurl.
- (d): disable debug
-
- * mail-vfolder.c (vfolder_load_storage): move the vfolder storage
- location to ~/.evolution/mail/vfolder rather than
- ~/.evolution/mail (this is currently unused anyway).
- (uri_is_ignore): short-circuit exit if we find a match.
- (mail_vfolder_add_uri): dont exit immediately if we have a vfolder
- uri, but don't add it to local/remove either.
- (mail_vfolder_delete_uri): remove any uri from the local/remote
- source list while we're at it.
-
-2004-01-19 Not Zed <NotZed@Ximian.com>
-
- * em-folder-view.c (emfv_on_url_cb): properly decode the mailto
- url rather than treating it as a simple string.
-
- * em-format-html.c (efh_format_address): if we have a name part,
- add it to the mailto part. As per rfc2368. So it isn't lost for
- clicking/etc.
-
-2004-01-16 JP Rosevear <jpr@ximian.com>
-
- * em-format-html-display.c (efhd_bonobo_object): pass in an
- exception to use
-
-2004-01-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-format-html.c (efh_format_address): Dump a struct
- _camel_header_address to an html string.
- (efh_format_header): Use efh_format_address() and set the
- EM_FORMAT_HTML_HEADER_HTML bit on the flags so we don't re-convert
- our html string into html.
-
- * mail-vfolder.c (mail_vfolder_rename_uri): s/g_fre/g_free/
-
- * em-utils.c (guess_account): Change 'tmp' to not be const - fixes
- a compile warning.
- (em_utils_expunge_folder): Cast parent to a GtkWindow.
- (em_utils_empty_trash): Same.
-
- * em-migrate.c (cp): Oops, still need to stat() the src file so we
- can report what percentage of the file has been completed so far
- and also so we don't quit copying until we've copied the whole
- file.
-
- * message-list.c (message_list_set_folder): Move
- 'message_list->folder = folder;' out of the uri compare if-block
- and move it into the if-block that tests that folder != NULL.
- (regen_list_regen): Abort if the regen folder is not the same as
- the ml->folder.
-
-2004-01-16 Not Zed <NotZed@Ximian.com>
-
- * mail-folder-cache.c (storeinfo_find_folder_info): change this to
- check the store using the provider url_cmp and just lookup the
- folder name directly. folder_compare can't be used for uri's,
- this stuff was so broken, my fault :(
-
- ** See bug #52467.
-
- * em-folder-tree-model.c (sort_cb): handle null path (root?).
-
- * mail-vfolder.c (mail_vfolder_add_uri): map uri to euri before
- processing.
- (rule_changed): map uri to camel uri before looking up.
- (mail_vfolder_delete_uri): handle as euri internally.
- (mail_vfolder_rename_uri): "
-
- * mail-autofilter.c (vfolder_rule_from_message): map camel uri to
- euri before setting as vfolder source.
-
-2004-01-16 Not Zed <NotZed@Ximian.com>
-
- * default/C/Inbox:
- * default/C/Makefile.am:
- * default/Makefile.am: Startup files/folders.
-
- * em-migrate.c (emm_setup_initial): initial implementation of
- startup setup.
-
- ** See bug #52896.
-
- * em-format-html-display.c (efhd_html_button_press_event): do this
- based on get_object_at rather than get_point_at, so we get the
- offset properly.
-
-2004-01-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-vfolder.c: Make vfolder_store 'global'.
-
- * em-folder-tree-model.c (sort_cb): Fix bug #12600 by not sorting
- VFolders (ie. show them in the same order they appear in the
- editor).
-
- Fixes bug #52888
-
- * em-folder-tree-model.c (sort_cb): New sort function for the
- folder-tree.
- (em_folder_tree_model_init): Set the default sort func.
- (em_folder_tree_model_new): Set the default sort column.
-
- * em-folder-browser.c (emfb_list_built): Don't select the first
- unread mesg in the case where no mesg was previously
- selected. Fixes bug #52887 until we are able to add a user
- preference (for 2.2?).
-
- * em-migrate.c (cp): Only abort the copy if the dest folder both
- exists and contains data. Fixes bug #52880.
- (em_migrate): Abort if config.xmldb cannot be loaded. Fixes bug
- #52886.
-
-2004-01-15 Rodrigo Moya <rodrigo@ximian.com>
-
- * em-folder-browser.c: removed ForgetPasswords verb.
- (emfb_forget_passwords): removed.
-
-2004-01-15 Not Zed <NotZed@Ximian.com>
-
- ** See bug #52891.
-
- * em-format-html.c (em_format_html_get_type): protect against http
- cache not being able to be created.
-
- ** See bug #52878.
-
- * em-folder-view.c (emfv_finalise): unhook message_changed too.
- (emfv_set_folder): hook/unhook message_changed too.
- (emfv_message_changed): implement, proxy to folder_changed.
-
-2004-01-15 Not Zed <NotZed@Ximian.com>
-
- ** See bugs #51609 and #43515.
-
- * em-format-html-display.c (efhd_format_prefix): output flag for
- followup details above the message.
- (efhd_write_image): added to output icon data.
-
- * em-format-html.c (efh_format_do): call format_prefix before
- outputting the message in normal display mode.
-
- * em-format.c (emf_format_prefix): method called to format data
- before the first message output. Default impl == noop.
-
-2004-01-14 Jeremy Katz <katzj@redhat.com>
-
- * evolution-mail.schemas.in.in: Add a description for
- /apps/evolution/mail/junk/sa/local_only.
-
-2004-01-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-migrate.c: Split out the remapping code into
- e-util/e-bconf-map.[c,h] to be shared among components.
-
-2004-01-13 Ross Burton <ross@burtonini.com>
-
- * em-folder-browser.c (emfb_empty_trash):
- Pass the parent window, fixing a crasher. Bug #52161.
-
-2004-01-14 Not Zed <NotZed@Ximian.com>
-
- ** See bug 51660.
-
- * em-format-html-quote.c (efhq_multipart_related): setup part_id
- appropriately.
-
- * em-format-html-display.c (efhd_output_secure): use part_id in
- classid, and add .signed to part_id for subpart.
- (efhd_bonobo_unknown): use part_id in classid.
- (efhd_format_attachment): use part_id in classid's.
-
- * em-format-html.c (efh_multipart_related)
- (emfh_multipart_related_check): setup part_id for each subpart.
- (efh_output_secure): as above, and use the part_id for the
- classid.
- (em_format_html_add_pobject): use part_id for a generated classid.
- (efh_text_plain): setup pseudo-parts into part_id.
-
- * em-format.c (emf_format_clone): setup the part_id base, folder +
- uid.
- (emf_finalise): free the part_id gstring.
- (emf_init): allocate the part_id gstring.
- (em_format_add_puri): build the cid from the part_id rather than
- an arbitrary number, so it is more persistent. Also save the
- part_id in the puri for multipart/related use.
- (emf_multipart_mixed, emf_multipart_alternative)
- (emf_multipart_appledouble, emf_multipart_encrypted)
- (emf_multipart_related, emf_multipart_signed): Set the part_id for
- each subpart.
- (emf_clear_puri_node): free part_id.
-
-2004-01-13 Not Zed <NotZed@Ximian.com>
-
- ** See bug 51660.
-
- * em-format-html-print.c (em_format_html_print_print): dont take
- message, get the message from the source formatter.
-
- * em-format.c (emf_format_clone): Added folder and uid parameters,
- changed camelmedium to a mimemessage.
-
- * em-format-html-display.c (efhd_attachment_button): check the
- icon image cache and if the image is there use it.
-
- * em-icon-stream.c (em_icon_stream_get_image): api to lookup
- finished images in cache.
- (em_icon_stream_new): add a cache key arg.
- (emis_sync_close): store the image in the cache once its
- completed.
-
-2004-01-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-migrate.c (em_migrate): Handle upgrading from 1.0.x and 1.2.x
- (code basically moved verbatim from e_config_upgrade).
-
- * mail-component.c (impl_upgradeFromVersion): Move all the
- major/minor/revision logic into em_migrate().
-
-2004-01-12 Meilof Veeningen <meilof@wanadoo.nl>
-
- * em-composer-utils.c: support for posting both to mail and to
- (multiple) folders
-
- * em-folder-browser.c: use em_utils_post_to_folder (works with NNTP)
-
- * em-folder-selection-button.[ch]: added multiple selection mode
-
- * em-folder-selector.[ch]: idem
-
- * em-folder-tree.[ch]: added multiple selection mode, no longer show
- disabled accounts
-
- * em-utils.c: various changes to allow posting to (multiple) folders
-
- * em-subscribe-editor.c: double-clicking a node in the editor updates
- it directly
-
- * mail-ops.c: for appending messages, set the "X-Mailer" header
-
-2004-01-12 Radek Doulik <rodo@ximian.com>
-
- * em-junk-filter.c (em_junk_sa_check_junk): use
- mail_session_get_sa_use_daemon
-
- * mail-session.c: added SA prefs
- (mail_session_get_sa_local_only): new helper method
- (mail_session_set_sa_local_only): ditto
- (mail_session_get_sa_use_daemon): ditto
- (mail_session_set_sa_use_daemon): ditto
- (mail_session_check_junk_notify): fix the key comparison
- (mail_session_init): add gconf dir so that we get notified
-
- * mail-config.glade: added SA preferences
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): added more junk
- prefs
- (em_mailer_prefs_apply): ditto
-
- * em-junk-filter.c: use preferences
-
-2004-01-12 Larry Ewing <lewing@ximian.com>
-
- * GNOME_Evolution_Mail.server.in.in: fix up the controls factory
- location.
-
- * mail-component.c (mail_control_new): add new interface for
- getting a mail control with a folder_uri property bag.
- (get_prop): pbag get method.
- (set_prop): pbag set method.
-
-2004-01-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-migrate.c (cp): Don't O_TRUNC the dest file, instead use
- O_EXCL and don't do anything if the dest file already exists (this
- way we don't re-migrate an mbox or corrupt any summary/ibex/meta
- files).
-
-2004-01-12 Not Zed <NotZed@Ximian.com>
-
- ** See bug 52737.
-
- * em-format-html.c (efh_text_plain): treat text/* as inline
- content from the made-up multipart.
-
-2004-01-09 Not Zed <NotZed@Ximian.com>
-
- ** See bug 52696.
-
- * mail-component.c (setup_search_context): move the searches to
- ~/.evolution/mail/searches.xml (migration?).
- (setup_search_context): fix a merge error,
- vfoldertypes.xml->searchtypes.xml since it includes the system
- searches now.
-
-2004-01-09 Not Zed <NotZed@Ximian.com>
-
- * em-folder-tree.c (emft_popup_properties_got_folder): add total +
- unread counts to properties page.
-
- * em-utils.c (filter_editor_response):
- * mail-vfolder.c (vfolder_editor_response): change for rule editor
- changes, ACCEPT->OK.
-
-2004-01-09 Not Zed <NotZed@Ximian.com>
-
- * em-format.c (em_format_format_text): keep the windows charset
- filter around until we're done since if we set it up we reference
- its memory. Causes warnings and breaks message display.
-
- ** See bug #52637.
-
- * em-inline-filter.c (em_inline_filter_new): added a content-type
- paramter for the base content type.
- (em_inline_filter_finalize): free base content type.
- (emif_types[]): Added 'plain' parameter, indicates type needs
- plain parameters set on content type.
- (emif_add_part): inherit the full base type if it is set, for
- plain parts.
-
- * em-format-html.c (efh_text_plain): pass the part's content-type
- to the inline filter.
-
-2004-01-08 Not Zed <NotZed@Ximian.com>
-
- ** See bug #50786
-
- * GNOME_Evolution_Mail.server.in.in: Remove :: from startup wizard
- iid, and put the mail wizard into the right factory.
-
- * mail-component.c (impl_requestCreateItem, impl_handleURI):
- * em-folder-browser.c (emfb_mail_compose): check we have an
- account before trying to send mail.
-
-2004-01-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-component.c (mail_component_init): Don't migrate stuff here
- anymore.
-
- * mail-ops.c (uid_cachename_hack): Removed a hack that checked for
- the really old uid cache location and make the uid cache live in a
- better location (why have mail/pop/<account> and
- mail/pop3/cache-<account>? simply put the cache file in
- mail/pop/<account>/uid-cache).
-
- * em-migrate.c (em_migrate_dir): When copying over mbox folders,
- don't abort if we fail to copy over a summary file (big
- whoop). Also, if indexing was turned on in the evolution 1.4
- version of the folder, turn on indexing for that folder in the
- migrated mbox folder as well.
- (em_migrate_pop_uid_caches): Migrate the pop3 uid-cache
- files. Fixes bug #52464.
- (em_migrate): Call em_migrate_pop_uid_caches().
-
- * em-format-html.c (efh_format_address): Removed.
- (efh_format_header): Handle address formatting a little
- differently to address dwmw's complaints. Also now handles other
- headers such as Resent-* and Sender as well.
-
-2004-01-07 Radek Doulik <rodo@ximian.com>
-
- * em-message-browser.c (emmb_init): as below
-
- * em-folder-browser.c (emfb_init): always show vertical scrollbar,
- we do the same for message list and it avoids ugly flicker
-
-2004-01-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-message-browser.c (emmb_set_message): Protect against a NULL
- message-info. Afaik, this can only happen if the message has since
- been removed? Might be a larger problem here... Anyways, fixes the
- crash in bug #52297.
-
-2004-01-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree-model.c (folder_renamed_cb): Clone the
- CamelRenameInfo and ref the store before emitting the async event.
- (folder_deleted_cb): Same idea but for CamelFolderInfo's.
- (folder_created_cb): Here too.
- (folder_subscribed_cb): Same.
- (folder_unsubscribed_cb): And here.
- (folder_renamed): Split out from folder_rename_cb(), free the
- CamelRenameInfo and unref the store when done.
- (folder_unsubscribed): Same idea.
- (folder_subscribed): Same.
-
-2004-01-05 Radek Doulik <rodo@ximian.com>
-
- * em-junk-filter.c: add NULL at the end of argv for execvp (poited
- out by Frank Solensky, thanks)
-
-2004-01-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-browser.c (emfb_list_message_selected): Check that the
- folder isn't NULL (ie. no folder is selected). Fixes bug #52207.
-
- * message-list.c (message_list_set_folder): Remove the
- cursor-activated idle callback.
-
- * mail-send-recv.c (build_dialog): Set the send/recv dialog to
- non-modal. Fixes bug #50127.
-
- * em-folder-tree-model.c (folder_subscribed_cb): If we aren't in
- the main thread, proxy it over to the main thread.
- (folder_unsubscribed_cb): Same.
- (folder_created_cb): Here too.
- (folder_deleted_cb): And here.
- (folder_renamed_cb): Again here.
-
- * em-folder-view.c (emfv_set_folder_uri): Pass mail_thread_queued
- to mail_get_folder() instead of mail_thread_new so that we
- eliminate a race when switching folders in the UI.
-
-2004-01-05 Not Zed <NotZed@Ximian.com>
-
- ** See bug #50996.
-
- * em-format-html-display.c (efhd_find_handler): implement override
- for unknown types, try bonobo handlers.
- (efhd_bonobo_unknown): formathandler for bonobo objects.
-
- * em-format.c (em_format_find_handler): make virtual, rename to
- emf_find_handler.
-
-2004-01-04 ERDI Gergo <cactus@cactus.rulez.org>
-
- * em-folder-view.c (emfv_on_url_cb): Emit a hover-url signal when
- the user mouses over a URL, ...
- (emfv_hover_url_impl): ... and use BonoboUI to change the status
- bar message...
- (em_folder_view_set_statusbar): ... unless we are asked not to, ...
-
- * mail-component.c (impl_createControls): ... like in the case of
- the mail component, ...
- (view_hover_url_cb): ... that uses the ActivityHandler to do the
- same
-
- Add these together, and #127536 is neatly solved.
-
-2004-01-04 David Woodhouse <dwmw2@infradead.org>
-
- * em-format-html-display.c: Mail warning grammar typo fix.
-
-2003-12-22 David Moore <davmre@bellsouth.net>
-
- * em-popup.c (emp_part_popup_set_background): Implemented; sets an
- image attachment as the GNOME wallpaper.
-
- * em-utils.c (emu_save_part_done): Created a prototype at the top
- of the file.
- (em_utils_save_part_to_file): Added; save a message part to a
- specified file on disk.
-
-2003-12-18 Rodney Dawes <dobey@ximian.com>
-
- * em-message-browser.c (emmb_init): Merge in
- evolution-mail-message-display.xml first, since it is the parent UI
- XML, really fixes bug #49949
-
-2003-12-16 JP Rosevear <jpr@ximian.com>
-
- * em-format-html-display.c: #ifdef out certain code pieces if
- s/mime isn't supported
-
-2003-12-14 JP Rosevear <jpr@ximian.com>
-
- * em-folder-tree.c (emft_tree_row_collapsed): Fix erroneous
- function call
-
- Fixes #52120
-
-2003-12-12 Not Zed <NotZed@Ximian.com>
-
- * mail-config.c (config_write_style): put the style in .evolution.
-
- ** See bug #52023.
-
- * message-list.c (message_list_select_uid): noop if we've been
- destroyed (foldre == NULL).
-
- ** See bug #52108.
-
- * em-format.c (em_format_is_attachment): also recognise
- application/pkcs7-mime for mailers who like to make up their own
- standards.
-
- * em-format-html.c (type_builtin_table[]): *
- em-format-html-display.c (type_builtin_table[]): make recognise
- application/pkcs7-mime too.
-
-2003-12-11 Chris Toshok <toshok@ximian.com>
-
- * Makefile.am (INCLUDES): get the build moving again. add
- CERT_UI_CFLAGS here for the time being.
-
-2003-12-11 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes bug #1717.
-
- * em-folder-browser.c (emfb_list_built): If we have a uid to
- select, select that instead of selecting the first unread.
- (emfb_set_folder): CamelObject::meta_get() actually returns a
- strdup'd buffer, so we need to free it. Get the last selected uid
- and set that up as the uid to select when the message-list
- finishes building.
- (emfb_list_message_selected): Save the selected uid.
- (emfb_init): Connect to the message-list's message_selected signal
- so that we can save selected state (don't want to do this in
- EMFolderView or MessageList because we don't want the state to be
- saved for the EMMessageBrowser).
-
-2003-12-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c: Shorten the namespace of some internal
- functions to just emft.
- (emft_popup_delete_rec): Don't delete the contents of a folder if
- it is a vFolder. Fixes bug #52029.
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): Use newv() here
- and pass an array of GTypes - makes it simpler to change the order
- of columns later and/or add new columns if we need to. Also makes
- the line shorter :-)
-
-2003-12-11 Grahame Bowland <grahame@angrygoats.net>
-
- * em-format-html.c (efh_format_header): display
- x-evolution-mailer pseudo header irrespective of
- xmailer_mask. This is now handled by a header
- configuration dialog.
-
- * mail-config.glade: add tab to mail configuration
- dialog to allow custom headers to be specified for
- display.
-
- * em-mailer-prefs.h: modify struct _EMMailerPrefs to
- add widgets for custom header tab. Add defines for custom
- header flags. Add struct EMMailerCustomHeader to describe
- custom headers, and add function
- em_mailer_custom_headers_from_xml to allow XML from gconf
- key to be parsed into this structure.
-
- * em-folder-view.c (emfv_setting_notify): catch changes to
- custom header gconf key and update mail view to correspond
-
- * em-mailer-prefs.c (em_mailer_prefs_apply): save custom
- headers to gconf
- (header_list_enabled_toggled): toggle clicked toggle column
- (add_header): add header to custom header list if valid
- (remove_header): remove selected custom header
- (is_valid_header): return true if passed header is valid,
- otherwise false
- (entry_header_changed): call add_header_update_sensitivity
- (em_mailer_prefs_construct): initialise header selection tab.
- Load gconf data for header selection dialog.
- (em_mailer_custom_header_to_xml): load a header structure
- from XML document structure
- (em_mailer_custom_header_from_xml): load a header
- structure from a string containing valid XML. if any failure,
- the header.name is set to NULL.
- (header_list_row_selected): call
- remove_header_update_sensitivity
- (remove_header_update_sensitivity): set the sensitivity of
- the remove button to FALSE if the list is empty or nothing
- is selected. Otherwise, set it to TRUE.
- (add_header_update_sensitivity): set the sensitivity of the
- the add button to FALSE if the entry box is empty, contains
- a duplicate header, or contains an invalid header. Otherwise,
- set it to TRUE.
-
- * evolution-mail.schemas.in.in: add mail/display/headers
-
-2003-12-10 Larry Ewing <lewing@ximian.com>
-
- * em-format-html.c: add text/x-patch as a plain type.
- (efh_text_enriched): add table around the enriched part so it
- matches html and text modes.
-
-2003-12-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-migrate.c (em_migrate_dir): Modified to simply copy mbox
- files from one place to another (and the summary files) rather
- than going thru camel so as to bypass the need for parsing MIME.
-
-2003-12-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-migrate.c (get_local_store): Fixed a leak.
-
- * mail-component.c (impl_upgradeFromVersion): Implemented.
-
- * em-folder-tree.c (em_folder_tree_set_selected): Add INFO_FAST
- here as we don't need it to get unread counts.
- (tree_row_expanded): Here too.
-
- * em-folder-tree-model.c (em_folder_tree_model_set_folder_info):
- Check CAMEL_FOLDER_NOCHILDREN.
-
-2003-12-10 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes bug #51045
-
- * mail-folder-cache.c (real_flush_updates): Update the unread
- count in the model if the folder got new mail.
-
- * em-folder-selection.c (em_select_folder): Updated.
-
- * em-folder-selection-button.c
- (em_folder_selection_button_clicked): Updated.
-
- * em-folder-tree-model.c (em_folder_tree_model_set_unread_count):
- New function to update the unread count for a folder.
-
- * mail-component.c (mail_component_peek_tree_model): Don't ref the
- model. Also renamed s/get/peek/
-
-2003-12-10 Not Zed <NotZed@Ximian.com>
-
- * em-folder-tree.c (em_folder_tree_get_folder_info__got): check
- m->fi != NULL before dereferencing it.
-
-2003-12-10 Not Zed <NotZed@Ximian.com>
-
- * em-format-html-display.c (efhd_multipart_signed):
- * em-format-html.c (efh_multipart_signed):
- * em-format.c (emf_multipart_signed): treat
- application/pkcs7-signature as application/x-pkcs-signature.
- Stupud non-rfc-compliant mailers from apple. Bug #51750.
-
- * em-folder-selection.c (em_select_folder): rewritten to get rid
- of hte old crap that should've been gotten rid of before. Bug
- #51602.
- (em_folder_selection_run_dialog_uri): removed.
- (em_folder_selection_run_dialog): removed. this file is gutted
- and should probably be removed.
-
- * em-folder-selector.h: use a POSITIVE value for the response
- value, gtk uses -ative ones. Bug #51752.
-
- * Makefile.am (INCLUDES): added smime/lib and smime/gui to
- includes.
-
- * em-folder-tree.c (emft_popup_rename_folder): removed unused 'why',
- why not?
-
- * em-format-html-display.c (efhd_xpkcs7mime_validity_clicked):
- setup a table of buttons to view any certs we have.
-
- * em-folder-browser.c (emfb_activate): separeate view_menu
- unreffing from view_instance. fixes a runtime warning.
-
- ** See bug #51718.
-
- * mail-component.c (em_uri_to_camel): handle an e-uri which has an
- account uid which isn't in user@host format.
-
-2003-12-09 Not Zed <NotZed@Ximian.com>
-
- ** See bug #51899.
-
- * em-folder-tree-model.c (em_folder_tree_model_set_folder_info):
- CAMEL_FOLDER_CHILDREN is only advisory, some servers don't give it
- to you.
-
-2003-12-06 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: Remove hard coded disable deprecated flags
-
-2003-12-05 Rodney Dawes <dobey@ximian.com>
-
- * em-folder-tree.c (render_display_name): Remove the extra || unread
- check in the conditional in the g_object_set () call
-
-2003-12-05 Rodney Dawes <dobey@ximian.com>
-
- Fixes bug #51482
-
- * em-folder-tree.c (render_display_name): Don't hardcode colors
- for the folder tree, instead use bold for unread, as in 1.4
-
-2003-12-05 Radek Doulik <rodo@ximian.com>
-
- * em-html-stream.c (emhs_sync_flush): use new gtk_html_flush
- method instead of forcing processing of all gtk events
-
-2003-12-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree-model.c (em_folder_tree_model_remove_folders):
- Make sure folder_path is non-NULL ("Loading..." nodes will have a
- NULL path). Fixes bug #51731.
-
-2003-12-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (empty_trash_empty): Get the proper local folders
- store uri (it's not file:/ anymore). Fixes bug #51618.
-
-2003-12-04 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes bug #51605.
-
- * em-folder-selector.c (emfs_response): Handle creating a new
- folder (pop up a create-folder-selector dialog).
-
- * em-folder-tree.c (emft_popup_new_folder_response): Moved all the
- logic into em_folder_tree_create_folder().
- (em_folder_tree_create_folder): New function to create a folder.
-
-2003-12-04 Radek Doulik <rodo@ximian.com>
-
- * em-junk-filter.c (pipe_to_sa): add new err_retval parameter,
- which specifies which value to return if something went wrong
- (like failed to exec, ...). update all calls by that. actual junk
- check has err_retval = 0 to avoid marking false spam - non-zero
- retval means junk.
-
- * em-folder-view.c: set junk toolbar buttons pixmaps
-
- * mail-session.c: monitor gconf key
- /apps/evolution/mail/junk/check_incoming and keep session junk
- flag uptodate
-
- * em-mailer-prefs.c (em_mailer_prefs_construct): added junk
- preferences
-
-2003-12-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (uri_to_evname): Updated to add use mail subdirs.
- (mail_config_uri_renamed): Updated cachenames[]
- (mail_config_folder_to_cachename): Fixed to use the correct path.
-
- * em-folder-browser.c (emfb_create_view_menus): Updated the
- galview path to point to the evo-1.5 location.
- (emfb_set_folder): Update the galview view_instance.
- (emfb_create_view_instance): Split out from
- emfb_create_view_menus()
- (emfb_create_view_menus): Reduced code, call
- emfb_create_view_instance().
-
- * em-folder-selector.c (emfs_create_name_activate): Emit the OK
- response, not the CREATE_NEW response. Also,
- g_signal_emit_by_name() does not take a GQuark detail argument, so
- don't pass one. Fixes bug #51661.
-
-2003-12-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-view.c (emfv_set_folder): Sync the folder before
- replacing it with the new folder.
-
- * em-folder-tree.c (em_folder_tree_set_selected): Need to prepend
- a "/" to path if the path is the url fragment. Also fixed to
- select the store node if path == "/".
- (emft_popup_rename_folder): Set oldpath and newpath to the proper
- values. Fixes bug #51656.
-
- * em-folder-selector.c (em_folder_selector_get_selected_uri):
- Fixed a FIXME by using the CamelProvider url flags to determine if
- the url used url->fragment or url->path as the folder path.
- (em_folder_selector_get_selected_path): Don't allow path strings
- to start with "//".
-
-2003-12-03 JP Rosevear <jpr@ximian.com>
-
- * em-folder-tree.c (em_folder_tree_destroy): remove the source
- before saving
-
-2003-12-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (em_folder_tree_save_state): Set the
- save_state_id to 0 or we will never get a chance to run again.
-
-2003-12-03 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-vfolder.c: Do not #include "evolution-shell-component.h".
-
- * Makefile.am (libevolution_mail_la_SOURCES): Don't compile
- mail-importer.[ch] for now.
-
- * mail-component-factory.c: Do not #include
- <evolution-shell-client.h>.
- * mail-config.c: Likewise.
-
- * mail-vfolder.h: Do not #include <evolution-storage.h> or
- <evolution-shell-component.h>.
-
- * mail.h: Do not #include <evolution-storage.h>.
-
- * mail-ops.h: Do not #include <evolution-storage.h>.
- (mail_scan_subfolders): Remove prototype.
- (mail_update_subfolders): Likewise.
-
-2003-12-03 JP Rosevear <jpr@ximian.com>
-
- * em-folder-tree.c (em_folder_tree_destroy): save the state
- immediately if there is a timeout set
- (em_folder_tree_save_state): be true GSourceFunc and just return
- FALSE to remove the source
-
-2003-12-03 Not Zed <NotZed@Ximian.com>
-
- * mail-autofilter.c (rule_match_thread): changed to setup the rule
- part properly, it could never have worked. Bug #51601.
-
- * em-popup.c (emp_uri_popup_address_add): implement.
-
- * em-folder-view.c (emfv_popup_add_sender): implement.
- (emfv_add_sender_addressbook): hook up to above func.
-
- * em-utils.c (em_utils_add_address): implementation to add an
- email address to the addressbook.
- (emu_add_address_cb): callback required for funny api. Bug
- #51321.
-
-2003-12-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree-model.c (drop_uid_list): Moved here.
- (drop_folder): Moved here.
- (import_message_rfc822): Moved here.
- (drop_message_rfc822): Moved here.
- (drop_text_uri_list): Moved here.
- (model_drag_data_received): Moved the logic from em-folder-tree.c
- into here.
- (model_row_drop_possible): Same.
- (model_row_draggable): Same.
- (drag_text_uri_list): Moved here.
- (model_drag_data_get): Moved logic here.
- (model_drag_data_delete): Moved logic here.
-
- * em-folder-tree.c (drag_data_get_cb): Pass the full_name to
- camel_store_get_folder() rather than the path.
- (drag_data_received_cb): Same.
- (drop_uid_list): Removed.
- (drop_folder): Removed.
- (import_message_rfc822): Removed.
- (drop_message_rfc822): Removed.
- (drop_text_uri_list): Removed.
- (drag_data_received_cb): Removed.
- (row_drop_possible_cb): Removed.
- (row_draggable_cb): Removed.
- (drag_text_uri_list): Removed.
- (drag_data_get_cb): Removed.
- (drag_data_delete_cb): Removed.
- (em_folder_tree_enable_drag_and_drop): Don't connect to any of the
- drag & drop signals, they don't exist anymore.
-
- * mail-component.c (impl_createControls): Enable drag-and-drop.
-
- * em-folder-tree.c (em_folder_tree_new_with_model): Connect to the
- loading row signal.
- (loading_row_cb): Expand the path if needed.
- (em_folder_tree_destroy): Disconnect from the loading-row signal.
- (em_folder_tree_enable_drag_and_drop): New function to enable
- drag-and-drop.
- (em_folder_tree_new): Remove drag-and-drop setup code.
-
- * em-folder-tree-model.c (em_folder_tree_model_class_init): Define
- the loading-row signal.
- (em_folder_tree_model_set_folder_info): emit the loading-row signal.
-
-2003-12-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (em_folder_tree_new): Fixed to pass the
- evolution dir into em_folder_tree_model_new().
- (model_save_state): Removed.
- (em_folder_tree_save_state): Moved all the saving logic into
- em_folder_tree_model_save_expanded().
-
- * em-folder-tree-model.c (em_folder_tree_model_new): Load the
- expanded state off disk.
- (em_folder_tree_model_save_expanded): New function to save
- expanded state.
- (em_folder_tree_model_get_expanded): new function to get if a node
- should be expanded.
- (em_folder_tree_model_set_expanded): new function to set the
- expanded state of a node.
-
- * mail-component.c (mail_component_init): Pass the evo dir to
- em_folder_tree_model_new() which now requires it.
-
-2003-12-02 Rodney Dawes <dobey@ximian.com>
-
- * Makefile.am: Version the schemas
- * evolution-mail.schemas: Removed
- * evolution-mail.schemas.in.in: Added
-
-2003-12-02 Not Zed <NotZed@Ximian.com>
-
- * mail-config-druid.c (mail_config_druid_new): moved the
- gtk_widget_show_all to before we add the pages, otherwise it can
- override per-page logic. Bug #50790.
-
- * message-list.c (message_list_create_extras): setup another image
- (followup completed) to flag status list.
- (states_pixmaps[]): added flag_for_followup_done.
- (ml_tree_value_at): return 0,1 or 2 for completed icon. also use
- the real ints, these shouldn't have been true/false. Bug #43514.
-
- * evolution-mail.schemas: Added empty_trash prompt key.
-
- * em-utils.c (em_utils_prompt_user): changed to take the gconf
- 'prompt again' key directly. Fixed callers.
- (em_utils_expunge_folder): prompt the user with an expunge
- specific message.
- (em_utils_empty_trash): have an empty-trash specific message for
- prompting confirm.
- (emu_confirm_expunge): removed, no longer needed. Bug #38613.
- (em_utils_expunge_folder): remove most line feeds, let the label
- wrap them.
- (em_utils_empty_trash): ditto.
-
- * em-subscribe-editor.c (sub_folder_subscribed): update the ui
- selection state after we're done. maybe we should listen on the
- model but this is easier. Bug #50861.
-
- * em-message-browser.c (emmb_activate): hook up our own verb list.
- (emmb_message_verbs[], emmb_close): implement the close verb.
- Bug #51558.
-
- * em-format-html-display.c (efhd_attachment_popup): duh, actually
- add the menu list we create. Bug #49902.
-
- * em-format.c (d): turn off debug, committed by accident.
-
-2003-12-01 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-mt.c (do_op_status): Use data->activity_id, not local
- activity_id.
-
-2003-12-01 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-mt.c (struct _mail_msg_priv): Remove member "activity".
- (mail_operation_status): Un-#if 0 the code.
-
- * mail-component.c (struct _MailComponentPrivate): New member
- activity_handler.
- (mail_component_init): Initialize.
- (impl_dispose): Unref.
- (mail_component_peek_activity_handler): New.
- (impl_createControls): Create an ETaskBar, attach it to the
- ActivityHandler, and return it to the caller as the statusbar
- control.
-
-2003-12-01 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-component.c (impl_createControls): Pass a label for the
- status bar control for now.
-
-2003-12-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_signature_run_script): Use fcntl() to
- set FD_CLOEXEC on each fd rather than close()ing it. Apparently
- Linux's older pthread implementations use sockets and so this
- fouls threading up. GO LINUX! GO!
-
-2003-12-01 Rodney Dawes <dobey@ximian.com>
-
- * GNOME_Evlution_Mail.server.in.in:
- * em-account-prefs.c:
- * em-composer-prefs.c:
- * em-mailer-prefs.h:
- * mail-component-factory.c:
- * mail-config-factory.c:
- * mail-font-prefs.h:
- * importers/*.server.in.in:
- * importers/elm-importer.c:
- * importers/evolution-mbox-importer.c:
- * importers/evolution-outlook-importer.c:
- * importers/netscape-importer.c:
- * importers/pine-importer.c: Use BASE_VERSION for repo_ids and OAFIIDs
-
-2003-12-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (em_folder_tree_get_folder_info__got): Updated
- to call em_folder_tree_model_set_folder_info().
- (folder_subscribed_cb): Removed.
- (folder_unsubscribed_cb): Removed.
- (folder_created_cb): Removed.
- (folder_deleted_cb): Removed.
- (folder_renamed_cb): Removed.
-
- * em-folder-tree-model.c (em_folder_tree_store_set_folder_info):
- New function to replace tree_store_set_folder_info() which had
- been in em-folder-tree.c
- (em_folder_tree_model_remove_uri): Made private.
- (em_folder_tree_model_remove_store_info): Made private.
- (em_folder_tree_model_remove_folders): New function to replace
- remove_folders() from em-folder-tree.c
- (em_folder_tree_model_new): No longer takes any args.
-
- * em-folder-tree.c (em_folder_tree_new): Updated.
-
- * mail-component.c (add_store): Add the store to the model rather
- than the treeview.
- (impl_createControls): create a new treeview based on the
- already-instantiated model.
- (mail_component_init): Create a new tree model.
- (mail_component_remove_store): Remove the store from the model
- directly.
- (mail_component_get_tree_model): Updated.
-
- * em-folder-tree.c (folder_unsubscribed_cb): Call
- em_folder_tree_model_remove_folders() rather than the deprecated
- internal remove_folders() function.
- (folder_renamed_cb): Same.
- (em_folder_tree_remove_store): Removed.
- (em_folder_tree_add_store): Removed.
- (remove_folders): Removed.
-
-2003-12-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-composer-utils.c (composer_get_message): rfc2047 encode the
- Organization header value.
-
- * em-folder-tree.c (em_folder_tree_get_folder_info__got): Make
- sure our parent folder hasn't been unsubscribed or else we get a
- segfault here if it has.
-
-03-11-28 Dave Camp <dave@ximian.com>
-
- * em-folder-tree.c (render_pixbuf): Set the pixbuf renderer
- invisible for stores.
-
-2003-11-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_get_account_by_uid): New function.
-
- * em-folder-tree.c (tree_store_set_folder_info): Expand the tree
- node if the saved state tells us it was expanded the previous
- session.
- (em_folder_tree_load_state): Load the saved state.
- (em_folder_tree_add_store): Conditionally expand the store node.
- (em_folder_tree_new_with_model): Expand all the nodes that should
- be expanded.
-
-2003-12-01 Radek Doulik <rodo@ximian.com>
-
- * em-folder-tree.c (render_pixbuf): use CAMEL_VTRASH_NAME,
- CAMEL_VJUNK_NAME
-
-2003-11-28 Radek Doulik <rodo@ximian.com>
-
- * em-folder-tree.c (render_pixbuf): added junk icon to folder
- icons
-
-2003-12-01 Not Zed <NotZed@Ximian.com>
-
- * em-folder-browser.c (emfb_edit_cut, emfb_edit_copy)
- (emfb_edit_paste): override the em-folder-view impl, and handle
- the search bar properly. For #48746.
-
- * mail-security.glade: added some padding to the security details
- frames.
-
- * em-format-html-display.c (efhd_xpkcs7mime_validity_clicked):
- some cosmetic layout changes.
-
-2003-11-27 Charles Zhang <charles.zhang@sun.com>
-
- * mail-account-editor.c (construct): connect "changed" signal.
- (mail_account_editor_changed): change signal handler.
- Fixes bug #48998.
-
-2003-11-30 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-offline-handler.c: Remove all the syncFolder stuff since
- it's not in the Component interface anymore.
-
- * mail-mt.c: Remove declaration for global_shell_client. #if 0
- all the code that uses that.
-
- * mail-component-factory.c: Remove declaration for
- global_shell_client.
-
- * mail-vfolder.c: Remove declaration for global_shell_client.
-
-2003-11-26 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: turn on deprecated Gtk stuff
-
-2003-11-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (em_folder_tree_save_state): New function to
- save tree expanded state.
- (em_folder_tree_queue_save_state): New function to queue saving of
- the expanded state.
- (em_folder_tree_construct): Connect to the row-collapsed signal.
- (tree_row_collapsed): Queue a save-state.
- (tree_row_expanded): Queue a save state.
- (em_folder_tree_get_folder_info__got): Queue a save-state.
-
-2003-11-25 Not Zed <NotZed@Ximian.com>
-
- * em-folder-view.c (em_folder_view_print): set session on print
- formatter for signatures to work.
-
- * em-message-browser.c (emmb_destroy): kill warning.
-
- * em-format-html.c (efh_output_secure): same as
- efhd_output_secure, output the security bar, but for
- printing/plain html.
- (efh_application_xpkcs7mime): use output_secure.
- (em_format_html_multipart_signed_sign): removed, output_secure
- does what this did.
-
- * em-format-html-display.c (smime_sign_table,
- smime_encrypt_table): Added a short description for the mail
- display.
- (efhd_xpkcs7mime_button): only good/bad signature at this point,
- if only encrypted, then display 'bad' icon.
- (efhd_output_secure): output the security bar/button and handle
- multi-level enveloping properly.
- (efhd_application_xpkcs7mime): just call output_secure to do
- the security bar.
- (efhd_multipart_signed): same.
- (efhd_signature_button): removed, no longer used.
- (efhd_signature_check): removed, no longer used.
-
-2003-11-24 Radek Doulik <rodo@ximian.com>
-
- * em-format-html.c (efh_text_plain): use new colors
- (efh_text_html): ditto
-
- * em-format-html-display.c (efhd_gtkhtml_realise): set new colors
- according to style
-
- * em-format-html.c (efh_init): init new colors
-
- * em-format-html.h: added frame and content colors
-
- * em-format.c (emf_multipart_mixed): do not use horizonal rule,
- attachment content is now inside simple frame
-
- * em-format-html.c (efh_text_plain): add 6 points around text
- plain content and frame it
- (efh_text_html): frame text/html
- (efh_format_do): fix body tag, set bgcolor
- (em_format_html_format_headers): do not put headers into own
- table, content body is framed now instead
- (efh_format_message): update for headers/body changes
-
- * em-format-html-display.c (efhd_format_attachment): put
- additional vertical space around attachment button
-
-2003-11-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree-model.c (model_drag_data_received)
- (model_row_drop_possible, model_row_draggable)
- (model_drag_data_get, model_drag_data_delete): Swap the retval
- varargs value to the last argument instead of the first.
-
-2003-11-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_uri_deleted): Removed call to
- mail_tool_delete_meta_data(). Fixes bug #51236.
-
- * mail-component.c (impl_handleURI): Implemented.
- (mail_component_class_init): Overload the handleURI method.
-
-2003-11-20 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes bug #51012.
-
- * em-folder-tree.c (emft_popup_rename_folder): Fixed a FIXME to
- not use the OS-specific g_path_*() stuff.
- (em_folder_tree_set_selected): For the case where the tree has
- already loaded enough subfolders to include the path we need to
- select, exopand the nodes to that path as well. For the case that
- the tree hasn't loaded enough of the folder nodes, load them and
- then have the node selected/expanded to.
-
-2003-11-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-selector.c (emfs_create_name_activate): Emit the
- response signal with the RESPONSE_NEW value.
- (emfs_create_name_changed): Sanity check the entry text and set OK
- sensitivity.
- (folder_selected_cb): If there is an entry widget, then call
- name_changed() to decide sensitivity, else set OK to be sensitive.
-
- * em-utils.c (em_utils_selection_set_urilist): Same.
-
- * em-format-html-display.c (efhd_drag_data_get): Same as below.
-
- * em-folder-tree.c (drag_text_uri_list): Terminate each url of a
- text/uri-list with a \r\n.
-
-2003-11-19 Ettore Perazzoli <ettore@ximian.com>
-
- * GNOME_Evolution_Mail.server.in.in: Add an
- "evolution:uri_schemas" attribute.
-
-2003-11-19 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (em_uri_to_camel): if we're setting the
- fragment, strip leading /'s.
-
- * mail-tools.c (mail_tool_get_meta_data)
- (mail_tool_delete_meta_data, meta_data_key): old stuff killed.
- (mail_tool_uri_to_folder): handle email: uri's specially. this is
- a bit of a hack, the filter callbacks should manage this itself
- since filters are the only bits which use those uri's.
-
-2003-11-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-migrate.c (em_migrate_dir): Don't leak the message objects.
-
- * em-folder-tree.c (em_copy_folders): Execute asynchronously by
- queueing the copy in another thread.
- (em_copy_folders__copy): Moved the original logic here.
-
-2003-11-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (tree_row_expanded): Queue the
- camel_store_get_folder_info() call in another thread.
- (em_folder_tree_get_folder_info__got): Moved all the logic of
- tree_row_expanded here.
-
-2003-11-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (tree_row_expanded): Fixed to check fi->child
- as well (since mbox does it right).
- (emft_popup_new_folder_response): Fixed to subscribe to the
- correct folder.
- (emft_popup_delete_folders): Fixed to use the full_name rather
- than the path.
-
- * em-folder-selection-button.c (set_contents): Fixed to not
- include leading '/' in the folder name in the label.
-
- * em-folder-tree.c (emft_popup_new_folder_response): Implemented
- error reporting via gtk dialogs.
- (emft_popup_copy_folder_selected): Same.
-
-2003-11-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (emft_popup_new_folder_response): Use a
- folder_name rather than a path as the name argument to
- camel_store_create_folder(), fixes creation of IMAP folders.
-
-2003-11-17 Not Zed <NotZed@Ximian.com>
-
- * em-folder-selection-button.c (set_contents): handle an
- unparsable url without crashing.
-
- * mail-tools.c (mail_tool_get_local_inbox): thin wrapper on
- mail_component_get_local_inbox.
-
- * mail-component.c (mail_component_get_local_inbox): helper to get
- the default local inbox.
-
- * mail-ops.c (fetch_mail_fetch): if we can't get the inbox, make
- sure we still unref the filter driver here by using hte same exit
- code. Fixes a crash.
-
-2003-11-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-tree.c (emft_popup_new_folder_response): We can't use
- a uri to do a lookup of a store-info on the store_hash, we have to
- get a CamelStore first.
- (row_draggable_cb): validate the iter before using it.
- (row_drop_possible_cb): Same.
- (drag_data_received_cb): Here too.
- (drag_data_get_cb): Same.
- (drag_data_delete_cb): Again here.
- (tree_store_set_folder_info): Recursively add nodes if fi->child
- is non-NULL rather than adding a dummy node.
- (folder_renamed_cb): Implemented.
-
-2003-11-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-mt.c (set_stop): Removed most of the code. This is
- basically now a nop. Need to somehow get the uic and fix this.
-
- * folder-browser-factory.[c,h]: Removed.
-
- * mail-component.c (folder_selected_cb): Don't create a new view
- anymore, simply set the new folder uri on the folder browser. This
- makes the mailer use a lot less memory than in 1.x
- (view_control_activate_cb): Moved here from
- folder-browser-factory.c
- (impl_createControls): Connect to the activate signal on the view
- control.
-
-2003-11-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-selection.c (folder_selected_cb): Only set OK to
- sensitive if the selected node is not a store node.
-
- * em-folder-tree-model.c: Moved the store_hash and uri_hash from
- EMFolderTreePrivate into here instead.
-
- * em-folder-tree.c: Updated for above changes.
-
-2003-11-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-view.c (emfv_popup_move): Updated.
- (emfv_popup_copy): Updated.
-
- * em-folder-tree.c (emft_popup_copy): Updated.
- (emft_popup_move): Updated.
-
- * em-folder-selection.c (create_dialog): New convenience function
- to construct the dialog contents for all three public functions.
- (em_folder_selection_run_dialog): Now longer takes a caption arg.
- (em_folder_selection_run_dialog_uri): Same.
- (em_select_folder): Here too.
-
-2003-11-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-component.c (mail_component_get_tree_model): Use
- em_folder_tree_get_model() since an emft is not a GtkTreeView.
-
- * em-folder-tree.c (em_folder_tree_get_model): New function to get
- the tree model.
-
-2003-11-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-selection.c: Rewritten to use EMFolderTRee.
-
- * mail-vfolder.c (vfolder_load_storage): Updated for function name
- changes in mail-component.c
-
- * mail-offline-handler.c: Updated for function name changes in
- mail-component.c
-
- * mail-account-gui.c (add_new_store): Fixed to not use EStorage.
- (mail_account_gui_save): Updated for function name changes.
-
- * em-account-prefs.c (account_delete_clicked): Updated for
- function name changes.
- (account_able_clicked): Same.
- (account_able_toggled): Same.
-
- * mail-component.c: Renamed mail_component_*storage*() functions
- to mail_component_*store*() since we are no longer dealing with
- storages, but instead with CamelStore's.
- (create_view_widget): If the user selects a store node, don't try
- to open it as a folder.
-
-2003-11-13 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-component.c (impl_sendAndReceive): New, implementation for
- Evolution.Component.sendAndReceive.
- (mail_component_class_init): Install.
-
-2003-11-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-vfolder.c (context_rule_removed): Modified to not use
- EStorage* functions. I don't even think it *needs* to remove the
- folder from the mail-component, the mail-component should just
- pick it up automagically via CamelStore events.
-
- * em-folder-tree.[c,h]: New folder-tree widget that replaces the
- shell's folder-tree widget.
-
- * em-folder-tree-model.[c,h]: New source files subclassing
- GtkTreeStore for handling the mess that is drag&drop.
-
- * em-folder-selection-button.c: Ported to use EMFolderTree.
-
- * em-folder-selection.c: Ported to use EMFolderTree.
-
- * em-folder-selector.c: Ported to use EMFolderTree.
-
- * mail-component.c: Ported to use EMFolderTree.
-
- * mail-offline-handler.c (storage_go_online): Updated to not pass
- a storage argument.
-
- * mail-folder-cache.c: Removed storage stuff.
-
- * mail-send-recv.c (receive_update_got_store): Don't do EStorage*
- stuff anymore.
-
-2003-11-13 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-component.c (impl__get_userCreatableItems): New,
- implementation for the Component.userCreatableItems attribute.
- (impl_requestCreateItem): New, implementation for the
- Component.requestCreateItem() method.
- (mail_component_class_init): Install.
-
-2003-11-13 Radek Doulik <rodo@ximian.com>
-
- * em-junk-filter.c (em_junk_sa_is_available): new helper function,
- use it before any call to spamassassin, spamc and sa-learn
- (em_junk_sa_test_spamd): first test if spamassassin is available
- (em_junk_sa_test_spamd): rename em_junk_sa_spamd_tested to
- em_junk_sa_tested, always set em_junk_sa_tested
-
- * mail-folder-cache.c (folder_changed): don't call
- CAMEL_IS_VJUNK_FOLDER, it was added by mistake
-
-2003-11-13 Not Zed <NotZed@Ximian.com>
-
- * em-format-html.c (em_format_html_add_pobject): use malloc0 for
- the pobject memory.
-
-2003-11-12 Not Zed <NotZed@Ximian.com>
-
- * mail-account-gui.c (smime_sign_key_select)
- (smime_encrypt_key_select, smime_encrypt_key_selected)
- (smime_sign_key_selected): implement the key selector popup using
- e-cert-selector.
-
-2003-11-11 Not Zed <NotZed@Ximian.com>
-
- * em-format-html.c (efh_application_xpkcs7mime): output icons of
- the status.
- (em_format_html_add_pobject): Changed to take a size specificier,
- return the pobject, and re-ordered args to be more consistent with
- puri stuff.
- (em_format_html_remove_pobject): handle the free callback if set.
-
- * em-format.c (emf_application_xpkcs7mime): moved this to
- em-format-html since it needs to do icon stuff.
-
- * mail-security.glade: new glade file for security related stuff.
-
- * mail-config.glade: removed the message security dialogue, it
- gets opened automatically by the config code :(
-
-2003-11-10 Ettore Perazzoli <ettore@ximian.com>
-
- * GNOME_Evolution_Mail.server.in.in: Set an
- "evolution:component_alias" property with a value of "mail".
-
-2003-11-10 Not Zed <NotZed@Ximian.com>
-
- * em-format-html.c (em_format_html_multipart_signed_sign): changed
- for cipher context api changes.
- * em-format.c (emf_multipart_signed): ditto.
-
-2003-11-07 Not Zed <NotZed@Ximian.com>
-
- * mail-config.glade: added security_information_dialog (probably
- temporarily in this file).
-
- * em-format.c (em_format_is_attachment): also treat pkcs7-mime as
- non-attachment.
- (emf_application_xpkcs7mime): no longer need to worry about
- scanning the part.
-
-2003-11-07 Dan Winship <danw@ximian.com>
-
- * message-list.c: Don't #include e-name-western.h, since the code
- that uses it is commented out, and we want to remove the local
- copy, but we don't want to make the mailer depend on the e-d-s
- copy if it's not even going to be using it.
-
-2003-11-07 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: build the marshall files right at the beginning
-
-2003-11-11 Not Zed <NotZed@Ximian.com>
-
- * mail-security.glade: new glade file for security related stuff.
-
- * mail-config.glade: removed the message security dialogue, it
- gets opened automatically by the config code :(
-
-2003-11-10 Ettore Perazzoli <ettore@ximian.com>
-
- * GNOME_Evolution_Mail.server.in.in: Set an
- "evolution:component_alias" property with a value of "mail".
-
-2003-11-10 Not Zed <NotZed@Ximian.com>
-
- * em-format-html.c (em_format_html_multipart_signed_sign): changed
- for cipher context api changes.
- * em-format.c (emf_multipart_signed): ditto.
-
-2003-11-07 Not Zed <NotZed@Ximian.com>
-
- * mail-config.glade: added security_information_dialog (probably
- temporarily in this file).
-
- * em-format.c (em_format_is_attachment): also treat pkcs7-mime as
- non-attachment.
- (emf_application_xpkcs7mime): no longer need to worry about
- scanning the part.
-
-2003-11-07 Dan Winship <danw@ximian.com>
-
- * message-list.c: Don't #include e-name-western.h, since the code
- that uses it is commented out, and we want to remove the local
- copy, but we don't want to make the mailer depend on the e-d-s
- copy if it's not even going to be using it.
-
-2003-11-07 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: Make sure the marshal files are listed above other
- sources
-
-2003-11-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-migrate.c (em_migrate_filter_file): Call em_migrate_uri()
- instead of em_uri_from_camel().
- (em_migrate_uri): Special-case file: uri's by converting them into
- email://local@local/ uri's since these folders will have been
- migrated to the newer mbox tree structure.
-
-2003-11-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-vfolder.c (mail_vfolder_delete_uri): User vfolder rules
- should be in ${evolution_dir}/mail/vfolders.xml rather than
- ${evolution_dir}/vfolders.xml
- (mail_vfolder_rename_uri): Same.
- (store_folder_deleted): Here too.
- (store_folder_renamed): And here.
- (vfolder_load_storage): Again here.
- (vfolder_editor_response): Same.
- (edit_rule_response): And here.
- (new_rule_clicked): Here too.
-
- * mail-session.c (main_get_filter_driver): User filter rules
- should be in ${evolution_dir}/mail/filters.xml rather than
- ${evolution_dir}/filters.xml
-
- * mail-autofilter.c (filter_gui_add_from_message): Same.
- (mail_filter_rename_uri): And here.
- (mail_filter_delete_uri): Here too.
-
- * em-utils.c (filter_editor_response): Again here.
- (em_utils_edit_filters): Same.
-
- * em-migrate.c (em_migrate_filter_file): Same (also for
- vfolders.xml)
-
-2003-11-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-migrate.[c,h]: New source files to migrate from the old mail
- directory to the new mail directory.
-
- * mail-component.c (mail_component_init): Changed to use
- ~/.evolution and added code to migrate the old mail folders over
- if ~/.evolution/mail does not yet exist.
-
-2003-11-03 Ettore Perazzoli <ettore@ximian.com>
-
- * GNOME_Evolution_Mail.server.in.in: Use "evolution2:config_item"
- properties for the config item instead of "evolution:config_item"
- ones.
-
-2003-11-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-view.c: setup filter-on-thread and vfolder-on-thread.
-
- * mail-autofilter.c (rule_from_message): handle AUTO_THREAD
- (rule_match_thread): new function to setup a filter on a msgid
-
-2003-10-31 Not Zed <NotZed@Ximian.com>
-
- * mail-config.glade: Rearranged smime config slightly, and added
- encrypt key preference.
-
- * mail-account-gui.c (mail_account_gui_save,
- mail_account_gui_new): enable smime always if have_nss. Added new
- options in glade file and handle changed names.
- (smime_changed, smime_sign_key_select, smime_sign_key_clear)
- (smime_encrypt_key_select, smime_encrypt_key_clear): Add a bunch
- of mostly dummy UI behaviour management stuff.
-
-2003-10-30 Not Zed <NotZed@Ximian.com>
-
- * em-format.c (em_format_is_inline): show application/x-pkcs7-mime
- inline always by default.
-
-2003-10-30 Not Zed <NotZed@Ximian.com>
-
- * em-format.c (emf_multipart_signed): handle
- application/x-pkcs7-signature.
-
-2003-10-29 Not Zed <NotZed@Ximian.com>
-
- * em-format-html.c (em_format_html_multipart_signed_sign): handle
- application/x-pkcs7-signature.
-
- * em-format.c (emf_application_xpkcs7mime): Handle
- application/x-pkcs7-mime.
-
-2003-10-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-account-prefs.h: Changed the OAFIID.
-
- * em-composer-prefs.h: Changed the OAFIID.
-
- * em-mailer-prefs.h: Changed the OAFIID.
-
- * GNOME_Evolution_Mail.server.in.in: Changed OAFIIDs for the prefs
- controls.
-
-2003-10-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * GNOME_Evolution_Mail.server.in.in: Nuked the MailConfig
- interface stuff.
-
- * Mailer.idl: Removed. None of the interfaces are needed/used
- anymore.
-
- * folder-info.[c,h]: Removed. The summary was the only thing that
- needed/used this code and it has been nuked into oblivion, so
- these interfaces are no longer needed.
-
- * mail-config.c: Removed old crufty CORBA interface snot that is
- no longer needed or used.
-
-2003-10-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * Fixes bug #49816
-
- * em-popup.c (emp_part_popup_reply_sender): No need to pass a
- parent window arg anymore.
- (emp_part_popup_reply_list): Same.
- (emp_part_popup_reply_all): Here too.
- (emp_part_popup_forward): Same.
- (emp_uri_popup_address_send): Here too.
-
- * em-folder-browser.c (emfb_mail_compose): No need to pass a
- parent window arg anymore.
- (emfb_mail_post): Same.
-
- * em-folder-view.c (emfv_message_reply): Don't pass a parent
- window argument anymore.
- (emfv_popup_forward): Same.
- (emfv_popup_resend): Same here.
- (em_folder_view_open_selected): Same.
- (emfv_message_forward_attached): Here too.
- (emfv_message_forward_inline): And here.
- (emfv_message_forward_quoted): Same.
- (emfv_message_redirect): Here too.
- (emfv_message_post_reply): And here.
- (emfv_format_link_clicked): ANd finally here.
-
- * em-utils.c (create_new_composer): Don't set_transient_for()
- anymore.
- (em_utils_compose_new_message): No longer takes a parent window
- argument.
- (em_utils_forward_attached): No longer takes a parent window arg.
- (em_utils_forward_inline): Same.
- (em_utils_forward_quoted): Same.
- (em_utils_forward_message): Same.
- (em_utils_forward_messages): Here too.
- (redirect_get_composer): Don't set_transient_for() here either.
- (em_utils_redirect_message): No longer takes a parent window arg.
- (em_utils_redirect_message_by_uid): Same.
- (reply_get_composer): Don't set_transient_for() here.
- (em_utils_reply_to_message): No longer takes a parent window arg.
- (em_utils_reply_to_message_by_uid): Same.
- (post_reply_to_message): Don't set_transient_for() here.
- (em_utils_post_reply_to_message_by_uid): No longer takes a parent
- window arg.
- (em_utils_compose_new_message_with_mailto): Don't
- set_transient_for() here.
- (em_utils_post_to_url): Same.
- (em_utils_edit_message): No longer takes a parent window arg.
- (em_utils_edit_messages): Same.
-
-2003-10-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-account-prefs.[c,h]: Re-Namespaced mail-accounts.c
-
- * em-composer-prefs.[c,h]: Re-Namespaced mail-composer-prefs.c
-
- * em-mailer-prefs.[c,h]: Re-Namespaced mail-preferences.c
-
- * mail-accounts.[c,h]: Removed.
-
- * mail-composer-prefs.[c,h]: Removed.
-
- * mail-preferences.[c,h]: Removed.
-
- * mail-account-editor.c: Updated.
-
- * mail-account-gui.c: Updated.
-
- * mail-config-factory.c: Updated.
-
- * mail-component-factory.c: Updated.
-
-2003-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * GNOME_Evolution_Mail.server.in.in: Add an
- "evolution:button_icon" attribute.
-
-2003-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * GNOME_Evolution_Mail.server.in.in: Add an
- "evolution:button_sort_order" attribute.
-
-2003-10-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-component.c (parse_uid_list): Removed, use
- em_utils_selection_get_uidlist() instead.
- (drop_uid_list): Use em_utils_selection_get_uidlist() to parse the
- x-uid-list selection data and use mail_tool_uri_to_folder()
- directly since we have the uri (originally we expected the first
- component of the selection data to be the e-storage-set-view
- folder path rather than the uri).
- (folder_receive_drop_cb): Call gtk_drag_finish() here.
-
- * message-list.c: s/x-evolution-message/x-uid-list/
-
- * em-utils.c: Same.
-
-2003-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-component.c (impl_createControls): Use
- e_storage_browser_peek_widget_scrolled() to retrieve the scrolled
- window that the EStorageSetView is contained in.
-
-2003-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * GNOME_Evolution_Mail.server.in.in: Add an
- "evolution:button_label" attribute to the Component for use in the
- shell.
-
-2003-10-22 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (em_copy_folders): handle destination of ""
- properly.
- (emc_popup_copy_folder_selected): handle url->path properly, strip
- leading /.
- (em_copy_folders): if we just created a new folder on a
- subscribable store, subscribe to it.
- (em_copy_folders): handle nonselectable folders specially.
-
-2003-10-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-component.c (drag_text_uri_list, folder_dragged_cb)
- (drop_uid_list, drop_folder, import_message_rfc822)
- (drop_message_rfc822, drop_text_uri_list, folder_receive_drop_cb):
- New functions to handle drag & drop to/from the folder tree.
- (impl_createControls): Setup drag & drop support.
-
- * em-format.c (emf_multipart_mixed): Put an <hr> between parts of
- a multipart.
-
-2003-10-21 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (emc_popup_properties): implement.
- (emc_popup_properties_got_folder): builds dynamic
- folder-properties dialogue.
- (emc_popup_properties_response): set the properties on the folder
- on an ok response.
- (emc_popup_properties_free): free the properties working data.
-
- * mail-folder-cache.c (unset_folder_info): unhook from the right
- function for message_changed.
-
-2003-10-20 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (emc_popup_new_folder): pass the right object
- to set_selected(). Fixes a new real bug. Undid reformatting.
-
-2003-10-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-component.c: General compile fixes.
- (emc_popup_new_folder): Fixed to not shadow a parameter. Fixes a
- real bug.
-
- * mail-component.h: Added some prototypes.
-
-2003-10-13 Not Zed <NotZed@Ximian.com>
-
- * em-popup.c (em_popup_create_menu_once): only hookup target free
- if we have a target set.
-
- * mail-component.c (load_accounts): removed debug i accidentally
- left in.
- (emc_tree_right_click): handle right-click context menu, using an
- EMPopup table.
- (emc_popup_*): setup empty popup handlers.
-
-2003-10-13 Not Zed <NotZed@Ximian.com>
-
- * em-folder-selection.c (em_select_folder): asynchornous folder
- selection call.
- (emfs_folder_selected): callback for folder selected.
-
- * em-folder-view.c (emfv_popup_move): implement.
- (emfv_popup_copy): "
- (emfv_popup_move_cb): async folder select callback to run it.
-
-2003-10-10 Not Zed <NotZed@Ximian.com>
-
- * mail-account-gui.c
- (mail_account_gui_folder_selector_button_new): use
- em_folder_selection_button.
- (mail_account_gui_new): "
- (folder_selected): "
-
- * em-folder-selection-button.c: Make this use camel uri's rather
- than camelfolders.
- (set_selection): removed, redundant.
- (impl_dispose): removed, not needed.
-
- * em-folder-selection-button.h: change the selected signal not to
- actually return the selection, which must get retrieved later.
-
- * mail-component.c (em_uri_from_camel): create an evo mail uri
- from a camel one.
- (em_uri_to_camel): the reverse.
-
- * mail-signature-editor.c (mail_signature_editor): up the version
- of the gtkhtml editor.
-
-2003-10-09 Not Zed <NotZed@Ximian.com>
-
- * em-folder-selection-button.c (set_selection): always set
- selected_folder, otherwise we don't unset it properly.
-
- * em-folder-selection.c (em_folder_selection_run_dialog): fix a
- small memleak.
- (em_folder_selection_run_dialog_uri): do the same as run_dialog
- but take, and return physical uri's.
-
- * mail-component-factory.c (factory): removed some fixme's, and
- re-hookedup the composer.
-
-2003-10-09 Frederic Crozat <fcrozat@mandrakesoft.com>
-
- * em-icon-stream.c (emis_sync_close): Use
- gnome-thumbnail_scale_down_pixbuf if available, for better
- performance.
-
-2003-10-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-view.c: Add a hide_mask to the
- create-rule-from-message bars so that we don't segfault when we
- right click with a multi-selection.
-
-2003-10-08 Chris Toshok <toshok@ximian.com>
-
- * em-utils.c (em_utils_camel_address_to_destination): EDestination
- => EABDestination, and e_destination => eab_destination.
- (reply_get_composer): same.
- (post_reply_to_message): same.
-
- * em-composer-utils.c (ask_confirm_for_unwanted_html_mail)
- EDestination => EABDestination, and e_destination =>
- eab_destination.
- (composer_get_message):same.
-
-2003-10-08 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (mail_component_peek): setup vfolders once we
- hve the component, since its setup will call mail_component_peek,
- fun recursion.
-
-2003-10-08 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (setup_local_folder): removed.
- (setup_local_store): setup various needed globals properly.
- (setup_account_storages): renamed to load_accounts.
- (go_online): turn on interactivity as well as onlinedness.
-
- * GNOME_Evolution_Mail.server.in.in: point the preferences pages
- to the right factory.
-
-2003-10-07 Not Zed <NotZed@Ximian.com>
-
- * mail-component.[ch]: Fix copyrights.
-
-2003-10-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (identity_prepare): Fixed.
-
- * mail-ops.c (fetch_mail_fetch): Always save the uid cache no
- matter what.
-
-2003-10-03 Frederic Crozat <fcrozat@mandrakesoft.com>
-
- * mail-config-druid.c (identity_prepare), (config_wizard_new):
- Convert real name to UTF-8 if needed.
-
-2003-10-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-browser.c (emfb_set_folder): Disable the selection of
- the first unread message for now. This is actually annoying the
- fuck out of me, Radek, and a few other people.
-
-2003-10-02 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (add_storage): Add the storage to the hash
- after we've initialised it.
- (mail_component_evomail_uri_from_folder): hardcode "local" account
- pseudo-id for local folders.
- (mail_component_get_folder_from_evomail_uri): handle the "local"
- account case.
-
-2003-10-02 Not Zed <NotZed@Ximian.com>
-
- * mail-component.c (setup_local_store): use mbox:/path rather than
- mbox:///path - the mbox code is 'wrong', but this is easier to
- fix. fixes local unread counts. maybe the provider url-compare
- should address this too.
-
-2003-10-02 Suresh Chandrasekharan <suresh.chandrasekharan@sun.com>
-
- * mail-config-druid.c: Fix for 40917 "Backspace shouldn't
- highlight the whole remaining string in Setup Assistant".
- (identity_changed): Removed repeated focussing per keystroke.
- functions
- (source_changed): Same.
- (transport_changed): Here too.
- (management_changed): And here.
- (identity_prepare): Removed the initial highlighting for Full
- Name, also the unneeded intial grab_focus.
-
-2003-10-02 Not Zed <NotZed@Ximian.com>
-
- * em-format-html.c (efh_format_timeout): zero out last_part if
- we're clearing. Uh, this fixes, but shouldn't, part of #49034.
- The problem is the 'last part' logic is based on the address,
- which can quite easily be repeated for different messages.
-
- * em-folder-view.c (emfv_list_message_selected): reverted jeff's
- patch for #48618, use a much simpler method.
-
- * em-message-browser.c (emmb_destroy): hook onto destroy handler,
- we need to destroy the messagelist ourselves, since we dont attach
- it to any parent window.
-
-2003-10-01 Not Zed <NotZed@Ximian.com>
-
- * em-format-html.c (efh_init): turn off blocking writes.
- (efh_format_timeout): don't do a htmlbegin on the page yet, it'll
- be handled by em-html-stream when it has data, to reduce flicker.
- (efh_format_do): close the main gtkhtml stream as soon as we're
- done writing the body. any sub-jobs should be using frames etc.
- (efh_text_plain): dont write a table around the text, try to
- reduce flickering. layout may be out now though.
-
- * em-html-stream.c (emhs_sync_write): if we have no html_stream
- yet, begin a new one.
-
-2003-09-30 Rodney Dawes <dobey@ximian.com>
-
- * em-format-html-print.c: Use "Sans Regular" instead of "Helvetica"
- Fixes bug #47878
-
-2003-09-30 Not Zed <NotZed@Ximian.com>
-
- * em-format-html.c (efh_init): remove gconf stuff.
- (em_format_html_set_xmailer_mask): new method to set the xmailer mask.
-
- * em-folder-view.c (emfv_display_keys[]): Added charset key to
- monitor/retrieve, and xmailer_mask.
- (emfv_setting_notify): Monitor charset setting, pass onto the
- formatter, as well as xmailer_mask.
-
- * mail-preferences.c (mail_preferences_construct): use the new
- charset key.
- (mail_preferences_apply): use the new charset key.
-
- * evolution-mail.schemas: Moved the mail/format/charset to
- mail/display/charset. 1. it makes more sense, and 2. it makes
- notification update easier in em-folder-view.c
-
- * em-format.c (emf_init): remove the gconf charset stuff, for bug
- #48791, and also actually fixes the fixme that jeff thought he
- fixed.
- (em_format_format_text): use default charset as fallback.
- (em_format_set_default_charset): New method to set the default charset.
- (gconf_charset_changed): removed.
-
-2003-09-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-format.c (emf_init): Oops, put the arguments in the right order.
-
-2003-09-29 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-component.c: New member local_store in
- MailComponentPrivate.
- (impl_dispose): Unref.
- (mail_component_load_storage_by_uri): Return the CamelStore.
- (setup_local_folder): New.
- (setup_local_store): New.
- (mail_component_init): Call it.
- (mail_component_peek_storage_set): New.
- (mail_component_get_folder_from_evomail_uri): New.
- (mail_component_evomail_uri_from_folder): New.
-
- * em-folder-selection-button.c: New.
- * em-folder-selection-button.h: New.
-
- * em-folder-selection.c: New.
- * em-folder-selection.h: New.
-
- * em-marshal.list: Add NONE:POINTER.
-
-2003-09-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_save): Allow any file: uri
- to point to a sent or drafts folder.
-
-2003-09-25 Rodney Dawes <dobey@ximian.com>
-
- * mail-send-recv.c: Make the dialog more HIG-compliant by fixing
- widget alignment/spacing issues, and removing separators
-
-2003-09-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-preferences.c (mail_preferences_construct): Same as below.
-
- * mail-composer-prefs.c (mail_composer_prefs_construct): gconf can
- return empty string if the charset has not been set, so if the
- charset string is empty, default the charset to the user's locale
- charset. Partial fix for bug #47638.
-
-2003-09-23 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-component.c (add_storage): Remove unused arg "uri".
- (mail_component_add_store): Likewise.
- (add_storage): Don't set the "Connecting..." node.
- (mail_component_init): Set up local store at
- ~/.evolution/mail/local.
-
- * evolution-mbox-upgrade.c (get_local_store): Remove a double
- xmlFree() that was causing it to crash.
-
-
-2003-09-23 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-component.c (add_storage): Note the new store.
-
- * mail-component-factory.c: Don't include "mail-callbacks.h"
- anymore.
-
- * em-format-html.c (em_format_html_get_type): Get the base
- directory with mail_component_peek_base_directory().
- * em-utils.c (filter_editor_response): Likewise.
- (em_utils_edit_filters): Likewise.
-
- * em-folder-browser.c (emfb_init): Get the search context through
- mail_component_peek_search_context().
-
-2003-09-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * evolution-mbox-upgrade.c (get_local_store): Don't xmlFree (name)
- until after we've g_strdup'd it.
- (em_migrate_dir): If the metadata file doesn't exist, don't even
- bother trying subfolers (the shell just ignores them so we should
- too).
-
-2003-09-23 Jeffrey Stedfast <fejj@ximian.com>
-
- Fix for bug #48791 (and also fixes a FIXME)
-
- * em-format.c (emf_init): Setup a gconf listener for changes to
- the charset setting.
- (gconf_charset_changed): Update the cached gconf charset value.
- (emf_finalise): Free the EMFormatPrivate data, unref the gconf
- client, disconnect the charset notify id, and free the cached
- gconf charset value.
- (em_format_format_text): Use the cached gconf charset value.
-
-2003-09-22 Not Zed <NotZed@Ximian.com>
-
- ** See bug #32996
-
- * mail-folder-cache.c (real_flush_updates): don't just pass TRUE
- to the 'can work offline' parameter of new shell folder.
-
- ** See bug #39410
-
- * mail-ops.c (prep_offline_do): sync all messages, not just
- unread or flagged ones.
-
-2003-09-22 Not Zed <NotZed@Ximian.com>
-
- * em-popup.c (emp_uri_popup_link_copy): removed, moved to
- em-folder-view, for now, it has access to an invisible.
-
- * em-folder-view.c (emfv_setting_notify): honour the load_http
- setting, at least the all setting.
- (emfv_format_popup_event): setup the popup menu item for copy link
- location here.
-
-2003-09-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-preferences.c (mail_preferences_construct): Connect to
- "value-changed" rather than "changed" for spin buttons.
-
-2003-09-21 Not Zed <NotZed@Ximian.com>
-
- * mail-session.c (ms_thread_msg_new): implement, we hook into the
- mail progress reporting stuff by overriding the CamelOperation
- member with one from a dummy mail_msg.
- (ms_thread_msg_free): handle freeing.
-
- * mail-mt.c (mail_msg_free): mute the camel-operaiton when we free
- it so we no longer get updates.
-
-2003-09-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-message-browser.c (emmb_set_message): Set the window title to
- be that of the message subject. Fixes bug #48617.
-
-2003-09-19 Jeffrey Stedfast <fejj@ximian.com>
-
- Fix for bug #48618.
-
- * em-folder-view.c (emfv_list_message_selected): See if we have
- already loaded the message uid that has just been selected, if so
- - don't bother re-loading it.
- (emfv_list_done_message_selected): Update loaded_uid and
- loading_uid.
-
-2003-09-18 Radek Doulik <rodo@ximian.com>
-
- * em-format-html.c (efh_init): use gtkhtml's blocking
-
-2003-09-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-inline-filter.c: updated for CamelTransferEncoding namespace
- changes
-
- * em-inline-filter.h: updated for CamelTransferEncoding namespace
- changes
-
- * mail-ops.c: updated for CamelTransferEncoding namespace changes
-
-2003-09-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c: updated for camel namespace changes
-
- * em-folder-view.c: updated for camel namespace changes
-
- * em-format-html-display.c: updated for camel namespace changes
-
- * em-format-html-quote.c: updated for camel namespace changes
-
- * em-format.c: updated for camel namespace changes
-
- * em-popup.c: updated for camel namespace changes
-
- * em-utils.c: updated for camel namespace changes
-
- * mail-autofilter.c: updated for camel namespace changes
-
- * mail-ops.c: updated for camel namespace changes
-
- * mail-session.c: updated for camel namespace changes
-
- * message-list.c: updated for camel namespace changes
-
- * message-tag-followup.c: updated for camel namespace changes
-
- * importers/evolution-mbox-importer.c: updated for camel namespace
- changes
-
-2003-09-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-popup.c (emp_standard_menu_factory): Don't forget to
- initialise/increment 'i' when using it as an object id in the
- for-loop.
-
- * em-format.c (em_format_format_text): Initialise charset to NULL
- or it may be used uninitialised. Also include
- gnome-vfs-mime-handlers.h for gnome_vfs_mime_type_get_description().
-
- * Makefile.am: Added $(MARSHALL_GENERATED) to $(BUILT_SOURCES) so
- that em-marshal.[c,h] were autogenerated.
-
-2003-09-17 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.c, folder-browser.h, folder-browser-ui.c
- folder-browser-ui.h, mail-callbacks.c, mail-callbacks.h
- mail-display.c, mail-display.h, mail-display-stream.c
- mail-display-stream.h, mail-format.c, mail-format.h
- mail-identify.c, mail-search.c, mail-search.h message-browser.c,
- message-browser.h, subscribe-dialog.c subscribe-dialog.h,
- mail-font-prefs.c, mail-font-prefs.h: cvs removed.
-
- * Makefile.am: Removed mail-font-prefs.[ch], hasn't been built for
- ages.
-
- * em-*.c: killed a bunch of printfs.
-
- * em-format-html-display.c (efhd_html_button_press_event): update
- for html object api chagnes.
-
- ** Merge in mail-refactor-2 branch.
-
-2003-09-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * evolution-mbox-upgrade.c: New source file to migrate from the
- old mbox structure to the new mbox structure.
-
-2003-09-08 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-folder-cache.c (mail_note_store): Allow NULL storage in
- precondition.
-
- * mail-component.c (mail_component_init): Remove debugging
- message.
-
-2003-08-22 Not Zed <NotZed@Ximian.com>
-
- * mail-format.c (write_date): translate the local time format.
-
-2003-08-20 David Woodhouse <dwmw2@infradead.org>
-
- * mail-format.c (write_date): Use e_utf8_strftime() to generate
- localised time; avoid gratuitous extra translation and array of
- day names, and the autoconf magic which made Not Zed dislike the
- inclusion of the timezone name.
-
-2003-08-18 Ettore Perazzoli <ettore@ximian.com>
-
- * GNOME_Evolution_Mail.server.in.in: Rename
- GNOME_Evolution_Mail_Component2 to
- GNOME_Evolution_Mail_Component_2 and GNOME_Evolution_Mail_Factory2
- to GNOME_Evolution_Mail_Factory_2.
- * mail-component-factory.c: Update accordingly.
-
-2003-08-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-session.c (main_get_filter_driver): Removed the
- new-mail-notification mess.
-
- * mail-folder-cache.c (notify_idle_cb): New idle callback to alert
- the user about new mail.
- (notify_type_changed): New function to intercept user changes to
- his/her notification settings changes.
- (real_flush_updates): Initialise new mail notification if not yet
- initialised and setup an idle callback if none is already set.
- (update_1folder): Now takes an additional argument `new' which
- states whether or not the fodler got any new mail so that we may
- handle notify the user (if needed).
- (folder_changed): Pass in the number of new messages received.
-
-2003-08-19 Not Zed <NotZed@Ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): Added a comment for
- translators.
-
-2003-08-19 David Woodhouse <dwmw2@infradead.org>
-
- * mail-callbacks.c (mail_generate_reply): Add a timezone offset to
- the attribution string.
-
-2003-08-19 Not Zed <NotZed@Ximian.com>
-
- * mail-format.c (write_date): Added translation for day and
- localtime strings. Also removed the tz_zone stuff, and just use
- 'localtime' always.
-
-2003-08-15 David Woodhouse <dwmw2@infradead.org>
-
- * mail-format.c (write_date): Show date in localtime too.
-
-2003-08-19 Harry Lu <harry.lu@sun.com>
-
- ** For #45348
-
- * mail-display.c (mail_display_render): Change "%P" to "%p" so
- that strftime() can work under solaris.
-
-2003-08-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (mail_send_message): Don't abort at the first failure
- after sending (filtering, appending to Sent, syncing). Instead,
- keep a running tab of exceptions and then set a culmulative
- exception at the end to report to our caller. Also, if we fail to
- append to the account Sent folder, try again with the local Sent
- folder. Fixes bug #46512.
-
-2003-08-13 Suresh Chandrasekharan <suresh.chandrasekharan@sun.com>
-
- * e-searching-tokenizer.c (searcher_next_token): Fix for 45818 (
- i18n mail messages search only produces '[?]'). Now multibyte
- character selection works correctly. But due to associated gtkhtml
- bug, the find button functionallity for multibyte characters is
- broken.
-
-2003-08-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-tools.h: Removed unused function prototype.
-
-2003-08-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-session.c (remove_timeout): Removed.
- (register_timeout): Removed.
-
-2003-08-09 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-component.c (storage_go_online): Pass NULL for the
- operation pointer to mail_note_store(), to sync with Michael's
- changes.
-
-2003-08-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (handle_multipart_encrypted): Updated for
- CamelMimePart::content_type changes.
-
- * mail-ops.c (save_part_save): Use
- camel_data_wrapper_decode_to_stream() here.
-
- * mail-display.c (drag_data_get_cb): Updated for
- CamelMimePart::content_type changes.
- (do_attachment_header): Same.
-
-2003-07-31 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (mail_format_raw_message): Updated to pass FALSE
- as the 'decode' param to
- mail_format_data_wrapper_write_to_stream().
- (mail_format_data_wrapper_write_to_stream): Now takes a boolean
- arg telling whether to decode or not. Also reworked the charset
- logic now that camel doesn't handle this for us any longer.
- (mail_format_get_data_wrapper_text): Updated.
- (handle_text_plain): Same.
- (handle_text_enriched): Here too.
-
- * mail-display.c (do_attachment_header): Call decode_to_stream
- here instead of write_to_stream.
- (do_external_viewer): Same.
- (on_url_requested): Same. Also updated for
- mail_format_data_wrapper_write_to_stream().
- (try_part_urls): Call decode_to_stream.
- (drag_data_get_cb): Same.
-
-2003-08-05 Not Zed <NotZed@Ximian.com>
-
- ** See bug #32732
-
- * message-list.c (mail_regen_list): use thread_new.
-
- * mail-local.c (reconfigure_response): use thread_new.
-
- * mail-display.c (stream_write_or_redisplay_when_loaded): use
- thread_new.
-
- * mail-config.c (mail_config_check_service): use thread_new rather
- than queue.
-
- * mail-callbacks.c (view_msg): change to use mail_get_messages(),
- fixes FIXME.
- (do_view_messages): handle get_messages callback.
- (do_view_message): removed.
-
- * mail-ops.c (mail_get_folderinfo): Use a new thread thread
- semantic.
- (mail_save_part): "
- (mail_store_set_offline): "
- (mail_sync_folder): use queued_slow thread queue.
- (mail_expunge_folder): "
- (mail_empty_trash): "
-
- ** See bug #47224. Hook onto clicked rather than button_pressed,
- so that dnd works.
-
- * mail-display.c (inline_toggle): toggle a part inline.
- (button_press): change back to only handle button clicked events,
- renamed to inline_button_clicked.
- (do_attachment_header): hook onto clicked rather than
- button_press_event, and move key_press_event to
- inline_button_pressed.
- (do_signature): Same.
- (inline_button_pressed): handle inline button key press event
- explicitly.
-
-2003-07-29 Not Zed <NotZed@Ximian.com>
-
- * mail-folder-cache.c (mail_note_store): add a CamelOperation for
- overriding status handler.
-
- * mail-send-recv.c (receive_update_got_store): Pass our own cancel
- handle to get_folderinfo and mail_note_store.
- (mail_send_receive, mail_receive_uri): Same for get_store.
-
- * mail-ops.c (mail_get_store, mail_get_folderinfo): Add a
- CamelOperation argument, for overriding the status handler. Fixed
- most calles to pass NULL to use the default.
-
-2003-09-15 Not Zed <NotZed@Ximian.com>
-
- * em-folder-browser.c (emfb_activate): remove warning about folder
- not being loaded yet - it basically never is.
-
- * em-popup.c (emp_standard_menu_factory): dont setup any global
- select menu's yet. they're all handled by folderview atm.
-
-2003-09-11 Not Zed <NotZed@Ximian.com>
-
- * em-format-html.c (efh_finalise, efh_format_timeout): Use a
- proper hash free func, otherwise it dont work.
-
-2003-09-11 Not Zed <NotZed@Ximian.com>
-
- * em-inline-filter.[ch]: A new class which implements an inline
- snooper via a mime filter, so it is fully streamable. contents
- merely passes through the filter.
-
- * em-format-html.c (efh_finalise): free text substitute parts
- table.
- (efh_text_plain): transform a text part into a multipart, scanning
- for inline data. Keep the multipart around for redraws.
- (efh_format_timeout): clear the text substitute parts table.
-
-2003-09-10 Not Zed <NotZed@Ximian.com>
-
- * em-format-html-display.c (efhd_init): hook onto realise so we
- get the real theme-applied style.
- (efhd_gtkhtml_realise): get the theme data for colour defaults.
- Tweak the colour selection to make it work better with dark
- themes.
-
- * em-format-quote.c (emfq_format_source): we need to implement
- this.
- (emfq_format_error): we need not to call parent, it doesn't
- implement it.
-
- * message-list.c (message_list_select_uid): don't emit
- changedhere, let it go through the table cursor change.
-
- * em-folder-browser.c (em_folder_browser_show_preview): use
- folderview.preview_active for this state.
- (em_folder_browser_show_preview): clear the current message when
- we turn off the message view, and load the current one when turn it on.
-
- * em-folder-view.c (emfv_destroy): zero out preview + list.
- (emfv_list_message_selected): check preview_active before doing
- anything.
- (emfv_edit_cut):
- (emfv_edit_copy): only run if preview active.
-
- * em-format-html.c (efh_format_do): output the proper html
- headers, etc.
-
-2003-09-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_save): Allow the user to
- select any fodler for his/her Drafts and Sent folders. Fixes bug
- #45412.
-
-2003-09-09 Not Zed <NotZed@Ximian.com>
-
- * em-utils.c (forward_non_attached): implement forward quoted.
-
- * em-format-quote.[ch]: New class, em-format-html-quote wont cut
- it. Sigh.
-
- * em-format-html-quote.c (efhq_base_init): move type init stuff
- here.
- (efhq_complete): remove, this is a signal.
- (efhq_multipart_related): we need to override the base class, we
- don't want to output any attachment html.
-
- * em-format-html-print.c (efhp_base_init): move builtin type init
- to here.
-
- * em-format-html.c (efh_init): get xmailer mask from gconf (sigh).
- (efh_format_header): inmplement most of xmailer mask thing.
- rupert icon not done yet, probably needs to be done as part of
- em-format-html-display, sigh.
- (type_builtin_table[]): add image/svg to supported image formats.
- (efhd_base_init): move type init to here.
- (efh_text_enriched): write to the filtered_stream, not stream.
-
- * em-format.c (em_format_format_text): oops, actually use any
- supplied charset.
- (emf_base_init): move hashtable init into base_init, so we get a
- new copy for each derived class too.
-
- * mail-send-recv.c (build_dialogue): use an eclippedlabel for
- status. Fixed all uses.
-
-2003-09-08 Not Zed <NotZed@Ximian.com>
-
- * em-format-html.h (EMFormatHTML): added a simple_headers option,
- only output headers in basic format. Added hide_headers option,
- to disable all header output.
-
- * em-format-html-quote.c (efhq_format_message): blockquote the
- contnet, thats how you cite it!
- (efhq_init): turn on simple headers for html output.
- (efhq_format_message): output headers and part directly, bypassing
- parent format_message.
- (efhq_format_message): implement hide_headers.
-
- * em-format-html.c (efh_busy): implement busy.
- (efh_format_message): implement simple_headers option.
- (efh_format_text_header): implement simple_headers option.
- (efh_format_message): move the header formatting stuff into
- exported em_format_html_format_headers.
- (efh_format_message): only output headers if not hidden.
-
- * em-format.c (emf_busy): base implementation of a new virtual
- method, returns TRUE if the object is still busy
- rendering/downloading stuff.
-
- * em-utils.c (em_utils_message_to_html): renamed from
- em_utils_quote_message. Also make sure the html conversion is
- complete before getting the data.
- (em_utils_part_to_html): similar, but for parts.
- (composer_set_body): put in David Woodhouse's timezone in
- attribution patch.
- (composer_set_body): we want to quote the part (content), we don't
- want message headers.
- (em_utils_message_to_html): add a 'show headers' argument.
-
- * folder-browser-factory.c (control_activate): removed.
- (control_deactivate): removed.
-
- * mail-identify.c:
- * folder-browser.[ch], folder-browser-ui.[ch]:
- * mail-callbacks.[ch], mail-search.[ch]:
- * mail-display.[ch], mail-format.[ch], mail-display-stream.[ch]:
- * message-browser.[ch]: Removed, fixed all users.
-
- * component-factory.c (factory): change callbacks to em_utils
- ones.
- (configure_folder_popup): comment out some of the reconfigure
- stuff. Wont have it in 1.6?
- (handle_external_uri_cb): use em_utils stuff.
- (user_create_new_item_cb): "
- (owner_unset_cb): "
-
- * em-composer-utils.c (composer_send_cb): rename to
- em_utils_composer_send_cb, and export, sigh, needed for factory.
- (composer_save_draft_cb): Same.
-
-2003-09-05 Not Zed <NotZed@Ximian.com>
-
- * em-format.c (type_builtin_table[]): Add a fallback multipart/*
- for other types (e.g. multipart/report)
- (em_format_fallback_handler): fix some bad logic.
-
- * em-folder-browser.c: track the pane size if the user changes it.
- (emfb_set_folder): Added a bit of a mess that will select the
- first unread message the first time you visit a folder.
- (emfb_destroy): impelment. clear up outstanding signal handlers.
- (emfb_list_built): Select the first unread message. this isn't
- entirely reliable as yet, and not configurable at all.
-
- * em-format-html-display.c (em_format_html_display_set_animate)
- (em_format_html_display_set_caret_mode): guess? :)
- (efhd_attachment_button): dont desensitise the button, just dont
- hook onto it, otherwise it looks fugly.
-
- * em-folder-view.c (emfv_list_done_message_selected): dont lookup
- gconf values every time. use g_timeout_add rather than
- gtk_timeout, remove fixme's.
- (emfv_setting_notify): listner for gconf changes, reflect
- internally.
- (emfv_setting_setup): setup listner for gconf, and read initial
- settings.
- (emfv_activate): use local copy of settings rather than snooping
- gconf.
- (emfv_caret_mode): propagate caret-mode to display
-
- * em-format-html-quote.c (efhq_format_message): remove gconf
- stuff, our parent already has citation colour.
-
- * em-format-html.c (efh_format_timeout): remove gconf stuff.
- (em_format_html_set_load_http, em_format_html_set_mark_citations):
- set options on formatter, re-renders if required.
- (type_builtin_table[]): text/* should go to text/plain, not
- text/enriched.
-
-2003-09-04 Not Zed <NotZed@Ximian.com>
-
- * em-utils.c (confirm_expunge): rename it to emu_confirm_expunge
- and remove leading whitespace before function.
- (em_utils_expunge_folder): we want to expunge the folder, not
- empty the trash. Jeff didn't even run this once ...
-
- * em-popup.c: Lots of new features, 'global' popup menu's on a
- per-selection type, via factories, popup selections (targets), a
- standard factory for many menu items.
- (emp_apps_open_in): duh, fix uri using logic
- (emp_standard_menu_factory): only add apps to app list if
- !requires_terminal.
-
- * em-format-html-display.c (efhd_open_in, efhd_popup_free_items):
- moved to em-popup.c
- (efhd_popup_save_attachment, efhd_popup_save_message)
- (efhd_popup_reply_sender, efhd_popup_reply_list)
- (efhd_popup_reply_all, efhd_popup_forward): (re)moved to em-popup.c
- (efhd_attachment_popup): use enew popu stuff.
- (efhd_attachment_button): Scale the icons for mime-type icons.
-
- * em-folder-view.c (em_folder_view_disable_mask): removed
- ... moved to em-popup.
- (em_folder_view_get_popup_target): new method, get the selection
- target for the folder view.
- (emfv_html_popup_saveas, emfv_html_popup_link_open)
- (emfv_html_popup_link_copy, emfv_html_popup_address_send)
- (emfv_html_popup_address_add, emfv_format_popup_free_items): moved
- to em-popup.c
- (emfv_format_popup_event): use new popup stuff.
- (emfv_popup): use new popup stuff, but still just use all local
- menu's.
-
-2003-09-03 Not Zed <NotZed@Ximian.com>
-
- * em-folder-view.c (emfv_format_popup_event): implement, a popup
- menu for right-clicking on links and images.
- (emfv_html_popup_link_copy): implement.
- (emfv_init): setup an invisible for selection stuff.
- (emfv_destroy): free invisible
-
- * em-utils.c (em_utils_get_proxy_uri): utility to get the current
- system proxy setting.
- (emu_set_proxy): implementation.
-
- * em-camel-stream.[ch]: removed.
-
- * em-format-html.c (efh_url_requested, efh_format_timeout): use
- em_html_stream rather than em_camel_stream.
- (emfh_gethttp): set the system proxy on the new stream.
- (emfh_multipart_related_check): use puri rather than purin inside
- the loop - duh.
- (emfh_multipart_related_check): removed 'unrelated part' warning,
- they can be (and normally are) added by the callbacks.
-
- * em-format-html.h (EMFormatHTMLJob): s/estream/stream/
-
- * em-html-stream.[ch]: New subclass of emsyncstream, replacement
- for em-camel-stream.
-
-2003-09-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-browser.c (emfb_folder_expunge): Call
- em_utils_expunge_folder instead.
-
- * em-utils.c (em_utils_expunge_folder): New function.
- (confirm_expunge): Make private.
-
-2003-09-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-browser.c (emfb_folder_expunge): Confirm hat the user
- wants to expunge.
- (emfb_empty_trash): Implemented.
-
- * em-utils.c (em_utils_prompt_user): Make public (used to be
- e_question).
- (em_utils_confirm_expunge): New function to confirm that the user
- wants to expunge.
- (em_utils_empty_trash): New function to empty all Trash folders.
-
- * em-composer-utils.c: Get rid of e_question and use em-utils'
- em_utils_prompt_user() function instead.
-
- * em-format-html-quote.[c,h]: New formatter for quoting
- replies/forwards/etc.
-
- * em-utils.c (em_utils_quote_message): New function.
- (composer_set_body): Use the new em_utils_quote_message()
- function.
- (em_utils_temp_save_part): Only g_free mfilename if it was
- malloc'd.
-
- * mail-tools.c (mail_tool_quote_message): Removed.
- (mail_tool_forward_message): Removed.
-
-2003-09-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-format.c (em_format_class_remove_handler): New function to
- remove a mime-type handler from a class.
-
- * em-format-html.c (efh_init): Set the CITATION bit for the
- default html flags.
-
- * em-format-html-display.c: Fixed some compiler warnings by adding
- appropriate includes.
- (efhd_multipart_signed): Don't write "inlined signature...".
-
-2003-09-03 Not Zed <NotZed@Ximian.com>
-
- * em-icon-stream.[ch]: New subclass of emsyncstream, write camel
- stream one side, creates an icon on the other.
-
- * em-sync-stream.[ch]: New file, an abstract class for creating
- write-any-thread-act-gui-thread stuff. 'em-camel-stream' will
- subclass this.
-
- * em-format-html-display.c (efhd_attachment_button): setup a job
- to write out an icon if the type is an image type, otherwise try
- and get the icon directly. no caching yet. the system icons
- aren't scaled properly either.
- (efhd_write_icon_job): async job to write out image content.
-
-2003-09-02 Not Zed <NotZed@Ximian.com>
-
- * em-format-html.c (emfh_new_job): renamed to
- em_format_html_job_new and made public.
- (emfh_queue_job): renamed to em_format_html_job_queue, and made
- public.
-
- * em-format-html.h: Made EMFormatHTMLJob a public structure.
-
-2003-09-02 Not Zed <NotZed@Ximian.com>
-
- * em-folder-view.h (struct _EMFolderView): track the uicomponent
- while we're activated.
-
- * em-message-browser.c (em_message_browser_window_new): kill
- warning.
- (emmb_init, emmb_finalise): kill printf
-
- * em-format-html.c (efh_format_header): Converted code from head
- from David Woodhouse <dwmw2@infradead.org>'s timezone display
- patch.
- (efh_format_text_header): support new flag, HEADER_HTML - header
- alredy in html format.
-
- * em-format-html-print.c (em_format_html_print_print): only ref
- print_config if != NULL.
-
- * em-folder-browser.c (emfb_tree_key_press): handle
- space/backspace in messagelist to scroll the message view.
- (emfb_create_view_menus): setup view menu's, this should probably
- live in message-list.
- (emfb_init): setup the folderbrowser enable map into the list.
- (emfb_enable_map): folder browser enable map
-
- * em-utils.c (em_utils_adjustment_page): new helper to scroll an
- adjustment up/down 1 page.
-
- * em-folder-view.c (emfv_list_double_click): implement, open
- window.
- (emfv_list_key_press): implement keybinding overrides. Enhance
- delete key to undelete if everything is already deleted.
- (emfv_build_enable_mask): separate out enable mask creation.
- (emfv_popup): use above to get mask.
- (emfv_enable_menus): enable/sensitize menus, use the same disable
- mask system as used for the popups.
- (emfv_destroy): change to use g_source_remove on seen_id.
- (emfv_finalise): free up folders, clean up async event thing.
- (emfv_init): setup an async event handler
- (emfv_set_folder): handle hook/unhook of folder_changed events.
- (emfv_folder_changed): proxy folder changed to main thread, ignore
- the details of what changed.
- (emfv_gui_folder_changed): update the menu's to reflect any folder
- changes.
- (emfv_build_disable_mask): added CAN_THREADED.
- (em_folder_view_disable_mask): make public (rename from
- emfv_build_disable_mask).
- (emfv_enable_menus): changed to work on a list of arrays of
- enablers, so they can be subclassed.
- (emfv_init): add our enable map to the ui.
- (em_folder_view_disable_mask): added support for can hidden (there
- are hidden messages).
-
-2003-09-01 Not Zed <NotZed@Ximian.com>
-
- * em-popup.c: New, simple menu-merging popup menu implementation.
- NOTE: should be temporary, but needs something that has similar
- merging facilities.
-
- * em-folder-view.c (emfv_popup*): added popup callbacks, implement
- a popup menu, using em_popup.
- (emfv_message_*): replaced a whole bunch of one-line, or simple
- functions with macro's to map to the popup implementation.
- (emfv_tools_vfolder*, emfv_tools_filter*): map to popup
- equivalents.
- (emfv_init): drop printf
-
- * em-format-html-display.c (efhd_attachment_popup): use the
- em_popup stuff to build a dynamic menu.
-
- * em-utils.c (em_utils_temp_save_part): change assignment order ot
- kill warning.
- (emu_get_save_filesel): handle null/empty name by appending / to
- the filename.
-
-2003-08-30 Not Zed <NotZed@Ximian.com>
-
- * mail-search.glade: forgot to add this yesterday.
-
- * em-utils.h: don't include stuff we dont need to.
-
- * em-folder-view.c (emfv_message_forward): just call
- em_utils_forward_messages.
-
- * em-format-html-display.c (em_format_html_display_search):
- removed unused.
- (efhd_drag_data_get): cleanup, use em_utils_temp_save_part.
- (efhd_attachment_popup): quick hack, setup a bunch more menu
- items, for forwarding inline messages, hook up saving parts, and
- messages, and hook up the 'open in' menu.
- (efhd_open_in): implement.
-
- * em-utils.c (em_utils_save_message): Renamed to
- em_utils_save_part.
- (em_utils_filesel_prompt): removed, it just makes things more
- complex than having a single response handler.
- (em_utils_save_part): move dialog stuff here, it also creates a
- name based on the type of part its given.
- (emu_get_save_filesel): new method to create a fileselector with
- standard options.
- (emu_save_part_response): handle file selector response for save
- part.
- (can_save): renamed to emu_can_save
- (em_utils_save_messages): use get_save_filesel
- (emu_can_save): handle the path="" case
- (em_utils_save_part): Add a prompt argument.
- (filesel_ok_cb): removed.
- (emu_update_save_path): update the gconf save_dir setting.
- (em_utils_forward_messages): helper to forward using default
- style.
- (forward_non_attached): remove uids argument.
- (em_utils_forward_message): helper to forward a message using the
- default forward style.
- (forward_non_attached): removed folder argument.
- (em_utils_temp_save_part): helper to save a part to a temporary
- file, e.g. for dnd, app launch, etc.
-
-2003-08-29 Not Zed <NotZed@Ximian.com>
-
- * em-folder-view.c: set 'outgoing' properly.
-
- * em-folder-browser.c (emfb_tools_subscriptions): enforce a single
- instance of the subscribe editor.
- (emfb_subscribe_editor_destroy): clear subscribe editor handle.
-
-2003-08-29 Not Zed <NotZed@Ximian.com>
-
- * em-camel-stream.c (em_camel_stream_new): Added some optional
- logging code.
- (stream_close): and here.
- (stream_write): and here.
-
- * em-folder-browser.c (emfb_init): remove fixme about search bar,
- its there now. also fixme's about dnd/selection, they are handled
- in lower-level widgets.
- (em_folder_browser_show_preview): dont exit if show preview set,
- but only if it hasn't changed.
- (emfb_view_hide_selected, emfb_view_show_all)
- (emfb_view_hide_read): removed some spurious printfs.
-
- * Makefile.am (glade_DATA): Added mail-search.glade. FIXME:
- should all glade files be merged into 1?
-
- * em-format-html-display.c (efhd_format_clone): remove search
- match count code from here - wont be finished rendering at this
- point anyway.
- (em_format_html_display_search): new api for running an
- interactive search popup.
- (efhd_update_matches, efhd_update_search)
- (efhd_search_entry_activate, efhd_search_case_toggled)
- (efhd_search_response): helpers/callbacks for search popup.
- (efhd_class_init): hook into complete signal on EMFormat.
- (efhd_complete): complete rendering handler, update match count.
-
- * em-folder-view.c: removed fixme about api's - yes, do need two
- set_folder api's.
- (emfv_edit_cut, emfv_edit_copy): removed printfs
- (emfv_edit_paste): removed commented call to html_paste, we never
- want to do that.
-
-2003-08-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-view.c (emfv_message_mark_unread): If there is a
- mark-as-read timeout handler registered, unregister it here.
- (emfv_tools_filter_mlist): Implemented.
- (emfv_tools_filter_recipient): Implemented.
- (emfv_tools_filter_sender): Implemented.
- (emfv_tools_filter_subject): Implemented.
- (emfv_tools_vfolder_mlist): Implemented.
- (emfv_tools_vfolder_recipient): Implemented.
- (emfv_tools_vfolder_sender): Implemented.
- (emfv_tools_vfolder_subject): Implemented.
-
-2003-08-28 Not Zed <NotZed@Ximian.com>
-
- * em-folder-browser.c (emfb_search_menu_activated)
- (emfb_search_config_search, emfb_search_search_activated)
- (emfb_search__query_changed): Implement search-bar callbacks.
- (emfb_init): setup search bar.
-
-2003-08-28 Not Zed <NotZed@Ximian.com>
-
- * em-folder-view.c (emfv_message_reply): common reply code entry
- point, also implement simple reply-to-highlighted text (currently
- disabled).
- (emfv_activate): disable resend message on non-sent folders.
- (emfv_message_reply_all, emfv_message_reply_list)
- (emfv_message_reply_sender): use message_reply for common code.
- (em_folder_view_open_selected): in drafts or outbox, edit the
- message instead.
- (emfv_activate): force a sync on deactivate.
-
- * em-utils.c (em_utils_selection_get_mailbox): get mailbox
- (message/rfc822?) selection data.
- (em_utils_read_messages_from_stream): helper to move stuff from a
- mbox stream to a folder.
- (em_utils_folder_is_drafts, em_utils_folder_is_sent)
- (em_utils_folder_is_outbox): from folder browser helpers for
- customising the user experience.
-
- * message-list.c (message_list_construct): hook onto dnd stufd.
- (ml_tree_drag_data_get): implement drag sending.
- (ml_tree_drag_data_received): implement drag recieving.
-
- * em-format-html-display.c (efhd_drag_data_get): implemented.
- (efhd_drag_data_delete): implemented.
- (efhd_attachment_button): setup dnd callbacks.
-
-2003-08-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-view.c (emfv_destroy): override the destroy method for
- GtkObject - unregister the mark-as-seen timeout if one is
- currently registered.
- (emfv_list_done_message_selected): Add the mark-as-seen timeout
- functionality here.
- (emfv_format_link_clicked): Implemented.
-
-2003-08-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-utils.c (get_reply_list): Implemented.
-
-2003-08-27 Not Zed <NotZed@Ximian.com>
-
- * em-message-browser.c (emmb_activate): disable Edit->Paste menu
- always.
-
- * em-folder-browser.c (emfb_edit_paste): do a message-list paste,
- not a html one.
- (emfb_edit_cut, emfb_edit_copy, emfb_edit_paste): Moved to folder-view.
-
- * message-list.c (message_list_paste): trigger a paste action.
- (message_list_set_folder): added a uri argument, and save it
- internally, fixed all callers.
- (message_list_finalise): free the folder uri.
-
- * em-utils.c (em_utils_selection_set_mailbox): New helper to set
- the current selection as text in a berkely mailbox format.
- (em_utils_write_messages): helper to write stuff to a stream in
- mbox format.
-
-2003-08-27 Not Zed <NotZed@Ximian.com>
-
- * message-list.c (on_selection_changed_cmd): own/deown the primary
- selection when it changes.
- (message_list_init): init private data and invisible for
- selection.
- (message_list_destroy): free invisible.
- (message_list_finalise): free private data.
- (get_selected_cb): removed.
- (message_list_copy): new method to do copy and cut. cut/copy to
- the clipboard.
- (ml_selection_clear_event): clear the right selection when
- requested.
- (message_list_has_primary_selection): helper to find out if the
- message-list has the selection. is there a gtk way for this?
-
-2003-08-26 Not Zed <NotZed@Ximian.com>
-
- * mail-local.c (mlf_meta_set, mlf_meta_get): proxy meta-data stuff
- to subservient folder.
-
-2003-08-23 Not Zed <NotZed@Ximian.com>
-
- * em-folder-view.c (emfv_init): init preview here always.
-
-2003-08-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-view.c (em_folder_view_print): Use
- e_dialog_set_transient_for().
- (emfv_message_delete): Fixed a FIXME.
-
- * em-folder-browser.c (emfb_edit_cut): Implemented.
- (emfb_edit_copy): Implemented.
- (emfb_edit_paste): Implemented.
-
- * em-format-html-display.c (em_format_html_display_cut): New function.
- (em_format_html_display_copy): New.
- (em_format_html_display_paste): New.
-
-2003-08-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-utils.c (em_utils_flag_for_followup): Use
- e_dialog_set_transient_for().
- (em_utils_filesel_prompt): Same.
- (post_reply_to_message): Here too.
- (em_utils_edit_filters): Same.
- (create_new_composer): And here.
- (em_utils_compose_new_message_with_mailto): Here too.
- (em_utils_post_to_url): "
- (redirect_get_composer): Same.
- (reply_get_composer): Again...
-
- * em-folder-browser.c (emfb_tools_filters): Implemented.
-
- * em-utils.c (em_utils_edit_filters): New function to open the
- filter editor dialog.
-
-2003-08-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-utils.c (em_utils_flag_for_followup): Implemented.
- (em_utils_flag_for_followup_clear): Implemented.
- (em_utils_flag_for_followup_completed): Implemented.
-
- * em-folder-view.c (emfv_message_followup_flag): Implemented.
- (emfv_message_followup_clear): Implemented.
- (emfv_message_followup_completed): Implemented.
-
-2003-08-22 Not Zed <NotZed@Ximian.com>
-
- * em-camel-stream.c (em_camel_stream_new): now take the gtkhtml
- too, and hook onto it's destroy so we don't try writing anymore
- after its gone.
- (stream_write, stream_flush, stream_close, emcs_gui_received):
- NOOP if the gtkhtml has been destroyed.
- (emcs_gtkhtml_destroy): null out the stream when the gtkhtml gets
- destroyed, it is no longer valid.
- (emcs_gui_received): dont try to soak all outstanding events, it
- always runs synchronous anyway, just get one and exit.
-
- * em-format-html.c (efh_gtkhtml_destroy): if the gtkhtml gets
- destroyed, abort any pending timeouts/processing.
- (efh_format_source): fixed implementation to write out all
- headers.
- (efh_multipart_related, emfh_multipart_related_check): separate
- checking for unused parts into a separate job, which is run after
- previous ones are executed. keep track of visibility tree level
- in job, etc.
-
-2003-08-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-browser.c (emfb_mail_compose): Implemented.
- (emfb_mail_post): Implemented.
-
- * em-utils.c (em_utils_compose_new_message): New function.
- (em_utils_compose_new_message_with_mailto): New.
- (em_utils_post_to_url): New.
-
-2003-08-21 Not Zed <NotZed@Ximian.com>
-
- * subscribe-dialog.glade: removed the text in the progress thing.
- It never showed up anyway and caused weird resizing stuff when the
- progress bar was active.
-
- * em-subscribe-editor.c: Found the correct version of the new
- subscribe code (on branch, duh!), and integrated it.
- (sub_selection_changed): Sensitise buttons based on selection.
-
- * em-format-html.c (efh_text_plain, efh_text_enriched)
- (efh_write_text_html): Use format_text for text output.
- (efh_write_image): use explicit image writer.
- (emfh_gethttp): added some progress stuff.
- (efh_format_do): maintain the accessible uri tree during jobs.
- (efh_url_requested): store the current uri accessibility tree node
- in the job, so it can be properly set for sub-jobs.
- (emh_multipart_related): moved here, can't use super-class version
- as it doesn't know about async jobs.
- (type_buildin_table[]): Added image/jpg and image/jpeg for the
- brokenmailers out there and to reduce the whinge.
-
- * em-format.c (em_format_format_content): For text parts, perform
- default charset/charset snooping/decoding. No longer closes the
- stream once complete.
- (emf_write_related): close stream ourselves.
-
-2003-08-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-folder-view.c (emfv_message_forward): Implemented.
- (emfv_message_forward_attached): Implemented.
- (emfv_message_forward_inline): Implemented.
- (emfv_message_forward_quoted): Implemented.
- (emfv_message_redirect): Implemented.
- (emfv_message_post_reply): Implemented.
- (emfv_message_reply_all): Implemented.
- (emfv_message_reply_list): Implemented.
- (emfv_message_reply_sender): Implemented.
- (emfv_message_resend): Implemented.
- (emfv_message_saveas): Implemented.
-
- * em-composer-utils.c: New source file containing all the composer
- send/draft callback mess.
-
- * em-utils.c (em_utils_uids_copy): New convenience function to
- copy a list of uids.
- (em_utils_uids_free): New convenience function to free a list of
- uids.
- (em_utils_save_message): New function to save a CamelMimeMessage
- (prompts the user for a location to save).
- (em_utils_save_messages): New function to save a list of messages
- (given a folder and list of uids).
- (em_utils_configure_account): Configure a new account...
- (em_utils_check_user_can_send_mail): Make sure the user has a
- transport setup.
- (em_utils_edit_message): New function to edit a message object.
- (em_utils_edit_messages): New function to open a composer to edit
- each message.
- (em_utils_forward_attached): New function to forward messages as
- an attachment,
- (em_utils_forward_inline): Forward a bunch of messages inline.
- (em_utils_forward_quoted): Forward a bunch of messages quoted.
- (em_utils_redirect_message): Redirect a message object.
- (em_utils_redirect_message_by_uid): Redirect a message given a
- folder and uid.
- (em_utils_reply_to_message): Reply to a message object.
- (em_utils_reply_to_message_by_uid): Reply to a message given a
- folder and uid.
- (em_utils_post_reply_to_message_by_uid): Post a reply to a message
- given a folder and uid.
-
- * mail-ops.c (filter_folder_free): Use em_utils_uids_free().
- (transfer_messages_free): Same.
- (get_messages_free): Here too.
- (save_messages_free): Same.
-
-2003-08-20 Not Zed <NotZed@Ximian.com>
-
- * em-subscribe-editor.[ch]: new widget, a dialog for editing
- subscriptions.
-
- * em-format-html.c (efh_format_done): emit a complete when done.
-
- * em-format.c (emf_class_init): Added a 'complete' signal, so that
- printing knows when to print.
-
- * em-format-html-print.c (em_format_html_print_print): Changed to
- take the message and source formatter too. Runs an async render
- then prints.
-
-2003-08-19 Not Zed <NotZed@Ximian.com>
-
- * em-*.c: stacks more changes, added some bonobo menu setup, and
- implemented the trivial functions.
-
- * em-message-browser.[ch]: New message browser, inherits from
- em-folder-view. Basically works.
-
- * message-list.c (message_list_select_uid): if we're selecting
- while still loading, setup a pending select.
- (regen_list_free): Check for a pending select, and select the
- message if we're now idle.
-
- * em-folder-view.c (em_folder_view_set_message,
- em_folder_view_set_folder): Make virtual macro's.
- (emfv_control_activate): added hook to enable bonobo state when setup.
-
- * em-format.c (emf_format_clone): base implementation, just clears
- state data.
-
- * em-format.h: change ::format to ::format_clone. Make
- em_format_format_clone a macro/virtual method.
-
- * mail-mt.c (em_channel_setup): new function to setup i/o
- channels, so we can control the recursive flag. leave off for
- now.
- (mail_msg_init): setup MsgPort channels using above.
-
- * em-format-html.c (efh_format): serialise/de-recursify formatting
- via a timeout function.
- (efh_format_timeout): keep polling to find out if cancellation is
- complete, then kick off a new render.
-
-2003-08-18 Not Zed <NotZed@Ximian.com>
-
- * em-*.c: more updates, incl threaded formatting queue.
-
-2003-08-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-format-html-display.c (em_format_html_display_zoom_in): New
- method to zoom-in on the gtkhtml contents.
- (em_format_html_display_zoom_out): Same but for zoom-out
- (em_format_html_display_zoom_reset): You get the idea.
-
-2003-08-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (invert_selection): Use
- message_list_invert_selection().
- (select_thread): Use message_list_select_thread().
- (select_all): Use message_list_select_all().
-
- * message-list.c (message_list_select_all): New function.
- (message_list_select_thread): New function.
- (message_list_invert_selection): New function.
-
-2003-08-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-session.c: Synced up with HEAD.
-
- * component-factory.c:
-
- * mail-folder-cache.[c,h]:
-
- * mail-tools.h:
-
- * mail-ops.[c,h]:
-
- * mail-send-recv.c:
-
- * mail-format.[c,h]:
-
- * mail-display.c:
-
- * mail-account-gui.c:
-
- * mail-local.c:
-
- * mail-offline-handler.c:
-
- * subscribe-dialog.c:
-
-2003-08-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * em-format-html-display.c: Fixed some compiler warnings.
-
- * em-format.c: Updated for new mime-parser changes made to HEAD.
-
- * em-folder-view.c: Fixed some compiler warnings.
-
- * em-format-html.c: Fixed some compiler warnings.
-
-2003-08-06 Not Zed <NotZed@Ximian.com>
-
- * em-format-html-display.c (efhd_format_attachment): Added bonobo
- embeddables.
-
-2003-08-01 Harry Lu <harry.lu@sun.com>
-
- *Fix for bug #6951
-
- * mail-display.c (launch_cb): Bypass the new added menu item.
- (save_all_parts_cb): New function. Do the real save-all work.
- (save_all_parts): New function. Get the directory to save to.
- (save_all_cb): New function. The call-back function for the new
- added menu item.
- (pixmap_press): Add the new menu item "Save All Attachment...".
- (ptr_array_free_notify): A simple wrapper function to free the
- pointer array.
- (do_attachment_header): Save attachment pointer in an array for
- "Save All Attachment" use.
-
-2003-08-01 Yuedong Du <yuedong.du@sun.com>
-
- * message-browser.c (on_key_press): close mail message window
- using 'ESC' key, fix bug #47087
-
-2003-07-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-crypto.c: Removed smime functions as they were stale.
-
-2003-07-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-browser.c (message_browser_new): Handle our own Delete
- key presses. Fixes bug #45597.
-
-2003-07-25 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-callbacks.c (do_view_message): No need to pass a shell
- argument to message_browser_new() anymore.
-
- * message-browser.c (message_browser_new): Removed arg shell. No
- need to pass it to folder_browser_new() either.
-
- * mail-component.c (create_view_callback): No need to pass a shell
- arg to folder_browser_factory_new_control() anymore.
-
- * folder-browser-factory.c (folder_browser_factory_new_control):
- Removed arg shell; folder_browser_browser_new() doesn't need it
- anymore.
-
- * folder-browser.c (folder_browser_destroy): No need to unref
- ->shell anymore.
- (folder_browser_new): Removed shell arg.
- (folder_browser_gui_init): Removed a const qualifier that was not
- supposed to be there.
-
- * folder-browser.h: Removed member shell from struct
- FolderBrowser.
-
-2003-07-25 Ettore Perazzoli <ettore@ximian.com>
-
- * folder-browser.c (folder_browser_gui_init): Get the search
- context through mail_component_peek_search_context(), since it's
- no longer a global variable.
- (folder_browser_gui_init): Cleaned up an extra unneeded if()
- statement.
-
- * mail-component.c: New member search_context in struct
- MailComponentPrivate.
- (mail_component_peek_search_context): New.
- (setup_search_context): New function to initialize the
- search_context, based on the old code in component-factory.c.
- (mail_component_init): Call it here.
- (impl_dispose): Unref the rule_context.
-
- * mail-component-factory.c: Removed global variable
- search_context.
-
-2003-07-25 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-component.c (browser_page_switched_callback): New callback
- for the "page_switched" signal on EStorageBrowser; deactivate the
- previous page, activate the new one.
- (impl_createControls): Connect.
-
-2003-07-24 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-mt.c (do_op_status): Pass "evolution-mail" as the ID to
- evolution_activity_client_new(). [This is just a temporary thing
- to avoid the fact that we don't have component-factory.h anymore.
- Eventually we'll just get rid of the activity client stuff.]
-
- * mail-component-factory.c: Added to the build. Also, finished
- implementing and moving the factory over from component-factory.c.
-
- * component-factory.c: Removed from the build.
- * component-factory.h: Removed from the build.
-
- * mail-component.c: Removed some debugging messages.
-
-2003-07-23 Ettore Perazzoli <ettore@ximian.com>
-
- * subscribe-dialog.c: Converted to use EStorages instead of
- EvolutionStorages and the new MailComponent object.
-
- * mail.h: Nuked a bunch of stuff. This will go away when I am
- done refactoring.
-
- * mail-offline-handler.c: Use the new MailComponent object.
-
- * mail-folder-cache.c, mail-folder-cache.h: Converted to use
- EStorages instead of EvolutionStorages.
-
- * mail-display.c: Use g_timeout and g_source functions instead of
- gtk_timeout functions.
-
- * mail-send-recv.c: Use g_timeout and g_source functions instead
- of gtk_timeout functions.
- (receive_update_got_store): Updated for the new mail_note_store().
-
- * mail-session.c: Use g_timeout and g_source functions instead of
- gtk_timeout functions.
-
- * mail-config-factory.c (factory): Removed.
-
- * folder-browser.c (folder_browser_destroy): Use GLib
- timeout/source functions instead of the deprecated GTK ones.
- (done_message_selected): Likewise.
- (folder_browser_gui_init): Protect against fb->search being NULL.
-
- * mail-account-gui.c (add_new_store): Use new MailComponent object
- and EStorages instead of EvolutionStorages.
- (mail_account_gui_save): Likewise.
-
- * mail-accounts.c (account_delete_clicked): Use new MailComponent
- object and EStorages instead of EvolutionStorages.
- (account_able_clicked): Likewise.
- (account_able_toggled): Likewise.
-
- * mail-autofilter.c: Use mail_component_peek_base_directory()
- instead of the evolution_dir global.
- * mail-callbacks.c: Likewise.
- * mail-config.c (uri_to_evname): Likewise.
- (mail_config_get_signature_list): Likewise.
- (delete_unused_signature_file): Likewise.
- * mail-display.c (mail_display_class_init): Likewise.
- * mail-importer.c (mail_importer_make_local_folder): Likewise.
- * mail-local.c (mlf_getv): Likewise.
- * mail-ops.c (uid_cachename_hack): Likewise.
- * mail-summary.c (generate_folder_summaries): Likewise.
- * mail-tools.c (mail_tool_get_local_inbox): Likewise.
- (mail_tools_folder_to_url): Likewise.
- * mail-vfolder.c (mail_vfolder_delete_uri): Likewise.
- (mail_vfolder_rename_uri): Likewise.
- (context_rule_removed): Likewise.
- (store_folder_deleted): Likewise.
- (store_folder_renamed): Likewise.
- (vfolder_load_storage): Likewise.
- (vfolder_editor_response): Likewise.
- (edit_rule_response): Likewise.
- (new_rule_clicked): Likewise.
- (vfolder_gui_add_rule): Likewise.
- * mail-session.c (main_get_filter_driver): Likewise.
- (mail_session_forget_password): Likewise.
- (mail_session_init): Get a base_directory arg.
-
- * component-factory.c, component-factory.h: Disabled a bunch of
- stuff to get it to compile in the new configuration. These files
- will eventually go away when I am done refactoring this.
-
- * Makefile.am: Do not build importers, compile generate
- skels/stubs for Evolution.
-
- * GNOME_Evolution_Mail.server.in.in: Rename control factory to
- OAFIID:GNOME_Evolution_Mail_Factory2. Add new component
- GNOME_Evolution_Mail_Component2.
-
- * mail-component-factory.c: New file implementing the Bonobo
- factory.
-
- * mail-component.c, mail-component.h: New files implementing the
- new mail component, using the new Evolution::Component IDL.
-
-2003-07-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (mail_format_data_wrapper_write_to_stream): Revert
- prior changes.
-
-2003-07-23 Dan Winship <danw@ximian.com>
-
- * folder-browser.c (message_list_drag_data_get): Fix type warnings
- (folder_browser_toggle_caret_mode): Remove unused variable.
-
- * folder-browser-ui.c (basename): remove unused function
-
- * mail-account-gui.c (mail_account_gui_build_extra_conf): Fix
- warnings
-
- * mail-callbacks.c (empty_trash): Remove unused variable.
-
- * mail-display.c: #include gal/widgets/e-gui-utils.h for
- e_auto_kill_popup_menu_on_selection_done
-
- * mail-importer.c: #include e-util/e-path.h for e_path_to_physical
-
- * mail-session.c (main_play_sound): don't declare filename to be
- const and then free it.
-
- * mail-vfolder.c (vfolder_edit_rule, vfolder_gui_add_rule): Fix
- casts
-
- * message-list.c (build_flat_diff): Fix a typo in the
- non-BROKEN_ETREE code
-
-2003-07-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (handle_multipart_encrypted): We don't have
- camel_pgp_mime_is_rfc2015_encrypted() anymore so just look at the
- protocol for now.
- (mail_format_data_wrapper_write_to_stream): Updated for the new
- way camel handles content objects.
-
-2003-07-15 Federico Mena Quintero <federico@ximian.com>
-
- * folder-browser.c (message_list_drag_data_received): Handle
- invalid URIs, or more likely, the last empty element in a URI list
- --- g_strsplit() will yield { "uri1", "", NULL }. Fixes #46398.
-
- * component-factory.c (destination_folder_handle_drop): Likewise.
-
-2003-07-15 Yuedong Du <yuedong.du@sun.com>
-
- * mail-config.c: (config_write_style), (mail_config_init): remove
- the use of caret mode widget style.
- * mail-display.c: (display_notify), (mail_display_new): use new
- gtkhtml api to set caret mode.
-
-2003-07-11 Antonio Xu <antonio.xu@sun.com>
-
- * folder-browser-ui.c: Change the EditPaste mask to IS_0MESSAGE so
- that it is always activatable. Fixes bug #46018.
-
-2003-07-04 Maxx Cao <maxx.cao@sun.com>
-
- ** For bug #41839
-
- * mail-display.c (do_attachment_header): Attachment buttons made
- accessable with keyboard (focusable). "Inline" button is disabled
- when attachment can't be viewed inline.
- (do_signature): Signature button made accessable with keyboard
- (focusable).
- (button_press): Function changed to an event callback (originally
- gtkbutton signal callback).
- (popup_menu_placement_callback): Function added to place popup
- menu (of attachment) beside button when activated by keyboard.
-
-2003-07-10 Yuedong Du <yuedong.du@sun.com>
-
- * evolution-mail.schemas: add a gconf key corresponding to newly
- introduced caret mode of gtkhtml widget.
-
- * folder-browser-ui.c: new verb handling, corresponding the new menu
- entry for the caret mode flag.
-
- * folder-browser.h: declaration of new verb handler to the menu entry
- that turn caret mode on/off. The function just set the new introduced
- gconf key.
-
- * folder-browser.c: ditto
-
- * mail-config.c: lstione to the new gconf key, and when caret mode
- flag is set/unset,change the style of gtkhtml widget. see bug
- #44607.
-
-2003-07-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-crypto.h: Removed camel-pgp-mime.h, it no longer exists.
-
- * mail-format.c: Remove camel-pgp-mime.h
-
-2003-07-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): Use
- camel_strcase_hash/equal.
-
- * upgrade-mailer.c: Updated to use the camel-file-utils version of
- mkdir.
-
-2003-07-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-tools.c (mail_tool_forward_message): Strip the signature
- from the body text. Fixes bug #45523. While we're here, also fix
- the code to quote exactly the same way as the
- mail_tool_quote_message() function.
- (mail_tool_quote_message): The last arg should not be
- 'want_plain', because that arg is for whether or not the body
- should be quoted.
-
- * folder-browser.c (message_list_drag_data_get): Apply a
- From-filter when dragging as a test/uri-list and
- message/rfc822. Fixes bug #45617. Also free the uids ptrarray for
- the text/uri-list case.
-
-2003-07-01 Dan Winship <danw@ximian.com>
-
- * mail-display.c (pixbuf_for_mime_type): Gone
- (pixbuf_gen_idle): Use e_icon_for_mime_type instead.
-
-2003-06-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (filter_date): Use the newer utf8 versions of the
- e_strftime*() functions since our format strings are all now in
- UTF-8.
-
- * mail-display.c (mail_display_render): Use the newer
- e_utf8_strftime_fix_am_pm().
-
- * mail-callbacks.c (mail_generate_reply): Use e_utf8_strftime(),
- otherwise we can end up with invalid utf-8.
-
-2003-06-25 Radek Doulik <rodo@ximian.com>
-
- * mail-config.c (config_write_style): provide hardcoded default
- (red) spell error color
-
-2003-06-24 Jeffrey Stedfast <fejj@ximian.com>
-
- Might fix bug #45368 but I wouldn't bet on it.
-
- * message-browser.c (message_browser_new): Record the signal id
- for folder_loaded.
- (message_browser_folder_loaded): disconnect by id rather than
- searching for the handler. Save the id of the message_list_built
- signal handler.
- (message_browser_message_list_built): Disconnect the handler by
- id.
- (message_browser_destroy): Disconnect the signal handlers by id.
-
-2003-06-20 Not Zed <NotZed@Ximian.com>
-
- ** See bug #43887
-
- * mail-format.c (mail_get_message_body): handle text/enriched and
- text/richtext explictly, and dont treat them as text/plain.
-
-2003-06-23 Radek Doulik <rodo@ximian.com>
-
- * mail-config.c (config_write_style): add
- EvolutionMailPrintHTMLWidget style assignment
-
- * mail-callbacks.c (do_mail_print): set printing widget name
-
-2003-06-23 Dan Winship <danw@ximian.com>
-
- * message-list.c (on_selection_changed_cmd): Save the idle_id
-
-2003-06-23 Larry Ewing <lewing@ximian.com>
-
- * folder-browser.c (do_message_selected): make sure not to strcmp
- a possibly NULL string.
-
-2003-06-19 Not Zed <NotZed@Ximian.com>
-
- ** See bug #45063
-
- * folder-browser.c (do_message_selected): dont re-load if the same
- message gets selected again as one we've already shown. Etree
- sends out selection changed events even when when it hasn't.
-
-2003-06-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (hide_save_state): Only save state if we have a
- folder reference. Fixes some warnings about casting a NULL object
- to a CamelFolder.
-
-2003-06-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (ml_tree_value_at): Don't display an unread icon
- for a parent message status if it has unread children but has been
- read itself. Instead, show that we have unread children by just
- making the message test bold (which it was already doing, so
- yay... this was easy). Fixes bug #42630.
-
-2003-06-16 Not Zed <NotZed@Ximian.com>
-
- ** See bug #44609
-
- * mail-vfolder.c (vfolder_edit_rule): put the ok/cancel buttons in
- the stupid gnome 2 order.
-
- ** See bug #33593
-
- * message-list.c (on_selection_changed_cmd): also listedn to
- selection changed events, since the etable api has changed.
- (get_selected_cb): helper for above.
- (message_list_construct): hook to selection change signal.
-
- * mail-callbacks.c (composer_send_queued_cb): Unref the composer
- to match the ref composer_send_cb();
-
- ** See bug #44519
-
- * message-browser.c (message_browser_message_list_built): We want
- to disconnect from the messagelist, not folderbrowser signal.
-
-2003-06-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (format_mime_part): We only really want to use
- mail_identify_mime_part() if the content-type is
- application/octet-stream - any other type (if it doesn't have a
- handler) should just force the user to save to disk.
- (handle_text_plain): Only pay attention to format=flowed if the
- mime-type is text/plain (handle_text_plain is the generic text
- handler, so we might be processing parts that are not really
- text/plain, thus the format param may have different meaning for
- those other textual types).
-
-2003-06-11 Larry Ewing <lewing@ximian.com>
-
- * mail-format.c (mail_lookup_handler): free the application list
- if we are bailing.
-
- * mail-send-recv.c (free_folder_info): free the info structure as
- well.
-
-2003-06-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-tag-followup.c (get_week_start_day): Use mail-config's
- gconf client.
- (target_date_new): Same.
-
- * message-list.c (message_list_set_folder): Use mail-config's
- gconf client.
- (mail_regen_list): Same.
-
- * mail-tools.c (mail_tool_quote_message): Use mail-config's gconf
- client.
- (mail_tool_forward_message): Same.
-
- * mail-session.c (main_get_filter_driver): Use mail-config's gconf
- client.
-
- * mail-preferences.c (mail_preferences_init): Use mail-config's
- gconf client.
- (mail_preferences_finalise): Don't unref the gconf client.
-
- * mail-format.c (write_headers): Use mail-config's gconf client.
- (mail_format_data_wrapper_write_to_stream): Same.
- (handle_text_plain): And here.
-
- * mail-display.c (save_data_cb): Use mail-config's gconf client.
- (save_part): Same.
- (on_url_requested): Here too.
- (mail_text_write): And here.
- (mail_display_init): And here.
- (mail_display_destroy): Here too.
- (mail_display_new): Again here.
-
- * mail-composer-prefs.c (sig_add_cb): Use mail-config's gconf
- client.
- (mail_composer_prefs_construct): Same.
-
- * mail-callbacks.c (ask_confirm_for_unwanted_html_mail): Use
- mail-config's gconf client.
- (ask_confirm_for_empty_subject): Same.
- (ask_confirm_for_only_bcc): Here too.
- (composer_get_message): And here.
- (create_msg_composer): Again here.
- (mail_generate_reply): Same.
- (forward): And here.
- (transfer_msg_done): "
- (delete_msg): "
- (confirm_expunge): "
-
- * component-factory.c (owner_unset_cb): Use mail-config's gconf
- client.
-
- * folder-browser-ui.c (folder_browser_ui_add_message): Use the
- mailer's gconf client.
- (folder_browser_ui_add_list): Same.
- (folder_browser_ui_add_global): Here too.
-
- * folder-browser.c (save_cursor_pos): Use the mailer's gconf
- client.
- (folder_browser_set_message_preview): Same.
- (folder_browser_toggle_preview): Here too.
- (folder_browser_toggle_threads): And here.
- (folder_browser_toggle_hide_deleted): Here as well.
- (folder_browser_set_message_display_style): And here.
- (fb_resize_cb): Here.
- (paned_realised): And here.
- (done_message_selected): And everywhere...
-
- * mail-account-gui.c (sig_add_new_signature): Use the mailer gconf
- client.
-
- * mail-config.c (mail_config_get_gconf_client): New function to
- return the global GConfClient used by the mailer.
- (mail_config_write_on_exit): On exit, free our objects and such.
- (mail_config_signature_run_script): Use config->gconf.
-
-2003-06-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (invert_selection): Get rid of the if-focused
- code, that will always prevent the etree from getting the
- selection inverted because the menu item will always have focus at
- this time. Fix for bug #43972.
-
-2003-06-11 Not Zed <NotZed@Ximian.com>
-
- ** See bug #22542
-
- * component-factory.c (storage_create_folder): If we're creating a
- folder on a vstore, popup a vFolder editor rather than failing.
-
-2003-06-05 Not Zed <NotZed@Ximian.com>
-
- ** Part of #42691.
-
- * importers/Makefile.am (BUILT_SOURCES): added server_DATA.
-
- * Makefile.am (%.server.in): create a proper implicit rule for
- temporary .in file.
-
-2003-06-04 Not Zed <NotZed@Ximian.com>
-
- ** See bug #43974
-
- * mail-tools.c (mail_tool_do_movemail): use a proper CamelURL to
- decode the uri, not hacky strcmp stuff.
-
- * mail-account-gui.c (extract_values): if we have an conf_entry,
- ignore username, hostname, and path ones, as these are handled
- implicitly in the url itself. Came about because of the fix for
- #42838.
-
-2003-06-03 Federico Mena Quintero <federico@ximian.com>
-
- * mail-search.c (mail_search_construct): Put the buttons in HIG
- order; don't replace the label of the stock Find button. Also,
- add Escape as a keybinding for the Close button (see why GTK+ is
- on crack on b.g.o #74221 and #101293).
-
diff --git a/mail/ChangeLog.pre-1-4 b/mail/ChangeLog.pre-1-4
deleted file mode 100644
index 5933f09baa..0000000000
--- a/mail/ChangeLog.pre-1-4
+++ /dev/null
@@ -1,24750 +0,0 @@
-2003-06-02 Not Zed <NotZed@Ximian.com>
-
- ** This and jeffs patch for #43862.
-
- * mail-folder-cache.c (store_online_cb): If the store is still
- around, then flow on to a get folderinfo update, otherwise just
- clear up.
-
- * mail-ops.c (mail_store_set_offline): return the msgid of this so
- it can be cancelled.
-
-2003-05-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-folder-cache.c (mail_note_store): If the session is
- 'online' and we are noting a CamelDiscoStore, make sure that it is
- changed to online status and call mail_get_folderinfo().
-
-2003-05-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-local.c (load_metainfo): Stat the XML file before trying to
- parse it to make sure it exists.
-
-2003-05-29 Not Zed <NotZed@Ximian.com>
-
- * Makefile.am (BUILT_SOURCES): added server_DATA (*.server) so
- make clean works. For #42691.
-
-2003-05-30 Radek Doulik <rodo@ximian.com>
-
- * mail-config.c (config_write_style): use %02x instead of %2x when
- formatting color for rc file
-
-2003-05-29 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes bug #43805.
-
- * mail-session.c (session_system_beep): Proxy the gdk_beep() call
- to the main thread.
- (session_play_sound): Proxy the gnome_sound_play() call to the
- main thread.
-
-2003-05-27 Not Zed <NotZed@Ximian.com>
-
- * message-tag-editor.c (message_tag_editor_init): set the default
- open size to something reasonable. For #43410.
-
- * mail-signature-editor.c (d): turn off debugging.
-
- * mail-config.c (mail_config_signature_add): save new signature in
- signature list. For #43688.
-
-2003-05-21 Radek Doulik <rodo@ximian.com>
-
- * mail-signature-editor.c (menu_file_save_cb): set signature html
- flag even if it's newly signature, we don't set it in
- format_html_cb as sig could be "live" (when it's not new one)
-
-2003-05-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-importer.c: Updated copyright years.
-
- * mail-callbacks.c (ask_confirm_for_empty_subject): Fixed the
- logic a bit - if the gconf key *isn't* set, we want to return
- TRUE.
-
- * mail-search.c (mail_search_finalise): We need to weak_unref()
- the mail-display here. Fixes bug #43392.
-
-2003-05-21 Larry Ewing <lewing@ximian.com>
-
- * mail-config.glade: remove link hilighting option that isn't
- attached to anything.
-
-2003-05-20 Larry Ewing <lewing@ximian.com>
-
- * mail-display.c: filter notification events to keep the redisplay
- count down.
-
- * mail-composer-prefs.c: remove references to gtkhtml property
- manager. Connect to missing settings.
-
- * mail-preferences.c: remove references to gtkhtml property
- manager. Connect to missing settings.
-
- * mail-config.glade: remove keybinding setting.
-
- * mail-display.c (mail_display_destroy): remove notification.
- (display_notify): set animate and redisplay. We have to redisplay
- because the citation color may have changed.
-
- * evolution-mail.schemas: add composer and display gconf entries.
-
-2003-05-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_save): Only re-add the
- store to the folder-tree if the account is enabled. Oops. Fixes
- bug #43214.
-
-2003-05-20 Larry Ewing <lewing@ximian.com>
-
- * mail-config-factory.c: remove references to font prefs.
-
- * component-factory.c: Remove stale refernces the the font prefs.
- (make_factory): remove unused variables.
-
- * mail-config.c (mail_config_init): add a notify callback to the
- spelling color.
- (config_write_style): rename and write out the spell color as
- well.
-
-2003-05-20 Not Zed <notzed@lostzed.mmc.com.au>
-
- ** See bug #43234
-
- * mail-display.c (mail_display_set_message): if we've been
- destroyed, noop.
-
-2003-05-16 Dan Winship <danw@ximian.com>
-
- * mail-ops.c (mail_empty_trash): New async "empty trash" op.
-
- * mail-callbacks.c (empty_trash): Use it rather than requiring
- that mail_tool_get_vtrash() work without blocking. #43091
-
-2003-05-16 Radek Doulik <rodo@ximian.com>
-
- * mail-callbacks.c (footer_info_new): gnome_font_get_descender
- returns negative value
-
-2003-05-17 Larry Ewing <lewing@ximian.com>
-
- * GNOME_Evolution_Mail.server.in.in: remove font prefs server from
- the list.
-
-2003-05-17 Jeremy Katz <katzj@redhat.com>
-
- * mail-offline-handler.c: Add #include to fix warning.
-
- * mail-mt.c (mail_msg_new): Use glib macros for pointer/int
- conversions.
- (mail_msg_free): Likewise.
- (mail_msg_cancel): Likewise.
- (mail_msg_wait): Likewise.
- (mail_msg_active): Likewise.
- * mail-session.c (main_register_timeout): Likewise.
- (register_timeout): Likewise.
- (main_remove_timeout): Likewise.
- (remove_timeout): Likewise.
- * message-list.c (ml_value_to_string): Likewise.
-
- * mail-identify.c: Add #include to fix warning.
-
- * mail-config.c (config_write_fonts): Don't pass extra arguments
- to g_warning.
-
- * mail-callbacks.c: Add #include to fix warning.
-
-2003-05-15 Not Zed <NotZed@Ximian.com>
-
- ** See bug #42838.
-
- * mail-account-gui.c (mail_account_gui_build_extra_conf): always
- add the extra entry to the hash table, most paths wouldn't.
-
-2003-05-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c: Disabled some debugging messages.
-
-2003-05-14 JP Rosevear <jpr@ximian.com>
-
- * mail-local.h: add proto
-
- * mail-local.c (storage_listener_startup): don't listen for
- destruction, because we have a ref and it'll never happen
- (mail_local_storage_shutdown): release and unref the local storage
-
- * mail-display.c (retrieve_shell_view_interface_from_control):
- return a new copy every time
- (set_status_message): release and unref the shell view
-
- * folder-browser.c (folder_browser_destroy): guard for multiple
- destroys
-
- * folder-browser-factory.c (control_activate): release and unref
- the shell view
- (control_destroy_cb): just remove the control from the list
- (folder_browser_factory_new_control): don't weak ref the folder
- browser
-
- * component-factory.c (owner_unset_cb): shutdown local storage
-
-2003-05-13 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (segv_redirect): Removed.
- (make_factory): No need to set up the SIGSEGV redirect handler
- here, since it's already done in the shell now, and it's in-proc.
-
- * folder-browser-ui.c (folder_browser_ui_rm_all): Only do the
- bonobo_ui_component() stuff if the component does have a
- container.
-
-2003-05-08 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-session.c (mail_session_set_interactive): Set the
- password_dialog pointer to NULL. Prevents a crash that could
- happen if the shell would quit with the password dialog still up.
-
-2003-05-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (mail_display_render): Make sure that we haven't
- been destroyed before we start writing to the html engine. Fixes
- bug #42333.
-
-2003-05-07 Not Zed <NotZed@Ximian.com>
-
- ** See bug #42456
-
- * mail-composer-prefs.c (spell_language_button_press): set the
- enable/disable button to the right text when we toggle a column.
- Added a fixme about the weird code in the whole routine.
-
-2003-05-07 Jeremy Katz <katzj@redhat.com>
-
- * evolution-mail.schemas
- (/schemas/apps/evolution/mail/display/mime_types): Correct
- default for list.
-
-2003-05-06 Not Zed <NotZed@Ximian.com>
-
- ** See bug #42400
-
- * mail-tools.c (meta_data_key): protect against getting an
- unparsable uri.
-
-2003-05-05 Not Zed <NotZed@Ximian.com>
-
- ** See bug #42294.
-
- * mail-config.c (config_write_fonts): Also set the custom font
- style for *BonoboPlug*GtkHTML.
-
-2003-05-05 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-session.c (request_password): Set OK as the default
- response for the password_dialog.
-
-2003-04-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (mark_as_unseen): To be consistant with the
- message-list envelope toggle, undelete the message when we unmark
- the Seen flag here as well. Fixes bug #42118.
-
-2003-04-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (ml_tree_value_at): Fixed to return the correct
- values (swapped) in order to fix bug #42120.
-
-2003-04-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (regen_list_regened): Save the tree state before
- we tear down the tree and then load it back again. yay. Fixes bug
- #42170 and #40074.
-
-2003-04-30 Not Zed <NotZed@Ximian.com>
-
- ** See bug #41748
-
- * mail-send-recv.c (build_dialogue): make sure we dont add any
- SEND_SEND types to the receive table. When we add the SEND_SEND
- type, key it on a fixed string SEND_URI_KEY.
- (receive_done): if it is a SEND_SEND type, use SEND_URI_KEY to
- remove it from the active list.
- (mail_receive_uri): make sure we never add a SEND_SEND type to the
- receive list.
- (mail_send): key the send info on SEND_URI_KEY not transport url.
-
-2003-04-29 Jeremy Katz <katzj@redhat.com>
-
- * folder-browser-ui.c (fbui_sensitise_item): Don't just blindly
- cast an int to gpointer, use the proper glib magic instead.
-
-2003-04-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * importers/netscape-importer.c
- (netscape_add_priority_workaround_filters): Updated for API change
- in the filter code.
-
-2003-04-29 Not Zed <NotZed@Ximian.com>
-
- ** See bug #41972
-
- * message-list.c (ml_tree_value_at): fix (void *) casts on trinary
- ops.
-
- * folder-browser.c (on_right_click): Store the label tag in the
- label callback data, not the translated name.
-
- * mail-config.c (label_defaults[]): Initialise with the tag
- values.
- (config_clear_labels): free tag field.
- (config_cache_labels): setup the tag field based on the position
- of the label name.
- (mail_config_get_label_color_by_name): Lookup colour by the
- untranslated TAG, not the translated/customisable tag.
-
- * mail-config.h (MailConfigLabel): Add a tag field, we were using
- the translated name as the label(!).
-
-2003-04-29 Dan Winship <danw@ximian.com>
-
- * mail-format.c (write_xmailer_header): Remove preceding whitespace
-
-2003-04-28 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-session.c (mail_session_forget_passwords): Forget all
- passwords again. [#41817]
-
-2003-04-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.glade: Made toplevel container widgets set a
- border-width (including toplevel widgets within frames), set the
- table/hbox/vbox spacings, set the spacing between an image and the
- description text in hboxes to 12pts (as suggested by the HIG),
- Changed Add/Delete buttons to the stock Add/Remove buttons, etc
-
-2003-04-24 Jeffrey Stedfast <fejj@ximian.com>
-
- Fix for bug #41789
-
- * mail-config.c (mail_config_init): Cache the allowable
- mime-types.
- (mail_config_get_allowable_mime_types): New public function to get
- an array of allowable mime-types.
-
- * mail-format.c (mail_lookup_handler): Only allow a
- bonobo-component handler if the mime-type is something handled by
- evolution or the user has specifically chosen that type as
- available for viewing with a bonobo component in the gconf
- database.
- (mime_type_uses_evolution_component): New convenience function.
- (mime_type_can_use_component): Checks gconf to see if the user has
- allowed the mime-type to be viewed by a component.
-
-2003-04-24 Radek Doulik <rodo@ximian.com>
-
- * mail-display.c (html_button_press_event): as below
- (update_active): as below
-
- * folder-browser.c (html_button_press_event): update for changed
- coordinates in gtk-2
-
-2003-04-23 Not Zed <NotZed@Ximian.com>
-
- * mail-send-recv.c (get_receive_type): pass an exception to
- get_provider, to silence some warnings/get a valid result.
-
-2003-04-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (composer_get_message): Only add the
- Organization: header if it is non-empty. Fixes bug #41730.
-
-2003-04-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-composer-prefs.c (spell_set_ui): Protect against a NULL
- strv result from parsing the language list string.
-
-2003-04-17 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes for bug #41142.
-
- * mail-search.c (dialog_response_cb): Handle a GTK_RESPONSE_CLOSE
- response.
- (mail_search_construct): Changed the Cancel button into a Close
- button.
-
-2003-04-18 Rodney Dawes <dobey@ximian.com>
-
- * Makefile.am:
- * folder-browser-ui.c:
- * mail-signature-editor.c:
- * message-browser.c:
- Use PREFIX instead of EVOLUTION_DATADIR for bonobo_ui_util_set_ui ().
- Fixes bug #21499.
-
-2003-04-17 Not Zed <NotZed@Ximian.com>
-
- * mail-signature-editor.c (menu_help): remove the help menu item
- handling, as the help menu is removed. Clean up of #38927.
-
-2003-04-16 Not Zed <NotZed@Ximian.com>
-
- * importers/Makefile.am (%.server.in): Remove COMPONENTDIR and set
- BINDIR and VERSION instead.
-
- * (importers/GNOME_Evolution_Mail_Pine_Intelligent_Importer.server.in.in,
- importers/GNOME_Evolution_Mail_Mbox_Importer.server.in.in,
- importers/GNOME_Evolution_Mail_Outlook_Importer.server.in.in,
- importers/GNOME_Evolution_Mail_Netscape_Intelligent_Importer.server.in.in,
- importers/GNOME_Evolution_Mail_Elm_Intelligent_Importer.server.in.in:) :
- Convert the type back to exe, and point to the main evolution
- executable. Fixes #41164.
-
-2003-04-16 Jeremy Katz <katzj@redhat.com>
-
- * evolution-mail.schemas: schema keys can't be directories (#41419)
-
-2003-04-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (config_wizard_set_page): Fixed a logic
- error that was the cause of bug #41389.
-
-2003-04-15 Not Zed <NotZed@Ximian.com>
-
- * For bug #41199.
-
- * subscribe-dialog.glade: New interface from Anna. Setup the
- wigdet names and add a progress bar, and set the default opening
- size to something reasonable.
-
- * subscribe-dialog.c (subscribe_dialog_construct): changes to
- match the glade file chagnes. remove the search stuff. hide the
- progress bar by default.
- (sc_activity_cb): show the progress bar when we're active, hide
- it when inactive. dont set any status.
- (struct _SubscribeDialogPrivate): Remove the appbar.
-
-2003-04-15 Hans Petter Jansson <hpj@ximian.com>
-
- * mail-mt.c (mail_msg_check_error): Free the temporary error text.
-
-2003-04-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-vfolder.c (vfolder_gui_add_rule): Set the correct border
- width and vbox spacing to be HIG compliant. Fixes bug #41209.
- (vfolder_edit_rule): Same here.
-
- * local-config.glade: Updated to comply with the HIG. Fixes bug
- #41244.
-
-2003-04-14 Not Zed <NotZed@Ximian.com>
-
- * mail-send-recv.c (build_dialogue): create a stock cancel button
- with a cancel all text.
- (build_dialogue): Create stock-like cancel buttons with no
- accelerators. A workaround for #41043.
-
- * message-list.c (ml_tree_value_at): if the node is the root node,
- do nothing. etable shouldn' really be searching the root node if
- it isn't visible ...? For #41190.
-
-2003-04-14 Larry Ewing <lewing@ximian.com>
-
- * evolution-mail.schemas: add proper defaults for the fonts
- settings.
-
-2003-04-11 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes bug #41243.
-
- * message-tag-followup.c (construct): Change the window border
- width and packing to comply with the HIG.
-
- * message-tags.glade: Updated to comply with the HIG.
-
-2003-04-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-session.c (request_password): Add padding around the
- entry/checkbox and change the border width of the dialog window to
- comply with the HIG. Fixes bug #41004.
-
-2003-04-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-search.c (mail_search_construct): Change the action button
- ordering and also change the padding to comply with the HIG. Fixes
- bug #41046 and at least part of bug #41142 (except for the
- s/Search/OK/ thing, which has not been agreed upon yet).
-
- * mail-send-recv.c (build_dialogue): Change the padding to comply
- with the GNOME HIG. Fixes bug #41001.
-
-2003-04-09 Not Zed <NotZed@Ximian.com>
-
- ** See bug #40921
-
- * subscribe-dialog.c (subscribe_dialog_finalise): add a finalise
- funciton which actually free's resources.
- (get_short_folderinfo_got): dont call activity callback implicitly
- here, do it from the callers callback.
- (subscribe_get_short_folderinfo): dont call activity callback
- here.
- (fe_got_children): check implicitly if we were cancelled. also
- add back the node sort, and also call the activity callback from
- here instead of breaking layers of abstraction as above.
- (folder_etree_cancel_all): new method, force a cancel of all ops,
- but dont free anything.
- (store_data_free): dont unref the widget anymore, not needed.
- call cancel all on the ftree if its still active.
- (sc_close_pressed): destroy the subscribe dialogue as well as the
- app, it doesn't seem to get destroyed otherwise.
- (sc_activity_cb): do nothing if we have been cancelled.
- (subscribe_dialog_destroy): trigger a cancel of all outstanding
- ops. only free most data in the finalise method.
- (subscribe_dialog_class_init): hook onto finalise.
- (store_data_get_widget): dont ref the widget.
-
- * mail-callbacks.c (manage_subscriptions): sink the dialog.
-
-2003-04-09 Larry Ewing <lewing@ximian.com>
-
- * mail-preferences.c (font_share_changed): set sensitivity of
- font pickers based on share setting.
- (mail_preferences_construct): initialize font prefs.
- (mail_preferences_apply): set the font prefs.
- (font_changed): add gnome-font-picker changed function.
-
- * mail-preferences.h: add font pref widgets.
-
- * mail-config.c (mail_config_init): add notify to on fonts dir.
- (config_write_fonts): write out a gtkrc that overrides the gtkhtml
- fonts settings based on the gconf keys.
-
- * mail-config.glade: move display font setttings to mail prefs.
-
- * evolution-mail.schemas: add font settings.
-
-2003-04-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (do_view_message): Add a check for a NULL uid
- here. Don't see how it can happen, but it seems to have for
- Aaron. Anyways, this should fix bug #40904.
-
-2003-04-08 Dan Winship <danw@ximian.com>
-
- * mail-config.glade: Remove color specs from the druid so it will
- use the theme colors
-
- * importers/GNOME_Evolution_Mail_Elm_Intelligent_Importer.server.in.in:
- * importers/GNOME_Evolution_Mail_Netscape_Intelligent_Importer.server.in.in:
- * importers/GNOME_Evolution_Mail_Pine_Intelligent_Importer.server.in.in:
- Fix bad XML noticed by Not Zed
-
-2003-04-08 Not Zed <NotZed@Ximian.com>
-
- * mail-vfolder.c (vfolder_gui_add_rule): swap button order. For
- #40900.
-
-2003-04-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (ml_tree_value_at): For string columns, never
- return NULL - always return "" if the value is empty. Fixes bug
- #40728.
-
- * mail-composer-prefs.c (sig_add_script_cb): Set the "script" data
- on the GtkEntry to NULL.
- (sig_add_script_response): If the "script" data on the GtkEntry
- object is non-NULL, then we are editing an existing signature, so
- just change the values in place and don't add it to the signature
- db.
- (sig_edit_cb): If sig->script is non-NULL, then we are editing a
- script signature, so pop up the script dialog instead. Fixes bug
- #38929.
-
-2003-04-07 Radek Doulik <rodo@ximian.com>
-
- * mail-composer-prefs.c (spell_load_values): use e_iconv_locale_language
-
-2003-04-07 Dan Winship <danw@ximian.com>
-
- * GNOME_Evolution_Mail.server.in.in: Clean up server names
-
- * importers/GNOME_Evolution_Mail_Elm_Intelligent_Importer.server.in.in:
- Likewise, and fix evolution-mail location
-
- * importers/GNOME_Evolution_Mail_Mbox_Importer.server.in.in:
- Likewise
-
- * importers/GNOME_Evolution_Mail_Netscape_Intelligent_Importer.server.in.in:
- Likewise
-
- * importers/GNOME_Evolution_Mail_Outlook_Importer.server.in.in:
- Likewise
-
- * importers/GNOME_Evolution_Mail_Pine_Intelligent_Importer.server.in.in:
- Likewise
-
- * importers/Makefile.am (%.server.in): Fix this for evolution-mail
- being a shlib.
-
-2003-04-03 Not Zed <NotZed@Ximian.com>
-
- ** Bug 40536
-
- * component-factory.c (send_receive_cb): run the warning dialogue
- asynchronously. Also, set the mail send/receive dialogue to
- transient for parent.
-
- * mail-send-recv.c (mail_send_receive): return the dialogue for
- send/receive.
-
-2003-04-02 Rodrigo Moya <rodrigo@ximian.com>
-
- * importers/evolution-mbox-importer.c (load_file_fn):
- * importers/evolution-outlook-importer.c (load_file_fn): added
- "folder_type" parameter to EvolutionImporterLoadFileFn.
-
- * importers/elm-importer.c (elm_import_file): pass empty string for
- "folder_type" argument to GNOME_Evolution_Importer_loadFile.
- * importers/pine-importer.c (pine_import_file): ditto.
- * importers/netscape-importer.c (netscape_import_file): ditto.
-
-2003-04-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (save_part): Don't allow the 'prefix' argument to
- make_safe_filename() be NULL. If we don't yet have a save_dir in
- gconf, use $HOME, etc. Fixes bug #40608.
-
-2003-04-02 Not Zed <NotZed@Ximian.com>
-
- * mail-session.c (mail_session_forget_passwords): Only clear the
- Mail passwords.
-
- * component-factory.c (interactive_cb): Call
- composer_check_autosave if we're going interactive, to check for
- unsaved files. Fixes #40300.
-
-2003-04-01 Not Zed <NotZed@Ximian.com>
-
- * mail-display.c (mail_display_redisplay): if we're called and the
- idle handler is set, remove it, so we dont go and redisplay it
- again. Fixes #40522.
-
-2003-03-31 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (regen_list_regened): Save tree state and then
- after building the new tree, re-load the tree state. Finishes the
- fix for bug #40074.
-
- * mail-session.c: Properly init message_list. Fixed a type-o that
- initialized it to the password_list.
-
-2003-03-31 Not Zed <NotZed@Ximian.com>
-
- * mail-session.c (pass_response): need to check for config_service
- != NULL, not service != NULL before calling set_save_password.
- Fix for #40472.
-
-2003-03-28 Not Zed <NotZed@Ximian.com>
-
- * folder-browser-ui.c: include e-meta.h
-
- * folder-browser.c (on_right_click): remove unused var.
-
-2003-03-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * subscribe-dialog.c (fe_check_for_children): Declare a prototype
- for this function prior to fe_got_children() so that
- fe_got_children() can call us.
-
-2003-03-26 Dan Winship <danw@ximian.com>
-
- * mail-format.c (write_address): remove extra arg to
- camel_url_encode
-
-2003-03-27 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.c (folder_browser_gui_init): dont set the paned
- initial size here, but hook onto the realize signal.
- (paned_realised): set the paned size once we're realised. Fixes
- #37084, its a bit of a hack, but it seems to work.
-
-2003-03-26 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes bug #40074.
-
- * folder-browser-factory.c (control_deactivate): Save message-list
- state.
-
- * message-list.c (message_list_save_state): Save the various
- states.
-
-2003-03-26 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes for bug #39870
-
- * message-browser.c (transfer_msg_done): Close the
- message-browser. Since the message doesn't exist anymore, we
- should close it.
- (message_browser_delete): New callback to handle deletion in the
- message-browser window.
-
-2003-03-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * subscribe-dialog.c (fe_got_children): If the CamelFolderInfo
- node doesn't have \NoInferriors set, then check for
- subfolders. Fixes bug #40314.
-
-2003-03-26 Not Zed <NotZed@Ximian.com>
-
- * mail-display.c (popup_window_destroy_cb): Undo jeff's patch
- below for #40275, the destroy timeout is already removed in
- popup_info_free. Unref the widget 'w' when we're done with it.
- (popup_info_free): Move everything in here to popup_window_destroy
- and remove, since nothing else uses it.
- (make_popup_window): Ref the widget so it doesn't go away before
- we're finished with it. Really fixes bug #40275/40188.
-
-2003-03-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (popup_window_destroy_cb): Remove the
- timeout. Should fix bug #40275.
-
- * subscribe-dialog.c: Remove search entry which never worked right
- (and can't work as users expect anyway, since we don't do
- namespace stripping). Fixes bug #40083.
- (ftree_node_new): Ignore \NoSelect as far as marking it
- "subscribable". Fixes bug #40124.
-
-2003-03-25 Dan Winship <danw@ximian.com>
-
- * mail-account-editor.c: Update for e_notice move
- (apply_changes): Pass a parent_window to e_notice
-
- * mail-account-gui.c: Update for e_notice move.
- (mail_account_gui_save): Pass a parent_window to e_notice
-
- * mail-callbacks.c: Update for e_notice move
- * mail-local.c: Likewise
- * mail-signature-editor.c: Likewise
- * mail-vfolder.c: Likewise
-
- * component-factory.c (interactive_cb): Update prototype
-
-2003-03-25 Not Zed <NotZed@Ximian.com>
-
- * mail-tools.c (meta_data_key): strdup the key before freeing the
- url as it is probably pointing there.
-
-2003-03-25 Not Zed <NotZed@Ximian.com>
-
- * component-factory.c (got_folder): remove a debug printf that
- made it in a commit.
-
- * folder-browser-ui.c (folder_browser_ui_add_global): Load
- per-folder setting of show_preview from meta data.
- (folder_browser_ui_add_list): Same, for thread_list.
-
- * mail-tools.c (mail_tool_get_meta_data)
- (mail_tool_delete_meta_data): helpers to lookup/delete meta data.
-
- * mail-config.c (mail_config_uri_deleted): delete the meta-data
- for the folder.
-
- * folder-browser.c (folder_browser_reload): dont reload the uri if
- we're in the process of loading it still.
- (folder_browser_new): load the folder meta data before loading the
- folder.
- (folder_browser_toggle_preview):
- (folder_browser_toggle_threads): save change to meta-data.
- (got_folder): Load the metadata if we have a folder to set, and
- the meta-data has changed from initislisation.
-
-2003-03-23 Chris Toshok <toshok@ximian.com>
-
- * mail-callbacks.c (ask_confirm_for_unwanted_html_mail): pass
- FALSE for e_destination_get_textrep's include_email arg.
-
-2003-03-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (mail_format_data_wrapper_write_to_stream):
- Default to the charset provied in the MimePart's Content-Type over
- that of the user's mailer charset. Fixes bug #39204.
-
-2003-03-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-composer-prefs.c (spell_load_values): "en_us" should not be
- translated. Fixes bug #40088.
-
-2003-03-21 Larry Ewing <lewing@ximian.com>
-
- * mail-display.c (pixbuf_gen_idle): remember to disconnect the
- destroy handler if whenever the loader is shut down.
-
-2003-03-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (owner_set_cb): Change the message_destroy
- callback to just gtk_widget_destroy. No need to have a callback
- simply to call this function.
- (warning_response): Removed (see above).
-
- * mail-composer-prefs.c (sig_add_script_response): Don't forget to
- add the signature to the signature list if it is a valid script.
-
- * mail-config.c (mail_config_signature_unregister_client): Make
- sure we can find the registered handler before trying to remove it
- from the list.
-
- * mail-session.c (do_user_message): Make the 5th argument to
- gtk_message_dialog_new() "%s" and move the m->prompt to arg 6 so
- that we are safe if the prompt string contains any %'s. Also
- connect to the response signal for the user_msg dialog and set the
- callback to gtk_widget_destroy so that the user can actually close
- the dialog. We also need to g_object_weak_ref() the dialog so that
- we can set the global message_dialog pointer back to NULL when it
- gets destroyed. Fixes bug #40043.
-
-2003-03-20 Dan Winship <danw@ximian.com>
-
- * mail-ops.c (build_from): Remove this since there's a function in
- CamelMimeMessage to do it now.
- (save_messages_save): Use camel_mime_message_build_mbox_from.
-
-2003-03-21 Not Zed <NotZed@Ximian.com>
-
- ** for mail part of bug #38461.
-
- * importers/evolution-outlook-importer.c (load_file_fn): dont pass
- in create flag to uri_to_folder, the folder must already exist.
-
- * importers/evolution-mbox-importer.c (folder_created_cb):
- Removed, we now force the caller to create the destination folder
- first.
- (load_file_fn): Dont try and create a folder if it doesn't exist.
- Also, use the uri directly as the destination uri, so we can
- import into any folder.
- (process_item_fn): If we dont have a folder, thats just an error,
- return BAD_FILE.
-
- * importers/netscape-importer.c (netscape_import_file): As below
- for elm_import_file.
- (import_next): similarly as for pine import_next.
- (importer_cb): just record result.
- (importer_timeout_fn): removed.
-
- * importers/pine-importer.c (import_next): Similar to below for
- the elm import_next.
- (pine_import_file): As below for elm_import_file.
- (importer_timeout_fn): removed.
- (importer_cb): just record the result, and exit.
- (import_next): change around to behave more like the elm importer,
- cleaning up when we're done.
-
- * importers/elm-importer.c (elm_import_file): Create the
- destination folder ourselves, dont pass it onto the mbox importer.
- Simplify logic, just do the import within a while loop, polling
- the g main loop as necessary, remove need for idle callbacks and
- other crap.
- (import_next): If elm_import_file fails, then just go straight to
- the next folder, stops it falling in a heap.
- (import_item_idle): removed.
- (importer_cb): just record result/exit.
-
- * mail-importer.c (mail_importer_create_folder): removed.
- (mail_importer_make_local_folder): new function to create a
- local-only folder from a path. It runs synchronously by using a
- recursive main loop.
- (folder_created_cb): callback for make_local_folder.
-
-2003-03-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (mail_config_druid_new): Revert ettore's
- broken patch.
-
- * mail-search-dialogue.c: Removed - nothing uses this.
-
-2003-03-19 Ettore Perazzoli <ettore@ximian.com>
-
- * importers/GNOME_Evolution_Mail_Mbox_Importer.server.in.in:
- Replace "evolution:menu-name" prop with "evolution:menu_name".
- [#39692]
- * importers/GNOME_Evolution_Mail_Outlook_Importer.server.in.in:
- Likewise.
-
-2003-03-19 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-config-druid.c (mail_config_druid_new): Give the druid the
- DIALOG hint. [#39741 and friends.]
-
-2003-03-19 Radek Doulik <rodo@ximian.com>
-
- * mail-composer-prefs.c (spell_load_values): changed default
- language to en_us instead of en
- (spell_language_button_press): new handler, ported from 1.2
- (spell_setup): use spell_language_enable and
- spell_language_button_press
-
-2003-03-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (composer_get_message):
- e_msg_composer_get_subject() now returns a const char *, so update
- appropriately.
-
-2003-03-18 Larry Ewing <lewing@ximian.com>
-
- * mail-callbacks.c (do_mail_print): fix leak, cleanup variable
- name, and call gtk_window_set_transient_for with a parent that is
- actually a GtkWindow.
- (mark_as_unseen): use g_source_remove.
-
-2003-03-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (mail_config_druid_new): Set the type hint
- to DIALOG so that Metacity shows this window on top. Fixes bug
- #39914.
-
-2003-03-18 Not Zed <NotZed@Ximian.com>
-
- * mail-vfolder.c (new_rule_clicked): validate rule & rule is
- unique. Workaround for #39464. Should this just use
- rule_context_add_rule_gui??
-
- * mail-search.c (mail_search_destroy): unhook from the html engine
- signals here, before we redisplay the message. Also make sure
- this processing only happens once. For #39759.
- (mail_search_finalise): dont unhook from signals here.
-
-2003-03-12 Not Zed <NotZed@Ximian.com>
-
- * mail-callbacks.c (expunge_folder): use a hack to find out if the
- message-list was focussed before we desensitise it.
- (expunged_folder): If the message-list was focussed before,
- re-grab the focus. For bug #29564.
-
-2003-03-17 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-signature-editor.c (mail_signature_editor): Give the editor
- the GDK_WINDOW_TYPE_HINT_DIALOG hint. [#38926]
-
-2003-03-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (pixbuf_gen_idle): If we fail to load the pixbuf,
- don't use it (stops some g_warnings).
-
- Part of a fix for bug #39809
-
- * mail-vfolder.c (vfolder_edit): Don't add the cancel button here.
-
- * mail-callbacks.c (filter_edit): Don't add the cancel button here.
-
-2003-03-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (do_external_viewer): Lookup the handler for the
- type. If we don't have a registered handler or if the registered
- handler is not meant to be handled via a bonobo component, don't
- use a bonobo component.
-
- * mail-format.c (mail_lookup_handler): If we register a new
- handler that is to be handled by a bonobo component, set
- handler->is_bonobo to TRUE.
-
-2003-03-14 Dan Winship <danw@ximian.com>
-
- * component-factory.c (storage_connect, storage_connected): Update
- for EvolutionStorage change
-
-2003-03-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-signature-editor.c (menu_file_save_cb): Rewritten to do the
- same as the composer's build_message() code.
-
-2003-03-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (account_add_clicked): Use
- gtk_window_set_transient_for() on the druid with the settings
- dialog as the parent window.
-
-2003-03-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-signature-editor.c (do_exit): Remove the yes/no
- buttons. Fixes bug #39382.
-
- * mail-accounts.c (account_able_toggled): New callback function to
- handle the checkbox getting toggled.
- (mail_accounts_treeview_new): Save the toggle renderer so we can
- later connect to it's toggled signal.
- (mail_accounts_tab_construct): Connect to the toggle-cell's
- toggled signal. Fixes bug #39325.
-
-2003-03-11 Not Zed <NotZed@Ximian.com>
-
- * mail-vfolder.c (vfolder_editor_response): Fix the response code,
- because some bastard changed the filter/* code and didn't fix the
- callers. Partial fix for #39165.
-
-2003-03-10 Not Zed <NotZed@Ximian.com>
-
- * Makefile.am (libevolution_mail_la_SOURCES): removed main.c from
- the build.
-
- * component-factory.c (component_factory_init): Remove, not used
- anymore, causes linking problems some places.
- (factory): Removed the debug printf. Added a case for the
- composer. Part of fixing #39256.
-
-2003-03-07 Jeffrey Stedfast <fejj@ximian.com>
-
- All this snot just to fix bug #38925 and an attempt to fix bug
- #38926 (but it seems no matter what I do, I can't work around the
- bonoboness/modality/whatever of the shell's preferences dialog).
-
- * mail-account-gui.c (sig_add_new_signature): Get the toplevel
- parent GtkWindow and pass that along to
- mail_composer_prefs_new_signature() so that window layering can be
- done correctly.
-
- * mail-composer-prefs.c (mail_composer_prefs_new_signature):
- Simplify. We don't want to add the signature to the list until
- after they have saved.
- (sig_edit_cb): Pass FALSE as the is_new argument to
- mail_signature_editor().
- (sig_event_client): Listen for signatures being added.
- (mail_composer_prefs_new_signature): Now takes a GtkWindow arg as
- the first arg rather than a MailComposerPrefs arg since we don't
- really need it to be a MailComposerPrefs object. We'd rather use
- the first arg as the parent GtkWindow so that we can set
- transience for the editor window.
-
- * mail-signature-editor.c (mail_signature_editor): Now takes a
- 'parent' argument (so we can set transient_for()) and a 'is_new'
- argument specifying whether the editor is editing a new signature
- or not. If it is, when the user saves, it will be added to the
- signature list. otherwise it won't.
- (sig_name_changed): Only use the mail_config_signature_set_name()
- interface if it is *not* a new signature.
- (menu_file_save_cb): If is_new, then save the signature to the
- config - otherwise do what we did before and set the modifications
- to it and emit the CHANGED event.
-
- * mail-config.c (mail_config_signature_new): Renamed from
- mail_config_signature_add(). We no longer immediately add the
- signature to the list of saved signatures.
- (mail_config_signature_add): New function which adds the signature
- and emits the SIG_ADDED event.
-
-2003-03-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (on_url_requested): If the part url is a text
- part, use mail_format_data_wrapper_write_to_stream(). This should
- fix bug #39204.
-
- * mail-format.c (mail_format_data_wrapper_write_to_stream): Make public.
-
-2003-03-06 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-accounts.c (mail_accounts_treeview_new): Set the
- shadow_type of the scrlled window to GTK_SHADOW_IN.
-
-2003-03-06 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-config.glade: Add some spacing to the buttons. [#38227]
-
-2003-03-06 Ettore Perazzoli <ettore@ximian.com>
-
- * importers/evolution-mbox-importer.c (IN): Use G_GNUC_FUNCTION
- instead of __FUNCTION__.
- (OUT): Likewise.
- * importers/netscape-importer.c (netscape_import_file): Likewise.
- * mail-send-recv.c (receive_done): Likewise.
- * mail-summary.c (SUMMARY_OUT): Likewise.
- (SUMMARY_IN): Likewise.
- (folder_changed_cb): Likewise.
- (message_changed_cb): Likewise.
-
-2003-03-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-factory.c: #include <string.h>
-
- * e-searching-tokenizer.c (camel_utf8_getc): Don't use __inline__
- as not all platforms/compilers support this keyword.
- (g): Same.
-
-2003-03-06 Not Zed <NotZed@Ximian.com>
-
- * component-factory.c (owner_unset_cb): remove debug printf.
-
-2003-03-05 Not Zed <NotZed@Ximian.com>
-
- * component-factory.c (idle_quit): Removed old quit code.
- (owner_unset_cb): Make this call synchronous. Wont cover all
- cases but should be ok most of the time.
-
-2003-03-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-search.c: Prototype some functions to shut the compiler up.
-
- * mail-callbacks.c (composer_get_message): Go back to using
- e_destination_get_address() but use the camel-address parser on
- the strings to make sure they are non-empty. Fixes bug #37854.
-
-2003-03-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-signature-editor.c (menu_file_save_cb): Use 'filename' when
- creating the uri rather than using the uninitialised 'uri'
- variable to create itself. Fixes bug #38864.
-
-2003-03-03 Not Zed <NotZed@Ximian.com>
-
- * mail-session.c (do_user_message): Do the same as below for
- request_password, so we dont leave a mainloop lying around.
-
-2003-03-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-session.c (request_password): Don't connect to the response
- signal if we are in the main thread - instead just use the return
- value from gtk_dialog_run and then call pass_response() with the
- response value.
-
-2003-03-03 Not Zed <NotZed@Ximian.com>
-
- * subscribe-dialog.c (fe_got_children): Remove the
- e_tree_memory_sort_node, currently it crashes inside gal, the root
- node seems to get free'd under it.
-
-2003-02-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-preferences.c: Reverted back to using e-iconv
-
- * mail-composer-preferences.c: Same.
-
-2003-02-26 Dan Winship <danw@ximian.com>
-
- * GNOME_Evolution_Mail.server.in.in: add a repo_id and a priority
- level to the startup wizard
-
-2003-02-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c: Reverted back to using e-iconv instead of
- camel-iconv.
-
-2003-02-25 Dan Winship <danw@ximian.com>
-
- * mail-config-druid.c: Update for new EvolutionWizard interfaces.
-
-2003-02-25 Dan Winship <danw@ximian.com>
-
- * mail-config-druid.c: Redo this to not use the CORBA interfaces
- in the local case (in preparation for redoing the CORBA
- interfaces).
- (mail_config_druid_new): Remove unused "shell" arg
-
- * mail-account-gui.c (mail_account_gui_transport_complete): Don't
- crash if there's no transport selected at all.
- (mail_account_gui_new): Don't try to set cc_addrs/bcc_addrs if
- they're NULL.
-
- * mail-accounts.c (account_add_clicked): Don't need to pass shell
- to mail_config_druid_new.
-
- * mail-callbacks.c (configure_mail): Don't need to pass shell to
- mail_config_druid_new.
-
-2003-02-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-session.c (request_password): Make sure m->config_service
- is non-NULL before using m->config_service->save_passwd since PGP
- stuff will not have a config_service. Fixes bug #38149.
-
- * mail-account-gui.c (mail_account_gui_save):
- s/e_account_list_changed/e_account_list_change - otherwise we get
- an undefined symbol and we crash :-)
-
- * mail-composer-prefs.c (mail_composer_prefs_new_signature): Don't
- always append "[script]" to the signature name. Also cleaned up
- some memory leakage.
-
-2003-02-20 Not Zed <NotZed@Ximian.com>
-
- * mail-preferences.c (mail_preferences_apply): fix the g_snprintf
- stuff.
-
- * mail-config.c (mail_config_add_account): Use new
- e_account_list_add.
- (mail_config_remove_account): Use new e_account_list_remove.
- (mail_config_set_default_account): Similarly for
- e_account_list_set_default.
- (mail_config_get_default_account): Same for
- e_account_list_get_default.
- (mail_config_get_account_by_name): Use e_account_list_find.
-
- * mail-account-gui.c (mail_account_gui_save): use new
- e_account_list_changed call instead of manual signalling.
-
-2003-02-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-local.c: Set the local provider description field to a
- string rather than NULL to prevent a segfault on solaris. Fixes
- bug #38418.
-
-2003-02-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (write_text_header): bitwise-or in
- CAMEL_MIME_FILTER_TOHTML_CONVERT_SPACES to fix bug #38499.
-
- * mail-search.c (mail_search_destroy): New overloaded virtual
- method, does what dialog_destroy_cb was trying to do.
- (mail_search_construct): Connect to the "response" signal rather
- than "clicked" to correspond to the GtkDialog API
- (instead og the old GnomeDialog API).
- (dialog_response_cb): Changed the function name and made it check
- button == GTK_RESPONSE_ACCEPT to search, any other button
- closes. Fixes bug #37947.
-
-2003-02-21 Hans Petter Jansson <hpj@ximian.com>
-
- * component-factory.c (factory): Don't try to get a FontPrefs control.
-
- * mail-config-factory.c (mail_config_control_factory_cb): Just return
- NULL if a FontPrefs control was requested.
-
- * mail-config.c (mail_config_get_default_account): If no accounts
- are defined, don't try to set the default account.
-
-2003-02-21 Dan Winship <danw@ximian.com>
-
- * Makefile.am (libevolution_mail_la_LIBADD): Remove libebook's
- dependencies.
-
- * importers/Makefile.am (libevolution_pine_importer_la_LIBADD):
- Likewise.
-
-2003-02-21 Dan Winship <danw@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_build_extra_conf): Use
- tables instead of vboxes, so that groups of label/entry pairs (as
- in Connector's config page) can line up nicely.
-
- * mail-config.glade: Turn extra_vbox and extra_mailcheck_vbox into
- tables.
-
- * mail-config-druid.c (get_fn): s/extra_vbox/extra_table/
-
- * Makefile.am (libevolution_mail_la_LIBADD):
- s/libcomposer.a/libcomposer.la/
-
-2003-02-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (mark_all_as_seen): Use
- camel_folder_free_uids().
-
- * mail-format.c (write_headers): Use
- camel_charset_canonical_name() here instead of
- e_iconv_charset_name().
-
- * mail-preferences.c (mail_preferences_construct): Same as below.
- (mail_preferences_apply): Again here.
-
- * mail-composer-prefs.c (mail_composer_prefs_construct): Use
- camel_charset_locale_name() here instead of
- e_iconv_locale_charset().
- (mail_composer_prefs_apply): Same.
-
-2003-02-20 Dan Winship <danw@ximian.com>
-
- * Makefile.am (libevolution_mail_la_LIBADD):
- s/libemiscwidgets.a/libemiscwidgets.la/ and likewise for
- libefilterbar
-
-2003-02-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (mark_all_as_seen): Fixed a memory leak - make
- sure to free all uids.
-
- * mail-config.c (uri_to_key): Removed.
- (lookup_signature): Removed.
- (xml_get_int): Removed.
- (xml_get_bool): Removed.
- (mail_config_get_time_24hour): Removed.
-
- * evolution-mail.schemas: s/long/int/g and change default_account
- to be a string instead of an int.
-
- * mail-config.c (mail_config_get_default_account): default_account
- now uses the account uid, so change the code a bit to match uid
- strings rather than use an index.
- (mail_config_remove_account): Same here. simplifies the code a
- bunch.
- (mail_config_set_default_account): Here too.
-
- * folder-browser-ui.c (folder_browser_ui_setup_view_menus): Update
- the GalView path.
-
-2003-02-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-session.c (do_get_pass): Change the logic here
- slightly. Instead of only reprompting the user if the cache is
- empty, also reprompt the user if the backend is forcing a
- reprompt.
- (request_password): If we have a cached passwd string for the
- account, fill-in the GtkEntry box with that value by
- default. This, together with the camel changes, fixes the
- "Evolution forgets my POP passwd if it gets a -ERR response during
- the login phase" bug.
-
-2003-02-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-searching-tokenizer.c: #include <stdio.h>
-
- * mail-config-factory.c: #include <string.h>
-
- * mail-config-druid.c (identity_prepare): Use
- gtk_editable_select_region() since gtk_entry_select_region() has
- been deprecated.
- (construct): Use gtk_window_set_resizable() instead of
- gtk_window_set_policy().
- (wizard_free): account_destroy() is no longer around, use
- g_object_unref() instead. (how did this even compile before?)
-
- * mail-account-gui.c (mail_account_gui_build_extra_conf): Use
- gtk_label_set_text_with_mnemonic() instead of
- gtk_label_parse_uline() as the latter has been deprecated.
-
-2003-02-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * importers/netscape-importer.c: Removed unused variables.
-
- * importers/pine-importer.c: Removed unused variables.
- (parse_address): Removed - it's unused and we have CamelAddress
- available to us anyway.
-
- * importers/elm-importer.c: Removed unused variables.
-
- * importers/evolution-mbox-importer.c (load_file_fn): Removed an
- unused variable.
-
-2003-02-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-editor.c (construct): Use
- gtk_window_set_resizable() instead of gtk_window_set_policy().
-
- * mail-config.c: Fix a bunch of warnings.
- (mail_config_signature_write): Removed.
-
- * mail-callbacks.c: Removed unused variables.
-
- * mail-accounts.c (mail_accounts_tab_class_init): Register a
- destroy virtual method.
- (mail_accounts_tab_destroy): Set mail_display->destroyed = TRUE.
-
- * message-list.c (message_list_destroy): Set
- mail_display->destroyed = TRUE. This is a workaround for the
- GTK_OBJECT_DESTROYED() macro that we used to use before.
-
- * mail-display.c (mail_display_destroy): Set
- mail_display->destroyed = TRUE. This is a workaround for the
- GTK_OBJECT_DESTROYED() macro that we used to use before.
-
-2003-02-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (build_tree): Use g_signal_emit() rather than
- gtk_signal_emit().
- (build_flat): Same here.
-
- * mail-signature-editor.c: #include <string.h>
-
- * mail-vfolder.c: #include <string.h>
-
- * mail-session.c: #include <string.h>
-
- * mail-search.c: #include <string.h>
-
- * mail-mt.c: #include <string.h>
-
- * mail-ops.c (save_part_save): Use strcasecmp() instead of
- g_strcasecmp().
-
- * mail-local.c: #include <string.h>
- (reconfigure_folder_reconfigured): Use a GtkDialog instead of
- gnome_error_dialog().
-
- * mail-format.c (find_preferred_alternative): Use g_ascii_strdown
- since g_strdown is deprecated.
- (fake_mime_part_from_data): Removed, no longer used it seems.
- (destroy_part): Also removed.
-
- * mail-display.c (make_popup_window): Replace call to
- gtk_window_set_polociy() with gtk_window_set_resizable() instead.
- (popup_size_allocate_cb): Use gtk_window_set_position() with
- GTK_WIN_POS_MOUSE instead of calculating the position to put it
- in.
-
-2003-02-10 Ettore Perazzoli <ettore@ximian.com>
-
- * importers/Makefile.am: Split the ORBit IDL compilation rules to
- work properly with parallel makes.
- (BUILT_SOURCES): Add this.
- (CLEANFILES): Add this.
-
- * Makefile.am: Split the ORBit IDL compilation rules to work
- properly with parallel makes.
- (BUILT_SOURCES): Add $(IDL_GENERATED) here.
- (CLEANFILES): Remove from here.
-
-2003-02-10 Rodney Dawes <dobey@ximian.com>
-
- * importers/Makefile.am: Add LDFLAGS to ported libs
-
-2003-02-10 Larry Ewing <lewing@ximian.com>
-
- * mail-display.c (save_url): look in the http cache for images
- when saving
- (image_save_as): remove random warning.
- (do_external_viewer): remove unused variable.
- (do_attachment_header): use g_ascii_strdown
-
-2003-02-07 Larry Ewing <lewing@ximian.com>
-
- * mail-display.c (save_data_cb): don't use random memory as a
- gconf client.
-
-2003-02-06 Chris Toshok <toshok@ximian.com>
-
- * importers/pine-importer.c (import_addressbook): track change to
- e_book_load_uri type.
-
-2003-02-06 Ettore Perazzoli <ettore@ximian.com>
-
- * folder-browser.c (on_right_click): Use
- e_auto_kill_popup_menu_on_selection_done() instead of
- e_auto_kill_popup_menu_on_hide().
-
-2003-02-06 Dan Winship <danw@ximian.com>
-
- * Makefile.am (INCLUDES): add EVOLUTION_PRIVDATADIR. Fix
- EVOLUTION_ICONSDIR
-
- * component-factory.c (owner_set_cb): Use EVOLUTION_PRIVDATADIR
- * mail-autofilter.c (filter_gui_add_from_message): Likewise
- (mail_filter_rename_uri): Likewise
- (mail_filter_delete_uri): Likewise
- * mail-callbacks.c (filter_edit): Likewise.
- * mail-search-dialogue.c (mail_search_dialogue_construct):
- Likewise
- * mail-session.c (main_get_filter_driver): Likewise
- * mail-summary.c (generate_folder_summaries): Likewise
- * mail-vfolder.c (vfolder_load_storage): Likewise
-
-2003-02-06 Dan Winship <danw@ximian.com>
-
- * Makefile.am: Remove *dir defs that are in configure.in now
- (INCLUDES): clean up using new *dir variables
- (libevolution_mail_la_LDFLAGS): remove -export-dynamic, add
- -module
-
- * main.c (main): s/PACKAGE/GETTEXT_PACKAGE/ in gettext init
-
- * importers/Makefile.am (INCLUDES): change EVOLUTION_DATADIR to
- EVOLUTION_PRIVDATADIR
-
- * importers/netscape-importer.c (netscape_import_filters): use
- EVOLUTION_PRIVDATADIR
-
-2003-02-06 Larry Ewing <lewing@ximian.com>
-
- * mail-session.c (pass_activate): add an activate handler to the
- entry so that hitting return will return an OK response.
-
-2003-02-05 Dan Winship <danw@ximian.com>
-
- * main.c (main): s/glade_gnome_init/glade_init/
-
-2003-02-05 Not Zed <NotZed@Ximian.com>
-
- * importers/netscape-importer.c: update from ../../importers/.
- (main): Removed.
- (mail_importer_module_init): Setup module init fn.
- (factory_fn): api changes.
- (is_dir_empty): deprecated changes, and clean up logic.
- (importer_cb): pulse progress bar, use idle function for
- processing next item.
- (import_next): Remove link before recursing, also fix memleak, and
- api changes.
- (netscape_import_file): dont release importer.
- (*): gconf'ify
-
- * importers/elm-importer.c (elm_factory_fn): Track the
- evolution_intelligent_importer, so we can unref it when done.
- (*): gconf'ify.
-
- * importers/pine-importer.c (parse_line): use gobject stuff rather
- than gtkobject.
- (import_addressfile): close down 'properly' when finished.
- (importer_timeout_fn): Do most processing decisions here, either
- from a timeout or idle function. This prevents us getting 1 stack
- frame per message and per folder. Close down properly also.
- (importer_cb): Add a timeout, ignore the callback, or add an idle
- function to process the next item.
- (pine_import_file): dont release the importer if we can't load it,
- its released elsewhere, i think.
- (import_addressfile): step the progress bar as we go.
- (factory_fn): Track the evolution_intelligent_importer, so we can
- unref when done.
- (*): gconf'ify
-
-2003-01-31 Not Zed <NotZed@Ximian.com>
-
- * importers/elm-importer.c (elm_can_import): g_file_exists ->
- lstat, and g_build_filename api changes.
-
- * importers/pine-importer.c: moved from
- ../../importers/pine-importer.c
- (factory_fn): oaf->bonobo_activation
- (mail_importer_module_init): setup factory.
- (main): Removed.
- (*): REemove bonobo config stuff.
- (factory_fn): destroy signal -> weak ref.
- (pine_destroy_cb): Fix signature for weak ref notify.
- (import_addressfile): use new glib filename stuff.
- (import_addressbook): same.
- (pine_can_import): and here.
- (import_next): and here.
- (scan_dir): and here
- (pine_create_structure): And here.
- (pine_can_import): g_file_exists -> lstat.
- (importer_cb): If there are more items, use an idle handler to
- drop back a few stack frames rather than recursing for each
- message.
- (import_next): unlink data from dir_list before recursing, and fix
- leak.
-
-2003-01-30 Not Zed <NotZed@Ximian.com>
-
- * importers/elm-importer.c (elm_destroy_cb): Change for weak ref
- setup.
- (elm_factory_fn): destroy -> weak ref.
-
-2003-01-29 Not Zed <NotZed@Ximian.com>
-
- * importers/elm-importer.c (importer_cb): Pass processItem off to
- an idle handler, so we dont blow our stacks. Also update to use
- progress_bar_pulse().
- (import_item_idle): Get the next message here instead.
- (import_next): Fix a glist leak. Unlink the file before we import
- it too. And close the dialogue and clean up when we've run out of
- folders to import.
-
-2003-01-17 Not Zed <NotZed@Ximian.com>
-
- * importers/elm-importer.c (elm_create_structure): use/free elmdir
- rather than double-free maildir.
-
-2003-01-16 Not Zed <NotZed@Ximian.com>
-
- * importers/elm-importer.c: update from ../importers/elm-importer.c
-
-2003-02-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (mail_regen_list): Get the thread_subject setting
- here instead of in regen_list_regen since that function will be
- called in another thread and we can't make corba calls in anything
- but the main thread.
- (regen_list_regen): Don't make CORBA calls here! (shame on me).
-
- * mail-identify.c (mail_identify_mime_part): Just use
- gnome_vfs_get_mime_type_from_name() so we can forget all the crap
- I implemented before.
-
-2003-02-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (on_link_clicked): Pass in the *address* of the
- GError to gnome_url_show(), otherwise bad things happen :-)
-
-2003-01-31 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_get_labels): New function to return a
- cached list of labels.
- (mail_config_get_label_color_by_name): New convenience function to
- search the cached labels.
- (mail_config_get_label_color_by_index): Same.
- (mail_config_init): Cache the labels and also listen for changes
- to them in the gconf db.
- (config_cache_labels): Internal function to cache the labels.
-
- * folder-browser.c (on_right_click): Fixed the label colours in
- the menu by using the cached linked list of labels.
-
- * mail-preferences.c (colorpicker_set_color): Now takes a string
- argument allowing us to get rid of converting a string into an rgb
- guint32 all over the place when trying to set defaults, since we
- now store colors in gconf as strings.
- (mail_preferences_construct): Use the cached labels (they are
- already parsed for us).
-
-2003-01-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (storage_remove_folder): Change
- strcmp(fi->path, path) to strcmp(fi->name, name) and now the
- execution takes the right path. My patch base on Callie's patch
- for bug #33525.
-
- * mail-identify.c (mail_identify_mime_part): Fixed a #warning by
- converting a local path into a file: uri before feeding it to
- gnome-vfs.
-
- * message-list.c (message_list_set_folder): Removed a FIXME that
- I've decided is no longer needed.
-
-2003-01-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_add_account): Emit the account-added
- event.
- (mail_config_remove_account): Emit the account-removed event.
-
- * mail-account-gui.c (mail_account_gui_save): Emit the changed
- event on the account-list for the changed account.
-
-2003-01-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-ui.c (folder_browser_ui_add_global): Set the
- paned_size here.
-
- * folder-browser.c (folder_browser_gui_init): Don't bother
- connecting to the hide-deleted, message-display-style, paned-size,
- nor show-preview gconf notifications anymore, since we can just
- set them when the view becomes active again in
- folder-browser-ui.c. Cuts down on extra overhead.
- (folder_browser_destroy): No need to disconnect from those
- notifications anymore either.
-
-2003-01-24 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (iconsdir): Remove, this is now defined in
- configure.in.
-
-2002-12-07 leon.zhang <leon.zhang@sun.com>
-
- * component-factory.c (user_create_new_item_cb): transfer the
- current acount info, which will be regarded as the sender of
- new composer, to send_to_url().
-
- * mail-callbacks.h (send_to_url): Add a new parameter for parent
- folder uri.
-
- * mail-callbacks.c (send_to_url): Create composer base on source
- account info from parent folder physical uri.
- (post_to_url): create composer based on current account from
- parent folder physical uri.
-
- * mail-display.c (on_link_clicked): Apply new format of function:
- send_to_url.
-
- Fixes bug #35123 #35289
-
-2003-01-24 Not Zed <NotZed@Ximian.com>
-
- * mail-local.c (non_equal): We do actually need to check they are
- file url's, otherwise, all url's match.
-
-2003-01-23 Rodney Dawes <dobey@ximian.com>
-
- * folder-browser.c (fb_resize_cb): Use button_release instead of
- size_allocate, and get the position from the Paned widget to prevent
- calling CORBA all the time for GConf stuff
-
-2003-01-23 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (componentdir): Removed definition; this is now
- defined in configure.in.
-
-2003-01-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_get_thread_list): Removed.
- (mail_config_set_thread_list): Removed.
- (mail_config_uri_renamed): No longer needs to change threaded
- state for each url either.
- (mail_config_write_on_exit): Updated.
-
- * folder-browser-ui.c (folder_browser_ui_add_list): Get the
- threaded state via gconf.
-
- * folder-browser.c (folder_browser_toggle_threads): Save the
- threaded state.
-
-2003-01-22 Ettore Perazzoli <ettore@ximian.com>
-
- * folder-browser-ui.c (folder_browser_ui_setup_view_menus): Use
- EVOLUTION_GALVIEWSDIR.
-
- * message-browser.c (set_bonobo_ui): Get
- evolution-mail-messagedisplay.xml from EVOLUTION_UIDIR.
-
- * mail-signature-editor.c (mail_signature_editor): Get
- evolution-signature-editor.xml from EVOLUTION_UIDIR.
-
- * folder-browser-ui.c (ui_add): Get the evoluiton-mail* XML files
- from EVOLUTION_UIDIR.
-
- * Makefile.am (INCLUDES): Define EVOLUTION_GALVIEWSDIR; update
- EVOLUTION_IMAGESDIR to include the $(BASE_VERSION).
- (gladedir): Version using $(BASE_VERSION).
- (etspecdir): Likewise.
- (iconsdir): Likewise.
- (buttonsdir): Likewise.
- (etspecdir): Likewise.
-
- * component-factory.c (owner_set_cb): Look for vfoldertypes.xml in
- the new version-aware location.
- * mail-summary.c (generate_folder_summaries): Likewise.
- * mail-search-dialogue.c (mail_search_dialogue_construct): Likewise.
- * mail-vfolder.c (vfolder_load_storage): Likewise.
-
- * mail-autofilter.c (filter_gui_add_from_message): Look for
- filtertypes.xml in the new version-aware location.
- (mail_filter_rename_uri): Likewise.
- (mail_filter_delete_uri): Likewise.
- * mail-session.c (main_get_filter_driver): Likewise.
- * mail-callbacks.c (filter_edit): Likewise.
-
-2003-01-22 Radek Doulik <rodo@ximian.com>
-
- * mail-callbacks.c (do_mail_print): put unrealized html widget
- into top level widget (gtk window) before realizing it
- destroy temporary widgets (w, html)
-
-2003-01-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_remove_account): Don't unref the
- account object, e_list_remove() apparently handles this for us.
-
- * mail-accounts.c (account_delete_clicked): Don't unref the
- confirm dialog, it was already destroyed.
-
-2003-01-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * evolution-mail.schemas: Default to hiding deleted
- messages. Fixes bug #35929.
-
- * mail-preferences.c (entry_changed): Removed.
- (toggle_button_toggled): Removed.
- (settings_changed): New callback that replaces the two above. No
- need to have multiple callback functions when the signature is the
- same.
-
- * folder-browser.c (folder_browser_toggle_hide_deleted): Don't
- !atoi (state) for the message_list_set_hidedeleted() call.
-
-2003-01-18 Larry Ewing <lewing@ximian.com>
-
- * mail-callbacks.c (save_msg_ok): e_question returns a boolean,
- don't test for a specific value.
-
- * mail-display.c (html_button_press_event): make the event
- handlers return FALSE so that gtkhtml can process the events.
- (on_link_clicked): call gnome_url_show with all its arguments so
- that it actually does something. Also pass news and nntp urls to
- gnome_url_show so that they can be handled properly.
-
-2003-01-17 Larry Ewing <lewing@ximian.com>
-
- * mail-format.c (handle_text_enriched): wrap eriched entries with
- a table so that they get proper indentation.
-
-2003-01-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-session.c (do_get_pass): Updated.
- (request_password): Same.
-
- * mail-send-recv.c (mail_send): Fixed to use EAccountService.
-
- * mail-config-druid.c (make_account): Updated to use EAccount and
- friends.
-
- * mail-account-gui.c (service_check_supported): Updated to use
- EAccountService.
- (mail_account_gui_new): Ref the account passed in and also update
- to use EAccount objects.
- (save_service): Updated to use an EAccountService.
- (add_new_store): Updated to use an EAccount.
- (mail_account_gui_save): Updated to use EAccounts.
- (setup_signatures): Updated because the new account->id->def_sig
- is now an int and not a structure pointer.
-
- * mail-account-editor.c (construct): Updated.
- (mail_account_editor_new): Now takes an EAccount object as an
- argument instead of a MailConfigAccount.
-
- * mail-crypto.c (mail_crypto_get_pgp_cipher_context): Updated to
- use EAccounts.
-
- * subscribe-dialog.c (populate_store_foreach): Removed.
- (populate_store_list): Can't use populate_store_foreach here
- because of the change to EAccountList so do it manually.
-
- * mail-vfolder.c (uri_is_ignore): Rewrote to use EAccountList and
- EIterator and all that fun.
-
- * mail-send-recv.c (build_dialogue): Updated to use EAccountList
- and EAccount object stuff. *ugh*
- (mail_send_receive): Here too.
- (mail_autoreceive_setup): Same.
-
- * mail-callbacks.c (check_send_configuration): Updated.
- (composer_get_message): Updated.
- (compose_msg): "
- (list_add_addresses): "
- (guess_me): "
- (guess_me_from_accounts): Same.
- (forward_get_composer): Here too.
- (mail_generate_reply): Same.
- (redirect_get_composer): "
- (empty_trash): And finally here.
-
- * mail-accounts.c (account_edit_clicked): Updated.
- (account_delete_clicked): Same.
- (account_default_clicked): Here too.
- (account_able_clicked): "
- (account_cursor_change): "
- (mail_accounts_load): Again here.
-
- * folder-browser.c (folder_browser_is_drafts): Updated to use
- EAccountList and EAccount stuff.
- (folder_browser_is_sent): Same.
-
- * component-factory.c (mail_load_storages): Updated to use
- EAccount and EAccountList stuff.
- (owner_set_cb): Same.
- (send_receive_cb): Here too.
-
- * mail-config.c: Rewritten to use EAccount and EAccountList
- objects.
-
-2003-01-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (get_fn): Connect to the toggled event on
- the transport_needs_auth toggle button so if the user turns this
- off after having deleted the username field, the Next button
- becomes re-enabled. Fixes bug #36862.
-
-2003-01-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-composer-prefs.c (sig_fill_clist): Same as below.
-
- * mail-account-gui.c (sig_fill_options):
- mail_config_get_signature_list() now returns a GSList instead of a
- GList.
-
- * mail-config.c (signature_new_from_xml): New function to parse a
- signature xml blob into a MailConfigSignature structure.
- (config_read_signatures): Rewritten to use above function.
- (signature_to_xml): New function to write a signature to xml.
- (config_write_signatures_num): Removed.
- (config_write_signature): Removed.
- (config_write_signatures): Rewritten to use signature_to_xml and
- gconf.
-
-2003-01-16 Dan Winship <danw@ximian.com>
-
- * mail-config.h (MailConfigAccount): Add a UID field (to match
- EAccount), which never changes and can be used by gconf watchers
- to distinguish an account rename from a deletion and creation.
-
- * mail-config.c (account_copy): Create a new UID on the new
- account.
- (account_new_from_xml): Read the UID. (If it doesn't have one,
- make one.)
- (account_to_xml): Write the UID.
-
- * mail-config-druid.c (make_account): add a UID to each account
-
-2003-01-15 Not Zed <NotZed@Ximian.com>
-
- * mail-accounts.c (account_able_clicked): Change the
- enable/disable button when the state changes.
-
-2003-01-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-local.c (save_metainfo): Back to using e_xml_save_file().
-
-2003-01-14 Ettore Perazzoli <ettore@ximian.com>
-
- * message-tag-editor.c (message_tag_editor_init): Make dialog
- Cancel/OK to match HIG.
-
- * mail-signature-editor.c (do_exit): Make confirmation dialog
- Discard/Cancel/Save to match the HIG.
-
- * mail-composer-prefs.c (mail_composer_prefs_construct): Make
- dialog Cancel/OK to match HIG.
-
- * mail-account-editor.c (construct): Make the dialog
- Apply/Close/OK to match HIG.
-
-2003-01-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_save): Call
- mail_config_save_accounts ().
-
- * mail-config.c (mail_config_save_accounts): New function to save
- accounts without having to re-load them.
-
-2003-01-14 Radek Doulik <rodo@ximian.com>
-
- * folder-browser.c (etree_key): use gtk_scrolled_window_*
- functions for mail_display->scroll
-
- * mail-display.c (mail_display_new): use gtk_scrolled_window_*
- functions
-
- * mail-display.h: use GtkScrolledWindow instead of EScrollFrame
-
-2003-01-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (pixmap_press): Change the user_data argument to
- be of type gpointer instead of EScrollFrame, since, well, it's not
- an EScrollFrame anymore.
-
-2003-01-14 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (libevolution_mail_la_SOURCES): Add mail-format.h.
- (EXTRA_DIST): Add $(schema_DATA).
-
-2003-01-14 Rodney Dawes <dobey@ximian.com>
-
- * Makefile.am: Make the component be unversioned as a shlib
-
-2003-01-14 Rodney Dawes <dobey@ximian.com>
-
- * folder-browser.c: Use GtkPaned instead of EPaned
-
-2003-01-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (account_new_from_xml): Perform some sanity
- checking on the auto-check-timeout value.
-
- * folder-browser.c (folder_browser_copy): Correctly create the
- clipboard buffer by using a nul to delimit the uri and the list of
- uids.
-
- * folder-browser-ui.c (folder_browser_ui_add_message): Check the
- state of message_style in gconf and set the menus accordingly.
-
- * folder-browser.c (folder_browser_destroy): Remove listener for
- message_style change notification.
- (folder_browser_gui_init): Connect a listener for changes to
- message_style.
-
- * mail-config.c (account_to_xml): Save the auto-check timeout
- value.
- (account_new_from_xml): Load the auto-check-timeout value.
-
-2003-01-13 Dan Winship <danw@ximian.com>
-
- * folder-info.c: s/BonoboXObject/BonoboObject/
-
- * mail-config.c: Likewise
-
- * mail-offline-handler.c: Likewise
-
-2003-01-13 Not Zed <NotZed@Ximian.com>
-
- * mail-mt.c (mail_msg_check_error): hook onto destroy to remove
- dialogue from active table.
- (error_response): Just destroy on any response, dont unref either.
-
-2003-01-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (mail_format_data_wrapper_write_to_stream):
- g_strdup the md->charset otherwise we'll get memory corruption
- later. This may be why non-usascii text is displaying incorrectly.
-
-2003-01-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-ui.c (folder_browser_ui_add_list): We also need
- to call message_list_set_hidedeleted() here so that any
- deactivated folder controls will change to the currently set state
- when re-activated.
- (folder_browser_ui_add_global): Same for show_preview.
-
- * folder-browser.c (hide_deleted_changed): Don't call
- message_list_set_hidedeleted() here.
- (folder_browser_toggle_hide_deleted): Instead, call it here. This
- way we get a faster "response time". Also, this will make it so
- that not all folder controls will regen their message-list at the
- same time.
- (folder_browser_toggle_preview): Same idea as the hide-deleted
- changes.
- (show_preview_changed): See above.
-
- * mail-config-druid.c (make_account): Default the new account to
- enabled.
- (wizard_finish_cb): Don't set enabled here.
-
-2003-01-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (hide_deleted_changed): New callback for when
- the HideDeleted state changes.
- (folder_browser_gui_init): Listen for changes to hide_deleted so
- we can update the menu state.
- (folder_browser_destroy): Remove the hide_deleted notify handler.
- (folder_browser_toggle_hide_deleted): When saving the setting,
- remember that it is !atoi (state) rather than atoi (state) because
- show vs hide. yea.
-
- * mail-session.c (main_get_filter_driver): notify-type is a int,
- not a bool. Duh.
-
-2003-01-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (factory): Updated for function rename.
-
- * mail-config-factory.c (mail_config_control_factory_cb):
- Namespaced the function name.
-
- * folder-browser-ui.c (folder_browser_ui_add_global): Don't add
- the listener for show_preview here, it was moved into
- folder-browser.c so we could detach the listener when the
- folder-browser is destroyed. Also prevents a listener being added
- multiple times (which was possible? before).
-
- * folder-browser.c (folder_browser_destroy): Remove the gconf
- notify handler for show_preview.
- (show_preview_changed): Moved here from folder-browser-ui.c
-
- * component-factory.c (storage_remove_folder): Fixed a situation
- in which we could notify the shell listener twice.
-
-2003-01-10 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.c (folder_browser_gui_init): Save the paned_size
- notify handle.
- (folder_browser_destroy): Remove gconf notify handler.
-
-2003-01-09 Chris Toshok <toshok@ximian.com>
-
- * mail-config-druid.c (wizard_finish_cb): enable the account
- before attempting to saving it.
-
- * mail-accounts.c (account_delete_clicked): need to show the
- buttons added to the dialog.
-
-2003-01-10 Not Zed <NotZed@Ximian.com>
-
- * mail-config.glade: Remove info.png from a couple of images, the
- image is set via code at runtime. Removes some annoying runtime
- warnings.
-
- * mail-send-recv.c (dialogue_response): dont unref the dialogue.
- (dialog_destroy_cb): null out the send_recv_dialogue after destroy.
- (build_dialogue): show the stop button
-
-2003-01-09 Chris Toshok <toshok@ximian.com>
-
- * folder-info.c (evolution_folder_info_notify_ready): pass bag to
- bonobo_pbclient_set_boolean.
-
-2003-01-09 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (owner_set_cb): Don't call
- mail_config_register_factory() or
- evolution_mail_config_wizard_init().
-
-2003-01-09 Not Zed <NotZed@Ximian.com>
-
- * mail-config-druid.c: Added druidpagestart1 to the pages list.
- (construct): Change the limits on the page initialisation, and
- widget_show_all on the page rather than the content.
-
- * GNOME_Evolution_Mail.server.in.in: Make Mail a shlib component.
-
- * folder-info.c (evolution_folder_info_factory_init): Removed.
- (evolution_folder_info_factory_fn): renamed to evolution_folder_info_new().
-
- * mail-config-druid.c (evolution_mail_config_wizard_factory_fn):
- Renamed to evolution_mail_config_wizard_new().
- (evolution_mail_config_wizard_init): Removed.
-
- * mail-config-factory.c (mail_config_register_factory): Remove.
- (config_control_factory_cb): make this public.
-
- * Makefile.am: setup evolution-mail as a shared library.
-
- * component-factory.c (make_factory): implement the bonobo-plugin
- factory for shlib operation. Also, preliminary work to setup mailer-specific
- (factory): Implement the factory which starts various components.
-
- * mail-config.c (xml_get_prop): g_free->xmlFree
- (account_to_xml): copy xml memory to glib memory when adding the 0
- on the end of the string.
- (accounts_save): Use slightly different logic with appending to
- the tail of the list, we can't use the &node trick with gslists.
- (accounts_changed): Same here.
-
-2003-01-08 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am: Images are now in $(datadir)/evolution/images
- instead of $(datadir)/images/evolution.
-
-2003-01-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-ui.c (folder_browser_ui_add_global): Call
- folder_browser_set_message_preview().
-
- * mail-config.c (mail_config_get_show_preview): Removed.
- (mail_config_set_show_preview): Removed.
-
- * folder-browser.c (folder_browser_toggle_preview): Simply set the
- gconf show_preview setting and let the code in folder-browser-ui.c
- detect it and update the UI.
-
- * folder-browser-ui.c (folder_browser_ui_add_global): Listen for
- changed events on the show_preview setting.
-
- * mail-config.c (mail_config_set_default_account): Save the
- setting via gconf.
- (mail_config_add_account): Immediately save the list of accounts.
- (mail_config_remove_account): Same.
- (mail_config_signature_run_script): g_free the charset value and
- use the composer's charset rather than the display charset.
- (mail_config_get_default_account_num): Removed.
-
-2003-01-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (save_cursor_pos): Use gconf to get the paned
- size.
- (folder_browser_set_message_preview): Same.
- (folder_browser_toggle_hide_deleted): Use gconf to set the
- hide-deleted state.
- (folder_browser_set_message_display_style): Same but for the
- message_display_style.
- (fb_resize_cb): Save the paned_size via gconf.
- (paned_size_changed): Callback for when the paned_size gets
- changed. Change the folder-browser's paned size to the new
- setting.
- (folder_browser_gui_init): Listen to changes to the paned_size and
- also get the initial size from gconf.
-
- * message-list.c (message_list_set_folder): Use gconf.
- (regen_list_regen): Use gconf.
-
- * message-browser.c (transfer_msg_done): Use gconf to get the
- hide_deleted setting.
-
- * mail-account-gui.c (sig_add_new_signature): Use gconf.
-
- * folder-browser-ui.c (folder_browser_ui_add_list): Use gconf.
-
- * folder-browser.c (save_cursor_pos): Use gconf.
- (folder_browser_set_message_preview): Same.
- (folder_browser_toggle_hide_deleted): Here too.
- (folder_browser_set_message_display_style): And here.
- (folder_browser_gui_init): Here too.
- (done_message_selected): And here.
-
- * mail-config.c (mail_config_get_thread_subject): Removed.
- (mail_config_set_thread_subject): Removed.
- (mail_config_get_empty_trash_on_exit): Removed.
- (mail_config_set_empty_trash_on_exit): Removed.
- (mail_config_get_last_filesel_dir): Removed.
- (mail_config_set_last_filesel_dir): Removed.
- (mail_config_get_hide_deleted): Removed.
- (mail_config_set_hide_deleted): Removed.
- (mail_config_get_paned_size): Removed.
- (mail_config_set_paned_size): Removed.
- (mail_config_get_send_html): Removed.
- (mail_config_set_send_html): Removed.
- (mail_config_get_confirm_unwanted_html): Removed.
- (mail_config_set_confirm_unwanted_html): Removed.
- (mail_config_get_citation_highlight): Removed.
- (mail_config_set_citation_highlight): Removed.
- (mail_config_get_citation_color): Removed.
- (mail_config_set_citation_color): Removed.
- (mail_config_get_do_seen_timeout): Removed.
- (mail_config_set_do_seen_timeout): Removed.
- (mail_config_get_mark_as_seen_timeout): Removed.
- (mail_config_set_mark_as_seen_timeout): Removed.
- (mail_config_get_prompt_empty_subject): Removed.
- (mail_config_set_prompt_empty_subject): Removed.
- (mail_config_get_prompt_only_bcc): Removed.
- (mail_config_set_prompt_only_bcc): Removed.
- (mail_config_get_confirm_expunge): Removed.
- (mail_config_set_confirm_expunge): Removed.
- (mail_config_get_confirm_goto_next_folder): Removed.
- (mail_config_set_confirm_goto_next_folder): Removed.
- (mail_config_get_goto_next_folder): Removed.
- (mail_config_set_goto_next_folder): Removed.
- (mail_config_get_http_mode): Removed.
- (mail_config_set_http_mode): Removed.
- (mail_config_get_default_forward_style): Removed.
- (mail_config_set_default_forward_style): Removed.
- (mail_config_get_default_reply_style): Removed.
- (mail_config_set_default_reply_style): Removed.
- (mail_config_get_message_display_style): Removed.
- (mail_config_set_message_display_style): Removed.
- (mail_config_get_default_charset): Removed.
- (mail_config_set_default_charset): Removed.
- (mail_config_get_x_mailer_display_style): Removed.
- (mail_config_set_x_mailer_display_style): Removed.
-
- * subscribe-dialog.c (populate_store_list): Use the list of
- accounts. We can't get the list of sources anymore.
- (populate_store_foreach): Updated.
-
- * mail-callbacks.c (guess_me_from_accounts): Use account->enabled.
- (mail_generate_reply): Same.
- (empty_trash): Here too.
-
- * mail-accounts.c (account_delete_clicked): Use account->enabled
- rather than source->enabled.
- (account_able_clicked): Same.
- (account_cursor_change): Here too.
- (mail_accounts_load): And here.
-
- * component-factory.c (owner_unset_cb): Use gconf empty-on-exit
- settings.
- (mail_load_storages): Use account->enabled rather than
- account->source->enabled. The struct changed.
-
- * mail-composer-prefs.c (sig_add): Get the send_html pref from gconf.
-
- * message-tag-followup.c (target_date_new): Use gconf.
-
- * mail-config.c (mail_config_get_week_start_day): Removed.
-
- * mail-tools.c (mail_tool_quote_message): Use gconf here too, but
- we don't need to parse the colour - just use it as a raw string.
- (mail_tool_forward_message): Use gconf.
-
- * mail-format.c (mail_format_data_wrapper_write_to_stream): Use gconf.
- (write_headers): Use gconf.
- (handle_text_plain): Same.
-
- * mail-display.c (mail_text_write): Updated to use gconf and parse
- GdkColour strings.
- (on_url_requested): Updated to use gconf.
-
- * mail-callbacks.c (ask_confirm_for_unwanted_html_mail): Use gconf
- rather than the old mail-config APIs which will be removed.
- (ask_confirm_for_empty_subject): Same.
- (ask_confirm_for_only_bcc): Here too.
- (composer_get_message): And here.
- (create_msg_composer): Same.
- (transfer_msg_done): Again here.
- (delete_msg): Here too.
- (confirm_expunge): And finally here.
-
- * mail-config.c (mail_config_write): Use gconf.
- (mail_config_get_sources): Removed.
-
- * mail-account-gui.c (mail_account_gui_save): No need to save
- enabled-state anymore for a source.
-
- * mail-config-druid.c (wizard_finish_cb): Instead of setting
- account->source->enabled to TRUE, just set account->enabled to
- TRUE. The structures changed a bit.
-
- * mail-send-recv.c (mail_send_receive): Get the list of accounts
- instead of sources, and pass them along to build_dialogue. I'm
- trying to get rid of the mail_config_get_sources() api.
- (mail_autoreceive_setup): Here too.
-
- * mail-config.c (mail_config_get_filter_log): Removed.
- (mail_config_set_filter_log): Removed.
- (mail_config_get_filter_log_path): Removed.
- (mail_config_set_filter_log_path): Removed.
- (mail_config_get_new_mail_notify): Removed.
- (mail_config_set_new_mail_notify): Removed.
- (mail_config_get_new_mail_notify_sound_file): Removed.
- (mail_config_set_new_mail_notify_sound_file): Removed.
-
- * mail-session.c (main_get_filter_driver): Updated to use the
- gconf settings.
-
-2003-01-07 Dan Winship <danw@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_auto_detect_extra_conf,
- mail_account_gui_build_extra_conf): Don't translate the conf
- strings. Camel already did it.
-
-2003-01-06 Dan Winship <danw@ximian.com>
-
- * Makefile.am: remove idldir definition. (It's defined in
- configure.in now)
-
-2003-01-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (composer_get_message): Use
- e_destination_get_email() instead of e_destination_get_address()
- when checking that we have a list of valid recipients to send the
- message to because get_email() returns the addr-spec portion of
- the address, which is what we care about. if that doesn't exist,
- then the address is useless. This does all we can do mailer-side
- for the recent "SMTP Problem" thread.
-
-2003-01-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c: Fixed some build issues.
-
- * mail-search.c: Same.
-
- * mail-callbacks.c (save_draft_done): Use
- g_signal_handlers_disconnect_by_func().
- (manage_subscriptions): Use a weak_ref instead of connecting to
- the destroy event.
-
-2002-12-17 Jeffrey Stedfast <fejj@ximian.com>
-
- ...And a whole bunch more build fixes.
-
- * mail-vfolder.c (mail_vfolder_delete_uri): Don't use
- g_string_sprintfa() anymore since it is apparently deprecated.
-
- * mail-session.c (main_get_filter_driver): Don't use
- g_string_sprintfa() anymore since it is apparently deprecated.
-
- * mail-ops.c (build_from): Don't use g_string_sprintfa() anymore
- since it is apparently deprecated.
-
- * mail-callbacks.c (ask_confirm_for_unwanted_html_mail): Don't use
- g_string_sprintfa() anymore since it is apparently deprecated.
-
- * mail-autofilter.c: Don't use g_string_sprintfa() anymore since
- it is apparently deprecated.
-
- * folder-browser.c: Don't use g_string_sprintfa() anymore since it
- is apparently deprecated.
-
- * mail-search.c (mail_search_set_subject): Remove the unnecessary
- g_strdup()'age as well as fix a possible buffer overrun.
-
- * mail-local.c (mail_local_folder_construct): Use
- g_path_get_basename().
-
- * mail-config-druid.c (make_account): Don't use e_utf8_*
- functions.
-
-2002-12-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c #define a STANDARD_ISSUE_TABLE_OPEN string used
- for wrapping textual message parts to keep them being fully-left
- justified.
- (mail_format_raw_message): Wrap the content with a table so that
- text isn't fully left-justified.
- (write_hr): Use it here too.
- (handle_text_plain): And finally here.
-
-2002-12-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (mail_error_printf): Use camel_text_to_html()
- instead of e_text_to_html().
- (mail_text_write): Write the content directly to gtkhtml through
- an html stream filter.
-
- * mail-format.c (attachment_header): Use camel_text_to_html()
- instead of e_text_to_html().
- (write_text_header): Same.
- (write_address): Here too.
- (mail_get_message_rfc822): And here.
- (mail_get_message_body): And finally here.
-
-2002-12-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (handle_text_plain): Re-implemented to use
- streams. Also no need to check for html since
- camel-mime-part-utils.c now does this for us and will re-tag the
- mime-type as text/html thus the UI can be completely ignorant of
- this process.
- (handle_text_plain_flowed): Removed.
- (write_one_text_plain_chunk): Removed.
- (try_uudecoding): Removed.
- (try_inline_binhex): Removed.
- (handle_text_enriched): Re-implemented to use streams too.
-
-2002-12-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (write_text_header): Change the order of the args
- to be consistant with other write functions.
- (write_date): Same.
- (write_field_row_begin): Here too.
- (write_headers): Here too.
- (write_one_text_plain_chunk): Don't strdup just to pass it to
- mail_text_write() so that it can dup it yet again into html text
- and dup it yet a 3rd time into a GByteArray. Instead just write it
- to gtkhtml.
- (handle_*): Fixed arguments to take a MailDisplayStream instead of
- a GtkHTML widget and a GtkHMLStream.
-
- * mail-display.c (mail_display_render): Create a MailDisplayStream
- to pass to mail_format_mime_message() and
- mail_format_raw_message().
-
- * mail-display-stream.[c,h]: New stream to replace
- mail-stream-gtkhtml.c
-
- * mail-stream-gtkhtml.[c,h]: Removed.
-
-2002-12-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (check_send_configuration): Make sure the
- folder-browser is not NULL or we'll crash.
-
- * mail-preferences.c (mail_preferences_construct): Fix the colour
- code to get a guint32 rgb correctly (I think - can't test because
- the shell keeps crashing, yay).
-
- * message-tag-followup.c (construct): Don't re-use cell renderers
- - I'm not sure this is actually safe to do.
-
- * mail-session.c: Get rid of unneeded CamelObject casts.
- (user_message_response): Don't unref the dialog object after we've
- destroyed it.
-
- * mail-display.c (write_data_to_file): Don't unref the dialog
- object after we've destroyed it.
-
- * mail-callbacks.c: Same here.
-
- * component-factory.c: Here too.
-
- * message-tag-editor.c: Added MESSAGE_TAG_EDITOR_GET_CLASS macros.
-
-2002-12-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (mail_accounts_tab_construct): Setup
- double-click here.
-
-2002-12-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (account_delete_clicked): Get rid of the ETable
- #ifdef's - we won't ever be using ETable.
- (account_default_clicked): Same.
- (account_able_clicked): Here too.
- (mail_accounts_load): And here.
- (mail_accounts_treeview_new): Renamed from etable_new since we
- won't ever be using an etable.
- (mail_accounts_tab_construct): And finally here.
-
-2002-12-12 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.c (my_folder_browser_init): cast a-warning a-way.
-
- * mail-composer-prefs.c (spell_setup): Terminate list_store_set
- with -1.
-
- * mail-accounts.c (mail_accounts_etable_new): clist -> gtktreeview
- stuff. Yes, this is not an etable.
- (mail_accounts_tab_construct): Same.
- (mail_accounts_load): Same.
- (account_cursor_change): Same.
- (account_able_clicked): And this.
- (account_default_clicked): Same.
- (account_delete_clicked): Guess?
- (account_edit_clicked): And here too.
-
-2002-12-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (mail_format_data_wrapper_write_to_stream): New
- function to handle a lot of the filtering/etc that was done in
- mail_format_get_data_wrapper_text(). This is the first step toward
- getting rid of e-text-to-html crap and using my tohtml stream
- filter instead.
- (mail_format_get_data_wrapper_text): Use the new function.
- (mail_format_raw_message): Use camel streams to write the content
- to gtkhtml rather than using get_data_wrapper_text() and then
- converting that to html and then writing it to the gtkhtml stream.
-
-2002-12-10 Not Zed <NotZed@Ximian.com>
-
- * mail-composer-prefs.c (mail_composer_prefs_construct): language
- is a treeview now. Not sure what to do with it yet, but get rid
- of one warning anyway.
- (mail_composer_prefs_construct): Same for sig_clist, but setup
- model.
- (sig_fill_clist): Change to use a gtktreeview instead of a clist.
- (sig_selection_changed): New method to handle signature selection
- changes with the new widgets.
- (sig_delete): clist -> treeview.
- (mail_composer_prefs_new_signature): Same.
- (sig_edit): ditto.
- (sig_current_sig): removed.
- (sig_row_unselect): Removed.
- (sig_row_select): Removed, now redundant.
- (spell_select_lang): Removed, redundant.
- (spell_set_ui_language): New implementation using list model more
- effectively.
- (spell_get_language_str): Same here.
- (spell_set_ui_language): Removed this too, merged into
- spell_set_ui, it was just wasting stack space.
- (spell_language_selection_changed): renemd from
- spell_language_select_row, converted to gtktreeview, etc.
- (spell_language_unselect_row): Removed.
- (spell_language_enable): Redone to use tree model.
- (spell_language_button_press): Removed, i dont think this is
- needed anymore.
- (spell_setup): dont hook onto redundant signals.
-
- * mail-config-factory.c (config_control_factory_cb): ignore
- mail-font-prefs in a different way (so we dont assert)
-
-2002-12-09 Chris Toshok <toshok@ximian.com>
-
- * mail-session.c (pass_response): pass "Mail" to e_passwords_*.
- (do_get_pass): same.
- (main_forget_password): same.
- (mail_session_get_password): same.
- (mail_session_remember_password): same.
- (mail_session_forget_password): same.
-
- * mail-config.c (mail_config_write_on_exit): pass "Mail" to
- e_passwords_*.
-
- * main.c (main): e_passwords_init is gone.
-
-2002-12-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (guess_me_from_accounts): Use the same logic as
- mail_generate_reply(). Fixes bug #34882
-
- Fixes bug #34315
-
- * component-factory.c (message_rfc822_dnd): Return TRUE if we
- successfully handled all messages in the mbox stream, or FALSE
- otherwise.
- (destination_folder_handle_drop): For TEXT_URI_LIST, use the
- retval from message_rfc822_dnd() rather than relying on an
- exception, because one will not always necessarily be set. For
- MESSAGE_RFC822, also use the retval from message_rfc822_dnd().
-
-2002-12-03 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.c (folder_browser_finalise/destroy): frobbed
- around with these till it exits without crashing.
-
- * message-list.c (message_list_destroy): made a destroy
- handler again (was dispose). Frobbed around with this and
- finalise till it can destroy without crashing.
-
- * message-browser.c (message_browser_new): ref/sink the
- folderbrowser.
-
-2002-11-25 Radek Doulik <rodo@ximian.com>
-
- * mail-preferences.c (mail_preferences_construct): magic_check -->
- magic_links_check
-
-2002-11-27 Not Zed <NotZed@Ximian.com>
-
- * message-tag-followup.c (construct): gnome_pixmap -> gtkimage.
- (construct): gtk_clist -> gtk_tree_view, setup columns. They dont
- size well :-/
- (message_tag_followup_append_message): Append using model, remove
- clist stuff.
- (construct): Show date edit (glade bugs?)
-
- * folder-browser.c (folder_browser_class_init): gtk_marshal -> g_cclosure_marshal
- (setup_popup_icons): gnome_pixmap -> gtk_image.
- (on_right_click): gtk_pixmap -> gtk_image.
-
- * mail-accounts.c (account_delete_clicked): removed #if 0'd out code.
-
- * mail-send-recv.c (receive_done): remove FIXME and extra unref.
-
- * mail-session.c (request_password): Removed #if 0'd out stuff.
-
- * mail-vfolder.c (new_rule_clicked): proper cast for g_object_get_data.
-
- * mail-local.c (reconfigure_response): cast for g_object_get_data.
-
- * mail-account-editor.c (construct): GNOME_DIALOG -> GTK_DIALOG.
-
- * *.[ch]: re-ran fix.sh for e_notice change
-
- * mail-callbacks.c (save_msg_ok): g_object_get_data +
- gtk_object_remove_no_notify -> g_object_steal_data.
- (find_socket): gtk_container_children ->
- gtk_container_get_children
- (edit_msg): gnome_*_dialog -> gtk_message_dialog.
- (resent_msg): "
- (search_msg): "
- (confirm_goto_next_folder): gtkmessagedialogised (even if not
- used).
- (confirm_expunge): gtkmessagedialogised
- (filter_edit): "
- (do_mail_print): e_notice -> gtk_message_dialog.
- (are_you_sure): removed e_gnome_ok_cancel_dialog crap, replaced
- with a gtk dialog.
- (are_you_sure): gtkmessagedialogised.
- (edit_msg_internal): Dont free uids array, are_you_sure() free's
- it.
- (resend_msg): Same.
- (check_send_configuration): Use e_notice for stuff. Sigh, here we
- go again ...!
- (e_question): A utility function to ask a question, potentially
- with 'dont ask again' as well.
- (configure_mail): use e_question to save code. Here we go again,
- again ...
- (ask_confirm_for_unwanted_html_mail): "
- (ask_confirm_for_only_bcc): "
- (ask_confirm_for_only_bcc): "
- (composer_get_message): Use e_notice.
- (composer_save_draft_cb): Use e_question
- (edit_msg): use e_notice, & change to an ERROR.
- (resend_msg): same.
- (save_msg_ok): Properly initialise ret to OK, and use e_question,
- and use access() to determine existance/write access rather than
- stat, display an error if we can't write to a file that exists,
- and print the filename in all dialogues.
- (confirm_goto_next_folder): Use e_question.
- (confirm_expunge): use e_question.
- (filter_edit): Use e_notice.
- (do_mail_print): use e_notice.
-
-2002-11-26 Not Zed <NotZed@Ximian.com>
-
- * mail-vfolder.c (vfolder_gui_add_rule): clicked->response signal
- for gtk dialogue.
- (new_rule_clicked): Dont unref after destroy (duh, idiot again).
- (edit_rule_response): Same here.
- (mail_vfolder_delete_uri): Connect response signal to
- gtk_widget_destroy directrly using g_signal_connect_swapped.
- (close_dialogue): Removed, as no longer needed.
-
- * message-list.c (get_normalised_string): Duh idiot, "un-fixed"
- the memleak i added.
-
- * mail-callbacks.c (composer_get_message): Set parent window in
- message dialogue & DESTROY_WITH_PARENT flag.
- (composer_save_draft_cb):
- (configure_mail):
- (check_send_configuration): Add DESTROY_WITH_PARENT flag to
- gtk_message_dialog's
- (local_configure_done): remove some unecessary/wrong casts.
- (empty_trash_expunged_cb): "
- (do_mail_print): use gtk_window_set_transient_for instead of
- e_dialog_set_parent.
-
-2002-11-26 Not Zed <NotZed@Ximian.com>
-
- * mail-account-editor.c (mail_account_editor_new):
- gtk_widget_set_parent_window -> gtk_window_set_transient_for.
-
- * mail-callbacks.c (composer_send_queued_cb): dont unref composer.
-
- * message-browser.c (message_browser_destroy): moved back from
- finalise.
-
-2002-11-25 Not Zed <NotZed@Ximian.com>
-
- * message-list.c (message_list_dispose): move saving tree state
- here.
- (message_list_finalise): And take it from here.
-
- * mail-display.c (mail_display_destroy): @#$@# gtk. changed this
- around a bit.
- (mail_display_init): Fix prototype, its a gobject.
- (mail_display_init): ref/sink the invisible gtkobject.
-
-2002-11-22 Not Zed <NotZed@Ximian.com>
-
- * mail-callbacks.c (ask_confirm_for_unwanted_html_mail): removed
- e_messagebox, and use gtk_message_dialog directly.
- (ask_confirm_for_empty_subject): and here.
- (ask_confirm_for_only_bcc): And here too.
- (msgbox_destroy_cb): Removed, since no longer needed.
-
-2002-11-15 Harry Lu <harry.lu@sun.com>
-
- * mail-display.c (write_data_to_file): Show file name when prompt
- to user for overwrite. Fixes bug #34180.
-
-2002-11-21 Harry Lu <harry.lu@sun.com>
-
- * mail-display.c (do_attachment_header): Enable dragging of all
- attachments. For bug #34327.
-
-2002-11-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-preferences.c (mail_preferences_construct): Since the
- GSList returned from gconf needs to be free'd by us, we don't need
- to strdup the values. Also make sure we don't leak the GSList
- itself.
- (mail_preferences_apply): Don't leak our GSList data.
-
-2002-08-30 Radek Doulik <rodo@ximian.com>
-
- * mail-display.c (mail_display_render): don't set margins for raw
- message view
-
- * mail-format.c (mail_format_raw_message): as below
- (handle_text_plain_flowed): as below
- (mail_format_raw_message): don't use data_urls
-
- * mail-display.c (mail_text_write): put text in iframe, so it has
- margins and should not be placed in table which changes wrapping
- behavior
-
-2002-11-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-composer-prefs.c (mail_composer_prefs_construct): gconfify.
- (mail_composer_prefs_apply): gconfify this also.
-
- * mail-preferences.c (mail_preferences_construct):
- gconf_client_get_string() probably returns an allocated buffer.
-
-2002-11-20 Not Zed <NotZed@Ximian.com>
-
- * importers/Makefile.am (%.server.in): provide a proper implicit
- rule for building .server.in from .server.in.in. The other one
- just copied the first target to all destinations(!).
-
- * importers/evolution-outlook-importer.c (outlook_factory_fn):
- destroy -> weak ref.
-
-2002-11-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-preferences.c (mail_preferences_apply): Save the settings
- via gconf.
- (mail_preferences_construct): Load the values from gconf.
-
-2002-11-19 Radek Doulik <rodo@ximian.com>
-
- * mail-composer-prefs.c (sig_load_preview): use
- gtk_html_begin_content to specify utf-8
-
-2002-11-19 Not Zed <NotZed@Ximian.com>
-
- * importers/evolution-mbox-importer.c (mail_importer_module_init):
- fix warning message, outlook->mbox.
-
- * importers/Makefile.am: fix serverdir to point to
- $libdir/bonobo/servers.
-
- * mail-callbacks.c (addrbook_sender): add type to
- bonobo_widget_set_property.
-
- * mail-vfolder.c (vfolder_editor_response): dont unref after destroy.
-
- * mail-session.c (pass_response): dont unref aftrer destroy.
-
- * mail-local.c (reconfigure_response): dont unref after destroy.
-
- * mail-display.c (launch_cb): dont unref after destroy.
- (launch_cb): "
- (drag_data_get_cb): "
- (html_button_press_event): add type to bonobo_widget::set_property
-
- * mail-config.c (mail_config_check_service): dont unref after
- destroy.
-
- * component-factory.c (send_receive_cb): dont unref after destroy.
- (request_quit): "
-
- * mail-signature-editor.c (mail_signature_editor): Use version 3.0
- of gtkhtml editor interfaces.
- (do_exit): dont unref after destroy.
- (format_html_cb): Add type to bonobo_widget::set_property.
-
-2002-11-18 Radek Doulik <rodo@ximian.com>
-
- * mail-composer-prefs.c (spell_setup_check_options): check
- exception state and take care when exception raised
-
-2002-11-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (mail_accounts_load): Specify the default
- account. Also, don't need to use e_utf8_to_gtk_string() here.
-
-2002-11-18 Not Zed <NotZed@Ximian.com>
-
- * Makefile.am (evolution_mail_LDADD): Added back
- libevolution-importer stuff.
- (SUBDIRS): Added back importers.
-
- * importers/evolution-mbox-importer.c (load_file_fn): build the
- uri without deprecated funcs.
- (load_file_fn): dont free/alloc a camel_exception for no obvious
- purpose.
- (mbox_factory_fn): use weak_ref rather than destroy.
- (importer_destroy_cb): fix signature for weak ref notify.
- (mbox_factory_fn): add cid param.
-
- * importers/*.[ch]: ran fix script over everything.
-
- * importers/*.server.in.in: Added bonobo activation files. Moved
- evolution-mail to @LIBEXEC@ as below.
-
- * importers/Makefile.am: oaf->bonobo activation stuff.
-
- * importers/evolution-outlook-importer.c (outlook_factory_fn): Add
- component id to callback.
-
-2002-11-15 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am: Add rules to substitute @LIBEXEC@ in
- GNOME_Evolution_Mail.server.in.in and install evolution-mail in
- $(libexecdir) instead of $(bindir).
-
- * GNOME_Evolution_Mail.server.in.in: Replaced evolution-mail with
- @LIBEXECDIR@/evolution-mail.
-
-2002-11-15 Rodney Dawes <dobey@ximian.com>
-
- * component-factory.c: Use bonobo_main_quit instead of gtk
-
-2002-11-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-composer-prefs.c (sig_edit): Correctly spell Advanced.
-
-2002-11-15 Not Zed <NotZed@Ximian.com>
-
- * mail-summary.c (create_summary_view): weak notify -> ref.
-
- * mail-send-recv.c (build_dialogue): weak notify -> ref.
-
- * mail-accounts.c (account_edit_clicked): weak notify -> ref, i
- presume this is what jeff meant, 'cause it dont compile otherwise.
-
-2002-11-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (account_edit_clicked): Use g_object_weak_ref
- rather than connecting to destroy.
- (account_add_clicked): Same.
-
- * mail-callbacks.c (addrbook_sender): Make this use
- g_object_weak_notify also.
- (subscribe_dialog_destroy): Add NULL guards here since I think we
- really do want to connect to the "destroy" signal in the function
- that connects us to that signal.
-
- * mail-config-factory.c (config_control_factory_cb): Same.
-
- * mail-display.c (save_part): Here too.
- (make_popup_window): And here.
-
- * mail-send-recv.c (build_dialogue): Same here.
-
- * mail-summary.c (create_summary_view): Use g_object_weak_notify
- instead of connecting to the destroy signal.
-
-2002-11-14 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (owner_set_cb): Want a (GWeakNotify) cast
- here, not (GWeakNotify *).
-
- * subscribe-dialog.c (fete_init): g_object_set() instead of
- gtk_object_set().
- (populate_store_list): Likewise.
- (menu_item_selected): g_object_get_data() instead of
- gtk_object_get_data().
-
- * message-list.c (message_list_create_extras): g_object_set()
- instead of gtk_object_set().
-
- * message-browser.c (message_browser_message_list_built):
- g_object_get_data() instead of gtk_object_get_data().
-
- * mail-vfolder.c (edit_rule_response): g_object_get_data() instead
- of gtk_object_get_data().
-
- * mail-summary.c (generate_folder_summaries): g_object_unref() the
- context instead of gtk_object_destroy().
-
- * mail-local.c (reconfigure_response): g_object_get_data() instead
- of gtk_object_get_data().
-
- * mail-display.c (pixbuf_gen_idle): g_object_unref() the GdkPixbuf
- loader instead of gtk_object_destroy().
- (pixbuf_gen_idle): Likewise.
- (embeddable_destroy_cb): Likewise.
-
- * mail-config-druid.c (mail_config_druid_destroy): No need to
- gtk_object_destroy() the GladeXML object.
- (construct): g_object_set() instead of gtk_object_set().
-
- * folder-browser.c (folder_browser_gui_init): g_object_get_data()
- instead of gtk_object_get_data().
-
-2002-11-14 Not Zed <NotZed@Ximian.com>
-
- * component-factory.c (create_view): shell client objref.
- (mail_add_storage): "
- (mail_remove_storage): "
-
-2002-11-13 Joe Shaw <joe@ximian.com>
-
- * Makefile.am: Remove a couple backslashes that were causing
- automake to complain, even though they were on lines that were
- -commented out-. Sigh.
-
-2002-11-13 Ettore Perazzoli <ettore@ximian.com>
-
- * folder-info.c (evolution_folder_info_factory_fn): Use
- g_object_new() instead of gtk_type_new().
- * folder-browser.c (folder_browser_new): Likewise.
- * mail-account-gui.c
- (mail_account_gui_folder_selector_button_new): Likewise.
- * mail-font-prefs.c (mail_font_prefs_new): Likewise.
-
-2002-11-13 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-format.c: Do not #include <libgnome/gnome-defs.h>.
- * mail-importer.c: Likewise.
- * mail-mt.c: Likewise.
- * mail-ops.c: Likewise.
- * mail-search-dialogue.c: Likewise.
- * mail-session.c: Likewise.
- * mail-vfolder.c: Likewise.
- * message-tag-followup.c: Likewise.
- * main.c: Likewise, and <libgnomeui/gnome-init.h>.
-
- * mail-callbacks.c: Do not #include <libgnome/gnome-paper.h>.
- (do_mail_print): Remove the GnomePaper local variable.
-
-2002-11-13 Not Zed <NotZed@Ximian.com>
-
- * component-factory.c (owner_set_cb): destroy->weak ref.
- (owner_set_cb): shell client changes.
-
- * mail-signature-editor.c (mail_signature_editor): bonobo api changes.
-
- * mail-local.c (save_metainfo): go back to using xmlSaveFile.
-
- * Makefile.am: Removed libevolution-importer from mail.
-
-2002-11-13 Not Zed <NotZed@Ximian.com>
-
- * GNOME_Evolution_Mail.server.in.in: Added to cvs. Currently
- contains no configurable stuff, but maybe it will one day.
-
- * Makefile.am (server_DATA): change oaf stuff to server stuff for
- bonobo activation.
-
- * mail-preferences.c (mail_preferences_apply): handle const entry text.
-
- * mail-composer-prefs.c (url_requested): Fixed typo.
- (mail_composer_prefs_construct): gnomepixmap->gtkimage.
-
- * mail-callbacks.c (configure_mail): destroy dialogue before dealing
- with response.
- (mail_generate_reply): Fix a typo.
- (popup_listener_cb): fix prototype.
- (tag_editor_response): Handle gtk dialog response.
- (flag_for_followup): Change gnome dialog to gtk dialog stuff.
- (tag_editor_destroy_cb):
- (tag_editor_cancel):
- (tag_editor_ok): Removed, handled in _response().
- (filter_editor_response): renamed from _clicked, handle gtk
- dialogue signal.
- (filter_editor_destroy): Removed.
- (footer_info_new): gnome font api changes.
- (do_mail_print): port to gnome print 2.
-
- * mail-autofilter.c (mail_filter_delete_uri): message_dialog uses
- a specific button enum, not the stock ones.
-
- * mail-accounts.c (mail_accounts_tab_get_type): gobjectify.
- (account_delete_clicked): gdkdialogise.
-
- * mail-account-gui.c (mail_account_gui_setup): Hack around font
- metric determination code.
-
- * mail-account-editor.c (mail_account_editor_get_type):
- gobjectise.
- (mail_account_editor_new): ""
-
- * folder-info.c (evolution_folder_info_notify_ready): use pbclient
- interface.
-
- * folder-browser-factory.c (control_destroy_cb): fix a typo.
- (folder_browser_factory_new_control): More typos.
-
- * folder-browser.c (on_right_click): cast around const warning.
- (context_menu_position_func): fix for api change.
-
- * e-searching-tokenizer.c (e_searching_tokenizer_finalise):
- Changed from destroy since it only frees memory.
- (e_searching_tokenizer_get_type): glibify.
-
- * component-factory.c (request_quit): gtkdialogise.
- (send_receive_cb): "
- (create_component): gdk_pixbuf api.
- (component_factory_init): bonobo activation stuff.
- (warning_response): renamed from warning_clicked.
- (owner_set_cb): gtkdialogise.
-
-2002-11-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * Makefile.am: Added files I've ported.
-
- * mail-config.c: Remove gnome-defs.h, this header no longer exists
- in GNOME2.
-
-2002-11-13 Not Zed <NotZed@Ximian.com>
-
- * Makefile.am: Commented out stuff that doesn't build yet. Also
- fixed idl build rule. importers still not built.
-
- * main.c (main): bonobactivationise. remove push visual/colormap.
- (main): no longer activate activation, let bonobo_init do it.
-
- * mail-signature-editor.c (menu_help): Change help api.
-
- * mail-session.c (user_message_destroy_noreply): removed. Not
- used?
-
- * mail-local.c (load_metainfo): xml root->children.
-
- * mail-format.c (g_string_append_len): Removed, it exists now.
-
-2002-11-12 Not Zed <NotZed@Ximian.com>
-
- * subscribe-dialog.c: gnome2ised, use gtkdialog.
- (subscribe_get_global_extras): use a weak ref rather than destroy
- signal.
-
- * message-tag-followup.c: gnome2ised.
-
- * message-tag-editor.c: gnome2ised & converted to gtkdialog.
-
- * message-list.c: gnome2ised.
- (message_list_finalise): From destroy method. maybe should be
- destroy still.
-
- * message-browser.c: port to gnome2
- (message_browser_finalise): renamed from destroy method.
-
- * mail-stream-gtkhtml.c: removed redundant
- camel_class_get_global_classfuncs() call.
-
- * mail-signature-editor.c: gtkdialogised, & bonobo api changes.
-
-
- * mail-search-dialogue.c: gtkdialogised.
-
- * mail-folder-cache.c: cleaned up camel ref/hook casts.
-
- * mail-composer-prefs.c (mail_composer_prefs_get_type): convert to
- gtype.
-
- * mail-font-prefs.c (mail_font_prefs_destroy): from finalise.
-
- * mail-config.c: s/bonobo_config/e_config_listener/ Added
- /apps/Evolution prefix to the evolution keys. Changed to use
- e_config_listener, etc.
- (mail_config_init): remove bonobo_config stuff.
- (mail_config_check_service): gtk dialogise.
- (check_response): from check_cancelled.
-
- * mail-config-druid.c (mail_config_druid_destroy): renamed from
- _finalize, turned into destroy handler.
- (construct): set type to toplevel, GTK_WINDOW_DIALOG no longer
- exists.
-
- * mail-config-factory.c (mail_config_register_factory): bonobo api
- changes.
-
- * mail-crypto.c (mail_crypto_get_pgp_cipher_context): cleaned up
- unref casts.
-
- * mail-display.c (write_data_to_file): gnome->gtkdialog.
- (on_link_clicked): use ascii_str*cmp on url.
- (save_part): g_path stuff.
- (launch_cb): gtk dialog.
- (pixmap_press): de-oafify.
- (pixbuf_for_mime_type): gnome-vfs api changes.
- (do_attachment_header): Change the pixmap to a gtkimage.
- (do_signature): "
- (pixbuf_gen_idle): "
- (do_attachment_header): ascii_str*cmp
- (do_attachment_header): gnome pixmap->gtkimage.
- (mail_display_destroy): protect against gtk mentalness.
- (html_button_press_event): ascii_str*cmp
- (drag_data_get_cb): added comment for translators of filename.
-
- * mail-format.c (component_supports): de-oafise.
- (is_anonymous): ascii_strncmp
- (attachment_header): remove utf8<>locale stuff, and gnomevfs api
- changes.
- (format_mime_part): fix g_strdown call.
- (write_field_row_begin): kill utf8->gtk stuff.
- (write_address): "
- (default_header_index): ascii_strcasecmp
- (handle_text_plain): "
- (handle_text_enriched): "
- (handle_multipart_encrypted): remove utf/gtk stuff.
- (handle_message_external_body): ascii_str*cmp
-
- * mail-identify.c (mail_identify_mime_part):
- (identify_by_magic): gnome vfs api changes.
-
- * mail-importer.c: Converted.
-
- * mail-local.c (load_metainfo): xml childs -> children.
- (mls_get_folder): g_strerror.
- (mls_delete_folder): g_strerror.
- (reconfigure_got_folder): Gnome->GtkDialog
- (reconfigure_response): from reconfigure_clicked.
-
- * mail-mt.c (mail_msg_check_error): gnome -> gtk dialog
- (error_response): renmae from error_gone. destroy widget on any
- response.
-
- * mail-offline-handler.c (impl_finalise): renamed from
- impl_destroy since thats what it should be anyway.
-
- * mail-ops.c: removed utf8 widget conversion & camel_object_un/ref
- casts.
-
- * mail-preferences.c (mail_preferences_get_type): glib2'ised.
-
- * mail-search.c (mail_search_finalise): renmaed from destroy &
- properly chain.
- (mail_search_get_type): glib2 & make gtkdialog parent.
- (entry_run_search): run search when entry activated. not sure if
- gtkdialog has anohter way to do this on an arbitrary widget.
-
- * mail-send-recv.c (dialogue_response): renamed from clicked. Use
- gtkdialog.
-
- * mail-session.c (request_password_deleted): removed, redundant.
- (pass_response): rename from pass_got, changed for gtkdialog.
- (user_message_destroy): Removed, redundant.
- (user_message_response): Renamed from user_message_clicked.
-
-2002-11-11 Not Zed <NotZed@Ximian.com>
-
- * mail-stream-gtkhtml.c (mail_stream_gtkhtml_class_init): dont use
- get_global_classfuncs, just get the type
-
- * mail-tools.c: converted gnome2 api's.
-
- * mail-vfolder.c (vfolder_editor_response): clicked->response.
- (vfolder_editor_destroy): Removed.
- (vfolder_edit): gtk dialog api
- (edit_rule_response): clicked->response.
- (vfolder_edit_rule): gnomedialog->gtkdialog.
- (vfolder_gui_add_rule): "
- (new_rule_clicked): clicked->response
-
-2002-11-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c: Half way ported. I'll finish the rest later.
-
- * mail-autofilter.c: Ported.
-
- * mail-account-gui.c: Ported.
-
- * mail-account-editor.c: Ported.
-
- * folder-browser-ui.c: Ported.
-
- * folder-browser-factory.c: Ported.
-
- * folder-browser.c: Ported.
-
- * e-searching-tokenizer.c: Roughly ported.
-
-2002-11-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * *.glade: Converted to libglade-2's format.
-
-2002-11-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-composer-prefs.c: Ported.
-
-2002-10-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (folder_browser_query_changed): No longer need
- to check for a CLEAR_ID.
-
-2002-10-28 Larry Ewing <lewing@ximian.com>
-
- * mail-format.c (handle_multipart_mixed): instead of bailing with
- an assertion dump the body.
-
-2002-10-27 Larry Ewing <lewing@ximian.com>
-
- * mail-display.c (fetch_next): don't queue the action until we've
- added ourselves to the active list, because the fetch_done
- callback can fire immediately and we'll end up queueing something
- that has already been destroyed.
-
-2002-10-24 Jeffrey Stedfast <fejj@ximian.com>
-
- Update the upgrade script to handle the new url format introduced
- with NotZed's most recent commits.
-
- * upgrade-mailer.c (mailer_upgrade): Save an encoded version of
- the namespace too, for use later.
- (si_free): Free the encoded namespace too.
- (imap_url_upgrade): Use the encoded namespace when creating the
- new url.
- (shortcuts_upgrade_xml_file): Upgrade the default: urls. Fixes bug
- #32127.
-
-2002-10-25 Not Zed <NotZed@Ximian.com>
-
- * mail-config.c (mail_config_uri_renamed): Always strdup the new
- key in the threaded/preview hash/always free the working copy.
- For #32799.
-
-2002-10-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (write_data_to_file): Use the mode 0666 when
- creating a new file and let the user's umask handle permissions.
-
- * folder-browser.c (message_list_drag_data_get): When using open()
- with the O_CREAT flag, we need to pass a mode argument. Also use
- O_EXCL.
-
-2002-10-24 Not Zed <NotZed@Ximian.com>
-
- * subscribe-dialog.c (fe_got_children): Use a hashtable to only
- insert nodes we dont have already, rather than relying on the
- scanning logic. Also, only re-sort this tree level once done
- rather than on each insert.
- (folder_etree_init): Setup hash to track nodes setup.
- (folder_etree_clear_tree): Reset hash.
- (fe_destroy): Free hash.
-
-2002-10-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (folder_browser_query_changed): Only perform
- the search if it is either a clear or advanced search.
-
-2002-10-22 Mike Kestner <mkestner@ximian.com>
-
- * mail-callbacks.c (transfer_msg): pass fb->uri to the folder
- selection dialog so the current folder is selected on display.
- "fixes" 15966.
-
-2002-10-21 Dan Winship <danw@ximian.com>
-
- * upgrade-mailer.c (mailer_upgrade): Fix the transport URL on any
- Exchange accounts. Fixes #30209, which is to say that it fixes
- #28490 correctly.
-
-2002-10-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-tools.c (mail_tool_quote_message): Strip the signature from
- the body-text. Fixes bug #5529.
-
-2002-10-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (handle_multipart_signed): Don't need to pass a
- path to camel_gpg_context_new () anymore.
- (mail_get_message_body): Same here.
- (handle_multipart_encrypted): Use camel_gpg_context_new () instead
- of mail_crypto_get_pgp_cipher_context ().
-
- * mail-preferences.c (mail_preferences_construct): There's no
- security tab anymore.
- (mail_preferences_apply): No need to save any pgp config data,
- there's nothing to configure!
-
- * mail-crypto.c (mail_crypto_get_pgp_cipher_context): Updated to
- not pass a pgp path into camel_gpg_context_new ().
-
- * mail-config.c (mail_config_clear): No need to free a pgp_path
- variable anymore, we don't need one.
- (config_read): Don't read in a pgp-path or pgp-type anymore.
- (mail_config_write_on_exit): Don't save a pgp-path or pgp-type
- anymore, we don't use them.
- (pgpopen): Removed.
- (pgpclose): Removed.
- (mail_config_pgp_type_detect_from_path): Removed.
- (auto_detect_pgp_variables): Removed.
- (mail_config_get_pgp_type): Removed.
- (mail_config_set_pgp_type): Removed.
- (mail_config_get_pgp_path): Removed.
- (mail_config_set_pgp_path): Removed.
-
-2002-10-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): If mode == REPLY_LIST
- and the mlist is "" (we only checked NULL before), change the mode
- to REPLY_ALL so that we don't accidently reply to the user's
- address. Fixes bug #28735
-
-2002-10-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): If we are trying to
- reply to a list, first check that we can by getting the mlist
- token (makes it easier to fix the mem leak). If not, then change
- the mode to REPLY_ALL. If we can reply to list, the make sure we
- free the CamelMessageInfo when we're done so we don't leak.
-
-2002-10-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-session.c (main_get_filter_driver): Add the new-mail-notify
- rule to the filter driver before adding the user defined filter
- rules so that we can be sure that the new-mail-notify rule gets
- invoked. Fixes bug #32328.
-
- * mail-composer-prefs.c (mail_composer_prefs_new_signature): Make
- sure that name[0] cannot ever be NULL. Should maybe fix bug
- #32230.
-
-2002-10-15 Dan Winship <danw@ximian.com>
-
- * upgrade-mailer.c (shortcuts_upgrade_xml_file): Change the type
- in LDAP shortcuts from "ldap-contacts" to "contacts/ldap". Rewrite
- this to use libxml since that was easier than trying to make the
- old code do both kinds of changes at once.
-
-2002-10-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (management_prepare): Only set an account
- name if one doesn't already exist. Also use the
- e_utf8_gtk_entry_get/set_text functions since account names are
- supposed to be in UTF8. Fixes bug #31891.
-
-2002-10-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (main_folder_changed): Don't do anything if the
- message_list is NULL (this means the FolderBrowser has been
- destroyed). Fixes bug #32002.
-
-2002-10-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (storage_remove_folder): The CamelFolderInfo
- that we get back has nodes for all parent folders, so do not
- delete all folders that have nodes in the returned tree. Instead,
- descend into the tree until we find the folder we want to delete
- and start deleting from there.
-
-2002-10-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-signature-editor.c (mail_signature_editor): Mark a string
- for translation, fixes bug #31942. Thanks to kmaraas@gnome.org for
- this patch.
-
- * mail-offline-handler.h: Don't #include config.h here. Fixes bug
- #31941.
-
-2002-10-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-composer-prefs.c (spell_load_values): Don't mark "en" for
- translation. Fixes bug #31788.
-
- * mail-config.glade: Removed a "xxxxxxxxxxx" string so that
- translators don't need to translate it. It was only a filler
- string. Fixes bug #31789.
-
-2002-10-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): Don't default 'me' to
- the source account until after we've tried to detect the account
- based on recipients. When adding accounts to the account hash, if
- any accounts have identical email addresses, the ones that are
- enabled take precedence over ones that aren't. This will hopefully
- make everyone happy with reply account picking. Fixes bug #31693.
-
-2002-10-01 Larry Ewing <lewing@ximian.com>
-
- * mail-display.c (drag_data_get_cb): add support for dragging the
- content type directly.
- (do_attachment_header): add the target for the mime type to the
- drag source.
- (drag_data_get_cb): silence warning.
-
-2002-10-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (get_fn): Connect to the changed signal for
- the reply_to entry box. Fixes bugs #31553 and #31554.
-
- * mail-composer-prefs.c (spell_setup): Only setup the languages if
- the language_seq is not CORBA_OBJECT_NIL. Fixes bug #31559
- (presumably at least).
-
- * mail-account-gui.c (mail_account_gui_new): Use
- e_utf8_gtk_entry_set_text for the email address and reply-to
- fields. Fixes bug #31555.
-
- * mail-format.c (mail_get_message_body): Handle a
- multipart/encrypted part. Fixes bug #31547.
-
- * upgrade-mailer.c: Shut up some compiler warnings.
-
- * importers/evolution-mbox-importer.c (process_item_fn): Use the
- camel_message_info_new/free functions rather than g_new0 and
- g_free. Also, if we fail to parse a message make sure we don't
- later try to use that message object.
- (get_info_from_mozilla): Use camel_message_info_new and strtoul
- instead of string_to_int.
-
-2002-09-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * subscribe-dialog.c (fe_node_to_shell_path): Removed (useless).
-
-2002-10-01 Ettore Perazzoli <ettore@ximian.com>
-
- [Fix #24732]
-
- * importers/evolution-mbox-importer.c (process_item_fn): Set
- deleted to FALSE when not having Mozilla status headers. Before
- it was being left uninitialized and so there was a pretty good
- chance that its value would be nonzero and hence the message would
- not be imported...
-
-2002-10-01 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.c (on_cursor_activated): cursor activated on
- etable is required to know when the selection changes on a single
- row, update selection changed info with this signal too. Sounds
- like an etable bug to me, but this fixes #29808.
- (folder_browser_gui_init): Hook onto above signal.
-
-2002-09-30 Aaron Weber <aaron@ximian.com>
-
- * mail-signature-editor.c (mail_signature_editor): change
- string to "Enter a name for this signature" on line 372.
-
- * mail-callbacks.c (ask_confirm_for_unwanted_html_mail): change
- HTML-mail warning on 255
-
- * component-factory.c (component_factory_init): change
- "Evolution's foo" to "the Evolution foo" in string on 1078
-
-2002-09-30 Not Zed <NotZed@Ximian.com>
-
- * mail-session.c (request_password): translate prompt from utf8 to
- gtk widget. #31365.
-
-2002-09-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * e-searching-tokenizer.c: #include <stdlib.h> for alloca
- (searcher_next_token): Changed slightly to make sure that m is not
- NULL before dereferencing it. Also initialise m to NULL so that it
- can't be used uninitialised (NULL is a safe initialised value
- here).
- (build_trie): Same, but for n.
-
-2002-09-26 Dan Winship <danw@ximian.com>
-
- * mail-config.c (impl_GNOME_Evolution_MailConfig_addAccount,
- impl_GNOME_Evolution_MailConfig_removeAccount): Set a timeout to
- call mail_config_write() in 2 seconds. Otherwise changes made by
- this interface would not be saved to disk unless the user also
- changed some other preference.
- (mail_config_write_on_exit): If there's a config_write_timeout
- pending, call mail_config_write() too.
-
-2002-09-25 Dan Winship <danw@ximian.com>
-
- * mail-display.c (mail_display_render): Add a margin around the
- "flag for followup" table so it lines up with everything else.
- Also, don't add "at your earliest convenience" after the flag if
- there's no date set, since that doesn't make any sense for half of
- the flags. ("For Your Information at your earliest convenience").
-
-2002-09-25 Dan Winship <danw@ximian.com>
-
- * component-factory.c (folder_types): add "mail/public". Leave
- "vtrash" as it is rather than renaming it to "mail/vtrash",
- because we want it to behave differently from normal mail folders
- more often than we want it to behave the same.
- (type_is_mail, type_is_vtrash): utility funcs
- (create_view, create_folder, remove_folder, xfer_folder,
- populate_folder_context_menu, unpopulate_folder_context_menu,
- destination_folder_handle_drop, storage_create_folder): Use
- type_is_mail/type_is_vtrash.
- (create_component): Register "New Post" with "mail/public" instead
- of "mail" so it becomes the default New icon for it. (29024)
-
- * mail-callbacks.c (transfer_msg): Use "mail/*" for allowed type.
-
- * message-browser.c (transfer_msg): Likewise.
-
- * mail-account-gui.c (mail_account_gui_new): Use "mail/*" instead
- of "mail" here for sent/drafts allowed type. (?)
-
-2002-09-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * upgrade-mailer.c (imap_url_upgrade): NULL-check si->folders
- before passing it into find_folder so we don't crash. Fixes bug
- #30915.
-
-2002-09-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-ui.c: Allow users to delete already deleted
- messages, fixes bug #30827.
-
-2002-09-24 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.c (folder_browser_query_changed): Always do a
- search if the query changed. For #31060 & #29625.
-
-2002-09-23 Radek Doulik <rodo@ximian.com>
-
- * mail-config.c (mail_config_signature_run_script): pass name of
- the script as 1st parameter
-
- * mail-composer-prefs.c (sig_add_script_add): fix entry's glade
- name
-
-2002-09-23 Dan Winship <danw@ximian.com>
-
- * mail-signature-editor.c (exit_dialog_cb): Fix non-ANSI switch
- statement.
-
- * mail-account-gui.c (mail_account_gui_auto_detect_extra_conf):
- Likewise.
-
- * mail-composer-prefs.c (spell_load_values): add some dummy
- typedefs to avoid empty macro arguments, which have undefined
- behavior.
-
- * mail-importer.c: #include <sys/types.h> for OS X
-
-2002-09-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (save_part_save): Use 0666 as the create mode so that
- the user's umask is used to it's fullest.
-
-2002-09-23 Dan Winship <danw@ximian.com>
-
- * Makefile.am (idldir, idl_DATA): add these and install Mailer.idl
-
-2002-09-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-preferences.c (mail_preferences_construct): Connect signal
- handlers to the GtkHTML preferences so that when the widgets
- change we can update the OK/Apply buttons. Also removed the
- omenuShortcutsType widget reference since this was not being used?
- Fixes bug #30731.
-
-2002-09-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (do_edit_messages): Unset the changed bit on
- the composer and also drop any undo operations (since we loaded
- the message into the composer). Fixes bug #30580.
-
-2002-09-19 Not Zed <NotZed@Ximian.com>
-
- * mail-session.c (main_get_filter_driver): Fix for filter driver
- api change.
-
-2002-09-18 Not Zed <NotZed@Ximian.com>
-
- * mail-config-druid.c (wizard_back_cb): If going back from a page
- past our end (i.e. the final page), jump to the last page we know
- of. For #29293.
-
- * component-factory.c (notify_listener_exception): helper to map a
- camel excpeiton to a listener result.
- (storage_create_folder): Use above to return more meaningful error.
- (storage_remove_folder): "
- (storage_xfer_folder): ". For #28209.
-
-2002-09-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (mail_display_render): Use e_strftime_fix_am_pm
- here which fixes locale issues as well as working around systems
- that don't support %P (afaik).
-
- * mail-ops.c (prep_offline_do): Cache important messages too.
-
- * mail-composer-prefs.c (d): Disable debugging printf's
-
- * mail-ops.c: fixed a comment
-
-2002-09-13 Dan Winship <danw@ximian.com>
-
- * folder-browser.c (fb_resize_cb): If the vpaned isn't realized,
- don't call mail_config_set_paned_size. Fixes a problem with the
- saved pane size being repeatedly lost (#29933)
-
-2002-09-13 Dan Winship <danw@ximian.com>
-
- * Mailer.idl: rename this from "Mail.idl" so that the generated .h
- file won't overwrite "mail.h" on Mac OS X. Remove some
- never-implemented IDL and add MailConfig_removeAccount.
-
- * Makefile.am: Update for IDL rename
-
- * mail-config.c: #include Mailer.h, not Mail.h
- (impl_GNOME_Evolution_MailConfig_removeAccount): Implement.
-
- * folder-info.c: #include Mailer.h, not Mail.h
-
- * message-list.c: Remove Mail.h include.
-
-2002-09-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * main.c (main): Ignore SIGXFSZ to fix bug #30269.
-
- * upgrade-mailer.c (cache_upgrade_and_free): The new callback
- function for the g_hash_table_foreach which both upgrades the
- cache for that store and then free's the struct _storeinfo
- afterwards.
- (cache_upgrade): Upgrade a cached folder by moving the old cache
- folder into the appropriate new location.
-
-2002-09-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (folder_browser_query_changed): Only abort if
- the user selected ADVANCED_SEARCH, not the other way around. Any
- other menu item and we are supposed to perform an actual
- search. Fixes bug #30183.
-
- * mail-display.c (pixbuf_for_mime_type): check the new gnome-vfs
- icon_filename key. If that fails, fall back to checking
- icon-filename. Also don't leak the fm_icon string and rearranged
- some code.
-
-2002-09-11 Not Zed <NotZed@Ximian.com>
-
- * component-factory.c (configure_folder_popup): Handle file uri's
- too.
-
- * mail-callbacks.c (configure_folder): clear message list before
- calling configure folder.
- (local_configure_done): completion callback to reset message list
- when done.
-
- * mail-local.c (mail_local_reconfigure_folder): changed args to
- accept uri, and done callback.
- (reconfigure_got_folder): moved code to callback which presents
- the configure uri once we have the folder.
-
-2002-09-10 Not Zed <NotZed@Ximian.com>
-
- * component-factory.c: Handle file: as well as vfolder: uri's.
- Pass both to the normal configure_folder callback. For #20849.
-
- * folder-browser.c (got_folder): If we already have a folder, make
- sure we unref/unhook from it. Fixes a crash on exit.
-
- * message-list.c (message_list_hide_clear): clear thread tree
- cache if set.
- (message_list_set_search): Same. For bug #28834.
-
-2002-09-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-ui.c (folder_browser_ui_scan_selection): Make
- sure that fb->message_list is non-NULL before checking
- fb->message_list->threaded? I guess this'll fix bug #29965.
-
- * mail-callbacks.c (composer_save_draft_cb): NULL-check the ccd
- before reffing it.
- (composer_send_cb): Same.
-
- * upgrade-mailer.c (shortcuts_upgrade_xml_file): Don't look for an
- end quote, instead look for </item> to terminate the uri.
- (shortcuts_upgrade_uri): Hex decode the imap folder name after
- we've constructed the final version of it.
-
-2002-09-08 Dan Winship <danw@ximian.com>
-
- * upgrade-mailer.c (exchange_url_upgrade): Don't modify the URL if
- the path doesn't start with "exchange". (Means it's already a 1.2
- URL.)
- (shortcuts_upgrade_uri): Need to hex-decode exchange URLs here too.
- (shortcuts_upgrade_xml_file): Fix an off-by-one error here (twice)
- so it actually works instead of always claiming shortcuts.xml
- doesn't need to be upgraded.
- (mailer_upgrade): Check the size of the accounts hash rather than
- imap_sources since we have work to do if the user has an exchange
- account but no imap accounts.
-
-2002-09-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * upgrade-mailer.c (upgrade): Sync the database after upgrading
- mailer stuff.
- (imap_url_upgrade): Since we need 'p' if we fail to find the
- folder, don't g_free it until later.
- (hex_encode): Don't forget to increment inptr after hex encoding a
- character.
- (exchange_url_upgrade): Apprently exchange uri's are rebelious and
- do not want to be hex encoded like every other url, so hex decode
- the folder names here before concatenating them onto the base url.
-
-2002-09-05 Jeffrey Stedfast <fejj@ximian.com>
-
- All this snot is to fix bug #29930. What I think was happening was
- that the composer's destroy callback got fired off before the
- async callback did.
-
- * mail-callbacks.c (ccd_new): New convenience function to malloc a
- new ccd.
- (ccd_ref): ccd is now ref_counted (it needs to be) so we now have
- this.
- (ccd_unref): And we need this now too of course.
- (composer_destroy_cb): composer's new destroy callback function -
- unref's the ccd.
- (composer_send_queued_cb): unref the ccd.
- (composer_send_cb): ref the ccd here.
- (save_draft_done): unref the ccd.
- (composer_save_draft_cb): ref the ccd.
-
-2002-09-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * upgrade-mailer.c (imap_url_upgrade): Hex decode the folder names
- when searching for them in the memory buffer, and re-hex encode
- them when combining them with the rst of the URL.
- (mailer_upgrade): Instead of reading in the storeinfo file as raw
- binary data, use the camel-file-utils to correctly parse it.
-
-2002-09-05 Anna Marie Dirks <anna@ximian.com>
-
- * GNOME_Evolution_Mail.oaf.in: Changed the descriptions of the
- fonts, mail, accounts and composer pages of the settings dialog to be
- hopefully more descriptive and less confusing.
-
-2002-09-04 Ettore Perazzoli <ettore@ximian.com>
-
- * upgrade-mailer.c (upgrade): Return FALSE here.
- (get_base_url): Add a cast.
-
- * component-factory.c (storage_xfer_folder): Removed unused
- variables.
-
- * Makefile.am: Rename upgrade-mailer to evolution-mail-upgrade.
-
-2002-09-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * Makefile.am: Add upgrade-mailer.c to the build.
-
- * upgrade-mailer.c: New program to upgrade configuration files
- from 1.0 to 1.2.
-
-2002-09-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): Made sure
- account->id->address is not NULL before adding it to the hash
- table. This is to prevent bug #29877 from crashing, although it is
- still an invalid error condition.
-
-2002-09-04 Dan Winship <danw@ximian.com>
-
- * folder-info.c (get_prop): Remove the "Get!" printf.
- (set_prop): Likewise for "Set!"
-
-2002-09-04 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_save): Remove unused
- variable.
-
- * component-factory.c (unpopulate_folder_context_menu): New.
- (create_component): Pass it to evolution_shell_component_new().
-
-2002-09-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (mark_as_seen_cb):
- (mark_as_unseen_cb):
- (mark_as_important_cb):
- (mark_as_unimportant_cb): New callback functions that wrap the
- mail-callbacks versions of mark_as_<whatever>. Thanks to Owen
- Taylor for this fix.
-
-2002-09-04 Not Zed <NotZed@Ximian.com>
-
- * component-factory.c (storage_xfer_folder): Dont translate / to
- dir_sep anymore, we always use /.
-
-2002-08-29 Peter Williams <peterw@ximian.com>
-
- * folder-browser-ui.c: Add HAS_FLAGS to a few miscellaneous commands
- that don't use IS_xMESSAGE.
-
-2002-08-28 Dan Winship <danw@ximian.com>
-
- * GNOME_Evolution_Mail.oaf.in: Add an
- evolution:shell_component_launch_order and rename
- evolution:shell_component_icon.
-
-2002-08-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (make_safe_filename): Fix some broken logic here,
- `p = strrchr (path, '/') + 1` will *never* be NULL!! If the
- strrchr returns NULL, then that expression will evaluate to 0x1!!
-
- * main.c (main): We now always need to init gconf for our later
- call to e_proxy_init() which initialises the proxy settings for
- soup to use.
-
-2002-08-28 Peter Williams <peterw@ximian.com>
-
- * folder-browser-ui.c (default_ui_nodes): Add some new flags for
- sensitizing nodes based on the flags of the currently selected
- messages.
- (folder_browser_ui_add_message): Reset the sensitivity cache when
- we re-add UI items.
- (folder_browser_ui_add_list): Same.
- (folder_browser_ui_add_global): Same.
- (fbui_sensitise_item): Only cache the sensitivity in the hash
- table if we actually change it.
- (folder_browser_ui_scan_selection): New function, getting the bulk
- of the contents of folder_browser_ui_set_selection_state. Now
- with code to iterate over the currently selected messages and
- check their flags so we can sensitize based on them.
- (folder_browser_ui_set_selection_state): Now just set the
- selection state if necessary and pass off to _scan_selection. Don't
- skip of we're trying to go from SELSTATE_SINGLE to SELSTATE_SINGLE,
- eg, as the flags of the selected messages may have changed.
-
- * folder-browser-ui.h: Prototype folder_browser_ui_scan_selection.
-
- * folder-browser.c (main_folder_changed): Call
- folder_browser_ui_scan_selection as the flags on a selected
- message may have just changed.
-
-2002-08-28 Peter Williams <peterw@ximian.com>
-
- * mail-format.c (component_supports): Also check that the component
- has PersistStream.
- (mail_lookup_handler): Get a list of all components and go with the
- first matching one.
-
-2002-08-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (regen_list_regen): Pass
- mail_config_get_thread_subject() as the third argument to
- camel_folder_thread_messages_new().
-
- * mail-config.c (config_read): Read in the thread_by_subject
- config option.
- (mail_config_write_on_exit): Save the thread_by_subject config
- option.
- (mail_config_get_thread_subject): New function to get the
- thread_subject value.
- (mail_config_set_thread_subject): New function to set the
- thread_subject value.
-
-2002-08-27 Radek Doulik <rodo@ximian.com>
-
- * mail-signature-editor.c: removed tip frame
-
-2002-08-27 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes for bug #4480
-
- * folder-browser-factory.c (control_activate): Call
- folder_browser_reload() instead of refreshing the folder
- ourselves.
-
- * folder-browser.c (folder_browser_reload): New convenience
- function. If the folder-browser's folder is already loaded,
- refresh the contents, otherwise if the folder has not been loaded
- - try loading the folder again (it may have failed to open last
- time for some reason?).
-
-2002-08-27 Peter Williams <peterw@ximian.com>
-
- * mail-format.c (handle_text_plain_flowed): Fix bug #29493.
-
-2002-08-26 Peter Williams <peterw@ximian.com>
-
- * mail-callbacks.c (toggle_flags): Logic change for when untoggling
- a message from deleted-dom.
-
-2002-08-26 Peter Williams <peterw@ximian.com>
-
- * mail-ops.c (transfer_messages_transfer): Enforce the mailer policy
- that deleted messages are marked as seen. Fixes 29448. This could
- go in camel_folder_transfer_messages_to, but I don't think we
- necessarily want to enforce that policy for Camel in general.
-
-2002-08-23 Peter Williams <peterw@ximian.com>
-
- Address most of bug #4940. Fails on the last page of the add account
- dialog as called from the prefs dialog due to EvolutionWizard being
- weird.
-
- * mail-config-druid.c (goto_next_page): New function, little
- wrapper around wizard_next_cb. Also potential place to work around
- EvolutionWizard weirdness in the future.
- (identity_activate_cb): New function, calls goto_next_page if
- identity page is complete.
- (source_activate_cb): Analogous.
- (transport_activate_cb): Analogous.
- (management_activate_cb): Analogous.
- (get_fn): Hook up the activate signals of the various GtkEntries
- to the correct callbacks above.
- (management_check): Return the result of the check so that
- management_activate_cb can use it.
-
-2002-08-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-tools.c (mail_tool_restore_xevolution_headers): Reset the
- X-Evolution-PostTo header.
- (mail_tool_remove_xevolution_headers): Remove the
- X-Evolution-PostTo header.
-
-2002-08-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-folder-cache.c (ping_store): Spawn a new thread to ping the
- server but only if it is connected.
- (ping_cb): This needs to return TRUE so the timeout keeps getting
- called.
-
-2002-08-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-session.c (class_init): Don't bother overloading the
- timeout virtual methods since they don't exist anymore.
-
- * mail-folder-cache.c (mail_note_store): Register a ping timeout
- callback to ping each store to keep the connections alive.
-
-2002-08-20 Radek Doulik <rodo@ximian.com>
-
- * mail-callbacks.c (do_mail_print): be sure that widget is
- realized so that e_utf8_from_gtk_string works properly
- (footer_print_cb): save/restore
-
-2002-08-20 Mike Kestner <mkestner@ximian.com>
-
- * folder-browser-ui.c (folder_browser_ui_setup_view_menus): guard
- against the view_instance disappearing during earlier CORBA work.
-
-2002-08-20 Peter Williams <peterw@ximian.com>
-
- * message-list.c (search_func): Once we hit the target node,
- update the cursor_uid if it's set. Fixes #29085.
-
-2002-08-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-preferences.c (mail_preferences_apply): Fix a
- copy/paste-o. Use the pgp_path GnomeFileEntry widget rather than
- the notify_sound_file GnomeFileEntry widget for the pgp path stuff
- :-)
-
-2002-08-19 Dan Winship <danw@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_setup): source_type_changed
- may try to change the transport optionmenu (incorrectly in this
- case), so don't call gtk_option_menu_set_history on it until after
- emitting "activate" on the source type menuitem.
- (mail_account_gui_save): Fix the saving of STORE_AND_TRANSPORT
- transports and add a comment so it doesn't get mistakenly unfixed
- again.
-
-2002-08-09 Peter Williams <peterw@ximian.com>
-
- * subscribe-dialog.c: Change this into a GnomeApp so we get a
- statusbar and the dialog is a little more comprehensible.
-
- * subscribe-dialog.c: (struct _FolderETree): Add members for
- tracking activity callback information.
- (get_short_folderinfo_got): Notify the activity callback.
- (subscribe_get_short_folderinfo): Here too.
- (folder_etree_init): Initialize the activity level to 0.
- (folder_etree_construct): Take new parameters of our activity
- callback and user_data.
- (folder_etree_new): Here too.
- (store_data_get_widget): Take the parameters here and pass them
- on.
- (sc_close_pressed): New callback for when close button is pressed.
- (sc_activity_timeout): New timeout to move the activity bar when
- folders are being scanned.
- (sc_activity_cb): If activity_level > 0, start the progressbar
- moving and set the status.
- (menu_item_selected): Pass the callback to store_data_get_widget.
- (subscribe_dialog_construct): Load some more widgets and adapt to
- some changes in the XML. Also connect the close button signal and
- initialize the progress bar's settings.
-
- * mail-callbacks.c (manage_subscriptions): Don't call
- gnome_dialog_set_close on it anymore since it's no longer a gnome
- dialog.
-
-2002-08-14 Dan Winship <danw@ximian.com>
-
- * mail-config.glade: Add a "don't sign meeting requests" option to
- the security pane, since some versions of Outlook won't recognize
- pgp-signed meeting requests. Sigh.
-
- * mail-config.c (account_copy, config_read, mail_config_write):
- Handle pgp_no_imip_sign.
-
- * mail-account-gui.c (mail_account_gui_new,
- mail_account_gui_save): Setup/save "don't sign meeting requests"
- button.
-
-2002-08-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (forward_message): Removed an unused variable.
-
- * mail-account-editor.c (construct): Set the focus on the Account
- Name entry widget. Fixes bug #10350.
-
-2002-08-12 Dan Winship <danw@ximian.com>
-
- * mail-display.c (on_url_requested): Replace no-longer-existent
- e_book_query_address_locally with e_book_query_address_default.
-
-2002-08-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (forward_message): Use mail_get_messages()
- instead of mail_get_message().
- (do_forward_non_attached): Fixed to work as a callback from
- mail_get_messages().
- (do_edit_messages): Only set the drafts_folder and drafts_uid if
- the folder-browser is a drafts folder. Fixes bug #28863.
-
-2002-08-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (save_draft_done): If the ccd is NULL, create a
- new ccd, disconnect the old signal handlers, and then reconnect
- the signal handlers using the non-NULL ccd as the user_data.
- (composer_send_queued_cb): Same, but only if the queue append
- operation failed.
-
-2002-08-09 Dan Winship <danw@ximian.com>
-
- * mail-callbacks.c (composer_send_queued_cb, save_draft_done):
- Handle the fact that ccd may be NULL (if the composer was created
- via CORBA). Quick temporary fix for sending meeting requests.
-
-2002-08-09 Peter Williams <peterw@ximian.com>
-
- * mail-config.c (mail_config_uri_renamed): When a URI is changed,
- try to copy over threaded view settings, preview pane shown
- settings, headers, hide state, tree expansion, and GAL view files.
- (uri_to_evname): New utility function.
-
-2002-08-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_save): Instead of comparing
- old/new CamelStore objects, just compare their account urls since
- changing params would still result in the same CamelStore
- object. Fixes bug #18539.
-
- * mail-callbacks.c (delete_msg): Don't check permanent_flags for
- the CAMEL_MESSAGE_DELETED bit here, if we are gonna check to see
- if the folder supports the permanent flag then there are better
- places to check this. Besides, it was the cause for bug #28038.
-
-2002-08-08 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.c (folder_browser_toggle_threads): Force a
- refresh of the menu sensitivity when the thread state changes.
-
-2002-08-07 Not Zed <NotZed@Ximian.com>
-
- * folder-browser-ui.c: Added EditSelectThread to only enable
- threaded mode if threaded is on. For #19941. Added some macro's
- to simplify the table.
- (folder_browser_ui_set_selection_state): Implement IS_THREADED
- mask.
-
-2002-08-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (composer_send_queued_cb): Delete the Draft
- item that this was edited from if that is the case as well as
- setting any replied flags if we need to. Fixes bug #18171.
- (save_draft_done): Not only delete the previously saved draft, but
- also set any PostSendData on the message being replied to or
- whatever. Fixes bug #20224.
- (compose_msg): Create an empty callback data struct which is now a
- MUST.
- (mail_reply): Fill in the new post_send_data info and also move
- the creation of the post_send_data to AFTER the creation of the
- composer widget so we don't leak on fail.
- (forward_get_composer): Pass an empty post_send_data structure as
- the user_data to the signal callbacks.
- (send_to_url): Same.
- (post_to_url): Here too.
- (redirect_get_composer): And here.
- (do_edit_messages): We no longer use the evil kludge of setting
- data on the composer object to denote the drafts_uid etc, this is
- now part of the post_send_data struct.
-
-2002-08-07 Peter Williams <peterw@ximian.com>
-
- * component-factory.c (request_quit): If outbox_folder is NULL,
- don't try and get its message count (this should never happen, but
- has.)
-
-2002-08-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-local.c (save_metainfo): No need to save a temporary file
- first anymore since I updated e_xml_save_file() to do this for us.
-
-2002-08-07 Not Zed <NotZed@Ximian.com>
-
- * folder-browser-ui.c: Enable the view type menu's always. See
- #20901.
-
- * message-tag-followup.c (target_date_new): Set the week start day
- from the calendar prefs, do same for 24 hour format. See #23423.
-
- * mail-config.c (config_read): Added week_start_day from
- Calendar/Display config. Also time_24hour format.
- (mail_config_get_week_start_day):
- (mail_config_get_time_24hour): And read-only accessors.
-
-2002-08-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-local.c (save_metainfo): Save to a temporary file first
- using e_xml_save_file rather than xmlSaveFile, if the save
- completes successfully then rename it to the real filename. Make
- sure that errno is saved.
- (mls_get_folder): save_metainfo doesn't return -1 on fail, it
- returns FALSE.
-
-2002-08-06 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.c (folder_browser_search_menu_activated): Set the
- rule name to include the search string, for #10979.
-
- * message-list.c (message_list_hidden): Only count hidden messages
- which are in the folder. Should probably maintain hidden table
- better. For #4334.
-
- * mail-ops.c (filter_folder_filter): Unref the driver before
- returning to main thread, so any closing operations are handled
- async (as in fetch_mail_fetch()), for #28072.
- (fetch_mail_fetch): Check driver != NULL, if folder_filter freed
- it already.
-
- ** fixes for #24605.
-
- * mail-vfolder.c (vfolder_gui_add_from_mlist): Removed.
-
- * folder-browser.c (filter_type_uid,vfolder_type_uid): Changed to
- accept args directly. Fixed callers.
- (filter_mlist_uid,vfolder_mlist_uid): Use filter_type_uid instead
- of mlist variant.
- (vfolder_type_current): new function to handle setup of vfolders
- from the main menu. It now uses the vfolder_type_uid function the
- same as the popup.
- (vfolder_subject, vfolder_sender, vfolder_recipient,
- vfolder_mlist): Changed to use vfolder_type_current.
- (filter_type_current): Similar for filters.
- (filter_subject, filter_sender, filter_recipient,
- filter_mlist): Changed to use filter_type_current.
-
- * mail-autofilter.c (rule_from_message): Handle AUTO_MLIST type.
- (rule_from_mlist):
- (vfolder_rule_from_mlist):
- (filter_rule_from_mlist): Removed.
- (filter_gui_add_from_mlist): Removed.
-
- * mail-autofilter.h: Added AUTO_MLIST type.
-
-2002-08-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-mt.c (mail_msg_check_error): If we are not in interactive
- mode, don't display error dialogs.
-
- * component-factory.c (interactive_cb): Updated to use the new
- function mail_session_set_interactive().
- (owner_unset_cb): Same here.
-
- * mail-session.c (mail_session_set_interactive): Renamed from
- mail_session_enable_interaction().
- (mail_session_get_interactive): New function to get the
- interactive state.
-
-2002-08-01 Peter Williams <peterw@ximian.com>
-
- * mail-offline-handler.c (struct _sync_info): Add a GHashTable pointer
- so we can remove the info once the operation is done.
- (sync_done): Remove the info from the hash table.
- (impl_syncFolder): Save the table to which the info was added.
-
-2002-08-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (user_create_new_item_cb): Updated to call
- post_to_url if the id is "post".
-
- * mail-callbacks.c (post_to_url): New function so that we don't
- need a FolderBrowser to post a new message.
- (post_message): Call post_to_url since they shared so much code.
-
-2002-08-05 Dan Winship <danw@ximian.com>
-
- * mail-callbacks.c (mail_reply): Only reply to all or reply to
- list, set CAMEL_MESSAGE_ANSWERED_ALL too.
-
-2002-08-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-tag-followup.c (construct): Set the default flag to
- Follow-Up.
-
- * mail-display.c (mail_display_render): Updated to use the new
- Follow-Up tags. Instead of storing a string containing the
- follow-up tag value, we now have to store the CamelMessageInfo.
- (mail_display_destroy): Unref the folder and the message-info.
-
- * folder-browser.c (followup_tag_complete): No longer needed.
- (on_right_clicked): Use the individual follow-up tags to decide
- whether or not to enable something.
-
- * message-list.c (ml_tree_value_at): Update to use the new
- Follow-Up tags.
-
- * mail-callbacks.c (flag_for_followup): Update to use the new
- MessageTagEditor API.
- (tag_editor_ok): Update this too.
- (flag_followup_completed): Updated this too.
- (flag_followup_clear): Set all the follow-up tag values to "".
-
-2002-08-01 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (create_component): Use
- "post-message-16.png" as the icon for the "New Message Post" item.
-
-2002-08-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_save): If we are editing an
- account, then get the CamelStore associated with the old account
- info and save it in a struct that we will pass along as user_data
- to mail_get_store() for the new account url.
- (add_new_store): If the old account and new account stores are
- identical, then don't remove the old store from the folder
- tree. If they are not the same, then remove the old store and add
- the new store to the folder tree.
-
-2002-07-31 Peter Williams <peterw@ximian.com>
-
- * mail-folder-cache.c: Add another bitfield "unsub"
- (real_flush_updates): If unsubscribing, manually remove the folder
- from the shell.
- (unset_folder_info): Add another parameter which is used to set
- the unsub member.
- (store_folder_unsubscribed): Pass true for @unsub.
- (unset_folder_info_hash): Pass false for @unsub.
-
- * subscribe-dialog.c (fe_done_subscribing): Don't notify the shell
- here. The folder cache does it now, and it was broken to make the
- CORBA call in another thread anyway.
-
-2002-08-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (setup_mime_tables): Don't setup a handler for
- multipart/digest.
- (handle_multipart_digest): Removed.
-
-2002-07-31 Jeffrey Stedfast <fejj@ximian.com>
-
- * Makefile.am: Removed folder-browser-window from the build.
-
- * folder-browser-window.[c,h]: Removed.
-
- * mail-callbacks.c (view_digest): Removed.
-
- * mail-display.c (mail_display_digest_clicked): Removed.
- (on_link_clicked): Don't handle digest: urls anymore.
-
-2002-07-31 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (create_component): Put "New Mail Message"
- before "New Message Post" instead of vice versa.
-
-2002-07-31 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (create_component): Pass "mail" as
- @folder_type to
- evolution_shell_component_add_user_creatable_item().
-
-2002-07-31 Not Zed <NotZed@Ximian.com>
-
- * mail-display.c: Added global cameldatacache for managing remote
- image cache.
- (fetch_remote): Lookup data in cache first, use that if available,
- or setup a new cache item.
- (fetch_data): Write any retrieved data to cache as well as html
- stream.
- (fetch_free): Unref cache stream.
- (fetch_done):
- (fetch_cancel): If failed/cancelled, remove cache items so they
- dont foul the result. Probably need a header in cache items to
- guarantee this, but this is ok for now.
- (mail_display_class_init): Setup cache structure. Also ensure
- globals are initialised at-most once.
-
-2002-07-30 Radek Doulik <rodo@ximian.com>
-
- * mail-config.c (mail_config_signature_set_name): save signature
- here to remember the changed name
-
-2002-07-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (write_date): Use camel_medium_get_header to get
- the date header rather than getting the time_t and converting it
- into a string.
-
-2002-07-29 Not Zed <NotZed@Ximian.com>
-
- * mail-display.c (mail_display_init): setup private data.
- (mail_display_destroy): cancel any outstanding fetches, and free
- private data.
- (mail_display_set_message): Cancel any outstanding fetches.
- (fetch_cancelled):
- (fetch_next):
- (fetch_remote):
- (fetch_data):
- (fetch_free):
- (fetch_cancel):
- (fetch_done): Implement, used to use soup to download remote
- images.
- (load_http): Removed.
- (on_url_requested): When requesting a http* url, use the
- fetch_remote call above.
-
- * mail-display.h (struct _MailDisplay): Added priv(ate) member.
-
-2002-07-29 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-session.c (request_password): Left-align the check button's
- label.
-
-2002-07-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_new): Get the "Reset
- Defaults" folders button and connect to the clicked signal.
- (default_folders_clicked): Set the default uris on for the Drafts
- and Sent folders.
-
-2002-07-26 Peter Williams <peterw@ximian.com>
-
- * mail-offline-handler.c (storage_go_online): Call mail_note_store
- to get the folders to be updated and new ones to be inserted into
- the tree.
-
-2002-07-29 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-session.c (request_password): Add an accelerator for the
- "Remember this password" checkbox.
-
-2002-07-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (mail_execute_shell_command): No real need for this
- to be an async function sync we are going to call
- gnome_execute_async anyway.
-
- * component-factory.c (create_component): Add a new menu item for
- posting to the New toolbar button thing.
- (destination_folder_handle_drop): Don't use a NULL exception when
- we already have one to use anyway.
- (got_folder): Move the *fp = folder; to before the check to make
- sure folder != NULL, this makes it so that if getting a folder
- fails at least have have a known value to look out for (NULL)
- rather than some random garbage.
-
-2002-07-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (create_label): Make the gtk label line-wrap
- instead of us forcing \n's in the label, that was just
- wrong. Fixes bug #10320.
-
- * mail-callbacks.c (composer_send_cb): Make sure that the url
- isn't an empty string and also make sure to free it when we're
- done with it. Also check that we got the folder - if it is NULL,
- then just abort.
-
-2002-07-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_folder_to_safe_url): Use
- mail_tools_folder_to_url().
-
- * mail-tools.c (mail_tools_folder_to_url): New convenience
- function to take a CamelFolder and return the URL associated with
- it.
-
- * mail-callbacks.c (composer_get_message): Pass in a 'post'
- argument so we know whether or not we can ignore a NULL set of
- recipients.
- (composer_send_cb): Default send->send to TRUE unless we are in
- Post-To mode, in which case set send->send to FALSE (since we'll
- have nothing to send). Also, if we are in Post-To mode, append to
- the folder the user wants to post to rather than appending to
- Outbox.
- (composer_send_queued_cb): Only queue a send thread if send->send
- is TRUE (ie, the composer was not in Post mode - if it was in Post
- mode, then the message post has already been saved in the correct
- folder so there is nothing to do).
- (post_message): New function to create an empty composer widget in
- Post mode.
- (post_reply): New function that calls mail_reply with the new mode
- of REPLY_POST.
- (mail_generate_reply): If the mode is REPLY_POST, create a Post
- composer widget otherwise create a normal composer widget.
-
-2002-07-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (mail_execute_shell_command): Update to take argc and
- argv arguments since this is the new definition for the
- CamelFilterDriverShellFunc.
-
- * mail-session.c (main_get_filter_driver): Updated for the renamed
- function.
-
- * mail-display.c (link_open_in_browser): Make sure that the
- html->pointer_url is non-NULL. Should fix bug #28159 (this seems
- to be the only questionable way for a NULL url to be passed into
- on_link_clicked).
-
-2002-07-24 Peter Williams <peterw@ximian.com>
-
- * mail-callbacks.c (do_mail_fetch_and_print): Check for whether
- current_message is NULL as well as preview_shown (if we tried to
- load the message and failed, as may happen in offline mode.)
- (done_message_selected): Only print if we actually got the message.
-
- * folder-browser.c (folder_browser_query_changed): New function,
- use this on the query_changed signal. Don't run the search if
- they only changed the dropdown.
-
-2002-07-23 Peter Williams <peterw@ximian.com>
-
- * mail-ops.c (get_store_get): Call camel_session_get_service
- instead of camel_session_get_store, as _get_store calls
- _get_service_connected which is not what we want to do on startup.
- (set_offline_do): Rework the logic here. It was failing when
- trying to go online with a disco store that couldn't work offline.
-
- * mail-folder-cache.c (mail_note_store): If we're using an offline
- (well, non-online) disco store that cannot work offline, don't get
- the folderinfo as that will fail.
-
-2002-07-24 Radek Doulik <rodo@ximian.com>
-
- * mail-composer-prefs.c (sig_add): use
- mail_config_get_send_html for html format flag
-
- * mail-account-gui.c (sig_add_new_signature): use
- mail_config_get_send_html for html format flag
-
-2002-07-24 Not Zed <NotZed@Ximian.com>
-
- * mail-folder-cache.c (real_flush_updates): Propagate name changes
- or removes to the mail config. #15951. Doesn't enitrely work for
- local folders, because they are never renamed only removed and
- added thanks to the shell's api.
-
- * mail-config.c (mail_config_uri_renamed): If a store folder is
- renamed, this checks for any config that needs updating, so far
- sent and drafts folders.
- (mail_config_uri_deleted): Same, for deleted folders.
-
-2002-07-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (handle_multipart_encrypted): Commit a fix that I
- thought I committed a while ago:
-
- * mail-format.c (handle_multipart_encrypted): Pass the correct
- pointer into camel_multipart_encrypted_decrypt().
-
- * mail-ops.c (mail_send_message): Rework the logic a bit. If we
- find an account, use that to set the sent_folder_uri and the
- transport_url, otherwise use the X-Evolution-Transport and
- X-Evolution-Fcc headers.
-
-2002-07-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-tag-followup.c (message_tag_followup_decode): Don't pass
- the length of the tag name into strncmp, instead use the length up
- to the first ':' in the value string.
-
-2002-07-22 Peter Williams <peterw@ximian.com>
-
- * folder-browser.c (folder_browser_gui_init): Also perform a search
- on the query_changed signal, which is what gets emitted when the
- Search menu is used.
-
-2002-07-24 Not Zed <NotZed@Ximian.com>
-
- * component-factory.c (owner_set_cb): Initialise the standard
- uri's before doing anything else.
-
- * mail-vfolder.c (uri_is_ignore): Return true if the uri is any
- sent, drafts or outbox folder uri.
- (mail_vfolder_add_uri): Dont automagically add any
- sent/outbox/drafts folder with "local" or "remote" etc rules, only
- add sent folders if explictly listed as folder rules. Maintain
- the remote/local folders list accordingly.
- (vfolder_adduri_do): dont check against sent_folder, drafts_folder
- or outbox_folder, this is checked by above code. For #14863.
-
- * mail-display.c (drag_data_delete_cb): use uri_list before we set
- "uri-list" to NULL, which will automagically free it for us, so
- dont free it either. Found with vagrind.
-
-2002-07-23 Not Zed <NotZed@Ximian.com>
-
- * message-browser.c (message_browser_destroy): Disconnect from
- folderbroser signals when we unref it, so we dont get signals
- later on if someone else has a ref on it (causing crash).
-
-2002-07-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_signature_run_script): Check to make
- sure the script output is valid UTF-8, if not then attempt to
- convert it into UTF-8. Fixes bug #28086.
-
-2002-07-22 Not Zed <NotZed@Ximian.com>
-
- * message-list.c (regen_list_regened): Remove the assert, and
- always copy over the threadtree which represents the current view,
- unreffing the old one if set. For #28021. Haven't tested this a
- lot, but i guess it cant be worse than what is there.
-
- * mail-vfolder.c (store_folder_renamed): When renaming, use
- full_name to set the folder, not name, so the path is preserved.
-
-2002-07-20 Larry Ewing <lewing@ximian.com>
-
- * mail-format.c (mail_get_message_body): recognize urls in plain
- text reply quoting logic (bug #27908).
-
-2002-07-19 Not Zed <NotZed@Ximian.com>
-
- * mail-callbacks.c: Try including gtkhtml/gtkhtml.h instead. Test
- really is a 4 letter word obviously.
-
-2002-07-18 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-folder-cache.c: Removed bogus static pre-declaration.
-
- * e-searching-tokenizer.c (e_searching_tokenizer_end): Removed
- unused variables.
-
- * mail-callbacks.c: #include <gtkhtml.h>.
-
- * folder-info.h (evolution_folder_info_get_type): Add prototype.
-
-2002-07-18 Peter Williams <peterw@ximian.com>
-
- * mail-format.c (handle_multipart_digest): Change the HTML to
- make this a little prettier.
-
- * folder-browser-window.c (folder_browser_window_new): Load the
- messagedisplay XML file as a base for the UI, so that things
- appear. Don't add the global UI items as they don't make sense
- here.
- (fb_window_close): New function, used to ... close the window,
- suprisingly.
-
-2002-07-18 Not Zed <NotZed@Ximian.com>
-
- * main.c (main): Put the mcheck stuff back in, which was removed
- without a changelog entry.
-
-2002-07-08 Peter Williams <peterw@ximian.com>
-
- * Makefile.am: Reference the new libefilterbar.a.
-
-2002-07-17 Radek Doulik <rodo@ximian.com>
-
- * mail-callbacks.c (save_draft_done): use "saved" gtkhtml command
-
-2002-07-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (add_storage): Oops, Don't comment out the
- mail_note_store call.
-
-2002-07-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (account_able_clicked): Re-enable some #if 0'd code.
-
- * mail-vfolder.c (vfolder_load_storage): Updated to not pass TRUE
- for an auto_connect argument since that argument no longer exists.
-
- * mail-account-gui.c (add_new_store): Updated to not pass an
- auto_connect argument.
-
- * component-factory.c (add_storage): Don't ever auto-connect here.
- (mail_add_storage): No longer takes an auto_connect argument.
- (mail_load_storages): Only load the account storages that are
- enabled.
-
-2002-07-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (composer_send_cb): Pass 'info' into
- mail_append_mail(), seems I created the info but forgot to pass it
- in.
- (composer_send_queued_cb): If the message is successfully queued,
- we destroy the composer, otherwise we unref it. Don't ever destroy
- and then unref it.
-
-2002-07-15 Radek Doulik <rodo@ximian.com>
-
- * mail-callbacks.c: use new save_header_state flag
-
-2002-07-15 Peter Williams <peterw@ximian.com>
-
- * mail-offline-handler.c (service_is_relevant): Account for the
- case that when a disco store is "online" but actually offline and
- we're going online, we should actually connect it.
-
- * component-factory.c (mail_load_storages): Always set
- auto_connect to FALSE, same reason as below.
-
- * mail-session.c (mail_session_init): Initialize our session to
- not be online, since the shell will tell us to go online if we
- need to.
-
-2002-07-10 Peter Williams <peterw@ximian.com>
-
- * Makefile.am (importerdir): Define this in terms of the new
- privlibdir, again resulting in a new directory name.
-
- * importers/Makefile.am (importersdir): Here too.
-
-2002-07-15 Not Zed <NotZed@Ximian.com>
-
- * message-list.c (ml_tree_value_at): Lookup the label colour based
- on the label token, not an integer.
-
- * folder-browser.c (on_right_click): Lookup the label name from
- the filter type. Sigh, a bunch of other code should do similar
- but i'm going to leave it as integers.
- (set_msg_label): Set the label directly.
-
- * mail-vfolder.c (vfolder_editor_clicked): Set the vfolder_editor
- variable to null before we close the dialogue, otherwise the close
- destroys it and reverts the file.
-
- * component-factory.c (populate_folder_context_menu): Oops,
- accidentally checked in some unfinished, unworking code.
- Reverted.
-
-2002-07-10 Not Zed <NotZed@Ximian.com>
-
- ** fixes for #10781
-
- * mail-callbacks.c (filter_edit): Add back a cancel button. We
- dont need to do anything special to 'undo' here, as the rules are
- loaded every time they're used.
-
- * mail-vfolder.c (vfolder_editor_clicked): If ok wans't clicked,
- revert the ruleset.
- (vfolder_editor_destroy): Fake a button of -1 if we get destroyed
- with no click.
- (context_rule_removed): Unref the folder after we delete it. If
- we're the last ref to the folder, unrefing it means it no longer
- exist,s which means no delte processing occurs ...
-
-2002-07-04 Not Zed <NotZed@Ximian.com>
-
- * mail-accounts.c (news_add_destroyed): Pass teh autoconnect flag,
- whcih shoudlnt' exist anyeway.
-
-2002-07-03 Not Zed <NotZed@Ximian.com>
-
- * component-factory.c (populate_folder_context_menu): If this is a
- file url, look up its component, if we have it, then use the
- mail-callback reconfigure call.
-
- * folder-browser-factory.c (folder_browser_factory_get_browser):
- Util to get the folder browser from a uri.
-
-2002-07-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (pixmap_press): Rename "Save to disk..." to "Save
- Attachment..."
-
-2002-07-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-ui.c: Modified to use a single list of UI node
- elements with an enable-mask rather than split into groups. This
- allows much more control and easier modification to get the
- desired enable/disable effects.
-
- * mail-display.c (mail_display_set_message): If we unref'd a
- current_message, clear the datalist. Don't bother connecting to
- the message's finalise signal because something else may own a ref
- to the original message when we replace it with a new one.
- (mail_display_destroy): Only clear the datalist if we have a
- current_message, otherwise it's safe to assume that it is already
- cleared.
-
-2002-07-08 Peter Williams <peterw@ximian.com>
-
- * Makefile.am (INCLUDES): Add -I flags to get the ebook headers.
-
-2002-07-10 Ettore Perazzoli <ettore@ximian.com>
-
- * subscribe-dialog.c (recursive_add_folder): Pass zero as
- @sorting_priority to evolution_storage_new_folder().
-
- * mail-folder-cache.c (real_flush_updates): Pass zero as
- @sorting_priority to evolution_storage_new_folder().
-
-2002-07-09 Ettore Perazzoli <ettore@ximian.com>
-
- * subscribe-dialog.c (recursive_add_folder): Pass NULL for
- @custom_icon_name to evolution_storage_new_folder().
-
- * mail-folder-cache.c (real_flush_updates): Pass NULL for
- @custom_icon_name to evolution_storage_new_folder().
-
-2002-07-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (redirect): Don't ever use the mail-display's
- current_message, this can cause problems.
-
- * mail-ops.c (get_message_free): Unref the gotten message. All of
- the callers seemed to think that they didn't have to unref the
- message.
-
- * mail-display.c (mail_display_set_message): Now refs the message.
- (mail_display_destroy): Unref the current_message if we still have
- ownership of it.
-
-2002-07-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (composer_send_queued_cb): Only queue a send
- operation if we are in Online mode, otherwise don't bother wasting
- our time.
-
-2002-07-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * main.c (main): No longer need to pass a postpone_cb function
- into the composer factory_init.
-
- * mail-send-recv.c (get_receive_type): If the provider is a
- transport, return SEND_SEND.
-
- * mail-config.c (mail_config_get_default_transport): If the
- default account doesn't have a transport, find the first account
- that does.
-
- * mail-callbacks.c (append_mail_cleanup): Don't bother freeing the
- appended_uid here.
- (composer_send_internal): New helper function that does all the
- similar work that composer_send_cb and composer_postpone_cb did.
- (composer_send_cb): Append the message to Outbox and in the async
- callback, queue a message send operation.
- (composer_postpone_cb): Removed.
- (composer_send_queued_cb): The new async callback for
- composer_send_cb(). If the append is successful, queue a message
- send operation and destroy the composer otherwise re-show the
- composer.
- (save_draft_done): g_strdup the appended uid.
- (compose_msg): Don't connect to the postpone signal anymore as it
- no longer exists.
- (send_to_url): Same.
- (mail_reply): Here too.
- (forward_get_composer): And here.
- (redirect_get_composer): Again here.
- (do_edit_messages): And finally here.
-
- * mail-ops.c (append_mail_free): Free the appended uid.
-
-2002-07-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-editor-news.[c,h]: Removed.
-
- * mail-accounts.c: Removed special-case code for NNTP support.
-
- * mail-account-gui.c (mail_account_gui_setup): Allow configuration
- of both mail and news accounts.
-
- * component-factory.c (mail_load_storages): No longer need the
- is-account argument.
-
- * subscribe-dialog.c (populate_store_list): Don't special-case
- news accounts anymore.
-
- * mail-config.c (mail_config_get_default_news): Removed.
- (mail_config_get_news): Removed.
- (mail_config_add_news): Removed.
- (mail_config_remove_news): Removed.
-
-2002-07-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-vfolder.c (vfolder_load_storage): Pass TRUE as the
- auto_connect argument to mail_load_storage_from_uri().
-
- * mail-account-gui.c (add_new_store): Pass FALSE as the
- auto_connect value to mail_load_storage_from_uri().
-
- * mail-format.c (handle_multipart_encrypted): Pass the correct
- pointer into camel_multipart_encrypted_decrypt().
-
- * component-factory.c (mail_add_storage): Now takes an
- auto-connect argument which it passes along to add_storage().
- (mail_load_storage_from_uri): Same.
- (add_storage): Only call mail_note_store() if we plan on
- auto-connecting.
-
-2002-07-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (on_right_click): Increase the size of the
- escapped mlist buffer, we can't assume that there can only ever be
- a single '_' in the mlist name afaik.
- (filter_type_uid): Ugh, we need to copy the fdata->source here.
-
- Fixes bug #27263.
-
- * folder-browser.c (filter_subject): Decide the filter source type
- based on the folder we are in (Sent/Outbox folders use
- FILTER_SOURCE_OUTGOING).
- (filter_sender): Same.
- (filter_recipient): Here too.
- (filter_mlist): And here.
- (on_right_click): Set the fdata->source.
- (filter_type_got_message): Pass fdata->source into
- filter_gui_add_from_message().
- (filter_mlist_uid): Same.
-
- * mail-autofilter.c (filter_gui_add_from_message): Now takes a
- source argument so that we don't always add incoming rules.
- (filter_gui_add_from_mlist): Same.
-
- * mail-tools.c (mail_tool_make_message_attachment): Remove Bcc
- headers too. Fixes bug #27302.
-
-2002-07-02 Ettore Perazzoli <ettore@ximian.com>
-
- * folder-browser.c (folder_browser_gui_init): Don't connect
- folder_browser_search_do_search to "query_changed" since we don't
- want the search to happen unless the user clicks "Find Now", for
- consistency.
-
-2002-07-02 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (create_component): Pass a tooltip to
- evolution_shell_component_add_user_creatable_item.
-
-2002-07-02 Sean Atkinson <sean@cantab.net>
-
- * mail-preferences.c: remove dependency on removed file
- camel/camel-pgp-context.h
-
-2002-07-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (handle_multipart_related): Make sure that cid is
- non-NULL.
-
-2002-07-01 Not Zed <NotZed@Ximian.com>
-
- * mail-folder-cache.c (folder_deleted): Removed. The
- folder's deleted event isn't needed since we're listening to the
- store's folder_deleted signal. Also, the code was wrong, it
- cleared the folder without disconnecting events, etc. See #16486,
- and probably others.
- (mail_note_folder): Dont hook onto deleted anymore.
- (unset_folder_info): Or unhook from it.
-
-2002-06-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (mail_load_storages): Don't skip over
- disabled accounts - put them in the folder tree too.
-
-2002-06-28 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes bug #27055.
-
- * mail-accounts.c (account_add_finished): Unref the main accounts
- widget.
- (account_add_clicked): Ref the main accounts widget.
- (account_edit_finished): Unref the main accounts widget.
- (account_edit_clicked): Ref the main accounts widget.
-
-2002-06-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (storage_remove_folder): Recursively delete
- any subfolders.
-
-2002-06-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (config_read): Don't allow the pgp type to be
- anything except NONE or GPG.
-
- * mail-preferences.c (mail_preferences_apply): Don't allow someone
- to use anything other than GnuPG.
-
- * mail-crypto.c (mail_crypto_get_pgp_cipher_context): No need to
- handle pgp5 or pgp6 types anymore since we are no longer
- supporting them. Ding dong the witch is dead!
-
- * mail-format.c (handle_multipart_encrypted): Rewritten to use
- camel_multipart_encrypted_decrypt.
-
- * mail-crypto.c (mail_crypto_pgp_mime_part_verify): Removed.
- (mail_crypto_pgp_mime_part_encrypt): Removed.
- (mail_crypto_pgp_mime_part_decrypt): Are we seeing a trend yet?
-
-2002-06-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (on_url_requested): Also handle https urls.
-
- * component-factory.c (mail_add_storage): Some compiler warning
- fixes.
-
- * mail-crypto.c (mail_crypto_pgp_mime_part_sign): Removed.
- (mail_crypto_get_pgp_cipher_context): New convenience function to
- construct a pgp cipher context.
- (mail_crypto_pgp_mime_part_verify): Use the new
- get_pgp_cipher_context function.
- (mail_crypto_pgp_mime_part_encrypt): Same.
- (mail_crypto_pgp_mime_part_decrypt): Here too.
-
- * mail-account-gui.c (mail_account_gui_new): Initialise the
- pgp_always_trust checkbox.
- (mail_account_gui_save): Get whether or not to always_trust the
- user's pgp keys.
-
- * mail-config.c (account_copy): Copy over the pgp_always_trust
- option.
- (config_read): Read in the always_trust option.
- (mail_config_write): Save the always_trust option.
-
-2002-06-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-crypto.c (mail_crypto_pgp_mime_part_verify): If the pgp
- type is gpg, then use the gpg context.
- (mail_crypto_pgp_mime_part_sign): Same.
- (mail_crypto_pgp_mime_part_encrypt): Same.
- (mail_crypto_pgp_mime_part_decrypt): Same.
-
- * mail-format.c (handle_multipart_signed): Use the new gpg cipher
- context.
-
-2002-06-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (message_list_change_first_visible_parent): New
- convenience function to find the first parent node that is visible
- and emit a changed signal on it.
- (main_folder_changed): If a message changed, call
- change_first_visible_parent() in case we are in a collapsed thread
- so that our first visible parent gets updated as well. Fixes bug
- #26263.
-
- * component-factory.c (storage_remove_folder): Simplify the error
- checking.
-
-2002-06-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (get_normalised_string): New convenience function
- to get a cached normalised string.
- (subject_compare): Removed, as we strip Re:'s when normalising the
- subject strings now.
- (ml_tree_value_at): Added support for the normalised columns (used
- for a sorting optimisation).
- (message_list_init): Initialise normalised_hash.
- (message_list_destroy): Destroy normalised_hash.
- (message_list_create_extras): Removed subject_compare.
- (main_folder_changed): De-cache normalised strings for any removed
- uids.
-
-2002-06-17 Not Zed <NotZed@Ximian.com>
-
- * message-list.c (regen_list_regen): If we dont support searching,
- dont try to.
-
-2002-06-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (regen_list_regen): Move m->complete = TRUE; to
- within the cancel-check block, this way complete only ever gets
- set to TRUE if we weren't cancelled. I assume this is how it was
- supposed to work.
-
-2002-06-11 Not Zed <NotZed@Ximian.com>
-
- * folder-info.c (do_get_info): If we dont get a folder, dont try
- and get details off it. Should get rid of most of those annoying
- summary warnings, but not the cause of them.
-
-2002-06-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (account_able_clicked): Comment out the code to
- add/remove the store to the folder-tree when it gets
- enabled/disabled.
-
- * mail-callbacks.c (mail_generate_reply): If we are doing
- Reply-to-All, do not include any of the user's email accounts in
- the To: field. If, after this, the To: field is empty - then
- promote the first recipient in the Cc: list to the To: field.
-
-2002-06-07 Radek Doulik <rodo@ximian.com>
-
- * mail-config.c (mail_config_write_account_sig): call
- mail_config_init to be sure we have the db, save auto_signature as
- well
-
- * mail-composer-prefs.c (sig_add_script_cancel): hook this to
- cancel button in signature script dialog
-
- * mail-signature-editor.c (mail_signature_editor): fix some typos,
- set label usize to 500, -2
- (menu_help): added help link to Help menu
-
-2002-06-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_save): If this account is
- not a completely new account (ie, it is an edited account), then
- remove any trace of it from the shell storages. If the new account
- belongs in the folder-tree, add it to the list of storages.
-
- * component-factory.c (mail_add_storage): New function to add a
- single storage.
-
-2002-06-06 Radek Doulik <rodo@ximian.com>
-
- * mail-composer-prefs.c (mail_composer_prefs_construct): disable
- edit and delete when there are no signatures defined
-
-2002-06-06 Not Zed <NotZed@Ximian.com>
-
- * message-list.c (mail_regen_list): Keep track of the regeneration
- request in a list.
- (regen_list_free): Remove the request from the regenreation list.
- (message_list_set_folder): If there are any outstanding
- regneration requests, cancel them.
- (regen_list_regened): If we were cancelled, do nothing.
- (regen_list_regen): If we were cancelled, shortcut processing.
- This is all for #23571.
-
- * message-list.c (regen_list_regen): Change the way we calculate
- the hide deleted messages and tree view options. Do it based on a
- search and uid's rather than a summary.
- (regen_list_regened): Handle changes to tree storage.
- (mail_regen_list): The tree is now stored between updates, so we
- can update the tree structure incrementally. This blows out
- memory use some however. We need an etree that uses this as its
- model directly?
- (message_list_destroy): Free the thread tree.
- (message_list_set_folder): Clear the thread tree when changing
- folder.
-
-2002-06-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (mail_get_message_rfc822): Don't forget to free
- the date string buffer.
-
-2002-06-05 Radek Doulik <rodo@ximian.com>
-
- * mail-composer-prefs.c (sig_fill_clist): use gtk string instead
- of utf8 one
-
-2002-06-04 Jeffrey Stedfast <fejj@ximian.com>
-
- The following changes take a great leap toward fixing bug #1042.
-
- * mail-display.c (mail_display_push_content_location): New
- function to push a Content-Location value onto the MailDisplay.
- (mail_display_get_content_location): Gets the current
- Content-Location CamelURL value.
- (mail_display_pop_content_location): Pop the Content-Location off
- the stack.
-
- * mail-format.c (get_location): Do URL merging if the
- Content-Location isn't a full URL. If the Content-Location doesn't
- exist, pretend the URL is actually the Content-Location URL of our
- parent multipart (assuming it exists). If that doesn't exist, then
- yes - return NULL.
- (handle_multipart_related): Push the Content-Location header value
- of the multipart/related so that we can do URL merging in
- get_location() as we process each of the subparts. When we're
- done, pop it back off the stack.
-
-2002-06-04 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.etspec: Added priorities.
-
-2002-06-04 Christopher James Lahey <clahey@ximian.com>
-
- * folder-browser-ui.c (folder_browser_ui_setup_view_menus): Set
- the title of our GalViewCollection.
-
-2002-06-04 Not Zed <NotZed@Ximian.com>
-
- * mail-accounts.c (mail_accounts_tab_construct): Duh, we want to
- set the news_edit/delete buttons for the news page, not overwrite
- the mail ones! That would've saved a bit of angst ...
-
- * mail-config-druid.c (extra_prepare): dont call build_extra_conf,
- otherwise it blows away any settings with defaults.
-
-2002-06-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_save): Write the signature
- after the account has been added.
- (sig_new_html): Don't write the signatures at this time.
- (sig_new_text): Same.
-
-2002-06-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (account_delete_clicked): Correctly get the
- GtkWindow ancestor of the prefs widget.
-
-2002-06-03 Not Zed <NotZed@Ximian.com>
-
- * mail-callbacks.c (composer_get_message): Changed to check
- everything from the composer before the message is requested.
- Otherwise we could end up signing/encrypting it twice, etc.
-
- * mail-format.c (handle_multipart_signed): removed some dead wood.
-
-2002-06-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (request_quit): Prompt the user to see if he
- really wants to quit when there are queued messages in the Outbox.
-
-2002-06-01 Not Zed <NotZed@Ximian.com>
-
- * mail-local.c (mlf_getv): Implement, return a text description of
- the localfolder.
-
- * message-list.c (ml_duplicate_value):
- (ml_free_value):
- (ml_initialize_value):
- (ml_value_is_empty):
- (ml_value_to_string):
- (ml_tree_value_at): Implement COL_LOCATION, original location of
- message (useful for vfolder).
-
-2002-06-02 Larry Ewing <lewing@ximian.com>
-
- * mail-tools.c (mail_tool_quote_message): make these citations as
- well.
-
- * mail-format.c (handle_text_plain_flowed): make these blockquotes
- into citations.
-
-2002-05-31 Not Zed <NotZed@Ximian.com>
-
- * mail-format.c (handle_multipart_signed): Changed to handle new
- multipart-signed type.
-
-2002-05-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-send-recv.c (mail_send_receive): Noop if we are in offline
- mode.
-
- * component-factory.c (mail_remove_storage): If the store is not
- in the storage hash, then it must not have ever been added. Fixes
- bug #25456.
-
- * mail-callbacks.c (view_msg): Oops, create a message-browser
- window here, not a folder-browser-window window.
-
-2002-05-29 Radek Doulik <rodo@ximian.com>
-
- * mail-composer-prefs.c: moved spell checking options to separate
- page, updated UI by Anna's design
-
- * mail-accounts.c (mail_accounts_load): use _ instead of U_ for
- clist
- (mail_accounts_tab_construct): justify marks column to right
-
-2002-05-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-window.c (folder_browser_window_new): Revert a
- failed idea.
-
-2002-05-24 Radek Doulik <rodo@ximian.com>
-
- * mail-composer-prefs.c (mail_composer_prefs_construct): ops,
- revert array size
-
-2002-05-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): If we can't find the
- mailing list address in the recipients list, just Reply-to-All
- instead.
-
-2002-05-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-window.c (folder_browser_window_new): Set the ui
- to be the evolution-mail-global.xml file thingy. Still broken but
- oh well. I give up. bonobo-ui sucks.
-
- * message-browser.c (set_bonobo_ui): Fixed to not crash.
-
-2002-05-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-window.c (folder_browser_window_new): If the
- folder-browser has a parent, reparent it.
-
- * message-browser.[c,h]: Revert back to the old broken
- implementation since that's what users want. They're not happy
- unless it's broken.
-
-2002-05-23 Radek Doulik <rodo@ximian.com>
-
- * mail-composer-prefs.c: be more careful about language_str{_orig}
- (mail_composer_prefs_construct): add auto smiley check button
-
-2002-05-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (sig_fill_options): Only clear the text/html
- signature menus if they are non-NULL.
-
- * mail-composer-prefs.c (spell_save_values): Use a new macro,
- STR_EQUAL, to tell if the 2 values are equal or not rather than
- using strcmp since one or both strings could be NULL.
-
-2002-05-21 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.c (folder_browser_config_search): Split the
- search word up for a body search and add it to the tokeniser to
- highlight.
-
-2002-05-18 Not Zed <NotZed@Ximian.com>
-
- * e-searching-tokenizer.c
- (e_searching_tokenizer_add_primary_search_string):
- (e_searching_tokenizer_add_secondary_search_string): New functions
- to add additional search strings one at a time. Maybe it should
- just split the word itself?
- (all): Basically, entirely rewritten. Now implements the
- Aho-Corasick multiple pattern search algorithm and handles
- multiple search strings and only ever has to decode any utf8
- character once, etc etc.
-
-2002-05-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (mail_get_message_body): Only get the contents of
- a mime part if it is marked as "inline". Fixes bug #7527.
-
- * mail-display.c (mail_display_render): Fixed the "Overdue:"
- string to not contain any HTML tags.
-
-2002-05-20 Ettore Perazzoli <ettore@ximian.com>
-
- * subscribe-dialog.c (recursive_add_folder): Pass TRUE for
- @sync_offline to evolution_storage_new_folder().
-
- * mail-folder-cache.c (real_flush_updates): Pass TRUE for
- @sync_offline to evolution_storage_new_folder().
-
-2002-05-20 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-callbacks.c (composer_sent_cb): Always unref the composer
- [even when we are destroying it], otherwise we leak it and we get
- the nasty bug where you can't quit.
-
-2002-05-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (ml_tree_value_at): Check for a label tag when
- doing a lookup on the COLOR column.
-
- * mail-config.c (mail_config_get_label_color_string): Return the
- colour in string format.
-
- * folder-browser.c (set_msg_label): Replaces colourise_msg and
- sets the "label" tag rather than the "colour" tag.
-
- * mail-preferences.c (mail_preferences_apply): Call
- mail_config_write() so that the settings get synced to disk.
-
-2002-05-16 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (request_quit): New.
- (create_component): Pass it as the @request_quit_fn to
- evolution_shell_component_new().
-
-2002-05-15 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (create_component): Pass NULL as
- @request_quit_fn.
-
-2002-05-15 Not Zed <NotZed@Ximian.com>
-
- * mail-ops.c (prep_offline_do):
- (prep_offline_done):
- (prep_offline_free):
- (mail_prep_offline): Implement prep_offline for an individual
- folder.
- (set_offline_do): Only call disco_store_set_status or disconnect
- for the store, dont do any offline prep stuff.
-
- * mail-offline-handler.c: Applied patch from Ettore to hook in
- extra offline interfaces.
- (impl_destroy): Dont free listener here anymore, its removed, but
- free sync table.
- (mail_offline_handler_init): Same for setup.
- (impl_syncFolder): Implement.
- (sync_done): handles finalising synchronisation of 1 folder.
- (sync_status): progress reporting, camel side.
- (sync_timeout): progress reporting, gmainloop side.
- (impl_cancelSyncFolder): Implement.
- (impl_goOffline, storage_go_offline, went_offline): Dont copy the
- listener to our struct - its an argument, not a member, so give
- each thread its own copy.
-
-2002-05-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (ml_tree_value_at): Instead of g_assert()ing that
- the msg_info is not NULL, if it is NULL just return NULL. This
- fixes a crash when ETree requests the value at a root node (I
- don't understand why it needs to do that??).
-
-2002-05-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-info.h: Added.
-
-2002-05-14 Christopher James Lahey <clahey@ximian.com>
-
- * component-factory.c: Added #include "folder-info.h".
-
- * folder-browser-window.c (folder_browser_window_new),
- mail-account-editor.c (apply_changes), mail-account-gui.c
- (mail_account_gui_save), message-tag-editor.c: Removed some unused
- variables.
-
- * folder-info.c: Added #include "folder-info.h". Removed static
- declaration of evolution_folder_info_get_type.
-
- * folder-info.c (destroy), mail-callbacks.c
- (confirm_goto_next_folder, find_current_folder,
- find_next_folder_r, find_next_folder,
- do_evil_kludgy_goto_next_folder_hack), mail-composer-prefs.c
- (sig_name_changed): Commented out these unused functions.
-
- * mail-config.c (add_new_storage): Removed this unused function.
-
- * mail-local.c (mlf_init): Fix the declaration of this function to
- match the required signature.
-
-2002-05-13 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.etspec: Added search="string" where appropriate.
-
-2002-05-13 Dan Winship <danw@ximian.com>
-
- * (various places): Update for camel_folder_append_message /
- camel_folder_transfer_messages_to API change.
-
- * mail-ops.c (mail_append_mail): Pass the appended_uid to the
- callback.
-
- * mail-callbacks.c (composer_save_draft_cb, save_draft_done,
- do_edit_messages): Take advantage of the append_message change to
- keep track of the UID of the saved draft so that we can delete the
- old copy of the draft each time we save a new one. Remove the
- FIXME suggesting we should do that, since we're doing it now. :)
-
-2002-05-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (do_view_message): Update for the new
- message-browser api.
-
- * message-browser.c (message_browser_new): A brand new
- implementation that just shows the message, none of that next/prev
- crap that always caused problems anyway.
-
- * mail-config.c (mail_config_add_account): Don't add any shortcuts
- here.
- (mail_config_remove_account): And don't remove them here. This
- code has never worked properly.
-
- * mail-ops.c (save_part_save): Use the exception enum names rather
- than '1' since it makes the code clearer.
-
-2002-05-10 Dan Winship <danw@ximian.com>
-
- * mail-ops.c (transfer_messages_transfer): Simplify. Use
- transfer_messages_to instead of picking between copy and move.
- Remove vtrash special-casing since it's all in
- camel-vtrash-folder.c now. Remove duplicate source == dest check.
-
- * mail-local.c (mail_local_folder_reconfigure): Use
- transfer_messages_to instead of copy_messages_to.
-
-2002-05-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_save): Make sure that even
- if the new source url is NULL, that we preserve the enabledness of
- the source.
-
-2002-05-09 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (add_storage): Pass %FALSE as
- @has_shared_folders to evolution_storage_new().
-
-2002-05-09 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: dist Spell.idl
-
-2002-05-08 Radek Doulik <rodo@ximian.com>
-
- * mail-composer-prefs.c: implemented (c'n'p-ed and updated) spell
- checking settings
-
-2002-05-08 Iain Holmes <iain@ximian.com>
-
- * component-factory.c (owner_set_cb): Tell the folder info listeners
- that they're ready.
-
- * folder-info.c: Add a property bag to the CORBAObject.
- (do_get_info): Remove a load of cruft. Add some error checks.
- (do_free_info): Unref the listener.
- (destroy): Unref the propertybag.
- (set_prop): Set the property.
- (get_prop): Get the property.
- (evolution_folder_info_factory_fn): Create a propertybag.
- (evolution_folder_info_notify_ready): Notify all the listeners that
- the folder info is ready for querying.
-
-2002-05-08 Not Zed <NotZed@Ximian.com>
-
- * mail-autofilter.c (mail_filter_rename_uri): Changed for
- rule_context_rename_uri api changes.
- (mail_filter_delete_uri): Same. Also, popup a dialogue similar to
- vfolder deleted dialogue to notify the user something has
- changed. Partial fix for #18826.
-
-2002-05-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (filter_folder_free): Flush the filter log to make
- Tuomas happy :-)
-
- * mail-session.c (mail_session_flush_filter_log): New convenience
- function to flush the session's filter log file.
-
- * mail-callbacks.c (mail_reply): Set the Seen flag as well since
- it's safe to assume that if the user has replied to an email
- message that he has read it. Not always true, but usually ;-)
-
- * folder-browser.c (on_right_click): If we are in a
- Sent/Drafts/Outbox folder, don't show the "Add Sender to
- Addressbook" menu item.
-
-2002-05-06 Not Zed <NotZed@Ximian.com>
-
- * component-factory.c (idle_quit): Check all threads are idle as
- well, using new e_thread_busy call. Should fix #22553? Also
- sleep a little bit, to let the other threads run.
-
-2002-05-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (sig_new_text): Update the code to actually
- work.
- (sig_new_html): Same.
-
- * mail-composer-prefs.c (mail_composer_prefs_new_signature): Allow
- 'prefs' to be NULL.
-
- * folder-browser.c (on_right_click): Fix the filter_menu static
- array to use the E_POPUP_MENU_CC macros since we plan on using
- custom closures for this.
- (on_right_click): Fixed so that you can "Edit as New" for any Sent
- folder and not just the local Sent folder.
-
-2002-05-01 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.h (FOLDER_BROWSER_IS_DESTROYED): Also check
- folder!=NULL. Fixes race where folder isn't setup yet, and
- neither is bonobo menu status (because its delayed), and we get a
- menu event before we're setup yet. For bug #21939.
-
-2002-04-30 Dan Winship <danw@ximian.com>
-
- * mail-callbacks.c (delete_msg): If the folder's permanent_flags
- don't include CAMEL_MESSAGE_DELETED, don't do anything. (In
- particular, don't move the cursor.)
-
-2002-04-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-tag-followup.c (message_tag_followup_append_message):
- Convert UTF-8 to gtkstrings since we are using a clist and not an
- E-widget that takes UTF-8.
-
- * mail-display.c (mail_display_add_url): If the data-urls is NULL,
- add a data-urls hash to the datalist. This finishes up bug #90.
-
- * mail-account-gui.c (save_service): Strip leading/trailing
- whitespace from the username because users sometimes accidently
- add extra spaces here and there. Fixes bug #24009 (along with a
- number of other "bugs").
- (mail_account_gui_auto_detect_extra_conf): Use a CamelURL instead
- of a GHashTable *settings. Also parse out the port # from the
- hostname.
-
-2002-04-29 Larry Ewing <lewing@ximian.com>
-
- * mail-composer-prefs.c (mail_composer_prefs_construct): clean up
- propmanager initialization code.
-
- * mail-preferences.c (mail_preferences_construct): small clean
- ups to propmanager code.
-
- * mail-config-factory.c (config_control_factory_cb): handle
- requests for the font manager control.
-
- * mail-config.glade: add fonts tabs and reorder composer options
- to match the new dialogs from anna.
-
- * GNOME_Evolution_Mail.oaf.in: add font manager control definition.
-
- * mail-composer-prefs.c (mail_composer_prefs_construct): hook to
- the gtkhtml propmanager.
- (mail_composer_prefs_apply): apply propmanager changes.
- (mail_composer_prefs_finalise): unref the propmanager.
-
- * mail-composer-prefs.h: add propmanager member.
-
- * mail-font-prefs.c: initialize gui properly.
-
- * mail-preferences.c (mail_preferences_construct): hook to
- gtkhtml's propmanager.
- (mail_preferences_apply): apply propmanager changes.
- (mail_preferences_finalise): unref the propmanager.
-
- * mail-preferences.h: add propmanager member.
-
- * Makefile.am (evolution_mail_SOURCES): add mail-font-prefs.[ch]
- to the build.
-
- * mail-tools.c (mail_tool_quote_message): use the html reply logic
- even for plain parts so that we can test out the new gtkhtml cite logic.
-
- * importers/evolution-mbox-importer.c (process_item_fn): add const
- to silence warning.
-
- * mail-display.c: add gtkhtml.h include so to pick up the
- object_relative prototype.
-
-2002-04-26 Larry Ewing <lewing@ximian.com>
-
- * mail-font-prefs.c: Add the font config dialog.
-
- * mail-font-prefs.h: add font config dialog headers.
-
-2002-04-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * Makefile.am: Don't link with libibex anymore, it's been
- deprecated.
-
- * mail-callbacks.c (next_unread_msg): Do away with the
- goto-next-folder stuff, it's very annoying.
-
- * mail-config-druid.c (extra_prepare): After building the extra
- config options into a Gtk form, auto-detect any values that we can
- and populate them by calling
- mail_account_gui_auto_detect_extra_conf.
-
- * mail-account-gui.c (mail_account_gui_auto_detect_extra_conf):
- New function to auto-detect the extra config options for a source.
-
-2002-04-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_build_extra_conf): Allow
- providers to override text entry boxes too.
- (source_type_changed): Remove the logic to decide upon default
- paths, these paths can now be set by the provider.
-
-2002-04-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (label_menu): Update to use
- E_POPUP_MENU_PIXMAP_WIDGET_ITEM_CC so that our callback gets
- called without per-item closure rather than being called with NULL
- and causing a segfault.
-
- * mail-account-gui.c (mail_account_gui_build_extra_conf): Set the
- default Username label and handle the new
- CAMEL_PROVIDER_CONF_LABEL enum allowing the provider to setup a
- label.
-
-2002-04-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c: Added back the checkmark icon for enabled
- accounts.
- (account_able_clicked): Don't reload the accounts list, that was
- just lame.
-
-2002-04-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (mail_display_render): Plug-in Anna's html for
- the flag-for-followup stuff. Finishes up bug #90.
-
-2002-04-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (folder_browser_finalise): Free the
- loading/pending/new/loaded_uid string buffers.
-
- * mail-config.c (config_read_signature): Free some temporary path
- buffers.
-
- * mail-display.c (stream_write_or_redisplay_when_loaded): Ref the
- html object here, this is an async handler so it's possible for
- our caller (or someone else) to unref the html object before we
- finish.
- (load_content_free): Unref the async handler's ref of the html
- object here.
- (mail_display_new): Ref the html widget here so that we can be
- sure that so long as the mail-display is "alive", so is the html
- object. See bug #22328 for details. Basically, the message-browser
- is being closed before the message gets loaded and so the html
- object was being destroyed but the mail-display was still alive.
- (mail_display_destroy): Unref the html object when the
- mail-display is destroyed.
-
-2002-04-19 Anna Marie Dirks <anna@ximian.com>
-
- * mail-config.glade: Added yet more accelerators for the new config
- dialog--this time for the composer pages
-
-2002-04-19 Anna Marie Dirks <anna@ximian.com>
-
- * mail-config.glade: Added a bunch of accelerators for the new config
- dialog
-
-2002-04-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (redirect_get_composer): Removed all
- Delivered-To headers before redirecting. Fixes bug #23635.
-
-2002-04-18 Radek Doulik <rodo@ximian.com>
-
- * mail-callbacks.c (do_mail_print): use default paper name in case
- of wrong translation
-
-2002-04-15 Not Zed <NotZed@Ximian.com>
-
- * mail-identify.c (mail_identify_mime_part): Turn off the code
- which downloads the part if we can't identify it. See discussion
- in #11778.
-
-2002-04-17 Christopher James Lahey <clahey@ximian.com>
-
- * folder-browser.c, mail-display.c: Updated these to match the new
- EPopupMenu.
-
-2002-04-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (handle_multipart_signed): Handle broken
- multipart/signed parts such as where the signature part is not the
- last part (as it should be). Fixes bug #23583.
-
- * folder-browser.c (message_list_drag_data_get): Free the temp
- GByteArrays.
-
-2002-04-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-local.c (mail_local_folder_construct): Just use g_basename.
- (mlf_finalize): Free the real_path.
-
- * folder-browser.c (on_right_click): Unref the GdkGC so we don't
- leak it.
-
-2002-04-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-tools.c (mail_tool_destroy_xevolution): Free the format
- string.
-
- * mail-config.c (config_write_signature): Don't leak the path
- strings here.
-
- * mail-signature-editor.c (menu_file_save_cb): Free the dirname
- string.
-
- * mail-config-factory.c (config_control_factory_cb): Ref the prefs
- widget here since we unref in the destroy callback. Caught this
- thanks to purify.
-
-2002-04-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c: Build fixes for --enable-nntp.
-
-2002-04-13 Christophe Merlet <redfox@eikonex.org>
-
- * mail-config.glade: Little typo. s/IS0/ISO/
-
-2002-04-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-composer-prefs.c (mail_composer_prefs_construct): Make it
- so that unchecking the "Enable Advanced Options" in the signature
- tab disables the advanced settings and vise versa.
-
- * mail-accounts.c (mail_accounts_tab_construct): Setup News
- preferences too if it is enabled.
-
- * mail-account-gui.c (mail_account_gui_new): Set the text of the
- reply-to.
- (mail_account_gui_save): Get the reply-to text here.
- (mail_account_gui_identity_complete): If there is text in the
- reply-to widget make sure it's valid.
-
- * mail-config.c (identity_copy): Copy the reply-to.
- (config_read): Read in the reply-to for all the accounts.
- (mail_config_write): Save the reply-to.
- (impl_GNOME_Evolution_MailConfig_addAccount): Get the reply-to.
- (identity_destroy): Free the reply-to.
-
-2002-04-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.etspec: s/Sent/Date. This fixes bug #11159.
-
-2002-04-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (confirm_expunge): Set the 'No' button as the
- default.
-
-2002-04-10 Dan Winship <danw@ximian.com>
-
- * mail-config.c (config_read, mail_config_write,
- mail_config_get_x_mailer_display_style,
- mail_config_set_x_mailer_display_style): Handle the X-Mailer
- display style. (There is currently no GUI for configuring this.)
-
- * mail-format.c (write_headers, write_xmailer_header): Show
- X-Mailer/User-Agent (and Rupert's stamp of approval) as
- appropriate.
-
-2002-04-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (setup_service): Kludge around the brokeness
- that is GtkOptionMenu just like we kludge around it for the
- authtype option menu.
-
-2002-04-09 Dan Winship <danw@ximian.com>
-
- * component-factory.c (create_view): Add view_info arg, but don't
- do anything with it.
-
-2002-04-08 Not Zed <NotZed@Ximian.com>
-
- * mail-send-recv.c (receive_update_got_folderinfo): Argh!
- get_folder_info owns and frees its *OWN* folder info, it shouldn't
- be free'd here! See mail-ops.c:get_folderinfo_free.
- This should fix #17259 and friends.
-
-2002-04-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-signature-editor.c (menu_file_save_cb): Simplify a bit and
- write to a temp file first and then rename() it to the real
- filename. This protects against losing data if the drive is full
- too. Also use a real mode, not 0, so that we can actually
- save/read the content ;-)
-
- * GNOME_Evolution_Mail.oaf.in: Re-added the config wizard
- interfaces. Ettore accidently removed them thinking they were
- duplicates of the new mail-config interfaces.
-
- * mail-config.glade: Remove the OK, Apply, Cancel buttons from the
- keyboard shortcut tab in the composer_prefs dialog.
-
- * mail-account-gui.c: No need to check gui->source before using
- gui->source->url, since gui->source *has* to exist.
-
-2002-04-06 JP Rosevear <jpr@ximian.com>
-
- * GNOME_Evolution_Mail.oaf.in: add config_item:type
-
-2002-04-04 Dan Winship <danw@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_new): Make the drafts and
- sent folder buttons be EvolutionFolderSelectorButtons. Remove the
- code to deal with drafts_folder_name and sent_folder_name, since
- they were only used to construct the button and aren't needed now.
- (mail_account_gui_save): Remove drafts/sent name references.
- (mail_account_gui_destroy): Likewise
- (folder_selected): Handle the "selected" signal on the folder
- selector button by updating the URI in the MailAccountGui.
- (mail_account_gui_folder_selector_button_new): Glade custom widget
- constructor.
-
- * mail-callbacks.c (transfer_msg): Update for
- evolution_shell_client_user_select_folder change.
-
- * message-browser.c (transfer_msg): Likewise. (Sigh. Why is this
- cut+pasted?)
-
- * mail-config.glade: Make the drafts/sent folder buttons custom
- widgets.
-
- * mail-config.c (account_copy): Remove drafts/sent folder name
- handling.
- (account_destroy): Likewise.
- (config_read): Likewise.
- (mail_config_write): Likewise.
-
- * Mail.idl (MailConfig:Account): remove drafts_folder_name and
- sent_folder_name.
-
-2002-04-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-tag-followup.c (construct): Set the window title/icon
- here instead.
-
- * message-tag-editor.c (message_tag_editor_init): Don't set the
- title or window icon here, this is a generic class.
-
- * mail-format.c (handle_multipart_signed): Replace
- get_url_for_icon with the new mail_display_get_url_for_icon
- function.
- (handle_multipart_digest): Here too.
- (get_cid): Use mail_display_add_url instead.
- (get_location): Same.
- (handle_text_enriched): Here too.
- (handle_multipart_signed): And here.
-
- * message-tag-followup.c (message_tag_followup_i18n_name): Use the
- U_() macro, not the _() macro as it is what we really want.
-
- * mail-ops.c (mail_send_message): Don't cast the message into a
- CamelMedium before sending anymore.
-
- * mail-callbacks.c (expunge_folder): Set the followup argument to
- NULL here.
- (done_message_selected): Get the followup value here and pass it
- to the mail-display here.
- (do_mail_fetch_and_print): Again with the NULL followup here.
-
- * folder-browser.c (folder_browser_set_message_preview): Update to
- pass in NULL as the followup since we are setting the message to
- NULL here.
- (done_message_selected): Get and set the appropriate followup
- value here.
- (do_message_selected): Update to pass in NULL as the followup
- since we are setting the message to NULL here.
-
- * mail-display.c (mail_display_set_message): Now takes a followup
- tag value.
- (mail_display_init): Set md->followup to NULL.
- (mail_display_destroy): Free md->followup.
- (mail_display_add_url): New: replaces the static add_url function
- originally in mail-format.c
- (mail_display_get_url_for_icon): New: replaces get_url_for_icon
- which was originally in mail-format.c
-
-2002-04-03 Dan Winship <danw@ximian.com>
-
- * mail-account-gui.c: Changes to allow combined store/transport
- providers (like exchange and nntp). You can only select the
- transport if the account is also using that provider for the
- source.
- (source_type_changed): If changing away from a combined
- store/transport type, disable that provider on the transport page.
- If change to a combined store/transport type, enable and select
- that provider on the transport page.
- (mail_account_gui_setup): Do some additional bookkeeping here to
- make the above stuff work.
- (transport_type_changed): If the provider is a combined
- store/transport type, pretend it doesn't need any additional URL
- configuration.
- (mail_account_gui_transport_complete): if the transport provider
- is also a store provider, then as long as it matches the source
- for the account, it's considered complete.
- (mail_account_gui_save): If the selected transport is a combined
- store/transport provider, use the source page's information to
- fill in the transport url.
-
- * mail-local.c (mail_local_provider_init): Don't set up
- service_cache.
-
-2002-04-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (do_edit_messages): Pass the UID of the message
- being edited to the save-draft signal handler.
- (composer_save_draft_cb): Pass the old draft uid to our async
- append_message function and let the append_message callback worry
- about deleting the old draft message on success.
- (save_draft_done): Delete the old draft message if we successfully
- appended the new draft message.
-
-2002-04-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-ui.c: Removed an unused pixmap from
- Tools/Settings to avoid a big nasty bonobo warning.
-
- * mail-composer-prefs.c (mail_composer_prefs_construct):
- Re-Implemented the signature editor stuff (mostly just copy/paste
- from Radeks original code).
-
- * mail-signature-editor.c (mail_signature_editor): Use the right
- oafiid for the html editor control.
-
-2002-04-01 Dan Winship <danw@ximian.com>
-
- * importers/Makefile.am (liboutlook_la_LDFLAGS,
- libmbox_la_LDFLAGS): Use -avoid-version -module. (From Max Horn
- <max@quendi.de>)
-
-2002-03-29 Ettore Perazzoli <ettore@ximian.com>
-
- * GNOME_Evolution_Mail.oaf.in: Added priorities for all the
- configuration pages [evolution:config_item:priority].
-
-2002-03-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-preferences.c (colorpicker_get_color): Don't shift the r, g
- and b values here either.
-
- * mail-composer-prefs.c (colorpicker_get_color): Don't shift the
- r, g, b values.
-
- * mail-preferences.c (mail_preferences_construct): Restore the
- labels & colours options from the grave.
- (mail_preferences_apply): Save these labels & colours options.
-
-2002-03-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-composer-prefs.c (mail_composer_prefs_construct): Same
- here.
-
- * mail-preferences.c (mail_preferences_construct): Do some gtk
- hackery action so we can detect if a option menu has changed.
-
-2002-03-29 Ettore Perazzoli <ettore@ximian.com>
-
- * GNOME_Evolution_Mail.oaf.in: Cleaned up a bunch [removing
- duplicates ;-)], set up icons for all the configuration pages.
-
-2002-03-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c: Use a GtkCList instead of an ETable, for some
- reason the etable was getting into some infinite resize loop or
- something. I probably did something wrong but I can't figure out
- what so I'm using a clist for now.
- (account_cursor_change): Make sure that event is non-NULL here.
-
-2002-03-27 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-accounts.c (mail_accounts_tab_construct): Use
- gtk_container_add() to put the toplevel in the parent widget,
- instead of just gtk_widget_set_parent().
- * mail-preferences.c (mail_preferences_construct): Likewise.
- * mail-composer-prefs.c (mail_composer_prefs_construct): Likewise.
-
-2002-03-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): Updated to respect the
- new mail-config options for default reply style that NotZed had
- started to implement before there was a gui.
-
-2002-03-27 Dan Winship <danw@ximian.com>
-
- * mail-display.c (do_attachment_header): unset GTK_CAN_FOCUS on
- the button so that it can't grab focus when you click it.
- (do_signature): Likewise on the signature button. #3904
-
-2002-03-26 Jeffrey Stedfast <fejj@ximian.com>
-
- Sync with yet-another-mail-config branch.
-
- * mail-composer-prefs.c: Updated to get the right widgets and
- whatnot. Also updated to tell the evolution-config-control that
- stuff has changed.
-
- * mail-preferences.c: Updated to get the right widgets and
- whatnot. Also updated to tell the evolution-config-control that
- stuff has changed.
-
- * mail-accounts.etspec: New file needed by mail-accounts.c
-
-2002-03-26 Not Zed <NotZed@Ximian.com>
-
- * mail-callbacks.c (addrbook_sender): Changed to get the address
- from the messageinfo of the current selected message rather than
- from the current_message.
- (requeue_mail_reply): Only re-queue if we got a message, could
- potentially cause an infinite loop trying to get a message it
- can't.
- (reply_to_sender, reply_to_list, reply_to_all): Always pass NULL
- as the msg to mail_replay, this forces mail_reply to always load
- the message anew. Fixes FIXME's and popup behaviour. Basically
- this and stuff below fixes #8542. Its probably not the nicest
- way, but it works.
- (mark_as_important): Use the flags properly, we can set all flags
- to any combination of on or off as we want, so we just need to
- call set_flags once, thats why its set flags and not set_option.
- (toggle_flags): Fixed the logic here also, so we dont have to call
- set_message_flags more than once, and also implement a true toggle
- for any number of simultaneous flags (whilst simplifying code).
-
- * mail-vfolder.c (vfolder_gui_add_from_mlist): Removed the 'msg'
- parameter, its not used, fixed callers.
-
- * folder-browser.c (on_right_click): Lookup the mlist from
- messageinfo, and change the 'no selected' logic slightly, fixes
- most of #8542.
- (filter_data_free): Free filter data struct.
- (vfolder_type_got_message): Actually create vfolder once we have
- the message we need to use for it. Code could probably be changed
- to use messageinfo instead.
- (vfolder_type_uid): Lookup a message based on uid, and use that to
- create a vfolder based on type.
- (vfolder_subject_uid, vfolder_sender_uid, vfolder_receipient_uid,
- vfolder_mlist_uid): Callbacks for the popup menu, used to create
- rules based on the uid rather than the message, which it loads as
- required.
- (filter_type_got_message, filter_*_uid): Similar to vfolder
- stuff above.
- (filter_menu[]): Changed callbacks to popup specific ones, not
- folderbrowser specific ones used by bonobo.
- (on_right_click): Initialise callback data for the filter submenu
- so it can look up messages for callback implementation.
-
- * local-config.glade: New version from anna, with fixed widget
- names.
-
-2002-03-20 Ettore Perazzoli <ettore@ximian.com>
-
- * folder-browser.c: Reorder folder_browser_search_menu_items
- according to #16246.
-
-2002-03-24 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-send-recv.c: Remove member current_folder from struct
- _send_data.
- (build_dialogue): Remove arg @current_folder.
- (mail_send_receive): Likewise.
- (free_send_data): No need to refresh the current folder here.
- [Well, hopefully, at least.]
-
- * component-factory.c (send_receive_callback): New.
- (create_component): Connect.
-
- * mail-callbacks.c (send_receive_mail): Removed.
-
- * folder-browser-ui.c: Remove "MailGetSend" verb.
-
-2002-03-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * GNOME_Evolution_Mail.oaf.in: Add info about the new config
- controls.
-
- * mail-config-factory.c: New file to handle the creation/etc of
- the config controls.
-
- * mail-accounts.c:
-
- * mail-preferences.c:
-
- * mail-composer-prefs.c: No longer handle their own bonobo control
- creation.
-
-2002-03-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (sig_new_text): Temporarily #if 0 this
- function out.
- (sig_new_html): Same.
-
- * mail-config.c (config_read): Read in the default reply style
- setting.
- (mail_config_write_on_exit): Same the default reply style.
- (mail_config_get_default_reply_style): New function to get the
- default reply style.
- (mail_config_set_default_reply_style): New function to set the
- default reply style.
-
- * folder-browser-ui.c: There is no longer a Tools/Mail Settings
- menu item.
-
- * mail-account-gui.c: Updated the widget types for the
- MailAccountsDialog->MailAccountsTab change.
-
- * mail_account_editor.c: Same.
-
- * mail-callbacks.c (providers_config): Removed.
-
- * mail-composer-prefs.c: New file that implements the composer
- preferences tab of anna's new config design.
-
-2002-03-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c: Reimplemented. This time we only have to worry
- about accounts. Also this now implements Annas config gui changes.
-
- * mail-preferences.c: Implements the mailer's Preferences tab in
- Anna's new config GUI.
-
-2002-03-19 Larry Ewing <lewing@ximian.com>
-
- * mail-display.c: add missing NULL closure data to popup menu
- initialization.
-
-2002-03-19 Dan Winship <danw@ximian.com>
-
- * Makefile.am (evolution_mail_LDADD): s/libversit.la/libversit.a/
-
-2002-03-18 Ettore Perazzoli <ettore@ximian.com>
-
- * main.c (main): Report a message before entering bonobo_main() to
- simplify debugging.
-
-2002-03-18 Ettore Perazzoli <ettore@ximian.com>
-
- * folder-browser.c: Remove E_FILTERBAR_RESET menu entry.
-
-2002-03-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (on_right_click): Draw colour rectangles for
- each of the colour items and set a closure on each.
- (colourise_msg): colourise the message, yo.
-
-2002-03-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (colour_msg): New callback to set a colour on a
- message.
-
- * folder-browser.c (on_right_click): Setup our popup icons and
- stuff. Also add a submenu for Labels.
-
- * mail-display.c (pixmap_press): Sync up with the new EPopupMenu
- API. Note: This code can probably now be fixed to use per-item
- closures - yay!
-
- * mail-accounts.c (construct): Connect to the label GtkEntry's and
- GnomeColorPickers and also to the Restore Defaults button.
-
- * mail-config.c (mail_config_get_label_name): New function to get
- a label's name.
- (mail_config_set_label_name): New function to set the label name.
- (mail_config_get_label_color): New function to get the label
- color.
- (mail_config_set_label_color): New function to set the label
- color.
- (config_read): Read in the config options for the labels and their
- colors.
- (mail_config_write_on_exit): Save the label options.
-
-2002-03-15 Larry Ewing <lewing@ximian.com>
-
- * mail-display.c: expand the relative urls of the object at the
- point so that relative images can be saved correctly.
-
- * folder-browser.c: add a closing quote in a comment.
-
-2002-03-15 Ettore Perazzoli <ettore@ximian.com>
-
- * folder-browser-factory.c (control_activate): Set the UI
- component on the search bar.
-
-2002-03-14 Dan Winship <danw@ximian.com>
-
- * component-factory.c (folder_types): Remove "mailstorage", since
- it's not needed any more.
- (storage_activate): Gone, although some of it is moved to
- storage_connect.
- (create_view): Remove mailstorage code.
- (add_storage): Connect to the storage's open_folder signal.
- Instead of creating a "mailstorage" folder, call
- evolution_storage_has_subfolders to let the shell know we haven't
- finished filling it in yet.
- (storage_connect): Handler for the storage's asyncOpenFolder
- signal. Call mail_note_store() to try to connect.
- (storage_connected): Callback for above. If the connection attempt
- failed, call evolution_storage_has_subfolders again to make the
- shell re-close the storage.
-
- * mail-folder-cache.c (update_folders): Remove a piece of
- mailstorage legacy code from here.
-
-2002-03-14 Radek Doulik <rodo@ximian.com>
-
- * mail-config.c (get_new_signature_filename): create new signature
- file
- (delete_unused_signature_file): be more careful about signature
- file path before unlinking
-
-2002-03-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (next_thread): Implemented.
-
- * message-list.c (message_list_select_next_thread): New function
- to select the next thread.
-
-2002-03-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-window.c (folder_browser_window_new): Set a
- default size of the window, so we don't get this itty-bitty window
- the size of a quarter on the screen when it first gets shown.
-
-2002-03-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (on_link_clicked): Handle digest: urls.
-
- * mail-format.c (setup_mime_tables): Add a handler for
- multipart/digest.
- (handle_multipart_digest): Handle multipart/digest parts.
-
-2002-03-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (folder_browser_set_folder): Set the folder on
- a folder-browser object.
-
- * folder-browser-window.c (folder_browser_window_new): Simple
- window to display a folder-browser.
-
- * mail-callbacks.c (view_digest): New callback to open a
- folder-browser-window with a digest folder.
-
-2002-03-08 Radek Doulik <rodo@ximian.com>
-
- * mail-signature-editor.c (menu_file_save_cb): truncate stream
- before saving
-
- * mail-config.c (mail_config_signature_set_html): new function
-
- * mail-accounts.c (sig_event_client): watch for HTML changed event
-
- * mail-signature-editor.c: added HTML check menu item to Format
- menu
-
-2002-03-08 Dan Winship <danw@ximian.com>
-
- * mail-config-druid.c (management_prepare): Rewrite this to not
- use stpcpy, which isn't portable.
-
-2002-03-08 Radek Doulik <rodo@ximian.com>
-
- * mail-accounts.c (sig_event_client): handle name changed event
- (sig_load_preview): don't run script before each reload
- (sig_script_activate): run script only if script entry is
- activated
-
- * mail-signature-editor.c (mail_signature_editor): added signature
- name entry
-
-2002-03-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (management_changed): Re-focus the account
- name entry widget.
- (identity_prepare): If a name is not set, try and get the user's
- full name for them and set the text on the entry widget.
- (management_prepare): If the account name is already taken,
- generate a unique one by appending " (%d)".
-
-2002-03-07 Radek Doulik <rodo@ximian.com>
-
- * mail-account-gui.c (sig_new_html): make edit button sensitive
- after new signature is created
- (sig_new_text): ditto
-
-2002-03-07 Anna Marie Dirks <anna@ximian.com>
-
- * folder-browser.c: Made all the acclerators in the context menu
- on a message work. (There are 22 different menu items here, so
- picking a unique accelerator for each label was tricky, and some
- of the choices I made are different from the ones I would have
- made if there weren't so many stinking menu items.)
-
-2002-03-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (config_import_old_signatures): Don't use an
- uninitialized 'id'.
-
-2002-03-07 Radek Doulik <rodo@ximian.com>
-
- * mail-signature-editor.c: notify accounts dialog about signature
- content change
-
- * mail-accounts.c (run_script): run script only if file regular
- file exists and has x flag
-
- * mail-signature-editor.c (mail_signature_editor): set initial
- focus to editor
- (do_exit): use hasUndo to avoid question dialog when content is
- unchanged
-
-2002-03-07 Dan Winship <danw@ximian.com>
-
- * component-factory.c (add_storage): Update for storage changes:
- explicitly create a root folder.
-
-2002-03-06 Dan Winship <danw@ximian.com>
-
- * mail-display.c (mail_display_render): Fix the "don't scroll back
- to the top of the HTML widget when opening an attachment" hack
- again by moving it here from mail_display_redisplay(). (It has to
- happen after the gtk_html_begin.)
- (mail_display_redisplay): Pass reset_scroll arg to
- mail_display_render.
-
- * mail-callbacks.c (do_mail_print): Pass reset_scroll (TRUE) to
- mail_display_render.
-
-2002-03-05 Dan Winship <danw@ximian.com>
-
- * folder-browser-ui.c: Don't try to set pixmap for
- /Toolbar/MailCompose, since it doesn't exist any more.
-
-2002-03-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (save_service): "use_ssl" can now be 3
- options, modify the code to handle this.
- (setup_service): Toggle the correct ssl option.
- (source_type_changed): Show/hide the ssl hbox container widget.
- (transport_type_changed): Same.
-
-2002-03-05 Dan Winship <danw@ximian.com>
-
- * mail-folder-cache.c (mail_note_store): Pull up assertion change
- from evolution-1-0-branch to allow external storages.
-
-2002-03-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (mail_unselect): If the clicked column was
- column 0, enable/disable it.
- (mail_select): Same.
-
- * mail-display.c (load_http): Added more debugging code to help
- figure out why a certain image isn't loading - looks like
- gnome-vfs is getting a premature EOF?
-
- * folder-browser.c (my_folder_browser_init): Connect to the
- focus-in/out events on the message-list so that we can disable the
- EditInvertSelection and EditSelectThread menu items when the
- message-list is not in focus.
-
- * folder-browser-ui.c (folder_browser_ui_message_list_unfocus):
- New function to de-sensitize some items if the message-list is not
- in focus.
- (folder_browser_ui_message_list_focus): New function to sensitize
- some items if the message-list is not in focus.
-
- * mail-callbacks.c (invert_selection): Only invert the selection
- of the message-list if it is the widget in focus.
-
- * message-list.c (message_list_select): Do not explicitly grab the
- focus here.
-
-2002-03-04 Ettore Perazzoli <ettore@ximian.com>
-
- [Fix #19303.]
-
- * mail-ops.c (mail_send_message): Set X-Mailer to say "Ximian
- Evolution", not just "Evolution".
-
-2002-03-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (forward_message): Forward all selected
- messages. Fixes bug #21190.
-
-2002-02-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (handle_text_html): Get the Content-Base if the
- header exists and use gtk_html_set_base to set this base url.
-
- * mail-display.c (on_link_clicked): No longer need to calculate
- the full url. This is now handled by GtkHTML.
- (on_set_base): Removed.
- (on_url_requested): No longer need to calculate the full url.
- (mail_display_initialize_gtkhtml): Don't connect to the set_base
- signal anymore. We don't care.
-
- * mail-display.h: No longer need base_url (it was broken anyway).
-
-2002-02-26 Not Zed <NotZed@Ximian.com>
-
- * mail-display.c (on_url_requested): If a related part is
- requested, remove it from the related undisplayed list.
-
- * mail-format.c (handle_multipart_related): Check if related parts
- are displayed, if not, remove them. For #2741.
-
-2002-02-24 Chris Toshok <toshok@ximian.com>
-
- * folder-browser.c (folder_browser_search_do_search): rename
- folder_browser_search_query_changed to this.
- (folder_browser_gui_init): hook both query_changed and
- search_activated up to folder_browser_search_do_search, preserving
- current behavior.
-
-2002-02-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (on_message_list_built): Removed, this wasn't
- working as intended and seemed to break other features.
-
-2002-02-21 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (create_component): Add an icon for the "New
- message" user creatable item.
-
-2002-02-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (on_message_list_built): Connect to our own
- message_list_built signal. Focus the list and select the first
- unread message (or frst message depending). Fixes bug #3900.
-
-2002-02-20 Anna Marie Dirks <anna@ximian.com>
-
- * message-tag-editor.c (message_tag_editor_init): Gave the editor
- window a title and an icon.
-
-2002-02-20 Anna Marie Dirks <anna@ximian.com>
-
- * message-tags.glade: Changed the policy for table2 so that it
- does not expand/fill. This was necessary to allow the message list
- as much growing room as possible. (And besides, there's no reason for
- table2 to expand/fill; its child widgets can't change size.
-
-2002-02-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (confirm_goto_next_folder): Prompt the user to
- find out if he/she wants to go to the next folder with unread mail
- in it.
- (find_current_folder): Find a given CamelFolderInfo node based on
- a given uri.
- (find_next_folder_r): Recursively look for a CamelFOlderInfo node
- which has unread messages.
- (find_next_folder): Given a currently selected CamelFolderInfo
- node, look for the next node containing unread messages.
- (do_evil_kludgy_goto_next_folder_hack): Find the currently
- selected folder and then find the very next folder after it that
- contains unread messages and then select it via a CORBA call to
- the shell.
- (next_unread_msg): If we fail to find an unread message in the
- message-list, prompt the user to find out if we should jump to the
- next fodler containing unread messages. If so, call
- do_evil_kludgy_goto_next_folder_hack().
-
- * message-list.c (message_list_select): Return a boolean value
- based on whether the call was successfull or not.
-
- * mail-config.c (mail_config_get_confirm_goto_next_folder):
- (mail_config_set_confirm_goto_next_folder):
- (mail_config_get_goto_next_folder):
- (mail_config_set_goto_next_folder): All new functions, yay.
- (config_read): Read in the confirm_goto_next_folder and
- goto_next_folder config options.
- (mail_config_write_on_exit): Same the options here.
-
-2002-02-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (basename_from_uri): Ack, strip off the
- leading '/' char and also only translate if it is a local uri,
- imap folders and other external folders will be named by the user
- so no need to translate those.
-
- * mail-display.c (do_attachment_header): Don't display a
- down-arrow if the attachment is undisplayable. Fixes bug #6919.
- (launch_cb): Some programs are buggy when it comes to parsing
- file: uris, so make sure we do file://%s. Fixes bug #20456.
-
-2002-02-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (basename_from_uri): Replacement for using
- g_basename and also translates the basename string to fix bug
- #7160.
- (mail_account_gui_save): Use basename_from_uri().
- (folder_picker_clicked): Here too.
-
- * mail-callbacks.c (mail_generate_reply): Default the from-account
- to the source account. If that fails, then guess the from-account
- based on the recipients. Fixes bug #20479.
-
-2002-02-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (drag_data_get_cb): Implement.
- (drag_data_delete_cb): Implement.
- (do_attachment_header): Setup Drag & Drop. This implements
- bugzilla bug #1066.
-
- * folder-browser-ui.c: Set the followup icon to use the new flag
- icon rather than the exclamation mark icon.
-
- * mail-callbacks.c (flag_for_followup): Append the selected
- messages to the clist in the followp editor.
-
- * message-list.c: Include the new flag-for-followup icon.
-
- * message-tag-followup.c (message_tag_followup_append_message):
- New method to add a message to the message-list.
- (construct): Get the message_list widget and load the flag icon
- pixmap.
-
-2002-02-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-tag-followup.c (set_widget_values): Fixed a bug.
-
- * mail-callbacks.c (flag_for_followup): If only 1 message is
- selected and it happens to already be marked for follow-up, set
- the value of the flag on the editor so the settings are restored.
-
- * folder-browser-ui.c: Set the pixmaps on MarkAsRead, MarkAsUnread
- and MarkAsImportant bonobo verbs. Also connect to
- flag-for-followup verb.
- (folder_browser_ui_set_selection_state): Added MessageFollowUpFlag
- verb to the array of verb strings.
-
- * folder-browser.c: Set key accelerators on the follow-up
- right-click menu items to match Outlook.
-
-2002-02-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (create_msg_composer): No longer need to call
- e_msg_composer_show_sig_file(). This gets handled auto-magically
- by a signal emition when the default From address chooser gets
- created.
- (do_forward_non_attached): No longer need to call it here either
- because e_msg_composer_set_body_text() now makes sure to re-show
- the signature.
-
-2002-02-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (do_forward_non_attached): Show the signature.
-
-2002-02-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (ml_tree_value_at): Get followup-up message-list
- values. Also highlight the message in red if the due-by date is
- past due (this is what Outlook does).
- (ml_duplicate_value): Handle follow-up columns.
- (ml_free_value): Same.
- (ml_initialize_value): Here too.
- (ml_value_is_empty): And here.
- (ml_value_to_string): And finally here.
-
- * message-tag-followup.c (message_tag_followup_i18n_name): New
- convenience function.
-
-2002-02-11 Radek Doulik <rodo@ximian.com>
-
- * mail-callbacks.c (create_msg_composer): unset changed, drop
- editor undo
- (mail_generate_reply): drop editor undo
- (do_forward_non_attached): ditto
- (do_forward_attach): ditto
- (do_redirect): ditto
-
-2002-02-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (followup_tag_complete): Implemented.
- (on_right_click): Do better enabling/hiding of unwanted
- flag-for-followup options.
-
-2002-02-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-tag-followup.c (set_widget_values): Set the correct
- drop-down menu item.
- (message_tag_followup_encode): Return NULL if the type is NONE.
- (clear_clicked): Set the drop-down menu to None.
- (type_changed): Hide the None menu item.
- (construct): Create a None menu item and set it as the default.
-
-2002-02-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-tag-followup.[c,h]: New flag-for-followup tag editor
- dialog.
-
- * mail-callbacks.c (flag_for_followup): New callback that pops up
- a flag-for-followup editor dialog.
- (flag_followup_completed): Marks all flag-for-followup'd messages
- as 'complete'.
- (flag_followup_clear): Clears all flag-for-followup tags from the
- selected messages.
-
- * message-tags.glade: glade file for tag editors.
-
-2002-02-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-tag-editor.[c,h]: Base class for a message tag editor.
-
- * folder-browser.c (on_right_click): Setup the hide/enable masks
- for "Flag for Follow-up"
-
- * mail-callbacks.c (confirm_expunge): Instead of hiding deleted
- messages and then expunging, disable the use of the message-list
- completely during the expunge operation.
- (expunged_folder): Re-enable the use of the message-list widget
- here.
-
-2002-02-07 Radek Doulik <rodo@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): call set_body later to
- allow ignored words to be sent to gtkhtml control ahead
-
-2002-02-07 JP Rosevear <jpr@ximian.com>
-
- * component-factory.c (create_component): remove "New" from user
- creatable menu item
-
-2002-02-07 Christopher James Lahey <clahey@ximian.com>
-
- * folder-browser.c, folder-browser.h, folder-browser-ui.c,
- folder-browser-ui.h
- (folder_browser_ui_setup_view_menus,
- folder_browser_ui_discard_view_menus): Changed this to use the new
- GalViewMenus stuff. Made these exported functions.
-
- * mail-callbacks.c, message-browser.c: Changed these to not pass
- the now removed row parameter to message_list_select.
-
- * mail-config.c, mail-config.h (mail_config_folder_to_safe_url):
- Refactored this out of mail_config_folder_to_cachename.
-
- * message-list.c, message-list.h (message_list_select): Removed
- the row argument. Changed this to use the new function in ETree
- for finding the next cursor row that matches a test.
- (message_list_construct): Handle a failed construction of the
- ETree here.
- (message_list_setup_etree, save_tree_state): Don't load or save
- the header state. folder-browser-ui.c deals with this now.
-
-2002-02-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_new): Rearranged the #if
- checks so that we don't ever try to access any smime widgets
- (since they are now being destroyed) if smime isn't enabled.
- (mail_account_gui_save): Same here.
-
- * message-list.c: Removed references to NEEDS_REPLY.
-
- * mail-callbacks.c (mark_as_needing_reply): Removed.
- (mark_as_not_needing_reply): Removed.
- (toggle_need_reply): Removed.
-
- * folder-browser.c (on_right_click): Remove CAN_MARK_NEEDS_REPLY
- stuff, this is going to be implemented in an entirely different
- way.
-
- * mail-format.c (handle_text_plain): Look for DOCTYPE XML comments
- too to decide if the message content is really HTML.
-
-2002-02-06 Not Zed <NotZed@Ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): Dont double-free the
- text body data.
-
-2002-01-31 Not Zed <NotZed@Ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): Add attachments after
- we've seen if the composer object is valid.
- (mail_generate_reply): Support new flag REPLY_NO_QUOTE - if set,
- then dont quote any of the message in the reply.
-
-2002-02-02 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_new): Destroy the S/MIME
- frame if not available, instead of just graying it out. [I would
- just hide it, but it looks like there is a show_all somewhere so
- that doesn't work.]
-
-2002-02-02 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-config.glade: Some touchups from me and Anna.
-
-2002-01-31 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (composer_get_message): Don't bother setting
- the auto-cc/bcc recipients here. I'm moving the code to add them
- in the GUI in the composer so they will already be in the
- recipient list by this point.
-
-2002-01-31 Radek Doulik <rodo@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): ignore spell checking of
- words in addresses, move set_body_text after all ignored words are
- set so we don't have to spell check whole document again
- (mail_ignore_address): helper function
- (mail_ignore): ditto
-
-2002-01-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (mail_edit): Pass the parent window to
- mail_account_editor_new().
-
- * mail-account-editor.c (mail_account_editor_new): Set the parent
- window here because construct() inadvertantly
- gtk_widget_show_all's the editor.
-
- * mail-account-gui.c (mail_account_gui_save): Use g_basename()
- rather than strrchr for '/' especially since the strrchr code
- wasn't doing any NULL checks.
-
-2002-01-30 Radek Doulik <rodo@ximian.com>
-
- * mail-format.c (handle_text_plain_flowed): print quoted text in
- italic
-
-2002-01-30 Not Zed <NotZed@Ximian.com>
-
- * component-factory.c (create_component): re-enable popup menu.
- (populate_folder_context_menu): If we're on a vfolder, and its not
- UNMATCHED, create a change properties item, and set it up
- approriately.
- (change_prop_popup): Callback to edit the vfolder rule. For
- #3358.
-
-2002-01-29 Dave West <kat@unleashed.org>
-
- * mail-callbacks.c (create_msg_composer): Changed the function
- signature so that we can pass in whom we want to compose as.
- Should fix bug #10391.
- (compose_msg): Get the current profile account and pass it along
- to create_msg_composer.
- (send_to_url): Pass in a NULL profile account to cause
- create_msg_composer to use the default account.
-
-2002-01-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (mail_send_message): Make X-Evolution-Account take
- priority over X-Evolution-Transport. Should we just get rid of
- X-Evolution-Transport? Anyways, this ought to fix a number of
- complaints.
-
- * mail-accounts.c (construct): Don't pass NULL text to
- gtk_entry_set_text. Maybe this will fix bug #18971.
-
-2002-01-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (redirect): New function that implements the
- Redirect feature.
-
- * mail-ops.c (mail_send_message): If we are redirecting a message,
- get the Resent-* recipients otherwise get the normal To/Cc/Bcc
- recipients and use them in the CamelTransport::send_to() method.
-
- * mail-session.c (main_get_filter_driver): Set the beep_func to
- the beep_cb, not the play_sound_func. Oops ;-)
-
- * folder-browser-ui.c: Add Redirect bonobo verb thingy here.
- (folder_browser_ui_set_selection_state): Add MessageRedirect to
- the proper string arrays.
-
-2002-01-29 Radek Doulik <rodo@ximian.com>
-
- * mail-callbacks.c (do_mail_print): initialize line to 0 to make
- everybody happy ;-)
- ops, set local_font to NULL
- (do_mail_print): get rid of static global variables, as they are
- not thread safe (thanks to clahey for pointing this out)
- (footer_info_free): unref footer font
-
-2002-01-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (composer_get_message): Don't bother checking
- for invalid recipients anymore. If a recipient is invalid, the
- transport error message will specify that now.
-
-2002-01-28 Radek Doulik <rodo@ximian.com>
-
- * mail-callbacks.c (do_mail_print): print footer
- (footer_print_cb): print page number and number of pages
-
-2002-01-27 Ettore Perazzoli <ettore@ximian.com>
-
- * importers/Makefile.am: Use IMPORTERS_CFLAGS.
-
-2002-01-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (delete_event_cb): We need to return a value
- here. I think FALSE is fine (I hope).
-
- * mail-display.c (save_data_cb): Save the pathname.
- (save_part): Use the new mail_config cruft to get the last used
- save pathname.
-
- * mail-config.c (config_read): Read in last_filesel_dir string.
- (mail_config_write_on_exit): Save the last_filesel_dir setting.
- (mail_config_get_last_filesel_dir): New
- (mail_config_set_last_filesel_dir): New
-
- * component-factory.c (destination_folder_handle_motion): Do some
- NULL checking on the url before using it.
- (destination_folder_handle_drop): Make sure the uri is non-NULL
- before freeing.
-
-2002-01-24 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am: s/MAILER_CFLAGS/EVOLUTION_MAIL_CFLAGS/,
- s/MAILER_LIBS/EVOLUTION_MAIL_LIBS/.
-
-2002-01-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-session.c (session_system_beep): This wrapper for gdk_beep().
-
- * mail-account-gui.c (is_email): Don't bother trying to see if the
- domain looks like a FQDN.
-
- * mail-callbacks.c (select_all): If the mail-display is in focus,
- then select-all in the mail display rather than the
- message-list. Fixes bug #19126.
-
-2002-01-23 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (create_component): Pass a NULL icon to
- `evolution_shell_component_add_user_creatable_item()'.
-
-2002-01-23 Jeffrey Stedfast <fejj@ximian.com>
-
- Implements bug #15692
-
- * folder-browser.c (html_button_press_event): New callback that
- checks to make sure that the mouse isn't over a link or image in
- the html view and then calls the on_right_click handler after
- getting the appropriate args.
- (my_folder_browser_init): Connect to the button_press_event here.
-
-2002-01-23 Dan Winship <danw@ximian.com>
-
- * Makefile.am (INCLUDES): Define CAMEL_PROVIDERDIR to be the
- configure.in-defined camel_providerdir. (Was supposed to have been
- committed a month ago... oops.)
-
-2002-01-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (mail_filter_folder): Now takes a boolean notify
- argument. If this is *not* set, then remove the sound-notify
- filter rule that mail-session adds. Kinda kludgy, but good enough
- for the moment.
-
- * mail-callbacks.c (guess_me): Simplified.
-
-2002-01-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (handle_text_plain): If the first "token" in the
- body is "<html>", then treat this as a text/html part rather than
- a text/plain part. Fixes bug #16817.
-
- * component-factory.c (destination_folder_handle_drop): Removed
- some unused variables.
-
-2002-01-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (try_uudecoding): Update to match new uudecode
- interface (ie, no longer need a uulen state variable).
-
-2002-01-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (on_set_base): New callback to handle the
- set_base signal.
- (on_url_requested): If the base_url is set, prepend it to the data
- url (we don't want to do this for cid urls or part urls tho).
- (mail_display_init): Initialize md->base_url to NULL.
- (mail_display_destroy): Free the base_url.
- (mail_display_initialize_gtkhtml): Connect to the set_base signal.
- (on_link_clicked): If the base_url is set, prepend it to the url
- string passed to us from gtkhtml.
-
-2002-01-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (do_edit_messages): Don't remove any
- X-Evolution* headers here, the composer already knows to ignore
- these. Besides, it needs to know the X-Evolution-Format header.
-
-2002-01-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (composer_save_draft_cb): Do proper refcounting
- on the draft folder.
-
- * message-list.c (message_list_select): When performing a
- wraparound, check to see if the first (or last depending on
- direction) message fits the selection criteria before telling
- etable to find the next/previous matching node.
-
- * mail-account-gui.c (mail_account_gui_new): When connecting to
- the transport username changed event, pass the gui->transport not
- the gui->source.
-
-2002-01-08 Iain Holmes <iain@ximian.com>
-
- * importers/evolution-mbox-importer.c (string_to_int): Takes a hex
- string and converts it to an int.
- (get_info_from_mozilla): Creates a CamelMessageInfo structure from
- the X-Mozilla-Status header.
- (process_item_fn): Check for the X-Mozilla-Status header and if it
- is present call get_info_from_mozilla. If get_info_from_mozilla
- returns that the message was marked as deleted but never expunged
- it isn't imported.
-
- * importers/mozilla-status-headers.h: Stuff Evolution cares about
- from the mozilla header.
-
-2002-01-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_set_new_mail_notify_sound_file): Renamed.
- (mail_config_get_new_mail_notify_sound_file): Renamed.
-
- * mail-accounts.c (notify_radio_toggled): Replace EXEC with
- PLAY_SOUND.
- (construct): renamed the exec_command stuff to play_sound.
-
- * main.c (main): Init and shutdown gnome_sound.
-
- * mail-ops.c (fetch_mail_fetch): Don't do any new-mail
- notification here.
- (filter_folder_filter): call camel_filter_driver_flush.
-
- * mail-session.c (main_get_filter_driver): Set the filter-driver
- exec_func here instead.
-
- * mail-ops.c (mail_fetch_mail): Don't set the filter-driver
- exec_func here.
-
-2002-01-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (composer_get_message): Add an Organization
- header.
-
-2002-01-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (list_add_addresses): Simplified. Also no
- longer needs an "ignore_addr" argument as far as I can tell so
- that has been removed.
- (mail_generate_reply): Don't pass an ignore_addr argument to
- list_add_addresses and also change to use g_strcase_hash and
- g_strcase_equal since addresses are not case snesitive
- (mostly). Also, Reply-To can contain multiple addresses, so handle
- this case too.
-
-2002-01-02 JP Rosevear <jpr@ximian.com>
-
- * mail-callbacks.c: remove e_gnome_dialog util functions and use
- e-util ones instead
-
-2001-12-21 Jeffrey Stedfast <fejj@ximian.com>
-
- The idea here is that if we consistantly name the movemail file
- between Send&Receive sessions that if the user cancells the
- "download" of a mbox spool that the next Send&Receive will not
- "lose" mail that didn't finish the previous session. Fixes bug
- #17759. Well, mostly. If you have 200 messages and cancel after
- the first 100, say, then the next time you hit Send&Receive, it
- will start over from 1 so you'll end up duplicating the first 100
- messages, but at least you won't "lose" mail.
-
- * mail-tools.c (mail_tool_get_local_movemail_path): Now a static
- internal function, takes a char *uri argument and no longer
- generates movemail.%d filenames... they are now based on the uri
- provided.
- (mail_tool_do_movemail): Pass along the source_uri.
-
-2001-12-20 Jon Trowbridge <trow@ximian.com>
-
- * message-list.c (on_click): Makes the auto-undelete behavior when
- changing message flags a bit more sane. (Fixes #17634)
-
-2001-12-20 Ettore Perazzoli <ettore@ximian.com>
-
- [Fixes #17377, Evolution doesn't work on multi-depth displays.]
-
- * main.c (main): Push GdkRGB visual and colormap.
-
-2001-12-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (composer_get_message): Add the auto-cc/bcc
- recipients here. The problem with setting them in the composer is
- that what if the user changes which account he wants to use? We'd
- either have to clear the cc/bcc lists *or* we'd have to leave them
- alone. Either way is bad. We can't just clear the entries because
- the user may have added addresses since the composer was
- opened. We don't want to leave any old auto-cc/bcc addresses there
- because that isn't desirable either. So we give up and add them
- here after the user has already hit the send button.
-
- * mail-config.c (account_copy): Update to copy the always-[b]cc
- options.
- (account_destroy): Update to destroy the above options.
- (config_read): Update to read in those values.
- (mail_config_write): Save those options.
-
- * mail-account-gui.c (mail_account_gui_new): Setup Always Cc/Bcc
- widgets.
- (mail_account_gui_save): Get the user-entered values for the
- always-cc/bcc stuff.
-
-2001-12-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (setup_service): If the provider is NULL,
- don't do anything.
-
- * mail-accounts.c (construct): Oops, no wonder the exec command
- thing never stuck around... I wasn't getting the right widget from
- libglade. Also connect to the GtkEntry's changed event since a
- GnomeFileEntry doesn't have that signal in its ancestry.
-
-2001-12-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (filter_folder_free): Argh, don't notify about new
- mail here.
- (fetch_mail_fetch): Notify about new mail here instead.
-
- * mail-accounts.c (construct): Setup the new-mail-notification
- widgets.
- (notify_command_changed): Update the command-line for new mail
- notification.
- (notify_radio_toggled): Update the new-mail-notification type.
-
- * mail-ops.c (filter_folder_free): See if we got any new mail and
- "sound the alarm" if we did.
-
-2001-12-17 Jon Trowbridge <trow@ximian.com>
-
- * mail-format.c (handle_text_plain_flowed): Set citation color to
- black when we are printing.
-
- * mail-format.c (attachment_header): Avoid embedding <object> tags
- when we are printing.
- (handle_multipart_signed): Don't do the click-for-info signature
- stuff when we are printing.
- (handle_via_bonobo): Don't embed an <object> tag if we are
- printing.
-
- * folder-browser.c: Changed context_menu[] array so that we can
- print when the preview pane is closed.
-
-2001-12-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (mail_fetch_mail): Set the filter driver's shell-exec
- callback.
-
-2001-12-12 Jeffrey Stedfast <fejJ@ximian.com>
-
- * mail-config.c (mail_config_check_service): Connect to the
- destroy signal on the popup dialog.
-
-2001-12-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (handle_text_plain): Make sure i != num_specials
- after we check for any special text markers. Fixes bug #12265.
-
-2001-12-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (compose_msg): Connect to the save-draft signal.
- (send_to_url): Here too.
- (mail_reply): And here...
- (forward_get_composer): Same.
- (do_edit_messages): And finally here.
-
- * mail-format.c (try_inline_pgp):
- (try_inline_pgp_sig): Start reiplementing The Right Way and not
- danw's fucking half-assed kludge that doesn't work.
-
-2001-12-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_set_new_mail_notification_command):
- set the new-mail-notify command.
- (mail_config_get_new_mail_notification_command): get the
- new-mail-notify command.
- (mail_config_set_new_mail_notification): set the
- new-mail-notification action.
- (mail_config_get_new_mail_notification): get the
- new-mail-notification action.
- (mail_config_write_on_exit): save the new-mail-notification
- settings.
- (config_read): Read in the new-mail-notification settings.
-
- * mail-ops.c (mail_execute_shell_command): New function to execute
- a shell command async. Will be used for playing sounds on new mail
- or whatever.
-
-2001-12-11 Jon Trowbridge <trow@ximian.com>
-
- * mail-identify.c (mail_identify_mime_part): Fixed for
- mail_content_loaded's new signature.
-
- * mail-format.c (attachment_header): Don't convert URLs, etc. if
- we are printing.
- (write_address): Don't convert addresses to mailto: links if we
- are printing.
- (write_one_text_plain_chunk): Add a printing flag, that we pass
- along to mail_text_write.
- (handle_text_plain): Pass our printing flag to
- write_one_text_plain_chunk.
- (mail_get_message_rfc822): Don't unneccesarily convert URLs.
- (mail_content_loaded): Add a GtkHTML parameter.
-
- * mail-display.c (mail_display_initialize_gtkhtml): Added. Breaks
- all of the signal hookups out of mail_display_new.
- (mail_display_new): Call mail_display_initialize_gtkhtml.
- (mail_text_write): Don't convert URLs, etc., if we are printing.
- Lots of other changes to pass around GtkHTML/GtkHTMLStream objects.
-
- * mail-callbacks.c (do_mail_print): Call
- mail_display_initialize_gtkhtml on our GtkHTML object.
-
- * folder-browser.c (update_status_bar): Make the status bar more
- useful when you have a large number of hidden messages.
-
- * message-list.etspec: Add ETable magic for our new "Needs Reply"
- column. (The next few entries are for bug #90)
-
- * message-list.h: Add COL_NEED_REPLY.
-
- * message-list.c: Move mail_need_reply_xpm to the end of
- states_pixmaps.
- (ml_duplicate_value): Handle COL_NEED_REPLY.
- (ml_free_value): Handle COL_NEED_REPLY.
- (ml_initialize_value): Handle COL_NEED_REPLY.
- (ml_value_is_empty): Handle COL_NEED_REPLY. Added
- needs_reply_map[] array.
- (ml_value_to_string): Handle COL_NEED_REPLY.
- (ml_tree_value_at): Fix magic numbers, undoing my changes from the
- otehr day. Add handler for COL_NEED_REPLY.
- (message_list_create_extras): Attach icons for COL_NEED_REPLY.
- (on_click): Undo my previous changes to display need-reply status
- in COL_MESSAGE_STATUS. Add handing for COL_NEED_REPLY.
-
- * mail.h: Change mail_format_mime_message, mail_format_raw_message
- and the MailMimeHandlerFn typedef to take GtkHTML and
- GtkHTMLStream args, as per our changes in mail-format.c.
-
- * mail-format.c: Giant refactoring. Remove the assumption
- throughout that we will always want to render into the GtkHTML
- object contained in the MailDisplay. Instead, always pass in the
- GtkHTML and GtkHTMLStream that we want to write to. Also, ignore
- theme work-arounds if the printing flag is set. (This and what
- follows fixes bug #82)
-
- * mail-display.h: Remove GtkHTMLStream *stream from MailDisplay.
- We don't need it anymore.
-
- * mail-display.c (mail_display_render): Added. Breaks the code
- that renders the message into the GtkHTML object out of
- mail_display_redisplay.
- (mail_display_redisplay): Call mail_display_render.
- (mail_display_init): Remove reference to ->stream.
- (mail_display_new): Remove reference to ->stream.
-
- * mail-callbacks.c (do_mail_print): Create a new GtkHTML to render
- our printed version into (via the new function
- mail_display_render. Set the MailDisplay's printing flag to TRUE
- before we render, and set it back to FALSE afterwards.
- (do_mail_fetch_and_print): If the preview pane isn't open when we
- try to print, fetch the message before printing.
- (print_msg): Call do_mail_fetch_and_print.
- (print_preview_msg): Call do_mail_fetch_and_print.
-
- * folder-browser-ui.c: Remove "PrintMessage" and
- "PrintPreviewMessage" from message_pane_enables... these now work
- when the preview pane is closed. Disable printing if multiple
- messages are selected.
-
-2001-12-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (filter_folder_filter): Don't expunge when we sync
- anymore, this fixes bug #4472.
-
-2001-12-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-autofilter.c (rule_from_message): Make sure that the
- message subject is non-NULL beforetrying to base a vfolder rule
- off it. Fixes bug #16284.
-
-2001-12-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (construct): Connect to the dialog's "destroy"
- event and close any druids/editors that may be open when that
- signal is caught. Fixes bug #16501.
-
- * mail-vfolder.c (vfolder_edit): Set the window title to "Virtual
- Folders". Fixes bug #16695.
-
-2001-12-05 Radek Doulik <rodo@ximian.com>
-
- * mail-callbacks.c (do_mail_print): set paper size to
- _("US-Letter"), use gtk_html_print_set_master
-
-2001-12-08 Dan Winship <danw@ximian.com>
-
- * mail-display.c (on_object_requested): Don't just assume all of
- the GtkHTMLEmbedded's fields are filled in, since HTML messages
- may have <object>s in them that we're not expecting.
-
-2001-12-07 Dan Winship <danw@ximian.com>
-
- * mail-send-recv.c (mail_send_receive): Add a "current_folder"
- arg.
- (build_dialogue): Remember the current_folder
- (free_send_data): If current_folder is set, refresh it so it's
- guaranteed to be synced with the folder tree. Fixes #14770.
-
- * mail-callbacks.c (send_receive_mail): Pass current_folder to
- mail_send_receive().
-
-2001-12-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (stream_write_or_redisplay_when_loaded): Check
- that the mail-display hasn't been destroyed.
- (mail_display_redisplay): Same here.
-
-2001-12-07 Dan Winship <danw@ximian.com>
-
- * mail-send-recv.c (receive_update_got_store): If updating a store
- that we don't have an associated storage for, just request a
- folder tree and then free it. (For the Connector)
-
- * mail-callbacks.h: Add missing part of Jeff's 12-03 patch so this
- actually compiles.
-
-2001-12-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (mail_send_message): s/PREVIEW_RELEASE/VERSION_COMMENT
-
-2001-12-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (mail_send_message): Don't append "(Preview Version)"
- at the end of the version string. Use the PREVIEW_RELEASE #define
- instead.
-
-2001-12-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-ui.c: Setup the UI for the AddSenderToAddressbook
- ui verb thingy.
-
- * mail-callbacks.c (add_sender_to_addrbook): New bonobo-ui
- callback that adds a sender to the addressbook.
-
-2001-12-04 Jon Trowbridge <trow@ximian.com>
-
- * folder-browser-ui.c (folder_browser_ui_set_selection_state):
- Allow 'n' and 'p' to work when multiple messages are selected.
- Fixes #12062.
-
-2001-11-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (save_msg_ok): If the path exists, make sure
- it's a regular file (or we can't possibly save to it). Fix for
- #14127.
-
-2001-11-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (message_list_select): Cleaned up the code.
-
- * mail-callbacks.c (previous_unread_msg): Pass wraparound as TRUE.
-
-2001-11-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (pgpopen): Fix the boolean check to be && and not
- ||.
-
-2001-11-20 Not Zed <NotZed@Ximian.com>
-
- * folder-browser-ui.c: Disable search if no message
- loaded/viewed. Also for #14348.
-
- * folder-browser.c: Disable "Add sender to addressbook" if we dont
- have a message loaded (it wont work). For #14348.
-
-2001-11-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (load_content_loaded): Make sure the mail-display
- object is still "alive" before accessing any of it's data.
-
-2001-11-14 Zbigniew Chyla <cyba@gnome.pl>
-
- * mail-autofilter.c (rule_match_recipients, rule_from_message,
- rule_from_mlist): s/_/U_/ (filter_rule_set_name requires UTF-8 string)
-
-2001-11-14 Dan Winship <danw@ximian.com>
-
- * main.c (segv_redirect): Instead of doing pthread_exit() after
- redirecting the SEGV, try to lock a mutex we know is already
- locked. This will hopefully help debug a bunch of bugs where the
- crashed thread seems to be missing from the bug-buddy report.
-
-2001-11-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-session.c (pass_got): Call e_passwords_remember_password()
- for account passwords if the user set the "remember password"
- checkbox.
-
-2001-11-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-vfolder.c (vfolder_load_storage): Add a NULL check for
- rule->name.
- (mail_vfolder_add_uri): Same here.
-
-2001-11-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (forward_message): If we already have the
- message loaded in the mail-display, don't bother re-loading. This
- happens to fix bug #14848.
-
-2001-11-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-tools.c (mail_tools_x_evolution_message_parse): Was
- x_evolution_message_parse from folder-browser.c. A space char is
- no longer used to separate the folder URI and the first uid,
- instead this is now done with a nul-char so update to parse the
- newer/better format.
-
- * component-factory.c (destination_folder_handle_drop): Update to
- parse the new/better format.
-
- * folder-browser.c (x_evolution_message_parse): Moved to
- mail-tools.c
- (message_list_drag_data_get): Instead of placing a space char
- after the folder URI, instead use a nul-char.
-
-2001-11-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (pgp_path_changed): Call
- mail_config_pgp_type_detect_from_path() instead of doing our own
- lame auto-detection that didn't even work ;-)
-
- * mail-config.c (auto_detect_pgp_variables): Execute the pgp
- binary and look at it's version string if we have a version string
- to compare to.
- (mail_config_pgp_type_detect_from_path): New function that takes a
- pgp path and attempts to figure out what pgp version it is.
-
-2001-11-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (try_inline_pgp): Add a "x-inline-pgp-hack=true"
- paramter to the multipart's content-type.
-
-2001-11-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-editor.c (construct): Don't make the account editor
- modal either.
-
- * mail-accounts.c (mail_add): Use the new global account druid
- variable so that we can avoid having more than a single druid at a
- time. If a druid already exists, bring it to the top.
- (mail_edit): Same idea only for the account editor this time.
- (mail_editor_destroyed): Set the global editor to NULL.
- (mail_add_finished): Set the global druid to NULL.
- (mail_delete): Don't allow any deletes if an account editor is
- opened (we don't want to be able to delete the account we are
- editing...)
- (news_edit): Same thing for the news editor.
- (news_editor_destroyed): Set the news editor to NULL.
- (news_add): And again for the news add.
-
- * mail-account-gui.c (service_check_supported): Updated to pass a
- GtkWindow argument to mail_config_check_service().
-
- * mail-config.c (mail_config_check_service): Now takes a GtkWindow
- argument so we can set our parent window. Also, don't make this
- dialog modal either.
-
- * mail-config-druid.c (construct): Don't make this druid modal.
-
-2001-11-05 <NotZed@Ximian.com>
-
- * message-browser.c (set_bonobo_ui): Override the Move/Copy
- handlers setup by the folder_browser_ui code, and use our own,
- because we need to pass it a live window which we can't.
- (transfer_msg): Our own version of mail-callbacks.c:transfer_msg,
- so we can properly pass the parent to the user_select_folder.
- (transfer_msg_done): Also copy this so we can pass it diff args.
- All fix #13919.
-
- * mail-callbacks.c (transfer_msg): Set physical/uri to NULL before
- calling, because althought he shell client api call is supposed to
- null these out, it doesn't with its stupid assertion checks on
- entry. Also free physical to plug a memleak. Bugs exposed by
- #13919.
-
-2001-11-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.h (mail_html_write): Renamed from
- mail_html_write_string.
-
- * mail-display.c (mail_text_write): Don't bother with varargs
- since nothing used them, we were only passing strings anyway...
- (mail_error_printf): Renamed from mail_error_write, this makes
- more sense.
- (mail_html_write): Removed.
-
- * mail-format.c: Updated to use gtk_html_stream_printf directly
- and s/mail_html_write_string/mail_html_write.
- (mail_lookup_handler): Don't use %.*s here either...
- (handle_text_enriched): Same.
- (write_one_text_plain_chunk): And finally here (also update for
- new mail_text_write api).
- (handle_multipart_signed): Update for new mail_text_write api.
- (format_mime_part): Update for new mail_error_text/printf name
- change.
- (handle_multipart_encrypted): Same.
-
- * mail-tools.c (mail_tool_generate_forward_subject): Same as
- mail_generate_reply.
-
- * mail-callbacks.c (mail_generate_reply): Don't use %.*s in any
- *printf* functions.
-
-2001-11-02 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.c (ml_tree_value_at): Use GINT_TO_POINTER here for
- platforms where simply casting an int to void * won't work.
- (build_flat_diff, main_folder_changed): Call
- e_tree_model_pre_change here.
-
-2001-11-02 <NotZed@Ximian.com>
-
- * message-browser.c (message_browser_message_list_built):
- Disconnect from the message_list_built function so we dont do it
- every time the list is rebuilt.
-
- * mail-callbacks.c (composer_send_cb): Disable autosave when we're
- sending mail.
- (composer_sent_cb): Re-enable autosave.
-
- * folder-browser-ui.c (fbui_sensitize_timeout): Make sure we reset
- any data we're using on the folderbrowser before doing anything
- 'cause things could vanish while we're doing it, and also
- ref/unref the folderbrowser so it doesn't vanish while w'ere
- working.
-
- * folder-browser.c (folder_browser_set_ui_component): If we are
- changing the ui comp, remove any pending timeouts. For #13719.
-
-2001-11-01 Larry Ewing <lewing@ximian.com>
-
- * folder-browser.c (folder_browser_copy): fix cut & paste from the
- message body.
-
-2001-11-01 Dan Winship <danw@ximian.com>
-
- * mail-format.c (handle_multipart_signed): Write out the url
- before callind add_url since add_url may free it. Fixes #13839.
- Remove debug printf.
-
- * mail-display.c (on_object_requested): Remove debug printf.
-
-2001-10-31 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (list_add_addresses): Don't use a
- case-sensitive comparison.
-
-2001-10-31 Dan Winship <danw@ximian.com>
-
- * mail-format.c (try_inline_pgp_sig): Make this work again.
-
-2001-10-30 Larry Ewing <lewing@ximian.com>
-
- * mail-account-gui.c (delete_event_cb): add delete_event_handler.
- (menu_file_save_close_cb): add save and close command.
- (launch_signature_editor): initial the editor as having changed
- and attach the delete event handler.
-
-2001-10-30 <NotZed@Ximian.com>
-
- * message-browser.c (d): Turn it off.
-
- * mail-mt.c: Added exception strings to some of the op logging.
-
- * mail-format.c (elide_quotes): Remove, uh, what was this for, its
- not used anywhere? Also loops the instant it had a ", good one
- trow! :)
- (write_address): Remove name_arg/email_arg, these aren't used
- anywhere.
-
- * mail-mt.c (mail_msg_received): If we have a cancellation setup,
- destroy it immediately, to save fd's.
- (mail_msg_cancel): Check cancel != NULL.
- (mail_msg_free): Same.
-
- * folder-info.c: Comment out the Folder: and you've got mail
- prints.
-
- * mail-config-druid.c (wizard_next_cb): If we have a next
- function, honour if it tells us its going to set the page, and
- dont set it, otherwise, set it to the next page, unless we're at
- the end of our pages, and let the wizard do it itself.
- (wizard_back_cb): Same for going back. Rest of fix for #12127,
- see e-shell-startup-wizard for the rest.
- (next_func): If we're not on the last page, tell the druid we're
- gonna handle the next button, so we can sync properly with it,
- needed for above changes.
- (back_func): Similarly for going back past page 0.
- (wizard_listener_event): We want to set the page to the actual one
- asked for not, pagenum-1.
-
- * mail-local.c (mls_rename_folder): Oops, dont use the url storage
- path to offset the folder name we're renaming/opening, etc.
-
- * subscribe-dialog.c (fe_cancel_op_foreach): Argh!!! Dont free the
- async op data here, the async op is still running and will access
- it! Just try to cancel it and mark it as cancelled (id == -1)
- (fe_done_subscribing): Only remove outselves from the hash table
- if we're not cancelled. The handle should always be set here,
- since this code runs in the gui thread.
-
- * message-list.c (on_cursor_activated_idle): If nothing
- selected/cursor not activated, then select no message.
-
- * mail-folder-cache.c (update_1folder): Make the trash count
- optional on EVOLUTION_COUNT_TRASH, becuase some lusers are just
- too stupid to understand what its for.
-
- * component-factory.c (storage_xfer_folder): Return slightly
- better error codes for copying folders, since its not implemented
- yet.
-
- * mail-vfolder.c, mail-local.c, mail-folder-cache.c,
- message-list.c component-factory.c, mail-ops.c,
- subscribe-dialog.c, mail-session.c: d() out some debug printfs,
- w() out some warnings.
-
- * folder-browser-ui.c (folder_browser_ui_add_message): Fix typo,
- Resent->Resend.
-
-2001-10-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (transfer_messages_transfer): Don't warn the user if
- the source and destination folders are the same.
-
-2001-10-29 Dan Winship <danw@ximian.com>
-
- * mail-format.c (handle_multipart_signed): add some debug spew re
- 13839.
-
- * mail-display.c (on_object_requested): here too
-
-2001-10-29 Christopher James Lahey <clahey@ximian.com>
-
- * e-searching-tokenizer.c (search_info_set_match_size_increase):
- Fixed a warning by #if 0ing out this function.
-
- * folder-browser.c, folder-browser.h (on_selection_changed):
- Update status bar in an idle call. Fixes Ximian bug #13929.
-
- * mail-folder-cache.c (folder_renamed, store_folder_renamed):
- Fixed some warnings here.
-
-2001-10-29 Dan Winship <danw@ximian.com>
-
- * folder-browser.c (folder_browser_copy): Fix the focus check.
- It's not fb->message_list that has focus, it's one of its
- children. #13616.
-
-2001-10-29 <NotZed@Ximian.com>
-
- * mail-folder-cache.c (store_folder_renamed): Sort the folder
- updates first, since we dont seem to get them in the right order,
- or infact in any tree representation whatsoever when using IMAP
- ...? get_folder_info bugs?
-
- Unrelated note to self, the subscribe dialogue may interfere with
- the folder cache.
-
- * mail-vfolder.c (rule_changed): Copy the folder's full_name
- before trying to use it to rename.
- (vfolder_edit_rule): Set 'orig' to be a reference of the original
- rule.
- (edit_rule_clicked): Dont lookup orig by name, copy it over
- instead.
-
- * folder-browser.c (got_folder): oops, emit signal before
- unreffing object, incase we got killded during getting folder.
- (got_folder): Reset get_id.
- (folder_browser_new): Set get_id of the get_folder task.
- (folder_browser_init): Init get_id.
- (folder_browser_destroy): IF we have outstanding 'get folder' op,
- cancel it.
-
-2001-10-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_save): Call
- mail_autoreceive_setup() instead of
- mail_autoreceive_setup_account() since that code was completely
- broken anyway.
-
- * mail-send-recv.c (mail_autoreceive_setup_account): Removed.
-
- * mail-callbacks.c (transfer_msg_done): Move the message-list
- cursor to the next message.
- (transfer_msg): If we are moving messages, then pass
- transfer_msg_done() to mail_transfer_messages() so when it
- finishes it can move the cursor to the next undeleted message.
-
- * mail-format.c (try_inline_pgp): Check that the special PGP lines
- begin and end with \n so as to avoid matching against quoted PGP
- lines.
-
-2001-10-28 <NotZed@Ximian.com>
-
- * mail-callbacks.c (mark_all_as_seen): fb = user_data, not fb =
- fb!, fixes 13844.
-
- * mail-local.c (mlf_rename): add the folder name to the path when
- passing down to the subordinate folder.
-
- * folder-browser-ui.c (fbui_sensitize_timeout): Remove uic, kill
- dumb warning.
-
- * mail-autofilter.c (mail_filter_rename_uri): Implement function
- for filters to keep track of uri's being renamed.
- (mail_filter_delete_uri): Similarly for deleting uri's. Note that
- these functions are just noops though.
-
-2001-10-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c: Deactivate the Print right-click menu option
- if the message isn't loaded. Fixes bug #10346.
-
-2001-10-28 <NotZed@Ximian.com>
-
- * mail-vfolder.c (mail_vfolder_rename_uri): Implemented.
- (mail_vfolder_rename_uri): We do want to check renamed uri's from
- vstores.
- (mail_vfolder_delete_uri): Same.
- (store_folder_renamed): Fix the folder hash at the same time.
-
- * mail-folder-cache.c (real_flush_updates): Pass the rename event
- to vfolder rename uri.
- (real_flush_updates): Also rename and delete uri's from filters.
-
- * mail-local.c (mail_local_folder_reconfigure): Change the store
- path to be same as parent + mbox to be full path.
- (mls_delete_folder): Change store path to be parent path, and mbox
- to be full path.
- (mail_local_folder_reconfigure): Fix a leak of tmpname.
- (mls_delete_folder): Unref the store when done.
- (mls_rename_folder): Fix implementation, shell already created
- destination folder, so we can't just rename :(
-
- * component-factory.c (xfer_folder): Only do a rename if we have
- remove set, cleaned up logic a bit.
- (idle_quit): Put the components still active check last last of
- all.
- (storage_create_folder): IF we have a fragment, use that as part
- part for parent.
- (xfer_folder): Manually call rename code, since the shell will do
- a remove/add later on, AND there's no way we can determine the new
- path from the crock of an api we have to work with.
-
-2001-10-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (mail_format_get_data_wrapper_text): Allow the
- user to shoot him/herself in the foot when overriding message
- charsets. Permanantly fixes bug #921.
-
-2001-10-26 Dan Winship <danw@ximian.com>
-
- * folder-browser.c (etree_key): Work around something that we
- think is a GtkHTML bug, where sometimes the adjustments have
- slightly bogus values and scrolling ends up working backwards.
- (Ximian 4939)
-
- * mail-display.c (do_signature, do_attachment_header): Set the
- icon to be 24x24 here so that (assuming it's not a thumbnail), no
- resizes will have to be queued later. (There's still a bug with
- the text to the left of the button being drawn twice for some
- reason though.)
-
- * mail-callbacks.c (delete_msg): Fix a bug here that makes
- deleting multiple messages cause a gratuitous message body fetch.
- (Ximian 12355)
-
-2001-10-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (providers_config): Set the GdkWindow of the
- FolderBrowser, not the GtkWindow...
-
-2001-10-26 <NotZed@Ximian.com>
-
- * mail-local.c (mlf_set_folder): Changed to open the source store
- from '/', so we can do renames across directories. Of course,
- this doesn't quite work with different filesystems, but we'll
- assume this isn't a problem we're going to have.
- (mail_local_folder_get_type): Setup parent_class.
- (mlf_rename): Implement folder rename call, rename internal data.
-
- Is this a security issue? Well, not really, no more than anything
- else.
-
- * mail-folder-cache.c (mail_note_store): Listen to rename event.
- (store_folder_renamed): Function to handle it, empty.
- (mail_note_store_remove): Unhook from rename event.
- (mail_note_folder): Hook onto renamed event.
- (unset_folder_info): Unhook from renamed event.
- (folder_finalised): Lock around update.
- (folder_deleted): Lock around update.
- (real_flush_updates): If we have a path to remove remove it.
- (rename_folders): Scan folderinfo's, if we can find ones renamed,
- rename them, otherwise add them.
-
- * component-factory.c (owner_unset_cb): Use a timeout not an idle
- handler.
- (storage_xfer_folder): Implementation of xfer_folder signal
- handler, so we can rename imap/vfolders/etc.
-
- * component-factory.c (owner_unset_cb): Use a timeout not an idle
- handler.
-
- * mail-callbacks.c (providers_config): Only set the parent window.
-
- * mail-accounts.c (mail_edit): Set the parent on the account editor.
-
-2001-10-25 <NotZed@Ximian.com>
-
- * openpgp-utils.c (openpgp_verify): s/iconv/e_iconv/.
-
-2001-10-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (send_mail_free): Don't forget to unref the filter
- driver here.
-
-2001-10-25 <NotZed@Ximian.com>
-
- * folder-browser-ui.c (fbui_sensitize_timeout): So apparently the
- uicomp can just 'vanish' while we're using it. Joy. Take care of
- that case here, fixes #13482.
- (fbui_sensitise_item): Check here too just for kicks.
-
- * mail-folder-cache.c (store_finalised): If we can't destroy our
- async event, then queue another one to do it.
- (store_finalised_finish): And handle it here, until we can, then
- free it.
- (mail_note_store): Queue an async event to get folderinfo, dont
- use mail_get_folderinfo.
- (update_folders_get): thread-async event to retrieve the
- folderinfo, and build it, then queues gui-async event to update
- the gui.
- (add_unmatched_info): Taken from mail-ops, adds unmatched if
- required.
- (add_vtrash_info): From mail-ops, add trash if required.
- (update_folders): Thread async event to update gui.
- (mail_note_store): Ref the store and storage when created.
- (update_1folder): Changed to assume we have info_lock, and store
- updates in an updates list.
- (setup_folder): Same.
- (folder_changed): Changed to call update_1folder directly.
- (real_folder_changed): Removed.
- (mail_note_folder): Changed to call update_1folder directly.
- (real_note_folder): Removed.
- (store_folder_subscribed): Call setup_folder directly.
- (real_folder_created): Removed.
- (real_flush_update): Function that actually does the updates in
- the gui thread.
- (mail_note_store): Go back to using mail_get_folderinfo.
- (update_folders): Fixed upf ro changed api's.
- (unset_folder_info): Changed to queue pending updates.
- (real_folder_deleted): Removed.
- (store_folder_unsubscribed): Do the removal work directly.
- (mail_note_store): Dont link to finalised event of store - we now
- ref it.
- (mail_note_store_remove): If we have any pending updates, clear
- them out. Also cancel any pending folderinfo retrieve operations.
- (update_folders): Remove our update from the storeinfo list, if it
- still exists.
- (update_1folder): Make 'sent folder shows all counts' optional via
- an environmental variable EVOLUTION_COUNT_SENT for all those
- bloody whinging lusers out there.
- (mail_note_store_remove): Unref the storage when done.
-
- * mail-mt.c (mail_async_event_emit): If we're in main and have a
- gui task, set it to run via an idle function.
- (idle_async_event): Wrapper for calling do_async_event from idle
- function, and freeing the message when done.
- (idle_async_event): Call mail_msg_free not free on the finished
- message.
-
- * component-factory.c (mail_remove_storage): Destroy the storage
- async.
- (store_disconnect): This does the work.
- (free_storage): Un-note the store when we remove it, so the store
- noting code can unref things properly.
- (idle_quit): Return false when done, dont loop.
-
-2001-10-24 <NotZed@Ximian.com>
-
- * component-factory.c (owner_set_cb): Setup an async_event
- handler.
- (idle_quit): Try to destroy the async_event, or keep dropping out
- if it can't (deadlock).
-
- * mail-mt.c (do_async_event): Set the threadid of the thread we're
- running in so we know its running/which thread its in.
- (mail_async_event_emit): Added new argument 'type' which is the
- type of thread to execute against, gui or another one. Fixed all
- callers.
- (mail_async_event_destroy): Return -1 if this operation will fail
- (deadlock possibility). If we're in the thread of the task
- we're going to wait for, then return a failure (since we will
- deadlock).
- (mail_async_event_emit): Changed to use MailAsyncFunc type as the
- function type, which just takes 3 void args, change args to suit.
-
- * mail-folder-cache.c (mail_note_store): Record the pending update
- events in a pending list. We should really be able to use an
- async event for this, but that doesn't return to the gui loop when
- done :-/
- (update_folders): Remove from pending update when done.
-
-2001-10-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-send-recv.c (get_receive_type): Check for a NULL provider.
- (build_dialogue): Check for invalid source urls.
- (mail_receive_uri): Same.
-
-2001-10-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): No longer need to pass a
- settext argument.
- (do_forward_non_attached): Same.
-
- * mail-format.c (mail_get_message_body): Fix to not always return
- NULL for html parts, doh!.
-
-2001-10-24 <NotZed@Ximian.com>
-
- * folder-browser-ui.c (ui_add):
- (fbui_sensitize_timeout): Same.
-
- * folder-browser-factory.c (control_activate): Comment out freeze/thaw.
- (control_deactivate):
-
-2001-10-24 Jon Trowbridge <trow@ximian.com>
-
- * mail-search.c (mail_search_construct): Fixed some weird casting
- crack that got in here somehow, removed superfluous box-packing
- that was generating a gtk warning.
-
-2001-10-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (owner_unset_cb): Unref the global
- search_context.
- (owner_set_cb): create the global search_context.
-
- * folder-browser.c (folder_browser_gui_init): Pass along the
- global search_context to the e_filter_bar_new call.
-
-2001-10-24 <NotZed@Ximian.com>
-
- * message-browser.c (message_browser_message_loaded): Call
- ui_message_loaded when we are.
-
- * folder-browser-factory.c (control_activate): Freeze/thaw around
- all updates.
- (control_deactivate): Freeze/thaw around all updates.
-
- * folder-browser.c (folder_browser_init): Setup a hashtable to
- keep track of *our* sensitise state, so we can optimise pushes to
- bonobo.
- (folder_browser_finalise): Free hash here.
- (folder_browser_set_message_preview): Call a ui_message_loaded,
- even though it isn't, so it updates sensitivities right.
- (done_message_selected): Call ui_message_loaded when it really is,
- rather than the very fucked up idea of reversing the loaded_uid
- check.
-
- * folder-browser-ui.c (folder_browser_ui_set_selection_state):
- Dont enable the message-enabled options if the message display is
- hidden, e.g. print, view headers, etc.
- (folder_browser_ui_rm_all): Forget sensitise state.
- (fbui_sensitise_item): Sensitise items via a current-state table,
- so we dont have to do bonobo calls every time.
- (folder_browser_setup_property_menu): Call sensitise_item.
- (folder_browser_ui_add_message):
- (folder_browser_ui_add_global): Leave current set_prop "sensitive"
- for the stop button, so it doesn't get lost by the stuff in
- mail-mt.c
- (fbui_real_sensitize_items): Removed.
- (fbui_sensitize_timeout): Cleaned up, use sensitise_item to do
- work.
- (folder_browser_ui_message_loaded): Setup sensitive based on
- preview_shown too.
- (folder_browser_ui_set_selection_state): And here too.
-
-2001-10-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (service_check_supported): Don't allow an
- auth-type to be set when saving the service.
- (mail_account_gui_new): Initialize the source and transport
- provider_type's here so we don't forget to do it when it matters.
- (mail_account_gui_setup): Don't bother setting the provider_type's
- here, they are already set in mail_account_gui_new() now.
-
-2001-10-23 <NotZed@Ximian.com>
-
- * mail-display.c (mail_display_destroy): Remove the idle_id when
- we're destroyed so the idle func doesn't run on an invalid object.
-
- * message-list.c (regen_list_regened): Dont do anything if we're
- destroyed #13021.
-
- * mail-mt.c (mail_user_message):
- (mail_get_password): Removed, all functionality moved to
- mail-session.
-
- * mail-config.c (mail_config_write_on_exit): Check
- threaded/preview hash is null before using it, its setup on demand
- so itmight nto be initialised here.
-
- * mail-session.c (request_password): Remove password_current
- stuff.
- (alert_user): Redont, similar to get_pass. Do things as async as
- possible, and dont even wait for a response if we're not asking
- for the cancel button (this may or may not be right behaviour -
- need to check). mail_user_message() code replaced from the stuff
- in mail-mt.c
- (MailSession): Added a lock field.
- (init): Setup lock.
- (finalise): fRee lock.
- (register_timeout): Redone. We now allocate our own 'timeoutid's,
- and <> to the real things asynchronously. Use async_event's so we
- can make sure we have no outstanding ones after shutdown.
- (mail_session_enable_interaction): If interaction has been
- disabled, and we have either a message-box open, or a password
- request open and/or any pending message boxes/passwords, blow 'em
- away.
- (main_register_timeout): If we have pending remove of this same
- timeout, dont do anything.
- (timeout_timeout): Properly honour the result, remove the timout
- if it returns false.
- (do_user_message): Setup the message_destroy_id when we setup the
- destroy handler so it doesn't get called twice.
-
-2001-10-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (reply_to_sender): Make sure the fb and it's
- message-list exist.
- (reply_to_list): same.
- (reply_to_all): And here...
- (forward_message): Here too.
- (forward_attached): Again here.
- (transfer_msg): Here too.
- (apply_filters): Same.
- (select_all): Yet again here...
- (select_thread): And here.
- (invert_selection): Same.
- (flag_messages): Here too.
- (mark_as_unseen): and here...
- (mark_all_as_seen): ...
- (zoom_in):
- (zoom_out):
- (zoom_reset):
- (search_msg):
- (load_images):
- (save_msg):
- (next_msg):
- (next_flagged_msg):
- (next_unread_msg):
- (previous_msg):
- (previous_unread_msg):
- (expunge_folder):
- (configure_folder):
- (empty_trash):
-
-2001-10-23 <NotZed@Ximian.com>
-
- * mail-mt.c: Added missing errno.h
- (mail_msg_new): Fix the logic a bit, dont try to open the log file
- unless logging is actually requested.
- (mail_enable_stop, mail_disable_stop, do_set_busy,
- mail_operation_statys): Dont bother propagating events if
- global_shell_client isn't up yet.
-
-2001-10-23 Dan Winship <danw@ximian.com>
-
- * mail-mt.c (mail_msg_new): If the fopen() fails (eg, because
- evolution-mail was started by oafd with PWD=/), don't try to use
- the NULL file handle.
-
-2001-10-23 <NotZed@Ximian.com>
-
- * mail-session.c (get_password): Completely re-done. We now hae a
- completely async dialogue when requested from antoehr thread, and
- dont use gtk_main() if we can avoid it (which is normally the
- case). This stuff is only partially finished, and will mena the
- removal of the same from mail-mt.c, and the mail_user_message()
- code will be moved here and changed to work in a similar way.
-
- * mail-callbacks.c (empty_trash): Dont try and connect to remote
- stores just to get the trash. Also, always run empty trash async,
- and make sure we unref the trash.
- (empty_trash): Hmm, dont unref the trash, causes a problem on
- exit, i suspect something else is doing funky unrefs on it.
-
- * mail-tools.c (mail_tool_get_trash): Pass a 'connect' arg, tell
- it whether it should tryand connect or not to the parent service,
- if it isn't already connected.
-
- * component-factory.c (owner_unset_cb): Dont try wait_all here,
- could potentially deadlock.
- (idle_quit): Keep returning TRUE if we have outstanding
- processing. Note that this may busy-wait during exit processign
- with busy tasks :(
- (idle_quit): Keep calling ourselves till we no longer get called
- (i.e. gtk_main really quits).
-
- * mail-mt.c (mail_msg_active): New function, returns TRUE if
- events are still active/outstanding.
- (do_op_status): @$@$#@@!#@!! didn't unlock the mail_msg_lock if
- data->activity was NULL and we had no global_shell_client anymore!
- Also shortcut processing if this is going to be the case.
- (mail_msg_init): Setup a temporary other gui_port for redoing with
- new semantics password, user message and progress reporting.
- (mail_get_password): #ifdef'd out all this code temporarily, till
- it gets fully moved to mail-session.c
-
-2001-10-22 <NotZed@Ximian.com>
-
- * component-factory.c (owner_set_cb): Dont call enable_interaction
- here.
- (interactive_cb): But here instead, let the shell tell us when its
- ok to go interactive.
-
-2001-10-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (write_one_text_plain_chunk): Oops, revert my
- change to this function.
-
- * mail-display.h (mail_html_write_string): New fun macro.
-
- * mail-format.c (write_one_text_plain_chunk): Use gtk_html_write
- instead of mail_html_write so we avoid strdup'ing the text.
- (handle_text_plain_flowed): Use the mail_html_write_string macro.
- (handle_message_rfc822): Here too.
- (mail_format_raw_message): We can do it here also...
- (attachment_header): We can do it a little bit here...
- (write_address): A microscopic bit here...
- (write_hr): same.
-
-2001-10-22 Anna Marie Dirks <anna@ximian.com>
-
- * mail-config.glade: Added several new accelerators to the edit account
- dialog, and fixed the focus targets on all existing accelerators. I
- was hoping that since the widgets used in the account editor are also
- used in the first-time start-up druid and them mail-config druid,
- that this would fix all accelerator problems for those druids as well,
- but there is something wrong with Bonobo which is preventing
- the druids from responding to their accelerators. Sigh. Anyway,
- most accelerators in the edit account dialog work correctly
- now, though there are few (such as _Full Name) which fail to
- do anything. I don't know why.
-
-2001-10-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-stream-gtkhtml.c (mail_stream_gtkhtml_new): New class that
- wraps writing to a GtkHTML stream so that we don't have to write
- to an intermediate GByteArray.
-
- * mail-display.c (on_url_requested): Use the new Camel->GtkHTML
- stream - this means we don't have to chew up nearly as much
- memory...yay!
- (try_part_urls): Here too.
-
-2001-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-mt.c (do_op_status): Don't free `clientid' as it's
- uninitialized.
-
-2001-10-22 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.etspec (Score): disable this column. Fixes Ximian
- bug #12381.
-
-2001-10-22 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-mt.c: #include "component-factory.h".
- (do_op_status): Pass the component ID instead of the msg ID.
-
- * component-factory.h (COMPONENT_ID): #define here instead of
- `component-factory.c'.
- (SUMMARY_FACTORY_ID): Likewise.
-
-2001-10-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (format_mime_part): Don't wrap error text with
- <blockquote>, this is done inside mail_error_write.
- (handle_multipart_encrypted): If we get an exception trying to
- decrypt the mime part, display an error rather than trying to
- treat it as multipart/mixed.
-
- * mail-callbacks.c (empty_trash): Confirm expunge.
-
- * folder-browser.c (folder_browser_destroy): Move the folder sync
- code along with a few other things from folder_browser_finalise()
- into here instead.
- (folder_browser_finalise): Moved some cleanup functions into
- destroy.
-
-2001-10-22 Dan Winship <danw@ximian.com>
-
- PGP verification UI changes to make it not HTML spoofable.
-
- * mail-format.c (handle_application_pgp): Remove this unused
- hack.
- (mail_format_mime_message): Initialize a fourth hash table, used
- to keep track of fake MIME parts.
- (mail_part_set_default_displayed_inline): New routine to set the
- default disposition of a part (doesn't change it if the user has
- already overridden it).
- (format_mime_part): Wrap a blockquote around the error text (moved
- here from mail_error_write since it doesn't apply in other cases).
- (write_hr): Write a <hr> with appropriate padding between MIME
- parts.
- (write_one_text_plain_chunk): Write some plain text with
- appropriate margins.
- (handle_text_plain): Use write_one_text_plain_chunk. Update for
- inline specials handler API change.
- (fake_mime_part_from_data): Use the "fake_parts" hash to avoid
- recreating the same fake parts again if the message is
- redisplayed. Lets you toggle the shown/hiddenness of uudecode
- parts, and do the new pgp verification thing for inline pgp
- signatures.
- (try_inline_pgp): Don't do any actual PGP handling here: Just
- rewrite as a multipart/encrypted.
- (try_inline_pgp_sig): Likewise, just do a multipart/signed (with
- the x-inline-pgp-hack parameter set).
- (try_uudecoding, try_inline_binhex): Update for API changes.
- (handle_multipart_signed): Exciting and new. Use <object> to
- create a button which the user must click to do the
- verification. Change the formatting of the gpg output text a bit.
-
- * mail-display.c (on_link_clicked): Remove x-evolution-decode-pgp
- hack, which is no longer used.
- (pixbuf_gen_idle): Add a hack for the PGP verification button.
- (do_attachment_header, do_external_viewer): Split out of
- on_object_requeested for clarity.
- (do_signature): New routine to do the PGP verification button.
- (on_object_requested): Now just dispatches to
- do_attachment_header, do_external_viewer, or do_signature.
- (mail_error_write): Don't do <blockquote> here. Fixed the problem
- that was trying to fix elsewhere.
-
-2001-10-22 Dan Winship <danw@ximian.com>
-
- * mail-callbacks.c (transfer_msg): Fix these functions so they
- don't crash evolution-mail. Too bad it still crashes in the
- shell.
-
-2001-10-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (on_url_requested): Use
- mail_format_get_data_wrapper_text for text parts so we get free
- charset conversion.
-
- * mail-format.c (mail_format_get_data_wrapper_text): Renamed from
- get_data_wrapper_text and now returns a GByteArray.
- (handle_text_plain): Updated to use the new get_data_wrapper_text.
- (handle_application_pgp): Same. Wow...also fixed a mem leak and
- made a bit more efficient by doing so.
- (handle_text_enriched): Here too. Also use string->len instead of
- strlen (string->str).
- (mail_format_raw_message): Same.
-
-2001-10-22 <NotZed@Ximian.com>
-
- * mail-callbacks.c (mark_all_as_seen): Instead of select_all()
- then using the tree's selected nodes to iterate, just do it on the
- folder which keeps the current selection. Fixes #3658.
-
-2001-10-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c: Call the new move/copy_msg_cb's
-
- * mail-callbacks.c (move_msg_cb): Renamed from move_msg.
- (copy_msg_cb): Renamed from copy_msg.
- (move_msg): The bonobo-ui-component callback.
- (copy_msg): Same.
-
-2001-10-21 <NotZed@Ximian.com>
-
- * mail-vfolder.c (mail_vfolder_shutdown): Clear variables once
- done, for debugging.
- (mail_vfolder_add_uri, mail_vfolder_delete_uri): Dont do anything
- if we're shutdown (context == NULL).
-
- * component-factory.c (idle_quit): Move mail_vfolder_shutdown
- here, it should be one of the last things shutdown.
-
- * mail-format.c (handle_text_plain): Dont use (if (!p++), and then
- check p!= later, since its now 1, oops. Fixes #13106, thought it
- was a start of uuencoded stuff!
-
- * folder-browser.c (on_right_click): Escape _'s before adding them
- to menu from mailing list name, also remove some dead code that
- someone forgot to remove when refactoring. #11307.
- (folder_browser_is_drafts): Use the store's uri_cmp function to
- compare to the drafts uri's.
- (folder_browser_is_sent): Same. Slight cleanup for #11351.
-
-2001-10-21 Dan Winship <danw@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): Update for
- e_msg_composer_add_messages_attachments arg change.
- (do_forward_non_attached): Likewise.
-
-2001-10-20 Jon Trowbridge <trow@ximian.com>
-
- * mail-display.c (mail_display_new): Don't leak our
- ESearchingTokenizer.
-
-2001-10-20 Larry Ewing <lewing@ximian.com>
-
- * folder-browser-ui.c: hook up zoom functions.
-
- * mail-callbacks.h: add prototypes.
-
- * mail-callbacks.c (zoom_in): added.
- (zoom_out): added.
- (zoom_reset): added.
-
-2001-10-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (transfer_msg): Allow copy/move to/from vTrash
- folders as well.
-
- * component-factory.c (destination_folder_handle_drop): Properly
- handle local vTrash folders.
-
-2001-10-19 <NotZed@Ximian.com>
-
- * mail-account-gui.c (build_auth_menu): Dont translate camel strings.
- (mail_account_gui_setup): "
-
-2001-10-19 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (destination_folder_handle_motion): Get
- @folder_type here too [to match the changes in the
- EvolutionShellComponentDnd interface]. Also, remove a debugging
- message.
- (destination_folder_handle_drop): Likewise.
-
-2001-10-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): Update to reflect API
- changes to e_msg_composer_add_message_attachments().
- (do_forward_non_attached): Same.
- (providers_config): Oops, pass a GdkWindow instead of a GtkWindow.
-
-2001-10-19 <NotZed@Ximian.com>
-
- * mail-folder-cache.c (store_finalised): Free folders_uri.
- (real_folder_deleted): If folder is deleted, remove it from the
- hashtables.
-
-2001-10-18 <NotZed@Ximian.com>
-
- * subscribe-dialog.c (get_short_folderinfo_get): Remove the
- register/unregister, they're already done above us.
-
- * mail-vfolder.c (vfolder_adduri): Added remove flag - its not
- adduri, its removeuri, its less typing than creating a removeuri.
- (vfolder_adduri_do): Implement the remove flag.
- (mail_vfolder_remove_uri): Changed to mail_vfolder_delte_uri, to
- indicate its actually been deleted.
- (mail_vfolder_add_uri): Added remove flag.
- (rule_changed): When adding existing folders to a new rule, strdup
- the list data.
- (mail_vfolder_delete_uri): Dont do any work to remove the actual
- folder from the vfolder (we'd have to look it up first), let the
- vfolder remove it itself. Just update the rules.
-
- * mail-folder-cache.c (store_finalised): Unhook from all events
- when done.
- (mail_note_store_remove): Remove a store from being noted.
- (free_folder_info): Also if we have a folder, unhook all events.
- Also remove the uri from vfolders.
- (mail_note_folder): Remove warning about adding folders to stores
- that aren't added yet - we might actually be removing the store.
-
- * component-factory.c (mail_remove_storage): Call
- mail_note_store_remove when we remove the storage.
-
-2001-10-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (providers_config): Don't make the mail
- settings dialog modal.
-
-2001-10-17 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-account-gui.c (folder_picker_clicked): Pass the toplevel to
- `evolution_shell_client_user_select_folder()'.
- * mail-callbacks.c (transfer_msg): Likewise.
-
-2001-10-18 <NotZed@Ximian.com>
-
- * mail-send-recv.c (build_dialogue): call setup_send_data *after*
- we've setup the global dialogue thingy.
- (mail_send_receive): Instead of using static local to check for
- re-running of dialogue, use a global, setup by build_dialogue.
- These fix #12335.
- (mail_send_receive): Dont assert dialogue is realized, it might
- still be being built, so only show if it is realized.
-
-2001-10-18 Dan Winship <danw@ximian.com>
-
- * mail-mt.c (mail_call_main): Use G_VA_COPY to make this compile
- on ppc again.
- (do_call): Here too.
-
-2001-10-17 <NotZed@Ximian.com>
-
- * mail-folder-cache.c (store_folder_subscribed): Clone the
- folderinfo before passing to async event.
- (real_folder_created): Free when done.
- (store_folder_unsubscribed):
- (real_folder_deleted): And same here.
-
- * mail-ops.c (mail_expunge_folder): Use the queued thread for
- expunging folders.
-
-2001-10-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (mail_send_message): No longer need to copy the
- description now that camel-exceptions have been fixed.
-
- * subscribe-dialog.h (subscribe_dialog_show): Helper macro.
-
- * subscribe-dialog.c (subscribe_dialog_run_and_close): Removed.
-
- * mail-callbacks.c (check_send_configuration): Don't use
- gnome_dialog_run_and_close() here, we can easily get away with
- just using a gtk_widget_show().
- (providers_config): Don't use a gnome_dialog_run_and_close() here
- either. No longer need to use e_gnome_dialog utils.
- (manage_subscriptions): Don't run_and_close().
-
-2001-10-17 <NotZed@Ximian.com>
-
- * mail-callbacks.c (empty_trash): Only empty trash on enabled
- accounts, fixes #12821.
-
-2001-10-17 Dan Winship <danw@ximian.com>
-
- * mail-format.c (write_default_header): Make Reply-To bold too
- since no one ever figures out why it's not currently.
-
-2001-10-17 Iain Holmes <iain@ximian.com>
-
- * importers/evolution-mbox-importer.c: Fix the typo.
-
-2001-10-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (uid_cachename_hack): Lets put the UID cache in
- ~/evolution/mail/pop3 as this makes more sense than ~/mail/config
- does. Perform checking to see what flavor cache-path the user is
- on and compensate.
-
- * message-list.c (on_cursor_activated_idle): Check that the
- cursor_uid is non-NULL before emitting a "message_selected"
- signal. Fixes bug #6015.
-
-2001-10-16 Jon Trowbridge <trow@ximian.com>
-
- * e-searching-tokenizer.c (e_searching_tokenizer_begin): Always
- explicitly clear out the SearchInfo.
-
-2001-10-16 <NotZed@Ximian.com>
-
- * mail-folder-cache.c: Added an async_event handler to store_info.
- (mail_note_store): Setup async event handler here.
- (store_finalised): Flush out async events here.
- (folder_changed): Use async event handler to emit event.
- (mail_note_folder): Chagned, do most of the work in the calling
- context, only do the corba stuff in main.
- (store_folder_subscribed): Use async event, and do more work locally.
- (store_folder_unsubscribed): Same.
- (store_folder_deleted): Call store_folder_unsubscribed if we have
- to do any work.
- (store_folder_created): Call store_folder_subscribed if we have to
- do any work.
- (store_folder_unsubscribed): Ref store while busy.
- (real_folder_deleted): And unref here.
- (store_folder_subscribed): Reg store while busy.
- (real_folder_created): Unref here.
- (mail_note_folder): Ref folder while busy.
- (real_note_folder): And unref here.
- (mail_note_folder): Hook onto folder_deleted event.
- (folder_deleted): Just mark this folder as no longer available.
-
- * mail-session.c (register_timeout): Use mail_call_main instead of
- proxy_event.
- (remove_timeout): Same here.
-
- * folder-browser.c (folder_changed): use the new mail_async_event
- stuff.
- (folder_changed_main): Remove old async event handling stuff.
- (FOLDER_BROWSER_LOCK/UNLOCK): Removed.
- (FolderBrowserPrivate): Removed too, sigh.
- (folder_browser_set_message_preview): Return do nothing if we're
- destroyed (message_list == NULL).
- (folder_browser_search_query_changed): "
- (folder_browser_toggle_preview): "
- (folder_browser_toggle_threads): "
- (folder_browser_toggle_hide_deleted): "
- (folder_browser_set_message_display_style): "
- (folder_browser_charset_changed): " All for #12613.
-
- * mail-mt.c (mail_async_event_new, mail_async_event_emit,
- mail_async_event_destroy): New functions to handle async events.
- (mail_proxy_event, mail_proxy_event_id): Removed old functions for
- async events.
- (do_call): Add suport for MAIL_CALL_p_pp.
- (mail_msg_free): Use mail_async_event instead of proxy_event.
-
- * message-list.c (message_changed): Promote the message_changed to
- a folder_changed and use main_folder_changed to process it.
- (main_message_changed): Remove.d
- (message_list_init): Setup async event handler.
- (message_list_destroy): Remove async handler.
- (folder_changed): Use async hanler to emit event in main loop.
- (message_changed): Same.
-
- * mail-mt.c (mail_proxy_event_id): New function to return the id
- of the currently executing proxied event.
-
- * folder-browser.h: Added private field.
-
- * folder-browser.c (folder_changed): Keep track of tasks
- outstanding in the tasks list, locked access.
- (FOLDER_BROWSER_LOCK, UNLOCK): Macros to lock the folder browser
- for poking about in diff threads.
- (folder_browser_finalise): Wait for any outstanding takss to
- finish before cleaning ourself up.
- (folder_browser_destroy): Move the seen_id handling to finalise,
- also add a loading_id handling code.
- (main_folder_changed): Remove our running task when done.
-
-2001-10-15 Larry Ewing <lewing@ximian.com>
-
- * mail-display.c (mail_error_write): don't write strings longer
- than they actually are.
-
-2001-10-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (folder_browser_destroy): Remove the mark_seen
- timeout.
-
-2001-10-15 Larry Ewing <lewing@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): don't apply the body
- text in replys since we will just replace it anyway.
-
-2001-10-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (owner_unset_cb): Call
- mail_vfolder_shutdown.
-
- * mail-vfolder.c (mail_vfolder_shutdown): Unref all of our
- VFolders.
-
- * mail-folder-cache.c (real_note_folder): Remember to unref the
- folder before returning if we have already noted this folder.
-
-2001-10-15 <NotZed@Ximian.com>
-
- * mail-session.c (get_password): Proxy get-password call to main
- thread.
- (forget_password): same for forget_password.
- (get_filter_driver): and same for get_filter_driver, since it uses
- gtk objects.
-
- * mail-mt.c (mail_call_main): new generic interface for calling
- stuff/proxying in the gui thread.
-
-2001-10-14 Jon Trowbridge <trow@ximian.com>
-
- * e-searching-tokenizer.c (e_searching_tokenizer_clone): Share
- more state between the parent and its clones, so that our multiple
- tokenizers don't get out of sync when we are rendering frames and
- iframes. (Bug #11638)
-
-2001-10-13 Jon Trowbridge <trow@ximian.com>
-
- * e-searching-tokenizer.c (search_info_compare): Bad hacker!
- Don't implicitly assume that utf8 characters are one byte in size!
- (Bug #9520)
- (e_searching_tokenizer_begin): As long as I'm touching those code:
- don't increase the size of search matches. I'll fix the colors
- later. (part of bug #11589)
-
-2001-10-13 Dan Winship <danw@ximian.com>
-
- * mail-callbacks.c (create_msg_composer): Don't emit a gtk warning
- if the composer creation fails.
-
-2001-10-12 Dan Winship <danw@ximian.com>
-
- * message-list.c, message-list.h, message-list.etspec: Revert the
- change to remove the Score column until Chris can fix ETable so
- it's possible to remove a column without breaking everyone's
- exisiting settings.
-
-2001-10-12 Iain Holmes <iain@ximian.com>
-
- * importers/evolution-mbox-importer.c (load_file_fn): Don't ever create
- the folder here. Wait until the shell has created it. Otherwise we get
- loads of race conditions where the mailer can create a subfolder before
- the shell has registered the parent.
-
-2001-10-12 Chris Toshok <toshok@ximian.com>
-
- * main.c (main): call e_passwords_init and e_passwords_shutdown.
-
- * mail-session.h: add prototypes for
- mail_session_{get,add}_password.
-
- * mail-session.c (init): empty this out - we use e_passwords
- instead of a local hashtable.
- (get_password): use e_passwords_get_password and
- e_passwords_add_password.
- (forget_password): use e_passwords_forget_password.
- (mail_session_remember_password): use
- e_passwords_remember_password.
- (mail_session_forget_password): use e_passwords_forget_password.
- (mail_session_get_password): new function, use
- e_passwords_get_password.
- (mail_session_add_password): same, use e_passwords_add_password.
- (mail_session_forget_passwords): use e_passwords_forget_passwords.
-
- * mail-config.c (mail_config_write_on_exit): fix this up so it
- works as desired with the e_passwords stuff.
-
-2001-10-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (mail_error_write): Convert URLS so we can get
- clickable links.
-
- * message-list.c: Removed score stuff.
-
-2001-10-12 Jon Trowbridge <trow@ximian.com>
-
- * mail-display.c (html_button_press_event): Store our listener id.
- (popup_info_free): Disconnect our listener when we free the popup.
- (Bug #11040)
-
-2001-10-11 Jon Trowbridge <trow@ximian.com>
-
- * mail-callbacks.c (addrbook_sender): Listen for "destroy" events
- from the control, so that we don't leave stray windows laying
- around. (Bug #9101)
-
-2001-10-11 <NotZed@Ximian.com>
-
- * local-config.glade: Added a checkbox for body indexing.
-
- * mail-local.c (mail_local_reconfigure_folder): Get index_body
- widget.
- (mail_local_folder_reconfigure): Add an 'index_body' argument &
- implement. Dont do anything if nothing changed.
-
- * openpgp-utils.c (openpgp_verify): Use e_iconv_open.
-
-2001-10-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (do_forward_non_attached): Attach the message
- attachments. Fixes bug #5439.
-
-2001-10-11 Dan Winship <danw@ximian.com>
-
- * mail-folder-cache.c (update_1folder): No longer need to pass
- folder display name to storage update_folder methods.
- (setup_folder, free_folder_info): Meaning we no longer need to
- keep track of it.
-
- * evolution-outlook-importer.[ch], evolution-mbox-importer.[ch]:
- These copies are cruft. The real ones are in importers/.
-
-2001-10-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (free_storage): Make sure the
- service/storage are non-NULL.
-
- * mail-callbacks.c (e_gnome_dialog_parent_destroyed): Call
- gtk_main_quit.
- (send_receive_mail): Don't use e_gnome stuff since this doesn't
- need to be run using gnome_dialog_run_and_close().
- (composer_send_cb): Same.
- (edit_msg): Here too.
- (resend_msg): And here.
- (search_msg): Same.
- (filter_edit): Here too.
- (filter_edit): Don't use e_gnome_dialog_set_parent() because we
- don't do gnome_dialog_run_and_close on this dialog.
- (e_gnome_error_dialog_parented): Removed.
- (e_gnome_ok_dialog_parented): Removed.
-
-2001-10-10 Dan Winship <danw@ximian.com>
-
- * mail-config.c (new_source_created): Fix up the logic here.
-
-2001-10-10 Larry Ewing <lewing@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): use new function to copy
- the attachments from the source message. This still isn't perfect
- but it should avoid the problems with headers being transfered.
- This makes images in replies work again.
-
- * mail-display.c (save_url): copy the data. We can't ref the byte
- array and we can't free it so we have to copy it.
-
-2001-10-10 <NotZed@Ximian.com>
-
- * mail-ops.c (transfer_messages_transfer): IF the source and
- destination folders are the same, do nothing. Oh, and return an
- error, otherwise the shell goes and removes it anyway. Fixes a
- rather serious bug with dnd of folders onto their current
- location.
-
-2001-10-09 Larry Ewing <lewing@ximian.com>
-
- * mail-display.c (save_part): ref the part.
- (save_destroy_cb): new function to unref the part when we have
- closed the dialog.
- (save_url): fake a mime part so that we can save data urls without
- extra effort. This is less sucky than it seems since it handles
- filenames and ref counting with minimal fuss.
-
-2001-10-09 <NotZed@Ximian.com>
-
- * component-factory.c (owner_unset_cb): Disconnect from all the
- signals we were listening to, so we dont try and do shit twice on
- exit (one on unset_cb, one on destroy).
- (create_component): Setup the signal handlers using a table, so
- they're easier to disconnect on finish.
-
- * mail-folder-cache.c (folder_changed): Ref folder so it hangs
- around till we're done with it.
- (real_folder_changed): Unref folder when we are done with it.
- Should fix #11981.
-
-2001-10-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (done_message_selected): Make sure the
- mail-display is non-NULL.
-
-2001-10-09 <NotZed@Ximian.com>
-
- * mail-local.c (mlf_search_by_uids): Implement.
-
-2001-10-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-ui.c (folder_browser_ui_add_message): Create a
- chaqrset picker submenu in the View menu.
-
- * mail-format.c (mail_format_raw_message): Pass the mail-display
- to get_data_wrapper_text.
- (get_data_wrapper_text): Use the user's override charset if one is
- provided, otherwise user the user's default charset.
- (handle_text_plain): Pass along the mail-display to
- get_data_wrapper_text.
- (handle_application_pgp): Same.
- (handle_text_enriched): Here too.
- (mail_get_message_body): Pass NULL as the mail-display to
- get_data_wrapper_text since we don't have access to a
- mail-display.
-
- * mail-display.c (mail_display_set_charset): New function to set a
- charset on the maildisplay. Once set, the message is redisplayed
- using the new charset.
- (mail_display_destroy): Free the charset.
-
- * folder-browser.c (folder_browser_charset_changed): New callback
- for when a user overrides the message charset.
-
-2001-10-09 Dan Winship <danw@ximian.com>
-
- * mail-callbacks.c (e_gnome_dialog_set_parent): Use
- gtk_signal_connect_while_alive here so
- e_gnome_dialog_parent_destroyed doesn't get called on an
- already-destroyed dialog.
-
- * mail-config-druid.c (*_prepare): Record which page we're
- currently in.
- (*_changed): Only update the druid buttons if we're the current
- page. Fixes a problem that could make it impossible to get beyond
- the first page of the setup wizard.
-
- * mail-callbacks.c (mail_generate_reply): Revert the change to use
- e_msg_composer_new_with_message. That has unwanted side effects.
- (This commit re-breaks replying to HTML messages with inline
- images.)
-
-2001-10-08 Dan Winship <danw@ximian.com>
-
- * mail-local.c (mlf_set_folder, mlf_unset_folder): Update for
- folder_flags.
-
- * folder-browser-ui.c (folder_browser_ui_add_list): Check
- CAMEL_FOLDER_IS_TRASH flag rather than checking
- CAMEL_IS_VTRASH_FOLDER.
-
- * folder-browser.c (folder_browser_toggle_hide_deleted): Likewise
-
- * message-list.c (message_list_set_folder): Likewise.
- (message_list_set_hidedeleted): Remove redundant trash check.
-
-2001-10-08 Jon Trowbridge <trow@ximian.com>
-
- * mail-format.c (write_default_header): Write out the Bcc: header
- when applicable. Fixes bug #5823.
-
-2001-10-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (attachment_header): Convert the htmlinfo into
- utf8. Fixes bug #11966.
-
-2001-10-08 Dan Winship <danw@ximian.com>
-
- * component-factory.c (create_view): For mailstorage folders,
- connect to the control's "activate" signal, and don't try to
- connect to the store.
- (storage_activate): Instead, do it here, so if the connection
- fails, or the user cancels, or whatever else, he can try again
- later.
-
-2001-10-07 Dan Winship <danw@ximian.com>
-
- * mail-tools.c (mail_tool_do_movemail): Remove #ifndef
- MOVEMAIL_PATH code, since the setting of that variable has been
- meaningless for a while now, and the rest of the code DTRT whether
- that code executes or not.
-
-2001-10-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-mt.c (pass_got): Fix a merge-conflict leftover.
-
-2001-10-05 <NotZed@Ximian.com>
-
- * folder-browser.c: reformatted the menu tables so they're a bit
- more bloody readable.
-
- * mail-folder-cache.c (mail_note_store): Hook into
- subscribed/unsubscribed events. Only 'add/remove' folders from
- the add/removed events if we aren't subscribed, otherwise use the
- subscribed events. Rest of fix for #11831
-
-2001-10-05 Jon Trowbridge <trow@ximian.com>
-
- * mail-config.glade: Add toggle button to config menu to turn the
- "confirm sending unwanted HTML" dialog on/off. (Bug 10794)
-
- * mail-accounts.c (construct): Make said toggle button actually
- work.
-
-2001-10-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (e_gnome_dialog_set_parent): New convenience
- function that not only sets the gnome-dialog's parent window but
- also makes sure that the gnome-dialog closes when it's parent
- closes.
- (e_gnome_warning_dialog_parented): New conmvenience wrapper around
- the libgnomeui version that also does the same thing as
- e_gnome_dialog_set_parent.
- (e_gnome_error_dialog_parented): Same.
- (e_gnome_ok_dialog_parented): And again...
- (e_gnome_ok_cancel_dialog_parented): And once again.
-
-2001-10-05 Larry Ewing <lewing@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): use
- e_msg_composer_new_with_message rather than e_msg_composer_new.
- This way we bring in all the attachment of the message we are
- replying to.
-
-2001-10-05 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.c (message_list_setup_etree): Turn on
- "uniform_row_height" argument.
-
-2001-10-04 <NotZed@Ximian.com>
-
- * folder-browser.c (update_status_bar): Show "nn sent" as total in
- sent folder, rather than just 'total'.
-
- * mail-folder-cache.c (update_1folder): Also show total message
- count for sent_folder.
-
- * folder-browser-ui.c (folder_browser_setup_property_menu): Do a
- better job of setting up the name. Also de-sensitise when we
- can't configure the folder.
-
-2001-10-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (providers_config): Set the parent window as
- the fb. This fixes bug #11723.
- (filter_edit): Do the same thing here too and also to the warning
- dialog.
- (edit_msg): Set the parent on the warning dialog.
- (resend_msg): And here.
- (search_msg): Here too.
- (confirm_expunge): Set the parent window on the dialog here too.
- (save_msg_ok): Same here.
-
- * mail-accounts.c (images_radio_toggled): Ignore the signal if the
- radio button is not "on". This fixes bug #10532 because the on/off
- signals don't always come in the off->on order.
-
- * mail-ops.c (mail_send_message): Reduced some redundancy.
-
-2001-10-04 Dan Winship <danw@ximian.com>
-
- * mail-format.c (write_address): Fix so that an email address with
- no name is once again just "foo@bar.com", not "<foo@bar.com>".
-
-2001-10-04 Iain Holmes <iain@ximian.com>
-
- * importers/evolution-mbox-importer.c (load_file_fn): Only pass
- CAMEL_STORE_FOLDER_CREATE when the shell will be creating the
- folder.
-
-2001-10-04 <NotZed@Ximian.com>
-
- * mail-callbacks.c (configure_folder): If we're accessing a
- vfolder uri, then popup the vfolder editor instead of trying the
- mail local one.
-
- * mail-vfolder.c (vfolder_edit_rule): Edit a vfolder by name.
-
-2001-10-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_save): Added some more NULL
- checks.
-
-2001-10-04 <NotZed@Ximian.com>
-
- * component-factory.c (storage_remove_folder): Do the url
- fragment/path -> folder name hack. Removing vfolders from shell
- works now?
-
-2001-10-03 <NotZed@Ximian.com>
-
- * mail-send-recv.c (build_dialogue): Only build destination data
- if we have destination != NULL. Fixes crash of bug #10835.
-
- * folder-browser.c (folder_browser_config_search): Set 'to' ->
- 'recipient' data for search object. #6199.
-
- * mail-local.c (local_storage_new_folder_cb): Handle vtrash case,
- emit 'folder_created' event for the folder-cache to work, etc.
-
-2001-10-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (mail_write_authenticity): Don't use the wax-seal
- icons for the pgp stuff anymore, use Jimmac's new icons instead.
-
-2001-10-03 <NotZed@Ximian.com>
-
- * mail-folder-cache.c (folder_changed): Dont wait for event to
- finish before returning. This could however mean we process it
- after things have vanished below us? Fixes another case of ctrl-d
- deadlock.
-
- * folder-browser.c (update_status_bar): If we have hide deleted
- set, then dont count deleted messages in the 'total' messages
- count. Fixes #6591.
-
- * mail-ops.c (add_vtrash_info): If we have a fragment, override
- that, rather than the path. Fixes #5251.
- (remove_folder_get): Freeze/thaw around deleting all messages in
- folder.
-
-2001-10-03 Rodrigo Moya <rodrigo@ximian.com>
-
- * importers/Makefile.am: add $BONOBO_GNOME_CFLAGS to make it work
- with latest Bonobo
-
-2001-10-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (transfer_msg): Pass an empty flags argument to
- mail_transfer_messages - destination folder should already be
- created by this point.
-
- * folder-browser.c (message_list_drag_data_received): Pass an
- empty flags argument to mail_transfer_messages.
- (selection_received): Same.
-
- * component-factory.c (xfer_folder): Pass the CREATE flag to
- mail_transfer_messages() so that the dest folder gets created.
- (destination_folder_handle_drop): Update for mail-ops API change.
-
- * mail-ops.c (mail_transfer_messages): Now takes a dest_flags
- argument that it passes along to mail_tool_uri_to_folder when
- opening the destination folder.
-
-2001-10-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-vfolder.c (vfolder_setup_do): Pass an empty flags argument
- to mail_tool_uri_to_folder.
- (vfolder_adduri_do): Same.
-
- * mail-session.c (get_folder): Pass an empty flags argument to
- mail_tool_uri_to_folder.
-
- * mail-send-recv.c (receive_get_folder): Pass an empty flags
- argument to mail_tool_uri_to_folder.
-
- * mail-ops.c (get_folder_get): Pass the flags to
- mail_tool_uri_to_folder.
- (mail_get_folder): Now takes a flags argument.
- (remove_folder_get): Pass an empty flags argument to
- mail_tool_uri_to_folder.
- (mail_send_message): Pass an empty argument flag to
- mail_tool_uri_to_folder.
- (transfer_messages_transfer): Same. Destination folder should
- already be created by this time.
-
- * folder-info.c (do_get_info): Pass an empty flags argument to
- mail_tool_uri_to_folder.
-
- * importers/evolution-mbox-importer.c (folder_created_cb): Pass
- the CREATE flag here too.
- (load_file_fn): And here.
- (load_file_fn): And here too.
-
- * importers/evolution-outlook-importer.c (load_file_fn): Pass the
- CREATE flag to mail_tool_uri_to_folder.
-
- * folder-browser.c (folder_browser_new): Pass an empty flags
- argument.
- (x_evolution_message_parse): Pass an empty flags argument to
- mail_tool_uri_to_folder.
-
- * component-factory.c (create_folder): Pass a CREATE flag to
- mail_get_folder here too.
- (owner_set_cb): And here.
- (xfer_folder): Shouldn't need the CREATE flag here, so not passing
- any flags.
- (destination_folder_handle_drop): Same.
-
- * mail-local.c (mail_local_store_add_folder): Pass a CREATE flag
- to mail_get_folder.
- (reconfigure_folder_reconfigure): Pass an empty flags argument to
- mail_tool_uri_to_folder.
-
- * mail-tools.c (mail_tool_uri_to_folder): Take a flags argument.
- (mail_tool_get_local_inbox): Pass an empty flags argument to
- mail_tool_uri_to_folder.
-
-2001-10-02 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-account-gui.c (launch_signature_editor): Use
- `bonobo_ui_component_new_default()', not
- `bonobo_ui_component_new()'.
-
-2001-10-01 Jon Trowbridge <trow@ximian.com>
-
- * mail-display.c (on_url_requested): Make sure we aren't dealing
- with a pathological message w/o a From: header.
- (ebook_callback): Properly check that the address we queried
- matches the address on the current message. (Bug #10038)
-
-2001-10-01 Iain Holmes <iain@ximian.com>
-
- * component-factory.c (component_factory_init): Check for errors.
-
- * mail.h: Change prototype for evolution_folder_info_factory_init.
-
- * folder-info.c (evolution_folder_info_factory_init): Return TRUE
- or FALSE.
-
- * mail-config.c (evolution_mail_config_factory_init): Return TRUE or
- FALSE.
-
- * mail-config.h: Change prototype for above.
-
-2001-10-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-vfolder.c (mail_vfolder_remove_uri): replace my_list_find()
- == NULL with my_list_find() != NULL.
-
-2001-10-01 Dan Winship <danw@ximian.com>
-
- * component-factory.c (mail_load_storage_by_uri): create storages
- for providers that are STORAGE and aren't EXTERNAL, rather than
- "(STORAGE and REMOTE) or spool, maildir, or vfolder".
- (mail_remove_storage_by_uri): Use the same rule here (which makes
- it possible now to remove maildir and spool stores now, which
- weren't properly special-cased before). Remove some CamelException
- misuse.
-
- * mail-config.c (new_source_created): Fix up the broken INBOX-
- shortcut-generating assumption a little by only assuming that if
- you call camel_store_get_inbox(), that its full_name is the same
- as its path. (This happens to always be true for inboxes now, and
- will be always true by definition at some point in the future.)
- Now maildir stores get working Inbox shortcuts.
-
- * mail-send-recv.c (get_receive_type): If PROVIDER_IS_STORAGE
- then use SEND_UPDATE, if not, use SEND_RECEIVE.
-
- * mail-local.c (local_provider): The local provider is EXTERNAL.
- (The shell creates it.)
- (mail_local_reconfigure_folder): Allow reconfiguring between
- IS_LOCAL providers.
-
- * mail-accounts.c (news_delete): Don't need to check the provider
- flags here... we know nntp is a STORAGE.
-
-2001-10-01 Dan Winship <danw@ximian.com>
-
- * mail-local.c (mail_local_reconfigure_folder): Don't use
- mail_tool_get_folder_name here since that function only existed to
- be clever in a certain case that this is not.
- (reconfigure_folder_free): Remove the dialog from the hash table
- here so that it gets removed in the successfully-reconfigured case
- too. Don't unref folder_out if it never got set.
- (reconfigure_clicked): Remove the hash table code from here; it's
- in reconfigure_folder_free now.
-
- * mail-tools.c (mail_tool_get_folder_name): No longer used by
- anything.
- (mail_tool_get_folder_from_urlname): Also not used anywhere.
-
-2001-10-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-tools.c (mail_tool_uri_to_folder): Don't pass the CREATE
- flag, we shouldn't ever need this...
-
-2001-10-01 Larry Ewing <lewing@ximian.com>
-
- * mail-identify.c (mail_identify_mime_part): if gnome-vfs returns
- application/octet-stream with the magic check, use the filename
- check instead since it at least has a chance of being useful.
-
-2001-09-28 Dan Winship <danw@ximian.com>
-
- * folder-browser-ui.c (fbui_sensitize_timeout): wrap a
- bonobo_ui_component_freeze/thaw around all of the set_props so
- they all update at once.
-
-2001-09-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (construct): Don't create checkboxes for global
- Threaded or Preview options as they are now removed.
-
-2001-09-28 <NotZed@Ximian.com>
-
- * component-factory.c (owner_set_cb): Setup vfolder storage before
- all others.
-
- * mail-local.c (mail_local_store_remove_folder): Emit
- folder_deleted event.
- (remove_find_path): Fix, compare against path, not full_name.
-
- * mail-tools.c (mail_tool_uri_to_folder): Dont
- vfolder_register_source anymore.
-
- * mail-vfolder.c (rule_changed): Changed to access
- mail_fodler_cahce to find out if the folder exist yet before
- trying to open them, also use the cache as a cache so we dont have
- to open the folder if its already been opened.
- (vfolder_register_source, register_source): Removed.
- (source_finalise): Removed,
- (check_source): Removed. All handled through diff mechanism.
- (mail_vfolder_add_uri): New function, records uri's of available
- folders, and adds them to any active vfolders if required.
- (mail_vfolder_remove_uri): New function, removes a uri from
- available folders, and checks any rules to see fi they need
- updating.
- (vfolder_adduri): New async function to add a uri to all vfolders
- that need it.
- (store_folder_deleted): oops! free user, not rule!!
-
- * mail-folder-cache.c: Add uri->folderinfo hashtable, and the
- store from which they come into the store info struct.
- Add uri to the folder_info.
- (setup_folder): Store the uri in the folderinfo.
- (setup_folder): And the uri in the folder_uri hashtable.
- (mail_note_store): Store the store in the storeinfo, and setup the
- folders_uri hashtable via the store's hash functions.
- (setup_folder): Call mail_vfolder_add_uri to note this newly setup
- folder uri.
- (store_folder_deleted): Proxy call to main thread.
- (real_folder_deleted): And tell the vfolder to remove this uri
- from its folder list.
- (setup_folder): Dont call vfolder_add_uri if noselect is set on
- the uri.
-
-2001-09-27 <NotZed@Ximian.com>
-
- * mail-vfolder.c: Removed vfolder_info struct, vfolder_storage.
- Neither used anymore.
-
-2001-09-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_get_account_by_transport_url): Use
- Camel to compare the urls rather than using e_url_equal which does
- all sorts of funky shit that may not work in every case.
-
-2001-09-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-local.c (mail_local_provider_init): Setup the url_hash and
- url_equal functions for the local provider.
-
- * mail-account-gui.c (mail_account_gui_save): Add code here to
- check to make sure that the Drafts and Sent folders are pointing
- to valid urls. This is kinda nasty and only really solves the case
- where the user changes, say, his imap server or
- something. Unfortunately we still have the problem where if
- account A's sent/drafts folders point to account B's store and the
- user changes the url for account B.
-
- * mail-config.c (mail_config_get_account_by_source_url): Use Camel
- to compare the urls rather than using e_url_equal which does all
- sorts of funky shit that may not work in every case.
-
-2001-09-28 Dan Winship <danw@ximian.com>
-
- * mail-mt.c (pass_got): Don't call
- mail_config_service_set_save_passwd if we didn't find a service.
-
-2001-09-27 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-config.c (add_shortcut_entry): Just add the shortcut to the
- first group.
-
-2001-09-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-ui.c (folder_browser_ui_add_list): Call
- folder_browser_toggle_threads() here after setting the value. This
- should fix bug #6415 and if it doesn't, then this whole deal is
- just a lost cause.
-
- * mail-mt.h: Added mail_msg_cleanup() prototype.
-
-2001-09-28 Dan Winship <danw@ximian.com>
-
- * mail-format.c (get_data_wrapper_text): Deal with
- camel_mime_filter_charset_new_convert returning NULL. (Every other
- call to it does, and something's wrong with iconv on the Sun right
- now so it keeps failing.)
-
-2001-09-27 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-mt.c (do_user_message): Always make the Cancel button the
- last one.
-
-2001-09-27 <NotZed@Ximian.com>
-
- * mail-folder-cache.c (real_note_folder): No such event finalized!
- Its finalize.
- (mail_note_store): "
-
- Fixed dan's comment a bit, info != NULL for folder_created, info==
- NULL for changed.
-
-2001-09-26 <NotZed@Ximian.com>
-
- * mail-local.c (mlf_set_message_flags): Proxy the
- set_message_flags call too. Doesn't fix the 'local folder counts
- dont update' problem, but its more correct.
-
-2001-09-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-session.c (mail_session_remember_password): Perform a
- NULL-check. Hopefully fixes bug #7874.
-
-2001-09-27 Dan Winship <danw@ximian.com>
-
- * mail-offline-handler.c (service_is_relevant): A service needs to
- be disconnected if it's remote, not already offline, and either
- connected OR connecting.
- (storage_go_offline): Don't put non-relevant stores offline. (Eg,
- don't force an IMAP store which you hadn't already connected to to
- connect and sync.)
- (storage_go_online): Likewise, don't "reconnect" stores that
- weren't connected before.
-
- * mail-ops.c (set_offline_desc): Fix the message to say
- "reconnecting" instead of "disconnecting" when appropriate.
- (mail_store_set_offline): If offline is TRUE, call
- camel_service_cancel_connect on the store. (We do this here
- because we don't want the cancel_connect request to get queued up
- behind a hanging connection attempt.)
-
-2001-09-26 Anna Marie Dirks <anna@ximian.com>
-
- * mail-config.glade: Added a "Description:" label and moved
- the source_description and transport_description labels to
- a more appropriate place.
-
-2001-09-26 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.c (mlfe_callback): Check for the root node here.
- Fixes Ximian bug #11029.
-
-2001-09-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-mt.c (do_get_pass): Change the wording of the password
- dialog if we are getting a pgp passphrase so that users don't
- misinterpret it to mean saving the passphrase forever.
-
-2001-09-26 Jon Trowbridge <trow@ximian.com>
-
- * mail-callbacks.c (composer_get_message): strdup our "This
- message contains invalid recipients" string, since it gets freed
- later. And then don't leak the message string. (Bug #10877)
-
- * mail-format.c (write_address): Use camel_address_format,
- not camel_address_encode.
-
- * mail-display.c (html_button_press_event): Decode our URL before
- extracting the address to pop up contact info.
-
- * mail-format.c (write_address): When writing out a mailto: link,
- make sure we construct a valid URL w/ correct encoding. Make sure
- our address is properly quoted, if necessary.
-
-2001-09-26 Dan Winship <danw@ximian.com>
-
- * mail-folder-cache.c: Add a big comment explaining unread message
- counts so no one can mess them up again in the future. :-)
- (update_1folder): If info->unread_message_count is -1, don't do
- anything.
-
- * component-factory.c (component_factory_init): warn and exit if
- oaf_active_server_register returns OAF_REG_ALREADY_ACTIVE.
-
-2001-09-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (config_read): Oops, translate the fake account
- name to UTF-8.
-
-2001-09-26 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.c (message_list_foreach): Use
- e_tree_selected_path_foreach instead of
- e_tree_selected_row_foreach here.
-
-2001-09-27 Michael Meeks <michael@ximian.com>
-
- * mail-config.c (mail_config_init): report the
- exception on failure and abort quickly instead of hitting
- a strange assert later.
-
-2001-09-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (decode_pgp): Update to not send the
- remember-passphrase option to the context, it doesn't need it
- anymore.
- (try_inline_pgp_sig): Same.
-
- * mail-accounts.c (construct): The remember-passphrase option is
- no longer there. This can now be set on the passphrase prompt
- dialog.
- (construct): Add confirm expunge options.
-
- * mail-config.c (config_read): We no longer read-in the
- remember-passphrase state because we no longer need it.
- (mail_config_write_on_exit): We no longer save it either.
- (mail_config_get_remember_pgp_passphrase): Removed.
- (mail_config_set_remember_pgp_passphrase): Removed.
-
- * mail-crypto.c (mail_crypto_pgp_mime_part_sign): No longer do we
- need to send the remember passphrase state to the pgp context.
- (mail_crypto_pgp_mime_part_verify): Same.
- (mail_crypto_pgp_mime_part_encrypt): Here too.
- (mail_crypto_pgp_mime_part_decrypt): And here.
-
-2001-09-25 Ettore Perazzoli <ettore@ximian.com>
-
- [Patch for Automake 1.5 compatibility pointed out by Richard
- Boulton <richard@tartarus.org>, as per #9258.]
-
- * Makefile.am (CLEANFILES): Assign directly, not with `+='.
-
-2001-09-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-folder-cache.c (update_1folder): The folder-info needs to
- take priority over the folder because of the way IMAP works (which
- is that it doesn't actually update the folders until you SELECT
- them and so when you do get_folder_info(), it doesn't actually
- SELECT the folders, it just STATUS's them).
-
-2001-09-25 <NotZed@Ximian.com>
-
- * folder-browser.c (folder_browser_destroy): Deal with destroy vs
- finalise semantics. Only destroy widgets here.
- (folder_browser_finalise): object finalise function, actually
- unref/free all other objects here.
- (folder_browser_class_init): Init the finalise hook.
- (got_folder): Check if message_list == NULL -> we've been
- destroyed before the thread got a chance to finish loading the
- folder.
- (folder_browser_is_drafts): Dont use a g_return_if_fail to return
- in what could be a valid state of the object.
- (folder_browser_is_sent): Likewise.
- (folder_browser_copy): Do nothing if message_list == NULL.
-
- * main.c (main): call mail_msg_cleanup() before leaving threads.
-
- * component-factory.c (owner_unset_cb): Wait for all outstanding
- operations to finish before setting up to quit.
- (idle_quit): Wait for all outstanding ops to finish before
- cleanup.
- (unref_standard_folders): NULL out the standard folder before
- unreffing it.
-
- * mail-mt.c (mail_msg_wait_all): New function to wait for all
- outstanding thread operations.
- (mail_msg_cleanup): Destroy the io channels before we're
- finished. Also wait for all outstanding threads first. Made
- public.
- (mail_msg_init): Dont call mail_msg_cleanup atexit automatically.
-
-
-2001-09-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (get_data_wrapper_text): If the data wrapper
- contains raw text, treat the contents as if they were in the
- user's default charset and convert them to UTF-8.
-
- * component-factory.c (owner_set_cb): Throw up a warning dialog if
- we suspect the config database is corrupt.
-
- * mail-config.c (config_read): If the account name is NULL, then
- we have a corrupt config database most likely - so generate a fake
- account name and set the corrupt but to TRUE.
- (mail_config_is_corrupt): New function to find out if the config
- is suspected of being corrupted.
-
-2001-09-25 Iain Holmes <iain@ximian.com>
-
- * mail-config.c (impl_GNOME_Evolution_MailConfig_addAccount):
- Check if the transport is NULL.
-
-2001-09-25 Iain Holmes <iain@ximian.com>
-
- * mail-display.c (link_menu): Remove the Save Link as (FIXME)
- item.
-
-2001-09-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-mt.c (pass_got): Only cache the password for the service if
- it has an entry in the account database. Fixes bug #10875.
-
-2001-09-24 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.c (filter_date): Use e_strftime_fix_am_pm instead
- of strftime.
-
-2001-09-24 <NotZed@Ximian.com>
-
- * mail-local.c (mls_get_folder): Removed unused variables.
-
- * component-factory.c (storage_create_folder): Remove unused
- variable.
-
- * mail-format.c (write_default_header): Used to write a header
- that we know about/normally print. Use a static header table to
- index these.
- (write_header): removed.
- (default_header_index): Return the index of the default header.
- (write_headers): Changed the way it writes headers a bit. Use
- write_default_header or write_text_header directly. Also try and
- use the header charset as a fallback if the header can't be
- decoded using the locale charset.
-
-2001-09-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-mt.c (pass_got): Always cache POP and IMAP passwords, even
- if the user didn't tell us to. Fixes bug #10569.
-
-2001-09-21 <NotZed@Ximian.com>
-
- * mail-mt.c (mail_msg_check_error): If we have an operation that
- failed before, dont show the dialogue for the the new error. Also
- use gtk_widget_show rather than invoking another main loop. Fix
- for lazy people who like to leave their mailers running and go
- home.
-
-2001-09-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (mail_send_message): Use the mail-tools convenience
- functions to remove and restore the X-Evolution headers.
- (mail_update_subfolders): Removed.
-
-2001-09-21 <NotZed@Ximian.com>
-
- * mail-callbacks.c (mail_storage_create_folder, folder_created,
- create_folders): All made redundant by new mail-folder-cache
- code.
- (delete_folders, folder_deleted): Uh, code that isn't used
- anywhere. Removed.
-
- * component-factory.c (storage_create_folder): Dont call
- folder_created, let the folder_created event handle the update.
-
- * mail-local.c (mail_local_store_add_folder): Use url path as
- full_name, not shell path.
- (mail_local_folder_construct): Remove path argument, and use the
- full_name instead.
- (mls_get_folder): Dont lookup folderinfo in cache. Like duh the
- shell hasn't told me its there yet, smaaaart.
-
- * mail-folder-cache.c (mail_note_store): Take a new argument
- 'done' that can callback when complete. Fixed callers
- appropriately.
-
- * mail-ops.c (mail_update_subfolders): Removed. Isn't used
- anymore.
- (mail_scan_subfolders): Remove, no longer used.
-
- * mail-send-recv.c (receive_update_got_store): Remove call to
- mail_update_subfolders.
-
-2001-09-20 <NotZed@Ximian.com>
-
- * mail-vfolder.c (check_source): Dont let drafts/outbox/sent be
- added via a generic 'all local folders' rule.
-
- * component-factory.c (got_folder): trigger a folder changed
- event, so the folderinfocache stuff has a chance to see if this is
- the outbox_folder or not.
-
- * mail-folder-cache.c (update_1folder): If we have -1 unread
- count, pass that as 0 to the shell so it doesn't go bolding.
- (setup_folder): Same.
-
-2001-09-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_save): Only add the account
- if it doesn't already exist in the config db.
-
- * mail-config.c (mail_config_find_account): New convenience
- function.
-
- * mail-config-druid.c (wizard_finish_cb): Do not add the account
- here as this is taken care of in mail_account_gui_save() since it
- has to be able to set the default account.
-
- * mail-config.c (mail_config_set_default_account): Don't allow the
- index to become invalid.
-
- * mail-account-gui.c (mail_account_gui_save): Add the account
- before setting it as the default.
-
-2001-09-20 <NotZed@Ximian.com>
-
- * folder-browser.c (folder_browser_set_shell_view): Update the
- status bar here, assuming we've just been activated.
-
- * mail-ops.c (add_vtrash_info): Scan whole list, rather than
- missing the last one. Also dont assume its always the last,
- otherwise we could lose following folders.
-
-2001-09-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-tools.c (mail_tool_uri_to_folder): Don't "note" the folder
- if we failed to get it.
-
-2001-09-20 Iain Holmes <iain@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_new): Set the sensitivity
- of the edit buttons correctly.
-
-2001-09-20 <NotZed@Ximian.com>
-
- * mail-vfolder.c (vfolder_register_source): Lock around
- hashtable/list manipulation. Also dont try scan vfolder_hash if
- it hasn't been setup yet.
- (source_finalise): Lock around list access.
- (rule_changed): Lock around hash access.
- (context_rule_added): Lock around hash access.
- (context_rule_removed): "
- (rule_changed): Lock around list access.
- (all): d(x) out debug printfs
-
- * mail-local.c (storage_listener_startup): Fix for api change.
- (local_storage_new_folder_cb): Dont skip over leading / in path.
- (local_storage_removed_folder_cb): ditto.
-
- * mail-folder-cache.c (create_folders): No longer pass prefix
- between recursive calls - we have the path in the folderinfo.
- (setup_folder): No longer take path arg, we get it from
- folderinfo.
- (mail_note_folder): No longer take path arg, we use
- folder->full_name to key the folder table.
- (mail_note_store): Consolidate note_store interface, pass storage
- or corba_storage to it.
- (mail_note_local_store): Removed.
- (update_1folder): If its a vtrash folder, or the outbox_folder,
- and we have a folder, then make the 'count' the total message
- count, not unread messages count.
-
-2001-09-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-local.c (mail_local_store_add_folder): Set the folder info
- path.
-
-2001-09-20 <NotZed@Ximian.com>
-
- * mail-tools.c (mail_tool_uri_to_folder): Register vfolder sources
- here.
-
- * folder-browser.c (got_folder): Dont register vfolder sources
- here.
-
- * mail-ops.c (mail_get_folder): Add thread parameter. Fix callers.
- (add_unmatched_info): Scan for unmatched name and re-title.
-
- * mail-vfolder.c (vfolder_setup): Use the 'slow' queue for setting
- up vfolders.
-
- * mail-mt.c (mail_msg_init): Limit the maximum number of threads
- on the 'new' thread to 10.
- (mail_msg_init): Create a new queue 'slow' for doing slow
- operations.
-
-2001-09-20 Iain Holmes <iain@ximian.com>
-
- * mail-display.c (mail_error_write): Add a <blockquote> to make
- the error message look better.
-
-2001-09-20 <NotZed@Ximian.com>
-
- * mail-tools.c (mail_tool_uri_to_folder): Dont special case file:
- url's anymore.
-
- * mail-local.c: Add real_path to MailLocalFolder.
- (mail_local_folder_construct): Added path argument, setup
- full_name == path, and real_path == full_name.
- (mls_get_folder): First lookup folderinfo to confirm this folder
- exists, then use that to properly construct the folder paths.
- (mail_local_folder_reconfigure): Use real_path not full_name to
- create the store uri.
- (mlf_set_folder): Use real_path not folder_name to get real uri
- path.
-
-2001-09-19 <NotZed@Ximian.com>
-
- * mail-folder-cache.c (setup_store): Use the wrong spelling of
- finalised for the event hook.
- (real_note_folder): Use the wrong spelling of finalised for the
- event hook.
- (free_folder_info): Free the full_name parameter.
- (setup_folder):
- (real_note_folder): Key the folderinfo table on full_name, not
- path.
-
-2001-09-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (save_messages_save): Convert all textual parts to
- 8bit before saving. Fixes bug #10388.
-
- * mail-callbacks.c (ask_confirm_for_unwanted_html_mail): Oops,
- don't free memory that we don't own.
-
-2001-09-20 Dan Winship <danw@ximian.com>
-
- * mail-config.c (evolution_mail_config_factory_init): No need to
- have g_warnings here. If it's done properly, therapeutically,
- there's no danger involved.
-
-2001-09-19 Jon Trowbridge <trow@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): Truncate extremely long
- subjects. (inspired by bug #9158)
-
- * mail-tools.c (mail_tool_generate_forward_subject): Truncate
- extremely long subjects. (bug #9158)
-
-2001-09-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-send-recv.c (receive_update_got_store): Here too.
-
- * component-factory.c (create_view): Call mail_note_store()
- instead of mail_scan_subfolders() here so that these folders get
- hooked up with the unread count code.
-
-2001-09-12 Iain Holmes <iain@ximian.com>
-
- * importers/evolution-mbox-importer.c (load_file_fn): Fix memory
- leak.
-
-2001-09-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (ask_confirm_for_unwanted_html_mail): Convert
- the names to the locale charset.
-
-2001-09-19 Dan Winship <danw@ximian.com>
-
- * mail-callbacks.c (create_folders): Pass the actual unread
- message count, not just whether or not it's > 0. Fixes ximian
- 9089.
-
-2001-09-19 <NotZed@Ximian.com>
-
- * component-factory.c: Added missing header.
-
- * mail-local.c (mail_local_store_add_folder): Async load the
- folder we just added, so it can update the folder counts in the
- display. We just discard the folder afterwards?
-
- * mail-ops.c (mail_get_folder): Use the queued thread to get
- folders.
-
- * General cleanup of mail debug printfs.
-
- * mail-folder-cache.[ch]: Completely rewritten. Removed all calls
- to the old code everywhere they were used. Nuff said.
-
- * folder-browser.h: Add shell_view to folder_browser & api to set
- it.
-
- * folder-browser-factory.c (control_activate): Set the shell-view
- on the folder_browser.
- (control_deactivate): And clear it here.
-
- * folder-browser.c (folder_browser_destroy): Unhook from changed
- events on the folder before giving it away.
- (got_folder): Hook onto the folder-changed events.
- (folder_changed): Event hook proxy for folder_changed events
- (main_folder_changed): And the main code version.
- (update_status_bar): And the one that actually does the work.
- (on_selection_changed): Also call update_status_bar() to update
- the selection count.
- (folder_browser_set_shell_view): Implement function to set the
- shell_view on the folder_browser.
- (folder_browser_destroy): Release the shell_view here too.
-
- * mail-tools.c (mail_tool_uri_to_folder): Dont 'note' the new
- folder if its from a file: url, this is handled by hte local store
- (yeeruughck).
-
- * mail-local.c (mls_init):
- (free_info):
- (mls_finalise): Setup init/finalise funcs for the folderinfo hash.
- (local_storage_removed_folder_cb): re-enable.
-
-2001-09-18 <NotZed@Ximian.com>
-
- * mail-local.c (MailLocalStore): Add a hash table to store
- uri<>folderinfo data.
- (mail_local_store_add_folder): Add a new folderinfo to our hash.
- (mail_local_store_remove_folder): Remove a folder by uri.
- (storage_listener_startup): Add this store to those monitored by
- the folder tree.
-
-2001-09-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-mt.c (do_get_pass): Make the title translatable, and also
- use the account name when possible. Sorta fixes bug #6277.
-
-2001-09-17 <NotZed@Ximian.com>
-
- * mail-send-recv.c (get_receive_type): Function to get the real
- receive tpe for ag iven url. IMAP/SPOOL/MAILDIR types just update
- their info, dont download.
- (build_dialogue):
- (mail_receive_uri): Use function above to get the right receive
- type.
-
-2001-09-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-tools.c (mail_tool_remove_xevolution_headers): Oops, forgot
- about X-Evolution-Format.
- (mail_tool_restore_xevolution_headers): Same.
-
-2001-09-18 Dan Winship <danw@ximian.com>
-
- * folder-browser.c (folder_browser_set_uri): Merged into
- folder_browser_new: nothing ever changes the URI of an existing
- folder browser any more.
- (folder_browser_new): Make this take a uri argument and do the
- work folder_browser_set_uri used to do, except that we set fb->uri
- right away, so that if the folder browser's control is activated
- before got_folder() gets called, then folder_browser_ui_add_list()
- will have access to the correct uri for purposes of setting
- ViewThreaded, etc. Fixes #4913.
- (got_folder): Don't set fb->uri here since it will already have
- been set. Don't call message_list_set_threaded, since it should be
- a noop now (and if it's not, it would make the message list not
- match the menu item).
-
- * folder-browser-ui.c (folder_browser_ui_add_list): Remove some
- code that was failing to work around the problems above.
-
- * message-browser.c (message_browser_new): Pass uri to
- folder_browser_new, remove call to set_uri.
-
- * folder-browser-factory.c (folder_browser_factory_new_control):
- Likewise. Also fix a s/destroy/unref/ in an error cleanup.
-
-2001-09-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-session.c (get_password): Pass a 'cache-me' argument to
- mail_get_password.
-
- * mail-mt.c (pass_got): Make less confusing...
- (mail_get_password): Now takes an argument 'cache' that allows our
- caller to determine if the user wanted to cache his/her password
- or not.
- (pass_got): Set the cache option.
-
-2001-09-18 Dan Winship <danw@ximian.com>
-
- * mail-format.c (mail_format_raw_message): Call
- mail_content_loaded here rather than blocking if the message data
- isn't available.
-
-2001-09-17 <NotZed@Ximian.com>
-
- * mail-ops.c (mail_get_folderinfo): Get folderinfo 1 at a time
- rather than all at once.
-
-2001-09-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (storage_remove_folder): Unsubscribe from
- the folder before deleting it. Also, use the url's path instead of
- the shell's path since IMAP doesn't necessarily have to use "/" as
- the dir sep.
-
- * mail-ops.c (remove_folder_get): If the store supports
- subscriptions, make sure to unsubscribe from the folder before
- deleting it.
-
-2001-09-17 <NotZed@Ximian.com>
-
- * mail-local.c (storage_listener_startup): Setup global
- corba_storage variable.
- (mls_get_folder): Set 'update lstorage' on the newly opened
- folder.
-
-2001-09-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (invisible_selection_get_callback): Do nothing if
- the selection is NULL? Maybe this is the cause of bug #6817.
-
- * mail-config.c (mail_config_folder_to_cachename): Go back to
- generating the cachename ourselves, but continue doing it the way
- the dfault implementation of camel_folder_get_uri worked.
-
-2001-09-16 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.c (ml_get_node_by_id): Made save_id const here.
-
-2001-09-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (pixbuf_gen_idle): Don;t destroy the pixbuf
- loader, unref it instead.
-
- * mail-config.c (mail_config_folder_to_cachename): Use
- camel_folder_get_uri().
-
-2001-09-15 <NotZed@Ximian.com>
-
- * mail-vfolder.c: Major rewrite of most of the guts, handle
- changes based on signals and events, etc. Use the main storage
- handling code that imap uses, etc.
-
- * mail-tools.c (mail_tool_uri_to_folder): Dont special case
- vfolder: anymore.
-
- * component-factory.c (owner_set_cb): use vfolder_load_storage(),
- new function to setup vfolder storage, after interaction has been
- enabled only. This might need some tweaking ...
- (storage_remove_folder): Removed all the folder lookup stuff.
- Just delete the folder based on the path passed in. There should
- be no reason this wouldn't work, right?
-
-2001-09-14 <NotZed@Ximian.com>
-
- * mail-ops.c (get_folderinfo_get): Only add vtrash folder info, if
- store supports vtrash.
-
- * component-factory.c (mail_load_storage_by_uri): Let 'vfolder'
- stores show up too.
-
-2001-09-13 <NotZed@Ximian.com>
-
- * mail-vfolder.c (vfolder_uri_to_folder): Open a vfolder then set
- its expression, since name?query open method is removed.
-
-2001-09-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * subscribe-dialog.c (fe_root_value_at): Return the cached value
- of camel_service_get_name so that we don't leak memory.
- (fe_real_value_at): Don't strdup the node's name.
- (folder_etree_construct): Set the service_name.
- (fe_destroy): Free the service_name.
-
- * mail-ops.c (add_vtrash_info): Free the temporary path variable
- here.
-
- * subscribe-dialog.c (store_data_new): Added a refcount variable
- so set the refcount to 1.
- (sd_got_store): Unref the store-data.
- (store_data_async_get_store): Ref the store-data.
- (store_data_ref): New function.
- (store_data_unref): New function.
- (subscribe_dialog_destroy): Instead of freeing the store-data
- here, unref it instead. We may just have an async function
- running. Set the callback function to NULL so that when the
- (remaining) async functions finish, they become no-ops.
-
- * mail-send-recv.c (build_dialogue): Revert my bar_destroy code
- and replace it with dialog_destroy instead.
-
- * mail-ops.c (mail_send_message): Append a message to any
- exception we get appending to any folders after having sent the
- message successfully saying that the message was sent successfully
- so the user doesn't misinterpret the error.
-
-2001-09-13 Jon Trowbridge <trow@ximian.com>
-
- * mail-callbacks.c (composer_get_message): Fixed double-freeing of
- EDestination vector when sending html mail to people who don't
- necessarily want it. Fixes bug #9848.
-
-2001-09-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * subscribe-dialog.c (get_short_folderinfo_desc):
- (get_short_folderinfo_get):
- (get_short_folderinfo_got):
- (get_short_folderinfo_free):
- (subscribe_get_short_folderinfo): Modified to take a FolderETree
- instead of a CamelStore (since the CamelStore is inside the
- FolderETree anyway) so that we could ref the ETree to prevent a
- race condition. Should fix bug #9827.
-
- * mail-format.c (try_inline_pgp_sig): Make sure that the
- charset_filter is non-NULL before using it since iconv may fail.
-
-2001-09-13 Larry Ewing <lewing@ximian.com>
-
- * mail-tools.c (mail_tool_quote_message): free the credits string.
-
-2001-09-12 <NotZed@Ximian.com>
-
- * mail-vfolder.c (vfolder_remove_cb): Fixed the remove callback
- prototype, and return the result properly using the listener.
- (vfolder_uri_to_folder): Always use the same store uri, so we dont
- create a new store for each folder.
-
-2001-09-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_write_on_exit): Save transport
- passwords too. This fixes bug #3020.
-
-2001-09-11 Dan Winship <danw@ximian.com>
-
- * mail-folder-cache.c (mail_folder_cache_note_folderinfo): Don't
- set the folderinfo's unread count to 0 when camel reports -1,
- since that may overwrite a valid unread count from before.
- (get_folder_info): Do it here instead when first creating a new
- folderinfo structure.
- Should fix bug #1756.
-
-2001-09-11 Larry Ewing <lewing@ximian.com>
-
- * mail-account-gui.c (menu_file_save_cb): call menu_file_save_error
- when there is an exception while saving.
- (menu_file_save_error): pop up a dialog telling the user the file
- has not been saved.
-
-2001-09-10 <NotZed@Ximian.com>
-
- * mail-local.c (mail_local_reconfigure_folder): Dynamically create
- the folder type list from camel.
- (reconfigure_clicked): And change code to handle changes.
-
-2001-09-10 <NotZed@Ximian.com>
-
- * merged mail_local patch from peterw. Many changes.
-
-2001-09-10 Iain Holmes <iain@ximian.com>
-
- * mail-config.c (impl_GNOME_Evolution_MailConfig_addAccount): Add a
- none account if the url is empty.
-
-2001-09-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): Don't use
- new_with_sig_file, that function no longer exists.
- (forward_get_composer): Same here.
-
-2001-09-10 Zbigniew Chyla <cyba@gnome.pl>
-
- * mail-config.c
- (add_shortcut_entry): Marked string for translation.
- (new_source_created): Ditto.
-
- * mail-send-recv.c
- (format_url): Marked strings for translation.
- (build_dialogue): Ditto.
-
-2001-09-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_new): Hide the S/MIME frame
- if we don't support S/MIME.
-
- * mail-send-recv.c (build_dialogue): Attach to the destroy event
- for each progressbar using bar_destroyed as the callback.
- (bar_destroyed): New callback to unregister the timeout and set
- the send-info's bar member to NULL so we don't try to update a
- destroyed progressbar.
-
- * mail-callbacks.c (mail_generate_reply): Pass along the right
- string, this fixes bug #9518.
-
- * mail-account-gui.c (save_service): Don't save the authmech if
- the username doesn't exist. Fixes bug #9474.
-
- * mail-callbacks.c (do_edit_messages): Remove some mailer-set
- headers. Fixes bug #9462.
-
-2001-09-10 Dan Winship <danw@ximian.com>
-
- * mail-callbacks.c (composer_get_message): Fix obvious dumb
- mistake in previous commit that made it *always* complain you had
- invalid recipients.
-
-2001-09-09 Jon Trowbridge <trow@ximian.com>
-
- * mail-callbacks.c (composer_get_message): Complain if we are
- trying to send to invalid recipients. (Bug #8875)
-
-2001-09-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (evolution_mail_config_wizard_factory_fn):
- We need to initialize all of the struct fields or else god knows
- what will happen later when we try to use 'em. Also set a destroy
- function for the MailConfigWizard so we don't leak it.
-
-2001-09-08 Jon Trowbridge <trow@ximian.com>
-
- * mail-callbacks.c (ask_confirm_for_unwanted_html_mail): Added.
- Shows a (hopefully) informative dialog warning you that some
- recipients might not want HTML mail (who are listed), and gives
- the option to cancel sending. (FIXME: The wording of this dialog
- could use some work.)
- (composer_get_message): Check if we are sending HTML to someone
- who might not want it, and raise the dialog if we are. Use our
- new destination-vector based api when talking to the composer.
- Touch our destinations here, boosting their use scores. This is
- the right place for this to happen --- closer to the end of the
- sending process, where incorrect/artificial use score inflation is
- less likely to occur.
-
- * mail-config.c (config_read): Added
- /Mail/Format/confirm_unwanted_html key. This flag determines
- whether or not we want to see the warning dialog when we send HTML
- mail to contacts who don't want it. Default is TRUE.
- (mail_config_write_on_exit): Write out the confirm_unwanted_html
- key.
- (mail_config_get_confirm_unwanted_html): Added.
- (mail_config_set_confirm_unwanted_html): Added.
-
-2001-09-08 Dan Winship <danw@ximian.com>
-
- * mail-display.c (mail_display_destroy): Unref the invisible,
- don't just destroy it.
-
-2001-09-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (mail_write_authenticity): Give the full path of
- the wax-seal icons.
- (try_inline_pgp_sig): Convert the charset from UTF-8 to whatever
- charset it should be. Now takes a CamelMimePart argument as well.
- (try_uudecoding): Now takes a part argument as well.
- (try_inline_pgp): Here too.
- (try_binhex): And finally here.
- (handle_text_plain): Pass along the mime part to the try_*
- functions.
-
-2001-09-06 Chris Toshok <toshok@ximian.com>
-
- * component-factory.c (notify_listener): new function, to notify
- the bonobo listener in remove_folder/create_folder.
- (storage_create_folder): match EvolutionStorage create_folder
- signal's signature.
- (storage_remove_folder): match EvolutionStorage remove_folder
- signal's signature.
-
-2001-09-06 Dan Winship <danw@ximian.com>
-
- Fix a bunch of replying/forwarding-related formatting bugs.
-
- 2749 - Message text not included in reply, but html attachment is
- 4294 - "forward inline" should quote the same headers as the
- normal mail display
- 6100 - Reply to a forwarded email displays email headers
- 7255 - Replying to HTML message
- 7527 - replying to forwarded message w/ attachments does the wrong
- thing
-
- * mail-format.c (mail_get_message_rfc822): New function to get
- message headers and body together, for inline forwards, or replies
- containing attached messages.
- (mail_get_message_body): Redo this to always return HTML, but keep
- the "want_plain" flag, to decide whether to return HTML that looks
- like HTML or HTML that looks like plain text. Use
- mail_get_message_rfc822 to handle attached message/rfc822 parts.
- Don't include the text of vcard or icalendar attachments. Don't
- fail to include text parts just because we found an HTML part.
- (Since we're always returning HTML now, this doesn't cause
- problems any more.)
-
- * mail-tools.c (mail_tool_quote_message): Simplify greatly.
- mail_get_message_body always returns HTML now, and we let it take
- care of prepending "> "s too. We then let GtkHTML deal with
- converting the HTML to plain text if the user wants to reply in
- plain text.
- (mail_tool_forward_message): Simplify this a ton too: parts of it
- are moved into mail_get_message_rfc822 and parts are now
- unnecessary.
-
- * mail-callbacks.c (do_forward_non_attached): Call
- mail_tool_forward_message here always, and let it do the "> "
- quoting in the "quoted" case, so that we get the headers too when
- forwarding quoted. Related to bug #4294.
-
-2001-09-05 Dan Winship <danw@ximian.com>
-
- * mail-display.c (launch_cb): the "command" of a
- GnomeVFSMimeApplication can include arguments as well. Deal with
- that. Fixes support for CodeWeavers' CrossOver Plugin.
-
-2001-09-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_remove_account): Adjust the
- default_account index correctly.
-
-2001-09-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_get_accounts): Added a g_assert to
- make sure that config wasn't NULL. This is meant to help debug bug
- #4911 and friends.
-
- * component-factory.c (owner_set_cb): Do not mail_config_init()
- here as we've already called this in main() in main.c.
-
-2001-09-05 Ettore Perazzoli <ettore@ximian.com>
-
- [Fix #958, ShellComponents should not be created by factories, for
- the mailer case.]
-
- * GNOME_Evolution_Mail.oaf.in: Remove the
- GNOME_Evolution_Mail_ShellComponentFactory.
-
- * component-factory.c: Changed to not use a factory.
- (COMPONENT_FACTORY_ID): Removed.
- (COMPONENT_ID): New.
- (idle_quit): Don't unref the component_factory.
- (create_component): Renamed from `component_fn'. Take no args.
- (component_factory_init): Create the component with
- `create_component' and register it on OAF.
-
-2001-09-06 Radek Doulik <rodo@ximian.com>
-
- * everywhere updated for new mail_content_loaded definition
- (prototype)
-
-2001-09-05 Radek Doulik <rodo@ximian.com>
-
- * mail-display.c (mail_display_redisplay): increase
- redisplay_counter
- (try_part_urls): new helper function
- (try_data_urls): ditto
- (load_content_loaded): if it has stream handle available and if
- it's still valid, it writes to this stream instead of
- redisplaying, uses try_part_urls and try_data_urls
-
- * mail-display.h: added redisplay_counter to MailDisplay, I use
- it in load_content_loaded to be sure that there wasn't any
- redisplay and that remembered handle is still valid
-
- * mail-display.c (on_url_requested): don't end stream with error
- if part is not loaded yet
- (on_url_requested): don't end stream in cases when we are going to
- load image using http
- (stream_write_or_redisplay_when_loaded): new helper function,
- which is extracted from mail_display_redisplay_when_loaded. it's
- extended to handle gtkhtml stream writting
- (mail_display_redisplay_when_loaded): use
- stream_write_or_redisplay_when_loaded
- (mail_display_stream_write_when_loaded): new function, uses
- stream_write_or_redisplay_when_loaded
- struct _load_content_msg: added handle, url and redisplay_counter
- fields
-
- * mail-format.c (mail_content_loaded): added redisplay, url and
- handle parameter for case when we are loading image content and
- want it write to stream instead of redisplaying
-
-2001-09-05 Ettore Perazzoli <ettore@ximian.com>
-
- * message-browser.c (message_browser_new): s/Evolution/Ximian
- Evolution/.
-
-2001-09-04 Ettore Perazzoli <ettore@ximian.com>
-
- [Fix #7542, "Crash Afer Closing".]
-
- * component-factory.c (owner_unset_cb): NULL the
- global_shell_client as the first thing here. Otherwise we might
- get into a slight race that causes the shell to crash. [Still, of
- course the shell shouldn't crash, but I haven't been able to track
- that down yet.]
-
-2001-09-04 Zbigniew Chyla <cyba@gnome.pl>
-
- Fixes #7251
-
- * mail-ops.c (add_vtrash_info): Mark "Trash" with U_(), not _().
-
-2001-09-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (fetch_mail_fetch): Unref the source folder here
- because it might be a POP folder. We do this because on store
- finalize, we now try to disconnect cleanly which means that we may
- block.
-
- * mail-send-recv.c (build_dialogue): Fix capitalization. Fixes bug
- #7486.
-
-2001-09-04 Peter Williams <peterw@ximian.com>
-
- * mail-local.c (mlf_init): Remove accidentally left-in "choke on
- this" preprocessor thingie.
- (mail_local_folder_reconfigure): Instead of creating our own local
- exception, just assert that ex != NULL.
- (*): Staticize everything that can be and remove some obnoxious
- prototypes.
-
-2001-08-31 Peter Williams <peterw@ximian.com>
-
- * mail-local.c (mail_local_reconfigure_folder): Use (NULL, NULL)
- as the arguments to g_hash_table_new instead of g_direct_foo.
- Instead of checking the URI, check MAIL_IS_LOCAL_FOLDER (fb->folder)
- to check whether we can reconfigure the folder. Instead of
- gnome_dialog_run_and_close, use gnome_dialog_run...
- (reconfigure_clicked): And deal with removing the hash table
- elements here.
- (local_storage_new_folder_cb): Set the folder's name to the
- displayName to i18nize correctly (after shell patch is applied).
-
-2001-08-30 Peter Williams <peterw@ximian.com>
-
- * mail-local.c: Rewrite as a more complete CamelStore.
-
- * component-factory.c (create_folder): We can now chuck out most
- of this function and just call mail_get_folder.
- (xfer_folder_done): If we succeeded in moving the messages, now
- delete the source folder as we should be.
- (xfer_folder): In order to do so, create a new xfer_folder_data
- struct that records the value of 'remove_source' Fix a leak by
- unreffing the source folder.
-
- * mail-ops.[ch]: We no longer need the mail_new_folder operation.
-
- * folder-browser.[ch]: Don't need the 'reconfigure' member
- anymore, because the loaded folder's URL doesn't change.
- (do_message_selected): Don't check it
- (on_right_click): Same.
- (folder_browser_set_uri): Same.
- (got_folder): Same.
-
-2001-08-31 Zbigniew Chyla <cyba@gnome.pl>
-
- * mail-vfolder.c (vfolder_create_storage): Marked string for
- translation (with U_).
-
-2001-08-28 Zbigniew Chyla <cyba@gnome.pl>
-
- * message-list.c (e_mail_address_compare): Use g_utf8_collate
- instead of g_strcasecmp for comparing names.
- (subject_compare): Replaced g_strcasecmp, isspace, var++ with
- UTF-8 counterparts.
-
-2001-08-30 Iain Holmes <iain@ximian.com>
-
- * importer/evolution-mbox-importer.c (load_file_fn): Check if it's
- a folder, if so, create a folder.
- (process_item_fn): If it was a folder created, just finish up
- importing
-
-2001-08-29 Iain Holmes <iain@ximian.com>
-
- * importers/evolution-mbox-importer.c: Turn off debugging, remove
- spewage.
- (process_item_fn): Notify the importer if the folder isn't opened
- or created yet.
- (load_file_fn): Allow the function to continue if the folder is
- being created.
-
-2001-08-30 Peter Williams <peterw@ximian.com>
-
- Due to the introduction of mail_folder_cache_remove(), we can no
- longer assume that mail_folder_info's always exist, so we need to
- robustify a lot of this.
-
- * mail-folder-cache.c (folder_browser_destroyed): New
- function. Called when the folder browser is destroyed -- analogous
- to camel_folder_finalized.
- (mail_folder_cache_note_fb): Hook it up here.
- (struct _mail_folder_info): Add a member, mail_info_id, that
- records the get_mail operation's id, so that we can cancel it if
- we need to.
- (get_folder_info): Initialize it here.
- (get_mail_info_reply): Clear it here.
- (mail_folder_cache_remove_folder): If necessary, cancel it here.
- (mail_folder_cache_note_folder): Check it here before starting a
- new operation, just in case.
- (update_message_counts_main): Take a URI instead of a
- mail_folder_info *, in case the MFI has gotten destroyed.
- (update_message_counts): Take a quark of the URI instead of a
- mail_folder_info *, for the same reason. We use a quark instead of
- an allocated gchar * because figuring out when to free the string
- gets tricky. Then go from quark -> URI string -> MFI. Return if
- the folder is no longer valid, because this indicates that the MFI
- was removed before this signal got called. Pass a string to
- update_message_counts_main instead of an MFI.
- (camel_folder_finalized): Don't bother unhooking the signals here.
- Same change as above, but don't bother checking for a valid folder
- because we're about to make it invalid anyway.
- (message_list_built): Analogous to the above, except with the
- FolderBrowser instead of the CamelFolder.
- (selection_changed): As above.
- (folder_browser_destroyed): As above.
- (struct get_mail_info_msg): Instead of taking a mail_folder_info
- *, take a URI, for reasons explained above.
- (get_mail_info_receive): Go from URI -> MFI before doing anything.
- (get_mail_info_reply): Same.
- (get_mail_info_destroy): Free the URI.
- (get_mail_info): Take a URI and return the message id so that it
- can be cancelled if necessary.
- (mail_folder_cache_remove_folder): Disconnect from signals and
- events before removing.
- (mail_folder_cache_note_folder): Use a GQuark instead of the
- mail_folder_info * as the user_data.
- (mail_folder_cache_note_fb): Same.
- (mail_folder_cache_note_folderinfo): Little formatting change.
-
-2001-08-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-browser.c (message_browser_message_loaded): Fixed a
- memory leak.
- (message_browser_new): Added a comment as to why , after
- reparenting, we do not unref the mail_display.
- (message_browser_destroy): Don't call gtk_widget_destroy() on the
- message_list here.
-
-2001-08-30 Peter Williams <peterw@ximian.com>
-
- * mail-ops.c (remove_folder_get): Instead of removing the folder
- from the folder cache here...
- (remove_folder_got): ... do it here, in the main thread.
-
-2001-08-29 Jon Trowbridge <trow@ximian.com>
-
- * mail-callbacks.c (composer_get_message): When calling
- e_msg_composer_get_message, pass in TRUE for the 'sending' arg.
- (Part of the fix for bug #8332)
-
-2001-08-29 Peter Williams <peterw@ximian.com>
-
- * folder-browser-ui.c: Fix the pixmap for /commands/MessageUndelete.
-
- * component-factory.c (owner_set_cb): Toss in a call to
- mail_config_init () cause it might contribute to solving
- bug 4911, and it won't hurt.
-
-2001-08-28 Peter Williams <peterw@ximian.com>
-
- * component-factory.c (owner_unset_cb): Disable interaction once
- the shell has quit.
- (create_view): Instead of
- folder_browser_factory_new_control ("", corba_shell) when looking
- at a mailstorage folder, use create_noselect_control().
-
-2001-08-27 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-local.c: Match the studlyCapsification of
- shell/Evolution*.idl.
-
- * mail-config-druid.h: Change type of `event_source' from
- `Bonobo_EventSource *' to `Bonobo_EventSource'.
-
- * mail-accounts.c (mail_delete): Remove unused local variable
- `label'.
-
- * folder-info.c (do_get_info): `#if 0' unused variables.
-
-2001-08-27 Jon Trowbridge <trow@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): Check if we are trying
- to reply to a message with no From: field, and try to do something
- graceful in that case. (Bug #7028)
-
- * mail-display.c (ebook_callback): Add paranoid checks for the
- case of a message with a From: field. (Also maybe bug #7028)
-
-2001-08-27 Iain Holmes <iain@ximian.com>
-
- * mail-config-druid.c (druid_finish): Free the list and hash table.
- (druid_cancel): Free the list and hash table.
-
-2001-08-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_new): Set the source and
- transport description labels.
- (transport_type_changed): Set the transport description label.
- (source_type_changed): Set the source description label.
-
- * mail-tools.c (mail_tool_make_message_attachment): Remove
- X-Evolution* headers.
- (mail_tool_remove_xevolution_headers): New function to convenience
- removing the X-Evolution headers.
- (mail_tool_restore_xevolution_headers): New convenience function
- to restore the X-Evolution headers.
- (mail_tool_destroy_xevolution): New function to cleanup the
- structure.
- (mail_tool_forward_message): Remove and restore the X-Evolution
- headers here too.
-
-2001-08-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-send-recv.c (receive_update_got_store): If the store is not
- connected, scan it's subfolders first.
-
- * mail-ops.c (report_status): Call va_end() so LinuxPPC doesn't
- have a caniption.
-
-2001-08-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (launch_cb): Use the new e_mkdtemp function.
-
- * folder-browser.c (message_list_drag_data_get): Use the new
- e_mkdtemp function.
-
-2001-08-24 Ettore Perazzoli <ettore@ximian.com>
-
- [Fix #8024, Empty strings marked for translation.]
-
- * component-factory.c: Don't mark empty strings for translation.
- Rather, give descriptions and display names to types "mailstorage"
- and "vtrash".
-
-2001-08-24 Peter Williams <peterw@ximian.com>
-
- * mail-ops.c (remove_folder_get): Save the folder's full_name,
- unref it, and *then* unref the store, so that the folder has been
- closed before it gets deleted.
-
-2001-08-24 Peter Williams <peterw@ximian.com>
-
- * mail-config.c (add_shortcut_entry): Instead of using the length
- of the shortcuts list as the index for the shortcut, use -1, which
- means "last".
-
- * mail-config-druid.c (druid_finish): Remove the account adding
- stuff since that happens in wizard_finish now.
-
- * mail-config.c (add_new_storage): New function. Add a
- MailConfigAccount to the shell as a storage.
- (maybe_add_shortcut): Renamed to new_source_created.
- (new_source_created): Call add_new_storage here.
-
- * component-factory.c (mail_remove_storage_by_uri): Don't warn if
- the storage isn't remote... no point in making the caller do extra
- work.
-
-2001-08-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_set_thread_list): Don't let the uri
- be an empty string (how the fuck is this even happening in the
- first place??).
- (mail_config_get_thread_list): Same.
- (mail_config_set_show_preview): And here.
- (mail_config_get_show_preview): And finally here.
-
-2001-08-23 Larry Ewing <lewing@ximian.com>
-
- * mail-search.c (mail_search_construct): attach to the destroy
- handler to reset the tokenizer.
- (dialog_destroy_cb): reset the tokenizer here so that destroying
- the dialog with the window manager still clears the hilighted
- items.
-
-2001-08-23 Peter Williams <peterw@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_save): Eek, let the user create
- new accounts if old_account == NULL.
-
-2001-08-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (destination_folder_handle_drop): Check to
- make sure we actually have drag data.
-
- * folder-browser.c (message_list_drag_data_received): Check to
- make sure we have valid data.
-
-2001-08-21 Christopher James Lahey <clahey@ximian.com>
-
- * Revert fix for Ximian bug #6995.
-
-2001-08-23 Peter Williams <peterw@ximian.com>
-
- * mail-folder-cache.c (maybe_update): Record the timeout_id so we
- can cancel it if the mail_folder_info is later freed. Also obviates
- the use of the _UPDATE_QUEUED flag.
- (mail_folder_cache_remove_folder): Cancel the timeout if we need to.
- Lock around the hash table operations. Free mfi itself. Add debugging
- spew.
- (get_folder_info): Initialiae the timeout_id to 0.
-
-2001-08-22 Jon Trowbridge <trow@ximian.com>
-
- * mail-callbacks.c (ask_confirm_for_only_bcc): Provide alternative
- text for this dialog for the case when a message has only Bcc
- recipients because of a hidden contact list's addresses being
- moved from To/Cc to Bcc.
- (composer_get_message): Try to detect when our message has only
- Bcc recipients because of moving addresses around due to a hidden
- contact list, and show the dialog with the revised wording in this
- case.
-
-2001-08-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (create_view): Don't blindly make all vtrash
- folder types have a uri of vtrash:file:/, instead only make it use
- vtrash:file:/ if it's a file: uri, else use physical_uri.
-
-2001-08-22 jacob berkman <jacob@ximian.com>
-
- * mail-display.c: rework how the e-card-popup thing has its life
- managed. we now hide the window on the Hide event and destroy it
- on the Destroy event emitted from its event source
-
-2001-08-22 Peter Williams <peterw@ximian.com>
-
- * mail-send-recv.c (set_send_status): We don't need to escape this
- for printf'ing.
-
-2001-08-22 Peter Williams <peterw@ximian.com>
-
- Prevent the user from creating two accounts with the same name.
-
- * mail-config.c (impl_GNOME_Evolution_MailConfig_addAccount):
- Abort if the account has the same name as another account.
-
- * mail-account-gui.c (mail_account_gui_save): Don't let the user
- save if the account has the same name as another account.
-
- * mail-config-druid.c (management_check): Disable the next button
- if the account name is the same as a preexisting account.
- (construct): The only part of 'pages' that was being used was the
- name. 'wizard_pages' now has the callbacks, while 'pages' is just
- an array of char *'s.
- (wizard_finish_cb): Save the account first because that's the
- right way, and try to honor mail_account_gui_save's return value.
-
- * mail-config.glade: Add a label noting that you're not allowed to
- create two accounts with the same name.
-
-2001-08-22 Peter Williams <peterw@ximian.com>
-
- * folder-browser-ui.c (fbui_sensitize_timeout): Check for NULL uic
- here as well.
- (fbui_sensitize_items): Up the timeout interval to 110 ms.
-
-2001-08-21 Peter Williams <peterw@ximian.com>
-
- * mail-account-editor.c (apply_changes): Honor the return value of
- mail_account_gui_save.
-
- * mail-ops.c (sync_folder_desc): Say which folder is getting
- saved.
-
-2001-08-21 Dan Winship <danw@ximian.com>
-
- * mail-identify.c (mail_identify_mime_part): Don't trust gnome-vfs
- when it says "text/plain" if gnome_vfs_mime_type_from_name says
- something different. Fixes a problem with recognizing icalendar
- attachments labeled "application/octet-stream". Also, don't bother
- asking gnome-vfs about winmail.dat attachments, since it will
- often claim that they're MPEGs due to some mis-magic.
-
-2001-08-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-session.c (mail_session_forget_password): zero-ize the
- password before freeing.
- (forget_password): Same.
-
-2001-08-21 Peter Williams <peterw@ximian.com>
-
- * message-list.c (message_list_set_folder): Don't sink the extras
- since _set_folder can get called more than once (on reconfigure.)
- (message_list_destroy): So just unref the extras here.
-
- * mail-send-recv.c (build_dialogue): Treat the spool provider like
- IMAP: update instead of performing an explicit receive.
-
-2001-08-21 Peter Williams <peterw@ximian.com>
-
- * folder-browser-ui.c (fbui_sensitize_items): Rename to
- fbui_real_sensitize_items. Now we queue a change and set up a
- timeout, making sure weed out redundant changes, fixing flicker.
- (fbui_sensitize_timeout): New function. The timeout.
- (fbui_real_sensitize_items): Semi-new function. Rename of old
- fbui_sensitize_items.
- (folder_browser_ui_set_selection_state): Pass the FB instead of
- only the UIC to sensitize_items.
- (folder_browser_ui_message_loaded): Same.
-
- * folder-browser.c (folder_browser_destroy): Kill the new timeout
- if it is registered.
-
- * folder-browser.h: Add some members to FolderBrowser for keeping
- track of the queue of changes.
-
-2001-08-20 Iain Holmes <iain@ximian.com>
-
- * mail-config.druid: Fix the jumping around.
-
-2001-08-20 Peter Williams <peterw@ximian.com>
-
- * mail-ops.c (remove_folder_get): Fix double-unref of the store.
-
-2001-08-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (create_folder): Modify the url and set the
- protocol to mbox rather than hacking it and prepending mbox: to
- the uri.
-
- * mail-local.c (get_folder): Don't prepend the folder_name with
- the store's path because the hash key is folder_name, not
- /folder_name.
-
-2001-08-20 Iain Holmes <iain@ximian.com>
-
- * mail-config-druid.c: Change some of the text labels.
- (create_label): Make a label instead of a GtkHTML widget.
-
-2001-08-18 Iain Holmes <iain@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_setup): Stop hiding the source
- and transport frames.
-
-2001-08-20 Ettore Perazzoli <ettore@ximian.com>
-
- * folder-browser-ui.c (folder_browser_setup_property_menu):
- Updated as ChangeFolderProperties is now in the
- ComponentPlaceholder.
-
-2001-08-20 Peter Williams <peterw@ximian.com>
-
- * mail-accounts.c (mail_able): Whoops, make sure that the account
- has a source before removing it or what-have-you.
-
- * subscribe-dialog.c: Add a few comments.
-
-2001-08-20 Damon Chaplin <damon@ximian.com>
-
- * folder-browser-ui.c: use new small trash icon for Delete command.
-
-2001-08-20 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-ops.c (sync_folder_desc): s/Synchronising/Synchronizing/.
-
-2001-08-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (storage_create_folder):
- camel_folder_create_folder can now return a heirachial tree so
- subscribe to down the tree.
-
-2001-08-20 Damon Chaplin <damon@ximian.com>
-
- * folder-browser-ui.c: use new Cut/Copy/Paste icons.
-
-2001-08-19 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c: Update the folder list to include a display
- name and a description.
-
-2001-08-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-mt.c (do_op_status): Allow the activity to be NULL if there
- isn't a global_shell_client so that we don't try and report status
- updates when the shell is destroyed.
-
- * mail-config.c (add_shortcut_entry): Return if there isn't a
- global_shell_client.
-
- * component-factory.c (owner_set_cb): set the global_shell_client
- here and connect to the destroy signal.
-
- * mail-vfolder.c (vfolder_create_storage): Use an extern
- global_shell_client.
-
-2001-08-19 Christopher James Lahey <clahey@ximian.com>
-
- * mail-callbacks.c (delete_msg): Made delete make the cursor go
- backwards if the user is sorting by descending date. Fixes Ximian
- bug #6995. (Reverted.)
-
-2001-08-19 Jeffrey Stedfast <fejj@ximian.com>
-
- Note: The following changes were based on Zbigniew Chyla's fixes.
-
- * mail-callbacks.c (mail_generate_reply): Convert the date string
- to UTF-8.
- (do_forward_non_attached): Same here.
-
-2001-08-05 Zbigniew Chyla <cyba@gnome.pl>
-
- * folder-info.c: Added missing #include <config.h>. (applied by Damon)
-
-2001-08-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (config_read): Change the default values for
- "always-sign" to false.
-
- * mail-callbacks.c (open_msg): if the folder is Outbox, let the
- user edit the message(s) too I guess.
-
-2001-08-18 Ettore Perazzoli <ettore@ximian.com>
-
- * folder-browser-ui.c: Hook the new `delete-message.png' up.
-
-2001-08-17 Damon Chaplin <damon@ximian.com>
-
- * mail-display.c (pixmap_press): stop signal emission so the GtkButton
- class method doesn't mess up the popup menu. Hopefully fixes bug #1828.
-
-2001-08-17 Zbigniew Chyla <cyba@gnome.pl>
-
- * mail-search.c (mail_search_construct): Put _() instead of N_()
- around of the "Search" string, gnome_dialog_constructv doesn't
- translate button names.
-
-2001-08-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (mail_write_authenticity): We want wax-seal.png
- instead, since I added the png files to cvs and renamed it to
- wax-seal.png.
-
-2001-08-17 Iain Holmes <iain@ximian.com>
-
- * importers/evolution-mbox-importer.c (load_file_fn): Fix
- warnings.
-
-2001-08-17 JP Rosevear <jpr@ximian.com>
-
- * component-factory.c (owner_set_cb): don't init the config here
-
- * main.c (main): init the config here
-
-2001-08-17 JP Rosevear <jpr@ximian.com>
-
- * mail-config-druid.c: remove dead structure
-
-2001-08-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_write): Save the always-sign options
- for pgp and smime.
- (config_read): Read in the always-save options for pgp and smime.
-
-2001-08-17 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.etspec: Made the default values for column
- expansions here more reasonable.
-
-2001-08-16 Iain Holmes <iain@ximian.com>
-
- * GNOME_Evolution_Mail.oaf.in: Add the Wizard stuff.
-
- * component-factory.c (component_fn): Init the Wizard factory.
- (mail_load_storages): Check service isn't NULL before it's been
- dereferenced.
-
- * mail-account-gui.c (mail_account_gui_setup): Only show the top level
- widget is it's not NULL.
- Change the gtk_widget_set_usizes to gtk_widget_hides.
-
- * mail-config-druid.c: Rewrite to use the EvolutionWizard stuff.
-
- * mail-config-druid.h: Add stuff to the MailConfigDruid struct.
-
- * mail-config.c (mail_config_get_default_account): Init the config if
- it's not been inited.
-
-2001-08-16 Jason Leach <jleach@ximian.com>
-
- * mail-tools.c (mail_tool_quote_message): Only starting cutting
- the signature out when we match "-- \n", so "--\n" in the middle
- of a mail won't omit the rest for a quoted reply. Bug #7454.
-
-2001-08-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (confirm_expunge): Respect the user's desire to
- be prompted to confirm that he wants to expunge the blasted
- folder. Also, don't set the usize - that's just an evil hack and
- you may find it will cut off text once the label has been
- translated.
- (create_msg_composer): In order for the security options to be
- checked when composing a new message, we must set the from account
- explicitly even though the composer hdrs sets the default from
- account and emits the signal because at that stage the composer
- hasn't yet connected to the signals and thus the bonobo menu items
- don't get set.
-
- * mail-config.c (mail_config_set_confirm_expunge): New.
- (mail_config_get_confirm_expunge): New.
-
-2001-08-16 Peter Williams <peterw@ximian.com>
-
- * subscribe-dialog.c (fe_got_children): Sort the nodes here...
- (fe_sort_folder): ... using this function.
-
- * folder-browser-ui.c (folder_browser_ui_message_loaded): Check
- for uic == NULL. I'm not sure how this could happen, but...
-
-2001-08-16 Peter Williams <peterw@ximian.com>
-
- * folder-browser-ui.c (folder_browser_ui_set_selection_state):
- Disable "Search Message" when more or less than exactly one
- message is selected.
-
- * subscribe-dialog.c (fe_done_subscribing): Instead of hackfully
- getting the path, use a CamelURL so that escaping is
- handled. Silly me. -- See below --
- (fe_node_to_shell_path): Use node->name and node->full_name to
- generate the the shell path of this item. Don't need to escape the
- URL, and handle cases when dir_sep != '/'
- (fe_done_subscribing): Use fe_node_to_shell_path instead of the
- CamelURL. Third time's the charm... * folder-browser-ui.c
- (folder_browser_ui_set_selection_state): Disable "Search Message"
- when more or less than exactly one message is selected.
-
- * subscribe-dialog.c (fe_done_subscribing): Instead of hackfully
- getting the path, use a CamelURL so that escaping is
- handled. Silly me. -- See below --
- (fe_node_to_shell_path): Use node->name and node->full_name to
- generate the the shell path of this item. Don't need to escape the
- URL, and handle cases when dir_sep != '/'
- (fe_done_subscribing): Use fe_node_to_shell_path instead of the
- CamelURL. Third time's the charm...
-
-2001-08-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (save_part): Remember the filename is in utf8, so
- use the e_utf8 functions to set the filename in the file selection
- dialog.
-
-2001-08-15 Peter Williams <peterw@ximian.com>
-
- * message-list.c (on_cursor_activated_idle): Always remove the
- idle and return FALSE, instead of returning TRUE if more than one
- message is selected.
-
-2001-08-15 Jason Leach <jleach@ximian.com>
-
- * mail-tools.c (mail_tool_quote_message): Stop building the quote
- after a sigdash, hence, omitting the signature from a
- reply/forward. Bug #5529.
-
-2001-08-15 Anna Marie Dirks <anna@ximian.com>
-
- * mail-callbacks.c (expunge-folders): Re-added, at Ettore's
- request, the confirm-expunge dialog.
-
-2001-08-15 Jason Leach <jleach@ximian.com>
-
- * message-list.c (message_list_init): Use ALWAYS for scroll frame
- policy because ETable acts lame with AUTOMATIC. Bug #6925.
-
-2001-08-16 Not Zed <NotZed@Ximian.com>
-
- * mail-callbacks.c (expunge_folder): Don't confirm expunge.
-
-2001-08-15 Not Zed <NotZed@Ximian.com>
-
- * mail-local.c (register_folder_register): Remove operation
- registration/etc. Handled by mail-mt.c
-
- * message-list.c (regen_list_regen): Remove camel operation
- registration/etc.
-
-2001-08-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (load_accounts): Convert the UTF-8 account name
- string into a gtk-string before using it in the GtkCList.
-
-2001-08-14 Peter Williams <peterw@ximian.com>
-
- * mail-callbacks.c (previous_unread_msg): Make previous unread
- wrap around too.
-
- * mail-accounts.c (load_accounts): If the account is enabled,
- set a checkmark pixmap instead of a strange plus sign.
- (mail_accounts_dialog_init): Load the pixmap here.
- (mail_accounts_dialog_finalise): Free it here.
-
- * mail-accounts.h: Prototype it here.
-
-2001-08-14 Dan Winship <danw@ximian.com>
-
- * folder-browser.c (message_list_drag_data_get): Fix the fix for
- #6722.
-
- * mail-ops.c (save_messages_save): Likewise.
- (save_part_save): Deal with the possibility that
- camel_mime_filter_charset_new_convert will return NULL (bad
- charset name). Fixes #6611.
-
-2001-08-13 Jon Trowbridge <trow@ximian.com>
-
- * mail-search.c (mail_search_construct): Disable the "search
- forward/backward" option in the search dialog. Why? Well, it
- doesn't work properly (bug #4869), and the reason it doesn't work
- is because of some scary stuff deep inside of gtkhtml that I don't
- understand at all. So since I'm paranoid, and since the GUI
- freeze is tomorrow, and since it isn't really an important feature
- at all, I'm #if 0-ing it out. If the gtkhtml stuff gets sorted
- out, we can slip it back in for 1.1.
-
-2001-08-13 Peter Williams <peterw@ximian.com>
-
- * component-factory.c (user_create_new_item_cb): New function,
- handle "user creatable items".
- (component_fn): Tell the shell that we're capable of creating
- mail messages.
-
-2001-08-13 Jason Leach <jleach@ximian.com>
-
- * mail-local.c (get_folder): Fix this so it can actually get
- folders from the hash of folders on the local store (it was
- looking up plain @folder_name, which is typically "mbox", instead
- of the full URI, /home/jleach/evolution/local/Foo/mbox).
-
- * component-factory.c (do_remove_folder): Rename to
- remove_folder_done, more fitting for it's purpose.
- (do_xfer_folder): Similar name change.
- (do_create_folder): Similar name change.
- (remove_folder): Don't notifyResult for the component here, we
- will notify with our result in remove_folder_done.
- (xfer_folder): Ditto.
-
- * mail-vfolder.c (vfolder_refresh): Create new folders with unread
- counts of "0" instead of #FALSE (which just happens to be #defined
- as zero).
-
-2001-08-13 Peter Williams <peterw@ximian.com>
-
- * mail-send-recv.c (mail_autoreceive_setup): Break most of the
- functionality into a separate function.
- (autoreceive_setup_list): Rename of mail_autoreceive_setup that is
- passed a list of accounts.
- (mail_autoreceive_setup_account): New function. Set up a single
- account using autoreceive_setup_account.
-
- * mail-send-receive.h: Prototype mail_autoreceive_setup_account.
-
- * mail-account-gui.c (mail_account_gui_save): Instead of setting
- up all accounts, set up only this source with the new
- mail_autoreceive_setup_account.
-
- * mail-config-druid.c (druid_finish): ... which means we can call
- mail_config_add_account() after the MailConfigAccount has been
- created by mail_account_gui_save() because we no longer need the
- account to be in the list for mail_autoreceive_setup()
-
- * mail-config.c (mail_config_add_account): ... which means we can
- possibly add a shortcut to the account's sources's Inbox here.
- (maybe_add_shortcut): New function. If the store is a storage, add
- a shortcut to its inbox. Hope that /INBOX exists.
- (add_shortcut_entry): New function. Creates a shortcut if it doesn't
- yet exist.
-
-2001-08-13 Peter Williams <peterw@ximian.com>
-
- * mail-account-gui.c (service_complete): Take account of the fact that
- service->path may be NULL (if service is a transport.)
-
- * mail-config-druid.c (druid_finish): Bleah, bugfix in case the
- account has no source.
-
-2001-08-13 Anna Marie Dirks <anna@ximian.com>
-
- * mail-config.glade: Changed all instances of "Wizard" and "Druid"
- to "Assistant".
-
- * mail-config-druid.c: Ditto.
-
-2001-08-13 Anna Marie Dirks <anna@ximian.com>
-
- * mail-accounts.c: Changed the title of the Mail Settings
- dialog from "Evolution Account Manager" to "Mail Settings" .
-
-2001-08-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (get_message_uid): Do some g_assert()
- action. Make sure that the node passed in is non-NULL and also
- make sure that the CamelMessageInfo gotten from the ETree is
- non-NULL.
- (get_message_info): Same here.
-
- * mail-callbacks.c (expunge_folder): Confirm that the user really
- wants to expunge.
- (save_msg_ok): Set the parent window here.
-
-2001-08-13 Peter Williams <peterw@ximian.com>
-
- * mail-config.c (remove_account_shortcuts): Remove the shortcuts
- corresponding to an account (they all point to
- evolution:/accountname/..)
- (mail_config_remove_account): When deleting the account, remove
- its shortcuts.
-
-2001-08-10 Peter Williams <peterw@ximian.com>
-
- * mail-config-druid.c (druid_finish): Whoa, fatal typo. Sorry.
-
-2001-08-13 Jason Leach <jleach@ximian.com>
-
- * mail-local.c (init_trash): Tell folder cache the path for our
- Trash is /Trash, because that's what Shell needs to hear for
- updating folders.
-
-2001-08-11 Jason Leach <jleach@ximian.com>
-
- * mail-offline-handler.c (impl_goOnline): Set the session as
- online so auto mail checking (and the composer) will be doing the
- right things when you go online. Bug #6343 and #4601.
-
- * folder-browser.c: Make the right click "Resend..." into "Edit as
- New Message...", bug #6838.
-
- * mail-accounts.h: Remove unecessary #include <camel.h>
-
- * mail.h: Removed a prototype for a non-existant
- mail_view_create().
-
-2001-08-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (build_auth_menu): Fix bug #4523 for good.
- (save_service): If service->authitem is NULL, then the user tried
- to enable authentication but the provider doesn't actually support
- it.
-
-2001-08-10 Jon Trowbridge <trow@ximian.com>
-
- * folder-browser.c: Set our ESearchBarItems subitems to NULL.
-
-2001-08-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (transfer_msg): Prepend the uri with evolution:
- to fix bug #6916.
-
-2001-08-10 Jason Leach <jleach@ximian.com>
-
- * folder-browser.c: Make the context menu for the Sent folder have
- "Resend..." instead of "Resend", to clarify that it will bring up
- a dialog needing your input rather than just blindly sending the
- message again. Also give it the 'e' accelerator. Bug #6838.
-
- * mail-callbacks.c (next_unread_msg): Since 'N' keypresses go
- through here now, use wrap-around selecting.
- (previous_unread_msg): Same for 'P' here.
-
- * message-list.c (on_cursor_activated_idle): Stop this idle timer
- when we have multiple items selected, this keeps it from loading
- and then marking the last item in your selection list as read.
- Bug #4693.
-
-2001-08-10 Peter Williams <peterw@ximian.com>
-
- * mail-accounts.c (mail_delete): Don't remove the account from the
- tree if it's not enabled.
-
-2001-08-10 Jason Leach <jleach@ximian.com>
-
- * mail-ops.c (remove_folder_get): Remove all the messages from a
- folder that's being deleted before actually doing the
- camel_store_delete_folder, so it won't leave behind an mbox file
- that's going to prevent the actual directory from being deleted,
- and strange effects like new folders with the same name being made
- in it's place. Bug #5618.
-
- * mail-folder-cache.c (mail_folder_cache_remove_folder): New
- function, a way to get something out of the folder cache, like
- folders being deleted. Bug #6878.
-
-2001-08-10 Peter Williams <peterw@ximian.com>
-
- * mail-accounts.c (news_add_destroyed): Whoops, compile fix.
-
-2001-08-10 Jason Leach <jleach@ximian.com>
-
- * mail-callbacks.c (mark_as_unseen): If marking messages as
- unread, remove the automatic mark-as-read timer. Bug #4153.
-
-2001-08-08 Peter Williams <peterw@ximian.com>
-
- * component-factory.c (mail_load_storages): Don't load the storage
- if it isn't enabled.
- (mail_remove_storage_by_uri): New function. Goes through the
- gymnastics of getting a CamelStore from the URI and calling
- mail_remove_storage. Copied from mail_delete().
- (mail_load_storage_by_uri): Break out the storage-loading part of
- mail_load_storages into a single function.
- (mail_load_storages): Just call mail_load_storage_by_uri several
- times.
-
- * mail.h: Prototype our new _by_uri functions.
-
- * mail-accounts.c (news_add_destroyed): Instead of hacking around
- mail_load_storages, call mail_load_storage_by_uri.
- (mail_delete): Move this chunk of code into
- mail_remove_storage_by_uri.
- (mail_able): Add or remove the storage as necessary, with our
- new _by_uri functions.
-
- * mail-config-druid.c (druid_finish): See news_add_destroyed above.
-
-2001-08-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_get_show_preview): Free dbkey if we
- don't use it.
-
- * folder-browser.c (on_right_click): Added a comment about leaking
- memory here, but we seem to not even use the 2 strings we
- strdup...is this code still under construction?
-
- * mail-ops.c (mail_send_message): Free the sent_folder_uri at the
- bottom of the function (ironically enough we were freeing it if we
- encountered an error but never free'd it on success :-)
- (get_folderinfo_got): Fixed a memory leak...this one would have
- gone away once we got rid of the debug g_warning though.
-
-2001-08-10 Not Zed <NotZed@Ximian.com>
-
- * mail-ops.c (mail_transfer_messages): Dont want it to keep on
- running if it got bad arguments, want it to bloody well crash.
- (mail_append_mail): Same here.
-
-2001-08-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (mlfe_callback): Added a g_assert_not_reached() -
- I'm hoping this will help us track down the "can't delete message
- sometimes" (ie bug #6637 and friends) bugs that users have been
- reporting. If herein lies the problem, then we can expect some
- crashes and some good backtraces, hopefully.
-
-2001-08-09 Peter Williams <peterw@ximian.com>
-
- * folder-browser.c (on_key_press): The bonobo menu items now
- handle 'n' and 'p'.
- (on_key_press): 'q' as well.
-
- * message-list.c (message_list_select): Fix inline documentation.
-
-2001-08-09 Anna Marie Dirks <anna@ximian.com>
-
- Fixes bug #6918
-
- * folder-browser.c: Changed the "Store search as vFolder" menu
- item to "Create vFolder from Search".
-
-2001-08-09 Jeffrey Stedfast <fejj@ximian.com>
-
- Fixes bug #6722
-
- * mail-ops.c (save_messages_save): Don't set the default perms
- here, let the user's umask deal with permissions.
-
- * folder-browser.c (message_list_drag_data_get): Don't set any
- default perms.
-
-2001-08-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_save): Save the pgp and
- smime always-sign options.
-
- * mail-config.c (account_copy): Copy the always-sign options over
- too.
-
-2001-08-08 Not Zed <NotZed@Ximian.com>
-
- * mail-ops.c (send_mail_send): Dont double-register this
- operation, mail-mt will do it for us.
- (get_folderinfo_get): "
- (get_folder_get): "
- (get_store_get): "
- (create_folder_get): "
- (remove_folder_get): "
- (sync_folder_sync): "
- (get_message_get): "
-
- * message-list.c (message_list_setup_etree): Free the etstate
- object after we're done using it.
-
-2001-08-08 Peter Williams <peterw@ximian.com>
-
- * subscribe-dialog.c (sc_selection_changed): New function. Set the
- sensitivity of the subscribe buttons based on whether any folders
- are selected.
- (menu_item_selected): If getting the widget for the first time,
- hook up sc_selection_changed.
-
-2001-08-08 Peter Williams <peterw@ximian.com>
-
- * mail-ops.c (mail_update_subfolders): Change this gtk_object_ref
- on the storage to a bonobo_object_ref.
-
- * component-factory.c (mail_lookup_storage): And here.
-
- * mail-vfolder.c (mail_vfolder_get_vfolder_storage): And here.
-
-2001-08-07 Ettore Perazzoli <ettore@ximian.com>
-
- * message-browser.c (set_bonobo_ui): Remove the "Customize
- Toolbar" thing.
-
-2001-08-07 Not Zed <NotZed@Ximian.com>
-
- * mail-config.c (mail_config_get_thread_list): Free the dbkey if
- we found the config option.
-
- * mail-send-recv.c (build_dialogue): Free the pretty_url after
- we've used it.
- (free_send_info): Free the 'what' string.
- (receive_done): Use free_send_info to make sure we free
- everything.
-
- * mail-ops.c (send_queue_free): Unref the filter driver when done.
- (send_queue_send): Unref the driver here too, force any long
- taking operations to run in our thread.
-
-2001-08-07 Peter Williams <peterw@ximian.com>
-
- * Revert Jeff's changes to subscribe-dialog.[ch]. It's not a widget,
- it's an object from which you can obtain a widget.
-
-2001-08-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (manage_subscriptions): Hide the app->window.
- (do_mail_print): Set the parent of the gnome-dialog to be the
- folder-browser so that when evolution is closed, the print dialog
- gets destroyed. Should fix bug #4781.
-
- * subscribe-dialog.c (subscribe_dialog_new): This should return a
- GtkWidget not a GtkObject.
-
- * mail-session.c (get_filter_driver): Update to use user's logging
- preferences.
-
- * mail-accounts.c (filter_log_toggled): New.
- (filter_log_path_changed): New.
- (construct): Get and attach signals to the filter logging option
- widgets.
-
- * mail-config.c (config_read): Read in filter logging options.
- (mail_config_write_on_exit): Save filter logging options.
- (mail_config_set_filter_log_path): Implemented.
- (mail_config_get_filter_log_path): Implemented.
- (mail_config_set_filter_log): Implemented.
- (mail_config_get_filter_log): Implemented.
-
-2001-08-07 Peter Williams <peterw@ximian.com>
-
- * subscribe-dialog.c (folder_etree_construct): Move
- fe_create_root_node farther down, so we can check for its children
- without problems.
-
- * mail-callbacks.c (folder_created): Use bonobo_object_unref on
- the storage since it's a bonobo object.
- (mail_storage_create_folder): Same.
- (folder_deleted): Same.
-
- * mail-send-recv.c (receive_update_got_store): Same.
-
- * mail-ops.c (do_update_subfolders): Same.
-
- * subscribe-dialog.c (fe_destroy): Unref the e_storage since
- lookup_store gives us a ref.
-
-2001-08-07 Peter Williams <peterw@ximian.com>
-
- * subscribe-dialog.c (folder_etree_construct): Move
- fe_create_root_node farther down, so we can check for its children
- without problems.
- (storage_tree_path): Removed, this was broken.
- (subscribe_get_short_folderinfo): Use the queued thread instead of
- the new thread.
- (subscribe_do_subscribe_folder): Same.
- (ftree_node_new_root): Don't create the path anymore; it was
- broken and there's a better way to get it now.
- (fe_got_children): Remove some debugging output.
- (fe_check_for_children): Here too.
- (fe_done_subscribing): Get the path from the URI instead of the
- ftree_node.
- (_SubscribeDialogPrivate): Add all of our useful widgets as
- members.
- (sc_refresh_pressed): Don't clear the search... that makes no
- sense now.
- (sc_search_activated): Don't set the filter radio button as active
- now; we use sensitivity instead.
- (sc_all_toggled): Make the search entry insensitive.
- (sc_filter_toggled): Make the search entry sensitive.
- (kill_default_view): New function. Gets rid of the default view
- stuff and makes all the widgetry sensitive.
- (menu_item_selected): Check if we moved off of the default view
- and, if so, call kill_default_view().
- (subscribe_dialog_construct): Initialize our new private widget
- members, and by default insensitize most of the buttons because
- they make no sense in the default view.
-
-2001-08-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.glade: Added key accelerators to a bunch of the
- config options and moved the Bcc and empty-subject checkboxes to
- the composer tab where they belong.
-
- * mail-callbacks.c (providers_config): Raise the dialog if it
- exists already.
- (manage_subscriptions): Raise the dialog if it already exists.
- (main_select_first_unread): Removed (we haven't needed this code
- in ages).
- (select_first_unread): Same.
- (save_msg_ok): If the path is empty, just return.
-
- * mail-local.c (mail_local_reconfigure_folder): Raise the dialog
- if it already exists.
-
-2001-08-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (expunge_folder): Set the message-display
- message to NULL if we can't get an info too.
-
-2001-08-06 Jason Leach <jleach@ximian.com>
-
- * mail-callbacks.c (create_folders): Make vtrash folders on other
- storages with a "vtrash" type, so they get the little trashcan
- icon.
-
-2001-08-06 Peter Williams <peterw@ximian.com>
-
- * subscribe-dialog.[ch]: Reimplement to be asynchronous and pretty,
- with progressive folder loading and all sorts of wonderful
- improvements.
-
- * mail-callbacks.c (manage_subscriptions): Change to reflect API
- update.
-
- * Makefile.am (etspec_DATA): Add subscribe-dialog.etspec.
- (glade_DATA): And the glade file.
-
- * subscribe-dialog.etspec: New file, break out the specification
- from inside the subscribe-dialog.c
-
- * subscribe-dialog.glade: Update this, actually use it now.
-
-2001-08-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (empty_trash): Yuck. Special case whether or
- not we want to expunge all the trash folders syncronously or
- asyncronously based on whether or not we are doing Empty-On-Exit
- or emptying trash by user request respectively.
-
-2001-08-06 Jason Leach <jleach@ximian.com>
-
- * mail-folder-cache.c (make_folder_name): Removed this function,
- it's not needed anymore.
- (mail_folder_cache_note_folderinfo): Initialize mfi->unread to 0
- always, so the shell won't get sent a random int for vtrash or
- potentially other folders.
-
- * message-list.c (message_list_select): Fix a minor glitch with
- how it started a backwards wraparound at the 2nd to last message,
- skipping the very last message.
-
-2001-08-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.glade: s/character set/character encoding
-
-2001-08-05 Ettore Perazzoli <ettore@ximian.com>
-
- * message-browser.c (message_browser_message_loaded): Make the
- title of the window "subject - Message" instead of just "subject".
- Also, display "(No subject)" if the subject is NULL.
-
- [Fix #6399, 8-bit characters are not displayed in window title.]
-
- * message-browser.c (message_browser_message_loaded): Convert the
- subject from UTF-8 to GTK.
-
-2001-08-05 Ettore Perazzoli <ettore@ximian.com>
-
- [Revert the previous changes, there seems to be something wrong
- with it.]
-
- * component-factory.c (component_factory_init): Back to using
- `bonobo_generic_factory_new()'.
- (component_fn): Updated accordingly.
-
-2001-08-04 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (component_factory_init): Use
- `e_bonobo_generic_factory_multi_display_new()' instead of just
- `bonobo_generic_factory_new()'.
- (component_fn): Added @component_id arg.
-
-2001-08-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (mail_part_is_inline): Add yet another
- special-case hack for application/pgp.
-
-2001-08-04 Jason Leach <jleach@ximian.com>
-
- * message-list.c (message_list_select): Add a @wraparound
- argument, so the 'n' and 'p' keypresses (or anything else that
- wants to) can wrap around to find the next unread.
-
- * folder-browser.c (on_key_press): Tell it to wrap around here.
-
- * mail-callbacks.c (delete_msg): Don't wrap around here (or the
- other callbacks in this file).
-
-2001-08-03 Jason Leach <jleach@ximian.com>
-
- * mail-folder-cache.c (update_idle): Updates for EvolutionStorage
- API changes.
-
- * mail-importer.c (mail_importer_create_folder): Ditto.
-
- * mail-local.c: Same here.
-
-2001-08-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (build_auth_menu): Try to restore the choice
- the user had chosen before hitting the "Check Supported Types"
- button.
-
- * mail-format.c (write_headers): Removed a no-longer-needed
- g_warning.
-
-2001-08-03 Not Zed <NotZed@Ximian.com>
-
- * mail-session.c (get_password): return the source url for
- popb4smtp auth request.
-
-2001-08-02 Jon Trowbridge <trow@ximian.com>
-
- * mail-ops.c (filter_folder_describe): Added. Provide
- description for filter_folder_op.
- (fetch_mail_describe): Added. Provide description for
- fetch_mail_op.
-
- * message-list.c (regen_list_describe): Added. Provide
- description for regen_list_op.
-
- * mail-config.c (check_service_describe): Added. Provide
- description for check_service_op.
-
- * folder-info.c (do_describe_info): Added. Provide description
- for get_info_op.
-
-2001-08-02 Larry Ewing <lewing@ximian.com>
-
- * mail-send-recv.c (format_url): handle null paths in the dialog
- so that we avoid printing NULL strings
-
-2001-08-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (filter_edit): Raise the filter-editor window
- if it's already created.
-
- * folder-browser.c (message_list_drag_data_received): I obviously
- can't spell recieved, er, received...uh, yea.
-
-2001-08-02 Jason Leach <jleach@ximian.com>
-
- * mail-config.glade: Set history_id's for the sig and html sig
- gnome file entry boxes so it can persist history, also add titles
- to the dialogs that popup when you click the "Browse..." button.
- Bug #5595.
-
-2001-08-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-vfolder.c (vfolder_create_storage): Connect to the
- folder_remove signal on the storage.
- (vfolder_remove): New function to remove a vfolder.
- (vfolder_edit): Raise the window if it already exists.
-
-2001-08-02 Not Zed <NotZed@Ximian.com>
-
- * Makefile.am (INCLUDES): Add EVOLUTION_BUTTONSDIR to get to some
- different icons.
-
- * mail-ops.c (mail_sync_folder): Queue the folder sync operation,
- rather than running it in parallel.
-
- * mail-send-recv.c: applies anna's patch for prettier send-recv
- dialogue.
- (parse_url): Renamed to format_url, fixed callers.
- (format_url): Use camel_url_free instead of g_free, also handle
- case where we have no host (use path instead).
- (build_dialogue): Cleaned up some whitespace.
- (build_dialogue): Create the label directly with the right text,
- dont set any text in the progress bar, and save the label into the
- info struct for later updating.
- (struct _send_info): Added 'status' the label with the status
- string.
- (operation_status_timeout):
- (receive_done):
- (receive_cancel): Set the status label, not the progress format
- text.
- (hide_send_info): NULL out status too.
- (mail_receive_uri): Init status.
- (free_folder_info): Initiate a folder sync here, so we can ...
- (free_send_data): ... Remove the awful hack of iterating through
- bonobo controls to sync all open folders.
- (free_send_data): Initiate a sync of the inbox too.
- (build_dialogue): Remove set_alignment on the icon, its not a
- gtkmisc object.
-
-2001-08-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (folder_browser_copy): Do the Right Thing (tm)
- if the message list is not the widget in focus (which is to copy
- the text selected in the html viewer instead). Fixes bug #5868.
-
-2001-08-01 Jason Leach <jleach@ximian.com>
-
- * folder-browser-ui.c: Use the new Save As and Message Search
- icons from Jakub.
-
- * mail-callbacks.c (delete_msg): Don't move cursors around when
- deleting last message and Hide Deleted Messages isn't enabled.
- Bug #5928.
-
-2001-07-31 Anna Marie Dirks <anna@ximian.com>
-
- * mail-mt.c (do_get_pass): Changed the title of this dialog
- to "Enter Password".
-
-2001-07-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-mt.c (do_get_pass): We are not guarenteed to have a
- non-NULL service (ie. PGP) thus check for it.
- (pass_got): And again here.
- (mail_get_password): And of course here too.
-
- * mail-format.c (decode_pgp): When writing out a CamelException to
- the HTML stream, be sure to translate it first.
- (handle_message_external_body): Convert to UTF8 here too - I know
- this function is basically a dead end right now but eventually we
- will want to do something. I mostly did this because param values
- are UTF8 encoded so we should avoid mixing and matching UTF with
- non UTF8.
- (format_mime_part): Avoid writing non-UTF8 to the HTML stream.
-
- * mail-tools.c (mail_tool_make_message_attachment): Convert
- translated strings to UTF8 here too.
- (mail_tool_forward_message): Here too.
-
-2001-07-23 Zbigniew Chyla <cyba@gnome.pl>
-
- * mail-format.c (attachment_header, write_address, decode_pgp,
- mail_write_authenticity):
- Convert translated strings to UTF8 before calling mail_html_write.
-
- I modified the patch slightly and cleaned up bits of code around
- it as well. For example, we probably want to avoid having HTML
- tags in the strings to be translated. -- fejj
-
-2001-07-30 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_new): Restore old security
- settings from the saved configuration. Fixes bug #5710.
-
-2001-07-30 Not Zed <NotZed@Ximian.com>
-
- * mail-session.c (do_register_timeout): Actually add the timeout,
- this time in the gtk thread.
- (do_remove_timeout): And same for remove.
- (register_timeout):
- (remove_timeout): Proxy the gtk calls to the main thread, and
- wait for them to execute synchronously.
- (register_timeout): Instead of return with fail for a too small
- timeout, just increase the timeout.
-
-2001-07-27 Zbigniew Chyla <cyba@gnome.pl>
-
- * component-factory.c (populate_folder_context_menu): Added (unused)
- table with strings intended to be translated (i18n tools can't extract
- strings from XML data inside .c file).
-
-2001-07-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-mt.c (focus_on_entry): Don't need this anymore.
- (do_get_pass): Since we already have the entry widget, no need to
- do the nasty focus_on_entry hack.
-
-2001-07-26 Peter Williams <peterw@ximian.com>
-
- * mail-mt.c (do_get_pass): Figure out whether we're getting the
- password for the source or the transport, and get the toggle
- button accordingly.
- (pass_got): Same.
-
- * mail-config.c (mail_config_get_account_by_transport_url): New
- function. Cut + paste + search + replace of _by_source_url.
-
- * mail-config.h: Prototype here.
-
-2001-07-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (message_list_drag_data_get): If we don't have
- any messages selected, break out. This fixes bug #5612.
-
- * component-factory.c (xfer_folder): Fixed a strstr (url,
- "noselect=yes") brokenness.
- (destination_folder_handle_motion): Same.
- (destination_folder_handle_drop): And again here.
-
- * mail-format.c (handle_application_pgp): Implemented.
- (setup_mime_tables): Setup the application/pgp handler to use
- handle_application_pgp instead of handle_text_plain.
- (handle_text_plain): Remove special-case hacks for application/pgp
- types.
-
- * mail-config.glade: beautification.
-
-2001-07-26 Peter Williams <peterw@ximian.com>
-
- * mail-mt.c (do_get_pass): Use magic to make the password
- remembering checkbutton come after the entry, visually.
-
-2001-07-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (write_headers): Respect Gtk theme colors for the
- fonts and calculate a new table gbcolor based on gtk theme
- preferences.
-
- * mail-config.glade: Label the enabled field.
-
-2001-07-26 Peter Williams <peterw@ximian.com>
-
- * message-list.etspec: Make the date column smaller and the
- subject column larger, relatively.
-
- * mail-folder-cache.c (make_folder_status): Don't display "0
- hidden".
-
- * folder-browser.c (on_key_press): Make 'q' a toggle, not one-way.
-
- * message-list.etspec: Rename "Date" column to "Sent".
-
-2001-07-25 Anna Marie Dirks <anna@ximian.com>
-
- * mail-config.glade: fixed a mis-spelling of "Fashion" in the mail
- accounts window. (See bug 5433)
-
-2001-07-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-session.c (make_key): Don't make the key url:item if we
- have the url, just make it url. This fixes bug #5339.
- (mail_session_set_password): Removed.
-
-2001-07-25 Peter Williams <peterw@ximian.com>
-
- * folder-browser.c (etree_key): Make it so Enter always opens the
- message in another window.
-
-2001-07-25 Peter Williams <peterw@ximian.com>
-
- * mail-mt.c (mail_get_password): Now take a CamelService parameter
- (as passed by Camel). Allows us to have a "remember password"
- checkbox that is set correctly and whose settings can be
- propagated back to the proper MailConfigService.
- (do_get_pass): Add a checkbutton allowing the user to change
- whether the password is remembered or not.
- (pass_got): Apply the setting of the "remember password"
- checkbutton (if not cancelled.)
-
- * mail-mt.h: Update the prototype here.
-
- * mail-config.c (mail_config_service_set_save_passwd): New
- function, pretty bland.
-
- * mail-config.h: Prototype our bland new function. (Get it? It's a
- pun!)
-
- * mail-session.c (get_password): Pass the service as well.
-
-2001-07-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (build_auth_menu): Now takes a
- check_supported gboolean argument saying whether or not to disable
- non-supported authtypes.
- (source_type_changed): Update for build_auth_menu.
- (transport_type_changed): Same.
- (service_check_supported): Pass in TRUE for the disable
- non-supported authtypes to build_auth_menu and also disable
- check-supported button and the authtype menu if we get a NULL
- supported auth list.
-
- * mail-callbacks.c (mail_generate_reply): Initialize `me' to NULL.
- (forward_attached): If we are only forwarding a single message,
- pass the message along as the callback data, else pass NULL.
- (do_forward_attach): Updated for changes to
- forward_get_composer().
- (do_forward_non_attached): Same.
- (forward_get_composer): Try to guess which account to forward the
- message from if the message passed in is non-NULL.
-
-2001-07-24 Peter Williams <peterw@ximian.com>
-
- * mail-config.c (mail_config_write): Um, write the HTML signature
- settings in the right place. Whoops.
-
-2001-07-24 Jason Leach <jleach@ximian.com>
-
- * mail-callbacks.c (delete_msg): If we're deleting the last
- message, select the previous, not next, which actually selects
- nothing. Fixes #5323.
-
-2001-07-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (save_part_save): Pass the O_TRUNC flag to open so
- that we don't leave trailing garbage at the end of the file if the
- new file content is shorter than the old file content.
-
- * component-factory.c (create_view): Fix for bug #5174.
-
-2001-07-24 Jason Leach <jleach@ximian.com>
-
- * mail-config.c (config_read): Match the prefix for the
- "remember_passphrase" setting with where it's being saved to
- (/Mail/Prompts), so the setting gets loaded correctly. Fixes
- #5351.
-
-2001-07-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (handle_text_plain): check_specials if this is an
- application/pgp type as well.
-
- * mail-ops.c (add_vtrash_info): When dumping the CamelURL to a
- string, hide all the params.
-
-2001-07-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (guess_me): Do a case-insensitive comparison.
- (mail_generate_reply): Only resort to the source account's
- identity if we can't find out which identity to use based on the
- recipients of the message first.
-
- * mail-config.c (mail_config_get_default_account): Make sure to
- return the 0th account if we don't have a default. We don't want
- to return NULL.
-
- * mail-callbacks.c (empty_trash): Use mail_tool_get_trash for the
- remote store trash folders.
-
- * mail-tools.c (mail_tool_get_trash): New convenience function.
-
-2001-07-24 Jason Leach <jleach@ximian.com>
-
- * mail-config.c (config_read): get_boolean_with_default for the
- "Mark as read" timeout, not get_long_with_default. Fixes #5176.
-
-2001-07-24 Peter Williams <peterw@ximian.com>
-
- * mail-folder-cache.c (make_folder_name): Don't display "(0 unsent)" if
- the outbox is empty.
-
- * mail-local.c (init_trash): Set up the local trash in the folder
- cache.
-
- * mail-folder-cache.c (update_idle): Make the error reporting a little
- but more descriptive.
-
-2001-07-24 Peter Williams <peterw@ximian.com>
-
- * mail-config.glade: Add new label widgets with a message that SSL
- isn't supported.
-
- * mail-account-gui.h: Add a new member to the Transport GUI struct
- for the 'SSL is not supported' message.
-
- * mail-account-gui.c (source_type_changed): Change logic to display
- a message stating that SSL isn't supported if SSL isn't supported.
- (transport_type_changed): Same.
- (mail_account_gui_new): Also load the labels for the the no-SSL
- message.
-
- * mail-accounts.c (construct): Fix typo.
-
-2001-07-24 Not Zed <NotZed@Ximian.com>
-
- * component-factory.c (create_folder): Dont call notifyResult here
- if we've just launched a thread to do the work, it calls it
- itself. This apparently breaks the importers, but thats a
- different issue.
-
-2001-07-23 Not Zed <NotZed@Ximian.com>
-
- * mail-mt.c (mail_msgport_replied): Go back to calling
- mail_msg_free here.
- (mail_msg_destroy): Remove the operation unregistration stuff.
- (mail_msg_received): And put it here, so we unregister as soon as
- the async part of the operation is complete. I thought about this
- and we should be doing this anyway so we register/unregister
- always in the same thread, although the camel_operation api
- doesn't enforce it, this *is* what it expects.
-
- * message-list.c (regen_list_regen): re-add reporting to
- rebuilding the message list. Basically fixes #4931
-
-2001-07-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-search.c (toggled_fwd_cb): Oops. Uncomment this code since
- Trow fixed GtkHTML to actually have this function now.
-
- * mail-config.glade: Fixed the "Read" to be Read in the glade file
- per menesis' request.
-
- * mail-accounts.c (construct): Give the dialog a Close button
- instead of an OK button.
- (prompt_bcc_only_toggled): New.
- (threaded_list_toggled): New.
- (show_preview_toggled): New.
- (construct): Add code for the bcc-only-prompt, threaded-list, and
- show-preview checkboxes.
-
- * mail-ops.c (transfer_messages_transfer): If the source and
- destination folders are the same, just mark the uids as undeleted
- (in case they were marked as deleted before).
-
-2001-07-23 Jon Trowbridge <trow@ximian.com>
-
- * mail-search.c (begin_cb): Carefully check for NULL everywhere,
- and do the right thing if the message we are currently looking at
- gets expunged. (Bug #4870)
-
-2001-07-23 Jason Leach <jleach@ximian.com>
-
- [Bug #5225: No UI way to mark as unimportant]
-
- * folder-browser.c (on_right_click): Do the necessary stuff to
- show or hide the correct "Mark Important" or "Mark as Unimportant"
- menu items depending on the status of messages that are selected.
-
- * folder-browser-ui.c: Add the MarkAsUnimportant verb here.
-
- * mail-callbacks.c (mark_as_unimportant): Simple function that's
- the callback for these new menu items.
-
-2001-07-22 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (remove_folder): Updated to get a @type
- argument. Return an error if the type isn't "mail".
- (xfer_folder): Likewise.
-
-2001-07-21 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c: Make types "mailstorage" and "vtrash"
- non-user-creatable.
-
-2001-07-20 Jason Leach <jleach@ximian.com>
-
- * mail-summary.c (generate_html_summary): Change this back to the
- "evolution:/local/Inbox" URI.
-
-2001-07-20 Peter Williams <peterw@ximian.com>
-
- * component-factory.c (storage_remove_folder): Don't let the user
- remove vtrash folders.
-
-2001-07-20 Peter Williams <peterw@ximian.com>
-
- * mail-mt.c (mail_msgport_replied): Fix DanW's fix. Pass the right
- arguments to mail_msg_destroy.
-
- * component-factory.c (component_fn): Don't populate the context
- menu; our only action didn't even work.
- (populate_folder_context_menu): Removed. ChangeFolderProperties
- needs a FolderBrowser which we don't have. It didn't even work
- before.
-
- * mail-local.c (mail_local_reconfigure_folder): Bring the creation
- of the hash table to the beginning to prevent warnings. Complain
- if the mailbox is non-local.
-
-2001-07-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (filter_folder_filter): Don't expunge the source
- folder if we have a cache.
-
-2001-07-20 Dan Winship <danw@ximian.com>
-
- * mail-mt.c (mail_msgport_replied): Use mail_msg_destroy rather
- than mail_msg_free, so the cancellation operation gets
- unregistered and doesn't leak two file descriptors.
-
-2001-07-19 Jason Leach <jleach@ximian.com>
-
- * mail-summary.c (generate_html_summary): Update this
- evolution:/local/ URI to evolution:/Local Folders/ to go along
- with today's shell changes.
-
-2001-07-19 Jason Leach <jleach@ximian.com>
-
- * mail-display.c: Fix #4605: "Save Image as" should be "Save Image
- as...".
-
-2001-07-19 Jason Leach <jleach@ximian.com>
-
- * mail-display.c (mail_display_new): Set the vertical scrolling
- policy for the mail display to AUTOMATIC, only get a scrollbar if
- the e-mail is longer than one frame.
-
- * folder-browser.c (my_folder_browser_init): We were setting the
- policy twice (and to two different things). Removed this one.
-
- * message-list.c (message_list_init): Set the policy for the
- message list scroll frame to be horizontal=NEVER,
- vertical=AUTOMATIC (scrollbar only if you have >1 page of
- messages).
-
-2001-07-19 Peter Williams <peterw@ximian.com>
-
- Track the NoSelect changes in Camel.
-
- * mail-callbacks.c (create_folders): We don't need to check if
- the URL is NULL or not anymore.
-
- * component-factory.c (create_noselect_control): New
- function. Create a dummy control for folders that can't contain
- messages (ie \NoSelect)
- (create_view): If the URI says the folder is noselect, make a
- dummy control. FIXME: still should merge in the global UI
- elements.
- (xfer_folder): Don't allow the operation if the destination is
- NoSelect.
- (destination_folder_handle_motion): Ditto.
- (destination_folder_handle_drop): Ditto.
-
-2001-07-19 Not Zed <NotZed@Ximian.com>
-
- * mail-local.c (reconfigure_folder_reconfigure): remvoed
- register/start/end etc code.
-
- * mail-ops.c (get_messages_desc): Add the count here.
- (get_messages_get): Remove the register/start code, its handled
- above us.
- (save_messages_desc): Added count.
- (save_messages_save): Removed register/start/end code.
-
- * mail-mt.c (mail_msg_received, mail_msg_destroy): Changed to use
- camel_operation rather than mail_status.
- (mail_msgport_received, mail_msgport_replied): Turn of the
- mail_status stuff, we dont need to report on stuff running in the
- gui thread right?
- (retrieve_shell_view_interface_from_control, set_view_data,
- mail_statusf, mail_status, mail_status_end, mail_status_start,
- status_timeout, do_del_status, set_status_op): removed now
- redundant stuff.
- (mail_msg_free): Removed reference to timeout_id.
-
-2001-07-18 Not Zed <NotZed@Ximian.com>
-
- * mail-local.c (reconfigure_folder_reconfigure): Changed to use
- camel_operation rathre than mail_status.
- (reconfigure_folder_describe): re-enabled this function.
-
- * mail-ops.c (get_messages_get): Changed to use camel-progress for
- status reporting.
- (save_messages_save): Likewise.
-
-2001-07-17 Not Zed <NotZed@Ximian.com>
-
- * mail-mt.c (struct _mail_msg_priv, destroy_objects, mail_msg_new,
- mail_msg_free, do_op_status): Changed to use an EvolutionActivityClient for
- progress.
-
-2001-07-18 Jason Leach <jleach@ximian.com>
-
- * mail-tools.h (mail_tool_get_local_inbox_url): Remove this
- prototype for a function that was removed long ago.
- (mail_tool_get_local_movemail_url): Ditto.
-
-2001-07-18 Jason Leach <jleach@ximian.com>
-
- [Simplifying how default account is stored and used internally,
- fixes possabilities of having multiple default accounts and things
- like deleting the current default account]
-
- * mail-account-gui.c (mail_account_gui_new): Update for new way of
- finding out the default account.
- (mail_account_gui_save): Ditto.
-
- * mail-accounts.c (load_accounts): Ditto.
-
- * mail-config-druid.c (make_default_account): Ditto.
-
- * mail-config.c: Added an int MailConfig::default_account, to be
- used instead of a 'default_account' boolean on each mail account.
- (mail_config_set_default_account_num): New function, facilitates
- things.
-
- * Mail.idl: removed the Account::default_account boolean.
-
-2001-07-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-tools.c (mail_tool_generate_forward_subject): Do what was
- suggested in #4596.
-
-2001-07-18 Peter Williams <peterw@ximian.com>
-
- * mail-accounts.c (construct): Add GTK_WIDGET to the charset
- picker. Reportedly prevent a craash for someone... ?
-
- * mail-config.glade: Typo fix.
- Later: And actually fix the typo.
-
-2001-07-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (mail_delete): Setup the auto-receive here
- instead.
-
- * mail-config.c (mail_config_remove_account): Don't setup the
- auto-recv here.
-
-2001-07-17 Iain Holmes <iain@ximian.com>
-
- * mail-accounts.c (mail_able): Reset the auto receive.
-
- * mail-config.h (mail_config_remove_account): Reset the autoreceive.
-
-2001-07-17 Jason Leach <jleach@ximian.com>
-
- * mail-account-gui.c (source_type_changed): Fix for last change:
- hide the entire widget, not just the entry.
-
-2001-07-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (message_list_drag_data_recieved): Fix to
- correctly handle text/uri-lists that contain more than a single
- url.
-
- * component-factory.c (destination_folder_handle_drop): Fix to
- correctly handle text/uri-lists that contain more than a single
- url.
-
-2001-07-17 Jason Leach <jleach@ximian.com>
-
- * mail-config.glade: Make the Path: entry into a GnomeFileEntry so
- you get a nice "Browse..." button that pops up a file selector to
- locate your mbox files. Bug #3501.
-
-2001-07-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (mail_part_toggle_displayed): Cleaned up a bit.
- (handle_multipart_encrypted): Replace the encrypted part with the
- decrypted part.
-
-2001-07-17 Iain Holmes <iain@ximian.com>
-
- * mail-accounts.c (mail_delete): Make a nicer dialog.
-
-2001-07-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-local.c (init_trash): Use CAMEL_VTRASH_NAME.
-
- * mail-ops.c (add_vtrash_info): Use CAMEL_VTRASH_NAME.
-
- * folder-browser.c: turned off some debugging
-
-2001-07-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (transfer_msg): Disallow vtrash for now...
-
- * mail-ops.c (add_vtrash_info): Use g_strcasecmp() when looking
- for a Trash folder - it may be lowercase or something funky.
- (transfer_messages_transfer): Special-case vtrash folders.
-
- * mail-local.c (init_trash): No need to specify the vfolder
- expression here. This code was moved into camel-vtrash-folder.c
- ages ago.
-
- * component-factory.c: Let VTrash folders accept/export the same
- dnd types as normal folders.
-
-2001-07-16 Peter Williams <peterw@ximian.com>
-
- * mail-folder-cache.c (outbox_folder): prototype outbox_folder so
- we can check if a folder is it.
- (make_folder_name): If the folder is the outbox, display the count
- of total messages as "unsent".
- (make_folder_status): If the folder is the outbox, display
- "unsent" instead of "total"
-
-2001-07-16 Peter Williams <peterw@ximian.com>
-
- * mail-display.c (mail_display_redisplay): Use our own
- display_style member instead of the global setting.
- (mail_display_init): Initialize display_style.
-
- * mail-display.h: Include "mail-config.h" and add a display_style
- member.
-
- * mail-format.c (write_headers): Look at the MailDisplay's
- display_style instead of using the full_headers data.
-
- * folder-browser.c (folder_browser_set_message_display_style): Set
- the MailDisplay's display style as well as the global display
- style.
- (my_folder_browser_init): Don't save preference changes by
- default. (This is only observered wrt. the message display style
- but should apply to other items.)
-
- * folder-browser-factory.c (folder_browser_factory_new_control):
- Set this FB to save the preferences set in it.
-
- * folder-browser-ui.c (folder_browser_ui_add_message): Read our
- display's state instead of the global setting.
-
-2001-07-16 Peter Williams <peterw@ximian.com>
-
- * mail-folder-cache.c (mail_folder_cache_set_folder_browser): DUH.
- No need to update every folder if we set the folder browser to
- NULL.
-
-2001-07-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_save): Call
- mail_autoreceive_setup() so that any changes to the list of
- accounts will be respected the next time mail is checked.
-
-2001-07-13 Peter Williams <peterw@ximian.com>
-
- * mail-callbacks.c (expunge_folder): Segfault prevention here if
- no uid is currently loaded.
-
- * mail-vfolder.c (unlist_vfolder): New function. If a vfolder in
- our list gets finalized, NULL out info->folder (Is it wrong if
- this happens?) Also, locking issues?
- (vfolder_uri_to_folder): Hook up to the finalize event here.
-
-2001-07-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (filter_folder_filter): Updated to reflect changes in
- the filter API by passing in the provided uid cache to
- camel_filter_driver_filter_folder.
- (mail_filter_folder): Set the cache to NULL.
- (mail_fetch_mail): Set the cache to NULL.
- (fetch_mail_fetch): If a cache exists for this folder, set
- it. When we are finished filtering the incoming messages, the
- logic changes a bit. We now save the cache if keep_on_server is
- set *or* if there was an exception this way if the user's download
- gets interrupted, he won't have to download all the messages
- again.
- (fetch_mail_fetch): Oh yea, and just so if we get an exception
- with `delete' turned on, the next time the user checks mail and an
- exception *doesn't* occur, it will go back and mark all the
- messages for deletion.
-
-2001-07-12 Iain Holmes <iain@ximian.com>
-
- * importers/evolution-mbox-importer.c (load_file_fn): Check that
- the folder does exist before trying to import it.
-
-2001-07-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (expunge_folder): Force-hide all deleted
- messages before expunging.
- (expunged_folder): Restore the user's "hide deleted messages"
- preference.
-
-2001-07-12 Jason Leach <jleach@ximian.com>
-
- * mail-callbacks.c (expunge_folder): Only blank the mail display
- if the message being viewed is one of those to be expunged. Bug
- #4030.
-
-2001-07-12 Jason Leach <jleach@ximian.com>
-
- * mail-config.c (config_read): Should be saving the
- 'identity_html_signature' and 'identity_has_html_signature" keys
- in the /Mail/Accounts prefix (with the rest of the per-account
- stuff, not on it's own)
-
-2001-07-11 JP Rosevear <jpr@ximian.com>
-
- * mail-display.c (get_embedded_for_component): no longer need to
- set a my address property
-
-2001-07-10 Federico Mena Quintero <federico@ximian.com>
-
- * mail-display.c (link_copy_location): Set the CLIPBOARD selection
- as well as the primary selection so that Edit/Paste will work in
- other programs (e.g. Netscape).
- (mail_display_new): Add the target for the CLIPBOARD selection.
-
-2001-07-10 Jason Leach <jleach@ximian.com>
-
- [Bug #4305: Make the automatic mark-as-read timer optional]
-
- * mail-config.glade: Necessary changes to make the Mark as "Read"
- label a toggle button instead.
-
- * mail-accounts.c (construct): Connect to the "toggled" on our new
- toggle.
- (timeout_toggled): New callback, called from above.
-
- * mail-config.c (mail_config_get_do_seen_timeout): New.
- (mail_config_set_do_seen_timeout): New.
- (mail_config_write_on_exit): Save the preference here.
- (config_read): Load it here.
-
-2001-07-10 JP Rosevear <jpr@ximian.com>
-
- * folder-browser.c: Cosmetic patch - replace our defines with the
- e-popup ones
-
- * Makefile.am: Typo
-
-2001-07-10 Peter Williams <peterw@ximian.com>
-
- * mail-format.c (attachment_header): Took the logic of whether or
- not to make the attachment header out of the actual function.
- (mail_part_is_displayed_inline): Return if the part is being
- displayed inline (regardless of whether it is actually inline).
- (mail_part_toggle_displayed): Toggle whether it's displayed inline
- or not.
- (get_inline_flags): Determine whether the part is displayed inline
- and whether it is actually inline.
- (mail_format_mime_message): Initialize the attachment_status hash
- table.
-
- * mail-display.c (inline_cb): Instead of modifying the
- CamelMimePart, use mail_part_toggle_displayed
- (button_press): As above.
- (pixmap_press): Use mail_part_is_displayed_inline instead of
- mail_part_is_inline. Get the MailDisplay from the popup to do
- this.
-
- * mail.h: Add prototypes.
-
-2001-07-10 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: extra dist the news files
-
-2001-07-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_write_on_exit): Use
- bonobo_config_set_string_wrapper.
- (mail_config_write): Same.
- (bonobo_config_set_string_wrapper): Macro wrapping
- bonobo_config_set_string that passes "" as the val if the val is
- NULL.
-
- * mail-callbacks.c (mail_generate_reply): Make sure that the
- reply-to addr i non-NULL before trying to add it to the hash
- table.
-
-2001-07-09 JP Rosevear <jpr@ximian.com>
-
- * mail-account-gui.c (get_focused_widget): fix typo so it compiles
-
-2001-07-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (setup_mime_tables): Handle application/pgp using
- the text/plain handler.
-
- * mail-account-gui.c (get_focused_widget): New function to
- determine which widget is focused.
-
- * mail-account-editor.c (apply_changes): Not only flip to the
- notebook page that wasn't finished, but also grab the focus of the
- incomplete widget.
-
- * mail-config-druid.c (source_changed): Grab the focus of the
- incomplete widget.
- (transport_prepare): And here.
- (identity_changed): Here too.
-
- * mail-account-gui.c (mail_account_gui_identity_complete): Take an
- incomplete argument so we can set which widget is incomplete and
- then the caller can focus it or whatever.
- (service_complete): Same.
- (mail_account_gui_transport_complete): And again here.
- (mail_account_gui_management_complete): And here too.
-
-2001-07-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (decode_pgp): Update to pass in the `remember'
- argument when creating a new pgp context.
- (try_inline_pgp_sig): And here...
-
- * mail-crypto.c (mail_crypto_pgp_mime_part_sign): Update to pass
- in the `remember' argument when creating a new pgp context.
- (mail_crypto_pgp_mime_part_verify): Same.
- (mail_crypto_pgp_mime_part_encrypt): And here...
- (mail_crypto_pgp_mime_part_decrypt): And finally here.
-
- * mail-config.c (mail_config_get_remember_pgp_passphrase): New.
- (mail_config_set_remember_pgp_passphrase): New.
- (config_read): Read in the "remember passphrase" value.
- (mail_config_write_on_exit): Save the remember-passphrase value.
-
- * mail-accounts.c (construct): Allow the user to set "Remember PGP
- Passphrase".
- (remember_pgp_passphrase_toggled): Set the toggle state.
-
-2001-07-09 Peter Williams <peterw@ximian.com>
-
- * mail-ops.c (get_folderinfo_got): Check for an exception and
- print it. Call done anyway.
- (do_update_subfolders): Check for NULL info.
-
-2001-07-09 Peter Williams <peterw@ximian.com>
-
- * mail-config.c (mail_config_write): Some NULL protection for our
- strings: pgp_key, html_signature, smime_key. Probably we should do
- this for all strings. Either that or change Bonobo Config.
-
- * message-list.c (message_list_init): Explicitly initialize search
- to NULL. Bug 3951 might to be due to a problem wrt this, and it
- can't hurt.
-
-2001-07-09 Dan Winship <danw@ximian.com>
-
- * mail-display.c (save_part): g_strdup the result of
- g_get_home_dir since this variable will get free'd later.
-
- * mail-format.c (mail_lookup_handler): Use
- gnome_vfs_mime_get_short_list_applications rather than
- gnome_vfs_mime_get_default_application.
-
- * mail-display.c (pixmap_press): Construct the EPopupMenu array on
- the fly, based on the number of applications available to open the
- MIME type.
- (launch_cb): Figure out which menu item was clicked, and invoke
- the appropriate application. Ugh, messy, because of the EPopupMenu
- interface. Probably should get rewritten some day. Also, make this
- handle apps with expects_uris set too.
-
-2001-07-09 Peter Williams <peterw@ximian.com>
-
- * mail-config.c (mail_config_write): Change html_signature stuff
- over to bonobo-config -- someone forgot to do this.
-
- * mail-folder-cache.c (dm): Gave up and got rid of dm. Just
- replaced it with d(g_message()) and set G_LOG_DOMAIN.
-
-2001-07-09 Peter Williams <peterw@ximian.com>
-
- * mail-folder-cache.c (mail_folder_cache_set_update_shellview):
- Deleted
- (as opposed to #if 0)
- (get_folder_info): Changed to assume it has the folder lock.
- (make_folder_name): Same.
- (make_folder_status): Same.
- (update_idle): Don't unlock around the make_folder_ functions.
- (*): Changed behavior wrt. get_folder_info. Lock before calling,
- but also move preconditions before -- get_folder_info can only
- return NULL if uri is NULL. Also add preconditions for other
- arguments where necessary.
-
-2001-07-07 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.c (on_cursor_activated_cmd): Check for new_uid !=
- NULL here before strcmping.
-
-2001-07-07 Dan Winship <danw@ximian.com>
-
- * main.c (main): Only install the segv_redirect handler if SEGV's
- handler is not currently SIG_DFL. Otherwise you get an infinite
- SEGV loop if you run with GNOME_DISABLE_CRASH_DIALOG.
-
-2001-07-07 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.c (message_list_select): Made this handle being
- given a row that's outside the range better.
-
-2001-07-06 Jason Leach <jleach@ximian.com>
-
- [Fix bug #1100, default account is stored strangely]
-
- * mail-config.c (mail_config_get_default_account_num): New
- function, returns the integer of the position of the default
- account, used to save which account is the default to the config
- db.
- (mail_config_write): Save the default account number here in
- "/Mail/Accounts/default_account".
- (config_read): Load in which is the default here.
-
-2001-07-06 Larry Ewing <lewing@ximian.com>
-
- * mail-callbacks.c (composer_send_cb): add a NULL check since that
- is a valid return.
-
-2001-07-06 Peter Williams <peterw@ximian.com>
-
- * mail-format.c (format_mime_part): Prevent infinite recursion when
- viewing attachments that we can't / shouldn't display but are some
- form of plaintext. Cf bug #2234
-
-2001-07-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (folder_browser_copy): Freeze and Thaw the
- folder.
-
-2001-07-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (folder_browser_copy): Mark the messages as
- Seen also.
- (folder_browser_class_init): Create an atom type for
- X-Evolution-Message selection type.
- (my_folder_browser_init): Add our multiple selection types, one of
- which is the default string type.
-
- * component-factory.c (destination_folder_handle_drop): Update to
- use the new X-Evolution-Message type format.
-
- * folder-browser.c (selection_get): Convert the
- X-Evolution-Message clipboard type to whatever format the target
- wants.
- (message_list_drag_data_get): Update because the
- X-Evolution-Message type changed.
- (folder_browser_copy): Same.
- (x_evolution_message_parse): And here too.
-
-2001-07-06 Peter Williams <peterw@ximian.com>
-
- * mail-callbacks.c (composer_postpone_cb): Don't free the psd here --
- it will be freed on the "destroy" signal.
-
- * mail-folder-cache.c (maybe_update): Instead of an idle, use a very
- short timeout in hopes of reducing the number of redundant updates.
-
- * mail-tools.c (mail_tool_uri_to_folder): Only note the folder in the
- cache if we successfully got it.
-
-2001-07-06 Jason Leach <jleach@ximian.com>
-
- * mail-callbacks.c (delete_msg): Select the very next message
- after deleting, not the next undeleted (it can make things jump
- around in annoying ways if you are deleting many messages), bug #4032.
-
- * folder-browser.c: Forgot to commit the "Mark as Important" right
- click menu item.
-
- * message-list.c (message_list_set_folder): Setup the strikeout
- column here (after we've gotten the folder) so we can disable
- strikeouts for vtrash folders, part of bug #2224.
-
-2001-07-06 Dan Winship <danw@ximian.com>
-
- * mail-folder-cache.c (mail_folder_cache_set_folder_browser): Fix
- obvious bug in previous bugfix: Pass "fb" to check_for_fb_match()
- so only the selected folder gets updated, instead of "all folders
- that haven't yet been selected".
-
-2001-07-06 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (populate_folder_context_menu): New function
- to populate the right-click menu for mail folders.
- (component_fn): Pass it to `evolution_shell_component_new()'.
-
-2001-07-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (construct): Add a checkbox for prompting when
- sending a message with an empty subject.
-
- * mail-ops.c (mail_send_message): If filtering fails, return right
- away.
-
- * mail-config.c (mail_config_set_show_preview): Okay, apparently I
- was wrong. Oh well.
- (mail_config_set_thread_list): Fix this one too.
-
-2001-07-05 Peter Williams <peterw@ximian.com>
-
- * mail-vfolder.c (vfolder_uri_to_folder): Add mail folder cache
- hookups.
-
- * Makefile.am: Remove the ridiculuous relic known as
- test-mail. Clean up a bit.
-
- * mail-vfolder.c (vfolder_uri_to_folder): Add mail folder cache
- hookups.
-
-2001-07-05 Peter Williams <peterw@ximian.com>
-
- * mail-folder-cache.c (mail_folder_cache_set_folder_browser):
- Clear the shell view label if mailer loses focus.
-
- * mail-ops.c (do_update_subfolders_rec): Check for NULL url before
- calling folder cache functions.
-
-2001-07-04 Gediminas Paulauskas <menesis@delfi.lt>
-
- * folder-browser-ui.c (message_pixcache): set icon for
- ApplyFilters command.
-
-2001-07-04 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_set_show_preview): Revert Sam's
- changes.
-
- Note: Uhm, g_hash_table_lookup_extended gives us a pointer to the
- original value which we can just change to update the hash table
- without the need to re-insert - it's already there!! Also, you
- don't want to g_hash_table_insert the new value with the same key
- without at least first removing the existing bucket. And, you
- certainly don't want to g_free() the key after you insert it -
- eek!!
-
-2001-07-03 Sam Creasey <sammy@oh.verio.com>
-
- * mail-config.c (mail_config_set_show_preview): Replace value in
- config->preview_hash when it already exists. Old code never
- re-inserted into the hash, just assigned to val -- it's an int
- here, not a real pointer.
-
-2001-07-03 Joe Shaw <joe@ximian.com>
-
- * mail-callbacks.c (expunge_folder): Unset the message being displayed
- when expunging. This makes expunged messages not show in the preview
- pane when they're not there anymore. Fixes #3591.
-
-2001-07-03 Joe Shaw <joe@ximian.com>
-
- * mail-callbacks.c (mail_reply): If msg is NULL, fetch the message
- and requeue a mail_reply call. Fixes bug #3816.
- (requeue_mail_reply): Callback from mail_get_message().
-
-2001-07-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_get_show_preview): Use a better
- GHashTable technique that will hopefully solve some bugs and also
- use _with_default bonobo-config call.
- (mail_config_set_show_preview): No sense in removing the entry
- from the hash table and then re-inserting it. Just reset the
- value.
- (mail_config_get_thread_list): Use the same logic.
- (mail_config_set_thread_list): And again here.
-
-2001-07-03 Peter Williams <peterw@ximian.com>
-
- * mail-folder-cache.c (make_folder_name, make_folder_status):
- Split make_string into these.
- (update_idle): Use (name and status) instead of (wide and thin)
- for the text.
-
-2001-07-03 Jason Leach <jleach@ximian.com>
-
- * folder-browser-ui.c: "Mark as Important" menu thingy here.
-
-2001-07-03 Peter Williams <peterw@ximian.com>
-
- * folder-browser.c (message_list_drag_data_get): Compile fixes.
- #include errno.h and gnome-dialog-utils.h. s/dirname/tmpdir/
-
-2001-07-03 Peter Williams <peterw@ximian.com>
-
- Prevent folders from appearing to have -1 new messages. Prevent
- nonactive folders from updating the title bar. Make the title bar
- update when switching to an already-opened folder.
-
- * mail-folder-cache.c (update_message_counts): Ignore the value
- for 'unread' if it is -1.
- (get_mail_info_receive): Same
- (mail_folder_cache_note_folderinfo): Same.
- (get_folder_info): Initialize 'fb' to NULL.
- (mail_folder_info): Add 'fb' member.
- (mail_folder_cache_note_fb): Change note_message_list to this.
- (update_idle): Only update the ShellView if the active folder
- browser is the same as the one that the MFI references.
- (mail_folder_cache_set_folder_browser): New function. Use it to
- set the active folder browser. NULL is okay.
- (check_for_fb_match): Called from the above. If the MFI has the
- new folder browser as its view, queue an update.
-
- * mail-folder-cache.h: Fix prototypes.
-
- * mail-callbacks.c (create_folders): Check if fi->url is nonnull.
-
- * folder-browser.c (got_folder): Change to use note_fb instead of
- note_messge_list.
-
- * folder-browser-factory.c (control_activate): Set the folder
- browser
- (control_deactivate): Clear it here.
- (fb_get_svi): Kill some inappropriately cut-n-pasted code.
-
-2001-07-03 Dan Winship <danw@ximian.com>
-
- * mail-config.glade: Rename some of the widgets in the news config
- to not conflict with the mail config stuff, so the mail config
- druid will work again.
-
-2001-07-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (message_list_drag_data_get): Use mkdtemp if we
- have it, else use mktemp but make the code safer than it was
- previously.
-
- * mail-display.c (launch_cb): Free the template string if the
- tempdir failed to be created.
-
- * folder-browser.c (message_list_drag_data_get): Hide the URL
- passwd, auth, and params.
- (folder_browser_copy): Same.
-
-2001-07-03 Dan Winship <danw@ximian.com>
-
- * mail-ops.c (filter_folder_filter): Don't pass a dirty exception
- to camel_folder_sync. Fixes an IMAP filtering crash.
-
-2001-07-02 Sam Creasey <sammy@oh.verio.com>
-
- * mail-account-editor-news.c: Added an MailAccountEditorNews, for
- NNTP configuratuion. Based on MailAccountEditor, but stripped.
-
- * Makefile.am: added mail-account-editor-news.c and
- mail-account-editor-news.h to SOURCES if ENABLE_NNTP is defined.
-
- * mail-accounts.c (load_news): Moved this function, and fixed some
- slight brokenness.
- (news_edit): Added functional code using MailAccountEditorNews
- (news_add): Added functional code using news_edit after
- allocation.
-
- * mail-config.glade: news_editor_window widget added. Used by
- MailAccountEditorNews.
-
- * mail-display.c (save_data_cb): Store the pathname used when
- saving messages so that the next save box will default to the
- previous path.
-
- * message-browser.c (message_browser_new): add signal handler for
- size_allocate on the message browser. Thus new windows are size
- as they were last allocated.
- (message_browser_size_allocate_cb): handler to store allocations.
-
- * message-list.c (message_list_setup_etree): connect to the
- info_changed signals for the state of the message_list->tree.
- Save the folder state to disk, so that when additional
- message_lists are created, they are consistant. e.g. the next
- buttons do the same thing in the browser, and in the message
- viewer after changing sorting options.
-
- * subscribe-dialog.c (build_tree): freeze sc->folder model while
- building the tree. Not doing so takes a very long time over 40000
- newsgroups.
-
-2001-07-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (construct): Setup the Empty Trash On Exit
- widgets.
-
- * mail-config.c (config_read): Option to emtpy trash on exit.
- (mail_config_write_on_exit): Same.
- (mail_config_set_empty_trash_on_exit): Set the option.
- (mail_config_get_empty_trash_on_exit): Get the option.
-
- * component-factory.c (owner_unset_cb): Empty the trash folders if
- the user set the "empty trash on exit" option.
-
-2001-07-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (transfer_msg): Updated for the
- mail_transfer_messages API.
-
- * folder-browser.c (message_list_drag_data_recieved): Update for
- the mail_transfer_messages API.
- (selection_received): Same.
-
- * mail-ops.c (mail_transfer_messages): Renamed from
- mail_do_transfer_messages and also added a callback/data arguments
- since we need it component_factory::xfer_folder.
-
- * component-factory.c (xfer_folder): Use mail_transfer_messages
- instead.
- (destination_folder_handle_drop): Update to pass in a NULL
- callback arg and a NULL data argument to mail_transfer_messages.
-
-2001-07-02 Larry Ewing <lewing@ximian.com>
-
- * mail-display.c (save_part): move the saving logic out of save_cb
- so that we can reuse it for the image saving code.
- (save_cb): call save_part.
- (save_url): new function to resolve an save an html url.
- (image_save_as): save function for images and. Add it to the
- link_menu, and add MASK_URL and MASK_SRC to the structure so that
- we cans show the proper menus.
- (html_button_press_event): call get_src as well to find external
- urls references. Add popup masking.
-
-2001-07-02 Peter Williams <peterw@ximian.com>
-
- * README.async: Add a warning about how wrong this document is.
-
-2001-07-02 Peter Williams <peterw@ximian.com>
-
- * mail-folder-cache.h: New file. Protoypes for the Mail Folder
- Cache, which provides a place for all the disparate pieces of the
- mailer to save bits of information about a folder. Centralizes the
- information display code.
-
- * mail-folder-cache.c: New file. Implements the Mail Folder Cache.
-
- * Makefile.am (evolution_mail_SOURCES): Add the
- mail-folder-cache.{c,h}
-
- * folder-browser-factory.c (fb_get_svi): Copy of that absurdly
- long-named function in mail-display.c that gets the
- GNOME_Evolution_ShellView.
- (control_activate): Set the ShellView for the folder cache.
-
- * folder-browser.c (got_folder): Tell the folder browser about
- this folder.
-
- * mail-callbacks.c (create_folders): Tell the folder cache about
- the new folders.
-
- * mail-local.c (reconfigure_folder_reconfigure): Don't unhook our
- events as we no longer hook them up.
- (register_folder_registered): Tell the folder cache about this
- folder's place in the local storage.
- (register_folder_register): No longer hook events; the Folder
- Cache will do this.
- (local_folder_changed, local_folder_changed_proxy): Move to
- mail-folder-cache.c
- (free_local_folder): No longer unhook events.
-
- * mail-ops.c (do_update_subfolders_rec): Instead of setting the
- folder status ourselves, inform the Folder Cache about the
- changes.
-
- * mail-tools.c (mail_tool_uri_to_folder): Replace danw's cache
- with the new Mail Folder Cache.
- (cache_folder, etc): removed.
-
-2001-07-02 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c: #include widgets/misc/e-charset-picker.h since
- it was moved there from libgal.
-
-2001-07-02 Peter Williams <peterw@ximian.com>
-
- * importers/evolution-mbox-importer.c (mbox_factory_fn): Kill
- irritating "Returning" g_warning.
-
-2001-07-02 Dan Winship <danw@ximian.com>
-
- * mail-session.c (get_filter_driver): Implement this, based on
- code that used to be in mail-ops.c
-
- * mail-ops.c (mail_load_filter_context, setup_filter_driver):
- Moved into MailSession::get_filter_driver.
- (filter_get_folder): Moved to mail-session.c
- (mail_filter_folder, mail_filter_on_demand, mail_fetch_mail,
- mail_send_mail, mail_send_queue): Remove FilterContext args, use
- camel_session_get_filter_driver.
-
- * mail-send-recv.c (mail_send_receive, mail_receive_uri):
- Remove FilterContexts
-
-2001-07-01 Chris Toshok <toshok@ximian.com>
-
- * subscribe-dialog.c (subscribe_dialog_gui_init): the FolderSearch
- control is in a different dockitem now.
-
-2001-07-01 Dan Winship <danw@ximian.com>
-
- * mail-tools.c (update_unread_count): Ref the folder before
- proxying the event, in case there's only one reference to it and
- it gets unreffed before the other end of the event handler runs.
- (update_unread_count_main): And unref it when we're done.
- (mail_tool_uri_to_folder): Only hold the lock around the hash
- table operations, not the entire function. Holding the lock the
- whole time can cause deadlock when resolving vfolders, and the
- CamelSession and CamelStore locks ensure that multiple threads
- calling this function will end up with the same CamelFolder object
- at the end anyway, so we just need to lock and re-check the cache
- at the end before adding the folder to the cache.
-
-2001-06-30 Ettore Perazzoli <ettore@ximian.com>
-
- * folder-browser-ui.c: Get MailNext/MailPrevious to use
- next-message.png and previous-message.png, respectively. Also
- change Print to use print.png.
-
-2001-06-30 Jon Trowbridge <trow@ximian.com>
-
- * mail-display.c (make_popup_window): Changed to return the
- created window.
- (find_socket): Added. Copied from e-shell-view.c. The fact
- that I'm copying this bit of code all over isn't cool.
- (html_button_press_event): Properly destroy the popup window when
- the widget inside the control is destroyed.
-
- * mail-callbacks.c (addrbook_sender): Added. Implements
- the "Add sender to addressbook" right-click. (Bug #3645)
- (find_socket): Added. Copied from e-shell-view.c.
-
- * folder-browser.c: Added "Add sender to addressbook" to
- context_menu[].
-
- * mail-display.c: (handle_embedded_address_object): Removed.
- (on_object_requested): Removed handling for embedded address
- objects. (Which was obsolete crap.)
-
-2001-06-29 Larry Ewing <lewing@ximian.com>
-
- * mail-display.c (html_button_press_event): remove redundant
- logic.
-
- * mail-callbacks.c (create_msg_composer): make sure we show the
- sig file.
-
-2001-06-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-factory.c (control_deactivate): Turn folder
- syncing back on here so that IMAP folders will sync without
- needing to hit Send & Receive.
-
- * mail-callbacks.c (ask_confirm_for_only_bcc): Throw up the
- confirmation dialog.
- (composer_get_message): If the user only specified Bcc recipients,
- prompt him/her to make sure we should continue and risk the server
- adding an Apparently-To header.
-
- * mail-config.c (config_read): Read in config option for prompting
- when only Bcc recipients are specified.
- (mail_config_write_on_exit): Save the option.
- (mail_config_get_prompt_only_bcc): New.
- (mail_config_set_prompt_only_bcc): New.
-
-2001-06-29 Dan Winship <danw@ximian.com>
-
- * mail-account-gui.c (build_auth_menu): Take two authtypes lists,
- "all", and "supported", and make the unsupported authtypes grayed
- out in the menu rather than missing.
- (source_type_changed, transport_type_changed,
- service_check_supported): Update build_auth_menu calls.
-
-2001-06-29 Radek Doulik <rodo@ximian.com>
-
- * mail-account-gui.c (menu_file_save_cb): implemented plain saving
-
-2001-06-28 Radek Doulik <rodo@ximian.com>
-
- * mail-account-gui.c (load_signature): implemented plain load
- (load_signature): use e_msg_composer_get_signature_html
-
-2001-06-28 Peter Williams <peterw@ximian.com>
-
- * mail-ops.c (mail_send_message): Revert fejj's Bcc header removal;
- this unsets the BCC recipients and so doesn't send to the Bcc'd
- people at all.
-
-2001-06-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-send-recv.c (free_send_data): The e_iterator_get() returns
- a gconstpointer and we need a non-const BonoboControl so cast it.
-
- * mail-account-gui.c (mail_account_gui_new):
- gui->check_html_signature is GtkToggleButton not a GtkCheckButton.
-
- * folder-info.c: Added some #include's to supress warnings.
-
-2001-06-28 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-display.c: Fix case of labels in the `link_menu' so that it
- is consistent with that of the other menus in Evolution
- [i.e. "Copy Link Location" instead of "Copy Location" etc.].
-
-2001-06-28 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-display.c (invisible_selection_get_callback): New, signal
- handler for "selection_get" on the GtkInvisible widget we use for
- selections.
- (invisible_selection_clear_event_callback): New, signal handler
- for "selection_clear_event" on the same invisible widget.
- (mail_display_init): Initialize the `selection' and `invisible'
- members. Also, explicitly initialize all the other fields as
- well.
- (mail_display_destroy): Free `selection'. Destroy `invisible'.
- (link_copy_location): Re-implemented to just make the mail display
- become the owner of the primary selection.
- (on_selection_get): Remove `#if 0'ed code.
- (mail_display_new): Remove the `#if 0'ed code that would connect
- selection stuff to the HTML widget.
- (mail_display_new): Connect the signals and add the targets to the
- invisible widget.
-
- * mail-display.h: New members `selection' and `GtkInvisible' in
- `MailDisplay'.
-
-2001-06-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_write_on_exit): Don't bother trying
- to save the passwd if the url is NULL.
-
- * folder-browser.c (vfolder_mlist): Strip the mlist name to fix
- bug #3732.
-
- * component-factory.c (destination_folder_handle_drop): Since we
- have an exception variable, we might as well use it when getting
- folders too.
-
- * folder-browser.c (message_list_drag_data_recieved): Call
- gtk_drag_finish.
-
-2001-06-28 Dan Winship <danw@ximian.com>
-
- * mail-tools.c (mail_tool_uri_to_folder): After finding a folder,
- attach to its "folder_changed" and "message_changed" signals.
- (update_unread_count, update_unread_count_main): Moved here from
- folder-browser but basically unchanged. Doing this here lets us
- get folder tree updates for folders that have had messages
- moved/copied/filtered into them, but which don't yet have a view
- associated with them.
-
- * folder-browser.c (update_unread_count, update_unread_count_main,
- etc): Moved to mail-tools.c
-
-2001-06-28 Radek Doulik <rodo@ximian.com>
-
- * mail-config.c: use new fields everywhere
-
- * mail-config.h: as below
-
- * Mail.idl: added html_signature and has_html_signature
-
-2001-06-28 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (component_fn): Register for the "mailto"
- schema.
- (handle_external_uri_cb): Callback for the "handle_external_uri"
- signal.
- (component_fn): Connect it.
-
-2001-06-27 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (component_fn): Pass NULL as the
- @external_uri_schemas argument to
- `evolution_shell_component_new()'.
-
-2001-06-27 Peter Williams <peterw@ximian.com>
-
- * folder-browser-ui.c: Uncomment EditSelectThread. Yaay!
-
- * mail-callbacks.c (select_thread): New function. Self-explanatory
- name. Implementation is a little hairy.
-
- * mail-callbacks.h: Prototype it here.
-
- * mail-callbacks.c (invert_selection): Here too.
- (select_all): Here too.
-
- * subscribe-dialog.c (subscribe_select_all): Update to use new
- ETree accessors.
- (subscribe_invert_selection): Here too.
-
-2001-06-27 jacob berkman <jacob@ximian.com>
-
- * folder-browser.c (save_cursor_pos): work around an e-tree bug
-
-2001-06-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c: Fixed Cut/Copy/Paste to work - it turns out I
- couldn't share a single GtkInvisible between all the
- FolderBrowser's after all.
-
-2001-06-27 Peter Williams <peterw@ximian.com>
-
- * folder-browser-factory.c (control_deactivate): Change to use
- more reality-based API below.
- Include folder-browser-ui.h too.
- (control_activate): Remove now-unused 'int state'.
-
- * folder-browser-ui.h: Changed prototypes to match changes below.
-
- * folder-browser-ui.c (folder_browser_ui_rm_message): Commented out
- to reflect reality of how this stuff works (you can't actually remove
- the pieces).
- (folder_browser_ui_rm_global): Same.
- (folder_browser_ui_rm_list): Left because here we add the view menus.
- (folder_browser_ui_add_list): ... which were moved here.
- (folder_browser_ui_rm_all): New function, does the job of old ui_rm()
-
-2001-06-26 Peter Williams <peterw@ximian.com>
-
- * folder-browser-ui.c: New file derived from
- folder-browser-factory.c. Contains the Bonobo UI code, split into
- three groups as described in ui/ChangeLog. Also contains the
- GalView stuff and the hookups into the Bonobo UI stuff.
-
- * folder-browser-factory.c: Move most of the UI stuff to
- folder-browser-ui.c.
- (control_activate): Add all three kinds of UI element to this
- folderbrowser.
- (control_deactivate): Remove all three kinds.
-
- * folder-browser-ui.h: New file. Prototypes functions to add UI
- elements to a FolderBrowser.
-
- * Makefile.am: Add folder-browser-ui.{c,h}
-
- * message-browser.c (PARENT_TYPE): Change to BONOBO_TYPE_WINDOW
- (message_browser_destroy): Chain to parent destroy function.
- (set_bonobo_ui): New function. Add the 'message' functions from
- the folder browser to our UI.
- (message_browser_close): BonoboVerbify this.
-
- * message-browser.h: Convert to BonoboWindow.
-
-2001-06-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (my_folder_browser_init): Helps if I spell
- "received" correctly.
-
- * mail-config.c (mail_config_set_thread_list): If the value is
- already in the hash table, first remove it before setting the new
- value so we don't leak.
- (mail_config_set_show_preview): Same.
-
-2001-06-26 Dan Winship <danw@ximian.com>
-
- * mail-mt.c (op_status_timeout): Don't pop up a progress dialog to
- say "I already finished this a while ago".
-
- * component-factory.c (storage_create_folder): Pass the path
- prefix to folder_created so it can add it to the folder tree in
- the right place.
-
- * mail-callbacks.c (folder_created): Take a path prefix.
-
-2001-06-26 jacob berkman <jacob@ximian.com>
-
- * mail-config.c (mail_config_get_show_preview): make ettore stop
- complaining so i can get back to work
-
-2001-06-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (message_rfc822_dnd): No longer returns a
- gboolean and also takes a CamelException.
- (destination_folder_handle_drop): Do better error checking.
-
- * folder-browser.c (my_folder_browser_init): Connect to the
- tree-drag-data-recieved signal.
- (message_list_drag_data_recieved): New function that handles the
- recieving end of the DnD event.
- (x_evolution_message_parse): New convenience function to parse the
- x-evolution-message type so that the cut/paste and DnD code can
- share it.
- (selection_received): Use x_evolution_message_parse().
-
- * mail-config.c (config_read): Read in the default show_preview
- value.
- (mail_config_write_on_exit): Save the default show_preview value
- as well as saving the individual settings for each URI that has
- been changed.
-
-2001-06-25 Joe Shaw <joe@ximian.com>
-
- * folder-browser.c (invisible_destroyed): Check to make sure that
- clipboard_selection is non-NULL before we g_byte_array_free() it.
-
-2001-06-25 jacob berkman <jacob@ximian.com>
-
- * mail-send-recv.c (free_send_data): sync folders after we've
- gotten mail
-
- * folder-browser-factory.c (control_activate): set the ui
- component on the folder browser
- (control_activate): update the view preview item
- (control_deactivate): don't sync the folder here
- (control_deactivate): unset the ui component of the folder browser
-
- * mail-callbacks.c (toggle_flags): stuff from jleach to add an
- importance keybinding
- (mark_as_important): ditto
- (toggle_as_important): again
-
- * mail-config.c (mail_config_get_show_preview):
- (mail_config_set_show_preview): basically a copy of
- get_thread_list() but for the preview pane
-
- * folder-browser.c (folder_browser_destroy): unref the our ui
- component
- (folder_browser_set_ui_component): new function for setting the ui
- component
- (save_cursor_pos):
- (set_cursor_pos): try to show the selected row when the preview
- pane is shown
- (folder_browser_set_message_preview): implement
- (folder_browser_toggle_preview): toggle the preview (duh)
- (on_key_press): add keybindings for marking as important (!), and
- hiding the preview pane (q)
- (etree_key): clean up a little bit, and make enter either show the
- preview pane or open the message
- (fb_resize_cb): only save the paned size if the preview is alread
- shown
- (folder_browser_gui_init): pass ourselves to fb_resize_cb
- (on_message_selected): only add the timeout if the preview is
- shown
-
-2001-06-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (folder_browser_destroy): Unref the invisible
- window that we use for slections.
- (folder_browser_class_init): Init the clipboard_atam type.
- (selection_get): New
- (selection_clear_event): New
- (selection_received): New
- (folder_browser_copy): New function to copy the message-list
- selection.
- (folder_browser_cut): New function to cut the message-list
- selection.
- (folder_browser_paste): New function to paste the message-list
- selection.
- (my_folder_browser_init): Initialize `invisible` if it's NULL else
- ref it - also set some signals on it.
-
- * folder-browser-factory.c: Added verbs for cut/copy/paste.
-
-2001-06-23 Jason Leach <jleach@ximian.com>
-
- * mail-local.c (local_storage_removed_folder_cb): Fixes here for
- removing folders.
-
- * mail-ops.c (remove_folder_get): Some fixes in here too.
-
-2001-06-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (config_read): Duh, we saved the charset as
- "default_charset", not "charset" - no wonder the correct charset
- menu item was never being set.
-
-2001-06-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (mail_send_message): Temporarily remove the Bcc
- header before sending the message.
-
-2001-06-21 Jon Trowbridge <trow@ximian.com>
-
- * mail-display.c (html_button_press_event): Remove empty "name"
- property setting from the popup control.
-
-2001-06-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (composer_get_message): Allow the message to be
- sent even if there are no To recipients but only as long as there
- are other recipients defined.
-
-2001-06-21 Jason Leach <jleach@ximian.com>
-
- * component-factory.c (mail_remove_storage): Deregister the
- storage from the shell so it will get removed from the folder
- tree.
-
-2001-06-20 Kjartan Maraas <kmaraas@gnome.org>
-
- * folder-browser.c: More than one accel key is a tad
- confusing.
-
-2001-06-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c: #include "folder-browser-factory.h"
-
- * component-factory.c (mail_remove_storage): New function to
- remove an EvolutionStorage.
-
- * mail-accounts.c (mail_delete): Remove the storage from the
- folder-tree.
- (news_delete): Same.
-
-2001-06-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (destination_folder_handle_drop): Accept
- text/uri-list mime types - this allows us to drag messages from
- Nautilus into an Evolution folder.
-
- * folder-browser.c (message_list_drag_data_get): Do cleanup and
- better error handling.
-
-2001-06-19 Jon Trowbridge <trow@ximian.com>
-
- * mail-tools.c (mail_tool_do_movemail): Properly clean up the
- movemail files when no mail was received.
-
-2001-06-19 Radek Doulik <rodo@ximian.com>
-
- * mail-format.c (write_field_row_begin): add column with &nbsp;
- between header name and value
- (write_field_row_begin): hmm, use just bold &nbsp; as it looks
- better
-
-2001-06-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (destination_folder_handle_drop): Use a nice
- switch statement and use the new enum values.
-
- * mail-callbacks.c (list_add_addresses): Now takes a hash table of
- already-used-recipients so that we don't get duplicates.
- (mail_generate_reply): Pass in a rcpt_hash argument to
- list_add_addresses(). These changes fix bug #1639.
-
-2001-06-18 Dan Winship <danw@ximian.com>
-
- * Makefile.am (evolution_mail_LDADD): Remove DB3_LDADD
-
-2001-06-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c: Change the drop-type "x-evolution-dnd" to
- "x-evolution-message" since we want to be able to DnD more than
- one data type ;-)
-
- * folder-browser.c: Change supported DnD drop types to disclude
- URI_LIST as that seems to crash Nautilus and seems overly
- complicated. Since I am going to be supporting message/rfc822,
- hopefully Nautilus can handle that or else maybe something like
- text/plain.
- (message_list_drag_data_get): Remove the code for URI_LIST.
-
-2001-06-14 Not Zed <NotZed@Ximian.com>
-
- * mail-tools.c (mail_tool_uri_to_folder): If we have a fragment in
- the url, use that as the folder name, and not the path component.
-
-2001-06-13 Not Zed <NotZed@Ximian.com>
-
- * component-factory.c (mail_load_storages): Added temp hack to let
- spool providers show up in the list.
-
-2001-06-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (my_folder_browser_init): Allow user's to
- "copy" drag & drop rather than just "move".
-
-2001-06-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (destination_folder_handle_drop): Implemented.
-
- * message-list.c (message_list_construct): Don't connect to the
- DnD signals here.
- (message_list_drag_data_get): Removed.
- (add_uid): Removed.
-
- * folder-browser.c (my_folder_browser_init): Connect to DnD signals.
- (message_list_drag_data_get): Implemented.
-
-2001-06-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (mail_send_message): Fixed misuse of an uninitialized
- variable.
-
- * component-factory.c (destination_folder_handle_drop): Implemented.
-
- * mail.h: Added prototype for evolution_folder_info_factory_init.
-
- * mail-ops.c (mail_do_transfer_messages): Now takes a const char*
- as the dest_uri. This works better all around since we strdup'd
- the string anyway.
-
-2001-06-15 Dan Winship <danw@ximian.com>
-
- * mail-format.c (mail_format_mime_message): We can't output
- "<html>" and "</html>" here because it gets called recursively to
- display message/rfc822 subparts.
- (mail_format_raw_message): Add padding to match the formatted
- display.
-
- * mail-display.c (mail_display_redisplay): Move rodo's html header
- changes from mail_format_mime_message to here.
-
-2001-06-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c (got_folder): Updated to reflect changes to
- mail_config_[g,s]et_thread_list().
- (folder_browser_toggle_threads): Same.
-
- * folder-browser-factory.c (control_activate): Updated to reflect
- changes to mail_config_[g,s]et_thread_list().
-
- * mail-config.c (mail_config_write_on_exit): Do cleanup when we're
- done.
- (mail_config_set_thread_list): Send in a URI so we can save the
- state on a per-folder basis.
- (mail_config_get_thread_list): Send in a URI so we can retrieve
- the state on a per-folder basis.
-
- * component-factory.c: Setup the accepted_dnd_types. Also added
- skeleton code for DnD.
-
-2001-06-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-factory.c: Add Reply-to-List bonobo verbs.
-
- * folder-browser.c: Add Reply-to-List menu items.
-
- * mail-callbacks.c (mail_reply): Use an enum for specifying the
- reply mode, becaus enow we can reply-to-list.
- (reply_to_list): Implement.
- (reply_to_sender): Use REPLY_SENDER.
- (reply_to_all): Use REPLY_ALL.
- (mail_generate_reply): Handle the different modes.
-
-2001-06-12 JP Rosevear <jpr@ximian.com>
-
- * Makefile.am: Remove folder-info.h until iain checks it in
-
-2001-06-12 Not Zed <NotZed@Ximian.com>
-
- * mail-account-gui.c (source_type_changed): Setup default spool
- location same as for mbox mail retrieval.
-
-2001-06-08 Dan Winship <danw@ximian.com>
-
- * folder-browser-factory.c: fix some commands to match the ui file
- again.
-
-2001-06-07 Iain Holmes <iain@ximian.com>
-
- * GNOME_Evolution_Mail.oaf.in: Add server info for FolderInfo
- Remove server info for the Summary server
-
- * Mail.idl: Add a FolderInfo interface to retreive information about
- a mail folder.
-
- * Makefile.am: Remove the executive summary stuff. Add the folder-info
- files.
-
- * component-factory.c: Remove the mail-summary.h include.
- Remove summary_factory.
- (summary_fn): Remove.
- (component_factory_init): Remove the summary_factory creation.
- Initialise the info_factory.
-
-2001-06-08 Jon Trowbridge <trow@ximian.com>
-
- * mail-ops.c (mail_send_message): Reattach X-Evolution-Account
- information to the message after sending it. This way it can
- be used to set the identity properly if we later Resend the
- message.
-
- * mail-tools.c (mail_tool_get_local_movemail_path): If you had
- multiple accounts that used mboxes, and if you received mail in N
- of those accounts, you would get N copies of each of your e-mail
- messages. This is because everything was being dumped into one
- big file by movemail, and the filters would run on that file N
- times. To work around this, each mbox account now gets its own
- distinct temporary movemail file.
-
-2001-06-07 Jon Trowbridge <trow@ximian.com>
-
- * mail-ops.c (fetch_mail_fetch): Pass the original source URI
- to camel_filter_driver_filter_mbox.
- (mail_send_message): Pass NULL as the orginal source URI
- to camel_filter_driver_filter_message.
-
-2001-06-06 Jon Trowbridge <trow@ximian.com>
-
- * mail-account-gui.c (source_type_changed): Check that the chain
- of deferences in gui->account->source->url is safe. This was
- causing a segfault when adding a new account if any of the
- existing accounts had their sources set to "None".
- (i.e. gui->account->source == NULL)
-
- * mail-accounts.c (load_accounts): Check that account->source !=
- NULL before dereferencing it.
- (load_accounts): The selection is cleared when the account clist
- is rebuilt (say after a call to add), but no unselect event is
- emitted. Yes, the clist is evil. We work around this by
- explictly calling mail_unselect, our unselect signal handler.
- (Otherwise, the edit and delete buttons remain sensitive and
- accounts_row != 0, but the user can't see which row the dialog
- thinks is selected.)
- (load_news): Check the account->source != NULL before
- dereferencing it.
- (mail_unselect): If an insensitive button in a button box has the
- focus, and if you hit tab, there is a segfault deep inside of gtk.
- This is probably a gtk bug. We work around it by having the add
- button (which is always sensitive) grab the focus on an unselect.
-
-2001-06-05 Jason Leach <jleach@ximian.com>
-
- (Fix bug #3211: Should undelete when flagging a delete message as
- important)
-
- * message-list.c (on_click): When flagging a message as important,
- check to see if it's flagged as deleted, if so, undelete it.
-
- (Fix bug #314: Display URLs in statusbar on mouseover)
-
- * mail-display.c (html_on_url): New function, callback for
- GtkHTML's "on_url" signal.
-
-2001-06-05 Radek Doulik <rodo@ximian.com>
-
- * mail-format.c: make HTML and plain mails to have the same
- boundary
-
-2001-06-03 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (evolution_mail_LDADD): Move `$(DB3_LDADD)' before
- libeutil.
-
-2001-06-01 Federico Mena Quintero <federico@ximian.com>
-
- * folder-browser.h (FolderBrowser): Added fields for the
- GalViewMenus and GalViewCollection, since we need to keep them
- around while the component is active.
-
- * folder-browser-factory.c (folder_browser_setup_view_menus): Plug
- leaks; unref the spec and factory. Set the view collection and
- the view menus on the FolderBrowser object.
- (folder_browser_discard_view_menus): New function.
- (control_deactivate): Discard the menus.
-
- * folder-browser.c (folder_browser_destroy): Destroy the view
- collection and the view menus.
-
-2001-06-01 Ettore Perazzoli <ettore@ximian.com>
-
- * Makefile.am (evolution_mail_LDADD): Add `$(DB3_LDADD)'.
-
-2001-06-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_save): Save the pgp and
- smime settings.
- (mail_account_gui_new): Setup the pgp and s/mime page (but disable
- the s/mime frame if we are not compiled with s/mime support).
-
- * mail-config.c (account_copy): Updated to save extra pgp and
- smime options.
- (account_destroy): Free draft/sent folder info and also the new
- pgp/smime keys.
- (config_read): Read in the pgp and s/mime config options.
- (mail_config_write): Save the account pgp and smime options.
-
-2001-06-01 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (source_type_changed): Call
- build_extra_conf() here too. This is when we REALLY want to call
- it anyway, not on switch-page because then we'd lose any data on
- the Receive Options page if we never switch to that page before
- applying the changes.
-
- * mail-account-editor.c (construct): Don't connect to the
- switch-page event, instead just call build_extra_conf() here with
- the source->url.
-
-2001-06-01 Dan Winship <danw@ximian.com>
-
- * mail-config.c (config_read): Fix dumb misuse of g_get_charset.
-
-2001-05-31 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (handle_multipart_signed): Removed the code to
- check for the validity of an S/MIME part. Stuff works differently
- now.
-
- * mail-crypto.c: Rewrote how the S/MIME stuff is going to work.
-
-2001-05-30 Dan Winship <danw@ximian.com>
-
- * mail-config.glade: Rename the "PGP" page back to "Other" and add
- a "default charset" option menu.
-
- * mail-config.c (config_read, mail_config_write_on_exit,
- mail_config_get_default_charset, mail_config_set_default_charset):
- Handle "default charset".
-
- * mail-accounts.c (construct): Fill in the "default_charset" menu
- with an e_charset_picker menu.
- (charset_menu_deactivate): Update the default charset.
-
-2001-05-29 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (list_add_addresses): Take another argument to
- ignore a certain address.
- (mail_generate_reply): Ignore references to the reply-to address
- when constructing the Cc list.
-
-2001-05-29 Jason Leach <jleach@ximian.com>
-
- * message-browser.c (message_browser_new): one-line fix for bug
- #2536: File->Close in message viewer doesn't work.
- (message_browser_new): Also replaced like 4 lines of code with a
- one-liner featuring gnome_app_create_toolbar_with_data().
-
-2001-05-28 Jason Leach <jleach@ximian.com>
-
- * mail-local.c (load_metainfo): Don't need to check if (foo!=NULL)
- before doing an xmlFreeDoc().
-
-2001-05-28 Dan Winship <danw@ximian.com>
-
- * mail-format.c (write_text_header): Fix a bug that could cause a
- crash on messages with an empty subject. Oops.
-
-2001-05-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c: Removed the etable spec string.
- (message_list_construct): Load the etable spec from a file.
-
- * folder-browser-factory.c: Load the etable spec from the file,
- not a string.
-
- * Makefile.am: Add message-list.etspec to be installed.
-
- * message-list.etspec: New file containing the ETable file
- specification.
-
- * mail-config.h: Prototype evolution_mail_config_get_type.
-
-2001-05-27 Dan Winship <danw@ximian.com>
-
- * folder-browser-factory.c: #include
- "evolution-shell-component-utils.h" rather than "e-gui-utils.h"
- for e_pixmaps_update.
-
- * subscribe-dialog.c: Likewise.
-
-2001-05-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (try_inline_pgp_sig): Fix to work properly.
- (handle_multipart_signed): Fixed a bug that caused some
- multipart/signed messages to be handled by the multipart_mixed
- handler.
-
-2001-05-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-factory.c: Added callbacks for Next/Previous
- Unread and Next/Previous Flagged message.
-
- * mail-callbacks.c (previous_flagged_msg): Implemented.
- (next_flagged_msg): Implemented.
-
-2001-05-26 Dan Winship <danw@ximian.com>
-
- * mail-ops.c (mail_send_message, transfer_messages_transfer,
- set_offline_do): When unreffing a folder we got ourselves (as
- opposed to one passed in by the caller), sync before unreffing,
- since we might be holding the only reference to it.
- (mail_refresh_folder): New op, like mail_sync_folder, but does a
- camel_folder_refresh_info instead.
-
- * folder-browser-factory.c (control_activate): Call
- mail_refresh_folder, not mail_sync_folder. (The goal is to see new
- messages: sync used to work with imap because imap_sync was
- broken, but it doesn't work for that any more.)
-
-2001-05-25 Peter Williams <peterw@ximian.com>
-
- * Makefile.am: Reference libeshell.la instead of libeshell.a.
-
-2001-05-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-factory.c (control_activate): Disable Resend on
- non-Sent folder FolderBrowsers. Thanks to Wayne Davis for this
- patch.
-
- * component-factory.c (xfer_folder): This code should be correct
- now. Still waiting on the shell to do it's job of creating the
- metadata xml file in the destination folder though.
-
-2001-05-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (message_list_select_uid): g_strdup the uid into
- the ml->cursor_uid.
-
- * message-browser.c (message_browser_forward_msg): Use the default
- forward style.
-
-2001-05-24 Dan Winship <danw@ximian.com>
-
- * mail-identify.c (mail_identify_mime_part): If the message data
- is online, sniff the data for a MIME type first, and use the
- filename second. Makes it more reliable, and deals with the
- specific case of "application/octet-stream; name=foo.vcf" which
- gnome-vfs will identify as vcalendar, but which can also be a
- vcard.
-
-2001-05-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (try_inline_pgp_sig): Only write the message up to
- (but not including) the attached signature block.
-
-2001-05-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (composer_postpone_cb): Don't free the
- folder-info here, instead have mail_append_mail() call our new
- function, append_mail_cleanup() which'll free the
- folder-info. This fixes the problem of send-later segfaulting.
-
- * message-list.c (message_list_set_folder): Make the message-list
- respect the "hide deleted messages" setting. Fixes bug #2248.
-
- * component-factory.c (xfer_folder): New function that the shell
- component calls to copy/move a folder.
- (component_fn): Set the xfer_folder_fn argument.
-
- * mail-ops.c (mail_remove_folder): New async function to remove a
- folder. God knows if it does what the ShellComponent needs or not
- yet.
- (mail_xfer_folder): Yet another yummy async function to move or
- copy a folder to a new location.
-
- * component-factory.c (storage_remove_folder): New function for
- removing folders.
- (remove_folder): New function that the shell component calls to
- delete a folder.
- (component_fn): Set the remove_folder_fn argument.
-
-2001-05-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_write_on_exit): Save the
- message-display style.
- (config_read): Read the message-display style.
-
-2001-05-22 Dan Winship <danw@ximian.com>
-
- * mail-display.c (on_url_requested): If http mode is
- HTTP_SOMETIMES, use e_book_query_address_locally to check the From
- address and load images if it's found.
-
- * mail-config.c (config_read): Default http_mode to
- MAIL_CONFIG_HTTP_SOMETIMES. Fix typo to make default forward style
- actually work.
-
-2001-05-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * Makefile.am: Use MAILER_CFLAGS and MAILER_LIBS.
-
- * message-browser.c (message_browser_folder_loaded): Instead of
- calling message_list_select_uid() here, instead connect to the
- "message_list_loaded" signal since the message-list is not built
- yet at this point.
- (message_browser_message_list_built): Call
- message_list_select_uid() here instead.
-
- * message-list.c: Lets have a new signal, MESSAGE_LIST_BUILT, that
- gets emitted when the message-list has finished being built by one
- of the built_*() functions.
- (message_list_class_init): Setup the signal stuff.
- (regen_list_regened): Emit the signal here (should this perhaps be
- moved into each of the build_*() functions instead?).
-
-2001-05-21 Kjartan Maraas <kmaraas@gnome.org>
-
- * mail-local.c: Mark a string for translation.
-
-2001-05-18 Jon Trowbridge <trow@ximian.com>
-
- * Makefile.am (evolution_mail_LDADD): Added libebook.la (which is
- now required by the composer.)
-
-2001-05-17 Dan Winship <danw@ximian.com>
-
- * mail-callbacks.c (composer_postpone_cb): mark Outbox messages as
- read.
-
-2001-05-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (mail_write_authenticity): New convenience
- function for all signature verification functions to use to
- display whether or not the signed part was authentic.
- (try_inline_pgp_sig): Use mail_write_authentic().
- (handle_multipart_signed): Add code to handle S/MIME
- multipart/signed parts and also use mail_write_authenticity().
-
-2001-05-17 Dan Winship <danw@ximian.com>
-
- * mail-config.glade: add new icons from jimmac.
-
-2001-05-16 Dan Winship <danw@ximian.com>
-
- * mail-format.c (mail_format_raw_message): add
- E_TEXT_TO_HTML_ESCAPE_8BIT to the flags
-
-2001-05-16 Dan Winship <danw@ximian.com>
-
- * folder-browser.c (folder_browser_is_drafts,
- folder_browser_is_sent, folder_browser_is_outbox): Functions to
- determine if a folderbrowser is one of the drafts, sent, or outbox
- folders.
- (got_folder): Pass TRUE for the "outgoing" flag to
- message_list_set_folder if this is a Sent, Drafts, or Outbox
- folder.
-
- * message-list.c (message_list_set_folder): Take a flag saying
- whether or not the folder is an "outgoing" folder.
- (message_list_setup_etree): Ditto. Use that rather than a
- hardcoded list of foldernames for deciding whether to swap From
- and To in the default layout.
-
- * mail-config.c (mail_config_folder_to_cachename): Make IMAP
- folders have unique cachenames rather than only one per store, so
- that IMAP Sent and Drafts folders don't get forced into having the
- same layout as the INBOX.
-
- * mail-callbacks.c: (is_sent_folder, is_drafts_folder): Gone.
- Replaced with simpler folder_browser_is_* routines.
- (edit_msg, resend_msg, open_msg): Use folder_browser_is_*
- routines.
-
- * mail-local.c (reconfigure_clicked): Update call to
- message_list_set_folder.
-
-2001-05-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-crypto.c (mail_crypto_is_smime_v3_signed): Removed (this
- now exists in camel/camel-smime.c).
- (mail_crypto_is_pkcs7_mime): Same.
- (mail_crypto_smime_part_sign): new
- (mail_crypto_smime_part_verify): new
- (mail_crypto_smime_part_encrypt): new
- (mail_crypto_smime_part_decrypt): new
- (mail_crypto_pgp_mime_part_sign): Added code to set an exception
- if the context fails to be created.
- (mail_crypto_pgp_mime_part_verify): And here...
- (mail_crypto_pgp_mime_part_encrypt): Same.
- (mail_crypto_pgp_mime_part_decrypt): And here too.
-
-2001-05-16 Dan Winship <danw@ximian.com>
-
- * mail-display.c (mail_display_redisplay): Deal with full-header
- mode in addition to source mode
-
- * mail-format.c (write_field_row_begin): Add WRITE_NOCOLUMNS flag
- to write the header in a single table cell rather than two. Output
- the second columns's "<td>" when not in NOCOLUMNS mode. Don't
- include the ":" in the passed-in header name.
- (write_date, write_address): Update for write_field_row_begin
- changes.
- (write_text_field): Genericified and updated from write_subject.
- (write_headers): Deal with both normal and full-header mode.
-
-2001-05-15 Dan Winship <danw@ximian.com>
-
- * mail-display.c (on_url_requested): Load http images if the user
- has force-loaded images too.
- (mail_display_redisplay): Update for normal/headers/source changes.
- (mail_display_load_images): New. Force HTTP image loading for the
- current message.
-
- * mail-config.c (mail_config_get_message_display_style,
- mail_config_set_message_display_style): Updated and renamed from
- mail_config_{get,set}_view_source
-
- * mail-callbacks.c (load_images): New.
-
- * folder-browser.c (folder_browser_set_message_display_style):
- Renamed and updated from folder_browser_toggle_view_source.
-
- * folder-browser-factory.c (verbs): Add ViewLoadImages.
- (control_activate): Update for normal/headers/source change to
- radio group.
-
-2001-05-15 Dan Winship <danw@ximian.com>
-
- * folder-browser-factory.c (verbs): Update for changes in
- evolution-mail.xml (many commands were renamed to better match the
- current menu layout).
- (pixcache): Refer to commands via their paths in /commands/
- rather than hardcoding their menu paths.
-
-2001-05-14 Jon Trowbridge <trow@ximian.com>
-
- * mail-search.c (mail_search_construct): Put frame around dialog
- vbox, put mail subject in that frame's label. (Patch by Duncan.)
- (mail_search_set_subject): Break out subject-setting code.
- Truncate long subjects with ellipses.
-
-2001-05-14 Duncan Mak <duncan@ximian.com>
-
- * mail-search.c (mail_search_construct): set the dialog's
- window_icon to jimmac's new find_message.xpm.
-
-2001-05-13 Iain Holmes <iain@ximian.com>
-
- * Makefile.am: Make the LDADD line longer so it actually compiles
- everything correctly.
-
-2001-05-14 Dan Winship <danw@ximian.com>
-
- * mail-config.glade: Split "Other" page into three pages, Display,
- Composer, and PGP. Add HTML image stuff on the Display page and
- default forward style on the Composer page.
-
- * mail-config.c (mail_config_get_default_forward_style,
- mail_config_set_default_forward_style): User-specified default
- style for forwarding messages.
- (config_read, mail_config_write_on_exit): Deal with forward style.
-
- * mail-accounts.c: Handle HTML image display options and default
- forward style.
-
- * mail-callbacks.c (forward): New. Forward in the user-selected
- default style.
- (forward_inline, forward_quoted): Simplify these some. Remove the
- fallback to forward attached when forwarding multiple messages: it
- should just forward the multiple messages inline or quoted in
- those cases. (Which it doesn't yet, but that's a bug.)
-
- * folder-browser.c (context_menu): Remove "Forward inline" and
- make "Forward" call forward() rather than forward_attached().
-
- * folder-browser-factory.c: Update command/menu/toolbar/pixmap
- gunk for the "MessageForwardAttached" vs "MessageForward" split.
-
- * mail-session.c (mail_session_get_type):
- * mail-format.c (format_mime_part):
- * mail-account-gui.c (setup_service): Fix warnings.
-
- * mail-mlist-magic.c: Remove this... it's not used any more.
-
- * folder-browser.c:
- * message-browser.c: Remove references to mail-mlist-magic.h
-
-2001-05-14 Jon Trowbridge <trow@ximian.com>
-
- * folder-browser.c (folder_browser_config_search): Use secondary
- searches here, so that we control the interference between the two
- bits of searching UI.
-
-2001-05-13 Jon Trowbridge <trow@ximian.com>
-
- * mail-search.c (mail_search_construct): Destroy the MailSearch
- dialog if the underlying MailDisplay is destroyed. I don't like
- the way that label in the dialog with the message subject in it
- looks, so I've #ifdef-ed it out for now. Center the Matches
- label --- it makes the dialog look more balanced, I think.
- (dialog_clicked_cb): Changed to reflect adjusted
- ESearchingTokenizer API, using primary searches.
- (toggled_case_cb): Use the primary search API.
-
- * e-searching-tokenizer.c: Make searching routines utf8-friendly.
- Rationalize how the match begin/end markup is handled; allow for
- begin/end markup that varies by search. Add concept of primary and
- secondary matching, to disentangle possible interactions between
- search-bar searches and search-dialog searches.
-
-2001-05-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-local.c (mail_local_storage_shutdown): Get rid of this - we
- don't need it.
-
- * component-factory.c (owner_unset_cb): Don't unref the LocalStore
- - we don't own a ref on it!!
-
-2001-05-12 Duncan Mak <duncan@ximian.com>
-
- * mail-search.c (begin_cb): Updates the subject on refresh and
- sets subject to "Untitled Message" if subject is NULL.
- (mail_search_construct): Moved msg_subject to its own GtkLabel,
- sets subject to "Untitled Message" if subject is NULL. Give focus
- to entry by default. Made <enter> in entry run
- dialog_clicked_cb by setting gnome_dialog_editable_enters.
-
-2001-05-12 Gediminas Paulauskas <menesis@delfi.lt>
-
- * folder-browser-factory.c: load pixmaps for MessageCopy and
- MessageForwardAttached. Thanks Wayne Davis <wfdavis@seas.upenn.edu>
- for a patch.
-
-2001-05-11 Dan Winship <danw@ximian.com>
-
- * mail-display.c (load_http): callback to use GNOME-VFS to load
- http data.
- (on_url_requested): Handle http: URLs that refer to either MIME
- parts or web data.
- (mail_display_redisplay_when_loaded): Moved out of
- mail_content_loaded and made more generic.
-
- * mail-format.c (add_url): Handle two different kinds of URLs
- (URLs that point to CamelMimeParts and URLs that point to
- GByteArrays).
- (mail_content_loaded): Use mail_display_redisplay_when_loaded.
- (format_mime_part): Renamed from "call_handler_function". Also,
- record Content-Location if the part has one. (This is not yet 100%
- correct: it doesn't deal with relative URLs at all.)
- (handle_text_html): Use Content-Location URL rather than
- Content-ID, when available (will help deal with relative URLs once
- GtkHTML supports that better).
- (etc): Update for changes.
-
- * mail-config.c (mail_config_get_http_mode,
- mail_config_set_http_mode): get/set HTTP image downloading mode.
- (config_read, mail_config_write_on_exit): save/load that data.
-
-2001-05-11 JP Rosevear <jpr@ximian.com>
-
- * mail-importer.h: add proto
-
- * mail-importer.c (mail_importer_uninit): release and unref the
- local storage
-
- * mail-local.c (mail_local_store_finalize): use
- bonobo_object_release_unref rather than doing Bonobo_Unknow_unref
- and a corba release
- (register_folder_registered): "sink" the local_store ref to
- prevent circular ref
- (mail_local_storage_shutdown): unref the local store
-
- * mail-local.h: new proto
-
- * component-factory.c (owner_unset_cb): uninit the importer and
- shutdown the local storage
-
-2001-05-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-local.c (mail_local_reconfigure_folder): Set a title on the
- window "Reconfigure %s" where %s is the folder name. Also, don't
- allow more than one of these type windows to be opened per folder.
-
- * mail-tools.c (mail_tool_get_folder_name): Fix Danw's kludge to
- actually work :-)
-
-2001-05-11 Martha Burke <martha@ximian.com>
-
- * gui/Makefile.am: sanitize LD_ADDS and CFLAGS so the libtool
- lines are shorter (fixes problem on solaries due to sed)
-
-2001-05-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-vfolder.c (vfolder_edit): Don't allow multiple copies of
- this to be run at a time.
-
- * mail-callbacks.c (providers_config): Don't allow multiple copies
- of this to be run at a time.
- (manage_subscriptions): Same, but this was a tad more kludgy since
- we don't gnome_dialog_run_and_close() this one. I had to make the
- widget a semi-global variable. yuck :\
- (filter_edit): Same.
-
-2001-05-11 Jon Trowbridge <trow@ximian.com>
-
- * e-searching-tokenizer.c (e_searching_tokenizer_new):
- Remove a snippet of debugging code I left in by mistake.
-
-2001-05-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (forward_inlined): If the cursor_uid is NULL,
- then we can't forward anything so just return.
- (forward_quoted): Same.
-
-2001-05-10 Jon Trowbridge <trow@ximian.com>
-
- * folder-browser.c (folder_browser_config_search): Use the
- ESearchingTokenizer to highlight search matches for folder-level
- searches. Still mildly broken, but it works for the simple cases.
-
- * mail-display.c (mail_display_new): Use our ESearchingTokenizer
- for the mail display GtkHTML widget.
-
- * mail-search.c (dialog_clicked_cb): Use the ESearchingTokenizer to
- highlight search matches.
- (mail_search_construct): Add a match count to the search dialog.
-
- * e-searching-tokenizer.c
- (e_searching_tokenizer_set_search_string): Added. A custom HTML
- tokenizer that does highlighting of search strings.
-
- * mail-config.c: No, we don't want to include
- bonobo-running-context.h... just bonobo-context.h.
-
-2001-05-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c: Fix some compiler warnings by including the
- correct bonobo headers and by using the correct bonobo types.
- (config_read): Some fixes so that we can never have an empty
- string as a URL.
-
-2001-05-10 Dan Winship <danw@ximian.com>
-
- * folder-browser.c (on_key_press): Don't advance to the next
- undeleted message after "Delete"...
-
- * mail-callbacks.c (delete_msg): ...instead, do it here, whether
- the user used Delete, Alt+D, or the toolbar. (But only if they
- only deleted a single message.)
-
- * message-list.c (message_list_select): Don't clear the display on
- failure.
- (build_tree): Clear the display when the currently-selected
- message stops existing and we don't have an obvious message to
- select instead of it. (Eg, when deleting the last message with
- "hide deleted messages" set, or expunging while a deleted message
- is selected.)
-
-2001-05-09 Dan Winship <danw@ximian.com>
-
- * mail-offline-handler.c: New file, started by Ettore, finished by
- me, to implement the GNOME_Evolution_Offline interface.
-
- * Makefile.am (evolution_mail_SOURCES): Add
- mail-offline-handler.[ch]
-
- * mail-ops.c (mail_store_set_offline): Set a store online or
- offline.
-
- * mail-send-recv.c (auto_timeout): Don't run auto-check-for-mail
- while the session is offline.
-
- * component-factory.c (component_fn): Set up offline handler.
-
-2001-05-09 Christopher James Lahey <clahey@ximian.com>
-
- * importers/evolution-mbox-importer.c (load_file_fn): Made a const
- char * here.
-
-2001-05-08 Iain Holmes <iain@ximian.com>
-
- * mail-config.[ch]: Moved all references to the Bonobo stuff into the .c file
-
-2001-05-08 Iain Holmes <iain@ximian.com>
-
- * mail-callbacks.c (filter_edit): Set the title of the dialog.
-
- * GNOME_Evolution_Mail.oaf.in: Add a reference for the MailConfig
- interface stuff.
-
- * Mail.idl: Add the MailConfig interface, and a MailFilter interface.
-
- * component-factory.c (component_factory_init): Call
- evolution_mail_config_factory_init.
-
- * mail-account-gui.c (setup_service): Just return if url == NULL,
- don't crash.
-
- * mail-config.c: #include bonobo-object.h, #include Mail.h and define
- the Config factory IID.
- Implement the MailConfig interface with a BonoboObject.
- (impl_GNOME_Evolution_MailConfig_addAccount): Convert the CORBA struct
- into the correct MailConfig structures and add the account.
- (evolution_mail_config_class_init): Initialise the class.
- (evolution_mail_config_init): This function is intentionally left blank.
-
- (evolution_mail_config_factory_fn): Create an EvolutionMailConfig object
- and return it.
- (evolution_mail_config_factory_init): Set up the bonobo factory.
-
- * mail-config.h: #include bonobo-xobject.h and Mail.h
- Declare the object structures.
-
- * importers/Makefile.am: Remove the intelligent importers.
-
- * importers/evolution-mbox-importer.c (folder_created_cb): Callback
- from when the folder is created. Opens the folder and unrefs the
- listener.
- (load_file_fn): Create the folder if it doesn't exist.
-
-2001-05-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-tools.c (mail_tool_forward_message): Convert the Subject
- header to HTML and also make sure that the Subject, To, and From
- header values are non-NULL before feeding them into
- e_text_to_html().
-
- * mail-callbacks.c (edit_msg_internal): Free the UIDs if the user
- decides to not go through with editing all the messages he
- selected.
- (resend_msg): If the user attempts to resend more than 10
- messages, make sure he really means it.
- (do_resend_messages): Richard Zach feels that "Resend" should open
- the message(s) in a composer since he might want to edit at least
- the recipients (maybe he needs to resend because the message
- bounced the first time) and Ettore wants pretty much the same
- thing. This makes "Resend" basically the same as "Edit" but for
- previously sent messages, whereas "Edit" is only for Drafts.
-
-2001-05-08 Gediminas Paulauskas <menesis@delfi.lt>
-
- * mail-search.c: convert search entry to utf8.
-
- * mail-local.c: d() debugging message.
-
- * mail-send-recv.c: replace " ..." with "..."
-
- * Makefile.am: removed EVOLUTION_VERSION.
-
-2001-05-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c: s/HAVE_NSS/HAVE_SSL for the SSL checkbox
- stuff.
-
-2001-05-07 Dan Winship <danw@ximian.com>
-
- * folder-browser.c (my_folder_browser_init): Connect to
- key_press_event on the GtkHTML widget.
- (etree_key): Only handle space/backspace here, pass the rest off
- to on_key_press.
- (on_key_press): Handle Delete/N/P/Menu in either MessageList or
- MailDisplay.
-
- * message-list.c (message_list_select): Grab focus if we don't
- have it.
-
-2001-05-03 Dan Winship <danw@ximian.com>
-
- * message-list.c: #include <camel/camel-file-utils.h>
-
- * mail-ops.c (get_folderinfo_get):
- * subscribe-dialog.c (build_tree): Update for
- camel_store_get_folder_info prototype change.
-
- * mail-format.c (handle_text_plain_flowed): Improve more on the
- fix from the other day: the first level of indentation adds blank
- lines, but further levels don't...
-
-2001-04-30 Dan Winship <danw@ximian.com>
-
- * folder-browser.c (folder_browser_destroy): Unhook event handlers
- before syncing the folder, since the folder browser will have been
- destroyed by the time the sync thread completes and calls the
- signal handlers.
-
-2001-04-29 Dan Winship <danw@ximian.com>
-
- * mail-format.c (handle_text_plain_flowed): Mojo this a bit so
- that "\n\n>" gets translated to "<br><blockquote>" rather than
- "<br><br><blockquote>", since the transition to blockquote mode
- creates a blank line itself. Makes Mozilla-generated flowed
- replies look better.
-
-2001-04-27 Dan Winship <danw@ximian.com>
-
- * mail-session.c: Renamed from session.c and made to be a subclass
- of CamelSession.
-
- * mail-mt.c (mail_user_message): Renamed from mail_get_accept and
- made more general-purpose, to implement the new
- camel_session_alert_user.
-
-2001-04-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * main.c (main): No need to camel_shutdown() anymore...
-
- * mail-callbacks.c (next_msg): Don't filter on Seen status.
- (previous_msg): Same.
- (next_unread_msg): New function that does what the old callback
- next_msg callback did (only better named).
- (previous_unread_msg): Same.
-
- * message-list.c (hide_load_state): Updated to use camel-file-util
- routines.
- (hide_save_1): Same.
- (hide_save_state): And here too.
-
-2001-04-26 Dan Winship <danw@ximian.com>
-
- * Makefile.am (INCLUDES): Remove UNICODE_CFLAGS
-
- * mail-format.c (handle_text_plain_flowed): Use <font color=...>
- to mark citations rather than italicizing them, which has never
- looked very nice. Now this is more consistent with the non-flowed
- case.
-
-2001-04-26 Jon Trowbridge <trow@ximian.com>
-
- * folder-browser-factory.c: Added "MessageSearch" verb.
-
- * mail-callbacks.c (search_msg): Added search callback.
- (are_you_sure): Added some casts to fix compiler warnings.
-
- * mail-search.c: Added. A simple search-in-message widget,
- that uses GtkHTML's searching capabilities.
-
-2001-04-25 Dan Winship <danw@ximian.com>
-
- * mail-callbacks.c (are_you_sure): New foot-shooting-prevention
- helper function.
- (edit_msg_internal, view_msg): If the user has more than 10
- messages selected, ask before opening them all in separate
- windows, to protect against misclicks/typos after "select all"
- (which we've had at least two reports of now).
-
-2001-04-25 Radek Doulik <rodo@ximian.com>
-
- * mail-tools.c (mail_tool_quote_message): set object data directly
- in HTML source
-
- * mail-callbacks.c (mail_generate_reply): remove \n from citation
- (mail_generate_reply): don't use e_msg_composer_mark_text_orig
-
-2001-04-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c: Added a new signal, "message_loaded" that gets
- emitted when the message has been loaded and set on the
- mail_display.
- (folder_browser_class_init): Define the "message_loaded" signal
- stuff.
- (done_message_selected): Emit the "message_loaded" signal here.
-
- * message-browser.c (message_browser_next_msg): Do our own
- message-list manipulation. We want the next message, not the next
- unread message.
- (message_browser_prev_msg): Same here but for previous.
- (message_browser_new): Connect to the folder browser's
- "message_loaded" signal.
- (message_browser_folder_loaded): Don't connect to the
- message-list's "message_selected" signal.
- (message_browser_message_loaded): Nw callback which replaces the
- old message_browser_message_selected callback's functionality.
-
-2001-04-24 Dan Winship <danw@ximian.com>
-
- * folder-browser.c: Add accelerators to the context menu.
- (on_right_click): Use e_tree_get_cell_geometry and a
- GtkMenuPositionFunc when responding to a Menu-key press so we can
- line the menu up with the selected row rather than the cursor.
-
- * message-browser.c: include <gal/util/e-util.h> for E_MAKE_TYPE.
-
-2001-04-23 Jon Trowbridge <trow@ximian.com>
-
- * mail-display.c (html_button_press_event): Check for mailto:
- links, and pop up our mail address menu when we find one.
- (make_popup_window): The main piece of code (ignoring a zillion
- little callbacks) to pop up our windows with reasonable semantics
- for having them close automatically.
- (mail_text_write): Enable converting addresses to mailto links
- in message bodies.
-
- * mail-format.c (write_address): Simplify code, removing Radek's
- <DATA> hacks. Write out addresses as mailto: links.
-
-2001-04-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (do_view_message): Use the message-browser
- widget rather than the mail-view window.
-
- * mail-view.c: Removed.
-
- * folder-browser.c: Added a folder_loaded signal.
-
- * message-browser.[c,h]: New window to solve all our message
- browsing needs. This replaces mail-view.c.
-
- * message-list.c (message_list_select_uid): New function needed by
- the new message-browser window.
-
-2001-04-23 Dan Winship <danw@ximian.com>
-
- * mail-callbacks.c (save_msg): Append a "/" to the result of
- g_get_home_dir so gets the default dir it was supposed to.
-
-2001-04-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (mail_send_message): Lets do proper refcounting on
- the sent-folder. Also, g_strdup() the sent_folder_uri since we
- later free it. If we don't, then we get lovely corrupt memory.
-
- * mail-crypto.c (mail_crypto_pgp_mime_part_sign): Make sure we
- have a context before we try and use it.
-
-2001-04-22 Gediminas Paulauskas <menesis@delfi.lt>
-
- * folder-browser.c, mail-autofilter.c, mail-callbacks.c,
- mail-ops.c, mail-summary.c, mail-vfolder.c: use system =
- EVOLUTION_DATADIR "/file" instead of g_strdup_printf. Rename
- userrules to user (and system) to be consistent.
-
- * mail-send-recv.c: set window icon to send-receive.xpm
-
-2001-04-21 Gediminas Paulauskas <menesis@delfi.lt>
-
- * mail-summary.c: translate "Mail summary".
-
-2001-04-20 Dan Winship <danw@ximian.com>
-
- * mail-config-druid.c (make_default_account): Convert the result
- of g_get_real_name() from the locale charset to UTF8. Noted by
- Petter Sundlöf (NOT "Petter Sundl_" :)
-
-2001-04-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_set_pgp_type): Use a CamelPgpType.
- (mail_config_get_pgp_type): Return a CamelPgpType.
- (auto_detect_pgp_variables): auto-detect the user's pgp settings.
-
-2001-04-20 Dan Winship <danw@ximian.com>
-
- * mail-format.c (handle_text_plain): Fix a dumb thinko in my 04-11
- patch.
-
-2001-04-20 Kjartan Maraas <kmaraas@gnome.org>
-
- * mail-ops.c: (send_mail_desc): Convert subject from utf8
- before passing it on.
-
-2001-04-20 Gediminas Paulauskas <menesis@delfi.lt>
-
- * mail-display.c: #if 0'd out my not-working selection code
-
-2001-04-19 Dan Winship <danw@ximian.com>
-
- * mail-format.c (mail_format_raw_message): Make this more raw:
- don't do URLs and citations.
-
-2001-04-18 Dan Winship <danw@ximian.com>
-
- * session.c (request_callback): Don't need to dup the string: the
- relevant gnome-dialog routine already does.
-
- * message-list.c (message_list_destroy): Free the uid_nodemap.
- (hide_save_state): Free the filename when we're done.
-
-2001-04-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (is_sent_folder): Implemented.
- (resend_msg): Use is_sent_folder().
-
-2001-04-17 Dan Winship <danw@ximian.com>
-
- * mail-mt.c (mail_msg_check_error): Fix a memory leak.
-
-2001-04-16 Ettore Perazzoli <ettore@ximian.com>
-
- * importers/Makefile.am (INCLUDES): Add `$(EXTRA_GNOME_CFLAGS)'
- here.
-
-2001-04-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (mark_all_as_seen): Mark the messages as seen,
- not unseen.
- (is_drafts_folder): New function to attempt to determine if a
- folder is a drafts folder.
- (open_msg): Use is_drafts_folder().
- (edit_msg): And here.
- (edit_msg_internal): New function that doesn't do the drafts
- checking and is only to be used internally. This should save us
- from having to doubly-check a folder to see if it's a drafts
- folder when doing an Open on the message.
- (open_msg): Call edit_msg_internal once we've established that the
- folder is a drafts folder.
-
-2001-04-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-crypto.c (mail_crypto_pgp_mime_part_verify): Only use
- non-NULL contexts.
- (mail_crypto_pgp_mime_part_encrypt): Same.
- (mail_crypto_pgp_mime_part_decrypt): And here too.
-
- * mail-format.c (try_inline_pgp_sig): Make sure to not use the
- context if it is NULL.
- (decode_pgp): Same.
-
- * folder-browser-factory.c: Added stuff for filtering/vfoldering
- on mailinglists.
-
-2001-04-13 Dan Winship <danw@ximian.com>
-
- * Makefile.am (evolution_mail_LDADD): Remove some redundant LIBS
- variables... purify complained that the command line was too
- long. :-}
-
- * mail-account-gui.c: Plug leaks.
-
- * mail-display.c (on_url_requested): close the html stream on
- error too.
-
- * mail-ops.c (fetch_mail_fetch): Move a line around that probably
- doesn't affect anything, but it's correct.
-
- * session.c (auth_callback): Plug leak.
-
- * mail-send-recv.c (receive_status): Initialize "now".
-
-2001-04-13 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.c (on_cursor_activated_cmd): Only activate the
- message if the cursor has moved.
-
-2001-04-12 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.c (e_mail_address_new): Updated this function to be
- a correct full ordering.
- (ml_has_get_node_by_id, ml_get_node_by_id): Implemented these
- functions.
- (find_next_undeleted): Changed this to find next sorted undeleted
- message. Also, changed it so that if the current message is not
- deleted, it returns NULL.
- (build_tree, build_flat): Changed these to only set the cursor if
- the cursor is changed.
-
- * subscribe-dialog.c: Changed this to pass NULL, NULL for
- has_get_node_by_id and get_node_by_id.
-
-2001-04-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * session.c (auth_callback): If the service is NULL, just use the
- item as the key.
-
- * mail-crypto.c (mail_crypto_pgp_mime_part_sign): Use the
- CamelCipherHash enum.
- (mail_crypto_pgp_mime_part_verify): Use a CamelCipherValidity.
-
- * mail-format.c (try_inline_pgp_sig): Updated to use
- CamelCipherValidity instead of CamelPgpValidity.
- (handle_multipart_signed): Same.
-
-2001-04-12 Dan Winship <danw@ximian.com>
-
- * folder-browser.c (do_message_selected, on_message_selected):
- Don't printf NULL
-
- * mail-format.c (mail_part_is_inline): Don't leak memory.
-
-2001-04-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (pgp_path_changed): Updated for changes to PGP
- code.
-
- * component-factory.c (owner_set_cb): Don't init openpgp anymore
- because we don't need it.
-
- * mail-crypto.c: Simply wrap the camel-pgp-mime functions (also
- renamed the functions to be prefixed with mail_crypto).
-
- * mail-format.c (handle_multipart_signed): Update to use
- camel_pgp_mime_is_rfc2015_signed() and other camel-pgp-mime
- functions.
- (handle_multipart_encrypted): Same but for rfc2015_encrypted.
- (decode_pgp): Updated to use camel-pgp-context
- (try_inline_pgp): Updated to use camel-pgp-context's.
- (try_inline_pgp_sig): Same.
-
-2001-04-11 Dan Winship <danw@ximian.com>
-
- * mail-format.c (handle_text_plain): Only look for special
- pseudo-multipart-isms (binhex, uucode, old pgp, etc) if the MIME
- type is really text/plain. Otherwise, since there's no handler for
- applciation/mac-binhex40, it gets sent to mail-identify.c, which
- thinks it's text/plain because it starts with English words, and
- so it gets sent back to the text/plain handler, which finds an
- embedded binhex part...
-
- * mail-callbacks.c (do_view_message): mark messages as seen when
- opening then in a separate window.
-
-2001-04-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * openpgp-utils.c (openpgp_encrypt): Don't g_free the recipient
- array members here because we free them in the caller.
-
-2001-04-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-crypto.c (pgp_mime_part_verify): Huh, somehow I forgot to
- apply the from filter when verifying signed parts. Oh well,
- probably not all that common. Fixed now though.
-
-2001-04-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (save_msg): Use the homedir as the default
- filename.
-
-2001-04-11 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.c (save_tree_state, message_list_setup_etree): Save
- the expanded state using the ETree built in expanded state code.
-
-2001-04-05 Not Zed <NotZed@Ximian.com>
-
- * Merge from evolution-0-10 to evolution-0-10-merge-0 into head.
-
-2001-04-04 Kjartan Maraas <kmaraas@gnome.org>
-
- * mail-account-gui.c: Add prototype for service_changed().
- * message-list.h: Remove #include <gal/e-table/e-tree-simple.h>
- since it doesn't get installed.
-
-2001-04-04 Gediminas Paulauskas <menesis@delfi.lt>
-
- * mail-config-druid.c (create_html): set content type to utf8.
- * mail-config.c (mail_config_check_service): fix warning.
- * mail-display.c (link_open_in_browser): just call on_link_clicked().
- (link_menu): Open link works.
- (link_copy_location): claim selection.
- (on_selection_get): new function, selection handler.
- (mail_display_new): connect to selection_get. FIXME: does not work.
-
-2001-04-04 Gediminas Paulauskas <menesis@delfi.lt>
-
- * component-factory.c: use big trash icon, stolen from mc.
-
-2001-04-03 Jeffrey Stedfast <fejj@ximian.com>
-
- * openpgp-utils.c (openpgp_encrypt): Add --no-tty argument to gpg.
-
-2001-04-03 Dan Winship <danw@ximian.com>
-
- * folder-browser-factory.c (control_activate): Sync the folder on
- activate.
-
- * session.c (mail_session_remember_password): Use the same
- URL-transforming rules we use when hashing the password so this
- actually works.
-
-2001-04-02 Iain Holmes <iain@ximian.com>
-
- * importers/elm-importer.c (elm_can_import): Call is_kmail to check for
- KMail files.
- (is_kmail): Checks if the given directory is a KMail directory.
-
-2001-04-02 Iain Holmes <iain@ximian.com>
-
- * importers/elm-importer.c (elm_can_import): Check for some MH files
- to make sure that the dir really is an Elm dir.
-
-2001-04-02 Dan Winship <danw@ximian.com>
-
- * mail-account-gui.c: Add a "provider_type" arg to
- MailAccountGuiService.
- (transport_needs_auth_toggled): Call service_changed if enabling
- the auth pane so the status of the "Check supported types" button
- will be correct.
- (service_check_supported): Use gsvc->provider_type, not
- CAMEL_PROVIDER_STORE.
- (mail_account_gui_new): Pass the transport as the user_data to the
- "changed" signal on transport.hostname, not the store.
- (mail_account_gui_setup): Set up provider_type fields
-
-2001-04-01 Gediminas Paulauskas <menesis@delfi.lt>
-
- * component-factory.c: changed vtrash icon to trash. doh
- * folder-browser-factory.c: pixmap cache got moved from here to
- e-util/e-gui-utils.c. Changed pixmap paths according to file renames.
- Added icons for print, get mail, etc., changed get mail icon as Jacub
- suggested.
- * subscribe-dialog.c: also use new pixmap cache.
-
-2001-03-30 Dan Winship <danw@ximian.com>
-
- * mail-config.c (check_service_check): Register for cancellation.
- (mail_config_check_service): Pop up a modal dialog with a message
- and a "Cancel" button for the duration of the check.
-
-2001-03-30 Iain Holmes <iain@ximian.com>
-
- * importers/evolution-mbox-importer.c (load_file_fn): Check if
- foldername is \0.
-
- * importers/evolution-outlook-importer.c (load_file_fn): Ditto.
-
-2001-03-30 Jon Trowbridge <trow@ximian.com>
-
- * mail-display.c (mail_text_write): Add (commented-out)
- E_TEXT_TO_HTML_CONVERT_ADDRESSES.
-
- * mail-config.c (mail_config_get_account_by_source_url):
- Call e_url_equal to compare URLs.
-
-2001-03-30 Dan Winship <danw@ximian.com>
-
- * component-factory.c (debug_cb): If the EvolutionShellComponent
- emits a "debug" signal, turn on camel_verbose_debug.
-
-2001-03-30 Radek Doulik <rodo@ximian.com>
-
- * mail-display.c (mail_display_redisplay): reset last_active
-
-2001-03-29 Jon Trowbridge <trow@ximian.com>
-
- * mail-callbacks.c: Added #include <time.h> to get things
- to compile.
-
- * mail-callbacks.c (mail_generate_reply): Look at the
- X-Evolution-Source header, and try to find a corresponding
- account. If this works, send the mail from this account.
- If not, use the default account.
-
- * mail-ops.c (send_queue_send): Strip out the X-Evolution-Source
- header before sending.
-
- * mail-config.c (mail_config_get_account_by_source_url): Added.
- Look up accounts by source URL.
-
-2001-03-29 Dan Winship <danw@ximian.com>
-
- * mail-format.c (call_handler_function): if called with a
- multipart that's really a 0-part, spew an error and display as
- source.
-
- * message-list.c: #include <camel/camel-vtrash-folder.h>
-
- * mail-callbacks.c: #include <libgnome/gnome-paper.h>
- for the gnome-print stuff.
-
- * mail-display.c (pixmap_press): Ignore "funky" button clicks
- (like scroll wheel scrolls)
-
-2001-03-29 Kjartan Maraas <kmaraas@gnome.org>
-
- * *.*: Cleaned up #includes. Remove unneccesary includes of
- <gnome.h>, <gtk/gtk.h>, <bonobo.h> and replaced with more
- fine grained headers where needed. Also marked a bunch of
- strings for translations and added some missing prototypes.
-
-2001-03-29 Dan Winship <danw@ximian.com>
-
- * mail-account-editor.c (switch_page): Fix this so the "Receiving
- Options" page gets filled in again.
-
- * mail-send-recv.c (receive_get_folder): Doh! This was storing
- "struct _folder_info"s in the cache and then trying to read them
- back as CamelFolders. Fixicate. Fixes the "crash with 2 POP
- accounts" bug.
-
- * session.c (auth_callback): Update call to camel_url_to_string.
- (Don't include the params in the password hash table key.)
-
- * mail-config.c (mail_config_folder_to_cachename): Call
- camel_url_to_string with HIDE_PASSWORD and HIDE_PARAMS so that
- changing URL params doesn't change the cachename.
-
- * mail-ops.c (add_vtrash_info):
- * mail-local.c (reconfigure_folder_reconfigure):
- * mail-account-gui.c (save_service): Update calls to
- camel_url_to_string.
-
-2001-04-03 Dan Winship <danw@ximian.com>
-
- * folder-browser-factory.c (control_activate): Sync the folder on
- activate.
-
- * session.c (mail_session_remember_password): Use the same
- URL-transforming rules we use when hashing the password so this
- actually works.
-
-2001-04-03 Not Zed <NotZed@Ximian.com>
-
- * mail-ops.c (mail_send_message): Strip header content before using it.
-
-2001-04-02 Iain Holmes <iain@ximian.com>
-
- * importers/elm-importer.c (elm_can_import): Calls is_kmail to
- check for kmail files.
- (is_kmail): Checks if the given directory is a KMail directory.
-
-2001-04-02 Dan Winship <danw@ximian.com>
-
- * mail-account-gui.c: Add a "provider_type" arg to
- MailAccountGuiService.
- (transport_needs_auth_toggled): Call service_changed if enabling
- the auth pane so the status of the "Check supported types" button
- will be correct.
- (service_check_supported): Use gsvc->provider_type, not
- CAMEL_PROVIDER_STORE.
- (mail_account_gui_new): Pass the transport as the user_data to the
- "changed" signal on transport.hostname, not the store.
- (mail_account_gui_setup): Set up provider_type fields
-
-2001-04-02 Iain Holmes <iain@ximian.com>
-
- * importers/elm-importer.c (elm_can_import): Check for some MH files
- to make sure that the dir really is an Elm dir.
-
-2001-03-30 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.c (folder_browser_toggle_hide_deleted): New
- function to listen for hide_deleted changes.
- (folder_browser_toggle_hide_deleted): Only svae the hide-deleted
- state if we are not setting a trash folder.
-
- * folder-browser-factory.c (control_activate): Set the
- hide_deleted flag appropriately/setup the menu's appropriately.
- (control_activate): Workaround to Force setting of options by
- bypassing bonobo notification, since it doesn't properly handle
- changed components.
-
- * mail-config.c (mail_config_get_hide_deleted):
- (mail_config_set_hide_deleted): New functions for
- accessing/setting the hide deleted state.
- (mail_config_write_on_exit):
- (config_read): Save/load the hide_deleted flag.
-
- * message-list.c (main_folder_changed): Oops, remember to copy
- over all the rest of the changes too if we removed some.
- (find_next_undeleted): Find the first undeleted message below us.
- This of course does not follow sorting conventions, but thats
- etree. Have to ask chris if there is a way to make it work like
- that.
- (message_list_set_hidedeleted): Check we dont set hide_delete on a
- vtrash.
- (build_tree): If the message has vanished, try and get the next
- undeleted message set, etc, if it still exists. The set_cursor()
- function seems very broken but i'm sure e-lahey will get to it
- soon.
- (build_flat): Similarly for above.
-
-2001-03-30 Dan Winship <danw@ximian.com>
-
- * mail-config.c (check_service_check): Register for cancellation.
- (mail_config_check_service): Pop up a modal dialog with a message
- and a "Cancel" button for the duration of the check.
-
- * component-factory.c (debug_cb): If the EvolutionShellComponent
- emits a "debug" signal, turn on camel_verbose_debug.
-
-2001-03-30 Radek Doulik <rodo@ximian.com>
-
- * mail-display.c (mail_display_redisplay): reset last_active
-
-2001-03-29 Dan Winship <danw@ximian.com>
-
- * mail-format.c (call_handler_function): if called with a
- multipart that's really a 0-part, spew an error and display as
- source.
-
- * mail-display.c (pixmap_press): Ignore "funky" button clicks
- (like scroll wheel scrolls)
-
-2001-03-29 Dan Winship <danw@ximian.com>
-
- * mail-account-editor.c (switch_page): Fix this so the "Receiving
- Options" page gets filled in again.
-
- * mail-send-recv.c (receive_get_folder): Doh! This was storing
- "struct _folder_info"s in the cache and then trying to read them
- back as CamelFolders. Fixicate. Fixes the "crash with 2 POP
- accounts" bug.
-
- * session.c (auth_callback): Update call to camel_url_to_string.
- (Don't include the params in the password hash table key.)
-
- * mail-config.c (mail_config_folder_to_cachename): Call
- camel_url_to_string with HIDE_PASSWORD and HIDE_PARAMS so that
- changing URL params doesn't change the cachename.
-
- * mail-ops.c (add_vtrash_info):
- * mail-local.c (reconfigure_folder_reconfigure):
- * mail-account-gui.c (save_service): Update calls to
- camel_url_to_string.
-
-2001-03-29 Not Zed <NotZed@Ximian.com>
-
- * mail-local.c (init_trash): Create a vtrash folder, not a vee folder.
-
- * folder-browser-factory.c (control_activate): Hook in the hide
- deleted thingy.
- Removed MessageHideDeleted menu stuff.
-
- * message-list.c (message_list_set_hidedeleted): New function, to
- set if we should hide deleted messages automatically/always.
- (regen_list_regen): If we have hide deleted messages turned on,
- then hide them.
- (main_message_changed): Promote to a folder_changed event with a
- change list, folder_changed has the optimisations to handle this
- appropriately.
- (main_folder_changed): IF we get changes events for
- deleted/undeleted stuff, change to added/removed events, rebuild
- if necessary.
- (message_list_set_folder): Setup the default hidedeleted state to
- be to hide everything unless it is in a vtrash folder.
-
-2001-03-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-gui.c (setup_service): Move the
- gtk_toggle_button_set_active outside the if.
-
-2001-03-28 Dan Winship <danw@ximian.com>
-
- * mail-account-gui.c (mail_account_gui_new): Set up the
- sent/drafts folder buttons.
- (folder_picker_clicked): Pop up the folder selector when sent or
- drafts is clicked.
- (mail_account_gui_save): Save the sent/drafts folders.
-
- * mail-config.c (account_copy): copy sent/drafts info
- (config_read): read sent/drafts info
- (mail_config_write): write sent/drafts info
-
- * mail-callbacks.c (composer_send_cb, composer_postpone_cb):
- split out some common code here (and fix inconsistencies). Always
- set headers on the message giving the account name, transport,
- and sent folder to use.
-
- * mail-ops.c (mail_send_message): If the message has an
- X-Evolution-Account header, use the transport/sent folder info for
- that account (assuming it still exists). Otherwise, if it has
- X-Evolution-Transport and/or X-Evolution-Fcc, use those. If not,
- use the default transport and sent folder.
- FIXME: Falls back silently to the default sent folder if it can't
- open the account-specific one...
- (send_queue_send): remove the X-Evolution-Transport, etc
- processing here, as it gets done by mail_send_message now.
- FIXME: We only sync the default sent folder.
-
- * component-factory.c (owner_set_cb): While setting up the
- standard folders, also record their URIs.
-
-2001-03-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-editor.c (switch_page): Lets do some NULL checking
- here. First, make sure the gsrc isn't NULL and also make sure that
- account->source isn't NULL either.
-
- * mail-account-gui.c (mail_account_gui_setup): If there isn't a
- source_proto, make sure we select "None" as the source type.
-
-2001-03-27 Dan Winship <danw@ximian.com>
-
- * mail-config-druid.c (construct): set the initial druid button
- state after doing the mail_account_gui_setup, since that may
- invoke signal handlers that will change it.
-
- * mail-account-gui.c (mail_account_gui_new): Fill in signature and
- organization too.
- (mail_account_gui_save): Preserve the "enabled" flag on the source.
- (save_service): Don't look at authtype if the widget is
- insensitive. (Fixes the "smtp://;auth=PLAINservername" bug.)
-
-2001-03-27 Not Zed <NotZed@Ximian.com>
-
- * mail-send-recv.c (receive_done): Use gnome-dialog-close instead
- of object_unref, for some reason it doesn't like being unref'd
- with a refcount of 1, _who knows_. Gets rid of that refcount
- warning on get mail.
-
-2001-03-27 Dan Winship <danw@ximian.com>
-
- * mail-config.glade: Probably the very last new config dialog
- ever. (Ha ha). From Anna, based on a story by me.
-
- * mail-account-gui.c: New code for the new mail-config.glade. This
- abstracts out all of the common code between the account editor
- and the druid. It also handles the spiffy new provider-specific
- config stuff.
-
- FIXME: The code to check if a service is ok or not is no longer
- there... waiting until the online/offline stuff from the shell
- appears.
-
- * mail-account-editor.c, mail-config-druid.c: These are much
- smaller now, since most of the interesting bits moved to
- mail-account-gui.c
-
- * mail-accounts.c: Add an enabled/disabled column/button to
- replace the checkbox that used to be in the editor, because it
- really makes more sense to have it out here. This looks ugly.
- Probably ought to ETable it...
- (load_accounts): Fill in the enabled column.
- (mail_select, mail_unselect): toggle the sensitivity and name of
- the Enable/Disable button appropriately
- (mail_able): Handle the enable/disable button.
-
- * mail-config.c: Remove reply-to from MailConfigIdentity since it
- didn't belong there (and wasn't being saved anyway).
- (mail_config_check_service): Simplify this a bit. This really
- needs to pop up a dialog with a "connecting..." message and a
- cancel button.
-
- * mail-ops.c (uid_cachename_hack): Kludge, copied+modified from
- mail_config_folder_to_cachename to deal with the different
- behavior of the URL code now. Will go away when the keep-on-server
- code moves.
- (get_folderinfo_get): Only pass "subscribed_only" to
- camel_store_get_folder_info if the store supports subscriptions...
-
- * mail-local.c (local_provider): Update this to reflect the
- CamelProvider structure change
-
-2001-03-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (transfer_msg): Add "vtrash" as an allowed mail
- folder type.
-
- * mail-ops.c (transfer_messages_transfer): Updated to reflect
- changes made to the move/copy API in camel-folder.c
- (add_vtrash_info): Use /Trash as the path instead of Trash.
-
- * mail-local.c (reconfigure_folder_reconfigure): Updated this too.
-
-2001-03-20 Not Zed <NotZed@Ximian.com>
-
- * mail-local.c (init_trash): Fixed vfolder_new api.
-
-2001-03-26 Dan Winship <danw@ximian.com>
-
- * mail-format.c (get_cid): Make fake content-id URLs be guaranteed
- unique: the old way (with %p on the CamelMimePart *) would
- generate duplicates if memory was freed and re-allocated the right
- way.
-
- * mail-display.c (pixbuf_gen_idle, etc): Make the thumbnail cache
- global rather than per-MailDisplay, since content-ids ought to be
- globally unique. Also, don't leak content-id strings when the
- pixbuf generation fails, and remove pixbufs from the cache after 5
- minutes.
-
- * component-factory.c (mail_load_storages): Simplify a bit using
- camel_session_get_provider.
-
- * mail-callbacks.c (empty_trash): Ditto, and fix up use of
- CamelException.
-
-2001-03-26 Radek Doulik <rodo@ximian.com>
-
- * mail-format.c (write_address): clear name and email data after
- each address
-
-2001-03-25 Dan Winship <danw@ximian.com>
-
- * component-factory.c (unref_standard_folders): Fix a bug in this
- that probably would have been noticed sooner if ETree hadn't always
- made the mailer crash before you got here. :-)
-
-2001-03-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-editor.c (transport_auth_type_changed): Allow the
- authtype to be NULL.
- (transport_auth_init): If the provider allows authtypes but
- doesn't *need* one, create a "None" menu item that the user can
- choose. This should fix the bug people have been seeing recently
- since dan removed the no_authtype authmech from the smtp provider.
-
-2001-03-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * openpgp-utils.c (openpgp_verify): Default to iso-8859-1 as the
- user's charset here if it is undefined. This is a better choice
- than us-ascii.
-
-2001-03-23 Jon Trowbridge <trow@ximian.com>
-
- * mail-display.c (handle_embedded_address_object): #ifdef away
- some code I don't quite want to delete yet.
- (html_button_press_event): Remove some of Radek's placeholder
- code, replace it with code to create my AddressPopup bonobo
- control.
-
- * mail-format.c: Remove some obsolete code that if #ifdef-ed out
- a while ago.
-
- * mail-ops.c (send_queue_send): Strip out the X-Evolution-Identity
- header when sending.
-
-2001-03-23 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.c: Turned on BROKEN_ETREE.
-
-2001-03-22 Iain Holmes <iain@ximian.com>
-
- * importers/evolution-outlook-importer.c: Update for new IDL.
-
- * importers/evolution-mbox-importer.c: Update for new IDL.
-
- * importers/Makefile.am: Build the elm importer.
-
-2001-03-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (mail_double_click): New callback to handle a
- double-click event in the account clist.
- (construct): Setup the double-click event for the account list.
-
-2001-03-22 Radek Doulik <rodo@ximian.com>
-
- * mail-display.c (mail_display_new): connect to button_press_event
- and iframe_created events of GtkHTML widget
- (html_button_press_event): new signal handler, runs popup on
- address fields and on links, later we should add popups for images
- and maybe some more? any ideas?
- (html_iframe_created): new signal handler, takes care of
- connecting to button_press_event of all iframes : plus bunch of
- empty methods for popup menu items - to be implemented
- (html_motion_notify_event): new handler, highlights addresses by
- underline
- (html_enter_notify_event): take care of enter event
- (update_active): helper function, extracted from
- html_motion_notify_event
- (update_active): move to absolute coordinates
- (html_button_press_event): ditto
-
- * mail-format.c (write_address): revert back to raw HTML text,
- store name and email to Text objects, workaround gtkhtml tables
- bug (to be fixed soon ;-)
-
-2001-03-21 Ettore Perazzoli <ettore@ximian.com>
-
- * folder-browser-factory.c (update_pixmaps): Don't return if
- loading one image fails.
-
-2001-03-21 Dan Winship <danw@ximian.com>
-
- * mail-format.c (handle_multipart_related): Fix a bug in (illegal)
- 0-part messages
-
- * mail-config-druid.c (incoming_check, incoming_type_changed,
- transport_check, transport_type_changed): * mail-account-editor.c
- (transport_type_changed, source_check): Use the new URL part
- macros
-
- * mail-config.c (check_service_check): Use provider authtype list
- if not connecting.
-
-2001-03-20 Miguel de Icaza <miguel@ximian.com>
-
- * folder-browser-factory.c: Added new icons.
-
-2001-03-18 Miguel de Icaza <miguel@ximian.com>
-
- * folder-browser-factory.c: Remove duplicated verb.
-
-2001-03-20 Iain Holmes <iain@ximian.com>
-
- * importers/evolution-mbox-importer.c (process_item_fn): Step the
- parser so that it will import more than one message.
-
-2001-03-20 JP Rosevear <jpr@ximian.com>
-
- * importers/Makefile.am: extra dist the oaf files
-
-2001-03-20 Radek Doulik <rodo@ximian.com>
-
- * mail-tools.c (mail_tool_quote_message): set color in html
- citation
-
- * mail-config.c: added citation highlighting configuration
-
- * mail-tools.c (mail_tool_quote_message): use citation
- highlighting
-
- * mail-display.c (mail_text_write): use citation highlighting
-
-2001-03-20 Christopher James Lahey <clahey@ximian.com>
-
- * folder-browser.c (etree_key): Made this check if the control
- mask is set.
-
-2001-03-20 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.c (remove_node_diff, build_flat_diff): Remove the
- node before freeing the data it points to.
-
-2001-03-19 Christopher James Lahey <clahey@ximian.com>
-
- * Merged e-tree-rework-branch:
-
-2001-03-18 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.c: Added has_save_id and get_save_id methods.
-
- * subscribe-dialog.c: Added arguments for
- e_tree_memory_callbacks_new of get_save_id and has_save_id to
- NULL.
-
-2001-03-16 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.c: Added a call to
- e_tree_memory_set_expanded_default to TRUE. Removed all calls to
- set_expanded on nodes while the tree is frozen since this fails
- miserably now.
-
-2001-03-13 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.c (message_list_get_layout): Turned off draw-grid.
-
-2001-03-09 Christopher James Lahey <clahey@ximian.com>
-
- * folder-browser-factory.c, folder-browser.c, message-list.c,
- message-list.h, subscribe-dialog.c, subscribe-dialog.h,
- mail-callbacks.c: Converted these all to use ETree instead of
- ETable.
-
-End of branch
-
-2001-03-19 Iain Holmes <iain@ximian.com>
-
- * importers/pine-importer.c: Pine intelligent mail importer.
-
- * importer/elm-importer.c: Elm imtelligent mail importer.
-
- * importer/GNOME_Evolution_Mail_(Pine|Elm)_Intelligent_Importer.oaf.in:
- Pine and Elm oafinfo files.
-
- * importer/netscape-importer.c (maybe_replace_name): Replace some invalid
- names with valid ones (Trash -> Netscape-Trash). Change some netscape names
- to Evolution names (Unsent Messages -> Outbox).
- (scan_dir): Use less variables.
- (netscape_import_file): Simplify.
-
-2001-03-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c: Removed gnome.h and ctype.h
- (send_queue_send): Don't remove the X-Evolution header here.
- (mail_send_message): Remove it here instead (so we only have to
- remove it in one place - no matter if you send a single message or
- send_queue.
-
-2001-03-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (write_headers): Write the date header.
-
- * component-factory.c (owner_unset_cb): Call
- unref_standard_folders() here instead.
-
- * folder-browser-factory.c: Add Resend Message menu item.
-
- * folder-browser.c (on_right_click): Add resend to the right-click
- menu.
-
- * mail-callbacks.c (composer_sent_cb): Unref the message.
- (composer_postpone_cb): Unref the message here too.
- (resend_msg): New callback to allow resending of messages in the
- Sent folder.
-
-2001-03-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (unref_standard_folders): unref the standard
- folders.
- (owner_set_cb): Use g_atexit() to call unref_standard_folders()
- when evolution-mail exits. This should solve the problem where
- these folders are not synced when evolution-mail closes (because
- they still had refs on them on close).
-
-2001-03-17 Not Zed <NotZed@Ximian.com>
-
- * mail-mt.c (mail_msg_free): Move the proxy event outside the lock
- (otherwise we always deadlock).
-
- * mail-local.c (reconfigure_clicked): Clear the message list
- during update inside the folder thingy. This is a hell mess, need
- to move the gui stuff to mail-callbacks and make this reconfigure
- thing a more generic func.
-
- * message-list.c (ml_value_to_string): Cleanup the logic to use
- lookup tables.
- (sort_uid_to_rows): Removed due to rewrite below.
- (build_flat_diff): Changes for node/summary/etc changes. Also do
- changed nodes too.
- (clear_tree): Free the info reference for nodes in our hashtable.
- (build_subtree): Ref the info reference in our hash/tree node.
- (on_click): Dont free message info, since we just got our ref to
- it.
- (remove_node_diff): Free messageinfo off node.
- (build_flat): Ref messageinfo.
- (message_list_set_folder): Allow a NULL folder to be set -
- i.e. clear the view.
- (message_list_set_folder): Emit a no message sleeted signal.
- (build_tree): Change cursor keeping stuff to work with new info.
-
- Turned off BROKEN_ETREE - well maybe it'll work. Check for
- duplicate messages displayed, etc.
-
-2001-03-16 Not Zed <NotZed@Ximian.com>
-
- * message-list.h: Added uid_nodemap; mapping of uid's to e-tree
- nodes.
-
- * message-list.c (build_flat): Changed to take a summary argument,
- and to store node in node map, etc, and store info's in e-tree.
- (build_subtree): Changed to store node in node map, and to store
- info's in tree directly.
- (ml_tree_value_at): Changed to get info directly from tree node,
- removed allocated return value logic.
- (ml_tree_value_at): Removed all "fake node" handling, no fake
- nodes should ever exist.
- (id_is_uid, id_is_subject, id_uid, id_subject): Removed macro's no
- longer used.
- (new_id_from_uid, new_id_from_subject): Removed no longer used.
- (get_message_uid):
- (get_message_info): Treat tree node data as messageinfo.
- (message_list_select): Dont free the messageinfo, as its part of
- our data, not retrieved from folder.
- (message_list_drag_data_get): ditto.
- (subtree_unread): Treat tree node data as messageinfo.
- (subtree_size): ditto.
- (subtree_earliest): ditto.
- (clear_tree): Reset uid_nodemap on clear.
- (save_node_state): tree nodes == messageinfo's.
- (add_node_diff): ditto.
- (remove_node_diff): ditto.
- (main_folder_changed): use uid_nodemap to lookup changed nodes.
- (main_message_changed): ditto.
-
-2001-03-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-crypto.c (pgp_mime_part_sign_prepare_part): New function to
- prepare the mime part and any subparts for pgp signing.
- (pgp_mime_part_sign_restore_part): New convenience function to
- undo the prepare_part.
- (pgp_mime_part_sign): Don't assume the part passed in is a leaf
- part, we could very easily get a multipart (and in fact were which
- is why people have been having unexpected results when signing
- messages with attachments) and set the encoding as if it were a
- leaf part. Use our 2 new convenience functions to set the
- encoding(s) instead.
-
-2001-03-15 Miguel de Icaza <miguel@ximian.com>
-
- * folder-browser-factory.c (folder_browser_setup_view_menus): Fix
- memory leak.
-
-2001-03-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-editor.c (apply_changes): We don't care about SSL,
- yea baby...
- (apply_changes): Don't care about SSL, no baby...
- (construct): Yea, I said we don't care 'bout SSL, baby
- (construct): That's exactly what I said, uh huh...
- (transport_auth_type_changed): Set the sensitivity of the
- user/passwd entries.
- (transport_type_changed): If the hostname hasn't been set yet,
- just use "localhost" as it doesn't really matter, since all we
- need is a valid URL object.
-
- * mail-config.c: We no longer need `use_ssl' for sources and
- transports.
-
-2001-03-15 Dan Winship <danw@ximian.com>
-
- * mail-display.c (mail_display_redisplay): Remove a stray
- camel_object_ref that was causing messages to never be finalized
- if they got redisplayed (because of attachments, delayed-loading
- IMAP parts, etc)
-
-2001-03-15 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.c: Added edit item to search-bar menu.
-
- * mail-callbacks.c (filter_edit): Changed for filter_editor_new()
- api addition/change.
-
- * mail-vfolder.c (vfolder_edit): Use vfolder_editor_new intead.
-
-2001-03-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * session.c (mail_session_init): Tell camel to init NSS.
- (mail_session_accept_dialog): Doh! NULL terminate the list of
- buttons and show the label.
-
- * mail-mt.c (do_get_accept): Same.
-
-2001-03-14 Ettore Perazzoli <ettore@ximian.com>
-
- * importers/Makefile.am (INCLUDES): Add `-I$(top_builddir)/shell'
- and `-I$(top_srcdir)'.
-
-2001-03-13 Dan Winship <danw@ximian.com>
-
- * mail-display.c (on_url_requested): Call gtk_html_end() on the
- stream so things happen. Fixes a problem with some inline images
- (just very small ones maybe?)
-
- * importers/.cvsignore: create
-
-2001-03-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * session.c (mail_session_init): Call camel_init with the
- evolution directory passed in. Also, abort if camel cannot be
- initialized.
-
- * main.c (main): Shutdown camel.
-
-2001-03-04 Michael Meeks <michael@ximian.com>
-
- * folder-browser-factory.c (free_pixmaps): impl.
- (update_pixmaps): accelerate with cache.
-
-2001-03-13 Iain Holmes <iain@ximian.com>
-
- * Makefile.am: Removed the importers and created a subdirectory
- for them to live happily as plugins.
-
- * mail-importer.c (mail_importer_create_folder): Modified the
- function to take a BonoboListener for the callback.
- (get_importer_list): Get a list of importer plugins.
- (free_importer_list): Free the list of plugins.
- (mail_importer_init): Initalise the list of plugins.
- (main_importer_uninit): Unload the modules.
-
- * GNOME_Evolution_Mail.oaf.in: Remove the oaf_server entries for
- the importers.
-
- * importers/*: Copy the importers in here.
-
-2001-03-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_write): Make the transport save
- whether or not it's supposed to use SSL as well.
- (config_read): Read in whether or not we should remember the
- transport password (for those that support SASL).
- (mail_config_write): Save whether or not to save transport
- passwords (needed for SASL enabled transports).
-
- * mail-ops.c (add_vtrash_info): Instead of always creating a new
- vTrash folder, if the store already has a Trash folder, replace it
- with the vTrash. Also, name the folder "Trash" instead of "vTrash"
- and i18nify the name.
-
-2001-03-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.h: Added protection.
-
- * folder-browser-factory.c: Add ActionsEmptyTrash. By the way -
- should we rename the bonobo verbs now that our menu structure has
- changed?
-
- * mail-callbacks.c (empty_trash): New callback to empty ALL of the
- trash folders.
-
-2001-03-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (send_queue_send): Remove our X-Evolution header
- before we send. Also don't send messages that are marked for
- deletion.
-
-2001-03-09 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-mt.c (mail_get_accept): New async function that will be
- used for SSL certs later.
-
- * session.c (auth_callback): Changed to return a gpointer value.
- (mail_session_accept_dialog): New function to handle the new
- _ACCEPT authenticator mode.
-
-2001-03-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-factory.c: Set the Forward->Quoted callback.
- Also set the forward->Attachment callback.
-
- * mail-view.c (view_forward_msg): Specify FORWARD_ATTACHED.
-
- * mail-callbacks.c (forward_attached): Don't call
- forward_messages() anymore...never really needed to. Just handle
- it directly.
- (forward_inlined): Specify FORWARD_INLINE as the flag argument.
- (forward_quoted): New function sorta like forward_inlined except
- this forwards the message quoted.
-
- * mail-tools.c (mail_tool_forward_message): New function to
- prepare a message to be forwarded.
-
-2001-03-08 Jon Trowbridge <trow@ximian.com>
-
- * mail-format.c (write_field_row_begin): Added. Table row HTML
- broken out into its own function.
- (write_subject): Added. Emits the proper HTML for the subject
- line.
- (write_field_to_stream): #ifdef-ed out of existence.
- (write_address): Take a CamelInternetAddress and spit out an
- <object> tag with the appropriate <param>s.
-
- * mail-display.c (on_object_requested): Check for an "address"
- object. If found, call...
- (handle_embedded_address_object): ...this function, which creates
- an AddressWidget bonobo control and passes in the necessary info.
- I never really realized just quite how much GtkHTML kicks ass
- until I figured out how to make this work.
-
-2001-03-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-vtrash.[c,h]: Removed from cvs
-
- * Makefile.am: Removed mail-vtrash.[c,h]
-
- * main.c: Don't #include "mail-vtrash" anymore.
-
- * component-factory.c: Add "vtrash" as a folder type we support.
- (create_view): Kludgy-kludge around the vtrash type.
- (owner_set_cb): Don't create the vTrash folder here anymore...
-
- * folder-browser.c (on_double_click): Call open_msg here so that
- it does the Right Thing (tm).
-
-2001-03-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-local.c (mail_local_store_class_init): Override the default
- init_trash() with the our custom one (since MailLocalStore doesn't
- let the CamelStore keep a hash of opened folders and instead
- keepts track of them itself).
- (init_trash): custom implementation of the init_trash method for
- MailLocalStores
- (get_folder): i18nize.
- (register_folder_registered): Don't add the folder to the vtrash
- here.
-
-2001-03-08 Ettore Perazzoli <ettore@ximian.com>
-
- * component-factory.c (component_fn): Specify a NULL
- `EvolutionShellComponentGetDndSelectionFn'.
-
-2001-03-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-autofilter.c (filter_rule_from_message): Add an action-part
- widget.
- (filter_rule_from_mlist): Same here. This should get rid of the
- problem where people go to create a rule based on a message and
- forget to fill-in the action part.
-
-2001-03-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-crypto.c (mail_crypto_is_smime_v3_signed): New function to
- decide if a mime part is an S/MIME v3 signed part.
- (mail_crypto_is_pkcs7_mime): New function to decide if a mime part
- is an application/pkcs7-mime part (or an application/octet-stream
- part with application/pkcs7-mime data).
-
- * mail-account-editor.c (source_auth_init): Move the signal
- emittion to after the set_menu call so that it actually works.
- (transport_type_changed): Updated to manipulate the user/passwd
- fields for the transport.
- (construct): Updated to init the user/passwd fields for the
- transport.
- (transport_auth_init): Renamed. Also fill in the user/passwd
- fields if available.
-
-2001-03-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (construct): Disable the NNTP code if NNTP is
- not enabled. This prevents some runtime warnings...
-
- * mail-config-druid.c: Updated to have a transport auth page.
-
-2001-03-01 Miguel de Icaza <miguel@ximian.com>
-
- * folder-browser.c (on_right_click): Move the context menus to
- the toplevel code; Use enumerations for the various bitfield
- constants.
-
- Add support for hiding items that are not required (read/unread
- and delete/undelete).
-
- This requires my previous patch, as it assumes "Open" does the
- right thing instead of having two operations: Open and Edit.
-
-2001-02-28 Miguel de Icaza <miguel@ximian.com>
-
- * folder-browser.c (on_right_click): Removed draft folders op
- here, since open_msg now does the right thing (edit or view).
-
- * folder-browser-factory.c (update_pixmaps): Removed MessageEdit
- from here.
-
- * mail-callbacks.c (open_msg): New function, does the "right
- thing" to a message (either, edit or open).
-
- * folder-browser-factory.c: Register new command here.
- (update_pixmaps): Rename keys that have been shuffled around.
- (update_pixmaps): Rename to match new updates on xml file.
-
- Rename MessageOpenNewWindow to MessageOpen. Change action from
- "view_message" to "open_message".
-
- * mail-callbacks.c (mark_all_as_seen): New command. Marks all
- messages as seen.
-
-2001-03-06 Dan Winship <danw@ximian.com>
-
- * mail-ops.c (get_folderinfo_got): If the folderinfo has no URL
- (ie, can't contain messages), don't add it as a vtrash source.
-
-2001-03-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c: Don't access the `active` data member of a
- GtkToggleButton directly - bad programming, shame on me.
-
- * mail-account-editor.c: Same here.
-
- * mail-accounts.c: And here too.
-
- * mail-callbacks.c (empty_subject_destroyed): And finally here.
-
- * mail-crypto.c (pgp_mime_part_sign): Correcty set the mime type
- for the multipart. Hmmm, still doesn't wrap correctly. NotZed?
- Ideas?
- (pgp_mime_part_encrypt): Here too.
-
-2001-03-03 Not Zed <NotZed@Ximian.com>
-
- * mail-tools.c: Remove very old camel lock stuff.
-
- * mail-local.c (register_folder_registered): Add the local folder
- as a potential vfolder source.
-
- * folder-browser.c (got_folder): When we have a new folder,
- register it as a potential vfolder source.
-
- * mail-vfolder.c: Added the source rule to the vfolder_info.
- (vfolder_refresh): Store the rule in the vfolder info, etc.
- (vfolder_register_source): Function to register a newly opened
- folder with us.
- (vfolder_uri_to_folder): Save the folder in the vfolder_info too.
- (source_finalise): Handle clenaup when the folder dies.
-
-2001-03-02 Not Zed <NotZed@Ximian.com>
-
- * mail-mt.c (set_stop): Check the container is not NIL before
- trying to set thje prop.
-
-2001-03-01 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.c (folder_browser_search_menu_activated): Fixes
- for changes to search bar.
- (search_save): Removed.
- (search_full): Removed.
- (search_full_clicked): Removed.
- (folder_browser_search_option_items[]): Removed.
- (folder_browser_search_query_changed): Changed for search bar
- changes.
- (folder_browser_clear_search): Removed.
-
- * mail-vfolder.c (vfolder_clone_rule): New function to clone a
- filter/search rule into a matching vfolder rule.
-
- * mail-send-recv.c (mail_receive_uri): Setup a timeout for status
- updates.
- (build_dialogue): Setup timeout id for status updates.
- (operation_status_timeout): New function to set the status via a
- timeout.
- (receive_done): Remove the timeout handler if we need to.
- (operation_status):
- (receive_status): Just update the info, and let the timeout
- handler update the gui.
- (do_free_status):
- (do_show_status): Removed gui thread status message processing.
-
-2001-02-28 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.c (folder_browser_config_search): New function to
- configure the FilterRule for the search mechanism.
-
-2001-02-27 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.c (folder_browser_gui_init): Setup the search bar
- as a filterbar.
- (got_folder): Set the whole search bar sensitive or not based on
- the search capability of the folder.
-
- * folder-browser.h: Changed to use efilterbar instead of esearchbar.
-
-2001-02-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (configure_mail): Return TRUE if the user
- configured his/her settings, else return FALSE.
- (check_send_configuration): If configure_mail() returns TRUE, then
- continue otherwise quit.
- (send_receive_mail): Same.
-
-2001-02-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): Set a "References"
- header no matter what if we are able to get a Message-Id. Fixes
- bug #1583.
-
- * mail-accounts.c (mail_delete): Confirm that the user REALLY
- wants to delete this account.
- (news_delete): Same.
-
- * mail-ops.c (mail_send_message): Changed the product string -
- will change it to use User-Agent once I get the RFC/DRUMS draft or
- whatever. Until then I'll stick with X-Mailer.
-
-2001-02-26 Dan Winship <danw@ximian.com>
-
- * mail-callbacks.c (delete_msg): Mark deleted messages as "seen"
- as well so they don't count towards the unread count.
-
- * mail-view.c (view_delete_msg): ditto
-
-2001-02-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (owner_set_cb): Re-add the
- mail_vtrash_create() hack back in for LocalStores since there's no
- better way to register a vTrash folder on the Local Storage yet.
-
- * mail-local.c (register_folder_registered): Add folders to the
- vTrash folder here since the LocalStore does not let the parent
- CamelStore class keep it's own hash of the folders.
-
-2001-02-25 Jeffrey Stedfast <fejj@ximian.com>
-
- * session.c (mail_session_forget_password): New function to force
- the removal of a given password.
-
- * openpgp-utils.c (openpgp_decrypt): On failure, forget the
- passphrase.
- (openpgp_encrypt): Here too. (cleaned this up a bit too)
- (openpgp_clearsign): And here.
- (openpgp_sign): Again...
-
- * mail-callbacks.c (composer_postpone_cb): Abort if the message is
- NULL (which is valid if an error occured).
- (composer_send_cb): Same.
-
-2001-02-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser.c: Toss the mail_tool_camel_lock* stuff.
- * mail-ops.c: Same.
- * mail-summary.c: Here too.
-
- * mail-tools.c (mail_tool_uri_to_folder_noex): Blown away!
- (mail_tool_filter_get_folder_func): *kapoosh*
- (mail_tool_camel_lock_up): Same.
- (mail_tool_camel_lock_down): Same.
- (mail_tool_set_uid_flags): Don't need this rubbish anymore either.
-
-2001-02-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (mail_load_storages): No longer need to
- construct the vTrash here.
- (owner_set_cb): Don't make the vTrash for the local store here.
-
- * mail-ops.c (add_vtrash_info): New function to add a vTrash
- folder info to a pre-constructed CamelFolderInfo for use in the
- get_folder_info async function.
-
-2001-02-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * main.c (main): No longer need to do a vtrash_cleanup() (it also
- doesn't exist anymore).
-
- * component-factory.c (mail_load_storages): Updated to use the new
- vtrash code.
- (owner_set_cb): Same.
-
- * mail-tools.c (mail_tool_uri_to_folder): Update to handle the
- "vtrash:" url prefix so that we can extract the REAL uri and know
- to get the trash folder.
-
- * mail-vtrash.c (mail_vtrash_add): Add the vTrash folder to the
- EvolutionStorage.
- (mail_vtrash_create): Get the store based on the uri (async) and
- then call mail_trash_add.
- (vtrash_cleanup): Removed.
- (vtrash_uri_to_folder): Removed.
- (vtrash_create): Replaced by mail_vtrash_create()
-
-2001-02-23 Iain Holmes <iain@ximian.com>
-
- * component-factory.c (owner_set_cb): Init the importer here.
-
- * mail-importer.[ch] (mail_importer_create_folder): Add a function
- that creates new folders in the shell.
- (mail_importer_init): Take in an EvolutionShellClient, and get the
- local_storage corba_object from it.
-
-2001-02-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-vtrash.c (create_trash_vfolder): Come up with a unique
- store uri for each vtrash (using %p and the CamelStore we're gonna
- place it on).
- (get_trash_get): Pass in the store so we can use it for %p.
-
-2001-02-23 Not Zed <NotZed@Ximian.com>
-
- * mail-vfolder.c (vfolder_gui_add_from_mlist): Rule to add mlist
- vfolder.
-
- * mail-autofilter.c (filter_gui_add_for_mailing_list): Removed.
- (rule_from_mlist): Build a generic match rule from an mlist.
- (vfolder_rule_from_mlist): Setup the vfolder rule for an mlist.
- (filter_rule_from_mlist): Setup a filter rule fro an mlist.
- (filter_gui_add_from_mlist): GUI thingy to do the work.
-
- * folder-browser.c (on_right_click): Added vfolder on mailing list
- to filter menu.
- (on_right_click): Use header_raw_check_mailign_list instead of
- mlist magic to get the mailing list name.
- (filter_mlist): Changed to use new add_from_mlist() call.
- (vfolder_mlist): New function for vfolder from mlist.
-
- * mail-send-recv.c (build_dialogue): Only allow downloading if the
- source is enabled at this time.
- (mail_autoreceive_setup): Check for enabled sources before setting
- up autodownload.
-
-2001-02-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-accounts.c (construct): Construct the PGP Path
- GnomeFileEntry widget.
- (pgp_path_changed): Try to auto-detect which PGP type the binary
- file is based on the basename (yuck).
-
-2001-02-23 Not Zed <NotZed@Ximian.com>
-
- * mail-ops.c (create_folder_get): Make op cancellable/report
- internals.
- (get_folder_get):
- (sync_folder_sync):
- (get_folderinfo_get): Make op cancellable/report internals.
-
- * mail-vtrash.c (get_trash_get): Setup the operation registration,
- and create a pseudo "start/stop" operation.
- (get_trash_free): Free store if we have it.
- (get_trash_got): Move vtrash add into here, so we execute in the
- right thread.
-
- * component-factory.c (owner_set_cb): Make trash creation async.
-
- * mail-local.c (register_folder_desc): A description of what we're
- doing.
-
- * mail-mt.c (mail_msg_new): Set status callback to operation_new.
- (mail_operation_status): Operation status function, proxy messages
- to main thread, and attempt to present a meaningful ui experience
- for operations.
-
-2001-02-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * openpgp-utils.c (openpgp_verify): Fixed memory corruption bug.
-
- * mail-format.c (try_inline_pgp_sig): Check to make sure the
- validity isn't NULL.
- (handle_multipart_signed): Check for NULL validities.
-
-2001-02-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-tools.c (mail_tool_uri_to_folder): Protect against NULL
- uri's.
-
- * mail-vtrash.c: Do mutex locking on the global hash table - this
- should clear up some segfaults ;-)
-
- * mail-config-druid.c (druid_finish): Set the 'enabled' member of
- the source to TRUE if the URL exists else set to FALSE.
- (incoming_type_changed): If the provider chosen is "None" then
- gray-out the auto-check widgets and the check-settings, otherwise
- sensitize them.
-
- * mail-account-editor.c (construct): Added a few more settings.
- (apply_changes): Save the new settings.
-
- * mail-config.c (service_copy): Updated.
- (config_read): Read in whether or not the account is enabled.
- (mail_config_write): Save if the account is enabled or not.
-
-2001-02-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (mail_send_message): Updated to reflect changes to
- the filter-driver code.
-
-2001-02-22 Not Zed <NotZed@Ximian.com>
-
- * Makefile.am (CAMEL_OBJS_EXTRA): Removed, no longer link with
- libcamelvee.
- (evolution_mail_LDADD): Ditto.
-
- * mail-vtrash.c: Moved camel-vee-store header ot camel levle.
-
- * mail-tools.c: Moved camel-vee-folder header to camel.
-
- * mail-local.c (local_storage_new_folder_cb): started hack for
- progress reporting, which is currently to the console.
-
- * mail-mt.c (set_stop): Set the stop button sensitivity.
- (mail_msg_received): enable/disable stop button while we're
- processing stuff in another thread.
-
- * message-list.c (ml_tree_value_at): If our uid entry vanishes
- before w'ere ready, then make a fake.
-
-2001-02-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-crypto.c (pgp_mime_part_verify): Changed to use
- PgpValidity.
-
- * openpgp-utils.c (openpgp_verify): Return a PgpValidity and set
- the description as UTF-8 for later use in mail-format.c when
- writing to GtkHTML.
-
- * mail-format.c (try_inline_pgp_sig): Updated to use the new
- PgpValidity code.
- (handle_multipart_signed): Updated.
-
-2001-02-21 Not Zed <NotZed@Ximian.com>
-
- * mail-callbacks.c (composer_postpone_cb): Fix for api changes to
- append_mail.
-
- * Makefile.am (evolution_mail_SOURCES): Removed mail-threads.[ch].
-
- * mail-threads.[ch]: Removed.
-
- * subscribe-dialog.c (subscribe_do_get_store): Chagned to use new
- thread stuff. This is really getting boring.
- (subscribe_do_subscribe_folder): Changed to use new thread stuff.
- Last one at last, phew.
-
- * session.c (register_callback): Changed to use new thread stuff.
- YUCK. I dropped some functionality, now the timeout callback
- return is ignored, so basically it keeps running till finished.
-
- * mail-ops.c (mail_operation_run): Removed, no longer used/needed.
- (mail_do_append_mail): Changed to use new thread stuff.
- (mail_do_transfer_messages): ditto.
-
- * mail-local.c (local_storage_new_folder_cb): Use new thread
- stuff, also only run synchronous for this operation.
- (mail_local_reconfigure_folder):
- (reconfigure_clicked): Changed to use new mail thread stuff.
-
- * mail-config.c (mail_config_check_service): Changed to use new
- thread stuff.
-
-2001-02-20 Dan Winship <danw@ximian.com>
-
- * mail-vtrash.c (get_trash_get): Pass NULL, not "/" for @top.
-
- * mail-callbacks.c (create_folders): Make this work with
- CamelStores where the separator character isn't /. folder_created
- and folder_deleted are still broken.
-
-2001-02-20 Not Zed <NotZed@Ximian.com>
-
- * mail-vtrash.c: Include the camel-vee-store.h header from the
- uninstalled copy.
-
-2001-02-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (mail_load_storages): Create vTrash folders
- for all remote stores as well.
-
-2001-02-20 Not Zed <NotZed@Ximian.com>
-
- * mail-vtrash.c (create_trash_vfolder): Add the auto-update flag
- to the folder open flags.
-
-2001-02-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-vfolder.c (mail_vfolder_get_vfolder_storage): New handy
- dandy function to ref and return the vfolder storage (will
- probably be disavowed once I figure out how to get the vTrash
- folder to show up in the EvolutionLocalStorage).
-
- * main.c (main): Call vtrash_cleanup().
-
- * mail-vtrash.c: New file.
- (vtrash_uri_to_folder): vtrash: URI handler
- (vtrash_create): Replacement async vtrash function for the old one
- in mail-ops.c
- (vtrash_cleanup): Cleanup code - unrefs the cached vtrash folders
- and free's the hashtable.
-
- * Makefile.am: Added mail-vtrash.[c,h].
-
- * mail-tools.c (mail_tool_uri_to_folder): If we have a vtrash:
- URI, call the vtrash URI handler function rather than continuing
- on. Yes, I know this is a hack and it needs to be fixed.
-
- * mail-ops.c (mail_do_setup_trash): Removed.
- (mail_trash_get): Removed.
-
- * component-factory.c (owner_set_cb): Create the vTrash folder for
- the LocalStore here.
-
- * mail-local.c (get_folder_info): Implement.
-
-2001-02-20 Not Zed <NotZed@Ximian.com>
-
- * mail-ops.c (fetch_mail_fetch): Unref the driver here, in the
- subthread, so we dont block the gui while it sync's all the
- folders.
- (fetch_mail_fetched): Rewmoved above code from here.
-
-2001-02-16 Not Zed <NotZed@Ximian.com>
-
- * mail-send-recv.c (receive_status): Dont do the thaw/freeze set here.
- (update_folders): "
-
- * mail-vfolder.c (vfolder_refresh): Setup the virtual
- 'unmatched' folder by default.
- (vfolder_uri_to_folder): HAndle UNMATCHED folder specially, it has
- no explicit sources.
-
-2001-02-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-send-recv.c (receive_get_folder): Not sure it makes any
- difference, but lets ref the folder while the hash table is locked
- rather than after we unlock it.
-
-2001-02-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * main.c: * component-factory.c: Reverse the changes I made
- yesterday.
-
-2001-02-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * main.c (main): Have the mail-config and openpgp initialize here
- instead.
-
- * component-factory.c (owner_set_cb): No need to have mail-config
- and openpgp init here.
-
-2001-02-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (do_scan_subfolders): Use mail_storage_create_folder
-
- * mail-callbacks.c (mail_storage_create_folder): Convenience
- function so we can keep all the evolution_storage_add_new_folder()
- code in one place as much as possible.
-
- * subscribe-dialog.c (recursive_add_folder): Use 'name' rather
- than the no-description bs since that's what all the other places
- do.
-
- * mail-callbacks.c (folder_created): New callback to handle the
- "folder_created" signal - handles CamelFolderInfo's recursively.
- (folder_deleted): Same but for "folder_deleted".
-
- * component-factory.c (storage_create_folder): Instead of doing
- the evolution_storage_new_folder() stuff by hand, pass it off to
- the new callback: folder_created(). At some point this will be
- unecessary as we'll attach this callback to the "folder_created"
- signal.
-
-2001-02-15 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c: Wrapped the address compare functions in a
- #ifdef
- (address_compare): #ifdef the use of the smart address sorting
- code and provide a #else for using g_strcasecmp().
-
-2001-02-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * openpgp-utils.c (openpgp_verify): Add the --no-tty flag.
-
-2001-02-14 Dan Winship <danw@ximian.com>
-
- * mail-mlist-magic.c: Rewrite explanatory comments to use normal
- regexps rather than procmail weirdness.
- (check_sender): match "foo-owner" as well as "owner-foo".
- (check_list_post): (New) Check for "List-Post: <mailto:..."
- (mail_mlist_magic_detect_list): Iterate through an array of
- function pointers rather than calling each checker explicitly.
-
- * component-factory.c (add_storage): Connect to the
- "create_folder" signal on the storage.
- (storage_create_folder): Do folder creation.
-
-2001-02-14 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (owner_set_cb): Setup the Trash folder.
-
- * mail-ops.c (create_trash_vfolder): Do better error handling.
- (populate_folder_urls): Oops, helps to strdup the url into the
- array if we plan on freeing the data.
- (mail_get_trash): New async function that may eventually replace
- mail_do_setup_trash().
- (do_setup_trash): Do better error handling.
-
- * mail-local.c (mail_local_store_class_init): Override
- get_folder_info.
- (get_folder_info): Implement.
-
-2001-02-13 Christopher James Lahey <clahey@ximian.com>
-
- * mail-local.c (do_reconfigure_folder): Fix some uninitialized
- variables.
-
-2001-02-12 Not Zed <NotZed@Ximian.com>
-
- * message-list.c (build_tree): if doing a full update, save the
- cursor pos and restore it afterwards.
- (on_cursor_activated_cmd): Copy the current_uid to a new string.
- I dont know why this is required, but it is.
- (message_list_destroy): Free the cursor_uid as we're done with it.
- (build_flat): IF the current uid disappeared from the list, then
- unset the message.
- (build_tree): Likewise.
-
-2001-02-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_write): Clean out the cruft in the
- Accounts section before writing the current accounts out to the
- config file.
-
- * mail-account-editor.c (construct): Strip the leading "/" from
- the Namespace/Path entry if the provider doesn't require absolute
- pathnames.
-
-2001-02-12 Kjartan Maraas <kmaraas@gnome.org>
-
- * Makefile.am: xml-i18n-tools setup.
- * GNOME_Evolution_Mail.oaf.in: Mark strings for translation.
-
-2001-02-11 Dan Winship <danw@ximian.com>
-
- * mail-callbacks.[ch]: Re-add non-static forward_messages.
- mail-view.c needs it.
-
-2001-02-11 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (forward_inlined): Don't leak memory.
- (forward_messages): change doinline to be a gboolean argument.
-
-2001-02-10 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (list_add_addresses): Check the full list of
- IDs instead of just the default id and if we find an address
- matching one of the user's ids, then save it.
- (mail_generate_reply): Try to guess which account to use based
- upon the list of To and Cc addresses and pass that as the 'From'
- address to e_msg_composer_set_headers().
- (forward_get_composer): Updated to reflect changes to
- e-msg-composer.
-
-2001-02-11 Gediminas Paulauskas <menesis@delfi.lt>
-
- * mail-config.glade.h: removed, xml-i18n-extract's the strings itself.
- * *.glade: do not output_translatable_strings
- * Makefile.am: removed *.glade.h from EXTRA_DIST.
-
-2001-02-09 Dan Winship <danw@ximian.com>
-
- * mail-local.c: Updates for CamelStore changes, small memory leak
- fixes.
- (lookup_folder): Removed (and moved into the reconfigure code)
- since this method no longer exists in CamelStore.
- (do_reconfigure_folder, etc): Update the info in the
- MailLocalStore after reconfiguring.
- (mail_local_lookup_folder): Removed
-
- * local-config.glade: fix padding of the label_format
-
- * message-list.c (ml_tree_value_at): Don't keep message infos
- reffed across calls, since this can cause badness after a
- reconfigure. Instead, just strdup the needed values and free those
- on the next call.
-
- * mail-tools.c (mail_tool_get_root_of_store): Unused, remove.
- (mail_tool_get_inbox): use camel_store_get_inbox.
-
- * evolution-outlook-importer.c (load_file_fn):
- * evolution-mbox-importer.c (load_file_fn): Use
- mail_tool_get_local_inbox() instead of mail_importer_get_folder()
-
- * mail-importer.c (mail_importer_get_folder): Removed
-
-2001-02-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (mail_generate_reply): New location for this
- function.
-
- * mail-format.c: Removed mail_generate_reply as it's ONLY ever
- used in mail-callbacks.c.
-
- * mail-ops.c (fetch_mail_fetch): Reworked some keep-mail-on-server
- logic so that we ALWAYS look for a cached array of UIDs that we
- may have downloaded previously so as not to download them again
- even if we will be deleting them off the server. This fixes bug
- #1344.
-
-2001-02-09 Not Zed <NotZed@Ximian.com>
-
- * mail-ops.c (filter_folder_free): only free driver, if set.
- (fetch_mail_fetched): Unref the driver here, so it can cleanup
- before we call the 'done' callback.
-
- * component-factory.c (owner_set_cb): Add setup for mail
- autoreceive stuff.
-
- * mail-send-recv.c (free_info_data): Free the send info's from teh
- active hash, not the running list.
- (receive_done): As we finish downloads, remove them and clean them
- up, and also close the window.
- (mail_autoreceive_setup): New function to setup & maintain
- automatic download stuff.
-
-2001-02-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (construct): Set the sensitivity of the spin
- button based on the state of the checkbox.
-
- * mail-config.c (config_read): Properly do defaults here.
- (mail_config_write): Removed some of the settings being saved
- here.
- (mail_config_write_on_exit): Save those settings here instead.
-
-2001-02-08 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-display.c (on_object_requested): Cast the CamelMedium to a
- CamelMimePart before performing actions on it as if it were a
- CamelMimePart.
-
- * mail-config-druid.c (druid_finish): Save the auto-check settings.
- (construct): Initialize auto-check widgets.
- (mail_config_druid_get_auto_check): New function
- (mail_config_druid_get_auto_check_minutes): New functions
-
- * mail-config.c (config_read): Read in whether or not to check
- every x minutes.
- (mail_config_write): Save auto-check config data and SSL.
-
-2001-02-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-autofilter.c (rule_add_subject): Use "contains" because the
- subject might be broken into subparts and using the "is" rule will
- then fail ;-)
-
-2001-02-08 Not Zed <NotZed@Ximian.com>
-
- * mail-send-recv.c (mail_send_receive):
- (mail_receive_uri): Init active_downloads hash if it hasn't been yet.
-
-2001-02-07 Not Zed <NotZed@Ximian.com>
-
- * mail-send-recv.c (operation_status): Handle internal camel status return.
- (receive_done): Remove active download when done.
- (mail_receive_uri): Initiate download of a single source, with no gui.
- (build_dialogue): Mark any new items as real active downloads.
- (do_show_status): Make the progress bar optional.
-
-2001-02-06 Not Zed <NotZed@Ximian.com>
-
- * mail-send-recv.c: camel_cancel->camel_operation.
-
- * mail-ops.old.c: camel_cancel->camel_operation.
-
- * mail-ops.c: camel_cancel->camel_operation.
-
- * mail-mt.c: camel_cancel->camel_operation.
-
- * mail-callbacks.c (stop_threads): camel_cancel->camel_operation.
-
- * mail-mt.h: CamelCancel->CamelOperation.
-
-2001-02-07 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-mt.c (set_view_data): Check current_message for NULL - this
- fixes a bug running under SunOS (not a major deal tho as it's in a
- debug printf).
-
-2001-02-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_write_on_exit): Oops, save the
- seen_timeout variable.
-
-2001-02-06 Christopher James Lahey <clahey@ximian.com>
-
- * Makefile.am (evolution_mail_LDADD): Added libmenus.la.
-
- * folder-browser-factory.c (control_activate): Added GalView menus
- here.
-
- * message-list.c, message-list.h (message_list_get_layout): Made
- message_list_get_layout export.
-
-2001-02-06 Iain Holmes <iain@ximian.com>
-
- * mail-display.c (pixbuf_gen_idle): Set the size of the icon to 24x24
- always.
- (button_press): Function to toggle the disposition of an attachment.
- (on_object_requested): New way to indicate functions on attachments.
-
- * message-list.c (hide_load_state): Free the olduid.
-
-2001-02-06 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (set_defaults): Updated to checkfor
- "(none)".
-
- * mail-account-editor.c (entry_changed): Make sure the email
- address is valid.
-
- * mail-config-druid.c (identity_check): Check to make sure we have
- a valid email address.
- (is_email): New function to check a string to see if it's a valid
- email address.
-
-2001-02-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * evolution-mbox-importer.c: We are now going to use a file
- descriptor and a CamelMimeParser rather than a FILE pointer.
- (load_file_fn): Open the file descriptor and initialize the
- CamelMimeParser.
- (importer_destroy_cb): Unref the mime parser.
- (support_format_fn): Use an fd and use a case-insensitive
- comparison as well as elimate a buffer overrun.
- (process_item_fn): Process 1 CamelMimeMessage per invocation so as
- to not lock up Iain's GUI and to work similar to the way Iain
- originally coded it.
-
-2001-02-05 Christopher James Lahey <clahey@ximian.com>
-
- * evolution-mbox-importer.c, evolution-mbox-importer.h: Moved
- bonobo includes from the .c to the .h. Include
- evolution-mbox-importer.h in evolution-mbox-importer.c.
-
- * evolution-outlook-importer.c, evolution-outlook-importer.h:
- Moved bonobo includes from the .c to the .h. Include
- evolution-outlook-importer.h in evolution-outlook-importer.c.
-
- * mail-callbacks.c: Include mail-send-recv.h.
-
- * mail-local.c (mail_local_lookup_folder): Cast local_store to
- CAMEL_STORE.
-
- * mail-mt.c (mail_msg_cleanup): Make this function static.
-
- * mail-send-recv.c, mail-send-recv.h: Created mail_send_recv.h.
- Included it in mail-send-recv.c. Added a #include
- <libgnomeui/gnome-window-icon.h>.
- (mail_send_receive): Added a cast.
-
- * mail-summary.c (new_folder_cb, removed_folder_cb,
- create_summary_view): Cast the source func in calling g_idle_add.
-
-2001-02-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (try_inline_pgp_sig): New function to handle
- inline pgp-signatures.
-
- * mail-config-druid.c (construct): Keep track of the CheckSettings
- check boxes.
- (transport_next): Connect if the user says so.
- (incoming_next): Same. Also, don't jump to the next page if
- test-settings fails.
-
-2001-02-05 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (incoming_next): Updated to not connect when
- getting a list of authtypes.
- (transport_next): No longer connects - again, this is
- useless. Read the apply_changes argument for the reason why.
-
- * mail-account-editor.c (apply_changes): Updated. Set the
- 'connect' argument to FALSE for now, this basically means that the
- call is worthless tho so it may be best to either get rid of the
- checks altogether or else make it connect.
- (source_auth_init): Don't connect here, it's just plain annoying.
- (transport_construct_authmenu): Same here.
-
- * mail-config.c (mail_config_check_service): Now takes a connect
- argument.
-
-2001-02-03 Michael Meeks <michael@helixcode.com>
-
- * mail-local.c (load_metainfo): Fix dodgy libxml allocation
- pollution, and potential faults on NULL attributes.
-
-2001-02-02 Not Zed <NotZed@Ximian.com>
-
- * mail-send-recv.c (mail_send_receive): Cleaned up so we dont add
- an unecessary level of indenting.
-
- * message-list.c (ml_tree_value_at): For collapsed tree nodes,
- scan the collapses nodes for the unread and status information.
- Since we dont really have fake nodes anymore.
-
-2001-01-30 Ian Campbell <ijc25@cam.ac.uk>
-
- * message-list.c: Add support for new icons for being
- read/unread for fake root messages on threads.
-
-2001-01-30 Iain Holmes <iain@ximian.com>
-
- * mail-send-recv.c (mail_send_receive): Only allow one send and
- receive to be running at once.
- (build_dialogue): Set the icon for the window.
-
- * evolution-mbox-importer.c (support_format_fn): Only compare the first
- 5 bytes of the signature.
-
-2001-01-30 Kjartan Maraas <kmaraas@gnome.org>
-
- * folder-browser.c: Fix typo.
-
-2001-01-29 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-importer.c (mail_importer_add_line): Cast the
- camel_stream_mem_new() to a CamelStreamMem.
-
-2001-01-29 JP Rosevear <jpr@ximian.com>
-
- * main.c: Return efence ifdefs to 0 for solaris build
-
-2001-01-29 Not Zed <NotZed@Ximian.com>
-
- * message-list.c (tree_equal): Debug function to compare the tree
- we think we have, after an incremental update.
- (build_tree): Check the tree after we've built it.
- (build_tree): Oops, turn on BROKEN_ETREE again.
-
- * mail-mt.c (mail_get_password): If we are being called from the
- main gui thread, then just call the dialogue directly. Ideally we
- dont want this anyway but lets handle the case nicely.
- (mail_get_password): Try locking around the password request, to
- single-queue any password requests.
- (mail_msg_init): Push an exit handler to clean it up on completion.
-
- * mail-send-recv.c (receive_update_got_store): New function called
- when the store has been retrieved asynchronously.
- (mail_send_receive): Get the store asynchronously. This was
- causing problems where the password dialogue would try and be
- called from the main thread via a message.
-
- * mail-ops.c (mail_get_store): New function to get a store
- (a)synchronously. More or less taken from subscribe-dialog, which
- i will remove later.
- (mail_scan_subfolders): Try running the scan subfolder thing
- asynchronously, to help startup time. Not sure if this will work,
- but presumably the shell can handle the folders appearing later
- ok.
-
-2001-01-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (set_defaults): Turns out that I was wrong
- about the g_get_real_name mem leak, god damn glib for not
- following the const char* standard.
-
-2001-01-28 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (management_prepare): Use UTF-8.
- (set_defaults): Use UTF-8 and also fixed a memory leak by freeing
- the string returned by g_get_real_name().
- (mail_config_druid_get_account_name): Use UTF-8.
- (mail_config_druid_get_full_name): Same.
- (mail_config_druid_get_email_address): Same.
- (mail_config_druid_get_organization): Same.
-
- * mail-account-editor.c (apply_changes): Save UTF-8 strings rather
- than gtk strings.
- (construct): Use the UTF-8 convenience functions to set the gtk
- entries for the ID fields.
-
-2001-01-28 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-vfolder.c (vfolder_gui_add_rule): Make the OK button the
- default one.
-
- * mail-search-dialogue.c (mail_search_dialogue_init): Use stock
- buttons for OK and Cancel. Make the OK button the default one.
-
-2001-01-28 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-vfolder.c (vfolder_gui_add_rule): Set a default size for
- the window so that more rules are visible.
-
- * mail-search-dialogue.c (mail_search_dialogue_construct): Set a
- default size for the window so that more rules are visible.
-
-2001-01-28 Not Zed <NotZed@Ximian.com>
-
- * mail-display.c (write_data_to_file): Changed to use
- mail_save_part to save the data in another thread.
- (save_data_cb): Hide the fileselector once we have a button press,
- and are saving stuff.
-
- * mail-ops.c (mail_save_part): New function to save a part content
- asynchronously.
-
-2001-01-27 Christopher James Lahey <clahey@helixcode.com>
-
- * folder-browser.c (etable_key): Don't handle home and end keys
- since %ETable deals with them now.
-
-2001-01-27 Jeffrey Stedfast <fejj@ximian.com>
-
- * message-list.c (address_compare): Protect against NULL address
- pointers.
- (subject_compare): Same but for subject pointers.
-
-2001-01-27 Iain Holmes <iain@ximian.com>
-
- * mail-summary.c (create_summary_view): Applied patch from John R Sheets
- to fix some warnings.
- (idle_check): Fixed the prototype to fix some warnngs as well.
-
-2001-01-26 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-display.c (get_embedded_for_component): Try a control
- first, instead of an embeddable.
-
-2001-01-26 Jeffrey Stedfast <fejj@ximian.com>
-
- * subscribe-dialog.c (populate_store_foreach): Check for a NULL
- service->url as we obviously can't subscribe to folders on a
- non-existant mail source :-)
- (subscribe_do_get_store): Check for a NULL url here too, not that
- we should need it anymore (due to the above fix) but it doesn't
- hurt. Also, should we wait on the thread? Probably doesn't matter.
-
-2001-01-26 Iain Holmes <iain@ximian.com>
-
- * evolution-outlook-importer.c (load_file_fn): Replace fsetpos with
- fseek and use a long instead of fpos_t.
- (process_item_fn): Same.
-
- * mail-importer.h: Add a frozen item to tell when the folder is frozen.
-
- * evolution-mbox-importer.c (process_item_fn): Fix the blank message.
- Set the frozen element.
- (importer_destroy_cb): Thaw the folder if frozen.
-
-2001-01-26 Dan Winship <danw@ximian.com>
-
- * mail-identify.c (mail_identify_mime_part): Fix an uninitialized
- variable use.
-
-2001-01-26 Jason Leach <jasonleach@usa.net>
-
- (Fixing an old FIXME)
-
- * component-factory.c (create_vfolder_storage): removing
- create_vfolder_storage, replacing call to it with
- vfolder_create_storage.
-
-2001-01-26 Not Zed <NotZed@Ximian.com>
-
- * message-list.c (build_tree): Define BROKEN_ETREE again, till we
- get this stuff fixed better.
-
-2001-01-25 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.c: Moved teh "sender contains" item to the end of
- the list, so the gui doesn't suddenly change on everyone. Fixed
- the sender-contains search string to be a valid s-exp (ha, didn't
- test it even once eh ettore?!)
- (search_save): Dont have the sender contains as the default case
- (which well, never gets called anyway), oops i guess i should've
- reviewed the patch a little more.
-
-2001-01-26 Ettore Perazzoli <ettore@ximian.com>
-
- * folder-browser.c: Add a missing parenthesis to the "from
- contains" rule. Also make it the last item instead of the first
- one.
-
-2001-01-25 Iain Holmes <iain@ximian.com>
-
- * component-factory.c (component_factory_init): Init the mail
- mail importers.
-
- * mail-local.[ch] (mail_local_lookup_folder): retrieve the local
- folder given by the name.
-
- * mail-importer.[ch]: Basic functions for all importers to use.
-
- * evolution-mbox-importer.[ch]: Mbox importer.
-
-2001-01-25 Jeffrey Stedfast <fejj@ximian.com>
- The following fixes seem to clear up the problem of new mail not
- being shown in the Inbox and/or other folders where mail had been
- delivered.
-
- * mail-send-recv.c (build_dialogue): Freeze the inbox.
- (receive_get_folder): Freeze folders before dumping them into the
- hash table.
- (free_folder_info): Thaw the folder.
- (free_info_data): Thaw the Inbox.
-
-2001-01-25 Jason Leach <jasonleach@usa.net>
-
- (Don't prompt about unsaved changes for replies/forwards that have
- not actually been modified)
-
- * mail-callbacks.c (do_forward_inline): Unset the has_changed for
- the message composer.
- (do_forward_attach): Same here.
- (mail_reply): And here.
-
-2001-01-25 Dan Winship <danw@ximian.com>
-
- * mail-format.c (mail_content_loaded): Check if a message part's
- content is available, and if it's not, queue a thread that will
- load it and then queue an idle-handler redisplay of the message.
- (call_handler_function): Call mail_content_loaded() on the part
- and don't try to display it if it's currently offline.
- (get_data_wrapper_text): Simplify a bit
-
- * mail-display.c (mail_display_queue_redisplay): rename and make
- non-static.
- (mail_display_redisplay): Use a "new and improved" way of
- preserving the GtkHTML scroll location. ("new and improved" is
- code for "gross and hackish", but there should be a real interface
- for this eventually.)
- (on_url_requested): Use mail_content_loaded() and don't write out
- offline cid: URLs
-
- * mail-identify.c (mail_identify_mime_part): Use
- mail_content_loaded and don't try to identify the data if it's
- offline.
-
-2001-01-25 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Made the message list pay attention to the
- "cursor_activated" signal instead of the "cursor_change" signal.
-
-2001-01-25 Ettore Perazzoli <ettore@ximian.com>
-
- * folder-browser-factory.c (update_pixmaps): Set the print icon
- for various other items.
- (set_pixmap): Be a bit more verbose in the warning message if the
- icon isn't found [i.e. report the name of the file too].
-
-2001-01-25 Ettore Perazzoli <ettore@ximian.com>
-
- * folder-browser-factory.c (update_pixmaps): Set the pixmaps for
- the "/menu/Folder/FolderConfig" and "/menu/Settings/SetMailConfig"
- items.
- (set_pixmap): Don't prepend the "buttons" prefix.
- (update_pixmaps): Update accordingly.
-
-2001-01-24 Not Zed <NotZed@Ximian.com>
-
- * folder-browser.c (search_string[]): Fix the subject match
- expression, which was missing a closing ).
-
- * mail-send-recv.c (do_show_status): Escape any % signs in the
- string before setting the format string.
-
-2001-01-24 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.glade: Added a 3rd page to the account editor to
- allow users to set their HTML sending preference and also allow
- them to change their message status timeout.
-
- * mail-accounts.c (construct): Added handlers for the send-html
- checkbox and for the mark-message-as timeout spinbutton.
-
-2001-01-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-editor.c (apply_changes): Save the source and
- transport changes whether the user can connect to the host or not.
-
-2001-01-23 Ettore Perazzoli <ettore@ximian.com>
-
- [Applied patch from Tuomas Kuosmanen <tigert@ximian.com>]
-
- * folder-browser.c: Added enum value `ESB_SENDER_CONTAINS' as well
- as a "Sender contains" item to the search menu. Also add a
- corresponding "(match-all)" rule to the `search_string' array.
- (search_save): Handle `ESB_SENDER_CONTAINS' here.
-
-2001-01-23 Ettore Perazzoli <ettore@ximian.com>
-
- * GNOME_Evolution_Mail.oafinfo: Fixed the repo_ids so that they
- use the right syntax.
-
-2001-01-23 Dan Winship <danw@ximian.com>
-
- * folder-browser-factory.c:
- * mail-callbacks.c (send_receive_mail): Fix spelling.
-
-2001-01-24 Not Zed <NotZed@Ximian.com>
-
- * mail-ops.c (fetch_mail_fetch): Set the default folder when
- copying to mbox. This is a quick fix, i might need to do a slight
- redesign to clean it up.
-
-2001-01-23 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-send-recv.c (build_dialogue): Make sure the source->url is
- not NULL (which is perfectly valid).
- (mail_send_receive): Where oh where should my prototype be?
- (receive_get_folder): Make sure to ref the folder before you add
- it to the hash table.
-
- * openpgp-utils.c:
- * mail-crypto.c: A few minor tweaks.
-
-2001-01-23 Not Zed <NotZed@Ximian.com>
-
- * message-list.c (build_tree): Try turning off the BROKEN_ETREE
- thing. It seems to work ok (better?) now, but if its still broken
- i'll remove it again for the next release.
-
-2001-01-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (set_defaults): Automagically fill in the
- user's default transport if he/she has setup previous accounts.
-
- * mail-format.c (handle_multipart_signed): Just wrote a temp way
- of reporting success/fail of PGP/MIME signature verification
- status.
-
-2001-01-22 Iain Holmes <iain@ximian.com>
-
- * evolution-outlook-importer.c: Outlook Express 4 .mbx importer.
-
- * component-factory.c (component_factory_init): initialise the
- outlook importer.
-
- * GNOME_Evolution_Mail.oafinfo: Add the details for the Outlook
- importer.
-
-2001-01-22 Dan Winship <danw@ximian.com>
-
- * mail-mt.[ch]: make mail_gui_thread non-static.
-
- * main.c (main): Set up signal handler for SEGV, BUS, FPE
- (segv_redirect): if a gnome-segv'ing signal is received in
- a thread other than mail_gui_thread, re-deliver it to that
- thread to work around a problem with the gnome segv handler.
-
-2001-01-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (handle_multipart_signed): Fixed to display
- subparts (other than the signature part) and started to write a
- pretty way to show if the signature verified or not.
-
-2001-01-23 Not Zed <NotZed@Ximian.com>
-
- * mail-crypto.c (pgp_mime_part_verify): Fix a double-free problem.
-
-2001-01-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (incoming_type_changed): Oops, danw didn't
- know 'provider' could be NULL :-)
-
-2001-01-22 Dan Winship <danw@ximian.com>
-
- * mail-config-druid.c (incoming_type_changed): Change "Path:"
- label to "Namespace:" for IMAP. Use $MAILDIR rather than $MAIL for
- Maildir. If $MAIL isn't set, guess.
-
- * component-factory.c (mail_hash_storage): Function to add a
- store/storage mapping.
- (add_storage): Use it.
-
- * mail-vfolder.c (vfolder_uri_to_folder): Use the vfolder name
- rather than the string "mbox" (which wasn't ever used for
- anything) in the vfolder URL. (Combined with the CamelVeeFolder
- change, this makes camel_folder_get_name() return a pretty name
- for vfolders now.) Call mail_hash_storage() to record the
- CamelVeeStore/vfolder_storage mapping. (Ideally, there'd only be a
- single CamelVeeStore... this is just a quick hack.)
-
- vfolders now display their unread count once you've looked at them
- once.
-
-2001-01-22 Dan Winship <danw@ximian.com>
-
- * mail-tools.h: s/filter-driver.h/camel-filter-driver.h/ and
- update first arg of mail_too_filter_get_folder_func
-
- * mail-tools.c (mail_tool_filter_get_folder_func): Update first
- arg to CamelFilterDriver *
-
- * mail-send-recv.c (receive_status):
- * mail-ops.c (send_queue_send): s/FILTER/CAMEL_FILTER/
-
- * mail-callbacks.c: Remove filter-driver.h include
-
- * mail-accounts.c: Put the news functions inside #ifdef
- ENABLE_NNTP to prevent warnings about unused statis functions.
-
- * subscribe-dialog.c (subscribe_folders, unsubscribe_folders,
- subscribe_refresh_list): Update prototype to match BONOBO_UI_VERB.
- (populate_store_list): add a de-constifying cast
-
-2001-01-22 Not Zed <NotZed@Ximian.com>
-
- * .cvsignore: Added temp profiling files.
-
- * component-factory.c (owner_set_cb): remove a warning with
- conditional news compilation.
-
- * mail-ops.h: Cleaned up the header list.
-
-2001-01-22 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-crypto.c (mail_crypto_is_rfc2015_signed): Helps if I spell
- stuff correctly so it can pass the tests ;-)
-
-2001-01-22 Not Zed <NotZed@Ximian.com>
-
- * folder-browser-factory.c: Replace the old get_send mail with the
- new one (button).
-
- * mail-ops.c (set_x_mailer):
- (mail_load_evolution_rule_context):
- (mail_do_fetch_mail):
- (mail_do_filter_ondemand):
- (mail_send_mail_old):
- (mail_do_send_queue): All removed, (for) now lives in mail-send-recv.c.
- (load_context):
- (setup_filter_driver):
- (filter_get_folder):
- (mail_filter_folder):
- (mail_fetch_mail):
- (mail_update_subfolders):
- (mail_send_mail):
- (mail_send_queue): New equivalents of all these fundtions, moved
- from mail-send-recv.c ...
- (mail_filter_on_demand): Moved here too.
- (mail_load_filter_context): Export this.
-
- * mail-callbacks.c (apply_filters): Use the new
- mail_filter_on_demand() call.
- (send_receieve_mail): Use mail_send_receive to do the work. Add a
- little error handling here that used to be elsewhere.
- (send_queued_mail): Removed.
- (fetch_mail): Removed.
- (select_first_unread): #ifdef'd this out. Not sure if this still
- makes sense, but it doesn't get run right now anyway.
- (composer_postpone_cb): Fix the setting of message flags. You
- dont need to get them first, ever.
-
- * mail-send-recv.c (mail_send_message): Dont use
- mail_tool_send_via_transport anymore (it does nothing useful).
-
- * mail-tools.c (mail_tool_camel_lock_up): Turned into a noop.
- (mail_tool_camel_lock_down): And here too.
- (mail_tool_move_folder_contents): Removed from the code (hasn't
- bene used for ages).
- (mail_tool_send_via_transport): Removed, it doesn't save anything.
-
-2001-01-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * component-factory.c (owner_set_cb): Initialize OpenPGP.
-
- * openpgp-utils.c (openpgp_init): No longer takes a passphrase
- callback, we'll just use the mail-session one. Makes life simpler.
- (pgp_get_passphrase): Use mail_session_request_dialog().
-
- * mail-ops.c (do_send_queue): Remove the X-Evolution header before
- we send.
-
- * mail-crypto.c (pgp_mime_part_sign): Don't forget to unref the
- filters.
- (pgp_mime_part_verify): Same.
- (pgp_mime_part_encrypt): Same.
- (pgp_mime_part_decrypt): Take NotZed's advice and use
- camel_stream_mem_new_with_buffer instead of writing to a new
- stream_mem. Also use camel_data_wrapper_construct_from_stream
- instead of creating a parser and using that.
-
-2001-01-21 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-crypto.c: Updated header comment and fixed some ref/unref
- count problems in the various functions. Also fixed some other
- little things.
- (pgp_mime_part_encrypt): Do some canonical CRLF action before
- encrypting.
- (pgp_mime_part_sign): Make sure we are the owners of the byte
- array.
- (pgp_mime_part_verify): Same.
- (pgp_mime_part_encrypt): Same.
- (pgp_mime_part_decrypt): Same.
-
-2001-01-21 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c (message_list_get_layout): Added
- draw-focus="true" and selection-mode="browse" attributes to the
- ETableSpecification.
- (message_list_construct): Removed setting the "draw_focus"
- argument since it doesn't exist any more.
-
-2001-01-21 Not Zed <NotZed@Ximian.com>
-
- * mail-mt.c (mail_msg_new): Init a cancel field in the message.
- (mail_msg_free): Free it.
- (mail_msg_cancel): New function to attempt to cancel an operation
- by id. Impelementation functions can still be uncancellable by
- not registering for cancellation, etc, or do it themselves as
- well.
-
- * mail-send-recv.c (fetch_mail_filter_folder): set folder_uid's
- properly, so we can save it later.
- (filter_folder_filter): Renamed from fetch_mail_filter_folder,
- since its going to be used for all filtering.
- (mail_fetch_mail): Changed from mail_filter_mail.
- (mail_filter_folder): New function, replaces
- mail_do_filter_ondemand functionality.
- (mail_filter_on_demand): New function, actually replaces
- mail_do_filter_ondemand.
- (receive_get_folder): Added an exception arg.
- (mail_send_message): New function to just send a message.
- (send_mail_send): Use mail_send_message.
- (send_queue_send): New send qeue code, use mail_send_message, and
- clean up some stuff.
- (mail_send_receive): Changed from mail_receive.
- (build_dialogue): Setup the sending data, as well.
- (mail_update_subfolders): New function to update folder info.
- (send_mail_send): hook into cancellation if we want.
-
-2001-01-20 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-ops.c (do_send_queue): Strip leading space from the
- transport url gotten from the message.
-
-2001-01-19 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-format.c (mail_generate_reply): If the name is empty
- string, use the address.
-
-2001-01-19 Dan Winship <danw@ximian.com>
-
- * mail-display.c (pixmap_press): Update for e_popup_menu_run
- change.
-
- * folder-browser.c (etable_key): On GDK_Menu (the menu key on
- 105-key keyboards), pop up the right-click menu.
- (on_right_click): update for e_popup_menu_run change.
-
- * subscribe-dialog.c (recursive_add_folder): New function to add a
- folder and any parents of it that don't yet exist. Fixes bugzilla
- #1028.
-
-2001-01-19 Not Zed <NotZed@Ximian.com>
-
- * mail-send-recv.c: New swanky send/recieve thingy, well it so far
- only receives (pop/mbox). Ignore all the warnings for now, and
- the ugly 'button' to run it.
-
-2001-01-18 Jeffrey Stedfast <fejj@ximian.com>
-
- * folder-browser-factory.c: Added the next/previous toolbar
- buttons.
-
- * mail-callbacks.c (next_msg): New callback so we can have a next
- toolbar button.
- (previous_msg): Same but for previous.
-
-2001-01-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-editor.c (construct): Anna's dialog now supports
- SSL so we can get rid of the ssl-support checks. Also work around
- the fact that Anna's dialog doesn't have an optionmenu for the
- transport type, it's a label instead.
- (transport_type_init): Cast the transport_type widget to a
- GtkOptionMenu where appropriate as the widget that stores it is
- now generic.
- (apply_changes): Modify code to work with anna's dialog...*sigh*
- (ok_clicked): Alert the user that one or more servers failed to
- validate and allow him to continue anyway.
-
-2001-01-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_set_pgp_path): New config function to
- set the path to the pgp binary.
- (mail_config_get_pgp_path): Gee I wonder...
- (mail_config_set_pgp_type): This one sets the type (ie PGP5, PGP2,
- or GnuPG - see openpgp-utils.h for values)
- (mail_config_get_pgp_type): Der.
-
-2001-01-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-editor.c (construct): Handle NULL source and, while
- we're at it, transport URLs. Apparently camel_url_new() and/or
- camel-url_free() don't handle NULL input well.
-
- * mail-accounts.c (load_accounts): Handle NULL source URLs.
-
-2001-01-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-editor.c (construct): Oops. "url && url->host"
- doesn't do much without the '?' and ':' ;-)
-
-2001-01-17 Ettore Perazzoli <ettore@ximian.com>
-
- * mail-ops.c (set_x_mailer): New function.
- (send_mail_send): Use it.
- (do_send_queue): Use it.
-
-2001-01-17 Martin Norbäck <d95mback@dtek.chalmers.se>
-
- * openpgp-utils.c (pgp_get_passphrase): Changed the word entry
- to enter, which is the correct word to use.
-
-2001-01-17 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (ask_confirm_for_empty_subject): Update to use
- EMessageBox and to record if the user doesn't want to ever see
- this dialog again.
-
- * mail-config.c (mail_config_get_prompt_empty_subject): New config
- function.
- (mail_config_set_prompt_empty_subject): Another new one.
-
-2001-01-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-editor.c (apply_changes): Modify to be able to
- handle a NULL source_url.
- (source_auth_init): Allow for a NULL source url.
- (source_check): Same.
-
- * mail-config.c (mail_config_write): Allow for NULL source
- URLs. And while we're at it, NULL transport URLs as well. Might as
- well save the use_ssl variable too.
- (config_read): Same.
-
- * mail-config-druid.c (druid_finish): Modify to allow a NULL
- source url.
- (incoming_next): Modify to check for a NULL source and jump to the
- transport page if one is encountered (this means the user decided
- not to config a source).
- (incoming_type_changed): Modify to set all widgets insensitive if
- the user selected the "None" source menu item (aka NULL provider).
- (incoming_check): Modify to allow the user to go to the next page
- when he/she has chosen "None" for their source type.
- (mail_config_druid_get_source_url): Return NULL if the provider is
- NULL.
- (mail_config_druid_get_transport_url): Same.
-
-2001-01-16 Dan Winship <danw@ximian.com>
-
- * mail-display.c (on_object_requested): Don't do thumbnails for
- offline images
-
-2001-01-16 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-callbacks.c (save_msg_ok): If the user hits "No", then
- don't destroy the filesel window.
-
- * mail-ops.c (save_messages_save): Open with mode 0666 as danw
- suggests.
-
-2001-01-16 Chris Toshok <toshok@helixcode.com>
-
- * component-factory.c (owner_set_cb): only load the news storage
- if ENABLE_NNTP.
-
- * mail-accounts.c (construct): if !ENABLE_NNTP, remove the news
- page from the dialog.
-
-2001-01-16 Radek Doulik <rodo@helixcode.com>
-
- * mail-format.c (mail_generate_reply): use
- e_msg_composer_mark_text_orig
-
-2001-01-16 Dan Winship <danw@ximian.com>
-
- * mail-ops.c (send_mail_send, do_send_queue): Update the X-Mailer
- header to use the string specified by configure.
-
-2001-01-16 Jason Leach <jasonleach@usa.net>
-
- * subscribe-dialog.c: removed unecessary #inlcude "e-title-bar.h"
-
-2001-01-16 Jason Leach <jasonleach@usa.net>
-
- * openpgp-utils.c (pgp_get_passphrase): Fix a string causing
- translation problems. Bug #1147.
-
-2001-01-16 Not Zed <NotZed@Ximian.com>
-
- * mail-ops.c (mail_do_fetch_mail): Setup a cancellation handle.
- (do_fetch_mail): REgister for cancellation here.
- (cleanup_fetch_mail): And unregister for cancellation here.
- (mail_get_message): Add a cancel handle.
- (get_message_get): Register/deregister for cancel.
- (get_message_free): & clean up.
-
- * mail-mt.c (mail_msg_received): Removed debuggng.
-
- * mail-callbacks.c (stop_threads): Callback for stopping.
-
- * folder-browser-factory.c: Add a stop button verb thingy.
- (control_activate): Disable the stop button by default.
-
-2001-01-15 Christopher James Lahey <clahey@ximian.com>
-
- * message-list.c, message-list.h: Change from using filters for
- date and size to using e_cell_date and e_cell_size. Moved a bunch
- of includes from the message-list.h to the message-list.c.
-
-2001-01-15 Miguel de Icaza <miguel@ximian.com>
-
- * mail-callbacks.c (configure_mail): Set the default button to
- `Yes' here.
-
-2001-01-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-account-editor.c (source_auth_init): If the preferred
- authmech isn't found, default to the first one in the list.
- (transport_construct_authmenu): This function already did the
- above but I made it simpler.
- (apply_changes): A number of cleanups.
-
-2001-01-13 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config-druid.c (druid_finish): Fixed mail_load_storages to
- make a mini GSList of the account, not the account->source. Oops.
-
- * mail-accounts.c (news_delete): Updated to use the remove_news()
- function.
-
- * mail-config.c (mail_config_remove_news): New convenience
- function for removing news accounts.
- (mail_config_remove_account): Pretty much the same thing.
-
- * mail-ops.c (do_send_queue): Get the X-Evolution-Transport URL
- and use that if it exists, else fall back on the default
- transport.
-
- * mail-callbacks.c (composer_postpone_cb): Set an
- X-Evolution-Transport header.
-
-2001-01-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * Makefile.am: Removed GPG_* variables.
-
- * component-factory.c (mail_load_storages): Now takes a
- 'is_account_data' variable to specify whether the sources is a
- list of accounts of a list of services. Basically, the only time
- you should pass in FALSE is when you are setting up NNTP storages.
- (add_storage): Now takes a 'name' argument that specifies the name
- to use in the storage.
- (owner_set_cb): Updated to pass TRUE for accounts and FALSE for
- news servers into mail_load_storages.
-
-2001-01-12 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Changed filter_date and filter_size to match the
- changes in gal.
-
-2001-01-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.glade: Anna's dialogs.
-
- * mail-config.c (mail_config_get_account_by_address):
- Removed. Danw and I decided on setting a X-Evolution-Transport
- header on messages going to the Outbox so we can later guess which
- transport to use when sending it.
-
- * mail-account-editor.c (apply_changes): Update to some day be
- able to support SSL.
- (construct): Update for Anna's dialogs...
-
- * subscribe-dialog.c (populate_store_list): Updated to reflect
- past changes to the mail-config API.
-
-2001-01-12 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-callbacks.c (composer_send_cb): Get the account by using
- the new e_msg_composer_get_preferred_account() function. Also
- check to make sure everything is configured (in case they deleted
- their accounts while composing mail?).
-
- * mail-config.c (mail_config_get_account_by_address): New
- convenience function.
-
-2001-01-12 Ettore Perazzoli <ettore@helixcode.com>
-
- * component-factory.c (component_fn): Pass NULL as the
- @copy_folder_fn arg to `evolution_shell_component_new()'.
-
- * folder-browser.c (on_right_click): Removed hide menu. It
- belongs to the view menu now.
-
-2001-01-12 Miguel de Icaza <miguel@ximian.com>
-
- * message-list.c: Add strings for localization
-
- * folder-browser.c: Rename "Save" to "Store search as vFolder".
-
-2001-01-11 Miguel de Icaza <miguel@gnu.org>
-
- * mail-display.c (on_object_requested): Unref the property bag
- when we are done with it.
- (get_embedded_for_component): Moved the code to request the
- embeddable/control to a separate function.
-
-2001-01-12 Jeffrey Stedfast <fejj@ximian.com>
-
- * mail-config.c (mail_config_get_account_by_name): New convenience
- function that I will need later when I redo the composer From
- field.
-
- * mail-display.c (on_object_requested): Update to reflect past
- changes to the mail-config API.
-
- * session.c (mail_session_set_password): strdup() the key.
-
- * mail-config-druid.c (construct): We don't want to be able to set
- the reply-to in the config druid.
- (druid_finish): Don't set a reply-to anymore.
- (mail_config_druid_finalise): Don't unref the providers.
-
- * mail-config.glade: Took out the Reply-To field in the druid.
-
-2001-01-11 Miguel de Icaza <miguel@gnu.org>
-
- * mail-config-druid.c (incoming_type_changed): Guess the default
- MAIL value for MBOX and Maildir files.
-
- * mail-callbacks.c (configure_mail): Force finalization of the
- function before returning fixing the FIXME that was there.
-
-2001-01-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config-druid.c (transport_next): If the service_check
- fails, pop-up a warning dialog letting the user know he or she may
- have problems and then let them continue on with their lives.
- (incoming_next): Same (+ jump them over the auth page to the
- transport page).
-
- * mail-account-editor.c (apply_changes): Eek! Don't destroy the
- account if the connection fails, duh. This is what is causing the
- segfaults.
-
-2001-01-11 Dan Winship <danw@ximian.com>
-
- * folder-browser.c (got_folder): Connect to folder_changed as well
- as message_changed for updating unread count
-
-2001-01-10 Miguel de Icaza <miguel@helixcode.com>
-
- * GNOME_Evolution_Mail.oafinfo: Add Bonobo/ItemContainer as the
- set of supported interfaces in GNOME_Evolution_Mail_Composer
- component.
-
-2001-01-11 Dan Winship <danw@ximian.com>
-
- * mail-format.c (write_field_to_stream): Translate the header name
- to UTF8.
-
-2001-01-10 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-callbacks.c (configure_mail): New function that explains to
- the user why he can't do the action he requested and then procedes
- to ask if he'd like to configure his accounts now.
- (check_send_configuration): If the user doesn't have configured
- accounts, don't let him continue and call configure_mail().
- (fetch_mail): Same.
- (send_queued_mail): Same.
- (send_receieve_mail): Same.
-
- * mail-config.c (mail_config_write): Don't save a "is_configured"
- variable. Instead we'll just check to see if we have accounts - if
- yes, then configured == TRUE.
- (mail_config_is_configured): return accounts != NULL.
- (mail_config_get_default_account): Mark the first account as the
- default if none are marked.
-
-2001-01-10 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-account-editor.c (source_auth_type_changed): Set the
- sensitivity of the Password label too.
-
- * mail-config-druid.c (transport_back): New callback to handle
- when the user hits the "back" button when on the transport
- page. This is needed to handle the case where we don't want to
- show the user the auth page (due to there being no auth choices).
- (incoming_next): If we are going to skip over the auth page, set
- the 'have_auth_page' variable to FALSE.
- (construct): Initialize the have_auth_page to TRUE.
-
-2001-01-10 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config-druid.c (incoming_type_changed): Grab the focus of
- the first widget that is sensitive.
- (transport_type_changed): Same.
- (identity_prepare): Grab the focus of the name entry.
-
- * mail-callbacks.c (send_queued_mail): Prevent Federico's segfault.
-
-2001-01-10 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config-druid.c (auth_type_changed): Clear the password
- entry if it's not allowed.
- (transport_type_changed): Clear the hostname if it is not allowed
- by the provider type.
-
- * mail-account-editor.c (transport_type_changed): If the hostname
- is allowed, clear it.
-
- * mail-config-druid.c (incoming_type_changed): Clear the contents
- of the entry boxes that are not to be used.
- (mail_config_druid_get_source_url): If the text in the entry is
- emptry string, don't set it' contents in the url.
-
-2001-01-10 Miguel de Icaza <miguel@helixcode.com>
-
- * mail-callbacks.c (print_msg): Fix proto.
- (print_preview_msg): Fix proto.
-
- * subscribe-dialog.c: Remove more UNSAFE macros.
-
-2001-01-09 Jason Leach <jasonleach@usa.net>
-
- * mail-display.c (pixmap_press): Bugfix for #1077: scrollwheel
- doesn't work while hovering over an attachment icon.
-
-2001-01-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config-druid.glade: Moved to mail-config.glade
-
- * mail-accounts.c (construct): Updated to use mail-config.glade.
-
- * mail-account-editor.c (construct): Updated to use
- mail-config.glade.
-
- * mail-config-druid.c (construct): Updated to use
- mail-config.glade.
-
- * mail.h: Added the new mail config headers.
-
-2001-01-09 Dan Winship <danw@helixcode.com>
-
- * mail-local.c (local_folder_changed_proxy): Change
- mail_op_forward_event to mail_proxy_event.
-
-2001-01-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (save_messages_save): Let the system umask determine
- the permissions of this file.
-
- * mail-config-druid.c (incoming_type_changed): Gray out the
- appropriate labels too.
- (auth_type_changed): And here.
- (transport_type_changed): Here too...
-
- * mail-account-editor.c (source_check): Gray out the appropriate
- labels too.
- (transport_type_changed): And here too.
-
-2001-01-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-account-editor.c: For all optionmenu's, set the appropriate
- 'history'.
- (keep_mail_check): Set the keep-on-server checkbutton sensitivity
- based on whether or not the store is a storage or not.
- (construct): Call keep_mail_check().
-
- * mail-config-druid.c (incoming_type_changed): Set the
- keep-on-server checkbutton sensitivity based on whether or not the
- store is a storage or not.
-
- * mail-accounts.c (construct): Make sure the dialog isn't a
- scrunched little thingy.
-
-2001-01-09 Dan Winship <danw@helixcode.com>
-
- * Makefile.am (evolution_mail_LDFLAGS): Add -export-dynamic, so
- libglade can resolve evolution-mail symbols.
-
-2001-01-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-format.c: Updated.
- (decode_pgp): Get rid of #ifdef PGP_PROGRAM's and handle
- appropriately.
- (handle_multipart_signed): Same.
- (handle_multipart_encrypted): Same.
-
- * Makefile.am: Added openpgp-utils.[c,h] to the build.
-
- * openpgp-utils.c: New source file containing all of the pgp
- interface code.
-
- * mail-crypto.c: Removed all of the openpgp funtions as they are
- being moved to a new file.
- (mail_crypto_is_rfc2015_signed): Renamed.
- (mail_crypto_is_rfc2015_encrypted): Renamed.
-
-2001-01-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * session.c (mail_session_set_password): New function to set the
- password for a given url.
-
- * mail-config-druid.c (druid_finish): Don't save the password in
- the source url, instead insert it into the save-password hash.
- (mail_config_druid_get_source_url): Check to make sure the
- authmech isn't "", if it is then don't set the authmech.
-
- * mail-account-editor.c (apply_changes): Don't save the password
- in the source url, instead insert it into the save-password
- hash. Also check to make sure we don't set an empty string as the
- authmech for the source or transport.
-
- * mail-accounts.c (mail_default): After reloading the accounts,
- reselect the previously selected account.
- (mail_delete): Same.
-
- * mail-config-druid.c (druid_cancel): Fixed segfault bug.
-
-2001-01-09 Radek Doulik <rodo@helixcode.com>
-
- * mail-format.c (write_headers): remove </center><p>
- (handle_text_plain): add <font size=\"-3\">&nbsp</font><br> before
- msg text
- (handle_text_plain_flowed): ditto
-
-2001-01-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-accounts.c (mail_default): Write the config data and reload
- the accounts list so the "default" tag is relocated.
- (mail_delete): Write the config data here too.
-
-2001-01-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * Makefile.am:
- * component-factory.c:
- * folder-browser-factory.c:
- * folder-browser.c:
- * mail-accounts.[c,h]:
- * mail-account-editor.[c,h]:
- * mail-callbacks.c:
- * mail-config.[c,h]:
- * mail-config-druid.[c,h]:
- * mail-config-druid.glade:
- * mail-display.c:
- * mail-format.c:
- * mail-tools.c: Brand spankin' new config druid, editor,
- and manager.
-
-2001-01-08 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c: Add an #include <errno.h>
-
-2001-01-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * Makefile.am:
- * component-factory.c:
- * folder-browser-factory.c:
- * folder-browser.c:
- * mail-callbacks.c:
- * mail-config.[c,h]:
- * mail-display.c:
- * mail-format.c:
- * mail-tools.c: Reverted mail-config changes temporarily until
- I get it working correctly.
-
-2001-01-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config-druid.c: More lovely fixes...
-
- * mail-callbacks.c: Don't segfault if a default account doesn't
- exist.
-
-2001-01-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config-druid.c: A bunch of fixes.
-
- * mail-accounts.c: More fixes...
-
- * mail-account-editor.c (construct): Reparent the notebook to the
- editor->vbox and set the resize policy.
-
-2001-01-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-callbacks.c (providers_config): Use a
- gnome_dialog_run_and_close().
-
- * mail-accounts.c (construct): Reparent the notebook to the
- dialog->vbox not to the dialog itself. Also set the resize policy
- to allow the user to stretch it.
-
-2001-01-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-tools.c (mail_tool_quote_message): Updated to reflect
- changes to the mail-config API.
-
- * mail-display.c (redisplay): Updated to reflect changes to the
- mail-config API.
-
- * mail-callbacks.c (providers_config): Use the new account dialog.
-
- * mail-config-druid.c (druid_finish): Load the new storage into
- the shell.
- (mail_config_druid_new): Take a shell argument.
-
- * mail-format.c (mail_generate_reply): Updated to reflect changes
- to the mail-config API.
-
- * mail-config-druid.c: Fixed this to build.
-
- * mail-callbacks.c (check_send_configuration): Updated to reflect
- changes to the mail-config API.
- (create_msg_composer): Same.
- (forward_get_composer): Same.
- (send_queued_mail): Same.
- (composer_send_cb): Same.
-
- * mail-account-editor.c: Updated to build cleanly. *
- mail-config-druid.c: Same. * mail-accounts.c: Same.
-
- * folder-browser-factory.c (control_activate): Updated for API
- changes in mail-config.
-
- * folder-browser.c (done_message_selected): Updated for API
- changed in mail-config.
- (folder_browser_gui_init): Same.
- (got_folder): Same.
-
- * component-factory.c (owner_set_cb): After using the sources
- list, free it as it is no longer a const GSList as with the older
- mail-config code.
-
- * mail-config.c: Totally rewritten.
-
-2001-01-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-accounts.c (mail_edit): Implemented.
-
- * mail-account-editor.c (apply_clicked): Implemented.
- (ok_clicked): Implemented.
- (cancel_clicked): Implemented.
- (source_auth_type_changed): Implemented.
- (source_auth_init): Implemented.
- (transport_construct_authmenu): Implemented.
- (transport_type_changed): Updated to change regenerate the auth
- option menu.
- (construct): Attached callbacks to OK, Apply and Cancel buttons.
-
- * mail-account-editor.c (source_auth_init): Use the new
- mail_config_check_service().
-
- * mail-config-druid.c: Remove check_service() as it will be moved
- into mail-config.
-
-2001-01-06 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c (message_list_select): Made it so that going to
- the next or previous message in the list will at least move one
- message, even if the current message matches the query. This
- makes 'n' go to the next unread message, even if the current
- message is unread.
-
-2001-01-06 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-account-editor.c: Coded a bunch of the methods.
-
-2001-01-04 Iain Holmes <iain@helixcode.com>
-
- * mail-summary.c (idle_check): Check if the HTML for the current
- summary has been created, and if not then keep trying until it
- has.
- (new_folder_cb)
- (removed_folder_cb)
- (create_summary_view): Use the idle_check function to generate the
- summary.
- (create_summary_view): Don't set the HTML here. Set it via the
- pipe.
-
-2001-01-05 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-account-editor.[c,h]: New source files to provide an
- account editor widget.
-
- * mail-config-druid.c (auth_type_changed): Set the authproto on
- the druid so we can look it up later.
-
-2001-01-05 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-accounts.c (mail_add): Since the druid now handles adding
- the new account to the config, we'll just connect to the destroy
- event and show the druid.
- (mail_add_finished): Just reload the account list here.
-
- * mail-config-druid.c (druid_finish): New callback to handle the
- "finish" signal. On second thought, it seems it would be best for
- the finish callback to be here rather than in mail-accounts.c.
-
- * mail-accounts.[c,h]: Added. Contains source for the Account manager
- window. And just like mail-config-druid.c, it's not yet complete.
-
- * mail-config-druid.c (mail_config_druid_get_incoming_keep_mail):
- Renamed from _delete_mail
- (mail_config_druid_get_transport_url): New convenience function
- that replaces the get_hostname, get_protocol, etc.
- (mail_config_druid_get_source_url): Same.
-
- * mail-config-druid.glade: Changed "Delete mail from server" to
- "Keep mail on server" as this has a more positive ring to it. Both
- I and Aaron agree this is the better phrase.
-
-2001-01-04 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config-druid.c: Fixed a few 'Oops'es.
-
- * mail-config-druid.glade: Added a "Default" button for marking an
- account as the default.
-
-2001-01-04 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config-druid.glade: Updated. What else can I say?
-
-2001-01-04 Dan Winship <danw@helixcode.com>
-
- * folder-browser.c (got_folder): Connect to "message_changed" on
- the folder if it's on a remote storage.
- (update_unread_count): Update the folder unread count / highlight
- in the shell when the unread message count changes
-
-2001-01-04 Not Zed <NotZed@HelixCode.com>
-
- * mail-ops.c (mail_do_send_mail): Removed old implementation.
-
- * folder-browser.c (do_message_selected): If we haven't got a real
- uid, then clear the display instead.
-
- * message-list.c (message_list_drag_data_get): Use new save
- message function, and also wait for it to finish before
- continuing.
- (folder_changed):
- (message_changed): Use mail_proxy_event instead of
- mail_do_forward.
- (mail_regen_list): New iplementation to replace the old.
- : remove <gnome.h> from headers. Dont define timeit by default.
- (main_folder_changed):
- (message_list_set_folder):
- (message_list_set_threaded):
- (message_list_set_search):
- (message_list_hide_add):
- (message_list_hide_uids):
- (message_list_hide_clear): Use mail_regen_list instead of
- mail_do_regenerate_messagelist.
- (mail_do_regenerate_messagelist): Removed the old stuff. No
- functionality changed yet, just using different thread stuff.
-
- * mail-callbacks.c (save_msg_ok): Use new save message function.
-
- * component-factory.c (create_view):
- (add_storage): Use mail_scan_subfolders to build the folder info.
- (create_folder): Use new implementation with our own callback.
- (owner_set_cb): Changed b ack to use mail_get_folder, but now wait
- for it to finish. This will let any gui still run, but also gives
- us the required synchronous operation.
- (got_folder): Callback for when the folder has been opened.
-
- * mail-ops.c (mail_get_folderinfo): New function to just get the
- folder info in another thread.
- (mail_scan_subfolders): New scan subfolder implementation that
- uses mail_get_folderinfo.
- (mail_do_scan_subfolders): Removed old implementation.
- (mail_create_folder): Nerw implementation to create a folder, only.
- (mail_do_create_folder): Removed old implementation.
- (mail_save_messages): New implementation, fixes a couple of minor
- problems, and now provides a return so it can be waited on. Also
- check that the writes worked, etc.
- (mail_do_save_messages): Remove previous implementation.
- (mail_do_flag_messages): Removed, nothing uses it.
- (mail_do_flag_messages): Removed, nothing uses it anymore.
- (mail_get_folder): REturn the operation id, so callers can wait
- for it.
- (sync_folder_desc):
- (expunge_folder_desc): Add describe functions so we know what its
- doing.
- (mail_send_mail): More generic implementation of sending mail.
-
- * mail-mt.c (mail_msg_new): Lock around seq increment. And insert
- each new message into a hash table of active messages.
- (mail_msg_init): Init the active message table.
- (mail_msg_free): Remove the message from the active message table.
- (mail_msg_wait): New function, waits for a message to be
- processed, by id.
- (mail_msg_check_error): Dont display the error if it is a
- user-cancelled operation.
- (mail_proxy_event): new implementation of mail_op_forward_event.
- Only real difference is it uses the new thread stuff, and you can
- wait for it to finish if you want.
- (mail_proxy_event): If we're already in the main thread, just call
- the function.
-
-2001-01-03 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config-druid.c: New source file that implements
- mail-config-druid. Note: this is not yet complete.
-
-2001-01-03 Not Zed <NotZed@HelixCode.com>
-
- * mail-view.c (view_forward_msg): Call
- mail-callbacks.c:forward_messages(), so the behaviour is the same
- as from the folder browser.
-
- * mail-callbacks.c (forward_messages): New function to forward
- messages, attached or not.
- (forward_inlined): Changed to use new forward-messages
- implementation.
- (forward_attached): Likewise.
- (do_forward_attach): Callback for forwarding as attachment, once
- we have built it.
- (do_forward_inline): Likewise, for inline, once we have retrieved
- the message.
- (forward_message): Removed.
-
- * mail-ops.c (mail_build_attachment): New function to build an
- attachment of messages.
- (mail_do_attach_message): Removed, functionality superceeded by
- above.
- (mail_do_forward_message): Removed. Likewise.
- (mail_create_folder): Started work on an alternative
- implementation of create_folder, but not sure about it yet.
-
- * mail-tools.c (mail_tool_generate_forward_subject): Remove locking.
- (mail_tool_make_message_attachment): Free the description when done.
-
-2001-01-03 Radek Doulik <rodo@helixcode.com>
-
- * mail-format.c (write_headers): add font color setting for table,
- changed border behavior
-
- * mail-display.c (redisplay): don't set body bg and text color
-
-2001-01-02 Not Zed <NotZed@HelixCode.com>
-
- * mail-callbacks.c (view_msg): Fix for mail_get_message change,
- use queue thread.
-
- * folder-browser.c (done_message_selected): Fix mail_Get_message
- calls, use new thread.
- (do_message_selected): "
-
- * mail-ops.c (mail_get_message): Add a thread argument so callers
- can specify which queue it executes on.
-
- * mail-mt.c (mail_msg_free): Fix a free order problem.
- (mail_msg_destroy): Call mail_msg_free to do the work.
- (mail_msgport_replied): "
- (mail_msgport_replied): Check/display errors if we get them.
- (mail_msgport_received): If we have a describe function, say what
- we're doing, also set busy/unbusy.
- (mail_msgport_replied): Clear busy when we get a reply.
- (mail_get_password): Unset busy.
- (mail_msg_received): Set busy as we go.
- (mail_msg_destroy): Unset busy when done.
- (mail_status): Blah blah, new status interface, the other wans't
- workable with the way the shell api works.
-
-2000-12-29 Not Zed <NotZed@HelixCode.com>
-
- * folder-browser.c (do_message_selected): If we are reconfiguring,
- just keep polling till we are done (yeah kinda shitty, but easy).
- (folder_browser_set_uri): Clear reconfigure flag here. ick.
- (got_folder): And here too.
- (on_right_click): Remove locking.
- (hide_sender): and here too.
- (hide_subject): And here.
- (on_right_click): If we are in reconfigure, then the whole menu is disabled.
-
- * mail-mt.c (status_busy_timeout): Clear the status_busy_timeout_id.
-
- * mail-local.c (local_storage_new_folder_cb): Made getting folders
- completely synchronous. The shell expects it, and it was only
- synchronous before by a sideeffect.
- (do_reconfigure_folder): Remove locking stuff.
- (do_reconfigure_folder): Use our own much simpler copying routine
- than that stupid move_folder_contents thing.
- (update_progress): Use mail_status_message() instead.
- (do_reconfigure_folder): Set the reconfigure flag during
- reconfigure & set busy flag.
- (cleanup_reconfigure_folder): clear busy flag.
-
- * mail-tools.c (mail_tool_uri_to_folder): Remove the tool_lock
- stuff.
- (mail_tool_uri_to_folder_noex): Clear exception on exit.
- (mail_tool_move_folder_contents): Get rid of this really stupid
- function that is only used in one place.
-
- * component-factory.c (owner_set_cb): Use direct calls to get the
- folders, as this code must run synchronous. Remove the event wait
- stuff.
-
- * mail-callbacks.c (edit_msg): Call mail_get_messages, and create
- the composers ourself.
- (do_edit_messages): get_messages callback, create the composers
- and connect to signals we need.
- (view_msg): Dont call do_view_messages, just call
- mail_get_messge for each to get them in parallel.
- (do_view_message): view a single message.
-
- * mail-ops.c (mail_edit_messages): Just use mail_get_messages
- for this operation. Removed the other async operation stuff.
- Changed my mind, just removed entirely.
- (mail_do_view_messages): Removed.
- (mail_do_setup_folder): Removed.
- (mail_do_scan_subfolders): Make this run synchronously, as every
- caller expects it to (even if they didn't realise).
-
-2000-12-28 Not Zed <NotZed@HelixCode.com>
-
- * mail-callbacks.c (send_queued_mail): Dont expunge the folder
- here, but in send_queue, otherwise it might execute out of order.
- (expunge_folder): Remove the talbe prechange stuff, and infact
- references to the message_list folder, as we have our own folder.
- Also, dont allow expunge if we're already expunging.
- (expunged_folder): Clkear the expunging flag if we're finished.
-
- * folder-browser-factory.c (control_deactivate): Likewise here.
- Hrm, i thought this function required a callback, silly me.
-
- * mail-tools.c (mail_tool_make_message_attachment): Remov e
- locking.
-
- * folder-browser.c (on_message_selected): Use a timeout handler so
- we dont select immediately.
- (folder_browser_set_uri): Changed to use mail_get_folder.
- (got_folder): New callback called when get_folder is finished.
- (folder_browser_destroy): Use new sync interface.
-
- * mail-ops.c (mail_get_message): New function to asynchrounously
- get a message.
- : #define out mail_tool_camel_lock stuff entirely.
- (mail_get_folder): New function to asynchrounously get a folder.
- (mail_do_load_folder): Removed, replaced by more generic function
- above.
- (mail_do_display_message): Removed, replaced by the more generic
- funciton get_message.
- (mail_get_messages): New function to get a list of messages
- asynchronously.
- (mail_sync_folder): New interface to sync a folder async.
- (mail_expunge_folder): New interface for expunging folder, with
- callback.
- (do_send_queue): Remove lock stuff, and expunge if (and only if)
- successful, also sync the sent folder while we're at it.
-
- * session.c (mail_session_request_dialog): Changed to use new
- mail_get_password call.
-
- * mail-mt.[ch]: New threading/interthread messaging framework.
-
- * main.c (main): Init the message/thread system.
-
-2001-01-02 Dan Winship <danw@helixcode.com>
-
- * mail-format.c (mail_part_is_inline):
- (find_preferred_alternative):
- * mail-display.c (launch_cb): Use header_content_type_simple, not
- header_content_type_format.
-
-2000-12-26 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-crypto.c (mail_crypto_openpgp_verify): Implemented.
-
-2000-12-23 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (mail_do_setup_trash): New function similar to
- mail_do_setup_folder() except that this creates the Trash VFolder
- (special-case).
-
-2000-12-21 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_send_mail): Don't free info inside the last
- if-statement, if sent_folder doesn't exist we'll have a memory
- leak. Instead free it afterward.
-
-2000-12-29 Dan Winship <danw@helixcode.com>
-
- * mail-crypto.c: Oops. Update this for CamelContentType stuff too.
-
-2000-12-28 Dan Winship <danw@helixcode.com>
-
- * mail-format.c (mail_part_is_inline, mail_get_message_body): Use
- CamelContentType, and use header_content_type_is instead of doing
- it by hand.
-
- (handle_text_plain):
- (handle_multipart_related):
- (find_preferred_alternative):
- (handle_message_external_body): Use CamelContentType and
- header_content_type_* functions instead of GMimeContentField.
-
- * mail-display.c (write_data_to_file, launch_cb): Use
- CamelContentType and header_content_type_* functions instead of
- GMimeContentField.
-
-2000-12-26 Iain Holmes <iain@helixcode.com>
-
- * mail-display.c (mail_display_init): Initialise the thumbnail cache.
- (mail_display_destroy): Free the cache.
- (pixbuf_gen_idle): Check the cache for a pixbuf, add the pixbuf to the
- cache if it's not there.
-
-2000-12-26 Iain Holmes <iain@helixcode.com>
-
- * mail-summary.c (create_summary_view): Create a shared
- BonoboEventSource object and use it for all the objects that
- aggregate Bonobo::EventSource.
-
-2000-12-27 Dan Winship <danw@helixcode.com>
-
- * subscribe-dialog.c (setup_subscribe_folder): Use info->name, not
- input->full_name. Fixes #1029 in bugzilla.helixcode.com.
- ({setup,do,cleanup}_subscribe_folder): Update previous fix: Jeff
- had changed it to use ->full_name instead of ->name because that's
- what camel_store_subscribe_folder needed. So we need to have
- *both* names available, one for Camel, one for the shell.
-
-2000-12-24 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c (filter_date): Changed this to format times in 12
- hour time instead of 24 hour time.
-
-2000-12-24 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c (filter_date): Changed this to do different
- formatting of dates within the last week.
-
-2000-12-24 Not Zed <NotZed@HelixCode.com>
-
- * Merge from camel-mt-branch.
-
-2000-12-23 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c (filter_date): Changed this to do different
- formatting of dates based on the current time.
-
-2000-12-23 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c (message_list_get_layout): Added titles to the
- pixbuf columns.
-
-2000-12-21 Iain Holmes <iain@helixcode.com>
-
- * mail-summary.c: Added code to detect and regenerate the summary
- when a new vfolder is created or removed.
-
- * mail-vfolder.c: Export the vfolder_storage variable, so that
- the summary can add a listener to it.
-
-2000-12-05 Iain Holmes <iain@helixcode.com>
-
- * component-factory.c (factory_destroy): Wait till all views have
- gone and then destroy both factories.
-
-2000-12-21 Dan Winship <danw@helixcode.com>
-
- * mail-display.c (pixbuf_for_mime_type): Deal with the possibility
- that we have an icon-filename listed for a MIME type, but the icon
- file doesn't actually exist. Also, if gnome-unknown.png can't be
- found, fall back. Might fix a crash people have been reporting...
-
-2000-12-18 Chris Toshok <toshok@helixcode.com>
-
- * mail-format.c (handle_multipart_encrypted): for now #ifdef
- PGP_PROGRAM falling back to handle_multipart_mixed.
- (handle_multipart_signed): same.
-
-2000-12-18 Dan Winship <danw@helixcode.com>
-
- * message-list.c (hide_save_state): Unlock camel when done to
- prevent a hang later.
-
-2000-12-18 Miguel de Icaza <miguel@helixcode.com>
-
- * mail-tools.c (mail_tool_move_folder_contents): Only update
- display every 2 seconds.
-
- * mail-ops.c (do_view_messages): Only update display every 2 seconds.
-
-2000-12-23 Not Zed <NotZed@HelixCode.com>
-
- * message-list.h (MessageList): Add a specific hide data lock.
-
- * message-list.c (message_list_drag_data_get): Do not use
- cursor_uid, but get all currentlys elected messages directly off
- the message-list.
- (message_list_destroy): Removed mail_tool_camel_lock stuff.
- (on_click): "
- (message_list_hide_add, message_list_hide_uids, hide_load_state,
- hide_save_state, message_list_hide_clear): ", but use a specfic
- lock for the hide data.
- (do_regenerate_messagelist): remove mail_tool_camel_lock stuff,
- add hide_lock where required.
- (message_list_init): Setup the hide_lock.
- (message_list_destroy): Free the hide_lock.
-
-2000-12-22 Not Zed <NotZed@HelixCode.com>
-
- * mail-ops.c (mail_do_sync_folder): Run sync in different thread
- each time. Just a quick litlte hack to check multithreading.
- There are now few operations that single-queue. Need to work out
- a way to make the allocation of threads & resources easier, so we
- dont get overwhelmed with threads, but we dont block when we dont
- have to, either.
-
- * message-list.c (main_folder_changed): If we have only changed
- events, then process them directly.
- (mail_do_regenerate_messagelist): Run regenerate in a new thread
- each time, another quick hack to check mutlithreading.
-
- * mail-view.c (view_delete_msg): Call camel folder set message
- flags directly. mail_do_set_message_flags() is now completely
- unused.
-
- * folder-browser.c (mark_msg_seen): Call camel folder
- set_message_flags directly.
-
- * mail-callbacks.c (flag_messages): New function, that just sets
- flags of all selected messages, without all that messy thread
- stuff (setting flags is in-memory).
- (mark_as_seen): Use flag_messages().
- (mark_as_unseen): "
- (undelete_msg): "
- (delete_msg): "
-
-2000-12-20 Not Zed <NotZed@HelixCode.com>
-
- * message-list.c (message_list_select): Free messageinfo lookups.
- (message_list_drag_data_get): "
- (subtree_unread): "
- (subtree_size): "
- (subtree_earliest): "
- (ml_tree_value_at): " Also, keep the message info around in a
- static variable, and ref'd, so that any internal references we
- have to it dont vanish while we're not looking. This has a couple
- of problems ... esp since we never unref the last access, although
- camel-folder-summary wont check this when its unref'd, so we're
- 'safe'.
- (save_node_state): free messageinfo lookups.
- (on_click): "
- (get_message_info): deconstify return.
-
- * mail-tools.c (mail_tool_move_folder_contents): Free messageinfo
- lookups.
-
- * mail-ops.c (do_filter_ondemand): Free messageinfo lookups.
- (do_flag_messages): "
- (do_fetch_mail): Remove mail_tool_lock stuff.
- (mail_operation_run): Quick hack to run an operation
- asynchrounously, in a brand-new thread.
-
- * folder-browser.c (on_right_click): Free messageinfo lookups.
-
-2000-12-16 Not Zed <NotZed@HelixCode.com>
-
- * message-list.c (build_tree): Always use the slow (full-update)
- version of the tree update code, to get around a bug(?) in etree.
- (build_flat): Likewise.
-
-2000-12-15 Not Zed <NotZed@HelixCode.com>
-
- * mail-display.c (write_data_to_file): Dont blindly convert all
- parts to utf8, e.g. image/jpg. We only convert text/* parts, and
- only then if required.
-
-2000-12-14 Not Zed <NotZed@HelixCode.com>
-
- * component-factory.c (create_view): cast over a warning.
-
- * folder-browser-factory.c: Add verbs for hide functions.
-
- * message-list.c (message_list_hide_clear):
- (message_list_hide_uids):
- (message_list_hide_add): Some api renaming.
- (message_list_hide_add): Allow ML_HIDE_SAME to be passed to mean
- not to change the upper/lower range at all.
- (hide_save_state): Save the state of the hide list to stable
- storage.
- (hide_load_state): Load the state of hte hide list.
- (message_list_set_folder): Load/save the state of the folder if it
- is changed/set.
- (message_list_destroy): Save the state of the folder hide list
- when done.
- (save_tree_state): If we wrote out an empty state file, simply
- remove it instead.
-
- * folder-browser.c (on_right_click): Add some hide menus.
- (hide_read): Hide read messages.
- (hide_deleted): Hide deleted messages.
- (hide_selected): Hide selected/current message.
- (hide_none): Show all hidden messages.
- (on_right_click): Lock around accesses to the message (inside
- mlist_detect_magic).
- (on_right_click): Free the mailing list name.
-
-2000-12-13 Not Zed <NotZed@HelixCode.com>
-
- * folder-browser.c (on_right_click): Add camel locking since we
- call it directly. Whoever heard of a lock you 'down' to unlock?
-
- * message-list.c (mail_do_regenerate_messagelist): Added hide
- expression, messages to hide. Fixed all callers.
- (do_regenerate_messagelist): IF we have a hide expression, search
- and remove those from the uid list. If we have a hide range,
- apply that afterwards.
- (cleanup_regenerate_messagelist): Handle freeing the hide uid
- temporary data, if required.
- (message_list_destroy): Free hide data, also lock around all camel
- object stuff.
- (message_list_length): New function to get the number of messages
- avaialble to be hidden by range.
- (message_list_set_hide): Set the hide expression and range.
- Issue: Should hiding be remembered?
- (message_list_unhide_all): Turn off all hiding.
- (message_list_hide_uids): Hide a list of uid's.
-
-2000-12-15 Dan Winship <danw@helixcode.com>
-
- * subscribe-dialog.c (folder_toggle_cb): Update this for the new
- signal handler prototype. Fixes the crash on double-click.
-
-2000-12-15 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-format.c (handle_multipart_signed): New callback to handle
- multipart/signed parts.
- (decode_pgp): Update to account for the cipherlen argument needed
- for openpgp_decrypt.
- (is_rfc2015): Removed as we now have a better version in
- mail-crypto.
- (handle_multipart_encrypted): Updated to use the PGP/MIME utility
- functions.
-
- * mail-crypto.c (mail_crypto_openpgp_decrypt): Don't check
- (!*plaintext) as it could be a binary stream. Now also takes a
- cipherlen argument.
- (mail_crypto_openpgp_sign): New function.
- (pgp_mime_part_sign): New function to replace a mime part with the
- pgp signed equivalent.
- (pgp_mime_part_encrypt): New function to replace a mime part with
- the pgp encrypted equivalent.
- (pgp_mime_part_decrypt): New function to decrypt a pgp encrypted
- mime part (like from pgp_mime_part_encrypt) and replace it.
- (is_rfc2015_signed): New function to determine if a mime part is
- an rfc2015 signed part.
- (is_rfc2015_encrypted): New function to determine if a mime part
- is an rfc2015 encrypted part.
- (mail_crypto_openpgp_verify): New openpgp function to verify a
- signature.
-
-2000-12-14 Christopher James Lahey <clahey@helixcode.com>
-
- * mail-threads.c (update_active_views): Unref the iterator when
- we're done with it.
-
-2000-12-14 Larry Ewing <lewing@helixcode.com>
-
- * mail-display.c (mail_display_new): call
- gtk_html_set_default_content_type to make gkthtml default to utf-8
- when parsing. This requires gtkhtml >= the released 0.8.
-
-2000-12-14 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-threads.c (read_msg): Call `ui_set_busy()' before
- `ui_set_message()' so that we are sure that the
- set_busy/unset_busy calls always happen in order.
-
-2000-12-13 Christopher James Lahey <clahey@helixcode.com>
-
- * folder-browser.c (my_folder_browser_init): Made the vertical
- scrollbar always be there.
-
- * message-list.c (message_list_get_layout): Changed the minimum
- width of some of the pixmap column headers.
-
-2000-12-12 Christopher James Lahey <clahey@helixcode.com>
-
- * component-factory.c (create_view): Added a cast.
-
- * mail-summary.c: Added #include "mail-summary.h". Commented out
- folder_free, summary_free, and view_destroy_cb since they're not
- used.
- (do_changed): Added a cast.
- (create_summary_view): Changed some types so that casting would be
- easier.
-
- * session.c (mail_session_remember_password): Added a cast.
-
-2000-12-12 Dan Winship <danw@helixcode.com>
-
- * mail-summary.h: Fix to use the right .h instead of the
- deprecated one.
-
-2000-12-12 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-callbacks.c (forward_message): Attach a signature when
- forwarding, fixes bug #826.
-
-2000-12-11 Dan Winship <danw@helixcode.com>
-
- * session.c (mail_session_enable_interaction): New function to
- tell the code that it's ok (or not) to interact with the user when
- trying to authenticate to a service. Starts out turned off.
- (mail_session_request_dialog): If interaction is disabled, fail if
- the password isn't in the cache.
-
- * component-factory.c (owner_set_cb): Call
- mail_session_enable_interaction() after everything else. (This
- means that the IMAP password dialog will no longer pop up [under
- the splash screen] at startup.)
-
-2000-12-11 Dan Winship <danw@helixcode.com>
-
- * component-factory.c (create_view): Deal with "mailstorage" type
- views (top-level mail storages) by trying to fill the storage's
- folder tree again if we failed before.
- (add_storage): Create new storages with a URI and type
- "mailstorage".
-
- * mail-ops.c (cleanup_scan_subfolders): On success, mark the
- storage as having been loaded, so create_view won't try again.
-
-2000-12-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-format.c (decode_pgp): Updated to reflect arguments to the
- openpgp functions - now also takes an outlen argument.
- (try_inline_pgp): Updated.
- (handle_multipart_encrypted): Updated here too.
-
- * mail-crypto.c (crypto_exec_with_passwd): Updated to handle
- binary streams and such.
- (mail_crypto_openpgp_encrypt): Always initialize the passwd_fds
- even if we don't plan on signing. Added an 'inlen' to specify the
- length of the input data (as it could be binary). Also added a
- 'userid' argument for cases when we want to sign as well as
- encrypt.
- (mail_crypto_openpgp_decrypt): Updated to take an outlen argument
- in case the ciphertext is encrypted binary data.
- (mail_crypto_openpgp_clearsign): Added a 'hash' and 'detach'
- arguments. 'hash' allows the program to specify the preferred hash
- function (which will come in handy when generating
- PGP/MIME). 'detach' allows the program to specify whether it wants
- a detached signature or the entire signed text.
-
-2000-12-11 Dan Winship <danw@helixcode.com>
-
- * message-list.c: Remove the never-once-used BonoboObject stuff
- and make MessageList be a GtkWidget instead. Also, keep track of
- the ETable directly rather than repeatedly calling
- e_table_scrolled_get_table.
-
- * folder-browser.c (folder_browser_destroy): Use gtk methods
- rather than bonobo methods to destroy the message list.
- (on_right_click, on_double_click): These are being attached to the
- ETable directly now, so fix the first argument (which isn't being
- used anyway, but...). Ignore double-clicks on "active" columns
- (the ones where clicking does something beyond "select"), fixing
- bug #811, which is what got me started on this to begin with...
- (folder_browser_gui_init): simplify now that MessageList itself is
- a widget. Also use message_list->table rather than
- e_table_scrolled_get_table.
-
- * mail-local.c (mail_local_reconfigure_folder): Add "mail_" to
- the beginning of this function name to match its prototype and the
- other vague namespace conventions in the mailer.
-
- * mail-callbacks.c (select_all, invert_selection): Use ml->table.
- (configure_folder): s/local_reconfigure_folder/mail_&/
-
- * mail-ops.c (do_flag_messages): clean up the cleanup a bit
-
- * mail-tools.c (mail_tool_quote_message): Remove an unused
- variable.
-
-2000-12-11 Not Zed <NotZed@HelixCode.com>
-
- * local-config.glade: reordered the options and added maildir,
- mbox, maildir, mh, in that order.
-
- * mail-local.c (reconfigure_clicked): Added maildir, re-ordered to
- match the changed xml file too.
- (do_reconfigure_folder): WHoever 'threaded' this code forgot to
- check that folder_browser functions shouldn't be called here.
- (cleanup_reconfigure_folder): Call it here instead.
- (lookup_folder): Blah blah, we have to lookup the folder and
- verify its still the same format, joy. Becaause someone thought
- it would be wise to make the code 5x more complicated for no
- reason, and totally break 'mail reconfigure' in the process. i'm
- really happy about that one.
- (cleanup_register_folder): Uh, yeah, so like, the
- local_store->folders hashtable is supposed to point to like,
- LocalFolders, not CamelFolders.
- (free_local_folder): Free the localfolder struct properly.
- (free_folder): Call above to free data properly.
- (get_folder): Fix for fixing folders hashtable.
- (local_storage_removed_folder_cb): Same here.
- (local_storage_new_folder_cb): Ref the local_store when putting it
- in the local_folder.
- (cleanup_register_folder): Properly free the local_folder if the
- op failed.
- (free_local_folder): Unhook events also.
- (d): Oops, left debug turned on.
-
-2000-12-09 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c (message_list_init): Change the "drawfocus"
- argument on e_table_scrolled_get_table(etable) instead of on
- etable (etable is an ETableScrolled.)
-
-2000-12-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-callbacks.c (save_msg_ok): Check to see if the file already
- exists, if it does prompt the user to for permission to overwrite
- the file.
- (forward_message): g_strdup the cursor_uid if there is only a
- single message to be forwarded or we'll segfault later.
-
- * mail-ops.c (do_save_messages): Rewrote yet again. I'm back to
- almost an identical implementation as the first time I wrote this
- except now we write the From line which I had forgotten last
- time. This means that we no longer have to unlink the .ev-summary
- file created and we also use fewer resources (no need to create a
- CamelMboxFolder object).
-
-2000-12-08 JP Rosevear <jpr@helixcode.com>
-
- * folder-browser.c (on_double_click): the e-table double-click
- signal now has extra params
-
-2000-12-07 Ettore Perazzoli <ettore@helixcode.com>
-
- * component-factory.c (add_storage): Pass `NULL' as the
- @toplevel_node_handler_id arg in `evolution_storage_new()'.
- FIXME: We should be passing the ID of the mail component here.
- * mail-vfolder.c (vfolder_create_storage): Likewise.
-
-2000-12-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * message-list.c (message_list_get_layout): Set the "Size" field
- to sort using integer comparison instead of string.
- (filter_size): New function to transform a integer size into a
- more readable form.
- (ml_value_to_string): Use filter_size.
- (ml_value_is_empty): COL_SIZE is no longer a string, so handle
- this as an integer.
- (ml_initialize_value): Here too.
- (ml_free_value): And here.
- (ml_duplicate_value): And here too.
- (message_list_create_extras): Setup the size etable cell.
-
-2000-12-08 Christopher James Lahey <clahey@helixcode.com>
-
- * folder-browser.c: Connect to signals on the ETable instead of
- the ETableScrolled.
-
- * subscribe-dialog.c: Used the e_table_scrolled_get_table function
- instead of accessing the variable directly.
-
-2000-12-08 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Connect to signals on the ETable instead of the
- ETableScrolled.
-
-2000-12-07 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Got rid of code referencing the ETableScrolled
- proxy functions. Changed the call to e_table_set_cursor_row to
- send a model row instead of a view row.
-
-2000-12-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-callbacks.c (forward_message): Only do a
- message_list_foreach if we plan on attaching messages, otherwise
- just use ml->cursor_uid.
-
- * mail-ops.c (cleanup_forward_messages): If attaching multiple
- forwarded message, wrap them in a multipart/digest otherwise just
- attach the single message as a message/rfc822.
-
-2000-12-07 Dan Winship <danw@helixcode.com>
-
- * mail-display.c (on_object_requested): Make the iTip hack spew a
- g_warning and not crash if you have no identity configured. To be
- revisited.
-
- * mail-callbacks.c: (various)
- * folder-browser.c (filter_mlist):
- * mail-autofilter.c (filter_gui_add_from_message):
- * mail-vfolder.c (vfolder_gui_add_from_message): Add some
- g_return_if_fail()s to protect from crashes until the code to
- enable/disable commands based on how many messages are selected is
- done.
-
-2000-12-06 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-vfolder.c (vfolder_gui_add_rule): Make the vfolder editor
- resize correctly. Fixes bug #835.
-
-2000-12-06 Dan Winship <danw@helixcode.com>
-
- Fix up shutdown so that things that should be destroyed get
- destroyed. Among other things, this fixes the bug where IMAP
- stores weren't disconnected at shutdown.
-
- * mail-threads.c (update_active_views): Update for
- folder_browser_factory_get_control_list change to EList.
-
- * folder-browser-factory.c: Turn control_list into an EList so
- that we can safely remove items from it while it's being iterated
- (which will happen as FolderBrowsers are destroyed at shutdown
- while the thread code is trying to update the status bars).
- (control_destroy_cb): Just destroy the folder_browser.
- (browser_destroy_cb): New callback for FolderBrowser destroy.
- Remove the control from control_list here instead of
- control_destroy_cb, because the controls don't seem to get
- destroyed reliably...
-
- * component-factory.c: Clean up stuff.
- (factory_destroy): Get rid of this.
- (owner_unset_cb): Schedule an idle handler to quit.
- (idle_quit): Wait for all of the FolderBrowsers to be destroyed
- and then destroy the storages and quit.
-
- * mail-summary.h (create_summary_view): Fix prototype
-
-2000-12-06 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config.c (mail_config_folder_to_cachename): Use
- e_filename_make_safe (which used to be e_str_make_safe).
-
- * mail-display.c (make_safe_filename): And here.
-
- * message-list.c (message_list_drag_data_get): Here too.
-
-2000-12-06 Dan Winship <danw@helixcode.com>
-
- * mail-local.c (cleanup_register_folder): Run the folder_changed
- code on message_changed as well, so the unread message counts
- update as messages are read.
-
- * folder-browser.c: Remove bits of filter-on-demand and toolbar
- bug workaround cruft that don't do anything useful any more.
-
- * mail-ops.c (cleanup_load_folder): unref the ref we added in
- setup_load_folder.
-
-2000-12-05 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-display.c (write_data_to_file): Use a charset filter to
- make sure the data is written out in the charset it was meant to
- be in instead of UTF-8.
-
- * mail-format.c (mail_format_raw_message): Don't use the raw
- message body as the format argument, use "%s" instead. If the raw
- message contains %'s then it will segfault otherwise.
-
-2000-12-04 Dan Winship <danw@helixcode.com>
-
- * mail-config-gui.c (service_page_item_new): Fix a typo so that
- toggling the "remember password" checkbox will activate the "OK"
- button if it was inactive.
-
-2000-12-05 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-vfolder.c (vfolder_create_storage): Updated the call to
- `evolution_storage_new()': pass NULL for @toplevel_node_uri.
-
- * component-factory.c (add_storage): Updated the call to
- `evolution_storage_new()': pass NULL for @toplevel_node_uri.
-
-2000-12-04 Jeffrey Stedfast <fejj@helixcode.com>
-
- * subscribe-dialog.c (setup_subscribe_folder): Use info->full_name
- rather than info->name so that we get the namespace part of the
- folder path as well.
-
-2000-12-04 Ettore Perazzoli <ettore@helixcode.com>
-
- * folder-browser-factory.c: Updated to define verbs
- "MessageForwardInlined" and "MessageForwardAttached" instead of
- "MessageForwardInline" and "MessageForwardAttach".
-
- * folder-browser.c (on_right_click): Make forwarding as an
- attachment the default.
-
- * mail-callbacks.c (forward_inlined): Renamed from `forward_msg'.
- (forward_attached): Renamed from `forward_attach'.
- * mail-callbacks.h: Updated accordingly.
-
-2000-12-01 Dan Winship <danw@helixcode.com>
-
- * session.c (mail_session_remember_password): Writes out passwords
- (to .gnome_private) in our patented proprietary "Best Awesome
- Super Encryption 64" ("BASE64") format which could not possibly
- ever be cracked by even the most cryptographically knowledgeable
- five-year-olds.
- (mail_session_init): Load remembered passwords at startup.
- (mail_session_forget_passwords): Erase them from disk as well as
- memory.
-
- * mail-config.c: Add "remember_password" field to
- MailConfigService.
- (mail_config_write_on_exit): Call mail_session_remember_password
- for services with "remember_password" set.
- * mail-config-gui.c: Add "remember password" checkbox to the
- dialogs, and make it appear and disappear as appropriate.
-
- * component-factory.c (mail_load_storages): Unref the store
- regardless of whether or not we're using it, so we don't leak
- references to non-storage stores.
-
-2000-12-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * message-list.c (e_mail_address_new): Perform better
- error-handling.
-
-2000-12-01 Radek Doulik <rodo@helixcode.com>
-
- * mail-ops.c (mail_op_report_status): use mail_op_set_message_plain
-
- * mail-threads.c (mail_op_set_message_plain): plain version of
- mail_op_set_message, doesn't use printf, passes message untouched,
- use set_message
- (mail_op_set_message): set_message
- (set_message): helper function
-
-2000-11-30 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (cleanup_fetch_mail): Don't display a dialog, instead
- inform the user that there was no new mail by setting a status
- message.
-
- * message-list.c (message_list_drag_data_get): Use the new
- e_str_make_safe function.
-
- * mail-display.c (make_safe_filename): And here.
-
- * mail-config.c (mail_config_folder_to_cachename): Here too.
-
-2000-11-30 Not Zed <NotZed@HelixCode.com>
-
- * mail-ops.c (cleanup_load_folder): Set threaded view before
- setting the folder (cleanup some flash ons tartup).
-
- * message-list.c (message_list_init): Initialise a mempool for uid
- string storage.
- (new_id_from_uid): Added messagelist arg, allocate strings from
- uid_pool.
- (new_id_from_subject): Same. Fixed all callers.
- (remove_node_diff): Dont free uid here.
- (build_flat_diff): Nor here.
- (clear_tree): Flush the mempool, rather than freeing the id's
- directly.
- (free_tree_ids): Removed, no longer required.
- (free_tree_ids): Likewise.
- (message_list_init): Dont connect to the table destroy signal
- anymore to free the uid table.
- (message_list_destroy): Free the uid pool here.
- (*): Use accessors for messageid stuff.
- (content_is_attachment): Removed, no longer required.
- (ml_tree_value_at): Get the attachment flag directly from the
- summary.
- (ml_tree_value_at): For 'fake' nodes, try and do something better
- than "?" for from, to, and size.
- (subtree_size): New function, add up the total size of a subtree.
- (subtree_earliest): Get the earliest date from a subtree.
- (ml_tree_value_at): Return earliest date sent/received for fake
- nodes.
- (ml_tree_value_at): Return something to mark a fake subject line
- as a fake subject, although i dont know, i guess this buggers up
- sorting ...
- (subtree_size): Check the info node is still there.
- (subtree_earliest): Same here.
- (subtree_unread): And here. The info node might vanish if the
- folder has changed/is changing and we try and redraw stuff while
- its doing it.
- (message_list_drag_data_get): Use accessors.
-
-2000-11-29 Jeffrey Stedfast <fejj@helixcode.com>
-
- * message-list.c (message_list_drag_data_get): Implement.
- (message_list_init): Connect the d&d signal.
-
- * mail-ops.c (do_save_messages): Use camel a bit more to help us
- out. Don't create the file ourselves, treat it as a CamelFolder so
- we don't have to worry about formatting.
-
-2000-11-29 Dan Winship <danw@helixcode.com>
-
- * main.c (main): Remove no-longer-needed e_unicode_init.
-
- * mail-tools.c (mail_tool_quote_message): Fix the allocation here
- (again) and put a comment explaining it. (Fixes a crash when
- replying.)
-
-2000-11-28 Dan Winship <danw@helixcode.com>
-
- * component-factory.c (owner_set_cb): Wait until after setting up
- the local storage to find the Drafts/Outbox/Sent folders.
-
- * mail-ops.c (do_setup_folder): Use the file: store rather than
- mbox:.
-
-2000-11-28 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser-factory.c: Added the SaveAs bonobo menu verb
- thingy.
-
- * mail-callbacks.c (save_msg): New callback for saving messages.
- (save_msg_ok):
-
- * folder-browser.c (on_right_click): Add a Save As menu item.
-
- * mail-ops.c (cleanup_save_messages): Save all emails to the path
- given.
-
-2000-11-28 Dan Winship <danw@helixcode.com>
-
- * mail-local.c (cleanup_register_folder): Fix the initial unread
- counts after the last patch.
-
-2000-11-27 Dan Winship <danw@helixcode.com>
-
- * mail-local.c (local_folder_changed): This needs to run from the
- main thread, not the camel thread, so add a proxy signal handler
- to call mail_op_forward_event. Fixes hangs (eg bugzilla #909).
-
-2000-11-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-display.c: Removed some unecessary debugging printf's
-
-2000-11-27 Dan Winship <danw@helixcode.com>
-
- * mail-config-druid.glade: Revert the new druid for now, until the
- corresponding code is done, so that the druid will work again.
-
-2000-11-21 Iain Holmes <iain@helixcode.com>
-
- * mail-config-gui.c (mail_config): Don't use the "delete-event"
- signal.
-
-2000-11-21 Iain Holmes <iain@helixcode.com>
-
- * mail-display.c (pixbuf_for_mime_type): free fm_icon.
-
- * component-factory (summary_fn): Remove the configure param.
- (factory_destroy): Made into a generic function so that the
- summary_factory can be ref-counted as well as the normal
- factory.
-
-2000-11-21 Dan Winship <danw@helixcode.com>
-
- * Makefile.am: add GPGME_CFLAGS and GPGME_LIBS
-
-2000-11-21 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config.c (mail_config_view_source): New function to return
- if user wants to view message source.
- (mail_config_set_view_source): New function to set whether the
- view wants to view source.
-
- * mail-ops.c (mail_do_view_message_sources): Removed. We're not
- gonna view-source this way anymore.
-
- * folder-browser-factory.c: Removed the ViewSource bonobo verb
- from the Message menu.
- (control_activate): Added ViewSource.
-
- * folder-browser.c (on_right_click): Removed Message menu item to
- view message source.
- (folder_browser_toggle_view_source): New callback to set whether
- or not the MailDisplay shows the raw message or the pretty-ified
- message.
-
- * mail-callbacks.c: Removed view_source.
-
- * mail-display.c (redisplay): If toggle_raw is set then display
- the raw message else display the pretty formatted message.
- (mail_display_redisplay): New function to force the redisplay of a
- message.
-
- * mail-format.c (mail_format_raw_message): New function to
- write the raw message data.
-
-2000-11-21 Not Zed <NotZed@HelixCode.com>
-
- * mail-vfolder.c (vfolder_uri_to_folder): IF we dont find a
- source, clear the exception and ignore it silently. for e.g. if
- the user reconfigured their mailboxes and one of them no longer
- exists.
-
-2000-11-21 Radek Doulik <rodo@helixcode.com>
-
- * mail-display.c: #include <gtkhtml/gtkhtml-embedded.h>
-
-2000-11-21 Not Zed <NotZed@HelixCode.com>
-
- * message-thread.[ch]: Removed. No longer serves a purpose.
-
- * Makefile.am (evolution_mail_SOURCES): Removed message-thread.[ch].
-
- * message-list.c (build_subtree):
- (node_equal):
- (add_node_diff):
- (build_subtree_diff):
- (do_regenerate_messagelist):
- (cleanup_regenerate_messagelist): Changed to use camel-folder-thread.
- (message_list_set_folder): If we get set a new folder, unhook any
- events before unrefing the folder too (the folder is never reset
- currently, but this would cause problems).
- (subtree_unread): Check for uid null, wont crash, but its a bug.
- (ml_tree_value_at): If the uid is null, then fake an obviously bad
- line.
- (build_subtree): Yeah well, we can't like freeze/thaw here,
- because this is called recursive, and freeze/thaw isn't
- recursive, like pre model and post model change was.
- (build_tree): Maybe we can try it here, although i dont think
- it'll help much.
- (build_flat): And this is also a tree. yes a tree.
- (build_tree): Added changes arg. If set, then try the 'diff'
- approach, unless the tree is already empty.
- (message_list_set_threaded): Dont clear the tree here.
- (message_list_set_search): Or here.
-
-2000-11-20 Not Zed <NotZed@HelixCode.com>
-
- * message-list.c (save_node_state): Save out the md5 hash of the
- messageid as hex, since thats all we have for those nodes.
- (build_subtree): Expand the messageid to a hex string first, then
- check it.
- (add_node_diff): And the same here.
-
- * message-thread.c (thread_messages): Changed for changes to
- messageid/references items.
- (id_hash, id_equal): New functions to hash on the binary message id hash.
- (thread_messages): removed some more no longer used dead code.
-
-2000-11-20 Jeffrey Stedfast <fejj@helixcode.com>
-
- * message-list.c (e_mail_address_compare): New comparison function
- that will replace address_compare if/when we ever go to save the
- preparsed addresses in the ETable rather than parsing them each
- time. Also fixed it so that we should get better sorting when
- addresses don't contain name parts (I was checking for NULL but
- not '\0').
- (address_compare): Use e_mail_address_compare.
-
-2000-11-19 Peter Williams <peterw@helixcode.com>
-
- * mail-ops.c (update_changed_folders): Instead of making the CORBA
- call in the dispatch thread, store the new display names and have
- cleanup_fetch_mail make the CORBA calls. Fixes deadlocks.
- (cleanup_fech_mail): Loop through the update_infos and make the
- CORBA calls.
- (setup_fetch_mail): Clear some new data items.
-
-2000-11-17 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-format.c (mail_generate_reply): Use the new quote_message
- function and make it start with "On %s, %s wrote:" since people
- seem to want that.
-
- * mail-ops.c (cleanup_forward_messages): Use the new quote_message
- function.
-
- * mail-tools.c (mail_tool_quote_message): New convenience function
- to quote a message body (since both the reply and forward code do
- similar quoting)
-
-2000-11-17 Not Zed <NotZed@HelixCode.com>
-
- * message-list.c (message_list_destroy): Before we destroy
- ourselves, unhook ourselves from the folder update events. Should
- fix a common crash on exit case.
-
-2000-11-16 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser-factory.c: Added the MessageViewSource bonobo
- menu verb.
-
- * mail-ops.c (mail_do_save_messages): New async function to save
- messages as individual files in a given path.
-
-2000-11-15 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser-factory.c: Added a new Forward as Attachment
- bonobo menu item verb.
-
- * mail-view.c (view_forward_msg): Updated to reflect changes to
- mail_do_forward_message(). It now forwards the message without
- attaching it - is this what we want?
-
- * mail-ops.c (mail_do_view_message_sources): New async function to
- display message source dialog windows.
- (setup_forward_messages): If we were asked not to forward the
- message(s) as attachment(s) and the user chose more than a single
- message, then default to making each message an attachment.
- (cleanup_forward_messages): If we aren't forwarding the message as
- an attachment, then quote the text and set the composer's body
- with it.
-
- * mail-callbacks.c (view_source): New callback to view the message
- source of all messages that are currently selected.
- (forward_attach): New callback to forward a message as an
- attachment (forward_msg is now for forwarding a message without it
- being an attachment).
- (forward_message): Convenience function for forwarding messages.
-
-2000-11-13 Jeffrey Stedfast <fejj@helixcode.com>
-
- * subscribe-dialog.c (subscribe_do_subscribe_folder): Take a
- 'subscribe' argument so that this can function as a subscribe AND
- unsibscribe method.
- (describe_subscribe_folder): Updated.
- (do_subscribe_folder): Updated.
- (cleanup_subscribe_folder): Updated.
- (subscribe_folder_info): Pass along a TRUE as the 'subscribe'
- param.
- (unsubscribe_folder_info): Pass along a FALSE as the 'subscribe'
- param.
-
-2000-11-13 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Removed some e_table_model calls and replaced
- them with e_tree_model calls.
-
-2000-11-12 Dan Winship <danw@helixcode.com>
-
- * mail-local.c (mail_do_register_folder): Do this the normal way
- rather than calling mail_operation_wait_for_finish. There was some
- reason for it originally, but it no longer applies. This makes
- adding new folders from the folder selection dialog no longer
- hang.
-
-2000-11-12 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_filter_ondemand): Sync the source folder.
-
-2000-11-11 Matt Bissiri <bissiri@eecs.umich.edu>
-
- * evolution-mail.oafinfo:
- * mail-threads.c: (retrieve_shell_view_interface_from_control):
- Update the remaining "IDL:Evolution*" to "IDL:GNOME/Evolution*"
- to sync up with yesterday's IDL re-scoping.
-
-2000-11-10 Michael Meeks <michael@helixcode.com>
-
- * Makefile.am ($(EVOLUTION_MAIL_CORBA_GENERATED)): sort include order.
-
-2000-11-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * subscribe-dialog.glade[.h]: New glade file for possibly using to
- create the subscribe dialog.
-
-2000-11-08 Radek Doulik <rodo@helixcode.com>
-
- * mail-format.c (mail_generate_reply): likewise
-
- * mail-callbacks.c (create_msg_composer): added send_html arg to
- e_msg_composer_new_with_sig_file call
-
-2000-11-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-search-dialogue.c (mail_search_dialogue_construct): Allow
- rule part to expand when the user resizes the dialog.
-
-2000-11-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser.c (search_save): Don't handle custom searching
- anymore... we don't want this.
- (search_full): Same.
- (folder_browser_search_menu_activated): Set the search entry
- widget sensitive.
- (folder_browser_search_query_changed): Same.
-
-2000-11-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser.c (search_full_clicked): Updated to use the
- ESearchBar object rather than the previously used search widgets.
- (search_full): Same.
- (search_save): Same. Also use enums to make it a little easier to
- read now that we have to have enums anyway.
- (folder_browser_search_menu_activated): New ESearchBar menu
- callback.
- (folder_browser_search_query_changed): New ESearchBar query
- callback. Replaces search_set()
- (folder_browser_clear_search): Updated to use the ESearchBar
- object rather than the previously used search widgets.
- (folder_browser_gui_init): Don't hand construct a search widget,
- use the new ESearchBar convenience widget.
-
- * mail-ops.c (cleanup_load_folder): Updated to reflect changes to
- FolderBrowser.
-
-2000-11-07 Jesse Pavel <jpavel@helixcode.com>
-
- * mail-display.c (pixmap_press): modified some of the EPopupMenu
- structures to account for differences in the popup menu API (as
- informed by Jeff.
- (on_object_requested): passed the user's default email address
- to the iTip control.
-
-2000-11-07 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am (INCLUDES): Add the composer dirs.
-
-2000-11-07 Not Zed <NotZed@HelixCode.com>
-
- * mail-display.c (on_object_requested): God, I sure wish people
- would listen when i'm saying i'm changing and API. I mean
- I even mailed everyone and everything. Can't see any changelog
- either.
-
-2000-11-06 Not Zed <NotZed@HelixCode.com>
-
- * mail-autofilter.c (rule_from_message): Updates for api changes.
-
- * mail-tools.c (mail_tool_generate_forward_subject): Fixed for api
- changes. Sigh, whoever wrote the multithread code of the mailer,
- had little idea. You can't just lock for getting a const value,
- until you are finished with it, cause the owner still owns it.
- Fixed this too. Yuck, what a horrid forwarding format, can we
- change this, or make it configurable? The mail headers show who
- forwarded it, we dont need to duplicate it in that UGLY subject.
-
- * mail-format.c (write_field_to_stream): Removed some jeffness.
- dont g_strdup stuff we dont need to, and remove the
- value_is_encoded thing since we can get the unencoded address
- now.
- (write_address): New function to write an address field.
- (write_headers): Uses write_address to write addresses, cleaner,
- fixed the god-awful unreadable indenting too.
- (handle_text_plain): Use a 'smarter' printf format, so we dont
- need to allocate and copy substrings unecessarily (esp since
- they're about to be allocated any copied another few times
- anyway *sigh*).
- (write_field_to_stream): Commented out the isprint check, which
- afaik serves no purpose.
- (list_add_addresses): New function to build a list of
- display-ready addresses. Although I think the composer then uses
- these as internet-ready addresses. It should probably take a list
- of CamelAddress's if thats what it wants.
- (mail_generate_reply): Cleaned up the address list creation stuff
- a heap, and fixes for camel api changes. Also fixed a small
- memory leak as a side effect (fulladdr wasn't freed if it was the
- same as the sender).
-
- * mail-display.c (on_object_requested): Changed for interface
- changes to the from address. I think passing the encoded
- (internet version) of the address is right here.
-
-2000-11-06 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser.c (on_right_click): Move filter stuff into a
- submenu of the popup menu.
-
-2000-11-06 Jesse Pavel <jpavel@helixcode.com>
-
- * mail-display.c: used Camel to parse the full address before
- passing the email address to my iTip control.
-
-2000-11-06 Dan Winship <danw@helixcode.com>
-
- First draft of folder tree unread message indication for /local
- mail folders.
-
- * mail-local.c: Add a new CamelStore subclass, MailLocalStore,
- which attaches to an Evolution_LocalStorage on one side and
- CamelSession on the other, and keeps track of local folders. Some
- of this code was previously in mail-local-storage.c, which no
- longer exists.
- (local_reconfigure_folder, etc): Various mail_op-related cleanups,
- and wrap d() around a bunch of printfs.
-
- * mail-tools.c (mail_tool_get_local_inbox_url,
- mail_tool_get_local_movemail_url): Removed
- (mail_tool_get_local_inbox): Simplified.
- (mail_tool_do_movemail): Remove unused dest_url variable.
- (mail_tool_uri_to_folder): Simplify. Now down to two cases
- (vfolder, and everything else).
-
- * component-factory.c (owner_set_cb): Pass evolution_dir to
- mail_local_storage_startup.
-
- * Makefile.am (evolution_mail_SOURCES): Remove
- mail-local-storage.[ch]
-
- * mail-summary.c: Remove mail-local-storage.h include
-
-2000-11-06 Kjartan Maraas <kmaraas@gnome.org>
-
- * mail-autofilter.c: Fix up #include <config.h>
- * mail-crypto.c: Same here.
- * mail-search-dialog.c: Here too.
- * main.c: Fix indentation of #ifdef
- * message-thread.c: Fix include.
-
-2000-11-06 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-callbacks.c (delete_msg): Don't invert the flag.
- (undelete_msg): Same (when multiple messages are selected).
-
-2000-11-06 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser-factory.c: Updated to have the same menu items as
- the new right-click menu - eventually these 2 menus should be the
- same.
-
- * folder-browser.c (on_right_click): Now correctly handles the
- case of multiple selection.
-
- * mail-callbacks.c (enumerate_msg): Make public so it can be used
- in other source files (it's a useful function!)
-
-2000-11-05 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser.c (on_right_click): Added an "Undelete" option to
- the right-click menu and also set a mask so it was only selectable
- if the message is marked as deleted. Also set a mask for "Mark as
- Read" and "Mark as Unread".
-
- * mail-callbacks.c (undelete_msg): New callback to undelete
- messages.
-
-2000-11-03 Dan Winship <danw@helixcode.com>
-
- * message-list.c (cleanup_regenerate_messagelist): don't free the
- MessageList search when it's being reused
-
-2000-11-03 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-local.c (mail_local_map_uri): Don't show the passwd in the
- url string.
- (mail_tool_local_uri_to_folder): Same.
- (do_reconfigure_folder): Same.
-
-2000-11-03 Jeffrey Stedfast <fejj@helixcode.com>
-
- * Makefile.am: Added new header files.
-
- * component-factory.c (owner_set_cb):
- s/session_init/mail_session_init
-
- * session.c: Renamed public functions to mail_session_*.
- FIXME: Rename session.c to mail-session.c
-
- * folder-browser-factory.c: #include "mail-callbacks.h", #include
- "mail-session.h" and replace forget_passwords with
- mail_session_forget_passwords
-
- * mail.h: Move session prototypes to mail-session.h, Move
- mail-crypto prototypes to mail-crypto.h, Move mail-callback
- prototypes to mail-callbacks.h
-
- * mail-session.h: New header file containing public prototypes
- for session.c
-
- * mail-format.c: #include "mail-crypto.h"
-
- * mail-view.c:
- * folder-browser.c: #include "mail-callbacks.h"
-
- * mail-crypto.h: New header file containing public prototypes
- for mail-crypto.c
-
- * mail-callbacks.h: New header file containing public prototypes
- for mail-callbacks.c
-
- * message-list.c (message_list_get_layout): Set useful defaults.
- (message_list_setup_etable): Don't set the Outbox defaults on a
- folder just because it doesn't have a corresponding saved file.
-
-2000-11-03 Dan Winship <danw@helixcode.com>
-
- * mail-config-gui.c (service_page_item_new): url_flags are now on
- CamelProvider, not CamelService
-
- * main.c:
- * subscribe-dialog.c:
- * mail-threads.c: Kill warnings
-
-2000-11-03 Federico Mena Quintero <federico@helixcode.com>
-
- * Makefile.am: Clean the idl-generated files properly.
-
-2000-11-03 Not Zed <NotZed@HelixCode.com>
-
- * mail-view.c: Added mail-display.h.
-
- * mail-autofilter.c: Removed unecessary headers. Who ran indent
- over this code? Sigh.
-
- * mail-ops.c (display_message_input_s): Added messagedisplay.
- (mail_do_display_message): Added messagedisplay arg.
- (mail_do_display_message): Dont bother doing another thread when
- we know we dont have a uid.
- (): Added folder-browser.h to headers. Sigh.
-
- * folder-browser-factory.c (control_activate): Setup the
- viewthreaded callback to the folder_browser function.
-
- * folder-browser.c (my_folder_browser_init): Connect to
- right_click of etable of the messagelist here.
- (on_right_click): Changed for argument changes.
- (folder_browser_toggle_threads): Changed to take a fb, and to set
- threaded mode on the messagelist.
- (my_folder_browser_init): Connect also to the double_click signal.
- (my_folder_browser_init): Connect to the message_selected signal
- of the message_list.
- (on_message_selected): Signal handler for message selected.
- (my_folder_browser_init): Fix for change to message_list_new().
-
- * message-list.h: Dont include folder-browser.h.
- (message_list_toggle_threads): Moved into folder-browser.h.
- (struct _MessageList): Removed folderbrowser.
-
- * mail.h: Dont include folder-browser.h here either, but
- mail-types.h instead.
- Moved prototypes moved into folder-browser.c into
- folder-browser.h. (vfolder_*, filter_*).
-
- * mail-display.h: Dont include folder-browser.h here, but
- mail-types.h and specific camel headers.
-
- * message-thread.c (sort_node): Invert the sort order logic so the
- list is sorted in mailbox order, not reverse mailbox order.
-
- * message-list.c (free_tree_ids): Fix a merge foo.
- (remove_node_diff): Removed unused row argument. Fixed
- callers/prototype.
- (clear_tree): pre_change on the removal of the root node.
- (build_flat): Only perform pre_change if we are rebuilding the
- whole lot. For incremental change let etable do its thing.
- (build_tree): Likewise for building the tree view. If making
- incremental updates, do them as we build it.
- (vfolder_subject):
- (vfolder_sender):
- (vfolder_recipient):
- (filter_subject):
- (filter_sender):
- (filter_recipient):
- (filter_mlist):
- (on_right_click): Moved to folder-browser.c, where they belong.
- (message_list_init): Dont connect to right_click anymore.
- (message_list_toggle_threads): Moved to folder-browser.c, renamed.
- (on_double_click): Moved to folder-browser.c
- (on_click): Set the flags directly, rather than in anothre thread,
- which is just not necessary.
- (message_list_class_init): Added a new signal 'message_selected',
- to indicate when a message was selected.
- (on_cursor_change_idle): Emit a signal, rather than directly
- triggering the display update.
- (select_row): Removed, no longer used.
- (idle_select_row): And this too.
- (select_msg): Removed as well.
- (message_list_select): Emit a signal, rather
- thandisplaying/clearing the mail-display directly.
- (mark_msg_seen): Moved to folder-browser.c
- (message_list_new): Removed folderbrowser argument.
-
-2000-11-02 Jeffrey Stedfast <fejj@helixcode.com>
-
- * message-list.c (on_right_click): Sync with message
- menu. Addresses bugzilla bug #778.
-
-2000-11-02 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Turn on draw grid for the main ETable (this may
- not be working in ETable itself.)
-
-2000-11-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-threads.c (mail_op_set_message): fmt argument should be
- const.
-
-2000-11-01 Dan Winship <danw@helixcode.com>
-
- Make "Get Mail" even more functional on IMAP (scans all folders),
- and do a first cut at folder tree highlighting (for IMAP/news
- only).
-
- * mail-ops.c (do_fetch_mail): For imap (sigh, we *still* shouldn't
- be hardcoding that), rescan the store's folder tree, rescan each
- changed folder for new messages, and update the shell folder tree.
- (do_scan_subfolders): Update for component-factory.c changes, and
- set folder display names and highlights appropriately when
- building the storage.
-
- * component-factory.c (add_storage): Make this static (was
- mail_add_new_storage). Use camel_service_get_name for the name
- rather than url->host. (Among other things, this lets you use a
- single machine as both an IMAP server and a news server.)
- (mail_lookup_storage): Hash storages based on their CamelStore
- rather than the URL.
- (factory_destroy): Disconnect each of the CamelStores in the
- storages_hash.
-
- * subscribe-dialog.c (cleanup_subscribe_folder):
- * mail-vfolder.c (vfolder_refresh): Pass "highlighted" flag to
- evolution_storage_new_folder
-
-2000-11-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (mail_op_report_status): Don't call the default
- logging function.
- (do_fetch_mail): Set the logfile and don't pass the logfile to
- filter_driver_set_status_func - it's purpose has been altered.
- (do_filter_ondemand): Same.
-
-2000-11-02 Not Zed <NotZed@HelixCode.com>
-
- ** Merged in camel-incremental-branch.
-
- * mail-format.c (mail_get_message_body): Jeff! Sigh.
- We should definetly not be strduping the
- content, it has already been copied and duplicated. Look at
- get_data_wrapper_text.
-
-2000-11-01 Chris Toshok <toshok@helixcode.com>
-
- * subscribe-dialog.h: add fields search_entry and search_top.
-
- * subscribe-dialog.c: add mail-ops.c style async operations for
- getting the store (to remove deadlock in the case where a auth
- dialog is dismissed at startup and then the subscribe dialog is
- brought up), and subscribing/unsubscribing to folders. One case
- remains, that is getting the list of all folders.
- (subscribe_search): flesh out this function
- (build_tree): use the search_top field so we can search for
- groups/folders.
- (subscribe_dialog_destroy): free search_top.
- (subscribe_dialog_construct): init search_top.
-
-2000-10-30 Iain Holmes <iain@helixcode.com>
-
- * mail-summary.c (generate_folder_summaries): Fix spelling :)
- Set folder->uri to NULL for the Inbox.
-
-2000-10-26 Iain Holmes <iain@helixcode.com>
-
- * mail-summary.c (generate_html_summary): Add view:// uris to
- switch the display to that folder.
-
-2000-11-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser-factory.c: Hmmm, someone can't spell Filder,
- er...I mean Filter ;-)
-
-2000-11-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-autofilter.c (rule_from_message): If the name is NULL or
- empty, then set the title to "Mail from <address>". Closes
- bugzilla bug #777. Also when filtering on Subject, set the file
- name to "Subject is <subject>" rather than just "<subject>" - I
- think this is a bit more user-friendly.
- (strip_re): Use unsigned char when passing to is<type>()
- functions from ctype.h.
- (rule_add_subject): Use the "is" rule instead of "contains".
-
-2000-11-01 Jesse Pavel <jpavel@helixcode.com>
-
- * mail-display.c: added property bag support for Bonobo
- controls, support which helps only the iTip control, currently.
-
-2000-11-01 Dan Winship <danw@helixcode.com>
-
- * mail-display.c (pixbuf_gen_idle): Lots of fixes and
- simplifications. Should get rid of the "missing icon" problem.
- There is still a problem with some images failing to get
- thumbnails, even though they display correctly.
- (pixbuf_for_mime_type): New function to try really hard to get the
- right icon for a MIME type, including looking in mc and nautilus's
- pixmap directories.
- (on_object_requested): Always use pixbuf_gen_idle, even for
- non-image types, to prevent code duplication.
-
-2000-10-31 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-format.c (mail_get_message_body): Shouldn't we be
- strdup'ing the content? This seems to fix the memory corruption
- problems.
- (mail_generate_reply): Make sure that the last char in the
- generated reply text is '\0' (when body text doesn't end with a
- \n, a random char will appear otherwise).
-
-2000-10-31 Dan Winship <danw@helixcode.com>
-
- * mail-config-gui.c (do_test_service): Update for
- camel_service_disconnect change.
-
-2000-10-31 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-autofilter.c (filter_gui_add_for_mailing_list): Match "is"
- rather than "contains" now that we have the "is"-rule.
-
-2000-10-30 Dan Winship <danw@helixcode.com>
-
- * mail-config-gui.c (config_do_query_authtypes): Redo this so that
- it works for all pages, not just the first page. (Now that this is
- finally working again, I expect Anna to finish her redesign in the
- next 15 minutes.)
- (service_page_item_new): Fix up the sizing of the Auth line to
- look more like everything else.
-
-2000-10-29 Dan Winship <danw@helixcode.com>
-
- * mail-tools.c (mail_tool_uri_to_folder): Simplify this a lot by
- making IMAP and NNTP use the same code, now that the IMAP
- namespace doesn't need special magic handling.
-
- * message-list.c (mail_do_regenerate_messagelist): Don't try to
- regenerate the message list if there is no folder. (The Bonobo UI
- code will call this as the callback for the "Threaded View"
- command.)
-
- * mail-ops.c (do_fetch_mail): Sync the folder before refreshing so
- we don't lose flag settings.
-
-2000-10-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-callbacks.c (composer_send_cb): Check to make sure that the
- recipient list is neither NULL nor a 0-length list of addresses
- and pop up a dialog letting the user know why we are not allowing
- him/her to send the message.
-
-2000-10-26 Dan Winship <danw@helixcode.com>
-
- * mail-display.c (write_data_to_file): Don't destroy a dialog
- after run_and_close'ing it.
-
-2000-10-26 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-callbacks.c (composer_send_cb): Check for the TO recipient
- list being NULL and don't send.
-
-2000-10-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_send_mail): Don't forget to unref the
- FilterDriver.
-
- * mail-callbacks.c (apply_filters): New callback for applying
- on-demand filters. (removed the old on-demand filters callback).
-
- * mail-ops.c (do_filter_ondemand): Rewrote to apply "incoming"
- filters to all selected messages.
- (mail_do_filter_ondemand): No longer takes a FilterContext
- argument or a destination folder argument (why did we ever need
- this last one??) but now takes a uids argument.
-
- * folder-browser-factory.c: Add a MessageApplyFilters menu item.
-
-2000-10-25 Iain Holmes <iain@helixcode.com>
-
- * mail-summary.[ch]: Updated for the new ExecutiveSummary code.
-
- * Makefile.am: Added the summary files and the evolution-services CFLAGS
- and LIB stuff.
-
- * component-factory.c: Re-enabled the summary stuff.
-
-2000-10-25 Dan Winship <danw@helixcode.com>
-
- * main.c (main): Pass send/postpone signal handler functions to
- evolution_composer_factory_init.
-
-2000-10-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * subscribe-dialog.c (subscribe_select_all): Implemented.
- (subscribe_invert_selection): (was unselect_all) Implemented.
-
-2000-10-25 Dan Winship <danw@helixcode.com>
-
- * message-list.c: Add a "flagged" column, based on the Camel
- "flagged" flag, for assigning an arbitrary "hey, I care about
- this" flag to a message.
- (ml_tree_set_value_at): Remove
- (ml_tree_is_cell_editable): No, it's not.
- (on_click): Handle the read/unread and flagged fields via the
- click handler. Among other things, this makes it not select
- a message when you change its read status.
-
-2000-10-24 Dan Winship <danw@helixcode.com>
-
- * subscribe-dialog.c (folder_info_subscribed,
- subscribe_folder_info, unsubscribe_folder_info): Don't prepend "/"
- to the folder's full_name. Deal with hierarchy in the
- EvolutionStorage tree better.
- (storage_tree_path): Helper function to build a storage path from
- a CamelFolderInfo.
-
-2000-10-23 Dan Winship <danw@helixcode.com>
-
- * *: Add some missing _()s and N_()s.
-
-2000-10-23 Dan Winship <danw@helixcode.com>
-
- * Makefile.am (INCLUDES): Update EVOLUTION_LOCALEDIR.
-
-2000-10-23 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_send_mail): Apply outgoing filters to the
- message.
-
-2000-10-23 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Fixed a possible error in row numberings. This
- needs to be changed quite a bit anyway, but this should make
- things slightly nicer in some cases.
-
-2000-10-23 Christopher James Lahey <clahey@helixcode.com>
-
- * folder-browser.c: Made the top of the folder browser a little
- prettier.
-
- * mail-display.c, mail-vfolder.c: Made more dialogs resizable.
-
-2000-10-23 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-autofilter.c (filter_gui_add_from_message): Don't forget to
- set the rule source! (eg "incoming", "demand", or "outgoing")
-
-2000-10-22 Ettore Perazzoli <ettore@helixcode.com>
-
- * message-list.c (message_list_init): Always display the vertical
- scrollbar.
-
- * mail-display.c (mail_display_new): Always display the vertical
- scrollbar.
-
-2000-10-20 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config.h: #include <camel/camel-folder.h>
-
-2000-10-20 Michael Meeks <michael@helixcode.com>
-
- * mail.h: s/BonoboUIHandler/BonoboUIComponent/
-
- * mail-callbacks.c (run_filter_ondemand): ditto.
-
- * session.c (forget_passwords): ditto.
-
-2000-10-20 Dan Winship <danw@helixcode.com>
-
- * evolution-mail.oafinfo: Declare composer factory.
-
- * main.c (main): Initialize it
-
-2000-10-19 Chris Toshok <toshok@helixcode.com>
-
- * message-list.c (nuke_uids): e-tree-model is now opaque. use the
- accessor to get the root node.
-
-2000-10-19 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-callbacks.c: #include "mail-vfolder.h"
- (vfolder_edit_vfolders): Don't call the dummy vfolder_edit
- function.
-
- * folder-browser-factory.c: s/VFolderEdit/SetVFolder
-
-2000-10-19 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c: (do_fetch_mail): For an imap store, just refresh the
- INBOX.
-
- * folder-browser-factory.c (control_deactivate): Don't sync
- non-existent folders.
- * message-list.c (nuke_uids): Don't traverse non-existent trees.
-
-2000-10-19 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am (glade_messages): New.
- (EXTRA_DIST): Add `$(glade_messages)'.
-
-2000-10-19 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c: Clean up some old #if 0 code.
-
-2000-10-19 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-format.c (mail_generate_reply): Get the MailConfigIdentity
- *before* we create a new composer object so that we can set the
- signature file.
-
-2000-10-18 Michael Meeks <michael@helixcode.com>
-
- * folder-browser-factory.c (register_ondemand): kill.
- (create_ondemand_hooks): die.
- (control_activate): remove hook.
-
- * test-mail.c (create_container): kill old UI handler.
-
-2000-10-18 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Fixed some column widths.
-
-2000-11-02 Not Zed <NotZed@HelixCode.com>
-
- * message-list.c (get_message_info): Call get_message_uid to get
- the uid, save some duplicated code.
- (folder_changed): Handle the case of a NULL changes input.
-
- * message-thread.c (thread_messages): Removed pointless
- variable/assignment 'container'.
- (thread_messages): Try and cope with duplicate message id's.
-
-2000-11-01 Not Zed <NotZed@HelixCode.com>
-
- * mail-callbacks.c (main_select_first_unread): Changed to use 0 as
- the first row to select a message.
-
- * mail-ops.h (mail_do_regenerate_messagelist): Removed from
- header. This function is no longer public since it is really an
- internal message-list function.
-
- * folder-browser.c (search_full_clicked): Call the set_search()
- function, rather than messagelist_rebuild, which is going private.
- (search_set): Same here.
- (folder_browser_clear_search): And here.
- (etable_key): Call message_list_select() instead of
- message_list_home and message_list_end. Removing some odd code
- duplication.
-
- * message-thread.c (do_thread_messages): Moved the mail lock to
- here, rather than locking for each message lookup (which is
- useless anyway). This is still not correct either, as the tree
- references folder data ... but a bit better than it was.
- (thread_messages): Removed the mail tool lock stuff, lock in
- higher functions.
-
- * message-list.h: Added a threaded indicator to the message list
- itself.
- (threaded_view): removed a mystery variable.
-
- * message-list.c (do_regenerate_messagelist): Made the code a
- little more readable.
- (build_tree): Fixed argument to be a thread_messages struct, not a
- container.
- (cleanup_regenerate_messagelist): Free changeinfo.
- (mail_do_regenerate_messagelist): If we are adding changes to a
- flat view, we dont need to goto the other thread at all, so
- process immediately.
- (message_list_toggle_threads): Clear the tree if we're changing
- the view mode.
- (message_list_toggle_threads): And reset the rowmap, since it is no
- longer valid.
- (build_tree): If we are building into an already empty tree, just
- build into that (probably irrelevant optimisation).
- (build_subtree): Build hte subtree in the same order as we got it,
- not inverted order.
- (message_list_set_threaded): New function to select the threaded
- view/flat view.
- (mail_do_regenerate_messagelist): Removed references to
- mail_config, get it from the ml->threaded var instead.
- (message_list_destroy): No longer free the key data for the
- uid_rowmap.
- (new_id_from_uid): Convert a uid string into an id string.
- (new_id_from_subject): Likewise for subject strings.
- 'id' strings replace the 'uid:' and 'subject:' stuff with
- accessors and macros and use less memory and is more readable.
- (id_is_uid): macro to check if an id string is a uid.
- (id_uid): Returns the uid part of a uid id string.
- (id_subject): Returns the uid part of a subject id string.
- (build_subtree): Use the new id functions, and dont duplicate the
- uid in the uid rowmap, but just reference it from the tree node.
- (node_equal): Use new id functions.
- (add_node_diff): And here too.
- (remove_node_diff): And here. Also remove the uid from the
- rowmap, and dont free it anymore.
- (get_message_info): And here.
- (get_message_uid): And here.
- (subtree_unread): And here.
- (ml_tree_value_at): "
- (ml_tree_set_value_at): Noted a memory leak. do_flag_messages()
- doesn't free the contents of the uid array, just the uid array
- (well that i can tell, teh code has more problems anyway).
- (ml_tree_set_value_at): And fix the id accessors.
- (save_node_state): "
- (build_flat): Use id macros/functions. Dont alloc memory for hash
- key.
- (build_flat_diff): Use id macros.
- (build_flat_diff): Remove the hash table entry before freeing its
- key data (in the node).
- (free_key): Removed. Keys are no longer alloc'd.
- (clear_tree): When we clear the tree, also clear the uid_rowmap,
- as it is no longer valid (or contains allocated keys!).
- (free_tree_ids): Renamed from nuke_uids.
- (free_ids_cb): Renamed from nuke_uids_cb.
- (free_tree_ids): Changed arg to be a ETreeModel directly.
- (ml_tree_value_at): Map id to subject using the right macro.
- (free_tree_ids): Check we have any nodes to traverse first.
- (build_flat): Insert to row -1 to append the nodes (faster).
- (remove_node_diff): Only remove the uid rowmap entry if it is
- referencing this node (i.e. the key string is the same key string,
- not just a matching key string).
- (add_node_diff): Remove the uid rowmap entry before inserting a
- new one to force the key to be replaced. This is required as the
- tree may temporarily contain duplicate messages during the
- rebuilding phase.
- (message_list_set_search): New function, set the search string.
- Only redo the search if it has changed, etc.
- (mail_do_regenerate_messagelist): Made static. There is no need
- for external code to call this.
- (message_list_set_folder): NOP if the new folder is the same.
- (message_list_set_folder): Clear the tree before rebuilding it.
- (message_list_select): Ok, this wins the award for 'most bizarre
- interface'. Changed the start row to mean the end of the list if
- we supply -1, rather than the start of the list. Also fixed the
- endpoints (it would never select message 0 if searching
- backwards).
- (idle_select_row): Changed start row to 0 from -1.
- (message_list_end): Removed.
- (message_list_home): Removed.
- (go_to_message): Removed. message_list_select can do this.
- (message_list_select): Check that direction is one of the valid
- ones, otherwise we could be thrown for loops.
-
-2000-10-31 Not Zed <NotZed@HelixCode.com>
-
- * message-list.c (node_equal): Compares an etree node with a
- message-thread node to see if they point to the same object.
- (add_node_diff): Adds a new thread node to the etree.
- (remove_node_diff): Removed an etree node, freeing any additional
- data.
- (build_subtree_diff): Takes an existing etree definition, and a
- new thread definition and makes the etree match, using as few
- operations as possible.
- (do_regenerate_messagelist): No longer free/clear the uid/rowmap
- here.
- (regenerate_messagelist_input_t): Added a tree field - are we
- building a tree view?
- (regnerate_messagelist_data_t): Added a tree field, if we built a
- tree result. Added a changes parameter, for building diff's after
- search/etc.
- (mail_do_regenerate_messagelist): Setup the tree indicator.
- (build_flat_diff): Apply a changeset to a message list.
- (build_flat): Added a changes argument, if present, use
- build_flat_diff() to build the list.
- (do_regenerate_messagelist): If we are generating a threaded view,
- build the threaded list here, rather in another separate
- invocation.
- (cleanup_regenerate_messagelist): Call build_tree directly on the
- threaded list.
- (message_list_init): Init the uid_rowmap hash table here instead
- of somewhere odd.
- (message_list_destroy): Assume uid_rowmap exists.
- (do_regenerate_messagelist): Remove the code here that is messing
- with the message list data (search/uid_rowmap). We're in a
- different thread boys ...
-
-2000-10-26 Not Zed <NotZed@HelixCode.com>
-
- * message-list.c (cleanup_regenerate_messagelist): Fixed some
- logic to make more sense (gboolean)!pointer replaced with
- (pointer != NULL).
- (build_tree): Put the tree pre/post change stuff in here, where it
- should be.
- (build_flat): Same here.
- (cleanup_regenerate_messagelist): Remove model_changed stuff here.
- (setup_regenerate_messagelist): Remove pre_change stuff here.
-
-2000-10-20 Not Zed <NotZed@HelixCode.com>
-
- * message-list.c (main_folder_changed): Perform incremental update
- of the display for flat view.
- (ml_tree_value_at): Spit out a mroe meaningful warning when we
- can't find the uid in our tree, in the folder.
-
- * message-thread.c (thread_messages): Made public.
- (thread_messages_free): Made public.
- (thread_messages): Now we also return a struct _thread_messages,
- which is passed to other functions.
- (container_free): Renamed from thread_messages_free.
- (thread_messages_free): Take a thread_messages argument.
- (thread_messages_add): New function to add a list of uid's to the
- thread list.
- (thread_messages_remove): Likewise, for removing them.
- (cleanup_thread_messages): Change for struct changes.
- (do_thread_messages): Likewise.
-
-2000-10-19 Not Zed <NotZed@HelixCode.com>
-
- * mail-tools.c (mail_tool_do_movemail): removed unused var
-
- * folder-browser.c (search_full_clicked): Fix for api changes,
- such as it can be called an api, its mroe an utter mess infact.
- (search_set): Same.
- (search_set): And here.
- (folder_browser_clear_search): And here.
-
- * message-list.c (folder_changed): Copy and forward the changeinfo
- list to the mian thread.
- (main_folder_changed): Free the changeinfo. Todo: something smart
- with this information.
- (struct regenerate_messagelist_input_s): Added a changes field.
- (mail_do_regenerate_messagelist): Added a change list argument.
- (message_list_set_folder): Fix for mail_do_regenreate_messagelist
- api.
- (message_list_toggle_threads): Same.
-
-2000-10-18 Iain Holmes <iain@helixcode.com>
-
- * mail-config-gui.c (mail_config): Make all the CLists have passive
- titles.
- (identity_dialog): Make the default button the "OK" button, and set
- the dialog to close on pressing return on the entryboxes.
-
-2000-10-17 Iain Holmes <iain@helixcode.com>
-
- * mail-config-gui.c (service_page_item_new): Disable the optionmenu
- because it is empty.
- (service_page_item_auth_fill): Enable the optionmenu as there's stuff
- in it now.
-
- * mail-callbacks.c (reply_to_sender): Call check_send_configuration
- when we have the FolderBrowser because if it is done in mail_reply
- (with passing NULL) it will only be able to continue if the mailer
- has already been configured.
- (reply_to_all): Same.
-
-2000-10-18 Not Zed <NotZed@HelixCode.com>
-
- * folder-browser.c (folder_browser_gui_init): No, we REALLY dont
- want to perform an immediate search as the keys are pressed.
-
- * mail-display.c (on_object_requested): Kill a minor warning with
- a cast.
-
- * mail-config.c: Include mising ctype.h to kill a warning.
-
- * message-thread.c (main): Fixed the test case for api changes.
-
- * message-list.c (message_list_drag_data_get): Set some flags to
- get_folder(). I dont even think this will work because
- mail_tool_get_folder doesn't handle file url's.
-
- * mail-vfolder.c (vfolder_uri_to_folder): Pass appropriate flags.
-
- * mail-ops.c (do_setup_folder): Pass appropriate flags. Hmm,
- whats the difference between setup and create. *shrug*
- (do_create_folder): Pass appropriate flags to get_folder. Needs a
- way to specify the index flag.
-
- * mail-tools.c (mail_tool_get_folder_from_urlname): Changed create
- to flags argument.
- (mail_tool_get_local_inbox_url): Add an index argument.
- (mail_tool_get_local_inbox): honour index flag.
- (mail_tool_get_inbox): Changed for api change.
- (mail_tool_uri_to_folder): Fixed calls to store_get_folder();
-
- * mail-local.c (load_metainfo): Added an indexed field to the metainfo.
- (save_metainfo): And save it too.
- (do_reconfigure_folder): Honour index flag when creating the new
- folder. Do not open the old folder with an index at all.
- (mail_local_map_uri): Add an index argument - tells if the mbox is
- indexed.
- (mail_tool_local_uri_to_folder): Create & pass flags properly.
- (#include gnome.h): Dont include all of gnome, just what we use,
- and explicity include xml-memory, so we get xmlFree().
-
-2000-10-16 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser.c (search_full_clicked): Un #if 0'd out
- (search_full): Same.
- (folder_browser_gui_init): Connect search_full and search_activate.
- (search_set): Uncomment search_full()
-
- * Makefile.am: Re-add `mail-search-dialogue.h' and
- `mail-search-dialogue.c'.
-
-2000-10-16 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-format.c (mail_generate_reply): Decode recipient names so
- that they display nicely in the To and Cc fields.
- (write_field_to_stream): Now takes another argument
- 'value_is_encoded' so that we know if we should decode that string
- before proceding onward. Since the message subject is already
- decoded before it's passed in, we don't want to decode it again
- (wasted cpu time and/or any 8bit chars will be assumed to be
- latin1 encoded and thus the decoded value will be corrupt).
-
-2000-10-16 Chris Toshok <toshok@helixcode.com>
-
- * mail-config-gui.c (service_page_get_url): only set the url->user
- field if the user string is non-NULL and not empty.
-
-2000-10-16 Not Zed <NotZed@HelixCode.com>
-
- * message-list.c (message_list_setup_etable): Uh, fixed jeff's
- wrong fix for setting the speficiation (the function changed to
- set_state(), as can be seen in the e_table-scrolled_load_state()
- call only 2 lines above).
-
-2000-10-13 Not Zed <NotZed@HelixCode.com>
-
- * message-list.c (message_list_setup_etable): oops, chose the
- wrong thing to cut out after a merge conflict.
-
-2000-10-15 Chris Toshok <toshok@helixcode.com>
-
- * message-list.c (subtree_unread): ETreePath != GNode now, use
- accessors.
- (ml_tree_value_at): same.
- (save_node_state): same.
- (save_tree_state): same.
- (nuke_uids_cb): convert to e_tree_model_node_traverse required
- type.
- (nuke_uids): g_node_traverse -> e_tree_model_node_traverse.
-
-2000-10-14 Ettore Perazzoli <ettore@helixcode.com>
-
- * evolution-mail.oafinfo: Add "evolution:shell-component-icon"
- attribute.
-
-2000-10-13 Jeffrey Stedfast <fejj@helixcode.com>
-
- * message-list.c (message_list_setup_etable): Don't free the
- service name.
-
-2000-10-12 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_fetch_mail): sync & expunge the source folder
- after filtering.
-
-2000-10-12 Jeffrey Stedfast <fejj@helixcode.com>
-
- * message-list.c (message_list_setup_etable): Create the 'spec'
- and 'extras' arguments and call e_table_scrolled_new() rather than
- set_specification as that function no longer (?) exists.
-
- Also started to add drag & drop functionality to something like
- Nautilus (but #if 0'd it out until I had time to finish it and
- till after 0.6).
-
-2000-10-12 Not Zed <NotZed@HelixCode.com>
-
- * message-list.c (message_list_setup_etable): Duh, fix the test
- for the folder name, strstr != strcmp is it.
-
-2000-10-10 Not Zed <NotZed@HelixCode.com>
-
- * message-list.c (folder_to_cachename): Removed, changed callers
- to use mail_config_folder_to_cachename instead.
-
- * mail-config.c (mail_config_folder_to_cachename): New utility
- function to get a cache name for a folder.
-
- * mail-tools.c (mail_tool_do_movemail): Changed to return the path
- to the mbox, rather than opening a folder of it.
-
- * mail-ops.c (mail_incorporate_messages): Dont bother making the
- pseudo messageinfo, filder_driver_filter_message will do it for
- us.
- (report_status): Callback to report status of filtering operation.
- (do_fetch_mail): Changed significantly - for the api changes to
- the filtering system. Also now incorporates a mailbox file
- directly, without having to import it into a camel folder first.
- (mail_incorporate_messages): Removed entirely, no longer needed.
-
- * mail-vfolder.c (vfolder_refresh): Fix for context api changes.
- (vfolder_uri_to_folder): Likewise.
-
- * folder-browser-factory.c (create_ondemand_hooks): Changed for
- api changes. Also only adds demand filters to the menu (fixed a
- small logic bug).
-
-2000-10-11 Chris Toshok <toshok@helixcode.com>
-
- * subscribe-dialog.c (folder_etree_value_at): special case for
- folders with NULL urls (which aren't selected/subscribeable).
- (unsubscribe_folder_info): can't (un)subscribe from folders with
- non-NULL urls.
- (subscribe_folder_info): same.
-
-2000-10-12 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Replace To with From except in Drafts, Outbox,
- or Sent boxes. Make Subject column pay attention to text
- attributes like bold and strikethrough.
-
-2000-10-12 Iain Holmes <iain@helixcode.com>
-
- * component-factory.c: Disable the executive summary.
-
-2000-10-11 Chris Toshok <toshok@helixcode.com>
-
- * subscribe-dialog.c (FOLDER_ETABLE_SPEC): set expansion to 0.0,
- minimum-width to 16, and resizable to false for the subscribed
- column.
- (folder_info_subscribed): new function so we can do the correct
- path munging.
- (subscribe_folder_info): only add the folder to the storage if
- there wasn't an exception subscribing it.
- (unsubscribe_folder_info): same, but unsubscribing.
- (folder_etree_value_at): use folder_info_subscribed.
- (folder_toggle_cb): same.
- (unsubscribe_folder_foreach): same.
- (subscribe_folder_foreach): same.
- (subscribe_dialog_gui_init): set the bold column on the text cell,
- and add the subscribed pixbuf.
-
-2000-10-11 Anna Marie Dirks <anna@helixcode.com>
- * mail-threads.c: Changed the password-getting dialog so that the
- text entry has focus.
-
-2000-10-11 Chris Toshok <toshok@helixcode.com>
-
- * subscribe-dialog.c (STORE_ETABLE_SPEC): change cell type to
- "string" since we're not including it in the extras.
-
-2000-10-11 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c, message-list.h, subscribe-dialog.c: Changed
- these to use the proper form for the column element.
-
-2000-10-11 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c, message-list.h, subscribe-dialog.c: Updated
- these to the new ETable style of specifications.
-
-2000-10-11 Chris Toshok <toshok@helixcode.com>
-
- * subscribe-dialog.c (subscribe_dialog_gui_init): convert to the
- new gal e-table stuff.
- (html_size_req):
- (html_new):
- (put_html): #if 0 out the html functions since description stuff
- isn't used and we don't want the warnings.
-
-2000-10-11 Chris Toshok <toshok@helixcode.com>
-
- * subscribe-dialog.c (subscribe_dialog_gui_init): remove the html
- description stuff for now.
-
-2000-10-10 Chris Toshok <toshok@helixcode.com>
-
- * subscribe-dialog.c (folder_toggle_cb): umm.. duh :) only
- subscribe if it's not subscribed, and vice versa.
- (subscribe_folder_foreach): make sure to call
- e_tree_model_node_changed.
- (unsubscribe_folder_foreach): make sure to call
- e_tree_model_node_changed.
-
-2000-10-10 Chris Toshok <toshok@helixcode.com>
-
- * mail-ops.c (setup_scan_subfolders): add a ref to input->storage
- here so that the ref/unref pattern more closely matches other
- mail-ops. also, this keeps the storage from being freed when we
- hit the unref in cleanup_scan_subfolders, which is important
- because we maintain a reference to it in the storage_hash in
- component-factory.c
-
- * subscribe-dialog.h: add storage field.
-
- * subscribe-dialog.c (subscribe_folder_info): new function,
- subscribe to a folder given it's CamelFolderInfo, and add it to
- the shell - we're generating a path from the name of the folder
- which is bad.
- (unsubscribe_folder_info): same (except we unsubscribe and remove
- from the shell).
- (storage_selected_cb): unref the currently selected storage.
- (subscribe_dialog_destroy): unref the currently selected storage.
- (subscribe_dialog_construct): sc->storage = NULL.
-
- * component-factory.c (mail_lookup_storage): new function, to look
- up a EvolutionStorage corresponding to a CamelService. we ref the
- EvolutionStorage before passing it back.
- (mail_add_new_storage): insert the storage into storages_hash if
- result is EVOLUTION_STORAGE_OK.
-
- * mail.h: add prototype for mail_lookup_storage.
-
-2000-10-10 Larry Ewing <lewing@helixcode.com>
-
- * mail-format.c (mail_generate_reply): make sure we dup the return
- value of get_reply_to or get_from when building the recipient list.
-
-2000-10-10 Iain Holmes <iain@helixcode.com>
-
- * mail-summary.c (generate_html_summary): Removed the <li> from the
- HTML.
-
-2000-10-10 Cody Russell <bratsche@gnome.org>
-
- * mail-threads.c: Added #include <errno.h>
-
-2000-10-09 Iain Holmes <iain@helixcode.com>
-
- * mail-summary.c: Removed the extra arguments to rule_context_load.
-
-2000-10-09 Chris Toshok <toshok@helixcode.com>
-
- * subscribe-dialog.c, subscribe-dialog.h: use our own etable to
- display the stores, and get them from the mail-config api. put
- #if 0'ed code in place to add/remove the folders from the shell
- when they're subscribed/unsusbcribed. also, react to double
- clicks in the folder etable by toggling subscription status.
-
-2000-10-08 Iain Holmes <iain@helixcode.com>
-
- * mail-summary.c (create_summary_view): Updated to use new icon code.
-
-2000-10-08 Iain Holmes <iain@helixcode.com>
-
- * mail-summary.c (generate_html_summary): Generic function to
- recreate the HTML of the summary. Checks all the folder summaries.
- (generate_folder_summarys): Create a summary of all the vfolders
- and the Inbox.
- (create_summary_view): Generate the folder summarys before the
- HTML.
-
-2000-10-09 Ettore Perazzoli <ettore@helixcode.com>
-
- * folder-browser.c: Don't #include "mail-search-dialogue.h" as
- it's missing from the repository.
- (search_full_clicked): Temporarily `#if 0'ed out.
- (search_full): Likewise.
- (folder_browser_gui_init): Don't connect `search_full'.
- (create_option_menu): Don't connect `search_menu_deactivate'.
- (folder_browser_gui_init): Don't connect `search_activate'.
- (search_set): Don't do `search_full()'.
- (folder_browser_gui_init): Likewise.
-
- * Makefile.am (evolution_mail_SOURCES): Remove
- `mail-search-dialogue.h' and `mail-search-dialogue.c' as NotZed
- forgot to put them into CVS.
-
-2000-10-06 Not Zed <NotZed@HelixCode.com>
-
- * mail-search-dialogue.c: New widget, full search dialogue for
- mail.
-
- * folder-browser.c (search_set): If we click on custom search, run
- the full search dialogue.
- (folder_browser_gui_init): Add a button to perform a full search.
- (search_full): Bring up the mail search dialogue asynchronously.
- (search_full_clicked): Handle search options.
- (folder_browser_destroy): Free the saved rule if there is one
- there.
- (search_options[]): Added a custom option option - brings up the
- full search dialogue.
- (search_set): Disable the search entry if we are doing a full
- search.
-
- * mail-vfolder.c (vfolder_create_storage): Yay, finally
- depeterised this stuff.
- (vfolder_uri_to_folder): Removed an irrelevant comment.
-
- * mail-callbacks.c (filter_edit): And here.
-
- * mail-ops.c (do_fetch_mail): And here too.
-
- * mail-autofilter.c (filter_gui_add_from_message): Fixed call to
- context_load.
- (filter_gui_add_for_mailing_list): And here too.
-
- * folder-browser-factory.c (create_ondemand_hooks): Remove that
- ondemand callback snot.
-
-2000-10-05 Not Zed <NotZed@HelixCode.com>
-
- * message-list.c (message_list_init_etable): Build the etable once
- we know what folder we are going to use.
- (save_header_state): Save the header spec to a cache file.
- (message_list_destroy): Save the header spec.
- (message_list_setup_etable): Setup the etable spec for this
- folder, from a saved version if one exists, or to suit the folder
- type (sent/received).
- (message_list_set_folder): Setup the etable here once we have a folder.
-
-2000-10-09 Michael Meeks <michael@helixcode.com>
-
- * message-list.c (message_list_toggle_threads): re-write.
-
- * folder-browser-factory.c (control_activate): update paths, need
- CVS HEAD bonobo, use a listener not a verb.
-
-2000-10-08 Miguel de Icaza <miguel@helixcode.com>
-
- * mail-ops.c (mail_incorporate_messages): Tag string for translation
- (do_flag_messages): ditto.
-
- * mail-threads.c (pipe_write): Repeates writes on EINTRS.
- (pipe_read): Repeats reads on EINTRS.
- (mail_operation_queue): Use pipe_write
- (mail_op_set_percentage): ditto.
- (mail_op_hide_progressbar): ditto.
- (mail_op_show_progressbar): ditto.
- (mail_op_set_message): ditto.
- (mail_op_get_password): ditto.
- (mail_op_error): ditto.
- (mail_op_forward_event): ditto.
- (mail_operations_terminate): ditto.
- (dispatch): use pipe_read.
- (dispatch): use pipe_write
- (dispatch): ditto.
-
- * mail-ops.c (mail_incorporate_messages): Only show message being
- incorporated every 2 seconds, to avoid a bunch of CORBA round trips.
- (do_transfer_messages): ditto.
- (do_forward_messages): ditto.
-
-2000-10-07 Miguel de Icaza <miguel@helixcode.com>
-
- * mail-ops.c (do_fetch_mail): Move the functionality to
- incorporate messages into mail_incorporate_messages.
- (mail_load_evolution_rule_context): New function. Move the
- functionality for loading the context rules to its own function.
-
-2000-10-06 Iain Holmes <iain@helixcode.com>
-
- * mail-summary.c: Fix the locking up of the mail by only calling
- camel functions from the camel thread, and ORBit functions from
- the GTK thread. Watch for the message-changed signal again.
-
- * component-factory.c (summary_fn, component_factory_init):
- Re-enabled it, cos I think it works again.
-
- * mail-display.h: Remove the pb_cache.
-
- * Makefile.am: Readd the mail-summary.[ch] files and add the
- evolution-services library to the link.
-
-2000-10-06 Chris Toshok <toshok@helixcode.com>
-
- * mail-ops.c (do_scan_subfolders): set the @subscribed_only
- parameter to TRUE, since the subscribe UI is the only interface
- that should show unsubscribed groups.
-
-2000-10-06 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-ops.c (do_scan_subfolders): Add missing @subscribed_only
- parameter in the call to `camel_store_get_folder_info()'. [FALSE,
- I hope that's right.]
-
-2000-10-05 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-format.c (write_field_to_stream): Decode the header before
- writing it to the header box.
-
- * mail-callbacks.c (send_receieve_mail): fetch mail before
- sending, this is a temp fix for POP-before-SMTP authentication.
-
-2000-10-05 Michael Meeks <michael@helixcode.com>
-
- * component-factory.c (summary_fn, component_factory_init):
- Disable summary stuff, it appears to be badly broken.
-
- * Makefile.am (evolution_mail_SOURCES): add mail-summary.[ch]
-
- * subscribe-dialog.c (update_pixmaps): upd.
- (set_pixmap): upd.
- (subscribe_dialog_gui_init): upd.
- remove redundant and annoying forward definitions.
-
- * folder-browser-factory.c (control_deactivate): upd.
- (control_activate_cb): upd.
- (control_activate): upd.
- (set_pixmap): upd.
- (update_pixmaps): upd.
- (register_ondemand): upd.
- (create_ondemand_hooks): upd.
-
-2000-10-04 Jeffrey Stedfast <fejj@helixcode.com>
-
- * message-list.c (address_compare): Use CamelInternetAddress
- instead of my quick hack (aka InternetAddress).
-
-2000-10-05 Iain Holmes <iain@helixcode.com>
-
- * mail-summary.c: Don't watch for the message-changed signal.
-
-2000-10-05 Iain Holmes <iain@helixcode.com>
-
- * component-factory.c (component_factory_init): Setup the summary
- factory as well.
- (summary_fn): New function to create the ExecutiveSummaryComponent.
-
- * mail-summary.c: Create the view, and update it when something
- changes.
-
-2000-10-04 Iain Holmes <iain@helixcode.com>
-
- * mail-display.c (on_object_requested): Removed the pixbuf cache
- as it would return the pixbufs in the reverse order every so often
- and generally get all confused.
-
-2000-10-04 Dan Winship <danw@helixcode.com>
-
- * folder-browser-factory.c (control_deactivate): Add back the
- "sync folder on leave" hack that got lost in the UIHandler merge.
-
-2000-10-04 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser-factory.c: Instead of UnSelectAll, we want
- InvertSelection.
-
- * mail-callbacks.c (select_all): Finished this function.
- (invert_selection): Finished. (was unselect_all - but that's not
- what we really wanted as it'd be pointless. invert_selection is a
- much more useful callback :-)
-
-2000-10-04 Chris Toshok <toshok@helixcode.com>
-
- * mail-tools.c (mail_tool_get_root_of_store): remove news specific
- check.
- (mail_tool_uri_to_folder): news: -> nntp:
-
-2000-10-04 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_filter_ondemand): Don't expunge the source
- mailbox on completion.
-
-2000-10-04 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (do_scan_subfolders): Don't try to add_folders if
- get_folder_info returned NULL.
-
-2000-10-04 Not Zed <NotZed@HelixCode.com>
-
- * message-list.c (message_list_init_header): Fix the attachment
- icon width.
- (content_is_attachment): Perform some simple tests to see if the
- message contains an attachment.
- (build_subtree): Kill a pointless warning.
-
-2000-10-04 Miguel de Icaza <miguel@helixcode.com>
-
- * mail-callbacks.c (delete_msg): Added a comment to a piece of
- code that I was trying to "fix" just to find that the strange
- behaviour here that was about to be fixed, was actually a fix to
- the problem I was trying to fix.
-
- So put the original comments from Dan, and will hope that someone
- with more knowledge about this can figure why the delete key wont
- delete messages and select the next unread message.
-
-2000-10-02 Chris Toshok <toshok@helixcode.com>
-
- * subscribe-dialog.c (subscribe_dialog_destroy): destroy our
- tree_model and remove the root node. also, release_unref our
- control and view, and unref the listener.
-
- * mail-tools.c (mail_tool_uri_to_folder): news url's contain host
- names too, now.
-
-2000-10-02 Chris Toshok <toshok@helixcode.com>
-
- * subscribe-dialog.c, subscribe-dialog.h: add a
- storage-set-view-listener, and add a little printf saying what
- storage was selected.
-
-2000-10-02 Chris Toshok <toshok@helixcode.com>
-
- * subscribe-dialog.c (subscribe_dialog_gui_init): get
- Evolution::StorageSetView interface on our storage set view
- control, and set "show_folders" to FALSE.
-
-2000-10-02 Chris Toshok <toshok@helixcode.com>
-
- * Makefile.am (INCLUDES): add -I$(top_srcdir)/widgets/misc
-
- * subscribe-dialog.c (subscribe_dialog_gui_init): change the
- window title to Manage Subscriptions, bold subscribed folders, and
- add a title bar ala the evolution shell (but without the close
- button).
-
-2000-10-02 Chris Toshok <toshok@helixcode.com>
-
- * subscribe-dialog.h: add fields for the storage set
- Bonobo_Control and Evolution_StorageSetView interfaces.
-
- * subscribe-dialog.c (subscribe_dialog_gui_init): create the uih
- as early as possible, and add the storage set view to the left
- side of the hpaned.
-
-2000-09-22 Michael Meeks <michael@helixcode.com>
-
- * folder-browser-factory.c (set_pixmap): upd.
- (control_activate): upd.
-
-2000-10-02 Dan Winship <danw@helixcode.com>
-
- * mail-config-gui.c: Remove "Port" entry from source dialog. We'll
- use "host:port" like Netscape and other programs do.
- (service_page_get_url): If host ends in ":###", use that as port.
- (service_page_set_url): If URL contains a port, append it to the
- hostname, separated by a colon.
-
-2000-10-02 Chris Toshok <toshok@helixcode.com>
-
- * Makefile.am (evolution_mail_SOURCES): subscribe-control.[ch] ->
- subscribe_dialog.[ch]
-
- * mail-callbacks.c (manage_subscriptions): subscribe_control ->
- subscribe_dialog. Also, pass the shell to subscribe_dialog_new.
-
- * mail-types.h: SubscribeControl -> SubscribeDialog.
-
- * subscribe-dialog.c, subscribe-dialog.h: rename from
- subscribe-control.[ch].
-
- * subscribe-dialog.c (subscribe_dialog_construct): pass
- Evolution_Shell in.
- (subscribe_dialog_new): takes Evolution_Shell argument now.
-
-2000-10-02 Chris Toshok <toshok@helixcode.com>
-
- * message-list.c (message_list_init_renderers): remove the 2 tree
- pixbufs, so adjust the offsets to the score pixbufs. also, pass
- NULL for the open/closed pixbufs to the tree cell renderer.
-
-2000-10-02 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (mail_do_scan_subfolders, etc): Update for
- CamelFolderInfo changes.
-
- * message-list.c (message_list_destroy): Don't save_tree_state if
- there's no folder associated with the MessageList.
-
- * folder-browser.c (folder_browser_set_uri): Only call
- mail_do_load_folder if the URI is not "".
-
-2000-10-02 Iain Holmes <iain@helixcode.com>
-
- * mail-display.[ch]: Add a cache for the pixbufs, hashed on CID,
- so that we only have to make a thumbnail once.
-
-2000-10-01 Iain Holmes <iain@helixcode.com>
-
- * mail-display.c: Generate the thumbnails on an idle function so
- that the user interface isn't locked. Checks in case the widget it
- will use to display the image isn't destroyed.
-
-2000-10-01 Iain Holmes <iain@helixcode.com>
-
- * mail-display.c (on_object_requested): If the attachment is an
- image display a thumbnail of it, instead of the generic image
- icon.
-
-2000-09-29 Miguel de Icaza <miguel@helixcode.com>
-
- * folder-browser-factory.c: Add print preview verb here.
-
- * mail-callbacks.c (do_mail_print): Handle printing here, the
- complete engine.
- (mail_print_preview_msg): new. does print previewing.
- (mail_print_msg): does printing of the message.
-
-2000-09-29 Chris Toshok <toshok@helixcode.com>
-
- * subscribe-control-factory.c, subscribe-control-factory.h: nuked.
-
- * subscribe-control.c, subscribe-control.h: lots of changes. we
- now pop up a dialog, and will have a storage set view on our left
- side, like the shell does.
-
- * mail.h: add prototype for manage_subscriptions.
-
- * mail-callbacks.c (manage_subscriptions): new function, pops up
- the subscribe dialog.
-
- * folder-browser-factory.c: add the verb for managing
- subscriptions.
-
- * Makefile.am (evolution_mail_SOURCES): add subscribe-control.[ch]
- again.
-
-2000-09-28 Chris Toshok <toshok@helixcode.com>
-
- * subscribe-control.h (subscribe_search): added prototype.
-
- * subscribe-control.c (subscribe_search): new function.
-
- * subscribe-control-factory.c (make_folder_search_widget): new
- function, to add search widget to toolbar.
- (control_activate): create the search widget and add it to the
- toolbar.
-
-2000-09-28 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_send_queue): Messages should be appended to Sent
- as Seen.
- (do_send_mail): Same.
-
-2000-09-28 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am: Don't compile `subscribe-control' for now. It
- needs to be converted to the new UI handler code in Bonobo; it
- doesn't compile right now.
-
-2000-09-27 Chris Toshok <toshok@helixcode.com>
-
- * subscribe-control.c (subscribe_refresh_list): new function.
-
- * subscribe-control.h (subscribe_refresh_list): new prototype.
-
- * subscribe-control-factory.c (update_pixmaps): add RefreshList
- pixmap. also, add it to the verbs list.
-
-2000-09-27 Chris Toshok <toshok@helixcode.com>
-
- * mail-types.h: add SubscribeControl typedef.
-
- * Makefile.am (evolution_mail_SOURCES): add the subscribe stuff.
-
- * subscribe-control-factory.h * subscribe-control-factory.c *
- subscribe-control.c: * subscribe-control.h: Mostly mocked up
- subscribe ui.
-
-2000-09-27 Jeffrey Stedfast <fejj@helixcode.com>
- Note: We need a configuration option to specify whether to log
- filtering actions or not.
-
- * mail-ops.c (do_filter_ondemand): Updated to pass a log file
- pointer to filter_driver_run.
- (do_fetch_mail): Same.
- (mail_do_fetch_mail): Fixed a compiler warning.
-
-2000-09-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-callbacks.c (composer_postpone_cb): Fix it so that "send
- later" will still mark a message as being replied, forwarded,
- whatever. Closes bug #568 on bugzilla.
-
-2000-09-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_filter_ondemand): If the message has been
- deleted, don't try filtering it - skip to the next message. Fixes
- bugzilla bug #639.
-
-2000-09-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser-factory.c: Shuffling (un)select all menu items to
- the Edit menu.
-
-2000-09-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser-factory.c: Added new menu items
-
- * mail-callbacks.c (mark_as_seen): New callback to mark all
- selected messages as Seen.
- (mark_as_unseen): New callback to mark all selected messages as
- Unseen.
- (select_all): New callback to select all messages (not yet
- finished)
- (unselect_all): New callback to unselect all messages (not yet
- finished)
-
-2000-09-25 Not Zed <NotZed@HelixCode.com>
-
- * message-list.c (folder_to_cachename): Function to convert a
- folder name/path to a filename for per-folder data.
- (save_tree_state):
- (load_tree_state):
- (free_tree_state): For loading/saving the state of the expansion
- of nodes in the tree.
- (message_list_destroy): Save the tree state when done.
- (save_node_state): Changed logic, we save when the node should be
- closed on startup. i.e. any new nodes with children automatically
- default to being open.
- (subtree_unread): Check for unread messages in a subtree. So
- false messages (for tree roots) are properly displayed.
-
-2000-09-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * message-list.c (address_compare): Updated to use Nat's
- ENameWestern parser.
-
- * Makefile.am: link against e-util/ename/libename.la
-
-2000-09-25 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c: CamelException is not for compile-time errors.
- Replace lots of argument checks in setup_ functions with
- g_return_if_fails in the public functions. Also remove some
- prototypes that weren't needed because they were for static
- functions that are defined before they're used.
-
-2000-09-23 Michael Meeks <michael@helixcode.com>
-
- * folder-browser-factory.c (set_pixmap): upd.
- (control_activate): upd.
-
-2000-09-23 Ettore Perazzoli <ettore@helixcode.com>
-
- * message-list.c (internet_address_new_from_string): Skip spaces
- at the beginning of the string first before doing anything else.
- The code that follows doesn't like the first character of the
- string to be a space.
-
-2000-09-22 Jeffrey Stedfast <fejj@helixcode.com>
-
- * message-list.c (address_compare): New comparison function for
- email addresses.
- (subject_compare): New comparison function for message subjects.
- (message_list_init_header): Updated to use the new compare funcs.
-
-2000-09-21 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-format.c (mail_generate_reply): Fixed some memory
- leakage. Call free_recipients() so we don't leak memory.
-
-2000-09-19 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_scan_subfolders): Use the folder's full_name so
- recursive directory structures display correctly ;-)
-
-2000-09-19 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (do_scan_subfolders): Update for CamelFolder changes
- (subfolder_names -> subfolder_info).
-
-2000-09-19 Dan Winship <danw@helixcode.com>
-
- * mail-callbacks.c (create_msg_composer, compose_msg, send_to_url,
- mail_reply, forward_msg): * mail-format.c (mail_generate_reply): *
- mail-ops.c (cleanup_edit_messages):
-
- * mail-view.c (view_forward_msg): Deal with NULL composer.
-
-2000-09-18 Dan Winship <danw@helixcode.com>
-
- * main.c (main): Call gnome_vfs_init() since the composer now does
- file operations (to get the MIME type of attachments).
-
-2000-09-18 Jeffrey Stedfast <fejj@helixcode.com>
-
- * message-list.c: Removed COL_ONLINE_STATUS because we don't want
- that. Renamed COL_PRIORITY to COL_SCORE and set it up to sort-of
- work, I'm not really sure which renderer I should use.
-
-2000-09-18 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added $(EXTRA_GNOME_CFLAGS) and
- $(EXTRA_GNOME_LIBS). Removed unneeded libraries.
-
- * component-factory.c, folder-browser-factory.c, folder-browser.c,
- mail-callbacks.c, mail-config-gui.c, mail-display.c,
- mail-display.h, main.c, message-list.c, message-list.h: Fixed the
- #include lines to deal properly with gal.
-
-2000-09-16 Michael Meeks <michael@helixcode.com>
-
- * Makefile.am (INCLUDES): add datadir
-
- * folder-browser-factory.c (control_activate): use it.
-
-2000-09-15 Dan Winship <danw@helixcode.com>
-
- * mail-callbacks.c (transfer_msg): Revert **Temp fix** from below
- since the relevant shell bug has been fixed now.
-
- * mail-ops.c (do_fetch_mail): Fix the sense of the "keep on
- server" check so we're not doing this backwards. Don't
- get_message_flags, because POP doesn't support it and it's
- pointless anyway since we're setting deleted, not toggling it.
- call camel_folder_sync with expunge=TRUE so that the deletions are
- actually recorded.
-
-2000-09-15 Dan Winship <danw@helixcode.com>
-
- This bug was so much fun to fix the first time that I decided to
- fix it again.
-
- 2000-07-11 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (real_send_mail): Set the post_send_data flag
- rather than toggling it. (Maybe we'll need more control
- over it later, but for now, the only flag we set is
- "replied", and we want that set, not toggled.)
-
-2000-09-14 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-callbacks.c (transfer_msg): **Temp fix** Send "" as the
- default folder to select as anything else seems to cause a
- segfault in shell's user_get_folder().
- (check_configured): A spoon full of 'line wrapping' makes the
- medicine go down, the medicine go dowwwwn...
-
-2000-09-14 Iain Holmes <terrorist@gegl.org>
-
- * mail-callbacks.c (check_configured): Ask if you want to
- configure the mail client if it isn't configured already.
- (check_send_configuration): Remove the error box if mail isn't
- configured.
- (send_queued_mail): Same.
-
-2000-09-14 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (setup_append_mail): camel_folder_append is perfectly
- happy to take a NULL info.
-
-2000-09-14 Michael Meeks <michael@helixcode.com>
-
- * folder-browser-factory.c: move fn to bonobo.
- (set_pixmap): update.
- (control_deactivate): add bonobo_ui_handler_unset_container
-
-2000-09-14 Christopher James Lahey <clahey@helixcode.com>
-
- * mail-config-gui.h: Changed the include here because it caused
- make distcheck to fail for me. I changed it from <Evolution.h> to
- "shell/Evolution.h". This seems to have fixed things.
-
-2000-09-14 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_fetch_mail): Only use the cache if the user plans
- to keep_on_server.
-
-2000-09-14 Michael Meeks <michael@helixcode.com>
-
- * folder-browser-factory.c (control_deactivate): kill
- warning. (control_activate): set threaded toggle state,
- add freeze / thaw.
- (set_pixmap, fill_toolbar, update_pixmaps): update.
-
-2000-09-13 Christopher James Lahey <clahey@helixcode.com>
-
- * folder-browser-factory.c: Fixed a warning (Missing include
- file.)
-
-2000-09-12 Ettore Perazzoli <ettore@helixcode.com>
-
- ($(EVOLUTION_MAIL_CORBA_GENERATED)): Add space after `-I'.
-
-2000-09-12 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am: Remove `ui.xml' stuff.
-
-2000-09-12 Dan Winship <danw@helixcode.com>
-
- * mail-local-storage.c (mail_local_storage_startup): set
- folder_tree before adding the listener, since that will eventually
- invoke callbacks that will look at it.
-
- * folder-browser-factory.c (control_deactivate): sync the folder
- on deactivate.
-
-2000-09-12 Ettore Perazzoli <ettore@helixcode.com>
-
- * message-list.c (on_right_click): Also display the name of the
- mailing list in the "Filter on Mailing List" item for additional
- Coolness factor.
-
- * mail-autofilter.c (filter_gui_add_for_mailing_list): Create the
- rule with `filter_filter_new()' so that it also has an action
- part.
-
- * mail-mlist-magic.c (get_header): Use the right header name to
- retrieve the header.
-
-2000-09-12 Ettore Perazzoli <ettore@helixcode.com>
-
- * message-list.c (on_right_click): Grey out the mailing list
- filter item if `mail_mlist_magic_detect_list()' returns NULL on
- this message [i.e., if we cannot figure out a mailing list for
- this message].
- (filter_mlist): Good boys don't use F words.
-
- * mail-mlist-magic.c (check_sender): Work safely if
- `header_name_return' or `header_value_return' are NULL.
- (check_x_been_there): Likewise.
- (check_delivered_to): Likewise.
- (check_x_mailing_list): Likewise.
- (check_x_loop): Likewise.
- (get_header): Use the right header name to retrieve the header.
-
- * message-list.c (on_right_click): Mark strings for translation.
-
-2000-09-12 Ettore Perazzoli <ettore@helixcode.com>
-
- * folder-browser-factory.c: Use the latest, shiny, amazing TigerT
- art for the toolbar.
-
- * component-factory.c: #include "mail-local-storage.h".
- (owner_set_cb): Removed unused variable.
-
- * message-list.c (filter_sender): Made static.
- (filter_recipient): Likewise.
- (filter_subject): Likewise.
- (vfolder_recipient): Likewise.
- (vfolder_sender): Likewise.
- (vfolder_subject): Likewise.
-
- * mail.h (vfolder_subject): Removed prototype [WTF was this doing
- here?!?!].
- (vfolder_sender): Likewise.
- (vfolder_recipient): Likewise.
- (filter_subject): Likewise.
- (filter_sender): Likewise.
- (filter_recipient): Likewise.
-
- * message-list.c: Added a new "Filter on mailing list" menu item.
- (filter_mlist): Callback for this menu item. Use
- `filter_gui_add_for_mailing_list' to pop up the filter dialog with
- the appropriate rule.
-
- * mail-autofilter.c (filter_gui_add_for_mailing_list): New.
-
- * message-thread.c (dump_tree): Removed unused variable.
-
- * mail-mlist-magic.c: New.
- * mail-mlist-magic.h: New.
-
- * mail-autofilter.c (rule_match_recipients): Mark strings for
- translation.
- (rule_from_message): Likewise.
- (filter_gui_add_from_message): Likewise.
-
-2000-09-12 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_fetch_mail): Was trying to unhook an event from
- the wrong folder - oops.
-
-2000-09-12 Not Zed <NotZed@HelixCode.com>
-
- * message-thread.c: Reverted to version 1.15.
- (remove_node): Ok, if a node has a parent, remove it from the
- parent list, otherwise remove it from the (supplied) root list.
- (group_root_set): When we merge children, free the lost node.
- (thread_messages_free): Remove the return, run as is.
- (prune_empty): Plugged another small leak.
-
-2000-09-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-callbacks.c (run_filter_ondemand): Updated to use the new
- mail_do_filter_ondemand.
-
- * mail-ops.c (do_fetch_mail): Update to use the new
- filter_driver_run args.
- (do_filter_ondemand): Updated to use the new filter_driver_run
- args.
- (mail_do_filter_ondemand): Take a FilterContext as a argument
- instead of a driver as we need to destroy the filter inside the
- do_filter_ondemand function and things'd get messy.
-
-2000-09-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_fetch_mail): Don't have the filter driver
- self_destruct.
-
-2000-09-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_fetch_mail): If we're fetching from an mbox
- formatted file then we need to do some special-casing.
-
-2000-09-11 Ettore Perazzoli <ettore@helixcode.com>
-
- * component-factory.c (owner_set_cb): Call
- `mail_local_storage_startup()' to set up handling of the local
- storage.
-
- * mail-local-storage.c: New.
- * mail-local-storage.h: New.
-
-2000-09-11 Christopher James Lahey <clahey@helixcode.com>
-
- * mail-display.c: Fixed some warnings.
-
-2000-09-11 Dan Winship <danw@helixcode.com>
-
- * mail-display.c, mail-format.c: Another big rewrite of this
- stuff. Now all (well, most) attachments get a small icon with a
- description and a (non-obvious) right-click pop-up menu with
- options to save, open in an external program, or show/hide inline.
-
- TODO: antialias the icon, add more options to the pop-up for
- certain MIME types, add an icon to the headers, fix PGP to work
- like everything else, fix message/external-body to work again,
- add some icon caching action, etc, etc.
-
-2000-09-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_fetch_mail): Use the CamelUIDCache so that we
- only retrieve *new* messages and also send notes to the status bar
- telling it which message we're downloading so that Ettore can
- sleep at night ;-)
-
-2000-09-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_fetch_mail): Updated to not send hook/unhook data
- to filter_driver_run as it no longer takes those args.
- (do_filter_ondemand): Same. Also wrap filtering in freeze/thaw to
- prevent signals from being queued up
-
-2000-09-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_fetch_mail): Freeze the default folder before
- filtering and thaw it afterward to prevent a ton of
- "folder_changed" signals from being queued.
-
-2000-09-08 Christopher James Lahey <clahey@helixcode.com>
-
- * folder-browser.c, mail-config-gui.c, mail-ops.c: Fixed some
- warnings.
-
- * message-list.c: Added base ETableModel functions.
-
-2000-09-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_fetch_mail): Updated to pass a CamelMessageInfo
- to filter_driver_run
- (do_filter_ondemand): Same.
-
-2000-09-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_filter_ondemand): Updated to check the boolean
- return code from filter_driver_run to find out whether or not the
- message was filtered so that it can decide whether or not to
- delete the message from the source folder or not.
-
-2000-09-07 Jesse Pavel <jpavel@helixcode.com>
-
- * mail-format.c (mail_generate_reply) Changed the behavior of
- Reply-to-All so that the sender's address does not appear in
- the cc: list.
-
-2000-09-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_fetch_mail): Updated to pass an exception to
- filter_driver_run and also check the exception before deleting the
- message from the source folder.
- (do_filter_ondemand): Updated to pass an exception to
- filter_driver_run
-
-2000-09-07 Dan Winship <danw@helixcode.com>
-
- * session.c (session_init): Pass a storage dir to
- camel_session_new now.
-
- * main.c (main): Can't call session_init here now, because it
- requires evolution_dir to be set.
-
- * component-factory.c (owner_set_cb): call session_init here.
-
- * mail-ops.c (do_fetch_mail): Fix previous fix. (Free the uids,
- just do it correctly.)
-
-2000-09-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (do_fetch_mail): Don't free uids, let the camel
- folder do that when it gets finalized
-
-2000-09-06 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (mail_do_filter_ondemand): New async function to
- filter messages on demand.
- (do_fetch_mail): Updated to filter 1 message at a time using the
- new filter-driver code
-
- * mail-callbacks.c (composer_postpone_cb): Send NULL as the
- message info.
- (run_filter_ondemand): Use mail_do_filter_ondemand instead of
- filter_driver_run
-
- * mail-tools.c: Removed mail_tool_filter_contents_into and
- mail_tool_fetch_mail_into_searchable as they have now been
- deprecated.
-
-2000-09-06 Dan Winship <danw@helixcode.com>
-
- * message-list.c (clear_tree): set the data to NULL for the tree
- root, so nuke_uids won't try to free anything.
-
-2000-09-06 Ettore Perazzoli <ettore@helixcode.com>
-
- * folder-browser.c (folder_browser_new): @shell made const.
- `CORBA_Object_duplicate()' it before storing it.
- (folder_browser_destroy): Free the shell object with
- `CORBA_Object_release()', not `CORBA_free()'.
-
- * folder-browser-factory.c (folder_browser_factory_new_control):
- @shell made const.
-
-2000-09-05 Dan Winship <danw@helixcode.com>
-
- * mail-display.c (make_safe_filename):
- * mail-format.c (handle_mystery):
- * mail-identify.c (mail_identify_mime_part):
- camel_mime_part_get_filename now deals with both
- Content-Disposition and Content-Type.
-
-2000-09-05 Peter Williams <peterw@helixcode.com>
-
- * mail-ops.c (cleanup_load_folder): Check for NULL folder.
- (mail_do_setup_folder): Copy the 'name' parameter so that
- we can free it.
-
- * message-list.c (nuke_uids): Depth '-1' means "unlimited", not 0.
-
-2000-09-05 Dan Winship <danw@helixcode.com>
-
- * component-factory.c (owner_set_cb): Re-rename "Sent".
-
- * folder-browser.c (fb_resize_cb): Remove the "+ 90" here since it
- seems to break things for me, and it's not commented anyway and
- there's no excuse for adding 90 to a number with no explanation.
-
-2000-09-05 Peter Williams <peterw@helixcode.com>
-
- * folder-browser.c (folder_browser_destroy): Don't free the shell;
- it's not ours.
-
-2000-09-05 Dan Winship <danw@helixcode.com>
-
- * mail-tools.c (mail_tool_move_folder_contents): only call
- camel_folder_get_message_info if the folder has
- summary_capability. Don't hack up a fake CamelMessageInfo:
- append_message will take NULL.
-
- * mail-ops.c: Replace mail_do_setup_draftbox,
- mail_do_setup_outbox, and mail_do_setup_sentbox with
- mail_do_setup_folder.
- (do_send_mail, do_send_queue): s/sentbox_folder/sent_folder/
-
- * component-factory.c (owner_set_cb): Use mail_do_setup_folder,
- rename sentbox_folder to sent_folder, and call
- mail_operation_wait_for_finish after the setup_folder calls in
- case anything needs to use the _folder variables.
-
-2000-09-04 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-format.c (mail_generate_reply): Applied Jesse's patch that
- will append a signature to the replied message text
-
- * folder-browser-factory.c: Changed "Send & Receieve" back to "Get
- Mail" temporarily so that the toolbar buttons don't all get
- stretched to some weird proportion
-
-2000-09-03 JP Rosevear <jpr@helixcode.com>
-
- * mail-config.c (mail_config_add_news): Copy the passed in item
- before adding
- (mail_config_add_source): ditto
- (mail_config_add_identity): ditto
-
- * mail-config-gui.c (mail_config): We don't actually need a notebook
- pointer.
- (identities_edit_clicked): Don't explicitly destroy, we are using
- gtk_clist_set_data_full now
- (sources_edit_clicked): ditto
- (news_edit_clicked): ditto
- (mail_config): Use gtk_clist_set_row_data_full to kill leaks
-
-2000-09-03 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser-factory.c: Change the "Get Mail" toolbar button
- to become "Send & Receieve"
-
- * mail-callbacks.c (send_queued_mail): New callback function for
- sending queued mail
- (send_receieve_mail): New callback for Send & Receieve that
- basically just calls send_queued_mail and then fetch_mail
-
- * mail-ops.c (cleanup_send_mail): Mod to be able to handle a NULL
- composer window
- (setup_send_mail): Modified to handle a NULL composer widget
- (mail_do_send_queue): New convenience async function to send all
- messages in a folder (aka all messages in a queue)
-
-2000-09-02 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-tools.c (mail_tool_move_folder_contents): Since POP3
- doesn't implement get_message_info, we need to check for info to
- be NULL. In this case, we need to make our own info structure to
- pass to append_message and then remember to free it
- afterward. Should we even bother with get_message_info? And if so,
- should we then implement get_message_info for POP3?
-
-2000-09-02 Ettore Perazzoli <ettore@helixcode.com>
-
- * folder-browser.c (etable_key): Make the `Home' key to move to
- the beginning of the list and `End' to the end of it, using
- `message_list_home()' and `message_list_end()'.
-
- * message-list.c (message_list_home): New.
- (message_list_end): New.
-
- * folder-browser.c (folder_browser_new): Don't ref the shell here.
- (folder_browser_destroy): Don't unref the shell. Instead,
- `CORBA_free()' the object reference.
-
- * folder-browser-factory.c (control_activate): Bind "Open in New
- Window" to `Ctrl-O'.
-
-2000-09-02 Lauris Kaplinski <lauris@helixcode.com>
-
- * mail-config-gui.c: Use e_utf8 wrappers
-
- * main.c (main): Do e_unicode_init, so we are not confusing
- libunicode
-
-2000-09-01 Christopher James Lahey <clahey@helixcode.com>
-
- * folder-browser.c: Removed a warning.
-
-2000-09-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-callbacks.c (compose_msg): Attach a callback to the
- postpone signal
- (send_to_url): Same
- (mail_reply): Same
- (forward_msg): Same
- (composer_postpone_cb): Callback function for the postpone signal
-
- * mail-ops.c (mail_do_setup_outbox): New convenience function to
- load the Outbox folder
- (mail_do_setup_sentbox): Same, but for Sentbox.
- (do_send_mail): Now saves messages in Sentbox if sent successfully
- (mail_do_append_mail): New convenience async function for
- appending messages to a folder
-
- * component-factory.c: Added outbox_folder and sent_folder
- (owner_set_cb): Call our new convenience functions to load Outbox
- and Sentbox
-
-2000-09-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-ops.c (cleanup_scan_subfolders): Update for the extra arg
- needed by `evolution_storage_new_folder()'.
- * mail-vfolder.c (vfolder_refresh): Likewise.
-
-2000-08-31 Peter Williams <peterw@helixcode.com>
-
- * folder-browser.c (folder_browser_new): Don't ref the shell:
- causes a race upon exit.
- (folder_browser_destroy): Don't unref it.
-
- * mail-config-gui.c (service_page_item_new): Add a checkbutton
- "use default port" to make life simple.
- (service_page_get_url): Honor use_default_port.
- (service_page_set_url): Set use_default_port based on the input
- URL.
- (toggle_port): New function, sets the sensitivity of the
- port entry based on "use default port"
-
- (config_do_query_authtypes): Make this asynchronous, as it
- may involve connecting to a server.
- (service_page_detect): Call the async auth querier.
- (service_page_item_new): Put the authentication stuff in if
- the url_flags have URL_ALLOW_AUTH. Call the async auth querier
- to get the info.
-
-2000-08-30 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-view.c (mail_view_create): Make the HTML widget grab the
- focus.
-
-2000-08-30 Peter Williams <peterw@helixcode.com>
-
- * mail-config-gui.c (do_test_service): Explicitly connect to
- the service again.
-
- * component-factory.c (mail_load_storages): Now that
- camel_service_get_provider exists, use it to make this function
- much simpler.
-
-2000-08-29 Peter Williams <peterw@helixcode.com>
-
- * folder-browser.c (folder_browser_new): Ref the Evolution_Shell.
- Is this correct, or is it a circular reference?
-
-2000-08-29 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (mail_do_send_mail): Update this and related
- functions to no longer take a From address. (The composer deals
- with it itself now.)
- (do_send_mail): Add the Evolution version back to the X-Mailer
- header (this change got lost in the thread migration).
-
- * mail-callbacks.c (composer_send_cb): Don't re-fetch the From
- address. It's set by the composer now. Don't free the
- post_send_data from here.
- (mail_reply): Attach to the composer's destroy signal to free the
- psd. (The current code would free it more than once if an error
- occurred while trying to send the first time.)
-
-2000-08-28 Peter Williams <peterw@helixcode.com>
-
- * mail-config-gui.c (mail_config_apply_clicked): Add new news sources,
- not only stores.
-
-2000-08-28 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-callbacks.c (composer_send_cb): Free the from address when
- we're done with it. Also, e_msg_composer_hdrs_get_from returns
- alloc'd memory so don't strdup it.
-
-2000-08-28 Peter Williams <peterw@helixcode.com>
-
- * mail-ops.c (do_transfer_messages): Add status messages.
- (do_flag_messages): Same.
- (do_scan_subfolders): Same.
- (do_forward_messages): Same.
- (do_view_messages): Same.
-
-2000-08-28 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-view.c (mail_view_create): Use `gnome_app_set_toolbar()'
- the easy way instead of doing things manually with `GnomeDock' and
- `gnome_app_add_toolbar()'.
- (MINIMUM_WIDTH): New #define.
- (MINIMUM_HEIGHT): New #define.
- (view_size_allocate_cb): New, callback for the "size_allocate"
- signal of the mail view. It saves the last allocation in a static
- `last_allocation' variable.
- (mail_view_create): Connect it.
- (set_default_size): New function. Set the default width/height to
- the last allocation width/height; if the width/height is less than
- the `MINIUM_WIDTH' or `MINIMUM_HEIGHT', use that value instead.
-
- * mail-tools.c (mail_tool_move_folder_contents): Show `i + 1', not
- `i', so that we correctlly start counting from one instead of zero.
-
-2000-08-28 Peter Williams <peterw@helixcode.com>
-
- * *.c: s,mail_dialog_run,gnome_dialog_run,g.
-
- * main.c (main): Since only the main thread is dealing with GTK+,
- free the GDK threads mutex and never worry about locking again.
-
-2000-08-28 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-crypto.c (mail_crypto_openpgp_encrypt): Fix to prevent
- possible buffer overflows and a logic fix.
-
-2000-08-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-crypto.c (mail_crypto_openpgp_clearsign): New crypto
- function to clearsign plaintext
-
-2000-08-27 Ariel Rios <ariel@arcavia.com>
-
- * folder-browser-factory.c (control_activate): Added bonobo menu
- handler for mark_all_deleted function.
-
- * mail.h: (mark_all_deleted): Added prototype.
-
- * mail-callbacks.c (mark_all_deleted): Added callback for marking
- all displayed messages in a folder as deleted.
-
-2000-08-26 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-view.c (mail_view_create): Use
- `gtk_window_set_default_size' on the toplevel instead of
- `gtk_widget_set_usize()', and make the default size smaller.
-
-2000-08-25 Christopher James Lahey <clahey@helixcode.com>
-
- * mail-crypto.c: Fixed an uninitialized variable.
-
-2000-08-26 JP Rosevear <jpr@helixcode.com>
-
- * evolution-mail.gnorba: Kill
-
- * Makefile.am: Remove gnorba related stuff
-
-2000-08-25 Peter Williams <peterw@helixcode.com>
-
- * mail-config-gui.c (service_page_item_new): If the service wants
- a host, also let the user specify a port.
- (MailDialogServicePageItem): Add members for the port GtkEntry and
- the default port.
- (service_page_get_url): Translate the port in the entry back into
- the CamelURL.
- (service_page_set_url): Read in the port from the URL or use
- the default.
-
-2000-08-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-crypto.c (mail_crypto_openpgp_encrypt): Implemented PGP 2.x
- encryption. We only need to get the passphrase if we plan to sign
- the text, otherwise we don't need to worry about getting the
- passphrase.
-
-2000-08-24 Lauris Kaplinski <lauris@helixcode.com>
-
- * folder-browser.c: Use e_utf8 wrappers
-
- * mail-config-gui.c: Use e_utf8 wrappers
-
-2000-08-24 Peter Williams <peterw@helixcode.com>
-
- * folder-browser-factory.c (control_activate): Add all the
- functions from message-list.c's popup menu to the main
- menu as well
-
- * message-list.c (vfolder_subject): These functions become
- public.
-
- * mail-callbacks.c (mark_all_seen): Don't call camel_folder_get_uids
- here. IMAP, for example, will try to communicate with the IMAP
- server during that call.
-
- * mail-ops.c (cleanup_fetch_mail): Tell the user
- which URL has no new mail, as they may be checking
- more than one source.
- (mail_do_flag_all_messages): New function. Flags all of
- the messages in a folder. Something of a hack. This merely
- extends the flag_messages operation; it doesn't implement
- a new one.
- (do_flag_messages et al): Fetch the uids if we need to;
- use camel_folder_free_uids if necessary, etc.
-
- * mail-tools.c (mail_tool_move_folder_contents): Add
- messages to tell the user what's going on.
-
-2000-08-24 Christopher James Lahey <clahey@helixcode.com>
-
- * folder-browser-factory.c: Fixed some warnings in the uihandler
- code.
-
-2000-08-24 Peter Williams <peterw@helixcode.com>
-
- * component-factory.c (mail_load_storages): New function.
- Loads a list of URI's as mail storages, and inserts them
- into the shell's folder tree if appropriate (really, only
- puts them into the folder tree.)
- (mail_add_new_storage): Insert a storage into the folder
- tree. Not always appropriate (eg, /var/spool/mail/user is
- a storage that shouldn't be in the folder tree.)
- (create_view): Generate the Evolution_Shell and pass it
- to folder_browser_factor_new_control so that its member
- 'shell' can be set.
- (owner_set_cb): Instead of create_news_storage and
- creating the imap storages, load the news storages and
- mail storages via mail_load_storages().
-
- * folder-browser-factory.c (control_activate): Change to
- use providers_config again instead of mail_config. Pass
- the folderbrowser so that the config code knows where
- to insert the new storages if any are created. Pass
- forget_passwords the folderbriwser, too, for good luck.
- (folder_browser_factory_new_control): Take a new parameter,
- the Evolution_Shell that we belong to. The field in
- FolderBrowser has been there but was never getting set by
- anything, and we need this to be able to insert new storages
- into the shell's folder list.
-
- * folder-browser.c (folder_browser_new): Accept the
- new Evolution_Shell parameter. Set it. (Should we
- ref it or something?)
-
- * mail-config-gui.c (struct MailDruidDialog): Store an
- Evolution_Shell. With this we can insert the stores into
- the shell's folder list.
- (struct MailDialog): Same.
- (service_page_item_changed): Close a leak.
- (identity_dialog): Unswitch the Add/Edit identity titles.
- (news_dialog): Analogous to above.
- (mail_druid_finish): Add the new mail source to the shell
- view.
- (mail_config_druid): Take a new Evolution_Shell parameter
- for later use.
- (mail_config_apply_clicked): Add all the mail sources to
- the shell view.
- (mail_config): Take a new Evolution_Shell parameter.
-
- * mail-callbacks.c (check_configured): Accept a FolderBrowser
- so that we know where to put the new storages if any are
- created. Almost all the callbacks are passed a FB * anyway
- so this isn't a big deal.
- (check_send_configuration): Make sure that we're configured
- enough to be able to send mail. composer_send_cb() used to
- do this, but it would need a FolderBrowser *, and there are
- too many entry points to composer_send_cb to make this
- feasible.
- (fetch_mail): Pass the extra parm to check_configured().
- (free_psd): Move so that composer_send_cb can call this
- directly.
- (composer_send_cb): Don't check for proper configuration
- here -- it is the caller's responsiblity to call
- check_send_configuration(). Call free_psd() directly.
- (compose_msg): Call check_send_configuration().
- (send_to_url): Same. This is called from mail-display.c,
- though, and cannot reasonably be passed a FB. So: we can't
- start up the config dialog directly; the user must do it
- manually. Oh well.
- (mail_reply): Same as above.
- (forward_msg): Same as compose_msg().
- (edit_msg): Same as above.
- (providers_config): Reenable so that we can pass mail_config
- its FolderBrowser.
-
- * mail-display.c (write_data_to_file): Use the much more
- straightforward run_and_close to retrieve the user's answer,
- instead of the reply callback stuff.
-
- * mail-threads.c (mail_dialog_run): New wrapper for
- gnome_dialog_run that will take care of the GDK lock correctly.
- Far far more complicated than it should be.
- (mail_dialog_run_and_close): Analogous to above.
- (read_msg): Set inside_read_msg and unset it for the benefit
- of the two above functions. Don't bracket ourselves in
- GDK_THREADS_ENTER/_LEAVE anymore.
- (mail_operation_queue): Use mail_dialog_run_and_close.
- (show_error): As above.
- (get_password): As above.
-
- * mail-display.c (write_data_to_file): This has the only
- exception to the rule that "use mail_dialog_run(_and_close)
- instead of the gnome equivalent always." Not quite sure why
- it doesn't work here (the file selection window?).
-
- * mail-config-gui.c (identity_dialog): Change to
- mail_dialog_run_and_close.
- (source_dialog): Same as above.
- (news_dialog): Same as above.
- (cleanup_test_service): Same as above.
- (mail_config): Change to mail_dialog_run().
-
- * session.c (mail_request_dialog): Change to
- mail_dialog_run_and_close.
-
- * mail-tools.c (mail_tool_uri_to_folder_noex): As above.
-
- * mail-ops.c (cleanup_fetch_mail): As above.
-
- * mail-local.c (local_reconfigure_folder): As above.
-
- * mail-callbacks.c (check_send_configuration): As above.
- (ask_confirm_for_empty_subject): As above.
- (edit_msg): As above.
- (filter_edit): As above.
-
-2000-08-23 Dan Winship <danw@helixcode.com>
-
- * folder-browser-factory.c (control_activate): Reformat a bit,
- make "Folder" appear before "Message", fill in the Message menu
- more.
-
-2000-08-23 Peter Williams <peterw@helixcode.com>
-
- * mail-ops.c (describe_fetch_mail): Don't use the camel calls
- to describe the operation.
-
-2000-08-22 Peter Williams <peterw@helixcode.com>
-
- * mail-tools.c (mail_tool_get_folder_from_urlname): Don't connect
- to the service explicitly.
- (mail_tool_send_via_transport): Don't connect to the transport
- explicitly.
- (mail_tool_get_root_of_store): Same.
-
- * mail-config-gui.c (do_test_service): Just try camel_session_get_service,
- which will now connect for us.
-
- * message-thread.h: Add a note about *next being the first member
- of struct _container... if it isn't, everything goes Very Wrong.
-
- * message-thread.c (free_container): Extra debug print.
- (remove_node): Handle the case of empty containers holding the child
- that we're interested in.
- (thread_messages_free): Extra debug print.
-
-2000-08-20 Jeremy Wise <jwise@pathwaynet.com>
- * folder-browser.c: (fb_resize_cb) Added function to monitor resize
- of the e_paned in the main view.
-
-2000-08-18 Peter Williams <peterw@helixcode.com>
-
- * mail-tools.c (mail_tool_filter_contents_into): Fix a race. filter_driver_run is an
- async operation so it won't even be started by the time we sync the folders and check
- for the movemailbox to be emtpy. Thus the empty check for the movemail would fail
- 99% of the time.
-
- * mail-callbacks.c (run_filter_ondemand): Pass he new argument to the ever-mushrooming
- filter_driver_run.
-
-2000-08-17 Peter Williams <peterw@helixcode.com>
-
- * folder-browser-factory.c (control_activate): Fix menu item names.
- (register_ondemand): Put the ondemand hooks into the new folder menu.
-
-2000-08-17 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-vfolder.c (vfolder_gui_add_rule): Use stock OK/Cancel
- buttons and add i18n support.
-
- * folder-browser-factory.c (control_activate): Changed menu item
- label from "Mark all messages seen" to "Mark All Messages as
- Read". Changed capitalization of some other menu items.
- (control_activate): Put the message- and folder- related menu
- items in new "Message" and "Folder" subtrees which are created in
- the `<Component Placeholder>' item created by the shell.
- (control_deactivate): Updated accordingly.
- (control_activate): Put the filter and vfolder editors, the mail
- configuration and the "forget password" command into the
- "settings" menu.
- (control_deactivate): Updated accordingly.
-
- * mail-config-gui.c (transport_page_new): Add translation mark.
- (service_page_new): Show the menu items before appending them.
- (service_page_item_new): Use `GTK_FILL' for the "Detect supported
- types..." button.
-
- * local-config.glade: Change the apply button into an ok button.
-
-2000-08-17 Peter Williams <peterw@helixcode.com>
-
- Implement filtering on demand.
-
- * folder-browser-factory.c (register_ondemand): New function. Callback
- to put the filter-on-demand filters into the bonobo UIH;
- (create_ondemand_hooks): New function. Read in our on-demand filters
- and hook them into the UI.
- (remove_ondemand_hooks): New function. Remove the hooks when done with
- them.
- (control_activate): Call create_ondemand_hooks()
- (control_deactivate): Call remove_ondemand_hooks();
-
- * mail-callbacks.c (run_filter_ondemand): New function. Callback
- for running a filter on demand.
- (filter_edit): Pass NULLs as the new arguments to rule_context_load.
-
- * mail.h: Prototype run_filter_ondemand();
-
- * folder-browser.c (oc_destroy): New function. Iterator to destroy
- an fb_ondemand_closure.
- (folder_browser_destroy): Free the data associated with the ondemand
- menu items.
- (my_folder_browser_init): Clear the filter_ variables.
-
- * folder-browser.h: Two new members of FolderBrowser: filter_menu_paths,
- a list of fb_ondemand_closures so that the menu items can be freed and
- removed; and filter_context, a permanently loaded FilterContext for
- running the ondemand filters. Prototype the new fb_ondemand_closure
- structure.
-
- * mail-autofilter.c (filter_gui_add_from_message): Pass NULLs as the
- new parameters to rule_context_load (we don't need to hook up ondemand
- menu items...)
-
- * mail-tools.c (mail_tool_filter_get_folder_func): Rename from
- get_folder_func() and make public so mail-callbacks.c:run_filter_ondemand()
- can use it too.
- (mail_tool_filter_contents_into): Use the new name of get_folder_func.
- Pass NULLs as the extra arguments to rule_context_load. Pass the
- extra source type to filter_driver_run (only use INCOMING).
-
- * mail-tools.h: Publicly prototype mail_tool_filter_get_folder_func()
-
- * mail-vfolder.c (vfolder_create_storage): Pass NULLs as the extra
- arguments to rule_context_load.
-
- * message-list.c (message_list_init): Free our strdup'd uids when
- the table model gets destroyed.
- (nuke_uids): New function. Walk the tree nodes to free the uids.
- (nuke_uids_cb): New callback for nuke_uids();
-
-
-2000-08-16 Richard Hult <rhult@hem.passagen.se>
-
- * mail-ops.c (cleanup_display_message): Use a configurable timeout.
-
- * mail-config.c (mail_config_set_mark_as_seen_timeout): New function
- for the settable mark-as-seen timeout.
- (mail_config_mark_as_seen_timeout): Likewise.
- (mail_config_write): Write the timeout setting.
- (config_read): Read timeout setting.
-
- * mail-config-gui.c (mail_config): Add option for the settable
- mark-as-seen timeout.
- (mail_config_apply_clicked): Likewise.
- (timeout_changed): New function for the timeout setting.
-
-2000-08-16 Peter Williams <peterw@helixcode.com>
-
- * message-thread.c (walk_containers): More (default disabled)
- mem debugging here. Fix the big leaks.
-
- * mail-format.c (get_url_for_icon): Copy the url_path so that
- it can't get freed under us.
-
- * mail-threads.c (mail_operation_queue): Fix a leak.
-
- * mail-ops.c (mail_do_display_message): Fix another leak.
-
- * message-list.c (message_list_destroy): Remove the seen_id timeout
- if necessary.
-
- * mail-local.c (mail_tool_local_uri_to_folder): Fix a leak.
-
- * session.c (auth_callback): Fix a leak. Almost seems as if
- I've been using Purify...
-
-
-2000-08-15 Peter Williams <peterw@helixcode.com>
-
- * message-thread.c (alloc_container): Add support for debugging
- container allocations -- currently disabled. Make sure that
- the g_strfreev works.
-
- * message-list.c (main_message_changed): Address bug #496 --
- possible race when forwading a message_changed event.
-
- * mail-threads.c (dispatch): Close the dispatch thread's half of
- pipes when about to exit.
- (mail_operations_terminate): Close the main thread's half of the
- pipes when about to exit.
- (all): Add i18n support.
-
- * mail-tools.c (all): Add i18n support.
-
- * mail-ops.c (transfer_messages): Generalize move_messages into
- transfer_messages so that we can copy too.
- (all): Add i18n supprt where appropriate.
-
- * mail-ops.h: Prototype the new mail_do_transfer_messages.
-
- * folder-browser-factory.c: Add a UI hook for copy_msg.
-
- * mail-callbacks.c (transfer_msg): Generalize move so that it supports
- copy as well, and add a callback 'copy_msg'.
-
- * message-list.c (on_right_click): Add a right-click hook for Copy Message.
-
- * session.c (mail_request_dialog): Don't deadlock when in main thread.
-
-2000-08-14 Peter Williams <peterw@helixcode.com>
-
- * mail-threads.c (show_error): Fix the error dialogs.
- (read_msg): Re-enable them.
-
- * mail-ops.c (do_scan_subfolders): Silence a compile warning.
-
-2000-08-13 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-crypto.c (mail_crypto_openpgp_encrypt): Added support for
- encrypting via PGP 5.0
-
-2000-08-13 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-ops.c (cleanup_create_folder): Release the listener object
- with `CORBA_Object_release()', not `CORBA_free()'.
-
-2000-08-13 Ettore Perazzoli <ettore@helixcode.com>
-
- * main.c (main): Set the signal handlers for `SIGSEGV' and
- `SIGBUS' to the default ones.
-
-2000-08-13 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config.c (mail_config_write): Set config->configured to
- TRUE
-
-2000-08-13 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-config-gui.c (mail_config_druid): Don't
- `GDK_THREADS_ENTER()'/`GDK_THREADS_LEAVE()'.
-
-2000-08-13 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-threads.c (update_active_views): Just iterate through all
- the controls, not just the active ones.
-
- * folder-browser-factory.c: Don't keep track of active controls.
- Rather, keep track of all of them.
- (folder_browser_factory_get_active_control_list): Removed.
- (folder_browser_factory_get_control_list): New.
-
-2000-08-13 Dan Winship <danw@helixcode.com>
-
- * Makefile.am (evolution_mail_SOURCES): add mail-local.h
-
-2000-08-13 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-threads.c (read_msg): For now, don't do anything about
- errors.
-
-2000-08-13 Dan Winship <danw@helixcode.com>
-
- * mail-format.c (add_url): Fix some freed-memory references
-
- * mail-threads.c (get_password): Don't free the prompt. It
- doesn't belong to you.
-
-2000-08-13 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-ops.c (mail_do_create_folder): Duplicate the listener
- object.
- (cleanup_create_folder): Free the listener.
-
-2000-08-13 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-threads.c (get_password): Don't wrap the gnome_dialog_run
- in GDK_THREADS_ENTER/LEAVE
-
-2000-08-13 Ettore Perazzoli <ettore@helixcode.com>
-
- * folder-browser-factory.c (control_destroy_cb): Remove the
- control from the active control list, if it's there.
-
- * mail.h (folder_browser_factory_new_control): Removed prototype.
- (folder_browser_factory_init): Removed prototype.
-
- * folder-browser-factory.h: New.
-
- * folder-browser-factory.c: New static variable `active_controls',
- list of the currently active controls.
- (control_activate): Add the control to it.
- (control_deactivate): Remove the control from it.
- (folder_browser_factory_get_active_control_list): New.
-
- * mail-threads.c (mail_operations_get_status): New function.
-
- * folder-browser.c (folder_browser_gui_init): Add i18n support for
- the labels.
-
- [The following is actually from a patch by Peter Williams
- <peterw@helixcode.com>.]
-
- * Removed types `PERCENTAGE', `HIDE_PBAR', `SHOW_PBAR'. New
- struct `block_info_s'. Removed all the code to create and destroy
- the progress window.
-
-2000-08-13 Jeffrey Stedfast <fejj@helixcode.com>
-
- * component-factory.c (create_news_storage): Updated to reflect
- changes to mail_do_scan_subfolders
- (create_imap_storage): Same.
-
- * mail-ops.c (mail_do_scan_subfolders): No longer takes an
- add_INBOX argument
-
-2000-08-13 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (do_scan_subfolders): Lose a reference to the store
- on purpose. To be fixed later.
-
-2000-08-12 Dan Winship <danw@helixcode.com>
-
- * component-factory.c (create_imap_storage): Take the source as a
- command-line argument rather than fetching it from mail-config.
- (owner_set_cb): Call create_imap_storage on each configured IMAP
- store.
-
- * mail-format.c (decode_pgp): Redo this so that the lock icon
- remains active after a failed decryption so you can click on it
- and try again.
- (try_inline_pgp, handle_multipart_encrypted): Put a border around
- the decrypted data.
-
- * message-list.c (cleanup_regenerate_messagelist): Don't clear the
- tree here. If two "folder_changed"s arrive in close succession,
- then one possible ordering of events is
- cleanup_regenerate_messagelist, cleanup_regenerate_messagelist,
- cleanup_thread_messages, cleanup_thread_messages. Which would
- result in the message list being filled in twice without being
- cleared in between. So don't clear it until the rebuilding
- function itself is called.
- (clear_tree): New function to empty out the ETreeModel in the
- message list.
- (build_tree): Change to simpler interface. Call clear_tree.
- (build_subtree): Does most of the work of the old build_tree
- (build_flat): Remove unused arg. Call clear_tree.
-
- * message-thread.c (cleanup_thread_messages): Update for
- build_tree interface change.
-
- * mail-ops.c (do_send_mail): Don't leak the transport.
-
- * mail-tools.c (mail_tool_get_folder_from_urlname): Don't ref the
- store returned from camel_session_get_store. It's already reffed.
- (mail_tool_get_root_of_store): Ditto.
- (mail_tool_send_via_transport): Remove some commented-out code and
- fix it to not leave the transport connected if sending fails.
-
- * mail-callbacks.c (delete_msg): Toggling a flag is an
- "instantaneous" operation, so if we're only doing one, just do it
- and return, rather than queueing it for the other thread. This
- makes the "Delete" key work correctly (move to the next message)
- again.
-
- * mail-identify.c: Remove workaround for gnome-vfs 0.2 bug.
-
- * mail-format.c (lookup_handler): Remove workaround for function
- introduced between gnome-vfs 0.2 and 0.3, since we depend on 0.3
- now.
-
-2000-08-12 Michael Meeks <michael@helixcode.com>
-
- * main.c (main): kill using_oaf assertion.
-
-2000-08-11 Peter Williams <peterw@helixcode.com>
-
- * Makefile.am: Make it so that test-mail links
-
-2000-08-11 JP Rosevear <jpr@helixcode.com>
-
- * folder-browser-factory.c (control_activate): Move menu items
- that affect a single message together, ditto with ones that
- affect multiple messages, put a separator in.
-
-2000-08-11 Christopher James Lahey <clahey@helixcode.com>
-
- * mail-format.c, mail-tools.h, message-list.c: Fixed a warning.
-
-2000-08-11 Dan Winship <danw@helixcode.com>
-
- * mail-display.c, mail-format.c: Redo this again. Get rid of
- struct mail_format_data and move most of that info into
- MailDisplay itself, and pass the MailDisplay around. Add a GData**
- to MailDisplay, and put the urls hash table into that. Also add
- the ability to redisplay the currently-displayed message (with the
- same GData**), and add a "show_pgp" datum to it that controls
- whether or not to decrypt PGP messages, and redo the PGP stuff
- (again) to take that into account. Now you don't get the annoying
- PGP password dialog box without any warning.
-
-2000-08-11 Peter Williams <peterw@helixcode.com>
-
- * mail-config-gui.c (service_acceptable): Make verify-service
- an asynchronous operation.
-
- * Makefile.am (noinst_PROGRAMS): Don't build test-thread
- while mail-threads.c is in flux.
-
- * mail-threads.c (mail_operation_queue): Make the error
- and query dialogs modal.
-
- * mail-local.c (update_progress): Don't use the
- temporarily-disabled mail_op_set_percentage().
-
-2000-08-11 Chris Toshok <toshok@helixcode.com>
-
- * mail-config.c (mail_config_get_default_news): use config->news
- instead of config->sources.
-
-2000-08-11 Dan Winship <danw@helixcode.com>
-
- * mail-format.c (destroy_part): Update this for CamelObject
- (try_inline_pgp): Deal with decrypting here rather than trying to
- pawn the data off to handle_multipart_encrypted, since it most
- likely won't be correct (won't have the proper MIME headers inside
- the encrypted part).
- (handle_multipart_encrypted): Add code from Nathan Thompson-Amato
- to re-MIME-parse the decrypted data after decrypting.
-
- * mail-crypto.c (mail_crypto_openpgp_{de,en}crypt): Get the
- password here rather than having it passed in. Remove some dead
- code.
-
- * session.c (mail_request_dialog): Allow this to work in either a
- sync or an async context.
-
-2000-08-11 Peter Williams <peterw@helixcode.com>
-
- * mail-tools.c (mail_tool_fetch_mail_into_searchable): Don't
- do the imap check here... it's a silly place.
-
- * mail-ops.c (do_fetch_mail): Do the imap check here.
-
-2000-08-11 JP Rosevear <jpr@helixcode.com>
-
- * mail-config-gui.c (service_page_new): Work around
- gtk option menu bug.
- (service_page_item_auth_fill): ditto
-
-2000-08-11 Peter Williams <peterw@helixcode.com>
-
- * mail-threads.c (read_msg): Fix the new FORWARD_EVENT handler
- (didn't free msg, didn't write newline in the debug)
-
- * mail-local.c (local_reconfigure_folder): Make the dialog
- modal.
-
- * mail-callbacks.c (select_first_unread): Fix some warnings.
-
- * mail-threads.c (mail_op_forward_event): New function that
- writes a FORWARD_EVENT signal to the compipe, to allow Camel
- events to be handled in the main thread.
- (read_msg): Handle a FORWARD_EVENT.
-
- * mail-callbacks.c (select_first_unread): Forward the
- event into the main thread to prevent the GTK calls in the
- dispatcher thread.
- (main_select_first_unread): New name of old select_first_unread.
-
- * message-list.c (folder_changed): Same as above.
- (main_folder_changed): Same as above.
- (message_changed): Same as above.
- (main_message_changed): Same as above.
-
- * mail-format.c (free_byte_array): Note about using
- mail_op_forward_event. (cmm_destroyed): Same.
-
-2000-08-11 Dan Winship <danw@helixcode.com>
-
- * message-list.c (message_list_select): If the caller passes "-1"
- for the model row, translate that to view row 0.
-
- * message-list.c (idle_select_row):
- * mail-callbacks.c (select_first_unread): Use new
- message_list_select kludge^H^H^H^H^H^Hfeature
-
-2000-08-11 JP Rosevear <jpr@helixcode.com>
-
- * mail-config-gui.c (source_dialog): Allow the window
- to be growable
-
- * mail-config.c: use void in empty declarations
-
-2000-08-11 Peter Williams <peterw@helixcode.com>
-
- * mail-config.c (mail_config_get_news): Change () to (void)
- if a function takes no arguments.
-
- * mail-config.h: Prototype mail_config_get_{sources,news}x
-
-2000-08-11 JP Rosevear <jpr@helixcode.com>
-
- * mail-config-gui.c (identity_dialog): iddialog, not sdialog
- (news_edit_clicked): Kill leftover c-p crud
-
-2000-08-11 JP Rosevear <jpr@helixcode.com>
-
- * mail-config-gui.c (news_edit_clicked): Check nrow, not srow.
-
-2000-08-11 JP Rosevear <jpr@helixcode.com>
-
- * mail-config-gui.c (service_acceptable): Use camel_object_unref
- instead of gtk_object_unref
- (mail_druid_finish): Use new config accessors
- (mail_config_druid): No need to call config functions
- (news_add_clicked): Increments maxnrow, not maxsrow
- (mail_config_apply_clicked): Use new config accessors
- (mail_config): ditto
-
- * component-factory.c (create_imap_storage): Use new
- config accessors
- (create_news_storage): ditto
-
- * mail-config.glade: Set news clist name correctly
-
- * mail-config.c (config_read): Rename from mail_config_read and
- made private - no one should need to do a read manually.
- (mail_config_set_send_html): New accessor
- (mail_config_add_identity): ditto
- (mail_config_get_sources): ditto
- (mail_config_add_source): ditto
- (mail_config_get_default_news): ditto
- (mail_config_get_news): ditto
- (mail_config_add_news): ditto
-
- * mail-config.h: Prototype new accessors. Config struct is now
- in mail-config.c and hidden from the world.
-
-2000-08-11 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (describe_fetch_mail): Use camel_service_get_name
- rather than showing the URL to the user.
-
-2000-08-11 Peter Williams <peterw@helixcode.com>
-
- * mail-ops.c (do_refile_messages): Freeze the folders while moving.
- (do_flag_messages): Same.
-
- * mail-threads.c (get_password_clicked): Fix the case when the
- user /doesn't/ use escape to cancel the dialog :-/
- (show_error_clicked): Same.
-
-2000-08-11 Dan Winship <danw@helixcode.com>
-
- * mail-tools.c (mail_tool_get_folder_name): Add a function to
- return a useful name for a folder (not just "mbox" or "mh" for
- any local folder.)
-
- * mail-ops.c: Use mail_tool_get_folder_name rather than
- folder->full_name when printing folder names.
-
-2000-08-11 Not Zed <NotZed@HelixCode.com>
-
- * mail-tools.c (mail_tool_get_local_inbox_url): Properly handle
- different local file formats. The folder isn't always mbox.
- (mail_tool_do_movemail): Movemail always uses an mbox format
- however.
- (mail_tool_get_local_movemail_url): What is the mbox url, it is
- always the same type, mbox.
- (mail_tool_fetch_mail_into_searchable): Same here.
-
- * mail-local.c (mail_local_map_uri): Map a local uri to the real uri.
-
-2000-08-10 Christopher James Lahey <clahey@helixcode.com>
-
- * folder-browser-factory.c, message-list.c, message-thread.c,
- session.c: Fixed some warnings.
-
-2000-08-10 Dan Winship <danw@helixcode.com>
-
- * session.c (session_init): Don't call e_setup_base_dir. It was
- wrong and it doesn't exist any more.
-
- * component-factory.c (owner_set_cb): Update for changed
- prototype, and record the evolution_homedir. Move call to
- mail_config_init here from session.c so it happens after
- evolution_dir is initialized.
-
- * mail.h: define "extern char *evolution_dir;" (formerly in
- e-util/e-setup.h)
-
- * component-factory.c, mail-callbacks.c, mail-config-gui.c,
- mail-config.c, mail-display.c, mail-format.c, mail-ops.c,
- mail-tools.c, session.c: Remove "e-util/e-setup.h" include.
-
-2000-08-10 Peter Williams <peterw@helixcode.com>
-
- * test-thread.c (queue_ops): Use mail_operations_terminate() to
- close the other thread nicely.
-
- * mail-threads.c (get_password_deleted): Handle the "close" event
- as a cancel.
- (show_error): Same.
-
-2000-08-10 Dan Winship <danw@helixcode.com>
-
- * mail-tools.c (mail_tool_get_folder_from_urlname): Add a
- "gboolean create" argument to pass to camel_store_get_folder.
-
- * mail-ops.c (do_create_folder, do_setup_draftbox):
- * mail-local.c (mail_tool_local_uri_to_folder):
- * mail-vfolder.c (vfolder_uri_to_folder): Add create flag to
- mail_tool_get_folder_from_urlname calls.
-
-2000-08-10 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-callbacks.c (composer_send_cb): Fix compile warning by
- casting the object to a CamelObject
-
-2000-08-10 Peter Williams <peterw@helixcode.com>
-
- * mail-tools.c (mail_tool_filter_contents_into): Delete the source
- folder if told to and if it's empty
- (mail_tool_get_local_movemail_path): New function.
-
-2000-08-10 Dan Winship <danw@helixcode.com>
-
- * mail-callbacks.c (reply_to_all): Fix a bug in the async changes.
- (This was identical to reply_to_sender.)
-
-2000-08-10 Not Zed <NotZed@HelixCode.com>
-
- * mail-local.c (do_local_reconfigure_folder): Update for
- append_message api change.
-
- * message-list.c (message_list_regenerate): Change for search api
- change.
- (ml_tree_value_at): Add a colour column, based on the colour
- assigned in the summary.
- (message_list_init_renderers): Init colour column.
-
-2000-08-09 Peter Williams <peterw@helixcode.com>
-
- * mail-display.c (part_for_url): Remove a gtk_object_get_data
-
-2000-08-09 Cody Russell <bratsche@gnome.org>
-
- * folder-browser-factory.c, mail-view.c: Make the toolbars
- honor the user's gnomecc settings for detachable toolbars.
-
-2000-08-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (composer_send_cb): Get the from address set in the
- composer, if that fails ONLY THEN get the default from mail config
-
- * mail-config.c (mail_config_get_identities): New convenience
- function for getting a list of the configured identities
-
-2000-08-09 Dan Winship <danw@helixcode.com>
-
- * mail-display.c (on_object_requested): Support controls as well
- as embeddables.
-
-2000-08-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-view.c (mail_view_create): Changed to only take a
- FolderBrowser argument
-
- * mail-ops.c (real_view_msg): Create a new FolderBrowser for each
- message being opened in a new window. Also set the
- message_list->cursor_uid and mail_display->current_message to the
- appropriate values.
- (real_view_msg): Updated to reflect changes in the mail_view_create
-
- * message-list.c (on_right_click): Nicify a little, add in a menu
- separator between VFolder and Filter stuff.
-
- * mail-ops.c (real_view_msg): Set the UID of the message that is
- being displayed
-
-2000-08-09 Ettore Perazzoli <ettore@helixcode.com>
-
- * folder-browser-factory.c (control_activate): Use
- `GNOME_STOCK_MENU_*' things instead of `GNOME_STOCK_PIXMAP_*'
- things, that are too big and look bad.
-
-2000-08-09 Peter Williams <peterw@helixcode.com>
-
- * mail-view.c (mail_view_create): Save the top window so that on_close
- can find it [with set_data].
- (on_close): Recover the top window.
-
- * mail-threads.c (read_msg): Destroy the window instead of hiding it.
-
-2000-08-09 Not Zed <NotZed@HelixCode.com>
-
- * mail-autofilter.c (filter_gui_add_from_message): Helper function
- to add with confirm.
- (rule_match_recipients): Dont set real name if its empty for the
- filter name.
- (rule_match_subject): was cutting ] off mailing list names.
-
- * message-list.c (on_right_click): Added menu to install
- vfolders/filters from message.
-
-2000-08-09 Not Zed <NotZed@HelixCode.com>
-
- * mail-autofilter.c: New file to hold auto filter/vfolder stuff.
-
-2000-08-09 Christopher James Lahey <clahey@helixcode.com>
-
- * mail-display.c, mail-format.c, mail-ops.c: Fixed some warnings.
-
- * message-list.c: Fix the call to e_popup_menu_run to match the
- new signature.
-
-2000-08-09 Ettore Perazzoli <ettore@helixcode.com>
-
- * folder-browser-factory.c (control_activate): Create a "print
- message" menu item.
-
-2000-08-09 Jeffrey Stedfast <fejj@helixcode.com>
-
- * message-list.c (message_list_init): Attached a double_click
- signal handler
- (on_double_click): Our lovely new double_click callback. Will
- display the current selected message in a new window
-
-2000-08-08 Jeremy Wise <jwise@pathwaynet.com>
- * mail-config.[ch], folder-browser.c: Added configuration work to
- save the size of the vpaned widget. It will be functional when the
- e_paned widget emits a "resized" signal
-
-2000-08-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config.h: Added void as an argument to functions not
- needing any parameters to avoid compile warnings.
-
-2000-08-08 Jeremy Wise <jwise@pathwaynet.com>
- * mail-config.[ch], main.c, folder-browser-factory.c: State of the
- threaded list toggle is now saved via gnome_config
-
-2000-08-08 Dan Winship <danw@helixcode.com>
-
- * mail-config-gui.c (service_page_item_new): Attach a signal
- handler to call the "changed" function when the user clicks the
- "keep on server" checkbox.
-
-2000-08-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (view_msg): New convenience function with params of a
- normal Gtk callback function. We also now create a new
- FolderBrowser object so that the message-view window isn't tied to
- the display in the main window
- (view_message): Now calls view_msg (this function is a bonobo
- callback and can't be used with gtk widgets)
- (edit_msg): Same idea as view_msg()
- (edit_message): Again, same as view_message()
-
- * message-list.c (on_right_click): Callback for creating an
- e-popup-menu
- (message_list_init): Added a right_click event to trigger a pop-up
- menu to be displayed
-
-2000-08-08 Dan Winship <danw@helixcode.com>
-
- * mail-config-gui.c: Add "Don't delete messages from server"
- button to remote SOURCEs that aren't STORAGEs (ie, POP).
- (provider_list): Only list SOURCEs. (ie, not mh)
-
- * mail-config.c: Save/load "keep_on_server" flag.
-
- * mail-ops.c (fetch_remote_mail): New function, split out of
- real_fetch_mail. Deals with copying mail from a remote server into
- a temporary mbox, possibly using a CamelUIDCache to leave the
- messages on the server.
-
- * mail-crypto.c, mail-format.c, message-thread.c: Fix some
- compiler warnings.
-
- * mail-format.c (mail_generate_reply): Fix up format of addresses.
- (write_headers): Use CamelAddress functions to simplify this.
-
-2000-08-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-view.c: Lets get rid of the last separator in the toolbar
- until we add n/p
-
-2000-08-08 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-threads.c (queue_window_delete_event_cb): Callback for
- "delete_event", just doing nothing.
- (create_queue_window): Connect it to the "delete_event" signal of
- the progress dialog.
-
-2000-08-08 Peter Williams <peterw@helixcode.com>
-
- * mail-threads.c (remove_next_pending): Sanity check for
- job queue, which seems to have some issues.
- (read_msg): Make sure that the next operation isn't started
- before the last one is cleaned up.
-
- * mail-callbacks.c (fetch_mail): Fix erroneous free.
-
- * mail-config-gui.c (mail_config_druid): Wrap the gtk_main call.
-
- * mail-ops.c (do_flag_messages): Allow specification of whether
- to set the flags unconditionally or toggle their current state.
-
- * message-list.c (ml_tree_set_value_at): Toggle the seen status;
- don't set it unconditionally.
-
- * mail-callbacks.c (delete_msg): Toggle the deletion status;
- don't set it unconditionally.
-
- * mail-tools.c (mail_tool_do_movemail): Fix for undeclared tmpfd.
-
- * mail-local.c (local_reconfigure_folder): Big rewrite; make into
- an asynchronous operation. Use some mail tools to make life easy.
-
-2000-08-08 Dan Winship <danw@helixcode.com>
-
- * main.c (main): Move mail_config_init after session_init, since
- it depends on evolution_dir being set.
-
-2000-08-08 JP Rosevear <jpr@helixcode.com>
-
- * mail-ops.c (check_configured): Use config accessors
- (fetch_mail): ditto
- (composer_send_cb): ditto
- (create_msg_composer): ditto
-
- * mail-config-gui.h: Update API
-
- * mail-config.h: Update API
-
- * mail-config.c: Add accessor functions
- (mail_config_is_configured): accessor function
- (mail_config_get_default_identity): ditto
- (mail_config_get_default_source): ditto
- (mail_config_get_transport): ditto
- (mail_config_send_html): ditto
- (identity_copy): Make public
- (identity_destroy): ditto
- (identity_destroy_each): ditto
- (service_copy): ditto
- (service_destroy): ditto
- (service_destroy_each): ditto
- (mail_config_init): Rename from init_config and make public
- (mail_config_clear): Rename from clear_config and make public
- (mail_config_read): Rename from read_config and make public
- (mail_config_write): Reanme from write_config and make public
-
- * main.c (main): Call mail_config_init.
-
- * mail.h: Include mail-config-gui.h
-
- * mail-config-gui.c: Move config gui stuff here.
- (source_dialog): Kill memory leak from debug leftovers.
- Make sure returned source is NULL by default
-
-2000-08-07 Not Zed <NotZed@HelixCode.com>
-
- * mail-local.c (local_reconfigure_folder): Redone to show a
- dialogue first, and show progress of whats happening as its done.
-
- * Makefile.am (glade_DATA): Added local-config.glade, for mailbox
- reconfig dialogue.
-
-2000-08-04 Not Zed <NotZed@HelixCode.com>
-
- * folder-browser.c (mail_uri_to_folder): Use local_uri_to_folder()
- for local uri's (file://).
-
- * mail-local.c (local_uri_to_folder): Handle looking up folder
- storage type before opening the store/folder.
- (local_reconfigure_folder): Function to reconfigure the format of
- a local mailbox into another storage format.
-
- * Makefile.am (evolution_mail_SOURCES): Added mail-local.c and
- missing mail-vfolder.h.
-
-2000-08-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * Makefile.am: Added mail-view.c
-
- * folder-browser-factory.c (control_activate): Adda menu item for
- viewing the message
-
- * mail-view.c: New file containing methods for viewing messages in
- separate windows
-
- * mail-ops.c (view_message): New callback for viewing messages in
- a new window.
-
-2000-08-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * component-factory.c (real_create_generic_storage): New function
- to replace real_create_imap_storage and real_create_news_storage
- (create_imap_storage): Updated.
- (create_news_storage): Updated.
-
-2000-08-07 Peter Williams <peterw@helixcode.com>
-
- * mail-ops.c (cleanup_edit_messages): New operation: edit_messages
- For continuing draft messages.
- (attach_messages): Fix accidental 0 datasize.
- (do_setup_draftbox): New operation: setup_draftbox. Soooo hacky.
-
- * mail-callbacks.c: Move fejj's edit message to the async home.
-
- * component-factory.c (owner_set_cb): Use mail_do_setup_draftbox.
-
-
-2000-08-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-display.c:
- * component-factory.c: s/strncasecmp/g_strncasecmp
-
- * mail-format.c (write_headers): Get rid of kludge around subject
- beginning with spaces.
- (mail_generate_reply): Get rid of kludge around subject beginning
- with spaces and also use g_strncasecmp instead of strncasecmp for
- portability
-
- * mail-ops.c (forward_msg): Get rid of kludges around subject
- beginning with spaces.
-
-2000-08-07 Dan Winship <danw@helixcode.com>
-
- * message-list.c (message_list_select): Clarify that the input row
- is a model row, and swap it to a view row when finding the
- next/previous row.
- (idle_select_row): Select view row 0, not model row 0.
-
- * mail-ops.c (select_first_unread): Start from view row 0, not
- model row 0.
-
-2000-08-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-format.c (mail_get_message_body): Renamed from reply_body()
- so other functions can use it
- (mail_generate_reply): Updated to reflect function name changes
-
- * mail-ops.c (real_edit_msg): Attach a callback to the send signal
-
-2000-08-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser-factory.c (control_activate): New menu item under
- Actions to allow editing of messages.
-
- * mail-ops.c (edit_message): New function for editing messages.
-
- * component-factory.c (owner_set_cb): Create a global reference to
- the Drafts mbox folder for the Composer to use
-
-2000-08-06 JP Rosevear <jpr@helixcode.com>
-
- * mail-config.c (ndialog_page_undone): Desensitize ok button
- (sdialog_page_undone): ditto
- (iddialog_page_undone): ditto
- (news_page_new): Typo - news, not mail
- (transport_page_new): Typo - transport, not source
- (identity_dialog): Set undone callback
- (source_dialog): ditto
- (news_dialog): ditto
- (mail_druid_identity_undone): Desensitize next button and
- mark done flag as false
- (mail_druid_source_undone): ditto
- (mail_druid_transport_undone): ditto
- (mail_druid_identity_done): Mark done flag as true
- (mail_druid_source_done): ditto
- (mail_druid_transport_done): ditto
- (mail_druid_prepare): Use done flag to set next button
- sensitivity, fixes #467
-
-2000-08-06 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-crypto.c (mail_crypto_openpgp_encrypt): Added support for
- encrypting with GnuPG. Support for PGP5 and PGP2 are still in
- progress.
-
-2000-08-05 Dan Winship <danw@helixcode.com>
-
- * folder-browser-factory.c (control_activate): Remove bonobo 0.15
- vs 0.15-and-a-half ifdef, since we require post-0.16 now.
-
-2000-08-04 Dan Winship <danw@helixcode.com>
-
- * mail-threads.c (mail_operation_wait_for_finish): Don't use
- "while (gtk_events_pending ()) gtk_main_iteration ();" inside
- another tight loop, because it makes the thread spin rather than
- blocking and waiting like it should.
-
-2000-08-04 Peter Williams <peterw@helixcode.com>
-
- * message-thread.c (do_thread_messages): Uninitialized variable
- fix.
-
- * mail-threads.c (read_msg): Small leak fix.
-
- * component-factory.c (owner_unset_cb): Use mail_operations_
- terminate() instead of wait_for_finish().
-
- * mail-threads.c (mail_operation_queue): Centralize the clur
- handling functions; fix a race condition where the dispatcher
- would overwrite the closure before the main thread could
- free the old one.
- (mail_operations_terminate): New function, wait for ops to
- finished and kill the other thread.
- (dispatch): changes to die when terminate is called (abort
- on NULL spec).
-
- * mail-ops.c (cleanup_display_message): Fix improper handling
- of displaying a NULL message (which means clear the message
- display).
-
-2000-08-04 Ettore Perazzoli <ettore@helixcode.com>
-
- * message-list.c (message_list_regenerate): Free the GPtrArray
- correctly instead of using `g_strfreev()'.
-
-2000-08-04 Michael Meeks <michael@helixcode.com>
-
- * folder-browser-factory.c (control_activate): release the ui_handler
- after set_container.
-
-2000-08-03 Michael Meeks <michael@helixcode.com>
-
- * mail-config.c (identity_page_new): only whack the sig in if the
- file exists.
-
- * component-factory.c (factory_fn): count running instances,
- attach destroy signal (factory_destroy): add.
-
- * main.c (main): pass orb around.
-
-2000-08-03 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (composer_send_cb): Yay, no more compiler warnings
-
- * mail-config.c: set config = NULL
- (provider_list) Eek! Initialize news to NULL! Also, use
- g_slist_prepend() for "performance" gains ;-)
- (init_config): Set the config member data to NULL just to be on
- the safe side
- (clear_config): Don't bother freeing slist data if the slist is
- NULL
-
-2000-08-03 Peter Williams <peterw@helixcode.com>
-
- * mail-ops.c (op_forward_messages): Use the new dynamic
- operation naming.
-
- * message-thread.c (describe_thread_messages): Ditto.
-
- * message-list.c (describe_regenerate_messagelist): Ditto.
-
- * mail-threads.c (get_password_clicked): Dynamic generation
- of descriptive text for mail operations. "Opening a folder" ->
- "Opening INBOX". Supported only so far, will be implemented
- quickly.
- g_strdup() the old_message when changing the queue_window_label's
- text.
-
- * main.c (main): One more gconf reference to take out...
-
- * mail-ops.c (composer_send_cb): Check for an identity before
- sending.
-
-2000-08-03 JP Rosevear <jpr@helixcode.com>
-
- * mail-config.glade: Increase window size slightly, rename
- "Transport" to "Mail Transport"
-
- * mail-config.c (init_config): Remove gconf references
- (clear_config): ditto
- (read_config): ditto
- (write_config): ditto
- (mail_config): Null provider lists before filling them
- (mail_config_druid): ditto
- (identity_page_new): Increase spacing of vbox
- (service_page_new): ditto
-
- * Makefile.am: Remove gconf references.
-
-2000-08-02 Dan Winship <danw@helixcode.com>
-
- * mail-config.c (service_page_item_new): Make the "test settings"
- button FILL rather than SHRINK so it doesn't end up oddly-placed.
-
- * mail-config-druid.glade: Make the icon background dark blue
- like the surrounding area.
-
-2000-08-02 Peter Williams <peterw@helixcode.com>
-
- * component-factory.c (owner_unset_cb): Wait for async operations
- to finish before exiting.
-
-2000-08-02 Christopher James Lahey <clahey@helixcode.com>
-
- * mail-ops.c, message-list.c: Emit "model_pre_change" where
- appropriate.
-
-2000-08-02 Peter Williams <peterw@helixcode.com>
-
- * mail-config.h: #ifdef _MAIL_CONFIG_H protect the header.
-
-2000-08-01 Peter Williams <peterw@helixcode.com>
-
- * mail-threads.c: Implement Solaris threads. Attempt
- to join to the thread upon exit -- hopefully prevents
- all those nasty zombie processes from popping up :-(
-
-2000-08-01 Dan Winship <danw@helixcode.com>
-
- * mail-crypto.c: New code to spawn off GPG/PGP to do stuff.
- Currently only deals with decryption. From Nathan Thompson-Amato
- <ndt@jps.net>, with bunches of changes from me.
-
- * session.c (mail_request_dialog): Expose the password dialog to
- the rest of the app (for use by the GPG/PGP code).
-
- * mail-format.c (handle_text_plain): Handle special inline data
- types. (Currently uuencoding, BinHex, and PGP encryption.) This is
- not the best way to deal with it, but it works for now.
- (try_inline_pgp): Convert an inline PGP-encrypted message into a
- multipart/encrypted part.
- (try_inline_binhex): Convert an inline BinHex attachment into an
- application/mac-binhex40 part (which we currently don't deal
- with...)
- (try_uudecoding): Convert a uuencoded attachment to an
- application/octet-stream part.
- (handle_multipart_encrypted): Deal with RFC2015 MIME-encoded PGP
- encrypted messages. (From ndt.)
-
- * mail-display.c (mail_text_write, mail_error_write): New utility
- functions.
-
- * Makefile.am (evolution_mail_SOURCES): add mail-crypto.c
-
-2000-07-31 Christopher James Lahey <clahey@helixcode.com>
-
- * component-factory.c, folder-browser.c: Fixed some warnings.
-
- * message-list.c: Made the icon column non sortable.
-
-2000-07-31 Dan Winship <danw@helixcode.com>
-
- * mail-config.c (service_page_set_url): Fix a NULL-pointer strcmp
- noticed by peterw.
-
-2000-07-31 Not Zed <NotZed@HelixCode.com>
-
- * mail-vfolder.h: Header for vfolder functions.
-
- * folder-browser.c (mail_uri_to_folder): Use new scheme to open
- vfolders.
- (search_save): New button/function to save a search as a vfolder.
-
- * mail-vfolder.c (vfolder_edit): Made asynchronous.
- (vfolder_uri_to_folder): New function for loading vfolders and
- setting up their source folders.
- (vfolder_refresh): Change shell vfolder uri's to indirect
- references rather than the real vfolder uri.
- (vfolder_gui_add_rule): Add a rule with user confirmation.
- (vfolder_create_part): Get a new part by name, for creating rules
- in code.
-
- * message-thread.c (thread_messages): Check for uid lookup
- failure, which indicates an error in the folder or calling code.
-
-2000-07-29 Not Zed <NotZed@HelixCode.com>
-
- * component-factory.c (create_view): Remove hack to pass the
- storage around.
-
- * folder-browser-factory.c (control_activate): Changed to call
- renamed vfolder editor.
-
- * mail-ops.c (vfolder_edit_vfolders): renamed from vfolder_edit,
- call new edit function.
- (vfolder_editor_clicked): Removed.
- (filter_druid_clicked):
- (filter_edit): Updated for api change.
- (real_fetch_mail): Fixed up for api change and fucked up indent.
- (filter_get_folder): callback for filter driver.
-
- * mail-vfolder.c: New file to manage virtual folders.
-
-2000-07-29 JP Rosevear <jpr@helixcode.com>
-
- * mail-format.c (mail_generate_reply): Use new mail config stuff
-
- * component-factory.c (create_imap_storage): Use new mail config
- stuff
- (create_news_storage): ditto
-
- * evolution-mail.schemas: Gconf schema for evolution mail
-
- * mail-config-druid.glade: Gladification of config druid
-
- * mail-config.h: New header with config structs.
-
- * mail-config.c: Rewrite of GUI configuration tools to use
- new config structs. Stores multiple identities and sources now.
- Still only uses the first one found.
- (mail_config_fetch): Returns MailConfig struct to caller
- for configuration queries.
- (mail_config): Renamed function to show mail config dialog.
- (mail_config_druid): Renamed function to show mail config druid.
-
- * mail-ops.c (create_msg_composer): Use
- e_msg_composer_new_with_sig_file and new config stuff
- (check_configured): Use new config stuff
- (fetch_mail): ditto
- (composer_send_cb): ditto
-
-2000-07-28 Cody Russell <bratsche@gnome.org>
- * mail-ops.c, mail.h: Added mark_all_seen(), to mark every
- message in the list with CAMEL_MESSAGE_SEEN.
-
- * folder-browser-factory.c: Added "Actions/Mark all seen".
-
-2000-07-27 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config.c: Lets fix Dan's kludge the Right Way (tm)
- (set_service_url): Only strip off the leading "/" from the
- url->path if url->host is NULL
- (get_service_url): Only prepend a leading "/" to the path if the
- host is NULL
-
-2000-07-27 Dan Winship <danw@helixcode.com>
-
- * mail-config.c (get_service_url): toss in a kludge to deal with
- the IMAP vs mbox path problem for now.
-
-2000-07-26 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c, message-list.h: Removed counting of selected
- messages.
-
-2000-07-26 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (real_fetch_mail): Don't create the tmp_mbox before
- calling movemail, because the external movemail requires it to not
- exist. Contrariwise, delete it in the cleanup code if it's empty.
- Update for camel_movemail interface change. Do the "No new
- messages" dialog in the mbox case as well as the remote mail
- issue.
-
-2000-07-26 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c: s/struct refile_data/struct move_data
- (real_move_msg): Renamed from real_refile_msg()
- (move_msg): Renamed from refile_msg()
-
- * folder-browser-factory.c: Changed Refile to Move.
-
-2000-07-26 Dan Winship <danw@helixcode.com>
-
- * mail-format.c (lookup_handler): Update for OAF and for external
- apps as well as components.
- (handle_via_external): Handler to set up for data that can be
- displayed by an external application.
-
- * mail-display.c (on_link_clicked, etc): Refactor the save_data()
- code and add launch_external() as a handler for
- x-evolution-external URLs.
- (embeddable_destroy_cb): Remove this, since it seems like it's all
- wrong.
- (on_object_requested): Update for OAF, and fix some bugs.
-
-2000-07-25 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config.c (get_service_url): Always prepend a leading "/" to
- the url->path.
- (set_service_url): Added more error checking and also strip the
- leading '/' from the url->path
- (create_identity_page): Set the signature file to the one specified in
- the identity record, else set the default path to ~/.sugnature
-
-2000-07-25 Michael Meeks <michael@helixcode.com>
-
- * mail-config.c (create_identity_page): set default signature to
- ~/.signature
-
-2000-07-25 Peter Williams <peterw@helixcode.com>
-
- * mail-ops.c (reply): Check for the case of fb->mail_display->
- current_message = NULL, which shouldn't happen, but has happened
- to me.
-
-2000-07-25 Dan Winship <danw@helixcode.com>
-
- * message-thread.c (group_root_set): Don't group together messages
- with the same non-Re: subject and no References/In-Reply-To. More
- often than not, they're unrelated. (eg, "[No subject]".)
- (thread_messages): Handle messages with no Message-Id. "This
- shouldn't happen", but it does sometimes, and it's not much code
- to make it just work.
-
-2000-07-25 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-config.c (create_service_page): Call
- `gtk_option_menu_set_menu()' as the last thing, as `GtkOptionMenu'
- is fscking broken. Also, `gtk_widget_show()' the individual menu
- items.
-
-2000-07-24 Dan Winship <danw@helixcode.com>
-
- * message-list.c (mark_msg_seen, ml_tree_set_value_at,
- message_list_regenerate): Update for CamelFolder API changes.
- (Certain functions no longer take a CamelException.)
-
- * mail-ops.c (real_fetch_mail, real_send_mail, real_delete_msg):
- ditto
-
- * component-factory.c (real_create_imap_storage,
- real_create_news_storage): ditto
-
-2000-07-24 Dan Winship <danw@helixcode.com>
-
- * component-factory.c, folder-browser-factory.c, test-mail.c:
- Remove GOAD support.
-
- * main.c: Remove GOAD support.
- (main): More "guess the build mistake" fun, this time for the
- failure to initialize Bonobo case.
-
-2000-07-24 Peter Williams <peterw@helixcode.com>
-
- * mail-tools.c (mail_tool_set_uid_flags): Change
- function to faithfully pass parameters to
- camel_folder_set_message_flags; this function is
- somewhat useless now. Other files synced with
- API change.
-
- * mail-ops.c (op_display_message): Change "display
- a message" into "retrieve a messsage" in the
- description of mail_op_display_message.
-
- * mail-threads.c (display_timeout): New function.
- Only display the progress dialog if the operation
- takes more than a second to perform.
- (hide_queue_window): New function. Hide the queue
- window as an idle function... I'm thinking maybe
- the problem with hiding it was due to us not
- being in a GTK event sequence? Perhaps it's only
- the timeout, which was not being cancelled, which
- is now.
-
- * message-list.c (get_message_uid): New function,
- copy of get_message_info, except gets only the
- UID, as that's all that most functions want, and
- we avoid a Camel call.
-
-2000-07-23 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-ops.c (create_message_composer): New.
- (compose_msg): Use it.
- (send_to_url): Likewise.
- (forward_msg): Likewise.
-
- * folder-browser-factory.c (control_activate): Use `_()' instead
- of `N_()'.
-
-2000-07-21 Peter Williams <peterw@helixcode.com>
-
- * message-thread.c (setup_thread_messages): New
- operation: thread_messages, simple wrapper around
- thread_messages () and thread_messages_free();
-
- * message-list.c (cleanup_regenerate_messagelist):
- Use new thread_messages operation instead of just
- calling ... thread_messages :-)
-
- * folder-browser.c (folder_browser_destroy): Use new
- sync_folder operation instead of calling camel_folder_sync
- directly.
-
- * component-factory.c (create_folder): Changed to use
- new create_folder operation.
-
- * mail-ops.c (mail_do_create_folder): New operation: create
- folder. New operation: sync folder.
-
- * mail-format.c (cmm_destroyed): Remove the url hashtable from
- the larger hashtable when it gets destroyed.
-
- * mail-callbacks.c (fetch_mail): Pass a hook function and data
- down the chain to pick up the folder_changed and change the view.
-
- * mail-ops.c: Rename from mail-ops-new.c now that it's a little more
- solid.
- (fetch_mail): Add new options to hook and unhook an event while the
- filter driver runs. A hack, but all of the operations are to some
- extent.
- (cleanup_fetch_mail): Unref the destination folder if not NULL.
- * mail-tools.c (mail_tool_filter_contents_into): Intermediate the
- event hook/unhook hack here.
-
-2000-07-20 Peter Williams <peterw@helixcode.com>
-
- * mail-ops-new.c (setup_send_mail): Fix silly forgetting-to-ref
- problem on some sends (when not replying). Note the early exit
- path with a big comment.
-
- * message-list.c (message_list_set_folder): Don't call
- folder_changed, call mail_do_regenerate_messagelist, as
- the GDK_THREADS_ENTER in the former can deadlock us!
-
- * folder-browser.c (folder_browser_set_uri): Ah, screw it.
- Make 'load folder' asynchronous and pretend that it always
- succeeds.
-
- * mail-ops-new.c (mail_do_load_folder): New operation, loads
- a folder into a FolderBrowser.
-
- * mail-threads.c (read_msg): Check if the exception is
- a user cancel; don't complain if it is.
- (mail_operation_queue): Same.
- (dispatch_func): Same.
-
-2000-07-20 Peter Williams <peterw@helixcode.com>
-
- * mail-ops-new.c (cleanup_send_mail): Fix evil mistaken
- unref.
-
- * test-thread.c: Fit the new mail_operation_spec prototype.
-
- * mail-callbacks.c (composer_send_cb): Hide the composer upon
- start of send operation.
-
- * folder-browser.c: #include "mail-ops-new.h"
-
- * mail-threads.h: Change text fields of mail_operation_spec to
- provide two forms of the name.
-
- * mail-threads.c: Use appropriate new string fields.
- (dispatch_func): Hide the progressbar by default.
-
- * message-list.c (op_regenerate_messagelist): Fix the datasize from
- 0 -> sizeof (regenerate_messagelist_data_t). Add the new gerund and
- infinitive strings.
- (do_regenerate_messagelist): Include some code that fell between the
- cracks.
-
- * mail-ops-new.c (op_scan_subfolders): Same datasize fix for
- scan_subfolders.
- (op_forward_message): Same.
- (all): Add new gerund and inifinitive strings for mail_operation_spec.
- (cleanup_send_mail): Destroy the composer on success; re-show it on
- error. I'm so clever!
-
-2000-07-20 Ettore Perazzoli <ettore@helixcode.com>
-
- * component-factory.c (factory_fn): Updated for the new
- `evolution_shell_component_new()' arg.
-
-2000-07-19 Jeffrey Stedfast <fejj@helixcode.com>
-
- * message-thread.c (thread_messages): What if message info is NULL?
-
-2000-07-17 Peter Williams <peterw@helixcode.com>
-
- * component-factory.c (real_create_{imap,news}_storage): Instead of
- directly calling evolution_storage_new_folder, queue up a list of
- folders to register so that we don't do our CORBA in The Other Thread.
- (create_{imap,news}_storage): Changes ancillary to the above.
- (add_new_mailbox): New function to queue up a folder
- (cleanup_create_info): New function to dequeue the folders and free mem.
-
- * test-thread.c: s,ENABLE_BROKEN_THREADS,USE_BROKEN_THREADS -- oops
-
- * mail-format.c: (mail_lookup_url_table): New function to get the url
- table associated with a CamelMimeMessage because we can no longer
- gtk_object_get_data on it.
-
- * mail-display.c: replace 'gtk_object_get_data( message, "urls" )'
- with 'mail_lookup_url_table( message )'
-
-2000-07-16 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser.c, component-factory.c: Initial code to support
- IMAP folders that don't use "/" as a directory separator.
-
-2000-07-15 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-ops.c (set_x_mailer_header): New helper function to set the
- `X-Mailer:' header to to `Evolution <version> [Developer
- Preview]".
- (real_send_mail): Call it.
-
-2000-07-14 Peter Williams <peterw@curious-george.helixcode.com>
-
- * message-list.c (message_list_set_folder): Ported to CamelObject:
- GTK_OBJECT->CAMEL_OBJECT; gtk_signal_connect->camel_object_hook_event;
- GDK_THREADS_ENTER/LEAVE around "changed" event hooks.
-
- * folder-browser.c (folder_browser_destroy): likewise.
- (mail_uri_to_folder): likewise.
- (folder_browser_load_folder): likewise.
-
-2000-07-14 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am (evolution_mail_LDADD): Add `GCONF_LIBS'.
-
-2000-07-14 Dan Winship <danw@helixcode.com>
-
- * mail-format.c (write_headers): put a <p> at the end of the
- header table. (I think there used to be whitespace after it, but
- then some gtkhtml change got rid of it...)
- (handle_text_plain): Don't do this <PRE>. Instead, CONVERT_NL and
- CONVERT_SPACES and wrap it in <TT>. Now if the sender didn't
- include any newlines, it will be wrapped to the width of the
- window instead of extending off into infinity.
-
-2000-07-13 Dan Winship <danw@helixcode.com>
-
- * message-list.c (message_list_destroy): Only unref the folder if
- it's been set.
-
- * folder-browser.c (folder_browser_destroy): Only sync the folder
- if it's been set.
-
-2000-07-13 Jonathan Blandford <jrb@redhat.com>
-
- * mail-config.c (create_transport):
- s/CAMEL_SERVICE_NEED_HOST/CAMEL_SERVICE_URL_NEED_HOST.
-
-2000-07-13 Dan Winship <danw@helixcode.com>
-
- * mail-config.c (add_row): Add a "gboolean required" argument, and
- set its value on the entry.
- (create_source, create_transport): Create rows for URL elements if
- the URL ALLOWs them. Mark them required if it NEEDs them.
- (service_note_doneness): Only require the required fields to be
- filled in.
-
- Now the IMAP config page allows the user to enter a path, but
- doesn't require it.
-
-2000-07-13 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (real_fetch_mail): Back to the old way to avoid
- g_warnings, yay. Also fix append to send a flags argument (0)
-
-2000-07-12 Chris Toshok <toshok@helixcode.com>
-
- * mail-config.c (providers_config_new): fix some cut & paste bung.
-
-2000-07-12 Chris Toshok <toshok@helixcode.com>
-
- * mail-format.c (setup_function_table): add "message/news" to the
- mime_function_table using the same handler as message/rfc822.
-
-2000-07-12 Chris Toshok <toshok@helixcode.com>
-
- * mail-config.glade*: add news server tab to dialog.
-
- * mail-config.c (on_NewsServerConfigDialogButton_clicked): new function.
- (on_clistNewsServers_select_row): new function.
- (on_cmdNewsServersAdd_clicked): new function.
- (on_cmdNewsServersEdit_clicked): new function.
- (on_cmdNewsServersDelete_clicked): new function.
- (providers_config_new): mirror the source tab's code to fill in
- the news server tab.
- (write_config): save out the news server.
- (create_news_server_config_dialog): new function.
- (create_news_server_page): new function.
-
-2000-07-12 Peter Williams <peterw@helixcode.com>
-
- * mail-display.c (save_data): Change from evolution_dir to
- g_get_home_dir() for default location of save file.
-
-2000-07-11 Dan Winship <danw@helixcode.com>
-
- * Update for CamelFolder API changes
-
-2000-07-11 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (real_fetch_mail): Changed to use
- camel_folder_move_message_to () rather than get_message () and then
- append_message (). This also makes it so we don't have to worry about
- fetching message flags to pass to the new append_message () method.
-
- * folder-browser.c (folder_browser_load_folder): Disable
- Search capability menu/entry if folder doesn't support it.
-
- * message-list.c (message_list_regenerate): Don't perform
- a search if the folder doesn't support it.
-
-2000-07-11 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (real_send_mail): Set the post_send_data flag rather
- than toggling it. (Maybe we'll need more control over it later,
- but for now, the only flag we set is "replied", and we want
- that set, not toggled.)
-
-2000-07-10 Dan Winship <danw@helixcode.com>
-
- * folder-browser-factory.c (control_activate): Work with both
- current and 0.15 bonobo
-
- * kill more debugging messages
-
- * mail-ops.c (real_fetch_mail): Don't multiply free dest_url.
-
- * message-list.c (message_list_select): Update
- message_list_select_next to do either next or previous.
-
- * folder-browser.c (etable_key): Make 'n' and 'p' do next and
- previous unread message.
-
- * mail-ops.c (select_first_unread): Update.
- (real_fetch_mail): clean up a bit.
-
-2000-07-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-ops.c (forward_msg): Initialize `fwd_subj' to NULL if
- `from' is NULL.
-
-2000-07-10 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (real_fetch_mail): Fixed broken POP fetching
-
-2000-07-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * component-factory.c: Removed variable `browsers'.
- (create_view): Don't update it.
- (owner_unset_cb): Don't sync the folders here anymore, because at
- this point the folder browser is dead already so we cannot get a
- valid list of folders from it anymore.
-
- * folder-browser.c (folder_browser_destroy): Sync the associated
- mailbox first.
-
-2000-07-10 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c, message-list.h: Switched from ETable to
- ETableScrolled.
-
-2000-07-10 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (real_fetch_mail): Fixed movemail so that it too would
- deliver to Inbox.
-
-2000-07-09 Dan Winship <danw@helixcode.com>
-
- * message-list.c (get_message_info): Don't g_warn if the user
- selects a fake tree parent.
- (message_list_select_next): Ignore fake rows
- (build_tree): Store the "root_subject" for fake rows
- (ml_tree_value_at): Display the correct subject for fake rows.
- (on_cursor_change_cmd): Update for the other changes and set
- cursor_uid to NULL when the cursor is on a fake row.
-
- * mail-ops.c (reply): Don't try to reply when no (real) message is
- selected.
- (forward_msg): Ditto.
-
-2000-07-09 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Remove setting of dnd_code since that's handled
- internally to ETable.
-
-2000-07-08 Dan Winship <danw@helixcode.com>
-
- * folder-browser.c (etable_key): Fix up the pageup/pagedown
- increment a bit.
-
- * folder-browser-factory.c (control_activate): Add a "Threaded
- Message List" item to the "View" menu.
-
- * message-list.c (message_list_toggle_threads): Handler for that.
- (build_flat): New function to build a "flat" message list using
- the tree model.
- (message_list_regenerate): Build tree or flat message list
- depending on the global setting.
-
- * message-thread.c (get_root_subject): fix a "Re:" parsing bug
-
-2000-07-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (real_fetch_mail): Always dump incoming messages to
- Inbox (assuming not filtered to another location).
-
-2000-07-08 Ettore Perazzoli <ettore@helixcode.com>
-
- * folder-browser-factory.c (control_activate): Move the
- "Expunge" item to the "Action" menu.
- (control_deactivate): Accordingly.
-
-2000-07-08 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (forward_msg): Deal with having multiple selected
- messages.
-
- * mail-format.c (mail_generate_forward): Removed. (Integrated into
- forward_msg)
-
-2000-07-08 Jeffrey Stedfast <fejj@helixcode.com>
-
- * message-list.c (build_tree): Small fix to stop uid data from
- being set on a message-list tree node when it didn't correspond
- to an actual message.
-
-2000-07-08 Dan Winship <danw@helixcode.com>
-
- * message-list.c (get_message_info): Fix Jeff's FIXME: This does
- get called with out-of-range data sometimes, so we do need the
- check. Use e_table_model_row_count to get the actual right answer.
-
-2000-07-07 Jeffrey Stedfast <fejj@helixcode.com>
-
- * message-list.c (get_message_info): This wasn't quite right, it
- will now work but still isn't perfect. See FIXME comment.
-
-2000-07-07 Dan Winship <danw@helixcode.com>
-
- * message-thread.c (remove_node): Add another argument "clast"
- pointing to the container before the current one in the list,
- which it can update if that turns out to be the one that it
- removed.
- (group_root_set): Update for remove_node change, and remove both
- nodes in the "subjects are common" case. Fixes a bug that would
- cause the message list to be truncated if this rule was invoked.
-
- (sort_node): sort the tree by the original order of the messages
- in the folder rather than by date.
-
-2000-07-07 Dan Winship <danw@helixcode.com>
-
- * message-list.c: Lots of changes. Store uids as node data on the
- tree nodes and use those rather than rows where possible. (The
- concept of "row" is just getting too complicated.) Get rid of the
- summary_table, because given a uid we can call
- camel_folder_get_message_info, which makes more sense than keeping
- a separate uid->row hash table ourselves.
-
- (get_message_info): update
- (get_message_row): removed
- (ml_col_cound, ml_row_count, ml_value_at, ml_set_value_at,
- ml_cell_is_editable, ml_duplicate_value, ml_free_value,
- ml_initialize_value, ml_value_is_empty, ml_value_to_string):
- Removed. We always use the tree model now.
- (message_list_init): Remove the non-tree code.
- (build_tree): store uids in the tree rather than row numbers,
- and build the message_list->uid_rowmap to map from uids to rows
- when needed.
- (message_list_regenerate): Renamed from _set_search, since it's
- used to redraw in non-search cases too.
- (message_changed): Use the uid_rowmap to get a model row number.
-
- * message-thread.c (thread_messages): Change the interface on this
- to work with the new MessageList.
-
- * folder-browser.c (search_set, folder_browser_clear_search):
- s/message_list_set_search/message_list_regenerate/
-
-2000-07-07 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c (get_message_info): Handle a row number of -1
- properly.
-
-2000-07-06 Dan Winship <danw@helixcode.com>
-
- * message-list.c (get_message_info): Map tree model row numbers to
- summary row numbers.
- (ml_tree_value_at, ml_tree_set_value_at,
- ml_tree_is_cell_editable): So don't do that here.
-
-2000-07-06 JP Rosevear <jpr@arcavia.com>
-
- * mail-config.glade*: Glade files for the configuration dialog.
-
- * mail-config.c (providers_config_new): Build the dialog with
- glade.
-
-2000-07-06 Dan Winship <danw@helixcode.com>
-
- * folder-browser-factory.c, folder-browser.c, mail-ops.c,
- message-list.c: fix warnings.
-
- * main.c (main): gtkhtmllib_init is no more. Call gconf_init
- directly instead.
-
- * message-list.c (message_list_select_next): New function to
- select the first message on or after the given row that meets
- certain flag criteria.
-
- * mail-ops.c (real_fetch_mail): call message_list_select_next to
- select first unread message in current folder if it changes.
- (real_delete_msg): Remove the code to move the etable cursor. It
- only makes sense really if you deleted the message with the
- keyboard, so do it from etable_key.
-
- * folder-browser.c (etable_key): call message_list_select_next to
- select next non-deleted message after Delete.
-
- * mail-identify.c: Add a workaround for a small gnome-vfs 0.2 bug
- so we don't need to require CVS gnome-vfs.
-
-2000-07-06 Not Zed <NotZed@HelixCode.com>
-
- * message-thread.c (sort_thread): sort messages based on date for
- the initial sort order.
- (thread_messages_free): Implement.
-
- * message-list.c (message_list_init_header): Setup the subject
- renderer to a tree in tree mode.
- (on_cursor_change_cmd): For a tree model, map the view row to the
- data row.
- (build_tree): Builds the tree data structure of all messages.
- (message_list_set_search): For a tree model, build the tree here.
- (ml_tree_icon_at): Icon callback, returns nothing.
- (ml_tree_value_at):
- (ml_tree_set_value_at):
- (ml_tree_is_cell_editable): Maps tree node to data row, and calls
- the equivalent table callback
- (message_list_init_renderers): Setup the tree renderer if needed.
- (message_list_init): set the root node invisible afterall.
- (message_list_set_search): Clear the old tree before putting in a
- new one.
-
- * message-list.h: Add a tree renderer to render list, and
- tree_view indicator.
-
- * message-thread.[ch]: Code for message threading.
-
-2000-07-05 Dan Winship <danw@helixcode.com>
-
- * mail-identify.c (mail_identify_mime_part): Oops. My gnome-vfs
- was out-of-date. Update for changed function name.
-
-2000-07-05 Dan Winship <danw@helixcode.com>
-
- * mail-identify.c (mail_identify_mime_part): Use the gnomevfs
- sniff buffer interface to try to identify the MIME type when
- everything else fails.
-
- * mail-display.c (on_object_requested):
- * mail-format.c (lookup_handler, handle_undisplayable,
- handle_audio): s/gnome_mime/gnome_vfs_mime/
-
- * Makefile.am: Add gnomevfs stuff
-
-2000-07-03 Ettore Perazzoli <ettore@helixcode.com>
-
- * component-factory.c (create_folder): Get rid of a compiler
- warning by making sure `folder' is always initialized to some
- value for any code path.
-
-2000-07-03 Dan Winship <danw@helixcode.com>
-
- * message-list.c (select_msg): call mail_display_set_message with
- NULL if the message we tried to select doesn't exist (probably
- meaning we tried to selecte the first message and the folder is
- empty.)
-
- * mail-display.c (mail_display_set_message): deal with NULL as an
- input (meaning "undisplay previous message and display nothing").
-
-2000-07-02 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (real_fetch_mail): Remove hack to redisplay the
- inbox, since folder_changed signals will now be emitted
- appropriately.
-
- * component-factory.c (create_vfolder_storage): Fix
- filter_driver_new invocation.
-
- * Makefile.am (bin_PROGRAMS): test-mail and test-thread should be
- noinst.
-
- * mail-ops.c (real_fetch_mail):
- (vfolder_editor_clicked):
- * component-factory.c (create_vfolder_storage):
- Pass mail_uri_to_folder and rules to filter_driver_new.
-
-2000-07-02 Ettore Perazzoli <ettore@helixcode.com>
-
- * folder-browser.c (mail_uri_to_folder): Fix double freeing of the
- local exception `ex'.
-
-2000-07-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-ops.c (refile_msg): Only allow type "mail" in the folder
- selection dialog.
-
-2000-07-01 Dan Winship <danw@helixcode.com>
-
- * pixmaps.h, pixmaps/*.xpm: Removed. These aren't being used any
- more. (The real pixmaps are in ../art.)
-
-2000-07-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * message-list.c (get_message_info):
- (select_msg): Updated to reflect camel-folder changes.
-
- * mail-ops.c (real_fetch_mail): Modified to reflect camel-folder
- changes.
-
-2000-06-30 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (print_msg): Use gnome-print to do a print preview.
-
- * folder-browser-factory.c: Hook up "Print" button.
-
- * message-list.c (message_list_foreach): New function, a wrapper
- around e_table_selected_row_foreach, which calls the callback
- function with UIDs rather than row numbers.
-
- * folder-browser-factory.c: Remove never-used "Find" button from
- the toolbar and replace it with "Refile". (We need a better icon
- for this...). Hook up "Refile" to "refile_msg".
-
- * mail-ops.c (refile_msg): Call the shell's user_select_folder
- routine, and then use message_list_foreach and real_refile_msg to
- do the work.
- (delete_msg): Update to use message_list_foreach.
-
- * folder-browser.c (mail_uri_to_folder): new function, extracted
- from folder_browser_load_folder, to turn a URI into a folder.
- (folder_browser_load_folder): Use it.
-
-2000-06-30 Peter Williams <peterw@curious-george.helixcode.com>
-
- * component-factory.c (create_news_storage, create_imap_storage):
- Fixed to use new EvolutionShellClient proxy thingamajiggie.
-
-2000-06-30 Dan Winship <danw@helixcode.com>
-
- * message-list.c (on_row_selection): use the ETable row_selection
- signal to track how many rows are selected. Eventually we will use
- this info to disable toolbar buttons when you have too few/too
- many messages selected, but the current toolbar widget doesn't
- allow that.
-
- * message-list.h, message-list.c, mail-ops.c: Change selected_row
- and selected_uid fields of MessageList to cursor_row and
- cursor_uid to be more correct according to the new ETable
- interfaces.
-
-2000-06-30 Ettore Perazzoli <ettore@helixcode.com>
-
- * component-factory.c: Eeek. Fix typo: add missing star in the
- declaration of `global_shell_client'.
-
-2000-06-29 Ettore Perazzoli <ettore@helixcode.com>
-
- * component-factory.c: Replace `global_shell_interface' with
- `global_shell_client'.
-
-2000-06-29 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-ops.c (delete_msg): Clean up compile warnings
- (real_fetch_mail): Fetching from IMAP should do nothing
-
-2000-06-29 Christopher James Lahey <clahey@helixcode.com>
-
- * mail-ops.c: Handle multiple deletes (change by Peter Williams.)
-
-2000-06-29 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser-factory.c: Changed "Send" to "Compose" to
- avoid user confusion. Compose is a little more intuitive.
- Also changed the pixmap to MAIL_NEW instead of MAIL_SND
-
- * mail-ops.c (compose_msg): Renamed to avoid confusion
-
-2000-06-29 Dan Winship <danw@helixcode.com>
-
- * component-factory.c (create_imap_storage, create_news_storage):
- remove some code incorrectly copied and pasted from
- create_vfolder_storage which caused vfolder creation to stop
- working.
-
-2000-06-29 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c, mail-ops.c: Changed the name of
- e_table_select_row to e_table_set_cursor_row.
-
-2000-06-29 Peter Williams <peterw@helixcode.com>
-
- * message-list.c (message_list_init): Set the dnd_code of the
- ETableHeader to something so that Solaris sprintf doesn't die
- on a NULL string.
-
- * mail-config.c (providers_config_new): Check for a null "transport"
- string (not all OS' handle NULL strings well *cough* Solaris)
-
-2000-06-28 Dan Winship <danw@helixcode.com>
-
- * mail-format.c (mail_generate_forward): add default subjects
-
- * component-factory.c (create_folder): Refuse to create folders
- not of type "mail", and correctly create an empty "mbox" folder
- for new folders in /local.
-
- * main.c (init_corba): Call od_assert_using_oaf() or
- od_assert_using_goad() as appropriate to make sure people didn't
- somehow trick the build system.
-
-2000-06-28 Jeffrey Stedfast <fejj@helixcode.com>
-
- * message-list.c: Added prototype for filter_date to make
- it build cleanly
-
-2000-06-27 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Made dates display grouping information
- properly.
-
-2000-06-27 Peter Williams <peterw@curious-george.helixcode.com>
-
- * message-list.c (mark_msg_seen): Need to return a value
- on error.
-
- * main.c (main): Don't start threads or enter threads if
- there's no threading! Sigh.
-
- * test-thread.c: Don't compile if no threads.
-
- * session.c: Work without broken threads.
-
- * message-list.c (filter_date): Solve the ctime_r problem the
- correct way, with the magic of autoconf.
-
-2000-06-27 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Work around mismatched ctime_r functions. This
- will be fixed.
-
-2000-06-27 Peter Williams <peterw@curious-george.helixcode.com>
-
- * mail-threads.c: Don't compile this if we don't have
- threads enabled. This should maybe be on the Makefile.am
- level.
-
-2000-06-27 Michael Zucchi <zucchi@zedzone.mmc.com.au>
-
- * component-factory.c (owner_set_cb): Put in a gross hack to
- export the shell reference elsewhere.
-
-2000-06-26 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Added a value_to_string handler.
-
-2000-06-26 Peter Williams <peterw@helixcode.com>
-
- * component-factory.c, mail-ops.c: #ifdef the threads stuff so
- that if USE_BROKEN_THREADS is not defined we just call the functions
- in the main thread.
-
- * mail-threads.h: Don't declare funcs if USE_BROKEN_THREADS not
- defined.
-
- * mail-threads.c: Put the query and message boxes on top so that
- you can see them.
-
-2000-06-26 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config.c (error_dialog): va_start() returns void, don't
- assign it's retval to a variable.
-
-2000-06-26 Ettore Perazzoli <ettore@helixcode.com>
-
- * main.c (main): Call `GDK_THREADS_ENTER()' and
- `GDK_THREADS_LEAVE()' around the main loop as in the examples from
- the GTK+ FAQ.
-
- * mail-threads.c (DEBUG): New macro for debugging.
- (read_msg): Use it.
-
-2000-06-25 Peter Williams <peterw@helixcode.com>
-
- * Makefile.am: Clean up the various _LIBS and _CFLAGS
- to work with simpler THREADS_LIBS and THREADS_CFLAGS scheme.
-
-2000-06-23 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser.c (folder_browser_load_folder): Improved the
- code to separate the imap namespace from the folder name.
-
-2000-06-23 Peter Williams <peterw@curious-george.helixcode.com>
-
- * component-factory.c: Include e-util/e-setup.h for the
- prototype of evolution_dir; prototype create_news_storage.
- (real_create_imap_storage, real_create_news_storage): New
- functions moving the camel stuff into the async callback.
- (create_imap_storage, create_news_storage): Chopped in
- half to move camel stuff as above.
-
- * mail-ops.c: Include "mail-threads.h" for threading protos.
- (real_fetch_mail, real_send_mail, real_expunge_folder):
- New functions moving the camel stuff into the async callback.
- (async_mail_exception_dialog): A version of mail_exception_dialog
- to be called from the async handlers (just calls mail_op_error())
- (fetch_mail, expunge_folder, composer_send_cb): Cut in half to
- move camel stuff as above.
- (cleanup_send_mail): Clean up after the async real_send_mail
- with the gtk_object_destroys et al.
-
- * mail-threads.c: Instead of hiding the progress bar, make it
- zip back and forth constantly.
- (progress_timeout): New func. Timeout called to make the pbar
- shimmy.
- (timeout_toggle): New func. Turn on and off the shimmy effect.
- (check_cond): New func. Make sure that the GCond for modal
- operation is initialized before mail_op_{error,get_password}.
- (show_error_clicked, read_msg, get_password_clicked): Move
- over to timeout_toggle.
- (mail_op_error,mail_op_get_password): Add check_cond() call.
-
- * main.c: (main) Call g_thread_init.
-
- * session.c: Change auth_callback stuff over to assume that it's
- being called async. Note: no real good way to tell if this is
- the case or not.
- (request_callback): ifdef'ed out
- (evolution_auth_callback): Use mail_op_get_password.
-
-2000-06-22 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser.c (folder_browser_load_folder): Now should
- correctly get the selected folder from the given URL.
-
-2000-06-22 Chris Toshok <toshok@helixcode.com>
-
- * folder-browser.c (folder_browser_load_folder): add handling for
- loading "news:" folders.
-
- * component-factory.c (create_news_storage): add a root for news
- source.
- (owner_set_cb): call create_news_storage.
-
-2000-06-22 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser.c (folder_browser_load_folder): Updated to
- prepend url-> path if it exists for that imap store.
-
- * component-factory.c (create_imap_storage): Modified to not
- prepend a hard-coded namespace.
-
-2000-06-22 Chris Toshok <toshok@helixcode.com>
-
- * mail-ops.c (fetch_mail_cleanup): new function, passed as arg to
- mail_operation_try.
- (fetch_mail): add cleanup func arg.
-
-2000-06-22 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Changed ml_value_at to return "" instead of NULL
- in some cases.
-
-2000-06-22 Peter Williams <peterw@curious-george.helixcode.com>
- * Makefile.am: Add GNOME_EXTRA_LIBS so that we get libgthread
- in our LIBS for evolution-mail.
-
- * mail-threads.c: Make the dialog boxes for error and
- question non-modal. They're modal relative to the dispatch
- thread, but before they would also eg lock up the toolbar
- buttons (while the menus, managed by another process, were
- active -- a weird effect).
-
-2000-06-22 Peter Williams <peterw@curious-george.helixcode.com>
-
- * mail-threads.[ch]: Extra argument to mail_operation_try:
- 'cleanup', a function to be called in the main thread after
- the dispatcher thread exits. gtk_object_destroy's et al may
- attempt to unmap windows so we can't do them in the dispatcher
- thread :-(
-
- * test-thread.c: Updated with demo of new argument working.
-
-2000-06-22 Peter Williams <peterw@helixcode.com>
-
- * test-thread.c (op_5): New tests for the get_password
- hook.
-
- * mail-threads.[ch]: New hook, mail_op_get_password, for
- getting a user response from an async operation. The operation
- blocks while waiting for the response. A big whole mutex
- condition threading blocking dealie to make sure that it
- works.
-
- Also the error hook creates a dialog again, which also needs
- to block its caller while we wait for the user to press ok.
-
-2000-06-22 Peter Williams <peterw@helixcode.com>
-
- * mail-threads.c (various functions): Prettify the UI
- so that the progress bar doesn't become all huge 'n stuff.
- (mail_operation_try): Now save the operation's description,
- so that we can display it later as the default message.
- (read_msg): When the operation starts set the label to its
- UI-friendly name.
- (dispatch_func): Free the saved prettyname.
-
-2000-06-21 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Removed an erroneous comment.
-
-2000-06-21 Dan Winship <danw@helixcode.com>
-
- * mail-config.c (create_transport_page): Make this not crash if
- you don't have a transport configured.
-
- * message-list.c: Update received date to work like sent date.
-
-2000-06-21 Peter Williams <peterw@helixcode.com>
-
- * mail-thread.{c,h}: New files -- a simple API for executing
- the major mail ops (fetch_mail etc) asynchronously, allowing
- the operations to send messages and update a progress bar.
-
- * test-thread.{c,h}: Tests the mail-thread API.
-
- * Makefile.am: add mail-thread.[ch] to evolution_mail_SOURCES
- and declare the test_thread noinst_PROGRAM.
-
-2000-06-21 Peter Williams <peterw@helixcode.com>
-
- * mail-format.c (mail_generate_reply): Include "e-setup.h" to
- get the prototype for evolution_dir.
-
-2000-06-20 Jeffrey Stedfast <fejj@helixcode.com>
-
- * component-factory.c (create_imap_storage): Oops. Should
- have checked for a NULL sources.
-
-2000-06-20 Dan Winship <danw@helixcode.com>
-
- * message-list.c (mark_msg_seen): Quick hack to prevent a NULL
- pointer dereference. Things need to be cleaned up a bit more here
- though.
-
- * mail-sources.c: Oops. This should have been removed a long time
- ago.
-
-2000-06-20 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser.c (folder_browser_load_folder): Working on getting
- this to work :)
-
- * component-factory.c (create_imap_storage): Should now correctly
- construct the folder path allowing the selection of a folder.
-
-2000-06-20 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-format.c (mail_generate_reply): Declare `evolution_dir'.
- Ugly, ugly, ugly, but I am not sure where it should go instead.
-
-2000-06-19 Ettore Perazzoli <ettore@helixcode.com>
-
- * mail-ops.c (ask_confirm_for_empty_subject): New function to ask
- confirmation for an empty subject line.
- (composer_send_cb): Use it if the subject is empty and only send
- the message if the user confirms.
-
-2000-06-20 Jeffrey Stedfast <fejj@helixcode.com>
-
- * component-factory.c (create_imap_storage): Now creates the IMAP
- storage (listing subfolders and such)
-
-2000-06-19 Dan Winship <danw@helixcode.com>
-
- * mail-format.c (find_preferred_alternative): add an option to
- prefer text/plain.
- (reply_body): add an option to prefer text/plain
- (mail_generate_reply): Check the mail sending preferences, and
- generate a text/plain reply if the user prefers to send plain text
- (and we have a text/plain part to generate a reply from).
-
-2000-06-19 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config.c (providers_config_new): Should now correctly display
- the Transport page (made it set the optionmenu correctly, before it
- would only set SMTP).
- (create_transport_page): Updated to set the page info to sendmail/smtp
- based on the url.
- (create_service_page): Had to add some code to set data on some objects
- so I could grab the objects I needed to modify in the above function.
-
-2000-06-18 Jeffrey Stedfast <fejj@helixcode.com>
-
- * folder-browser.c (folder_browser_load_folder): started to add
- code to load an IMAP folder.
-
- * component-factory.c: Started to add a create_imap_storage
- method so that we can eventually have our IMAP store displayed
- in the tree view.
- (create_vfolder_storage): Renamed from
- create_test_storage().
- (owner_set_cb): Updated.
-
-2000-06-17 Dan Winship <danw@helixcode.com>
-
- * message-list.c (message_list_set_folder): Prevent double-freeing
- action on summary_table and uid_rowmap.
-
-2000-06-16 Dan Winship <danw@helixcode.com>
-
- * message-list.c (ml_set_value_at): Implement clicking on the
- envelope icon to set read/unread. Based on a patch by clahey.
- (select_msg): keep the timeout id for the "seen" flagging in the
- message_list structure, so ml_set_value_at can clear it so it
- doesn't re-mark a message seen after you click it unseen.
-
-2000-06-16 Dan Winship <danw@helixcode.com>
-
- * message-list.c (get_message_row): new function to do a uid to
- row mapping.
- (mark_msg_seen, select_msg, message_changed,
- message_list_set_folder): Update for Camel flag changes.
- (on_cursor_change_cmd): Rename "row_to_select" to "selected_row",
- and keep a "selected_uid" as well.
-
- * mail-ops.c (composer_send_cb): Update for Camel flag changes,
- and fix some memory-handling bugs. (Free the post_send_data when
- the composer is destroyed, not when the user clicks "send", which
- could happen never, or more than once.)
- (delete_msg): Update for Camel flag changes, and fix the "holding
- down the delete key skips some messages" bug.
-
-2000-06-15 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (fetch_mail):
- * component-factory.c (owner_unset_cb):
- * message-list.c (message_list_set_folder): Update for CamelFolder
- changes.
-
- * folder-browser.c (folder_browser_clear_search): New function to
- revert back to non-searching mode.
-
- * mail-ops.c (fetch_mail): Use folder_browser_clear_search.
-
- * mail-display.c (on_url_requested): if the document requests an
- unknown URL, it's not an error; just ignore the URL.
-
- * mail-ops.c (fetch_mail): If there's no new mail, tell the user.
-
-2000-06-14 Radek Doulik <rodo@helixcode.com>
-
- * main.c (main): call gtkhtmllib_init here
-
-2000-06-13 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config.c (on_SourceConfigDialogButton_clicked): Make sure source
- is always pointing to something, so a blank is not written to the config file
- on close.
-
-2000-06-13 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am (SHELL_OBJS): Removed.
- (evolution_mail_LDADD): Use `libeshell.a'. Also use
- `top_builddir' consistently.
-
-2000-06-12 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config.c: Got rid of sources_max_row and identities_max_row
- as they are not really needed (just use clist->rows)
- (on_cmdSourcesEdit_clicked): Modified to make 'source'
- point to the data being edited.
- (on_cmdSourcesAdd_clicked): Adds a new clist item and selects it so the
- editor knows where to stick the data when it's done.
-
-2000-06-12 Federico Mena Quintero <federico@helixcode.com>
-
- * message-list.c: Removed the ETableModel thaw handler.
-
-2000-06-12 Dan Winship <danw@helixcode.com>
-
- * folder-browser.c (folder_browser_set_uri): Return the result of
- folder_browser_load_folder.
- (get_prop, set_prop, folder_browser_properties_init): Remove. No
- longer needed.
-
- * folder-browser-factory.c (folder_browser_factory_new_control):
- Add a "uri" argument, return NULL if setting it fails.
- (folder_browser_factory_new_control): Remove property bag stuff.
- (folder_browser_factory_init, folder_browser_factory): Remove
- this, since we're using the component factory now.
-
- * component-factory.c (create_view): Update for
- folder_browser_factory_new_control change and return NOTFOUND as
- appropriate.
-
- * main.c (main): Don't call folder_browser_factory_init.
-
- * mail-format.c (mail_generate_reply): Fix the subject generation
- so we don't get "Re: Re:". This is working around something that
- may later be declared a misfeature in Camel.
-
-2000-06-10 Ettore Perazzoli <ettore@helixcode.com>
-
- * component-factory.c (create_folder): New stub implementation for
- the folder creation function in the EvolutionShellComponent we
- expose [it simply returns success all the time].
- (factory_fn): Pass this function to `evolution_shell_component_new'.
-
-2000-06-09 Dan Winship <danw@helixcode.com>
-
- * folder-browser.c (folder_browser_new): Add a serial number to
- FolderBrowser.
-
- * folder-browser-factory.c (control_activate, control_deactivate):
- Include fb serial number in the name of the Bonobo toolbar to
- prevent problems with disappearing toolbars. This is a kludge and
- should go away.
-
-
- * mail-ops.c (expunge_folder): display error from
- camel_folder_expunge if there is one.
-
- * message-list.c (select_row): install an idle function to
- select the row rather than doing it directly. Ugh. What a
- kludge, but at least it works now.
-
- * session.c (evolution_auth_callback): Update for
- CamelAuthCallback changes. (Uncache passwords when asked to.)
-
- * mail-ops.c (fetch_mail): close and expunge the source folder
- after copying it to a local folder.
-
-2000-06-09 Ettore Perazzoli <ettore@helixcode.com>
-
- * component-factory.c (create_view): Updated to match the changes
- to the definition of `EvolutionShellComponentCreateFn'. If @type
- is not "mail", return an "unsupported type" error.
- (factory_fn): Pass NULL for the `remove_folder' and
- `create_folder' functions.
-
-2000-06-09 Dan Winship <danw@helixcode.com>
-
- * mail-format.c: Redo things a bit so that whitespace-only
- text parts aren't displayed. (In particular, so that
- whitespace-only subparts of multipart/mixed aren't displayed as
- separate (empty) parts.)
-
-2000-06-06 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (fetch_mail):
- * folder-browser.c (folder_browser_load_folder): Update for folder
- creation/existence changes.
-
- * message-list.c (message_list_set_folder): Remove the code to
- create the folder if it doesn't exist, since we don't want to do
- that.
-
-2000-06-05 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (composer_send_cb): Leave the composer window around
- if the message doesn't get sent.
-
-2000-06-05 Matt Loper <matt@helixcode.com>
-
- * folder-browser.c (etable_key): Allow "GDK_KP_Delete", a keypad
- delete key, to delete a message.
-
-2000-06-05 Dan Winship <danw@helixcode.com>
-
- * session.c (evolution_auth_callback): Remember passwords between
- calls.
- (forget_passwords): Callback for "Forget Passwords" menu item.
-
- * folder-browser-factory.c (control_activate):
- (control_deactivate): Add "Forget Passwords" menu item.
-
- * mail.h, mail-ops.c: fix some function prototypes
-
- * folder-browser.c (etable_key): Add "Delete" = delete message.
-
- * mail-format.c (mail_generate_forward): Update for new composer
- attachment interface.
-
-2000-06-02 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config.c (providers_config_new): Added a new notebook
- page that allowed for mail format (text/plain or
- multipart/alternative)
-
-2000-06-02 Dan Winship <danw@helixcode.com>
-
- * message-list.c (filter_date): If the date in the summary is 0,
- output "?".
-
- * component-factory.c (create_view): keep a GList of folder
- browsers created
- (owner_unset_cb): Go through the list and close each folder before
- exiting so they sync their summary state, etc to disk.
-
- * mail-ops.c (fetch_mail): Use camel_service_connect, not
- connect_with_url, since we already passed the URL into
- camel_session_get_store.
-
-2000-06-02 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Use camel_folder_free_summary instead of
- g_ptr_array_free. Unref the folder when we're done with it.
-
-2000-06-02 Christopher James Lahey <clahey@helixcode.com>
-
- * session.c: Revert removal of e_setup_base_dir.
-
-2000-06-02 Dan Winship <danw@helixcode.com>
-
- * folder-browser.c (my_folder_browser_init): Connect to ETable's
- key_press signal.
- (etable_key): scroll mail on space/backspace.
-
-2000-06-02 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Made sent column as wide as from column.
-
-2000-06-02 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config.c (on_cmdSourcesAdd_clicked): Changed identity_row
- to source_row as this is a Sources clist we are dealing with and
- not an identity clist
- (on_cmdSourcesEdit_clicked): same
- (on_cmdSourcesDelete_clicked): again, same
- (on_cmdSourcesEdit_clicked): Source editor now fills in data from
- the clist
-
-2000-06-01 Dan Winship <danw@helixcode.com>
-
- * message-list.c: Add a date column.
- (COL_SENT_WIDTH_MIN): Make this wider.
- (ml_value_at): return the sent date (as a time_t) for COL_SENT.
- (Fix COL_TO too while I'm here.)
- (ml_duplicate_value, ml_free_value, ml_initialize_value,
- ml_value_is_empty): COL_SENT is numeric now.
- (message_list_init_renderers): Create a date renderer (using
- text_filter to translate the time_t into a string).
- (message_list_init_header): Use render_date for COL_SENT.
-
-2000-06-01 Christopher James Lahey <clahey@helixcode.com>
-
- * session.c: Don't call e_setup_base_dir.
-
-2000-06-01 Dan Winship <danw@helixcode.com>
-
- * mail-format.c (mail_generate_forward): Fix forwarding to work
- for people other than me. :) [Although apparently it doesn't
- really.]
-
- * mail-ops.c (delete_msg): Add a quick hack to move the selection
- down a row when you delete a message.
-
- * mail-format.c (handle_message_rfc822): use <blockquote> rather
- than <center><table border=1 width=95%> to frame the embedded
- message. If <pre> text in the subtable won't fit in the 95% width,
- GtkHTML will write past the border of the table (and
- <blockquote><table border=1> causes creeping updates so it's not
- usable for now).
-
-2000-06-01 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c (message_list_init): Turn off the grid in our
- ETable.
-
-2000-06-01 Dan Winship <danw@helixcode.com>
-
- * mail-format.c (write_headers): Oops. This needs to take a
- message argument because we might be writing headers for an
- embedded message/rfc822 subpart rather than the root document.
-
-2000-06-01 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config.c: Config dialogs are completed.
- (service_acceptable): Fixed a segfault caused by duplicate
- camel_exception_free()
- (providers_config_new): Identity and Source clists are now filled in
- when the dialog is created as well as the Transport page
-
- * folder-browser-factory.c: Renamed Tool/ menu items
- Vfolder was changed to Virtual Folder and
- Configure Camel Providers was changed to Mail Configuration
-
-2000-06-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am (evolution_mail_LDADD): Link with
- `libemiscwidgets.a'.
-
- * mail-display.c (mail_display_new): Use an EScrollFrame instead
- of a GtkScrolledWindow.
- (mail_display_set_message): Likewise.
-
- * mail-display.h: Replace the GtkScrolledWindow with an
- EScrollFrame.
-
-2000-06-01 Dan Winship <danw@helixcode.com>
-
- * component-factory.c (owner_unset_cb): Quit when the shell exits.
- This is a kludge, but a pretty necessary one until the refcounting
- bugs that keep the component from exiting properly are fixed.
-
-2000-05-31 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config.c: Partially implemented the source
- configuration, seems to segfault due to a destroyed
- gnome dialog being destroyed again in the method
- on_SourceConfigDialogButton_clicked()
-
-2000-05-31 Dan Winship <danw@helixcode.com>
-
- * mail-format.c (free_url, handle_text_enriched,
- get_url_for_icon): Fix up memory management of x-evolution-data
- URLs so the URLs and/or their data don't get freed while there are
- still references to them.
-
- * message-list.c (message_list_init_header): redo the (unused)
- online status column to no longer refer to pixmaps that no longer
- exist.
-
-2000-06-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * folder-browser-factory.c (control_activate): Put the toolbar
- into a frame to make it look like standard GNOME toolbars. Also,
- set `GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL' so that it does not do
- evil things when its moved to the left or the right of the window.
-
-2000-05-31 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail-config.c: Configuration dialog now allows
- adding/editing/deleting of Identities (which leaves
- adding/editing/deleting of sources left to implement).
- The data is also saved when the dialog is exited via
- the OK button.
-
-2000-05-31 Dan Winship <danw@helixcode.com>
-
- * mail-format.c (mail_format_mime_message): Initialize the "urls"
- hash table stored on the message and store cid and other URLs
- there rather than as object data on the message.
- (get_cid): rewrite this a bunch
- (handle_text_enriched): move the code from write_iframe_string()
- into here, since it's the only place that actually needs it.
- (handle_text_html): simplify this a lot. We can use a cid: URL
- here rather than x-evolution-data.
- (get_url_for_icon): New routine to return URLs for icons, and
- cache the results, so we don't have to keep re-reading the icon
- files (and so we can't be spoofed into reading non-icon files).
- (handle_mystery, handle_audio): use get_url_for_icon.
-
- * mail-display.c (save_data): move the CamelMimePart filename
- extracting code from get_cid to here.
- (on_link_clicked, on_object_requested): Update for cid: changes.
- (on_url_requested): Kill off the kludgy, exploitable x-gnome-icon
- URL schema, update cid and x-evolution-data to match
- mail-format.c.
-
- It should now be easier to implement RFC 2557 (Content-Location,
- etc), but that RFC still pretty much sucks.
-
-2000-05-30 Dan Winship <danw@helixcode.com>
-
- * mail-format.c: Redo this back to the old way: a single GtkHTML
- with various things inline in it. (Gets rid of flicker, simplifies
- some scrolling, selecting, and printing issues.)
- (handle_text_enriched, handle_text_html): Use <iframe>s for these,
- to protect the rest of the document from their possibily invalid
- HTML.
- (handle_via_bonobo): Use (new-and-improved) <object> tags for
- this, moving most of the work back into mail-display.c
-
- * mail-display.c (on_object_requested): Move the Bonobo embedding
- code back here again (reorganized a bit).
- (on_url_requested): add x-evolution-data handler, for iframe
- bodies.
- (mail_html_new, mail_html_end): removed
- (mail_display_set_message, mail_display_new): Update for NWO.
-
-2000-05-30 Not Zed <NotZed@HelixCode.com>
-
- * folder-browser.c (search_set): Properly encode the search string.
-
-2000-05-30 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail.h: Added a prototype for providers_config_new() which
- is the constructor for the configuration dialog window
-
- * mail-config.c: Added set_service_url() which is basically
- the reverse of get_service_url().
- Implemented on_cmdCamelServicesOK_clicked() - The configuration
- window will now remember the Sendmail/SMTP data that the user
- had entered in the previous session.
- Removed on_cmdCamelServicesApply_clicked() - No need for this.
-
-2000-05-30 Dan Winship <danw@helixcode.com>
-
- * message-list.c (message_changed): call
- e_table_model_row_changed, not e_table_model_changed so we do less
- work, and don't lose the current selection.
- (select_msg): Set up a timer to mark the displayed message as
- "seen" if it's selected for longer than 1.5 seconds (a number
- pulled out of Matt's butt).
- (ml_value_at): Use the MESSAGE_STATUS column for read/unread as
- well as deleted.
-
- * message-list.c: use the "new" tigert pixmaps rather than the
- older ones. Includes a "replied to" icon (which is used now), but
- no "deleted" icon (although we have the strikeout renderer for
- that now).
-
-2000-05-30 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c, message-list.h: Added bold for unread messages.
-
-2000-05-30 Jeffrey Stedfast <fejj@helixcode.com>
-
- * mail.h: Added a prototype for providers_config()
- which is the callback for a new menu item that
- will construct a configuration dialog for the camel
- providers and identities and display it
-
- * mail-config.c: Added some code to construct the
- new providers dialog and a bunch of callbacks (most
- of which are not yet useful)
-
- * mail-ops.c: Added the code for the providers_confi()
- callback
-
- * folder-browser-factory.c: Added the
- "Tools/Camel Providers Configuration ..." menu item
-
-2000-05-30 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Switched to using "cursor_change" signal instead
- of "row_selection" for switching messages. Select the first row
- (still doesn't work because of ETable.) Adapt to some small
- ETable changes. Set drawfocus to FALSE.
-
-2000-05-29 Not Zed <NotZed@HelixCode.com>
-
- * folder-browser.c (folder_browser_load_folder): Hardcode the
- vfolder source to just the inbox (so at least it returns
- something).
-
- * component-factory.c (create_test_storage): Create a vfolder dir
- first, and put the folders in that.
- (create_test_storage): Create the storage as VFolders, not
- "storage_name" :)
-
-2000-05-28 Dan Winship <danw@helixcode.com>
-
- * mail-config.c (error_dialog): helper function since we need to
- set "modal" on the dialogs returned by gnome_error_dialog to make
- them work when popped up from the modal Druid.
- (service_acceptable): New function to check if the info entered on
- a store/transport page actually checks out.
- (mail_config_druid): Connect to the "next" signal on the store and
- transport pages and don't let the user continue if the data is
- bad and "check this before continuing" is checked. Also, only
- display sources/transports in the "mail" domain. (Ie, not
- "vfolder".)
-
- * mail-format.c (write_recipients_to_stream): Use `foo@bar' rather
- than `<foo@bar>' for recipient with no name.
-
- * mail-ops.c (fetch_mail): don't put up an error message if the
- user cancels the password dialog.
-
-2000-05-27 Not Zed <NotZed@HelixCode.com>
-
- * Makefile.am (SHELL_OBJS): Include mail storage so we can
- initialise folders.
-
- * component-factory.c (create_test_storage): Parses vfolder
- defintions and adds them to the storage. Definetly needs more
- work.
-
- * folder-browser-factory.c (control_activate): Add the VFolder
- druid menu item.
- (control_deactivate): And remove it.
-
- * mail-ops.c (vfolder_editor_clicked): For editing vfolder
- definitions (rather like filters, oddly enough :). Tries to
- update the shell but it doesn't seem to work properly - requires a
- mail component restart to take effect.
-
- * folder-browser.c (folder_browser_load_folder): Handle vfolder:
- urls' appropriately and map to camel. Still needs a way to tell
- the vfolder what folders to search! (all vfolders come up empty!).
-
-2000-05-28 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c, message-list.h: Added a COL_DELETED and made it
- the strikeout column for both text renderers.
-
-2000-05-27 Dan Winship <danw@helixcode.com>
-
- * mail-format.c: Various improvements:
-
- (call_handler_function, etc): Add a "mime_type" argument to the
- handlers, so that if a part is tagged as
- "application/octet-stream", and we figure out that it's really
- something else, the handler we call can know what that something
- else is.
-
- (handle_text_enriched): Small fixes to make this not do
- text/enriched-specific syntax in text/richtext or vice versa.
-
- (handle_mystery): Allow for mystery data that can't even be saved
- to disk. (ie, unrecognized external-body). Let the caller specify
- the URL to use.
-
- (handle_message_external_body): New function to deal with
- message/external-body parts. Generates URLs for anon-ftp,
- local-file, and URL access-types, and a more-useful-than-before
- descriptive message for other types.
-
- (handle_audio, handle_undisplayable): Use gnome_mime_get_value to
- try to get a description of the MIME type to display to the user
- rather than the raw form. (This will only work if the user has
- recent gnome-vfs installed. [If they don't, it works just like
- it used to.])
-
-2000-05-26 Dan Winship <danw@helixcode.com>
-
- * mail-format.c (handle_text_html): Fix a bug (security/stability)
- in its usage of mail_html_write.
-
- * mail-ops.c (composer_send_cb, reply): set CAMEL_MESSAGE_ANSWERED
- on a message after a successful reply.
-
- * message-list.c (folder_changed): free the summary with
- camel_folder_free_summary rather than g_ptr_array_free.
-
- * mail-format.c (handle_via_bonobo): Update for PersistStream
- changes
-
-2000-05-25 Ettore Perazzoli <ettore@helixcode.com>
-
- * main.c (main): Initialize the component factory.
-
- * Makefile.am (evolution_mail_LDADD): Link with
- `evolution-shell-component.o' from the shell directory.
-
- * evolution-mail.oafinfo: Updated with the
- Evolution::ShellComponent OAFIID.
-
- * evolution-mail.gnorba: Updated with the
- Evolution::ShellComponent GOAD ID.
-
- * folder-browser-factory.c (folder_browser_factory_new_control):
- New function; code moved out from `folder_browser_factory'.
- (folder_browser_factory): Use it.
-
- * component-factory.c: New.
- * component-factory.h: New.
-
-2000-05-24 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (composer_send_cb): connect to and disconnect from
- the transport.
-
-2000-05-24 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added libepaned.a.
-
- * folder-browser.c: Switched from GtkPaned to EPaned.
-
-2000-05-23 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am: Don't link to `evolution-service-repository.o'
- anymore.
-
- * folder-browser-factory.c: Don't use crufty service-repository
- anymore.
-
-2000-05-21 Ettore Perazzoli <ettore@helixcode.com>
-
- * message-list.c (get_message_info): Made static.
- (ml_initialize_value): Return NULL to placate compiler.
-
- * folder-browser.c (folder_browser_gui_init): Add cast.
-
- * mail-display.c (mail_html_new): Don't pass an empty URL to
- `gtk_html_begin()' anymore.
-
- * mail-config.c (put_html): Don't pass an empty URL to
- `gtk_html_begin()' anymore.
-
- * mail-display.h: Updated for the new GtkHTML API that uses
- `GtkHTMLStream *' instead of `GtkHTMLStreamHandle'.
- * mail-display.c: Likewise.
- * mail-config.c: Likewise.
- * mail-format.c: Likewise.
-
-2000-05-19 NotZed <NotZed@HelixCode.com>
-
- * mail-format.c: Fixes for stream stuff.
-
- * mail-display.c (save_data_cb): Remove exception stuff on streams.
-
-2000-05-19 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Added initialize_value and value_is_empty
- callbacks.
-
-2000-05-18 Dan Winship <danw@helixcode.com>
-
- * folder-browser-factory.c (folder_browser_factory): Remove
- development_warning (moved to shell)
-
- * message-list.c (select_msg): Update for camel_folder_get_uids
- (folder_changed, message_list_set_folder): Update for
- camel_folder_get_summary
-
- * mail-ops.c (fetch_mail): Update for camel_folder_get_uids
-
-2000-05-17 Dan Winship <danw@helixcode.com>
-
- * mail-component.c: This seems to be cruft. Nuke it.
-
- * mail-display.c (save_data_cb, save_data, on_url_requested):
- * mail-format.c (handle_text_plain_flowed, handle_text_html):
- Use camel_data_wrapper_write_to_stream rather than
- camel_data_wrapper_get_output_stream.
-
-2000-05-16 NotZed <NotZed@HelixCode.com>
-
- * mail-ops.c (filter_edit): Function to bring up the filter editor.
- (filter_druid_clicked): Save/close dialogue.
- (fetch_mail): Apply filters to incoming mail ... *hold breath*
- If we are coming from a non-indexed/searchable/etc source, then
- copy it to an mbox first. When copying mail from an mbox source,
- dont remove it aftewards, open it for append, so partially
- filtered mail isn't lost.
-
- * Makefile.am (evolution_mail_LDADD): Added libfilter.
- (INCLUDES): Add EVOLUTION_DATADIR, and fix matt's brokeneditor(tm)
- for putting spaces instead of tabs in.
-
-2000-05-16 Christopher James Lahey <clahey@helixcode.com>
-
- * mail-format.c: Removed usage of bonobo_object_destroy.
-
-2000-05-14 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Updated to work with new ETable resizing.
-
-2000-05-12 NotZed <NotZed@HelixCode.com>
-
- * mail-ops.c (fetch_mail): Use 6 X's to mkstemp, as required by
- the man page, just a temp fix, this should probably change to a
- known filename.
-
-2000-05-11 Dan Winship <danw@helixcode.com>
-
- * folder-browser-factory.c (control_activate): Now that we depend
- on current gnome-libs we can make the toolbar detachable again.
-
-2000-05-11 Federico Mena Quintero <federico@helixcode.com>
-
- * folder-browser-factory.c (development_warning): Left-justify the
- message.
-
-2000-05-10 Christopher James Lahey <clahey@helixcode.com>
-
- * folder-browser-factory.c (development_warning): Made this dialog
- have fewer buttons.
-
-2000-05-10 Christopher James Lahey <clahey@helixcode.com>
-
- * folder-browser-factory.c (development_warning): New development
- warning text from Nat.
-
-2000-05-10 Larry Ewing <lewing@helixcode.com>
-
- * mail-config.c (html_new): only set the default background color
- if style is not NULL.
-
-2000-05-09 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Removed folder-browser-factory.h since it doesn't
- exist. Added mail-display.h, mail-types.h, pixmaps.h.
-
-2000-05-09 Matt Loper <matt@helixcode.com>
-
- * folder-browser-factory.c (control_activate): Remove "File->mail"
- menuitem.
-
- * mail-config.c (mail_config_druid): Fill in "blah blah blah".
-
-2000-05-09 Dan Winship <danw@helixcode.com>
-
- * folder-browser.c (folder_browser_load_folder): make this a
- little less kludgy. Use gnome_error_dialog rather than printf on
- errors.
-
- * mail-ops.c (fetch_mail): Fix to work with the new shell stuff...
- sorta. Will need more fixing later when the new shell framework is
- more done.
-
- * mail-config.c (finish): Call gnome_config_sync so the data
- actually gets written.
-
-2000-05-08 Dan Winship <danw@helixcode.com>
-
- * mail-display.c (save_data_cb):
- (on_url_requested): Update for CamelStream CamelException changes.
-
- * mail-format.c: Pass NULL for a CamelException in a bunch of
- places... the user will see that the data is not being displayed,
- and there's not a lot we can do, and none of these things should
- be failing anyway. Maybe fix this later.
-
-2000-05-07 NotZed <NotZed@HelixCode.com>
-
- * message-list.c (ml_value_at): Size moved to message info, rather
- than content info structure.
-
-2000-05-07 Dan Winship <danw@helixcode.com>
-
- * message-list.c (select_msg): unref the message after displaying
- it.
-
- * mail-format.c (get_data_wrapper_text):
- (handle_text_plain_flowed):
- (handle_via_bonobo): Replace camel_stream_close calls.
-
-2000-05-07 Matt Loper <matt@helixcode.com>
-
- * folder-browser-factory.c: Changed a toolbar button from saying
- "New mail" (which suggests you might be composing new mail) to
- "Get mail".
-
-2000-05-06 Dan Winship <danw@helixcode.com>
-
- * folder-browser-factory.c (folder_browser_factory): Don't
- hardcode "inbox" here.
-
- * folder-browser.c (folder_browser_set_uri): Don't hardcode
- "inbox" here either.
- (folder_browser_load_folder): Create a new store according to the
- folder browser's URI, and load the mbox file from that store.
- Parts of this are temporary.
-
- * session.c, mail.h: There is no longer a global store, just a
- global session.
-
- * mail-config.c, mail-ops.c: Update for default_session -> session
- change. fetch_mail is currently broken.
-
-2000-05-06 Dan Winship <danw@helixcode.com>
-
- * mail-config.c: New code to configure identity, mail source, and
- mail transport.
- (mail_config_druid): A druid using the config widgets. (Only
- allows configuration of a single identity, source, and transport.)
-
- * mail-ops.c (check_configured): New function to make sure the
- user has configured stuff, and call the druid if not.
- (fetch_mail, send_msg, send_to_url, reply, forward_msg): Call
- check_configured
- (composer_send_cb): Make this pass the message to a CamelTransport
- rather than just printing it to stdout.
-
- * folder-browser-factory.c (development_warning): Add a warning
- about sending mail, since you can do that now.
-
-2000-05-06 Chris Toshok <toshok@HelixCode.com>
-
- * .cvsignore: ignore evolution-mail.pure
-
- * Makefile.am: add support for building evolution-mail.pure
-
-2000-05-06 Dan Winship <danw@helixcode.com>
-
- * mail.h: consolidate mail-format.h, mail-identify.h, mail-ops.h,
- main.h and session.h into this new file. There's no reason to have
- a .h for every .c.
-
-2000-05-05 Anders Carlsson <andersca@gnu.org>
-
- * test-mail.c (create_container): Use the OAFIID when using an
- OAF-enabled build of bonobo.
-
-2000-05-04 NotZed <NotZed@HelixCode.com>
-
- * message-list.c (message_list_set_folder): Get the whole message
- summary right away.
- (folder_changed): And if we change too.
- (ml_row_count): Use the match count or summary table length as the
- row count.
- (get_message_info): Use array references to lookup message summary
- info. For the search result list, use the summary_search_cache to
- cache the info lookup.
- (message_list_init): Allocate the summary search cache.
- (message_list_destroy): Free the summary search cache and the
- summary table, if there is one to free.
- (message_list_set_search): Save the match count, and clear the
- summary search cache for reuse.
- (folder_changed): Re-retrieve the summary list if the folder has
- changed.
- (message_list_set_folder): Retrieve the summary list when opening
- the folder.
-
-2000-05-03 Jason Leach <leach@wam.umd.edu>
-
- * Makefile.am (evolution_mail_LDADD): s/-lunicode/$(UNICODE_LIBS)/
- in the LDADD section.
-
-2000-05-03 Dan Winship <danw@helixcode.com>
-
- * mail-format.c (write_recipients_to_stream, write_headers): Make
- the "Cc:" field optional again. (Before, we could check if
- camel_mime_message_get_recipients returned NULL, but now we need
- to actually look into the returned CamelInternetAddress object.)
-
-2000-05-03 Larry Ewing <lewing@helixcode.com>
-
- * folder-browser.c (folder_browser_gui_init): comment out the
- changed signal for now.
-
-2000-05-02 Matt Loper <matt@helixcode.com>
-
- * Makefile.am: set G_LOG_DOMAIN.
-
-2000-05-02 Larry Ewing <lewing@helixcode.com>
-
- * message-list.c (message_list_set_search): only free search if it
- is not NULL.
-
-2000-05-02 NotZed <NotZed@HelixCode.com>
-
- * folder-browser.c (folder_browser_gui_init): Connect the changed
- signal to search, so it searched immediately?
-
-2000-05-01 NotZed <NotZed@HelixCode.com>
-
- * pixmaps.h: Added envelope-deleted state.
-
- * folder-browser-factory.c: Setup callback for actual delete op.
- (control_activate): Setup a tool menu item to expnge deleted
- messages.
-
- * mail-ops.c (delete_msg): Toggle the delete flag on a message.
- (expunge_folder): New function to expunge deleted messages from
- the current folder.
-
- * folder-browser.c (folder_browser_gui_init): A hackish little
- quick-search entry.
- (search_activate): Perform a quick-search on the folder subject
- only.
- (folder_browser_gui_init): Add an option meny to the search line.
- (create_option_menu): Build the option menu from a table.
- (search_set): Build a search from another string whent he option
- menu or text item is changed. 5 search options are defined so
- far.
-
- * message-list.c (get_message_info): If there is an active search,
- then get the data from that ... use this instead of
- _get_message_info().
- (ml_row_count): If we have an active search, get the info from its
- result.
- (select_msg): Changed to use get_message_info, so searches work.
- (ml_value_at): And same here.
- (message_list_init_renderers): Added a 3rd state to message_status
- = deleted.
- (ml_value_at): Show the message state as deleted, if it is marked
- for deletion.
- (folder_changed): When the folder changes, update the display.
- (message_list_set_folder): Connect to the folder_changed event
- here.
- (message_changed): Callback to update the display when the message
- changes.
- (select_msg): And connect to the message_changed signal so we know
- when it cahgnes.
- (message_list_set_search): Save the search string.
- (folder_changed): If the folder changes, re-run the search,
- otherwise we may end up with invalid entries in the display.
-
- * mail-display.c: Include missing errno.h.
-
-2000-04-30 Dan Winship <danw@helixcode.com>
-
- * session.c (session_providers_init): This is no longer necessary.
-
- * mail-ops.c (fetch_mail): Remove kludge to load remote provider,
- as camel can do it by itself now.
-
-2000-04-29 Dan Winship <danw@helixcode.com>
-
- * mail-display.c (on_link_clicked): Handle clicks on "cid" URLs by
- popping up a "Save Attachment" dialog.
-
- * mail-format.c (get_cid): if the part has a Content-Disposition
- with a filename specified, record (a sanitized version of) that on
- the wrapper when creating the cid reference, so the "save
- attachment" code can use it later.
- (handle_mystery): fix a bug in the cid generation here.
-
-2000-04-29 Dan Winship <danw@helixcode.com>
-
- * mail-format.c (lookup_handler, etc): Improve the builtin vs
- bonobo selection code.
- (handle_mystery): Include name and Content-Description in the
- "mystery data" info, when available
- (handle_unknown_type): Call mail_identify_mime_part before
- giving up.
- (handle_undisplayable): Split out of handle_unknown_type now
- that handle_unknown_type can try alternate viewers.
- (handle_via_bonobo): Fall back to handle_undisplayable if the
- bonobo control fails.
-
- * mail-identify.c (mail_identify_mime_part): New function to
- attempt to identify a MIME part that we can't identify based on
- Content-Type alone.
-
- * mail-display.c (on_url_requested): redo the mystery data icon
- display stuff less kludgily.
-
-2000-04-28 Dan Winship <danw@helixcode.com>
-
- * mail-format.c (write_recipients_to_stream, write_headers,
- mail_generate_reply): Update (minimally) for Camel recipient
- changes.
-
-2000-04-28 Ettore Perazzoli <ettore@helixcode.com>
-
- * main.c (init_bonobo): Don't call `init_corba()' and don't get
- any args.
- (init_corba) [!USING_OAF]: Fix args.
-
-2000-04-27 Ettore Perazzoli <ettore@helixcode.com>
-
- * folder-browser-factory.c: New macro `CONTROL_FACTORY_ID', which
- is #defined to a different value according to whether we are
- `USING_OAF' or not.
- (folder_browser_factory_init): Use `CONTROL_FACTORY_ID'.
-
- * test-mail.c
- (init_corba): New helper function, implemented differently
- according to `USING_OAF'.
- (main): Use `init_corba()'.
-
- * main.c
- (init_corba): New helper function, implemented differently
- according to `USING_OAF'.
- (init_bonobo): Use `init_corba()'.
-
- * Makefile.am: Install OAF stuff if `USING_OAF'. Add
- `-I$(datadir)/idl' to the `orbit-idl' command-line so that we can
- use Bonobo IDL files installed under our prefix as well. Also,
- use `$(ORBIT_IDL)' instead of hardcoded `orbit-idl'.
-
- * evolution-mail.oafinfo: New file.
-
-2000-04-27 Dan Winship <danw@helixcode.com>
-
- * mail-format.c: Move text_to_html to e-util.
-
- * mail-ops.c (send_to_url): New routine. Thin wrapper for
- e_msg_composer_new_from_url.
-
- * mail-display.c (on_link_clicked): print a warning for news or
- nntp URLs (which we'll deal with some day), and call send_to_url
- for mailto URLs.
-
- * mail-format.c (text_to_html): Improve URL conversion code.
- Recognize https, recognize "www\..*" without a prefixed "http://".
- Properly escape &, <, >, etc in URL strings. Don't be fooled by
- "mailto:", "http://", etc with no following data.
-
-2000-04-26 Dan Winship <danw@helixcode.com>
-
- * mail-format.c (text_to_html): Reorganize a bit and add a new
- flag, TEXT_TO_HTML_CONVERT_URLS to recognize and wrap URLs
- in text.
-
- * mail-display.c (mail_html_new): Add link_clicked signal handler.
- (on_link_clicked): Use gnome_url_show to launch a browser.
-
- * mail-format.c: update for CamelStream changes. Update for
- CamelMimeBodyPart -> CamelMimePart
-
-2000-04-25 Dan Winship <danw@helixcode.com>
-
- * mail-display.c, mail-format.c: Redo large chunks of this. The
- mail display now consists of a vbox in a scrolled window, in which
- we put multiple GtkHTML objects. This means broken HTML in one
- part can't corrupt other parts. The headers now scroll with the
- body. Unrecognized attachments look prettier, but still don't do
- anything, and will probably be changed later. We can also now
- display nested message/rfc822 parts and multipart/alternatives
- with multipart subparts. Oh, and text/{richtext,enriched}, since
- we had all these ancient sample messages that use it and the lack
- of support annoyed me. :)
-
- Bonobo embeddables are broken right now, but I don't think that's
- my fault.
-
- * mail-format.c (reply_body): Fix some bugs that crept into reply
- generation. This needs a lot more work to deal correctly with
- complicated bodies.
- (setup_function_table): pass unknown text subtypes to
- handle_text_plain.
- (handle_multipart_appledouble): new handler. Just ignores the
- first (application/applefile) part and tries to display the
- second part. Since the second part is usually
- application/octet-stream, this doesn't work very well still
- usually.
- (reply_body): Make this deal better with multiparts.
-
- * mail-format.c, mail-display.c: Now that we're not limited to
- a single GtkHTML for the display, there's no reason to embed
- Bonobo objects for unrecognized content-types in GtkHTML rather
- than embedded them into the vbox directly. So do that.
-
- Meanwhile, fix up the handler-selection code so that we can
- declare which built-in handlers are more desirable than external
- handlers and which are less. (Of course, eventually we'll want
- this to be customizable.) Add some cleverness to
- handle_multipart_alternative as well so it doesn't accept an
- alternative which we can display generically over one we can
- display specifically.
-
- * mail-format.c (text_to_html): add a convert_space_hack flag,
- which turns N spaces into N-1 &nbsp;s and a space.
- (handle_text_plain): Check for "format=flowed" in the
- Content-Type.
- (handle_text_plain_flowed): Spinoff of handle_text_plain to deal
- with RFC 2646 flowed text. (All the examples I can find of it
- are generated by Eudora, but it's a pretty cool idea that ought
- to be used more widely.)
-
-2000-04-23 Dan Winship <danw@helixcode.com>
-
- * folder-browser-factory.c: rename "send" to "send_msg", to avoid
- name clash with the tcp function. Connect the "forward" button.
-
- * mail-ops.c: rename "send" to "send_msg", to avoid name clash
- with the tcp function. Add forward_msg function.
-
- * mail-format.c (mail_generate_forward): support function for
- forward_msg. Pretty much a big kludge right now, pending the
- attachment/attachment-bar changes.
-
-2000-04-22 Dan Winship <danw@helixcode.com>
-
- * mail-display.c (on_url_requested): Change cid expectations to
- match current camel reality.
-
- * main.c (main): call glade_gnome_init, for composer.
-
- * folder-browser-factory.c: move msg_composer_cb and
- msg_composer_send_cb to mail-ops. Attach send, reply, and "reply
- to all" buttons.
-
- * mail-ops.c (composer_send_cb, send): moved from
- folder-browser-factory.c.
- (reply_to_sender, reply_to_all): new functions to do replies.
-
- * mail-format.c (text_to_html): Add an "add_pre" flag, to make
- it wrap the output in <pre></pre>.
- (mail_generate_reply): New function to create a composer and build
- a reply in it.
-
-2000-04-21 Dan Winship <danw@helixcode.com>
-
- * mail-display.c (on_url_requested): deal with cid: URLs.
- (find_cid): helper routine for above. (This could be much better.)
- (mail_display_init): connect url_requested signal
-
- * mail-format.c (handle_multipart_related): Make this work.
-
- * mail-display.c (mail_display_set_message): ref the message we
- display, since we're going to unref it when we remove it. Fixes a
- bug that showed up with the new camel code, but it's not obvious
- if it's due to a bug or a feature in the new code.
-
-2000-04-20 NotZed <NotZed@HelixCode.com>
-
- * Makefile.am (evolution_mail_LDADD): Add libibex.la to link.
-
- * message-list.h: Removed folder summary.
-
- * message-list.c: Dont include folder-summary anymore.
- (select_msg): Changed to use folder, not summary in
- summary_get_message_info(). God this code is grotty.
- (ml_value_at): Ditto.
- (ml_value_at): Changed to use new interface. Hmm, this returns a
- static variable, that seems wrong.
- (message_list_set_folder): Remove folder summary.
- (ml_row_count): Oops, remove some debug i put there.
-
-2000-04-20 Dan Winship <danw@helixcode.com>
-
- * mail-display.c: update for bonobo change, and remove a
- now-unused variable.
-
-2000-04-17 Chris Toshok <toshok@helixcode.com>
-
- * message-list.c (on_row_selection_idle): new function, actually
- calls select_msg.
- (on_row_selection_cmd): register an idle instead of calling
- select_msg directly. this fixes the lag before the row is
- selected - selection is instantaneous now, with message loading
- happening afterward.
-
- * message-list.h: add row_to_select and an idle_id to the message
- list to make the select_msg call happen in an idle func.
-
- * message-list.c (message_list_init_renderers): no more
- e_cell_set_editable. this info always comes from the model.
-
-2000-04-14 Dan Winship <danw@helixcode.com>
-
- * mail-format.[ch]: Moved from camel/camel-formatter, and changed
- slightly. (More to come.)
-
- * html-stream.[ch]: No longer necessary. mail-format uses
- GtkHTMLStreamHandles directly.
-
- * mail-display.[ch]: update for new message formatting code.
-
-2000-04-14 Chris Toshok <toshok@helixcode.com>
-
- * folder-browser-factory.c (control_activate): use
- gnome_app_fill_toolbar_with_data, so we get the beautiful gnome
- toolbar.
-
-2000-04-14 Dan Winship <danw@helixcode.com>
-
- * folder-browser-factory.c (development_warning): Fix up the
- warning message a bit.
- (folder_browser_factory): Make the warning bypassable.
-
-2000-04-12 Miguel de Icaza <miguel@gnu.org>
-
- * main.c (main): Call e_cursors_init.
-
-2000-04-10 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c (fetch_mail): use camel_movemail when fetching mail
- from an mbox store. This leaves behind temp files for now,
- because CamelMboxFolder::delete is too confused to use, and NotZed
- is rewriting CamelMboxFolder, so I'm not going to bother to try to
- fix it.
-
- * mail-ops.c: Add some #includes for the non-HAVE_MKSTEMP case
-
-2000-04-09 Matt Loper <matt@helixcode.com>
-
- * folder-browser.c (folder_browser_new): set folder_browser->uri
- to NULL, so that we know when to free it.
-
-2000-04-07 Miguel de Icaza <miguel@gnu.org>
-
- * message-list.c (states_pixmaps): Add more beautiful art from
- Miggue, the Diego Rivera of the next millenium.
- (message_list_init_header): Use the beautiful art.
-
- * pixmaps: Miguel rediscovers the "transparent" concept.
-
-2000-04-07 Matt Loper <matt@helixcode.com>
-
- * folder-browser.c (folder_browser_destroy): Unref the shell
- interface that we have a handle to.
-
- * folder-browser-factory.c (control_destroy_cb): New function;
- destroys a folder-browser when its control is destroyed.
- (folder_browser_factory): Hook up to the above.
-
-2000-04-07 Dan Winship <danw@helixcode.com>
-
- * mail-ops.c: new file, for toolbar/menu callbacks
- (fetch_mail): fetch mail. Doesn't do mbox locking. Many kludges.
-
- * folder-browser-factory.c (control_activate): use new fetch_mail
- function as the callback for the "New mail" icon. Rename check_cb
- to random_cb.
-
- * Makefile.am: don't build test-sources since the version in
- CVS doesn't do much and once I've fixed it it won't be a separate
- program. Add mail-ops.[ch].
-
-2000-04-06 Miguel de Icaza <miguel@gnu.org>
-
- * message-list.c: Stick pixmaps here.
-
- * mail-display.c (embeddable_destroy_cb): Replaced C++ comments
- with C comments.
-
- * message-list.c (load_internal_images): New function, loads images.
- (message_list_init_renderers): Load images, fix previous attempt
- at loading images.
-
- * Makefile.am (dist-hook): Added distribution of pixmaps.
-
- * pixmaps: New directory, used to hold the XPMs we ship with.
-
- * pixmaps/envelope-closed.xpm, pixmaps/envelope-open.xpm: Tigert's
- envelopes incorporated.
-
-2000-03-31 Miguel de Icaza <miguel@gnu.org>
-
- * message-list.c (ml_value_at): Fix miss-used variable.
-
-2000-04-01 Michael Meeks <michael@helixcode.com>
-
- * folder-browser.c (folder_browser_properties_init): update to
- new property (folder_browser_property_changed): kill.
- (get_prop, set_prop): do the donkey work + make properly RW.
-
-2000-03-31 Dan Winship <danw@helixcode.com>
-
- * folder-browser-factory.c (folder_browser_set_shell):
- * folder-browser.c (folder_browser_new):
- * message-list.c (on_row_selection_cmd, select_msg,
- message_list_init, message_list_set_folder):
-
- remove debugging printf()s that no longer seem useful
-
-2000-03-29 Dan Winship <danw@helixcode.com>
-
- * folder-browser-factory.c (control_activate): build a toolbar.
- (control_deactivate): and hide it.
-
-2000-03-27 Chris Toshok <toshok@helixcode.com>
- * mail-display.c: quiet warnings when building in ../po
-
-2000-03-26 Miguel de Icaza <miguel@gnu.org>
-
- * folder-browser-factory.c (folder_browser_set_shell): Memory leak
- fix.
-
-2000-03-25 Dan Winship <danw@helixcode.com>
-
- * message-list.c (select_msg, ml_value_at): update for summary
- changes. Hey, neat, it really does make it more efficient.
-
-2000-03-22 Christopher James Lahey <clahey@helixcode.com>
-
- * .cvsignore: Updated .cvsignore.
-
-2000-03-21 Matt Loper <matt@helixcode.com>
-
- * mail-display.c: Minor cleanup & commenting.
-
- * folder-browser-factory.c: Minor cleanup & warning elimination.
-
-2000-03-21 bertrand <bertrand@helixcode.com>
-
- * message-list.c (ml_value_at): display message size
-
-2000-03-20 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Properly ref & sink the table and header models.
-
-2000-03-14 Dan Winship <danw@helixcode.com>
-
- * mail-sources.c: First cut at a mail source selection wizard.
- Basically a rigged demo at this point. Doesn't use camel to get
- its information, and is not yet complete or integrated with the
- mail component. Did I mention that the code is ugly?
-
-2000-03-13 bertrand <bertrand@helixcode.com>
-
- * folder-browser-factory.c (folder_browser_set_shell):
- for testing and demonstration purpose, immediately
- register a fake service.
-
-2000-03-12 bertrand <bertrand@helixcode.com>
-
- * folder-browser-factory.c (folder_browser_factory_init):
- name change.
- (control_activate_cb): when the control is activated,
- it merges its own UI with the remote UIHandler.
- (control_add_menu): sample menu merging.
- (folder_browser_factory): connect the control "activate" signal.
-
- * evolution-mail.gnorba:
- name changes
-
- * folder-browser.h: added a reference to an
- Evolution::Shell object.
-
- * folder-browser-factory.c (folder_browser_set_shell):
- (folder_browser_control_add_service_repository_interface):
- (folder_browser_factory): the folder-browser control now
- implements the Evolution/ServiceRepository interface.
-
-2000-03-07 bertrand <bertrand@helixcode.com>
-
- * folder-browser-factory.c (development_warning):
- added a warning so that the user knows that this
- version may crash his mails.
-
-2000-03-05 bertrand <bertrand@helixcode.com>
-
- * message-list.h: include a referrence to the parent
- folder browser.
-
- * message-list.c (ml_value_at): use the message summary
- from the
-
- * html-stream.c (html_stream_close): when the stream
- is closed, set the html stream to NULL
- (html_stream_write): don't write anything if the
- html handle does not exist.
- (html_stream_reset): implemented. close the current
- html handle and begins a new html parser.
-
- * session.c (session_store_new): use static exception
- here.
-
-2000-03-05 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Added a prototype message listing.
-
-2000-03-04 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Set up the column headers properly.
-
- * folder-browser.c: Show the folder_browser widget.
-
-2000-03-04 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Define ml_duplicate_value and ml_free_value
- correctly.
-
-2000-03-04 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Use g_int_compare and g_str_compare as we should
- be instead of g_int_equal and g_str_equal.
-
-2000-03-04 bertrand <bertrand@helixcode.com>
-
- * test-mail.c (main): replace the bonobo-active/gtk-main
- by bonobo-main.
- Include Gnorba headers.
- (main): don't call the container creation routine
- before we entered the main loop. Use idle for that.
-
-2000-03-04 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Change this to use the ETable widget itself
- instead of building it from all the parts.
-
-2000-03-03 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Ref the table columns since we unref them at the
- end.
-
-2000-03-01 Ettore Perazzoli <ettore@helixcode.com>
-
- * Makefile.am (INCLUDES): Add `$(top_srcdir)'. Also, the
- `top_srcdir' includes must come first everything else to avoid
- including installed headers instead of our fresh ones.
-
-2000-02-28 NotZed <NotZed@HelixCode.com>
-
- * Makefile.am (evolution_mail_LDADD): Fixed references to eutil.
-
-2000-02-24 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Changed to match new e_table_simple interface.
-
-2000-02-24 Dan Winship <danw@helixcode.com>
-
- * message-list.c (message_list_set_folder): update for CamelFolder
- changes
-
-2000-02-24 Christopher James Lahey <clahey@helixcode.com>
-
- * message-list.c: Changed this to not use the "x" and "y"
- arguments to e-table-item.
-
-2000-02-23 Matt Loper <matt@helixcode.com>
-
- * message-list.c (message_list_set_folder): Check 'desc'riptions
- of exceptions.
-
-2000-02-22 bertrand <Bertrand.Guiheneuf@aful.org>
-
- * message-list.c (message_list_set_folder):
- fix to show a sample correct implementation.
-
-2000-02-21 Matt Loper <matt@helixcode.com>
-
- * Makefile.am: added -lunicode to evolution_mail_LDADD.
-
-2000-02-21 Dan Winship <danw@helixcode.com>
-
- * session.c (session_store_new): Pass a CamelAuthCallback
- (evolution_auth_callback) to camel_session_new.
-
-2000-02-21 Dan Winship <danw@helixcode.com>
-
- * session.c (session_store_new): Update session_store_new to
- deal with the fact that camel_session_get_store takes a
- CamelException now. Doesn't actually do anything with the
- exception yet, because nothing else does yet either.
-
-2000-02-19 Matt Loper <matt@helixcode.com>
-
- * .cvsignore: added test-mail.
-
-2000-02-14 Miguel de Icaza <miguel@gnu.org>
-
- * folder-browser.c (folder_browser_load_folder): New routine,
- loads a camel folder.
- (folder_browser_set_uri): redo.
-
- * session.c: new file. Implements SessionStores to keep track of
- a Session/Store tuple.
-
-2000-02-13 Matt Loper <matt@helixcode.com>
-
- * html-stream.c (html_stream_new): Second param of gtk_html_begin
- should be "", not NULL.
- (html_stream_new): gtk_html_parse() is deprecated, so the call was
- removed.
-
- * html-stream.h: HTMLStreamClass's parent changed to
- CamelStreamClass, not CamelStream.
-
-2000-02-11 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Add the e-text directory to the includes list.
-
- * message-list.c: Change the call to e_cell_text_new, since
- there's an added argument.
-
-2000-02-09 Christopher James Lahey <clahey@helixcode.com>
-
- * Makefile.am: Added libetext as libetable depends on it.
-
-2000-02-08 Iain Holmes <ih@csd.abdn.ac.uk>
-
- * Makefile.am: Changed the order of the compilation so the CORBA stuff
- was made before it was needed.
-
-2000-01-19 Miguel de Icaza <miguel@gnu.org>
-
- * Started work on the mail display engine.
-
- * html-stream.c, html-stream.h: New files, they are CamelStreams
- used to write to the GtkHTML widget.
-
diff --git a/mail/GNOME_Evolution_Mail.server.in.in b/mail/GNOME_Evolution_Mail.server.in.in
deleted file mode 100644
index d313817c5c..0000000000
--- a/mail/GNOME_Evolution_Mail.server.in.in
+++ /dev/null
@@ -1,166 +0,0 @@
-<oaf_info>
-
- <!-- Folder display control -->
-
- <!-- (factory) -->
- <oaf_server iid="OAFIID:GNOME_Evolution_Mail_Factory:@VERSION@"
- type="shlib"
- location="@COMPONENTDIR@/libevolution-mail.so">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/ObjectFactory:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution Mail"/>
- </oaf_server>
-
- <!-- Component Interface -->
-
- <oaf_server iid="OAFIID:GNOME_Evolution_Mail_Component:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Mail_Factory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution/Component:@VERSION@"/>
- </oaf_attribute>
-
- <oaf_attribute name="name" type="string" _value="Evolution Mail component"/>
-
- <oaf_attribute name="evolution:component_alias" type="string" value="mail"/>
-
- <oaf_attribute name="evolution:menu_label" type="string" _value="_Mail"/>
- <oaf_attribute name="evolution:menu_accelerator" type="string" value="*Control*F1"/>
- <oaf_attribute name="evolution:button_label" type="string" _value="Mail"/>
- <oaf_attribute name="evolution:button_sort_order" type="string" value="-10"/>
- <oaf_attribute name="evolution:button_icon" type="string" value="stock_mail"/>
-
- <oaf_attribute name="evolution:component_icon" type="string" value="stock_mail"/>
- <oaf_attribute name="evolution:component_display_order" type="number" value="1"/>
-
- <oaf_attribute name="evolution:uri_schemas" type="stringv">
- <item value="mailto"/>
- <item value="email"/>
- </oaf_attribute>
- </oaf_server>
-
- <!-- Shell Component -->
-
- <oaf_server iid="OAFIID:GNOME_Evolution_Mail_ShellComponent:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Mail_ControlFactory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution/ShellComponent:@VERSION@"/>
- </oaf_attribute>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution Mail component"/>
-
- <oaf_attribute name="evolution:shell_component_icon" type="string"
- value="stock_mail"/>
- <oaf_attribute name="evolution:shell_component_launch_order" type="number"
- value="1"/>
- </oaf_server>
-
- <!-- Message composer -->
-
- <!-- (composer) -->
- <oaf_server iid="OAFIID:GNOME_Evolution_Mail_Composer:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Mail_Factory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution:Composer:@VERSION@"/>
- <item value="IDL:Bonobo/ItemContainer:1.0"/>
- </oaf_attribute>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution Mail composer"/>
- </oaf_server>
-
- <!-- Configuration pages -->
-
- <!-- Account Editor -->
- <oaf_server iid="OAFIID:GNOME_Evolution_Mail_AccountPrefs_ConfigControl:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Mail_Factory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution/ConfigControl:@VERSION@"/>
- </oaf_attribute>
-
- <oaf_attribute name="evolution2:config_item:title" type="string"
- _value="Mail Accounts"/>
-
- <oaf_attribute name="evolution2:config_item:description" type="string"
- _value="Configure your email accounts here"/>
-
- <oaf_attribute name="evolution2:config_item:icon_name" type="string"
- value="stock_people"/>
-
- <oaf_attribute name="evolution2:config_item:type" type="stringv">
- <item value="mail"/>
- </oaf_attribute>
-
- <oaf_attribute name="evolution2:config_item:priority" type="string" value="-10"/>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution Mail accounts configuration control"/>
-
- </oaf_server>
-
- <!-- Mailer Preferences -->
- <oaf_server iid="OAFIID:GNOME_Evolution_Mail_MailerPrefs_ConfigControl:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Mail_Factory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution/ConfigControl:@VERSION@"/>
- </oaf_attribute>
-
- <oaf_attribute name="evolution2:config_item:title" type="string"
- _value="Mail Preferences"/>
-
- <oaf_attribute name="evolution2:config_item:description" type="string"
- _value="Configure mail preferences, including security and message display, here"/>
-
- <oaf_attribute name="evolution2:config_item:icon_name" type="string"
- value="stock_mail"/>
-
- <oaf_attribute name="evolution2:config_item:priority" type="string" value="-9"/>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution Mail preferences control"/>
-
- </oaf_server>
-
- <!-- Composer Preferences -->
- <oaf_server iid="OAFIID:GNOME_Evolution_Mail_ComposerPrefs_ConfigControl:@VERSION@"
- type="factory"
- location="OAFIID:GNOME_Evolution_Mail_Factory:@VERSION@">
-
- <oaf_attribute name="repo_ids" type="stringv">
- <item value="IDL:GNOME/Evolution/ConfigControl:@VERSION@"/>
- </oaf_attribute>
-
- <oaf_attribute name="evolution2:config_item:title" type="string"
- _value="Composer Preferences"/>
-
- <oaf_attribute name="evolution2:config_item:description" type="string"
- _value="Configure spell-checking, signatures, and the message composer here"/>
-
- <oaf_attribute name="evolution2:config_item:icon_name" type="string"
- value="stock_mail-compose"/>
-
- <oaf_attribute name="evolution2:config_item:priority" type="string" value="-8"/>
-
- <oaf_attribute name="name" type="string"
- _value="Evolution Mail composer configuration control"/>
-
- </oaf_server>
-
-</oaf_info>
-
-
-
diff --git a/mail/Makefile.am b/mail/Makefile.am
deleted file mode 100644
index 78ce20e60f..0000000000
--- a/mail/Makefile.am
+++ /dev/null
@@ -1,293 +0,0 @@
-SUBDIRS = default importers
-
-INCLUDES = \
- -I$(top_srcdir)/widgets \
- -I$(top_srcdir)/widgets/e-text \
- -I$(top_srcdir)/widgets/misc \
- -I$(top_srcdir) \
- -I$(top_srcdir)/composer \
- -I$(top_builddir)/composer \
- -I$(top_builddir)/shell \
- -I$(top_srcdir)/shell \
- -I$(top_srcdir)/shell/importer \
- -I$(top_builddir)/shell/importer \
- -I$(top_srcdir)/smime/lib \
- -I$(top_srcdir)/smime/gui \
- $(EVOLUTION_MAIL_CFLAGS) \
- $(CERT_UI_CFLAGS) \
- -DEVOLUTION_DATADIR=\""$(datadir)"\" \
- -DEVOLUTION_PRIVDATADIR=\""$(privdatadir)"\" \
- -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
- -DEVOLUTION_ETSPECDIR=\""$(etspecdir)"\" \
- -DEVOLUTION_ICONSDIR=\""$(imagesdir)"\" \
- -DEVOLUTION_IMAGES=\""$(imagesdir)"\" \
- -DEVOLUTION_GALVIEWSDIR=\""$(viewsdir)"\" \
- -DEVOLUTION_BUTTONSDIR=\""$(buttonsdir)"\" \
- -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \
- -DEVOLUTION_UIDIR=\""$(evolutionuidir)"\" \
- -DCAMEL_PROVIDERDIR=\""$(camel_providerdir)"\" \
- -DPREFIX=\""$(prefix)"\" \
- -DG_LOG_DOMAIN=\"evolution-mail\"
-
-component_LTLIBRARIES = libevolution-mail.la
-
-# Code generation for Spell.idl
-
-SPELL_IDL = Spell.idl
-
-SPELL_IDL_GENERATED_H = \
- Spell.h
-SPELL_IDL_GENERATED_C = \
- Spell-common.c \
- Spell-skels.c \
- Spell-stubs.c
-SPELL_IDL_GENERATED = $(SPELL_IDL_GENERATED_C) $(SPELL_IDL_GENERATED_H)
-
-$(SPELL_IDL_GENERATED_H): $(SPELL_IDL)
- $(ORBIT_IDL) -I $(srcdir) -I $(datadir)/idl $(IDL_INCLUDES) $(srcdir)/Spell.idl
-$(SPELL_IDL_GENERATED_C): $(SPELL_IDL_GENERATED_H)
-
-Spell-impl.o: Spell.h
-
-
-# libevolution-mail
-
-libevolution_mail_la_SOURCES = \
- $(SPELL_IDL_GENERATED) \
- $(MARSHAL_GENERATED) \
- e-searching-tokenizer.c \
- e-searching-tokenizer.h \
- em-account-editor.c \
- em-account-editor.h \
- em-account-prefs.c \
- em-account-prefs.h \
- em-composer-prefs.c \
- em-composer-prefs.h \
- em-composer-utils.c \
- em-composer-utils.h \
- em-config.c \
- em-config.h \
- em-event.c \
- em-event.h \
- em-filter-context.c \
- em-filter-context.h \
- em-filter-editor.c \
- em-filter-editor.h \
- em-filter-folder-element.c \
- em-filter-folder-element.h \
- em-filter-rule.c \
- em-filter-rule.h \
- em-filter-source-element.c \
- em-filter-source-element.h \
- em-folder-browser.c \
- em-folder-browser.h \
- em-folder-properties.c \
- em-folder-properties.h \
- em-folder-selection-button.c \
- em-folder-selection-button.h \
- em-folder-selection.c \
- em-folder-selection.h \
- em-folder-selector.c \
- em-folder-selector.h \
- em-folder-tree-model.c \
- em-folder-tree-model.h \
- em-folder-tree.c \
- em-folder-tree.h \
- em-folder-view.c \
- em-folder-view.h \
- em-format-hook.c \
- em-format-hook.h \
- em-format-html-display.c \
- em-format-html-display.h \
- em-format-html-print.c \
- em-format-html-print.h \
- em-format-html.c \
- em-format-html.h \
- em-format-quote.c \
- em-format-quote.h \
- em-format.c \
- em-format.h \
- em-html-stream.c \
- em-html-stream.h \
- em-icon-stream.c \
- em-icon-stream.h \
- em-inline-filter.c \
- em-inline-filter.h \
- em-junk-filter.c \
- em-junk-filter.h \
- em-junk-plugin.c \
- em-junk-plugin.h \
- em-mailer-prefs.c \
- em-mailer-prefs.h \
- em-menu.c \
- em-menu.h \
- em-message-browser.c \
- em-message-browser.h \
- em-migrate.c \
- em-migrate.h \
- em-popup.c \
- em-popup.h \
- em-search-context.c \
- em-search-context.h \
- em-stripsig-filter.c \
- em-stripsig-filter.h \
- em-subscribe-editor.c \
- em-subscribe-editor.h \
- em-sync-stream.c \
- em-sync-stream.h \
- em-utils.c \
- em-utils.h \
- em-vfolder-context.c \
- em-vfolder-context.h \
- em-vfolder-editor.c \
- em-vfolder-editor.h \
- em-vfolder-rule.c \
- em-vfolder-rule.h \
- em-vfs-stream.c \
- em-vfs-stream.h \
- mail-autofilter.c \
- mail-autofilter.h \
- mail-component-factory.c \
- mail-component.c \
- mail-component.h \
- mail-config-factory.c \
- mail-config-factory.h \
- mail-config.c \
- mail-config.h \
- mail-crypto.c \
- mail-crypto.h \
- mail-folder-cache.c \
- mail-folder-cache.h \
- mail-mt.c \
- mail-mt.h \
- mail-offline-handler.c \
- mail-offline-handler.h \
- mail-ops.c \
- mail-ops.h \
- mail-send-recv.c \
- mail-send-recv.h \
- mail-session.c \
- mail-session.h \
- mail-signature-editor.c \
- mail-signature-editor.h \
- mail-tools.c \
- mail-tools.h \
- mail-types.h \
- mail-vfolder.c \
- mail-vfolder.h \
- message-list.c \
- message-list.h \
- message-tag-editor.c \
- message-tag-editor.h \
- message-tag-followup.c \
- message-tag-followup.h
-
-if ENABLE_SMIME
-SMIME_LIB=$(top_builddir)/smime/gui/libevolution-smime.la
-endif
-
-libevolution_mail_la_LIBADD = \
- $(top_builddir)/shell/importer/libevolution-importer.la \
- $(top_builddir)/mail/importers/libevolution-mail-importers.la\
- $(top_builddir)/e-util/libeutil.la \
- $(top_builddir)/shell/libeshell.la \
- $(top_builddir)/composer/libcomposer.la \
- $(top_builddir)/widgets/misc/libemiscwidgets.la \
- $(top_builddir)/widgets/misc/libefilterbar.la \
- $(top_builddir)/filter/libfilter.la \
- $(top_builddir)/widgets/menus/libmenus.la \
- $(top_builddir)/addressbook/util/libeabutil.la \
- $(top_builddir)/addressbook/gui/contact-editor/libecontacteditor.la \
- $(top_builddir)/addressbook/gui/contact-list-editor/libecontactlisteditor.la \
- $(SMIME_LIB) \
- $(EVOLUTION_MAIL_LIBS)
-
-libevolution_mail_la_LDFLAGS = \
- -avoid-version -module
-
-libevolution_mail_la_DEPENDENCIES = em-filter-i18n.h
-
-# .server files
-
-server_in_files = GNOME_Evolution_Mail.server.in.in
-server_DATA = $(server_in_files:.server.in.in=_$(BASE_VERSION).server)
-@EVO_SERVER_RULE@
-@INTLTOOL_SERVER_RULE@
-
-# Misc data to install
-filterdir = $(privdatadir)
-filter_DATA = filtertypes.xml vfoldertypes.xml searchtypes.xml
-
-error_DATA = mail-errors.xml
-error_i18n = $(error_DATA:.xml=.xml.h)
-errordir = $(privdatadir)/errors
-%.xml.h: %.xml
- $(top_builddir)/e-util/e-error-tool $^
-
-em-filter-i18n.h: filtertypes.xml vfoldertypes.xml searchtypes.xml
- echo "/* Automatically generated. Do not edit. */" > $@; \
- cat $(srcdir)/filtertypes.xml $(srcdir)/vfoldertypes.xml $(srcdir)/searchtypes.xml | \
- sed -n -e 's:.*<title>\(.*\)</title>:char *s = N_("\1");:p' | \
- sort -u >> $@
-
-glade_DATA = mail-config.glade mail-dialogs.glade
-MARSHAL_GENERATED = em-marshal.c em-marshal.h
-@EVO_MARSHAL_RULE@
-
-etspec_DATA = message-list.etspec
-
-EXTRA_DIST = \
- ChangeLog.pre-1-4 \
- em-marshal.list \
- $(SPELL_IDL) \
- $(error_DATA) \
- $(error_i18n) \
- $(glade_DATA) \
- $(schema_in_files) \
- $(server_in_files) \
- $(etspec_DATA) \
- filtertypes.xml \
- vfoldertypes.xml \
- searchtypes.xml \
- em-filter-i18n.h
-
-# Purify support
-
-if ENABLE_PURIFY
-PLINK = $(LIBTOOL) --mode=link $(PURIFY) $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-
-all-local: evolution-mail.pure
-
-evolution-mail.pure: evolution-mail
- @rm -f evolution-mail.pure
- $(PLINK) $(evolution_mail_LDFLAGS) $(evolution_mail_OBJECTS) $(evolution_mail_LDADD) $(LIBS)
-
-endif
-
-
-# GConf
-
-schemadir = $(GCONF_SCHEMA_FILE_DIR)
-schema_in_files = evolution-mail.schemas.in.in
-schema_DATA = $(schema_in_files:.schemas.in.in=-$(BASE_VERSION).schemas)
-%-$(BASE_VERSION).schemas.in: %.schemas.in.in
- cp $< $@
-
-@INTLTOOL_SCHEMAS_RULE@
-
-install-data-local:
- if test -z "$(DESTDIR)" ; then \
- for p in $(schema_DATA) ; do \
- GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $$p; \
- done \
- fi
-
-
-# Prologue
-
-dist-hook:
- cd $(distdir); rm -f $(BUILT_SOURCES)
-
-BUILT_SOURCES = $(SPELL_IDL_GENERATED) $(MARSHAL_GENERATED) $(server_DATA) $(error_i18n)
-
-CLEANFILES = $(BUILT_SOURCES)
diff --git a/mail/README.async b/mail/README.async
deleted file mode 100644
index 3966b3a97b..0000000000
--- a/mail/README.async
+++ /dev/null
@@ -1,366 +0,0 @@
-*******
-This document is absurdly, obscenely out of date. Don't read it.
-
- -- Peter Williams 7/2/2001
-*******
-
-Asynchronous Mailer Information
-Peter Williams <peterw@helixcode.com>
-8/4/2000
-
-1. INTRODUCTION
-
-It's pretty clear that the Evolution mailer needs to be asynchronous in
-some manner. Blocking the UI completely on IMAP calls or large disk reads
-is unnacceptable, and it's really nice to be able to thread the message
-view in the background, or do other things while a mailbox is downloading.
-
-The problem in making Evolution asynchronous is Camel. Camel is not
-asynchronous for a few reasons. All of its interfaces are synchronous --
-calls like camel_store_get_folder, camel_folder_get_message, etc. can
-take a very long time if they're being performed over a network or with
-a large mbox mailbox file. However, these functions have no mechanism
-for specifying that the operation is in progress but not complete, and
-no mechanism for signaling when to operation does complete.
-
-2. WHY I DIDN'T MAKE CAMEL ASYNCHRONOUS
-
-It seems like it would be a good idea, then, to rewrite Camel to be
-asynchonous. This presents several problems:
-
- * Many interfaces must be rewritten to support "completed"
- callbacks, etc. Some of these interfaces are connected to
- synchronous CORBA calls.
- * Everything must be rewritten to be asynchonous. This includes
- the CamelStore, CamelFolder, CamelMimeMessage, CamelProvider,
- every subclass thereof, and all the code that touches these.
- These include the files in camel/, mail/, filter/, and
- composer/. The change would be a complete redesign for any
- provider implementation.
- * All the work on providers (IMAP, mh, mbox, nntp) up to this
- point would be wasted. While they were being rewritten
- evolution-mail would be useless.
-
-However, it is worth noting that the solution I chose is not optimal,
-and I think that it would be worthwhile to write a libcamel2 or some
-such thing that was designed from the ground up to work asynchronously.
-Starting fresh from such a design would work, but trying to move the
-existing code over would be more trouble than it's worth.
-
-3. WHY I MADE CAMEL THREADED
-
-If Camel was not going to be made asynchronous, really the only other
-choice was to make it multithreaded. [1] No one has been particularly
-excited by this plan, as debugging and writing MT-safe code is hard.
-But there wasn't much of a choice, and I believed that a simple thread
-wrapper could be written around Camel.
-
-The important thing to know is that while Camel is multithreaded, we
-DO NOT and CANNOT share objects between threads. Instead,
-evolution-mail sends a request to a dispatching thread, which performs
-the action or queues it to be performed. (See section 4 for details)
-
-The goal that I was working towards is that there should be no calls
-to camel made, ever, in the main thread. I didn't expect to and
-didn't do this, but that was the intent.
-
-[1]. Well, we could fork off another process, but they share so much
-data that this would be pretty impractical.
-
-4. IMPLEMENTATION
-
-a. CamelObject
-
-Threading presented a major problem regarding Camel. Camel is based
-on the GTK Object system, and uses signals to communicate events. This
-is okay in a nonthreaded application, but the GTK Object system is
-not thread-safe.
-
-Particularly, signals and object allocations use static data. Using
-either one inside Camel would guarantee that we'd be stuck with
-random crashes forevermore. That's Bad (TM).
-
-There were two choices: make sure to limit our usage of GTK, or stop
-using the GTK Object system. I decided to do the latter, as the
-former would lead to a mess of "what GTK calls can we make" and
-GDK_THREADS_ENTER and accidentally calling UI functions and upgrades
-to GTK breaking everything.
-
-So I wrote a very very simple CamelObject system. It had three goals:
-
- * Be really straightforward, just encapsulate the type
- heirarchy without all that GtkArg silliness or anything.
- * Be as compatible as possible with the GTK Object system
- to make porting easy
- * Be threadsafe
-
-It supports:
-
- * Type inheritance
- * Events (signals)
- * Type checking
- * Normal refcounting
- * No unref/destroy messiness
- * Threadsafety
- * Class functions
-
-The entire code to the object system is in camel/camel-object.c. It's
-a naive implementation and not full of features, but intentionally that
-way. The main differences between GTK Objects and Camel Objects are:
-
- * s,gtk,camel,i of course
- * Finalize is no longer a GtkObjectClass function. You specify
- a finalize function along with an init function when declaring
- a type, and it is called automatically and chained automatically.
- * Declaring a type is a slightly different API
- * The signal system is replaced with a not-so-clever event system.
- Every event is equivalent to a NONE__POINTER signal. The syntax
- is slightly different: a class "declares" an event and specifies
- a name and a "prep func", that is called before the event is
- triggered and can cancel it.
- * There is only one CamelXXXClass in existence for every type.
- All objects share it.
-
-There is a shell script, tools/make-camel-object.sh that will do all of
-the common substitutions to make a file CamelObject-compatible. Usually
-all that needs to be done is move the implementation of the finalize
-event out of the class init, modify the get_type function, and replace
-signals with events.
-
-Pitfalls in the transition that I ran into were:
-
- * gtk_object_ref -> camel_object_ref or you coredump
- * some files return 'guint' instead of GtkType and must be changed
- * Remove the #include <gtk/gtk.h>
- * gtk_object_set_datas must be changed (This happened once; I
- added a static hashtable)
- * signals have to be fudged a bit to match the gpointer input
- * the BAST_CASTARD option is on, meaning failed typecasts will
- return NULL, almost guaranteeing a segfault -- gets those
- bugs fixed double-quick!
-
-b. API -- mail_operation_spec
-
-I worked by creating a very specific definition of a "mail operation"
-and wrote an engine to queue and dispatch them.
-
-A mail operation is defined by a structure mail_operation_spec
-prototyped in mail-threads.h. It comes in three logical parts -- a
-"setup" phase, executed in the main thread; a "do" phase, executed
-in the dispatch thread; and a "cleanup" phase, executed in the main
-thread. These three phases are guaranteed to be performed in order
-and atomically with respect to other mail operations.
-
-Each of these phases is represented by a function pointer in the
-mail_operation_spec structure. The function mail_operation_queue() is
-called and passed a pointer to a mail_operation_spec and a user_data-style
-pointer that fills in the operation's parameters. The "setup" callback
-is called immediately, though that may change.
-
-Each callback is passed three parameters: a pointer to the user_data,
-a pointer to the "operation data", and a pointer to a CamelException.
-The "operation data" is allocated automatically and freed when the operation
-completes. Internal data that needs to be shared between phases should
-be stored here. The size allocated is specified in the mail_operation_spec
-structure.
-
-Because all of the callbacks use Camel calls at some point, the
-CamelException is provided as utility. The dispatcher will catch exceptions
-and display error dialogs, unlike the synchronous code which lets
-exceptions fall through the cracks fairly easily.
-
-I tried to implement all the operations following this convention. Basically
-I used this skeleton code for all the operations, just filling in the
-specifics:
-
-===================================
-
-typedef struct operation_name_input_s {
- parameters to operation
-} operation_name_input_t;
-
-typedef struct operation_name_data_s {
- internal data to operation, if any
- (if none, omit the structure and set opdata_size to 0)
-} operation_name_data_t;
-
-static gchar *describe_operation_name (gpointer in_data, gboolean gerund);
-static void setup_operation_name (gpointer in_data, gpointer op_data, CamelException *ex);
-static void do_operation_name (gpointer in_data, gpointer op_data, CamelException *ex);
-static void cleanup_operation_name (gpointer in_data, gpointer op_data, CamelException *ex);
-
-static gchar *describe_operation_name (gpointer in_data, gboolean gerund)
-{
- operation_name_input_t *input = (operation_name_input_t *) in_data;
-
- if (gerund) {
- return a g_strdup'ed string describing what we're doing
- } else {
- return a g_strdup'ed string describing what we're about to do
- }
-}
-
-static void setup_operation_name (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- operation_name_input_t *input = (operation_name_input_t *) in_data;
- operation_name_data_t *data = (operation_name_data_t *) op_data;
-
- verify that parameters are valid
-
- initialize op_data
-
- reference objects
-}
-
-static void do_operation_name (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- operation_name_input_t *input = (operation_name_input_t *) in_data;
- operation_name_data_t *data = (operation_name_data_t *) op_data;
-
- perform camel operations
-}
-
-static void cleanup_operation_name (gpointer in_data, gpointer op_data, CamelException *ex)
-{
- operation_name_input_t *input = (operation_name_input_t *) in_data;
- operation_name_data_t *data = (operation_name_data_t *) op_data;
-
- perform UI updates
-
- free allocations
-
- dereference objects
-}
-
-static const mail_operation_spec op_operation_name = {
- describe_operation_name,
- sizeof (operation_name_data_t),
- setup_operation_name,
- do_operation_name,
- cleanup_operation_name
-};
-
-void
-mail_do_operation_name (parameters)
-{
- operation_name_input_t *input;
-
- input = g_new (operation_name_input_t, 1);
-
- store parameters in input
-
- mail_operation_queue (&op_operation_name, input, TRUE);
-}
-
-===========================================
-
-c. mail-ops.c
-
-Has been drawn and quartered. It has been split into:
-
- * mail-callbacks.c: the UI callbacks
- * mail-tools.c: useful sequences wrapping common Camel operations
- * mail-ops.c: implementations of all the mail_operation_specs
-
-An important part of mail-ops.c are the global functions
-mail_tool_camel_lock_{up,down}. These simulate a recursize mutex around
-camel. There are an extreme few, supposedly safe, calls to Camel made in
-the main thread. These functions should go around evey call to Camel or
-group thereof. I don't think they're necessary but it's nice to know
-they're there.
-
-If you look at mail-tools.c, you'll notice that all the Camel calls are
-protected with these functions. Remember that a mail tool is really
-just another Camel call, so don't use them in the main thread either.
-
-All the mail operations are implemented in mail-ops.c EXCEPT:
-
- * filter-driver.c: the filter_mail operation
- * message-list.c: the regenerate_messagelist operation
- * message-thread.c: the thread_messages operation
-
-d. Using the operations
-
-The mail operations as implemented are very specific to evolution-mail. I
-was thinking about leaving them mostly generic and then allowing extra
-callbacks to be added to perform the more specific UI touches, but this
-seemed kind of pointless.
-
-I basically looked through the code, found references to Camel, and split
-the code into three parts -- the bit before the Camel calls, the bit after,
-and the Camel calls. These were mapped onto the template, given a name,
-and added to mail-ops.c. Additionally, I simplified the common tasks that
-were taken care of in mail-tools.c, making some functions much simpler.
-
-Ninety-nine percent of the time, whatever operation is being done is being
-done in a callback, so all that has to be done is this:
-
-==================
-
-void my_callback (GtkObject *obj, gchar *uid)
-{
- camel_do_something (uid);
-}
-
-==== becomes ====
-
-void my_callback (GtkObject *obj, gchar *uid)
-{
- mail_do_do_something (uid);
-}
-
-=================
-
-There are, however, a few belligerents. Particularly, the function
-mail_uri_to_folder returns a CamelFolder and yet should really be
-asynchronous. This is called in a CORBA call that is sychronous, and
-additionally is used in the filter code.
-
-I changed the first usage to return the folder immediately but
-still fetch the CamelFolder asyncrhonously, and in the second case,
-made filtering asynchronous, so the fact that the call is synchronous
-doesn't matter.
-
-The function was renamed to mail_tool_uri_to_folder to emphasize that
-it's a synchronous Camel call.
-
-e. The dispatcher
-
-mail_operation_queue () takes its parameters and assembles them in a
-closure_t structure, which I abbreviate clur. It sets a timeout to
-display a progress window if an operation is still running one second
-later (we're not smart enough to check if it's the same operation,
-but the issue is not a big deal). The other thread and some communication
-pipes are created.
-
-The dispatcher thread sits in a loop reading from a pipe. Every time
-the main thread queues an operation, it writes the closure_t into the pipe.
-The dispatcher reads the closure, sends a STARTING message to the main
-thread (see below for explanation), calls the callback specified in the
-closure, and sends a FINISHED message. It then goes back to reading
-from its pipe; it will either block until another operation comes along,
-or find one right away and start it. This the pipe takes care of queueing
-operations.
-
-The dispatch thread communicates with the main thread with another pipe;
-however, the main thread has other things to do than read from the pipe,
-so it adds registers a GIOReader that checks for messages in the glib
-main loop. In addition to starting and finishing messages, the other
-thread can communicate to the user using messages and a progress bar.
-(This is currently implemented but unused.)
-
-5. ISSUES
-
- * Operations are queued and dequeued stupidly. Like if you click
- on one message then click on another, the first will be retrieved
- and displayed then overwritten by the second. Operations that could
- be performed at the same time safely aren't.
- * The CamelObject system is workable, but it'd be nice to work with
- something established like the GtkObject
- * The whole threading idea is not great. Concensus is that an
- asynchronous interface is the Right Thing, eventually.
- * Care still needs to be taken when designing evolution-mail code to
- work with the asynchronous mail_do_ functions
- * Some of the operations are extremely hacky.
- * IMAP's timeout to send a NOOP had to be removed because we can't
- use GTK. We need an alternative for this. \ No newline at end of file
diff --git a/mail/Spell.idl b/mail/Spell.idl
deleted file mode 100644
index f251253422..0000000000
--- a/mail/Spell.idl
+++ /dev/null
@@ -1,71 +0,0 @@
-/* This file is part of gnome-spell bonobo component
-
- Copyright (C) 1999, 2000 Helix Code, Inc.
- Authors: Radek Doulik <rodo@helixcode.com>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
-*/
-
-#include <Bonobo.idl>
-
-module GNOME {
- module Spell {
-
- typedef sequence<string> StringSeq;
- struct Language {
- string name;
- string abbreviation;
- };
- typedef sequence<Language> LanguageSeq;
-
- interface Dictionary : Bonobo::Unknown {
-
- exception Error {
- string error;
- };
-
- LanguageSeq getLanguages ();
-
- /**
- * sets language(s), language string could contain more languages separated by space
- */
- void setLanguage (in string language);
-
- /**
- * checks word
- *
- * returns true if word is valid
- */
- boolean checkWord (in string word) raises (Error);
-
- /**
- * returns suggestions for word
- */
- StringSeq getSuggestions (in string word) raises (Error);
-
- /**
- * add to session/personal dictionary
- */
- void addWordToSession (in string word) raises (Error);
- void addWordToPersonal (in string word, in string language) raises (Error);
-
- /**
- * informs dictionary, that word 'word' will be replaced/corrected by word 'replacement'
- */
- void setCorrection (in string word, in string replacement, in string language);
- };
- };
-};
diff --git a/mail/default/.cvsignore b/mail/default/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/mail/default/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/mail/default/C/.cvsignore b/mail/default/C/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/mail/default/C/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/mail/default/C/Inbox b/mail/default/C/Inbox
deleted file mode 100644
index 5fe1bdfb58..0000000000
--- a/mail/default/C/Inbox
+++ /dev/null
@@ -1,339 +0,0 @@
-From evolution@ximian.com Tue Sep 25 07:45:12 2001
-Return-Path: <evolution@ximian.com>
-Received: from pop.ximian.com (IDENT:mail@localhost [127.0.0.1]) by
- pop.ximian.com (8.9.3/8.9.3) with ESMTP id HAA20680; Tue, 25 Sep 2001
- 07:45:12 -0400
-Received: from smtp.ximian.com (smtp.ximian.com [141.154.95.10]) by
- pop.ximian.com (8.9.3/8.9.3) with ESMTP id HAA20659 for
- <evolution@ximian.com>; Tue, 25 Sep 2001 07:45:10 -0400
-Received: (qmail 5610 invoked from network); 25 Sep 2001 11:45:02 -0000
-Received: from smtp.ximian.com (HELO localhost) (141.154.95.10) by
- pop.ximian.com with SMTP; 25 Sep 2001 11:45:02 -0000
-From: "The Evolution Team" <evolution@ximian.com>
-To: Evolution Users <evolution@ximian.com>
-Content-Type: multipart/related; type="multipart/alternative"; boundary="=-t4dRE6cqcdSBHOrMdTQ1"
-X-Mailer: Evolution/1.1.99 (Preview Release)
-Date: 25 June 2002 14:45:00 +0300
-Message-Id: <1001418302.27070.20.camel@spectrolite>
-Mime-Version: 1.0
-Subject: Welcome to Evolution!
-Sender: evolution@ximian.com
-Errors-To: evolution@ximian.com
-X-Mailman-Version: 1.1
-Status:
-X-Evolution-Source: pop://rupert@pop.ximian.com/inbox
-X-Evolution: 00000ddd-0030
-
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: multipart/alternative; boundary="=-2gZ1roA/HoYrlRDVGyiM"
-
-
---=-2gZ1roA/HoYrlRDVGyiM
-Content-Type: text/plain
-Content-Transfer-Encoding: 7bit
-
-
-The Evolution Team is proud to welcome you to Evolution, a complete system
-for managing your communications and personal information.
-
-
-Getting Started
-
- On the left of the Evolution window is the side bar, with
- shortcuts to all your mail folders. Below that, you'll find
- buttons for your calendars, contacts, tasks, mail.
-
- For a complete guide to Evolution, select "Table of
- Contents" from the "Help" menu, or press the F1 key.
-
-New Features
-
- Evolution 2.0 adds new support for connecting to Novell
- GroupWise servers (6.5.3 or newer) and support for Exchange
- 2000/2003. Other new features in Evolution 2.0 include junk mail
- filtering, S/MIME security, improved offline IMAP, NNTP (news)
- support, web calendar display, overlayed calendars and new developer
- APIs for accessing contact, calendar and task data.
-
-Bug Reporting
-
- Bugs should be reported to http://bugzilla.ximian.com
-
-More Information
-
- You can subscribe to the Evolution users mailing list at
- http://lists.ximian.com/mailman/listinfo/evolution.
-
- Information on the Evolution project is available at
- http://www.gnome.org/projects/evolution.
-
-
-Yours Sincerely,
-The Evolution Team
-evolution@ximian.com
-
-
---=-2gZ1roA/HoYrlRDVGyiM
-Content-Type: text/html; charset=utf-8
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
- <META NAME="GENERATOR" CONTENT="GtkHTML/0.13.99">
-</HEAD>
-<BODY BGCOLOR="#f8fcf8"><TABLE BACKGROUND="cid:1001417869.27019.4.camel@spectrolite" CELLSPACING="0" CELLPADDING="0" WIDTH="100%">
-<TR>
-<TD ALIGN="left" VALIGN="top">
-<IMG SRC="cid:1001417869.27019.5.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD ALIGN="right" VALIGN="top">
-<IMG SRC="cid:1001417929.27019.7.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></TD>
-</TR>
-<TR>
-<TD>
-</TD>
-<TD>
-<IMG SRC="cid:1001417989.27019.11.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="48" HEIGHT="48"></TD>
-<TD>
-</TD>
-<TD>
-<FONT COLOR="#f8fcf8"><FONT SIZE="4"><B>The Evolution Team</FONT></B></FONT SIZE="4"><FONT COLOR="#f8fcf8"><FONT SIZE="4"> is proud to welcome you to </FONT></FONT SIZE="4"><FONT COLOR="#f8fcf8"><FONT SIZE="4"><B>Evolution</FONT></B></FONT SIZE="4"><FONT COLOR="#f8fcf8"><FONT SIZE="4">, a complete system for managing your communications and personal information.</FONT></FONT SIZE="4"></TD>
-<TD>
-</TD>
-<TD>
-<IMG SRC="cid:1001417989.27019.11.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="48" HEIGHT="48"></TD>
-<TD>
-</TD>
-</TR>
-<TR>
-<TD ALIGN="left" VALIGN="bottom">
-<IMG SRC="cid:1001417929.27019.8.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD ALIGN="right" VALIGN="bottom">
-<div align=right>
-<IMG SRC="cid:1001417929.27019.9.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></div>
-</TD>
-</TR>
-</TABLE>
-<h2>Getting Started</h2>
-
-<blockquote>
- On the left of the Evolution window is the side bar, with
- shortcuts to all your mail folders. Below that, you'll find
- buttons for your calendars, contacts, tasks, mail.
-<br><br>
- For a complete guide to using Evolution, select <b>Table of
- Contents</b> in the <b>Help</b> menu, or press the <b>F1</b> key.
-
-</blockquote>
-
-<h2>New Features</h2>
-<blockquote>
- Evolution 2.0 adds new support for connecting to Novell
- GroupWise servers (6.5.3 or newer) and support for Exchange
- 2000/2003. Other new features in Evolution 2.0 include junk mail
- filtering, S/MIME security, improved offline IMAP, NNTP (news)
- support, web calendar display, overlayed calendars and new developer
- APIs for accessing contact, calendar and task data.
-</blockquote>
-
-<h2>Bug Reporting</h2>
-<blockquote>
- Bugs should be reported to <a href="http://bugzilla.ximian.com">http://bugzilla.ximian.com</a>
-</blockquote>
-
-<h2>More Information</h2>
-
-<blockquote>
- You can subscribe to the Evolution users mailing list at
- <a href="http://lists.ximian.com/mailman/listinfo/evolution">http://lists.ximian.com/mailman/listinfo/evolution</a>.
-
- Information on the Evolution project is available at
- <a href="http://www.gnome.org/projects/evolution">http://www.gnome.org/projects/evolution</a>.
- </blockquote>
-
-
-Yours Sincerely,<br>
-The Evolution Team<br>
-<a href="mailto:evolution@ximian.com">evolution@ximian.com</a>
-
-</BODY>
-</HTML>
-
---=-2gZ1roA/HoYrlRDVGyiM--
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417929.27019.9.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-bottomright.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsBAVf+8XgAAAA7SURB
-VHjaY/z//z8DPsDEgB8IE1JgSkhBGMP///9xYbP/eCSF////f/4/Hp3n/0MBsg6P////z/uPBgDp
-AG5RDY2ymwAAAABJRU5ErkJggg==
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417989.27019.11.camel@spectrolite>
-Content-Disposition: attachment; filename=evolution-icon.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAANbY1E9YMgAAABl0RVh0
-U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAABPQSURBVHjaYtzEuI6BCQgZoRDGRtDIJCrP
-6r8dAxQwATEjlEbGjFD5/0D8Dw3DxBgeMt7BsJdYtwAEEON3xk8EHQqmGSG8X//+IzsahFmAmBWI
-2YGYDUqzQsWZoWpBDv0DxL+g+CcS+w+Spxi0mFQIuwWJBAggRmsmUyL8DmFt+7cX5nBmqGM5gZgH
-iA2B2AWIzYFYCoglGbCD20B8E4hPAfEeIH4OxF+B+BvUM39BHilgyiToFhgLIIAYG5gqCCor/VfL
-AE0OIIdzQB2tCcThQOyHx8GEwBEg3gjEW4H4AxB/hsYOKFb+72BazyCdpMjwfN4juFvEkmwY3s47
-ziBc/BCoYwEDQAAxXhIXYNB7+YWBQZGH4f+NEwz3nrCi2KCsrAwLdVCIcwOxPBAXAXE0A/XACyDu
-g3rmHRB/gcbIv7t37+LVCBBAjPgUQB3PAg11QSAOAuJmIObFpcfWiJtBTpKFQV4C6Of/f6GYgeHQ
-+V8Mj178ZXj08h8+91wE4mIgvgWNke/Q2GDA5U6AAGIhwvFcQCwCxP3Q5IIC+HlYGHwdhRl8HYQY
-fBwEwA7+/x9o5//fwPD7xcD47wfD/38/GSr//mf4B8QPnv5l2HL4J8Py3d8Zrtz/i26cPhBvAOIK
-IN4JxK+h+eM3LncCBBDWGEByPCitK7Gxsi7T09JSv3brFsO3798hDudlYciOVmDIiVEAstmgWeQf
-2AOMQMf///8LyAQmZ6AHGP8B9fz9DuT/ZfgL8gjQf39//QfHSvfybwzHr2F1XwcQLwTil9Ak9Rub
-WwECCMMDaCGvIijAv8zMwFD9xLmzDB8/fYYkExNhhpktRgzyMnxAd6OVluAkAwr9n9DQBzkcGIhA
-zAjE/4Ce+PfnP8NfEAb67w/QIzM3fmfoW/uN4dO3/+ju6wLi+dA8AvLEH3T3AgQQigeQMizI8eLA
-kJ9jaWricP7yFYZPnyGOr8pUZ6jONWdgk85iYGTmZbh9bgaDnMRfSAzA0/xPsAcY/v4A0iDHfwEK
-fwV64CuY/v/nH9ADkFj48xNC33vylyF1wieG648xklUdEK+AegKUnP4iuxkggJjQYwRa2oAybJmh
-ro7Djdt34I6f2WzIUFPkzcCp3MXAwq3H8ODhEwYL71kM4dm7GT5+B+ZzVqA2Fn5ghIAwMHZYgIUW
-MzfDYWBSOXIemKyYOBgYmdiBGFhIA21mZAbSzCAaWLSJMzEsL+Nj0JRhRvdAORAbQd0ETqvQgAYD
-gABiwpJ0QEWlm5K8XNqHT58YXr5+DXW8AUNsuC0Du1QG2J9/vpxjSExKY0hIymBg5tJi0LSdyrBl
-72MGJlZ+BkYgZmABFlTAGPrwlZUhvPASQ2DBA4ay/ldAPgvQA8xAzAB3PNhDQM/w8zAxLCniY9CQ
-RvEEyD3VQCwBzZMoBQ9AADGhJR1QM0CYg4O9gpeXh+HmHUhUZUfLM8QEaTKwiQQBMygwDf98wjBh
-Qg+wWGQA0hMYGhoawNrlFRQZDp16xfAR5EgWHnDol3VeYlBS0WFoampiOH5ThkEr8D7D5sO/wI5m
-ZIR4AhwbUMzPzcQwJYWXgZeDEdmdukAcCcSi0CKdCRYLAAGEnISYoT6MlJaUULn/8DFYUE+Nh6Gr
-XIeBld8RXDv///OZ4e71bQwtfTsYFixYAFbz4MEDBn5+bqAHlBhSi5YzaFh1MGzefY/h8OnXDEvX
-32Tg4uIC47y8PIa4xGyGxKavDBFVH4B1wl+IR6COh3lERpiJoSWCGz0pgSpOZWiMwGMBIICYkGhw
-2mdjY81gAgYLLN13laoCk4QE0HBBoOM/AUvDqwwp+fMZEhLTGRwcHMBqQLSikhaDpGoikNZmWLBw
-OUNayWYGj8jFDPX19QwsLCwMJSUlDOfOnWMwMjJi6OnpYfjJacdgk/qOYfq6b/B2KyhGwDTQU07a
-rAwOmiitAlDouwOxEDSlgGMBIIAYkSo0UCaJFxcT7f79+w/Du/fvGWyN+Rh2zjFlYOVzA3pCCJgJ
-2RkmzF7JMGXBFYYLFy4wCAgI4KxSP3z4wJCQkMBw4MABeEyB+EpKSgxRUVEMIiIiDDdu3GCYM2cO
-g7rkJ4amBG4gzcLw+8d/ht/AauPXj38MD5//ZfDp/YRs7BsgDgHiG9Amx2+AAIK12WGZ14WNjY3h
-y9evkCIzTQqYyQQgxeHvDwz3719laOnfA3YQyPGvXr3C6QGQ/IYNG8B5JDAwEOwhUFK7d+8eQ11d
-HcOuXbsYNDQ0wLEhquzF4FLyAVwXwMpCUMNNSoCJwV4dJRZEoC1fXqibGQECiBmafEDNYnFgVDcw
-MTGxffnyFdieYWXoKpZjYGYSB0YtC8N/xn8MwZlLGDx9YxkyMjIYnj17xnDlymWGz8CkJiwszMDM
-jCg5Pn78yMDBwQFmgzxhYGDAUFFRweDh4cFw8+ZNhtWrVzPMnj2b4cSJEwxycnIM5ubm4KS1bt8j
-YKX2FFgKsTBI8DOCa2yW/4wMu1Fr6q/Q5jgoan4BBBDMA6DM6wZ0RNDPnz8Y/gE7LTHe/AyuVgJA
-hwGLRaa/DJMWn2PYffwzw4oVKxh+//7NcOfObQYZGRmGly9fMjx+/IiBjY2dgZeXF8h+zLBo8WKG
-Hz9/MkhKSjI8efKEoaOjg+HFixcMO3bsYJCQkAAnHZDH/vz5Ay3BGMCesLGxAbbcOBl6ll5jePfp
-F4MO0CNKQkwMc4/8ZEArbPZAk9APgABihkYFsOBm8Adii79/Ia3FpiwhBgVpbnDJ8PD5F4aYkqMM
-HZ29DBYWFgy/fv0CJof7YMcqKiqBMx/IE++B+UZeXoGBFZhpT50+zXADGNpubm4M6urqDD9+/AB7
-BBQTIBqUpEA0KHYaGxsZjhw5Ao8NEN537gXD5E0PGXSkmBmev//H8OLTf+RktB7W0AMIIGZo9w+U
-gYP///+vBW+E5PMxcHKwAD3AxCDAx8nw/TczQ3HNHLCcu7s7w6RJkxhqamqBxScfg6ysLDC0pRje
-vn3L8PTpE6An5BmsrKwYngA9eOz4cQYNTU2GyMhIcIzNmDEDnHRAMQlKZqDkCMrcII+C8sO7d+8Y
-dHV1wflj6/ZdDOHG7Aw/gD2DC0/+oneEHoA6QAABxABt96gD8QVoRxuMvxyR/P/thOr/b2eM/n87
-7/j/6yX//8fXev7X1RD6D3Tgf35+/v/9/f1gtp6e3v/Fixf9B+aJ/2fOnP6/e/cuMP3t2zcgfeb/
-pMmT/1++fPn//fv3wfpA5ufn58P1A2PuPwiA5P39/f9zcnL+BwbK/xQ7jv9HS/n+59ix/0d2G7RP
-AuoRcgEEEHIpBK/UbAyAkfLvH7Al+QvYegQ2i/+BGmXfgZUaJ8OOhW4MH949B2fUgIAAcHHq6OgI
-DMlMhqlTpzJ8Bza3ZWXlwJn75MkTDKKiIgxxsbEMOjo64JAGYaBDwfoKCwvBfFhxrKCgAM4bYWFh
-DH8+P2WINGMH2g2svYQx2kewQQMmgABiQurrIgDQj/+BGfk/rEMCbMuDW5X/vjJMXXCBwcDIkgEY
-UmDLQJaDisotW7YwHDt2HOyg/fv3Ax0uCs7Ut4B9CFDRDCp6QcUoKNOCHArSZ29vD9YLCgiQHKz+
-AJnbGMjFwM3GAPbAf8xOHHzYBiCAGKAlkB4QX4JFka4yy/+Pe8X+fzko/v/rUen/X06o/f9y2vD/
-8eUGYPnz58//nz9//n99ff3/6ABY84LVxMbG/t++ffv/d+/egpMIKOkAPQZWA6JBfJA4CIOSEyxJ
-gpIQsAb+f6Ze4P+xMv7/B/P4/vf6cqEnoS5o740XIIBgrT1tZA+A8PtdYv8/7QN64hDIEzJgT+iq
-cYIdCAIgi0HqQOkWHYDEgKH7X1xcHOxYkKNAakEeXr9+PTjdgxyLDEDqQPLARtz/QzX8/0/WCPw/
-Usz3f3823/9MC4w80AFt4PEABBCsFAI23hk0oIJgEOHMwSDAwwStFf8xTF35keHKU2Vw6QECoBIE
-lI5BxSOoaEWvhUFJCdQGApUyFy9eBKd7kJ6CggKwHlCSglV2MD2g5JTj+ItBC9ikAHVy/v6G9Nj2
-3/nNcOM1SjpaCcT3QCkOIICYoINJv6CDTHBw6dZvoAGQ/uv9J38Y2uZ9AluADECNOFg7BxsAORaU
-tkH5BVTew2ppkD5QPkDWC8obosxPGXwN2MAOh3Q7IfTdtyiOB5YoDO9hwy4AAcQAbYXKAHE6cjSl
-enP+f7VR9P/bbaL/rfVYwekUlDRAaT8+Ph5elOJKRugAlnRAGKQexgclNRAblHS2AYtMUNo/Xs7/
-/1A+3/896bz/18ZwoycfUCclAIjlQG4HCCBYDIB8dRXa5wSD7ad+gqNx8+GfDEcv/QaHFigUYW0b
-EA0qMWClESEAK3JBAFbygPggs0CNvWhrdgZxXiaGP7//g2P+z5//4NA/9hA8LMQgxC/AwMbKBhs7
-+gR18z+AAGKB+uoXtFY7DcT2IFVPgGlu2/GfDJ++/2fg42KEOxq9CQ1yCMhBIHlQcoEVh+gA1KwG
-eRiWXGDpHpSU1CWZGdIcOBh+gzr4IMeDkhAQ/we6bPftPwxMjKDWAB/Du49g/WdhDTmQBwACiBnq
-ASZoZgYBD5ilr4BtkPpoboYAG3aGbYfuMnRPXgq2EFTNwwCs8gE5EBSiIBoEQI029Pwyc+ZMsONh
-HSGQZyMiIhjq/ZgZxIBdSfAoxS8GaAb+z3AR2B9YcuEXgyA/P8Pfv38Zvn7/9hCobRW0GQHKB38A
-Agh5hE4UGvrXkdNcdxL3/wcLhf8/XiL8f24R739gbICLRVj1jw5AeQWE0QFIj6Ys839eTkawPEg/
-KP1HAovIU3XAMh+U7gv4/u/L5P2/M5nn/84knv/Aluh/FmaW/8qycv+BJdp/6PCKA7SDDw5wgABi
-go6x/IOOQ76BKoKDpuXfgL2zf+DoddJjYzjWL8jA+m4HOOTRSyVYkkLPEyD+vl2bGBYX8DGsL+Nn
-OLplKjjJ3bpwmCHFloPhz8//EPwLgkFBt/7qL4Z77/4xiAoJMXz59g3U9Aaln91Iw43g1h1AAIEH
-tqA9fDZoUxWUPqYDsRrMAWaqLEDL+SEjCNChkJM3fzOUzPnCoKJjC87gIA8hl+mg5AQSA6V7kGPT
-bd4w+Juwg0fk/gGTxx5gwQAqJm2UmIFJhgHueFCz4e7bvwxZG78z8PHwgD3wENh5AnpgFtDodUB8
-GYjfgobhQW4HCCDkUYk/0Iz8FIgnIpdIp4AZqXzBF0h/FdpnNVFgZdhcI8Cgx3sK2CdQhGdM9FgA
-l+8sTxl8gOX7b2A/9w/YDAYGa0UWBhsFZiAf2FuFxgDM8aXbvzOwA9tPIMe/BQYA0PGgZH0QVLZA
-3QjvogEEELOUlBTDnj17GNDK2t/QfGEEU3jj2V9gyfSXwV6DFTx6+A+IWYG1tJkyK4MzMGlNWrCH
-Yc7ideAMDooBWO+rtDCLYWoCDwM3MyM4g8IzKRD/hta0IDZ4CB3q+N/A5C0D1Pv123eGt+/ffwRK
-TYY2dZ6ij5ECBBD62CgjdMhCDIhVQQEIal2jlCaarAxNwVzgohU+FAKdy1ty+AfD9L0/GILD4xgW
-LlzIAGzbMDhL3GKIADaL/8FGpf9A6d+QAd5/0H4KqMRp3At0/H9WBmlJCXB38+mLlz/+/fsHSs47
-oCMRb6B59T/M3QABxAzsPDAYGxszzJo1i+Ho0aOwmPgLxaD5LEVoTQ0p+t78Y9hx8TeDiggzgziw
-rQSu7kExAqS1pVgY3LTZGFbtOMfw/OM/Br7/rxmqPbmgIc4Ab9uA0zzQA6By/gsw6cw984thMrDO
-YefgYhAHNsP//PnL8Ozli5/AvvlcoJX7gfgOkuNRZm0AAgjf8DoPdO4LlKlLgdgSvcQxlGNhSAHW
-oIayiOHK//8hpchBYFtKAlizgjojwL4RPAZAAwYMUIevv/YbXNp8/83IICIsxMDNxQUe0nn99h2o
-loU5/jq0nfYZ2/A6QACB84C2tjZcAJon/iE18n5ADfkH7TcgJraAobztym+wY78DHcQMdBg/KxM4
-pGX4mBj42SDpHtYo/AzMwGeAfduVl34xTAKG+Lln/xg4uXgZRIGOBw0EvAb2qT9++vwKWgoehqYA
-2NzA3/LycnBqQQYAAYRvhgbWdeOGVnIK0PyQAp1KxQn0gU2D/7DECAUvv/wDYogAGysrAxcXJwMX
-MPkyMzMxfANm1ncfPoJi7xC0qAQFGKjWfQXLtMjpHpTc09LSwGyAAGLEJoglOXFCRy4koQOs3kDs
-BSrysXkANJIBNhySw8GOBA18gRzOCsQsQPY/YFL7/v0HOMkAHX4FOid2DtpMeAKd5INVWP9xTfIB
-BBAxs5SwwSR2aL4QhXpEFjQYBi1q4ZUeyNGg5MAI9ATIIyA+EyMjeMD2399/4DbNL2D5CSxdPkNn
-I0Hl+zWoo59AMytsvvgvoWlWgABiBA0uhYaGwgVAw37IfCSPMCJNufJAYwTkGXGoZ3ShbXQlaONQ
-FsmIT1AMaoA9g87Y34ZO4L2ENg/eIzn8N75QRwYAAcRIjCK02ICtj2CH5g8e6MgeP7STzQv1JDvS
-aAesQPgOHdv8CPXQR6ijvyE5/B++eWF0ABBALMROpcMMBHrkH9IijR9QR7yGOpgdadEH8lgT+mKP
-H0iLPv7A1kgg2wNKCcQAgAACJyFyAGiME2liEHmpDTMSH3m5DWx5zV+0JTfgognmDq/+Dga9lyA/
-mTD8/zmDIZFnPrjwEwWPJtowJIJLVltg+j0MpgECDADuXybnyFX8nAAAAABJRU5ErkJggg==
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417929.27019.8.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-bottomleft.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsBCVkleUoAAAA/SURB
-VHjaY/z//z8DPsDEwMAgTEiBKSEFYXjt+A8BZv///2fAhmEKzv///18YnwKYIjN8CmBg3v///z1g
-JgIAui9uUdDfxKcAAAAASUVORK5CYII=
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417929.27019.7.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-topright.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsANW9RNIwAAAA7SURB
-VHjahcwxDcAwEATBCwZzCQajNCVDGlduouh/petGFwQDE8un/OzFrsB93BW4Tx6kaHVgdmB0IAcq
-73eg4H8gZQAAAABJRU5ErkJggg==
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417869.27019.5.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-topleft.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsAJuvvdVIAAABISURB
-VHjafcxRDYAwDAbhYxbqZRpQOQGYQQkabk8kzRj9kz59l+J3Qz3VUCHBrXaVfCSMFXPQd/gG4w9V
-GnBR7FADeKqgesAEj0KK3Z8K59sAAAAASUVORK5CYII=
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417869.27019.4.camel@spectrolite>
-Content-Disposition: attachment; filename=bluestripes.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsLBap83esAAACESURB
-VHja7dRBDcAgEADBgwDBEj4wUvdN+2h1kJvVMNmy9vVF4mokr93PGwRkFjBHJ8ADCPAAAjyAAA8g
-wAMI8AACPIAADyDAAwjwAAI8gAAPIMADCPAAAjyAAA8gwAMI8AACPIAADyDAAwjwAAI8gAAPIMAD
-CPAAAjyAAA8gwAMIOL8fcegyqOBdwTkAAAAASUVORK5CYII=
-
---=-t4dRE6cqcdSBHOrMdTQ1
diff --git a/mail/default/C/Makefile.am b/mail/default/C/Makefile.am
deleted file mode 100644
index fab3401384..0000000000
--- a/mail/default/C/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-
-defaultlocaldir = $(privdatadir)/default/C/mail/local
-
-defaultlocal_DATA = \
- Inbox
-
-EXTRA_DIST = $(defaultlocal_DATA)
diff --git a/mail/default/Makefile.am b/mail/default/Makefile.am
deleted file mode 100644
index 2889c30d3d..0000000000
--- a/mail/default/Makefile.am
+++ /dev/null
@@ -1,4 +0,0 @@
-
-SUBDIRS=C zh_CN ja nl pt
-
-
diff --git a/mail/default/ja/.cvsignore b/mail/default/ja/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/mail/default/ja/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/mail/default/ja/Inbox b/mail/default/ja/Inbox
deleted file mode 100644
index 1ef951e003..0000000000
--- a/mail/default/ja/Inbox
+++ /dev/null
@@ -1,353 +0,0 @@
-From evolution@ximian.com Tue Sep 25 07:45:12 2001
-Return-Path: <evolution@ximian.com>
-Received: from pop.ximian.com (IDENT:mail@localhost [127.0.0.1]) by
- pop.ximian.com (8.9.3/8.9.3) with ESMTP id HAA20680; Tue, 25 Sep 2001
- 07:45:12 -0400
-Received: from smtp.ximian.com (smtp.ximian.com [141.154.95.10]) by
- pop.ximian.com (8.9.3/8.9.3) with ESMTP id HAA20659 for
- <evolution@ximian.com>; Tue, 25 Sep 2001 07:45:10 -0400
-Received: (qmail 5610 invoked from network); 25 Sep 2001 11:45:02 -0000
-Received: from smtp.ximian.com (HELO localhost) (141.154.95.10) by
- pop.ximian.com with SMTP; 25 Sep 2001 11:45:02 -0000
-From: "The Evolution Team" <evolution@ximian.com>
-To: Evolution Users <evolution@ximian.com>
-Content-Type: multipart/related; type="multipart/alternative"; boundary="=-t4dRE6cqcdSBHOrMdTQ1"
-X-Mailer: Evolution/1.1.99 (Preview Release)
-Date: 25 June 2002 14:45:00 +0300
-Message-Id: <1001418302.27070.20.camel@spectrolite>
-Mime-Version: 1.0
-Content-Type: Text/Plain; charset=iso-2022-jp
-Content-Transfer-Encoding: 7bit
-Subject: Evolution =?ISO-2022-JP?B?GyRCJFgkaCQmJDMkPRsoQiE=?=
-Sender: evolution@ximian.com
-Errors-To: evolution@ximian.com
-X-Mailman-Version: 1.1
-Status:
-X-Evolution-Source: pop://rupert@pop.ximian.com/inbox
-X-Evolution: 00000ddd-0030
-
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: multipart/alternative; boundary="=-2gZ1roA/HoYrlRDVGyiM"
-
-
---=-2gZ1roA/HoYrlRDVGyiM
-Content-Type: text/plain; charset=iso-2022-jp
-Content-Transfer-Encoding: 7bit
-
-
-
-Evolution $B3+H/%A!<%`$O!"$"$J$?$,%a!<%k$d8D?M>pJs$r4IM}$9$k(B
-Evolution $B%7%9%F%`$rF3F~$7$F$/$l$?$3$H$r$H$F$b8w1I$K;W$$$^$9!#(B
-
-
-$B$O$8$a$K(B
-
- Evolution $B$N%&%#%s%I%&:8B&$K$O!"$"$J$?$N$9$Y$F$N%a!<%k(B
- $B%U%)%k%@$X$N%7%g!<%H%+%C%H$r4^$`%5%$%I%P!<$,$"$j$^$9!#(B
- $B$=$N2<$NJ}$K$O%+%l%s%@!<$d%3%s%?%/%H!"%?%9%/!"%a!<%k(B
- $B%\%?%s$,$"$j$^$9!#(B
-
- $B40A4$J(B Evolution $B%,%$%I$r8f4uK>$J$i!"(B"$B%X%k%W(B"$B%a%K%e!<$+$i(B
- "$BL\<!(B"$B$rA*Br$9$k$+!"(BF1 $B%-!<$r2!$7$F2<$5$$!#(B
-
-$B?75,5!G=(B
-
- Evolution 2.0 $B$G$O?7$?$K(B Novell GroupWise $B%5!<%P!<(B (6.5.3
- $B0J>e(B)$B$H(B Exchange 2000/2003 $B$X$N@\B3%5%]!<%H$,DI2C$5$l$^$7$?!#(B
- $BB>$K?75,5!G=$H$7$F!"LBOG%a!<%k%U%#%k%?!"(BS/MIME $B%;%-%e%j%F%#!"(B
- IMAP $B$N%*%U%i%$%s%5%]!<%H$N8~>e!"(BNNTP (news) $B$N%5%]!<%H!"(B
- $B%&%'%V%+%l%s%@!<I=<(!"J#?t$N%+%l%s%@!<$N=E$M9g$o$;!"$=$7$F(B
- $B%3%s%?%/%H!"%+%l%s%@!<!"%?%9%/%G!<%?$K%"%/%;%9$9$k$?$a$N(B
- $B?7$7$$3+H/<T8~$1(B API $B$r4^$s$G$$$^$9!#(B
-
-$BIT6q9g$NJs9p(B
-
- $BIT6q9g$O(B http://bugzilla.ximian.com $B$^$G8fJs9p2<$5$$!#(B
-
-$B$b$C$H>\$7$/(B
-
- Evolution $B%f!<%6!<8~$1%a!<%j%s%0%j%9%H$K;22C$9$k$3$H$,(B
- $B$G$-$^$9(B:
- http://lists.ximian.com/mailman/listinfo/evolution
-
- Evolution $B%W%m%8%'%/%H$N>pJs$K$D$$$F$O(B
- http://www.gnome.org/projects/evolution $B$X!#(B
-
-
-$B7I6q!"(B
-Evolution $B3+H/%A!<%`(B
-
-
-
-
---=-2gZ1roA/HoYrlRDVGyiM
-Content-Type: text/html; charset=utf-8
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
- <META NAME="GENERATOR" CONTENT="GtkHTML/0.13.99">
-</HEAD>
-<BODY BGCOLOR="#f8fcf8"><TABLE BACKGROUND="cid:1001417869.27019.4.camel@spectrolite" CELLSPACING="0" CELLPADDING="0" WIDTH="100%">
-<TR>
-<TD ALIGN="left" VALIGN="top">
-<IMG SRC="cid:1001417869.27019.5.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD ALIGN="right" VALIGN="top">
-<IMG SRC="cid:1001417929.27019.7.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></TD>
-</TR>
-<TR>
-<TD>
-</TD>
-<TD>
-<IMG SRC="cid:1001417989.27019.11.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="48" HEIGHT="48"></TD>
-<TD>
-</TD>
-<TD>
-<FONT COLOR="#f8fcf8"><FONT SIZE="4"><B>Evolution 開発ãƒãƒ¼ãƒ </FONT></B></FONT SIZE="4">
-<FONT COLOR="#f8fcf8"><FONT SIZE="4">ã¯ã€ã‚ãªãŸãŒãƒ¡ãƒ¼ãƒ«ã‚„個人情報を管ç†ã™ã‚‹</FONT></FONT SIZE="4">
-<FONT COLOR="#f8fcf8"><FONT SIZE="4"><B>Evolution</FONT></B></FONT SIZE="4">
-<FONT COLOR="#f8fcf8"><FONT SIZE="4">システムを導入ã—ã¦ãã‚ŒãŸã“ã¨ã‚’ã¨ã¦ã‚‚光栄ã«æ€ã„ã¾ã™ã€‚</FONT></FONT SIZE="4">
-</TD>
-<TD>
-</TD>
-<TD>
-<IMG SRC="cid:1001417989.27019.11.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="48" HEIGHT="48"></TD>
-<TD>
-</TD>
-</TR>
-<TR>
-<TD ALIGN="left" VALIGN="bottom">
-<IMG SRC="cid:1001417929.27019.8.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD ALIGN="right" VALIGN="bottom">
-<div align=right>
-<IMG SRC="cid:1001417929.27019.9.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></div>
-</TD>
-</TR>
-</TABLE>
-<h2>ã¯ã˜ã‚ã«</h2>
-
-<blockquote>
- Evolution ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦å·¦å´ã«ã¯ã€ã‚ãªãŸã®ã™ã¹ã¦ã®ãƒ¡ãƒ¼ãƒ«
- フォルダã¸ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã‚’å«ã‚€ã‚µã‚¤ãƒ‰ãƒãƒ¼ãŒã‚ã‚Šã¾ã™ã€‚
- ãã®ä¸‹ã®æ–¹ã«ã¯ã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼ã‚„コンタクトã€ã‚¿ã‚¹ã‚¯ã€ãƒ¡ãƒ¼ãƒ«
- ボタンãŒã‚ã‚Šã¾ã™ã€‚
-<br><br>
- 完全㪠Evolution ガイドを御希望ãªã‚‰ã€<b>ヘルプ</b>メニューã‹ã‚‰
- <b>目次</b>ã‚’é¸æŠžã™ã‚‹ã‹ã€<b>F1</b> キーを押ã—ã¦ä¸‹ã•ã„。
-</blockquote>
-
-<h2>æ–°è¦æ©Ÿèƒ½</h2>
-<blockquote>
- Evolution 2.0 ã§ã¯æ–°ãŸã« Novell GroupWise サーãƒãƒ¼ (6.5.3
- 以上)㨠Exchange 2000/2003 ã¸ã®æŽ¥ç¶šã‚µãƒãƒ¼ãƒˆãŒè¿½åŠ ã•ã‚Œã¾ã—ãŸã€‚
- ä»–ã«æ–°è¦æ©Ÿèƒ½ã¨ã—ã¦ã€è¿·æƒ‘メールフィルタã€S/MIME セキュリティã€
- IMAP ã®ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã‚µãƒãƒ¼ãƒˆã®å‘上ã€NNTP (news) ã®ã‚µãƒãƒ¼ãƒˆã€
- ウェブカレンダー表示ã€è¤‡æ•°ã®ã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼ã®é‡ã­åˆã‚ã›ã€ãã—ã¦
- コンタクトã€ã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼ã€ã‚¿ã‚¹ã‚¯ãƒ‡ãƒ¼ã‚¿ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãŸã‚ã®
- æ–°ã—ã„開発者å‘ã‘ API ã‚’å«ã‚“ã§ã„ã¾ã™ã€‚
-</blockquote>
-
-<h2>ä¸å…·åˆã®å ±å‘Š</h2>
-<blockquote>
- ä¸å…·åˆã¯ <a href="http://bugzilla.ximian.com">http://bugzilla.ximian.com</a> ã¾ã§å¾¡å ±å‘Šä¸‹ã•ã„。
-</blockquote>
-
-<h2>ã‚‚ã£ã¨è©³ã—ã</h2>
-
-<blockquote>
- Evolution ユーザーå‘ã‘メーリングリストã«å‚加ã™ã‚‹ã“ã¨ãŒ
- ã§ãã¾ã™:
- <a href="http://lists.ximian.com/mailman/listinfo/evolution">http://lists.ximian.com/mailman/listinfo/evolution</a>.
-
- Evolution プロジェクトã®æƒ…å ±ã«ã¤ã„ã¦ã¯
- <a href="http://www.gnome.org/projects/evolution">http://www.gnome.org/projects/evolution</a> ã¸ã€‚
- </blockquote>
-
-
-敬具ã€<br>
-Evolution 開発ãƒãƒ¼ãƒ <br>
-<a href="mailto:evolution@ximian.com">evolution@ximian.com</a>
-
-</BODY>
-</HTML>
-
---=-2gZ1roA/HoYrlRDVGyiM--
-
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417929.27019.9.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-bottomright.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsBAVf+8XgAAAA7SURB
-VHjaY/z//z8DPsDEgB8IE1JgSkhBGMP///9xYbP/eCSF////f/4/Hp3n/0MBsg6P////z/uPBgDp
-AG5RDY2ymwAAAABJRU5ErkJggg==
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417989.27019.11.camel@spectrolite>
-Content-Disposition: attachment; filename=evolution-icon.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAANbY1E9YMgAAABl0RVh0
-U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAABPQSURBVHjaYtzEuI6BCQgZoRDGRtDIJCrP
-6r8dAxQwATEjlEbGjFD5/0D8Dw3DxBgeMt7BsJdYtwAEEON3xk8EHQqmGSG8X//+IzsahFmAmBWI
-2YGYDUqzQsWZoWpBDv0DxL+g+CcS+w+Spxi0mFQIuwWJBAggRmsmUyL8DmFt+7cX5nBmqGM5gZgH
-iA2B2AWIzYFYCoglGbCD20B8E4hPAfEeIH4OxF+B+BvUM39BHilgyiToFhgLIIAYG5gqCCor/VfL
-AE0OIIdzQB2tCcThQOyHx8GEwBEg3gjEW4H4AxB/hsYOKFb+72BazyCdpMjwfN4juFvEkmwY3s47
-ziBc/BCoYwEDQAAxXhIXYNB7+YWBQZGH4f+NEwz3nrCi2KCsrAwLdVCIcwOxPBAXAXE0A/XACyDu
-g3rmHRB/gcbIv7t37+LVCBBAjPgUQB3PAg11QSAOAuJmIObFpcfWiJtBTpKFQV4C6Of/f6GYgeHQ
-+V8Mj178ZXj08h8+91wE4mIgvgWNke/Q2GDA5U6AAGIhwvFcQCwCxP3Q5IIC+HlYGHwdhRl8HYQY
-fBwEwA7+/x9o5//fwPD7xcD47wfD/38/GSr//mf4B8QPnv5l2HL4J8Py3d8Zrtz/i26cPhBvAOIK
-IN4JxK+h+eM3LncCBBDWGEByPCitK7Gxsi7T09JSv3brFsO3798hDudlYciOVmDIiVEAstmgWeQf
-2AOMQMf///8LyAQmZ6AHGP8B9fz9DuT/ZfgL8gjQf39//QfHSvfybwzHr2F1XwcQLwTil9Ak9Rub
-WwECCMMDaCGvIijAv8zMwFD9xLmzDB8/fYYkExNhhpktRgzyMnxAd6OVluAkAwr9n9DQBzkcGIhA
-zAjE/4Ce+PfnP8NfEAb67w/QIzM3fmfoW/uN4dO3/+ju6wLi+dA8AvLEH3T3AgQQigeQMizI8eLA
-kJ9jaWricP7yFYZPnyGOr8pUZ6jONWdgk85iYGTmZbh9bgaDnMRfSAzA0/xPsAcY/v4A0iDHfwEK
-fwV64CuY/v/nH9ADkFj48xNC33vylyF1wieG648xklUdEK+AegKUnP4iuxkggJjQYwRa2oAybJmh
-ro7Djdt34I6f2WzIUFPkzcCp3MXAwq3H8ODhEwYL71kM4dm7GT5+B+ZzVqA2Fn5ghIAwMHZYgIUW
-MzfDYWBSOXIemKyYOBgYmdiBGFhIA21mZAbSzCAaWLSJMzEsL+Nj0JRhRvdAORAbQd0ETqvQgAYD
-gABiwpJ0QEWlm5K8XNqHT58YXr5+DXW8AUNsuC0Du1QG2J9/vpxjSExKY0hIymBg5tJi0LSdyrBl
-72MGJlZ+BkYgZmABFlTAGPrwlZUhvPASQ2DBA4ay/ldAPgvQA8xAzAB3PNhDQM/w8zAxLCniY9CQ
-RvEEyD3VQCwBzZMoBQ9AADGhJR1QM0CYg4O9gpeXh+HmHUhUZUfLM8QEaTKwiQQBMygwDf98wjBh
-Qg+wWGQA0hMYGhoawNrlFRQZDp16xfAR5EgWHnDol3VeYlBS0WFoampiOH5ThkEr8D7D5sO/wI5m
-ZIR4AhwbUMzPzcQwJYWXgZeDEdmdukAcCcSi0CKdCRYLAAGEnISYoT6MlJaUULn/8DFYUE+Nh6Gr
-XIeBld8RXDv///OZ4e71bQwtfTsYFixYAFbz4MEDBn5+bqAHlBhSi5YzaFh1MGzefY/h8OnXDEvX
-32Tg4uIC47y8PIa4xGyGxKavDBFVH4B1wl+IR6COh3lERpiJoSWCGz0pgSpOZWiMwGMBIICYkGhw
-2mdjY81gAgYLLN13laoCk4QE0HBBoOM/AUvDqwwp+fMZEhLTGRwcHMBqQLSikhaDpGoikNZmWLBw
-OUNayWYGj8jFDPX19QwsLCwMJSUlDOfOnWMwMjJi6OnpYfjJacdgk/qOYfq6b/B2KyhGwDTQU07a
-rAwOmiitAlDouwOxEDSlgGMBIIAYkSo0UCaJFxcT7f79+w/Du/fvGWyN+Rh2zjFlYOVzA3pCCJgJ
-2RkmzF7JMGXBFYYLFy4wCAgI4KxSP3z4wJCQkMBw4MABeEyB+EpKSgxRUVEMIiIiDDdu3GCYM2cO
-g7rkJ4amBG4gzcLw+8d/ht/AauPXj38MD5//ZfDp/YRs7BsgDgHiG9Amx2+AAIK12WGZ14WNjY3h
-y9evkCIzTQqYyQQgxeHvDwz3719laOnfA3YQyPGvXr3C6QGQ/IYNG8B5JDAwEOwhUFK7d+8eQ11d
-HcOuXbsYNDQ0wLEhquzF4FLyAVwXwMpCUMNNSoCJwV4dJRZEoC1fXqibGQECiBmafEDNYnFgVDcw
-MTGxffnyFdieYWXoKpZjYGYSB0YtC8N/xn8MwZlLGDx9YxkyMjIYnj17xnDlymWGz8CkJiwszMDM
-jCg5Pn78yMDBwQFmgzxhYGDAUFFRweDh4cFw8+ZNhtWrVzPMnj2b4cSJEwxycnIM5ubm4KS1bt8j
-YKX2FFgKsTBI8DOCa2yW/4wMu1Fr6q/Q5jgoan4BBBDMA6DM6wZ0RNDPnz8Y/gE7LTHe/AyuVgJA
-hwGLRaa/DJMWn2PYffwzw4oVKxh+//7NcOfObQYZGRmGly9fMjx+/IiBjY2dgZeXF8h+zLBo8WKG
-Hz9/MkhKSjI8efKEoaOjg+HFixcMO3bsYJCQkAAnHZDH/vz5Ay3BGMCesLGxAbbcOBl6ll5jePfp
-F4MO0CNKQkwMc4/8ZEArbPZAk9APgABihkYFsOBm8Adii79/Ia3FpiwhBgVpbnDJ8PD5F4aYkqMM
-HZ29DBYWFgy/fv0CJof7YMcqKiqBMx/IE++B+UZeXoGBFZhpT50+zXADGNpubm4M6urqDD9+/AB7
-BBQTIBqUpEA0KHYaGxsZjhw5Ao8NEN537gXD5E0PGXSkmBmev//H8OLTf+RktB7W0AMIIGZo9w+U
-gYP///+vBW+E5PMxcHKwAD3AxCDAx8nw/TczQ3HNHLCcu7s7w6RJkxhqamqBxScfg6ysLDC0pRje
-vn3L8PTpE6An5BmsrKwYngA9eOz4cQYNTU2GyMhIcIzNmDEDnHRAMQlKZqDkCMrcII+C8sO7d+8Y
-dHV1wflj6/ZdDOHG7Aw/gD2DC0/+oneEHoA6QAABxABt96gD8QVoRxuMvxyR/P/thOr/b2eM/n87
-7/j/6yX//8fXev7X1RD6D3Tgf35+/v/9/f1gtp6e3v/Fixf9B+aJ/2fOnP6/e/cuMP3t2zcgfeb/
-pMmT/1++fPn//fv3wfpA5ufn58P1A2PuPwiA5P39/f9zcnL+BwbK/xQ7jv9HS/n+59ix/0d2G7RP
-AuoRcgEEEHIpBK/UbAyAkfLvH7Al+QvYegQ2i/+BGmXfgZUaJ8OOhW4MH949B2fUgIAAcHHq6OgI
-DMlMhqlTpzJ8Bza3ZWXlwJn75MkTDKKiIgxxsbEMOjo64JAGYaBDwfoKCwvBfFhxrKCgAM4bYWFh
-DH8+P2WINGMH2g2svYQx2kewQQMmgABiQurrIgDQj/+BGfk/rEMCbMuDW5X/vjJMXXCBwcDIkgEY
-UmDLQJaDisotW7YwHDt2HOyg/fv3Ax0uCs7Ut4B9CFDRDCp6QcUoKNOCHArSZ29vD9YLCgiQHKz+
-AJnbGMjFwM3GAPbAf8xOHHzYBiCAGKAlkB4QX4JFka4yy/+Pe8X+fzko/v/rUen/X06o/f9y2vD/
-8eUGYPnz58//nz9//n99ff3/6ABY84LVxMbG/t++ffv/d+/egpMIKOkAPQZWA6JBfJA4CIOSEyxJ
-gpIQsAb+f6Ze4P+xMv7/B/P4/vf6cqEnoS5o740XIIBgrT1tZA+A8PtdYv8/7QN64hDIEzJgT+iq
-cYIdCAIgi0HqQOkWHYDEgKH7X1xcHOxYkKNAakEeXr9+PTjdgxyLDEDqQPLARtz/QzX8/0/WCPw/
-Usz3f3823/9MC4w80AFt4PEABBCsFAI23hk0oIJgEOHMwSDAwwStFf8xTF35keHKU2Vw6QECoBIE
-lI5BxSOoaEWvhUFJCdQGApUyFy9eBKd7kJ6CggKwHlCSglV2MD2g5JTj+ItBC9ikAHVy/v6G9Nj2
-3/nNcOM1SjpaCcT3QCkOIICYoINJv6CDTHBw6dZvoAGQ/uv9J38Y2uZ9AluADECNOFg7BxsAORaU
-tkH5BVTew2ppkD5QPkDWC8obosxPGXwN2MAOh3Q7IfTdtyiOB5YoDO9hwy4AAcQAbYXKAHE6cjSl
-enP+f7VR9P/bbaL/rfVYwekUlDRAaT8+Ph5elOJKRugAlnRAGKQexgclNRAblHS2AYtMUNo/Xs7/
-/1A+3/896bz/18ZwoycfUCclAIjlQG4HCCBYDIB8dRXa5wSD7ad+gqNx8+GfDEcv/QaHFigUYW0b
-EA0qMWClESEAK3JBAFbygPggs0CNvWhrdgZxXiaGP7//g2P+z5//4NA/9hA8LMQgxC/AwMbKBhs7
-+gR18z+AAGKB+uoXtFY7DcT2IFVPgGlu2/GfDJ++/2fg42KEOxq9CQ1yCMhBIHlQcoEVh+gA1KwG
-eRiWXGDpHpSU1CWZGdIcOBh+gzr4IMeDkhAQ/we6bPftPwxMjKDWAB/Du49g/WdhDTmQBwACiBnq
-ASZoZgYBD5ilr4BtkPpoboYAG3aGbYfuMnRPXgq2EFTNwwCs8gE5EBSiIBoEQI029Pwyc+ZMsONh
-HSGQZyMiIhjq/ZgZxIBdSfAoxS8GaAb+z3AR2B9YcuEXgyA/P8Pfv38Zvn7/9hCobRW0GQHKB38A
-Agh5hE4UGvrXkdNcdxL3/wcLhf8/XiL8f24R739gbICLRVj1jw5AeQWE0QFIj6Ys839eTkawPEg/
-KP1HAovIU3XAMh+U7gv4/u/L5P2/M5nn/84knv/Aluh/FmaW/8qycv+BJdp/6PCKA7SDDw5wgABi
-go6x/IOOQ76BKoKDpuXfgL2zf+DoddJjYzjWL8jA+m4HOOTRSyVYkkLPEyD+vl2bGBYX8DGsL+Nn
-OLplKjjJ3bpwmCHFloPhz8//EPwLgkFBt/7qL4Z77/4xiAoJMXz59g3U9Aaln91Iw43g1h1AAIEH
-tqA9fDZoUxWUPqYDsRrMAWaqLEDL+SEjCNChkJM3fzOUzPnCoKJjC87gIA8hl+mg5AQSA6V7kGPT
-bd4w+Juwg0fk/gGTxx5gwQAqJm2UmIFJhgHueFCz4e7bvwxZG78z8PHwgD3wENh5AnpgFtDodUB8
-GYjfgobhQW4HCCDkUYk/0Iz8FIgnIpdIp4AZqXzBF0h/FdpnNVFgZdhcI8Cgx3sK2CdQhGdM9FgA
-l+8sTxl8gOX7b2A/9w/YDAYGa0UWBhsFZiAf2FuFxgDM8aXbvzOwA9tPIMe/BQYA0PGgZH0QVLZA
-3QjvogEEELOUlBTDnj17GNDK2t/QfGEEU3jj2V9gyfSXwV6DFTx6+A+IWYG1tJkyK4MzMGlNWrCH
-Yc7ideAMDooBWO+rtDCLYWoCDwM3MyM4g8IzKRD/hta0IDZ4CB3q+N/A5C0D1Pv123eGt+/ffwRK
-TYY2dZ6ij5ECBBD62CgjdMhCDIhVQQEIal2jlCaarAxNwVzgohU+FAKdy1ty+AfD9L0/GILD4xgW
-LlzIAGzbMDhL3GKIADaL/8FGpf9A6d+QAd5/0H4KqMRp3At0/H9WBmlJCXB38+mLlz/+/fsHSs47
-oCMRb6B59T/M3QABxAzsPDAYGxszzJo1i+Ho0aOwmPgLxaD5LEVoTQ0p+t78Y9hx8TeDiggzgziw
-rQSu7kExAqS1pVgY3LTZGFbtOMfw/OM/Br7/rxmqPbmgIc4Ab9uA0zzQA6By/gsw6cw984thMrDO
-YefgYhAHNsP//PnL8Ozli5/AvvlcoJX7gfgOkuNRZm0AAgjf8DoPdO4LlKlLgdgSvcQxlGNhSAHW
-oIayiOHK//8hpchBYFtKAlizgjojwL4RPAZAAwYMUIevv/YbXNp8/83IICIsxMDNxQUe0nn99h2o
-loU5/jq0nfYZ2/A6QACB84C2tjZcAJon/iE18n5ADfkH7TcgJraAobztym+wY78DHcQMdBg/KxM4
-pGX4mBj42SDpHtYo/AzMwGeAfduVl34xTAKG+Lln/xg4uXgZRIGOBw0EvAb2qT9++vwKWgoehqYA
-2NzA3/LycnBqQQYAAYRvhgbWdeOGVnIK0PyQAp1KxQn0gU2D/7DECAUvv/wDYogAGysrAxcXJwMX
-MPkyMzMxfANm1ncfPoJi7xC0qAQFGKjWfQXLtMjpHpTc09LSwGyAAGLEJoglOXFCRy4koQOs3kDs
-BSrysXkANJIBNhySw8GOBA18gRzOCsQsQPY/YFL7/v0HOMkAHX4FOid2DtpMeAKd5INVWP9xTfIB
-BBAxs5SwwSR2aL4QhXpEFjQYBi1q4ZUeyNGg5MAI9ATIIyA+EyMjeMD2399/4DbNL2D5CSxdPkNn
-I0Hl+zWoo59AMytsvvgvoWlWgABiBA0uhYaGwgVAw37IfCSPMCJNufJAYwTkGXGoZ3ShbXQlaONQ
-FsmIT1AMaoA9g87Y34ZO4L2ENg/eIzn8N75QRwYAAcRIjCK02ICtj2CH5g8e6MgeP7STzQv1JDvS
-aAesQPgOHdv8CPXQR6ijvyE5/B++eWF0ABBALMROpcMMBHrkH9IijR9QR7yGOpgdadEH8lgT+mKP
-H0iLPv7A1kgg2wNKCcQAgAACJyFyAGiME2liEHmpDTMSH3m5DWx5zV+0JTfgognmDq/+Dga9lyA/
-mTD8/zmDIZFnPrjwEwWPJtowJIJLVltg+j0MpgECDADuXybnyFX8nAAAAABJRU5ErkJggg==
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417929.27019.8.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-bottomleft.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsBCVkleUoAAAA/SURB
-VHjaY/z//z8DPsDEwMAgTEiBKSEFYXjt+A8BZv///2fAhmEKzv///18YnwKYIjN8CmBg3v///z1g
-JgIAui9uUdDfxKcAAAAASUVORK5CYII=
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417929.27019.7.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-topright.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsANW9RNIwAAAA7SURB
-VHjahcwxDcAwEATBCwZzCQajNCVDGlduouh/petGFwQDE8un/OzFrsB93BW4Tx6kaHVgdmB0IAcq
-73eg4H8gZQAAAABJRU5ErkJggg==
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417869.27019.5.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-topleft.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsAJuvvdVIAAABISURB
-VHjafcxRDYAwDAbhYxbqZRpQOQGYQQkabk8kzRj9kz59l+J3Qz3VUCHBrXaVfCSMFXPQd/gG4w9V
-GnBR7FADeKqgesAEj0KK3Z8K59sAAAAASUVORK5CYII=
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417869.27019.4.camel@spectrolite>
-Content-Disposition: attachment; filename=bluestripes.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsLBap83esAAACESURB
-VHja7dRBDcAgEADBgwDBEj4wUvdN+2h1kJvVMNmy9vVF4mokr93PGwRkFjBHJ8ADCPAAAjyAAA8g
-wAMI8AACPIAADyDAAwjwAAI8gAAPIMADCPAAAjyAAA8gwAMI8AACPIAADyDAAwjwAAI8gAAPIMAD
-CPAAAjyAAA8gwAMIOL8fcegyqOBdwTkAAAAASUVORK5CYII=
-
---=-t4dRE6cqcdSBHOrMdTQ1
diff --git a/mail/default/ja/Makefile.am b/mail/default/ja/Makefile.am
deleted file mode 100644
index 317cf5c79e..0000000000
--- a/mail/default/ja/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-
-defaultlocaldir = $(privdatadir)/default/ja/mail/local
-
-defaultlocal_DATA = \
- Inbox
-
-EXTRA_DIST = $(defaultlocal_DATA)
diff --git a/mail/default/nl/.cvsignore b/mail/default/nl/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/mail/default/nl/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/mail/default/nl/Inbox b/mail/default/nl/Inbox
deleted file mode 100644
index 020020a7a2..0000000000
--- a/mail/default/nl/Inbox
+++ /dev/null
@@ -1,344 +0,0 @@
-From evolution@ximian.com Tue Sep 25 07:45:12 2001
-Return-Path: <evolution@ximian.com>
-Received: from pop.ximian.com (IDENT:mail@localhost [127.0.0.1]) by
- pop.ximian.com (8.9.3/8.9.3) with ESMTP id HAA20680; Tue, 25 Sep 2001
- 07:45:12 -0400
-Received: from smtp.ximian.com (smtp.ximian.com [141.154.95.10]) by
- pop.ximian.com (8.9.3/8.9.3) with ESMTP id HAA20659 for
- <evolution@ximian.com>; Tue, 25 Sep 2001 07:45:10 -0400
-Received: (qmail 5610 invoked from network); 25 Sep 2001 11:45:02 -0000
-Received: from smtp.ximian.com (HELO localhost) (141.154.95.10) by
- pop.ximian.com with SMTP; 25 Sep 2001 11:45:02 -0000
-From: "Het Evolution-team" <evolution@ximian.com>
-To: Evolution gebruikers <evolution@ximian.com>
-Content-Type: multipart/related; type="multipart/alternative"; boundary="=-t4dRE6cqcdSBHOrMdTQ1"
-X-Mailer: Evolution/2.0
-Date: 25 June 2002 14:45:00 +0300
-Message-Id: <1001418302.27070.20.camel@spectrolite>
-Mime-Version: 1.0
-Subject: Welkom bij Evolution!
-Sender: evolution@ximian.com
-Errors-To: evolution@ximian.com
-X-Mailman-Version: 1.1
-Status:
-X-Evolution-Source: pop://rupert@pop.ximian.com/inbox
-X-Evolution: 00000ddd-0030
-
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: multipart/alternative; boundary="=-2gZ1roA/HoYrlRDVGyiM"
-
-
---=-2gZ1roA/HoYrlRDVGyiM
-Content-Type: text/plain
-Content-Transfer-Encoding: 7bit
-
-
-Het Evolution-team verwelkomt u met trots bij Evolution, een compleet systeem
-voor beheer van uw communicatie en persoonlijke informatie.
-
-
-Aan de slag
-
- Aan de linkerkant van het venster ziet u de koppelingen naar
- al uw postmappen. Daaronder ziet u knoppen voor uw
- agenda's, contacten, taken en post.
-
- Voor het complete handboek van Evolution kunt u "Inhoud"
- aanklikken in het menu "Hulp", of op F1 drukken.
-
-Nieuwe mogelijkheden
-
- Evolution 2.0 geeft u de mogelijkheid om gebruik te maken
- van Novell Groupwise servers (6.5.3 of nieuwer) en
- Exchange servers (2000/2003). Ook is er de mogelijkheid
- tot filteren van troep en andere ongewenste post, S/MIME
- beveiliging, verbeterde off-line IMAP, lezen van NNTP (nieuws),
- webkalenders, meerlagige agenda's en nieuwe API's voor
- ontwikkelaars om deze te benaderen vanuit andere programma's.
-
-Melden van problemen
-
- Alle problemen aangaande de software moeten in het Engels
- gemeld worden op http://bugzilla.ximian.com
-
-Meer informatie
-
- U kunt lid worden van de discussielijst van Evolution-
- gebruikers op
- http://lists.ximian.com/mailman/listinfo/evolution.
-
- Informatie over het Evolution-project is beschikbaar op
- http://www.gnome.org/projects/evolution.
-
-
-Hoogachtend,
-Het Evolution-team
-evolution@ximian.com
-
-
---=-2gZ1roA/HoYrlRDVGyiM
-Content-Type: text/html; charset=utf-8
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
- <META NAME="GENERATOR" CONTENT="GtkHTML/0.13.99">
-</HEAD>
-<BODY BGCOLOR="#f8fcf8"><TABLE BACKGROUND="cid:1001417869.27019.4.camel@spectrolite" CELLSPACING="0" CELLPADDING="0" WIDTH="100%">
-<TR>
-<TD ALIGN="left" VALIGN="top">
-<IMG SRC="cid:1001417869.27019.5.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD ALIGN="right" VALIGN="top">
-<IMG SRC="cid:1001417929.27019.7.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></TD>
-</TR>
-<TR>
-<TD>
-</TD>
-<TD>
-<IMG SRC="cid:1001417989.27019.11.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="48" HEIGHT="48"></TD>
-<TD>
-</TD>
-<TD>
-<FONT COLOR="#f8fcf8"><FONT SIZE="4"><B>Het Evolution-team</FONT></B></FONT SIZE="4"><FONT COLOR="#f8fcf8"><FONT SIZE="4"> verwelkomt u met trots bij </FONT></FONT SIZE="4"><FONT COLOR="#f8fcf8"><FONT SIZE="4"><B>Evolution</FONT></B></FONT SIZE="4"><FONT COLOR="#f8fcf8"><FONT SIZE="4">, een compleet systeem voor beheer van uw communicatie en persoonlijke informatie.</FONT></FONT SIZE="4"></TD>
-<TD>
-</TD>
-<TD>
-<IMG SRC="cid:1001417989.27019.11.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="48" HEIGHT="48"></TD>
-<TD>
-</TD>
-</TR>
-<TR>
-<TD ALIGN="left" VALIGN="bottom">
-<IMG SRC="cid:1001417929.27019.8.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD ALIGN="right" VALIGN="bottom">
-<div align=right>
-<IMG SRC="cid:1001417929.27019.9.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></div>
-</TD>
-</TR>
-</TABLE>
-<h2>Aan de slag</h2>
-
-<blockquote>
- Aan de linkerkant van het venster ziet u de koppelingen naar
- al uw postmappen. Daaronder ziet u knoppen voor uw
- agenda's, contacten, taken en post.
-<br><br>
- Voor het complete handboek van Evolution kunt u <b>Inhoud</b>
- aanklikken in het menu <b>Hulp</b>, of op <b>F1</b> drukken.
-</blockquote>
-
-<h2>Nieuwe mogelijkheden</h2>
-<blockquote>
- Evolution 2.0 geeft u de mogelijkheid om gebruik te maken
- van Novell Groupwise servers (6.5.3 of nieuwer) en
- Exchange servers (2000/2003). Ook is er de mogelijkheid
- tot filteren van troep en andere ongewenste post, S/MIME
- beveiliging, verbeterde off-line IMAP, lezen van NNTP (nieuws),
- webkalenders, meerlagige agenda's en nieuwe API's voor
- ontwikkelaars om deze te benaderen vanuit andere programma's.
-</blockquote>
-
-<h2>Melden van problemen</h2>
-<blockquote>
- Alle problemen aangaande de software moeten in het Engels
- gemeld worden op <a href="http://bugzilla.ximian.com">http://bugzilla.ximian.com</a>
-</blockquote>
-
-<h2>Meer informatie</h2>
-
-<blockquote>
- U kunt lid worden van de discussielijst van Evolution-
- gebruikers op
- <a href="http://lists.ximian.com/mailman/listinfo/evolution">http://lists.ximian.com/mailman/listinfo/evolution</a>.
-
- Informatie over het Evolution-project is beschikbaar op
- <a href="http://www.gnome.org/projects/evolution">http://www.gnome.org/projects/evolution</a>.
- </blockquote>
-
-
-Hoogachtend,<br>
-Het Evolution-team<br>
-<a href="mailto:evolution@ximian.com">evolution@ximian.com</a>
-
-</BODY>
-</HTML>
-
---=-2gZ1roA/HoYrlRDVGyiM--
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417929.27019.9.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-bottomright.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsBAVf+8XgAAAA7SURB
-VHjaY/z//z8DPsDEgB8IE1JgSkhBGMP///9xYbP/eCSF////f/4/Hp3n/0MBsg6P////z/uPBgDp
-AG5RDY2ymwAAAABJRU5ErkJggg==
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417989.27019.11.camel@spectrolite>
-Content-Disposition: attachment; filename=evolution-icon.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAANbY1E9YMgAAABl0RVh0
-U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAABPQSURBVHjaYtzEuI6BCQgZoRDGRtDIJCrP
-6r8dAxQwATEjlEbGjFD5/0D8Dw3DxBgeMt7BsJdYtwAEEON3xk8EHQqmGSG8X//+IzsahFmAmBWI
-2YGYDUqzQsWZoWpBDv0DxL+g+CcS+w+Spxi0mFQIuwWJBAggRmsmUyL8DmFt+7cX5nBmqGM5gZgH
-iA2B2AWIzYFYCoglGbCD20B8E4hPAfEeIH4OxF+B+BvUM39BHilgyiToFhgLIIAYG5gqCCor/VfL
-AE0OIIdzQB2tCcThQOyHx8GEwBEg3gjEW4H4AxB/hsYOKFb+72BazyCdpMjwfN4juFvEkmwY3s47
-ziBc/BCoYwEDQAAxXhIXYNB7+YWBQZGH4f+NEwz3nrCi2KCsrAwLdVCIcwOxPBAXAXE0A/XACyDu
-g3rmHRB/gcbIv7t37+LVCBBAjPgUQB3PAg11QSAOAuJmIObFpcfWiJtBTpKFQV4C6Of/f6GYgeHQ
-+V8Mj178ZXj08h8+91wE4mIgvgWNke/Q2GDA5U6AAGIhwvFcQCwCxP3Q5IIC+HlYGHwdhRl8HYQY
-fBwEwA7+/x9o5//fwPD7xcD47wfD/38/GSr//mf4B8QPnv5l2HL4J8Py3d8Zrtz/i26cPhBvAOIK
-IN4JxK+h+eM3LncCBBDWGEByPCitK7Gxsi7T09JSv3brFsO3798hDudlYciOVmDIiVEAstmgWeQf
-2AOMQMf///8LyAQmZ6AHGP8B9fz9DuT/ZfgL8gjQf39//QfHSvfybwzHr2F1XwcQLwTil9Ak9Rub
-WwECCMMDaCGvIijAv8zMwFD9xLmzDB8/fYYkExNhhpktRgzyMnxAd6OVluAkAwr9n9DQBzkcGIhA
-zAjE/4Ce+PfnP8NfEAb67w/QIzM3fmfoW/uN4dO3/+ju6wLi+dA8AvLEH3T3AgQQigeQMizI8eLA
-kJ9jaWricP7yFYZPnyGOr8pUZ6jONWdgk85iYGTmZbh9bgaDnMRfSAzA0/xPsAcY/v4A0iDHfwEK
-fwV64CuY/v/nH9ADkFj48xNC33vylyF1wieG648xklUdEK+AegKUnP4iuxkggJjQYwRa2oAybJmh
-ro7Djdt34I6f2WzIUFPkzcCp3MXAwq3H8ODhEwYL71kM4dm7GT5+B+ZzVqA2Fn5ghIAwMHZYgIUW
-MzfDYWBSOXIemKyYOBgYmdiBGFhIA21mZAbSzCAaWLSJMzEsL+Nj0JRhRvdAORAbQd0ETqvQgAYD
-gABiwpJ0QEWlm5K8XNqHT58YXr5+DXW8AUNsuC0Du1QG2J9/vpxjSExKY0hIymBg5tJi0LSdyrBl
-72MGJlZ+BkYgZmABFlTAGPrwlZUhvPASQ2DBA4ay/ldAPgvQA8xAzAB3PNhDQM/w8zAxLCniY9CQ
-RvEEyD3VQCwBzZMoBQ9AADGhJR1QM0CYg4O9gpeXh+HmHUhUZUfLM8QEaTKwiQQBMygwDf98wjBh
-Qg+wWGQA0hMYGhoawNrlFRQZDp16xfAR5EgWHnDol3VeYlBS0WFoampiOH5ThkEr8D7D5sO/wI5m
-ZIR4AhwbUMzPzcQwJYWXgZeDEdmdukAcCcSi0CKdCRYLAAGEnISYoT6MlJaUULn/8DFYUE+Nh6Gr
-XIeBld8RXDv///OZ4e71bQwtfTsYFixYAFbz4MEDBn5+bqAHlBhSi5YzaFh1MGzefY/h8OnXDEvX
-32Tg4uIC47y8PIa4xGyGxKavDBFVH4B1wl+IR6COh3lERpiJoSWCGz0pgSpOZWiMwGMBIICYkGhw
-2mdjY81gAgYLLN13laoCk4QE0HBBoOM/AUvDqwwp+fMZEhLTGRwcHMBqQLSikhaDpGoikNZmWLBw
-OUNayWYGj8jFDPX19QwsLCwMJSUlDOfOnWMwMjJi6OnpYfjJacdgk/qOYfq6b/B2KyhGwDTQU07a
-rAwOmiitAlDouwOxEDSlgGMBIIAYkSo0UCaJFxcT7f79+w/Du/fvGWyN+Rh2zjFlYOVzA3pCCJgJ
-2RkmzF7JMGXBFYYLFy4wCAgI4KxSP3z4wJCQkMBw4MABeEyB+EpKSgxRUVEMIiIiDDdu3GCYM2cO
-g7rkJ4amBG4gzcLw+8d/ht/AauPXj38MD5//ZfDp/YRs7BsgDgHiG9Amx2+AAIK12WGZ14WNjY3h
-y9evkCIzTQqYyQQgxeHvDwz3719laOnfA3YQyPGvXr3C6QGQ/IYNG8B5JDAwEOwhUFK7d+8eQ11d
-HcOuXbsYNDQ0wLEhquzF4FLyAVwXwMpCUMNNSoCJwV4dJRZEoC1fXqibGQECiBmafEDNYnFgVDcw
-MTGxffnyFdieYWXoKpZjYGYSB0YtC8N/xn8MwZlLGDx9YxkyMjIYnj17xnDlymWGz8CkJiwszMDM
-jCg5Pn78yMDBwQFmgzxhYGDAUFFRweDh4cFw8+ZNhtWrVzPMnj2b4cSJEwxycnIM5ubm4KS1bt8j
-YKX2FFgKsTBI8DOCa2yW/4wMu1Fr6q/Q5jgoan4BBBDMA6DM6wZ0RNDPnz8Y/gE7LTHe/AyuVgJA
-hwGLRaa/DJMWn2PYffwzw4oVKxh+//7NcOfObQYZGRmGly9fMjx+/IiBjY2dgZeXF8h+zLBo8WKG
-Hz9/MkhKSjI8efKEoaOjg+HFixcMO3bsYJCQkAAnHZDH/vz5Ay3BGMCesLGxAbbcOBl6ll5jePfp
-F4MO0CNKQkwMc4/8ZEArbPZAk9APgABihkYFsOBm8Adii79/Ia3FpiwhBgVpbnDJ8PD5F4aYkqMM
-HZ29DBYWFgy/fv0CJof7YMcqKiqBMx/IE++B+UZeXoGBFZhpT50+zXADGNpubm4M6urqDD9+/AB7
-BBQTIBqUpEA0KHYaGxsZjhw5Ao8NEN537gXD5E0PGXSkmBmev//H8OLTf+RktB7W0AMIIGZo9w+U
-gYP///+vBW+E5PMxcHKwAD3AxCDAx8nw/TczQ3HNHLCcu7s7w6RJkxhqamqBxScfg6ysLDC0pRje
-vn3L8PTpE6An5BmsrKwYngA9eOz4cQYNTU2GyMhIcIzNmDEDnHRAMQlKZqDkCMrcII+C8sO7d+8Y
-dHV1wflj6/ZdDOHG7Aw/gD2DC0/+oneEHoA6QAABxABt96gD8QVoRxuMvxyR/P/thOr/b2eM/n87
-7/j/6yX//8fXev7X1RD6D3Tgf35+/v/9/f1gtp6e3v/Fixf9B+aJ/2fOnP6/e/cuMP3t2zcgfeb/
-pMmT/1++fPn//fv3wfpA5ufn58P1A2PuPwiA5P39/f9zcnL+BwbK/xQ7jv9HS/n+59ix/0d2G7RP
-AuoRcgEEEHIpBK/UbAyAkfLvH7Al+QvYegQ2i/+BGmXfgZUaJ8OOhW4MH949B2fUgIAAcHHq6OgI
-DMlMhqlTpzJ8Bza3ZWXlwJn75MkTDKKiIgxxsbEMOjo64JAGYaBDwfoKCwvBfFhxrKCgAM4bYWFh
-DH8+P2WINGMH2g2svYQx2kewQQMmgABiQurrIgDQj/+BGfk/rEMCbMuDW5X/vjJMXXCBwcDIkgEY
-UmDLQJaDisotW7YwHDt2HOyg/fv3Ax0uCs7Ut4B9CFDRDCp6QcUoKNOCHArSZ29vD9YLCgiQHKz+
-AJnbGMjFwM3GAPbAf8xOHHzYBiCAGKAlkB4QX4JFka4yy/+Pe8X+fzko/v/rUen/X06o/f9y2vD/
-8eUGYPnz58//nz9//n99ff3/6ABY84LVxMbG/t++ffv/d+/egpMIKOkAPQZWA6JBfJA4CIOSEyxJ
-gpIQsAb+f6Ze4P+xMv7/B/P4/vf6cqEnoS5o740XIIBgrT1tZA+A8PtdYv8/7QN64hDIEzJgT+iq
-cYIdCAIgi0HqQOkWHYDEgKH7X1xcHOxYkKNAakEeXr9+PTjdgxyLDEDqQPLARtz/QzX8/0/WCPw/
-Usz3f3823/9MC4w80AFt4PEABBCsFAI23hk0oIJgEOHMwSDAwwStFf8xTF35keHKU2Vw6QECoBIE
-lI5BxSOoaEWvhUFJCdQGApUyFy9eBKd7kJ6CggKwHlCSglV2MD2g5JTj+ItBC9ikAHVy/v6G9Nj2
-3/nNcOM1SjpaCcT3QCkOIICYoINJv6CDTHBw6dZvoAGQ/uv9J38Y2uZ9AluADECNOFg7BxsAORaU
-tkH5BVTew2ppkD5QPkDWC8obosxPGXwN2MAOh3Q7IfTdtyiOB5YoDO9hwy4AAcQAbYXKAHE6cjSl
-enP+f7VR9P/bbaL/rfVYwekUlDRAaT8+Ph5elOJKRugAlnRAGKQexgclNRAblHS2AYtMUNo/Xs7/
-/1A+3/896bz/18ZwoycfUCclAIjlQG4HCCBYDIB8dRXa5wSD7ad+gqNx8+GfDEcv/QaHFigUYW0b
-EA0qMWClESEAK3JBAFbygPggs0CNvWhrdgZxXiaGP7//g2P+z5//4NA/9hA8LMQgxC/AwMbKBhs7
-+gR18z+AAGKB+uoXtFY7DcT2IFVPgGlu2/GfDJ++/2fg42KEOxq9CQ1yCMhBIHlQcoEVh+gA1KwG
-eRiWXGDpHpSU1CWZGdIcOBh+gzr4IMeDkhAQ/we6bPftPwxMjKDWAB/Du49g/WdhDTmQBwACiBnq
-ASZoZgYBD5ilr4BtkPpoboYAG3aGbYfuMnRPXgq2EFTNwwCs8gE5EBSiIBoEQI029Pwyc+ZMsONh
-HSGQZyMiIhjq/ZgZxIBdSfAoxS8GaAb+z3AR2B9YcuEXgyA/P8Pfv38Zvn7/9hCobRW0GQHKB38A
-Agh5hE4UGvrXkdNcdxL3/wcLhf8/XiL8f24R739gbICLRVj1jw5AeQWE0QFIj6Ys839eTkawPEg/
-KP1HAovIU3XAMh+U7gv4/u/L5P2/M5nn/84knv/Aluh/FmaW/8qycv+BJdp/6PCKA7SDDw5wgABi
-go6x/IOOQ76BKoKDpuXfgL2zf+DoddJjYzjWL8jA+m4HOOTRSyVYkkLPEyD+vl2bGBYX8DGsL+Nn
-OLplKjjJ3bpwmCHFloPhz8//EPwLgkFBt/7qL4Z77/4xiAoJMXz59g3U9Aaln91Iw43g1h1AAIEH
-tqA9fDZoUxWUPqYDsRrMAWaqLEDL+SEjCNChkJM3fzOUzPnCoKJjC87gIA8hl+mg5AQSA6V7kGPT
-bd4w+Juwg0fk/gGTxx5gwQAqJm2UmIFJhgHueFCz4e7bvwxZG78z8PHwgD3wENh5AnpgFtDodUB8
-GYjfgobhQW4HCCDkUYk/0Iz8FIgnIpdIp4AZqXzBF0h/FdpnNVFgZdhcI8Cgx3sK2CdQhGdM9FgA
-l+8sTxl8gOX7b2A/9w/YDAYGa0UWBhsFZiAf2FuFxgDM8aXbvzOwA9tPIMe/BQYA0PGgZH0QVLZA
-3QjvogEEELOUlBTDnj17GNDK2t/QfGEEU3jj2V9gyfSXwV6DFTx6+A+IWYG1tJkyK4MzMGlNWrCH
-Yc7ideAMDooBWO+rtDCLYWoCDwM3MyM4g8IzKRD/hta0IDZ4CB3q+N/A5C0D1Pv123eGt+/ffwRK
-TYY2dZ6ij5ECBBD62CgjdMhCDIhVQQEIal2jlCaarAxNwVzgohU+FAKdy1ty+AfD9L0/GILD4xgW
-LlzIAGzbMDhL3GKIADaL/8FGpf9A6d+QAd5/0H4KqMRp3At0/H9WBmlJCXB38+mLlz/+/fsHSs47
-oCMRb6B59T/M3QABxAzsPDAYGxszzJo1i+Ho0aOwmPgLxaD5LEVoTQ0p+t78Y9hx8TeDiggzgziw
-rQSu7kExAqS1pVgY3LTZGFbtOMfw/OM/Br7/rxmqPbmgIc4Ab9uA0zzQA6By/gsw6cw984thMrDO
-YefgYhAHNsP//PnL8Ozli5/AvvlcoJX7gfgOkuNRZm0AAgjf8DoPdO4LlKlLgdgSvcQxlGNhSAHW
-oIayiOHK//8hpchBYFtKAlizgjojwL4RPAZAAwYMUIevv/YbXNp8/83IICIsxMDNxQUe0nn99h2o
-loU5/jq0nfYZ2/A6QACB84C2tjZcAJon/iE18n5ADfkH7TcgJraAobztym+wY78DHcQMdBg/KxM4
-pGX4mBj42SDpHtYo/AzMwGeAfduVl34xTAKG+Lln/xg4uXgZRIGOBw0EvAb2qT9++vwKWgoehqYA
-2NzA3/LycnBqQQYAAYRvhgbWdeOGVnIK0PyQAp1KxQn0gU2D/7DECAUvv/wDYogAGysrAxcXJwMX
-MPkyMzMxfANm1ncfPoJi7xC0qAQFGKjWfQXLtMjpHpTc09LSwGyAAGLEJoglOXFCRy4koQOs3kDs
-BSrysXkANJIBNhySw8GOBA18gRzOCsQsQPY/YFL7/v0HOMkAHX4FOid2DtpMeAKd5INVWP9xTfIB
-BBAxs5SwwSR2aL4QhXpEFjQYBi1q4ZUeyNGg5MAI9ATIIyA+EyMjeMD2399/4DbNL2D5CSxdPkNn
-I0Hl+zWoo59AMytsvvgvoWlWgABiBA0uhYaGwgVAw37IfCSPMCJNufJAYwTkGXGoZ3ShbXQlaONQ
-FsmIT1AMaoA9g87Y34ZO4L2ENg/eIzn8N75QRwYAAcRIjCK02ICtj2CH5g8e6MgeP7STzQv1JDvS
-aAesQPgOHdv8CPXQR6ijvyE5/B++eWF0ABBALMROpcMMBHrkH9IijR9QR7yGOpgdadEH8lgT+mKP
-H0iLPv7A1kgg2wNKCcQAgAACJyFyAGiME2liEHmpDTMSH3m5DWx5zV+0JTfgognmDq/+Dga9lyA/
-mTD8/zmDIZFnPrjwEwWPJtowJIJLVltg+j0MpgECDADuXybnyFX8nAAAAABJRU5ErkJggg==
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417929.27019.8.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-bottomleft.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsBCVkleUoAAAA/SURB
-VHjaY/z//z8DPsDEwMAgTEiBKSEFYXjt+A8BZv///2fAhmEKzv///18YnwKYIjN8CmBg3v///z1g
-JgIAui9uUdDfxKcAAAAASUVORK5CYII=
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417929.27019.7.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-topright.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsANW9RNIwAAAA7SURB
-VHjahcwxDcAwEATBCwZzCQajNCVDGlduouh/petGFwQDE8un/OzFrsB93BW4Tx6kaHVgdmB0IAcq
-73eg4H8gZQAAAABJRU5ErkJggg==
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417869.27019.5.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-topleft.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsAJuvvdVIAAABISURB
-VHjafcxRDYAwDAbhYxbqZRpQOQGYQQkabk8kzRj9kz59l+J3Qz3VUCHBrXaVfCSMFXPQd/gG4w9V
-GnBR7FADeKqgesAEj0KK3Z8K59sAAAAASUVORK5CYII=
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417869.27019.4.camel@spectrolite>
-Content-Disposition: attachment; filename=bluestripes.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsLBap83esAAACESURB
-VHja7dRBDcAgEADBgwDBEj4wUvdN+2h1kJvVMNmy9vVF4mokr93PGwRkFjBHJ8ADCPAAAjyAAA8g
-wAMI8AACPIAADyDAAwjwAAI8gAAPIMADCPAAAjyAAA8gwAMI8AACPIAADyDAAwjwAAI8gAAPIMAD
-CPAAAjyAAA8gwAMIOL8fcegyqOBdwTkAAAAASUVORK5CYII=
-
---=-t4dRE6cqcdSBHOrMdTQ1
diff --git a/mail/default/nl/Makefile.am b/mail/default/nl/Makefile.am
deleted file mode 100644
index 7734e479f0..0000000000
--- a/mail/default/nl/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-
-defaultlocaldir = $(privdatadir)/default/nl/mail/local
-
-defaultlocal_DATA = \
- Inbox
-
-EXTRA_DIST = $(defaultlocal_DATA)
diff --git a/mail/default/pt/.cvsignore b/mail/default/pt/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/mail/default/pt/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/mail/default/pt/Inbox b/mail/default/pt/Inbox
deleted file mode 100644
index a025e78fa9..0000000000
--- a/mail/default/pt/Inbox
+++ /dev/null
@@ -1,341 +0,0 @@
-From evolution@ximian.com Tue Sep 25 07:45:12 2001
-Return-Path: <evolution@ximian.com>
-Received: from pop.ximian.com (IDENT:mail@localhost [127.0.0.1]) by
- pop.ximian.com (8.9.3/8.9.3) with ESMTP id HAA20680; Tue, 25 Sep 2001
- 07:45:12 -0400
-Received: from smtp.ximian.com (smtp.ximian.com [141.154.95.10]) by
- pop.ximian.com (8.9.3/8.9.3) with ESMTP id HAA20659 for
- <evolution@ximian.com>; Tue, 25 Sep 2001 07:45:10 -0400
-Received: (qmail 5610 invoked from network); 25 Sep 2001 11:45:02 -0000
-Received: from smtp.ximian.com (HELO localhost) (141.154.95.10) by
- pop.ximian.com with SMTP; 25 Sep 2001 11:45:02 -0000
-From: "A Equipa do Evolution" <evolution@ximian.com>
-To: Os Utilizadores do Evolution <evolution@ximian.com>
-Content-Type: multipart/related; type="multipart/alternative"; boundary="=-t4dRE6cqcdSBHOrMdTQ1"
-X-Mailer: Evolution/1.1.99 (Preview Release)
-Date: 25 June 2002 14:45:00 +0300
-Message-Id: <1001418302.27070.20.camel@spectrolite>
-Mime-Version: 1.0
-Subject: Bem Vindo ao Evolution!
-Sender: evolution@ximian.com
-Errors-To: evolution@ximian.com
-X-Mailman-Version: 1.1
-Status:
-X-Evolution-Source: pop://rupert@pop.ximian.com/inbox
-X-Evolution: 00000ddd-0030
-
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: multipart/alternative; boundary="=-2gZ1roA/HoYrlRDVGyiM"
-
-
---=-2gZ1roA/HoYrlRDVGyiM
-Content-Type: text/plain
-Content-Transfer-Encoding: 7bit
-
-
-A Equipa do Evolution orgulha-se em lhe dar as boas vindas ao Evolution, uma
-solução completa para a gestão das suas comunicações e informação pessoal.
-
-
-Iniciar-se
-
- Na zona esquerda da janela do Evolution está a barra lateral, com
- atalhos para todas as suas pastas de e-mail. Por baixo, irá
- encontrar botões para os seus calendários, contactos, tarefas e e-mail.
-
- Para obter um guia completo do Evolution, seleccione "Conteúdo" no
- menu "Ajuda", ou prima a tecla F1.
-
-Novas Funcionalidades
-
- Evolution 2.0 adiciona suporte para ligações a servidores Novell
- GroupWise (6.5.3 ou mais recentes) e suporte para Exchange 2000/2003.
- Outras novas funcionalidades no Evolution 2.0 incluem filtragem de
- mensagens não solicitadas, segurança S/MIME, suporte melhorado para
- improved IMAP, NNTP (notícias), apresentação de calendário web,
- calendários sobrepostos e novas APIs para programadores acederem aos
- dados de contactos, calendários e tarefas.
-
-Relatório de Erros
-
- Os erros deverão ser relatados (em inglês) em http://bugzilla.ximian.com
-
-Mais Informações
-
- Pode subscrever a lista de e-mail de utilizadores do Evolution em
- http://lists.ximian.com/mailman/listinfo/evolution.
-
- Encontra-se disponível informação sobre o projecto Evolution em
- http://www.gnome.org/projects/evolution.
-
-
-Com os nossos melhores cumprimentos,
-A Equipa do Evolution
-evolution@ximian.com
-
-
---=-2gZ1roA/HoYrlRDVGyiM
-Content-Type: text/html; charset=utf-8
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
- <META NAME="GENERATOR" CONTENT="GtkHTML/0.13.99">
-</HEAD>
-<BODY BGCOLOR="#f8fcf8"><TABLE BACKGROUND="cid:1001417869.27019.4.camel@spectrolite" CELLSPACING="0" CELLPADDING="0" WIDTH="100%">
-<TR>
-<TD ALIGN="left" VALIGN="top">
-<IMG SRC="cid:1001417869.27019.5.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD ALIGN="right" VALIGN="top">
-<IMG SRC="cid:1001417929.27019.7.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></TD>
-</TR>
-<TR>
-<TD>
-</TD>
-<TD>
-<IMG SRC="cid:1001417989.27019.11.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="48" HEIGHT="48"></TD>
-<TD>
-</TD>
-<TD>
-<FONT COLOR="#f8fcf8"><FONT SIZE="4"><B>A Equipa do Evolution</FONT></B></FONT SIZE="4"><FONT COLOR="#f8fcf8"><FONT SIZE="4"> orgulha-se em lhe dar as boas vindas ao </FONT></FONT SIZE="4"><FONT COLOR="#f8fcf8"><FONT SIZE="4"><B>Evolution</FONT></B></FONT SIZE="4"><FONT COLOR="#f8fcf8"><FONT SIZE="4">, uma solução completa para a gestão das suas comunicações e informação pessoal.</FONT></FONT SIZE="4"></TD>
-<TD>
-</TD>
-<TD>
-<IMG SRC="cid:1001417989.27019.11.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="48" HEIGHT="48"></TD>
-<TD>
-</TD>
-</TR>
-<TR>
-<TD ALIGN="left" VALIGN="bottom">
-<IMG SRC="cid:1001417929.27019.8.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD ALIGN="right" VALIGN="bottom">
-<div align=right>
-<IMG SRC="cid:1001417929.27019.9.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></div>
-</TD>
-</TR>
-</TABLE>
-<h2>Iniciar-se</h2>
-
-<blockquote>
- Na zona esquerda da janela do Evolution está a barra lateral, com
- atalhos para todas as suas pastas de e-mail. Por baixo, irá
- encontrar botões para os seus calendários, contactos, tarefas e e-mail.
-<br><br>
- Para obter um guia completo do Evolution, seleccione "Conteúdo" no
- menu "Ajuda", ou prima a tecla <b>F1</b>.
-
-</blockquote>
-
-<h2>Novas Funcionalidades</h2>
-<blockquote>
- Evolution 2.0 adiciona suporte para ligações a servidores Novell
- GroupWise (6.5.3 ou mais recentes) e suporte para Exchange 2000/2003.
- Outras novas funcionalidades no Evolution 2.0 incluem filtragem de
- mensagens não solicitadas, segurança S/MIME, suporte melhorado para
- improved IMAP, NNTP (notícias), apresentação de calendário web,
- calendários sobrepostos e novas APIs para programadores acederem aos
- dados de contactos, calendários e tarefas.
-</blockquote>
-
-<h2>Relatório de Erros</h2>
-<blockquote>
- Os erros deverão ser relatados (em inglês) em <a href="http://bugzilla.ximian.com">http://bugzilla.ximian.com</a>
-</blockquote>
-
-<h2>Mais Informações</h2>
-
-<blockquote>
- Pode subscrever a lista de e-mail de utilizadores do Evolution em
- <a href="http://lists.ximian.com/mailman/listinfo/evolution">http://lists.ximian.com/mailman/listinfo/evolution</a>.
-
- Encontra-se disponível informação sobre o projecto Evolution em
- <a href="http://www.gnome.org/projects/evolution">http://www.gnome.org/projects/evolution</a>.
- </blockquote>
-
-
-Com os nossos melhores cumprimentos,<br>
-A Equipa do Evolution<br>
-<a href="mailto:evolution@ximian.com">evolution@ximian.com</a>
-
-</BODY>
-</HTML>
-
---=-2gZ1roA/HoYrlRDVGyiM--
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417929.27019.9.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-bottomright.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsBAVf+8XgAAAA7SURB
-VHjaY/z//z8DPsDEgB8IE1JgSkhBGMP///9xYbP/eCSF////f/4/Hp3n/0MBsg6P////z/uPBgDp
-AG5RDY2ymwAAAABJRU5ErkJggg==
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417989.27019.11.camel@spectrolite>
-Content-Disposition: attachment; filename=evolution-icon.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAANbY1E9YMgAAABl0RVh0
-U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAABPQSURBVHjaYtzEuI6BCQgZoRDGRtDIJCrP
-6r8dAxQwATEjlEbGjFD5/0D8Dw3DxBgeMt7BsJdYtwAEEON3xk8EHQqmGSG8X//+IzsahFmAmBWI
-2YGYDUqzQsWZoWpBDv0DxL+g+CcS+w+Spxi0mFQIuwWJBAggRmsmUyL8DmFt+7cX5nBmqGM5gZgH
-iA2B2AWIzYFYCoglGbCD20B8E4hPAfEeIH4OxF+B+BvUM39BHilgyiToFhgLIIAYG5gqCCor/VfL
-AE0OIIdzQB2tCcThQOyHx8GEwBEg3gjEW4H4AxB/hsYOKFb+72BazyCdpMjwfN4juFvEkmwY3s47
-ziBc/BCoYwEDQAAxXhIXYNB7+YWBQZGH4f+NEwz3nrCi2KCsrAwLdVCIcwOxPBAXAXE0A/XACyDu
-g3rmHRB/gcbIv7t37+LVCBBAjPgUQB3PAg11QSAOAuJmIObFpcfWiJtBTpKFQV4C6Of/f6GYgeHQ
-+V8Mj178ZXj08h8+91wE4mIgvgWNke/Q2GDA5U6AAGIhwvFcQCwCxP3Q5IIC+HlYGHwdhRl8HYQY
-fBwEwA7+/x9o5//fwPD7xcD47wfD/38/GSr//mf4B8QPnv5l2HL4J8Py3d8Zrtz/i26cPhBvAOIK
-IN4JxK+h+eM3LncCBBDWGEByPCitK7Gxsi7T09JSv3brFsO3798hDudlYciOVmDIiVEAstmgWeQf
-2AOMQMf///8LyAQmZ6AHGP8B9fz9DuT/ZfgL8gjQf39//QfHSvfybwzHr2F1XwcQLwTil9Ak9Rub
-WwECCMMDaCGvIijAv8zMwFD9xLmzDB8/fYYkExNhhpktRgzyMnxAd6OVluAkAwr9n9DQBzkcGIhA
-zAjE/4Ce+PfnP8NfEAb67w/QIzM3fmfoW/uN4dO3/+ju6wLi+dA8AvLEH3T3AgQQigeQMizI8eLA
-kJ9jaWricP7yFYZPnyGOr8pUZ6jONWdgk85iYGTmZbh9bgaDnMRfSAzA0/xPsAcY/v4A0iDHfwEK
-fwV64CuY/v/nH9ADkFj48xNC33vylyF1wieG648xklUdEK+AegKUnP4iuxkggJjQYwRa2oAybJmh
-ro7Djdt34I6f2WzIUFPkzcCp3MXAwq3H8ODhEwYL71kM4dm7GT5+B+ZzVqA2Fn5ghIAwMHZYgIUW
-MzfDYWBSOXIemKyYOBgYmdiBGFhIA21mZAbSzCAaWLSJMzEsL+Nj0JRhRvdAORAbQd0ETqvQgAYD
-gABiwpJ0QEWlm5K8XNqHT58YXr5+DXW8AUNsuC0Du1QG2J9/vpxjSExKY0hIymBg5tJi0LSdyrBl
-72MGJlZ+BkYgZmABFlTAGPrwlZUhvPASQ2DBA4ay/ldAPgvQA8xAzAB3PNhDQM/w8zAxLCniY9CQ
-RvEEyD3VQCwBzZMoBQ9AADGhJR1QM0CYg4O9gpeXh+HmHUhUZUfLM8QEaTKwiQQBMygwDf98wjBh
-Qg+wWGQA0hMYGhoawNrlFRQZDp16xfAR5EgWHnDol3VeYlBS0WFoampiOH5ThkEr8D7D5sO/wI5m
-ZIR4AhwbUMzPzcQwJYWXgZeDEdmdukAcCcSi0CKdCRYLAAGEnISYoT6MlJaUULn/8DFYUE+Nh6Gr
-XIeBld8RXDv///OZ4e71bQwtfTsYFixYAFbz4MEDBn5+bqAHlBhSi5YzaFh1MGzefY/h8OnXDEvX
-32Tg4uIC47y8PIa4xGyGxKavDBFVH4B1wl+IR6COh3lERpiJoSWCGz0pgSpOZWiMwGMBIICYkGhw
-2mdjY81gAgYLLN13laoCk4QE0HBBoOM/AUvDqwwp+fMZEhLTGRwcHMBqQLSikhaDpGoikNZmWLBw
-OUNayWYGj8jFDPX19QwsLCwMJSUlDOfOnWMwMjJi6OnpYfjJacdgk/qOYfq6b/B2KyhGwDTQU07a
-rAwOmiitAlDouwOxEDSlgGMBIIAYkSo0UCaJFxcT7f79+w/Du/fvGWyN+Rh2zjFlYOVzA3pCCJgJ
-2RkmzF7JMGXBFYYLFy4wCAgI4KxSP3z4wJCQkMBw4MABeEyB+EpKSgxRUVEMIiIiDDdu3GCYM2cO
-g7rkJ4amBG4gzcLw+8d/ht/AauPXj38MD5//ZfDp/YRs7BsgDgHiG9Amx2+AAIK12WGZ14WNjY3h
-y9evkCIzTQqYyQQgxeHvDwz3719laOnfA3YQyPGvXr3C6QGQ/IYNG8B5JDAwEOwhUFK7d+8eQ11d
-HcOuXbsYNDQ0wLEhquzF4FLyAVwXwMpCUMNNSoCJwV4dJRZEoC1fXqibGQECiBmafEDNYnFgVDcw
-MTGxffnyFdieYWXoKpZjYGYSB0YtC8N/xn8MwZlLGDx9YxkyMjIYnj17xnDlymWGz8CkJiwszMDM
-jCg5Pn78yMDBwQFmgzxhYGDAUFFRweDh4cFw8+ZNhtWrVzPMnj2b4cSJEwxycnIM5ubm4KS1bt8j
-YKX2FFgKsTBI8DOCa2yW/4wMu1Fr6q/Q5jgoan4BBBDMA6DM6wZ0RNDPnz8Y/gE7LTHe/AyuVgJA
-hwGLRaa/DJMWn2PYffwzw4oVKxh+//7NcOfObQYZGRmGly9fMjx+/IiBjY2dgZeXF8h+zLBo8WKG
-Hz9/MkhKSjI8efKEoaOjg+HFixcMO3bsYJCQkAAnHZDH/vz5Ay3BGMCesLGxAbbcOBl6ll5jePfp
-F4MO0CNKQkwMc4/8ZEArbPZAk9APgABihkYFsOBm8Adii79/Ia3FpiwhBgVpbnDJ8PD5F4aYkqMM
-HZ29DBYWFgy/fv0CJof7YMcqKiqBMx/IE++B+UZeXoGBFZhpT50+zXADGNpubm4M6urqDD9+/AB7
-BBQTIBqUpEA0KHYaGxsZjhw5Ao8NEN537gXD5E0PGXSkmBmev//H8OLTf+RktB7W0AMIIGZo9w+U
-gYP///+vBW+E5PMxcHKwAD3AxCDAx8nw/TczQ3HNHLCcu7s7w6RJkxhqamqBxScfg6ysLDC0pRje
-vn3L8PTpE6An5BmsrKwYngA9eOz4cQYNTU2GyMhIcIzNmDEDnHRAMQlKZqDkCMrcII+C8sO7d+8Y
-dHV1wflj6/ZdDOHG7Aw/gD2DC0/+oneEHoA6QAABxABt96gD8QVoRxuMvxyR/P/thOr/b2eM/n87
-7/j/6yX//8fXev7X1RD6D3Tgf35+/v/9/f1gtp6e3v/Fixf9B+aJ/2fOnP6/e/cuMP3t2zcgfeb/
-pMmT/1++fPn//fv3wfpA5ufn58P1A2PuPwiA5P39/f9zcnL+BwbK/xQ7jv9HS/n+59ix/0d2G7RP
-AuoRcgEEEHIpBK/UbAyAkfLvH7Al+QvYegQ2i/+BGmXfgZUaJ8OOhW4MH949B2fUgIAAcHHq6OgI
-DMlMhqlTpzJ8Bza3ZWXlwJn75MkTDKKiIgxxsbEMOjo64JAGYaBDwfoKCwvBfFhxrKCgAM4bYWFh
-DH8+P2WINGMH2g2svYQx2kewQQMmgABiQurrIgDQj/+BGfk/rEMCbMuDW5X/vjJMXXCBwcDIkgEY
-UmDLQJaDisotW7YwHDt2HOyg/fv3Ax0uCs7Ut4B9CFDRDCp6QcUoKNOCHArSZ29vD9YLCgiQHKz+
-AJnbGMjFwM3GAPbAf8xOHHzYBiCAGKAlkB4QX4JFka4yy/+Pe8X+fzko/v/rUen/X06o/f9y2vD/
-8eUGYPnz58//nz9//n99ff3/6ABY84LVxMbG/t++ffv/d+/egpMIKOkAPQZWA6JBfJA4CIOSEyxJ
-gpIQsAb+f6Ze4P+xMv7/B/P4/vf6cqEnoS5o740XIIBgrT1tZA+A8PtdYv8/7QN64hDIEzJgT+iq
-cYIdCAIgi0HqQOkWHYDEgKH7X1xcHOxYkKNAakEeXr9+PTjdgxyLDEDqQPLARtz/QzX8/0/WCPw/
-Usz3f3823/9MC4w80AFt4PEABBCsFAI23hk0oIJgEOHMwSDAwwStFf8xTF35keHKU2Vw6QECoBIE
-lI5BxSOoaEWvhUFJCdQGApUyFy9eBKd7kJ6CggKwHlCSglV2MD2g5JTj+ItBC9ikAHVy/v6G9Nj2
-3/nNcOM1SjpaCcT3QCkOIICYoINJv6CDTHBw6dZvoAGQ/uv9J38Y2uZ9AluADECNOFg7BxsAORaU
-tkH5BVTew2ppkD5QPkDWC8obosxPGXwN2MAOh3Q7IfTdtyiOB5YoDO9hwy4AAcQAbYXKAHE6cjSl
-enP+f7VR9P/bbaL/rfVYwekUlDRAaT8+Ph5elOJKRugAlnRAGKQexgclNRAblHS2AYtMUNo/Xs7/
-/1A+3/896bz/18ZwoycfUCclAIjlQG4HCCBYDIB8dRXa5wSD7ad+gqNx8+GfDEcv/QaHFigUYW0b
-EA0qMWClESEAK3JBAFbygPggs0CNvWhrdgZxXiaGP7//g2P+z5//4NA/9hA8LMQgxC/AwMbKBhs7
-+gR18z+AAGKB+uoXtFY7DcT2IFVPgGlu2/GfDJ++/2fg42KEOxq9CQ1yCMhBIHlQcoEVh+gA1KwG
-eRiWXGDpHpSU1CWZGdIcOBh+gzr4IMeDkhAQ/we6bPftPwxMjKDWAB/Du49g/WdhDTmQBwACiBnq
-ASZoZgYBD5ilr4BtkPpoboYAG3aGbYfuMnRPXgq2EFTNwwCs8gE5EBSiIBoEQI029Pwyc+ZMsONh
-HSGQZyMiIhjq/ZgZxIBdSfAoxS8GaAb+z3AR2B9YcuEXgyA/P8Pfv38Zvn7/9hCobRW0GQHKB38A
-Agh5hE4UGvrXkdNcdxL3/wcLhf8/XiL8f24R739gbICLRVj1jw5AeQWE0QFIj6Ys839eTkawPEg/
-KP1HAovIU3XAMh+U7gv4/u/L5P2/M5nn/84knv/Aluh/FmaW/8qycv+BJdp/6PCKA7SDDw5wgABi
-go6x/IOOQ76BKoKDpuXfgL2zf+DoddJjYzjWL8jA+m4HOOTRSyVYkkLPEyD+vl2bGBYX8DGsL+Nn
-OLplKjjJ3bpwmCHFloPhz8//EPwLgkFBt/7qL4Z77/4xiAoJMXz59g3U9Aaln91Iw43g1h1AAIEH
-tqA9fDZoUxWUPqYDsRrMAWaqLEDL+SEjCNChkJM3fzOUzPnCoKJjC87gIA8hl+mg5AQSA6V7kGPT
-bd4w+Juwg0fk/gGTxx5gwQAqJm2UmIFJhgHueFCz4e7bvwxZG78z8PHwgD3wENh5AnpgFtDodUB8
-GYjfgobhQW4HCCDkUYk/0Iz8FIgnIpdIp4AZqXzBF0h/FdpnNVFgZdhcI8Cgx3sK2CdQhGdM9FgA
-l+8sTxl8gOX7b2A/9w/YDAYGa0UWBhsFZiAf2FuFxgDM8aXbvzOwA9tPIMe/BQYA0PGgZH0QVLZA
-3QjvogEEELOUlBTDnj17GNDK2t/QfGEEU3jj2V9gyfSXwV6DFTx6+A+IWYG1tJkyK4MzMGlNWrCH
-Yc7ideAMDooBWO+rtDCLYWoCDwM3MyM4g8IzKRD/hta0IDZ4CB3q+N/A5C0D1Pv123eGt+/ffwRK
-TYY2dZ6ij5ECBBD62CgjdMhCDIhVQQEIal2jlCaarAxNwVzgohU+FAKdy1ty+AfD9L0/GILD4xgW
-LlzIAGzbMDhL3GKIADaL/8FGpf9A6d+QAd5/0H4KqMRp3At0/H9WBmlJCXB38+mLlz/+/fsHSs47
-oCMRb6B59T/M3QABxAzsPDAYGxszzJo1i+Ho0aOwmPgLxaD5LEVoTQ0p+t78Y9hx8TeDiggzgziw
-rQSu7kExAqS1pVgY3LTZGFbtOMfw/OM/Br7/rxmqPbmgIc4Ab9uA0zzQA6By/gsw6cw984thMrDO
-YefgYhAHNsP//PnL8Ozli5/AvvlcoJX7gfgOkuNRZm0AAgjf8DoPdO4LlKlLgdgSvcQxlGNhSAHW
-oIayiOHK//8hpchBYFtKAlizgjojwL4RPAZAAwYMUIevv/YbXNp8/83IICIsxMDNxQUe0nn99h2o
-loU5/jq0nfYZ2/A6QACB84C2tjZcAJon/iE18n5ADfkH7TcgJraAobztym+wY78DHcQMdBg/KxM4
-pGX4mBj42SDpHtYo/AzMwGeAfduVl34xTAKG+Lln/xg4uXgZRIGOBw0EvAb2qT9++vwKWgoehqYA
-2NzA3/LycnBqQQYAAYRvhgbWdeOGVnIK0PyQAp1KxQn0gU2D/7DECAUvv/wDYogAGysrAxcXJwMX
-MPkyMzMxfANm1ncfPoJi7xC0qAQFGKjWfQXLtMjpHpTc09LSwGyAAGLEJoglOXFCRy4koQOs3kDs
-BSrysXkANJIBNhySw8GOBA18gRzOCsQsQPY/YFL7/v0HOMkAHX4FOid2DtpMeAKd5INVWP9xTfIB
-BBAxs5SwwSR2aL4QhXpEFjQYBi1q4ZUeyNGg5MAI9ATIIyA+EyMjeMD2399/4DbNL2D5CSxdPkNn
-I0Hl+zWoo59AMytsvvgvoWlWgABiBA0uhYaGwgVAw37IfCSPMCJNufJAYwTkGXGoZ3ShbXQlaONQ
-FsmIT1AMaoA9g87Y34ZO4L2ENg/eIzn8N75QRwYAAcRIjCK02ICtj2CH5g8e6MgeP7STzQv1JDvS
-aAesQPgOHdv8CPXQR6ijvyE5/B++eWF0ABBALMROpcMMBHrkH9IijR9QR7yGOpgdadEH8lgT+mKP
-H0iLPv7A1kgg2wNKCcQAgAACJyFyAGiME2liEHmpDTMSH3m5DWx5zV+0JTfgognmDq/+Dga9lyA/
-mTD8/zmDIZFnPrjwEwWPJtowJIJLVltg+j0MpgECDADuXybnyFX8nAAAAABJRU5ErkJggg==
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417929.27019.8.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-bottomleft.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsBCVkleUoAAAA/SURB
-VHjaY/z//z8DPsDEwMAgTEiBKSEFYXjt+A8BZv///2fAhmEKzv///18YnwKYIjN8CmBg3v///z1g
-JgIAui9uUdDfxKcAAAAASUVORK5CYII=
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417929.27019.7.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-topright.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsANW9RNIwAAAA7SURB
-VHjahcwxDcAwEATBCwZzCQajNCVDGlduouh/petGFwQDE8un/OzFrsB93BW4Tx6kaHVgdmB0IAcq
-73eg4H8gZQAAAABJRU5ErkJggg==
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417869.27019.5.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-topleft.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsAJuvvdVIAAABISURB
-VHjafcxRDYAwDAbhYxbqZRpQOQGYQQkabk8kzRj9kz59l+J3Qz3VUCHBrXaVfCSMFXPQd/gG4w9V
-GnBR7FADeKqgesAEj0KK3Z8K59sAAAAASUVORK5CYII=
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417869.27019.4.camel@spectrolite>
-Content-Disposition: attachment; filename=bluestripes.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsLBap83esAAACESURB
-VHja7dRBDcAgEADBgwDBEj4wUvdN+2h1kJvVMNmy9vVF4mokr93PGwRkFjBHJ8ADCPAAAjyAAA8g
-wAMI8AACPIAADyDAAwjwAAI8gAAPIMADCPAAAjyAAA8gwAMI8AACPIAADyDAAwjwAAI8gAAPIMAD
-CPAAAjyAAA8gwAMIOL8fcegyqOBdwTkAAAAASUVORK5CYII=
-
---=-t4dRE6cqcdSBHOrMdTQ1
diff --git a/mail/default/pt/Makefile.am b/mail/default/pt/Makefile.am
deleted file mode 100644
index af30930b95..0000000000
--- a/mail/default/pt/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-
-defaultlocaldir = $(privdatadir)/default/pt/mail/local
-
-defaultlocal_DATA = \
- Inbox
-
-EXTRA_DIST = $(defaultlocal_DATA)
diff --git a/mail/default/zh_CN/Inbox b/mail/default/zh_CN/Inbox
deleted file mode 100644
index 194ea85aa9..0000000000
--- a/mail/default/zh_CN/Inbox
+++ /dev/null
@@ -1,316 +0,0 @@
-From evolution@ximian.com Tue Sep 25 07:45:12 2001
-Return-Path: <evolution@ximian.com>
-Received: from pop.ximian.com (IDENT:mail@localhost [127.0.0.1]) by
- pop.ximian.com (8.9.3/8.9.3) with ESMTP id HAA20680; Tue, 25 Sep 2001
- 07:45:12 -0400
-Received: from smtp.ximian.com (smtp.ximian.com [141.154.95.10]) by
- pop.ximian.com (8.9.3/8.9.3) with ESMTP id HAA20659 for
- <evolution@ximian.com>; Tue, 25 Sep 2001 07:45:10 -0400
-Received: (qmail 5610 invoked from network); 25 Sep 2001 11:45:02 -0000
-Received: from smtp.ximian.com (HELO localhost) (141.154.95.10) by
- pop.ximian.com with SMTP; 25 Sep 2001 11:45:02 -0000
-From: =?UTF-8?B?IkV2b2x1dGlvbiDlm6LpmJ8i?= <evolution@ximian.com>
-To: Evolution =?UTF-8?B?55So5oi3?= <evolution@ximian.com>
-Content-Type: multipart/related; type="multipart/alternative"; boundary="=-t4dRE6cqcdSBHOrMdTQ1"
-X-Mailer: Evolution/1.1.99 (Preview Release)
-Date: 25 June 2002 14:45:00 +0300
-Message-Id: <1001418302.27070.20.camel@spectrolite>
-Mime-Version: 1.0
-Subject: =?UTF-8?B?5qyi6L+O5L2/55So?= Evolution!
-Sender: evolution@ximian.com
-Errors-To: evolution@ximian.com
-X-Mailman-Version: 1.1
-Status:
-X-Evolution-Source: pop://rupert@pop.ximian.com/inbox
-X-Evolution: 00000ddd-0030
-
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: multipart/alternative; boundary="=-2gZ1roA/HoYrlRDVGyiM"
-
-
---=-2gZ1roA/HoYrlRDVGyiM
-Content-Type: text/plain; charset="UTF-8"
-Content-Transfer-Encoding: 8bit
-
-
-请å…许 Evolution 团队å‘您è£èª‰ä»‹ç» Evolution,它是å¯ç®¡ç†æ‚¨é€šè®¯å’Œä¸ªäººä¿¡æ¯çš„一
-整套系统。
-
-
-开始使用
-
- Evolution 窗å£å·¦ä¾§æ˜¯ä¾§è¾¹æ ï¼Œå…¶ä¸­åŒ…å«äº†æ‚¨å…¨éƒ¨çš„邮件文件夹。您å¯åœ¨ä¾§è¾¹
- æ ä¸‹æ–¹æ‰¾åˆ°æ—¥åŽ†ã€è”系人ã€ä»»åŠ¡å’Œé‚®ä»¶çš„相应按钮。
-
- è¦èŽ·å¾— Evolution 的完整指å—,请从“帮助â€èœå•ä¸­é€‰æ‹©â€œç›®å½•â€ï¼Œæˆ–者按
- F1 键。
-
-新特性
-
- Evolution 2.0 支æŒè¿žæŽ¥åˆ° Novell GroupWise æœåŠ¡å™¨(6.5.3 或更新版本),
- 还å¯æ”¯æŒ Exchange 2000/2003。Evolution 2.0 的其它新特性包括垃圾邮件
- 过滤ã€S/MIME 安全ã€æ”¹è¿›çš„脱机 IMAPã€NNTP(æ–°é—»)支æŒã€Web 日历显示,层
- å çš„日历,以åŠä¸ºè®¿é—®è”系人ã€æ—¥åŽ†å’Œä»»åŠ¡æ•°æ®æ‰€æ供的全新开å‘接å£ã€‚
-
-错误报告
-
- 错误应该报告至 http://bugzilla.ximian.com
-
-更多信æ¯
-
- 您å¯ä»¥è®¢é˜…下é¢çš„ Evolution 用户邮件列表(英语)
- http://lists.ximian.com/mailman/listinfo/evolution 。
-
- 关于 Evolution 项目的信æ¯å¯åœ¨è¿™é‡Œæ‰¾åˆ°
- http://www.gnome.org/projects/evolution 。
-
-
- 此致
-敬礼
-Evolution 团队
-evolution@ximian.com
-
-
---=-2gZ1roA/HoYrlRDVGyiM
-Content-Type: text/html; charset=utf-8
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
- <META NAME="GENERATOR" CONTENT="GtkHTML/0.13.99">
-</HEAD>
-<BODY BGCOLOR="#f8fcf8"><TABLE BACKGROUND="cid:1001417869.27019.4.camel@spectrolite" CELLSPACING="0" CELLPADDING="0" WIDTH="100%">
-<TR>
-<TD ALIGN="left" VALIGN="top">
-<IMG SRC="cid:1001417869.27019.5.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD ALIGN="right" VALIGN="top">
-<IMG SRC="cid:1001417929.27019.7.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></TD>
-</TR>
-<TR>
-<TD>
-</TD>
-<TD>
-<IMG SRC="cid:1001417989.27019.11.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="48" HEIGHT="48"></TD>
-<TD>
-</TD>
-<TD>
-<FONT COLOR="#f8fcf8" SIZE="4"><B>请å…许 Evolution 团队</B></FONT><FONT COLOR="#f8fcf8" SIZE="4">å‘您è£èª‰ä»‹ç» </FONT><FONT COLOR="#f8fcf8" SIZE="4"><B>Evolution</B></FONT><FONT COLOR="#f8fcf8" SIZE="4">,它是å¯ç®¡ç†æ‚¨é€šè®¯å’Œä¸ªäººä¿¡æ¯çš„一整套系统。</FONT></TD>
-<TD>
-</TD>
-<TD>
-<IMG SRC="cid:1001417989.27019.11.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="48" HEIGHT="48"></TD>
-<TD>
-</TD>
-</TR>
-<TR>
-<TD ALIGN="left" VALIGN="bottom">
-<IMG SRC="cid:1001417929.27019.8.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD>
-</TD>
-<TD ALIGN="right" VALIGN="bottom">
-<div align=right>
-<IMG SRC="cid:1001417929.27019.9.camel@spectrolite" ALIGN="top" BORDER="0" WIDTH="8" HEIGHT="8"></div>
-</TD>
-</TR>
-</TABLE>
-<h2>开始使用</h2>
-
-<blockquote>Evolution 窗å£å·¦ä¾§æ˜¯ä¾§è¾¹æ ï¼Œå…¶ä¸­åŒ…å«äº†æ‚¨å…¨éƒ¨çš„邮件文件夹。您å¯åœ¨ä¾§è¾¹æ ä¸‹æ–¹æ‰¾åˆ°æ—¥åŽ†ã€è”系人ã€ä»»åŠ¡å’Œé‚®ä»¶çš„相应按钮。<br><br>è¦èŽ·å¾— Evolution 的完整指å—,请从<b>帮助</b>èœå•ä¸­é€‰æ‹©<b>目录</b>,或者按 <b>F1</b> 键。</blockquote>
-
-<h2>新特性</h2>
-<blockquote>Evolution 2.0 支æŒè¿žæŽ¥åˆ° Novell GroupWise æœåŠ¡å™¨(6.5.3 或更新版本),还å¯æ”¯æŒ Exchange 2000/2003。Evolution 2.0 的其它新特性包括垃圾邮件过滤ã€S/MIME 安全ã€æ”¹è¿›çš„脱机 IMAPã€NNTP(æ–°é—»)支æŒã€Web 日历显示,层å çš„日历,以åŠä¸ºè®¿é—®è”系人ã€æ—¥åŽ†å’Œä»»åŠ¡æ•°æ®æ‰€æ供的全新开å‘接å£ã€‚</blockquote>
-
-<h2>错误报告</h2>
-<blockquote>错误应该报告至 <a href="http://bugzilla.ximian.com">http://bugzilla.ximian.com</a>
-</blockquote>
-
-<h2>更多信æ¯</h2>
-
-<blockquote>您å¯ä»¥è®¢é˜…下é¢çš„ Evolution 用户邮件列表(英语) <a href="http://lists.ximian.com/mailman/listinfo/evolution">http://lists.ximian.com/mailman/listinfo/evolution</a>。关于 Evolution 项目的信æ¯å¯åœ¨ <a href="http://www.gnome.org/projects/evolution">http://www.gnome.org/projects/evolution</a> 找到。</blockquote>
-
-
-  此致<br/>
-敬礼<br>
-Evolution 团队<br>
-<a href="mailto:evolution@ximian.com">evolution@ximian.com</a>
-
-</BODY>
-</HTML>
-
---=-2gZ1roA/HoYrlRDVGyiM--
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417929.27019.9.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-bottomright.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsBAVf+8XgAAAA7SURB
-VHjaY/z//z8DPsDEgB8IE1JgSkhBGMP///9xYbP/eCSF////f/4/Hp3n/0MBsg6P////z/uPBgDp
-AG5RDY2ymwAAAABJRU5ErkJggg==
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417989.27019.11.camel@spectrolite>
-Content-Disposition: attachment; filename=evolution-icon.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAANbY1E9YMgAAABl0RVh0
-U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAABPQSURBVHjaYtzEuI6BCQgZoRDGRtDIJCrP
-6r8dAxQwATEjlEbGjFD5/0D8Dw3DxBgeMt7BsJdYtwAEEON3xk8EHQqmGSG8X//+IzsahFmAmBWI
-2YGYDUqzQsWZoWpBDv0DxL+g+CcS+w+Spxi0mFQIuwWJBAggRmsmUyL8DmFt+7cX5nBmqGM5gZgH
-iA2B2AWIzYFYCoglGbCD20B8E4hPAfEeIH4OxF+B+BvUM39BHilgyiToFhgLIIAYG5gqCCor/VfL
-AE0OIIdzQB2tCcThQOyHx8GEwBEg3gjEW4H4AxB/hsYOKFb+72BazyCdpMjwfN4juFvEkmwY3s47
-ziBc/BCoYwEDQAAxXhIXYNB7+YWBQZGH4f+NEwz3nrCi2KCsrAwLdVCIcwOxPBAXAXE0A/XACyDu
-g3rmHRB/gcbIv7t37+LVCBBAjPgUQB3PAg11QSAOAuJmIObFpcfWiJtBTpKFQV4C6Of/f6GYgeHQ
-+V8Mj178ZXj08h8+91wE4mIgvgWNke/Q2GDA5U6AAGIhwvFcQCwCxP3Q5IIC+HlYGHwdhRl8HYQY
-fBwEwA7+/x9o5//fwPD7xcD47wfD/38/GSr//mf4B8QPnv5l2HL4J8Py3d8Zrtz/i26cPhBvAOIK
-IN4JxK+h+eM3LncCBBDWGEByPCitK7Gxsi7T09JSv3brFsO3798hDudlYciOVmDIiVEAstmgWeQf
-2AOMQMf///8LyAQmZ6AHGP8B9fz9DuT/ZfgL8gjQf39//QfHSvfybwzHr2F1XwcQLwTil9Ak9Rub
-WwECCMMDaCGvIijAv8zMwFD9xLmzDB8/fYYkExNhhpktRgzyMnxAd6OVluAkAwr9n9DQBzkcGIhA
-zAjE/4Ce+PfnP8NfEAb67w/QIzM3fmfoW/uN4dO3/+ju6wLi+dA8AvLEH3T3AgQQigeQMizI8eLA
-kJ9jaWricP7yFYZPnyGOr8pUZ6jONWdgk85iYGTmZbh9bgaDnMRfSAzA0/xPsAcY/v4A0iDHfwEK
-fwV64CuY/v/nH9ADkFj48xNC33vylyF1wieG648xklUdEK+AegKUnP4iuxkggJjQYwRa2oAybJmh
-ro7Djdt34I6f2WzIUFPkzcCp3MXAwq3H8ODhEwYL71kM4dm7GT5+B+ZzVqA2Fn5ghIAwMHZYgIUW
-MzfDYWBSOXIemKyYOBgYmdiBGFhIA21mZAbSzCAaWLSJMzEsL+Nj0JRhRvdAORAbQd0ETqvQgAYD
-gABiwpJ0QEWlm5K8XNqHT58YXr5+DXW8AUNsuC0Du1QG2J9/vpxjSExKY0hIymBg5tJi0LSdyrBl
-72MGJlZ+BkYgZmABFlTAGPrwlZUhvPASQ2DBA4ay/ldAPgvQA8xAzAB3PNhDQM/w8zAxLCniY9CQ
-RvEEyD3VQCwBzZMoBQ9AADGhJR1QM0CYg4O9gpeXh+HmHUhUZUfLM8QEaTKwiQQBMygwDf98wjBh
-Qg+wWGQA0hMYGhoawNrlFRQZDp16xfAR5EgWHnDol3VeYlBS0WFoampiOH5ThkEr8D7D5sO/wI5m
-ZIR4AhwbUMzPzcQwJYWXgZeDEdmdukAcCcSi0CKdCRYLAAGEnISYoT6MlJaUULn/8DFYUE+Nh6Gr
-XIeBld8RXDv///OZ4e71bQwtfTsYFixYAFbz4MEDBn5+bqAHlBhSi5YzaFh1MGzefY/h8OnXDEvX
-32Tg4uIC47y8PIa4xGyGxKavDBFVH4B1wl+IR6COh3lERpiJoSWCGz0pgSpOZWiMwGMBIICYkGhw
-2mdjY81gAgYLLN13laoCk4QE0HBBoOM/AUvDqwwp+fMZEhLTGRwcHMBqQLSikhaDpGoikNZmWLBw
-OUNayWYGj8jFDPX19QwsLCwMJSUlDOfOnWMwMjJi6OnpYfjJacdgk/qOYfq6b/B2KyhGwDTQU07a
-rAwOmiitAlDouwOxEDSlgGMBIIAYkSo0UCaJFxcT7f79+w/Du/fvGWyN+Rh2zjFlYOVzA3pCCJgJ
-2RkmzF7JMGXBFYYLFy4wCAgI4KxSP3z4wJCQkMBw4MABeEyB+EpKSgxRUVEMIiIiDDdu3GCYM2cO
-g7rkJ4amBG4gzcLw+8d/ht/AauPXj38MD5//ZfDp/YRs7BsgDgHiG9Amx2+AAIK12WGZ14WNjY3h
-y9evkCIzTQqYyQQgxeHvDwz3719laOnfA3YQyPGvXr3C6QGQ/IYNG8B5JDAwEOwhUFK7d+8eQ11d
-HcOuXbsYNDQ0wLEhquzF4FLyAVwXwMpCUMNNSoCJwV4dJRZEoC1fXqibGQECiBmafEDNYnFgVDcw
-MTGxffnyFdieYWXoKpZjYGYSB0YtC8N/xn8MwZlLGDx9YxkyMjIYnj17xnDlymWGz8CkJiwszMDM
-jCg5Pn78yMDBwQFmgzxhYGDAUFFRweDh4cFw8+ZNhtWrVzPMnj2b4cSJEwxycnIM5ubm4KS1bt8j
-YKX2FFgKsTBI8DOCa2yW/4wMu1Fr6q/Q5jgoan4BBBDMA6DM6wZ0RNDPnz8Y/gE7LTHe/AyuVgJA
-hwGLRaa/DJMWn2PYffwzw4oVKxh+//7NcOfObQYZGRmGly9fMjx+/IiBjY2dgZeXF8h+zLBo8WKG
-Hz9/MkhKSjI8efKEoaOjg+HFixcMO3bsYJCQkAAnHZDH/vz5Ay3BGMCesLGxAbbcOBl6ll5jePfp
-F4MO0CNKQkwMc4/8ZEArbPZAk9APgABihkYFsOBm8Adii79/Ia3FpiwhBgVpbnDJ8PD5F4aYkqMM
-HZ29DBYWFgy/fv0CJof7YMcqKiqBMx/IE++B+UZeXoGBFZhpT50+zXADGNpubm4M6urqDD9+/AB7
-BBQTIBqUpEA0KHYaGxsZjhw5Ao8NEN537gXD5E0PGXSkmBmev//H8OLTf+RktB7W0AMIIGZo9w+U
-gYP///+vBW+E5PMxcHKwAD3AxCDAx8nw/TczQ3HNHLCcu7s7w6RJkxhqamqBxScfg6ysLDC0pRje
-vn3L8PTpE6An5BmsrKwYngA9eOz4cQYNTU2GyMhIcIzNmDEDnHRAMQlKZqDkCMrcII+C8sO7d+8Y
-dHV1wflj6/ZdDOHG7Aw/gD2DC0/+oneEHoA6QAABxABt96gD8QVoRxuMvxyR/P/thOr/b2eM/n87
-7/j/6yX//8fXev7X1RD6D3Tgf35+/v/9/f1gtp6e3v/Fixf9B+aJ/2fOnP6/e/cuMP3t2zcgfeb/
-pMmT/1++fPn//fv3wfpA5ufn58P1A2PuPwiA5P39/f9zcnL+BwbK/xQ7jv9HS/n+59ix/0d2G7RP
-AuoRcgEEEHIpBK/UbAyAkfLvH7Al+QvYegQ2i/+BGmXfgZUaJ8OOhW4MH949B2fUgIAAcHHq6OgI
-DMlMhqlTpzJ8Bza3ZWXlwJn75MkTDKKiIgxxsbEMOjo64JAGYaBDwfoKCwvBfFhxrKCgAM4bYWFh
-DH8+P2WINGMH2g2svYQx2kewQQMmgABiQurrIgDQj/+BGfk/rEMCbMuDW5X/vjJMXXCBwcDIkgEY
-UmDLQJaDisotW7YwHDt2HOyg/fv3Ax0uCs7Ut4B9CFDRDCp6QcUoKNOCHArSZ29vD9YLCgiQHKz+
-AJnbGMjFwM3GAPbAf8xOHHzYBiCAGKAlkB4QX4JFka4yy/+Pe8X+fzko/v/rUen/X06o/f9y2vD/
-8eUGYPnz58//nz9//n99ff3/6ABY84LVxMbG/t++ffv/d+/egpMIKOkAPQZWA6JBfJA4CIOSEyxJ
-gpIQsAb+f6Ze4P+xMv7/B/P4/vf6cqEnoS5o740XIIBgrT1tZA+A8PtdYv8/7QN64hDIEzJgT+iq
-cYIdCAIgi0HqQOkWHYDEgKH7X1xcHOxYkKNAakEeXr9+PTjdgxyLDEDqQPLARtz/QzX8/0/WCPw/
-Usz3f3823/9MC4w80AFt4PEABBCsFAI23hk0oIJgEOHMwSDAwwStFf8xTF35keHKU2Vw6QECoBIE
-lI5BxSOoaEWvhUFJCdQGApUyFy9eBKd7kJ6CggKwHlCSglV2MD2g5JTj+ItBC9ikAHVy/v6G9Nj2
-3/nNcOM1SjpaCcT3QCkOIICYoINJv6CDTHBw6dZvoAGQ/uv9J38Y2uZ9AluADECNOFg7BxsAORaU
-tkH5BVTew2ppkD5QPkDWC8obosxPGXwN2MAOh3Q7IfTdtyiOB5YoDO9hwy4AAcQAbYXKAHE6cjSl
-enP+f7VR9P/bbaL/rfVYwekUlDRAaT8+Ph5elOJKRugAlnRAGKQexgclNRAblHS2AYtMUNo/Xs7/
-/1A+3/896bz/18ZwoycfUCclAIjlQG4HCCBYDIB8dRXa5wSD7ad+gqNx8+GfDEcv/QaHFigUYW0b
-EA0qMWClESEAK3JBAFbygPggs0CNvWhrdgZxXiaGP7//g2P+z5//4NA/9hA8LMQgxC/AwMbKBhs7
-+gR18z+AAGKB+uoXtFY7DcT2IFVPgGlu2/GfDJ++/2fg42KEOxq9CQ1yCMhBIHlQcoEVh+gA1KwG
-eRiWXGDpHpSU1CWZGdIcOBh+gzr4IMeDkhAQ/we6bPftPwxMjKDWAB/Du49g/WdhDTmQBwACiBnq
-ASZoZgYBD5ilr4BtkPpoboYAG3aGbYfuMnRPXgq2EFTNwwCs8gE5EBSiIBoEQI029Pwyc+ZMsONh
-HSGQZyMiIhjq/ZgZxIBdSfAoxS8GaAb+z3AR2B9YcuEXgyA/P8Pfv38Zvn7/9hCobRW0GQHKB38A
-Agh5hE4UGvrXkdNcdxL3/wcLhf8/XiL8f24R739gbICLRVj1jw5AeQWE0QFIj6Ys839eTkawPEg/
-KP1HAovIU3XAMh+U7gv4/u/L5P2/M5nn/84knv/Aluh/FmaW/8qycv+BJdp/6PCKA7SDDw5wgABi
-go6x/IOOQ76BKoKDpuXfgL2zf+DoddJjYzjWL8jA+m4HOOTRSyVYkkLPEyD+vl2bGBYX8DGsL+Nn
-OLplKjjJ3bpwmCHFloPhz8//EPwLgkFBt/7qL4Z77/4xiAoJMXz59g3U9Aaln91Iw43g1h1AAIEH
-tqA9fDZoUxWUPqYDsRrMAWaqLEDL+SEjCNChkJM3fzOUzPnCoKJjC87gIA8hl+mg5AQSA6V7kGPT
-bd4w+Juwg0fk/gGTxx5gwQAqJm2UmIFJhgHueFCz4e7bvwxZG78z8PHwgD3wENh5AnpgFtDodUB8
-GYjfgobhQW4HCCDkUYk/0Iz8FIgnIpdIp4AZqXzBF0h/FdpnNVFgZdhcI8Cgx3sK2CdQhGdM9FgA
-l+8sTxl8gOX7b2A/9w/YDAYGa0UWBhsFZiAf2FuFxgDM8aXbvzOwA9tPIMe/BQYA0PGgZH0QVLZA
-3QjvogEEELOUlBTDnj17GNDK2t/QfGEEU3jj2V9gyfSXwV6DFTx6+A+IWYG1tJkyK4MzMGlNWrCH
-Yc7ideAMDooBWO+rtDCLYWoCDwM3MyM4g8IzKRD/hta0IDZ4CB3q+N/A5C0D1Pv123eGt+/ffwRK
-TYY2dZ6ij5ECBBD62CgjdMhCDIhVQQEIal2jlCaarAxNwVzgohU+FAKdy1ty+AfD9L0/GILD4xgW
-LlzIAGzbMDhL3GKIADaL/8FGpf9A6d+QAd5/0H4KqMRp3At0/H9WBmlJCXB38+mLlz/+/fsHSs47
-oCMRb6B59T/M3QABxAzsPDAYGxszzJo1i+Ho0aOwmPgLxaD5LEVoTQ0p+t78Y9hx8TeDiggzgziw
-rQSu7kExAqS1pVgY3LTZGFbtOMfw/OM/Br7/rxmqPbmgIc4Ab9uA0zzQA6By/gsw6cw984thMrDO
-YefgYhAHNsP//PnL8Ozli5/AvvlcoJX7gfgOkuNRZm0AAgjf8DoPdO4LlKlLgdgSvcQxlGNhSAHW
-oIayiOHK//8hpchBYFtKAlizgjojwL4RPAZAAwYMUIevv/YbXNp8/83IICIsxMDNxQUe0nn99h2o
-loU5/jq0nfYZ2/A6QACB84C2tjZcAJon/iE18n5ADfkH7TcgJraAobztym+wY78DHcQMdBg/KxM4
-pGX4mBj42SDpHtYo/AzMwGeAfduVl34xTAKG+Lln/xg4uXgZRIGOBw0EvAb2qT9++vwKWgoehqYA
-2NzA3/LycnBqQQYAAYRvhgbWdeOGVnIK0PyQAp1KxQn0gU2D/7DECAUvv/wDYogAGysrAxcXJwMX
-MPkyMzMxfANm1ncfPoJi7xC0qAQFGKjWfQXLtMjpHpTc09LSwGyAAGLEJoglOXFCRy4koQOs3kDs
-BSrysXkANJIBNhySw8GOBA18gRzOCsQsQPY/YFL7/v0HOMkAHX4FOid2DtpMeAKd5INVWP9xTfIB
-BBAxs5SwwSR2aL4QhXpEFjQYBi1q4ZUeyNGg5MAI9ATIIyA+EyMjeMD2399/4DbNL2D5CSxdPkNn
-I0Hl+zWoo59AMytsvvgvoWlWgABiBA0uhYaGwgVAw37IfCSPMCJNufJAYwTkGXGoZ3ShbXQlaONQ
-FsmIT1AMaoA9g87Y34ZO4L2ENg/eIzn8N75QRwYAAcRIjCK02ICtj2CH5g8e6MgeP7STzQv1JDvS
-aAesQPgOHdv8CPXQR6ijvyE5/B++eWF0ABBALMROpcMMBHrkH9IijR9QR7yGOpgdadEH8lgT+mKP
-H0iLPv7A1kgg2wNKCcQAgAACJyFyAGiME2liEHmpDTMSH3m5DWx5zV+0JTfgognmDq/+Dga9lyA/
-mTD8/zmDIZFnPrjwEwWPJtowJIJLVltg+j0MpgECDADuXybnyFX8nAAAAABJRU5ErkJggg==
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417929.27019.8.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-bottomleft.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsBCVkleUoAAAA/SURB
-VHjaY/z//z8DPsDEwMAgTEiBKSEFYXjt+A8BZv///2fAhmEKzv///18YnwKYIjN8CmBg3v///z1g
-JgIAui9uUdDfxKcAAAAASUVORK5CYII=
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417929.27019.7.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-topright.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsANW9RNIwAAAA7SURB
-VHjahcwxDcAwEATBCwZzCQajNCVDGlduouh/petGFwQDE8un/OzFrsB93BW4Tx6kaHVgdmB0IAcq
-73eg4H8gZQAAAABJRU5ErkJggg==
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417869.27019.5.camel@spectrolite>
-Content-Disposition: attachment; filename=corner-topleft.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsAJuvvdVIAAABISURB
-VHjafcxRDYAwDAbhYxbqZRpQOQGYQQkabk8kzRj9kz59l+J3Qz3VUCHBrXaVfCSMFXPQd/gG4w9V
-GnBR7FADeKqgesAEj0KK3Z8K59sAAAAASUVORK5CYII=
-
---=-t4dRE6cqcdSBHOrMdTQ1
-Content-Type: image/png
-Content-ID: <1001417869.27019.4.camel@spectrolite>
-Content-Disposition: attachment; filename=bluestripes.png
-Content-Transfer-Encoding: base64
-
-iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
-AP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EJGQsLBap83esAAACESURB
-VHja7dRBDcAgEADBgwDBEj4wUvdN+2h1kJvVMNmy9vVF4mokr93PGwRkFjBHJ8ADCPAAAjyAAA8g
-wAMI8AACPIAADyDAAwjwAAI8gAAPIMADCPAAAjyAAA8gwAMI8AACPIAADyDAAwjwAAI8gAAPIMAD
-CPAAAjyAAA8gwAMIOL8fcegyqOBdwTkAAAAASUVORK5CYII=
-
---=-t4dRE6cqcdSBHOrMdTQ1
diff --git a/mail/default/zh_CN/Makefile.am b/mail/default/zh_CN/Makefile.am
deleted file mode 100644
index a68e6401f9..0000000000
--- a/mail/default/zh_CN/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-
-defaultlocaldir = $(privdatadir)/default/zh_CN/mail/local
-
-defaultlocal_DATA = \
- Inbox
-
-EXTRA_DIST = $(defaultlocal_DATA)
diff --git a/mail/e-searching-tokenizer.c b/mail/e-searching-tokenizer.c
deleted file mode 100644
index 370ab02747..0000000000
--- a/mail/e-searching-tokenizer.c
+++ /dev/null
@@ -1,1252 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * e-searching-tokenizer.c
- *
- * Copyright (C) 2002 Ximian, Inc.
- *
- * Developed by Jon Trowbridge <trow@ximian.com>
- * Rewritten significantly to handle multiple strings and improve performance
- * by Michael Zucchi <notzed@ximian.com>
- */
-
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-#include "e-searching-tokenizer.h"
-
-#include "libedataserver/e-memory.h"
-#include "libedataserver/e-msgport.h"
-
-#define d(x)
-
-enum {
- MATCH_SIGNAL,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0, };
-
-static void e_searching_tokenizer_begin (HTMLTokenizer *, char *);
-static void e_searching_tokenizer_end (HTMLTokenizer *);
-static char *e_searching_tokenizer_peek_token (HTMLTokenizer *);
-static char *e_searching_tokenizer_next_token (HTMLTokenizer *);
-static gboolean e_searching_tokenizer_has_more (HTMLTokenizer *);
-
-static HTMLTokenizer *e_searching_tokenizer_clone (HTMLTokenizer *);
-
-/*
- static const gchar *space_tags[] = { "br", NULL };*/
-
-static HTMLTokenizerClass *parent_class = NULL;
-
-/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/
-
-/* ???
-typedef struct _SharedState SharedState;
-struct _SharedState {
- gint refs;
- gchar *str_primary;
- gchar *str_secondary;
- gboolean case_sensitive_primary;
- gboolean case_sensitive_secondary;
-};
-*/
-
-/* ********************************************************************** */
-
-
-#if 0
-static SharedState *
-shared_state_new (void)
-{
- SharedState *shared = g_new0 (SharedState, 1);
- shared->refs = 1;
- return shared;
-}
-
-static void
-shared_state_ref (SharedState *shared)
-{
- g_return_if_fail (shared != NULL);
- g_return_if_fail (shared->refs > 0);
- ++shared->refs;
-}
-
-static void
-shared_state_unref (SharedState *shared)
-{
- if (shared) {
- g_return_if_fail (shared->refs > 0);
- --shared->refs;
- if (shared->refs == 0) {
- g_free (shared->str_primary);
- g_free (shared->str_secondary);
- g_free (shared);
- }
- }
-}
-#endif
-
-/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/
-
-/* ********************************************************************** */
-
-/* Utility functions */
-
-/* This is faster and safer than glib2's utf8 abomination, but isn't exported from camel as yet */
-static inline guint32
-camel_utf8_getc(const unsigned char **ptr)
-{
- register unsigned char *p = (unsigned char *)*ptr;
- register unsigned char c, r;
- register guint32 v, m;
-
-again:
- r = *p++;
-loop:
- if (r < 0x80) {
- *ptr = p;
- v = r;
- } else if (r < 0xfe) { /* valid start char? */
- v = r;
- m = 0x7f80; /* used to mask out the length bits */
- do {
- c = *p++;
- if ((c & 0xc0) != 0x80) {
- r = c;
- goto loop;
- }
- v = (v<<6) | (c & 0x3f);
- r<<=1;
- m<<=5;
- } while (r & 0x40);
-
- *ptr = p;
-
- v &= ~m;
- } else {
- goto again;
- }
-
- return v;
-}
-
-
-/* note: our tags of interest are 7 bit ascii, only, no need to do any fancy utf8 stuff */
-/* tags should be upper case
- if this list gets longer than 10 entries, consider binary search */
-static char *ignored_tags[] = { "B", "I", "FONT", "TT", "EM", /* and more? */};
-
-static int
-ignore_tag(const char *tag)
-{
- char *t = alloca(strlen(tag)+1), c, *out;
- const char *in;
- int i;
-
- /* we could use a aho-corasick matcher here too ... but we wont */
-
- /* normalise tag into 't'.
- Note we use the property that the only tags we're interested in
- are 7 bit ascii to shortcut and simplify case insensitivity */
- in = tag+2; /* skip: TAG_ESCAPE '<' */
- if (*in == '/')
- in++;
- out = t;
- while ((c = *in++)) {
- if (c >= 'A' && c <= 'Z')
- *out++ = c;
- else if (c >= 'a' && c <= 'z')
- *out++ = c & 0xdf; /* convert ASCII to upper case */
- else
- /* maybe should check for > or ' ' etc? */
- break;
- }
- *out = 0;
-
- for (i=0;i<sizeof(ignored_tags)/sizeof(ignored_tags[0]);i++) {
- if (strcmp(t, ignored_tags[i]) == 0)
- return 1;
- }
-
- return 0;
-}
-
-/* ********************************************************************** */
-
-/* Aho-Corasick search tree implmeentation */
-
-/* next state if we match a character */
-struct _match {
- struct _match *next;
- guint32 ch;
- struct _state *match;
-};
-
-/* tree state node */
-struct _state {
- struct _match *matches;
- unsigned int final; /* max no of chars we just matched */
- struct _state *fail; /* where to try next if we fail */
- struct _state *next; /* next on this level? */
-};
-
-/* base tree structure */
-struct _trie {
- struct _state root;
- int max_depth;
-
- EMemChunk *state_chunks;
- EMemChunk *match_chunks;
-};
-
-static void
-dump_trie(struct _state *s, int d)
-{
- char *p = alloca(d*2+1);
- struct _match *m;
-
- memset(p, ' ', d*2);
- p[d*2]=0;
-
- printf("%s[state] %p: %d fail->%p\n", p, s, s->final, s->fail);
- m = s->matches;
- while (m) {
- printf(" %s'%c' -> %p\n", p, m->ch, m->match);
- if (m->match)
- dump_trie(m->match, d+1);
- m = m->next;
- }
-}
-
-/* This builds an Aho-Corasick search trie for a set of utf8 words */
-/* See
- http://www-sr.informatik.uni-tuebingen.de/~buehler/AC/AC.html
- for a neat demo */
-
-static inline struct _match *
-g(struct _state *q, guint32 c)
-{
- struct _match *m = q->matches;
-
- while (m && m->ch != c)
- m = m->next;
-
- return m;
-}
-
-static struct _trie *
-build_trie(int nocase, int len, char **words)
-{
- struct _state *q, *qt, *r;
- char *word;
- struct _match *m, *n = NULL;
- int i, depth;
- guint32 c;
- struct _trie *trie;
- int state_depth_max, state_depth_size;
- struct _state **state_depth;
-
- trie = g_malloc(sizeof(*trie));
- trie->root.matches = NULL;
- trie->root.final = 0;
- trie->root.fail = NULL;
- trie->root.next = NULL;
-
- trie->state_chunks = e_memchunk_new(8, sizeof(struct _state));
- trie->match_chunks = e_memchunk_new(8, sizeof(struct _match));
-
- /* This will correspond to the length of the longest pattern */
- state_depth_size = 0;
- state_depth_max = 64;
- state_depth = g_malloc(sizeof(*state_depth[0])*64);
- state_depth[0] = NULL;
-
- /* Step 1: Build trie */
-
- /* This just builds a tree that merges all common prefixes into the same branch */
-
- for (i=0;i<len;i++) {
- word = words[i];
- q = &trie->root;
- depth = 0;
- while ((c = camel_utf8_getc((const unsigned char **)&word))) {
- if (nocase)
- c = g_unichar_tolower(c);
- m = g(q, c);
- if (m == NULL) {
- m = e_memchunk_alloc(trie->match_chunks);
- m->ch = c;
- m->next = q->matches;
- q->matches = m;
- q = m->match = e_memchunk_alloc(trie->state_chunks);
- q->matches = NULL;
- q->fail = &trie->root;
- q->final = 0;
- if (state_depth_max < depth) {
- state_depth_max += 64;
- state_depth = g_realloc(state_depth, sizeof(*state_depth[0])*state_depth_max);
- }
- if (state_depth_size < depth) {
- state_depth[depth] = 0;
- state_depth_size = depth;
- }
- q->next = state_depth[depth];
- state_depth[depth] = q;
- } else {
- q = m->match;
- }
- depth++;
- }
- q->final = depth;
- }
-
- d(printf("Dumping trie:\n"));
- d(dump_trie(&trie->root, 0));
-
- /* Step 2: Build failure graph */
-
- /* This searches for the longest substring which is a prefix of another string and
- builds a graph of failure links so you can find multiple substrings concurrently,
- using aho-corasick's algorithm */
-
- for (i=0;i<state_depth_size;i++) {
- q = state_depth[i];
- while (q) {
- m = q->matches;
- while (m) {
- c = m->ch;
- qt = m->match;
- r = q->fail;
- while (r && (n = g(r, c)) == NULL)
- r = r->fail;
- if (r != NULL) {
- qt->fail = n->match;
- if (qt->fail->final > qt->final)
- qt->final = qt->fail->final;
- } else {
- if ((n = g(&trie->root, c)))
- qt->fail = n->match;
- else
- qt->fail = &trie->root;
- }
- m = m->next;
- }
- q = q->next;
- }
- }
-
- d(printf("After failure analysis\n"));
- d(dump_trie(&trie->root, 0));
-
- g_free(state_depth);
-
- trie->max_depth = state_depth_size;
-
- return trie;
-}
-
-static void
-free_trie(struct _trie *t)
-{
- e_memchunk_destroy(t->match_chunks);
- e_memchunk_destroy(t->state_chunks);
-
- g_free(t);
-}
-
-/* ********************************************************************** */
-
-/* html token searcher */
-
-struct _token {
- struct _token *next;
- struct _token *prev;
- unsigned int offset;
- /* we need to copy the token for memory management, so why not copy it whole */
- char tok[1];
-};
-
-/* stack of submatches currently being scanned, used for merging */
-struct _submatch {
- unsigned int offstart, offend; /* in bytes */
-};
-
-/* flags for new func */
-#define SEARCH_CASE (1)
-#define SEARCH_BOLD (2)
-
-struct _searcher {
- struct _trie *t;
-
- char *(*next_token)(); /* callbacks for more tokens */
- void *next_data;
-
- int words; /* how many words */
- char *tags, *tage; /* the tag we used to highlight */
-
- int flags; /* case sensitive or not */
-
- struct _state *state; /* state is the current trie state */
-
- int matchcount;
-
- EDList input; /* pending 'input' tokens, processed but might match */
- EDList output; /* output tokens ready for source */
-
- struct _token *current; /* for token output memory management */
-
- guint32 offset; /* current offset through searchable stream? */
- guint32 offout; /* last output position */
-
- unsigned int lastp; /* current position in rotating last buffer */
- guint32 *last; /* buffer that goes back last 'n' positions */
- guint32 last_mask; /* bitmask for efficient rotation calculation */
-
- unsigned int submatchp; /* submatch stack */
- struct _submatch *submatches;
-};
-
-static void
-searcher_set_tokenfunc(struct _searcher *s, char *(*next)(), void *data)
-{
- s->next_token = next;
- s->next_data = data;
-}
-
-static struct _searcher *
-searcher_new(int flags, int argc, char **argv, const char *tags, const char *tage)
-{
- int i, m;
- struct _searcher *s;
-
- s = g_malloc(sizeof(*s));
-
- s->t = build_trie((flags&SEARCH_CASE) == 0, argc, argv);
- s->words = argc;
- s->tags = g_strdup(tags);
- s->tage = g_strdup(tage);
- s->flags = flags;
- s->state = &s->t->root;
- s->matchcount = 0;
-
- e_dlist_init(&s->input);
- e_dlist_init(&s->output);
- s->current = 0;
-
- s->offset = 0;
- s->offout = 0;
-
- /* rotating queue of previous character positions */
- m = s->t->max_depth+1;
- i = 2;
- while (i<m)
- i<<=2;
- s->last = g_malloc(sizeof(s->last[0])*i);
- s->last_mask = i-1;
- s->lastp = 0;
-
- /* a stack of possible submatches */
- s->submatchp = 0;
- s->submatches = g_malloc(sizeof(s->submatches[0])*argc+1);
-
- return s;
-}
-
-static void
-searcher_free(struct _searcher *s)
-{
- struct _token *t;
-
- while ((t = (struct _token *)e_dlist_remhead(&s->input)))
- g_free(t);
- while ((t = (struct _token *)e_dlist_remhead(&s->output)))
- g_free(t);
- g_free(s->tags);
- g_free(s->tage);
- g_free(s->last);
- g_free(s->submatches);
- free_trie(s->t);
- g_free(s);
-}
-static struct _token *
-append_token(EDList *list, const char *tok, int len)
-{
- struct _token *token;
-
- if (len == -1)
- len = strlen(tok);
- token = g_malloc(sizeof(*token) + len+1);
- token->offset = 0; /* set by caller when required */
- memcpy(token->tok, tok, len);
- token->tok[len] = 0;
- e_dlist_addtail(list, (EDListNode *)token);
-
- return token;
-}
-
-#define free_token(x) (g_free(x))
-
-static void
-output_token(struct _searcher *s, struct _token *token)
-{
- int offend;
- int left, pre;
-
- if (token->tok[0] == TAG_ESCAPE) {
- if (token->offset >= s->offout) {
- d(printf("moving tag token '%s' from input to output\n", token->tok[0]==TAG_ESCAPE?token->tok+1:token->tok));
- e_dlist_addtail(&s->output, (EDListNode *)token);
- } else {
- d(printf("discarding tag token '%s' from input\n", token->tok[0]==TAG_ESCAPE?token->tok+1:token->tok));
- free_token(token);
- }
- } else {
- offend = token->offset + strlen(token->tok);
- left = offend-s->offout;
- if (left > 0) {
- pre = s->offout - token->offset;
- if (pre>0)
- memmove(token->tok, token->tok+pre, left+1);
- d(printf("adding partial remaining/failed '%s'\n", token->tok[0]==TAG_ESCAPE?token->tok+1:token->tok));
- s->offout = offend;
- e_dlist_addtail(&s->output, (EDListNode *)token);
- } else {
- d(printf("discarding whole token '%s'\n", token->tok[0]==TAG_ESCAPE?token->tok+1:token->tok));
- free_token(token);
- }
- }
-}
-
-static struct _token *
-find_token(struct _searcher *s, int start)
-{
- register struct _token *token;
-
- /* find token which is start token, from end of list back */
- token = (struct _token *)s->input.tailpred;
- while (token->prev) {
- if (token->offset <= start)
- return token;
- token = token->prev;
- }
-
- return NULL;
-}
-
-static void
-output_match(struct _searcher *s, unsigned int start, unsigned int end)
-{
- register struct _token *token;
- struct _token *starttoken, *endtoken;
- char b[8];
-
- d(printf("output match: %d-%d at %d\n", start, end, s->offout));
-
- starttoken = find_token(s, start);
- endtoken = find_token(s, end);
-
- if (starttoken == NULL || endtoken == NULL) {
- printf("Cannot find match history for match %d-%d\n", start, end);
- return;
- }
-
- d(printf("start in token '%s'\n", starttoken->tok[0]==TAG_ESCAPE?starttoken->tok+1:starttoken->tok));
- d(printf("end in token '%s'\n", endtoken->tok[0]==TAG_ESCAPE?endtoken->tok+1:endtoken->tok));
-
- /* output pending stuff that didn't match afterall */
- while ((struct _token *)s->input.head != starttoken) {
- token = (struct _token *)e_dlist_remhead(&s->input);
- d(printf("appending failed match '%s'\n", token->tok[0]==TAG_ESCAPE?token->tok+1:token->tok));
- output_token(s, token);
- }
-
- /* output any pre-match text */
- if (s->offout < start) {
- token = append_token(&s->output, starttoken->tok + (s->offout-starttoken->offset), start-s->offout);
- d(printf("adding pre-match text '%s'\n", token->tok[0]==TAG_ESCAPE?token->tok+1:token->tok));
- s->offout = start;
- }
-
- /* output highlight/bold */
- if (s->flags & SEARCH_BOLD) {
- sprintf(b, "%c<b>", (char)TAG_ESCAPE);
- append_token(&s->output, b, -1);
- }
- if (s->tags)
- append_token(&s->output, s->tags, -1);
-
- /* output match node(s) */
- if (starttoken != endtoken) {
- while ((struct _token *)s->input.head != endtoken) {
- token = (struct _token *)e_dlist_remhead(&s->input);
- d(printf("appending (partial) match node (head) '%s'\n", token->tok[0]==TAG_ESCAPE?token->tok+1:token->tok));
- output_token(s, token);
- }
- }
-
- /* any remaining partial content */
- if (s->offout < end) {
- token = append_token(&s->output, endtoken->tok+(s->offout-endtoken->offset), end-s->offout);
- d(printf("appending (partial) match node (tail) '%s'\n", token->tok[0]==TAG_ESCAPE?token->tok+1:token->tok));
- s->offout = end;
- }
-
- /* end highlight */
- if (s->tage)
- append_token(&s->output, s->tage, -1);
-
- /* and close bold if we need to */
- if (s->flags & SEARCH_BOLD) {
- sprintf(b, "%c</b>", (char)TAG_ESCAPE);
- append_token(&s->output, b, -1);
- }
-}
-
-/* output any sub-pending blocks */
-static void
-output_subpending(struct _searcher *s)
-{
- int i;
-
- for (i=s->submatchp-1;i>=0;i--)
- output_match(s, s->submatches[i].offstart, s->submatches[i].offend);
- s->submatchp = 0;
-}
-
-/* returns true if a merge took place */
-static int
-merge_subpending(struct _searcher *s, int offstart, int offend)
-{
- int i;
-
- /* merges overlapping or abutting match strings */
- if (s->submatchp &&
- s->submatches[s->submatchp-1].offend >= offstart) {
-
- /* go from end, any that match 'invalidate' follow-on ones too */
- for (i=s->submatchp-1;i>=0;i--) {
- if (s->submatches[i].offend >= offstart) {
- if (offstart < s->submatches[i].offstart)
- s->submatches[i].offstart = offstart;
- s->submatches[i].offend = offend;
- if (s->submatchp > i)
- s->submatchp = i+1;
- }
- }
- return 1;
- }
-
- return 0;
-}
-
-static void
-push_subpending(struct _searcher *s, int offstart, int offend)
-{
- /* This is really an assertion, we just ignore the last pending match instead of crashing though */
- if (s->submatchp >= s->words) {
- printf("ERROR: submatch pending stack overflow\n");
- s->submatchp = s->words-1;
- }
-
- s->submatches[s->submatchp].offstart = offstart;
- s->submatches[s->submatchp].offend = offend;
- s->submatchp++;
-}
-
-/* move any (partial) tokens from input to output if they are beyond the current output position */
-static void
-output_pending(struct _searcher *s)
-{
- struct _token *token;
-
- while ( (token = (struct _token *)e_dlist_remhead(&s->input)) )
- output_token(s, token);
-}
-
-/* flushes any nodes we cannot possibly match anymore */
-static void
-flush_extra(struct _searcher *s)
-{
- unsigned int start;
- int i;
- struct _token *starttoken, *token;
-
- /* find earliest char that can be in contention */
- start = s->offset - s->t->max_depth;
- for (i=0;i<s->submatchp;i++)
- if (s->submatches[i].offstart < start)
- start = s->submatches[i].offstart;
-
- /* now, flush out any tokens which are before this point */
- starttoken = find_token(s, start);
- if (starttoken == NULL)
- return;
-
- while ((struct _token *)s->input.head != starttoken) {
- token = (struct _token *)e_dlist_remhead(&s->input);
- output_token(s, token);
- }
-}
-
-static char *
-searcher_next_token(struct _searcher *s)
-{
- struct _token *token;
- char *tok, *stok, *pre_tok;
- struct _trie *t = s->t;
- struct _state *q = s->state;
- struct _match *m = NULL;
- int offstart, offend;
- guint32 c;
-
- while (e_dlist_empty(&s->output)) {
- /* get next token */
- tok = s->next_token(s->next_data);
- if (tok == NULL) {
- output_subpending(s);
- output_pending(s);
- break;
- }
-
- /* we dont always have to copy each token, e.g. if we dont match anything */
- token = append_token(&s->input, tok, -1);
- token->offset = s->offset;
- tok = token->tok;
-
- d(printf("new token %d '%s'\n", token->offset, token->tok[0]==TAG_ESCAPE?token->tok+1:token->tok));
-
- /* tag test, reset state on unknown tags */
- if (tok[0] == TAG_ESCAPE) {
- if (!ignore_tag(tok)) {
- /* force reset */
- output_subpending(s);
- output_pending(s);
- q = &t->root;
- }
-
- continue;
- }
-
- /* process whole token */
- pre_tok = stok = tok;
- while ((c = camel_utf8_getc((const unsigned char **)&tok))) {
- if ((s->flags & SEARCH_CASE) == 0)
- c = g_unichar_tolower(c);
- while (q && (m = g(q, c)) == NULL)
- q = q->fail;
- if (q == NULL) {
- /* mismatch ... reset state */
- output_subpending(s);
- q = &t->root;
- } else if (m != NULL) {
- /* keep track of previous offsets of utf8 chars, rotating buffer */
- s->last[s->lastp] = s->offset + (pre_tok-stok);
- s->lastp = (s->lastp+1)&s->last_mask;
-
- q = m->match;
- /* we have a match of q->final characters for a matching word */
- if (q->final) {
- s->matchcount++;
-
- /* use the last buffer to find the real offset of this char */
- offstart = s->last[(s->lastp - q->final)&s->last_mask];
- offend = s->offset + (tok - stok);
-
- if (q->matches == NULL) {
- if (s->submatchp == 0) {
- /* nothing pending, always put something in so we can try merge */
- push_subpending(s, offstart, offend);
- } else if (!merge_subpending(s, offstart, offend)) {
- /* can't merge, output what we have, and start againt */
- output_subpending(s);
- push_subpending(s, offstart, offend);
- /*output_match(s, offstart, offend);*/
- } else if (e_dlist_length(&s->input) > 8) {
- /* we're continuing to match and merge, but we have a lot of stuff
- waiting, so flush it out now since this is a safe point to do it */
- output_subpending(s);
- }
- } else {
- /* merge/add subpending */
- if (!merge_subpending(s, offstart, offend))
- push_subpending(s, offstart, offend);
- }
- }
- }
- pre_tok = tok;
- }
-
- s->offset += (pre_tok-stok);
-
- flush_extra(s);
- }
-
- s->state = q;
-
- if (s->current)
- free_token(s->current);
-
- s->current = token = (struct _token *)e_dlist_remhead(&s->output);
-
- return token?token->tok:NULL;
-}
-
-static char *
-searcher_peek_token(struct _searcher *s)
-{
- char *tok;
-
- /* we just get it and then put it back, it's fast enuf */
- tok = searcher_next_token(s);
- if (tok) {
- /* need to clear this so we dont free it while its still active */
- e_dlist_addhead(&s->output, (EDListNode *)s->current);
- s->current = NULL;
- }
-
- return tok;
-}
-
-static int
-searcher_pending(struct _searcher *s)
-{
- return !(e_dlist_empty(&s->input) && e_dlist_empty(&s->output));
-}
-
-/* ********************************************************************** */
-
-struct _search_info {
- GPtrArray *strv;
- char *colour;
- unsigned int size:8;
- unsigned int flags:8;
-};
-
-/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/
-
-static struct _search_info *
-search_info_new(void)
-{
- struct _search_info *s;
-
- s = g_malloc0(sizeof(struct _search_info));
- s->strv = g_ptr_array_new();
-
- return s;
-}
-
-static void
-search_info_set_flags(struct _search_info *si, unsigned int flags, unsigned int mask)
-{
- si->flags = (si->flags & ~mask) | (flags & mask);
-}
-
-static void
-search_info_set_colour(struct _search_info *si, const char *colour)
-{
- g_free(si->colour);
- si->colour = g_strdup(colour);
-}
-
-static void
-search_info_add_string(struct _search_info *si, const char *s)
-{
- const char *start;
- guint32 c;
-
- if (s && s[0]) {
- /* strip leading whitespace */
- start = s;
- while ((c = camel_utf8_getc((const unsigned char **)&s))) {
- if (!g_unichar_isspace(c)) {
- break;
- }
- start = s;
- }
- /* should probably also strip trailing, but i'm lazy today */
- if (start[0])
- g_ptr_array_add(si->strv, g_strdup(start));
- }
-}
-
-static void
-search_info_clear(struct _search_info *si)
-{
- int i;
-
- for (i=0;i<si->strv->len;i++)
- g_free(si->strv->pdata[i]);
-
- g_ptr_array_set_size(si->strv, 0);
-}
-
-static void
-search_info_free(struct _search_info *si)
-{
- int i;
-
- for (i=0;i<si->strv->len;i++)
- g_free(si->strv->pdata[i]);
-
- g_ptr_array_free(si->strv, TRUE);
- g_free(si->colour);
- g_free(si);
-}
-
-static struct _search_info *
-search_info_clone(struct _search_info *si)
-{
- struct _search_info *out;
- int i;
-
- out = search_info_new();
- for (i=0;i<si->strv->len;i++)
- g_ptr_array_add(out->strv, g_strdup(si->strv->pdata[i]));
- out->colour = g_strdup(si->colour);
- out->flags = si->flags;
- out->size = si->size;
-
- return out;
-}
-
-static struct _searcher *
-search_info_to_searcher(struct _search_info *si)
-{
- char *tags, *tage;
- char *col;
-
- if (si->strv->len == 0)
- return NULL;
-
- if (si->colour == NULL)
- col = "red";
- else
- col = si->colour;
-
- tags = alloca(20+strlen(col));
- sprintf(tags, "%c<font color=\"%s\">", TAG_ESCAPE, col);
- tage = alloca(20);
- sprintf(tage, "%c</font>", TAG_ESCAPE);
-
- return searcher_new(si->flags, si->strv->len, (char **)si->strv->pdata, tags, tage);
-}
-
-/* ********************************************************************** */
-
-struct _ESearchingTokenizerPrivate {
- struct _search_info *primary, *secondary;
- struct _searcher *engine;
-};
-
-/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/
-
-static void
-e_searching_tokenizer_finalise (GObject *obj)
-{
- ESearchingTokenizer *st = E_SEARCHING_TOKENIZER (obj);
- struct _ESearchingTokenizerPrivate *p = st->priv;
-
- search_info_free (p->primary);
- search_info_free (p->secondary);
- if (p->engine)
- searcher_free(p->engine);
-
- /* again wtf?
- shared_state_unref (st->priv->shared);
- */
-
- g_free (p);
-
- if (G_OBJECT_CLASS (parent_class)->finalize)
- G_OBJECT_CLASS (parent_class)->finalize(obj);
-}
-
-static void
-e_searching_tokenizer_class_init (ESearchingTokenizerClass *klass)
-{
- GObjectClass *obj_class = (GObjectClass *) klass;
- HTMLTokenizerClass *tok_class = HTML_TOKENIZER_CLASS (klass);
-
- parent_class = g_type_class_ref (HTML_TYPE_TOKENIZER);
-
- signals[MATCH_SIGNAL] =
- g_signal_new ("match",
- E_TYPE_SEARCHING_TOKENIZER,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (ESearchingTokenizerClass, match),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
- obj_class->finalize = e_searching_tokenizer_finalise;
-
- tok_class->begin = e_searching_tokenizer_begin;
- tok_class->end = e_searching_tokenizer_end;
-
- tok_class->peek_token = e_searching_tokenizer_peek_token;
- tok_class->next_token = e_searching_tokenizer_next_token;
- tok_class->has_more = e_searching_tokenizer_has_more;
- tok_class->clone = e_searching_tokenizer_clone;
-}
-
-static void
-e_searching_tokenizer_init (ESearchingTokenizer *st)
-{
- struct _ESearchingTokenizerPrivate *p;
-
- p = st->priv = g_new0 (struct _ESearchingTokenizerPrivate, 1);
-
- p->primary = search_info_new();
- search_info_set_flags(p->primary, SEARCH_BOLD, SEARCH_CASE|SEARCH_BOLD);
- search_info_set_colour(p->primary, "red");
-
- p->secondary = search_info_new();
- search_info_set_flags(p->secondary, SEARCH_BOLD, SEARCH_CASE|SEARCH_BOLD);
- search_info_set_colour(p->secondary, "purple");
-}
-
-GType
-e_searching_tokenizer_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (ESearchingTokenizerClass),
- NULL, NULL,
- (GClassInitFunc) e_searching_tokenizer_class_init,
- NULL, NULL,
- sizeof (ESearchingTokenizer),
- 0,
- (GInstanceInitFunc) e_searching_tokenizer_init,
- };
-
- type = g_type_register_static (HTML_TYPE_TOKENIZER, "ESearchingTokenizer", &info, 0);
- }
-
- return type;
-}
-
-HTMLTokenizer *
-e_searching_tokenizer_new (void)
-{
- return (HTMLTokenizer *) g_object_new (E_TYPE_SEARCHING_TOKENIZER, NULL);
-}
-
-/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/
-
-/* blah blah the htmltokeniser doesn't like being asked
- for a token if it doens't hvae any! */
-static char *get_token(HTMLTokenizer *t)
-{
- HTMLTokenizerClass *klass = HTML_TOKENIZER_CLASS (parent_class);
-
- return klass->has_more(t) ? klass->next_token(t) : NULL;
-}
-
-static void
-e_searching_tokenizer_begin (HTMLTokenizer *t, char *content_type)
-{
- ESearchingTokenizer *st = E_SEARCHING_TOKENIZER (t);
- struct _ESearchingTokenizerPrivate *p = st->priv;
-
- /* reset search */
- if (p->engine) {
- searcher_free(p->engine);
- p->engine = NULL;
- }
-
- if ((p->engine = search_info_to_searcher(p->primary))
- || (p->engine = search_info_to_searcher(p->secondary))) {
- /*HTMLTokenizerClass *klass = HTML_TOKENIZER_CLASS (parent_class);*/
-
- /*searcher_set_tokenfunc(p->engine, klass->next_token, st);*/
- searcher_set_tokenfunc(p->engine, get_token, st);
- }
- /* else - no engine, no search active */
-
- HTML_TOKENIZER_CLASS (parent_class)->begin (t, content_type);
-}
-
-static void
-e_searching_tokenizer_end (HTMLTokenizer *t)
-{
- /* so end gets called before any get/next tokens.
- I dont get it. */
-#if 0
- ESearchingTokenizer *st = E_SEARCHING_TOKENIZER (t);
- struct _ESearchingTokenizerPrivate *p = st->priv;
-
- /* not sure if we should reset search every time ... *shrug* */
- if (p->engine) {
- searcher_free(p->engine);
- p->engine = NULL;
- }
-#endif
-
- HTML_TOKENIZER_CLASS (parent_class)->end (t);
-}
-
-static char *
-e_searching_tokenizer_peek_token (HTMLTokenizer *tok)
-{
- ESearchingTokenizer *st = E_SEARCHING_TOKENIZER (tok);
-
- /* If no search is active, just use the default method. */
- if (st->priv->engine == NULL)
- return HTML_TOKENIZER_CLASS (parent_class)->peek_token (tok);
-
- return searcher_peek_token(st->priv->engine);
-}
-
-static char *
-e_searching_tokenizer_next_token (HTMLTokenizer *tok)
-{
- ESearchingTokenizer *st = E_SEARCHING_TOKENIZER (tok);
- int oldmatched;
- char *token;
-
- /* If no search is active, just use the default method. */
- if (st->priv->engine == NULL)
- return HTML_TOKENIZER_CLASS (parent_class)->next_token (tok);
-
- oldmatched = st->priv->engine->matchcount;
-
- token = searcher_next_token(st->priv->engine);
-
- /* not sure if this has to be accurate or just say we had some matches */
- if (oldmatched != st->priv->engine->matchcount)
- g_signal_emit (st, signals[MATCH_SIGNAL], 0);
-
- return token;
-}
-
-static gboolean
-e_searching_tokenizer_has_more (HTMLTokenizer *tok)
-{
- ESearchingTokenizer *st = E_SEARCHING_TOKENIZER (tok);
-
- return (st->priv->engine != NULL && searcher_pending(st->priv->engine))
- || HTML_TOKENIZER_CLASS (parent_class)->has_more (tok);
-}
-
-/* proxy matched event, not sure what its for otherwise */
-static void
-matched (ESearchingTokenizer *st)
-{
- /*++st->priv->match_count;*/
- g_signal_emit (st, signals[MATCH_SIGNAL], 0);
-}
-
-static HTMLTokenizer *
-e_searching_tokenizer_clone (HTMLTokenizer *tok)
-{
- ESearchingTokenizer *orig_st = E_SEARCHING_TOKENIZER (tok);
- ESearchingTokenizer *new_st = E_SEARCHING_TOKENIZER (e_searching_tokenizer_new ());
-
- search_info_free(new_st->priv->primary);
- search_info_free(new_st->priv->secondary);
-
- new_st->priv->primary = search_info_clone(orig_st->priv->primary);
- new_st->priv->secondary = search_info_clone(orig_st->priv->secondary);
-
- /* what the fucking what???? */
-#if 0
- shared_state_ref (orig_st->priv->shared);
- shared_state_unref (new_st->priv->shared);
- new_st->priv->shared = orig_st->priv->shared;
-#endif
-
- g_signal_connect_swapped (new_st, "match", G_CALLBACK(matched), orig_st);
-
- return HTML_TOKENIZER (new_st);
-}
-/* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */
-
-void
-e_searching_tokenizer_set_primary_search_string (ESearchingTokenizer *st, const gchar *search_str)
-{
- g_return_if_fail (st && E_IS_SEARCHING_TOKENIZER (st));
-
- search_info_clear(st->priv->primary);
- search_info_add_string(st->priv->primary, search_str);
-}
-
-void
-e_searching_tokenizer_add_primary_search_string (ESearchingTokenizer *st, const gchar *search_str)
-{
- g_return_if_fail (st && E_IS_SEARCHING_TOKENIZER (st));
-
- search_info_add_string(st->priv->primary, search_str);
-}
-
-void
-e_searching_tokenizer_set_primary_case_sensitivity (ESearchingTokenizer *st, gboolean iscase)
-{
- g_return_if_fail (st && E_IS_SEARCHING_TOKENIZER (st));
-
- search_info_set_flags(st->priv->primary, iscase?SEARCH_CASE:0, SEARCH_CASE);
-}
-
-void
-e_searching_tokenizer_set_secondary_search_string (ESearchingTokenizer *st, const gchar *search_str)
-{
- g_return_if_fail (st && E_IS_SEARCHING_TOKENIZER (st));
-
- search_info_clear(st->priv->secondary);
- search_info_add_string(st->priv->secondary, search_str);
-}
-
-void
-e_searching_tokenizer_add_secondary_search_string (ESearchingTokenizer *st, const gchar *search_str)
-{
- g_return_if_fail (st && E_IS_SEARCHING_TOKENIZER (st));
-
- search_info_add_string(st->priv->secondary, search_str);
-}
-
-void
-e_searching_tokenizer_set_secondary_case_sensitivity (ESearchingTokenizer *st, gboolean iscase)
-{
- g_return_if_fail (st && E_IS_SEARCHING_TOKENIZER (st));
-
- search_info_set_flags(st->priv->secondary, iscase?SEARCH_CASE:0, SEARCH_CASE);
-}
-
-/* Note: only returns the primary search string count */
-gint
-e_searching_tokenizer_match_count (ESearchingTokenizer *st)
-{
- g_return_val_if_fail (E_IS_SEARCHING_TOKENIZER (st), -1);
-
- if (st->priv->engine && st->priv->primary->strv->len)
- return st->priv->engine->matchcount;
-
- return 0;
-}
diff --git a/mail/e-searching-tokenizer.h b/mail/e-searching-tokenizer.h
deleted file mode 100644
index b6d04eeb29..0000000000
--- a/mail/e-searching-tokenizer.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-
-/*
- * e-searching-tokenizer.h
- *
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Developed by Jon Trowbridge <trow@ximian.com>
- */
-
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA.
- */
-
-#ifndef __E_SEARCHING_TOKENIZER_H__
-#define __E_SEARCHING_TOKENIZER_H__
-
-#include <glib.h>
-#include <gtkhtml/htmltokenizer.h>
-
-#define E_TYPE_SEARCHING_TOKENIZER (e_searching_tokenizer_get_type ())
-#define E_SEARCHING_TOKENIZER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_SEARCHING_TOKENIZER, ESearchingTokenizer))
-#define E_SEARCHING_TOKENIZER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), E_TYPE_SEARCHING_TOKENIZER, ESearchingTokenizerClass))
-#define E_IS_SEARCHING_TOKENIZER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_SEARCHING_TOKENIZER))
-#define E_IS_SEARCHING_TOKENIZER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_SEARCHING_TOKENIZER))
-
-typedef struct _ESearchingTokenizer ESearchingTokenizer;
-typedef struct _ESearchingTokenizerClass ESearchingTokenizerClass;
-
-struct _ESearchingTokenizerPrivate;
-
-struct _ESearchingTokenizer {
- HTMLTokenizer parent;
-
- struct _ESearchingTokenizerPrivate *priv;
-};
-
-struct _ESearchingTokenizerClass {
- HTMLTokenizerClass parent_class;
-
- void (*match) (ESearchingTokenizer *);
-};
-
-GType e_searching_tokenizer_get_type (void);
-
-HTMLTokenizer *e_searching_tokenizer_new (void);
-
-/* For now, just a simple API */
-
-void e_searching_tokenizer_set_primary_search_string (ESearchingTokenizer *, const char *);
-void e_searching_tokenizer_add_primary_search_string (ESearchingTokenizer *, const char *);
-void e_searching_tokenizer_set_primary_case_sensitivity (ESearchingTokenizer *, gboolean is_case_sensitive);
-
-void e_searching_tokenizer_set_secondary_search_string (ESearchingTokenizer *, const char *);
-void e_searching_tokenizer_add_secondary_search_string (ESearchingTokenizer *st, const char *search_str);
-void e_searching_tokenizer_set_secondary_case_sensitivity (ESearchingTokenizer *, gboolean is_case_sensitive);
-
-
-int e_searching_tokenizer_match_count (ESearchingTokenizer *);
-
-#endif /* __E_SEARCHING_TOKENIZER_H__ */
diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c
deleted file mode 100644
index 86d65f5ade..0000000000
--- a/mail/em-account-editor.c
+++ /dev/null